From 7ae20789a90798b5b8086c7e3eca4bfbcca16777 Mon Sep 17 00:00:00 2001 From: Voyager Date: Tue, 25 Aug 2026 17:14:12 -0400 Subject: [PATCH 01/37] Rebrand project and refresh title presentation --- ASSET-LICENSE.md | 96 +-- CONTRIBUTING.md | 6 +- CONTRIBUTOR-TERMS.md | 14 +- README.md | 28 +- TRADEMARKS.md | 20 +- .../plugin.cfg | 2 +- .../shoreline_auto_baker.gd | 0 .../shoreline_auto_baker.gd.uid | 0 ...acter.glb => straywild_base_character.glb} | Bin ...rt => straywild_base_character.glb.import} | 6 +- ...wild_base_character_eyes_simple_shine.png} | Bin ...se_character_eyes_simple_shine.png.import} | 8 +- ... straywild_base_character_mouth_three.png} | Bin ...ild_base_character_mouth_three.png.import} | 8 +- ...raywild_base_character_nose_dog_round.png} | Bin ..._base_character_nose_dog_round.png.import} | 8 +- art/exported/system_icons/netfishing.ico | Bin 370326 -> 0 bytes art/exported/system_icons/netfishing_1024.png | Bin 76386 -> 0 bytes art/exported/system_icons/netfishing_256.png | Bin 48436 -> 0 bytes art/exported/system_icons/straywild.ico | Bin 0 -> 370326 bytes art/exported/system_icons/straywild_1024.png | Bin 0 -> 80419 bytes ...4.png.import => straywild_1024.png.import} | 6 +- art/exported/system_icons/straywild_256.png | Bin 0 -> 51987 bytes ...56.png.import => straywild_256.png.import} | 6 +- ...r.blend => straywild_base_character.blend} | Bin ... => straywild_base_character.blend.import} | 6 +- ...rt => straywild_base_character.glb.import} | 6 +- ...blend => straywild_character_source.blend} | Bin ...> straywild_character_source.blend.import} | 6 +- ... => straywild_character_source.glb.import} | 6 +- ...wild_character_source_eyes1_eyebrows1.png} | Bin ...aracter_source_eyes1_eyebrows1.png.import} | 8 +- ...ld_character_source_eyes_simple_shine.png} | Bin ...acter_source_eyes_simple_shine.png.import} | 8 +- ... => straywild_character_source_mouth1.png} | Bin ...aywild_character_source_mouth1.png.import} | 8 +- ...traywild_character_source_mouth_three.png} | Bin ...d_character_source_mouth_three.png.import} | 8 +- ...=> straywild_character_source_nose1.2.png} | Bin ...ywild_character_source_nose1.2.png.import} | 8 +- ...ywild_character_source_nose_dog_round.png} | Bin ...haracter_source_nose_dog_round.png.import} | 8 +- docs/ATTRIBUTION.md | 26 +- docs/DEVELOPMENT.md | 10 +- docs/PORTMASTER.md | 66 +- docs/README-PLAYTEST.txt | 10 +- docs/README.md | 6 +- export_presets.cfg | 32 +- main/main.gd | 29 +- main/main.tscn | 22 +- main/runtime_performance_profile.gd | 4 +- main/texture_sampling_policy.gd | 2 +- network/discovery_client.gd | 24 +- network/identity_backup_service.gd | 4 +- network/network_identity_crypto.gd | 2 +- network/network_protocol.gd | 10 +- network/network_session.gd | 6 +- network/network_surface_drawing_service.gd | 4 +- network/player_data_root.gd | 28 +- network/player_relationship_store.gd | 4 +- network/portable_data_migration.gd | 12 +- player/player.tscn | 2 +- player/player_visual_presenter.gd | 4 +- project.godot | 8 +- save/progression_save_codec.gd | 4 +- scripts/build_android_debug.sh | 2 +- scripts/build_playtest.sh | 24 +- scripts/build_portmaster.sh | 128 +-- scripts/import_animalese_voice.sh | 4 +- scripts/normalize_texture_profiles.sh | 2 +- scripts/portmaster/gameinfo.xml | 8 +- ...unch-netfishing.sh => launch-straywild.sh} | 0 scripts/portmaster/port.json | 8 +- .../{netfishing.gptk => straywild.gptk} | 2 +- .../{NETfishing.sh => straywild.sh} | 74 +- scripts/run_validations.sh | 4 +- scripts/setup_android_build.sh | 4 +- scripts/test_player_data_root_paths.gd | 24 +- server/dedicated_server_config.gd | 28 +- settings/player_settings_manager.gd | 2 +- tests/character_rig_validation.gd | 2 +- tests/controller_mapping_validation.gd | 10 +- ...ontroller_menu_accessibility_validation.gd | 63 +- tests/controller_ui_navigation_validation.gd | 12 +- tests/dedicated_server_config_validation.gd | 6 +- tests/fish_hotbar_showcase_validation.gd | 2 +- tests/fish_quality_validation.gd | 2 +- tests/inventory_notepad_art_validation.gd | 4 +- tests/light_performance_profile_validation.gd | 3 - tests/logbook_runtime_validation.gd | 4 +- tests/logbook_validation.gd | 4 +- .../terrain_chunk_generator_test.tscn | 2 +- tests/title_credits_validation.gd | 77 +- tests/ui_scaling_runtime_validation.gd | 30 +- tests/world_spawn_protocol_validation.gd | 2 +- tests/world_time_validation.gd | 4 +- tests/world_weather_validation.gd | 2 +- tools/blender/export_terrain_chunks.py | 2 +- ui/assets/title/netfishing_logo.png | Bin 22579 -> 0 bytes ui/assets/title/straywild_logo.png | Bin 0 -> 27266 bytes ui/assets/title/straywild_logo.png.import | 42 + ui/components/bubble_menu/bubble_button.gd | 121 ++- ui/components/bubble_menu/bubble_cluster.gd | 66 +- .../bubble_menu/bubble_gradient_background.gd | 79 ++ .../bubble_gradient_background.gd.uid | 1 + .../bubble_menu/bubble_hover_drawer.gd | 97 +++ .../bubble_menu/bubble_hover_drawer.gd.uid | 1 + .../bubble_menu/bubble_menu_profile.gd | 10 +- .../bubble_menu/title_menu_profile.tres | 22 + .../title_secondary_menu_profile.tres | 22 + ui/controller_focus_presentation.gd | 2 +- ui/controller_mapping_panel.gd | 2 +- ui/icons/new_menu/close.png | Bin 0 -> 13893 bytes ui/icons/new_menu/close.png.import | 42 + ui/icons/new_menu/credits.png | Bin 0 -> 24978 bytes ui/icons/new_menu/credits.png.import | 42 + ui/icons/new_menu/online.png | Bin 0 -> 9636 bytes ui/icons/new_menu/online.png.import | 42 + ui/icons/new_menu/play.png | Bin 0 -> 25535 bytes .../new_menu/play.png.import} | 16 +- ui/icons/new_menu/settings.png | Bin 0 -> 8161 bytes ui/icons/new_menu/settings.png.import | 42 + ui/save_slots_page.gd | 6 +- ui/settings_panel.gd | 12 +- ui/title_credits_page.tscn | 2 +- ui/title_screen.gd | 736 +++--------------- ui/title_screen.tscn | 346 ++++---- ui/title_water_background.gdshader | 97 --- ui/title_water_background.gdshader.uid | 1 - ...onment.tres => straywild_environment.tres} | 2 +- ...ng_sky.gdshader => straywild_sky.gdshader} | 2 +- ...dshader.uid => straywild_sky.gdshader.uid} | 0 ...netfishing_sky.tres => straywild_sky.tres} | 6 +- ...erinc => straywild_sky_clouds.gdshaderinc} | 0 ...d => straywild_sky_clouds.gdshaderinc.uid} | 0 world/interactables/fishing_shop_world.tscn | 2 +- world/test_world.tscn | 2 +- world/world_time_visual_controller.gd | 2 +- 138 files changed, 1511 insertions(+), 1498 deletions(-) rename addons/{netfishing_shoreline_baker => straywild_shoreline_baker}/plugin.cfg (81%) rename addons/{netfishing_shoreline_baker => straywild_shoreline_baker}/shoreline_auto_baker.gd (100%) rename addons/{netfishing_shoreline_baker => straywild_shoreline_baker}/shoreline_auto_baker.gd.uid (100%) rename art/exported/characters/base/{netfishing_base_character.glb => straywild_base_character.glb} (100%) rename art/exported/characters/base/{netfishing_base_character.glb.import => straywild_base_character.glb.import} (77%) rename art/exported/characters/base/{netfishing_base_character_eyes_simple_shine.png => straywild_base_character_eyes_simple_shine.png} (100%) rename art/exported/characters/base/{netfishing_base_character_eyes_simple_shine.png.import => straywild_base_character_eyes_simple_shine.png.import} (58%) rename art/exported/characters/base/{netfishing_base_character_mouth_three.png => straywild_base_character_mouth_three.png} (100%) rename art/exported/characters/base/{netfishing_base_character_mouth_three.png.import => straywild_base_character_mouth_three.png.import} (59%) rename art/exported/characters/base/{netfishing_base_character_nose_dog_round.png => straywild_base_character_nose_dog_round.png} (100%) rename art/exported/characters/base/{netfishing_base_character_nose_dog_round.png.import => straywild_base_character_nose_dog_round.png.import} (59%) delete mode 100644 art/exported/system_icons/netfishing.ico delete mode 100644 art/exported/system_icons/netfishing_1024.png delete mode 100644 art/exported/system_icons/netfishing_256.png create mode 100644 art/exported/system_icons/straywild.ico create mode 100644 art/exported/system_icons/straywild_1024.png rename art/exported/system_icons/{netfishing_1024.png.import => straywild_1024.png.import} (74%) create mode 100644 art/exported/system_icons/straywild_256.png rename art/exported/system_icons/{netfishing_256.png.import => straywild_256.png.import} (74%) rename art/source/characters/base/{netfishing_base_character.blend => straywild_base_character.blend} (100%) rename art/source/characters/base/{netfishing_base_character.blend.import => straywild_base_character.blend.import} (84%) rename art/source/characters/base/{netfishing_base_character.glb.import => straywild_base_character.glb.import} (77%) rename art/source/characters/base/{netfishing_character_source.blend => straywild_character_source.blend} (100%) rename art/source/characters/base/{netfishing_character_source.blend.import => straywild_character_source.blend.import} (84%) rename art/source/characters/base/{netfishing_character_source.glb.import => straywild_character_source.glb.import} (76%) rename art/source/characters/base/{netfishing_character_source_eyes1_eyebrows1.png => straywild_character_source_eyes1_eyebrows1.png} (100%) rename art/source/characters/base/{netfishing_character_source_eyes1_eyebrows1.png.import => straywild_character_source_eyes1_eyebrows1.png.import} (58%) rename art/source/characters/base/{netfishing_character_source_eyes_simple_shine.png => straywild_character_source_eyes_simple_shine.png} (100%) rename art/source/characters/base/{netfishing_character_source_eyes_simple_shine.png.import => straywild_character_source_eyes_simple_shine.png.import} (58%) rename art/source/characters/base/{netfishing_character_source_mouth1.png => straywild_character_source_mouth1.png} (100%) rename art/source/characters/base/{netfishing_character_source_mouth1.png.import => straywild_character_source_mouth1.png.import} (60%) rename art/source/characters/base/{netfishing_character_source_mouth_three.png => straywild_character_source_mouth_three.png} (100%) rename art/source/characters/base/{netfishing_character_source_mouth_three.png.import => straywild_character_source_mouth_three.png.import} (59%) rename art/source/characters/base/{netfishing_character_source_nose1.2.png => straywild_character_source_nose1.2.png} (100%) rename art/source/characters/base/{netfishing_character_source_nose1.2.png.import => straywild_character_source_nose1.2.png.import} (60%) rename art/source/characters/base/{netfishing_character_source_nose_dog_round.png => straywild_character_source_nose_dog_round.png} (100%) rename art/source/characters/base/{netfishing_character_source_nose_dog_round.png.import => straywild_character_source_nose_dog_round.png.import} (59%) rename scripts/portmaster/{launch-netfishing.sh => launch-straywild.sh} (100%) rename scripts/portmaster/{netfishing.gptk => straywild.gptk} (87%) rename scripts/portmaster/{NETfishing.sh => straywild.sh} (70%) delete mode 100644 ui/assets/title/netfishing_logo.png create mode 100644 ui/assets/title/straywild_logo.png create mode 100644 ui/assets/title/straywild_logo.png.import create mode 100644 ui/components/bubble_menu/bubble_gradient_background.gd create mode 100644 ui/components/bubble_menu/bubble_gradient_background.gd.uid create mode 100644 ui/components/bubble_menu/bubble_hover_drawer.gd create mode 100644 ui/components/bubble_menu/bubble_hover_drawer.gd.uid create mode 100644 ui/components/bubble_menu/title_menu_profile.tres create mode 100644 ui/components/bubble_menu/title_secondary_menu_profile.tres create mode 100644 ui/icons/new_menu/close.png create mode 100644 ui/icons/new_menu/close.png.import create mode 100644 ui/icons/new_menu/credits.png create mode 100644 ui/icons/new_menu/credits.png.import create mode 100644 ui/icons/new_menu/online.png create mode 100644 ui/icons/new_menu/online.png.import create mode 100644 ui/icons/new_menu/play.png rename ui/{assets/title/netfishing_logo.png.import => icons/new_menu/play.png.import} (55%) create mode 100644 ui/icons/new_menu/settings.png create mode 100644 ui/icons/new_menu/settings.png.import delete mode 100644 ui/title_water_background.gdshader delete mode 100644 ui/title_water_background.gdshader.uid rename world/environment/{netfishing_environment.tres => straywild_environment.tres} (87%) rename world/environment/{netfishing_sky.gdshader => straywild_sky.gdshader} (98%) rename world/environment/{netfishing_sky.gdshader.uid => straywild_sky.gdshader.uid} (100%) rename world/environment/{netfishing_sky.tres => straywild_sky.tres} (89%) rename world/environment/{netfishing_sky_clouds.gdshaderinc => straywild_sky_clouds.gdshaderinc} (100%) rename world/environment/{netfishing_sky_clouds.gdshaderinc.uid => straywild_sky_clouds.gdshaderinc.uid} (100%) diff --git a/ASSET-LICENSE.md b/ASSET-LICENSE.md index c438995..9519836 100644 --- a/ASSET-LICENSE.md +++ b/ASSET-LICENSE.md @@ -1,15 +1,15 @@ -# NETfishing Asset License 1.1 +# straywild Asset License 1.1 Copyright © 2026 Woofmeow. All rights reserved except for the permissions expressly granted below. ## 1. Scope -This license applies to original NETfishing artwork, graphics, textures, +This license applies to original straywild artwork, graphics, textures, models, animations, music, sound recordings, narrative content, visual -designs, characters, and other creative assets owned by the NETfishing owners +designs, characters, and other creative assets owned by the straywild owners or licensed to them with authority to sublicense, publishing as Woofmeow (the -**“NETfishing Assets”**). +**“straywild Assets”**). It does not apply to: @@ -17,77 +17,77 @@ It does not apply to: - third-party material identified in the source repository's `docs/ATTRIBUTION.md` or the packaged `ATTRIBUTION.md` notice; - material accompanied by a different license; or -- the NETfishing and Woofmeow names and logos, which are addressed in +- the straywild and Woofmeow names and logos, which are addressed in `TRADEMARKS.md`. Repository location alone does not change third-party ownership or licensing. ## 2. Definitions -**Official NETfishing Software** means: +**Official straywild Software** means: -- an unmodified binary release published by the NETfishing owners through an - official NETfishing distribution channel; or -- a build made from an unmodified official NETfishing source release or tagged +- an unmodified binary release published by the straywild owners through an + official straywild distribution channel; or +- a build made from an unmodified official straywild source release or tagged revision. **Mod** means a non-standalone add-on created to operate with Official -NETfishing Software. A Mod may add, replace, or alter content loaded by the -Official NETfishing Software, but it may not redistribute a replacement copy +straywild Software. A Mod may add, replace, or alter content loaded by the +Official straywild Software, but it may not redistribute a replacement copy of the game or represent a fork, clone, sequel, or separate game. **Contribution Fork** means a source-control fork or clone of an official -NETfishing source repository that is created and maintained in good faith +straywild source repository that is created and maintained in good faith primarily to prepare, test, review, or submit changes for possible inclusion -in Official NETfishing Software. It does not include a fork presented or +in Official straywild Software. It does not include a fork presented or developed as an independent game, community edition, replacement distribution, -or ongoing product separate from the official NETfishing project. +or ongoing product separate from the official straywild project. ## 3. Permission to use the official game -You may reproduce NETfishing Assets as technically necessary to install, run, -back up, and privately modify a lawfully obtained copy of Official NETfishing +You may reproduce straywild Assets as technically necessary to install, run, +back up, and privately modify a lawfully obtained copy of Official straywild Software. You may capture, publish, and monetize screenshots, gameplay videos, livestreams, reviews, tutorials, and similar commentary showing a lawfully -obtained copy of NETfishing. This permission does not authorize redistribution +obtained copy of straywild. This permission does not authorize redistribution of the source asset files or imply endorsement. ## 4. Community Mod license -Subject to this license, you may create, modify, and distribute NETfishing -Assets solely as part of a Mod for Official NETfishing Software. +Subject to this license, you may create, modify, and distribute straywild +Assets solely as part of a Mod for Official straywild Software. This permission is worldwide, nonexclusive, royalty-free, and available for as long as you comply with this license. It permits only the copies of -NETfishing Assets reasonably necessary for the Mod to function. It does not +straywild Assets reasonably necessary for the Mod to function. It does not permit distributing the original game, a substantially complete collection of its assets, or a general-purpose asset pack. A distributed Mod must: -1. require a separately obtained copy of Official NETfishing Software; +1. require a separately obtained copy of Official straywild Software; 2. be presented as unofficial community content; 3. include the following notice in its documentation or distribution page: - > Contains or adapts NETfishing assets © 2026 Woofmeow, used under the - > NETfishing Asset License 1.1. This Mod is unofficial and is not endorsed + > Contains or adapts straywild assets © 2026 Woofmeow, used under the + > straywild Asset License 1.1. This Mod is unofficial and is not endorsed > by Woofmeow. -4. identify material created by the Mod author separately from NETfishing +4. identify material created by the Mod author separately from straywild Assets; and 5. comply with `TRADEMARKS.md`. Mods may be shared without charge and may accept voluntary donations that do not purchase access, features, or preferential treatment. Selling a Mod, -charging for access to it, licensing it commercially, or using NETfishing +charging for access to it, licensing it commercially, or using straywild Assets in paid products requires separate written permission from both -NETfishing owners. +straywild owners. ## 5. Contribution Fork license -Subject to this license, you may reproduce, modify, and distribute NETfishing +Subject to this license, you may reproduce, modify, and distribute straywild Assets within a Contribution Fork. You may also make the nonpublic builds reasonably necessary to develop, test, and review its proposed contribution. @@ -99,8 +99,8 @@ fork are permitted distributions. A Contribution Fork must: 1. remain primarily directed toward preparing changes for possible inclusion - in the official NETfishing project; -2. preserve this license and the official NETfishing project's applicable + in the official straywild project; +2. preserve this license and the official straywild project's applicable attribution, third-party license, and copyright notices; 3. remain visibly linked to or identified as a fork of the official source repository and not be presented as official or endorsed; @@ -109,63 +109,63 @@ A Contribution Fork must: contribution; 5. not publish general-audience binaries, releases, packages, or downloads, operate a persistent public alternative service, or monetize access; -6. not distribute the NETfishing Assets as a standalone extraction, archive, +6. not distribute the straywild Assets as a standalone extraction, archive, or general-purpose asset pack; and 7. comply with `TRADEMARKS.md`. Temporary access-controlled servers may be operated when reasonably necessary to test a proposed contribution. They may not be promoted or maintained as a -public alternative to Official NETfishing Software or its services. +public alternative to Official straywild Software or its services. Submitting work from a Contribution Fork is governed separately by -`CONTRIBUTOR-TERMS.md` and does not require the NETfishing owners to accept the +`CONTRIBUTOR-TERMS.md` and does not require the straywild owners to accept the work. Declining or closing a proposed contribution does not retroactively invalidate good-faith use under this section. A compliant Contribution Fork may remain publicly accessible as an archival development record, but it may not be repurposed for continued development or distribution of a separate -product containing NETfishing Assets. +product containing straywild Assets. ## 6. Uses not permitted Except as expressly permitted by Sections 3, 4, and 5 or by separate written -permission from both NETfishing owners, you may not use or distribute -NETfishing Assets: +permission from both straywild owners, you may not use or distribute +straywild Assets: - in a fork, clone, remake, sequel, or standalone game that is not a qualifying Contribution Fork; -- with a modified distribution of the GPL-covered NETfishing code that is not - Official NETfishing Software, except for nonpublic contribution-testing +- with a modified distribution of the GPL-covered straywild code that is not + Official straywild Software, except for nonpublic contribution-testing builds permitted by Section 5; - in another game, application, asset library, template, or merchandise; - as a substantially complete asset extraction or archive; - in a way that implies sponsorship, endorsement, or official status; - to register a confusingly similar trademark, domain, account, or product identity; or -- under terms that claim ownership of the NETfishing Assets themselves. +- under terms that claim ownership of the straywild Assets themselves. The GPL permits forks and redistribution of the GPL-covered code. Except for a qualifying Contribution Fork under Section 5, this asset license does not -permit those forks to carry NETfishing Assets. A code fork that is not a -Contribution Fork must remove or replace the NETfishing Assets and reserved +permit those forks to carry straywild Assets. A code fork that is not a +Contribution Fork must remove or replace the straywild Assets and reserved branding unless both owners grant separate written permission. ## 7. Ownership of Mods and contribution work You retain ownership of your original Mod material and original material -created in a Contribution Fork. The NETfishing owners retain ownership of the -NETfishing Assets and adaptations of those assets to the extent provided by +created in a Contribution Fork. The straywild owners retain ownership of the +straywild Assets and adaptations of those assets to the extent provided by applicable law. This license does not require you to assign or submit your original material. -It also does not grant you ownership of the underlying NETfishing Assets. If -you intentionally submit material for inclusion in NETfishing, +It also does not grant you ownership of the underlying straywild Assets. If +you intentionally submit material for inclusion in straywild, `CONTRIBUTOR-TERMS.md` applies separately. ## 8. Termination and cure Your permissions under this license terminate automatically if you violate its terms. They are reinstated provisionally when you stop the violation and -permanently if both NETfishing owners do not notify you of the violation +permanently if both straywild owners do not notify you of the violation within sixty days after it has been cured. Termination does not limit remedies available for activity outside this @@ -173,15 +173,15 @@ license. ## 9. No warranty -THE NETFISHING ASSETS ARE PROVIDED “AS IS,” WITHOUT WARRANTY OF ANY KIND, +THE straywild ASSETS ARE PROVIDED “AS IS,” WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, OR NON-INFRINGEMENT. TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE OWNERS WILL NOT BE LIABLE FOR ANY CLAIM, DAMAGES, OR -OTHER LIABILITY ARISING FROM THIS LICENSE OR USE OF THE NETFISHING ASSETS. +OTHER LIABILITY ARISING FROM THIS LICENSE OR USE OF THE straywild ASSETS. ## 10. Additional permission -Uses not granted here require written permission from both NETfishing owners. +Uses not granted here require written permission from both straywild owners. A permission granted to one person or project does not amend this license for others. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7017110..2dc5724 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Contribution policy -NETfishing is an owner-directed Woofmeow project and is not accepting +straywild is an owner-directed Woofmeow project and is not accepting unsolicited contributions. Please do not submit pull requests, patches, code, artwork, models, audio, writing, documentation, translations, designs, or other implementation work. Pull requests are disabled for the official @@ -17,7 +17,7 @@ work; it is not a standing invitation to contribute. ## Contribution forks -The [NETfishing Asset License](ASSET-LICENSE.md) contains limited permissions +The [straywild Asset License](ASSET-LICENSE.md) contains limited permissions for qualifying Contribution Forks. Those permissions do not promise review or acceptance and do not override the policy above. Keep the hosting platform's fork relationship visible, preserve all license and attribution notices, and @@ -79,4 +79,4 @@ using display strings as persistent identifiers. New standalone source files should use `SPDX-License-Identifier: GPL-3.0-or-later` where the file format permits comments. Do not add that -identifier to asset files governed by the NETfishing Asset License. +identifier to asset files governed by the straywild Asset License. diff --git a/CONTRIBUTOR-TERMS.md b/CONTRIBUTOR-TERMS.md index e0d801a..261de60 100644 --- a/CONTRIBUTOR-TERMS.md +++ b/CONTRIBUTOR-TERMS.md @@ -1,6 +1,6 @@ -# NETfishing contributor terms +# straywild contributor terms -NETfishing does not accept unsolicited contributions. These terms are retained +straywild does not accept unsolicited contributions. These terms are retained as the governing record for contributions previously accepted after their publication and for specific future work that both Owners expressly invite in writing before submission. They are not a request or standing invitation for @@ -9,9 +9,9 @@ patches, pull requests, assets, or other material. These terms do not retroactively change ownership of earlier work or replace a separately signed agreement. -“Owners” means the two NETfishing co-owners who publish the Project as +“Owners” means the two straywild co-owners who publish the Project as Woofmeow and are publicly credited as Voyager and Endeavour. “Project” means -the official NETfishing game, its servers, tools, documentation, websites, +the official straywild game, its servers, tools, documentation, websites, ports, updates, and promotional materials. ## 1. Your ownership and authority @@ -56,8 +56,8 @@ royalty-free, transferable, and sublicensable license to: - license it to Project users under `ASSET-LICENSE.md` or a later Project asset license jointly approved by the Owners. -This grant is limited to NETfishing, its promotion, and official successor or -derived NETfishing products. It does not transfer your copyright or authorize +This grant is limited to straywild, its promotion, and official successor or +derived straywild products. It does not transfer your copyright or authorize the Owners to sell your contribution as an unrelated standalone asset. ## 4. Documentation accompanying code @@ -78,7 +78,7 @@ or release. ## 6. No automatic ownership, employment, or payment -Submitting a contribution does not provide ownership of NETfishing, create an +Submitting a contribution does not provide ownership of straywild, create an employment, agency, partnership, or fiduciary relationship, or create a right to compensation. Any payment, ownership, or employment arrangement requires a separate written agreement signed by the appropriate parties. diff --git a/README.md b/README.md index 132b3f8..e228e7b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# NETfishing +# straywild -NETfishing is a multiplayer-first fishing game built with Godot 4.7. The +straywild is a multiplayer-first fishing game built with Godot 4.7. The current pre-alpha includes host-authoritative fishing and economy flows, freshwater and saltwater habitats, persistent player data, social features, customization, jobs, and a controller-aware interface. @@ -8,39 +8,39 @@ customization, jobs, and a controller-aware interface. The project is under active development. Interfaces, balance, content, and save migrations may continue to change before a stable release. -NETfishing is developed and published by **Woofmeow**, the independent team of +straywild is developed and published by **Woofmeow**, the independent team of co-owners publicly credited as Voyager and Endeavour. ## Links Patreon: https://www.patreon.com/cw/woofmeowgames -Steam: https://store.steampowered.com/app/5068950/NETfishing/ +Steam: https://store.steampowered.com/app/5068950/straywild/ -Itch.io: https://sol6-vi.itch.io/netfishing +Itch.io: https://sol6-vi.itch.io/straywild Discord: https://discord.gg/5gP22447kc -Matrix: https://matrix.to/#/#netfishing:matrix.makearmy.io +Matrix: https://matrix.to/#/#straywild:matrix.makearmy.io -Repo: https://forge.makearmy.io/woofmeow/netfishing +Repo: https://forge.makearmy.io/woofmeow/straywild -Releases: https://forge.makearmy.io/woofmeow/netfishing/releases +Releases: https://forge.makearmy.io/woofmeow/straywild/releases ## Installing release builds Download and extract the archive for your platform from the official release -page, then run NETfishing from the extracted platform folder. +page, then run straywild from the extracted platform folder. ### macOS Current macOS builds are not signed or notarized. macOS may block the first -launch because it cannot verify the developer. Control-click the NETfishing +launch because it cannot verify the developer. Control-click the straywild application, choose **Open**, then confirm **Open**. If that option is not available, attempt to open the application once, then use **System Settings → Privacy & Security → Open Anyway**. -Only bypass this warning for a NETfishing build downloaded from an official +Only bypass this warning for a straywild build downloaded from an official project release. ## Requirements @@ -110,10 +110,10 @@ world and UI authoring, and testing are consolidated in - Project-owned software code is licensed under [GPL-3.0-or-later](LICENSE). - Project-owned artwork, models, music, and other creative assets are covered - by the [NETfishing Asset License](ASSET-LICENSE.md). It permits community - Mods for official NETfishing software and narrowly scoped contribution forks, + by the [straywild Asset License](ASSET-LICENSE.md). It permits community + Mods for official straywild software and narrowly scoped contribution forks, but not independent forks, clones, or unrelated products. -- The NETfishing and Woofmeow names and branding are reserved as described in +- The straywild and Woofmeow names and branding are reserved as described in [TRADEMARKS.md](TRADEMARKS.md). - Third-party materials retain their own terms; see the consolidated [credits, notices, and provenance record](docs/ATTRIBUTION.md). diff --git a/TRADEMARKS.md b/TRADEMARKS.md index 363248b..fbf49d5 100644 --- a/TRADEMARKS.md +++ b/TRADEMARKS.md @@ -1,7 +1,7 @@ -# NETfishing and Woofmeow branding +# straywild and Woofmeow branding -The NETfishing and Woofmeow names, logos, icons, trade dress, and other source -identifiers are reserved by the NETfishing owners, publishing as Woofmeow. +The straywild and Woofmeow names, logos, icons, trade dress, and other source +identifiers are reserved by the straywild owners, publishing as Woofmeow. Their presence in a GPL-licensed repository does not grant trademark rights or imply permission to represent another product as official. @@ -10,30 +10,30 @@ exist through use and other law. ## Permitted references -You may use the names NETfishing and Woofmeow truthfully to: +You may use the names straywild and Woofmeow truthfully to: - refer to the official game or development team; -- state that software interoperates with or is a Mod for NETfishing; +- state that software interoperates with or is a Mod for straywild; - link to an official repository or distribution page; and - discuss, review, criticize, or report on the Project. Use only the amount of branding reasonably necessary to identify the Project. Do not imply sponsorship, certification, endorsement, or official status. -An unofficial Mod may use wording such as “Example Mod for NETfishing” if its +An unofficial Mod may use wording such as “Example Mod for straywild” if its name and presentation remain clearly distinct and it displays an unofficial notice. ## Contribution forks A qualifying Contribution Fork under `ASSET-LICENSE.md` may retain the -NETfishing and Woofmeow names, logos, icons, and trade dress already present in +straywild and Woofmeow names, logos, icons, and trade dress already present in the official source repository solely as necessary to reproduce, modify, and test the Project while preparing a proposed contribution. The source-control host's visible fork relationship or an equivalent repository notice must make its unofficial contribution purpose clear. -This permission does not allow a Contribution Fork to use NETfishing or +This permission does not allow a Contribution Fork to use straywild or Woofmeow branding to advertise a public build, release, service, community edition, or independent product. It does not imply acceptance, sponsorship, endorsement, or official status. @@ -44,7 +44,7 @@ The GNU GPL permits forks and redistribution of covered code. A fork or modified distribution that is not a qualifying Contribution Fork must: - use a distinct product name; -- remove NETfishing and Woofmeow logos, icons, and official trade dress; +- remove straywild and Woofmeow logos, icons, and official trade dress; - avoid confusingly similar names, domains, package identifiers, and account names; and - clearly identify itself as independent and unofficial. @@ -53,4 +53,4 @@ These branding terms do not limit rights granted by the GPL to the software code or lawful nominative, descriptive, comparative, or fair use. Permission for broader branding use must be obtained in writing from both -NETfishing owners. +straywild owners. diff --git a/addons/netfishing_shoreline_baker/plugin.cfg b/addons/straywild_shoreline_baker/plugin.cfg similarity index 81% rename from addons/netfishing_shoreline_baker/plugin.cfg rename to addons/straywild_shoreline_baker/plugin.cfg index c8c4d06..c3f4e47 100644 --- a/addons/netfishing_shoreline_baker/plugin.cfg +++ b/addons/straywild_shoreline_baker/plugin.cfg @@ -1,6 +1,6 @@ [plugin] -name="NETfishing Shoreline Auto-Baker" +name="straywild Shoreline Auto-Baker" description="Rebuilds configured static shoreline ribbons after authored terrain reimports." author="woofmeow" version="1.0.0" diff --git a/addons/netfishing_shoreline_baker/shoreline_auto_baker.gd b/addons/straywild_shoreline_baker/shoreline_auto_baker.gd similarity index 100% rename from addons/netfishing_shoreline_baker/shoreline_auto_baker.gd rename to addons/straywild_shoreline_baker/shoreline_auto_baker.gd diff --git a/addons/netfishing_shoreline_baker/shoreline_auto_baker.gd.uid b/addons/straywild_shoreline_baker/shoreline_auto_baker.gd.uid similarity index 100% rename from addons/netfishing_shoreline_baker/shoreline_auto_baker.gd.uid rename to addons/straywild_shoreline_baker/shoreline_auto_baker.gd.uid diff --git a/art/exported/characters/base/netfishing_base_character.glb b/art/exported/characters/base/straywild_base_character.glb similarity index 100% rename from art/exported/characters/base/netfishing_base_character.glb rename to art/exported/characters/base/straywild_base_character.glb diff --git a/art/exported/characters/base/netfishing_base_character.glb.import b/art/exported/characters/base/straywild_base_character.glb.import similarity index 77% rename from art/exported/characters/base/netfishing_base_character.glb.import rename to art/exported/characters/base/straywild_base_character.glb.import index b1409e1..96925de 100644 --- a/art/exported/characters/base/netfishing_base_character.glb.import +++ b/art/exported/characters/base/straywild_base_character.glb.import @@ -4,12 +4,12 @@ importer="scene" importer_version=1 type="PackedScene" uid="uid://w7n4gjqq1juc" -path="res://.godot/imported/netfishing_base_character.glb-0167c087f16181d405afb962dc877d2c.scn" +path="res://.godot/imported/straywild_base_character.glb-65021653e51a906d3b4a3494f170317f.scn" [deps] -source_file="res://art/exported/characters/base/netfishing_base_character.glb" -dest_files=["res://.godot/imported/netfishing_base_character.glb-0167c087f16181d405afb962dc877d2c.scn"] +source_file="res://art/exported/characters/base/straywild_base_character.glb" +dest_files=["res://.godot/imported/straywild_base_character.glb-65021653e51a906d3b4a3494f170317f.scn"] [params] diff --git a/art/exported/characters/base/netfishing_base_character_eyes_simple_shine.png b/art/exported/characters/base/straywild_base_character_eyes_simple_shine.png similarity index 100% rename from art/exported/characters/base/netfishing_base_character_eyes_simple_shine.png rename to art/exported/characters/base/straywild_base_character_eyes_simple_shine.png diff --git a/art/exported/characters/base/netfishing_base_character_eyes_simple_shine.png.import b/art/exported/characters/base/straywild_base_character_eyes_simple_shine.png.import similarity index 58% rename from art/exported/characters/base/netfishing_base_character_eyes_simple_shine.png.import rename to art/exported/characters/base/straywild_base_character_eyes_simple_shine.png.import index 4141bca..ddf8bb7 100644 --- a/art/exported/characters/base/netfishing_base_character_eyes_simple_shine.png.import +++ b/art/exported/characters/base/straywild_base_character_eyes_simple_shine.png.import @@ -3,8 +3,8 @@ importer="texture" type="CompressedTexture2D" uid="uid://dyjwgkgw0syo8" -path.s3tc="res://.godot/imported/netfishing_base_character_eyes_simple_shine.png-140bfa3aa0b6f662e8ff9e5721213a61.s3tc.ctex" -path.etc2="res://.godot/imported/netfishing_base_character_eyes_simple_shine.png-140bfa3aa0b6f662e8ff9e5721213a61.etc2.ctex" +path.s3tc="res://.godot/imported/straywild_base_character_eyes_simple_shine.png-200a946ddace2078bbe44addb4e4524c.s3tc.ctex" +path.etc2="res://.godot/imported/straywild_base_character_eyes_simple_shine.png-200a946ddace2078bbe44addb4e4524c.etc2.ctex" metadata={ "imported_formats": ["s3tc_bptc", "etc2_astc"], "vram_texture": true @@ -15,8 +15,8 @@ generator_parameters={ [deps] -source_file="res://art/exported/characters/base/netfishing_base_character_eyes_simple_shine.png" -dest_files=["res://.godot/imported/netfishing_base_character_eyes_simple_shine.png-140bfa3aa0b6f662e8ff9e5721213a61.s3tc.ctex", "res://.godot/imported/netfishing_base_character_eyes_simple_shine.png-140bfa3aa0b6f662e8ff9e5721213a61.etc2.ctex"] +source_file="res://art/exported/characters/base/straywild_base_character_eyes_simple_shine.png" +dest_files=["res://.godot/imported/straywild_base_character_eyes_simple_shine.png-200a946ddace2078bbe44addb4e4524c.s3tc.ctex", "res://.godot/imported/straywild_base_character_eyes_simple_shine.png-200a946ddace2078bbe44addb4e4524c.etc2.ctex"] [params] diff --git a/art/exported/characters/base/netfishing_base_character_mouth_three.png b/art/exported/characters/base/straywild_base_character_mouth_three.png similarity index 100% rename from art/exported/characters/base/netfishing_base_character_mouth_three.png rename to art/exported/characters/base/straywild_base_character_mouth_three.png diff --git a/art/exported/characters/base/netfishing_base_character_mouth_three.png.import b/art/exported/characters/base/straywild_base_character_mouth_three.png.import similarity index 59% rename from art/exported/characters/base/netfishing_base_character_mouth_three.png.import rename to art/exported/characters/base/straywild_base_character_mouth_three.png.import index 10d0721..ba0ec2c 100644 --- a/art/exported/characters/base/netfishing_base_character_mouth_three.png.import +++ b/art/exported/characters/base/straywild_base_character_mouth_three.png.import @@ -3,8 +3,8 @@ importer="texture" type="CompressedTexture2D" uid="uid://dt5gitdtjdvcd" -path.s3tc="res://.godot/imported/netfishing_base_character_mouth_three.png-90b4a98403d2a291a56a8ed42aaa8473.s3tc.ctex" -path.etc2="res://.godot/imported/netfishing_base_character_mouth_three.png-90b4a98403d2a291a56a8ed42aaa8473.etc2.ctex" +path.s3tc="res://.godot/imported/straywild_base_character_mouth_three.png-5bcf329b31a11eff496760a63e62d0e2.s3tc.ctex" +path.etc2="res://.godot/imported/straywild_base_character_mouth_three.png-5bcf329b31a11eff496760a63e62d0e2.etc2.ctex" metadata={ "imported_formats": ["s3tc_bptc", "etc2_astc"], "vram_texture": true @@ -15,8 +15,8 @@ generator_parameters={ [deps] -source_file="res://art/exported/characters/base/netfishing_base_character_mouth_three.png" -dest_files=["res://.godot/imported/netfishing_base_character_mouth_three.png-90b4a98403d2a291a56a8ed42aaa8473.s3tc.ctex", "res://.godot/imported/netfishing_base_character_mouth_three.png-90b4a98403d2a291a56a8ed42aaa8473.etc2.ctex"] +source_file="res://art/exported/characters/base/straywild_base_character_mouth_three.png" +dest_files=["res://.godot/imported/straywild_base_character_mouth_three.png-5bcf329b31a11eff496760a63e62d0e2.s3tc.ctex", "res://.godot/imported/straywild_base_character_mouth_three.png-5bcf329b31a11eff496760a63e62d0e2.etc2.ctex"] [params] diff --git a/art/exported/characters/base/netfishing_base_character_nose_dog_round.png b/art/exported/characters/base/straywild_base_character_nose_dog_round.png similarity index 100% rename from art/exported/characters/base/netfishing_base_character_nose_dog_round.png rename to art/exported/characters/base/straywild_base_character_nose_dog_round.png diff --git a/art/exported/characters/base/netfishing_base_character_nose_dog_round.png.import b/art/exported/characters/base/straywild_base_character_nose_dog_round.png.import similarity index 59% rename from art/exported/characters/base/netfishing_base_character_nose_dog_round.png.import rename to art/exported/characters/base/straywild_base_character_nose_dog_round.png.import index 71d25b6..cb2c573 100644 --- a/art/exported/characters/base/netfishing_base_character_nose_dog_round.png.import +++ b/art/exported/characters/base/straywild_base_character_nose_dog_round.png.import @@ -3,8 +3,8 @@ importer="texture" type="CompressedTexture2D" uid="uid://bmho1ryst3smt" -path.s3tc="res://.godot/imported/netfishing_base_character_nose_dog_round.png-0008adff5271dd0403e610ef13dd52cf.s3tc.ctex" -path.etc2="res://.godot/imported/netfishing_base_character_nose_dog_round.png-0008adff5271dd0403e610ef13dd52cf.etc2.ctex" +path.s3tc="res://.godot/imported/straywild_base_character_nose_dog_round.png-e6909a2c139cf4a2748c2b79d1e12d92.s3tc.ctex" +path.etc2="res://.godot/imported/straywild_base_character_nose_dog_round.png-e6909a2c139cf4a2748c2b79d1e12d92.etc2.ctex" metadata={ "imported_formats": ["s3tc_bptc", "etc2_astc"], "vram_texture": true @@ -15,8 +15,8 @@ generator_parameters={ [deps] -source_file="res://art/exported/characters/base/netfishing_base_character_nose_dog_round.png" -dest_files=["res://.godot/imported/netfishing_base_character_nose_dog_round.png-0008adff5271dd0403e610ef13dd52cf.s3tc.ctex", "res://.godot/imported/netfishing_base_character_nose_dog_round.png-0008adff5271dd0403e610ef13dd52cf.etc2.ctex"] +source_file="res://art/exported/characters/base/straywild_base_character_nose_dog_round.png" +dest_files=["res://.godot/imported/straywild_base_character_nose_dog_round.png-e6909a2c139cf4a2748c2b79d1e12d92.s3tc.ctex", "res://.godot/imported/straywild_base_character_nose_dog_round.png-e6909a2c139cf4a2748c2b79d1e12d92.etc2.ctex"] [params] diff --git a/art/exported/system_icons/netfishing.ico b/art/exported/system_icons/netfishing.ico deleted file mode 100644 index dc5bdae44f0e878ab1ef377195fd128abd87e4cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370326 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
$6d3{K~mRvq~0mdnVWDxfds-VUC2BMgOJT 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 R^PjhSi}l0Xc?Pww{~w$NsCWPX diff --git a/art/exported/system_icons/netfishing_1024.png b/art/exported/system_icons/netfishing_1024.png deleted file mode 100644 index a433e8053e5ec65806f7d3745b985316dc51d4f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76386 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%0D5h}fTcY(-{wUXqBsxiwM27UTRDOX-93sF2jg<<# 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ΜpIEE6U%-)_)YuH}ASt>f|HEtfWU8_*Aw! zeSQwJ?_a4#p|4NdIo&+mQC@_q|z2v>8cNv9#_R~(p5JC#`Lv*x_RDx0O{uG z4FF@+V1E7ivRdzZt6%Fqc|VQvP14*v`kHp@`ML)kKLvjJj;rz((!8EZwG2pew8$PW za?O1%TLd!7Q$AftTGq#%9QmA^+Gkc)!Pj1F?8<5V0@kYAlj9sEf!6210D5g| zwRT`W#%s?i2s4R<0n}9b8EZ7L=gPIBIu4yjMiQWAw;hh!|6XRxg@ol~?@qcBcdtRs zi+5xd*_qjMt_1<5;2CzSH_V{nbZ^Pqck*!aHls6m7X7kl)hr|nr=%G^#2hz68?`K` zPFu8+3M*BtU-;8e`DBcl(AJbKx`t4ewD-T13zB|G&GyR7;ZZ>c#a(xSybFxO#Ha)yUcp6%mYzd1O|=Cj%m25ayQcj{X8r(U zVw5q1iRNrWRFFN$tGbMniOt3x$f&;GHy#WzwpE7+=&2yv>o^m`0sortpjyB;CLZBUK;X{0XQ&l zsSmi&Yo_DFk|tR20WtWtsuIIYSjzNE%oD#sc%92!Wae6#B%VnVu=BDLt$LBBL8F4R zOMzej%~}9V=)IjBMdDZ_T+KDZvm!cc0CvK-5&)IX3MuA&#xx+7wySI*@`_wtmzw3L zOc0kRuHQD8foI`6UwCKAq@L&%vR2@Ir_5dRMI)GvK>72_UU(;z7U2Y_+ z_P6BzP14nm)Zb-!&q|g@)7t$fx4Eax(C6%vS5)L17qnw0I9jwLd;Kcg78juTD<`Vi z84lVX9B#*(bbUM~=dgA-~#lKER z(@lWMwTbx#ED>)x{Ss-8opkZ-rjD?TRYbT+)j%cg?kSCo3m$btd9FmGBfYyLg|XC^Gs36ukBnsc-2>5)v!e$t*DX!DWI zidw2(Rl77tBLJ$^8S^e2j5?)N;E*x2}n6NtnaT%LzGuq=QcRa&&~@ z4^h5_@bOJFuLLqO4XrBBjLNjTyN~oS@Z-S0=Bsj)xJ_awIUIE0xjZHXFrO#&POrF( z8@zEF7FC`&$Hm~WQH>L=u!p#*1cMN9a=I7cU)G*K%hd;95EW{{i^Vz<=bOWENUU zQV6%FHIqvQKI224RBe}s>FghWH;Q2wSHkllb|BoR4e0T4p^m{T}jM>g?* zi}g7JbxPQbX|kGkDkG9miE6>NwwaB^~hP9gXfOjwR=xKe@^B{B*-Gpp{?BwEGLVJbmE=oWqLZV z*KLv$`F>2A3j=9xoOcXx?HyXT&%~c#K9<(*O$&gM0!btI8In8kI~SGs+*BNDV);ut z7m%V5I6{h9L%eY#lk=4s}f)FMez_}eu49bd`^`0PSgwrc-J zAM;eNa0c=oIPl25V&g7xjFTSwkOPmo=7H?zzE>rV5j~9PM0cB`9ft$#H(6^)dZeI) za6oiyoclDpn${XbCt_AQR~}OIDeF?}BWyJx@6}#94>WbPiOsp}Yj2w`1BRPTv&Gg# z&)p-}mEJ_(k-)k(+*dgcY;TwB3Amy5`!4`sqmEB!1S}VVrhRi8b3i4Xs~=qx7Qx~Q zb0-w0`rq)%ZvuZnLG|rHs{EMdHeEypD|Kwky-6<5rH-m8mZSeGxZcCnkC;3>qbjcs zBZo`~@Gb~|k`BQC%AbD)`~>iifqx48;@d79(1nA8Y`Aj6;+W+aw)|x{T6x&;PJ-sPPwv2afqt)^l5KwBT%T|QH6R|k1|dT-9eHBo~t zc-B;BBG;JWKa@t8tq8vj{4Vf&0)Otcj~m)Tmwe+2p5eq4KOxTeEesE5!KHv6KsIm~ zVgE9HCl8NTF>3j8PFp97D89|L}p6u$gtfWHI$ZQySJ?^AiDznL`c z=9|uXmEmN&@{Ty3h-aIfgvu{*Qv0dtp*o0{ns-)~x~@SPN}#jG9clX80?ScrYoF@O zWVEnj+wH;Py-T|}(9?|1*LYi%{dLoAL6o#uJqJEV_#W^lz#nBtoj(OW174o>-j!nL sIpvUgh*VmR@spS+;K|@1^M2$10sGr=oCnn+g#Z8m07*qoM6N<$f?8~KfB*mh diff --git a/art/exported/system_icons/straywild.ico b/art/exported/system_icons/straywild.ico new file mode 100644 index 0000000000000000000000000000000000000000..c03de8ec87209f5869d84eea6847992003125512 GIT binary patch literal 370326 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ʳw=SDIHCUG!RZ#h#;9836lDSO_zaIf9| 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 literal 0 HcmV?d00001 diff --git a/art/exported/system_icons/straywild_1024.png b/art/exported/system_icons/straywild_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..2a3b204a310e9b2f80e780032cf2933f2b40f267 GIT binary patch literal 80419 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≀gb)_d`G-{$3u}%cD1%X4?ANP{8qV1su7;gMiQkW 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 literal 0 HcmV?d00001 diff --git a/art/exported/system_icons/netfishing_1024.png.import b/art/exported/system_icons/straywild_1024.png.import similarity index 74% rename from art/exported/system_icons/netfishing_1024.png.import rename to art/exported/system_icons/straywild_1024.png.import index 08aa925..dea156a 100644 --- a/art/exported/system_icons/netfishing_1024.png.import +++ b/art/exported/system_icons/straywild_1024.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://bkh5hw8wwu8pc" -path="res://.godot/imported/netfishing_1024.png-7c53a099ed2743b4a623c258641b1d29.ctex" +path="res://.godot/imported/straywild_1024.png-b9b5c159c9fcecc21b04324370d4522f.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://art/exported/system_icons/netfishing_1024.png" -dest_files=["res://.godot/imported/netfishing_1024.png-7c53a099ed2743b4a623c258641b1d29.ctex"] +source_file="res://art/exported/system_icons/straywild_1024.png" +dest_files=["res://.godot/imported/straywild_1024.png-b9b5c159c9fcecc21b04324370d4522f.ctex"] [params] diff --git a/art/exported/system_icons/straywild_256.png b/art/exported/system_icons/straywild_256.png new file mode 100644 index 0000000000000000000000000000000000000000..98275eb61ba155c1182c746e8d62aaa99cbc1c18 GIT binary patch literal 51987 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 Copyright (c) 2014-present Godot Engine contributors. > Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. @@ -103,7 +103,7 @@ FreeType for font rendering; portions are copyright The FreeType Project Runtime file: `ui/fonts/seattle_avenue.otf`; source, hash, and original notice: `ui/fonts/Seattle-Avenue-LICENSE.txt`. -Public-domain fonts are not governed by the NETfishing Asset License. +Public-domain fonts are not governed by the straywild Asset License. ## Intake policy @@ -122,7 +122,7 @@ owners' private project records. This public document should contain the credits and license notices needed by recipients; it should not duplicate a changing file inventory that can be derived from the repository itself. -NETfishing does not accept unsolicited contributions. For work expressly +straywild does not accept unsolicited contributions. For work expressly invited by both Owners, maintainers must obtain affirmative agreement to the source-root `CONTRIBUTOR-TERMS.md` and retain the written invitation and agreement in a durable Project record. @@ -159,8 +159,8 @@ against the repository when this record was revised. | Material | Runtime location | Credit or terms | | --- | --- | --- | -| Kat animalese alphabet and number sounds | `sound/dialogue/animalese/alphanumeric/` | Project-processed derivatives of the original source voice recording supplied by NETfishing community member kat. | -| Kim animalese alphabet and number sounds | `sound/dialogue/animalese/kim/` | Project-processed derivatives of the original source voice recording supplied by NETfishing community member kim. | +| Kat animalese alphabet and number sounds | `sound/dialogue/animalese/alphanumeric/` | Project-processed derivatives of the original source voice recording supplied by straywild community member kat. | +| Kim animalese alphabet and number sounds | `sound/dialogue/animalese/kim/` | Project-processed derivatives of the original source voice recording supplied by straywild community member kim. | | Tuffy font | `ui/fonts/Tuffy_Bold.otf` | Public-domain dedication in `ui/fonts/Tuffy-LICENSE.txt`. | | Seattle Avenue font | `ui/fonts/seattle_avenue.otf` | Public-domain font by JLH Fonts; notice in `ui/fonts/Seattle-Avenue-LICENSE.txt`. | | Fishing fight loop | `audio/sfx/fishing/fighting.wav` | Edited from “Spinning reel.wav” by Freesound user tosha73, sound 509902, CC0. | diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index 09db779..76ed032 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -1,6 +1,6 @@ # Development reference -This is the authoritative reference for NETfishing architecture, engineering +This is the authoritative reference for straywild architecture, engineering decisions, content policy, authoring, and validation. ## Architecture @@ -43,7 +43,7 @@ open host may publish a short-lived room lease, and the shared Join Game page may browse compatible leases before handing the selected address back to the existing direct ENet connection flow. The directory does not carry gameplay traffic or become a gameplay authority. Its base URL comes from -`network/discovery/base_url`, with `NETFISHING_DISCOVERY_URL` available as a +`network/discovery/base_url`, with `straywild_DISCOVERY_URL` available as a development/deployment override. Friendships are local identity relationships shared across save slots. A live, @@ -261,7 +261,7 @@ copies of the entire customization catalog. ### Texture sampling -NETfishing artwork uses nearest-neighbor sampling. Do not enable linear, +straywild artwork uses nearest-neighbor sampling. Do not enable linear, bilinear, trilinear, or anisotropic texture filtering. Shader samplers must declare `filter_nearest`. The three canonical repeating terrain textures are the sole mipmap exception: their projected shader uses nearest-filtered @@ -351,10 +351,10 @@ godot --headless --path . --script tests/fish_catalog_content_validation.gd rm -rf -- "$test_root" ``` -Do not point `NETFISHING_DATA_DIR` at an arbitrary empty directory; it is an +Do not point `straywild_DATA_DIR` at an arbitrary empty directory; it is an explicit portable-data override and must identify a valid data root. The PortMaster launcher is the narrow exception: it also sets -`NETFISHING_CREATE_DATA_DIR=1`, allowing the game to initialize its known empty +`straywild_CREATE_DATA_DIR=1`, allowing the game to initialize its known empty external save directory on first launch. Headless tests cannot prove visual alignment, mouse routing, shader appearance, diff --git a/docs/PORTMASTER.md b/docs/PORTMASTER.md index e8c24f6..3c75a80 100644 --- a/docs/PORTMASTER.md +++ b/docs/PORTMASTER.md @@ -1,15 +1,15 @@ # PortMaster reference -NETfishing's PortMaster release is a canonical PortMaster package, not a +straywild's PortMaster release is a canonical PortMaster package, not a version-named generic ZIP. The installer-facing archive must be named -`netfishing.zip`, and its root must contain exactly: +`straywild.zip`, and its root must contain exactly: ```text -NETfishing.sh -netfishing/ +straywild.sh +straywild/ ``` -`port.json` belongs at `netfishing/port.json` in the distributable archive. +`port.json` belongs at `straywild/port.json` in the distributable archive. The upstream source-submission layout keeps it beside the launcher and port directory, but PortMaster's release builder relocates it into the declared port directory. Do not copy the source-submission layout directly into a @@ -17,7 +17,7 @@ release ZIP. HarbourMaster's installer also relocates recognized non-script files found at an archive root into the detected port directory. That compatibility behavior -masked NETfishing's former root-level `port.json` during auto-install tests. +masked straywild's former root-level `port.json` during auto-install tests. Directly extracting the same archive into `/ports` did not perform the repair. Do not rely on installer relocation; build the distributable layout correctly. @@ -26,30 +26,30 @@ directory. The templates in `scripts/portmaster/` are authoritative. ## Release contract -- `port.json` uses schema version 4, names `netfishing.zip`, and marks the +- `port.json` uses schema version 4, names `straywild.zip`, and marks the self-contained package ready to run. -- `NETfishing.sh` does not contain a `# PORTMASTER:` signature in the source or +- `straywild.sh` does not contain a `# PORTMASTER:` signature in the source or distributable archive. HarbourMaster adds that installation marker when it installs the port. -- The executable is `netfishing/NETfishing.aarch64`. +- The executable is `straywild/straywild.aarch64`. - The package declares AArch64, two analog sticks, GLIBC 2.28, and `weston_pkg_0.2.squashfs`. -- The launcher starts GPTOKEYB with the explicit `netfishing.gptk` no-op map. +- The launcher starts GPTOKEYB with the explicit `straywild.gptk` no-op map. Every keyboard and mouse binding is disabled, leaving only GPTOKEYB's - device-specific force-quit chord while Godot and NETfishing's controller + device-specific force-quit chord while Godot and straywild's controller mapping manager handle gameplay input. The explicit map also avoids the anomalous controller behavior observed on ROCKNIX without a passthrough map. - The launcher calls `pm_platform_helper` for the game executable after starting GPTOKEYB and calls `pm_finish` after the game exits. -- NETfishing automatically creates player data for new installations under - `ports/saves/netfishing/` and does not present the in-game folder picker. +- straywild automatically creates player data for new installations under + `ports/saves/straywild/` and does not present the in-game folder picker. - Existing installations with a selected data root keep that location when upgraded. Device-local data, configuration, and cache remain under - `netfishing/conf/data`, `netfishing/conf/config`, and - `netfishing/conf/cache`. + `straywild/conf/data`, `straywild/conf/config`, and + `straywild/conf/cache`. - The archive must not contain `conf/`, saves, identities, logs, source files, `.git`, or `.godot` content. -- Release downloads must publish only the canonical `netfishing.zip` for this +- Release downloads must publish only the canonical `straywild.zip` for this platform. Do not also publish a byte-identical versioned PortMaster ZIP; HarbourMaster identifies the port by its canonical archive name and the Forgejo release tag already supplies the version. @@ -67,7 +67,7 @@ The script deletes and regenerates the Linux ARM64 export, stages the package, validates its structure, and writes: ```text -builds/v/netfishing.zip +builds/v/straywild.zip ``` `--package-only` is reserved for repackaging an already validated ARM64 export. @@ -83,7 +83,7 @@ bash scripts/build_portmaster.sh --package-only --hotfix The hotfix keeps the game executable and PCK tied to the release tag while recording the newer packaging commit separately in `BUILD-INFO.txt`. Replace -the release's existing `netfishing.zip`; never move the game release tag. +the release's existing `straywild.zip`; never move the game release tag. ## Local muOS installation @@ -93,22 +93,22 @@ The muOS auto-install directory is: /mnt/mmc/MUOS/PortMaster/autoinstall/ ``` -For an explicit offline installation test, copy `netfishing.zip` to a temporary +For an explicit offline installation test, copy `straywild.zip` to a temporary device directory and run: ```bash /mnt/mmc/MUOS/PortMaster/harbourmaster \ - --offline --no-check install ./netfishing.zip + --offline --no-check install ./straywild.zip ``` Before upgrading an existing installation, preserve -`/mnt/mmc/ports/netfishing/conf/` and `/mnt/mmc/ports/saves/netfishing/` on the +`/mnt/mmc/ports/straywild/conf/` and `/mnt/mmc/ports/saves/straywild/` on the device. After installation: 1. Confirm the installed executable and PCK hashes match the staged release. 2. Confirm HarbourMaster added its `# PORTMASTER:` installation signature to the installed launcher, then confirm the launcher starts GPTOKEYB with - `netfishing.gptk` and calls `pm_platform_helper` for the game executable. + `straywild.gptk` and calls `pm_platform_helper` for the game executable. 3. Confirm `conf/` and the external save directory were not replaced or removed. 4. Launch the installed port through the normal muOS menu. @@ -117,7 +117,7 @@ device. After installation: Start+Select on most devices. Installing the public PortMaster catalog entry can still install an older -catalog build until the upstream `netfishing.zip` is updated. A local release +catalog build until the upstream `straywild.zip` is updated. A local release test must install the generated local archive explicitly. ## Template provenance @@ -130,7 +130,7 @@ f24daae48f543b3a270a5aa46b5e73a31904bf0c7216d4c8a9e15a8dc48a5eed screenshot.png ``` The remaining catalog metadata assets were copied from the installed official -`netfishing.zip` package and are intentionally preserved byte-for-byte: +`straywild.zip` package and are intentionally preserved byte-for-byte: ```text e2a9d132744684c67865c01eca027a8c9946b4c5a19da57c82f1af0373dc83b7 gameinfo.xml @@ -160,7 +160,7 @@ The device-verified Godot mapping is: - left-stick click `b9`, left trigger `b10`, right trigger `b11`, right-stick click `b12` - D-pad `h0`; left and right sticks `a0..a3` -`scripts/portmaster/NETfishing.sh` must replace the incompatible SDL2 entry +`scripts/portmaster/straywild.sh` must replace the incompatible SDL2 entry with the Godot entry when that SDL2 GUID is selected. Do not append the two entries with a newline. WestonPack reconstructs the wrapped game command through a shell, so raw mapping values passed in that command can be split into @@ -169,14 +169,14 @@ this failure with the `GO-Super Gamepad` mapping. The outer Weston environment also does not reliably preserve the corrected muOS mapping for the game. Write the exact selected mapping to `conf/cache/controller_mapping.txt` before -starting Weston. Weston must launch `launch-netfishing.sh`, which reads that +starting Weston. Weston must launch `launch-straywild.sh`, which reads that file, exports `SDL_GAMECONTROLLERCONFIG`, and immediately replaces itself with the game process. This applies the mapping at the same point as the working 0.10.1 launcher without passing its raw text through WestonPack's command reconstruction. Do not move the mapping back to either side of `westonwrap.sh`. -Always pass `netfishing.gptk`, which explicitly unassigns every direct and +Always pass `straywild.gptk`, which explicitly unassigns every direct and hotkey binding with GPTOKEYB's `\"` value. This keeps GPTOKEYB from injecting keyboard or mouse events on top of Godot's native controller input and retains the device-specific kill chord. Supplying the explicit passthrough map also @@ -209,8 +209,8 @@ The light profile passes these Godot options: - `--max-fps 30` - `--audio-output-latency 40` -It also passes `NETFISHING_PERFORMANCE_PROFILE=light` and -`NETFISHING_LOW_END=1`. The game renders the 3D world at 37.5% linear +It also passes `straywild_PERFORMANCE_PROFILE=light` and +`straywild_LOW_END=1`. The game renders the 3D world at 37.5% linear resolution with nearest-neighbor scaling, reducing 3D pixel work by about 86% while the separately rendered UI retains its canonical resolution. The light profile also: @@ -244,7 +244,7 @@ omitted ambience or replace the micro textures with desktop-resolution assets. The normal profile otherwise retains the full visual presentation. To opt a capable device into the normal profile, create the persistent file -`netfishing/conf/performance_profile` containing exactly: +`straywild/conf/performance_profile` containing exactly: ```text normal @@ -253,13 +253,13 @@ normal On a typical muOS installation, the full path is: ```text -/mnt/mmc/ports/netfishing/conf/performance_profile +/mnt/mmc/ports/straywild/conf/performance_profile ``` Set the file to `light`, or remove it, to restore the default. An externally -provided `NETFISHING_PERFORMANCE_PROFILE=normal` or `light` environment value +provided `straywild_PERFORMANCE_PROFILE=normal` or `light` environment value takes precedence over the persistent file. Invalid values safely fall back to -the light profile and are reported in `netfishing/log.txt`. +the light profile and are reported in `straywild/log.txt`. Do not use Godot's low processor mode for the light profile. It reduces idle CPU usage by sleeping between updates and is not a game-performance diff --git a/docs/README-PLAYTEST.txt b/docs/README-PLAYTEST.txt index f1839ea..fb08636 100644 --- a/docs/README-PLAYTEST.txt +++ b/docs/README-PLAYTEST.txt @@ -1,10 +1,10 @@ -NETfishing +straywild v0.18.1-alpha Alpha 0.18.1 Thank you for trying this early private playtest. -NETfishing is an early multiplayer fishing game. This alpha includes local +straywild is an early multiplayer fishing game. This alpha includes local progression, player-hosted and dedicated multiplayer sessions, public room discovery, and direct UDP connections. Expect rough edges and please keep a backup of any save or identity data you care about. @@ -12,15 +12,15 @@ backup of any save or identity data you care about. INSTALLATION 1. Extract the entire ZIP into a new folder. -2. Keep the executable and netfishing.pck together. -3. Launch netfishing.exe on Windows or netfishing on Linux. +2. Keep the executable and straywild.pck together. +3. Launch straywild.exe on Windows or straywild on Linux. Windows may show a warning for an unsigned application. This private build is not code signed. Only run a copy received from the playtest organizer. Linux users may need to allow execution: - chmod +x netfishing + chmod +x straywild CONTROLS diff --git a/docs/README.md b/docs/README.md index 05ac0b4..444ebc7 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,4 +1,4 @@ -# NETfishing documentation +# straywild documentation This directory is the single home for maintained project documentation. Start here instead of searching feature, asset, world, or script directories @@ -17,10 +17,10 @@ for local README files. ## Related repositories -- [Discovery service API](https://forge.makearmy.io/woofmeow/netfishing-discovery-server/src/branch/main/docs/API.md) +- [Discovery service API](https://forge.makearmy.io/woofmeow/straywild-discovery-server/src/branch/main/docs/API.md) stays with the service implementation and defines its versioned HTTP contract. -- [Dedicated-server packaging](https://forge.makearmy.io/woofmeow/netfishing-dedicated-server/src/branch/main/README.md) +- [Dedicated-server packaging](https://forge.makearmy.io/woofmeow/straywild-dedicated-server/src/branch/main/README.md) stays with its installer and update scripts. It consumes this repository's attribution and legal notices from the exact pinned game commit instead of maintaining copies. diff --git a/export_presets.cfg b/export_presets.cfg index e917d48..9ae60f2 100644 --- a/export_presets.cfg +++ b/export_presets.cfg @@ -9,7 +9,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.18.1-alpha/windows-x86_64/NETfishing.exe" +export_path="builds/v0.18.1-alpha/windows-x86_64/straywild.exe" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -32,16 +32,16 @@ codesign/digest_algorithm=1 codesign/description="" codesign/custom_options=PackedStringArray() application/modify_resources=true -application/icon="res://art/exported/system_icons/netfishing.ico" +application/icon="res://art/exported/system_icons/straywild.ico" application/console_wrapper_icon="" -application/icon_interpolation=4 +application/icon_interpolation=0 application/file_version="0.18.1.0" application/product_version="0.18.1.0" application/company_name="Woofmeow" -application/product_name="NETfishing" -application/file_description="NETfishing v0.18.1-alpha" +application/product_name="straywild" +application/file_description="straywild v0.18.1-alpha" application/copyright="Copyright © 2026 Woofmeow" -application/trademarks="NETfishing and Woofmeow branding is reserved; see TRADEMARKS.md" +application/trademarks="straywild and Woofmeow branding is reserved; see TRADEMARKS.md" application/export_angle=0 ssh_remote_deploy/enabled=false ssh_remote_deploy/host="user@host_ip" @@ -62,7 +62,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.18.1-alpha/linux-arm64/NETfishing.arm64" +export_path="builds/v0.18.1-alpha/linux-arm64/straywild.arm64" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -92,7 +92,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.18.1-alpha/macos/NETfishing.zip" +export_path="builds/v0.18.1-alpha/macos/straywild.zip" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -105,8 +105,8 @@ script_export_mode=2 custom_template/debug="" custom_template/release="" -application/bundle_identifier="io.woofmeow.netfishing" -application/icon="res://art/exported/system_icons/netfishing_1024.png" +application/bundle_identifier="io.woofmeow.straywild" +application/icon="res://art/exported/system_icons/straywild_1024.png" application/icon_interpolation=0 application/short_version="0.18.1" application/version="0.18.1" @@ -125,7 +125,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*,tests/*" -export_path="builds/v0.18.1-alpha/server-linux-x86_64/NETfishingServer.x86_64" +export_path="builds/v0.18.1-alpha/server-linux-x86_64/straywildServer.x86_64" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -155,7 +155,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.18.1-alpha/android/NETfishing.apk" +export_path="builds/v0.18.1-alpha/android/straywild.apk" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -178,8 +178,8 @@ architectures/x86=false architectures/x86_64=false version/code=180100 version/name="v0.18.1-alpha" -package/unique_name="io.woofmeow.netfishing" -package/name="NETfishing" +package/unique_name="io.woofmeow.straywild" +package/name="straywild" package/signed=true package/app_category=0 package/retain_data_on_uninstall=false @@ -187,7 +187,7 @@ package/exclude_from_recents=false package/show_in_android_tv=false package/show_in_app_library=true package/show_as_launcher_app=true -launcher_icons/main_192x192="res://art/exported/system_icons/netfishing_256.png" +launcher_icons/main_192x192="res://art/exported/system_icons/straywild_256.png" graphics/opengl_debug=false screen/immersive_mode=true screen/edge_to_edge=false @@ -214,7 +214,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.18.1-alpha/linux-x86_64/NETfishing.x86_64" +export_path="builds/v0.18.1-alpha/linux-x86_64/straywild.x86_64" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" diff --git a/main/main.gd b/main/main.gd index 1724bd9..460eb9e 100644 --- a/main/main.gd +++ b/main/main.gd @@ -294,7 +294,7 @@ func _ready() -> void: _configure_presentation_performance_profile( _performance_profile.is_light() ) - DisplayServer.window_set_title("NETfishing") + DisplayServer.window_set_title("straywild") _rain_ambience = RainAmbienceType.new() _rain_ambience.name = "RainAmbience" add_child(_rain_ambience) @@ -324,11 +324,12 @@ func _ready() -> void: func _configure_presentation_performance_profile(light_profile: bool) -> void: - _game_ui.get_title_screen().set_minimal_presentation(light_profile) _game_ui.set_light_performance_profile(light_profile) - var title_water_material := _title_background.material as ShaderMaterial - if title_water_material != null: - title_water_material.set_shader_parameter( + var title_background_material := ( + _title_background.material as ShaderMaterial + ) + if title_background_material != null: + title_background_material.set_shader_parameter( "animation_enabled", not light_profile, ) @@ -461,7 +462,7 @@ func _print_dedicated_metrics() -> void: metrics["gatherables"] = _network_world_spawns.call( "get_network_metrics" ) - print("NETfishing server metrics: %s" % JSON.stringify(metrics)) + print("straywild server metrics: %s" % JSON.stringify(metrics)) func _start_dedicated_server() -> void: @@ -556,7 +557,7 @@ func _start_dedicated_server() -> void: _fail_dedicated_server(_discovery.get_host_status_message()) return print( - "NETfishing dedicated server ready: %s on %s:%d (%d players, %s, timezone %s)" + "straywild dedicated server ready: %s on %s:%d (%d players, %s, timezone %s)" % [ config.server_name, config.bind_address, @@ -1096,7 +1097,7 @@ func _initialize_application(dedicated: bool) -> void: func _show_data_root_setup() -> void: if _data_setup_dialog == null: _data_setup_dialog = ConfirmationDialog.new() - _data_setup_dialog.title = "NETfishing player data" + _data_setup_dialog.title = "straywild player data" _data_setup_dialog.ok_button_text = "Use This Folder" _data_setup_dialog.cancel_button_text = "Quit" _data_setup_dialog.confirmed.connect(_use_default_data_root) @@ -1113,14 +1114,14 @@ func _show_data_root_setup() -> void: var default_path: String = _data_root.default_visible_path() var legacy: bool = PortableDataMigration.legacy_files_present() _data_setup_dialog.dialog_text = ( - ("Move your existing NETfishing data to an easy-to-find folder." - if legacy else "Choose where NETfishing stores your player data.") + ("Move your existing straywild data to an easy-to-find folder." + if legacy else "Choose where straywild stores your player data.") + "\n\n%s\n\nYou can choose a Syncthing folder." % (default_path if not default_path.is_empty() else "Choose a folder") ) _data_setup_dialog.ok_button_text = ( ( - "Move to Documents/NETFISHING" + "Move to Documents/straywild" if legacy else "Use This Folder" ) if not default_path.is_empty() @@ -1129,7 +1130,7 @@ func _show_data_root_setup() -> void: _data_setup_current_button.visible = not default_path.is_empty() if not _data_root.error_message.is_empty(): _data_setup_dialog.dialog_text = ( - "Your NETfishing data folder is unavailable.\n\n%s" + "Your straywild data folder is unavailable.\n\n%s" % _data_root.error_message ) _data_setup_dialog.popup_centered(Vector2i(640, 360)) @@ -1265,11 +1266,11 @@ func _activate_selected_data_path(path: String, app_data: bool = false) -> void: func _show_existing_root_choice(path: String) -> void: _pending_existing_root_path = path var dialog: ConfirmationDialog = ConfirmationDialog.new() - dialog.title = "Existing NETfishing data" + dialog.title = "Existing straywild data" dialog.ok_button_text = "Use Data Already in Selected Folder" dialog.cancel_button_text = "Cancel" dialog.dialog_text = ( - "This folder already contains NETfishing player data.\n\n" + "This folder already contains straywild player data.\n\n" + "Choose which complete data set to use. Data is never merged automatically." ) dialog.add_button( diff --git a/main/main.tscn b/main/main.tscn index b9ad6fb..c1380d6 100644 --- a/main/main.tscn +++ b/main/main.tscn @@ -38,7 +38,7 @@ [ext_resource type="Script" uid="uid://dpiv6wttry0j4" path="res://network/player_data_root.gd" id="37_data_root"] [ext_resource type="Script" uid="uid://bu5q4a8jfvxkf" path="res://network/identity_backup_service.gd" id="38_identity_backup"] [ext_resource type="Script" uid="uid://djmxy6jibi5y3" path="res://ui/interface_font_controller.gd" id="39_fonts"] -[ext_resource type="Shader" uid="uid://c8s1g7tn771du" path="res://ui/title_water_background.gdshader" id="40_title_water"] +[ext_resource type="Texture2D" uid="uid://doju2lbj2ghwa" path="res://world/generation/chunks/assets/chunk_0000_grass_lite.png" id="40_title_grass"] [ext_resource type="Texture2D" uid="uid://f8a0cs0s7ler" path="res://art/patterns/pattern_tealdot.png" id="41_menu_pattern"] [ext_resource type="Shader" uid="uid://byw3iub66qvog" path="res://ui/player_menu_pattern.gdshader" id="42_menu_pattern"] [ext_resource type="Texture2D" uid="uid://b6xws1d2dnbnn" path="res://art/patterns/pattern_moneyfish.png" id="43_shop_pattern"] @@ -59,18 +59,12 @@ [ext_resource type="Script" path="res://network/network_world_spawn_service.gd" id="59_world_spawns"] [ext_resource type="Script" path="res://gathering/gathering_controller.gd" id="60_gathering_controller"] -[sub_resource type="ShaderMaterial" id="ShaderMaterial_title_water_native"] -shader = ExtResource("40_title_water") -shader_parameter/surface_color = Color(0.1, 0.45, 0.62, 1) -shader_parameter/middle_color = Color(0.055, 0.285, 0.4, 1) -shader_parameter/depth_color = Color(0.02, 0.16, 0.27, 1) -shader_parameter/virtual_pixel_density = Vector2(320, 180) -shader_parameter/color_step_count = 14.0 -shader_parameter/continuous_depth_blend = 0.12 -shader_parameter/wave_speed = 0.1 -shader_parameter/wave_scale = 2.4 -shader_parameter/wave_strength = 0.012 -shader_parameter/caustic_strength = 0.018 +[sub_resource type="ShaderMaterial" id="ShaderMaterial_title_grass_native"] +shader = ExtResource("42_menu_pattern") +shader_parameter/pattern_texture = ExtResource("40_title_grass") +shader_parameter/source_tile_size = Vector2(128, 128) +shader_parameter/display_scale = 1.0 +shader_parameter/scroll_velocity_pixels = Vector2(-7.5, -7.5) [sub_resource type="ShaderMaterial" id="ShaderMaterial_player_menu_pattern"] shader = ExtResource("42_menu_pattern") @@ -139,7 +133,7 @@ layer = -1 [node name="TitleBackground" type="ColorRect" parent="TitleBackgroundLayer" unique_id=1768697365] unique_name_in_owner = true -material = SubResource("ShaderMaterial_title_water_native") +material = SubResource("ShaderMaterial_title_grass_native") anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 diff --git a/main/runtime_performance_profile.gd b/main/runtime_performance_profile.gd index ee2581d..8cc1ea6 100644 --- a/main/runtime_performance_profile.gd +++ b/main/runtime_performance_profile.gd @@ -2,9 +2,9 @@ class_name RuntimePerformanceProfile extends RefCounted const PROFILE_ENVIRONMENT_VARIABLE: String = ( - "NETFISHING_PERFORMANCE_PROFILE" + "straywild_PERFORMANCE_PROFILE" ) -const LEGACY_LIGHT_ENVIRONMENT_VARIABLE: String = "NETFISHING_LOW_END" +const LEGACY_LIGHT_ENVIRONMENT_VARIABLE: String = "straywild_LOW_END" const NORMAL_PROFILE: StringName = &"normal" const LIGHT_PROFILE: StringName = &"light" const NORMAL_WORLD_RENDER_SCALE: float = 1.0 diff --git a/main/texture_sampling_policy.gd b/main/texture_sampling_policy.gd index 3d041d0..822299c 100644 --- a/main/texture_sampling_policy.gd +++ b/main/texture_sampling_policy.gd @@ -1,6 +1,6 @@ extends Node -## Enforces NETfishing's nearest-neighbor-only artwork policy at runtime. +## Enforces straywild's nearest-neighbor-only artwork policy at runtime. ## ## Godot uses separate texture-filter enums for CanvasItem and 3D materials. ## Applying both here prevents imported models, dynamically created controls, diff --git a/network/discovery_client.gd b/network/discovery_client.gd index 31b8054..a3d983f 100644 --- a/network/discovery_client.gd +++ b/network/discovery_client.gd @@ -20,12 +20,12 @@ signal friend_invite_received( signal friend_invite_finished(success: bool, message: String) const BASE_URL_SETTING: String = "network/discovery/base_url" -const BASE_URL_ENVIRONMENT: String = "NETFISHING_DISCOVERY_URL" +const BASE_URL_ENVIRONMENT: String = "straywild_DISCOVERY_URL" const SETTINGS_PATH: String = "user://network_discovery.cfg" const DEFAULT_ROOM_NAME: String = "Player's Server" -const LEGACY_DEFAULT_ROOM_NAME: String = "NETfishing Room" +const LEGACY_DEFAULT_ROOM_NAME: String = "straywild Room" const LEGACY_DEDICATED_DEFAULT_ROOM_NAME: String = ( - "NETfishing Dedicated Server" + "straywild Dedicated Server" ) const ROOM_NAME_SUFFIX: String = "'s Server" const MAX_ROOM_NAME_LENGTH: int = 48 @@ -33,7 +33,7 @@ const HEARTBEAT_INTERVAL_SECONDS: float = 15.0 const REQUEST_TIMEOUT_SECONDS: float = 8.0 const TRAVERSAL_POLL_INTERVAL_SECONDS: float = 1.0 const JOIN_PROBE_INTERVAL_SECONDS: float = 0.35 -const TRAVERSAL_PACKET_PREFIX: String = "NETFISHING_TRAVERSAL_V1 " +const TRAVERSAL_PACKET_PREFIX: String = "straywild_TRAVERSAL_V1 " const UPNP_MAPPING_DURATION_SECONDS: int = 3600 const UPNP_RENEW_INTERVAL_SECONDS: float = 2700.0 const UPNP_RETRY_INTERVAL_SECONDS: float = 300.0 @@ -560,7 +560,7 @@ func _configured_base_url() -> String: if not value.is_empty() and not ( value.begins_with("https://") or value.begins_with("http://") ): - push_warning("Ignored invalid NETfishing discovery URL.") + push_warning("Ignored invalid straywild discovery URL.") return "" return value @@ -809,7 +809,7 @@ func _on_traversal_request_completed( var port: int = int(endpoint.get("port", 0)) if address.is_empty() or port < 1 or port > 65535: continue - var punch: PackedByteArray = "NETFISHING_PUNCH_V1".to_utf8_buffer() + var punch: PackedByteArray = "straywild_PUNCH_V1".to_utf8_buffer() for _attempt: int in 3: _session.send_traversal_packet(address, port, punch) @@ -895,13 +895,13 @@ func _configure_upnp_mapping(port: int) -> Dictionary: var mapping_result: int = upnp.add_port_mapping( port, port, - "NETfishing", + "straywild", "UDP", UPNP_MAPPING_DURATION_SECONDS, ) if mapping_result == UPNP.UPNP_RESULT_ONLY_PERMANENT_LEASE_SUPPORTED: mapping_result = upnp.add_port_mapping( - port, port, "NETfishing", "UDP", 0 + port, port, "straywild", "UDP", 0 ) return { "success": mapping_result == UPNP.UPNP_RESULT_SUCCESS, @@ -1374,18 +1374,18 @@ func _discovery_version_mismatch_message(required_version: String) -> String: match rejection: NetworkProtocol.RejectionCode.CLIENT_OUTDATED: return ( - "Your NETfishing version is out of date. Update to %s to " + "Your straywild version is out of date. Update to %s to " + "enable public discovery. This room will not be listed " + "until you update." ) % required_version NetworkProtocol.RejectionCode.SERVER_OUTDATED: return ( - "Public discovery is still on NETfishing %s. This room " + "Public discovery is still on straywild %s. This room " + "will not be listed until discovery is updated for %s." ) % [required_version, local_version] _: return ( - "Public discovery requires NETfishing %s. This room will " + "Public discovery requires straywild %s. This room will " + "not be listed until both versions match." ) % required_version @@ -1577,4 +1577,4 @@ func _save_settings() -> void: config.set_value("social", "share_presence", _presence_sharing) var error: Error = config.save(SETTINGS_PATH) if error != OK: - push_warning("Could not save local NETfishing discovery settings.") + push_warning("Could not save local straywild discovery settings.") diff --git a/network/identity_backup_service.gd b/network/identity_backup_service.gd index ff7396c..53cf718 100644 --- a/network/identity_backup_service.gd +++ b/network/identity_backup_service.gd @@ -3,7 +3,7 @@ extends Node signal operation_finished(success: bool, message: String) -const MAGIC := "NETFISHING_IDENTITY_BACKUP" +const MAGIC := "straywild_IDENTITY_BACKUP" const FORMAT_VERSION := 1 const MAX_BACKUP_BYTES := 256 * 1024 const MIN_PASSPHRASE_LENGTH := 12 @@ -189,7 +189,7 @@ func import_backup( ) _finish( bool(result.get("ok", false)), - "Identity imported. Restart NETfishing before multiplayer." + "Identity imported. Restart straywild before multiplayer." if bool(result.get("ok", false)) else "Could not install this identity backup.", ) diff --git a/network/network_identity_crypto.gd b/network/network_identity_crypto.gd index 4886cca..d3f9983 100644 --- a/network/network_identity_crypto.gd +++ b/network/network_identity_crypto.gd @@ -5,7 +5,7 @@ const ALGORITHM: String = "RSA-3072-SHA256" const FINGERPRINT_LENGTH: int = 64 const MAX_PUBLIC_KEY_BYTES: int = 8192 const MAX_SIGNATURE_BYTES: int = 1024 -const DOMAIN_PREFIX: String = "NETFISHING" +const DOMAIN_PREFIX: String = "straywild" const IDENTITY_VERSION: String = "identity_v1" diff --git a/network/network_protocol.gd b/network/network_protocol.gd index 6bbbf9b..20be022 100644 --- a/network/network_protocol.gd +++ b/network/network_protocol.gd @@ -3,7 +3,7 @@ extends RefCounted const WorldLayoutType = preload("res://world/world_layout.gd") -const PROTOCOL_VERSION: int = 10 +const PROTOCOL_VERSION: int = 11 const GAME_BUILD: String = "prealpha" const MAX_GAME_VERSION_LENGTH: int = 64 const MAX_DISPLAY_NAME_LENGTH: int = 24 @@ -304,7 +304,7 @@ static func make_server_hello( assigned_peer_id: int, player_count: int, max_players: int, - server_display_name: String = "NETfishing", + server_display_name: String = "straywild", world_seed: int = DEFAULT_WORLD_SEED, world_layout: StringName = WorldLayoutType.GENERATED, ) -> Dictionary: @@ -372,17 +372,17 @@ static func rejection_text(code: int) -> String: return "You are not permitted to join this server." RejectionCode.CLIENT_OUTDATED: return ( - "Your NETfishing version is out of date. " + "Your straywild version is out of date. " + "Update the game to join this server." ) RejectionCode.SERVER_OUTDATED: return ( "This server is out of date. " - + "The host needs to update NETfishing." + + "The host needs to update straywild." ) RejectionCode.VERSION_MISMATCH: return ( - "This game and server use different NETfishing versions. " + "This game and server use different straywild versions. " + "Update both to the latest release." ) _: diff --git a/network/network_session.gd b/network/network_session.gd index 2711976..8b99fd6 100644 --- a/network/network_session.gd +++ b/network/network_session.gd @@ -160,7 +160,7 @@ var _local_appearance_snapshot: Dictionary = ( ) var _moderation_disconnect_message := "" var _host_port: int = 0 -var _session_display_name: String = "NETfishing Room" +var _session_display_name: String = "straywild Room" var _dedicated_host: bool = false var _configured_operator_fingerprints: Dictionary[String, bool] = {} var _session_operator_fingerprints: Dictionary[String, bool] = {} @@ -432,7 +432,7 @@ func set_peer_operator( func set_session_display_name(value: String) -> void: var cleaned: String = value.strip_edges().left(48) if cleaned.is_empty(): - cleaned = "NETfishing Room" + cleaned = "straywild Room" if cleaned == _session_display_name: return _session_display_name = cleaned @@ -1187,7 +1187,7 @@ func resolve_server_trust(accepted: bool) -> void: if not _server_trust.trust( get_current_endpoint(), str(_pending_server_proof["server_fingerprint"]), - "NETfishing", + "straywild", ): _fail_identity("The server identity could not be pinned.") return diff --git a/network/network_surface_drawing_service.gd b/network/network_surface_drawing_service.gd index 4edc234..c322e5b 100644 --- a/network/network_surface_drawing_service.gd +++ b/network/network_surface_drawing_service.gd @@ -879,7 +879,7 @@ func export_canvas_png(canvas_id: String) -> String: _emit_hud_state("paint something before exporting") return "" if _data_root == null or _data_root.root_path.is_empty(): - _emit_hud_state("choose a NETfishing data folder before exporting") + _emit_hud_state("choose a straywild data folder before exporting") return "" var export_directory: String = _artwork_directory() if DirAccess.make_dir_recursive_absolute(export_directory) != OK: @@ -990,7 +990,7 @@ func _stamp_entry_is_unlocked(entry: Dictionary) -> bool: func _next_artwork_export_path(directory: String) -> String: var date_time: Dictionary = Time.get_datetime_dict_from_system() - var stem: String = "netfishing-artwork-%04d%02d%02d-%02d%02d%02d" % [ + var stem: String = "straywild-artwork-%04d%02d%02d-%02d%02d%02d" % [ int(date_time.get("year", 0)), int(date_time.get("month", 0)), int(date_time.get("day", 0)), diff --git a/network/player_data_root.gd b/network/player_data_root.gd index 9416db3..d6153ff 100644 --- a/network/player_data_root.gd +++ b/network/player_data_root.gd @@ -9,11 +9,11 @@ const BOOTSTRAP_TEMP_PATH := "user://data_root_bootstrap.json.tmp" const BOOTSTRAP_VERSION := 1 const MANIFEST_VERSION := 1 const LAYOUT_VERSION := 1 -const MANIFEST_FILENAME := "netfishing_data.json" +const MANIFEST_FILENAME := "straywild_data.json" const README_FILENAME := "README.txt" -const ENVIRONMENT_VARIABLE := "NETFISHING_DATA_DIR" -const CREATE_ENVIRONMENT_VARIABLE := "NETFISHING_CREATE_DATA_DIR" -const APPLICATION_ID := "netfishing" +const ENVIRONMENT_VARIABLE := "straywild_DATA_DIR" +const CREATE_ENVIRONMENT_VARIABLE := "straywild_CREATE_DATA_DIR" +const APPLICATION_ID := "straywild" const APP_DATA_PORTABLE_PATH := "user://portable-data" const PATH_ALLOWED: StringName = &"allowed" const PATH_SOURCE_PROJECT: StringName = &"source_project" @@ -48,7 +48,7 @@ func resolve() -> bool: mode = Mode.ENVIRONMENT_OVERRIDE var environment_path: String = OS.get_environment(ENVIRONMENT_VARIABLE) if not environment_path.is_absolute_path(): - return _fail("NETFISHING_DATA_DIR must be an absolute path.") + return _fail("straywild_DATA_DIR must be an absolute path.") if ( OS.get_environment(CREATE_ENVIRONMENT_VARIABLE) == "1" and not FileAccess.file_exists( @@ -84,7 +84,7 @@ func default_visible_path() -> String: var documents: String = OS.get_system_dir(OS.SYSTEM_DIR_DOCUMENTS) if documents.is_empty(): return "" - var candidate: String = _normalize(documents.path_join("NETFISHING")) + var candidate: String = _normalize(documents.path_join("straywild")) if not candidate.is_absolute_path(): return "" var classification: StringName = classify_candidate_path( @@ -109,16 +109,16 @@ func select_new_root(path: String, app_data: bool = false) -> bool: if FileAccess.file_exists(manifest_path): var manifest: Dictionary = _read_json(manifest_path) if not _valid_manifest(manifest): - return _fail("The selected folder has a malformed NETfishing manifest.") + return _fail("The selected folder has a malformed straywild manifest.") root_id = str(manifest["root_id"]) else: if not _directory_is_empty(normalized) and not app_data: return _fail( - "Choose an empty folder or an existing NETfishing data folder." + "Choose an empty folder or an existing straywild data folder." ) root_id = Crypto.new().generate_random_bytes(16).hex_encode() if not _create_layout(normalized, root_id): - return _fail("The NETfishing data folder could not be created.") + return _fail("The straywild data folder could not be created.") if not _write_bootstrap(normalized, root_id): return _fail("The data-folder pointer could not be saved.") root_path = normalized @@ -238,15 +238,15 @@ func _activate_existing(path: String, expected_id: String, permit_creation: bool return false var manifest_path: String = normalized.path_join(MANIFEST_FILENAME) if not FileAccess.file_exists(manifest_path): - return _fail("The selected folder is not a NETfishing data folder.") + return _fail("The selected folder is not a straywild data folder.") var manifest: Dictionary = _read_json(manifest_path) if not _valid_manifest(manifest): - return _fail("The NETfishing data-folder manifest is malformed.") + return _fail("The straywild data-folder manifest is malformed.") var found_id: String = str(manifest["root_id"]) if not expected_id.is_empty() and expected_id != found_id: return _fail("The selected data folder does not match this device pointer.") if not _test_writable(normalized): - return _fail("The NETfishing data folder is unavailable or unwritable.") + return _fail("The straywild data folder is unavailable or unwritable.") root_path = normalized root_id = found_id requires_selection = false @@ -339,7 +339,7 @@ static func _is_same_or_child_path(candidate: String, reference: String) -> bool func _test_writable(path: String) -> bool: var probe: String = path.path_join( - ".netfishing-write-%s.tmp" % device_id.left(12) + ".straywild-write-%s.tmp" % device_id.left(12) ) var file: FileAccess = FileAccess.open(probe, FileAccess.WRITE) if file == null: @@ -370,7 +370,7 @@ func _create_layout(path: String, id: String) -> bool: ): return false var readme: String = ( - "NETfishing player data\n\n" + "straywild player data\n\n" + "This folder is safe to synchronize with tools such as Syncthing.\n" + "Active private identity keys remain device-local.\n" + "Encrypted identity backups require their passphrase.\n" diff --git a/network/player_relationship_store.gd b/network/player_relationship_store.gd index 2452315..0f4b6f1 100644 --- a/network/player_relationship_store.gd +++ b/network/player_relationship_store.gd @@ -7,8 +7,8 @@ const FORMAT_VERSION := 2 const MAX_RECORDS := 500 const MAX_FRIENDS := 200 const SOCIAL_TOKEN_LENGTH := 64 -const PRESENCE_CHANNEL_DOMAIN := "NETFISHING_PRESENCE_V1:" -const INVITE_INBOX_DOMAIN := "NETFISHING_INVITE_V1:" +const PRESENCE_CHANNEL_DOMAIN := "straywild_PRESENCE_V1:" +const INVITE_INBOX_DOMAIN := "straywild_INVITE_V1:" var _records: Dictionary = {} var _loaded := false diff --git a/network/portable_data_migration.gd b/network/portable_data_migration.gd index 17ded9f..e95d883 100644 --- a/network/portable_data_migration.gd +++ b/network/portable_data_migration.gd @@ -33,12 +33,12 @@ static func migrate_legacy_to( return { "ok": false, "requires_existing_root_decision": true, - "message": "The selected folder already contains NETfishing data.", + "message": "The selected folder already contains straywild data.", } if not _directory_empty(normalized): return { "ok": false, - "message": "Choose an empty folder or create a NETfishing subfolder.", + "message": "Choose an empty folder or create a straywild subfolder.", } var staging: String = "%s.migration-%s" % [ normalized, Crypto.new().generate_random_bytes(8).hex_encode() @@ -111,11 +111,11 @@ static func migrate_active_to( "ok": false, "requires_existing_root_decision": true, "message": ( - "The selected folder already contains NETfishing data. " + "The selected folder already contains straywild data. " + "Choose it through the existing-data recovery flow." ), } - return {"ok": false, "message": "Choose an empty folder or a NETfishing subfolder."} + return {"ok": false, "message": "Choose an empty folder or a straywild subfolder."} var staging: String = "%s.migration-%s" % [ normalized, Crypto.new().generate_random_bytes(8).hex_encode() ] @@ -209,7 +209,7 @@ static func replace_existing_with_legacy( var normalized: String = destination.simplify_path().trim_suffix("/") var manifest: String = normalized.path_join(PlayerDataRoot.MANIFEST_FILENAME) if not FileAccess.file_exists(manifest): - return {"ok": false, "message": "The selected folder is not a NETfishing data root."} + return {"ok": false, "message": "The selected folder is not a straywild data root."} var recovery: String = ProjectSettings.globalize_path( "user://migration-recovery" ).path_join( @@ -230,7 +230,7 @@ static func replace_existing_with_active( ) -> Dictionary: var normalized: String = destination.simplify_path().trim_suffix("/") if not FileAccess.file_exists(normalized.path_join(PlayerDataRoot.MANIFEST_FILENAME)): - return {"ok": false, "message": "The selected folder is not a NETfishing data root."} + return {"ok": false, "message": "The selected folder is not a straywild data root."} var recovery: String = ProjectSettings.globalize_path( "user://migration-recovery" ).path_join( diff --git a/player/player.tscn b/player/player.tscn index 4a2d897..3288d2d 100644 --- a/player/player.tscn +++ b/player/player.tscn @@ -12,7 +12,7 @@ [ext_resource type="Script" path="res://progression/player_cooler_capacity.gd" id="10_capacity"] [ext_resource type="Script" path="res://player/player_ground_shadow.gd" id="11_ground_shadow"] [ext_resource type="Material" path="res://player/materials/player_blob_shadow.tres" id="12_blob_shadow"] -[ext_resource type="PackedScene" path="res://art/exported/characters/base/netfishing_base_character.glb" id="13_character"] +[ext_resource type="PackedScene" path="res://art/exported/characters/base/straywild_base_character.glb" id="13_character"] [ext_resource type="Script" path="res://progression/player_art_unlocks.gd" id="14_art_unlocks"] [ext_resource type="Script" path="res://progression/player_experience.gd" id="15_experience"] [ext_resource type="Script" path="res://player/sprint_dust_trail.gd" id="16_sprint_dust"] diff --git a/player/player_visual_presenter.gd b/player/player_visual_presenter.gd index 745fc3c..b071b2c 100644 --- a/player/player_visual_presenter.gd +++ b/player/player_visual_presenter.gd @@ -3,9 +3,9 @@ extends RefCounted const PlayerScene: PackedScene = preload("res://player/player.tscn") const FurPatternShader: Shader = preload("res://player/fur_pattern.gdshader") -const RUNTIME_MATERIAL_META: StringName = &"netfishing_runtime_material" +const RUNTIME_MATERIAL_META: StringName = &"straywild_runtime_material" const RUNTIME_FUR_PATTERN_MATERIAL_META: StringName = ( - &"netfishing_runtime_fur_pattern_material" + &"straywild_runtime_fur_pattern_material" ) const EAR_MESH_NAMES: Array[String] = [ "ears_antlers_round", diff --git a/project.godot b/project.godot index 054e584..db06b66 100644 --- a/project.godot +++ b/project.godot @@ -10,11 +10,11 @@ config_version=5 [application] -config/name="NETFISHING" +config/name="straywild" config/version="0.18.1-alpha" run/main_scene="res://main/main.tscn" config/features=PackedStringArray("4.7", "GL Compatibility") -config/icon="res://art/exported/system_icons/netfishing_256.png" +config/icon="res://art/exported/system_icons/straywild_256.png" [autoload] @@ -26,7 +26,7 @@ window/stretch/aspect="expand" [editor_plugins] -enabled=PackedStringArray("res://addons/netfishing_shoreline_baker/plugin.cfg") +enabled=PackedStringArray("res://addons/straywild_shoreline_baker/plugin.cfg") [gui] @@ -260,7 +260,7 @@ alternate_fishing={ [network] -discovery/base_url="https://discovery.netfishing.org" +discovery/base_url="https://discovery.straywild.io" [physics] diff --git a/save/progression_save_codec.gd b/save/progression_save_codec.gd index 7844e16..a006773 100644 --- a/save/progression_save_codec.gd +++ b/save/progression_save_codec.gd @@ -1,7 +1,7 @@ class_name ProgressionSaveCodec extends RefCounted -const MAGIC := "NETFISHING_PROGRESSION_CONTAINER" +const MAGIC := "straywild_PROGRESSION_CONTAINER" const FORMAT_VERSION := 1 const LOCAL_KIND := "local_save" const ARCHIVE_KIND := "portable_archive" @@ -10,7 +10,7 @@ const MAX_CONTAINER_BYTES := 16 * 1024 * 1024 # This key keeps routine progression files opaque to casual editing. Since the # client is open source, it is intentionally not treated as a security secret. const CONTAINER_PASSPHRASE := ( - "NETfishing progression container v1 / not an identity credential" + "straywild progression container v1 / not an identity credential" ) diff --git a/scripts/build_android_debug.sh b/scripts/build_android_debug.sh index 8f856f8..f68eb32 100755 --- a/scripts/build_android_debug.sh +++ b/scripts/build_android_debug.sh @@ -4,7 +4,7 @@ set -euo pipefail readonly SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" readonly PROJECT_ROOT="$(cd -- "${SCRIPT_DIR}/.." && pwd)" -readonly OUTPUT_PATH="${PROJECT_ROOT}/builds/android/NETfishing-debug.apk" +readonly OUTPUT_PATH="${PROJECT_ROOT}/builds/android/straywild-debug.apk" readonly GODOT_BIN="${GODOT_BIN:-godot}" mkdir -p -- "$(dirname -- "${OUTPUT_PATH}")" diff --git a/scripts/build_playtest.sh b/scripts/build_playtest.sh index 1aa067c..c18f277 100755 --- a/scripts/build_playtest.sh +++ b/scripts/build_playtest.sh @@ -9,9 +9,9 @@ readonly WINDOWS_DIR="${BUILD_ROOT}/windows-x86_64" readonly LINUX_DIR="${BUILD_ROOT}/linux-x86_64" readonly README_SOURCE="${PROJECT_ROOT}/docs/README-PLAYTEST.txt" readonly SOURCE_COMMIT="$(git -C "${PROJECT_ROOT}" rev-parse HEAD)" -readonly SOURCE_URL="https://forge.makearmy.io/woofmeow/netfishing" -readonly WINDOWS_ZIP="${BUILD_ROOT}/NETfishing-v0.18.1-alpha-windows-x86_64.zip" -readonly LINUX_ZIP="${BUILD_ROOT}/NETfishing-v0.18.1-alpha-linux-x86_64.zip" +readonly SOURCE_URL="https://forge.makearmy.io/woofmeow/straywild" +readonly WINDOWS_ZIP="${BUILD_ROOT}/straywild-v0.18.1-alpha-windows-x86_64.zip" +readonly LINUX_ZIP="${BUILD_ROOT}/straywild-v0.18.1-alpha-linux-x86_64.zip" readonly GODOT_BIN="${GODOT_BIN:-godot}" if [[ ! -f "${PROJECT_ROOT}/project.godot" ]]; then @@ -31,26 +31,26 @@ mkdir -p -- "${WINDOWS_DIR}" "${LINUX_DIR}" --headless \ --path "${PROJECT_ROOT}" \ --export-release "Windows Desktop" \ - "${WINDOWS_DIR}/NETfishing.exe" + "${WINDOWS_DIR}/straywild.exe" "${GODOT_BIN}" \ --headless \ --path "${PROJECT_ROOT}" \ --export-release "Linux Desktop" \ - "${LINUX_DIR}/NETfishing.x86_64" + "${LINUX_DIR}/straywild.x86_64" for required_file in \ - "${WINDOWS_DIR}/NETfishing.exe" \ - "${WINDOWS_DIR}/NETfishing.pck" \ - "${LINUX_DIR}/NETfishing.x86_64" \ - "${LINUX_DIR}/NETfishing.pck"; do + "${WINDOWS_DIR}/straywild.exe" \ + "${WINDOWS_DIR}/straywild.pck" \ + "${LINUX_DIR}/straywild.x86_64" \ + "${LINUX_DIR}/straywild.pck"; do if [[ ! -s "${required_file}" ]]; then echo "error: expected export output is missing: ${required_file}" >&2 exit 1 fi done -chmod +x -- "${LINUX_DIR}/NETfishing.x86_64" +chmod +x -- "${LINUX_DIR}/straywild.x86_64" cp -- "${README_SOURCE}" "${WINDOWS_DIR}/README-PLAYTEST.txt" cp -- "${README_SOURCE}" "${LINUX_DIR}/README-PLAYTEST.txt" @@ -60,7 +60,7 @@ stage_licenses() { install -m 0644 "${PROJECT_ROOT}/LICENSE" \ "${destination}/GPL-3.0-or-later.txt" install -m 0644 "${PROJECT_ROOT}/ASSET-LICENSE.md" \ - "${destination}/NETFISHING-ASSET-LICENSE.md" + "${destination}/straywild-ASSET-LICENSE.md" install -m 0644 "${PROJECT_ROOT}/docs/ATTRIBUTION.md" \ "${destination}/ATTRIBUTION.md" install -m 0644 "${PROJECT_ROOT}/TRADEMARKS.md" \ @@ -72,7 +72,7 @@ stage_licenses() { cat >"${destination}/SOURCE-CODE.md" <&2 exit 1 fi -if [[ "${NETFISHING_ALLOW_DIRTY_RELEASE:-0}" != "1" ]]; then +if [[ "${straywild_ALLOW_DIRTY_RELEASE:-0}" != "1" ]]; then dirty_tree=0 git -C "${PROJECT_ROOT}" diff --quiet || dirty_tree=1 git -C "${PROJECT_ROOT}" diff --cached --quiet || dirty_tree=1 @@ -97,7 +97,7 @@ done mkdir -p -- "${ARM64_ROOT}" "${RELEASE_ROOT}" if [[ ${PACKAGE_ONLY} -eq 0 ]]; then readonly EXPORT_PROJECT_ROOT="$( - mktemp -d -t netfishing-portmaster-export.XXXXXX + mktemp -d -t straywild-portmaster-export.XXXXXX )" cleanup_export_project() { rm -rf -- "${EXPORT_PROJECT_ROOT}" @@ -108,9 +108,9 @@ if [[ ${PACKAGE_ONLY} -eq 0 ]]; then --exclude '/.git/' \ --exclude '/.godot/' \ --exclude '/art/source/' \ - --exclude '/art/exported/system_icons/netfishing.ico' \ - --exclude '/art/exported/system_icons/netfishing_1024.png' \ - --exclude '/art/exported/system_icons/netfishing_1024.png.import' \ + --exclude '/art/exported/system_icons/straywild.ico' \ + --exclude '/art/exported/system_icons/straywild_1024.png' \ + --exclude '/art/exported/system_icons/straywild_1024.png.import' \ --exclude '/audio/ambience/' \ --exclude '/builds/' \ --exclude '/docs/design/' \ @@ -141,14 +141,14 @@ rm -f -- \ "${OBSOLETE_LOWERCASE_ARCHIVE}" mkdir -p -- "${GAME_ROOT}/licenses" -install -m 0755 "${TEMPLATE_ROOT}/NETfishing.sh" "${STAGE_ROOT}/NETfishing.sh" +install -m 0755 "${TEMPLATE_ROOT}/straywild.sh" "${STAGE_ROOT}/straywild.sh" install -m 0644 "${TEMPLATE_ROOT}/port.json" "${GAME_ROOT}/port.json" -install -m 0644 "${TEMPLATE_ROOT}/netfishing.gptk" \ - "${GAME_ROOT}/netfishing.gptk" -install -m 0755 "${TEMPLATE_ROOT}/launch-netfishing.sh" \ - "${GAME_ROOT}/launch-netfishing.sh" -install -m 0755 "${ARM64_EXECUTABLE}" "${GAME_ROOT}/NETfishing.aarch64" -install -m 0644 "${ARM64_PCK}" "${GAME_ROOT}/NETfishing.pck" +install -m 0644 "${TEMPLATE_ROOT}/straywild.gptk" \ + "${GAME_ROOT}/straywild.gptk" +install -m 0755 "${TEMPLATE_ROOT}/launch-straywild.sh" \ + "${GAME_ROOT}/launch-straywild.sh" +install -m 0755 "${ARM64_EXECUTABLE}" "${GAME_ROOT}/straywild.aarch64" +install -m 0644 "${ARM64_PCK}" "${GAME_ROOT}/straywild.pck" install -m 0644 "${TEMPLATE_ROOT}/gameinfo.xml" "${GAME_ROOT}/gameinfo.xml" install -m 0644 "${TEMPLATE_ROOT}/screenshot.png" "${GAME_ROOT}/screenshot.png" install -m 0644 \ @@ -159,7 +159,7 @@ install -m 0644 \ "${GAME_ROOT}/licenses/GPL-3.0-or-later.txt" install -m 0644 \ "${PROJECT_ROOT}/ASSET-LICENSE.md" \ - "${GAME_ROOT}/licenses/NETFISHING-ASSET-LICENSE.md" + "${GAME_ROOT}/licenses/straywild-ASSET-LICENSE.md" install -m 0644 \ "${PROJECT_ROOT}/TRADEMARKS.md" \ "${GAME_ROOT}/licenses/TRADEMARKS.md" @@ -171,7 +171,7 @@ install -m 0644 \ "${GAME_ROOT}/licenses/Seattle-Avenue-LICENSE.txt" cat >"${GAME_ROOT}/BUILD-INFO.txt" <"${GAME_ROOT}/licenses/SOURCE-CODE.md" <"${GAME_ROOT}/README.md" </dev/null readonly TOP_LEVELS="$( unzip -Z1 "${ARCHIVE}" | cut -d/ -f1 | sort -u )" -readonly EXPECTED_TOP_LEVELS="$(printf '%s\n' NETfishing.sh netfishing)" +readonly EXPECTED_TOP_LEVELS="$(printf '%s\n' straywild.sh straywild)" if [[ "${TOP_LEVELS}" != "${EXPECTED_TOP_LEVELS}" ]]; then echo "Unexpected PortMaster archive roots:" >&2 printf '%s\n' "${TOP_LEVELS}" >&2 exit 1 fi grep -q '"version": 4' "${GAME_ROOT}/port.json" -grep -q '"name": "netfishing.zip"' "${GAME_ROOT}/port.json" +grep -q '"name": "straywild.zip"' "${GAME_ROOT}/port.json" grep -q '"rtr": true' "${GAME_ROOT}/port.json" if unzip -Z1 "${ARCHIVE}" | grep -qx 'port.json'; then - echo "port.json must be inside netfishing/, not at the archive root." >&2 + echo "port.json must be inside straywild/, not at the archive root." >&2 exit 1 fi if grep -Eq '^[[:space:]]*#[[:space:]]*PORTMASTER:' \ - "${STAGE_ROOT}/NETfishing.sh"; then + "${STAGE_ROOT}/straywild.sh"; then echo "The distributable launcher contains an installed PortMaster signature." >&2 exit 1 fi grep -Fq 'PROFILE_PATH="$CONFDIR/performance_profile"' \ - "${STAGE_ROOT}/NETfishing.sh" -grep -Fq 'NETFISHING_PERFORMANCE_PROFILE=light' \ - "${STAGE_ROOT}/NETfishing.sh" + "${STAGE_ROOT}/straywild.sh" +grep -Fq 'straywild_PERFORMANCE_PROFILE=light' \ + "${STAGE_ROOT}/straywild.sh" grep -Fq 'CONTROLLER_MAPPING_FILE="$CONFDIR/cache/controller_mapping.txt"' \ - "${STAGE_ROOT}/NETfishing.sh" -grep -Fq 'SAVEDIR="$PORTS_ROOT/saves/netfishing"' \ - "${STAGE_ROOT}/NETfishing.sh" -grep -Fq '"NETFISHING_DATA_DIR=$SAVEDIR"' \ - "${STAGE_ROOT}/NETfishing.sh" -grep -Fq '"NETFISHING_CREATE_DATA_DIR=1"' \ - "${STAGE_ROOT}/NETfishing.sh" -grep -Fq 'printf '\''%s\n'\'' "$netfishing_controllerconfig" > "$CONTROLLER_MAPPING_FILE"' \ - "${STAGE_ROOT}/NETfishing.sh" -grep -Fq '"$GAME_LAUNCHER"' "${STAGE_ROOT}/NETfishing.sh" -grep -Fq '"$CONTROLLER_MAPPING_FILE"' "${STAGE_ROOT}/NETfishing.sh" -if grep -Fq 'SDL_GAMECONTROLLERCONFIG="$netfishing_controllerconfig"' \ - "${STAGE_ROOT}/NETfishing.sh"; then + "${STAGE_ROOT}/straywild.sh" +grep -Fq 'SAVEDIR="$PORTS_ROOT/saves/straywild"' \ + "${STAGE_ROOT}/straywild.sh" +grep -Fq '"straywild_DATA_DIR=$SAVEDIR"' \ + "${STAGE_ROOT}/straywild.sh" +grep -Fq '"straywild_CREATE_DATA_DIR=1"' \ + "${STAGE_ROOT}/straywild.sh" +grep -Fq 'printf '\''%s\n'\'' "$straywild_controllerconfig" > "$CONTROLLER_MAPPING_FILE"' \ + "${STAGE_ROOT}/straywild.sh" +grep -Fq '"$GAME_LAUNCHER"' "${STAGE_ROOT}/straywild.sh" +grep -Fq '"$CONTROLLER_MAPPING_FILE"' "${STAGE_ROOT}/straywild.sh" +if grep -Fq 'SDL_GAMECONTROLLERCONFIG="$straywild_controllerconfig"' \ + "${STAGE_ROOT}/straywild.sh"; then echo "Raw controller mappings must not be passed through westonwrap.sh." >&2 exit 1 fi grep -Fq 'SDL_GAMECONTROLLERCONFIG="$(<"$CONTROLLER_MAPPING_FILE")"' \ - "${GAME_ROOT}/launch-netfishing.sh" + "${GAME_ROOT}/launch-straywild.sh" grep -Fq 'export SDL_GAMECONTROLLERCONFIG' \ - "${GAME_ROOT}/launch-netfishing.sh" -grep -Fq 'exec "$@"' "${GAME_ROOT}/launch-netfishing.sh" -grep -Fq 'GPTOKEYB_CONFIG="$GAMEDIR/netfishing.gptk"' \ - "${STAGE_ROOT}/NETfishing.sh" -grep -Fq '$GPTOKEYB "NETfishing.aarch64" -c "$GPTOKEYB_CONFIG" &' \ - "${STAGE_ROOT}/NETfishing.sh" + "${GAME_ROOT}/launch-straywild.sh" +grep -Fq 'exec "$@"' "${GAME_ROOT}/launch-straywild.sh" +grep -Fq 'GPTOKEYB_CONFIG="$GAMEDIR/straywild.gptk"' \ + "${STAGE_ROOT}/straywild.sh" +grep -Fq '$GPTOKEYB "straywild.aarch64" -c "$GPTOKEYB_CONFIG" &' \ + "${STAGE_ROOT}/straywild.sh" grep -Fq 'pm_platform_helper "$GAME_EXECUTABLE"' \ - "${STAGE_ROOT}/NETfishing.sh" -grep -Fq 'pm_finish' "${STAGE_ROOT}/NETfishing.sh" + "${STAGE_ROOT}/straywild.sh" +grep -Fq 'pm_finish' "${STAGE_ROOT}/straywild.sh" if [[ "$(grep -Ec '^[[:space:]]*\$GPTOKEYB[[:space:]]' \ - "${STAGE_ROOT}/NETfishing.sh")" -ne 1 ]]; then - echo "NETfishing must start exactly one GPTOKEYB exit handler." >&2 + "${STAGE_ROOT}/straywild.sh")" -ne 1 ]]; then + echo "straywild must start exactly one GPTOKEYB exit handler." >&2 exit 1 fi readonly GPTOKEYB_NOOP_KEYS=( @@ -303,13 +303,13 @@ readonly GPTOKEYB_NOOP_KEYS=( for noop_key in "${GPTOKEYB_NOOP_KEYS[@]}"; do if ! grep -Eq \ "^[[:space:]]*${noop_key}[[:space:]]*=[[:space:]]*\\\\\"[[:space:]]*$" \ - "${GAME_ROOT}/netfishing.gptk"; then + "${GAME_ROOT}/straywild.gptk"; then echo "GPTOKEYB no-op mapping is missing: ${noop_key}" >&2 exit 1 fi done if [[ "$(grep -Ec '^[[:space:]]*[a-z0-9_]+[[:space:]]*=' \ - "${GAME_ROOT}/netfishing.gptk")" -ne "${#GPTOKEYB_NOOP_KEYS[@]}" ]]; then + "${GAME_ROOT}/straywild.gptk")" -ne "${#GPTOKEYB_NOOP_KEYS[@]}" ]]; then echo "GPTOKEYB no-op mapping contains an unexpected assignment." >&2 exit 1 fi diff --git a/scripts/import_animalese_voice.sh b/scripts/import_animalese_voice.sh index cb7eded..b9076ca 100755 --- a/scripts/import_animalese_voice.sh +++ b/scripts/import_animalese_voice.sh @@ -35,10 +35,10 @@ if [[ ! "$SAMPLE_SET_DIRECTORY" =~ ^[a-z0-9_-]+$ ]]; then fi readonly DESTINATION_DIRECTORY="$PROJECT_ROOT/sound/dialogue/animalese/$SAMPLE_SET_DIRECTORY" -readonly WORK_DIRECTORY="$(mktemp -d -t netfishing-animalese-import.XXXXXX)" +readonly WORK_DIRECTORY="$(mktemp -d -t straywild-animalese-import.XXXXXX)" cleanup() { - if [[ "$WORK_DIRECTORY" == /tmp/netfishing-animalese-import.* ]]; then + if [[ "$WORK_DIRECTORY" == /tmp/straywild-animalese-import.* ]]; then find "$WORK_DIRECTORY" -depth -delete fi } diff --git a/scripts/normalize_texture_profiles.sh b/scripts/normalize_texture_profiles.sh index 1483a61..0551efd 100755 --- a/scripts/normalize_texture_profiles.sh +++ b/scripts/normalize_texture_profiles.sh @@ -13,7 +13,7 @@ fi readonly ROOT_PATH="$1" -readonly WORK_ROOT="$(mktemp -d -t netfishing-godot-data.XXXXXX)" +readonly WORK_ROOT="$(mktemp -d -t straywild-godot-data.XXXXXX)" trap 'rm -rf -- "${WORK_ROOT}"' EXIT cd "${PROJECT_ROOT}" diff --git a/scripts/portmaster/gameinfo.xml b/scripts/portmaster/gameinfo.xml index ef608bd..1b0a1c7 100755 --- a/scripts/portmaster/gameinfo.xml +++ b/scripts/portmaster/gameinfo.xml @@ -1,13 +1,13 @@ - ./NETfishing.sh - NETfishing + ./straywild.sh + straywild A relaxed multiplayer fishing game about exploring a small island, catching and collecting fish, customizing your character, and spending time by the water. 20260804T000000 - NETfishing project + straywild project Independent adventure, simulation - ./netfishing/screenshot.png + ./straywild/screenshot.png diff --git a/scripts/portmaster/launch-netfishing.sh b/scripts/portmaster/launch-straywild.sh similarity index 100% rename from scripts/portmaster/launch-netfishing.sh rename to scripts/portmaster/launch-straywild.sh diff --git a/scripts/portmaster/port.json b/scripts/portmaster/port.json index affc601..4c36648 100644 --- a/scripts/portmaster/port.json +++ b/scripts/portmaster/port.json @@ -1,13 +1,13 @@ { "version": 4, - "name": "netfishing.zip", + "name": "straywild.zip", "items": [ - "NETfishing.sh", - "netfishing/" + "straywild.sh", + "straywild/" ], "items_opt": null, "attr": { - "title": "NETfishing", + "title": "straywild", "porter": [ "Voyager" ], diff --git a/scripts/portmaster/netfishing.gptk b/scripts/portmaster/straywild.gptk similarity index 87% rename from scripts/portmaster/netfishing.gptk rename to scripts/portmaster/straywild.gptk index ff1ad36..2e8602e 100644 --- a/scripts/portmaster/netfishing.gptk +++ b/scripts/portmaster/straywild.gptk @@ -1,4 +1,4 @@ -# NETfishing reads the controller directly. GPTOKEYB is retained only for its +# straywild reads the controller directly. GPTOKEYB is retained only for its # device-specific force-quit chord, so every keyboard and mouse binding is # disabled to prevent duplicate input. diff --git a/scripts/portmaster/NETfishing.sh b/scripts/portmaster/straywild.sh similarity index 70% rename from scripts/portmaster/NETfishing.sh rename to scripts/portmaster/straywild.sh index 8e118da..58e17b3 100755 --- a/scripts/portmaster/NETfishing.sh +++ b/scripts/portmaster/straywild.sh @@ -16,35 +16,35 @@ source "$controlfolder/control.txt" [ -f "${controlfolder}/mod_${CFW_NAME}.txt" ] && source "${controlfolder}/mod_${CFW_NAME}.txt" get_controls -GAMEDIR="/${directory}/ports/netfishing" +GAMEDIR="/${directory}/ports/straywild" CONFDIR="$GAMEDIR/conf" -PORTS_ROOT="${GAMEDIR%/netfishing}" -SAVEDIR="$PORTS_ROOT/saves/netfishing" -DATA_BOOTSTRAP_DIR="$CONFDIR/data/godot/app_userdata/NETFISHING" -GAME_EXECUTABLE="$GAMEDIR/NETfishing.aarch64" -GAME_LAUNCHER="$GAMEDIR/launch-netfishing.sh" -GPTOKEYB_CONFIG="$GAMEDIR/netfishing.gptk" +PORTS_ROOT="${GAMEDIR%/straywild}" +SAVEDIR="$PORTS_ROOT/saves/straywild" +DATA_BOOTSTRAP_DIR="$CONFDIR/data/godot/app_userdata/straywild" +GAME_EXECUTABLE="$GAMEDIR/straywild.aarch64" +GAME_LAUNCHER="$GAMEDIR/launch-straywild.sh" +GPTOKEYB_CONFIG="$GAMEDIR/straywild.gptk" CONTROLLER_MAPPING_FILE="$CONFDIR/cache/controller_mapping.txt" -WESTON_DIR="/tmp/netfishing-weston" +WESTON_DIR="/tmp/straywild-weston" WESTON_RUNTIME="weston_pkg_0.2" HARBOURMASTER="$controlfolder/harbourmaster" mkdir -p "$CONFDIR/data" "$CONFDIR/config" "$CONFDIR/cache" "$WESTON_DIR" chmod +x "$GAME_EXECUTABLE" -# NETfishing uses a predictable save directory beside the port instead of +# straywild uses a predictable save directory beside the port instead of # presenting a folder picker on a small screen. Preserve an established # data-root choice when upgrading an existing installation. -NETFISHING_DATA_ENVIRONMENT=() -if [ -f "$SAVEDIR/netfishing_data.json" ] || { +straywild_DATA_ENVIRONMENT=() +if [ -f "$SAVEDIR/straywild_data.json" ] || { [ ! -f "$DATA_BOOTSTRAP_DIR/data_root_bootstrap.json" ] && [ ! -f "$DATA_BOOTSTRAP_DIR/data_root_bootstrap.json.backup" ] }; then mkdir -p "$SAVEDIR" - NETFISHING_DATA_ENVIRONMENT+=( - "NETFISHING_DATA_DIR=$SAVEDIR" - "NETFISHING_CREATE_DATA_DIR=1" + straywild_DATA_ENVIRONMENT+=( + "straywild_DATA_DIR=$SAVEDIR" + "straywild_CREATE_DATA_DIR=1" ) fi @@ -52,7 +52,7 @@ fi if [ ! -f "$controlfolder/libs/${WESTON_RUNTIME}.squashfs" ]; then if [ ! -x "$HARBOURMASTER" ]; then - pm_message "NETfishing requires the latest PortMaster and WestonPack runtime." + pm_message "straywild requires the latest PortMaster and WestonPack runtime." sleep 5 exit 1 fi @@ -78,17 +78,17 @@ cd "$GAMEDIR" || exit 1 GODOT_MUOS_MAPPING="19004ca6010000000100000000010000,muOS-Keys,a:b0,b:b1,x:b3,y:b2,leftshoulder:b4,rightshoulder:b5,lefttrigger:b10,righttrigger:b11,guide:b8,start:b7,back:b6,dpup:h0.1,dpleft:h0.8,dpright:h0.2,dpdown:h0.4,leftx:a0,lefty:a1,leftstick:b9,rightx:a2,righty:a3,rightstick:b12,platform:Linux," MUOS_SDL2_GUID="19000000010000000100000000010000" if [[ "$sdl_controllerconfig" == "${MUOS_SDL2_GUID},"* ]]; then - netfishing_controllerconfig="$GODOT_MUOS_MAPPING" + straywild_controllerconfig="$GODOT_MUOS_MAPPING" elif [ -n "$sdl_controllerconfig" ]; then - netfishing_controllerconfig="$sdl_controllerconfig" + straywild_controllerconfig="$sdl_controllerconfig" else - netfishing_controllerconfig="$GODOT_MUOS_MAPPING" + straywild_controllerconfig="$GODOT_MUOS_MAPPING" fi -printf '%s\n' "$netfishing_controllerconfig" > "$CONTROLLER_MAPPING_FILE" +printf '%s\n' "$straywild_controllerconfig" > "$CONTROLLER_MAPPING_FILE" -NETFISHING_GODOT_OPTIONS=() -NETFISHING_GAME_ENVIRONMENT=() -PERFORMANCE_PROFILE="${NETFISHING_PERFORMANCE_PROFILE:-}" +straywild_GODOT_OPTIONS=() +straywild_GAME_ENVIRONMENT=() +PERFORMANCE_PROFILE="${straywild_PERFORMANCE_PROFILE:-}" PROFILE_PATH="$CONFDIR/performance_profile" if [[ -z "$PERFORMANCE_PROFILE" && -r "$PROFILE_PATH" ]]; then IFS= read -r PERFORMANCE_PROFILE < "$PROFILE_PATH" || true @@ -96,16 +96,16 @@ if [[ -z "$PERFORMANCE_PROFILE" && -r "$PROFILE_PATH" ]]; then fi case "$PERFORMANCE_PROFILE" in normal) - NETFISHING_GAME_ENVIRONMENT+=( - "NETFISHING_PERFORMANCE_PROFILE=normal" + straywild_GAME_ENVIRONMENT+=( + "straywild_PERFORMANCE_PROFILE=normal" ) ;; light|"") - NETFISHING_GAME_ENVIRONMENT+=( - "NETFISHING_PERFORMANCE_PROFILE=light" - "NETFISHING_LOW_END=1" + straywild_GAME_ENVIRONMENT+=( + "straywild_PERFORMANCE_PROFILE=light" + "straywild_LOW_END=1" ) - NETFISHING_GODOT_OPTIONS+=( + straywild_GODOT_OPTIONS+=( --single-window --disable-vsync --max-fps 30 @@ -114,11 +114,11 @@ case "$PERFORMANCE_PROFILE" in ;; *) echo "Unknown performance profile '$PERFORMANCE_PROFILE'; using light." >&2 - NETFISHING_GAME_ENVIRONMENT+=( - "NETFISHING_PERFORMANCE_PROFILE=light" - "NETFISHING_LOW_END=1" + straywild_GAME_ENVIRONMENT+=( + "straywild_PERFORMANCE_PROFILE=light" + "straywild_LOW_END=1" ) - NETFISHING_GODOT_OPTIONS+=( + straywild_GODOT_OPTIONS+=( --single-window --disable-vsync --max-fps 30 @@ -127,10 +127,10 @@ case "$PERFORMANCE_PROFILE" in ;; esac -# NETfishing reads gameplay input natively. The explicit no-op map prevents +# straywild reads gameplay input natively. The explicit no-op map prevents # GPTOKEYB from injecting duplicate keyboard or mouse input while retaining # its device-specific force-quit chord, including on ROCKNIX. -$GPTOKEYB "NETfishing.aarch64" -c "$GPTOKEYB_CONFIG" & +$GPTOKEYB "straywild.aarch64" -c "$GPTOKEYB_CONFIG" & pm_platform_helper "$GAME_EXECUTABLE" $ESUDO env CRUSTY_RESOLUTION="${DISPLAY_WIDTH}x${DISPLAY_HEIGHT}" \ @@ -139,12 +139,12 @@ $ESUDO env CRUSTY_RESOLUTION="${DISPLAY_WIDTH}x${DISPLAY_HEIGHT}" \ XDG_CONFIG_HOME="$CONFDIR/config" \ XDG_CACHE_HOME="$CONFDIR/cache" \ GODOT_SILENCE_ROOT_WARNING=1 \ - "${NETFISHING_DATA_ENVIRONMENT[@]}" \ - "${NETFISHING_GAME_ENVIRONMENT[@]}" \ + "${straywild_DATA_ENVIRONMENT[@]}" \ + "${straywild_GAME_ENVIRONMENT[@]}" \ "$GAME_LAUNCHER" \ "$CONTROLLER_MAPPING_FILE" \ "$GAME_EXECUTABLE" \ - "${NETFISHING_GODOT_OPTIONS[@]}" \ + "${straywild_GODOT_OPTIONS[@]}" \ --resolution "${DISPLAY_WIDTH}x${DISPLAY_HEIGHT}" \ --fullscreen \ --rendering-driver opengl3_es \ diff --git a/scripts/run_validations.sh b/scripts/run_validations.sh index 2ebaeff..5d15b8e 100755 --- a/scripts/run_validations.sh +++ b/scripts/run_validations.sh @@ -6,9 +6,9 @@ readonly SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" readonly PROJECT_ROOT="$(cd -- "${SCRIPT_DIR}/.." && pwd)" readonly GODOT_BIN="${GODOT_BIN:-godot}" readonly TEST_TIMEOUT_SECONDS="${TEST_TIMEOUT_SECONDS:-120}" -readonly RUN_ROOT="$(mktemp -d -t netfishing-validations.XXXXXX)" +readonly RUN_ROOT="$(mktemp -d -t straywild-validations.XXXXXX)" -export NETFISHING_ISOLATED_VALIDATION_STORAGE=1 +export straywild_ISOLATED_VALIDATION_STORAGE=1 readonly -a QUICK_TESTS=( "scripts/validate_animalese_samples.gd" diff --git a/scripts/setup_android_build.sh b/scripts/setup_android_build.sh index c1cebdc..bc96083 100755 --- a/scripts/setup_android_build.sh +++ b/scripts/setup_android_build.sh @@ -336,8 +336,8 @@ check_editor_settings() { run_export_hint() { echo echo "Example export commands:" - echo " ${GODOT} --headless --path \"$PROJECT_ROOT\" --export-release \"Android\" builds/${PROJECT_VERSION}/android/NETfishing.apk" - echo " ${GODOT} --headless --path \"$PROJECT_ROOT\" --export-debug \"Android\" builds/android/NETfishing-debug.apk" + echo " ${GODOT} --headless --path \"$PROJECT_ROOT\" --export-release \"Android\" builds/${PROJECT_VERSION}/android/straywild.apk" + echo " ${GODOT} --headless --path \"$PROJECT_ROOT\" --export-debug \"Android\" builds/android/straywild-debug.apk" } print_status INFO "Starting Android dependency preflight..." diff --git a/scripts/test_player_data_root_paths.gd b/scripts/test_player_data_root_paths.gd index 69a2485..f357b9a 100644 --- a/scripts/test_player_data_root_paths.gd +++ b/scripts/test_player_data_root_paths.gd @@ -1,36 +1,36 @@ extends SceneTree -const PROJECT_PATH := "/tmp/netfishing" -const INSTALL_PATH := "/opt/NETfishing" +const PROJECT_PATH := "/tmp/straywild" +const INSTALL_PATH := "/opt/straywild" func _initialize() -> void: - var root_to_create: String = OS.get_environment("NETFISHING_TEST_CREATE_ROOT") + var root_to_create: String = OS.get_environment("straywild_TEST_CREATE_ROOT") if not root_to_create.is_empty(): _create_validation_root(root_to_create) return var failures: PackedStringArray = [] _expect( "external temporary directory", - "/tmp/NETfishing-test-data", + "/tmp/straywild-test-data", PlayerDataRoot.PATH_ALLOWED, failures, ) _expect( "external trailing slash", - "/tmp/NETfishing-test-data/", + "/tmp/straywild-test-data/", PlayerDataRoot.PATH_ALLOWED, failures, ) _expect( "similar project-name sibling", - "/tmp/netfishing-data", + "/tmp/straywild-data", PlayerDataRoot.PATH_ALLOWED, failures, ) _expect( "documents directory", - "/home/player/Documents/NETfishing", + "/home/player/Documents/straywild", PlayerDataRoot.PATH_ALLOWED, failures, ) @@ -55,7 +55,7 @@ func _initialize() -> void: ) _expect_with_references( "empty project reference", - "/tmp/NETfishing-test-data", + "/tmp/straywild-test-data", "", INSTALL_PATH, PlayerDataRoot.PATH_ALLOWED, @@ -63,7 +63,7 @@ func _initialize() -> void: ) _expect_with_references( "root project reference", - "/tmp/NETfishing-test-data", + "/tmp/straywild-test-data", "/", INSTALL_PATH, PlayerDataRoot.PATH_ALLOWED, @@ -71,9 +71,9 @@ func _initialize() -> void: ) _expect_with_references( "Windows component and case normalization", - "C:\\Games\\NETfishing Data", - "C:\\Games\\NETfishing", - "C:\\Program Files\\NETfishing", + "C:\\Games\\straywild Data", + "C:\\Games\\straywild", + "C:\\Program Files\\straywild", PlayerDataRoot.PATH_ALLOWED, failures, true, diff --git a/server/dedicated_server_config.gd b/server/dedicated_server_config.gd index 2f515c4..623e7c3 100644 --- a/server/dedicated_server_config.gd +++ b/server/dedicated_server_config.gd @@ -1,7 +1,7 @@ class_name DedicatedServerConfig extends RefCounted -const DEFAULT_NAME: String = "NETfishing Dedicated Server" +const DEFAULT_NAME: String = "straywild Dedicated Server" const DEFAULT_BIND_ADDRESS: String = "*" const DEFAULT_PORT: int = 7777 const DEFAULT_MAX_PLAYERS: int = 8 @@ -32,7 +32,7 @@ static func from_runtime() -> DedicatedServerConfig: "network/discovery/base_url", "" )).strip_edges() var config_path: String = OS.get_environment( - "NETFISHING_SERVER_CONFIG" + "straywild_SERVER_CONFIG" ).strip_edges() for argument: String in OS.get_cmdline_user_args(): if argument.begins_with("--config="): @@ -87,36 +87,36 @@ func _load_file(path: String) -> bool: func _apply_environment() -> void: server_name = _environment_string( - "NETFISHING_SERVER_NAME", server_name + "straywild_SERVER_NAME", server_name ) bind_address = _environment_string( - "NETFISHING_SERVER_BIND", bind_address + "straywild_SERVER_BIND", bind_address ) - port = _environment_int("NETFISHING_SERVER_PORT", port) + port = _environment_int("straywild_SERVER_PORT", port) max_players = _environment_int( - "NETFISHING_SERVER_MAX_PLAYERS", max_players + "straywild_SERVER_MAX_PLAYERS", max_players ) world_seed = _environment_int( - "NETFISHING_WORLD_SEED", world_seed + "straywild_WORLD_SEED", world_seed ) public_listing = _environment_bool( - "NETFISHING_SERVER_PUBLIC", public_listing + "straywild_SERVER_PUBLIC", public_listing ) discovery_url = _environment_string( - "NETFISHING_DISCOVERY_URL", discovery_url + "straywild_DISCOVERY_URL", discovery_url ) data_directory = _environment_string( - "NETFISHING_DATA_DIR", data_directory + "straywild_DATA_DIR", data_directory ) chat_logging = _environment_bool( - "NETFISHING_CHAT_LOGGING", chat_logging + "straywild_CHAT_LOGGING", chat_logging ) chat_log_path = _environment_string( - "NETFISHING_CHAT_LOG_PATH", chat_log_path + "straywild_CHAT_LOG_PATH", chat_log_path ) - if OS.has_environment("NETFISHING_SERVER_OPERATORS"): + if OS.has_environment("straywild_SERVER_OPERATORS"): operator_fingerprints = _parse_fingerprint_list( - OS.get_environment("NETFISHING_SERVER_OPERATORS") + OS.get_environment("straywild_SERVER_OPERATORS") ) diff --git a/settings/player_settings_manager.gd b/settings/player_settings_manager.gd index 3fd2a35..362abc9 100644 --- a/settings/player_settings_manager.gd +++ b/settings/player_settings_manager.gd @@ -7,7 +7,7 @@ const TEMP_PATH: String = "user://player_settings.json.tmp" const BACKUP_PATH: String = "user://player_settings.json.backup" const SILENT_VOLUME_DB: float = -80.0 const HEADLESS_WRITE_ENVIRONMENT: String = ( - "NETFISHING_ISOLATED_VALIDATION_STORAGE" + "straywild_ISOLATED_VALIDATION_STORAGE" ) signal settings_changed(settings: PlayerSettings) diff --git a/tests/character_rig_validation.gd b/tests/character_rig_validation.gd index c8fc57d..2aece2b 100644 --- a/tests/character_rig_validation.gd +++ b/tests/character_rig_validation.gd @@ -2,7 +2,7 @@ extends SceneTree const CHARACTER_SCENE: PackedScene = preload( - "res://art/exported/characters/base/netfishing_base_character.glb" + "res://art/exported/characters/base/straywild_base_character.glb" ) const EXPECTED_ANIMATIONS: Array[StringName] = [ diff --git a/tests/controller_mapping_validation.gd b/tests/controller_mapping_validation.gd index 3a4645a..a5938d6 100644 --- a/tests/controller_mapping_validation.gd +++ b/tests/controller_mapping_validation.gd @@ -278,7 +278,7 @@ func _validate_manager(manager: ControllerMappingManagerType) -> String: func _validate_portmaster_launcher() -> String: - const launcher_path: String = "res://scripts/portmaster/NETfishing.sh" + const launcher_path: String = "res://scripts/portmaster/straywild.sh" if not FileAccess.file_exists(launcher_path): return "PortMaster launcher template is missing" var launcher: String = FileAccess.get_file_as_string(launcher_path) @@ -291,9 +291,9 @@ func _validate_portmaster_launcher() -> String: "guide:b8,start:b7,back:b6", "leftstick:b9", "rightstick:b12", - "netfishing_controllerconfig=\"$GODOT_MUOS_MAPPING\"", - "GPTOKEYB_CONFIG=\"$GAMEDIR/netfishing.gptk\"", - "$GPTOKEYB \"NETfishing.aarch64\" -c \"$GPTOKEYB_CONFIG\" &", + "straywild_controllerconfig=\"$GODOT_MUOS_MAPPING\"", + "GPTOKEYB_CONFIG=\"$GAMEDIR/straywild.gptk\"", + "$GPTOKEYB \"straywild.aarch64\" -c \"$GPTOKEYB_CONFIG\" &", "pm_platform_helper \"$GAME_EXECUTABLE\"", "\"$GAME_LAUNCHER\"", "\"$CONTROLLER_MAPPING_FILE\"", @@ -304,7 +304,7 @@ func _validate_portmaster_launcher() -> String: if "$'\\n'" in launcher: return "PortMaster launcher appends mappings across a Weston-unsafe newline" const game_launcher_path: String = ( - "res://scripts/portmaster/launch-netfishing.sh" + "res://scripts/portmaster/launch-straywild.sh" ) if not FileAccess.file_exists(game_launcher_path): return "PortMaster game launcher wrapper is missing" diff --git a/tests/controller_menu_accessibility_validation.gd b/tests/controller_menu_accessibility_validation.gd index 70d2095..aa2f9e2 100644 --- a/tests/controller_menu_accessibility_validation.gd +++ b/tests/controller_menu_accessibility_validation.gd @@ -122,8 +122,38 @@ func _validate_primary_menu_navigation() -> void: _expect( play_button.icon != null and play_button.icon.resource_path - == "res://ui/icons/main_menu/continue.png", - "The Play action does not use the original Continue icon.", + == "res://ui/icons/new_menu/play.png" + and play_button.text.is_empty(), + "The Play action is not presented as the large square icon button.", + ) + _expect( + is_equal_approx(play_button.size.x, play_button.size.y), + "The Play action is not square.", + ) + var online_button := title.get_node("%JoinGameButton") as Button + var settings_button := title.get_node("%SettingsButton") as Button + var credits_button := title.get_node("%CreditsButton") as Button + var close_button := title.get_node("%QuitButton") as Button + for secondary_button: Button in [ + online_button, + settings_button, + credits_button, + close_button, + ]: + _expect( + is_equal_approx( + secondary_button.size.x, + secondary_button.size.y, + ), + "A secondary title action is not square.", + ) + _expect( + is_equal_approx( + close_button.position.y + close_button.size.y + - online_button.position.y, + play_button.size.y, + ), + "The secondary title-action stack does not match Play's height.", ) _expect( not (title.get_node("%NewGameButton") as Control).visible @@ -131,24 +161,29 @@ func _validate_primary_menu_navigation() -> void: "Legacy New/Delete title bubbles are still visible.", ) _assert_neighbor( - title.get_node("%JoinGameButton") as Control, - &"focus_neighbor_right", play_button, + &"focus_neighbor_right", + title.get_node("%JoinGameButton") as Control, + ) + _assert_neighbor( + title.get_node("%JoinGameButton") as Control, + &"focus_neighbor_left", + play_button, + ) + _assert_neighbor( + title.get_node("%JoinGameButton") as Control, + &"focus_neighbor_bottom", + title.get_node("%SettingsButton") as Control, ) _assert_neighbor( title.get_node("%SettingsButton") as Control, - &"focus_neighbor_left", - play_button, + &"focus_neighbor_bottom", + title.get_node("%CreditsButton") as Control, ) _assert_neighbor( title.get_node("%CreditsButton") as Control, - &"focus_neighbor_right", - play_button, - ) - _assert_neighbor( + &"focus_neighbor_bottom", title.get_node("%QuitButton") as Control, - &"focus_neighbor_left", - play_button, ) for title_control: Control in title_controls: _assert_directionally_reachable(title_control, title_controls) @@ -1196,12 +1231,12 @@ func _validate_profile_voice_navigation() -> void: kat_down != null and pitch_grid.is_ancestor_of(kat_down), "Down from the voice-set row does not enter the pitch row.", ) - if OS.has_environment("NETFISHING_PROFILE_VOICE_CAPTURE"): + if OS.has_environment("straywild_PROFILE_VOICE_CAPTURE"): await RenderingServer.frame_post_draw var capture := root.get_viewport().get_texture().get_image() _expect( capture.save_png(OS.get_environment( - "NETFISHING_PROFILE_VOICE_CAPTURE" + "straywild_PROFILE_VOICE_CAPTURE" )) == OK, "The profile voice-page capture could not be saved.", ) diff --git a/tests/controller_ui_navigation_validation.gd b/tests/controller_ui_navigation_validation.gd index e1169f9..24f39f9 100644 --- a/tests/controller_ui_navigation_validation.gd +++ b/tests/controller_ui_navigation_validation.gd @@ -266,22 +266,22 @@ func _validate_four_by_three_centering() -> void: func _validate_low_end_profile_contract() -> void: var launcher: String = FileAccess.get_file_as_string( - "res://scripts/portmaster/NETfishing.sh" + "res://scripts/portmaster/straywild.sh" ) - assert(launcher.contains("NETFISHING_PERFORMANCE_PROFILE:-")) + assert(launcher.contains("straywild_PERFORMANCE_PROFILE:-")) assert(launcher.contains("$CONFDIR/performance_profile")) assert(launcher.contains("normal)")) assert(launcher.contains("light|\"\")")) - assert(launcher.contains("NETFISHING_PERFORMANCE_PROFILE=normal")) - assert(launcher.contains("NETFISHING_PERFORMANCE_PROFILE=light")) - assert(launcher.contains("NETFISHING_LOW_END=1")) + assert(launcher.contains("straywild_PERFORMANCE_PROFILE=normal")) + assert(launcher.contains("straywild_PERFORMANCE_PROFILE=light")) + assert(launcher.contains("straywild_LOW_END=1")) assert(launcher.contains("--max-fps 30")) assert(launcher.contains("--audio-output-latency 40")) var builder: String = FileAccess.get_file_as_string( "res://scripts/build_portmaster.sh" ) assert(builder.contains("prepare_portmaster_assets.sh")) - assert(builder.contains("netfishing-portmaster-export")) + assert(builder.contains("straywild-portmaster-export")) var asset_profile: String = FileAccess.get_file_as_string( "res://scripts/prepare_portmaster_assets.sh" ) diff --git a/tests/dedicated_server_config_validation.gd b/tests/dedicated_server_config_validation.gd index 02a881d..2125220 100644 --- a/tests/dedicated_server_config_validation.gd +++ b/tests/dedicated_server_config_validation.gd @@ -15,7 +15,7 @@ func _initialize() -> void: func _run() -> void: var defaults := ConfigType.new() - defaults.set("data_directory", "/tmp/netfishing-server") + defaults.set("data_directory", "/tmp/straywild-server") defaults.call("_validate") assert(defaults.is_valid()) assert(not bool(defaults.get("public_listing"))) @@ -37,7 +37,7 @@ func _run() -> void: file.set_value("world", "seed", 928374) file.set_value("server", "public", true) file.set_value("server", "data_directory", "/tmp/configured-server") - file.set_value("discovery", "url", "https://discovery.netfishing.org/") + file.set_value("discovery", "url", "https://discovery.straywild.io/") file.set_value("privacy", "chat_logging", true) file.set_value( "privacy", @@ -59,7 +59,7 @@ func _run() -> void: assert(int(configured.get("max_players")) == 12) assert(int(configured.get("world_seed")) == 928374) assert(bool(configured.get("public_listing"))) - assert(str(configured.get("discovery_url")) == "https://discovery.netfishing.org") + assert(str(configured.get("discovery_url")) == "https://discovery.straywild.io") assert(bool(configured.get("chat_logging"))) assert( str(configured.get("chat_log_path")) diff --git a/tests/fish_hotbar_showcase_validation.gd b/tests/fish_hotbar_showcase_validation.gd index c2d687c..753f480 100644 --- a/tests/fish_hotbar_showcase_validation.gd +++ b/tests/fish_hotbar_showcase_validation.gd @@ -197,7 +197,7 @@ func _run() -> void: var invalid_state: Dictionary = valid_state.duplicate(true) invalid_state["display_scale"] = 1000.0 assert(not NetworkFishShowcaseProtocol.validate_state(invalid_state)) - assert(NetworkProtocol.PROTOCOL_VERSION == 10) + assert(NetworkProtocol.PROTOCOL_VERSION == 11) assert(NetworkProtocol.ENET_CHANNEL_COUNT == 17) assert( NetworkProtocol.FISH_QUALITY_CAPABILITY diff --git a/tests/fish_quality_validation.gd b/tests/fish_quality_validation.gd index 3441344..b6e6bfd 100644 --- a/tests/fish_quality_validation.gd +++ b/tests/fish_quality_validation.gd @@ -26,7 +26,7 @@ func _run() -> void: _validate_collection_mastery() _validate_version_four_migration() _validate_fishing_protocol_v2() - assert(NetworkProtocol.PROTOCOL_VERSION == 10) + assert(NetworkProtocol.PROTOCOL_VERSION == 11) assert(NetworkProtocol.ENET_CHANNEL_COUNT == 17) assert(NetworkProtocol.MOVEMENT_ANIMATION_CHANNEL == 11) assert( diff --git a/tests/inventory_notepad_art_validation.gd b/tests/inventory_notepad_art_validation.gd index c42883c..d871b49 100644 --- a/tests/inventory_notepad_art_validation.gd +++ b/tests/inventory_notepad_art_validation.gd @@ -666,7 +666,7 @@ func _to_screen_rect( func _capture_inventory_pages(player_menu: PlayerMenu) -> void: - if not OS.has_environment("NETFISHING_NOTEPAD_CAPTURE"): + if not OS.has_environment("straywild_NOTEPAD_CAPTURE"): return player_menu.visible = true var sections: Array[PlayerMenu.Section] = [ @@ -700,7 +700,7 @@ func _capture_inventory_pages(player_menu: PlayerMenu) -> void: func _save_capture(suffix: String) -> void: var image: Image = root.get_texture().get_image() var path: String = "%s-%s.png" % [ - OS.get_environment("NETFISHING_NOTEPAD_CAPTURE"), + OS.get_environment("straywild_NOTEPAD_CAPTURE"), suffix, ] assert(image.save_png(path) == OK) diff --git a/tests/light_performance_profile_validation.gd b/tests/light_performance_profile_validation.gd index f56db35..6a654f1 100644 --- a/tests/light_performance_profile_validation.gd +++ b/tests/light_performance_profile_validation.gd @@ -123,7 +123,6 @@ func _validate_main_profile(main: Node) -> void: var game_ui := main.get_node("%GameUI") as GameUI var title_screen := game_ui.get_title_screen() assert(title_screen != null) - assert(not title_screen.is_decorative_presentation_active()) var player_menu := game_ui.get("_player_menu") as PlayerMenu assert(player_menu != null) assert(not player_menu.is_cooler_water_effect_enabled()) @@ -159,8 +158,6 @@ func _validate_normal_profile(main: Node) -> void: var game_ui := main.get_node("%GameUI") as GameUI var title_screen := game_ui.get_title_screen() assert(title_screen != null) - assert(title_screen.is_decorative_presentation_active()) - assert(title_screen.is_decorative_bubble_scheduler_active()) var player_menu := game_ui.get("_player_menu") as PlayerMenu assert(player_menu != null) assert(player_menu.is_cooler_water_effect_enabled()) diff --git a/tests/logbook_runtime_validation.gd b/tests/logbook_runtime_validation.gd index 8b19f92..75fc47f 100644 --- a/tests/logbook_runtime_validation.gd +++ b/tests/logbook_runtime_validation.gd @@ -201,13 +201,13 @@ func _add_test_catch(player: Player, fish: FishData) -> void: func _capture_if_requested(suffix: String) -> void: - if not OS.has_environment("NETFISHING_LOGBOOK_CAPTURE"): + if not OS.has_environment("straywild_LOGBOOK_CAPTURE"): return await process_frame await process_frame var image: Image = root.get_texture().get_image() var path: String = ( - OS.get_environment("NETFISHING_LOGBOOK_CAPTURE") + OS.get_environment("straywild_LOGBOOK_CAPTURE") + suffix + ".png" ) diff --git a/tests/logbook_validation.gd b/tests/logbook_validation.gd index 49b9459..4810e0a 100644 --- a/tests/logbook_validation.gd +++ b/tests/logbook_validation.gd @@ -23,11 +23,11 @@ func _initialize() -> void: func _run() -> void: - if OS.has_environment("NETFISHING_TEST_CREATE_ROOT"): + if OS.has_environment("straywild_TEST_CREATE_ROOT"): var data_root := PlayerDataRoot.new() root.add_child(data_root) var result: Dictionary = data_root.create_unbound_root( - OS.get_environment("NETFISHING_TEST_CREATE_ROOT") + OS.get_environment("straywild_TEST_CREATE_ROOT") ) assert(bool(result.get("ok", false))) data_root.queue_free() diff --git a/tests/manual/terrain_chunk_generator/terrain_chunk_generator_test.tscn b/tests/manual/terrain_chunk_generator/terrain_chunk_generator_test.tscn index df3a835..5c1e046 100644 --- a/tests/manual/terrain_chunk_generator/terrain_chunk_generator_test.tscn +++ b/tests/manual/terrain_chunk_generator/terrain_chunk_generator_test.tscn @@ -4,7 +4,7 @@ [ext_resource type="Script" path="res://world/generation/terrain_chunk_generator.gd" id="2_generator"] [ext_resource type="Resource" path="res://world/generation/chunks/terrain_chunk_catalog.tres" id="3_catalog"] [ext_resource type="PackedScene" path="res://player/player.tscn" id="4_player"] -[ext_resource type="Environment" path="res://world/environment/netfishing_environment.tres" id="5_environment"] +[ext_resource type="Environment" path="res://world/environment/straywild_environment.tres" id="5_environment"] [node name="TerrainChunkGeneratorTest" type="Node3D"] script = ExtResource("1_test") diff --git a/tests/title_credits_validation.gd b/tests/title_credits_validation.gd index 5bbf632..e5ac4cc 100644 --- a/tests/title_credits_validation.gd +++ b/tests/title_credits_validation.gd @@ -21,6 +21,10 @@ func _run() -> void: var credits_button := title_screen.get_node( "%CreditsButton" ) as BubbleButton + var play_button := title_screen.get_node("%PlayButton") as BubbleButton + var continue_stats_drawer := title_screen.get_node( + "%ContinueStatsDrawer" + ) as RichTextLabel var credits_page := title_screen.get_node( "%CreditsPage" ) as TitleCreditsPageType @@ -34,9 +38,32 @@ func _run() -> void: await process_frame _expect(credits_button != null, "title menu exposes a credits button") + _expect(play_button != null, "title menu exposes the play button") + _expect( + continue_stats_drawer != null, + "play button owns a dedicated save-preview drawer", + ) + if play_button != null and continue_stats_drawer != null: + _expect( + continue_stats_drawer.get_parent() == play_button, + "save preview extends directly from the play button", + ) + _expect( + continue_stats_drawer.position.y < play_button.size.y + and ( + continue_stats_drawer.position.y + + continue_stats_drawer.size.y + ) > play_button.size.y, + "save preview overlaps the play edge and extends below it", + ) + _expect( + continue_stats_drawer.mouse_filter + == Control.MOUSE_FILTER_IGNORE, + "save preview drawer cannot intercept menu input", + ) _expect( credits_button.icon != null and credits_button.text.is_empty(), - "credits bubble uses its authored icon", + "credits action uses its icon in the square-button presentation", ) _expect(credits_page != null, "title screen contains the credits page") _expect(not credits_page.visible, "credits page starts closed") @@ -44,29 +71,39 @@ func _run() -> void: Rect2(Vector2.ZERO, bubble_field.size).encloses( Rect2(credits_button.position, credits_button.size) ), - "credits bubble stays inside the authored title field", + "credits button stays inside the authored title field", ) _expect( credits_button.mouse_filter == Control.MOUSE_FILTER_STOP, - "credits bubble accepts pointer input", + "credits button accepts pointer input", ) - if OS.has_environment("NETFISHING_TITLE_MENU_CAPTURE"): + if OS.has_environment("straywild_TITLE_MENU_CAPTURE"): (title_screen.get_node("%StartPromptCenter") as Control).hide() title_screen.set_process(true) await create_timer(0.5).timeout _expect( _save_capture( - OS.get_environment("NETFISHING_TITLE_MENU_CAPTURE") + OS.get_environment("straywild_TITLE_MENU_CAPTURE") ) == OK, "title menu validation capture saves successfully", ) title_screen.set_process(false) title_screen.set("_navigation_focus_active", false) + credits_button.call("_set_hovered", true) + credits_button.advance_emphasis(1.0) + _expect( + (credits_button.get_node("HoverDrawer") as Control).visible, + "pointer hover reveals the credits drawer before activation", + ) credits_button.pressed.emit() await process_frame _expect(credits_page.visible, "pointer activation opens credits") _expect(not presentation.visible, "credits replace the primary title menu") + _expect( + not (credits_button.get_node("HoverDrawer") as Control).visible, + "opening a title page collapses its hover drawer", + ) _expect( root.gui_get_focus_owner() != back_button, "pointer activation does not pseudo-select back", @@ -80,11 +117,11 @@ func _run() -> void: back_button.mouse_filter == Control.MOUSE_FILTER_STOP, "credits back button accepts pointer clicks", ) - if OS.has_environment("NETFISHING_CREDITS_CAPTURE"): + if OS.has_environment("straywild_CREDITS_CAPTURE"): await process_frame _expect( _save_capture( - OS.get_environment("NETFISHING_CREDITS_CAPTURE") + OS.get_environment("straywild_CREDITS_CAPTURE") ) == OK, "credits validation capture saves successfully", ) @@ -97,6 +134,30 @@ func _run() -> void: "pointer return leaves the title menu unfocused", ) + var online_button := title_screen.get_node( + "%JoinGameButton" + ) as BubbleButton + var join_game_page := title_screen.get_node("%JoinGamePage") as Control + online_button.call("_set_hovered", true) + online_button.advance_emphasis(1.0) + _expect( + (online_button.get_node("HoverDrawer") as Control).visible, + "pointer hover reveals the online drawer before activation", + ) + online_button.pressed.emit() + await process_frame + _expect(join_game_page.visible, "online activation opens the join page") + _expect( + not (online_button.get_node("HoverDrawer") as Control).visible, + "opening the join page collapses the online drawer", + ) + title_screen.call("_close_join_game") + await process_frame + _expect( + not (online_button.get_node("HoverDrawer") as Control).visible, + "returning from the join page does not restore stale pointer hover", + ) + title_screen.set("_navigation_focus_active", true) credits_button.grab_focus() credits_button.pressed.emit() @@ -134,7 +195,7 @@ func _run() -> void: _expect(not credits_page.visible, "ui cancel closes credits") _expect( root.gui_get_focus_owner() == credits_button, - "navigation return restores focus to the credits bubble", + "navigation return restores focus to the credits button", ) var chillnfill_name := credits_page.get_node( diff --git a/tests/ui_scaling_runtime_validation.gd b/tests/ui_scaling_runtime_validation.gd index b9e8bce..6e6182a 100644 --- a/tests/ui_scaling_runtime_validation.gd +++ b/tests/ui_scaling_runtime_validation.gd @@ -66,12 +66,6 @@ func _run() -> void: var pause_profile_stage := pause_menu.get_node( "ResponsivePauseStage" ) as Control - var decorative_fish_layer := title_screen.get_node( - "DecorativeFishLayer" - ) as Control - var decorative_bubble_layer := title_screen.get_node( - "DecorativeBubbleLayer" - ) as Control ui_viewport.add_child(game_ui) presenter.add_child(ui_viewport) root.add_child(presenter) @@ -165,26 +159,6 @@ func _run() -> void: assert(pause_profile_stage.position.is_equal_approx( expected_profile_position )) - assert(decorative_fish_layer.size.is_equal_approx( - expected_visible_size - )) - assert(decorative_bubble_layer.size.is_equal_approx( - expected_visible_size - )) - var left_to_right_bounds: Vector2 = ( - TitleScreen.get_decorative_fish_crossing_bounds( - expected_visible_size.x, 160.0, 1.0 - ) - ) - var right_to_left_bounds: Vector2 = ( - TitleScreen.get_decorative_fish_crossing_bounds( - expected_visible_size.x, 160.0, -1.0 - ) - ) - assert(left_to_right_bounds.x < -160.0) - assert(left_to_right_bounds.y > expected_visible_size.x) - assert(right_to_left_bounds.x > expected_visible_size.x) - assert(right_to_left_bounds.y < -160.0) assert(is_equal_approx(presenter.scale.x, presenter.scale.y)) assert(is_equal_approx(ui_root.scale.x, ui_root.scale.y)) var effective_scale: float = presenter.scale.x * ui_root.scale.x @@ -310,13 +284,13 @@ func _run() -> void: chat_panel.position.x * effective_scale, ] ) - if OS.has_environment("NETFISHING_UI_SCALE_CAPTURE"): + if OS.has_environment("straywild_UI_SCALE_CAPTURE"): await process_frame var capture: Image = root.get_texture().get_image() var capture_path: String = ( "%s-requested-%dx%d-actual-%dx%d.png" ) % [ - OS.get_environment("NETFISHING_UI_SCALE_CAPTURE"), + OS.get_environment("straywild_UI_SCALE_CAPTURE"), target_size.x, target_size.y, actual_size.x, diff --git a/tests/world_spawn_protocol_validation.gd b/tests/world_spawn_protocol_validation.gd index 29f7fde..a8365a1 100644 --- a/tests/world_spawn_protocol_validation.gd +++ b/tests/world_spawn_protocol_validation.gd @@ -16,7 +16,7 @@ const CalendarSeasonType = preload("res://world/calendar_season.gd") func _initialize() -> void: - assert(NetworkProtocol.PROTOCOL_VERSION == 10) + assert(NetworkProtocol.PROTOCOL_VERSION == 11) assert( NetworkWorldSpawnProtocol.CAPABILITY == NetworkProtocol.WORLD_SPAWN_CAPABILITY diff --git a/tests/world_time_validation.gd b/tests/world_time_validation.gd index 17ddb49..3caea2b 100644 --- a/tests/world_time_validation.gd +++ b/tests/world_time_validation.gd @@ -304,7 +304,7 @@ func _validate_environment_presentation() -> void: var sky := Sky.new() var sky_material := ShaderMaterial.new() sky_material.shader = preload( - "res://world/environment/netfishing_sky.gdshader" + "res://world/environment/straywild_sky.gdshader" ) sky.sky_material = sky_material environment.sky = sky @@ -352,7 +352,7 @@ func _validate_environment_presentation() -> void: "res://world/materials/stylized_water.gdshader" ) var sky_shader: Shader = preload( - "res://world/environment/netfishing_sky.gdshader" + "res://world/environment/straywild_sky.gdshader" ) assert("uniform float fog_horizon_occlusion" in sky_shader.code) assert("fog_horizon_color.rgb" in sky_shader.code) diff --git a/tests/world_weather_validation.gd b/tests/world_weather_validation.gd index 1f46adf..7bc5114 100644 --- a/tests/world_weather_validation.gd +++ b/tests/world_weather_validation.gd @@ -283,7 +283,7 @@ func _validate_weather_presentation() -> void: var sky := Sky.new() var sky_material := ShaderMaterial.new() sky_material.shader = preload( - "res://world/environment/netfishing_sky.gdshader" + "res://world/environment/straywild_sky.gdshader" ) sky.sky_material = sky_material environment.sky = sky diff --git a/tools/blender/export_terrain_chunks.py b/tools/blender/export_terrain_chunks.py index ced081e..d4a278e 100644 --- a/tools/blender/export_terrain_chunks.py +++ b/tools/blender/export_terrain_chunks.py @@ -107,7 +107,7 @@ def _parse_arguments() -> argparse.Namespace: if "--" in sys.argv: script_arguments = sys.argv[sys.argv.index("--") + 1 :] parser = argparse.ArgumentParser( - description="Export NETfishing terrain chunk collections to GLB files." + description="Export straywild terrain chunk collections to GLB files." ) parser.add_argument( "--output", diff --git a/ui/assets/title/netfishing_logo.png b/ui/assets/title/netfishing_logo.png deleted file mode 100644 index 71c8ac84569e8621d0539d40061b923878012027..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22579 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 literal 0 HcmV?d00001 diff --git a/ui/assets/title/straywild_logo.png.import b/ui/assets/title/straywild_logo.png.import new file mode 100644 index 0000000..9cd04ca --- /dev/null +++ b/ui/assets/title/straywild_logo.png.import @@ -0,0 +1,42 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dwe5p5t0ode73" +path.s3tc="res://.godot/imported/straywild_logo.png-de66accac60dbd31604d2c39ab8d2775.s3tc.ctex" +path.etc2="res://.godot/imported/straywild_logo.png-de66accac60dbd31604d2c39ab8d2775.etc2.ctex" +metadata={ +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true +} + +[deps] + +source_file="res://ui/assets/title/straywild_logo.png" +dest_files=["res://.godot/imported/straywild_logo.png-de66accac60dbd31604d2c39ab8d2775.s3tc.ctex", "res://.godot/imported/straywild_logo.png-de66accac60dbd31604d2c39ab8d2775.etc2.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/ui/components/bubble_menu/bubble_button.gd b/ui/components/bubble_menu/bubble_button.gd index 3dc3730..ac0409e 100644 --- a/ui/components/bubble_menu/bubble_button.gd +++ b/ui/components/bubble_menu/bubble_button.gd @@ -2,6 +2,13 @@ class_name BubbleButton extends Button const ICON_FILL_RATIO: float = 0.76 +const LABELED_ICON_FILL_RATIO: float = 0.58 +const BubbleGradientBackgroundType = preload( + "res://ui/components/bubble_menu/bubble_gradient_background.gd" +) +const BubbleHoverDrawerType = preload( + "res://ui/components/bubble_menu/bubble_hover_drawer.gd" +) @export var profile: BubbleMenuProfile @@ -16,6 +23,9 @@ const ICON_FILL_RATIO: float = 0.76 @export_range(1, 256, 1) var minimum_font_size: int = 14 @export_range(1, 256, 1) var maximum_font_size: int = 32 +@export_group("Icon") +@export_range(0.0, 1.0, 0.01) var icon_fill_ratio_override: float = 0.0 + @export_group("Motion") @export_range(0.0, 32.0, 0.1) var horizontal_amplitude: float = 1.8 @export_range(0.0, 32.0, 0.1) var vertical_amplitude: float = 4.0 @@ -23,20 +33,37 @@ const ICON_FILL_RATIO: float = 0.76 @export_range(0.0, TAU, 0.01) var motion_phase: float = 0.0 @export_range(0.0, 0.2, 0.001) var deformation_amplitude: float = 0.016 @export_range(0.1, 30.0, 0.1) var deformation_period: float = 6.0 +@export var hover_wiggle_amplitude: Vector2 = Vector2.ZERO +@export_range(0.1, 30.0, 0.1) var hover_wiggle_period: float = 2.0 + +@export_group("Hover Drawer") +@export var hover_drawer_text: String = "" +@export_enum("Right", "Left Vertical") var hover_drawer_mode: int = 0 +@export_range(0.1, 12.0, 0.1) var hover_drawer_speed: float = 4.0 + +@export_group("Hit Area") +@export var elliptical_hit_area: bool = true var neutral_position: Vector2 = Vector2.ZERO var presented_size: Vector2 = Vector2.ZERO var emphasis: float = 0.0 var _hovered: bool = false +var _drawer_focused: bool = false +var _drawer_reveal: float = 0.0 +var _gradient_background: BubbleGradientBackground +var _hover_drawer: BubbleHoverDrawer func _ready() -> void: mouse_entered.connect(_set_hovered.bind(true)) mouse_exited.connect(_set_hovered.bind(false)) + focus_entered.connect(_set_drawer_focused.bind(true)) + focus_exited.connect(_set_drawer_focused.bind(false)) resized.connect(_update_pivot) _update_pivot() apply_profile() _apply_icon_presentation(neutral_size) + _update_hover_drawer() func _gui_input(event: InputEvent) -> void: @@ -97,6 +124,8 @@ func apply_layout( presented_size = bubble_size _update_pivot() _apply_icon_presentation(bubble_size) + if _hover_drawer != null: + _hover_drawer.refresh_layout() var label_control: Control = get_label_control() var font_size := clampi( roundi(minf(bubble_size.x, bubble_size.y) * font_size_ratio), @@ -134,17 +163,26 @@ func _uses_icon_only_presentation() -> bool: func _apply_icon_presentation(bubble_size: Vector2) -> void: + if icon == null: + return + vertical_icon_alignment = VERTICAL_ALIGNMENT_CENTER + expand_icon = true + texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST + var fill_ratio: float = ( + ICON_FILL_RATIO + if _uses_icon_only_presentation() + else LABELED_ICON_FILL_RATIO + ) + if _uses_icon_only_presentation() and icon_fill_ratio_override > 0.0: + fill_ratio = icon_fill_ratio_override + add_theme_constant_override( + "icon_max_width", + maxi(1, roundi(minf(bubble_size.x, bubble_size.y) * fill_ratio)), + ) if not _uses_icon_only_presentation(): return alignment = HORIZONTAL_ALIGNMENT_CENTER icon_alignment = HORIZONTAL_ALIGNMENT_CENTER - vertical_icon_alignment = VERTICAL_ALIGNMENT_CENTER - expand_icon = true - texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST - add_theme_constant_override( - "icon_max_width", - maxi(1, roundi(minf(bubble_size.x, bubble_size.y) * ICON_FILL_RATIO)), - ) func advance_emphasis(delta: float) -> void: @@ -154,6 +192,27 @@ func advance_emphasis(delta: float) -> void: target, profile.emphasis_speed * delta ) + if _gradient_background != null: + _gradient_background.queue_redraw() + var drawer_target: float = 1.0 if (_hovered or _drawer_focused) else 0.0 + _drawer_reveal = move_toward( + _drawer_reveal, + drawer_target, + hover_drawer_speed * delta, + ) + if _hover_drawer != null: + _hover_drawer.set_reveal(_drawer_reveal) + + +func reset_hover_presentation() -> void: + _hovered = false + _drawer_focused = false + emphasis = 0.0 + _drawer_reveal = 0.0 + if _gradient_background != null: + _gradient_background.queue_redraw() + if _hover_drawer != null: + _hover_drawer.set_reveal(0.0) func calculate_target( @@ -169,12 +228,17 @@ func calculate_target( sin(phase * 0.73 + motion_phase) * horizontal_amplitude, sin(phase) * vertical_amplitude ) * layout_scale * motion_scale + var hover_phase: float = elapsed / hover_wiggle_period * TAU + var hover_offset := Vector2( + sin(hover_phase), + sin(hover_phase * 2.0 + motion_phase) * 0.5, + ) * hover_wiggle_amplitude * emphasis * layout_scale * motion_scale idle_offset.y -= ( profile.hover_focus_lift * emphasis * layout_scale ) - return neutral_position + idle_offset + return neutral_position + idle_offset + hover_offset func calculate_visual_scale( @@ -219,6 +283,8 @@ func apply_presentation( func _has_point(point: Vector2) -> bool: + if not elliptical_hit_area: + return Rect2(Vector2.ZERO, size).has_point(point) var radius: Vector2 = size * 0.5 if radius.x <= 0.0 or radius.y <= 0.0: return false @@ -228,6 +294,12 @@ func _has_point(point: Vector2) -> bool: func _set_hovered(value: bool) -> void: _hovered = value + if _gradient_background != null: + _gradient_background.queue_redraw() + + +func _set_drawer_focused(value: bool) -> void: + _drawer_focused = value func _update_pivot() -> void: @@ -237,6 +309,7 @@ func _update_pivot() -> void: func apply_profile() -> void: if profile == null: return + _update_gradient_background() add_theme_stylebox_override("normal", profile.make_normal_style()) var hover_style: StyleBoxFlat = profile.make_hover_style() add_theme_stylebox_override("hover", hover_style) @@ -251,3 +324,35 @@ func apply_profile() -> void: var label_control: Control = get_label_control() if label_control != self: label_control.add_theme_color_override("font_color", profile.text_color) + + +func _update_gradient_background() -> void: + if not profile.gradient_enabled: + if _gradient_background != null: + _gradient_background.queue_free() + _gradient_background = null + return + if _gradient_background == null: + _gradient_background = BubbleGradientBackgroundType.new() + _gradient_background.name = "GradientBackground" + add_child(_gradient_background) + move_child(_gradient_background, 0) + _gradient_background.configure(self, profile) + + +func _update_hover_drawer() -> void: + if hover_drawer_text.is_empty(): + if _hover_drawer != null: + _hover_drawer.queue_free() + _hover_drawer = null + return + if _hover_drawer == null: + _hover_drawer = BubbleHoverDrawerType.new() + _hover_drawer.name = "HoverDrawer" + add_child(_hover_drawer) + move_child(_hover_drawer, 0) + _hover_drawer.configure( + self, + hover_drawer_text, + hover_drawer_mode as BubbleHoverDrawer.DrawerMode, + ) diff --git a/ui/components/bubble_menu/bubble_cluster.gd b/ui/components/bubble_menu/bubble_cluster.gd index 0ad2624..29f7889 100644 --- a/ui/components/bubble_menu/bubble_cluster.gd +++ b/ui/components/bubble_menu/bubble_cluster.gd @@ -9,6 +9,7 @@ const ControllerFocusNavigationType = preload( @export var desktop_reference_size: Vector2 = Vector2(396.0, 318.0) @export var compact_reference_size: Vector2 = Vector2(294.0, 200.0) @export_range(0.0, 1.0, 0.01) var motion_scale: float = 1.0 +@export var collision_separation_enabled: bool = true var _bubbles: Array[BubbleButton] = [] var _elapsed: float = 0.0 @@ -70,39 +71,40 @@ func advance_motion(delta: float) -> void: targets.append(target) visual_scales.append(visual_scale) visual_radii.append(bubble.get_visual_radius(visual_scale)) - for first_index: int in _bubbles.size(): - for second_index: int in range(first_index + 1, _bubbles.size()): - var first_center: Vector2 = ( - targets[first_index] - + _bubbles[first_index].presented_size * 0.5 - ) - var second_center: Vector2 = ( - targets[second_index] - + _bubbles[second_index].presented_size * 0.5 - ) - var center_delta: Vector2 = second_center - first_center - var distance: float = center_delta.length() - var desired_distance: float = ( - visual_radii[first_index] - + visual_radii[second_index] - + profile.contact_gap * _layout_scale - ) - if distance >= desired_distance: - continue - var direction := ( - center_delta / distance - if distance > 0.001 - else Vector2.RIGHT.rotated(float(first_index + 1)) - ) - var correction: Vector2 = ( - direction - * minf( - (desired_distance - distance) * 0.5, - profile.maximum_separation * _layout_scale + if collision_separation_enabled: + for first_index: int in _bubbles.size(): + for second_index: int in range(first_index + 1, _bubbles.size()): + var first_center: Vector2 = ( + targets[first_index] + + _bubbles[first_index].presented_size * 0.5 ) - ) - targets[first_index] -= correction - targets[second_index] += correction + var second_center: Vector2 = ( + targets[second_index] + + _bubbles[second_index].presented_size * 0.5 + ) + var center_delta: Vector2 = second_center - first_center + var distance: float = center_delta.length() + var desired_distance: float = ( + visual_radii[first_index] + + visual_radii[second_index] + + profile.contact_gap * _layout_scale + ) + if distance >= desired_distance: + continue + var direction := ( + center_delta / distance + if distance > 0.001 + else Vector2.RIGHT.rotated(float(first_index + 1)) + ) + var correction: Vector2 = ( + direction + * minf( + (desired_distance - distance) * 0.5, + profile.maximum_separation * _layout_scale + ) + ) + targets[first_index] -= correction + targets[second_index] += correction var position_weight: float = 1.0 - exp( -profile.position_response * delta ) diff --git a/ui/components/bubble_menu/bubble_gradient_background.gd b/ui/components/bubble_menu/bubble_gradient_background.gd new file mode 100644 index 0000000..cf17bdb --- /dev/null +++ b/ui/components/bubble_menu/bubble_gradient_background.gd @@ -0,0 +1,79 @@ +class_name BubbleGradientBackground +extends Control + +const CORNER_SEGMENTS: int = 8 + +var host_button: BaseButton +var profile: BubbleMenuProfile + + +func configure( + button: BaseButton, + menu_profile: BubbleMenuProfile, +) -> void: + host_button = button + profile = menu_profile + mouse_filter = Control.MOUSE_FILTER_IGNORE + show_behind_parent = true + set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + queue_redraw() + + +func _draw() -> void: + if host_button == null or profile == null or size.x <= 0.0 or size.y <= 0.0: + return + var fill_color: Color = _get_fill_color() + var top_color: Color = fill_color.lightened(profile.gradient_top_lift) + var points := PackedVector2Array() + _append_arc(points, Vector2(profile.corner_radius, profile.corner_radius), PI, PI * 1.5) + _append_arc( + points, + Vector2(size.x - profile.corner_radius, profile.corner_radius), + PI * 1.5, + TAU, + ) + _append_arc( + points, + Vector2(size.x - profile.corner_radius, size.y - profile.corner_radius), + 0.0, + PI * 0.5, + ) + _append_arc( + points, + Vector2(profile.corner_radius, size.y - profile.corner_radius), + PI * 0.5, + PI, + ) + var colors := PackedColorArray() + for point: Vector2 in points: + colors.append(top_color.lerp(fill_color, clampf(point.y / size.y, 0.0, 1.0))) + draw_polygon(points, colors) + + +func _append_arc( + points: PackedVector2Array, + center: Vector2, + start_angle: float, + end_angle: float, +) -> void: + var radius: float = minf( + float(profile.corner_radius), + minf(size.x, size.y) * 0.5, + ) + for index: int in range(CORNER_SEGMENTS + 1): + var weight: float = float(index) / float(CORNER_SEGMENTS) + var angle: float = lerpf(start_angle, end_angle, weight) + points.append(center + Vector2(cos(angle), sin(angle)) * radius) + + +func _get_fill_color() -> Color: + if host_button.disabled: + return profile.disabled_fill + match host_button.get_draw_mode(): + BaseButton.DRAW_PRESSED, BaseButton.DRAW_HOVER_PRESSED: + return profile.pressed_fill + BaseButton.DRAW_HOVER: + return profile.hover_fill + if host_button.has_focus(): + return profile.hover_fill + return profile.normal_fill diff --git a/ui/components/bubble_menu/bubble_gradient_background.gd.uid b/ui/components/bubble_menu/bubble_gradient_background.gd.uid new file mode 100644 index 0000000..ecab908 --- /dev/null +++ b/ui/components/bubble_menu/bubble_gradient_background.gd.uid @@ -0,0 +1 @@ +uid://cckk3lwdqadjn diff --git a/ui/components/bubble_menu/bubble_hover_drawer.gd b/ui/components/bubble_menu/bubble_hover_drawer.gd new file mode 100644 index 0000000..ad72edc --- /dev/null +++ b/ui/components/bubble_menu/bubble_hover_drawer.gd @@ -0,0 +1,97 @@ +class_name BubbleHoverDrawer +extends Control + +enum DrawerMode { + RIGHT, + LEFT_VERTICAL, +} + +const DRAWER_COLOR: Color = Color(0.031, 0.122, 0.169, 1.0) +const TEXT_COLOR: Color = Color(0.764706, 0.87451, 0.901961, 1.0) +const RIGHT_SIZE: Vector2 = Vector2(132.0, 48.0) +const LEFT_VERTICAL_SIZE: Vector2 = Vector2(50.0, 176.0) +const OVERLAP: float = 12.0 + +var host_button: BaseButton +var drawer_mode: DrawerMode = DrawerMode.RIGHT +var _panel: Panel +var _label: Label + + +func configure( + button: BaseButton, + drawer_text: String, + mode: DrawerMode, +) -> void: + host_button = button + drawer_mode = mode + mouse_filter = Control.MOUSE_FILTER_IGNORE + show_behind_parent = true + _build_controls() + _label.text = drawer_text + _refresh_label_layout() + refresh_layout() + set_reveal(0.0) + + +func refresh_layout() -> void: + if host_button == null: + return + if drawer_mode == DrawerMode.RIGHT: + size = RIGHT_SIZE + position = Vector2( + host_button.size.x - OVERLAP, + (host_button.size.y - size.y) * 0.5, + ) + pivot_offset = Vector2(0.0, size.y * 0.5) + else: + size = LEFT_VERTICAL_SIZE + position = Vector2( + -size.x + OVERLAP, + (host_button.size.y - size.y) * 0.5, + ) + pivot_offset = Vector2(size.x, size.y * 0.5) + _refresh_label_layout() + + +func set_reveal(amount: float) -> void: + var reveal: float = clampf(amount, 0.0, 1.0) + visible = reveal > 0.001 + scale = Vector2(maxf(reveal, 0.001), 1.0) + + +func _build_controls() -> void: + if _panel != null: + return + _panel = Panel.new() + _panel.mouse_filter = Control.MOUSE_FILTER_IGNORE + _panel.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + var panel_style := StyleBoxFlat.new() + panel_style.bg_color = DRAWER_COLOR + panel_style.corner_radius_top_left = 12 + panel_style.corner_radius_top_right = 12 + panel_style.corner_radius_bottom_right = 12 + panel_style.corner_radius_bottom_left = 12 + _panel.add_theme_stylebox_override("panel", panel_style) + add_child(_panel) + + _label = Label.new() + _label.mouse_filter = Control.MOUSE_FILTER_IGNORE + _label.add_theme_color_override("font_color", TEXT_COLOR) + _label.add_theme_font_size_override("font_size", 20) + _label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + _label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER + add_child(_label) + + +func _refresh_label_layout() -> void: + if _label == null: + return + if drawer_mode == DrawerMode.RIGHT: + _label.rotation = 0.0 + _label.position = Vector2.ZERO + _label.size = size + else: + _label.rotation = -PI * 0.5 + _label.position = Vector2(-OVERLAP * 0.5, size.y) + _label.size = Vector2(size.y, size.x) diff --git a/ui/components/bubble_menu/bubble_hover_drawer.gd.uid b/ui/components/bubble_menu/bubble_hover_drawer.gd.uid new file mode 100644 index 0000000..9a31896 --- /dev/null +++ b/ui/components/bubble_menu/bubble_hover_drawer.gd.uid @@ -0,0 +1 @@ +uid://jvw68gltfda0 diff --git a/ui/components/bubble_menu/bubble_menu_profile.gd b/ui/components/bubble_menu/bubble_menu_profile.gd index a78cbd1..1af8b50 100644 --- a/ui/components/bubble_menu/bubble_menu_profile.gd +++ b/ui/components/bubble_menu/bubble_menu_profile.gd @@ -21,6 +21,10 @@ extends Resource @export_range(0, 12, 1) var normal_border_width: int = 2 @export_range(0, 12, 1) var emphasized_border_width: int = 3 +@export_group("Gradient") +@export var gradient_enabled: bool = false +@export_range(0.0, 0.5, 0.01) var gradient_top_lift: float = 0.12 + @export_group("Colors") @export var normal_fill: Color = Color(0.82, 0.93, 0.96, 0.96) @export var normal_border: Color = Color(0.91, 0.98, 1.0, 0.85) @@ -78,7 +82,11 @@ func _make_style( style.content_margin_top = content_margin style.content_margin_right = content_margin style.content_margin_bottom = content_margin - style.bg_color = fill_color + style.bg_color = ( + Color(fill_color.r, fill_color.g, fill_color.b, 0.0) + if gradient_enabled + else fill_color + ) style.border_width_left = outline_width style.border_width_top = outline_width style.border_width_right = outline_width diff --git a/ui/components/bubble_menu/title_menu_profile.tres b/ui/components/bubble_menu/title_menu_profile.tres new file mode 100644 index 0000000..3ae3a4a --- /dev/null +++ b/ui/components/bubble_menu/title_menu_profile.tres @@ -0,0 +1,22 @@ +[gd_resource type="Resource" script_class="BubbleMenuProfile" load_steps=2 format=3] + +[ext_resource type="Script" path="res://ui/components/bubble_menu/bubble_menu_profile.gd" id="1_profile"] + +[resource] +script = ExtResource("1_profile") +font_size_ratio = 0.14 +hover_focus_scale = 1.02 +hover_focus_lift = 0.0 +emphasis_speed = 7.0 +emphasized_deformation_scale = 0.0 +contact_gap = 0.0 +maximum_separation = 0.0 +content_margin = 6.0 +corner_radius = 36 +normal_border_width = 0 +emphasized_border_width = 0 +gradient_enabled = false +normal_fill = Color(1, 1, 1, 1) +hover_fill = Color(1, 1, 1, 1) +pressed_fill = Color(1, 1, 1, 1) +disabled_fill = Color(1, 1, 1, 0.78) diff --git a/ui/components/bubble_menu/title_secondary_menu_profile.tres b/ui/components/bubble_menu/title_secondary_menu_profile.tres new file mode 100644 index 0000000..d79b7da --- /dev/null +++ b/ui/components/bubble_menu/title_secondary_menu_profile.tres @@ -0,0 +1,22 @@ +[gd_resource type="Resource" script_class="BubbleMenuProfile" load_steps=2 format=3] + +[ext_resource type="Script" path="res://ui/components/bubble_menu/bubble_menu_profile.gd" id="1_profile"] + +[resource] +script = ExtResource("1_profile") +font_size_ratio = 0.14 +hover_focus_scale = 1.02 +hover_focus_lift = 0.0 +emphasis_speed = 7.0 +emphasized_deformation_scale = 0.0 +contact_gap = 0.0 +maximum_separation = 0.0 +content_margin = 6.0 +corner_radius = 16 +normal_border_width = 0 +emphasized_border_width = 0 +gradient_enabled = false +normal_fill = Color(1, 1, 1, 1) +hover_fill = Color(1, 1, 1, 1) +pressed_fill = Color(1, 1, 1, 1) +disabled_fill = Color(1, 1, 1, 0.78) diff --git a/ui/controller_focus_presentation.gd b/ui/controller_focus_presentation.gd index 405b834..cb41c31 100644 --- a/ui/controller_focus_presentation.gd +++ b/ui/controller_focus_presentation.gd @@ -245,7 +245,7 @@ func _clear_directional_input_in_flight(generation: int) -> void: func _is_directional_navigation(event: InputEvent) -> bool: if event is InputEventKey and (event as InputEventKey).echo: return false - # Tab is both Godot's default ui_focus_next key and NETfishing's default + # Tab is both Godot's default ui_focus_next key and straywild's default # player-menu binding. The global focus presenter must leave that gameplay # action alone; otherwise a remembered neutral focus seed consumes the key # before PlayerMenu can open or close. diff --git a/ui/controller_mapping_panel.gd b/ui/controller_mapping_panel.gd index 16080a7..12ac941 100644 --- a/ui/controller_mapping_panel.gd +++ b/ui/controller_mapping_panel.gd @@ -239,7 +239,7 @@ func _build_interface() -> void: _instruction_label = Label.new() _instruction_label.text = ( - "auto-map walks through NETfishing's controller actions. " + "auto-map walks through straywild's controller actions. " + "select any row afterward to override it; the mapped back " + "control cancels capture." ) diff --git a/ui/icons/new_menu/close.png b/ui/icons/new_menu/close.png new file mode 100644 index 0000000000000000000000000000000000000000..886ed6ad1cb58280b44774e7a474c2ec65ce1f1b GIT binary patch literal 13893 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 G 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 g|L+}bxqgpcH>Oxz5oCK literal 0 HcmV?d00001 diff --git a/ui/icons/new_menu/online.png.import b/ui/icons/new_menu/online.png.import new file mode 100644 index 0000000..df12baa --- /dev/null +++ b/ui/icons/new_menu/online.png.import @@ -0,0 +1,42 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c8sty10uue6nm" +path.s3tc="res://.godot/imported/online.png-3f69c41cde4beb29d8f23e574a61641f.s3tc.ctex" +path.etc2="res://.godot/imported/online.png-3f69c41cde4beb29d8f23e574a61641f.etc2.ctex" +metadata={ +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true +} + +[deps] + +source_file="res://ui/icons/new_menu/online.png" +dest_files=["res://.godot/imported/online.png-3f69c41cde4beb29d8f23e574a61641f.s3tc.ctex", "res://.godot/imported/online.png-3f69c41cde4beb29d8f23e574a61641f.etc2.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/ui/icons/new_menu/play.png b/ui/icons/new_menu/play.png new file mode 100644 index 0000000000000000000000000000000000000000..aa61c525083f7a77771e94b0a7c4f0a575f4af32 GIT binary patch literal 25535 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 af!5=>u04F`SvS~C2IQqxq{<~t1O5-%kzU*Y literal 0 HcmV?d00001 diff --git a/ui/assets/title/netfishing_logo.png.import b/ui/icons/new_menu/play.png.import similarity index 55% rename from ui/assets/title/netfishing_logo.png.import rename to ui/icons/new_menu/play.png.import index 2aa351a..6fc788b 100644 --- a/ui/assets/title/netfishing_logo.png.import +++ b/ui/icons/new_menu/play.png.import @@ -2,20 +2,22 @@ importer="texture" type="CompressedTexture2D" -uid="uid://ckqayis1ckb2v" -path="res://.godot/imported/netfishing_logo.png-82ab9fce5851dcc5239eca178e8cde99.ctex" +uid="uid://7qe6siny4ru7" +path.s3tc="res://.godot/imported/play.png-f35bbfc9549b806b0a83d0c3b4c7dc74.s3tc.ctex" +path.etc2="res://.godot/imported/play.png-f35bbfc9549b806b0a83d0c3b4c7dc74.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] -source_file="res://ui/assets/title/netfishing_logo.png" -dest_files=["res://.godot/imported/netfishing_logo.png-82ab9fce5851dcc5239eca178e8cde99.ctex"] +source_file="res://ui/icons/new_menu/play.png" +dest_files=["res://.godot/imported/play.png-f35bbfc9549b806b0a83d0c3b4c7dc74.s3tc.ctex", "res://.godot/imported/play.png-f35bbfc9549b806b0a83d0c3b4c7dc74.etc2.ctex"] [params] -compress/mode=0 +compress/mode=2 compress/high_quality=false compress/lossy_quality=0.7 compress/uastc_level=0 @@ -37,4 +39,4 @@ process/normal_map_invert_y=false process/hdr_as_srgb=false process/hdr_clamp_exposure=false process/size_limit=0 -detect_3d/compress_to=1 +detect_3d/compress_to=0 diff --git a/ui/icons/new_menu/settings.png b/ui/icons/new_menu/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..7d69c3b8b0c5bc0efc1154a1e8c6d45f039cbd73 GIT binary patch literal 8161 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 AX#fBK literal 0 HcmV?d00001 diff --git a/ui/icons/new_menu/settings.png.import b/ui/icons/new_menu/settings.png.import new file mode 100644 index 0000000..54dde27 --- /dev/null +++ b/ui/icons/new_menu/settings.png.import @@ -0,0 +1,42 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cxqwvyg0qryg1" +path.s3tc="res://.godot/imported/settings.png-3654f1ee86a2237bbc3c9af7e818343c.s3tc.ctex" +path.etc2="res://.godot/imported/settings.png-3654f1ee86a2237bbc3c9af7e818343c.etc2.ctex" +metadata={ +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true +} + +[deps] + +source_file="res://ui/icons/new_menu/settings.png" +dest_files=["res://.godot/imported/settings.png-3654f1ee86a2237bbc3c9af7e818343c.s3tc.ctex", "res://.godot/imported/settings.png-3654f1ee86a2237bbc3c9af7e818343c.etc2.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/ui/save_slots_page.gd b/ui/save_slots_page.gd index ba142f7..74e3a7f 100644 --- a/ui/save_slots_page.gd +++ b/ui/save_slots_page.gd @@ -439,7 +439,7 @@ func _choose_import_path() -> void: _import_dialog.access = FileDialog.ACCESS_FILESYSTEM _import_dialog.use_native_dialog = false _import_dialog.filters = PackedStringArray([ - "*.nfsave ; NETfishing progression archive", + "*.nfsave ; straywild progression archive", ]) _import_dialog.file_selected.connect(_import_file_selected) if _interface_fonts != null: @@ -479,7 +479,7 @@ func _choose_export_path() -> void: _export_dialog.access = FileDialog.ACCESS_FILESYSTEM _export_dialog.use_native_dialog = false _export_dialog.filters = PackedStringArray([ - "*.nfsave ; NETfishing progression archive", + "*.nfsave ; straywild progression archive", ]) _export_dialog.file_selected.connect(_export_file_selected) if _interface_fonts != null: @@ -716,7 +716,7 @@ func _safe_filename(value: String) -> String: var result: String = value.strip_edges().to_lower().replace(" ", "-") for character: String in ["/", "\\", ":", "*", "?", "\"", "<", ">", "|"]: result = result.replace(character, "") - return "netfishing-save" if result.is_empty() else result + return "straywild-save" if result.is_empty() else result func _on_slots_changed() -> void: diff --git a/ui/settings_panel.gd b/ui/settings_panel.gd index 049b9c9..159b3c0 100644 --- a/ui/settings_panel.gd +++ b/ui/settings_panel.gd @@ -697,7 +697,7 @@ func _change_data_folder(path: String) -> void: ).to_lower() _refresh_data_page() return - _feedback.text = "data folder changed. NETfishing will close safely." + _feedback.text = "data folder changed. straywild will close safely." _refresh_data_page() get_tree().call_deferred("quit") else: @@ -708,16 +708,16 @@ func _change_data_folder(path: String) -> void: func _show_existing_data_folder_choice(path: String) -> void: var dialog := ConfirmationDialog.new() - dialog.title = "existing NETfishing data" + dialog.title = "existing straywild data" dialog.ok_button_text = "use selected data" dialog.dialog_text = ( - "the selected folder contains different NETfishing data.\n\n" + "the selected folder contains different straywild data.\n\n" + "choose one complete data set. data will not be merged." ) dialog.add_button("replace selected data", false, "replace") dialog.confirmed.connect(func() -> void: if _data_root.use_existing_root(path): - _feedback.text = "data folder changed. NETfishing will close safely." + _feedback.text = "data folder changed. straywild will close safely." get_tree().call_deferred("quit") else: _feedback.text = _data_root.error_message @@ -756,7 +756,7 @@ func _choose_identity_export(identity_type: String) -> void: _export_file_dialog.access = FileDialog.ACCESS_FILESYSTEM _export_file_dialog.use_native_dialog = false _export_file_dialog.filters = PackedStringArray([ - "*.nfidentity ; NETfishing identity backup", + "*.nfidentity ; straywild identity backup", ]) _export_file_dialog.file_selected.connect( _identity_export_file_selected @@ -786,7 +786,7 @@ func _choose_identity_import(identity_type: String) -> void: _backup_file_dialog.access = FileDialog.ACCESS_FILESYSTEM _backup_file_dialog.use_native_dialog = false _backup_file_dialog.filters = PackedStringArray([ - "*.nfidentity ; NETfishing identity backup", + "*.nfidentity ; straywild identity backup", ]) _backup_file_dialog.file_selected.connect( _identity_import_file_selected diff --git a/ui/title_credits_page.tscn b/ui/title_credits_page.tscn index 1fe54e0..2697ced 100644 --- a/ui/title_credits_page.tscn +++ b/ui/title_credits_page.tscn @@ -45,7 +45,7 @@ horizontal_alignment = 1 layout_mode = 2 theme_override_colors/font_color = Color(0.624, 0.812, 0.824, 1) theme_override_font_sizes/font_size = 18 -text = "NETfishing is created by Woofmeow" +text = "straywild is created by Woofmeow" horizontal_alignment = 1 [node name="Columns" type="HBoxContainer" parent="Paper/Margin/Layout"] diff --git a/ui/title_screen.gd b/ui/title_screen.gd index 07a61fd..3055e15 100644 --- a/ui/title_screen.gd +++ b/ui/title_screen.gd @@ -31,55 +31,18 @@ const SaveSlotsPageType = preload("res://ui/save_slots_page.gd") const CurrencyPresentationType = preload( "res://ui/currency_presentation.gd" ) -const DECORATIVE_FISH_TEXTURES: Array[Texture2D] = [ - preload("res://fish/species/bass/fish_bass_striped.png"), - preload("res://fish/species/bluegill/fish_bluegill.png"), - preload("res://fish/species/carp/fish_carp_common.png"), - preload("res://fish/species/sunfish/fish_sunfish.png"), -] -const DECORATIVE_BUBBLE_TEXTURES: Array[Texture2D] = [ - preload("res://ui/assets/title/bubbles/bubble1.png"), - preload("res://ui/assets/title/bubbles/bubble2.png"), - preload("res://ui/assets/title/bubbles/bubble3.png"), -] - -const FIRST_FISH_DELAY_MIN: float = 2.0 -const FIRST_FISH_DELAY_MAX: float = 5.0 -const NEXT_FISH_DELAY_MIN: float = 5.0 -const NEXT_FISH_DELAY_MAX: float = 12.0 -const CROSSING_DURATION_MIN: float = 8.0 -const CROSSING_DURATION_MAX: float = 16.0 -const FISH_LONGEST_SIDE_MIN: float = 120.0 -const FISH_LONGEST_SIDE_MAX: float = 210.0 -const FISH_EDGE_MARGIN: float = 24.0 -const BUBBLE_EVENT_DELAY_MIN: float = 4.0 -const BUBBLE_EVENT_DELAY_MAX: float = 10.0 -const BUBBLE_CLUSTER_DELAY_MIN: float = 0.25 -const BUBBLE_CLUSTER_DELAY_MAX: float = 0.65 -const BUBBLE_TRAVEL_DURATION_MIN: float = 7.0 -const BUBBLE_TRAVEL_DURATION_MAX: float = 14.0 -const BUBBLE_SCALE_MIN: float = 0.65 -const BUBBLE_SCALE_MAX: float = 1.15 -const BUBBLE_OPACITY_MIN: float = 0.55 -const BUBBLE_OPACITY_MAX: float = 0.90 -const BUBBLE_DRIFT_MIN: float = 10.0 -const BUBBLE_DRIFT_MAX: float = 45.0 -const BUBBLE_WOBBLE_MIN: float = 3.0 -const BUBBLE_WOBBLE_MAX: float = 9.0 -const BUBBLE_EDGE_MARGIN: float = 16.0 -const MAX_DECORATIVE_BUBBLES: int = 6 -const MAX_TRANSITION_BUBBLES: int = 30 -const LOGO_ASPECT_RATIO: float = 2560.0 / 760.0 +const LOGO_ASPECT_RATIO: float = 2560.0 / 480.0 const LOGO_WIDTH_FACTOR: float = 0.4784 const LOGO_MIN_WIDTH: float = 294.0 const LOGO_MAX_WIDTH: float = 662.0 const TITLE_HORIZONTAL_MARGIN: float = 48.0 const TITLE_DESKTOP_REFERENCE_SIZE: Vector2 = Vector2(1280.0, 720.0) const TITLE_COMPACT_REFERENCE_SIZE: Vector2 = Vector2(640.0, 480.0) -const BUBBLE_FIELD_MAX_WIDTH: float = 440.0 -const BUBBLE_FIELD_DESKTOP_HEIGHT: float = 318.0 +const BUBBLE_FIELD_MAX_WIDTH: float = 500.0 +const BUBBLE_FIELD_DESKTOP_HEIGHT: float = 360.0 const BUBBLE_FIELD_COMPACT_WIDTH: float = 294.0 const BUBBLE_FIELD_COMPACT_HEIGHT: float = 200.0 +const BUBBLE_FIELD_DESKTOP_OFFSET_Y: float = -10.0 const BUBBLE_COMPACT_HEIGHT_THRESHOLD: float = 560.0 const START_PROMPT_MIN_SCALE: float = 0.985 const START_PROMPT_MAX_SCALE: float = 1.015 @@ -87,6 +50,11 @@ const START_PROMPT_CYCLE_SECONDS: float = 3.0 const QUICK_MENU_ENTER_DURATION: float = 0.14 const QUICK_MENU_EXIT_DURATION: float = 0.10 const QUICK_MENU_ENTER_SCALE: float = 0.97 +const INTRO_PROMPT_FADE_DURATION: float = 0.24 +const INTRO_LOGO_FLOAT_DURATION: float = 0.72 +const INTRO_MENU_REVEAL_DELAY: float = 0.34 +const INTRO_MENU_REVEAL_DURATION: float = 0.30 +const INTRO_LOGO_CENTER_Y_RATIO: float = 0.43 signal new_game_requested(world_layout: StringName, world_seed: int) signal continue_game_requested @@ -113,6 +81,7 @@ enum ConfirmationAction { @onready var _quit_button: BubbleButtonType = %QuitButton @onready var _join_game_button: BubbleButtonType = %JoinGameButton @onready var _feedback_label: RichTextLabel = %FeedbackLabel +@onready var _continue_stats_drawer: RichTextLabel = %ContinueStatsDrawer @onready var _confirmation_page: TitleConfirmationBubblePageType = ( %ConfirmationPage ) @@ -121,11 +90,6 @@ enum ConfirmationAction { %TitlePresentationScaleRoot ) @onready var _background: ColorRect = %Background -@onready var _decorative_fish_layer: Control = %DecorativeFishLayer -@onready var _decorative_fish_timer: Timer = %DecorativeFishTimer -@onready var _decorative_bubble_layer: Control = %DecorativeBubbleLayer -@onready var _decorative_bubble_event_timer: Timer = %DecorativeBubbleEventTimer -@onready var _decorative_bubble_cluster_timer: Timer = %DecorativeBubbleClusterTimer @onready var _title_logo: TextureRect = %TitleLogo @onready var _playtest_label: Label = %PlaytestLabel @onready var _presentation_center: CenterContainer = %Center @@ -149,17 +113,6 @@ var _settings_manager: SettingsManagerType var _inspection: SaveInspectionType var _confirmation_action: ConfirmationAction = ConfirmationAction.NONE var _action_in_progress: bool = false -var _decorative_rng := RandomNumberGenerator.new() -var _decorative_fish: TextureRect -var _decorative_fish_tween: Tween -var _decorative_presentation_ready: bool = false -var _decorative_presentation_active: bool = false -var _decorative_generation: int = 0 -var _decorative_bubbles: Array[TextureRect] = [] -var _decorative_bubble_tweens: Dictionary[int, Tween] = {} -var _transition_bubble_ids: Dictionary[int, bool] = {} -var _pending_cluster_bubbles: int = 0 -var _minimal_presentation: bool = false var _awaiting_start_input: bool = false var _start_prompt_elapsed: float = 0.0 var _navigation_focus_active: bool = false @@ -219,27 +172,16 @@ func _ready() -> void: _settings_panel.closed.connect(_on_settings_closed) _settings_panel.closing.connect(_on_settings_closing) _settings_panel.opened.connect(_on_settings_opened) - _settings_panel.navigation_transition_started.connect( - _emit_navigation_bubble_flurry - ) _credits_page.back_requested.connect(_close_credits) _save_slots_page.back_requested.connect(_close_save_slots) _save_slots_page.play_requested.connect(_on_slot_play_requested) _save_slots_page.create_requested.connect(_on_new_slot_requested) _bubble_field.configure(_get_title_buttons()) - _bubble_field.motion_scale = 0.0 - _decorative_fish_timer.timeout.connect(_on_decorative_fish_timer_timeout) - _decorative_bubble_event_timer.timeout.connect( - _on_decorative_bubble_event_timer_timeout - ) - _decorative_bubble_cluster_timer.timeout.connect( - _on_decorative_bubble_cluster_timer_timeout - ) + _bubble_field.motion_scale = 1.0 visibility_changed.connect(_on_title_visibility_changed) resized.connect(_update_responsive_title_stage) get_window().size_changed.connect(_update_responsive_title_stage) _start_prompt_label.resized.connect(_update_start_prompt_pivot) - _decorative_rng.randomize() set_process(false) call_deferred("_update_responsive_title_stage") call_deferred("_update_start_prompt_pivot") @@ -269,19 +211,9 @@ func setup( Input.mouse_mode = Input.MOUSE_MODE_VISIBLE _refresh_save_inspection() show() - _decorative_presentation_ready = true - _start_decorative_presentation() _begin_title_entry() -func set_minimal_presentation(enabled: bool) -> void: - _minimal_presentation = enabled - if _minimal_presentation: - _stop_decorative_presentation() - elif visible: - _start_decorative_presentation() - - func reopen() -> void: _cancel_title_entry_transition() _cancel_title_settings_transition() @@ -295,7 +227,6 @@ func reopen() -> void: _save_slots_page.close_page() _refresh_save_inspection() show() - _start_decorative_presentation() _start_entry_prompt_animation() @@ -315,6 +246,8 @@ func reopen_to_menu() -> void: func open_join_game_page(endpoint: String = "") -> void: _cancel_title_entry_transition() _awaiting_start_input = false + _set_title_bubbles_interactive(false) + _release_primary_menu_focus() _start_prompt_center.hide() _presentation_center.hide() _settings_panel.hide() @@ -353,6 +286,7 @@ func _close_join_game() -> void: _presentation_center.show() _button_center.show() _start_prompt_center.hide() + _set_title_bubbles_interactive(true) _focus_initial_button() @@ -395,28 +329,6 @@ func is_awaiting_start_input() -> bool: return _awaiting_start_input -func is_decorative_presentation_active() -> bool: - return _decorative_presentation_active - - -func get_active_decorative_fish_count() -> int: - return 1 if is_instance_valid(_decorative_fish) else 0 - - -func get_active_decorative_bubble_count() -> int: - return _decorative_bubbles.size() - - -func is_decorative_bubble_scheduler_active() -> bool: - return ( - _decorative_presentation_active - and ( - not _decorative_bubble_event_timer.is_stopped() - or not _decorative_bubble_cluster_timer.is_stopped() - ) - ) - - func _update_title_layout() -> void: if not is_node_ready(): return @@ -464,6 +376,12 @@ func _update_title_layout() -> void: Vector2(field_width, field_height), compact_layout ) + _bubble_field.position = Vector2( + 0.0, + BUBBLE_FIELD_DESKTOP_OFFSET_Y + * field_height + / BUBBLE_FIELD_DESKTOP_HEIGHT, + ) _configure_title_controller_navigation() if not _title_settings_transition_active: call_deferred("_capture_title_bubble_rest_position") @@ -520,12 +438,6 @@ func _update_world_preview_resolution() -> void: _world_pixel_size, displayed_size ) - var shader_material := _background.material as ShaderMaterial - if shader_material != null: - shader_material.set_shader_parameter( - "virtual_pixel_density", - Vector2(grid_size) - ) var logo_material := _title_logo.material as ShaderMaterial if logo_material != null: var render_scale: float = ( @@ -542,23 +454,6 @@ func _update_world_preview_resolution() -> void: ) -func _snap_world_preview(value: Vector2) -> Vector2: - var displayed_size := Vector2i( - maxi(1, roundi(size.x)), - maxi(1, roundi(size.y)) - ) - var grid_size: Vector2i = PlayerSettings.get_world_grid_size( - _world_pixel_size, - displayed_size - ) - var render_scale: float = float(grid_size.y) / float(displayed_size.y) - var step: float = 1.0 / render_scale - return Vector2( - roundf(value.x / step) * step, - roundf(value.y / step) * step - ) - - func _process(delta: float) -> void: if not visible: return @@ -725,6 +620,9 @@ func _prepare_awaiting_start_input() -> void: _continue_stats_hovered = false _continue_stats_focused = false _cancel_continue_stats_fade() + _continue_stats_drawer.hide() + _continue_stats_drawer.modulate.a = 0.0 + _continue_stats_drawer.scale = Vector2(1.0, 0.001) _main_content.show() _start_prompt_center.show() _start_prompt_center.modulate.a = 1.0 @@ -775,7 +673,6 @@ func _reveal_primary_menu() -> void: _navigation_focus_active = false _release_title_focus() _bubble_motion_root.position = Vector2.ZERO - _branding_motion_root.position = Vector2.ZERO _bubble_field.pivot_offset = _bubble_field.size * 0.5 _bubble_field.scale = Vector2.ONE * QUICK_MENU_ENTER_SCALE _bubble_field.modulate.a = 0.0 @@ -784,20 +681,28 @@ func _reveal_primary_menu() -> void: _start_prompt_center, "modulate:a", 0.0, - QUICK_MENU_EXIT_DURATION + INTRO_PROMPT_FADE_DURATION ).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_IN) + _title_entry_transition.tween_property( + _branding_motion_root, + "position", + Vector2.ZERO, + INTRO_LOGO_FLOAT_DURATION + ).set_trans(Tween.TRANS_CUBIC).set_ease(Tween.EASE_IN_OUT) _title_entry_transition.tween_property( _bubble_field, "scale", Vector2.ONE, - QUICK_MENU_ENTER_DURATION - ).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_OUT) + INTRO_MENU_REVEAL_DURATION + ).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_OUT).set_delay( + INTRO_MENU_REVEAL_DELAY + ) _title_entry_transition.tween_property( _bubble_field, "modulate:a", 1.0, - QUICK_MENU_ENTER_DURATION - ) + INTRO_MENU_REVEAL_DURATION + ).set_delay(INTRO_MENU_REVEAL_DELAY) _title_entry_transition.finished.connect( _finish_primary_menu_reveal.bind(generation), CONNECT_ONE_SHOT @@ -814,6 +719,7 @@ func _finish_primary_menu_reveal(generation: int) -> void: _title_entry_transition_active = false _start_prompt_center.hide() _start_prompt_center.modulate.a = 1.0 + _branding_motion_root.position = Vector2.ZERO _bubble_field.scale = Vector2.ONE _bubble_field.modulate.a = 1.0 _feedback_label.modulate.a = 0.0 @@ -855,10 +761,18 @@ func _prepare_intro_presentation(generation: int) -> void: return _branding_motion_root.size = _branding_slot.size _bubble_motion_root.size = _bubble_layout_slot.size - _branding_motion_root.position = Vector2.ZERO _bubble_motion_root.position = Vector2.ZERO _title_content_rest_position = _presentation_center.position _title_bubble_rest_position = _bubble_field.position + var branding_rect: Rect2 = _get_title_stage_rect(_branding_slot) + var desired_branding_center_y: float = ( + _title_presentation_scale_root.size.y + * INTRO_LOGO_CENTER_Y_RATIO + ) + _branding_motion_root.position = Vector2( + 0.0, + desired_branding_center_y - branding_rect.get_center().y, + ) _intro_geometry_ready = true @@ -908,7 +822,7 @@ func _update_continue_stats_visibility() -> void: and _presentation_center.visible ) if requested_visible: - _feedback_label.text = _get_continue_stats_text() + _continue_stats_drawer.text = _get_continue_stats_text() _fade_continue_stats_to(1.0 if requested_visible else 0.0) @@ -922,16 +836,47 @@ func _fade_continue_stats_to(target_opacity: float) -> void: if not is_node_ready(): return _cancel_continue_stats_fade() - if is_equal_approx(_feedback_label.modulate.a, target_opacity): - _feedback_label.modulate.a = target_opacity + var target_scale := Vector2( + 1.0, + 1.0 if target_opacity > 0.0 else 0.001, + ) + if target_opacity > 0.0: + _continue_stats_drawer.show() + if ( + is_equal_approx( + _continue_stats_drawer.modulate.a, + target_opacity, + ) + and _continue_stats_drawer.scale.is_equal_approx(target_scale) + ): + _continue_stats_drawer.modulate.a = target_opacity + _continue_stats_drawer.scale = target_scale + if target_opacity <= 0.0: + _continue_stats_drawer.hide() return - _continue_stats_fade = create_tween() + _continue_stats_fade = create_tween().set_parallel(true) _continue_stats_fade.tween_property( - _feedback_label, + _continue_stats_drawer, "modulate:a", target_opacity, QUICK_MENU_ENTER_DURATION ).set_trans(Tween.TRANS_CUBIC).set_ease(Tween.EASE_IN_OUT) + _continue_stats_fade.tween_property( + _continue_stats_drawer, + "scale", + target_scale, + QUICK_MENU_ENTER_DURATION + ).set_trans(Tween.TRANS_CUBIC).set_ease(Tween.EASE_IN_OUT) + if target_opacity <= 0.0: + _continue_stats_fade.chain().tween_callback( + _finish_continue_stats_hide + ) + + +func _finish_continue_stats_hide() -> void: + _continue_stats_fade = null + if _continue_stats_drawer.modulate.a <= 0.001: + _continue_stats_drawer.hide() func _cancel_continue_stats_fade() -> void: @@ -1180,7 +1125,6 @@ func _begin_confirmation_open() -> void: _confirmation_transition_generation += 1 _cancel_confirmation_transition() _confirmation_transition_active = true - _emit_navigation_bubble_flurry() _confirmation_title_content_rest_position = _presentation_center.position _set_confirmation_stage_rect() _confirmation_page.hide_page() @@ -1238,7 +1182,6 @@ func _begin_confirmation_return() -> void: _confirmation_transition_generation += 1 _cancel_confirmation_transition() _confirmation_transition_active = true - _emit_navigation_bubble_flurry() _confirmation_page.lock_interaction() var generation: int = _confirmation_transition_generation _confirmation_page.transition_out( @@ -1375,7 +1318,6 @@ func _begin_title_cluster_exit() -> void: _title_settings_transition_generation += 1 _cancel_title_settings_tween() _title_settings_transition_active = true - _emit_navigation_bubble_flurry() _title_content_rest_position = _presentation_center.position _title_bubble_rest_position = _bubble_field.position _set_title_bubbles_interactive(false) @@ -1475,6 +1417,8 @@ func _finish_title_cluster_return(generation: int) -> void: func _set_title_bubbles_interactive(interactive: bool) -> void: for bubble: BubbleButton in _get_title_buttons(): + if not interactive: + bubble.reset_hover_presentation() bubble.focus_mode = ( Control.FOCUS_ALL if interactive else Control.FOCUS_NONE ) @@ -1491,21 +1435,39 @@ func _configure_title_controller_navigation() -> void: ControllerFocusNavigationType.configure_spatial_neighbors( _get_title_buttons() ) - # The large Play bubble overlaps the inward edge of every surrounding - # bubble. Center-only spatial scoring otherwise links the four outside - # bubbles into a ring with no route back into Play. - _join_game_button.focus_neighbor_right = ( + _play_button.focus_neighbor_right = ( + _play_button.get_path_to(_join_game_button) + ) + _join_game_button.focus_neighbor_left = ( _join_game_button.get_path_to(_play_button) ) + _join_game_button.focus_neighbor_bottom = ( + _join_game_button.get_path_to(_settings_button) + ) _settings_button.focus_neighbor_left = ( _settings_button.get_path_to(_play_button) ) - _credits_button.focus_neighbor_right = ( + _settings_button.focus_neighbor_top = ( + _settings_button.get_path_to(_join_game_button) + ) + _settings_button.focus_neighbor_bottom = ( + _settings_button.get_path_to(_credits_button) + ) + _credits_button.focus_neighbor_left = ( _credits_button.get_path_to(_play_button) ) + _credits_button.focus_neighbor_top = ( + _credits_button.get_path_to(_settings_button) + ) + _credits_button.focus_neighbor_bottom = ( + _credits_button.get_path_to(_quit_button) + ) _quit_button.focus_neighbor_left = ( _quit_button.get_path_to(_play_button) ) + _quit_button.focus_neighbor_top = ( + _quit_button.get_path_to(_credits_button) + ) func _capture_title_bubble_rest_position() -> void: @@ -1575,7 +1537,7 @@ func _refresh_save_inspection() -> void: _delete_button.disabled = not _inspection.can_delete() _feedback_label.text = _center_feedback_text(_inspection.message) if _inspection.status == SaveInspectionType.Status.VALID_SUPPORTED: - _feedback_label.text = _get_continue_stats_text() + _continue_stats_drawer.text = _get_continue_stats_text() if not _inspection.can_continue(): _hide_continue_stats_context() else: @@ -1609,11 +1571,8 @@ func _on_quit_pressed() -> void: func _on_title_visibility_changed() -> void: - if not _decorative_presentation_ready: - return if visible: set_process(true) - _start_decorative_presentation() else: _hide_continue_stats_context() _stop_entry_prompt_animation() @@ -1621,482 +1580,3 @@ func _on_title_visibility_changed() -> void: _modal_restore_navigation_focus = false _reset_confirmation() _credits_page.close_page() - _stop_decorative_presentation() - - -func _start_decorative_presentation() -> void: - if ( - not _decorative_presentation_ready - or not visible - or _decorative_presentation_active - or _minimal_presentation - ): - return - _decorative_generation += 1 - _decorative_presentation_active = true - _schedule_next_decorative_fish( - FIRST_FISH_DELAY_MIN, - FIRST_FISH_DELAY_MAX - ) - _schedule_next_decorative_bubble_event( - BUBBLE_EVENT_DELAY_MIN, - BUBBLE_EVENT_DELAY_MAX - ) - - -func _stop_decorative_presentation() -> void: - _decorative_generation += 1 - _decorative_presentation_active = false - _decorative_fish_timer.stop() - if _decorative_fish_tween != null: - _decorative_fish_tween.kill() - _decorative_fish_tween = null - if is_instance_valid(_decorative_fish): - _decorative_fish.queue_free() - _decorative_fish = null - _decorative_bubble_event_timer.stop() - _decorative_bubble_cluster_timer.stop() - _pending_cluster_bubbles = 0 - for bubble_tween: Tween in _decorative_bubble_tweens.values(): - if bubble_tween != null: - bubble_tween.kill() - _decorative_bubble_tweens.clear() - for bubble: TextureRect in _decorative_bubbles: - if is_instance_valid(bubble): - bubble.queue_free() - _decorative_bubbles.clear() - _transition_bubble_ids.clear() - - -func _schedule_next_decorative_fish( - minimum_delay: float, - maximum_delay: float, -) -> void: - if not _decorative_presentation_active or not visible: - return - _decorative_fish_timer.start( - _decorative_rng.randf_range(minimum_delay, maximum_delay) - ) - - -func _on_decorative_fish_timer_timeout() -> void: - if ( - not _decorative_presentation_active - or not visible - or is_instance_valid(_decorative_fish) - ): - return - _spawn_decorative_fish(_decorative_generation) - - -func _spawn_decorative_fish(generation: int) -> void: - if ( - generation != _decorative_generation - or not _decorative_presentation_active - or not visible - or DECORATIVE_FISH_TEXTURES.is_empty() - ): - return - var layer_size: Vector2 = _decorative_fish_layer.size - if layer_size.x <= 1.0 or layer_size.y <= 1.0: - _schedule_next_decorative_fish(0.5, 1.0) - return - var texture: Texture2D = DECORATIVE_FISH_TEXTURES[ - _decorative_rng.randi_range(0, DECORATIVE_FISH_TEXTURES.size() - 1) - ] - var source_size: Vector2 = texture.get_size() - if source_size.x <= 0.0 or source_size.y <= 0.0: - _schedule_next_decorative_fish( - NEXT_FISH_DELAY_MIN, - NEXT_FISH_DELAY_MAX - ) - return - var longest_side: float = _decorative_rng.randf_range( - FISH_LONGEST_SIDE_MIN, - FISH_LONGEST_SIDE_MAX - ) - var presentation_scale: float = longest_side / maxf( - source_size.x, - source_size.y - ) - var presentation_size: Vector2 = source_size * presentation_scale - var fish_control := TextureRect.new() - fish_control.name = "DecorativeFish" - fish_control.texture = texture - fish_control.expand_mode = TextureRect.EXPAND_IGNORE_SIZE - fish_control.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED - fish_control.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST - fish_control.mouse_filter = Control.MOUSE_FILTER_IGNORE - fish_control.custom_minimum_size = presentation_size - fish_control.size = presentation_size - fish_control.modulate.a = 0.46 - - var direction: float = ( - 1.0 - if _decorative_rng.randi_range(0, 1) == 1 - else -1.0 - ) - fish_control.flip_h = direction > 0.0 - var minimum_y: float = maxf(24.0, layer_size.y * 0.08) - var maximum_y: float = maxf( - minimum_y, - layer_size.y - presentation_size.y - maxf(24.0, layer_size.y * 0.08) - ) - var base_y: float = _decorative_rng.randf_range(minimum_y, maximum_y) - var bob_amplitude: float = _decorative_rng.randf_range(3.0, 8.0) - var bob_speed: float = _decorative_rng.randf_range(0.65, 1.15) - var crossing_duration: float = _decorative_rng.randf_range( - CROSSING_DURATION_MIN, - CROSSING_DURATION_MAX - ) - var horizontal_bounds: Vector2 = get_decorative_fish_crossing_bounds( - layer_size.x, - presentation_size.x, - direction, - ) - fish_control.position = Vector2(horizontal_bounds.x, base_y) - _decorative_fish_layer.add_child(fish_control) - _decorative_fish = fish_control - _decorative_fish_tween = create_tween() - _decorative_fish_tween.tween_method( - _update_decorative_fish.bind( - fish_control, - direction, - base_y, - bob_amplitude, - bob_speed, - crossing_duration, - generation - ), - 0.0, - 1.0, - crossing_duration - ) - _decorative_fish_tween.finished.connect( - _on_decorative_fish_finished.bind(fish_control, generation), - CONNECT_ONE_SHOT - ) - - -func _update_decorative_fish( - progress: float, - fish_control: TextureRect, - direction: float, - base_y: float, - bob_amplitude: float, - bob_speed: float, - crossing_duration: float, - generation: int, -) -> void: - if ( - generation != _decorative_generation - or not _decorative_presentation_active - or not is_instance_valid(fish_control) - ): - return - var horizontal_bounds: Vector2 = get_decorative_fish_crossing_bounds( - _decorative_fish_layer.size.x, - fish_control.size.x, - direction, - ) - fish_control.position.x = lerpf( - horizontal_bounds.x, horizontal_bounds.y, progress - ) - var bobbed_y: float = ( - base_y - + sin(progress * crossing_duration * bob_speed) * bob_amplitude - ) - fish_control.position.y = clampf( - bobbed_y, - 8.0, - maxf(8.0, _decorative_fish_layer.size.y - fish_control.size.y - 8.0) - ) - fish_control.position = _snap_world_preview(fish_control.position) - - -static func get_decorative_fish_crossing_bounds( - layer_width: float, - fish_width: float, - direction: float, -) -> Vector2: - var outside_left: float = -fish_width - FISH_EDGE_MARGIN - var outside_right: float = layer_width + FISH_EDGE_MARGIN - return ( - Vector2(outside_left, outside_right) - if direction > 0.0 - else Vector2(outside_right, outside_left) - ) - - -func _on_decorative_fish_finished( - fish_control: TextureRect, - generation: int, -) -> void: - if generation != _decorative_generation: - return - _decorative_fish_tween = null - if is_instance_valid(fish_control): - fish_control.queue_free() - if _decorative_fish == fish_control: - _decorative_fish = null - _schedule_next_decorative_fish( - NEXT_FISH_DELAY_MIN, - NEXT_FISH_DELAY_MAX - ) - - -func _schedule_next_decorative_bubble_event( - minimum_delay: float, - maximum_delay: float, -) -> void: - if not _decorative_presentation_active or not visible: - return - _decorative_bubble_event_timer.start( - _decorative_rng.randf_range(minimum_delay, maximum_delay) - ) - - -func _on_decorative_bubble_event_timer_timeout() -> void: - if not _decorative_presentation_active or not visible: - return - var available_slots: int = ( - MAX_DECORATIVE_BUBBLES - _get_idle_decorative_bubble_count() - ) - if available_slots <= 0: - _schedule_next_decorative_bubble_event( - BUBBLE_EVENT_DELAY_MIN, - BUBBLE_EVENT_DELAY_MAX - ) - return - var event_size: int = _choose_decorative_bubble_event_size() - event_size = mini(event_size, available_slots) - if not _spawn_decorative_bubble(_decorative_generation): - _schedule_next_decorative_bubble_event(0.5, 1.0) - return - _pending_cluster_bubbles = event_size - 1 - if _pending_cluster_bubbles > 0: - _start_decorative_bubble_cluster_timer() - else: - _schedule_next_decorative_bubble_event( - BUBBLE_EVENT_DELAY_MIN, - BUBBLE_EVENT_DELAY_MAX - ) - - -func _choose_decorative_bubble_event_size() -> int: - var roll: float = _decorative_rng.randf() - if roll < 0.75: - return 1 - if roll < 0.95: - return 2 - return 3 - - -func _start_decorative_bubble_cluster_timer() -> void: - _decorative_bubble_cluster_timer.start( - _decorative_rng.randf_range( - BUBBLE_CLUSTER_DELAY_MIN, - BUBBLE_CLUSTER_DELAY_MAX - ) - ) - - -func _on_decorative_bubble_cluster_timer_timeout() -> void: - if ( - not _decorative_presentation_active - or not visible - or _pending_cluster_bubbles <= 0 - ): - _pending_cluster_bubbles = 0 - return - if _get_idle_decorative_bubble_count() < MAX_DECORATIVE_BUBBLES: - _spawn_decorative_bubble(_decorative_generation) - _pending_cluster_bubbles -= 1 - if _pending_cluster_bubbles > 0: - _start_decorative_bubble_cluster_timer() - else: - _schedule_next_decorative_bubble_event( - BUBBLE_EVENT_DELAY_MIN, - BUBBLE_EVENT_DELAY_MAX - ) - - -func _spawn_decorative_bubble( - generation: int, - start_y_ratio: float = -1.0, - normalized_x_override: float = -1.0, - is_transition_bubble: bool = false, -) -> bool: - if ( - generation != _decorative_generation - or not _decorative_presentation_active - or not visible - or DECORATIVE_BUBBLE_TEXTURES.is_empty() - ): - return false - if is_transition_bubble: - if _transition_bubble_ids.size() >= MAX_TRANSITION_BUBBLES: - return false - elif _get_idle_decorative_bubble_count() >= MAX_DECORATIVE_BUBBLES: - return false - var layer_size: Vector2 = _decorative_bubble_layer.size - if layer_size.x <= 1.0 or layer_size.y <= 1.0: - return false - var texture: Texture2D = DECORATIVE_BUBBLE_TEXTURES[ - _decorative_rng.randi_range( - 0, - DECORATIVE_BUBBLE_TEXTURES.size() - 1 - ) - ] - var presentation_scale: float = _decorative_rng.randf_range( - BUBBLE_SCALE_MIN, - BUBBLE_SCALE_MAX - ) - var presentation_size: Vector2 = texture.get_size() * presentation_scale - var bubble := TextureRect.new() - bubble.name = "DecorativeBubble" - bubble.texture = texture - bubble.expand_mode = TextureRect.EXPAND_IGNORE_SIZE - bubble.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED - bubble.texture_filter = CanvasItem.TEXTURE_FILTER_NEAREST - bubble.mouse_filter = Control.MOUSE_FILTER_IGNORE - bubble.size = presentation_size - bubble.modulate.a = _decorative_rng.randf_range( - BUBBLE_OPACITY_MIN, - BUBBLE_OPACITY_MAX - ) - _decorative_bubble_layer.add_child(bubble) - _decorative_bubbles.append(bubble) - if is_transition_bubble: - _transition_bubble_ids[bubble.get_instance_id()] = true - - var normalized_x: float = normalized_x_override - if normalized_x < 0.0: - normalized_x = _decorative_rng.randf_range(0.08, 0.92) - var drift_direction: float = ( - 1.0 if _decorative_rng.randi_range(0, 1) == 1 else -1.0 - ) - var horizontal_drift: float = ( - _decorative_rng.randf_range( - BUBBLE_DRIFT_MIN, - BUBBLE_DRIFT_MAX - ) - * drift_direction - ) - var wobble_amplitude: float = _decorative_rng.randf_range( - BUBBLE_WOBBLE_MIN, - BUBBLE_WOBBLE_MAX - ) - var wobble_cycles: float = _decorative_rng.randf_range(0.8, 1.6) - var wobble_phase: float = _decorative_rng.randf_range(0.0, TAU) - var travel_duration: float = _decorative_rng.randf_range( - BUBBLE_TRAVEL_DURATION_MIN, - BUBBLE_TRAVEL_DURATION_MAX - ) - if start_y_ratio >= 0.0: - var full_start_y: float = ( - layer_size.y + presentation_size.y + BUBBLE_EDGE_MARGIN - ) - var end_y: float = -presentation_size.y - BUBBLE_EDGE_MARGIN - var burst_start_y: float = ( - start_y_ratio * layer_size.y - presentation_size.y * 0.5 - ) - var remaining_distance: float = maxf(burst_start_y - end_y, 1.0) - var full_distance: float = maxf(full_start_y - end_y, 1.0) - travel_duration *= remaining_distance / full_distance - _update_decorative_bubble( - 0.0, - bubble, - normalized_x, - horizontal_drift, - wobble_amplitude, - wobble_cycles, - wobble_phase, - start_y_ratio, - generation - ) - var bubble_tween: Tween = create_tween() - _decorative_bubble_tweens[bubble.get_instance_id()] = bubble_tween - bubble_tween.tween_method( - _update_decorative_bubble.bind( - bubble, - normalized_x, - horizontal_drift, - wobble_amplitude, - wobble_cycles, - wobble_phase, - start_y_ratio, - generation - ), - 0.0, - 1.0, - travel_duration - ) - bubble_tween.finished.connect( - _on_decorative_bubble_finished.bind(bubble, generation), - CONNECT_ONE_SHOT - ) - return true - - -func _update_decorative_bubble( - progress: float, - bubble: TextureRect, - normalized_x: float, - horizontal_drift: float, - wobble_amplitude: float, - wobble_cycles: float, - wobble_phase: float, - start_y_ratio: float, - generation: int, -) -> void: - if ( - generation != _decorative_generation - or not _decorative_presentation_active - or not is_instance_valid(bubble) - ): - return - var layer_size: Vector2 = _decorative_bubble_layer.size - var start_y: float = ( - layer_size.y + bubble.size.y + BUBBLE_EDGE_MARGIN - ) - if start_y_ratio >= 0.0: - start_y = start_y_ratio * layer_size.y - bubble.size.y * 0.5 - var end_y: float = -bubble.size.y - BUBBLE_EDGE_MARGIN - var base_x: float = normalized_x * layer_size.x - var wobble: float = sin( - wobble_phase + progress * TAU * wobble_cycles - ) * wobble_amplitude - bubble.position = _snap_world_preview(Vector2( - base_x - + horizontal_drift * progress - + wobble - - bubble.size.x * 0.5, - lerpf(start_y, end_y, progress) - )) - - -func _on_decorative_bubble_finished( - bubble: TextureRect, - generation: int, -) -> void: - if generation != _decorative_generation: - return - if is_instance_valid(bubble): - _decorative_bubble_tweens.erase(bubble.get_instance_id()) - _transition_bubble_ids.erase(bubble.get_instance_id()) - _decorative_bubbles.erase(bubble) - bubble.queue_free() - - -func _get_idle_decorative_bubble_count() -> int: - return _decorative_bubbles.size() - _transition_bubble_ids.size() - - -func _emit_navigation_bubble_flurry() -> void: - # Page changes now use a quick fade and scale without travel bubbles. - pass - - -func _exit_tree() -> void: - _stop_decorative_presentation() diff --git a/ui/title_screen.tscn b/ui/title_screen.tscn index 4d02718..1888db9 100644 --- a/ui/title_screen.tscn +++ b/ui/title_screen.tscn @@ -1,29 +1,36 @@ -[gd_scene load_steps=25 format=3] +[gd_scene load_steps=28 format=3] [ext_resource type="Script" path="res://ui/title_screen.gd" id="1_script"] [ext_resource type="Theme" path="res://ui/game_theme.tres" id="2_theme"] [ext_resource type="PackedScene" path="res://ui/settings_panel.tscn" id="3_settings"] -[ext_resource type="Shader" path="res://ui/title_water_background.gdshader" id="4_water_shader"] -[ext_resource type="Texture2D" path="res://ui/assets/title/netfishing_logo.png" id="5_logo"] +[ext_resource type="Shader" path="res://ui/player_menu_pattern.gdshader" id="4_grass_shader"] +[ext_resource type="Texture2D" path="res://ui/assets/title/straywild_logo.png" id="5_logo"] [ext_resource type="Shader" path="res://ui/title_logo_underwater.gdshader" id="6_logo_shader"] [ext_resource type="Script" path="res://ui/components/bubble_menu/bubble_button.gd" id="7_bubble_button"] [ext_resource type="Script" path="res://ui/components/bubble_menu/bubble_cluster.gd" id="8_bubble_cluster"] [ext_resource type="Resource" path="res://ui/components/bubble_menu/bubble_menu_profile.tres" id="9_bubble_profile"] [ext_resource type="PackedScene" path="res://ui/title_confirmation_bubble_page.tscn" id="10_confirmation_page"] [ext_resource type="PackedScene" path="res://ui/network/join_game_page.tscn" id="11_join_page"] -[ext_resource type="Texture2D" path="res://ui/icons/pictograms/online_dark.png" id="12_online_dark"] -[ext_resource type="Texture2D" path="res://ui/icons/pictograms/settings_dark.png" id="13_settings_dark"] -[ext_resource type="Texture2D" path="res://ui/icons/pictograms/x_dark.png" id="14_x_dark"] +[ext_resource type="Texture2D" path="res://ui/icons/new_menu/online.png" id="12_online_dark"] +[ext_resource type="Texture2D" path="res://ui/icons/new_menu/settings.png" id="13_settings_dark"] +[ext_resource type="Texture2D" path="res://ui/icons/new_menu/close.png" id="14_x_dark"] [ext_resource type="PackedScene" path="res://ui/title_credits_page.tscn" id="15_credits_page"] -[ext_resource type="Texture2D" path="res://ui/icons/main_menu/continue.png" id="16_continue"] +[ext_resource type="Texture2D" path="res://ui/icons/new_menu/play.png" id="16_continue"] [ext_resource type="Texture2D" path="res://ui/icons/main_menu/new_game.png" id="17_new_game"] -[ext_resource type="Texture2D" path="res://ui/icons/main_menu/credits.png" id="18_credits"] +[ext_resource type="Texture2D" path="res://ui/icons/new_menu/credits.png" id="18_credits"] [ext_resource type="Texture2D" path="res://ui/icons/main_menu/delete_save.png" id="19_delete_save"] [ext_resource type="PackedScene" path="res://ui/new_game_setup_page.tscn" id="20_new_game_setup"] [ext_resource type="PackedScene" path="res://ui/save_slots_page.tscn" id="21_save_slots"] +[ext_resource type="Texture2D" path="res://world/generation/chunks/assets/chunk_0000_grass_lite.png" id="22_grass_pattern"] +[ext_resource type="Resource" path="res://ui/components/bubble_menu/title_menu_profile.tres" id="23_title_menu_profile"] +[ext_resource type="Resource" path="res://ui/components/bubble_menu/title_secondary_menu_profile.tres" id="24_title_secondary_menu_profile"] -[sub_resource type="ShaderMaterial" id="ShaderMaterial_title_water"] -shader = ExtResource("4_water_shader") +[sub_resource type="ShaderMaterial" id="ShaderMaterial_title_grass"] +shader = ExtResource("4_grass_shader") +shader_parameter/pattern_texture = ExtResource("22_grass_pattern") +shader_parameter/source_tile_size = Vector2(128, 128) +shader_parameter/display_scale = 1.0 +shader_parameter/scroll_velocity_pixels = Vector2(-7.5, -7.5) [sub_resource type="ShaderMaterial" id="ShaderMaterial_title_logo"] shader = ExtResource("6_logo_shader") @@ -39,6 +46,17 @@ corner_radius_top_right = 14 corner_radius_bottom_right = 14 corner_radius_bottom_left = 14 +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_continue_stats_drawer"] +content_margin_left = 10.0 +content_margin_top = 18.0 +content_margin_right = 10.0 +content_margin_bottom = 2.0 +bg_color = Color(0.031, 0.122, 0.169, 1) +corner_radius_top_left = 14 +corner_radius_top_right = 14 +corner_radius_bottom_right = 14 +corner_radius_bottom_left = 14 + [node name="TitleScreen" type="Control"] unique_name_in_owner = true z_index = 200 @@ -55,7 +73,7 @@ script = ExtResource("1_script") [node name="Background" type="ColorRect" parent="."] unique_name_in_owner = true visible = false -material = SubResource("ShaderMaterial_title_water") +material = SubResource("ShaderMaterial_title_grass") layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -64,42 +82,6 @@ grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 -[node name="DecorativeFishLayer" type="Control" parent="."] -unique_name_in_owner = true -z_index = 1 -clip_contents = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 2 - -[node name="DecorativeFishTimer" type="Timer" parent="."] -unique_name_in_owner = true -one_shot = true - -[node name="DecorativeBubbleLayer" type="Control" parent="."] -unique_name_in_owner = true -z_index = 2 -clip_contents = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 2 - -[node name="DecorativeBubbleEventTimer" type="Timer" parent="."] -unique_name_in_owner = true -one_shot = true - -[node name="DecorativeBubbleClusterTimer" type="Timer" parent="."] -unique_name_in_owner = true -one_shot = true - [node name="ResponsiveTitleStage" type="Control" parent="."] unique_name_in_owner = true z_index = 10 @@ -122,13 +104,13 @@ mouse_filter = 1 unique_name_in_owner = true z_index = 12 layout_mode = 1 -anchor_top = 1.0 +anchor_top = 0.5 anchor_right = 1.0 -anchor_bottom = 1.0 -offset_top = -104.0 -offset_bottom = -48.0 +anchor_bottom = 0.5 +offset_top = 45.0 +offset_bottom = 101.0 grow_horizontal = 2 -grow_vertical = 0 +grow_vertical = 2 mouse_filter = 2 [node name="StartPromptLabel" type="Label" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/StartPromptCenter"] @@ -136,8 +118,6 @@ unique_name_in_owner = true layout_mode = 2 mouse_filter = 2 theme_override_colors/font_color = Color(1, 1, 1, 1) -theme_override_colors/font_outline_color = Color(0.02, 0.075, 0.11, 0.9) -theme_override_constants/outline_size = 3 theme_override_font_sizes/font_size = 39 text = "press any key to start" horizontal_alignment = 1 @@ -202,27 +182,33 @@ texture = ExtResource("5_logo") expand_mode = 1 stretch_mode = 5 -[node name="VersionRow" type="Control" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent/BrandingSlot/BrandingMotionRoot/BrandingContent"] +[node name="VersionRow" type="Control" parent="ResponsiveTitleStage/TitlePresentationScaleRoot"] unique_name_in_owner = true -custom_minimum_size = Vector2(0, 18) -layout_mode = 2 +z_index = 12 +custom_minimum_size = Vector2(280, 28) +layout_mode = 1 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -140.0 +offset_top = -38.0 +offset_right = 140.0 +offset_bottom = -10.0 +grow_horizontal = 2 +grow_vertical = 0 mouse_filter = 2 -[node name="VersionAnchor" type="CenterContainer" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent/BrandingSlot/BrandingMotionRoot/BrandingContent/VersionRow"] +[node name="VersionAnchor" type="CenterContainer" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/VersionRow"] layout_mode = 1 -anchor_left = 0.7 -anchor_top = 0.5 -anchor_right = 0.7 -anchor_bottom = 0.5 -offset_left = -140.0 -offset_top = -17.0 -offset_right = 140.0 -offset_bottom = 11.0 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 -[node name="PlaytestLabel" type="Label" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent/BrandingSlot/BrandingMotionRoot/BrandingContent/VersionRow/VersionAnchor"] +[node name="PlaytestLabel" type="Label" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/VersionRow/VersionAnchor"] unique_name_in_owner = true layout_mode = 2 theme_override_colors/font_color = Color(0.682, 0.733, 0.761, 1) @@ -242,47 +228,75 @@ layout_mode = 2 [node name="BubbleLayoutSlot" type="Control" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent/ButtonCenter"] unique_name_in_owner = true -custom_minimum_size = Vector2(440, 318) +custom_minimum_size = Vector2(500, 360) layout_mode = 2 [node name="BubbleMotionRoot" type="Control" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent/ButtonCenter/BubbleLayoutSlot"] unique_name_in_owner = true layout_mode = 0 -offset_right = 440.0 -offset_bottom = 318.0 +offset_right = 500.0 +offset_bottom = 360.0 mouse_filter = 2 [node name="BubbleField" type="Control" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent/ButtonCenter/BubbleLayoutSlot/BubbleMotionRoot"] unique_name_in_owner = true -custom_minimum_size = Vector2(440, 318) +custom_minimum_size = Vector2(500, 360) layout_mode = 0 -offset_right = 440.0 -offset_bottom = 318.0 +offset_right = 500.0 +offset_top = -10.0 +offset_bottom = 350.0 script = ExtResource("8_bubble_cluster") -profile = ExtResource("9_bubble_profile") +profile = ExtResource("23_title_menu_profile") +desktop_reference_size = Vector2(500, 360) +collision_separation_enabled = false [node name="PlayButton" type="Button" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent/ButtonCenter/BubbleLayoutSlot/BubbleMotionRoot/BubbleField"] unique_name_in_owner = true -offset_left = 106.0 -offset_top = 71.0 -offset_right = 290.0 -offset_bottom = 249.0 +offset_left = 36.0 +offset_top = 30.0 +offset_right = 366.0 +offset_bottom = 360.0 texture_filter = 1 icon = ExtResource("16_continue") -tooltip_text = "play" -accessibility_name = "play" +accessibility_name = "play straywild" script = ExtResource("7_bubble_button") -profile = ExtResource("9_bubble_profile") -neutral_size = Vector2(184, 178) -desktop_anchor = Vector2(198, 160) -compact_anchor = Vector2(198, 164) -minimum_font_size = 19 -maximum_font_size = 30 -horizontal_amplitude = 1.8 -vertical_amplitude = 4.6 -motion_period = 5.8 -deformation_amplitude = 0.01 -deformation_period = 6.7 +profile = ExtResource("23_title_menu_profile") +neutral_size = Vector2(330, 330) +desktop_anchor = Vector2(201, 195) +compact_anchor = Vector2(201, 195) +minimum_font_size = 28 +maximum_font_size = 36 +icon_fill_ratio_override = 0.9 +horizontal_amplitude = 0.0 +vertical_amplitude = 0.0 +deformation_amplitude = 0.0 +hover_wiggle_amplitude = Vector2(7, 6) +hover_wiggle_period = 3.8 +hover_drawer_text = "play straywild" +hover_drawer_mode = 1 +elliptical_hit_area = false + +[node name="ContinueStatsDrawer" type="RichTextLabel" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent/ButtonCenter/BubbleLayoutSlot/BubbleMotionRoot/BubbleField/PlayButton"] +unique_name_in_owner = true +show_behind_parent = true +z_index = -1 +visible = false +layout_mode = 0 +offset_left = 22.0 +offset_top = 314.0 +offset_right = 308.0 +offset_bottom = 360.0 +pivot_offset = Vector2(143, 0) +scale = Vector2(1, 0.001) +mouse_filter = 2 +theme_override_font_sizes/normal_font_size = 15 +text = "" +bbcode_enabled = true +scroll_active = false +autowrap_mode = 2 +horizontal_alignment = 1 +vertical_alignment = 1 +theme_override_styles/normal = SubResource("StyleBoxFlat_continue_stats_drawer") [node name="NewGameButton" type="Button" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent/ButtonCenter/BubbleLayoutSlot/BubbleMotionRoot/BubbleField"] unique_name_in_owner = true @@ -313,75 +327,75 @@ deformation_period = 5.9 [node name="SettingsButton" type="Button" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent/ButtonCenter/BubbleLayoutSlot/BubbleMotionRoot/BubbleField"] unique_name_in_owner = true -offset_left = 254.0 -offset_top = 12.0 -offset_right = 374.0 -offset_bottom = 128.0 +offset_left = 384.0 +offset_top = 116.0 +offset_right = 456.0 +offset_bottom = 188.0 texture_filter = 1 icon = ExtResource("13_settings_dark") -tooltip_text = "settings" accessibility_name = "settings" script = ExtResource("7_bubble_button") -profile = ExtResource("9_bubble_profile") -desktop_anchor = Vector2(314, 70) -compact_anchor = Vector2(333, 75) -compact_minimum_size = Vector2(94, 90) +profile = ExtResource("24_title_secondary_menu_profile") +neutral_size = Vector2(72, 72) +desktop_anchor = Vector2(420, 152) +compact_anchor = Vector2(420, 152) minimum_font_size = 15 -maximum_font_size = 22 -vertical_amplitude = 3.7 -motion_period = 4.9 -motion_phase = 2.5 -deformation_period = 6.3 +maximum_font_size = 20 +horizontal_amplitude = 0.0 +vertical_amplitude = 0.0 +deformation_amplitude = 0.0 +hover_wiggle_amplitude = Vector2(2.4, 1.2) +hover_wiggle_period = 1.9 +hover_drawer_text = "settings" +elliptical_hit_area = false [node name="CreditsButton" type="Button" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent/ButtonCenter/BubbleLayoutSlot/BubbleMotionRoot/BubbleField"] unique_name_in_owner = true -offset_left = 54.0 -offset_top = 209.0 -offset_right = 138.0 -offset_bottom = 291.0 +offset_left = 384.0 +offset_top = 202.0 +offset_right = 456.0 +offset_bottom = 274.0 texture_filter = 1 icon = ExtResource("18_credits") -tooltip_text = "credits" accessibility_name = "credits" script = ExtResource("7_bubble_button") -profile = ExtResource("9_bubble_profile") -neutral_size = Vector2(84, 82) -desktop_anchor = Vector2(96, 250) -compact_anchor = Vector2(82, 258) -compact_minimum_size = Vector2(62, 62) -minimum_font_size = 12 -maximum_font_size = 17 -horizontal_amplitude = 1.4 -vertical_amplitude = 3.0 -motion_period = 5.0 -motion_phase = 1.8 -deformation_amplitude = 0.015 -deformation_period = 5.6 +profile = ExtResource("24_title_secondary_menu_profile") +neutral_size = Vector2(72, 72) +desktop_anchor = Vector2(420, 238) +compact_anchor = Vector2(420, 238) +minimum_font_size = 15 +maximum_font_size = 20 +horizontal_amplitude = 0.0 +vertical_amplitude = 0.0 +deformation_amplitude = 0.0 +hover_wiggle_amplitude = Vector2(2.4, 1.2) +hover_wiggle_period = 1.9 +hover_drawer_text = "credits" +elliptical_hit_area = false [node name="JoinGameButton" type="Button" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent/ButtonCenter/BubbleLayoutSlot/BubbleMotionRoot/BubbleField"] unique_name_in_owner = true -offset_left = 21.0 -offset_top = 11.0 -offset_right = 143.0 -offset_bottom = 129.0 +offset_left = 384.0 +offset_top = 30.0 +offset_right = 456.0 +offset_bottom = 102.0 texture_filter = 1 icon = ExtResource("12_online_dark") -tooltip_text = "join game" -accessibility_name = "join game" +accessibility_name = "online" script = ExtResource("7_bubble_button") -profile = ExtResource("9_bubble_profile") -neutral_size = Vector2(122, 118) -desktop_anchor = Vector2(82, 70) -compact_anchor = Vector2(63, 75) -compact_minimum_size = Vector2(82, 80) +profile = ExtResource("24_title_secondary_menu_profile") +neutral_size = Vector2(72, 72) +desktop_anchor = Vector2(420, 66) +compact_anchor = Vector2(420, 66) minimum_font_size = 15 -maximum_font_size = 22 -horizontal_amplitude = 1.7 -vertical_amplitude = 3.8 -motion_period = 5.2 -motion_phase = 3.1 -deformation_amplitude = 0.015 -deformation_period = 5.7 +maximum_font_size = 20 +horizontal_amplitude = 0.0 +vertical_amplitude = 0.0 +deformation_amplitude = 0.0 +hover_wiggle_amplitude = Vector2(2.4, 1.2) +hover_wiggle_period = 1.9 +hover_drawer_text = "online" +elliptical_hit_area = false [node name="DeleteSaveButton" type="Button" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent/ButtonCenter/BubbleLayoutSlot/BubbleMotionRoot/BubbleField"] unique_name_in_owner = true @@ -411,35 +425,41 @@ deformation_period = 5.4 [node name="QuitButton" type="Button" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent/ButtonCenter/BubbleLayoutSlot/BubbleMotionRoot/BubbleField"] unique_name_in_owner = true -offset_left = 255.0 -offset_top = 204.0 -offset_right = 349.0 -offset_bottom = 296.0 +offset_left = 384.0 +offset_top = 288.0 +offset_right = 456.0 +offset_bottom = 360.0 texture_filter = 1 icon = ExtResource("14_x_dark") -tooltip_text = "quit" -accessibility_name = "quit" +accessibility_name = "close" script = ExtResource("7_bubble_button") -profile = ExtResource("9_bubble_profile") -neutral_size = Vector2(94, 92) -desktop_anchor = Vector2(302, 250) -compact_anchor = Vector2(317, 254) -compact_minimum_size = Vector2(68, 68) +profile = ExtResource("24_title_secondary_menu_profile") +neutral_size = Vector2(72, 72) +desktop_anchor = Vector2(420, 324) +compact_anchor = Vector2(420, 324) minimum_font_size = 14 -maximum_font_size = 18 -horizontal_amplitude = 1.4 -vertical_amplitude = 3.2 -motion_period = 4.2 -motion_phase = 4.8 -deformation_amplitude = 0.02 -deformation_period = 4.8 +maximum_font_size = 20 +horizontal_amplitude = 0.0 +vertical_amplitude = 0.0 +deformation_amplitude = 0.0 +hover_wiggle_amplitude = Vector2(2.4, 1.2) +hover_wiggle_period = 1.9 +hover_drawer_text = "close" +elliptical_hit_area = false -[node name="FeedbackLabel" type="RichTextLabel" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent"] +[node name="FeedbackLabel" type="RichTextLabel" parent="ResponsiveTitleStage/TitlePresentationScaleRoot"] unique_name_in_owner = true +z_index = 12 visible = false -custom_minimum_size = Vector2(430, 44) -layout_mode = 2 -size_flags_horizontal = 4 +custom_minimum_size = Vector2(500, 44) +layout_mode = 1 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = -250.0 +offset_top = 224.0 +offset_right = 250.0 +offset_bottom = 268.0 +grow_horizontal = 2 text = "" bbcode_enabled = true scroll_active = false diff --git a/ui/title_water_background.gdshader b/ui/title_water_background.gdshader deleted file mode 100644 index ca12bc6..0000000 --- a/ui/title_water_background.gdshader +++ /dev/null @@ -1,97 +0,0 @@ -shader_type canvas_item; - -uniform vec4 surface_color : source_color = vec4(0.10, 0.45, 0.62, 1.0); -uniform vec4 middle_color : source_color = vec4(0.055, 0.285, 0.40, 1.0); -uniform vec4 depth_color : source_color = vec4(0.02, 0.16, 0.27, 1.0); -uniform vec2 virtual_pixel_density = vec2(320.0, 180.0); -uniform float color_step_count : hint_range(2.0, 16.0, 1.0) = 14.0; -uniform float continuous_depth_blend : hint_range(0.0, 0.25, 0.01) = 0.12; -uniform float wave_speed : hint_range(0.0, 0.5, 0.01) = 0.10; -uniform float wave_scale : hint_range(0.5, 8.0, 0.1) = 2.4; -uniform float wave_strength : hint_range(0.0, 0.05, 0.001) = 0.012; -uniform float caustic_strength : hint_range(0.0, 0.08, 0.001) = 0.018; -uniform bool animation_enabled = true; - -void fragment() { - vec2 grid_size = max(virtual_pixel_density, vec2(1.0)); - vec2 pixel_uv = (floor(UV * grid_size) + vec2(0.5)) / grid_size; - float continuous_depth = pixel_uv.y; - float caustic_level = 0.0; - if (animation_enabled) { - float motion = TIME * wave_speed; - float broad_wave = sin( - pixel_uv.x * wave_scale + motion - ); - float secondary_wave = sin( - pixel_uv.x * 1.1 + pixel_uv.y * 1.6 - motion * 0.65 - ); - float movement_falloff = 1.0 - pixel_uv.y * 0.75; - float depth_displacement = ( - (broad_wave * 0.65 + secondary_wave * 0.35) - * wave_strength - * movement_falloff - ); - continuous_depth = clamp( - pixel_uv.y - + depth_displacement, - 0.0, - 1.0 - ); - float caustic_wave = clamp( - ( - sin( - pixel_uv.x * 4.0 - + pixel_uv.y * 1.2 - + motion * 0.7 - ) - * sin( - pixel_uv.x * 1.7 - - pixel_uv.y * 2.2 - - motion * 0.55 - ) - - 0.25 - ) / 0.75, - 0.0, - 1.0 - ); - caustic_level = floor(caustic_wave * 3.0) / 3.0; - } - float depth_steps = max(2.0, floor(color_step_count)); - float band_index = floor( - continuous_depth * (depth_steps - 1.0) + 0.5 - ); - float band_depth = band_index / (depth_steps - 1.0); - float display_depth = mix( - band_depth, - continuous_depth, - clamp(continuous_depth_blend, 0.0, 0.25) - ); - - vec3 water_color; - if (display_depth < 0.5) { - water_color = mix( - surface_color.rgb, - middle_color.rgb, - display_depth * 2.0 - ); - } else { - water_color = mix( - middle_color.rgb, - depth_color.rgb, - (display_depth - 0.5) * 2.0 - ); - } - - float upper_water_mask = 1.0 - smoothstep( - 0.18, - 0.34, - pixel_uv.y - ); - water_color += ( - vec3(0.05, 0.12, 0.14) - * caustic_level - * upper_water_mask - * caustic_strength - ); - COLOR = vec4(clamp(water_color, vec3(0.0), vec3(1.0)), 1.0); -} diff --git a/ui/title_water_background.gdshader.uid b/ui/title_water_background.gdshader.uid deleted file mode 100644 index fda761b..0000000 --- a/ui/title_water_background.gdshader.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c8s1g7tn771du diff --git a/world/environment/netfishing_environment.tres b/world/environment/straywild_environment.tres similarity index 87% rename from world/environment/netfishing_environment.tres rename to world/environment/straywild_environment.tres index 4f625e4..f4c5b75 100644 --- a/world/environment/netfishing_environment.tres +++ b/world/environment/straywild_environment.tres @@ -1,6 +1,6 @@ [gd_resource type="Environment" load_steps=2 format=3] -[ext_resource type="Sky" path="res://world/environment/netfishing_sky.tres" id="1_sky"] +[ext_resource type="Sky" path="res://world/environment/straywild_sky.tres" id="1_sky"] [resource] background_mode = 2 diff --git a/world/environment/netfishing_sky.gdshader b/world/environment/straywild_sky.gdshader similarity index 98% rename from world/environment/netfishing_sky.gdshader rename to world/environment/straywild_sky.gdshader index 22af7ad..83defee 100644 --- a/world/environment/netfishing_sky.gdshader +++ b/world/environment/straywild_sky.gdshader @@ -1,6 +1,6 @@ shader_type sky; -#include "res://world/environment/netfishing_sky_clouds.gdshaderinc" +#include "res://world/environment/straywild_sky_clouds.gdshaderinc" uniform vec4 sky_top_color : source_color = vec4(0.204, 0.498, 0.643, 1.0); uniform vec4 sky_horizon_color : source_color = vec4(0.663, 0.843, 0.847, 1.0); diff --git a/world/environment/netfishing_sky.gdshader.uid b/world/environment/straywild_sky.gdshader.uid similarity index 100% rename from world/environment/netfishing_sky.gdshader.uid rename to world/environment/straywild_sky.gdshader.uid diff --git a/world/environment/netfishing_sky.tres b/world/environment/straywild_sky.tres similarity index 89% rename from world/environment/netfishing_sky.tres rename to world/environment/straywild_sky.tres index 98fb4e0..553b687 100644 --- a/world/environment/netfishing_sky.tres +++ b/world/environment/straywild_sky.tres @@ -1,8 +1,8 @@ [gd_resource type="Sky" format=3 uid="uid://dersyay71dyat"] -[ext_resource type="Shader" uid="uid://chbcdlhui3ro4" path="res://world/environment/netfishing_sky.gdshader" id="1_sky_shader"] +[ext_resource type="Shader" uid="uid://chbcdlhui3ro4" path="res://world/environment/straywild_sky.gdshader" id="1_sky_shader"] -[sub_resource type="ShaderMaterial" id="ShaderMaterial_netfishing"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_straywild"] shader = ExtResource("1_sky_shader") shader_parameter/cloud_coverage = 0.0 shader_parameter/cloud_opacity = 0.0 @@ -36,4 +36,4 @@ shader_parameter/star_visibility = 0.0 shader_parameter/star_strength = 0.72 [resource] -sky_material = SubResource("ShaderMaterial_netfishing") +sky_material = SubResource("ShaderMaterial_straywild") diff --git a/world/environment/netfishing_sky_clouds.gdshaderinc b/world/environment/straywild_sky_clouds.gdshaderinc similarity index 100% rename from world/environment/netfishing_sky_clouds.gdshaderinc rename to world/environment/straywild_sky_clouds.gdshaderinc diff --git a/world/environment/netfishing_sky_clouds.gdshaderinc.uid b/world/environment/straywild_sky_clouds.gdshaderinc.uid similarity index 100% rename from world/environment/netfishing_sky_clouds.gdshaderinc.uid rename to world/environment/straywild_sky_clouds.gdshaderinc.uid diff --git a/world/interactables/fishing_shop_world.tscn b/world/interactables/fishing_shop_world.tscn index 7221005..760f3b6 100644 --- a/world/interactables/fishing_shop_world.tscn +++ b/world/interactables/fishing_shop_world.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=5 format=3] [ext_resource type="Script" path="res://world/fishing_shop_interaction.gd" id="1_shop"] -[ext_resource type="PackedScene" path="res://art/exported/characters/base/netfishing_base_character.glb" id="2_character"] +[ext_resource type="PackedScene" path="res://art/exported/characters/base/straywild_base_character.glb" id="2_character"] [ext_resource type="Script" path="res://world/world_character_display.gd" id="3_display"] [sub_resource type="SphereShape3D" id="InteractionShape"] diff --git a/world/test_world.tscn b/world/test_world.tscn index 18697aa..2a94f53 100644 --- a/world/test_world.tscn +++ b/world/test_world.tscn @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://world/test_world.gd" id="1_world"] [ext_resource type="PackedScene" path="res://world/generation/generated_world_region.tscn" id="2_island"] [ext_resource type="Script" path="res://world/below_world_failsafe.gd" id="3_water_trigger"] -[ext_resource type="Environment" path="res://world/environment/netfishing_environment.tres" id="4_environment"] +[ext_resource type="Environment" path="res://world/environment/straywild_environment.tres" id="4_environment"] [sub_resource type="BoxShape3D" id="NorthSouthBoundsShape"] size = Vector3(168.8772, 14, 2) diff --git a/world/world_time_visual_controller.gd b/world/world_time_visual_controller.gd index ec67e85..92614c5 100644 --- a/world/world_time_visual_controller.gd +++ b/world/world_time_visual_controller.gd @@ -206,7 +206,7 @@ func _prepare_runtime_environment() -> bool: runtime_sky.sky_material.duplicate(true) as ShaderMaterial ) if _sky_material == null: - push_error("World time visuals require the NETfishing sky material.") + push_error("World time visuals require the straywild sky material.") return false runtime_sky.sky_material = _sky_material _environment.sky = runtime_sky From 737d1cf2e09e5036c651d58b774c3b8966e51661 Mon Sep 17 00:00:00 2001 From: Voyager Date: Tue, 25 Aug 2026 17:14:22 -0400 Subject: [PATCH 02/37] Restore authored hand net --- art/exported/items/equipment/net.glb | Bin 0 -> 357136 bytes art/exported/items/equipment/net.glb.import | 45 ++++++++++ art/exported/items/equipment/net_Material.png | Bin 0 -> 282926 bytes .../items/equipment/net_Material.png.import | 43 +++++++++ .../items/equipment/net_Plane Base Color.png | Bin 0 -> 43400 bytes .../equipment/net_Plane Base Color.png.import | 43 +++++++++ art/source/items/equipment/net.blend | Bin 0 -> 388516 bytes player/net_attachment.gd | 85 +++++++++++++++++- player/net_attachment.tscn | 56 ++---------- tests/net_attachment_validation.gd | 78 +++++++++++++--- 10 files changed, 284 insertions(+), 66 deletions(-) create mode 100644 art/exported/items/equipment/net.glb create mode 100644 art/exported/items/equipment/net.glb.import create mode 100644 art/exported/items/equipment/net_Material.png create mode 100644 art/exported/items/equipment/net_Material.png.import create mode 100644 art/exported/items/equipment/net_Plane Base Color.png create mode 100644 art/exported/items/equipment/net_Plane Base Color.png.import create mode 100644 art/source/items/equipment/net.blend diff --git a/art/exported/items/equipment/net.glb b/art/exported/items/equipment/net.glb new file mode 100644 index 0000000000000000000000000000000000000000..db4fa3476c5d4f9544be0dd75efa6054c9d43a82 GIT binary patch literal 357136 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

L5C7DU|9AD{Kl=Mee?QJnztjJB^`V1oktIAW zvxJ-LB1dEotvx(Fz>qZ>4DDcKj?7Ru#D|uTypb_7MOd!nUMK+C03<;As4E%- z?I6@2=^-lW18pDVgbdICTA|P%yN?$PV$44@!VG0nJ3N$OA<}8;K^P-l#7M zg*Ft8L4Ig9N`y8M5r~6gPz1CQh>ixLiD(?O<4`{&L_^R#Xy>71WP?Vaq0kOR7HBwH zgcd-%00pAyNQ^c^yBTdjqMaxW9YzPCJ&2Z| z0<;BPh4w1CjBX(+hGDl5hSj1s$O`L$y+J*&7id4akM2Nw2Nk1V&}Y;FZ3{Y&6zDBd zL90Ti(9ftI>0&>_rw$!LkI_SDAEE>38frsdp#6fbpeoda8lY`J<>)wij(&yqS9Ao` zz+?7yXxq_sbP;_-@1T8$D$!~58a;#d89Iinv0>N{%o;wuFdD|e7|=2>3ibdQVFu6| zV0Td~a>4pwt*8(70sV&TFbnKAWP!ax_fS`ijom|ROb>g4%rFyZO|VDk8*;@4VBgRH z>?>+UPM8hWjBKz*^b+;Nx?wL-H|!}qKc{2vm=1h8&?n@KIbffV1NI(;VhNZC^TcAX z2xucP56lqbV_aytm_F7Y8;^xR8-n%4?6Hy9P-ur@mRJ|e8;gQA3S(iWm;l3}#W7>d z4V#38K^uk*#Cl_6uo2LXz-%#d%pdcG))(uJF|ldb6lkYlgRp+sIBXQOqcBG-2%C)s zV9{6{7LNH~V$2JhfW=~Cv0!W#7Krh%8Q648h$UeJHW{0VO~giHiP&&#FqVw@VUbuo zHWgbT3LawA#i|R04Wprf{-eq0L4Ne9K$h4J%m9MT9zDdD;(2kz81knW;Rqo@hjY8O zMd-nIhseOuBM?e)Mo798fvth65Sl|r=yf!c!^1a8 zJ~rGPDJh*-_j8SDg|*Iw3m48PeMVJ6uk3M*4}Ch|FLAvZ86IBjmHM&4dxquAxHwl3 zL0^@YR=F-MEp0{Ei(lz4Jt-7F^7H2I(HO-O5p#ggYTt@GcgC+xON+3gP%`XoYi|=& zYUT(-L&FI%*S9UgSEtXa8>mZm+O#1p&2eK|T46Sb+bT^C+9hmU(+@fpz-RS(tAM5L zCdx0-tsq($mUe+s$!(?)a{)wR!63(WCcRSXgXh(CK$T zn$*MbIkh_{&1lBPT73|6K1Ah$lyCK%A*COW(?B=BhkSPNlCHmBP|3w$)KqwRZvZ@!+$xI3Bla7QC{O z=#Q|CJ8qC0_H&Ssh8YX3kCxi$qOJXOtaMMh^zA!mNvSa4X7SF`5y}f~;+NasIucE; zOY^VEj*d?k-)~2Atb`fE@1CS?-Ui0#$9Qe_pQKLKrP-IeNvPSNxnIcmP~8`; zFzIjTHb}*8Hd%GCw8rvb;hN#Av$KU)zNJER(h+akBiPze4v-KJzOK~Yf}tV`qL`{O zZeE7*OV+Pls}p4-a@K3SvFCQ}LgniHwtyE^l0fvFR^}FdhlXTfjujK87>Ad&e|dakI(Fi#1Kt^mm$)zF4{OISjhX zx;jh-D?ZZu6-2q*Ou->T7Ykctp?qw=FdsD9X5FGYOQ~PV%^vyE-x$GK>(j&a`8Mw! zh%aK?`2lyIWg=CDW&i&Dl|P#+AAS{CdD3gP8kD`-VJ0c~Aec&Iu=HiavV>@{vegdm zH)Pk&ol{o7h-#V6IN3_M(|Yk*rw3K#biMjbHrG^qNJw6D5u55bGd9HnDjp782DXF6(fb(|-;<3?*$okt zrTiRp{RXL-Mh6pFXzu9w6;MTNtFYWVI`Fn`dVq5Ot0W^6*J9yI9qGsE83!(&>eILH z2Z_Xh;VKS@B`37Chxp)KC-5gx*zVgAOB`ONf6Px0wZ01GY>;_v(vLSq>u(Dd7(WXQ z3s+)$m6aNc1x0Hv7Zj_P+U(46&5WOoRmA>GcMA*Vyf5{S##e| zKa-QXyWCPfcUwPBuzh0OXocE9c9ga}`BCwX zG#Gr9DF5^>hx3BwewkJut<3MEtSpvM(qf;Ri}skYnnxzTw0|KZCwaVYdUZB-Exb08 z-mA2m16kU1VU0Yy#iLkE;#9ceD0t_Y*pqv#U&M%fa^|*26f$(hDzu#sS#>(O?4Jc; zr@pXTF7#H$N0%OnypvYb6IHnf?S1K}Y=HWphq%8{aS@tv>BgH(l-Eztdzq~I-lLi- zOjyZSIn)4CZL1Zl=8RsuQ?*OvR=h?h%)<&&f6{Ak2nT#w!04&oEoV%Wn~`j@v!2y9 z17sz^u9;e97~cfvYo)#Z8eQiRDaoU&*5F$viA!X|XUEXQ^$(HO^*^x0&r3fd$Z*(?HXDdNF9HUzwZ-whYyvkrlQ&*f8q|Osw znFp>W7&jvjJV6@$^3}0q-H^)k0b$C;C&y$g>VMy1#SydL3`q??HWR<%t15`F99~h@ z2YV&|oH8}$xAZ3Cvh>PxS;jh2~v3tzk)Sa4rKN<>JNY1E$OLgm@Z7?Z4WKh@oh^(oGmyG#UIIbt8 zi>*)x&4&^T72MUeof6pfMAcQ@W!XH)#Va9f7gl=cli6~>b>X;EY0j~Ngr%o8nzO{F zizF|$n>!BkW0EU;WnQ|{g0+0`z@OS7)DA}_bh4t(ljE};(9_LK8Fnr0P)c2Op*dNC z%c?^dpmY7%H8tO4U690EXbd1~Bw;vUE-#FjaZ}WpLzVK`%EHvW%8Z{>&s!475VEd4 z^*U5NYo_FnuCh}#Efftl;H&*qBcdSktYLYHwvni=eAxyei_)M{l7+nb85*E$QX zsQSy?7PGc-sdMW5Ktk%qdQ6XBXIRSbR(fzkUj2(mhDjaOs>jxF)ny~m%SX#H2VM*p z(#35?vz0E{gszO)A@kd~5tb&co_h9R+QJE=K~RXk;8QP?b61JMR}Qaex?j9Q z*o#!AFR7Q*3gL;v(${msPQ7XGRCnb52OYa8c+Pce%$(CM9JnmtO4qPV)`qK@w_eHOmkkuo@!7EYeALw_ z5WAzMnrKBK#d!x)LtZY20FxFiTa+rJ%t*NL#FR1KB4dEHGEFF}!u$eEXiN33xETE` zf$V;)@XBw(J=fBWMLUL6NCRZT1!#RQ^X>f9xq%Pvtu_~Ul9S9pvZ}5%JBu$bdmbrz zdY76qj55~Eg1!1AS!vOJeSM%Ns^i??nnRy@w&m|z z4K;Ds`le%@j=y7tU945z6#GL$L^@arqZ#h9Mdj6O^1AIt@3^e7Q>^u`3*ICv^Cyd} zZ6&)rix2GCFh(#j=}0WQ!gDk#7FhOQZ2O_#2H(eEX4xW7S>IM6scp)2LGNQB9$RG$ z8RbDVsIZ6cr^q<2&XQI+tZ1Qg>GNBS(X>8Pee0X|o+bB?6IDE>L7aWEsT&huK zHtDGxkoe>3TZ=`o!59x7`j}I;BkPthJGLFoZ66ZTL@$cGvkEpM%}~9T3cRnB+Q{^5 z^+Ul;53RDJr3>%*-h+@M$dcoQe*Wq84HA1@I)@WF4Wz;5_OT#~XC89m>~U|{hP}!w zb~&b#@^mzkbfcEGZ6DqH{VQ7h30JVYmvQ`w$78$)WYJdJ=`8P;6tF8P3#m*GLaC)l zw=>p%y*|VE3mO}Il09l9Rr1bQymM3_6t5C5hhl+j+p8jHqZOvow^c1!?n8C21uK)! zS#pO9n1rlv!Yi_LrCjcMX|3M|qoynfBxA@VQOonRdUUsI7iZBPH2wNyD30!t#Syzr z@N3bgOhz;_mIab+bom+KK_6X&K1?Gl&b=}d1D~sU!I&#;uD&@kjo(3rsYZrl5 zk18{;*hS8$c-xqwiBN$HvD z?$4%*>}c_h1=I(bly27Nr>ECo$b*s)V%2MNzhaDf!u}7yY6(wXaT2`(Y5SL zv$1$CxdG}?UE0zMjuJ8kLcn9f>fgx59FL8?8|axT<#iNYnLk8)mI;N%^WVZ?Wj>&> zu;WI8MiXW2)1M(cE-svx5ZDb$ zPKW*{1A0bwO#=XQK&{QIhV_N%(86*?9JJOE3^ZoJJq;n?=j2Qol<77%bGwCv8>SQP+7w@-8o|GdM5mwG2)i*BPhZgZ zc-baeV_SxC8>OTG+pyKtpgvD_!D>H)C|kXe6X8=l0{%HA>M_dCvJ=#_11-BYqzYpW zOOHpUg-$oRBXh0o@^hrDYGoniMri{p<0`d8SG4P6&opI~RaY{e3>+Z1P23ppHvEOt z#$H8Rmy9nqoMx3Wa6B8P%e8gxB3NJ}iDIZeZW@>2H9oTkS#Xc8Vb8by3a2H6?1H!I zu`L*27ztYsFOlBhnL{!fMAG^NWYxz(&WFw3BR>X%_4?LKVWhWyr| zx2(&CcW4f{fBW7ZOZ=``sJfJl7QaO6PsF~`QwsObQr;Ubjx`Y;6~>#8wZ61h@llH-{#HxAcxI4aCQ1L`bb>$bOd-@bYUjWnYk&Nm7pX-%B{%|zG~sc)oyI21|6 zPfZHG?U~a~U3O_K*lQ`7d+Q?{+Ff?*$UeBDo?EgD`nA%Ak2BAFA5Jw>f2I zzCBFY`sF@ErFZKr_&t8cu34lv{G9gIdbjfAs79Ho^o6x3W7{@nM^W|y(c@eJdAfs5 zZZhGm&b_sjqKpf7246W=*{x2Q@r%GVU#t{HNlx}RsLR>&Ib0wBOmd{u%RCncceep8=l4egAmSEz{(EyGFsaMgalyHe2`fxV6 zt`BKr{mW8vjkA&I5%7`&K5SscyfWg-v z4BZ*!Wft`j%q_ga5+0TLpPCg?^A1!lpCx*UO8Z%`WJ88sPy2{vRGZ)N&F$VX^gV39 zT0#LX2m**5>E;`pinD!JGIkd0Z65J42#L8haFT@1%9wKmFV;*WxHE)XJB%P`-i2Un z>o(|;fspqmE%-p1@!PG?v0^0cjc}l;aNsCoA?=nb{P`seYS-TV4!n9jMp?K}38neR zbf{U`kzMOk5HF;m4AxX$BSfNiCh>-_@tH~OZa!XSnJDTzZq~F>>k_?`H) z1&%h5Z4>446`5tfuuO_LuW~sQ)H;&m7fGZiwmS4KEzC|yd2TI=v@3nNMB<#g`lOX{ znBdAq(Bncdjz(m6_-{fmVGg2rS=2A3B!%b!d7p~qMSX@E7bwcKf0H0-+aK%{@Cgnj;OJ1 zBvj1EZPv~?7rVbmP-b_NRqab5>rzW+ueF`WpdVjsmu^ca0f!g7If*u#6mZwAgJ{}D zE+OtwV2;k(HoU&I9~o@NIO^_%0y<-^tQr$P^6okOT&%7*>Q)>~{Wy4~@t4ZV9|s>s zI>i|YZabbjpojM`*-Mr`p!_P-R8p#G5|!7pFKoWaBhXX57bR_784)zQNcOcol~iVo zP7SX_>Krb}^0{t%m9o&!cC|4w{9s}8>}^)H-4tJ*jc9prFm*Da8)ks&bCP4? z=RckyF_kV?k{jmp*L%P^1U$n!sa3NKa#2)=|G8^PW2Zp{SO1pwy6sKvom^Q9^|ep_ zR@lx{vKx04yjQ+iE4+t=kP|=JQraL$yGp%_mD!><4yeU>s}AX_p+?HevXJJ1Scc#| zt?U5fH?lx$w$^vC-(Y9xh{F2o@RsJnA@fq>7(b~odJFbaabZKEG8b5psoskEwzwwG z6kV&x$bSkM$!6)>taXL&UA)ds1L+a|GA4$@&SsT-_nBD z1;e@Y9mZPYuMlG4@VAXT{Wep%*;6H|@N}!Avf2ItG;H~D7pOWTV78*C{d=S&P|V6M zh3d?>S_OH2+`KimtNkVx9X`wuA1d!&)@HwcYV31Ik!3lhENqaO3<{ljj^HdxD2?>7VRyu)v^YwOol)hvWDk*XlGu*61; zEagXA!LMEGb?7!3vz6pgp|E?;s(X$~zgdE#?@xml?F22eRLTWNZ-98@Pvl;nfU4wZ z(d|`f>C=-Ucfz3*(O+!7>6S5-?K%?hb`CJG#VU>#R8!x)vmlqHkF3HeY(qin$D!=Z z9v@`Edc|juk&ZOFG+>-gxB*{v%|K?!S2~!NJe^+JoZHtppdb&Htx^UnOI&3GJH!jB zO^R1Pg!(;iE}V7u^J8xj+RjqWa8`vPr7OQUu4uzNL3BogbgG#?|CK#!RoB;TvuiI; zbA6G{>$n0d=t4RkbyZuj(!q#4cvTkW$=p17thrA6o2PoO5B+2qMdu;<`p886GTRid z$9CeE_H_$nQAL=!uYqPC(ChA)h!kck>)4pv7;f|c9BtARGU$;&?x>+M)U_kmU9iyT`&vhHRoFC z_0FO3&1_gFjq7*o@f_BNMxfVi_GEC}P-7AsWl(Q%(7` zNH&pt$ReHqvLHl88wi^P`qT}fz1EG<2rShrBe5%Gm7&Ml_>Q`Qfa z1@$8%-E7IZ&4Op9jz;Bfm_%nj)Jzn9{`~aXKno}+RPFvwlelf`1u(HVbcOWHfzJWe=n1T3p|P867gtYb?5zlZjZm zZ~*We^x_PG_Oo*SL9@C5s)$07xS5DwHI$S3{7gSJsvy`AWzQ20ei~49q0f;-yNvun zx!YQDZTi$j_?hT7lQ%Vbp-jGoUWAJ>7QmK+q6&FsHs?@}(q@yeYo!HHUl^D>uyzQa z7`|?c$w}ByI7;8dEVA&GvBd2SM0IM|+ph|E7-b4i43nbz)Lm2dOp+b#A&BT|_1MO# zzs^3UaLjUvdc^Tvh3i$*Gp{b3yKTx~P&`z@G?@zGQmwcfv<;2KcWsMaxc*!7pc? zh?Zlwb%_#P?@5lh`kteD-92o6{J8=HqZ=g<4;b)i@!H=tWJ%h`(qP!x?|wP?R)%Aa zaNLTt>Vt6VY?67$f}5bEm7FP@^|HfCe77U;Ra?edV@bFhJXMV-KB$YXy^hZKn4Jp= zoZ($c2Q^tOZ`%E2siDf%MC9FYNBnY0c%{k`QLNjGj`vP!6s^~Xj7%G{($tDk_%&acIz;&OieTO^8Na3l98b&EgG`eZd;w5D$;N;g z6h74iy@xGS2e}Q01NO)6)};35T_xj6TAx_RFI6&+>FCUeaRUplFkiyB@wJE6P@8VR zzQmjf+l}5)4KV80jqwd$oB_f8AxL>3qm#iBJeA3#GC* z=gCt7@uG5zOLIk4_3$#nlLDw#zSRU7_UKbbzDXeC7Yzm}wvw_B*sT>qy~*;nR2w%Q$u-gke@s;VuI)=+OAX()c<%~hf zw6ZY)i8s>DKUVH|Ro6<}wP7sGs6^?PkrnD-G=@yy!+XyyPVJgferE#dFOzS`p8ski zdDmUlCtkU@do}quEvi?b;Ug_FbWRhi@tIRgaPEs28*pwe!C|%o2Z2Gvh z`DJ2fy^YG0U(d$gOhc{RSiOy{bn})b&@4C^NV$P2d$TqOv^HM2ZI>DK`A;>Qmssh& z6?vG~wUTxJ^NGrPE^uh!QSW(YZOeAW)IjiRiCUV50aY| zR=83wP^K-KBspZuxgTWlR91c5&1lrJmGD$rP@vz@&#Ec)D05)Ykn>p!^re^MNsV)ThJi*}#CO0tT;&M!IYpnOMb1A9ec(~*W`hB% z1_-k}a}VVEXP+qSJiv;-MzQ@&E300YzjcWyXfCsPt|M|x)%EA)39xwk8Zy8 zA{}s`dB5B)Mrq%7MIExCmLglff#WhlTUy}mS8XRhV16dIl8;xd8`Z0D84@og4-zGb zDlU2F72nduLE=h1+t8QfHl3II*i|)2Cv3dOq-*exKU25fGu0XJnGAb-hTJ$(MeBM2 zcCM~{sE*$tm|j;-#91n+w#y>YCxT*BU_Bwt)ab0JvayfK)wQ@cXFFs-!xKR(qXdvx z3?3SgPZ`Fy>j%~t_+{=dbolB%#7P5RA?O$||Pqqh>0!wtHE3#`dbd|}^V)EwCs)>2WXLxDUO2@rN6F*=gv1N^$9v<6Hnj2bH`%+#uYa`$JeDD_mDQ_^~ko> z4V$c2zukbRTy-Hd+lmV)Nf4ZadhCC!ySv_F({+1UIm&Ob^N4|kT`DGnUL{-yDvpq8@g&ZY#Br@1x zrWZg%0U;8T`0Ks{w~YbeX5HS!b?ceuBCFaAa}nIzFOI!ld^e*rB??=0k55~5E91DVDaB4a^N#9B_^;jdpax~hhW;j$ z&Ql8Sty6L=-sjkj<%&CBQ0tMh%++Q4jk4cp^>#W1K9rJrTUG@9wP}dpjlXopJ(on5 zE^IKwdb&Id`bzSg>&)_7w)%OigxS57`=9%ZX}$VzR<7|yrIYT$(^Nge4d@stjM}!M~864-UKOJmN0R&QDkbZ(AVV zmRGFONxODUE{Zm(HI*jZUJ2)Rn?M&1zO)!Scs4KQLC93K&*zQzT)1Dl?K);PY02Or zQy)OsJ*hi++0Y>~hm`CH)faeobO*TjzB<%kFX^o-URAlW29sAB1zblK_un&L^IRQK z{UA6mYCfU#J1_XUVngiwAjVZaS*3?^?IgCUa#~Spfy|M@XI<{bDk5jLLl~jAVOM`P z?5bkl)!s@{!E=Q2k}$AyX?2xM=%Z|PG?AT1mDU=^^8+(qLE2mkzcFDF_hTpRPJ26< zHu;xR5v36$1N@D;yD7&q$anGh@M)90GZ*(?&_+HGi1`AC7Ehv6OeXeWeP&lqgw=QiWI48ZVVTt~3>rLwlv#Qg04yRRzY>{LoE;c`B%@ga*z95qo z&hyAP5Y@C}7QC9)VO8oh?YYYEnr!(OY?f}zBtxZxs29wapKu#9D#$qgR2tlF5B~;g z)UY+7)U?Yq(Zr=w9%6T&!#1C88x~M=Wrsc@IIyEuF9 z&we{;$H;37x=8+%Gb_Toooe5+$nf_I1ddyXhHDRU=K(44^>#f2imb!!f_rqYWvDk^q>NH zP|>m_-yGhMn@mrkqB&Kw>q@aMoez}IgHJ|{KAXTm%9L~6pN(-OL-O*rVNh&acfN8r zJmXxJ8+FbmNasC-SFpk>mj$W&UOk_x{N;!(%)<>b(4vuph7D;f9NAeW^%igMPl9Kl zflGE8wO$-`iaZ)OQaOwQk>g~u2aBW3@Y#h%vC1P$l((Ej6zlEDLC*vO2MTEJFLK8&{Z^6MHVw%myGWiRDe4TS23!kAyAueo7i#_+~e+7yKkY>%f&^Nn&G&3hD8+rD;8 zA`?nwsLXg8`MPEC(Lj?yX$L|#!~RedL7s+24ma_poii4n-(gbUPCmi~Hx^vqU?Ll9 zN515{wJ7U~VPMOR^R-~?vj=wFquE|9+Ep&2_zQ2ZNwX>~Ev4Q5A4H2Hyx=F_N%?Ik&Hj4JwkA<$=Yh-YIoUU3VFofjZ{*>rq3>X zFJC0F?k;A#7RLt->s85vQ;(99rKL0L;;fJ;V0YT#qJW&tii)M=tELLD=*C|Kf<1@J~whNZ1_AKB(B_h2PvuvH7#m{&_*OIuMB zn3ei=PnCnzQM{l8{8)!yKJsEUacSa-&g?hP4j$9YKbMJIvNL$p7O#VPlAac-u*z;K z^Kvt5)wB6fAB-ns04`qTX!|B?^p-BKy;mFS_sTp$&KEv^y=ddHteMn;5;q^=8&I}-(FKQ zP!>d$#IRKPX^V>b<=6ZXgKG?~yL?38}#&YM=Hle(o`=9Dy~{WR=lb;lU- z%Z|&SpjgYCq>gM4>eSAognXTh;IFij$2*QugfB~_2Y#lweYJn^^WbS>zeI~LFghwb z4u)AH)_Jf#^%9)_*#s~f}CbE&_q-!JLLt95LB{jWb?EPGxA@6z;!lZ(^^ zrOh5oyBTfR(pmAWX1jFQ6}}HbqTcr)-$zhO#=TRXf;T1>MuDkqY_Aa^LF@gL7G&gh z4A%p5Vvxk|HzJ!fv8d{$-B;ho&zNh^c+wpRJj; znfBDww2-8QmI+PUOw*>6iG+xvWlC8xg)Gf9TF{21qMQ_sQo`7J@kZ7Xrwv8qC8o%l zC0oDy>GS*kG5=_sIp;k0b1&C@UH3EELrnN0zCY6ts@ioIs~!U@NuBdWl}%JC8$CMs za2`N!s38uBgaJYDnnitP@b$V-Ir4vO=5l}Bf2u5!l41!VZ6zf%zK;L>t{;E?^5a+S zMD`uUCkQg!31(+kgd=?D`o28?i%5P2d*- zPdRNC4w*KUC84L-PZ0%X>#?W_vZ2`mPZC?%UN8JsNY}fNv&s;#&P^AdQx*=;MPE&c ztmr`SE>Dmxg4=)p@l(5OKG>oi1FnCkC~#8);X>?(a|U{yfz9Z_5n=S0&0}y$2ZuEhxz!6VyxG;mO{*@^8yQ*`Zh!;%R)sqgOra6FmQPnXZ1{E%vfBwnDJ+SpL*#bG4y8_iysS#snakE)0i&cdGQ^@*f%7P-kQRsO~E9wM^E zWtATEz2d|qJ?0bGoroR5v@4(R)G?`8$3i?R7W3^)QHUw2ehkcty^Y(Z8RzxEpOzGd zW$)qYsSCwadHP6aB;7QPazn!-V?A0!U;wii8H2mMuPY#jIO zYK-bQIHM)$`bs>=5WY20g{8EvuQNVi_|Tlte^qJNKz#n+4#)m0$Pbr0o!%ijrxHI` zwQ1cGvgn&K_+EB=)7=I1+BhCFKH`+LH5hmCuX>c9;dRK@pzJnp+FvR4R{Vk6ym&yh z92HQG%@@8p5VD%4jCzEE=7Mn7_0aJCtS0i&QVh%t*E_5*q3Bi5=CM@4W?G~p-dh#( zD8eywMWbgD=f1Z%)|QtCkU~g72RW(8lS#T`P6(=*fgbSJ&3N}VO2VCe?#hG+RcPc$ zV{Zy0?u(x`K?-929e(;$VM}6>`xzkpu2ECqp7<=y@P+}Bol-C$7>^wu51+ke@)DOC z@@%wu7p5wAT)TpOCdzjjiMWT2AgI>2O~E5A6q?U7I@Xw-F#QK_DdoL!lAITIS{F$B zPGTcxks^VWbcoJxK3q(-{x`ewf$tSIlQhQ*;Xj+E7DeyveLwLSgot;^gsy;G- z#HAx7PEvtwBy#CX!z<OH*0cQ+#oZCx~jnf6I*ba{S1zA;rO?D^=}2hLA-Cbmcib4pcgxHv<$ZHXG^ zGANCr0K}B4il$n~wpA?}$Y^x~GBVW!lAQ$G7Yfeqai=bUYURkjnfy4$=$$ zQ?%8#lxIE6Wx5LxPJ?;v=zd0|qvS2Uc;CK0RK@r4j|FCHZ74}cgl*1@TzHT-w5CwsC+1CADW`mf_vQT3#r}lSx+pJk9xqlBT(08oxrS=K$o2Ae%l@v%rCaDW1vP~no zBPF7I6*PsoZ`bUL^ib+=Q*U~+I2_;@UD<-Hx%htHvRw+e7fr0HAEQPCL!@OGwKsxo zYpQyx!syu(27wx^Z(%!_LbNf4s3Sb5uC2Qq^L3P+p0|D~K`zl~y6%`C45)#ACh9hM z&|E~i1y4~OQ7m1X*HIZ|C2ojOvWxKaNDEVouLQn~dN>h53WXqDBP5UuV+ljG!2CD> zKQeabNd|X>4nN5kL2o}{VJV6f@K&3?{2miJ_@uGDMBK&SCj?>l8%g!{Qh&h_O8HwY zSnBnu?5kO`5wQI1lk2c6X+lP33hR9vC1;xqmfQ7@^oos`S!9l$&|c0krmH zS1mv_XdmCVpj5f=2ybgE_xmL&$Is9AdtOFHwC;W*5@t9R?kN!N@LzZhT>2D2#pFkG zynZS}+|r0iK;52^IYg1SJ*5Askcus06){~EJ z9tZ7#Tts%)h(>!Cim~v6bhF!%^OLTB8<28DW)5?FnH21H00Ez6ho=;|0s)5+K1SPg z+e-RFQ{3==DZq^w_wtN=i+0dhlhyjH9h=U@{XonA!t{2PhlM5y?HZ-woe<>2vB!Be zxzgex9o$DRUQj~{Es+*GtlYbAUz&ROvw3>^KN*nvkEoX&qm(zzM~}aTOV`Fd1`!Y9 zP!-)@P?)<(|5cg;p#KcPR<+l7NZCbXN&q)D?u7KWxNa+VC>BZMs*$Nudv%YyYo1Q%ghPoL6@OSAv8_Wk!y2Hvht=!*GM^fSnJ*y*<>%HDOjm8ZW5e!&s+Rk zHT<;(XEkQPUN-l^0ft$d-=~j^iPDdnbPTW_!r)STo{sRt^m;dX>#2dIPJ)+)-8oqm zca~E)_x3Stav(X9@9s4h&VYCeZtPk?)|{d-a$5^v(2_+(s$|*fu+;(g)`6VQ<2=?RuLO1&B+}=UoUPyipXc7j2$Z-Po z_!rEzH)8Vo*{b=nTA^X8G`=XB?)78GiVi{D`Pr`iD;l1~)= zyBW#G{0^?$Uw9q^m(Z$?S0>4A3nCjxDSsz%T{nD)%-AUePx`UhlI~iH&7vvX#AH-V zvjzh0#7_w~`CrqbJV+`0o5s=jUVWvY9a90y))(Enox}LPmx7*qL1Mwr1Ch$&*cud) znDS6~_e9Zyi?ir)VR%0|JYU1r_@jkvmG5HijC2BXidjuYtQj}(XdFTtM1!XOiMj<@ zgrJEi`n>YZ7V-HWVP~VcTC%6iftp}1J^x{6=L_$3sKfri)9RIAGvi>FP`(`G2*uqs0}nzGOob1Ckrx#f9vQou>+YbXaR?1H=d($kEQ}iIknr z(0qGyG{r00-=Q`=Bokr5;$fqmq~S9wc&A1wL2e0&fG{0BByiYvY=Y(){v3e77AgDF$*5Z0anoLjAJN zkb$Q?Ff6SwJEk7O(OKQfI@5L?e`zMRMJ`MKU<+1%(848|VwJU`-55#$Bthn7-C99q z?V$HvJs&fgSg@C-IBgsMDsxy?knMxOqHj9FA&_bCXTc?I&23_jT3D^*K-4=4*-~S6 zK6QT#Oa29%(BzU|T)GdQ?1-}zPY@v};c)XS-=PjoY|F%DltydogRm^icDw3&rN;Z| zw-jg6`>3M=`*QRw=8>p5K+t2>a&eB3!>W6kkiexI!(>J0YHQgP41fw`61J&RmUJGX7r_xN5FE-P>E(3g;v zU^iMoXBbtMtJ`EicTyjoMJ5g08NB;|ICc^*@L%rtAHINJp534DA8;iLP*C?hH9vQj z@!Y)AAz!;;O##m<-UF=~LV{Sz{14hf2~%^;6B%;1n%e<01Wn5zQM2DJ`l|m)g$kX5 zlv_jRIvFCf)d;7zbLNcOAAu@ZU+!rdnwr7LBp*{M(RGf;!^C&tsj1y;k=3D0sB(k@ zc?WOpAl`h-1h4VFW2AJ-B>M^%GG}z#D{8as0f7a9$e1 zt#o#|SL*dGsg7Gs5fQY61<8M5Pn&A#9Is07<%=PUPb%uF>hexHC1wiI?Pm{bIv3m@ z9GeS2RfsYG!=u-HHpTJV3hXo+@Tw+GgA1oe?=wfCz(ecks6{xBIn zGxA>5N#NfzAyzZt(>b($zq(LcO&&BOfn89L2-sZno&52T=Q@TYZ2J%LHXys=NYIDK z{m)d7+|Tn7C}$L#XE4mHcg`@U?8^JEL(|}+Cb#dAYLj2-!#I+l?O&u>{FVedpm1}} z&i2ZUTNuNm(~x1_(quR`ar#kh&QO+pnSZM8FZb7P)Iy9!e|D{RQ*);cnL&~YEKKR- zJjNnDlmW9+H=&lGio((|d@Qc94CMIt05TTP`x8_-%4H9OmFP`k#<$CXYxelIn?4m+ zoGp>MTBIGZ-t&K40N;q&Op-U`np=#8z=|l<7wT3hM}&ruI6_-PQRgYZn6zi;3_V>! zaUqMEJcTJF#j~iiiv5H$TagR923-jnVPp+U^$C%C*69hnNC-)k)u}&hFnGGAaii|j zZmz%i#T*aRvK#55+Qrl?eq$=Ss&bJ<=&$f+6%5!b^*x)b)Q-Otc+sPrVF?icy#k3Jp|h_sKl%Q`@E+8zKD;UM@sE}{KAOjzbRi@+_Vf* zj`dx4FQD>aalukVRoe%thEjMb;jB@U`reARa$dGY825rDzR{lYdJsu`b5x1d&|3dZ zPFSDuSvw?cNTv*$uXe}}Rg*S%bqt5pQI{zLs51^OhRBw=uNxf*`)@%8s(ZgNyT>#t zyB1x;44*KJx!dBgDWG-=BpoT1I25y@z!3BO=28^oIv;s_#Z%5efG0o$(t} z-99h6LhiAH$NuH_IdxBnm{4Uy(2R0uWzva9`2@~S2FF-ao}TwCo1D=wbvb0MkqAq< z--6$o?Cv@~v+}^*dma4foZwkisx*5FW<%s=FH17sd4UYg!)#>Ch;kz$NaMSQd732r zv$6c7arY4E;3u|7A5ueHe+IrI8NZgymM3gBfJ@twMlNP{R({d2HoDK(c;s%+&3;<} ziMk9m#_75p*4n&Z12yn`ue|2B)Esb^-dw%~WS;NFmsZnz=p!N3Ukev@4nMi!ET=i6tH*`zbK=U~Dij+bP11l&({b%Ab4a(Dk9*Xa;IXcm(Gq+Du zYu4O-GNgv_OjBG@@&r&ELeq@GieHbpG*Z8GMGgOL>14rbid+DNiXKj$u z3-STsG&Ochz^R4*d{Szk5ZCUy_vqtv<^iL>fC(HN4Zo{|!gfnEZ}DyQal&yt8}29r z-A>*2|6rM+75iKzLT|Lht7f5(>*#NDe8i$G)IsxtIaG4X;9-BFU{*HJT%VkCm%BJA z<9xDs*mU2iO_m-1U<^;;p#an_`?pZGDRj)9CVy|Q{$;@E>obstdl8!AX49Gq_EqQ= zqn3eIIe5Bat894BAeb`m@CaaZKnHv?mquP|Ffc;Ex1-)eNe4X!TqQ3iEv2-?T=`{IV4AXG_Wir@Sx`f{%mMJS<)vd& z-$fYNjhrLFG04`?jQs!YCf})k{7B7g5L6O`g1}PPk!B6bl=`Q;z_-qs z-BcE;? ze;-*jKO~o)+dyd6x2{?R*>J2fSA({k(r>!?5Hioiig{hs%voSNY@NLmbQnEH>GhDR zd}#M2fDiwsBU0*0;{cV7b+ik zVu;=pZ2-J-?+8u5vhDbUG@l16zyX>Gr>YElcXbAYm(r7G3y%v&gOkHEKguqVO@LBC z!1v9=Sx-ijH58GS0)E*;8n>g(v+7%+7Kz+FW-4-Oi>9z5XSqK<9n|eI2d@YDTDM+c;TUXVjV_m^O*MCh+Zc z#htGsg5F|cQ<-LWFC~SuOF87s0Wo74CE|GkZNz_n5>7}6{Xe=a$1fx7K7rmUz8>GY z-gVC2FygEQM7C*f0leF8UHjp6P0)dTA;$hlN8OAIwa2e9r(iKTRe3%EUdf>!Fa{B7 z`4#2%qm2Y-)k*NSen9Tmm6od2|32g|0m!8Nl5eDf_hY8bo10^tMVC@1i*6M^bb5gO zOcl)hbz2`Mq~x!GosLk2u60_?^g16w!_z|eoE0O$e>g?vB6B=nr7D7)Cp{rHB z<#OJm+rF@B#t;Z>t=v1h_Ee?P9S9M<6i(NTLt!e(IZAhB8zB=t|G#FV@>rxNIE*b2 zH2G&7Krd?SynRk)v)Rz^mWeB*fs1F;S=btfm3V=j=C$rcU}4KQ|N159SsT zi)QY68R%8^VpAKiV{)vefqORI{!>U=$xg6{j;*gvLn|~c zl@3aFCo6W1W5I{0dHsaibrt|8 z4o%^f&j_FM#cnj=bsgqZGch@$g`x1$a2}+Lsk4t3L&scGSGQ_2n<6wNVHwP{Igu1V zOcKCBTx%?%cN<7Rv}d$OKA&1O3&29IYZTU-n)dFBWzRt@-&3X)K~CcCt4$C60}=&f z7@hsXEy2DV@pyGr9=NJo@D38zlE!ijp7Wg=AL zswkRm6n{gK+YNhW`+EV?%CvmU)Z&w*-4LHT7=~_m;Yj?J|A77fFJzPEf8ef1FM4Sl z+7xdIa*n0AzE}w_T^GLAbpy!rN*L|S*k3eGP(gVPl1bj+CM~$_`c5q?dJ_1LCCU+t z0&1Q7dI}nWS-{o>lH5S1+eH;7fsjO$Wxro+7uH6xHM@XmH&3~NPXQ#Sido|b59Yb29G=&ysoScobSNPD?$ho-y- z3+{$WrugBbnVnX{zImXWRU26&wlo-cD5Vm(hIb+Qn(J}`2nUU0a5(R*T>v!KS}Vrat=;k zp0G9X;vrhz%rrU&$OBbQ;}({-it0&L1(M*KS?99nvNN${@N+Y6mPyQBjonUoDP0GO*qg#=+KSbcaeg~d4bl)sE`OP^*j;HKw#@?) zi6|R(;&l6j(6`E@Sgd98>3(lwt6SrGKnv9TPMK#Y-L`UPl13pLUA+NtPN~ZF#GOw_ z;eV=NJsaUsuPLSZC@)Vga$u79E|jdzZ%p+^F%DC{Ndua>P1*!~YiUVV@te^VK$aN+ ziO7*rQ51o*4#r(c!p@#Y%!*q_5O(@(TK^XQGMcKfSnoXW)kEjJJv)2sq(rG#bstO`1W<&wM9ht-kVY6)M* zdET}n6FRb#5U`Z#qY1YEea?hxs|B@fC*}zKUA=tR_a>x&{yUq^?k?_DwGp_p2;uck zO)POZFTiLcwegE*+E%q)Aqn8|`zELNLkjQ$slOL zh~kCpQ6u3wU13`&;;h-lz38|?D4R1<6UEHv{SJJ=N{FOUqCyS*$yMwXgou7hU&iX} zKyz7?#Fo~yT1Rw_B8;~`^TTQ@n*umTD<~(c@inDZ=8vSs586p~kEABCeE&bP-{AaP zK?ZDtV`VeX$E*uYWy|)?uPe2SuE`iqzyrk7L5g(en&alj{zDA;Ohet3a*?rByQE<) zE8^RHUn@Q>f%}zZx2~B3TJq=SExTHR)MR9}zSwzfZ;8D9lQ8}d?aH>#@yskJFWg`W zg5dL$eJ)4x0@7zbnme~av0Ih7Y<9wLdm`pOj(wTT9V68pY+SUU7{1z3)h0Qe^++}# zR2EEyZvD+`onzT!yEK}L=(Dy}G zGAxq$UvQ}xplF(&jOV{alOzx>l^(BHhleo)alPfmHl>w+rr^8d@i8r|r%V316U_p2 z!EMI5iQ&CY3GeMm_}t5=es$UQjO1*E5Atd>r0*L;eGeK879iIofK-;Me1*BEnqwd; zNYWFYDn-kE%6oE8MAfh#jAi{FdF3-O*E~ceW7#R!xwPeyhEJ3{dDk#z15*!%6Op(o zRSe?bSA~XV-_Q(;gMaoLyuq6$0VS-y6I*n9#91Lvhg(}?!CAM&CVQk2dL>Yd3FXR3G>e?4oS$SE6bNooi zDX_suGqG$(3DqPS<%o;dEO@e2@mkVK$4_*Dohi)uaUK92K8l#X& ziRHKxw!ekSswMYrybJ`yB^sPs|9qFKG}ubVCzLJ6U*7Y)2&4KQgBMK))3VLH|GT4U zgW4JW&`nY*(GmtP?#ZC|I&9}hLf!QIa7NJ^-F}Nyts^yDaq1MzrG*_bxZ$u1sOoOu@|-2! zxOvL+LUNRahCwExnMCjCB4gyJ%xowaz3`gHmxA}RajuzSUg1~xQOrFB8{sJue1WuN zA8Bq6)aa92PoX>Mt5OL+qta*eGlwA|)&9%dD&TF3EMSmu^X8~9sP>}F9e%_M`_-76 zY5kKlTAk#{qds`$dbp`SzBX!E(o1+fK@F|vrao!wyznh*-8+c%efkTlOv&XGBHb~r zb3JAVmKgDU_T*D})r-6gR9<^&T+Ic%C1J)DiEU@Mf-i>ow2+0xqYTV>1?FpbwJDeRp4_g`TE1gKGe=yE z#@TW89NZZM@|Y{Ab}KiH-eV+qJ4HERgDx_@N`k56`jJM<&x4t$7WUIV|w(!NL4nyv6=$&bRkL&>4d zb{2IM`eYC=zfF*p?4F@~L|Klx{0vU!3^z!KbCypyUac9x8yFdUs^t*&4;?=c~~gx^A9{ zqHt_VWNb$UH30!u1E9A0`L`zV0ejJ6}BGnO@^TOt|OrznL`cADm;0_pN{dTyaZEg zC^$Z4GCvWC!ojM=eXrq5`yz>xRlLYBsMZbsc^)q}#BIV6Y*RLK<|;atSUih*RY%FQ z&3NBi9+#MSa^BjQfU94tIN;Hq8c5rJONT924ciA~(7Ww3Q~s{hT%#!`f+SrU{GWSp z4Nr{lPpaZi_YF=;C~L1dfpzcLqktJpn#f7B&F3h*t0(#9I#xFwdiG$#_#Bz&MSc1v8{3K~lrVvJk;z9a=m_cYh#^0~GMh zAZxEo6!ndW~2wl5&i?^X#eEAv7uOw&!gn!kwDH6_Ps_goFsX%Vh;ucr~a;hO$U zy~>=sQNR-rAk@fu<=pRPQ7kNJ3U&?L2uIrZIYbYf8HxKSA|tG`@UX|Oq|5)H0LUQo zPp1?Cg=&JhNXC~uW%O5#8+AFewTO8c(zVJeBf_CU$R`U85r-yKMpL%(iEENeUgK;2{K zvaI#APMLZtA!54`bO{DBB9x*+R?!GtOBe7bKX?akh<~8k7s!g!DKJ(|Bf-`KRUOk5 z=4Pn3ab)jdpEZ_30iZ*K2p=j_6FaxP>NP6jfTpn6SHfJ2QH=po1NX}cP~vve>kG8y(13p`x2nJ?M9p|S6L!qQE?m8C@H=)l_7)AEl;fxj(4JM4_xtS ze77c_!4phVhi6Z@E(5~hQd0RKX=Kwe#76nd#dBpe(Rsq_+>kOZ%!Q-zVuk?!;x3`f z*`U`AcryyB_Eu$lY<5c3ufOs7Uoe}Gh{r@+7`~J={7d|KRs)Z)5tr1$DkQR#35pxz zKhYgl?j5VT#dtZv^PqoxG*RDqTRy45=5cq&3RbI&TJ7&7FBr|MWzi*3Mu1f=p|lIG zyN)+DBWOvuv^M~(a0z_;>^E?5?97c~c+W5#LRtrj;a%E3{90aBnEGB#Ldp`s( z!F*^OxQ~SZN4|G)RptCc00m`xLSIP0ec6+X%~HE%h7>UqYJO*xrN3%-DeK`0 zL3pp0MvlO>HkwTl5M)V+1`u9K;=G~A%anX7bQv$l$H#erA^siY@Xr)Zyn$S#6l%8b z=%&ySs5t604b+{+ACq*${Y#Kr`lgUJT&)3>p`$HS5hzfZ!eqd)DMo&x(W`0^l4y^#n zFMH_*$HP-}Pkb@;s)1^;C{3_DO8v6NoAoAE|MD~@&Dd#@>|0m5x$yhIpeIBEl)j_c z+t|-+{Ul5L+ukrdwH<|&`+Et!p1T3x6QX&H9I=r+qwr{NdST`(b%J9(sIstvc~IkXv1LL9n0)*1f?Il4ABS=(zw)5nPF7TG#B<&26KOqUOm8WoTnn8s zN?Bq*^7va|@h`|f-;rHvnT-_SJe!}z3zI*ZCMybE350+^?f@qdI%{c%;0Gce~IuBaG+Tl7vyUr_!Dj4x|XG zG~_W;F zV*4S~z&^ zCIVeZA{bjEl-lN5_shrMNni{Qi8%D?Z8`h$U)5+m*|S*?kV@40->7OEeKH8I=-T>V zT#@K#I9(&{LrNRClH6vaqv6=#Ml@hEh`E&*>XBh@caq4$)%*0f?9$IFD08_Cp4k`m z9s8H>MYO$y#S3q?ykZc=TmW&O13A*&CoH2=ThVt1O~zL` zJ>4-e^h=I95k$>dCXjd5nl#UUuTNN_E@oOksSH&0yiV~0D8?Xv!oJQF|9PpJE~FWY zRwY9hL25B0g{?h~03F5^Ps1C>_d0`{%>>8rfx@yJOTy(3-FC}u_?AiZ}Sx_?q* zr53z&EE8VSH_?*!X_Tf5-|qWAt#INFjsX&EdwM^Y{~=~R1Za>*znRRlaS4Ez2n%<( zu&UBT$RzZyr8IrsTgx(Ma*U!!=i+vH_>+~~-ze4fCM(RGg(((_V!NYXwWXR`6~^{+zh99yd`LLn6_t(&2+r?#PeQ0MZ%kh`BM;Q@ejYeLLWI<(?XpVkKS{6@ z#o#*?Tn%+4mniQ@VO0W*P*J`yi=C7aRxhR&puJ>vU-;t2g#XedvBVD{!{9!s&n?)FtO%DNrKG;4G~e4;5n}Z4YqBD3M>i)CDLC1yL*6gsi;T~ zueRzdIiVWv4E;53-PYcy2I>JVfHoU(gPll&!FyCFWr!(uCu-vU$vlh`=nKS_Zo#=X z^uk_I9?MM7XijSVZc6zkZQrUM@%RY`0wMV{fRTKy(IPL+bfBIzH!7pn*Rwny@TEb1 zxp3luyo%U2U!`o9(xQ{2yPX7=$l?E~_kAC6Oe?gylCeE<#1Q-Q*KEF&`3<|D{vK{( zrG%12xQdeT)^?wlOR>>4ctzsrupPTGmE3R?Nqx%HPb+G;SW^1Ftp zvU|T*pZx&|?>e-ZmFU9KzO9J~LJO+36W7TV%lF#{zI0mNJ45GGP3Qyvo35q!I3b}w zS2UWeXSGtoT*W`}S`a{?AZrVX!YJD(~ez?B+HGy!avKR}#v3{km@@IvW$yHd+CDq^W zjfWprG$3KWcEl7q~`YsNuCBXmi@#A$GC@II7SY-q;Z%5 z+XR=0SCp!NXCw*Bixd=!hcBWQBQP(W3Y)D=!p#X0r-@B-siIV}l?SbljFm1DG`SO4 z%`D;f+&)h^s2XEZjq;`iaO2c_P*Ll2jz(C5eV5m&*V~(>KuQR#5a9GWixIWMnM=KV zTDi6nOknF?2)`teKLmi5b^bCulX8Id0)ANyf>95a$8B2TmZ0(#XifV@kb;ksV(Pu{ zpN4C1gm~mbm^+k3QY;ABmO#5=EYg^+xSWe1`%|Lz_MW4!UKlGJ6FE!f8rc9M1l?lk zQMa0)oX(q}bmXHG=y;?q5?AT-7B8tmcRYPUTlEc~2nwNI*H8ic1I$UN)N>fTYv@Npp$yGcGEfk?Q9;7QWnA`8`ki&H#0GEYO4i1NrPN zM6e5BU12dtr3nRAavmi-oMxS?=y)MMrXkq!N}06{H)2u5N^SVjN~ha<@vcE$-WGg| z#^`5?kV+NFVm_@`{B9x9`>^GZfeWCk@{w#A%!eZ-w5-M#Bklu^o0J*4!*oL4;)*U? zaeSn`Na?XHJfkzyK*LE}PSKb5(Sa{fK9-%?s(GAt4R8jo3L6fOa<5*moc&tXHAKgB zEU`uVg4u2#C~U40Q~kMm#L_#2g!NKYe!|a5-H*v5Q-OEM0CF5{KE+rb-k`IR=y|rd!)2@Pz||c~E%zQ9(GorfMsdrl7u!Cg=G?zh>kY^j{XK+r;Q-|Cp@hhxNVPx&b#y4$(UOTfU@R=;J>Dbij5C7MNOfy2826T zobWIBt;{(x#e{v4G$Nz-HSTQEV9)vQb~9nc3;)0i8J*9t6?c6CA1rK3^uPEdW7iuRb@T#W6VbUUNdTwxuJ!_db?1cTQtO!b2(@H=faqZ{nD z(j+)P<<${3Pq$wk`u2bANIfac1!+O706dp04BKNJ`_h3@R1?|eoxN=}8prq?qg}oU zZtm&rm+KM&C1JWLu=+*$4c13f@qKGeMx%dBhCAy;dzN7}lvQ|&%-%!mOTcMOZN=MG zXI%|e1kq5(2wUVhYG6PJOTmW+lMiwvK2tDxCcC%%b!(((fzospGuj zY@SW;9npK)`AR*YsP#ZTJ- z#{ijye-pgV^Oveq1u^&0B5|tlfST;f zI`0-~R$;&DTLcnj2d&l$Um?CvCS*<%Qng>rk52E}O|QifKdcN{`=$e3trZ~~KcR6e z4hqru3j7`F%LyZ?1qrnQlFr_oz7O-~DG>1%ESc{ja@A2BC#;f(9Hn+gZlKXQ+*85F zZrJV~Mbb3YtHh3Z@a)1h>cUlP3`cDb5kGy99YgeqX0~Fv6EsNw*k(PZG~H%}&J5sR zta>F>9-v@f>V?k!hz8p?7vm*d&MtSXIVM>+_7yCyST!yr{ITTbJVBfiP;7>OYmC7WC*zXh1s*U?EEB1} z6hp_t+0R;3Hj;!rS<~+X0~vTV7K6jFP-W+#>2MAdd?dRRO8Zag+AP9>5&1dYD2{OE z6X+ag<${BIh7LKB?c?9cU;hw>Po-ykhF3+lI&3>(o(tsadhmq84|N`hefq%8ZluK? z&9rYh<91tlIa38@_F%zV2zhVS1Y?bQ@>Pk|r?iiTgfcj*E8lb=nu9pZyW{LyFNPYP zFb64Bw<8hLftz=dtKM~hBJ1zQiSL}vIDalN1U3_Nb2 zO$xf3ye$cw006OGNYNNIH-g~Wyr8pw?EvB(o;di6_Fg8F#7=5vVKSwW!M{3l{gIS+F$C5r!;)-xEWKI)_pfOk?{=iWgR@;!6V}5J@p4knIkah{hVkW-czKhQ!1~GXSS|2aw=Z>T_8cqv zg0S?m5W`gIrJ~!^4VK)ut6;Ek_@=)+1}UPw739lb(n{HrGOiMgZKS=24gCg z>ccoglWVl;v-f!4390&AWzLOP7I#9g|1{cKilRhxHo{u~f=H?lvWvU1TO!@PF zH^E@<^@S*Pr75a+!2jB&;1Z&OicS!YDQyLy6s{p!n(8VpACEelx95!2w20Xt{DYRK z#H4(DF}yzHl{U@YG$hNfG(aapOpwE`stM0*z^*hCQ}(>zx<+^Zg@aIFWZyEh^zl3U z^2t4au#Khnb+$fJk*&^uuZ+78uwb2Yal^c-WW={qboz6@cUz^u0vA2KWD0ms4lK?z z=1gaA#*!s((r>iuPNa6uW{Mjjc;|Y2dsX)g&%zeNThs$9*TNkIa;5GV&$Q%*RZuyw zW-lra&&vq@S@Y)WI&75Obiqhe_T?6sX8w#C3&#M|-R96D5z|eWZmOV&Ca3JHS7$3n zBH}5IQgEN0iBjcw5ZTb$Cl{Ff@Uv>9?z#*fN%*AS8@csT2h8zM@eDF+ff`5SrPb-Y z$Z$?(L=R?h^^N8Raubf|(_i^zT4+p$d-qJUFzR zo837Bj7Ay8NxpMQ{QhXcgM%$y77AWDMik&*BWNC)*hFkn3HXs82w`wX+Ng^ zY6kK>_L26N)^yv6ARJU%2&Y!f&ZC}qF9|E>E+%M?xGq<6RD2XG!SZ<*SZKyik?kd@ ziXDZ1dHzXNt&m=>pCGw#rejm>u>+RaQrh)0Srw_fBLcdO_W#BH?T~7)-vUX!7tOH2 zcm}wwh0H0tA-4|-Q&QhJjY(;gygz&NJZs7=H^CcvQ$30OR-^AB@6?DBW>0M&ILG^< z?apa1bIqQbm70-?kb$mv7q*pY*+hG0O*iS-lmsPPQ7=+6hZ6&68!;VscijEN#lEuc zWEE)bAP^C&Cb5^5q9ZFi$VajGi3#i5OR!@v|KMa&r6c)sgOF`atAA+z0krIy3AVA?=n1tNn~m)kXR1!E|i~?KKyDiMtVyibW?EQbz@|q zFI4r8GL<-atWcLF3#ues=f!zUwgpu15IBEGIfvhgMk&HmBQP;AD+8tWtJ>6ASG=~@ zO@M`0u7G_>=IDrGadywlJ*wffcuf4&o z^F^9Geg1>}&Bxb<=H_Y=>RTaGoudYoe7`n9b)Dn9$#c~dmga!j*{~z_RvR8S=o6ZZ zKwTZJjN{ifw4tVj^^?3z#}BBais? zEH|zg@yy_OJte0S0kJLQpPA?Nt`t!XX1}(vM?&{&;gHkMspmEw7 zTdpZ`H&TQ??$EhBU87BF&4eV(UPUgqL|mqdzytrH0v8M<6i|_G?Kyb_l1cV6+fESD z0Nqt`(rdR^?{PKni6@ur^a;H6=scarPaQ38VA81=zlm#O6{=7O1?0b0!e$uw5oIcW zR$29RN{h9^tl1gJV`TQ@XW4dUgN9}o8ol@J*Fa|_HeHDU$?*Bd7GCNcgXd6V6b59w z_hM&OJHduPKK7QO)+eXsMO=*$MJEL@!GUC!Zf*n`vnspB;4C4t(})4hkM;J=RE0^fXw(HNFgms`dzJk%r#l|n zZDk`fDJj)bG05YO+i24x-$fsLo#Fn@W4NStL3h%>@ zKj)@G`d}Qor1M%|Wt`HeTd^*3>vQ`t{y&OA6~W>W z8{3NVAh^OXd@zYg_`Lu#nyFB%FIsqeKKyCVgwDG=%eLTvyBHX1z4<*sRT)3f(RU@Z zram>c!TdecnPrkoV&?Z(c8(L>+EeY4PL6QTC5u++RV z*JdcRt4TpSB=>I;Z@Qn0kRt+vKIg7)aqngt0UeJ7$E^+{*hpp`v}eC9PeN+d^aMdr zu$ZG7J+>;e3mpuWt1TSe9kwZ9mD)nQb1Ci-j^FKbt&EF_TsYf0OMgO3jZWGqlUzoK zb<=EPQRI{|>)MUHv*W4Q8Z$`e?ju2kJVrWPtR6$IbV|iyim)DAjOupfGMPDtT>hBe zcR{W1*L=V-F1y347^lE)iny!BR3`Ma$kit;@puKtzH)qojp@LDYm;Glz4)yeLSJZk zdcvT`Ap3$c7;6Bhdnh&e(nY?8c0VmJUc8{6VtrPq^$a_s-~A>8T>za_w8zY3vs0xs z^cq@;^Lj$<^1gghl1nh`gLe@D>Xxx#rtHa#zEk4|wD){eC@BT2ppX0D>PgmPKe5S-NFBddySW_?%v4ONqa^X z&N}cgpHPpJZn_9fZSTkYgQQ5GE?f|3kKsw1v6zONqLRHz#})}#jxhgyZZ$pR3clzF zCa3m|&rez@w%q(s+^`UEGqZ$a+NBJ_*MGR6g^e+{qdMFXJ(SI|CgI;^F3kMm z+0-gvGaZT8HFa$c@yHBqHak>1yvF*_=xSe^;KBu!^nvrj-ALuzi9uCn9zG=ls)UjusJpQI|3}l8$3wZk|IcP- zFf*1A!&nlDlo;Efo}th_3e^;)&_k4Jv}l_#mKLN!QRH)I(HAyUwI& zllIf^y65xz{^51b>l`zl=f1D|y07JZz2D?CaFt`=XW3pKpj%m}fNL$=q?FlbapX`( zc`)~rA@EHhetELlWT3Y}5nm<#mvhYgQb|s|E?fBJ8+h^A=!;rbN5L=Y@M}f~uJ%#o zP;+~iLi!{?a^@kiw_n`LT3t5^o89-nJXC&FY5kPhSIy{tPzqBl9rK8DmDwP6We9nO z=~!Z}6Z(6m5yVAy;$Gv*V*dz2#u8D?Wj@bc5!n;9foOLkZn)L-F;jM!V4qIb5f)>R!~l%A@!QSU0^XAKFU zP!iQ()&X!9fE`I5A0sZm+?GPGwIDj25U=PfSePBy>S0szYC~W$)6$aQ-GPP$Q^G7y z#pKQzyOHVq@-x`c|E)4A1>F8`L8~H`*k%}R*Lp9I$;|&jJh=ZA9Ce<2`ozkLIOX*u zO_BhQk#%KDb!&j1B@WPJa}R2dErd;s0R)@RnzaiRP-&%rhIoodqvv$)VFwUdAdz zpgH-nX8QG!P_XaaE&n-wW7`waqygxAjUd8Unn_O)9`%SYak!jU-U@ECOhIu7*Uq?SD*KdK|*KY>3kr2R=Vtk8EqOSeHzW)e_da2T~G%H)}NO5?KD% z0HeLnUJVSk4z!mpJKVu^UE^qHIeQRJ!qQ(pUM0iea4b;G%hXYDbI~Tm8Cl1R}I^qmR(=i z;))++sN;4d+D-Vp(ob`RUV{w6k1f^_wp%G<4K*jPh%|3&L$8+K-T6OV*JL}w!IKbE zr0Z>DKJ!@v`F3RDP-&NU;y9sJB?AFjY&s|Dl&;h(EVIz5N)cxprn8EO>Zy2q2WG)Z zKBgR8t1OzM|DZ)cK;G14{RTmr)Ozx~$Q{y&%d`x+UbqLE9u}HUJ|3o=^bFkcT>D?2D?$ZWLF$BAU0(?yQ}lH+Aa#auzLc%6 zK|pq_7wchX@tyVLKNl0plJc{3$ymwTSQEU#N>=Eu!PY0v)8&IFKcy$iIan3HTTP?H zd&utFYCeu0s?nHF-6j>PR`7a127qKD2pj58saYtHzCpu|yp3}qXk9q{)eWZ8LdC5l^ANVYpT%;$lYPU}>0ZLvUE7lURQsu=BVxGSs|ON&Y8dk9_3Xrp z^8Q0Q&FW#lN+Xjb<-NkzK?|vO3Es2AXzA#g<6eVNQkpj?>fUhMKT;~j1AYKxgvr7i zLG3omtKG=^4Y+N;k^M2fDIW!sBZ+xyn3*?21mbVnCVu-|;`R*;-zV=}ww6{Jas5I) zBW+%j5wgS8LsR+Zb>4VO_A!8TQ7w2*YH8KWWl6-9BP+s_QZgyBH~PYNZip#X75#|)?l&s4 zWWLr()~rSzzsbyb@0ND9MET7SP?w?%ZuOzCD=$Fv3+ez4?S#wXk#8%X>p4l5=*jko z@C47%o++PT6VsUnr_tjnw-PILMu*Uuw=S2vP;tYPZC;2l+EhJxYw)lC#P@Ux70G1b zH`{R$W9Pb1u+fy}0tK%ZcI`Wu1}M>E+dD*LGJQ31VH-HptoHX-PMnaj;F0|n5+1e~ zD_TCdNg=}b>Kz?H>wKkCpV$8y5|4zale6x(H$Fa$W`*IPi?k7dkSFso$KCQDjx$4M zQR=n<(bHJ~1KycTwVO==A{`T=hi1tX%aY0-y?0gZX7hE%Fg=U162G?$o1Rrwj6&&= zC@QWu5}u^ZEC>v1tCfG{m$MFjC+`CixH4nUH`G9Tni(b;S0xcy-Qk1`$RhnA&Q0 zl@MC(ifsOyvSKR#a1{h4kEc{ee2g`q$gTA1t7gEPI1jvDNRI3yCg|@vhJKH4}pQ@nVBkN}Ll+Eyx6>uB}6AE62bVPe3*N&v< z=6uTJ6fCSqZJRoi+9&>1TkB!E@C2g4 zeLV9~?70L&T*cHx`k%8sV_|~KhtX_E(A)5JQWsSWPsF*xN~`p|)f?u|38e535&<)a zygmMciww~;4=}+OFE!)hL>XQ>k=onm_gXY22x$ZTw*6qNlsj2TSg>c~;u%NA4zw^q zlurG~Mz-<-V`Gv|7p?Okv$OJiLCKm2>C>zom=SD@^(s;kIkjc1%`QIk7A(SnsF`1P zRE0o_JZ&n`9zeXC+Y)>9#wCPZ;=jJ+E47*BIyHO0m{doyx@S(UroN}cLY+osWIo&0 zPpfdvpMUr87uyC+A0_stdAld7iso^o@8s|`o+XNK3yQpC9a0^Z;fAg! zHqdhAisKpE)9tgViV}w2T$6>>#(!NISuxaB1YK{DV)PTh#qT8P2ai;|RmAkRIpME+49%wRP4D)wSn(RMLV=cwi_Q{q-RS{t>H5 z@nfh6mLMfWH?;$e~G2P`T@G=mZT51F{|6RdgAYt3Z;VfJx* zos~yC*MK`2DHKiRnye&(5`pw9nf^5bqqQ}V9#m}ikO6;liK)y@bZc4S_n0=$OR8+1 zlj>5$)bb9X4)i3yR?2)?nTd1?VT%M0wIWgAjm1);BQ4*}6+qs@$hXgJ;1(L4KAl^c z=};bzl#A{Zp<#v+bZwjsAn&o002rUqro_;=!~>V_mZjfnVQ2Ig(V z$;$F|_4ly~zhaj?xN#y{4GxO>vE7fa@d%e9#CC>d7tXpcpTV7369?#svYw-VHRH;E zQYiRp3{k@^@>Z4WK*Vxqy-HjfLjJk71UB4S{yzBIbEnM^XASgn$OCaC)p=k}9dM)5 z)C-n8)QIDhF0PW7B@n1=&N>eBa5_-)4t!@3Dw#{~Ow%eF8*54eCqJ2y7Y*eF5@X;8 zhvP?wt6ogV8~a-GgIE6&DIB8sf++S|dDpz%gQLBC$HO1bLwD0)d;0VV%$j@U*)zmk zN78c=krjY<42Ohsa5aj;Um6JA3`8Sfp2AylQL$`w!jUCGYaWL@F&wa!jqy~unq!R- zNr;aZJG*E9k<`Bnp?VHUHfh%vboS_XSX?=8LdC?(I_lRpFe@sXt|QpMIF;_08xQ0; zM4a(H^hup@*StFOi5e#HE5Q_B{9APtxCzng7@sIc%RZgsI{p5HHO}}Xt}4BF^7e`a znxfp#Z!NVYn5aobtWqw^bw=eGI<`JW{3s?4vusk=87%t;-Elb_5;N22*^?Z>{Ja|+ z30+T}c0_wiw?~1-QQP-20Ix2korUZEN#*G-@o6{PsY{k-SEiCR6R!{v+e5!_1j3(V4+#|8Wqv={|sykAn!Wk758de+C2vJK9?=o z0V}3j!KlA}J)O5?Wdn`f_K77(KkAicYc?wMR;4%<6#xM-mrcypdp(}KX0J)gFF_%Hs~|LI^jctxm)FsA4(MV^ z^Q`C@9h1u6jTCo1j#t#p7mv7?@SOf6xHXAFiLC(Kg&&H6CY`Vr@_ngu=~syx6qWLa zVVaYz(--BnkWZ9siuxq0)bS!B9Et0i}> zjLpueW&LlEKk{jFdCNbcf!3^c2Q)d>OM=dXsdGjkC;KA646I}hg(99qfu53IPf&jp zm-pyah<#;WmAyjrD%7XMV6h>0<4T>hIei}dPQ?QpDjb>{!z4c@yj!&m>#@DXBW)YR z`Q1JOFK6*gHa2^r;<(>&G+}b)S7_^uj74N>Q!%viHqOY9R=JeDO|p=6G>;~)FbNBf zsteZb82R*!Bl=TY52@VCFT$j?#(fMK`T>U0m;kL;5r@vq!=PfQRR2USq34d4k`EC9 zo?{9|>2~rMoj=7(XDjY8RM2BnrT51juG&Z{JXq-SSKJ7yu%xIxG>^qSklw$R)zhUc z_l~#Cyz4Z?K|6Ld;+m3Ki7ojo;&9c3I0R@@b)YQWQLs{)9&nyj(w(>K9uQN2?Efp*a_T@ zvE@lWvyi%{7IeoiA(|fU%K9}2$aPB>Q>BA+Ofg z76y;aJ-f+veg6okxH8C*rDVs#*z;k7Y+Wk3a)V^aemI#0*4U$r)DgN2F;6b-@mp=eQPs0wUCEumK}0rj`S{F{P#+AHAeKH|%KtZN~bI=XfM zJ0R!ldN1wj|)>c2PppN0hMAo?+v}L8O1q$y3Ev>cqvb83IY(v5XX2JSy>y?1-HVrGJNMcm@%A5S?wTbD})wP9Ufj1zo*uqH1h zg8n))7h4*_hYgp|a;!O_!8~Xa(WZsZfQ#DCHk&3d z(xew@=05m1VJZ3F`~VVgqQw-+tq0aYONL+`Whm|iaxfC(^tooqK4Y_S`SG9sm*z6p zL2^gE2bb=}OluL4-%OY?TiJR6LUvVuzUVXRc~zF+zaUF-AYA5PtPd?|4YZCZ;v+Tc z3#-Jl>|Mg`TY2VjK=Fjeg9P{)z#>!Cwam5->zq91d3|+&cnxSKtQo)zmNRO;w=~pj zTU3mywr|Nxq=}_hVgm_D2&B@hU`sL)y!-tfQG#DcG76W#kaDHTPD$vZzck`0IpC^LSwS zL1#wOG+J^VgtV0RE)uhUK`^yYHPy-f+YREQIcCJwrqco&OA|=ZwgXgv647 zL^G|nwV3Wh+@&R2H3eqA6)XCkSQQ6*lnIxI2KbLlWPP%uxGu%$vk3agw=G7L)aT-^ z1zSY9L(|-hHP0t6K-*G0@#4R?X6y1Z#{m|G!cTb|kmfq{2i5mUYM|vOVt4)?RK=<5 zZ>eew?IRfHhsgY{Y|td@w0Ug~En!6^F!)I_*iTBPk?U`&Xfp(A)jXEZt$Npl1B<&RM~__RLKKF@igwg@ zYTBP)OYu~<=r&PKkrpD3XE>lRzbkm<9+_UTs)esrMlj%iVAouO`lo;o5K|ndvwk8> zfKzu;`Vo849N)z25&$<-j8t^Gh=ivqeHcwGtfqqfo`%Vp6})X?fQ0V;FW~LtAAg~C zc@j#0c3Pl1t8vn8bsiv+ZX@ihuj;{Ns6J5D3-(6}fYrF<%e~YtD>w^ zdcg4jlwoxIq>+i2`lGAH(MVEUm!e*FWa392*Q0Fql)9i3n~xNh#|WxYgKDgmJeqvj zQ_5Ebwk|6&hT%T6&6*lzej$D(hfM`$UuM(?Z&=VPrCA;;oK^=e z52ln}<4Ds74Wm{fH62*={%#%a)S5#p?5*P+YH&%&P<49>bzqPNY)`7@Ot0U-=!%lO zxFN1j^rdsvD0lh+fzt3&MWFu8oDyF*FiAh`>nPO&-KNdz6t?OC$9bP4C+kw%>$M-@ z7w^McGZ#5fR5K>z?ar>T)-cAZk`70d=+wwqQ8Rd*b^iF(o&8HF#4juL64c0oP92_-x0qRyBdx+u;iRj50-YP5A3aY4$EBvx~nQGLxbl*({ z*53^&rRNZ-KJ;{6Af^s{o!gk)D4oRL^1)&IpfoCg+IE_O^M`!V-{Ufve`d~Eip}1H z0Gij1oO%T5ah3Kik@^n338%;TRd&!~qXGjleHpQVEizmx@w|$cPA4E-oS)7=rv{&L zaRty?+Py%bqiLG$e@@mhP&y1%M0U%WCF}6l8zu7$WqZHN7nBDd{max$mAAOipe_y( zSKD-Y>Gok+juW|~HQVAyJJ8xlmL!^ox_aPqEe!jDHIwD%$%>=I-D&FRVW#PP3NiPU zP@_nlkZ2i^WsL$SEyKt;T5f@2(68L3Ovk3c5v#03oSyRm>-AvRmXNGsvNj%p&@~(K zN60>Us@_utb!Q*~fq@}DCAnx++zbYUX=eS#3~mN0r^D4 zs=$TfPGiD#cA&+)Hyf_z^~vPgO>K5`BbqxH z;wAV|kMhHYWX**;U#HNL{vxER(^uX_#m}^rR=o&X+DJSK_d-eW@%)OqRN|jIZ?4o0 z*u1$-MY$jwkB3S+subWIcCLB`k|n0H>a02Q#%i_diOqXUm(BB>{#pq z))ok6+n#cKh6V(!yO(mMQR+pqc~4Kem~9y}lo_N#o~2}QXV)o~?EzfGh7CSFQHa=L z_)yLB37-5c8>ew%l;@agTt_az((R3cX8d7Qj3C9kMhV$;iQf=efP?0tAK!dN@lNF; z9m=ku{qRKcepzKZycAKt6?u>>=B_j4Qv(6!K~FOp5P3?dfuZ`Iuf7sH&&AI{;aH**ajpe@YGt-{9<954S>UTC!5afIr*|1#UWV}VO7i!rR@4CjEt^cp zrqSfnDDup4r_aLYfWw~xmY|0Kj3u5-!4@6Se&d2=2@3^JLM7dCfW&$SpW_USbM29){_HtHr$_`&qg=DPJ;BlSd|E<o4f+YFJ5@(E+NWh?Nq zj0X$?RW?Mo=G7OdodgZyf`G%jITK;x){eL$)D+vPJHHuJJ;1!vnlqmE2JPI(s*cBf z*(H04f5C=|DJ=17gNG?)nHNx6S8a>^;gfaoiSww^jk@)l__9z3r@on88>;qtt6&^% z9E@H3u+c7Dt(PNR{)0{ISwOhpN;UwAl49Ye&$66-TI=iF)lZttid zO8x$i5DY@3qF7c!$$i?|&JC}9?}>XM#_e}-FC07?`$jdk(M{`6rdT&Z5`bt9 zj}G8d5^wD}wC2B;W8ya#NSP)61hX4J8i@aix{e{t;rOt?n5@R7@r=*$gE9 zmUwKz6V23LmP1nssXS5D{sm_Cv6@X3(*dG7Djj^m>fHVj6ATW7jRRsP=^OcRRu06F zK4=ho@(#6nS7*F3{srb;I?AHz+pt-FSa5SAutd%R#P|DR(sayY)0wje4A3<-xZQnz z>E^wN$zvl5UspcUmT3s;)NPSM&0RWqCVL8md!A)qZED^h+IpU}aFv8Wc*LsdN+k-7 zU16)cg72G^O_K3+gUWi?_(zWHoNGam8+~fOMXDnyKz9ePWjr`=hq@jn|4NM+e5Y!Jyv`tiEo>VWiIzT~el%{6RocALc_~(l4Ell6JF+PigK(&Z!@IrW+0`Pw+Ew^7GVp#c=&*&H) z-)@ihq0=M&VyBUgO%~n7m7mX}iYekAH6=T236HI8k<8Eu>-`-<+U>_y=<zv$~5Zla7t}G^2n_Ubdp>>st>;yxy|;k(s>%Wj&5>3)d$bY%Tole65G#F zOItIo!-)pUZy(?d($E1ySFCH+ygS8q_$}+pmGQ%|L@apC#rijx3#! zC(Sa}mWBfAPZOu#y?5HBekB*>oED$`W!Uv2+gGQ4v$4#<4!7jv`R0xjUHEWPN>V5_ z{#(GlkIXjT*=GZ_@)*sfcf@KA%mmiWoq#h6y@`|5zU$UT>od2qcN1(CXcLE-djMcxp6r2N4WRyho($Vs|^rd zmO*~4P!-eNN4?g`T@<(^_!c?NUyXgcEK?=xSl^Y-#3hTZWXV$0XSdmPXhnG6Eoc$?dZXgls`=QjUh%wR z*pla@y&=XOMvA8t9tH}_JV-oD#AnM}78_Dx&-e_;Rg2)ACBG=cy)-A0uh3cSJ@DRG zdUNEli&Vi=AC*BJUuNX_+lnEz5COoRTJRtK!cQUv=z9Hca8mMJhJk%M=1gfMF_}gLlYQC^FFl*%6GjcxgSFwhF zs^Z7*B8%-LNmFEjcQhRdJ(CNe}K(?*W%)aRoW_x0@IHlV$^&-^f+3h zH&!Cx*3T=B{$VI&=j)aD0yRFfbRu?YyebB5EG&GGb~ZKB*wt}DeyJ|33FI`{99fie z?GvZ<48S;fa-em-o*&(!TmM5}{qo&W*IBW)80ZW>ep=$J{yi|XWuFw*q>PV#YXjt-l^QD ztpQReJ#Nd{1|$u1*=>6~%UnpoPC)I{&Y<@rB2bv>3vO?AKIM#?%%LHMJmx>JnxFPM zC|^Jny9GgNSq>iAhPkqkfD;3yjUX3I!+dxrv&2kS-YR$;RILP1trb-`Go!3;A{qH) z1OJGhB%}(E5HWocY4EfULP|+)_VF#W?uATg>-6e8*IP@Wyxeop{nqsSZrdwm^0Ik{ z(-JOD)N8Ap3#LhGVcHGfBy9dU%j~;=484wSg$p%fz#*=MAIbWoBBwGXZ|h@J^dp^y z-)f54T6TveK0T6P4#Vd<-1?v%bWx3^cAnl(>pbnBpX(%DFKhe#0`SBR4Mar>TESUu zZ#@@gS>;3Izmn|kA~&}D|IycMibjs=vSfP=;qncmUsU%GPw&e#CM*__Unk$e&(yqw z&O4gF0BjKP=jK3DHu2L)79@w^fyNcEV&3$y&Eh2s-(iB4X!EOJAmTv=t^EhdGSYYhvw3(|9yaaUbvn0K(yQ z!X;QAn`ZN>xYzl>&>vBc)+Csz*`{N_4^Jn=I*yt%a)Rl7>5J#IKBX5gLVVf-y{F53 zJYsM8FS<$59jtOj(1*3b+61Ql%LSc-_fli-6xHFJkzmnNBRi{>(_ ze9U6m>J`+^9s2e6sNrFXjH8+2!VN<8iW#mRtV~~W{XFsP--`Gb;$LYRPY*^tQ%}A8 z^g`L2m6G9^VIlbzH1dX_CW}LITvW$w9}KTmD|jgn=%roaqW-XHjUoo|>(8pP${v^2 z6)Ac^u9SKs2p%<$T>5tOK%_!T1@PZ=l6qxe%L2&(Rx*`VbM4fT+0hvfyLS@RCa{Kh zY9D{pZ!Ed0rFiokJg1dVOdzR=gm}3$lc{=O&?$90%#)NyEX-eoc%{VI_u~}z9vo^+ zo=E(+h=S9!n(MRlMozETF2w`bQisCe#u{f^inQOLvlnDhuvFX7q+2iS&d?}k^$1O9 z5B>uIk<`Nt)ItL&pn$6#4J-|3z9M3Ur8%mYH}Vo-ySv*Aen+%ov);hA@sgk{>t#T1 zB(}e4irniA1O1RbP_dChx9gOFXmjjXlp}^sIN{HLDF4G4jY-!&Fu`v~+%-{!5UNH% zq`mvR_>N#ZGMl)7OM!HC?NXqzq-zFV`3)SvciqWk-V{ zrF{lGwFp_e#oJiEcN!UFE?YQMwP6ODL0c@Fl=cZ#!FB5OZ1*Xs7l-eTj#Ng{T;W?k zX5J$oG)0rG(PTq_=9sm#g9_EtAJ6onvbde`y2h5*?X?y0iC~V7;LG4dpdt&TU~ni7i>iR1qfj;LUFNP+o`eN7VZ(; zZt%%a?zQ#_vX@c`Ic{wl?~PK_ol8_}v=QLf%~;To0v5IocJ9R}87S)#`>d5RVyT(9 zdZjfClynn=RaW?jB=AZ~hr%vz%_p72wq>juPW;Jp7O&07ssr;ill*2oz_OdIyTIeA+gn*Ht=PFL`9( zaLA5kC2t-l%o8uMk~7V5-@Vk{Eq%Zad~l~FyZmQX2pj9VK+q3~l~2|F^M}Zmq}|p$ zl=L34)KIKd8=g+61Z>;s{vm|2uc9+YdW4O0!{TTIV!!G-<&A2e{b*d>sU|Vo*30Z=bGw z2C6`s!vl!Gh8R*dQV-OBc;wdzU_I|ymA+}jEGo$9Sf*t)4smZbZ}*xSND=MUlSVP6 zmnPk*)lpw(6#O$r`T4z@?myyJT#$Mks25Pe?@bni&G2rP&x2OuG3;#lwU%?oST!k> zj?-~Ir4eIa1EI4HTVrbtF#w{gNwi_Jt2WeN9(u$(s7STA#_f(VlD##{dU zXV$HUw5IPUL+?f=6K7V-<+uCrX>_1-3C@Q##)04_)e&V?CCY7WgJv2>1IdqT`XUZj z7QjE_YVNuGV+Lj5b)2N*z~q1b{72*s!`B6MBQaIRpYCc6BaKog2TK+>L z-9#5T^R+pOWauk_yl!}xuJdNF{r&KBB($;!oN`wdN$9wJV=Y5 z7Ud8g@z}rf$fjU2BMOa9-MbQmABnzVwf}Fk@S-)!rq^YgG&X58^UrjOt$}z3of(x)741#$T;DCOTy6;t_dS{# zW94sD8U^iv(&}>}$PMUA-@ctnj@wKgYeQ^M=}ej?;hQR|94SD{z5d}6zp9dP|3gzv zy@OazQ!$SNu=O{ydW#*}^m1M#=0Pm0p@fn#DTKowLSd7(&a`bSv(JDfa9@igm54n1 zOYa@Ktnq!%ec(0lcuS!#wnJoOGKQe~LTq?+x2<=6FI96sfLJAnozy-hJxyX|4Y)`I zx_EDIJdo=wI0EMCCurMA>-G^>-y4RqlO9T4Q09=!@r z7or(!L59$@}jdSxsdoZcrS* z1n68&6>qfa0c3MJ_1`Rniw!4McJL(mjc)k!3Xm#@d6D8{I^@mKu(Vh}3qIkHF^7ny z|KVX-q&p_I|43Aqye=yogBN8M4d#|iyQ!rR|8-Zq#_hqXiF)`vT}@8uRaoC~7Vll2 zljV%GsE={rmR6C<0qob;mcp=o2HR}NDmoR`iJ z)%cTsIe}sLdak%+tufi^R7yW`M*vA<~nll8+fNc`0*KOz&9C! z6^?bHuRxtFup3`|5_?;^;yL!gkySH&4qW_{-ivY(ZD6II%8n}9U?f|3x30w~Doy8? zDxeKI;o|^DZzp-RugGJ0+iFqmI^v>1=k`jDYdJRJjQyP*wb{Vh0QLGSQRDeuvXhw{ z7}wMs{##eJK{8Ymy9umYa$zB)Npw7Q2S)${-CUZyHxBSwVT+hlqU)Oojuz%UDF5tU z=TjEW314CZxos$7#d4bJtl>-Sk*m%l$@ zNSn^+s5cu5FSyt5(O)3RZQ{PsqOvHZa_*%sd!POrFY&{%IEv=y%m^?9C9&;br&&%( z$Yn#Qul;I04_xDB2Xs62Jgn+uipbHnAoMPJrhIrOM!c2rFq%?&AJB~yLB786%?47r zUi|Bj76#JAc59P}DQ!dm)Qa*ERe8*+ZJwrA<0e?zfwhZ#1#0M#%-$avvjY0J|I_VB zh`XXX54lyF8Rd*FTIwOi>d}9(E_lPwr7&Aw&vM@U=|Y}xE);^q8sPkLWgSj%obIVQ z#^9P)a=v{D!wOASh}{|C;w5F`^1vMluji8qm#2YGK0tP?;m=h*n}b(6Ao^PM{NhfQ z&C9d{=z1MYkeKhRH&Y?7N;|^kXo%olrc=kJPHbyCYOYmNCaMntn z?+Mp_Q2A?!V$>sjSzsMQN&GGsZ6(^>EFtQda@t}4z(-EKfV^RaU+)Br7L&B~sy9yj zA}(D=x({*CC(~QQ5s>0^^F-C~6l<;2wkr0uYAmQ~5ec>0_+OeC8BL9{ z)Z*PEi)1hVTva0G2@OPbL=#dvPSv}56Zx@&wA)dF-Cx& zE0IHOGDK8Dr$fH2P|WOdvex#DN5S+z1qeS{J@AD)qNAxj_5fj=@(X*T4Eb4B`8oag zq>74-0G4;Hm8WC?cZmg>?4dhGf)L)Ec`;fq7V4BTzh zm4Am0tfqW#pv!)o(GuXjGjhE@f|B~v9zoqpO|o}X3H|}LQn6mi1n0^Z=fjBG!^ozh znAFrx$#m0DD6dviuw;g0o+2{Z7|^zcFjPn@EoD|MaH?fVqthS?96(|J&lr>9Y#n)L zJV8w%Ups1==8c-1wa3s^bc@apM8~tV^Bk)E3tvuiIV(RtiQ0Vc)`KQm(wkwaQY_Q! z%zfX6c!#MRp_DBOy@rGox>NR9q_109U~Qr8s5hM@8k;e$ExFP&ZLL-K=wvk78uco8 zhjM~A?t%e+bU!LM2Kf6VvU;>^*^(fEkl=KF2(4~kRlwpEPDLVpA!JM}tUM9$&1cV> zS+_;`V+rbwL^9G|vvPC3IUBrlGo|}E^(6`aIuWHa^ZzGaa0*=iVQhA!7t~ket&Xl6 zDAIs7*szm&osN~6g7WxXU^s;oqHvNrT9?9~zXfhPc6lqvU{RI3@pB*kz6_n`;Q1cR zr_6{VprY^(PY9-Ue@=`r~F$|C?VhMMk z$?&jfitOH2YE&|_*Mu8cam$Xm}ldc5) z7xrhkZ(uUP#Mg(Ub1m7egV=%y1mOlYX zXm`lR6im+nSV#GEI;&?v+BuuHqqOD>q4KlgK;15VR6txa`azn5!L5UYUi4xaP)4*& zJ0J*!el6kY+Up|ARuuUipu&X)7V!<9^JB$Zjb65kP07&va6aUNBbD(J50`e^7x-(j}(vm8M9bX zxpdckSmiL_ZGU~^Nb$BsM6H3W=`>Syl@;+jT)4i?Ne_B_H-HiGZ95c;24|xqRh0G2 z{5I=+;Fn?e+Yy=#mT8<@ioxUc$YhF6r{7}{ZeJI+^FWEKE4K-50l&2WSPyOa>(a@f zzu3Hu*qz#h_98})137KT{orV}L4b|2lSX(U02uCPtjeV%x=6b0Z9T-<)J=#(1;m33 z=jfw4xU!a*6iUvWrgj=5?%F4wy)eBKC(?G#spRUXs+}3kDbM{OV4y_R(4}0=#aqGu zKr~*%SbAaYJiO7cz~}8cme6U)F-Z9+rBgR-ko`4_D3`Uli2z4Wo5XNk!K~SIxcn=@ zn>cE~*)wP34btM#SJGk*>7FF@3NSTE>wMCcX}8vC1NcqGxSP4`Lje9U-)s|_fJuFwjLjRn^%Ny7 zXfi?(Sa8n1VvgOVaa#Sc( zSsQtHh)wk+@`|UV!V)!ZMMo{GMb3KZP3y_pSH%Dv4d+C-=cYd#3PiBu5!lx?^}XCW zBjm`P?1NtTxbD!KR9~siFq}dc&hr{J{nU{NTi%FOWrESD8m}GVYW0|5moPIcTazlSiMZkFiGT7E#;v1^Hc2uf$GJeG`8T zRqrts&SOf?v$m~D+&4b)DaoOd)*lcOLS3I|T<{R{Uhb-VxFpD_h!?%dD|acH6q14QoQ#<$Y*)`$pAXVw?#g=@~n;*A3S+j%dCz>zYrti6`-yCA{Dz zsIO3%Tq;k@PWT_go`k4nhM$l(ZIpgDQNMIW)jq;ygci3e(^H@!F%<9s5@PZg^*IMx z0rQM_UJcX)?k#>dLOgrKXmE^_a|w=tg-ltL9_&H;JCb z>ZVtkJX*6VooR(tFS#}Dhk5TN2Xy*PCle0))T_rk{rv#hO6F+lgl~_W4sNrf5Om+4TFx6*2?%QCCQ|L)ER zT24?47cBJ4XCAwl;PX*W`qMyUu(&&P#%Z;)NyARx$7~JTK{I+8={aA$(i(sJ3Bgn) zK?iU@CIO^sj_iUfjo>fVFN5xfEIilQD#MNv0L{yUXei=g_wW53ie7nKt%&s8T)^O} z+)=eLN;B?tAHW`lB#s=rD?eINd4n!|4pKy;f9N&QIH`4cku%V$4Y515G!F6)$T)alibRi%Fsv4^_3 z-%WU#^E1UF)po`Il+3vk2_;oLq~uz{uxX~apB~;ifqsMwaYhsri>~bR|HNNPKU6lTR3Bl3&k^@Gd&X{;fXY@De?3-?vfHJw?Dn82LwSI zu7xB3rmhV`5D!EEE!FUEGo8xe&aCRW@5Bw~w*g0Mddc*UQ z;`5gImW8nmE}psx3(H4Q1wBAbA=*=R!v%XCLz84eTf@-Cc4yo1`{9$C3I7zW8?H23 z!KAEY1bypDpB}{IGUU8QTDQm6V;OuP72y}0+l+m<#AvQt>^W5QWjsLl6w$N66Z}f& z1;675yf;`{kfX;d(_Sjd=phe~5K5cevhX6SzLzaqb|YA$`!d|!Y|&kWb3w%pbWFRO ztEa!3Zm+tSUaFe{^M903D~U3LH{AhatrgQRwYixcv^WV@?&en@e7hjjXe8omT7!aY zrAWMl7HWJn*SZNiy^3(xIN>MLt^t<{}r^R#VfXH3-#zt*oQb2V?P%pIsvvFEE$QHVV1AJ?j2)}Kv`Dqte z*);RcJfhe@@`|P2oIG^kbxLA!?joLgg-%I#7gpIv=|^@1sY;MZ*c10Ay8r|$TL+Km ztXa$L0s5K&d|2eoX%J;hK!;ShcTRvhoF!esNL=vV0-nKrZ+2b>xyprusJ7S5RHv_bls;=8l+O2Z{=88?ZGSu&--i)QYa@^xR*qKh}S&v)dCGGwnA~P17%l zs3=@;If&&MGP{&?&R`upPkfwC7_VDXCF?o>_<7P=^h4j+QU})8 zewjXH~%NJ-EJZCBdMJdHCQs0}7IM@Hqto`|57iJH z_-Ixd$R4sa@>R3=Uw7j@T*lHc1 zDk z(#wu)Plf>v@uNq?od=l)$*&c4{$$z-t6SrNe-k*`=^BD;sim6?W4NilzyuqGUjY5u zgmu|t{~t|P9uC$1|7Ra$hHNpig%Xh%)Rde<+0!UXjjJye4y9D1g_ap3+LQ{Fq9ZMX zXq!~38)+pvwien;4W&hLZ)y3xKkoDU!}HwdHq1Gn<-NY%uh-ciEOi92-QQh$UIWl6 z2RQ)PY2}K%i0RN5v*VqtO|VhNRK0+Mo6$V!`iW&>%QAtBxgu0YdGh$n@&)1zw3=`m zWNMia+?~00W_iytt0bInd%?acT62h^6EdE;Y9`t!QpG;?A1uh!q4=xaNDEMMLqh%{Ve%8dv(AWh;0=GSKSl^o_uNj zJNUwha4*jy^WiWO`+l%Mt|QT;iGq`=Afy=W=qTXF`$Qg>T^}KBI;>d~AAltyW#xA) zR`Cn_tBYDe1X7`fAmbu>?+(Ol)m80$Av zpfYHOwiCWLt5oIuE<=!ohB3X=>R|eWFy9_46ZC$q$mSf&HbL8Y@jNr~;uQ$t?Kr$n zUcr(@BoI25c9M=k1CRJLNi)BTk9}(9SFJS(dqp)H6LDIErjuP|YyAe&Wh1=buH0J- zxdWLWPQV{~OC1!QRvy`^OLWoIoz0uTR_{X{_nOvyV~uhIB4nLkX-HGvv*0|L3u=to zzc6`Fz%k`jnz*GoLy~rwW&agR@5Q^E4{*<<;|c>Z;Gw?d8l8n}_;$u-G#Td)x~PW3 zqac4A)YNoJ+c>Ns$-u6jy8hQoG+;&kqU8bS(c7G?jE7j$NP4CQuPq%;*i1AiBpc({XaIK=r$ws|ps6_j@rZi6{c|%c3oSW_Ui43fO_1wY zuT56JDB9aJhl04x}*m9#cA8N4|BBJ-chNR+}Z!1_^_t5CdC@Q z$fIa9KZyce?H+?ik51Bg!6i1vU@CqQ{}$xBsSM)0`c+-$YSUoZf}GyE zHwoU$)@fXQJ>X`wSrKgB?mQakzR&ubr1E>f;(eGn%u>^I*uH3Ru41%S@6W@s;%EGt zw;FjTuvZE_YaZidNt>k%mZ+Wq$sX09z)i*utb{=-mUJ^}wlkHkzB(0n&q(QSCb47` zG2aQ14KiI>SOp8uuF{MRYzb$nDs`o{Jt`Qwt;rgaNjPSsxgEQ3;Ym|Gj;CCJGVc$& z=-)moyFpC{i!6DI)}+~1FySK;SUW?0elnjB<<6aI{FEUBE#+Th(7tzHvp`k-$X_!1 z`ND9;&Jp$}LGn)FB=I$yku;p{6oevBn=IY~0vcewuJY`;cigrV z|3LRKfg$_2@%Zi4Kzc%Rg{%(2+&*OmP7ZYl!N%31PD)h{JNhQ5>y|vU6xnU4f{^e| zwmB!jabixPk2i?NF2G%b`N9wDcfT0J0UeW6xPYkp;e!A;-rL@Wp7)u^g4;5z*Ki^5 zOUs>aq&$U6)`z?)UNGM^=>v@GiLdJPjgxa|*gG+mZfcN5$$wyE-3kiNCx86`Eb#gX zu$`kOMCdFiLB?AU6$G#Uwk0+`r&UI?T@Q+Cs|Hj-fr^!3f3W|cpcAdt1v^%XCRVZ? zO_@z^GpepID`|o|F_w>)5!O7RKu07u4>QkQ%Fz^HX8a&^uePUpC84L%i9SZ@U-(th zH3y5dl3&j-H)kBXe+jOB8q00jRMPd-3S`<2t-IMrd*VW_9<7$d0NI8yNYs=g^w0c`aQFym zTRHGo>Q@w(=G_m11b=FK^{-l=Q6i086l8(8{3Y7HQaZE!3;XFBo${ZK_!mFsR8IbG z>cIafx2h4aj_P%eV~Fp`;8}eh!+n0PU5=To+ezpBkPZH7ThhoKZ>62o2n49dfx+vj z+AMr3Yj`ME`fLW2G887fq7j8H?5EYMHfOEgAwWzTC|8N{$GS=$po(9_PO2+`tZsH! z%R1CK2{sJzG5kou?$Y5hZ-|?k)m}GQPb=_WFg&~Wj?O+dyW~WoB0d~9)F6N@e^tQ5 zYZ<=Vk(xM`ertML;~dFjpLaMd*8>aMg})PC#1j1Qh4p-&QzeI>t4R%0L&aTqbe$)C zq^B0XHd5CGA>3z+6$*cEqFv!dPZG`Zt1=`94^32ew!*z!sYprbRTP{$0}C1;yy7be z<7RYT&PMe|-J(l%CjXXJUH^|TC3zpGWA3}p_DBD=vCH{5ToMRh=eyx`wihkjxc>RR zyzjcw);J(xu8--A;v&L7&dm8wcJ`Xr>dKnSjZmp#a4zUa8HTNRl36@(%|NuxQ)Y#G zR+LnL?+3WaS8`=WTGk>DO@rmA`^SKX?zyy*d3lM_PD}C_vfiaIHAT}3qDrC$p1jjY z0_Nc%S3e!$k%dS1#O9%Xey69HIZE|yv$npvoZWsLG}Oo?xoregkbO#k*XPwt1#(_I7Vd*VQUcL01A4fC|NHOI2C{F|ryfx?}6bw~5~x##va|y5Ui-D8H{K8OyRGQI51r&^%=$BDn81fXh{A9o=^!GKEt;CLKmNl_J&HNZJ()Q9eb&cO)Qk31b;SN*$WY%O zzev}H6LX>8{J-hs{IR0r^uP_=q=)j>kLuO5K%bQ)jafB6H~anNf_+V%h9I^HZ(UH9$`9I(`dwhg_ (|N$JpKmbZon0$1_%5y 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 v^Qn7J>b{>$CZ6p(OiHG<5 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

VM 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

-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


47ImW-$xus{f#I`_Q8r*kcl1PFG_Fo&{Rv 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 literal 0 HcmV?d00001 diff --git a/art/exported/items/equipment/net.glb.import b/art/exported/items/equipment/net.glb.import new file mode 100644 index 0000000..28667d6 --- /dev/null +++ b/art/exported/items/equipment/net.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dsa6yss1sxfcy" +path="res://.godot/imported/net.glb-cbbc53905aec6a50c4a3322ca7a93b1e.scn" + +[deps] + +source_file="res://art/exported/items/equipment/net.glb" +dest_files=["res://.godot/imported/net.glb-cbbc53905aec6a50c4a3322ca7a93b1e.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/art/exported/items/equipment/net_Material.png b/art/exported/items/equipment/net_Material.png new file mode 100644 index 0000000000000000000000000000000000000000..bd5eff22d270c53600250bb2eed8ef0ca47811da GIT binary patch literal 282926 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
kSnh|GCSrQXU2hXwRXEFcjo@)kxUy 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%0AaDz@yC0ng|iYhig<A^YS8;CCn8Wi{+ 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 Lyft*YIezvRgthE| literal 0 HcmV?d00001 diff --git a/art/exported/items/equipment/net_Plane Base Color.png.import b/art/exported/items/equipment/net_Plane Base Color.png.import new file mode 100644 index 0000000..7f40afc --- /dev/null +++ b/art/exported/items/equipment/net_Plane Base Color.png.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://seq5b31mwcqr" +path="res://.godot/imported/net_Plane Base Color.png-3875ae3dd186ddf319c55aabb13e663f.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "a6001c381d4c8e16bd2d64ea74ccff82" +} + +[deps] + +source_file="res://art/exported/items/equipment/net_Plane Base Color.png" +dest_files=["res://.godot/imported/net_Plane Base Color.png-3875ae3dd186ddf319c55aabb13e663f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/art/source/items/equipment/net.blend b/art/source/items/equipment/net.blend new file mode 100644 index 0000000000000000000000000000000000000000..0a7ba4c468a0dd609840eecfe0aabe38b463def3 GIT binary patch literal 388516 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

82?l4t(T}--a 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

=K~hmOku>d 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

#rtWf#}!`Iyh5A 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�iXOER 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 literal 0 HcmV?d00001 diff --git a/player/net_attachment.gd b/player/net_attachment.gd index 8938a13..3c7843a 100644 --- a/player/net_attachment.gd +++ b/player/net_attachment.gd @@ -1,7 +1,88 @@ extends "res://player/tool_socket_attachment.gd" -@onready var _impact_marker: Marker3D = %ImpactMarker +const TextureSamplingPolicyScript := preload( + "res://main/texture_sampling_policy.gd" +) +const SPRING_ROOT_BONE: StringName = &"net_mid" +const SPRING_END_BONE: StringName = &"net_tip" +const IMPACT_BONE: StringName = &"net_rim" + +@export_range(0.0, 10.0, 0.05) var spring_stiffness: float = 1.8 +@export_range(0.0, 1.0, 0.01) var spring_drag: float = 0.68 +@export_range(0.0, 10.0, 0.05) var spring_gravity: float = 0.3 +@export_range(0.01, 0.5, 0.01) var spring_end_length: float = 0.1 + +@onready var _catching_net: Node3D = %CatchingNet +@onready var _net_model: Node3D = %NetModel + +var _spring: SpringBoneSimulator3D +var _spring_was_visible: bool = false +var _net_skeleton: Skeleton3D + + +func _ready() -> void: + super._ready() + TextureSamplingPolicyScript.enforce_subtree(_net_model) + _configure_spring() + _sync_spring_activity() + + +func _process(_delta: float) -> void: + _sync_spring_activity() + + +func _configure_spring() -> void: + _net_skeleton = _net_model.find_child( + "Skeleton3D", true, false + ) as Skeleton3D + if _net_skeleton == null: + push_error("Imported net model is missing its Skeleton3D.") + return + if _net_skeleton.find_bone(SPRING_ROOT_BONE) < 0: + push_error("Imported net model is missing bone %s." % SPRING_ROOT_BONE) + return + if _net_skeleton.find_bone(SPRING_END_BONE) < 0: + push_error("Imported net model is missing bone %s." % SPRING_END_BONE) + return + if _net_skeleton.find_bone(IMPACT_BONE) < 0: + push_error("Imported net model is missing bone %s." % IMPACT_BONE) + return + + _spring = SpringBoneSimulator3D.new() + _spring.name = "NetSpring" + _spring.set_setting_count(1) + _spring.set_root_bone_name(0, SPRING_ROOT_BONE) + _spring.set_end_bone_name(0, SPRING_END_BONE) + _spring.set_extend_end_bone(0, true) + _spring.set_end_bone_direction( + 0, SkeletonModifier3D.BONE_DIRECTION_FROM_PARENT + ) + _spring.set_end_bone_length(0, spring_end_length) + _spring.set_stiffness(0, spring_stiffness) + _spring.set_drag(0, spring_drag) + _spring.set_gravity(0, spring_gravity) + _spring.set_gravity_direction(0, Vector3.DOWN) + _net_skeleton.add_child(_spring) func get_impact_world_position() -> Vector3: - return _impact_marker.global_position + if _net_skeleton == null: + return _catching_net.global_position + var impact_bone_index := _net_skeleton.find_bone(IMPACT_BONE) + if impact_bone_index < 0: + return _catching_net.global_position + return _net_skeleton.global_transform * ( + _net_skeleton.get_bone_global_pose(impact_bone_index).origin + ) + + +func _sync_spring_activity() -> void: + if _spring == null: + return + var is_visible := _catching_net.is_visible_in_tree() + if is_visible and not _spring_was_visible: + _spring.active = true + _spring.reset() + elif not is_visible: + _spring.active = false + _spring_was_visible = is_visible diff --git a/player/net_attachment.tscn b/player/net_attachment.tscn index 246e71c..da49a88 100644 --- a/player/net_attachment.tscn +++ b/player/net_attachment.tscn @@ -1,42 +1,7 @@ -[gd_scene load_steps=8 format=3] +[gd_scene load_steps=3 format=3] [ext_resource type="Script" path="res://player/net_attachment.gd" id="1_script"] - -[sub_resource type="StandardMaterial3D" id="HandleMaterial"] -albedo_color = Color(0.25, 0.13, 0.055, 1) -roughness = 0.9 - -[sub_resource type="CylinderMesh" id="HandleMesh"] -material = SubResource("HandleMaterial") -top_radius = 0.025 -bottom_radius = 0.035 -height = 1.25 - -[sub_resource type="StandardMaterial3D" id="HoopMaterial"] -albedo_color = Color(0.34, 0.39, 0.4, 1) -metallic = 0.25 -roughness = 0.65 - -[sub_resource type="TorusMesh" id="HoopMesh"] -material = SubResource("HoopMaterial") -inner_radius = 0.24 -outer_radius = 0.29 -rings = 12 -ring_segments = 18 - -[sub_resource type="StandardMaterial3D" id="NetMaterial"] -transparency = 1 -albedo_color = Color(0.65, 0.78, 0.75, 0.42) -shading_mode = 0 -cull_mode = 2 - -[sub_resource type="CylinderMesh" id="NetMesh"] -material = SubResource("NetMaterial") -top_radius = 0.24 -bottom_radius = 0.08 -height = 0.34 -radial_segments = 12 -rings = 1 +[ext_resource type="PackedScene" path="res://art/exported/items/equipment/net.glb" id="2_model"] [node name="NetAttachment" type="BoneAttachment3D"] bone_name = "rod_socket" @@ -47,18 +12,9 @@ aligned_mount_path = NodePath("CatchingNet") unique_name_in_owner = true visible = false -[node name="Handle" type="MeshInstance3D" parent="CatchingNet"] -position = Vector3(0, 0.55, 0) -mesh = SubResource("HandleMesh") +[node name="ModelMount" type="Node3D" parent="CatchingNet"] +position = Vector3(-0.000217, -0.098636, -0.020218) +rotation = Vector3(0, 3.1415927, 0) -[node name="Hoop" type="MeshInstance3D" parent="CatchingNet"] -position = Vector3(0, 1.17, 0) -mesh = SubResource("HoopMesh") - -[node name="Bag" type="MeshInstance3D" parent="CatchingNet"] -position = Vector3(0, 1, 0) -mesh = SubResource("NetMesh") - -[node name="ImpactMarker" type="Marker3D" parent="CatchingNet"] +[node name="NetModel" parent="CatchingNet/ModelMount" unique_id=1627767240 instance=ExtResource("2_model")] unique_name_in_owner = true -position = Vector3(0, 1.17, 0) diff --git a/tests/net_attachment_validation.gd b/tests/net_attachment_validation.gd index 15b8b7d..6b53c08 100644 --- a/tests/net_attachment_validation.gd +++ b/tests/net_attachment_validation.gd @@ -57,23 +57,73 @@ func _run() -> void: "Net rear face did not follow the socket direction guide.", ) - var handle := catching_net.get_node_or_null("Handle") as MeshInstance3D - var hoop := catching_net.get_node_or_null("Hoop") as MeshInstance3D - var bag := catching_net.get_node_or_null("Bag") as MeshInstance3D - var impact_marker := ( - catching_net.get_node_or_null("ImpactMarker") as Marker3D + var model := catching_net.get_node_or_null("ModelMount/NetModel") as Node3D + _check(model != null, "Imported net model is missing.") + if model == null: + _finish(host_skeleton) + return + var skeleton := model.find_child("Skeleton3D", true, false) as Skeleton3D + _check(skeleton != null, "Imported net Skeleton3D is missing.") + if skeleton == null: + _finish(host_skeleton) + return + _check( + skeleton.find_bone("net_root") >= 0, + "Imported net_root bone is missing.", ) - _check(handle != null and handle.mesh != null, "Placeholder handle is missing.") - _check(hoop != null and hoop.mesh != null, "Placeholder hoop is missing.") - _check(bag != null and bag.mesh != null, "Placeholder net bag is missing.") - _check(impact_marker != null, "Net impact marker is missing.") - if impact_marker != null: + _check( + skeleton.find_bone("net_rim") >= 0, + "Imported net_rim bone is missing.", + ) + _check( + skeleton.find_bone("net_mid") >= 0, + "Imported net_mid bone is missing.", + ) + _check( + skeleton.find_bone("net_tip") >= 0, + "Imported net_tip bone is missing.", + ) + + var spring := skeleton.get_node_or_null("NetSpring") as SpringBoneSimulator3D + _check(spring != null, "Net spring simulator was not created.") + if spring != null: + _check(spring.get_setting_count() == 1, "Net spring settings changed.") _check( - attachment.get_impact_world_position().is_equal_approx( - impact_marker.global_position - ), - "Net impact position moved away from its marker.", + spring.get_root_bone_name(0) == &"net_mid", + "Net spring root must remain net_mid.", ) + _check( + spring.get_end_bone_name(0) == &"net_tip", + "Net spring end must remain net_tip.", + ) + _check(not spring.active, "Hidden net spring must be suspended.") + catching_net.visible = true + await process_frame + await process_frame + _check(spring.active, "Visible net spring must be active.") + _check(spring.get_joint_count(0) == 2, "Net spring chain is incomplete.") + _check( + not attachment.get_impact_world_position().is_equal_approx( + catching_net.global_position + ), + "Net impact position did not follow the authored rim bone.", + ) + catching_net.visible = false + await process_frame + _check(not spring.active, "Hidden net spring did not suspend.") + + for child: Node in model.find_children("*", "MeshInstance3D", true, false): + var mesh_instance := child as MeshInstance3D + if mesh_instance.mesh == null: + continue + for surface_index: int in mesh_instance.mesh.get_surface_count(): + var material := mesh_instance.mesh.surface_get_material(surface_index) + if material is BaseMaterial3D: + _check( + (material as BaseMaterial3D).texture_filter + == BaseMaterial3D.TEXTURE_FILTER_NEAREST, + "Net material does not use nearest texture sampling.", + ) var rod_attachment := ( FishingRodAttachmentScene.instantiate() as BoneAttachment3D From 98a27e2f53d1e2e2a7730b49cb30d6b1c727864e Mon Sep 17 00:00:00 2001 From: Voyager Date: Tue, 25 Aug 2026 22:18:20 -0400 Subject: [PATCH 03/37] Preserve data across the Straywild transition --- README.md | 4 +- docs/PORTMASTER.md | 10 +- docs/README.md | 4 +- export_presets.cfg | 4 +- main/main.gd | 19 ++- main/runtime_performance_profile.gd | 18 ++- network/discovery_client.gd | 5 + network/host_ban_store.gd | 4 + network/identity_backup_service.gd | 27 ++-- network/known_player_store.gd | 4 + network/network_identity_crypto.gd | 42 ++++++- network/network_profile_preferences.gd | 2 + network/network_profile_service.gd | 11 ++ network/player_data_root.gd | 157 +++++++++++++++++++++--- network/player_relationship_store.gd | 4 + network/portable_data_migration.gd | 12 +- network/saved_server_store.gd | 6 + network/server_trust_store.gd | 4 + progression/player_appearance_store.gd | 4 + save/progression_save_codec.gd | 32 +++-- scripts/build_playtest.sh | 2 +- scripts/build_portmaster.sh | 6 +- scripts/portmaster/straywild.sh | 25 +++- server/dedicated_server_config.gd | 78 ++++++++---- tests/progression_archive_validation.gd | 153 ++++++++++++++++++++++- ui/game_ui.gd | 3 + ui/settings_panel.gd | 26 +++- ui/title_screen.gd | 5 + 28 files changed, 577 insertions(+), 94 deletions(-) diff --git a/README.md b/README.md index e228e7b..536afab 100644 --- a/README.md +++ b/README.md @@ -22,9 +22,9 @@ Discord: https://discord.gg/5gP22447kc Matrix: https://matrix.to/#/#straywild:matrix.makearmy.io -Repo: https://forge.makearmy.io/woofmeow/straywild +Repo: https://forge.makearmy.io/woofmeow/netfishing -Releases: https://forge.makearmy.io/woofmeow/straywild/releases +Releases: https://forge.makearmy.io/woofmeow/netfishing/releases ## Installing release builds diff --git a/docs/PORTMASTER.md b/docs/PORTMASTER.md index 3c75a80..803f72f 100644 --- a/docs/PORTMASTER.md +++ b/docs/PORTMASTER.md @@ -47,6 +47,10 @@ directory. The templates in `scripts/portmaster/` are authoritative. upgraded. Device-local data, configuration, and cache remain under `straywild/conf/data`, `straywild/conf/config`, and `straywild/conf/cache`. +- A rebrand upgrade copies an existing `netfishing/conf/` tree into the new + `straywild/conf/` tree when the latter does not exist. It also reuses an + existing `ports/saves/netfishing/` data root rather than creating an empty + replacement. New installations use straywild paths exclusively. - The archive must not contain `conf/`, saves, identities, logs, source files, `.git`, or `.godot` content. - Release downloads must publish only the canonical `straywild.zip` for this @@ -101,9 +105,9 @@ device directory and run: --offline --no-check install ./straywild.zip ``` -Before upgrading an existing installation, preserve -`/mnt/mmc/ports/straywild/conf/` and `/mnt/mmc/ports/saves/straywild/` on the -device. After installation: +Before upgrading an existing installation, preserve either the current +`/mnt/mmc/ports/straywild/` paths or the former `/mnt/mmc/ports/netfishing/` +paths on the device. After installation: 1. Confirm the installed executable and PCK hashes match the staged release. 2. Confirm HarbourMaster added its `# PORTMASTER:` installation signature to diff --git a/docs/README.md b/docs/README.md index 444ebc7..5327b30 100644 --- a/docs/README.md +++ b/docs/README.md @@ -17,10 +17,10 @@ for local README files. ## Related repositories -- [Discovery service API](https://forge.makearmy.io/woofmeow/straywild-discovery-server/src/branch/main/docs/API.md) +- [Discovery service API](https://forge.makearmy.io/woofmeow/netfishing-discovery-server/src/branch/main/docs/API.md) stays with the service implementation and defines its versioned HTTP contract. -- [Dedicated-server packaging](https://forge.makearmy.io/woofmeow/straywild-dedicated-server/src/branch/main/README.md) +- [Dedicated-server packaging](https://forge.makearmy.io/woofmeow/netfishing-dedicated-server/src/branch/main/README.md) stays with its installer and update scripts. It consumes this repository's attribution and legal notices from the exact pinned game commit instead of maintaining copies. diff --git a/export_presets.cfg b/export_presets.cfg index 9ae60f2..f16af2d 100644 --- a/export_presets.cfg +++ b/export_presets.cfg @@ -105,7 +105,7 @@ script_export_mode=2 custom_template/debug="" custom_template/release="" -application/bundle_identifier="io.woofmeow.straywild" +application/bundle_identifier="io.woofmeow.netfishing" application/icon="res://art/exported/system_icons/straywild_1024.png" application/icon_interpolation=0 application/short_version="0.18.1" @@ -178,7 +178,7 @@ architectures/x86=false architectures/x86_64=false version/code=180100 version/name="v0.18.1-alpha" -package/unique_name="io.woofmeow.straywild" +package/unique_name="io.woofmeow.netfishing" package/name="straywild" package/signed=true package/app_category=0 diff --git a/main/main.gd b/main/main.gd index 460eb9e..442c97c 100644 --- a/main/main.gd +++ b/main/main.gd @@ -277,6 +277,7 @@ var _rain_ambience: RainAmbienceType func _ready() -> void: + _data_root.prepare_legacy_user_data() _performance_profile = RuntimePerformanceProfileType.from_environment() _dedicated_runtime = _is_dedicated_server_runtime() if _dedicated_runtime: @@ -471,10 +472,7 @@ func _start_dedicated_server() -> void: _fail_dedicated_server(config.error_message) return var data_path: String = config.data_directory - var manifest_path: String = data_path.path_join( - PlayerDataRoot.MANIFEST_FILENAME - ) - if not FileAccess.file_exists(manifest_path): + if not _data_root.has_data_manifest(data_path): var created: Dictionary = _data_root.create_unbound_root(data_path) if not bool(created.get("ok", false)): _fail_dedicated_server(str(created.get( @@ -973,6 +971,7 @@ func _initialize_application(dedicated: bool) -> void: _network_session, _interface_fonts, ) + _game_ui.data_root_changed.connect(_on_data_root_changed) _game_ui.setup_controller_mapping(_controller_mapping_manager) _ui_pixelation.setup_controller_mapping(_controller_mapping_manager) _game_ui.setup_keyboard_mouse_mapping(_keyboard_mouse_mapping_manager) @@ -1344,6 +1343,18 @@ func _on_data_root_status(message: String) -> void: _configure_popup_dialog.call_deferred(dialog, dialog.get_ok_button()) +func _on_data_root_changed() -> void: + _save_manager.set_autosave_enabled(false) + _save_manager.cancel_pending_autosave() + _configure_portable_stores() + if not _network_profile_service.reload_persisted_profile(): + push_warning("The selected data folder's player profile could not be loaded.") + _network_session.set_local_appearance_snapshot( + _appearance_store.get_snapshot() + ) + _game_ui.get_title_screen().refresh_after_data_root_change() + + func _on_server_trust_required( endpoint: String, expected_fingerprint: String, diff --git a/main/runtime_performance_profile.gd b/main/runtime_performance_profile.gd index 8cc1ea6..f18e63a 100644 --- a/main/runtime_performance_profile.gd +++ b/main/runtime_performance_profile.gd @@ -5,6 +5,10 @@ const PROFILE_ENVIRONMENT_VARIABLE: String = ( "straywild_PERFORMANCE_PROFILE" ) const LEGACY_LIGHT_ENVIRONMENT_VARIABLE: String = "straywild_LOW_END" +const NETFISHING_PROFILE_ENVIRONMENT_VARIABLE := ( + "NETFISHING_PERFORMANCE_PROFILE" +) +const NETFISHING_LIGHT_ENVIRONMENT_VARIABLE := "NETFISHING_LOW_END" const NORMAL_PROFILE: StringName = &"normal" const LIGHT_PROFILE: StringName = &"light" const NORMAL_WORLD_RENDER_SCALE: float = 1.0 @@ -14,9 +18,19 @@ var _profile_name: StringName = NORMAL_PROFILE static func from_environment() -> RuntimePerformanceProfile: + var profile_name: String = OS.get_environment( + PROFILE_ENVIRONMENT_VARIABLE + ) + if profile_name.is_empty(): + profile_name = OS.get_environment( + NETFISHING_PROFILE_ENVIRONMENT_VARIABLE + ) return from_name( - StringName(OS.get_environment(PROFILE_ENVIRONMENT_VARIABLE)), - OS.get_environment(LEGACY_LIGHT_ENVIRONMENT_VARIABLE) == "1", + StringName(profile_name), + ( + OS.get_environment(LEGACY_LIGHT_ENVIRONMENT_VARIABLE) == "1" + or OS.get_environment(NETFISHING_LIGHT_ENVIRONMENT_VARIABLE) == "1" + ), ) diff --git a/network/discovery_client.gd b/network/discovery_client.gd index a3d983f..d8e602a 100644 --- a/network/discovery_client.gd +++ b/network/discovery_client.gd @@ -21,6 +21,7 @@ signal friend_invite_finished(success: bool, message: String) const BASE_URL_SETTING: String = "network/discovery/base_url" const BASE_URL_ENVIRONMENT: String = "straywild_DISCOVERY_URL" +const LEGACY_BASE_URL_ENVIRONMENT: String = "NETFISHING_DISCOVERY_URL" const SETTINGS_PATH: String = "user://network_discovery.cfg" const DEFAULT_ROOM_NAME: String = "Player's Server" const LEGACY_DEFAULT_ROOM_NAME: String = "straywild Room" @@ -553,6 +554,10 @@ func is_own_room(room: Dictionary) -> bool: func _configured_base_url() -> String: var value: String = OS.get_environment(BASE_URL_ENVIRONMENT).strip_edges() + if value.is_empty(): + value = OS.get_environment( + LEGACY_BASE_URL_ENVIRONMENT + ).strip_edges() if value.is_empty(): value = str(ProjectSettings.get_setting(BASE_URL_SETTING, "")).strip_edges() while value.ends_with("/"): diff --git a/network/host_ban_store.gd b/network/host_ban_store.gd index f8c4bf9..1251846 100644 --- a/network/host_ban_store.gd +++ b/network/host_ban_store.gd @@ -17,6 +17,10 @@ var _data_root: PlayerDataRoot func configure_storage(path: String, data_root: PlayerDataRoot) -> void: _store_path = path _data_root = data_root + _namespaces.clear() + _loaded = false + _write_blocked = false + _expected_hash = "" func is_banned(host_fingerprint: String, target_fingerprint: String) -> bool: diff --git a/network/identity_backup_service.gd b/network/identity_backup_service.gd index 53cf718..c383e7b 100644 --- a/network/identity_backup_service.gd +++ b/network/identity_backup_service.gd @@ -4,6 +4,7 @@ extends Node signal operation_finished(success: bool, message: String) const MAGIC := "straywild_IDENTITY_BACKUP" +const LEGACY_MAGIC := "NETFISHING_IDENTITY_BACKUP" const FORMAT_VERSION := 1 const MAX_BACKUP_BYTES := 256 * 1024 const MIN_PASSPHRASE_LENGTH := 12 @@ -110,8 +111,9 @@ func inspect_backup( if json.parse(text) != OK or typeof(json.data) != TYPE_DICTIONARY: return {"ok": false} var data: Dictionary = json.data + var legacy_backup: bool = data.get("magic") == LEGACY_MAGIC if ( - data.get("magic") != MAGIC + data.get("magic") not in [MAGIC, LEGACY_MAGIC] or data.get("format_version") != FORMAT_VERSION or data.get("identity_type") != expected_type or data.get("algorithm") != NetworkIdentityCrypto.ALGORITHM @@ -134,12 +136,23 @@ func inspect_backup( var signature: PackedByteArray = Marshalls.base64_to_raw( str(data.get("self_signature", "")) ) - if not NetworkIdentityCrypto.verify_fields( - NetworkIdentityCrypto.load_public_key(public_pem), - "identity_backup_self_test", - [expected_type, fingerprint], - signature, - ): + var public_key: CryptoKey = NetworkIdentityCrypto.load_public_key(public_pem) + var backup_signature_valid: bool = ( + NetworkIdentityCrypto.verify_legacy_fields( + public_key, + "identity_backup_self_test", + [expected_type, fingerprint], + signature, + ) + if legacy_backup + else NetworkIdentityCrypto.verify_fields( + public_key, + "identity_backup_self_test", + [expected_type, fingerprint], + signature, + ) + ) + if not backup_signature_valid: return {"ok": false} var fresh: PackedByteArray = NetworkIdentityCrypto.sign_fields( key, "identity_import_self_test", [fingerprint] diff --git a/network/known_player_store.gd b/network/known_player_store.gd index 0c6b859..1118656 100644 --- a/network/known_player_store.gd +++ b/network/known_player_store.gd @@ -15,6 +15,10 @@ var _data_root: PlayerDataRoot func configure_storage(path: String, data_root: PlayerDataRoot) -> void: _store_path = path _data_root = data_root + _records.clear() + _loaded = false + _write_blocked = false + _expected_hash = "" func observe(fingerprint: String, display_name: String) -> String: diff --git a/network/network_identity_crypto.gd b/network/network_identity_crypto.gd index d3f9983..9d4f09c 100644 --- a/network/network_identity_crypto.gd +++ b/network/network_identity_crypto.gd @@ -6,6 +6,7 @@ const FINGERPRINT_LENGTH: int = 64 const MAX_PUBLIC_KEY_BYTES: int = 8192 const MAX_SIGNATURE_BYTES: int = 1024 const DOMAIN_PREFIX: String = "straywild" +const LEGACY_DOMAIN_PREFIX: String = "NETFISHING" const IDENTITY_VERSION: String = "identity_v1" @@ -50,8 +51,16 @@ static func secure_id(byte_count: int = 16) -> String: static func canonical_bytes(domain: String, fields: Array) -> PackedByteArray: + return canonical_bytes_for_prefix(DOMAIN_PREFIX, domain, fields) + + +static func canonical_bytes_for_prefix( + prefix: String, + domain: String, + fields: Array, +) -> PackedByteArray: var output := PackedByteArray() - _append_string(output, DOMAIN_PREFIX) + _append_string(output, prefix) _append_string(output, IDENTITY_VERSION) _append_string(output, domain) for value: Variant in fields: @@ -117,6 +126,37 @@ static func verify_fields( ) +static func verify_legacy_fields( + public_key: CryptoKey, + domain: String, + fields: Array, + signature: PackedByteArray, +) -> bool: + if ( + public_key == null + or signature.is_empty() + or signature.size() > MAX_SIGNATURE_BYTES + ): + return false + var bytes: PackedByteArray = canonical_bytes_for_prefix( + LEGACY_DOMAIN_PREFIX, + domain, + fields, + ) + if bytes.is_empty(): + return false + var context := HashingContext.new() + if context.start(HashingContext.HASH_SHA256) != OK: + return false + context.update(bytes) + return Crypto.new().verify( + HashingContext.HASH_SHA256, + context.finish(), + signature, + public_key, + ) + + static func load_public_key(public_pem: String) -> CryptoKey: var normalized := normalize_public_pem(public_pem) if normalized.is_empty() or normalized.to_utf8_buffer().size() > MAX_PUBLIC_KEY_BYTES: diff --git a/network/network_profile_preferences.gd b/network/network_profile_preferences.gd index 3c4996b..b6cac63 100644 --- a/network/network_profile_preferences.gd +++ b/network/network_profile_preferences.gd @@ -21,6 +21,8 @@ var _future_version := false func configure_storage(path: String, data_root: PlayerDataRoot) -> void: _profile_path = path _data_root = data_root + _expected_hash = "" + _future_version = false func _temp_path() -> String: diff --git a/network/network_profile_service.gd b/network/network_profile_service.gd index e4732a9..ff967f1 100644 --- a/network/network_profile_service.gd +++ b/network/network_profile_service.gd @@ -51,6 +51,17 @@ func setup( _apply_local_voice_to_avatar() +func reload_persisted_profile() -> bool: + if ( + not _preferences.load_or_create() + or not _appearance_store.load_preferences() + ): + return false + _apply_to_avatar(1, _appearance_store.get_snapshot()) + _apply_local_voice_to_avatar() + return true + + func get_persisted_name() -> String: return _preferences.display_name diff --git a/network/player_data_root.gd b/network/player_data_root.gd index d6153ff..e173577 100644 --- a/network/player_data_root.gd +++ b/network/player_data_root.gd @@ -10,11 +10,41 @@ const BOOTSTRAP_VERSION := 1 const MANIFEST_VERSION := 1 const LAYOUT_VERSION := 1 const MANIFEST_FILENAME := "straywild_data.json" +const LEGACY_MANIFEST_FILENAME := "netfishing_data.json" const README_FILENAME := "README.txt" const ENVIRONMENT_VARIABLE := "straywild_DATA_DIR" const CREATE_ENVIRONMENT_VARIABLE := "straywild_CREATE_DATA_DIR" +const LEGACY_ENVIRONMENT_VARIABLE := "NETFISHING_DATA_DIR" +const LEGACY_CREATE_ENVIRONMENT_VARIABLE := "NETFISHING_CREATE_DATA_DIR" const APPLICATION_ID := "straywild" +const LEGACY_APPLICATION_ID := "netfishing" const APP_DATA_PORTABLE_PATH := "user://portable-data" +const LEGACY_USER_DIRECTORY_NAME := "NETFISHING" +const LEGACY_USER_FILES := [ + "data_root_bootstrap.json", + "data_root_bootstrap.json.backup", + "network_discovery.cfg", + "player_settings.json", + "player_settings.json.backup", + "controller_mappings.json", + "controller_mappings.json.backup", + "keyboard_mouse_bindings.json", + "keyboard_mouse_bindings.json.backup", + "player_save.json", + "network_profile.json", + "player_appearance.json", + "saved_servers.json", + "known_players.json", + "player_relationships.json", + "server_trust.json", + "host_bans.json", + "player_identity.key", + "player_identity.pub", + "player_identity.json", + "host_identity.key", + "host_identity.pub", + "host_identity.json", +] const PATH_ALLOWED: StringName = &"allowed" const PATH_SOURCE_PROJECT: StringName = &"source_project" const PATH_INSTALLATION: StringName = &"installation" @@ -37,23 +67,29 @@ var override_active := false func resolve() -> bool: + prepare_legacy_user_data() _load_bootstrap_identity() var command_line: String = _command_line_override() if not command_line.is_empty(): override_active = true mode = Mode.COMMAND_LINE_OVERRIDE return _activate_existing(command_line, "", false) - if OS.has_environment(ENVIRONMENT_VARIABLE): + var environment_variable: String = _available_environment_variable( + ENVIRONMENT_VARIABLE, + LEGACY_ENVIRONMENT_VARIABLE, + ) + if not environment_variable.is_empty(): override_active = true mode = Mode.ENVIRONMENT_OVERRIDE - var environment_path: String = OS.get_environment(ENVIRONMENT_VARIABLE) + var environment_path: String = OS.get_environment(environment_variable) if not environment_path.is_absolute_path(): return _fail("straywild_DATA_DIR must be an absolute path.") if ( - OS.get_environment(CREATE_ENVIRONMENT_VARIABLE) == "1" - and not FileAccess.file_exists( - environment_path.path_join(MANIFEST_FILENAME) + _environment_flag( + CREATE_ENVIRONMENT_VARIABLE, + LEGACY_CREATE_ENVIRONMENT_VARIABLE, ) + and not has_data_manifest(environment_path) ): var created: Dictionary = create_unbound_root(environment_path) if not bool(created.get("ok", false)): @@ -80,6 +116,30 @@ func resolve() -> bool: return false +func prepare_legacy_user_data() -> void: + var current_root: String = _normalize( + ProjectSettings.globalize_path("user://") + ) + if current_root.is_empty(): + return + var legacy_root: String = _normalize( + current_root.get_base_dir().path_join(LEGACY_USER_DIRECTORY_NAME) + ) + if legacy_root == current_root or not DirAccess.dir_exists_absolute(legacy_root): + return + for filename: String in LEGACY_USER_FILES: + var destination: String = current_root.path_join(filename) + if FileAccess.file_exists(destination): + continue + var source: String = legacy_root.path_join(filename) + if FileAccess.file_exists(source): + _copy_legacy_user_file(source, destination) + + +func has_data_manifest(path: String) -> bool: + return not _existing_manifest_path(_normalize(path)).is_empty() + + func default_visible_path() -> String: var documents: String = OS.get_system_dir(OS.SYSTEM_DIR_DOCUMENTS) if documents.is_empty(): @@ -105,12 +165,14 @@ func select_new_root(path: String, app_data: bool = false) -> bool: normalized = ProjectSettings.globalize_path(APP_DATA_PORTABLE_PATH) if not _validate_candidate(normalized, true): return false - var manifest_path: String = normalized.path_join(MANIFEST_FILENAME) - if FileAccess.file_exists(manifest_path): + var manifest_path: String = _existing_manifest_path(normalized) + if not manifest_path.is_empty(): var manifest: Dictionary = _read_json(manifest_path) if not _valid_manifest(manifest): return _fail("The selected folder has a malformed straywild manifest.") root_id = str(manifest["root_id"]) + if not _upgrade_legacy_manifest(normalized, manifest, manifest_path): + return _fail("The legacy data-folder manifest could not be upgraded.") else: if not _directory_is_empty(normalized) and not app_data: return _fail( @@ -145,14 +207,14 @@ func create_app_data_layout_for_migration(path: String) -> Dictionary: var normalized: String = _normalize(path) if not _validate_candidate(normalized, false): return {"ok": false, "message": error_message} - var manifest_path: String = normalized.path_join(MANIFEST_FILENAME) - if FileAccess.file_exists(manifest_path): + var manifest_path: String = _existing_manifest_path(normalized) + if not manifest_path.is_empty(): var manifest: Dictionary = _read_json(manifest_path) - return ( - {"ok": true, "root_id": str(manifest.get("root_id", ""))} - if _valid_manifest(manifest) - else {"ok": false, "message": "The app-data manifest is malformed."} - ) + if not _valid_manifest(manifest): + return {"ok": false, "message": "The app-data manifest is malformed."} + if not _upgrade_legacy_manifest(normalized, manifest, manifest_path): + return {"ok": false, "message": "The app-data manifest could not be upgraded."} + return {"ok": true, "root_id": str(manifest.get("root_id", ""))} var id: String = Crypto.new().generate_random_bytes(16).hex_encode() if not _create_layout(normalized, id): return {"ok": false, "message": "The app-data layout could not be created."} @@ -236,12 +298,14 @@ func _activate_existing(path: String, expected_id: String, permit_creation: bool var normalized: String = _normalize(path) if not _validate_candidate(normalized, permit_creation): return false - var manifest_path: String = normalized.path_join(MANIFEST_FILENAME) - if not FileAccess.file_exists(manifest_path): + var manifest_path: String = _existing_manifest_path(normalized) + if manifest_path.is_empty(): return _fail("The selected folder is not a straywild data folder.") var manifest: Dictionary = _read_json(manifest_path) if not _valid_manifest(manifest): return _fail("The straywild data-folder manifest is malformed.") + if not _upgrade_legacy_manifest(normalized, manifest, manifest_path): + return _fail("The legacy data-folder manifest could not be upgraded.") var found_id: String = str(manifest["root_id"]) if not expected_id.is_empty() and expected_id != found_id: return _fail("The selected data folder does not match this device pointer.") @@ -422,12 +486,71 @@ func _valid_manifest(data: Dictionary) -> bool: return ( data.get("format_version") == MANIFEST_VERSION and data.get("layout_version") == LAYOUT_VERSION - and data.get("application") == APPLICATION_ID + and data.get("application") in [APPLICATION_ID, LEGACY_APPLICATION_ID] and typeof(data.get("root_id")) == TYPE_STRING and str(data["root_id"]).length() == 32 ) +func _existing_manifest_path(path: String) -> String: + var current: String = path.path_join(MANIFEST_FILENAME) + if FileAccess.file_exists(current): + return current + var legacy: String = path.path_join(LEGACY_MANIFEST_FILENAME) + return legacy if FileAccess.file_exists(legacy) else "" + + +func _upgrade_legacy_manifest( + path: String, + manifest: Dictionary, + manifest_path: String, +) -> bool: + if ( + manifest_path.get_file() == MANIFEST_FILENAME + and manifest.get("application") == APPLICATION_ID + ): + return true + var upgraded: Dictionary = manifest.duplicate(true) + upgraded["application"] = APPLICATION_ID + upgraded["last_opened_at_unix"] = int(Time.get_unix_time_from_system()) + return _write_text_atomic( + path.path_join(MANIFEST_FILENAME), + JSON.stringify(upgraded, "\t"), + ) + + +func _available_environment_variable(primary: String, legacy: String) -> String: + if OS.has_environment(primary): + return primary + return legacy if OS.has_environment(legacy) else "" + + +func _environment_flag(primary: String, legacy: String) -> bool: + var variable: String = _available_environment_variable(primary, legacy) + return not variable.is_empty() and OS.get_environment(variable) == "1" + + +func _copy_legacy_user_file(source: String, destination: String) -> bool: + var bytes: PackedByteArray = PortableFileGuard.read_bytes( + source, + 16 * 1024 * 1024, + ) + if bytes.is_empty() and FileAccess.get_open_error() != OK: + return false + if DirAccess.make_dir_recursive_absolute(destination.get_base_dir()) != OK: + return false + var file: FileAccess = FileAccess.open(destination, FileAccess.WRITE) + if file == null: + return false + file.store_buffer(bytes) + file.flush() + var copied: bool = file.get_error() == OK + file.close() + if copied and source.ends_with(".key"): + FileAccess.set_unix_permissions(destination, 384) + return copied + + func _directory_is_empty(path: String) -> bool: var access: DirAccess = DirAccess.open(path) if access == null: diff --git a/network/player_relationship_store.gd b/network/player_relationship_store.gd index 0f4b6f1..de04d49 100644 --- a/network/player_relationship_store.gd +++ b/network/player_relationship_store.gd @@ -21,6 +21,10 @@ var _data_root: PlayerDataRoot func configure_storage(path: String, data_root: PlayerDataRoot) -> void: _store_path = path _data_root = data_root + _records.clear() + _loaded = false + _write_blocked = false + _expected_hash = "" func is_muted(fingerprint: String) -> bool: diff --git a/network/portable_data_migration.gd b/network/portable_data_migration.gd index e95d883..2de0acb 100644 --- a/network/portable_data_migration.gd +++ b/network/portable_data_migration.gd @@ -26,10 +26,7 @@ static func migrate_legacy_to( ) -> Dictionary: var normalized: String = destination.simplify_path().trim_suffix("/") if DirAccess.dir_exists_absolute(normalized): - var existing_manifest: String = normalized.path_join( - PlayerDataRoot.MANIFEST_FILENAME - ) - if FileAccess.file_exists(existing_manifest): + if data_root.has_data_manifest(normalized): return { "ok": false, "requires_existing_root_decision": true, @@ -106,7 +103,7 @@ static func migrate_active_to( "message": "This data folder is already active.", } if DirAccess.dir_exists_absolute(normalized) and not _directory_empty(normalized): - if FileAccess.file_exists(normalized.path_join(PlayerDataRoot.MANIFEST_FILENAME)): + if data_root.has_data_manifest(normalized): return { "ok": false, "requires_existing_root_decision": true, @@ -207,8 +204,7 @@ static func replace_existing_with_legacy( destination: String, ) -> Dictionary: var normalized: String = destination.simplify_path().trim_suffix("/") - var manifest: String = normalized.path_join(PlayerDataRoot.MANIFEST_FILENAME) - if not FileAccess.file_exists(manifest): + if not data_root.has_data_manifest(normalized): return {"ok": false, "message": "The selected folder is not a straywild data root."} var recovery: String = ProjectSettings.globalize_path( "user://migration-recovery" @@ -229,7 +225,7 @@ static func replace_existing_with_active( destination: String, ) -> Dictionary: var normalized: String = destination.simplify_path().trim_suffix("/") - if not FileAccess.file_exists(normalized.path_join(PlayerDataRoot.MANIFEST_FILENAME)): + if not data_root.has_data_manifest(normalized): return {"ok": false, "message": "The selected folder is not a straywild data root."} var recovery: String = ProjectSettings.globalize_path( "user://migration-recovery" diff --git a/network/saved_server_store.gd b/network/saved_server_store.gd index de48c2c..4e00259 100644 --- a/network/saved_server_store.gd +++ b/network/saved_server_store.gd @@ -22,6 +22,12 @@ var _data_root: PlayerDataRoot func configure_storage(path: String, data_root: PlayerDataRoot) -> void: _store_path = path _data_root = data_root + _saved_entries.clear() + _recent_entries.clear() + _loaded = false + _recovery_warning = "" + _write_blocked = false + _expected_hash = "" func _temp_path() -> String: diff --git a/network/server_trust_store.gd b/network/server_trust_store.gd index fda774b..1d4dd29 100644 --- a/network/server_trust_store.gd +++ b/network/server_trust_store.gd @@ -19,6 +19,10 @@ var _data_root: PlayerDataRoot func configure_storage(path: String, data_root: PlayerDataRoot) -> void: _store_path = path _data_root = data_root + _records.clear() + _loaded = false + _write_blocked = false + _expected_hash = "" func verify(endpoint: ConnectionEndpoint, fingerprint: String) -> Verification: diff --git a/progression/player_appearance_store.gd b/progression/player_appearance_store.gd index 7ac8767..febe43d 100644 --- a/progression/player_appearance_store.gd +++ b/progression/player_appearance_store.gd @@ -13,6 +13,10 @@ var _data_root: PlayerDataRoot func configure_storage(path: String, data_root: PlayerDataRoot) -> void: _profile_path = path _data_root = data_root + _snapshot = CharacterCustomizationCatalog.default_snapshot() + _loaded = false + _future_version = false + _expected_hash = "" func _temp_path() -> String: diff --git a/save/progression_save_codec.gd b/save/progression_save_codec.gd index a006773..4d0ba33 100644 --- a/save/progression_save_codec.gd +++ b/save/progression_save_codec.gd @@ -2,6 +2,7 @@ class_name ProgressionSaveCodec extends RefCounted const MAGIC := "straywild_PROGRESSION_CONTAINER" +const LEGACY_MAGIC := "NETFISHING_PROGRESSION_CONTAINER" const FORMAT_VERSION := 1 const LOCAL_KIND := "local_save" const ARCHIVE_KIND := "portable_archive" @@ -9,8 +10,10 @@ const MAX_CONTAINER_BYTES := 16 * 1024 * 1024 # This key keeps routine progression files opaque to casual editing. Since the # client is open source, it is intentionally not treated as a security secret. +# Its original value is a stable file-format detail so released saves remain +# readable after the Straywild rebrand. const CONTAINER_PASSPHRASE := ( - "straywild progression container v1 / not an identity credential" + "NETfishing progression container v1 / not an identity credential" ) @@ -102,15 +105,9 @@ static func _read_container(path: String, expected_kind: String) -> Dictionary: or FileAccess.get_size(path) > MAX_CONTAINER_BYTES ): return {"ok": false, "message": "progression file is unavailable."} - var file: FileAccess = FileAccess.open_encrypted_with_pass( - path, - FileAccess.READ, - CONTAINER_PASSPHRASE, - ) - if file == null: + var envelope_text: String = _read_encrypted_text(path) + if envelope_text.is_empty(): return {"ok": false, "message": "progression file could not be opened."} - var envelope_text: String = file.get_as_text() - file.close() var envelope_json := JSON.new() if ( envelope_json.parse(envelope_text) != OK @@ -118,8 +115,9 @@ static func _read_container(path: String, expected_kind: String) -> Dictionary: ): return {"ok": false, "message": "progression container is malformed."} var envelope: Dictionary = envelope_json.data + var legacy_container: bool = envelope.get("magic") == LEGACY_MAGIC if ( - envelope.get("magic") != MAGIC + envelope.get("magic") not in [MAGIC, LEGACY_MAGIC] or int(envelope.get("format_version", -1)) != FORMAT_VERSION or str(envelope.get("kind", "")) != expected_kind ): @@ -144,9 +142,23 @@ static func _read_container(path: String, expected_kind: String) -> Dictionary: "game_version": str(envelope.get("game_version", "")), "created_at_unix": int(envelope.get("created_at_unix", 0)), "legacy_plaintext": false, + "legacy_container": legacy_container, } +static func _read_encrypted_text(path: String) -> String: + var file: FileAccess = FileAccess.open_encrypted_with_pass( + path, + FileAccess.READ, + CONTAINER_PASSPHRASE, + ) + if file == null: + return "" + var text: String = file.get_as_text() + file.close() + return text + + static func _read_plaintext_dictionary(path: String) -> Dictionary: var bytes: PackedByteArray = PortableFileGuard.read_bytes( path, diff --git a/scripts/build_playtest.sh b/scripts/build_playtest.sh index c18f277..9489af2 100755 --- a/scripts/build_playtest.sh +++ b/scripts/build_playtest.sh @@ -9,7 +9,7 @@ readonly WINDOWS_DIR="${BUILD_ROOT}/windows-x86_64" readonly LINUX_DIR="${BUILD_ROOT}/linux-x86_64" readonly README_SOURCE="${PROJECT_ROOT}/docs/README-PLAYTEST.txt" readonly SOURCE_COMMIT="$(git -C "${PROJECT_ROOT}" rev-parse HEAD)" -readonly SOURCE_URL="https://forge.makearmy.io/woofmeow/straywild" +readonly SOURCE_URL="https://forge.makearmy.io/woofmeow/netfishing" readonly WINDOWS_ZIP="${BUILD_ROOT}/straywild-v0.18.1-alpha-windows-x86_64.zip" readonly LINUX_ZIP="${BUILD_ROOT}/straywild-v0.18.1-alpha-linux-x86_64.zip" readonly GODOT_BIN="${GODOT_BIN:-godot}" diff --git a/scripts/build_portmaster.sh b/scripts/build_portmaster.sh index 286a743..0487b5b 100755 --- a/scripts/build_portmaster.sh +++ b/scripts/build_portmaster.sh @@ -193,7 +193,7 @@ cat >"${GAME_ROOT}/licenses/SOURCE-CODE.md" < DedicatedServerConfig: result.discovery_url = str(ProjectSettings.get_setting( "network/discovery/base_url", "" )).strip_edges() - var config_path: String = OS.get_environment( - "straywild_SERVER_CONFIG" + var config_path: String = _environment_string( + "straywild_SERVER_CONFIG", + "NETFISHING_SERVER_CONFIG", + "", ).strip_edges() for argument: String in OS.get_cmdline_user_args(): if argument.begins_with("--config="): @@ -87,36 +89,44 @@ func _load_file(path: String) -> bool: func _apply_environment() -> void: server_name = _environment_string( - "straywild_SERVER_NAME", server_name + "straywild_SERVER_NAME", "NETFISHING_SERVER_NAME", server_name ) bind_address = _environment_string( - "straywild_SERVER_BIND", bind_address + "straywild_SERVER_BIND", "NETFISHING_SERVER_BIND", bind_address + ) + port = _environment_int( + "straywild_SERVER_PORT", "NETFISHING_SERVER_PORT", port ) - port = _environment_int("straywild_SERVER_PORT", port) max_players = _environment_int( - "straywild_SERVER_MAX_PLAYERS", max_players + "straywild_SERVER_MAX_PLAYERS", + "NETFISHING_SERVER_MAX_PLAYERS", + max_players, ) world_seed = _environment_int( - "straywild_WORLD_SEED", world_seed + "straywild_WORLD_SEED", "NETFISHING_WORLD_SEED", world_seed ) public_listing = _environment_bool( - "straywild_SERVER_PUBLIC", public_listing + "straywild_SERVER_PUBLIC", "NETFISHING_SERVER_PUBLIC", public_listing ) discovery_url = _environment_string( - "straywild_DISCOVERY_URL", discovery_url + "straywild_DISCOVERY_URL", "NETFISHING_DISCOVERY_URL", discovery_url ) data_directory = _environment_string( - "straywild_DATA_DIR", data_directory + "straywild_DATA_DIR", "NETFISHING_DATA_DIR", data_directory ) chat_logging = _environment_bool( - "straywild_CHAT_LOGGING", chat_logging + "straywild_CHAT_LOGGING", "NETFISHING_CHAT_LOGGING", chat_logging ) chat_log_path = _environment_string( - "straywild_CHAT_LOG_PATH", chat_log_path + "straywild_CHAT_LOG_PATH", "NETFISHING_CHAT_LOG_PATH", chat_log_path ) - if OS.has_environment("straywild_SERVER_OPERATORS"): + var operators_variable: String = _available_environment_variable( + "straywild_SERVER_OPERATORS", + "NETFISHING_SERVER_OPERATORS", + ) + if not operators_variable.is_empty(): operator_fingerprints = _parse_fingerprint_list( - OS.get_environment("straywild_SERVER_OPERATORS") + OS.get_environment(operators_variable) ) @@ -211,21 +221,45 @@ static func _safe_text(value: String) -> bool: return true -static func _environment_string(name: String, fallback: String) -> String: - return OS.get_environment(name) if OS.has_environment(name) else fallback +static func _available_environment_variable( + name: String, + legacy_name: String, +) -> String: + if OS.has_environment(name): + return name + return legacy_name if OS.has_environment(legacy_name) else "" -static func _environment_int(name: String, fallback: int) -> int: +static func _environment_string( + name: String, + legacy_name: String, + fallback: String, +) -> String: + var variable: String = _available_environment_variable(name, legacy_name) + return OS.get_environment(variable) if not variable.is_empty() else fallback + + +static func _environment_int( + name: String, + legacy_name: String, + fallback: int, +) -> int: + var variable: String = _available_environment_variable(name, legacy_name) return ( - _parse_int(OS.get_environment(name), fallback) - if OS.has_environment(name) else fallback + _parse_int(OS.get_environment(variable), fallback) + if not variable.is_empty() else fallback ) -static func _environment_bool(name: String, fallback: bool) -> bool: - if not OS.has_environment(name): +static func _environment_bool( + name: String, + legacy_name: String, + fallback: bool, +) -> bool: + var variable: String = _available_environment_variable(name, legacy_name) + if variable.is_empty(): return fallback - var value: String = OS.get_environment(name).strip_edges().to_lower() + var value: String = OS.get_environment(variable).strip_edges().to_lower() return value in ["1", "true", "yes", "on"] diff --git a/tests/progression_archive_validation.gd b/tests/progression_archive_validation.gd index 7f98066..c3f9569 100644 --- a/tests/progression_archive_validation.gd +++ b/tests/progression_archive_validation.gd @@ -39,6 +39,15 @@ func _run() -> void: var decoded: Dictionary = ProgressionSaveCodec.read_local_save(save_path) assert(bool(decoded.get("ok", false))) assert(int((decoded["data"] as Dictionary)["save_version"]) == 10) + var legacy_container_path: String = data_root.progression_backup_directory().path_join( + "netfishing-container.nfsave" + ) + _assert_legacy_progression_container( + legacy_container_path, + decoded["data"] as Dictionary, + ) + _assert_legacy_data_manifest(data_root.root_path.get_base_dir()) + _assert_legacy_identity_backup(main, data_root) var archive_path: String = data_root.progression_backup_directory().path_join( "progression-test.nfsave" @@ -135,6 +144,9 @@ func _run() -> void: assert(settings_panel.get_node_or_null("%ExportProgression") == null) assert(settings_panel.get_node_or_null("%ImportProgression") == null) var settings_panel: SettingsPanel = settings_panels.front() as SettingsPanel + settings_panel.set( + "_presentation_mode", SettingsPanel.PresentationMode.TITLE_EMBEDDED + ) var unchanged_root: String = data_root.root_path settings_panel.call("_choose_data_folder") var data_folder_dialog := ( @@ -169,11 +181,14 @@ func _run() -> void: var migrated_root: String = data_root.root_path.get_base_dir().path_join( "progression-migrated-data" ) - var data_migration: Dictionary = PortableDataMigration.migrate_active_to( - data_root, migrated_root + settings_panel.call("_change_data_folder", migrated_root) + for _frame: int in 4: + await process_frame + assert(data_root.root_path == migrated_root) + assert( + (settings_panel.get_node("%SettingsFeedback") as Label).text + == "data folder changed." ) - assert(bool(data_migration.get("ok", false))) - assert(bool(data_migration.get("changed", false))) var migrated_save: String = migrated_root.path_join( "player/player_save.nfsave" ) @@ -193,6 +208,18 @@ func _run() -> void: "ok", false ) )) + var live_slots: Array[Dictionary] = save_slots.list_slots() + assert(live_slots.size() == 2) + var live_created: Dictionary = save_slots.create_empty_slot( + "live root switch" + ) + assert(bool(live_created.get("ok", false))) + var live_slot_id: String = str(live_created.get("slot_id", "")) + assert(save_slots.rename_slot(live_slot_id, "live root ready")) + assert( + str(save_slots.get_slot(live_slot_id).get("display_name", "")) + == "live root ready" + ) main.queue_free() for _frame: int in 4: @@ -202,6 +229,124 @@ func _run() -> void: quit() +func _assert_legacy_progression_container( + path: String, + payload: Dictionary, +) -> void: + var payload_json: String = JSON.stringify(payload) + var envelope: Dictionary = { + "magic": ProgressionSaveCodec.LEGACY_MAGIC, + "format_version": ProgressionSaveCodec.FORMAT_VERSION, + "kind": ProgressionSaveCodec.LOCAL_KIND, + "game_version": "0.18.1-alpha", + "created_at_unix": 1, + "payload_sha256": PortableFileGuard.hash_bytes( + payload_json.to_utf8_buffer() + ), + "payload_json": payload_json, + } + var file: FileAccess = FileAccess.open_encrypted_with_pass( + path, + FileAccess.WRITE, + ProgressionSaveCodec.CONTAINER_PASSPHRASE, + ) + assert(file != null) + file.store_string(JSON.stringify(envelope)) + file.close() + var decoded: Dictionary = ProgressionSaveCodec.read_local_save(path) + assert(bool(decoded.get("ok", false))) + assert(bool(decoded.get("legacy_container", false))) + + +func _assert_legacy_data_manifest(parent: String) -> void: + var legacy_root: String = parent.path_join("netfishing-manifest-root") + assert(DirAccess.make_dir_recursive_absolute(legacy_root) == OK) + var legacy_id: String = "0123456789abcdef0123456789abcdef" + var legacy_manifest: Dictionary = { + "format_version": PlayerDataRoot.MANIFEST_VERSION, + "layout_version": PlayerDataRoot.LAYOUT_VERSION, + "application": PlayerDataRoot.LEGACY_APPLICATION_ID, + "root_id": legacy_id, + "created_at_unix": 1, + "last_opened_at_unix": 1, + } + var legacy_path: String = legacy_root.path_join( + PlayerDataRoot.LEGACY_MANIFEST_FILENAME + ) + var file := FileAccess.open(legacy_path, FileAccess.WRITE) + assert(file != null) + file.store_string(JSON.stringify(legacy_manifest, "\t")) + file.close() + var legacy_data_root := PlayerDataRoot.new() + root.add_child(legacy_data_root) + assert(legacy_data_root.use_existing_root(legacy_root)) + assert(legacy_data_root.root_id == legacy_id) + assert(FileAccess.file_exists(legacy_path)) + var canonical_path: String = legacy_root.path_join( + PlayerDataRoot.MANIFEST_FILENAME + ) + assert(FileAccess.file_exists(canonical_path)) + var parser := JSON.new() + assert(parser.parse(FileAccess.get_file_as_string(canonical_path)) == OK) + assert((parser.data as Dictionary).get("application") == PlayerDataRoot.APPLICATION_ID) + legacy_data_root.queue_free() + + +func _assert_legacy_identity_backup(main: Node, data_root: PlayerDataRoot) -> void: + var player_identity := main.get("_player_identity") as PlayerIdentityStore + var identity_backups := main.get("_identity_backups") as IdentityBackupService + assert(player_identity != null and player_identity.is_ready()) + assert(identity_backups != null) + var material: Dictionary = player_identity.export_identity_material() + var fingerprint: String = str(material.get("fingerprint", "")) + var private_key := CryptoKey.new() + assert(private_key.load_from_string(str(material.get("private_pem", ""))) == OK) + var canonical: PackedByteArray = NetworkIdentityCrypto.canonical_bytes_for_prefix( + NetworkIdentityCrypto.LEGACY_DOMAIN_PREFIX, + "identity_backup_self_test", + ["player", fingerprint], + ) + var context := HashingContext.new() + assert(context.start(HashingContext.HASH_SHA256) == OK) + context.update(canonical) + var signature: PackedByteArray = Crypto.new().sign( + HashingContext.HASH_SHA256, + context.finish(), + private_key, + ) + var envelope: Dictionary = { + "magic": IdentityBackupService.LEGACY_MAGIC, + "format_version": IdentityBackupService.FORMAT_VERSION, + "identity_type": "player", + "algorithm": NetworkIdentityCrypto.ALGORITHM, + "private_pem": material.get("private_pem", ""), + "public_pem": material.get("public_pem", ""), + "fingerprint": fingerprint, + "created_at_unix": 1, + "source_device_id": data_root.device_id, + "self_signature": Marshalls.raw_to_base64(signature), + } + var backup_path: String = data_root.identity_backup_directory().path_join( + "netfishing-player.nfidentity" + ) + var passphrase := "legacy-test-passphrase" + var file: FileAccess = FileAccess.open_encrypted_with_pass( + backup_path, + FileAccess.WRITE, + passphrase, + ) + assert(file != null) + file.store_string(JSON.stringify(envelope)) + file.close() + var inspected: Dictionary = identity_backups.inspect_backup( + backup_path, + passphrase, + "player", + ) + assert(bool(inspected.get("ok", false))) + assert(str(inspected.get("fingerprint", "")) == fingerprint) + + func _assert_opaque(path: String) -> void: var bytes: PackedByteArray = PortableFileGuard.read_bytes(path) assert(not bytes.is_empty()) diff --git a/ui/game_ui.gd b/ui/game_ui.gd index 6efea59..6e4241b 100644 --- a/ui/game_ui.gd +++ b/ui/game_ui.gd @@ -81,6 +81,7 @@ signal shop_backdrop_visibility_changed(is_visible: bool) signal virtual_pointer_mode_changed(is_active: bool) signal social_prompt_accepted signal social_prompt_declined +signal data_root_changed const VIRTUAL_MOUSE_INPUT_OWNER: StringName = &"controller_virtual_mouse" const EMOTE_RADIAL_CAMERA_OWNER: StringName = &"emote_radial_menu" @@ -271,6 +272,8 @@ func _ready() -> void: _pause_settings_panel.crisp_reset_focus_requested.connect( crisp_reset_focus_requested.emit ) + _title_settings_panel.data_root_changed.connect(data_root_changed.emit) + _pause_settings_panel.data_root_changed.connect(data_root_changed.emit) if not Input.joy_connection_changed.is_connected( _on_controller_connection_changed ): diff --git a/ui/settings_panel.gd b/ui/settings_panel.gd index 159b3c0..7055d96 100644 --- a/ui/settings_panel.gd +++ b/ui/settings_panel.gd @@ -40,6 +40,7 @@ signal opened signal crisp_reset_focus_requested signal panel_visibility_changed(is_visible: bool) signal navigation_transition_started +signal data_root_changed enum PresentationMode { TITLE_EMBEDDED, @@ -612,6 +613,7 @@ func _refresh_data_page() -> void: %DataStorageMode.text = "storage mode: " + _data_root.storage_mode_text() %ChangeDataFolder.disabled = ( _data_root.override_active + or _presentation_mode != PresentationMode.TITLE_EMBEDDED or (_network_session != null and _network_session.is_session_active()) ) var fingerprint: String = ( @@ -668,6 +670,9 @@ func _choose_data_folder() -> void: if _data_root == null or _data_root.override_active: _feedback.text = "the data folder is externally managed." return + if _presentation_mode != PresentationMode.TITLE_EMBEDDED: + _feedback.text = "return to title to change the data folder." + return if _network_session != null and _network_session.is_session_active(): _feedback.text = "return to title to change the data folder." return @@ -684,6 +689,12 @@ func _choose_data_folder() -> void: func _change_data_folder(path: String) -> void: + if ( + _presentation_mode != PresentationMode.TITLE_EMBEDDED + or (_network_session != null and _network_session.is_session_active()) + ): + _feedback.text = "return to title to change the data folder." + return var result: Dictionary = PortableDataMigration.migrate_active_to( _data_root, path ) @@ -697,9 +708,7 @@ func _change_data_folder(path: String) -> void: ).to_lower() _refresh_data_page() return - _feedback.text = "data folder changed. straywild will close safely." - _refresh_data_page() - get_tree().call_deferred("quit") + _complete_data_root_change("data folder changed.") else: _feedback.text = str( result.get("message", "could not change the data folder.") @@ -717,8 +726,7 @@ func _show_existing_data_folder_choice(path: String) -> void: dialog.add_button("replace selected data", false, "replace") dialog.confirmed.connect(func() -> void: if _data_root.use_existing_root(path): - _feedback.text = "data folder changed. straywild will close safely." - get_tree().call_deferred("quit") + _complete_data_root_change("data folder changed.") else: _feedback.text = _data_root.error_message dialog.queue_free() @@ -733,7 +741,7 @@ func _show_existing_data_folder_choice(path: String) -> void: result.get("message", "could not replace selected data.") ) if bool(result.get("ok", false)): - get_tree().call_deferred("quit") + _complete_data_root_change(_feedback.text.to_lower()) dialog.queue_free() ) _interface_fonts.apply_utility_theme(dialog) @@ -744,6 +752,12 @@ func _show_existing_data_folder_choice(path: String) -> void: ) +func _complete_data_root_change(message: String) -> void: + _feedback.text = message + _refresh_data_page() + data_root_changed.emit() + + func _choose_identity_export(identity_type: String) -> void: if not _identity_operation_allowed(): return diff --git a/ui/title_screen.gd b/ui/title_screen.gd index 3055e15..0a80f63 100644 --- a/ui/title_screen.gd +++ b/ui/title_screen.gd @@ -243,6 +243,11 @@ func reopen_to_menu() -> void: _set_title_bubbles_interactive(true) +func refresh_after_data_root_change() -> void: + _save_slots_page.refresh_page() + _refresh_save_inspection() + + func open_join_game_page(endpoint: String = "") -> void: _cancel_title_entry_transition() _awaiting_start_input = false From 2b06b79bbfac1dac4b0e69e521a2ca23c767ff05 Mon Sep 17 00:00:00 2001 From: Voyager Date: Tue, 25 Aug 2026 22:18:30 -0400 Subject: [PATCH 04/37] Repair restored hand-net texture imports --- .../items/equipment/net_Material.png.import | 16 +++++++++------- .../equipment/net_Plane Base Color.png.import | 16 +++++++++------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/art/exported/items/equipment/net_Material.png.import b/art/exported/items/equipment/net_Material.png.import index 531b99b..0723973 100644 --- a/art/exported/items/equipment/net_Material.png.import +++ b/art/exported/items/equipment/net_Material.png.import @@ -2,10 +2,12 @@ importer="texture" type="CompressedTexture2D" -uid="uid://dprm50tbiulog" -path="res://.godot/imported/net_Material.png-f4c4b0400561bc2751fe719b6b1a1e1a.ctex" +uid="uid://binoqhg45vgbs" +path.s3tc="res://.godot/imported/net_Material.png-f4c4b0400561bc2751fe719b6b1a1e1a.s3tc.ctex" +path.etc2="res://.godot/imported/net_Material.png-f4c4b0400561bc2751fe719b6b1a1e1a.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } generator_parameters={ "md5": "ef2c2ae657c9460c90eb808ba5217f39" @@ -14,11 +16,11 @@ generator_parameters={ [deps] source_file="res://art/exported/items/equipment/net_Material.png" -dest_files=["res://.godot/imported/net_Material.png-f4c4b0400561bc2751fe719b6b1a1e1a.ctex"] +dest_files=["res://.godot/imported/net_Material.png-f4c4b0400561bc2751fe719b6b1a1e1a.s3tc.ctex", "res://.godot/imported/net_Material.png-f4c4b0400561bc2751fe719b6b1a1e1a.etc2.ctex"] [params] -compress/mode=0 +compress/mode=2 compress/high_quality=false compress/lossy_quality=0.7 compress/uastc_level=0 @@ -26,7 +28,7 @@ compress/rdo_quality_loss=0.0 compress/hdr_compression=1 compress/normal_map=0 compress/channel_pack=0 -mipmaps/generate=true +mipmaps/generate=false mipmaps/limit=-1 roughness/mode=0 roughness/src_normal="" @@ -40,4 +42,4 @@ process/normal_map_invert_y=false process/hdr_as_srgb=false process/hdr_clamp_exposure=false process/size_limit=0 -detect_3d/compress_to=1 +detect_3d/compress_to=0 diff --git a/art/exported/items/equipment/net_Plane Base Color.png.import b/art/exported/items/equipment/net_Plane Base Color.png.import index 7f40afc..61077be 100644 --- a/art/exported/items/equipment/net_Plane Base Color.png.import +++ b/art/exported/items/equipment/net_Plane Base Color.png.import @@ -2,10 +2,12 @@ importer="texture" type="CompressedTexture2D" -uid="uid://seq5b31mwcqr" -path="res://.godot/imported/net_Plane Base Color.png-3875ae3dd186ddf319c55aabb13e663f.ctex" +uid="uid://cdsabucjy5rpk" +path.s3tc="res://.godot/imported/net_Plane Base Color.png-3875ae3dd186ddf319c55aabb13e663f.s3tc.ctex" +path.etc2="res://.godot/imported/net_Plane Base Color.png-3875ae3dd186ddf319c55aabb13e663f.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } generator_parameters={ "md5": "a6001c381d4c8e16bd2d64ea74ccff82" @@ -14,11 +16,11 @@ generator_parameters={ [deps] source_file="res://art/exported/items/equipment/net_Plane Base Color.png" -dest_files=["res://.godot/imported/net_Plane Base Color.png-3875ae3dd186ddf319c55aabb13e663f.ctex"] +dest_files=["res://.godot/imported/net_Plane Base Color.png-3875ae3dd186ddf319c55aabb13e663f.s3tc.ctex", "res://.godot/imported/net_Plane Base Color.png-3875ae3dd186ddf319c55aabb13e663f.etc2.ctex"] [params] -compress/mode=0 +compress/mode=2 compress/high_quality=false compress/lossy_quality=0.7 compress/uastc_level=0 @@ -26,7 +28,7 @@ compress/rdo_quality_loss=0.0 compress/hdr_compression=1 compress/normal_map=0 compress/channel_pack=0 -mipmaps/generate=true +mipmaps/generate=false mipmaps/limit=-1 roughness/mode=0 roughness/src_normal="" @@ -40,4 +42,4 @@ process/normal_map_invert_y=false process/hdr_as_srgb=false process/hdr_clamp_exposure=false process/size_limit=0 -detect_3d/compress_to=1 +detect_3d/compress_to=0 From ed2f3f7abcc67348bd0def840e57b1304f2eafed Mon Sep 17 00:00:00 2001 From: Voyager Date: Tue, 25 Aug 2026 22:22:18 -0400 Subject: [PATCH 05/37] chore: prepare v0.19.0-alpha release --- docs/README-PLAYTEST.txt | 4 ++-- export_presets.cfg | 26 +++++++++++++------------- project.godot | 2 +- scripts/build_playtest.sh | 6 +++--- ui/title_screen.tscn | 2 +- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/README-PLAYTEST.txt b/docs/README-PLAYTEST.txt index fb08636..15e3698 100644 --- a/docs/README-PLAYTEST.txt +++ b/docs/README-PLAYTEST.txt @@ -1,6 +1,6 @@ straywild -v0.18.1-alpha -Alpha 0.18.1 +v0.19.0-alpha +Alpha 0.19.0 Thank you for trying this early private playtest. diff --git a/export_presets.cfg b/export_presets.cfg index f16af2d..05b0918 100644 --- a/export_presets.cfg +++ b/export_presets.cfg @@ -9,7 +9,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.18.1-alpha/windows-x86_64/straywild.exe" +export_path="builds/v0.19.0-alpha/windows-x86_64/straywild.exe" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -35,11 +35,11 @@ application/modify_resources=true application/icon="res://art/exported/system_icons/straywild.ico" application/console_wrapper_icon="" application/icon_interpolation=0 -application/file_version="0.18.1.0" -application/product_version="0.18.1.0" +application/file_version="0.19.0.0" +application/product_version="0.19.0.0" application/company_name="Woofmeow" application/product_name="straywild" -application/file_description="straywild v0.18.1-alpha" +application/file_description="straywild v0.19.0-alpha" application/copyright="Copyright © 2026 Woofmeow" application/trademarks="straywild and Woofmeow branding is reserved; see TRADEMARKS.md" application/export_angle=0 @@ -62,7 +62,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.18.1-alpha/linux-arm64/straywild.arm64" +export_path="builds/v0.19.0-alpha/linux-arm64/straywild.arm64" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -92,7 +92,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.18.1-alpha/macos/straywild.zip" +export_path="builds/v0.19.0-alpha/macos/straywild.zip" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -108,8 +108,8 @@ custom_template/release="" application/bundle_identifier="io.woofmeow.netfishing" application/icon="res://art/exported/system_icons/straywild_1024.png" application/icon_interpolation=0 -application/short_version="0.18.1" -application/version="0.18.1" +application/short_version="0.19.0" +application/version="0.19.0" application/architecture="universal" codesign/enable=false notarization/enable=false @@ -125,7 +125,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*,tests/*" -export_path="builds/v0.18.1-alpha/server-linux-x86_64/straywildServer.x86_64" +export_path="builds/v0.19.0-alpha/server-linux-x86_64/straywildServer.x86_64" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -155,7 +155,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.18.1-alpha/android/straywild.apk" +export_path="builds/v0.19.0-alpha/android/straywild.apk" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -176,8 +176,8 @@ architectures/armeabi-v7a=false architectures/arm64-v8a=true architectures/x86=false architectures/x86_64=false -version/code=180100 -version/name="v0.18.1-alpha" +version/code=190000 +version/name="v0.19.0-alpha" package/unique_name="io.woofmeow.netfishing" package/name="straywild" package/signed=true @@ -214,7 +214,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.18.1-alpha/linux-x86_64/straywild.x86_64" +export_path="builds/v0.19.0-alpha/linux-x86_64/straywild.x86_64" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" diff --git a/project.godot b/project.godot index db06b66..d202817 100644 --- a/project.godot +++ b/project.godot @@ -11,7 +11,7 @@ config_version=5 [application] config/name="straywild" -config/version="0.18.1-alpha" +config/version="0.19.0-alpha" run/main_scene="res://main/main.tscn" config/features=PackedStringArray("4.7", "GL Compatibility") config/icon="res://art/exported/system_icons/straywild_256.png" diff --git a/scripts/build_playtest.sh b/scripts/build_playtest.sh index 9489af2..1c74943 100755 --- a/scripts/build_playtest.sh +++ b/scripts/build_playtest.sh @@ -4,14 +4,14 @@ set -euo pipefail readonly SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" readonly PROJECT_ROOT="$(cd -- "${SCRIPT_DIR}/.." && pwd)" -readonly BUILD_ROOT="${PROJECT_ROOT}/builds/v0.18.1-alpha" +readonly BUILD_ROOT="${PROJECT_ROOT}/builds/v0.19.0-alpha" readonly WINDOWS_DIR="${BUILD_ROOT}/windows-x86_64" readonly LINUX_DIR="${BUILD_ROOT}/linux-x86_64" readonly README_SOURCE="${PROJECT_ROOT}/docs/README-PLAYTEST.txt" readonly SOURCE_COMMIT="$(git -C "${PROJECT_ROOT}" rev-parse HEAD)" readonly SOURCE_URL="https://forge.makearmy.io/woofmeow/netfishing" -readonly WINDOWS_ZIP="${BUILD_ROOT}/straywild-v0.18.1-alpha-windows-x86_64.zip" -readonly LINUX_ZIP="${BUILD_ROOT}/straywild-v0.18.1-alpha-linux-x86_64.zip" +readonly WINDOWS_ZIP="${BUILD_ROOT}/straywild-v0.19.0-alpha-windows-x86_64.zip" +readonly LINUX_ZIP="${BUILD_ROOT}/straywild-v0.19.0-alpha-linux-x86_64.zip" readonly GODOT_BIN="${GODOT_BIN:-godot}" if [[ ! -f "${PROJECT_ROOT}/project.godot" ]]; then diff --git a/ui/title_screen.tscn b/ui/title_screen.tscn index 1888db9..d1fc210 100644 --- a/ui/title_screen.tscn +++ b/ui/title_screen.tscn @@ -213,7 +213,7 @@ unique_name_in_owner = true layout_mode = 2 theme_override_colors/font_color = Color(0.682, 0.733, 0.761, 1) theme_override_font_sizes/font_size = 22 -text = "v0.18.1-alpha" +text = "v0.19.0-alpha" horizontal_alignment = 1 [node name="Spacer" type="Control" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent"] From f910e6bdbbecad3fd1dd50218ecf6e04cd3d8601 Mon Sep 17 00:00:00 2001 From: Voyager Date: Wed, 26 Aug 2026 00:05:51 -0400 Subject: [PATCH 06/37] Update Forgejo links for Straywild rename --- README.md | 4 ++-- docs/README.md | 4 ++-- scripts/build_playtest.sh | 2 +- scripts/build_portmaster.sh | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 536afab..e228e7b 100644 --- a/README.md +++ b/README.md @@ -22,9 +22,9 @@ Discord: https://discord.gg/5gP22447kc Matrix: https://matrix.to/#/#straywild:matrix.makearmy.io -Repo: https://forge.makearmy.io/woofmeow/netfishing +Repo: https://forge.makearmy.io/woofmeow/straywild -Releases: https://forge.makearmy.io/woofmeow/netfishing/releases +Releases: https://forge.makearmy.io/woofmeow/straywild/releases ## Installing release builds diff --git a/docs/README.md b/docs/README.md index 5327b30..444ebc7 100644 --- a/docs/README.md +++ b/docs/README.md @@ -17,10 +17,10 @@ for local README files. ## Related repositories -- [Discovery service API](https://forge.makearmy.io/woofmeow/netfishing-discovery-server/src/branch/main/docs/API.md) +- [Discovery service API](https://forge.makearmy.io/woofmeow/straywild-discovery-server/src/branch/main/docs/API.md) stays with the service implementation and defines its versioned HTTP contract. -- [Dedicated-server packaging](https://forge.makearmy.io/woofmeow/netfishing-dedicated-server/src/branch/main/README.md) +- [Dedicated-server packaging](https://forge.makearmy.io/woofmeow/straywild-dedicated-server/src/branch/main/README.md) stays with its installer and update scripts. It consumes this repository's attribution and legal notices from the exact pinned game commit instead of maintaining copies. diff --git a/scripts/build_playtest.sh b/scripts/build_playtest.sh index 1c74943..2347d3d 100755 --- a/scripts/build_playtest.sh +++ b/scripts/build_playtest.sh @@ -9,7 +9,7 @@ readonly WINDOWS_DIR="${BUILD_ROOT}/windows-x86_64" readonly LINUX_DIR="${BUILD_ROOT}/linux-x86_64" readonly README_SOURCE="${PROJECT_ROOT}/docs/README-PLAYTEST.txt" readonly SOURCE_COMMIT="$(git -C "${PROJECT_ROOT}" rev-parse HEAD)" -readonly SOURCE_URL="https://forge.makearmy.io/woofmeow/netfishing" +readonly SOURCE_URL="https://forge.makearmy.io/woofmeow/straywild" readonly WINDOWS_ZIP="${BUILD_ROOT}/straywild-v0.19.0-alpha-windows-x86_64.zip" readonly LINUX_ZIP="${BUILD_ROOT}/straywild-v0.19.0-alpha-linux-x86_64.zip" readonly GODOT_BIN="${GODOT_BIN:-godot}" diff --git a/scripts/build_portmaster.sh b/scripts/build_portmaster.sh index 0487b5b..a40e0cd 100755 --- a/scripts/build_portmaster.sh +++ b/scripts/build_portmaster.sh @@ -193,7 +193,7 @@ cat >"${GAME_ROOT}/licenses/SOURCE-CODE.md" < Date: Sat, 29 Aug 2026 17:41:10 -0400 Subject: [PATCH 07/37] Fix clam spurt origin artifact (#118) --- gathering/world_gatherable.gd | 7 +++-- tests/world_spawn_protocol_validation.gd | 39 ++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/gathering/world_gatherable.gd b/gathering/world_gatherable.gd index 8a07ba0..1a71477 100644 --- a/gathering/world_gatherable.gd +++ b/gathering/world_gatherable.gd @@ -29,12 +29,16 @@ func configure( entity_id = configured_entity_id data = configured_data type_id = data.type_id if data != null else StringName() + # Establish the authoritative transform before constructing transient visuals. + # Effects emitted before this point would begin at the default world origin. + apply_network_state(position, yaw, true) if data != null and data.is_stationary_hotspot(): _ensure_water_spurt_visual() _water_spurt_elapsed = ( float(abs(hash(entity_id)) % 1000) / 1000.0 * WATER_SPURT_INTERVAL_SECONDS ) + _emit_water_spurt() else: _ensure_visual() if data != null and data.catch_data != null and _sprite != null: @@ -50,7 +54,6 @@ func configure( ) ) _sprite.rotation_degrees.x = data.sprite_tilt_degrees - apply_network_state(position, yaw, true) func apply_network_state( @@ -147,7 +150,6 @@ func _ensure_water_spurt_visual() -> void: hole.mesh = hole_mesh hole.cast_shadow = GeometryInstance3D.SHADOW_CASTING_SETTING_OFF _water_spurt_root.add_child(hole) - _emit_water_spurt() func _emit_water_spurt() -> void: @@ -159,6 +161,7 @@ func _emit_water_spurt() -> void: particles.amount = 6 particles.lifetime = 0.42 particles.one_shot = true + particles.local_coords = true particles.explosiveness = 1.0 particles.direction = Vector3.UP particles.spread = 32.0 diff --git a/tests/world_spawn_protocol_validation.gd b/tests/world_spawn_protocol_validation.gd index a8365a1..d100260 100644 --- a/tests/world_spawn_protocol_validation.gd +++ b/tests/world_spawn_protocol_validation.gd @@ -16,6 +16,10 @@ const CalendarSeasonType = preload("res://world/calendar_season.gd") func _initialize() -> void: + call_deferred(&"_run") + + +func _run() -> void: assert(NetworkProtocol.PROTOCOL_VERSION == 11) assert( NetworkWorldSpawnProtocol.CAPABILITY @@ -23,7 +27,7 @@ func _initialize() -> void: ) assert(NetworkWorldSpawnProtocol.SNAPSHOT_ENTITIES_PER_ENVELOPE <= 4) _validate_catalog_statuses() - _validate_billboard_presentation() + await _validate_billboard_presentation() _validate_envelopes() print("World spawn protocol validation: PASS") quit() @@ -148,8 +152,27 @@ func _validate_billboard_presentation() -> void: assert(not sprite.shaded) gatherable.free() + var unconfigured_hotspot := WorldGatherableType.new() + unconfigured_hotspot.call("_ensure_water_spurt_visual") + assert( + unconfigured_hotspot.get_node_or_null( + "WaterSpurt/WaterDroplets" + ) == null + ) + unconfigured_hotspot.free() + + var clam: GatherableData = Gatherables.get_entry(&"clam_manila") + assert(clam != null) var hotspot := WorldGatherableType.new() - hotspot.call("_ensure_water_spurt_visual") + root.add_child(hotspot) + var configured_position := Vector3(24.0, 0.3, -11.0) + hotspot.configure( + "world:clam-presentation-regression", + clam, + configured_position, + 0.0, + ) + assert(hotspot.global_position.is_equal_approx(configured_position)) var hole := hotspot.get_node("WaterSpurt/BurrowMark") as MeshInstance3D assert(hole != null) assert(hole.cast_shadow == GeometryInstance3D.SHADOW_CASTING_SETTING_OFF) @@ -158,6 +181,18 @@ func _validate_billboard_presentation() -> void: assert(hole_material.shading_mode == BaseMaterial3D.SHADING_MODE_UNSHADED) assert(hole_material.transparency == BaseMaterial3D.TRANSPARENCY_DISABLED) assert(is_equal_approx(hole_material.albedo_color.a, 1.0)) + var particles := hotspot.get_node( + "WaterSpurt/WaterDroplets" + ) as CPUParticles3D + assert(particles != null and particles.emitting) + assert(particles.local_coords) + assert(particles.global_position.is_equal_approx( + configured_position + Vector3.UP * 0.035 + )) + hotspot.set_process(false) + await create_timer(0.6).timeout + await process_frame + assert(hotspot.get_node_or_null("WaterSpurt/WaterDroplets") == null) hotspot.queue_free() From 4575830857c18dd6d9a3b4761c0df7c19cacf18c Mon Sep 17 00:00:00 2001 From: Voyager Date: Sat, 29 Aug 2026 17:43:11 -0400 Subject: [PATCH 08/37] Improve nearby water recovery and camera prompts Recover players on generated worlds to the nearest safe grass or sand surface. Use the active gameplay camera when positioning shop and storage prompts. --- main/main.gd | 18 +- tests/art_tools_validation.gd | 6 + tests/fishing_authority_validation.gd | 9 + tests/generated_world_runtime_validation.gd | 75 ++++++ tests/world_layout_validation.gd | 8 + ui/game_ui.gd | 4 +- world/generation/generated_world_region.gd | 239 ++++++++++++++++++++ world/regions/world_region.gd | 18 ++ world/test_world.gd | 10 + world/water_recovery_controller.gd | 34 ++- 10 files changed, 396 insertions(+), 25 deletions(-) diff --git a/main/main.gd b/main/main.gd index 442c97c..7fae866 100644 --- a/main/main.gd +++ b/main/main.gd @@ -1006,7 +1006,8 @@ func _initialize_application(dedicated: bool) -> void: _game_ui, _game_ui.get_screen_fade(), _test_world.get_player_water_triggers(), - _test_world.get_safe_respawn_points() + _test_world.get_safe_respawn_points(), + Callable(_test_world, "get_water_recovery_position"), ) _ui_pixelation.effective_pixel_size_changed.connect( _on_effective_ui_pixel_size_changed @@ -2344,17 +2345,9 @@ func _on_remote_recovery_requested( peer_id, "Fishing attempt ended." ) - var target_position: Vector3 = _test_world.get_player_spawn_transform().origin - var nearest_distance: float = INF - for point: SafeRespawnPoint in _test_world.get_safe_respawn_points(): - if point == null or not point.enabled: - continue - var distance: float = point.get_horizontal_distance_squared( - entry_position - ) - if distance < nearest_distance: - nearest_distance = distance - target_position = point.global_position + var target_position := _test_world.get_water_recovery_position( + entry_position + ) target_position.y += _water_recovery.respawn_height_offset avatar.global_position = target_position avatar.velocity = Vector3.ZERO @@ -2432,6 +2425,7 @@ func _apply_world( spawn_transform, _test_world.get_player_water_triggers(), _test_world.get_safe_respawn_points(), + Callable(_test_world, "get_water_recovery_position"), ) _shoreline_ambience.configure( _player, diff --git a/tests/art_tools_validation.gd b/tests/art_tools_validation.gd index 3b9d6a3..4bfab98 100644 --- a/tests/art_tools_validation.gd +++ b/tests/art_tools_validation.gd @@ -416,6 +416,12 @@ func _run() -> void: ) assert(normal_camera.is_position_behind(chat_anchor)) assert(not free_camera.is_position_behind(chat_anchor)) + var shop_prompt := game_ui.get_node("%ShopPrompt") as Control + var storage_prompt := game_ui.get_node("%StoragePrompt") as Control + game_ui.set_shop_prompt_visible(true, chat_anchor) + game_ui.set_storage_prompt_visible(true, chat_anchor) + assert(shop_prompt.visible) + assert(storage_prompt.visible) chat_ui.show_local_speech("hello there friend") await process_frame assert(bool(player.get("_speech_mouth_active"))) diff --git a/tests/fishing_authority_validation.gd b/tests/fishing_authority_validation.gd index e7c87bb..b3c17dd 100644 --- a/tests/fishing_authority_validation.gd +++ b/tests/fishing_authority_validation.gd @@ -265,6 +265,15 @@ func _run() -> void: assert(bool(water_recovery.get("_prior_movement_enabled"))) assert(bool(water_recovery.get("_prior_camera_input_enabled"))) assert(not pause_menu.visible) + var test_world := main.get_node("TestWorld") as TestWorld + assert(test_world != null) + var recovery_entry := water_recovery.get("_entry_position") as Vector3 + var resolved_recovery := water_recovery.call( + "_resolve_recovery_position" + ) as Vector3 + assert(resolved_recovery.is_equal_approx( + test_world.get_water_recovery_position(recovery_entry) + )) water_recovery.call("_finish_recovery") assert(player.is_movement_enabled()) diff --git a/tests/generated_world_runtime_validation.gd b/tests/generated_world_runtime_validation.gd index f487ae7..6a3f6c8 100644 --- a/tests/generated_world_runtime_validation.gd +++ b/tests/generated_world_runtime_validation.gd @@ -536,6 +536,11 @@ func _validate_generated_region( -INF, 0.35, ) + _validate_water_recovery_positions( + region, + grass_prop_surface_triangles, + sand_prop_surface_triangles, + ) var anchors := region.get_node( "GatherableAnchors/ReachableTreeTrunks" ) as GatherableAnchorSet3D @@ -1268,6 +1273,76 @@ func _triangle_surface_height_at( return highest +func _validate_water_recovery_positions( + region: GeneratedWorldRegion, + grass_triangles: Array[PackedVector3Array], + sand_triangles: Array[PackedVector3Array], +) -> void: + var fresh_water_root := region.get_node( + "WaterBodies/FreshWaterBodies" + ) as Node3D + assert(fresh_water_root != null and fresh_water_root.get_child_count() > 0) + var fresh_water := fresh_water_root.get_child(0) as WaterBodyAuthoring + assert(fresh_water != null) + var entry_position := fresh_water.global_position + var fallback_position := region.get_player_spawn_transform().origin + var recovery_position := region.get_water_recovery_position( + entry_position, + fallback_position, + ) + assert(recovery_position.is_finite()) + assert( + _horizontal_distance_squared(entry_position, recovery_position) + < _horizontal_distance_squared(entry_position, fallback_position), + "Fresh-water recovery returned the distant generated-world spawn.", + ) + assert( + recovery_position.y + > GeneratedWorldRegion.WATER_HEIGHT + + GeneratedWorldRegion.WATER_RECOVERY_MINIMUM_GROUND_CLEARANCE + ) + var recovery_triangles: Array[PackedVector3Array] = [] + recovery_triangles.append_array(grass_triangles) + recovery_triangles.append_array(sand_triangles) + var center_height := _triangle_surface_height_at( + recovery_position, + recovery_triangles, + ) + assert(center_height > -INF) + assert(absf(center_height - recovery_position.y) <= 0.01) + for direction: Vector2 in GeneratedWorldRegion.PROP_SURFACE_SAMPLE_DIRECTIONS: + var footprint_position := recovery_position + Vector3( + direction.x * GeneratedWorldRegion.WATER_RECOVERY_FOOTPRINT_RADIUS, + 0.0, + direction.y * GeneratedWorldRegion.WATER_RECOVERY_FOOTPRINT_RADIUS, + ) + var footprint_height := _triangle_surface_height_at( + footprint_position, + recovery_triangles, + ) + assert(footprint_height > -INF) + assert( + absf(footprint_height - recovery_position.y) + <= GeneratedWorldRegion.PROP_MAXIMUM_SUPPORT_HEIGHT_DIFFERENCE + ) + assert( + region.get_water_recovery_position( + entry_position, + fallback_position, + ).is_equal_approx(recovery_position) + ) + assert( + region.get_water_recovery_position( + Vector3(INF, 0.0, 0.0), + fallback_position, + ).is_equal_approx(fallback_position) + ) + + +func _horizontal_distance_squared(a: Vector3, b: Vector3) -> float: + return Vector2(a.x - b.x, a.z - b.z).length_squared() + + func _validate_tree_gatherable_anchors( region: GeneratedWorldRegion, decorations: Node3D, diff --git a/tests/world_layout_validation.gd b/tests/world_layout_validation.gd index dd40fcf..e6eec39 100644 --- a/tests/world_layout_validation.gd +++ b/tests/world_layout_validation.gd @@ -100,6 +100,14 @@ func _validate_world_switching() -> void: assert(world.get_fishing_shop() != null) assert(world.get_player_storage() != null) assert(not world.get_fishable_water_regions().is_empty()) + var starter_safe_points := world.get_safe_respawn_points() + assert(not starter_safe_points.is_empty()) + var authored_safe_point: SafeRespawnPoint = starter_safe_points.back() + assert( + world.get_water_recovery_position( + authored_safe_point.global_position + ).is_equal_approx(authored_safe_point.global_position) + ) assert(world.activate_world(WorldLayout.GENERATED, 24680)) assert(world.get_world_layout() == WorldLayout.GENERATED) assert(world.get_generation_seed() == 24680) diff --git a/ui/game_ui.gd b/ui/game_ui.gd index 6e4241b..7f8f0a6 100644 --- a/ui/game_ui.gd +++ b/ui/game_ui.gd @@ -1892,7 +1892,7 @@ func _position_storage_prompt(world_anchor: Vector3) -> void: if _player == null: _storage_prompt.hide() return - var camera := _player.get_gameplay_camera() + var camera := _player.get_active_gameplay_camera() if camera == null or camera.is_position_behind(world_anchor): _storage_prompt.hide() return @@ -2006,7 +2006,7 @@ func _position_shop_prompt(world_anchor: Vector3) -> void: if _player == null: _shop_prompt.hide() return - var camera: Camera3D = _player.get_gameplay_camera() + var camera: Camera3D = _player.get_active_gameplay_camera() if camera == null or camera.is_position_behind(world_anchor): _shop_prompt.hide() return diff --git a/world/generation/generated_world_region.gd b/world/generation/generated_world_region.gd index aa27a65..780ddb8 100644 --- a/world/generation/generated_world_region.gd +++ b/world/generation/generated_world_region.gd @@ -43,6 +43,12 @@ const PROP_MINIMUM_GROUND_CLEARANCE := 0.05 const PROP_MAXIMUM_SUPPORT_HEIGHT_DIFFERENCE := 0.35 const PROP_CHANCE_SCALE := 10000 const PROP_SELECTION_WEIGHT_SCALE := 1000 +const WATER_RECOVERY_MINIMUM_GROUND_CLEARANCE := 0.05 +const WATER_RECOVERY_MINIMUM_UP_DOT := 0.6 +const WATER_RECOVERY_FOOTPRINT_RADIUS := 0.6 +const WATER_RECOVERY_INSET_STEP := 0.25 +const WATER_RECOVERY_MAXIMUM_INSET := 1.5 +const WATER_RECOVERY_SEARCH_EXPANSIONS: Array[float] = [1.5, 4.0, 12.0] const PROP_SURFACE_SAMPLE_DIRECTIONS: Array[Vector2] = [ Vector2(1.0, 0.0), Vector2(0.70710678, 0.70710678), @@ -90,6 +96,7 @@ var _placed_prop_clearance_radii: Array[float] = [] var _placed_prop_groups: Array[StringName] = [] var _placed_group_coordinates: Dictionary[StringName, Array] = {} var _biome_assignments: Dictionary[Vector2i, StringName] = {} +var _water_recovery_triangles_by_coordinate: Dictionary[Vector2i, Array] = {} func _ready() -> void: @@ -190,6 +197,37 @@ func get_spawn_surface_triangles( return triangles +func get_water_recovery_position( + entry_position: Vector3, + fallback_position: Vector3, +) -> Vector3: + if ( + not entry_position.is_finite() + or _water_recovery_triangles_by_coordinate.is_empty() + ): + return super(entry_position, fallback_position) + var nearest_surface_distance := _nearest_recovery_surface_distance( + entry_position + ) + if not is_finite(nearest_surface_distance): + return super(entry_position, fallback_position) + for expansion: float in WATER_RECOVERY_SEARCH_EXPANSIONS: + var maximum_distance := nearest_surface_distance + expansion + var result: Variant = _nearest_safe_recovery_surface_position( + entry_position, + maximum_distance, + ) + if result is Vector3: + return result as Vector3 + var map_wide_result: Variant = _nearest_safe_recovery_surface_position( + entry_position, + get_playable_half_extents().length() * 2.0, + ) + if map_wide_result is Vector3: + return map_wide_result as Vector3 + return super(entry_position, fallback_position) + + func _on_generation_completed(summary: Dictionary) -> void: _diggable_beach.invalidate_surface_cache() var records: Array[Dictionary] = _generator.placement_records() @@ -325,6 +363,10 @@ func _on_generation_completed(summary: Dictionary) -> void: grass_surface_triangles_by_coordinate, sand_surface_triangles_by_coordinate, ) + _cache_water_recovery_surfaces( + grass_surface_triangles_by_coordinate, + sand_surface_triangles_by_coordinate, + ) _place_spawn_amenities(spawn_position) _configure_fresh_water(records) _configure_diggable_area() @@ -1261,6 +1303,203 @@ func _terrain_surface_triangles_by_coordinate( return triangles_by_coordinate +func _cache_water_recovery_surfaces( + grass_triangles: Dictionary[Vector2i, Array], + sand_triangles: Dictionary[Vector2i, Array], +) -> void: + _water_recovery_triangles_by_coordinate.clear() + _append_water_recovery_surfaces(grass_triangles) + _append_water_recovery_surfaces(sand_triangles) + + +func _append_water_recovery_surfaces( + source: Dictionary[Vector2i, Array], +) -> void: + for coordinate: Vector2i in source: + var eligible: Array = _water_recovery_triangles_by_coordinate.get( + coordinate, + [], + ) + for triangle: PackedVector3Array in source[coordinate]: + if triangle.size() != 3: + continue + if minf( + triangle[0].y, + minf(triangle[1].y, triangle[2].y), + ) <= WATER_HEIGHT + WATER_RECOVERY_MINIMUM_GROUND_CLEARANCE: + continue + var cross := (triangle[1] - triangle[0]).cross( + triangle[2] - triangle[0] + ) + if ( + cross.length_squared() <= 0.0000001 + or absf(cross.normalized().dot(Vector3.UP)) + < WATER_RECOVERY_MINIMUM_UP_DOT + ): + continue + eligible.append(triangle) + if not eligible.is_empty(): + _water_recovery_triangles_by_coordinate[coordinate] = eligible + + +func _nearest_recovery_surface_distance(entry_position: Vector3) -> float: + var entry_horizontal := Vector2(entry_position.x, entry_position.z) + var nearest_distance_squared := INF + for coordinate: Vector2i in _water_recovery_triangles_by_coordinate: + for triangle: PackedVector3Array in ( + _water_recovery_triangles_by_coordinate[coordinate] + ): + var closest := _closest_horizontal_point_on_triangle( + entry_horizontal, + triangle, + ) + nearest_distance_squared = minf( + nearest_distance_squared, + entry_horizontal.distance_squared_to(closest), + ) + return sqrt(nearest_distance_squared) + + +func _nearest_safe_recovery_surface_position( + entry_position: Vector3, + maximum_distance: float, +) -> Variant: + var entry_horizontal := Vector2(entry_position.x, entry_position.z) + var maximum_distance_squared := maximum_distance * maximum_distance + var best_distance_squared := INF + var best_position: Variant = null + for coordinate: Vector2i in _water_recovery_triangles_by_coordinate: + for triangle: PackedVector3Array in ( + _water_recovery_triangles_by_coordinate[coordinate] + ): + var closest := _closest_horizontal_point_on_triangle( + entry_horizontal, + triangle, + ) + if ( + entry_horizontal.distance_squared_to(closest) + > maximum_distance_squared + ): + continue + var centroid := Vector2( + (triangle[0].x + triangle[1].x + triangle[2].x) / 3.0, + (triangle[0].z + triangle[1].z + triangle[2].z) / 3.0, + ) + var inset_distance := minf( + closest.distance_to(centroid), + WATER_RECOVERY_MAXIMUM_INSET, + ) + var inset_steps := ceili( + inset_distance / WATER_RECOVERY_INSET_STEP + ) + for inset_index: int in inset_steps + 1: + var candidate_horizontal := closest.move_toward( + centroid, + minf( + float(inset_index) * WATER_RECOVERY_INSET_STEP, + inset_distance, + ), + ) + var distance_squared := entry_horizontal.distance_squared_to( + candidate_horizontal + ) + if ( + distance_squared > maximum_distance_squared + or distance_squared >= best_distance_squared + ): + continue + var candidate := Vector3( + candidate_horizontal.x, + entry_position.y, + candidate_horizontal.y, + ) + var safe_position: Variant = _safe_recovery_surface_position( + candidate + ) + if safe_position is Vector3: + best_distance_squared = distance_squared + best_position = safe_position + return best_position + + +func _safe_recovery_surface_position(candidate: Vector3) -> Variant: + var nearby_triangles := _water_recovery_surface_triangles_near(candidate) + var surface_height := _surface_height_at(candidate, nearby_triangles) + if ( + surface_height <= WATER_HEIGHT + WATER_RECOVERY_MINIMUM_GROUND_CLEARANCE + or not _surface_supports_prop_footprint( + candidate, + surface_height, + WATER_RECOVERY_FOOTPRINT_RADIUS, + nearby_triangles, + ) + or not _has_prop_clearance( + candidate, + WATER_RECOVERY_FOOTPRINT_RADIUS, + ) + ): + return null + candidate.y = surface_height + return candidate + + +func _water_recovery_surface_triangles_near( + position: Vector3, +) -> Array[PackedVector3Array]: + var result: Array[PackedVector3Array] = [] + if _generator.catalog == null or _generator.catalog.chunk_size <= 0.0: + return result + var local_position := _generator.to_local(position) + var half_grid := Vector2( + float(_generator.grid_size.x - 1) * 0.5, + float(_generator.grid_size.y - 1) * 0.5, + ) + var coordinate := Vector2i( + roundi(local_position.x / _generator.catalog.chunk_size + half_grid.x), + roundi(local_position.z / _generator.catalog.chunk_size + half_grid.y), + ) + for offset_x: int in range(-1, 2): + for offset_y: int in range(-1, 2): + var nearby_coordinate := coordinate + Vector2i(offset_x, offset_y) + result.append_array( + _water_recovery_triangles_by_coordinate.get( + nearby_coordinate, + [], + ) + ) + return result + + +func _closest_horizontal_point_on_triangle( + point: Vector2, + triangle: PackedVector3Array, +) -> Vector2: + var polygon := PackedVector2Array([ + Vector2(triangle[0].x, triangle[0].z), + Vector2(triangle[1].x, triangle[1].z), + Vector2(triangle[2].x, triangle[2].z), + ]) + if Geometry2D.is_point_in_polygon(point, polygon): + return point + var closest := Geometry2D.get_closest_point_to_segment( + point, + polygon[0], + polygon[1], + ) + var nearest_distance_squared := point.distance_squared_to(closest) + for edge_index: int in range(1, 3): + var edge_closest := Geometry2D.get_closest_point_to_segment( + point, + polygon[edge_index], + polygon[(edge_index + 1) % 3], + ) + var distance_squared := point.distance_squared_to(edge_closest) + if distance_squared < nearest_distance_squared: + nearest_distance_squared = distance_squared + closest = edge_closest + return closest + + func _terrain_coordinate_for(mesh_instance: MeshInstance3D) -> Vector2i: var current: Node = mesh_instance while current != null and current != _generator: diff --git a/world/regions/world_region.gd b/world/regions/world_region.gd index a0730e4..792e4ed 100644 --- a/world/regions/world_region.gd +++ b/world/regions/world_region.gd @@ -72,6 +72,24 @@ func get_safe_respawn_points() -> Array[SafeRespawnPoint]: return points +func get_water_recovery_position( + entry_position: Vector3, + fallback_position: Vector3, +) -> Vector3: + if not entry_position.is_finite(): + return fallback_position + var target_position := fallback_position + var nearest_distance := INF + for point: SafeRespawnPoint in get_safe_respawn_points(): + if point == null or not is_instance_valid(point) or not point.enabled: + continue + var distance := point.get_horizontal_distance_squared(entry_position) + if distance < nearest_distance: + nearest_distance = distance + target_position = point.global_position + return target_position + + func get_diggable_areas() -> Array[DiggableArea3D]: var areas: Array[DiggableArea3D] = [] var root: Node = get_node_or_null(diggable_area_root) diff --git a/world/test_world.gd b/world/test_world.gd index d9d18dc..9f4da5e 100644 --- a/world/test_world.gd +++ b/world/test_world.gd @@ -49,6 +49,16 @@ func get_safe_respawn_points() -> Array[SafeRespawnPoint]: ) +func get_water_recovery_position(entry_position: Vector3) -> Vector3: + if _active_region == null: + return global_position + var fallback_position := get_player_spawn_transform().origin + return _active_region.get_water_recovery_position( + entry_position, + fallback_position, + ) + + func get_fishing_shop() -> FishingShopInteractionType: return _active_region.get_fishing_shop() diff --git a/world/water_recovery_controller.gd b/world/water_recovery_controller.gd index 9626881..0d0c5aa 100644 --- a/world/water_recovery_controller.gd +++ b/world/water_recovery_controller.gd @@ -25,6 +25,7 @@ var _game_ui: GameUI var _screen_fade: ScreenFade var _water_triggers: Array[PlayerWaterTrigger] = [] var _safe_points: Array[SafeRespawnPoint] = [] +var _recovery_position_resolver := Callable() var _initial_spawn_transform: Transform3D var _entry_position: Vector3 var _bob_base_position: Vector3 @@ -43,6 +44,7 @@ func setup( screen_fade: ScreenFade, water_triggers: Array[PlayerWaterTrigger], safe_points: Array[SafeRespawnPoint], + recovery_position_resolver: Callable = Callable(), ) -> void: _player = player _fishing_spot = fishing_spot @@ -50,6 +52,7 @@ func setup( _screen_fade = screen_fade _water_triggers = water_triggers _safe_points = safe_points + _recovery_position_resolver = recovery_position_resolver _initial_spawn_transform = player.global_transform for water_trigger: PlayerWaterTrigger in _water_triggers: if ( @@ -73,6 +76,7 @@ func update_world_context( initial_spawn_transform: Transform3D, water_triggers: Array[PlayerWaterTrigger], safe_points: Array[SafeRespawnPoint], + recovery_position_resolver: Callable = Callable(), ) -> void: for water_trigger: PlayerWaterTrigger in _water_triggers: if ( @@ -88,6 +92,7 @@ func update_world_context( _initial_spawn_transform = initial_spawn_transform _water_triggers = water_triggers _safe_points = safe_points + _recovery_position_resolver = recovery_position_resolver for water_trigger: PlayerWaterTrigger in _water_triggers: if ( water_trigger != null @@ -183,17 +188,7 @@ func _on_fade_transition_completed( func _respawn_player() -> void: - var target_position: Vector3 = _initial_spawn_transform.origin - var nearest_distance: float = INF - for point: SafeRespawnPoint in _safe_points: - if point == null or not is_instance_valid(point) or not point.enabled: - continue - var distance: float = point.get_horizontal_distance_squared( - _entry_position - ) - if distance < nearest_distance: - nearest_distance = distance - target_position = point.global_position + var target_position := _resolve_recovery_position() target_position.y += respawn_height_offset var respawn_transform: Transform3D = _player.global_transform respawn_transform.basis = _recovery_root_basis @@ -204,6 +199,23 @@ func _respawn_player() -> void: local_respawn_completed.emit(_entry_position) +func _resolve_recovery_position() -> Vector3: + if _recovery_position_resolver.is_valid(): + var resolved: Variant = _recovery_position_resolver.call(_entry_position) + if resolved is Vector3 and (resolved as Vector3).is_finite(): + return resolved as Vector3 + var target_position := _initial_spawn_transform.origin + var nearest_distance := INF + for point: SafeRespawnPoint in _safe_points: + if point == null or not is_instance_valid(point) or not point.enabled: + continue + var distance := point.get_horizontal_distance_squared(_entry_position) + if distance < nearest_distance: + nearest_distance = distance + target_position = point.global_position + return target_position + + func _finish_recovery() -> void: _player.restore_gameplay_orientation_after_recovery() _player.set_water_recovery_active(false) From 81decf2b719c975332f0653e94be7511a1adfbc9 Mon Sep 17 00:00:00 2001 From: Voyager Date: Sat, 29 Aug 2026 20:19:47 -0400 Subject: [PATCH 09/37] Add logbook catalog index filters --- fishing/fishing_spot.gd | 44 ++ main/main.gd | 1 + ...ontroller_menu_accessibility_validation.gd | 18 + tests/logbook_runtime_validation.gd | 39 +- tests/logbook_validation.gd | 441 ++++++++++++ ui/game_ui.gd | 4 + ui/logbook_catalog.gd | 338 +++++++++ ui/logbook_page.gd | 649 +++++++++++++++++- ui/player_menu.gd | 16 +- 9 files changed, 1540 insertions(+), 10 deletions(-) diff --git a/fishing/fishing_spot.gd b/fishing/fishing_spot.gd index 2559af5..8e3e169 100644 --- a/fishing/fishing_spot.gd +++ b/fishing/fishing_spot.gd @@ -150,6 +150,7 @@ var _network_session: NetworkSessionType var _network_fishing: NetworkFishingServiceType var _world_time: WorldTimeServiceType var _world_weather: WorldWeatherServiceType +var _fishable_water_regions_resolver := Callable() var _active_player: PlayerType var _state_time_remaining: float = 0.0 var _cast_charge: float = 0.0 @@ -222,6 +223,7 @@ func setup( network_fishing: NetworkFishingServiceType = null, world_time: WorldTimeServiceType = null, world_weather: WorldWeatherServiceType = null, + fishable_water_regions_resolver: Callable = Callable(), ) -> void: _local_player = local_player _local_inventory = local_inventory @@ -242,6 +244,7 @@ func setup( _network_fishing = network_fishing _world_time = world_time _world_weather = world_weather + _fishable_water_regions_resolver = fishable_water_regions_resolver if ( _network_session != null and not _network_session.state_changed.is_connected( @@ -1664,6 +1667,47 @@ func build_network_context( return _build_fishing_context(region) +func is_species_available_now(fish: FishDataType) -> bool: + if fish == null or not fish.is_selectable(): + return false + var season := ( + _world_time.get_season() + if _world_time != null + else CalendarSeason.UNKNOWN + ) + if not fish.is_available_in_season(season): + return false + if fish.collection_method != FishDataType.CollectionMethod.FISHING: + return true + for region: FishableWaterRegionType in _get_logbook_water_regions(): + if ( + region == null + or region.fish_pool == null + or region.fish_pool.get_fish_by_id(fish.id) == null + ): + continue + var context := _build_fishing_context(region) + if not fish.is_allowed_in_water(context.water_type): + continue + if fish.availability == null or fish.availability.is_available(context): + return true + return false + + +func _get_logbook_water_regions() -> Array[FishableWaterRegionType]: + var regions: Array[FishableWaterRegionType] = [] + if not _fishable_water_regions_resolver.is_valid(): + return regions + var resolved: Variant = _fishable_water_regions_resolver.call() + if resolved is not Array: + return regions + for value: Variant in resolved: + var region := value as FishableWaterRegionType + if region != null and is_instance_valid(region): + regions.append(region) + return regions + + func _get_active_bait_tags() -> Array[StringName]: if _local_player == null or _item_catalog == null: return [] diff --git a/main/main.gd b/main/main.gd index 7fae866..e9dc78f 100644 --- a/main/main.gd +++ b/main/main.gd @@ -920,6 +920,7 @@ func _initialize_application(dedicated: bool) -> void: _network_fishing, _world_time, _world_weather, + Callable(_test_world, "get_fishable_water_regions"), ) if dedicated: return diff --git a/tests/controller_menu_accessibility_validation.gd b/tests/controller_menu_accessibility_validation.gd index aa2f9e2..37e43d5 100644 --- a/tests/controller_menu_accessibility_validation.gd +++ b/tests/controller_menu_accessibility_validation.gd @@ -1356,6 +1356,24 @@ func _validate_player_menu_nested_controller_back() -> void: == LogbookPageType.ControllerZone.ENTRIES, "Global player-menu Back did not return Logbook to creature selection.", ) + logbook_page.call("_set_index_open", true, false) + logbook_page.set( + "_controller_zone", + LogbookPageType.ControllerZone.INDEX, + ) + _expect( + bool(menu.call("consume_escape")), + "Global player-menu Back did not consume the Logbook index zone.", + ) + _expect( + menu.visible and not bool(logbook_page.get("_index_open")), + "Global player-menu Back did not return from the Logbook index page.", + ) + _expect( + int(logbook_page.get("_controller_zone")) + == LogbookPageType.ControllerZone.TABS, + "Global player-menu Back did not return Logbook index focus to tabs.", + ) var net_page := menu.get("_the_net_page") as Control net_page.set("_active", true) diff --git a/tests/logbook_runtime_validation.gd b/tests/logbook_runtime_validation.gd index 75fc47f..47e795d 100644 --- a/tests/logbook_runtime_validation.gd +++ b/tests/logbook_runtime_validation.gd @@ -2,6 +2,7 @@ extends SceneTree const MainScene = preload("res://main/main.tscn") const FishCatchType = preload("res://fish/fish_catch.gd") +const MENU_TRANSITION_SETTLE_SECONDS := 3.0 func _initialize() -> void: @@ -36,12 +37,16 @@ func _run() -> void: var logbook := player_menu.get_node("%CatalogLogbook") as LogbookPage var backdrop := main.get_node("%PlayerMenuBackdrop") as ColorRect var hotbar := game_ui.get_node("%Hotbar") as Control + var fishing_spot := main.get("_fishing_spot") as FishingSpot + assert(logbook.get("_fishing_spot") == fishing_spot) + assert(logbook.get("_world_time") == main.get("_world_time")) + assert(logbook.get("_world_weather") == main.get("_world_weather")) var shortcut := InputEventKey.new() shortcut.pressed = true shortcut.physical_keycode = KEY_L assert(bool(player_menu.call("_handle_direct_page_shortcut", shortcut))) - await create_timer(2.2).timeout + await create_timer(MENU_TRANSITION_SETTLE_SECONDS).timeout assert(player_menu.visible) assert(logbook.visible) assert(backdrop.visible) @@ -51,6 +56,18 @@ func _run() -> void: var entry_buttons: Dictionary = logbook.get("_entry_buttons") assert(entry_buttons.size() == 108) await _capture_if_requested("-unknown") + logbook.call("_set_index_open", true, false) + await process_frame + assert(bool(logbook.get("_index_open"))) + assert((logbook.get("_index_body") as Control).visible) + await _capture_if_requested("-index") + logbook.set_compact_presentation(true) + await process_frame + await _capture_if_requested("-index-compact") + logbook.set_compact_presentation(false) + await process_frame + logbook.call("_set_index_open", false, false) + await process_frame logbook.call( "_select_category", WaterType.Type.FRESH_WATER ) @@ -68,13 +85,29 @@ func _run() -> void: logbook.call("_select_entry", &"bluegill", &"bluegill") await create_timer(0.2).timeout await _capture_if_requested("-known") + var bluegill := ( + main.get("fish_catalog") as FishPool + ).get_fish_by_id(&"bluegill") + var bluegill_available_now := fishing_spot.is_species_available_now(bluegill) + var index_options := logbook.get("_index_options") as Dictionary + index_options["availability"] = ( + LogbookCatalog.AvailabilityFilter.AVAILABLE_NOW + ) + logbook.notify_availability_context_changed() + await process_frame + assert( + (logbook.get("_entry_buttons") as Dictionary).has(&"bluegill") + == bluegill_available_now + ) + logbook.call("_reset_index") + await process_frame assert(bool(player_menu.call("_handle_direct_page_shortcut", shortcut))) - await create_timer(2.2).timeout + await create_timer(MENU_TRANSITION_SETTLE_SECONDS).timeout assert(not player_menu.visible) assert(bool(player_menu.call("_handle_direct_page_shortcut", shortcut))) - await create_timer(2.2).timeout + await create_timer(MENU_TRANSITION_SETTLE_SECONDS).timeout player_menu.call( "_show_section_immediate", PlayerMenu.Section.PROFILE ) diff --git a/tests/logbook_validation.gd b/tests/logbook_validation.gd index 4810e0a..431ed2e 100644 --- a/tests/logbook_validation.gd +++ b/tests/logbook_validation.gd @@ -17,6 +17,8 @@ const CatalogResource: FishPoolType = preload( "res://fish/pools/fish_catalog.tres" ) +var _query_available_id: StringName + func _initialize() -> void: call_deferred("_run") @@ -35,6 +37,7 @@ func _run() -> void: quit() return _validate_catalog() + _validate_catalog_query() await _validate_page() print("Logbook validation: PASS") quit() @@ -68,6 +71,348 @@ func _validate_catalog() -> void: ) +func _validate_catalog_query() -> void: + var collection := CollectionLogType.new() + var inventory := FishInventoryType.new() + var fresh_species: Array[FishDataType] = [] + for fish: FishDataType in LogbookCatalog.ordered_species( + CatalogResource.candidates + ): + if LogbookCatalog.category_for(fish) == LogbookCatalog.Category.FRESH_WATER: + fresh_species.append(fish) + assert(fresh_species.size() == 108) + var first := fresh_species[0] + var second := fresh_species[1] + var unknown := fresh_species[2] + for quality: int in FishQualityType.TIER_COUNT: + collection.record_catch(first.id, quality) + collection.record_catch(second.id, FishQualityType.Tier.BORING) + var held := _make_test_catch(first, true) + assert(inventory.add_catch(held)) + + var options := _default_query_options() + options["show"] = LogbookCatalog.DiscoveryFilter.CAUGHT + var filtered := LogbookCatalog.filtered_species( + CatalogResource.candidates, + LogbookCatalog.Category.FRESH_WATER, + collection, + inventory, + options, + ) + assert(filtered.size() == 2) + assert(first in filtered and second in filtered) + + options["show"] = LogbookCatalog.DiscoveryFilter.MISSING + filtered = LogbookCatalog.filtered_species( + CatalogResource.candidates, + LogbookCatalog.Category.FRESH_WATER, + collection, + inventory, + options, + ) + assert(filtered.size() == fresh_species.size() - 2) + options["sort"] = LogbookCatalog.SortMode.CATALOG_NUMBER + options["descending"] = true + filtered = LogbookCatalog.filtered_species( + CatalogResource.candidates, + LogbookCatalog.Category.FRESH_WATER, + collection, + inventory, + options, + ) + assert(filtered.front() == fresh_species.back()) + assert(filtered.back() == unknown) + + options["show"] = LogbookCatalog.DiscoveryFilter.INCOMPLETE + options["descending"] = false + filtered = LogbookCatalog.filtered_species( + CatalogResource.candidates, + LogbookCatalog.Category.FRESH_WATER, + collection, + inventory, + options, + ) + assert(filtered == [second]) + + options = _default_query_options() + options["show"] = LogbookCatalog.DiscoveryFilter.CAUGHT + options["sort"] = LogbookCatalog.SortMode.CATCH_COUNT + options["descending"] = true + filtered = LogbookCatalog.filtered_species( + CatalogResource.candidates, + LogbookCatalog.Category.FRESH_WATER, + collection, + inventory, + options, + ) + assert(filtered == [first, second]) + + options = _default_query_options() + options["search"] = unknown.display_name + filtered = LogbookCatalog.filtered_species( + CatalogResource.candidates, + LogbookCatalog.Category.FRESH_WATER, + collection, + inventory, + options, + ) + assert(filtered.is_empty()) + options["search"] = str(unknown.catalog_number) + filtered = LogbookCatalog.filtered_species( + CatalogResource.candidates, + LogbookCatalog.Category.FRESH_WATER, + collection, + inventory, + options, + ) + assert(filtered == [unknown]) + + options = _default_query_options() + options["holding"] = LogbookCatalog.HoldingFilter.FAVORITED + filtered = LogbookCatalog.filtered_species( + CatalogResource.candidates, + LogbookCatalog.Category.FRESH_WATER, + collection, + inventory, + options, + ) + assert(filtered == [first]) + options["holding"] = LogbookCatalog.HoldingFilter.IN_COOLER + filtered = LogbookCatalog.filtered_species( + CatalogResource.candidates, + LogbookCatalog.Category.FRESH_WATER, + collection, + inventory, + options, + ) + assert(filtered == [first]) + + options = _default_query_options() + options["show"] = LogbookCatalog.DiscoveryFilter.CAUGHT + options["group"] = String(first.collection_group) + filtered = LogbookCatalog.filtered_species( + CatalogResource.candidates, + LogbookCatalog.Category.FRESH_WATER, + collection, + inventory, + options, + ) + assert(first in filtered) + for fish: FishDataType in filtered: + assert(fish.collection_group == first.collection_group) + + options = _default_query_options() + options["show"] = LogbookCatalog.DiscoveryFilter.CAUGHT + options["rarity"] = ( + int(first.rarity) + LogbookCatalog.RarityFilter.COMMON + ) + filtered = LogbookCatalog.filtered_species( + CatalogResource.candidates, + LogbookCatalog.Category.FRESH_WATER, + collection, + inventory, + options, + ) + assert(first in filtered) + for fish: FishDataType in filtered: + assert(fish.rarity == first.rarity) + + options = _default_query_options() + options["show"] = LogbookCatalog.DiscoveryFilter.CAUGHT + options["method"] = ( + int(first.collection_method) + LogbookCatalog.MethodFilter.FISHING + ) + filtered = LogbookCatalog.filtered_species( + CatalogResource.candidates, + LogbookCatalog.Category.FRESH_WATER, + collection, + inventory, + options, + ) + assert(first in filtered) + for fish: FishDataType in filtered: + assert(fish.collection_method == first.collection_method) + + var first_season := -1 + for season: int in 4: + if first.is_available_in_season(season): + first_season = season + break + assert(first_season >= 0) + options = _default_query_options() + options["show"] = LogbookCatalog.DiscoveryFilter.CAUGHT + options["season"] = ( + first_season + LogbookCatalog.SeasonFilter.SPRING + ) + filtered = LogbookCatalog.filtered_species( + CatalogResource.candidates, + LogbookCatalog.Category.FRESH_WATER, + collection, + inventory, + options, + ) + assert(first in filtered) + for fish: FishDataType in filtered: + assert(fish.is_available_in_season(first_season)) + + var first_is_available_by_day := ( + first.availability == null or first.availability.allow_day + ) + options = _default_query_options() + options["show"] = LogbookCatalog.DiscoveryFilter.CAUGHT + options["time"] = ( + LogbookCatalog.TimeFilter.DAY + if first_is_available_by_day + else LogbookCatalog.TimeFilter.NIGHT + ) + filtered = LogbookCatalog.filtered_species( + CatalogResource.candidates, + LogbookCatalog.Category.FRESH_WATER, + collection, + inventory, + options, + ) + assert(first in filtered) + + options = _default_query_options() + options["show"] = LogbookCatalog.DiscoveryFilter.CAUGHT + options["sort"] = LogbookCatalog.SortMode.QUALITY_PROGRESS + options["descending"] = true + filtered = LogbookCatalog.filtered_species( + CatalogResource.candidates, + LogbookCatalog.Category.FRESH_WATER, + collection, + inventory, + options, + ) + assert(filtered == [first, second]) + for sort_mode: LogbookCatalog.SortMode in [ + LogbookCatalog.SortMode.NAME, + LogbookCatalog.SortMode.RARITY, + LogbookCatalog.SortMode.VALUE, + LogbookCatalog.SortMode.WEIGHT, + ]: + options = _default_query_options() + options["sort"] = sort_mode + filtered = LogbookCatalog.filtered_species( + CatalogResource.candidates, + LogbookCatalog.Category.FRESH_WATER, + collection, + inventory, + options, + ) + assert(filtered[0] in [first, second]) + assert(filtered[1] in [first, second]) + assert(filtered[0] != filtered[1]) + assert(filtered[2] == unknown) + + _query_available_id = second.id + options = _default_query_options() + options["availability"] = ( + LogbookCatalog.AvailabilityFilter.AVAILABLE_NOW + ) + filtered = LogbookCatalog.filtered_species( + CatalogResource.candidates, + LogbookCatalog.Category.FRESH_WATER, + collection, + inventory, + options, + Callable(self, "_query_species_available_now"), + ) + assert(filtered == [second]) + + _query_available_id = unknown.id + options["show"] = LogbookCatalog.DiscoveryFilter.MISSING + options["rarity"] = ( + int(unknown.rarity) + LogbookCatalog.RarityFilter.COMMON + ) + filtered = LogbookCatalog.filtered_species( + CatalogResource.candidates, + LogbookCatalog.Category.FRESH_WATER, + collection, + inventory, + options, + Callable(self, "_query_species_available_now"), + ) + assert(filtered == [unknown]) + + options = _default_query_options() + options["show"] = LogbookCatalog.DiscoveryFilter.MISSING + options["group"] = String(unknown.collection_group) + filtered = LogbookCatalog.filtered_species( + CatalogResource.candidates, + LogbookCatalog.Category.FRESH_WATER, + collection, + inventory, + options, + ) + assert(unknown in filtered) + assert( + String(unknown.collection_group) + in LogbookCatalog.available_groups( + CatalogResource.candidates, + LogbookCatalog.Category.FRESH_WATER, + collection, + ) + ) + + var unknown_is_available_by_day := ( + unknown.availability == null or unknown.availability.allow_day + ) + options = _default_query_options() + options["show"] = LogbookCatalog.DiscoveryFilter.MISSING + options["time"] = ( + LogbookCatalog.TimeFilter.DAY + if unknown_is_available_by_day + else LogbookCatalog.TimeFilter.NIGHT + ) + filtered = LogbookCatalog.filtered_species( + CatalogResource.candidates, + LogbookCatalog.Category.FRESH_WATER, + collection, + inventory, + options, + ) + assert(unknown in filtered) + inventory.free() + collection.free() + + +func _default_query_options() -> Dictionary: + return { + "search": "", + "show": LogbookCatalog.DiscoveryFilter.ALL, + "sort": LogbookCatalog.SortMode.CATALOG_NUMBER, + "descending": false, + "availability": LogbookCatalog.AvailabilityFilter.ANY, + "season": LogbookCatalog.SeasonFilter.ANY, + "time": LogbookCatalog.TimeFilter.ANY, + "rarity": LogbookCatalog.RarityFilter.ANY, + "method": LogbookCatalog.MethodFilter.ANY, + "holding": LogbookCatalog.HoldingFilter.ANY, + "group": "", + } + + +func _make_test_catch(fish: FishDataType, favorited: bool) -> FishCatchType: + var fish_catch := FishCatchType.new() + fish_catch.fish = fish + fish_catch.fish_id = fish.id + fish_catch.weight_lb = fish.get_minimum_weight() + fish_catch.display_scale = fish.get_display_scale_for_weight( + fish_catch.weight_lb + ) + fish_catch.quality = FishQualityType.Tier.BORING + fish_catch.sale_value = fish.get_sale_value_for_weight(fish_catch.weight_lb) + fish_catch.is_favorited = favorited + fish_catch.ensure_identity() + return fish_catch + + +func _query_species_available_now(fish: FishDataType) -> bool: + return fish != null and fish.id == _query_available_id + + func _validate_page() -> void: var collection := CollectionLogType.new() var inventory := FishInventoryType.new() @@ -91,6 +436,10 @@ func _validate_page() -> void: assert(outer_margin.get_theme_constant("margin_right") == 160) assert(outer_margin.get_theme_constant("margin_bottom") == 106) assert(is_equal_approx(book.offset_top, 65.0)) + page.call("_set_index_open", true, false) + await process_frame + _validate_index_content_bounds(page) + page.call("_set_index_open", false, false) page.set_compact_presentation(false) await process_frame assert(outer_margin.get_theme_constant("margin_left") == 52) @@ -158,6 +507,39 @@ func _validate_page() -> void: ) var initial_detail_body := page.get("_detail_body") as VBoxContainer assert(not initial_detail_body.get_parent() is ScrollContainer) + var index_tab := page.get("_index_tab") as Button + var index_body := page.get("_index_body") as VBoxContainer + assert(index_tab != null and index_body != null) + assert(index_tab.size == LogbookPage.INDEX_TAB_SIZE) + assert( + not index_tab.get_global_rect().intersects( + (category_tabs.back() as Button).get_global_rect() + ) + ) + page.call("_set_index_open", true, false) + await process_frame + assert(index_body.visible) + assert(not initial_detail_body.visible) + assert((page.get("_index_option_buttons") as Dictionary).size() == 10) + _validate_index_content_bounds(page) + page.call( + "_cycle_index_option", + &"show", + 1, + ) + await process_frame + assert((page.get("_entry_buttons") as Dictionary).is_empty()) + assert( + (page.get("_empty_state") as Label).text + == "No entries match this index." + ) + page.call("_reset_index") + await process_frame + assert((page.get("_entry_buttons") as Dictionary).size() == 108) + page.call("_set_index_open", false, false) + await process_frame + assert(not index_body.visible) + assert(initial_detail_body.visible) assert( page.call("_entry_label_text", "flathead catfish") == "flathead\ncatfish" @@ -458,8 +840,19 @@ func _validate_page() -> void: (page.get("_portrait_overlay_backdrop") as Button).pressed.emit() await process_frame + var live_index_options := page.get("_index_options") as Dictionary + live_index_options["holding"] = LogbookCatalog.HoldingFilter.IN_COOLER + page.call("_refresh_catalog") + await process_frame + assert( + (page.get("_entry_buttons") as Dictionary).keys() + == [&"bluegill"] + ) inventory.remove_catch_by_id(fish_catch.catch_id) await process_frame + assert((page.get("_entry_buttons") as Dictionary).is_empty()) + page.call("_reset_index") + await process_frame assert(not _detail_text(page).contains("number owned")) page.queue_free() collection.queue_free() @@ -474,6 +867,54 @@ func _detail_text(page: LogbookPage) -> String: return "\n".join(values) +func _validate_index_content_bounds(page: LogbookPage) -> void: + var body := page.get("_index_body") as VBoxContainer + assert(body != null and body.visible) + var right_page := body.get_parent() as Control + assert(right_page != null) + var page_rect := right_page.get_global_rect() + var body_rect := body.get_global_rect() + var protected_rect := Rect2( + page_rect.position + Vector2( + LogbookPage.INDEX_CONTENT_LEFT_INSET, + LogbookPage.INDEX_CONTENT_TOP_INSET, + ), + page_rect.size - Vector2( + LogbookPage.INDEX_CONTENT_LEFT_INSET + + LogbookPage.INDEX_CONTENT_RIGHT_INSET, + LogbookPage.INDEX_CONTENT_TOP_INSET + + LogbookPage.INDEX_CONTENT_BOTTOM_INSET, + ), + ) + assert( + body_rect.position.x + >= page_rect.position.x + LogbookPage.INDEX_CONTENT_LEFT_INSET - 1.0 + ) + assert( + body_rect.end.x + <= page_rect.end.x - LogbookPage.INDEX_CONTENT_RIGHT_INSET + 1.0 + ) + assert( + body_rect.position.y >= page_rect.position.y, + "Index starts above the authored page: body=%s page=%s" + % [body_rect, page_rect], + ) + assert( + body_rect.end.y <= page_rect.end.y, + "Index extends below the authored page: body=%s page=%s" + % [body_rect, page_rect], + ) + var controls: Array = page.get("_index_controls") as Array + for value: Variant in controls: + var control := value as Control + if control != null and control.visible: + assert( + protected_rect.grow(2.0).encloses(control.get_global_rect()), + "Index control crossed the authored right-page boundary: %s" + % control.name, + ) + + func _descendant_label_text(parent: Node) -> String: var values: PackedStringArray = [] for node: Node in parent.find_children("*", "Label", true, false): diff --git a/ui/game_ui.gd b/ui/game_ui.gd index 7f8f0a6..3ce0d17 100644 --- a/ui/game_ui.gd +++ b/ui/game_ui.gd @@ -260,6 +260,9 @@ func _ready() -> void: _player_menu.controller_hotbar_management_ended.connect( _on_controller_hotbar_management_ended ) + _player_menu.controller_text_entry_requested.connect( + request_controller_text_entry_for + ) _title_settings_panel.panel_visibility_changed.connect( _on_settings_visibility_changed ) @@ -459,6 +462,7 @@ func setup( discovery, player_jobs, world_time, + world_weather, world_environment, world_sun, ) diff --git a/ui/logbook_catalog.gd b/ui/logbook_catalog.gd index d5dc639..ac7a910 100644 --- a/ui/logbook_catalog.gd +++ b/ui/logbook_catalog.gd @@ -2,6 +2,9 @@ class_name LogbookCatalog extends RefCounted const FishDataType = preload("res://fish/fish_data.gd") +const FishInventoryType = preload("res://inventory/fish_inventory.gd") +const CollectionLogType = preload("res://collection/collection_log.gd") +const CalendarSeasonType = preload("res://world/calendar_season.gd") enum Category { FRESH_WATER, @@ -10,6 +13,66 @@ enum Category { SHELLFISH, } +enum DiscoveryFilter { + ALL, + CAUGHT, + MISSING, + INCOMPLETE, +} + +enum SortMode { + CATALOG_NUMBER, + NAME, + RARITY, + CATCH_COUNT, + QUALITY_PROGRESS, + VALUE, + WEIGHT, +} + +enum AvailabilityFilter { + ANY, + AVAILABLE_NOW, +} + +enum SeasonFilter { + ANY, + CURRENT, + SPRING, + SUMMER, + FALL, + WINTER, +} + +enum TimeFilter { + ANY, + CURRENT, + DAY, + NIGHT, +} + +enum RarityFilter { + ANY, + COMMON, + UNCOMMON, + RARE, + EPIC, + LEGENDARY, +} + +enum MethodFilter { + ANY, + FISHING, + NET, + DIGGING, +} + +enum HoldingFilter { + ANY, + IN_COOLER, + FAVORITED, +} + static func category_for(fish: FishDataType) -> Category: if fish == null: @@ -73,3 +136,278 @@ static func ordered_species( return a.catalog_number < b.catalog_number ) return ordered + + +static func filtered_species( + candidates: Array[FishDataType], + category: Category, + collection_log: CollectionLogType, + inventory: FishInventoryType, + options: Dictionary, + available_now_resolver: Callable = Callable(), + current_season: int = CalendarSeasonType.UNKNOWN, + current_is_night: bool = false, +) -> Array[FishDataType]: + var filtered: Array[FishDataType] = [] + for fish: FishDataType in ordered_species(candidates): + if category_for(fish) != category: + continue + if not _matches_filters( + fish, + collection_log, + inventory, + options, + available_now_resolver, + current_season, + current_is_night, + ): + continue + filtered.append(fish) + var sort_mode := int(options.get("sort", SortMode.CATALOG_NUMBER)) + var descending := bool(options.get("descending", false)) + filtered.sort_custom( + func(first: FishDataType, second: FishDataType) -> bool: + return _species_less_than( + first, + second, + collection_log, + sort_mode, + descending, + ) + ) + return filtered + + +static func available_groups( + candidates: Array[FishDataType], + category: Category, + _collection_log: CollectionLogType, +) -> Array[String]: + var groups: Array[String] = [] + for fish: FishDataType in ordered_species(candidates): + if category_for(fish) != category: + continue + var group := _group_label(fish) + if not group.is_empty() and group not in groups: + groups.append(group) + groups.sort_custom( + func(first: String, second: String) -> bool: + return first.naturalnocasecmp_to(second) < 0 + ) + return groups + + +static func quality_progress( + collection_log: CollectionLogType, + fish_id: StringName, +) -> int: + if collection_log == null: + return 0 + var mask: int = collection_log.get_quality_mask(fish_id) + var count: int = 0 + while mask > 0: + count += mask & 1 + mask >>= 1 + return count + + +static func _matches_filters( + fish: FishDataType, + collection_log: CollectionLogType, + inventory: FishInventoryType, + options: Dictionary, + available_now_resolver: Callable, + current_season: int, + current_is_night: bool, +) -> bool: + var discovered := ( + collection_log != null and collection_log.has_discovered(fish.id) + ) + match int(options.get("show", DiscoveryFilter.ALL)): + DiscoveryFilter.CAUGHT: + if not discovered: + return false + DiscoveryFilter.MISSING: + if discovered: + return false + DiscoveryFilter.INCOMPLETE: + if ( + not discovered + or collection_log.has_mastered(fish.id) + ): + return false + + var search_text := str(options.get("search", "")).strip_edges().to_lower() + if not search_text.is_empty(): + var number_text := str(catalog_number(fish)) + var number_query := search_text.trim_prefix("#") + var number_matches := ( + number_query.is_valid_int() + and number_text == number_query + ) + var identity_matches := false + if discovered: + identity_matches = " ".join([ + fish.display_name, + _group_label(fish), + fish.get_habitat_label(), + ]).to_lower().contains(search_text) + if not number_matches and not identity_matches: + return false + + if ( + int(options.get("availability", AvailabilityFilter.ANY)) + == AvailabilityFilter.AVAILABLE_NOW + ): + if available_now_resolver.is_valid(): + var resolved: Variant = available_now_resolver.call(fish) + if typeof(resolved) != TYPE_BOOL or not bool(resolved): + return false + elif not _matches_season(fish, current_season): + return false + + var season_filter := int(options.get("season", SeasonFilter.ANY)) + if season_filter != SeasonFilter.ANY: + var requested_season := current_season + if season_filter >= SeasonFilter.SPRING: + requested_season = season_filter - SeasonFilter.SPRING + if not _matches_season(fish, requested_season): + return false + + var time_filter := int(options.get("time", TimeFilter.ANY)) + if time_filter != TimeFilter.ANY: + var requested_night := current_is_night + if time_filter == TimeFilter.DAY: + requested_night = false + elif time_filter == TimeFilter.NIGHT: + requested_night = true + if not _matches_time(fish, requested_night): + return false + + var rarity_filter := int(options.get("rarity", RarityFilter.ANY)) + if ( + rarity_filter != RarityFilter.ANY + and fish.rarity != rarity_filter - RarityFilter.COMMON + ): + return false + + var method_filter := int(options.get("method", MethodFilter.ANY)) + if ( + method_filter != MethodFilter.ANY + and fish.collection_method != method_filter - MethodFilter.FISHING + ): + return false + + var holding_filter := int(options.get("holding", HoldingFilter.ANY)) + if holding_filter != HoldingFilter.ANY: + var favorites_only := holding_filter == HoldingFilter.FAVORITED + if not _has_current_catch(inventory, fish.id, favorites_only): + return false + + var requested_group := str(options.get("group", "")) + if ( + not requested_group.is_empty() + and _group_label(fish).nocasecmp_to(requested_group) != 0 + ): + return false + return true + + +static func _species_less_than( + first: FishDataType, + second: FishDataType, + collection_log: CollectionLogType, + sort_mode: int, + descending: bool, +) -> bool: + var first_discovered := ( + collection_log != null and collection_log.has_discovered(first.id) + ) + var second_discovered := ( + collection_log != null and collection_log.has_discovered(second.id) + ) + if sort_mode != SortMode.CATALOG_NUMBER: + if first_discovered != second_discovered: + return first_discovered + if not first_discovered and not second_discovered: + return _catalog_less_than(first, second) + + var comparison: int = 0 + match sort_mode: + SortMode.NAME: + comparison = first.display_name.naturalnocasecmp_to( + second.display_name + ) + SortMode.RARITY: + comparison = first.rarity - second.rarity + SortMode.CATCH_COUNT: + comparison = ( + collection_log.get_catch_count(first.id) + - collection_log.get_catch_count(second.id) + ) + SortMode.QUALITY_PROGRESS: + comparison = ( + quality_progress(collection_log, first.id) + - quality_progress(collection_log, second.id) + ) + SortMode.VALUE: + comparison = first.sell_value_max - second.sell_value_max + SortMode.WEIGHT: + comparison = _compare_floats( + first.get_maximum_weight(), + second.get_maximum_weight(), + ) + _: + comparison = first.catalog_number - second.catalog_number + if comparison != 0: + return comparison > 0 if descending else comparison < 0 + return _catalog_less_than(first, second) + + +static func _catalog_less_than(first: FishDataType, second: FishDataType) -> bool: + if first.catalog_number == second.catalog_number: + return String(first.id) < String(second.id) + return first.catalog_number < second.catalog_number + + +static func _compare_floats(first: float, second: float) -> int: + if is_equal_approx(first, second): + return 0 + return -1 if first < second else 1 + + +static func _matches_season(fish: FishDataType, season: int) -> bool: + return fish.is_available_in_season(season) + + +static func _matches_time(fish: FishDataType, requested_night: bool) -> bool: + if ( + fish.collection_method != FishDataType.CollectionMethod.FISHING + or fish.availability == null + ): + return true + return ( + fish.availability.allow_night + if requested_night + else fish.availability.allow_day + ) + + +static func _has_current_catch( + inventory: FishInventoryType, + fish_id: StringName, + favorites_only: bool, +) -> bool: + if inventory == null: + return false + for fish_catch in inventory.get_catches_by_fish_id(fish_id): + if fish_catch != null and (not favorites_only or fish_catch.is_favorited): + return true + return false + + +static func _group_label(fish: FishDataType) -> String: + if fish == null: + return "" + var group := String(fish.collection_group).strip_edges() + return group if not group.is_empty() else fish.get_habitat_label() diff --git a/ui/logbook_page.gd b/ui/logbook_page.gd index 6319dd6..cc490a0 100644 --- a/ui/logbook_page.gd +++ b/ui/logbook_page.gd @@ -6,10 +6,21 @@ const FishDataType = preload("res://fish/fish_data.gd") const FishQualityType = preload("res://fish/fish_quality.gd") const FishInventoryType = preload("res://inventory/fish_inventory.gd") const FishPoolType = preload("res://fish/fish_pool.gd") +const FishingSpotType = preload("res://fishing/fishing_spot.gd") +const WorldTimeServiceType = preload("res://world/world_time_service.gd") +const WorldWeatherServiceType = preload( + "res://world/world_weather_service.gd" +) const SILHOUETTE_SHADER: Shader = preload( "res://ui/logbook_silhouette.gdshader" ) const OrganizerTabType = preload("res://ui/components/organizer_tab.gd") +const ControllerFocusNavigationType = preload( + "res://ui/controller_focus_navigation.gd" +) +const NOTEPAD_INK_ACTION_SCENE: PackedScene = preload( + "res://ui/components/bubble_menu/notepad_ink_action.tscn" +) const InventoryNotepadType = preload( "res://ui/components/inventory_notepad.gd" ) @@ -48,6 +59,8 @@ const LOGBOOK_TAB_LEFT_INSET: float = 92.0 const LOGBOOK_TAB_SIZE := Vector2(108.0, 38.0) const LOGBOOK_TAB_SEPARATION: float = 6.0 const LOGBOOK_TAB_TEXT_SIDE_INSET: float = 10.0 +const INDEX_TAB_SIZE := Vector2(88.0, 38.0) +const INDEX_TAB_RIGHT_INSET: float = 72.0 const PAGE_CONTENT_SCALE: float = 0.97 const WIDE_OUTER_MARGINS := Rect2(52.0, 85.0, 52.0, 18.0) const COMPACT_OUTER_MARGINS := Rect2(160.0, 85.0, 160.0, 106.0) @@ -61,17 +74,53 @@ const DETAIL_SECTION_SEPARATION: int = 10 const DETAIL_QUALITY_SECTION_SIZE := Vector2(300.0, 104.0) const DETAIL_STATS_SECTION_SIZE := Vector2(400.0, 160.0) const DETAIL_STATS_ROW_SEPARATION: int = 8 +const INDEX_OPTION_HEIGHT: float = 34.0 +const INDEX_CONTENT_LEFT_INSET: float = 44.0 +const INDEX_CONTENT_TOP_INSET: float = 4.0 +const INDEX_CONTENT_RIGHT_INSET: float = 22.0 +const INDEX_CONTENT_BOTTOM_INSET: float = 10.0 +const INDEX_SHOW_LABELS := [ + "all entries", "caught", "missing", "needs quality", +] +const INDEX_SORT_LABELS := [ + "catalog no.", "name", "rarity", "number caught", + "quality progress", "value", "weight", +] +const INDEX_AVAILABILITY_LABELS := [ + "any time", "available now", +] +const INDEX_SEASON_LABELS := [ + "any season", "current season", "spring", "summer", "fall", "winter", +] +const INDEX_TIME_LABELS := [ + "any time", "current time", "day", "night", +] +const INDEX_RARITY_LABELS := [ + "any rarity", "common", "uncommon", "rare", "epic", "legendary", +] +const INDEX_METHOD_LABELS := [ + "any method", "fishing", "netting", "digging", +] +const INDEX_HOLDING_LABELS := [ + "any ownership", "in cooler", "favorited", +] + +signal controller_text_entry_requested(control: Control) enum ControllerZone { TABS, ENTRIES, DETAILS, + INDEX, OVERLAY, } var _collection_log: CollectionLogType var _inventory: FishInventoryType var _catalog: FishPoolType +var _fishing_spot: FishingSpotType +var _world_time: WorldTimeServiceType +var _world_weather: WorldWeatherServiceType var _category: LogbookCatalog.Category = ( LogbookCatalog.Category.FRESH_WATER ) @@ -111,6 +160,31 @@ var _portrait_overlay_stats_view: Control var _portrait_overlay_stats: GridContainer var _overlay_return_focus: Control var _controller_zone: ControllerZone = ControllerZone.TABS +var _index_tab: OrganizerTabType +var _index_body: VBoxContainer +var _index_search: LineEdit +var _index_summary: Label +var _index_note: Label +var _index_reset: Button +var _index_option_buttons: Dictionary[StringName, Button] = {} +var _index_controls: Array[Control] = [] +var _index_open: bool = false +var _index_update_in_progress: bool = false +var _index_visible_count: int = 0 +var _index_category_total: int = 0 +var _index_options: Dictionary = { + "search": "", + "show": LogbookCatalog.DiscoveryFilter.ALL, + "sort": LogbookCatalog.SortMode.CATALOG_NUMBER, + "descending": false, + "availability": LogbookCatalog.AvailabilityFilter.ANY, + "season": LogbookCatalog.SeasonFilter.ANY, + "time": LogbookCatalog.TimeFilter.ANY, + "rarity": LogbookCatalog.RarityFilter.ANY, + "method": LogbookCatalog.MethodFilter.ANY, + "holding": LogbookCatalog.HoldingFilter.ANY, + "group": "", +} func _ready() -> void: @@ -124,10 +198,16 @@ func setup( collection_log: CollectionLogType, inventory: FishInventoryType, catalog: FishPoolType, + fishing_spot: FishingSpotType = null, + world_time: WorldTimeServiceType = null, + world_weather: WorldWeatherServiceType = null, ) -> void: _collection_log = collection_log _inventory = inventory _catalog = catalog + _fishing_spot = fishing_spot + _world_time = world_time + _world_weather = world_weather if not _collection_log.fish_discovered.is_connected( _on_fish_discovered ): @@ -138,12 +218,28 @@ func setup( _collection_log.collection_changed.connect(_on_collection_changed) if not _inventory.catches_changed.is_connected(_on_inventory_changed): _inventory.catches_changed.connect(_on_inventory_changed) + if ( + _world_time != null + and not _world_time.time_changed.is_connected( + _on_logbook_context_changed + ) + ): + _world_time.time_changed.connect(_on_logbook_context_changed) + _world_time.calendar_date_changed.connect(_on_logbook_context_changed) + if ( + _world_weather != null + and not _world_weather.weather_changed.is_connected( + _on_logbook_context_changed + ) + ): + _world_weather.weather_changed.connect(_on_logbook_context_changed) _refresh_catalog() func set_compact_presentation(compact: bool) -> void: _compact_presentation = compact _apply_presentation_margins() + _apply_index_presentation() func activate() -> void: @@ -180,6 +276,17 @@ func set_interactive(value: bool) -> void: if _interactive and not tab.button_pressed else Control.MOUSE_FILTER_IGNORE ) + if _index_tab != null: + _index_tab.focus_mode = ( + Control.FOCUS_ALL + if _interactive and _controller_zone == ControllerZone.TABS + else Control.FOCUS_NONE + ) + _index_tab.mouse_filter = ( + Control.MOUSE_FILTER_STOP + if _interactive + else Control.MOUSE_FILTER_IGNORE + ) for entry: Button in _entry_buttons.values(): entry.focus_mode = ( Control.FOCUS_ALL @@ -199,6 +306,19 @@ func set_interactive(value: bool) -> void: if _interactive and _controller_zone == ControllerZone.DETAILS else Control.FOCUS_NONE ) + for index_control: Control in _index_controls: + if not is_instance_valid(index_control): + continue + index_control.focus_mode = ( + Control.FOCUS_ALL + if _interactive and _controller_zone == ControllerZone.INDEX + else Control.FOCUS_NONE + ) + index_control.mouse_filter = ( + Control.MOUSE_FILTER_STOP + if _interactive and _index_open + else Control.MOUSE_FILTER_IGNORE + ) if _portrait_overlay_backdrop != null: _portrait_overlay_backdrop.focus_mode = ( Control.FOCUS_ALL @@ -214,6 +334,9 @@ func focus_initial() -> void: _portrait_overlay_backdrop.grab_focus() return if _controller_zone == ControllerZone.TABS: + if _index_open and _index_tab != null: + _index_tab.grab_focus() + return var category_tab_index: int = _category_tab_categories.find(_category) if category_tab_index >= 0: _category_tabs[category_tab_index].grab_focus() @@ -222,6 +345,10 @@ func focus_initial() -> void: if not _detail_buttons.is_empty(): _detail_buttons.front().grab_focus() return + if _controller_zone == ControllerZone.INDEX: + if _index_search != null: + _index_search.grab_focus() + return var selected := _entry_buttons.get(_selected_entry_key) as Button if selected != null: selected.grab_focus() @@ -247,6 +374,8 @@ func handle_controller_input(event: InputEvent) -> bool: _hide_portrait_overlay() ControllerZone.DETAILS: _set_controller_zone(ControllerZone.ENTRIES) + ControllerZone.INDEX: + _set_index_open(false) ControllerZone.ENTRIES: _set_controller_zone(ControllerZone.TABS) ControllerZone.TABS: @@ -254,15 +383,43 @@ func handle_controller_input(event: InputEvent) -> bool: return true if _controller_zone == ControllerZone.TABS: if event.is_action_pressed("ui_left"): + if _index_open: + _set_index_open(false, false) + _category_tabs.back().grab_focus() + return true _select_adjacent_controller_category(-1) return true if event.is_action_pressed("ui_right"): + if ( + _category_tab_categories.find(_category) + == _category_tab_categories.size() - 1 + ): + _set_index_open(true, false) + _index_tab.grab_focus() + return true _select_adjacent_controller_category(1) return true if accept_pressed: - if not _entry_buttons.is_empty(): + if _index_open: + _set_controller_zone(ControllerZone.INDEX) + elif not _entry_buttons.is_empty(): _set_controller_zone(ControllerZone.ENTRIES) return true + if _controller_zone == ControllerZone.INDEX: + var focus_owner := get_viewport().gui_get_focus_owner() + if accept_pressed and focus_owner == _index_search: + controller_text_entry_requested.emit(_index_search) + return true + if event.is_action_pressed("ui_left"): + var previous_key := _index_key_for_control(focus_owner) + if not previous_key.is_empty(): + _cycle_index_option(previous_key, -1) + return true + if event.is_action_pressed("ui_right") or accept_pressed: + var next_key := _index_key_for_control(focus_owner) + if not next_key.is_empty(): + _cycle_index_option(next_key, 1) + return true if _controller_zone == ControllerZone.ENTRIES and accept_pressed: if not _selected_entry_key.is_empty() and not _detail_buttons.is_empty(): _set_controller_zone(ControllerZone.DETAILS) @@ -329,6 +486,20 @@ func _build_interface() -> void: tabs.add_child(tab) _category_tabs.append(tab) _category_tab_categories.append(category) + _index_tab = OrganizerTabType.new() + _index_tab.name = "CatalogIndexTab" + _index_tab.anchor_left = 1.0 + _index_tab.anchor_right = 1.0 + _index_tab.offset_left = -INDEX_TAB_RIGHT_INSET - INDEX_TAB_SIZE.x + _index_tab.offset_top = 37.0 + _index_tab.offset_right = -INDEX_TAB_RIGHT_INSET + _index_tab.offset_bottom = 37.0 + INDEX_TAB_SIZE.y + _index_tab.text = "index" + _index_tab.palette_index = 0 + _index_tab.tooltip_text = "Open catalog index" + _index_tab.accessibility_name = "Catalog index" + _index_tab.pressed.connect(_toggle_index_page) + stack.add_child(_index_tab) _configure_category_focus() var book := Control.new() @@ -418,9 +589,176 @@ func _build_interface() -> void: right_page.add_child(_detail_body) _apply_page_content_scale(_detail_body) _show_no_selection() + _build_index_page(right_page) _build_portrait_overlay() +func _build_index_page(right_page: Control) -> void: + _index_body = VBoxContainer.new() + _index_body.name = "CatalogIndex" + _index_body.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + _index_body.offset_left = INDEX_CONTENT_LEFT_INSET + _index_body.offset_top = INDEX_CONTENT_TOP_INSET + _index_body.offset_right = -INDEX_CONTENT_RIGHT_INSET + _index_body.offset_bottom = -INDEX_CONTENT_BOTTOM_INSET + _index_body.add_theme_constant_override("separation", 4) + _index_body.visible = false + right_page.add_child(_index_body) + _apply_page_content_scale(_index_body) + _apply_index_presentation() + + var heading := _label("catalog index", 28) + heading.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + _index_body.add_child(heading) + _index_summary = _field_label("", 14) + _index_summary.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + _index_summary.add_theme_color_override("font_color", MUTED_INK) + _index_body.add_child(_index_summary) + + var search_stack := VBoxContainer.new() + search_stack.add_theme_constant_override("separation", 0) + _index_body.add_child(search_stack) + var search_label := _field_label("find by name, group, or catalog no.", 13) + search_label.add_theme_color_override("font_color", MUTED_INK) + search_stack.add_child(search_label) + _index_search = LineEdit.new() + _index_search.name = "CatalogIndexSearch" + _index_search.custom_minimum_size.y = 34.0 + _index_search.placeholder_text = "write here..." + _index_search.max_length = 48 + _index_search.add_theme_font_override( + "font", InventoryNotepadType.HANDWRITTEN_FONT + ) + _index_search.add_theme_font_size_override("font_size", 18) + _index_search.add_theme_color_override("font_color", INK) + _index_search.add_theme_color_override("caret_color", INK) + _index_search.add_theme_color_override( + "font_placeholder_color", Color(MUTED_INK, 0.72) + ) + for style_name: StringName in [ + &"normal", &"focus", &"read_only", + ]: + _index_search.add_theme_stylebox_override( + style_name, + _index_search_style(style_name == &"focus"), + ) + _index_search.text_changed.connect(_on_index_search_changed) + search_stack.add_child(_index_search) + _index_controls.append(_index_search) + + var options_grid := GridContainer.new() + options_grid.columns = 2 + options_grid.size_flags_horizontal = Control.SIZE_EXPAND_FILL + options_grid.add_theme_constant_override("h_separation", 18) + options_grid.add_theme_constant_override("v_separation", 2) + _index_body.add_child(options_grid) + for descriptor: Dictionary in [ + {"key": &"show", "label": "show"}, + {"key": &"rarity", "label": "rarity"}, + {"key": &"sort", "label": "sort by"}, + {"key": &"availability", "label": "availability"}, + {"key": &"descending", "label": "order"}, + {"key": &"season", "label": "season"}, + {"key": &"method", "label": "method"}, + {"key": &"time", "label": "time of day"}, + {"key": &"holding", "label": "ownership"}, + {"key": &"group", "label": "collection group"}, + ]: + options_grid.add_child(_make_index_option( + descriptor["key"], + str(descriptor["label"]), + )) + + var footer := HBoxContainer.new() + footer.alignment = BoxContainer.ALIGNMENT_CENTER + _index_body.add_child(footer) + _index_reset = NOTEPAD_INK_ACTION_SCENE.instantiate() as Button + _index_reset.name = "CatalogIndexReset" + _index_reset.custom_minimum_size = Vector2(126.0, 34.0) + _index_reset.text = "clear index" + _apply_index_value_font(_index_reset) + _index_reset.tooltip_text = "Clear every catalog filter" + _index_reset.accessibility_name = "Clear catalog index filters" + _index_reset.pressed.connect(_reset_index) + footer.add_child(_index_reset) + _index_controls.append(_index_reset) + + _index_note = _field_label( + "silhouettes keep names hidden in filtered results", + 12, + ) + _index_note.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + _index_note.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + _index_note.add_theme_color_override("font_color", Color(MUTED_INK, 0.82)) + _index_body.add_child(_index_note) + _update_index_controls() + _configure_index_focus.call_deferred() + + +func _make_index_option(key: StringName, label_text: String) -> Control: + var stack := VBoxContainer.new() + stack.size_flags_horizontal = Control.SIZE_EXPAND_FILL + stack.add_theme_constant_override("separation", -3) + var label := _field_label(label_text, 12) + label.add_theme_color_override("font_color", MUTED_INK) + stack.add_child(label) + var button := NOTEPAD_INK_ACTION_SCENE.instantiate() as Button + button.name = "CatalogIndex%s" % String(key).capitalize().replace(" ", "") + button.custom_minimum_size = Vector2(0.0, INDEX_OPTION_HEIGHT) + button.size_flags_horizontal = Control.SIZE_EXPAND_FILL + button.clip_text = true + _apply_index_value_font(button) + button.tooltip_text = "Change %s; use left or right on a controller" % label_text + button.pressed.connect(_cycle_index_option.bind(key, 1)) + button.gui_input.connect(_on_index_option_gui_input.bind(key)) + stack.add_child(button) + _index_option_buttons[key] = button + _index_controls.append(button) + return stack + + +func _apply_index_value_font(button: Button) -> void: + button.add_theme_font_override( + "font", InventoryNotepadType.HANDWRITTEN_FONT + ) + button.add_theme_font_size_override("font_size", 18) + for color_name: StringName in [ + &"font_color", + &"font_hover_color", + &"font_focus_color", + &"font_pressed_color", + ]: + button.add_theme_color_override(color_name, INK) + + +func _index_search_style(focused: bool) -> StyleBoxFlat: + var style := StyleBoxFlat.new() + style.bg_color = Color(1.0, 0.97, 0.82, 0.12 if focused else 0.0) + style.border_color = Color(INK, 0.72 if focused else 0.42) + style.border_width_bottom = 2 + style.content_margin_left = 6 + style.content_margin_right = 22 + style.content_margin_top = 2 + style.content_margin_bottom = 3 + return style + + +func _configure_index_focus() -> void: + var controls: Array[Control] = [] + for control: Control in _index_controls: + if control != null and is_instance_valid(control): + controls.append(control) + if not controls.is_empty(): + ControllerFocusNavigationType.configure_spatial_neighbors(controls) + + +func _apply_index_presentation() -> void: + if _index_body == null: + return + var scale_value := 0.82 if _compact_presentation else PAGE_CONTENT_SCALE + _index_body.scale = Vector2.ONE * scale_value + + func _apply_presentation_margins() -> void: if _outer_margin == null: return @@ -548,11 +886,30 @@ func _refresh_catalog() -> void: var preserved_entry_key: StringName = _selected_entry_key _clear_entries() var species: Array[FishDataType] = [] + var category_total: int = 0 if _catalog != null: - species = LogbookCatalog.ordered_species(_catalog.candidates) + for fish: FishDataType in LogbookCatalog.ordered_species( + _catalog.candidates + ): + if LogbookCatalog.category_for(fish) == _category: + category_total += 1 + var available_now_resolver := Callable() + if _fishing_spot != null and is_instance_valid(_fishing_spot): + available_now_resolver = Callable( + _fishing_spot, + "is_species_available_now", + ) + species = LogbookCatalog.filtered_species( + _catalog.candidates, + _category, + _collection_log, + _inventory, + _index_options, + available_now_resolver, + _current_season(), + _current_is_night(), + ) for fish: FishDataType in species: - if LogbookCatalog.category_for(fish) != _category: - continue var discovered: bool = _collection_log.has_discovered(fish.id) var entry: Button = _make_entry(fish, discovered) var selection_key: StringName = ( @@ -572,7 +929,11 @@ func _refresh_catalog() -> void: ) ) _catalog_grid.add_child(entry) - _empty_state.text = LogbookCatalog.empty_state(_category) + _empty_state.text = ( + "No entries match this index." + if _index_has_active_criteria() + else LogbookCatalog.empty_state(_category) + ) _empty_state.visible = _entry_buttons.is_empty() _catalog_scroll.visible = not _entry_buttons.is_empty() if ( @@ -589,10 +950,269 @@ func _refresh_catalog() -> void: _selected_entry_key = StringName() _refresh_selection_styles() _refresh_details(false) + _update_index_controls(species.size(), category_total) set_interactive(_interactive) _refresh_catalog_scroll_indicators.call_deferred() +func _toggle_index_page() -> void: + _set_index_open(not _index_open) + + +func _set_index_open(open: bool, restore_focus: bool = true) -> void: + _index_open = open + if _index_tab != null: + _index_tab.set_selected(open) + _index_tab.tooltip_text = ( + "Return to catch record" if open else "Open catalog index" + ) + if _index_body != null: + _index_body.visible = open + if _detail_body != null: + _detail_body.visible = not open + if not open: + _refresh_details(false) + _update_index_controls() + if restore_focus and _active and _interactive: + if open: + _controller_zone = ControllerZone.INDEX + set_interactive(true) + _index_search.grab_focus() + elif _controller_zone == ControllerZone.INDEX: + _controller_zone = ControllerZone.TABS + set_interactive(true) + _index_tab.grab_focus() + + +func _on_index_search_changed(value: String) -> void: + if _index_update_in_progress: + return + _index_options["search"] = value + _refresh_catalog() + + +func _cycle_index_option(key: StringName, direction: int = 1) -> void: + if not _index_options.has(key): + return + if key == &"descending": + _index_options[key] = not bool(_index_options[key]) + elif key == &"group": + var groups: Array[String] = [""] + if _catalog != null: + groups.append_array(LogbookCatalog.available_groups( + _catalog.candidates, + _category, + _collection_log, + )) + var current_index := groups.find(str(_index_options[key])) + if current_index < 0: + current_index = 0 + _index_options[key] = groups[wrapi( + current_index + direction, + 0, + groups.size(), + )] + else: + var option_count := _index_option_count(key) + if option_count <= 0: + return + _index_options[key] = wrapi( + int(_index_options[key]) + direction, + 0, + option_count, + ) + _refresh_catalog() + + +func _on_index_option_gui_input( + event: InputEvent, + key: StringName, +) -> void: + var mouse_event := event as InputEventMouseButton + if mouse_event == null or not mouse_event.pressed: + return + if mouse_event.button_index in [MOUSE_BUTTON_RIGHT, MOUSE_BUTTON_WHEEL_UP]: + _cycle_index_option(key, -1) + get_viewport().set_input_as_handled() + elif mouse_event.button_index == MOUSE_BUTTON_WHEEL_DOWN: + _cycle_index_option(key, 1) + get_viewport().set_input_as_handled() + + +func _index_key_for_control(control: Control) -> StringName: + for key: StringName in _index_option_buttons: + if _index_option_buttons[key] == control: + return key + return StringName() + + +func _reset_index() -> void: + _index_options = { + "search": "", + "show": LogbookCatalog.DiscoveryFilter.ALL, + "sort": LogbookCatalog.SortMode.CATALOG_NUMBER, + "descending": false, + "availability": LogbookCatalog.AvailabilityFilter.ANY, + "season": LogbookCatalog.SeasonFilter.ANY, + "time": LogbookCatalog.TimeFilter.ANY, + "rarity": LogbookCatalog.RarityFilter.ANY, + "method": LogbookCatalog.MethodFilter.ANY, + "holding": LogbookCatalog.HoldingFilter.ANY, + "group": "", + } + _index_update_in_progress = true + _index_search.text = "" + _index_update_in_progress = false + _refresh_catalog() + + +func _update_index_controls( + visible_count: int = -1, + category_total: int = -1, +) -> void: + if visible_count >= 0: + _index_visible_count = visible_count + if category_total >= 0: + _index_category_total = category_total + if _index_summary != null: + _index_summary.text = "%d shown of %d" % [ + _index_visible_count, + _index_category_total, + ] + for key: StringName in _index_option_buttons: + var button := _index_option_buttons[key] + if button == null: + continue + button.text = _index_option_label(key) + button.accessibility_name = "%s: %s" % [ + String(key).replace("_", " "), + button.text, + ] + if _index_tab != null: + var marked := _index_has_active_criteria() + _index_tab.text = "index •" if marked else "index" + _index_tab.accessibility_name = ( + "Catalog index, filters active" if marked else "Catalog index" + ) + if _index_reset != null: + _index_reset.disabled = not _index_has_active_criteria() + + +func _index_option_label(key: StringName) -> String: + match key: + &"show": + return INDEX_SHOW_LABELS[int(_index_options[key])] + &"sort": + return INDEX_SORT_LABELS[int(_index_options[key])] + &"availability": + return INDEX_AVAILABILITY_LABELS[int(_index_options[key])] + &"season": + return INDEX_SEASON_LABELS[int(_index_options[key])] + &"time": + return INDEX_TIME_LABELS[int(_index_options[key])] + &"rarity": + return INDEX_RARITY_LABELS[int(_index_options[key])] + &"method": + return INDEX_METHOD_LABELS[int(_index_options[key])] + &"holding": + return INDEX_HOLDING_LABELS[int(_index_options[key])] + &"group": + var group := str(_index_options[key]) + return group if not group.is_empty() else "any group" + &"descending": + var descending := bool(_index_options[key]) + match int(_index_options["sort"]): + LogbookCatalog.SortMode.NAME: + return "z–a" if descending else "a–z" + LogbookCatalog.SortMode.CATALOG_NUMBER: + return "high–low" if descending else "low–high" + LogbookCatalog.SortMode.RARITY: + return ( + "rare–common" if descending else "common–rare" + ) + LogbookCatalog.SortMode.VALUE, LogbookCatalog.SortMode.WEIGHT: + return "high–low" if descending else "low–high" + _: + return "most first" if descending else "least first" + return "any" + + +func _index_option_count(key: StringName) -> int: + match key: + &"show": + return INDEX_SHOW_LABELS.size() + &"sort": + return INDEX_SORT_LABELS.size() + &"availability": + return INDEX_AVAILABILITY_LABELS.size() + &"season": + return INDEX_SEASON_LABELS.size() + &"time": + return INDEX_TIME_LABELS.size() + &"rarity": + return INDEX_RARITY_LABELS.size() + &"method": + return INDEX_METHOD_LABELS.size() + &"holding": + return INDEX_HOLDING_LABELS.size() + return 0 + + +func _index_has_active_criteria() -> bool: + return ( + not str(_index_options["search"]).is_empty() + or int(_index_options["show"]) + != LogbookCatalog.DiscoveryFilter.ALL + or int(_index_options["sort"]) + != LogbookCatalog.SortMode.CATALOG_NUMBER + or bool(_index_options["descending"]) + or int(_index_options["availability"]) + != LogbookCatalog.AvailabilityFilter.ANY + or int(_index_options["season"]) + != LogbookCatalog.SeasonFilter.ANY + or int(_index_options["time"]) + != LogbookCatalog.TimeFilter.ANY + or int(_index_options["rarity"]) + != LogbookCatalog.RarityFilter.ANY + or int(_index_options["method"]) + != LogbookCatalog.MethodFilter.ANY + or int(_index_options["holding"]) + != LogbookCatalog.HoldingFilter.ANY + or not str(_index_options["group"]).is_empty() + ) + + +func _current_season() -> int: + return ( + _world_time.get_season() + if _world_time != null + else CalendarSeason.UNKNOWN + ) + + +func _current_is_night() -> bool: + return _world_time != null and _world_time.is_night_period() + + +func notify_availability_context_changed() -> void: + _on_logbook_context_changed() + + +func _on_logbook_context_changed( + _first: Variant = null, + _second: Variant = null, +) -> void: + if ( + int(_index_options["availability"]) + == LogbookCatalog.AvailabilityFilter.AVAILABLE_NOW + or int(_index_options["season"]) + == LogbookCatalog.SeasonFilter.CURRENT + or int(_index_options["time"]) + == LogbookCatalog.TimeFilter.CURRENT + ): + _refresh_catalog() + + func _make_entry(fish: FishDataType, discovered: bool) -> Button: var entry := Button.new() entry.custom_minimum_size = CATALOG_ENTRY_SIZE @@ -663,8 +1283,11 @@ func _add_entry_content( func _select_category(category: LogbookCatalog.Category) -> void: if category == _category: + if _index_open: + _set_index_open(false) return _category = category + _set_index_open(false, false) _selected_id = StringName() _selected_entry_key = StringName() for index: int in _category_tabs.size(): @@ -683,6 +1306,11 @@ func _configure_category_focus() -> void: tab.focus_neighbor_right = tab.get_path_to( _category_tabs[mini(index + 1, _category_tabs.size() - 1)] ) + if not _category_tabs.is_empty() and _index_tab != null: + var final_tab: Button = _category_tabs.back() + final_tab.focus_neighbor_right = final_tab.get_path_to(_index_tab) + _index_tab.focus_neighbor_left = _index_tab.get_path_to(final_tab) + _index_tab.focus_neighbor_right = _index_tab.get_path_to(_index_tab) func _animate_tab_entry() -> void: @@ -690,11 +1318,15 @@ func _animate_tab_entry() -> void: (_category_tabs[index] as OrganizerTabType).animate_entrance( float(index) * 0.025 ) + if _index_tab != null: + _index_tab.animate_entrance(float(_category_tabs.size()) * 0.025) func _settle_tabs_for_close() -> void: for tab: OrganizerTabType in _category_tabs: tab.settle_for_close() + if _index_tab != null: + _index_tab.settle_for_close() func _begin_category_transition() -> void: @@ -750,9 +1382,12 @@ func _set_category_content_alpha(alpha: float) -> void: _empty_state.modulate.a = alpha if _detail_body != null: _detail_body.modulate.a = alpha + if _index_body != null: + _index_body.modulate.a = alpha func _select_entry(entry_key: StringName, fish_id: StringName) -> void: + _set_index_open(false, false) if fish_id.is_empty(): _selected_id = StringName() _selected_entry_key = entry_key @@ -1284,7 +1919,9 @@ func _on_collection_changed() -> void: func _on_inventory_changed() -> void: - _refresh_details(false) + # Ownership filters and favorite-backed views depend on the live cooler, + # while rebuilding the catalog also keeps the selected detail current. + _refresh_catalog() func _unknown_selection_key(fish: FishDataType) -> StringName: diff --git a/ui/player_menu.gd b/ui/player_menu.gd index 3c5dc77..2f9f96f 100644 --- a/ui/player_menu.gd +++ b/ui/player_menu.gd @@ -105,6 +105,7 @@ signal controller_hotbar_management_requested(initial_slot: int) signal controller_hotbar_management_ended signal menu_exit_started signal shop_cooler_modal_changed(is_open: bool) +signal controller_text_entry_requested(control: Control) enum Section { COOLER, @@ -409,6 +410,9 @@ func _ready() -> void: _logbook_tab.pressed.connect( _show_section.bind(Section.LOGBOOK) ) + _catalog_logbook.controller_text_entry_requested.connect( + controller_text_entry_requested.emit + ) _the_net_tab.pressed.connect(_show_section.bind(Section.NET)) _mail_tab.pressed.connect(_show_section.bind(Section.MAIL)) _profile_tab.pressed.connect(_show_section.bind(Section.PROFILE)) @@ -556,6 +560,7 @@ func setup( discovery: DiscoveryClient, player_jobs: PlayerJobService, world_time: WorldTimeService, + world_weather: WorldWeatherService, world_environment: WorldEnvironment, world_sun: DirectionalLight3D, ) -> void: @@ -589,7 +594,14 @@ func setup( world_sun, ) _players_page.setup(network_player_list, discovery) - _catalog_logbook.setup(collection_log, inventory, catalog) + _catalog_logbook.setup( + collection_log, + inventory, + catalog, + fishing_spot, + world_time, + world_weather, + ) _the_net_page.setup(player_jobs, world_time) _network_mail_service.unread_count_changed.connect( _on_mail_unread_count_changed @@ -2779,6 +2791,7 @@ func _toggle_active_tackle() -> void: func _on_active_bait_changed(_item_id: StringName) -> void: _update_tackle_detail() + _catalog_logbook.notify_availability_context_changed() func _on_active_lure_changed(_item_id: StringName) -> void: @@ -3733,6 +3746,7 @@ func _refresh_all() -> void: func _on_bag_changed() -> void: _refresh_bag() _refresh_tackle_box() + _catalog_logbook.notify_availability_context_changed() func _on_hotbar_changed() -> void: From fe099f47dd4e5be4f18387c592c8a0cb5715ee1a Mon Sep 17 00:00:00 2001 From: Voyager Date: Sun, 30 Aug 2026 21:37:26 -0400 Subject: [PATCH 10/37] Add portable RV homes and decor prototype --- fishing/fishing_spot.gd | 88 +- homes/decor_catalog.gd | 59 + homes/decor_catalog.gd.uid | 1 + homes/home_decor_controller.gd | 457 +++++++ homes/home_decor_controller.gd.uid | 1 + homes/home_world_service.gd | 1183 +++++++++++++++++ homes/home_world_service.gd.uid | 1 + homes/player_home_state.gd | 786 +++++++++++ homes/player_home_state.gd.uid | 1 + inventory/player_bag.gd | 22 + inventory/player_hotbar.gd | 19 + inventory/player_inventory_layout.gd | 84 +- items/catalog/basic_cube.tres | 17 + items/catalog/item_catalog.tres | 5 +- main/main.gd | 267 +++- main/main.tscn | 20 + network/network_home_protocol.gd | 176 +++ network/network_home_protocol.gd.uid | 1 + network/network_home_service.gd | 956 +++++++++++++ network/network_home_service.gd.uid | 1 + network/network_item_use_service.gd | 5 + network/network_protocol.gd | 14 +- network/network_session.gd | 38 +- network/network_shop_protocol.gd | 2 + network/network_shop_service.gd | 156 ++- player/player.gd | 135 +- save/player_save_manager.gd | 36 +- tests/art_tools_validation.gd | 13 +- tests/fish_hotbar_showcase_validation.gd | 5 +- tests/fish_quality_validation.gd | 5 +- tests/home_spawn_multiplayer_validation.gd | 178 +++ .../home_spawn_multiplayer_validation.gd.uid | 1 + tests/job_system_validation.gd | 5 +- tests/player_experience_validation.gd | 5 +- tests/progression_archive_validation.gd | 26 +- tests/unified_inventory_validation.gd | 35 + ui/decor_shop.gd | 323 +++++ ui/decor_shop.gd.uid | 1 + ui/decor_shop.tscn | 14 + ui/game_ui.gd | 97 ++ ui/game_ui.tscn | 32 +- ui/home_decor_toolbar.gd | 126 ++ ui/home_decor_toolbar.gd.uid | 1 + ui/home_decor_toolbar.tscn | 8 + ui/hotbar.gd | 11 +- ui/player_storage.gd | 57 +- world/decor_shop_interaction.gd | 2 + world/decor_shop_interaction.gd.uid | 1 + world/generation/generated_world_region.gd | 13 + world/generation/generated_world_region.tscn | 6 +- world/interactables/decor_shop_world.tscn | 35 + world/interactables/player_storage_box.tscn | 4 + world/regions/starter_island_region.gd | 11 + world/regions/starter_island_region.tscn | 5 + world/regions/world_region.gd | 4 + world/test_world.gd | 16 + 56 files changed, 5459 insertions(+), 112 deletions(-) create mode 100644 homes/decor_catalog.gd create mode 100644 homes/decor_catalog.gd.uid create mode 100644 homes/home_decor_controller.gd create mode 100644 homes/home_decor_controller.gd.uid create mode 100644 homes/home_world_service.gd create mode 100644 homes/home_world_service.gd.uid create mode 100644 homes/player_home_state.gd create mode 100644 homes/player_home_state.gd.uid create mode 100644 items/catalog/basic_cube.tres create mode 100644 network/network_home_protocol.gd create mode 100644 network/network_home_protocol.gd.uid create mode 100644 network/network_home_service.gd create mode 100644 network/network_home_service.gd.uid create mode 100644 tests/home_spawn_multiplayer_validation.gd create mode 100644 tests/home_spawn_multiplayer_validation.gd.uid create mode 100644 ui/decor_shop.gd create mode 100644 ui/decor_shop.gd.uid create mode 100644 ui/decor_shop.tscn create mode 100644 ui/home_decor_toolbar.gd create mode 100644 ui/home_decor_toolbar.gd.uid create mode 100644 ui/home_decor_toolbar.tscn create mode 100644 world/decor_shop_interaction.gd create mode 100644 world/decor_shop_interaction.gd.uid create mode 100644 world/interactables/decor_shop_world.tscn diff --git a/fishing/fishing_spot.gd b/fishing/fishing_spot.gd index 8e3e169..8160eec 100644 --- a/fishing/fishing_spot.gd +++ b/fishing/fishing_spot.gd @@ -41,8 +41,6 @@ const FishingSurfaceSampleType = preload( const FishingSurfaceResolverType = preload( "res://fishing/fishing_surface_resolver.gd" ) -const ArtShopStockType = preload("res://economy/art_shop_stock.gd") -const FishingShopStockType = preload("res://economy/fishing_shop_stock.gd") const WorldTimeServiceType = preload("res://world/world_time_service.gd") const WorldWeatherServiceType = preload( "res://world/world_weather_service.gd" @@ -134,6 +132,7 @@ const ALTERNATE_REEL_ACTION: StringName = &"reel_alternate" var state: FishingState = FishingState.READY var _external_input_blocked: bool = false var _gameplay_input_enabled: bool = false +var _fishing_environment_enabled: bool = true var _local_menu_input_owners: Dictionary[StringName, bool] = {} var _local_player: PlayerType var _local_inventory: FishInventoryType @@ -399,6 +398,22 @@ func set_gameplay_input_enabled(enabled: bool) -> void: reset_transient_state() +func set_fishing_environment_enabled(enabled: bool) -> void: + if _fishing_environment_enabled == enabled: + return + _fishing_environment_enabled = enabled + if enabled: + _new_cast_press_armed = not Input.is_action_pressed("fish_primary") + return + if _network_fishing != null and _network_fishing.has_local_attempt(): + _network_fishing.cancel_local_attempt("") + reset_transient_state() + + +func is_fishing_environment_enabled() -> bool: + return _fishing_environment_enabled + + func reset_transient_state(restore_movement: bool = true) -> void: var local_state_was_active: bool = ( state != FishingState.READY or _active_player != null @@ -533,6 +548,7 @@ func _process(delta: float) -> void: func _unhandled_input(event: InputEvent) -> void: if ( not _gameplay_input_enabled + or not _fishing_environment_enabled or _external_input_blocked or not _local_menu_input_owners.is_empty() ): @@ -545,51 +561,23 @@ func _unhandled_input(event: InputEvent) -> void: alternate_reel and state == FishingState.FIGHTING ): return + # Fishing owns the primary action only after a rod starts a cast, or while + # completing an already-active fishing sequence. An empty hand, decor, + # gathering tools, and other items must remain available to their own world + # interaction controllers. + if state == FishingState.READY and not has_active_fishing_rod(): + return # A held keyboard key emits echo events. Treat the alternate reel exactly # like a mouse button: one barrier hit per physical press, while the normal # held-input path continues driving free reeling between barriers. if event is InputEventKey and event.echo: get_viewport().set_input_as_handled() return - var selected_item: ItemDataType = _get_active_item() - if ( - state == FishingState.READY - and selected_item != null - and FishingShopStockType.is_gathering_tool(selected_item.item_id) - ): - return if event.is_pressed(): match state: FishingState.READY: if not _new_cast_press_armed: return - var active_item: ItemDataType = _get_active_item() - if ( - active_item != null - and ( - active_item.category == ItemDataType.Category.CONSUMABLE - or ( - active_item.item_id == PlayerItemEffectsType.FISH_FINDER_ID - ) - ) - ): - if _network_item_use != null: - _network_item_use.request_use(active_item.item_id) - elif _item_effects.use_item(active_item, _local_bag): - status_changed.emit(_item_effects.get_feedback( - active_item.item_id - )) - elif ( - active_item.item_id == PlayerItemEffectsType.FISH_FINDER_ID - ): - local_speech_requested.emit( - PlayerItemEffectsType.FISH_FINDER_DEAD_MESSAGE - ) - get_viewport().set_input_as_handled() - return - if not has_active_fishing_rod(): - get_viewport().set_input_as_handled() - return if ( _is_inventory_full() ): @@ -661,6 +649,34 @@ func _unhandled_input(event: InputEvent) -> void: get_viewport().set_input_as_handled() +func try_use_active_non_fishing_item() -> bool: + if ( + not _gameplay_input_enabled + or _external_input_blocked + or not _local_menu_input_owners.is_empty() + or state != FishingState.READY + ): + return false + var active_item: ItemDataType = _get_active_item() + if ( + active_item == null + or ( + active_item.category != ItemDataType.Category.CONSUMABLE + and active_item.item_id != PlayerItemEffectsType.FISH_FINDER_ID + ) + ): + return false + if _network_item_use != null: + _network_item_use.request_use(active_item.item_id) + elif _item_effects.use_item(active_item, _local_bag): + status_changed.emit(_item_effects.get_feedback(active_item.item_id)) + elif active_item.item_id == PlayerItemEffectsType.FISH_FINDER_ID: + local_speech_requested.emit( + PlayerItemEffectsType.FISH_FINDER_DEAD_MESSAGE + ) + return true + + func _is_reel_input_pressed() -> bool: return ( Input.is_action_pressed("fish_primary") diff --git a/homes/decor_catalog.gd b/homes/decor_catalog.gd new file mode 100644 index 0000000..14e5e29 --- /dev/null +++ b/homes/decor_catalog.gd @@ -0,0 +1,59 @@ +class_name DecorCatalog +extends RefCounted + +const BASIC_CUBE_ID: StringName = &"basic_cube" +const MAX_OWNED_PER_PRODUCT: int = 32 + +const _PRODUCTS: Dictionary = { + BASIC_CUBE_ID: { + "display_name": "basic cube", + "description": "a simple piece of decor for testing your RV layout.", + "price": 1, + "footprint": Vector2(1.0, 0.8), + "height": 0.8, + }, +} + + +static func get_product_ids() -> Array[StringName]: + var ids: Array[StringName] = [] + for value: Variant in _PRODUCTS.keys(): + ids.append(StringName(str(value))) + ids.sort_custom(func(first: StringName, second: StringName) -> bool: + return String(first) < String(second) + ) + return ids + + +static func has_product(product_id: StringName) -> bool: + return _PRODUCTS.has(product_id) + + +static func get_product(product_id: StringName) -> Dictionary: + var value: Variant = _PRODUCTS.get(product_id) + return ( + (value as Dictionary).duplicate(true) + if typeof(value) == TYPE_DICTIONARY + else {} + ) + + +static func get_display_name(product_id: StringName) -> String: + return str(get_product(product_id).get("display_name", product_id)) + + +static func get_description(product_id: StringName) -> String: + return str(get_product(product_id).get("description", "")) + + +static func get_price(product_id: StringName) -> int: + return int(get_product(product_id).get("price", -1)) + + +static func get_footprint(product_id: StringName) -> Vector2: + var value: Variant = get_product(product_id).get("footprint", Vector2.ZERO) + return value as Vector2 if value is Vector2 else Vector2.ZERO + + +static func get_height(product_id: StringName) -> float: + return float(get_product(product_id).get("height", 0.0)) diff --git a/homes/decor_catalog.gd.uid b/homes/decor_catalog.gd.uid new file mode 100644 index 0000000..10d2530 --- /dev/null +++ b/homes/decor_catalog.gd.uid @@ -0,0 +1 @@ +uid://bvgwmexas2gps diff --git a/homes/home_decor_controller.gd b/homes/home_decor_controller.gd new file mode 100644 index 0000000..1a97a5d --- /dev/null +++ b/homes/home_decor_controller.gd @@ -0,0 +1,457 @@ +class_name HomeDecorController +extends Node + +const DecorCatalogType = preload("res://homes/decor_catalog.gd") +const DRAG_RESPONSE: float = 22.0 +const DRAG_POSITION_EPSILON: float = 0.005 + +var _player: Player +var _hotbar: PlayerHotbar +var _bag: PlayerBag +var _home_state: PlayerHomeState +var _network_home: NetworkHomeService +var _home_world: HomeWorldService +var _fishing_spot: FishingSpot +var _toolbar: HomeDecorToolbar +var _mode: PlayerHomeState.PlacementMode = PlayerHomeState.PlacementMode.GRID +var _selected_instance_id: String = "" +var _drag_instance_id: String = "" +var _drag_owner_fingerprint: String = "" +var _drag_pointer_offset: Vector3 = Vector3.ZERO +var _drag_original_position: Vector3 = Vector3.ZERO +var _drag_original_yaw: float = 0.0 +var _drag_target_position: Vector3 = Vector3.ZERO +var _drag_target_yaw: float = 0.0 +var _drag_target_valid: bool = false + + +func setup( + player: Player, + hotbar: PlayerHotbar, + bag: PlayerBag, + home_state: PlayerHomeState, + network_home: NetworkHomeService, + home_world: HomeWorldService, + fishing_spot: FishingSpot, + toolbar: HomeDecorToolbar, +) -> void: + _player = player + _hotbar = hotbar + _bag = bag + _home_state = home_state + _network_home = network_home + _home_world = home_world + _fishing_spot = fishing_spot + _toolbar = toolbar + if not _network_home.local_space_changed.is_connected( + _on_local_space_changed + ): + _network_home.local_space_changed.connect(_on_local_space_changed) + if not _home_state.changed.is_connected(_on_home_changed): + _home_state.changed.connect(_on_home_changed) + if not _toolbar.placement_mode_requested.is_connected( + _on_placement_mode_requested + ): + _toolbar.placement_mode_requested.connect( + _on_placement_mode_requested + ) + _toolbar.rotate_requested.connect(_rotate_selected) + _toolbar.store_requested.connect(_store_selected) + _toolbar.cancel_requested.connect(_clear_selection) + _toolbar.set_mode(_mode) + _refresh_toolbar() + + +func begin_decorating() -> void: + _refresh_toolbar() + if _toolbar.visible: + _toolbar.report_status( + "use held decor to place it; click or drag placed decor" + ) + + +func _input(event: InputEvent) -> void: + if _drag_instance_id.is_empty(): + return + var pointer_motion := event as InputEventMouseMotion + if pointer_motion != null: + _update_drag(pointer_motion.position) + get_viewport().set_input_as_handled() + return + var pointer_button := event as InputEventMouseButton + if ( + pointer_button != null + and pointer_button.button_index == MOUSE_BUTTON_LEFT + and not pointer_button.pressed + ): + _finish_drag() + get_viewport().set_input_as_handled() + + +func _unhandled_input(event: InputEvent) -> void: + var pointer_button := event as InputEventMouseButton + if ( + pointer_button != null + and pointer_button.button_index == MOUSE_BUTTON_LEFT + ): + if not pointer_button.pressed or not _can_decorate(): + return + if _begin_drag(pointer_button.position): + get_viewport().set_input_as_handled() + return + var pointer_decor_id: StringName = _get_selected_decor_id() + if ( + not pointer_decor_id.is_empty() + and _bag.get_quantity(pointer_decor_id) > 0 + ): + _place_carried_decor(pointer_decor_id) + get_viewport().set_input_as_handled() + return + if not _can_decorate() or not event.is_action_pressed("fish_primary"): + return + if event is InputEventKey and event.echo: + return + var decor_id: StringName = _get_selected_decor_id() + if not decor_id.is_empty() and _bag.get_quantity(decor_id) > 0: + _place_carried_decor(decor_id) + get_viewport().set_input_as_handled() + + +func _process(delta: float) -> void: + if _drag_instance_id.is_empty(): + return + if not Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT): + _finish_drag() + return + if not _drag_target_valid: + return + if not _can_decorate(): + _cancel_drag() + return + var current: Dictionary = _home_world.get_decor_preview_transform( + _drag_owner_fingerprint, _drag_instance_id + ) + if current.is_empty(): + _cancel_drag() + return + var current_position: Vector3 = current["position"] + var current_yaw: float = float(current["yaw"]) + var blend: float = 1.0 - exp(-DRAG_RESPONSE * delta) + _home_world.set_decor_preview_transform( + _drag_owner_fingerprint, + _drag_instance_id, + current_position.lerp(_drag_target_position, blend), + lerp_angle(current_yaw, _drag_target_yaw, blend), + ) + + +func _begin_drag(screen_position: Vector2) -> bool: + var owner_fingerprint: String = ( + _network_home.get_local_home_owner_fingerprint() + ) + var camera: Camera3D = _player.get_active_gameplay_camera() + var clicked_instance: String = _home_world.find_decor_instance_at_screen( + owner_fingerprint, camera, screen_position + ) + if clicked_instance.is_empty(): + return false + var placement: Dictionary = _home_state.get_placement(clicked_instance) + if placement.is_empty(): + return false + var original_position: Vector3 = _placement_position(placement) + if not original_position.is_finite(): + return false + if not _home_world.set_decor_manipulation_active( + owner_fingerprint, clicked_instance, true + ): + return false + var pointer_position: Vector3 = _home_world.get_floor_position_from_screen( + owner_fingerprint, camera, screen_position + ) + _drag_instance_id = clicked_instance + _drag_owner_fingerprint = owner_fingerprint + _drag_original_position = original_position + _drag_original_yaw = float(placement.get("yaw", 0.0)) + _drag_target_position = original_position + _drag_target_yaw = _drag_original_yaw + _drag_target_valid = true + _drag_pointer_offset = ( + original_position - pointer_position + if pointer_position.is_finite() + else Vector3.ZERO + ) + _drag_pointer_offset.y = 0.0 + _select_instance(clicked_instance) + _toolbar.report_status("drag decor, then release to place it") + return true + + +func _update_drag(screen_position: Vector2) -> void: + if not _can_decorate(): + _cancel_drag() + return + var camera: Camera3D = _player.get_active_gameplay_camera() + var pointer_position: Vector3 = _home_world.get_floor_position_from_screen( + _drag_owner_fingerprint, camera, screen_position + ) + if not pointer_position.is_finite(): + # Keep the most recent valid target when the pointer briefly leaves the + # RV floor. Releasing there should place at that target, not throw the + # decor all the way back to where the drag began. + _toolbar.report_status("keep the pointer over the RV floor") + return + var placement: Dictionary = _home_state.get_placement(_drag_instance_id) + if placement.is_empty(): + _clear_selection() + return + var candidate: Vector3 = pointer_position + _drag_pointer_offset + candidate.y = 0.0 + var normalized: Dictionary = _network_home.get_valid_local_decor_transform( + _drag_instance_id, + candidate, + float(placement.get("yaw", _drag_original_yaw)), + _mode, + ) + if normalized.is_empty(): + # A densely furnished area may have no nearby solution. Preserve the + # last valid preview so the interaction remains stable while the player + # moves the pointer toward open space. + _toolbar.report_status("holding at the nearest available position") + return + _drag_target_position = normalized["position"] + _drag_target_yaw = float(normalized["yaw"]) + _drag_target_valid = true + _toolbar.report_status("release to place decor") + + +func _finish_drag() -> void: + var instance_id: String = _drag_instance_id + var owner_fingerprint: String = _drag_owner_fingerprint + var original_position: Vector3 = _drag_original_position + var original_yaw: float = _drag_original_yaw + var target_position: Vector3 = _drag_target_position + var target_yaw: float = _drag_target_yaw + var target_valid: bool = _drag_target_valid + var placement: Dictionary = _home_state.get_placement(instance_id) + var decor_id := StringName(str(placement.get("decor_id", ""))) + if ( + not target_valid + or decor_id.is_empty() + or not _home_world.is_decor_placement_clear_of_players( + owner_fingerprint, decor_id, target_position, target_yaw + ) + ): + _home_world.set_decor_preview_transform( + owner_fingerprint, + instance_id, + original_position, + original_yaw, + ) + _home_world.set_decor_manipulation_active( + owner_fingerprint, instance_id, false + ) + _reset_drag_state() + _toolbar.report_status( + "a player is in the way" + if target_valid + else "that space is not available" + ) + return + _home_world.set_decor_preview_transform( + owner_fingerprint, instance_id, target_position, target_yaw + ) + if ( + original_position.distance_to(target_position) + <= DRAG_POSITION_EPSILON + and is_zero_approx(angle_difference(original_yaw, target_yaw)) + ): + _home_world.set_decor_manipulation_active( + owner_fingerprint, instance_id, false + ) + _reset_drag_state() + _select_instance(instance_id) + return + if _network_home.update_local_decor( + instance_id, target_position, target_yaw, _mode + ): + _home_world.set_decor_manipulation_active( + owner_fingerprint, instance_id, false + ) + _reset_drag_state() + _toolbar.report_status("decor moved") + return + _home_world.set_decor_preview_transform( + owner_fingerprint, + instance_id, + original_position, + original_yaw, + ) + _home_world.set_decor_manipulation_active( + owner_fingerprint, instance_id, false + ) + _reset_drag_state() + _toolbar.report_status("that space is not available") + + +func _cancel_drag() -> void: + if _drag_instance_id.is_empty(): + return + _home_world.set_decor_preview_transform( + _drag_owner_fingerprint, + _drag_instance_id, + _drag_original_position, + _drag_original_yaw, + ) + _home_world.set_decor_manipulation_active( + _drag_owner_fingerprint, _drag_instance_id, false + ) + _reset_drag_state() + + +func _reset_drag_state() -> void: + _drag_instance_id = "" + _drag_owner_fingerprint = "" + _drag_pointer_offset = Vector3.ZERO + _drag_original_position = Vector3.ZERO + _drag_original_yaw = 0.0 + _drag_target_position = Vector3.ZERO + _drag_target_yaw = 0.0 + _drag_target_valid = false + + +static func _placement_position(placement: Dictionary) -> Vector3: + if placement.is_empty(): + return Vector3.INF + var values: Array = placement.get("position", []) + if values.size() != 3: + return Vector3.INF + return Vector3( + float(values[0]), float(values[1]), float(values[2]) + ) + + +func _place_carried_decor(decor_id: StringName) -> void: + var owner_fingerprint: String = ( + _network_home.get_local_home_owner_fingerprint() + ) + var forward: Vector3 = -_player.global_basis.z + forward.y = 0.0 + forward = forward.normalized() + var global_position: Vector3 = _player.global_position + forward * 1.45 + var local_position: Vector3 = _home_world.interior_global_to_local( + owner_fingerprint, global_position + ) + var instance_id: String = _network_home.place_local_decor( + decor_id, local_position, _player.global_rotation.y, _mode + ) + if instance_id.is_empty(): + _toolbar.report_status("make room in front of you to place this decor") + return + _select_instance(instance_id) + _toolbar.report_status("decor placed") + + +func _select_instance(instance_id: String) -> void: + var placement: Dictionary = _home_state.get_placement(instance_id) + if placement.is_empty(): + _clear_selection() + return + _selected_instance_id = instance_id + var decor_id := StringName(str(placement.get("decor_id", ""))) + _toolbar.set_selection( + instance_id, DecorCatalogType.get_display_name(decor_id) + ) + + +func _rotate_selected() -> void: + if not _can_decorate() or _selected_instance_id.is_empty(): + return + var placement: Dictionary = _home_state.get_placement( + _selected_instance_id + ) + if placement.is_empty(): + _clear_selection() + return + var values: Array = placement.get("position", []) + if values.size() != 3: + return + var position := Vector3( + float(values[0]), float(values[1]), float(values[2]) + ) + if _network_home.update_local_decor( + _selected_instance_id, + position, + float(placement.get("yaw", 0.0)) + PI * 0.5, + _mode, + ): + _toolbar.report_status("decor rotated") + else: + _toolbar.report_status("not enough room to rotate here") + + +func _store_selected() -> void: + if _selected_instance_id.is_empty(): + return + if _network_home.remove_local_decor(_selected_instance_id): + _clear_selection() + _toolbar.report_status("decor packed into storage") + else: + _toolbar.report_status("inventory and storage are full") + + +func _clear_selection() -> void: + _cancel_drag() + _selected_instance_id = "" + if _toolbar != null: + _toolbar.set_selection("") + + +func _on_placement_mode_requested(mode: int) -> void: + _mode = mode as PlayerHomeState.PlacementMode + + +func _on_local_space_changed( + _space_id: StringName, + _owner_fingerprint: String, +) -> void: + _clear_selection() + _refresh_toolbar() + + +func _on_home_changed() -> void: + if ( + not _selected_instance_id.is_empty() + and _home_state.get_placement(_selected_instance_id).is_empty() + ): + _clear_selection() + _refresh_toolbar() + + +func _refresh_toolbar() -> void: + if _toolbar == null: + return + _toolbar.set_active(_can_decorate()) + if not _toolbar.visible: + _clear_selection() + + +func _can_decorate() -> bool: + return ( + _player != null + and _network_home != null + and _network_home.can_local_decorate() + and _fishing_spot != null + and _fishing_spot.can_open_fishing_shop() + and _player.is_movement_enabled() + ) + + +func _get_selected_decor_id() -> StringName: + if ( + _hotbar == null + or _hotbar.get_selected_assignment_kind() + != PlayerHotbar.AssignmentKind.ITEM + ): + return StringName() + var item_id: StringName = _hotbar.get_selected_item_id() + return item_id if DecorCatalogType.has_product(item_id) else StringName() diff --git a/homes/home_decor_controller.gd.uid b/homes/home_decor_controller.gd.uid new file mode 100644 index 0000000..1778125 --- /dev/null +++ b/homes/home_decor_controller.gd.uid @@ -0,0 +1 @@ +uid://b5j0mqcvhmi54 diff --git a/homes/home_world_service.gd b/homes/home_world_service.gd new file mode 100644 index 0000000..4e1b422 --- /dev/null +++ b/homes/home_world_service.gd @@ -0,0 +1,1183 @@ +class_name HomeWorldService +extends Node3D + +const NetworkHomeProtocolType = preload( + "res://network/network_home_protocol.gd" +) +const PlayerHomeStateType = preload("res://homes/player_home_state.gd") +const DecorCatalogType = preload("res://homes/decor_catalog.gd") + +const EXTERIOR_BODY_SIZE := Vector3(5.6, 2.5, 2.35) +const EXTERIOR_DOOR_LOCAL := Vector3(-1.45, 0.85, 1.48) +const EXTERIOR_SPAWN_LOCAL := Vector3(-1.45, 0.25, 2.45) +const EXTERIOR_INTERACTION_DISTANCE: float = 2.7 +const INTERIOR_EXIT_DISTANCE: float = 2.1 +const INTERIOR_ORIGIN := Vector3(1000.0, 300.0, 1000.0) +const INTERIOR_SPACING: float = 14.0 +const INTERIOR_FLOOR_SIZE := Vector3(8.0, 0.18, 4.5) +const INTERIOR_WALL_HEIGHT: float = 2.7 +const MIN_EXTERIOR_TRIANGLE_AREA: float = 1.0 +const MIN_EXTERIOR_SEPARATION: float = 9.0 +const EXTERIOR_FOOTPRINT_HALF_EXTENTS := Vector2(3.85, 2.55) +const EXTERIOR_SURFACE_INDEX_CELL_SIZE: float = 5.0 +const EXTERIOR_MAX_SURFACE_HEIGHT_DELTA: float = 0.24 +const EXTERIOR_CLEARANCE_HEIGHT: float = 2.7 +const WORLD_GEOMETRY_COLLISION_LAYER: int = 1 +const DECOR_SELECTION_COLLISION_LAYER: int = 1 << 8 +# Includes the player's 0.45 m capsule radius plus enough movement margin for +# a full low-tick-rate frame before a newly solid placement can be reached. +const PLAYER_DECOR_CLEARANCE_RADIUS: float = 0.8 +const BASIC_CUBE_SIZE := Vector3(1.0, 0.8, 0.8) + +var _world: TestWorld +var _spawn_service: PlayerSpawnService +var _session: NetworkSession +var _dedicated_runtime: bool = false +var _exteriors_root: Node3D +var _interiors_root: Node3D +var _presentations_by_fingerprint: Dictionary[String, Dictionary] = {} +var _local_space: StringName = NetworkHomeProtocolType.WORLD_SPACE +var _decor_under_manipulation: Dictionary[String, bool] = {} +var _pending_solid_decor: Dictionary[String, Dictionary] = {} + + +func setup( + world: TestWorld, + spawn_service: PlayerSpawnService, + session: NetworkSession, + dedicated_runtime: bool, +) -> void: + _world = world + _spawn_service = spawn_service + _session = session + _dedicated_runtime = dedicated_runtime + _ensure_roots() + set_process(true) + + +func is_world_ready() -> bool: + return _world != null and _world.is_world_ready() + + +func clear_presentations() -> void: + _presentations_by_fingerprint.clear() + _decor_under_manipulation.clear() + _pending_solid_decor.clear() + if is_instance_valid(_exteriors_root): + for child: Node in _exteriors_root.get_children(): + child.queue_free() + if is_instance_valid(_interiors_root): + for child: Node in _interiors_root.get_children(): + child.queue_free() + + +func remove_presentation(owner_fingerprint: String) -> void: + var presentation: Dictionary = _presentations_by_fingerprint.get( + owner_fingerprint, {} + ) + if presentation.is_empty(): + return + _clear_decor_collision_tracking(owner_fingerprint) + _free_presentation_nodes(presentation) + _presentations_by_fingerprint.erase(owner_fingerprint) + + +func apply_manifest(data: Dictionary) -> bool: + if ( + not is_world_ready() + or not NetworkHomeProtocolType.validate_manifest_broadcast(data) + ): + return false + _ensure_roots() + var fingerprint: String = str(data["owner_fingerprint"]) + var prior: Dictionary = _presentations_by_fingerprint.get(fingerprint, {}) + var prior_instance_ids: Dictionary[String, bool] = {} + if not prior.is_empty(): + var prior_home: Dictionary = prior.get("home", {}) + for value: Variant in prior_home.get("placements", []): + if typeof(value) == TYPE_DICTIONARY: + prior_instance_ids[str( + (value as Dictionary).get("instance_id", "") + )] = true + if not prior.is_empty(): + _clear_decor_collision_tracking(fingerprint) + _free_presentation_nodes(prior) + var exterior_transform := NetworkHomeProtocolType.array_to_transform( + data["exterior_transform"] + ) + var interior_index: int = int(data["interior_index"]) + var home_data: Dictionary = PlayerHomeStateType.sanitize_save_data( + data["home"] + ) + var exterior := _build_exterior(fingerprint, exterior_transform) + var interior := _build_interior(fingerprint, interior_index, home_data) + var presentation: Dictionary = { + "owner_peer_id": int(data["owner_peer_id"]), + "fingerprint": fingerprint, + "home": home_data, + "exterior_transform": exterior_transform, + "interior_index": interior_index, + "exterior": exterior, + "interior": interior, + } + _presentations_by_fingerprint[fingerprint] = presentation + _refresh_local_visibility() + if not prior.is_empty(): + for value: Variant in home_data.get("placements", []): + if typeof(value) != TYPE_DICTIONARY: + continue + var instance_id: String = str( + (value as Dictionary).get("instance_id", "") + ) + if not instance_id.is_empty() and not prior_instance_ids.has( + instance_id + ): + call_deferred( + "_spawn_decor_poof", fingerprint, instance_id + ) + return true + + +func choose_exterior_transform( + owner_peer_id: int, + reserved_transforms: Array[Transform3D], +) -> Transform3D: + var spawn_transform: Transform3D = ( + _world.get_player_spawn_transform() + if _world != null else Transform3D.IDENTITY + ) + var triangles: Array[PackedVector3Array] = ( + _world.get_spawn_surface_triangles( + [&"grass_lite", &"grass", &"sand"], -0.5 + ) + if _world != null else [] + ) + if not triangles.is_empty(): + var surface_index: Dictionary = _build_surface_index(triangles) + var strict_result: Transform3D = _find_exterior_transform( + owner_peer_id, + triangles, + surface_index, + spawn_transform, + reserved_transforms, + true, + true, + ) + if strict_result != Transform3D.IDENTITY: + return strict_result + var relaxed_result: Transform3D = _find_exterior_transform( + owner_peer_id, + triangles, + surface_index, + spawn_transform, + reserved_transforms, + false, + true, + ) + if relaxed_result != Transform3D.IDENTITY: + return relaxed_result + var dry_result: Transform3D = _find_exterior_transform( + owner_peer_id, + triangles, + surface_index, + spawn_transform, + reserved_transforms, + false, + false, + ) + if dry_result != Transform3D.IDENTITY: + push_warning( + "RV exterior used a dry fallback with obstructed clearance." + ) + return dry_result + push_error("No dry, level RV exterior footprint was available.") + var fallback: Transform3D = spawn_transform + var column: int = posmod(owner_peer_id - 1, 4) + var row: int = maxi(floori(float(owner_peer_id - 1) / 4.0), 0) + fallback.origin += Vector3( + -12.0 + float(column) * 8.0, + 0.0, + 8.0 + float(row) * 7.0, + ) + return fallback + + +func _find_exterior_transform( + owner_peer_id: int, + triangles: Array[PackedVector3Array], + surface_index: Dictionary, + spawn_transform: Transform3D, + reserved_transforms: Array[Transform3D], + require_spawn_clearance: bool, + require_obstacle_clearance: bool, +) -> Transform3D: + var triangle_count: int = triangles.size() + var start: int = posmod(owner_peer_id * 37, triangle_count) + var step: int = _coprime_step(triangle_count, 29) + for offset: int in triangle_count: + var triangle: PackedVector3Array = triangles[ + (start + offset * step) % triangle_count + ] + if not _is_exterior_candidate_triangle(triangle): + continue + var position: Vector3 = ( + triangle[0] + triangle[1] + triangle[2] + ) / 3.0 + if ( + require_spawn_clearance + and position.distance_to(spawn_transform.origin) < 6.0 + ): + continue + if _too_close_to_reserved(position, reserved_transforms): + continue + var yaw: float = float(posmod(owner_peer_id + offset, 4)) * PI * 0.5 + var grounded_position: Vector3 = _ground_exterior_footprint( + position, yaw, triangles, surface_index + ) + if not grounded_position.is_finite(): + continue + if ( + require_obstacle_clearance + and not _exterior_volume_is_clear(grounded_position, yaw) + ): + continue + return Transform3D(Basis(Vector3.UP, yaw), grounded_position) + return Transform3D.IDENTITY + + +func _is_exterior_candidate_triangle(triangle: PackedVector3Array) -> bool: + if triangle.size() != 3: + return false + var normal: Vector3 = (triangle[1] - triangle[0]).cross( + triangle[2] - triangle[0] + ) + var area: float = normal.length() * 0.5 + return ( + area >= MIN_EXTERIOR_TRIANGLE_AREA + and absf(normal.normalized().y) >= 0.94 + ) + + +func _ground_exterior_footprint( + position: Vector3, + yaw: float, + triangles: Array[PackedVector3Array], + surface_index: Dictionary, +) -> Vector3: + var heights: Array[float] = [] + for local_sample: Vector2 in _exterior_footprint_samples(): + var rotated_sample: Vector3 = Vector3( + local_sample.x, 0.0, local_sample.y + ).rotated(Vector3.UP, yaw) + var sample := Vector2( + position.x + rotated_sample.x, + position.z + rotated_sample.z, + ) + var height: float = _surface_height_at( + sample, position.y, triangles, surface_index + ) + if not is_finite(height): + return Vector3.INF + heights.append(height) + var minimum_height: float = heights.min() + var maximum_height: float = heights.max() + if maximum_height - minimum_height > EXTERIOR_MAX_SURFACE_HEIGHT_DELTA: + return Vector3.INF + return Vector3(position.x, maximum_height, position.z) + + +func _exterior_footprint_samples() -> Array[Vector2]: + var samples: Array[Vector2] = [] + for x_factor: float in [-1.0, -0.5, 0.0, 0.5, 1.0]: + for z_factor: float in [-1.0, 0.0, 1.0]: + samples.append(Vector2( + EXTERIOR_FOOTPRINT_HALF_EXTENTS.x * x_factor, + EXTERIOR_FOOTPRINT_HALF_EXTENTS.y * z_factor, + )) + return samples + + +func _build_surface_index( + triangles: Array[PackedVector3Array], +) -> Dictionary: + var result: Dictionary = {} + for triangle_index: int in triangles.size(): + var triangle: PackedVector3Array = triangles[triangle_index] + if triangle.size() != 3: + continue + var minimum_x: float = minf( + triangle[0].x, minf(triangle[1].x, triangle[2].x) + ) + var maximum_x: float = maxf( + triangle[0].x, maxf(triangle[1].x, triangle[2].x) + ) + var minimum_z: float = minf( + triangle[0].z, minf(triangle[1].z, triangle[2].z) + ) + var maximum_z: float = maxf( + triangle[0].z, maxf(triangle[1].z, triangle[2].z) + ) + var minimum_cell := Vector2i( + floori(minimum_x / EXTERIOR_SURFACE_INDEX_CELL_SIZE), + floori(minimum_z / EXTERIOR_SURFACE_INDEX_CELL_SIZE), + ) + var maximum_cell := Vector2i( + floori(maximum_x / EXTERIOR_SURFACE_INDEX_CELL_SIZE), + floori(maximum_z / EXTERIOR_SURFACE_INDEX_CELL_SIZE), + ) + for cell_x: int in range(minimum_cell.x, maximum_cell.x + 1): + for cell_y: int in range(minimum_cell.y, maximum_cell.y + 1): + var cell := Vector2i(cell_x, cell_y) + var bucket: Array = result.get(cell, []) + bucket.append(triangle_index) + result[cell] = bucket + return result + + +func _surface_height_at( + point: Vector2, + preferred_height: float, + triangles: Array[PackedVector3Array], + surface_index: Dictionary, +) -> float: + var cell := Vector2i( + floori(point.x / EXTERIOR_SURFACE_INDEX_CELL_SIZE), + floori(point.y / EXTERIOR_SURFACE_INDEX_CELL_SIZE), + ) + var best_height: float = INF + var best_delta: float = INF + for value: Variant in surface_index.get(cell, []): + var triangle: PackedVector3Array = triangles[int(value)] + var height: float = _triangle_height_at(point, triangle) + if not is_finite(height): + continue + var delta: float = absf(height - preferred_height) + if delta < best_delta: + best_delta = delta + best_height = height + return best_height + + +func _triangle_height_at( + point: Vector2, + triangle: PackedVector3Array, +) -> float: + var a := Vector2(triangle[0].x, triangle[0].z) + var b := Vector2(triangle[1].x, triangle[1].z) + var c := Vector2(triangle[2].x, triangle[2].z) + var denominator: float = ( + (b.y - c.y) * (a.x - c.x) + + (c.x - b.x) * (a.y - c.y) + ) + if absf(denominator) <= 0.000001: + return INF + var weight_a: float = ( + (b.y - c.y) * (point.x - c.x) + + (c.x - b.x) * (point.y - c.y) + ) / denominator + var weight_b: float = ( + (c.y - a.y) * (point.x - c.x) + + (a.x - c.x) * (point.y - c.y) + ) / denominator + var weight_c: float = 1.0 - weight_a - weight_b + const EDGE_EPSILON: float = 0.001 + if ( + weight_a < -EDGE_EPSILON + or weight_b < -EDGE_EPSILON + or weight_c < -EDGE_EPSILON + ): + return INF + return ( + weight_a * triangle[0].y + + weight_b * triangle[1].y + + weight_c * triangle[2].y + ) + + +func _exterior_volume_is_clear(position: Vector3, yaw: float) -> bool: + if not is_inside_tree() or get_world_3d() == null: + return true + var shape := BoxShape3D.new() + shape.size = Vector3( + EXTERIOR_FOOTPRINT_HALF_EXTENTS.x * 2.0, + EXTERIOR_CLEARANCE_HEIGHT, + EXTERIOR_FOOTPRINT_HALF_EXTENTS.y * 2.0, + ) + var query := PhysicsShapeQueryParameters3D.new() + query.shape = shape + query.transform = Transform3D( + Basis(Vector3.UP, yaw), + position + Vector3.UP * (EXTERIOR_CLEARANCE_HEIGHT * 0.5 + 0.2), + ) + query.collision_mask = 1 + query.collide_with_areas = false + query.collide_with_bodies = true + return get_world_3d().direct_space_state.intersect_shape(query, 1).is_empty() + + +func _coprime_step(value: int, preferred_step: int) -> int: + var step: int = mini(preferred_step, maxi(value - 1, 1)) + while step > 1 and _greatest_common_divisor(step, value) != 1: + step -= 1 + return step + + +func _greatest_common_divisor(first: int, second: int) -> int: + var a: int = absi(first) + var b: int = absi(second) + while b != 0: + var remainder: int = a % b + a = b + b = remainder + return a + + +func get_exterior_transform(owner_fingerprint: String) -> Transform3D: + var presentation: Dictionary = _presentations_by_fingerprint.get( + owner_fingerprint, {} + ) + return presentation.get("exterior_transform", Transform3D.IDENTITY) + + +func get_exterior_prompt_position(owner_fingerprint: String) -> Vector3: + return get_exterior_transform(owner_fingerprint) * EXTERIOR_DOOR_LOCAL + + +func get_exterior_spawn_transform(owner_fingerprint: String) -> Transform3D: + var exterior_transform: Transform3D = get_exterior_transform( + owner_fingerprint + ) + return Transform3D( + exterior_transform.basis, + exterior_transform * EXTERIOR_SPAWN_LOCAL, + ) + + +func get_interior_spawn_transform( + owner_fingerprint: String, + visitor_offset: int = 0, +) -> Transform3D: + var anchor: Vector3 = get_interior_anchor(owner_fingerprint) + var result := Transform3D(Basis.IDENTITY, anchor) + result.origin += Vector3( + -1.0 + float(posmod(visitor_offset, 4)) * 0.65, + 0.25, + 0.4 + float(floori(float(visitor_offset) / 4.0)) * 0.55, + ) + return result + + +func get_interior_anchor(owner_fingerprint: String) -> Vector3: + var presentation: Dictionary = _presentations_by_fingerprint.get( + owner_fingerprint, {} + ) + var index: int = int(presentation.get("interior_index", 0)) + return INTERIOR_ORIGIN + Vector3(float(index) * INTERIOR_SPACING, 0.0, 0.0) + + +func is_avatar_near_exterior(avatar: Player, owner_fingerprint: String) -> bool: + if avatar == null or not _presentations_by_fingerprint.has(owner_fingerprint): + return false + var transform: Transform3D = get_exterior_transform(owner_fingerprint) + var door_position: Vector3 = transform * EXTERIOR_DOOR_LOCAL + return avatar.global_position.distance_to(door_position) <= ( + EXTERIOR_INTERACTION_DISTANCE + ) + + +func is_avatar_near_interior_exit( + avatar: Player, + owner_fingerprint: String, +) -> bool: + if avatar == null: + return false + return avatar.global_position.distance_to( + get_interior_exit_position(owner_fingerprint) + ) <= INTERIOR_EXIT_DISTANCE + + +func get_interior_exit_position(owner_fingerprint: String) -> Vector3: + return get_interior_anchor(owner_fingerprint) + Vector3( + -INTERIOR_FLOOR_SIZE.x * 0.5 + 0.6, + 0.35, + 0.0, + ) + + +func get_interior_prompt_position(owner_fingerprint: String) -> Vector3: + return get_interior_exit_position(owner_fingerprint) + Vector3.UP * 1.2 + + +func interior_local_to_global( + owner_fingerprint: String, + local_position: Vector3, +) -> Vector3: + return get_interior_anchor(owner_fingerprint) + local_position + + +func interior_global_to_local( + owner_fingerprint: String, + global_position: Vector3, +) -> Vector3: + return global_position - get_interior_anchor(owner_fingerprint) + + +func get_floor_position_from_screen( + owner_fingerprint: String, + camera: Camera3D, + screen_position: Vector2, +) -> Vector3: + if camera == null or owner_fingerprint.is_empty(): + return Vector3.INF + var ray_origin: Vector3 = camera.project_ray_origin(screen_position) + var ray_direction: Vector3 = camera.project_ray_normal(screen_position) + if absf(ray_direction.y) <= 0.0001: + return Vector3.INF + var floor_y: float = get_interior_anchor(owner_fingerprint).y + 0.1 + var distance: float = (floor_y - ray_origin.y) / ray_direction.y + if distance <= 0.0: + return Vector3.INF + return interior_global_to_local( + owner_fingerprint, + ray_origin + ray_direction * distance, + ) + + +func find_decor_instance_at_screen( + owner_fingerprint: String, + camera: Camera3D, + screen_position: Vector2, +) -> String: + if camera == null or owner_fingerprint.is_empty(): + return "" + var ray_origin: Vector3 = camera.project_ray_origin(screen_position) + var ray_end: Vector3 = ray_origin + camera.project_ray_normal( + screen_position + ) * 50.0 + var query := PhysicsRayQueryParameters3D.create(ray_origin, ray_end) + query.collision_mask = DECOR_SELECTION_COLLISION_LAYER + query.collide_with_areas = false + var result: Dictionary = camera.get_world_3d().direct_space_state.intersect_ray( + query + ) + var collider: Object = result.get("collider") + if collider is Node and (collider as Node).has_meta(&"decor_instance_id"): + if str((collider as Node).get_meta(&"decor_owner_fingerprint")) == ( + owner_fingerprint + ): + return str((collider as Node).get_meta(&"decor_instance_id")) + return "" + + +func get_decor_preview_transform( + owner_fingerprint: String, + instance_id: String, +) -> Dictionary: + var decor: Node3D = _get_decor_presentation( + owner_fingerprint, instance_id + ) + if decor == null: + return {} + return { + "position": Vector3(decor.position.x, 0.0, decor.position.z), + "yaw": decor.rotation.y, + } + + +func set_decor_preview_transform( + owner_fingerprint: String, + instance_id: String, + position: Vector3, + yaw_radians: float, +) -> bool: + var decor: Node3D = _get_decor_presentation( + owner_fingerprint, instance_id + ) + if decor == null or not position.is_finite() or not is_finite(yaw_radians): + return false + decor.position = Vector3(position.x, 0.18, position.z) + decor.rotation.y = yaw_radians + return true + + +func set_decor_manipulation_active( + owner_fingerprint: String, + instance_id: String, + active: bool, +) -> bool: + var decor: Node3D = _get_decor_presentation( + owner_fingerprint, instance_id + ) + if decor == null: + return false + var body: StaticBody3D = decor.get_node_or_null( + "BasicCubeCollision" + ) as StaticBody3D + if body == null: + return false + var key: String = _decor_collision_key( + owner_fingerprint, instance_id + ) + if active: + _decor_under_manipulation[key] = true + _pending_solid_decor.erase(key) + body.collision_layer = DECOR_SELECTION_COLLISION_LAYER + return true + _decor_under_manipulation.erase(key) + _queue_decor_world_collision( + owner_fingerprint, + instance_id, + StringName(str(decor.get_meta(&"decor_id", ""))), + body, + ) + return true + + +func is_decor_placement_clear_of_players( + owner_fingerprint: String, + decor_id: StringName, + local_position: Vector3, + yaw_radians: float, +) -> bool: + if ( + owner_fingerprint.is_empty() + or not DecorCatalogType.has_product(decor_id) + or not local_position.is_finite() + or not is_finite(yaw_radians) + ): + return false + if _spawn_service == null: + return true + var global_center: Vector3 = interior_local_to_global( + owner_fingerprint, local_position + ) + var half_size: Vector2 = DecorCatalogType.get_footprint(decor_id) * 0.5 + for peer_id: int in _spawn_service.get_peer_ids(): + var avatar: Player = _spawn_service.get_avatar(peer_id) + if avatar == null or not is_instance_valid(avatar): + continue + var offset := Vector2( + avatar.global_position.x - global_center.x, + avatar.global_position.z - global_center.z, + ).rotated(-yaw_radians) + var nearest := Vector2( + clampf(offset.x, -half_size.x, half_size.x), + clampf(offset.y, -half_size.y, half_size.y), + ) + if offset.distance_squared_to(nearest) < ( + PLAYER_DECOR_CLEARANCE_RADIUS + * PLAYER_DECOR_CLEARANCE_RADIUS + ): + return false + return true + + +func _get_decor_presentation( + owner_fingerprint: String, + instance_id: String, +) -> Node3D: + if owner_fingerprint.is_empty() or instance_id.is_empty(): + return null + var presentation: Dictionary = _presentations_by_fingerprint.get( + owner_fingerprint, {} + ) + var interior: Node3D = presentation.get("interior") + if not is_instance_valid(interior): + return null + return interior.get_node_or_null( + "Decor/%s" % instance_id + ) as Node3D + + +func find_nearby_exterior_owner(avatar: Player) -> String: + if avatar == null: + return "" + var closest: String = "" + var closest_distance: float = EXTERIOR_INTERACTION_DISTANCE + for fingerprint: String in _presentations_by_fingerprint: + var transform: Transform3D = get_exterior_transform(fingerprint) + var distance: float = avatar.global_position.distance_to( + transform * EXTERIOR_DOOR_LOCAL + ) + if distance <= closest_distance: + closest = fingerprint + closest_distance = distance + return closest + + +func set_local_space(space_id: StringName) -> void: + _local_space = space_id + _refresh_local_visibility() + + +func get_manifest(owner_fingerprint: String) -> Dictionary: + var presentation: Dictionary = _presentations_by_fingerprint.get( + owner_fingerprint, {} + ) + return (presentation.get("home", {}) as Dictionary).duplicate(true) + + +func _process(_delta: float) -> void: + _refresh_pending_decor_collisions() + if not _dedicated_runtime: + _refresh_nearest_wall() + + +func _queue_decor_world_collision( + owner_fingerprint: String, + instance_id: String, + decor_id: StringName, + body: StaticBody3D, +) -> void: + if ( + owner_fingerprint.is_empty() + or instance_id.is_empty() + or not DecorCatalogType.has_product(decor_id) + or body == null + ): + return + var key: String = _decor_collision_key( + owner_fingerprint, instance_id + ) + body.collision_layer = DECOR_SELECTION_COLLISION_LAYER + _pending_solid_decor[key] = { + "owner_fingerprint": owner_fingerprint, + "instance_id": instance_id, + "decor_id": decor_id, + "body": body, + } + + +func _refresh_pending_decor_collisions() -> void: + if _pending_solid_decor.is_empty(): + return + var keys: Array[String] = [] + keys.assign(_pending_solid_decor.keys()) + for key: String in keys: + if _decor_under_manipulation.has(key): + continue + var pending: Dictionary = _pending_solid_decor.get(key, {}) + var body: StaticBody3D = pending.get("body") as StaticBody3D + var owner_fingerprint: String = str( + pending.get("owner_fingerprint", "") + ) + var instance_id: String = str(pending.get("instance_id", "")) + var decor_id := StringName(str(pending.get("decor_id", ""))) + var decor: Node3D = _get_decor_presentation( + owner_fingerprint, instance_id + ) + if body == null or decor == null or not is_instance_valid(body): + _pending_solid_decor.erase(key) + continue + if not is_decor_placement_clear_of_players( + owner_fingerprint, + decor_id, + Vector3(decor.position.x, 0.0, decor.position.z), + decor.rotation.y, + ): + continue + body.collision_layer = ( + WORLD_GEOMETRY_COLLISION_LAYER + | DECOR_SELECTION_COLLISION_LAYER + ) + _pending_solid_decor.erase(key) + + +func _clear_decor_collision_tracking(owner_fingerprint: String) -> void: + var prefix: String = "%s/" % owner_fingerprint + for key: String in _decor_under_manipulation.keys(): + if key.begins_with(prefix): + _decor_under_manipulation.erase(key) + for key: String in _pending_solid_decor.keys(): + if key.begins_with(prefix): + _pending_solid_decor.erase(key) + + +static func _decor_collision_key( + owner_fingerprint: String, + instance_id: String, +) -> String: + return "%s/%s" % [owner_fingerprint, instance_id] + + +func _ensure_roots() -> void: + if not is_instance_valid(_exteriors_root): + _exteriors_root = Node3D.new() + _exteriors_root.name = "RVExteriors" + add_child(_exteriors_root) + if not is_instance_valid(_interiors_root): + _interiors_root = Node3D.new() + _interiors_root.name = "RVInteriors" + add_child(_interiors_root) + + +func _build_exterior( + fingerprint: String, + world_transform: Transform3D, +) -> Node3D: + var root := Node3D.new() + root.name = "RV_%s" % fingerprint.left(8) + _exteriors_root.add_child(root) + root.global_transform = world_transform + _add_box( + root, "Body", EXTERIOR_BODY_SIZE, Vector3(0.0, 1.35, 0.0), + Color("d8d2bd"), true, + ) + root.visible = not _dedicated_runtime + return root + + +func _build_interior( + fingerprint: String, + interior_index: int, + home_data: Dictionary, +) -> Node3D: + var root := Node3D.new() + root.name = "RVInterior_%s" % fingerprint.left(8) + root.position = INTERIOR_ORIGIN + Vector3( + float(interior_index) * INTERIOR_SPACING, 0.0, 0.0 + ) + var half_width: float = INTERIOR_FLOOR_SIZE.x * 0.5 + var half_depth: float = INTERIOR_FLOOR_SIZE.z * 0.5 + var wall_center_y: float = INTERIOR_WALL_HEIGHT * 0.5 + _interiors_root.add_child(root) + _add_box( + root, "Floor", INTERIOR_FLOOR_SIZE, Vector3.ZERO, + Color("a6754e"), true, + ) + _add_wall( + root, "WallNorth", + Vector3(INTERIOR_FLOOR_SIZE.x, INTERIOR_WALL_HEIGHT, 0.18), + Vector3(0.0, wall_center_y, -half_depth), + ) + _add_wall( + root, "WallSouth", + Vector3(INTERIOR_FLOOR_SIZE.x, INTERIOR_WALL_HEIGHT, 0.18), + Vector3(0.0, wall_center_y, half_depth), + ) + _add_wall( + root, "WallWest", + Vector3(0.18, INTERIOR_WALL_HEIGHT, INTERIOR_FLOOR_SIZE.z), + Vector3(-half_width, wall_center_y, 0.0), + ) + _add_wall( + root, "WallEast", + Vector3(0.18, INTERIOR_WALL_HEIGHT, INTERIOR_FLOOR_SIZE.z), + Vector3(half_width, wall_center_y, 0.0), + ) + for x_position: float in [-1.75, 1.75]: + _add_box( + root, "WallNorthWindow%s" % ("Left" if x_position < 0.0 else "Right"), + Vector3(1.65, 0.95, 0.04), + Vector3(x_position, 1.55, -half_depth + 0.11), + Color("153640"), false, + ) + _add_box( + root, "WallSouthWindow%s" % ("Left" if x_position < 0.0 else "Right"), + Vector3(1.65, 0.95, 0.04), + Vector3(x_position, 1.55, half_depth - 0.11), + Color("153640"), false, + ) + _add_box( + root, "WallEastWindow", Vector3(0.04, 0.95, 1.55), + Vector3(half_width - 0.11, 1.55, 0.0), Color("153640"), false, + ) + _add_box( + root, "WallWestDoor", Vector3(0.04, 1.9, 1.25), + Vector3(-half_width + 0.11, 1.0, 0.0), Color("2897a8"), false, + ) + var decor := Node3D.new() + decor.name = "Decor" + root.add_child(decor) + _rebuild_decor(decor, home_data, fingerprint) + root.visible = false + if _dedicated_runtime: + _set_geometry_visible(root, false) + return root + + +func _rebuild_decor( + parent: Node3D, + home_data: Dictionary, + owner_fingerprint: String, +) -> void: + for value: Variant in home_data.get("placements", []): + if typeof(value) != TYPE_DICTIONARY: + continue + var placement: Dictionary = value + var decor_id := StringName(str(placement["decor_id"])) + if decor_id != DecorCatalogType.BASIC_CUBE_ID: + continue + var position_values: Array = placement["position"] + var placement_root := Node3D.new() + placement_root.name = str(placement["instance_id"]) + placement_root.position = Vector3( + float(position_values[0]), 0.18, float(position_values[2]) + ) + placement_root.rotation.y = float(placement["yaw"]) + placement_root.set_meta( + &"decor_instance_id", str(placement["instance_id"]) + ) + placement_root.set_meta( + &"decor_owner_fingerprint", owner_fingerprint + ) + placement_root.set_meta(&"decor_id", String(decor_id)) + parent.add_child(placement_root) + var body := _add_box( + placement_root, "BasicCube", BASIC_CUBE_SIZE, + Vector3(0.0, BASIC_CUBE_SIZE.y * 0.5, 0.0), + Color("b77a55"), true, + ) + if body != null: + body.collision_layer = DECOR_SELECTION_COLLISION_LAYER + body.set_meta( + &"decor_instance_id", str(placement["instance_id"]) + ) + body.set_meta( + &"decor_owner_fingerprint", owner_fingerprint + ) + body.set_meta(&"decor_id", String(decor_id)) + _queue_decor_world_collision( + owner_fingerprint, + str(placement["instance_id"]), + decor_id, + body, + ) + _add_box( + placement_root, + "BasicCubeFront", + Vector3(BASIC_CUBE_SIZE.x * 0.82, BASIC_CUBE_SIZE.y * 0.68, 0.025), + Vector3( + 0.0, + BASIC_CUBE_SIZE.y * 0.5, + -BASIC_CUBE_SIZE.z * 0.5 - 0.013, + ), + Color("2897a8"), + false, + ) + + +func _add_wall( + parent: Node3D, + node_name: String, + size: Vector3, + position: Vector3, +) -> void: + _add_box(parent, node_name, size, position, Color("d6caaa"), true) + + +func _add_box( + parent: Node3D, + node_name: String, + size: Vector3, + position: Vector3, + color: Color, + with_collision: bool, + invert_faces: bool = false, +) -> StaticBody3D: + var mesh_instance := MeshInstance3D.new() + mesh_instance.name = node_name + var mesh := BoxMesh.new() + mesh.size = size + mesh.material = _material(color) + if invert_faces: + mesh.flip_faces = true + mesh_instance.mesh = mesh + mesh_instance.position = position + parent.add_child(mesh_instance) + if with_collision: + var body := StaticBody3D.new() + body.name = "%sCollision" % node_name + body.position = position + var collision := CollisionShape3D.new() + var shape := BoxShape3D.new() + shape.size = size + collision.shape = shape + body.add_child(collision) + parent.add_child(body) + return body + return null + + +func _spawn_decor_poof( + owner_fingerprint: String, + instance_id: String, +) -> void: + var presentation: Dictionary = _presentations_by_fingerprint.get( + owner_fingerprint, {} + ) + var interior: Node3D = presentation.get("interior") + if not is_instance_valid(interior): + return + var placement_root: Node3D = interior.get_node_or_null( + "Decor/%s" % instance_id + ) + if placement_root == null: + return + var poof := CPUParticles3D.new() + poof.name = "DecorPoof" + poof.amount = 12 + poof.lifetime = 0.45 + poof.one_shot = true + poof.explosiveness = 0.9 + poof.direction = Vector3.UP + poof.spread = 80.0 + poof.initial_velocity_min = 0.7 + poof.initial_velocity_max = 1.5 + poof.scale_amount_min = 0.08 + poof.scale_amount_max = 0.16 + var particle_mesh := SphereMesh.new() + particle_mesh.radius = 0.06 + particle_mesh.height = 0.12 + particle_mesh.material = _material(Color("d9c5a3")) + poof.mesh = particle_mesh + placement_root.add_child(poof) + poof.emitting = true + get_tree().create_timer(poof.lifetime + 0.1).timeout.connect( + poof.queue_free + ) + + +func _material(color: Color) -> StandardMaterial3D: + var material := StandardMaterial3D.new() + material.albedo_color = color + material.roughness = 1.0 + material.shading_mode = BaseMaterial3D.SHADING_MODE_PER_VERTEX + return material + + +func _free_presentation_nodes(presentation: Dictionary) -> void: + for key: String in ["exterior", "interior"]: + var node: Node = presentation.get(key) + if is_instance_valid(node): + node.queue_free() + + +func _refresh_local_visibility() -> void: + var active_fingerprint: String = "" + if String(_local_space).begins_with("rv:"): + active_fingerprint = String(_local_space).trim_prefix("rv:") + if _world != null: + _world.set_local_home_interior_presentation_active( + not active_fingerprint.is_empty() + ) + for fingerprint: String in _presentations_by_fingerprint: + var presentation: Dictionary = _presentations_by_fingerprint[fingerprint] + var interior: Node3D = presentation.get("interior") + if is_instance_valid(interior): + interior.visible = ( + not _dedicated_runtime and fingerprint == active_fingerprint + ) + var exterior: Node3D = presentation.get("exterior") + if is_instance_valid(exterior): + exterior.visible = ( + not _dedicated_runtime and active_fingerprint.is_empty() + ) + var local_player: Player = ( + _spawn_service.get_local_player() + if _spawn_service != null else null + ) + if local_player == null: + return + var excluded_wall_rids: Array[RID] = [] + if not active_fingerprint.is_empty(): + var active: Dictionary = _presentations_by_fingerprint.get( + active_fingerprint, {} + ) + var active_interior: Node3D = active.get("interior") + if is_instance_valid(active_interior): + for wall_name: String in [ + "WallNorth", "WallSouth", "WallWest", "WallEast", + ]: + var body: StaticBody3D = active_interior.get_node_or_null( + "%sCollision" % wall_name + ) + if body != null: + excluded_wall_rids.append(body.get_rid()) + local_player.set_rv_interior_camera_mode( + not active_fingerprint.is_empty(), excluded_wall_rids + ) + + +func _refresh_nearest_wall() -> void: + if not String(_local_space).begins_with("rv:") or _spawn_service == null: + return + var fingerprint: String = String(_local_space).trim_prefix("rv:") + var presentation: Dictionary = _presentations_by_fingerprint.get( + fingerprint, {} + ) + var interior: Node3D = presentation.get("interior") + var player: Player = _spawn_service.get_local_player() + if not is_instance_valid(interior) or player == null: + return + var camera: Camera3D = player.get_active_gameplay_camera() + if camera == null: + return + var local_camera: Vector3 = interior.to_local(camera.global_position) + var local_view_direction: Vector3 = ( + interior.global_basis.inverse() * -camera.global_basis.z + ).normalized() + var horizontal_view_weight: float = absf(local_view_direction.x) + var depth_view_weight: float = absf(local_view_direction.z) + var hidden_walls: Dictionary[String, bool] = {} + var outside_horizontal_wall: bool = ( + absf(local_camera.x) >= INTERIOR_FLOOR_SIZE.x * 0.5 - 0.05 + ) + var outside_depth_wall: bool = ( + absf(local_camera.z) >= INTERIOR_FLOOR_SIZE.z * 0.5 - 0.05 + ) + # At a diagonal, both near walls occupy the view. Use the camera's viewing + # direction to hide both instead of choosing only the dominant position + # axis and leaving the adjacent wall across the screen. + if ( + outside_horizontal_wall + and horizontal_view_weight >= depth_view_weight * 0.35 + ): + hidden_walls[ + "WallEast" if local_camera.x >= 0.0 else "WallWest" + ] = true + if ( + outside_depth_wall + and depth_view_weight >= horizontal_view_weight * 0.35 + ): + hidden_walls[ + "WallSouth" if local_camera.z >= 0.0 else "WallNorth" + ] = true + if hidden_walls.is_empty(): + var fallback_wall: String = ( + "WallEast" if local_camera.x >= 0.0 else "WallWest" + ) + if depth_view_weight > horizontal_view_weight: + fallback_wall = ( + "WallSouth" if local_camera.z >= 0.0 else "WallNorth" + ) + hidden_walls[fallback_wall] = true + for wall_name: String in [ + "WallNorth", "WallSouth", "WallWest", "WallEast", + ]: + var wall: MeshInstance3D = interior.get_node_or_null(wall_name) + if wall != null: + wall.visible = not hidden_walls.has(wall_name) + for child: Node in interior.get_children(): + if ( + child is GeometryInstance3D + and String(child.name).begins_with(wall_name) + ): + (child as GeometryInstance3D).visible = ( + not hidden_walls.has(wall_name) + ) + + +func _too_close_to_reserved( + position: Vector3, + reserved_transforms: Array[Transform3D], +) -> bool: + for transform: Transform3D in reserved_transforms: + if position.distance_to(transform.origin) < MIN_EXTERIOR_SEPARATION: + return true + return false + + +func _set_geometry_visible(root: Node, visible: bool) -> void: + for node: Node in root.find_children("*", "GeometryInstance3D", true, false): + (node as GeometryInstance3D).visible = visible diff --git a/homes/home_world_service.gd.uid b/homes/home_world_service.gd.uid new file mode 100644 index 0000000..5505d06 --- /dev/null +++ b/homes/home_world_service.gd.uid @@ -0,0 +1 @@ +uid://cy2kjoxhwxujd diff --git a/homes/player_home_state.gd b/homes/player_home_state.gd new file mode 100644 index 0000000..decd34a --- /dev/null +++ b/homes/player_home_state.gd @@ -0,0 +1,786 @@ +class_name PlayerHomeState +extends Node + +signal changed + +const DecorCatalogType = preload("res://homes/decor_catalog.gd") + +const HOME_SCHEMA_VERSION: int = 1 +const STARTER_TIER: int = 0 +const STARTER_EXTERIOR_ID: StringName = &"starter_motorcoach" +const MAX_TIER: int = 8 +const MAX_PLACEMENTS: int = 128 +const MAX_INSTANCE_ID_LENGTH: int = 96 +const MAX_REVISION: int = 2147483647 +const GRID_SIZE: float = 0.5 +const FREE_PLACEMENT_SEARCH_STEP: float = 0.1 +const FREE_PLACEMENT_SEARCH_ANGLES: int = 24 +const NEAREST_PLACEMENT_SEARCH_DISTANCE: float = 2.0 +# The starter RV is intentionally cramped. Later RV tiers can replace these +# bounds with larger layouts when tiered interiors are introduced. +# The starter interior is 8.0 m by 4.5 m with 0.18 m walls. These bounds +# follow the walls' inner faces, with a small visual gap to avoid z-fighting. +const INTERIOR_HALF_EXTENTS := Vector2(3.91, 2.16) +const PLACEMENT_EDGE_PADDING: float = 0.02 + +enum Privacy { + OPEN, + CLOSED, +} + +enum PlacementMode { + GRID, + FREE, +} + +var _tier: int = STARTER_TIER +var _exterior_id: StringName = STARTER_EXTERIOR_ID +var _privacy: Privacy = Privacy.OPEN +var _owned_decor: Dictionary[StringName, int] = {} +var _placements: Array[Dictionary] = [] +var _revision: int = 0 +var _next_instance_sequence: int = 1 + + +func get_tier() -> int: + return _tier + + +func get_exterior_id() -> StringName: + return _exterior_id + + +func get_privacy() -> Privacy: + return _privacy + + +func get_revision() -> int: + return _revision + + +func get_owned_count(decor_id: StringName) -> int: + return int(_owned_decor.get(decor_id, 0)) + + +func get_placed_count(decor_id: StringName) -> int: + var count: int = 0 + for placement: Dictionary in _placements: + if StringName(str(placement.get("decor_id", ""))) == decor_id: + count += 1 + return count + + +func get_available_count(decor_id: StringName) -> int: + return maxi( + get_owned_count(decor_id) - get_placed_count(decor_id), + 0, + ) + + +func get_owned_decor() -> Dictionary[StringName, int]: + return _owned_decor.duplicate() + + +func get_placements() -> Array[Dictionary]: + var result: Array[Dictionary] = [] + for placement: Dictionary in _placements: + result.append(placement.duplicate(true)) + return result + + +func get_placement(instance_id: String) -> Dictionary: + var index: int = _placement_index(instance_id) + return _placements[index].duplicate(true) if index >= 0 else {} + + +func can_place_decor( + decor_id: StringName, + position: Vector3, + yaw_radians: float, + mode: PlacementMode, +) -> bool: + if ( + get_available_count(decor_id) <= 0 + or _placements.size() >= MAX_PLACEMENTS + or not _valid_mode(mode) + ): + return false + return not get_nearest_valid_placement_transform( + decor_id, + position, + yaw_radians, + mode, + "", + ).is_empty() + + +func set_privacy(value: Privacy) -> bool: + if value < Privacy.OPEN or value > Privacy.CLOSED: + return false + if _privacy == value: + return true + _privacy = value + _touch() + return true + + +func add_owned_decor( + decor_id: StringName, + quantity: int = 1, +) -> bool: + if ( + not DecorCatalogType.has_product(decor_id) + or quantity <= 0 + ): + return false + var current: int = get_owned_count(decor_id) + if current + quantity > DecorCatalogType.MAX_OWNED_PER_PRODUCT: + return false + _owned_decor[decor_id] = current + quantity + _touch() + return true + + +func remove_owned_decor( + decor_id: StringName, + quantity: int = 1, +) -> bool: + if quantity <= 0: + return false + var current: int = get_owned_count(decor_id) + if current - quantity < get_placed_count(decor_id): + return false + var remaining: int = current - quantity + if remaining < 0: + return false + if remaining == 0: + _owned_decor.erase(decor_id) + else: + _owned_decor[decor_id] = remaining + _touch() + return true + + +func place_decor( + decor_id: StringName, + position: Vector3, + yaw_radians: float, + mode: PlacementMode, +) -> String: + if ( + get_available_count(decor_id) <= 0 + or _placements.size() >= MAX_PLACEMENTS + or not _valid_mode(mode) + ): + return "" + var normalized := get_nearest_valid_placement_transform( + decor_id, + position, + yaw_radians, + mode, + "", + ) + if normalized.is_empty(): + return "" + var instance_id := _make_instance_id() + var placement: Dictionary = { + "instance_id": instance_id, + "decor_id": String(decor_id), + "mode": int(mode), + "position": _vector3_to_array(normalized["position"]), + "yaw": float(normalized["yaw"]), + } + _placements.append(placement) + _touch() + return instance_id + + +func update_placement( + instance_id: String, + position: Vector3, + yaw_radians: float, + mode: PlacementMode, +) -> bool: + var index: int = _placement_index(instance_id) + var normalized: Dictionary = get_valid_update_transform( + instance_id, position, yaw_radians, mode + ) + if index < 0 or normalized.is_empty(): + return false + var placement: Dictionary = _placements[index].duplicate(true) + placement["mode"] = int(mode) + placement["position"] = _vector3_to_array(normalized["position"]) + placement["yaw"] = float(normalized["yaw"]) + _placements[index] = placement + _touch() + return true + + +func get_valid_update_transform( + instance_id: String, + position: Vector3, + yaw_radians: float, + mode: PlacementMode, + candidate_validator: Callable = Callable(), +) -> Dictionary: + var index: int = _placement_index(instance_id) + if index < 0 or not _valid_mode(mode): + return {} + var decor_id := StringName( + str(_placements[index].get("decor_id", "")) + ) + return get_nearest_valid_placement_transform( + decor_id, + position, + yaw_radians, + mode, + instance_id, + candidate_validator, + ) + + +func get_nearest_valid_placement_transform( + decor_id: StringName, + position: Vector3, + yaw_radians: float, + mode: PlacementMode, + ignored_instance_id: String = "", + candidate_validator: Callable = Callable(), +) -> Dictionary: + var normalized: Dictionary = normalized_placement_transform( + decor_id, position, yaw_radians, mode + ) + if normalized.is_empty(): + return {} + if ( + not _overlaps_existing( + decor_id, normalized, ignored_instance_id + ) + and _candidate_is_accepted(normalized, candidate_validator) + ): + return normalized + return ( + _find_nearest_grid_transform( + decor_id, + normalized, + ignored_instance_id, + candidate_validator, + ) + if mode == PlacementMode.GRID + else _find_nearest_free_transform( + decor_id, + normalized, + ignored_instance_id, + candidate_validator, + ) + ) + + +func remove_placement(instance_id: String) -> bool: + var index: int = _placement_index(instance_id) + if index < 0: + return false + _placements.remove_at(index) + _touch() + return true + + +func reset_to_defaults() -> void: + _tier = STARTER_TIER + _exterior_id = STARTER_EXTERIOR_ID + _privacy = Privacy.OPEN + _owned_decor.clear() + _placements.clear() + _revision = 0 + _next_instance_sequence = 1 + changed.emit() + + +func to_save_data() -> Dictionary: + var owned: Dictionary = {} + var ids: Array[StringName] = [] + ids.assign(_owned_decor.keys()) + ids.sort_custom(func(first: StringName, second: StringName) -> bool: + return String(first) < String(second) + ) + for decor_id: StringName in ids: + owned[String(decor_id)] = _owned_decor[decor_id] + return { + "schema_version": HOME_SCHEMA_VERSION, + "tier": _tier, + "exterior_id": String(_exterior_id), + "privacy": int(_privacy), + "owned_decor": owned, + "placements": get_placements(), + "revision": _revision, + "next_instance_sequence": _next_instance_sequence, + } + + +func restore_from_save_data(data: Dictionary) -> bool: + var sanitized: Dictionary = sanitize_save_data(data) + if sanitized.is_empty(): + return false + _tier = int(sanitized["tier"]) + _exterior_id = StringName(str(sanitized["exterior_id"])) + _privacy = int(sanitized["privacy"]) + _owned_decor.clear() + for key: Variant in (sanitized["owned_decor"] as Dictionary): + _owned_decor[StringName(str(key))] = int( + (sanitized["owned_decor"] as Dictionary)[key] + ) + _placements.clear() + for value: Variant in sanitized["placements"] as Array: + _placements.append((value as Dictionary).duplicate(true)) + _revision = int(sanitized["revision"]) + _next_instance_sequence = int(sanitized["next_instance_sequence"]) + changed.emit() + return true + + +static func default_save_data() -> Dictionary: + return { + "schema_version": HOME_SCHEMA_VERSION, + "tier": STARTER_TIER, + "exterior_id": String(STARTER_EXTERIOR_ID), + "privacy": int(Privacy.OPEN), + "owned_decor": {}, + "placements": [], + "revision": 0, + "next_instance_sequence": 1, + } + + +static func sanitize_save_data(data: Dictionary) -> Dictionary: + if ( + not _is_integer_value(data.get("schema_version")) + or int(data.get("schema_version", -1)) != HOME_SCHEMA_VERSION + or not _is_integer_value(data.get("tier")) + or typeof(data.get("exterior_id")) not in [ + TYPE_STRING, TYPE_STRING_NAME, + ] + or not _is_integer_value(data.get("privacy")) + or typeof(data.get("owned_decor")) != TYPE_DICTIONARY + or typeof(data.get("placements")) != TYPE_ARRAY + or not _is_integer_value(data.get("revision")) + or not _is_integer_value(data.get("next_instance_sequence")) + ): + return {} + var tier: int = int(data["tier"]) + var exterior_id: String = str(data["exterior_id"]) + var privacy: int = int(data["privacy"]) + var revision: int = int(data["revision"]) + var next_sequence: int = int(data["next_instance_sequence"]) + if ( + tier < STARTER_TIER + or tier > MAX_TIER + or exterior_id.is_empty() + or exterior_id.length() > 96 + or privacy < Privacy.OPEN + or privacy > Privacy.CLOSED + or revision < 0 + or revision > MAX_REVISION + or next_sequence < 1 + or next_sequence > MAX_REVISION + ): + return {} + var sanitized_owned: Dictionary = {} + var owned: Dictionary = data["owned_decor"] + for key: Variant in owned: + if typeof(key) not in [TYPE_STRING, TYPE_STRING_NAME]: + return {} + var decor_id := StringName(str(key)) + var quantity_value: Variant = owned[key] + if ( + not DecorCatalogType.has_product(decor_id) + or not _is_integer_value(quantity_value) + or int(quantity_value) <= 0 + or int(quantity_value) > DecorCatalogType.MAX_OWNED_PER_PRODUCT + ): + return {} + sanitized_owned[String(decor_id)] = int(quantity_value) + var values: Array = data["placements"] + if values.size() > MAX_PLACEMENTS: + return {} + var sanitized_placements: Array[Dictionary] = [] + var seen_instance_ids: Dictionary[String, bool] = {} + var placed_counts: Dictionary[StringName, int] = {} + for value: Variant in values: + if typeof(value) != TYPE_DICTIONARY: + return {} + var sanitized: Dictionary = sanitize_placement(value) + if sanitized.is_empty(): + return {} + var instance_id: String = str(sanitized["instance_id"]) + var decor_id := StringName(str(sanitized["decor_id"])) + if seen_instance_ids.has(instance_id): + return {} + seen_instance_ids[instance_id] = true + placed_counts[decor_id] = int( + placed_counts.get(decor_id, 0) + ) + 1 + if ( + int(placed_counts[decor_id]) + > int(sanitized_owned.get(String(decor_id), 0)) + ): + return {} + for previous: Dictionary in sanitized_placements: + if placements_overlap(previous, sanitized): + return {} + sanitized_placements.append(sanitized) + return { + "schema_version": HOME_SCHEMA_VERSION, + "tier": tier, + "exterior_id": exterior_id, + "privacy": privacy, + "owned_decor": sanitized_owned, + "placements": sanitized_placements, + "revision": revision, + "next_instance_sequence": next_sequence, + } + + +static func sanitize_placement(value: Dictionary) -> Dictionary: + for key: String in [ + "instance_id", "decor_id", "mode", "position", "yaw", + ]: + if not value.has(key): + return {} + if ( + typeof(value["instance_id"]) != TYPE_STRING + or typeof(value["decor_id"]) not in [ + TYPE_STRING, TYPE_STRING_NAME, + ] + or not _is_integer_value(value["mode"]) + or typeof(value["position"]) != TYPE_ARRAY + or typeof(value["yaw"]) not in [TYPE_FLOAT, TYPE_INT] + ): + return {} + var instance_id: String = value["instance_id"] + var decor_id := StringName(str(value["decor_id"])) + var mode: int = int(value["mode"]) + var position_values: Array = value["position"] + var yaw: float = float(value["yaw"]) + if ( + instance_id.is_empty() + or instance_id.length() > MAX_INSTANCE_ID_LENGTH + or not DecorCatalogType.has_product(decor_id) + or not _valid_mode(mode) + or position_values.size() != 3 + or not is_finite(yaw) + ): + return {} + for component: Variant in position_values: + if typeof(component) not in [TYPE_FLOAT, TYPE_INT]: + return {} + var position := Vector3( + float(position_values[0]), + float(position_values[1]), + float(position_values[2]), + ) + var normalized := normalized_placement_transform( + decor_id, + position, + yaw, + mode as PlacementMode, + ) + if normalized.is_empty(): + return {} + return { + "instance_id": instance_id, + "decor_id": String(decor_id), + "mode": mode, + "position": _vector3_to_array(normalized["position"]), + "yaw": float(normalized["yaw"]), + } + + +static func _is_integer_value(value: Variant) -> bool: + if typeof(value) == TYPE_INT: + return true + if typeof(value) != TYPE_FLOAT: + return false + var number: float = float(value) + return is_finite(number) and is_equal_approx(number, roundf(number)) + + +static func normalized_placement_transform( + decor_id: StringName, + position: Vector3, + yaw_radians: float, + mode: PlacementMode, +) -> Dictionary: + if ( + not DecorCatalogType.has_product(decor_id) + or not position.is_finite() + or not is_finite(yaw_radians) + or not _valid_mode(mode) + ): + return {} + var normalized_position := Vector3(position.x, 0.0, position.z) + var normalized_yaw: float = wrapf(yaw_radians, -PI, PI) + if mode == PlacementMode.GRID: + normalized_position.x = snappedf(normalized_position.x, GRID_SIZE) + normalized_position.z = snappedf(normalized_position.z, GRID_SIZE) + normalized_yaw = snappedf(normalized_yaw, PI * 0.5) + var footprint: Vector2 = DecorCatalogType.get_footprint(decor_id) + var cosine: float = absf(cos(normalized_yaw)) + var sine: float = absf(sin(normalized_yaw)) + var half_size := Vector2( + (footprint.x * cosine + footprint.y * sine) * 0.5, + (footprint.x * sine + footprint.y * cosine) * 0.5, + ) + var maximum_x: float = ( + INTERIOR_HALF_EXTENTS.x - half_size.x - PLACEMENT_EDGE_PADDING + ) + var maximum_z: float = ( + INTERIOR_HALF_EXTENTS.y - half_size.y - PLACEMENT_EDGE_PADDING + ) + if maximum_x < 0.0 or maximum_z < 0.0: + return {} + # Clamp after grid snapping so a grid-placed item can still sit flush at a + # wall even when the wall itself is not on an exact grid interval. + normalized_position.x = clampf( + normalized_position.x, -maximum_x, maximum_x + ) + normalized_position.z = clampf( + normalized_position.z, -maximum_z, maximum_z + ) + return { + "position": normalized_position, + "yaw": normalized_yaw, + } + + +func _find_nearest_grid_transform( + decor_id: StringName, + origin: Dictionary, + ignored_instance_id: String, + candidate_validator: Callable, +) -> Dictionary: + var origin_position: Vector3 = origin["position"] + var yaw: float = float(origin["yaw"]) + var maximum_ring: int = ceili( + NEAREST_PLACEMENT_SEARCH_DISTANCE / GRID_SIZE + ) + var seen: Dictionary[String, bool] = {} + for ring: int in range(1, maximum_ring + 1): + var nearest: Dictionary = {} + var nearest_distance_squared: float = INF + for x_offset: int in range(-ring, ring + 1): + for z_offset: int in range(-ring, ring + 1): + if maxi(absi(x_offset), absi(z_offset)) != ring: + continue + var candidate: Dictionary = normalized_placement_transform( + decor_id, + origin_position + Vector3( + float(x_offset) * GRID_SIZE, + 0.0, + float(z_offset) * GRID_SIZE, + ), + yaw, + PlacementMode.GRID, + ) + if candidate.is_empty() or not _mark_candidate_unseen( + candidate, seen + ): + continue + if _overlaps_existing( + decor_id, candidate, ignored_instance_id + ) or not _candidate_is_accepted( + candidate, candidate_validator + ): + continue + var candidate_position: Vector3 = candidate["position"] + var distance_squared: float = origin_position.distance_squared_to( + candidate_position + ) + if distance_squared < nearest_distance_squared: + nearest = candidate + nearest_distance_squared = distance_squared + if not nearest.is_empty(): + return nearest + return {} + + +func _find_nearest_free_transform( + decor_id: StringName, + origin: Dictionary, + ignored_instance_id: String, + candidate_validator: Callable, +) -> Dictionary: + var origin_position: Vector3 = origin["position"] + var yaw: float = float(origin["yaw"]) + var maximum_ring: int = ceili( + NEAREST_PLACEMENT_SEARCH_DISTANCE / FREE_PLACEMENT_SEARCH_STEP + ) + var seen: Dictionary[String, bool] = {} + for ring: int in range(1, maximum_ring + 1): + var radius: float = float(ring) * FREE_PLACEMENT_SEARCH_STEP + var nearest: Dictionary = {} + var nearest_distance_squared: float = INF + for angle_index: int in FREE_PLACEMENT_SEARCH_ANGLES: + var angle: float = ( + TAU * float(angle_index) / float(FREE_PLACEMENT_SEARCH_ANGLES) + ) + var candidate: Dictionary = normalized_placement_transform( + decor_id, + origin_position + Vector3( + cos(angle) * radius, 0.0, sin(angle) * radius + ), + yaw, + PlacementMode.FREE, + ) + if candidate.is_empty() or not _mark_candidate_unseen( + candidate, seen + ): + continue + if _overlaps_existing( + decor_id, candidate, ignored_instance_id + ) or not _candidate_is_accepted( + candidate, candidate_validator + ): + continue + var candidate_position: Vector3 = candidate["position"] + var distance_squared: float = origin_position.distance_squared_to( + candidate_position + ) + if distance_squared < nearest_distance_squared: + nearest = candidate + nearest_distance_squared = distance_squared + if not nearest.is_empty(): + return nearest + return {} + + +static func _mark_candidate_unseen( + candidate: Dictionary, + seen: Dictionary[String, bool], +) -> bool: + var position: Vector3 = candidate["position"] + var key := "%d:%d" % [ + roundi(position.x * 10000.0), + roundi(position.z * 10000.0), + ] + if seen.has(key): + return false + seen[key] = true + return true + + +static func _candidate_is_accepted( + candidate: Dictionary, + validator: Callable, +) -> bool: + return not validator.is_valid() or bool(validator.call(candidate)) + + +static func placements_overlap(first: Dictionary, second: Dictionary) -> bool: + var first_id := StringName(str(first.get("decor_id", ""))) + var second_id := StringName(str(second.get("decor_id", ""))) + if ( + not DecorCatalogType.has_product(first_id) + or not DecorCatalogType.has_product(second_id) + ): + return true + var first_position: Vector3 = _array_to_vector3(first.get("position", [])) + var second_position: Vector3 = _array_to_vector3(second.get("position", [])) + var first_yaw: float = float(first.get("yaw", 0.0)) + var second_yaw: float = float(second.get("yaw", 0.0)) + var first_half: Vector2 = ( + DecorCatalogType.get_footprint(first_id) * 0.5 + ) + var second_half: Vector2 = ( + DecorCatalogType.get_footprint(second_id) * 0.5 + ) + var first_axes: Array[Vector2] = _placement_axes(first_yaw) + var second_axes: Array[Vector2] = _placement_axes(second_yaw) + var delta := Vector2( + second_position.x - first_position.x, + second_position.z - first_position.z, + ) + for axis: Vector2 in [ + first_axes[0], first_axes[1], second_axes[0], second_axes[1], + ]: + var first_radius: float = ( + absf(axis.dot(first_axes[0])) * first_half.x + + absf(axis.dot(first_axes[1])) * first_half.y + ) + var second_radius: float = ( + absf(axis.dot(second_axes[0])) * second_half.x + + absf(axis.dot(second_axes[1])) * second_half.y + ) + if absf(delta.dot(axis)) >= ( + first_radius + second_radius - 0.001 + ): + return false + return true + + +func _make_instance_id() -> String: + var result := "decor-%d-%d" % [ + Time.get_ticks_usec(), + _next_instance_sequence, + ] + _next_instance_sequence = mini( + _next_instance_sequence + 1, + MAX_REVISION, + ) + return result + + +func _placement_index(instance_id: String) -> int: + if instance_id.is_empty(): + return -1 + for index: int in _placements.size(): + if str(_placements[index].get("instance_id", "")) == instance_id: + return index + return -1 + + +func _overlaps_existing( + decor_id: StringName, + normalized: Dictionary, + ignored_instance_id: String, +) -> bool: + var candidate: Dictionary = { + "decor_id": String(decor_id), + "position": _vector3_to_array(normalized["position"]), + "yaw": float(normalized["yaw"]), + } + for placement: Dictionary in _placements: + if str(placement.get("instance_id", "")) == ignored_instance_id: + continue + if placements_overlap(candidate, placement): + return true + return false + + +func _touch() -> void: + _revision = mini(_revision + 1, MAX_REVISION) + changed.emit() + + +static func _valid_mode(value: int) -> bool: + return value >= PlacementMode.GRID and value <= PlacementMode.FREE + + +static func _vector3_to_array(value: Vector3) -> Array[float]: + return [value.x, value.y, value.z] + + +static func _array_to_vector3(value: Variant) -> Vector3: + if typeof(value) != TYPE_ARRAY or (value as Array).size() != 3: + return Vector3.INF + var components: Array = value + return Vector3( + float(components[0]), + float(components[1]), + float(components[2]), + ) + + +static func _placement_axes(yaw: float) -> Array[Vector2]: + var cosine: float = cos(yaw) + var sine: float = sin(yaw) + return [Vector2(cosine, sine), Vector2(-sine, cosine)] diff --git a/homes/player_home_state.gd.uid b/homes/player_home_state.gd.uid new file mode 100644 index 0000000..37836c6 --- /dev/null +++ b/homes/player_home_state.gd.uid @@ -0,0 +1 @@ +uid://ggfdoak2ixxx diff --git a/inventory/player_bag.gd b/inventory/player_bag.gd index e33f1e4..d94845d 100644 --- a/inventory/player_bag.gd +++ b/inventory/player_bag.gd @@ -60,6 +60,28 @@ func add_item(item_id: StringName, quantity: int = 1) -> bool: return true +func add_item_to_storage(item_id: StringName, quantity: int = 1) -> bool: + var existing: OwnedItemType = get_owned_item(item_id) + if existing != null: + return add_item(item_id, quantity) + var item: ItemDataType = _resolve_available_item(item_id) + if ( + item == null + or quantity <= 0 + or quantity > (item.max_stack if item.stackable else 1) + or _inventory_layout == null + or not _inventory_layout.can_accept_item_in_storage(item_id) + ): + return false + var owned := OwnedItemType.new() + owned.item_id = item_id + owned.quantity = quantity + owned.storage_slot = _first_available_storage_slot(item, _items) + _items.append(owned) + contents_changed.emit() + return true + + func can_add_item(item_id: StringName, quantity: int = 1) -> bool: var item: ItemDataType = _resolve_available_item(item_id) if item == null or quantity <= 0: diff --git a/inventory/player_hotbar.gd b/inventory/player_hotbar.gd index b7d5197..36068ea 100644 --- a/inventory/player_hotbar.gd +++ b/inventory/player_hotbar.gd @@ -314,6 +314,25 @@ func get_fish_slots() -> Array[StringName]: return _fish_slots.duplicate() +func find_item_slot(item_id: StringName) -> int: + return _slots.find(item_id) + + +func find_first_empty_slot() -> int: + for slot_index: int in SLOT_COUNT: + if get_assignment_kind(slot_index) != AssignmentKind.EMPTY: + continue + if ( + _inventory_layout == null + or _inventory_layout.get_key_at( + PlayerInventoryLayout.InventoryContainer.HOTBAR, + slot_index, + ).is_empty() + ): + return slot_index + return -1 + + func replace_state( slots: Array[StringName], selected_slot: int, diff --git a/inventory/player_inventory_layout.gd b/inventory/player_inventory_layout.gd index 244e10b..bce726e 100644 --- a/inventory/player_inventory_layout.gd +++ b/inventory/player_inventory_layout.gd @@ -37,6 +37,7 @@ var _fish_inventory: FishInventoryType var _item_catalog: ItemCatalogType var _storage_capacity: PlayerCoolerCapacityType var _placements: Dictionary[String, Dictionary] = {} +var _prepared_item_placements: Dictionary[String, Dictionary] = {} var _reconciling: bool = false var _backpack_level: int = 0 @@ -72,7 +73,44 @@ func can_accept_item(item_id: StringName) -> bool: if not is_managed_item(item_id): return true var key := item_key(item_id) - return _placements.has(key) or _first_free_slot(InventoryContainer.INVENTORY) >= 0 + return ( + _placements.has(key) + or _is_prepared_item_placement_available(key) + or _first_free_slot(InventoryContainer.INVENTORY) >= 0 + ) + + +func prepare_new_item_placement( + item_id: StringName, + target_container: InventoryContainer, + target_slot: int, +) -> bool: + if not is_managed_item(item_id): + return false + var key := item_key(item_id) + if ( + _placements.has(key) + or not _is_slot_valid(target_container, target_slot) + or not _key_at(target_container, target_slot).is_empty() + or _prepared_slot_is_occupied(target_container, target_slot) + ): + return false + _prepared_item_placements[key] = { + "container": int(target_container), + "slot": target_slot, + } + return true + + +func cancel_prepared_item_placement(item_id: StringName) -> void: + _prepared_item_placements.erase(item_key(item_id)) + + +func can_accept_item_in_storage(item_id: StringName) -> bool: + if not is_managed_item(item_id): + return true + var key := item_key(item_id) + return _placements.has(key) or _first_free_slot(InventoryContainer.STORAGE) >= 0 func can_accept_catch(catch_id: StringName = StringName()) -> bool: @@ -332,6 +370,7 @@ func restore_from_save_data(data: Dictionary) -> bool: "container": container, "slot": slot, } + _prepared_item_placements.clear() _placements = restored _reconcile(true) return true @@ -340,6 +379,7 @@ func restore_from_save_data(data: Dictionary) -> bool: func reset_to_defaults() -> void: var capacity_changed := _backpack_level != 0 _backpack_level = 0 + _prepared_item_placements.clear() _placements.clear() _reconcile(true) if capacity_changed: @@ -402,8 +442,17 @@ func _reconcile(force_signal: bool) -> void: for key: String in expected: if _placements.has(key): continue + var prepared: Dictionary = _prepared_item_placements.get(key, {}) var target_container := InventoryContainer.INVENTORY - var target_slot := _first_free_slot(target_container) + var target_slot: int = -1 + if _is_prepared_item_placement_available(key): + target_container = int( + prepared["container"] + ) as InventoryContainer + target_slot = int(prepared["slot"]) + _prepared_item_placements.erase(key) + if target_slot < 0: + target_slot = _first_free_slot(target_container) if target_slot < 0: target_container = InventoryContainer.STORAGE target_slot = _first_free_slot(target_container) @@ -484,6 +533,37 @@ func _first_free_slot(container: InventoryContainer) -> int: return -1 +func _is_prepared_item_placement_available(key: String) -> bool: + var placement: Dictionary = _prepared_item_placements.get(key, {}) + if placement.is_empty(): + return false + var container: int = int(placement.get("container", -1)) + var slot: int = int(placement.get("slot", -1)) + if ( + container not in [ + InventoryContainer.INVENTORY, + InventoryContainer.STORAGE, + InventoryContainer.HOTBAR, + ] + or not _is_slot_valid(container as InventoryContainer, slot) + ): + return false + return _key_at(container as InventoryContainer, slot).is_empty() + + +func _prepared_slot_is_occupied( + container: InventoryContainer, + slot: int, +) -> bool: + for placement: Dictionary in _prepared_item_placements.values(): + if ( + int(placement.get("container", -1)) == int(container) + and int(placement.get("slot", -1)) == slot + ): + return true + return false + + func _key_at(container: InventoryContainer, slot: int) -> String: for key: String in _placements: var placement: Dictionary = _placements[key] diff --git a/items/catalog/basic_cube.tres b/items/catalog/basic_cube.tres new file mode 100644 index 0000000..86a2cf9 --- /dev/null +++ b/items/catalog/basic_cube.tres @@ -0,0 +1,17 @@ +[gd_resource type="Resource" script_class="ItemData" load_steps=3 format=3] + +[ext_resource type="Script" path="res://items/item_data.gd" id="1_item"] +[ext_resource type="Texture2D" path="res://ui/icons/pictograms/x_light.png" id="2_icon"] + +[resource] +script = ExtResource("1_item") +item_id = &"basic_cube" +display_name = "basic cube" +description = "a simple piece of decor for testing your RV layout." +category = 6 +icon = ExtResource("2_icon") +stackable = true +max_stack = 32 +usable = false +equippable = true +hotbar_allowed = true diff --git a/items/catalog/item_catalog.tres b/items/catalog/item_catalog.tres index 63ef3ea..2f15e0a 100644 --- a/items/catalog/item_catalog.tres +++ b/items/catalog/item_catalog.tres @@ -1,4 +1,4 @@ -[gd_resource type="Resource" script_class="ItemCatalog" load_steps=41 format=3] +[gd_resource type="Resource" script_class="ItemCatalog" load_steps=42 format=3] [ext_resource type="Script" path="res://items/item_catalog.gd" id="1_script"] [ext_resource type="Resource" path="res://items/catalog/basic_fishing_rod.tres" id="2_rod"] @@ -40,7 +40,8 @@ [ext_resource type="Resource" path="res://items/catalog/crab_net.tres" id="39_crab_net"] [ext_resource type="Resource" path="res://items/catalog/standard_shovel.tres" id="40_shovel"] [ext_resource type="Resource" path="res://items/catalog/fishing_net.tres" id="41_fishing_net"] +[ext_resource type="Resource" path="res://items/catalog/basic_cube.tres" id="42_basic_cube"] [resource] script = ExtResource("1_script") -items = [ExtResource("2_rod"), ExtResource("3_coffee"), ExtResource("4_energy"), ExtResource("5_snack"), ExtResource("6_finder"), ExtResource("8_art_kit"), ExtResource("9_worms"), ExtResource("10_snails"), ExtResource("11_shrimp"), ExtResource("12_squid"), ExtResource("14_sardine"), ExtResource("13_anchovy"), ExtResource("15_roe"), ExtResource("16_standby"), ExtResource("17_batteries"), ExtResource("18_cardboard"), ExtResource("19_pond"), ExtResource("20_river"), ExtResource("21_lake"), ExtResource("22_salt"), ExtResource("23_whisker"), ExtResource("24_reef"), ExtResource("25_moonbeam"), ExtResource("26_sun"), ExtResource("27_rain"), ExtResource("28_fog"), ExtResource("29_guide"), ExtResource("30_small"), ExtResource("31_heavy"), ExtResource("32_rocket"), ExtResource("33_lucky"), ExtResource("34_showboat"), ExtResource("35_deep"), ExtResource("36_oddity"), ExtResource("37_aurora"), ExtResource("38_magnet"), ExtResource("39_crab_net"), ExtResource("40_shovel"), ExtResource("41_fishing_net")] +items = [ExtResource("2_rod"), ExtResource("3_coffee"), ExtResource("4_energy"), ExtResource("5_snack"), ExtResource("6_finder"), ExtResource("8_art_kit"), ExtResource("9_worms"), ExtResource("10_snails"), ExtResource("11_shrimp"), ExtResource("12_squid"), ExtResource("14_sardine"), ExtResource("13_anchovy"), ExtResource("15_roe"), ExtResource("16_standby"), ExtResource("17_batteries"), ExtResource("18_cardboard"), ExtResource("19_pond"), ExtResource("20_river"), ExtResource("21_lake"), ExtResource("22_salt"), ExtResource("23_whisker"), ExtResource("24_reef"), ExtResource("25_moonbeam"), ExtResource("26_sun"), ExtResource("27_rain"), ExtResource("28_fog"), ExtResource("29_guide"), ExtResource("30_small"), ExtResource("31_heavy"), ExtResource("32_rocket"), ExtResource("33_lucky"), ExtResource("34_showboat"), ExtResource("35_deep"), ExtResource("36_oddity"), ExtResource("37_aurora"), ExtResource("38_magnet"), ExtResource("39_crab_net"), ExtResource("40_shovel"), ExtResource("41_fishing_net"), ExtResource("42_basic_cube")] diff --git a/main/main.gd b/main/main.gd index e9dc78f..8335c69 100644 --- a/main/main.gd +++ b/main/main.gd @@ -37,6 +37,9 @@ const FishingShopType = preload("res://ui/fishing_shop.gd") const FishingShopInteractionType = preload( "res://world/fishing_shop_interaction.gd" ) +const DecorShopInteractionType = preload( + "res://world/decor_shop_interaction.gd" +) const PlayerStorageInteractionType = preload( "res://world/player_storage_interaction.gd" ) @@ -70,6 +73,7 @@ const NetworkFishingServiceType = preload( "res://network/network_fishing_service.gd" ) const PlayerHotbarType = preload("res://inventory/player_hotbar.gd") +const DecorCatalogType = preload("res://homes/decor_catalog.gd") const NetworkSaleServiceType = preload( "res://network/network_sale_service.gd" ) @@ -123,6 +127,14 @@ const GatheringControllerType = preload( const NetworkWorldSpawnServiceType = preload( "res://network/network_world_spawn_service.gd" ) +const PlayerHomeStateType = preload("res://homes/player_home_state.gd") +const HomeWorldServiceType = preload("res://homes/home_world_service.gd") +const NetworkHomeServiceType = preload( + "res://network/network_home_service.gd" +) +const HomeDecorControllerType = preload( + "res://homes/home_decor_controller.gd" +) const TITLE_MUSIC_SILENCE_DB: float = -80.0 const TITLE_MUSIC_PATH: String = ( @@ -153,6 +165,7 @@ const DEDICATED_ACTIVE_PHYSICS_TICKS_PER_SECOND: int = 30 @onready var _game_ui: GameUIType = %GameUI @onready var _water_recovery: WaterRecoveryControllerType = %WaterRecovery @onready var _save_manager: PlayerSaveManagerType = %PlayerSaveManager +@onready var _home_state: PlayerHomeStateType = %PlayerHomeState @onready var _settings_manager: PlayerSettingsManagerType = %PlayerSettingsManager @onready var _controller_mapping_manager: ControllerMappingManagerType = ( %ControllerMappingManager @@ -212,6 +225,10 @@ const DEDICATED_ACTIVE_PHYSICS_TICKS_PER_SECOND: int = 30 ) @onready var _network_sale: NetworkSaleServiceType = %NetworkSaleService @onready var _network_shop: NetworkShopServiceType = %NetworkShopService +@onready var _network_home: NetworkHomeServiceType = %NetworkHomeService +@onready var _home_decor_controller: HomeDecorControllerType = ( + %HomeDecorController +) @onready var _network_item_use: NetworkItemUseServiceType = ( %NetworkItemUseService ) @@ -234,6 +251,7 @@ const DEDICATED_ACTIVE_PHYSICS_TICKS_PER_SECOND: int = 30 @onready var _players_root: Node3D = $Players @onready var _surface_drawings_root: Node3D = $SurfaceDrawings @onready var _world_gatherables_root: Node3D = $WorldGatherables +@onready var _home_world: HomeWorldServiceType = %HomeWorldService @onready var _title_background: ColorRect = %TitleBackground @onready var _player_menu_backdrop: ColorRect = %PlayerMenuBackdrop @onready var _shop_backdrop: ColorRect = %ShopBackdrop @@ -241,6 +259,7 @@ const DEDICATED_ACTIVE_PHYSICS_TICKS_PER_SECOND: int = 30 var _gameplay_started: bool = false var _save_slots := PlayerSaveSlotCatalogType.new() var _shop_interaction: FishingShopInteractionType +var _decor_shop_interaction: DecorShopInteractionType var _storage_interaction: PlayerStorageInteractionType var _title_music_tween: Tween var _title_music_transition_generation: int = 0 @@ -740,6 +759,7 @@ func _initialize_application(dedicated: bool) -> void: _player.inventory_layout, ) _shop_interaction = _test_world.get_fishing_shop() + _decor_shop_interaction = _test_world.get_decor_shop() _storage_interaction = _test_world.get_player_storage() if not dedicated: _shop_interaction.setup_local_player(_player) @@ -749,6 +769,10 @@ func _initialize_application(dedicated: bool) -> void: _game_ui.set_shop_npc_player_in_range( _shop_interaction.is_local_player_in_range() ) + _decor_shop_interaction.setup_local_player(_player) + _decor_shop_interaction.local_player_range_changed.connect( + _on_decor_shop_range_changed + ) _storage_interaction.setup_local_player(_player) _storage_interaction.local_player_range_changed.connect( _on_storage_range_changed @@ -770,6 +794,23 @@ func _initialize_application(dedicated: bool) -> void: _world_weather, _player_jobs, _player, + _home_state, + ) + _home_world.setup( + _test_world, + _player_spawn_service, + _network_session, + dedicated, + ) + _network_home.setup( + _network_session, + _player_spawn_service, + _home_state, + _save_manager, + _home_world, + _player.bag, + _player.inventory_layout, + _player.hotbar, ) _player_jobs.set_save_manager(_save_manager) _save_manager.set_autosave_enabled(false) @@ -903,6 +944,9 @@ func _initialize_application(dedicated: bool) -> void: _save_manager, _asset_reservations, _player.inventory_layout, + _home_state, + _network_home, + _decor_shop_interaction, ) _fishing_spot.setup( _player, @@ -942,11 +986,13 @@ func _initialize_application(dedicated: bool) -> void: _player.fishing_upgrades, _shop_interaction, _storage_interaction, + _decor_shop_interaction, _player.item_effects, _player.cooler_capacity, _network_session, _network_sale, _network_shop, + _home_state, _network_chat, _network_profile, _player_spawn_service, @@ -964,6 +1010,21 @@ func _initialize_application(dedicated: bool) -> void: _test_world.get_world_environment(), _test_world.get_sun(), ) + _home_decor_controller.setup( + _player, + _player.hotbar, + _player.bag, + _home_state, + _network_home, + _home_world, + _fishing_spot, + _game_ui.get_home_decor_toolbar(), + ) + _game_ui.get_player_storage().decorate_requested.connect( + _home_decor_controller.begin_decorating + ) + _network_home.local_space_changed.connect(_on_local_home_space_changed) + _game_ui.rv_storage_requested.connect(_on_rv_storage_requested) _game_ui.setup_data_and_identity( _data_root, _identity_backups, @@ -1475,6 +1536,9 @@ func _input(event: InputEvent) -> void: if _game_ui.get_player_storage().consume_escape(): get_viewport().set_input_as_handled() return + if _game_ui.get_decor_shop().consume_escape(): + get_viewport().set_input_as_handled() + return if fishing_shop.consume_escape(): get_viewport().set_input_as_handled() return @@ -1573,19 +1637,50 @@ func _is_pause_open_request(event: InputEvent) -> bool: func _unhandled_input(event: InputEvent) -> void: + if ( + _gameplay_started + and event.is_action_pressed("fish_primary") + and not (event is InputEventKey and event.echo) + and _fishing_spot.try_use_active_non_fishing_item() + ): + get_viewport().set_input_as_handled() + return if ( not _gameplay_started or not event.is_action_pressed("interact") or (event is InputEventKey and event.echo) ): return + var home_owner: String = _network_home.get_local_home_owner_fingerprint() + if not home_owner.is_empty(): + if _home_world.is_avatar_near_interior_exit(_player, home_owner): + if _network_home.request_exit(): + _game_ui.set_storage_prompt_visible(false) + get_viewport().set_input_as_handled() + return + if ( + _network_home.can_local_decorate() + and _fishing_spot.can_open_fishing_shop() + and _game_ui.get_player_storage().open_storage_from_home(true) + ): + _game_ui.set_storage_prompt_visible(false) + get_viewport().set_input_as_handled() + return + var nearby_home_owner: String = _home_world.find_nearby_exterior_owner( + _player + ) + if not nearby_home_owner.is_empty(): + if _network_home.request_enter(nearby_home_owner): + _game_ui.set_storage_prompt_visible(false) + get_viewport().set_input_as_handled() + return if ( - _storage_interaction != null - and _storage_interaction.is_local_player_in_range() + _decor_shop_interaction != null + and _decor_shop_interaction.is_local_player_in_range() and _fishing_spot.can_open_fishing_shop() - and _game_ui.get_player_storage().open_storage() + and _game_ui.get_decor_shop().open_shop() ): - _game_ui.set_storage_prompt_visible(false) + _game_ui.set_shop_prompt_visible(false) get_viewport().set_input_as_handled() return if ( @@ -1608,25 +1703,28 @@ func _process(delta: float) -> void: ) _print_dedicated_metrics() return - var show_shop_prompt := _can_show_shop_prompt() + var show_decor_shop_prompt := _can_show_decor_shop_prompt() + var show_shop_prompt := show_decor_shop_prompt or _can_show_shop_prompt() var shop_prompt_anchor := ( - _shop_interaction.get_prompt_anchor_position() - if _shop_interaction != null - else Vector3.ZERO + _decor_shop_interaction.get_prompt_anchor_position() + if show_decor_shop_prompt + else ( + _shop_interaction.get_prompt_anchor_position() + if _shop_interaction != null else Vector3.ZERO + ) ) _game_ui.set_shop_prompt_visible( show_shop_prompt, shop_prompt_anchor, ) - var show_storage_prompt := _can_show_storage_prompt() - var storage_prompt_anchor := ( - _storage_interaction.get_prompt_anchor_position() - if _storage_interaction != null - else Vector3.ZERO - ) + var home_prompt := _get_home_prompt() _game_ui.set_storage_prompt_visible( - show_storage_prompt, - storage_prompt_anchor, + not home_prompt.is_empty(), + home_prompt.get("anchor", Vector3.ZERO), + str(home_prompt.get("label", "enter RV")), + ) + _game_ui.set_rv_storage_button_visible( + _can_show_rv_storage_button() ) @@ -2421,6 +2519,7 @@ func _apply_world( if _application_initialized: _refresh_active_world_bindings() _network_world_spawns.refresh_world_context() + _network_home.refresh_world_presentations() if _application_initialized and not _dedicated_runtime: _water_recovery.update_world_context( spawn_transform, @@ -2450,10 +2549,19 @@ func _refresh_active_world_bindings() -> void: _storage_interaction.local_player_range_changed.disconnect( _on_storage_range_changed ) + if is_instance_valid(_decor_shop_interaction): + if _decor_shop_interaction.local_player_range_changed.is_connected( + _on_decor_shop_range_changed + ): + _decor_shop_interaction.local_player_range_changed.disconnect( + _on_decor_shop_range_changed + ) _shop_interaction = _test_world.get_fishing_shop() + _decor_shop_interaction = _test_world.get_decor_shop() _storage_interaction = _test_world.get_player_storage() _network_sale.set_shop_interaction(_shop_interaction) _network_shop.set_shop_interaction(_shop_interaction) + _network_shop.set_decor_shop_interaction(_decor_shop_interaction) if _dedicated_runtime: return if _shop_interaction != null: @@ -2466,9 +2574,15 @@ func _refresh_active_world_bindings() -> void: _storage_interaction.local_player_range_changed.connect( _on_storage_range_changed ) + if _decor_shop_interaction != null: + _decor_shop_interaction.setup_local_player(_player) + _decor_shop_interaction.local_player_range_changed.connect( + _on_decor_shop_range_changed + ) _game_ui.set_world_interactions( _shop_interaction, _storage_interaction, + _decor_shop_interaction, ) _on_shop_range_changed( _shop_interaction != null @@ -2478,6 +2592,10 @@ func _refresh_active_world_bindings() -> void: _storage_interaction != null and _storage_interaction.is_local_player_in_range() ) + _on_decor_shop_range_changed( + _decor_shop_interaction != null + and _decor_shop_interaction.is_local_player_in_range() + ) func _on_water_recovery_starting() -> void: @@ -2491,6 +2609,7 @@ func _on_water_recovery_starting() -> void: _game_ui.close_player_menu_for_water_recovery() _game_ui.get_pause_menu().close_for_water_recovery() _game_ui.get_fishing_shop().close_for_water_recovery() + _game_ui.get_decor_shop().close_for_water_recovery() _game_ui.get_player_storage().close_for_water_recovery() @@ -2552,6 +2671,12 @@ func _on_active_hotbar_item_changed( and item.is_available() and _player.bag.owns_item(item_id) ) + var active_is_decor: bool = ( + DecorCatalogType.has_product(item_id) + and item != null + and item.is_available() + and _player.bag.owns_item(item_id) + ) _player.set_active_fishing_rod( item as FishingRodDataType if active_is_rod else null, true, @@ -2562,6 +2687,7 @@ func _on_active_hotbar_item_changed( ) _player.set_active_catching_net(active_is_catching_net) _player.set_active_shovel(active_is_shovel) + _player.set_active_decor_package(active_is_decor) _game_ui.set_surface_drawing_hotbar_selected(active_is_art_kit) _network_item_use.submit_local_equipped(item_id, active_is_rod or ( item != null and _player.bag.owns_item(item_id) @@ -2698,7 +2824,13 @@ func _exit_tree() -> void: func _on_shop_range_changed(in_range: bool) -> void: - _game_ui.set_shop_npc_player_in_range(in_range) + _game_ui.set_shop_npc_player_in_range( + in_range + or ( + _decor_shop_interaction != null + and _decor_shop_interaction.is_local_player_in_range() + ) + ) if not in_range: _game_ui.get_fishing_shop().close_for_range_exit() _game_ui.set_shop_prompt_visible(_can_show_shop_prompt()) @@ -2707,7 +2839,50 @@ func _on_shop_range_changed(in_range: bool) -> void: func _on_storage_range_changed(in_range: bool) -> void: if not in_range: _game_ui.get_player_storage().close_for_range_exit() - _game_ui.set_storage_prompt_visible(_can_show_storage_prompt()) + var prompt := _get_home_prompt() + _game_ui.set_storage_prompt_visible( + not prompt.is_empty(), + prompt.get("anchor", Vector3.ZERO), + str(prompt.get("label", "enter RV")), + ) + _game_ui.set_rv_storage_button_visible( + _can_show_rv_storage_button() + ) + + +func _on_decor_shop_range_changed(in_range: bool) -> void: + _game_ui.set_shop_npc_player_in_range( + in_range + or ( + _shop_interaction != null + and _shop_interaction.is_local_player_in_range() + ) + ) + if not in_range: + _game_ui.get_decor_shop().close_for_range_exit() + _game_ui.set_shop_prompt_visible( + _can_show_shop_prompt() or _can_show_decor_shop_prompt() + ) + + +func _on_local_home_space_changed( + space_id: StringName, + _owner_fingerprint: String, +) -> void: + var inside_rv: bool = String(space_id).begins_with("rv:") + _fishing_spot.set_fishing_environment_enabled(not inside_rv) + _game_ui.set_rv_interior_camera_mode( + inside_rv + ) + _game_ui.set_rv_storage_button_visible( + _can_show_rv_storage_button() + ) + + +func _on_rv_storage_requested() -> void: + if not _can_show_rv_storage_button(): + return + _game_ui.get_player_storage().open_storage_from_home(true) func _can_show_shop_prompt() -> bool: @@ -2716,18 +2891,66 @@ func _can_show_shop_prompt() -> bool: and _shop_interaction != null and _shop_interaction.is_local_player_in_range() and not _game_ui.get_fishing_shop().visible + and not _game_ui.get_decor_shop().visible + and not _water_recovery.is_recovery_active() + and _fishing_spot.can_open_fishing_shop() + ) + + +func _can_show_decor_shop_prompt() -> bool: + return ( + _gameplay_started + and _decor_shop_interaction != null + and _decor_shop_interaction.is_local_player_in_range() + and not _game_ui.get_decor_shop().visible + and not _game_ui.get_fishing_shop().visible and not _water_recovery.is_recovery_active() and _fishing_spot.can_open_fishing_shop() ) func _can_show_storage_prompt() -> bool: + return not _get_home_prompt().is_empty() + + +func _can_show_rv_storage_button() -> bool: return ( _gameplay_started - and _storage_interaction != null - and _storage_interaction.is_local_player_in_range() - and not _game_ui.get_player_storage().visible - and not _game_ui.get_fishing_shop().visible + and not _network_home.get_local_home_owner_fingerprint().is_empty() + and _network_home.can_local_decorate() and not _water_recovery.is_recovery_active() and _fishing_spot.can_open_fishing_shop() ) + + +func _get_home_prompt() -> Dictionary: + if ( + not _gameplay_started + or _game_ui.get_player_storage().visible + or _game_ui.get_fishing_shop().visible + or _game_ui.get_decor_shop().visible + or _water_recovery.is_recovery_active() + or not _fishing_spot.can_open_fishing_shop() + ): + return {} + var owner_fingerprint: String = ( + _network_home.get_local_home_owner_fingerprint() + ) + if not owner_fingerprint.is_empty(): + if _home_world.is_avatar_near_interior_exit( + _player, owner_fingerprint + ): + return { + "label": "leave RV", + "anchor": _home_world.get_interior_prompt_position( + owner_fingerprint + ), + } + return {} + var nearby_owner: String = _home_world.find_nearby_exterior_owner(_player) + if nearby_owner.is_empty(): + return {} + return { + "label": "enter RV", + "anchor": _home_world.get_exterior_prompt_position(nearby_owner), + } diff --git a/main/main.tscn b/main/main.tscn index c1380d6..778a1d4 100644 --- a/main/main.tscn +++ b/main/main.tscn @@ -58,6 +58,10 @@ [ext_resource type="Resource" path="res://gathering/catalog/gatherable_catalog.tres" id="58_gatherable_catalog"] [ext_resource type="Script" path="res://network/network_world_spawn_service.gd" id="59_world_spawns"] [ext_resource type="Script" path="res://gathering/gathering_controller.gd" id="60_gathering_controller"] +[ext_resource type="Script" path="res://homes/player_home_state.gd" id="61_home_state"] +[ext_resource type="Script" path="res://homes/home_world_service.gd" id="62_home_world"] +[ext_resource type="Script" path="res://network/network_home_service.gd" id="63_network_home"] +[ext_resource type="Script" path="res://homes/home_decor_controller.gd" id="64_home_decor_controller"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_title_grass_native"] shader = ExtResource("42_menu_pattern") @@ -259,6 +263,14 @@ script = ExtResource("22_network_sale") unique_name_in_owner = true script = ExtResource("23_network_shop") +[node name="NetworkHomeService" type="Node" parent="."] +unique_name_in_owner = true +script = ExtResource("63_network_home") + +[node name="HomeDecorController" type="Node" parent="."] +unique_name_in_owner = true +script = ExtResource("64_home_decor_controller") + [node name="NetworkItemUseService" type="Node" parent="." unique_id=255154670] unique_name_in_owner = true script = ExtResource("24_network_item") @@ -322,6 +334,10 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.3999481, 12.07081) [node name="WorldGatherables" type="Node3D" parent="."] +[node name="HomeWorldService" type="Node3D" parent="."] +unique_name_in_owner = true +script = ExtResource("62_home_world") + [node name="GatheringController" type="Node3D" parent="."] unique_name_in_owner = true script = ExtResource("60_gathering_controller") @@ -338,6 +354,10 @@ script = ExtResource("8_recovery") unique_name_in_owner = true script = ExtResource("9_save") +[node name="PlayerHomeState" type="Node" parent="."] +unique_name_in_owner = true +script = ExtResource("61_home_state") + [node name="PlayerSettingsManager" type="Node" parent="." unique_id=906991991] unique_name_in_owner = true script = ExtResource("10_settings") diff --git a/network/network_home_protocol.gd b/network/network_home_protocol.gd new file mode 100644 index 0000000..62b8488 --- /dev/null +++ b/network/network_home_protocol.gd @@ -0,0 +1,176 @@ +class_name NetworkHomeProtocol +extends RefCounted + +const PlayerHomeStateType = preload("res://homes/player_home_state.gd") + +const CAPABILITY: StringName = &"portable_home_v1" +const RELIABLE_CHANNEL: int = NetworkProtocol.HOME_RELIABLE_CHANNEL +const MAX_ID_LENGTH: int = 96 +const MAX_MESSAGE_LENGTH: int = 160 +const WORLD_SPACE: StringName = &"world" + +enum TransitionAction { + ENTER, + EXIT, +} + + +static func make_space_id(owner_fingerprint: String) -> StringName: + return StringName("rv:%s" % owner_fingerprint) + + +static func manifest_digest(home_data: Dictionary) -> String: + var sanitized: Dictionary = PlayerHomeStateType.sanitize_save_data(home_data) + if sanitized.is_empty(): + return "" + var canonical_owned: Array[Dictionary] = [] + var owned: Dictionary = sanitized["owned_decor"] + var owned_ids: Array[String] = [] + for value: Variant in owned.keys(): + owned_ids.append(str(value)) + owned_ids.sort() + for decor_id: String in owned_ids: + canonical_owned.append({ + "id": decor_id, + "quantity": int(owned[decor_id]), + }) + var placements: Array[Dictionary] = [] + for value: Variant in sanitized["placements"]: + placements.append((value as Dictionary).duplicate(true)) + placements.sort_custom(func(first: Dictionary, second: Dictionary) -> bool: + return str(first["instance_id"]) < str(second["instance_id"]) + ) + var canonical: Dictionary = { + "schema_version": int(sanitized["schema_version"]), + "tier": int(sanitized["tier"]), + "exterior_id": str(sanitized["exterior_id"]), + "privacy": int(sanitized["privacy"]), + "owned": canonical_owned, + "placements": placements, + "revision": int(sanitized["revision"]), + "next_instance_sequence": int(sanitized["next_instance_sequence"]), + } + return JSON.stringify(canonical).sha256_text() + + +static func manifest_signature_fields(data: Dictionary) -> Array: + return [ + str(data.get("session_id", "")), + str(data.get("request_id", "")), + str(data.get("owner_fingerprint", "")), + int((data.get("home", {}) as Dictionary).get("revision", -1)), + str(data.get("digest", "")), + ] + + +static func validate_manifest_request(value: Variant) -> bool: + if typeof(value) != TYPE_DICTIONARY: + return false + var data: Dictionary = value + if ( + not _valid_id(data.get("request_id")) + or not _valid_id(data.get("session_id")) + or not NetworkIdentityCrypto.valid_fingerprint( + data.get("owner_fingerprint") + ) + or typeof(data.get("home")) != TYPE_DICTIONARY + or typeof(data.get("digest")) != TYPE_STRING + or str(data["digest"]).length() != 64 + or typeof(data.get("sender_signature")) != TYPE_PACKED_BYTE_ARRAY + ): + return false + var sanitized: Dictionary = PlayerHomeStateType.sanitize_save_data( + data["home"] + ) + return ( + not sanitized.is_empty() + and manifest_digest(sanitized) == str(data["digest"]) + ) + + +static func validate_manifest_broadcast(value: Variant) -> bool: + if typeof(value) != TYPE_DICTIONARY: + return false + var data: Dictionary = value + return ( + typeof(data.get("owner_peer_id")) == TYPE_INT + and int(data["owner_peer_id"]) > 0 + and NetworkIdentityCrypto.valid_fingerprint( + data.get("owner_fingerprint") + ) + and typeof(data.get("home")) == TYPE_DICTIONARY + and not PlayerHomeStateType.sanitize_save_data(data["home"]).is_empty() + and _valid_transform(data.get("exterior_transform")) + and typeof(data.get("interior_index")) == TYPE_INT + and int(data["interior_index"]) >= 0 + and int(data["interior_index"]) < 128 + ) + + +static func transition_signature_fields(data: Dictionary) -> Array: + return [ + str(data.get("session_id", "")), + str(data.get("request_id", "")), + int(data.get("action", -1)), + str(data.get("owner_fingerprint", "")), + ] + + +static func validate_transition_request(value: Variant) -> bool: + if typeof(value) != TYPE_DICTIONARY: + return false + var data: Dictionary = value + return ( + _valid_id(data.get("request_id")) + and _valid_id(data.get("session_id")) + and typeof(data.get("action")) == TYPE_INT + and int(data["action"]) >= TransitionAction.ENTER + and int(data["action"]) <= TransitionAction.EXIT + and NetworkIdentityCrypto.valid_fingerprint( + data.get("owner_fingerprint") + ) + and typeof(data.get("sender_signature")) == TYPE_PACKED_BYTE_ARRAY + ) + + +static func transform_to_array(value: Transform3D) -> Array[float]: + return [ + value.basis.x.x, value.basis.x.y, value.basis.x.z, + value.basis.y.x, value.basis.y.y, value.basis.y.z, + value.basis.z.x, value.basis.z.y, value.basis.z.z, + value.origin.x, value.origin.y, value.origin.z, + ] + + +static func array_to_transform(value: Variant) -> Transform3D: + if not _valid_transform(value): + return Transform3D() + var fields: Array = value + return Transform3D( + Basis( + Vector3(float(fields[0]), float(fields[1]), float(fields[2])), + Vector3(float(fields[3]), float(fields[4]), float(fields[5])), + Vector3(float(fields[6]), float(fields[7]), float(fields[8])), + ), + Vector3(float(fields[9]), float(fields[10]), float(fields[11])), + ) + + +static func _valid_transform(value: Variant) -> bool: + if typeof(value) != TYPE_ARRAY or (value as Array).size() != 12: + return false + for component: Variant in value: + if ( + typeof(component) not in [TYPE_FLOAT, TYPE_INT] + or not is_finite(float(component)) + ): + return false + return true + + +static func _valid_id(value: Variant) -> bool: + return ( + typeof(value) == TYPE_STRING + and not str(value).is_empty() + and str(value).length() <= MAX_ID_LENGTH + ) diff --git a/network/network_home_protocol.gd.uid b/network/network_home_protocol.gd.uid new file mode 100644 index 0000000..24b6aae --- /dev/null +++ b/network/network_home_protocol.gd.uid @@ -0,0 +1 @@ +uid://fl3qwiluejhm diff --git a/network/network_home_service.gd b/network/network_home_service.gd new file mode 100644 index 0000000..df4fcde --- /dev/null +++ b/network/network_home_service.gd @@ -0,0 +1,956 @@ +class_name NetworkHomeService +extends Node + +const NetworkHomeProtocolType = preload( + "res://network/network_home_protocol.gd" +) +const PlayerHomeStateType = preload("res://homes/player_home_state.gd") + +signal local_transition_finished(accepted: bool, message: String) +signal local_space_changed(space_id: StringName, owner_fingerprint: String) +signal local_manifest_rejected(message: String) + +const MAX_MANIFESTS: int = 128 + +var _session: NetworkSession +var _spawn_service: PlayerSpawnService +var _local_home: PlayerHomeStateType +var _save_manager: PlayerSaveManager +var _world_service: HomeWorldService +var _bag: PlayerBag +var _inventory_layout: PlayerInventoryLayout +var _hotbar: PlayerHotbar +var _manifests_by_fingerprint: Dictionary[String, Dictionary] = {} +var _fingerprint_by_peer: Dictionary[int, String] = {} +var _authorized_owned_counts: Dictionary[int, Dictionary] = {} +var _authorization_result_owner: Dictionary[String, int] = {} +var _next_interior_index: int = 0 +var _suppress_local_submission: bool = false +var _publish_queued: bool = false + + +func setup( + session: NetworkSession, + spawn_service: PlayerSpawnService, + local_home: PlayerHomeStateType, + save_manager: PlayerSaveManager, + world_service: HomeWorldService, + bag: PlayerBag, + inventory_layout: PlayerInventoryLayout, + hotbar: PlayerHotbar, +) -> void: + _session = session + _spawn_service = spawn_service + _local_home = local_home + _save_manager = save_manager + _world_service = world_service + _bag = bag + _inventory_layout = inventory_layout + _hotbar = hotbar + if not _session.state_changed.is_connected(_on_session_state_changed): + _session.state_changed.connect(_on_session_state_changed) + if not _session.join_authenticated.is_connected(_on_join_authenticated): + _session.join_authenticated.connect(_on_join_authenticated) + if not _session.peer_authenticated.is_connected(_on_peer_authenticated): + _session.peer_authenticated.connect(_on_peer_authenticated) + if not _session.peer_removed.is_connected(_on_peer_removed): + _session.peer_removed.connect(_on_peer_removed) + if not _local_home.changed.is_connected(_on_local_home_changed): + _local_home.changed.connect(_on_local_home_changed) + + +func get_local_space() -> StringName: + if _session == null or not _session.is_gameplay_session_active(): + return NetworkHomeProtocolType.WORLD_SPACE + return _session.get_peer_space(_session.get_local_peer_id()) + + +func get_local_home_owner_fingerprint() -> String: + var space_id: String = String(get_local_space()) + return space_id.trim_prefix("rv:") if space_id.begins_with("rv:") else "" + + +func can_local_decorate() -> bool: + return ( + get_local_home_owner_fingerprint() + == _session.get_local_identity_fingerprint() + ) + + +func get_authoritative_owned_count( + peer_id: int, + decor_id: StringName, +) -> int: + var authorized: Dictionary = _authorized_owned_counts.get(peer_id, {}) + if authorized.has(String(decor_id)): + return int(authorized[String(decor_id)]) + var fingerprint: String = _fingerprint_for_peer(peer_id) + var manifest: Dictionary = _manifests_by_fingerprint.get(fingerprint, {}) + if manifest.is_empty(): + return -1 + var home: Dictionary = manifest.get("home", {}) + var owned: Dictionary = home.get("owned_decor", {}) + return int(owned.get(String(decor_id), 0)) + + +func place_local_decor( + decor_id: StringName, + position: Vector3, + yaw_radians: float, + mode: PlayerHomeStateType.PlacementMode, +) -> String: + if ( + not can_local_decorate() + or _bag == null + or _bag.get_quantity(decor_id) <= 0 + or _world_service == null + ): + return "" + var owner_fingerprint: String = ( + _session.get_local_identity_fingerprint() + ) + var normalized: Dictionary = ( + _local_home.get_nearest_valid_placement_transform( + decor_id, + position, + yaw_radians, + mode, + "", + Callable( + self, "_candidate_clear_of_players" + ).bind(owner_fingerprint, decor_id), + ) + ) + if normalized.is_empty(): + return "" + var instance_id: String = _local_home.place_decor( + decor_id, + normalized["position"], + float(normalized["yaw"]), + mode, + ) + if instance_id.is_empty(): + return "" + if not _bag.remove_item(decor_id, 1): + _local_home.remove_placement(instance_id) + return "" + _save_manager.save_if_dirty() + return instance_id + + +func remove_local_decor(instance_id: String) -> bool: + if ( + not can_local_decorate() + or _bag == null + or _inventory_layout == null + or _hotbar == null + ): + return false + var placement: Dictionary = _local_home.get_placement(instance_id) + if placement.is_empty(): + return false + var decor_id := StringName(str(placement["decor_id"])) + var target_hotbar_slot: int = _hotbar.find_item_slot(decor_id) + if target_hotbar_slot < 0: + target_hotbar_slot = _hotbar.find_first_empty_slot() + var prepared_hotbar_placement: bool = false + if ( + target_hotbar_slot >= 0 + and _inventory_layout.get_container( + PlayerInventoryLayout.EntryKind.ITEM, + decor_id, + ) < 0 + ): + prepared_hotbar_placement = ( + _inventory_layout.prepare_new_item_placement( + decor_id, + PlayerInventoryLayout.InventoryContainer.HOTBAR, + target_hotbar_slot, + ) + ) + var returned_to_inventory: bool = _bag.add_item(decor_id, 1) + if not returned_to_inventory: + if prepared_hotbar_placement: + _inventory_layout.cancel_prepared_item_placement(decor_id) + returned_to_inventory = _bag.add_item_to_storage(decor_id, 1) + if not returned_to_inventory: + return false + if target_hotbar_slot >= 0: + _hotbar.assign_item(target_hotbar_slot, decor_id) + _hotbar.select_slot(target_hotbar_slot) + if not _local_home.remove_placement(instance_id): + _bag.remove_item(decor_id, 1) + return false + _save_manager.save_if_dirty() + return true + + +func update_local_decor( + instance_id: String, + position: Vector3, + yaw_radians: float, + mode: PlayerHomeStateType.PlacementMode, +) -> bool: + var normalized: Dictionary = get_valid_local_decor_transform( + instance_id, position, yaw_radians, mode + ) + if normalized.is_empty(): + return false + if not _local_home.update_placement( + instance_id, + normalized["position"], + float(normalized["yaw"]), + mode, + ): + return false + _save_manager.save_if_dirty() + return true + + +func get_valid_local_decor_transform( + instance_id: String, + position: Vector3, + yaw_radians: float, + mode: PlayerHomeStateType.PlacementMode, +) -> Dictionary: + if not can_local_decorate() or _world_service == null: + return {} + var placement: Dictionary = _local_home.get_placement(instance_id) + if placement.is_empty(): + return {} + var decor_id := StringName(str(placement.get("decor_id", ""))) + return _local_home.get_valid_update_transform( + instance_id, + position, + yaw_radians, + mode, + Callable( + self, "_candidate_clear_of_players" + ).bind( + _session.get_local_identity_fingerprint(), decor_id + ), + ) + + +func _candidate_clear_of_players( + candidate: Dictionary, + owner_fingerprint: String, + decor_id: StringName, +) -> bool: + return ( + _world_service != null + and _world_service.is_decor_placement_clear_of_players( + owner_fingerprint, + decor_id, + candidate["position"], + float(candidate["yaw"]), + ) + ) + + +func request_enter(owner_fingerprint: String) -> bool: + if ( + _session == null + or not _session.is_gameplay_session_active() + or not _manifests_by_fingerprint.has(owner_fingerprint) + or get_local_space() != NetworkHomeProtocolType.WORLD_SPACE + ): + return false + return _submit_transition( + NetworkHomeProtocolType.TransitionAction.ENTER, + owner_fingerprint, + ) + + +func request_exit() -> bool: + var owner_fingerprint: String = get_local_home_owner_fingerprint() + if owner_fingerprint.is_empty(): + return false + return _submit_transition( + NetworkHomeProtocolType.TransitionAction.EXIT, + owner_fingerprint, + ) + + +func authorize_decor_purchase( + peer_id: int, + product_id: StringName, + resulting_count: int, + result_id: String, +) -> void: + if not _session.is_host() or peer_id <= 0 or result_id.is_empty(): + return + var counts: Dictionary = _authorized_owned_counts.get(peer_id, {}) + counts[String(product_id)] = resulting_count + _authorized_owned_counts[peer_id] = counts + _authorization_result_owner[result_id] = peer_id + + +func finalize_decor_purchase( + peer_id: int, + result_id: String, + applied: bool, +) -> void: + if _authorization_result_owner.get(result_id, 0) != peer_id: + return + _authorization_result_owner.erase(result_id) + if applied: + return + _authorized_owned_counts.erase(peer_id) + + +func refresh_world_presentations() -> void: + if _world_service == null: + return + _world_service.clear_presentations() + if not _world_service.is_world_ready(): + return + if not _session.is_host(): + for manifest: Dictionary in _manifests_by_fingerprint.values(): + _world_service.apply_manifest(manifest) + return + var local_fingerprint: String = _session.get_local_identity_fingerprint() + if ( + not _session.is_dedicated_host() + and not _manifests_by_fingerprint.has(local_fingerprint) + ): + publish_local_home() + var fingerprints: Array[String] = [] + fingerprints.assign(_manifests_by_fingerprint.keys()) + fingerprints.sort() + var reserved: Array[Transform3D] = [] + for fingerprint: String in fingerprints: + var manifest: Dictionary = _manifests_by_fingerprint[fingerprint] + var transform: Transform3D = _world_service.choose_exterior_transform( + int(manifest["owner_peer_id"]), reserved + ) + reserved.append(transform) + manifest["exterior_transform"] = ( + NetworkHomeProtocolType.transform_to_array(transform) + ) + _manifests_by_fingerprint[fingerprint] = manifest + _broadcast_manifest(manifest) + for fingerprint: String in fingerprints: + var manifest: Dictionary = _manifests_by_fingerprint[fingerprint] + _spawn_peer_at_exterior( + int(manifest["owner_peer_id"]), fingerprint + ) + + +func publish_local_home() -> bool: + if ( + _session == null + or not _session.is_gameplay_session_active() + or _session.is_dedicated_host() + or _local_home == null + ): + return false + if _session.is_host() and ( + _world_service == null or not _world_service.is_world_ready() + ): + return false + var home_data: Dictionary = _local_home.to_save_data() + var request: Dictionary = { + "request_id": _new_id("home"), + "session_id": _session.get_session_id(), + "owner_fingerprint": _session.get_local_identity_fingerprint(), + "home": home_data, + "digest": NetworkHomeProtocolType.manifest_digest(home_data), + } + request["sender_signature"] = _session.sign_local_action( + "portable_home_manifest", + NetworkHomeProtocolType.manifest_signature_fields(request), + ) + if _session.is_host(): + _process_manifest_request(_session.get_local_peer_id(), request) + else: + submit_home_manifest.rpc_id(1, request) + return true + + +@rpc( + "any_peer", "call_remote", "reliable", + NetworkHomeProtocolType.RELIABLE_CHANNEL, +) +func submit_home_manifest(data: Dictionary) -> void: + var sender_id: int = multiplayer.get_remote_sender_id() + if ( + _session == null + or not _session.is_host() + or not _session.is_authenticated_peer(sender_id) + ): + return + _process_manifest_request(sender_id, data) + + +func _process_manifest_request(peer_id: int, data: Dictionary) -> void: + if ( + not NetworkHomeProtocolType.validate_manifest_request(data) + or str(data["session_id"]) != _session.get_session_id() + ): + _reject_manifest(peer_id, "The RV update was invalid.") + return + var record := _session.get_peer_record(peer_id) + var fingerprint: String = str(data["owner_fingerprint"]) + if ( + record == null + or record.identity_fingerprint != fingerprint + or not _session.verify_peer_action( + peer_id, + "portable_home_manifest", + NetworkHomeProtocolType.manifest_signature_fields(data), + data["sender_signature"], + ) + ): + _reject_manifest(peer_id, "The RV owner could not be verified.") + return + var home_data: Dictionary = PlayerHomeStateType.sanitize_save_data( + data["home"] + ) + var prior: Dictionary = _manifests_by_fingerprint.get(fingerprint, {}) + var is_first_manifest: bool = prior.is_empty() + if not _valid_manifest_revision(peer_id, prior, home_data): + _reject_manifest(peer_id, "The RV update was rejected by the host.") + return + if not _moved_decor_clear_of_players(fingerprint, prior, home_data): + _reject_manifest(peer_id, "A player is in the way of that decor.") + return + var manifest: Dictionary + if prior.is_empty(): + if _manifests_by_fingerprint.size() >= MAX_MANIFESTS: + _reject_manifest(peer_id, "This room cannot place another RV.") + return + var reserved: Array[Transform3D] = [] + for existing: Dictionary in _manifests_by_fingerprint.values(): + reserved.append(NetworkHomeProtocolType.array_to_transform( + existing["exterior_transform"] + )) + var exterior_transform: Transform3D = ( + _world_service.choose_exterior_transform(peer_id, reserved) + ) + manifest = { + "owner_peer_id": peer_id, + "owner_fingerprint": fingerprint, + "home": home_data, + "exterior_transform": ( + NetworkHomeProtocolType.transform_to_array(exterior_transform) + ), + "interior_index": _next_interior_index, + } + _next_interior_index += 1 + else: + manifest = prior.duplicate(true) + manifest["home"] = home_data + manifest["owner_peer_id"] = peer_id + _manifests_by_fingerprint[fingerprint] = manifest + _fingerprint_by_peer[peer_id] = fingerprint + _consume_owned_authorizations(peer_id, home_data) + _broadcast_manifest(manifest) + if is_first_manifest: + _spawn_peer_at_exterior(peer_id, fingerprint) + + +func _valid_manifest_revision( + peer_id: int, + prior_manifest: Dictionary, + home_data: Dictionary, +) -> bool: + if prior_manifest.is_empty(): + # A portable RV is owned by the player's signed local save. A new host has + # no prior room ledger with which to compare its first manifest. + return true + var prior_home: Dictionary = prior_manifest["home"] + if ( + int(home_data["revision"]) <= int(prior_home["revision"]) + or int(home_data["tier"]) != int(prior_home["tier"]) + or str(home_data["exterior_id"]) != str(prior_home["exterior_id"]) + ): + return false + var prior_owned: Dictionary = prior_home["owned_decor"] + var next_owned: Dictionary = home_data["owned_decor"] + var all_ids: Dictionary[String, bool] = {} + for value: Variant in prior_owned.keys(): + all_ids[str(value)] = true + for value: Variant in next_owned.keys(): + all_ids[str(value)] = true + var authorized: Dictionary = _authorized_owned_counts.get(peer_id, {}) + for product_id: String in all_ids: + var prior_count: int = int(prior_owned.get(product_id, 0)) + var next_count: int = int(next_owned.get(product_id, 0)) + if prior_count == next_count: + continue + if next_count < prior_count or int(authorized.get(product_id, -1)) != next_count: + return false + return true + + +func _moved_decor_clear_of_players( + owner_fingerprint: String, + prior_manifest: Dictionary, + home_data: Dictionary, +) -> bool: + if _world_service == null: + return false + var prior_by_instance: Dictionary[String, Dictionary] = {} + if not prior_manifest.is_empty(): + var prior_home: Dictionary = prior_manifest.get("home", {}) + for value: Variant in prior_home.get("placements", []): + if typeof(value) != TYPE_DICTIONARY: + continue + var prior_placement: Dictionary = value + prior_by_instance[str( + prior_placement.get("instance_id", "") + )] = prior_placement + for value: Variant in home_data.get("placements", []): + if typeof(value) != TYPE_DICTIONARY: + return false + var placement: Dictionary = value + var instance_id: String = str(placement.get("instance_id", "")) + var prior_placement: Dictionary = prior_by_instance.get( + instance_id, {} + ) + if ( + not prior_placement.is_empty() + and _same_decor_transform(prior_placement, placement) + ): + continue + var decor_id := StringName(str(placement.get("decor_id", ""))) + var position: Vector3 = _placement_position(placement) + if ( + not position.is_finite() + or not _world_service.is_decor_placement_clear_of_players( + owner_fingerprint, + decor_id, + position, + float(placement.get("yaw", 0.0)), + ) + ): + return false + return true + + +static func _same_decor_transform( + first: Dictionary, + second: Dictionary, +) -> bool: + if str(first.get("decor_id", "")) != str(second.get("decor_id", "")): + return false + var first_position: Vector3 = _placement_position(first) + var second_position: Vector3 = _placement_position(second) + return ( + first_position.is_equal_approx(second_position) + and is_equal_approx( + float(first.get("yaw", 0.0)), + float(second.get("yaw", 0.0)), + ) + ) + + +static func _placement_position(placement: Dictionary) -> Vector3: + var values: Array = placement.get("position", []) + if values.size() != 3: + return Vector3.INF + return Vector3( + float(values[0]), float(values[1]), float(values[2]) + ) + + +func _consume_owned_authorizations(peer_id: int, home_data: Dictionary) -> void: + var authorized: Dictionary = _authorized_owned_counts.get(peer_id, {}) + if authorized.is_empty(): + return + var owned: Dictionary = home_data["owned_decor"] + for product_id: String in authorized.keys(): + if int(owned.get(product_id, -1)) == int(authorized[product_id]): + authorized.erase(product_id) + if authorized.is_empty(): + _authorized_owned_counts.erase(peer_id) + else: + _authorized_owned_counts[peer_id] = authorized + + +func _broadcast_manifest(manifest: Dictionary) -> void: + if _world_service != null and _world_service.is_world_ready(): + _world_service.apply_manifest(manifest) + for peer_id: int in _session.get_authenticated_peer_ids(): + if peer_id == 1: + continue + receive_home_manifest.rpc_id(peer_id, manifest) + + +@rpc( + "authority", "call_remote", "reliable", + NetworkHomeProtocolType.RELIABLE_CHANNEL, +) +func receive_home_manifest(data: Dictionary) -> void: + if not NetworkHomeProtocolType.validate_manifest_broadcast(data): + return + var fingerprint: String = str(data["owner_fingerprint"]) + _manifests_by_fingerprint[fingerprint] = data.duplicate(true) + _fingerprint_by_peer[int(data["owner_peer_id"])] = fingerprint + if _world_service != null and _world_service.is_world_ready(): + _world_service.apply_manifest(data) + + +func _reject_manifest(peer_id: int, message: String) -> void: + var fingerprint: String = _fingerprint_for_peer(peer_id) + var canonical: Dictionary = _manifests_by_fingerprint.get(fingerprint, {}) + if peer_id == _session.get_local_peer_id(): + _apply_manifest_rejection(message, canonical) + else: + receive_home_manifest_rejection.rpc_id(peer_id, message, canonical) + + +@rpc( + "authority", "call_remote", "reliable", + NetworkHomeProtocolType.RELIABLE_CHANNEL, +) +func receive_home_manifest_rejection( + message: String, + canonical: Dictionary, +) -> void: + _apply_manifest_rejection(message, canonical) + + +func _apply_manifest_rejection(message: String, canonical: Dictionary) -> void: + if ( + canonical.is_empty() + or not NetworkHomeProtocolType.validate_manifest_broadcast(canonical) + ): + local_manifest_rejected.emit(message) + return + _suppress_local_submission = true + _local_home.restore_from_save_data(canonical["home"]) + _suppress_local_submission = false + _save_manager.save_if_dirty() + receive_home_manifest(canonical) + local_manifest_rejected.emit(message) + + +func _submit_transition(action: int, owner_fingerprint: String) -> bool: + var request: Dictionary = { + "request_id": _new_id("home_transition"), + "session_id": _session.get_session_id(), + "action": action, + "owner_fingerprint": owner_fingerprint, + } + request["sender_signature"] = _session.sign_local_action( + "portable_home_transition", + NetworkHomeProtocolType.transition_signature_fields(request), + ) + if _session.is_host(): + _process_transition_request(_session.get_local_peer_id(), request) + else: + submit_home_transition.rpc_id(1, request) + return true + + +@rpc( + "any_peer", "call_remote", "reliable", + NetworkHomeProtocolType.RELIABLE_CHANNEL, +) +func submit_home_transition(data: Dictionary) -> void: + var sender_id: int = multiplayer.get_remote_sender_id() + if ( + not _session.is_host() + or not _session.is_authenticated_peer(sender_id) + ): + return + _process_transition_request(sender_id, data) + + +func _process_transition_request(peer_id: int, data: Dictionary) -> void: + if ( + not NetworkHomeProtocolType.validate_transition_request(data) + or str(data["session_id"]) != _session.get_session_id() + or not _session.verify_peer_action( + peer_id, + "portable_home_transition", + NetworkHomeProtocolType.transition_signature_fields(data), + data["sender_signature"], + ) + ): + _send_transition_rejection(peer_id, "The RV transition was invalid.") + return + var owner_fingerprint: String = str(data["owner_fingerprint"]) + var action: int = int(data["action"]) + var avatar: Player = _spawn_service.get_avatar(peer_id) + var manifest: Dictionary = _manifests_by_fingerprint.get( + owner_fingerprint, {} + ) + if avatar == null or manifest.is_empty(): + _send_transition_rejection(peer_id, "That RV is unavailable.") + return + if action == NetworkHomeProtocolType.TransitionAction.ENTER: + var record := _session.get_peer_record(peer_id) + var owner_is_local: bool = ( + record != null and record.identity_fingerprint == owner_fingerprint + ) + var privacy: int = int((manifest["home"] as Dictionary)["privacy"]) + if ( + (not owner_is_local and privacy != PlayerHomeStateType.Privacy.OPEN) + or _session.get_peer_space(peer_id) + != NetworkHomeProtocolType.WORLD_SPACE + or not _world_service.is_avatar_near_exterior( + avatar, owner_fingerprint + ) + ): + _send_transition_rejection(peer_id, "You cannot enter that RV.") + return + _apply_host_transition( + peer_id, + NetworkHomeProtocolType.make_space_id(owner_fingerprint), + owner_fingerprint, + _world_service.get_interior_spawn_transform( + owner_fingerprint, peer_id + ), + ) + return + if ( + _session.get_peer_space(peer_id) + != NetworkHomeProtocolType.make_space_id(owner_fingerprint) + or not _world_service.is_avatar_near_interior_exit( + avatar, owner_fingerprint + ) + ): + _send_transition_rejection(peer_id, "Move closer to the RV door.") + return + _apply_host_transition( + peer_id, + NetworkHomeProtocolType.WORLD_SPACE, + owner_fingerprint, + _world_service.get_exterior_spawn_transform(owner_fingerprint), + ) + + +func _spawn_peer_at_exterior( + peer_id: int, + owner_fingerprint: String, +) -> void: + if ( + not _session.is_host() + or _session.get_peer_space(peer_id) + != NetworkHomeProtocolType.WORLD_SPACE + or _spawn_service.get_avatar(peer_id) == null + ): + return + _apply_host_transition( + peer_id, + NetworkHomeProtocolType.WORLD_SPACE, + owner_fingerprint, + _world_service.get_exterior_spawn_transform(owner_fingerprint), + ) + + +func _apply_host_transition( + peer_id: int, + space_id: StringName, + owner_fingerprint: String, + transform: Transform3D, +) -> void: + var result: Dictionary = { + "peer_id": peer_id, + "space_id": String(space_id), + "owner_fingerprint": owner_fingerprint, + "transform": NetworkHomeProtocolType.transform_to_array(transform), + } + _apply_transition_result(result) + for recipient_id: int in _session.get_authenticated_peer_ids(): + if recipient_id == 1: + continue + receive_home_transition.rpc_id(recipient_id, result) + _session.publish_authoritative_teleport(peer_id) + + +@rpc( + "authority", "call_remote", "reliable", + NetworkHomeProtocolType.RELIABLE_CHANNEL, +) +func receive_home_transition(data: Dictionary) -> void: + if ( + typeof(data.get("peer_id")) != TYPE_INT + or typeof(data.get("space_id")) not in [TYPE_STRING, TYPE_STRING_NAME] + or not NetworkIdentityCrypto.valid_fingerprint( + data.get("owner_fingerprint") + ) + ): + return + var transform: Transform3D = NetworkHomeProtocolType.array_to_transform( + data.get("transform") + ) + if transform == Transform3D(): + return + _apply_transition_result(data) + + +func _apply_transition_result(data: Dictionary) -> void: + var peer_id: int = int(data["peer_id"]) + var space_id := StringName(str(data["space_id"])) + if not _session.set_peer_space(peer_id, space_id): + return + var avatar: Player = _spawn_service.get_avatar(peer_id) + if avatar != null: + avatar.global_transform = NetworkHomeProtocolType.array_to_transform( + data["transform"] + ) + avatar.velocity = Vector3.ZERO + if peer_id == _session.get_local_peer_id(): + _world_service.set_local_space(space_id) + local_space_changed.emit( + space_id, str(data["owner_fingerprint"]) + ) + local_transition_finished.emit(true, "") + _refresh_peer_visibility() + + +func _send_transition_rejection(peer_id: int, message: String) -> void: + if peer_id == _session.get_local_peer_id(): + local_transition_finished.emit(false, message) + else: + receive_home_transition_rejection.rpc_id(peer_id, message) + + +@rpc( + "authority", "call_remote", "reliable", + NetworkHomeProtocolType.RELIABLE_CHANNEL, +) +func receive_home_transition_rejection(message: String) -> void: + local_transition_finished.emit( + false, message.left(NetworkHomeProtocolType.MAX_MESSAGE_LENGTH) + ) + + +func _refresh_peer_visibility() -> void: + var local_peer_id: int = _session.get_local_peer_id() + if local_peer_id <= 0: + return + for peer_id: int in _spawn_service.get_peer_ids(): + if peer_id == local_peer_id: + continue + _spawn_service.set_peer_presentation_visible( + peer_id, _session.peers_share_space(local_peer_id, peer_id) + ) + + +func _on_local_home_changed() -> void: + if _suppress_local_submission or _publish_queued: + return + _publish_queued = true + call_deferred("_publish_queued_home") + + +func _publish_queued_home() -> void: + _publish_queued = false + if _save_manager != null: + _save_manager.save_if_dirty() + publish_local_home() + + +func _on_join_authenticated() -> void: + publish_local_home() + + +func _on_peer_authenticated(peer_id: int, _display_name: String) -> void: + if not _session.is_host(): + return + for manifest: Dictionary in _manifests_by_fingerprint.values(): + receive_home_manifest.rpc_id(peer_id, manifest) + for existing_peer_id: int in _session.get_authenticated_peer_ids(): + if existing_peer_id == peer_id: + continue + var avatar: Player = _spawn_service.get_avatar(existing_peer_id) + if avatar == null: + continue + var space_id: StringName = _session.get_peer_space(existing_peer_id) + var owner_fingerprint: String = ( + String(space_id).trim_prefix("rv:") + if String(space_id).begins_with("rv:") + else _fingerprint_for_peer(existing_peer_id) + ) + if owner_fingerprint.is_empty(): + continue + receive_home_transition.rpc_id(peer_id, { + "peer_id": existing_peer_id, + "space_id": String(space_id), + "owner_fingerprint": owner_fingerprint, + "transform": NetworkHomeProtocolType.transform_to_array( + avatar.global_transform + ), + }) + + +func _on_peer_removed(peer_id: int) -> void: + var fingerprint: String = _fingerprint_by_peer.get(peer_id, "") + _fingerprint_by_peer.erase(peer_id) + _authorized_owned_counts.erase(peer_id) + if fingerprint.is_empty(): + return + if _session.is_host(): + for occupant_id: int in _session.get_authenticated_peer_ids(): + if ( + occupant_id == peer_id + or _session.get_peer_space(occupant_id) + != NetworkHomeProtocolType.make_space_id(fingerprint) + ): + continue + _apply_host_transition( + occupant_id, + NetworkHomeProtocolType.WORLD_SPACE, + fingerprint, + _world_service.get_exterior_spawn_transform(fingerprint), + ) + _manifests_by_fingerprint.erase(fingerprint) + _world_service.remove_presentation(fingerprint) + if _session.is_host(): + for recipient_id: int in _session.get_authenticated_peer_ids(): + if recipient_id != 1: + receive_home_removed.rpc_id(recipient_id, fingerprint) + + +@rpc( + "authority", "call_remote", "reliable", + NetworkHomeProtocolType.RELIABLE_CHANNEL, +) +func receive_home_removed(owner_fingerprint: String) -> void: + if not NetworkIdentityCrypto.valid_fingerprint(owner_fingerprint): + return + _manifests_by_fingerprint.erase(owner_fingerprint) + _world_service.remove_presentation(owner_fingerprint) + + +func _on_session_state_changed(state: NetworkSession.State) -> void: + if state in [NetworkSession.State.PRIVATE_HOST, NetworkSession.State.OPEN_HOST]: + if ( + not _session.is_dedicated_host() + and _world_service != null + and _world_service.is_world_ready() + ): + publish_local_home() + return + if state in [ + NetworkSession.State.INACTIVE, + NetworkSession.State.DISCONNECTING, + NetworkSession.State.CONNECTION_FAILED, + NetworkSession.State.SERVER_LOST, + ]: + _manifests_by_fingerprint.clear() + _fingerprint_by_peer.clear() + _authorized_owned_counts.clear() + _authorization_result_owner.clear() + _next_interior_index = 0 + _world_service.clear_presentations() + _world_service.set_local_space(NetworkHomeProtocolType.WORLD_SPACE) + local_space_changed.emit(NetworkHomeProtocolType.WORLD_SPACE, "") + + +func _fingerprint_for_peer(peer_id: int) -> String: + if _fingerprint_by_peer.has(peer_id): + return _fingerprint_by_peer[peer_id] + var record := _session.get_peer_record(peer_id) + return record.identity_fingerprint if record != null else "" + + +func _new_id(prefix: String) -> String: + return "%s:%s" % [ + prefix, Crypto.new().generate_random_bytes(16).hex_encode(), + ] diff --git a/network/network_home_service.gd.uid b/network/network_home_service.gd.uid new file mode 100644 index 0000000..be233ed --- /dev/null +++ b/network/network_home_service.gd.uid @@ -0,0 +1 @@ +uid://ong8kug36ku7 diff --git a/network/network_item_use_service.gd b/network/network_item_use_service.gd index cf2d5f9..024eca9 100644 --- a/network/network_item_use_service.gd +++ b/network/network_item_use_service.gd @@ -5,6 +5,7 @@ const FishingRodDataType = preload("res://items/fishing_rod_data.gd") const ArtShopStockType = preload("res://economy/art_shop_stock.gd") const FishingShopStockType = preload("res://economy/fishing_shop_stock.gd") +const DecorCatalogType = preload("res://homes/decor_catalog.gd") const MAX_LEDGER_ENTRIES: int = 64 @@ -394,6 +395,10 @@ func _apply_equipped(data: Dictionary) -> void: item_id == FishingShopStockType.STANDARD_SHOVEL_ID and bool(data["owns_item"]), ) + avatar.set_active_decor_package( + DecorCatalogType.has_product(item_id) + and bool(data["owns_item"]), + ) equipped_state_changed.emit( peer_id, StringName(str(data["item_id"])), int(data["category"]) ) diff --git a/network/network_protocol.gd b/network/network_protocol.gd index 20be022..49aca95 100644 --- a/network/network_protocol.gd +++ b/network/network_protocol.gd @@ -3,7 +3,7 @@ extends RefCounted const WorldLayoutType = preload("res://world/world_layout.gd") -const PROTOCOL_VERSION: int = 11 +const PROTOCOL_VERSION: int = 12 const GAME_BUILD: String = "prealpha" const MAX_GAME_VERSION_LENGTH: int = 64 const MAX_DISPLAY_NAME_LENGTH: int = 24 @@ -17,9 +17,9 @@ const MAX_SIGNATURE_LENGTH: int = 2048 # 8 reliable ordered session chat, 9 reliable private session mail, # 10 observer-only fishing summaries, 11 reliable movement animation state, # 12 reliable fish showcase state, 13 reliable world-spawn events, -# 14 reliable artwork state, 15 world-spawn snapshots, and 16 reliable -# fishing lifecycle. Bulk world/art payloads must not head-of-line block held -# items, fishing, or animation presentation. +# 14 reliable artwork state, 15 world-spawn snapshots, 16 reliable fishing +# lifecycle, and 17 reliable portable-home state. Bulk world/art payloads must +# not head-of-line block held items, fishing, animation, or home transitions. const SALE_RELIABLE_CHANNEL: int = 5 const SHOP_RELIABLE_CHANNEL: int = 6 const ITEM_RELIABLE_CHANNEL: int = 7 @@ -30,7 +30,8 @@ const SHOWCASE_RELIABLE_CHANNEL: int = 12 const WORLD_SPAWN_RELIABLE_CHANNEL: int = 13 const DRAWING_RELIABLE_CHANNEL: int = 14 const FISHING_RELIABLE_CHANNEL: int = 16 -const ENET_CHANNEL_COUNT: int = 17 +const HOME_RELIABLE_CHANNEL: int = 17 +const ENET_CHANNEL_COUNT: int = 18 const SURFACE_DRAWING_CAPABILITY: String = "surface_drawing_v2" const ART_SHOP_CAPABILITY: String = "art_shop_v1" const BACKPACK_SHOP_CAPABILITY: String = "backpack_shop_v1" @@ -45,6 +46,7 @@ const WORLD_LAYOUT_CAPABILITY: String = "world_layout_v1" const FRIENDS_CAPABILITY: String = "friends_v1" const MOVEMENT_RECONCILIATION_CAPABILITY: String = "movement_reconciliation_v2" const FISHING_REPLICATION_CAPABILITY: String = "fishing_replication_v2" +const HOME_CAPABILITY: String = "portable_home_v1" const DEFAULT_WORLD_SEED: int = 13001 const MAX_WORLD_SEED: int = 2147483646 @@ -202,6 +204,7 @@ static func make_client_hello( FRIENDS_CAPABILITY, MOVEMENT_RECONCILIATION_CAPABILITY, FISHING_REPLICATION_CAPABILITY, + HOME_CAPABILITY, ]), "cosmetic_snapshot": cosmetic_snapshot, "identity_fingerprint": identity_fingerprint, @@ -342,6 +345,7 @@ static func make_server_hello( FRIENDS_CAPABILITY, MOVEMENT_RECONCILIATION_CAPABILITY, FISHING_REPLICATION_CAPABILITY, + HOME_CAPABILITY, "chat_v1", "mail_v1", "profile_v1", diff --git a/network/network_session.gd b/network/network_session.gd index 8b99fd6..8add90f 100644 --- a/network/network_session.gd +++ b/network/network_session.gd @@ -141,6 +141,7 @@ var _last_server_protocol_version: int = 0 var _last_server_world_seed: int = NetworkProtocol.DEFAULT_WORLD_SEED var _last_server_world_layout: StringName = WorldLayout.GENERATED var _server_capabilities: PackedStringArray = PackedStringArray() +var _peer_space_ids: Dictionary[int, StringName] = {} var _profile_ready: bool = false var _player_identity: PlayerIdentityStore var _host_identity: HostIdentityStore @@ -334,6 +335,7 @@ func _register_player_host() -> void: NetworkProtocol.FRIENDS_CAPABILITY, NetworkProtocol.MOVEMENT_RECONCILIATION_CAPABILITY, NetworkProtocol.FISHING_REPLICATION_CAPABILITY, + NetworkProtocol.HOME_CAPABILITY, ]), ) _registry.update_appearance(1, _local_appearance_snapshot) @@ -661,6 +663,7 @@ func supports_server_capability(capability: StringName) -> bool: NetworkProtocol.FRIENDS_CAPABILITY, NetworkProtocol.MOVEMENT_RECONCILIATION_CAPABILITY, NetworkProtocol.FISHING_REPLICATION_CAPABILITY, + NetworkProtocol.HOME_CAPABILITY, "chat_v1", "mail_v1", "profile_v1", @@ -685,6 +688,21 @@ func get_authenticated_peer_ids() -> Array[int]: return _registry.get_peer_ids() +func set_peer_space(peer_id: int, space_id: StringName) -> bool: + if not _registry.has_peer(peer_id) or space_id.is_empty(): + return false + _peer_space_ids[peer_id] = space_id + return true + + +func get_peer_space(peer_id: int) -> StringName: + return _peer_space_ids.get(peer_id, &"world") + + +func peers_share_space(first_peer_id: int, second_peer_id: int) -> bool: + return get_peer_space(first_peer_id) == get_peer_space(second_peer_id) + + func get_peer_rtt_ms(peer_id: int) -> int: if peer_id == 1: return 0 @@ -1030,6 +1048,7 @@ func _on_peer_disconnected(peer_id: int) -> void: _pending_identity_challenges.erase(peer_id) _authenticated_identity_cache.erase(peer_id) _operator_peer_ids.erase(peer_id) + _peer_space_ids.erase(peer_id) _last_animation_state_by_peer.erase(peer_id) _pending_animation_state_by_peer.erase(peer_id) var recovery_attempt: String = _recovery_attempts.get(peer_id, "") @@ -1313,6 +1332,7 @@ func submit_client_hello(data: Dictionary) -> void: for required_capability: String in [ NetworkProtocol.MOVEMENT_RECONCILIATION_CAPABILITY, NetworkProtocol.FISHING_REPLICATION_CAPABILITY, + NetworkProtocol.HOME_CAPABILITY, ]: if required_capability not in client_capabilities: _reject_peer( @@ -1546,6 +1566,7 @@ func receive_server_hello(data: Dictionary) -> void: for required_capability: String in [ NetworkProtocol.MOVEMENT_RECONCILIATION_CAPABILITY, NetworkProtocol.FISHING_REPLICATION_CAPABILITY, + NetworkProtocol.HOME_CAPABILITY, ]: if required_capability not in _server_capabilities: _teardown_peer() @@ -1578,6 +1599,7 @@ func receive_server_hello(data: Dictionary) -> void: NetworkProtocol.FRIENDS_CAPABILITY, NetworkProtocol.MOVEMENT_RECONCILIATION_CAPABILITY, NetworkProtocol.FISHING_REPLICATION_CAPABILITY, + NetworkProtocol.HOME_CAPABILITY, ]), ) _registry.update_appearance(local_peer_id, _local_appearance_snapshot) @@ -1623,6 +1645,7 @@ func receive_peer_despawn(peer_id: int) -> void: if state != State.JOINED_CLIENT: return _operator_peer_ids.erase(peer_id) + _peer_space_ids.erase(peer_id) _last_animation_state_by_peer.erase(peer_id) _pending_animation_state_by_peer.erase(peer_id) _registry.remove_peer(peer_id) @@ -2247,6 +2270,8 @@ func _broadcast_movement_snapshots() -> void: continue var snapshots: Array = [] for subject_id: int in peer_ids: + if not peers_share_space(recipient_id, subject_id): + continue var subject_avatar: Player = _spawn_service.get_avatar(subject_id) if subject_avatar == null: continue @@ -2315,7 +2340,7 @@ func _broadcast_movement_animation_updates(peer_ids: Array[int]) -> void: _animation_refresh_accumulator, ANIMATION_REFRESH_INTERVAL, ) - var updates: Array = [] + var updates_by_subject: Dictionary[int, Array] = {} for subject_id: int in peer_ids: var avatar: Player = _spawn_service.get_avatar(subject_id) if avatar == null: @@ -2333,12 +2358,18 @@ func _broadcast_movement_animation_updates(peer_ids: Array[int]) -> void: _last_animation_state_by_peer[subject_id] = state.duplicate(true) var encoded: Array = _encode_movement_animation(subject_id, state) if not encoded.is_empty(): - updates.append(encoded) - if updates.is_empty(): + updates_by_subject[subject_id] = encoded + if updates_by_subject.is_empty(): return for recipient_id: int in peer_ids: if recipient_id == 1: continue + var updates: Array = [] + for subject_id: int in updates_by_subject: + if peers_share_space(recipient_id, subject_id): + updates.append(updates_by_subject[subject_id]) + if updates.is_empty(): + continue receive_movement_animations.rpc_id(recipient_id, updates) _movement_animation_packets_sent += 1 _movement_animation_states_sent += updates.size() @@ -2888,6 +2919,7 @@ func _teardown_peer() -> void: _pending_animation_state_by_peer.clear() _last_local_animation_action_signature.clear() _server_capabilities = PackedStringArray() + _peer_space_ids.clear() _server_identity_fingerprint = "" _server_identity_public_key = "" _session_identity_keys.clear() diff --git a/network/network_shop_protocol.gd b/network/network_shop_protocol.gd index 2de9cc1..da9419a 100644 --- a/network/network_shop_protocol.gd +++ b/network/network_shop_protocol.gd @@ -4,6 +4,7 @@ extends RefCounted const CAPABILITY: StringName = &"shop_v1" const ART_CAPABILITY: StringName = &"art_shop_v1" const BACKPACK_CAPABILITY: StringName = &"backpack_shop_v1" +const DECOR_CAPABILITY: StringName = &"portable_home_v1" const RELIABLE_CHANNEL: int = NetworkProtocol.SHOP_RELIABLE_CHANNEL const MAX_ID_LENGTH: int = 96 const MAX_MESSAGE_LENGTH: int = 160 @@ -18,6 +19,7 @@ enum ProductCategory { ART_KIT, ART_UPGRADE, BACKPACK_CAPACITY_UPGRADE, + DECOR, } diff --git a/network/network_shop_service.gd b/network/network_shop_service.gd index 6f31c40..8294b53 100644 --- a/network/network_shop_service.gd +++ b/network/network_shop_service.gd @@ -8,8 +8,10 @@ const ItemDataType = preload("res://items/item_data.gd") const FishingRodDataType = preload("res://items/fishing_rod_data.gd") const OwnedItemType = preload("res://items/owned_item.gd") const ArtShopStockType = preload("res://economy/art_shop_stock.gd") +const DecorCatalogType = preload("res://homes/decor_catalog.gd") -const SHOP_ID: StringName = &"main_fishing_shop" +const FISHING_SHOP_ID: StringName = &"main_fishing_shop" +const DECOR_SHOP_ID: StringName = &"rv_decor_shop" const REEL_PRODUCT_ID: StringName = &"reel_speed_upgrade" const BARRIER_PRODUCT_ID: StringName = &"barrier_power_upgrade" const COOLER_PRODUCT_ID: StringName = &"cooler_capacity_upgrade" @@ -31,6 +33,7 @@ var _session: NetworkSession var _spawn_service: PlayerSpawnService var _network_fishing: NetworkFishingService var _interaction: FishingShopInteraction +var _decor_interaction: DecorShopInteraction var _wallet: PlayerWallet var _bag: PlayerBag var _item_catalog: ItemCatalog @@ -47,6 +50,8 @@ var _received_results: Dictionary[String, bool] = {} var _applied_results: Dictionary[String, bool] = {} var _pending_local_request: Dictionary = {} var _reservations: PlayerAssetReservationService +var _home_state: PlayerHomeState +var _network_home: NetworkHomeService func setup( @@ -63,6 +68,9 @@ func setup( save_manager: PlayerSaveManager, reservations: PlayerAssetReservationService, inventory_layout: PlayerInventoryLayout = null, + home_state: PlayerHomeState = null, + network_home: NetworkHomeService = null, + decor_interaction: DecorShopInteraction = null, ) -> void: _session = session _spawn_service = spawn_service @@ -77,6 +85,9 @@ func setup( _save_manager = save_manager _reservations = reservations _inventory_layout = inventory_layout + _home_state = home_state + _network_home = network_home + _decor_interaction = decor_interaction if not _session.peer_removed.is_connected(_on_peer_removed): _session.peer_removed.connect(_on_peer_removed) if not _session.state_changed.is_connected(_on_session_state_changed): @@ -87,6 +98,12 @@ func set_shop_interaction(interaction: FishingShopInteraction) -> void: _interaction = interaction +func set_decor_shop_interaction( + interaction: DecorShopInteraction, +) -> void: + _decor_interaction = interaction + + func can_request_purchase() -> bool: return ( _session != null @@ -124,6 +141,19 @@ func can_request_backpack_purchase() -> bool: ) +func can_request_decor_purchase() -> bool: + return ( + can_request_purchase() + and _home_state != null + and ( + _session.is_host() + or _session.supports_server_capability( + NetworkShopProtocol.DECOR_CAPABILITY + ) + ) + ) + + func is_local_purchase_pending() -> bool: return not _pending_local_request.is_empty() @@ -193,6 +223,15 @@ func request_backpack_capacity_upgrade() -> String: ) +func request_decor(product_id: StringName) -> String: + return _request_purchase( + product_id, + NetworkShopProtocol.ProductCategory.DECOR, + 1, + _home_state.get_owned_count(product_id) if _home_state != null else 0, + ) + + func request_art_kit() -> String: return _request_purchase( ArtShopStockType.ART_KIT_ITEM_ID, @@ -269,11 +308,25 @@ func _request_purchase( product_id, category, 0, 0, ) return "" + if ( + category == NetworkShopProtocol.ProductCategory.DECOR + and not can_request_decor_purchase() + ): + local_purchase_finished.emit( + "", false, "Decor require a newer server.", + product_id, category, 0, 0, + ) + return "" var request_id: String = _new_id("shop") + var shop_id: StringName = ( + DECOR_SHOP_ID + if category == NetworkShopProtocol.ProductCategory.DECOR + else FISHING_SHOP_ID + ) var request: Dictionary = { "request_id": request_id, "session_id": _session.get_session_id(), - "shop_id": str(SHOP_ID), + "shop_id": str(shop_id), "product_id": str(product_id), "category": category, "quantity": quantity, @@ -345,16 +398,34 @@ func _handle_purchase_request(peer_id: int, data: Dictionary) -> void: _rejected_result(data, "A purchase is already pending.") ) return - if not _is_shop_available_for_peer(peer_id): + var requested_shop_id := StringName(str(data["shop_id"])) + if not _is_shop_available_for_peer(peer_id, requested_shop_id): var avatar: Player = _spawn_service.get_avatar(peer_id) + var requested_interaction: FishingShopInteraction = ( + _decor_interaction + if requested_shop_id == DECOR_SHOP_ID + else _interaction + ) var message: String = ( "The shop is unavailable." - if avatar == null or _interaction == null + if avatar == null or requested_interaction == null else "Move closer to the shop." ) _record_and_send(peer_id, _rejected_result(data, message)) return var result: Dictionary = _build_authoritative_result(peer_id, data) + if ( + bool(result.get("accepted", false)) + and int(result.get("category", -1)) + == NetworkShopProtocol.ProductCategory.DECOR + and _network_home != null + ): + _network_home.authorize_decor_purchase( + peer_id, + StringName(str(result["product_id"])), + int(result["resulting_state"]), + str(result["result_id"]), + ) _pending_by_peer[peer_id] = request_id _record_and_send(peer_id, result) @@ -368,10 +439,24 @@ func _build_authoritative_result( var quantity: int = request["quantity"] var wallet_balance: int = request["wallet_balance"] var current_state: int = request["current_state"] + if ( + category == NetworkShopProtocol.ProductCategory.DECOR + and _network_home != null + ): + var authoritative_count: int = ( + _network_home.get_authoritative_owned_count(peer_id, product_id) + ) + if authoritative_count >= 0: + current_state = authoritative_count var cost: int = -1 var resulting_state: int = current_state var rejection: String = "" - if StringName(str(request["shop_id"])) != SHOP_ID: + var expected_shop_id: StringName = ( + DECOR_SHOP_ID + if category == NetworkShopProtocol.ProductCategory.DECOR + else FISHING_SHOP_ID + ) + if StringName(str(request["shop_id"])) != expected_shop_id: rejection = "The shop is unavailable." elif quantity < 1: rejection = "Purchase could not be completed." @@ -545,6 +630,19 @@ func _build_authoritative_result( resulting_state = PlayerArtUnlocks.resulting_mask( current_state, product_id ) + NetworkShopProtocol.ProductCategory.DECOR: + cost = DecorCatalogType.get_price(product_id) + if ( + not DecorCatalogType.has_product(product_id) + or quantity != 1 + or current_state < 0 + or current_state + >= DecorCatalogType.MAX_OWNED_PER_PRODUCT + or cost < 0 + ): + rejection = "Decor is unavailable." + else: + resulting_state = current_state + 1 if rejection.is_empty() and (cost < 0 or wallet_balance < cost): rejection = "Insufficient funds." if not rejection.is_empty(): @@ -667,6 +765,9 @@ func _apply_purchase_result(data: Dictionary) -> void: if _inventory_layout != null else 0 ) var art_snapshot: int = _art_unlocks.get_unlock_mask() + var home_snapshot: Dictionary = ( + _home_state.to_save_data() if _home_state != null else {} + ) var applied: bool = _apply_local_product(data) if not applied or not _save_manager.save_if_dirty(): _bag.replace_all_items(bag_snapshot) @@ -676,6 +777,8 @@ func _apply_purchase_result(data: Dictionary) -> void: if _inventory_layout != null: _inventory_layout.restore_backpack_level(backpack_snapshot) _art_unlocks.restore_mask(art_snapshot) + if _home_state != null and not home_snapshot.is_empty(): + _home_state.restore_from_save_data(home_snapshot) _wallet.restore_balance(wallet_snapshot) _save_manager.save_if_dirty() _fail_local_apply(data, "Purchase could not be completed.") @@ -696,6 +799,7 @@ func _validate_local_result(data: Dictionary) -> String: or _cooler_capacity == null or _art_unlocks == null or _save_manager == null + or _home_state == null or _wallet.get_balance() != int(data["expected_wallet"]) or str(data["product_id"]) != str(_pending_local_request.get("product_id", "")) @@ -806,6 +910,20 @@ func _validate_local_result(data: Dictionary) -> String: or cost != ArtShopStockType.UPGRADE_PRICE ): return "Purchase could not be completed." + NetworkShopProtocol.ProductCategory.DECOR: + if ( + not DecorCatalogType.has_product(product_id) + or _home_state.get_owned_count(product_id) != expected_state + or resulting_state != expected_state + 1 + or cost != DecorCatalogType.get_price(product_id) + or expected_state >= DecorCatalogType.MAX_OWNED_PER_PRODUCT + or not _bag.can_add_item(product_id, 1) + ): + return ( + "Your inventory is full." + if not _bag.can_add_item(product_id, 1) + else "Purchase could not be completed." + ) _: return "Purchase could not be completed." return "" @@ -845,6 +963,12 @@ func _apply_local_product(data: Dictionary) -> bool: return _art_unlocks.purchase_product( product_id, _wallet, int(data["total_cost"]) ) + NetworkShopProtocol.ProductCategory.DECOR: + return ( + _wallet.debit(int(data["total_cost"])) + and _bag.add_item(product_id, 1) + and _home_state.add_owned_decor(product_id, 1) + ) return false @@ -921,7 +1045,7 @@ func _handle_acknowledgement( peer_id: int, result_id: String, request_id: String, - _applied: bool, + applied: bool, message: String, ) -> void: if ( @@ -933,20 +1057,32 @@ func _handle_acknowledgement( or _result_owners.get(result_id, 0) != peer_id ): return + if _network_home != null: + _network_home.finalize_decor_purchase( + peer_id, result_id, applied + ) _acknowledged_results[result_id] = true _bound_dictionary(_acknowledged_results) if _pending_by_peer.get(peer_id, "") == request_id: _pending_by_peer.erase(peer_id) -func _is_shop_available_for_peer(peer_id: int) -> bool: +func _is_shop_available_for_peer( + peer_id: int, + shop_id: StringName, +) -> bool: + var interaction: FishingShopInteraction = ( + _decor_interaction + if shop_id == DECOR_SHOP_ID + else _interaction + ) if ( _session == null or not _session.is_host() or not _session.is_gameplay_session_active() or _spawn_service == null - or _interaction == null - or not is_instance_valid(_interaction) + or interaction == null + or not is_instance_valid(interaction) ): return false var avatar: Player = _spawn_service.get_avatar(peer_id) @@ -957,7 +1093,7 @@ func _is_shop_available_for_peer(peer_id: int) -> bool: _network_fishing == null or not _network_fishing.has_peer_attempt(peer_id) ) - and _interaction.is_avatar_in_range(avatar) + and interaction.is_avatar_in_range(avatar) ) diff --git a/player/player.gd b/player/player.gd index 64d4ffe..30807be 100644 --- a/player/player.gd +++ b/player/player.gd @@ -427,6 +427,9 @@ class ShowcaseCameraSnapshot: @export_range(0.0, 1.0, 0.01) var controller_camera_deadzone: float = 0.2 @export var invert_camera_y: bool = false var _swap_hotbar_camera_scroll: bool = false +var _rv_interior_camera_mode: bool = false +var _rv_interior_environment: Environment +var _rv_previous_camera_environment: Environment @export_range(-89.0, 0.0, 0.5) var minimum_pitch_degrees: float = -65.0 @export_range(0.0, 89.0, 0.5) var maximum_pitch_degrees: float = 45.0 @export var minimum_zoom: float = 2.0 @@ -471,6 +474,8 @@ var _held_fish_attachment_offset: Vector3 = Vector3(0.0, 0.08, 0.04) var _held_fish_sprite: Sprite3D var _held_art_kit_display: Node3D var _held_art_kit_sprite: Sprite3D +var _held_decor_package_display: Node3D +var _held_decor_package_visible: bool = false var _catch_attachment_offset: Vector3 = Vector3(0.0, 0.08, 0.04) var _gravity: float = float(ProjectSettings.get_setting("physics/3d/default_gravity")) @@ -992,6 +997,7 @@ func _initialize_held_item_attachment() -> void: _held_art_kit_sprite = attachment.get_node( "HeldArtKitDisplay/HeldArtKitSprite" ) as Sprite3D + _held_decor_package_display = _build_decor_package_display(attachment) _catch_display = attachment.get_node("CatchDisplay") as Node3D _catch_attachment_offset = _catch_display.position _catch_sprite = attachment.get_node("CatchDisplay/CatchSprite") as Sprite3D @@ -1322,9 +1328,7 @@ func _update_character_animation() -> void: and supports_network_animation_action(animation_action_id) and _character_animation_player.has_animation(animation_action_id) ) - var held_show_item_visible: bool = ( - _held_fish_visible or _held_art_kit_visible - ) + var held_show_item_visible: bool = _has_held_show_item() var requested_animation: Array[StringName] = [] if _pocket_visual_active: requested_animation = [_pocket_visual_animation] @@ -1766,7 +1770,11 @@ func _unhandled_input(event: InputEvent) -> void: var mouse_zoom_in: bool = ( event is InputEventMouseButton - and event.shift_pressed != _swap_hotbar_camera_scroll + and ( + (not event.shift_pressed) + if _rv_interior_camera_mode + else event.shift_pressed != _swap_hotbar_camera_scroll + ) and event.is_action_pressed("camera_zoom_in") ) var controller_zoom_in: bool = ( @@ -1775,7 +1783,11 @@ func _unhandled_input(event: InputEvent) -> void: ) var mouse_zoom_out: bool = ( event is InputEventMouseButton - and event.shift_pressed != _swap_hotbar_camera_scroll + and ( + (not event.shift_pressed) + if _rv_interior_camera_mode + else event.shift_pressed != _swap_hotbar_camera_scroll + ) and event.is_action_pressed("camera_zoom_out") ) var controller_zoom_out: bool = ( @@ -1963,7 +1975,11 @@ func get_active_gameplay_camera() -> Camera3D: func _set_target_zoom(value: float) -> void: - _target_zoom = clampf(value, minimum_zoom, maximum_zoom) + _target_zoom = clampf( + value, + 1.25 if _rv_interior_camera_mode else minimum_zoom, + 16.0 if _rv_interior_camera_mode else maximum_zoom, + ) func _apply_axis_deadzone(value: float) -> float: @@ -3021,6 +3037,49 @@ func apply_camera_settings( _swap_hotbar_camera_scroll = swap_hotbar_camera_scroll +func set_rv_interior_camera_mode( + enabled: bool, + excluded_wall_rids: Array[RID] = [], +) -> void: + if enabled != _rv_interior_camera_mode: + if enabled: + _rv_previous_camera_environment = _camera.environment + _camera.environment = _get_rv_interior_environment() + if _free_camera != null: + _free_camera.environment = _camera.environment + else: + _camera.environment = _rv_previous_camera_environment + if _free_camera != null: + _free_camera.environment = _camera.environment + _rv_previous_camera_environment = null + _rv_interior_camera_mode = enabled + if _spring_arm == null: + return + _spring_arm.clear_excluded_objects() + if enabled: + for collider_rid: RID in excluded_wall_rids: + if collider_rid.is_valid(): + _spring_arm.add_excluded_object(collider_rid) + _set_target_zoom(_target_zoom) + + +func _get_rv_interior_environment() -> Environment: + if _rv_interior_environment != null: + return _rv_interior_environment + _rv_interior_environment = Environment.new() + _rv_interior_environment.background_mode = Environment.BG_COLOR + _rv_interior_environment.background_color = Color("020506") + _rv_interior_environment.ambient_light_source = ( + Environment.AMBIENT_SOURCE_COLOR + ) + _rv_interior_environment.ambient_light_color = Color("d6caaa") + _rv_interior_environment.ambient_light_energy = 1.0 + _rv_interior_environment.reflected_light_source = ( + Environment.REFLECTION_SOURCE_DISABLED + ) + return _rv_interior_environment + + func is_camera_input_enabled() -> bool: return _camera_input_enabled @@ -3147,6 +3206,23 @@ func set_active_shovel(should_show: bool) -> void: ) +func set_active_decor_package(should_show: bool) -> void: + var changed: bool = _held_decor_package_visible != should_show + _held_decor_package_visible = should_show + if _held_decor_package_display != null: + _held_decor_package_display.visible = should_show + if should_show: + _fishing_rod.visible = false + if _catching_net != null: + _catching_net.visible = false + if _shovel != null: + _shovel.visible = false + elif changed: + _apply_active_rod_visibility() + if changed: + _update_character_animation() + + func _apply_fishing_rod_model(rod: FishingRodDataType) -> void: var next_id: StringName = rod.item_id if rod != null else StringName() if next_id == _active_fishing_rod_id: @@ -3319,7 +3395,52 @@ func set_held_fish( func _has_held_show_item() -> bool: - return _held_fish_visible or _held_art_kit_visible + return ( + _held_fish_visible + or _held_art_kit_visible + or _held_decor_package_visible + ) + + +func _build_decor_package_display(parent: Node3D) -> Node3D: + var display := Node3D.new() + display.name = "HeldDecorPackageDisplay" + display.position = Vector3(0.0, 0.1, 0.04) + display.rotation = Vector3(0.15, 0.0, -0.55) + display.visible = false + parent.add_child(display) + + var sack := MeshInstance3D.new() + sack.name = "Sack" + var sack_mesh := SphereMesh.new() + sack_mesh.radius = 0.22 + sack_mesh.height = 0.48 + sack_mesh.radial_segments = 8 + sack_mesh.rings = 4 + sack_mesh.material = _decor_package_material(Color("a87843")) + sack.mesh = sack_mesh + display.add_child(sack) + + var tie := MeshInstance3D.new() + tie.name = "Tie" + var tie_mesh := CylinderMesh.new() + tie_mesh.top_radius = 0.1 + tie_mesh.bottom_radius = 0.12 + tie_mesh.height = 0.08 + tie_mesh.radial_segments = 8 + tie_mesh.material = _decor_package_material(Color("513829")) + tie.mesh = tie_mesh + tie.position = Vector3(0.0, 0.22, 0.0) + display.add_child(tie) + return display + + +func _decor_package_material(color: Color) -> StandardMaterial3D: + var material := StandardMaterial3D.new() + material.albedo_color = color + material.roughness = 1.0 + material.shading_mode = BaseMaterial3D.SHADING_MODE_PER_VERTEX + return material func _clear_held_fish() -> void: diff --git a/save/player_save_manager.gd b/save/player_save_manager.gd index 1ad74a1..56fd49c 100644 --- a/save/player_save_manager.gd +++ b/save/player_save_manager.gd @@ -34,8 +34,9 @@ const WorldWeatherServiceType = preload( const WorldLayoutType = preload("res://world/world_layout.gd") const PlayerJobServiceType = preload("res://jobs/player_job_service.gd") const PlayerType = preload("res://player/player.gd") +const PlayerHomeStateType = preload("res://homes/player_home_state.gd") -const SAVE_VERSION: int = 10 +const SAVE_VERSION: int = 11 const LEGACY_SAVE_FILENAME := "player_save.json" const ARCHIVE_EXTENSION := ".nfsave" const BASIC_ROD_ID: StringName = &"basic_fishing_rod" @@ -76,6 +77,7 @@ class LoadSnapshot: WorldWeatherServiceType.SUNNY_DURATION_RANGE.x ) var jobs_data: Dictionary = PlayerJobServiceType.default_save_data() + var home_data: Dictionary = PlayerHomeStateType.default_save_data() @export_range(0.05, 5.0, 0.05) var autosave_delay: float = 0.5 @@ -96,6 +98,7 @@ var _world_time: WorldTimeServiceType var _world_weather: WorldWeatherServiceType var _jobs: PlayerJobServiceType var _player: PlayerType +var _home_state: PlayerHomeStateType var _autosave_timer: Timer var _is_configured: bool = false var _is_restoring: bool = false @@ -175,6 +178,7 @@ func setup( world_weather: WorldWeatherServiceType, jobs: PlayerJobServiceType, player: PlayerType, + home_state: PlayerHomeStateType, ) -> void: _inventory = inventory _collection_log = collection_log @@ -192,6 +196,7 @@ func setup( _world_weather = world_weather _jobs = jobs _player = player + _home_state = home_state _is_configured = ( _inventory != null and _collection_log != null @@ -209,6 +214,7 @@ func setup( and _world_weather != null and _jobs != null and _player != null + and _home_state != null ) if not _is_configured: push_error("PlayerSaveManager setup is missing required references.") @@ -255,6 +261,8 @@ func setup( _player.active_bait_changed.connect(_on_active_tackle_changed) if not _player.active_lure_changed.is_connected(_on_active_tackle_changed): _player.active_lure_changed.connect(_on_active_tackle_changed) + if not _home_state.changed.is_connected(_mark_dirty): + _home_state.changed.connect(_mark_dirty) func load_player_data() -> bool: @@ -360,6 +368,9 @@ func load_player_data() -> bool: snapshot.world_weather_seconds_remaining, ) var jobs_restored: bool = _jobs.restore_from_save_data(snapshot.jobs_data) + var home_restored: bool = _home_state.restore_from_save_data( + snapshot.home_data + ) _is_restoring = false if ( not inventory_restored @@ -376,13 +387,14 @@ func load_player_data() -> bool: or not world_time_restored or not world_weather_restored or not jobs_restored + or not home_restored ): push_error( ( "Validated player save could not be restored: " + "inventory=%s collection=%s wallet=%s bag=%s tackle=%s hotbar=%s " + "upgrades=%s cooler=%s layout=%s art=%s experience=%s " - + "time=%s weather=%s jobs=%s" + + "time=%s weather=%s jobs=%s home=%s" ) % [ inventory_restored, @@ -399,6 +411,7 @@ func load_player_data() -> bool: world_time_restored, world_weather_restored, jobs_restored, + home_restored, ] ) return false @@ -899,6 +912,7 @@ func _build_save_dictionary() -> Dictionary: ), }, "jobs": _jobs.to_save_data(), + "home": _home_state.to_save_data(), } @@ -913,6 +927,7 @@ func _build_load_snapshot(save_data: Dictionary) -> LoadSnapshot: or typeof(save_data.get("inventory_layout")) != TYPE_DICTIONARY or typeof(save_data.get("experience")) != TYPE_DICTIONARY or typeof(save_data.get("jobs")) != TYPE_DICTIONARY + or typeof(save_data.get("home")) != TYPE_DICTIONARY ): return null var wallet_data: Dictionary = save_data["wallet"] @@ -924,6 +939,7 @@ func _build_load_snapshot(save_data: Dictionary) -> LoadSnapshot: var inventory_layout_data: Dictionary = save_data["inventory_layout"] var experience_data: Dictionary = save_data["experience"] var jobs_data: Dictionary = save_data["jobs"] + var home_data: Dictionary = save_data["home"] var world_data: Dictionary = {} if typeof(save_data.get("world")) == TYPE_DICTIONARY: world_data = save_data["world"] @@ -1006,6 +1022,12 @@ func _build_load_snapshot(save_data: Dictionary) -> LoadSnapshot: if not PlayerJobServiceType.validate_save_data(jobs_data): return null snapshot.jobs_data = jobs_data.duplicate(true) + var sanitized_home: Dictionary = PlayerHomeStateType.sanitize_save_data( + home_data + ) + if sanitized_home.is_empty(): + return null + snapshot.home_data = sanitized_home if world_data.has("time_hours"): snapshot.world_time_hours = _read_world_time_hours( world_data["time_hours"] @@ -1340,6 +1362,8 @@ func _migrate_save( migrated = _migrate_version_8_to_9(migrated) 9: migrated = _migrate_version_9_to_10(migrated) + 10: + migrated = _migrate_version_10_to_11(migrated) _: return {} if migrated.is_empty(): @@ -1597,6 +1621,13 @@ func _migrate_version_9_to_10(data: Dictionary) -> Dictionary: return migrated +func _migrate_version_10_to_11(data: Dictionary) -> Dictionary: + var migrated: Dictionary = data.duplicate(true) + migrated["home"] = PlayerHomeStateType.default_save_data() + migrated["save_version"] = 11 + return migrated + + func _mark_dirty() -> void: if ( _is_restoring @@ -1866,6 +1897,7 @@ func _restore_defaults() -> void: _world_layout = WorldLayoutType.GENERATED _world_seed = DEFAULT_WORLD_SEED _jobs.reset_to_defaults() + _home_state.reset_to_defaults() _is_restoring = false _is_dirty = false diff --git a/tests/art_tools_validation.gd b/tests/art_tools_validation.gd index 4bfab98..146fb4e 100644 --- a/tests/art_tools_validation.gd +++ b/tests/art_tools_validation.gd @@ -19,9 +19,15 @@ func _run() -> void: for _frame: int in 8: await process_frame assert(bool(main.get("_application_initialized"))) + assert(bool(main.call( + "_apply_world", WorldLayout.STARTER_ISLAND, 1, true + ))) + assert(bool(main.call( + "_prepare_host_world", WorldLayout.STARTER_ISLAND, 1 + ))) assert(bool(main.call("_prepare_private_host"))) var save_manager := main.get("_save_manager") as PlayerSaveManager - assert(save_manager.initialize_new_game()) + assert(save_manager.initialize_new_game(1, WorldLayout.STARTER_ISLAND)) main.call("_enter_gameplay") await physics_frame await physics_frame @@ -94,11 +100,7 @@ func _run() -> void: assert(keyboard_mapping.reset_mapping()) await process_frame var shop_prompt_key := game_ui.get_node("%ShopPromptKey") as Label - var storage_prompt_message := game_ui.get_node( - "%StoragePromptMessage" - ) as Label assert(shop_prompt_key.text == "E") - assert(storage_prompt_message.text == "E open storage") var remapped_interact := InputEventKey.new() remapped_interact.physical_keycode = KEY_F remapped_interact.pressed = true @@ -108,7 +110,6 @@ func _run() -> void: )) await process_frame assert(shop_prompt_key.text == "F") - assert(storage_prompt_message.text == "F open storage") assert(keyboard_mapping.reset_mapping()) await process_frame assert(toolbar.get_parent() == chat_ui.get_parent()) diff --git a/tests/fish_hotbar_showcase_validation.gd b/tests/fish_hotbar_showcase_validation.gd index 753f480..9f4623a 100644 --- a/tests/fish_hotbar_showcase_validation.gd +++ b/tests/fish_hotbar_showcase_validation.gd @@ -104,7 +104,10 @@ func _run() -> void: var hotbar_data: Dictionary = parsed["hotbar"] assert(typeof(hotbar_data.get("fish_slots")) == TYPE_ARRAY) assert(str((hotbar_data["fish_slots"] as Array)[1]) == fish_catch.catch_id) - assert(int(parsed["save_version"]) == 10) + assert(int(parsed["save_version"]) == 11) + assert(not PlayerHomeState.sanitize_save_data( + parsed.get("home", {}) + ).is_empty()) assert( int(parsed["experience"]["total_experience"]) == 125 diff --git a/tests/fish_quality_validation.gd b/tests/fish_quality_validation.gd index b6e6bfd..d8e482b 100644 --- a/tests/fish_quality_validation.gd +++ b/tests/fish_quality_validation.gd @@ -485,7 +485,7 @@ func _validate_version_four_migration() -> void: version_four, 4, ) - assert(int(migrated.get("save_version", -1)) == 10) + assert(int(migrated.get("save_version", -1)) == 11) assert(int((migrated["experience"] as Dictionary)["total_experience"]) == 0) assert( is_equal_approx( @@ -509,4 +509,7 @@ func _validate_version_four_migration() -> void: assert( PlayerJobService.validate_save_data(migrated.get("jobs", {})) ) + assert(not PlayerHomeState.sanitize_save_data( + migrated.get("home", {}) + ).is_empty()) manager.queue_free() diff --git a/tests/home_spawn_multiplayer_validation.gd b/tests/home_spawn_multiplayer_validation.gd new file mode 100644 index 0000000..1f16147 --- /dev/null +++ b/tests/home_spawn_multiplayer_validation.gd @@ -0,0 +1,178 @@ +extends SceneTree + +const MainScene: PackedScene = preload("res://main/main.tscn") +const TEST_PORT: int = 18222 + + +func _initialize() -> void: + call_deferred("_run") + + +func _run() -> void: + var arguments: PackedStringArray = OS.get_cmdline_user_args() + if arguments.has("host"): + await _run_host() + return + if arguments.has("client"): + await _run_client() + return + push_error("Home spawn validation needs host or client mode.") + quit(1) + + +func _run_host() -> void: + var main: Node = await _create_initialized_main() + var session := main.get_node("%NetworkSession") as NetworkSession + var network_home := main.get_node( + "%NetworkHomeService" + ) as NetworkHomeService + var home_world := main.get_node("%HomeWorldService") as HomeWorldService + var spawn_service := main.get_node( + "%PlayerSpawnService" + ) as PlayerSpawnService + var save_manager := main.get("_save_manager") as PlayerSaveManager + assert(bool(main.call( + "_apply_world", WorldLayout.STARTER_ISLAND, 1, true + ))) + assert(bool(main.call( + "_prepare_host_world", WorldLayout.STARTER_ISLAND, 1 + ))) + assert(save_manager.initialize_new_game(1, WorldLayout.STARTER_ISLAND)) + assert(session.start_private_host(TEST_PORT)) + main.call("_enter_gameplay") + assert(session.set_host_open(true)) + + var host_fingerprint: String = session.get_local_identity_fingerprint() + assert(await _wait_for_home(network_home, host_fingerprint)) + var host_avatar: Player = spawn_service.get_avatar(1) + var host_spawn: Transform3D = home_world.get_exterior_spawn_transform( + host_fingerprint + ) + assert(_same_door_position(host_avatar.global_position, host_spawn.origin)) + assert(network_home.request_enter(host_fingerprint)) + await physics_frame + host_avatar.global_position = home_world.get_interior_exit_position( + host_fingerprint + ) + assert(network_home.request_exit()) + await physics_frame + assert(_same_door_position(host_avatar.global_position, host_spawn.origin)) + + var remote_peer_id: int = await _wait_for_remote_peer(session) + assert(remote_peer_id > 1) + var remote_record := session.get_peer_record(remote_peer_id) + var remote_fingerprint: String = remote_record.identity_fingerprint + assert(await _wait_for_home(network_home, remote_fingerprint)) + var remote_avatar: Player = spawn_service.get_avatar(remote_peer_id) + var remote_spawn: Transform3D = home_world.get_exterior_spawn_transform( + remote_fingerprint + ) + assert(_same_door_position( + remote_avatar.global_position, remote_spawn.origin + )) + + var disconnect_deadline: int = Time.get_ticks_msec() + 12000 + while ( + Time.get_ticks_msec() < disconnect_deadline + and session.is_authenticated_peer(remote_peer_id) + ): + await process_frame + assert(not session.is_authenticated_peer(remote_peer_id)) + print("Home spawn multiplayer host validation: PASS") + await _cleanup(main, session) + + +func _run_client() -> void: + var main: Node = await _create_initialized_main() + main.call( + "_on_title_join_game_requested", + "127.0.0.1:%d" % TEST_PORT, + ) + var session := main.get_node("%NetworkSession") as NetworkSession + var network_home := main.get_node( + "%NetworkHomeService" + ) as NetworkHomeService + var home_world := main.get_node("%HomeWorldService") as HomeWorldService + var deadline: int = Time.get_ticks_msec() + 20000 + while Time.get_ticks_msec() < deadline: + await process_frame + if session.state == NetworkSession.State.VERIFYING_SERVER_IDENTITY: + main.call("_confirm_server_trust") + if session.is_joined_client() and bool(main.get("_gameplay_started")): + break + assert(session.is_joined_client()) + var fingerprint: String = session.get_local_identity_fingerprint() + assert(await _wait_for_home(network_home, fingerprint)) + var player := main.get("_player") as Player + var exterior_spawn: Transform3D = ( + home_world.get_exterior_spawn_transform(fingerprint) + ) + deadline = Time.get_ticks_msec() + 5000 + while ( + Time.get_ticks_msec() < deadline + and not _same_door_position( + player.global_position, exterior_spawn.origin + ) + ): + await physics_frame + assert(_same_door_position( + player.global_position, exterior_spawn.origin + )) + print("Home spawn multiplayer client validation: PASS") + await _cleanup(main, session) + + +func _create_initialized_main() -> Node: + root.size = Vector2i(1280, 720) + var main: Node = MainScene.instantiate() + root.add_child(main) + for _frame: int in 4: + await process_frame + if not bool(main.get("_application_initialized")): + main.call("_activate_selected_data_path", "", true) + for _frame: int in 8: + await process_frame + assert(bool(main.get("_application_initialized"))) + return main + + +func _wait_for_home( + network_home: NetworkHomeService, + fingerprint: String, +) -> bool: + var deadline: int = Time.get_ticks_msec() + 10000 + while Time.get_ticks_msec() < deadline: + await process_frame + var manifests: Dictionary = network_home.get( + "_manifests_by_fingerprint" + ) + if manifests.has(fingerprint): + return true + return false + + +func _wait_for_remote_peer(session: NetworkSession) -> int: + var deadline: int = Time.get_ticks_msec() + 20000 + while Time.get_ticks_msec() < deadline: + await process_frame + for peer_id: int in session.get_authenticated_peer_ids(): + if peer_id != session.get_local_peer_id(): + return peer_id + return 0 + + +func _same_door_position(first: Vector3, second: Vector3) -> bool: + return ( + Vector2(first.x, first.z).distance_to(Vector2(second.x, second.z)) + < 0.08 + and absf(first.y - second.y) < 0.3 + ) + + +func _cleanup(main: Node, session: NetworkSession) -> void: + session.disconnect_session("") + main.queue_free() + for _frame: int in 4: + await process_frame + await create_timer(0.1).timeout + quit() diff --git a/tests/home_spawn_multiplayer_validation.gd.uid b/tests/home_spawn_multiplayer_validation.gd.uid new file mode 100644 index 0000000..06150f2 --- /dev/null +++ b/tests/home_spawn_multiplayer_validation.gd.uid @@ -0,0 +1 @@ +uid://bndtkip5p6xma diff --git a/tests/job_system_validation.gd b/tests/job_system_validation.gd index 1fe5ceb..89e46f6 100644 --- a/tests/job_system_validation.gd +++ b/tests/job_system_validation.gd @@ -205,8 +205,11 @@ func _run() -> void: ) assert(bool(decoded.get("ok", false))) var save_data: Dictionary = decoded["data"] - assert(int(save_data.get("save_version", -1)) == 10) + assert(int(save_data.get("save_version", -1)) == 11) assert(PlayerJobService.validate_save_data(save_data.get("jobs", {}))) + assert(not PlayerHomeState.sanitize_save_data( + save_data.get("home", {}) + ).is_empty()) _validate_pause_session_switch(main, session) main.queue_free() diff --git a/tests/player_experience_validation.gd b/tests/player_experience_validation.gd index 5e9dbef..a76a3dd 100644 --- a/tests/player_experience_validation.gd +++ b/tests/player_experience_validation.gd @@ -143,7 +143,7 @@ func _validate_save_migration() -> void: version_five, 5, ) - assert(int(migrated.get("save_version", -1)) == 10) + assert(int(migrated.get("save_version", -1)) == 11) var experience_data: Dictionary = migrated.get("experience", {}) assert(int(experience_data.get("total_experience", -1)) == 0) var world_data: Dictionary = migrated.get("world", {}) @@ -155,6 +155,9 @@ func _validate_save_migration() -> void: assert( PlayerJobService.validate_save_data(migrated.get("jobs", {})) ) + assert(not PlayerHomeState.sanitize_save_data( + migrated.get("home", {}) + ).is_empty()) manager.queue_free() diff --git a/tests/progression_archive_validation.gd b/tests/progression_archive_validation.gd index c3f9569..30f0df6 100644 --- a/tests/progression_archive_validation.gd +++ b/tests/progression_archive_validation.gd @@ -22,11 +22,24 @@ func _run() -> void: var save_manager := main.get("_save_manager") as PlayerSaveManager var player := main.get("_player") as Player var data_root := main.get("_data_root") as PlayerDataRoot - assert(save_manager != null and player != null and data_root != null) + var home_state := main.get("_home_state") as PlayerHomeState + assert( + save_manager != null + and player != null + and data_root != null + and home_state != null + ) assert(save_manager.initialize_new_game(864209)) save_manager.set_autosave_enabled(true) assert(player.wallet.restore_balance(4321)) assert(player.bag.add_item(&"coffee")) + assert(home_state.add_owned_decor(&"basic_cube")) + assert(not home_state.place_decor( + &"basic_cube", + Vector3.ZERO, + 0.0, + PlayerHomeState.PlacementMode.GRID, + ).is_empty()) assert(save_manager.save_now()) var save_path: String = str(save_manager.get("_save_path")) @@ -38,7 +51,14 @@ func _run() -> void: _assert_opaque(save_path) var decoded: Dictionary = ProgressionSaveCodec.read_local_save(save_path) assert(bool(decoded.get("ok", false))) - assert(int((decoded["data"] as Dictionary)["save_version"]) == 10) + assert(int((decoded["data"] as Dictionary)["save_version"]) == 11) + assert(not PlayerHomeState.sanitize_save_data( + (decoded["data"] as Dictionary).get("home", {}) + ).is_empty()) + assert( + ((decoded["data"] as Dictionary)["home"] as Dictionary) + .get("placements", []).size() == 1 + ) var legacy_container_path: String = data_root.progression_backup_directory().path_join( "netfishing-container.nfsave" ) @@ -74,6 +94,8 @@ func _run() -> void: assert(save_manager.load_player_data()) assert(player.wallet.get_balance() == 4321) assert(save_manager.get_world_seed() == 864209) + assert(home_state.get_owned_count(&"basic_cube") == 1) + assert(home_state.get_placed_count(&"basic_cube") == 1) var legacy_data: Dictionary = ( ProgressionSaveCodec.read_local_save(save_path)["data"] diff --git a/tests/unified_inventory_validation.gd b/tests/unified_inventory_validation.gd index e9a0d85..6928969 100644 --- a/tests/unified_inventory_validation.gd +++ b/tests/unified_inventory_validation.gd @@ -35,6 +35,41 @@ func _run() -> void: hotbar.setup(bag, ItemCatalogResource, catches, layout) assert(PlayerInventoryLayout.INVENTORY_CAPACITIES == [9, 18, 27, 36]) assert(PlayerCoolerCapacity.CAPACITIES == [9, 18, 27, 36, 45, 54, 63, 72]) + var basic_cube: ItemData = ItemCatalogResource.get_item_by_id(&"basic_cube") + assert(basic_cube != null) + assert(basic_cube.icon != null) + assert(basic_cube.hotbar_allowed) + assert(bag.add_item(&"basic_cube")) + assert(layout.is_item_in_inventory(&"basic_cube")) + assert(hotbar.assign_item(0, &"basic_cube")) + assert(hotbar.get_item_id(0) == &"basic_cube") + assert( + layout.get_container( + PlayerInventoryLayout.EntryKind.ITEM, + &"basic_cube", + ) == PlayerInventoryLayout.InventoryContainer.HOTBAR + ) + assert(hotbar.clear_slot(0)) + assert(layout.is_item_in_inventory(&"basic_cube")) + assert(bag.remove_item(&"basic_cube")) + var packed_decor_slot: int = hotbar.find_first_empty_slot() + assert(packed_decor_slot == 0) + assert(layout.prepare_new_item_placement( + &"basic_cube", + PlayerInventoryLayout.InventoryContainer.HOTBAR, + packed_decor_slot, + )) + assert(bag.add_item(&"basic_cube")) + assert( + layout.get_container( + PlayerInventoryLayout.EntryKind.ITEM, + &"basic_cube", + ) == PlayerInventoryLayout.InventoryContainer.HOTBAR + ) + assert(hotbar.assign_item(packed_decor_slot, &"basic_cube")) + assert(hotbar.select_slot(packed_decor_slot)) + assert(hotbar.get_selected_item_id() == &"basic_cube") + assert(bag.remove_item(&"basic_cube")) assert(bag.add_item(&"coffee", 3)) assert(layout.get_inventory_count() == 1) diff --git a/ui/decor_shop.gd b/ui/decor_shop.gd new file mode 100644 index 0000000..9292806 --- /dev/null +++ b/ui/decor_shop.gd @@ -0,0 +1,323 @@ +class_name DecorShop +extends Control + +const INPUT_OWNER: StringName = &"decor_shop" +const DecorCatalogType = preload("res://homes/decor_catalog.gd") +const UtilityPageStyleType = preload("res://ui/utility_page_style.gd") + +signal menu_visibility_changed(is_open: bool) +signal menu_exit_started + +var _player: Player +var _wallet: PlayerWallet +var _fishing_spot: FishingSpot +var _interaction: DecorShopInteraction +var _bag: PlayerBag +var _home_state: PlayerHomeState +var _network_shop: NetworkShopService +var _wallet_label: Label +var _owned_label: Label +var _feedback: Label +var _buy_button: Button +var _close_button: Button +var _transaction_pending: bool = false +var _prior_movement_enabled: bool = true +var _prior_camera_enabled: bool = true +var _prior_mouse_mode: Input.MouseMode = Input.MOUSE_MODE_VISIBLE + + +func _ready() -> void: + UtilityPageStyleType.apply_page(self) + _build_ui() + hide() + + +func setup( + player: Player, + wallet: PlayerWallet, + fishing_spot: FishingSpot, + interaction: DecorShopInteraction, + bag: PlayerBag, + home_state: PlayerHomeState, + network_shop: NetworkShopService, +) -> void: + _player = player + _wallet = wallet + _fishing_spot = fishing_spot + _interaction = interaction + _bag = bag + _home_state = home_state + _network_shop = network_shop + if not _wallet.balance_changed.is_connected(_on_wallet_changed): + _wallet.balance_changed.connect(_on_wallet_changed) + if not _bag.contents_changed.is_connected(_refresh): + _bag.contents_changed.connect(_refresh) + if not _home_state.changed.is_connected(_refresh): + _home_state.changed.connect(_refresh) + if ( + _network_shop != null + and not _network_shop.local_purchase_pending.is_connected( + _on_purchase_pending + ) + ): + _network_shop.local_purchase_pending.connect(_on_purchase_pending) + _network_shop.local_purchase_finished.connect(_on_purchase_finished) + _refresh() + + +func set_world_interaction(interaction: DecorShopInteraction) -> void: + _interaction = interaction + + +func open_shop() -> bool: + if ( + visible + or _player == null + or _wallet == null + or _fishing_spot == null + or _interaction == null + or not _interaction.is_local_player_in_range() + or not _fishing_spot.can_open_fishing_shop() + ): + return false + _prior_movement_enabled = _player.is_movement_enabled() + _prior_camera_enabled = _player.is_camera_input_enabled() + _prior_mouse_mode = Input.mouse_mode + _player.set_movement_enabled(false) + _player.set_camera_input_enabled(false) + _fishing_spot.set_local_menu_input_suppressed(INPUT_OWNER, true) + Input.mouse_mode = Input.MOUSE_MODE_VISIBLE + _transaction_pending = ( + _network_shop != null + and _network_shop.is_local_purchase_pending() + ) + _feedback.text = "" + _refresh() + show() + _buy_button.call_deferred("grab_focus") + menu_visibility_changed.emit(true) + return true + + +func close_shop(restore_controls: bool = true) -> void: + if not visible: + return + menu_exit_started.emit() + get_viewport().gui_release_focus() + hide() + if _fishing_spot != null: + _fishing_spot.set_local_menu_input_suppressed(INPUT_OWNER, false) + if restore_controls and _player != null: + _player.set_movement_enabled(_prior_movement_enabled) + _player.set_camera_input_enabled(_prior_camera_enabled) + Input.mouse_mode = _prior_mouse_mode + menu_visibility_changed.emit(false) + + +func consume_escape() -> bool: + if not visible: + return false + close_shop() + return true + + +func close_for_range_exit() -> void: + close_shop() + + +func close_for_water_recovery() -> void: + close_shop(false) + + +func close_for_session_end() -> void: + close_shop(false) + + +func _unhandled_input(event: InputEvent) -> void: + if not visible or not event.is_action_pressed("ui_cancel"): + return + close_shop() + get_viewport().set_input_as_handled() + + +func _purchase_cube() -> void: + if _network_shop == null or _transaction_pending: + return + var request_id: String = _network_shop.request_decor( + DecorCatalogType.BASIC_CUBE_ID + ) + if request_id.is_empty(): + _refresh() + + +func _on_purchase_pending(_request_id: String) -> void: + _transaction_pending = true + _feedback.text = "purchasing…" + _refresh() + + +func _on_purchase_finished( + _request_id: String, + accepted: bool, + message: String, + product_id: StringName, + category: int, + _quantity: int, + total_cost: int, +) -> void: + if ( + category != NetworkShopProtocol.ProductCategory.DECOR + or product_id != DecorCatalogType.BASIC_CUBE_ID + ): + return + _transaction_pending = false + _feedback.text = ( + "basic cube purchased · %d fishcoin spent" % total_cost + if accepted + else message.to_lower() + ) + _refresh() + + +func _on_wallet_changed(_balance: int, _delta: int) -> void: + _refresh() + + +func _refresh() -> void: + if _wallet_label == null: + return + var balance: int = _wallet.get_balance() if _wallet != null else 0 + var owned: int = ( + _home_state.get_owned_count(DecorCatalogType.BASIC_CUBE_ID) + if _home_state != null else 0 + ) + var carried: int = ( + _bag.get_quantity(DecorCatalogType.BASIC_CUBE_ID) + if _bag != null else 0 + ) + _wallet_label.text = "%d fishcoins" % balance + _owned_label.text = "owned %d · packed %d" % [owned, carried] + _buy_button.disabled = ( + _transaction_pending + or _wallet == null + or not _wallet.can_afford( + DecorCatalogType.get_price(DecorCatalogType.BASIC_CUBE_ID) + ) + or _bag == null + or not _bag.can_add_item(DecorCatalogType.BASIC_CUBE_ID, 1) + or owned >= DecorCatalogType.MAX_OWNED_PER_PRODUCT + ) + + +func _build_ui() -> void: + set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + z_index = 83 + mouse_filter = Control.MOUSE_FILTER_STOP + var blocker := ColorRect.new() + blocker.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + blocker.color = Color(0.02, 0.08, 0.10, 0.55) + blocker.mouse_filter = Control.MOUSE_FILTER_STOP + add_child(blocker) + + var panel := PanelContainer.new() + panel.set_anchors_preset(Control.PRESET_CENTER) + panel.position = Vector2(-440.0, -250.0) + panel.size = Vector2(880.0, 500.0) + panel.add_theme_stylebox_override( + "panel", + UtilityPageStyleType.rounded_style( + UtilityPageStyleType.OCEAN_PANEL_DEEP, 24 + ), + ) + add_child(panel) + var margin := MarginContainer.new() + for side: StringName in [ + &"margin_left", &"margin_top", &"margin_right", &"margin_bottom", + ]: + margin.add_theme_constant_override(side, 28) + panel.add_child(margin) + var layout := VBoxContainer.new() + layout.add_theme_constant_override("separation", 18) + margin.add_child(layout) + + var header := HBoxContainer.new() + header.add_theme_constant_override("separation", 12) + layout.add_child(header) + var title := Label.new() + title.text = "decor" + title.add_theme_font_size_override("font_size", 38) + title.size_flags_horizontal = Control.SIZE_EXPAND_FILL + header.add_child(title) + _wallet_label = Label.new() + _wallet_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT + _wallet_label.add_theme_font_size_override("font_size", 22) + header.add_child(_wallet_label) + + var item_panel := PanelContainer.new() + item_panel.size_flags_vertical = Control.SIZE_EXPAND_FILL + item_panel.add_theme_stylebox_override( + "panel", + UtilityPageStyleType.rounded_style( + UtilityPageStyleType.OCEAN_FIELD, 18 + ), + ) + layout.add_child(item_panel) + var item_margin := MarginContainer.new() + for side: StringName in [ + &"margin_left", &"margin_top", &"margin_right", &"margin_bottom", + ]: + item_margin.add_theme_constant_override(side, 24) + item_panel.add_child(item_margin) + var item_row := HBoxContainer.new() + item_row.add_theme_constant_override("separation", 28) + item_margin.add_child(item_row) + var preview := Panel.new() + preview.custom_minimum_size = Vector2(150.0, 150.0) + preview.add_theme_stylebox_override( + "panel", + UtilityPageStyleType.rounded_style(Color("b77a55"), 12), + ) + item_row.add_child(preview) + var details := VBoxContainer.new() + details.size_flags_horizontal = Control.SIZE_EXPAND_FILL + details.add_theme_constant_override("separation", 10) + item_row.add_child(details) + var item_name := Label.new() + item_name.text = DecorCatalogType.get_display_name( + DecorCatalogType.BASIC_CUBE_ID + ) + item_name.add_theme_font_size_override("font_size", 32) + details.add_child(item_name) + var description := Label.new() + description.text = DecorCatalogType.get_description( + DecorCatalogType.BASIC_CUBE_ID + ) + description.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + description.add_theme_font_size_override("font_size", 20) + description.size_flags_vertical = Control.SIZE_EXPAND_FILL + details.add_child(description) + _owned_label = Label.new() + _owned_label.add_theme_font_size_override("font_size", 18) + details.add_child(_owned_label) + _buy_button = Button.new() + _buy_button.text = "buy · 1 fishcoin" + _buy_button.custom_minimum_size = Vector2(260.0, 58.0) + UtilityPageStyleType.apply_ocean_button(_buy_button) + _buy_button.pressed.connect(_purchase_cube) + details.add_child(_buy_button) + + var footer := HBoxContainer.new() + footer.add_theme_constant_override("separation", 12) + layout.add_child(footer) + _feedback = Label.new() + _feedback.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _feedback.add_theme_font_size_override("font_size", 18) + footer.add_child(_feedback) + _close_button = Button.new() + _close_button.text = "close" + _close_button.custom_minimum_size = Vector2(150.0, 50.0) + UtilityPageStyleType.apply_ocean_button(_close_button) + _close_button.pressed.connect(close_shop) + footer.add_child(_close_button) + _buy_button.focus_neighbor_bottom = _buy_button.get_path_to(_close_button) + _close_button.focus_neighbor_top = _close_button.get_path_to(_buy_button) diff --git a/ui/decor_shop.gd.uid b/ui/decor_shop.gd.uid new file mode 100644 index 0000000..ed65203 --- /dev/null +++ b/ui/decor_shop.gd.uid @@ -0,0 +1 @@ +uid://810ck3mvbn5v diff --git a/ui/decor_shop.tscn b/ui/decor_shop.tscn new file mode 100644 index 0000000..2b26f04 --- /dev/null +++ b/ui/decor_shop.tscn @@ -0,0 +1,14 @@ +[gd_scene load_steps=2 format=3] + +[ext_resource type="Script" path="res://ui/decor_shop.gd" id="1_script"] + +[node name="DecorShop" type="Control"] +unique_name_in_owner = true +visible = false +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_script") diff --git a/ui/game_ui.gd b/ui/game_ui.gd index 3ce0d17..585efc9 100644 --- a/ui/game_ui.gd +++ b/ui/game_ui.gd @@ -20,6 +20,7 @@ const TitleScreenType = preload("res://ui/title_screen.gd") const PauseMenuType = preload("res://ui/pause_menu.gd") const NetworkSessionType = preload("res://network/network_session.gd") const FishingShopType = preload("res://ui/fishing_shop.gd") +const DecorShopType = preload("res://ui/decor_shop.gd") const SettingsPanelType = preload("res://ui/settings_panel.gd") const PlayerFishingUpgradesType = preload( "res://progression/player_fishing_upgrades.gd" @@ -27,7 +28,11 @@ const PlayerFishingUpgradesType = preload( const ShopInteractionType = preload( "res://world/fishing_shop_interaction.gd" ) +const DecorShopInteractionType = preload( + "res://world/decor_shop_interaction.gd" +) const PlayerStorageType = preload("res://ui/player_storage.gd") +const HomeDecorToolbarType = preload("res://ui/home_decor_toolbar.gd") const PlayerStorageInteractionType = preload( "res://world/player_storage_interaction.gd" ) @@ -71,6 +76,9 @@ const MAIN_BUBBLE_PROFILE: BubbleMenuProfile = preload( const ACTIVE_BAIT_EMPTY_ICON: Texture2D = preload( "res://ui/icons/pictograms/x_dark.png" ) +const RV_STORAGE_ICON: Texture2D = preload( + "res://ui/icons/tab_menu/inventory_simple.png" +) signal pixelation_settings_visibility_changed(is_visible: bool) signal crisp_reset_focus_requested @@ -82,6 +90,7 @@ signal virtual_pointer_mode_changed(is_active: bool) signal social_prompt_accepted signal social_prompt_declined signal data_root_changed +signal rv_storage_requested const VIRTUAL_MOUSE_INPUT_OWNER: StringName = &"controller_virtual_mouse" const EMOTE_RADIAL_CAMERA_OWNER: StringName = &"emote_radial_menu" @@ -145,7 +154,10 @@ const SHOP_NPC_SPEECH_COOLDOWN_MILLISECONDS: int = 5000 @onready var _social_prompt: BubbleConfirmationPage = %SocialPrompt @onready var _hotbar_ui: HotbarUIType = %Hotbar @onready var _fishing_shop: FishingShopType = %FishingShop +@onready var _decor_shop: DecorShopType = %DecorShop @onready var _player_storage: PlayerStorageType = %PlayerStorage +@onready var _home_decor_toolbar: HomeDecorToolbarType = %HomeDecorToolbar +@onready var _rv_storage_button: Button = %RVStorageButton @onready var _storage_prompt: PanelContainer = %StoragePrompt @onready var _storage_prompt_message: Label = %StoragePromptMessage @onready var _shop_prompt: Control = %ShopPrompt @@ -195,6 +207,7 @@ var _chat_input_open: bool = false var _player_menu_hotbar_visible: bool = false var _main_shop_buyer: FishBuyerProfileType var _shop_interaction: ShopInteractionType +var _decor_shop_interaction: DecorShopInteractionType var _storage_interaction: PlayerStorageInteractionType var _surface_drawing: NetworkSurfaceDrawingService var _surface_drawing_hotbar_selected: bool = false @@ -221,14 +234,17 @@ var _controller_text_entry_request: Callable var _controller_text_entry_is_open: Callable var _controller_text_entry_close: Callable var _restore_chat_keyboard_after_fishing: bool = false +var _rv_storage_button_requested_visible: bool = false func _ready() -> void: _prioritize_surface_drawing_pointer_input() _bite_prompt_button.pressed.connect(_on_bite_prompt_pressed) + _rv_storage_button.pressed.connect(_on_rv_storage_button_pressed) _social_prompt.confirmed.connect(_accept_social_prompt) _social_prompt.cancelled.connect(_decline_social_prompt) _apply_active_bait_indicator_style() + _apply_rv_storage_button_style() _refresh_active_bait_indicator() _refresh_interaction_prompt_bindings() # Reward feedback must remain above full-screen canonical menus. Keeping the @@ -346,11 +362,13 @@ func setup( fishing_upgrades: PlayerFishingUpgradesType, shop_interaction: ShopInteractionType, storage_interaction: PlayerStorageInteractionType, + decor_shop_interaction: DecorShopInteractionType, item_effects: PlayerItemEffectsType, cooler_capacity: PlayerCoolerCapacityType, network_session: NetworkSessionType, network_sale_service: NetworkSaleService, network_shop_service: NetworkShopService, + home_state: PlayerHomeState, network_chat_service: NetworkChatService, network_profile: NetworkProfilePreferences, spawn_service: PlayerSpawnService, @@ -494,6 +512,15 @@ func setup( network_sale_service, reservations, ) + _decor_shop.setup( + player, + wallet, + fishing_spot, + decor_shop_interaction, + bag, + home_state, + network_shop_service, + ) _player_storage.setup( player, fishing_spot, @@ -509,6 +536,8 @@ func setup( ) _fishing_shop.menu_visibility_changed.connect(_on_shop_visibility_changed) _fishing_shop.menu_exit_started.connect(_on_shop_exit_started) + _decor_shop.menu_visibility_changed.connect(_on_shop_visibility_changed) + _decor_shop.menu_exit_started.connect(_on_shop_exit_started) _fishing_shop.sell_fish_requested.connect(_on_shop_sell_fish_requested) _fishing_shop.shop_cooler_return_requested.connect( _on_shop_cooler_return_requested @@ -518,6 +547,7 @@ func setup( ) _main_shop_buyer = main_shop_buyer _shop_interaction = shop_interaction + _decor_shop_interaction = decor_shop_interaction _storage_interaction = storage_interaction _surface_drawing = surface_drawing if ( @@ -540,11 +570,14 @@ func setup( func set_world_interactions( shop_interaction: ShopInteractionType, storage_interaction: PlayerStorageInteractionType, + decor_shop_interaction: DecorShopInteractionType, ) -> void: _shop_interaction = shop_interaction _storage_interaction = storage_interaction + _decor_shop_interaction = decor_shop_interaction _fishing_shop.set_world_interaction(shop_interaction) _player_storage.set_world_interaction(storage_interaction) + _decor_shop.set_world_interaction(decor_shop_interaction) func _prioritize_surface_drawing_pointer_input() -> void: @@ -1655,6 +1688,34 @@ func _apply_active_bait_indicator_style() -> void: _active_bait_button.add_theme_color_override(state, Color.WHITE) +func _apply_rv_storage_button_style() -> void: + var normal_style: StyleBoxFlat = MAIN_BUBBLE_PROFILE.make_normal_style() + var hover_style: StyleBoxFlat = MAIN_BUBBLE_PROFILE.make_hover_style() + var pressed_style: StyleBoxFlat = MAIN_BUBBLE_PROFILE.make_pressed_style() + for style: StyleBoxFlat in [normal_style, hover_style, pressed_style]: + style.set_corner_radius_all(29) + style.content_margin_left = 9.0 + style.content_margin_top = 9.0 + style.content_margin_right = 9.0 + style.content_margin_bottom = 9.0 + _rv_storage_button.icon = RV_STORAGE_ICON + _rv_storage_button.add_theme_stylebox_override("normal", normal_style) + _rv_storage_button.add_theme_stylebox_override("hover", hover_style) + _rv_storage_button.add_theme_stylebox_override("focus", hover_style) + _rv_storage_button.add_theme_stylebox_override("pressed", pressed_style) + for state: StringName in [ + &"icon_normal_color", + &"icon_hover_color", + &"icon_focus_color", + &"icon_pressed_color", + ]: + _rv_storage_button.add_theme_color_override(state, Color.WHITE) + + +func _on_rv_storage_button_pressed() -> void: + rv_storage_requested.emit() + + func _refresh_active_bait_indicator() -> void: _refresh_active_bait_indicator_visibility() if not is_node_ready(): @@ -1718,17 +1779,20 @@ func set_gameplay_ui_enabled(enabled: bool) -> void: if not enabled: _gameplay_hud_hidden = false _refresh_active_bait_indicator_visibility() + _refresh_rv_storage_button_visibility() if enabled: _try_start_shop_npc_speech() _refresh_gameplay_hud_visibility() _refresh_chat_availability() if not enabled: + _home_decor_toolbar.set_active(false) _end_virtual_mouse() _close_radial_menus() if _surface_drawing != null: _surface_drawing.deactivate() close_player_menu_for_session_end() _fishing_shop.close_for_session_end() + _decor_shop.close_for_session_end() _player_storage.close_for_session_end() _fishing_panel.visible = false _shop_prompt.hide() @@ -1749,6 +1813,7 @@ func set_gameplay_hud_hidden(hidden: bool) -> void: _quick_radial_menu.set_hud_hidden(hidden) _refresh_gameplay_hud_visibility() _refresh_active_bait_indicator_visibility() + _refresh_rv_storage_button_visibility() _refresh_hotbar_visibility() _refresh_chat_availability() @@ -1864,13 +1929,43 @@ func get_fishing_shop() -> FishingShopType: return _fishing_shop +func get_decor_shop() -> DecorShopType: + return _decor_shop + + func get_player_storage() -> PlayerStorageType: return _player_storage +func get_home_decor_toolbar() -> HomeDecorToolbarType: + return _home_decor_toolbar + + +func set_rv_interior_camera_mode(enabled: bool) -> void: + _hotbar_ui.set_rv_interior_camera_mode(enabled) + + +func set_rv_storage_button_visible(requested_visible: bool) -> void: + _rv_storage_button_requested_visible = requested_visible + _refresh_rv_storage_button_visibility() + + +func _refresh_rv_storage_button_visibility() -> void: + _rv_storage_button.visible = ( + _rv_storage_button_requested_visible + and _gameplay_ui_enabled + and not _gameplay_hud_hidden + and not _system_menu_open + and not _player_menu_open + and not _shop_open + and not _storage_open + ) + + func set_storage_prompt_visible( requested_visible: bool, world_anchor: Vector3 = Vector3(0.0, INF, 0.0), + action_text: String = "open storage", ) -> void: if not _storage_prompt.has_meta(&"styled"): _storage_prompt.set_meta(&"styled", true) @@ -1879,6 +1974,7 @@ func set_storage_prompt_visible( ) style.anti_aliasing = false _storage_prompt.add_theme_stylebox_override("panel", style) + _storage_prompt_message.text = action_text _storage_prompt.visible = ( requested_visible and _gameplay_ui_enabled @@ -2762,6 +2858,7 @@ func _refresh_hotbar_visibility() -> void: func _emit_interactive_pointer_ui_changed() -> void: _refresh_active_bait_indicator_visibility() + _refresh_rv_storage_button_visibility() interactive_pointer_ui_changed.emit( _system_menu_open or _player_menu_open diff --git a/ui/game_ui.tscn b/ui/game_ui.tscn index 483433a..c219c84 100644 --- a/ui/game_ui.tscn +++ b/ui/game_ui.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=22 format=3] +[gd_scene load_steps=24 format=3] [ext_resource type="Script" path="res://ui/game_ui.gd" id="1_ui"] [ext_resource type="PackedScene" path="res://ui/player_menu.tscn" id="2_menu"] @@ -15,6 +15,8 @@ [ext_resource type="Script" path="res://ui/controller_virtual_cursor.gd" id="13_cursor"] [ext_resource type="PackedScene" path="res://ui/player_storage.tscn" id="14_storage"] [ext_resource type="PackedScene" path="res://ui/components/bubble_menu/bubble_confirmation_page.tscn" id="15_social_prompt"] +[ext_resource type="PackedScene" path="res://ui/decor_shop.tscn" id="16_decor_shop"] +[ext_resource type="PackedScene" path="res://ui/home_decor_toolbar.tscn" id="17_decor_toolbar"] [sub_resource type="StyleBoxFlat" id="StyleBox_chase_background"] bg_color = Color(0.032, 0.118, 0.15, 1) @@ -472,9 +474,37 @@ polygon = PackedVector2Array(-8, 0, 8, 0, 0, 10) [node name="FishingShop" parent="UIRoot/CanonicalStage" instance=ExtResource("8_shop")] unique_name_in_owner = true +[node name="DecorShop" parent="UIRoot/CanonicalStage" instance=ExtResource("16_decor_shop")] +unique_name_in_owner = true + +[node name="HomeDecorToolbar" parent="UIRoot/CanonicalStage" instance=ExtResource("17_decor_toolbar")] +unique_name_in_owner = true + [node name="PlayerStorage" parent="UIRoot/CanonicalStage" instance=ExtResource("14_storage")] unique_name_in_owner = true +[node name="RVStorageButton" type="Button" parent="UIRoot/CanonicalStage/GameplayTransientHUD"] +unique_name_in_owner = true +visible = false +z_index = 57 +layout_mode = 1 +anchors_preset = 1 +anchor_left = 1.0 +anchor_right = 1.0 +offset_left = -74.0 +offset_top = 16.0 +offset_right = -16.0 +offset_bottom = 74.0 +grow_horizontal = 0 +mouse_default_cursor_shape = 2 +focus_mode = 0 +tooltip_text = "open RV storage" +theme = ExtResource("3_theme") +texture_filter = 1 +expand_icon = true +icon_alignment = 1 +vertical_icon_alignment = 1 + [node name="StoragePrompt" type="PanelContainer" parent="UIRoot/CanonicalStage/GameplayTransientHUD"] unique_name_in_owner = true visible = false diff --git a/ui/home_decor_toolbar.gd b/ui/home_decor_toolbar.gd new file mode 100644 index 0000000..6f73219 --- /dev/null +++ b/ui/home_decor_toolbar.gd @@ -0,0 +1,126 @@ +class_name HomeDecorToolbar +extends PanelContainer + +signal placement_mode_requested(mode: int) +signal rotate_requested +signal store_requested +signal cancel_requested + +var _mode_button: Button +var _selection_label: Label +var _rotate_button: Button +var _store_button: Button +var _mode: PlayerHomeState.PlacementMode = PlayerHomeState.PlacementMode.GRID + + +func _ready() -> void: + _build_ui() + hide() + + +func set_active(active: bool) -> void: + if visible == active: + return + visible = active + if active and _mode_button != null: + _mode_button.call_deferred("grab_focus") + + +func set_mode(mode: PlayerHomeState.PlacementMode) -> void: + _mode = mode + if _mode_button != null: + _mode_button.text = ( + "placement: grid" + if mode == PlayerHomeState.PlacementMode.GRID + else "placement: free" + ) + + +func set_selection(instance_id: String, display_name: String = "") -> void: + var selected: bool = not instance_id.is_empty() + if _selection_label != null: + _selection_label.text = ( + "selected: %s" % display_name + if selected else "click decor to select; drag to move" + ) + if _rotate_button != null: + _rotate_button.disabled = not selected + if _store_button != null: + _store_button.disabled = not selected + + +func report_status(message: String) -> void: + if _selection_label != null: + _selection_label.text = message + + +func _build_ui() -> void: + custom_minimum_size = Vector2(330.0, 0.0) + position = Vector2(925.0, 540.0) + z_index = 58 + mouse_filter = Control.MOUSE_FILTER_STOP + add_theme_stylebox_override( + "panel", + UtilityPageStyle.rounded_style( + Color(UtilityPageStyle.OCEAN_PANEL_DEEP, 0.96), 16 + ), + ) + var margin := MarginContainer.new() + for side: StringName in [ + &"margin_left", &"margin_top", &"margin_right", &"margin_bottom", + ]: + margin.add_theme_constant_override(side, 12) + add_child(margin) + var layout := VBoxContainer.new() + layout.add_theme_constant_override("separation", 8) + margin.add_child(layout) + var title := Label.new() + title.text = "RV decor" + title.add_theme_font_size_override("font_size", 24) + layout.add_child(title) + _selection_label = Label.new() + _selection_label.text = "click decor to select; drag to move" + _selection_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + _selection_label.add_theme_font_size_override("font_size", 17) + layout.add_child(_selection_label) + var row := HBoxContainer.new() + row.add_theme_constant_override("separation", 8) + layout.add_child(row) + _mode_button = Button.new() + _mode_button.text = "placement: grid" + _mode_button.size_flags_horizontal = Control.SIZE_EXPAND_FILL + UtilityPageStyle.apply_ocean_button(_mode_button) + _mode_button.pressed.connect(_toggle_mode) + row.add_child(_mode_button) + _rotate_button = Button.new() + _rotate_button.text = "rotate" + _rotate_button.disabled = true + UtilityPageStyle.apply_ocean_button(_rotate_button) + _rotate_button.pressed.connect(rotate_requested.emit) + row.add_child(_rotate_button) + var action_row := HBoxContainer.new() + action_row.add_theme_constant_override("separation", 8) + layout.add_child(action_row) + _store_button = Button.new() + _store_button.text = "pack up" + _store_button.disabled = true + _store_button.size_flags_horizontal = Control.SIZE_EXPAND_FILL + UtilityPageStyle.apply_ocean_button(_store_button) + _store_button.pressed.connect(store_requested.emit) + action_row.add_child(_store_button) + var cancel_button := Button.new() + cancel_button.text = "clear selection" + cancel_button.size_flags_horizontal = Control.SIZE_EXPAND_FILL + UtilityPageStyle.apply_ocean_button(cancel_button) + cancel_button.pressed.connect(cancel_requested.emit) + action_row.add_child(cancel_button) + + +func _toggle_mode() -> void: + _mode = ( + PlayerHomeState.PlacementMode.FREE + if _mode == PlayerHomeState.PlacementMode.GRID + else PlayerHomeState.PlacementMode.GRID + ) + set_mode(_mode) + placement_mode_requested.emit(int(_mode)) diff --git a/ui/home_decor_toolbar.gd.uid b/ui/home_decor_toolbar.gd.uid new file mode 100644 index 0000000..b1bb23b --- /dev/null +++ b/ui/home_decor_toolbar.gd.uid @@ -0,0 +1 @@ +uid://bmtlixw3wief3 diff --git a/ui/home_decor_toolbar.tscn b/ui/home_decor_toolbar.tscn new file mode 100644 index 0000000..671308d --- /dev/null +++ b/ui/home_decor_toolbar.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3] + +[ext_resource type="Script" path="res://ui/home_decor_toolbar.gd" id="1_script"] + +[node name="HomeDecorToolbar" type="PanelContainer"] +unique_name_in_owner = true +visible = false +script = ExtResource("1_script") diff --git a/ui/hotbar.gd b/ui/hotbar.gd index 24a9aa8..5f54217 100644 --- a/ui/hotbar.gd +++ b/ui/hotbar.gd @@ -37,6 +37,7 @@ var _slots: Array[BubbleHotbarSlotType] = [] var _gameplay_input_enabled: bool = false var _drag_enabled: bool = false var _swap_hotbar_camera_scroll: bool = false +var _rv_interior_camera_mode: bool = false var _motion_elapsed: float = 0.0 var _compact_layout: bool = false var _player_menu_context: bool = false @@ -99,6 +100,10 @@ func set_swap_hotbar_camera_scroll(enabled: bool) -> void: _swap_hotbar_camera_scroll = enabled +func set_rv_interior_camera_mode(enabled: bool) -> void: + _rv_interior_camera_mode = enabled + + func set_drag_enabled(enabled: bool) -> void: _drag_enabled = enabled for slot: BubbleHotbarSlotType in _slots: @@ -308,7 +313,11 @@ func _unhandled_input(event: InputEvent) -> void: if ( event is InputEventMouseButton and event.pressed - and event.shift_pressed == _swap_hotbar_camera_scroll + and ( + event.shift_pressed + if _rv_interior_camera_mode + else event.shift_pressed == _swap_hotbar_camera_scroll + ) ): if event.button_index == MOUSE_BUTTON_WHEEL_UP: _hotbar.cycle_selection(-1) diff --git a/ui/player_storage.gd b/ui/player_storage.gd index 25eb0d4..1f553ea 100644 --- a/ui/player_storage.gd +++ b/ui/player_storage.gd @@ -4,6 +4,7 @@ extends Control const INPUT_OWNER: StringName = &"player_storage" signal menu_visibility_changed(is_open: bool) +signal decorate_requested var _player: Player var _fishing_spot: FishingSpot @@ -14,6 +15,9 @@ var _storage_grid: GeneralInventoryGrid var _inventory_count: Label var _storage_count: Label var _feedback: Label +var _title: Label +var _decorate_button: Button +var _home_access: bool = false var _prior_movement_enabled: bool = true var _prior_camera_enabled: bool = true var _prior_mouse_mode: Input.MouseMode = Input.MOUSE_MODE_VISIBLE @@ -75,15 +79,34 @@ func set_world_interaction(interaction: PlayerStorageInteraction) -> void: func open_storage() -> bool: + return _open_storage(false) + + +func open_storage_from_home(allow_decorating: bool = true) -> bool: + return _open_storage(true, allow_decorating) + + +func _open_storage( + home_access: bool, + allow_decorating: bool = false, +) -> bool: if ( visible or _player == null - or _interaction == null - or not _interaction.is_local_player_in_range() or _fishing_spot == null or not _fishing_spot.can_open_fishing_shop() + or ( + not home_access + and ( + _interaction == null + or not _interaction.is_local_player_in_range() + ) + ) ): return false + _home_access = home_access + _title.text = "RV storage" if home_access else "private storage" + _decorate_button.visible = home_access and allow_decorating _prior_movement_enabled = _player.is_movement_enabled() _prior_camera_enabled = _player.is_camera_input_enabled() _prior_mouse_mode = Input.mouse_mode @@ -112,10 +135,13 @@ func close_storage(restore_controls: bool = true) -> void: _player.set_movement_enabled(_prior_movement_enabled) _player.set_camera_input_enabled(_prior_camera_enabled) Input.mouse_mode = _prior_mouse_mode + _home_access = false menu_visibility_changed.emit(false) func close_for_range_exit() -> void: + if _home_access: + return close_storage() @@ -248,12 +274,20 @@ func _build_ui() -> void: var header := HBoxContainer.new() layout.add_child(header) - var title := Label.new() - title.text = "private storage" - title.add_theme_font_size_override("font_size", 32) - title.add_theme_color_override("font_color", UtilityPageStyle.OCEAN_TEXT_PRIMARY) - title.size_flags_horizontal = Control.SIZE_EXPAND_FILL - header.add_child(title) + _title = Label.new() + _title.text = "private storage" + _title.add_theme_font_size_override("font_size", 32) + _title.add_theme_color_override("font_color", UtilityPageStyle.OCEAN_TEXT_PRIMARY) + _title.size_flags_horizontal = Control.SIZE_EXPAND_FILL + header.add_child(_title) + _decorate_button = Button.new() + _decorate_button.text = "decorate RV" + _decorate_button.tooltip_text = "Place decor inside your RV" + _decorate_button.custom_minimum_size = Vector2(160.0, 48.0) + UtilityPageStyle.apply_ocean_button(_decorate_button) + _decorate_button.hide() + _decorate_button.pressed.connect(_request_decorating) + header.add_child(_decorate_button) var close := Button.new() close.text = "×" close.tooltip_text = "Close storage" @@ -285,6 +319,13 @@ func _build_ui() -> void: layout.add_child(_feedback) +func _request_decorating() -> void: + if not _home_access: + return + close_storage() + decorate_requested.emit() + + func _build_column(parent: HBoxContainer, title_text: String) -> Dictionary: var panel := PanelContainer.new() panel.custom_minimum_size = Vector2(550.0, 0.0) diff --git a/world/decor_shop_interaction.gd b/world/decor_shop_interaction.gd new file mode 100644 index 0000000..049bfbe --- /dev/null +++ b/world/decor_shop_interaction.gd @@ -0,0 +1,2 @@ +class_name DecorShopInteraction +extends FishingShopInteraction diff --git a/world/decor_shop_interaction.gd.uid b/world/decor_shop_interaction.gd.uid new file mode 100644 index 0000000..955738c --- /dev/null +++ b/world/decor_shop_interaction.gd.uid @@ -0,0 +1 @@ +uid://u70jgwedk7ym diff --git a/world/generation/generated_world_region.gd b/world/generation/generated_world_region.gd index 780ddb8..4e15251 100644 --- a/world/generation/generated_world_region.gd +++ b/world/generation/generated_world_region.gd @@ -9,6 +9,9 @@ const FishingShopInteractionType = preload( const PlayerStorageInteractionType = preload( "res://world/player_storage_interaction.gd" ) +const DecorShopInteractionType = preload( + "res://world/decor_shop_interaction.gd" +) const PrecipitationOcclusionType = preload( "res://world/environment/precipitation_occlusion.gd" ) @@ -80,8 +83,12 @@ const PROCEDURAL_PROP_GROUPS: Array[StringName] = [ @onready var _player_storage: PlayerStorageInteractionType = ( $Interactables/PlayerStorageBox/InteractionArea ) +@onready var _decor_shop: DecorShopInteractionType = ( + $Interactables/DecorShopWorld/InteractionArea +) @onready var _shop_root: Node3D = %FishingShopWorld @onready var _storage_root: Node3D = %PlayerStorageBox +@onready var _decor_shop_root: Node3D = %DecorShopWorld @onready var _decorations: Node3D = %Decorations @onready var _tree_anchors: GatherableAnchorSet3D = %ReachableTreeTrunks @onready var _diggable_beach: DiggableArea3D = %DiggableBeach @@ -148,6 +155,10 @@ func get_player_storage() -> PlayerStorageInteractionType: return _player_storage +func get_decor_shop() -> DecorShopInteractionType: + return _decor_shop + + func get_saltwater_shoreline_mesh() -> MeshInstance3D: return _shoreline_reference @@ -428,6 +439,8 @@ func _place_spawn_amenities(center: Vector3) -> void: _shop_root.rotation.y = PI _storage_root.position = center + Vector3(-2.4, 0.0, 1.2) _storage_root.rotation.y = PI * 0.5 + _decor_shop_root.position = center + Vector3(-2.4, 0.0, 1.2) + _decor_shop_root.rotation.y = PI * 0.5 func _configure_static_water() -> void: diff --git a/world/generation/generated_world_region.tscn b/world/generation/generated_world_region.tscn index 47ee6bc..04602e1 100644 --- a/world/generation/generated_world_region.tscn +++ b/world/generation/generated_world_region.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=14 format=3] +[gd_scene load_steps=15 format=3] [ext_resource type="Script" path="res://world/generation/generated_world_region.gd" id="1_region"] [ext_resource type="Script" path="res://world/generation/terrain_chunk_generator.gd" id="2_generator"] @@ -13,6 +13,7 @@ [ext_resource type="Resource" path="res://fish/pools/starter_pond_pool.tres" id="11_pond_pool"] [ext_resource type="Resource" path="res://world/generation/props/terrain_prop_catalog.tres" id="12_prop_catalog"] [ext_resource type="Resource" path="res://world/generation/biomes/terrain_biome_catalog.tres" id="13_biome_catalog"] +[ext_resource type="PackedScene" path="res://world/interactables/decor_shop_world.tscn" id="14_decor_shop"] [node name="GeneratedWorldRegion" type="Node3D"] script = ExtResource("1_region") @@ -98,6 +99,9 @@ unique_name_in_owner = true [node name="PlayerStorageBox" parent="Interactables" instance=ExtResource("6_storage")] unique_name_in_owner = true +[node name="DecorShopWorld" parent="Interactables" instance=ExtResource("14_decor_shop")] +unique_name_in_owner = true + [node name="Decorations" type="Node3D" parent="."] unique_name_in_owner = true diff --git a/world/interactables/decor_shop_world.tscn b/world/interactables/decor_shop_world.tscn new file mode 100644 index 0000000..6b735e2 --- /dev/null +++ b/world/interactables/decor_shop_world.tscn @@ -0,0 +1,35 @@ +[gd_scene load_steps=5 format=3] + +[ext_resource type="Script" path="res://world/decor_shop_interaction.gd" id="1_shop"] +[ext_resource type="PackedScene" path="res://art/exported/characters/base/straywild_base_character.glb" id="2_character"] +[ext_resource type="Script" path="res://world/world_character_display.gd" id="3_display"] + +[sub_resource type="SphereShape3D" id="InteractionShape"] +resource_local_to_scene = true +radius = 3.0 + +[node name="DecorShopWorld" type="Node3D"] + +[node name="Shopkeeper" parent="." instance=ExtResource("2_character")] +script = ExtResource("3_display") +species_id = "round" +fur_color_id = "orange" +ears_id = "pointy_short" +tail_id = "cat" +eyes_id = "simple_shine" +nose_id = "dog_round" +mouth_id = "three" +head_look_enabled = true + +[node name="AnimationPlayer" parent="Shopkeeper"] +autoplay = "idle" + +[node name="InteractionArea" type="Area3D" parent="."] +unique_name_in_owner = true +position = Vector3(0, 1, -0.3) +collision_layer = 0 +collision_mask = 2 +script = ExtResource("1_shop") + +[node name="InteractionShape" type="CollisionShape3D" parent="InteractionArea"] +shape = SubResource("InteractionShape") diff --git a/world/interactables/player_storage_box.tscn b/world/interactables/player_storage_box.tscn index 4bf9a8e..008f0ac 100644 --- a/world/interactables/player_storage_box.tscn +++ b/world/interactables/player_storage_box.tscn @@ -27,6 +27,8 @@ size = Vector3(1.62, 0.86, 1.02) radius = 2.3 [node name="PlayerStorageBox" type="Node3D"] +process_mode = 4 +visible = false [node name="Body" type="MeshInstance3D" parent="."] position = Vector3(0, 0.35, 0) @@ -44,6 +46,7 @@ collision_mask = 0 [node name="CollisionShape3D" type="CollisionShape3D" parent="StaticBody3D"] position = Vector3(0, 0.43, 0) +disabled = true shape = SubResource("CollisionShape") [node name="InteractionArea" type="Area3D" parent="."] @@ -54,6 +57,7 @@ collision_mask = 2 script = ExtResource("1_interaction") [node name="CollisionShape3D" type="CollisionShape3D" parent="InteractionArea"] +disabled = true shape = SubResource("InteractionShape") [node name="PromptAnchor" type="Marker3D" parent="."] diff --git a/world/regions/starter_island_region.gd b/world/regions/starter_island_region.gd index 3af3010..b418292 100644 --- a/world/regions/starter_island_region.gd +++ b/world/regions/starter_island_region.gd @@ -8,6 +8,9 @@ const FishingShopInteractionType = preload( const PlayerStorageInteractionType = preload( "res://world/player_storage_interaction.gd" ) +const DecorShopInteractionType = preload( + "res://world/decor_shop_interaction.gd" +) const FOLIAGE_WIND_SHADER: Shader = preload( "res://world/materials/foliage_wind.gdshader" ) @@ -49,6 +52,10 @@ var fishing_shop_path: NodePath = ( var player_storage_path: NodePath = ( ^"Interactables/PlayerStorageBox/InteractionArea" ) +@export_node_path("Area3D") +var decor_shop_path: NodePath = ( + ^"Interactables/DecorShopWorld/InteractionArea" +) @export_group("Terrain Collision") # The imported GLB is the collision authority. Rebuild once per region load so # newly authored terrain and props cannot retain a stale saved fallback shape. @@ -84,6 +91,10 @@ func get_player_storage() -> PlayerStorageInteractionType: return get_node_or_null(player_storage_path) as PlayerStorageInteractionType +func get_decor_shop() -> DecorShopInteractionType: + return get_node_or_null(decor_shop_path) as DecorShopInteractionType + + func get_saltwater_shoreline_mesh() -> MeshInstance3D: return get_node_or_null(^"ShorelineRibbons/Ocean") as MeshInstance3D diff --git a/world/regions/starter_island_region.tscn b/world/regions/starter_island_region.tscn index 8f4bc4b..9b95dfa 100644 --- a/world/regions/starter_island_region.tscn +++ b/world/regions/starter_island_region.tscn @@ -18,6 +18,7 @@ [ext_resource type="Script" path="res://world/water/shoreline_ribbon_config.gd" id="22_shoreline_config"] [ext_resource type="Script" path="res://world/digging/diggable_area_3d.gd" id="23_diggable_area"] [ext_resource type="Script" path="res://world/gathering/gatherable_anchor_set_3d.gd" id="24_gatherable_anchors"] +[ext_resource type="PackedScene" path="res://world/interactables/decor_shop_world.tscn" id="25_decor_shop"] [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_4e4k5"] data = PackedVector3Array(10.033899, 3.3913999, 3.3446, 13.3786, 3.3913999, 0, 13.3786, 3.3913999, 3.3446, 10.033899, 3.3913999, 3.3446, 10.033899, 3.3913999, 0, 13.3786, 3.3913999, 0, 6.6893, 3.3913999, 3.3446, 10.033899, 3.3913999, 0, 10.033899, 3.3913999, 3.3446, 6.6893, 3.3913999, 3.3446, 6.6893, 3.3913999, 0, 10.033899, 3.3913999, 0, 6.6893, 3.3913999, 0, 10.033899, 3.3913999, -3.3446, 10.033899, 3.3913999, 0, 6.6893, 3.3913999, 6.6893, 6.6893, 3.3913999, 3.3446, 10.033899, 3.3913999, 3.3446, 6.6893, 3.3913999, 6.6893, 10.033899, 3.3913999, 3.3446, 10.033899, 3.3913999, 6.6893, 3.3446, 3.3913999, 3.3446, 6.6893, 3.3913999, 0, 6.6893, 3.3913999, 3.3446, 6.6893, 3.3913999, 10.033899, 6.6893, 3.3913999, 6.6893, 10.033899, 3.3913999, 6.6893, 6.6893, 3.3913999, 10.033899, 10.033899, 3.3913999, 6.6893, 10.033899, 3.3913999, 10.033899, 3.3446, 3.3913999, 6.6893, 6.6893, 3.3913999, 3.3446, 6.6893, 3.3913999, 6.6893, 3.3446, 3.3913999, 6.6893, 3.3446, 3.3913999, 3.3446, 6.6893, 3.3913999, 3.3446, 3.3446, 3.3913999, 10.033899, 6.6893, 3.3913999, 6.6893, 6.6893, 3.3913999, 10.033899, 3.3446, 3.3913999, 10.033899, 3.3446, 3.3913999, 6.6893, 6.6893, 3.3913999, 6.6893, 0, 3.3913999, 6.6893, 3.3446, 3.3913999, 3.3446, 3.3446, 3.3913999, 6.6893, 0, 3.3913999, 6.6893, 0, 3.3913999, 3.3446, 3.3446, 3.3913999, 3.3446, 0, 3.3913999, 10.033899, 0, 3.3913999, 6.6893, 3.3446, 3.3913999, 6.6893, 0, 3.3913999, 10.033899, 3.3446, 3.3913999, 6.6893, 3.3446, 3.3913999, 10.033899, -3.3446, 3.3913999, 13.3786, -3.3446, 3.3913999, 10.033899, 0, 3.3913999, 10.033899, -3.3446, 3.3913999, 13.3786, 0, 3.3913999, 10.033899, 0, 3.3913999, 13.3786, 0, 3.3913999, 13.3786, 0, 3.3913999, 10.033899, 3.3446, 3.3913999, 10.033899, 0, 3.3913999, 13.3786, 3.3446, 3.3913999, 10.033899, 3.3446, 3.3913999, 13.3786, 3.3446, 3.3913999, 13.3786, 3.3446, 3.3913999, 10.033899, 6.6893, 3.3913999, 10.033899, 3.3446, 3.3913999, 13.3786, 6.6893, 3.3913999, 10.033899, 6.6893, 3.3913999, 13.3786, 3.9148, 3.3913999, 16.514599, 3.3446, 3.3913999, 13.3786, 6.6893, 3.3913999, 13.3786, 3.3446, 3.3913999, 13.3786, 3.9148, 3.3913999, 16.514599, 3.6399, 3.3913999, 16.2405, 3.9148, 3.3913999, 16.514599, 6.6893, 3.3913999, 13.3786, 6.6893, 3.3913999, 16.7232, 6.6893, 3.3913999, 16.7232, 6.6949, 3.3913999, 18.9914, 6.6893, 3.3913999, 18.9861, 6.6949, 3.3913999, 18.9914, 6.6893, 3.3913999, 16.7232, 10.3743, 3.3913999, 16.7232, 6.6949, 3.3913999, 18.9914, 10.3743, 3.3913999, 16.7232, 9.1275, 3.3913999, 18.830599, 10.033899, 3.3913999, -10.033899, 13.3786, 3.3913999, -13.3786, 13.3786, 3.3913999, -10.033899, 13.3786, 3.3913999, -13.3786, 16.7232, 3.3913999, -10.033899, 13.3786, 3.3913999, -10.033899, 16.7232, 3.3913999, -10.033899, 19.798899, 3.3913999, -13.1096, 19.798899, 3.3913999, -10.033899, 16.7232, 3.3913999, -10.033899, 16.7232, 3.3913999, -13.1096, 19.798899, 3.3913999, -13.1096, 16.7232, 3.3913999, -10.033899, 16.4543, 3.3913999, -13.3786, 16.7232, 3.3913999, -13.1096, 16.7232, 3.3913999, -10.033899, 13.3786, 3.3913999, -13.3786, 16.4543, 3.3913999, -13.3786, 13.3786, 3.3913999, -6.6893, 13.3786, 3.3913999, -10.033899, 16.7232, 3.3913999, -10.033899, 13.3786, 3.3913999, -6.6893, 16.7232, 3.3913999, -10.033899, 16.7232, 3.3913999, -6.6893, 10.033899, 3.3913999, -6.6893, 13.3786, 3.3913999, -10.033899, 13.3786, 3.3913999, -6.6893, 10.033899, 3.3913999, -6.6893, 10.033899, 3.3913999, -10.033899, 13.3786, 3.3913999, -10.033899, 16.4543, 3.3913999, -13.3786, 16.495699, 3.3913999, -16.459, 16.495699, 3.3913999, -13.42, 16.4543, 3.3913999, -13.3786, 12.738999, 3.3913999, -15.894899, 16.495699, 3.3913999, -16.459, 12.738999, 3.3913999, -15.894899, 16.4543, 3.3913999, -13.3786, 13.3786, 3.3913999, -13.3786, 13.3786, 3.3913999, -13.3786, 12.460899, 3.3913999, -16.1674, 12.738999, 3.3913999, -15.894899, 13.3786, 3.3913999, -13.3786, 10.033899, 3.3913999, -16.7232, 12.460899, 3.3913999, -16.1674, 10.033899, 3.3913999, -10.033899, 10.033899, 3.3913999, -13.3786, 13.3786, 3.3913999, -13.3786, 10.033899, 3.3913999, -16.7232, 13.3786, 3.3913999, -13.3786, 10.033899, 3.3913999, -13.3786, 6.6893, 3.3913999, -13.3786, 10.033899, 3.3913999, -16.7232, 10.033899, 3.3913999, -13.3786, 6.6893, 3.3913999, -13.3786, 6.6893, 3.3913999, -16.7232, 10.033899, 3.3913999, -16.7232, 6.6893, 3.3913999, -10.033899, 10.033899, 3.3913999, -13.3786, 10.033899, 3.3913999, -10.033899, 6.6893, 3.3913999, -10.033899, 6.6893, 3.3913999, -13.3786, 10.033899, 3.3913999, -13.3786, 6.6893, 3.3913999, -6.6893, 6.6893, 3.3913999, -10.033899, 10.033899, 3.3913999, -10.033899, 6.6893, 3.3913999, -6.6893, 10.033899, 3.3913999, -10.033899, 10.033899, 3.3913999, -6.6893, 4.0225, 3.3913999, -8.7143, 6.6893, 3.3913999, -13.3786, 6.6893, 3.3913999, -10.033899, 4.6821, 3.3913999, -13.3786, 6.6893, 3.3913999, -16.7232, 6.6893, 3.3913999, -13.3786, 4.0225, 3.3913999, -8.7143, 4.6821, 3.3913999, -13.3786, 6.6893, 3.3913999, -13.3786, 4.6821, 3.3913999, -13.3786, 3.8388, 3.3913999, -16.7232, 6.6893, 3.3913999, -16.7232, 4.6821, 3.3913999, -13.3786, 4.0225, 3.3913999, -8.7143, 4.6821, 3.3913999, -13.3786, 4.6821, 3.3913999, -13.3786, 4.6821, 3.3913999, -13.3786, 4.4131, 3.2091, -13.357699, 4.6821, 3.3913999, -13.3786, 4.4131, 3.2091, -13.357699, 4.4131, 3.2091, -13.357699, 3.3446, 3.3913999, -6.6893, 4.0225, 3.3913999, -8.7143, 6.6893, 3.3913999, -10.033899, 3.3446, 3.3913999, -6.6893, 6.6893, 3.3913999, -10.033899, 6.6893, 3.3913999, -6.6893, 0, 3.3913999, -6.6893, 4.0225, 3.3913999, -8.7143, 3.3446, 3.3913999, -6.6893, 0, 3.3913999, -6.6893, 0, 3.3913999, -8.7143, 4.0225, 3.3913999, -8.7143, 3.3446, 3.3913999, -3.3446, 3.3446, 3.3913999, -6.6893, 6.6893, 3.3913999, -6.6893, 0, 3.3913999, -6.6893, -3.9101999, 3.3913999, -9.8592, 0, 3.3913999, -8.7143, 0, 3.3913999, -8.7143, -3.9101999, 3.3913999, -9.8592, 0, 3.3913999, -8.7143, 0, 3.3913999, -3.3446, 0, 3.3913999, -6.6893, 3.3446, 3.3913999, -6.6893, 0, 3.3913999, -3.3446, 3.3446, 3.3913999, -6.6893, 3.3446, 3.3913999, -3.3446, -3.6378, 3.3913999, -2.0792, 0, 3.3913999, -6.6893, 0, 3.3913999, -3.3446, -2.9566998, 3.3913999, 0, -3.6378, 3.3913999, -2.0792, 0, 3.3913999, -3.3446, -3.6378, 3.3913999, -2.0792, -3.3446, 3.3913999, -6.6893, 0, 3.3913999, -6.6893, -3.9101999, 3.3913999, -9.8592, 0, 3.3913999, -6.6893, -3.3446, 3.3913999, -6.6893, -6.6893, 3.3913999, -3.7326, -3.3446, 3.3913999, -6.6893, -3.6378, 3.3913999, -2.0792, -2.9566998, 3.3913999, 0, 0, 3.3913999, -3.3446, 0, 3.3913999, 0, 0, 3.3913999, 0, 0, 3.3913999, -3.3446, 3.3446, 3.3913999, -3.3446, -2.9566998, 3.3913999, 3.3446, -2.9566998, 3.3913999, 0, 0, 3.3913999, 0, -2.9566998, 3.3913999, 3.3446, 0, 3.3913999, 0, 0, 3.3913999, 3.3446, -6.6893, 3.3913999, -3.7326, -6.6893, 3.3913999, -6.6893, -3.3446, 3.3913999, -6.6893, -6.6893, 3.3913999, -6.6893, -3.9101999, 3.3913999, -9.8592, -3.3446, 3.3913999, -6.6893, -10.033899, 3.3913999, -3.7326, -6.6893, 3.3913999, -6.6893, -6.6893, 3.3913999, -3.7326, 0, 3.3913999, 3.3446, 0, 3.3913999, 0, 3.3446, 3.3913999, 0, 0, 3.3913999, 0, 3.3446, 3.3913999, -3.3446, 3.3446, 3.3913999, 0, 0, 3.3913999, 3.3446, 3.3446, 3.3913999, 0, 3.3446, 3.3913999, 3.3446, 3.3446, 3.3913999, 3.3446, 3.3446, 3.3913999, 0, 6.6893, 3.3913999, 0, 3.3446, 3.3913999, 0, 3.3446, 3.3913999, -3.3446, 6.6893, 3.3913999, -3.3446, 3.3446, 3.3913999, 0, 6.6893, 3.3913999, -3.3446, 6.6893, 3.3913999, 0, 3.3446, 3.3913999, -3.3446, 6.6893, 3.3913999, -6.6893, 6.6893, 3.3913999, -3.3446, 6.6893, 3.3913999, 0, 6.6893, 3.3913999, -3.3446, 10.033899, 3.3913999, -3.3446, 6.6893, 3.3913999, -3.3446, 6.6893, 3.3913999, -6.6893, 10.033899, 3.3913999, -6.6893, 6.6893, 3.3913999, -3.3446, 10.033899, 3.3913999, -6.6893, 10.033899, 3.3913999, -3.3446, -6.6893, 3.3913999, -6.6893, -6.6893, 3.3913999, -10.033899, -3.9101999, 3.3913999, -9.8592, -6.6893, 3.3913999, -10.033899, -3.9101999, 3.3913999, -12.538199, -3.9101999, 3.3913999, -9.8592, -10.033899, 3.3913999, -3.7326, -10.033899, 3.3913999, -6.6893, -6.6893, 3.3913999, -6.6893, -10.033899, 3.3913999, -6.6893, -6.6893, 3.3913999, -10.033899, -6.6893, 3.3913999, -6.6893, -13.3786, 3.3913999, -3.7326, -10.033899, 3.3913999, -6.6893, -10.033899, 3.3913999, -3.7326, -6.6893, 3.3913999, -10.033899, -6.6893, 3.3913999, -12.538199, -3.9101999, 3.3913999, -12.538199, -13.3786, 3.3913999, -3.7326, -13.3786, 3.3913999, -6.6893, -10.033899, 3.3913999, -6.6893, -16.191599, 3.3913999, -3.0971, -13.3786, 3.3913999, -6.6893, -13.3786, 3.3913999, -3.7326, -10.033899, 3.3913999, -6.6893, -10.033899, 3.3913999, -10.033899, -6.6893, 3.3913999, -10.033899, -13.3786, 3.3913999, -6.6893, -10.033899, 3.3913999, -10.033899, -10.033899, 3.3913999, -6.6893, -16.191599, 3.3913999, -3.0971, -16.7232, 3.3913999, -6.6893, -13.3786, 3.3913999, -6.6893, -13.3786, 3.3913999, -6.6893, -13.3786, 3.3913999, -10.033899, -10.033899, 3.3913999, -10.033899, -19.7545, 3.3913999, -2.7851999, -16.7232, 3.3913999, -6.6893, -16.191599, 3.3913999, -3.0971, -19.7545, 3.3913999, -2.7851999, -19.280699, 3.3913999, -6.6893, -16.7232, 3.3913999, -6.6893, -17.1112, 3.3913999, 0, -19.7545, 3.3913999, -2.7851999, -16.191599, 3.3913999, -3.0971, -17.1112, 3.3913999, 0, -19.9511, 3.3913999, -2.5834, -19.7545, 3.3913999, -2.7851999, -19.9511, 3.3913999, -2.5834, -17.1112, 3.3913999, 0, -20.0679, 3.3913999, 0, -20.0679, 3.3913999, 3.3446, -20.0679, 3.3913999, 0, -17.1112, 3.3913999, 0, -20.0679, 3.3913999, 3.3446, -17.1112, 3.3913999, 0, -17.1112, 3.3913999, 3.3044999, -13.3786, 3.3913999, -10.033899, -10.699599, 3.3913999, -13.175799, -10.033899, 3.3913999, -10.033899, -10.699599, 3.3913999, -13.175799, -6.6893, 3.3913999, -10.033899, -10.033899, 3.3913999, -10.033899, -13.3786, 3.3913999, -10.033899, -13.3786, 3.3913999, -13.3786, -10.699599, 3.3913999, -13.175799, -6.6893, 3.3913999, -10.033899, -10.699599, 3.3913999, -13.175799, -6.6893, 3.3913999, -12.538199, -13.3786, 3.3913999, -13.3786, -10.699599, 3.3913999, -15.835, -10.699599, 3.3913999, -13.175799, -13.3786, 3.3913999, -13.3786, -13.3786, 3.3913999, -15.4154, -10.699599, 3.3913999, -15.835, -6.6893, 3.3913999, -12.538199, -10.699599, 3.3913999, -13.175799, -6.6893, 3.3913999, -12.538199, -6.6893, 3.3913999, -12.538199, -6.6893, 3.3913999, -12.538199, -6.6893, 3.175, -12.867, -6.6893, 3.3913999, -12.538199, -6.6893, 3.175, -12.867, -6.6893, 3.175, -12.867, -20.0679, 3.3913999, 6.6893, -20.0679, 3.3913999, 3.3446, -17.1112, 3.3913999, 3.3044999, -22.5541, 3.3913999, 9.2058, -22.3151, 3.3913999, 6.6893, -20.0679, 3.3913999, 6.6893, -22.5541, 3.3913999, 9.2058, -20.0679, 3.3913999, 6.6893, -20.0679, 3.3913999, 9.167399, -20.0679, 3.3913999, 9.167399, -20.0679, 3.3913999, 6.6893, -16.7232, 3.3913999, 6.6893, -20.0679, 3.3913999, 6.6893, -17.1112, 3.3913999, 3.3044999, -16.7232, 3.3913999, 6.6893, -20.0679, 3.3913999, 9.167399, -16.7232, 3.3913999, 6.6893, -16.285099, 3.3913999, 9.5865, -16.7232, 3.3913999, 6.6893, -16.053999, 3.3913999, 9.8082, -16.285099, 3.3913999, 9.5865, -16.053999, 3.3913999, 9.8082, -16.7232, 3.3913999, 6.6893, -13.1355, 3.3913999, 6.7549996, -17.1112, 3.3913999, 3.3044999, -13.1355, 3.3913999, 6.7549996, -16.7232, 3.3913999, 6.6893, -16.053999, 3.3913999, 9.8082, -13.1355, 3.3913999, 6.7549996, -13.3786, 3.3913999, 10.033899, -13.1355, 3.3913999, 6.7549996, -17.1112, 3.3913999, 3.3044999, -14.877199, 3.3913999, 4.6657, -14.877199, 3.3913999, 4.6657, -17.1112, 3.3913999, 3.3044999, -15.582299, 3.3913999, 4.0366, -13.1355, 3.3913999, 6.7549996, -14.877199, 3.3913999, 4.6657, -14.0948, 3.3913999, 5.5073, -13.3786, 3.3913999, 10.033899, -13.1355, 3.3913999, 6.7549996, -10.033899, 3.3913999, 7.0772, -13.3786, 3.3913999, 10.033899, -10.033899, 3.3913999, 7.0772, -10.033899, 3.3913999, 10.033899, -10.033899, 3.3913999, 10.033899, -10.033899, 3.3913999, 7.0772, -6.6893, 3.3913999, 7.0772, -10.033899, 3.3913999, 10.033899, -6.6893, 3.3913999, 7.0772, -6.6893, 3.3913999, 10.033899, -10.033899, 3.0033998, 6.6893, -13.1355, 3.3913999, 6.7549996, -12.747499, 3.0033998, 6.3671, -10.033899, 3.0033998, 6.6893, -10.033899, 3.3913999, 7.0772, -13.1355, 3.3913999, 6.7549996, -2.5674999, 2.4164, 7.6215, -6.6893, 3.3913999, 7.0772, -6.6893, 3.0033998, 6.6893, -2.5674999, 2.4164, 7.6215, -2.1794999, 2.8042998, 8.009399, -6.6893, 3.3913999, 7.0772, -12.747499, 3.0033998, 6.3671, -14.0948, 3.3913999, 5.5073, -13.6942, 3.0033998, 5.1798, -12.747499, 3.0033998, 6.3671, -13.1355, 3.3913999, 6.7549996, -14.0948, 3.3913999, 5.5073, -6.6893, 3.0033998, 6.6893, -10.033899, 3.3913999, 7.0772, -10.033899, 3.0033998, 6.6893, -6.6893, 3.0033998, 6.6893, -6.6893, 3.3913999, 7.0772, -10.033899, 3.3913999, 7.0772, -16.7232, 3.0033998, 0, -16.191599, 3.3913999, -3.0971, -15.8036995, 3.0033998, -2.7091, -16.7232, 3.0033998, 0, -17.1112, 3.3913999, 0, -16.191599, 3.3913999, -3.0971, -13.3786, 3.3913999, -3.7326, -15.8036995, 3.0033998, -2.7091, -16.191599, 3.3913999, -3.0971, -13.3786, 3.3913999, -3.7326, -13.3786, 3.0033998, -3.3446, -15.8036995, 3.0033998, -2.7091, -2.9566998, 3.3913999, 0, -4.0257998, 3.0033998, -1.6911999, -3.6378, 3.3913999, -2.0792, -2.9566998, 3.3913999, 0, -3.3446, 3.0033998, 0, -4.0257998, 3.0033998, -1.6911999, -3.6378, 3.3913999, -2.0792, -6.6893, 3.0033998, -3.3446, -6.6893, 3.3913999, -3.7326, -3.6378, 3.3913999, -2.0792, -4.0257998, 3.0033998, -1.6911999, -6.6893, 3.0033998, -3.3446, -10.033899, 3.3913999, -3.7326, -13.3786, 3.0033998, -3.3446, -13.3786, 3.3913999, -3.7326, -10.033899, 3.3913999, -3.7326, -10.033899, 3.0033998, -3.3446, -13.3786, 3.0033998, -3.3446, -6.6893, 3.3913999, -3.7326, -10.033899, 3.0033998, -3.3446, -10.033899, 3.3913999, -3.7326, -6.6893, 3.3913999, -3.7326, -6.6893, 3.0033998, -3.3446, -10.033899, 3.0033998, -3.3446, -16.7232, 3.0033998, 2.9166, -17.1112, 3.3913999, 0, -16.7232, 3.0033998, 0, -16.7232, 3.0033998, 2.9166, -17.1112, 3.3913999, 3.3044999, -17.1112, 3.3913999, 0, -14.4892, 3.0033998, 4.2778, -15.582299, 3.3913999, 4.0366, -15.372, 3.0033998, 3.6132998, -14.4892, 3.0033998, 4.2778, -14.877199, 3.3913999, 4.6657, -15.582299, 3.3913999, 4.0366, -2.9566998, 3.3913999, 3.3446, -3.3446, 3.0033998, 0, -2.9566998, 3.3913999, 0, -2.9566998, 3.3913999, 3.3446, -3.3446, 3.0033998, 3.3446, -3.3446, 3.0033998, 0, -2.1794999, 2.8042998, 8.009399, -2.1397, 3.0033998, 5.1795, -1.7832999, 3.3913999, 5.2162, -2.1794999, 2.8042998, 8.009399, -2.5674999, 2.4164, 7.6215, -2.1397, 3.0033998, 5.1795, -6.6893, 3.3913999, 10.033899, -2.1794999, 2.8042998, 8.009399, -3.3446, 3.3913999, 10.033899, -6.6893, 3.3913999, 10.033899, -6.6893, 3.3913999, 7.0772, -2.1794999, 2.8042998, 8.009399, -1.7832999, 3.3913999, 5.2162, 0, 3.3913999, 6.6893, -2.1794999, 2.8042998, 8.009399, 0, 3.3913999, 6.6893, -1.7832999, 3.3913999, 5.2162, -2.9566998, 3.3913999, 3.3446, 0, 3.3913999, 6.6893, -2.9566998, 3.3913999, 3.3446, 0, 3.3913999, 3.3446, -3.3446, 3.3913999, 10.033899, 0, 3.3913999, 6.6893, 0, 3.3913999, 10.033899, -3.3446, 3.3913999, 10.033899, -2.1794999, 2.8042998, 8.009399, 0, 3.3913999, 6.6893, -2.1397, 3.0033998, 5.1795, -2.9566998, 3.3913999, 3.3446, -1.7832999, 3.3913999, 5.2162, -2.1397, 3.0033998, 5.1795, -3.3446, 3.0033998, 3.3446, -2.9566998, 3.3913999, 3.3446, -14.0948, 3.3913999, 5.5073, -14.4892, 3.0033998, 4.2778, -13.6942, 3.0033998, 5.1798, -14.0948, 3.3913999, 5.5073, -14.877199, 3.3913999, 4.6657, -14.4892, 3.0033998, 4.2778, -15.582299, 3.3913999, 4.0366, -16.7232, 3.0033998, 2.9166, -15.372, 3.0033998, 3.6132998, -15.582299, 3.3913999, 4.0366, -17.1112, 3.3913999, 3.3044999, -16.7232, 3.0033998, 2.9166, 20.198, 3.1490998, -10.033899, 19.798899, 3.3913999, -13.1096, 20.1539, 3.1299, -13.399799, 20.198, 3.1490998, -10.033899, 19.798899, 3.3913999, -10.033899, 19.798899, 3.3913999, -13.1096, 20.1539, 3.1299, -13.399799, 16.7232, 3.3913999, -13.1096, 16.8204, 3.138, -13.447599, 20.1539, 3.1299, -13.399799, 19.798899, 3.3913999, -13.1096, 16.7232, 3.3913999, -13.1096, 16.756899, 3.1650999, -16.7286, 12.738999, 3.3913999, -15.894899, 12.7471, 3.1766999, -16.1988, 16.756899, 3.1650999, -16.7286, 16.495699, 3.3913999, -16.459, 12.738999, 3.3913999, -15.894899, 16.8051, 3.1778, -13.479, 16.495699, 3.3913999, -16.459, 16.756899, 3.1650999, -16.7286, 16.8051, 3.1778, -13.479, 16.495699, 3.3913999, -13.42, 16.495699, 3.3913999, -16.459, 16.4543, 3.3913999, -13.3786, 16.8204, 3.138, -13.447599, 16.7232, 3.3913999, -13.1096, 16.8204, 3.138, -13.447599, 16.4543, 3.3913999, -13.3786, 16.495699, 3.3913999, -13.42, 16.8204, 3.138, -13.447599, 16.495699, 3.3913999, -13.42, 16.8051, 3.1778, -13.479, 10.033899, 3.0523999, -19.0294, 6.6893, 3.2782998, -18.727999, 6.6893, 3.0440998, -19.036999, 10.033899, 3.0523999, -19.0294, 10.033899, 3.2784998, -18.6997, 6.6893, 3.2782998, -18.727999, 12.723599, 2.9213, -19.2902, 10.033899, 3.2784998, -18.6997, 10.033899, 3.0523999, -19.0294, 12.723599, 2.9213, -19.2902, 12.446099, 3.1699998, -18.9401, 10.033899, 3.2784998, -18.6997, 12.446099, 3.1699998, -18.9401, 12.747, 3.1771, -16.1991, 12.460899, 3.3913999, -16.1674, 12.446099, 3.1699998, -18.9401, 12.723599, 2.9213, -19.2902, 12.747, 3.1771, -16.1991, 12.460899, 3.3913999, -16.1674, 10.033899, 3.2784998, -18.6997, 12.446099, 3.1699998, -18.9401, 10.033899, 3.3913999, -16.7232, 10.033899, 3.2784998, -18.6997, 12.460899, 3.3913999, -16.1674, 10.033899, 3.3913999, -16.7232, 12.460899, 3.3913999, -16.1674, 12.460899, 3.3913999, -16.1674, 6.6893, 3.3913999, -16.7232, 10.033899, 3.2784998, -18.6997, 10.033899, 3.3913999, -16.7232, 6.6893, 3.3913999, -16.7232, 6.6893, 3.2782998, -18.727999, 10.033899, 3.2784998, -18.6997, 12.738999, 3.3913999, -15.894899, 12.747, 3.1771, -16.1991, 12.7471, 3.1766999, -16.1988, 12.738999, 3.3913999, -15.894899, 12.460899, 3.3913999, -16.1674, 12.747, 3.1771, -16.1991, 12.460899, 3.3913999, -16.1674, 12.738999, 3.3913999, -15.894899, 12.460899, 3.3913999, -16.1674, 3.8388, 3.3913999, -16.7232, 4.4783998, 3.1067, -18.2665, 4.6443, 3.2897, -17.9799, 3.8388, 3.3913999, -16.7232, 3.5895, 3.2033, -16.7232, 4.4783998, 3.1067, -18.2665, 4.6821, 3.3913999, -13.3786, 3.5895, 3.2033, -16.7232, 3.8388, 3.3913999, -16.7232, 4.6821, 3.3913999, -13.3786, 4.4131, 3.2091, -13.357699, 3.5895, 3.2033, -16.7232, 6.6640997, 3.0702, -19.018099, 4.6443, 3.2897, -17.9799, 4.4783998, 3.1067, -18.2665, 6.6640997, 3.0702, -19.018099, 6.6705, 3.2772, -18.741, 4.6443, 3.2897, -17.9799, 4.6443, 3.2897, -17.9799, 6.6893, 3.3913999, -16.7232, 3.8388, 3.3913999, -16.7232, 6.6893, 3.3913999, -16.7232, 4.6443, 3.2897, -17.9799, 6.6705, 3.2772, -18.741, 6.6893, 3.3913999, -16.7232, 6.6705, 3.2772, -18.741, 6.6893, 3.2782998, -18.727999, 6.6893, 3.2782998, -18.727999, 6.6640997, 3.0702, -19.018099, 6.6893, 3.0440998, -19.036999, 6.6893, 3.2782998, -18.727999, 6.6705, 3.2772, -18.741, 6.6640997, 3.0702, -19.018099, 3.7529, 3.1712, -9.0494995, 0, 3.3913999, -8.7143, 0, 3.179, -9.0652, 3.7529, 3.1712, -9.0494995, 4.0225, 3.3913999, -8.7143, 0, 3.3913999, -8.7143, 4.0225, 3.3913999, -8.7143, 4.4131, 3.2091, -13.357699, 4.6821, 3.3913999, -13.3786, 4.0225, 3.3913999, -8.7143, 3.7529, 3.1712, -9.0494995, 4.4131, 3.2091, -13.357699, -3.6538, 3.1585999, -12.813399, -6.6893, 3.3913999, -12.538199, -6.6893, 3.175, -12.867, -3.6538, 3.1585999, -12.813399, -3.9101999, 3.3913999, -12.538199, -6.6893, 3.3913999, -12.538199, -3.6076, 3.1676, -10.0696, -3.9101999, 3.3913999, -12.538199, -3.6538, 3.1585999, -12.813399, -3.6076, 3.1676, -10.0696, -3.9101999, 3.3913999, -9.8592, -3.9101999, 3.3913999, -12.538199, -0.0081, 3.1864998, -9.063499, -3.9101999, 3.3913999, -9.8592, -3.6076, 3.1676, -10.0696, -0.0081, 3.1864998, -9.063499, 0, 3.3913999, -8.7143, -3.9101999, 3.3913999, -9.8592, 0, 3.3913999, -8.7143, -0.0081, 3.1864998, -9.063499, 0, 3.179, -9.0652, 0, 3.3913999, -8.7143, 0, 3.3913999, -8.7143, -0.0081, 3.1864998, -9.063499, -10.4043, 3.1608999, -13.4295, -10.699599, 3.3913999, -15.835, -10.4319, 3.1557999, -16.1556, -10.4043, 3.1608999, -13.4295, -10.699599, 3.3913999, -13.175799, -10.699599, 3.3913999, -15.835, -10.4319, 3.1557999, -16.1556, -13.3786, 3.3913999, -15.4154, -13.3786, 3.1771998, -15.7625, -10.4319, 3.1557999, -16.1556, -10.699599, 3.3913999, -15.835, -13.3786, 3.3913999, -15.4154, -10.699599, 3.3913999, -13.175799, -6.6893, 3.175, -12.867, -6.6893, 3.3913999, -12.538199, -10.699599, 3.3913999, -13.175799, -10.4043, 3.1608999, -13.4295, -6.6893, 3.175, -12.867, -16.130499, 3.6227, -13.623799, -16.0243, 3.3509998, -15.752, -15.7941, 3.5591, -15.4641, -16.130499, 3.6227, -13.623799, -16.3753, 3.4225, -13.6277, -16.0243, 3.3509998, -15.752, -13.3911, 3.1892, -15.757, -15.7941, 3.5591, -15.4641, -16.0243, 3.3509998, -15.752, -13.3911, 3.1892, -15.757, -13.396, 3.3925, -15.4333, -15.7941, 3.5591, -15.4641, -15.7941, 3.5591, -15.4641, -13.3786, 3.3913999, -13.3786, -16.130499, 3.6227, -13.623799, -13.3786, 3.3913999, -13.3786, -15.7941, 3.5591, -15.4641, -13.396, 3.3925, -15.4333, -13.3786, 3.3913999, -13.3786, -13.396, 3.3925, -15.4333, -13.3786, 3.3913999, -15.4154, -13.3786, 3.3913999, -15.4154, -13.3911, 3.1892, -15.757, -13.3786, 3.1771998, -15.7625, -13.3786, 3.3913999, -15.4154, -13.396, 3.3925, -15.4333, -13.3911, 3.1892, -15.757, -16.3753, 3.4225, -13.6277, -16.1241, 3.3832998, -9.5097, -16.4131, 3.1706, -9.788899, -16.3753, 3.4225, -13.6277, -16.130499, 3.6227, -13.623799, -16.1241, 3.3832998, -9.5097, -16.7232, 3.3913999, -6.6893, -13.3786, 3.3913999, -10.033899, -13.3786, 3.3913999, -6.6893, -16.7232, 3.3913999, -6.6893, -16.1241, 3.3832998, -9.5097, -13.3786, 3.3913999, -10.033899, -16.1241, 3.3832998, -9.5097, -13.3786, 3.3913999, -13.3786, -13.3786, 3.3913999, -10.033899, -16.1241, 3.3832998, -9.5097, -16.130499, 3.6227, -13.623799, -13.3786, 3.3913999, -13.3786, -16.130499, 3.6227, -13.623799, -16.1241, 3.3832998, -9.5097, -16.130499, 3.6227, -13.623799, -16.130499, 3.6227, -13.623799, -16.3753, 3.4225, -13.6277, -16.3753, 3.4225, -13.6277, -16.130499, 3.6227, -13.623799, -16.130499, 3.6227, -13.623799, -16.3753, 3.4225, -13.6277, -19.7545, 3.3913999, -2.7851999, -19.515, 3.2122, -6.6893, -19.280699, 3.3913999, -6.6893, -19.7545, 3.3913999, -2.7851999, -19.9489, 3.2063, -2.8082, -19.515, 3.2122, -6.6893, -19.280699, 3.3913999, -6.6893, -19.6161, 3.2075999, -9.7116995, -19.3965, 3.3909, -9.5092, -19.280699, 3.3913999, -6.6893, -19.515, 3.2122, -6.6893, -19.6161, 3.2075999, -9.7116995, -19.280699, 3.3913999, -6.6893, -16.1241, 3.3832998, -9.5097, -16.7232, 3.3913999, -6.6893, -19.280699, 3.3913999, -6.6893, -19.3965, 3.3909, -9.5092, -16.1241, 3.3832998, -9.5097, -16.1241, 3.3832998, -9.5097, -19.6237, 3.1655998, -9.757899, -16.4131, 3.1706, -9.788899, -19.6237, 3.1655998, -9.757899, -16.1241, 3.3832998, -9.5097, -19.3965, 3.3909, -9.5092, -19.6237, 3.1655998, -9.757899, -19.3965, 3.3909, -9.5092, -19.6161, 3.2075999, -9.7116995, -22.8657, 3.4937, 3.3613, -23.3676, 3.4459999, 0.1372, -23.170399, 3.6251, 0.122999996, -22.8657, 3.4937, 3.3613, -23.0809, 3.3083, 3.3615, -23.3676, 3.4459999, 0.1372, -23.170399, 3.6251, 0.122999996, -23.390299, 3.3349998, -2.6938999, -23.192099, 3.5300999, -2.4668999, -23.170399, 3.6251, 0.122999996, -23.3676, 3.4459999, 0.1372, -23.390299, 3.3349998, -2.6938999, -23.192099, 3.5300999, -2.4668999, -19.9489, 3.2063, -2.8082, -19.9511, 3.3913999, -2.5834, -23.192099, 3.5300999, -2.4668999, -23.390299, 3.3349998, -2.6938999, -19.9489, 3.2063, -2.8082, -23.192099, 3.5300999, -2.4668999, -20.0679, 3.3913999, 0, -23.170399, 3.6251, 0.122999996, -20.0679, 3.3913999, 0, -23.192099, 3.5300999, -2.4668999, -19.9511, 3.3913999, -2.5834, -19.9511, 3.3913999, -2.5834, -23.192099, 3.5300999, -2.4668999, -19.9511, 3.3913999, -2.5834, -22.8657, 3.4937, 3.3613, -20.0679, 3.3913999, 0, -20.0679, 3.3913999, 3.3446, -22.8657, 3.4937, 3.3613, -23.170399, 3.6251, 0.122999996, -20.0679, 3.3913999, 0, -19.7545, 3.3913999, -2.7851999, -19.9489, 3.2063, -2.8082, -19.9489, 3.2063, -2.8082, -19.7545, 3.3913999, -2.7851999, -19.9511, 3.3913999, -2.5834, -19.9489, 3.2063, -2.8082, -19.9511, 3.3913999, -2.5834, -19.7545, 3.3913999, -2.7851999, -19.9511, 3.3913999, -2.5834, -23.0777, 3.3197, 3.3734, -22.3151, 3.3913999, 6.6893, -22.563799, 3.2219, 6.6893, -23.0777, 3.3197, 3.3734, -22.8764, 3.4937, 3.3741, -22.3151, 3.3913999, 6.6893, -22.8764, 3.4937, 3.3741, -20.0679, 3.3913999, 6.6893, -22.3151, 3.3913999, 6.6893, -20.0679, 3.3913999, 6.6893, -22.8764, 3.4937, 3.3741, -22.8657, 3.4937, 3.3613, -20.0679, 3.3913999, 6.6893, -22.8657, 3.4937, 3.3613, -20.0679, 3.3913999, 3.3446, -22.8657, 3.4937, 3.3613, -23.0777, 3.3197, 3.3734, -23.0809, 3.3083, 3.3615, -22.8657, 3.4937, 3.3613, -22.8764, 3.4937, 3.3741, -23.0777, 3.3197, 3.3734, -16.285099, 3.3913999, 9.5865, -20.0679, 3.1943, 9.407499, -20.0679, 3.3913999, 9.167399, -16.285099, 3.3913999, 9.5865, -16.2818, 3.1913998, 9.8056, -20.0679, 3.1943, 9.407499, -22.791399, 3.2124999, 9.4432, -20.0679, 3.3913999, 9.167399, -20.0679, 3.1943, 9.407499, -22.791399, 3.2124999, 9.4432, -22.5541, 3.3913999, 9.2058, -20.0679, 3.3913999, 9.167399, -22.5541, 3.3913999, 9.2058, -22.563799, 3.2219, 6.6893, -22.3151, 3.3913999, 6.6893, -22.5541, 3.3913999, 9.2058, -22.791399, 3.2124999, 9.4432, -22.563799, 3.2219, 6.6893, -22.791399, 3.2124999, 9.4432, -22.5541, 3.3913999, 9.2058, -22.791399, 3.2124999, 9.4432, -13.3786, 3.3922, 12.571899, -16.076399, 3.04, 12.735, -15.847199, 3.2614, 12.4973, -13.3786, 3.3922, 12.571899, -13.3786, 3.194, 12.8089, -16.076399, 3.04, 12.735, -15.847199, 3.2614, 12.4973, -16.2818, 3.1913998, 9.8056, -16.053999, 3.3913999, 9.8082, -15.847199, 3.2614, 12.4973, -16.076399, 3.04, 12.735, -16.2818, 3.1913998, 9.8056, -15.847199, 3.2614, 12.4973, -13.3786, 3.3913999, 10.033899, -13.3786, 3.3922, 12.571899, -15.847199, 3.2614, 12.4973, -16.053999, 3.3913999, 9.8082, -13.3786, 3.3913999, 10.033899, -16.053999, 3.3913999, 9.8082, -15.847199, 3.2614, 12.4973, -16.053999, 3.3913999, 9.8082, -16.285099, 3.3913999, 9.5865, -16.2818, 3.1913998, 9.8056, -16.2818, 3.1913998, 9.8056, -16.285099, 3.3913999, 9.5865, -16.053999, 3.3913999, 9.8082, -16.2818, 3.1913998, 9.8056, -16.053999, 3.3913999, 9.8082, -16.285099, 3.3913999, 9.5865, -16.053999, 3.3913999, 9.8082, -5.9742, 3.3994, 12.8817, -10.033899, 2.9384, 12.4537, -10.033899, 3.2142, 12.1061, -5.9742, 3.3994, 12.8817, -6.2748, 3.126, 13.122, -10.033899, 2.9384, 12.4537, -10.033899, 3.2142, 12.1061, -13.3786, 3.194, 12.8089, -13.3786, 3.3922, 12.571899, -10.033899, 3.2142, 12.1061, -10.033899, 2.9384, 12.4537, -13.3786, 3.194, 12.8089, -10.033899, 3.2142, 12.1061, -6.6893, 3.3913999, 10.033899, -5.9742, 3.3994, 12.8817, -10.033899, 3.2142, 12.1061, -10.033899, 3.3913999, 10.033899, -6.6893, 3.3913999, 10.033899, -13.3786, 3.3922, 12.571899, -10.033899, 3.3913999, 10.033899, -10.033899, 3.2142, 12.1061, -13.3786, 3.3922, 12.571899, -13.3786, 3.3913999, 10.033899, -10.033899, 3.3913999, 10.033899, -13.3786, 3.3913999, 10.033899, -13.3786, 3.3922, 12.571899, -13.3786, 3.3922, 12.571899, -5.9742, 3.3994, 12.8817, -3.3446, 3.3913999, 10.033899, -3.3446, 3.3913999, 13.3786, -5.9742, 3.3994, 12.8817, -6.6893, 3.3913999, 10.033899, -3.3446, 3.3913999, 10.033899, -13.3786, 3.3922, 12.571899, -13.3786, 3.194, 12.8089, -13.3786, 3.194, 12.8089, -13.3786, 3.3922, 12.571899, -13.3786, 3.3922, 12.571899, -13.3786, 3.194, 12.8089, 3.6399, 3.3913999, 16.2405, 0, 2.9636998, 16.0179, 0, 3.2243998, 15.7093, 3.6399, 3.3913999, 16.2405, 3.6425998, 3.1413999, 16.5127, 0, 2.9636998, 16.0179, 0, 3.2243998, 15.7093, -3.3446, 3.1497998, 15.914599, -3.3446, 3.3913999, 15.6011, 0, 3.2243998, 15.7093, 0, 2.9636998, 16.0179, -3.3446, 3.1497998, 15.914599, -6.2558, 3.1427999, 16.4098, -3.3446, 3.3913999, 15.6011, -3.3446, 3.1497998, 15.914599, -6.2558, 3.1427999, 16.4098, -5.9737997, 3.392, 16.087599, -3.3446, 3.3913999, 15.6011, -3.3446, 3.3913999, 15.6011, 0, 3.3913999, 13.3786, 0, 3.2243998, 15.7093, -3.3446, 3.3913999, 15.6011, -3.3446, 3.3913999, 13.3786, 0, 3.3913999, 13.3786, 0, 3.2243998, 15.7093, 3.3446, 3.3913999, 13.3786, 3.6399, 3.3913999, 16.2405, 0, 3.2243998, 15.7093, 0, 3.3913999, 13.3786, 3.3446, 3.3913999, 13.3786, -5.9737997, 3.392, 16.087599, -3.3446, 3.3913999, 13.3786, -3.3446, 3.3913999, 15.6011, -5.9737997, 3.392, 16.087599, -5.9742, 3.3994, 12.8817, -3.3446, 3.3913999, 13.3786, -6.2748, 3.1260998, 16.4145, -5.9737997, 3.392, 16.087599, -6.2558, 3.1427999, 16.4098, -5.9737997, 3.392, 16.087599, -6.2748, 3.1260998, 16.4145, -6.2748, 3.126, 13.122, -5.9737997, 3.392, 16.087599, -6.2748, 3.126, 13.122, -5.9742, 3.3994, 12.8817, 6.6893, 3.3913999, 18.9861, 3.9266999, 3.5967, 19.6223, 4.1273, 3.7335, 19.3804, 6.6893, 3.3913999, 18.9861, 6.6893, 3.2050998, 19.228699, 3.9266999, 3.5967, 19.6223, 4.1273, 3.7335, 19.3804, 3.6536, 3.2078998, 16.5669, 3.8651, 3.3981998, 16.5647, 4.1273, 3.7335, 19.3804, 3.9266999, 3.5967, 19.6223, 3.6536, 3.2078998, 16.5669, 3.8651, 3.3981998, 16.5647, 6.6893, 3.3913999, 18.9861, 4.1273, 3.7335, 19.3804, 6.6893, 3.3913999, 18.9861, 3.8651, 3.3981998, 16.5647, 3.9148, 3.3913999, 16.514599, 6.6893, 3.3913999, 18.9861, 3.9148, 3.3913999, 16.514599, 6.6893, 3.3913999, 16.7232, 3.9148, 3.3913999, 16.514599, 3.6425998, 3.1413999, 16.5127, 3.6399, 3.3913999, 16.2405, 3.6425998, 3.1413999, 16.5127, 3.9148, 3.3913999, 16.514599, 3.8651, 3.3981998, 16.5647, 3.6425998, 3.1413999, 16.5127, 3.8651, 3.3981998, 16.5647, 3.6536, 3.2078998, 16.5669, 9.3066, 3.2186, 19.0653, 10.3743, 3.3913999, 16.7232, 10.5913, 3.1985998, 16.7232, 9.3066, 3.2186, 19.0653, 9.1275, 3.3913999, 18.830599, 10.3743, 3.3913999, 16.7232, 9.1275, 3.3913999, 18.830599, 6.6991997, 3.2148, 19.2255, 6.6949, 3.3913999, 18.9914, 9.1275, 3.3913999, 18.830599, 9.3066, 3.2186, 19.0653, 6.6991997, 3.2148, 19.2255, 6.6893, 3.3913999, 18.9861, 6.6991997, 3.2148, 19.2255, 6.6893, 3.2050998, 19.228699, 6.6893, 3.3913999, 18.9861, 6.6949, 3.3913999, 18.9914, 6.6991997, 3.2148, 19.2255, 9.8131, 3.3546, 13.1979, 10.5893, 3.2117, 16.7106, 10.403999, 3.3911998, 16.6938, 9.8131, 3.3546, 13.1979, 10.0546, 3.1885, 13.4071, 10.5893, 3.2117, 16.7106, 6.6893, 3.3913999, 13.3786, 10.3743, 3.3913999, 16.7232, 6.6893, 3.3913999, 16.7232, 10.3743, 3.3913999, 16.7232, 6.6893, 3.3913999, 13.3786, 9.8131, 3.3546, 13.1979, 10.3743, 3.3913999, 16.7232, 9.8131, 3.3546, 13.1979, 10.403999, 3.3911998, 16.6938, 6.6893, 3.3913999, 13.3786, 10.033899, 3.3913999, 10.033899, 9.8131, 3.3546, 13.1979, 6.6893, 3.3913999, 13.3786, 6.6893, 3.3913999, 10.033899, 10.033899, 3.3913999, 10.033899, 10.3743, 3.3913999, 16.7232, 10.5893, 3.2117, 16.7106, 10.5913, 3.1985998, 16.7232, 10.3743, 3.3913999, 16.7232, 10.403999, 3.3911998, 16.6938, 10.5893, 3.2117, 16.7106, 13.1839, 3.2744, 6.6893, 13.5511, 3.1797, 6.6893, 13.4036, 3.0749998, 6.6893, 13.1839, 3.2744, 6.6893, 13.3786, 3.2744, 6.496, 13.5511, 3.1797, 6.6893, 12.9758, 3.2036, 10.033899, 13.1839, 3.2744, 6.6893, 13.4036, 3.0749998, 6.6893, 12.9758, 3.2036, 10.033899, 12.7325, 3.3913999, 10.033899, 13.1839, 3.2744, 6.6893, 13.2631, 3.5611, 13.4043, 12.7325, 3.3913999, 10.033899, 12.9758, 3.2036, 10.033899, 13.2631, 3.5611, 13.4043, 13.025499, 3.6999, 13.1985, 12.7325, 3.3913999, 10.033899, 10.033899, 3.3913999, 10.033899, 13.1839, 3.2744, 6.6893, 12.7325, 3.3913999, 10.033899, 10.033899, 3.3913999, 10.033899, 10.033899, 3.3913999, 6.6893, 13.1839, 3.2744, 6.6893, 9.8131, 3.3546, 13.1979, 12.7325, 3.3913999, 10.033899, 13.025499, 3.6999, 13.1985, 9.8131, 3.3546, 13.1979, 10.033899, 3.3913999, 10.033899, 12.7325, 3.3913999, 10.033899, 10.033899, 3.3913999, 3.3446, 13.1839, 3.2744, 6.6893, 10.033899, 3.3913999, 6.6893, 13.1839, 3.2744, 6.6893, 10.033899, 3.3913999, 3.3446, 13.3786, 3.3913999, 3.3446, 13.1839, 3.2744, 6.6893, 13.3786, 3.3913999, 3.3446, 13.3786, 3.2744, 6.496, 13.025499, 3.6999, 13.1985, 10.0546, 3.1885, 13.4071, 9.8131, 3.3546, 13.1979, 13.025499, 3.6999, 13.1985, 13.2631, 3.5611, 13.4043, 10.0546, 3.1885, 13.4071, 13.2631, 3.5611, 13.4043, 13.2631, 3.5611, 13.4043, 13.025499, 3.6999, 13.1985, 14.0489, 3.0042, -3.3446, 13.1206, 3.3028998, -3.3446, 13.3786, 3.3028998, -3.6027, 14.0489, 3.0042, -3.3446, 13.3786, 3.3028998, -3.0865998, 13.1206, 3.3028998, -3.3446, 16.7232, 3.1513, -3.602, 14.0489, 3.0042, -3.3446, 13.3786, 3.3028998, -3.6027, 16.7232, 3.1513, -3.602, 16.7127, 2.8734, -3.3446, 14.0489, 3.0042, -3.3446, 13.3786, 3.3028998, -3.6027, 16.7232, 3.3913999, -6.6893, 16.7232, 3.1513, -3.602, 13.3786, 3.3028998, -3.6027, 13.3786, 3.3913999, -6.6893, 16.7232, 3.3913999, -6.6893, 10.033899, 3.3913999, -6.6893, 13.1206, 3.3028998, -3.3446, 10.033899, 3.3913999, -3.3446, 13.1206, 3.3028998, -3.3446, 10.033899, 3.3913999, -6.6893, 13.3786, 3.3913999, -6.6893, 13.1206, 3.3028998, -3.3446, 13.3786, 3.3913999, -6.6893, 13.3786, 3.3028998, -3.6027, 20.0679, 0, 0, 14.0489, 3.0042, -3.3446, 20.961199, 0, -3.3446, 20.0679, 0, 3.3446, 14.0489, 3.0042, -3.3446, 20.0679, 0, 0, 14.0489, 3.0042, -3.3446, 13.3786, 3.3913999, 0, 13.3786, 3.3028998, -3.0865998, 14.0489, 3.0042, -3.3446, 13.3786, 3.2744, 6.496, 13.3786, 3.3913999, 0, 14.0489, 3.0042, -3.3446, 20.0679, 0, 3.3446, 13.3786, 3.2744, 6.496, 13.3786, 3.3913999, 0, 13.3786, 3.2744, 6.496, 13.3786, 3.3913999, 3.3446, 13.3786, 3.2744, 6.496, 20.0679, 0, 3.3446, 16.7232, 1.5715, 6.6893, 16.7232, 1.5715, 6.6893, 20.0679, 0, 3.3446, 20.0679, -0.124199994, 6.6893, 13.3786, 3.2744, 6.496, 16.7232, 1.5715, 6.6893, 13.5511, 3.1797, 6.6893, 10.033899, 3.3913999, -3.3446, 13.3786, 3.3913999, 0, 10.033899, 3.3913999, 0, 13.3786, 3.3913999, 0, 10.033899, 3.3913999, -3.3446, 13.1206, 3.3028998, -3.3446, 13.3786, 3.3913999, 0, 13.1206, 3.3028998, -3.3446, 13.3786, 3.3028998, -3.0865998, 19.831999, 3.3902998, -10.0008, 20.147, 3.0588999, -6.6893, 19.8322, 3.2891998, -6.6893, 19.831999, 3.3902998, -10.0008, 20.1796, 3.182, -9.995999, 20.147, 3.0588999, -6.6893, 19.8322, 3.2891998, -6.6893, 20.1349, 2.7974, -3.3783998, 19.8322, 3.0491, -3.602, 19.8322, 3.2891998, -6.6893, 20.147, 3.0588999, -6.6893, 20.1349, 2.7974, -3.3783998, 16.7232, 3.1513, -3.602, 19.8322, 3.2891998, -6.6893, 19.8322, 3.0491, -3.602, 16.7232, 3.1513, -3.602, 16.7232, 3.3913999, -6.6893, 19.8322, 3.2891998, -6.6893, 16.7232, 3.3913999, -10.033899, 19.8322, 3.2891998, -6.6893, 16.7232, 3.3913999, -6.6893, 19.8322, 3.2891998, -6.6893, 16.7232, 3.3913999, -10.033899, 19.798899, 3.3913999, -10.033899, 19.8322, 3.2891998, -6.6893, 19.798899, 3.3913999, -10.033899, 19.831999, 3.3902998, -10.0008, 20.198, 3.1490998, -10.033899, 19.831999, 3.3902998, -10.0008, 19.798899, 3.3913999, -10.033899, 20.198, 3.1490998, -10.033899, 20.1796, 3.182, -9.995999, 19.831999, 3.3902998, -10.0008, 20.144999, 2.7605999, -3.3446, 19.8322, 3.0491, -3.602, 20.1349, 2.7974, -3.3783998, 19.8322, 3.0491, -3.602, 20.144999, 2.7605999, -3.3446, 16.7127, 2.8734, -3.3446, 19.8322, 3.0491, -3.602, 16.7127, 2.8734, -3.3446, 16.7232, 3.1513, -3.602, 15.0508995, 0, 6.6893, 16.7232, 1.5715, 6.6893, 16.7232, 0, 6.6893, 16.7232, 0, 6.6893, 16.7232, 1.5715, 6.6893, 20.0679, -0.124199994, 6.6893, 15.0508995, 0, 6.6893, 13.5511, 3.1797, 6.6893, 16.7232, 1.5715, 6.6893, 15.0508995, 0, 6.6893, 13.4036, 3.0749998, 6.6893, 13.5511, 3.1797, 6.6893, 13.4036, 3.0749998, 6.6893, 15.0508995, 0, 6.6893, 13.8046, 0, 6.6893, -16.7232, 0.6137, 0, -15.7546, 0.6137, 3.5372, -16.7232, 0.6137, 2.9166, -15.7546, 0.6137, 3.5372, -16.7232, 0.6137, 0, -13.3786, 0.6137, 0, -16.7232, 0.6137, 0, -15.8036995, 0.6137, -2.7091, -13.3786, 0.6137, -3.3446, -16.7232, 0.6137, 0, -13.3786, 0.6137, -3.3446, -13.3786, 0.6137, 0, -13.3786, 0.6137, 0, -13.3786, 0.6137, -3.3446, -10.033899, 0.6137, -3.3446, -15.7546, 0.6137, 3.5372, -13.3786, 0.6137, 0, -14.4892, 0.6137, 4.2778, -13.3786, 0.6137, 0, -10.033899, 0.6137, -3.3446, -10.033899, 0.6137, 0, -14.4892, 0.6137, 4.2778, -13.3786, 0.6137, 0, -10.033899, 0.6137, 0, -10.033899, 0.6137, 0, -10.033899, 0.6137, -3.3446, -6.6893, 0.6137, -3.3446, -10.033899, 0.6137, 0, -6.6893, 0.6137, -3.3446, -6.6893, 0.6137, 0, -6.6893, 0.6137, 0, -6.6893, 0.6137, -3.3446, -4.0257998, 0.6137, -1.6911999, -6.6893, 0.6137, 0, -4.0257998, 0.6137, -1.6911999, -3.3446, 0.6137, 0, -10.033899, 0.6137, 3.3446, -10.033899, 0.6137, 0, -6.6893, 0.6137, 0, -14.4892, 0.6137, 4.2778, -10.033899, 0.6137, 0, -10.033899, 0.6137, 3.3446, -6.6893, 0.6137, 3.3446, -6.6893, 0.6137, 0, -3.3446, 0.6137, 0, -10.033899, 0.6137, 3.3446, -6.6893, 0.6137, 0, -6.6893, 0.6137, 3.3446, -6.6893, 0.6137, 3.3446, -3.3446, 0.6137, 0, -3.3446, 0.6137, 3.3446, -10.033899, 0.6137, 6.6893, -14.4892, 0.6137, 4.2778, -10.033899, 0.6137, 3.3446, -10.033899, 0.6137, 6.6893, -10.033899, 0.6137, 3.3446, -6.6893, 0.6137, 3.3446, -10.033899, 0.6137, 6.6893, -6.6893, 0.6137, 3.3446, -6.6893, 0.6137, 6.6893, -10.033899, 0.6137, 6.6893, -13.677099, 0.6137, 5.2616, -14.4892, 0.6137, 4.2778, -13.677099, 0.6137, 5.2616, -10.033899, 0.6137, 6.6893, -12.747499, 0.6137, 6.3671, -6.6893, 0.6137, 3.3446, -2.5674999, 0.0266, 7.6215, -6.6893, 0.6137, 6.6893, -2.5674999, 0.0266, 7.6215, -6.6893, 0.6137, 3.3446, -3.3446, 0.6137, 3.3446, -2.5674999, 0.0266, 7.6215, -3.3446, 0.6137, 3.3446, -2.1193, 0.6137, 5.2736998, -16.7232, 3.0033998, 2.9166, -15.7546, 0.6137, 3.5372, -15.372, 3.0033998, 3.6132998, -16.7232, 3.0033998, 2.9166, -16.7232, 0.6137, 2.9166, -15.7546, 0.6137, 3.5372, -14.4892, 3.0033998, 4.2778, -13.677099, 0.6137, 5.2616, -13.6942, 3.0033998, 5.1798, -14.4892, 3.0033998, 4.2778, -14.4892, 0.6137, 4.2778, -13.677099, 0.6137, 5.2616, -15.8036995, 3.0033998, -2.7091, -16.7232, 0.6137, 0, -16.7232, 3.0033998, 0, -15.8036995, 3.0033998, -2.7091, -15.8036995, 0.6137, -2.7091, -16.7232, 0.6137, 0, -16.7232, 3.0033998, 0, -16.7232, 0.6137, 2.9166, -16.7232, 3.0033998, 2.9166, -16.7232, 3.0033998, 0, -16.7232, 0.6137, 0, -16.7232, 0.6137, 2.9166, -3.3446, 3.0033998, 0, -4.0257998, 0.6137, -1.6911999, -4.0257998, 3.0033998, -1.6911999, -3.3446, 3.0033998, 0, -3.3446, 0.6137, 0, -4.0257998, 0.6137, -1.6911999, -3.3446, 3.0033998, 3.3446, -3.3446, 0.6137, 0, -3.3446, 3.0033998, 0, -3.3446, 3.0033998, 3.3446, -3.3446, 0.6137, 3.3446, -3.3446, 0.6137, 0, -12.747499, 3.0033998, 6.3671, -10.033899, 0.6137, 6.6893, -10.033899, 3.0033998, 6.6893, -12.747499, 3.0033998, 6.3671, -12.747499, 0.6137, 6.3671, -10.033899, 0.6137, 6.6893, -10.033899, 3.0033998, -3.3446, -13.3786, 0.6137, -3.3446, -13.3786, 3.0033998, -3.3446, -10.033899, 3.0033998, -3.3446, -10.033899, 0.6137, -3.3446, -13.3786, 0.6137, -3.3446, -6.6893, 3.0033998, -3.3446, -10.033899, 0.6137, -3.3446, -10.033899, 3.0033998, -3.3446, -6.6893, 3.0033998, -3.3446, -6.6893, 0.6137, -3.3446, -10.033899, 0.6137, -3.3446, -13.3786, 3.0033998, -3.3446, -15.8036995, 0.6137, -2.7091, -15.8036995, 3.0033998, -2.7091, -13.3786, 3.0033998, -3.3446, -13.3786, 0.6137, -3.3446, -15.8036995, 0.6137, -2.7091, -4.0257998, 3.0033998, -1.6911999, -6.6893, 0.6137, -3.3446, -6.6893, 3.0033998, -3.3446, -4.0257998, 3.0033998, -1.6911999, -4.0257998, 0.6137, -1.6911999, -6.6893, 0.6137, -3.3446, -6.6893, 3.0033998, 6.6893, -2.5674999, 0.0266, 7.6215, -2.5674999, 2.4164, 7.6215, -6.6893, 3.0033998, 6.6893, -6.6893, 0.6137, 6.6893, -2.5674999, 0.0266, 7.6215, -10.033899, 3.0033998, 6.6893, -6.6893, 0.6137, 6.6893, -6.6893, 3.0033998, 6.6893, -10.033899, 3.0033998, 6.6893, -10.033899, 0.6137, 6.6893, -6.6893, 0.6137, 6.6893, -2.5674999, 2.4164, 7.6215, -2.1193, 0.6137, 5.2736998, -2.1397, 3.0033998, 5.1795, -2.5674999, 2.4164, 7.6215, -2.5674999, 0.0266, 7.6215, -2.1193, 0.6137, 5.2736998, -2.1193, 0.6137, 5.2736998, -3.3446, 3.0033998, 3.3446, -2.1397, 3.0033998, 5.1795, -2.1193, 0.6137, 5.2736998, -3.3446, 0.6137, 3.3446, -3.3446, 3.0033998, 3.3446, -13.677099, 0.6137, 5.2616, -12.747499, 3.0033998, 6.3671, -13.6942, 3.0033998, 5.1798, -13.677099, 0.6137, 5.2616, -12.747499, 0.6137, 6.3671, -12.747499, 3.0033998, 6.3671, -15.7546, 0.6137, 3.5372, -14.4892, 3.0033998, 4.2778, -15.372, 3.0033998, 3.6132998, -15.7546, 0.6137, 3.5372, -14.4892, 0.6137, 4.2778, -14.4892, 3.0033998, 4.2778, 21.1831, 0, -13.6544, 16.8204, 3.138, -13.447599, 18.0241, 0, -14.3019, 21.1831, 0, -13.6544, 20.1539, 3.1299, -13.399799, 16.8204, 3.138, -13.447599, 21.8888, 0, -10.033899, 20.1539, 3.1299, -13.399799, 21.1831, 0, -13.6544, 21.8888, 0, -10.033899, 20.198, 3.1490998, -10.033899, 20.1539, 3.1299, -13.399799, 17.2285, 0, -16.8036, 12.7471, 3.1766999, -16.1988, 13.7014, 0, -17.416399, 17.2285, 0, -16.8036, 16.756899, 3.1650999, -16.7286, 12.7471, 3.1766999, -16.1988, 16.8204, 3.138, -13.447599, 17.2285, 0, -16.8036, 18.0241, 0, -14.3019, 17.2285, 0, -16.8036, 16.8204, 3.138, -13.447599, 16.8051, 3.1778, -13.479, 17.2285, 0, -16.8036, 16.8051, 3.1778, -13.479, 16.756899, 3.1650999, -16.7286, 12.7471, 3.1766999, -16.1988, 13.3786, 0, -20.5992, 13.7014, 0, -17.416399, 13.3786, 0, -20.5992, 12.7471, 3.1766999, -16.1988, 12.747, 3.1771, -16.1991, 13.3786, 0, -20.5992, 12.747, 3.1771, -16.1991, 12.723599, 2.9213, -19.2902, 13.3786, 0, -20.5992, 10.033899, 3.0523999, -19.0294, 10.033899, 0, -20.467, 13.3786, 0, -20.5992, 12.723599, 2.9213, -19.2902, 10.033899, 3.0523999, -19.0294, 10.033899, 0, -20.467, 6.6893, 3.0440998, -19.036999, 6.6893, 0, -20.1318, 10.033899, 0, -20.467, 10.033899, 3.0523999, -19.0294, 6.6893, 3.0440998, -19.036999, 3.0140998, 0, -16.7232, 4.4131, 3.2091, -13.357699, 3.3446, -0.3989, -12.9443, 3.0140998, 0, -16.7232, 3.5895, 3.2033, -16.7232, 4.4131, 3.2091, -13.357699, 6.6893, 3.0440998, -19.036999, 3.3446, 0, -20.5992, 6.6893, 0, -20.1318, 3.3446, 0, -20.5992, 6.6893, 3.0440998, -19.036999, 6.6640997, 3.0702, -19.018099, 3.3446, 0, -20.5992, 6.6640997, 3.0702, -19.018099, 4.4783998, 3.1067, -18.2665, 3.3446, 0, -20.5992, 3.5895, 3.2033, -16.7232, 3.0140998, 0, -16.7232, 3.3446, 0, -20.5992, 4.4783998, 3.1067, -18.2665, 3.5895, 3.2033, -16.7232, 2.8241, 0, -10.4594, 0, 3.179, -9.0652, 0, 0, -10.7654, 2.8241, 0, -10.4594, 3.7529, 3.1712, -9.0494995, 0, 3.179, -9.0652, 3.3446, -0.3989, -12.9443, 3.7529, 3.1712, -9.0494995, 2.8241, 0, -10.4594, 3.3446, -0.3989, -12.9443, 4.4131, 3.2091, -13.357699, 3.7529, 3.1712, -9.0494995, 4.4131, 3.2091, -13.357699, 3.3446, -0.3989, -12.9443, 4.4131, 3.2091, -13.357699, -2.6297, 0, -10.5745, -3.6538, 3.1585999, -12.813399, -3.3446, 0, -13.3786, -2.6297, 0, -10.5745, -3.6076, 3.1676, -10.0696, -3.6538, 3.1585999, -12.813399, -3.3446, 0, -13.3786, -6.6893, 3.175, -12.867, -6.6893, 0, -14.2637, -3.3446, 0, -13.3786, -3.6538, 3.1585999, -12.813399, -6.6893, 3.175, -12.867, 0, 3.179, -9.0652, -2.6297, 0, -10.5745, 0, 0, -10.7654, -2.6297, 0, -10.5745, 0, 3.179, -9.0652, -0.0081, 3.1864998, -9.063499, -2.6297, 0, -10.5745, -0.0081, 3.1864998, -9.063499, -3.6076, 3.1676, -10.0696, -6.6893, 0, -14.2637, -10.4043, 3.1608999, -13.4295, -9.6168995, 0, -14.127899, -6.6893, 0, -14.2637, -6.6893, 3.175, -12.867, -10.4043, 3.1608999, -13.4295, -6.6893, 3.175, -12.867, -6.6893, 0, -14.2637, -6.6893, 3.175, -12.867, -9.6168995, 0, -14.127899, -10.4319, 3.1557999, -16.1556, -10.033899, 0, -16.7232, -9.6168995, 0, -14.127899, -10.4043, 3.1608999, -13.4295, -10.4319, 3.1557999, -16.1556, -10.033899, 0, -16.7232, -13.3786, 3.1771998, -15.7625, -13.3786, 0, -17.3364, -10.033899, 0, -16.7232, -10.4319, 3.1557999, -16.1556, -13.3786, 3.1771998, -15.7625, -16.7232, 0, -16.7232, -16.3753, 3.4225, -13.6277, -16.7232, 0, -13.3786, -16.7232, 0, -16.7232, -16.0243, 3.3509998, -15.752, -16.3753, 3.4225, -13.6277, -13.3786, 3.1771998, -15.7625, -16.7232, 0, -16.7232, -13.3786, 0, -17.3364, -16.7232, 0, -16.7232, -13.3786, 3.1771998, -15.7625, -13.3911, 3.1892, -15.757, -16.7232, 0, -16.7232, -13.3911, 3.1892, -15.757, -16.0243, 3.3509998, -15.752, -17.275, 0, -10.5169, -19.6237, 3.1655998, -9.757899, -20.0679, 0, -10.033899, -17.275, 0, -10.5169, -16.4131, 3.1706, -9.788899, -19.6237, 3.1655998, -9.757899, -16.7232, 0, -13.3786, -16.4131, 3.1706, -9.788899, -17.275, 0, -10.5169, -16.7232, 0, -13.3786, -16.3753, 3.4225, -13.6277, -16.4131, 3.1706, -9.788899, -16.3753, 3.4225, -13.6277, -16.7232, 0, -13.3786, -16.3753, 3.4225, -13.6277, -20.3764, 0, -6.6893, -19.9489, 3.2063, -2.8082, -20.0679, -0.3484, -3.5669, -20.3764, 0, -6.6893, -19.515, 3.2122, -6.6893, -19.9489, 3.2063, -2.8082, -19.6237, 3.1655998, -9.757899, -20.3764, 0, -6.6893, -20.0679, 0, -10.033899, -20.3764, 0, -6.6893, -19.6237, 3.1655998, -9.757899, -19.6161, 3.2075999, -9.7116995, -20.3764, 0, -6.6893, -19.6161, 3.2075999, -9.7116995, -19.515, 3.2122, -6.6893, -23.412498, -0.2913, 0.26119998, -23.0809, 3.3083, 3.3615, -23.412498, 0, 3.3446, -23.412498, -0.2913, 0.26119998, -23.3676, 3.4459999, 0.1372, -23.0809, 3.3083, 3.3615, -23.412498, 0, -3.3446, -23.3676, 3.4459999, 0.1372, -23.412498, -0.2913, 0.26119998, -23.412498, 0, -3.3446, -23.390299, 3.3349998, -2.6938999, -23.3676, 3.4459999, 0.1372, -20.0679, -0.3484, -3.5669, -23.390299, 3.3349998, -2.6938999, -23.412498, 0, -3.3446, -20.0679, -0.3484, -3.5669, -19.9489, 3.2063, -2.8082, -23.390299, 3.3349998, -2.6938999, -19.9489, 3.2063, -2.8082, -20.0679, -0.3484, -3.5669, -19.9489, 3.2063, -2.8082, -23.0809, 3.3083, 3.3615, -23.8078, 0, 6.6893, -23.412498, 0, 3.3446, -23.8078, 0, 6.6893, -23.0809, 3.3083, 3.3615, -23.0777, 3.3197, 3.3734, -23.8078, 0, 6.6893, -23.0777, 3.3197, 3.3734, -22.563799, 3.2219, 6.6893, -23.8078, 0, 6.6893, -22.791399, 3.2124999, 9.4432, -23.412498, 0, 10.033899, -23.8078, 0, 6.6893, -22.563799, 3.2219, 6.6893, -22.791399, 3.2124999, 9.4432, -23.412498, 0, 10.033899, -20.0679, 3.1943, 9.407499, -20.0679, 0, 10.033899, -23.412498, 0, 10.033899, -22.791399, 3.2124999, 9.4432, -20.0679, 3.1943, 9.407499, -22.791399, 3.2124999, 9.4432, -23.412498, 0, 10.033899, -22.791399, 3.2124999, 9.4432, -20.0679, 0, 10.033899, -16.2818, 3.1913998, 9.8056, -16.7232, 0, 10.033899, -20.0679, 0, 10.033899, -20.0679, 3.1943, 9.407499, -16.2818, 3.1913998, 9.8056, -16.7232, 0, 13.3786, -13.3786, 3.194, 12.8089, -13.3786, 0, 13.3786, -16.7232, 0, 13.3786, -16.076399, 3.04, 12.735, -13.3786, 3.194, 12.8089, -16.7232, 0, 10.033899, -16.076399, 3.04, 12.735, -16.7232, 0, 13.3786, -16.7232, 0, 10.033899, -16.2818, 3.1913998, 9.8056, -16.076399, 3.04, 12.735, -16.2818, 3.1913998, 9.8056, -16.7232, 0, 10.033899, -16.2818, 3.1913998, 9.8056, -13.3786, 0, 13.3786, -10.033899, 2.9384, 12.4537, -10.033899, 0, 13.3786, -13.3786, 0, 13.3786, -13.3786, 3.194, 12.8089, -10.033899, 2.9384, 12.4537, -13.3786, 3.194, 12.8089, -13.3786, 0, 13.3786, -13.3786, 3.194, 12.8089, -10.033899, 0, 13.3786, -6.2748, 3.126, 13.122, -6.6893, 0, 13.3786, -10.033899, 0, 13.3786, -10.033899, 2.9384, 12.4537, -6.2748, 3.126, 13.122, -6.6893, 0, 13.3786, -6.2748, 3.1260998, 16.4145, -6.6893, 0, 16.7232, -6.6893, 0, 13.3786, -6.2748, 3.126, 13.122, -6.2748, 3.1260998, 16.4145, -3.3446, 0, 16.7232, 0, 2.9636998, 16.0179, 0, 0, 16.7232, -3.3446, 0, 16.7232, -3.3446, 3.1497998, 15.914599, 0, 2.9636998, 16.0179, 0, 0, 16.7232, 3.6425998, 3.1413999, 16.5127, 3.3446, 0, 16.7232, 0, 0, 16.7232, 0, 2.9636998, 16.0179, 3.6425998, 3.1413999, 16.5127, -6.2748, 3.1260998, 16.4145, -3.3446, 0, 16.7232, -6.6893, 0, 16.7232, -3.3446, 0, 16.7232, -6.2748, 3.1260998, 16.4145, -6.2558, 3.1427999, 16.4098, -3.3446, 0, 16.7232, -6.2558, 3.1427999, 16.4098, -3.3446, 3.1497998, 15.914599, 3.3446, 0, 20.0679, 6.6893, 3.2050998, 19.228699, 6.6893, 0, 20.0679, 3.3446, 0, 20.0679, 3.9266999, 3.5967, 19.6223, 6.6893, 3.2050998, 19.228699, 3.6425998, 3.1413999, 16.5127, 3.3446, 0, 20.0679, 3.3446, 0, 16.7232, 3.3446, 0, 20.0679, 3.6425998, 3.1413999, 16.5127, 3.6536, 3.2078998, 16.5669, 3.3446, 0, 20.0679, 3.6536, 3.2078998, 16.5669, 3.9266999, 3.5967, 19.6223, 6.6893, 3.2050998, 19.228699, 10.572599, 0, 20.0679, 6.6893, 0, 20.0679, 10.572599, 0, 20.0679, 6.6893, 3.2050998, 19.228699, 6.6991997, 3.2148, 19.2255, 10.572599, 0, 20.0679, 6.6991997, 3.2148, 19.2255, 9.3066, 3.2186, 19.0653, 10.572599, 0, 20.0679, 10.5913, 3.1985998, 16.7232, 10.572599, 0, 16.7232, 10.572599, 0, 20.0679, 9.3066, 3.2186, 19.0653, 10.5913, 3.1985998, 16.7232, 10.5913, 3.1985998, 16.7232, 10.572599, 0, 13.918799, 10.572599, 0, 16.7232, 10.572599, 0, 13.918799, 10.5913, 3.1985998, 16.7232, 10.5893, 3.2117, 16.7106, 10.572599, 0, 13.918799, 10.5893, 3.2117, 16.7106, 10.0546, 3.1885, 13.4071, 10.572599, 0, 13.918799, 13.2631, 3.5611, 13.4043, 13.8046, 0, 13.918799, 10.572599, 0, 13.918799, 10.0546, 3.1885, 13.4071, 13.2631, 3.5611, 13.4043, 13.8046, 0, 13.918799, 12.9758, 3.2036, 10.033899, 13.8046, 0, 10.033899, 13.8046, 0, 13.918799, 13.2631, 3.5611, 13.4043, 12.9758, 3.2036, 10.033899, 13.8046, 0, 13.918799, 13.2631, 3.5611, 13.4043, 13.2631, 3.5611, 13.4043, 13.8046, 0, 10.033899, 13.4036, 3.0749998, 6.6893, 13.8046, 0, 6.6893, 13.8046, 0, 10.033899, 12.9758, 3.2036, 10.033899, 13.4036, 3.0749998, 6.6893, 20.961199, 0, -3.3446, 16.7127, 2.8734, -3.3446, 20.144999, 2.7605999, -3.3446, 20.961199, 0, -3.3446, 14.0489, 3.0042, -3.3446, 16.7127, 2.8734, -3.3446, 20.144999, 2.7605999, -3.3446, 21.2349, 0, -6.6893, 20.961199, 0, -3.3446, 21.2349, 0, -6.6893, 20.144999, 2.7605999, -3.3446, 20.1349, 2.7974, -3.3783998, 21.2349, 0, -6.6893, 20.1349, 2.7974, -3.3783998, 20.147, 3.0588999, -6.6893, 20.147, 3.0588999, -6.6893, 21.8888, 0, -10.033899, 21.2349, 0, -6.6893, 21.8888, 0, -10.033899, 20.147, 3.0588999, -6.6893, 20.1796, 3.182, -9.995999, 21.8888, 0, -10.033899, 20.1796, 3.182, -9.995999, 20.198, 3.1490998, -10.033899, 23.412498, 0, -26.7572, 26.7572, -0.2593, -23.412498, 23.412498, 0, -23.412498, 26.7572, -0.2593, -23.412498, 23.412498, 0, -26.7572, 26.7572, -0.2593, -25.084799, 26.7572, -0.2593, -25.084799, 23.412498, 0, -26.7572, 26.7572, -0.2593, -26.7572, 26.7572, -0.2593, -21.7402, 23.412498, 0, -23.412498, 26.7572, -0.2593, -23.412498, 26.7572, -0.2593, -20.0679, 23.412498, 0, -23.412498, 26.7572, -0.2593, -21.7402, 23.412498, 0, -23.412498, 26.7572, -0.2593, -20.0679, 23.412498, 0, -20.0679, 26.7572, -0.2593, -18.3955, 23.412498, 0, -20.0679, 26.7572, -0.2593, -20.0679, 26.7572, -0.2593, -16.7232, 23.412498, 0, -20.0679, 26.7572, -0.2593, -18.3955, 23.412498, 0, -20.0679, 26.7572, -0.2593, -16.7232, 23.412498, 0, -16.7232, 26.7572, -0.2593, -15.0508995, 23.412498, 0, -16.7232, 26.7572, -0.2593, -16.7232, 26.7572, -0.2593, -13.3786, 23.412498, 0, -16.7232, 26.7572, -0.2593, -15.0508995, 23.412498, 0, -16.7232, 26.7572, -0.2593, -13.3786, 23.412498, 0, -13.3786, 26.7572, -0.2593, -11.7063, 23.412498, 0, -13.3786, 26.7572, -0.2593, -13.3786, 26.7572, -0.2593, -10.033899, 23.412498, 0, -13.3786, 26.7572, -0.2593, -11.7063, 23.412498, 0, -13.3786, 26.7572, -0.2593, -10.033899, 23.412498, 0, -10.033899, 26.7572, -0.2593, -8.3616, 23.412498, 0, -10.033899, 26.7572, -0.2593, -10.033899, 26.7572, -0.2593, -6.6893, 23.412498, 0, -10.033899, 26.7572, -0.2593, -8.3616, 23.412498, 0, -10.033899, 26.7572, -0.2593, -6.6893, 23.412498, 0, -6.6893, 26.7572, -0.2593, -5.0169997, 23.412498, 0, -6.6893, 26.7572, -0.2593, -6.6893, 26.7572, -0.2593, -3.3446, 23.412498, 0, -6.6893, 26.7572, -0.2593, -5.0169997, 23.412498, 0, -6.6893, 26.7572, -0.2593, -3.3446, 23.412498, 0, -3.3446, 26.7572, -0.2593, -1.6723, 23.412498, 0, -3.3446, 26.7572, -0.2593, -3.3446, 26.7572, -0.2593, 0, 23.412498, 0, -3.3446, 26.7572, -0.2593, -1.6723, 23.412498, 0, -3.3446, 26.7572, -0.2593, 0, 23.412498, 0, 0, 26.7572, -0.2593, 1.6723, 23.412498, 0, 0, 26.7572, -0.2593, 0, 26.7572, -0.2593, 3.3446, 23.412498, 0, 0, 26.7572, -0.2593, 1.6723, 23.412498, 0, 0, 26.7572, -0.2593, 3.3446, 23.412498, 0, 3.3446, 26.7572, -0.2593, 5.0169997, 23.412498, 0, 3.3446, 26.7572, -0.2593, 3.3446, 26.7572, -0.2593, 6.6893, 23.412498, 0, 3.3446, 26.7572, -0.2593, 5.0169997, 23.412498, 0, 3.3446, 26.7572, -0.2593, 6.6893, 23.412498, 0, 6.6893, 26.7572, -0.2593, 8.3616, 23.412498, 0, 6.6893, 26.7572, -0.2593, 6.6893, 26.7572, -0.2593, 10.033899, 23.412498, 0, 6.6893, 26.7572, -0.2593, 8.3616, 23.412498, 0, 6.6893, 26.7572, -0.2593, 10.033899, 23.412498, 0, 10.033899, 26.7572, -0.2593, 11.7063, 23.412498, 0, 10.033899, 26.7572, -0.2593, 10.033899, 26.7572, -0.2593, 13.3786, 23.412498, 0, 10.033899, 26.7572, -0.2593, 11.7063, 23.412498, 0, 10.033899, 26.7572, -0.2593, 13.3786, 23.412498, 0, 13.3786, 26.7572, -0.2593, 15.0508995, 23.412498, 0, 13.3786, 26.7572, -0.2593, 13.3786, 26.7572, -0.2593, 16.7232, 23.412498, 0, 13.3786, 26.7572, -0.2593, 15.0508995, 23.412498, 0, 13.3786, 26.7572, -0.2593, 16.7232, 23.412498, 0, 16.7232, 26.7572, -0.2593, 18.3955, 23.412498, 0, 16.7232, 26.7572, -0.2593, 16.7232, 26.7572, -0.2593, 20.0679, 23.412498, 0, 16.7232, 26.7572, -0.2593, 18.3955, 23.412498, 0, 16.7232, 26.7572, -0.2593, 20.0679, 23.412498, 0, 20.0679, 26.7572, -0.2593, 21.7402, 23.412498, 0, 20.0679, 26.7572, -0.2593, 20.0679, 26.7572, -0.2593, 23.412498, 23.412498, 0, 20.0679, 26.7572, -0.2593, 21.7402, 23.412498, 0, 20.0679, 26.7572, -0.2593, 23.412498, 23.412498, 0, 23.412498, 26.7572, -0.2593, 25.084799, 23.412498, 0, 23.412498, 26.7572, -0.2593, 23.412498, 26.7572, -0.2593, 26.7572, 23.412498, 0, 23.412498, 26.7572, -0.2593, 25.084799, 23.412498, 0, 23.412498, 26.7572, -0.2593, 26.7572, 23.412498, 0, 26.7572, -3.3446, 0, -23.412498, 0, 0, -26.7572, 0, 0, -23.412498, 0, 0, -23.412498, 0, 0, -26.7572, 3.3446, 0, -26.7572, -3.3446, 0, -23.412498, -3.3446, 0, -26.7572, 0, 0, -26.7572, 0, 0, -23.412498, 3.3446, 0, -26.7572, 3.3446, 0, -23.412498, 3.3446, 0, -23.412498, 3.3446, 0, -26.7572, 6.6893, 0, -26.7572, -3.3446, 0, -20.0679, -3.3446, 0, -23.412498, 0, 0, -23.412498, 3.3446, 0, -23.412498, 6.6893, 0, -26.7572, 6.6893, 0, -23.412498, 6.6893, 0, -23.412498, 6.6893, 0, -26.7572, 10.033899, 0, -26.7572, 0, 0, -20.0679, 0, 0, -23.412498, 3.3446, 0, -23.412498, -3.3446, 0, -20.0679, 0, 0, -23.412498, 0, 0, -20.0679, 3.3446, 0, -20.5992, 3.3446, 0, -23.412498, 6.6893, 0, -23.412498, 0, 0, -20.0679, 3.3446, 0, -23.412498, 3.3446, 0, -20.5992, 3.3446, 0, -20.5992, 6.6893, 0, -23.412498, 6.6893, 0, -20.1318, 6.6893, 0, -23.412498, 10.033899, 0, -26.7572, 10.033899, 0, -23.412498, 6.6893, 0, -20.1318, 6.6893, 0, -23.412498, 10.033899, 0, -23.412498, 10.033899, 0, -23.412498, 10.033899, 0, -26.7572, 13.3786, 0, -26.7572, 6.6893, 0, -20.1318, 10.033899, 0, -23.412498, 10.033899, 0, -20.467, 10.033899, 0, -23.412498, 13.3786, 0, -26.7572, 13.3786, 0, -23.412498, 10.033899, 0, -20.467, 10.033899, 0, -23.412498, 13.3786, 0, -23.412498, 13.3786, 0, -23.412498, 13.3786, 0, -26.7572, 16.7232, 0, -26.7572, 10.033899, 0, -20.467, 13.3786, 0, -23.412498, 13.3786, 0, -20.5992, 13.3786, 0, -23.412498, 16.7232, 0, -26.7572, 16.7232, 0, -23.412498, 13.3786, 0, -20.5992, 13.3786, 0, -23.412498, 16.7232, 0, -23.412498, 16.7232, 0, -23.412498, 16.7232, 0, -26.7572, 20.0679, 0, -26.7572, 13.3786, 0, -20.5992, 16.7232, 0, -23.412498, 16.7232, 0, -20.0679, 13.7014, 0, -17.416399, 13.3786, 0, -20.5992, 16.7232, 0, -20.0679, 13.7014, 0, -17.416399, 16.7232, 0, -20.0679, 17.2285, 0, -16.8036, 16.7232, 0, -23.412498, 20.0679, 0, -26.7572, 20.0679, 0, -23.412498, 16.7232, 0, -20.0679, 16.7232, 0, -23.412498, 20.0679, 0, -23.412498, 20.0679, 0, -23.412498, 20.0679, 0, -26.7572, 23.412498, 0, -26.7572, 20.0679, 0, -23.412498, 23.412498, 0, -26.7572, 23.412498, 0, -23.412498, 16.7232, 0, -20.0679, 20.0679, 0, -23.412498, 20.0679, 0, -20.0679, 20.0679, 0, -20.0679, 20.0679, 0, -23.412498, 23.412498, 0, -23.412498, 17.2285, 0, -16.8036, 16.7232, 0, -20.0679, 20.0679, 0, -20.0679, 20.0679, 0, -20.0679, 23.412498, 0, -23.412498, 23.412498, 0, -20.0679, 17.2285, 0, -16.8036, 20.0679, 0, -20.0679, 20.0679, 0, -16.7232, 20.0679, 0, -16.7232, 20.0679, 0, -20.0679, 23.412498, 0, -20.0679, 18.0241, 0, -14.3019, 17.2285, 0, -16.8036, 20.0679, 0, -16.7232, 20.0679, 0, -16.7232, 23.412498, 0, -20.0679, 23.412498, 0, -16.7232, 18.0241, 0, -14.3019, 20.0679, 0, -16.7232, 21.1831, 0, -13.6544, 21.1831, 0, -13.6544, 20.0679, 0, -16.7232, 23.412498, 0, -16.7232, 21.1831, 0, -13.6544, 23.412498, 0, -16.7232, 23.412498, 0, -13.3786, 21.8888, 0, -10.033899, 21.1831, 0, -13.6544, 23.412498, 0, -13.3786, 21.8888, 0, -10.033899, 23.412498, 0, -13.3786, 23.412498, 0, -10.033899, 21.2349, 0, -6.6893, 21.8888, 0, -10.033899, 23.412498, 0, -10.033899, 21.2349, 0, -6.6893, 23.412498, 0, -10.033899, 23.412498, 0, -6.6893, 20.961199, 0, -3.3446, 21.2349, 0, -6.6893, 23.412498, 0, -6.6893, 20.961199, 0, -3.3446, 23.412498, 0, -6.6893, 23.412498, 0, -3.3446, 20.0679, 0, 0, 20.961199, 0, -3.3446, 23.412498, 0, -3.3446, 20.0679, 0, 0, 23.412498, 0, -3.3446, 23.412498, 0, 0, 20.0679, 0, 3.3446, 20.0679, 0, 0, 23.412498, 0, 0, 20.0679, 0, 3.3446, 23.412498, 0, 0, 23.412498, 0, 3.3446, 10.572599, 0, 16.7232, 13.8046, 0, 13.918799, 13.3786, 0, 16.7232, 10.572599, 0, 16.7232, 10.572599, 0, 13.918799, 13.8046, 0, 13.918799, 10.572599, 0, 20.0679, 10.572599, 0, 16.7232, 13.3786, 0, 16.7232, 13.3786, 0, 16.7232, 13.8046, 0, 13.918799, 15.0508995, 0, 13.3786, 10.572599, 0, 20.0679, 13.3786, 0, 16.7232, 13.3786, 0, 20.0679, 13.8046, 0, 13.918799, 15.0508995, 0, 10.033899, 15.0508995, 0, 13.3786, 13.8046, 0, 13.918799, 13.8046, 0, 10.033899, 15.0508995, 0, 10.033899, 13.8046, 0, 10.033899, 15.0508995, 0, 6.6893, 15.0508995, 0, 10.033899, 13.8046, 0, 10.033899, 13.8046, 0, 6.6893, 15.0508995, 0, 6.6893, 15.0508995, 0, 10.033899, 15.0508995, 0, 6.6893, 16.7232, 0, 6.6893, 15.0508995, 0, 10.033899, 16.7232, 0, 6.6893, 16.7232, 0, 10.033899, 15.0508995, 0, 13.3786, 15.0508995, 0, 10.033899, 16.7232, 0, 10.033899, 13.3786, 0, 16.7232, 15.0508995, 0, 13.3786, 15.0508995, 0, 16.7232, 13.3786, 0, 20.0679, 13.3786, 0, 16.7232, 15.0508995, 0, 16.7232, 15.0508995, 0, 13.3786, 16.7232, 0, 10.033899, 16.7232, 0, 13.3786, 15.0508995, 0, 16.7232, 15.0508995, 0, 13.3786, 16.7232, 0, 13.3786, 16.7232, 0, 13.3786, 16.7232, 0, 10.033899, 20.0679, 0, 10.033899, 16.7232, 0, 13.3786, 20.0679, 0, 10.033899, 20.0679, 0, 13.3786, 20.0679, 0, 13.3786, 20.0679, 0, 10.033899, 23.412498, 0, 10.033899, 20.0679, 0, 13.3786, 23.412498, 0, 10.033899, 23.412498, 0, 13.3786, 16.7232, 0, 16.7232, 16.7232, 0, 13.3786, 20.0679, 0, 13.3786, 15.0508995, 0, 16.7232, 16.7232, 0, 13.3786, 16.7232, 0, 16.7232, 20.0679, 0, 16.7232, 20.0679, 0, 13.3786, 23.412498, 0, 13.3786, 16.7232, 0, 16.7232, 20.0679, 0, 13.3786, 20.0679, 0, 16.7232, 20.0679, 0, 16.7232, 23.412498, 0, 13.3786, 23.412498, 0, 16.7232, 15.0508995, 0, 20.0679, 15.0508995, 0, 16.7232, 16.7232, 0, 16.7232, 13.3786, 0, 20.0679, 15.0508995, 0, 16.7232, 15.0508995, 0, 20.0679, 16.7232, 0, 20.0679, 16.7232, 0, 16.7232, 20.0679, 0, 16.7232, 15.0508995, 0, 20.0679, 16.7232, 0, 16.7232, 16.7232, 0, 20.0679, 20.0679, 0, 20.0679, 20.0679, 0, 16.7232, 23.412498, 0, 16.7232, 16.7232, 0, 20.0679, 20.0679, 0, 16.7232, 20.0679, 0, 20.0679, 20.0679, 0, 20.0679, 23.412498, 0, 16.7232, 23.412498, 0, 20.0679, 20.0679, 0, 23.412498, 20.0679, 0, 20.0679, 23.412498, 0, 20.0679, 20.0679, 0, 23.412498, 23.412498, 0, 20.0679, 23.412498, 0, 23.412498, 20.0679, 0, 26.7572, 20.0679, 0, 23.412498, 23.412498, 0, 23.412498, 20.0679, 0, 26.7572, 23.412498, 0, 23.412498, 23.412498, 0, 26.7572, 16.7232, 0, 26.7572, 20.0679, 0, 23.412498, 20.0679, 0, 26.7572, 16.7232, 0, 23.412498, 20.0679, 0, 20.0679, 20.0679, 0, 23.412498, 16.7232, 0, 26.7572, 16.7232, 0, 23.412498, 20.0679, 0, 23.412498, 16.7232, 0, 23.412498, 16.7232, 0, 20.0679, 20.0679, 0, 20.0679, 15.0508995, 0, 26.7572, 16.7232, 0, 23.412498, 16.7232, 0, 26.7572, 15.0508995, 0, 23.412498, 16.7232, 0, 20.0679, 16.7232, 0, 23.412498, 15.0508995, 0, 26.7572, 15.0508995, 0, 23.412498, 16.7232, 0, 23.412498, 15.0508995, 0, 23.412498, 15.0508995, 0, 20.0679, 16.7232, 0, 20.0679, 13.3786, 0, 26.7572, 15.0508995, 0, 23.412498, 15.0508995, 0, 26.7572, 13.3786, 0, 23.412498, 15.0508995, 0, 20.0679, 15.0508995, 0, 23.412498, 13.3786, 0, 26.7572, 13.3786, 0, 23.412498, 15.0508995, 0, 23.412498, 13.3786, 0, 23.412498, 13.3786, 0, 20.0679, 15.0508995, 0, 20.0679, 10.033899, 0, 26.7572, 13.3786, 0, 23.412498, 13.3786, 0, 26.7572, 10.033899, 0, 23.412498, 13.3786, 0, 20.0679, 13.3786, 0, 23.412498, 10.033899, 0, 26.7572, 10.033899, 0, 23.412498, 13.3786, 0, 23.412498, 10.033899, 0, 23.412498, 10.572599, 0, 20.0679, 13.3786, 0, 20.0679, 6.6893, 0, 26.7572, 10.033899, 0, 23.412498, 10.033899, 0, 26.7572, 6.6893, 0, 23.412498, 10.572599, 0, 20.0679, 10.033899, 0, 23.412498, 6.6893, 0, 26.7572, 6.6893, 0, 23.412498, 10.033899, 0, 23.412498, 6.6893, 0, 23.412498, 6.6893, 0, 20.0679, 10.572599, 0, 20.0679, 3.3446, 0, 26.7572, 6.6893, 0, 23.412498, 6.6893, 0, 26.7572, 3.3446, 0, 23.412498, 6.6893, 0, 20.0679, 6.6893, 0, 23.412498, 3.3446, 0, 26.7572, 3.3446, 0, 23.412498, 6.6893, 0, 23.412498, 3.3446, 0, 23.412498, 3.3446, 0, 20.0679, 6.6893, 0, 20.0679, 0, 0, 26.7572, 3.3446, 0, 23.412498, 3.3446, 0, 26.7572, 0, 0, 26.7572, 0, 0, 23.412498, 3.3446, 0, 23.412498, 0, 0, 23.412498, 3.3446, 0, 20.0679, 3.3446, 0, 23.412498, -3.3446, 0, 26.7572, 0, 0, 23.412498, 0, 0, 26.7572, 0, 0, 23.412498, 0, 0, 20.0679, 3.3446, 0, 20.0679, 0, 0, 20.0679, 3.3446, 0, 16.7232, 3.3446, 0, 20.0679, 0, 0, 20.0679, 0, 0, 16.7232, 3.3446, 0, 16.7232, -3.3446, 0, 26.7572, -3.3446, 0, 23.412498, 0, 0, 23.412498, -3.3446, 0, 23.412498, 0, 0, 20.0679, 0, 0, 23.412498, -6.6893, 0, 26.7572, -3.3446, 0, 23.412498, -3.3446, 0, 26.7572, -3.3446, 0, 20.0679, 0, 0, 16.7232, 0, 0, 20.0679, -3.3446, 0, 23.412498, -3.3446, 0, 20.0679, 0, 0, 20.0679, -3.3446, 0, 20.0679, -3.3446, 0, 16.7232, 0, 0, 16.7232, -6.6893, 0, 26.7572, -6.6893, 0, 23.412498, -3.3446, 0, 23.412498, -6.6893, 0, 23.412498, -3.3446, 0, 20.0679, -3.3446, 0, 23.412498, -10.033899, 0, 26.7572, -6.6893, 0, 23.412498, -6.6893, 0, 26.7572, -6.6893, 0, 20.0679, -3.3446, 0, 16.7232, -3.3446, 0, 20.0679, -6.6893, 0, 23.412498, -6.6893, 0, 20.0679, -3.3446, 0, 20.0679, -6.6893, 0, 20.0679, -6.6893, 0, 16.7232, -3.3446, 0, 16.7232, -10.033899, 0, 26.7572, -10.033899, 0, 23.412498, -6.6893, 0, 23.412498, -10.033899, 0, 23.412498, -6.6893, 0, 20.0679, -6.6893, 0, 23.412498, -13.3786, 0, 26.7572, -10.033899, 0, 23.412498, -10.033899, 0, 26.7572, -10.033899, 0, 20.0679, -6.6893, 0, 16.7232, -6.6893, 0, 20.0679, -10.033899, 0, 23.412498, -10.033899, 0, 20.0679, -6.6893, 0, 20.0679, -13.3786, 0, 26.7572, -13.3786, 0, 23.412498, -10.033899, 0, 23.412498, -13.3786, 0, 23.412498, -10.033899, 0, 20.0679, -10.033899, 0, 23.412498, -16.7232, 0, 26.7572, -13.3786, 0, 23.412498, -13.3786, 0, 26.7572, -10.033899, 0, 20.0679, -10.033899, 0, 16.7232, -6.6893, 0, 16.7232, -10.033899, 0, 16.7232, -6.6893, 0, 13.3786, -6.6893, 0, 16.7232, -10.033899, 0, 16.7232, -10.033899, 0, 13.3786, -6.6893, 0, 13.3786, -13.3786, 0, 20.0679, -10.033899, 0, 16.7232, -10.033899, 0, 20.0679, -13.3786, 0, 23.412498, -13.3786, 0, 20.0679, -10.033899, 0, 20.0679, -13.3786, 0, 16.7232, -10.033899, 0, 13.3786, -10.033899, 0, 16.7232, -13.3786, 0, 20.0679, -13.3786, 0, 16.7232, -10.033899, 0, 16.7232, -13.3786, 0, 16.7232, -13.3786, 0, 13.3786, -10.033899, 0, 13.3786, -16.7232, 0, 26.7572, -16.7232, 0, 23.412498, -13.3786, 0, 23.412498, -16.7232, 0, 23.412498, -13.3786, 0, 20.0679, -13.3786, 0, 23.412498, -20.0679, 0, 26.7572, -16.7232, 0, 23.412498, -16.7232, 0, 26.7572, -16.7232, 0, 20.0679, -13.3786, 0, 16.7232, -13.3786, 0, 20.0679, -16.7232, 0, 23.412498, -16.7232, 0, 20.0679, -13.3786, 0, 20.0679, -16.7232, 0, 16.7232, -13.3786, 0, 13.3786, -13.3786, 0, 16.7232, -16.7232, 0, 20.0679, -16.7232, 0, 16.7232, -13.3786, 0, 16.7232, -16.7232, 0, 16.7232, -16.7232, 0, 13.3786, -13.3786, 0, 13.3786, -20.0679, 0, 26.7572, -20.0679, 0, 23.412498, -16.7232, 0, 23.412498, -20.0679, 0, 23.412498, -16.7232, 0, 20.0679, -16.7232, 0, 23.412498, -23.412498, 0, 26.7572, -20.0679, 0, 23.412498, -20.0679, 0, 26.7572, -20.0679, 0, 20.0679, -16.7232, 0, 16.7232, -16.7232, 0, 20.0679, -20.0679, 0, 23.412498, -20.0679, 0, 20.0679, -16.7232, 0, 20.0679, -23.412498, 0, 26.7572, -23.412498, 0, 23.412498, -20.0679, 0, 23.412498, -23.412498, 0, 23.412498, -20.0679, 0, 20.0679, -20.0679, 0, 23.412498, -26.7572, 0, 26.7572, -23.412498, 0, 23.412498, -23.412498, 0, 26.7572, -26.7572, 0, 26.7572, -26.7572, 0, 23.412498, -23.412498, 0, 23.412498, -26.7572, 0, 23.412498, -23.412498, 0, 20.0679, -23.412498, 0, 23.412498, -23.412498, 0, 23.412498, -23.412498, 0, 20.0679, -20.0679, 0, 20.0679, -26.7572, 0, 23.412498, -26.7572, 0, 20.0679, -23.412498, 0, 20.0679, -20.0679, 0, 20.0679, -20.0679, 0, 16.7232, -16.7232, 0, 16.7232, -23.412498, 0, 20.0679, -20.0679, 0, 16.7232, -20.0679, 0, 20.0679, -20.0679, 0, 16.7232, -16.7232, 0, 13.3786, -16.7232, 0, 16.7232, -26.7572, 0, 20.0679, -23.412498, 0, 16.7232, -23.412498, 0, 20.0679, -23.412498, 0, 20.0679, -23.412498, 0, 16.7232, -20.0679, 0, 16.7232, -26.7572, 0, 20.0679, -26.7572, 0, 16.7232, -23.412498, 0, 16.7232, -20.0679, 0, 16.7232, -20.0679, 0, 13.3786, -16.7232, 0, 13.3786, -23.412498, 0, 16.7232, -20.0679, 0, 13.3786, -20.0679, 0, 16.7232, -20.0679, 0, 13.3786, -16.7232, 0, 10.033899, -16.7232, 0, 13.3786, -20.0679, 0, 13.3786, -20.0679, 0, 10.033899, -16.7232, 0, 10.033899, -23.412498, 0, 16.7232, -23.412498, 0, 13.3786, -20.0679, 0, 13.3786, -23.412498, 0, 13.3786, -20.0679, 0, 10.033899, -20.0679, 0, 13.3786, -26.7572, 0, 16.7232, -23.412498, 0, 13.3786, -23.412498, 0, 16.7232, -23.412498, 0, 13.3786, -23.412498, 0, 10.033899, -20.0679, 0, 10.033899, -26.7572, 0, 16.7232, -26.7572, 0, 13.3786, -23.412498, 0, 13.3786, -26.7572, 0, 13.3786, -23.412498, 0, 10.033899, -23.412498, 0, 13.3786, -26.7572, 0, 13.3786, -26.7572, 0, 10.033899, -23.412498, 0, 10.033899, -26.7572, 0, 10.033899, -23.8078, 0, 6.6893, -23.412498, 0, 10.033899, -26.7572, 0, 10.033899, -26.7572, 0, 6.6893, -23.8078, 0, 6.6893, -26.7572, 0, 6.6893, -23.412498, 0, 3.3446, -23.8078, 0, 6.6893, -26.7572, 0, 6.6893, -26.7572, 0, 3.3446, -23.412498, 0, 3.3446, -16.7232, 0, -23.412498, -13.3786, 0, -26.7572, -13.3786, 0, -23.412498, -13.3786, 0, -23.412498, -13.3786, 0, -26.7572, -10.033899, 0, -26.7572, -16.7232, 0, -23.412498, -16.7232, 0, -26.7572, -13.3786, 0, -26.7572, -13.3786, 0, -23.412498, -10.033899, 0, -26.7572, -10.033899, 0, -23.412498, -10.033899, 0, -23.412498, -10.033899, 0, -26.7572, -6.6893, 0, -26.7572, -16.7232, 0, -20.0679, -16.7232, 0, -23.412498, -13.3786, 0, -23.412498, -10.033899, 0, -23.412498, -6.6893, 0, -26.7572, -6.6893, 0, -23.412498, -6.6893, 0, -23.412498, -6.6893, 0, -26.7572, -3.3446, 0, -26.7572, -6.6893, 0, -23.412498, -3.3446, 0, -26.7572, -3.3446, 0, -23.412498, -13.3786, 0, -20.0679, -13.3786, 0, -23.412498, -10.033899, 0, -23.412498, -16.7232, 0, -20.0679, -13.3786, 0, -23.412498, -13.3786, 0, -20.0679, -10.033899, 0, -20.0679, -10.033899, 0, -23.412498, -6.6893, 0, -23.412498, -13.3786, 0, -20.0679, -10.033899, 0, -23.412498, -10.033899, 0, -20.0679, -6.6893, 0, -20.0679, -6.6893, 0, -23.412498, -3.3446, 0, -23.412498, -10.033899, 0, -20.0679, -6.6893, 0, -23.412498, -6.6893, 0, -20.0679, -6.6893, 0, -20.0679, -3.3446, 0, -23.412498, -3.3446, 0, -20.0679, -13.3786, 0, -17.3364, -13.3786, 0, -20.0679, -10.033899, 0, -20.0679, -13.3786, 0, -17.3364, -10.033899, 0, -20.0679, -10.033899, 0, -16.7232, -10.033899, 0, -16.7232, -10.033899, 0, -20.0679, -6.6893, 0, -20.0679, -16.7232, 0, -16.7232, -13.3786, 0, -20.0679, -13.3786, 0, -17.3364, -16.7232, 0, -16.7232, -16.7232, 0, -20.0679, -13.3786, 0, -20.0679, -10.033899, 0, -16.7232, -6.6893, 0, -20.0679, -6.6893, 0, -16.7232, -6.6893, 0, -16.7232, -6.6893, 0, -20.0679, -3.3446, 0, -20.0679, -9.6168995, 0, -14.127899, -10.033899, 0, -16.7232, -6.6893, 0, -16.7232, -9.6168995, 0, -14.127899, -6.6893, 0, -16.7232, -6.6893, 0, -14.2637, -6.6893, 0, -16.7232, -3.3446, 0, -20.0679, -3.3446, 0, -16.7232, -6.6893, 0, -14.2637, -6.6893, 0, -16.7232, -3.3446, 0, -16.7232, -3.3446, 0, -16.7232, -3.3446, 0, -20.0679, 0, 0, -20.0679, -6.6893, 0, -14.2637, -3.3446, 0, -16.7232, -3.3446, 0, -13.3786, -3.3446, 0, -16.7232, 0, 0, -20.0679, 0, 0, -16.7232, -3.3446, 0, -13.3786, -3.3446, 0, -16.7232, 0, 0, -16.7232, 0, 0, -16.7232, 0, 0, -20.0679, 3.3446, 0, -20.5992, 0, 0, -16.7232, 3.3446, 0, -20.5992, 3.0140998, 0, -16.7232, -3.3446, 0, -13.3786, 0, 0, -16.7232, 0, 0, -13.3786, -2.6297, 0, -10.5745, -3.3446, 0, -13.3786, 0, 0, -13.3786, -2.6297, 0, -10.5745, 0, 0, -13.3786, 0, 0, -10.7654, -20.0679, 0, -16.7232, -16.7232, 0, -20.0679, -16.7232, 0, -16.7232, -20.0679, 0, -16.7232, -20.0679, 0, -20.0679, -16.7232, 0, -20.0679, -20.0679, 0, -20.0679, -16.7232, 0, -23.412498, -16.7232, 0, -20.0679, -20.0679, 0, -13.3786, -20.0679, 0, -16.7232, -16.7232, 0, -16.7232, -20.0679, 0, -13.3786, -16.7232, 0, -16.7232, -16.7232, 0, -13.3786, -23.412498, 0, -16.7232, -20.0679, 0, -20.0679, -20.0679, 0, -16.7232, -20.0679, 0, -10.033899, -20.0679, 0, -13.3786, -16.7232, 0, -13.3786, -20.0679, 0, -10.033899, -16.7232, 0, -13.3786, -17.275, 0, -10.5169, -23.412498, 0, -13.3786, -20.0679, 0, -16.7232, -20.0679, 0, -13.3786, -23.412498, 0, -13.3786, -23.412498, 0, -16.7232, -20.0679, 0, -16.7232, -23.412498, 0, -10.033899, -20.0679, 0, -13.3786, -20.0679, 0, -10.033899, -23.412498, 0, -10.033899, -23.412498, 0, -13.3786, -20.0679, 0, -13.3786, -26.7572, 0, -10.033899, -23.412498, 0, -13.3786, -23.412498, 0, -10.033899, -26.7572, 0, -10.033899, -26.7572, 0, -13.3786, -23.412498, 0, -13.3786, -26.7572, 0, -13.3786, -23.412498, 0, -16.7232, -23.412498, 0, -13.3786, -26.7572, 0, -6.6893, -26.7572, 0, -10.033899, -23.412498, 0, -10.033899, -26.7572, 0, -13.3786, -26.7572, 0, -16.7232, -23.412498, 0, -16.7232, -26.7572, 0, -6.6893, -23.412498, 0, -10.033899, -23.412498, 0, -6.6893, -23.412498, 0, -6.6893, -23.412498, 0, -10.033899, -20.0679, 0, -10.033899, -23.412498, 0, -6.6893, -20.0679, 0, -10.033899, -20.3764, 0, -6.6893, -26.7572, 0, -3.3446, -26.7572, 0, -6.6893, -23.412498, 0, -6.6893, -26.7572, 0, -3.3446, -23.412498, 0, -6.6893, -23.412498, 0, -3.3446, -26.7572, 0, -16.7232, -23.412498, 0, -20.0679, -23.412498, 0, -16.7232, -23.412498, 0, -16.7232, -23.412498, 0, -20.0679, -20.0679, 0, -20.0679, -26.7572, 0, -16.7232, -26.7572, 0, -20.0679, -23.412498, 0, -20.0679, -23.412498, 0, -20.0679, -20.0679, 0, -23.412498, -20.0679, 0, -20.0679, -20.0679, 0, -20.0679, -20.0679, 0, -23.412498, -16.7232, 0, -23.412498, -20.0679, 0, -23.412498, -16.7232, 0, -26.7572, -16.7232, 0, -23.412498, -20.0679, 0, -23.412498, -20.0679, 0, -26.7572, -16.7232, 0, -26.7572, -23.412498, 0, -20.0679, -23.412498, 0, -23.412498, -20.0679, 0, -23.412498, -23.412498, 0, -23.412498, -20.0679, 0, -26.7572, -20.0679, 0, -23.412498, -26.7572, 0, -20.0679, -23.412498, 0, -23.412498, -23.412498, 0, -20.0679, -23.412498, 0, -23.412498, -23.412498, 0, -26.7572, -20.0679, 0, -26.7572, -26.7572, 0, -20.0679, -26.7572, 0, -23.412498, -23.412498, 0, -23.412498, -26.7572, 0, -23.412498, -23.412498, 0, -26.7572, -23.412498, 0, -23.412498, -26.7572, 0, -23.412498, -26.7572, 0, -26.7572, -23.412498, 0, -26.7572, -23.412498, 0, -3.3446, -20.3764, 0, -6.6893, -20.0679, -0.3484, -3.5669, -23.412498, 0, -3.3446, -23.412498, 0, -6.6893, -20.3764, 0, -6.6893, 16.7232, 0, 10.033899, 20.0679, -0.124199994, 6.6893, 20.0679, 0, 10.033899, 16.7232, 0, 10.033899, 16.7232, 0, 6.6893, 20.0679, -0.124199994, 6.6893, 20.0679, 0, 10.033899, 23.412498, 0, 6.6893, 23.412498, 0, 10.033899, 20.0679, 0, 10.033899, 20.0679, -0.124199994, 6.6893, 23.412498, 0, 6.6893, -26.7572, 0, 3.3446, -23.412498, -0.2913, 0.26119998, -23.412498, 0, 3.3446, -26.7572, 0, 3.3446, -26.7572, 0, 0, -23.412498, -0.2913, 0.26119998, -26.7572, 0, 0, -23.412498, 0, -3.3446, -23.412498, -0.2913, 0.26119998, -26.7572, 0, 0, -26.7572, 0, -3.3446, -23.412498, 0, -3.3446, 0, 0, -13.3786, 3.0140998, 0, -16.7232, 3.3446, -0.3989, -12.9443, 0, 0, -13.3786, 0, 0, -16.7232, 3.0140998, 0, -16.7232, 0, 0, -10.7654, 3.3446, -0.3989, -12.9443, 2.8241, 0, -10.4594, 0, 0, -10.7654, 0, 0, -13.3786, 3.3446, -0.3989, -12.9443, 20.0679, -0.124199994, 6.6893, 23.412498, 0, 3.3446, 23.412498, 0, 6.6893, 20.0679, -0.124199994, 6.6893, 20.0679, 0, 3.3446, 23.412498, 0, 3.3446, 51.2184, -3.9413, -15.0508995, 54.072197, -3.9413, -13.3786, 51.2184, -3.9413, -13.3786, 51.2184, -3.9413, -13.3786, 54.072197, -3.9413, -13.3786, 54.072197, -3.9413, -11.7063, 51.2184, -3.9413, -15.0508995, 54.072197, -3.9413, -15.0508995, 54.072197, -3.9413, -13.3786, 51.2184, -3.9413, -13.3786, 54.072197, -3.9413, -11.7063, 51.2184, -3.9413, -11.7063, 51.2184, -3.9413, -11.7063, 54.072197, -3.9413, -11.7063, 54.072197, -3.9413, -10.033899, 48.3645, -3.9413, -15.0508995, 51.2184, -3.9413, -15.0508995, 51.2184, -3.9413, -13.3786, 51.2184, -3.9413, -11.7063, 54.072197, -3.9413, -10.033899, 51.2184, -3.9413, -10.033899, 51.2184, -3.9413, -10.033899, 54.072197, -3.9413, -10.033899, 54.072197, -3.9413, -8.3616, 48.3645, -3.9413, -13.3786, 51.2184, -3.9413, -13.3786, 51.2184, -3.9413, -11.7063, 48.3645, -3.9413, -15.0508995, 51.2184, -3.9413, -13.3786, 48.3645, -3.9413, -13.3786, 48.3645, -3.9413, -11.7063, 51.2184, -3.9413, -11.7063, 51.2184, -3.9413, -10.033899, 48.3645, -3.9413, -13.3786, 51.2184, -3.9413, -11.7063, 48.3645, -3.9413, -11.7063, 51.2184, -3.9413, -10.033899, 54.072197, -3.9413, -8.3616, 51.2184, -3.9413, -8.3616, 51.2184, -3.9413, -8.3616, 54.072197, -3.9413, -8.3616, 54.072197, -3.9413, -6.6893, 48.3645, -3.9413, -11.7063, 51.2184, -3.9413, -10.033899, 48.3645, -3.9413, -10.033899, 48.3645, -3.9413, -10.033899, 51.2184, -3.9413, -10.033899, 51.2184, -3.9413, -8.3616, 45.5107, -3.9413, -13.3786, 48.3645, -3.9413, -13.3786, 48.3645, -3.9413, -11.7063, 45.5107, -3.9413, -11.7063, 48.3645, -3.9413, -11.7063, 48.3645, -3.9413, -10.033899, 45.5107, -3.9413, -13.3786, 48.3645, -3.9413, -11.7063, 45.5107, -3.9413, -11.7063, 51.2184, -3.9413, -8.3616, 54.072197, -3.9413, -6.6893, 51.2184, -3.9413, -6.6893, 51.2184, -3.9413, -6.6893, 54.072197, -3.9413, -6.6893, 54.072197, -3.9413, -5.0169997, 48.3645, -3.9413, -10.033899, 51.2184, -3.9413, -8.3616, 48.3645, -3.9413, -8.3616, 48.3645, -3.9413, -8.3616, 51.2184, -3.9413, -8.3616, 51.2184, -3.9413, -6.6893, 45.5107, -3.9413, -11.7063, 48.3645, -3.9413, -10.033899, 45.5107, -3.9413, -10.033899, 45.5107, -3.9413, -10.033899, 48.3645, -3.9413, -10.033899, 48.3645, -3.9413, -8.3616, 51.2184, -3.9413, -6.6893, 54.072197, -3.9413, -5.0169997, 51.2184, -3.9413, -5.0169997, 51.2184, -3.9413, -5.0169997, 54.072197, -3.9413, -5.0169997, 54.072197, -3.9413, -3.3446, 48.3645, -3.9413, -8.3616, 51.2184, -3.9413, -6.6893, 48.3645, -3.9413, -6.6893, 48.3645, -3.9413, -6.6893, 51.2184, -3.9413, -6.6893, 51.2184, -3.9413, -5.0169997, 45.5107, -3.9413, -10.033899, 48.3645, -3.9413, -8.3616, 45.5107, -3.9413, -8.3616, 45.5107, -3.9413, -8.3616, 48.3645, -3.9413, -8.3616, 48.3645, -3.9413, -6.6893, 51.2184, -3.9413, -5.0169997, 54.072197, -3.9413, -3.3446, 51.2184, -3.9413, -3.3446, 51.2184, -3.9413, -3.3446, 54.072197, -3.9413, -3.3446, 54.072197, -3.9413, -1.6723, 48.3645, -3.9413, -6.6893, 51.2184, -3.9413, -5.0169997, 48.3645, -3.9413, -5.0169997, 48.3645, -3.9413, -5.0169997, 51.2184, -3.9413, -5.0169997, 51.2184, -3.9413, -3.3446, 45.5107, -3.9413, -8.3616, 48.3645, -3.9413, -6.6893, 45.5107, -3.9413, -6.6893, 45.5107, -3.9413, -6.6893, 48.3645, -3.9413, -6.6893, 48.3645, -3.9413, -5.0169997, 51.2184, -3.9413, -3.3446, 54.072197, -3.9413, -1.6723, 51.2184, -3.9413, -1.6723, 51.2184, -3.9413, -1.6723, 54.072197, -3.9413, -1.6723, 54.072197, -3.9413, 0, 48.3645, -3.9413, -5.0169997, 51.2184, -3.9413, -3.3446, 48.3645, -3.9413, -3.3446, 48.3645, -3.9413, -3.3446, 51.2184, -3.9413, -3.3446, 51.2184, -3.9413, -1.6723, 45.5107, -3.9413, -6.6893, 48.3645, -3.9413, -5.0169997, 45.5107, -3.9413, -5.0169997, 45.5107, -3.9413, -5.0169997, 48.3645, -3.9413, -5.0169997, 48.3645, -3.9413, -3.3446, 51.2184, -3.9413, -1.6723, 54.072197, -3.9413, 0, 51.2184, -3.9413, 0, 51.2184, -3.9413, 0, 54.072197, -3.9413, 0, 54.072197, -3.9413, 1.6723, 48.3645, -3.9413, -3.3446, 51.2184, -3.9413, -1.6723, 48.3645, -3.9413, -1.6723, 48.3645, -3.9413, -1.6723, 51.2184, -3.9413, -1.6723, 51.2184, -3.9413, 0, 45.5107, -3.9413, -5.0169997, 48.3645, -3.9413, -3.3446, 45.5107, -3.9413, -3.3446, 45.5107, -3.9413, -3.3446, 48.3645, -3.9413, -3.3446, 48.3645, -3.9413, -1.6723, 51.2184, -3.9413, 0, 54.072197, -3.9413, 1.6723, 51.2184, -3.9413, 1.6723, 51.2184, -3.9413, 1.6723, 54.072197, -3.9413, 1.6723, 54.072197, -3.9413, 3.3446, 48.3645, -3.9413, -1.6723, 51.2184, -3.9413, 0, 48.3645, -3.9413, 0, 48.3645, -3.9413, 0, 51.2184, -3.9413, 0, 51.2184, -3.9413, 1.6723, 45.5107, -3.9413, -3.3446, 48.3645, -3.9413, -1.6723, 45.5107, -3.9413, -1.6723, 45.5107, -3.9413, -1.6723, 48.3645, -3.9413, -1.6723, 48.3645, -3.9413, 0, 51.2184, -3.9413, 1.6723, 54.072197, -3.9413, 3.3446, 51.2184, -3.9413, 3.3446, 51.2184, -3.9413, 3.3446, 54.072197, -3.9413, 3.3446, 54.072197, -3.9413, 5.0169997, 48.3645, -3.9413, 0, 51.2184, -3.9413, 1.6723, 48.3645, -3.9413, 1.6723, 48.3645, -3.9413, 1.6723, 51.2184, -3.9413, 1.6723, 51.2184, -3.9413, 3.3446, 45.5107, -3.9413, -1.6723, 48.3645, -3.9413, 0, 45.5107, -3.9413, 0, 45.5107, -3.9413, 0, 48.3645, -3.9413, 0, 48.3645, -3.9413, 1.6723, 51.2184, -3.9413, 3.3446, 54.072197, -3.9413, 5.0169997, 51.2184, -3.9413, 5.0169997, 51.2184, -3.9413, 5.0169997, 54.072197, -3.9413, 5.0169997, 54.072197, -3.9413, 6.6893, 48.3645, -3.9413, 1.6723, 51.2184, -3.9413, 3.3446, 48.3645, -3.9413, 3.3446, 48.3645, -3.9413, 3.3446, 51.2184, -3.9413, 3.3446, 51.2184, -3.9413, 5.0169997, 45.5107, -3.9413, 0, 48.3645, -3.9413, 1.6723, 45.5107, -3.9413, 1.6723, 45.5107, -3.9413, 1.6723, 48.3645, -3.9413, 1.6723, 48.3645, -3.9413, 3.3446, 51.2184, -3.9413, 5.0169997, 54.072197, -3.9413, 6.6893, 51.2184, -3.9413, 6.6893, 51.2184, -3.9413, 6.6893, 54.072197, -3.9413, 6.6893, 54.072197, -3.9413, 8.3616, 48.3645, -3.9413, 3.3446, 51.2184, -3.9413, 5.0169997, 48.3645, -3.9413, 5.0169997, 48.3645, -3.9413, 5.0169997, 51.2184, -3.9413, 5.0169997, 51.2184, -3.9413, 6.6893, 45.5107, -3.9413, 1.6723, 48.3645, -3.9413, 3.3446, 45.5107, -3.9413, 3.3446, 45.5107, -3.9413, 3.3446, 48.3645, -3.9413, 3.3446, 48.3645, -3.9413, 5.0169997, 51.2184, -3.9413, 6.6893, 54.072197, -3.9413, 8.3616, 51.2184, -3.9413, 8.3616, 51.2184, -3.9413, 8.3616, 54.072197, -3.9413, 8.3616, 54.072197, -3.9413, 10.033899, 48.3645, -3.9413, 5.0169997, 51.2184, -3.9413, 6.6893, 48.3645, -3.9413, 6.6893, 48.3645, -3.9413, 6.6893, 51.2184, -3.9413, 6.6893, 51.2184, -3.9413, 8.3616, 45.5107, -3.9413, 3.3446, 48.3645, -3.9413, 5.0169997, 45.5107, -3.9413, 5.0169997, 45.5107, -3.9413, 5.0169997, 48.3645, -3.9413, 5.0169997, 48.3645, -3.9413, 6.6893, 51.2184, -3.9413, 8.3616, 54.072197, -3.9413, 10.033899, 51.2184, -3.9413, 10.033899, 51.2184, -3.9413, 10.033899, 54.072197, -3.9413, 10.033899, 54.072197, -3.9413, 11.7063, 48.3645, -3.9413, 6.6893, 51.2184, -3.9413, 8.3616, 48.3645, -3.9413, 8.3616, 48.3645, -3.9413, 8.3616, 51.2184, -3.9413, 8.3616, 51.2184, -3.9413, 10.033899, 45.5107, -3.9413, 5.0169997, 48.3645, -3.9413, 6.6893, 45.5107, -3.9413, 6.6893, 45.5107, -3.9413, 6.6893, 48.3645, -3.9413, 6.6893, 48.3645, -3.9413, 8.3616, 51.2184, -3.9413, 10.033899, 54.072197, -3.9413, 11.7063, 51.2184, -3.9413, 11.7063, 51.2184, -3.9413, 11.7063, 54.072197, -3.9413, 11.7063, 54.072197, -3.9413, 13.3786, 48.3645, -3.9413, 8.3616, 51.2184, -3.9413, 10.033899, 48.3645, -3.9413, 10.033899, 48.3645, -3.9413, 10.033899, 51.2184, -3.9413, 10.033899, 51.2184, -3.9413, 11.7063, 45.5107, -3.9413, 6.6893, 48.3645, -3.9413, 8.3616, 45.5107, -3.9413, 8.3616, 45.5107, -3.9413, 8.3616, 48.3645, -3.9413, 8.3616, 48.3645, -3.9413, 10.033899, 51.2184, -3.9413, 11.7063, 54.072197, -3.9413, 13.3786, 51.2184, -3.9413, 13.3786, 51.2184, -3.9413, 13.3786, 54.072197, -3.9413, 13.3786, 54.072197, -3.9413, 15.0508995, 48.3645, -3.9413, 10.033899, 51.2184, -3.9413, 11.7063, 48.3645, -3.9413, 11.7063, 48.3645, -3.9413, 11.7063, 51.2184, -3.9413, 11.7063, 51.2184, -3.9413, 13.3786, 45.5107, -3.9413, 8.3616, 48.3645, -3.9413, 10.033899, 45.5107, -3.9413, 10.033899, 45.5107, -3.9413, 10.033899, 48.3645, -3.9413, 10.033899, 48.3645, -3.9413, 11.7063, 51.2184, -3.9413, 13.3786, 54.072197, -3.9413, 15.0508995, 51.2184, -3.9413, 15.0508995, 51.2184, -3.9413, 15.0508995, 54.072197, -3.9413, 15.0508995, 54.072197, -3.9413, 16.7232, 48.3645, -3.9413, 11.7063, 51.2184, -3.9413, 13.3786, 48.3645, -3.9413, 13.3786, 48.3645, -3.9413, 13.3786, 51.2184, -3.9413, 13.3786, 51.2184, -3.9413, 15.0508995, 45.5107, -3.9413, 10.033899, 48.3645, -3.9413, 11.7063, 45.5107, -3.9413, 11.7063, 45.5107, -3.9413, 11.7063, 48.3645, -3.9413, 11.7063, 48.3645, -3.9413, 13.3786, 51.2184, -3.9413, 15.0508995, 54.072197, -3.9413, 16.7232, 51.2184, -3.9413, 16.7232, 51.2184, -3.9413, 16.7232, 54.072197, -3.9413, 16.7232, 54.072197, -3.9413, 18.3955, 48.3645, -3.9413, 13.3786, 51.2184, -3.9413, 15.0508995, 48.3645, -3.9413, 15.0508995, 48.3645, -3.9413, 15.0508995, 51.2184, -3.9413, 15.0508995, 51.2184, -3.9413, 16.7232, 45.5107, -3.9413, 11.7063, 48.3645, -3.9413, 13.3786, 45.5107, -3.9413, 13.3786, 45.5107, -3.9413, 13.3786, 48.3645, -3.9413, 13.3786, 48.3645, -3.9413, 15.0508995, 51.2184, -3.9413, 16.7232, 54.072197, -3.9413, 18.3955, 51.2184, -3.9413, 18.3955, 51.2184, -3.9413, 18.3955, 54.072197, -3.9413, 18.3955, 54.072197, -3.9413, 20.0679, 48.3645, -3.9413, 15.0508995, 51.2184, -3.9413, 16.7232, 48.3645, -3.9413, 16.7232, 48.3645, -3.9413, 16.7232, 51.2184, -3.9413, 16.7232, 51.2184, -3.9413, 18.3955, 45.5107, -3.9413, 13.3786, 48.3645, -3.9413, 15.0508995, 45.5107, -3.9413, 15.0508995, 45.5107, -3.9413, 15.0508995, 48.3645, -3.9413, 15.0508995, 48.3645, -3.9413, 16.7232, 51.2184, -3.9413, 18.3955, 54.072197, -3.9413, 20.0679, 51.2184, -3.9413, 20.0679, 51.2184, -3.9413, 20.0679, 54.072197, -3.9413, 20.0679, 54.072197, -3.9413, 21.7402, 48.3645, -3.9413, 16.7232, 51.2184, -3.9413, 18.3955, 48.3645, -3.9413, 18.3955, 48.3645, -3.9413, 18.3955, 51.2184, -3.9413, 18.3955, 51.2184, -3.9413, 20.0679, 45.5107, -3.9413, 15.0508995, 48.3645, -3.9413, 16.7232, 45.5107, -3.9413, 16.7232, 45.5107, -3.9413, 16.7232, 48.3645, -3.9413, 16.7232, 48.3645, -3.9413, 18.3955, 51.2184, -3.9413, 20.0679, 54.072197, -3.9413, 21.7402, 51.2184, -3.9413, 21.7402, 51.2184, -3.9413, 21.7402, 54.072197, -3.9413, 21.7402, 54.072197, -3.9413, 23.412498, 48.3645, -3.9413, 18.3955, 51.2184, -3.9413, 20.0679, 48.3645, -3.9413, 20.0679, 48.3645, -3.9413, 20.0679, 51.2184, -3.9413, 20.0679, 51.2184, -3.9413, 21.7402, 45.5107, -3.9413, 16.7232, 48.3645, -3.9413, 18.3955, 45.5107, -3.9413, 18.3955, 45.5107, -3.9413, 18.3955, 48.3645, -3.9413, 18.3955, 48.3645, -3.9413, 20.0679, 51.2184, -3.9413, 21.7402, 54.072197, -3.9413, 23.412498, 51.2184, -3.9413, 23.412498, 51.2184, -3.9413, 23.412498, 54.072197, -3.9413, 23.412498, 54.072197, -3.9413, 25.084799, 48.3645, -3.9413, 20.0679, 51.2184, -3.9413, 21.7402, 48.3645, -3.9413, 21.7402, 48.3645, -3.9413, 21.7402, 51.2184, -3.9413, 21.7402, 51.2184, -3.9413, 23.412498, 45.5107, -3.9413, 18.3955, 48.3645, -3.9413, 20.0679, 45.5107, -3.9413, 20.0679, 45.5107, -3.9413, 20.0679, 48.3645, -3.9413, 20.0679, 48.3645, -3.9413, 21.7402, 51.2184, -3.9413, 23.412498, 54.072197, -3.9413, 25.084799, 51.2184, -3.9413, 25.084799, 51.2184, -3.9413, 25.084799, 54.072197, -3.9413, 25.084799, 54.072197, -3.9413, 26.7572, 51.2184, -3.9413, 25.084799, 54.072197, -3.9413, 26.7572, 51.2184, -3.9413, 26.7572, 48.3645, -3.9413, 23.412498, 51.2184, -3.9413, 23.412498, 51.2184, -3.9413, 25.084799, 48.3645, -3.9413, 21.7402, 51.2184, -3.9413, 23.412498, 48.3645, -3.9413, 23.412498, 48.3645, -3.9413, 25.084799, 51.2184, -3.9413, 25.084799, 51.2184, -3.9413, 26.7572, 48.3645, -3.9413, 23.412498, 51.2184, -3.9413, 25.084799, 48.3645, -3.9413, 25.084799, 48.3645, -3.9413, 25.084799, 51.2184, -3.9413, 26.7572, 48.3645, -3.9413, 26.7572, 45.5107, -3.9413, 21.7402, 48.3645, -3.9413, 21.7402, 48.3645, -3.9413, 23.412498, 45.5107, -3.9413, 20.0679, 48.3645, -3.9413, 21.7402, 45.5107, -3.9413, 21.7402, 45.5107, -3.9413, 23.412498, 48.3645, -3.9413, 23.412498, 48.3645, -3.9413, 25.084799, 45.5107, -3.9413, 21.7402, 48.3645, -3.9413, 23.412498, 45.5107, -3.9413, 23.412498, 45.5107, -3.9413, 25.084799, 48.3645, -3.9413, 25.084799, 48.3645, -3.9413, 26.7572, 45.5107, -3.9413, 23.412498, 48.3645, -3.9413, 25.084799, 45.5107, -3.9413, 25.084799, 45.5107, -3.9413, 25.084799, 48.3645, -3.9413, 26.7572, 45.5107, -3.9413, 26.7572, 42.6568, -3.9413, 25.084799, 45.5107, -3.9413, 25.084799, 45.5107, -3.9413, 26.7572, 42.6568, -3.9413, 25.084799, 45.5107, -3.9413, 26.7572, 42.6568, -3.9413, 26.7572, 39.7973, -3.9413, 25.084799, 42.6568, -3.9413, 25.084799, 42.6568, -3.9413, 26.7572, 39.7973, -3.9413, 25.084799, 42.6568, -3.9413, 26.7572, 39.7973, -3.9413, 26.7572, 39.7973, -3.9413, 23.412498, 42.6568, -3.9413, 25.084799, 39.7973, -3.9413, 25.084799, 42.6568, -3.9413, 23.412498, 45.5107, -3.9413, 25.084799, 42.6568, -3.9413, 25.084799, 39.7973, -3.9413, 23.412498, 42.6568, -3.9413, 23.412498, 42.6568, -3.9413, 25.084799, 42.6568, -3.9413, 23.412498, 45.5107, -3.9413, 23.412498, 45.5107, -3.9413, 25.084799, 39.7973, -3.9413, 21.7402, 42.6568, -3.9413, 23.412498, 39.7973, -3.9413, 23.412498, 42.6568, -3.9413, 21.7402, 45.5107, -3.9413, 23.412498, 42.6568, -3.9413, 23.412498, 39.7973, -3.9413, 21.7402, 42.6568, -3.9413, 21.7402, 42.6568, -3.9413, 23.412498, 42.6568, -3.9413, 21.7402, 45.5107, -3.9413, 21.7402, 45.5107, -3.9413, 23.412498, 39.7973, -3.9413, 20.0679, 42.6568, -3.9413, 21.7402, 39.7973, -3.9413, 21.7402, 42.6568, -3.9413, 20.0679, 45.5107, -3.9413, 21.7402, 42.6568, -3.9413, 21.7402, 39.7973, -3.9413, 20.0679, 42.6568, -3.9413, 20.0679, 42.6568, -3.9413, 21.7402, 42.6568, -3.9413, 20.0679, 45.5107, -3.9413, 20.0679, 45.5107, -3.9413, 21.7402, 39.7973, -3.9413, 18.3955, 42.6568, -3.9413, 20.0679, 39.7973, -3.9413, 20.0679, 42.6568, -3.9413, 18.3955, 45.5107, -3.9413, 20.0679, 42.6568, -3.9413, 20.0679, 39.7973, -3.9413, 18.3955, 42.6568, -3.9413, 18.3955, 42.6568, -3.9413, 20.0679, 42.6568, -3.9413, 18.3955, 45.5107, -3.9413, 18.3955, 45.5107, -3.9413, 20.0679, 39.7973, -3.9413, 16.7232, 42.6568, -3.9413, 18.3955, 39.7973, -3.9413, 18.3955, 42.6568, -3.9413, 16.7232, 45.5107, -3.9413, 18.3955, 42.6568, -3.9413, 18.3955, 39.7973, -3.9413, 16.7232, 42.6568, -3.9413, 16.7232, 42.6568, -3.9413, 18.3955, 42.6568, -3.9413, 16.7232, 45.5107, -3.9413, 16.7232, 45.5107, -3.9413, 18.3955, 39.7973, -3.9413, 15.0508995, 42.6568, -3.9413, 16.7232, 39.7973, -3.9413, 16.7232, 42.6568, -3.9413, 15.0508995, 45.5107, -3.9413, 16.7232, 42.6568, -3.9413, 16.7232, 39.7973, -3.9413, 15.0508995, 42.6568, -3.9413, 15.0508995, 42.6568, -3.9413, 16.7232, 42.6568, -3.9413, 15.0508995, 45.5107, -3.9413, 15.0508995, 45.5107, -3.9413, 16.7232, 39.7973, -3.9413, 13.3786, 42.6568, -3.9413, 15.0508995, 39.7973, -3.9413, 15.0508995, 42.6568, -3.9413, 13.3786, 45.5107, -3.9413, 15.0508995, 42.6568, -3.9413, 15.0508995, 39.7973, -3.9413, 13.3786, 42.6568, -3.9413, 13.3786, 42.6568, -3.9413, 15.0508995, 42.6568, -3.9413, 13.3786, 45.5107, -3.9413, 13.3786, 45.5107, -3.9413, 15.0508995, 39.7973, -3.9413, 11.7063, 42.6568, -3.9413, 13.3786, 39.7973, -3.9413, 13.3786, 42.6568, -3.9413, 11.7063, 45.5107, -3.9413, 13.3786, 42.6568, -3.9413, 13.3786, 39.7973, -3.9413, 11.7063, 42.6568, -3.9413, 11.7063, 42.6568, -3.9413, 13.3786, 42.6568, -3.9413, 11.7063, 45.5107, -3.9413, 11.7063, 45.5107, -3.9413, 13.3786, 39.7973, -3.9413, 10.033899, 42.6568, -3.9413, 11.7063, 39.7973, -3.9413, 11.7063, 42.6568, -3.9413, 10.033899, 45.5107, -3.9413, 11.7063, 42.6568, -3.9413, 11.7063, 39.7973, -3.9413, 10.033899, 42.6568, -3.9413, 10.033899, 42.6568, -3.9413, 11.7063, 42.6568, -3.9413, 10.033899, 45.5107, -3.9413, 10.033899, 45.5107, -3.9413, 11.7063, 39.7973, -3.9413, 8.3616, 42.6568, -3.9413, 10.033899, 39.7973, -3.9413, 10.033899, 42.6568, -3.9413, 8.3616, 45.5107, -3.9413, 10.033899, 42.6568, -3.9413, 10.033899, 39.7973, -3.9413, 8.3616, 42.6568, -3.9413, 8.3616, 42.6568, -3.9413, 10.033899, 42.6568, -3.9413, 8.3616, 45.5107, -3.9413, 8.3616, 45.5107, -3.9413, 10.033899, 39.7973, -3.9413, 6.6893, 42.6568, -3.9413, 8.3616, 39.7973, -3.9413, 8.3616, 42.6568, -3.9413, 6.6893, 45.5107, -3.9413, 8.3616, 42.6568, -3.9413, 8.3616, 39.7973, -3.9413, 6.6893, 42.6568, -3.9413, 6.6893, 42.6568, -3.9413, 8.3616, 42.6568, -3.9413, 6.6893, 45.5107, -3.9413, 6.6893, 45.5107, -3.9413, 8.3616, 39.7973, -3.9413, 5.0169997, 42.6568, -3.9413, 6.6893, 39.7973, -3.9413, 6.6893, 42.6568, -3.9413, 5.0169997, 45.5107, -3.9413, 6.6893, 42.6568, -3.9413, 6.6893, 39.7973, -3.9413, 5.0169997, 42.6568, -3.9413, 5.0169997, 42.6568, -3.9413, 6.6893, 42.6568, -3.9413, 5.0169997, 45.5107, -3.9413, 5.0169997, 45.5107, -3.9413, 6.6893, 39.7973, -3.9413, 3.3446, 42.6568, -3.9413, 5.0169997, 39.7973, -3.9413, 5.0169997, 42.6568, -3.9413, 3.3446, 45.5107, -3.9413, 5.0169997, 42.6568, -3.9413, 5.0169997, 39.7973, -3.9413, 3.3446, 42.6568, -3.9413, 3.3446, 42.6568, -3.9413, 5.0169997, 42.6568, -3.9413, 3.3446, 45.5107, -3.9413, 3.3446, 45.5107, -3.9413, 5.0169997, 39.7973, -3.9413, 1.6723, 42.6568, -3.9413, 3.3446, 39.7973, -3.9413, 3.3446, 42.6568, -3.9413, 1.6723, 45.5107, -3.9413, 3.3446, 42.6568, -3.9413, 3.3446, 39.7973, -3.9413, 1.6723, 42.6568, -3.9413, 1.6723, 42.6568, -3.9413, 3.3446, 42.6568, -3.9413, 1.6723, 45.5107, -3.9413, 1.6723, 45.5107, -3.9413, 3.3446, 39.7973, -3.9413, 0, 42.6568, -3.9413, 1.6723, 39.7973, -3.9413, 1.6723, 42.6568, -3.9413, 0, 45.5107, -3.9413, 1.6723, 42.6568, -3.9413, 1.6723, 39.7973, -3.9413, 0, 42.6568, -3.9413, 0, 42.6568, -3.9413, 1.6723, 42.6568, -3.9413, 0, 45.5107, -3.9413, 0, 45.5107, -3.9413, 1.6723, 39.7973, -3.9413, -1.6723, 42.6568, -3.9413, 0, 39.7973, -3.9413, 0, 42.6568, -3.9413, -1.6723, 45.5107, -3.9413, 0, 42.6568, -3.9413, 0, 39.7973, -3.9413, -1.6723, 42.6568, -3.9413, -1.6723, 42.6568, -3.9413, 0, 42.6568, -3.9413, -1.6723, 45.5107, -3.9413, -1.6723, 45.5107, -3.9413, 0, 39.7973, -3.9413, -3.3446, 42.6568, -3.9413, -1.6723, 39.7973, -3.9413, -1.6723, 42.6568, -3.9413, -3.3446, 45.5107, -3.9413, -1.6723, 42.6568, -3.9413, -1.6723, 39.7973, -3.9413, -3.3446, 42.6568, -3.9413, -3.3446, 42.6568, -3.9413, -1.6723, 42.6568, -3.9413, -3.3446, 45.5107, -3.9413, -3.3446, 45.5107, -3.9413, -1.6723, 39.7973, -3.9413, -5.0169997, 42.6568, -3.9413, -3.3446, 39.7973, -3.9413, -3.3446, 42.6568, -3.9413, -5.0169997, 45.5107, -3.9413, -3.3446, 42.6568, -3.9413, -3.3446, 39.7973, -3.9413, -5.0169997, 42.6568, -3.9413, -5.0169997, 42.6568, -3.9413, -3.3446, 42.6568, -3.9413, -5.0169997, 45.5107, -3.9413, -5.0169997, 45.5107, -3.9413, -3.3446, 39.7973, -3.9413, -6.6893, 42.6568, -3.9413, -5.0169997, 39.7973, -3.9413, -5.0169997, 42.6568, -3.9413, -6.6893, 45.5107, -3.9413, -5.0169997, 42.6568, -3.9413, -5.0169997, 39.7973, -3.9413, -6.6893, 42.6568, -3.9413, -6.6893, 42.6568, -3.9413, -5.0169997, 42.6568, -3.9413, -6.6893, 45.5107, -3.9413, -6.6893, 45.5107, -3.9413, -5.0169997, 39.7973, -3.9413, -8.3616, 42.6568, -3.9413, -6.6893, 39.7973, -3.9413, -6.6893, 42.6568, -3.9413, -8.3616, 45.5107, -3.9413, -6.6893, 42.6568, -3.9413, -6.6893, 39.7973, -3.9413, -8.3616, 42.6568, -3.9413, -8.3616, 42.6568, -3.9413, -6.6893, 42.6568, -3.9413, -8.3616, 45.5107, -3.9413, -8.3616, 45.5107, -3.9413, -6.6893, 39.7973, -3.9413, -10.033899, 42.6568, -3.9413, -8.3616, 39.7973, -3.9413, -8.3616, 42.6568, -3.9413, -10.033899, 45.5107, -3.9413, -8.3616, 42.6568, -3.9413, -8.3616, 39.7973, -3.9413, -10.033899, 42.6568, -3.9413, -10.033899, 42.6568, -3.9413, -8.3616, 42.6568, -3.9413, -10.033899, 45.5107, -3.9413, -10.033899, 45.5107, -3.9413, -8.3616, 39.7973, -3.9413, -11.7063, 42.6568, -3.9413, -10.033899, 39.7973, -3.9413, -10.033899, 42.6568, -3.9413, -11.7063, 45.5107, -3.9413, -10.033899, 42.6568, -3.9413, -10.033899, 39.7973, -3.9413, -11.7063, 42.6568, -3.9413, -11.7063, 42.6568, -3.9413, -10.033899, 42.6568, -3.9413, -11.7063, 45.5107, -3.9413, -11.7063, 45.5107, -3.9413, -10.033899, 39.7973, -3.9413, -13.3786, 42.6568, -3.9413, -11.7063, 39.7973, -3.9413, -11.7063, 42.6568, -3.9413, -13.3786, 45.5107, -3.9413, -11.7063, 42.6568, -3.9413, -11.7063, 39.7973, -3.9413, -13.3786, 42.6568, -3.9413, -13.3786, 42.6568, -3.9413, -11.7063, 42.6568, -3.9413, -13.3786, 45.5107, -3.9413, -13.3786, 45.5107, -3.9413, -11.7063, 39.7973, -3.9413, -15.0508995, 42.6568, -3.9413, -13.3786, 39.7973, -3.9413, -13.3786, 39.7973, -3.9413, -15.0508995, 42.6568, -3.9413, -15.0508995, 42.6568, -3.9413, -13.3786, 42.6568, -3.9413, -15.0508995, 45.5107, -3.9413, -13.3786, 42.6568, -3.9413, -13.3786, 39.7973, -3.9413, -16.7232, 42.6568, -3.9413, -15.0508995, 39.7973, -3.9413, -15.0508995, 42.6568, -3.9413, -15.0508995, 45.5107, -3.9413, -15.0508995, 45.5107, -3.9413, -13.3786, 45.5107, -3.9413, -15.0508995, 48.3645, -3.9413, -13.3786, 45.5107, -3.9413, -13.3786, 39.7973, -3.9413, -16.7232, 42.6568, -3.9413, -16.7232, 42.6568, -3.9413, -15.0508995, 42.6568, -3.9413, -16.7232, 45.5107, -3.9413, -15.0508995, 42.6568, -3.9413, -15.0508995, 39.7973, -3.9413, -18.3955, 42.6568, -3.9413, -16.7232, 39.7973, -3.9413, -16.7232, 45.5107, -3.9413, -15.0508995, 48.3645, -3.9413, -15.0508995, 48.3645, -3.9413, -13.3786, 39.7973, -3.9413, -18.3955, 42.6568, -3.9413, -18.3955, 42.6568, -3.9413, -16.7232, 42.6568, -3.9413, -16.7232, 45.5107, -3.9413, -16.7232, 45.5107, -3.9413, -15.0508995, 45.5107, -3.9413, -16.7232, 48.3645, -3.9413, -15.0508995, 45.5107, -3.9413, -15.0508995, 42.6568, -3.9413, -18.3955, 45.5107, -3.9413, -16.7232, 42.6568, -3.9413, -16.7232, 39.7973, -3.9413, -20.0679, 42.6568, -3.9413, -18.3955, 39.7973, -3.9413, -18.3955, 45.5107, -3.9413, -16.7232, 48.3645, -3.9413, -16.7232, 48.3645, -3.9413, -15.0508995, 48.3645, -3.9413, -16.7232, 51.2184, -3.9413, -15.0508995, 48.3645, -3.9413, -15.0508995, 42.6568, -3.9413, -18.3955, 45.5107, -3.9413, -18.3955, 45.5107, -3.9413, -16.7232, 45.5107, -3.9413, -18.3955, 48.3645, -3.9413, -16.7232, 45.5107, -3.9413, -16.7232, 39.7973, -3.9413, -20.0679, 42.6568, -3.9413, -20.0679, 42.6568, -3.9413, -18.3955, 42.6568, -3.9413, -20.0679, 45.5107, -3.9413, -18.3955, 42.6568, -3.9413, -18.3955, 39.7973, -3.9413, -21.7402, 42.6568, -3.9413, -20.0679, 39.7973, -3.9413, -20.0679, 48.3645, -3.9413, -16.7232, 51.2184, -3.9413, -16.7232, 51.2184, -3.9413, -15.0508995, 51.2184, -3.9413, -16.7232, 54.072197, -3.9413, -15.0508995, 51.2184, -3.9413, -15.0508995, 51.2184, -3.9413, -16.7232, 54.072197, -3.9413, -16.7232, 54.072197, -3.9413, -15.0508995, 48.3645, -3.9413, -18.3955, 51.2184, -3.9413, -16.7232, 48.3645, -3.9413, -16.7232, 45.5107, -3.9413, -18.3955, 48.3645, -3.9413, -18.3955, 48.3645, -3.9413, -16.7232, 51.2184, -3.9413, -18.3955, 54.072197, -3.9413, -16.7232, 51.2184, -3.9413, -16.7232, 48.3645, -3.9413, -18.3955, 51.2184, -3.9413, -18.3955, 51.2184, -3.9413, -16.7232, 51.2184, -3.9413, -18.3955, 54.072197, -3.9413, -18.3955, 54.072197, -3.9413, -16.7232, 45.5107, -3.9413, -20.0679, 48.3645, -3.9413, -18.3955, 45.5107, -3.9413, -18.3955, 42.6568, -3.9413, -20.0679, 45.5107, -3.9413, -20.0679, 45.5107, -3.9413, -18.3955, 48.3645, -3.9413, -20.0679, 51.2184, -3.9413, -18.3955, 48.3645, -3.9413, -18.3955, 45.5107, -3.9413, -20.0679, 48.3645, -3.9413, -20.0679, 48.3645, -3.9413, -18.3955, 51.2184, -3.9413, -20.0679, 54.072197, -3.9413, -18.3955, 51.2184, -3.9413, -18.3955, 48.3645, -3.9413, -20.0679, 51.2184, -3.9413, -20.0679, 51.2184, -3.9413, -18.3955, 51.2184, -3.9413, -20.0679, 54.072197, -3.9413, -20.0679, 54.072197, -3.9413, -18.3955, 39.7973, -3.9413, -21.7402, 42.6568, -3.9413, -21.7402, 42.6568, -3.9413, -20.0679, 42.6568, -3.9413, -21.7402, 45.5107, -3.9413, -20.0679, 42.6568, -3.9413, -20.0679, 39.7973, -3.9413, -23.412498, 42.6568, -3.9413, -21.7402, 39.7973, -3.9413, -21.7402, 45.5107, -3.9413, -21.7402, 48.3645, -3.9413, -20.0679, 45.5107, -3.9413, -20.0679, 42.6568, -3.9413, -21.7402, 45.5107, -3.9413, -21.7402, 45.5107, -3.9413, -20.0679, 39.7973, -3.9413, -23.412498, 42.6568, -3.9413, -23.412498, 42.6568, -3.9413, -21.7402, 42.6568, -3.9413, -23.412498, 45.5107, -3.9413, -21.7402, 42.6568, -3.9413, -21.7402, 39.7973, -3.9413, -25.084799, 42.6568, -3.9413, -23.412498, 39.7973, -3.9413, -23.412498, 45.5107, -3.9413, -21.7402, 48.3645, -3.9413, -21.7402, 48.3645, -3.9413, -20.0679, 48.3645, -3.9413, -21.7402, 51.2184, -3.9413, -20.0679, 48.3645, -3.9413, -20.0679, 42.6568, -3.9413, -23.412498, 45.5107, -3.9413, -23.412498, 45.5107, -3.9413, -21.7402, 45.5107, -3.9413, -23.412498, 48.3645, -3.9413, -21.7402, 45.5107, -3.9413, -21.7402, 39.7973, -3.9413, -25.084799, 42.6568, -3.9413, -25.084799, 42.6568, -3.9413, -23.412498, 42.6568, -3.9413, -25.084799, 45.5107, -3.9413, -23.412498, 42.6568, -3.9413, -23.412498, 39.7973, -3.9413, -26.7572, 42.6568, -3.9413, -25.084799, 39.7973, -3.9413, -25.084799, 39.7973, -3.9413, -26.7572, 42.6568, -3.9413, -26.7572, 42.6568, -3.9413, -25.084799, 42.6568, -3.9413, -26.7572, 45.5107, -3.9413, -25.084799, 42.6568, -3.9413, -25.084799, 42.6568, -3.9413, -25.084799, 45.5107, -3.9413, -25.084799, 45.5107, -3.9413, -23.412498, 42.6568, -3.9413, -26.7572, 45.5107, -3.9413, -26.7572, 45.5107, -3.9413, -25.084799, 45.5107, -3.9413, -23.412498, 48.3645, -3.9413, -23.412498, 48.3645, -3.9413, -21.7402, 45.5107, -3.9413, -25.084799, 48.3645, -3.9413, -23.412498, 45.5107, -3.9413, -23.412498, 45.5107, -3.9413, -26.7572, 48.3645, -3.9413, -25.084799, 45.5107, -3.9413, -25.084799, 45.5107, -3.9413, -25.084799, 48.3645, -3.9413, -25.084799, 48.3645, -3.9413, -23.412498, 45.5107, -3.9413, -26.7572, 48.3645, -3.9413, -26.7572, 48.3645, -3.9413, -25.084799, 48.3645, -3.9413, -21.7402, 51.2184, -3.9413, -21.7402, 51.2184, -3.9413, -20.0679, 48.3645, -3.9413, -23.412498, 51.2184, -3.9413, -21.7402, 48.3645, -3.9413, -21.7402, 51.2184, -3.9413, -21.7402, 54.072197, -3.9413, -20.0679, 51.2184, -3.9413, -20.0679, 51.2184, -3.9413, -21.7402, 54.072197, -3.9413, -21.7402, 54.072197, -3.9413, -20.0679, 48.3645, -3.9413, -23.412498, 51.2184, -3.9413, -23.412498, 51.2184, -3.9413, -21.7402, 51.2184, -3.9413, -23.412498, 54.072197, -3.9413, -21.7402, 51.2184, -3.9413, -21.7402, 48.3645, -3.9413, -25.084799, 51.2184, -3.9413, -23.412498, 48.3645, -3.9413, -23.412498, 51.2184, -3.9413, -23.412498, 54.072197, -3.9413, -23.412498, 54.072197, -3.9413, -21.7402, 48.3645, -3.9413, -26.7572, 51.2184, -3.9413, -25.084799, 48.3645, -3.9413, -25.084799, 48.3645, -3.9413, -25.084799, 51.2184, -3.9413, -25.084799, 51.2184, -3.9413, -23.412498, 51.2184, -3.9413, -25.084799, 54.072197, -3.9413, -23.412498, 51.2184, -3.9413, -23.412498, 48.3645, -3.9413, -26.7572, 51.2184, -3.9413, -26.7572, 51.2184, -3.9413, -25.084799, 51.2184, -3.9413, -25.084799, 54.072197, -3.9413, -25.084799, 54.072197, -3.9413, -23.412498, 51.2184, -3.9413, -26.7572, 54.072197, -3.9413, -25.084799, 51.2184, -3.9413, -25.084799, 51.2184, -3.9413, -26.7572, 54.072197, -3.9413, -26.7572, 54.072197, -3.9413, -25.084799, 29.679499, -0.6044, -15.0508995, 32.4649, -1.1213, -13.3786, 29.679499, -0.6044, -13.3786, 29.679499, -0.6044, -13.3786, 32.4649, -1.1213, -13.3786, 32.4649, -1.1213, -11.7063, 29.679499, -0.6044, -15.0508995, 32.4649, -1.1213, -15.0508995, 32.4649, -1.1213, -13.3786, 29.679499, -0.6044, -13.3786, 32.4649, -1.1213, -11.7063, 29.679499, -0.6044, -11.7063, 29.679499, -0.6044, -16.7232, 32.4649, -1.1213, -15.0508995, 29.679499, -0.6044, -15.0508995, 29.679499, -0.6044, -11.7063, 32.4649, -1.1213, -11.7063, 32.4649, -1.1213, -10.033899, 29.679499, -0.6044, -16.7232, 32.4649, -1.1213, -16.7232, 32.4649, -1.1213, -15.0508995, 29.679499, -0.6044, -11.7063, 32.4649, -1.1213, -10.033899, 29.679499, -0.6044, -10.033899, 29.679499, -0.6044, -18.3955, 32.4649, -1.1213, -16.7232, 29.679499, -0.6044, -16.7232, 29.679499, -0.6044, -10.033899, 32.4649, -1.1213, -10.033899, 32.4649, -1.1213, -8.3616, 29.679499, -0.6044, -18.3955, 32.4649, -1.1213, -18.3955, 32.4649, -1.1213, -16.7232, 29.679499, -0.6044, -10.033899, 32.4649, -1.1213, -8.3616, 29.679499, -0.6044, -8.3616, 29.679499, -0.6044, -20.0679, 32.4649, -1.1213, -18.3955, 29.679499, -0.6044, -18.3955, 29.679499, -0.6044, -8.3616, 32.4649, -1.1213, -8.3616, 32.4649, -1.1213, -6.6893, 29.679499, -0.6044, -20.0679, 32.4649, -1.1213, -20.0679, 32.4649, -1.1213, -18.3955, 29.679499, -0.6044, -8.3616, 32.4649, -1.1213, -6.6893, 29.679499, -0.6044, -6.6893, 29.679499, -0.6044, -21.7402, 32.4649, -1.1213, -20.0679, 29.679499, -0.6044, -20.0679, 29.679499, -0.6044, -6.6893, 32.4649, -1.1213, -6.6893, 32.4649, -1.1213, -5.0169997, 29.679499, -0.6044, -21.7402, 32.4649, -1.1213, -21.7402, 32.4649, -1.1213, -20.0679, 29.679499, -0.6044, -6.6893, 32.4649, -1.1213, -5.0169997, 29.679499, -0.6044, -5.0169997, 29.679499, -0.6044, -23.412498, 32.4649, -1.1213, -21.7402, 29.679499, -0.6044, -21.7402, 29.679499, -0.6044, -5.0169997, 32.4649, -1.1213, -5.0169997, 32.4649, -1.1213, -3.3446, 29.679499, -0.6044, -23.412498, 32.4649, -1.1213, -23.412498, 32.4649, -1.1213, -21.7402, 29.679499, -0.6044, -5.0169997, 32.4649, -1.1213, -3.3446, 29.679499, -0.6044, -3.3446, 29.679499, -0.6044, -25.084799, 32.4649, -1.1213, -23.412498, 29.679499, -0.6044, -23.412498, 29.679499, -0.6044, -3.3446, 32.4649, -1.1213, -3.3446, 32.4649, -1.1213, -1.6723, 29.679499, -0.6044, -25.084799, 32.4649, -1.1213, -25.084799, 32.4649, -1.1213, -23.412498, 29.679499, -0.6044, -26.7572, 32.4649, -1.1213, -25.084799, 29.679499, -0.6044, -25.084799, 29.679499, -0.6044, -26.7572, 32.4649, -1.1213, -26.7572, 32.4649, -1.1213, -25.084799, 29.679499, -0.6044, -3.3446, 32.4649, -1.1213, -1.6723, 29.679499, -0.6044, -1.6723, 29.679499, -0.6044, -1.6723, 32.4649, -1.1213, -1.6723, 32.4649, -1.1213, 0, 29.679499, -0.6044, -1.6723, 32.4649, -1.1213, 0, 29.679499, -0.6044, 0, 29.679499, -0.6044, 0, 32.4649, -1.1213, 0, 32.4649, -1.1213, 1.6723, 29.679499, -0.6044, 0, 32.4649, -1.1213, 1.6723, 29.679499, -0.6044, 1.6723, 29.679499, -0.6044, 1.6723, 32.4649, -1.1213, 1.6723, 32.4649, -1.1213, 3.3446, 29.679499, -0.6044, 1.6723, 32.4649, -1.1213, 3.3446, 29.679499, -0.6044, 3.3446, 29.679499, -0.6044, 3.3446, 32.4649, -1.1213, 3.3446, 32.4649, -1.1213, 5.0169997, 29.679499, -0.6044, 3.3446, 32.4649, -1.1213, 5.0169997, 29.679499, -0.6044, 5.0169997, 29.679499, -0.6044, 5.0169997, 32.4649, -1.1213, 5.0169997, 32.4649, -1.1213, 6.6893, 29.679499, -0.6044, 5.0169997, 32.4649, -1.1213, 6.6893, 29.679499, -0.6044, 6.6893, 29.679499, -0.6044, 6.6893, 32.4649, -1.1213, 6.6893, 32.4649, -1.1213, 8.3616, 29.679499, -0.6044, 6.6893, 32.4649, -1.1213, 8.3616, 29.679499, -0.6044, 8.3616, 29.679499, -0.6044, 8.3616, 32.4649, -1.1213, 8.3616, 32.4649, -1.1213, 10.033899, 29.679499, -0.6044, 8.3616, 32.4649, -1.1213, 10.033899, 29.679499, -0.6044, 10.033899, 29.679499, -0.6044, 10.033899, 32.4649, -1.1213, 10.033899, 32.4649, -1.1213, 11.7063, 29.679499, -0.6044, 10.033899, 32.4649, -1.1213, 11.7063, 29.679499, -0.6044, 11.7063, 29.679499, -0.6044, 11.7063, 32.4649, -1.1213, 11.7063, 32.4649, -1.1213, 13.3786, 29.679499, -0.6044, 11.7063, 32.4649, -1.1213, 13.3786, 29.679499, -0.6044, 13.3786, 29.679499, -0.6044, 13.3786, 32.4649, -1.1213, 13.3786, 32.4649, -1.1213, 15.0508995, 29.679499, -0.6044, 13.3786, 32.4649, -1.1213, 15.0508995, 29.679499, -0.6044, 15.0508995, 29.679499, -0.6044, 15.0508995, 32.4649, -1.1213, 15.0508995, 32.4649, -1.1213, 16.7232, 29.679499, -0.6044, 15.0508995, 32.4649, -1.1213, 16.7232, 29.679499, -0.6044, 16.7232, 29.679499, -0.6044, 16.7232, 32.4649, -1.1213, 16.7232, 32.4649, -1.1213, 18.3955, 29.679499, -0.6044, 16.7232, 32.4649, -1.1213, 18.3955, 29.679499, -0.6044, 18.3955, 29.679499, -0.6044, 18.3955, 32.4649, -1.1213, 18.3955, 32.4649, -1.1213, 20.0679, 29.679499, -0.6044, 18.3955, 32.4649, -1.1213, 20.0679, 29.679499, -0.6044, 20.0679, 29.679499, -0.6044, 20.0679, 32.4649, -1.1213, 20.0679, 32.4649, -1.1213, 21.7402, 29.679499, -0.6044, 20.0679, 32.4649, -1.1213, 21.7402, 29.679499, -0.6044, 21.7402, 29.679499, -0.6044, 21.7402, 32.4649, -1.1213, 21.7402, 32.4649, -1.1213, 23.412498, 29.679499, -0.6044, 21.7402, 32.4649, -1.1213, 23.412498, 29.679499, -0.6044, 23.412498, 29.679499, -0.6044, 23.412498, 32.4649, -1.1213, 23.412498, 32.4649, -1.1213, 25.084799, 29.679499, -0.6044, 23.412498, 32.4649, -1.1213, 25.084799, 29.679499, -0.6044, 25.084799, 29.679499, -0.6044, 25.084799, 32.4649, -1.1213, 25.084799, 32.4649, -1.1213, 26.7572, 29.679499, -0.6044, 25.084799, 32.4649, -1.1213, 26.7572, 29.679499, -0.6044, 26.7572, 32.4649, -1.1213, -15.0508995, 39.7973, -3.9413, -13.3786, 32.4649, -1.1213, -13.3786, 32.4649, -1.1213, -13.3786, 39.7973, -3.9413, -13.3786, 39.7973, -3.9413, -11.7063, 32.4649, -1.1213, -15.0508995, 39.7973, -3.9413, -15.0508995, 39.7973, -3.9413, -13.3786, 32.4649, -1.1213, -13.3786, 39.7973, -3.9413, -11.7063, 32.4649, -1.1213, -11.7063, 32.4649, -1.1213, -16.7232, 39.7973, -3.9413, -15.0508995, 32.4649, -1.1213, -15.0508995, 32.4649, -1.1213, -11.7063, 39.7973, -3.9413, -11.7063, 39.7973, -3.9413, -10.033899, 32.4649, -1.1213, -16.7232, 39.7973, -3.9413, -16.7232, 39.7973, -3.9413, -15.0508995, 32.4649, -1.1213, -11.7063, 39.7973, -3.9413, -10.033899, 32.4649, -1.1213, -10.033899, 32.4649, -1.1213, -18.3955, 39.7973, -3.9413, -16.7232, 32.4649, -1.1213, -16.7232, 32.4649, -1.1213, -10.033899, 39.7973, -3.9413, -10.033899, 39.7973, -3.9413, -8.3616, 32.4649, -1.1213, -18.3955, 39.7973, -3.9413, -18.3955, 39.7973, -3.9413, -16.7232, 32.4649, -1.1213, -10.033899, 39.7973, -3.9413, -8.3616, 32.4649, -1.1213, -8.3616, 32.4649, -1.1213, -20.0679, 39.7973, -3.9413, -18.3955, 32.4649, -1.1213, -18.3955, 32.4649, -1.1213, -8.3616, 39.7973, -3.9413, -8.3616, 39.7973, -3.9413, -6.6893, 32.4649, -1.1213, -20.0679, 39.7973, -3.9413, -20.0679, 39.7973, -3.9413, -18.3955, 32.4649, -1.1213, -8.3616, 39.7973, -3.9413, -6.6893, 32.4649, -1.1213, -6.6893, 32.4649, -1.1213, -21.7402, 39.7973, -3.9413, -20.0679, 32.4649, -1.1213, -20.0679, 32.4649, -1.1213, -6.6893, 39.7973, -3.9413, -6.6893, 39.7973, -3.9413, -5.0169997, 32.4649, -1.1213, -21.7402, 39.7973, -3.9413, -21.7402, 39.7973, -3.9413, -20.0679, 32.4649, -1.1213, -6.6893, 39.7973, -3.9413, -5.0169997, 32.4649, -1.1213, -5.0169997, 32.4649, -1.1213, -23.412498, 39.7973, -3.9413, -21.7402, 32.4649, -1.1213, -21.7402, 32.4649, -1.1213, -5.0169997, 39.7973, -3.9413, -5.0169997, 39.7973, -3.9413, -3.3446, 32.4649, -1.1213, -23.412498, 39.7973, -3.9413, -23.412498, 39.7973, -3.9413, -21.7402, 32.4649, -1.1213, -5.0169997, 39.7973, -3.9413, -3.3446, 32.4649, -1.1213, -3.3446, 32.4649, -1.1213, -25.084799, 39.7973, -3.9413, -23.412498, 32.4649, -1.1213, -23.412498, 32.4649, -1.1213, -3.3446, 39.7973, -3.9413, -3.3446, 39.7973, -3.9413, -1.6723, 32.4649, -1.1213, -25.084799, 39.7973, -3.9413, -25.084799, 39.7973, -3.9413, -23.412498, 32.4649, -1.1213, -26.7572, 39.7973, -3.9413, -25.084799, 32.4649, -1.1213, -25.084799, 32.4649, -1.1213, -26.7572, 39.7973, -3.9413, -26.7572, 39.7973, -3.9413, -25.084799, 32.4649, -1.1213, -3.3446, 39.7973, -3.9413, -1.6723, 32.4649, -1.1213, -1.6723, 32.4649, -1.1213, -1.6723, 39.7973, -3.9413, -1.6723, 39.7973, -3.9413, 0, 32.4649, -1.1213, -1.6723, 39.7973, -3.9413, 0, 32.4649, -1.1213, 0, 32.4649, -1.1213, 0, 39.7973, -3.9413, 0, 39.7973, -3.9413, 1.6723, 32.4649, -1.1213, 0, 39.7973, -3.9413, 1.6723, 32.4649, -1.1213, 1.6723, 32.4649, -1.1213, 1.6723, 39.7973, -3.9413, 1.6723, 39.7973, -3.9413, 3.3446, 32.4649, -1.1213, 1.6723, 39.7973, -3.9413, 3.3446, 32.4649, -1.1213, 3.3446, 32.4649, -1.1213, 3.3446, 39.7973, -3.9413, 3.3446, 39.7973, -3.9413, 5.0169997, 32.4649, -1.1213, 3.3446, 39.7973, -3.9413, 5.0169997, 32.4649, -1.1213, 5.0169997, 32.4649, -1.1213, 5.0169997, 39.7973, -3.9413, 5.0169997, 39.7973, -3.9413, 6.6893, 32.4649, -1.1213, 5.0169997, 39.7973, -3.9413, 6.6893, 32.4649, -1.1213, 6.6893, 32.4649, -1.1213, 6.6893, 39.7973, -3.9413, 6.6893, 39.7973, -3.9413, 8.3616, 32.4649, -1.1213, 6.6893, 39.7973, -3.9413, 8.3616, 32.4649, -1.1213, 8.3616, 32.4649, -1.1213, 8.3616, 39.7973, -3.9413, 8.3616, 39.7973, -3.9413, 10.033899, 32.4649, -1.1213, 8.3616, 39.7973, -3.9413, 10.033899, 32.4649, -1.1213, 10.033899, 32.4649, -1.1213, 10.033899, 39.7973, -3.9413, 10.033899, 39.7973, -3.9413, 11.7063, 32.4649, -1.1213, 10.033899, 39.7973, -3.9413, 11.7063, 32.4649, -1.1213, 11.7063, 32.4649, -1.1213, 11.7063, 39.7973, -3.9413, 11.7063, 39.7973, -3.9413, 13.3786, 32.4649, -1.1213, 11.7063, 39.7973, -3.9413, 13.3786, 32.4649, -1.1213, 13.3786, 32.4649, -1.1213, 13.3786, 39.7973, -3.9413, 13.3786, 39.7973, -3.9413, 15.0508995, 32.4649, -1.1213, 13.3786, 39.7973, -3.9413, 15.0508995, 32.4649, -1.1213, 15.0508995, 32.4649, -1.1213, 15.0508995, 39.7973, -3.9413, 15.0508995, 39.7973, -3.9413, 16.7232, 32.4649, -1.1213, 15.0508995, 39.7973, -3.9413, 16.7232, 32.4649, -1.1213, 16.7232, 32.4649, -1.1213, 16.7232, 39.7973, -3.9413, 16.7232, 39.7973, -3.9413, 18.3955, 32.4649, -1.1213, 16.7232, 39.7973, -3.9413, 18.3955, 32.4649, -1.1213, 18.3955, 32.4649, -1.1213, 18.3955, 39.7973, -3.9413, 18.3955, 39.7973, -3.9413, 20.0679, 32.4649, -1.1213, 18.3955, 39.7973, -3.9413, 20.0679, 32.4649, -1.1213, 20.0679, 32.4649, -1.1213, 20.0679, 39.7973, -3.9413, 20.0679, 39.7973, -3.9413, 21.7402, 32.4649, -1.1213, 20.0679, 39.7973, -3.9413, 21.7402, 32.4649, -1.1213, 21.7402, 32.4649, -1.1213, 21.7402, 39.7973, -3.9413, 21.7402, 39.7973, -3.9413, 23.412498, 32.4649, -1.1213, 21.7402, 39.7973, -3.9413, 23.412498, 32.4649, -1.1213, 23.412498, 32.4649, -1.1213, 23.412498, 39.7973, -3.9413, 23.412498, 39.7973, -3.9413, 25.084799, 32.4649, -1.1213, 23.412498, 39.7973, -3.9413, 25.084799, 32.4649, -1.1213, 25.084799, 32.4649, -1.1213, 25.084799, 39.7973, -3.9413, 25.084799, 39.7973, -3.9413, 26.7572, 32.4649, -1.1213, 25.084799, 39.7973, -3.9413, 26.7572, 32.4649, -1.1213, 26.7572, 26.7572, -0.2593, 16.7232, 29.679499, -0.6044, 18.3955, 26.7572, -0.2593, 18.3955, 26.7572, -0.2593, 18.3955, 29.679499, -0.6044, 18.3955, 29.679499, -0.6044, 20.0679, 26.7572, -0.2593, 16.7232, 29.679499, -0.6044, 16.7232, 29.679499, -0.6044, 18.3955, 26.7572, -0.2593, 18.3955, 29.679499, -0.6044, 20.0679, 26.7572, -0.2593, 20.0679, 26.7572, -0.2593, 15.0508995, 29.679499, -0.6044, 16.7232, 26.7572, -0.2593, 16.7232, 26.7572, -0.2593, 20.0679, 29.679499, -0.6044, 20.0679, 29.679499, -0.6044, 21.7402, 26.7572, -0.2593, 15.0508995, 29.679499, -0.6044, 15.0508995, 29.679499, -0.6044, 16.7232, 26.7572, -0.2593, 20.0679, 29.679499, -0.6044, 21.7402, 26.7572, -0.2593, 21.7402, 26.7572, -0.2593, 13.3786, 29.679499, -0.6044, 15.0508995, 26.7572, -0.2593, 15.0508995, 26.7572, -0.2593, 21.7402, 29.679499, -0.6044, 21.7402, 29.679499, -0.6044, 23.412498, 26.7572, -0.2593, 13.3786, 29.679499, -0.6044, 13.3786, 29.679499, -0.6044, 15.0508995, 26.7572, -0.2593, 21.7402, 29.679499, -0.6044, 23.412498, 26.7572, -0.2593, 23.412498, 26.7572, -0.2593, 11.7063, 29.679499, -0.6044, 13.3786, 26.7572, -0.2593, 13.3786, 26.7572, -0.2593, 23.412498, 29.679499, -0.6044, 23.412498, 29.679499, -0.6044, 25.084799, 26.7572, -0.2593, 11.7063, 29.679499, -0.6044, 11.7063, 29.679499, -0.6044, 13.3786, 26.7572, -0.2593, 23.412498, 29.679499, -0.6044, 25.084799, 26.7572, -0.2593, 25.084799, 26.7572, -0.2593, 25.084799, 29.679499, -0.6044, 25.084799, 29.679499, -0.6044, 26.7572, 26.7572, -0.2593, 25.084799, 29.679499, -0.6044, 26.7572, 26.7572, -0.2593, 26.7572, 26.7572, -0.2593, 10.033899, 29.679499, -0.6044, 11.7063, 26.7572, -0.2593, 11.7063, 26.7572, -0.2593, 10.033899, 29.679499, -0.6044, 10.033899, 29.679499, -0.6044, 11.7063, 26.7572, -0.2593, 8.3616, 29.679499, -0.6044, 10.033899, 26.7572, -0.2593, 10.033899, 26.7572, -0.2593, 8.3616, 29.679499, -0.6044, 8.3616, 29.679499, -0.6044, 10.033899, 26.7572, -0.2593, 6.6893, 29.679499, -0.6044, 8.3616, 26.7572, -0.2593, 8.3616, 26.7572, -0.2593, 6.6893, 29.679499, -0.6044, 6.6893, 29.679499, -0.6044, 8.3616, 26.7572, -0.2593, 5.0169997, 29.679499, -0.6044, 6.6893, 26.7572, -0.2593, 6.6893, 26.7572, -0.2593, 5.0169997, 29.679499, -0.6044, 5.0169997, 29.679499, -0.6044, 6.6893, 26.7572, -0.2593, 3.3446, 29.679499, -0.6044, 5.0169997, 26.7572, -0.2593, 5.0169997, 26.7572, -0.2593, 3.3446, 29.679499, -0.6044, 3.3446, 29.679499, -0.6044, 5.0169997, 26.7572, -0.2593, 1.6723, 29.679499, -0.6044, 3.3446, 26.7572, -0.2593, 3.3446, 26.7572, -0.2593, 1.6723, 29.679499, -0.6044, 1.6723, 29.679499, -0.6044, 3.3446, 26.7572, -0.2593, 0, 29.679499, -0.6044, 1.6723, 26.7572, -0.2593, 1.6723, 26.7572, -0.2593, 0, 29.679499, -0.6044, 0, 29.679499, -0.6044, 1.6723, 26.7572, -0.2593, -1.6723, 29.679499, -0.6044, 0, 26.7572, -0.2593, 0, 26.7572, -0.2593, -1.6723, 29.679499, -0.6044, -1.6723, 29.679499, -0.6044, 0, 26.7572, -0.2593, -3.3446, 29.679499, -0.6044, -1.6723, 26.7572, -0.2593, -1.6723, 26.7572, -0.2593, -3.3446, 29.679499, -0.6044, -3.3446, 29.679499, -0.6044, -1.6723, 26.7572, -0.2593, -5.0169997, 29.679499, -0.6044, -3.3446, 26.7572, -0.2593, -3.3446, 26.7572, -0.2593, -5.0169997, 29.679499, -0.6044, -5.0169997, 29.679499, -0.6044, -3.3446, 26.7572, -0.2593, -6.6893, 29.679499, -0.6044, -5.0169997, 26.7572, -0.2593, -5.0169997, 26.7572, -0.2593, -6.6893, 29.679499, -0.6044, -6.6893, 29.679499, -0.6044, -5.0169997, 26.7572, -0.2593, -8.3616, 29.679499, -0.6044, -6.6893, 26.7572, -0.2593, -6.6893, 26.7572, -0.2593, -8.3616, 29.679499, -0.6044, -8.3616, 29.679499, -0.6044, -6.6893, 26.7572, -0.2593, -10.033899, 29.679499, -0.6044, -8.3616, 26.7572, -0.2593, -8.3616, 26.7572, -0.2593, -10.033899, 29.679499, -0.6044, -10.033899, 29.679499, -0.6044, -8.3616, 26.7572, -0.2593, -11.7063, 29.679499, -0.6044, -10.033899, 26.7572, -0.2593, -10.033899, 26.7572, -0.2593, -11.7063, 29.679499, -0.6044, -11.7063, 29.679499, -0.6044, -10.033899, 26.7572, -0.2593, -13.3786, 29.679499, -0.6044, -11.7063, 26.7572, -0.2593, -11.7063, 26.7572, -0.2593, -13.3786, 29.679499, -0.6044, -13.3786, 29.679499, -0.6044, -11.7063, 26.7572, -0.2593, -15.0508995, 29.679499, -0.6044, -13.3786, 26.7572, -0.2593, -13.3786, 26.7572, -0.2593, -15.0508995, 29.679499, -0.6044, -15.0508995, 29.679499, -0.6044, -13.3786, 26.7572, -0.2593, -16.7232, 29.679499, -0.6044, -15.0508995, 26.7572, -0.2593, -15.0508995, 26.7572, -0.2593, -16.7232, 29.679499, -0.6044, -16.7232, 29.679499, -0.6044, -15.0508995, 26.7572, -0.2593, -18.3955, 29.679499, -0.6044, -16.7232, 26.7572, -0.2593, -16.7232, 26.7572, -0.2593, -18.3955, 29.679499, -0.6044, -18.3955, 29.679499, -0.6044, -16.7232, 26.7572, -0.2593, -20.0679, 29.679499, -0.6044, -18.3955, 26.7572, -0.2593, -18.3955, 26.7572, -0.2593, -20.0679, 29.679499, -0.6044, -20.0679, 29.679499, -0.6044, -18.3955, 26.7572, -0.2593, -21.7402, 29.679499, -0.6044, -20.0679, 26.7572, -0.2593, -20.0679, 26.7572, -0.2593, -21.7402, 29.679499, -0.6044, -21.7402, 29.679499, -0.6044, -20.0679, 26.7572, -0.2593, -23.412498, 29.679499, -0.6044, -21.7402, 26.7572, -0.2593, -21.7402, 26.7572, -0.2593, -23.412498, 29.679499, -0.6044, -23.412498, 29.679499, -0.6044, -21.7402, 26.7572, -0.2593, -25.084799, 29.679499, -0.6044, -23.412498, 26.7572, -0.2593, -23.412498, 26.7572, -0.2593, -25.084799, 29.679499, -0.6044, -25.084799, 29.679499, -0.6044, -23.412498, 26.7572, -0.2593, -26.7572, 29.679499, -0.6044, -25.084799, 26.7572, -0.2593, -25.084799, 26.7572, -0.2593, -26.7572, 29.679499, -0.6044, -26.7572, 29.679499, -0.6044, -25.084799) @@ -288,3 +289,7 @@ transform = Transform3D(-0.9976046, 0, -0.06917416, 0, 1, 0, 0.06917416, 0, -0.9 [node name="PlayerStorageBox" parent="Interactables" instance=ExtResource("8_storage")] position = Vector3(-3.25, 3.42, 11.25) + +[node name="DecorShopWorld" parent="Interactables" instance=ExtResource("25_decor_shop")] +position = Vector3(-3.25, 3.42, 11.25) +rotation = Vector3(0, 1.5707964, 0) diff --git a/world/regions/world_region.gd b/world/regions/world_region.gd index 792e4ed..85f6e1b 100644 --- a/world/regions/world_region.gd +++ b/world/regions/world_region.gd @@ -18,6 +18,10 @@ func get_fishing_shop() -> FishingShopInteraction: return null +func get_decor_shop() -> DecorShopInteraction: + return null + + func get_player_storage() -> PlayerStorageInteraction: return null diff --git a/world/test_world.gd b/world/test_world.gd index 9f4da5e..1b0a813 100644 --- a/world/test_world.gd +++ b/world/test_world.gd @@ -7,6 +7,9 @@ const FishingShopInteractionType = preload( const PlayerStorageInteractionType = preload( "res://world/player_storage_interaction.gd" ) +const DecorShopInteractionType = preload( + "res://world/decor_shop_interaction.gd" +) const WorldLayoutType = preload("res://world/world_layout.gd") const GENERATED_REGION_SCENE: PackedScene = preload( "res://world/generation/generated_world_region.tscn" @@ -31,6 +34,7 @@ var _world_layout: StringName = WorldLayoutType.GENERATED var _world_seed: int = PlayerSaveManager.DEFAULT_WORLD_SEED var _light_performance_profile: bool = false var _dedicated_simulation: bool = false +var _local_home_interior_presentation_active: bool = false func get_player_water_triggers() -> Array[PlayerWaterTrigger]: @@ -67,6 +71,10 @@ func get_player_storage() -> PlayerStorageInteractionType: return _active_region.get_player_storage() +func get_decor_shop() -> DecorShopInteractionType: + return _active_region.get_decor_shop() + + func get_player_spawn_transform() -> Transform3D: return _active_region.get_player_spawn_transform() @@ -85,6 +93,12 @@ func set_light_performance_profile(enabled: bool) -> void: _active_region.set_light_performance_profile(enabled) +func set_local_home_interior_presentation_active(enabled: bool) -> void: + _local_home_interior_presentation_active = enabled + if _active_region != null and not _dedicated_simulation: + _active_region.visible = not enabled + + func set_dedicated_simulation(enabled: bool) -> void: _dedicated_simulation = enabled if _active_region != null: @@ -272,6 +286,8 @@ func _replace_active_region(layout: StringName, seed: int) -> bool: _active_region.set_light_performance_profile(_light_performance_profile) if _dedicated_simulation: _set_region_presentation_enabled(_active_region, false) + else: + _active_region.visible = not _local_home_interior_presentation_active return true From 983e4d0ec3cbd28b0bf26fdc62f9352d8e9d3da7 Mon Sep 17 00:00:00 2001 From: Voyager Date: Sun, 30 Aug 2026 22:00:04 -0400 Subject: [PATCH 11/37] Update validation for portable home protocol --- tests/fish_hotbar_showcase_validation.gd | 4 ++-- tests/fish_quality_validation.gd | 4 ++-- tests/world_spawn_protocol_validation.gd | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/fish_hotbar_showcase_validation.gd b/tests/fish_hotbar_showcase_validation.gd index 9f4623a..af3644b 100644 --- a/tests/fish_hotbar_showcase_validation.gd +++ b/tests/fish_hotbar_showcase_validation.gd @@ -200,8 +200,8 @@ func _run() -> void: var invalid_state: Dictionary = valid_state.duplicate(true) invalid_state["display_scale"] = 1000.0 assert(not NetworkFishShowcaseProtocol.validate_state(invalid_state)) - assert(NetworkProtocol.PROTOCOL_VERSION == 11) - assert(NetworkProtocol.ENET_CHANNEL_COUNT == 17) + assert(NetworkProtocol.PROTOCOL_VERSION == 12) + assert(NetworkProtocol.ENET_CHANNEL_COUNT == 18) assert( NetworkProtocol.FISH_QUALITY_CAPABILITY == "fish_quality_v1" diff --git a/tests/fish_quality_validation.gd b/tests/fish_quality_validation.gd index d8e482b..99a2169 100644 --- a/tests/fish_quality_validation.gd +++ b/tests/fish_quality_validation.gd @@ -26,8 +26,8 @@ func _run() -> void: _validate_collection_mastery() _validate_version_four_migration() _validate_fishing_protocol_v2() - assert(NetworkProtocol.PROTOCOL_VERSION == 11) - assert(NetworkProtocol.ENET_CHANNEL_COUNT == 17) + assert(NetworkProtocol.PROTOCOL_VERSION == 12) + assert(NetworkProtocol.ENET_CHANNEL_COUNT == 18) assert(NetworkProtocol.MOVEMENT_ANIMATION_CHANNEL == 11) assert( NetworkProtocol.MOVEMENT_RECONCILIATION_CAPABILITY diff --git a/tests/world_spawn_protocol_validation.gd b/tests/world_spawn_protocol_validation.gd index d100260..0840f2d 100644 --- a/tests/world_spawn_protocol_validation.gd +++ b/tests/world_spawn_protocol_validation.gd @@ -20,7 +20,7 @@ func _initialize() -> void: func _run() -> void: - assert(NetworkProtocol.PROTOCOL_VERSION == 11) + assert(NetworkProtocol.PROTOCOL_VERSION == 12) assert( NetworkWorldSpawnProtocol.CAPABILITY == NetworkProtocol.WORLD_SPAWN_CAPABILITY From d2dce7f9009d7ed8bab748e2a24a76c9ff8ba28b Mon Sep 17 00:00:00 2001 From: Voyager Date: Sun, 30 Aug 2026 22:32:27 -0400 Subject: [PATCH 12/37] Stabilize runtime validation under dynamic UI load --- main/texture_sampling_policy.gd | 17 +++++++++++++++-- tests/economy_regression_validation.gd | 18 ++++++++++++++---- tests/gathering_showcase_validation.gd | 10 +++++++--- tests/job_system_validation.gd | 6 +++++- tests/surface_drawing_runtime_validation.gd | 6 +++++- 5 files changed, 46 insertions(+), 11 deletions(-) diff --git a/main/texture_sampling_policy.gd b/main/texture_sampling_policy.gd index 822299c..35a92a0 100644 --- a/main/texture_sampling_policy.gd +++ b/main/texture_sampling_policy.gd @@ -15,8 +15,12 @@ func _enter_tree() -> void: func _on_node_added(node: Node) -> void: enforce_node(node) # Some runtime presenters assign their mesh or material immediately after - # add_child(). Recheck once deferred so those resources are covered too. - call_deferred("_enforce_deferred_node", weakref(node)) + # add_child(). Recheck those 3D resource owners once deferred so the newly + # assigned resources are covered too. CanvasItems keep their filter setting + # when their texture changes, so deferring every dynamic UI node only floods + # the message queue during large inventory and catalog refreshes. + if _needs_deferred_resource_check(node): + call_deferred("_enforce_deferred_node", weakref(node)) func _enforce_existing_tree() -> void: @@ -29,6 +33,15 @@ func _enforce_deferred_node(node_ref: WeakRef) -> void: enforce_node(node) +static func _needs_deferred_resource_check(node: Node) -> bool: + return ( + node is GeometryInstance3D + or node is MultiMeshInstance3D + or node is GPUParticles3D + or node is CPUParticles3D + ) + + static func enforce_subtree(node: Node) -> void: enforce_node(node) for child: Node in node.get_children(): diff --git a/tests/economy_regression_validation.gd b/tests/economy_regression_validation.gd index ec80d1b..ff82495 100644 --- a/tests/economy_regression_validation.gd +++ b/tests/economy_regression_validation.gd @@ -31,9 +31,14 @@ func _run() -> void: for _frame: int in 8: await process_frame assert(bool(main.get("_application_initialized"))) + var session := main.get_node("%NetworkSession") as NetworkSession + assert(bool(main.call( + "_apply_world", WorldLayout.STARTER_ISLAND, 1, true + ))) + assert(session.set_host_world(WorldLayout.STARTER_ISLAND, 1)) assert(bool(main.call("_prepare_private_host"))) var save_manager := main.get("_save_manager") as PlayerSaveManager - assert(save_manager.initialize_new_game()) + assert(save_manager.initialize_new_game(1, WorldLayout.STARTER_ISLAND)) main.call("_enter_gameplay") for _frame: int in 8: await process_frame @@ -42,7 +47,6 @@ func _run() -> void: var catalog := main.get("fish_catalog") as FishPool var sale_service := main.get_node("%NetworkSaleService") as NetworkSaleService var shop_service := main.get_node("%NetworkShopService") as NetworkShopService - var session := main.get_node("%NetworkSession") as NetworkSession var reservations := ( main.get_node("%PlayerAssetReservationService") as PlayerAssetReservationService @@ -554,7 +558,10 @@ func _test_host_backpack_purchase( for expected_capacity: int in [18, 27, 36]: _shop_result.clear() assert(not shop_service.request_backpack_capacity_upgrade().is_empty()) - assert(not _shop_result.is_empty() and bool(_shop_result[1])) + assert( + not _shop_result.is_empty() and bool(_shop_result[1]), + "Backpack purchase failed: %s" % [_shop_result], + ) assert(layout.get_inventory_capacity() == expected_capacity) assert(player.wallet.get_balance() == balance_before - total_cost) assert(layout.get_next_backpack_cost() == -1) @@ -575,7 +582,10 @@ func _test_host_storage_purchase( for expected_capacity: int in [18, 27, 36, 45, 54, 63, 72]: _shop_result.clear() assert(not shop_service.request_cooler_capacity_upgrade().is_empty()) - assert(not _shop_result.is_empty() and bool(_shop_result[1])) + assert( + not _shop_result.is_empty() and bool(_shop_result[1]), + "Cooler purchase failed: %s" % [_shop_result], + ) assert(capacity.get_capacity() == expected_capacity) assert(player.wallet.get_balance() == balance_before - total_cost) assert(capacity.get_next_cost() == -1) diff --git a/tests/gathering_showcase_validation.gd b/tests/gathering_showcase_validation.gd index 7099f7c..51d6f38 100644 --- a/tests/gathering_showcase_validation.gd +++ b/tests/gathering_showcase_validation.gd @@ -21,9 +21,13 @@ func _run() -> void: assert(bool(main.get("_application_initialized"))) var session := main.get_node("%NetworkSession") as NetworkSession + assert(bool(main.call( + "_apply_world", WorldLayout.STARTER_ISLAND, 1, true + ))) + assert(session.set_host_world(WorldLayout.STARTER_ISLAND, 1)) assert(session.start_private_host(TEST_PORT)) var save_manager := main.get("_save_manager") as PlayerSaveManager - assert(save_manager.initialize_new_game()) + assert(save_manager.initialize_new_game(1, WorldLayout.STARTER_ISLAND)) main.call("_enter_gameplay") for _frame: int in 8: await process_frame @@ -38,7 +42,7 @@ func _run() -> void: and game_ui != null and catalog != null ) - fishing_spot.minimum_showcase_duration = 0.15 + fishing_spot.minimum_showcase_duration = 1.0 assert(player.bag.add_item(&"crab_net")) assert(player.hotbar.assign_item(0, &"crab_net")) assert(player.hotbar.select_slot(0)) @@ -81,7 +85,7 @@ func _run() -> void: await process_frame assert(fishing_spot.get("_pending_catch") == crab_catch) Input.action_release("fish_primary") - await create_timer(0.2).timeout + fishing_spot.set("_showcase_input_lock_remaining", 0.0) await process_frame assert(bool(fishing_spot.get("_put_away_press_armed"))) Input.parse_input_event(pocket_event) diff --git a/tests/job_system_validation.gd b/tests/job_system_validation.gd index 89e46f6..65b7164 100644 --- a/tests/job_system_validation.gd +++ b/tests/job_system_validation.gd @@ -21,13 +21,17 @@ func _run() -> void: assert(bool(main.get("_application_initialized"))) var session := main.get_node("%NetworkSession") as NetworkSession assert(session != null) + assert(bool(main.call( + "_apply_world", WorldLayout.STARTER_ISLAND, 1, true + ))) + assert(session.set_host_world(WorldLayout.STARTER_ISLAND, 1)) var occupied_port := PacketPeerUDP.new() assert(occupied_port.bind(18137, "127.0.0.1") == OK) assert(session.start_private_host(18137, 3)) assert(session.get_host_port() == 18138) occupied_port.close() var save_manager := main.get("_save_manager") as PlayerSaveManager - assert(save_manager.initialize_new_game()) + assert(save_manager.initialize_new_game(1, WorldLayout.STARTER_ISLAND)) main.call("_enter_gameplay") await physics_frame await physics_frame diff --git a/tests/surface_drawing_runtime_validation.gd b/tests/surface_drawing_runtime_validation.gd index e04afc2..85110cd 100644 --- a/tests/surface_drawing_runtime_validation.gd +++ b/tests/surface_drawing_runtime_validation.gd @@ -20,9 +20,13 @@ func _run() -> void: await process_frame assert(bool(main.get("_application_initialized"))) var session := main.get_node("%NetworkSession") as NetworkSession + assert(bool(main.call( + "_apply_world", WorldLayout.STARTER_ISLAND, 1, true + ))) + assert(session.set_host_world(WorldLayout.STARTER_ISLAND, 1)) assert(session.start_private_host(TEST_PORT)) var save_manager := main.get("_save_manager") as PlayerSaveManager - assert(save_manager.initialize_new_game()) + assert(save_manager.initialize_new_game(1, WorldLayout.STARTER_ISLAND)) main.call("_enter_gameplay") await physics_frame await physics_frame From b48cb73f3aa2cc9f1948d709e0b426ba0b518702 Mon Sep 17 00:00:00 2001 From: Voyager Date: Sun, 30 Aug 2026 23:52:25 -0400 Subject: [PATCH 13/37] Harden multiplayer validation for portable homes --- scripts/run_validations.sh | 1 + tests/fishing_multiplayer_validation.gd | 172 ++++++++++++++++-- tests/late_join_multiplayer_validation.gd | 34 +++- tests/movement_multiplayer_validation.gd | 149 ++++++++++++--- .../surface_drawing_multiplayer_validation.gd | 74 +++++++- 5 files changed, 381 insertions(+), 49 deletions(-) diff --git a/scripts/run_validations.sh b/scripts/run_validations.sh index 5d15b8e..ff108a8 100755 --- a/scripts/run_validations.sh +++ b/scripts/run_validations.sh @@ -87,6 +87,7 @@ readonly -a NETWORK_TESTS=( "tests/fish_showcase_multiplayer_validation.gd" "tests/friend_multiplayer_validation.gd" "tests/fishing_multiplayer_validation.gd" + "tests/home_spawn_multiplayer_validation.gd" "tests/job_multiplayer_validation.gd" "tests/movement_multiplayer_validation.gd" "tests/operator_multiplayer_validation.gd" diff --git a/tests/fishing_multiplayer_validation.gd b/tests/fishing_multiplayer_validation.gd index 73de1bd..9d7ef7f 100644 --- a/tests/fishing_multiplayer_validation.gd +++ b/tests/fishing_multiplayer_validation.gd @@ -63,12 +63,38 @@ func _run_host() -> void: var spawn_service := main.get_node( "%PlayerSpawnService" ) as PlayerSpawnService + var network_home := main.get_node( + "%NetworkHomeService" + ) as NetworkHomeService + var home_world := main.get_node("%HomeWorldService") as HomeWorldService var remote_avatar: Player = spawn_service.get_avatar(remote_peer_id) assert(remote_avatar != null) assert(remote_avatar.bag.get_quantity(&"worms") == 0) - remote_avatar.global_position = Vector3(-0.5, 3.95, 2.1) - var remote_visuals := remote_avatar.get_node("Visuals") as Node3D - remote_visuals.rotation.y = PI * 0.5 + var remote_record := session.get_peer_record(remote_peer_id) + assert(remote_record != null) + assert(await _wait_for_home( + network_home, remote_record.identity_fingerprint + )) + var exterior_spawn: Transform3D = home_world.get_exterior_spawn_transform( + remote_record.identity_fingerprint + ) + var exterior_deadline: int = Time.get_ticks_msec() + 5000 + while ( + Time.get_ticks_msec() < exterior_deadline + and remote_avatar.global_position.distance_to(exterior_spawn.origin) > 0.25 + ): + await physics_frame + assert(remote_avatar.global_position.distance_to(exterior_spawn.origin) <= 0.25) + # Give the client enough local frames to observe the initial RV-door spawn + # before this test publishes its separate fishing-position teleport. + for _frame: int in 30: + await physics_frame + var cast_setup: Dictionary = await _find_clear_fishing_setup( + main, remote_avatar + ) + assert(not cast_setup.is_empty(), "no clear fishing setup was found") + var expected_position: Vector3 = cast_setup["position"] + var expected_direction: Vector3 = cast_setup["direction"] session.publish_authoritative_teleport(remote_peer_id) var aiming_deadline: int = Time.get_ticks_msec() + 15000 while ( @@ -82,7 +108,7 @@ func _run_host() -> void: == Player.FishingVisualPhase.CASTING ) var remote_position_error := ( - remote_avatar.global_position - Vector3(-0.5, 3.95, 2.1) + remote_avatar.global_position - expected_position ) remote_position_error.y = 0.0 assert( @@ -90,7 +116,7 @@ func _run_host() -> void: "remote casting position drifted: %s" % remote_avatar.global_position ) assert( - remote_avatar.get_facing_direction().dot(Vector3.LEFT) > 0.99, + remote_avatar.get_facing_direction().dot(expected_direction) > 0.99, "remote casting facing drifted: %s" % remote_avatar.get_facing_direction() ) @@ -196,6 +222,23 @@ func _run_client() -> void: joined = true break assert(joined) + var network_home := main.get_node( + "%NetworkHomeService" + ) as NetworkHomeService + var home_world := main.get_node("%HomeWorldService") as HomeWorldService + var local_fingerprint: String = session.get_local_identity_fingerprint() + assert(await _wait_for_home(network_home, local_fingerprint)) + var player := main.get("_player") as Player + var exterior_spawn: Transform3D = ( + home_world.get_exterior_spawn_transform(local_fingerprint) + ) + var home_spawn_deadline: int = Time.get_ticks_msec() + 5000 + while ( + Time.get_ticks_msec() < home_spawn_deadline + and player.global_position.distance_to(exterior_spawn.origin) > 0.25 + ): + await physics_frame + assert(player.global_position.distance_to(exterior_spawn.origin) <= 0.25) var service := main.get_node( "%NetworkFishingService" @@ -206,7 +249,6 @@ func _run_client() -> void: cast_rejections.append(message) ) var fishing_spot := main.get_node("%FishingSpot") as FishingSpotType - var player := main.get("_player") as Player var item_catalog := main.get("item_catalog") as ItemCatalog var worms: ItemData = item_catalog.get_item_by_id(&"worms") if player.bag.get_quantity(&"worms") == 0: @@ -217,15 +259,20 @@ func _run_client() -> void: "Visuals/CharacterRig/AnimationPlayer" ) as AnimationPlayer assert(character_animation_player.has_animation(&"retract_sit")) - var placement_deadline: int = Time.get_ticks_msec() + 5000 + # The host chooses and publishes a clear target after both RV manifests have + # settled. Waiting for that authoritative teleport also coordinates the + # animation-observation window between these two independent processes. + var placement_deadline: int = Time.get_ticks_msec() + 10000 while ( Time.get_ticks_msec() < placement_deadline - and player.global_position.distance_to(Vector3(-0.5, 3.95, 2.1)) - > 0.25 + and player.global_position.distance_to(exterior_spawn.origin) <= 1.0 ): await physics_frame - assert(player.global_position.distance_to(Vector3(-0.5, 3.95, 2.1)) <= 0.25) - assert(player.get_facing_direction().dot(Vector3.LEFT) > 0.99) + assert(player.global_position.distance_to(exterior_spawn.origin) > 1.0) + for _frame: int in 2: + await physics_frame + var expected_position: Vector3 = player.global_position + var expected_direction: Vector3 = player.get_facing_direction() player.set_casting_visual() assert( @@ -241,7 +288,10 @@ func _run_client() -> void: assert(player.is_sitting()) for _frame: int in 15: await physics_frame + assert(fishing_spot.state == FishingSpotType.FishingState.READY) + assert(fishing_spot.get("_active_player") == null) fishing_spot.call("_begin_aiming", player) + assert(fishing_spot.state == FishingSpotType.FishingState.AIMING_CAST) assert(player.is_movement_enabled()) assert( int(player.get("_fishing_visual_phase")) @@ -250,6 +300,7 @@ func _run_client() -> void: var cast_charge: float = 0.0 var target: Vector3 = Vector3.ZERO var cast_origin: Vector3 = fishing_spot.get("_cast_origin_position") + var target_diagnostics: Array[String] = [] for charge_step: int in range(1, 21): var candidate_charge := float(charge_step) / 20.0 fishing_spot.set("_cast_charge", candidate_charge) @@ -258,14 +309,33 @@ func _run_client() -> void: var candidate_surface := fishing_spot.get( "_aim_surface_sample" ) as FishingSurfaceSample + target_diagnostics.append( + "charge=%.2f surface=%s path=%s target=%s" % [ + candidate_charge, + candidate_surface.is_fishable(), + fishing_spot.get("_cast_path_is_clear"), + candidate_target, + ] + ) if ( candidate_surface.is_fishable() - and fishing_spot.is_cast_path_clear(cast_origin, candidate_target) + and bool(fishing_spot.get("_cast_path_is_clear")) ): cast_charge = candidate_charge target = candidate_target break - assert(cast_charge > 0.0, "no clear fishable test target was found") + assert( + cast_charge > 0.0, + ( + "no clear fishable test target was found; position=%s facing=%s " + + "expected=%s diagnostics=%s" + ) % [ + player.global_position, + player.get_facing_direction(), + expected_direction, + target_diagnostics, + ], + ) var evidence: Dictionary = fishing_spot.call("_build_network_evidence") fishing_spot.set("state", FishingSpotType.FishingState.CASTING) player.set_movement_enabled(false) @@ -388,3 +458,79 @@ func _create_initialized_main() -> Node: await process_frame assert(bool(main.get("_application_initialized"))) return main + + +func _wait_for_home( + network_home: NetworkHomeService, + fingerprint: String, +) -> bool: + var deadline: int = Time.get_ticks_msec() + 10000 + while Time.get_ticks_msec() < deadline: + await process_frame + var manifests: Dictionary = network_home.get( + "_manifests_by_fingerprint" + ) + if manifests.has(fingerprint): + return true + return false + + +func _find_clear_fishing_setup(main: Node, player: Player) -> Dictionary: + var world := main.get_node("TestWorld") as TestWorld + var fishing_spot := main.get_node("%FishingSpot") as FishingSpotType + var regions: Array[FishableWaterRegion] = world.get_fishable_water_regions() + for region: FishableWaterRegion in regions: + var body := region.get_parent() as WaterBodyAuthoring + if body == null or body.surface_size.x <= 0.0 or body.surface_size.y <= 0.0: + continue + var center: Vector3 = region.global_position + var half_size: Vector2 = body.surface_size * 0.5 + var candidate_offsets: Array[Vector3] = [ + Vector3(half_size.x + 0.8, 0.0, 0.0), + Vector3(-half_size.x - 0.8, 0.0, 0.0), + Vector3(0.0, 0.0, half_size.y + 0.8), + Vector3(0.0, 0.0, -half_size.y - 0.8), + ] + for offset: Vector3 in candidate_offsets: + var position := Vector3( + center.x + offset.x, + region.get_surface_height() + 1.44, + center.z + offset.z, + ) + var direction: Vector3 = center - position + direction.y = 0.0 + direction = direction.normalized() + player.global_position = position + var visuals := player.get_node("Visuals") as Node3D + visuals.global_rotation.y = atan2(-direction.x, -direction.z) + for _frame: int in 2: + await physics_frame + var cast_origin: Vector3 = player.get_cast_origin_position() + var launch_position: Vector3 = player.get_fishing_rod_tip().global_position + for charge_step: int in range(1, 21): + var cast_charge := float(charge_step) / 20.0 + var cast_distance := lerpf( + fishing_spot.minimum_cast_distance, + fishing_spot.maximum_cast_distance, + cast_charge, + ) + var query_position := cast_origin + direction * cast_distance + var sample: FishingSurfaceSample = ( + fishing_spot.resolve_fishing_surface( + query_position, cast_origin.y + ) + ) + var target: Vector3 = sample.get_bobber_position( + fishing_spot.solid_bobber_clearance + ) + if ( + sample.is_fishable() + and fishing_spot.is_cast_path_clear( + launch_position, target + ) + ): + return { + "position": player.global_position, + "direction": direction, + } + return {} diff --git a/tests/late_join_multiplayer_validation.gd b/tests/late_join_multiplayer_validation.gd index 3813486..6ea544f 100644 --- a/tests/late_join_multiplayer_validation.gd +++ b/tests/late_join_multiplayer_validation.gd @@ -90,11 +90,12 @@ func _run_first_client() -> void: player.toggle_sitting() assert(player.is_sitting()) assert(player.bag.add_item(&"crab_net")) - assert(player.hotbar.assign_item(0, &"crab_net")) - assert(player.hotbar.select_slot(0)) - for _frame: int in 2: - await process_frame - assert(bool(player.get("_active_item_is_net"))) + # Slot zero begins selected with the starter rod. Replacing that slot does + # not emit a selection change, so use the next slot to exercise the same + # equipped-item path a player uses in normal gameplay. + assert(player.hotbar.assign_item(1, &"crab_net")) + assert(player.hotbar.select_slot(1)) + assert(await _wait_for_local_net(main, player)) assert(player.begin_animation_action(ACTIVE_ACTION)) await create_timer(0.5).timeout assert(StringName(str(player.get("_animation_action_id"))) == ACTIVE_ACTION) @@ -185,6 +186,29 @@ func _wait_for_registry_size(session: NetworkSession, expected: int) -> bool: return false +func _wait_for_local_net(main: Node, player: Player) -> bool: + var deadline: int = Time.get_ticks_msec() + 10000 + while Time.get_ticks_msec() < deadline: + # A joined client can finish its world transition one frame after the + # hotbar selection signal. Refresh through the production path until the + # ready fishing state accepts the equipped item. + main.call("_refresh_active_hotbar_item") + await process_frame + if bool(player.get("_active_item_is_net")): + return true + var fishing_spot: Node = main.get_node("%FishingSpot") + print( + "net equip wait timed out: ", + { + "fishing_state": int(fishing_spot.get("state")), + "selected_slot": player.hotbar.get_selected_slot(), + "selected_item": String(player.hotbar.get_selected_item_id()), + "owns_net": player.bag.owns_item(&"crab_net"), + }, + ) + return false + + func _history_contains(service: NetworkChatService, body: String) -> bool: return service.get_history().any( func(message: Dictionary) -> bool: diff --git a/tests/movement_multiplayer_validation.gd b/tests/movement_multiplayer_validation.gd index 7073bea..05a668d 100644 --- a/tests/movement_multiplayer_validation.gd +++ b/tests/movement_multiplayer_validation.gd @@ -593,15 +593,22 @@ func _run_host() -> void: var main: Node = await _create_initialized_main() var session := main.get_node("%NetworkSession") as NetworkSession var save_manager := main.get("_save_manager") as PlayerSaveManager - assert(session.set_host_world( + assert(bool(main.call( + "_apply_world", WorldLayout.STARTER_ISLAND, NetworkProtocol.DEFAULT_WORLD_SEED, - )) - assert(session.start_private_host(TEST_PORT)) + true, + ))) + assert(bool(main.call( + "_prepare_host_world", + WorldLayout.STARTER_ISLAND, + NetworkProtocol.DEFAULT_WORLD_SEED, + ))) assert(save_manager.initialize_new_game( NetworkProtocol.DEFAULT_WORLD_SEED, WorldLayout.STARTER_ISLAND, )) + assert(session.start_private_host(TEST_PORT)) main.call("_enter_gameplay") for _frame: int in 4: await physics_frame @@ -613,31 +620,40 @@ func _run_host() -> void: # to settle before emitting the one-shot locomotion/action sequence. await create_timer(3.0).timeout var player := main.get("_player") as Player + var world := main.get_node("TestWorld") as TestWorld player.configure_network_remote(true) - player.apply_authoritative_network_input(_movement_input(1, true)) - await create_timer(2.5).timeout - player.apply_authoritative_network_input(_movement_input(2, false)) - await create_timer(2.5).timeout - player.apply_authoritative_network_input( - _movement_input(3, false, true, true) + await _reset_locomotion_test_position(player, session, world) + var input_sequence: int = 1 + input_sequence = await _sustain_locomotion_input( + player, input_sequence, 1.5, true ) - await create_timer(2.0).timeout - player.apply_authoritative_network_input( - _movement_input(4, false, false, true) + await _reset_locomotion_test_position(player, session, world) + input_sequence = await _sustain_locomotion_input( + player, input_sequence, 1.5, false ) - await create_timer(2.0).timeout - player.apply_authoritative_network_input( - _movement_input(5, false, false, true, &"draw", 1) + await _reset_locomotion_test_position(player, session, world) + input_sequence = await _sustain_locomotion_input( + player, input_sequence, 1.5, false, true, true ) + input_sequence = await _sustain_locomotion_input( + player, input_sequence, 1.5, false, false, true + ) + player.apply_authoritative_network_input( + _movement_input(input_sequence, false, false, true, &"draw", 1) + ) + input_sequence += 1 await create_timer(1.0).timeout player.apply_authoritative_network_input( - _movement_input(6, false, false, true, &"strike", 2, true) + _movement_input( + input_sequence, false, false, true, &"strike", 2, true + ) ) + input_sequence += 1 await create_timer(2.0).timeout player.apply_authoritative_network_input( - _movement_input(7, false, false, false, &"", 3) + _movement_input(input_sequence, false, false, false, &"", 3) ) - var disconnect_deadline: int = Time.get_ticks_msec() + 8000 + var disconnect_deadline: int = Time.get_ticks_msec() + 15000 while ( Time.get_ticks_msec() < disconnect_deadline and session.is_authenticated_peer(remote_peer_id) @@ -686,12 +702,27 @@ func _run_client() -> void: var saw_net_strike_paused: bool = false var saw_animation_advance: bool = false var saw_dust: bool = false + var observed_animations: Dictionary = {} + var observed_locomotion_states: Dictionary = {} + var maximum_sneak_speed: float = 0.0 var previous_animation: StringName = &"" var previous_animation_position: float = -1.0 - var observation_deadline: int = Time.get_ticks_msec() + 18000 + var observation_deadline: int = Time.get_ticks_msec() + 22000 while Time.get_ticks_msec() < observation_deadline: await process_frame var current_animation: StringName = animation_player.current_animation + observed_animations[current_animation] = true + var target_locomotion_state: int = int(host_avatar.get( + "_network_target_locomotion_state" + )) + observed_locomotion_states[target_locomotion_state] = true + if target_locomotion_state == Player.LocomotionState.SNEAKING: + maximum_sneak_speed = maxf( + maximum_sneak_speed, + Vector2( + host_avatar.velocity.x, host_avatar.velocity.z + ).length(), + ) saw_running = saw_running or current_animation.begins_with("running") saw_walking = saw_walking or current_animation.begins_with("walking") saw_sneaking = saw_sneaking or current_animation == &"sneaking" @@ -732,15 +763,44 @@ func _run_client() -> void: and saw_dust ): break - assert(saw_running) - assert(saw_walking) - assert(saw_sneaking) - assert(saw_idle_sneak) - assert(saw_net_draw) - assert(saw_net_strike) - assert(saw_net_strike_paused) - assert(saw_animation_advance) - assert(saw_dust) + var missing_observations: Array[String] = [] + if not saw_running: + missing_observations.append("running") + if not saw_walking: + missing_observations.append("walking") + if not saw_sneaking: + missing_observations.append("sneaking") + if not saw_idle_sneak: + missing_observations.append("idle_sneak") + if not saw_net_draw: + missing_observations.append("net_draw") + if not saw_net_strike: + missing_observations.append("net_strike") + if not saw_net_strike_paused: + missing_observations.append("net_strike_paused") + if not saw_animation_advance: + missing_observations.append("animation_advance") + if not saw_dust: + missing_observations.append("sprint_dust") + if not missing_observations.is_empty(): + push_error( + ( + "Missing movement observations %s; observed animations: %s; " + + "locomotion states: %s; maximum sneak speed: %.3f" + ) % [ + missing_observations, + observed_animations.keys(), + observed_locomotion_states.keys(), + maximum_sneak_speed, + ] + ) + session.disconnect_session("") + main.queue_free() + for _frame: int in 4: + await process_frame + await create_timer(0.1).timeout + quit(1) + return print("Movement multiplayer client validation: PASS") session.disconnect_session("") main.queue_free() @@ -778,6 +838,39 @@ func _movement_input( } +func _sustain_locomotion_input( + player: Player, + starting_sequence: int, + duration_seconds: float, + sprinting: bool, + moving: bool = true, + sneaking: bool = false, +) -> int: + var sequence: int = starting_sequence + var deadline: int = ( + Time.get_ticks_msec() + roundi(duration_seconds * 1000.0) + ) + while Time.get_ticks_msec() < deadline: + player.apply_authoritative_network_input( + _movement_input(sequence, sprinting, moving, sneaking) + ) + sequence += 1 + await create_timer(0.1).timeout + return sequence + + +func _reset_locomotion_test_position( + player: Player, + session: NetworkSession, + world: TestWorld, +) -> void: + player.velocity = Vector3.ZERO + player.global_transform = world.get_player_spawn_transform() + session.publish_authoritative_teleport(1) + for _frame: int in 4: + await physics_frame + + func _create_initialized_main() -> Node: root.size = Vector2i(1280, 720) var main: Node = MainScene.instantiate() diff --git a/tests/surface_drawing_multiplayer_validation.gd b/tests/surface_drawing_multiplayer_validation.gd index d0508b2..f79700e 100644 --- a/tests/surface_drawing_multiplayer_validation.gd +++ b/tests/surface_drawing_multiplayer_validation.gd @@ -27,10 +27,12 @@ func _run_host() -> void: assert(bool(main.call( "_apply_world", WorldLayout.STARTER_ISLAND, 1, true ))) - assert(session.set_host_world(WorldLayout.STARTER_ISLAND, 1)) - assert(session.start_private_host(TEST_PORT)) + assert(bool(main.call( + "_prepare_host_world", WorldLayout.STARTER_ISLAND, 1 + ))) var save_manager := main.get("_save_manager") as PlayerSaveManager - assert(save_manager.initialize_new_game()) + assert(save_manager.initialize_new_game(1, WorldLayout.STARTER_ISLAND)) + assert(session.start_private_host(TEST_PORT)) main.call("_enter_gameplay") await physics_frame await physics_frame @@ -62,6 +64,40 @@ func _run_host() -> void: remote_peer_id ) assert(remote_record != null) + var network_home := main.get_node( + "%NetworkHomeService" + ) as NetworkHomeService + var home_world := main.get_node("%HomeWorldService") as HomeWorldService + var spawn_service := main.get_node( + "%PlayerSpawnService" + ) as PlayerSpawnService + assert(await _wait_for_home( + network_home, remote_record.identity_fingerprint + )) + var remote_avatar: Player = spawn_service.get_avatar(remote_peer_id) + assert(remote_avatar != null) + var exterior_spawn: Transform3D = home_world.get_exterior_spawn_transform( + remote_record.identity_fingerprint + ) + var exterior_deadline: int = Time.get_ticks_msec() + 5000 + while ( + Time.get_ticks_msec() < exterior_deadline + and remote_avatar.global_position.distance_to(exterior_spawn.origin) > 0.25 + ): + await physics_frame + assert(remote_avatar.global_position.distance_to(exterior_spawn.origin) <= 0.25) + var canvas_state: Dictionary = service.get_canvas_state(canvas_id) + var canvas_origin: Vector3 = SurfaceDrawingProtocol.array_to_vector( + canvas_state["origin"] + ) + remote_avatar.global_position = Vector3( + canvas_origin.x + 1.0, + player.global_position.y, + canvas_origin.z, + ) + session.publish_authoritative_teleport(remote_peer_id) + for _frame: int in 4: + await physics_frame assert(session.peer_supports_capability( remote_peer_id, SurfaceDrawingProtocol.CAPABILITY )) @@ -152,6 +188,9 @@ func _run_host() -> void: ): await process_frame assert(service.get_canvas_ids().size() == 1) + # Keep the second stamp observable on the client before the ban removes all + # artwork carrying that participant fingerprint. + await create_timer(1.0).timeout var player_list := main.get_node( "%NetworkPlayerListService" ) as NetworkPlayerListService @@ -221,6 +260,20 @@ func _run_client() -> void: var canvas_id: String = service.get_canvas_ids()[0] var snapshot: Dictionary = service.get_canvas_state(canvas_id) assert(str(_find_cell(snapshot, 7, 7).get("color_id", "")) == "coral") + var canvas_origin: Vector3 = SurfaceDrawingProtocol.array_to_vector( + snapshot["origin"] + ) + var placement_deadline: int = Time.get_ticks_msec() + 10000 + while ( + Time.get_ticks_msec() < placement_deadline + and player.global_position.distance_to(canvas_origin) + > NetworkSurfaceDrawingService.MAX_DRAW_DISTANCE + 2.0 + ): + await physics_frame + assert( + player.global_position.distance_to(canvas_origin) + <= NetworkSurfaceDrawingService.MAX_DRAW_DISTANCE + 2.0 + ) assert(service.request_cell_edits(canvas_id, [{ "x": 7, "y": 7, @@ -381,3 +434,18 @@ func _create_initialized_main() -> Node: await process_frame assert(bool(main.get("_application_initialized"))) return main + + +func _wait_for_home( + network_home: NetworkHomeService, + fingerprint: String, +) -> bool: + var deadline: int = Time.get_ticks_msec() + 10000 + while Time.get_ticks_msec() < deadline: + await process_frame + var manifests: Dictionary = network_home.get( + "_manifests_by_fingerprint" + ) + if manifests.has(fingerprint): + return true + return false From 826f62c3526e0f01d88a4de10a35a55042085b7c Mon Sep 17 00:00:00 2001 From: Voyager Date: Sun, 30 Aug 2026 23:53:07 -0400 Subject: [PATCH 14/37] Prepare private v0.20.1-alpha patron release --- docs/README-PLAYTEST.txt | 9 ++++++--- export_presets.cfg | 26 +++++++++++++------------- project.godot | 4 ++-- scripts/build_playtest.sh | 9 ++++++--- ui/title_screen.tscn | 2 +- 5 files changed, 28 insertions(+), 22 deletions(-) diff --git a/docs/README-PLAYTEST.txt b/docs/README-PLAYTEST.txt index 15e3698..d3f3432 100644 --- a/docs/README-PLAYTEST.txt +++ b/docs/README-PLAYTEST.txt @@ -1,8 +1,8 @@ straywild -v0.19.0-alpha -Alpha 0.19.0 +v0.20.1-alpha +Alpha 0.20.1 -Thank you for trying this early private playtest. +Thank you for supporting this private patron test release. straywild is an early multiplayer fishing game. This alpha includes local progression, player-hosted and dedicated multiplayer sessions, public room @@ -83,6 +83,8 @@ FEATURES TO TRY - Fishing, net gathering, and beach digging - Equipment and consumable use from the hotbar - Fishing Shop sell tray, wallet updates, and persistent upgrades +- Portable RV homes, multiplayer visits, RV storage, and the early decor + purchasing and placement prototype - Seeded generated worlds and the authored starter-island layout - Generated beaches, ponds, lakes, complete rivers, denser forests, varied elevation, and closed coastal cliffs @@ -117,5 +119,6 @@ KNOWN ALPHA LIMITATIONS networks may prevent some players from joining. - Multiplayer, dedicated-server deployment, UI, and balance are still alpha. - Some fish and character artwork remains temporary. +- RV exteriors and decor use temporary prototype geometry and presentation. - There is no installer or automatic updater. - Windows builds are unsigned. diff --git a/export_presets.cfg b/export_presets.cfg index 05b0918..ff588e2 100644 --- a/export_presets.cfg +++ b/export_presets.cfg @@ -9,7 +9,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.19.0-alpha/windows-x86_64/straywild.exe" +export_path="builds/v0.20.1-alpha/windows-x86_64/straywild.exe" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -35,11 +35,11 @@ application/modify_resources=true application/icon="res://art/exported/system_icons/straywild.ico" application/console_wrapper_icon="" application/icon_interpolation=0 -application/file_version="0.19.0.0" -application/product_version="0.19.0.0" +application/file_version="0.20.1.0" +application/product_version="0.20.1.0" application/company_name="Woofmeow" application/product_name="straywild" -application/file_description="straywild v0.19.0-alpha" +application/file_description="straywild v0.20.1-alpha" application/copyright="Copyright © 2026 Woofmeow" application/trademarks="straywild and Woofmeow branding is reserved; see TRADEMARKS.md" application/export_angle=0 @@ -62,7 +62,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.19.0-alpha/linux-arm64/straywild.arm64" +export_path="builds/v0.20.1-alpha/linux-arm64/straywild.arm64" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -92,7 +92,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.19.0-alpha/macos/straywild.zip" +export_path="builds/v0.20.1-alpha/macos/straywild.zip" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -108,8 +108,8 @@ custom_template/release="" application/bundle_identifier="io.woofmeow.netfishing" application/icon="res://art/exported/system_icons/straywild_1024.png" application/icon_interpolation=0 -application/short_version="0.19.0" -application/version="0.19.0" +application/short_version="0.20.1" +application/version="0.20.1" application/architecture="universal" codesign/enable=false notarization/enable=false @@ -125,7 +125,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*,tests/*" -export_path="builds/v0.19.0-alpha/server-linux-x86_64/straywildServer.x86_64" +export_path="builds/v0.20.1-alpha/server-linux-x86_64/straywildServer.x86_64" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -155,7 +155,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.19.0-alpha/android/straywild.apk" +export_path="builds/v0.20.1-alpha/android/straywild.apk" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -176,8 +176,8 @@ architectures/armeabi-v7a=false architectures/arm64-v8a=true architectures/x86=false architectures/x86_64=false -version/code=190000 -version/name="v0.19.0-alpha" +version/code=200100 +version/name="v0.20.1-alpha" package/unique_name="io.woofmeow.netfishing" package/name="straywild" package/signed=true @@ -214,7 +214,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.19.0-alpha/linux-x86_64/straywild.x86_64" +export_path="builds/v0.20.1-alpha/linux-x86_64/straywild.x86_64" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" diff --git a/project.godot b/project.godot index d202817..23fdd1e 100644 --- a/project.godot +++ b/project.godot @@ -11,7 +11,7 @@ config_version=5 [application] config/name="straywild" -config/version="0.19.0-alpha" +config/version="0.20.1-alpha" run/main_scene="res://main/main.tscn" config/features=PackedStringArray("4.7", "GL Compatibility") config/icon="res://art/exported/system_icons/straywild_256.png" @@ -260,7 +260,7 @@ alternate_fishing={ [network] -discovery/base_url="https://discovery.straywild.io" +discovery/base_url="https://discovery.straywild.io/patron-test" [physics] diff --git a/scripts/build_playtest.sh b/scripts/build_playtest.sh index 2347d3d..f1ff151 100755 --- a/scripts/build_playtest.sh +++ b/scripts/build_playtest.sh @@ -4,14 +4,14 @@ set -euo pipefail readonly SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" readonly PROJECT_ROOT="$(cd -- "${SCRIPT_DIR}/.." && pwd)" -readonly BUILD_ROOT="${PROJECT_ROOT}/builds/v0.19.0-alpha" +readonly BUILD_ROOT="${PROJECT_ROOT}/builds/v0.20.1-alpha" readonly WINDOWS_DIR="${BUILD_ROOT}/windows-x86_64" readonly LINUX_DIR="${BUILD_ROOT}/linux-x86_64" readonly README_SOURCE="${PROJECT_ROOT}/docs/README-PLAYTEST.txt" readonly SOURCE_COMMIT="$(git -C "${PROJECT_ROOT}" rev-parse HEAD)" readonly SOURCE_URL="https://forge.makearmy.io/woofmeow/straywild" -readonly WINDOWS_ZIP="${BUILD_ROOT}/straywild-v0.19.0-alpha-windows-x86_64.zip" -readonly LINUX_ZIP="${BUILD_ROOT}/straywild-v0.19.0-alpha-linux-x86_64.zip" +readonly WINDOWS_ZIP="${BUILD_ROOT}/straywild-v0.20.1-alpha-windows-x86_64.zip" +readonly LINUX_ZIP="${BUILD_ROOT}/straywild-v0.20.1-alpha-linux-x86_64.zip" readonly GODOT_BIN="${GODOT_BIN:-godot}" if [[ ! -f "${PROJECT_ROOT}/project.godot" ]]; then @@ -77,6 +77,9 @@ straywild code is licensed under GPL-3.0-or-later. Source repository: ${SOURCE_URL} Source revision at build time: ${SOURCE_COMMIT} +This private patron test release is distributed with an exact corresponding +source archive named straywild-v0.20.1-alpha-source.tar.gz. + If this package includes uncommitted development changes, it must not be publicly redistributed until the exact corresponding source is also made available. diff --git a/ui/title_screen.tscn b/ui/title_screen.tscn index d1fc210..852fd71 100644 --- a/ui/title_screen.tscn +++ b/ui/title_screen.tscn @@ -213,7 +213,7 @@ unique_name_in_owner = true layout_mode = 2 theme_override_colors/font_color = Color(0.682, 0.733, 0.761, 1) theme_override_font_sizes/font_size = 22 -text = "v0.19.0-alpha" +text = "v0.20.1-alpha" horizontal_alignment = 1 [node name="Spacer" type="Control" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent"] From 9b96a3bf53a8b66b47f01caf8825bfce5374c03d Mon Sep 17 00:00:00 2001 From: Voyager Date: Mon, 31 Aug 2026 00:31:02 -0400 Subject: [PATCH 15/37] Replace starter RV placeholder with donated motorcoach --- docs/ATTRIBUTION.md | 6 ++- homes/assets/starter_motorcoach.glb | Bin 0 -> 189284 bytes homes/assets/starter_motorcoach.glb.import | 45 ++++++++++++++++++ homes/home_world_service.gd | 51 +++++++++++++++------ 4 files changed, 85 insertions(+), 17 deletions(-) create mode 100644 homes/assets/starter_motorcoach.glb create mode 100644 homes/assets/starter_motorcoach.glb.import diff --git a/docs/ATTRIBUTION.md b/docs/ATTRIBUTION.md index c235601..d8676f0 100644 --- a/docs/ATTRIBUTION.md +++ b/docs/ATTRIBUTION.md @@ -142,8 +142,10 @@ environment and UI artwork, item artwork, finished fish and creature artwork, and character customization pattern and channel-map artwork. Voyager's incorporated original work includes 3D assets, the provisional fish placeholder artwork, the title and dusk music identified above, and the robot -animalese tones. Specific contributor exceptions are recorded below and in the -in-game credits. +animalese tones. The current starter motorcoach exterior was supplied by a +contributing artist who released its copyright to the project; the original +and cleaned source files are retained in the owners' source-work archive. +Specific contributor exceptions are recorded below and in the in-game credits. These credits intentionally describe work by creator and contribution family instead of maintaining a second file-by-file asset catalog. Runtime resources diff --git a/homes/assets/starter_motorcoach.glb b/homes/assets/starter_motorcoach.glb new file mode 100644 index 0000000000000000000000000000000000000000..5b0d0225da3af0dc3978f6b0bb19562b571ae8e3 GIT binary patch literal 189284 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 Y$FNH{19#B{>47_%9L|Qb!+zoa0dB5ZD*ylh literal 0 HcmV?d00001 diff --git a/homes/assets/starter_motorcoach.glb.import b/homes/assets/starter_motorcoach.glb.import new file mode 100644 index 0000000..5cba35b --- /dev/null +++ b/homes/assets/starter_motorcoach.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bhph22caipcj6" +path="res://.godot/imported/starter_motorcoach.glb-153681ef1e622a556fba4df576dc6f84.scn" + +[deps] + +source_file="res://homes/assets/starter_motorcoach.glb" +dest_files=["res://.godot/imported/starter_motorcoach.glb-153681ef1e622a556fba4df576dc6f84.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/homes/home_world_service.gd b/homes/home_world_service.gd index 4e1b422..baec913 100644 --- a/homes/home_world_service.gd +++ b/homes/home_world_service.gd @@ -6,10 +6,13 @@ const NetworkHomeProtocolType = preload( ) const PlayerHomeStateType = preload("res://homes/player_home_state.gd") const DecorCatalogType = preload("res://homes/decor_catalog.gd") +const STARTER_MOTORCOACH_SCENE: PackedScene = preload( + "res://homes/assets/starter_motorcoach.glb" +) const EXTERIOR_BODY_SIZE := Vector3(5.6, 2.5, 2.35) -const EXTERIOR_DOOR_LOCAL := Vector3(-1.45, 0.85, 1.48) -const EXTERIOR_SPAWN_LOCAL := Vector3(-1.45, 0.25, 2.45) +const EXTERIOR_DOOR_LOCAL := Vector3(-0.2, 0.85, 1.48) +const EXTERIOR_SPAWN_LOCAL := Vector3(-0.2, 0.25, 2.45) const EXTERIOR_INTERACTION_DISTANCE: float = 2.7 const INTERIOR_EXIT_DISTANCE: float = 2.1 const INTERIOR_ORIGIN := Vector3(1000.0, 300.0, 1000.0) @@ -819,9 +822,18 @@ func _build_exterior( root.name = "RV_%s" % fingerprint.left(8) _exteriors_root.add_child(root) root.global_transform = world_transform - _add_box( - root, "Body", EXTERIOR_BODY_SIZE, Vector3(0.0, 1.35, 0.0), - Color("d8d2bd"), true, + if not _dedicated_runtime: + var motorcoach: Node3D = STARTER_MOTORCOACH_SCENE.instantiate() as Node3D + if motorcoach != null: + motorcoach.name = "StarterMotorcoach" + root.add_child(motorcoach) + else: + push_error("The starter motorcoach exterior could not be instantiated.") + _add_box_collision( + root, + "Body", + EXTERIOR_BODY_SIZE, + Vector3(0.0, 1.35, 0.0), ) root.visible = not _dedicated_runtime return root @@ -986,19 +998,28 @@ func _add_box( mesh_instance.position = position parent.add_child(mesh_instance) if with_collision: - var body := StaticBody3D.new() - body.name = "%sCollision" % node_name - body.position = position - var collision := CollisionShape3D.new() - var shape := BoxShape3D.new() - shape.size = size - collision.shape = shape - body.add_child(collision) - parent.add_child(body) - return body + return _add_box_collision(parent, node_name, size, position) return null +func _add_box_collision( + parent: Node3D, + node_name: String, + size: Vector3, + position: Vector3, +) -> StaticBody3D: + var body := StaticBody3D.new() + body.name = "%sCollision" % node_name + body.position = position + var collision := CollisionShape3D.new() + var shape := BoxShape3D.new() + shape.size = size + collision.shape = shape + body.add_child(collision) + parent.add_child(body) + return body + + func _spawn_decor_poof( owner_fingerprint: String, instance_id: String, From ee992d9f0c822856a0f8e619a521896110b5b301 Mon Sep 17 00:00:00 2001 From: Voyager Date: Mon, 31 Aug 2026 00:52:31 -0400 Subject: [PATCH 16/37] Restore public discovery default after patron build --- project.godot | 2 +- scripts/build_portmaster.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/project.godot b/project.godot index 23fdd1e..8e751aa 100644 --- a/project.godot +++ b/project.godot @@ -260,7 +260,7 @@ alternate_fishing={ [network] -discovery/base_url="https://discovery.straywild.io/patron-test" +discovery/base_url="https://discovery.straywild.io" [physics] diff --git a/scripts/build_portmaster.sh b/scripts/build_portmaster.sh index a40e0cd..2d9dcbb 100755 --- a/scripts/build_portmaster.sh +++ b/scripts/build_portmaster.sh @@ -236,7 +236,7 @@ unzip -tq "${ARCHIVE}" >/dev/null readonly TOP_LEVELS="$( unzip -Z1 "${ARCHIVE}" | cut -d/ -f1 | sort -u )" -readonly EXPECTED_TOP_LEVELS="$(printf '%s\n' straywild.sh straywild)" +readonly EXPECTED_TOP_LEVELS="$(printf '%s\n' straywild straywild.sh)" if [[ "${TOP_LEVELS}" != "${EXPECTED_TOP_LEVELS}" ]]; then echo "Unexpected PortMaster archive roots:" >&2 printf '%s\n' "${TOP_LEVELS}" >&2 From 6578d3e8701fa38d0c91bdacf8543ca4e9cd1ec6 Mon Sep 17 00:00:00 2001 From: Voyager Date: Mon, 31 Aug 2026 05:48:36 -0400 Subject: [PATCH 17/37] Add transactional RV decor synchronization --- homes/home_decor_controller.gd | 58 +++- homes/home_world_service.gd | 15 +- main/main.gd | 31 +- network/network_home_protocol.gd | 14 +- network/network_home_service.gd | 492 +++++++++++++++++++++++++++++-- network/network_session.gd | 70 +++++ player/player.gd | 31 ++ 7 files changed, 663 insertions(+), 48 deletions(-) diff --git a/homes/home_decor_controller.gd b/homes/home_decor_controller.gd index 1a97a5d..8f9aa5f 100644 --- a/homes/home_decor_controller.gd +++ b/homes/home_decor_controller.gd @@ -47,6 +47,12 @@ func setup( _on_local_space_changed ): _network_home.local_space_changed.connect(_on_local_space_changed) + if not _network_home.local_manifest_rejected.is_connected( + _on_local_manifest_rejected + ): + _network_home.local_manifest_rejected.connect( + _on_local_manifest_rejected + ) if not _home_state.changed.is_connected(_on_home_changed): _home_state.changed.connect(_on_home_changed) if not _toolbar.placement_mode_requested.is_connected( @@ -84,7 +90,13 @@ func _input(event: InputEvent) -> void: and pointer_button.button_index == MOUSE_BUTTON_LEFT and not pointer_button.pressed ): - _finish_drag() + # A gameplay menu can take ownership between the press and release. Do + # not let that release finalize decor behind the menu; preserve the + # original transform instead. + if _can_decorate(): + _finish_drag() + else: + _cancel_drag() get_viewport().set_input_as_handled() @@ -120,14 +132,17 @@ func _unhandled_input(event: InputEvent) -> void: func _process(delta: float) -> void: if _drag_instance_id.is_empty(): return + # Menus and other gameplay input handoffs must cancel an active drag before + # evaluating a held/released pointer. This prevents a same-frame TAB press + # followed by left-button release from committing a move behind the UI. + if not _can_decorate(): + _cancel_drag() + return if not Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT): _finish_drag() return if not _drag_target_valid: return - if not _can_decorate(): - _cancel_drag() - return var current: Dictionary = _home_world.get_decor_preview_transform( _drag_owner_fingerprint, _drag_instance_id ) @@ -146,6 +161,9 @@ func _process(delta: float) -> void: func _begin_drag(screen_position: Vector2) -> bool: + if _network_home.has_pending_local_decor_mutation(): + _toolbar.report_status("waiting for the previous decor update") + return false var owner_fingerprint: String = ( _network_home.get_local_home_owner_fingerprint() ) @@ -331,22 +349,34 @@ static func _placement_position(placement: Dictionary) -> Vector3: func _place_carried_decor(decor_id: StringName) -> void: + if _network_home.has_pending_local_decor_mutation(): + _toolbar.report_status("waiting for the previous decor update") + return var owner_fingerprint: String = ( _network_home.get_local_home_owner_fingerprint() ) - var forward: Vector3 = -_player.global_basis.z - forward.y = 0.0 - forward = forward.normalized() + # RV transitions keep the gameplay root axis-aligned so its transform can be + # synchronized independently from the presentation. Use the visual facing + # direction instead; otherwise carried decor is always placed along world -Z + # instead of in front of the character the player sees. + var forward: Vector3 = _player.get_facing_direction() var global_position: Vector3 = _player.global_position + forward * 1.45 var local_position: Vector3 = _home_world.interior_global_to_local( owner_fingerprint, global_position ) + var placement_yaw: float = atan2(-forward.x, -forward.z) var instance_id: String = _network_home.place_local_decor( - decor_id, local_position, _player.global_rotation.y, _mode + decor_id, local_position, placement_yaw, _mode ) if instance_id.is_empty(): _toolbar.report_status("make room in front of you to place this decor") return + # A local host can reject its own optimistic manifest synchronously. Do not + # claim success after that rollback or leave the player looking for decor that + # was never accepted into the room. + if _home_state.get_placement(instance_id).is_empty(): + _toolbar.report_status("decor placement was not accepted") + return _select_instance(instance_id) _toolbar.report_status("decor placed") @@ -366,6 +396,9 @@ func _select_instance(instance_id: String) -> void: func _rotate_selected() -> void: if not _can_decorate() or _selected_instance_id.is_empty(): return + if _network_home.has_pending_local_decor_mutation(): + _toolbar.report_status("waiting for the previous decor update") + return var placement: Dictionary = _home_state.get_placement( _selected_instance_id ) @@ -392,6 +425,9 @@ func _rotate_selected() -> void: func _store_selected() -> void: if _selected_instance_id.is_empty(): return + if _network_home.has_pending_local_decor_mutation(): + _toolbar.report_status("waiting for the previous decor update") + return if _network_home.remove_local_decor(_selected_instance_id): _clear_selection() _toolbar.report_status("decor packed into storage") @@ -418,6 +454,12 @@ func _on_local_space_changed( _refresh_toolbar() +func _on_local_manifest_rejected(message: String) -> void: + _clear_selection() + if _toolbar != null and _toolbar.visible: + _toolbar.report_status(message) + + func _on_home_changed() -> void: if ( not _selected_instance_id.is_empty() diff --git a/homes/home_world_service.gd b/homes/home_world_service.gd index baec913..fd02d93 100644 --- a/homes/home_world_service.gd +++ b/homes/home_world_service.gd @@ -17,6 +17,7 @@ const EXTERIOR_INTERACTION_DISTANCE: float = 2.7 const INTERIOR_EXIT_DISTANCE: float = 2.1 const INTERIOR_ORIGIN := Vector3(1000.0, 300.0, 1000.0) const INTERIOR_SPACING: float = 14.0 +const INTERIOR_MAX_SPAWN_SLOTS: int = 64 const INTERIOR_FLOOR_SIZE := Vector3(8.0, 0.18, 4.5) const INTERIOR_WALL_HEIGHT: float = 2.7 const MIN_EXTERIOR_TRIANGLE_AREA: float = 1.0 @@ -461,13 +462,17 @@ func get_interior_spawn_transform( visitor_offset: int = 0, ) -> Transform3D: var anchor: Vector3 = get_interior_anchor(owner_fingerprint) - var result := Transform3D(Basis.IDENTITY, anchor) - result.origin += Vector3( - -1.0 + float(posmod(visitor_offset, 4)) * 0.65, + # `visitor_offset` is allocated by the host as a compact room-local slot. + # Keep it bounded as a last line of defense if a future caller accidentally + # supplies an engine peer ID instead of a slot. + var visitor_slot: int = posmod(visitor_offset, INTERIOR_MAX_SPAWN_SLOTS) + # Build the origin as a value rather than mutating Transform3D.origin. + var spawn_origin: Vector3 = anchor + Vector3( + -1.0 + float(posmod(visitor_slot, 4)) * 0.65, 0.25, - 0.4 + float(floori(float(visitor_offset) / 4.0)) * 0.55, + 0.4 + float(floori(float(visitor_slot) / 4.0)) * 0.55, ) - return result + return Transform3D(Basis.IDENTITY, spawn_origin) func get_interior_anchor(owner_fingerprint: String) -> Vector3: diff --git a/main/main.gd b/main/main.gd index 8335c69..00d2b40 100644 --- a/main/main.gd +++ b/main/main.gd @@ -1731,12 +1731,14 @@ func _process(delta: float) -> void: func _apply_runtime_settings(settings: PlayerSettingsType) -> void: if settings == null: return - var requested_window_mode: DisplayServer.WindowMode = ( - DisplayServer.WINDOW_MODE_FULLSCREEN - if settings.fullscreen_enabled - else DisplayServer.WINDOW_MODE_WINDOWED + var current_window_mode: DisplayServer.WindowMode = ( + DisplayServer.window_get_mode() ) - if DisplayServer.window_get_mode() != requested_window_mode: + var requested_window_mode: DisplayServer.WindowMode = resolve_window_mode( + settings.fullscreen_enabled, + current_window_mode, + ) + if current_window_mode != requested_window_mode: DisplayServer.window_set_mode(requested_window_mode) _apply_world_pixelation(settings.world_pixel_size) _ui_pixelation.set_pixel_size(settings.ui_pixel_size) @@ -1763,6 +1765,25 @@ func _apply_runtime_settings(settings: PlayerSettingsType) -> void: ) +static func resolve_window_mode( + fullscreen_enabled: bool, + current_mode: DisplayServer.WindowMode, +) -> DisplayServer.WindowMode: + var is_fullscreen: bool = current_mode in [ + DisplayServer.WINDOW_MODE_FULLSCREEN, + DisplayServer.WINDOW_MODE_EXCLUSIVE_FULLSCREEN, + ] + if fullscreen_enabled: + return ( + current_mode + if is_fullscreen + else DisplayServer.WINDOW_MODE_FULLSCREEN + ) + if is_fullscreen: + return DisplayServer.WINDOW_MODE_WINDOWED + return current_mode + + func _apply_world_pixelation(pixel_size: int) -> void: var root_viewport: Viewport = get_viewport() root_viewport.scaling_3d_mode = Viewport.SCALING_3D_MODE_NEAREST diff --git a/network/network_home_protocol.gd b/network/network_home_protocol.gd index 62b8488..96756e9 100644 --- a/network/network_home_protocol.gd +++ b/network/network_home_protocol.gd @@ -7,6 +7,7 @@ const CAPABILITY: StringName = &"portable_home_v1" const RELIABLE_CHANNEL: int = NetworkProtocol.HOME_RELIABLE_CHANNEL const MAX_ID_LENGTH: int = 96 const MAX_MESSAGE_LENGTH: int = 160 +const MAX_TRANSITION_COORDINATE: float = 10000.0 const WORLD_SPACE: StringName = &"world" enum TransitionAction { @@ -143,7 +144,7 @@ static func transform_to_array(value: Transform3D) -> Array[float]: static func array_to_transform(value: Variant) -> Transform3D: - if not _valid_transform(value): + if not validate_transition_transform(value): return Transform3D() var fields: Array = value return Transform3D( @@ -156,6 +157,17 @@ static func array_to_transform(value: Variant) -> Transform3D: ) +static func validate_transition_transform(value: Variant) -> bool: + if not _valid_transform(value): + return false + var fields: Array = value + return ( + absf(float(fields[9])) <= MAX_TRANSITION_COORDINATE + and absf(float(fields[10])) <= MAX_TRANSITION_COORDINATE + and absf(float(fields[11])) <= MAX_TRANSITION_COORDINATE + ) + + static func _valid_transform(value: Variant) -> bool: if typeof(value) != TYPE_ARRAY or (value as Array).size() != 12: return false diff --git a/network/network_home_service.gd b/network/network_home_service.gd index df4fcde..33fa6ee 100644 --- a/network/network_home_service.gd +++ b/network/network_home_service.gd @@ -5,12 +5,15 @@ const NetworkHomeProtocolType = preload( "res://network/network_home_protocol.gd" ) const PlayerHomeStateType = preload("res://homes/player_home_state.gd") +const DecorCatalogType = preload("res://homes/decor_catalog.gd") +const OwnedItemType = preload("res://items/owned_item.gd") signal local_transition_finished(accepted: bool, message: String) signal local_space_changed(space_id: StringName, owner_fingerprint: String) signal local_manifest_rejected(message: String) const MAX_MANIFESTS: int = 128 +const MAX_PENDING_LOCAL_DECOR_TRANSACTIONS: int = 16 var _session: NetworkSession var _spawn_service: PlayerSpawnService @@ -24,9 +27,12 @@ var _manifests_by_fingerprint: Dictionary[String, Dictionary] = {} var _fingerprint_by_peer: Dictionary[int, String] = {} var _authorized_owned_counts: Dictionary[int, Dictionary] = {} var _authorization_result_owner: Dictionary[String, int] = {} +var _interior_slots_by_space: Dictionary[StringName, Dictionary] = {} var _next_interior_index: int = 0 var _suppress_local_submission: bool = false var _publish_queued: bool = false +var _last_submitted_local_home_revision: int = -1 +var _pending_local_decor_transactions: Dictionary[int, Dictionary] = {} func setup( @@ -77,6 +83,10 @@ func can_local_decorate() -> bool: ) +func has_pending_local_decor_mutation() -> bool: + return not _pending_local_decor_transactions.is_empty() + + func get_authoritative_owned_count( peer_id: int, decor_id: StringName, @@ -101,6 +111,7 @@ func place_local_decor( ) -> String: if ( not can_local_decorate() + or has_pending_local_decor_mutation() or _bag == null or _bag.get_quantity(decor_id) <= 0 or _world_service == null @@ -123,6 +134,10 @@ func place_local_decor( ) if normalized.is_empty(): return "" + var transaction: Dictionary = _capture_local_decor_transaction() + if transaction.is_empty(): + return "" + _suppress_local_submission = true var instance_id: String = _local_home.place_decor( decor_id, normalized["position"], @@ -130,17 +145,22 @@ func place_local_decor( mode, ) if instance_id.is_empty(): + _suppress_local_submission = false return "" if not _bag.remove_item(decor_id, 1): _local_home.remove_placement(instance_id) + _suppress_local_submission = false + return "" + _suppress_local_submission = false + if not _commit_local_decor_transaction(transaction): return "" - _save_manager.save_if_dirty() return instance_id func remove_local_decor(instance_id: String) -> bool: if ( not can_local_decorate() + or has_pending_local_decor_mutation() or _bag == null or _inventory_layout == null or _hotbar == null @@ -149,6 +169,9 @@ func remove_local_decor(instance_id: String) -> bool: var placement: Dictionary = _local_home.get_placement(instance_id) if placement.is_empty(): return false + var transaction: Dictionary = _capture_local_decor_transaction() + if transaction.is_empty(): + return false var decor_id := StringName(str(placement["decor_id"])) var target_hotbar_slot: int = _hotbar.find_item_slot(decor_id) if target_hotbar_slot < 0: @@ -174,14 +197,20 @@ func remove_local_decor(instance_id: String) -> bool: _inventory_layout.cancel_prepared_item_placement(decor_id) returned_to_inventory = _bag.add_item_to_storage(decor_id, 1) if not returned_to_inventory: + if prepared_hotbar_placement: + _inventory_layout.cancel_prepared_item_placement(decor_id) return false if target_hotbar_slot >= 0: _hotbar.assign_item(target_hotbar_slot, decor_id) _hotbar.select_slot(target_hotbar_slot) + _suppress_local_submission = true if not _local_home.remove_placement(instance_id): - _bag.remove_item(decor_id, 1) + _suppress_local_submission = false + _restore_local_decor_transaction(transaction) + return false + _suppress_local_submission = false + if not _commit_local_decor_transaction(transaction): return false - _save_manager.save_if_dirty() return true @@ -191,19 +220,28 @@ func update_local_decor( yaw_radians: float, mode: PlayerHomeStateType.PlacementMode, ) -> bool: + if has_pending_local_decor_mutation(): + return false var normalized: Dictionary = get_valid_local_decor_transform( instance_id, position, yaw_radians, mode ) if normalized.is_empty(): return false + var transaction: Dictionary = _capture_local_decor_transaction() + if transaction.is_empty(): + return false + _suppress_local_submission = true if not _local_home.update_placement( instance_id, normalized["position"], float(normalized["yaw"]), mode, ): + _suppress_local_submission = false + return false + _suppress_local_submission = false + if not _commit_local_decor_transaction(transaction): return false - _save_manager.save_if_dirty() return true @@ -337,7 +375,9 @@ func refresh_world_presentations() -> void: ) -func publish_local_home() -> bool: +func publish_local_home( + allow_pending_decor_transaction: bool = false, +) -> bool: if ( _session == null or not _session.is_gameplay_session_active() @@ -345,11 +385,24 @@ func publish_local_home() -> bool: or _local_home == null ): return false + # A purchase can update the owned decor count while an optimistic placement + # is waiting on the host. Hold that follow-up manifest until the placement is + # accepted or rolled back; otherwise it can carry the still-unverified + # placement and turn one rejection into a second stale rejection. + if ( + not allow_pending_decor_transaction + and has_pending_local_decor_mutation() + ): + _publish_queued = true + return true if _session.is_host() and ( _world_service == null or not _world_service.is_world_ready() ): return false var home_data: Dictionary = _local_home.to_save_data() + var revision: int = int(home_data.get("revision", -1)) + if revision >= 0 and revision == _last_submitted_local_home_revision: + return true var request: Dictionary = { "request_id": _new_id("home"), "session_id": _session.get_session_id(), @@ -361,6 +414,7 @@ func publish_local_home() -> bool: "portable_home_manifest", NetworkHomeProtocolType.manifest_signature_fields(request), ) + _last_submitted_local_home_revision = revision if _session.is_host(): _process_manifest_request(_session.get_local_peer_id(), request) else: @@ -445,6 +499,15 @@ func _process_manifest_request(peer_id: int, data: Dictionary) -> void: _manifests_by_fingerprint[fingerprint] = manifest _fingerprint_by_peer[peer_id] = fingerprint _consume_owned_authorizations(peer_id, home_data) + if peer_id == _session.get_local_peer_id(): + _discard_local_decor_transactions_through( + int(home_data.get("revision", -1)) + ) + if _last_submitted_local_home_revision == int( + home_data.get("revision", -1) + ): + _last_submitted_local_home_revision = -1 + _flush_queued_local_home_publish() _broadcast_manifest(manifest) if is_first_manifest: _spawn_peer_at_exterior(peer_id, fingerprint) @@ -588,6 +651,16 @@ func receive_home_manifest(data: Dictionary) -> void: var fingerprint: String = str(data["owner_fingerprint"]) _manifests_by_fingerprint[fingerprint] = data.duplicate(true) _fingerprint_by_peer[int(data["owner_peer_id"])] = fingerprint + if fingerprint == _session.get_local_identity_fingerprint(): + var home: Dictionary = data.get("home", {}) + _discard_local_decor_transactions_through( + int(home.get("revision", -1)) + ) + if _last_submitted_local_home_revision == int( + home.get("revision", -1) + ): + _last_submitted_local_home_revision = -1 + _flush_queued_local_home_publish() if _world_service != null and _world_service.is_world_ready(): _world_service.apply_manifest(data) @@ -613,20 +686,304 @@ func receive_home_manifest_rejection( func _apply_manifest_rejection(message: String, canonical: Dictionary) -> void: - if ( - canonical.is_empty() - or not NetworkHomeProtocolType.validate_manifest_broadcast(canonical) - ): + _last_submitted_local_home_revision = -1 + var canonical_home: Dictionary = canonical.get("home", {}) + var canonical_revision: int = int(canonical_home.get("revision", -1)) + var transaction: Dictionary = _get_local_decor_rejection_transaction( + canonical_revision + ) + if canonical.is_empty() or not NetworkHomeProtocolType.validate_manifest_broadcast(canonical): + if not transaction.is_empty(): + _restore_local_decor_transaction(transaction) + _pending_local_decor_transactions.clear() + if _save_manager != null and not _save_manager.save_if_dirty(): + push_warning("Unable to save the restored RV decor state.") + _flush_queued_local_home_publish() local_manifest_rejected.emit(message) return + # A shop result can be accepted locally while its own home manifest is still + # in flight. A delayed rejection for an earlier placement must not erase that + # accepted purchase just because the host's canonical manifest predates it. + var locally_owned_decor: Dictionary[StringName, int] = ( + _capture_local_owned_decor_counts() + ) + # Only carry ownership forward across an actual pending decor-action + # rejection. A standalone rejected manifest must remain authoritative rather + # than repeatedly re-submitting an unverified owned-count increase. + var has_owned_decor_increase: bool = ( + not transaction.is_empty() + and _has_local_owned_decor_increase( + locally_owned_decor, + canonical_home, + ) + ) _suppress_local_submission = true - _local_home.restore_from_save_data(canonical["home"]) + var restored: bool = _local_home.restore_from_save_data(canonical_home) + var owned_decor_restored: bool = ( + restored + and ( + not has_owned_decor_increase + or _restore_local_owned_decor_increases(locally_owned_decor) + ) + ) + var reconciled: bool = ( + restored + and owned_decor_restored + and _reconcile_local_decor_inventory(transaction) + ) _suppress_local_submission = false - _save_manager.save_if_dirty() + _discard_local_decor_transactions_after(canonical_revision) + if not reconciled: + push_error("Unable to reconcile RV decor after a host rejection.") + elif _save_manager != null and not _save_manager.save_if_dirty(): + push_warning("Unable to save the restored RV decor state.") receive_home_manifest(canonical) + if reconciled and has_owned_decor_increase: + # Submit the preserved purchase as a fresh revision after applying the + # canonical placement rollback. This is deliberately separate from the + # rejected action, so the host can validate the already-authorized count. + if not publish_local_home(): + push_warning("Unable to publish the restored RV decor ownership.") local_manifest_rejected.emit(message) +func _capture_local_decor_transaction() -> Dictionary: + if ( + _local_home == null + or _bag == null + or _inventory_layout == null + or _hotbar == null + ): + return {} + var saved_items: Array[OwnedItemType] = [] + for item: OwnedItemType in _bag.get_all_items(): + saved_items.append(item.duplicate_record()) + return { + "home": _local_home.to_save_data(), + "bag_items": saved_items, + "layout": _inventory_layout.to_save_data(), + "hotbar_slots": _hotbar.get_slots(), + "hotbar_fish_slots": _hotbar.get_fish_slots(), + "selected_hotbar_slot": _hotbar.get_selected_slot(), + } + + +func _capture_local_owned_decor_counts() -> Dictionary[StringName, int]: + var counts: Dictionary[StringName, int] = {} + if _local_home == null: + return counts + for decor_id: StringName in DecorCatalogType.get_product_ids(): + counts[decor_id] = _local_home.get_owned_count(decor_id) + return counts + + +func _has_local_owned_decor_increase( + local_counts: Dictionary[StringName, int], + canonical_home: Dictionary, +) -> bool: + var canonical_owned: Dictionary = canonical_home.get("owned_decor", {}) + for decor_id: StringName in DecorCatalogType.get_product_ids(): + if int(local_counts.get(decor_id, 0)) > int( + canonical_owned.get(String(decor_id), 0) + ): + return true + return false + + +func _restore_local_owned_decor_increases( + local_counts: Dictionary[StringName, int], +) -> bool: + if _local_home == null: + return false + for decor_id: StringName in DecorCatalogType.get_product_ids(): + var local_count: int = int(local_counts.get(decor_id, 0)) + var canonical_count: int = _local_home.get_owned_count(decor_id) + while canonical_count < local_count: + if not _local_home.add_owned_decor(decor_id, 1): + return false + canonical_count += 1 + return true + + +func _commit_local_decor_transaction(transaction: Dictionary) -> bool: + if _save_manager == null or not _save_manager.save_if_dirty(): + _restore_local_decor_transaction(transaction) + return false + var revision: int = _local_home.get_revision() + _pending_local_decor_transactions[revision] = transaction.duplicate(true) + _trim_pending_local_decor_transactions() + if publish_local_home(true): + return true + _pending_local_decor_transactions.erase(revision) + _restore_local_decor_transaction(transaction) + _flush_queued_local_home_publish() + # The optimistic mutation was already written before we attempted to publish + # it. If the session ended or could not accept the manifest, immediately + # persist the restored state so a restart cannot resurrect the rejected + # placement or consume its decor item. + if _save_manager != null and not _save_manager.save_if_dirty(): + push_warning("Unable to save the restored RV decor state.") + return false + + +func _restore_local_decor_transaction(transaction: Dictionary) -> bool: + if ( + transaction.is_empty() + or _local_home == null + or _bag == null + or _inventory_layout == null + or _hotbar == null + ): + return false + var home_data: Variant = transaction.get("home", {}) + var layout_data: Variant = transaction.get("layout", {}) + var stored_items: Variant = transaction.get("bag_items", []) + var stored_slots: Variant = transaction.get("hotbar_slots", []) + var stored_fish_slots: Variant = transaction.get("hotbar_fish_slots", []) + if ( + typeof(home_data) != TYPE_DICTIONARY + or typeof(layout_data) != TYPE_DICTIONARY + or typeof(stored_items) != TYPE_ARRAY + or typeof(stored_slots) != TYPE_ARRAY + or typeof(stored_fish_slots) != TYPE_ARRAY + ): + return false + var items: Array[OwnedItemType] = [] + for value: Variant in stored_items as Array: + if not value is OwnedItemType: + return false + items.append((value as OwnedItemType).duplicate_record()) + var slots: Array[StringName] = [] + for value: Variant in stored_slots as Array: + slots.append(StringName(str(value))) + var fish_slots: Array[StringName] = [] + for value: Variant in stored_fish_slots as Array: + fish_slots.append(StringName(str(value))) + var was_suppressed: bool = _suppress_local_submission + _suppress_local_submission = true + var home_restored: bool = _local_home.restore_from_save_data( + home_data as Dictionary + ) + var bag_restored: bool = _bag.replace_all_items(items) + var layout_restored: bool = _inventory_layout.restore_from_save_data( + layout_data as Dictionary + ) + var hotbar_restored: bool = _hotbar.replace_state( + slots, + int(transaction.get("selected_hotbar_slot", 0)), + fish_slots, + false, + ) + _suppress_local_submission = was_suppressed + return home_restored and bag_restored and layout_restored and hotbar_restored + + +func _reconcile_local_decor_inventory(transaction: Dictionary) -> bool: + if _bag == null or _local_home == null: + return false + var preferred_slots: Dictionary[StringName, int] = ( + _decor_hotbar_slots_from_transaction(transaction) + ) + for decor_id: StringName in DecorCatalogType.get_product_ids(): + var target_quantity: int = _local_home.get_available_count(decor_id) + var current_quantity: int = _bag.get_quantity(decor_id) + if current_quantity > target_quantity: + if not _bag.remove_item( + decor_id, current_quantity - target_quantity + ): + return false + continue + while current_quantity < target_quantity: + var preferred_slot: int = int( + preferred_slots.get(decor_id, -1) + ) + if not _restore_decor_item_to_bag(decor_id, preferred_slot): + return false + current_quantity += 1 + return true + + +func _decor_hotbar_slots_from_transaction( + transaction: Dictionary, +) -> Dictionary[StringName, int]: + var result: Dictionary[StringName, int] = {} + var stored_slots: Variant = transaction.get("hotbar_slots", []) + if typeof(stored_slots) != TYPE_ARRAY: + return result + for slot_index: int in range((stored_slots as Array).size()): + var decor_id := StringName(str((stored_slots as Array)[slot_index])) + if DecorCatalogType.has_product(decor_id): + result[decor_id] = slot_index + return result + + +func _restore_decor_item_to_bag( + decor_id: StringName, + preferred_hotbar_slot: int, +) -> bool: + if _bag == null: + return false + var prepared_slot: int = -1 + if ( + _inventory_layout != null + and _hotbar != null + and _inventory_layout.get_container( + PlayerInventoryLayout.EntryKind.ITEM, decor_id + ) < 0 + ): + var candidate_slot: int = preferred_hotbar_slot + if candidate_slot < 0: + candidate_slot = _hotbar.find_first_empty_slot() + if candidate_slot >= 0 and _inventory_layout.prepare_new_item_placement( + decor_id, + PlayerInventoryLayout.InventoryContainer.HOTBAR, + candidate_slot, + ): + prepared_slot = candidate_slot + var restored: bool = _bag.add_item(decor_id, 1) + if not restored: + if prepared_slot >= 0: + _inventory_layout.cancel_prepared_item_placement(decor_id) + if _bag.get_owned_item(decor_id) == null: + restored = _bag.add_item_to_storage(decor_id, 1) + if restored and prepared_slot >= 0: + _hotbar.assign_item(prepared_slot, decor_id) + _hotbar.select_slot(prepared_slot) + return restored + + +func _get_local_decor_rejection_transaction( + canonical_revision: int, +) -> Dictionary: + var revisions: Array[int] = [] + revisions.assign(_pending_local_decor_transactions.keys()) + revisions.sort() + for revision: int in revisions: + if canonical_revision < 0 or revision > canonical_revision: + return _pending_local_decor_transactions[revision].duplicate(true) + return {} + + +func _discard_local_decor_transactions_through(revision: int) -> void: + for pending_revision: int in _pending_local_decor_transactions.keys(): + if pending_revision <= revision: + _pending_local_decor_transactions.erase(pending_revision) + + +func _discard_local_decor_transactions_after(revision: int) -> void: + for pending_revision: int in _pending_local_decor_transactions.keys(): + if pending_revision > revision: + _pending_local_decor_transactions.erase(pending_revision) + + +func _trim_pending_local_decor_transactions() -> void: + var revisions: Array[int] = [] + revisions.assign(_pending_local_decor_transactions.keys()) + revisions.sort() + while revisions.size() > MAX_PENDING_LOCAL_DECOR_TRANSACTIONS: + _pending_local_decor_transactions.erase(revisions.pop_front()) + + func _submit_transition(action: int, owner_fingerprint: String) -> bool: var request: Dictionary = { "request_id": _new_id("home_transition"), @@ -697,12 +1054,18 @@ func _process_transition_request(peer_id: int, data: Dictionary) -> void: ): _send_transition_rejection(peer_id, "You cannot enter that RV.") return + var interior_space: StringName = ( + NetworkHomeProtocolType.make_space_id(owner_fingerprint) + ) + var visitor_slot: int = _reserve_interior_slot( + interior_space, peer_id + ) _apply_host_transition( peer_id, - NetworkHomeProtocolType.make_space_id(owner_fingerprint), + interior_space, owner_fingerprint, _world_service.get_interior_spawn_transform( - owner_fingerprint, peer_id + owner_fingerprint, visitor_slot ), ) return @@ -748,18 +1111,40 @@ func _apply_host_transition( owner_fingerprint: String, transform: Transform3D, ) -> void: + var avatar: Player = _spawn_service.get_avatar(peer_id) + var movement_sequence: int = 0 + if avatar != null: + movement_sequence = int( + avatar.make_network_snapshot(peer_id).get( + "acknowledged_input", 0 + ) + ) + var transform_data: Array[float] = ( + NetworkHomeProtocolType.transform_to_array(transform) + ) + if not NetworkHomeProtocolType.validate_transition_transform( + transform_data + ): + push_error("Refused an out-of-bounds RV transition transform.") + return + var previous_space: StringName = _session.get_peer_space(peer_id) + if ( + String(previous_space).begins_with("rv:") + and previous_space != space_id + ): + _release_interior_slot(previous_space, peer_id) var result: Dictionary = { "peer_id": peer_id, "space_id": String(space_id), "owner_fingerprint": owner_fingerprint, - "transform": NetworkHomeProtocolType.transform_to_array(transform), + "transform": transform_data, + "movement_sequence": movement_sequence, } _apply_transition_result(result) for recipient_id: int in _session.get_authenticated_peer_ids(): if recipient_id == 1: continue receive_home_transition.rpc_id(recipient_id, result) - _session.publish_authoritative_teleport(peer_id) @rpc( @@ -770,35 +1155,40 @@ func receive_home_transition(data: Dictionary) -> void: if ( typeof(data.get("peer_id")) != TYPE_INT or typeof(data.get("space_id")) not in [TYPE_STRING, TYPE_STRING_NAME] + or typeof(data.get("movement_sequence", 0)) != TYPE_INT + or int(data.get("movement_sequence", 0)) < 0 or not NetworkIdentityCrypto.valid_fingerprint( data.get("owner_fingerprint") ) + or not NetworkHomeProtocolType.validate_transition_transform( + data.get("transform") + ) ): return - var transform: Transform3D = NetworkHomeProtocolType.array_to_transform( - data.get("transform") - ) - if transform == Transform3D(): - return _apply_transition_result(data) func _apply_transition_result(data: Dictionary) -> void: var peer_id: int = int(data["peer_id"]) var space_id := StringName(str(data["space_id"])) + if not NetworkHomeProtocolType.validate_transition_transform( + data.get("transform") + ): + return + var target_transform: Transform3D = ( + NetworkHomeProtocolType.array_to_transform(data["transform"]) + ) if not _session.set_peer_space(peer_id, space_id): return - var avatar: Player = _spawn_service.get_avatar(peer_id) - if avatar != null: - avatar.global_transform = NetworkHomeProtocolType.array_to_transform( - data["transform"] - ) - avatar.velocity = Vector3.ZERO + if not _session.apply_authoritative_space_transition( + peer_id, + target_transform, + int(data.get("movement_sequence", 0)), + ): + return if peer_id == _session.get_local_peer_id(): _world_service.set_local_space(space_id) - local_space_changed.emit( - space_id, str(data["owner_fingerprint"]) - ) + local_space_changed.emit(space_id, str(data["owner_fingerprint"])) local_transition_finished.emit(true, "") _refresh_peer_visibility() @@ -840,12 +1230,20 @@ func _on_local_home_changed() -> void: func _publish_queued_home() -> void: + if has_pending_local_decor_mutation(): + return _publish_queued = false if _save_manager != null: _save_manager.save_if_dirty() publish_local_home() +func _flush_queued_local_home_publish() -> void: + if not _publish_queued or has_pending_local_decor_mutation(): + return + call_deferred("_publish_queued_home") + + func _on_join_authenticated() -> void: publish_local_home() @@ -880,6 +1278,7 @@ func _on_peer_authenticated(peer_id: int, _display_name: String) -> void: func _on_peer_removed(peer_id: int) -> void: + _release_peer_interior_slots(peer_id) var fingerprint: String = _fingerprint_by_peer.get(peer_id, "") _fingerprint_by_peer.erase(peer_id) _authorized_owned_counts.erase(peer_id) @@ -937,6 +1336,10 @@ func _on_session_state_changed(state: NetworkSession.State) -> void: _fingerprint_by_peer.clear() _authorized_owned_counts.clear() _authorization_result_owner.clear() + _publish_queued = false + _last_submitted_local_home_revision = -1 + _pending_local_decor_transactions.clear() + _interior_slots_by_space.clear() _next_interior_index = 0 _world_service.clear_presentations() _world_service.set_local_space(NetworkHomeProtocolType.WORLD_SPACE) @@ -950,6 +1353,37 @@ func _fingerprint_for_peer(peer_id: int) -> String: return record.identity_fingerprint if record != null else "" +func _reserve_interior_slot(space_id: StringName, peer_id: int) -> int: + var slots: Dictionary = _interior_slots_by_space.get(space_id, {}) + if slots.has(peer_id): + return int(slots[peer_id]) + var used_slots: Dictionary[int, bool] = {} + for value: Variant in slots.values(): + used_slots[int(value)] = true + var slot: int = 0 + while used_slots.has(slot): + slot += 1 + slots[peer_id] = slot + _interior_slots_by_space[space_id] = slots + return slot + + +func _release_interior_slot(space_id: StringName, peer_id: int) -> void: + var slots: Dictionary = _interior_slots_by_space.get(space_id, {}) + if slots.is_empty(): + return + slots.erase(peer_id) + if slots.is_empty(): + _interior_slots_by_space.erase(space_id) + else: + _interior_slots_by_space[space_id] = slots + + +func _release_peer_interior_slots(peer_id: int) -> void: + for space_id: StringName in _interior_slots_by_space.keys(): + _release_interior_slot(space_id, peer_id) + + func _new_id(prefix: String) -> String: return "%s:%s" % [ prefix, Crypto.new().generate_random_bytes(16).hex_encode(), diff --git a/network/network_session.gd b/network/network_session.gd index 8add90f..66d5101 100644 --- a/network/network_session.gd +++ b/network/network_session.gd @@ -28,6 +28,7 @@ const MAX_PENDING_MOVEMENT_INPUTS: int = 96 const ANIMATION_REFRESH_INTERVAL: float = 1.0 const MAX_MOVEMENT_INPUT_SEQUENCE: int = 2147483647 const MAX_MOVEMENT_ONE_WAY_TRANSIT_SECONDS: float = 0.25 +const SPACE_TRANSITION_SNAPSHOT_GUARD_DISTANCE: float = 12.0 const MOVEMENT_FLAG_JUMP: int = 1 << 0 const MOVEMENT_FLAG_SPRINT: int = 1 << 1 @@ -124,6 +125,9 @@ var _pending_movement_inputs: Array[Dictionary] = [] var _snapshot_accumulator: float = 0.0 var _movement_snapshot_tick: int = 0 var _last_local_snapshot_received_msec: int = 0 +var _local_space_transition_guard_active: bool = false +var _local_space_transition_guard_position: Vector3 = Vector3.ZERO +var _local_space_transition_minimum_ack: int = 0 var _animation_refresh_accumulator: float = 0.0 var _last_animation_state_by_peer: Dictionary[int, Dictionary] = {} var _pending_animation_state_by_peer: Dictionary[int, Dictionary] = {} @@ -703,6 +707,40 @@ func peers_share_space(first_peer_id: int, second_peer_id: int) -> bool: return get_peer_space(first_peer_id) == get_peer_space(second_peer_id) +func apply_authoritative_space_transition( + peer_id: int, + target_transform: Transform3D, + acknowledged_input: int, +) -> bool: + if not target_transform.origin.is_finite(): + return false + var local_peer_id: int = get_local_peer_id() + var local_transition: bool = peer_id == local_peer_id + var avatar: Player = _spawn_service.get_avatar(peer_id) + # Remote home transitions can arrive before their player-spawn message. Keep + # the new space assignment so the later spawn inherits correct visibility; + # only a missing local avatar is a transition failure. + if avatar == null: + return not local_transition + avatar.apply_network_space_transition(target_transform, local_transition) + if ( + local_transition + and state == State.JOINED_CLIENT + ): + # Movement snapshots use another ENet channel and a pre-transition audit + # can therefore arrive after the reliable home transition. Clear local + # prediction and reject those old-world snapshots until the host publishes + # its first audit from the new space. + _pending_movement_inputs.clear() + _last_local_snapshot_received_msec = 0 + _last_input_state_hash = 0 + _idle_input_accumulator = IDLE_INPUT_INTERVAL + _local_space_transition_guard_active = true + _local_space_transition_guard_position = target_transform.origin + _local_space_transition_minimum_ack = maxi(acknowledged_input, 0) + return true + + func get_peer_rtt_ms(peer_id: int) -> int: if peer_id == 1: return 0 @@ -2569,6 +2607,8 @@ func receive_movement_snapshots(encoded_snapshots: Array) -> void: if avatar == null: continue if peer_id == local_peer_id: + if _reject_stale_space_transition_snapshot(snapshot): + continue _discard_acknowledged_movement_inputs( int(snapshot.get("acknowledged_input", 0)) ) @@ -2586,6 +2626,33 @@ func receive_movement_snapshots(encoded_snapshots: Array) -> void: ) +func _reject_stale_space_transition_snapshot(snapshot: Dictionary) -> bool: + if not _local_space_transition_guard_active: + return false + var position_values: Array = snapshot.get("position", []) + if position_values.size() != 3: + return true + var position := Vector3( + float(position_values[0]), + float(position_values[1]), + float(position_values[2]), + ) + var acknowledged_input: int = int( + snapshot.get("acknowledged_input", 0) + ) + if acknowledged_input < _local_space_transition_minimum_ack: + return true + if acknowledged_input > _local_space_transition_minimum_ack: + _local_space_transition_guard_active = false + return false + if position.distance_to(_local_space_transition_guard_position) > ( + SPACE_TRANSITION_SNAPSHOT_GUARD_DISTANCE + ): + return true + _local_space_transition_guard_active = false + return false + + func _discard_acknowledged_movement_inputs(acknowledged_sequence: int) -> void: while ( not _pending_movement_inputs.is_empty() @@ -2914,6 +2981,9 @@ func _teardown_peer() -> void: _snapshot_accumulator = 0.0 _movement_snapshot_tick = 0 _last_local_snapshot_received_msec = 0 + _local_space_transition_guard_active = false + _local_space_transition_guard_position = Vector3.ZERO + _local_space_transition_minimum_ack = 0 _animation_refresh_accumulator = 0.0 _last_animation_state_by_peer.clear() _pending_animation_state_by_peer.clear() diff --git a/player/player.gd b/player/player.gd index 30807be..e36f92b 100644 --- a/player/player.gd +++ b/player/player.gd @@ -2093,6 +2093,37 @@ func reset_network_movement_state() -> void: _local_prediction_largest_error = 0.0 +func apply_network_space_transition( + target_transform: Transform3D, + align_local_camera: bool, +) -> void: + if not target_transform.origin.is_finite(): + return + # A room transition is a discontinuity, not ordinary movement. Preserve the + # host's input acknowledgement while clearing every motion, animation, and + # reconciliation state that could pull the avatar toward the previous space. + var acknowledged_input: int = _last_network_input_sequence + reset_network_movement_state() + _last_network_input_sequence = acknowledged_input + _apply_network_casting(false) + velocity = Vector3.ZERO + global_transform = Transform3D(Basis.IDENTITY, target_transform.origin) + var target_yaw: float = target_transform.basis.get_euler().y + _visuals.rotation.y = target_yaw + _network_camera_yaw = target_yaw + _network_target_position = global_position + _network_target_velocity = Vector3.ZERO + _network_target_visual_yaw = target_yaw + _network_snapshot_age = 0.0 + _network_snapshot_ready = true + _authoritative_movement_history.clear() + if align_local_camera: + _set_camera_dragging(false) + if _free_camera_active: + _set_free_camera_active(false) + _camera_yaw.rotation.y = target_yaw + + func capture_network_input(sequence: int) -> Dictionary: if _sitting_intent_pending and _sitting_intent_sequence < 0: _sitting_intent_sequence = sequence From 3be79fa3fccbd8c1c373919c7e900af00c13ffac Mon Sep 17 00:00:00 2001 From: Voyager Date: Mon, 31 Aug 2026 05:48:47 -0400 Subject: [PATCH 18/37] Normalize cursor handoff across gameplay menus --- network/network_surface_drawing_service.gd | 26 ++++++++++++++++++++-- ui/decor_shop.gd | 10 ++++++++- ui/fishing_shop.gd | 15 ++++++++++--- ui/player_menu.gd | 19 +++++++++++++--- ui/player_storage.gd | 11 ++++++++- 5 files changed, 71 insertions(+), 10 deletions(-) diff --git a/network/network_surface_drawing_service.gd b/network/network_surface_drawing_service.gd index c322e5b..485dfaa 100644 --- a/network/network_surface_drawing_service.gd +++ b/network/network_surface_drawing_service.gd @@ -250,7 +250,11 @@ func activate( _pointer_screen_position = _clamped_pointer_position( initial_pointer_position ) - _prior_mouse_mode = Input.mouse_mode + # Art-kit activation can occur while the prior right-click camera drag is + # still held. Stop that drag before recording a return mode, then restore + # normal camera availability so right-click continues to work while drawing. + _stop_camera_drag_for_art_kit() + _prior_mouse_mode = _get_restorable_mouse_mode(Input.mouse_mode) Input.mouse_mode = Input.MOUSE_MODE_VISIBLE _update_aim() _refresh_stencil_visibility() @@ -266,6 +270,10 @@ func deactivate() -> void: _eraser_mode = false _clear_armed_guide_action(false) _camera_look_active = false + # Do not leave a drag captured when drawing is closed by a menu, hotbar + # change, or session transition. The next camera drag must start on a fresh + # physical right-click press. + _stop_camera_drag_for_art_kit() _reset_stroke() _selected_canvas_id = "" _hovered_canvas_id = "" @@ -273,10 +281,24 @@ func deactivate() -> void: _aim_hit.clear() _hide_previews() _refresh_stencil_visibility() - Input.mouse_mode = _prior_mouse_mode + Input.mouse_mode = _get_restorable_mouse_mode(_prior_mouse_mode) _emit_hud_state("") +func _stop_camera_drag_for_art_kit() -> void: + if _local_player == null or not is_instance_valid(_local_player): + return + var camera_input_enabled: bool = _local_player.is_camera_input_enabled() + _local_player.set_camera_input_enabled(false) + _local_player.set_camera_input_enabled(camera_input_enabled) + + +func _get_restorable_mouse_mode(mouse_mode: Input.MouseMode) -> Input.MouseMode: + if mouse_mode == Input.MOUSE_MODE_CAPTURED: + return Input.MOUSE_MODE_VISIBLE + return mouse_mode + + func is_active() -> bool: return _active diff --git a/ui/decor_shop.gd b/ui/decor_shop.gd index 9292806..d05d9eb 100644 --- a/ui/decor_shop.gd +++ b/ui/decor_shop.gd @@ -82,9 +82,11 @@ func open_shop() -> bool: return false _prior_movement_enabled = _player.is_movement_enabled() _prior_camera_enabled = _player.is_camera_input_enabled() - _prior_mouse_mode = Input.mouse_mode _player.set_movement_enabled(false) + # Release any active right-click drag first. The shop must not remember the + # drag's transient captured mode because release may happen inside the UI. _player.set_camera_input_enabled(false) + _prior_mouse_mode = _get_restorable_mouse_mode(Input.mouse_mode) _fishing_spot.set_local_menu_input_suppressed(INPUT_OWNER, true) Input.mouse_mode = Input.MOUSE_MODE_VISIBLE _transaction_pending = ( @@ -133,6 +135,12 @@ func close_for_session_end() -> void: close_shop(false) +func _get_restorable_mouse_mode(mouse_mode: Input.MouseMode) -> Input.MouseMode: + if mouse_mode == Input.MOUSE_MODE_CAPTURED: + return Input.MOUSE_MODE_VISIBLE + return mouse_mode + + func _unhandled_input(event: InputEvent) -> void: if not visible or not event.is_action_pressed("ui_cancel"): return diff --git a/ui/fishing_shop.gd b/ui/fishing_shop.gd index ad8247c..234a1c1 100644 --- a/ui/fishing_shop.gd +++ b/ui/fishing_shop.gd @@ -654,11 +654,14 @@ func open_shop() -> bool: ) _prior_movement_enabled = _player.is_movement_enabled() _prior_camera_enabled = _player.is_camera_input_enabled() - _prior_mouse_mode = Input.mouse_mode + _player.set_movement_enabled(false) + # Releasing an active camera drag before the snapshot prevents the close + # path from restoring a captured pointer after its matching button release + # has been consumed by the shop. + _player.set_camera_input_enabled(false) + _prior_mouse_mode = _get_restorable_mouse_mode(Input.mouse_mode) _snapshot_stored = true _mouse_snapshot_stored = true - _player.set_movement_enabled(false) - _player.set_camera_input_enabled(false) _fishing_spot.set_local_menu_input_suppressed(INPUT_OWNER, true) Input.mouse_mode = Input.MOUSE_MODE_VISIBLE _set_feedback("") @@ -1897,3 +1900,9 @@ func _apply_mouse_close_policy(reason: CloseReason) -> void: CloseReason.TEARDOWN: pass _mouse_snapshot_stored = false + + +func _get_restorable_mouse_mode(mouse_mode: Input.MouseMode) -> Input.MouseMode: + if mouse_mode == Input.MOUSE_MODE_CAPTURED: + return Input.MOUSE_MODE_VISIBLE + return mouse_mode diff --git a/ui/player_menu.gd b/ui/player_menu.gd index 2f9f96f..9b15913 100644 --- a/ui/player_menu.gd +++ b/ui/player_menu.gd @@ -1559,11 +1559,14 @@ func open_menu() -> void: _cancel_page_tween() _prior_movement_enabled = _player.is_movement_enabled() _prior_camera_input_enabled = _player.is_camera_input_enabled() - _prior_mouse_mode = Input.mouse_mode + _player.set_movement_enabled(false) + # Ending an active right-click camera drag restores its ordinary pointer + # mode. Snapshot after that handoff so this menu never restores the drag's + # transient captured mode when it closes. + _player.set_camera_input_enabled(false) + _prior_mouse_mode = _get_restorable_mouse_mode(Input.mouse_mode) _control_snapshot_stored = true _mouse_snapshot_stored = true - _player.set_movement_enabled(false) - _player.set_camera_input_enabled(false) _fishing_spot.set_local_menu_input_suppressed(INPUT_OWNER, true) Input.mouse_mode = Input.MOUSE_MODE_VISIBLE visible = true @@ -1775,6 +1778,16 @@ func _apply_mouse_close_policy(reason: CloseReason) -> void: _mouse_snapshot_stored = false +func _get_restorable_mouse_mode(mouse_mode: Input.MouseMode) -> Input.MouseMode: + # Mouse capture belongs to an in-progress camera drag, never to the player + # menu itself. A held right button can be released while this menu owns + # input, so restoring CAPTURED here would leave the pointer hidden without + # an active drag to release it. + if mouse_mode == Input.MOUSE_MODE_CAPTURED: + return Input.MOUSE_MODE_VISIBLE + return mouse_mode + + func _on_bite_activated() -> void: if visible: close_menu(CloseReason.BITE_STARTED) diff --git a/ui/player_storage.gd b/ui/player_storage.gd index 1f553ea..83817c5 100644 --- a/ui/player_storage.gd +++ b/ui/player_storage.gd @@ -109,9 +109,12 @@ func _open_storage( _decorate_button.visible = home_access and allow_decorating _prior_movement_enabled = _player.is_movement_enabled() _prior_camera_enabled = _player.is_camera_input_enabled() - _prior_mouse_mode = Input.mouse_mode _player.set_movement_enabled(false) + # End an in-progress right-click camera drag before taking the snapshot. + # A held button can be released while this page owns input, so captured mode + # is never a valid mouse mode to restore when the page closes. _player.set_camera_input_enabled(false) + _prior_mouse_mode = _get_restorable_mouse_mode(Input.mouse_mode) _fishing_spot.set_local_menu_input_suppressed(INPUT_OWNER, true) Input.mouse_mode = Input.MOUSE_MODE_VISIBLE _feedback.text = "select an item to move it · drag to choose a slot" @@ -153,6 +156,12 @@ func close_for_session_end() -> void: close_storage(false) +func _get_restorable_mouse_mode(mouse_mode: Input.MouseMode) -> Input.MouseMode: + if mouse_mode == Input.MOUSE_MODE_CAPTURED: + return Input.MOUSE_MODE_VISIBLE + return mouse_mode + + func consume_escape() -> bool: if not visible: return false From 014c064fae7592a8fe0e4107d177a22729c0a0e2 Mon Sep 17 00:00:00 2001 From: Voyager Date: Mon, 31 Aug 2026 06:06:09 -0400 Subject: [PATCH 19/37] Prepare private v0.20.2-alpha test build --- docs/README-PLAYTEST.txt | 6 +++--- export_presets.cfg | 26 +++++++++++++------------- project.godot | 4 ++-- scripts/build_playtest.sh | 10 +++++----- ui/title_screen.tscn | 2 +- 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/docs/README-PLAYTEST.txt b/docs/README-PLAYTEST.txt index d3f3432..f187182 100644 --- a/docs/README-PLAYTEST.txt +++ b/docs/README-PLAYTEST.txt @@ -1,8 +1,8 @@ straywild -v0.20.1-alpha -Alpha 0.20.1 +v0.20.2-alpha +Alpha 0.20.2 -Thank you for supporting this private patron test release. +Thank you for supporting this private testing release. straywild is an early multiplayer fishing game. This alpha includes local progression, player-hosted and dedicated multiplayer sessions, public room diff --git a/export_presets.cfg b/export_presets.cfg index ff588e2..a49f01f 100644 --- a/export_presets.cfg +++ b/export_presets.cfg @@ -9,7 +9,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.20.1-alpha/windows-x86_64/straywild.exe" +export_path="builds/v0.20.2-alpha/windows-x86_64/straywild.exe" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -35,11 +35,11 @@ application/modify_resources=true application/icon="res://art/exported/system_icons/straywild.ico" application/console_wrapper_icon="" application/icon_interpolation=0 -application/file_version="0.20.1.0" -application/product_version="0.20.1.0" +application/file_version="0.20.2.0" +application/product_version="0.20.2.0" application/company_name="Woofmeow" application/product_name="straywild" -application/file_description="straywild v0.20.1-alpha" +application/file_description="straywild v0.20.2-alpha" application/copyright="Copyright © 2026 Woofmeow" application/trademarks="straywild and Woofmeow branding is reserved; see TRADEMARKS.md" application/export_angle=0 @@ -62,7 +62,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.20.1-alpha/linux-arm64/straywild.arm64" +export_path="builds/v0.20.2-alpha/linux-arm64/straywild.arm64" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -92,7 +92,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.20.1-alpha/macos/straywild.zip" +export_path="builds/v0.20.2-alpha/macos/straywild.zip" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -108,8 +108,8 @@ custom_template/release="" application/bundle_identifier="io.woofmeow.netfishing" application/icon="res://art/exported/system_icons/straywild_1024.png" application/icon_interpolation=0 -application/short_version="0.20.1" -application/version="0.20.1" +application/short_version="0.20.2" +application/version="0.20.2" application/architecture="universal" codesign/enable=false notarization/enable=false @@ -125,7 +125,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*,tests/*" -export_path="builds/v0.20.1-alpha/server-linux-x86_64/straywildServer.x86_64" +export_path="builds/v0.20.2-alpha/server-linux-x86_64/straywildServer.x86_64" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -155,7 +155,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.20.1-alpha/android/straywild.apk" +export_path="builds/v0.20.2-alpha/android/straywild.apk" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -176,8 +176,8 @@ architectures/armeabi-v7a=false architectures/arm64-v8a=true architectures/x86=false architectures/x86_64=false -version/code=200100 -version/name="v0.20.1-alpha" +version/code=200200 +version/name="v0.20.2-alpha" package/unique_name="io.woofmeow.netfishing" package/name="straywild" package/signed=true @@ -214,7 +214,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.20.1-alpha/linux-x86_64/straywild.x86_64" +export_path="builds/v0.20.2-alpha/linux-x86_64/straywild.x86_64" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" diff --git a/project.godot b/project.godot index 8e751aa..5bcbb4d 100644 --- a/project.godot +++ b/project.godot @@ -11,7 +11,7 @@ config_version=5 [application] config/name="straywild" -config/version="0.20.1-alpha" +config/version="0.20.2-alpha" run/main_scene="res://main/main.tscn" config/features=PackedStringArray("4.7", "GL Compatibility") config/icon="res://art/exported/system_icons/straywild_256.png" @@ -260,7 +260,7 @@ alternate_fishing={ [network] -discovery/base_url="https://discovery.straywild.io" +discovery/base_url="https://discovery.straywild.io/patron-test" [physics] diff --git a/scripts/build_playtest.sh b/scripts/build_playtest.sh index f1ff151..d54ba70 100755 --- a/scripts/build_playtest.sh +++ b/scripts/build_playtest.sh @@ -4,14 +4,14 @@ set -euo pipefail readonly SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" readonly PROJECT_ROOT="$(cd -- "${SCRIPT_DIR}/.." && pwd)" -readonly BUILD_ROOT="${PROJECT_ROOT}/builds/v0.20.1-alpha" +readonly BUILD_ROOT="${PROJECT_ROOT}/builds/v0.20.2-alpha" readonly WINDOWS_DIR="${BUILD_ROOT}/windows-x86_64" readonly LINUX_DIR="${BUILD_ROOT}/linux-x86_64" readonly README_SOURCE="${PROJECT_ROOT}/docs/README-PLAYTEST.txt" readonly SOURCE_COMMIT="$(git -C "${PROJECT_ROOT}" rev-parse HEAD)" readonly SOURCE_URL="https://forge.makearmy.io/woofmeow/straywild" -readonly WINDOWS_ZIP="${BUILD_ROOT}/straywild-v0.20.1-alpha-windows-x86_64.zip" -readonly LINUX_ZIP="${BUILD_ROOT}/straywild-v0.20.1-alpha-linux-x86_64.zip" +readonly WINDOWS_ZIP="${BUILD_ROOT}/straywild-v0.20.2-alpha-windows-x86_64.zip" +readonly LINUX_ZIP="${BUILD_ROOT}/straywild-v0.20.2-alpha-linux-x86_64.zip" readonly GODOT_BIN="${GODOT_BIN:-godot}" if [[ ! -f "${PROJECT_ROOT}/project.godot" ]]; then @@ -77,8 +77,8 @@ straywild code is licensed under GPL-3.0-or-later. Source repository: ${SOURCE_URL} Source revision at build time: ${SOURCE_COMMIT} -This private patron test release is distributed with an exact corresponding -source archive named straywild-v0.20.1-alpha-source.tar.gz. +This private testing release is distributed with an exact corresponding +source archive named straywild-v0.20.2-alpha-source.tar.gz. If this package includes uncommitted development changes, it must not be publicly redistributed until the exact corresponding source is also made diff --git a/ui/title_screen.tscn b/ui/title_screen.tscn index 852fd71..22f00f2 100644 --- a/ui/title_screen.tscn +++ b/ui/title_screen.tscn @@ -213,7 +213,7 @@ unique_name_in_owner = true layout_mode = 2 theme_override_colors/font_color = Color(0.682, 0.733, 0.761, 1) theme_override_font_sizes/font_size = 22 -text = "v0.20.1-alpha" +text = "v0.20.2-alpha" horizontal_alignment = 1 [node name="Spacer" type="Control" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent"] From eed361681a50ca94be043624f218980873ba7046 Mon Sep 17 00:00:00 2001 From: Voyager Date: Mon, 31 Aug 2026 16:03:21 -0400 Subject: [PATCH 20/37] Import completed creature artwork --- art/exported/creatures/2502.png | Bin 0 -> 5970 bytes art/exported/creatures/2502.png.import | 42 ++++++++++++++++++ art/exported/creatures/2504.png | Bin 0 -> 1683 bytes art/exported/creatures/2504.png.import | 42 ++++++++++++++++++ art/exported/creatures/2505.png | Bin 0 -> 1473 bytes art/exported/creatures/2505.png.import | 42 ++++++++++++++++++ art/exported/creatures/2508.png | Bin 0 -> 1622 bytes art/exported/creatures/2508.png.import | 42 ++++++++++++++++++ art/exported/creatures/2601.png | Bin 0 -> 2345 bytes art/exported/creatures/2601.png.import | 42 ++++++++++++++++++ art/exported/creatures/2801.png | Bin 0 -> 1607 bytes art/exported/creatures/2801.png.import | 42 ++++++++++++++++++ art/exported/creatures/2802.png | Bin 0 -> 1768 bytes art/exported/creatures/2802.png.import | 42 ++++++++++++++++++ art/exported/creatures/2803.png | Bin 0 -> 1629 bytes art/exported/creatures/2803.png.import | 42 ++++++++++++++++++ art/exported/creatures/2804.png | Bin 0 -> 2307 bytes art/exported/creatures/2804.png.import | 42 ++++++++++++++++++ art/exported/creatures/2806.png | Bin 0 -> 1992 bytes art/exported/creatures/2806.png.import | 42 ++++++++++++++++++ art/exported/creatures/2807.png | Bin 0 -> 1549 bytes art/exported/creatures/2807.png.import | 42 ++++++++++++++++++ art/exported/creatures/3002.png | Bin 0 -> 3594 bytes art/exported/creatures/3002.png.import | 42 ++++++++++++++++++ art/exported/creatures/3102.png | Bin 0 -> 3066 bytes art/exported/creatures/3102.png.import | 42 ++++++++++++++++++ art/exported/creatures/3103.png | Bin 0 -> 3237 bytes art/exported/creatures/3103.png.import | 42 ++++++++++++++++++ art/exported/creatures/3104.png | Bin 0 -> 3156 bytes art/exported/creatures/3104.png.import | 42 ++++++++++++++++++ art/exported/creatures/3107.png | Bin 0 -> 3375 bytes art/exported/creatures/3107.png.import | 42 ++++++++++++++++++ art/exported/creatures/3201.png | Bin 0 -> 2361 bytes art/exported/creatures/3201.png.import | 42 ++++++++++++++++++ art/exported/creatures/3401.png | Bin 0 -> 2252 bytes art/exported/creatures/3401.png.import | 42 ++++++++++++++++++ art/exported/creatures/3902.png | Bin 0 -> 4205 bytes art/exported/creatures/3902.png.import | 42 ++++++++++++++++++ art/exported/creatures/4101.png | Bin 0 -> 1328 bytes art/exported/creatures/4101.png.import | 42 ++++++++++++++++++ art/exported/creatures/5001.png | Bin 0 -> 3151 bytes art/exported/creatures/5001.png.import | 42 ++++++++++++++++++ art/exported/creatures/5902.png | Bin 0 -> 2897 bytes art/exported/creatures/5902.png.import | 42 ++++++++++++++++++ art/exported/creatures/5903.png | Bin 0 -> 2317 bytes art/exported/creatures/5903.png.import | 42 ++++++++++++++++++ art/exported/creatures/5904.png | Bin 0 -> 2722 bytes art/exported/creatures/5904.png.import | 42 ++++++++++++++++++ art/exported/creatures/6001.png | Bin 0 -> 2757 bytes art/exported/creatures/6001.png.import | 42 ++++++++++++++++++ art/exported/creatures/6406.png | Bin 0 -> 4084 bytes art/exported/creatures/6406.png.import | 42 ++++++++++++++++++ art/exported/creatures/6601.png | Bin 0 -> 1129 bytes art/exported/creatures/6601.png.import | 42 ++++++++++++++++++ art/exported/creatures/6801.png | Bin 0 -> 2238 bytes art/exported/creatures/6801.png.import | 42 ++++++++++++++++++ art/exported/creatures/6807.png | Bin 0 -> 2061 bytes art/exported/creatures/6807.png.import | 42 ++++++++++++++++++ art/exported/creatures/6901.png | Bin 0 -> 7209 bytes art/exported/creatures/6901.png.import | 42 ++++++++++++++++++ art/exported/creatures/6902.png | Bin 0 -> 5800 bytes art/exported/creatures/6902.png.import | 42 ++++++++++++++++++ art/exported/creatures/6904.png | Bin 0 -> 2693 bytes art/exported/creatures/6904.png.import | 42 ++++++++++++++++++ fish/species/bluegill/bluegill.tres | 2 +- fish/species/bream_common/bream_common.tres | 2 +- fish/species/chub_creek/chub_creek.tres | 2 +- fish/species/chub_european/chub_european.tres | 2 +- fish/species/chub_lake/chub_lake.tres | 2 +- fish/species/clam_manila/clam_manila.tres | 2 +- fish/species/crab_blue/crab_blue.tres | 8 +++- fish/species/crappie_white/crappie_white.tres | 2 +- .../crayfish_red_swamp.tres | 2 +- .../croaker_atlantic/croaker_atlantic.tres | 2 +- .../croaker_yellowfin/croaker_yellowfin.tres | 2 +- .../damselfish_sergeant_major.tres | 2 +- fish/species/goby_round/goby_round.tres | 2 +- fish/species/goldfish/goldfish.tres | 2 +- fish/species/green_sunfish/green_sunfish.tres | 2 +- .../grunt_bluestriped/grunt_bluestriped.tres | 2 +- fish/species/grunt_french/grunt_french.tres | 2 +- .../halfbeak_ballyhoo/halfbeak_ballyhoo.tres | 2 +- .../minnow_fathead/minnow_fathead.tres | 2 +- fish/species/porgy_scup/porgy_scup.tres | 2 +- fish/species/pumpkinseed/pumpkinseed.tres | 2 +- fish/species/roach_common/roach_common.tres | 2 +- .../rockfish_black/rockfish_black.tres | 2 +- fish/species/rudd/rudd.tres | 2 +- .../sea_bass_black/sea_bass_black.tres | 2 +- fish/species/shiner_common/shiner_common.tres | 2 +- .../shiner_emerald/shiner_emerald.tres | 2 +- fish/species/shiner_golden/shiner_golden.tres | 2 +- fish/species/smelt_rainbow/smelt_rainbow.tres | 2 +- fish/species/snapper_lane/snapper_lane.tres | 2 +- fish/species/sunfish/sunfish.tres | 2 +- fish/species/yellow_perch/yellow_perch.tres | 2 +- 96 files changed, 1381 insertions(+), 33 deletions(-) create mode 100644 art/exported/creatures/2502.png create mode 100644 art/exported/creatures/2502.png.import create mode 100644 art/exported/creatures/2504.png create mode 100644 art/exported/creatures/2504.png.import create mode 100644 art/exported/creatures/2505.png create mode 100644 art/exported/creatures/2505.png.import create mode 100644 art/exported/creatures/2508.png create mode 100644 art/exported/creatures/2508.png.import create mode 100644 art/exported/creatures/2601.png create mode 100644 art/exported/creatures/2601.png.import create mode 100644 art/exported/creatures/2801.png create mode 100644 art/exported/creatures/2801.png.import create mode 100644 art/exported/creatures/2802.png create mode 100644 art/exported/creatures/2802.png.import create mode 100644 art/exported/creatures/2803.png create mode 100644 art/exported/creatures/2803.png.import create mode 100644 art/exported/creatures/2804.png create mode 100644 art/exported/creatures/2804.png.import create mode 100644 art/exported/creatures/2806.png create mode 100644 art/exported/creatures/2806.png.import create mode 100644 art/exported/creatures/2807.png create mode 100644 art/exported/creatures/2807.png.import create mode 100644 art/exported/creatures/3002.png create mode 100644 art/exported/creatures/3002.png.import create mode 100644 art/exported/creatures/3102.png create mode 100644 art/exported/creatures/3102.png.import create mode 100644 art/exported/creatures/3103.png create mode 100644 art/exported/creatures/3103.png.import create mode 100644 art/exported/creatures/3104.png create mode 100644 art/exported/creatures/3104.png.import create mode 100644 art/exported/creatures/3107.png create mode 100644 art/exported/creatures/3107.png.import create mode 100644 art/exported/creatures/3201.png create mode 100644 art/exported/creatures/3201.png.import create mode 100644 art/exported/creatures/3401.png create mode 100644 art/exported/creatures/3401.png.import create mode 100644 art/exported/creatures/3902.png create mode 100644 art/exported/creatures/3902.png.import create mode 100644 art/exported/creatures/4101.png create mode 100644 art/exported/creatures/4101.png.import create mode 100644 art/exported/creatures/5001.png create mode 100644 art/exported/creatures/5001.png.import create mode 100644 art/exported/creatures/5902.png create mode 100644 art/exported/creatures/5902.png.import create mode 100644 art/exported/creatures/5903.png create mode 100644 art/exported/creatures/5903.png.import create mode 100644 art/exported/creatures/5904.png create mode 100644 art/exported/creatures/5904.png.import create mode 100644 art/exported/creatures/6001.png create mode 100644 art/exported/creatures/6001.png.import create mode 100644 art/exported/creatures/6406.png create mode 100644 art/exported/creatures/6406.png.import create mode 100644 art/exported/creatures/6601.png create mode 100644 art/exported/creatures/6601.png.import create mode 100644 art/exported/creatures/6801.png create mode 100644 art/exported/creatures/6801.png.import create mode 100644 art/exported/creatures/6807.png create mode 100644 art/exported/creatures/6807.png.import create mode 100644 art/exported/creatures/6901.png create mode 100644 art/exported/creatures/6901.png.import create mode 100644 art/exported/creatures/6902.png create mode 100644 art/exported/creatures/6902.png.import create mode 100644 art/exported/creatures/6904.png create mode 100644 art/exported/creatures/6904.png.import diff --git a/art/exported/creatures/2502.png b/art/exported/creatures/2502.png new file mode 100644 index 0000000000000000000000000000000000000000..467431b449e65f3034dfc091fbcf0534f427dee8 GIT binary patch literal 5970 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 TT$uRB$^mLhnu;~@mf`;ccK=x5 literal 0 HcmV?d00001 diff --git a/art/exported/creatures/2502.png.import b/art/exported/creatures/2502.png.import new file mode 100644 index 0000000..17bcad9 --- /dev/null +++ b/art/exported/creatures/2502.png.import @@ -0,0 +1,42 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://busj0feq2dncu" +path.s3tc="res://.godot/imported/2502.png-3922e306611b91541a86520cf32cbdbd.s3tc.ctex" +path.etc2="res://.godot/imported/2502.png-3922e306611b91541a86520cf32cbdbd.etc2.ctex" +metadata={ +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true +} + +[deps] + +source_file="res://art/exported/creatures/2502.png" +dest_files=["res://.godot/imported/2502.png-3922e306611b91541a86520cf32cbdbd.s3tc.ctex", "res://.godot/imported/2502.png-3922e306611b91541a86520cf32cbdbd.etc2.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/art/exported/creatures/2504.png b/art/exported/creatures/2504.png new file mode 100644 index 0000000000000000000000000000000000000000..d0279d826c0ff9a749d3d912a6eefcfb20b274bf GIT binary patch literal 1683 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 P00000NkvXXu0mjf0=tY! literal 0 HcmV?d00001 diff --git a/art/exported/creatures/2601.png.import b/art/exported/creatures/2601.png.import new file mode 100644 index 0000000..7444643 --- /dev/null +++ b/art/exported/creatures/2601.png.import @@ -0,0 +1,42 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d14jvhurcfryb" +path.s3tc="res://.godot/imported/2601.png-912942ea4c6b2c66982e089ee46fde12.s3tc.ctex" +path.etc2="res://.godot/imported/2601.png-912942ea4c6b2c66982e089ee46fde12.etc2.ctex" +metadata={ +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true +} + +[deps] + +source_file="res://art/exported/creatures/2601.png" +dest_files=["res://.godot/imported/2601.png-912942ea4c6b2c66982e089ee46fde12.s3tc.ctex", "res://.godot/imported/2601.png-912942ea4c6b2c66982e089ee46fde12.etc2.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/art/exported/creatures/2801.png b/art/exported/creatures/2801.png new file mode 100644 index 0000000000000000000000000000000000000000..ad8294db2ae8f27040de1a27e0fbb41580e78a20 GIT binary patch literal 1607 zcmV-N2Dtf&P)+iT&ZCckc4laq!A@zRg+AEUg6&omD29g8*6pe!_zJihwctKNVpcaK{zI~e z#;kvV(HI^kpc_}T5>R%1Y*rT*LEEA&P+Nr7LQ9cShCZfqXU^u_c2*wKLV?s|J)h)e z&Ybt}dw=J5eisx9g+ifFC=?2XLZMJ76bgkxq4+6q17S_m`uQ1gA0T{FCX1@F5;3p7w8R@=I*}}Qz zpIY zs>({RS*;|w6ZxXHfx8#a$D&*0&>eurIHBF(*swINx*~hjj$a+^j#}S!zMtb==Lriz zd|WK^Z=cQnuf8$P_4p$mb2C^1?7qlW?M4L9q|vglsxoKHI~hrc2m`?o^(VSyaUDD3kO;{@%LQ7 z<R{#ThsWdvcDtR#L?>NcrvBiUmcid-_qc{^f1E2^yhM4SMF0UtQH`DUx9r7$JiTem~7E-_qIHfnk`2 zT)}^ioF=#6m!`pc4;~^rBOSLZ!ED>U4d{g+t!&NkX{3=a;Cs>`tIH#Bc4jpb8lK{V6wiriT z%$N)`j1ZcxVbS#w+b6l5oa&TE#K3N|;YoIPc6Oa@2Yh1@psu;TwqQ<{i%lzYxvi*} zyqrwt6&Dbfl*;uYMf~H6yRUn^)oSJlQHjmClfTwH#luU>$;wFM+heWNH8gQ=`CV8n zddl`4ABvHVyERH({{H3;_Ig4+rwB8&5t+f|=G|&8+Sm3a3+7~# z;q#C@eD+4eHhBh?grVRnF}mB(<6Y=>2O)na!LDW^*FaDKpZ&TFVFf2SK9%gPzvBlcJt4FA7tU3g?!g~QpSkQz++bv zKq4By_!P^8B%+a(o5#_{uUY%tGX#1%NYH!P_Gt?%7G(}kDa>nX^FNx*{C2CoWnr`Gyt3=?6&;fjVp&q?V`7}m6tFK~ zurl)$v`af06_JV6zS6*#X z`9Hu8)LbUmxP1;Q6bgkxp-?Ck3WY+UP$(1%g@T_E{{=jGAIqaMHNF4<002ovPDHLk FV1jS@AI$&& literal 0 HcmV?d00001 diff --git a/art/exported/creatures/2801.png.import b/art/exported/creatures/2801.png.import new file mode 100644 index 0000000..512f812 --- /dev/null +++ b/art/exported/creatures/2801.png.import @@ -0,0 +1,42 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cc7el34sfad78" +path.s3tc="res://.godot/imported/2801.png-d1c5df9faa2d1eb1cc3453c8e18d4049.s3tc.ctex" +path.etc2="res://.godot/imported/2801.png-d1c5df9faa2d1eb1cc3453c8e18d4049.etc2.ctex" +metadata={ +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true +} + +[deps] + +source_file="res://art/exported/creatures/2801.png" +dest_files=["res://.godot/imported/2801.png-d1c5df9faa2d1eb1cc3453c8e18d4049.s3tc.ctex", "res://.godot/imported/2801.png-d1c5df9faa2d1eb1cc3453c8e18d4049.etc2.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/art/exported/creatures/2802.png b/art/exported/creatures/2802.png new file mode 100644 index 0000000000000000000000000000000000000000..419061017872f8b48bafd6365007c1abfb9ebe35 GIT binary patch literal 1768 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 bg5dBIZ?g@-{Qj^A00000NkvXXu0mjfvK~AU literal 0 HcmV?d00001 diff --git a/art/exported/creatures/2803.png.import b/art/exported/creatures/2803.png.import new file mode 100644 index 0000000..5096057 --- /dev/null +++ b/art/exported/creatures/2803.png.import @@ -0,0 +1,42 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cjwm07240ehr2" +path.s3tc="res://.godot/imported/2803.png-c2e31a8adbab3bf9899bc74b3feb4abb.s3tc.ctex" +path.etc2="res://.godot/imported/2803.png-c2e31a8adbab3bf9899bc74b3feb4abb.etc2.ctex" +metadata={ +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true +} + +[deps] + +source_file="res://art/exported/creatures/2803.png" +dest_files=["res://.godot/imported/2803.png-c2e31a8adbab3bf9899bc74b3feb4abb.s3tc.ctex", "res://.godot/imported/2803.png-c2e31a8adbab3bf9899bc74b3feb4abb.etc2.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/art/exported/creatures/2804.png b/art/exported/creatures/2804.png new file mode 100644 index 0000000000000000000000000000000000000000..90952fdca6a853fc0796933cf9a3a4813a9a5222 GIT binary patch literal 2307 zcmV+e3H2fF>y(w5Jdr%B?u#+FzmC>yFKqgA{x*kVzuOb{sAuc{oe2U zyZ3(YeHRcA5D*X$5D*X$5D*X$5D<7cC;)7i0*UyR!3;@^BvZzu5VOHR-ulffGBVTB z4nTr|3?pKWMutc5f|Kkv5^c7Sy|2$CHnW-R&zr%w@6Ve>0L;YzBtOP%AsNZBBr~N` z{GKf{h|Ods`?h|E?0bDC(QCDQ5%z4I!4-jekjc>f94ivQ8~}d>umix)0Av6Vcl8l( zd&xAerK24w@nLW_2l3MUB&^v{fGsPAW6|1ttl3creS`=dt^mXgpWZ<{K&bnCUTxIN zYwH@^$~c=8k>NDxZV_1mxZEtR-wdGL#e!u!+chdJlyU`FmW510Y{2&>4aTe6Pf-0?fG24h|Hw&~_xV9W zfJ%oSbqxW~G>yn`C1g?!Bn;pW0(A`ye0#V?g{2FIz+zD0ndR??oTpOGEXz#N<}G}B z1d6XzAu}x=MOSWOSSRBEKvr$bF7O0Tc?$xrPaGBz+!cm zzw{)6d-2OUjcC)_1qRf)!jKqm=fxLZyb3}nSWN~j+4!#|U7plqfV+_?W~hQ;sWNaH zMIstQ609h?+Ju~R&hJ7)O-qp=yLbPafp$22Enq?553p$K@WWB>!ly+IXm0cI%ZHmO zL6$%vr7=E339p|;b32O(qwKdQo)(X5jvM&nflH{YY3)@f)$2bfT+d3DnWU1=E~7JV zy}+bs#Al^$42rh$N!>|Syd7XDK-@$48Xw^8bw=KXQ+y$$ewV9#kZO#Gkh{?Ak@Gp3 z)vefh$c@s9#=8zO)0_Ax9m9)%cD(k>bnrz>1Xz}!)}=$by#XqP6Z+^8JqG6LQeM@H z>e>z{6%0JyAnF?2C@gO5v1mOLn)xr7M8go~xv@0MZ3^eni%4%B;eSoD1z6zmP`I^si& zxt;fj{=jh~qR-Fx0|Zhrg_tmB_h#-8_Qt)QrM}ic!JU&XmsQvMp%hEd>ZVZJ(1G=H zvSBx9@Miue7@K{|5At?jLQDLD3VC8n57 zeDl%sRXBdJ8Vzl3e*3i;)hNH#v>U()0NfOu20+I649VkiI&Kp$qG<$K7Om|rjLizi zbFHIyM%|HhcuTJsh!SDPqh@+;Dm^_3>1^b*LEce{{9C ze3Q9x8%XG?)QrnMWyc8SBgM@ z1!t0L=0|oKpC7nZEytY4#jqI~F>gf){)0;PD1H@ssY7YY719sR9R16*$%bSiIu-RGqWA4Q$t*%jG)% zyFG3W!N`c# zm_?=Bn;tFh{Ynr4N~(X_Jd{bS-H)C`+uxeMN;DQ z(5fZacjyXN(U4CNT@lyxstYCK+IfQsG+7b$%Q2_&N|3 z&L9{h$V`yA3$J<}8AGG{JK%}4)hUDxA|gxB&|| z#Nw~+4Ue2~K&!s(F!oTP9%S$&yN;~+$!Pu@e!09FWmQeE8dXTN+pzGJBh)}N!Q0^O z;|fda*{l>Jm7HKhjDdzc%nH9hv^&9p1O;FMfOG(xCXb2z_EkVYKtMo1KtMo1KtMo1 dKmd;l{{>!SBn$KX*Y5xT002ovPDHLkV1f`2Xm$Vq literal 0 HcmV?d00001 diff --git a/art/exported/creatures/2804.png.import b/art/exported/creatures/2804.png.import new file mode 100644 index 0000000..e6147c2 --- /dev/null +++ b/art/exported/creatures/2804.png.import @@ -0,0 +1,42 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dgcrfxo1k4juj" +path.s3tc="res://.godot/imported/2804.png-f86c52a01f04302b057cf526a498e87a.s3tc.ctex" +path.etc2="res://.godot/imported/2804.png-f86c52a01f04302b057cf526a498e87a.etc2.ctex" +metadata={ +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true +} + +[deps] + +source_file="res://art/exported/creatures/2804.png" +dest_files=["res://.godot/imported/2804.png-f86c52a01f04302b057cf526a498e87a.s3tc.ctex", "res://.godot/imported/2804.png-f86c52a01f04302b057cf526a498e87a.etc2.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/art/exported/creatures/2806.png b/art/exported/creatures/2806.png new file mode 100644 index 0000000000000000000000000000000000000000..acb930e82266c70893c62d08beac6e04f939ce21 GIT binary patch literal 1992 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 literal 0 HcmV?d00001 diff --git a/art/exported/creatures/2807.png.import b/art/exported/creatures/2807.png.import new file mode 100644 index 0000000..af51ff5 --- /dev/null +++ b/art/exported/creatures/2807.png.import @@ -0,0 +1,42 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bdus4qo0ebs3e" +path.s3tc="res://.godot/imported/2807.png-aceaf0f586f975d29e318a9513fc3125.s3tc.ctex" +path.etc2="res://.godot/imported/2807.png-aceaf0f586f975d29e318a9513fc3125.etc2.ctex" +metadata={ +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true +} + +[deps] + +source_file="res://art/exported/creatures/2807.png" +dest_files=["res://.godot/imported/2807.png-aceaf0f586f975d29e318a9513fc3125.s3tc.ctex", "res://.godot/imported/2807.png-aceaf0f586f975d29e318a9513fc3125.etc2.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/art/exported/creatures/3002.png b/art/exported/creatures/3002.png new file mode 100644 index 0000000000000000000000000000000000000000..2ae7e7339d52b9fe8ccc1765cb2fba17b99c59d6 GIT binary patch literal 3594 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 QC;$Ke07*qoM6N<$f?Ew300000 literal 0 HcmV?d00001 diff --git a/art/exported/creatures/3002.png.import b/art/exported/creatures/3002.png.import new file mode 100644 index 0000000..e193cfd --- /dev/null +++ b/art/exported/creatures/3002.png.import @@ -0,0 +1,42 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b68vlgtclvkfg" +path.s3tc="res://.godot/imported/3002.png-a87d71158798b43b6bf702a6e1664b4d.s3tc.ctex" +path.etc2="res://.godot/imported/3002.png-a87d71158798b43b6bf702a6e1664b4d.etc2.ctex" +metadata={ +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true +} + +[deps] + +source_file="res://art/exported/creatures/3002.png" +dest_files=["res://.godot/imported/3002.png-a87d71158798b43b6bf702a6e1664b4d.s3tc.ctex", "res://.godot/imported/3002.png-a87d71158798b43b6bf702a6e1664b4d.etc2.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/art/exported/creatures/3102.png b/art/exported/creatures/3102.png new file mode 100644 index 0000000000000000000000000000000000000000..fe4d8fb4e88cf2fea72caac4f28d2cbd6a67567f GIT binary patch literal 3066 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 IM6N<$f}L)_q5uE@ literal 0 HcmV?d00001 diff --git a/art/exported/creatures/3102.png.import b/art/exported/creatures/3102.png.import new file mode 100644 index 0000000..47e9c80 --- /dev/null +++ b/art/exported/creatures/3102.png.import @@ -0,0 +1,42 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c4d3f28rf86bb" +path.s3tc="res://.godot/imported/3102.png-951ca90331737e3057749e1bdbd88c44.s3tc.ctex" +path.etc2="res://.godot/imported/3102.png-951ca90331737e3057749e1bdbd88c44.etc2.ctex" +metadata={ +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true +} + +[deps] + +source_file="res://art/exported/creatures/3102.png" +dest_files=["res://.godot/imported/3102.png-951ca90331737e3057749e1bdbd88c44.s3tc.ctex", "res://.godot/imported/3102.png-951ca90331737e3057749e1bdbd88c44.etc2.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/art/exported/creatures/3103.png b/art/exported/creatures/3103.png new file mode 100644 index 0000000000000000000000000000000000000000..3d3d615899c08b9d5d5fd2c95ec2c437b2305e61 GIT binary patch literal 3237 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 Xz98;3y5|{k00000NkvXXu0mjfh66BL literal 0 HcmV?d00001 diff --git a/art/exported/creatures/3103.png.import b/art/exported/creatures/3103.png.import new file mode 100644 index 0000000..9743e89 --- /dev/null +++ b/art/exported/creatures/3103.png.import @@ -0,0 +1,42 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cjtncgnb0hcsj" +path.s3tc="res://.godot/imported/3103.png-f3b4b5bb43b7611f7c448dbdfff36375.s3tc.ctex" +path.etc2="res://.godot/imported/3103.png-f3b4b5bb43b7611f7c448dbdfff36375.etc2.ctex" +metadata={ +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true +} + +[deps] + +source_file="res://art/exported/creatures/3103.png" +dest_files=["res://.godot/imported/3103.png-f3b4b5bb43b7611f7c448dbdfff36375.s3tc.ctex", "res://.godot/imported/3103.png-f3b4b5bb43b7611f7c448dbdfff36375.etc2.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/art/exported/creatures/3104.png b/art/exported/creatures/3104.png new file mode 100644 index 0000000000000000000000000000000000000000..425932e656cb59e81061b73bc709a3b7bade1871 GIT binary patch literal 3156 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 D{7Ein literal 0 HcmV?d00001 diff --git a/art/exported/creatures/3902.png.import b/art/exported/creatures/3902.png.import new file mode 100644 index 0000000..a8e5440 --- /dev/null +++ b/art/exported/creatures/3902.png.import @@ -0,0 +1,42 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ddc556gcby50v" +path.s3tc="res://.godot/imported/3902.png-485bc4f9f1a505225bdc037111e32499.s3tc.ctex" +path.etc2="res://.godot/imported/3902.png-485bc4f9f1a505225bdc037111e32499.etc2.ctex" +metadata={ +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true +} + +[deps] + +source_file="res://art/exported/creatures/3902.png" +dest_files=["res://.godot/imported/3902.png-485bc4f9f1a505225bdc037111e32499.s3tc.ctex", "res://.godot/imported/3902.png-485bc4f9f1a505225bdc037111e32499.etc2.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/art/exported/creatures/4101.png b/art/exported/creatures/4101.png new file mode 100644 index 0000000000000000000000000000000000000000..74a068baa7949253fd50bda29cc2d620a4255518 GIT binary patch literal 1328 zcmV-01<(44P)ab~&) zCYzaa(?GH~V_Y(q8E3L=naWg_A#T8!fRl%W4RzAeho$X3%e@txLa{@pe|SDgY0vFB z=brPs=lo6q7=~dOhG7_nVHk#C7=~dOhGFhKv&m@i;{jAKJvN4ZzjY}+wBvPpuWv5k zKH>1PKrTc&Ldd7?civPDP&{>ZOk0Ubw)+% zG07AKd9EB6=!WNcgoSCL3)evu^-ycnARq{~u_eDB9Ubj(IvnT^nylC9LQ{Jul_*^f zU>`=$bO67PBmf4EBi)t>W86L z|CJmVr_+g!jt)2+j)6eQu3T}UvGMXP^=s?u@mo_fyuQGxsnu%Xa=9V^I0zw9oY_R= zEho#FmkEo-h@#T+A?HhijOppL#P~zx#<$(QHeCC=7YVTwFlT-WrcI53(P)IlV!?{F z+p*_^&B{|f-{OYX7kHY=-~IBQl~Re}5T--A-L zx3{6!ZpT%dUCB8Gg;r=ZBk1?I^FrX9tenl0ct-HdlG~`+bmi(!O2mv3%8gRFY`OD?nyhoR`_WC^rLI zQJxUNk)z*WVP5XQB;%%~VSi_+d9K2pHRI1^Zxy$8( zAP7*a)q}n}{@oYw_IU=%e_g(YEn6#4yeuDO8#m+hsXA0tR9yP@hvO6f-Hs4KEfdU$ zjL_lbl7-5(qSA6XN`n#<8FqAm24AmPRh+l7q)?fRoS@{0zx)0kl)bS+sWdfVCKg$r zgmrELW-oXS=T4u)o9~pPqw^A?qsQZ7Yb!jSJ|#iQZJ&5N71XCf=B!zmk(`X5&YZ@= zCG#Os3WHvR!C-*RX2aHP<@oZeqnI)!76&VL;6m$lP!Oc1B_KX2V<&)hcNqUfLP&dB z;xr`?MWy8-C&5t7lXDV)i*jLRY62}TuwriRQYBFGgeO~4Z@-T!#yqaC>claeIaP=0 z@sp5}F=x1OkiEMXrBWpQVxNQhwqSA`h7A_2K(R+!Mnv48t%C m!!QiPFbu;m48t%CM#n$tjk!olS=gEY00001pYE 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 literal 0 HcmV?d00001 diff --git a/art/exported/creatures/5001.png.import b/art/exported/creatures/5001.png.import new file mode 100644 index 0000000..c87c852 --- /dev/null +++ b/art/exported/creatures/5001.png.import @@ -0,0 +1,42 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://byil5mr6w3j1q" +path.s3tc="res://.godot/imported/5001.png-ebe37fb8bd4263bb83e36bb5890b5641.s3tc.ctex" +path.etc2="res://.godot/imported/5001.png-ebe37fb8bd4263bb83e36bb5890b5641.etc2.ctex" +metadata={ +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true +} + +[deps] + +source_file="res://art/exported/creatures/5001.png" +dest_files=["res://.godot/imported/5001.png-ebe37fb8bd4263bb83e36bb5890b5641.s3tc.ctex", "res://.godot/imported/5001.png-ebe37fb8bd4263bb83e36bb5890b5641.etc2.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/art/exported/creatures/5902.png b/art/exported/creatures/5902.png new file mode 100644 index 0000000000000000000000000000000000000000..809057d320c15837b754b821c64965b0d8e380a5 GIT binary patch literal 2897 zcmV-X3$FBuP)lj;^rba{GvV`y!k7I+b&ma{B_8fh?eb z$z(_tLK>kc$_Kw^5C#Kceq% z{mP-#t{GxDJ#Vaq2Rekab>~qIo%E6LpkIh)8TJGhjVO23y*F)VQf29u1%Y~-Qp+erEGK@2F242>tO$Du4C zM8Gc`OVqQE$!q4k7{SJrG`e5rMCn=$zgBHRLPF6yuYJFwvDmtF)cK+G#&;qjSp`z$Ox6UVZpaTP0;H>xpwTkdUWTr+oK6SnS5Bf#H`!BD7K z2olPANBXq}P+crIP(D5I+0V6`@ej}D)4fkKEOH?;)+JyHEFjlx*Jj>kbYeDos8=DK z>+V1X)m^N;6SqH+7C{F{&#upeh*vQgv>4UM&Q<92f|0g8M-mWRjdSaxSu&*(6+0Yo z3L)%e4Ql4-yTz#fA#B{1hQ$o`w{NJq|G3xPoV)BRQ>W=yiWehBEn)VP^MUx{!i=oD znYMNsA@wdYyuo|LE&fBR${EyIUw*mpFq#B2uoOJdW4`s_b+mPg0^#D@8mSfADi>$PNt&UBHN zCu-fQZ|N6^j}H&EP2Kfz1c~dW;AcEZQ~ycYgW+_Geqr5Y<4SupibN}8kPSx_|e~$q|`adx%qgwR{ydF0u z*+RR3J{->*O=dwyt%7>L-L{%8)i%>14|Q`vTvCV>a3=68WQ<<;fCY}6#$v*ud3xPn7h zLV2bO^ca)QYZGen$+aYW!oZ2;J=nCzds`2e$|`@P`vhOZ@XlPla*A*FUEos2Vw$uX z$Kl=c85X?=BQ9D8JYD=kifxT1ZvK(+jBPwm3xoE~LC83?=kKiXFubRX@x~(Rl0w*H zU7)#d5gpq!z+}4h$~^Pi5wvoRDeiOA;+b?E9D`kCkn-U_+461!&HWQUF5tj1<+cVe zl~!mpnl$k$cLmqR>pg}$&%x!>=b6wii^c(cN(c||9ig+c7h8A2HCqtdcK$$TdXbqW zcz>;j@NSc-`B*qc!!x*~O6<12uhlOSuVCXV+cLI)FSOjDq8jr`er4V~S}0aR;U3o{ z+}0qi&(^Nzv^M-A6!P#gAb1M%j^(rC>vXOD11*iJ0d}cTdMg7+rId*mCay1O5OO%a zXCQs=mpPEXQY&j)u`d_p9#r?P<%~RlW1jBRmA6pGvsjDS0r5`853GWt(L#(Sv-VE7 zXFip^J4&>zicy6WamqA^^KvgbIG@5qKHF`{2uxJzKA4Y{_*Aml$!MR=e&hW z2`S#*w#n|rGl@ax)IrH1Wh|eVaf0o@9m42Kes2zi83DS zytO=wb#FK0^hGzJ)huK=6q3?raOTKfhK9Y$1-Un;$yl)eYTlpiGi5V+^&RR6~_9i9Ez zW&4<&?>&hpxCiZ{Mo>xF!{}BUFiHv^toVT!-gMnErdu~QiHT3i+W)jmLHu(-Wm0yf z(Q8tEsV72-Uxshkh>s+H|DT6nA*+((=`pr&O;<5cfWUx+7n?7WR_-x3iB;38x;wFo zYqW6<*UArCrjT6_#Cr+Di63I7UiJSv=YmxQI9xKD-)%&N_WSPxzPZhK#pko_bZ*xW zcY#maIBnj3R85NN4$}2o3{ZrhB;n}N^?4dcJXD+%i`Z^ki4X=gM)>kyvpDhHcCCx} zxk)s27apF}jK16YE?(^TB&)V!ES()q?oa2jSk1W&Yv4C$Y#`xvLy+adB%70`XkU>k z_!;Rv@uDYnUuNO5atkDh)U2H?ikH9}TVw4JcZhbfZ1kATcJauNc=6y9ycQ6Uj4dLXr>`i>yw%b{UO^(}4QPtJQ7x>J?iz^;7ItNysKiSj`6UO9iB) zbkZ`G+IMzp3vE1h%gx(ji917Nc4~_qnb$oWJbXg!6rT^;-`4<})xh4vxg0*>AGR{gfklzFFD`tEI5{m_1X}AN51V|0T`; v>H+BJ=;-L^=;-L^=;-L^=;-L^P|SY-Dr###yCjbl00000NkvXXu0mjfo@2x| literal 0 HcmV?d00001 diff --git a/art/exported/creatures/5902.png.import b/art/exported/creatures/5902.png.import new file mode 100644 index 0000000..2c8a5fb --- /dev/null +++ b/art/exported/creatures/5902.png.import @@ -0,0 +1,42 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://0k4qnt7wusam" +path.s3tc="res://.godot/imported/5902.png-e3a13a1e827488fa86f34c2aad883127.s3tc.ctex" +path.etc2="res://.godot/imported/5902.png-e3a13a1e827488fa86f34c2aad883127.etc2.ctex" +metadata={ +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true +} + +[deps] + +source_file="res://art/exported/creatures/5902.png" +dest_files=["res://.godot/imported/5902.png-e3a13a1e827488fa86f34c2aad883127.s3tc.ctex", "res://.godot/imported/5902.png-e3a13a1e827488fa86f34c2aad883127.etc2.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/art/exported/creatures/5903.png b/art/exported/creatures/5903.png new file mode 100644 index 0000000000000000000000000000000000000000..74a8af64d12aa97e4540b8aad40520b0923d5c50 GIT binary patch literal 2317 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 literal 0 HcmV?d00001 diff --git a/art/exported/creatures/5904.png.import b/art/exported/creatures/5904.png.import new file mode 100644 index 0000000..23458ae --- /dev/null +++ b/art/exported/creatures/5904.png.import @@ -0,0 +1,42 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dtapwjgdbcgr7" +path.s3tc="res://.godot/imported/5904.png-e43ba3245eadac7081a6a23e64ccc940.s3tc.ctex" +path.etc2="res://.godot/imported/5904.png-e43ba3245eadac7081a6a23e64ccc940.etc2.ctex" +metadata={ +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true +} + +[deps] + +source_file="res://art/exported/creatures/5904.png" +dest_files=["res://.godot/imported/5904.png-e43ba3245eadac7081a6a23e64ccc940.s3tc.ctex", "res://.godot/imported/5904.png-e43ba3245eadac7081a6a23e64ccc940.etc2.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/art/exported/creatures/6001.png b/art/exported/creatures/6001.png new file mode 100644 index 0000000000000000000000000000000000000000..921959712933c9f994c4b6b89f4cc35e18778993 GIT binary patch literal 2757 zcmV;$3OeKQiJ3WB%&0NOj2X8Rjk9DC z872x50t7{kilc-C6b%wUje-UgWeL0RmhPIL}d9SK#x%bwsTelkE z;o;%o;o;%o;o;%o;o;%o`Tv6YjpnHm31O)(qXa@B@Jky3LjdZ|?CcLiKmgDHngMjP zRRFF6r~|MBK*xWT0rYh#x?4pA3}1DXhBDdmJtqChtrj8NmMP&k%^wn}4ytGx-abM1HUS|3Lu()uiE;DRb?C|Up`$YiMW;_; z;dVQmDJ_Cbs*72!2XUm(1E22Ojlk)FcyYmEI8JoHB;P5BoazIyV0ey80cstwSma}E z#g!RWfcp?VqT(hLMb(FgJj)e!EjkDwANiG5__D~MpEzvLW0hwaJ<5#xb+xL)-(O^7 zUMT<_EZ?R?z=~3gxA6c)QSh4VhVjAtV*LI4cl1$`sB>DNE zrK<}xLpXOQk82BvMPd>h7{w{QG9?@|^WdQ*A{t{ywxYdT3WqTb2z0E*2)!oEDmCW2Irl2~ z@xKc2riU|@966B*Am))hAR;t|u!^rp2390TKwqZBrnqCn>f6w!i?x|gYZ)xoqY?oQ z)ptCoj}^($P}CfUtG_!+@=s%Gm=E6Y^TwLIZ~E;4ilVqZW~NZU)6$~H8e$Qg13AwmueVZC`p2Y^bNz z-#;x|-PGMJ=_enChciV{XM@}gaO_Mw-dXvk*2{R0k02D#ShPunfu0F_#$HNZlT9S{jLy=4_Gfkdd?W;k>z^^t!$0`=`< zxbja84%`zG5{CBnc4+8DIQDHmHrn+ZuXmZ5m4}9|t_LnOHOQP|7sqj`(dJG#csK*4 z@o{*kpa@@Ixr#MOZ)-JV4M8&^2n8B0F3flP7y`pEFk&kZfdPnkENF=XKn=V-v;?AC zAZ|;As3QXub2q?p8TNqfmB#C#k%wVlW*W>}Z^5Lk5#x3G=5b0%A29e0Kr@_Dx*ZG4d#Og6;K&2 zh1zflz;tj11l5x~4Ms}ZKQLyLDd^fNnCQyz!8ET2W`FlW4OAK67eUUHoPZD#1bF(v z-oc(T!V6y8d!zWhC%|M!OStL3iaG0*=i&u`Mn>vTuMp9i1z+Qr+a|~^ zdmg3+H3)auuch=|?Cl*eRj~w}mc_X7tvhVZhY?pPF}h6mff4s4EQ8@5=n17t35KD; z9_s>%%@w$tC!(hb@%n5rmf*63Sq&Gp7ngHyEINzg&-y-i zur#$1uB=i6bxj1D)75x=juTlh`;#Xe4 z_j7yhCHFFU4;R26>KLs3>z2QmZP>B_wKuNgU2hM}vbBaz;#z3b1E1MjcWuL}6@4C3 zaj_B(cJ_UfPz3D95t^pC?ZiGTi(XDZPI}foBlQG4wyl|+1>Rk3@Wa~A+IkZE2Oty( zh>)W2L1Y+L{(bfVlq{GH(VaO|Gy}KPFR!rn9MS+rhDOSQgD3liYc|tbzc>~nH$#eRUtULOCWmOyc@GdQY;x^PzMw)QP@RMFrJYvB1rxH!G}a?|gPvX6{#b zf{1e7mmaCuEhD-*AY}!mr1a!D^5eJX$;y`!No-UM(bv;w0~zbrTDKiL3+jZif+7ZT zid;#Rk*j-U#L-H?{n}XwNO@ry_jo%BHVjjiT-Feqqaw(bnKQ`NnKQ`w_&7GWXs3x! z2#!#IF6uP5*g`D#2b7+&4INJ({R3aTbqZyd< ztm7^7_T&r!K#JdrH4DY0GFe7GTq@xdIeqjbE5LidayZ3f5UJn(f8vNmLQ=Lrg1j?d zOsc++u?86WGVni2_{9{?06aWAJUl!+JUl!+JUl!+JUl!+_>b~$2qFk=H*``D00000 LNkvXXu0mjfKlUK` literal 0 HcmV?d00001 diff --git a/art/exported/creatures/6001.png.import b/art/exported/creatures/6001.png.import new file mode 100644 index 0000000..a63cf85 --- /dev/null +++ b/art/exported/creatures/6001.png.import @@ -0,0 +1,42 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c0164i40101lq" +path.s3tc="res://.godot/imported/6001.png-6fd8c3ef0885c466baece687cd24d38d.s3tc.ctex" +path.etc2="res://.godot/imported/6001.png-6fd8c3ef0885c466baece687cd24d38d.etc2.ctex" +metadata={ +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true +} + +[deps] + +source_file="res://art/exported/creatures/6001.png" +dest_files=["res://.godot/imported/6001.png-6fd8c3ef0885c466baece687cd24d38d.s3tc.ctex", "res://.godot/imported/6001.png-6fd8c3ef0885c466baece687cd24d38d.etc2.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/art/exported/creatures/6406.png b/art/exported/creatures/6406.png new file mode 100644 index 0000000000000000000000000000000000000000..15c3b8311737e8b6ae585c0df9fc5e6babedb33d GIT binary patch literal 4084 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 vDE5vhiqSg?2qAbFdG$f`@5;a4O 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 literal 0 HcmV?d00001 diff --git a/art/exported/creatures/6904.png.import b/art/exported/creatures/6904.png.import new file mode 100644 index 0000000..75051e3 --- /dev/null +++ b/art/exported/creatures/6904.png.import @@ -0,0 +1,42 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bqh7d4v8jrbpr" +path.s3tc="res://.godot/imported/6904.png-38739e4e48fbb83e3f65074a93d681bb.s3tc.ctex" +path.etc2="res://.godot/imported/6904.png-38739e4e48fbb83e3f65074a93d681bb.etc2.ctex" +metadata={ +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true +} + +[deps] + +source_file="res://art/exported/creatures/6904.png" +dest_files=["res://.godot/imported/6904.png-38739e4e48fbb83e3f65074a93d681bb.s3tc.ctex", "res://.godot/imported/6904.png-38739e4e48fbb83e3f65074a93d681bb.etc2.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/fish/species/bluegill/bluegill.tres b/fish/species/bluegill/bluegill.tres index 1ad5656..181b969 100644 --- a/fish/species/bluegill/bluegill.tres +++ b/fish/species/bluegill/bluegill.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Resource" path="res://fish/day_availability.tres" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/3102.png" id="4_texture"] [resource] script = ExtResource("1_fish_data") diff --git a/fish/species/bream_common/bream_common.tres b/fish/species/bream_common/bream_common.tres index 1c7398c..cc44fef 100644 --- a/fish/species/bream_common/bream_common.tres +++ b/fish/species/bream_common/bream_common.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/2502.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/chub_creek/chub_creek.tres b/fish/species/chub_creek/chub_creek.tres index 1739712..778e9da 100644 --- a/fish/species/chub_creek/chub_creek.tres +++ b/fish/species/chub_creek/chub_creek.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/2802.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/chub_european/chub_european.tres b/fish/species/chub_european/chub_european.tres index a218aec..16f43a1 100644 --- a/fish/species/chub_european/chub_european.tres +++ b/fish/species/chub_european/chub_european.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/2505.png" id="4_texture"] [sub_resource type="Resource" id="ChubEuropeanAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/chub_lake/chub_lake.tres b/fish/species/chub_lake/chub_lake.tres index 6da6b43..1dc2d9a 100644 --- a/fish/species/chub_lake/chub_lake.tres +++ b/fish/species/chub_lake/chub_lake.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/2807.png" id="4_texture"] [sub_resource type="Resource" id="ChubLakeAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/clam_manila/clam_manila.tres b/fish/species/clam_manila/clam_manila.tres index 20e3f8a..2b3fe73 100644 --- a/fish/species/clam_manila/clam_manila.tres +++ b/fish/species/clam_manila/clam_manila.tres @@ -2,7 +2,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] -[ext_resource type="Texture2D" path="res://fish/species/clam_manila/clam_manila.png" id="3_texture"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/6406.png" id="3_texture"] [resource] script = ExtResource("1_fish_data") diff --git a/fish/species/crab_blue/crab_blue.tres b/fish/species/crab_blue/crab_blue.tres index 2ee3279..b715522 100644 --- a/fish/species/crab_blue/crab_blue.tres +++ b/fish/species/crab_blue/crab_blue.tres @@ -1,9 +1,11 @@ -[gd_resource type="Resource" script_class="FishData" load_steps=4 format=3] +[gd_resource type="Resource" script_class="FishData" load_steps=5 format=3] [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/3902.png" id="99_creature_texture"] + [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") allow_night = false @@ -12,7 +14,7 @@ allow_night = false script = ExtResource("1_fish_data") id = &"crab_blue" display_name = "blue crab" -active = false +active = true catalog_number = 3902 collection_group = &"Marine crabs" logbook_fact = "blue crabs swim with flattened rear legs shaped like paddles. bright blue claws and an olive shell conceal a quick, defensive temperament." @@ -30,3 +32,5 @@ weight_max_lb = 1.1 sell_value_min = 3 sell_value_max = 8 sell_value_curve = 0.95 + +display_texture = ExtResource("99_creature_texture") diff --git a/fish/species/crappie_white/crappie_white.tres b/fish/species/crappie_white/crappie_white.tres index 7806c37..6766f1e 100644 --- a/fish/species/crappie_white/crappie_white.tres +++ b/fish/species/crappie_white/crappie_white.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/3107.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/crayfish_red_swamp/crayfish_red_swamp.tres b/fish/species/crayfish_red_swamp/crayfish_red_swamp.tres index b53448d..6c055d2 100644 --- a/fish/species/crayfish_red_swamp/crayfish_red_swamp.tres +++ b/fish/species/crayfish_red_swamp/crayfish_red_swamp.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/2601.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/croaker_atlantic/croaker_atlantic.tres b/fish/species/croaker_atlantic/croaker_atlantic.tres index c35e7de..d0fb147 100644 --- a/fish/species/croaker_atlantic/croaker_atlantic.tres +++ b/fish/species/croaker_atlantic/croaker_atlantic.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/6801.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/croaker_yellowfin/croaker_yellowfin.tres b/fish/species/croaker_yellowfin/croaker_yellowfin.tres index 84885f9..1e282da 100644 --- a/fish/species/croaker_yellowfin/croaker_yellowfin.tres +++ b/fish/species/croaker_yellowfin/croaker_yellowfin.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/6807.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/damselfish_sergeant_major/damselfish_sergeant_major.tres b/fish/species/damselfish_sergeant_major/damselfish_sergeant_major.tres index 483565c..b758404 100644 --- a/fish/species/damselfish_sergeant_major/damselfish_sergeant_major.tres +++ b/fish/species/damselfish_sergeant_major/damselfish_sergeant_major.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/5904.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/goby_round/goby_round.tres b/fish/species/goby_round/goby_round.tres index d8edf5e..3a8ffee 100644 --- a/fish/species/goby_round/goby_round.tres +++ b/fish/species/goby_round/goby_round.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/3401.png" id="4_texture"] [sub_resource type="Resource" id="RoundGobyAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/goldfish/goldfish.tres b/fish/species/goldfish/goldfish.tres index 444741b..58c7934 100644 --- a/fish/species/goldfish/goldfish.tres +++ b/fish/species/goldfish/goldfish.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/3002.png" id="4_texture"] [sub_resource type="Resource" id="GoldfishAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/green_sunfish/green_sunfish.tres b/fish/species/green_sunfish/green_sunfish.tres index fdd1ddd..1733035 100644 --- a/fish/species/green_sunfish/green_sunfish.tres +++ b/fish/species/green_sunfish/green_sunfish.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/3103.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/grunt_bluestriped/grunt_bluestriped.tres b/fish/species/grunt_bluestriped/grunt_bluestriped.tres index 87e9215..5f247a8 100644 --- a/fish/species/grunt_bluestriped/grunt_bluestriped.tres +++ b/fish/species/grunt_bluestriped/grunt_bluestriped.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/5902.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/grunt_french/grunt_french.tres b/fish/species/grunt_french/grunt_french.tres index da0bd90..8e8161e 100644 --- a/fish/species/grunt_french/grunt_french.tres +++ b/fish/species/grunt_french/grunt_french.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/5903.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/halfbeak_ballyhoo/halfbeak_ballyhoo.tres b/fish/species/halfbeak_ballyhoo/halfbeak_ballyhoo.tres index 9512381..6d7fe32 100644 --- a/fish/species/halfbeak_ballyhoo/halfbeak_ballyhoo.tres +++ b/fish/species/halfbeak_ballyhoo/halfbeak_ballyhoo.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/6601.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/minnow_fathead/minnow_fathead.tres b/fish/species/minnow_fathead/minnow_fathead.tres index cf00159..c4a3aff 100644 --- a/fish/species/minnow_fathead/minnow_fathead.tres +++ b/fish/species/minnow_fathead/minnow_fathead.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/2804.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/porgy_scup/porgy_scup.tres b/fish/species/porgy_scup/porgy_scup.tres index 59dd833..ad96831 100644 --- a/fish/species/porgy_scup/porgy_scup.tres +++ b/fish/species/porgy_scup/porgy_scup.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/6904.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/pumpkinseed/pumpkinseed.tres b/fish/species/pumpkinseed/pumpkinseed.tres index 7928e4f..7a4f090 100644 --- a/fish/species/pumpkinseed/pumpkinseed.tres +++ b/fish/species/pumpkinseed/pumpkinseed.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/3104.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/roach_common/roach_common.tres b/fish/species/roach_common/roach_common.tres index 8814f1c..c12d380 100644 --- a/fish/species/roach_common/roach_common.tres +++ b/fish/species/roach_common/roach_common.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/2504.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/rockfish_black/rockfish_black.tres b/fish/species/rockfish_black/rockfish_black.tres index f26a41c..c37b427 100644 --- a/fish/species/rockfish_black/rockfish_black.tres +++ b/fish/species/rockfish_black/rockfish_black.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/6901.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/rudd/rudd.tres b/fish/species/rudd/rudd.tres index ae031ac..5de8d57 100644 --- a/fish/species/rudd/rudd.tres +++ b/fish/species/rudd/rudd.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/2508.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/sea_bass_black/sea_bass_black.tres b/fish/species/sea_bass_black/sea_bass_black.tres index 1c0eabd..7a5b567 100644 --- a/fish/species/sea_bass_black/sea_bass_black.tres +++ b/fish/species/sea_bass_black/sea_bass_black.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/6902.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/shiner_common/shiner_common.tres b/fish/species/shiner_common/shiner_common.tres index 562daf6..5a8a2f3 100644 --- a/fish/species/shiner_common/shiner_common.tres +++ b/fish/species/shiner_common/shiner_common.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/2801.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/shiner_emerald/shiner_emerald.tres b/fish/species/shiner_emerald/shiner_emerald.tres index eeb3653..8a39e5c 100644 --- a/fish/species/shiner_emerald/shiner_emerald.tres +++ b/fish/species/shiner_emerald/shiner_emerald.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/2803.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/shiner_golden/shiner_golden.tres b/fish/species/shiner_golden/shiner_golden.tres index 5ab924f..af57441 100644 --- a/fish/species/shiner_golden/shiner_golden.tres +++ b/fish/species/shiner_golden/shiner_golden.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/2806.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/smelt_rainbow/smelt_rainbow.tres b/fish/species/smelt_rainbow/smelt_rainbow.tres index 6a0d08a..34691f9 100644 --- a/fish/species/smelt_rainbow/smelt_rainbow.tres +++ b/fish/species/smelt_rainbow/smelt_rainbow.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/4101.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") diff --git a/fish/species/snapper_lane/snapper_lane.tres b/fish/species/snapper_lane/snapper_lane.tres index 0288e2d..d91444f 100644 --- a/fish/species/snapper_lane/snapper_lane.tres +++ b/fish/species/snapper_lane/snapper_lane.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://h7hg45b7wmst" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" uid="uid://bs7cqi88csolc" path="res://fish/fish_availability.gd" id="3_availability_script"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/6001.png" id="4_texture"] [sub_resource type="Resource" id="SnapperLaneAvailability"] script = ExtResource("3_availability_script") diff --git a/fish/species/sunfish/sunfish.tres b/fish/species/sunfish/sunfish.tres index a8e2290..5efd181 100644 --- a/fish/species/sunfish/sunfish.tres +++ b/fish/species/sunfish/sunfish.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Resource" path="res://fish/day_availability.tres" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="4_texture"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/5001.png" id="4_texture"] [resource] script = ExtResource("1_fish_data") diff --git a/fish/species/yellow_perch/yellow_perch.tres b/fish/species/yellow_perch/yellow_perch.tres index 5098a1e..3e0501f 100644 --- a/fish/species/yellow_perch/yellow_perch.tres +++ b/fish/species/yellow_perch/yellow_perch.tres @@ -3,7 +3,7 @@ [ext_resource type="Script" path="res://fish/fish_data.gd" id="1_fish_data"] [ext_resource type="Resource" path="res://fishing/common_catch_profile.tres" id="2_profile"] [ext_resource type="Script" path="res://fish/fish_availability.gd" id="3_availability"] -[ext_resource type="Texture2D" path="res://art/exported/creatures/fish_placeholder.png" id="99_fish_placeholder"] +[ext_resource type="Texture2D" path="res://art/exported/creatures/3201.png" id="99_fish_placeholder"] [sub_resource type="Resource" id="Availability"] script = ExtResource("3_availability") From d8bf59bca068842e1046ee3960f8662ab72bc4a8 Mon Sep 17 00:00:00 2001 From: Voyager Date: Mon, 31 Aug 2026 16:03:55 -0400 Subject: [PATCH 21/37] Add starter RV progression and fishing feedback --- fishing/fishing_spot.gd | 4 + homes/assets/starter_motorcoach.glb | Bin 189284 -> 156012 bytes homes/assets/starter_rv_interior.glb | Bin 0 -> 15564 bytes homes/assets/starter_rv_interior.glb.import | 45 ++ homes/assets/tent_interior.glb | Bin 0 -> 9880 bytes homes/assets/tent_interior.glb.import | 45 ++ homes/home_decor_controller.gd | 15 +- homes/home_world_service.gd | 503 ++++++++++++++---- homes/player_home_state.gd | 81 ++- main/main.gd | 411 ++++++++++++-- network/network_home_service.gd | 80 ++- network/network_protocol.gd | 3 + network/network_session.gd | 3 + network/network_shop_protocol.gd | 3 +- network/network_shop_service.gd | 145 +++-- player/player.gd | 83 ++- progression/player_cooler_capacity.gd | 75 ++- save/player_save_manager.gd | 28 +- tests/economy_regression_validation.gd | 58 +- tests/home_spawn_multiplayer_validation.gd | 23 + tests/logbook_runtime_validation.gd | 8 +- ui/fishing_danger_vignette.gdshader | 10 + ui/fishing_danger_vignette.gdshader.uid | 1 + ui/fishing_shop.gd | 76 --- ui/fishing_shop.tscn | 29 - ui/game_ui.gd | 153 +++++- ui/game_ui.tscn | 27 +- ui/home_decor_toolbar.gd | 142 +++-- ui/player_menu.gd | 5 +- ui/player_storage.gd | 6 +- ui/rv_upgrade_shop.gd | 330 ++++++++++++ ui/rv_upgrade_shop.gd.uid | 1 + ui/rv_upgrade_shop.tscn | 14 + world/decor_shop_interaction.gd | 8 + world/fishing_shop_interaction.gd | 8 + world/generation/generated_world_region.gd | 156 +++++- world/generation/generated_world_region.tscn | 6 +- world/generation/terrain_chunk_generator.gd | 13 + world/interactables/decor_shop_world.tscn | 14 +- world/interactables/fishing_shop_world.tscn | 2 +- .../interactables/rv_upgrade_shop_world.tscn | 36 ++ world/regions/starter_island_region.gd | 20 +- world/regions/starter_island_region.tscn | 5 + world/regions/world_region.gd | 18 + world/rv_upgrade_interaction.gd | 15 + world/rv_upgrade_interaction.gd.uid | 1 + world/test_world.gd | 26 + 47 files changed, 2268 insertions(+), 467 deletions(-) create mode 100644 homes/assets/starter_rv_interior.glb create mode 100644 homes/assets/starter_rv_interior.glb.import create mode 100644 homes/assets/tent_interior.glb create mode 100644 homes/assets/tent_interior.glb.import create mode 100644 ui/fishing_danger_vignette.gdshader create mode 100644 ui/fishing_danger_vignette.gdshader.uid create mode 100644 ui/rv_upgrade_shop.gd create mode 100644 ui/rv_upgrade_shop.gd.uid create mode 100644 ui/rv_upgrade_shop.tscn create mode 100644 world/interactables/rv_upgrade_shop_world.tscn create mode 100644 world/rv_upgrade_interaction.gd create mode 100644 world/rv_upgrade_interaction.gd.uid diff --git a/fishing/fishing_spot.gd b/fishing/fishing_spot.gd index 8160eec..fdfad53 100644 --- a/fishing/fishing_spot.gd +++ b/fishing/fishing_spot.gd @@ -684,6 +684,10 @@ func _is_reel_input_pressed() -> bool: ) +func is_reel_input_active() -> bool: + return state == FishingState.FIGHTING and _is_reel_input_pressed() + + func _begin_aiming(player: PlayerType) -> void: if state != FishingState.READY or _active_player != null: return diff --git a/homes/assets/starter_motorcoach.glb b/homes/assets/starter_motorcoach.glb index 5b0d0225da3af0dc3978f6b0bb19562b571ae8e3..becd54edcc889a1754cfb1e1d6fdffb43e5bf8b0 100644 GIT binary patch literal 156012 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 literal 189284 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 Y$FNH{19#B{>47_%9L|Qb!+zoa0dB5ZD*ylh diff --git a/homes/assets/starter_rv_interior.glb b/homes/assets/starter_rv_interior.glb new file mode 100644 index 0000000000000000000000000000000000000000..21608ea0c68307d10e8e8d75d59d17e658abe789 GIT binary patch literal 15564 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 literal 0 HcmV?d00001 diff --git a/homes/assets/tent_interior.glb.import b/homes/assets/tent_interior.glb.import new file mode 100644 index 0000000..fc01ba7 --- /dev/null +++ b/homes/assets/tent_interior.glb.import @@ -0,0 +1,45 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://dkfqs051shmxe" +path="res://.godot/imported/tent_interior.glb-576cc47c2c633f7ae635651598663518.scn" + +[deps] + +source_file="res://homes/assets/tent_interior.glb" +dest_files=["res://.godot/imported/tent_interior.glb-576cc47c2c633f7ae635651598663518.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/root_script=null +mesh_library/use_node_names_as_mesh_names=false +array_mesh/deduplicate_surfaces=true +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_name_suffixes=true +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +materials/extract=0 +materials/extract_format=0 +materials/extract_path="" +_subresources={} +gltf/naming_version=2 +gltf/embedded_image_handling=1 +gltf/texture_map_mode=1 diff --git a/homes/home_decor_controller.gd b/homes/home_decor_controller.gd index 8f9aa5f..f67207f 100644 --- a/homes/home_decor_controller.gd +++ b/homes/home_decor_controller.gd @@ -130,6 +130,8 @@ func _unhandled_input(event: InputEvent) -> void: func _process(delta: float) -> void: + if _toolbar != null and _toolbar.visible: + _toolbar.set_interactive(_can_decorate()) if _drag_instance_id.is_empty(): return # Menus and other gameplay input handoffs must cancel an active drag before @@ -472,9 +474,20 @@ func _on_home_changed() -> void: func _refresh_toolbar() -> void: if _toolbar == null: return - _toolbar.set_active(_can_decorate()) + var inside_home: bool = _is_inside_home_space() + _toolbar.set_active(inside_home) + _toolbar.set_interactive(_can_decorate()) if not _toolbar.visible: _clear_selection() + elif not _can_decorate(): + _toolbar.report_status("decor tools pause while another menu is open") + + +func _is_inside_home_space() -> bool: + return ( + _network_home != null + and String(_network_home.get_local_space()).begins_with("rv:") + ) func _can_decorate() -> bool: diff --git a/homes/home_world_service.gd b/homes/home_world_service.gd index fd02d93..4ec0645 100644 --- a/homes/home_world_service.gd +++ b/homes/home_world_service.gd @@ -9,23 +9,42 @@ const DecorCatalogType = preload("res://homes/decor_catalog.gd") const STARTER_MOTORCOACH_SCENE: PackedScene = preload( "res://homes/assets/starter_motorcoach.glb" ) +const TENT_INTERIOR_SCENE: PackedScene = preload( + "res://homes/assets/tent_interior.glb" +) +const STARTER_RV_INTERIOR_SCENE: PackedScene = preload( + "res://homes/assets/starter_rv_interior.glb" +) +const HOME_PROMPT_FONT: Font = preload("res://ui/fonts/Tuffy_Bold.otf") -const EXTERIOR_BODY_SIZE := Vector3(5.6, 2.5, 2.35) -const EXTERIOR_DOOR_LOCAL := Vector3(-0.2, 0.85, 1.48) -const EXTERIOR_SPAWN_LOCAL := Vector3(-0.2, 0.25, 2.45) +const RV_EXTERIOR_BODY_SIZE := Vector3(11.2, 5.0, 4.7) +const RV_EXTERIOR_BODY_CENTER_Y: float = 2.7 +const RV_EXTERIOR_DOOR_LOCAL := Vector3(-0.4, 1.7, 2.96) +const RV_EXTERIOR_SPAWN_LOCAL := Vector3(-0.4, 0.25, 3.95) +const TENT_EXTERIOR_BODY_SIZE := Vector3(4.6, 3.0, 4.6) +const TENT_EXTERIOR_BODY_CENTER_Y: float = 1.5 +const TENT_EXTERIOR_DOOR_LOCAL := Vector3(0.0, 1.0, 2.3) +const TENT_EXTERIOR_SPAWN_LOCAL := Vector3(0.0, 0.25, 3.3) +const RV_EXTERIOR_PROMPT_LOCAL := Vector3(-0.4, 3.72, 3.02) +const TENT_EXTERIOR_PROMPT_LOCAL := Vector3(0.0, 2.48, 2.36) +const HOME_PROMPT_SIZE := Vector2(0.95, 0.28) +const HOME_PROMPT_CORNER_RADIUS: float = 0.08 +const HOME_PROMPT_TEXT_PIXEL_SIZE: float = 0.0045 +const HOME_PROMPT_TEXT_COLOR := Color("c3dfe6") +const HOME_PROMPT_BACKGROUND_COLOR := Color("0a2d3a") const EXTERIOR_INTERACTION_DISTANCE: float = 2.7 const INTERIOR_EXIT_DISTANCE: float = 2.1 const INTERIOR_ORIGIN := Vector3(1000.0, 300.0, 1000.0) const INTERIOR_SPACING: float = 14.0 const INTERIOR_MAX_SPAWN_SLOTS: int = 64 -const INTERIOR_FLOOR_SIZE := Vector3(8.0, 0.18, 4.5) -const INTERIOR_WALL_HEIGHT: float = 2.7 +const TENT_INTERIOR_SIZE := Vector2(4.0, 4.0) +const STARTER_RV_INTERIOR_SIZE := Vector2(4.0, 6.0) const MIN_EXTERIOR_TRIANGLE_AREA: float = 1.0 -const MIN_EXTERIOR_SEPARATION: float = 9.0 -const EXTERIOR_FOOTPRINT_HALF_EXTENTS := Vector2(3.85, 2.55) +const MIN_EXTERIOR_SEPARATION: float = 14.6 +const EXTERIOR_FOOTPRINT_HALF_EXTENTS := Vector2(6.65, 3.73) const EXTERIOR_SURFACE_INDEX_CELL_SIZE: float = 5.0 const EXTERIOR_MAX_SURFACE_HEIGHT_DELTA: float = 0.24 -const EXTERIOR_CLEARANCE_HEIGHT: float = 2.7 +const EXTERIOR_CLEARANCE_HEIGHT: float = 5.5 const WORLD_GEOMETRY_COLLISION_LAYER: int = 1 const DECOR_SELECTION_COLLISION_LAYER: int = 1 << 8 # Includes the player's 0.45 m capsule radius plus enough movement margin for @@ -113,7 +132,9 @@ func apply_manifest(data: Dictionary) -> bool: var home_data: Dictionary = PlayerHomeStateType.sanitize_save_data( data["home"] ) - var exterior := _build_exterior(fingerprint, exterior_transform) + var exterior := _build_exterior( + fingerprint, exterior_transform, home_data + ) var interior := _build_interior(fingerprint, interior_index, home_data) var presentation: Dictionary = { "owner_peer_id": int(data["owner_peer_id"]), @@ -191,19 +212,27 @@ func choose_exterior_transform( ) if dry_result != Transform3D.IDENTITY: push_warning( - "RV exterior used a dry fallback with obstructed clearance." + "Home exterior used a dry fallback with obstructed clearance." ) return dry_result - push_error("No dry, level RV exterior footprint was available.") - var fallback: Transform3D = spawn_transform - var column: int = posmod(owner_peer_id - 1, 4) - var row: int = maxi(floori(float(owner_peer_id - 1) / 4.0), 0) - fallback.origin += Vector3( - -12.0 + float(column) * 8.0, - 0.0, - 8.0 + float(row) * 7.0, - ) - return fallback + var emergency_result: Transform3D = _find_exterior_transform( + owner_peer_id, + triangles, + surface_index, + spawn_transform, + [], + false, + false, + ) + if emergency_result != Transform3D.IDENTITY: + push_warning( + "Home exterior used an accessible emergency placement." + ) + return emergency_result + push_error("No dry, level home exterior footprint was available.") + # The authored spawn is the only universally reachable point. Never strand + # a home on an unchecked elevation when malformed terrain offers no site. + return spawn_transform func _find_exterior_transform( @@ -229,7 +258,7 @@ func _find_exterior_transform( ) / 3.0 if ( require_spawn_clearance - and position.distance_to(spawn_transform.origin) < 6.0 + and position.distance_to(spawn_transform.origin) < 9.0 ): continue if _too_close_to_reserved(position, reserved_transforms): @@ -240,6 +269,13 @@ func _find_exterior_transform( ) if not grounded_position.is_finite(): continue + if ( + _world != null + and not _world.is_home_exterior_position_accessible( + grounded_position + ) + ): + continue if ( require_obstacle_clearance and not _exterior_volume_is_clear(grounded_position, yaw) @@ -444,16 +480,48 @@ func get_exterior_transform(owner_fingerprint: String) -> Transform3D: func get_exterior_prompt_position(owner_fingerprint: String) -> Vector3: - return get_exterior_transform(owner_fingerprint) * EXTERIOR_DOOR_LOCAL + return get_exterior_transform(owner_fingerprint) * ( + _exterior_prompt_local(owner_fingerprint) + ) + + +func set_exterior_prompt_visible( + owner_fingerprint: String, + requested_visible: bool, + action_text: String = "enter home", +) -> void: + for fingerprint: String in _presentations_by_fingerprint: + var presentation: Dictionary = _presentations_by_fingerprint[fingerprint] + var exterior: Node3D = presentation.get("exterior") + if not is_instance_valid(exterior): + continue + var prompt := exterior.get_node_or_null("DoorPrompt") as Node3D + if prompt == null: + continue + prompt.visible = ( + requested_visible + and fingerprint == owner_fingerprint + and not _dedicated_runtime + ) + if prompt.visible: + var label := prompt.get_node_or_null("Message") as Label3D + if label != null: + label.text = action_text func get_exterior_spawn_transform(owner_fingerprint: String) -> Transform3D: var exterior_transform: Transform3D = get_exterior_transform( owner_fingerprint ) + # Exterior local +Z leads away from the doorway. Player visuals face local + # -Z, so turn the authoritative spawn basis around to start the day facing + # outward instead of looking back into the home. + var outward_spawn_basis: Basis = ( + exterior_transform.basis * Basis(Vector3.UP, PI) + ) return Transform3D( - exterior_transform.basis, - exterior_transform * EXTERIOR_SPAWN_LOCAL, + outward_spawn_basis, + exterior_transform * _exterior_spawn_local(owner_fingerprint), ) @@ -461,17 +529,26 @@ func get_interior_spawn_transform( owner_fingerprint: String, visitor_offset: int = 0, ) -> Transform3D: - var anchor: Vector3 = get_interior_anchor(owner_fingerprint) # `visitor_offset` is allocated by the host as a compact room-local slot. # Keep it bounded as a last line of defense if a future caller accidentally # supplies an engine peer ID instead of a slot. var visitor_slot: int = posmod(visitor_offset, INTERIOR_MAX_SPAWN_SLOTS) - # Build the origin as a value rather than mutating Transform3D.origin. - var spawn_origin: Vector3 = anchor + Vector3( - -1.0 + float(posmod(visitor_slot, 4)) * 0.65, - 0.25, - 0.4 + float(floori(float(visitor_slot) / 4.0)) * 0.55, + var exit_direction: Vector3 = get_interior_exit_direction(owner_fingerprint) + var lane_offset: float = ( + float(posmod(visitor_slot, 4)) - 1.5 + ) * 0.28 + var row_offset: float = ( + float(floori(float(visitor_slot) / 4.0)) * 0.28 ) + # Spawn just through the authored doorway. Local presentation then walks the + # avatar farther into the room before returning movement control. + var spawn_origin: Vector3 = ( + get_interior_exit_position(owner_fingerprint) + + exit_direction * 0.42 + - exit_direction * row_offset + + Vector3(0.0, 0.0, lane_offset) + ) + spawn_origin.y = get_interior_anchor(owner_fingerprint).y return Transform3D(Basis.IDENTITY, spawn_origin) @@ -487,7 +564,9 @@ func is_avatar_near_exterior(avatar: Player, owner_fingerprint: String) -> bool: if avatar == null or not _presentations_by_fingerprint.has(owner_fingerprint): return false var transform: Transform3D = get_exterior_transform(owner_fingerprint) - var door_position: Vector3 = transform * EXTERIOR_DOOR_LOCAL + var door_position: Vector3 = ( + transform * _exterior_door_local(owner_fingerprint) + ) return avatar.global_position.distance_to(door_position) <= ( EXTERIOR_INTERACTION_DISTANCE ) @@ -504,11 +583,46 @@ func is_avatar_near_interior_exit( ) <= INTERIOR_EXIT_DISTANCE +func has_avatar_crossed_interior_exit_threshold( + avatar: Player, + owner_fingerprint: String, +) -> bool: + if avatar == null: + return false + var local_position: Vector3 = interior_global_to_local( + owner_fingerprint, + avatar.global_position, + ) + var threshold_position: Vector3 = interior_global_to_local( + owner_fingerprint, + get_interior_exit_position(owner_fingerprint), + ) + var exit_direction: Vector3 = get_interior_exit_direction( + owner_fingerprint + ) + return ( + (local_position - threshold_position).dot(exit_direction) >= 0.0 + and absf(local_position.z - threshold_position.z) <= 0.85 + and local_position.y >= -0.25 + and local_position.y <= 2.25 + ) + + +func get_interior_exit_direction(owner_fingerprint: String) -> Vector3: + return ( + Vector3.LEFT + if _home_tier(owner_fingerprint) + >= PlayerHomeStateType.STARTER_RV_TIER + else Vector3.RIGHT + ) + + func get_interior_exit_position(owner_fingerprint: String) -> Vector3: - return get_interior_anchor(owner_fingerprint) + Vector3( - -INTERIOR_FLOOR_SIZE.x * 0.5 + 0.6, - 0.35, - 0.0, + var tier: int = _home_tier(owner_fingerprint) + return get_interior_anchor(owner_fingerprint) + ( + Vector3(-STARTER_RV_INTERIOR_SIZE.x * 0.5 + 0.6, 0.35, 0.0) + if tier >= PlayerHomeStateType.STARTER_RV_TIER + else Vector3(TENT_INTERIOR_SIZE.x * 0.5 - 0.55, 0.35, 0.0) ) @@ -705,7 +819,7 @@ func find_nearby_exterior_owner(avatar: Player) -> String: for fingerprint: String in _presentations_by_fingerprint: var transform: Transform3D = get_exterior_transform(fingerprint) var distance: float = avatar.global_position.distance_to( - transform * EXTERIOR_DOOR_LOCAL + transform * _exterior_door_local(fingerprint) ) if distance <= closest_distance: closest = fingerprint @@ -713,6 +827,41 @@ func find_nearby_exterior_owner(avatar: Player) -> String: return closest +func _home_tier(owner_fingerprint: String) -> int: + var presentation: Dictionary = _presentations_by_fingerprint.get( + owner_fingerprint, {} + ) + var home_data: Dictionary = presentation.get("home", {}) + return int(home_data.get("tier", PlayerHomeStateType.STARTER_TIER)) + + +func _exterior_door_local(owner_fingerprint: String) -> Vector3: + return ( + RV_EXTERIOR_DOOR_LOCAL + if _home_tier(owner_fingerprint) + >= PlayerHomeStateType.STARTER_RV_TIER + else TENT_EXTERIOR_DOOR_LOCAL + ) + + +func _exterior_spawn_local(owner_fingerprint: String) -> Vector3: + return ( + RV_EXTERIOR_SPAWN_LOCAL + if _home_tier(owner_fingerprint) + >= PlayerHomeStateType.STARTER_RV_TIER + else TENT_EXTERIOR_SPAWN_LOCAL + ) + + +func _exterior_prompt_local(owner_fingerprint: String) -> Vector3: + return ( + RV_EXTERIOR_PROMPT_LOCAL + if _home_tier(owner_fingerprint) + >= PlayerHomeStateType.STARTER_RV_TIER + else TENT_EXTERIOR_PROMPT_LOCAL + ) + + func set_local_space(space_id: StringName) -> void: _local_space = space_id _refresh_local_visibility() @@ -822,24 +971,44 @@ func _ensure_roots() -> void: func _build_exterior( fingerprint: String, world_transform: Transform3D, + home_data: Dictionary, ) -> Node3D: var root := Node3D.new() - root.name = "RV_%s" % fingerprint.left(8) + root.name = "Home_%s" % fingerprint.left(8) _exteriors_root.add_child(root) root.global_transform = world_transform + var tier: int = int(home_data.get( + "tier", PlayerHomeStateType.STARTER_TIER + )) + if tier >= PlayerHomeStateType.STARTER_RV_TIER: + if not _dedicated_runtime: + var motorcoach: Node3D = ( + STARTER_MOTORCOACH_SCENE.instantiate() as Node3D + ) + if motorcoach != null: + motorcoach.name = "StarterMotorcoach" + root.add_child(motorcoach) + else: + push_error( + "The starter motorcoach exterior could not be instantiated." + ) + _add_box_collision( + root, + "Body", + RV_EXTERIOR_BODY_SIZE, + Vector3(0.0, RV_EXTERIOR_BODY_CENTER_Y, 0.0), + ) + else: + if not _dedicated_runtime: + _add_tent_exterior(root) + _add_box_collision( + root, + "Body", + TENT_EXTERIOR_BODY_SIZE, + Vector3(0.0, TENT_EXTERIOR_BODY_CENTER_Y, 0.0), + ) if not _dedicated_runtime: - var motorcoach: Node3D = STARTER_MOTORCOACH_SCENE.instantiate() as Node3D - if motorcoach != null: - motorcoach.name = "StarterMotorcoach" - root.add_child(motorcoach) - else: - push_error("The starter motorcoach exterior could not be instantiated.") - _add_box_collision( - root, - "Body", - EXTERIOR_BODY_SIZE, - Vector3(0.0, 1.35, 0.0), - ) + _add_exterior_prompt(root, tier) root.visible = not _dedicated_runtime return root @@ -850,59 +1019,26 @@ func _build_interior( home_data: Dictionary, ) -> Node3D: var root := Node3D.new() - root.name = "RVInterior_%s" % fingerprint.left(8) + root.name = "HomeInterior_%s" % fingerprint.left(8) root.position = INTERIOR_ORIGIN + Vector3( float(interior_index) * INTERIOR_SPACING, 0.0, 0.0 ) - var half_width: float = INTERIOR_FLOOR_SIZE.x * 0.5 - var half_depth: float = INTERIOR_FLOOR_SIZE.z * 0.5 - var wall_center_y: float = INTERIOR_WALL_HEIGHT * 0.5 _interiors_root.add_child(root) - _add_box( - root, "Floor", INTERIOR_FLOOR_SIZE, Vector3.ZERO, - Color("a6754e"), true, - ) - _add_wall( - root, "WallNorth", - Vector3(INTERIOR_FLOOR_SIZE.x, INTERIOR_WALL_HEIGHT, 0.18), - Vector3(0.0, wall_center_y, -half_depth), - ) - _add_wall( - root, "WallSouth", - Vector3(INTERIOR_FLOOR_SIZE.x, INTERIOR_WALL_HEIGHT, 0.18), - Vector3(0.0, wall_center_y, half_depth), - ) - _add_wall( - root, "WallWest", - Vector3(0.18, INTERIOR_WALL_HEIGHT, INTERIOR_FLOOR_SIZE.z), - Vector3(-half_width, wall_center_y, 0.0), - ) - _add_wall( - root, "WallEast", - Vector3(0.18, INTERIOR_WALL_HEIGHT, INTERIOR_FLOOR_SIZE.z), - Vector3(half_width, wall_center_y, 0.0), - ) - for x_position: float in [-1.75, 1.75]: - _add_box( - root, "WallNorthWindow%s" % ("Left" if x_position < 0.0 else "Right"), - Vector3(1.65, 0.95, 0.04), - Vector3(x_position, 1.55, -half_depth + 0.11), - Color("153640"), false, - ) - _add_box( - root, "WallSouthWindow%s" % ("Left" if x_position < 0.0 else "Right"), - Vector3(1.65, 0.95, 0.04), - Vector3(x_position, 1.55, half_depth - 0.11), - Color("153640"), false, - ) - _add_box( - root, "WallEastWindow", Vector3(0.04, 0.95, 1.55), - Vector3(half_width - 0.11, 1.55, 0.0), Color("153640"), false, - ) - _add_box( - root, "WallWestDoor", Vector3(0.04, 1.9, 1.25), - Vector3(-half_width + 0.11, 1.0, 0.0), Color("2897a8"), false, + var tier: int = int(home_data.get( + "tier", PlayerHomeStateType.STARTER_TIER + )) + var scene: PackedScene = ( + STARTER_RV_INTERIOR_SCENE + if tier >= PlayerHomeStateType.STARTER_RV_TIER + else TENT_INTERIOR_SCENE ) + var shell: Node3D = scene.instantiate() as Node3D + if shell == null: + push_error("The home interior shell could not be instantiated.") + else: + shell.name = "InteriorShell" + root.add_child(shell) + _prepare_imported_interior(shell) var decor := Node3D.new() decor.name = "Decor" root.add_child(decor) @@ -913,6 +1049,153 @@ func _build_interior( return root +func _add_tent_exterior(parent: Node3D) -> void: + var tent := MeshInstance3D.new() + tent.name = "StarterTent" + var mesh := CylinderMesh.new() + mesh.top_radius = 0.0 + mesh.bottom_radius = 3.05 + mesh.height = 3.0 + mesh.radial_segments = 4 + mesh.rings = 1 + mesh.cap_top = false + mesh.material = _material(Color("9a7049")) + tent.mesh = mesh + tent.position.y = 1.5 + tent.rotation.y = PI * 0.25 + parent.add_child(tent) + _add_box( + parent, + "TentDoor", + Vector3(1.25, 1.85, 0.04), + Vector3(0.0, 0.95, 2.18), + Color("173b32"), + false, + ) + + +func _add_exterior_prompt(parent: Node3D, tier: int) -> void: + var prompt := Node3D.new() + prompt.name = "DoorPrompt" + prompt.position = ( + RV_EXTERIOR_PROMPT_LOCAL + if tier >= PlayerHomeStateType.STARTER_RV_TIER + else TENT_EXTERIOR_PROMPT_LOCAL + ) + prompt.visible = false + parent.add_child(prompt) + + var background := MeshInstance3D.new() + background.name = "Background" + background.mesh = _rounded_rectangle_mesh( + HOME_PROMPT_SIZE, + HOME_PROMPT_CORNER_RADIUS, + ) + background.material_override = _prompt_material( + HOME_PROMPT_BACKGROUND_COLOR + ) + prompt.add_child(background) + + var label := Label3D.new() + label.name = "Message" + label.text = "enter home" + label.position.z = 0.012 + label.font = HOME_PROMPT_FONT + label.font_size = 28 + label.pixel_size = HOME_PROMPT_TEXT_PIXEL_SIZE + label.modulate = HOME_PROMPT_TEXT_COLOR + label.outline_size = 0 + label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER + label.width = HOME_PROMPT_SIZE.x / HOME_PROMPT_TEXT_PIXEL_SIZE + label.double_sided = true + prompt.add_child(label) + + +func _rounded_rectangle_mesh(size: Vector2, radius: float) -> ArrayMesh: + var half_size: Vector2 = size * 0.5 + var clamped_radius: float = minf( + radius, + minf(half_size.x, half_size.y), + ) + var corners: Array[Vector2] = [ + Vector2(half_size.x - clamped_radius, half_size.y - clamped_radius), + Vector2(-half_size.x + clamped_radius, half_size.y - clamped_radius), + Vector2(-half_size.x + clamped_radius, -half_size.y + clamped_radius), + Vector2(half_size.x - clamped_radius, -half_size.y + clamped_radius), + ] + var start_angles: Array[float] = [0.0, PI * 0.5, PI, PI * 1.5] + var perimeter: Array[Vector2] = [] + const CORNER_SEGMENTS: int = 4 + for corner_index: int in corners.size(): + for segment_index: int in range(CORNER_SEGMENTS + 1): + var angle: float = start_angles[corner_index] + ( + PI * 0.5 * float(segment_index) / float(CORNER_SEGMENTS) + ) + perimeter.append( + corners[corner_index] + + Vector2(cos(angle), sin(angle)) * clamped_radius + ) + var surface := SurfaceTool.new() + surface.begin(Mesh.PRIMITIVE_TRIANGLES) + for index: int in perimeter.size(): + var first: Vector2 = perimeter[index] + var second: Vector2 = perimeter[(index + 1) % perimeter.size()] + for point: Vector2 in [Vector2.ZERO, first, second]: + surface.set_normal(Vector3.FORWARD) + surface.add_vertex(Vector3(point.x, point.y, 0.0)) + return surface.commit() + + +func _prompt_material(color: Color) -> StandardMaterial3D: + var material := StandardMaterial3D.new() + material.albedo_color = color + material.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + material.roughness = 1.0 + material.metallic = 0.0 + material.cull_mode = BaseMaterial3D.CULL_DISABLED + return material + + +func _prepare_imported_interior(shell: Node3D) -> void: + for value: Node in shell.find_children("*", "MeshInstance3D", true, false): + var mesh_instance := value as MeshInstance3D + if mesh_instance == null or mesh_instance.mesh == null: + continue + for surface_index: int in mesh_instance.mesh.get_surface_count(): + var source_material: Material = mesh_instance.get_active_material( + surface_index + ) + var material := source_material as StandardMaterial3D + if material == null: + continue + var flat_material := material.duplicate() as StandardMaterial3D + flat_material.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + flat_material.texture_filter = BaseMaterial3D.TEXTURE_FILTER_NEAREST + flat_material.roughness = 1.0 + flat_material.metallic = 0.0 + mesh_instance.set_surface_override_material( + surface_index, flat_material + ) + _add_imported_mesh_collision(mesh_instance) + + +func _add_imported_mesh_collision(mesh_instance: MeshInstance3D) -> void: + var parent: Node = mesh_instance.get_parent() + if parent == null or mesh_instance.mesh == null: + return + var shape: ConcavePolygonShape3D = mesh_instance.mesh.create_trimesh_shape() + if shape == null: + return + var body := StaticBody3D.new() + body.name = "%sCollision" % mesh_instance.name + body.transform = mesh_instance.transform + var collision := CollisionShape3D.new() + collision.shape = shape + body.add_child(collision) + parent.add_child(body) + + func _rebuild_decor( parent: Node3D, home_data: Dictionary, @@ -1115,9 +1398,9 @@ func _refresh_local_visibility() -> void: for wall_name: String in [ "WallNorth", "WallSouth", "WallWest", "WallEast", ]: - var body: StaticBody3D = active_interior.get_node_or_null( - "%sCollision" % wall_name - ) + var body := active_interior.find_child( + "%sCollision" % wall_name, true, false + ) as StaticBody3D if body != null: excluded_wall_rids.append(body.get_rid()) local_player.set_rv_interior_camera_mode( @@ -1145,12 +1428,20 @@ func _refresh_nearest_wall() -> void: ).normalized() var horizontal_view_weight: float = absf(local_view_direction.x) var depth_view_weight: float = absf(local_view_direction.z) + var tier: int = int((presentation.get("home", {}) as Dictionary).get( + "tier", PlayerHomeStateType.STARTER_TIER + )) + var interior_size: Vector2 = ( + STARTER_RV_INTERIOR_SIZE + if tier >= PlayerHomeStateType.STARTER_RV_TIER + else TENT_INTERIOR_SIZE + ) var hidden_walls: Dictionary[String, bool] = {} var outside_horizontal_wall: bool = ( - absf(local_camera.x) >= INTERIOR_FLOOR_SIZE.x * 0.5 - 0.05 + absf(local_camera.x) >= interior_size.x * 0.5 - 0.05 ) var outside_depth_wall: bool = ( - absf(local_camera.z) >= INTERIOR_FLOOR_SIZE.z * 0.5 - 0.05 + absf(local_camera.z) >= interior_size.y * 0.5 - 0.05 ) # At a diagonal, both near walls occupy the view. Use the camera's viewing # direction to hide both instead of choosing only the dominant position @@ -1181,10 +1472,14 @@ func _refresh_nearest_wall() -> void: for wall_name: String in [ "WallNorth", "WallSouth", "WallWest", "WallEast", ]: - var wall: MeshInstance3D = interior.get_node_or_null(wall_name) + var wall := interior.find_child( + wall_name, true, false + ) as MeshInstance3D if wall != null: wall.visible = not hidden_walls.has(wall_name) - for child: Node in interior.get_children(): + for child: Node in interior.find_children( + "%s*" % wall_name, "GeometryInstance3D", true, false + ): if ( child is GeometryInstance3D and String(child.name).begins_with(wall_name) diff --git a/homes/player_home_state.gd b/homes/player_home_state.gd index decd34a..a89d6a3 100644 --- a/homes/player_home_state.gd +++ b/homes/player_home_state.gd @@ -7,8 +7,12 @@ const DecorCatalogType = preload("res://homes/decor_catalog.gd") const HOME_SCHEMA_VERSION: int = 1 const STARTER_TIER: int = 0 -const STARTER_EXTERIOR_ID: StringName = &"starter_motorcoach" -const MAX_TIER: int = 8 +const STARTER_EXTERIOR_ID: StringName = &"starter_tent" +const STARTER_RV_TIER: int = 1 +const STARTER_RV_EXTERIOR_ID: StringName = &"starter_motorcoach" +const MAX_TIER: int = STARTER_RV_TIER +const HOME_UPGRADE_COSTS: Array[int] = [50] +const STORAGE_CAPACITIES: Array[int] = [9, 18] const MAX_PLACEMENTS: int = 128 const MAX_INSTANCE_ID_LENGTH: int = 96 const MAX_REVISION: int = 2147483647 @@ -16,11 +20,8 @@ const GRID_SIZE: float = 0.5 const FREE_PLACEMENT_SEARCH_STEP: float = 0.1 const FREE_PLACEMENT_SEARCH_ANGLES: int = 24 const NEAREST_PLACEMENT_SEARCH_DISTANCE: float = 2.0 -# The starter RV is intentionally cramped. Later RV tiers can replace these -# bounds with larger layouts when tiered interiors are introduced. -# The starter interior is 8.0 m by 4.5 m with 0.18 m walls. These bounds -# follow the walls' inner faces, with a small visual gap to avoid z-fighting. -const INTERIOR_HALF_EXTENTS := Vector2(3.91, 2.16) +const TENT_INTERIOR_HALF_EXTENTS := Vector2(1.91, 1.91) +const STARTER_RV_INTERIOR_HALF_EXTENTS := Vector2(1.91, 2.91) const PLACEMENT_EDGE_PADDING: float = 0.02 enum Privacy { @@ -50,6 +51,51 @@ func get_exterior_id() -> StringName: return _exterior_id +func get_storage_capacity() -> int: + return storage_capacity_for_tier(_tier) + + +func get_next_upgrade_cost() -> int: + if _tier >= MAX_TIER: + return -1 + return HOME_UPGRADE_COSTS[_tier] + + +func get_next_storage_capacity() -> int: + if _tier >= MAX_TIER: + return -1 + return storage_capacity_for_tier(_tier + 1) + + +func upgrade_to_next_tier() -> bool: + if _tier >= MAX_TIER: + return false + _tier += 1 + _exterior_id = exterior_id_for_tier(_tier) + _touch() + return true + + +static func exterior_id_for_tier(tier: int) -> StringName: + return ( + STARTER_RV_EXTERIOR_ID + if tier >= STARTER_RV_TIER + else STARTER_EXTERIOR_ID + ) + + +static func storage_capacity_for_tier(tier: int) -> int: + return STORAGE_CAPACITIES[clampi(tier, STARTER_TIER, MAX_TIER)] + + +static func interior_half_extents_for_tier(tier: int) -> Vector2: + return ( + STARTER_RV_INTERIOR_HALF_EXTENTS + if tier >= STARTER_RV_TIER + else TENT_INTERIOR_HALF_EXTENTS + ) + + func get_privacy() -> Privacy: return _privacy @@ -248,7 +294,7 @@ func get_nearest_valid_placement_transform( candidate_validator: Callable = Callable(), ) -> Dictionary: var normalized: Dictionary = normalized_placement_transform( - decor_id, position, yaw_radians, mode + decor_id, position, yaw_radians, mode, _tier ) if normalized.is_empty(): return {} @@ -322,7 +368,7 @@ func restore_from_save_data(data: Dictionary) -> bool: if sanitized.is_empty(): return false _tier = int(sanitized["tier"]) - _exterior_id = StringName(str(sanitized["exterior_id"])) + _exterior_id = exterior_id_for_tier(_tier) _privacy = int(sanitized["privacy"]) _owned_decor.clear() for key: Variant in (sanitized["owned_decor"] as Dictionary): @@ -384,6 +430,7 @@ static func sanitize_save_data(data: Dictionary) -> Dictionary: or next_sequence > MAX_REVISION ): return {} + exterior_id = String(exterior_id_for_tier(tier)) var sanitized_owned: Dictionary = {} var owned: Dictionary = data["owned_decor"] for key: Variant in owned: @@ -408,7 +455,7 @@ static func sanitize_save_data(data: Dictionary) -> Dictionary: for value: Variant in values: if typeof(value) != TYPE_DICTIONARY: return {} - var sanitized: Dictionary = sanitize_placement(value) + var sanitized: Dictionary = sanitize_placement(value, tier) if sanitized.is_empty(): return {} var instance_id: String = str(sanitized["instance_id"]) @@ -440,7 +487,10 @@ static func sanitize_save_data(data: Dictionary) -> Dictionary: } -static func sanitize_placement(value: Dictionary) -> Dictionary: +static func sanitize_placement( + value: Dictionary, + home_tier: int = STARTER_TIER, +) -> Dictionary: for key: String in [ "instance_id", "decor_id", "mode", "position", "yaw", ]: @@ -483,6 +533,7 @@ static func sanitize_placement(value: Dictionary) -> Dictionary: position, yaw, mode as PlacementMode, + home_tier, ) if normalized.is_empty(): return {} @@ -509,6 +560,7 @@ static func normalized_placement_transform( position: Vector3, yaw_radians: float, mode: PlacementMode, + home_tier: int = STARTER_TIER, ) -> Dictionary: if ( not DecorCatalogType.has_product(decor_id) @@ -530,11 +582,12 @@ static func normalized_placement_transform( (footprint.x * cosine + footprint.y * sine) * 0.5, (footprint.x * sine + footprint.y * cosine) * 0.5, ) + var interior_half_extents := interior_half_extents_for_tier(home_tier) var maximum_x: float = ( - INTERIOR_HALF_EXTENTS.x - half_size.x - PLACEMENT_EDGE_PADDING + interior_half_extents.x - half_size.x - PLACEMENT_EDGE_PADDING ) var maximum_z: float = ( - INTERIOR_HALF_EXTENTS.y - half_size.y - PLACEMENT_EDGE_PADDING + interior_half_extents.y - half_size.y - PLACEMENT_EDGE_PADDING ) if maximum_x < 0.0 or maximum_z < 0.0: return {} @@ -580,6 +633,7 @@ func _find_nearest_grid_transform( ), yaw, PlacementMode.GRID, + _tier, ) if candidate.is_empty() or not _mark_candidate_unseen( candidate, seen @@ -630,6 +684,7 @@ func _find_nearest_free_transform( ), yaw, PlacementMode.FREE, + _tier, ) if candidate.is_empty() or not _mark_candidate_unseen( candidate, seen diff --git a/main/main.gd b/main/main.gd index 00d2b40..324c268 100644 --- a/main/main.gd +++ b/main/main.gd @@ -40,6 +40,9 @@ const FishingShopInteractionType = preload( const DecorShopInteractionType = preload( "res://world/decor_shop_interaction.gd" ) +const RVUpgradeInteractionType = preload( + "res://world/rv_upgrade_interaction.gd" +) const PlayerStorageInteractionType = preload( "res://world/player_storage_interaction.gd" ) @@ -148,6 +151,13 @@ const PLAYER_MENU_PATTERN_SCROLL_VELOCITY := Vector2(-7.0, -5.0) const SHOP_PATTERN_SCALE: float = 1.75 const DEDICATED_IDLE_PHYSICS_TICKS_PER_SECOND: int = 10 const DEDICATED_ACTIVE_PHYSICS_TICKS_PER_SECOND: int = 30 +const HOME_ENTRY_INPUT_OWNER: StringName = &"home_entry_transition" +const HOME_EXIT_INPUT_OWNER: StringName = &"home_exit_transition" +const HOME_EXIT_FADE_GENERATION: int = -104729 +const HOME_ENTRY_WALK_DISTANCE: float = 1.05 +const HOME_ENTRY_WALK_DURATION: float = 0.55 +const HOME_EXIT_WALK_DISTANCE: float = 1.25 +const HOME_EXIT_WALK_DURATION: float = 0.62 @export var fish_catalog: FishPoolType @export var pelican_buyer_profile: FishBuyerProfileType @@ -260,6 +270,7 @@ var _gameplay_started: bool = false var _save_slots := PlayerSaveSlotCatalogType.new() var _shop_interaction: FishingShopInteractionType var _decor_shop_interaction: DecorShopInteractionType +var _rv_upgrade_shop_interaction: RVUpgradeInteractionType var _storage_interaction: PlayerStorageInteractionType var _title_music_tween: Tween var _title_music_transition_generation: int = 0 @@ -290,6 +301,12 @@ var _pending_existing_root_path := "" var _local_recovery_attempt_id: String = "" var _dedicated_runtime: bool = false var _dedicated_metrics_accumulator: float = 0.0 +var _home_exit_transition_active: bool = false +var _home_exit_waiting_for_network: bool = false +var _home_exit_start_position: Vector3 = Vector3.ZERO +var _home_exit_walk_tween: Tween +var _home_entry_transition_active: bool = false +var _home_entry_walk_tween: Tween @onready var _shoreline_ambience: ShorelineAmbience = %ShorelineAmbience var _rain_ambience: RainAmbienceType @@ -743,6 +760,7 @@ func _initialize_application(dedicated: bool) -> void: _player.wallet, _asset_reservations ) + _player.cooler_capacity.bind_home_state(_home_state) _player.bag.setup(item_catalog) _player.inventory_layout.setup( _player.bag, @@ -760,19 +778,24 @@ func _initialize_application(dedicated: bool) -> void: ) _shop_interaction = _test_world.get_fishing_shop() _decor_shop_interaction = _test_world.get_decor_shop() + _rv_upgrade_shop_interaction = _test_world.get_rv_upgrade_shop() _storage_interaction = _test_world.get_player_storage() if not dedicated: + if not _home_state.changed.is_connected(_on_home_state_changed): + _home_state.changed.connect(_on_home_state_changed) _shop_interaction.setup_local_player(_player) _shop_interaction.local_player_range_changed.connect( _on_shop_range_changed ) - _game_ui.set_shop_npc_player_in_range( - _shop_interaction.is_local_player_in_range() - ) + _refresh_shop_npc_speech_state() _decor_shop_interaction.setup_local_player(_player) _decor_shop_interaction.local_player_range_changed.connect( _on_decor_shop_range_changed ) + _rv_upgrade_shop_interaction.setup_local_player(_player) + _rv_upgrade_shop_interaction.local_player_range_changed.connect( + _on_rv_upgrade_shop_range_changed + ) _storage_interaction.setup_local_player(_player) _storage_interaction.local_player_range_changed.connect( _on_storage_range_changed @@ -947,6 +970,7 @@ func _initialize_application(dedicated: bool) -> void: _home_state, _network_home, _decor_shop_interaction, + _rv_upgrade_shop_interaction, ) _fishing_spot.setup( _player, @@ -987,6 +1011,7 @@ func _initialize_application(dedicated: bool) -> void: _shop_interaction, _storage_interaction, _decor_shop_interaction, + _rv_upgrade_shop_interaction, _player.item_effects, _player.cooler_capacity, _network_session, @@ -1024,6 +1049,12 @@ func _initialize_application(dedicated: bool) -> void: _home_decor_controller.begin_decorating ) _network_home.local_space_changed.connect(_on_local_home_space_changed) + _network_home.local_transition_finished.connect( + _on_local_home_transition_finished + ) + _game_ui.get_screen_fade().transition_completed.connect( + _on_home_exit_fade_transition_completed + ) _game_ui.rv_storage_requested.connect(_on_rv_storage_requested) _game_ui.setup_data_and_identity( _data_root, @@ -1539,6 +1570,9 @@ func _input(event: InputEvent) -> void: if _game_ui.get_decor_shop().consume_escape(): get_viewport().set_input_as_handled() return + if _game_ui.get_rv_upgrade_shop().consume_escape(): + get_viewport().set_input_as_handled() + return if fishing_shop.consume_escape(): get_viewport().set_input_as_handled() return @@ -1653,17 +1687,12 @@ func _unhandled_input(event: InputEvent) -> void: return var home_owner: String = _network_home.get_local_home_owner_fingerprint() if not home_owner.is_empty(): - if _home_world.is_avatar_near_interior_exit(_player, home_owner): - if _network_home.request_exit(): - _game_ui.set_storage_prompt_visible(false) - get_viewport().set_input_as_handled() - return if ( _network_home.can_local_decorate() and _fishing_spot.can_open_fishing_shop() and _game_ui.get_player_storage().open_storage_from_home(true) ): - _game_ui.set_storage_prompt_visible(false) + _refresh_home_door_prompt({}) get_viewport().set_input_as_handled() return var nearby_home_owner: String = _home_world.find_nearby_exterior_owner( @@ -1671,9 +1700,18 @@ func _unhandled_input(event: InputEvent) -> void: ) if not nearby_home_owner.is_empty(): if _network_home.request_enter(nearby_home_owner): - _game_ui.set_storage_prompt_visible(false) + _refresh_home_door_prompt({}) get_viewport().set_input_as_handled() return + if ( + _rv_upgrade_shop_interaction != null + and _rv_upgrade_shop_interaction.is_local_player_in_range() + and _fishing_spot.can_open_fishing_shop() + and _game_ui.get_rv_upgrade_shop().open_shop() + ): + _game_ui.set_shop_prompt_visible(false) + get_viewport().set_input_as_handled() + return if ( _decor_shop_interaction != null and _decor_shop_interaction.is_local_player_in_range() @@ -1703,14 +1741,24 @@ func _process(delta: float) -> void: ) _print_dedicated_metrics() return + _maybe_begin_home_exit_transition() + var show_rv_upgrade_prompt := _can_show_rv_upgrade_shop_prompt() var show_decor_shop_prompt := _can_show_decor_shop_prompt() - var show_shop_prompt := show_decor_shop_prompt or _can_show_shop_prompt() + var show_shop_prompt := ( + show_rv_upgrade_prompt + or show_decor_shop_prompt + or _can_show_shop_prompt() + ) var shop_prompt_anchor := ( - _decor_shop_interaction.get_prompt_anchor_position() - if show_decor_shop_prompt + _rv_upgrade_shop_interaction.get_prompt_anchor_position() + if show_rv_upgrade_prompt else ( - _shop_interaction.get_prompt_anchor_position() - if _shop_interaction != null else Vector3.ZERO + _decor_shop_interaction.get_prompt_anchor_position() + if show_decor_shop_prompt + else ( + _shop_interaction.get_prompt_anchor_position() + if _shop_interaction != null else Vector3.ZERO + ) ) ) _game_ui.set_shop_prompt_visible( @@ -1718,11 +1766,7 @@ func _process(delta: float) -> void: shop_prompt_anchor, ) var home_prompt := _get_home_prompt() - _game_ui.set_storage_prompt_visible( - not home_prompt.is_empty(), - home_prompt.get("anchor", Vector3.ZERO), - str(home_prompt.get("label", "enter RV")), - ) + _refresh_home_door_prompt(home_prompt) _game_ui.set_rv_storage_button_visible( _can_show_rv_storage_button() ) @@ -2577,12 +2621,23 @@ func _refresh_active_world_bindings() -> void: _decor_shop_interaction.local_player_range_changed.disconnect( _on_decor_shop_range_changed ) + if is_instance_valid(_rv_upgrade_shop_interaction): + if _rv_upgrade_shop_interaction.local_player_range_changed.is_connected( + _on_rv_upgrade_shop_range_changed + ): + _rv_upgrade_shop_interaction.local_player_range_changed.disconnect( + _on_rv_upgrade_shop_range_changed + ) _shop_interaction = _test_world.get_fishing_shop() _decor_shop_interaction = _test_world.get_decor_shop() + _rv_upgrade_shop_interaction = _test_world.get_rv_upgrade_shop() _storage_interaction = _test_world.get_player_storage() _network_sale.set_shop_interaction(_shop_interaction) _network_shop.set_shop_interaction(_shop_interaction) _network_shop.set_decor_shop_interaction(_decor_shop_interaction) + _network_shop.set_rv_upgrade_shop_interaction( + _rv_upgrade_shop_interaction + ) if _dedicated_runtime: return if _shop_interaction != null: @@ -2600,10 +2655,16 @@ func _refresh_active_world_bindings() -> void: _decor_shop_interaction.local_player_range_changed.connect( _on_decor_shop_range_changed ) + if _rv_upgrade_shop_interaction != null: + _rv_upgrade_shop_interaction.setup_local_player(_player) + _rv_upgrade_shop_interaction.local_player_range_changed.connect( + _on_rv_upgrade_shop_range_changed + ) _game_ui.set_world_interactions( _shop_interaction, _storage_interaction, _decor_shop_interaction, + _rv_upgrade_shop_interaction, ) _on_shop_range_changed( _shop_interaction != null @@ -2617,6 +2678,10 @@ func _refresh_active_world_bindings() -> void: _decor_shop_interaction != null and _decor_shop_interaction.is_local_player_in_range() ) + _on_rv_upgrade_shop_range_changed( + _rv_upgrade_shop_interaction != null + and _rv_upgrade_shop_interaction.is_local_player_in_range() + ) func _on_water_recovery_starting() -> void: @@ -2631,6 +2696,7 @@ func _on_water_recovery_starting() -> void: _game_ui.get_pause_menu().close_for_water_recovery() _game_ui.get_fishing_shop().close_for_water_recovery() _game_ui.get_decor_shop().close_for_water_recovery() + _game_ui.get_rv_upgrade_shop().close_for_water_recovery() _game_ui.get_player_storage().close_for_water_recovery() @@ -2679,6 +2745,7 @@ func _on_active_hotbar_item_changed( and item != null and item.is_available() and _player.bag.owns_item(item_id) + and not String(_network_home.get_local_space()).begins_with("rv:") ) var active_is_catching_net: bool = ( item_id == FishingShopStockType.CRAB_NET_ID @@ -2828,6 +2895,8 @@ func _finish_quit() -> void: func _exit_tree() -> void: + _cancel_home_entry_transition() + _cancel_home_exit_transition(true) if _dedicated_runtime and _network_session != null: _network_session.disconnect_session("Dedicated server stopping.") if _title_music_tween != null: @@ -2845,52 +2914,46 @@ func _exit_tree() -> void: func _on_shop_range_changed(in_range: bool) -> void: - _game_ui.set_shop_npc_player_in_range( - in_range - or ( - _decor_shop_interaction != null - and _decor_shop_interaction.is_local_player_in_range() - ) - ) + _refresh_shop_npc_speech_state() if not in_range: _game_ui.get_fishing_shop().close_for_range_exit() - _game_ui.set_shop_prompt_visible(_can_show_shop_prompt()) + _game_ui.set_shop_prompt_visible(_can_show_any_shop_prompt()) func _on_storage_range_changed(in_range: bool) -> void: if not in_range: _game_ui.get_player_storage().close_for_range_exit() var prompt := _get_home_prompt() - _game_ui.set_storage_prompt_visible( - not prompt.is_empty(), - prompt.get("anchor", Vector3.ZERO), - str(prompt.get("label", "enter RV")), - ) + _refresh_home_door_prompt(prompt) _game_ui.set_rv_storage_button_visible( _can_show_rv_storage_button() ) func _on_decor_shop_range_changed(in_range: bool) -> void: - _game_ui.set_shop_npc_player_in_range( - in_range - or ( - _shop_interaction != null - and _shop_interaction.is_local_player_in_range() - ) - ) + _refresh_shop_npc_speech_state() if not in_range: _game_ui.get_decor_shop().close_for_range_exit() - _game_ui.set_shop_prompt_visible( - _can_show_shop_prompt() or _can_show_decor_shop_prompt() - ) + _game_ui.set_shop_prompt_visible(_can_show_any_shop_prompt()) + + +func _on_rv_upgrade_shop_range_changed(in_range: bool) -> void: + _refresh_shop_npc_speech_state() + if not in_range: + _game_ui.get_rv_upgrade_shop().close_for_range_exit() + _game_ui.set_shop_prompt_visible(_can_show_any_shop_prompt()) + + +func _on_home_state_changed() -> void: + _refresh_shop_npc_speech_state() func _on_local_home_space_changed( space_id: StringName, - _owner_fingerprint: String, + owner_fingerprint: String, ) -> void: var inside_rv: bool = String(space_id).begins_with("rv:") + _refresh_active_hotbar_item() _fishing_spot.set_fishing_environment_enabled(not inside_rv) _game_ui.set_rv_interior_camera_mode( inside_rv @@ -2898,6 +2961,171 @@ func _on_local_home_space_changed( _game_ui.set_rv_storage_button_visible( _can_show_rv_storage_button() ) + if inside_rv and not _home_exit_transition_active: + _begin_home_entry_transition(owner_fingerprint) + elif not inside_rv and _home_entry_transition_active: + _cancel_home_entry_transition() + + +func _begin_home_entry_transition(owner_fingerprint: String) -> void: + if owner_fingerprint.is_empty() or _home_entry_transition_active: + return + _home_entry_transition_active = true + _refresh_home_door_prompt({}) + _player.set_local_input_suppressed(HOME_ENTRY_INPUT_OWNER, true) + _player.set_camera_input_suppressed(HOME_ENTRY_INPUT_OWNER, true) + var inward_direction: Vector3 = ( + -_home_world.get_interior_exit_direction(owner_fingerprint) + ) + _player.face_world_direction(inward_direction) + _player.begin_animation_action(PlayerType.CHARACTER_WALKING_ANIMATION) + _home_entry_walk_tween = create_tween() + _home_entry_walk_tween.set_trans(Tween.TRANS_SINE) + _home_entry_walk_tween.set_ease(Tween.EASE_IN_OUT) + _home_entry_walk_tween.tween_property( + _player, + "global_position", + _player.global_position + inward_direction * HOME_ENTRY_WALK_DISTANCE, + HOME_ENTRY_WALK_DURATION, + ) + _home_entry_walk_tween.finished.connect( + _cancel_home_entry_transition, + CONNECT_ONE_SHOT, + ) + + +func _cancel_home_entry_transition() -> void: + if _home_entry_walk_tween != null and _home_entry_walk_tween.is_valid(): + _home_entry_walk_tween.kill() + _home_entry_walk_tween = null + if is_instance_valid(_player): + _player.end_animation_action() + _player.set_local_input_suppressed(HOME_ENTRY_INPUT_OWNER, false) + _player.set_camera_input_suppressed(HOME_ENTRY_INPUT_OWNER, false) + _home_entry_transition_active = false + + +func _maybe_begin_home_exit_transition() -> void: + if ( + _home_exit_transition_active + or _home_entry_transition_active + or not _gameplay_started + or _water_recovery.is_recovery_active() + or not _fishing_spot.can_open_fishing_shop() + or _game_ui.get_player_storage().visible + or _game_ui.get_fishing_shop().visible + or _game_ui.get_decor_shop().visible + or _game_ui.get_rv_upgrade_shop().visible + ): + return + var owner_fingerprint: String = ( + _network_home.get_local_home_owner_fingerprint() + ) + if ( + owner_fingerprint.is_empty() + or not _home_world.has_avatar_crossed_interior_exit_threshold( + _player, + owner_fingerprint, + ) + ): + return + _begin_home_exit_transition(owner_fingerprint) + + +func _begin_home_exit_transition(owner_fingerprint: String) -> void: + _home_exit_transition_active = true + _home_exit_waiting_for_network = false + _home_exit_start_position = _player.global_position + _refresh_home_door_prompt({}) + _player.set_local_input_suppressed(HOME_EXIT_INPUT_OWNER, true) + _player.set_camera_input_suppressed(HOME_EXIT_INPUT_OWNER, true) + var exit_direction: Vector3 = _home_world.get_interior_exit_direction( + owner_fingerprint + ) + _player.face_world_direction(exit_direction) + _player.begin_animation_action(PlayerType.CHARACTER_WALKING_ANIMATION) + _home_exit_walk_tween = create_tween() + _home_exit_walk_tween.set_trans(Tween.TRANS_SINE) + _home_exit_walk_tween.set_ease(Tween.EASE_IN_OUT) + _home_exit_walk_tween.tween_property( + _player, + "global_position", + _player.global_position + exit_direction * HOME_EXIT_WALK_DISTANCE, + HOME_EXIT_WALK_DURATION, + ) + _home_exit_walk_tween.finished.connect( + _on_home_exit_walk_finished, + CONNECT_ONE_SHOT, + ) + + +func _on_home_exit_walk_finished() -> void: + _home_exit_walk_tween = null + if not _home_exit_transition_active: + return + # End the walking action on the same frame translation ends. The fade and + # authoritative relocation may take longer, but a stationary avatar must + # never keep cycling its walk animation during that wait. + _player.end_animation_action() + _game_ui.get_screen_fade().fade_to_black(HOME_EXIT_FADE_GENERATION) + + +func _on_home_exit_fade_transition_completed( + generation: int, + faded_to_black: bool, +) -> void: + if ( + generation != HOME_EXIT_FADE_GENERATION + or not _home_exit_transition_active + ): + return + if faded_to_black: + # A local host can apply the authoritative transition synchronously from + # request_exit(). Mark this first so its completion signal is not lost. + _home_exit_waiting_for_network = true + var request_started: bool = _network_home.request_exit() + if not request_started: + _home_exit_waiting_for_network = false + _player.global_position = _home_exit_start_position + _game_ui.get_screen_fade().fade_from_black( + HOME_EXIT_FADE_GENERATION + ) + return + _cancel_home_exit_transition(false) + + +func _on_local_home_transition_finished( + accepted: bool, + _message: String, +) -> void: + if ( + not _home_exit_transition_active + or not _home_exit_waiting_for_network + ): + return + _home_exit_waiting_for_network = false + if not accepted: + _player.global_position = _home_exit_start_position + _game_ui.get_screen_fade().fade_from_black(HOME_EXIT_FADE_GENERATION) + + +func _cancel_home_exit_transition(reset_fade: bool) -> void: + if _home_exit_walk_tween != null and _home_exit_walk_tween.is_valid(): + _home_exit_walk_tween.kill() + _home_exit_walk_tween = null + if is_instance_valid(_player): + _player.end_animation_action() + _player.set_local_input_suppressed(HOME_EXIT_INPUT_OWNER, false) + _player.set_camera_input_suppressed(HOME_EXIT_INPUT_OWNER, false) + if ( + reset_fade + and is_instance_valid(_game_ui) + and is_instance_valid(_game_ui.get_screen_fade()) + ): + _game_ui.get_screen_fade().reset_immediately() + _home_exit_transition_active = false + _home_exit_waiting_for_network = false + _home_exit_start_position = Vector3.ZERO func _on_rv_storage_requested() -> void: @@ -2913,6 +3141,7 @@ func _can_show_shop_prompt() -> bool: and _shop_interaction.is_local_player_in_range() and not _game_ui.get_fishing_shop().visible and not _game_ui.get_decor_shop().visible + and not _game_ui.get_rv_upgrade_shop().visible and not _water_recovery.is_recovery_active() and _fishing_spot.can_open_fishing_shop() ) @@ -2925,15 +3154,96 @@ func _can_show_decor_shop_prompt() -> bool: and _decor_shop_interaction.is_local_player_in_range() and not _game_ui.get_decor_shop().visible and not _game_ui.get_fishing_shop().visible + and not _game_ui.get_rv_upgrade_shop().visible and not _water_recovery.is_recovery_active() and _fishing_spot.can_open_fishing_shop() ) +func _can_show_rv_upgrade_shop_prompt() -> bool: + return ( + _gameplay_started + and _rv_upgrade_shop_interaction != null + and _rv_upgrade_shop_interaction.is_local_player_in_range() + and not _game_ui.get_rv_upgrade_shop().visible + and not _game_ui.get_fishing_shop().visible + and not _game_ui.get_decor_shop().visible + and not _water_recovery.is_recovery_active() + and _fishing_spot.can_open_fishing_shop() + ) + + +func _can_show_any_shop_prompt() -> bool: + return ( + _can_show_shop_prompt() + or _can_show_decor_shop_prompt() + or _can_show_rv_upgrade_shop_prompt() + ) + + +func _is_any_shop_npc_in_range() -> bool: + return ( + ( + _shop_interaction != null + and _shop_interaction.is_local_player_in_range() + ) + or ( + _decor_shop_interaction != null + and _decor_shop_interaction.is_local_player_in_range() + ) + or ( + _rv_upgrade_shop_interaction != null + and _rv_upgrade_shop_interaction.is_local_player_in_range() + ) + ) + + +func _refresh_shop_npc_speech_state() -> void: + var interaction := _get_active_shop_npc_interaction() + var dialogue_text: String = "" + if interaction != null: + dialogue_text = interaction.get_dialogue_text(_home_state.get_tier()) + _game_ui.set_shop_npc_player_in_range( + interaction != null, + dialogue_text, + ) + + +func _get_active_shop_npc_interaction() -> FishingShopInteractionType: + # Match the interaction and prompt priority used above: RV, decor, fishing. + if ( + _rv_upgrade_shop_interaction != null + and _rv_upgrade_shop_interaction.is_local_player_in_range() + ): + return _rv_upgrade_shop_interaction + if ( + _decor_shop_interaction != null + and _decor_shop_interaction.is_local_player_in_range() + ): + return _decor_shop_interaction + if ( + _shop_interaction != null + and _shop_interaction.is_local_player_in_range() + ): + return _shop_interaction + return null + + func _can_show_storage_prompt() -> bool: return not _get_home_prompt().is_empty() +func _refresh_home_door_prompt(prompt: Dictionary) -> void: + # Home entry belongs to the doorway in world space. Keep the retired HUD + # prompt hidden so it cannot overlap the compact door-mounted sign. + _game_ui.set_storage_prompt_visible(false) + _home_world.set_exterior_prompt_visible( + str(prompt.get("owner_fingerprint", "")), + not prompt.is_empty(), + str(prompt.get("label", "enter home")), + ) + + func _can_show_rv_storage_button() -> bool: return ( _gameplay_started @@ -2950,6 +3260,7 @@ func _get_home_prompt() -> Dictionary: or _game_ui.get_player_storage().visible or _game_ui.get_fishing_shop().visible or _game_ui.get_decor_shop().visible + or _game_ui.get_rv_upgrade_shop().visible or _water_recovery.is_recovery_active() or not _fishing_spot.can_open_fishing_shop() ): @@ -2958,20 +3269,12 @@ func _get_home_prompt() -> Dictionary: _network_home.get_local_home_owner_fingerprint() ) if not owner_fingerprint.is_empty(): - if _home_world.is_avatar_near_interior_exit( - _player, owner_fingerprint - ): - return { - "label": "leave RV", - "anchor": _home_world.get_interior_prompt_position( - owner_fingerprint - ), - } return {} var nearby_owner: String = _home_world.find_nearby_exterior_owner(_player) if nearby_owner.is_empty(): return {} return { - "label": "enter RV", + "label": "enter home", "anchor": _home_world.get_exterior_prompt_position(nearby_owner), + "owner_fingerprint": nearby_owner, } diff --git a/network/network_home_service.gd b/network/network_home_service.gd index 33fa6ee..4885961 100644 --- a/network/network_home_service.gd +++ b/network/network_home_service.gd @@ -27,6 +27,8 @@ var _manifests_by_fingerprint: Dictionary[String, Dictionary] = {} var _fingerprint_by_peer: Dictionary[int, String] = {} var _authorized_owned_counts: Dictionary[int, Dictionary] = {} var _authorization_result_owner: Dictionary[String, int] = {} +var _authorized_home_tiers: Dictionary[int, int] = {} +var _home_upgrade_result_owner: Dictionary[String, int] = {} var _interior_slots_by_space: Dictionary[StringName, Dictionary] = {} var _next_interior_index: int = 0 var _suppress_local_submission: bool = false @@ -103,6 +105,17 @@ func get_authoritative_owned_count( return int(owned.get(String(decor_id), 0)) +func get_authoritative_home_tier(peer_id: int) -> int: + if _authorized_home_tiers.has(peer_id): + return int(_authorized_home_tiers[peer_id]) + var fingerprint: String = _fingerprint_for_peer(peer_id) + var manifest: Dictionary = _manifests_by_fingerprint.get(fingerprint, {}) + if manifest.is_empty(): + return -1 + var home: Dictionary = manifest.get("home", {}) + return int(home.get("tier", -1)) + + func place_local_decor( decor_id: StringName, position: Vector3, @@ -337,6 +350,35 @@ func finalize_decor_purchase( _authorized_owned_counts.erase(peer_id) +func authorize_home_upgrade( + peer_id: int, + resulting_tier: int, + result_id: String, +) -> void: + if ( + not _session.is_host() + or peer_id <= 0 + or result_id.is_empty() + or resulting_tier < PlayerHomeStateType.STARTER_TIER + or resulting_tier > PlayerHomeStateType.MAX_TIER + ): + return + _authorized_home_tiers[peer_id] = resulting_tier + _home_upgrade_result_owner[result_id] = peer_id + + +func finalize_home_upgrade( + peer_id: int, + result_id: String, + applied: bool, +) -> void: + if _home_upgrade_result_owner.get(result_id, 0) != peer_id: + return + _home_upgrade_result_owner.erase(result_id) + if not applied: + _authorized_home_tiers.erase(peer_id) + + func refresh_world_presentations() -> void: if _world_service == null: return @@ -442,7 +484,7 @@ func _process_manifest_request(peer_id: int, data: Dictionary) -> void: not NetworkHomeProtocolType.validate_manifest_request(data) or str(data["session_id"]) != _session.get_session_id() ): - _reject_manifest(peer_id, "The RV update was invalid.") + _reject_manifest(peer_id, "The home update was invalid.") return var record := _session.get_peer_record(peer_id) var fingerprint: String = str(data["owner_fingerprint"]) @@ -456,7 +498,7 @@ func _process_manifest_request(peer_id: int, data: Dictionary) -> void: data["sender_signature"], ) ): - _reject_manifest(peer_id, "The RV owner could not be verified.") + _reject_manifest(peer_id, "The home owner could not be verified.") return var home_data: Dictionary = PlayerHomeStateType.sanitize_save_data( data["home"] @@ -464,7 +506,7 @@ func _process_manifest_request(peer_id: int, data: Dictionary) -> void: var prior: Dictionary = _manifests_by_fingerprint.get(fingerprint, {}) var is_first_manifest: bool = prior.is_empty() if not _valid_manifest_revision(peer_id, prior, home_data): - _reject_manifest(peer_id, "The RV update was rejected by the host.") + _reject_manifest(peer_id, "The home update was rejected by the host.") return if not _moved_decor_clear_of_players(fingerprint, prior, home_data): _reject_manifest(peer_id, "A player is in the way of that decor.") @@ -472,7 +514,7 @@ func _process_manifest_request(peer_id: int, data: Dictionary) -> void: var manifest: Dictionary if prior.is_empty(): if _manifests_by_fingerprint.size() >= MAX_MANIFESTS: - _reject_manifest(peer_id, "This room cannot place another RV.") + _reject_manifest(peer_id, "This room cannot place another home.") return var reserved: Array[Transform3D] = [] for existing: Dictionary in _manifests_by_fingerprint.values(): @@ -523,10 +565,17 @@ func _valid_manifest_revision( # no prior room ledger with which to compare its first manifest. return true var prior_home: Dictionary = prior_manifest["home"] + var prior_tier: int = int(prior_home["tier"]) + var next_tier: int = int(home_data["tier"]) + var tier_is_authorized: bool = ( + next_tier != prior_tier + and int(_authorized_home_tiers.get(peer_id, -1)) == next_tier + ) if ( int(home_data["revision"]) <= int(prior_home["revision"]) - or int(home_data["tier"]) != int(prior_home["tier"]) - or str(home_data["exterior_id"]) != str(prior_home["exterior_id"]) + or (next_tier != prior_tier and not tier_is_authorized) + or str(home_data["exterior_id"]) + != str(PlayerHomeStateType.exterior_id_for_tier(next_tier)) ): return false var prior_owned: Dictionary = prior_home["owned_decor"] @@ -619,6 +668,11 @@ static func _placement_position(placement: Dictionary) -> Vector3: func _consume_owned_authorizations(peer_id: int, home_data: Dictionary) -> void: + if ( + _authorized_home_tiers.has(peer_id) + and int(home_data["tier"]) == int(_authorized_home_tiers[peer_id]) + ): + _authorized_home_tiers.erase(peer_id) var authorized: Dictionary = _authorized_owned_counts.get(peer_id, {}) if authorized.is_empty(): return @@ -1027,7 +1081,7 @@ func _process_transition_request(peer_id: int, data: Dictionary) -> void: data["sender_signature"], ) ): - _send_transition_rejection(peer_id, "The RV transition was invalid.") + _send_transition_rejection(peer_id, "The home transition was invalid.") return var owner_fingerprint: String = str(data["owner_fingerprint"]) var action: int = int(data["action"]) @@ -1036,7 +1090,7 @@ func _process_transition_request(peer_id: int, data: Dictionary) -> void: owner_fingerprint, {} ) if avatar == null or manifest.is_empty(): - _send_transition_rejection(peer_id, "That RV is unavailable.") + _send_transition_rejection(peer_id, "That home is unavailable.") return if action == NetworkHomeProtocolType.TransitionAction.ENTER: var record := _session.get_peer_record(peer_id) @@ -1052,7 +1106,7 @@ func _process_transition_request(peer_id: int, data: Dictionary) -> void: avatar, owner_fingerprint ) ): - _send_transition_rejection(peer_id, "You cannot enter that RV.") + _send_transition_rejection(peer_id, "You cannot enter that home.") return var interior_space: StringName = ( NetworkHomeProtocolType.make_space_id(owner_fingerprint) @@ -1076,7 +1130,7 @@ func _process_transition_request(peer_id: int, data: Dictionary) -> void: avatar, owner_fingerprint ) ): - _send_transition_rejection(peer_id, "Move closer to the RV door.") + _send_transition_rejection(peer_id, "Move closer to the home door.") return _apply_host_transition( peer_id, @@ -1282,6 +1336,10 @@ func _on_peer_removed(peer_id: int) -> void: var fingerprint: String = _fingerprint_by_peer.get(peer_id, "") _fingerprint_by_peer.erase(peer_id) _authorized_owned_counts.erase(peer_id) + _authorized_home_tiers.erase(peer_id) + for result_id: String in _home_upgrade_result_owner.keys(): + if int(_home_upgrade_result_owner[result_id]) == peer_id: + _home_upgrade_result_owner.erase(result_id) if fingerprint.is_empty(): return if _session.is_host(): @@ -1336,6 +1394,8 @@ func _on_session_state_changed(state: NetworkSession.State) -> void: _fingerprint_by_peer.clear() _authorized_owned_counts.clear() _authorization_result_owner.clear() + _authorized_home_tiers.clear() + _home_upgrade_result_owner.clear() _publish_queued = false _last_submitted_local_home_revision = -1 _pending_local_decor_transactions.clear() diff --git a/network/network_protocol.gd b/network/network_protocol.gd index 49aca95..5b3ca89 100644 --- a/network/network_protocol.gd +++ b/network/network_protocol.gd @@ -47,6 +47,7 @@ const FRIENDS_CAPABILITY: String = "friends_v1" const MOVEMENT_RECONCILIATION_CAPABILITY: String = "movement_reconciliation_v2" const FISHING_REPLICATION_CAPABILITY: String = "fishing_replication_v2" const HOME_CAPABILITY: String = "portable_home_v1" +const HOME_UPGRADE_CAPABILITY: String = "home_upgrade_v1" const DEFAULT_WORLD_SEED: int = 13001 const MAX_WORLD_SEED: int = 2147483646 @@ -205,6 +206,7 @@ static func make_client_hello( MOVEMENT_RECONCILIATION_CAPABILITY, FISHING_REPLICATION_CAPABILITY, HOME_CAPABILITY, + HOME_UPGRADE_CAPABILITY, ]), "cosmetic_snapshot": cosmetic_snapshot, "identity_fingerprint": identity_fingerprint, @@ -346,6 +348,7 @@ static func make_server_hello( MOVEMENT_RECONCILIATION_CAPABILITY, FISHING_REPLICATION_CAPABILITY, HOME_CAPABILITY, + HOME_UPGRADE_CAPABILITY, "chat_v1", "mail_v1", "profile_v1", diff --git a/network/network_session.gd b/network/network_session.gd index 66d5101..7c259e0 100644 --- a/network/network_session.gd +++ b/network/network_session.gd @@ -340,6 +340,7 @@ func _register_player_host() -> void: NetworkProtocol.MOVEMENT_RECONCILIATION_CAPABILITY, NetworkProtocol.FISHING_REPLICATION_CAPABILITY, NetworkProtocol.HOME_CAPABILITY, + NetworkProtocol.HOME_UPGRADE_CAPABILITY, ]), ) _registry.update_appearance(1, _local_appearance_snapshot) @@ -668,6 +669,7 @@ func supports_server_capability(capability: StringName) -> bool: NetworkProtocol.MOVEMENT_RECONCILIATION_CAPABILITY, NetworkProtocol.FISHING_REPLICATION_CAPABILITY, NetworkProtocol.HOME_CAPABILITY, + NetworkProtocol.HOME_UPGRADE_CAPABILITY, "chat_v1", "mail_v1", "profile_v1", @@ -1638,6 +1640,7 @@ func receive_server_hello(data: Dictionary) -> void: NetworkProtocol.MOVEMENT_RECONCILIATION_CAPABILITY, NetworkProtocol.FISHING_REPLICATION_CAPABILITY, NetworkProtocol.HOME_CAPABILITY, + NetworkProtocol.HOME_UPGRADE_CAPABILITY, ]), ) _registry.update_appearance(local_peer_id, _local_appearance_snapshot) diff --git a/network/network_shop_protocol.gd b/network/network_shop_protocol.gd index da9419a..e58556e 100644 --- a/network/network_shop_protocol.gd +++ b/network/network_shop_protocol.gd @@ -5,6 +5,7 @@ const CAPABILITY: StringName = &"shop_v1" const ART_CAPABILITY: StringName = &"art_shop_v1" const BACKPACK_CAPABILITY: StringName = &"backpack_shop_v1" const DECOR_CAPABILITY: StringName = &"portable_home_v1" +const HOME_UPGRADE_CAPABILITY: StringName = &"home_upgrade_v1" const RELIABLE_CHANNEL: int = NetworkProtocol.SHOP_RELIABLE_CHANNEL const MAX_ID_LENGTH: int = 96 const MAX_MESSAGE_LENGTH: int = 160 @@ -15,7 +16,7 @@ enum ProductCategory { ROD, REEL_SPEED_UPGRADE, BARRIER_POWER_UPGRADE, - COOLER_CAPACITY_UPGRADE, + HOME_UPGRADE, ART_KIT, ART_UPGRADE, BACKPACK_CAPACITY_UPGRADE, diff --git a/network/network_shop_service.gd b/network/network_shop_service.gd index 8294b53..e4d6f9c 100644 --- a/network/network_shop_service.gd +++ b/network/network_shop_service.gd @@ -12,9 +12,10 @@ const DecorCatalogType = preload("res://homes/decor_catalog.gd") const FISHING_SHOP_ID: StringName = &"main_fishing_shop" const DECOR_SHOP_ID: StringName = &"rv_decor_shop" +const RV_UPGRADE_SHOP_ID: StringName = &"rv_upgrade_shop" const REEL_PRODUCT_ID: StringName = &"reel_speed_upgrade" const BARRIER_PRODUCT_ID: StringName = &"barrier_power_upgrade" -const COOLER_PRODUCT_ID: StringName = &"cooler_capacity_upgrade" +const HOME_UPGRADE_PRODUCT_ID: StringName = &"starter_rv_upgrade" const BACKPACK_PRODUCT_ID: StringName = &"backpack_capacity_upgrade" const MAX_LEDGER_ENTRIES_PER_PEER: int = 64 @@ -34,6 +35,7 @@ var _spawn_service: PlayerSpawnService var _network_fishing: NetworkFishingService var _interaction: FishingShopInteraction var _decor_interaction: DecorShopInteraction +var _rv_upgrade_interaction: FishingShopInteraction var _wallet: PlayerWallet var _bag: PlayerBag var _item_catalog: ItemCatalog @@ -71,6 +73,7 @@ func setup( home_state: PlayerHomeState = null, network_home: NetworkHomeService = null, decor_interaction: DecorShopInteraction = null, + rv_upgrade_interaction: FishingShopInteraction = null, ) -> void: _session = session _spawn_service = spawn_service @@ -88,6 +91,7 @@ func setup( _home_state = home_state _network_home = network_home _decor_interaction = decor_interaction + _rv_upgrade_interaction = rv_upgrade_interaction if not _session.peer_removed.is_connected(_on_peer_removed): _session.peer_removed.connect(_on_peer_removed) if not _session.state_changed.is_connected(_on_session_state_changed): @@ -104,6 +108,12 @@ func set_decor_shop_interaction( _decor_interaction = interaction +func set_rv_upgrade_shop_interaction( + interaction: FishingShopInteraction, +) -> void: + _rv_upgrade_interaction = interaction + + func can_request_purchase() -> bool: return ( _session != null @@ -154,6 +164,19 @@ func can_request_decor_purchase() -> bool: ) +func can_request_home_upgrade() -> bool: + return ( + can_request_purchase() + and _home_state != null + and ( + _session.is_host() + or _session.supports_server_capability( + NetworkShopProtocol.HOME_UPGRADE_CAPABILITY + ) + ) + ) + + func is_local_purchase_pending() -> bool: return not _pending_local_request.is_empty() @@ -204,12 +227,12 @@ func request_barrier_power_upgrade() -> String: ) -func request_cooler_capacity_upgrade() -> String: +func request_home_upgrade() -> String: return _request_purchase( - COOLER_PRODUCT_ID, - NetworkShopProtocol.ProductCategory.COOLER_CAPACITY_UPGRADE, + HOME_UPGRADE_PRODUCT_ID, + NetworkShopProtocol.ProductCategory.HOME_UPGRADE, 1, - _cooler_capacity.get_level() if _cooler_capacity != null else 0 + _home_state.get_tier() if _home_state != null else 0 ) @@ -308,6 +331,15 @@ func _request_purchase( product_id, category, 0, 0, ) return "" + if ( + category == NetworkShopProtocol.ProductCategory.HOME_UPGRADE + and not can_request_home_upgrade() + ): + local_purchase_finished.emit( + "", false, "RV upgrades require a newer server.", + product_id, category, 0, 0, + ) + return "" if ( category == NetworkShopProtocol.ProductCategory.DECOR and not can_request_decor_purchase() @@ -318,11 +350,7 @@ func _request_purchase( ) return "" var request_id: String = _new_id("shop") - var shop_id: StringName = ( - DECOR_SHOP_ID - if category == NetworkShopProtocol.ProductCategory.DECOR - else FISHING_SHOP_ID - ) + var shop_id: StringName = _shop_id_for_category(category) var request: Dictionary = { "request_id": request_id, "session_id": _session.get_session_id(), @@ -402,9 +430,7 @@ func _handle_purchase_request(peer_id: int, data: Dictionary) -> void: if not _is_shop_available_for_peer(peer_id, requested_shop_id): var avatar: Player = _spawn_service.get_avatar(peer_id) var requested_interaction: FishingShopInteraction = ( - _decor_interaction - if requested_shop_id == DECOR_SHOP_ID - else _interaction + _interaction_for_shop(requested_shop_id) ) var message: String = ( "The shop is unavailable." @@ -416,16 +442,22 @@ func _handle_purchase_request(peer_id: int, data: Dictionary) -> void: var result: Dictionary = _build_authoritative_result(peer_id, data) if ( bool(result.get("accepted", false)) - and int(result.get("category", -1)) - == NetworkShopProtocol.ProductCategory.DECOR and _network_home != null ): - _network_home.authorize_decor_purchase( - peer_id, - StringName(str(result["product_id"])), - int(result["resulting_state"]), - str(result["result_id"]), - ) + match int(result.get("category", -1)): + NetworkShopProtocol.ProductCategory.DECOR: + _network_home.authorize_decor_purchase( + peer_id, + StringName(str(result["product_id"])), + int(result["resulting_state"]), + str(result["result_id"]), + ) + NetworkShopProtocol.ProductCategory.HOME_UPGRADE: + _network_home.authorize_home_upgrade( + peer_id, + int(result["resulting_state"]), + str(result["result_id"]), + ) _pending_by_peer[peer_id] = request_id _record_and_send(peer_id, result) @@ -448,14 +480,19 @@ func _build_authoritative_result( ) if authoritative_count >= 0: current_state = authoritative_count + elif ( + category == NetworkShopProtocol.ProductCategory.HOME_UPGRADE + and _network_home != null + ): + var authoritative_tier: int = ( + _network_home.get_authoritative_home_tier(peer_id) + ) + if authoritative_tier >= 0: + current_state = authoritative_tier var cost: int = -1 var resulting_state: int = current_state var rejection: String = "" - var expected_shop_id: StringName = ( - DECOR_SHOP_ID - if category == NetworkShopProtocol.ProductCategory.DECOR - else FISHING_SHOP_ID - ) + var expected_shop_id: StringName = _shop_id_for_category(category) if StringName(str(request["shop_id"])) != expected_shop_id: rejection = "The shop is unavailable." elif quantity < 1: @@ -569,18 +606,14 @@ func _build_authoritative_result( ] ) resulting_state = current_state + 1 - NetworkShopProtocol.ProductCategory.COOLER_CAPACITY_UPGRADE: + NetworkShopProtocol.ProductCategory.HOME_UPGRADE: if ( - product_id != COOLER_PRODUCT_ID - or current_state >= PlayerCoolerCapacity.MAX_LEVEL + product_id != HOME_UPGRADE_PRODUCT_ID + or current_state >= PlayerHomeState.MAX_TIER ): rejection = "Upgrade is already at maximum." else: - cost = ( - PlayerCoolerCapacity.EXPANSION_COSTS[ - current_state - ] - ) + cost = PlayerHomeState.HOME_UPGRADE_COSTS[current_state] resulting_state = current_state + 1 NetworkShopProtocol.ProductCategory.BACKPACK_CAPACITY_UPGRADE: if ( @@ -874,10 +907,12 @@ func _validate_local_result(data: Dictionary) -> String: return "Purchase could not be completed." if _upgrades.get_next_barrier_power_cost() != cost: return "Purchase could not be completed." - NetworkShopProtocol.ProductCategory.COOLER_CAPACITY_UPGRADE: - if _cooler_capacity.get_level() != expected_state: - return "Purchase could not be completed." - if _cooler_capacity.get_next_cost() != cost: + NetworkShopProtocol.ProductCategory.HOME_UPGRADE: + if ( + product_id != HOME_UPGRADE_PRODUCT_ID + or _home_state.get_tier() != expected_state + or _home_state.get_next_upgrade_cost() != cost + ): return "Purchase could not be completed." NetworkShopProtocol.ProductCategory.BACKPACK_CAPACITY_UPGRADE: if ( @@ -947,8 +982,11 @@ func _apply_local_product(data: Dictionary) -> bool: return _upgrades.purchase_reel_speed(_wallet) NetworkShopProtocol.ProductCategory.BARRIER_POWER_UPGRADE: return _upgrades.purchase_barrier_power(_wallet) - NetworkShopProtocol.ProductCategory.COOLER_CAPACITY_UPGRADE: - return _cooler_capacity.purchase(_wallet) + NetworkShopProtocol.ProductCategory.HOME_UPGRADE: + return ( + _wallet.debit(int(data["total_cost"])) + and _home_state.upgrade_to_next_tier() + ) NetworkShopProtocol.ProductCategory.BACKPACK_CAPACITY_UPGRADE: return ( _inventory_layout != null @@ -1061,6 +1099,9 @@ func _handle_acknowledgement( _network_home.finalize_decor_purchase( peer_id, result_id, applied ) + _network_home.finalize_home_upgrade( + peer_id, result_id, applied + ) _acknowledged_results[result_id] = true _bound_dictionary(_acknowledged_results) if _pending_by_peer.get(peer_id, "") == request_id: @@ -1071,11 +1112,7 @@ func _is_shop_available_for_peer( peer_id: int, shop_id: StringName, ) -> bool: - var interaction: FishingShopInteraction = ( - _decor_interaction - if shop_id == DECOR_SHOP_ID - else _interaction - ) + var interaction: FishingShopInteraction = _interaction_for_shop(shop_id) if ( _session == null or not _session.is_host() @@ -1097,6 +1134,24 @@ func _is_shop_available_for_peer( ) +func _shop_id_for_category(category: int) -> StringName: + match category: + NetworkShopProtocol.ProductCategory.DECOR: + return DECOR_SHOP_ID + NetworkShopProtocol.ProductCategory.HOME_UPGRADE: + return RV_UPGRADE_SHOP_ID + return FISHING_SHOP_ID + + +func _interaction_for_shop(shop_id: StringName) -> FishingShopInteraction: + match shop_id: + DECOR_SHOP_ID: + return _decor_interaction + RV_UPGRADE_SHOP_ID: + return _rv_upgrade_interaction + return _interaction + + func _on_peer_removed(peer_id: int) -> void: _request_ledgers.erase(peer_id) _pending_by_peer.erase(peer_id) diff --git a/player/player.gd b/player/player.gd index e36f92b..78dac3d 100644 --- a/player/player.gd +++ b/player/player.gd @@ -90,6 +90,7 @@ const CATCH_SHOWCASE_INPUT_OWNER: StringName = &"catch_showcase" # safe IDs so newer clients can extend it, but Player only presents actions # explicitly approved by this catalog. const NETWORK_ANIMATION_ACTION_IDS: Array[StringName] = [ + CHARACTER_WALKING_ANIMATION, CHARACTER_CASTING_ANIMATION, CHARACTER_NET_DRAW_ANIMATION, CHARACTER_NET_STRIKE_ANIMATION, @@ -436,6 +437,11 @@ var _rv_previous_camera_environment: Environment @export var maximum_zoom: float = 8.0 @export var zoom_step: float = 0.75 @export var zoom_smoothing: float = 12.0 +@export_range(0.0, 1.0, 0.01) var fishing_reel_zoom_amount: float = 0.22 +@export_range(0.0, 1.5, 0.01) var fishing_barrier_break_zoom: float = 0.38 +@export_range(0.05, 1.0, 0.01) var fishing_break_zoom_decay: float = 0.34 +@export_range(0.0, 0.2, 0.005) var fishing_barrier_hit_shake: float = 0.018 +@export_range(0.0, 0.3, 0.005) var fishing_barrier_break_shake: float = 0.045 @export_range(0.1, 12.0, 0.1) var controller_zoom_speed: float = 4.0 @export_range(0.0, 1.0, 0.01) var controller_trigger_threshold: float = 0.55 @export_range(1.0, 40.0, 0.5) var free_camera_speed: float = 10.0 @@ -497,6 +503,12 @@ var _remote_recovery_presentation_active: bool = false var _remote_recovery_visual_origin: Vector3 var _remote_recovery_elapsed: float = 0.0 var _target_zoom: float = 5.0 +var _fishing_reel_camera_active: bool = false +var _fishing_break_zoom_offset: float = 0.0 +var _fishing_camera_shake_remaining: float = 0.0 +var _fishing_camera_shake_duration: float = 0.0 +var _fishing_camera_shake_strength: float = 0.0 +var _fishing_camera_shake_phase: float = 0.0 var _showcase_rod_visibility: bool = true var _showcase_net_visibility: bool = false var _showcase_shovel_visibility: bool = false @@ -1162,6 +1174,7 @@ func _process(delta: float) -> void: ) if not local_control_enabled: return + _update_fishing_camera_effects(delta) if _free_camera_active: if _is_camera_input_enabled(): _rotate_free_camera( @@ -1190,13 +1203,68 @@ func _process(delta: float) -> void: ) var zoom_weight: float = 1.0 - exp(-zoom_smoothing * delta) + var fishing_zoom_offset: float = ( + fishing_reel_zoom_amount + if _fishing_reel_camera_active + else 0.0 + ) + _fishing_break_zoom_offset + var effective_target_zoom: float = clampf( + _target_zoom - fishing_zoom_offset, + 1.25 if _rv_interior_camera_mode else minimum_zoom, + 16.0 if _rv_interior_camera_mode else maximum_zoom, + ) _spring_arm.spring_length = lerpf( _spring_arm.spring_length, - _target_zoom, + effective_target_zoom, zoom_weight ) +func set_fishing_reel_camera_active(active: bool) -> void: + _fishing_reel_camera_active = active + + +func play_fishing_barrier_camera_feedback(barrier_broken: bool) -> void: + if not local_control_enabled or _free_camera_active: + return + _fishing_camera_shake_strength = ( + fishing_barrier_break_shake + if barrier_broken + else fishing_barrier_hit_shake + ) + _fishing_camera_shake_duration = 0.20 if barrier_broken else 0.10 + _fishing_camera_shake_remaining = _fishing_camera_shake_duration + if barrier_broken: + _fishing_break_zoom_offset = fishing_barrier_break_zoom + + +func _update_fishing_camera_effects(delta: float) -> void: + _fishing_break_zoom_offset = move_toward( + _fishing_break_zoom_offset, + 0.0, + ( + fishing_barrier_break_zoom + / maxf(fishing_break_zoom_decay, 0.05) + ) * delta, + ) + if _fishing_camera_shake_remaining <= 0.0: + _camera.h_offset = 0.0 + _camera.v_offset = 0.0 + return + _fishing_camera_shake_remaining = maxf( + _fishing_camera_shake_remaining - delta, + 0.0, + ) + _fishing_camera_shake_phase += delta * 92.0 + var decay: float = ( + _fishing_camera_shake_remaining + / maxf(_fishing_camera_shake_duration, 0.001) + ) + var strength: float = _fishing_camera_shake_strength * decay + _camera.h_offset = sin(_fishing_camera_shake_phase) * strength + _camera.v_offset = cos(_fishing_camera_shake_phase * 1.31) * strength * 0.7 + + func _update_blink(delta: float) -> void: if _fighting_visual_active: return @@ -3052,6 +3120,19 @@ func set_camera_active(active: bool) -> void: _camera.current = active +func face_world_direction(direction: Vector3) -> void: + var horizontal_direction := Vector3(direction.x, 0.0, direction.z) + if horizontal_direction.is_zero_approx() or _visuals == null: + return + horizontal_direction = horizontal_direction.normalized() + var target_world_yaw: float = atan2( + -horizontal_direction.x, + -horizontal_direction.z, + ) + _visuals.rotation.y = target_world_yaw - global_rotation.y + _network_target_visual_yaw = _visuals.rotation.y + + func apply_camera_settings( new_mouse_sensitivity: float, new_controller_sensitivity: float, diff --git a/progression/player_cooler_capacity.gd b/progression/player_cooler_capacity.gd index b8c62be..bbd0b87 100644 --- a/progression/player_cooler_capacity.gd +++ b/progression/player_cooler_capacity.gd @@ -2,62 +2,77 @@ class_name PlayerCoolerCapacity extends Node const PlayerWalletType = preload("res://economy/player_wallet.gd") +const PlayerHomeStateType = preload("res://homes/player_home_state.gd") signal capacity_changed(level: int, capacity: int) -## Kept under the historical class name so existing saves and network product -## identifiers migrate without losing their purchased level. This progression -## now controls the player's private storage box rather than carried catches. +## Compatibility adapter for saves and systems that still refer to the old +## cooler-capacity object. Storage is now derived exclusively from the player's +## home tier; this object is not independently purchasable. const CAPACITIES: Array[int] = [9, 18, 27, 36, 45, 54, 63, 72] const EXPANSION_COSTS: Array[int] = [75, 175, 400, 850, 1500, 2500, 4000] const MAX_LEVEL: int = 7 const MAX_CAPACITY: int = 72 -var _capacity_level: int = 0 +var _home_state: PlayerHomeStateType +var _legacy_capacity_level: int = 0 + + +func bind_home_state(home_state: PlayerHomeStateType) -> void: + if _home_state == home_state: + return + if ( + _home_state != null + and _home_state.changed.is_connected(_on_home_changed) + ): + _home_state.changed.disconnect(_on_home_changed) + _home_state = home_state + if ( + _home_state != null + and not _home_state.changed.is_connected(_on_home_changed) + ): + _home_state.changed.connect(_on_home_changed) + _on_home_changed() func get_level() -> int: - return _capacity_level + return _legacy_capacity_level func get_capacity() -> int: - return CAPACITIES[_capacity_level] + if _home_state != null: + # A new home upgrade grants its authored capacity. Older saves retain any + # separately purchased storage level so reducing the first RV tier cannot + # hide or discard items that were already placed in later slots. + return maxi( + _home_state.get_storage_capacity(), + CAPACITIES[clampi(_legacy_capacity_level, 0, MAX_LEVEL)], + ) + return CAPACITIES[clampi(_legacy_capacity_level, 0, MAX_LEVEL)] func get_next_capacity() -> int: - if _capacity_level >= MAX_LEVEL: - return -1 - return CAPACITIES[_capacity_level + 1] + return -1 func get_next_cost() -> int: - if _capacity_level >= MAX_LEVEL: - return -1 - return EXPANSION_COSTS[_capacity_level] + return -1 -func can_purchase(wallet: PlayerWalletType) -> bool: - var cost: int = get_next_cost() - return wallet != null and cost >= 0 and wallet.can_afford(cost) +func can_purchase(_wallet: PlayerWalletType) -> bool: + return false -func purchase(wallet: PlayerWalletType) -> bool: - if not can_purchase(wallet): - return false - var cost: int = get_next_cost() - if not wallet.debit(cost): - return false - _capacity_level += 1 - capacity_changed.emit(_capacity_level, get_capacity()) - return true +func purchase(_wallet: PlayerWalletType) -> bool: + return false func restore_level(level: int) -> bool: var validated: int = clampi(level, 0, MAX_LEVEL) - var changed: bool = _capacity_level != validated - _capacity_level = validated + var changed: bool = _legacy_capacity_level != validated + _legacy_capacity_level = validated if changed: - capacity_changed.emit(_capacity_level, get_capacity()) + capacity_changed.emit(get_level(), get_capacity()) return true @@ -66,4 +81,8 @@ func reset_to_defaults() -> void: func to_save_data() -> Dictionary: - return {"capacity_level": _capacity_level} + return {"capacity_level": get_level()} + + +func _on_home_changed() -> void: + capacity_changed.emit(get_level(), get_capacity()) diff --git a/save/player_save_manager.gd b/save/player_save_manager.gd index 56fd49c..c41f861 100644 --- a/save/player_save_manager.gd +++ b/save/player_save_manager.gd @@ -338,6 +338,11 @@ func load_player_data() -> bool: snapshot.reel_speed_level, snapshot.barrier_power_level ) + # Home tier is now the authority for private-storage capacity, so restore it + # before the compatibility capacity adapter and inventory layout. + var home_restored: bool = _home_state.restore_from_save_data( + snapshot.home_data + ) var cooler_restored: bool = _cooler_capacity.restore_level( snapshot.cooler_capacity_level ) @@ -368,9 +373,6 @@ func load_player_data() -> bool: snapshot.world_weather_seconds_remaining, ) var jobs_restored: bool = _jobs.restore_from_save_data(snapshot.jobs_data) - var home_restored: bool = _home_state.restore_from_save_data( - snapshot.home_data - ) _is_restoring = false if ( not inventory_restored @@ -1324,6 +1326,26 @@ func _build_load_snapshot(save_data: Dictionary) -> LoadSnapshot: PlayerCoolerCapacityType.MAX_LEVEL, "cooler.capacity_level" ) + # Before homes had upgrade tiers, storage was purchased separately. Preserve + # those saves by granting the starter RV to anybody who owned at least one + # legacy expansion. PlayerCoolerCapacity also retains the purchased legacy + # capacity so entries beyond the new RV's first 18 slots remain accessible. + if ( + snapshot.cooler_capacity_level > 0 + and int(snapshot.home_data.get("tier", 0)) + == PlayerHomeStateType.STARTER_TIER + ): + var migrated_home: Dictionary = home_data.duplicate(true) + migrated_home["tier"] = PlayerHomeStateType.STARTER_RV_TIER + migrated_home["exterior_id"] = String( + PlayerHomeStateType.STARTER_RV_EXTERIOR_ID + ) + var sanitized_migrated_home := ( + PlayerHomeStateType.sanitize_save_data(migrated_home) + ) + if sanitized_migrated_home.is_empty(): + return null + snapshot.home_data = sanitized_migrated_home snapshot.art_unlock_mask = _read_integer( art_data.get("unlock_mask"), 0, diff --git a/tests/economy_regression_validation.gd b/tests/economy_regression_validation.gd index ff82495..0728d82 100644 --- a/tests/economy_regression_validation.gd +++ b/tests/economy_regression_validation.gd @@ -53,7 +53,7 @@ func _run() -> void: ) assert(player != null) assert(catalog != null and catalog.candidates.size() == 316) - assert(LogbookCatalog.ordered_species(catalog.candidates).size() == 313) + assert(LogbookCatalog.ordered_species(catalog.candidates).size() == 314) assert(sale_service != null) assert(shop_service != null) assert(session != null and session.is_host()) @@ -82,7 +82,7 @@ func _run() -> void: main, player, catalog, sale_service, reservations ) _test_host_backpack_purchase(player, shop_service) - _test_host_storage_purchase(player, shop_service) + await _test_host_home_upgrade(main, player, shop_service) assert(not sale_service.is_local_sale_pending()) assert(not shop_service.is_local_purchase_pending()) @@ -175,7 +175,6 @@ func _run_multiplayer_client() -> void: assert(player.inventory_layout.restore_backpack_level( PlayerInventoryLayout.MAX_BACKPACK_LEVEL )) - assert(player.cooler_capacity.restore_level(PlayerCoolerCapacity.MAX_LEVEL)) player.inventory.set_inventory_layout(null) var catch_ids: Array[StringName] = [] for fish: FishData in catalog.candidates: @@ -202,7 +201,6 @@ func _run_multiplayer_client() -> void: assert(not player.inventory.contains_catch_id(catch_id)) assert(not sale_service.is_local_sale_pending()) assert(player.inventory_layout.restore_backpack_level(0)) - assert(player.cooler_capacity.restore_level(0)) var interaction := main.get("_shop_interaction") as FishingShopInteraction player.global_position = interaction.global_position @@ -567,27 +565,49 @@ func _test_host_backpack_purchase( assert(layout.get_next_backpack_cost() == -1) -func _test_host_storage_purchase( +func _test_host_home_upgrade( + main: Node, player: Player, shop_service: NetworkShopService, ) -> void: + var interaction := main.get( + "_rv_upgrade_shop_interaction" + ) as RVUpgradeInteraction + var home_state := main.get("_home_state") as PlayerHomeState var capacity := player.cooler_capacity + assert(interaction != null and home_state != null) + player.global_position = interaction.global_position + for _frame: int in 4: + await physics_frame + assert(interaction.is_avatar_in_range(player)) + assert(home_state.get_tier() == PlayerHomeState.STARTER_TIER) + assert( + interaction.get_dialogue_text(home_state.get_tier()) + == RVUpgradeInteraction.TENT_DIALOGUE_TEXT + ) assert(capacity.get_capacity() == 9) - var total_cost: int = 0 - for cost: int in PlayerCoolerCapacity.EXPANSION_COSTS: - total_cost += cost - if player.wallet.get_balance() < total_cost: - assert(player.wallet.credit(total_cost - player.wallet.get_balance())) + var upgrade_cost: int = home_state.get_next_upgrade_cost() + assert(upgrade_cost == PlayerHomeState.HOME_UPGRADE_COSTS.front()) + assert(upgrade_cost == 50) + if player.wallet.get_balance() < upgrade_cost: + assert(player.wallet.credit( + upgrade_cost - player.wallet.get_balance() + )) var balance_before := player.wallet.get_balance() - for expected_capacity: int in [18, 27, 36, 45, 54, 63, 72]: - _shop_result.clear() - assert(not shop_service.request_cooler_capacity_upgrade().is_empty()) - assert( - not _shop_result.is_empty() and bool(_shop_result[1]), - "Cooler purchase failed: %s" % [_shop_result], - ) - assert(capacity.get_capacity() == expected_capacity) - assert(player.wallet.get_balance() == balance_before - total_cost) + _shop_result.clear() + assert(not shop_service.request_home_upgrade().is_empty()) + assert( + not _shop_result.is_empty() and bool(_shop_result[1]), + "Home purchase failed: %s" % [_shop_result], + ) + assert(home_state.get_tier() == PlayerHomeState.STARTER_RV_TIER) + assert( + interaction.get_dialogue_text(home_state.get_tier()) + == RVUpgradeInteraction.RV_DIALOGUE_TEXT + ) + assert(capacity.get_capacity() == 18) + assert(player.wallet.get_balance() == balance_before - upgrade_cost) + assert(home_state.get_next_upgrade_cost() == -1) assert(capacity.get_next_cost() == -1) diff --git a/tests/home_spawn_multiplayer_validation.gd b/tests/home_spawn_multiplayer_validation.gd index 1f16147..2855eb2 100644 --- a/tests/home_spawn_multiplayer_validation.gd +++ b/tests/home_spawn_multiplayer_validation.gd @@ -49,6 +49,7 @@ func _run_host() -> void: host_fingerprint ) assert(_same_door_position(host_avatar.global_position, host_spawn.origin)) + assert(_faces_away_from_home(host_avatar, home_world, host_fingerprint)) assert(network_home.request_enter(host_fingerprint)) await physics_frame host_avatar.global_position = home_world.get_interior_exit_position( @@ -57,6 +58,7 @@ func _run_host() -> void: assert(network_home.request_exit()) await physics_frame assert(_same_door_position(host_avatar.global_position, host_spawn.origin)) + assert(_faces_away_from_home(host_avatar, home_world, host_fingerprint)) var remote_peer_id: int = await _wait_for_remote_peer(session) assert(remote_peer_id > 1) @@ -70,6 +72,9 @@ func _run_host() -> void: assert(_same_door_position( remote_avatar.global_position, remote_spawn.origin )) + assert(_faces_away_from_home( + remote_avatar, home_world, remote_fingerprint + )) var disconnect_deadline: int = Time.get_ticks_msec() + 12000 while ( @@ -118,6 +123,7 @@ func _run_client() -> void: assert(_same_door_position( player.global_position, exterior_spawn.origin )) + assert(_faces_away_from_home(player, home_world, fingerprint)) print("Home spawn multiplayer client validation: PASS") await _cleanup(main, session) @@ -151,6 +157,23 @@ func _wait_for_home( return false +func _faces_away_from_home( + avatar: Player, + home_world: HomeWorldService, + fingerprint: String, +) -> bool: + var exterior_basis: Basis = home_world.get_exterior_transform( + fingerprint + ).basis + var outward_direction := exterior_basis.z + outward_direction.y = 0.0 + if outward_direction.is_zero_approx(): + return false + return avatar.get_facing_direction().dot( + outward_direction.normalized() + ) >= 0.99 + + func _wait_for_remote_peer(session: NetworkSession) -> int: var deadline: int = Time.get_ticks_msec() + 20000 while Time.get_ticks_msec() < deadline: diff --git a/tests/logbook_runtime_validation.gd b/tests/logbook_runtime_validation.gd index 47e795d..e33e551 100644 --- a/tests/logbook_runtime_validation.gd +++ b/tests/logbook_runtime_validation.gd @@ -143,7 +143,7 @@ func _validate_save_round_trip( assert(catalog != null) assert(catalog.candidates.size() == 316) var active_species := LogbookCatalog.ordered_species(catalog.candidates) - assert(active_species.size() == 313) + assert(active_species.size() == 314) # Keep this runtime save fixture within maximum player capacity while the # focused catalog validation exercises every active species individually. var round_trip_species: Array[FishData] = [] @@ -164,12 +164,14 @@ func _validate_save_round_trip( player.inventory_layout.restore_backpack_level( PlayerInventoryLayout.MAX_BACKPACK_LEVEL ) - player.cooler_capacity.restore_level(PlayerCoolerCapacity.MAX_LEVEL) + var home_state := main.get("_home_state") as PlayerHomeState + assert(home_state != null) + assert(home_state.upgrade_to_next_tier()) assert( player.inventory_layout.get_backpack_level() == PlayerInventoryLayout.MAX_BACKPACK_LEVEL ) - assert(player.cooler_capacity.get_level() == PlayerCoolerCapacity.MAX_LEVEL) + assert(player.cooler_capacity.get_capacity() == 18) player.inventory.set_inventory_layout(null) for index: int in 4: _add_test_catch(player, round_trip_species[index]) diff --git a/ui/fishing_danger_vignette.gdshader b/ui/fishing_danger_vignette.gdshader new file mode 100644 index 0000000..8eee3df --- /dev/null +++ b/ui/fishing_danger_vignette.gdshader @@ -0,0 +1,10 @@ +shader_type canvas_item; + +uniform float intensity : hint_range(0.0, 1.0) = 0.0; + +void fragment() { + vec2 centered = UV * 2.0 - 1.0; + centered.x *= 0.56; + float edge = smoothstep(0.42, 1.02, length(centered)); + COLOR = vec4(0.16, 0.018, 0.025, edge * intensity * 0.72); +} diff --git a/ui/fishing_danger_vignette.gdshader.uid b/ui/fishing_danger_vignette.gdshader.uid new file mode 100644 index 0000000..578ec8b --- /dev/null +++ b/ui/fishing_danger_vignette.gdshader.uid @@ -0,0 +1 @@ +uid://c1qcj3m4b10x4 diff --git a/ui/fishing_shop.gd b/ui/fishing_shop.gd index 234a1c1..7cc8fa8 100644 --- a/ui/fishing_shop.gd +++ b/ui/fishing_shop.gd @@ -15,9 +15,6 @@ const PlayerFishingUpgradesType = preload( "res://progression/player_fishing_upgrades.gd" ) const PlayerType = preload("res://player/player.gd") -const PlayerCoolerCapacityType = preload( - "res://progression/player_cooler_capacity.gd" -) const PlayerArtUnlocksType = preload( "res://progression/player_art_unlocks.gd" ) @@ -154,9 +151,6 @@ const ROD_PRICE_ICON_SIZE: float = 22.0 @onready var _barrier_price_bubble: PanelContainer = %BarrierPriceBubble @onready var _barrier_purchase: Button = %BarrierPurchase @onready var _supplies_list: VBoxContainer = %SuppliesList -@onready var _cooler_cost: CurrencyAmount = %CoolerCost -@onready var _cooler_price_bubble: PanelContainer = %CoolerPriceBubble -@onready var _cooler_purchase: Button = %CoolerPurchase @onready var _backpack_cost: CurrencyAmount = %BackpackCost @onready var _backpack_price_bubble: PanelContainer = %BackpackPriceBubble @onready var _backpack_purchase: Button = %BackpackPurchase @@ -172,7 +166,6 @@ var _inventory: FishInventory var _hotbar: PlayerHotbar var _inventory_layout: PlayerInventoryLayout var _item_catalog: ItemCatalogType -var _cooler_capacity: PlayerCoolerCapacityType var _art_unlocks: PlayerArtUnlocksType var _network_shop: NetworkShopService var _network_sale: NetworkSaleService @@ -202,7 +195,6 @@ func _ready() -> void: %CloseButton.pressed.connect(close_shop) _reel_purchase.pressed.connect(_purchase_reel_speed) _barrier_purchase.pressed.connect(_purchase_barrier_power) - _cooler_purchase.pressed.connect(_purchase_cooler_capacity) _backpack_purchase.pressed.connect(_purchase_backpack_capacity) @@ -353,7 +345,6 @@ func _focus_shop_section() -> void: for upgrade_button: Button in [ _reel_purchase, _barrier_purchase, - _cooler_purchase, _backpack_purchase, ]: if not upgrade_button.disabled: @@ -509,7 +500,6 @@ func _apply_shop_styles() -> void: for panel: PanelContainer in [ _reel_price_bubble, _barrier_price_bubble, - _cooler_price_bubble, _backpack_price_bubble, ]: var price_style := UtilityPageStyleType.rounded_style( @@ -526,7 +516,6 @@ func _apply_shop_styles() -> void: for price: CurrencyAmount in [ _reel_cost, _barrier_cost, - _cooler_cost, _backpack_cost, ]: var amount_label := price.get_amount_label() @@ -538,7 +527,6 @@ func _apply_shop_styles() -> void: %CloseButton, _reel_purchase, _barrier_purchase, - _cooler_purchase, _backpack_purchase, ]: UtilityPageStyleType.apply_ocean_button(button) @@ -559,7 +547,6 @@ func setup( hotbar: PlayerHotbar, inventory_layout: PlayerInventoryLayout, item_catalog: ItemCatalogType, - cooler_capacity: PlayerCoolerCapacityType, art_unlocks: PlayerArtUnlocksType, network_shop: NetworkShopService, network_sale: NetworkSaleService, @@ -576,7 +563,6 @@ func setup( _hotbar = hotbar _inventory_layout = inventory_layout _item_catalog = item_catalog - _cooler_capacity = cooler_capacity _art_unlocks = art_unlocks _network_shop = network_shop _network_sale = network_sale @@ -612,10 +598,6 @@ func setup( _upgrades.upgrades_changed.connect(_on_upgrades_changed) if not _bag.contents_changed.is_connected(_on_bag_changed): _bag.contents_changed.connect(_on_bag_changed) - if not _cooler_capacity.capacity_changed.is_connected( - _on_cooler_capacity_changed - ): - _cooler_capacity.capacity_changed.connect(_on_cooler_capacity_changed) if not _inventory_layout.backpack_capacity_changed.is_connected( _on_backpack_capacity_changed ): @@ -836,7 +818,6 @@ func _refresh_all() -> void: _refresh_wallet() _refresh_upgrades() _refresh_supplies() - _refresh_cooler_capacity() _refresh_backpack_capacity() @@ -1587,41 +1568,6 @@ func _add_supply_icon_tile( return tile_host -func _refresh_cooler_capacity() -> void: - if _cooler_capacity == null: - return - var level: int = _cooler_capacity.get_level() - var cost: int = _cooler_capacity.get_next_cost() - var next_capacity: int = _cooler_capacity.get_next_capacity() - _cooler_purchase.disabled = ( - cost < 0 - or _transaction_in_progress - or _closing - or _network_shop == null - or not _network_shop.can_request_purchase() - or not _cooler_capacity.can_purchase(_wallet) - ) - var cooler_effect: String - if cost < 0: - cooler_effect = "%d slots · maximum level" % ( - _cooler_capacity.get_capacity() - ) - _cooler_price_bubble.hide() - else: - _cooler_price_bubble.show() - cooler_effect = "%d → %d slots" % [ - _cooler_capacity.get_capacity(), - next_capacity, - ] - _cooler_cost.set_amount(cost) - _cooler_purchase.tooltip_text = _upgrade_tooltip( - "storage capacity", - level, - cooler_effect, - ) - _cooler_purchase.accessibility_name = _cooler_purchase.tooltip_text - - func _refresh_backpack_capacity() -> void: if _inventory_layout == null: return @@ -1723,23 +1669,6 @@ func _purchase_art_upgrade(product_id: StringName) -> void: _network_shop.request_art_upgrade(product_id) -func _purchase_cooler_capacity() -> void: - if _transaction_in_progress or not _is_transaction_context_valid(): - _set_feedback("unable to complete purchase.") - return - var cost: int = _cooler_capacity.get_next_cost() - if cost < 0: - _set_feedback("Upgrade is already at maximum.") - return - if not _wallet.can_afford(cost): - _set_feedback("Insufficient funds.") - return - if _network_shop == null: - _set_feedback("Purchase could not be completed.") - return - _network_shop.request_cooler_capacity_upgrade() - - func _purchase_backpack_capacity() -> void: if _transaction_in_progress or not _is_transaction_context_valid(): _set_feedback("unable to complete purchase.") @@ -1860,7 +1789,6 @@ func _on_wallet_changed(_balance: int, _delta: int) -> void: _refresh_wallet() _refresh_upgrades() _refresh_supplies() - _refresh_cooler_capacity() _refresh_backpack_capacity() @@ -1875,10 +1803,6 @@ func _on_bag_changed() -> void: _refresh_supplies() -func _on_cooler_capacity_changed(_level: int, _capacity: int) -> void: - _refresh_cooler_capacity() - - func _on_backpack_capacity_changed(_level: int, _capacity: int) -> void: _refresh_backpack_capacity() diff --git a/ui/fishing_shop.tscn b/ui/fishing_shop.tscn index 70ccec1..66fcbd9 100644 --- a/ui/fishing_shop.tscn +++ b/ui/fishing_shop.tscn @@ -257,35 +257,6 @@ layout_mode = 2 amount = 100 icon_size = 24.0 -[node name="CoolerTile" type="Control" parent="ShopPanel/Margin/Layout/Body/Upgrades/UpgradeScroll/UpgradeGrid"] -custom_minimum_size = Vector2(144, 168) -layout_mode = 2 -mouse_filter = 2 - -[node name="CoolerPurchase" type="Button" parent="ShopPanel/Margin/Layout/Body/Upgrades/UpgradeScroll/UpgradeGrid/CoolerTile"] -unique_name_in_owner = true -offset_right = 144.0 -offset_bottom = 144.0 -tooltip_text = "storage capacity" -icon = ExtResource("7_close") -expand_icon = true -icon_max_width = 92 - -[node name="CoolerPriceBubble" type="PanelContainer" parent="ShopPanel/Margin/Layout/Body/Upgrades/UpgradeScroll/UpgradeGrid/CoolerTile"] -unique_name_in_owner = true -z_index = 2 -offset_left = 22.0 -offset_top = 128.0 -offset_right = 122.0 -offset_bottom = 160.0 -mouse_filter = 2 - -[node name="CoolerCost" parent="ShopPanel/Margin/Layout/Body/Upgrades/UpgradeScroll/UpgradeGrid/CoolerTile/CoolerPriceBubble" instance=ExtResource("8_currency")] -unique_name_in_owner = true -layout_mode = 2 -amount = 75 -icon_size = 24.0 - [node name="BackpackTile" type="Control" parent="ShopPanel/Margin/Layout/Body/Upgrades/UpgradeScroll/UpgradeGrid"] custom_minimum_size = Vector2(144, 168) layout_mode = 2 diff --git a/ui/game_ui.gd b/ui/game_ui.gd index 585efc9..55a07eb 100644 --- a/ui/game_ui.gd +++ b/ui/game_ui.gd @@ -21,6 +21,7 @@ const PauseMenuType = preload("res://ui/pause_menu.gd") const NetworkSessionType = preload("res://network/network_session.gd") const FishingShopType = preload("res://ui/fishing_shop.gd") const DecorShopType = preload("res://ui/decor_shop.gd") +const RVUpgradeShopType = preload("res://ui/rv_upgrade_shop.gd") const SettingsPanelType = preload("res://ui/settings_panel.gd") const PlayerFishingUpgradesType = preload( "res://progression/player_fishing_upgrades.gd" @@ -31,6 +32,9 @@ const ShopInteractionType = preload( const DecorShopInteractionType = preload( "res://world/decor_shop_interaction.gd" ) +const RVUpgradeInteractionType = preload( + "res://world/rv_upgrade_interaction.gd" +) const PlayerStorageType = preload("res://ui/player_storage.gd") const HomeDecorToolbarType = preload("res://ui/home_decor_toolbar.gd") const PlayerStorageInteractionType = preload( @@ -129,6 +133,7 @@ const FISHING_PANEL_SHOWCASE_BOTTOM_OFFSET: float = -104.0 @onready var _barrier_health: Label = %BarrierHealth @onready var _showcase_details: Label = %ShowcaseDetails @onready var _fishing_panel: PanelContainer = %FishingPanel +@onready var _fishing_danger_vignette: ColorRect = %FishingDangerVignette @onready var _experience_panel: PanelContainer = %ExperienceProgressPanel @onready var _experience_level_label: Label = %ExperienceLevelLabel @onready var _experience_award_label: Label = %ExperienceAwardLabel @@ -144,6 +149,8 @@ const SHOP_ANIMALESE_VOICE_ID: String = "natural" const SHOP_ANIMALESE_BASE_PITCH: float = 1.08 const SHOP_SPEECH_CHARACTERS_PER_SECOND: float = 28.0 const SHOP_NPC_SPEECH_COOLDOWN_MILLISECONDS: int = 5000 +const FISHING_DANGER_START_GAP: float = 0.15 +const FISHING_DANGER_FULL_GAP: float = 0.025 @onready var _canonical_stage: Control = %CanonicalStage @@ -155,6 +162,7 @@ const SHOP_NPC_SPEECH_COOLDOWN_MILLISECONDS: int = 5000 @onready var _hotbar_ui: HotbarUIType = %Hotbar @onready var _fishing_shop: FishingShopType = %FishingShop @onready var _decor_shop: DecorShopType = %DecorShop +@onready var _rv_upgrade_shop: RVUpgradeShopType = %RVUpgradeShop @onready var _player_storage: PlayerStorageType = %PlayerStorage @onready var _home_decor_toolbar: HomeDecorToolbarType = %HomeDecorToolbar @onready var _rv_storage_button: Button = %RVStorageButton @@ -208,6 +216,7 @@ var _player_menu_hotbar_visible: bool = false var _main_shop_buyer: FishBuyerProfileType var _shop_interaction: ShopInteractionType var _decor_shop_interaction: DecorShopInteractionType +var _rv_upgrade_shop_interaction: RVUpgradeInteractionType var _storage_interaction: PlayerStorageInteractionType var _surface_drawing: NetworkSurfaceDrawingService var _surface_drawing_hotbar_selected: bool = false @@ -235,6 +244,12 @@ var _controller_text_entry_is_open: Callable var _controller_text_entry_close: Callable var _restore_chat_keyboard_after_fishing: bool = false var _rv_storage_button_requested_visible: bool = false +var _previous_barrier_health := PackedInt32Array() +var _barrier_feedback_initialized: bool = false +var _fishing_danger_target: float = 0.0 +var _fishing_danger_intensity: float = 0.0 +var _fishing_danger_pulse_time: float = 0.0 +var _catch_track_shake_tween: Tween func _ready() -> void: @@ -363,6 +378,7 @@ func setup( shop_interaction: ShopInteractionType, storage_interaction: PlayerStorageInteractionType, decor_shop_interaction: DecorShopInteractionType, + rv_upgrade_shop_interaction: RVUpgradeInteractionType, item_effects: PlayerItemEffectsType, cooler_capacity: PlayerCoolerCapacityType, network_session: NetworkSessionType, @@ -506,7 +522,6 @@ func setup( hotbar, inventory_layout, item_catalog, - cooler_capacity, art_unlocks, network_shop_service, network_sale_service, @@ -521,6 +536,14 @@ func setup( home_state, network_shop_service, ) + _rv_upgrade_shop.setup( + player, + wallet, + fishing_spot, + rv_upgrade_shop_interaction, + home_state, + network_shop_service, + ) _player_storage.setup( player, fishing_spot, @@ -538,6 +561,8 @@ func setup( _fishing_shop.menu_exit_started.connect(_on_shop_exit_started) _decor_shop.menu_visibility_changed.connect(_on_shop_visibility_changed) _decor_shop.menu_exit_started.connect(_on_shop_exit_started) + _rv_upgrade_shop.menu_visibility_changed.connect(_on_shop_visibility_changed) + _rv_upgrade_shop.menu_exit_started.connect(_on_shop_exit_started) _fishing_shop.sell_fish_requested.connect(_on_shop_sell_fish_requested) _fishing_shop.shop_cooler_return_requested.connect( _on_shop_cooler_return_requested @@ -548,6 +573,7 @@ func setup( _main_shop_buyer = main_shop_buyer _shop_interaction = shop_interaction _decor_shop_interaction = decor_shop_interaction + _rv_upgrade_shop_interaction = rv_upgrade_shop_interaction _storage_interaction = storage_interaction _surface_drawing = surface_drawing if ( @@ -571,13 +597,16 @@ func set_world_interactions( shop_interaction: ShopInteractionType, storage_interaction: PlayerStorageInteractionType, decor_shop_interaction: DecorShopInteractionType, + rv_upgrade_shop_interaction: RVUpgradeInteractionType, ) -> void: _shop_interaction = shop_interaction _storage_interaction = storage_interaction _decor_shop_interaction = decor_shop_interaction + _rv_upgrade_shop_interaction = rv_upgrade_shop_interaction _fishing_shop.set_world_interaction(shop_interaction) _player_storage.set_world_interaction(storage_interaction) _decor_shop.set_world_interaction(decor_shop_interaction) + _rv_upgrade_shop.set_world_interaction(rv_upgrade_shop_interaction) func _prioritize_surface_drawing_pointer_input() -> void: @@ -1539,6 +1568,13 @@ func _process(delta: float) -> void: _update_virtual_mouse(delta) _update_controller_menu_scroll(delta) _update_experience_bubble_position() + _update_fishing_danger_vignette(delta) + _try_start_shop_npc_speech() + if _player != null: + _player.set_fishing_reel_camera_active( + _fishing_spot != null + and _fishing_spot.is_reel_input_active() + ) func _update_controller_menu_scroll(delta: float) -> void: @@ -1793,6 +1829,7 @@ func set_gameplay_ui_enabled(enabled: bool) -> void: close_player_menu_for_session_end() _fishing_shop.close_for_session_end() _decor_shop.close_for_session_end() + _rv_upgrade_shop.close_for_session_end() _player_storage.close_for_session_end() _fishing_panel.visible = false _shop_prompt.hide() @@ -1933,6 +1970,10 @@ func get_decor_shop() -> DecorShopType: return _decor_shop +func get_rv_upgrade_shop() -> RVUpgradeShopType: + return _rv_upgrade_shop + + func get_player_storage() -> PlayerStorageType: return _player_storage @@ -2027,8 +2068,19 @@ func set_shop_prompt_visible( _position_shop_prompt(world_anchor) -func set_shop_npc_player_in_range(in_range: bool) -> void: - if _shop_npc_player_in_range == in_range: +func set_shop_npc_player_in_range( + in_range: bool, + dialogue_text: String = "", +) -> void: + var dialogue_changed: bool = ( + not dialogue_text.is_empty() + and _shop_prompt_message.text != dialogue_text + ) + if dialogue_changed: + _shop_prompt_message.text = dialogue_text + _shop_prompt_message.visible_characters = -1 + _shop_npc_spoken_for_current_visit = false + if _shop_npc_player_in_range == in_range and not dialogue_changed: return _shop_npc_player_in_range = in_range if not in_range: @@ -2044,10 +2096,10 @@ func _try_start_shop_npc_speech() -> void: or not _gameplay_ui_enabled ): return - _shop_npc_spoken_for_current_visit = true var now_msec: int = Time.get_ticks_msec() if now_msec < _shop_npc_next_speech_msec: return + _shop_npc_spoken_for_current_visit = true _shop_npc_next_speech_msec = ( now_msec + SHOP_NPC_SPEECH_COOLDOWN_MILLISECONDS ) @@ -2310,6 +2362,12 @@ func _on_catch_display_changed( and _fishing_spot != null and _fishing_spot.is_fighting() ) + _update_fishing_feedback( + progress, + chase_progress, + barrier_health, + encounter_visible, + ) _green_catch_progress.value = progress * 100.0 _red_chase_progress.value = maxf(chase_progress, 0.0) * 100.0 _catch_track.visible = encounter_visible @@ -2346,6 +2404,93 @@ func _on_catch_display_changed( _refresh_fishing_panel_visibility() +func _update_fishing_feedback( + progress: float, + chase_progress: float, + barrier_health: PackedInt32Array, + encounter_visible: bool, +) -> void: + if not encounter_visible: + _previous_barrier_health.clear() + _barrier_feedback_initialized = false + _fishing_danger_target = 0.0 + return + if _barrier_feedback_initialized: + var comparison_count: int = mini( + _previous_barrier_health.size(), + barrier_health.size(), + ) + var barrier_hit: bool = false + var barrier_broken: bool = false + for barrier_index: int in range(comparison_count): + if ( + barrier_health[barrier_index] + >= _previous_barrier_health[barrier_index] + ): + continue + barrier_hit = true + barrier_broken = ( + barrier_broken + or barrier_health[barrier_index] <= 0 + ) + if barrier_hit: + _play_barrier_feedback(barrier_broken) + _previous_barrier_health = barrier_health.duplicate() + _barrier_feedback_initialized = true + var chase_gap: float = progress - maxf(chase_progress, 0.0) + _fishing_danger_target = clampf( + inverse_lerp( + FISHING_DANGER_START_GAP, + FISHING_DANGER_FULL_GAP, + chase_gap, + ), + 0.0, + 1.0, + ) + + +func _play_barrier_feedback(barrier_broken: bool) -> void: + if _player != null: + _player.play_fishing_barrier_camera_feedback(barrier_broken) + if _catch_track_shake_tween != null: + _catch_track_shake_tween.kill() + _catch_track.rotation = 0.0 + var tilt: float = 0.018 if barrier_broken else 0.008 + var beat: float = 0.038 if barrier_broken else 0.028 + _catch_track_shake_tween = create_tween() + _catch_track_shake_tween.tween_property( + _catch_track, "rotation", -tilt, beat + ) + _catch_track_shake_tween.tween_property( + _catch_track, "rotation", tilt, beat + ) + _catch_track_shake_tween.tween_property( + _catch_track, "rotation", -tilt * 0.45, beat + ) + _catch_track_shake_tween.tween_property( + _catch_track, "rotation", 0.0, beat + ) + + +func _update_fishing_danger_vignette(delta: float) -> void: + _fishing_danger_pulse_time += delta + _fishing_danger_intensity = lerpf( + _fishing_danger_intensity, + _fishing_danger_target, + 1.0 - exp(-8.0 * delta), + ) + var pulse: float = ( + 0.88 + sin(_fishing_danger_pulse_time * 5.5) * 0.12 + ) + var shown_intensity: float = _fishing_danger_intensity * pulse + _fishing_danger_vignette.visible = shown_intensity > 0.01 + var vignette_material := ( + _fishing_danger_vignette.material as ShaderMaterial + ) + if vignette_material != null: + vignette_material.set_shader_parameter("intensity", shown_intensity) + + func _update_barrier_markers( positions: PackedFloat32Array, health: PackedInt32Array, diff --git a/ui/game_ui.tscn b/ui/game_ui.tscn index c219c84..c5dea31 100644 --- a/ui/game_ui.tscn +++ b/ui/game_ui.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=24 format=3] +[gd_scene load_steps=27 format=3] [ext_resource type="Script" path="res://ui/game_ui.gd" id="1_ui"] [ext_resource type="PackedScene" path="res://ui/player_menu.tscn" id="2_menu"] @@ -17,6 +17,11 @@ [ext_resource type="PackedScene" path="res://ui/components/bubble_menu/bubble_confirmation_page.tscn" id="15_social_prompt"] [ext_resource type="PackedScene" path="res://ui/decor_shop.tscn" id="16_decor_shop"] [ext_resource type="PackedScene" path="res://ui/home_decor_toolbar.tscn" id="17_decor_toolbar"] +[ext_resource type="PackedScene" path="res://ui/rv_upgrade_shop.tscn" id="18_rv_upgrade_shop"] +[ext_resource type="Shader" path="res://ui/fishing_danger_vignette.gdshader" id="19_fishing_vignette"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_fishing_vignette"] +shader = ExtResource("19_fishing_vignette") [sub_resource type="StyleBoxFlat" id="StyleBox_chase_background"] bg_color = Color(0.032, 0.118, 0.15, 1) @@ -86,6 +91,20 @@ grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 +[node name="FishingDangerVignette" type="ColorRect" parent="UIRoot/CanonicalStage/GameplayTransientHUD"] +unique_name_in_owner = true +visible = false +z_index = 50 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +material = SubResource("ShaderMaterial_fishing_vignette") +color = Color(1, 1, 1, 1) + [node name="ActiveBaitIndicator" type="Control" parent="UIRoot/CanonicalStage/GameplayTransientHUD"] unique_name_in_owner = true z_index = 54 @@ -312,6 +331,7 @@ offset_right = 420.0 offset_bottom = -124.0 grow_horizontal = 2 grow_vertical = 0 +pivot_offset = Vector2(420, 18) mouse_filter = 2 [node name="GreenCatchProgress" type="ProgressBar" parent="UIRoot/CanonicalStage/GameplayTransientHUD/CatchTrack"] @@ -440,7 +460,7 @@ theme_override_constants/margin_bottom = 8 unique_name_in_owner = true layout_mode = 2 theme_override_font_sizes/font_size = 18 -text = "Hey, if you've got any fish I've got cash! OwO" +text = "Listen, you may suck at fishing but I've got some things that might help." horizontal_alignment = 1 vertical_alignment = 1 autowrap_mode = 2 @@ -477,6 +497,9 @@ unique_name_in_owner = true [node name="DecorShop" parent="UIRoot/CanonicalStage" instance=ExtResource("16_decor_shop")] unique_name_in_owner = true +[node name="RVUpgradeShop" parent="UIRoot/CanonicalStage" instance=ExtResource("18_rv_upgrade_shop")] +unique_name_in_owner = true + [node name="HomeDecorToolbar" parent="UIRoot/CanonicalStage" instance=ExtResource("17_decor_toolbar")] unique_name_in_owner = true diff --git a/ui/home_decor_toolbar.gd b/ui/home_decor_toolbar.gd index 6f73219..50ae444 100644 --- a/ui/home_decor_toolbar.gd +++ b/ui/home_decor_toolbar.gd @@ -10,7 +10,10 @@ var _mode_button: Button var _selection_label: Label var _rotate_button: Button var _store_button: Button +var _clear_button: Button var _mode: PlayerHomeState.PlacementMode = PlayerHomeState.PlacementMode.GRID +var _interactive: bool = true +var _selection_active: bool = false func _ready() -> void: @@ -22,31 +25,33 @@ func set_active(active: bool) -> void: if visible == active: return visible = active - if active and _mode_button != null: - _mode_button.call_deferred("grab_focus") + + +func set_interactive(interactive: bool) -> void: + _interactive = interactive + _refresh_button_interactivity() func set_mode(mode: PlayerHomeState.PlacementMode) -> void: _mode = mode if _mode_button != null: _mode_button.text = ( - "placement: grid" + "grid" if mode == PlayerHomeState.PlacementMode.GRID - else "placement: free" + else "free" ) + _mode_button.tooltip_text = "placement mode: %s" % _mode_button.text func set_selection(instance_id: String, display_name: String = "") -> void: var selected: bool = not instance_id.is_empty() + _selection_active = selected if _selection_label != null: _selection_label.text = ( "selected: %s" % display_name - if selected else "click decor to select; drag to move" + if selected else "use held decor to place; click or drag to edit" ) - if _rotate_button != null: - _rotate_button.disabled = not selected - if _store_button != null: - _store_button.disabled = not selected + _refresh_button_interactivity() func report_status(message: String) -> void: @@ -55,65 +60,92 @@ func report_status(message: String) -> void: func _build_ui() -> void: - custom_minimum_size = Vector2(330.0, 0.0) - position = Vector2(925.0, 540.0) - z_index = 58 + set_anchors_preset(Control.PRESET_TOP_RIGHT) + offset_left = -500.0 + offset_top = 0.0 + offset_right = 0.0 + offset_bottom = 106.0 + custom_minimum_size = Vector2(500.0, 0.0) + z_index = 85 mouse_filter = Control.MOUSE_FILTER_STOP - add_theme_stylebox_override( - "panel", - UtilityPageStyle.rounded_style( - Color(UtilityPageStyle.OCEAN_PANEL_DEEP, 0.96), 16 - ), - ) + var panel_style: StyleBoxFlat = UtilityPageStyle.panel_style() + panel_style.set_corner_radius_all(10) + panel_style.content_margin_left = 6.0 + panel_style.content_margin_top = 6.0 + panel_style.content_margin_right = 6.0 + panel_style.content_margin_bottom = 6.0 + add_theme_stylebox_override("panel", panel_style) var margin := MarginContainer.new() for side: StringName in [ &"margin_left", &"margin_top", &"margin_right", &"margin_bottom", ]: - margin.add_theme_constant_override(side, 12) + margin.add_theme_constant_override(side, 6) add_child(margin) var layout := VBoxContainer.new() - layout.add_theme_constant_override("separation", 8) + layout.add_theme_constant_override("separation", 5) margin.add_child(layout) - var title := Label.new() - title.text = "RV decor" - title.add_theme_font_size_override("font_size", 24) - layout.add_child(title) - _selection_label = Label.new() - _selection_label.text = "click decor to select; drag to move" - _selection_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART - _selection_label.add_theme_font_size_override("font_size", 17) - layout.add_child(_selection_label) var row := HBoxContainer.new() - row.add_theme_constant_override("separation", 8) + row.add_theme_constant_override("separation", 5) layout.add_child(row) - _mode_button = Button.new() - _mode_button.text = "placement: grid" - _mode_button.size_flags_horizontal = Control.SIZE_EXPAND_FILL - UtilityPageStyle.apply_ocean_button(_mode_button) + var title := Label.new() + title.text = "decor" + title.custom_minimum_size = Vector2(70.0, 46.0) + title.vertical_alignment = VERTICAL_ALIGNMENT_CENTER + title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + title.add_theme_font_size_override("font_size", 19) + row.add_child(title) + _mode_button = _add_tool_button(row, "grid", "switch placement mode", 82.0) _mode_button.pressed.connect(_toggle_mode) - row.add_child(_mode_button) - _rotate_button = Button.new() - _rotate_button.text = "rotate" - _rotate_button.disabled = true - UtilityPageStyle.apply_ocean_button(_rotate_button) + _rotate_button = _add_tool_button(row, "rotate", "rotate selected decor", 92.0) _rotate_button.pressed.connect(rotate_requested.emit) - row.add_child(_rotate_button) - var action_row := HBoxContainer.new() - action_row.add_theme_constant_override("separation", 8) - layout.add_child(action_row) - _store_button = Button.new() - _store_button.text = "pack up" - _store_button.disabled = true - _store_button.size_flags_horizontal = Control.SIZE_EXPAND_FILL - UtilityPageStyle.apply_ocean_button(_store_button) + _store_button = _add_tool_button(row, "pack", "pack selected decor", 82.0) _store_button.pressed.connect(store_requested.emit) - action_row.add_child(_store_button) - var cancel_button := Button.new() - cancel_button.text = "clear selection" - cancel_button.size_flags_horizontal = Control.SIZE_EXPAND_FILL - UtilityPageStyle.apply_ocean_button(cancel_button) - cancel_button.pressed.connect(cancel_requested.emit) - action_row.add_child(cancel_button) + _clear_button = _add_tool_button(row, "clear", "clear selection", 82.0) + _clear_button.pressed.connect(cancel_requested.emit) + _selection_label = Label.new() + _selection_label.text = "use held decor to place; click or drag to edit" + _selection_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + _selection_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + _selection_label.add_theme_font_size_override("font_size", 15) + layout.add_child(_selection_label) + _refresh_button_interactivity() + + +func _add_tool_button( + parent: Container, + button_text: String, + button_tooltip: String, + minimum_width: float, +) -> Button: + var button := Button.new() + button.text = button_text + button.tooltip_text = button_tooltip + button.accessibility_name = button_tooltip + button.custom_minimum_size = Vector2(minimum_width, 46.0) + button.size_flags_horizontal = Control.SIZE_EXPAND_FILL + UtilityPageStyle.apply_ocean_button(button) + for style_name: StringName in [ + &"normal", &"hover", &"pressed", &"focus", &"disabled", + ]: + var existing: StyleBox = button.get_theme_stylebox(style_name) + var rounded := existing.duplicate() as StyleBoxFlat + if rounded == null: + continue + rounded.set_corner_radius_all(20) + button.add_theme_stylebox_override(style_name, rounded) + parent.add_child(button) + return button + + +func _refresh_button_interactivity() -> void: + if _mode_button != null: + _mode_button.disabled = not _interactive + if _rotate_button != null: + _rotate_button.disabled = not _interactive or not _selection_active + if _store_button != null: + _store_button.disabled = not _interactive or not _selection_active + if _clear_button != null: + _clear_button.disabled = not _interactive or not _selection_active func _toggle_mode() -> void: diff --git a/ui/player_menu.gd b/ui/player_menu.gd index 9b15913..95263f5 100644 --- a/ui/player_menu.gd +++ b/ui/player_menu.gd @@ -2575,7 +2575,10 @@ func _on_tackle_button_gui_input( call_deferred("_release_pointer_focus", button) if ( mouse_event == null - or mouse_event.button_index != MOUSE_BUTTON_RIGHT + or mouse_event.button_index not in [ + MOUSE_BUTTON_LEFT, + MOUSE_BUTTON_RIGHT, + ] or not mouse_event.pressed ): return diff --git a/ui/player_storage.gd b/ui/player_storage.gd index 83817c5..e5369a4 100644 --- a/ui/player_storage.gd +++ b/ui/player_storage.gd @@ -105,7 +105,7 @@ func _open_storage( ): return false _home_access = home_access - _title.text = "RV storage" if home_access else "private storage" + _title.text = "home storage" if home_access else "private storage" _decorate_button.visible = home_access and allow_decorating _prior_movement_enabled = _player.is_movement_enabled() _prior_camera_enabled = _player.is_camera_input_enabled() @@ -290,8 +290,8 @@ func _build_ui() -> void: _title.size_flags_horizontal = Control.SIZE_EXPAND_FILL header.add_child(_title) _decorate_button = Button.new() - _decorate_button.text = "decorate RV" - _decorate_button.tooltip_text = "Place decor inside your RV" + _decorate_button.text = "decorate home" + _decorate_button.tooltip_text = "Place decor inside your home" _decorate_button.custom_minimum_size = Vector2(160.0, 48.0) UtilityPageStyle.apply_ocean_button(_decorate_button) _decorate_button.hide() diff --git a/ui/rv_upgrade_shop.gd b/ui/rv_upgrade_shop.gd new file mode 100644 index 0000000..11c0a4d --- /dev/null +++ b/ui/rv_upgrade_shop.gd @@ -0,0 +1,330 @@ +class_name RVUpgradeShop +extends Control + +const INPUT_OWNER: StringName = &"rv_upgrade_shop" +const UtilityPageStyleType = preload("res://ui/utility_page_style.gd") +const CurrencyPresentationType = preload("res://ui/currency_presentation.gd") + +signal menu_visibility_changed(is_open: bool) +signal menu_exit_started + +var _player: Player +var _wallet: PlayerWallet +var _fishing_spot: FishingSpot +var _interaction: RVUpgradeInteraction +var _home_state: PlayerHomeState +var _network_shop: NetworkShopService +var _wallet_amount: CurrencyAmount +var _price_amount: CurrencyAmount +var _home_label: Label +var _storage_label: Label +var _feedback: Label +var _upgrade_button: Button +var _close_button: Button +var _transaction_pending: bool = false +var _prior_movement_enabled: bool = true +var _prior_camera_enabled: bool = true +var _prior_mouse_mode: Input.MouseMode = Input.MOUSE_MODE_VISIBLE + + +func _ready() -> void: + UtilityPageStyleType.apply_page(self) + _build_ui() + hide() + + +func setup( + player: Player, + wallet: PlayerWallet, + fishing_spot: FishingSpot, + interaction: RVUpgradeInteraction, + home_state: PlayerHomeState, + network_shop: NetworkShopService, +) -> void: + _player = player + _wallet = wallet + _fishing_spot = fishing_spot + _interaction = interaction + _home_state = home_state + _network_shop = network_shop + if not _wallet.balance_changed.is_connected(_on_wallet_changed): + _wallet.balance_changed.connect(_on_wallet_changed) + if not _home_state.changed.is_connected(_refresh): + _home_state.changed.connect(_refresh) + if ( + _network_shop != null + and not _network_shop.local_purchase_pending.is_connected( + _on_purchase_pending + ) + ): + _network_shop.local_purchase_pending.connect(_on_purchase_pending) + _network_shop.local_purchase_finished.connect(_on_purchase_finished) + _refresh() + + +func set_world_interaction(interaction: RVUpgradeInteraction) -> void: + _interaction = interaction + + +func open_shop() -> bool: + if ( + visible + or _player == null + or _wallet == null + or _fishing_spot == null + or _interaction == null + or not _interaction.is_local_player_in_range() + or not _fishing_spot.can_open_fishing_shop() + ): + return false + _prior_movement_enabled = _player.is_movement_enabled() + _prior_camera_enabled = _player.is_camera_input_enabled() + _player.set_movement_enabled(false) + _player.set_camera_input_enabled(false) + _prior_mouse_mode = _restorable_mouse_mode(Input.mouse_mode) + _fishing_spot.set_local_menu_input_suppressed(INPUT_OWNER, true) + Input.mouse_mode = Input.MOUSE_MODE_VISIBLE + _transaction_pending = ( + _network_shop != null + and _network_shop.is_local_purchase_pending() + ) + _feedback.text = "" + _refresh() + show() + _upgrade_button.call_deferred("grab_focus") + menu_visibility_changed.emit(true) + return true + + +func close_shop(restore_controls: bool = true) -> void: + if not visible: + return + menu_exit_started.emit() + get_viewport().gui_release_focus() + hide() + if _fishing_spot != null: + _fishing_spot.set_local_menu_input_suppressed(INPUT_OWNER, false) + if restore_controls and _player != null: + _player.set_movement_enabled(_prior_movement_enabled) + _player.set_camera_input_enabled(_prior_camera_enabled) + Input.mouse_mode = _prior_mouse_mode + menu_visibility_changed.emit(false) + + +func consume_escape() -> bool: + if not visible: + return false + close_shop() + return true + + +func close_for_range_exit() -> void: + close_shop() + + +func close_for_water_recovery() -> void: + close_shop(false) + + +func close_for_session_end() -> void: + close_shop(false) + + +func _unhandled_input(event: InputEvent) -> void: + if not visible or not event.is_action_pressed("ui_cancel"): + return + close_shop() + get_viewport().set_input_as_handled() + + +func _purchase_upgrade() -> void: + if _network_shop == null or _transaction_pending: + return + var request_id: String = _network_shop.request_home_upgrade() + if request_id.is_empty(): + _refresh() + + +func _on_purchase_pending(_request_id: String) -> void: + _transaction_pending = true + _feedback.text = "upgrading…" + _refresh() + + +func _on_purchase_finished( + _request_id: String, + accepted: bool, + message: String, + product_id: StringName, + category: int, + _quantity: int, + _total_cost: int, +) -> void: + if ( + category != NetworkShopProtocol.ProductCategory.HOME_UPGRADE + or product_id != NetworkShopService.HOME_UPGRADE_PRODUCT_ID + ): + return + _transaction_pending = false + _feedback.text = "starter RV unlocked" if accepted else message.to_lower() + _refresh() + + +func _on_wallet_changed(_balance: int, _delta: int) -> void: + _refresh() + + +func _refresh() -> void: + if _wallet_amount == null: + return + var balance: int = _wallet.get_balance() if _wallet != null else 0 + var tier: int = _home_state.get_tier() if _home_state != null else 0 + var current_capacity: int = ( + _home_state.get_storage_capacity() if _home_state != null else 9 + ) + var next_capacity: int = ( + _home_state.get_next_storage_capacity() if _home_state != null else -1 + ) + var cost: int = ( + _home_state.get_next_upgrade_cost() if _home_state != null else -1 + ) + _wallet_amount.set_amount(balance) + _price_amount.set_amount(maxi(cost, 0)) + if tier >= PlayerHomeState.MAX_TIER: + _home_label.text = "starter RV" + _storage_label.text = "storage · %d slots" % current_capacity + _upgrade_button.text = "unlocked" + _upgrade_button.disabled = true + _price_amount.visible = false + else: + _home_label.text = "tent → starter RV" + _storage_label.text = "storage · %d → %d slots" % [ + current_capacity, next_capacity, + ] + _upgrade_button.text = "upgrade" + _upgrade_button.disabled = ( + _transaction_pending + or _wallet == null + or not _wallet.can_afford(cost) + or _network_shop == null + or not _network_shop.can_request_home_upgrade() + ) + _price_amount.visible = true + + +func _restorable_mouse_mode(mouse_mode: Input.MouseMode) -> Input.MouseMode: + return ( + Input.MOUSE_MODE_VISIBLE + if mouse_mode == Input.MOUSE_MODE_CAPTURED + else mouse_mode + ) + + +func _build_ui() -> void: + set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + z_index = 83 + mouse_filter = Control.MOUSE_FILTER_STOP + var blocker := ColorRect.new() + blocker.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + blocker.color = Color(0.02, 0.08, 0.10, 0.55) + blocker.mouse_filter = Control.MOUSE_FILTER_STOP + add_child(blocker) + + var panel := PanelContainer.new() + panel.set_anchors_preset(Control.PRESET_CENTER) + panel.position = Vector2(-390.0, -225.0) + panel.size = Vector2(780.0, 450.0) + panel.add_theme_stylebox_override( + "panel", + UtilityPageStyleType.rounded_style( + UtilityPageStyleType.OCEAN_PANEL_DEEP, 24 + ), + ) + add_child(panel) + var margin := MarginContainer.new() + for side: StringName in [ + &"margin_left", &"margin_top", &"margin_right", &"margin_bottom", + ]: + margin.add_theme_constant_override(side, 28) + panel.add_child(margin) + var layout := VBoxContainer.new() + layout.add_theme_constant_override("separation", 18) + margin.add_child(layout) + + var header := HBoxContainer.new() + header.add_theme_constant_override("separation", 12) + layout.add_child(header) + var title := Label.new() + title.text = "home upgrades" + title.add_theme_font_size_override("font_size", 38) + title.size_flags_horizontal = Control.SIZE_EXPAND_FILL + header.add_child(title) + _wallet_amount = CurrencyPresentationType.instantiate_amount(0, 24.0) + header.add_child(_wallet_amount) + + var offer := PanelContainer.new() + offer.size_flags_vertical = Control.SIZE_EXPAND_FILL + offer.add_theme_stylebox_override( + "panel", + UtilityPageStyleType.rounded_style( + UtilityPageStyleType.OCEAN_FIELD, 18 + ), + ) + layout.add_child(offer) + var offer_margin := MarginContainer.new() + for side: StringName in [ + &"margin_left", &"margin_top", &"margin_right", &"margin_bottom", + ]: + offer_margin.add_theme_constant_override(side, 28) + offer.add_child(offer_margin) + var details := VBoxContainer.new() + details.alignment = BoxContainer.ALIGNMENT_CENTER + details.add_theme_constant_override("separation", 14) + offer_margin.add_child(details) + _home_label = Label.new() + _home_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + _home_label.add_theme_font_size_override("font_size", 34) + details.add_child(_home_label) + var description := Label.new() + description.text = ( + "A weatherproof home with a larger interior and built-in storage." + ) + description.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + description.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + description.add_theme_font_size_override("font_size", 20) + details.add_child(description) + _storage_label = Label.new() + _storage_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + _storage_label.add_theme_font_size_override("font_size", 22) + details.add_child(_storage_label) + var purchase_row := HBoxContainer.new() + purchase_row.alignment = BoxContainer.ALIGNMENT_CENTER + purchase_row.add_theme_constant_override("separation", 10) + details.add_child(purchase_row) + _upgrade_button = Button.new() + _upgrade_button.custom_minimum_size = Vector2(220.0, 60.0) + UtilityPageStyleType.apply_ocean_button(_upgrade_button) + _upgrade_button.pressed.connect(_purchase_upgrade) + purchase_row.add_child(_upgrade_button) + _price_amount = CurrencyPresentationType.instantiate_amount(0, 24.0) + purchase_row.add_child(_price_amount) + + var footer := HBoxContainer.new() + footer.add_theme_constant_override("separation", 12) + layout.add_child(footer) + _feedback = Label.new() + _feedback.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _feedback.add_theme_font_size_override("font_size", 18) + footer.add_child(_feedback) + _close_button = Button.new() + _close_button.text = "close" + _close_button.custom_minimum_size = Vector2(150.0, 50.0) + UtilityPageStyleType.apply_ocean_button(_close_button) + _close_button.pressed.connect(close_shop) + footer.add_child(_close_button) + _upgrade_button.focus_neighbor_bottom = _upgrade_button.get_path_to( + _close_button + ) + _close_button.focus_neighbor_top = _close_button.get_path_to( + _upgrade_button + ) diff --git a/ui/rv_upgrade_shop.gd.uid b/ui/rv_upgrade_shop.gd.uid new file mode 100644 index 0000000..ddd043e --- /dev/null +++ b/ui/rv_upgrade_shop.gd.uid @@ -0,0 +1 @@ +uid://b5pnsuph7fxrd diff --git a/ui/rv_upgrade_shop.tscn b/ui/rv_upgrade_shop.tscn new file mode 100644 index 0000000..22abf58 --- /dev/null +++ b/ui/rv_upgrade_shop.tscn @@ -0,0 +1,14 @@ +[gd_scene load_steps=2 format=3] + +[ext_resource type="Script" path="res://ui/rv_upgrade_shop.gd" id="1_script"] + +[node name="RVUpgradeShop" type="Control"] +unique_name_in_owner = true +visible = false +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_script") diff --git a/world/decor_shop_interaction.gd b/world/decor_shop_interaction.gd index 049bfbe..a325134 100644 --- a/world/decor_shop_interaction.gd +++ b/world/decor_shop_interaction.gd @@ -1,2 +1,10 @@ class_name DecorShopInteraction extends FishingShopInteraction + +const DECOR_DIALOGUE_TEXT: String = ( + "You gonna decorate that hot box or what? I've got some new decor in, take a look." +) + + +func get_dialogue_text(_home_tier: int = -1) -> String: + return DECOR_DIALOGUE_TEXT diff --git a/world/fishing_shop_interaction.gd b/world/fishing_shop_interaction.gd index d912eca..9628ee6 100644 --- a/world/fishing_shop_interaction.gd +++ b/world/fishing_shop_interaction.gd @@ -3,6 +3,10 @@ extends Area3D signal local_player_range_changed(in_range: bool) +const DIALOGUE_TEXT: String = ( + "Listen, you may suck at fishing but I've got some things that might help." +) + @export_node_path("Node3D") var look_character_path: NodePath = ^"../Shopkeeper" var _local_player: Player @@ -37,6 +41,10 @@ func is_avatar_in_range(avatar: Player) -> bool: ) +func get_dialogue_text(_home_tier: int = -1) -> String: + return DIALOGUE_TEXT + + func get_prompt_anchor_position() -> Vector3: if _look_character != null: return _look_character.get_head_anchor_position() diff --git a/world/generation/generated_world_region.gd b/world/generation/generated_world_region.gd index 4e15251..61484fd 100644 --- a/world/generation/generated_world_region.gd +++ b/world/generation/generated_world_region.gd @@ -12,6 +12,9 @@ const PlayerStorageInteractionType = preload( const DecorShopInteractionType = preload( "res://world/decor_shop_interaction.gd" ) +const RVUpgradeInteractionType = preload( + "res://world/rv_upgrade_interaction.gd" +) const PrecipitationOcclusionType = preload( "res://world/environment/precipitation_occlusion.gd" ) @@ -52,6 +55,8 @@ const WATER_RECOVERY_FOOTPRINT_RADIUS := 0.6 const WATER_RECOVERY_INSET_STEP := 0.25 const WATER_RECOVERY_MAXIMUM_INSET := 1.5 const WATER_RECOVERY_SEARCH_EXPANSIONS: Array[float] = [1.5, 4.0, 12.0] +const HOME_GROUND_HEIGHT_TOLERANCE := 0.5 +const HOME_ELEVATION_HEIGHT_TOLERANCE := 0.6 const PROP_SURFACE_SAMPLE_DIRECTIONS: Array[Vector2] = [ Vector2(1.0, 0.0), Vector2(0.70710678, 0.70710678), @@ -86,9 +91,13 @@ const PROCEDURAL_PROP_GROUPS: Array[StringName] = [ @onready var _decor_shop: DecorShopInteractionType = ( $Interactables/DecorShopWorld/InteractionArea ) +@onready var _rv_upgrade_shop: RVUpgradeInteractionType = ( + $Interactables/RVUpgradeShopWorld/InteractionArea +) @onready var _shop_root: Node3D = %FishingShopWorld @onready var _storage_root: Node3D = %PlayerStorageBox @onready var _decor_shop_root: Node3D = %DecorShopWorld +@onready var _rv_upgrade_shop_root: Node3D = %RVUpgradeShopWorld @onready var _decorations: Node3D = %Decorations @onready var _tree_anchors: GatherableAnchorSet3D = %ReachableTreeTrunks @onready var _diggable_beach: DiggableArea3D = %DiggableBeach @@ -104,6 +113,7 @@ var _placed_prop_groups: Array[StringName] = [] var _placed_group_coordinates: Dictionary[StringName, Array] = {} var _biome_assignments: Dictionary[Vector2i, StringName] = {} var _water_recovery_triangles_by_coordinate: Dictionary[Vector2i, Array] = {} +var _home_accessible_elevations_by_coordinate: Dictionary[Vector2i, Array] = {} func _ready() -> void: @@ -159,6 +169,10 @@ func get_decor_shop() -> DecorShopInteractionType: return _decor_shop +func get_rv_upgrade_shop() -> RVUpgradeInteractionType: + return _rv_upgrade_shop + + func get_saltwater_shoreline_mesh() -> MeshInstance3D: return _shoreline_reference @@ -184,6 +198,7 @@ func get_spawn_surface_triangles( material_names: Array[StringName], minimum_global_y: float, minimum_up_dot: float = 0.6, + maximum_global_y: float = 100.0, ) -> Array[PackedVector3Array]: var triangles: Array[PackedVector3Array] = [] if material_names.is_empty(): @@ -204,10 +219,27 @@ func get_spawn_surface_triangles( mesh.surface_get_arrays(surface_index), minimum_global_y, minimum_up_dot, + maximum_global_y, ) return triangles +func is_home_exterior_position_accessible(position: Vector3) -> bool: + var local_position := _generator.to_local(position) + if local_position.y <= HOME_GROUND_HEIGHT_TOLERANCE: + return true + var coordinate := _generator.coordinate_for_local_position(local_position) + for value: Variant in _home_accessible_elevations_by_coordinate.get( + coordinate, + [], + ): + if absf(local_position.y - float(value)) <= ( + HOME_ELEVATION_HEIGHT_TOLERANCE + ): + return true + return false + + func get_water_recovery_position( entry_position: Vector3, fallback_position: Vector3, @@ -242,6 +274,7 @@ func get_water_recovery_position( func _on_generation_completed(summary: Dictionary) -> void: _diggable_beach.invalidate_surface_cache() var records: Array[Dictionary] = _generator.placement_records() + _cache_home_accessible_elevations(records) _assign_biomes(records, summary) var spawn_position := Vector3.ZERO _clear_children(_decorations) @@ -388,6 +421,97 @@ func _on_generation_completed(summary: Dictionary) -> void: world_generated.emit(_current_seed, summary) +func _cache_home_accessible_elevations( + records: Array[Dictionary], +) -> void: + _home_accessible_elevations_by_coordinate.clear() + var records_by_coordinate: Dictionary[Vector2i, Dictionary] = {} + var elevation_tiers: Dictionary[int, bool] = {} + for record: Dictionary in records: + var coordinate: Vector2i = record.get( + "coordinate", + Vector2i(-1, -1), + ) + records_by_coordinate[coordinate] = record + for tier: int in _elevation_tiers_for_tags( + record.get("tags", PackedStringArray()) + ): + elevation_tiers[tier] = true + var visited: Dictionary[String, bool] = {} + for tier: int in elevation_tiers: + var elevation_tag := "elevation_%d" % tier + for coordinate: Vector2i in records_by_coordinate: + var visit_key := _home_elevation_visit_key(coordinate, tier) + if visited.has(visit_key): + continue + var record: Dictionary = records_by_coordinate[coordinate] + var tags: PackedStringArray = record.get( + "tags", + PackedStringArray(), + ) + if elevation_tag not in tags: + continue + var component: Array[Vector2i] = [] + var pending: Array[Vector2i] = [coordinate] + var has_ramp := false + while not pending.is_empty(): + var current: Vector2i = pending.pop_back() + var current_key := _home_elevation_visit_key(current, tier) + if visited.has(current_key): + continue + var current_record: Dictionary = records_by_coordinate.get( + current, + {}, + ) + var current_tags: PackedStringArray = current_record.get( + "tags", + PackedStringArray(), + ) + if elevation_tag not in current_tags: + continue + visited[current_key] = true + component.append(current) + has_ramp = has_ramp or "ramp" in current_tags + for offset: Vector2i in [ + Vector2i.LEFT, + Vector2i.RIGHT, + Vector2i.UP, + Vector2i.DOWN, + ]: + pending.append(current + offset) + if not has_ramp: + continue + var surface_height := ( + float(tier - 1) * _generator.elevated_cliff_level_height + ) + for component_coordinate: Vector2i in component: + var heights: Array = ( + _home_accessible_elevations_by_coordinate.get( + component_coordinate, + [], + ) + ) + heights.append(surface_height) + _home_accessible_elevations_by_coordinate[ + component_coordinate + ] = heights + + +func _elevation_tiers_for_tags(tags: PackedStringArray) -> Array[int]: + var tiers: Array[int] = [] + for tag_value: String in tags: + if not tag_value.begins_with("elevation_"): + continue + var suffix := tag_value.trim_prefix("elevation_") + if suffix.is_valid_int(): + tiers.append(suffix.to_int()) + return tiers + + +func _home_elevation_visit_key(coordinate: Vector2i, tier: int) -> String: + return "%d:%d:%d" % [tier, coordinate.x, coordinate.y] + + func _mark_precipitation_occluders() -> void: for prop: Node in _decorations.get_children(): var prop_group := prop.get_meta(&"terrain_prop_group", &"") as StringName @@ -441,6 +565,8 @@ func _place_spawn_amenities(center: Vector3) -> void: _storage_root.rotation.y = PI * 0.5 _decor_shop_root.position = center + Vector3(-2.4, 0.0, 1.2) _decor_shop_root.rotation.y = PI * 0.5 + _rv_upgrade_shop_root.position = center + Vector3(-2.35, 0.0, -1.35) + _rv_upgrade_shop_root.rotation.y = PI func _configure_static_water() -> void: @@ -1304,6 +1430,7 @@ func _terrain_surface_triangles_by_coordinate( mesh_instance.mesh.surface_get_arrays(surface_index), -INF, 0.35, + 100.0, ) if triangles.is_empty(): continue @@ -1651,6 +1778,7 @@ func _append_surface_triangles( arrays: Array, minimum_global_y: float, minimum_up_dot: float, + maximum_global_y: float, ) -> void: if arrays.size() <= Mesh.ARRAY_INDEX: return @@ -1660,10 +1788,28 @@ func _append_surface_triangles( return if indices.is_empty(): for index: int in range(0, vertices.size() - 2, 3): - _append_triangle(result, mesh_instance, vertices[index], vertices[index + 1], vertices[index + 2], minimum_global_y, minimum_up_dot) + _append_triangle( + result, + mesh_instance, + vertices[index], + vertices[index + 1], + vertices[index + 2], + minimum_global_y, + minimum_up_dot, + maximum_global_y, + ) return for index: int in range(0, indices.size() - 2, 3): - _append_triangle(result, mesh_instance, vertices[indices[index]], vertices[indices[index + 1]], vertices[indices[index + 2]], minimum_global_y, minimum_up_dot) + _append_triangle( + result, + mesh_instance, + vertices[indices[index]], + vertices[indices[index + 1]], + vertices[indices[index + 2]], + minimum_global_y, + minimum_up_dot, + maximum_global_y, + ) func _append_triangle( @@ -1674,11 +1820,15 @@ func _append_triangle( local_c: Vector3, minimum_global_y: float, minimum_up_dot: float, + maximum_global_y: float, ) -> void: var a := mesh_instance.to_global(local_a) var b := mesh_instance.to_global(local_b) var c := mesh_instance.to_global(local_c) - if minf(a.y, minf(b.y, c.y)) <= minimum_global_y: + if ( + maxf(a.y, maxf(b.y, c.y)) <= minimum_global_y + or minf(a.y, minf(b.y, c.y)) >= maximum_global_y + ): return var cross := (b - a).cross(c - a) if cross.length_squared() <= 0.0000001: diff --git a/world/generation/generated_world_region.tscn b/world/generation/generated_world_region.tscn index 04602e1..c996b88 100644 --- a/world/generation/generated_world_region.tscn +++ b/world/generation/generated_world_region.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=15 format=3] +[gd_scene load_steps=16 format=3] [ext_resource type="Script" path="res://world/generation/generated_world_region.gd" id="1_region"] [ext_resource type="Script" path="res://world/generation/terrain_chunk_generator.gd" id="2_generator"] @@ -14,6 +14,7 @@ [ext_resource type="Resource" path="res://world/generation/props/terrain_prop_catalog.tres" id="12_prop_catalog"] [ext_resource type="Resource" path="res://world/generation/biomes/terrain_biome_catalog.tres" id="13_biome_catalog"] [ext_resource type="PackedScene" path="res://world/interactables/decor_shop_world.tscn" id="14_decor_shop"] +[ext_resource type="PackedScene" path="res://world/interactables/rv_upgrade_shop_world.tscn" id="15_rv_upgrade"] [node name="GeneratedWorldRegion" type="Node3D"] script = ExtResource("1_region") @@ -102,6 +103,9 @@ unique_name_in_owner = true [node name="DecorShopWorld" parent="Interactables" instance=ExtResource("14_decor_shop")] unique_name_in_owner = true +[node name="RVUpgradeShopWorld" parent="Interactables" instance=ExtResource("15_rv_upgrade")] +unique_name_in_owner = true + [node name="Decorations" type="Node3D" parent="."] unique_name_in_owner = true diff --git a/world/generation/terrain_chunk_generator.gd b/world/generation/terrain_chunk_generator.gd index 49bf693..64a8bd2 100644 --- a/world/generation/terrain_chunk_generator.gd +++ b/world/generation/terrain_chunk_generator.gd @@ -4414,6 +4414,19 @@ func chunk_position(coordinate: Vector2i) -> Vector3: ) +func coordinate_for_local_position(position: Vector3) -> Vector2i: + if catalog == null or catalog.chunk_size <= 0.0: + return Vector2i(-1, -1) + var half_grid := Vector2( + float(grid_size.x - 1) * 0.5, + float(grid_size.y - 1) * 0.5, + ) + return Vector2i( + roundi(position.x / catalog.chunk_size + half_grid.x), + roundi(position.z / catalog.chunk_size + half_grid.y), + ) + + func get_generated_chunks_root() -> Node3D: return _generated_chunks diff --git a/world/interactables/decor_shop_world.tscn b/world/interactables/decor_shop_world.tscn index 6b735e2..7f94ec4 100644 --- a/world/interactables/decor_shop_world.tscn +++ b/world/interactables/decor_shop_world.tscn @@ -6,19 +6,19 @@ [sub_resource type="SphereShape3D" id="InteractionShape"] resource_local_to_scene = true -radius = 3.0 +radius = 2.1 [node name="DecorShopWorld" type="Node3D"] [node name="Shopkeeper" parent="." instance=ExtResource("2_character")] script = ExtResource("3_display") species_id = "round" -fur_color_id = "orange" -ears_id = "pointy_short" -tail_id = "cat" -eyes_id = "simple_shine" -nose_id = "dog_round" -mouth_id = "three" +fur_color_id = "brown" +ears_id = "bear" +tail_id = "bear" +eyes_id = "tired" +nose_id = "triangle_pink" +mouth_id = "simple_smile" head_look_enabled = true [node name="AnimationPlayer" parent="Shopkeeper"] diff --git a/world/interactables/fishing_shop_world.tscn b/world/interactables/fishing_shop_world.tscn index 760f3b6..040b558 100644 --- a/world/interactables/fishing_shop_world.tscn +++ b/world/interactables/fishing_shop_world.tscn @@ -6,7 +6,7 @@ [sub_resource type="SphereShape3D" id="InteractionShape"] resource_local_to_scene = true -radius = 3.0 +radius = 2.1 [node name="FishingShopWorld" type="Node3D"] diff --git a/world/interactables/rv_upgrade_shop_world.tscn b/world/interactables/rv_upgrade_shop_world.tscn new file mode 100644 index 0000000..9fd0ed2 --- /dev/null +++ b/world/interactables/rv_upgrade_shop_world.tscn @@ -0,0 +1,36 @@ +[gd_scene load_steps=5 format=3] + +[ext_resource type="Script" path="res://world/rv_upgrade_interaction.gd" id="1_shop"] +[ext_resource type="PackedScene" path="res://art/exported/characters/base/straywild_base_character.glb" id="2_character"] +[ext_resource type="Script" path="res://world/world_character_display.gd" id="3_display"] + +[sub_resource type="SphereShape3D" id="InteractionShape"] +resource_local_to_scene = true +radius = 2.1 + +[node name="RVUpgradeShopWorld" type="Node3D"] + +[node name="Shopkeeper" parent="." instance=ExtResource("2_character")] +script = ExtResource("3_display") +species_id = "pointy" +fur_color_id = "teal" +ears_id = "pointy_long" +tail_id = "fox" +eyes_id = "interested" +nose_id = "triangle_small" +mouth_id = "cheeky_smile" +head_look_enabled = true + +[node name="AnimationPlayer" parent="Shopkeeper"] +autoplay = "idle" + +[node name="InteractionArea" type="Area3D" parent="."] +unique_name_in_owner = true +position = Vector3(0, 1, -0.3) +collision_layer = 0 +collision_mask = 2 +script = ExtResource("1_shop") + +[node name="InteractionShape" type="CollisionShape3D" parent="InteractionArea"] +shape = SubResource("InteractionShape") +vertical_icon_alignment = 1 diff --git a/world/regions/starter_island_region.gd b/world/regions/starter_island_region.gd index b418292..c690e4b 100644 --- a/world/regions/starter_island_region.gd +++ b/world/regions/starter_island_region.gd @@ -11,6 +11,9 @@ const PlayerStorageInteractionType = preload( const DecorShopInteractionType = preload( "res://world/decor_shop_interaction.gd" ) +const RVUpgradeInteractionType = preload( + "res://world/rv_upgrade_interaction.gd" +) const FOLIAGE_WIND_SHADER: Shader = preload( "res://world/materials/foliage_wind.gdshader" ) @@ -56,6 +59,10 @@ var player_storage_path: NodePath = ( var decor_shop_path: NodePath = ( ^"Interactables/DecorShopWorld/InteractionArea" ) +@export_node_path("Area3D") +var rv_upgrade_shop_path: NodePath = ( + ^"Interactables/RVUpgradeShopWorld/InteractionArea" +) @export_group("Terrain Collision") # The imported GLB is the collision authority. Rebuild once per region load so # newly authored terrain and props cannot retain a stale saved fallback shape. @@ -95,6 +102,10 @@ func get_decor_shop() -> DecorShopInteractionType: return get_node_or_null(decor_shop_path) as DecorShopInteractionType +func get_rv_upgrade_shop() -> RVUpgradeInteractionType: + return get_node_or_null(rv_upgrade_shop_path) as RVUpgradeInteractionType + + func get_saltwater_shoreline_mesh() -> MeshInstance3D: return get_node_or_null(^"ShorelineRibbons/Ocean") as MeshInstance3D @@ -150,6 +161,7 @@ func get_spawn_surface_triangles( material_names: Array[StringName], minimum_global_y: float, minimum_up_dot: float = 0.6, + maximum_global_y: float = 100.0, ) -> Array[PackedVector3Array]: var triangles: Array[PackedVector3Array] = [] if material_names.is_empty(): @@ -188,6 +200,7 @@ func get_spawn_surface_triangles( vertices[vertex_index + 2], minimum_global_y, minimum_up_dot, + maximum_global_y, ) else: for index_offset: int in range(0, indices.size() - 2, 3): @@ -199,6 +212,7 @@ func get_spawn_surface_triangles( vertices[indices[index_offset + 2]], minimum_global_y, minimum_up_dot, + maximum_global_y, ) return triangles @@ -211,14 +225,14 @@ func _append_spawn_triangle( local_c: Vector3, minimum_global_y: float, minimum_up_dot: float, + maximum_global_y: float, ) -> void: var a: Vector3 = mesh_instance.to_global(local_a) var b: Vector3 = mesh_instance.to_global(local_b) var c: Vector3 = mesh_instance.to_global(local_c) if ( - a.y <= minimum_global_y - or b.y <= minimum_global_y - or c.y <= minimum_global_y + maxf(a.y, maxf(b.y, c.y)) <= minimum_global_y + or minf(a.y, minf(b.y, c.y)) >= maximum_global_y ): return var cross: Vector3 = (b - a).cross(c - a) diff --git a/world/regions/starter_island_region.tscn b/world/regions/starter_island_region.tscn index 9b95dfa..7682491 100644 --- a/world/regions/starter_island_region.tscn +++ b/world/regions/starter_island_region.tscn @@ -19,6 +19,7 @@ [ext_resource type="Script" path="res://world/digging/diggable_area_3d.gd" id="23_diggable_area"] [ext_resource type="Script" path="res://world/gathering/gatherable_anchor_set_3d.gd" id="24_gatherable_anchors"] [ext_resource type="PackedScene" path="res://world/interactables/decor_shop_world.tscn" id="25_decor_shop"] +[ext_resource type="PackedScene" path="res://world/interactables/rv_upgrade_shop_world.tscn" id="26_rv_upgrade"] [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_4e4k5"] data = PackedVector3Array(10.033899, 3.3913999, 3.3446, 13.3786, 3.3913999, 0, 13.3786, 3.3913999, 3.3446, 10.033899, 3.3913999, 3.3446, 10.033899, 3.3913999, 0, 13.3786, 3.3913999, 0, 6.6893, 3.3913999, 3.3446, 10.033899, 3.3913999, 0, 10.033899, 3.3913999, 3.3446, 6.6893, 3.3913999, 3.3446, 6.6893, 3.3913999, 0, 10.033899, 3.3913999, 0, 6.6893, 3.3913999, 0, 10.033899, 3.3913999, -3.3446, 10.033899, 3.3913999, 0, 6.6893, 3.3913999, 6.6893, 6.6893, 3.3913999, 3.3446, 10.033899, 3.3913999, 3.3446, 6.6893, 3.3913999, 6.6893, 10.033899, 3.3913999, 3.3446, 10.033899, 3.3913999, 6.6893, 3.3446, 3.3913999, 3.3446, 6.6893, 3.3913999, 0, 6.6893, 3.3913999, 3.3446, 6.6893, 3.3913999, 10.033899, 6.6893, 3.3913999, 6.6893, 10.033899, 3.3913999, 6.6893, 6.6893, 3.3913999, 10.033899, 10.033899, 3.3913999, 6.6893, 10.033899, 3.3913999, 10.033899, 3.3446, 3.3913999, 6.6893, 6.6893, 3.3913999, 3.3446, 6.6893, 3.3913999, 6.6893, 3.3446, 3.3913999, 6.6893, 3.3446, 3.3913999, 3.3446, 6.6893, 3.3913999, 3.3446, 3.3446, 3.3913999, 10.033899, 6.6893, 3.3913999, 6.6893, 6.6893, 3.3913999, 10.033899, 3.3446, 3.3913999, 10.033899, 3.3446, 3.3913999, 6.6893, 6.6893, 3.3913999, 6.6893, 0, 3.3913999, 6.6893, 3.3446, 3.3913999, 3.3446, 3.3446, 3.3913999, 6.6893, 0, 3.3913999, 6.6893, 0, 3.3913999, 3.3446, 3.3446, 3.3913999, 3.3446, 0, 3.3913999, 10.033899, 0, 3.3913999, 6.6893, 3.3446, 3.3913999, 6.6893, 0, 3.3913999, 10.033899, 3.3446, 3.3913999, 6.6893, 3.3446, 3.3913999, 10.033899, -3.3446, 3.3913999, 13.3786, -3.3446, 3.3913999, 10.033899, 0, 3.3913999, 10.033899, -3.3446, 3.3913999, 13.3786, 0, 3.3913999, 10.033899, 0, 3.3913999, 13.3786, 0, 3.3913999, 13.3786, 0, 3.3913999, 10.033899, 3.3446, 3.3913999, 10.033899, 0, 3.3913999, 13.3786, 3.3446, 3.3913999, 10.033899, 3.3446, 3.3913999, 13.3786, 3.3446, 3.3913999, 13.3786, 3.3446, 3.3913999, 10.033899, 6.6893, 3.3913999, 10.033899, 3.3446, 3.3913999, 13.3786, 6.6893, 3.3913999, 10.033899, 6.6893, 3.3913999, 13.3786, 3.9148, 3.3913999, 16.514599, 3.3446, 3.3913999, 13.3786, 6.6893, 3.3913999, 13.3786, 3.3446, 3.3913999, 13.3786, 3.9148, 3.3913999, 16.514599, 3.6399, 3.3913999, 16.2405, 3.9148, 3.3913999, 16.514599, 6.6893, 3.3913999, 13.3786, 6.6893, 3.3913999, 16.7232, 6.6893, 3.3913999, 16.7232, 6.6949, 3.3913999, 18.9914, 6.6893, 3.3913999, 18.9861, 6.6949, 3.3913999, 18.9914, 6.6893, 3.3913999, 16.7232, 10.3743, 3.3913999, 16.7232, 6.6949, 3.3913999, 18.9914, 10.3743, 3.3913999, 16.7232, 9.1275, 3.3913999, 18.830599, 10.033899, 3.3913999, -10.033899, 13.3786, 3.3913999, -13.3786, 13.3786, 3.3913999, -10.033899, 13.3786, 3.3913999, -13.3786, 16.7232, 3.3913999, -10.033899, 13.3786, 3.3913999, -10.033899, 16.7232, 3.3913999, -10.033899, 19.798899, 3.3913999, -13.1096, 19.798899, 3.3913999, -10.033899, 16.7232, 3.3913999, -10.033899, 16.7232, 3.3913999, -13.1096, 19.798899, 3.3913999, -13.1096, 16.7232, 3.3913999, -10.033899, 16.4543, 3.3913999, -13.3786, 16.7232, 3.3913999, -13.1096, 16.7232, 3.3913999, -10.033899, 13.3786, 3.3913999, -13.3786, 16.4543, 3.3913999, -13.3786, 13.3786, 3.3913999, -6.6893, 13.3786, 3.3913999, -10.033899, 16.7232, 3.3913999, -10.033899, 13.3786, 3.3913999, -6.6893, 16.7232, 3.3913999, -10.033899, 16.7232, 3.3913999, -6.6893, 10.033899, 3.3913999, -6.6893, 13.3786, 3.3913999, -10.033899, 13.3786, 3.3913999, -6.6893, 10.033899, 3.3913999, -6.6893, 10.033899, 3.3913999, -10.033899, 13.3786, 3.3913999, -10.033899, 16.4543, 3.3913999, -13.3786, 16.495699, 3.3913999, -16.459, 16.495699, 3.3913999, -13.42, 16.4543, 3.3913999, -13.3786, 12.738999, 3.3913999, -15.894899, 16.495699, 3.3913999, -16.459, 12.738999, 3.3913999, -15.894899, 16.4543, 3.3913999, -13.3786, 13.3786, 3.3913999, -13.3786, 13.3786, 3.3913999, -13.3786, 12.460899, 3.3913999, -16.1674, 12.738999, 3.3913999, -15.894899, 13.3786, 3.3913999, -13.3786, 10.033899, 3.3913999, -16.7232, 12.460899, 3.3913999, -16.1674, 10.033899, 3.3913999, -10.033899, 10.033899, 3.3913999, -13.3786, 13.3786, 3.3913999, -13.3786, 10.033899, 3.3913999, -16.7232, 13.3786, 3.3913999, -13.3786, 10.033899, 3.3913999, -13.3786, 6.6893, 3.3913999, -13.3786, 10.033899, 3.3913999, -16.7232, 10.033899, 3.3913999, -13.3786, 6.6893, 3.3913999, -13.3786, 6.6893, 3.3913999, -16.7232, 10.033899, 3.3913999, -16.7232, 6.6893, 3.3913999, -10.033899, 10.033899, 3.3913999, -13.3786, 10.033899, 3.3913999, -10.033899, 6.6893, 3.3913999, -10.033899, 6.6893, 3.3913999, -13.3786, 10.033899, 3.3913999, -13.3786, 6.6893, 3.3913999, -6.6893, 6.6893, 3.3913999, -10.033899, 10.033899, 3.3913999, -10.033899, 6.6893, 3.3913999, -6.6893, 10.033899, 3.3913999, -10.033899, 10.033899, 3.3913999, -6.6893, 4.0225, 3.3913999, -8.7143, 6.6893, 3.3913999, -13.3786, 6.6893, 3.3913999, -10.033899, 4.6821, 3.3913999, -13.3786, 6.6893, 3.3913999, -16.7232, 6.6893, 3.3913999, -13.3786, 4.0225, 3.3913999, -8.7143, 4.6821, 3.3913999, -13.3786, 6.6893, 3.3913999, -13.3786, 4.6821, 3.3913999, -13.3786, 3.8388, 3.3913999, -16.7232, 6.6893, 3.3913999, -16.7232, 4.6821, 3.3913999, -13.3786, 4.0225, 3.3913999, -8.7143, 4.6821, 3.3913999, -13.3786, 4.6821, 3.3913999, -13.3786, 4.6821, 3.3913999, -13.3786, 4.4131, 3.2091, -13.357699, 4.6821, 3.3913999, -13.3786, 4.4131, 3.2091, -13.357699, 4.4131, 3.2091, -13.357699, 3.3446, 3.3913999, -6.6893, 4.0225, 3.3913999, -8.7143, 6.6893, 3.3913999, -10.033899, 3.3446, 3.3913999, -6.6893, 6.6893, 3.3913999, -10.033899, 6.6893, 3.3913999, -6.6893, 0, 3.3913999, -6.6893, 4.0225, 3.3913999, -8.7143, 3.3446, 3.3913999, -6.6893, 0, 3.3913999, -6.6893, 0, 3.3913999, -8.7143, 4.0225, 3.3913999, -8.7143, 3.3446, 3.3913999, -3.3446, 3.3446, 3.3913999, -6.6893, 6.6893, 3.3913999, -6.6893, 0, 3.3913999, -6.6893, -3.9101999, 3.3913999, -9.8592, 0, 3.3913999, -8.7143, 0, 3.3913999, -8.7143, -3.9101999, 3.3913999, -9.8592, 0, 3.3913999, -8.7143, 0, 3.3913999, -3.3446, 0, 3.3913999, -6.6893, 3.3446, 3.3913999, -6.6893, 0, 3.3913999, -3.3446, 3.3446, 3.3913999, -6.6893, 3.3446, 3.3913999, -3.3446, -3.6378, 3.3913999, -2.0792, 0, 3.3913999, -6.6893, 0, 3.3913999, -3.3446, -2.9566998, 3.3913999, 0, -3.6378, 3.3913999, -2.0792, 0, 3.3913999, -3.3446, -3.6378, 3.3913999, -2.0792, -3.3446, 3.3913999, -6.6893, 0, 3.3913999, -6.6893, -3.9101999, 3.3913999, -9.8592, 0, 3.3913999, -6.6893, -3.3446, 3.3913999, -6.6893, -6.6893, 3.3913999, -3.7326, -3.3446, 3.3913999, -6.6893, -3.6378, 3.3913999, -2.0792, -2.9566998, 3.3913999, 0, 0, 3.3913999, -3.3446, 0, 3.3913999, 0, 0, 3.3913999, 0, 0, 3.3913999, -3.3446, 3.3446, 3.3913999, -3.3446, -2.9566998, 3.3913999, 3.3446, -2.9566998, 3.3913999, 0, 0, 3.3913999, 0, -2.9566998, 3.3913999, 3.3446, 0, 3.3913999, 0, 0, 3.3913999, 3.3446, -6.6893, 3.3913999, -3.7326, -6.6893, 3.3913999, -6.6893, -3.3446, 3.3913999, -6.6893, -6.6893, 3.3913999, -6.6893, -3.9101999, 3.3913999, -9.8592, -3.3446, 3.3913999, -6.6893, -10.033899, 3.3913999, -3.7326, -6.6893, 3.3913999, -6.6893, -6.6893, 3.3913999, -3.7326, 0, 3.3913999, 3.3446, 0, 3.3913999, 0, 3.3446, 3.3913999, 0, 0, 3.3913999, 0, 3.3446, 3.3913999, -3.3446, 3.3446, 3.3913999, 0, 0, 3.3913999, 3.3446, 3.3446, 3.3913999, 0, 3.3446, 3.3913999, 3.3446, 3.3446, 3.3913999, 3.3446, 3.3446, 3.3913999, 0, 6.6893, 3.3913999, 0, 3.3446, 3.3913999, 0, 3.3446, 3.3913999, -3.3446, 6.6893, 3.3913999, -3.3446, 3.3446, 3.3913999, 0, 6.6893, 3.3913999, -3.3446, 6.6893, 3.3913999, 0, 3.3446, 3.3913999, -3.3446, 6.6893, 3.3913999, -6.6893, 6.6893, 3.3913999, -3.3446, 6.6893, 3.3913999, 0, 6.6893, 3.3913999, -3.3446, 10.033899, 3.3913999, -3.3446, 6.6893, 3.3913999, -3.3446, 6.6893, 3.3913999, -6.6893, 10.033899, 3.3913999, -6.6893, 6.6893, 3.3913999, -3.3446, 10.033899, 3.3913999, -6.6893, 10.033899, 3.3913999, -3.3446, -6.6893, 3.3913999, -6.6893, -6.6893, 3.3913999, -10.033899, -3.9101999, 3.3913999, -9.8592, -6.6893, 3.3913999, -10.033899, -3.9101999, 3.3913999, -12.538199, -3.9101999, 3.3913999, -9.8592, -10.033899, 3.3913999, -3.7326, -10.033899, 3.3913999, -6.6893, -6.6893, 3.3913999, -6.6893, -10.033899, 3.3913999, -6.6893, -6.6893, 3.3913999, -10.033899, -6.6893, 3.3913999, -6.6893, -13.3786, 3.3913999, -3.7326, -10.033899, 3.3913999, -6.6893, -10.033899, 3.3913999, -3.7326, -6.6893, 3.3913999, -10.033899, -6.6893, 3.3913999, -12.538199, -3.9101999, 3.3913999, -12.538199, -13.3786, 3.3913999, -3.7326, -13.3786, 3.3913999, -6.6893, -10.033899, 3.3913999, -6.6893, -16.191599, 3.3913999, -3.0971, -13.3786, 3.3913999, -6.6893, -13.3786, 3.3913999, -3.7326, -10.033899, 3.3913999, -6.6893, -10.033899, 3.3913999, -10.033899, -6.6893, 3.3913999, -10.033899, -13.3786, 3.3913999, -6.6893, -10.033899, 3.3913999, -10.033899, -10.033899, 3.3913999, -6.6893, -16.191599, 3.3913999, -3.0971, -16.7232, 3.3913999, -6.6893, -13.3786, 3.3913999, -6.6893, -13.3786, 3.3913999, -6.6893, -13.3786, 3.3913999, -10.033899, -10.033899, 3.3913999, -10.033899, -19.7545, 3.3913999, -2.7851999, -16.7232, 3.3913999, -6.6893, -16.191599, 3.3913999, -3.0971, -19.7545, 3.3913999, -2.7851999, -19.280699, 3.3913999, -6.6893, -16.7232, 3.3913999, -6.6893, -17.1112, 3.3913999, 0, -19.7545, 3.3913999, -2.7851999, -16.191599, 3.3913999, -3.0971, -17.1112, 3.3913999, 0, -19.9511, 3.3913999, -2.5834, -19.7545, 3.3913999, -2.7851999, -19.9511, 3.3913999, -2.5834, -17.1112, 3.3913999, 0, -20.0679, 3.3913999, 0, -20.0679, 3.3913999, 3.3446, -20.0679, 3.3913999, 0, -17.1112, 3.3913999, 0, -20.0679, 3.3913999, 3.3446, -17.1112, 3.3913999, 0, -17.1112, 3.3913999, 3.3044999, -13.3786, 3.3913999, -10.033899, -10.699599, 3.3913999, -13.175799, -10.033899, 3.3913999, -10.033899, -10.699599, 3.3913999, -13.175799, -6.6893, 3.3913999, -10.033899, -10.033899, 3.3913999, -10.033899, -13.3786, 3.3913999, -10.033899, -13.3786, 3.3913999, -13.3786, -10.699599, 3.3913999, -13.175799, -6.6893, 3.3913999, -10.033899, -10.699599, 3.3913999, -13.175799, -6.6893, 3.3913999, -12.538199, -13.3786, 3.3913999, -13.3786, -10.699599, 3.3913999, -15.835, -10.699599, 3.3913999, -13.175799, -13.3786, 3.3913999, -13.3786, -13.3786, 3.3913999, -15.4154, -10.699599, 3.3913999, -15.835, -6.6893, 3.3913999, -12.538199, -10.699599, 3.3913999, -13.175799, -6.6893, 3.3913999, -12.538199, -6.6893, 3.3913999, -12.538199, -6.6893, 3.3913999, -12.538199, -6.6893, 3.175, -12.867, -6.6893, 3.3913999, -12.538199, -6.6893, 3.175, -12.867, -6.6893, 3.175, -12.867, -20.0679, 3.3913999, 6.6893, -20.0679, 3.3913999, 3.3446, -17.1112, 3.3913999, 3.3044999, -22.5541, 3.3913999, 9.2058, -22.3151, 3.3913999, 6.6893, -20.0679, 3.3913999, 6.6893, -22.5541, 3.3913999, 9.2058, -20.0679, 3.3913999, 6.6893, -20.0679, 3.3913999, 9.167399, -20.0679, 3.3913999, 9.167399, -20.0679, 3.3913999, 6.6893, -16.7232, 3.3913999, 6.6893, -20.0679, 3.3913999, 6.6893, -17.1112, 3.3913999, 3.3044999, -16.7232, 3.3913999, 6.6893, -20.0679, 3.3913999, 9.167399, -16.7232, 3.3913999, 6.6893, -16.285099, 3.3913999, 9.5865, -16.7232, 3.3913999, 6.6893, -16.053999, 3.3913999, 9.8082, -16.285099, 3.3913999, 9.5865, -16.053999, 3.3913999, 9.8082, -16.7232, 3.3913999, 6.6893, -13.1355, 3.3913999, 6.7549996, -17.1112, 3.3913999, 3.3044999, -13.1355, 3.3913999, 6.7549996, -16.7232, 3.3913999, 6.6893, -16.053999, 3.3913999, 9.8082, -13.1355, 3.3913999, 6.7549996, -13.3786, 3.3913999, 10.033899, -13.1355, 3.3913999, 6.7549996, -17.1112, 3.3913999, 3.3044999, -14.877199, 3.3913999, 4.6657, -14.877199, 3.3913999, 4.6657, -17.1112, 3.3913999, 3.3044999, -15.582299, 3.3913999, 4.0366, -13.1355, 3.3913999, 6.7549996, -14.877199, 3.3913999, 4.6657, -14.0948, 3.3913999, 5.5073, -13.3786, 3.3913999, 10.033899, -13.1355, 3.3913999, 6.7549996, -10.033899, 3.3913999, 7.0772, -13.3786, 3.3913999, 10.033899, -10.033899, 3.3913999, 7.0772, -10.033899, 3.3913999, 10.033899, -10.033899, 3.3913999, 10.033899, -10.033899, 3.3913999, 7.0772, -6.6893, 3.3913999, 7.0772, -10.033899, 3.3913999, 10.033899, -6.6893, 3.3913999, 7.0772, -6.6893, 3.3913999, 10.033899, -10.033899, 3.0033998, 6.6893, -13.1355, 3.3913999, 6.7549996, -12.747499, 3.0033998, 6.3671, -10.033899, 3.0033998, 6.6893, -10.033899, 3.3913999, 7.0772, -13.1355, 3.3913999, 6.7549996, -2.5674999, 2.4164, 7.6215, -6.6893, 3.3913999, 7.0772, -6.6893, 3.0033998, 6.6893, -2.5674999, 2.4164, 7.6215, -2.1794999, 2.8042998, 8.009399, -6.6893, 3.3913999, 7.0772, -12.747499, 3.0033998, 6.3671, -14.0948, 3.3913999, 5.5073, -13.6942, 3.0033998, 5.1798, -12.747499, 3.0033998, 6.3671, -13.1355, 3.3913999, 6.7549996, -14.0948, 3.3913999, 5.5073, -6.6893, 3.0033998, 6.6893, -10.033899, 3.3913999, 7.0772, -10.033899, 3.0033998, 6.6893, -6.6893, 3.0033998, 6.6893, -6.6893, 3.3913999, 7.0772, -10.033899, 3.3913999, 7.0772, -16.7232, 3.0033998, 0, -16.191599, 3.3913999, -3.0971, -15.8036995, 3.0033998, -2.7091, -16.7232, 3.0033998, 0, -17.1112, 3.3913999, 0, -16.191599, 3.3913999, -3.0971, -13.3786, 3.3913999, -3.7326, -15.8036995, 3.0033998, -2.7091, -16.191599, 3.3913999, -3.0971, -13.3786, 3.3913999, -3.7326, -13.3786, 3.0033998, -3.3446, -15.8036995, 3.0033998, -2.7091, -2.9566998, 3.3913999, 0, -4.0257998, 3.0033998, -1.6911999, -3.6378, 3.3913999, -2.0792, -2.9566998, 3.3913999, 0, -3.3446, 3.0033998, 0, -4.0257998, 3.0033998, -1.6911999, -3.6378, 3.3913999, -2.0792, -6.6893, 3.0033998, -3.3446, -6.6893, 3.3913999, -3.7326, -3.6378, 3.3913999, -2.0792, -4.0257998, 3.0033998, -1.6911999, -6.6893, 3.0033998, -3.3446, -10.033899, 3.3913999, -3.7326, -13.3786, 3.0033998, -3.3446, -13.3786, 3.3913999, -3.7326, -10.033899, 3.3913999, -3.7326, -10.033899, 3.0033998, -3.3446, -13.3786, 3.0033998, -3.3446, -6.6893, 3.3913999, -3.7326, -10.033899, 3.0033998, -3.3446, -10.033899, 3.3913999, -3.7326, -6.6893, 3.3913999, -3.7326, -6.6893, 3.0033998, -3.3446, -10.033899, 3.0033998, -3.3446, -16.7232, 3.0033998, 2.9166, -17.1112, 3.3913999, 0, -16.7232, 3.0033998, 0, -16.7232, 3.0033998, 2.9166, -17.1112, 3.3913999, 3.3044999, -17.1112, 3.3913999, 0, -14.4892, 3.0033998, 4.2778, -15.582299, 3.3913999, 4.0366, -15.372, 3.0033998, 3.6132998, -14.4892, 3.0033998, 4.2778, -14.877199, 3.3913999, 4.6657, -15.582299, 3.3913999, 4.0366, -2.9566998, 3.3913999, 3.3446, -3.3446, 3.0033998, 0, -2.9566998, 3.3913999, 0, -2.9566998, 3.3913999, 3.3446, -3.3446, 3.0033998, 3.3446, -3.3446, 3.0033998, 0, -2.1794999, 2.8042998, 8.009399, -2.1397, 3.0033998, 5.1795, -1.7832999, 3.3913999, 5.2162, -2.1794999, 2.8042998, 8.009399, -2.5674999, 2.4164, 7.6215, -2.1397, 3.0033998, 5.1795, -6.6893, 3.3913999, 10.033899, -2.1794999, 2.8042998, 8.009399, -3.3446, 3.3913999, 10.033899, -6.6893, 3.3913999, 10.033899, -6.6893, 3.3913999, 7.0772, -2.1794999, 2.8042998, 8.009399, -1.7832999, 3.3913999, 5.2162, 0, 3.3913999, 6.6893, -2.1794999, 2.8042998, 8.009399, 0, 3.3913999, 6.6893, -1.7832999, 3.3913999, 5.2162, -2.9566998, 3.3913999, 3.3446, 0, 3.3913999, 6.6893, -2.9566998, 3.3913999, 3.3446, 0, 3.3913999, 3.3446, -3.3446, 3.3913999, 10.033899, 0, 3.3913999, 6.6893, 0, 3.3913999, 10.033899, -3.3446, 3.3913999, 10.033899, -2.1794999, 2.8042998, 8.009399, 0, 3.3913999, 6.6893, -2.1397, 3.0033998, 5.1795, -2.9566998, 3.3913999, 3.3446, -1.7832999, 3.3913999, 5.2162, -2.1397, 3.0033998, 5.1795, -3.3446, 3.0033998, 3.3446, -2.9566998, 3.3913999, 3.3446, -14.0948, 3.3913999, 5.5073, -14.4892, 3.0033998, 4.2778, -13.6942, 3.0033998, 5.1798, -14.0948, 3.3913999, 5.5073, -14.877199, 3.3913999, 4.6657, -14.4892, 3.0033998, 4.2778, -15.582299, 3.3913999, 4.0366, -16.7232, 3.0033998, 2.9166, -15.372, 3.0033998, 3.6132998, -15.582299, 3.3913999, 4.0366, -17.1112, 3.3913999, 3.3044999, -16.7232, 3.0033998, 2.9166, 20.198, 3.1490998, -10.033899, 19.798899, 3.3913999, -13.1096, 20.1539, 3.1299, -13.399799, 20.198, 3.1490998, -10.033899, 19.798899, 3.3913999, -10.033899, 19.798899, 3.3913999, -13.1096, 20.1539, 3.1299, -13.399799, 16.7232, 3.3913999, -13.1096, 16.8204, 3.138, -13.447599, 20.1539, 3.1299, -13.399799, 19.798899, 3.3913999, -13.1096, 16.7232, 3.3913999, -13.1096, 16.756899, 3.1650999, -16.7286, 12.738999, 3.3913999, -15.894899, 12.7471, 3.1766999, -16.1988, 16.756899, 3.1650999, -16.7286, 16.495699, 3.3913999, -16.459, 12.738999, 3.3913999, -15.894899, 16.8051, 3.1778, -13.479, 16.495699, 3.3913999, -16.459, 16.756899, 3.1650999, -16.7286, 16.8051, 3.1778, -13.479, 16.495699, 3.3913999, -13.42, 16.495699, 3.3913999, -16.459, 16.4543, 3.3913999, -13.3786, 16.8204, 3.138, -13.447599, 16.7232, 3.3913999, -13.1096, 16.8204, 3.138, -13.447599, 16.4543, 3.3913999, -13.3786, 16.495699, 3.3913999, -13.42, 16.8204, 3.138, -13.447599, 16.495699, 3.3913999, -13.42, 16.8051, 3.1778, -13.479, 10.033899, 3.0523999, -19.0294, 6.6893, 3.2782998, -18.727999, 6.6893, 3.0440998, -19.036999, 10.033899, 3.0523999, -19.0294, 10.033899, 3.2784998, -18.6997, 6.6893, 3.2782998, -18.727999, 12.723599, 2.9213, -19.2902, 10.033899, 3.2784998, -18.6997, 10.033899, 3.0523999, -19.0294, 12.723599, 2.9213, -19.2902, 12.446099, 3.1699998, -18.9401, 10.033899, 3.2784998, -18.6997, 12.446099, 3.1699998, -18.9401, 12.747, 3.1771, -16.1991, 12.460899, 3.3913999, -16.1674, 12.446099, 3.1699998, -18.9401, 12.723599, 2.9213, -19.2902, 12.747, 3.1771, -16.1991, 12.460899, 3.3913999, -16.1674, 10.033899, 3.2784998, -18.6997, 12.446099, 3.1699998, -18.9401, 10.033899, 3.3913999, -16.7232, 10.033899, 3.2784998, -18.6997, 12.460899, 3.3913999, -16.1674, 10.033899, 3.3913999, -16.7232, 12.460899, 3.3913999, -16.1674, 12.460899, 3.3913999, -16.1674, 6.6893, 3.3913999, -16.7232, 10.033899, 3.2784998, -18.6997, 10.033899, 3.3913999, -16.7232, 6.6893, 3.3913999, -16.7232, 6.6893, 3.2782998, -18.727999, 10.033899, 3.2784998, -18.6997, 12.738999, 3.3913999, -15.894899, 12.747, 3.1771, -16.1991, 12.7471, 3.1766999, -16.1988, 12.738999, 3.3913999, -15.894899, 12.460899, 3.3913999, -16.1674, 12.747, 3.1771, -16.1991, 12.460899, 3.3913999, -16.1674, 12.738999, 3.3913999, -15.894899, 12.460899, 3.3913999, -16.1674, 3.8388, 3.3913999, -16.7232, 4.4783998, 3.1067, -18.2665, 4.6443, 3.2897, -17.9799, 3.8388, 3.3913999, -16.7232, 3.5895, 3.2033, -16.7232, 4.4783998, 3.1067, -18.2665, 4.6821, 3.3913999, -13.3786, 3.5895, 3.2033, -16.7232, 3.8388, 3.3913999, -16.7232, 4.6821, 3.3913999, -13.3786, 4.4131, 3.2091, -13.357699, 3.5895, 3.2033, -16.7232, 6.6640997, 3.0702, -19.018099, 4.6443, 3.2897, -17.9799, 4.4783998, 3.1067, -18.2665, 6.6640997, 3.0702, -19.018099, 6.6705, 3.2772, -18.741, 4.6443, 3.2897, -17.9799, 4.6443, 3.2897, -17.9799, 6.6893, 3.3913999, -16.7232, 3.8388, 3.3913999, -16.7232, 6.6893, 3.3913999, -16.7232, 4.6443, 3.2897, -17.9799, 6.6705, 3.2772, -18.741, 6.6893, 3.3913999, -16.7232, 6.6705, 3.2772, -18.741, 6.6893, 3.2782998, -18.727999, 6.6893, 3.2782998, -18.727999, 6.6640997, 3.0702, -19.018099, 6.6893, 3.0440998, -19.036999, 6.6893, 3.2782998, -18.727999, 6.6705, 3.2772, -18.741, 6.6640997, 3.0702, -19.018099, 3.7529, 3.1712, -9.0494995, 0, 3.3913999, -8.7143, 0, 3.179, -9.0652, 3.7529, 3.1712, -9.0494995, 4.0225, 3.3913999, -8.7143, 0, 3.3913999, -8.7143, 4.0225, 3.3913999, -8.7143, 4.4131, 3.2091, -13.357699, 4.6821, 3.3913999, -13.3786, 4.0225, 3.3913999, -8.7143, 3.7529, 3.1712, -9.0494995, 4.4131, 3.2091, -13.357699, -3.6538, 3.1585999, -12.813399, -6.6893, 3.3913999, -12.538199, -6.6893, 3.175, -12.867, -3.6538, 3.1585999, -12.813399, -3.9101999, 3.3913999, -12.538199, -6.6893, 3.3913999, -12.538199, -3.6076, 3.1676, -10.0696, -3.9101999, 3.3913999, -12.538199, -3.6538, 3.1585999, -12.813399, -3.6076, 3.1676, -10.0696, -3.9101999, 3.3913999, -9.8592, -3.9101999, 3.3913999, -12.538199, -0.0081, 3.1864998, -9.063499, -3.9101999, 3.3913999, -9.8592, -3.6076, 3.1676, -10.0696, -0.0081, 3.1864998, -9.063499, 0, 3.3913999, -8.7143, -3.9101999, 3.3913999, -9.8592, 0, 3.3913999, -8.7143, -0.0081, 3.1864998, -9.063499, 0, 3.179, -9.0652, 0, 3.3913999, -8.7143, 0, 3.3913999, -8.7143, -0.0081, 3.1864998, -9.063499, -10.4043, 3.1608999, -13.4295, -10.699599, 3.3913999, -15.835, -10.4319, 3.1557999, -16.1556, -10.4043, 3.1608999, -13.4295, -10.699599, 3.3913999, -13.175799, -10.699599, 3.3913999, -15.835, -10.4319, 3.1557999, -16.1556, -13.3786, 3.3913999, -15.4154, -13.3786, 3.1771998, -15.7625, -10.4319, 3.1557999, -16.1556, -10.699599, 3.3913999, -15.835, -13.3786, 3.3913999, -15.4154, -10.699599, 3.3913999, -13.175799, -6.6893, 3.175, -12.867, -6.6893, 3.3913999, -12.538199, -10.699599, 3.3913999, -13.175799, -10.4043, 3.1608999, -13.4295, -6.6893, 3.175, -12.867, -16.130499, 3.6227, -13.623799, -16.0243, 3.3509998, -15.752, -15.7941, 3.5591, -15.4641, -16.130499, 3.6227, -13.623799, -16.3753, 3.4225, -13.6277, -16.0243, 3.3509998, -15.752, -13.3911, 3.1892, -15.757, -15.7941, 3.5591, -15.4641, -16.0243, 3.3509998, -15.752, -13.3911, 3.1892, -15.757, -13.396, 3.3925, -15.4333, -15.7941, 3.5591, -15.4641, -15.7941, 3.5591, -15.4641, -13.3786, 3.3913999, -13.3786, -16.130499, 3.6227, -13.623799, -13.3786, 3.3913999, -13.3786, -15.7941, 3.5591, -15.4641, -13.396, 3.3925, -15.4333, -13.3786, 3.3913999, -13.3786, -13.396, 3.3925, -15.4333, -13.3786, 3.3913999, -15.4154, -13.3786, 3.3913999, -15.4154, -13.3911, 3.1892, -15.757, -13.3786, 3.1771998, -15.7625, -13.3786, 3.3913999, -15.4154, -13.396, 3.3925, -15.4333, -13.3911, 3.1892, -15.757, -16.3753, 3.4225, -13.6277, -16.1241, 3.3832998, -9.5097, -16.4131, 3.1706, -9.788899, -16.3753, 3.4225, -13.6277, -16.130499, 3.6227, -13.623799, -16.1241, 3.3832998, -9.5097, -16.7232, 3.3913999, -6.6893, -13.3786, 3.3913999, -10.033899, -13.3786, 3.3913999, -6.6893, -16.7232, 3.3913999, -6.6893, -16.1241, 3.3832998, -9.5097, -13.3786, 3.3913999, -10.033899, -16.1241, 3.3832998, -9.5097, -13.3786, 3.3913999, -13.3786, -13.3786, 3.3913999, -10.033899, -16.1241, 3.3832998, -9.5097, -16.130499, 3.6227, -13.623799, -13.3786, 3.3913999, -13.3786, -16.130499, 3.6227, -13.623799, -16.1241, 3.3832998, -9.5097, -16.130499, 3.6227, -13.623799, -16.130499, 3.6227, -13.623799, -16.3753, 3.4225, -13.6277, -16.3753, 3.4225, -13.6277, -16.130499, 3.6227, -13.623799, -16.130499, 3.6227, -13.623799, -16.3753, 3.4225, -13.6277, -19.7545, 3.3913999, -2.7851999, -19.515, 3.2122, -6.6893, -19.280699, 3.3913999, -6.6893, -19.7545, 3.3913999, -2.7851999, -19.9489, 3.2063, -2.8082, -19.515, 3.2122, -6.6893, -19.280699, 3.3913999, -6.6893, -19.6161, 3.2075999, -9.7116995, -19.3965, 3.3909, -9.5092, -19.280699, 3.3913999, -6.6893, -19.515, 3.2122, -6.6893, -19.6161, 3.2075999, -9.7116995, -19.280699, 3.3913999, -6.6893, -16.1241, 3.3832998, -9.5097, -16.7232, 3.3913999, -6.6893, -19.280699, 3.3913999, -6.6893, -19.3965, 3.3909, -9.5092, -16.1241, 3.3832998, -9.5097, -16.1241, 3.3832998, -9.5097, -19.6237, 3.1655998, -9.757899, -16.4131, 3.1706, -9.788899, -19.6237, 3.1655998, -9.757899, -16.1241, 3.3832998, -9.5097, -19.3965, 3.3909, -9.5092, -19.6237, 3.1655998, -9.757899, -19.3965, 3.3909, -9.5092, -19.6161, 3.2075999, -9.7116995, -22.8657, 3.4937, 3.3613, -23.3676, 3.4459999, 0.1372, -23.170399, 3.6251, 0.122999996, -22.8657, 3.4937, 3.3613, -23.0809, 3.3083, 3.3615, -23.3676, 3.4459999, 0.1372, -23.170399, 3.6251, 0.122999996, -23.390299, 3.3349998, -2.6938999, -23.192099, 3.5300999, -2.4668999, -23.170399, 3.6251, 0.122999996, -23.3676, 3.4459999, 0.1372, -23.390299, 3.3349998, -2.6938999, -23.192099, 3.5300999, -2.4668999, -19.9489, 3.2063, -2.8082, -19.9511, 3.3913999, -2.5834, -23.192099, 3.5300999, -2.4668999, -23.390299, 3.3349998, -2.6938999, -19.9489, 3.2063, -2.8082, -23.192099, 3.5300999, -2.4668999, -20.0679, 3.3913999, 0, -23.170399, 3.6251, 0.122999996, -20.0679, 3.3913999, 0, -23.192099, 3.5300999, -2.4668999, -19.9511, 3.3913999, -2.5834, -19.9511, 3.3913999, -2.5834, -23.192099, 3.5300999, -2.4668999, -19.9511, 3.3913999, -2.5834, -22.8657, 3.4937, 3.3613, -20.0679, 3.3913999, 0, -20.0679, 3.3913999, 3.3446, -22.8657, 3.4937, 3.3613, -23.170399, 3.6251, 0.122999996, -20.0679, 3.3913999, 0, -19.7545, 3.3913999, -2.7851999, -19.9489, 3.2063, -2.8082, -19.9489, 3.2063, -2.8082, -19.7545, 3.3913999, -2.7851999, -19.9511, 3.3913999, -2.5834, -19.9489, 3.2063, -2.8082, -19.9511, 3.3913999, -2.5834, -19.7545, 3.3913999, -2.7851999, -19.9511, 3.3913999, -2.5834, -23.0777, 3.3197, 3.3734, -22.3151, 3.3913999, 6.6893, -22.563799, 3.2219, 6.6893, -23.0777, 3.3197, 3.3734, -22.8764, 3.4937, 3.3741, -22.3151, 3.3913999, 6.6893, -22.8764, 3.4937, 3.3741, -20.0679, 3.3913999, 6.6893, -22.3151, 3.3913999, 6.6893, -20.0679, 3.3913999, 6.6893, -22.8764, 3.4937, 3.3741, -22.8657, 3.4937, 3.3613, -20.0679, 3.3913999, 6.6893, -22.8657, 3.4937, 3.3613, -20.0679, 3.3913999, 3.3446, -22.8657, 3.4937, 3.3613, -23.0777, 3.3197, 3.3734, -23.0809, 3.3083, 3.3615, -22.8657, 3.4937, 3.3613, -22.8764, 3.4937, 3.3741, -23.0777, 3.3197, 3.3734, -16.285099, 3.3913999, 9.5865, -20.0679, 3.1943, 9.407499, -20.0679, 3.3913999, 9.167399, -16.285099, 3.3913999, 9.5865, -16.2818, 3.1913998, 9.8056, -20.0679, 3.1943, 9.407499, -22.791399, 3.2124999, 9.4432, -20.0679, 3.3913999, 9.167399, -20.0679, 3.1943, 9.407499, -22.791399, 3.2124999, 9.4432, -22.5541, 3.3913999, 9.2058, -20.0679, 3.3913999, 9.167399, -22.5541, 3.3913999, 9.2058, -22.563799, 3.2219, 6.6893, -22.3151, 3.3913999, 6.6893, -22.5541, 3.3913999, 9.2058, -22.791399, 3.2124999, 9.4432, -22.563799, 3.2219, 6.6893, -22.791399, 3.2124999, 9.4432, -22.5541, 3.3913999, 9.2058, -22.791399, 3.2124999, 9.4432, -13.3786, 3.3922, 12.571899, -16.076399, 3.04, 12.735, -15.847199, 3.2614, 12.4973, -13.3786, 3.3922, 12.571899, -13.3786, 3.194, 12.8089, -16.076399, 3.04, 12.735, -15.847199, 3.2614, 12.4973, -16.2818, 3.1913998, 9.8056, -16.053999, 3.3913999, 9.8082, -15.847199, 3.2614, 12.4973, -16.076399, 3.04, 12.735, -16.2818, 3.1913998, 9.8056, -15.847199, 3.2614, 12.4973, -13.3786, 3.3913999, 10.033899, -13.3786, 3.3922, 12.571899, -15.847199, 3.2614, 12.4973, -16.053999, 3.3913999, 9.8082, -13.3786, 3.3913999, 10.033899, -16.053999, 3.3913999, 9.8082, -15.847199, 3.2614, 12.4973, -16.053999, 3.3913999, 9.8082, -16.285099, 3.3913999, 9.5865, -16.2818, 3.1913998, 9.8056, -16.2818, 3.1913998, 9.8056, -16.285099, 3.3913999, 9.5865, -16.053999, 3.3913999, 9.8082, -16.2818, 3.1913998, 9.8056, -16.053999, 3.3913999, 9.8082, -16.285099, 3.3913999, 9.5865, -16.053999, 3.3913999, 9.8082, -5.9742, 3.3994, 12.8817, -10.033899, 2.9384, 12.4537, -10.033899, 3.2142, 12.1061, -5.9742, 3.3994, 12.8817, -6.2748, 3.126, 13.122, -10.033899, 2.9384, 12.4537, -10.033899, 3.2142, 12.1061, -13.3786, 3.194, 12.8089, -13.3786, 3.3922, 12.571899, -10.033899, 3.2142, 12.1061, -10.033899, 2.9384, 12.4537, -13.3786, 3.194, 12.8089, -10.033899, 3.2142, 12.1061, -6.6893, 3.3913999, 10.033899, -5.9742, 3.3994, 12.8817, -10.033899, 3.2142, 12.1061, -10.033899, 3.3913999, 10.033899, -6.6893, 3.3913999, 10.033899, -13.3786, 3.3922, 12.571899, -10.033899, 3.3913999, 10.033899, -10.033899, 3.2142, 12.1061, -13.3786, 3.3922, 12.571899, -13.3786, 3.3913999, 10.033899, -10.033899, 3.3913999, 10.033899, -13.3786, 3.3913999, 10.033899, -13.3786, 3.3922, 12.571899, -13.3786, 3.3922, 12.571899, -5.9742, 3.3994, 12.8817, -3.3446, 3.3913999, 10.033899, -3.3446, 3.3913999, 13.3786, -5.9742, 3.3994, 12.8817, -6.6893, 3.3913999, 10.033899, -3.3446, 3.3913999, 10.033899, -13.3786, 3.3922, 12.571899, -13.3786, 3.194, 12.8089, -13.3786, 3.194, 12.8089, -13.3786, 3.3922, 12.571899, -13.3786, 3.3922, 12.571899, -13.3786, 3.194, 12.8089, 3.6399, 3.3913999, 16.2405, 0, 2.9636998, 16.0179, 0, 3.2243998, 15.7093, 3.6399, 3.3913999, 16.2405, 3.6425998, 3.1413999, 16.5127, 0, 2.9636998, 16.0179, 0, 3.2243998, 15.7093, -3.3446, 3.1497998, 15.914599, -3.3446, 3.3913999, 15.6011, 0, 3.2243998, 15.7093, 0, 2.9636998, 16.0179, -3.3446, 3.1497998, 15.914599, -6.2558, 3.1427999, 16.4098, -3.3446, 3.3913999, 15.6011, -3.3446, 3.1497998, 15.914599, -6.2558, 3.1427999, 16.4098, -5.9737997, 3.392, 16.087599, -3.3446, 3.3913999, 15.6011, -3.3446, 3.3913999, 15.6011, 0, 3.3913999, 13.3786, 0, 3.2243998, 15.7093, -3.3446, 3.3913999, 15.6011, -3.3446, 3.3913999, 13.3786, 0, 3.3913999, 13.3786, 0, 3.2243998, 15.7093, 3.3446, 3.3913999, 13.3786, 3.6399, 3.3913999, 16.2405, 0, 3.2243998, 15.7093, 0, 3.3913999, 13.3786, 3.3446, 3.3913999, 13.3786, -5.9737997, 3.392, 16.087599, -3.3446, 3.3913999, 13.3786, -3.3446, 3.3913999, 15.6011, -5.9737997, 3.392, 16.087599, -5.9742, 3.3994, 12.8817, -3.3446, 3.3913999, 13.3786, -6.2748, 3.1260998, 16.4145, -5.9737997, 3.392, 16.087599, -6.2558, 3.1427999, 16.4098, -5.9737997, 3.392, 16.087599, -6.2748, 3.1260998, 16.4145, -6.2748, 3.126, 13.122, -5.9737997, 3.392, 16.087599, -6.2748, 3.126, 13.122, -5.9742, 3.3994, 12.8817, 6.6893, 3.3913999, 18.9861, 3.9266999, 3.5967, 19.6223, 4.1273, 3.7335, 19.3804, 6.6893, 3.3913999, 18.9861, 6.6893, 3.2050998, 19.228699, 3.9266999, 3.5967, 19.6223, 4.1273, 3.7335, 19.3804, 3.6536, 3.2078998, 16.5669, 3.8651, 3.3981998, 16.5647, 4.1273, 3.7335, 19.3804, 3.9266999, 3.5967, 19.6223, 3.6536, 3.2078998, 16.5669, 3.8651, 3.3981998, 16.5647, 6.6893, 3.3913999, 18.9861, 4.1273, 3.7335, 19.3804, 6.6893, 3.3913999, 18.9861, 3.8651, 3.3981998, 16.5647, 3.9148, 3.3913999, 16.514599, 6.6893, 3.3913999, 18.9861, 3.9148, 3.3913999, 16.514599, 6.6893, 3.3913999, 16.7232, 3.9148, 3.3913999, 16.514599, 3.6425998, 3.1413999, 16.5127, 3.6399, 3.3913999, 16.2405, 3.6425998, 3.1413999, 16.5127, 3.9148, 3.3913999, 16.514599, 3.8651, 3.3981998, 16.5647, 3.6425998, 3.1413999, 16.5127, 3.8651, 3.3981998, 16.5647, 3.6536, 3.2078998, 16.5669, 9.3066, 3.2186, 19.0653, 10.3743, 3.3913999, 16.7232, 10.5913, 3.1985998, 16.7232, 9.3066, 3.2186, 19.0653, 9.1275, 3.3913999, 18.830599, 10.3743, 3.3913999, 16.7232, 9.1275, 3.3913999, 18.830599, 6.6991997, 3.2148, 19.2255, 6.6949, 3.3913999, 18.9914, 9.1275, 3.3913999, 18.830599, 9.3066, 3.2186, 19.0653, 6.6991997, 3.2148, 19.2255, 6.6893, 3.3913999, 18.9861, 6.6991997, 3.2148, 19.2255, 6.6893, 3.2050998, 19.228699, 6.6893, 3.3913999, 18.9861, 6.6949, 3.3913999, 18.9914, 6.6991997, 3.2148, 19.2255, 9.8131, 3.3546, 13.1979, 10.5893, 3.2117, 16.7106, 10.403999, 3.3911998, 16.6938, 9.8131, 3.3546, 13.1979, 10.0546, 3.1885, 13.4071, 10.5893, 3.2117, 16.7106, 6.6893, 3.3913999, 13.3786, 10.3743, 3.3913999, 16.7232, 6.6893, 3.3913999, 16.7232, 10.3743, 3.3913999, 16.7232, 6.6893, 3.3913999, 13.3786, 9.8131, 3.3546, 13.1979, 10.3743, 3.3913999, 16.7232, 9.8131, 3.3546, 13.1979, 10.403999, 3.3911998, 16.6938, 6.6893, 3.3913999, 13.3786, 10.033899, 3.3913999, 10.033899, 9.8131, 3.3546, 13.1979, 6.6893, 3.3913999, 13.3786, 6.6893, 3.3913999, 10.033899, 10.033899, 3.3913999, 10.033899, 10.3743, 3.3913999, 16.7232, 10.5893, 3.2117, 16.7106, 10.5913, 3.1985998, 16.7232, 10.3743, 3.3913999, 16.7232, 10.403999, 3.3911998, 16.6938, 10.5893, 3.2117, 16.7106, 13.1839, 3.2744, 6.6893, 13.5511, 3.1797, 6.6893, 13.4036, 3.0749998, 6.6893, 13.1839, 3.2744, 6.6893, 13.3786, 3.2744, 6.496, 13.5511, 3.1797, 6.6893, 12.9758, 3.2036, 10.033899, 13.1839, 3.2744, 6.6893, 13.4036, 3.0749998, 6.6893, 12.9758, 3.2036, 10.033899, 12.7325, 3.3913999, 10.033899, 13.1839, 3.2744, 6.6893, 13.2631, 3.5611, 13.4043, 12.7325, 3.3913999, 10.033899, 12.9758, 3.2036, 10.033899, 13.2631, 3.5611, 13.4043, 13.025499, 3.6999, 13.1985, 12.7325, 3.3913999, 10.033899, 10.033899, 3.3913999, 10.033899, 13.1839, 3.2744, 6.6893, 12.7325, 3.3913999, 10.033899, 10.033899, 3.3913999, 10.033899, 10.033899, 3.3913999, 6.6893, 13.1839, 3.2744, 6.6893, 9.8131, 3.3546, 13.1979, 12.7325, 3.3913999, 10.033899, 13.025499, 3.6999, 13.1985, 9.8131, 3.3546, 13.1979, 10.033899, 3.3913999, 10.033899, 12.7325, 3.3913999, 10.033899, 10.033899, 3.3913999, 3.3446, 13.1839, 3.2744, 6.6893, 10.033899, 3.3913999, 6.6893, 13.1839, 3.2744, 6.6893, 10.033899, 3.3913999, 3.3446, 13.3786, 3.3913999, 3.3446, 13.1839, 3.2744, 6.6893, 13.3786, 3.3913999, 3.3446, 13.3786, 3.2744, 6.496, 13.025499, 3.6999, 13.1985, 10.0546, 3.1885, 13.4071, 9.8131, 3.3546, 13.1979, 13.025499, 3.6999, 13.1985, 13.2631, 3.5611, 13.4043, 10.0546, 3.1885, 13.4071, 13.2631, 3.5611, 13.4043, 13.2631, 3.5611, 13.4043, 13.025499, 3.6999, 13.1985, 14.0489, 3.0042, -3.3446, 13.1206, 3.3028998, -3.3446, 13.3786, 3.3028998, -3.6027, 14.0489, 3.0042, -3.3446, 13.3786, 3.3028998, -3.0865998, 13.1206, 3.3028998, -3.3446, 16.7232, 3.1513, -3.602, 14.0489, 3.0042, -3.3446, 13.3786, 3.3028998, -3.6027, 16.7232, 3.1513, -3.602, 16.7127, 2.8734, -3.3446, 14.0489, 3.0042, -3.3446, 13.3786, 3.3028998, -3.6027, 16.7232, 3.3913999, -6.6893, 16.7232, 3.1513, -3.602, 13.3786, 3.3028998, -3.6027, 13.3786, 3.3913999, -6.6893, 16.7232, 3.3913999, -6.6893, 10.033899, 3.3913999, -6.6893, 13.1206, 3.3028998, -3.3446, 10.033899, 3.3913999, -3.3446, 13.1206, 3.3028998, -3.3446, 10.033899, 3.3913999, -6.6893, 13.3786, 3.3913999, -6.6893, 13.1206, 3.3028998, -3.3446, 13.3786, 3.3913999, -6.6893, 13.3786, 3.3028998, -3.6027, 20.0679, 0, 0, 14.0489, 3.0042, -3.3446, 20.961199, 0, -3.3446, 20.0679, 0, 3.3446, 14.0489, 3.0042, -3.3446, 20.0679, 0, 0, 14.0489, 3.0042, -3.3446, 13.3786, 3.3913999, 0, 13.3786, 3.3028998, -3.0865998, 14.0489, 3.0042, -3.3446, 13.3786, 3.2744, 6.496, 13.3786, 3.3913999, 0, 14.0489, 3.0042, -3.3446, 20.0679, 0, 3.3446, 13.3786, 3.2744, 6.496, 13.3786, 3.3913999, 0, 13.3786, 3.2744, 6.496, 13.3786, 3.3913999, 3.3446, 13.3786, 3.2744, 6.496, 20.0679, 0, 3.3446, 16.7232, 1.5715, 6.6893, 16.7232, 1.5715, 6.6893, 20.0679, 0, 3.3446, 20.0679, -0.124199994, 6.6893, 13.3786, 3.2744, 6.496, 16.7232, 1.5715, 6.6893, 13.5511, 3.1797, 6.6893, 10.033899, 3.3913999, -3.3446, 13.3786, 3.3913999, 0, 10.033899, 3.3913999, 0, 13.3786, 3.3913999, 0, 10.033899, 3.3913999, -3.3446, 13.1206, 3.3028998, -3.3446, 13.3786, 3.3913999, 0, 13.1206, 3.3028998, -3.3446, 13.3786, 3.3028998, -3.0865998, 19.831999, 3.3902998, -10.0008, 20.147, 3.0588999, -6.6893, 19.8322, 3.2891998, -6.6893, 19.831999, 3.3902998, -10.0008, 20.1796, 3.182, -9.995999, 20.147, 3.0588999, -6.6893, 19.8322, 3.2891998, -6.6893, 20.1349, 2.7974, -3.3783998, 19.8322, 3.0491, -3.602, 19.8322, 3.2891998, -6.6893, 20.147, 3.0588999, -6.6893, 20.1349, 2.7974, -3.3783998, 16.7232, 3.1513, -3.602, 19.8322, 3.2891998, -6.6893, 19.8322, 3.0491, -3.602, 16.7232, 3.1513, -3.602, 16.7232, 3.3913999, -6.6893, 19.8322, 3.2891998, -6.6893, 16.7232, 3.3913999, -10.033899, 19.8322, 3.2891998, -6.6893, 16.7232, 3.3913999, -6.6893, 19.8322, 3.2891998, -6.6893, 16.7232, 3.3913999, -10.033899, 19.798899, 3.3913999, -10.033899, 19.8322, 3.2891998, -6.6893, 19.798899, 3.3913999, -10.033899, 19.831999, 3.3902998, -10.0008, 20.198, 3.1490998, -10.033899, 19.831999, 3.3902998, -10.0008, 19.798899, 3.3913999, -10.033899, 20.198, 3.1490998, -10.033899, 20.1796, 3.182, -9.995999, 19.831999, 3.3902998, -10.0008, 20.144999, 2.7605999, -3.3446, 19.8322, 3.0491, -3.602, 20.1349, 2.7974, -3.3783998, 19.8322, 3.0491, -3.602, 20.144999, 2.7605999, -3.3446, 16.7127, 2.8734, -3.3446, 19.8322, 3.0491, -3.602, 16.7127, 2.8734, -3.3446, 16.7232, 3.1513, -3.602, 15.0508995, 0, 6.6893, 16.7232, 1.5715, 6.6893, 16.7232, 0, 6.6893, 16.7232, 0, 6.6893, 16.7232, 1.5715, 6.6893, 20.0679, -0.124199994, 6.6893, 15.0508995, 0, 6.6893, 13.5511, 3.1797, 6.6893, 16.7232, 1.5715, 6.6893, 15.0508995, 0, 6.6893, 13.4036, 3.0749998, 6.6893, 13.5511, 3.1797, 6.6893, 13.4036, 3.0749998, 6.6893, 15.0508995, 0, 6.6893, 13.8046, 0, 6.6893, -16.7232, 0.6137, 0, -15.7546, 0.6137, 3.5372, -16.7232, 0.6137, 2.9166, -15.7546, 0.6137, 3.5372, -16.7232, 0.6137, 0, -13.3786, 0.6137, 0, -16.7232, 0.6137, 0, -15.8036995, 0.6137, -2.7091, -13.3786, 0.6137, -3.3446, -16.7232, 0.6137, 0, -13.3786, 0.6137, -3.3446, -13.3786, 0.6137, 0, -13.3786, 0.6137, 0, -13.3786, 0.6137, -3.3446, -10.033899, 0.6137, -3.3446, -15.7546, 0.6137, 3.5372, -13.3786, 0.6137, 0, -14.4892, 0.6137, 4.2778, -13.3786, 0.6137, 0, -10.033899, 0.6137, -3.3446, -10.033899, 0.6137, 0, -14.4892, 0.6137, 4.2778, -13.3786, 0.6137, 0, -10.033899, 0.6137, 0, -10.033899, 0.6137, 0, -10.033899, 0.6137, -3.3446, -6.6893, 0.6137, -3.3446, -10.033899, 0.6137, 0, -6.6893, 0.6137, -3.3446, -6.6893, 0.6137, 0, -6.6893, 0.6137, 0, -6.6893, 0.6137, -3.3446, -4.0257998, 0.6137, -1.6911999, -6.6893, 0.6137, 0, -4.0257998, 0.6137, -1.6911999, -3.3446, 0.6137, 0, -10.033899, 0.6137, 3.3446, -10.033899, 0.6137, 0, -6.6893, 0.6137, 0, -14.4892, 0.6137, 4.2778, -10.033899, 0.6137, 0, -10.033899, 0.6137, 3.3446, -6.6893, 0.6137, 3.3446, -6.6893, 0.6137, 0, -3.3446, 0.6137, 0, -10.033899, 0.6137, 3.3446, -6.6893, 0.6137, 0, -6.6893, 0.6137, 3.3446, -6.6893, 0.6137, 3.3446, -3.3446, 0.6137, 0, -3.3446, 0.6137, 3.3446, -10.033899, 0.6137, 6.6893, -14.4892, 0.6137, 4.2778, -10.033899, 0.6137, 3.3446, -10.033899, 0.6137, 6.6893, -10.033899, 0.6137, 3.3446, -6.6893, 0.6137, 3.3446, -10.033899, 0.6137, 6.6893, -6.6893, 0.6137, 3.3446, -6.6893, 0.6137, 6.6893, -10.033899, 0.6137, 6.6893, -13.677099, 0.6137, 5.2616, -14.4892, 0.6137, 4.2778, -13.677099, 0.6137, 5.2616, -10.033899, 0.6137, 6.6893, -12.747499, 0.6137, 6.3671, -6.6893, 0.6137, 3.3446, -2.5674999, 0.0266, 7.6215, -6.6893, 0.6137, 6.6893, -2.5674999, 0.0266, 7.6215, -6.6893, 0.6137, 3.3446, -3.3446, 0.6137, 3.3446, -2.5674999, 0.0266, 7.6215, -3.3446, 0.6137, 3.3446, -2.1193, 0.6137, 5.2736998, -16.7232, 3.0033998, 2.9166, -15.7546, 0.6137, 3.5372, -15.372, 3.0033998, 3.6132998, -16.7232, 3.0033998, 2.9166, -16.7232, 0.6137, 2.9166, -15.7546, 0.6137, 3.5372, -14.4892, 3.0033998, 4.2778, -13.677099, 0.6137, 5.2616, -13.6942, 3.0033998, 5.1798, -14.4892, 3.0033998, 4.2778, -14.4892, 0.6137, 4.2778, -13.677099, 0.6137, 5.2616, -15.8036995, 3.0033998, -2.7091, -16.7232, 0.6137, 0, -16.7232, 3.0033998, 0, -15.8036995, 3.0033998, -2.7091, -15.8036995, 0.6137, -2.7091, -16.7232, 0.6137, 0, -16.7232, 3.0033998, 0, -16.7232, 0.6137, 2.9166, -16.7232, 3.0033998, 2.9166, -16.7232, 3.0033998, 0, -16.7232, 0.6137, 0, -16.7232, 0.6137, 2.9166, -3.3446, 3.0033998, 0, -4.0257998, 0.6137, -1.6911999, -4.0257998, 3.0033998, -1.6911999, -3.3446, 3.0033998, 0, -3.3446, 0.6137, 0, -4.0257998, 0.6137, -1.6911999, -3.3446, 3.0033998, 3.3446, -3.3446, 0.6137, 0, -3.3446, 3.0033998, 0, -3.3446, 3.0033998, 3.3446, -3.3446, 0.6137, 3.3446, -3.3446, 0.6137, 0, -12.747499, 3.0033998, 6.3671, -10.033899, 0.6137, 6.6893, -10.033899, 3.0033998, 6.6893, -12.747499, 3.0033998, 6.3671, -12.747499, 0.6137, 6.3671, -10.033899, 0.6137, 6.6893, -10.033899, 3.0033998, -3.3446, -13.3786, 0.6137, -3.3446, -13.3786, 3.0033998, -3.3446, -10.033899, 3.0033998, -3.3446, -10.033899, 0.6137, -3.3446, -13.3786, 0.6137, -3.3446, -6.6893, 3.0033998, -3.3446, -10.033899, 0.6137, -3.3446, -10.033899, 3.0033998, -3.3446, -6.6893, 3.0033998, -3.3446, -6.6893, 0.6137, -3.3446, -10.033899, 0.6137, -3.3446, -13.3786, 3.0033998, -3.3446, -15.8036995, 0.6137, -2.7091, -15.8036995, 3.0033998, -2.7091, -13.3786, 3.0033998, -3.3446, -13.3786, 0.6137, -3.3446, -15.8036995, 0.6137, -2.7091, -4.0257998, 3.0033998, -1.6911999, -6.6893, 0.6137, -3.3446, -6.6893, 3.0033998, -3.3446, -4.0257998, 3.0033998, -1.6911999, -4.0257998, 0.6137, -1.6911999, -6.6893, 0.6137, -3.3446, -6.6893, 3.0033998, 6.6893, -2.5674999, 0.0266, 7.6215, -2.5674999, 2.4164, 7.6215, -6.6893, 3.0033998, 6.6893, -6.6893, 0.6137, 6.6893, -2.5674999, 0.0266, 7.6215, -10.033899, 3.0033998, 6.6893, -6.6893, 0.6137, 6.6893, -6.6893, 3.0033998, 6.6893, -10.033899, 3.0033998, 6.6893, -10.033899, 0.6137, 6.6893, -6.6893, 0.6137, 6.6893, -2.5674999, 2.4164, 7.6215, -2.1193, 0.6137, 5.2736998, -2.1397, 3.0033998, 5.1795, -2.5674999, 2.4164, 7.6215, -2.5674999, 0.0266, 7.6215, -2.1193, 0.6137, 5.2736998, -2.1193, 0.6137, 5.2736998, -3.3446, 3.0033998, 3.3446, -2.1397, 3.0033998, 5.1795, -2.1193, 0.6137, 5.2736998, -3.3446, 0.6137, 3.3446, -3.3446, 3.0033998, 3.3446, -13.677099, 0.6137, 5.2616, -12.747499, 3.0033998, 6.3671, -13.6942, 3.0033998, 5.1798, -13.677099, 0.6137, 5.2616, -12.747499, 0.6137, 6.3671, -12.747499, 3.0033998, 6.3671, -15.7546, 0.6137, 3.5372, -14.4892, 3.0033998, 4.2778, -15.372, 3.0033998, 3.6132998, -15.7546, 0.6137, 3.5372, -14.4892, 0.6137, 4.2778, -14.4892, 3.0033998, 4.2778, 21.1831, 0, -13.6544, 16.8204, 3.138, -13.447599, 18.0241, 0, -14.3019, 21.1831, 0, -13.6544, 20.1539, 3.1299, -13.399799, 16.8204, 3.138, -13.447599, 21.8888, 0, -10.033899, 20.1539, 3.1299, -13.399799, 21.1831, 0, -13.6544, 21.8888, 0, -10.033899, 20.198, 3.1490998, -10.033899, 20.1539, 3.1299, -13.399799, 17.2285, 0, -16.8036, 12.7471, 3.1766999, -16.1988, 13.7014, 0, -17.416399, 17.2285, 0, -16.8036, 16.756899, 3.1650999, -16.7286, 12.7471, 3.1766999, -16.1988, 16.8204, 3.138, -13.447599, 17.2285, 0, -16.8036, 18.0241, 0, -14.3019, 17.2285, 0, -16.8036, 16.8204, 3.138, -13.447599, 16.8051, 3.1778, -13.479, 17.2285, 0, -16.8036, 16.8051, 3.1778, -13.479, 16.756899, 3.1650999, -16.7286, 12.7471, 3.1766999, -16.1988, 13.3786, 0, -20.5992, 13.7014, 0, -17.416399, 13.3786, 0, -20.5992, 12.7471, 3.1766999, -16.1988, 12.747, 3.1771, -16.1991, 13.3786, 0, -20.5992, 12.747, 3.1771, -16.1991, 12.723599, 2.9213, -19.2902, 13.3786, 0, -20.5992, 10.033899, 3.0523999, -19.0294, 10.033899, 0, -20.467, 13.3786, 0, -20.5992, 12.723599, 2.9213, -19.2902, 10.033899, 3.0523999, -19.0294, 10.033899, 0, -20.467, 6.6893, 3.0440998, -19.036999, 6.6893, 0, -20.1318, 10.033899, 0, -20.467, 10.033899, 3.0523999, -19.0294, 6.6893, 3.0440998, -19.036999, 3.0140998, 0, -16.7232, 4.4131, 3.2091, -13.357699, 3.3446, -0.3989, -12.9443, 3.0140998, 0, -16.7232, 3.5895, 3.2033, -16.7232, 4.4131, 3.2091, -13.357699, 6.6893, 3.0440998, -19.036999, 3.3446, 0, -20.5992, 6.6893, 0, -20.1318, 3.3446, 0, -20.5992, 6.6893, 3.0440998, -19.036999, 6.6640997, 3.0702, -19.018099, 3.3446, 0, -20.5992, 6.6640997, 3.0702, -19.018099, 4.4783998, 3.1067, -18.2665, 3.3446, 0, -20.5992, 3.5895, 3.2033, -16.7232, 3.0140998, 0, -16.7232, 3.3446, 0, -20.5992, 4.4783998, 3.1067, -18.2665, 3.5895, 3.2033, -16.7232, 2.8241, 0, -10.4594, 0, 3.179, -9.0652, 0, 0, -10.7654, 2.8241, 0, -10.4594, 3.7529, 3.1712, -9.0494995, 0, 3.179, -9.0652, 3.3446, -0.3989, -12.9443, 3.7529, 3.1712, -9.0494995, 2.8241, 0, -10.4594, 3.3446, -0.3989, -12.9443, 4.4131, 3.2091, -13.357699, 3.7529, 3.1712, -9.0494995, 4.4131, 3.2091, -13.357699, 3.3446, -0.3989, -12.9443, 4.4131, 3.2091, -13.357699, -2.6297, 0, -10.5745, -3.6538, 3.1585999, -12.813399, -3.3446, 0, -13.3786, -2.6297, 0, -10.5745, -3.6076, 3.1676, -10.0696, -3.6538, 3.1585999, -12.813399, -3.3446, 0, -13.3786, -6.6893, 3.175, -12.867, -6.6893, 0, -14.2637, -3.3446, 0, -13.3786, -3.6538, 3.1585999, -12.813399, -6.6893, 3.175, -12.867, 0, 3.179, -9.0652, -2.6297, 0, -10.5745, 0, 0, -10.7654, -2.6297, 0, -10.5745, 0, 3.179, -9.0652, -0.0081, 3.1864998, -9.063499, -2.6297, 0, -10.5745, -0.0081, 3.1864998, -9.063499, -3.6076, 3.1676, -10.0696, -6.6893, 0, -14.2637, -10.4043, 3.1608999, -13.4295, -9.6168995, 0, -14.127899, -6.6893, 0, -14.2637, -6.6893, 3.175, -12.867, -10.4043, 3.1608999, -13.4295, -6.6893, 3.175, -12.867, -6.6893, 0, -14.2637, -6.6893, 3.175, -12.867, -9.6168995, 0, -14.127899, -10.4319, 3.1557999, -16.1556, -10.033899, 0, -16.7232, -9.6168995, 0, -14.127899, -10.4043, 3.1608999, -13.4295, -10.4319, 3.1557999, -16.1556, -10.033899, 0, -16.7232, -13.3786, 3.1771998, -15.7625, -13.3786, 0, -17.3364, -10.033899, 0, -16.7232, -10.4319, 3.1557999, -16.1556, -13.3786, 3.1771998, -15.7625, -16.7232, 0, -16.7232, -16.3753, 3.4225, -13.6277, -16.7232, 0, -13.3786, -16.7232, 0, -16.7232, -16.0243, 3.3509998, -15.752, -16.3753, 3.4225, -13.6277, -13.3786, 3.1771998, -15.7625, -16.7232, 0, -16.7232, -13.3786, 0, -17.3364, -16.7232, 0, -16.7232, -13.3786, 3.1771998, -15.7625, -13.3911, 3.1892, -15.757, -16.7232, 0, -16.7232, -13.3911, 3.1892, -15.757, -16.0243, 3.3509998, -15.752, -17.275, 0, -10.5169, -19.6237, 3.1655998, -9.757899, -20.0679, 0, -10.033899, -17.275, 0, -10.5169, -16.4131, 3.1706, -9.788899, -19.6237, 3.1655998, -9.757899, -16.7232, 0, -13.3786, -16.4131, 3.1706, -9.788899, -17.275, 0, -10.5169, -16.7232, 0, -13.3786, -16.3753, 3.4225, -13.6277, -16.4131, 3.1706, -9.788899, -16.3753, 3.4225, -13.6277, -16.7232, 0, -13.3786, -16.3753, 3.4225, -13.6277, -20.3764, 0, -6.6893, -19.9489, 3.2063, -2.8082, -20.0679, -0.3484, -3.5669, -20.3764, 0, -6.6893, -19.515, 3.2122, -6.6893, -19.9489, 3.2063, -2.8082, -19.6237, 3.1655998, -9.757899, -20.3764, 0, -6.6893, -20.0679, 0, -10.033899, -20.3764, 0, -6.6893, -19.6237, 3.1655998, -9.757899, -19.6161, 3.2075999, -9.7116995, -20.3764, 0, -6.6893, -19.6161, 3.2075999, -9.7116995, -19.515, 3.2122, -6.6893, -23.412498, -0.2913, 0.26119998, -23.0809, 3.3083, 3.3615, -23.412498, 0, 3.3446, -23.412498, -0.2913, 0.26119998, -23.3676, 3.4459999, 0.1372, -23.0809, 3.3083, 3.3615, -23.412498, 0, -3.3446, -23.3676, 3.4459999, 0.1372, -23.412498, -0.2913, 0.26119998, -23.412498, 0, -3.3446, -23.390299, 3.3349998, -2.6938999, -23.3676, 3.4459999, 0.1372, -20.0679, -0.3484, -3.5669, -23.390299, 3.3349998, -2.6938999, -23.412498, 0, -3.3446, -20.0679, -0.3484, -3.5669, -19.9489, 3.2063, -2.8082, -23.390299, 3.3349998, -2.6938999, -19.9489, 3.2063, -2.8082, -20.0679, -0.3484, -3.5669, -19.9489, 3.2063, -2.8082, -23.0809, 3.3083, 3.3615, -23.8078, 0, 6.6893, -23.412498, 0, 3.3446, -23.8078, 0, 6.6893, -23.0809, 3.3083, 3.3615, -23.0777, 3.3197, 3.3734, -23.8078, 0, 6.6893, -23.0777, 3.3197, 3.3734, -22.563799, 3.2219, 6.6893, -23.8078, 0, 6.6893, -22.791399, 3.2124999, 9.4432, -23.412498, 0, 10.033899, -23.8078, 0, 6.6893, -22.563799, 3.2219, 6.6893, -22.791399, 3.2124999, 9.4432, -23.412498, 0, 10.033899, -20.0679, 3.1943, 9.407499, -20.0679, 0, 10.033899, -23.412498, 0, 10.033899, -22.791399, 3.2124999, 9.4432, -20.0679, 3.1943, 9.407499, -22.791399, 3.2124999, 9.4432, -23.412498, 0, 10.033899, -22.791399, 3.2124999, 9.4432, -20.0679, 0, 10.033899, -16.2818, 3.1913998, 9.8056, -16.7232, 0, 10.033899, -20.0679, 0, 10.033899, -20.0679, 3.1943, 9.407499, -16.2818, 3.1913998, 9.8056, -16.7232, 0, 13.3786, -13.3786, 3.194, 12.8089, -13.3786, 0, 13.3786, -16.7232, 0, 13.3786, -16.076399, 3.04, 12.735, -13.3786, 3.194, 12.8089, -16.7232, 0, 10.033899, -16.076399, 3.04, 12.735, -16.7232, 0, 13.3786, -16.7232, 0, 10.033899, -16.2818, 3.1913998, 9.8056, -16.076399, 3.04, 12.735, -16.2818, 3.1913998, 9.8056, -16.7232, 0, 10.033899, -16.2818, 3.1913998, 9.8056, -13.3786, 0, 13.3786, -10.033899, 2.9384, 12.4537, -10.033899, 0, 13.3786, -13.3786, 0, 13.3786, -13.3786, 3.194, 12.8089, -10.033899, 2.9384, 12.4537, -13.3786, 3.194, 12.8089, -13.3786, 0, 13.3786, -13.3786, 3.194, 12.8089, -10.033899, 0, 13.3786, -6.2748, 3.126, 13.122, -6.6893, 0, 13.3786, -10.033899, 0, 13.3786, -10.033899, 2.9384, 12.4537, -6.2748, 3.126, 13.122, -6.6893, 0, 13.3786, -6.2748, 3.1260998, 16.4145, -6.6893, 0, 16.7232, -6.6893, 0, 13.3786, -6.2748, 3.126, 13.122, -6.2748, 3.1260998, 16.4145, -3.3446, 0, 16.7232, 0, 2.9636998, 16.0179, 0, 0, 16.7232, -3.3446, 0, 16.7232, -3.3446, 3.1497998, 15.914599, 0, 2.9636998, 16.0179, 0, 0, 16.7232, 3.6425998, 3.1413999, 16.5127, 3.3446, 0, 16.7232, 0, 0, 16.7232, 0, 2.9636998, 16.0179, 3.6425998, 3.1413999, 16.5127, -6.2748, 3.1260998, 16.4145, -3.3446, 0, 16.7232, -6.6893, 0, 16.7232, -3.3446, 0, 16.7232, -6.2748, 3.1260998, 16.4145, -6.2558, 3.1427999, 16.4098, -3.3446, 0, 16.7232, -6.2558, 3.1427999, 16.4098, -3.3446, 3.1497998, 15.914599, 3.3446, 0, 20.0679, 6.6893, 3.2050998, 19.228699, 6.6893, 0, 20.0679, 3.3446, 0, 20.0679, 3.9266999, 3.5967, 19.6223, 6.6893, 3.2050998, 19.228699, 3.6425998, 3.1413999, 16.5127, 3.3446, 0, 20.0679, 3.3446, 0, 16.7232, 3.3446, 0, 20.0679, 3.6425998, 3.1413999, 16.5127, 3.6536, 3.2078998, 16.5669, 3.3446, 0, 20.0679, 3.6536, 3.2078998, 16.5669, 3.9266999, 3.5967, 19.6223, 6.6893, 3.2050998, 19.228699, 10.572599, 0, 20.0679, 6.6893, 0, 20.0679, 10.572599, 0, 20.0679, 6.6893, 3.2050998, 19.228699, 6.6991997, 3.2148, 19.2255, 10.572599, 0, 20.0679, 6.6991997, 3.2148, 19.2255, 9.3066, 3.2186, 19.0653, 10.572599, 0, 20.0679, 10.5913, 3.1985998, 16.7232, 10.572599, 0, 16.7232, 10.572599, 0, 20.0679, 9.3066, 3.2186, 19.0653, 10.5913, 3.1985998, 16.7232, 10.5913, 3.1985998, 16.7232, 10.572599, 0, 13.918799, 10.572599, 0, 16.7232, 10.572599, 0, 13.918799, 10.5913, 3.1985998, 16.7232, 10.5893, 3.2117, 16.7106, 10.572599, 0, 13.918799, 10.5893, 3.2117, 16.7106, 10.0546, 3.1885, 13.4071, 10.572599, 0, 13.918799, 13.2631, 3.5611, 13.4043, 13.8046, 0, 13.918799, 10.572599, 0, 13.918799, 10.0546, 3.1885, 13.4071, 13.2631, 3.5611, 13.4043, 13.8046, 0, 13.918799, 12.9758, 3.2036, 10.033899, 13.8046, 0, 10.033899, 13.8046, 0, 13.918799, 13.2631, 3.5611, 13.4043, 12.9758, 3.2036, 10.033899, 13.8046, 0, 13.918799, 13.2631, 3.5611, 13.4043, 13.2631, 3.5611, 13.4043, 13.8046, 0, 10.033899, 13.4036, 3.0749998, 6.6893, 13.8046, 0, 6.6893, 13.8046, 0, 10.033899, 12.9758, 3.2036, 10.033899, 13.4036, 3.0749998, 6.6893, 20.961199, 0, -3.3446, 16.7127, 2.8734, -3.3446, 20.144999, 2.7605999, -3.3446, 20.961199, 0, -3.3446, 14.0489, 3.0042, -3.3446, 16.7127, 2.8734, -3.3446, 20.144999, 2.7605999, -3.3446, 21.2349, 0, -6.6893, 20.961199, 0, -3.3446, 21.2349, 0, -6.6893, 20.144999, 2.7605999, -3.3446, 20.1349, 2.7974, -3.3783998, 21.2349, 0, -6.6893, 20.1349, 2.7974, -3.3783998, 20.147, 3.0588999, -6.6893, 20.147, 3.0588999, -6.6893, 21.8888, 0, -10.033899, 21.2349, 0, -6.6893, 21.8888, 0, -10.033899, 20.147, 3.0588999, -6.6893, 20.1796, 3.182, -9.995999, 21.8888, 0, -10.033899, 20.1796, 3.182, -9.995999, 20.198, 3.1490998, -10.033899, 23.412498, 0, -26.7572, 26.7572, -0.2593, -23.412498, 23.412498, 0, -23.412498, 26.7572, -0.2593, -23.412498, 23.412498, 0, -26.7572, 26.7572, -0.2593, -25.084799, 26.7572, -0.2593, -25.084799, 23.412498, 0, -26.7572, 26.7572, -0.2593, -26.7572, 26.7572, -0.2593, -21.7402, 23.412498, 0, -23.412498, 26.7572, -0.2593, -23.412498, 26.7572, -0.2593, -20.0679, 23.412498, 0, -23.412498, 26.7572, -0.2593, -21.7402, 23.412498, 0, -23.412498, 26.7572, -0.2593, -20.0679, 23.412498, 0, -20.0679, 26.7572, -0.2593, -18.3955, 23.412498, 0, -20.0679, 26.7572, -0.2593, -20.0679, 26.7572, -0.2593, -16.7232, 23.412498, 0, -20.0679, 26.7572, -0.2593, -18.3955, 23.412498, 0, -20.0679, 26.7572, -0.2593, -16.7232, 23.412498, 0, -16.7232, 26.7572, -0.2593, -15.0508995, 23.412498, 0, -16.7232, 26.7572, -0.2593, -16.7232, 26.7572, -0.2593, -13.3786, 23.412498, 0, -16.7232, 26.7572, -0.2593, -15.0508995, 23.412498, 0, -16.7232, 26.7572, -0.2593, -13.3786, 23.412498, 0, -13.3786, 26.7572, -0.2593, -11.7063, 23.412498, 0, -13.3786, 26.7572, -0.2593, -13.3786, 26.7572, -0.2593, -10.033899, 23.412498, 0, -13.3786, 26.7572, -0.2593, -11.7063, 23.412498, 0, -13.3786, 26.7572, -0.2593, -10.033899, 23.412498, 0, -10.033899, 26.7572, -0.2593, -8.3616, 23.412498, 0, -10.033899, 26.7572, -0.2593, -10.033899, 26.7572, -0.2593, -6.6893, 23.412498, 0, -10.033899, 26.7572, -0.2593, -8.3616, 23.412498, 0, -10.033899, 26.7572, -0.2593, -6.6893, 23.412498, 0, -6.6893, 26.7572, -0.2593, -5.0169997, 23.412498, 0, -6.6893, 26.7572, -0.2593, -6.6893, 26.7572, -0.2593, -3.3446, 23.412498, 0, -6.6893, 26.7572, -0.2593, -5.0169997, 23.412498, 0, -6.6893, 26.7572, -0.2593, -3.3446, 23.412498, 0, -3.3446, 26.7572, -0.2593, -1.6723, 23.412498, 0, -3.3446, 26.7572, -0.2593, -3.3446, 26.7572, -0.2593, 0, 23.412498, 0, -3.3446, 26.7572, -0.2593, -1.6723, 23.412498, 0, -3.3446, 26.7572, -0.2593, 0, 23.412498, 0, 0, 26.7572, -0.2593, 1.6723, 23.412498, 0, 0, 26.7572, -0.2593, 0, 26.7572, -0.2593, 3.3446, 23.412498, 0, 0, 26.7572, -0.2593, 1.6723, 23.412498, 0, 0, 26.7572, -0.2593, 3.3446, 23.412498, 0, 3.3446, 26.7572, -0.2593, 5.0169997, 23.412498, 0, 3.3446, 26.7572, -0.2593, 3.3446, 26.7572, -0.2593, 6.6893, 23.412498, 0, 3.3446, 26.7572, -0.2593, 5.0169997, 23.412498, 0, 3.3446, 26.7572, -0.2593, 6.6893, 23.412498, 0, 6.6893, 26.7572, -0.2593, 8.3616, 23.412498, 0, 6.6893, 26.7572, -0.2593, 6.6893, 26.7572, -0.2593, 10.033899, 23.412498, 0, 6.6893, 26.7572, -0.2593, 8.3616, 23.412498, 0, 6.6893, 26.7572, -0.2593, 10.033899, 23.412498, 0, 10.033899, 26.7572, -0.2593, 11.7063, 23.412498, 0, 10.033899, 26.7572, -0.2593, 10.033899, 26.7572, -0.2593, 13.3786, 23.412498, 0, 10.033899, 26.7572, -0.2593, 11.7063, 23.412498, 0, 10.033899, 26.7572, -0.2593, 13.3786, 23.412498, 0, 13.3786, 26.7572, -0.2593, 15.0508995, 23.412498, 0, 13.3786, 26.7572, -0.2593, 13.3786, 26.7572, -0.2593, 16.7232, 23.412498, 0, 13.3786, 26.7572, -0.2593, 15.0508995, 23.412498, 0, 13.3786, 26.7572, -0.2593, 16.7232, 23.412498, 0, 16.7232, 26.7572, -0.2593, 18.3955, 23.412498, 0, 16.7232, 26.7572, -0.2593, 16.7232, 26.7572, -0.2593, 20.0679, 23.412498, 0, 16.7232, 26.7572, -0.2593, 18.3955, 23.412498, 0, 16.7232, 26.7572, -0.2593, 20.0679, 23.412498, 0, 20.0679, 26.7572, -0.2593, 21.7402, 23.412498, 0, 20.0679, 26.7572, -0.2593, 20.0679, 26.7572, -0.2593, 23.412498, 23.412498, 0, 20.0679, 26.7572, -0.2593, 21.7402, 23.412498, 0, 20.0679, 26.7572, -0.2593, 23.412498, 23.412498, 0, 23.412498, 26.7572, -0.2593, 25.084799, 23.412498, 0, 23.412498, 26.7572, -0.2593, 23.412498, 26.7572, -0.2593, 26.7572, 23.412498, 0, 23.412498, 26.7572, -0.2593, 25.084799, 23.412498, 0, 23.412498, 26.7572, -0.2593, 26.7572, 23.412498, 0, 26.7572, -3.3446, 0, -23.412498, 0, 0, -26.7572, 0, 0, -23.412498, 0, 0, -23.412498, 0, 0, -26.7572, 3.3446, 0, -26.7572, -3.3446, 0, -23.412498, -3.3446, 0, -26.7572, 0, 0, -26.7572, 0, 0, -23.412498, 3.3446, 0, -26.7572, 3.3446, 0, -23.412498, 3.3446, 0, -23.412498, 3.3446, 0, -26.7572, 6.6893, 0, -26.7572, -3.3446, 0, -20.0679, -3.3446, 0, -23.412498, 0, 0, -23.412498, 3.3446, 0, -23.412498, 6.6893, 0, -26.7572, 6.6893, 0, -23.412498, 6.6893, 0, -23.412498, 6.6893, 0, -26.7572, 10.033899, 0, -26.7572, 0, 0, -20.0679, 0, 0, -23.412498, 3.3446, 0, -23.412498, -3.3446, 0, -20.0679, 0, 0, -23.412498, 0, 0, -20.0679, 3.3446, 0, -20.5992, 3.3446, 0, -23.412498, 6.6893, 0, -23.412498, 0, 0, -20.0679, 3.3446, 0, -23.412498, 3.3446, 0, -20.5992, 3.3446, 0, -20.5992, 6.6893, 0, -23.412498, 6.6893, 0, -20.1318, 6.6893, 0, -23.412498, 10.033899, 0, -26.7572, 10.033899, 0, -23.412498, 6.6893, 0, -20.1318, 6.6893, 0, -23.412498, 10.033899, 0, -23.412498, 10.033899, 0, -23.412498, 10.033899, 0, -26.7572, 13.3786, 0, -26.7572, 6.6893, 0, -20.1318, 10.033899, 0, -23.412498, 10.033899, 0, -20.467, 10.033899, 0, -23.412498, 13.3786, 0, -26.7572, 13.3786, 0, -23.412498, 10.033899, 0, -20.467, 10.033899, 0, -23.412498, 13.3786, 0, -23.412498, 13.3786, 0, -23.412498, 13.3786, 0, -26.7572, 16.7232, 0, -26.7572, 10.033899, 0, -20.467, 13.3786, 0, -23.412498, 13.3786, 0, -20.5992, 13.3786, 0, -23.412498, 16.7232, 0, -26.7572, 16.7232, 0, -23.412498, 13.3786, 0, -20.5992, 13.3786, 0, -23.412498, 16.7232, 0, -23.412498, 16.7232, 0, -23.412498, 16.7232, 0, -26.7572, 20.0679, 0, -26.7572, 13.3786, 0, -20.5992, 16.7232, 0, -23.412498, 16.7232, 0, -20.0679, 13.7014, 0, -17.416399, 13.3786, 0, -20.5992, 16.7232, 0, -20.0679, 13.7014, 0, -17.416399, 16.7232, 0, -20.0679, 17.2285, 0, -16.8036, 16.7232, 0, -23.412498, 20.0679, 0, -26.7572, 20.0679, 0, -23.412498, 16.7232, 0, -20.0679, 16.7232, 0, -23.412498, 20.0679, 0, -23.412498, 20.0679, 0, -23.412498, 20.0679, 0, -26.7572, 23.412498, 0, -26.7572, 20.0679, 0, -23.412498, 23.412498, 0, -26.7572, 23.412498, 0, -23.412498, 16.7232, 0, -20.0679, 20.0679, 0, -23.412498, 20.0679, 0, -20.0679, 20.0679, 0, -20.0679, 20.0679, 0, -23.412498, 23.412498, 0, -23.412498, 17.2285, 0, -16.8036, 16.7232, 0, -20.0679, 20.0679, 0, -20.0679, 20.0679, 0, -20.0679, 23.412498, 0, -23.412498, 23.412498, 0, -20.0679, 17.2285, 0, -16.8036, 20.0679, 0, -20.0679, 20.0679, 0, -16.7232, 20.0679, 0, -16.7232, 20.0679, 0, -20.0679, 23.412498, 0, -20.0679, 18.0241, 0, -14.3019, 17.2285, 0, -16.8036, 20.0679, 0, -16.7232, 20.0679, 0, -16.7232, 23.412498, 0, -20.0679, 23.412498, 0, -16.7232, 18.0241, 0, -14.3019, 20.0679, 0, -16.7232, 21.1831, 0, -13.6544, 21.1831, 0, -13.6544, 20.0679, 0, -16.7232, 23.412498, 0, -16.7232, 21.1831, 0, -13.6544, 23.412498, 0, -16.7232, 23.412498, 0, -13.3786, 21.8888, 0, -10.033899, 21.1831, 0, -13.6544, 23.412498, 0, -13.3786, 21.8888, 0, -10.033899, 23.412498, 0, -13.3786, 23.412498, 0, -10.033899, 21.2349, 0, -6.6893, 21.8888, 0, -10.033899, 23.412498, 0, -10.033899, 21.2349, 0, -6.6893, 23.412498, 0, -10.033899, 23.412498, 0, -6.6893, 20.961199, 0, -3.3446, 21.2349, 0, -6.6893, 23.412498, 0, -6.6893, 20.961199, 0, -3.3446, 23.412498, 0, -6.6893, 23.412498, 0, -3.3446, 20.0679, 0, 0, 20.961199, 0, -3.3446, 23.412498, 0, -3.3446, 20.0679, 0, 0, 23.412498, 0, -3.3446, 23.412498, 0, 0, 20.0679, 0, 3.3446, 20.0679, 0, 0, 23.412498, 0, 0, 20.0679, 0, 3.3446, 23.412498, 0, 0, 23.412498, 0, 3.3446, 10.572599, 0, 16.7232, 13.8046, 0, 13.918799, 13.3786, 0, 16.7232, 10.572599, 0, 16.7232, 10.572599, 0, 13.918799, 13.8046, 0, 13.918799, 10.572599, 0, 20.0679, 10.572599, 0, 16.7232, 13.3786, 0, 16.7232, 13.3786, 0, 16.7232, 13.8046, 0, 13.918799, 15.0508995, 0, 13.3786, 10.572599, 0, 20.0679, 13.3786, 0, 16.7232, 13.3786, 0, 20.0679, 13.8046, 0, 13.918799, 15.0508995, 0, 10.033899, 15.0508995, 0, 13.3786, 13.8046, 0, 13.918799, 13.8046, 0, 10.033899, 15.0508995, 0, 10.033899, 13.8046, 0, 10.033899, 15.0508995, 0, 6.6893, 15.0508995, 0, 10.033899, 13.8046, 0, 10.033899, 13.8046, 0, 6.6893, 15.0508995, 0, 6.6893, 15.0508995, 0, 10.033899, 15.0508995, 0, 6.6893, 16.7232, 0, 6.6893, 15.0508995, 0, 10.033899, 16.7232, 0, 6.6893, 16.7232, 0, 10.033899, 15.0508995, 0, 13.3786, 15.0508995, 0, 10.033899, 16.7232, 0, 10.033899, 13.3786, 0, 16.7232, 15.0508995, 0, 13.3786, 15.0508995, 0, 16.7232, 13.3786, 0, 20.0679, 13.3786, 0, 16.7232, 15.0508995, 0, 16.7232, 15.0508995, 0, 13.3786, 16.7232, 0, 10.033899, 16.7232, 0, 13.3786, 15.0508995, 0, 16.7232, 15.0508995, 0, 13.3786, 16.7232, 0, 13.3786, 16.7232, 0, 13.3786, 16.7232, 0, 10.033899, 20.0679, 0, 10.033899, 16.7232, 0, 13.3786, 20.0679, 0, 10.033899, 20.0679, 0, 13.3786, 20.0679, 0, 13.3786, 20.0679, 0, 10.033899, 23.412498, 0, 10.033899, 20.0679, 0, 13.3786, 23.412498, 0, 10.033899, 23.412498, 0, 13.3786, 16.7232, 0, 16.7232, 16.7232, 0, 13.3786, 20.0679, 0, 13.3786, 15.0508995, 0, 16.7232, 16.7232, 0, 13.3786, 16.7232, 0, 16.7232, 20.0679, 0, 16.7232, 20.0679, 0, 13.3786, 23.412498, 0, 13.3786, 16.7232, 0, 16.7232, 20.0679, 0, 13.3786, 20.0679, 0, 16.7232, 20.0679, 0, 16.7232, 23.412498, 0, 13.3786, 23.412498, 0, 16.7232, 15.0508995, 0, 20.0679, 15.0508995, 0, 16.7232, 16.7232, 0, 16.7232, 13.3786, 0, 20.0679, 15.0508995, 0, 16.7232, 15.0508995, 0, 20.0679, 16.7232, 0, 20.0679, 16.7232, 0, 16.7232, 20.0679, 0, 16.7232, 15.0508995, 0, 20.0679, 16.7232, 0, 16.7232, 16.7232, 0, 20.0679, 20.0679, 0, 20.0679, 20.0679, 0, 16.7232, 23.412498, 0, 16.7232, 16.7232, 0, 20.0679, 20.0679, 0, 16.7232, 20.0679, 0, 20.0679, 20.0679, 0, 20.0679, 23.412498, 0, 16.7232, 23.412498, 0, 20.0679, 20.0679, 0, 23.412498, 20.0679, 0, 20.0679, 23.412498, 0, 20.0679, 20.0679, 0, 23.412498, 23.412498, 0, 20.0679, 23.412498, 0, 23.412498, 20.0679, 0, 26.7572, 20.0679, 0, 23.412498, 23.412498, 0, 23.412498, 20.0679, 0, 26.7572, 23.412498, 0, 23.412498, 23.412498, 0, 26.7572, 16.7232, 0, 26.7572, 20.0679, 0, 23.412498, 20.0679, 0, 26.7572, 16.7232, 0, 23.412498, 20.0679, 0, 20.0679, 20.0679, 0, 23.412498, 16.7232, 0, 26.7572, 16.7232, 0, 23.412498, 20.0679, 0, 23.412498, 16.7232, 0, 23.412498, 16.7232, 0, 20.0679, 20.0679, 0, 20.0679, 15.0508995, 0, 26.7572, 16.7232, 0, 23.412498, 16.7232, 0, 26.7572, 15.0508995, 0, 23.412498, 16.7232, 0, 20.0679, 16.7232, 0, 23.412498, 15.0508995, 0, 26.7572, 15.0508995, 0, 23.412498, 16.7232, 0, 23.412498, 15.0508995, 0, 23.412498, 15.0508995, 0, 20.0679, 16.7232, 0, 20.0679, 13.3786, 0, 26.7572, 15.0508995, 0, 23.412498, 15.0508995, 0, 26.7572, 13.3786, 0, 23.412498, 15.0508995, 0, 20.0679, 15.0508995, 0, 23.412498, 13.3786, 0, 26.7572, 13.3786, 0, 23.412498, 15.0508995, 0, 23.412498, 13.3786, 0, 23.412498, 13.3786, 0, 20.0679, 15.0508995, 0, 20.0679, 10.033899, 0, 26.7572, 13.3786, 0, 23.412498, 13.3786, 0, 26.7572, 10.033899, 0, 23.412498, 13.3786, 0, 20.0679, 13.3786, 0, 23.412498, 10.033899, 0, 26.7572, 10.033899, 0, 23.412498, 13.3786, 0, 23.412498, 10.033899, 0, 23.412498, 10.572599, 0, 20.0679, 13.3786, 0, 20.0679, 6.6893, 0, 26.7572, 10.033899, 0, 23.412498, 10.033899, 0, 26.7572, 6.6893, 0, 23.412498, 10.572599, 0, 20.0679, 10.033899, 0, 23.412498, 6.6893, 0, 26.7572, 6.6893, 0, 23.412498, 10.033899, 0, 23.412498, 6.6893, 0, 23.412498, 6.6893, 0, 20.0679, 10.572599, 0, 20.0679, 3.3446, 0, 26.7572, 6.6893, 0, 23.412498, 6.6893, 0, 26.7572, 3.3446, 0, 23.412498, 6.6893, 0, 20.0679, 6.6893, 0, 23.412498, 3.3446, 0, 26.7572, 3.3446, 0, 23.412498, 6.6893, 0, 23.412498, 3.3446, 0, 23.412498, 3.3446, 0, 20.0679, 6.6893, 0, 20.0679, 0, 0, 26.7572, 3.3446, 0, 23.412498, 3.3446, 0, 26.7572, 0, 0, 26.7572, 0, 0, 23.412498, 3.3446, 0, 23.412498, 0, 0, 23.412498, 3.3446, 0, 20.0679, 3.3446, 0, 23.412498, -3.3446, 0, 26.7572, 0, 0, 23.412498, 0, 0, 26.7572, 0, 0, 23.412498, 0, 0, 20.0679, 3.3446, 0, 20.0679, 0, 0, 20.0679, 3.3446, 0, 16.7232, 3.3446, 0, 20.0679, 0, 0, 20.0679, 0, 0, 16.7232, 3.3446, 0, 16.7232, -3.3446, 0, 26.7572, -3.3446, 0, 23.412498, 0, 0, 23.412498, -3.3446, 0, 23.412498, 0, 0, 20.0679, 0, 0, 23.412498, -6.6893, 0, 26.7572, -3.3446, 0, 23.412498, -3.3446, 0, 26.7572, -3.3446, 0, 20.0679, 0, 0, 16.7232, 0, 0, 20.0679, -3.3446, 0, 23.412498, -3.3446, 0, 20.0679, 0, 0, 20.0679, -3.3446, 0, 20.0679, -3.3446, 0, 16.7232, 0, 0, 16.7232, -6.6893, 0, 26.7572, -6.6893, 0, 23.412498, -3.3446, 0, 23.412498, -6.6893, 0, 23.412498, -3.3446, 0, 20.0679, -3.3446, 0, 23.412498, -10.033899, 0, 26.7572, -6.6893, 0, 23.412498, -6.6893, 0, 26.7572, -6.6893, 0, 20.0679, -3.3446, 0, 16.7232, -3.3446, 0, 20.0679, -6.6893, 0, 23.412498, -6.6893, 0, 20.0679, -3.3446, 0, 20.0679, -6.6893, 0, 20.0679, -6.6893, 0, 16.7232, -3.3446, 0, 16.7232, -10.033899, 0, 26.7572, -10.033899, 0, 23.412498, -6.6893, 0, 23.412498, -10.033899, 0, 23.412498, -6.6893, 0, 20.0679, -6.6893, 0, 23.412498, -13.3786, 0, 26.7572, -10.033899, 0, 23.412498, -10.033899, 0, 26.7572, -10.033899, 0, 20.0679, -6.6893, 0, 16.7232, -6.6893, 0, 20.0679, -10.033899, 0, 23.412498, -10.033899, 0, 20.0679, -6.6893, 0, 20.0679, -13.3786, 0, 26.7572, -13.3786, 0, 23.412498, -10.033899, 0, 23.412498, -13.3786, 0, 23.412498, -10.033899, 0, 20.0679, -10.033899, 0, 23.412498, -16.7232, 0, 26.7572, -13.3786, 0, 23.412498, -13.3786, 0, 26.7572, -10.033899, 0, 20.0679, -10.033899, 0, 16.7232, -6.6893, 0, 16.7232, -10.033899, 0, 16.7232, -6.6893, 0, 13.3786, -6.6893, 0, 16.7232, -10.033899, 0, 16.7232, -10.033899, 0, 13.3786, -6.6893, 0, 13.3786, -13.3786, 0, 20.0679, -10.033899, 0, 16.7232, -10.033899, 0, 20.0679, -13.3786, 0, 23.412498, -13.3786, 0, 20.0679, -10.033899, 0, 20.0679, -13.3786, 0, 16.7232, -10.033899, 0, 13.3786, -10.033899, 0, 16.7232, -13.3786, 0, 20.0679, -13.3786, 0, 16.7232, -10.033899, 0, 16.7232, -13.3786, 0, 16.7232, -13.3786, 0, 13.3786, -10.033899, 0, 13.3786, -16.7232, 0, 26.7572, -16.7232, 0, 23.412498, -13.3786, 0, 23.412498, -16.7232, 0, 23.412498, -13.3786, 0, 20.0679, -13.3786, 0, 23.412498, -20.0679, 0, 26.7572, -16.7232, 0, 23.412498, -16.7232, 0, 26.7572, -16.7232, 0, 20.0679, -13.3786, 0, 16.7232, -13.3786, 0, 20.0679, -16.7232, 0, 23.412498, -16.7232, 0, 20.0679, -13.3786, 0, 20.0679, -16.7232, 0, 16.7232, -13.3786, 0, 13.3786, -13.3786, 0, 16.7232, -16.7232, 0, 20.0679, -16.7232, 0, 16.7232, -13.3786, 0, 16.7232, -16.7232, 0, 16.7232, -16.7232, 0, 13.3786, -13.3786, 0, 13.3786, -20.0679, 0, 26.7572, -20.0679, 0, 23.412498, -16.7232, 0, 23.412498, -20.0679, 0, 23.412498, -16.7232, 0, 20.0679, -16.7232, 0, 23.412498, -23.412498, 0, 26.7572, -20.0679, 0, 23.412498, -20.0679, 0, 26.7572, -20.0679, 0, 20.0679, -16.7232, 0, 16.7232, -16.7232, 0, 20.0679, -20.0679, 0, 23.412498, -20.0679, 0, 20.0679, -16.7232, 0, 20.0679, -23.412498, 0, 26.7572, -23.412498, 0, 23.412498, -20.0679, 0, 23.412498, -23.412498, 0, 23.412498, -20.0679, 0, 20.0679, -20.0679, 0, 23.412498, -26.7572, 0, 26.7572, -23.412498, 0, 23.412498, -23.412498, 0, 26.7572, -26.7572, 0, 26.7572, -26.7572, 0, 23.412498, -23.412498, 0, 23.412498, -26.7572, 0, 23.412498, -23.412498, 0, 20.0679, -23.412498, 0, 23.412498, -23.412498, 0, 23.412498, -23.412498, 0, 20.0679, -20.0679, 0, 20.0679, -26.7572, 0, 23.412498, -26.7572, 0, 20.0679, -23.412498, 0, 20.0679, -20.0679, 0, 20.0679, -20.0679, 0, 16.7232, -16.7232, 0, 16.7232, -23.412498, 0, 20.0679, -20.0679, 0, 16.7232, -20.0679, 0, 20.0679, -20.0679, 0, 16.7232, -16.7232, 0, 13.3786, -16.7232, 0, 16.7232, -26.7572, 0, 20.0679, -23.412498, 0, 16.7232, -23.412498, 0, 20.0679, -23.412498, 0, 20.0679, -23.412498, 0, 16.7232, -20.0679, 0, 16.7232, -26.7572, 0, 20.0679, -26.7572, 0, 16.7232, -23.412498, 0, 16.7232, -20.0679, 0, 16.7232, -20.0679, 0, 13.3786, -16.7232, 0, 13.3786, -23.412498, 0, 16.7232, -20.0679, 0, 13.3786, -20.0679, 0, 16.7232, -20.0679, 0, 13.3786, -16.7232, 0, 10.033899, -16.7232, 0, 13.3786, -20.0679, 0, 13.3786, -20.0679, 0, 10.033899, -16.7232, 0, 10.033899, -23.412498, 0, 16.7232, -23.412498, 0, 13.3786, -20.0679, 0, 13.3786, -23.412498, 0, 13.3786, -20.0679, 0, 10.033899, -20.0679, 0, 13.3786, -26.7572, 0, 16.7232, -23.412498, 0, 13.3786, -23.412498, 0, 16.7232, -23.412498, 0, 13.3786, -23.412498, 0, 10.033899, -20.0679, 0, 10.033899, -26.7572, 0, 16.7232, -26.7572, 0, 13.3786, -23.412498, 0, 13.3786, -26.7572, 0, 13.3786, -23.412498, 0, 10.033899, -23.412498, 0, 13.3786, -26.7572, 0, 13.3786, -26.7572, 0, 10.033899, -23.412498, 0, 10.033899, -26.7572, 0, 10.033899, -23.8078, 0, 6.6893, -23.412498, 0, 10.033899, -26.7572, 0, 10.033899, -26.7572, 0, 6.6893, -23.8078, 0, 6.6893, -26.7572, 0, 6.6893, -23.412498, 0, 3.3446, -23.8078, 0, 6.6893, -26.7572, 0, 6.6893, -26.7572, 0, 3.3446, -23.412498, 0, 3.3446, -16.7232, 0, -23.412498, -13.3786, 0, -26.7572, -13.3786, 0, -23.412498, -13.3786, 0, -23.412498, -13.3786, 0, -26.7572, -10.033899, 0, -26.7572, -16.7232, 0, -23.412498, -16.7232, 0, -26.7572, -13.3786, 0, -26.7572, -13.3786, 0, -23.412498, -10.033899, 0, -26.7572, -10.033899, 0, -23.412498, -10.033899, 0, -23.412498, -10.033899, 0, -26.7572, -6.6893, 0, -26.7572, -16.7232, 0, -20.0679, -16.7232, 0, -23.412498, -13.3786, 0, -23.412498, -10.033899, 0, -23.412498, -6.6893, 0, -26.7572, -6.6893, 0, -23.412498, -6.6893, 0, -23.412498, -6.6893, 0, -26.7572, -3.3446, 0, -26.7572, -6.6893, 0, -23.412498, -3.3446, 0, -26.7572, -3.3446, 0, -23.412498, -13.3786, 0, -20.0679, -13.3786, 0, -23.412498, -10.033899, 0, -23.412498, -16.7232, 0, -20.0679, -13.3786, 0, -23.412498, -13.3786, 0, -20.0679, -10.033899, 0, -20.0679, -10.033899, 0, -23.412498, -6.6893, 0, -23.412498, -13.3786, 0, -20.0679, -10.033899, 0, -23.412498, -10.033899, 0, -20.0679, -6.6893, 0, -20.0679, -6.6893, 0, -23.412498, -3.3446, 0, -23.412498, -10.033899, 0, -20.0679, -6.6893, 0, -23.412498, -6.6893, 0, -20.0679, -6.6893, 0, -20.0679, -3.3446, 0, -23.412498, -3.3446, 0, -20.0679, -13.3786, 0, -17.3364, -13.3786, 0, -20.0679, -10.033899, 0, -20.0679, -13.3786, 0, -17.3364, -10.033899, 0, -20.0679, -10.033899, 0, -16.7232, -10.033899, 0, -16.7232, -10.033899, 0, -20.0679, -6.6893, 0, -20.0679, -16.7232, 0, -16.7232, -13.3786, 0, -20.0679, -13.3786, 0, -17.3364, -16.7232, 0, -16.7232, -16.7232, 0, -20.0679, -13.3786, 0, -20.0679, -10.033899, 0, -16.7232, -6.6893, 0, -20.0679, -6.6893, 0, -16.7232, -6.6893, 0, -16.7232, -6.6893, 0, -20.0679, -3.3446, 0, -20.0679, -9.6168995, 0, -14.127899, -10.033899, 0, -16.7232, -6.6893, 0, -16.7232, -9.6168995, 0, -14.127899, -6.6893, 0, -16.7232, -6.6893, 0, -14.2637, -6.6893, 0, -16.7232, -3.3446, 0, -20.0679, -3.3446, 0, -16.7232, -6.6893, 0, -14.2637, -6.6893, 0, -16.7232, -3.3446, 0, -16.7232, -3.3446, 0, -16.7232, -3.3446, 0, -20.0679, 0, 0, -20.0679, -6.6893, 0, -14.2637, -3.3446, 0, -16.7232, -3.3446, 0, -13.3786, -3.3446, 0, -16.7232, 0, 0, -20.0679, 0, 0, -16.7232, -3.3446, 0, -13.3786, -3.3446, 0, -16.7232, 0, 0, -16.7232, 0, 0, -16.7232, 0, 0, -20.0679, 3.3446, 0, -20.5992, 0, 0, -16.7232, 3.3446, 0, -20.5992, 3.0140998, 0, -16.7232, -3.3446, 0, -13.3786, 0, 0, -16.7232, 0, 0, -13.3786, -2.6297, 0, -10.5745, -3.3446, 0, -13.3786, 0, 0, -13.3786, -2.6297, 0, -10.5745, 0, 0, -13.3786, 0, 0, -10.7654, -20.0679, 0, -16.7232, -16.7232, 0, -20.0679, -16.7232, 0, -16.7232, -20.0679, 0, -16.7232, -20.0679, 0, -20.0679, -16.7232, 0, -20.0679, -20.0679, 0, -20.0679, -16.7232, 0, -23.412498, -16.7232, 0, -20.0679, -20.0679, 0, -13.3786, -20.0679, 0, -16.7232, -16.7232, 0, -16.7232, -20.0679, 0, -13.3786, -16.7232, 0, -16.7232, -16.7232, 0, -13.3786, -23.412498, 0, -16.7232, -20.0679, 0, -20.0679, -20.0679, 0, -16.7232, -20.0679, 0, -10.033899, -20.0679, 0, -13.3786, -16.7232, 0, -13.3786, -20.0679, 0, -10.033899, -16.7232, 0, -13.3786, -17.275, 0, -10.5169, -23.412498, 0, -13.3786, -20.0679, 0, -16.7232, -20.0679, 0, -13.3786, -23.412498, 0, -13.3786, -23.412498, 0, -16.7232, -20.0679, 0, -16.7232, -23.412498, 0, -10.033899, -20.0679, 0, -13.3786, -20.0679, 0, -10.033899, -23.412498, 0, -10.033899, -23.412498, 0, -13.3786, -20.0679, 0, -13.3786, -26.7572, 0, -10.033899, -23.412498, 0, -13.3786, -23.412498, 0, -10.033899, -26.7572, 0, -10.033899, -26.7572, 0, -13.3786, -23.412498, 0, -13.3786, -26.7572, 0, -13.3786, -23.412498, 0, -16.7232, -23.412498, 0, -13.3786, -26.7572, 0, -6.6893, -26.7572, 0, -10.033899, -23.412498, 0, -10.033899, -26.7572, 0, -13.3786, -26.7572, 0, -16.7232, -23.412498, 0, -16.7232, -26.7572, 0, -6.6893, -23.412498, 0, -10.033899, -23.412498, 0, -6.6893, -23.412498, 0, -6.6893, -23.412498, 0, -10.033899, -20.0679, 0, -10.033899, -23.412498, 0, -6.6893, -20.0679, 0, -10.033899, -20.3764, 0, -6.6893, -26.7572, 0, -3.3446, -26.7572, 0, -6.6893, -23.412498, 0, -6.6893, -26.7572, 0, -3.3446, -23.412498, 0, -6.6893, -23.412498, 0, -3.3446, -26.7572, 0, -16.7232, -23.412498, 0, -20.0679, -23.412498, 0, -16.7232, -23.412498, 0, -16.7232, -23.412498, 0, -20.0679, -20.0679, 0, -20.0679, -26.7572, 0, -16.7232, -26.7572, 0, -20.0679, -23.412498, 0, -20.0679, -23.412498, 0, -20.0679, -20.0679, 0, -23.412498, -20.0679, 0, -20.0679, -20.0679, 0, -20.0679, -20.0679, 0, -23.412498, -16.7232, 0, -23.412498, -20.0679, 0, -23.412498, -16.7232, 0, -26.7572, -16.7232, 0, -23.412498, -20.0679, 0, -23.412498, -20.0679, 0, -26.7572, -16.7232, 0, -26.7572, -23.412498, 0, -20.0679, -23.412498, 0, -23.412498, -20.0679, 0, -23.412498, -23.412498, 0, -23.412498, -20.0679, 0, -26.7572, -20.0679, 0, -23.412498, -26.7572, 0, -20.0679, -23.412498, 0, -23.412498, -23.412498, 0, -20.0679, -23.412498, 0, -23.412498, -23.412498, 0, -26.7572, -20.0679, 0, -26.7572, -26.7572, 0, -20.0679, -26.7572, 0, -23.412498, -23.412498, 0, -23.412498, -26.7572, 0, -23.412498, -23.412498, 0, -26.7572, -23.412498, 0, -23.412498, -26.7572, 0, -23.412498, -26.7572, 0, -26.7572, -23.412498, 0, -26.7572, -23.412498, 0, -3.3446, -20.3764, 0, -6.6893, -20.0679, -0.3484, -3.5669, -23.412498, 0, -3.3446, -23.412498, 0, -6.6893, -20.3764, 0, -6.6893, 16.7232, 0, 10.033899, 20.0679, -0.124199994, 6.6893, 20.0679, 0, 10.033899, 16.7232, 0, 10.033899, 16.7232, 0, 6.6893, 20.0679, -0.124199994, 6.6893, 20.0679, 0, 10.033899, 23.412498, 0, 6.6893, 23.412498, 0, 10.033899, 20.0679, 0, 10.033899, 20.0679, -0.124199994, 6.6893, 23.412498, 0, 6.6893, -26.7572, 0, 3.3446, -23.412498, -0.2913, 0.26119998, -23.412498, 0, 3.3446, -26.7572, 0, 3.3446, -26.7572, 0, 0, -23.412498, -0.2913, 0.26119998, -26.7572, 0, 0, -23.412498, 0, -3.3446, -23.412498, -0.2913, 0.26119998, -26.7572, 0, 0, -26.7572, 0, -3.3446, -23.412498, 0, -3.3446, 0, 0, -13.3786, 3.0140998, 0, -16.7232, 3.3446, -0.3989, -12.9443, 0, 0, -13.3786, 0, 0, -16.7232, 3.0140998, 0, -16.7232, 0, 0, -10.7654, 3.3446, -0.3989, -12.9443, 2.8241, 0, -10.4594, 0, 0, -10.7654, 0, 0, -13.3786, 3.3446, -0.3989, -12.9443, 20.0679, -0.124199994, 6.6893, 23.412498, 0, 3.3446, 23.412498, 0, 6.6893, 20.0679, -0.124199994, 6.6893, 20.0679, 0, 3.3446, 23.412498, 0, 3.3446, 51.2184, -3.9413, -15.0508995, 54.072197, -3.9413, -13.3786, 51.2184, -3.9413, -13.3786, 51.2184, -3.9413, -13.3786, 54.072197, -3.9413, -13.3786, 54.072197, -3.9413, -11.7063, 51.2184, -3.9413, -15.0508995, 54.072197, -3.9413, -15.0508995, 54.072197, -3.9413, -13.3786, 51.2184, -3.9413, -13.3786, 54.072197, -3.9413, -11.7063, 51.2184, -3.9413, -11.7063, 51.2184, -3.9413, -11.7063, 54.072197, -3.9413, -11.7063, 54.072197, -3.9413, -10.033899, 48.3645, -3.9413, -15.0508995, 51.2184, -3.9413, -15.0508995, 51.2184, -3.9413, -13.3786, 51.2184, -3.9413, -11.7063, 54.072197, -3.9413, -10.033899, 51.2184, -3.9413, -10.033899, 51.2184, -3.9413, -10.033899, 54.072197, -3.9413, -10.033899, 54.072197, -3.9413, -8.3616, 48.3645, -3.9413, -13.3786, 51.2184, -3.9413, -13.3786, 51.2184, -3.9413, -11.7063, 48.3645, -3.9413, -15.0508995, 51.2184, -3.9413, -13.3786, 48.3645, -3.9413, -13.3786, 48.3645, -3.9413, -11.7063, 51.2184, -3.9413, -11.7063, 51.2184, -3.9413, -10.033899, 48.3645, -3.9413, -13.3786, 51.2184, -3.9413, -11.7063, 48.3645, -3.9413, -11.7063, 51.2184, -3.9413, -10.033899, 54.072197, -3.9413, -8.3616, 51.2184, -3.9413, -8.3616, 51.2184, -3.9413, -8.3616, 54.072197, -3.9413, -8.3616, 54.072197, -3.9413, -6.6893, 48.3645, -3.9413, -11.7063, 51.2184, -3.9413, -10.033899, 48.3645, -3.9413, -10.033899, 48.3645, -3.9413, -10.033899, 51.2184, -3.9413, -10.033899, 51.2184, -3.9413, -8.3616, 45.5107, -3.9413, -13.3786, 48.3645, -3.9413, -13.3786, 48.3645, -3.9413, -11.7063, 45.5107, -3.9413, -11.7063, 48.3645, -3.9413, -11.7063, 48.3645, -3.9413, -10.033899, 45.5107, -3.9413, -13.3786, 48.3645, -3.9413, -11.7063, 45.5107, -3.9413, -11.7063, 51.2184, -3.9413, -8.3616, 54.072197, -3.9413, -6.6893, 51.2184, -3.9413, -6.6893, 51.2184, -3.9413, -6.6893, 54.072197, -3.9413, -6.6893, 54.072197, -3.9413, -5.0169997, 48.3645, -3.9413, -10.033899, 51.2184, -3.9413, -8.3616, 48.3645, -3.9413, -8.3616, 48.3645, -3.9413, -8.3616, 51.2184, -3.9413, -8.3616, 51.2184, -3.9413, -6.6893, 45.5107, -3.9413, -11.7063, 48.3645, -3.9413, -10.033899, 45.5107, -3.9413, -10.033899, 45.5107, -3.9413, -10.033899, 48.3645, -3.9413, -10.033899, 48.3645, -3.9413, -8.3616, 51.2184, -3.9413, -6.6893, 54.072197, -3.9413, -5.0169997, 51.2184, -3.9413, -5.0169997, 51.2184, -3.9413, -5.0169997, 54.072197, -3.9413, -5.0169997, 54.072197, -3.9413, -3.3446, 48.3645, -3.9413, -8.3616, 51.2184, -3.9413, -6.6893, 48.3645, -3.9413, -6.6893, 48.3645, -3.9413, -6.6893, 51.2184, -3.9413, -6.6893, 51.2184, -3.9413, -5.0169997, 45.5107, -3.9413, -10.033899, 48.3645, -3.9413, -8.3616, 45.5107, -3.9413, -8.3616, 45.5107, -3.9413, -8.3616, 48.3645, -3.9413, -8.3616, 48.3645, -3.9413, -6.6893, 51.2184, -3.9413, -5.0169997, 54.072197, -3.9413, -3.3446, 51.2184, -3.9413, -3.3446, 51.2184, -3.9413, -3.3446, 54.072197, -3.9413, -3.3446, 54.072197, -3.9413, -1.6723, 48.3645, -3.9413, -6.6893, 51.2184, -3.9413, -5.0169997, 48.3645, -3.9413, -5.0169997, 48.3645, -3.9413, -5.0169997, 51.2184, -3.9413, -5.0169997, 51.2184, -3.9413, -3.3446, 45.5107, -3.9413, -8.3616, 48.3645, -3.9413, -6.6893, 45.5107, -3.9413, -6.6893, 45.5107, -3.9413, -6.6893, 48.3645, -3.9413, -6.6893, 48.3645, -3.9413, -5.0169997, 51.2184, -3.9413, -3.3446, 54.072197, -3.9413, -1.6723, 51.2184, -3.9413, -1.6723, 51.2184, -3.9413, -1.6723, 54.072197, -3.9413, -1.6723, 54.072197, -3.9413, 0, 48.3645, -3.9413, -5.0169997, 51.2184, -3.9413, -3.3446, 48.3645, -3.9413, -3.3446, 48.3645, -3.9413, -3.3446, 51.2184, -3.9413, -3.3446, 51.2184, -3.9413, -1.6723, 45.5107, -3.9413, -6.6893, 48.3645, -3.9413, -5.0169997, 45.5107, -3.9413, -5.0169997, 45.5107, -3.9413, -5.0169997, 48.3645, -3.9413, -5.0169997, 48.3645, -3.9413, -3.3446, 51.2184, -3.9413, -1.6723, 54.072197, -3.9413, 0, 51.2184, -3.9413, 0, 51.2184, -3.9413, 0, 54.072197, -3.9413, 0, 54.072197, -3.9413, 1.6723, 48.3645, -3.9413, -3.3446, 51.2184, -3.9413, -1.6723, 48.3645, -3.9413, -1.6723, 48.3645, -3.9413, -1.6723, 51.2184, -3.9413, -1.6723, 51.2184, -3.9413, 0, 45.5107, -3.9413, -5.0169997, 48.3645, -3.9413, -3.3446, 45.5107, -3.9413, -3.3446, 45.5107, -3.9413, -3.3446, 48.3645, -3.9413, -3.3446, 48.3645, -3.9413, -1.6723, 51.2184, -3.9413, 0, 54.072197, -3.9413, 1.6723, 51.2184, -3.9413, 1.6723, 51.2184, -3.9413, 1.6723, 54.072197, -3.9413, 1.6723, 54.072197, -3.9413, 3.3446, 48.3645, -3.9413, -1.6723, 51.2184, -3.9413, 0, 48.3645, -3.9413, 0, 48.3645, -3.9413, 0, 51.2184, -3.9413, 0, 51.2184, -3.9413, 1.6723, 45.5107, -3.9413, -3.3446, 48.3645, -3.9413, -1.6723, 45.5107, -3.9413, -1.6723, 45.5107, -3.9413, -1.6723, 48.3645, -3.9413, -1.6723, 48.3645, -3.9413, 0, 51.2184, -3.9413, 1.6723, 54.072197, -3.9413, 3.3446, 51.2184, -3.9413, 3.3446, 51.2184, -3.9413, 3.3446, 54.072197, -3.9413, 3.3446, 54.072197, -3.9413, 5.0169997, 48.3645, -3.9413, 0, 51.2184, -3.9413, 1.6723, 48.3645, -3.9413, 1.6723, 48.3645, -3.9413, 1.6723, 51.2184, -3.9413, 1.6723, 51.2184, -3.9413, 3.3446, 45.5107, -3.9413, -1.6723, 48.3645, -3.9413, 0, 45.5107, -3.9413, 0, 45.5107, -3.9413, 0, 48.3645, -3.9413, 0, 48.3645, -3.9413, 1.6723, 51.2184, -3.9413, 3.3446, 54.072197, -3.9413, 5.0169997, 51.2184, -3.9413, 5.0169997, 51.2184, -3.9413, 5.0169997, 54.072197, -3.9413, 5.0169997, 54.072197, -3.9413, 6.6893, 48.3645, -3.9413, 1.6723, 51.2184, -3.9413, 3.3446, 48.3645, -3.9413, 3.3446, 48.3645, -3.9413, 3.3446, 51.2184, -3.9413, 3.3446, 51.2184, -3.9413, 5.0169997, 45.5107, -3.9413, 0, 48.3645, -3.9413, 1.6723, 45.5107, -3.9413, 1.6723, 45.5107, -3.9413, 1.6723, 48.3645, -3.9413, 1.6723, 48.3645, -3.9413, 3.3446, 51.2184, -3.9413, 5.0169997, 54.072197, -3.9413, 6.6893, 51.2184, -3.9413, 6.6893, 51.2184, -3.9413, 6.6893, 54.072197, -3.9413, 6.6893, 54.072197, -3.9413, 8.3616, 48.3645, -3.9413, 3.3446, 51.2184, -3.9413, 5.0169997, 48.3645, -3.9413, 5.0169997, 48.3645, -3.9413, 5.0169997, 51.2184, -3.9413, 5.0169997, 51.2184, -3.9413, 6.6893, 45.5107, -3.9413, 1.6723, 48.3645, -3.9413, 3.3446, 45.5107, -3.9413, 3.3446, 45.5107, -3.9413, 3.3446, 48.3645, -3.9413, 3.3446, 48.3645, -3.9413, 5.0169997, 51.2184, -3.9413, 6.6893, 54.072197, -3.9413, 8.3616, 51.2184, -3.9413, 8.3616, 51.2184, -3.9413, 8.3616, 54.072197, -3.9413, 8.3616, 54.072197, -3.9413, 10.033899, 48.3645, -3.9413, 5.0169997, 51.2184, -3.9413, 6.6893, 48.3645, -3.9413, 6.6893, 48.3645, -3.9413, 6.6893, 51.2184, -3.9413, 6.6893, 51.2184, -3.9413, 8.3616, 45.5107, -3.9413, 3.3446, 48.3645, -3.9413, 5.0169997, 45.5107, -3.9413, 5.0169997, 45.5107, -3.9413, 5.0169997, 48.3645, -3.9413, 5.0169997, 48.3645, -3.9413, 6.6893, 51.2184, -3.9413, 8.3616, 54.072197, -3.9413, 10.033899, 51.2184, -3.9413, 10.033899, 51.2184, -3.9413, 10.033899, 54.072197, -3.9413, 10.033899, 54.072197, -3.9413, 11.7063, 48.3645, -3.9413, 6.6893, 51.2184, -3.9413, 8.3616, 48.3645, -3.9413, 8.3616, 48.3645, -3.9413, 8.3616, 51.2184, -3.9413, 8.3616, 51.2184, -3.9413, 10.033899, 45.5107, -3.9413, 5.0169997, 48.3645, -3.9413, 6.6893, 45.5107, -3.9413, 6.6893, 45.5107, -3.9413, 6.6893, 48.3645, -3.9413, 6.6893, 48.3645, -3.9413, 8.3616, 51.2184, -3.9413, 10.033899, 54.072197, -3.9413, 11.7063, 51.2184, -3.9413, 11.7063, 51.2184, -3.9413, 11.7063, 54.072197, -3.9413, 11.7063, 54.072197, -3.9413, 13.3786, 48.3645, -3.9413, 8.3616, 51.2184, -3.9413, 10.033899, 48.3645, -3.9413, 10.033899, 48.3645, -3.9413, 10.033899, 51.2184, -3.9413, 10.033899, 51.2184, -3.9413, 11.7063, 45.5107, -3.9413, 6.6893, 48.3645, -3.9413, 8.3616, 45.5107, -3.9413, 8.3616, 45.5107, -3.9413, 8.3616, 48.3645, -3.9413, 8.3616, 48.3645, -3.9413, 10.033899, 51.2184, -3.9413, 11.7063, 54.072197, -3.9413, 13.3786, 51.2184, -3.9413, 13.3786, 51.2184, -3.9413, 13.3786, 54.072197, -3.9413, 13.3786, 54.072197, -3.9413, 15.0508995, 48.3645, -3.9413, 10.033899, 51.2184, -3.9413, 11.7063, 48.3645, -3.9413, 11.7063, 48.3645, -3.9413, 11.7063, 51.2184, -3.9413, 11.7063, 51.2184, -3.9413, 13.3786, 45.5107, -3.9413, 8.3616, 48.3645, -3.9413, 10.033899, 45.5107, -3.9413, 10.033899, 45.5107, -3.9413, 10.033899, 48.3645, -3.9413, 10.033899, 48.3645, -3.9413, 11.7063, 51.2184, -3.9413, 13.3786, 54.072197, -3.9413, 15.0508995, 51.2184, -3.9413, 15.0508995, 51.2184, -3.9413, 15.0508995, 54.072197, -3.9413, 15.0508995, 54.072197, -3.9413, 16.7232, 48.3645, -3.9413, 11.7063, 51.2184, -3.9413, 13.3786, 48.3645, -3.9413, 13.3786, 48.3645, -3.9413, 13.3786, 51.2184, -3.9413, 13.3786, 51.2184, -3.9413, 15.0508995, 45.5107, -3.9413, 10.033899, 48.3645, -3.9413, 11.7063, 45.5107, -3.9413, 11.7063, 45.5107, -3.9413, 11.7063, 48.3645, -3.9413, 11.7063, 48.3645, -3.9413, 13.3786, 51.2184, -3.9413, 15.0508995, 54.072197, -3.9413, 16.7232, 51.2184, -3.9413, 16.7232, 51.2184, -3.9413, 16.7232, 54.072197, -3.9413, 16.7232, 54.072197, -3.9413, 18.3955, 48.3645, -3.9413, 13.3786, 51.2184, -3.9413, 15.0508995, 48.3645, -3.9413, 15.0508995, 48.3645, -3.9413, 15.0508995, 51.2184, -3.9413, 15.0508995, 51.2184, -3.9413, 16.7232, 45.5107, -3.9413, 11.7063, 48.3645, -3.9413, 13.3786, 45.5107, -3.9413, 13.3786, 45.5107, -3.9413, 13.3786, 48.3645, -3.9413, 13.3786, 48.3645, -3.9413, 15.0508995, 51.2184, -3.9413, 16.7232, 54.072197, -3.9413, 18.3955, 51.2184, -3.9413, 18.3955, 51.2184, -3.9413, 18.3955, 54.072197, -3.9413, 18.3955, 54.072197, -3.9413, 20.0679, 48.3645, -3.9413, 15.0508995, 51.2184, -3.9413, 16.7232, 48.3645, -3.9413, 16.7232, 48.3645, -3.9413, 16.7232, 51.2184, -3.9413, 16.7232, 51.2184, -3.9413, 18.3955, 45.5107, -3.9413, 13.3786, 48.3645, -3.9413, 15.0508995, 45.5107, -3.9413, 15.0508995, 45.5107, -3.9413, 15.0508995, 48.3645, -3.9413, 15.0508995, 48.3645, -3.9413, 16.7232, 51.2184, -3.9413, 18.3955, 54.072197, -3.9413, 20.0679, 51.2184, -3.9413, 20.0679, 51.2184, -3.9413, 20.0679, 54.072197, -3.9413, 20.0679, 54.072197, -3.9413, 21.7402, 48.3645, -3.9413, 16.7232, 51.2184, -3.9413, 18.3955, 48.3645, -3.9413, 18.3955, 48.3645, -3.9413, 18.3955, 51.2184, -3.9413, 18.3955, 51.2184, -3.9413, 20.0679, 45.5107, -3.9413, 15.0508995, 48.3645, -3.9413, 16.7232, 45.5107, -3.9413, 16.7232, 45.5107, -3.9413, 16.7232, 48.3645, -3.9413, 16.7232, 48.3645, -3.9413, 18.3955, 51.2184, -3.9413, 20.0679, 54.072197, -3.9413, 21.7402, 51.2184, -3.9413, 21.7402, 51.2184, -3.9413, 21.7402, 54.072197, -3.9413, 21.7402, 54.072197, -3.9413, 23.412498, 48.3645, -3.9413, 18.3955, 51.2184, -3.9413, 20.0679, 48.3645, -3.9413, 20.0679, 48.3645, -3.9413, 20.0679, 51.2184, -3.9413, 20.0679, 51.2184, -3.9413, 21.7402, 45.5107, -3.9413, 16.7232, 48.3645, -3.9413, 18.3955, 45.5107, -3.9413, 18.3955, 45.5107, -3.9413, 18.3955, 48.3645, -3.9413, 18.3955, 48.3645, -3.9413, 20.0679, 51.2184, -3.9413, 21.7402, 54.072197, -3.9413, 23.412498, 51.2184, -3.9413, 23.412498, 51.2184, -3.9413, 23.412498, 54.072197, -3.9413, 23.412498, 54.072197, -3.9413, 25.084799, 48.3645, -3.9413, 20.0679, 51.2184, -3.9413, 21.7402, 48.3645, -3.9413, 21.7402, 48.3645, -3.9413, 21.7402, 51.2184, -3.9413, 21.7402, 51.2184, -3.9413, 23.412498, 45.5107, -3.9413, 18.3955, 48.3645, -3.9413, 20.0679, 45.5107, -3.9413, 20.0679, 45.5107, -3.9413, 20.0679, 48.3645, -3.9413, 20.0679, 48.3645, -3.9413, 21.7402, 51.2184, -3.9413, 23.412498, 54.072197, -3.9413, 25.084799, 51.2184, -3.9413, 25.084799, 51.2184, -3.9413, 25.084799, 54.072197, -3.9413, 25.084799, 54.072197, -3.9413, 26.7572, 51.2184, -3.9413, 25.084799, 54.072197, -3.9413, 26.7572, 51.2184, -3.9413, 26.7572, 48.3645, -3.9413, 23.412498, 51.2184, -3.9413, 23.412498, 51.2184, -3.9413, 25.084799, 48.3645, -3.9413, 21.7402, 51.2184, -3.9413, 23.412498, 48.3645, -3.9413, 23.412498, 48.3645, -3.9413, 25.084799, 51.2184, -3.9413, 25.084799, 51.2184, -3.9413, 26.7572, 48.3645, -3.9413, 23.412498, 51.2184, -3.9413, 25.084799, 48.3645, -3.9413, 25.084799, 48.3645, -3.9413, 25.084799, 51.2184, -3.9413, 26.7572, 48.3645, -3.9413, 26.7572, 45.5107, -3.9413, 21.7402, 48.3645, -3.9413, 21.7402, 48.3645, -3.9413, 23.412498, 45.5107, -3.9413, 20.0679, 48.3645, -3.9413, 21.7402, 45.5107, -3.9413, 21.7402, 45.5107, -3.9413, 23.412498, 48.3645, -3.9413, 23.412498, 48.3645, -3.9413, 25.084799, 45.5107, -3.9413, 21.7402, 48.3645, -3.9413, 23.412498, 45.5107, -3.9413, 23.412498, 45.5107, -3.9413, 25.084799, 48.3645, -3.9413, 25.084799, 48.3645, -3.9413, 26.7572, 45.5107, -3.9413, 23.412498, 48.3645, -3.9413, 25.084799, 45.5107, -3.9413, 25.084799, 45.5107, -3.9413, 25.084799, 48.3645, -3.9413, 26.7572, 45.5107, -3.9413, 26.7572, 42.6568, -3.9413, 25.084799, 45.5107, -3.9413, 25.084799, 45.5107, -3.9413, 26.7572, 42.6568, -3.9413, 25.084799, 45.5107, -3.9413, 26.7572, 42.6568, -3.9413, 26.7572, 39.7973, -3.9413, 25.084799, 42.6568, -3.9413, 25.084799, 42.6568, -3.9413, 26.7572, 39.7973, -3.9413, 25.084799, 42.6568, -3.9413, 26.7572, 39.7973, -3.9413, 26.7572, 39.7973, -3.9413, 23.412498, 42.6568, -3.9413, 25.084799, 39.7973, -3.9413, 25.084799, 42.6568, -3.9413, 23.412498, 45.5107, -3.9413, 25.084799, 42.6568, -3.9413, 25.084799, 39.7973, -3.9413, 23.412498, 42.6568, -3.9413, 23.412498, 42.6568, -3.9413, 25.084799, 42.6568, -3.9413, 23.412498, 45.5107, -3.9413, 23.412498, 45.5107, -3.9413, 25.084799, 39.7973, -3.9413, 21.7402, 42.6568, -3.9413, 23.412498, 39.7973, -3.9413, 23.412498, 42.6568, -3.9413, 21.7402, 45.5107, -3.9413, 23.412498, 42.6568, -3.9413, 23.412498, 39.7973, -3.9413, 21.7402, 42.6568, -3.9413, 21.7402, 42.6568, -3.9413, 23.412498, 42.6568, -3.9413, 21.7402, 45.5107, -3.9413, 21.7402, 45.5107, -3.9413, 23.412498, 39.7973, -3.9413, 20.0679, 42.6568, -3.9413, 21.7402, 39.7973, -3.9413, 21.7402, 42.6568, -3.9413, 20.0679, 45.5107, -3.9413, 21.7402, 42.6568, -3.9413, 21.7402, 39.7973, -3.9413, 20.0679, 42.6568, -3.9413, 20.0679, 42.6568, -3.9413, 21.7402, 42.6568, -3.9413, 20.0679, 45.5107, -3.9413, 20.0679, 45.5107, -3.9413, 21.7402, 39.7973, -3.9413, 18.3955, 42.6568, -3.9413, 20.0679, 39.7973, -3.9413, 20.0679, 42.6568, -3.9413, 18.3955, 45.5107, -3.9413, 20.0679, 42.6568, -3.9413, 20.0679, 39.7973, -3.9413, 18.3955, 42.6568, -3.9413, 18.3955, 42.6568, -3.9413, 20.0679, 42.6568, -3.9413, 18.3955, 45.5107, -3.9413, 18.3955, 45.5107, -3.9413, 20.0679, 39.7973, -3.9413, 16.7232, 42.6568, -3.9413, 18.3955, 39.7973, -3.9413, 18.3955, 42.6568, -3.9413, 16.7232, 45.5107, -3.9413, 18.3955, 42.6568, -3.9413, 18.3955, 39.7973, -3.9413, 16.7232, 42.6568, -3.9413, 16.7232, 42.6568, -3.9413, 18.3955, 42.6568, -3.9413, 16.7232, 45.5107, -3.9413, 16.7232, 45.5107, -3.9413, 18.3955, 39.7973, -3.9413, 15.0508995, 42.6568, -3.9413, 16.7232, 39.7973, -3.9413, 16.7232, 42.6568, -3.9413, 15.0508995, 45.5107, -3.9413, 16.7232, 42.6568, -3.9413, 16.7232, 39.7973, -3.9413, 15.0508995, 42.6568, -3.9413, 15.0508995, 42.6568, -3.9413, 16.7232, 42.6568, -3.9413, 15.0508995, 45.5107, -3.9413, 15.0508995, 45.5107, -3.9413, 16.7232, 39.7973, -3.9413, 13.3786, 42.6568, -3.9413, 15.0508995, 39.7973, -3.9413, 15.0508995, 42.6568, -3.9413, 13.3786, 45.5107, -3.9413, 15.0508995, 42.6568, -3.9413, 15.0508995, 39.7973, -3.9413, 13.3786, 42.6568, -3.9413, 13.3786, 42.6568, -3.9413, 15.0508995, 42.6568, -3.9413, 13.3786, 45.5107, -3.9413, 13.3786, 45.5107, -3.9413, 15.0508995, 39.7973, -3.9413, 11.7063, 42.6568, -3.9413, 13.3786, 39.7973, -3.9413, 13.3786, 42.6568, -3.9413, 11.7063, 45.5107, -3.9413, 13.3786, 42.6568, -3.9413, 13.3786, 39.7973, -3.9413, 11.7063, 42.6568, -3.9413, 11.7063, 42.6568, -3.9413, 13.3786, 42.6568, -3.9413, 11.7063, 45.5107, -3.9413, 11.7063, 45.5107, -3.9413, 13.3786, 39.7973, -3.9413, 10.033899, 42.6568, -3.9413, 11.7063, 39.7973, -3.9413, 11.7063, 42.6568, -3.9413, 10.033899, 45.5107, -3.9413, 11.7063, 42.6568, -3.9413, 11.7063, 39.7973, -3.9413, 10.033899, 42.6568, -3.9413, 10.033899, 42.6568, -3.9413, 11.7063, 42.6568, -3.9413, 10.033899, 45.5107, -3.9413, 10.033899, 45.5107, -3.9413, 11.7063, 39.7973, -3.9413, 8.3616, 42.6568, -3.9413, 10.033899, 39.7973, -3.9413, 10.033899, 42.6568, -3.9413, 8.3616, 45.5107, -3.9413, 10.033899, 42.6568, -3.9413, 10.033899, 39.7973, -3.9413, 8.3616, 42.6568, -3.9413, 8.3616, 42.6568, -3.9413, 10.033899, 42.6568, -3.9413, 8.3616, 45.5107, -3.9413, 8.3616, 45.5107, -3.9413, 10.033899, 39.7973, -3.9413, 6.6893, 42.6568, -3.9413, 8.3616, 39.7973, -3.9413, 8.3616, 42.6568, -3.9413, 6.6893, 45.5107, -3.9413, 8.3616, 42.6568, -3.9413, 8.3616, 39.7973, -3.9413, 6.6893, 42.6568, -3.9413, 6.6893, 42.6568, -3.9413, 8.3616, 42.6568, -3.9413, 6.6893, 45.5107, -3.9413, 6.6893, 45.5107, -3.9413, 8.3616, 39.7973, -3.9413, 5.0169997, 42.6568, -3.9413, 6.6893, 39.7973, -3.9413, 6.6893, 42.6568, -3.9413, 5.0169997, 45.5107, -3.9413, 6.6893, 42.6568, -3.9413, 6.6893, 39.7973, -3.9413, 5.0169997, 42.6568, -3.9413, 5.0169997, 42.6568, -3.9413, 6.6893, 42.6568, -3.9413, 5.0169997, 45.5107, -3.9413, 5.0169997, 45.5107, -3.9413, 6.6893, 39.7973, -3.9413, 3.3446, 42.6568, -3.9413, 5.0169997, 39.7973, -3.9413, 5.0169997, 42.6568, -3.9413, 3.3446, 45.5107, -3.9413, 5.0169997, 42.6568, -3.9413, 5.0169997, 39.7973, -3.9413, 3.3446, 42.6568, -3.9413, 3.3446, 42.6568, -3.9413, 5.0169997, 42.6568, -3.9413, 3.3446, 45.5107, -3.9413, 3.3446, 45.5107, -3.9413, 5.0169997, 39.7973, -3.9413, 1.6723, 42.6568, -3.9413, 3.3446, 39.7973, -3.9413, 3.3446, 42.6568, -3.9413, 1.6723, 45.5107, -3.9413, 3.3446, 42.6568, -3.9413, 3.3446, 39.7973, -3.9413, 1.6723, 42.6568, -3.9413, 1.6723, 42.6568, -3.9413, 3.3446, 42.6568, -3.9413, 1.6723, 45.5107, -3.9413, 1.6723, 45.5107, -3.9413, 3.3446, 39.7973, -3.9413, 0, 42.6568, -3.9413, 1.6723, 39.7973, -3.9413, 1.6723, 42.6568, -3.9413, 0, 45.5107, -3.9413, 1.6723, 42.6568, -3.9413, 1.6723, 39.7973, -3.9413, 0, 42.6568, -3.9413, 0, 42.6568, -3.9413, 1.6723, 42.6568, -3.9413, 0, 45.5107, -3.9413, 0, 45.5107, -3.9413, 1.6723, 39.7973, -3.9413, -1.6723, 42.6568, -3.9413, 0, 39.7973, -3.9413, 0, 42.6568, -3.9413, -1.6723, 45.5107, -3.9413, 0, 42.6568, -3.9413, 0, 39.7973, -3.9413, -1.6723, 42.6568, -3.9413, -1.6723, 42.6568, -3.9413, 0, 42.6568, -3.9413, -1.6723, 45.5107, -3.9413, -1.6723, 45.5107, -3.9413, 0, 39.7973, -3.9413, -3.3446, 42.6568, -3.9413, -1.6723, 39.7973, -3.9413, -1.6723, 42.6568, -3.9413, -3.3446, 45.5107, -3.9413, -1.6723, 42.6568, -3.9413, -1.6723, 39.7973, -3.9413, -3.3446, 42.6568, -3.9413, -3.3446, 42.6568, -3.9413, -1.6723, 42.6568, -3.9413, -3.3446, 45.5107, -3.9413, -3.3446, 45.5107, -3.9413, -1.6723, 39.7973, -3.9413, -5.0169997, 42.6568, -3.9413, -3.3446, 39.7973, -3.9413, -3.3446, 42.6568, -3.9413, -5.0169997, 45.5107, -3.9413, -3.3446, 42.6568, -3.9413, -3.3446, 39.7973, -3.9413, -5.0169997, 42.6568, -3.9413, -5.0169997, 42.6568, -3.9413, -3.3446, 42.6568, -3.9413, -5.0169997, 45.5107, -3.9413, -5.0169997, 45.5107, -3.9413, -3.3446, 39.7973, -3.9413, -6.6893, 42.6568, -3.9413, -5.0169997, 39.7973, -3.9413, -5.0169997, 42.6568, -3.9413, -6.6893, 45.5107, -3.9413, -5.0169997, 42.6568, -3.9413, -5.0169997, 39.7973, -3.9413, -6.6893, 42.6568, -3.9413, -6.6893, 42.6568, -3.9413, -5.0169997, 42.6568, -3.9413, -6.6893, 45.5107, -3.9413, -6.6893, 45.5107, -3.9413, -5.0169997, 39.7973, -3.9413, -8.3616, 42.6568, -3.9413, -6.6893, 39.7973, -3.9413, -6.6893, 42.6568, -3.9413, -8.3616, 45.5107, -3.9413, -6.6893, 42.6568, -3.9413, -6.6893, 39.7973, -3.9413, -8.3616, 42.6568, -3.9413, -8.3616, 42.6568, -3.9413, -6.6893, 42.6568, -3.9413, -8.3616, 45.5107, -3.9413, -8.3616, 45.5107, -3.9413, -6.6893, 39.7973, -3.9413, -10.033899, 42.6568, -3.9413, -8.3616, 39.7973, -3.9413, -8.3616, 42.6568, -3.9413, -10.033899, 45.5107, -3.9413, -8.3616, 42.6568, -3.9413, -8.3616, 39.7973, -3.9413, -10.033899, 42.6568, -3.9413, -10.033899, 42.6568, -3.9413, -8.3616, 42.6568, -3.9413, -10.033899, 45.5107, -3.9413, -10.033899, 45.5107, -3.9413, -8.3616, 39.7973, -3.9413, -11.7063, 42.6568, -3.9413, -10.033899, 39.7973, -3.9413, -10.033899, 42.6568, -3.9413, -11.7063, 45.5107, -3.9413, -10.033899, 42.6568, -3.9413, -10.033899, 39.7973, -3.9413, -11.7063, 42.6568, -3.9413, -11.7063, 42.6568, -3.9413, -10.033899, 42.6568, -3.9413, -11.7063, 45.5107, -3.9413, -11.7063, 45.5107, -3.9413, -10.033899, 39.7973, -3.9413, -13.3786, 42.6568, -3.9413, -11.7063, 39.7973, -3.9413, -11.7063, 42.6568, -3.9413, -13.3786, 45.5107, -3.9413, -11.7063, 42.6568, -3.9413, -11.7063, 39.7973, -3.9413, -13.3786, 42.6568, -3.9413, -13.3786, 42.6568, -3.9413, -11.7063, 42.6568, -3.9413, -13.3786, 45.5107, -3.9413, -13.3786, 45.5107, -3.9413, -11.7063, 39.7973, -3.9413, -15.0508995, 42.6568, -3.9413, -13.3786, 39.7973, -3.9413, -13.3786, 39.7973, -3.9413, -15.0508995, 42.6568, -3.9413, -15.0508995, 42.6568, -3.9413, -13.3786, 42.6568, -3.9413, -15.0508995, 45.5107, -3.9413, -13.3786, 42.6568, -3.9413, -13.3786, 39.7973, -3.9413, -16.7232, 42.6568, -3.9413, -15.0508995, 39.7973, -3.9413, -15.0508995, 42.6568, -3.9413, -15.0508995, 45.5107, -3.9413, -15.0508995, 45.5107, -3.9413, -13.3786, 45.5107, -3.9413, -15.0508995, 48.3645, -3.9413, -13.3786, 45.5107, -3.9413, -13.3786, 39.7973, -3.9413, -16.7232, 42.6568, -3.9413, -16.7232, 42.6568, -3.9413, -15.0508995, 42.6568, -3.9413, -16.7232, 45.5107, -3.9413, -15.0508995, 42.6568, -3.9413, -15.0508995, 39.7973, -3.9413, -18.3955, 42.6568, -3.9413, -16.7232, 39.7973, -3.9413, -16.7232, 45.5107, -3.9413, -15.0508995, 48.3645, -3.9413, -15.0508995, 48.3645, -3.9413, -13.3786, 39.7973, -3.9413, -18.3955, 42.6568, -3.9413, -18.3955, 42.6568, -3.9413, -16.7232, 42.6568, -3.9413, -16.7232, 45.5107, -3.9413, -16.7232, 45.5107, -3.9413, -15.0508995, 45.5107, -3.9413, -16.7232, 48.3645, -3.9413, -15.0508995, 45.5107, -3.9413, -15.0508995, 42.6568, -3.9413, -18.3955, 45.5107, -3.9413, -16.7232, 42.6568, -3.9413, -16.7232, 39.7973, -3.9413, -20.0679, 42.6568, -3.9413, -18.3955, 39.7973, -3.9413, -18.3955, 45.5107, -3.9413, -16.7232, 48.3645, -3.9413, -16.7232, 48.3645, -3.9413, -15.0508995, 48.3645, -3.9413, -16.7232, 51.2184, -3.9413, -15.0508995, 48.3645, -3.9413, -15.0508995, 42.6568, -3.9413, -18.3955, 45.5107, -3.9413, -18.3955, 45.5107, -3.9413, -16.7232, 45.5107, -3.9413, -18.3955, 48.3645, -3.9413, -16.7232, 45.5107, -3.9413, -16.7232, 39.7973, -3.9413, -20.0679, 42.6568, -3.9413, -20.0679, 42.6568, -3.9413, -18.3955, 42.6568, -3.9413, -20.0679, 45.5107, -3.9413, -18.3955, 42.6568, -3.9413, -18.3955, 39.7973, -3.9413, -21.7402, 42.6568, -3.9413, -20.0679, 39.7973, -3.9413, -20.0679, 48.3645, -3.9413, -16.7232, 51.2184, -3.9413, -16.7232, 51.2184, -3.9413, -15.0508995, 51.2184, -3.9413, -16.7232, 54.072197, -3.9413, -15.0508995, 51.2184, -3.9413, -15.0508995, 51.2184, -3.9413, -16.7232, 54.072197, -3.9413, -16.7232, 54.072197, -3.9413, -15.0508995, 48.3645, -3.9413, -18.3955, 51.2184, -3.9413, -16.7232, 48.3645, -3.9413, -16.7232, 45.5107, -3.9413, -18.3955, 48.3645, -3.9413, -18.3955, 48.3645, -3.9413, -16.7232, 51.2184, -3.9413, -18.3955, 54.072197, -3.9413, -16.7232, 51.2184, -3.9413, -16.7232, 48.3645, -3.9413, -18.3955, 51.2184, -3.9413, -18.3955, 51.2184, -3.9413, -16.7232, 51.2184, -3.9413, -18.3955, 54.072197, -3.9413, -18.3955, 54.072197, -3.9413, -16.7232, 45.5107, -3.9413, -20.0679, 48.3645, -3.9413, -18.3955, 45.5107, -3.9413, -18.3955, 42.6568, -3.9413, -20.0679, 45.5107, -3.9413, -20.0679, 45.5107, -3.9413, -18.3955, 48.3645, -3.9413, -20.0679, 51.2184, -3.9413, -18.3955, 48.3645, -3.9413, -18.3955, 45.5107, -3.9413, -20.0679, 48.3645, -3.9413, -20.0679, 48.3645, -3.9413, -18.3955, 51.2184, -3.9413, -20.0679, 54.072197, -3.9413, -18.3955, 51.2184, -3.9413, -18.3955, 48.3645, -3.9413, -20.0679, 51.2184, -3.9413, -20.0679, 51.2184, -3.9413, -18.3955, 51.2184, -3.9413, -20.0679, 54.072197, -3.9413, -20.0679, 54.072197, -3.9413, -18.3955, 39.7973, -3.9413, -21.7402, 42.6568, -3.9413, -21.7402, 42.6568, -3.9413, -20.0679, 42.6568, -3.9413, -21.7402, 45.5107, -3.9413, -20.0679, 42.6568, -3.9413, -20.0679, 39.7973, -3.9413, -23.412498, 42.6568, -3.9413, -21.7402, 39.7973, -3.9413, -21.7402, 45.5107, -3.9413, -21.7402, 48.3645, -3.9413, -20.0679, 45.5107, -3.9413, -20.0679, 42.6568, -3.9413, -21.7402, 45.5107, -3.9413, -21.7402, 45.5107, -3.9413, -20.0679, 39.7973, -3.9413, -23.412498, 42.6568, -3.9413, -23.412498, 42.6568, -3.9413, -21.7402, 42.6568, -3.9413, -23.412498, 45.5107, -3.9413, -21.7402, 42.6568, -3.9413, -21.7402, 39.7973, -3.9413, -25.084799, 42.6568, -3.9413, -23.412498, 39.7973, -3.9413, -23.412498, 45.5107, -3.9413, -21.7402, 48.3645, -3.9413, -21.7402, 48.3645, -3.9413, -20.0679, 48.3645, -3.9413, -21.7402, 51.2184, -3.9413, -20.0679, 48.3645, -3.9413, -20.0679, 42.6568, -3.9413, -23.412498, 45.5107, -3.9413, -23.412498, 45.5107, -3.9413, -21.7402, 45.5107, -3.9413, -23.412498, 48.3645, -3.9413, -21.7402, 45.5107, -3.9413, -21.7402, 39.7973, -3.9413, -25.084799, 42.6568, -3.9413, -25.084799, 42.6568, -3.9413, -23.412498, 42.6568, -3.9413, -25.084799, 45.5107, -3.9413, -23.412498, 42.6568, -3.9413, -23.412498, 39.7973, -3.9413, -26.7572, 42.6568, -3.9413, -25.084799, 39.7973, -3.9413, -25.084799, 39.7973, -3.9413, -26.7572, 42.6568, -3.9413, -26.7572, 42.6568, -3.9413, -25.084799, 42.6568, -3.9413, -26.7572, 45.5107, -3.9413, -25.084799, 42.6568, -3.9413, -25.084799, 42.6568, -3.9413, -25.084799, 45.5107, -3.9413, -25.084799, 45.5107, -3.9413, -23.412498, 42.6568, -3.9413, -26.7572, 45.5107, -3.9413, -26.7572, 45.5107, -3.9413, -25.084799, 45.5107, -3.9413, -23.412498, 48.3645, -3.9413, -23.412498, 48.3645, -3.9413, -21.7402, 45.5107, -3.9413, -25.084799, 48.3645, -3.9413, -23.412498, 45.5107, -3.9413, -23.412498, 45.5107, -3.9413, -26.7572, 48.3645, -3.9413, -25.084799, 45.5107, -3.9413, -25.084799, 45.5107, -3.9413, -25.084799, 48.3645, -3.9413, -25.084799, 48.3645, -3.9413, -23.412498, 45.5107, -3.9413, -26.7572, 48.3645, -3.9413, -26.7572, 48.3645, -3.9413, -25.084799, 48.3645, -3.9413, -21.7402, 51.2184, -3.9413, -21.7402, 51.2184, -3.9413, -20.0679, 48.3645, -3.9413, -23.412498, 51.2184, -3.9413, -21.7402, 48.3645, -3.9413, -21.7402, 51.2184, -3.9413, -21.7402, 54.072197, -3.9413, -20.0679, 51.2184, -3.9413, -20.0679, 51.2184, -3.9413, -21.7402, 54.072197, -3.9413, -21.7402, 54.072197, -3.9413, -20.0679, 48.3645, -3.9413, -23.412498, 51.2184, -3.9413, -23.412498, 51.2184, -3.9413, -21.7402, 51.2184, -3.9413, -23.412498, 54.072197, -3.9413, -21.7402, 51.2184, -3.9413, -21.7402, 48.3645, -3.9413, -25.084799, 51.2184, -3.9413, -23.412498, 48.3645, -3.9413, -23.412498, 51.2184, -3.9413, -23.412498, 54.072197, -3.9413, -23.412498, 54.072197, -3.9413, -21.7402, 48.3645, -3.9413, -26.7572, 51.2184, -3.9413, -25.084799, 48.3645, -3.9413, -25.084799, 48.3645, -3.9413, -25.084799, 51.2184, -3.9413, -25.084799, 51.2184, -3.9413, -23.412498, 51.2184, -3.9413, -25.084799, 54.072197, -3.9413, -23.412498, 51.2184, -3.9413, -23.412498, 48.3645, -3.9413, -26.7572, 51.2184, -3.9413, -26.7572, 51.2184, -3.9413, -25.084799, 51.2184, -3.9413, -25.084799, 54.072197, -3.9413, -25.084799, 54.072197, -3.9413, -23.412498, 51.2184, -3.9413, -26.7572, 54.072197, -3.9413, -25.084799, 51.2184, -3.9413, -25.084799, 51.2184, -3.9413, -26.7572, 54.072197, -3.9413, -26.7572, 54.072197, -3.9413, -25.084799, 29.679499, -0.6044, -15.0508995, 32.4649, -1.1213, -13.3786, 29.679499, -0.6044, -13.3786, 29.679499, -0.6044, -13.3786, 32.4649, -1.1213, -13.3786, 32.4649, -1.1213, -11.7063, 29.679499, -0.6044, -15.0508995, 32.4649, -1.1213, -15.0508995, 32.4649, -1.1213, -13.3786, 29.679499, -0.6044, -13.3786, 32.4649, -1.1213, -11.7063, 29.679499, -0.6044, -11.7063, 29.679499, -0.6044, -16.7232, 32.4649, -1.1213, -15.0508995, 29.679499, -0.6044, -15.0508995, 29.679499, -0.6044, -11.7063, 32.4649, -1.1213, -11.7063, 32.4649, -1.1213, -10.033899, 29.679499, -0.6044, -16.7232, 32.4649, -1.1213, -16.7232, 32.4649, -1.1213, -15.0508995, 29.679499, -0.6044, -11.7063, 32.4649, -1.1213, -10.033899, 29.679499, -0.6044, -10.033899, 29.679499, -0.6044, -18.3955, 32.4649, -1.1213, -16.7232, 29.679499, -0.6044, -16.7232, 29.679499, -0.6044, -10.033899, 32.4649, -1.1213, -10.033899, 32.4649, -1.1213, -8.3616, 29.679499, -0.6044, -18.3955, 32.4649, -1.1213, -18.3955, 32.4649, -1.1213, -16.7232, 29.679499, -0.6044, -10.033899, 32.4649, -1.1213, -8.3616, 29.679499, -0.6044, -8.3616, 29.679499, -0.6044, -20.0679, 32.4649, -1.1213, -18.3955, 29.679499, -0.6044, -18.3955, 29.679499, -0.6044, -8.3616, 32.4649, -1.1213, -8.3616, 32.4649, -1.1213, -6.6893, 29.679499, -0.6044, -20.0679, 32.4649, -1.1213, -20.0679, 32.4649, -1.1213, -18.3955, 29.679499, -0.6044, -8.3616, 32.4649, -1.1213, -6.6893, 29.679499, -0.6044, -6.6893, 29.679499, -0.6044, -21.7402, 32.4649, -1.1213, -20.0679, 29.679499, -0.6044, -20.0679, 29.679499, -0.6044, -6.6893, 32.4649, -1.1213, -6.6893, 32.4649, -1.1213, -5.0169997, 29.679499, -0.6044, -21.7402, 32.4649, -1.1213, -21.7402, 32.4649, -1.1213, -20.0679, 29.679499, -0.6044, -6.6893, 32.4649, -1.1213, -5.0169997, 29.679499, -0.6044, -5.0169997, 29.679499, -0.6044, -23.412498, 32.4649, -1.1213, -21.7402, 29.679499, -0.6044, -21.7402, 29.679499, -0.6044, -5.0169997, 32.4649, -1.1213, -5.0169997, 32.4649, -1.1213, -3.3446, 29.679499, -0.6044, -23.412498, 32.4649, -1.1213, -23.412498, 32.4649, -1.1213, -21.7402, 29.679499, -0.6044, -5.0169997, 32.4649, -1.1213, -3.3446, 29.679499, -0.6044, -3.3446, 29.679499, -0.6044, -25.084799, 32.4649, -1.1213, -23.412498, 29.679499, -0.6044, -23.412498, 29.679499, -0.6044, -3.3446, 32.4649, -1.1213, -3.3446, 32.4649, -1.1213, -1.6723, 29.679499, -0.6044, -25.084799, 32.4649, -1.1213, -25.084799, 32.4649, -1.1213, -23.412498, 29.679499, -0.6044, -26.7572, 32.4649, -1.1213, -25.084799, 29.679499, -0.6044, -25.084799, 29.679499, -0.6044, -26.7572, 32.4649, -1.1213, -26.7572, 32.4649, -1.1213, -25.084799, 29.679499, -0.6044, -3.3446, 32.4649, -1.1213, -1.6723, 29.679499, -0.6044, -1.6723, 29.679499, -0.6044, -1.6723, 32.4649, -1.1213, -1.6723, 32.4649, -1.1213, 0, 29.679499, -0.6044, -1.6723, 32.4649, -1.1213, 0, 29.679499, -0.6044, 0, 29.679499, -0.6044, 0, 32.4649, -1.1213, 0, 32.4649, -1.1213, 1.6723, 29.679499, -0.6044, 0, 32.4649, -1.1213, 1.6723, 29.679499, -0.6044, 1.6723, 29.679499, -0.6044, 1.6723, 32.4649, -1.1213, 1.6723, 32.4649, -1.1213, 3.3446, 29.679499, -0.6044, 1.6723, 32.4649, -1.1213, 3.3446, 29.679499, -0.6044, 3.3446, 29.679499, -0.6044, 3.3446, 32.4649, -1.1213, 3.3446, 32.4649, -1.1213, 5.0169997, 29.679499, -0.6044, 3.3446, 32.4649, -1.1213, 5.0169997, 29.679499, -0.6044, 5.0169997, 29.679499, -0.6044, 5.0169997, 32.4649, -1.1213, 5.0169997, 32.4649, -1.1213, 6.6893, 29.679499, -0.6044, 5.0169997, 32.4649, -1.1213, 6.6893, 29.679499, -0.6044, 6.6893, 29.679499, -0.6044, 6.6893, 32.4649, -1.1213, 6.6893, 32.4649, -1.1213, 8.3616, 29.679499, -0.6044, 6.6893, 32.4649, -1.1213, 8.3616, 29.679499, -0.6044, 8.3616, 29.679499, -0.6044, 8.3616, 32.4649, -1.1213, 8.3616, 32.4649, -1.1213, 10.033899, 29.679499, -0.6044, 8.3616, 32.4649, -1.1213, 10.033899, 29.679499, -0.6044, 10.033899, 29.679499, -0.6044, 10.033899, 32.4649, -1.1213, 10.033899, 32.4649, -1.1213, 11.7063, 29.679499, -0.6044, 10.033899, 32.4649, -1.1213, 11.7063, 29.679499, -0.6044, 11.7063, 29.679499, -0.6044, 11.7063, 32.4649, -1.1213, 11.7063, 32.4649, -1.1213, 13.3786, 29.679499, -0.6044, 11.7063, 32.4649, -1.1213, 13.3786, 29.679499, -0.6044, 13.3786, 29.679499, -0.6044, 13.3786, 32.4649, -1.1213, 13.3786, 32.4649, -1.1213, 15.0508995, 29.679499, -0.6044, 13.3786, 32.4649, -1.1213, 15.0508995, 29.679499, -0.6044, 15.0508995, 29.679499, -0.6044, 15.0508995, 32.4649, -1.1213, 15.0508995, 32.4649, -1.1213, 16.7232, 29.679499, -0.6044, 15.0508995, 32.4649, -1.1213, 16.7232, 29.679499, -0.6044, 16.7232, 29.679499, -0.6044, 16.7232, 32.4649, -1.1213, 16.7232, 32.4649, -1.1213, 18.3955, 29.679499, -0.6044, 16.7232, 32.4649, -1.1213, 18.3955, 29.679499, -0.6044, 18.3955, 29.679499, -0.6044, 18.3955, 32.4649, -1.1213, 18.3955, 32.4649, -1.1213, 20.0679, 29.679499, -0.6044, 18.3955, 32.4649, -1.1213, 20.0679, 29.679499, -0.6044, 20.0679, 29.679499, -0.6044, 20.0679, 32.4649, -1.1213, 20.0679, 32.4649, -1.1213, 21.7402, 29.679499, -0.6044, 20.0679, 32.4649, -1.1213, 21.7402, 29.679499, -0.6044, 21.7402, 29.679499, -0.6044, 21.7402, 32.4649, -1.1213, 21.7402, 32.4649, -1.1213, 23.412498, 29.679499, -0.6044, 21.7402, 32.4649, -1.1213, 23.412498, 29.679499, -0.6044, 23.412498, 29.679499, -0.6044, 23.412498, 32.4649, -1.1213, 23.412498, 32.4649, -1.1213, 25.084799, 29.679499, -0.6044, 23.412498, 32.4649, -1.1213, 25.084799, 29.679499, -0.6044, 25.084799, 29.679499, -0.6044, 25.084799, 32.4649, -1.1213, 25.084799, 32.4649, -1.1213, 26.7572, 29.679499, -0.6044, 25.084799, 32.4649, -1.1213, 26.7572, 29.679499, -0.6044, 26.7572, 32.4649, -1.1213, -15.0508995, 39.7973, -3.9413, -13.3786, 32.4649, -1.1213, -13.3786, 32.4649, -1.1213, -13.3786, 39.7973, -3.9413, -13.3786, 39.7973, -3.9413, -11.7063, 32.4649, -1.1213, -15.0508995, 39.7973, -3.9413, -15.0508995, 39.7973, -3.9413, -13.3786, 32.4649, -1.1213, -13.3786, 39.7973, -3.9413, -11.7063, 32.4649, -1.1213, -11.7063, 32.4649, -1.1213, -16.7232, 39.7973, -3.9413, -15.0508995, 32.4649, -1.1213, -15.0508995, 32.4649, -1.1213, -11.7063, 39.7973, -3.9413, -11.7063, 39.7973, -3.9413, -10.033899, 32.4649, -1.1213, -16.7232, 39.7973, -3.9413, -16.7232, 39.7973, -3.9413, -15.0508995, 32.4649, -1.1213, -11.7063, 39.7973, -3.9413, -10.033899, 32.4649, -1.1213, -10.033899, 32.4649, -1.1213, -18.3955, 39.7973, -3.9413, -16.7232, 32.4649, -1.1213, -16.7232, 32.4649, -1.1213, -10.033899, 39.7973, -3.9413, -10.033899, 39.7973, -3.9413, -8.3616, 32.4649, -1.1213, -18.3955, 39.7973, -3.9413, -18.3955, 39.7973, -3.9413, -16.7232, 32.4649, -1.1213, -10.033899, 39.7973, -3.9413, -8.3616, 32.4649, -1.1213, -8.3616, 32.4649, -1.1213, -20.0679, 39.7973, -3.9413, -18.3955, 32.4649, -1.1213, -18.3955, 32.4649, -1.1213, -8.3616, 39.7973, -3.9413, -8.3616, 39.7973, -3.9413, -6.6893, 32.4649, -1.1213, -20.0679, 39.7973, -3.9413, -20.0679, 39.7973, -3.9413, -18.3955, 32.4649, -1.1213, -8.3616, 39.7973, -3.9413, -6.6893, 32.4649, -1.1213, -6.6893, 32.4649, -1.1213, -21.7402, 39.7973, -3.9413, -20.0679, 32.4649, -1.1213, -20.0679, 32.4649, -1.1213, -6.6893, 39.7973, -3.9413, -6.6893, 39.7973, -3.9413, -5.0169997, 32.4649, -1.1213, -21.7402, 39.7973, -3.9413, -21.7402, 39.7973, -3.9413, -20.0679, 32.4649, -1.1213, -6.6893, 39.7973, -3.9413, -5.0169997, 32.4649, -1.1213, -5.0169997, 32.4649, -1.1213, -23.412498, 39.7973, -3.9413, -21.7402, 32.4649, -1.1213, -21.7402, 32.4649, -1.1213, -5.0169997, 39.7973, -3.9413, -5.0169997, 39.7973, -3.9413, -3.3446, 32.4649, -1.1213, -23.412498, 39.7973, -3.9413, -23.412498, 39.7973, -3.9413, -21.7402, 32.4649, -1.1213, -5.0169997, 39.7973, -3.9413, -3.3446, 32.4649, -1.1213, -3.3446, 32.4649, -1.1213, -25.084799, 39.7973, -3.9413, -23.412498, 32.4649, -1.1213, -23.412498, 32.4649, -1.1213, -3.3446, 39.7973, -3.9413, -3.3446, 39.7973, -3.9413, -1.6723, 32.4649, -1.1213, -25.084799, 39.7973, -3.9413, -25.084799, 39.7973, -3.9413, -23.412498, 32.4649, -1.1213, -26.7572, 39.7973, -3.9413, -25.084799, 32.4649, -1.1213, -25.084799, 32.4649, -1.1213, -26.7572, 39.7973, -3.9413, -26.7572, 39.7973, -3.9413, -25.084799, 32.4649, -1.1213, -3.3446, 39.7973, -3.9413, -1.6723, 32.4649, -1.1213, -1.6723, 32.4649, -1.1213, -1.6723, 39.7973, -3.9413, -1.6723, 39.7973, -3.9413, 0, 32.4649, -1.1213, -1.6723, 39.7973, -3.9413, 0, 32.4649, -1.1213, 0, 32.4649, -1.1213, 0, 39.7973, -3.9413, 0, 39.7973, -3.9413, 1.6723, 32.4649, -1.1213, 0, 39.7973, -3.9413, 1.6723, 32.4649, -1.1213, 1.6723, 32.4649, -1.1213, 1.6723, 39.7973, -3.9413, 1.6723, 39.7973, -3.9413, 3.3446, 32.4649, -1.1213, 1.6723, 39.7973, -3.9413, 3.3446, 32.4649, -1.1213, 3.3446, 32.4649, -1.1213, 3.3446, 39.7973, -3.9413, 3.3446, 39.7973, -3.9413, 5.0169997, 32.4649, -1.1213, 3.3446, 39.7973, -3.9413, 5.0169997, 32.4649, -1.1213, 5.0169997, 32.4649, -1.1213, 5.0169997, 39.7973, -3.9413, 5.0169997, 39.7973, -3.9413, 6.6893, 32.4649, -1.1213, 5.0169997, 39.7973, -3.9413, 6.6893, 32.4649, -1.1213, 6.6893, 32.4649, -1.1213, 6.6893, 39.7973, -3.9413, 6.6893, 39.7973, -3.9413, 8.3616, 32.4649, -1.1213, 6.6893, 39.7973, -3.9413, 8.3616, 32.4649, -1.1213, 8.3616, 32.4649, -1.1213, 8.3616, 39.7973, -3.9413, 8.3616, 39.7973, -3.9413, 10.033899, 32.4649, -1.1213, 8.3616, 39.7973, -3.9413, 10.033899, 32.4649, -1.1213, 10.033899, 32.4649, -1.1213, 10.033899, 39.7973, -3.9413, 10.033899, 39.7973, -3.9413, 11.7063, 32.4649, -1.1213, 10.033899, 39.7973, -3.9413, 11.7063, 32.4649, -1.1213, 11.7063, 32.4649, -1.1213, 11.7063, 39.7973, -3.9413, 11.7063, 39.7973, -3.9413, 13.3786, 32.4649, -1.1213, 11.7063, 39.7973, -3.9413, 13.3786, 32.4649, -1.1213, 13.3786, 32.4649, -1.1213, 13.3786, 39.7973, -3.9413, 13.3786, 39.7973, -3.9413, 15.0508995, 32.4649, -1.1213, 13.3786, 39.7973, -3.9413, 15.0508995, 32.4649, -1.1213, 15.0508995, 32.4649, -1.1213, 15.0508995, 39.7973, -3.9413, 15.0508995, 39.7973, -3.9413, 16.7232, 32.4649, -1.1213, 15.0508995, 39.7973, -3.9413, 16.7232, 32.4649, -1.1213, 16.7232, 32.4649, -1.1213, 16.7232, 39.7973, -3.9413, 16.7232, 39.7973, -3.9413, 18.3955, 32.4649, -1.1213, 16.7232, 39.7973, -3.9413, 18.3955, 32.4649, -1.1213, 18.3955, 32.4649, -1.1213, 18.3955, 39.7973, -3.9413, 18.3955, 39.7973, -3.9413, 20.0679, 32.4649, -1.1213, 18.3955, 39.7973, -3.9413, 20.0679, 32.4649, -1.1213, 20.0679, 32.4649, -1.1213, 20.0679, 39.7973, -3.9413, 20.0679, 39.7973, -3.9413, 21.7402, 32.4649, -1.1213, 20.0679, 39.7973, -3.9413, 21.7402, 32.4649, -1.1213, 21.7402, 32.4649, -1.1213, 21.7402, 39.7973, -3.9413, 21.7402, 39.7973, -3.9413, 23.412498, 32.4649, -1.1213, 21.7402, 39.7973, -3.9413, 23.412498, 32.4649, -1.1213, 23.412498, 32.4649, -1.1213, 23.412498, 39.7973, -3.9413, 23.412498, 39.7973, -3.9413, 25.084799, 32.4649, -1.1213, 23.412498, 39.7973, -3.9413, 25.084799, 32.4649, -1.1213, 25.084799, 32.4649, -1.1213, 25.084799, 39.7973, -3.9413, 25.084799, 39.7973, -3.9413, 26.7572, 32.4649, -1.1213, 25.084799, 39.7973, -3.9413, 26.7572, 32.4649, -1.1213, 26.7572, 26.7572, -0.2593, 16.7232, 29.679499, -0.6044, 18.3955, 26.7572, -0.2593, 18.3955, 26.7572, -0.2593, 18.3955, 29.679499, -0.6044, 18.3955, 29.679499, -0.6044, 20.0679, 26.7572, -0.2593, 16.7232, 29.679499, -0.6044, 16.7232, 29.679499, -0.6044, 18.3955, 26.7572, -0.2593, 18.3955, 29.679499, -0.6044, 20.0679, 26.7572, -0.2593, 20.0679, 26.7572, -0.2593, 15.0508995, 29.679499, -0.6044, 16.7232, 26.7572, -0.2593, 16.7232, 26.7572, -0.2593, 20.0679, 29.679499, -0.6044, 20.0679, 29.679499, -0.6044, 21.7402, 26.7572, -0.2593, 15.0508995, 29.679499, -0.6044, 15.0508995, 29.679499, -0.6044, 16.7232, 26.7572, -0.2593, 20.0679, 29.679499, -0.6044, 21.7402, 26.7572, -0.2593, 21.7402, 26.7572, -0.2593, 13.3786, 29.679499, -0.6044, 15.0508995, 26.7572, -0.2593, 15.0508995, 26.7572, -0.2593, 21.7402, 29.679499, -0.6044, 21.7402, 29.679499, -0.6044, 23.412498, 26.7572, -0.2593, 13.3786, 29.679499, -0.6044, 13.3786, 29.679499, -0.6044, 15.0508995, 26.7572, -0.2593, 21.7402, 29.679499, -0.6044, 23.412498, 26.7572, -0.2593, 23.412498, 26.7572, -0.2593, 11.7063, 29.679499, -0.6044, 13.3786, 26.7572, -0.2593, 13.3786, 26.7572, -0.2593, 23.412498, 29.679499, -0.6044, 23.412498, 29.679499, -0.6044, 25.084799, 26.7572, -0.2593, 11.7063, 29.679499, -0.6044, 11.7063, 29.679499, -0.6044, 13.3786, 26.7572, -0.2593, 23.412498, 29.679499, -0.6044, 25.084799, 26.7572, -0.2593, 25.084799, 26.7572, -0.2593, 25.084799, 29.679499, -0.6044, 25.084799, 29.679499, -0.6044, 26.7572, 26.7572, -0.2593, 25.084799, 29.679499, -0.6044, 26.7572, 26.7572, -0.2593, 26.7572, 26.7572, -0.2593, 10.033899, 29.679499, -0.6044, 11.7063, 26.7572, -0.2593, 11.7063, 26.7572, -0.2593, 10.033899, 29.679499, -0.6044, 10.033899, 29.679499, -0.6044, 11.7063, 26.7572, -0.2593, 8.3616, 29.679499, -0.6044, 10.033899, 26.7572, -0.2593, 10.033899, 26.7572, -0.2593, 8.3616, 29.679499, -0.6044, 8.3616, 29.679499, -0.6044, 10.033899, 26.7572, -0.2593, 6.6893, 29.679499, -0.6044, 8.3616, 26.7572, -0.2593, 8.3616, 26.7572, -0.2593, 6.6893, 29.679499, -0.6044, 6.6893, 29.679499, -0.6044, 8.3616, 26.7572, -0.2593, 5.0169997, 29.679499, -0.6044, 6.6893, 26.7572, -0.2593, 6.6893, 26.7572, -0.2593, 5.0169997, 29.679499, -0.6044, 5.0169997, 29.679499, -0.6044, 6.6893, 26.7572, -0.2593, 3.3446, 29.679499, -0.6044, 5.0169997, 26.7572, -0.2593, 5.0169997, 26.7572, -0.2593, 3.3446, 29.679499, -0.6044, 3.3446, 29.679499, -0.6044, 5.0169997, 26.7572, -0.2593, 1.6723, 29.679499, -0.6044, 3.3446, 26.7572, -0.2593, 3.3446, 26.7572, -0.2593, 1.6723, 29.679499, -0.6044, 1.6723, 29.679499, -0.6044, 3.3446, 26.7572, -0.2593, 0, 29.679499, -0.6044, 1.6723, 26.7572, -0.2593, 1.6723, 26.7572, -0.2593, 0, 29.679499, -0.6044, 0, 29.679499, -0.6044, 1.6723, 26.7572, -0.2593, -1.6723, 29.679499, -0.6044, 0, 26.7572, -0.2593, 0, 26.7572, -0.2593, -1.6723, 29.679499, -0.6044, -1.6723, 29.679499, -0.6044, 0, 26.7572, -0.2593, -3.3446, 29.679499, -0.6044, -1.6723, 26.7572, -0.2593, -1.6723, 26.7572, -0.2593, -3.3446, 29.679499, -0.6044, -3.3446, 29.679499, -0.6044, -1.6723, 26.7572, -0.2593, -5.0169997, 29.679499, -0.6044, -3.3446, 26.7572, -0.2593, -3.3446, 26.7572, -0.2593, -5.0169997, 29.679499, -0.6044, -5.0169997, 29.679499, -0.6044, -3.3446, 26.7572, -0.2593, -6.6893, 29.679499, -0.6044, -5.0169997, 26.7572, -0.2593, -5.0169997, 26.7572, -0.2593, -6.6893, 29.679499, -0.6044, -6.6893, 29.679499, -0.6044, -5.0169997, 26.7572, -0.2593, -8.3616, 29.679499, -0.6044, -6.6893, 26.7572, -0.2593, -6.6893, 26.7572, -0.2593, -8.3616, 29.679499, -0.6044, -8.3616, 29.679499, -0.6044, -6.6893, 26.7572, -0.2593, -10.033899, 29.679499, -0.6044, -8.3616, 26.7572, -0.2593, -8.3616, 26.7572, -0.2593, -10.033899, 29.679499, -0.6044, -10.033899, 29.679499, -0.6044, -8.3616, 26.7572, -0.2593, -11.7063, 29.679499, -0.6044, -10.033899, 26.7572, -0.2593, -10.033899, 26.7572, -0.2593, -11.7063, 29.679499, -0.6044, -11.7063, 29.679499, -0.6044, -10.033899, 26.7572, -0.2593, -13.3786, 29.679499, -0.6044, -11.7063, 26.7572, -0.2593, -11.7063, 26.7572, -0.2593, -13.3786, 29.679499, -0.6044, -13.3786, 29.679499, -0.6044, -11.7063, 26.7572, -0.2593, -15.0508995, 29.679499, -0.6044, -13.3786, 26.7572, -0.2593, -13.3786, 26.7572, -0.2593, -15.0508995, 29.679499, -0.6044, -15.0508995, 29.679499, -0.6044, -13.3786, 26.7572, -0.2593, -16.7232, 29.679499, -0.6044, -15.0508995, 26.7572, -0.2593, -15.0508995, 26.7572, -0.2593, -16.7232, 29.679499, -0.6044, -16.7232, 29.679499, -0.6044, -15.0508995, 26.7572, -0.2593, -18.3955, 29.679499, -0.6044, -16.7232, 26.7572, -0.2593, -16.7232, 26.7572, -0.2593, -18.3955, 29.679499, -0.6044, -18.3955, 29.679499, -0.6044, -16.7232, 26.7572, -0.2593, -20.0679, 29.679499, -0.6044, -18.3955, 26.7572, -0.2593, -18.3955, 26.7572, -0.2593, -20.0679, 29.679499, -0.6044, -20.0679, 29.679499, -0.6044, -18.3955, 26.7572, -0.2593, -21.7402, 29.679499, -0.6044, -20.0679, 26.7572, -0.2593, -20.0679, 26.7572, -0.2593, -21.7402, 29.679499, -0.6044, -21.7402, 29.679499, -0.6044, -20.0679, 26.7572, -0.2593, -23.412498, 29.679499, -0.6044, -21.7402, 26.7572, -0.2593, -21.7402, 26.7572, -0.2593, -23.412498, 29.679499, -0.6044, -23.412498, 29.679499, -0.6044, -21.7402, 26.7572, -0.2593, -25.084799, 29.679499, -0.6044, -23.412498, 26.7572, -0.2593, -23.412498, 26.7572, -0.2593, -25.084799, 29.679499, -0.6044, -25.084799, 29.679499, -0.6044, -23.412498, 26.7572, -0.2593, -26.7572, 29.679499, -0.6044, -25.084799, 26.7572, -0.2593, -25.084799, 26.7572, -0.2593, -26.7572, 29.679499, -0.6044, -26.7572, 29.679499, -0.6044, -25.084799) @@ -293,3 +294,7 @@ position = Vector3(-3.25, 3.42, 11.25) [node name="DecorShopWorld" parent="Interactables" instance=ExtResource("25_decor_shop")] position = Vector3(-3.25, 3.42, 11.25) rotation = Vector3(0, 1.5707964, 0) + +[node name="RVUpgradeShopWorld" parent="Interactables" instance=ExtResource("26_rv_upgrade")] +position = Vector3(-6.25, 3.42, 9) +rotation = Vector3(0, 1.5707964, 0) diff --git a/world/regions/world_region.gd b/world/regions/world_region.gd index 85f6e1b..d054938 100644 --- a/world/regions/world_region.gd +++ b/world/regions/world_region.gd @@ -22,6 +22,10 @@ func get_decor_shop() -> DecorShopInteraction: return null +func get_rv_upgrade_shop() -> RVUpgradeInteraction: + return null + + func get_player_storage() -> PlayerStorageInteraction: return null @@ -42,10 +46,24 @@ func get_spawn_surface_triangles( _material_names: Array[StringName], _minimum_global_y: float, _minimum_up_dot: float = 0.6, + _maximum_global_y: float = 100.0, ) -> Array[PackedVector3Array]: return [] +func get_saltwater_surface_height() -> float: + for water_region: FishableWaterRegion in get_fishable_water_regions(): + if water_region.water_type == WaterType.Type.SALT_WATER: + return water_region.get_surface_height() + return NAN + + +## Authored regions are assumed to expose only deliberately reachable home +## sites. Procedural regions override this to reject isolated elevations. +func is_home_exterior_position_accessible(_position: Vector3) -> bool: + return true + + func get_fishable_water_regions() -> Array[FishableWaterRegion]: var regions: Array[FishableWaterRegion] = [] var root: Node = get_node_or_null(fishable_water_root) diff --git a/world/rv_upgrade_interaction.gd b/world/rv_upgrade_interaction.gd new file mode 100644 index 0000000..fb24246 --- /dev/null +++ b/world/rv_upgrade_interaction.gd @@ -0,0 +1,15 @@ +class_name RVUpgradeInteraction +extends FishingShopInteraction + +const TENT_DIALOGUE_TEXT: String = ( + "That tent is looking awful cramped. Can I talk you into an upgrade?" +) +const RV_DIALOGUE_TEXT: String = "How's the new RV treating you?" + + +func get_dialogue_text(home_tier: int = -1) -> String: + return ( + RV_DIALOGUE_TEXT + if home_tier >= PlayerHomeState.STARTER_RV_TIER + else TENT_DIALOGUE_TEXT + ) diff --git a/world/rv_upgrade_interaction.gd.uid b/world/rv_upgrade_interaction.gd.uid new file mode 100644 index 0000000..cb57804 --- /dev/null +++ b/world/rv_upgrade_interaction.gd.uid @@ -0,0 +1 @@ +uid://c0h08goorv2of diff --git a/world/test_world.gd b/world/test_world.gd index 1b0a813..2e25206 100644 --- a/world/test_world.gd +++ b/world/test_world.gd @@ -10,6 +10,9 @@ const PlayerStorageInteractionType = preload( const DecorShopInteractionType = preload( "res://world/decor_shop_interaction.gd" ) +const RVUpgradeInteractionType = preload( + "res://world/rv_upgrade_interaction.gd" +) const WorldLayoutType = preload("res://world/world_layout.gd") const GENERATED_REGION_SCENE: PackedScene = preload( "res://world/generation/generated_world_region.tscn" @@ -75,6 +78,10 @@ func get_decor_shop() -> DecorShopInteractionType: return _active_region.get_decor_shop() +func get_rv_upgrade_shop() -> RVUpgradeInteractionType: + return _active_region.get_rv_upgrade_shop() + + func get_player_spawn_transform() -> Transform3D: return _active_region.get_player_spawn_transform() @@ -170,10 +177,29 @@ func get_saltwater_shoreline_mesh() -> MeshInstance3D: func get_spawn_surface_triangles( material_names: Array[StringName], minimum_global_y: float, + minimum_up_dot: float = 0.6, + maximum_global_y: float = 100.0, ) -> Array[PackedVector3Array]: return _active_region.get_spawn_surface_triangles( material_names, minimum_global_y, + minimum_up_dot, + maximum_global_y, + ) + + +func get_saltwater_surface_height() -> float: + return ( + _active_region.get_saltwater_surface_height() + if _active_region != null + else NAN + ) + + +func is_home_exterior_position_accessible(position: Vector3) -> bool: + return ( + _active_region != null + and _active_region.is_home_exterior_position_accessible(position) ) From 0158b0215f63a409de7ec532bad581f2ae82e5b7 Mon Sep 17 00:00:00 2001 From: Voyager Date: Mon, 31 Aug 2026 16:04:34 -0400 Subject: [PATCH 22/37] Scale coastal crab spawning by habitat --- gathering/catalog/crab_blue.tres | 3 + gathering/catalog/crab_brown.tres | 3 + gathering/gatherable_data.gd | 37 ++++++++++ network/network_world_spawn_service.gd | 61 ++++++++++++++-- tests/fish_catalog_content_validation.gd | 61 ++++++---------- tests/generated_world_runtime_validation.gd | 80 ++++++++++++++++++++- tests/logbook_validation.gd | 7 +- tests/world_spawn_multiplayer_validation.gd | 27 +++++-- tests/world_spawn_protocol_validation.gd | 41 +++++++++-- 9 files changed, 261 insertions(+), 59 deletions(-) diff --git a/gathering/catalog/crab_blue.tres b/gathering/catalog/crab_blue.tres index 1ccabe8..705948e 100644 --- a/gathering/catalog/crab_blue.tres +++ b/gathering/catalog/crab_blue.tres @@ -10,5 +10,8 @@ catch_data = ExtResource("2_catch") required_tool_id = &"crab_net" surface_materials = Array[StringName]([&"sand"]) minimum_surface_y = -0.8 +surface_water_relation = 2 population = 4 +surface_population_per_100_square_meters = 0.4 +maximum_surface_population = 16 sprite_pixel_size = 0.0005 diff --git a/gathering/catalog/crab_brown.tres b/gathering/catalog/crab_brown.tres index 83d20c8..b27bb7e 100644 --- a/gathering/catalog/crab_brown.tres +++ b/gathering/catalog/crab_brown.tres @@ -10,7 +10,10 @@ catch_data = ExtResource("2_catch") required_tool_id = &"crab_net" surface_materials = Array[StringName]([&"sand"]) minimum_surface_y = -0.44 +surface_water_relation = 1 population = 2 +surface_population_per_100_square_meters = 0.15 +maximum_surface_population = 24 movement_speed = 0.35 roam_radius = 3.5 scare_radius = 2.8 diff --git a/gathering/gatherable_data.gd b/gathering/gatherable_data.gd index d60dcc9..41de7fe 100644 --- a/gathering/gatherable_data.gd +++ b/gathering/gatherable_data.gd @@ -10,6 +10,12 @@ enum PresentationMode { WATER_SPURT, } +enum SurfaceWaterRelation { + ANY, + ABOVE_SALT_WATER, + BELOW_SALT_WATER, +} + @export var type_id: StringName @export var catch_data: FishDataType @export var required_tool_id: StringName @@ -17,12 +23,20 @@ enum PresentationMode { @export var diggable_area_id: StringName @export var spawn_anchor_set_id: StringName @export_range(-100.0, 100.0, 0.01) var minimum_surface_y: float = 0.08 +@export_range(-100.0, 100.0, 0.01) var maximum_surface_y: float = 100.0 +@export var surface_water_relation := SurfaceWaterRelation.ANY +@export_range(0.0, 2.0, 0.01) var waterline_margin: float = 0.01 @export_range(0, 64, 1) var population: int = 0 ## Anchored gatherables can scale with authored/generated attachment geometry. ## Zero preserves the fixed population above. @export_range(0.0, 1.0, 0.01) var spawn_anchor_occupancy_ratio := 0.0 ## Zero leaves the anchor count as the only ceiling. @export_range(0, 256, 1) var maximum_anchor_population := 0 +## Optional density scaling for large generated surfaces. The authored +## population remains the minimum while the maximum keeps large maps bounded. +@export_range(0.0, 8.0, 0.01) +var surface_population_per_100_square_meters := 0.0 +@export_range(0, 256, 1) var maximum_surface_population := 0 @export var presentation_mode: PresentationMode = PresentationMode.VISIBLE_CREATURE @export var requires_sneaking: bool = true @export_range(0.0, 120.0, 0.1) var active_lifetime_seconds: float = 0.0 @@ -77,6 +91,7 @@ func is_valid() -> bool: or uses_spawn_anchors or not surface_materials.is_empty() ) + and maximum_surface_y >= minimum_surface_y and ( not uses_diggable_area or catch_data.collection_method @@ -87,6 +102,10 @@ func is_valid() -> bool: maximum_anchor_population == 0 or maximum_anchor_population >= population ) + and ( + maximum_surface_population == 0 + or maximum_surface_population >= population + ) and movement_parameters_valid and _quality_multipliers_are_valid( quality_movement_speed_multipliers @@ -126,6 +145,24 @@ func target_population_for_anchor_count(anchor_count: int) -> int: return target +func target_population_for_surface_area(surface_area: float) -> int: + if surface_population_per_100_square_meters <= 0.0: + return population + if surface_area <= 0.0: + return 0 + var target := maxi( + population, + ceili( + surface_area + * surface_population_per_100_square_meters + / 100.0 + ), + ) + if maximum_surface_population > 0: + target = mini(target, maximum_surface_population) + return target + + func can_be_scared() -> bool: return not is_stationary_spawn() and scare_radius > 0.0 diff --git a/network/network_world_spawn_service.gd b/network/network_world_spawn_service.gd index a45ad37..8981237 100644 --- a/network/network_world_spawn_service.gd +++ b/network/network_world_spawn_service.gd @@ -43,6 +43,7 @@ var _entity_revisions: Dictionary = {} var _surface_triangles: Dictionary = {} var _surface_areas: Dictionary = {} var _surface_total_areas: Dictionary = {} +var _surface_height_ranges: Dictionary = {} var _spawn_anchor_positions: Dictionary = {} var _respawns: Array[Dictionary] = [] var _next_respawn_by_type: Dictionary[StringName, float] = {} @@ -322,10 +323,14 @@ func _cache_spawn_surface(entry: GatherableDataType) -> void: if not entry.diggable_area_id.is_empty(): triangles = _world.get_diggable_area_triangles(entry.diggable_area_id) else: + var height_range := _resolved_surface_height_range(entry) triangles = _world.get_spawn_surface_triangles( entry.surface_materials, - entry.minimum_surface_y, + height_range.x, + 0.6, + height_range.y, ) + _surface_height_ranges[entry.type_id] = height_range var areas := PackedFloat32Array() var total_area: float = 0.0 for triangle: PackedVector3Array in triangles: @@ -519,9 +524,18 @@ func _sample_surface_position( if triangles.is_empty() or total_area <= 0.0: return Vector3(INF, INF, INF) var validates_diggable_surface := not entry.diggable_area_id.is_empty() + var height_range: Vector2 = _surface_height_ranges.get( + entry.type_id, + Vector2(entry.minimum_surface_y, entry.maximum_surface_y), + ) + var validates_height_range := _surface_height_ranges.has(entry.type_id) var attempts: int = ( 48 - if validates_diggable_surface or is_finite(maximum_distance) + if ( + validates_diggable_surface + or validates_height_range + or is_finite(maximum_distance) + ) else 1 ) var fallback: Vector3 = Vector3(INF, INF, INF) @@ -551,9 +565,20 @@ func _sample_surface_position( point, ) ) - if within_requested_distance and valid_diggable_surface: + var valid_height := ( + not validates_height_range + or ( + point.y > height_range.x + and point.y < height_range.y + ) + ) + if ( + within_requested_distance + and valid_diggable_surface + and valid_height + ): return point - if validates_diggable_surface: + if validates_diggable_surface or validates_height_range: return Vector3(INF, INF, INF) if origin.is_finite() and is_finite(maximum_distance): return origin @@ -1405,8 +1430,12 @@ func _reconcile_seasonal_population() -> void: func _target_population(entry: GatherableDataType) -> int: - if entry == null or entry.spawn_anchor_set_id.is_empty(): - return entry.population if entry != null else 0 + if entry == null: + return 0 + if entry.spawn_anchor_set_id.is_empty(): + return entry.target_population_for_surface_area( + float(_surface_total_areas.get(entry.type_id, 0.0)) + ) var anchors: PackedVector3Array = _spawn_anchor_positions.get( entry.type_id, PackedVector3Array(), @@ -1414,6 +1443,25 @@ func _target_population(entry: GatherableDataType) -> int: return entry.target_population_for_anchor_count(anchors.size()) +func _resolved_surface_height_range(entry: GatherableDataType) -> Vector2: + var minimum_y := entry.minimum_surface_y + var maximum_y := entry.maximum_surface_y + var saltwater_height := _world.get_saltwater_surface_height() + if is_finite(saltwater_height): + match entry.surface_water_relation: + GatherableDataType.SurfaceWaterRelation.ABOVE_SALT_WATER: + minimum_y = maxf( + minimum_y, + saltwater_height + entry.waterline_margin, + ) + GatherableDataType.SurfaceWaterRelation.BELOW_SALT_WATER: + maximum_y = minf( + maximum_y, + saltwater_height - entry.waterline_margin, + ) + return Vector2(minimum_y, maximum_y) + + func _population_for_type(type_id: StringName) -> int: var count: int = 0 for state: Dictionary in _entities.values(): @@ -1445,6 +1493,7 @@ func _clear_world() -> void: _surface_triangles.clear() _surface_areas.clear() _surface_total_areas.clear() + _surface_height_ranges.clear() _spawn_anchor_positions.clear() _respawns.clear() _next_respawn_by_type.clear() diff --git a/tests/fish_catalog_content_validation.gd b/tests/fish_catalog_content_validation.gd index 3b31005..82f5604 100644 --- a/tests/fish_catalog_content_validation.gd +++ b/tests/fish_catalog_content_validation.gd @@ -40,39 +40,17 @@ const StarterRegionScene = preload( const SharedFishPlaceholder: Texture2D = preload( "res://art/exported/creatures/fish_placeholder.png" ) -const FINAL_CREATURE_TEXTURE_PATHS: Dictionary[StringName, String] = { - &"bowfin": "res://art/exported/creatures/101.png", - &"sturgeon_lake": "res://art/exported/creatures/102.png", - &"gar_longnose": "res://art/exported/creatures/103.png", - &"paddlefish": "res://art/exported/creatures/104.png", - &"sturgeon_shovelnose": "res://art/exported/creatures/105.png", - &"gar_spotted": "res://art/exported/creatures/106.png", - &"lungfish_west_african": "res://art/exported/creatures/107.png", - &"mudskipper_atlantic": "res://art/exported/creatures/201.png", - &"flounder_winter": "res://art/exported/creatures/403.png", - &"mackerel_atlantic": "res://art/exported/creatures/701.png", - &"mackerel_chub": "res://art/exported/creatures/704.png", - &"sand_lance_american": "res://art/exported/creatures/801.png", - &"menhaden_atlantic": "res://art/exported/creatures/802.png", - &"anchovy_european": "res://art/exported/creatures/805.png", - &"sardine_european": "res://art/exported/creatures/806.png", - &"anchovy_northern": "res://art/exported/creatures/808.png", - &"crab_brown": "res://art/exported/creatures/3906.png", - &"salmon_atlantic": "res://art/exported/creatures/4401.png", - &"mahi_mahi": "res://art/exported/creatures/4701.png", - &"clownfish_ocellaris": "res://art/exported/creatures/5702.png", - &"chromis_blue_green": "res://art/exported/creatures/5901.png", - &"hogfish": "res://art/exported/creatures/6103.png", - &"mullet_striped": "res://art/exported/creatures/6804.png", - &"sheepshead": "res://art/exported/creatures/6905.png", - &"milkfish": "res://art/exported/creatures/7101.png", - &"ladyfish": "res://art/exported/creatures/7403.png", - &"tilapia_nile": "res://art/exported/creatures/7506.png", - &"betta_siamese": "res://art/exported/creatures/7508.png", -} +const FINAL_CREATURE_CATALOG_NUMBERS: Array[int] = [ + 101, 102, 103, 104, 105, 106, 107, 201, 403, 701, 704, 801, + 802, 805, 806, 808, 2502, 2504, 2505, 2508, 2601, 2801, 2802, + 2803, 2804, 2806, 2807, 3002, 3102, 3103, 3104, 3107, 3201, + 3401, 3902, 3906, 4101, 4401, 4701, 5001, 5702, 5901, 5902, + 5903, 5904, 6001, 6103, 6406, 6601, 6801, 6804, 6807, 6901, + 6902, 6904, 6905, 7101, 7403, 7506, 7508, +] -const ACTIVE_CATALOG_COUNT: int = 313 -const INACTIVE_CATALOG_COUNT: int = 3 +const ACTIVE_CATALOG_COUNT: int = 314 +const INACTIVE_CATALOG_COUNT: int = 2 const FISHING_SPECIES_COUNT: int = 310 const GENERATED_POND_COUNT: int = 33 const GENERATED_LAKE_COUNT: int = 20 @@ -235,10 +213,15 @@ func _validate_catalog_and_pools() -> void: else: inactive_count += 1 assert(not fish.is_selectable()) - assert(fish.display_texture == null) - if FINAL_CREATURE_TEXTURE_PATHS.has(fish.id): + if fish.catalog_number not in FINAL_CREATURE_CATALOG_NUMBERS: + assert(fish.display_texture == null) + if fish.catalog_number in FINAL_CREATURE_CATALOG_NUMBERS: + var expected_path := ( + "res://art/exported/creatures/%d.png" + % fish.catalog_number + ) var expected_texture: Texture2D = load( - FINAL_CREATURE_TEXTURE_PATHS[fish.id] + expected_path ) as Texture2D assert(expected_texture != null) assert(fish.display_texture == expected_texture) @@ -246,14 +229,14 @@ func _validate_catalog_and_pools() -> void: if fish.collection_method == FishDataType.CollectionMethod.FISHING: fishing_count += 1 assert(fish.active) - if not FINAL_CREATURE_TEXTURE_PATHS.has(fish.id): + if fish.catalog_number not in FINAL_CREATURE_CATALOG_NUMBERS: assert(fish.display_texture == SharedFishPlaceholder) placeholder_fishing_count += 1 assert(active_count == ACTIVE_CATALOG_COUNT) assert(inactive_count == INACTIVE_CATALOG_COUNT) assert(fishing_count == FISHING_SPECIES_COUNT) - assert(final_art_count == FINAL_CREATURE_TEXTURE_PATHS.size()) - assert(placeholder_fishing_count == 283) + assert(final_art_count == FINAL_CREATURE_CATALOG_NUMBERS.size()) + assert(placeholder_fishing_count == 253) var chum: FishDataType = Catalog.get_fish_by_id(&"salmon_chum") assert(chum != null) assert(chum.get_season_text() == "fall") @@ -291,7 +274,7 @@ func _validate_catalog_and_pools() -> void: ) == chum ) seasonal_collection.free() - var inactive_fish: FishDataType = Catalog.get_fish_by_id(&"crab_blue") + var inactive_fish: FishDataType = Catalog.get_fish_by_id(&"crab_dungeness") assert(inactive_fish != null and not inactive_fish.active) var inactive_pool := FishPoolType.new() inactive_pool.candidates = [inactive_fish] diff --git a/tests/generated_world_runtime_validation.gd b/tests/generated_world_runtime_validation.gd index 6a3f6c8..076f1c9 100644 --- a/tests/generated_world_runtime_validation.gd +++ b/tests/generated_world_runtime_validation.gd @@ -12,6 +12,9 @@ const GeneratedLakePool: FishPool = preload( const GeneratedRiverPool: FishPool = preload( "res://fish/pools/generated_river_pool.tres" ) +const Gatherables: GatherableCatalog = preload( + "res://gathering/catalog/gatherable_catalog.tres" +) const PrecipitationOcclusionType = preload( "res://world/environment/precipitation_occlusion.gd" ) @@ -402,7 +405,7 @@ func _validate_generated_region( + generator.stacked_elevated_placement_keys().size() ) ) - _validate_elevated_cliff_feature(generator) + _validate_elevated_cliff_feature(region, generator) var shop := region.get_node("Interactables/FishingShopWorld") as Node3D var storage := region.get_node("Interactables/PlayerStorageBox") as Node3D @@ -536,6 +539,7 @@ func _validate_generated_region( -INF, 0.35, ) + _validate_crab_spawn_surfaces(region) _validate_water_recovery_positions( region, grass_prop_surface_triangles, @@ -691,6 +695,7 @@ func _validate_generated_region( func _validate_elevated_cliff_feature( + region: GeneratedWorldRegion, generator: TerrainChunkGenerator, ) -> void: var elevated_coordinates: Dictionary[Vector2i, StringName] = {} @@ -824,6 +829,27 @@ func _validate_elevated_cliff_feature( or generator.placement_keys()[low_index].begins_with("chunk_spawn@") ) assert(found_primary_ramp == not primary_is_third_tier) + var primary_surface_height := ( + generator.elevated_cliff_level_height + * (2.0 if primary_is_third_tier else 1.0) + ) + var primary_surface_position := generator.to_global( + generator.chunk_position(feature_center) + + Vector3.UP * primary_surface_height + ) + assert( + region.is_home_exterior_position_accessible(primary_surface_position) + == not primary_is_third_tier + ) + assert(region.is_home_exterior_position_accessible(generator.to_global( + generator.chunk_position(feature_center) + ))) + # A higher surface sharing a ramp-accessible base cell is still invalid + # unless that elevation has its own authored ramp connection. + assert(not region.is_home_exterior_position_accessible(generator.to_global( + generator.chunk_position(feature_center) + + Vector3.UP * (generator.elevated_cliff_level_height * 2.0) + ))) var generated := generator.get_generated_chunks_root() assert(generated != null) @@ -1251,6 +1277,58 @@ func _validate_decoration_transform( ) +func _validate_crab_spawn_surfaces(region: GeneratedWorldRegion) -> void: + var brown := Gatherables.get_entry(&"crab_brown") + var blue := Gatherables.get_entry(&"crab_blue") + assert(brown != null and blue != null) + assert(is_equal_approx( + region.get_saltwater_surface_height(), + GeneratedWorldRegion.WATER_HEIGHT, + )) + var brown_minimum := maxf( + brown.minimum_surface_y, + GeneratedWorldRegion.WATER_HEIGHT + brown.waterline_margin, + ) + var blue_maximum := minf( + blue.maximum_surface_y, + GeneratedWorldRegion.WATER_HEIGHT - blue.waterline_margin, + ) + assert(brown_minimum > blue_maximum) + var brown_triangles := region.get_spawn_surface_triangles( + brown.surface_materials, + brown_minimum, + 0.6, + brown.maximum_surface_y, + ) + var blue_triangles := region.get_spawn_surface_triangles( + blue.surface_materials, + blue.minimum_surface_y, + 0.6, + blue_maximum, + ) + assert(not brown_triangles.is_empty()) + assert(not blue_triangles.is_empty()) + assert( + brown.target_population_for_surface_area( + _surface_triangle_area(brown_triangles) + ) > brown.population + ) + assert( + blue.target_population_for_surface_area( + _surface_triangle_area(blue_triangles) + ) > blue.population + ) + + +func _surface_triangle_area(triangles: Array[PackedVector3Array]) -> float: + var area := 0.0 + for triangle: PackedVector3Array in triangles: + area += (triangle[1] - triangle[0]).cross( + triangle[2] - triangle[0] + ).length() * 0.5 + return area + + func _triangle_surface_height_at( position: Vector3, triangles: Array[PackedVector3Array], diff --git a/tests/logbook_validation.gd b/tests/logbook_validation.gd index 431ed2e..67747a5 100644 --- a/tests/logbook_validation.gd +++ b/tests/logbook_validation.gd @@ -46,7 +46,7 @@ func _run() -> void: func _validate_catalog() -> void: assert(CatalogResource.candidates.size() == 316) var ordered := LogbookCatalog.ordered_species(CatalogResource.candidates) - assert(ordered.size() == 313) + assert(ordered.size() == 314) var previous_number: int = 0 var catalog_numbers: Dictionary[int, bool] = {} for fish: FishDataType in CatalogResource.candidates: @@ -640,7 +640,10 @@ func _validate_page() -> void: page.call("_select_category", LogbookCatalog.Category.SHELLFISH) await create_timer(0.25).timeout - assert((page.get("_entry_buttons") as Dictionary).size() == 2) + assert((page.get("_entry_buttons") as Dictionary).size() == 3) + assert( + (page.get("_entry_buttons") as Dictionary).has(&"unknown_3902") + ) assert( (page.get("_entry_buttons") as Dictionary).has(&"unknown_3906") ) diff --git a/tests/world_spawn_multiplayer_validation.gd b/tests/world_spawn_multiplayer_validation.gd index 45be081..f5ffd2e 100644 --- a/tests/world_spawn_multiplayer_validation.gd +++ b/tests/world_spawn_multiplayer_validation.gd @@ -2,9 +2,10 @@ extends SceneTree const MainScene: PackedScene = preload("res://main/main.tscn") const TEST_PORT: int = 18170 -const EXPECTED_POPULATION: int = 8 +const EXPECTED_POPULATION: int = 12 const EXPECTED_BY_TYPE: Dictionary = { &"crab_brown": 2, + &"crab_blue": 4, &"clam_manila": 3, &"beetle_stag_common": 3, } @@ -161,6 +162,10 @@ func _validate_population( (position as Vector3).y >= entry.minimum_surface_y - 0.001 ) + if entry.type_id == &"crab_brown": + assert((position as Vector3).y > -0.45) + elif entry.type_id == &"crab_blue": + assert((position as Vector3).y < -0.45) if expect_authoritative_state: var quality: int = int(state.get("quality", -1)) assert(FishQuality.is_valid(quality)) @@ -196,7 +201,10 @@ func _validate_respawn_budget(service: Node) -> void: false, true, ) - assert((service.get("_entities") as Dictionary).size() == 6) + assert( + (service.get("_entities") as Dictionary).size() + == EXPECTED_POPULATION - crab_ids.size() + ) var now: float = Time.get_ticks_msec() / 1000.0 var respawns: Array = service.get("_respawns") @@ -209,18 +217,27 @@ func _validate_respawn_budget(service: Node) -> void: respawns[index] = respawn service.call("_update_respawns") - assert((service.get("_entities") as Dictionary).size() == 7) + assert( + (service.get("_entities") as Dictionary).size() + == EXPECTED_POPULATION - 1 + ) assert((service.get("_respawns") as Array).size() == 1) var next_by_type: Dictionary = service.get("_next_respawn_by_type") var next_allowed: float = float(next_by_type.get(&"crab_brown", 0.0)) assert(next_allowed - now >= 179.0) service.call("_update_respawns") - assert((service.get("_entities") as Dictionary).size() == 7) + assert( + (service.get("_entities") as Dictionary).size() + == EXPECTED_POPULATION - 1 + ) assert((service.get("_respawns") as Array).size() == 1) next_by_type[&"crab_brown"] = now - 1.0 service.call("_update_respawns") - assert((service.get("_entities") as Dictionary).size() == 8) + assert( + (service.get("_entities") as Dictionary).size() + == EXPECTED_POPULATION + ) assert((service.get("_respawns") as Array).is_empty()) _validate_population(service, true) diff --git a/tests/world_spawn_protocol_validation.gd b/tests/world_spawn_protocol_validation.gd index 0840f2d..e300808 100644 --- a/tests/world_spawn_protocol_validation.gd +++ b/tests/world_spawn_protocol_validation.gd @@ -55,6 +55,17 @@ func _validate_catalog_statuses() -> void: assert(is_equal_approx(brown.minimum_respawn_spacing_seconds, 180.0)) assert(brown.required_tool_id == &"crab_net") assert(is_equal_approx(brown.minimum_surface_y, -0.44)) + assert( + brown.surface_water_relation + == GatherableData.SurfaceWaterRelation.ABOVE_SALT_WATER + ) + assert(is_equal_approx( + brown.surface_population_per_100_square_meters, + 0.15, + )) + assert(brown.maximum_surface_population == 24) + assert(brown.target_population_for_surface_area(100.0) == 2) + assert(brown.target_population_for_surface_area(7500.0) == 12) assert(FishCatalog.get_fish_by_id(&"crab_brown") == brown.catch_data) assert(not brown.catch_data.is_fishable()) var clam: GatherableData = Gatherables.get_entry(&"clam_manila") @@ -86,11 +97,27 @@ func _validate_catalog_statuses() -> void: assert(FishCatalog.get_fish_by_id(&"beetle_stag_common") == beetle.catch_data) assert(not beetle.catch_data.is_fishable()) - for type_id: StringName in [ - &"crab_ghost", - &"crab_blue", - &"crab_dungeness", - ]: + var blue: GatherableData = Gatherables.get_entry(&"crab_blue") + assert(blue != null and blue.is_available()) + assert(blue.catch_data.active) + assert(blue.is_available(CalendarSeasonType.Season.SUMMER)) + assert(blue.is_available(CalendarSeasonType.Season.FALL)) + assert(not blue.is_available(CalendarSeasonType.Season.WINTER)) + assert( + blue.surface_water_relation + == GatherableData.SurfaceWaterRelation.BELOW_SALT_WATER + ) + assert(is_equal_approx( + blue.surface_population_per_100_square_meters, + 0.4, + )) + assert(blue.maximum_surface_population == 16) + assert(blue.target_population_for_surface_area(100.0) == 4) + assert(blue.target_population_for_surface_area(2250.0) == 9) + assert(FishCatalog.get_fish_by_id(&"crab_blue") == blue.catch_data) + assert(not blue.catch_data.is_fishable()) + + for type_id: StringName in [&"crab_ghost", &"crab_dungeness"]: var entry: GatherableData = Gatherables.get_entry(type_id) assert(entry != null) assert(entry.is_valid()) @@ -109,8 +136,9 @@ func _validate_catalog_statuses() -> void: ) var available: Array[GatherableData] = Gatherables.get_available_entries() - assert(available.size() == 3) + assert(available.size() == 4) assert(available.has(brown)) + assert(available.has(blue)) assert(available.has(clam)) assert(available.has(beetle)) var winter_available: Array[GatherableData] = ( @@ -118,6 +146,7 @@ func _validate_catalog_statuses() -> void: ) assert(winter_available.has(brown)) assert(winter_available.has(clam)) + assert(not winter_available.has(blue)) assert(not winter_available.has(beetle)) var rng := RandomNumberGenerator.new() rng.seed = 24680 From ff7871030385c59372148a0766c2418e88947844 Mon Sep 17 00:00:00 2001 From: Voyager Date: Tue, 1 Sep 2026 07:44:01 -0400 Subject: [PATCH 23/37] fix: harden recovery flow and clean diagnostics --- economy/item_resale_policy.gd | 2 +- gathering/gathering_controller.gd | 6 +- gathering/world_gatherable.gd | 12 +- homes/home_world_service.gd | 80 ++++--- homes/player_home_state.gd | 2 +- main/main.gd | 32 +++ network/discovery_client.gd | 6 +- network/network_chat_service.gd | 11 +- network/network_session.gd | 181 ++++++++++++---- player/net_attachment.gd | 8 +- player/player.gd | 113 ++++++++-- player/sprint_dust_trail.gd | 8 +- scripts/normalize_texture_imports.gd | 4 +- settings/player_settings.gd | 4 +- tests/android_readiness_validation.gd | 18 +- tests/character_rig_validation.gd | 4 +- tests/controller_mapping_validation.gd | 4 +- ...ontroller_menu_accessibility_validation.gd | 2 +- tests/dedicated_server_config_validation.gd | 25 ++- tests/economy_regression_validation.gd | 2 +- ...dialog_controller_navigation_validation.gd | 28 +-- tests/fish_hotbar_showcase_validation.gd | 14 +- tests/fish_quality_validation.gd | 52 +++-- tests/fishing_authority_validation.gd | 22 ++ tests/fishing_multiplayer_validation.gd | 1 - tests/gathering_marker_surface_validation.gd | 6 +- tests/generated_world_runtime_validation.gd | 57 +++-- tests/inventory_notepad_art_validation.gd | 4 +- tests/keyboard_mouse_mapping_validation.gd | 10 +- tests/late_join_multiplayer_validation.gd | 22 +- tests/light_performance_profile_validation.gd | 6 +- tests/logbook_validation.gd | 8 +- tests/movement_multiplayer_validation.gd | 119 +++++++++- tests/on_screen_keyboard_validation.gd | 6 +- tests/shoreline_ribbon_validation.gd | 2 +- tests/surface_drawing_validation.gd | 21 +- tests/terrain_chunk_generator_validation.gd | 8 +- tests/unified_inventory_validation.gd | 24 +-- tests/world_layout_validation.gd | 4 +- tests/world_spawn_protocol_validation.gd | 17 +- tests/world_time_validation.gd | 10 +- tests/world_weather_validation.gd | 24 ++- ui/chat_ui.gd | 4 +- ui/components/locked_content_presentation.gd | 4 +- ui/components/logbook_portrait.gd | 12 +- ui/components/organizer_tab.gd | 6 +- ui/components/shop_sale_tray_slot.gd | 4 +- ui/controller_focus_presentation.gd | 2 +- ui/fishing_shop.gd | 22 +- ui/game_ui.gd | 50 ++++- ui/interface_font_controller.gd | 6 +- ui/mail_page.gd | 6 +- ui/network/join_game_page.gd | 22 +- ui/new_game_setup_page.gd | 40 ++-- ui/player_menu.gd | 35 +-- ui/profile_page.gd | 6 +- ui/quick_radial_menu.gd | 4 +- ui/save_slots_page.gd | 34 ++- ui/title_screen.gd | 3 +- world/generation/generated_world_region.gd | 203 +++++++++++++++--- world/generation/terrain_chunk_generator.gd | 42 +++- world/test_world.gd | 28 +-- world/water_recovery_controller.gd | 46 +++- world/world_time_service.gd | 13 +- 64 files changed, 1163 insertions(+), 418 deletions(-) diff --git a/economy/item_resale_policy.gd b/economy/item_resale_policy.gd index 299fc48..bfc5944 100644 --- a/economy/item_resale_policy.gd +++ b/economy/item_resale_policy.gd @@ -18,4 +18,4 @@ static func get_unit_value(item: ItemDataType) -> int: if not is_sellable(item): return -1 var purchase_price := FishingShopStockType.get_price(item.item_id) - return purchase_price / 2 if purchase_price >= 0 else -1 + return int(float(purchase_price) / 2.0) if purchase_price >= 0 else -1 diff --git a/gathering/gathering_controller.gd b/gathering/gathering_controller.gd index c061db5..36aa2d5 100644 --- a/gathering/gathering_controller.gd +++ b/gathering/gathering_controller.gd @@ -262,10 +262,10 @@ func _cast_marker_ray(from: Vector3, to: Vector3) -> Dictionary: func _apply_marker_surface(hit: Dictionary, facing: Vector3) -> bool: if hit.is_empty(): return false - var position: Variant = hit.get("position") + var surface_position: Variant = hit.get("position") var normal_value: Variant = hit.get("normal") if ( - typeof(position) != TYPE_VECTOR3 + typeof(surface_position) != TYPE_VECTOR3 or typeof(normal_value) != TYPE_VECTOR3 ): return false @@ -274,7 +274,7 @@ func _apply_marker_surface(hit: Dictionary, facing: Vector3) -> bool: return false surface_normal = surface_normal.normalized() _marker_position = ( - (position as Vector3) + surface_normal * marker_surface_offset + (surface_position as Vector3) + surface_normal * marker_surface_offset ) _marker.global_position = _marker_position _marker.global_basis = marker_basis_for_surface(surface_normal, facing) diff --git a/gathering/world_gatherable.gd b/gathering/world_gatherable.gd index 1a71477..a30ffc7 100644 --- a/gathering/world_gatherable.gd +++ b/gathering/world_gatherable.gd @@ -23,7 +23,7 @@ var _despawning: bool = false func configure( configured_entity_id: String, configured_data: GatherableDataType, - position: Vector3, + network_position: Vector3, yaw: float, ) -> void: entity_id = configured_entity_id @@ -31,7 +31,7 @@ func configure( type_id = data.type_id if data != null else StringName() # Establish the authoritative transform before constructing transient visuals. # Effects emitted before this point would begin at the default world origin. - apply_network_state(position, yaw, true) + apply_network_state(network_position, yaw, true) if data != null and data.is_stationary_hotspot(): _ensure_water_spurt_visual() _water_spurt_elapsed = ( @@ -57,16 +57,16 @@ func configure( func apply_network_state( - position: Vector3, + network_position: Vector3, yaw: float, immediate: bool = false, ) -> void: - if _despawning or not position.is_finite() or not is_finite(yaw): + if _despawning or not network_position.is_finite() or not is_finite(yaw): return - _target_position = position + _target_position = network_position _target_yaw = yaw if immediate or not _has_state: - global_position = position + global_position = network_position rotation.y = yaw _has_state = true diff --git a/homes/home_world_service.gd b/homes/home_world_service.gd index 4ec0645..6148776 100644 --- a/homes/home_world_service.gd +++ b/homes/home_world_service.gd @@ -253,19 +253,19 @@ func _find_exterior_transform( ] if not _is_exterior_candidate_triangle(triangle): continue - var position: Vector3 = ( + var candidate_position: Vector3 = ( triangle[0] + triangle[1] + triangle[2] ) / 3.0 if ( require_spawn_clearance - and position.distance_to(spawn_transform.origin) < 9.0 + and candidate_position.distance_to(spawn_transform.origin) < 9.0 ): continue - if _too_close_to_reserved(position, reserved_transforms): + if _too_close_to_reserved(candidate_position, reserved_transforms): continue var yaw: float = float(posmod(owner_peer_id + offset, 4)) * PI * 0.5 var grounded_position: Vector3 = _ground_exterior_footprint( - position, yaw, triangles, surface_index + candidate_position, yaw, triangles, surface_index ) if not grounded_position.is_finite(): continue @@ -299,7 +299,7 @@ func _is_exterior_candidate_triangle(triangle: PackedVector3Array) -> bool: func _ground_exterior_footprint( - position: Vector3, + candidate_position: Vector3, yaw: float, triangles: Array[PackedVector3Array], surface_index: Dictionary, @@ -310,11 +310,11 @@ func _ground_exterior_footprint( local_sample.x, 0.0, local_sample.y ).rotated(Vector3.UP, yaw) var sample := Vector2( - position.x + rotated_sample.x, - position.z + rotated_sample.z, + candidate_position.x + rotated_sample.x, + candidate_position.z + rotated_sample.z, ) var height: float = _surface_height_at( - sample, position.y, triangles, surface_index + sample, candidate_position.y, triangles, surface_index ) if not is_finite(height): return Vector3.INF @@ -323,7 +323,9 @@ func _ground_exterior_footprint( var maximum_height: float = heights.max() if maximum_height - minimum_height > EXTERIOR_MAX_SURFACE_HEIGHT_DELTA: return Vector3.INF - return Vector3(position.x, maximum_height, position.z) + return Vector3( + candidate_position.x, maximum_height, candidate_position.z + ) func _exterior_footprint_samples() -> Array[Vector2]: @@ -434,7 +436,9 @@ func _triangle_height_at( ) -func _exterior_volume_is_clear(position: Vector3, yaw: float) -> bool: +func _exterior_volume_is_clear( + candidate_position: Vector3, yaw: float +) -> bool: if not is_inside_tree() or get_world_3d() == null: return true var shape := BoxShape3D.new() @@ -447,7 +451,8 @@ func _exterior_volume_is_clear(position: Vector3, yaw: float) -> bool: query.shape = shape query.transform = Transform3D( Basis(Vector3.UP, yaw), - position + Vector3.UP * (EXTERIOR_CLEARANCE_HEIGHT * 0.5 + 0.2), + candidate_position + + Vector3.UP * (EXTERIOR_CLEARANCE_HEIGHT * 0.5 + 0.2), ) query.collision_mask = 1 query.collide_with_areas = false @@ -563,9 +568,11 @@ func get_interior_anchor(owner_fingerprint: String) -> Vector3: func is_avatar_near_exterior(avatar: Player, owner_fingerprint: String) -> bool: if avatar == null or not _presentations_by_fingerprint.has(owner_fingerprint): return false - var transform: Transform3D = get_exterior_transform(owner_fingerprint) + var exterior_transform: Transform3D = get_exterior_transform( + owner_fingerprint + ) var door_position: Vector3 = ( - transform * _exterior_door_local(owner_fingerprint) + exterior_transform * _exterior_door_local(owner_fingerprint) ) return avatar.global_position.distance_to(door_position) <= ( EXTERIOR_INTERACTION_DISTANCE @@ -639,9 +646,9 @@ func interior_local_to_global( func interior_global_to_local( owner_fingerprint: String, - global_position: Vector3, + world_position: Vector3, ) -> Vector3: - return global_position - get_interior_anchor(owner_fingerprint) + return world_position - get_interior_anchor(owner_fingerprint) func get_floor_position_from_screen( @@ -709,15 +716,19 @@ func get_decor_preview_transform( func set_decor_preview_transform( owner_fingerprint: String, instance_id: String, - position: Vector3, + decor_position: Vector3, yaw_radians: float, ) -> bool: var decor: Node3D = _get_decor_presentation( owner_fingerprint, instance_id ) - if decor == null or not position.is_finite() or not is_finite(yaw_radians): + if ( + decor == null + or not decor_position.is_finite() + or not is_finite(yaw_radians) + ): return false - decor.position = Vector3(position.x, 0.18, position.z) + decor.position = Vector3(decor_position.x, 0.18, decor_position.z) decor.rotation.y = yaw_radians return true @@ -817,9 +828,11 @@ func find_nearby_exterior_owner(avatar: Player) -> String: var closest: String = "" var closest_distance: float = EXTERIOR_INTERACTION_DISTANCE for fingerprint: String in _presentations_by_fingerprint: - var transform: Transform3D = get_exterior_transform(fingerprint) + var exterior_transform: Transform3D = get_exterior_transform( + fingerprint + ) var distance: float = avatar.global_position.distance_to( - transform * _exterior_door_local(fingerprint) + exterior_transform * _exterior_door_local(fingerprint) ) if distance <= closest_distance: closest = fingerprint @@ -1261,16 +1274,16 @@ func _add_wall( parent: Node3D, node_name: String, size: Vector3, - position: Vector3, + local_position: Vector3, ) -> void: - _add_box(parent, node_name, size, position, Color("d6caaa"), true) + _add_box(parent, node_name, size, local_position, Color("d6caaa"), true) func _add_box( parent: Node3D, node_name: String, size: Vector3, - position: Vector3, + local_position: Vector3, color: Color, with_collision: bool, invert_faces: bool = false, @@ -1283,10 +1296,10 @@ func _add_box( if invert_faces: mesh.flip_faces = true mesh_instance.mesh = mesh - mesh_instance.position = position + mesh_instance.position = local_position parent.add_child(mesh_instance) if with_collision: - return _add_box_collision(parent, node_name, size, position) + return _add_box_collision(parent, node_name, size, local_position) return null @@ -1294,11 +1307,11 @@ func _add_box_collision( parent: Node3D, node_name: String, size: Vector3, - position: Vector3, + local_position: Vector3, ) -> StaticBody3D: var body := StaticBody3D.new() body.name = "%sCollision" % node_name - body.position = position + body.position = local_position var collision := CollisionShape3D.new() var shape := BoxShape3D.new() shape.size = size @@ -1490,15 +1503,18 @@ func _refresh_nearest_wall() -> void: func _too_close_to_reserved( - position: Vector3, + candidate_position: Vector3, reserved_transforms: Array[Transform3D], ) -> bool: - for transform: Transform3D in reserved_transforms: - if position.distance_to(transform.origin) < MIN_EXTERIOR_SEPARATION: + for reserved_transform: Transform3D in reserved_transforms: + if ( + candidate_position.distance_to(reserved_transform.origin) + < MIN_EXTERIOR_SEPARATION + ): return true return false -func _set_geometry_visible(root: Node, visible: bool) -> void: +func _set_geometry_visible(root: Node, should_show: bool) -> void: for node: Node in root.find_children("*", "GeometryInstance3D", true, false): - (node as GeometryInstance3D).visible = visible + (node as GeometryInstance3D).visible = should_show diff --git a/homes/player_home_state.gd b/homes/player_home_state.gd index a89d6a3..87643c1 100644 --- a/homes/player_home_state.gd +++ b/homes/player_home_state.gd @@ -369,7 +369,7 @@ func restore_from_save_data(data: Dictionary) -> bool: return false _tier = int(sanitized["tier"]) _exterior_id = exterior_id_for_tier(_tier) - _privacy = int(sanitized["privacy"]) + _privacy = int(sanitized["privacy"]) as Privacy _owned_decor.clear() for key: Variant in (sanitized["owned_decor"] as Dictionary): _owned_decor[StringName(str(key))] = int( diff --git a/main/main.gd b/main/main.gd index 324c268..f7f4f0f 100644 --- a/main/main.gd +++ b/main/main.gd @@ -1541,6 +1541,12 @@ func _configure_popup_dialog( func _input(event: InputEvent) -> void: + # The exit walk and its authoritative relocation own gameplay input until the + # return fade completes. This also keeps a late cancel/pause press from + # manipulating a menu while the world space is changing. + if _home_exit_transition_active: + get_viewport().set_input_as_handled() + return # Do not let controller aliases close or manipulate the world/menu behind # the modal on-screen keyboard. The keyboard consumes the event itself. if _game_ui.is_controller_text_entry_open(): @@ -1671,6 +1677,9 @@ func _is_pause_open_request(event: InputEvent) -> bool: func _unhandled_input(event: InputEvent) -> void: + if _home_exit_transition_active: + get_viewport().set_input_as_handled() + return if ( _gameplay_started and event.is_action_pressed("fish_primary") @@ -1858,6 +1867,12 @@ func _reset_pixelation() -> void: func _set_gameplay_active(active: bool) -> void: var was_gameplay_started: bool = _gameplay_started _gameplay_started = active + # Session loss, a world switch, or a return to title can interrupt the home + # handoff before its fade callback runs. Do not carry its input suppressors + # or black screen into the next gameplay session. + if not active: + _cancel_home_entry_transition() + _cancel_home_exit_transition(true) _shoreline_ambience.set_active(active) _rain_ambience.set_active(active) if active and not was_gameplay_started: @@ -2499,6 +2514,7 @@ func _on_local_respawn_completed(entry_position: Vector3) -> void: func _on_remote_recovery_requested( peer_id: int, entry_position: Vector3, + recovery_input_sequence: int, ) -> void: if not _network_session.is_host(): return @@ -2509,6 +2525,9 @@ func _on_remote_recovery_requested( peer_id, "Fishing attempt ended." ) + avatar.neutralize_authoritative_input_for_relocation( + recovery_input_sequence + ) var target_position := _test_world.get_water_recovery_position( entry_position ) @@ -3039,6 +3058,12 @@ func _begin_home_exit_transition(owner_fingerprint: String) -> void: _refresh_home_door_prompt({}) _player.set_local_input_suppressed(HOME_EXIT_INPUT_OWNER, true) _player.set_camera_input_suppressed(HOME_EXIT_INPUT_OWNER, true) + # A same-frame interact can otherwise open home storage after the threshold + # was crossed. The exit suppressor is already active, so restoring storage's + # base snapshot cannot return effective control before the transition ends. + _game_ui.get_player_storage().close_storage() + _game_ui.set_rv_storage_button_visible(false) + _game_ui.set_gameplay_input_locked(true) var exit_direction: Vector3 = _home_world.get_interior_exit_direction( owner_fingerprint ) @@ -3126,6 +3151,11 @@ func _cancel_home_exit_transition(reset_fade: bool) -> void: _home_exit_transition_active = false _home_exit_waiting_for_network = false _home_exit_start_position = Vector3.ZERO + if is_instance_valid(_game_ui): + _game_ui.set_gameplay_input_locked(false) + _game_ui.set_rv_storage_button_visible( + _can_show_rv_storage_button() + ) func _on_rv_storage_requested() -> void: @@ -3247,6 +3277,7 @@ func _refresh_home_door_prompt(prompt: Dictionary) -> void: func _can_show_rv_storage_button() -> bool: return ( _gameplay_started + and not _home_exit_transition_active and not _network_home.get_local_home_owner_fingerprint().is_empty() and _network_home.can_local_decorate() and not _water_recovery.is_recovery_active() @@ -3257,6 +3288,7 @@ func _can_show_rv_storage_button() -> bool: func _get_home_prompt() -> Dictionary: if ( not _gameplay_started + or _home_exit_transition_active or _game_ui.get_player_storage().visible or _game_ui.get_fishing_shop().visible or _game_ui.get_decor_shop().visible diff --git a/network/discovery_client.gd b/network/discovery_client.gd index d8e602a..1e9272f 100644 --- a/network/discovery_client.gd +++ b/network/discovery_client.gd @@ -1042,9 +1042,11 @@ func _valid_json_integer(value: Variant, minimum: int, maximum: int) -> bool: ) -func _make_social_request(name: String, callback: Callable) -> HTTPRequest: +func _make_social_request( + request_name: String, callback: Callable +) -> HTTPRequest: var request := HTTPRequest.new() - request.name = name + request.name = request_name request.timeout = REQUEST_TIMEOUT_SECONDS add_child(request) request.request_completed.connect(callback) diff --git a/network/network_chat_service.gd b/network/network_chat_service.gd index 55ba768..03b6e66 100644 --- a/network/network_chat_service.gd +++ b/network/network_chat_service.gd @@ -340,11 +340,12 @@ func _handle_request(peer_id: int, data: Dictionary) -> void: message["request_id"] = request_id message["sender_fingerprint"] = data["sender_fingerprint"] message["sender_signature"] = data["sender_signature"] - ledger[request_id] = ( - message.duplicate(true) - if _should_store_host_history() - else true - ) + # `true` is the intentional no-history replay sentinel. It records that the + # request was handled without retaining a message payload for replay. + var ledger_entry: Variant = true + if _should_store_host_history(): + ledger_entry = message.duplicate(true) + ledger[request_id] = ledger_entry while ledger.size() > 64: ledger.erase(ledger.keys().front()) _request_ledgers[peer_id] = ledger diff --git a/network/network_session.gd b/network/network_session.gd index 7c259e0..9576ceb 100644 --- a/network/network_session.gd +++ b/network/network_session.gd @@ -29,6 +29,11 @@ const ANIMATION_REFRESH_INTERVAL: float = 1.0 const MAX_MOVEMENT_INPUT_SEQUENCE: int = 2147483647 const MAX_MOVEMENT_ONE_WAY_TRANSIT_SECONDS: float = 0.25 const SPACE_TRANSITION_SNAPSHOT_GUARD_DISTANCE: float = 12.0 +# A reliable teleport travels on a different channel from ordinary movement +# audits. Keep the acceptance radius below Player's hard-reconciliation +# distance so an old audit can never pull a just-relocated local player back +# into the place they were recovered from. +const AUTHORITATIVE_TELEPORT_SNAPSHOT_GUARD_DISTANCE: float = 2.0 const MOVEMENT_FLAG_JUMP: int = 1 << 0 const MOVEMENT_FLAG_SPRINT: int = 1 << 1 @@ -77,7 +82,11 @@ signal server_trust_required( signal peer_identity_observed(peer_id: int, status: String) signal operator_status_changed(peer_id: int, is_operator: bool) signal server_lost(message: String) -signal remote_recovery_requested(peer_id: int, entry_position: Vector3) +signal remote_recovery_requested( + peer_id: int, + entry_position: Vector3, + recovery_input_sequence: int, +) signal remote_recovery_presentation_changed( peer_id: int, active: bool, @@ -128,6 +137,9 @@ var _last_local_snapshot_received_msec: int = 0 var _local_space_transition_guard_active: bool = false var _local_space_transition_guard_position: Vector3 = Vector3.ZERO var _local_space_transition_minimum_ack: int = 0 +var _local_authoritative_teleport_guard_active: bool = false +var _local_authoritative_teleport_guard_position: Vector3 = Vector3.ZERO +var _local_authoritative_teleport_minimum_ack: int = 0 var _animation_refresh_accumulator: float = 0.0 var _last_animation_state_by_peer: Dictionary[int, Dictionary] = {} var _pending_animation_state_by_peer: Dictionary[int, Dictionary] = {} @@ -601,20 +613,20 @@ func get_last_server_metadata() -> Dictionary: } -func set_host_world_seed(seed: int) -> bool: - return set_host_world(WorldLayout.GENERATED, seed) +func set_host_world_seed(world_seed: int) -> bool: + return set_host_world(WorldLayout.GENERATED, world_seed) -func set_host_world(world_layout: StringName, seed: int) -> bool: +func set_host_world(world_layout: StringName, world_seed: int) -> bool: if ( state != State.INACTIVE or not WorldLayout.is_valid(world_layout) - or seed <= 0 - or seed > NetworkProtocol.MAX_WORLD_SEED + or world_seed <= 0 + or world_seed > NetworkProtocol.MAX_WORLD_SEED ): return false _host_world_layout = world_layout - _host_world_seed = seed + _host_world_seed = world_seed return true @@ -2088,10 +2100,10 @@ func _maybe_send_local_input() -> void: if avatar == null: return var state_hash: int = avatar.get_network_input_state_hash() - var state_changed: bool = state_hash != _last_input_state_hash + var input_state_changed: bool = state_hash != _last_input_state_hash if ( avatar.has_active_network_input() - or state_changed + or input_state_changed or _idle_input_accumulator >= IDLE_INPUT_INTERVAL ): _send_local_input() @@ -2125,8 +2137,8 @@ func _maybe_send_local_animation_action() -> void: var avatar: Player = _spawn_service.get_avatar(peer_id) if avatar == null: return - var state: Dictionary = avatar.make_network_animation_state() - var action: Dictionary = state.get("action", {}) + var animation_state: Dictionary = avatar.make_network_animation_state() + var action: Dictionary = animation_state.get("action", {}) if not NetworkPlayerAnimationProtocol.validate_action_state(action): return var signature: Array = [ @@ -2182,11 +2194,15 @@ func submit_movement_animation_action(encoded: Array) -> void: if not is_host() or not _registry.has_peer(sender_id): return var avatar: Player = _spawn_service.get_avatar(sender_id) - var state: Dictionary = _decode_movement_animation_action(encoded) - if avatar == null or state.is_empty(): + var animation_state: Dictionary = _decode_movement_animation_action(encoded) + if avatar == null or animation_state.is_empty(): return - avatar.apply_authoritative_network_animation_action(state["action"]) - avatar.apply_authoritative_network_sitting_state(bool(state["sitting"])) + avatar.apply_authoritative_network_animation_action( + animation_state["action"] + ) + avatar.apply_authoritative_network_sitting_state( + bool(animation_state["sitting"]) + ) static func _encode_movement_input(data: Dictionary) -> Array: @@ -2386,18 +2402,20 @@ func _broadcast_movement_animation_updates(peer_ids: Array[int]) -> void: var avatar: Player = _spawn_service.get_avatar(subject_id) if avatar == null: continue - var state: Dictionary = avatar.make_network_animation_state() + var animation_state: Dictionary = avatar.make_network_animation_state() var previous: Dictionary = _last_animation_state_by_peer.get( subject_id, {} ) if ( not refresh_all - and _movement_animation_signature(state) + and _movement_animation_signature(animation_state) == _movement_animation_signature(previous) ): continue - _last_animation_state_by_peer[subject_id] = state.duplicate(true) - var encoded: Array = _encode_movement_animation(subject_id, state) + _last_animation_state_by_peer[subject_id] = animation_state.duplicate(true) + var encoded: Array = _encode_movement_animation( + subject_id, animation_state + ) if not encoded.is_empty(): updates_by_subject[subject_id] = encoded if updates_by_subject.is_empty(): @@ -2416,13 +2434,13 @@ func _broadcast_movement_animation_updates(peer_ids: Array[int]) -> void: _movement_animation_states_sent += updates.size() -static func _movement_animation_signature(state: Dictionary) -> Array: - if not NetworkPlayerAnimationProtocol.validate_state(state): +static func _movement_animation_signature(animation_state: Dictionary) -> Array: + if not NetworkPlayerAnimationProtocol.validate_state(animation_state): return [] - var action: Dictionary = state["action"] + var action: Dictionary = animation_state["action"] return [ - str(state["locomotion_id"]), - bool(state["grounded"]), + str(animation_state["locomotion_id"]), + bool(animation_state["grounded"]), str(action["id"]), int(action["sequence"]), bool(action.get("paused", false)), @@ -2505,15 +2523,15 @@ static func _decode_movement_snapshot(value: Variant) -> Dictionary: static func _encode_movement_animation( peer_id: int, - state: Dictionary, + animation_state: Dictionary, ) -> Array: - if not NetworkPlayerAnimationProtocol.validate_state(state): + if not NetworkPlayerAnimationProtocol.validate_state(animation_state): return [] - var action: Dictionary = state["action"] + var action: Dictionary = animation_state["action"] return [ peer_id, - str(state["locomotion_id"]), - bool(state["grounded"]), + str(animation_state["locomotion_id"]), + bool(animation_state["grounded"]), str(action["id"]), int(action["sequence"]), float(action["elapsed"]), @@ -2536,7 +2554,7 @@ static func _decode_movement_animation(value: Variant) -> Dictionary: or typeof(fields[6]) != TYPE_BOOL ): return {} - var state: Dictionary = NetworkPlayerAnimationProtocol.make_state( + var animation_state: Dictionary = NetworkPlayerAnimationProtocol.make_state( StringName(str(fields[1])), bool(fields[2]), StringName(str(fields[3])), @@ -2546,10 +2564,10 @@ static func _decode_movement_animation(value: Variant) -> Dictionary: ) if ( int(fields[0]) <= 0 - or not NetworkPlayerAnimationProtocol.validate_state(state) + or not NetworkPlayerAnimationProtocol.validate_state(animation_state) ): return {} - return {"peer_id": int(fields[0]), "state": state} + return {"peer_id": int(fields[0]), "state": animation_state} static func _encode_movement_animation_action( @@ -2610,7 +2628,10 @@ func receive_movement_snapshots(encoded_snapshots: Array) -> void: if avatar == null: continue if peer_id == local_peer_id: - if _reject_stale_space_transition_snapshot(snapshot): + if ( + _reject_stale_space_transition_snapshot(snapshot) + or _reject_stale_authoritative_teleport_snapshot(snapshot) + ): continue _discard_acknowledged_movement_inputs( int(snapshot.get("acknowledged_input", 0)) @@ -2656,6 +2677,37 @@ func _reject_stale_space_transition_snapshot(snapshot: Dictionary) -> bool: return false +func _reject_stale_authoritative_teleport_snapshot( + snapshot: Dictionary, +) -> bool: + if not _local_authoritative_teleport_guard_active: + return false + var position_values: Array = snapshot.get("position", []) + if position_values.size() != 3: + return true + var position := Vector3( + float(position_values[0]), + float(position_values[1]), + float(position_values[2]), + ) + var acknowledged_input: int = int( + snapshot.get("acknowledged_input", 0) + ) + if acknowledged_input < _local_authoritative_teleport_minimum_ack: + return true + # Movement input and reliable recovery RPCs travel on different channels. + # A higher input acknowledgement alone therefore does not prove that this + # snapshot was authored after the teleport; a held pre-recovery packet can + # arrive at the host late. Only a snapshot that is still near the teleported + # position is allowed to release the barrier. + if position.distance_to(_local_authoritative_teleport_guard_position) > ( + AUTHORITATIVE_TELEPORT_SNAPSHOT_GUARD_DISTANCE + ): + return true + _local_authoritative_teleport_guard_active = false + return false + + func _discard_acknowledged_movement_inputs(acknowledged_sequence: int) -> void: while ( not _pending_movement_inputs.is_empty() @@ -2823,11 +2875,16 @@ func request_safe_respawn(entry_position: Vector3) -> void: if not entry_position.is_finite(): return if is_host(): - remote_recovery_requested.emit(1, entry_position) + remote_recovery_requested.emit(1, entry_position, _input_sequence) elif state == State.JOINED_CLIENT: submit_safe_respawn_request.rpc_id( 1, - [entry_position.x, entry_position.y, entry_position.z] + [ + entry_position.x, + entry_position.y, + entry_position.z, + _input_sequence, + ] ) @@ -2837,9 +2894,18 @@ func submit_safe_respawn_request(position_data: Array) -> void: if ( not is_host() or not _registry.has_peer(sender_id) - or position_data.size() != 3 + or position_data.size() not in [3, 4] ): return + var recovery_input_sequence: int = -1 + if position_data.size() == 4: + if ( + typeof(position_data[3]) != TYPE_INT + or int(position_data[3]) < 0 + or int(position_data[3]) > MAX_MOVEMENT_INPUT_SEQUENCE + ): + return + recovery_input_sequence = int(position_data[3]) var entry_position := Vector3( float(position_data[0]), float(position_data[1]), @@ -2847,7 +2913,11 @@ func submit_safe_respawn_request(position_data: Array) -> void: ) if not entry_position.is_finite(): return - remote_recovery_requested.emit(sender_id, entry_position) + remote_recovery_requested.emit( + sender_id, + entry_position, + recovery_input_sequence, + ) @rpc("authority", "call_remote", "reliable", 0) @@ -2856,8 +2926,38 @@ func receive_authoritative_teleport(snapshot: Dictionary) -> void: return var peer_id: int = int(snapshot.get("peer_id", 0)) var avatar: Player = _spawn_service.get_avatar(peer_id) - if avatar != null: - avatar.apply_network_teleport(snapshot) + if avatar == null or not avatar.apply_network_teleport(snapshot): + return + if peer_id != multiplayer.get_unique_id(): + return + _begin_local_authoritative_teleport_barrier( + avatar, + int(snapshot.get("acknowledged_input", 0)), + ) + + +func _begin_local_authoritative_teleport_barrier( + avatar: Player, + acknowledged_input: int, +) -> void: + if avatar == null or not avatar.global_position.is_finite(): + return + # A recovery teleport is a movement discontinuity, just like a home-space + # transition. Drop pre-teleport client prediction and request an immediate + # neutral input so the first post-teleport audit is unambiguous. + _pending_movement_inputs.clear() + _last_local_snapshot_received_msec = 0 + _last_input_state_hash = 0 + _idle_input_accumulator = IDLE_INPUT_INTERVAL + avatar.reset_local_prediction_after_authoritative_teleport() + _local_authoritative_teleport_guard_active = true + _local_authoritative_teleport_guard_position = avatar.global_position + _local_authoritative_teleport_minimum_ack = maxi(acknowledged_input, 0) + # Water recovery has already suppressed local movement, so this sends a + # neutral post-relocation input on the next server tick instead of waiting + # for the regular input cadence. + if avatar.is_water_recovery_active(): + submit_neutral_local_movement() func _expire_pending_authentication(now: float) -> void: @@ -2987,6 +3087,9 @@ func _teardown_peer() -> void: _local_space_transition_guard_active = false _local_space_transition_guard_position = Vector3.ZERO _local_space_transition_minimum_ack = 0 + _local_authoritative_teleport_guard_active = false + _local_authoritative_teleport_guard_position = Vector3.ZERO + _local_authoritative_teleport_minimum_ack = 0 _animation_refresh_accumulator = 0.0 _last_animation_state_by_peer.clear() _pending_animation_state_by_peer.clear() diff --git a/player/net_attachment.gd b/player/net_attachment.gd index 3c7843a..4ca210f 100644 --- a/player/net_attachment.gd +++ b/player/net_attachment.gd @@ -79,10 +79,10 @@ func get_impact_world_position() -> Vector3: func _sync_spring_activity() -> void: if _spring == null: return - var is_visible := _catching_net.is_visible_in_tree() - if is_visible and not _spring_was_visible: + var net_is_visible: bool = _catching_net.is_visible_in_tree() + if net_is_visible and not _spring_was_visible: _spring.active = true _spring.reset() - elif not is_visible: + elif not net_is_visible: _spring.active = false - _spring_was_visible = is_visible + _spring_was_visible = net_is_visible diff --git a/player/player.gd b/player/player.gd index 78dac3d..54bfa49 100644 --- a/player/player.gd +++ b/player/player.gd @@ -531,6 +531,7 @@ var _network_sprint: bool = false var _network_sneak: bool = false var _network_slow_walk: bool = false var _last_network_input_sequence: int = 0 +var _authoritative_relocation_input_quarantine: bool = false var _network_input_age: float = 0.0 var _network_input_stale: bool = false var _network_input_stale_timeout_seconds: float = ( @@ -1383,7 +1384,7 @@ func _update_character_animation() -> void: var is_sneaking_pose: bool = ( locomotion_state == LocomotionState.SNEAKING ) - var is_moving_horizontally: bool = ( + var is_presented_moving_horizontally: bool = ( _is_presented_moving_horizontally() ) var animation_action: Dictionary = _get_presented_animation_action() @@ -1500,7 +1501,7 @@ func _update_character_animation() -> void: &"idle_loop_sit", ] elif is_sneaking_pose: - if is_moving_horizontally: + if is_presented_moving_horizontally: requested_animation = [ CHARACTER_SNEAKING_ANIMATION, CHARACTER_WALKING_ANIMATION, @@ -1787,6 +1788,11 @@ func apply_network_sitting_state(should_sit: bool) -> void: func apply_authoritative_network_sitting_state(should_sit: bool) -> void: + # Reliable animation updates use a separate channel from movement input. + # Never let a delayed seated state re-arm motion while a recovery relocation + # is still waiting for its explicit post-relocation neutral input. + if _water_recovery_active or _authoritative_relocation_input_quarantine: + return if should_sit and ( not _can_begin_sitting() or _network_jump_pending ): @@ -2149,6 +2155,7 @@ func reset_network_movement_state() -> void: _network_sprint = false _network_sneak = false _network_slow_walk = false + _authoritative_relocation_input_quarantine = false _network_input_age = 0.0 _network_input_stale = false _network_input_stale_timeout_seconds = NETWORK_INPUT_STALE_TIMEOUT_SECONDS @@ -2161,6 +2168,53 @@ func reset_network_movement_state() -> void: _local_prediction_largest_error = 0.0 +func neutralize_authoritative_input_for_relocation( + recovery_input_sequence: int = -1, +) -> void: + # A host-side relocation must not inherit a held movement input from the + # previous position. The client stamps its reliable recovery request with + # the most recent input sequence it created; every lower sequence was made + # before that request, even if it arrives on the movement channel later. + # Keep that watermark in the acknowledgement and accept movement only after + # an explicit neutral packet beyond it. + var acknowledged_input: int = maxi( + _last_network_input_sequence, + maxi(recovery_input_sequence, 0), + ) + reset_network_movement_state() + _last_network_input_sequence = acknowledged_input + _authoritative_relocation_input_quarantine = true + _clear_authoritative_network_motion_intent() + velocity = Vector3.ZERO + + +func _clear_authoritative_network_motion_intent() -> void: + _network_axis = Vector2.ZERO + _network_jump_pending = false + _network_jump_intent_active = false + _network_sprint = false + _network_sneak = false + _network_slow_walk = false + _sit_after_landing = false + _set_sitting(false) + _apply_network_casting(false) + + +func _is_neutral_authoritative_network_input(data: Dictionary) -> bool: + var axis: Array = data.get("axis", []) + if axis.size() != 2: + return false + # Sprint/sneak/slow-walk modifiers alone cannot move the avatar. Letting a + # held modifier through preserves a responsive recovery while still requiring + # zero movement, jump, sitting, and fishing state at the relocation barrier. + return ( + Vector2(float(axis[0]), float(axis[1])).length_squared() <= 0.0025 + and not bool(data.get("jump", false)) + and not bool(data.get("sitting", false)) + and not bool(data.get("casting", false)) + ) + + func apply_network_space_transition( target_transform: Transform3D, align_local_camera: bool, @@ -2315,8 +2369,17 @@ func apply_authoritative_network_input( NETWORK_INPUT_STALE_TIMEOUT_SECONDS, NETWORK_INPUT_STALE_TIMEOUT_MAX_SECONDS, ) - _network_axis = Vector2(float(axis[0]), float(axis[1])).limit_length(1.0) _network_camera_yaw = float(data.get("camera_yaw", 0.0)) + if _water_recovery_active or _authoritative_relocation_input_quarantine: + var clears_relocation_quarantine: bool = ( + _authoritative_relocation_input_quarantine + and _is_neutral_authoritative_network_input(data) + ) + _clear_authoritative_network_motion_intent() + if clears_relocation_quarantine: + _authoritative_relocation_input_quarantine = false + return + _network_axis = Vector2(float(axis[0]), float(axis[1])).limit_length(1.0) var jump_intent_active: bool = bool(data.get("jump", false)) if jump_intent_active and not _network_jump_intent_active: _network_jump_pending = true @@ -2365,6 +2428,8 @@ func apply_network_animation_state(state: Dictionary) -> void: func apply_authoritative_network_animation_action( action_state: Dictionary, ) -> void: + if _water_recovery_active or _authoritative_relocation_input_quarantine: + return if not NetworkPlayerAnimationProtocol.validate_action_state(action_state): return var incoming_sequence: int = int(action_state["sequence"]) @@ -2438,6 +2503,13 @@ func apply_local_prediction_correction( var parsed: Dictionary = _parse_network_snapshot(snapshot) if parsed.is_empty(): return + # Water recovery owns the local transform until its reliable respawn + # teleport arrives. Ordinary movement audits may have been authored before + # the recovery presentation reached the host, so ignore every one of their + # fields while recovery is active. + if _water_recovery_active: + _reset_local_prediction_error() + return var acknowledged_input: int = parsed["acknowledged_input"] var sitting_intent_acknowledged: bool = ( _sitting_intent_pending @@ -2717,10 +2789,10 @@ static func resolve_local_prediction_transit_seconds( ) -func apply_network_teleport(snapshot: Dictionary) -> void: +func apply_network_teleport(snapshot: Dictionary) -> bool: var parsed: Dictionary = _parse_network_snapshot(snapshot) if parsed.is_empty(): - return + return false global_position = parsed["position"] velocity = parsed["velocity"] _visuals.rotation.y = parsed["visual_yaw"] @@ -2733,6 +2805,13 @@ func apply_network_teleport(snapshot: Dictionary) -> void: _apply_network_target_animation_state(parsed["animation_state"]) _network_snapshot_age = 0.0 _network_snapshot_ready = true + return true + + +func reset_local_prediction_after_authoritative_teleport() -> void: + _clear_local_network_jump_intent() + _reset_local_prediction_error() + _clear_local_reconciliation_offsets() func _parse_network_snapshot(snapshot: Dictionary) -> Dictionary: @@ -3070,16 +3149,18 @@ func is_movement_enabled() -> bool: return _movement_enabled -func set_local_input_suppressed(owner: StringName, suppressed: bool) -> void: - if owner.is_empty(): +func set_local_input_suppressed( + suppressor_id: StringName, suppressed: bool +) -> void: + if suppressor_id.is_empty(): return if suppressed: - _local_input_suppressors[owner] = true + _local_input_suppressors[suppressor_id] = true velocity.x = 0.0 velocity.z = 0.0 _set_camera_dragging(false) else: - _local_input_suppressors.erase(owner) + _local_input_suppressors.erase(suppressor_id) func _is_movement_input_enabled() -> bool: @@ -3101,16 +3182,16 @@ func set_camera_input_enabled(enabled: bool) -> void: func set_camera_input_suppressed( - owner: StringName, + suppressor_id: StringName, suppressed: bool, ) -> void: - if owner.is_empty(): + if suppressor_id.is_empty(): return if suppressed: - _camera_input_suppressors[owner] = true + _camera_input_suppressors[suppressor_id] = true _set_camera_dragging(false) else: - _camera_input_suppressors.erase(owner) + _camera_input_suppressors.erase(suppressor_id) func set_camera_active(active: bool) -> void: @@ -3198,6 +3279,8 @@ func is_camera_input_enabled() -> bool: func set_water_recovery_active(active: bool) -> void: _water_recovery_active = active + if active: + _clear_authoritative_network_motion_intent() velocity = Vector3.ZERO @@ -3374,8 +3457,8 @@ func set_active_item_is_rod( if _showcase_rod_state_stored: _showcase_rod_visibility = active_is_rod return - var visibility_changed: bool = _fishing_rod.visible != active_is_rod - if not animate_transition or not visibility_changed: + var rod_visibility_changed: bool = _fishing_rod.visible != active_is_rod + if not animate_transition or not rod_visibility_changed: _fishing_rod.visible = active_is_rod return if _has_held_show_item() or _showcase_animation_active: diff --git a/player/sprint_dust_trail.gd b/player/sprint_dust_trail.gd index 124b6ae..16422ad 100644 --- a/player/sprint_dust_trail.gd +++ b/player/sprint_dust_trail.gd @@ -156,24 +156,24 @@ func _initialize_pool() -> void: func _spawn_puff(source_position: Vector3, direction: Vector3) -> void: var lateral := Vector3(-direction.z, 0.0, direction.x) - var position := ( + var puff_position := ( source_position - direction * PUFF_BACK_OFFSET + lateral * PUFF_SIDE_OFFSET * _foot_side + Vector3.UP * PUFF_HEIGHT ) - _spawn_puff_at(position) + _spawn_puff_at(puff_position) _foot_side *= -1.0 func _spawn_puff_at( - position: Vector3, + puff_position: Vector3, size_multiplier: float = 1.0, ) -> void: var variation: float = _stable_variation(_spawn_serial) var second_variation: float = _stable_variation(_spawn_serial + 37) var index: int = _next_puff - _puff_positions[index] = position + _puff_positions[index] = puff_position _puff_ages[index] = 0.0 _puff_widths[index] = ( lerpf(0.34, 0.43, variation) * size_multiplier diff --git a/scripts/normalize_texture_imports.gd b/scripts/normalize_texture_imports.gd index e7b2406..edea5b1 100644 --- a/scripts/normalize_texture_imports.gd +++ b/scripts/normalize_texture_imports.gd @@ -56,8 +56,8 @@ func _initialize() -> void: quit(2) return - for root: String in roots: - var normalized_root := root + for root_path: String in roots: + var normalized_root := root_path if not normalized_root.ends_with("/"): normalized_root += "/" if not normalized_root.begins_with("res://") and not normalized_root.is_absolute_path(): diff --git a/settings/player_settings.gd b/settings/player_settings.gd index 59099fc..5734925 100644 --- a/settings/player_settings.gd +++ b/settings/player_settings.gd @@ -101,7 +101,7 @@ func copy() -> PlayerSettings: func normalize_implicit_presentation_layout() -> bool: if presentation_layout_customized: return false - var changed: bool = ( + var layout_changed: bool = ( chat_dock_right != DEFAULT_CHAT_DOCK_RIGHT or chat_mobile_mode != DEFAULT_CHAT_MOBILE_MODE or paint_dock_right != DEFAULT_PAINT_DOCK_RIGHT @@ -109,7 +109,7 @@ func normalize_implicit_presentation_layout() -> bool: chat_dock_right = DEFAULT_CHAT_DOCK_RIGHT chat_mobile_mode = DEFAULT_CHAT_MOBILE_MODE paint_dock_right = DEFAULT_PAINT_DOCK_RIGHT - return changed + return layout_changed static func _is_valid_audio_volume(value: float) -> bool: diff --git a/tests/android_readiness_validation.gd b/tests/android_readiness_validation.gd index 7472063..372051a 100644 --- a/tests/android_readiness_validation.gd +++ b/tests/android_readiness_validation.gd @@ -44,18 +44,20 @@ func _init() -> void: assert(_has_joypad_button(&"open_quick_actions", JOY_BUTTON_DPAD_DOWN)) assert(_has_joypad_button(&"open_chat", JOY_BUTTON_BACK)) assert(_has_joypad_button(&"focus_gameplay", JOY_BUTTON_LEFT_SHOULDER)) - assert( - GameUIType.VIRTUAL_MOUSE_TRIGGER_AXIS == JOY_AXIS_TRIGGER_RIGHT - ) - assert( + var virtual_mouse_trigger_axis: int = GameUIType.VIRTUAL_MOUSE_TRIGGER_AXIS + var virtual_mouse_shared_trigger_axis: int = ( GameUIType.VIRTUAL_MOUSE_SHARED_TRIGGER_AXIS - == JOY_AXIS_TRIGGER_LEFT ) - assert( + var virtual_mouse_secondary_click_axis: int = ( GameUIType.VIRTUAL_MOUSE_SECONDARY_CLICK_AXIS - == JOY_AXIS_TRIGGER_LEFT ) - assert(PlayerType.CONTROLLER_ZOOM_TRIGGER_AXIS == JOY_AXIS_TRIGGER_LEFT) + var controller_zoom_trigger_axis: int = ( + PlayerType.CONTROLLER_ZOOM_TRIGGER_AXIS + ) + assert(virtual_mouse_trigger_axis == JOY_AXIS_TRIGGER_RIGHT) + assert(virtual_mouse_shared_trigger_axis == JOY_AXIS_TRIGGER_LEFT) + assert(virtual_mouse_secondary_click_axis == JOY_AXIS_TRIGGER_LEFT) + assert(controller_zoom_trigger_axis == JOY_AXIS_TRIGGER_LEFT) assert(is_zero_approx( GameUIType.normalized_trigger_strength(-1.0, -1.0) )) diff --git a/tests/character_rig_validation.gd b/tests/character_rig_validation.gd index 2aece2b..95af5b7 100644 --- a/tests/character_rig_validation.gd +++ b/tests/character_rig_validation.gd @@ -112,7 +112,9 @@ func _validate_mesh_weights(mesh_instance: MeshInstance3D) -> int: var vertices: PackedVector3Array = arrays[Mesh.ARRAY_VERTEX] assert(not weights.is_empty()) assert(not vertices.is_empty()) - var components_per_vertex := weights.size() / vertices.size() + var components_per_vertex: int = int( + float(weights.size()) / float(vertices.size()) + ) assert(components_per_vertex == 4 or components_per_vertex == 8) for offset in range(0, weights.size(), components_per_vertex): var total := 0.0 diff --git a/tests/controller_mapping_validation.gd b/tests/controller_mapping_validation.gd index a5938d6..fcbf7e3 100644 --- a/tests/controller_mapping_validation.gd +++ b/tests/controller_mapping_validation.gd @@ -367,13 +367,13 @@ func _validate_auto_map(manager: ControllerMappingManagerType) -> String: if str(binding.get("kind", "")) == "button": var button := InputEventJoypadButton.new() button.device = manager.get_active_device_id() - button.button_index = int(binding.get("button", -1)) + button.button_index = int(binding.get("button", -1)) as JoyButton button.pressed = true manager.controller_input_observed.emit(button) else: var motion := InputEventJoypadMotion.new() motion.device = manager.get_active_device_id() - motion.axis = int(binding.get("axis", -1)) + motion.axis = int(binding.get("axis", -1)) as JoyAxis motion.axis_value = float(binding.get("direction", -1.0)) manager.controller_input_observed.emit(motion) if panel._auto_map_active: diff --git a/tests/controller_menu_accessibility_validation.gd b/tests/controller_menu_accessibility_validation.gd index 37e43d5..283290a 100644 --- a/tests/controller_menu_accessibility_validation.gd +++ b/tests/controller_menu_accessibility_validation.gd @@ -2015,7 +2015,7 @@ func _assert_neighbor( % [ origin.name, property, - actual.name if actual != null else "nothing", + str(actual.name) if actual != null else "nothing", expected.name, ], ) diff --git a/tests/dedicated_server_config_validation.gd b/tests/dedicated_server_config_validation.gd index 2125220..5cff1bb 100644 --- a/tests/dedicated_server_config_validation.gd +++ b/tests/dedicated_server_config_validation.gd @@ -21,10 +21,16 @@ func _run() -> void: assert(not bool(defaults.get("public_listing"))) assert(not bool(defaults.get("chat_logging"))) assert(str(defaults.get("chat_log_path")).is_empty()) - assert(NetworkChatService.BURST_COUNT == 3) - assert(NetworkChatService.WINDOW_COUNT == 5) - assert(is_equal_approx(NetworkChatService.WINDOW_SECONDS, 10.0)) - assert(NetworkChatService.CALL_COOLDOWN_MILLISECONDS == 90) + var chat_burst_count: int = NetworkChatService.BURST_COUNT + var chat_window_count: int = NetworkChatService.WINDOW_COUNT + var chat_window_seconds: float = NetworkChatService.WINDOW_SECONDS + var chat_call_cooldown_milliseconds: int = ( + NetworkChatService.CALL_COOLDOWN_MILLISECONDS + ) + assert(chat_burst_count == 3) + assert(chat_window_count == 5) + assert(is_equal_approx(chat_window_seconds, 10.0)) + assert(chat_call_cooldown_milliseconds == 90) var path: String = ProjectSettings.globalize_path( "user://dedicated-server-validation.cfg" @@ -156,14 +162,17 @@ func _run() -> void: str(discovery.call("_default_room_name", "River")) == "River's Server" ) - assert( + var upnp_renew_interval_seconds: float = ( DiscoveryClient.UPNP_RENEW_INTERVAL_SECONDS - < float(DiscoveryClient.UPNP_MAPPING_DURATION_SECONDS) ) - assert( + var upnp_mapping_duration_seconds: float = float( + DiscoveryClient.UPNP_MAPPING_DURATION_SECONDS + ) + var upnp_retry_interval_seconds: float = ( DiscoveryClient.UPNP_RETRY_INTERVAL_SECONDS - < DiscoveryClient.UPNP_RENEW_INTERVAL_SECONDS ) + assert(upnp_renew_interval_seconds < upnp_mapping_duration_seconds) + assert(upnp_retry_interval_seconds < upnp_renew_interval_seconds) var discovery_settings_path: String = ProjectSettings.globalize_path( DiscoveryClient.SETTINGS_PATH ) diff --git a/tests/economy_regression_validation.gd b/tests/economy_regression_validation.gd index 0728d82..1bb6409 100644 --- a/tests/economy_regression_validation.gd +++ b/tests/economy_regression_validation.gd @@ -76,7 +76,7 @@ func _run() -> void: assert(session.set_host_open(false)) await _test_host_shop_purchase(main, player, shop_service) - await _test_host_rod_purchase(player, shop_service) + _test_host_rod_purchase(player, shop_service) await _test_host_art_shop_purchase(main, player, shop_service) await _test_fishing_shop_sale_ui( main, player, catalog, sale_service, reservations diff --git a/tests/file_dialog_controller_navigation_validation.gd b/tests/file_dialog_controller_navigation_validation.gd index 7ac8df9..03b4e6a 100644 --- a/tests/file_dialog_controller_navigation_validation.gd +++ b/tests/file_dialog_controller_navigation_validation.gd @@ -34,20 +34,20 @@ func _run() -> void: var root_controls: Array[Control] = ( FileDialogControllerNavigationType.interactive_controls(root_scope) ) - var directory_list: ItemList - var parent_button: Button - var create_folder_button: Button - var path_edit: LineEdit - var drive_button: MenuButton - var refresh_button: Button - var favorite_button: Button - var hidden_button: Button - var grid_button: Button - var list_button: Button - var filter_button: Button - var sort_button: MenuButton - var cancel_button: Button - var select_button: Button + var directory_list: ItemList = null + var parent_button: Button = null + var create_folder_button: Button = null + var path_edit: LineEdit = null + var drive_button: MenuButton = null + var refresh_button: Button = null + var favorite_button: Button = null + var hidden_button: Button = null + var grid_button: Button = null + var list_button: Button = null + var filter_button: Button = null + var sort_button: MenuButton = null + var cancel_button: Button = null + var select_button: Button = null for control: Control in root_controls: if ( control is ItemList diff --git a/tests/fish_hotbar_showcase_validation.gd b/tests/fish_hotbar_showcase_validation.gd index af3644b..77f6ed6 100644 --- a/tests/fish_hotbar_showcase_validation.gd +++ b/tests/fish_hotbar_showcase_validation.gd @@ -200,15 +200,17 @@ func _run() -> void: var invalid_state: Dictionary = valid_state.duplicate(true) invalid_state["display_scale"] = 1000.0 assert(not NetworkFishShowcaseProtocol.validate_state(invalid_state)) - assert(NetworkProtocol.PROTOCOL_VERSION == 12) - assert(NetworkProtocol.ENET_CHANNEL_COUNT == 18) + var protocol_version: int = NetworkProtocol.PROTOCOL_VERSION + var enet_channel_count: int = NetworkProtocol.ENET_CHANNEL_COUNT + var fish_quality_capability: String = NetworkProtocol.FISH_QUALITY_CAPABILITY + var showcase_capability: StringName = NetworkFishShowcaseProtocol.CAPABILITY + assert(protocol_version == 12) + assert(enet_channel_count == 18) assert( - NetworkProtocol.FISH_QUALITY_CAPABILITY - == "fish_quality_v1" + fish_quality_capability == "fish_quality_v1" ) assert( - NetworkFishShowcaseProtocol.CAPABILITY - == &"fish_showcase_v1" + showcase_capability == &"fish_showcase_v1" ) print("Fish hotbar showcase validation: PASS") diff --git a/tests/fish_quality_validation.gd b/tests/fish_quality_validation.gd index 99a2169..4be1ffc 100644 --- a/tests/fish_quality_validation.gd +++ b/tests/fish_quality_validation.gd @@ -26,18 +26,28 @@ func _run() -> void: _validate_collection_mastery() _validate_version_four_migration() _validate_fishing_protocol_v2() - assert(NetworkProtocol.PROTOCOL_VERSION == 12) - assert(NetworkProtocol.ENET_CHANNEL_COUNT == 18) - assert(NetworkProtocol.MOVEMENT_ANIMATION_CHANNEL == 11) - assert( + var protocol_version: int = NetworkProtocol.PROTOCOL_VERSION + var enet_channel_count: int = NetworkProtocol.ENET_CHANNEL_COUNT + var movement_animation_channel: int = ( + NetworkProtocol.MOVEMENT_ANIMATION_CHANNEL + ) + var movement_reconciliation_capability: String = ( NetworkProtocol.MOVEMENT_RECONCILIATION_CAPABILITY - == "movement_reconciliation_v2" + ) + var fishing_replication_capability: String = ( + NetworkProtocol.FISHING_REPLICATION_CAPABILITY + ) + var fish_quality_capability: String = NetworkProtocol.FISH_QUALITY_CAPABILITY + assert(protocol_version == 12) + assert(enet_channel_count == 18) + assert(movement_animation_channel == 11) + assert( + movement_reconciliation_capability == "movement_reconciliation_v2" ) assert( - NetworkProtocol.FISHING_REPLICATION_CAPABILITY - == "fishing_replication_v2" + fishing_replication_capability == "fishing_replication_v2" ) - assert(NetworkProtocol.FISH_QUALITY_CAPABILITY == "fish_quality_v1") + assert(fish_quality_capability == "fish_quality_v1") print("Fish quality validation: PASS") quit() @@ -71,11 +81,17 @@ func _validate_fishing_protocol_v2() -> void: NetworkFishingProtocol.validate_cast_request(invalid_sequence) == "Fishing request values are outside allowed limits." ) - assert(NetworkFishingProtocol.OBSERVER_SNAPSHOT_CHANNEL == 10) - assert(NetworkWorldSpawnProtocol.SNAPSHOT_CHANNEL == 15) - assert( + var observer_snapshot_channel: int = ( + NetworkFishingProtocol.OBSERVER_SNAPSHOT_CHANNEL + ) + var world_spawn_snapshot_channel: int = ( NetworkWorldSpawnProtocol.SNAPSHOT_CHANNEL - != NetworkFishingProtocol.SNAPSHOT_CHANNEL + ) + var fishing_snapshot_channel: int = NetworkFishingProtocol.SNAPSHOT_CHANNEL + assert(observer_snapshot_channel == 10) + assert(world_spawn_snapshot_channel == 15) + assert( + world_spawn_snapshot_channel != fishing_snapshot_channel ) @@ -240,10 +256,14 @@ func _validate_barrier_challenge_curve() -> void: func _validate_fight_pacing_and_reel_upgrades() -> void: - assert(is_equal_approx(CatchController.CHASE_SPEED, 0.07)) - assert(is_equal_approx(CatchController.CHASE_START_DELAY, 1.5)) - assert(is_equal_approx(CatchController.CHASE_START_OFFSET, 0.04)) - assert(is_equal_approx(Player.BASE_REEL_SPEED, 0.16)) + var chase_speed: float = CatchController.CHASE_SPEED + var chase_start_delay: float = CatchController.CHASE_START_DELAY + var chase_start_offset: float = CatchController.CHASE_START_OFFSET + var base_reel_speed: float = Player.BASE_REEL_SPEED + assert(is_equal_approx(chase_speed, 0.07)) + assert(is_equal_approx(chase_start_delay, 1.5)) + assert(is_equal_approx(chase_start_offset, 0.04)) + assert(is_equal_approx(base_reel_speed, 0.16)) var upgrades := PlayerFishingUpgrades.new() assert(is_equal_approx(upgrades.get_reel_speed_multiplier(), 1.0)) diff --git a/tests/fishing_authority_validation.gd b/tests/fishing_authority_validation.gd index b3c17dd..ec3320b 100644 --- a/tests/fishing_authority_validation.gd +++ b/tests/fishing_authority_validation.gd @@ -277,6 +277,28 @@ func _run() -> void: water_recovery.call("_finish_recovery") assert(player.is_movement_enabled()) + # Session/world teardown can interrupt the fade before its normal completion. + # Recovery must still release FishingSpot's external input lock without + # restoring movement that gameplay shutdown already disabled. + water_recovery.call( + "_on_recovery_requested", + player, + player.global_position.y, + ) + assert(water_recovery.is_recovery_active()) + var screen_fade := game_ui.get_screen_fade() as ScreenFade + assert(screen_fade != null) + screen_fade.fade_to_black(int(water_recovery.get("_generation"))) + water_recovery.set_recovery_enabled(false) + assert(not water_recovery.is_recovery_active()) + assert(not player.is_water_recovery_active()) + assert(not bool(fishing_spot.get("_external_input_blocked"))) + assert(not player.is_movement_enabled()) + assert(not screen_fade.visible) + water_recovery.set_recovery_enabled(true) + player.set_movement_enabled(true) + player.set_camera_input_enabled(true) + print("Fishing authority validation: PASS") session.disconnect_session("") main.queue_free() diff --git a/tests/fishing_multiplayer_validation.gd b/tests/fishing_multiplayer_validation.gd index 9d7ef7f..667d87e 100644 --- a/tests/fishing_multiplayer_validation.gd +++ b/tests/fishing_multiplayer_validation.gd @@ -271,7 +271,6 @@ func _run_client() -> void: assert(player.global_position.distance_to(exterior_spawn.origin) > 1.0) for _frame: int in 2: await physics_frame - var expected_position: Vector3 = player.global_position var expected_direction: Vector3 = player.get_facing_direction() player.set_casting_visual() diff --git a/tests/gathering_marker_surface_validation.gd b/tests/gathering_marker_surface_validation.gd index 72f15f0..4ec5429 100644 --- a/tests/gathering_marker_surface_validation.gd +++ b/tests/gathering_marker_surface_validation.gd @@ -59,11 +59,11 @@ func _run() -> void: wall.queue_free() await process_frame - var floor := _make_surface( + var floor_surface := _make_surface( Vector3(10.0, 0.2, 10.0), Vector3(0.0, -0.1, -1.7), ) - root.add_child(floor) + root.add_child(floor_surface) await physics_frame controller.call("_update_marker_target") assert(bool(controller.get("_marker_has_surface"))) @@ -80,7 +80,7 @@ func _run() -> void: ) ) - floor.queue_free() + floor_surface.queue_free() controller.queue_free() player.queue_free() await process_frame diff --git a/tests/generated_world_runtime_validation.gd b/tests/generated_world_runtime_validation.gd index 076f1c9..ac2f61a 100644 --- a/tests/generated_world_runtime_validation.gd +++ b/tests/generated_world_runtime_validation.gd @@ -18,6 +18,12 @@ const Gatherables: GatherableCatalog = preload( const PrecipitationOcclusionType = preload( "res://world/environment/precipitation_occlusion.gd" ) +const FOLIAGE_WIND_SHADER: Shader = preload( + "res://world/materials/foliage_wind.gdshader" +) +const FOLIAGE_WIND_SOURCE_MATERIALS_META: StringName = ( + &"foliage_wind_source_materials" +) const FIRST_SEED := 13001 const SECOND_SEED := 13002 const RIVER_FALLBACK_SEED := 13012 @@ -130,8 +136,8 @@ func _validate_generated_region( var placements := generator.placement_keys() var expected_chunk_count := generator.grid_size.x * generator.grid_size.y var center := Vector2i( - generator.grid_size.x / 2, - generator.grid_size.y / 2, + int(float(generator.grid_size.x) / 2.0), + int(float(generator.grid_size.y) / 2.0), ) var center_index := center.y * generator.grid_size.x + center.x assert(generator.grid_size == Vector2i(20, 20)) @@ -341,7 +347,7 @@ func _validate_generated_region( ): var outlet_coordinate := Vector2i( index % generator.grid_size.x, - index / generator.grid_size.x, + int(float(index) / float(generator.grid_size.x)), ) outlet_coordinates.append(outlet_coordinate) assert( @@ -366,7 +372,7 @@ func _validate_generated_region( for index: int in placements.size(): var coordinate := Vector2i( index % generator.grid_size.x, - index / generator.grid_size.x, + int(float(index) / float(generator.grid_size.x)), ) if placements[index].begins_with("chunk_0001@"): assert(generator._distance_from_map_boundary(coordinate) <= 1) @@ -587,8 +593,8 @@ func _validate_generated_region( Vector2i.ZERO, ) var spawn_coordinate := Vector2i( - generator.grid_size.x / 2, - generator.grid_size.y / 2, + int(float(generator.grid_size.x) / 2.0), + int(float(generator.grid_size.y) / 2.0), ) var spawn_distance := ( absi(coordinate.x - spawn_coordinate.x) @@ -1146,8 +1152,8 @@ func _validate_biome_catalog( for biome_id: StringName in EXPECTED_BIOME_IDS: assert(counts.get(biome_id, 0) > 0) var center := Vector2i( - generator.grid_size.x / 2, - generator.grid_size.y / 2, + int(float(generator.grid_size.x) / 2.0), + int(float(generator.grid_size.y) / 2.0), ) assert(region.get_biome_at(center) == &"biome_plains") for child: Node in generator.get_generated_chunks_root().get_children(): @@ -1504,12 +1510,27 @@ func _has_material_variant_override( return false var mesh_instance := root_node as MeshInstance3D if mesh_instance != null and mesh_instance.mesh != null: + var source_materials: Dictionary = mesh_instance.get_meta( + FOLIAGE_WIND_SOURCE_MATERIALS_META, + {}, + ) for surface_index: int in mesh_instance.mesh.get_surface_count(): var override := mesh_instance.get_surface_override_material( surface_index ) if override != null and override in variants: return true + var wind_material := override as ShaderMaterial + if ( + wind_material != null + and wind_material.shader == FOLIAGE_WIND_SHADER + ): + var source_material: Material = source_materials.get( + surface_index, + null, + ) as Material + if source_material != null and source_material in variants: + return true for child: Node in root_node.get_children(): if _has_material_variant_override(child, variants): return true @@ -1647,7 +1668,7 @@ func _material_names(mesh_instance: MeshInstance3D) -> PackedStringArray: return result -func _validate_projected_terrain_materials(root: Node) -> void: +func _validate_projected_terrain_materials(projected_root: Node) -> void: var expected_sizes := { "grass_lite": 1.75, "sand": 2.6, @@ -1658,17 +1679,21 @@ func _validate_projected_terrain_materials(root: Node) -> void: "sand": 0, "dirt": 0, } - _validate_projected_material_node(root, expected_sizes, surface_counts) + _validate_projected_material_node( + projected_root, + expected_sizes, + surface_counts, + ) for material_name: String in expected_sizes: assert(surface_counts[material_name] > 0) func _validate_projected_material_node( - root: Node, + node: Node, expected_sizes: Dictionary, surface_counts: Dictionary, ) -> void: - var mesh_instance := root as MeshInstance3D + var mesh_instance := node as MeshInstance3D if mesh_instance != null and mesh_instance.mesh != null: for surface_index: int in mesh_instance.mesh.get_surface_count(): var material := mesh_instance.get_active_material(surface_index) @@ -1689,7 +1714,7 @@ func _validate_projected_material_node( ) ) surface_counts[material.resource_name] += 1 - for child: Node in root.get_children(): + for child: Node in node.get_children(): _validate_projected_material_node( child, expected_sizes, @@ -1708,8 +1733,10 @@ func _validate_pond_collision( var vertices := arrays[Mesh.ARRAY_VERTEX] as PackedVector3Array var normals := arrays[Mesh.ARRAY_NORMAL] as PackedVector3Array var indices := arrays[Mesh.ARRAY_INDEX] as PackedInt32Array - var triangle_count := ( - indices.size() / 3 if not indices.is_empty() else vertices.size() / 3 + var triangle_count: int = ( + int(float(indices.size()) / 3.0) + if not indices.is_empty() + else int(float(vertices.size()) / 3.0) ) for triangle_index: int in triangle_count: var offset := triangle_index * 3 diff --git a/tests/inventory_notepad_art_validation.gd b/tests/inventory_notepad_art_validation.gd index d871b49..505ade6 100644 --- a/tests/inventory_notepad_art_validation.gd +++ b/tests/inventory_notepad_art_validation.gd @@ -678,7 +678,7 @@ func _capture_inventory_pages(player_menu: PlayerMenu) -> void: player_menu.call("_show_section_immediate", sections[index]) await process_frame await process_frame - await _save_capture(suffixes[index]) + _save_capture(suffixes[index]) player_menu.call("_show_section_immediate", PlayerMenu.Section.BAG) var sale_confirmation := player_menu.get_node("%SaleConfirmation") as Control var confirmation_message := player_menu.get_node( @@ -693,7 +693,7 @@ func _capture_inventory_pages(player_menu: PlayerMenu) -> void: sale_confirmation.visible = true await process_frame await process_frame - await _save_capture("sale-confirmation") + _save_capture("sale-confirmation") sale_confirmation.visible = false diff --git a/tests/keyboard_mouse_mapping_validation.gd b/tests/keyboard_mouse_mapping_validation.gd index 1b95e01..112c7e9 100644 --- a/tests/keyboard_mouse_mapping_validation.gd +++ b/tests/keyboard_mouse_mapping_validation.gd @@ -38,16 +38,18 @@ func _run() -> void: KeyboardMouseMappingManagerType.ROLE_INTERACT ) == "e" ) - assert( + var zoom_in_label: String = str( KeyboardMouseMappingManagerType.ROLE_LABELS[ KeyboardMouseMappingManagerType.ROLE_CAMERA_ZOOM_IN - ] == "hotbar select (+SHIFT to zoom)" + ] ) - assert( + var zoom_out_label: String = str( KeyboardMouseMappingManagerType.ROLE_LABELS[ KeyboardMouseMappingManagerType.ROLE_CAMERA_ZOOM_OUT - ] == "hotbar select (+SHIFT to zoom)" + ] ) + assert(zoom_in_label == "hotbar select (+SHIFT to zoom)") + assert(zoom_out_label == "hotbar select (+SHIFT to zoom)") assert( str(defaults[ str(KeyboardMouseMappingManagerType.ROLE_PRIMARY_ACTION) diff --git a/tests/late_join_multiplayer_validation.gd b/tests/late_join_multiplayer_validation.gd index 6ea544f..aaaa343 100644 --- a/tests/late_join_multiplayer_validation.gd +++ b/tests/late_join_multiplayer_validation.gd @@ -293,25 +293,25 @@ func _wait_for_avatar_sitting( var deadline: int = Time.get_ticks_msec() + 10000 while Time.get_ticks_msec() < deadline: await process_frame - var avatar: Player = spawn_service.get_avatar(peer_id) - if avatar != null and avatar.is_sitting() == expected: + var observed_avatar: Player = spawn_service.get_avatar(peer_id) + if observed_avatar != null and observed_avatar.is_sitting() == expected: return true - var avatar: Player = spawn_service.get_avatar(peer_id) - if avatar != null: + var timed_out_avatar: Player = spawn_service.get_avatar(peer_id) + if timed_out_avatar != null: print( "sitting wait timed out: ", { "peer_id": peer_id, "expected": expected, - "sitting": avatar.is_sitting(), - "sit_after_landing": bool(avatar.get("_sit_after_landing")), - "on_floor": avatar.is_on_floor(), - "position": avatar.global_position, - "velocity": avatar.velocity, - "authoritative": bool(avatar.get( + "sitting": timed_out_avatar.is_sitting(), + "sit_after_landing": bool(timed_out_avatar.get("_sit_after_landing")), + "on_floor": timed_out_avatar.is_on_floor(), + "position": timed_out_avatar.global_position, + "velocity": timed_out_avatar.velocity, + "authoritative": bool(timed_out_avatar.get( "_network_authoritative_simulation" )), - "last_input": int(avatar.get( + "last_input": int(timed_out_avatar.get( "_last_network_input_sequence" )), }, diff --git a/tests/light_performance_profile_validation.gd b/tests/light_performance_profile_validation.gd index 6a654f1..5cb8df3 100644 --- a/tests/light_performance_profile_validation.gd +++ b/tests/light_performance_profile_validation.gd @@ -217,11 +217,11 @@ func _validate_new_game_music_transition(main: Node) -> void: func _first_fresh_water_visual(main: Node) -> MeshInstance3D: - var root := main.get_node( + var fresh_water_root := main.get_node( "TestWorld/Regions/GeneratedWorldRegion/WaterBodies/FreshWaterBodies" ) as Node3D - assert(root != null and root.get_child_count() > 0) - return root.get_child(0).get_node("VisualWater") as MeshInstance3D + assert(fresh_water_root != null and fresh_water_root.get_child_count() > 0) + return fresh_water_root.get_child(0).get_node("VisualWater") as MeshInstance3D func _validate_ocean_fishing_coverage( diff --git a/tests/logbook_validation.gd b/tests/logbook_validation.gd index 67747a5..941fbe6 100644 --- a/tests/logbook_validation.gd +++ b/tests/logbook_validation.gd @@ -545,7 +545,7 @@ func _validate_page() -> void: == "flathead\ncatfish" ) - var shared_material: Material + var shared_material: Material = null var silhouette_count: int = 0 var target_silhouette_area: float = ( LogbookPage.CATALOG_PORTRAIT_SIZE.x @@ -558,9 +558,9 @@ func _validate_page() -> void: ]: page.call("_select_category", category) await create_timer(0.25).timeout - var entries: Dictionary = page.get("_entry_buttons") + var category_entries: Dictionary = page.get("_entry_buttons") assert( - entries.size() + category_entries.size() == (108 if category == LogbookCatalog.Category.FRESH_WATER else 202) ) for fish: FishDataType in LogbookCatalog.ordered_species( @@ -571,7 +571,7 @@ func _validate_page() -> void: var unknown_key := StringName( "unknown_%d" % LogbookCatalog.catalog_number(fish) ) - var entry := entries.get(unknown_key) as Button + var entry := category_entries.get(unknown_key) as Button assert(entry != null) assert(entry.text.is_empty()) assert(entry.tooltip_text.is_empty()) diff --git a/tests/movement_multiplayer_validation.gd b/tests/movement_multiplayer_validation.gd index 05a668d..a59f703 100644 --- a/tests/movement_multiplayer_validation.gd +++ b/tests/movement_multiplayer_validation.gd @@ -34,6 +34,7 @@ func _validate_latency_smoothing() -> void: avatar.set_physics_process(false) _validate_compact_input_encoding() _validate_compact_snapshot_encoding() + _validate_authoritative_teleport_snapshot_guard() _validate_compact_animation_encoding() _validate_animation_action_ordering(avatar) _validate_transit_estimation() @@ -72,8 +73,12 @@ func _validate_compact_snapshot_encoding() -> void: Vector3(4.5, 0.0, 0.0), 1, ) - assert(NetworkSession.MOVEMENT_SNAPSHOT_BATCH_SIZE == 8) - assert(NetworkSession.OWNER_SNAPSHOT_DIVISOR == 3) + var movement_snapshot_batch_size: int = ( + NetworkSession.MOVEMENT_SNAPSHOT_BATCH_SIZE + ) + var owner_snapshot_divisor: int = NetworkSession.OWNER_SNAPSHOT_DIVISOR + assert(movement_snapshot_batch_size == 8) + assert(owner_snapshot_divisor == 3) var encoded_snapshots: Array = [] for _peer: int in NetworkSession.MOVEMENT_SNAPSHOT_BATCH_SIZE: encoded_snapshots.append( @@ -100,6 +105,50 @@ func _validate_compact_snapshot_encoding() -> void: ) +func _validate_authoritative_teleport_snapshot_guard() -> void: + var session := NetworkSession.new() + var destination := Vector3(24.0, 0.0, -8.0) + session.set("_local_authoritative_teleport_guard_active", true) + session.set("_local_authoritative_teleport_guard_position", destination) + session.set("_local_authoritative_teleport_minimum_ack", 48) + + # A channel-two audit from before the reliable relocation must not move the + # local player back to its old position. + assert(bool(session.call( + "_reject_stale_authoritative_teleport_snapshot", + _network_snapshot(Vector3.ZERO, Vector3.ZERO, 48), + ))) + assert(bool(session.get("_local_authoritative_teleport_guard_active"))) + assert(bool(session.call( + "_reject_stale_authoritative_teleport_snapshot", + _network_snapshot(destination, Vector3.ZERO, 47), + ))) + + # A matching audit from the new location clears the barrier. A higher + # acknowledgement at the old position is not sufficient: movement input and + # the reliable teleport travelled on different channels, so it can still be + # a held packet from before recovery. + assert(not bool(session.call( + "_reject_stale_authoritative_teleport_snapshot", + _network_snapshot(destination + Vector3.RIGHT, Vector3.ZERO, 48), + ))) + assert(not bool(session.get("_local_authoritative_teleport_guard_active"))) + session.set("_local_authoritative_teleport_guard_active", true) + session.set("_local_authoritative_teleport_guard_position", destination) + session.set("_local_authoritative_teleport_minimum_ack", 48) + assert(bool(session.call( + "_reject_stale_authoritative_teleport_snapshot", + _network_snapshot(Vector3.ZERO, Vector3.ZERO, 49), + ))) + assert(bool(session.get("_local_authoritative_teleport_guard_active"))) + assert(not bool(session.call( + "_reject_stale_authoritative_teleport_snapshot", + _network_snapshot(destination, Vector3.ZERO, 49), + ))) + assert(not bool(session.get("_local_authoritative_teleport_guard_active"))) + session.free() + + func _validate_compact_animation_encoding() -> void: var paused_state := NetworkPlayerAnimationProtocol.make_state( NetworkPlayerAnimationProtocol.LOCOMOTION_IDLE, @@ -315,16 +364,16 @@ func _validate_remote_snapshot_smoothing(avatar: Player) -> void: # Reconciliation only applies after both simulations report a grounded body. # Give the unit avatar a real floor so this exercises the production path. - var floor := StaticBody3D.new() - floor.collision_layer = 1 - floor.collision_mask = 0 - floor.position = Vector3(0.0, -0.1, 0.0) + var floor_body := StaticBody3D.new() + floor_body.collision_layer = 1 + floor_body.collision_mask = 0 + floor_body.position = Vector3(0.0, -0.1, 0.0) var floor_shape := CollisionShape3D.new() var floor_box := BoxShape3D.new() floor_box.size = Vector3(100.0, 0.2, 100.0) floor_shape.shape = floor_box - floor.add_child(floor_shape) - root.add_child(floor) + floor_body.add_child(floor_shape) + root.add_child(floor_body) await physics_frame avatar.set_local_control(true) avatar.global_position = Vector3(0.8, 0.0, 0.0) @@ -434,6 +483,24 @@ func _validate_remote_snapshot_smoothing(avatar: Player) -> void: int(avatar.get("_local_prediction_hard_corrections")) == 1 ) + # Recovery owns all local state until its reliable teleport arrives. A + # delayed audit must neither pull the body back nor acknowledge an old jump. + avatar.global_position = Vector3(10.0, 0.0, 0.0) + avatar.call("_queue_local_network_jump_intent") + avatar.capture_network_input(20) + avatar.set_water_recovery_active(true) + avatar.apply_local_prediction_correction( + drift_snapshot, + 20, + 1.0 / 30.0, + 0.0, + 0.1, + ) + assert(avatar.global_position == Vector3(10.0, 0.0, 0.0)) + assert(bool(avatar.get("_local_network_jump_intent_pending"))) + avatar.set_water_recovery_active(false) + avatar.call("_clear_local_network_jump_intent") + # Soft reconciliation must respect the same terrain collision as ordinary # player movement instead of phasing the capsule through a solid obstacle. var blocker := StaticBody3D.new() @@ -470,7 +537,7 @@ func _validate_remote_snapshot_smoothing(avatar: Player) -> void: == blocked_camera_position ) blocker.queue_free() - floor.queue_free() + floor_body.queue_free() await physics_frame @@ -567,6 +634,40 @@ func _validate_stale_input_expiry(avatar: Player) -> void: assert(not bool(avatar.get("_network_input_stale"))) assert((avatar.get("_network_axis") as Vector2).length_squared() > 0.0) + # The reliable recovery request carries the last client-created sequence. + # A host uses it as a hard watermark, so every delayed input from before the + # request is discarded even if it arrives after the teleport RPC. + avatar.neutralize_authoritative_input_for_relocation(44) + assert(int(avatar.get("_last_network_input_sequence")) == 44) + assert((avatar.get("_network_axis") as Vector2) == Vector2.ZERO) + assert(not bool(avatar.get("_network_sprint"))) + assert(bool(avatar.get("_authoritative_relocation_input_quarantine"))) + avatar.apply_authoritative_network_input(_movement_input(41, true)) + assert((avatar.get("_network_axis") as Vector2) == Vector2.ZERO) + avatar.apply_authoritative_network_input(_movement_input(42, false, false)) + assert(int(avatar.get("_last_network_input_sequence")) == 44) + + # A non-neutral post-watermark packet cannot restart motion. The first + # neutral packet past the watermark releases the barrier; the following + # input is the first one allowed to move the recovered avatar. + avatar.apply_authoritative_network_input(_movement_input(45, false, true)) + assert((avatar.get("_network_axis") as Vector2) == Vector2.ZERO) + assert(bool(avatar.get("_authoritative_relocation_input_quarantine"))) + avatar.apply_authoritative_network_input(_movement_input(46, false, false)) + assert(not bool(avatar.get("_authoritative_relocation_input_quarantine"))) + avatar.apply_authoritative_network_input(_movement_input(47, false, true)) + assert((avatar.get("_network_axis") as Vector2).length_squared() > 0.0) + + # Recovery itself also consumes incoming movement rather than remembering a + # held axis which could resume on the exact frame recovery presentation ends. + avatar.set_water_recovery_active(true) + avatar.apply_authoritative_network_input(_movement_input(48, false, true)) + assert((avatar.get("_network_axis") as Vector2) == Vector2.ZERO) + avatar.set_water_recovery_active(false) + avatar.apply_authoritative_network_input(_movement_input(42, false, false)) + avatar.apply_authoritative_network_input(_movement_input(49, false, true)) + assert((avatar.get("_network_axis") as Vector2).length_squared() > 0.0) + func _network_snapshot( position: Vector3, diff --git a/tests/on_screen_keyboard_validation.gd b/tests/on_screen_keyboard_validation.gd index a685c65..e5b05d6 100644 --- a/tests/on_screen_keyboard_validation.gd +++ b/tests/on_screen_keyboard_validation.gd @@ -307,13 +307,13 @@ func _validate_native_keyboard() -> void: await process_frame edit.grab_focus() assert(keyboard.is_open()) - var focus_exit_count: int = 0 + var focus_exit_state: Dictionary = {"count": 0} edit.focus_exited.connect(func() -> void: - focus_exit_count += 1 + focus_exit_state["count"] = int(focus_exit_state["count"]) + 1 ) assert(keyboard.request_for_control(edit)) assert(edit.has_focus()) - assert(focus_exit_count == 0) + assert(int(focus_exit_state["count"]) == 0) assert(not edit.virtual_keyboard_enabled) assert(not edit.virtual_keyboard_show_on_focus) assert(keyboard.shown_controls == [edit]) diff --git a/tests/shoreline_ribbon_validation.gd b/tests/shoreline_ribbon_validation.gd index e78acb0..e502d70 100644 --- a/tests/shoreline_ribbon_validation.gd +++ b/tests/shoreline_ribbon_validation.gd @@ -19,7 +19,7 @@ func _run() -> void: assert(not vertices.is_empty()) assert(vertices.size() % 2 == 0) assert(indices.size() == vertices.size() * 3) - var point_count := vertices.size() / 2 + var point_count: int = int(float(vertices.size()) / 2.0) var land_edge := PackedVector2Array() var water_edge := PackedVector2Array() for index: int in point_count: diff --git a/tests/surface_drawing_validation.gd b/tests/surface_drawing_validation.gd index ac48a67..50ec1ba 100644 --- a/tests/surface_drawing_validation.gd +++ b/tests/surface_drawing_validation.gd @@ -40,13 +40,16 @@ func _validate_palette() -> void: func _validate_protocol_bounds() -> void: - assert(SurfaceDrawingProtocol.GRID_WIDTH == 16) - assert(SurfaceDrawingProtocol.GRID_HEIGHT == 16) - assert(SurfaceDrawingProtocol.GRID_SIZES == [16, 32, 64, 128]) - assert(is_equal_approx(SurfaceDrawingProtocol.CELL_SIZE, 0.075)) + var grid_width: int = SurfaceDrawingProtocol.GRID_WIDTH + var grid_height: int = SurfaceDrawingProtocol.GRID_HEIGHT + var grid_sizes: Variant = SurfaceDrawingProtocol.GRID_SIZES + var cell_size: float = SurfaceDrawingProtocol.CELL_SIZE + assert(grid_width == 16) + assert(grid_height == 16) + assert(grid_sizes == [16, 32, 64, 128]) + assert(is_equal_approx(cell_size, 0.075)) assert(is_equal_approx( - float(SurfaceDrawingProtocol.GRID_WIDTH) - * SurfaceDrawingProtocol.CELL_SIZE, + float(grid_width) * cell_size, 1.2, )) var canvas_request: Dictionary = { @@ -157,14 +160,14 @@ func _validate_grid_snapping() -> void: "creator_fingerprint": FINGERPRINT_A, "cells": [], } - var snapped: Dictionary = SurfaceDrawingPlacement.resolve( + var snap_result: Dictionary = SurfaceDrawingPlacement.resolve( Vector3(1.08, 0.02, 0.08), Vector3.UP, Vector3.RIGHT, [anchor], ) - assert(bool(snapped["snapped"])) - var snapped_origin: Vector3 = snapped["origin"] + assert(bool(snap_result["snapped"])) + var snapped_origin: Vector3 = snap_result["origin"] assert(snapped_origin.is_equal_approx(Vector3(1.2, 0.0, 0.0))) var unsnapped: Dictionary = SurfaceDrawingPlacement.resolve( Vector3(0.6, 0.0, 0.0), diff --git a/tests/terrain_chunk_generator_validation.gd b/tests/terrain_chunk_generator_validation.gd index ec736d9..0576d81 100644 --- a/tests/terrain_chunk_generator_validation.gd +++ b/tests/terrain_chunk_generator_validation.gd @@ -1878,7 +1878,7 @@ func _all_neighbor_edges_match(generator: TerrainChunkGenerator) -> bool: for index: int in generator._placements.size(): var coordinate := Vector2i( index % generator.grid_size.x, - index / generator.grid_size.x, + int(float(index) / float(generator.grid_size.x)), ) var current: TerrainChunkVariant = generator._placements[index] if coordinate.x > 0: @@ -1918,8 +1918,8 @@ func _validate_layout_rules(generator: TerrainChunkGenerator) -> void: "All walkable generated terrain must remain connected to spawn.", ) var center := Vector2i( - generator.grid_size.x / 2, - generator.grid_size.y / 2, + int(float(generator.grid_size.x) / 2.0), + int(float(generator.grid_size.y) / 2.0), ) var safe_spawn_neighbors := 0 for edge_value: int in TerrainChunkTopology.Edge.values(): @@ -1943,7 +1943,7 @@ func _validate_layout_rules(generator: TerrainChunkGenerator) -> void: var placement := generator._placements[index] var coordinate := Vector2i( index % generator.grid_size.x, - index / generator.grid_size.x, + int(float(index) / float(generator.grid_size.x)), ) if "coast" in placement.definition.tags: _check( diff --git a/tests/unified_inventory_validation.gd b/tests/unified_inventory_validation.gd index 6928969..a313cd7 100644 --- a/tests/unified_inventory_validation.gd +++ b/tests/unified_inventory_validation.gd @@ -19,15 +19,15 @@ func _initialize() -> void: func _run() -> void: - var root := Node.new() - get_root().add_child(root) + var scene_root := Node.new() + get_root().add_child(scene_root) var bag := PlayerBag.new() var catches := FishInventory.new() var capacity := PlayerCoolerCapacity.new() var layout := PlayerInventoryLayout.new() var hotbar := PlayerHotbar.new() for node: Node in [bag, catches, capacity, layout, hotbar]: - root.add_child(node) + scene_root.add_child(node) bag.setup(ItemCatalogResource) layout.setup(bag, catches, ItemCatalogResource, capacity) bag.set_inventory_layout(layout) @@ -109,7 +109,7 @@ func _run() -> void: assert(layout.get_storage_count() == 1) assert(layout.get_storage_capacity() == 9) var inventory_grid := GeneralInventoryGrid.new() - root.add_child(inventory_grid) + scene_root.add_child(inventory_grid) inventory_grid.set_slot_presentation(Vector2(78.0, 78.0), 10) inventory_grid.setup( layout, @@ -143,7 +143,7 @@ func _run() -> void: ) staged_slot.set_staged(false) var quality_slot := GeneralInventorySlot.new() - root.add_child(quality_slot) + scene_root.add_child(quality_slot) quality_slot.set_presentation_size(Vector2(78.0, 78.0)) quality_slot.configure( 0, @@ -181,7 +181,7 @@ func _run() -> void: distinct_quality_colors[quality_color] = true assert(distinct_quality_colors.size() == FishQuality.TIER_COUNT) var sale_tray_slot := ShopSaleTraySlot.new() - root.add_child(sale_tray_slot) + scene_root.add_child(sale_tray_slot) sale_tray_slot.configure( "catch:%s" % fish_catch.catch_id, fish_catch.fish.display_texture, @@ -207,7 +207,7 @@ func _run() -> void: expected_tray_quality_color.a = 0.96 assert(sale_tray_style.bg_color == expected_tray_quality_color) var wallet := PlayerWallet.new() - root.add_child(wallet) + scene_root.add_child(wallet) assert(wallet.restore_balance(15000)) assert(layout.get_next_backpack_cost() == 1500) assert(layout.purchase_backpack(wallet)) @@ -223,7 +223,7 @@ func _run() -> void: assert(inventory_grid.get_slots().size() == 36) assert(layout.get_next_backpack_cost() == -1) var storage_grid := GeneralInventoryGrid.new() - root.add_child(storage_grid) + scene_root.add_child(storage_grid) storage_grid.setup( layout, bag, @@ -240,7 +240,7 @@ func _run() -> void: == "locked storage slot 10" ) var storage_wallet := PlayerWallet.new() - root.add_child(storage_wallet) + scene_root.add_child(storage_wallet) assert(storage_wallet.restore_balance(9500)) for expected_capacity: int in [18, 27, 36, 45, 54, 63, 72]: assert(capacity.purchase(storage_wallet)) @@ -266,8 +266,8 @@ func _run() -> void: var network_sale := NetworkSaleService.new() var session := NetworkSession.new() - root.add_child(session) - root.add_child(network_sale) + scene_root.add_child(session) + scene_root.add_child(network_sale) network_sale.set("_session", session) network_sale.set("_item_catalog", ItemCatalogResource) network_sale.set("_fish_catalog", FishCatalogResource) @@ -284,5 +284,5 @@ func _run() -> void: assert((result.get("items", []) as Array).size() == 1) print("Unified inventory validation: PASS") - root.free() + scene_root.free() quit() diff --git a/tests/world_layout_validation.gd b/tests/world_layout_validation.gd index e6eec39..6c7f728 100644 --- a/tests/world_layout_validation.gd +++ b/tests/world_layout_validation.gd @@ -68,9 +68,9 @@ func _validate_setup_page() -> void: page.call("_set_world_layout", WorldLayout.STARTER_ISLAND) assert(not (page.get_node("%SeedSection") as Control).visible) var request: Dictionary = {} - page.start_requested.connect(func(layout: StringName, seed: int) -> void: + page.start_requested.connect(func(layout: StringName, world_seed: int) -> void: request["layout"] = layout - request["seed"] = seed + request["seed"] = world_seed ) page.call("_request_start") assert(request.get("layout") == WorldLayout.STARTER_ISLAND) diff --git a/tests/world_spawn_protocol_validation.gd b/tests/world_spawn_protocol_validation.gd index e300808..779818e 100644 --- a/tests/world_spawn_protocol_validation.gd +++ b/tests/world_spawn_protocol_validation.gd @@ -20,12 +20,21 @@ func _initialize() -> void: func _run() -> void: - assert(NetworkProtocol.PROTOCOL_VERSION == 12) - assert( + var protocol_version: int = NetworkProtocol.PROTOCOL_VERSION + var world_spawn_capability: String = ( NetworkWorldSpawnProtocol.CAPABILITY - == NetworkProtocol.WORLD_SPAWN_CAPABILITY ) - assert(NetworkWorldSpawnProtocol.SNAPSHOT_ENTITIES_PER_ENVELOPE <= 4) + var protocol_world_spawn_capability: String = ( + NetworkProtocol.WORLD_SPAWN_CAPABILITY + ) + var snapshot_entities_per_envelope: int = ( + NetworkWorldSpawnProtocol.SNAPSHOT_ENTITIES_PER_ENVELOPE + ) + assert(protocol_version == 12) + assert( + world_spawn_capability == protocol_world_spawn_capability + ) + assert(snapshot_entities_per_envelope <= 4) _validate_catalog_statuses() await _validate_billboard_presentation() _validate_envelopes() diff --git a/tests/world_time_validation.gd b/tests/world_time_validation.gd index 3caea2b..2ccd2ab 100644 --- a/tests/world_time_validation.gd +++ b/tests/world_time_validation.gd @@ -42,9 +42,15 @@ func _run() -> void: func _validate_clock_boundaries_and_duration() -> void: - assert(WorldTimeServiceType.REAL_SECONDS_PER_CYCLE == 86400.0) + var real_seconds_per_cycle: float = ( + WorldTimeServiceType.REAL_SECONDS_PER_CYCLE + ) + var hours_per_real_second: float = ( + WorldTimeServiceType.HOURS_PER_REAL_SECOND + ) + assert(real_seconds_per_cycle == 86400.0) assert(is_equal_approx( - WorldTimeServiceType.HOURS_PER_REAL_SECOND, + hours_per_real_second, 1.0 / 3600.0, )) assert(is_equal_approx( diff --git a/tests/world_weather_validation.gd b/tests/world_weather_validation.gd index 7bc5114..57be98d 100644 --- a/tests/world_weather_validation.gd +++ b/tests/world_weather_validation.gd @@ -382,11 +382,13 @@ func _validate_weather_presentation() -> void: "res://world/environment/local_storm_cloud.gdshader" ) assert("cull_disabled" in cloud_shader.code) - assert(LocalStormCloudLayer.WRAP_RADIUS >= 315.0) - assert(is_equal_approx(LocalStormCloudLayer.MAXIMUM_OPACITY, 1.0)) + var cloud_wrap_radius: float = LocalStormCloudLayer.WRAP_RADIUS + var cloud_maximum_opacity: float = LocalStormCloudLayer.MAXIMUM_OPACITY + var cloud_distance_fade_end: float = LocalStormCloudLayer.DISTANCE_FADE_END + assert(cloud_wrap_radius >= 315.0) + assert(is_equal_approx(cloud_maximum_opacity, 1.0)) assert( - LocalStormCloudLayer.DISTANCE_FADE_END - < LocalStormCloudLayer.WRAP_RADIUS + cloud_distance_fade_end < cloud_wrap_radius ) assert(is_zero_approx(float(storm_clouds.call("get_storm_amount")))) visuals.apply_weather_immediately( @@ -524,10 +526,18 @@ func _validate_weather_presentation() -> void: assert(rain.emitting) assert(rain.amount_ratio > 0.99) assert(rain.amount == WorldTimeVisualControllerType.RAIN_PARTICLE_AMOUNT) + var rain_emitter_offset: Vector3 = ( + WorldTimeVisualControllerType.RAIN_EMITTER_OFFSET + ) + var rain_supported_canopy_height: float = ( + WorldTimeVisualControllerType.RAIN_SUPPORTED_CANOPY_HEIGHT + ) + var rain_canopy_clearance: float = ( + WorldTimeVisualControllerType.RAIN_CANOPY_CLEARANCE + ) assert( - WorldTimeVisualControllerType.RAIN_EMITTER_OFFSET.y - >= WorldTimeVisualControllerType.RAIN_SUPPORTED_CANOPY_HEIGHT - + WorldTimeVisualControllerType.RAIN_CANOPY_CLEARANCE + rain_emitter_offset.y + >= rain_supported_canopy_height + rain_canopy_clearance ) assert(is_equal_approx( rain.lifetime, diff --git a/ui/chat_ui.gd b/ui/chat_ui.gd index 761ae4f..d310def 100644 --- a/ui/chat_ui.gd +++ b/ui/chat_ui.gd @@ -1463,8 +1463,8 @@ func is_mobile_mode() -> bool: return _mobile_mode -func set_hud_hidden(hidden: bool) -> void: - _hud_hidden = hidden +func set_hud_hidden(is_hidden: bool) -> void: + _hud_hidden = is_hidden _refresh_visibility() diff --git a/ui/components/locked_content_presentation.gd b/ui/components/locked_content_presentation.gd index 1342054..65ff816 100644 --- a/ui/components/locked_content_presentation.gd +++ b/ui/components/locked_content_presentation.gd @@ -53,7 +53,9 @@ static func make_icon_texture( Image.FORMAT_RGBA8, ) canvas.fill(Color.TRANSPARENT) - var inset := Vector2i.ONE * ((canvas_size - icon_size) / 2) + var inset := Vector2i.ONE * floori( + float(canvas_size - icon_size) / 2.0 + ) canvas.blend_rect( image, Rect2i(Vector2i.ZERO, Vector2i(icon_size, icon_size)), diff --git a/ui/components/logbook_portrait.gd b/ui/components/logbook_portrait.gd index fb5fa4a..8bee8e7 100644 --- a/ui/components/logbook_portrait.gd +++ b/ui/components/logbook_portrait.gd @@ -93,10 +93,16 @@ static func uniform_footprint_size( maximum_size.x / visible_size.x, maximum_size.y / visible_size.y, ) - var scale: float = minf(area_scale, fit_scale) + var footprint_scale: float = minf(area_scale, fit_scale) return Vector2( - minf(maximum_size.x, maxf(1.0, roundf(visible_size.x * scale))), - minf(maximum_size.y, maxf(1.0, roundf(visible_size.y * scale))), + minf( + maximum_size.x, + maxf(1.0, roundf(visible_size.x * footprint_scale)), + ), + minf( + maximum_size.y, + maxf(1.0, roundf(visible_size.y * footprint_scale)), + ), ) diff --git a/ui/components/organizer_tab.gd b/ui/components/organizer_tab.gd index bb2f777..5046e59 100644 --- a/ui/components/organizer_tab.gd +++ b/ui/components/organizer_tab.gd @@ -91,14 +91,14 @@ func _initialize_motion() -> void: _set_visual_y(_target_y()) -func _on_toggled(is_pressed: bool) -> void: - if _selected and not is_pressed: +func _on_toggled(is_button_pressed: bool) -> void: + if _selected and not is_button_pressed: # A selected organizer tab is a page marker, not a collapsible toggle. # Restore without another signal before any lower-state frame is drawn. set_pressed_no_signal(true) refresh_state(false) return - _selected = is_pressed + _selected = is_button_pressed refresh_state() diff --git a/ui/components/shop_sale_tray_slot.gd b/ui/components/shop_sale_tray_slot.gd index 0ac87bf..a45e28d 100644 --- a/ui/components/shop_sale_tray_slot.gd +++ b/ui/components/shop_sale_tray_slot.gd @@ -65,14 +65,14 @@ func _apply_style() -> void: func configure( key: String, - icon: Texture2D, + icon_texture: Texture2D, label: String, quantity: int = 1, quality: int = -1, ) -> void: entry_key = key _quality_tier = quality - _icon.texture = icon + _icon.texture = icon_texture _quantity.text = "×%d" % quantity if quantity > 1 else "" tooltip_text = "%s · select to remove" % label accessibility_name = tooltip_text diff --git a/ui/controller_focus_presentation.gd b/ui/controller_focus_presentation.gd index cb41c31..7ef7383 100644 --- a/ui/controller_focus_presentation.gd +++ b/ui/controller_focus_presentation.gd @@ -565,7 +565,7 @@ func _popup_item_height(popup: PopupMenu, index: int) -> float: popup.get_theme_font_size(&"font_size") ) var icon: Texture2D = popup.get_item_icon(index) - var icon_height: float = icon.get_height() if icon != null else 0.0 + var icon_height: float = float(icon.get_height()) if icon != null else 0.0 return maxf(font_height, icon_height) + vertical_separation diff --git a/ui/fishing_shop.gd b/ui/fishing_shop.gd index 7cc8fa8..26ce681 100644 --- a/ui/fishing_shop.gd +++ b/ui/fishing_shop.gd @@ -69,7 +69,9 @@ const CURRENCY_ICON: Texture2D = preload( signal menu_visibility_changed(is_open: bool) signal menu_exit_started +@warning_ignore("unused_signal") signal sell_fish_requested +@warning_ignore("unused_signal") signal shop_cooler_return_requested signal shop_cooler_confirmation_cancel_requested @@ -395,9 +397,11 @@ func _select_shop_section(section_index: int, focus_content: bool) -> void: _controller_zone = ControllerZone.CONTENT if section_index == int(_shop_section): if section_index != ShopSection.SELL_FISH: - var showing_upgrades := section_index == ShopSection.UPGRADES - _upgrades_content.visible = showing_upgrades - _supplies_content.visible = not showing_upgrades + var showing_current_upgrades: bool = ( + section_index == ShopSection.UPGRADES + ) + _upgrades_content.visible = showing_current_upgrades + _supplies_content.visible = not showing_current_upgrades _update_shop_tab_selection() if focus_content: _focus_shop_section() @@ -470,12 +474,12 @@ func _apply_shop_controller_zone_focus_modes() -> void: func _set_descendant_button_focus_mode( root_control: Control, - focus_mode: Control.FocusMode, + requested_focus_mode: Control.FocusMode, ) -> void: for child: Node in root_control.find_children("*", "BaseButton", true, false): var button := child as BaseButton if button != null: - button.focus_mode = focus_mode + button.focus_mode = requested_focus_mode func _update_shop_tab_selection() -> void: @@ -704,14 +708,14 @@ func deactivate_shop_cooler_page() -> void: func _set_shop_panel_background_pointer_blocking(blocking: bool) -> void: - var mouse_filter := ( + var panel_mouse_filter := ( Control.MOUSE_FILTER_STOP if blocking else Control.MOUSE_FILTER_IGNORE ) - _shop_panel.mouse_filter = mouse_filter - _shop_panel_margin.mouse_filter = mouse_filter - _shop_panel_layout.mouse_filter = mouse_filter + _shop_panel.mouse_filter = panel_mouse_filter + _shop_panel_margin.mouse_filter = panel_mouse_filter + _shop_panel_layout.mouse_filter = panel_mouse_filter func set_shop_cooler_modal_open(is_open: bool) -> void: diff --git a/ui/game_ui.gd b/ui/game_ui.gd index 55a07eb..0141b0c 100644 --- a/ui/game_ui.gd +++ b/ui/game_ui.gd @@ -204,6 +204,7 @@ var _hotbar: PlayerHotbarType var _item_catalog: ItemCatalogType var _player_menu_open: bool = false var _gameplay_ui_enabled: bool = false +var _gameplay_input_locked: bool = false var _gameplay_hud_hidden: bool = false var _fishing_spot: FishingSpotType var _system_menu_open: bool = false @@ -631,6 +632,9 @@ func _prioritize_surface_drawing_pointer_input() -> void: func _input(event: InputEvent) -> void: + if _gameplay_input_locked: + get_viewport().set_input_as_handled() + return if _social_prompt_open and event.is_action_pressed("ui_cancel"): _decline_social_prompt() get_viewport().set_input_as_handled() @@ -681,6 +685,7 @@ func _input(event: InputEvent) -> void: return var can_open: bool = ( _gameplay_ui_enabled + and not _gameplay_input_locked and not _system_menu_open and not _player_menu_open and not _shop_open @@ -719,6 +724,7 @@ func _input(event: InputEvent) -> void: func _reconcile_radial_menu_input() -> void: var blocked: bool = ( not _gameplay_ui_enabled + or _gameplay_input_locked or _system_menu_open or _player_menu_open or _shop_open @@ -769,6 +775,7 @@ func _close_quick_radial_menu() -> void: func _can_use_character_call() -> bool: return ( _gameplay_ui_enabled + and not _gameplay_input_locked and not _system_menu_open and not _player_menu_open and not _shop_open @@ -840,6 +847,7 @@ func _handle_controller_chat_controls(event: InputEvent) -> bool: button_event == null or not button_event.pressed or not _gameplay_ui_enabled + or _gameplay_input_locked or _system_menu_open or _player_menu_open or _shop_open @@ -1051,6 +1059,7 @@ func _mapped_virtual_mouse_stick() -> Vector2: func _can_start_virtual_mouse() -> bool: return ( _gameplay_ui_enabled + and not _gameplay_input_locked and not _showcase_active and not _system_menu_open and not _player_menu_open @@ -1430,6 +1439,7 @@ func _can_surface_drawing_be_active() -> bool: return ( _surface_drawing_hotbar_selected and _gameplay_ui_enabled + and not _gameplay_input_locked and not _system_menu_open and not _player_menu_open and not _shop_open @@ -1838,12 +1848,38 @@ func set_gameplay_ui_enabled(enabled: bool) -> void: _hotbar_ui.set_gameplay_input_enabled(false) else: _refresh_hotbar_visibility() - _hotbar_ui.set_gameplay_input_enabled(true) + _hotbar_ui.set_gameplay_input_enabled( + not _gameplay_input_locked + ) _refresh_fishing_panel_visibility() call_deferred("_start_next_experience_animation") _refresh_surface_drawing_activation() +func set_gameplay_input_locked(locked: bool) -> void: + if _gameplay_input_locked == locked: + return + _gameplay_input_locked = locked + if locked: + _end_virtual_mouse() + _close_radial_menus() + _hotbar_ui.set_drag_enabled(false) + if _surface_drawing != null: + _surface_drawing.deactivate() + _refresh_rv_storage_button_visibility() + _refresh_hotbar_visibility() + _refresh_chat_availability() + _hotbar_ui.set_gameplay_input_enabled( + _gameplay_ui_enabled + and not _gameplay_input_locked + and not _system_menu_open + and not _player_menu_open + and not _shop_open + and not _storage_open + ) + _refresh_surface_drawing_activation() + + func set_gameplay_hud_hidden(hidden: bool) -> void: _gameplay_hud_hidden = hidden if _quick_radial_menu != null: @@ -1862,6 +1898,7 @@ func is_gameplay_hud_hidden() -> bool: func _can_toggle_gameplay_hud() -> bool: return ( _gameplay_ui_enabled + and not _gameplay_input_locked and not _system_menu_open and not _player_menu_open and not _shop_open @@ -1903,6 +1940,7 @@ func set_system_menu_open(is_open: bool) -> void: _refresh_hotbar_visibility() _hotbar_ui.set_gameplay_input_enabled( _gameplay_ui_enabled + and not _gameplay_input_locked and not is_open and not _player_menu_open and not _shop_open @@ -1995,6 +2033,7 @@ func _refresh_rv_storage_button_visibility() -> void: _rv_storage_button.visible = ( _rv_storage_button_requested_visible and _gameplay_ui_enabled + and not _gameplay_input_locked and not _gameplay_hud_hidden and not _system_menu_open and not _player_menu_open @@ -2799,7 +2838,9 @@ func _on_player_menu_visibility_changed(is_open: bool) -> void: _hotbar_ui.set_player_menu_context(false) _refresh_chat_availability() _hotbar_ui.set_gameplay_input_enabled( - _gameplay_ui_enabled and not is_open + _gameplay_ui_enabled + and not _gameplay_input_locked + and not is_open ) if not is_open: _hotbar_ui.set_drag_enabled(false) @@ -2844,6 +2885,7 @@ func _on_shop_visibility_changed(is_open: bool) -> void: _refresh_hotbar_visibility() _hotbar_ui.set_gameplay_input_enabled( _gameplay_ui_enabled + and not _gameplay_input_locked and not is_open and not _system_menu_open and not _player_menu_open @@ -2865,6 +2907,7 @@ func _on_storage_visibility_changed(is_open: bool) -> void: _refresh_hotbar_visibility() _hotbar_ui.set_gameplay_input_enabled( _gameplay_ui_enabled + and not _gameplay_input_locked and not is_open and not _system_menu_open and not _player_menu_open @@ -2977,6 +3020,7 @@ func _on_hotbar_presentation_transition_finished( ) -> void: _hotbar_ui.set_drag_enabled( presentation_visible + and not _gameplay_input_locked and _player_menu_open and _player_menu_hotbar_visible and not _system_menu_open @@ -2986,6 +3030,7 @@ func _on_hotbar_presentation_transition_finished( func _refresh_hotbar_visibility() -> void: _hotbar_ui.set_presentation_visible( _gameplay_ui_enabled + and not _gameplay_input_locked and ( not _gameplay_hud_hidden or (_player_menu_open and _player_menu_hotbar_visible) @@ -3027,6 +3072,7 @@ func _refresh_chat_availability() -> void: return var chat_available := ( _gameplay_ui_enabled + and not _gameplay_input_locked and not _system_menu_open and not _player_menu_open and not _shop_open diff --git a/ui/interface_font_controller.gd b/ui/interface_font_controller.gd index a27e56a..5e55ada 100644 --- a/ui/interface_font_controller.gd +++ b/ui/interface_font_controller.gd @@ -100,7 +100,11 @@ func popup_file_dialog(dialog: FileDialog) -> void: # clamp guarantees the embedded window cannot escape the physical screen. dialog.size = available_size if dialog.get_viewport().gui_embed_subwindows: - dialog.position = (host_size - available_size) / 2 + var centered_position := Vector2i( + floori(float(host_size.x - available_size.x) / 2.0), + floori(float(host_size.y - available_size.y) / 2.0), + ) + dialog.position = centered_position _finalize_compact_file_dialog.call_deferred( dialog, host_size, available_size ) diff --git a/ui/mail_page.gd b/ui/mail_page.gd index 0bfef1f..62bcdbb 100644 --- a/ui/mail_page.gd +++ b/ui/mail_page.gd @@ -329,9 +329,9 @@ func _configure_compose_controller_navigation() -> void: and _attachment_amount.is_visible_in_tree() ) var amount_left: Control = _amount_minus if amount_visible else _compose_cancel - var amount_middle: Control = ( - _attachment_amount if amount_visible else _compose_cancel - ) + var amount_middle: Control = _compose_cancel + if amount_visible: + amount_middle = _attachment_amount var amount_right: Control = _amount_plus if amount_visible else _send_button _set_compose_neighbors( _greeting, _greeting, _recipient, _greeting, _body diff --git a/ui/network/join_game_page.gd b/ui/network/join_game_page.gd index 93ba793..6546517 100644 --- a/ui/network/join_game_page.gd +++ b/ui/network/join_game_page.gd @@ -394,7 +394,10 @@ func _set_mode(mode: Mode, clear_connection_error: bool = true) -> void: _discovery_refresh_timer.stop() if not is_visible_in_tree(): return - _defer_focus_control(_address if mode == Mode.DIRECT else _server_list) + var initial_focus: Control = _server_list + if mode == Mode.DIRECT: + initial_focus = _address + _defer_focus_control(initial_focus) func _default_mode_status(mode: Mode) -> String: @@ -688,9 +691,10 @@ func _restore_entry_selection_and_focus( _selected_entry = null _server_list.deselect_all() _refresh() - _defer_focus_control( - _server_list if selected else _current_mode_button() - ) + var restored_focus: Control = _current_mode_button() + if selected: + restored_focus = _server_list + _defer_focus_control(restored_focus) func _current_mode_button() -> Button: @@ -1203,10 +1207,10 @@ func _recover_controller_focus( ) -> void: if not is_visible_in_tree(): return - var owner: Control = get_viewport().gui_get_focus_owner() - if owner != null and owner in controls: + var focus_owner: Control = get_viewport().gui_get_focus_owner() + if focus_owner != null and focus_owner in controls: return - if owner != null and _delete_confirmation.is_ancestor_of(owner): + if focus_owner != null and _delete_confirmation.is_ancestor_of(focus_owner): return if fallback != null: _defer_focus_control(fallback) @@ -1539,7 +1543,9 @@ func _on_back_pressed() -> void: if _name_entry_active: _clear_edit_state() _refresh() - var content: Control = _address if _mode == Mode.DIRECT else _server_list + var content: Control = _server_list + if _mode == Mode.DIRECT: + content = _address _defer_focus_control(content) return if ( diff --git a/ui/new_game_setup_page.gd b/ui/new_game_setup_page.gd index 68e2aa8..989880b 100644 --- a/ui/new_game_setup_page.gd +++ b/ui/new_game_setup_page.gd @@ -167,8 +167,8 @@ func _on_seed_submitted(_text: String) -> void: func _request_start() -> void: - var seed: int = get_selected_world_seed() - if _world_layout == WorldLayoutType.GENERATED and seed == 0: + var world_seed: int = get_selected_world_seed() + if _world_layout == WorldLayoutType.GENERATED and world_seed == 0: _status.text = ( "enter some text or a whole number from 1 to %d." % SaveManagerType.MAX_WORLD_SEED @@ -176,10 +176,10 @@ func _request_start() -> void: _seed_edit.grab_focus() _seed_edit.select_all() return - if seed == 0: - seed = SaveManagerType.roll_world_seed() + if world_seed == 0: + world_seed = SaveManagerType.roll_world_seed() _start_button.disabled = true - start_requested.emit(_world_layout, seed) + start_requested.emit(_world_layout, world_seed) func _refresh_presentation() -> void: @@ -226,33 +226,43 @@ func _refresh_start_state() -> void: func _configure_controller_focus() -> void: var generated: bool = _world_layout == WorldLayoutType.GENERATED var custom: bool = generated and _seed_mode == SeedMode.CUSTOM + var generated_button_bottom: Control = _start_button + var starter_button_bottom: Control = _back_button + var random_seed_button_bottom: Control = _start_button + var custom_seed_button_bottom: Control = _back_button + if generated: + generated_button_bottom = _random_seed_button + starter_button_bottom = _custom_seed_button + if custom: + random_seed_button_bottom = _seed_edit + custom_seed_button_bottom = _seed_edit _set_neighbors( _generated_button, _generated_button, _starter_button, _generated_button, - _random_seed_button if generated else _start_button, + generated_button_bottom, ) _set_neighbors( _starter_button, _generated_button, _starter_button, _starter_button, - _custom_seed_button if generated else _back_button, + starter_button_bottom, ) _set_neighbors( _random_seed_button, _random_seed_button, _custom_seed_button, _generated_button, - _seed_edit if custom else _start_button, + random_seed_button_bottom, ) _set_neighbors( _custom_seed_button, _random_seed_button, _custom_seed_button, _starter_button, - _seed_edit if custom else _back_button, + custom_seed_button_bottom, ) _set_neighbors( _seed_edit, @@ -261,13 +271,11 @@ func _configure_controller_focus() -> void: _custom_seed_button, _start_button, ) - var action_top: Control = ( - _seed_edit - if custom - else _random_seed_button - if generated - else _generated_button - ) + var action_top: Control = _generated_button + if generated: + action_top = _random_seed_button + if custom: + action_top = _seed_edit _set_neighbors( _start_button, _start_button, diff --git a/ui/player_menu.gd b/ui/player_menu.gd index 95263f5..0545dd4 100644 --- a/ui/player_menu.gd +++ b/ui/player_menu.gd @@ -710,7 +710,7 @@ func _handle_controller_ownership_input(event: InputEvent) -> bool: if not _is_inventory_section(_current_section): return _handle_active_page_controller_input(event) var button_event := event as InputEventJoypadButton - var accept_event: bool = ( + var accept_button_event: bool = ( button_event != null and _event_matches_controller_role( event, @@ -719,7 +719,7 @@ func _handle_controller_ownership_input(event: InputEvent) -> bool: ) ) var accept_pressed: bool = ( - accept_event + accept_button_event and button_event.pressed ) var cancel_pressed: bool = ( @@ -777,7 +777,7 @@ func _handle_controller_ownership_input(event: InputEvent) -> bool: if accept_pressed: _confirm_controller_storage_placement() return true - if accept_event: + if accept_button_event: return true if ( event.is_action_pressed("ui_down") @@ -810,7 +810,7 @@ func _handle_controller_ownership_input(event: InputEvent) -> bool: ): _cancel_active_item_move() return _try_enter_notepad_controller_ownership() - if _current_section == Section.TACKLE_BOX and accept_event: + if _current_section == Section.TACKLE_BOX and accept_button_event: # Bait and lures are unlock collections, not movable inventory slots. # Controller Y owns their contextual equip/notepad action; A is # intentionally inert and consumed so it cannot activate the Button. @@ -831,7 +831,7 @@ func _handle_controller_ownership_input(event: InputEvent) -> bool: if _current_section == Section.COOLER: _enter_inventory_sort_zone() return true - if accept_event: + if accept_button_event: if button_event.pressed: _controller_accept_held = true _controller_accept_hold_elapsed = 0.0 @@ -986,11 +986,14 @@ func _controller_focus_is_on_last_inventory_row() -> bool: var slot := focus_owner as GeneralInventorySlotType if slot == null: return false - return ( - slot.slot_index / BAG_STORAGE_COLUMNS - >= (_inventory_layout.get_inventory_capacity() - 1) - / BAG_STORAGE_COLUMNS + var focused_row: int = int( + float(slot.slot_index) / float(BAG_STORAGE_COLUMNS) ) + var final_row: int = int( + float(_inventory_layout.get_inventory_capacity() - 1) + / float(BAG_STORAGE_COLUMNS) + ) + return focused_row >= final_row return false @@ -1139,10 +1142,13 @@ func _controller_storage_focus_is_on_last_row() -> bool: var slot := get_viewport().gui_get_focus_owner() as BagStorageSlotType if slot == null: return false - return ( - slot.storage_slot_index / BAG_STORAGE_COLUMNS - >= (_bag_slot_nodes.size() - 1) / BAG_STORAGE_COLUMNS + var focused_row: int = int( + float(slot.storage_slot_index) / float(BAG_STORAGE_COLUMNS) ) + var final_row: int = int( + float(_bag_slot_nodes.size() - 1) / float(BAG_STORAGE_COLUMNS) + ) + return focused_row >= final_row func _find_controller_hotbar_assignment( @@ -4575,11 +4581,6 @@ func _refresh_economy_summary() -> void: if not is_node_ready(): return var balance: int = _wallet.get_balance() if _wallet != null else 0 - var held_total: int = ( - _inventory.get_total_sale_value() - if _inventory != null - else 0 - ) _notepad_wallet_value.set_amount(balance) _notepad_capacity_value.text = "%d / %d" % [ _inventory.get_all_catches().size() if _inventory != null else 0, diff --git a/ui/profile_page.gd b/ui/profile_page.gd index ece0673..910333b 100644 --- a/ui/profile_page.gd +++ b/ui/profile_page.gd @@ -1501,10 +1501,10 @@ func _resize_feature_preview_image(image: Image, max_dimension: int) -> void: var largest_dimension := maxi(source_size.x, source_size.y) if largest_dimension <= max_dimension: return - var scale := float(max_dimension) / float(largest_dimension) + var resize_scale := float(max_dimension) / float(largest_dimension) image.resize( - maxi(roundi(float(source_size.x) * scale), 1), - maxi(roundi(float(source_size.y) * scale), 1), + maxi(roundi(float(source_size.x) * resize_scale), 1), + maxi(roundi(float(source_size.y) * resize_scale), 1), Image.INTERPOLATE_NEAREST, ) diff --git a/ui/quick_radial_menu.gd b/ui/quick_radial_menu.gd index 05ce0a3..45d2632 100644 --- a/ui/quick_radial_menu.gd +++ b/ui/quick_radial_menu.gd @@ -18,8 +18,8 @@ const SECTOR_COUNT: int = 3 var _hud_hidden: bool = false -func set_hud_hidden(hidden: bool) -> void: - _hud_hidden = hidden +func set_hud_hidden(is_hidden: bool) -> void: + _hud_hidden = is_hidden _refresh_labels() diff --git a/ui/save_slots_page.gd b/ui/save_slots_page.gd index 74e3a7f..41b25b4 100644 --- a/ui/save_slots_page.gd +++ b/ui/save_slots_page.gd @@ -509,21 +509,21 @@ func _export_file_selected(path: String) -> void: func _request_create() -> void: if _create_button.disabled: return - var seed: int = _selected_world_seed() - if _world_layout == WorldLayoutType.GENERATED and seed == 0: + var world_seed: int = _selected_world_seed() + if _world_layout == WorldLayoutType.GENERATED and world_seed == 0: _status.text = "enter text or a whole number from 1 to %d." % SaveManagerType.MAX_WORLD_SEED _seed_edit.grab_focus() _seed_edit.select_all() return - if seed == 0: - seed = SaveManagerType.roll_world_seed() + if world_seed == 0: + world_seed = SaveManagerType.roll_world_seed() _busy = true _status.text = "creating save slot..." _refresh_action_state() create_requested.emit( PlayerSaveSlotCatalog.normalized_name(_new_slot_name.text), _world_layout, - seed, + world_seed, _duplicate_source_slot_id, ) @@ -656,13 +656,27 @@ func _configure_controller_focus() -> void: _new_slot_tab.focus_neighbor_bottom = _new_slot_tab.get_path_to(_new_slot_name) var generated: bool = _world_layout == WorldLayoutType.GENERATED var custom: bool = generated and _seed_mode == SeedMode.CUSTOM + var generated_button_bottom: Control = _create_button + var starter_button_bottom: Control = _back_button + var random_seed_button_bottom: Control = _create_button + var custom_seed_button_bottom: Control = _back_button + if generated: + generated_button_bottom = _random_seed_button + starter_button_bottom = _custom_seed_button + if custom: + random_seed_button_bottom = _seed_edit + custom_seed_button_bottom = _seed_edit _set_neighbors(_new_slot_name, _new_slot_name, _new_slot_name, _new_slot_tab, _generated_button) - _set_neighbors(_generated_button, _generated_button, _starter_button, _new_slot_name, _random_seed_button if generated else _create_button) - _set_neighbors(_starter_button, _generated_button, _starter_button, _new_slot_name, _custom_seed_button if generated else _back_button) - _set_neighbors(_random_seed_button, _random_seed_button, _custom_seed_button, _generated_button, _seed_edit if custom else _create_button) - _set_neighbors(_custom_seed_button, _random_seed_button, _custom_seed_button, _starter_button, _seed_edit if custom else _back_button) + _set_neighbors(_generated_button, _generated_button, _starter_button, _new_slot_name, generated_button_bottom) + _set_neighbors(_starter_button, _generated_button, _starter_button, _new_slot_name, starter_button_bottom) + _set_neighbors(_random_seed_button, _random_seed_button, _custom_seed_button, _generated_button, random_seed_button_bottom) + _set_neighbors(_custom_seed_button, _random_seed_button, _custom_seed_button, _starter_button, custom_seed_button_bottom) _set_neighbors(_seed_edit, _seed_edit, _seed_edit, _custom_seed_button, _create_button) - var action_top: Control = _seed_edit if custom else _random_seed_button if generated else _generated_button + var action_top: Control = _generated_button + if generated: + action_top = _random_seed_button + if custom: + action_top = _seed_edit _set_neighbors(_create_button, _create_button, _back_button, action_top, _create_button) _set_neighbors(_back_button, _create_button, _back_button, action_top, _back_button) diff --git a/ui/title_screen.gd b/ui/title_screen.gd index 0a80f63..114ee9e 100644 --- a/ui/title_screen.gd +++ b/ui/title_screen.gd @@ -57,6 +57,7 @@ const INTRO_MENU_REVEAL_DURATION: float = 0.30 const INTRO_LOGO_CENTER_Y_RATIO: float = 0.43 signal new_game_requested(world_layout: StringName, world_seed: int) +@warning_ignore("unused_signal") signal continue_game_requested signal slot_play_requested(slot_id: String) signal new_slot_requested( @@ -89,7 +90,6 @@ enum ConfirmationAction { @onready var _title_presentation_scale_root: Control = ( %TitlePresentationScaleRoot ) -@onready var _background: ColorRect = %Background @onready var _title_logo: TextureRect = %TitleLogo @onready var _playtest_label: Label = %PlaytestLabel @onready var _presentation_center: CenterContainer = %Center @@ -1081,7 +1081,6 @@ func _on_confirmation_accepted() -> void: or _confirmation_action == ConfirmationAction.NONE ): return - var action: ConfirmationAction = _confirmation_action _confirmation_page.lock_interaction() _action_in_progress = true if not _save_manager.delete_progression_save(): diff --git a/world/generation/generated_world_region.gd b/world/generation/generated_world_region.gd index 61484fd..e567369 100644 --- a/world/generation/generated_world_region.gd +++ b/world/generation/generated_world_region.gd @@ -1,3 +1,5 @@ +# Generated terrain initialization is runtime-only, not editor-time tooling. +@warning_ignore("missing_tool") class_name GeneratedWorldRegion extends WorldRegion @@ -18,6 +20,9 @@ const RVUpgradeInteractionType = preload( const PrecipitationOcclusionType = preload( "res://world/environment/precipitation_occlusion.gd" ) +const FOLIAGE_WIND_SHADER: Shader = preload( + "res://world/materials/foliage_wind.gdshader" +) const WATER_BODY_SCENE: PackedScene = preload("res://world/water_body.tscn") const SALT_WATER_MATERIAL: Material = preload( "res://world/materials/stylized_water.tres" @@ -74,10 +79,27 @@ const PROCEDURAL_PROP_GROUPS: Array[StringName] = [ &"grass_detail", &"sand_tree", ] +const FOLIAGE_MATERIAL_NAMES: Array[StringName] = [ + &"leaf", + &"leaf_light", + &"leaf_dark", + &"pine", + &"leaf_variant_light", + &"leaf_variant_mid", + &"leaf_variant_dark", +] +# Retain the exact generated material override while foliage wind is active so +# profile changes restore both the selected palette and authored surface state. +const FOLIAGE_WIND_SOURCE_MATERIALS_META: StringName = ( + &"foliage_wind_source_materials" +) @export var initial_seed := PlayerSaveManager.DEFAULT_WORLD_SEED @export var prop_catalog: TerrainPropCatalog @export var biome_catalog: TerrainBiomeCatalog +@export_group("Foliage Wind") +@export_range(0.0, 0.4, 0.005) var foliage_wind_strength: float = 0.36 +@export_range(0.0, 4.0, 0.05) var foliage_wind_speed: float = 0.9 @onready var _generator: TerrainChunkGenerator = %TerrainChunkGenerator @onready var _player_spawn: Marker3D = %PlayerSpawn @@ -114,6 +136,7 @@ var _placed_group_coordinates: Dictionary[StringName, Array] = {} var _biome_assignments: Dictionary[Vector2i, StringName] = {} var _water_recovery_triangles_by_coordinate: Dictionary[Vector2i, Array] = {} var _home_accessible_elevations_by_coordinate: Dictionary[Vector2i, Array] = {} +var _foliage_wind_enabled: bool = false func _ready() -> void: @@ -122,18 +145,19 @@ func _ready() -> void: _validate_biome_catalog() _configure_static_water() _build_shoreline_reference() + _set_foliage_wind_enabled(not _light_performance_profile) -func generate_world(seed: int) -> bool: - if seed <= 0 or seed > PlayerSaveManager.MAX_WORLD_SEED: +func generate_world(world_seed: int) -> bool: + if world_seed <= 0 or world_seed > PlayerSaveManager.MAX_WORLD_SEED: return false if ( - seed == _current_seed + world_seed == _current_seed and _generator.get_generated_chunks_root() != null ): return true - _current_seed = seed - _generator.generation_seed = seed + _current_seed = world_seed + _generator.generation_seed = world_seed return _generator.generate() @@ -191,6 +215,7 @@ func get_biome_at(coordinate: Vector2i) -> StringName: func set_light_performance_profile(enabled: bool) -> void: _light_performance_profile = enabled + _set_foliage_wind_enabled(not enabled) _apply_water_materials() @@ -224,8 +249,8 @@ func get_spawn_surface_triangles( return triangles -func is_home_exterior_position_accessible(position: Vector3) -> bool: - var local_position := _generator.to_local(position) +func is_home_exterior_position_accessible(world_position: Vector3) -> bool: + var local_position := _generator.to_local(world_position) if local_position.y <= HOME_GROUND_HEIGHT_TOLERANCE: return true var coordinate := _generator.coordinate_for_local_position(local_position) @@ -310,12 +335,12 @@ func _on_generation_completed(summary: Dictionary) -> void: group_counts[group_key] = 0 _placed_group_coordinates[group_key] = [] for record: Dictionary in records: - var position: Vector3 = record.get("position", Vector3.ZERO) + var record_position: Vector3 = record.get("position", Vector3.ZERO) var tags: PackedStringArray = record.get( "tags", PackedStringArray() ) if "spawn" in tags: - spawn_position = position + spawn_position = record_position continue var coordinate: Vector2i = record.get( "coordinate", @@ -418,6 +443,7 @@ func _on_generation_completed(summary: Dictionary) -> void: # generated world is assembled. Mark the final decoration tree once every # prop and material variant is in place so rain canopy occlusion persists. _mark_precipitation_occluders() + _set_foliage_wind_enabled(_foliage_wind_enabled) world_generated.emit(_current_seed, summary) @@ -520,6 +546,127 @@ func _mark_precipitation_occluders() -> void: PrecipitationOcclusionType.mark_tree_meshes(prop) +func _set_foliage_wind_enabled(enabled: bool) -> void: + _foliage_wind_enabled = enabled + for prop: Node in _decorations.get_children(): + _apply_foliage_wind_to_node(prop, enabled) + + +func _apply_foliage_wind_to_node(root_node: Node, enabled: bool) -> void: + var mesh_instance := root_node as MeshInstance3D + if mesh_instance != null: + if enabled: + _apply_foliage_wind_to_mesh(mesh_instance) + else: + _remove_foliage_wind_from_mesh(mesh_instance) + for child: Node in root_node.get_children(): + _apply_foliage_wind_to_node(child, enabled) + + +func _remove_foliage_wind_from_mesh(mesh_instance: MeshInstance3D) -> void: + if mesh_instance.mesh == null: + return + var source_materials: Dictionary = mesh_instance.get_meta( + FOLIAGE_WIND_SOURCE_MATERIALS_META, + {}, + ) + for surface_index: int in mesh_instance.mesh.get_surface_count(): + var override_material: Material = ( + mesh_instance.get_surface_override_material(surface_index) + ) + var shader_material := override_material as ShaderMaterial + if ( + shader_material != null + and shader_material.shader == FOLIAGE_WIND_SHADER + ): + var source_material: Material = source_materials.get( + surface_index, + null, + ) as Material + mesh_instance.set_surface_override_material( + surface_index, + source_material, + ) + source_materials.erase(surface_index) + if source_materials.is_empty(): + mesh_instance.remove_meta(FOLIAGE_WIND_SOURCE_MATERIALS_META) + else: + mesh_instance.set_meta( + FOLIAGE_WIND_SOURCE_MATERIALS_META, + source_materials, + ) + + +func _apply_foliage_wind_to_mesh(mesh_instance: MeshInstance3D) -> void: + if mesh_instance.mesh == null: + return + var source_materials: Dictionary = mesh_instance.get_meta( + FOLIAGE_WIND_SOURCE_MATERIALS_META, + {}, + ) + var bounds: AABB = mesh_instance.get_aabb() + var mesh_global_scale: Vector3 = mesh_instance.global_basis.get_scale().abs() + var horizontal_scale: float = maxf( + (mesh_global_scale.x + mesh_global_scale.z) * 0.5, + 0.001, + ) + var local_strength: float = foliage_wind_strength / horizontal_scale + var phase: float = fposmod( + mesh_instance.global_position.x * 0.73 + + mesh_instance.global_position.z * 0.41, + TAU, + ) + for surface_index: int in mesh_instance.mesh.get_surface_count(): + var source_material: Material = mesh_instance.get_active_material( + surface_index + ) + if not source_material is StandardMaterial3D: + continue + if not FOLIAGE_MATERIAL_NAMES.has( + StringName(source_material.resource_name) + ): + continue + if not source_materials.has(surface_index): + source_materials[surface_index] = ( + mesh_instance.get_surface_override_material(surface_index) + ) + var source_standard := source_material as StandardMaterial3D + var wind_material := ShaderMaterial.new() + wind_material.shader = FOLIAGE_WIND_SHADER + wind_material.set_shader_parameter( + "albedo_color", + source_standard.albedo_color, + ) + wind_material.set_shader_parameter( + "material_roughness", + source_standard.roughness, + ) + wind_material.set_shader_parameter( + "material_metallic", + source_standard.metallic, + ) + wind_material.set_shader_parameter("local_min_y", bounds.position.y) + wind_material.set_shader_parameter( + "local_height", + maxf(bounds.size.y, 0.001), + ) + wind_material.set_shader_parameter( + "local_wind_strength", + local_strength, + ) + wind_material.set_shader_parameter("wind_speed", foliage_wind_speed) + wind_material.set_shader_parameter("wind_phase", phase) + mesh_instance.set_surface_override_material( + surface_index, + wind_material, + ) + if not source_materials.is_empty(): + mesh_instance.set_meta( + FOLIAGE_WIND_SOURCE_MATERIALS_META, + source_materials, + ) + + func _assign_biomes( records: Array[Dictionary], summary: Dictionary, @@ -1056,12 +1203,12 @@ func _prop_yaw( ) -func _nearest_ocean_direction(position: Vector3) -> Vector2: +func _nearest_ocean_direction(world_position: Vector3) -> Vector2: var half_extents := get_playable_half_extents() - var distance_x := half_extents.x - absf(position.x) - var distance_z := half_extents.y - absf(position.z) - var direction_x := Vector2.RIGHT if position.x >= 0.0 else Vector2.LEFT - var direction_z := Vector2.DOWN if position.z >= 0.0 else Vector2.UP + var distance_x := half_extents.x - absf(world_position.x) + var distance_z := half_extents.y - absf(world_position.z) + var direction_x := Vector2.RIGHT if world_position.x >= 0.0 else Vector2.LEFT + var direction_z := Vector2.DOWN if world_position.z >= 0.0 else Vector2.UP if absf(distance_x - distance_z) <= _generator.catalog.chunk_size * 0.35: return (direction_x + direction_z).normalized() return direction_x if distance_x < distance_z else direction_z @@ -1193,8 +1340,8 @@ func _spawn_distance_eligible_definitions( ) -> Array[TerrainPropDefinition]: var result: Array[TerrainPropDefinition] = [] var center := Vector2i( - _generator.grid_size.x / 2, - _generator.grid_size.y / 2, + int(float(_generator.grid_size.x) / 2.0), + int(float(_generator.grid_size.y) / 2.0), ) var distance := ( absi(coordinate.x - center.x) @@ -1233,7 +1380,7 @@ func _record_prop_group_coordinate( func _has_preferred_prop_near( definition: TerrainPropDefinition, - position: Vector3, + world_position: Vector3, ) -> bool: for index: int in _placed_prop_positions.size(): if ( @@ -1242,7 +1389,7 @@ func _has_preferred_prop_near( ): continue var other := _placed_prop_positions[index] - if Vector2(position.x - other.x, position.z - other.z).length() <= ( + if Vector2(world_position.x - other.x, world_position.z - other.z).length() <= ( definition.preferred_nearby_radius ): return true @@ -1323,12 +1470,12 @@ func _biome_group_key( return StringName("%s:%s" % [biome_id, group]) -func _has_prop_clearance(position: Vector3, radius: float) -> bool: +func _has_prop_clearance(world_position: Vector3, radius: float) -> bool: for index: int in _placed_prop_positions.size(): var other := _placed_prop_positions[index] var distance := Vector2( - position.x - other.x, - position.z - other.z, + world_position.x - other.x, + world_position.z - other.z, ).length() if distance < radius + _placed_prop_clearance_radii[index]: return false @@ -1584,12 +1731,12 @@ func _safe_recovery_surface_position(candidate: Vector3) -> Variant: func _water_recovery_surface_triangles_near( - position: Vector3, + world_position: Vector3, ) -> Array[PackedVector3Array]: var result: Array[PackedVector3Array] = [] if _generator.catalog == null or _generator.catalog.chunk_size <= 0.0: return result - var local_position := _generator.to_local(position) + var local_position := _generator.to_local(world_position) var half_grid := Vector2( float(_generator.grid_size.x - 1) * 0.5, float(_generator.grid_size.y - 1) * 0.5, @@ -1662,12 +1809,12 @@ func _surface_triangles_for_coordinate( func _surface_height_at( - position: Vector3, + world_position: Vector3, triangles: Array[PackedVector3Array], ) -> float: var highest := -INF - var segment_start := position + Vector3.UP * 100.0 - var segment_end := position + Vector3.DOWN * 100.0 + var segment_start := world_position + Vector3.UP * 100.0 + var segment_end := world_position + Vector3.DOWN * 100.0 for triangle: PackedVector3Array in triangles: if triangle.size() != 3: continue @@ -1684,13 +1831,13 @@ func _surface_height_at( func _surface_supports_prop_footprint( - position: Vector3, + world_position: Vector3, surface_height: float, radius: float, triangles: Array[PackedVector3Array], ) -> bool: for direction: Vector2 in PROP_SURFACE_SAMPLE_DIRECTIONS: - var sample_position := position + Vector3( + var sample_position := world_position + Vector3( direction.x * radius, 0.0, direction.y * radius, diff --git a/world/generation/terrain_chunk_generator.gd b/world/generation/terrain_chunk_generator.gd index 64a8bd2..381b919 100644 --- a/world/generation/terrain_chunk_generator.gd +++ b/world/generation/terrain_chunk_generator.gd @@ -282,11 +282,13 @@ func _resolved_layout_validation_error( if counts.get(required_id, 0) <= 0: return "required chunk %s is missing." % required_id if force_center_chunk_id != &"": + @warning_ignore("integer_division") var center := Vector2i(grid_size.x / 2, grid_size.y / 2) var center_index := center.y * grid_size.x + center.x if layout[center_index].definition.stable_id != force_center_chunk_id: return "the forced center chunk is missing from the center cell." for index: int in layout.size(): + @warning_ignore("integer_division") var coordinate := Vector2i(index % grid_size.x, index / grid_size.x) var current := layout[index] if not _variant_respects_ocean_boundary(current, coordinate): @@ -956,6 +958,7 @@ func _candidate_has_domain_support( index: int, domains: Dictionary, ) -> bool: + @warning_ignore("integer_division") var coordinate := Vector2i(index % grid_size.x, index / grid_size.x) var possible_required_neighbors := 0 for edge_value: int in TerrainChunkTopology.Edge.values(): @@ -1015,6 +1018,7 @@ func _placed_neighbor_requirements_have_domain_support( var placement := _placements[index] if placement == null or placement.definition.minimum_required_neighbors <= 0: continue + @warning_ignore("integer_division") var coordinate := Vector2i(index % grid_size.x, index / grid_size.x) var possible_neighbors := 0 for edge_value: int in TerrainChunkTopology.Edge.values(): @@ -1205,6 +1209,7 @@ func _candidate_dynamic_cell_rules_are_satisfied( ) -> bool: if not _definition_has_capacity(candidate.definition): return false + @warning_ignore("integer_division") var center_index := (grid_size.y / 2) * grid_size.x + grid_size.x / 2 if ( index != center_index @@ -1288,12 +1293,15 @@ func _candidate_can_occupy_cell( candidate: TerrainChunkVariant, index: int, ) -> bool: + @warning_ignore("integer_division") var coordinate := Vector2i(index % grid_size.x, index / grid_size.x) + @warning_ignore("integer_division") + var center := Vector2i(grid_size.x / 2, grid_size.y / 2) if ( _cell_requires_reserved_grass(index) and candidate.definition.stable_id != elevated_cliff_base_chunk_id and not ( - coordinate == Vector2i(grid_size.x / 2, grid_size.y / 2) + coordinate == center and force_center_chunk_id != &"" and candidate.definition.stable_id == force_center_chunk_id and "grass" in candidate.definition.tags @@ -1301,7 +1309,6 @@ func _candidate_can_occupy_cell( ) ): return false - var center := Vector2i(grid_size.x / 2, grid_size.y / 2) if ( coordinate == center and force_center_chunk_id != &"" @@ -1353,6 +1360,7 @@ func _prepare_elevated_feature_region() -> bool: "Elevated cliff feature requires at least an 11x11 terrain grid." ) return false + @warning_ignore("integer_division") var forced_center := Vector2i(grid_size.x / 2, grid_size.y / 2) var candidates: Array[Vector2i] = [] for row: int in range( @@ -1668,6 +1676,7 @@ func _lake_feature_candidates( var result: Array[Dictionary] = [] if footprint_size.x < 2 or footprint_size.y < 2: return result + @warning_ignore("integer_division") var center := Vector2i(grid_size.x / 2, grid_size.y / 2) for row: int in range( LAKE_FEATURE_CLEARANCE + 1, @@ -1961,6 +1970,7 @@ func _river_feature_candidate_is_valid( or outlet_coordinates.size() != 2 ): return false + @warning_ignore("integer_division") var center := Vector2i(grid_size.x / 2, grid_size.y / 2) var source_lookup: Dictionary[Vector2i, bool] = {} var source_exit_lookup: Dictionary[Vector2i, bool] = {} @@ -2527,8 +2537,10 @@ func _build_grid_solver_caches() -> void: _neighbor_indices.resize(_placements.size()) _static_cell_candidate_masks.resize(_placements.size()) _static_cell_candidate_masks.fill(0) + @warning_ignore("integer_division") var center := Vector2i(grid_size.x / 2, grid_size.y / 2) for index: int in _placements.size(): + @warning_ignore("integer_division") var coordinate := Vector2i(index % grid_size.x, index / grid_size.x) var neighbors := PackedInt32Array([-1, -1, -1, -1]) for edge_value: int in TerrainChunkTopology.Edge.values(): @@ -2596,6 +2608,7 @@ func _apply_grass_sand_smoothing() -> bool: return false var candidates: Array[Dictionary] = [] + @warning_ignore("integer_division") var center := Vector2i(grid_size.x / 2, grid_size.y / 2) for index: int in _placements.size(): var placement := _placements[index] @@ -2604,6 +2617,7 @@ func _apply_grass_sand_smoothing() -> bool: smoothing_sand_chunk_id, ]: continue + @warning_ignore("integer_division") var coordinate := Vector2i(index % grid_size.x, index / grid_size.x) if ( _coordinate_is_on_boundary(coordinate) @@ -2646,6 +2660,7 @@ func _apply_grass_sand_smoothing() -> bool: if replacement_count >= maximum_smoothing_placements: break var index := int(candidate["index"]) + @warning_ignore("integer_division") var coordinate := Vector2i(index % grid_size.x, index / grid_size.x) var diagonal := candidate["variant"] as TerrainChunkVariant if ( @@ -3260,6 +3275,7 @@ func _primary_elevated_top_coordinate() -> Vector2i: if _coordinate_has_primary_elevated_top(_elevated_feature_center): return _elevated_feature_center for index: int in _placements.size(): + @warning_ignore("integer_division") var coordinate := Vector2i(index % grid_size.x, index / grid_size.x) if not _coordinate_has_primary_elevated_top(coordinate): continue @@ -3635,11 +3651,11 @@ func _weighted_candidate_order( candidate.definition, ): weight *= long_repeat_weight_multiplier + @warning_ignore("integer_division") + var coordinate := Vector2i(index % grid_size.x, index / grid_size.x) if ( candidate.definition.prefers_map_boundary - and _coordinate_is_on_boundary( - Vector2i(index % grid_size.x, index / grid_size.x) - ) + and _coordinate_is_on_boundary(coordinate) ): weight *= boundary_preference_multiplier remaining.append(candidate) @@ -3669,6 +3685,7 @@ func _adjacent_definition_repeat_count( index: int, definition: TerrainChunkDefinition, ) -> int: + @warning_ignore("integer_division") var coordinate := Vector2i(index % grid_size.x, index / grid_size.x) var count := 0 for edge_value: int in TerrainChunkTopology.Edge.values(): @@ -3690,6 +3707,7 @@ func _preferred_neighbor_count( index: int, definition: TerrainChunkDefinition, ) -> int: + @warning_ignore("integer_division") var coordinate := Vector2i(index % grid_size.x, index / grid_size.x) var count := 0 for edge_value: int in TerrainChunkTopology.Edge.values(): @@ -3711,6 +3729,7 @@ func _long_definition_run_count( index: int, definition: TerrainChunkDefinition, ) -> int: + @warning_ignore("integer_division") var coordinate := Vector2i(index % grid_size.x, index / grid_size.x) var count := 0 for axis: Vector2i in [Vector2i.RIGHT, Vector2i.DOWN]: @@ -3762,6 +3781,7 @@ func _neighbor_requirement_validation_error( var placement := layout[index] if placement == null or placement.definition.minimum_required_neighbors <= 0: continue + @warning_ignore("integer_division") var coordinate := Vector2i(index % grid_size.x, index / grid_size.x) var matching_neighbors := 0 for edge_value: int in TerrainChunkTopology.Edge.values(): @@ -3809,6 +3829,7 @@ func _walkable_connectivity_validation_error( return "" var start_index := walkable_indices[0] if force_center_chunk_id != &"": + @warning_ignore("integer_division") var center := Vector2i(grid_size.x / 2, grid_size.y / 2) var center_index := center.y * grid_size.x + center.x if ( @@ -3822,6 +3843,7 @@ func _walkable_connectivity_validation_error( while pending_cursor < pending.size(): var index := pending[pending_cursor] pending_cursor += 1 + @warning_ignore("integer_division") var coordinate := Vector2i(index % grid_size.x, index / grid_size.x) var current := layout[index] for edge_value: int in TerrainChunkTopology.Edge.values(): @@ -3892,6 +3914,7 @@ func _least_repeated_equivalent_rotation( definition: TerrainChunkDefinition, rotations: PackedInt32Array, ) -> int: + @warning_ignore("integer_division") var coordinate := Vector2i(index % grid_size.x, index / grid_size.x) var best_score := 3 var best_rotations := PackedInt32Array() @@ -3944,6 +3967,7 @@ func _build_solution_root() -> Node3D: var variant := _placements[index] if variant == null: continue + @warning_ignore("integer_division") var coordinate := Vector2i(index % grid_size.x, index / grid_size.x) var chunk_root := _instantiate_chunk_root(variant.definition) if chunk_root == null: @@ -4325,6 +4349,7 @@ func _count_adjacent_repeat_edges() -> int: var current := _placements[index] if current == null: continue + @warning_ignore("integer_division") var coordinate := Vector2i(index % grid_size.x, index / grid_size.x) if coordinate.x > 0: var west := _placements[index - 1] @@ -4383,6 +4408,7 @@ func placement_records() -> Array[Dictionary]: var variant: TerrainChunkVariant = _placements[index] if variant == null: continue + @warning_ignore("integer_division") var coordinate := Vector2i(index % grid_size.x, index / grid_size.x) result.append({ "coordinate": coordinate, @@ -4414,7 +4440,7 @@ func chunk_position(coordinate: Vector2i) -> Vector3: ) -func coordinate_for_local_position(position: Vector3) -> Vector2i: +func coordinate_for_local_position(local_position: Vector3) -> Vector2i: if catalog == null or catalog.chunk_size <= 0.0: return Vector2i(-1, -1) var half_grid := Vector2( @@ -4422,8 +4448,8 @@ func coordinate_for_local_position(position: Vector3) -> Vector2i: float(grid_size.y - 1) * 0.5, ) return Vector2i( - roundi(position.x / catalog.chunk_size + half_grid.x), - roundi(position.z / catalog.chunk_size + half_grid.y), + roundi(local_position.x / catalog.chunk_size + half_grid.x), + roundi(local_position.z / catalog.chunk_size + half_grid.y), ) diff --git a/world/test_world.gd b/world/test_world.gd index 2e25206..9d81d4d 100644 --- a/world/test_world.gd +++ b/world/test_world.gd @@ -196,36 +196,36 @@ func get_saltwater_surface_height() -> float: ) -func is_home_exterior_position_accessible(position: Vector3) -> bool: +func is_home_exterior_position_accessible(world_position: Vector3) -> bool: return ( _active_region != null - and _active_region.is_home_exterior_position_accessible(position) + and _active_region.is_home_exterior_position_accessible(world_position) ) -func activate_world(layout: StringName, seed: int) -> bool: +func activate_world(layout: StringName, world_seed: int) -> bool: if ( not WorldLayoutType.is_valid(layout) - or seed <= 0 - or seed > PlayerSaveManager.MAX_WORLD_SEED + or world_seed <= 0 + or world_seed > PlayerSaveManager.MAX_WORLD_SEED ): return false if _active_region == null or _active_region.region_id != layout: - if not _replace_active_region(layout, seed): + if not _replace_active_region(layout, world_seed): return false _world_layout = layout - _world_seed = seed + _world_seed = world_seed if layout == WorldLayoutType.GENERATED: if not _active_region.has_method("generate_world"): return false - if not bool(_active_region.call("generate_world", seed)): + if not bool(_active_region.call("generate_world", world_seed)): return false _configure_world_coverage() return true -func generate_world(seed: int) -> bool: - return activate_world(WorldLayoutType.GENERATED, seed) +func generate_world(world_seed: int) -> bool: + return activate_world(WorldLayoutType.GENERATED, world_seed) func get_world_layout() -> StringName: @@ -293,7 +293,7 @@ func _find_active_region() -> WorldRegion: return null -func _replace_active_region(layout: StringName, seed: int) -> bool: +func _replace_active_region(layout: StringName, world_seed: int) -> bool: var region_scene: PackedScene = ( GENERATED_REGION_SCENE if layout == WorldLayoutType.GENERATED @@ -303,7 +303,7 @@ func _replace_active_region(layout: StringName, seed: int) -> bool: if replacement == null: return false if layout == WorldLayoutType.GENERATED: - replacement.set("initial_seed", seed) + replacement.set("initial_seed", world_seed) if _active_region != null: _regions_root.remove_child(_active_region) _active_region.free() @@ -345,8 +345,8 @@ func _configure_world_coverage() -> void: coverage_shape.size = Vector3(half.x * 2.0, 4.0, half.y * 2.0) -func _set_bound(body: Node3D, position: Vector3, size: Vector3) -> void: - body.position = position +func _set_bound(body: Node3D, world_position: Vector3, size: Vector3) -> void: + body.position = world_position var collision := body.get_node("Shape") as CollisionShape3D var shape := collision.shape as BoxShape3D if shape != null: diff --git a/world/water_recovery_controller.gd b/world/water_recovery_controller.gd index 0d0c5aa..4e190d8 100644 --- a/world/water_recovery_controller.gd +++ b/world/water_recovery_controller.gd @@ -78,6 +78,11 @@ func update_world_context( safe_points: Array[SafeRespawnPoint], recovery_position_resolver: Callable = Callable(), ) -> void: + # A world change replaces the trigger set and recovery resolver. Never let + # an in-flight recovery retain its old-world input lock or fade callback. + # The caller may be changing worlds while gameplay remains active, so this + # variant restores the control state that recovery itself captured. + _abort_active_recovery(true) for water_trigger: PlayerWaterTrigger in _water_triggers: if ( water_trigger != null @@ -117,7 +122,15 @@ func _process(delta: float) -> void: func set_recovery_enabled(enabled: bool) -> void: + if _recovery_enabled == enabled: + return _recovery_enabled = enabled + if not enabled: + # Gameplay/session teardown can happen while the screen is fading. The + # normal finish callback would then never be allowed to leave the fishing + # input gate, which makes the next session appear unable to fish. Preserve + # the caller's disabled controls while releasing recovery-owned state. + _abort_active_recovery(false) func is_recovery_active() -> bool: @@ -125,15 +138,7 @@ func is_recovery_active() -> bool: func _exit_tree() -> void: - _generation += 1 - if _screen_fade != null and is_instance_valid(_screen_fade): - _screen_fade.reset_immediately() - if _player != null and is_instance_valid(_player): - _player.restore_gameplay_orientation_after_recovery() - _player.set_water_recovery_active(false) - _player.set_movement_enabled(_prior_movement_enabled) - _player.set_camera_input_enabled(_prior_camera_input_enabled) - state = RecoveryState.IDLE + _abort_active_recovery(true) func _on_recovery_requested( @@ -225,3 +230,26 @@ func _finish_recovery() -> void: state = RecoveryState.IDLE _bob_elapsed = 0.0 recovery_finished.emit() + + +func _abort_active_recovery(restore_controls: bool) -> void: + if state == RecoveryState.IDLE: + return + # Invalidate every in-flight ScreenFade completion before returning control. + # This makes cancellation safe whether recovery was bobbing, fading out, or + # fading in. + _generation += 1 + if _screen_fade != null and is_instance_valid(_screen_fade): + _screen_fade.reset_immediately() + if _player != null and is_instance_valid(_player): + _player.restore_gameplay_orientation_after_recovery() + _player.set_water_recovery_active(false) + _player.velocity = Vector3.ZERO + if restore_controls: + _player.set_movement_enabled(_prior_movement_enabled) + _player.set_camera_input_enabled(_prior_camera_input_enabled) + if _fishing_spot != null and is_instance_valid(_fishing_spot): + _fishing_spot.end_water_recovery() + state = RecoveryState.IDLE + _bob_elapsed = 0.0 + recovery_finished.emit() diff --git a/world/world_time_service.gd b/world/world_time_service.gd index b521c7f..56ef0d8 100644 --- a/world/world_time_service.gd +++ b/world/world_time_service.gd @@ -381,8 +381,8 @@ func _set_remote_datetime(time_hours: float, date_id: String) -> void: "year": int(date_id.substr(0, 4)), "month": int(date_id.substr(5, 2)), "day": int(date_id.substr(8, 2)), - "hour": total_seconds / 3600, - "minute": (total_seconds / 60) % 60, + "hour": int(float(total_seconds) / 3600.0), + "minute": int(float(total_seconds) / 60.0) % 60, "second": total_seconds % 60, } _set_calendar_date_id(date_id) @@ -432,11 +432,14 @@ static func _is_leap_year(year: int) -> bool: static func _weekday_for_date(year: int, month: int, day: int) -> int: var adjusted_year: int = year - 1 if month < 3 else year + var leap_years: int = int(float(adjusted_year) / 4.0) + var skipped_centuries: int = int(float(adjusted_year) / 100.0) + var restored_quadricentennials: int = int(float(adjusted_year) / 400.0) return posmod( adjusted_year - + adjusted_year / 4 - - adjusted_year / 100 - + adjusted_year / 400 + + leap_years + - skipped_centuries + + restored_quadricentennials + WEEKDAY_MONTH_OFFSETS[month - 1] + day, 7, From 9cf0c8fc9c910e1a6eb550860387e92b6464198b Mon Sep 17 00:00:00 2001 From: Voyager Date: Tue, 1 Sep 2026 10:21:21 -0400 Subject: [PATCH 24/37] test: align storage validation with home upgrades --- tests/unified_inventory_validation.gd | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/tests/unified_inventory_validation.gd b/tests/unified_inventory_validation.gd index a313cd7..c02f188 100644 --- a/tests/unified_inventory_validation.gd +++ b/tests/unified_inventory_validation.gd @@ -24,10 +24,12 @@ func _run() -> void: var bag := PlayerBag.new() var catches := FishInventory.new() var capacity := PlayerCoolerCapacity.new() + var home_state := PlayerHomeState.new() var layout := PlayerInventoryLayout.new() var hotbar := PlayerHotbar.new() - for node: Node in [bag, catches, capacity, layout, hotbar]: + for node: Node in [bag, catches, capacity, home_state, layout, hotbar]: scene_root.add_child(node) + capacity.bind_home_state(home_state) bag.setup(ItemCatalogResource) layout.setup(bag, catches, ItemCatalogResource, capacity) bag.set_inventory_layout(layout) @@ -239,13 +241,12 @@ func _run() -> void: (all_storage_slots[9] as GeneralInventorySlot).accessibility_name == "locked storage slot 10" ) - var storage_wallet := PlayerWallet.new() - scene_root.add_child(storage_wallet) - assert(storage_wallet.restore_balance(9500)) - for expected_capacity: int in [18, 27, 36, 45, 54, 63, 72]: - assert(capacity.purchase(storage_wallet)) - assert(layout.get_storage_capacity() == expected_capacity) - assert(storage_grid.get_slots().size() == expected_capacity) + assert(not capacity.can_purchase(wallet)) + assert(not capacity.purchase(wallet)) + assert(home_state.upgrade_to_next_tier()) + assert(layout.get_storage_capacity() == 18) + assert(storage_grid.get_slots().size() == 18) + assert(not home_state.upgrade_to_next_tier()) assert(capacity.get_next_capacity() == -1) assert(capacity.get_next_cost() == -1) From 4d31fd1517d7c72f35794ae77422671093bf16ce Mon Sep 17 00:00:00 2001 From: Voyager Date: Tue, 1 Sep 2026 10:21:26 -0400 Subject: [PATCH 25/37] feat(network): add selectable privacy-preserving discovery --- docs/DEVELOPMENT.md | 19 +- docs/README-PLAYTEST.txt | 18 +- export_presets.cfg | 24 +- main/main.gd | 69 ++++- network/connection_route.gd | 47 +++- network/direct_enet_transport.gd | 5 +- network/discovery_client.gd | 195 ++++++++++++-- network/network_session.gd | 65 ++++- network/saved_server_store.gd | 8 +- network/server_trust_store.gd | 55 +++- project.godot | 2 +- scripts/build_playtest.sh | 8 +- scripts/run_validations.sh | 1 + tests/dedicated_server_config_validation.gd | 37 ++- tests/discovery_privacy_validation.gd | 98 +++++++ tests/discovery_privacy_validation.gd.uid | 1 + ui/icons/address_hidden.svg | 4 + ui/icons/address_hidden.svg.import | 43 +++ ui/icons/address_visible.svg | 4 + ui/icons/address_visible.svg.import | 43 +++ ui/network/join_game_page.gd | 281 ++++++++++++++++---- ui/network/join_game_page.tscn | 33 ++- ui/pause_menu.gd | 29 +- ui/players_page.gd | 19 +- ui/title_screen.gd | 2 +- ui/title_screen.tscn | 2 +- 26 files changed, 959 insertions(+), 153 deletions(-) create mode 100644 tests/discovery_privacy_validation.gd create mode 100644 tests/discovery_privacy_validation.gd.uid create mode 100644 ui/icons/address_hidden.svg create mode 100644 ui/icons/address_hidden.svg.import create mode 100644 ui/icons/address_visible.svg create mode 100644 ui/icons/address_visible.svg.import diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index 76ed032..ef0e161 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -38,11 +38,15 @@ node names, connect persistent and networked state to that data. network services validate and replicate bounded domains such as fishing, sales, shops, item use, profiles, jobs, mail, chat, drawings, time, and weather. -`DiscoveryClient` is an optional directory layer beside `NetworkSession`. An -open host may publish a short-lived room lease, and the shared Join Game page -may browse compatible leases before handing the selected address back to the -existing direct ENet connection flow. The directory does not carry gameplay -traffic or become a gameplay authority. Its base URL comes from +`DiscoveryClient` is an optional directory layer beside `NetworkSession`. A +player host cycles its discovery control through `private`, `direct`, and +`relay`. Private leaves the room unlisted, direct discovery discloses the host +route only after an explicit Join, and relay discovery allocates a UDP privacy +route without making discovery a gameplay authority. Relay joins fail closed +and never silently downgrade to direct. Dedicated servers are always direct: +the game forces direct advertisements and discovery independently rejects a +dedicated relay request. Public room browsing never receives a host address. +The base URL comes from `network/discovery/base_url`, with `straywild_DISCOVERY_URL` available as a development/deployment override. @@ -53,8 +57,9 @@ friendship; unblocking does not recreate it. Discovery may publish opt-in, short-lived friend presence and deliver invitations only while both games are online. It stores hashed capability identifiers rather than identity fingerprints or a complete friend graph, keeps no durable social records, and -provides no offline delivery. Direct joins still use the existing verified -public-room and ENet connection path. +provides no offline delivery. Public joins still use the existing verified +server-identity and ENet connection path. Discovery endpoints remain transient: +they are not shown, added to recent servers, or persisted in the trust store. The host is authoritative. Clients submit requests or evidence; the host derives trusted context from registered peers, authoritative regions, and diff --git a/docs/README-PLAYTEST.txt b/docs/README-PLAYTEST.txt index f187182..e7632e2 100644 --- a/docs/README-PLAYTEST.txt +++ b/docs/README-PLAYTEST.txt @@ -1,13 +1,18 @@ straywild -v0.20.2-alpha -Alpha 0.20.2 +v0.20.3-alpha +Alpha 0.20.3 Thank you for supporting this private testing release. straywild is an early multiplayer fishing game. This alpha includes local progression, player-hosted and dedicated multiplayer sessions, public room -discovery, and direct UDP connections. Expect rough edges and please keep a -backup of any save or identity data you care about. +discovery, player-selected direct or privacy-relayed hosting, and optional +direct UDP connections. Player hosts can cycle discovery through private, +direct, and relay. Dedicated servers are always direct and cannot use the +shared relay. The relay hides peers' addresses from one another but not from +the relay operator. Direct connections expose public IP addresses to the +remote peer and are clearly labeled in game. Expect rough edges and please +keep a backup of any save or identity data you care about. INSTALLATION @@ -115,8 +120,9 @@ Please include: KNOWN ALPHA LIMITATIONS -- Public sessions remain direct connections; restrictive NAT or carrier-grade - networks may prevent some players from joining. +- Direct public sessions may fail behind restrictive NAT or carrier-grade + networks. Player-hosted relay sessions add an extra network hop and may have + more latency. Dedicated servers are direct-only. - Multiplayer, dedicated-server deployment, UI, and balance are still alpha. - Some fish and character artwork remains temporary. - RV exteriors and decor use temporary prototype geometry and presentation. diff --git a/export_presets.cfg b/export_presets.cfg index a49f01f..76fdef3 100644 --- a/export_presets.cfg +++ b/export_presets.cfg @@ -9,7 +9,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.20.2-alpha/windows-x86_64/straywild.exe" +export_path="builds/v0.20.3-alpha/windows-x86_64/straywild.exe" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -35,11 +35,11 @@ application/modify_resources=true application/icon="res://art/exported/system_icons/straywild.ico" application/console_wrapper_icon="" application/icon_interpolation=0 -application/file_version="0.20.2.0" -application/product_version="0.20.2.0" +application/file_version="0.20.3.0" +application/product_version="0.20.3.0" application/company_name="Woofmeow" application/product_name="straywild" -application/file_description="straywild v0.20.2-alpha" +application/file_description="straywild v0.20.3-alpha" application/copyright="Copyright © 2026 Woofmeow" application/trademarks="straywild and Woofmeow branding is reserved; see TRADEMARKS.md" application/export_angle=0 @@ -62,7 +62,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.20.2-alpha/linux-arm64/straywild.arm64" +export_path="builds/v0.20.3-alpha/linux-arm64/straywild.arm64" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -92,7 +92,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.20.2-alpha/macos/straywild.zip" +export_path="builds/v0.20.3-alpha/macos/straywild.zip" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -108,8 +108,8 @@ custom_template/release="" application/bundle_identifier="io.woofmeow.netfishing" application/icon="res://art/exported/system_icons/straywild_1024.png" application/icon_interpolation=0 -application/short_version="0.20.2" -application/version="0.20.2" +application/short_version="0.20.3" +application/version="0.20.3" application/architecture="universal" codesign/enable=false notarization/enable=false @@ -125,7 +125,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*,tests/*" -export_path="builds/v0.20.2-alpha/server-linux-x86_64/straywildServer.x86_64" +export_path="builds/v0.20.3-alpha/server-linux-x86_64/straywildServer.x86_64" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -155,7 +155,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.20.2-alpha/android/straywild.apk" +export_path="builds/v0.20.3-alpha/android/straywild.apk" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -177,7 +177,7 @@ architectures/arm64-v8a=true architectures/x86=false architectures/x86_64=false version/code=200200 -version/name="v0.20.2-alpha" +version/name="v0.20.3-alpha" package/unique_name="io.woofmeow.netfishing" package/name="straywild" package/signed=true @@ -214,7 +214,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.20.2-alpha/linux-x86_64/straywild.x86_64" +export_path="builds/v0.20.3-alpha/linux-x86_64/straywild.x86_64" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" diff --git a/main/main.gd b/main/main.gd index f7f4f0f..ab013d7 100644 --- a/main/main.gd +++ b/main/main.gd @@ -2234,9 +2234,15 @@ func _on_return_to_title_requested() -> void: _show_title_music(true) -func _on_title_join_game_requested(endpoint: String) -> void: +func _on_title_join_game_requested(requested_route: Variant) -> void: if _quit_in_progress or _gameplay_started: return + var route := _coerce_connection_route(requested_route) + if route == null: + _game_ui.get_title_screen().report_network_error( + "That connection address is invalid." + ) + return var active_slot: Dictionary = _save_slots.ensure_active_slot() if not bool(active_slot.get("ok", false)): _game_ui.get_title_screen().report_network_error( @@ -2247,14 +2253,26 @@ func _on_title_join_game_requested(endpoint: String) -> void: _network_session.disconnect_session("Preparing direct connection.") _join_requested_from_title = true _join_requested_from_pause = false - _pending_join_endpoint = endpoint - if not _network_session.join_direct(endpoint): + _pending_join_endpoint = ( + route.direct_endpoint.normalized_display + if route != null + and not route.is_discovery_join() + and route.direct_endpoint != null + else "" + ) + if not _network_session.join_route(route): _join_requested_from_title = false -func _on_pause_join_game_requested(endpoint: String) -> void: +func _on_pause_join_game_requested(requested_route: Variant) -> void: if _quit_in_progress or not _gameplay_started: return + var route := _coerce_connection_route(requested_route) + if route == null: + _game_ui.get_pause_menu().report_network_error( + "That connection address is invalid." + ) + return if not _save_manager.save_world_time_checkpoint(): _game_ui.get_pause_menu().report_network_error( "Could not save progression before leaving this session." @@ -2262,20 +2280,36 @@ func _on_pause_join_game_requested(endpoint: String) -> void: return _join_requested_from_pause = true _join_requested_from_title = false - _pending_join_endpoint = endpoint + _pending_join_endpoint = ( + route.direct_endpoint.normalized_display + if route != null + and not route.is_discovery_join() + and route.direct_endpoint != null + else "" + ) _game_ui.get_pause_menu().close_for_title_transition() var preserved_public_join: bool = ( _discovery.preserve_public_join_for_session_switch() ) _network_session.disconnect_session("Connecting to another game.") - if not _network_session.join_direct(endpoint): + if not _network_session.join_route(route): if preserved_public_join: _discovery.cancel_pending_public_join() _handle_failed_session_switch( - "Could not begin the direct connection." + "Could not begin the connection." ) +func _coerce_connection_route(value: Variant) -> ConnectionRoute: + if value is ConnectionRoute: + var supplied_route := value as ConnectionRoute + return supplied_route if supplied_route.is_valid() else null + if typeof(value) != TYPE_STRING: + return null + var endpoint := EndpointParser.parse(str(value)) + return ConnectionRoute.direct(endpoint) if endpoint.is_valid() else null + + func _on_friend_request_received( request_id: String, fingerprint: String, @@ -2335,8 +2369,17 @@ func _show_next_social_prompt() -> void: elif kind == "friend_invite": var room: Dictionary = _active_social_prompt.get("room", {}) var room_name := str(room.get("room_name", "their room")) + var relayed := str(room.get("connection_mode", "")) == "relay" + var privacy_message := ( + "This join uses a privacy relay; the relay service still handles " + + "both network addresses." + if relayed + else "This is a direct connection. Joining shares your public IP " + + "address with the host." + ) shown = _game_ui.show_social_prompt( - "%s invited you to join %s." % [display_name, room_name], + "%s invited you to join %s.\n%s" + % [display_name, room_name, privacy_message], "join", "not now", ) @@ -2375,16 +2418,16 @@ func _on_social_prompt_declined() -> void: call_deferred("_show_next_social_prompt") -func _on_social_public_join_prepared(endpoint: String) -> void: +func _on_social_public_join_prepared(route: ConnectionRoute) -> void: if not _pending_social_invite_join: return var from_gameplay := _pending_social_invite_gameplay _pending_social_invite_join = false _pending_social_invite_gameplay = false if from_gameplay: - _on_pause_join_game_requested(endpoint) + _on_pause_join_game_requested(route) else: - _on_title_join_game_requested(endpoint) + _on_title_join_game_requested(route) func _on_social_public_join_status_changed( @@ -2412,7 +2455,7 @@ func _on_network_join_authenticated() -> void: var server_metadata: Dictionary = ( _network_session.get_last_server_metadata() ) - if connected_endpoint != null: + if connected_endpoint != null and not _network_session.is_current_route_discovery(): _saved_servers.record_successful_connection( connected_endpoint, int(server_metadata.get("max_players", 0)), @@ -2455,7 +2498,7 @@ func _on_network_connection_error(message: String) -> void: var failed_endpoint: ConnectionEndpoint = ( _network_session.get_current_endpoint() ) - if failed_endpoint != null: + if failed_endpoint != null and not _network_session.is_current_route_discovery(): _saved_servers.record_connection_failure( failed_endpoint, _connection_result_code(message), diff --git a/network/connection_route.gd b/network/connection_route.gd index af9e625..2f490c7 100644 --- a/network/connection_route.gd +++ b/network/connection_route.gd @@ -3,22 +3,65 @@ extends RefCounted enum Kind { DIRECT, + DISCOVERY_DIRECT, + DISCOVERY_RELAY, } var kind: Kind = Kind.DIRECT var direct_endpoint: ConnectionEndpoint var display_description: String = "" +var discovery_room_id: String = "" static func direct(endpoint: ConnectionEndpoint) -> ConnectionRoute: var route := ConnectionRoute.new() route.kind = Kind.DIRECT route.direct_endpoint = endpoint + route.display_description = "direct server" if endpoint != null else "" + return route + + +static func discovery_direct( + endpoint: ConnectionEndpoint, + room_id: String, + room_name: String, +) -> ConnectionRoute: + var route := ConnectionRoute.new() + route.kind = Kind.DISCOVERY_DIRECT + route.direct_endpoint = endpoint + route.discovery_room_id = room_id + var cleaned_name := room_name.strip_edges() route.display_description = ( - endpoint.normalized_display if endpoint != null else "" + cleaned_name if not cleaned_name.is_empty() else "public room" ) return route +static func discovery_relay( + endpoint: ConnectionEndpoint, + room_id: String, + room_name: String, +) -> ConnectionRoute: + var route := discovery_direct(endpoint, room_id, room_name) + route.kind = Kind.DISCOVERY_RELAY + return route + + func is_valid() -> bool: - return kind == Kind.DIRECT and direct_endpoint != null and direct_endpoint.is_valid() + return ( + kind in [Kind.DIRECT, Kind.DISCOVERY_DIRECT, Kind.DISCOVERY_RELAY] + and direct_endpoint != null + and direct_endpoint.is_valid() + and ( + kind == Kind.DIRECT + or not discovery_room_id.is_empty() + ) + ) + + +func is_discovery_join() -> bool: + return kind in [Kind.DISCOVERY_DIRECT, Kind.DISCOVERY_RELAY] + + +func is_relay() -> bool: + return kind == Kind.DISCOVERY_RELAY diff --git a/network/direct_enet_transport.gd b/network/direct_enet_transport.gd index 067b86c..e753246 100644 --- a/network/direct_enet_transport.gd +++ b/network/direct_enet_transport.gd @@ -34,11 +34,12 @@ func connect_to_route(route: ConnectionRoute) -> Error: ) if error != OK: transport_error.emit( - "Unable to connect to %s." % endpoint.normalized_display + "Unable to begin the connection to %s." + % route.display_description ) return error _peer = enet_peer - _route_description = endpoint.normalized_display + _route_description = route.display_description return OK diff --git a/network/discovery_client.gd b/network/discovery_client.gd index 1e9272f..583f104 100644 --- a/network/discovery_client.gd +++ b/network/discovery_client.gd @@ -6,7 +6,7 @@ signal browse_status_changed(message: String, is_error: bool) signal host_settings_changed(room_name: String, discoverable: bool) signal host_status_changed(message: String, is_error: bool) signal host_state_changed(state: int) -signal public_join_prepared(endpoint: String) +signal public_join_prepared(route: ConnectionRoute) signal public_join_status_changed(message: String, is_error: bool) signal public_join_state_changed(state: int) signal friend_presence_updated(friends: Array[Dictionary]) @@ -28,6 +28,9 @@ const LEGACY_DEFAULT_ROOM_NAME: String = "straywild Room" const LEGACY_DEDICATED_DEFAULT_ROOM_NAME: String = ( "straywild Dedicated Server" ) +const HOST_CONNECTION_DIRECT: String = "direct" +const HOST_CONNECTION_RELAY: String = "relay" +const HOST_DISCOVERY_PRIVATE: String = "private" const ROOM_NAME_SUFFIX: String = "'s Server" const MAX_ROOM_NAME_LENGTH: int = 48 const HEARTBEAT_INTERVAL_SECONDS: float = 15.0 @@ -35,6 +38,7 @@ const REQUEST_TIMEOUT_SECONDS: float = 8.0 const TRAVERSAL_POLL_INTERVAL_SECONDS: float = 1.0 const JOIN_PROBE_INTERVAL_SECONDS: float = 0.35 const TRAVERSAL_PACKET_PREFIX: String = "straywild_TRAVERSAL_V1 " +const RELAY_AUTH_PACKET_PREFIX: String = "straywild_RELAY_AUTH_V1 " const UPNP_MAPPING_DURATION_SECONDS: int = 3600 const UPNP_RENEW_INTERVAL_SECONDS: float = 2700.0 const UPNP_RETRY_INTERVAL_SECONDS: float = 300.0 @@ -90,6 +94,7 @@ var _join_request: HTTPRequest var _traversal_timer: Timer var _join_probe_timer: Timer var _host_verified: bool = false +var _host_connection_preference: String = HOST_CONNECTION_DIRECT var _traversal_host: String = "" var _traversal_port: int = 0 var _host_verification_token: String = "" @@ -97,6 +102,8 @@ var _join_request_in_flight: bool = false var _pending_join_endpoint: String = "" var _pending_join_token: String = "" var _pending_join_room_id: String = "" +var _pending_join_room_name: String = "" +var _pending_join_transport: String = "" var _preserve_pending_join_on_inactive: bool = false var _upnp_thread: Thread var _upnp_mapping_in_progress: bool = false @@ -381,12 +388,25 @@ func get_host_state() -> HostState: return _host_state +func get_host_connection_mode() -> String: + return _host_connection_preference + + +func get_host_discovery_mode() -> String: + return ( + _host_connection_preference + if _discoverable + else HOST_DISCOVERY_PRIVATE + ) + + func get_public_join_state() -> PublicJoinState: return _public_join_state func configure_dedicated_runtime(room_name: String) -> bool: _host_settings_persistence_enabled = false + _host_connection_preference = HOST_CONNECTION_DIRECT return set_room_name(room_name) @@ -453,6 +473,49 @@ func set_discoverable(enabled: bool) -> bool: return true +func set_host_connection_mode(connection_mode: String) -> bool: + if connection_mode not in [ + HOST_CONNECTION_DIRECT, + HOST_CONNECTION_RELAY, + ]: + return false + if ( + connection_mode == HOST_CONNECTION_RELAY + and _session != null + and _session.is_dedicated_host() + ): + _set_host_state(HostState.ERROR) + _set_host_status( + "Dedicated servers must use direct discovery hosting.", true + ) + return false + if _host_connection_preference == connection_mode: + return true + _host_connection_preference = connection_mode + _save_settings() + host_settings_changed.emit(_room_name, _discoverable) + if _discoverable: + _set_host_state(HostState.REGISTERING) + _set_host_status("Updating public connection mode…", false) + _synchronize_host_lease() + return true + + +func cycle_host_discovery_mode() -> bool: + match get_host_discovery_mode(): + HOST_DISCOVERY_PRIVATE: + if not set_host_connection_mode(HOST_CONNECTION_DIRECT): + return false + return set_discoverable(true) + HOST_CONNECTION_DIRECT: + if _session != null and _session.is_dedicated_host(): + return set_discoverable(false) + return set_host_connection_mode(HOST_CONNECTION_RELAY) + HOST_CONNECTION_RELAY: + return set_discoverable(false) + return false + + func is_public_join_preparing() -> bool: return _join_request_in_flight @@ -480,13 +543,16 @@ func prepare_public_join(room: Dictionary) -> bool: "You are already hosting this room.", true ) return false - var endpoint: String = room_endpoint(room) var room_id: String = str(room.get("room_id", "")).strip_edges() - if endpoint.is_empty() or room_id.is_empty(): + if room_id.is_empty(): _set_public_join_state(PublicJoinState.ERROR) return false - _pending_join_endpoint = endpoint + _pending_join_endpoint = "" _pending_join_room_id = room_id + _pending_join_room_name = str( + room.get("room_name", "public room") + ).strip_edges() + _pending_join_transport = str(room.get("connection_mode", "")) _pending_join_token = "" var url: String = "%s/v1/rooms/%s/join-attempts" % [ _base_url, @@ -535,16 +601,6 @@ func request_rooms() -> bool: return true -func room_endpoint(room: Dictionary) -> String: - var address: String = str(room.get("address", "")).strip_edges() - var port: int = int(room.get("port", 0)) - if address.is_empty() or port < 1 or port > 65535: - return "" - if ":" in address and not address.begins_with("["): - address = "[%s]" % address - return "%s:%d" % [address, port] - - func is_own_room(room: Dictionary) -> bool: return ( not _lease_room_id.is_empty() @@ -640,6 +696,14 @@ func _host_payload() -> Dictionary: ProjectSettings.get_setting("application/config/version", "unknown") ), "protocol_version": NetworkProtocol.PROTOCOL_VERSION, + "host_kind": ( + "dedicated" if _session.is_dedicated_host() else "player" + ), + "connection_mode": ( + HOST_CONNECTION_DIRECT + if _session.is_dedicated_host() + else _host_connection_preference + ), } @@ -688,7 +752,7 @@ func _on_host_request_completed( else HostState.VERIFYING ) _set_host_status( - "Room is listed publicly." + _host_listing_status(room) if _host_verified else "Checking the public route…", false, @@ -706,7 +770,7 @@ func _on_host_request_completed( else HostState.VERIFYING ) _set_host_status( - "Room is listed publicly." + _host_listing_status(room) if _host_verified else "Checking the public route…", false, @@ -755,10 +819,33 @@ func _on_join_request_completed( return _pending_join_token = str(response.get("join_token", "")) _apply_traversal_response(response) + var route_transport := "" + var route_privacy := "" + var route_details: Variant = response.get("route", {}) + if typeof(route_details) == TYPE_DICTIONARY: + var direct_route: Dictionary = route_details + route_transport = str(direct_route.get("transport", "")) + route_privacy = str(direct_route.get("ip_privacy", "")) + if route_transport in ["direct", "relay"]: + var address := str(direct_route.get("address", "")).strip_edges() + var port := int(direct_route.get("port", 0)) + if not address.is_empty() and port >= 1 and port <= 65535: + if ":" in address and not address.begins_with("["): + address = "[%s]" % address + _pending_join_endpoint = "%s:%d" % [address, port] if ( _pending_join_token.is_empty() - or _traversal_host.is_empty() - or _traversal_port < 1 + or _pending_join_endpoint.is_empty() + or route_transport != _pending_join_transport + or ( + route_transport == "direct" + and route_privacy != "peer_visible" + ) + or (route_transport == "relay" and route_privacy != "relayed") + or ( + route_transport == "direct" + and (_traversal_host.is_empty() or _traversal_port < 1) + ) ): _set_public_join_state(PublicJoinState.ERROR) public_join_status_changed.emit( @@ -768,7 +855,25 @@ func _on_join_request_completed( return _set_public_join_state(PublicJoinState.CONNECTING) public_join_status_changed.emit("Connecting…", false) - public_join_prepared.emit(_pending_join_endpoint) + var endpoint := EndpointParser.parse(_pending_join_endpoint) + if not endpoint.is_valid(): + _set_public_join_state(PublicJoinState.ERROR) + public_join_status_changed.emit("Could not reach this room.", true) + _clear_pending_join() + return + public_join_prepared.emit( + ConnectionRoute.discovery_relay( + endpoint, + _pending_join_room_id, + _pending_join_room_name, + ) + if route_transport == "relay" + else ConnectionRoute.discovery_direct( + endpoint, + _pending_join_room_id, + _pending_join_room_name, + ) + ) func _on_traversal_timer_timeout() -> void: @@ -856,6 +961,15 @@ func _send_pending_join_probe() -> void: ): _join_probe_timer.stop() return + if _pending_join_transport == "relay": + var relay_endpoint := EndpointParser.parse(_pending_join_endpoint) + if relay_endpoint.is_valid(): + _session.send_traversal_packet( + relay_endpoint.host, + relay_endpoint.port, + (RELAY_AUTH_PACKET_PREFIX + _pending_join_token).to_utf8_buffer(), + ) + return _send_traversal_probe({ "kind": "join", "room_id": _pending_join_room_id, @@ -1013,10 +1127,24 @@ func _valid_public_room(room: Dictionary) -> bool: return ( typeof(room.get("room_id")) == TYPE_STRING and typeof(room.get("room_name")) == TYPE_STRING - and typeof(room.get("address")) == TYPE_STRING and typeof(room.get("game_version")) == TYPE_STRING and str(room.get("game_version")) == expected_version - and _valid_json_integer(room.get("port"), 1, 65535) + and str(room.get("connection_mode", "")) in ["direct", "relay"] + and ( + ( + str(room.get("connection_mode", "")) == "direct" + and str(room.get("ip_privacy", "")) == "peer_visible" + ) + or ( + str(room.get("connection_mode", "")) == "relay" + and str(room.get("ip_privacy", "")) == "relayed" + ) + ) + and str(room.get("host_kind", "")) in ["player", "dedicated"] + and not ( + str(room.get("host_kind", "")) == "dedicated" + and str(room.get("connection_mode", "")) == "relay" + ) and _valid_json_integer(room.get("current_players"), 0, 128) and _valid_json_integer(room.get("max_players"), 1, 128) and int(room["current_players"]) <= int(room["max_players"]) @@ -1370,6 +1498,18 @@ func _request_failure(response: Dictionary) -> String: return "Room discovery is temporarily unavailable." +func _host_listing_status(room: Dictionary) -> String: + if str(room.get("connection_mode", "")) == "relay": + return ( + "Room is listed through the privacy relay. Players see a relay " + + "address; the relay service still handles network addresses." + ) + return ( + "Room is listed. Its address is hidden while browsing, but direct " + + "players can see your public IP after joining." + ) + + func _discovery_version_mismatch_message(required_version: String) -> String: var local_version: String = NetworkProtocol.game_version() var rejection: NetworkProtocol.RejectionCode = ( @@ -1493,6 +1633,8 @@ func _clear_pending_join() -> void: _pending_join_endpoint = "" _pending_join_token = "" _pending_join_room_id = "" + _pending_join_room_name = "" + _pending_join_transport = "" _join_probe_timer.stop() @@ -1571,6 +1713,14 @@ func _load_settings() -> void: _presence_sharing = bool(config.get_value( "social", "share_presence", false )) + var saved_connection_mode := str(config.get_value( + "host", "connection_mode", HOST_CONNECTION_DIRECT + )) + if saved_connection_mode in [ + HOST_CONNECTION_DIRECT, + HOST_CONNECTION_RELAY, + ]: + _host_connection_preference = saved_connection_mode func _save_settings() -> void: @@ -1581,6 +1731,9 @@ func _save_settings() -> void: config.set_value( "host", "room_name_uses_default", _room_name_uses_default ) + config.set_value( + "host", "connection_mode", _host_connection_preference + ) config.set_value("social", "share_presence", _presence_sharing) var error: Error = config.save(SETTINGS_PATH) if error != OK: diff --git a/network/network_session.gd b/network/network_session.gd index 9576ceb..13c05d3 100644 --- a/network/network_session.gd +++ b/network/network_session.gd @@ -485,17 +485,30 @@ func join_direct(endpoint_text: String) -> bool: if not endpoint.is_valid(): _fail(endpoint.error_message) return false + return join_route(ConnectionRoute.direct(endpoint)) + + +func join_route(route: ConnectionRoute) -> bool: + if ( + state != State.INACTIVE + or not _profile_ready + or _profile == null + or _spawn_service == null + or route == null + or not route.is_valid() + ): + return false _operation_generation += 1 var generation: int = _operation_generation - _current_route = ConnectionRoute.direct(endpoint) + _current_route = route _set_state( State.CONNECTING, - "Connecting to %s..." % endpoint.normalized_display + "Connecting to %s..." % route.display_description ) _replace_transport() var error: Error = _transport.connect_to_route(_current_route) if error != OK: - _fail("Could not begin the direct connection.") + _fail("Could not begin the connection.") return false multiplayer.multiplayer_peer = _transport.get_multiplayer_peer() _connection_deadline = ( @@ -597,11 +610,23 @@ func get_current_endpoint() -> ConnectionEndpoint: return ( _current_route.direct_endpoint if _current_route != null - and _current_route.kind == ConnectionRoute.Kind.DIRECT + and _current_route.kind in [ + ConnectionRoute.Kind.DIRECT, + ConnectionRoute.Kind.DISCOVERY_DIRECT, + ConnectionRoute.Kind.DISCOVERY_RELAY, + ] else null ) +func is_current_route_discovery() -> bool: + return _current_route != null and _current_route.is_discovery_join() + + +func is_current_route_relay() -> bool: + return _current_route != null and _current_route.is_relay() + + func get_last_server_metadata() -> Dictionary: return { "server_display_name": _last_server_display_name, @@ -1226,11 +1251,16 @@ func receive_server_identity_proof(data: Dictionary) -> void: _pending_server_proof = data.duplicate(true) _server_identity_fingerprint = fingerprint _server_identity_public_key = public_pem - var verification := _server_trust.verify( - get_current_endpoint(), fingerprint + var verification := ( + _server_trust.verify_identity(fingerprint) + if is_current_route_discovery() + else _server_trust.verify(get_current_endpoint(), fingerprint) ) if verification == ServerTrustStore.Verification.MATCH: - _server_trust.touch(get_current_endpoint()) + if is_current_route_discovery(): + _server_trust.touch_identity(fingerprint) + else: + _server_trust.touch(get_current_endpoint()) _send_client_identity_proof() return _set_state( @@ -1238,9 +1268,12 @@ func receive_server_identity_proof(data: Dictionary) -> void: "Confirm this server identity before continuing.", ) _connection_deadline = 0.0 - var expected := str( - _server_trust.get_record(get_current_endpoint()).get("fingerprint", "") + var trust_record: Dictionary = ( + _server_trust.get_identity_record(fingerprint) + if is_current_route_discovery() + else _server_trust.get_record(get_current_endpoint()) ) + var expected := str(trust_record.get("fingerprint", "")) server_trust_required.emit( get_current_route_display(), expected, @@ -1255,11 +1288,15 @@ func resolve_server_trust(accepted: bool) -> void: if not accepted: cancel_connection() return - if not _server_trust.trust( - get_current_endpoint(), - str(_pending_server_proof["server_fingerprint"]), - "straywild", - ): + var fingerprint := str(_pending_server_proof["server_fingerprint"]) + var trusted := ( + _server_trust.trust_identity(fingerprint, get_current_route_display()) + if is_current_route_discovery() + else _server_trust.trust( + get_current_endpoint(), fingerprint, "straywild" + ) + ) + if not trusted: _fail_identity("The server identity could not be pinned.") return _set_state(State.AUTHENTICATING, "Authenticating identity...") diff --git a/network/saved_server_store.gd b/network/saved_server_store.gd index 4e00259..c1ae4f8 100644 --- a/network/saved_server_store.gd +++ b/network/saved_server_store.gd @@ -196,7 +196,7 @@ func record_successful_connection( recent = _make_entry(endpoint, SavedServerEntry.Kind.RECENT) _recent_entries.append(recent) recent["display_name"] = ( - server_name if not server_name.is_empty() else endpoint.normalized_display + server_name if not server_name.is_empty() else "Recent Server" ) _apply_result_metadata( recent, now, "SUCCESS", server_name, protocol_version, @@ -358,7 +358,11 @@ func _make_entry( var now: int = int(Time.get_unix_time_from_system()) return { "entry_id": Crypto.new().generate_random_bytes(16).hex_encode(), - "display_name": endpoint.host, + "display_name": ( + "Saved Server" + if kind == SavedServerEntry.Kind.SAVED + else "Recent Server" + ), "route_kind": "DIRECT", "host": endpoint.host, "normalized_host": endpoint.host, diff --git a/network/server_trust_store.gd b/network/server_trust_store.gd index 1d4dd29..c95865e 100644 --- a/network/server_trust_store.gd +++ b/network/server_trust_store.gd @@ -39,6 +39,17 @@ func verify(endpoint: ConnectionEndpoint, fingerprint: String) -> Verification: ) +func verify_identity(fingerprint: String) -> Verification: + _ensure_loaded() + if not NetworkIdentityCrypto.valid_fingerprint(fingerprint): + return Verification.CHANGED + return ( + Verification.MATCH + if _records.has(_identity_key(fingerprint)) + else Verification.FIRST_SEEN + ) + + func get_record(endpoint: ConnectionEndpoint) -> Dictionary: _ensure_loaded() if endpoint == null: @@ -46,6 +57,11 @@ func get_record(endpoint: ConnectionEndpoint) -> Dictionary: return Dictionary(_records.get(endpoint.normalized_display, {})).duplicate(true) +func get_identity_record(fingerprint: String) -> Dictionary: + _ensure_loaded() + return Dictionary(_records.get(_identity_key(fingerprint), {})).duplicate(true) + + func trust( endpoint: ConnectionEndpoint, fingerprint: String, @@ -74,6 +90,25 @@ func trust( return _save() +func trust_identity(fingerprint: String, server_name: String = "") -> bool: + _ensure_loaded() + if not NetworkIdentityCrypto.valid_fingerprint(fingerprint): + return false + var key := _identity_key(fingerprint) + var now := int(Time.get_unix_time_from_system()) + var previous: Dictionary = _records.get(key, {}) + _records[key] = { + "route_kind": "discovery", + "identity_key": key, + "fingerprint": fingerprint, + "first_seen_unix": int(previous.get("first_seen_unix", now)), + "last_seen_unix": now, + "last_observed_server_name": server_name.left(80), + "trust_state": "pinned", + } + return _save() + + func touch(endpoint: ConnectionEndpoint) -> void: _ensure_loaded() if endpoint == null: @@ -85,6 +120,15 @@ func touch(endpoint: ConnectionEndpoint) -> void: _save() +func touch_identity(fingerprint: String) -> void: + _ensure_loaded() + var record: Dictionary = _records.get(_identity_key(fingerprint), {}) + if record.is_empty(): + return + record["last_seen_unix"] = int(Time.get_unix_time_from_system()) + _save() + + func _ensure_loaded() -> void: if _loaded: return @@ -108,12 +152,21 @@ func _ensure_loaded() -> void: continue var record: Dictionary = value var endpoint := str(record.get("normalized_endpoint", "")) + var identity_key := str(record.get("identity_key", "")) var fingerprint := str(record.get("fingerprint", "")) - if not endpoint.is_empty() and NetworkIdentityCrypto.valid_fingerprint(fingerprint): + if not NetworkIdentityCrypto.valid_fingerprint(fingerprint): + continue + if not endpoint.is_empty(): _records[endpoint] = record.duplicate(true) + elif identity_key == _identity_key(fingerprint): + _records[identity_key] = record.duplicate(true) _expected_hash = PortableFileGuard.hash_file(_store_path) +static func _identity_key(fingerprint: String) -> String: + return "identity:%s" % fingerprint + + func _save() -> bool: if _write_blocked: return false diff --git a/project.godot b/project.godot index 5bcbb4d..be91dfd 100644 --- a/project.godot +++ b/project.godot @@ -11,7 +11,7 @@ config_version=5 [application] config/name="straywild" -config/version="0.20.2-alpha" +config/version="0.20.3-alpha" run/main_scene="res://main/main.tscn" config/features=PackedStringArray("4.7", "GL Compatibility") config/icon="res://art/exported/system_icons/straywild_256.png" diff --git a/scripts/build_playtest.sh b/scripts/build_playtest.sh index d54ba70..926794c 100755 --- a/scripts/build_playtest.sh +++ b/scripts/build_playtest.sh @@ -4,14 +4,14 @@ set -euo pipefail readonly SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" readonly PROJECT_ROOT="$(cd -- "${SCRIPT_DIR}/.." && pwd)" -readonly BUILD_ROOT="${PROJECT_ROOT}/builds/v0.20.2-alpha" +readonly BUILD_ROOT="${PROJECT_ROOT}/builds/v0.20.3-alpha" readonly WINDOWS_DIR="${BUILD_ROOT}/windows-x86_64" readonly LINUX_DIR="${BUILD_ROOT}/linux-x86_64" readonly README_SOURCE="${PROJECT_ROOT}/docs/README-PLAYTEST.txt" readonly SOURCE_COMMIT="$(git -C "${PROJECT_ROOT}" rev-parse HEAD)" readonly SOURCE_URL="https://forge.makearmy.io/woofmeow/straywild" -readonly WINDOWS_ZIP="${BUILD_ROOT}/straywild-v0.20.2-alpha-windows-x86_64.zip" -readonly LINUX_ZIP="${BUILD_ROOT}/straywild-v0.20.2-alpha-linux-x86_64.zip" +readonly WINDOWS_ZIP="${BUILD_ROOT}/straywild-v0.20.3-alpha-windows-x86_64.zip" +readonly LINUX_ZIP="${BUILD_ROOT}/straywild-v0.20.3-alpha-linux-x86_64.zip" readonly GODOT_BIN="${GODOT_BIN:-godot}" if [[ ! -f "${PROJECT_ROOT}/project.godot" ]]; then @@ -78,7 +78,7 @@ Source repository: ${SOURCE_URL} Source revision at build time: ${SOURCE_COMMIT} This private testing release is distributed with an exact corresponding -source archive named straywild-v0.20.2-alpha-source.tar.gz. +source archive named straywild-v0.20.3-alpha-source.tar.gz. If this package includes uncommitted development changes, it must not be publicly redistributed until the exact corresponding source is also made diff --git a/scripts/run_validations.sh b/scripts/run_validations.sh index ff108a8..84e862b 100755 --- a/scripts/run_validations.sh +++ b/scripts/run_validations.sh @@ -22,6 +22,7 @@ readonly -a QUICK_TESTS=( "tests/controller_world_interaction_validation.gd" "tests/controller_ui_navigation_validation.gd" "tests/dedicated_server_config_validation.gd" + "tests/discovery_privacy_validation.gd" "tests/digging_prototype_validation.gd" "tests/equipment_catalog_validation.gd" "tests/exported_decal_hotfix_validation.gd" diff --git a/tests/dedicated_server_config_validation.gd b/tests/dedicated_server_config_validation.gd index 5cff1bb..e2b99ed 100644 --- a/tests/dedicated_server_config_validation.gd +++ b/tests/dedicated_server_config_validation.gd @@ -178,16 +178,39 @@ func _run() -> void: ) assert(not FileAccess.file_exists(discovery_settings_path)) assert(discovery.set_room_name("Client Room")) + assert( + discovery.get_host_discovery_mode() + == DiscoveryClient.HOST_DISCOVERY_PRIVATE + ) + assert(discovery.set_host_connection_mode( + DiscoveryClient.HOST_CONNECTION_RELAY + )) + assert( + discovery.get_host_connection_mode() + == DiscoveryClient.HOST_CONNECTION_RELAY + ) + assert( + discovery.get_host_discovery_mode() + == DiscoveryClient.HOST_DISCOVERY_PRIVATE + ) var client_settings: PackedByteArray = FileAccess.get_file_as_bytes( discovery_settings_path ) assert(not client_settings.is_empty()) var dedicated_discovery := DiscoveryClient.new() dedicated_discovery.call("_load_settings") + dedicated_discovery.set( + "_host_connection_preference", + DiscoveryClient.HOST_CONNECTION_RELAY, + ) assert( dedicated_discovery.configure_dedicated_runtime("Headless Room") ) assert(dedicated_discovery.get_room_name() == "Headless Room") + assert( + dedicated_discovery.get_host_connection_mode() + == DiscoveryClient.HOST_CONNECTION_DIRECT + ) assert( FileAccess.get_file_as_bytes(discovery_settings_path) == client_settings @@ -210,16 +233,26 @@ func _run() -> void: var listed_room := { "room_id": "empty-dedicated-room", "room_name": "Empty Dedicated Room", - "address": "203.0.113.10", - "port": 7777, "current_players": 0, "max_players": 8, "game_version": str(ProjectSettings.get_setting( "application/config/version", "unknown" )), "protocol_version": NetworkProtocol.PROTOCOL_VERSION, + "connection_mode": "direct", + "ip_privacy": "peer_visible", + "host_kind": "dedicated", } assert(bool(discovery.call("_valid_public_room", listed_room))) + assert(not listed_room.has("address")) + assert(not listed_room.has("port")) + var relayed_room: Dictionary = listed_room.duplicate(true) + relayed_room["connection_mode"] = "relay" + relayed_room["ip_privacy"] = "relayed" + assert(not bool(discovery.call("_valid_public_room", relayed_room))) + var player_relayed_room: Dictionary = relayed_room.duplicate(true) + player_relayed_room["host_kind"] = "player" + assert(bool(discovery.call("_valid_public_room", player_relayed_room))) var incompatible_room: Dictionary = listed_room.duplicate(true) incompatible_room["game_version"] = "0.0.0-alpha" assert(not bool(discovery.call("_valid_public_room", incompatible_room))) diff --git a/tests/discovery_privacy_validation.gd b/tests/discovery_privacy_validation.gd new file mode 100644 index 0000000..47e7e6c --- /dev/null +++ b/tests/discovery_privacy_validation.gd @@ -0,0 +1,98 @@ +extends SceneTree + +const FINGERPRINT: String = ( + "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789" +) +const JoinGamePageScene: PackedScene = preload( + "res://ui/network/join_game_page.tscn" +) + + +func _initialize() -> void: + call_deferred("_run") + + +func _run() -> void: + var endpoint := EndpointParser.parse("203.0.113.20:49152") + assert(endpoint.is_valid()) + var direct_route := ConnectionRoute.direct(endpoint) + assert(direct_route.is_valid()) + assert("203.0.113.20" not in direct_route.display_description) + var route := ConnectionRoute.discovery_direct( + endpoint, + "opaque-room-id", + "Pond Friends", + ) + assert(route.is_valid()) + assert(route.is_discovery_join()) + assert(route.display_description == "Pond Friends") + assert("203.0.113.20" not in route.display_description) + var relay_route := ConnectionRoute.discovery_relay( + endpoint, + "opaque-room-id", + "Pond Friends", + ) + assert(relay_route.is_valid()) + assert(relay_route.is_discovery_join()) + assert(relay_route.is_relay()) + assert("203.0.113.20" not in relay_route.display_description) + + var join_page := JoinGamePageScene.instantiate() as JoinGamePage + root.add_child(join_page) + assert((join_page.get_node("%Address") as LineEdit).secret) + assert(str(join_page.call("_display_endpoint", "203.0.113.20:49152")) == "*****") + join_page.set("_addresses_visible", true) + join_page.call("_refresh_address_privacy_controls") + assert(not (join_page.get_node("%Address") as LineEdit).secret) + assert( + str(join_page.call("_display_endpoint", "203.0.113.20:49152")) + == "203.0.113.20:49152" + ) + var saved_entry := SavedServerEntry.new() + saved_entry.kind = SavedServerEntry.Kind.SAVED + saved_entry.display_name = "203.0.113.20" + saved_entry.host = "203.0.113.20" + saved_entry.normalized_host = "203.0.113.20" + saved_entry.normalized_endpoint = "203.0.113.20:49152" + join_page.set("_addresses_visible", false) + assert(str(join_page.call("_display_entry_name", saved_entry)) == "saved server") + join_page.set("_addresses_visible", true) + assert(str(join_page.call("_display_entry_name", saved_entry)) == "203.0.113.20") + + var data_root := PlayerDataRoot.new() + root.add_child(data_root) + var portable_path := ProjectSettings.globalize_path( + "user://discovery-privacy-validation" + ) + var created := data_root.create_unbound_root(portable_path) + assert(bool(created.get("ok", false))) + assert(data_root.activate_process_root(portable_path)) + + var store := ServerTrustStore.new() + root.add_child(store) + var trust_path := data_root.path_for(&"server_trust") + store.configure_storage(trust_path, data_root) + assert(store.verify_identity(FINGERPRINT) == ServerTrustStore.Verification.FIRST_SEEN) + assert(store.trust_identity(FINGERPRINT, "Pond Friends")) + assert(store.verify_identity(FINGERPRINT) == ServerTrustStore.Verification.MATCH) + var saved_text := FileAccess.get_file_as_string(trust_path) + assert("203.0.113.20" not in saved_text) + assert("normalized_endpoint" not in saved_text) + assert("normalized_host" not in saved_text) + assert("\"port\"" not in saved_text) + + var reloaded := ServerTrustStore.new() + root.add_child(reloaded) + reloaded.configure_storage(trust_path, data_root) + assert( + reloaded.verify_identity(FINGERPRINT) + == ServerTrustStore.Verification.MATCH + ) + var record := reloaded.get_identity_record(FINGERPRINT) + assert(record.get("route_kind") == "discovery") + assert(not record.has("normalized_endpoint")) + assert(not record.has("normalized_host")) + assert(not record.has("port")) + + print("Discovery privacy validation: PASS") + quit() diff --git a/tests/discovery_privacy_validation.gd.uid b/tests/discovery_privacy_validation.gd.uid new file mode 100644 index 0000000..3ac3f8d --- /dev/null +++ b/tests/discovery_privacy_validation.gd.uid @@ -0,0 +1 @@ +uid://dmtlh1kpm7bl1 diff --git a/ui/icons/address_hidden.svg b/ui/icons/address_hidden.svg new file mode 100644 index 0000000..919ce57 --- /dev/null +++ b/ui/icons/address_hidden.svg @@ -0,0 +1,4 @@ + + + + diff --git a/ui/icons/address_hidden.svg.import b/ui/icons/address_hidden.svg.import new file mode 100644 index 0000000..b66e969 --- /dev/null +++ b/ui/icons/address_hidden.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bot2k4h3wnroh" +path="res://.godot/imported/address_hidden.svg-fd3f3bc53a766848efcd26f62867a980.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/icons/address_hidden.svg" +dest_files=["res://.godot/imported/address_hidden.svg-fd3f3bc53a766848efcd26f62867a980.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/ui/icons/address_visible.svg b/ui/icons/address_visible.svg new file mode 100644 index 0000000..cc9de82 --- /dev/null +++ b/ui/icons/address_visible.svg @@ -0,0 +1,4 @@ + + + + diff --git a/ui/icons/address_visible.svg.import b/ui/icons/address_visible.svg.import new file mode 100644 index 0000000..37d1c13 --- /dev/null +++ b/ui/icons/address_visible.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dbmqtwisapw4n" +path="res://.godot/imported/address_visible.svg-da2e41f3b965e45cfc3839b82d107ccf.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/icons/address_visible.svg" +dest_files=["res://.godot/imported/address_visible.svg-da2e41f3b965e45cfc3839b82d107ccf.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/ui/network/join_game_page.gd b/ui/network/join_game_page.gd index 6546517..1cd6c10 100644 --- a/ui/network/join_game_page.gd +++ b/ui/network/join_game_page.gd @@ -1,8 +1,8 @@ class_name JoinGamePage extends Control -signal join_requested(endpoint: String) -signal join_confirmation_requested(endpoint: String) +signal join_requested(route: ConnectionRoute) +signal join_confirmation_requested(endpoint: String, relayed: bool) signal back_requested enum Mode { @@ -17,14 +17,23 @@ const DISCOVERY_REFRESH_SECONDS: float = 8.0 const ControllerFocusNavigationType = preload( "res://ui/controller_focus_navigation.gd" ) +const ADDRESS_HIDDEN_ICON: Texture2D = preload( + "res://ui/icons/address_hidden.svg" +) +const ADDRESS_VISIBLE_ICON: Texture2D = preload( + "res://ui/icons/address_visible.svg" +) const ADDRESS_FORMAT_HELP: String = ( "Hostname, IPv4, or [IPv6]. Port 7777 is used when omitted; " + "include the port shown by a host when it differs." ) const DIRECT_WORKFLOW_HELP: String = ( - "%s\nJoin Now connects once; Save Server stores this address locally." - % ADDRESS_FORMAT_HELP + "Direct connections expose your public IP address to the remote host. " + + "Only connect to people you trust.\n" + + ADDRESS_FORMAT_HELP + + "\n" + + "Join Now connects once; Save Server stores this address locally." ) @onready var _main_panel: PanelContainer = %MainPanel @@ -33,6 +42,9 @@ const DIRECT_WORKFLOW_HELP: String = ( @onready var _list_content: Control = %ListContent @onready var _list_title: Label = %ListTitle @onready var _online_controls: Control = %OnlineControls +@onready var _address_privacy_controls: Control = %AddressPrivacyControls +@onready var _address_privacy_label: Label = %AddressPrivacyLabel +@onready var _address_visibility_button: Button = %AddressVisibilityButton @onready var _presence_button: Button = %PresenceButton @onready var _room_open_button: Button = %RoomOpenButton @onready var _room_listing_button: Button = %RoomListingButton @@ -84,6 +96,7 @@ var _connection_error_latched: bool = false var _pending_confirmation_endpoint: String = "" var _pending_confirmation_room: Dictionary = {} var _owns_pending_public_join: bool = false +var _addresses_visible: bool = false func _ready() -> void: @@ -96,6 +109,9 @@ func _ready() -> void: _presence_button.pressed.connect(_on_presence_pressed) _room_open_button.pressed.connect(_on_room_open_pressed) _room_listing_button.pressed.connect(_on_room_listing_pressed) + _address_visibility_button.pressed.connect( + _on_address_visibility_pressed + ) _refresh_button.pressed.connect(_request_discovery_refresh) _join_button.pressed.connect(_request_join) _save_button.pressed.connect(_on_save_pressed) @@ -310,6 +326,7 @@ func setup( func open_page(preserved_endpoint: String = "") -> void: + _addresses_visible = false if not preserved_endpoint.is_empty(): _address.text = preserved_endpoint elif _address.text.is_empty(): @@ -368,7 +385,11 @@ func confirm_pending_join() -> bool: return false return true _set_status("Connecting…") - join_requested.emit(endpoint_text) + var endpoint := EndpointParser.parse(endpoint_text) + if not endpoint.is_valid(): + _set_status(endpoint.error_message, true) + return false + join_requested.emit(ConnectionRoute.direct(endpoint)) return true @@ -405,7 +426,7 @@ func _default_mode_status(mode: Mode) -> String: Mode.FRIENDS: return "friend status is live and not stored by discovery" Mode.DIRECT: - return "direct connection • default port 7777" + return "direct connection • your public IP is visible to the host" Mode.SAVED: return "saved servers are stored on this device" Mode.RECENT: @@ -447,18 +468,26 @@ func _request_join() -> void: if _discovery == null: _set_status("Could not prepare the public connection.", true) return - endpoint_text = _discovery.room_endpoint(room) discovery_room = room.duplicate(true) elif _mode != Mode.DIRECT and _selected_entry != null: endpoint_text = _selected_entry.normalized_endpoint - var endpoint: ConnectionEndpoint = EndpointParser.parse(endpoint_text) - if not endpoint.is_valid(): - _set_status(endpoint.error_message, true) - return + var endpoint: ConnectionEndpoint + if discovery_room.is_empty(): + endpoint = EndpointParser.parse(endpoint_text) + if not endpoint.is_valid(): + _set_status(endpoint.error_message, true) + return if _gameplay_context: - _pending_confirmation_endpoint = endpoint.normalized_display + _pending_confirmation_endpoint = ( + "public room" + if not discovery_room.is_empty() + else endpoint.normalized_display + ) _pending_confirmation_room = discovery_room - join_confirmation_requested.emit(endpoint.normalized_display) + join_confirmation_requested.emit( + _pending_confirmation_endpoint, + _room_uses_relay(discovery_room), + ) return if not discovery_room.is_empty(): _owns_pending_public_join = true @@ -468,22 +497,20 @@ func _request_join() -> void: return _set_status("Connecting…") _address.text = endpoint.normalized_display - join_requested.emit(endpoint.normalized_display) + join_requested.emit(ConnectionRoute.direct(endpoint)) -func _on_public_join_prepared(endpoint_text: String) -> void: +func _on_public_join_prepared(route: ConnectionRoute) -> void: if not _owns_pending_public_join: return _owns_pending_public_join = false if _mode not in [Mode.DISCOVER, Mode.FRIENDS] or not is_visible_in_tree(): return - var endpoint: ConnectionEndpoint = EndpointParser.parse(endpoint_text) - if not endpoint.is_valid(): - _set_status("Discovery returned an invalid room address.", true) + if route == null or not route.is_valid() or not route.is_discovery_join(): + _set_status("Could not reach this room.", true) return - _address.text = endpoint.normalized_display _set_status("Connecting…") - join_requested.emit(endpoint.normalized_display) + join_requested.emit(route) func _on_public_join_status_changed(message: String, is_error: bool) -> void: @@ -518,7 +545,7 @@ func _on_save_pressed() -> void: ) if existing != null: _set_status( - "Already saved locally as “%s”." % existing.display_name, + "Already saved locally as “%s”." % _display_entry_name(existing), true, ) _set_mode(Mode.SAVED) @@ -530,7 +557,7 @@ func _on_save_pressed() -> void: if _mode == Mode.RECENT and _selected_entry != null and not _selected_entry.last_observed_server_name.is_empty() - else endpoint.host + else "Saved Server" ) _name_entry_active = true _name_edit.show() @@ -559,7 +586,7 @@ func _commit_name_entry() -> void: _set_status( "Server updated." if was_editing - else "Saved locally as “%s”." % saved.display_name + else "Saved locally as “%s”." % _display_entry_name(saved) ) _clear_edit_state() _mode = Mode.SAVED @@ -572,7 +599,17 @@ func _on_edit_pressed() -> void: return _editing_entry_id = _selected_entry.entry_id _address.text = _selected_entry.normalized_endpoint - _name_edit.text = _selected_entry.display_name + _name_edit.text = ( + _selected_entry.display_name + if ( + _addresses_visible + or not _entry_label_reveals_address( + _selected_entry.display_name, + _selected_entry, + ) + ) + else "Saved Server" + ) _name_entry_active = true _name_edit.show() _save_button.text = "save" @@ -789,8 +826,8 @@ func _refresh_entries() -> void: "%s%s — %s%s" % [ prefix, - entry.display_name, - entry.normalized_endpoint, + _display_entry_name(entry), + _display_endpoint(entry.normalized_endpoint), count, ] ) @@ -822,6 +859,7 @@ func _refresh() -> void: var list_content_visible: bool = not direct_content_visible _direct_content.visible = direct_content_visible _list_content.visible = list_content_visible + _refresh_address_privacy_controls() _list_title.text = _current_list_title() _refresh_online_controls(discovery_mode, friends_mode, connecting) _address.visible = direct or _name_entry_active @@ -978,8 +1016,10 @@ func _refresh_online_controls( if not local_host: return var room_open: bool = _network_session.is_open_host() - var room_listed: bool = ( - _discovery != null and _discovery.is_discoverable() + var host_discovery_mode: String = ( + _discovery.get_host_discovery_mode() + if _discovery != null + else DiscoveryClient.HOST_DISCOVERY_PRIVATE ) _room_open_button.text = "room: open" if room_open else "room: closed" _room_open_button.disabled = connecting @@ -988,9 +1028,7 @@ func _refresh_online_controls( if room_open else "Open this room so other players can connect." ) - _room_listing_button.text = ( - "listing: on" if room_listed else "listing: off" - ) + _room_listing_button.text = "discovery | %s" % host_discovery_mode _room_listing_button.disabled = ( connecting or _discovery == null @@ -998,9 +1036,14 @@ func _refresh_online_controls( or not room_open ) _room_listing_button.tooltip_text = ( - "Remove this room from the public room browser." - if room_listed - else "List this open room in the public room browser." + "Stop discovery listing. Existing relay connections remain active " + + "until those players disconnect." + if host_discovery_mode == DiscoveryClient.HOST_CONNECTION_RELAY + else "Switch this public listing to the privacy relay. Relay hosting " + + "hides peer IPs but may add latency and uses shared server capacity." + if host_discovery_mode == DiscoveryClient.HOST_CONNECTION_DIRECT + else "List this room through direct discovery. Joining players and the " + + "host can see one another's public IP addresses." if room_open and _discovery != null and _discovery.is_configured() else "Open the room before enabling its public listing." if _discovery != null and _discovery.is_configured() @@ -1025,6 +1068,7 @@ func _configure_controller_navigation() -> void: online_controls.append(control) var content_controls: Array[Control] = [] for control: Control in [ + _address_visibility_button, _address, _name_edit, _server_list, @@ -1056,6 +1100,7 @@ func _configure_controller_navigation() -> void: _presence_button, _room_open_button, _room_listing_button, + _address_visibility_button, _address, _name_edit, _server_list, @@ -1219,8 +1264,8 @@ func _recover_controller_focus( func _format_entry_details(entry: SavedServerEntry) -> String: var parts: Array[String] = [] if _mode == Mode.SAVED: - parts.append("Name: %s" % entry.display_name) - parts.append("Address: %s" % entry.normalized_endpoint) + parts.append("Name: %s" % _display_entry_name(entry)) + parts.append("Address: %s" % _display_endpoint(entry.normalized_endpoint)) if _server_trust != null: var trust := _server_trust.get_record(entry.get_endpoint()) if trust.is_empty(): @@ -1239,7 +1284,10 @@ func _format_entry_details(entry: SavedServerEntry) -> String: or entry.last_observed_server_name != entry.display_name ) ): - parts.append("Server name: %s" % entry.last_observed_server_name) + parts.append( + "Server name: %s" + % _display_entry_label(entry.last_observed_server_name, entry) + ) if entry.last_observed_max_players > 0: parts.append( "Players: %d / %d" @@ -1259,22 +1307,139 @@ func _format_entry_details(entry: SavedServerEntry) -> String: parts.append( "Last result: %s" % _format_result_code(entry.last_result_code) ) + parts.append("Connection: direct peer-to-peer • not relayed") + parts.append("Joining shares your public IP address with the remote host.") return "\n".join(parts) +func _on_address_visibility_pressed() -> void: + _addresses_visible = not _addresses_visible + if _mode in [Mode.SAVED, Mode.RECENT]: + var selected_id := ( + _selected_entry.entry_id if _selected_entry != null else "" + ) + _refresh_entries() + if not selected_id.is_empty(): + _select_entry_id(selected_id) + _refresh() + + +func _refresh_address_privacy_controls() -> void: + var relevant := ( + _mode in [Mode.DIRECT, Mode.SAVED, Mode.RECENT] + or _name_entry_active + ) + _address_privacy_controls.visible = relevant + _address.secret = not _addresses_visible + _address_privacy_label.text = ( + "addresses visible" + if _addresses_visible + else "addresses hidden for streamer safety" + ) + _address_visibility_button.icon = ( + ADDRESS_VISIBLE_ICON if _addresses_visible else ADDRESS_HIDDEN_ICON + ) + _address_visibility_button.tooltip_text = ( + "Hide server addresses" + if _addresses_visible + else "Show server addresses" + ) + _address_visibility_button.accessibility_name = ( + "hide server addresses" + if _addresses_visible + else "show server addresses" + ) + + +func _display_endpoint(endpoint: String) -> String: + return endpoint if _addresses_visible else "*****" + + +func _display_entry_name(entry: SavedServerEntry) -> String: + if entry == null: + return "server" + if ( + _addresses_visible + or not _entry_label_reveals_address(entry.display_name, entry) + ): + return entry.display_name + return ( + "saved server" + if entry.kind == SavedServerEntry.Kind.SAVED + else "recent server" + ) + + +func _display_entry_label( + label: String, + entry: SavedServerEntry, +) -> String: + if _addresses_visible or not _entry_label_reveals_address(label, entry): + return label + return "*****" + + +func _entry_label_reveals_address( + label: String, + entry: SavedServerEntry, +) -> bool: + if entry == null: + return false + var normalized_label: String = label.strip_edges().to_lower() + if normalized_label.is_empty(): + return false + for candidate: String in [ + entry.normalized_endpoint, + entry.normalized_host, + entry.host, + ]: + var normalized_candidate: String = candidate.strip_edges().to_lower() + if normalized_candidate.is_empty(): + continue + if normalized_label == normalized_candidate: + return true + if ( + normalized_candidate.contains(".") + or normalized_candidate.contains(":") + ) and normalized_label.contains(normalized_candidate): + return true + return false + + func _format_discovery_details(room: Dictionary) -> String: if room.is_empty(): return "Select a public room." + var relayed := _room_uses_relay(room) var lines: Array[String] = [ "Room: %s" % str(room.get("room_name", "Public room")), + "Host: %s" % ( + "dedicated server operator" + if str(room.get("host_kind", "player")) == "dedicated" + else "another player" + ), "Players: %d / %d" % [ int(room.get("current_players", 0)), int(room.get("max_players", 0)), ], - "Connection: %s" % ( - _discovery.room_endpoint(room) if _discovery != null else "—" + ( + "Connection: privacy relay" + if relayed + else "Connection: direct peer-to-peer • not relayed" + ), + ( + "IP privacy: the other player sees the relay address, not your " + + "residential IP. The relay service still handles both addresses." + if relayed + else "IP privacy: joining shares your public IP address with the host." + ), + ( + "Relay failure stops the join; straywild will not silently fall back " + + "to a direct connection. The extra network hop may increase latency." + if relayed + else "The room address is disclosed to your game only after you press " + + "Join; it is not displayed or saved. Use a VPN if you need stronger " + + "privacy." ), - "Direct UDP connection • ping is measured after joining", ] if _discovery != null and _discovery.is_own_room(room): lines.append("This is the room you are currently hosting.") @@ -1292,11 +1457,28 @@ func _format_friend_details(friend: Dictionary) -> String: ), ] if not room.is_empty(): + var relayed := _room_uses_relay(room) lines.append("Room: %s" % str(room.get("room_name", "Public room"))) + lines.append("Host: %s" % ( + "dedicated server operator" + if str(room.get("host_kind", "player")) == "dedicated" + else "another player" + )) lines.append("Players: %d / %d" % [ int(room.get("current_players", 0)), int(room.get("max_players", 0)), ]) + lines.append( + "Connection: privacy relay" + if relayed + else "Connection: direct peer-to-peer • not relayed" + ) + lines.append( + "The other player sees the relay address; the relay service still " + + "handles both network addresses. The extra hop may add latency." + if relayed + else "Joining shares your public IP address with the host." + ) elif bool(friend.get("online", false)): lines.append("This friend is not in a joinable public room.") else: @@ -1338,6 +1520,10 @@ func _discovery_room_is_full(room: Dictionary) -> bool: return int(room.get("current_players", 0)) >= int(room.get("max_players", 0)) +func _room_uses_relay(room: Dictionary) -> bool: + return str(room.get("connection_mode", "")) == "relay" + + func _request_discovery_refresh() -> void: if ( _discovery == null @@ -1435,14 +1621,15 @@ func _on_room_open_pressed() -> void: func _on_room_listing_pressed() -> void: if _discovery == null: return - var enabling: bool = not _discovery.is_discoverable() - if not _discovery.set_discoverable(enabling): + if not _discovery.cycle_host_discovery_mode(): return - _set_status( - "The room is being listed publicly." - if enabling - else "The room is no longer listed publicly." - ) + match _discovery.get_host_discovery_mode(): + DiscoveryClient.HOST_CONNECTION_DIRECT: + _set_status("Discovery is listing this room as a direct connection.") + DiscoveryClient.HOST_CONNECTION_RELAY: + _set_status("Discovery is listing this room through the privacy relay.") + _: + _set_status("Discovery listing is private.") _refresh() diff --git a/ui/network/join_game_page.tscn b/ui/network/join_game_page.tscn index 9374a85..4466fc9 100644 --- a/ui/network/join_game_page.tscn +++ b/ui/network/join_game_page.tscn @@ -1,9 +1,11 @@ -[gd_scene load_steps=5 format=3] +[gd_scene load_steps=7 format=3] [ext_resource type="Script" path="res://ui/network/join_game_page.gd" id="1_script"] [ext_resource type="Theme" path="res://ui/game_theme.tres" id="2_theme"] [ext_resource type="Script" path="res://ui/components/organizer_tab.gd" id="3_tab"] [ext_resource type="PackedScene" path="res://ui/components/bubble_menu/bubble_confirmation_page.tscn" id="4_confirmation"] +[ext_resource type="Texture2D" path="res://ui/icons/address_hidden.svg" id="5_address_hidden"] +[ext_resource type="Texture2D" path="res://ui/icons/address_visible.svg" id="6_address_visible"] [node name="JoinGamePage" type="Control"] visible = false @@ -117,6 +119,33 @@ theme_override_constants/margin_bottom = 20 layout_mode = 2 theme_override_constants/separation = 12 +[node name="AddressPrivacyControls" type="HBoxContainer" parent="MainPanel/OuterMargin/Layout/ContentPanel/ContentMargin/ContentLayout"] +unique_name_in_owner = true +visible = false +custom_minimum_size = Vector2(0, 40) +layout_mode = 2 +theme_override_constants/separation = 10 + +[node name="AddressPrivacyLabel" type="Label" parent="MainPanel/OuterMargin/Layout/ContentPanel/ContentMargin/ContentLayout/AddressPrivacyControls"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 14 +text = "addresses hidden for streamer safety" +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="AddressVisibilityButton" type="Button" parent="MainPanel/OuterMargin/Layout/ContentPanel/ContentMargin/ContentLayout/AddressPrivacyControls"] +unique_name_in_owner = true +custom_minimum_size = Vector2(44, 40) +layout_mode = 2 +focus_mode = 2 +tooltip_text = "Show server addresses" +icon = ExtResource("5_address_hidden") +expand_icon = true +icon_max_width = 27 +accessibility_name = "show server addresses" + [node name="PageStack" type="Control" parent="MainPanel/OuterMargin/Layout/ContentPanel/ContentMargin/ContentLayout"] layout_mode = 2 size_flags_vertical = 3 @@ -214,6 +243,8 @@ theme_override_font_sizes/font_size = 19 placeholder_text = "example.net or 192.168.1.50:7777" alignment = 1 max_length = 300 +secret = true +secret_character = "*" [node name="AddressHelper" type="Label" parent="MainPanel/OuterMargin/Layout/ContentPanel/ContentMargin/ContentLayout/PageStack/DirectContent"] unique_name_in_owner = true diff --git a/ui/pause_menu.gd b/ui/pause_menu.gd index f07655b..b1cdcd1 100644 --- a/ui/pause_menu.gd +++ b/ui/pause_menu.gd @@ -25,7 +25,7 @@ signal return_to_title_requested signal reset_progress_requested signal quit_requested signal menu_visibility_changed(is_open: bool) -signal join_game_requested(endpoint: String) +signal join_game_requested(route: ConnectionRoute) enum ConfirmationAction { NONE, @@ -240,18 +240,29 @@ func _close_join_game() -> void: _begin_root_entry(true) -func _on_join_confirmation_requested(_endpoint: String) -> void: +func _on_join_confirmation_requested( + _endpoint: String, + relayed: bool, +) -> void: if _action_in_progress or _root_transition_active: _join_game_page.cancel_pending_join_confirmation() return _confirmation_action = ConfirmationAction.JOIN_ANOTHER _confirmation_returns_to_join_game = true + var privacy_message := ( + "this join uses a privacy relay. the other player sees the relay " + + "address instead of your residential IP; the relay service still " + + "handles both addresses and will not silently fall back to direct." + if relayed + else "this is a direct peer-to-peer connection, not a relay. the " + + "remote host can see your public IP address. discovery room " + + "addresses are not displayed or saved." + ) _confirmation_page.configure( - ( - "join another game?\n\n" - + "your progression will be saved first. current players will be " - + "disconnected if you are hosting." - ), + "join another game?\n\n" + + "your progression will be saved first. current players will be " + + "disconnected if you are hosting.\n\n" + + privacy_message, "save and join", "cancel", BubbleConfirmationPageType.InitialFocus.CONFIRM, @@ -261,8 +272,8 @@ func _on_join_confirmation_requested(_endpoint: String) -> void: _show_confirmation() -func _on_confirmed_join_requested(endpoint: String) -> void: - join_game_requested.emit(endpoint) +func _on_confirmed_join_requested(route: ConnectionRoute) -> void: + join_game_requested.emit(route) func report_network_error(message: String) -> void: diff --git a/ui/players_page.gd b/ui/players_page.gd index 68f25c6..31ebad5 100644 --- a/ui/players_page.gd +++ b/ui/players_page.gd @@ -401,7 +401,10 @@ func _refresh_host_settings() -> void: if not _room_name_edit.has_focus(): _room_name_edit.text = _discovery.get_room_name() var is_open: bool = _service.is_open_host() - var is_discoverable: bool = _discovery.is_discoverable() + var discovery_mode: String = _discovery.get_host_discovery_mode() + var is_discoverable: bool = ( + discovery_mode != DiscoveryClient.HOST_DISCOVERY_PRIVATE + ) _set_host_toggle_state( _online_toggle, _online_state_label, @@ -411,7 +414,7 @@ func _refresh_host_settings() -> void: _set_host_toggle_state( _discoverable_toggle, _discoverable_state_label, - "ON" if is_discoverable else "OFF", + discovery_mode.to_upper(), is_discoverable, ) _online_toggle.disabled = not _service.is_local_host() @@ -427,9 +430,11 @@ func _refresh_host_settings() -> void: ) _discoverable_toggle.disabled = not can_publish _discoverable_toggle.tooltip_text = ( - "Stop advertising this game in the public room browser." - if is_discoverable - else "Advertise this open game in the public room browser." + "Stop discovery listing. Existing relayed players remain connected." + if discovery_mode == DiscoveryClient.HOST_CONNECTION_RELAY + else "Switch discovery from direct hosting to the privacy relay." + if discovery_mode == DiscoveryClient.HOST_CONNECTION_DIRECT + else "List this open game through direct discovery." if can_publish else "Open the game before enabling discovery." if _discovery.is_configured() @@ -460,7 +465,7 @@ func _on_online_pressed() -> void: func _on_discoverable_pressed() -> void: if _discovery == null: return - _discovery.set_discoverable(not _discovery.is_discoverable()) + _discovery.cycle_host_discovery_mode() _refresh_host_settings() @@ -474,7 +479,7 @@ func _on_host_settings_changed( _set_host_toggle_state( _discoverable_toggle, _discoverable_state_label, - "ON" if discoverable else "OFF", + _discovery.get_host_discovery_mode().to_upper(), discoverable, ) _refresh_host_settings() diff --git a/ui/title_screen.gd b/ui/title_screen.gd index 114ee9e..d39be9c 100644 --- a/ui/title_screen.gd +++ b/ui/title_screen.gd @@ -67,7 +67,7 @@ signal new_slot_requested( duplicate_source_slot_id: String, ) signal quit_requested -signal join_game_requested(endpoint: String) +signal join_game_requested(route: ConnectionRoute) enum ConfirmationAction { NONE, diff --git a/ui/title_screen.tscn b/ui/title_screen.tscn index 22f00f2..8c8cae1 100644 --- a/ui/title_screen.tscn +++ b/ui/title_screen.tscn @@ -213,7 +213,7 @@ unique_name_in_owner = true layout_mode = 2 theme_override_colors/font_color = Color(0.682, 0.733, 0.761, 1) theme_override_font_sizes/font_size = 22 -text = "v0.20.2-alpha" +text = "v0.20.3-alpha" horizontal_alignment = 1 [node name="Spacer" type="Control" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent"] From 82938d3d5763d821e6aa9789f6e733bd37f89ea7 Mon Sep 17 00:00:00 2001 From: Voyager Date: Tue, 1 Sep 2026 11:37:32 -0400 Subject: [PATCH 26/37] fix supporter release packaging isolation --- docs/PORTMASTER.md | 11 +++++++---- scripts/build_playtest.sh | 4 ++-- scripts/build_portmaster.sh | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/PORTMASTER.md b/docs/PORTMASTER.md index 803f72f..6fbeb26 100644 --- a/docs/PORTMASTER.md +++ b/docs/PORTMASTER.md @@ -67,15 +67,18 @@ are pinned to the same clean `main` commit: bash scripts/build_portmaster.sh ``` -The script deletes and regenerates the Linux ARM64 export, stages the package, -validates its structure, and writes: +The script deletes and regenerates a PortMaster-specific ARM64 export in +`builds/v/portmaster-arm64/`, stages the package, validates its +structure, and writes: ```text builds/v/straywild.zip ``` -`--package-only` is reserved for repackaging an already validated ARM64 export. -It does not rebuild game content. +`--package-only` is reserved for repackaging an already validated +PortMaster-specific ARM64 export. It does not rebuild game content. The +standard Linux ARM64 release staging directory remains separate so building +PortMaster cannot replace the normal Linux ARM64 payload with reduced assets. For a packaging-only correction to an already published game release, commit only PortMaster launcher, packaging-script, or PortMaster documentation changes diff --git a/scripts/build_playtest.sh b/scripts/build_playtest.sh index 926794c..b4e6230 100755 --- a/scripts/build_playtest.sh +++ b/scripts/build_playtest.sh @@ -77,8 +77,8 @@ straywild code is licensed under GPL-3.0-or-later. Source repository: ${SOURCE_URL} Source revision at build time: ${SOURCE_COMMIT} -This private testing release is distributed with an exact corresponding -source archive named straywild-v0.20.3-alpha-source.tar.gz. +The exact corresponding source revision is publicly available from the source +repository above. Supporter builds do not include a separate source archive. If this package includes uncommitted development changes, it must not be publicly redistributed until the exact corresponding source is also made diff --git a/scripts/build_portmaster.sh b/scripts/build_portmaster.sh index 2d9dcbb..077167f 100755 --- a/scripts/build_portmaster.sh +++ b/scripts/build_portmaster.sh @@ -41,7 +41,7 @@ fi readonly RELEASE_TAG="v${PROJECT_VERSION}" readonly RELEASE_ROOT="${PROJECT_ROOT}/builds/${RELEASE_TAG}" -readonly ARM64_ROOT="${RELEASE_ROOT}/linux-arm64" +readonly ARM64_ROOT="${RELEASE_ROOT}/portmaster-arm64" readonly ARM64_EXECUTABLE="${ARM64_ROOT}/straywild.arm64" readonly ARM64_PCK="${ARM64_ROOT}/straywild.pck" readonly STAGE_ROOT="${RELEASE_ROOT}/portmaster-stage" From f2239d248a3175c5fba8f21d1f48d3ccbf84e303 Mon Sep 17 00:00:00 2001 From: Voyager Date: Tue, 1 Sep 2026 13:05:05 -0400 Subject: [PATCH 27/37] Optimize finalized surface artwork --- docs/DEVELOPMENT.md | 29 ++ drawing/surface_drawing_canvas.gd | 388 +++++++++----- drawing/surface_drawing_cell_buffer.gd | 284 +++++++++++ drawing/surface_drawing_cell_buffer.gd.uid | 1 + drawing/surface_drawing_palette.gd | 25 + drawing/surface_drawing_placement.gd | 2 +- drawing/surface_drawing_protocol.gd | 135 +++-- network/network_protocol.gd | 2 +- network/network_surface_drawing_service.gd | 476 +++++++++++++----- scripts/run_validations.sh | 1 + .../surface_drawing_performance_validation.gd | 178 +++++++ ...face_drawing_performance_validation.gd.uid | 1 + ...ace_drawing_texture_renderer_validation.gd | 10 + tests/surface_drawing_validation.gd | 27 +- 14 files changed, 1254 insertions(+), 305 deletions(-) create mode 100644 drawing/surface_drawing_cell_buffer.gd create mode 100644 drawing/surface_drawing_cell_buffer.gd.uid create mode 100644 tests/surface_drawing_performance_validation.gd create mode 100644 tests/surface_drawing_performance_validation.gd.uid diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index ef0e161..a5ebc03 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -284,6 +284,35 @@ godot --headless --path . --script scripts/normalize_texture_imports.gd \ godot --headless --path . --script tests/texture_sampling_validation.gd ``` +### Surface artwork runtime + +Art Kit cells are authoritative palette and author planes, not per-cell nodes +or dictionaries. Keep `SurfaceDrawingCellBuffer` as the live representation; +materialize the legacy cell-array view only for inspection and tests. Finished +artwork uses a full-resolution nearest-neighbor texture on a coarse, +surface-conforming mesh. It discards guide and brush transforms, receives a +distance visibility range, and unloads its render node when far from the local +player while retaining compact session state. + +`surface_drawing_v3` snapshots carry packed palette and participant-index +planes. The host sends late-join snapshots over multiple frames, prioritizing +active and nearby canvases, so adding finished work must not restore a +single-frame snapshot burst. Active editing and finalized artwork have +separate bounded budgets; finalizing a canvas frees active-grid capacity. + +The finalized budget holds 512 maximum-size (128 x 128) canvases. At the +current 0.075-meter cell size, 441 canvases can tile the full 200 x 200-meter +generated-world footprint. If the generated world grows, update the finalized +canvas and cell budgets together and rerun the artwork performance validation. + +Run both focused validations after changing this path: + +```sh +godot --headless --path . --script tests/surface_drawing_validation.gd +godot --headless --path . \ + --script tests/surface_drawing_performance_validation.gd +``` + ### Importing animalese voice sets Animalese clips use one deterministic runtime level and format: -18 dBFS RMS diff --git a/drawing/surface_drawing_canvas.gd b/drawing/surface_drawing_canvas.gd index 01d34d7..aaec6f4 100644 --- a/drawing/surface_drawing_canvas.gd +++ b/drawing/surface_drawing_canvas.gd @@ -5,6 +5,9 @@ const GUIDED_PIXEL_FILL: float = 0.88 const SURFACE_OFFSET: float = 0.012 const LAYER_OFFSET_STEP: float = 0.0002 const SURFACE_SAMPLE_DEPTH: float = 0.45 +const FINALIZED_VISIBILITY_RANGE: float = 96.0 +const FINALIZED_VISIBILITY_MARGIN: float = 12.0 +const FINALIZED_MAX_SUBDIVISIONS: int = 32 var canvas_id: String = "" var grid_width: int = 0 @@ -18,7 +21,7 @@ var _surface_origin: Vector3 var _surface_normal: Vector3 var _surface_tangent: Vector3 var _surface_bitangent: Vector3 -var _cells: Dictionary[int, Dictionary] = {} +var _cell_buffer: SurfaceDrawingCellBuffer var _cell_surface_transforms: Array[Transform3D] = [] var _pixel_image: Image var _pixel_texture: ImageTexture @@ -36,8 +39,15 @@ func setup( data: Dictionary, relationships: PlayerRelationshipStore, solid_surface_mask: int = 1, + cell_buffer: SurfaceDrawingCellBuffer = null, ) -> bool: - if not SurfaceDrawingProtocol.validate_canvas_state(data): + if ( + (cell_buffer == null and not SurfaceDrawingProtocol.validate_canvas_state(data)) + or ( + cell_buffer != null + and not SurfaceDrawingProtocol.validate_canvas_metadata(data) + ) + ): return false canvas_id = str(data["canvas_id"]) grid_width = int(data["width"]) @@ -45,7 +55,6 @@ func setup( cell_size = float(data["cell_size"]) revision = int(data["revision"]) creator_fingerprint = str(data["creator_fingerprint"]) - participant_fingerprints = _participants_from_state(data) _finalized = bool(data.get("finalized", false)) _guide_visible = bool(data.get("guide_visible", true)) and not _finalized _layer = int(data.get("layer", 0)) @@ -64,12 +73,20 @@ func setup( _surface_bitangent = _surface_normal.cross(_surface_tangent).normalized() _relationships = relationships _solid_surface_mask = solid_surface_mask - _cells.clear() - for cell_value: Variant in data["cells"]: - var cell: Dictionary = cell_value - _cells[_cell_key(int(cell["x"]), int(cell["y"]))] = cell.duplicate(true) - _build_grid() - _build_pixel_renderer() + _cell_buffer = cell_buffer + if _cell_buffer == null: + _cell_buffer = SurfaceDrawingCellBuffer.new() + if not _cell_buffer.configure_from_state(data, true): + return false + elif _cell_buffer.width != grid_width or _cell_buffer.height != grid_height: + return false + participant_fingerprints = _cell_buffer.get_participants() + if _finalized: + _build_finalized_pixel_renderer() + else: + var samples: Dictionary = _sample_grid_vertices() + _build_grid(samples) + _build_pixel_renderer(samples) return true @@ -80,16 +97,25 @@ func apply_update(data: Dictionary) -> bool: or int(data["revision"]) <= revision ): return false - for edit_value: Variant in data["edits"]: - var edit: Dictionary = edit_value - var key: int = _cell_key(int(edit["x"]), int(edit["y"])) - if str(edit["color_id"]).is_empty(): - _cells.erase(key) - else: - _cells[key] = edit.duplicate(true) - participant_fingerprints = _participants_from_update( - data, participant_fingerprints - ) + if _cell_buffer == null or not _cell_buffer.apply_edits(data["edits"]): + return false + return _finish_buffered_update(data) + + +func apply_buffered_update(data: Dictionary) -> bool: + if ( + not SurfaceDrawingProtocol.validate_canvas_update(data) + or str(data["canvas_id"]) != canvas_id + or int(data["revision"]) <= revision + or _cell_buffer == null + ): + return false + return _finish_buffered_update(data) + + +func _finish_buffered_update(data: Dictionary) -> bool: + _cell_buffer.ensure_participants(data.get("participant_fingerprints", [])) + participant_fingerprints = _cell_buffer.get_participants() revision = int(data["revision"]) if is_hidden_by_relationship(): _rebuild_pixel_image() @@ -110,12 +136,18 @@ func apply_guide_update(data: Dictionary) -> bool: participant_fingerprints = _participants_from_update( data, participant_fingerprints ) + if _cell_buffer != null: + _cell_buffer.ensure_participants(participant_fingerprints) + participant_fingerprints = _cell_buffer.get_participants() _finalized = bool(data["finalized"]) _guide_visible = bool(data["guide_visible"]) and not _finalized if _finalized: _destroy_grid() + _cell_surface_transforms.clear() + _build_finalized_pixel_renderer() else: _refresh_grid_visibility() + _configure_render_distance() return true @@ -155,11 +187,7 @@ func get_rendered_pixel_size() -> float: func get_rendered_pixel_count() -> int: if is_hidden_by_relationship(): return 0 - var count: int = 0 - for cell: Dictionary in _cells.values(): - if not _visible_cell_color(cell).is_equal_approx(Color.TRANSPARENT): - count += 1 - return count + return _cell_buffer.get_painted_count() if _cell_buffer != null else 0 func get_export_image() -> Image: @@ -255,18 +283,10 @@ func get_cell_surface_transform( func get_authoritative_cells() -> Array[Dictionary]: - var result: Array[Dictionary] = [] - for value: Dictionary in _cells.values(): - result.append(value.duplicate(true)) - result.sort_custom(func(a: Dictionary, b: Dictionary) -> bool: - var a_key: int = _cell_key(int(a["x"]), int(a["y"])) - var b_key: int = _cell_key(int(b["x"]), int(b["y"])) - return a_key < b_key - ) - return result + return _cell_buffer.to_cells() if _cell_buffer != null else [] -func _build_grid() -> void: +func _build_grid(samples: Dictionary) -> void: if _grid_instance != null: _grid_instance.queue_free() _grid_instance = null @@ -279,50 +299,14 @@ func _build_grid() -> void: material.albedo_color = Color(0.75, 0.94, 0.96, 0.38) material.no_depth_test = false immediate.surface_begin(Mesh.PRIMITIVE_LINES, material) - var half_width: float = float(grid_width) * cell_size * 0.5 - var half_height: float = float(grid_height) * cell_size * 0.5 - var sampled_vertices: Dictionary[Vector2i, Dictionary] = {} for x: int in range(grid_width + 1): - var horizontal: float = -half_width + float(x) * cell_size for y_segment: int in range(grid_height): - var start_vertical: float = ( - -half_height + float(y_segment) * cell_size - ) - _add_grid_vertex( - immediate, - _surface_origin + _surface_tangent * horizontal - + _surface_bitangent * start_vertical, - Vector2i(x, y_segment), - sampled_vertices, - ) - _add_grid_vertex( - immediate, - _surface_origin + _surface_tangent * horizontal - + _surface_bitangent * (start_vertical + cell_size), - Vector2i(x, y_segment + 1), - sampled_vertices, - ) + _add_grid_vertex(immediate, x, y_segment, samples) + _add_grid_vertex(immediate, x, y_segment + 1, samples) for y: int in range(grid_height + 1): - var vertical: float = -half_height + float(y) * cell_size for x_segment: int in range(grid_width): - var start_horizontal: float = ( - -half_width + float(x_segment) * cell_size - ) - _add_grid_vertex( - immediate, - _surface_origin + _surface_tangent * start_horizontal - + _surface_bitangent * vertical, - Vector2i(x_segment, y), - sampled_vertices, - ) - _add_grid_vertex( - immediate, - _surface_origin - + _surface_tangent * (start_horizontal + cell_size) - + _surface_bitangent * vertical, - Vector2i(x_segment + 1, y), - sampled_vertices, - ) + _add_grid_vertex(immediate, x_segment, y, samples) + _add_grid_vertex(immediate, x_segment + 1, y, samples) immediate.surface_end() _grid_instance = MeshInstance3D.new() _grid_instance.name = "PixelGrid" @@ -334,63 +318,56 @@ func _build_grid() -> void: func _add_grid_vertex( immediate: ImmediateMesh, - world_point: Vector3, - grid_point: Vector2i, - sampled_vertices: Dictionary[Vector2i, Dictionary], + x: int, + y: int, + samples: Dictionary, ) -> void: - var sampled: Dictionary = sampled_vertices.get(grid_point, {}) - if sampled.is_empty(): - sampled = _sample_surface(world_point) - sampled_vertices[grid_point] = sampled - var point: Vector3 = sampled["position"] - var normal: Vector3 = sampled["normal"] immediate.surface_add_vertex( - to_local(point + normal * (_surface_offset() * 1.5)) + _sample_position(samples, x, y, _surface_offset() * 1.5) ) -func _build_pixel_renderer() -> void: +func _build_pixel_renderer(samples: Dictionary) -> void: if _pixel_instance != null: _pixel_instance.queue_free() _pixel_instance = null + var vertex_width: int = grid_width + 1 + var vertex_count: int = vertex_width * (grid_height + 1) var cell_count: int = grid_width * grid_height var vertices := PackedVector3Array() var texture_coordinates := PackedVector2Array() var indices := PackedInt32Array() - vertices.resize(cell_count * 4) - texture_coordinates.resize(cell_count * 4) + vertices.resize(vertex_count) + texture_coordinates.resize(vertex_count) indices.resize(cell_count * 6) _cell_surface_transforms.clear() - _cell_surface_transforms.resize(cell_count) + if not _finalized: + _cell_surface_transforms.resize(cell_count) + for y: int in range(grid_height + 1): + for x: int in range(grid_width + 1): + var vertex_index: int = y * vertex_width + x + vertices[vertex_index] = _sample_position( + samples, x, y, _surface_offset() + ) + texture_coordinates[vertex_index] = Vector2( + float(x) / float(grid_width), + 1.0 - float(y) / float(grid_height), + ) for y: int in range(grid_height): for x: int in range(grid_width): var cell_index: int = _cell_key(x, y) - var surface_transform := _sample_cell_transform(x, y, 1.0) - _cell_surface_transforms[cell_index] = surface_transform - var center: Vector3 = surface_transform.origin - var horizontal: Vector3 = surface_transform.basis.x * 0.5 - var vertical: Vector3 = surface_transform.basis.y * 0.5 - var vertex_offset: int = cell_index * 4 - vertices[vertex_offset] = center - horizontal - vertical - vertices[vertex_offset + 1] = center + horizontal - vertical - vertices[vertex_offset + 2] = center + horizontal + vertical - vertices[vertex_offset + 3] = center - horizontal + vertical - var image_row: int = _image_y(y) - var u_min: float = float(x) / float(grid_width) - var u_max: float = float(x + 1) / float(grid_width) - var v_min: float = float(image_row) / float(grid_height) - var v_max: float = float(image_row + 1) / float(grid_height) - texture_coordinates[vertex_offset] = Vector2(u_min, v_max) - texture_coordinates[vertex_offset + 1] = Vector2(u_max, v_max) - texture_coordinates[vertex_offset + 2] = Vector2(u_max, v_min) - texture_coordinates[vertex_offset + 3] = Vector2(u_min, v_min) + if not _finalized: + _cell_surface_transforms[cell_index] = _transform_from_samples( + samples, x, y + ) + var vertex_offset: int = y * vertex_width + x var index_offset: int = cell_index * 6 indices[index_offset] = vertex_offset indices[index_offset + 1] = vertex_offset + 1 - indices[index_offset + 2] = vertex_offset + 2 + indices[index_offset + 2] = vertex_offset + vertex_width + 1 indices[index_offset + 3] = vertex_offset - indices[index_offset + 4] = vertex_offset + 2 - indices[index_offset + 5] = vertex_offset + 3 + indices[index_offset + 4] = vertex_offset + vertex_width + 1 + indices[index_offset + 5] = vertex_offset + vertex_width _rebuild_pixel_image() var arrays: Array = [] arrays.resize(Mesh.ARRAY_MAX) @@ -414,21 +391,103 @@ func _build_pixel_renderer() -> void: _pixel_instance.cast_shadow = GeometryInstance3D.SHADOW_CASTING_SETTING_OFF add_child(_pixel_instance) _pixel_instance.visible = not is_hidden_by_relationship() + _configure_render_distance() + + +func _build_finalized_pixel_renderer() -> void: + if _pixel_instance != null: + _pixel_instance.queue_free() + _pixel_instance = null + var step: int = maxi( + 1, + ceili(float(grid_width) / float(FINALIZED_MAX_SUBDIVISIONS)), + ) + var coordinates := PackedInt32Array() + var coordinate: int = 0 + while coordinate < grid_width: + coordinates.append(coordinate) + coordinate += step + if coordinates.is_empty() or coordinates[-1] != grid_width: + coordinates.append(grid_width) + var vertex_width: int = coordinates.size() + var vertices := PackedVector3Array() + var texture_coordinates := PackedVector2Array() + var indices := PackedInt32Array() + vertices.resize(vertex_width * vertex_width) + texture_coordinates.resize(vertex_width * vertex_width) + indices.resize((vertex_width - 1) * (vertex_width - 1) * 6) + var half_width: float = float(grid_width) * cell_size * 0.5 + var half_height: float = float(grid_height) * cell_size * 0.5 + for lattice_y: int in vertex_width: + var cell_y: int = coordinates[lattice_y] + var vertical: float = -half_height + float(cell_y) * cell_size + for lattice_x: int in vertex_width: + var cell_x: int = coordinates[lattice_x] + var horizontal: float = -half_width + float(cell_x) * cell_size + var expected: Vector3 = ( + _surface_origin + + _surface_tangent * horizontal + + _surface_bitangent * vertical + ) + var sampled: Dictionary = _sample_surface(expected) + var vertex_index: int = lattice_y * vertex_width + lattice_x + var point: Vector3 = sampled["position"] + var normal: Vector3 = sampled["normal"] + vertices[vertex_index] = to_local( + point + normal * _surface_offset() + ) + texture_coordinates[vertex_index] = Vector2( + float(cell_x) / float(grid_width), + 1.0 - float(cell_y) / float(grid_height), + ) + for lattice_y: int in range(vertex_width - 1): + for lattice_x: int in range(vertex_width - 1): + var cell_index: int = lattice_y * (vertex_width - 1) + lattice_x + var vertex_offset: int = lattice_y * vertex_width + lattice_x + var index_offset: int = cell_index * 6 + indices[index_offset] = vertex_offset + indices[index_offset + 1] = vertex_offset + 1 + indices[index_offset + 2] = vertex_offset + vertex_width + 1 + indices[index_offset + 3] = vertex_offset + indices[index_offset + 4] = vertex_offset + vertex_width + 1 + indices[index_offset + 5] = vertex_offset + vertex_width + if _pixel_image == null or _pixel_texture == null: + _rebuild_pixel_image() + var arrays: Array = [] + arrays.resize(Mesh.ARRAY_MAX) + arrays[Mesh.ARRAY_VERTEX] = vertices + arrays[Mesh.ARRAY_TEX_UV] = texture_coordinates + arrays[Mesh.ARRAY_INDEX] = indices + var mesh := ArrayMesh.new() + mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays) + var material := StandardMaterial3D.new() + material.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + material.albedo_color = Color.WHITE + material.albedo_texture = _pixel_texture + material.texture_filter = BaseMaterial3D.TEXTURE_FILTER_NEAREST + material.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA_SCISSOR + material.alpha_scissor_threshold = 0.5 + material.cull_mode = BaseMaterial3D.CULL_DISABLED + mesh.surface_set_material(0, material) + _pixel_instance = MeshInstance3D.new() + _pixel_instance.name = "ArtworkTexture" + _pixel_instance.mesh = mesh + _pixel_instance.cast_shadow = GeometryInstance3D.SHADOW_CASTING_SETTING_OFF + add_child(_pixel_instance) + _pixel_instance.visible = not is_hidden_by_relationship() + _configure_render_distance() func _rebuild_pixel_image() -> void: - if ( - _pixel_image == null - or _pixel_image.get_width() != grid_width - or _pixel_image.get_height() != grid_height - ): - _pixel_image = Image.create( - grid_width, grid_height, false, Image.FORMAT_RGBA8 - ) - _pixel_image.fill(Color.TRANSPARENT) - if not is_hidden_by_relationship(): - for cell: Dictionary in _cells.values(): - _set_image_cell(int(cell["x"]), int(cell["y"]), cell) + if _cell_buffer == null: + return + _pixel_image = Image.create_from_data( + grid_width, + grid_height, + false, + Image.FORMAT_RGBA8, + _cell_buffer.to_rgba8_data(is_hidden_by_relationship()), + ) if _pixel_texture == null: _pixel_texture = ImageTexture.create_from_image(_pixel_image) else: @@ -443,7 +502,7 @@ func _apply_pixel_edits(edits: Array) -> void: var edit: Dictionary = edit_value var x: int = int(edit["x"]) var y: int = int(edit["y"]) - var cell: Dictionary = _cells.get(_cell_key(x, y), {}) + var cell: Dictionary = _cell_buffer.get_cell(x, y) _set_image_cell(x, y, cell) _pixel_texture.update(_pixel_image) @@ -475,6 +534,78 @@ func _image_y(cell_y: int) -> int: return grid_height - 1 - cell_y +func _sample_grid_vertices() -> Dictionary: + var vertex_width: int = grid_width + 1 + var vertex_count: int = vertex_width * (grid_height + 1) + var positions := PackedVector3Array() + var normals := PackedVector3Array() + positions.resize(vertex_count) + normals.resize(vertex_count) + var half_width: float = float(grid_width) * cell_size * 0.5 + var half_height: float = float(grid_height) * cell_size * 0.5 + var inverse_basis: Basis = global_basis.inverse() + for y: int in range(grid_height + 1): + var vertical: float = -half_height + float(y) * cell_size + for x: int in range(grid_width + 1): + var horizontal: float = -half_width + float(x) * cell_size + var expected: Vector3 = ( + _surface_origin + + _surface_tangent * horizontal + + _surface_bitangent * vertical + ) + var sampled: Dictionary = _sample_surface(expected) + var index: int = y * vertex_width + x + positions[index] = to_local(sampled["position"]) + normals[index] = ( + inverse_basis * (sampled["normal"] as Vector3) + ).normalized() + return {"positions": positions, "normals": normals} + + +func _sample_position( + samples: Dictionary, + x: int, + y: int, + offset: float, +) -> Vector3: + var index: int = y * (grid_width + 1) + x + var positions: PackedVector3Array = samples["positions"] + var normals: PackedVector3Array = samples["normals"] + return positions[index] + normals[index] * offset + + +func _transform_from_samples( + samples: Dictionary, + x: int, + y: int, +) -> Transform3D: + var bottom_left: Vector3 = _sample_position( + samples, x, y, _surface_offset() + ) + var bottom_right: Vector3 = _sample_position( + samples, x + 1, y, _surface_offset() + ) + var top_left: Vector3 = _sample_position( + samples, x, y + 1, _surface_offset() + ) + var top_right: Vector3 = _sample_position( + samples, x + 1, y + 1, _surface_offset() + ) + var horizontal: Vector3 = ( + (bottom_right - bottom_left) + (top_right - top_left) + ) * 0.5 + var vertical: Vector3 = ( + (top_left - bottom_left) + (top_right - bottom_right) + ) * 0.5 + var normal: Vector3 = horizontal.cross(vertical).normalized() + if horizontal.is_zero_approx() or vertical.is_zero_approx() or normal.is_zero_approx(): + return _sample_cell_transform(x, y, 1.0) + var center: Vector3 = ( + bottom_left + bottom_right + top_left + top_right + ) * 0.25 + return Transform3D(Basis(horizontal, vertical, normal), center) + + func _sample_cell_transform( x: int, y: int, @@ -549,6 +680,17 @@ func _refresh_grid_visibility() -> void: ) +func _configure_render_distance() -> void: + if _pixel_instance == null: + return + _pixel_instance.visibility_range_end = ( + FINALIZED_VISIBILITY_RANGE if _finalized else 0.0 + ) + _pixel_instance.visibility_range_end_margin = ( + FINALIZED_VISIBILITY_MARGIN if _finalized else 0.0 + ) + + func _participants_from_state(data: Dictionary) -> Array[String]: var result: Array[String] = [] _append_participant(result, str(data.get("creator_fingerprint", ""))) diff --git a/drawing/surface_drawing_cell_buffer.gd b/drawing/surface_drawing_cell_buffer.gd new file mode 100644 index 0000000..ca2e7b3 --- /dev/null +++ b/drawing/surface_drawing_cell_buffer.gd @@ -0,0 +1,284 @@ +# SPDX-License-Identifier: GPL-3.0-or-later +class_name SurfaceDrawingCellBuffer +extends RefCounted + +const ENCODING := "palette_author_planes_v1" + +var width: int = 0 +var height: int = 0 + +var _color_indices := PackedByteArray() +var _author_indices := PackedInt32Array() +var _participants: Array[String] = [] +var _participant_slots: Dictionary[String, int] = {} +var _author_masks: Dictionary[int, PackedByteArray] = {} +var _painted_count: int = 0 + + +func configure_from_state( + data: Dictionary, + already_validated: bool = false, +) -> bool: + if not already_validated and not SurfaceDrawingProtocol.validate_canvas_state(data): + return false + width = int(data["width"]) + height = int(data["height"]) + _reset_planes() + for value: Variant in data.get("participant_fingerprints", []): + _add_participant(str(value)) + _add_participant(str(data.get("creator_fingerprint", ""))) + if str(data.get("cell_encoding", "")) == ENCODING: + return _configure_packed( + data.get("cell_colors", PackedByteArray()), + data.get("cell_authors", PackedInt32Array()), + ) + for value: Variant in data.get("cells", []): + if typeof(value) != TYPE_DICTIONARY or not _apply_edit(value): + return false + return true + + +func apply_edits(edits: Array) -> bool: + for value: Variant in edits: + if typeof(value) != TYPE_DICTIONARY or not _apply_edit(value): + return false + return true + + +func ensure_participants(values: Array) -> bool: + for value: Variant in values: + if _add_participant(str(value)) <= 0: + return false + return true + + +func get_cell(x: int, y: int) -> Dictionary: + var key: int = _key(x, y) + if key < 0 or _color_indices[key] == 0: + return {} + var author_slot: int = _author_indices[key] + return { + "x": x, + "y": y, + "color_id": str( + SurfaceDrawingPalette.id_for_palette_index(_color_indices[key]) + ), + "author_fingerprint": ( + _participants[author_slot - 1] + if author_slot > 0 and author_slot <= _participants.size() + else "" + ), + } + + +func get_cell_value(x: int, y: int) -> Dictionary: + var cell: Dictionary = get_cell(x, y) + if cell.is_empty(): + return {} + return { + "color_id": cell["color_id"], + "author_fingerprint": cell["author_fingerprint"], + } + + +func get_painted_count() -> int: + return _painted_count + + +func get_participants() -> Array[String]: + return _participants.duplicate() + + +func get_author_cell_keys(fingerprint: String) -> PackedInt32Array: + var slot: int = int(_participant_slots.get(fingerprint, 0)) + var mask: PackedByteArray = _author_masks.get(slot, PackedByteArray()) + var result := PackedInt32Array() + if slot <= 0 or mask.is_empty(): + return result + for key: int in width * height: + if _mask_has(mask, key): + result.append(key) + return result + + +func to_cells() -> Array[Dictionary]: + var result: Array[Dictionary] = [] + for key: int in width * height: + if _color_indices[key] == 0: + continue + result.append(get_cell(key % width, floori(float(key) / float(width)))) + return result + + +func to_compact_fields() -> Dictionary: + return { + "cell_encoding": ENCODING, + "cell_colors": _color_indices.duplicate(), + "cell_authors": _author_indices.duplicate(), + "participant_fingerprints": get_participants(), + } + + +func to_rgba8_data(hidden: bool = false) -> PackedByteArray: + var result := PackedByteArray() + result.resize(width * height * 4) + # Match Image.fill(Color.TRANSPARENT): transparent texels retain white RGB, + # preventing dark fringes if filtering is ever changed by a platform driver. + for pixel_index: int in width * height: + var offset: int = pixel_index * 4 + result[offset] = 255 + result[offset + 1] = 255 + result[offset + 2] = 255 + if hidden: + return result + for key: int in width * height: + var palette_index: int = _color_indices[key] + if palette_index == 0: + continue + var x: int = key % width + var y: int = floori(float(key) / float(width)) + var image_key: int = (height - 1 - y) * width + x + var offset: int = image_key * 4 + var color: Color = SurfaceDrawingPalette.color_for_palette_index( + palette_index + ) + result[offset] = roundi(color.r * 255.0) + result[offset + 1] = roundi(color.g * 255.0) + result[offset + 2] = roundi(color.b * 255.0) + result[offset + 3] = roundi(color.a * 255.0) + return result + + +func estimated_storage_bytes() -> int: + var masks_size: int = 0 + for mask: PackedByteArray in _author_masks.values(): + masks_size += mask.size() + return _color_indices.size() + _author_indices.size() * 4 + masks_size + + +func _configure_packed(colors: Variant, authors: Variant) -> bool: + if ( + typeof(colors) != TYPE_PACKED_BYTE_ARRAY + or typeof(authors) != TYPE_PACKED_INT32_ARRAY + ): + return false + var packed_colors: PackedByteArray = colors + var packed_authors: PackedInt32Array = authors + if ( + packed_colors.size() != width * height + or packed_authors.size() != width * height + ): + return false + _color_indices = packed_colors.duplicate() + _author_indices = packed_authors.duplicate() + _painted_count = 0 + for key: int in width * height: + var color_index: int = _color_indices[key] + var author_slot: int = _author_indices[key] + if color_index == 0: + if author_slot != 0: + return false + continue + if ( + color_index > SurfaceDrawingPalette.COLORS.size() + or author_slot <= 0 + or author_slot > _participants.size() + ): + return false + _painted_count += 1 + _set_author_mask_bit(author_slot, key, true) + return true + + +func _apply_edit(value: Dictionary) -> bool: + var x: int = int(value.get("x", -1)) + var y: int = int(value.get("y", -1)) + var key: int = _key(x, y) + if key < 0: + return false + var color_id := StringName(str(value.get("color_id", ""))) + var next_color_index: int = ( + SurfaceDrawingPalette.palette_index_for_id(color_id) + if not color_id.is_empty() + else 0 + ) + if not color_id.is_empty() and next_color_index <= 0: + return false + var next_author_slot: int = 0 + if next_color_index > 0: + next_author_slot = _add_participant( + str(value.get("author_fingerprint", "")) + ) + if next_author_slot <= 0: + return false + var previous_color_index: int = _color_indices[key] + var previous_author_slot: int = _author_indices[key] + if previous_color_index == next_color_index and previous_author_slot == next_author_slot: + return true + if previous_author_slot > 0: + _set_author_mask_bit(previous_author_slot, key, false) + if previous_color_index == 0 and next_color_index > 0: + _painted_count += 1 + elif previous_color_index > 0 and next_color_index == 0: + _painted_count -= 1 + _color_indices[key] = next_color_index + _author_indices[key] = next_author_slot + if next_author_slot > 0: + _set_author_mask_bit(next_author_slot, key, true) + return true + + +func _reset_planes() -> void: + _color_indices.resize(width * height) + _color_indices.fill(0) + _author_indices.resize(width * height) + _author_indices.fill(0) + _participants.clear() + _participant_slots.clear() + _author_masks.clear() + _painted_count = 0 + + +func _add_participant(fingerprint: String) -> int: + var existing: int = int(_participant_slots.get(fingerprint, 0)) + if existing > 0: + return existing + if not NetworkIdentityCrypto.valid_fingerprint(fingerprint): + return 0 + if _participants.size() >= SurfaceDrawingProtocol.MAX_PARTICIPANTS: + return 0 + _participants.append(fingerprint) + var slot: int = _participants.size() + _participant_slots[fingerprint] = slot + return slot + + +func _set_author_mask_bit(slot: int, key: int, enabled: bool) -> void: + if slot <= 0 or key < 0: + return + var mask: PackedByteArray = _author_masks.get(slot, PackedByteArray()) + var required_size: int = ceili(float(width * height) / 8.0) + if mask.size() != required_size: + mask.resize(required_size) + var byte_index: int = floori(float(key) / 8.0) + var bit: int = 1 << (key % 8) + if enabled: + mask[byte_index] = mask[byte_index] | bit + else: + mask[byte_index] = mask[byte_index] & (~bit & 0xff) + _author_masks[slot] = mask + + +func _mask_has(mask: PackedByteArray, key: int) -> bool: + var byte_index: int = floori(float(key) / 8.0) + return ( + byte_index >= 0 + and byte_index < mask.size() + and (mask[byte_index] & (1 << (key % 8))) != 0 + ) + + +func _key(x: int, y: int) -> int: + if x < 0 or x >= width or y < 0 or y >= height: + return -1 + return y * width + x diff --git a/drawing/surface_drawing_cell_buffer.gd.uid b/drawing/surface_drawing_cell_buffer.gd.uid new file mode 100644 index 0000000..1910bdf --- /dev/null +++ b/drawing/surface_drawing_cell_buffer.gd.uid @@ -0,0 +1 @@ +uid://b4clw478edbnk diff --git a/drawing/surface_drawing_palette.gd b/drawing/surface_drawing_palette.gd index c8bfc8e..4a3b734 100644 --- a/drawing/surface_drawing_palette.gd +++ b/drawing/surface_drawing_palette.gd @@ -45,6 +45,31 @@ static func get_color_ids() -> Array[StringName]: return result +static func palette_index_for_id(color_id: StringName) -> int: + for index: int in COLORS.size(): + if StringName(COLORS[index].get("id", &"")) == color_id: + return index + 1 + return 0 + + +static func id_for_palette_index(palette_index: int) -> StringName: + var index: int = palette_index - 1 + return ( + StringName(COLORS[index].get("id", &"")) + if index >= 0 and index < COLORS.size() + else StringName() + ) + + +static func color_for_palette_index(palette_index: int) -> Color: + var index: int = palette_index - 1 + return ( + COLORS[index].get("color", Color.TRANSPARENT) + if index >= 0 and index < COLORS.size() + else Color.TRANSPARENT + ) + + static func filter_unlocked_ids( unlocked_ids: Array[StringName], ) -> Array[StringName]: diff --git a/drawing/surface_drawing_placement.gd b/drawing/surface_drawing_placement.gd index bfa1abc..7fb0e25 100644 --- a/drawing/surface_drawing_placement.gd +++ b/drawing/surface_drawing_placement.gd @@ -25,7 +25,7 @@ static func resolve( } var nearest_distance: float = SNAP_DISTANCE for state: Dictionary in canvas_states: - if not SurfaceDrawingProtocol.validate_canvas_state(state): + if not SurfaceDrawingProtocol.validate_canvas_metadata(state): continue var anchor_normal: Vector3 = SurfaceDrawingProtocol.array_to_vector( state["normal"] diff --git a/drawing/surface_drawing_protocol.gd b/drawing/surface_drawing_protocol.gd index ff132f8..b31d9c0 100644 --- a/drawing/surface_drawing_protocol.gd +++ b/drawing/surface_drawing_protocol.gd @@ -1,7 +1,7 @@ class_name SurfaceDrawingProtocol extends RefCounted -const CAPABILITY: StringName = &"surface_drawing_v2" +const CAPABILITY: StringName = &"surface_drawing_v3" const RELIABLE_CHANNEL: int = NetworkProtocol.DRAWING_RELIABLE_CHANNEL const GRID_SIZES: Array[int] = [16, 32, 64, 128] const DEFAULT_GRID_SIZE: int = 16 @@ -11,8 +11,12 @@ const GRID_WIDTH: int = DEFAULT_GRID_SIZE const GRID_HEIGHT: int = DEFAULT_GRID_SIZE const CELL_SIZE: float = 0.075 const MAX_ACTIVE_CANVASES: int = 24 -const MAX_CANVASES: int = 48 -const MAX_SESSION_GRID_CELLS: int = 49152 +const MAX_FINALIZED_CANVASES: int = 512 +const MAX_CANVASES: int = MAX_ACTIVE_CANVASES + MAX_FINALIZED_CANVASES +const MAX_ACTIVE_GRID_CELLS: int = 49152 +const MAX_FINALIZED_GRID_CELLS: int = 8 * 1024 * 1024 +# Compatibility alias for code concerned only with live editing capacity. +const MAX_SESSION_GRID_CELLS: int = MAX_ACTIVE_GRID_CELLS const MAX_EDITS_PER_REQUEST: int = 16 const MAX_CANVAS_ID_LENGTH: int = 64 const MAX_REQUEST_ID_LENGTH: int = 64 @@ -22,6 +26,7 @@ const MAX_SESSION_ID_LENGTH: int = 96 # for a complete room turnover while never accepting unattributed edits. const MAX_PARTICIPANTS: int = 256 const MAX_COORDINATE: float = 10000.0 +const CELL_ENCODING := "palette_author_planes_v1" static func validate_canvas_request(data: Variant) -> bool: @@ -122,59 +127,93 @@ static func validate_canvas_state(data: Variant) -> bool: if typeof(data) != TYPE_DICTIONARY: return false var value: Dictionary = data - if ( - typeof(value.get("session_id")) != TYPE_STRING - or str(value["session_id"]).is_empty() - or str(value["session_id"]).length() > MAX_SESSION_ID_LENGTH - or typeof(value.get("canvas_id")) != TYPE_STRING - or str(value["canvas_id"]).is_empty() - or str(value["canvas_id"]).length() > MAX_CANVAS_ID_LENGTH - or not _valid_vector(value.get("origin")) - or not _valid_vector(value.get("normal")) - or not _valid_vector(value.get("tangent")) - or typeof(value.get("width")) != TYPE_INT - or int(value["width"]) not in GRID_SIZES - or typeof(value.get("height")) != TYPE_INT - or int(value["height"]) != int(value["width"]) - or typeof(value.get("cell_size")) not in [TYPE_FLOAT, TYPE_INT] - or not is_equal_approx(float(value["cell_size"]), CELL_SIZE) - or typeof(value.get("revision")) != TYPE_INT - or int(value["revision"]) < 0 - or typeof(value.get("guide_visible", true)) != TYPE_BOOL - or typeof(value.get("finalized", false)) != TYPE_BOOL - or typeof(value.get("layer", 0)) != TYPE_INT - or int(value.get("layer", 0)) < 0 - or not NetworkIdentityCrypto.valid_fingerprint( - value.get("creator_fingerprint") - ) - or not _valid_participant_fingerprints( - value.get("participant_fingerprints", []) - ) - or typeof(value.get("cells")) != TYPE_ARRAY - ): + if not validate_canvas_metadata(value): return false - var cells: Array = value["cells"] - var grid_width: int = int(value["width"]) - var grid_height: int = int(value["height"]) - if cells.size() > grid_width * grid_height: - return false - for cell_value: Variant in cells: - if ( - not validate_authoritative_cell(cell_value) - or int((cell_value as Dictionary)["x"]) >= grid_width - or int((cell_value as Dictionary)["y"]) >= grid_height - ): - return false var participants: Array = value.get("participant_fingerprints", []) - if not participants.is_empty(): - if str(value["creator_fingerprint"]) not in participants: + if not participants.is_empty() and str(value["creator_fingerprint"]) not in participants: + return false + if typeof(value.get("cells")) == TYPE_ARRAY: + var cells: Array = value["cells"] + var grid_width: int = int(value["width"]) + var grid_height: int = int(value["height"]) + if cells.size() > grid_width * grid_height: return false for cell_value: Variant in cells: - if str((cell_value as Dictionary)["author_fingerprint"]) not in participants: + if ( + not validate_authoritative_cell(cell_value) + or int((cell_value as Dictionary)["x"]) >= grid_width + or int((cell_value as Dictionary)["y"]) >= grid_height + ): return false + if ( + not participants.is_empty() + and str((cell_value as Dictionary)["author_fingerprint"]) + not in participants + ): + return false + return true + if ( + str(value.get("cell_encoding", "")) != CELL_ENCODING + or typeof(value.get("cell_colors")) != TYPE_PACKED_BYTE_ARRAY + or typeof(value.get("cell_authors")) != TYPE_PACKED_INT32_ARRAY + or participants.is_empty() + ): + return false + var colors: PackedByteArray = value["cell_colors"] + var authors: PackedInt32Array = value["cell_authors"] + var expected_size: int = int(value["width"]) * int(value["height"]) + if colors.size() != expected_size or authors.size() != expected_size: + return false + for index: int in expected_size: + var color_index: int = colors[index] + var author_slot: int = authors[index] + if color_index == 0: + if author_slot != 0: + return false + elif ( + color_index > SurfaceDrawingPalette.COLORS.size() + or author_slot <= 0 + or author_slot > participants.size() + ): + return false return true +static func validate_canvas_metadata(data: Variant) -> bool: + if typeof(data) != TYPE_DICTIONARY: + return false + var value: Dictionary = data + return ( + typeof(value.get("session_id")) == TYPE_STRING + and not str(value["session_id"]).is_empty() + and str(value["session_id"]).length() <= MAX_SESSION_ID_LENGTH + and typeof(value.get("canvas_id")) == TYPE_STRING + and not str(value["canvas_id"]).is_empty() + and str(value["canvas_id"]).length() <= MAX_CANVAS_ID_LENGTH + and _valid_vector(value.get("origin")) + and _valid_vector(value.get("normal")) + and _valid_vector(value.get("tangent")) + and typeof(value.get("width")) == TYPE_INT + and int(value["width"]) in GRID_SIZES + and typeof(value.get("height")) == TYPE_INT + and int(value["height"]) == int(value["width"]) + and typeof(value.get("cell_size")) in [TYPE_FLOAT, TYPE_INT] + and is_equal_approx(float(value["cell_size"]), CELL_SIZE) + and typeof(value.get("revision")) == TYPE_INT + and int(value["revision"]) >= 0 + and typeof(value.get("guide_visible", true)) == TYPE_BOOL + and typeof(value.get("finalized", false)) == TYPE_BOOL + and typeof(value.get("layer", 0)) == TYPE_INT + and int(value.get("layer", 0)) >= 0 + and NetworkIdentityCrypto.valid_fingerprint( + value.get("creator_fingerprint") + ) + and _valid_participant_fingerprints( + value.get("participant_fingerprints", []) + ) + ) + + static func validate_guide_update(data: Variant) -> bool: if typeof(data) != TYPE_DICTIONARY: return false diff --git a/network/network_protocol.gd b/network/network_protocol.gd index 5b3ca89..d994c96 100644 --- a/network/network_protocol.gd +++ b/network/network_protocol.gd @@ -32,7 +32,7 @@ const DRAWING_RELIABLE_CHANNEL: int = 14 const FISHING_RELIABLE_CHANNEL: int = 16 const HOME_RELIABLE_CHANNEL: int = 17 const ENET_CHANNEL_COUNT: int = 18 -const SURFACE_DRAWING_CAPABILITY: String = "surface_drawing_v2" +const SURFACE_DRAWING_CAPABILITY: String = "surface_drawing_v3" const ART_SHOP_CAPABILITY: String = "art_shop_v1" const BACKPACK_SHOP_CAPABILITY: String = "backpack_shop_v1" const WORLD_TIME_CAPABILITY: String = "world_time_v2" diff --git a/network/network_surface_drawing_service.gd b/network/network_surface_drawing_service.gd index 485dfaa..5f6c52e 100644 --- a/network/network_surface_drawing_service.gd +++ b/network/network_surface_drawing_service.gd @@ -31,6 +31,14 @@ const ARTWORK_DIRECTORY_NAME: String = "artwork" const STAMP_ALPHA_THRESHOLD: float = 0.5 const STAMP_COLOR_TOLERANCE: float = 0.012 const INVALID_POINTER_SCREEN_POSITION := Vector2(-1.0, -1.0) +const SNAPSHOT_CANVASES_PER_FRAME: int = 2 +# A maximum-size 128 x 128 canvas consumes this entire budget, preventing +# late-join synchronization from building two large artwork textures at once. +const SNAPSHOT_GRID_CELLS_PER_FRAME: int = 16384 +const FINALIZED_NODE_LOAD_DISTANCE: float = 108.0 +const FINALIZED_NODE_UNLOAD_DISTANCE: float = 128.0 +const FINALIZED_STREAM_INTERVAL_MSEC: int = 250 +const FINALIZED_NODE_LOADS_PER_PASS: int = 1 enum GuideAction { NONE, @@ -49,7 +57,10 @@ var _art_unlocks: PlayerArtUnlocks var _data_root: PlayerDataRoot var _drawing_root: Node3D var _canvas_states: Dictionary[String, Dictionary] = {} +var _canvas_cells: Dictionary[String, SurfaceDrawingCellBuffer] = {} var _canvas_nodes: Dictionary[String, SurfaceDrawingCanvas] = {} +var _snapshot_queues: Dictionary[int, Array] = {} +var _last_finalized_stream_msec: int = 0 var _selected_canvas_id: String = "" var _hovered_canvas_id: String = "" var _last_hovered_canvas_id: String = "" @@ -753,8 +764,8 @@ func get_canvas_count() -> int: func get_painted_cell_count() -> int: var count: int = 0 - for state: Dictionary in _canvas_states.values(): - count += (state.get("cells", []) as Array).size() + for buffer: SurfaceDrawingCellBuffer in _canvas_cells.values(): + count += buffer.get_painted_count() return count @@ -807,7 +818,13 @@ func get_canvas_ids() -> Array[String]: func get_canvas_state(canvas_id: String) -> Dictionary: - return Dictionary(_canvas_states.get(canvas_id, {})).duplicate(true) + var state: Dictionary = _canvas_states.get(canvas_id, {}) + var buffer: SurfaceDrawingCellBuffer = _canvas_cells.get(canvas_id) + if state.is_empty() or buffer == null: + return {} + var result: Dictionary = state.duplicate(true) + result["cells"] = buffer.to_cells() + return result func is_stamp_mode() -> bool: @@ -1029,6 +1046,8 @@ func _next_artwork_export_path(directory: String) -> String: func _process(_delta: float) -> void: + _pump_snapshot_queues() + _refresh_finalized_canvas_streaming() if not _active: return if not can_activate(): @@ -1313,8 +1332,8 @@ func _handle_canvas_request(peer_id: int, data: Dictionary) -> void: or not _peer_can_place_grid(peer_id, requested_size) or _canvas_states.size() >= SurfaceDrawingProtocol.MAX_CANVASES or _active_canvas_count() >= SurfaceDrawingProtocol.MAX_ACTIVE_CANVASES - or _allocated_grid_cells() + requested_size * requested_size - > SurfaceDrawingProtocol.MAX_SESSION_GRID_CELLS + or _allocated_active_grid_cells() + requested_size * requested_size + > SurfaceDrawingProtocol.MAX_ACTIVE_GRID_CELLS ): return var avatar: Player = _spawn_service.get_avatar(peer_id) @@ -1400,8 +1419,10 @@ func _handle_stamp_request(peer_id: int, data: Dictionary) -> void: or not _accept_request(peer_id, str(data["request_id"])) or not _peer_can_stamp(peer_id, data) or _canvas_states.size() >= SurfaceDrawingProtocol.MAX_CANVASES - or _allocated_grid_cells() + requested_size * requested_size - > SurfaceDrawingProtocol.MAX_SESSION_GRID_CELLS + or _finalized_canvas_count() + >= SurfaceDrawingProtocol.MAX_FINALIZED_CANVASES + or _allocated_finalized_grid_cells() + requested_size * requested_size + > SurfaceDrawingProtocol.MAX_FINALIZED_GRID_CELLS ): return var avatar: Player = _spawn_service.get_avatar(peer_id) @@ -1442,6 +1463,12 @@ func _handle_stamp_request(peer_id: int, data: Dictionary) -> void: var canvas_id: String = "%s-%d" % [ _session.get_session_id().left(16), _canvas_sequence, ] + var stamp_colors: PackedByteArray = data["pixels"] + var stamp_authors := PackedInt32Array() + stamp_authors.resize(stamp_colors.size()) + for cell_key: int in stamp_colors.size(): + if stamp_colors[cell_key] > 0: + stamp_authors[cell_key] = 1 var state: Dictionary = { "session_id": _session.get_session_id(), "canvas_id": canvas_id, @@ -1459,9 +1486,9 @@ func _handle_stamp_request(peer_id: int, data: Dictionary) -> void: "layer": _canvas_sequence, "creator_fingerprint": record.identity_fingerprint, "participant_fingerprints": [record.identity_fingerprint], - "cells": _stamp_cells( - data["pixels"], requested_size, record.identity_fingerprint - ), + "cell_encoding": SurfaceDrawingProtocol.CELL_ENCODING, + "cell_colors": stamp_colors, + "cell_authors": stamp_authors, "stamp": true, } _apply_canvas_state(state) @@ -1469,27 +1496,6 @@ func _handle_stamp_request(peer_id: int, data: Dictionary) -> void: _emit_hud_state("stamp placed • finalized artwork shared with everyone") -func _stamp_cells( - pixels: PackedByteArray, - grid_size: int, - author_fingerprint: String, -) -> Array[Dictionary]: - var result: Array[Dictionary] = [] - var palette_ids: Array[StringName] = SurfaceDrawingPalette.get_color_ids() - for cell_key: int in range(pixels.size()): - var palette_index: int = pixels[cell_key] - if palette_index <= 0: - continue - var cell_y: int = floori(float(cell_key) / float(grid_size)) - result.append({ - "x": cell_key % grid_size, - "y": cell_y, - "color_id": str(palette_ids[palette_index - 1]), - "author_fingerprint": author_fingerprint, - }) - return result - - @rpc( "any_peer", "call_remote", @@ -1529,6 +1535,18 @@ func _handle_guide_request(peer_id: int, data: Dictionary) -> void: var finalized: bool = bool(data["finalized"]) if was_finalized: return + if ( + finalized + and ( + _finalized_canvas_count() + >= SurfaceDrawingProtocol.MAX_FINALIZED_CANVASES + or _allocated_finalized_grid_cells() + + int(state["width"]) * int(state["height"]) + > SurfaceDrawingProtocol.MAX_FINALIZED_GRID_CELLS + ) + ): + _emit_hud_state("finished artwork limit reached for this session") + return var guide_visible: bool = bool(data["guide_visible"]) and not finalized if ( bool(state.get("guide_visible", true)) == guide_visible @@ -1774,18 +1792,23 @@ func _queue_overlapping_finished_mutations( ).normalized() if normal.dot(target_normal) < 0.9: continue - var canvas: SurfaceDrawingCanvas = _canvas_nodes.get(canvas_id) if ( - canvas == null - or not canvas.contains_world_point( + not _state_contains_world_point( + state, world_position, SurfaceDrawingCanvas.SURFACE_SAMPLE_DEPTH + 0.05, ) ): continue - var center_cell: Vector2i = canvas.cell_at_world_point(world_position) + var center_cell: Vector2i = _state_cell_at_world_point( + state, world_position + ) if center_cell.x < 0: continue + var tangent: Vector3 = SurfaceDrawingProtocol.array_to_vector( + state["tangent"] + ).normalized() + var bitangent: Vector3 = normal.cross(tangent).normalized() for y_offset: int in range(-1, 2): for x_offset: int in range(-1, 2): var cell := Vector2i( @@ -1794,19 +1817,19 @@ func _queue_overlapping_finished_mutations( ) if ( cell.x < 0 - or cell.x >= canvas.grid_width + or cell.x >= int(state["width"]) or cell.y < 0 - or cell.y >= canvas.grid_height + or cell.y >= int(state["height"]) ): continue var relative: Vector3 = ( - canvas.get_cell_world_position(cell.x, cell.y) + _state_cell_position(state, cell.x, cell.y) - world_position ) if ( - absf(relative.dot(canvas.get_surface_tangent())) + absf(relative.dot(tangent)) >= SurfaceDrawingProtocol.CELL_SIZE - or absf(relative.dot(canvas.get_surface_bitangent())) + or absf(relative.dot(bitangent)) >= SurfaceDrawingProtocol.CELL_SIZE or _state_cell(state, cell.x, cell.y).is_empty() ): @@ -1861,11 +1884,9 @@ func _publish_cell_mutations( canvas_ids.sort() for canvas_id: String in canvas_ids: var state: Dictionary = _canvas_states.get(canvas_id, {}) - if state.is_empty(): + var buffer: SurfaceDrawingCellBuffer = _canvas_cells.get(canvas_id) + if state.is_empty() or buffer == null: continue - var cells: Dictionary[int, Dictionary] = _cells_by_key( - state["cells"], int(state["width"]) - ) var canvas_mutations: Dictionary = mutations[canvas_id] var cell_keys: Array[int] = [] for cell_key_value: Variant in canvas_mutations.keys(): @@ -1874,18 +1895,11 @@ func _publish_cell_mutations( var edits: Array[Dictionary] = [] for cell_key: int in cell_keys: var edit: Dictionary = canvas_mutations[cell_key] - if str(edit["color_id"]).is_empty(): - cells.erase(cell_key) - else: - cells[cell_key] = edit.duplicate(true) edits.append(edit.duplicate(true)) - if edits.is_empty(): + if edits.is_empty() or not buffer.apply_edits(edits): continue state["revision"] = int(state["revision"]) + 1 - state["cells"] = _sorted_cells(cells) - state["participant_fingerprints"] = _merged_participants( - state, {"edits": edits} - ) + state["participant_fingerprints"] = buffer.get_participants() _canvas_states[canvas_id] = state var update: Dictionary = { "session_id": _session.get_session_id(), @@ -1898,7 +1912,7 @@ func _publish_cell_mutations( } var local_canvas: SurfaceDrawingCanvas = _canvas_nodes.get(canvas_id) if local_canvas != null: - local_canvas.apply_update(update) + local_canvas.apply_buffered_update(update) _broadcast_canvas_update(update) _emit_artwork_changed() @@ -2068,8 +2082,13 @@ func request_canvas_snapshot(request_id: String) -> void: ) ): return - for state: Dictionary in _canvas_states.values(): - receive_canvas_state.rpc_id(sender_id, state) + var canvas_ids: Array[String] = get_canvas_ids() + canvas_ids.sort_custom(func(first: String, second: String) -> bool: + return _snapshot_canvas_precedes(first, second, sender_id) + ) + var queued: Array = [] + queued.assign(canvas_ids) + _snapshot_queues[sender_id] = queued func _apply_canvas_state(data: Dictionary) -> void: @@ -2085,12 +2104,21 @@ func _apply_canvas_state(data: Dictionary) -> void: and int(data["revision"]) <= int(previous_state["revision"]) ): return + var buffer := SurfaceDrawingCellBuffer.new() + if not buffer.configure_from_state(data, true): + return var normalized_state: Dictionary = data.duplicate(true) - normalized_state["participant_fingerprints"] = _state_participants( - normalized_state - ) + normalized_state.erase("cells") + normalized_state.erase("cell_encoding") + normalized_state.erase("cell_colors") + normalized_state.erase("cell_authors") + normalized_state["participant_fingerprints"] = buffer.get_participants() _canvas_states[canvas_id] = normalized_state - _rebuild_canvas_node(normalized_state) + _canvas_cells[canvas_id] = buffer + if _should_load_canvas_node(normalized_state, FINALIZED_NODE_LOAD_DISTANCE): + _rebuild_canvas_node(normalized_state, buffer) + else: + _unload_canvas_node(canvas_id) _refresh_stencil_visibility() _emit_artwork_changed() if ( @@ -2105,7 +2133,10 @@ func _apply_canvas_state(data: Dictionary) -> void: ) -func _rebuild_canvas_node(data: Dictionary) -> void: +func _rebuild_canvas_node( + data: Dictionary, + buffer: SurfaceDrawingCellBuffer, +) -> void: var canvas_id: String = str(data["canvas_id"]) var previous_canvas: SurfaceDrawingCanvas = _canvas_nodes.get(canvas_id) if previous_canvas != null: @@ -2113,12 +2144,82 @@ func _rebuild_canvas_node(data: Dictionary) -> void: var canvas := SurfaceDrawingCanvas.new() canvas.name = "Drawing_%s" % canvas_id _drawing_root.add_child(canvas) - if not canvas.setup(data, _relationships, SOLID_SURFACE_MASK): + if not canvas.setup(data, _relationships, SOLID_SURFACE_MASK, buffer): canvas.queue_free() return _canvas_nodes[canvas_id] = canvas +func _refresh_finalized_canvas_streaming() -> void: + var now: int = Time.get_ticks_msec() + if now - _last_finalized_stream_msec < FINALIZED_STREAM_INTERVAL_MSEC: + return + _last_finalized_stream_msec = now + for canvas_id: String in _canvas_nodes.keys(): + var state: Dictionary = _canvas_states.get(canvas_id, {}) + if ( + bool(state.get("finalized", false)) + and not _should_load_canvas_node( + state, FINALIZED_NODE_UNLOAD_DISTANCE + ) + ): + _unload_canvas_node(canvas_id) + var candidates: Array[String] = [] + for canvas_id: String in _canvas_states: + var state: Dictionary = _canvas_states[canvas_id] + if ( + not _canvas_nodes.has(canvas_id) + and _should_load_canvas_node(state, FINALIZED_NODE_LOAD_DISTANCE) + ): + candidates.append(canvas_id) + candidates.sort_custom(func(first: String, second: String) -> bool: + return _canvas_distance_squared(first) < _canvas_distance_squared(second) + ) + for index: int in mini(candidates.size(), FINALIZED_NODE_LOADS_PER_PASS): + var canvas_id: String = candidates[index] + var buffer: SurfaceDrawingCellBuffer = _canvas_cells.get(canvas_id) + if buffer != null: + _rebuild_canvas_node(_canvas_states[canvas_id], buffer) + + +func _should_load_canvas_node(state: Dictionary, distance: float) -> bool: + if state.is_empty(): + return false + if not bool(state.get("finalized", false)): + return true + if _local_player == null or not is_instance_valid(_local_player): + return false + return _local_player.global_position.distance_squared_to( + SurfaceDrawingProtocol.array_to_vector(state["origin"]) + ) <= distance * distance + + +func _canvas_distance_squared(canvas_id: String) -> float: + var state: Dictionary = _canvas_states.get(canvas_id, {}) + if ( + state.is_empty() + or _local_player == null + or not is_instance_valid(_local_player) + ): + return INF + return _local_player.global_position.distance_squared_to( + SurfaceDrawingProtocol.array_to_vector(state["origin"]) + ) + + +func _unload_canvas_node(canvas_id: String) -> void: + var canvas: SurfaceDrawingCanvas = _canvas_nodes.get(canvas_id) + if canvas != null: + canvas.queue_free() + _canvas_nodes.erase(canvas_id) + if _selected_canvas_id == canvas_id: + _selected_canvas_id = "" + if _hovered_canvas_id == canvas_id: + _hovered_canvas_id = "" + if _last_hovered_canvas_id == canvas_id: + _last_hovered_canvas_id = "" + + func _apply_canvas_update(data: Dictionary) -> void: if ( not SurfaceDrawingProtocol.validate_canvas_update(data) @@ -2127,12 +2228,14 @@ func _apply_canvas_update(data: Dictionary) -> void: return var canvas_id: String = str(data["canvas_id"]) var state: Dictionary = _canvas_states.get(canvas_id, {}) + var buffer: SurfaceDrawingCellBuffer = _canvas_cells.get(canvas_id) var canvas: SurfaceDrawingCanvas = _canvas_nodes.get(canvas_id) - if state.is_empty() or canvas == null or int(data["revision"]) <= int(state["revision"]): + if ( + state.is_empty() + or buffer == null + or int(data["revision"]) <= int(state["revision"]) + ): return - var cells: Dictionary[int, Dictionary] = _cells_by_key( - state["cells"], int(state["width"]) - ) var grid_width: int = int(state["width"]) var grid_height: int = int(state["height"]) for edit_value: Variant in data["edits"]: @@ -2141,18 +2244,13 @@ func _apply_canvas_update(data: Dictionary) -> void: var y: int = int(edit["y"]) if x < 0 or x >= grid_width or y < 0 or y >= grid_height: return - var key: int = y * grid_width + x - if str(edit["color_id"]).is_empty(): - cells.erase(key) - else: - cells[key] = edit.duplicate(true) + if not buffer.apply_edits(data["edits"]): + return state["revision"] = int(data["revision"]) - state["cells"] = _sorted_cells(cells) - state["participant_fingerprints"] = _merged_participants( - state, data - ) + state["participant_fingerprints"] = buffer.get_participants() _canvas_states[canvas_id] = state - canvas.apply_update(data) + if canvas != null: + canvas.apply_buffered_update(data) _emit_artwork_changed() @@ -2167,7 +2265,6 @@ func _apply_guide_update(data: Dictionary) -> void: var canvas: SurfaceDrawingCanvas = _canvas_nodes.get(canvas_id) if ( state.is_empty() - or canvas == null or int(data["revision"]) <= int(state["revision"]) ): return @@ -2179,8 +2276,13 @@ func _apply_guide_update(data: Dictionary) -> void: state["participant_fingerprints"] = _merged_participants( state, data ) + var buffer: SurfaceDrawingCellBuffer = _canvas_cells.get(canvas_id) + if buffer != null: + buffer.ensure_participants(state["participant_fingerprints"]) + state["participant_fingerprints"] = buffer.get_participants() _canvas_states[canvas_id] = state - canvas.apply_guide_update(data) + if canvas != null: + canvas.apply_guide_update(data) if _active: _emit_hud_state( "grid finalized • new grids may overlap its artwork" @@ -2193,13 +2295,90 @@ func _apply_guide_update(data: Dictionary) -> void: func _broadcast_canvas_state(data: Dictionary) -> void: + var network_state: Dictionary = _network_canvas_state( + str(data.get("canvas_id", "")) + ) + if network_state.is_empty(): + return for peer_id: int in _session.get_authenticated_peer_ids(): if peer_id == _session.get_local_peer_id(): continue if _session.peer_supports_capability( peer_id, SurfaceDrawingProtocol.CAPABILITY ): - receive_canvas_state.rpc_id(peer_id, data) + receive_canvas_state.rpc_id(peer_id, network_state) + + +func _network_canvas_state(canvas_id: String) -> Dictionary: + var state: Dictionary = _canvas_states.get(canvas_id, {}) + var buffer: SurfaceDrawingCellBuffer = _canvas_cells.get(canvas_id) + if state.is_empty() or buffer == null: + return {} + var result: Dictionary = state.duplicate(true) + result.merge(buffer.to_compact_fields(), true) + return result + + +func _pump_snapshot_queues() -> void: + if _session == null or not _session.is_host() or _snapshot_queues.is_empty(): + return + var peer_ids: Array[int] = [] + peer_ids.assign(_snapshot_queues.keys()) + peer_ids.sort() + for peer_id: int in peer_ids: + if not _session.is_authenticated_peer(peer_id): + _snapshot_queues.erase(peer_id) + continue + var queue: Array = _snapshot_queues.get(peer_id, []) + var sent_count: int = 0 + var sent_grid_cells: int = 0 + while not queue.is_empty() and sent_count < SNAPSHOT_CANVASES_PER_FRAME: + var canvas_id: String = str(queue.front()) + var state: Dictionary = _canvas_states.get(canvas_id, {}) + if state.is_empty(): + queue.pop_front() + continue + var grid_cells: int = int(state["width"]) * int(state["height"]) + if ( + sent_count > 0 + and sent_grid_cells + grid_cells > SNAPSHOT_GRID_CELLS_PER_FRAME + ): + break + queue.pop_front() + var network_state: Dictionary = _network_canvas_state(canvas_id) + if network_state.is_empty(): + continue + receive_canvas_state.rpc_id(peer_id, network_state) + sent_count += 1 + sent_grid_cells += grid_cells + if queue.is_empty(): + _snapshot_queues.erase(peer_id) + else: + _snapshot_queues[peer_id] = queue + + +func _snapshot_canvas_precedes( + first_id: String, + second_id: String, + peer_id: int, +) -> bool: + var first: Dictionary = _canvas_states.get(first_id, {}) + var second: Dictionary = _canvas_states.get(second_id, {}) + var first_finalized: bool = bool(first.get("finalized", false)) + var second_finalized: bool = bool(second.get("finalized", false)) + if first_finalized != second_finalized: + return not first_finalized + var avatar: Player = _spawn_service.get_avatar(peer_id) + if avatar != null: + var first_distance: float = avatar.global_position.distance_squared_to( + SurfaceDrawingProtocol.array_to_vector(first.get("origin", [])) + ) + var second_distance: float = avatar.global_position.distance_squared_to( + SurfaceDrawingProtocol.array_to_vector(second.get("origin", [])) + ) + if not is_equal_approx(first_distance, second_distance): + return first_distance < second_distance + return int(first.get("layer", 0)) < int(second.get("layer", 0)) func _broadcast_canvas_update(data: Dictionary) -> void: @@ -2285,6 +2464,61 @@ func _state_cell_position(state: Dictionary, x: int, y: int) -> Vector3: ) +func _state_contains_world_point( + state: Dictionary, + world_point: Vector3, + tolerance: float = 0.3, +) -> bool: + var origin: Vector3 = SurfaceDrawingProtocol.array_to_vector(state["origin"]) + var normal: Vector3 = SurfaceDrawingProtocol.array_to_vector( + state["normal"] + ).normalized() + var relative: Vector3 = world_point - origin + if absf(relative.dot(normal)) > tolerance: + return false + var tangent: Vector3 = SurfaceDrawingProtocol.array_to_vector( + state["tangent"] + ).normalized() + var bitangent: Vector3 = normal.cross(tangent).normalized() + var half_width: float = ( + float(state["width"]) * float(state["cell_size"]) * 0.5 + ) + var half_height: float = ( + float(state["height"]) * float(state["cell_size"]) * 0.5 + ) + var horizontal: float = relative.dot(tangent) + var vertical: float = relative.dot(bitangent) + return ( + horizontal >= -half_width + and horizontal < half_width + and vertical >= -half_height + and vertical < half_height + ) + + +func _state_cell_at_world_point( + state: Dictionary, + world_point: Vector3, +) -> Vector2i: + var origin: Vector3 = SurfaceDrawingProtocol.array_to_vector(state["origin"]) + var normal: Vector3 = SurfaceDrawingProtocol.array_to_vector( + state["normal"] + ).normalized() + var tangent: Vector3 = SurfaceDrawingProtocol.array_to_vector( + state["tangent"] + ).normalized() + var bitangent: Vector3 = normal.cross(tangent).normalized() + var relative: Vector3 = world_point - origin + var size: float = float(state["cell_size"]) + var half_width: float = float(state["width"]) * size * 0.5 + var half_height: float = float(state["height"]) * size * 0.5 + var x: int = floori((relative.dot(tangent) + half_width) / size) + var y: int = floori((relative.dot(bitangent) + half_height) / size) + if x < 0 or x >= int(state["width"]) or y < 0 or y >= int(state["height"]): + return Vector2i(-1, -1) + return Vector2i(x, y) + + func _overlaps_existing_canvas( origin: Vector3, normal: Vector3, @@ -2335,10 +2569,27 @@ func _active_canvas_count() -> int: return count -func _allocated_grid_cells() -> int: +func _finalized_canvas_count() -> int: var count: int = 0 for state: Dictionary in _canvas_states.values(): - count += int(state.get("width", 0)) * int(state.get("height", 0)) + if bool(state.get("finalized", false)): + count += 1 + return count + + +func _allocated_active_grid_cells() -> int: + var count: int = 0 + for state: Dictionary in _canvas_states.values(): + if not bool(state.get("finalized", false)): + count += int(state.get("width", 0)) * int(state.get("height", 0)) + return count + + +func _allocated_finalized_grid_cells() -> int: + var count: int = 0 + for state: Dictionary in _canvas_states.values(): + if bool(state.get("finalized", false)): + count += int(state.get("width", 0)) * int(state.get("height", 0)) return count @@ -2678,30 +2929,10 @@ func _new_request_id(prefix: String) -> String: return "%s-%d-%d" % [prefix, Time.get_ticks_msec(), _request_sequence] -func _cells_by_key( - values: Array, - grid_width: int, -) -> Dictionary[int, Dictionary]: - var result: Dictionary[int, Dictionary] = {} - for value: Variant in values: - if typeof(value) != TYPE_DICTIONARY: - continue - var cell: Dictionary = value - var key: int = ( - int(cell.get("y", -1)) * grid_width - + int(cell.get("x", -1)) - ) - result[key] = cell.duplicate(true) - return result - - func _state_cell(state: Dictionary, x: int, y: int) -> Dictionary: - var cells: Dictionary[int, Dictionary] = _cells_by_key( - state.get("cells", []), int(state["width"]) - ) - return Dictionary( - cells.get(_cell_key_for_state(state, x, y), {}) - ).duplicate(true) + var canvas_id: String = str(state.get("canvas_id", "")) + var buffer: SurfaceDrawingCellBuffer = _canvas_cells.get(canvas_id) + return buffer.get_cell_value(x, y) if buffer != null else {} func _register_canvas_participant( @@ -2721,6 +2952,9 @@ func _register_canvas_participant( participants.append(fingerprint) state["participant_fingerprints"] = participants _canvas_states[canvas_id] = state + var buffer: SurfaceDrawingCellBuffer = _canvas_cells.get(canvas_id) + if buffer != null: + buffer.ensure_participants(participants) return true @@ -2740,17 +2974,17 @@ func _merged_participants( func _state_participants(state: Dictionary) -> Array[String]: + var buffer: SurfaceDrawingCellBuffer = _canvas_cells.get( + str(state.get("canvas_id", "")) + ) + if buffer != null: + return buffer.get_participants() var result: Array[String] = [] _append_participant( result, str(state.get("creator_fingerprint", "")) ) for value: Variant in state.get("participant_fingerprints", []): _append_participant(result, str(value)) - for cell_value: Variant in state.get("cells", []): - var cell: Dictionary = cell_value - _append_participant( - result, str(cell.get("author_fingerprint", "")) - ) return result @@ -2804,15 +3038,6 @@ func _mutation_key(canvas_id: String, x: int, y: int) -> String: return "%s:%d:%d" % [canvas_id, x, y] -func _sorted_cells(values: Dictionary[int, Dictionary]) -> Array[Dictionary]: - var keys: Array[int] = values.keys() - keys.sort() - var result: Array[Dictionary] = [] - for key: int in keys: - result.append(values[key].duplicate(true)) - return result - - func _normalized_or(value: Variant, fallback: Vector3) -> Vector3: var vector: Vector3 = value if typeof(value) == TYPE_VECTOR3 else fallback return fallback if vector.is_zero_approx() else vector.normalized() @@ -2850,6 +3075,7 @@ func _on_peer_removed(peer_id: int) -> void: _peer_request_ids.erase(peer_id) _stroke_history_by_peer.erase(peer_id) _peer_art_entitlements.erase(peer_id) + _snapshot_queues.erase(peer_id) func _on_local_art_entitlement_changed() -> void: @@ -2898,6 +3124,7 @@ func _on_session_state_changed(state: NetworkSession.State) -> void: func _clear_session_artwork_state() -> void: _canvas_states.clear() + _canvas_cells.clear() for canvas: SurfaceDrawingCanvas in _canvas_nodes.values(): canvas.queue_free() _canvas_nodes.clear() @@ -2908,6 +3135,7 @@ func _clear_session_artwork_state() -> void: _stroke_history_by_peer.clear() _cell_last_stroke.clear() _last_local_stroke_id = "" + _snapshot_queues.clear() _hide_previews() _emit_artwork_changed() @@ -2932,16 +3160,8 @@ func _apply_artwork_fingerprint_clear(fingerprint: String) -> int: func _remove_canvas_state(canvas_id: String) -> void: _canvas_states.erase(canvas_id) - var canvas: SurfaceDrawingCanvas = _canvas_nodes.get(canvas_id) - if canvas != null: - canvas.queue_free() - _canvas_nodes.erase(canvas_id) - if _selected_canvas_id == canvas_id: - _selected_canvas_id = "" - if _hovered_canvas_id == canvas_id: - _hovered_canvas_id = "" - if _last_hovered_canvas_id == canvas_id: - _last_hovered_canvas_id = "" + _canvas_cells.erase(canvas_id) + _unload_canvas_node(canvas_id) func _emit_artwork_changed() -> void: diff --git a/scripts/run_validations.sh b/scripts/run_validations.sh index 84e862b..8bae718 100755 --- a/scripts/run_validations.sh +++ b/scripts/run_validations.sh @@ -46,6 +46,7 @@ readonly -a QUICK_TESTS=( "tests/player_experience_validation.gd" "tests/shoreline_ambience_validation.gd" "tests/surface_drawing_validation.gd" + "tests/surface_drawing_performance_validation.gd" "tests/surface_drawing_texture_renderer_validation.gd" "tests/tackle_order_validation.gd" "tests/terrain_biome_validation.gd" diff --git a/tests/surface_drawing_performance_validation.gd b/tests/surface_drawing_performance_validation.gd new file mode 100644 index 0000000..26158df --- /dev/null +++ b/tests/surface_drawing_performance_validation.gd @@ -0,0 +1,178 @@ +# SPDX-License-Identifier: GPL-3.0-or-later +extends SceneTree + +const CANVAS_COUNT: int = 10 +const GRID_SIZE: int = 128 +const MAX_SETUP_MSEC: float = 2500.0 +const MAX_STATIC_MEMORY_MIB: float = 32.0 +const FINGERPRINT_A := ( + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" +) +const FINGERPRINT_B := ( + "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" +) + + +func _initialize() -> void: + call_deferred("_run") + + +func _run() -> void: + _validate_finalized_capacity() + _validate_dense_cells_and_author_index() + var drawing_root := Node3D.new() + root.add_child(drawing_root) + var colors := PackedByteArray() + colors.resize(GRID_SIZE * GRID_SIZE) + colors.fill(1) + var authors := PackedInt32Array() + authors.resize(GRID_SIZE * GRID_SIZE) + authors.fill(1) + var memory_before: int = OS.get_static_memory_usage() + var started_usec: int = Time.get_ticks_usec() + for canvas_index: int in CANVAS_COUNT: + var canvas := SurfaceDrawingCanvas.new() + drawing_root.add_child(canvas) + var state: Dictionary = _compact_state( + "canvas-%d" % canvas_index, + canvas_index, + colors, + authors, + ) + assert(SurfaceDrawingProtocol.validate_canvas_state(state)) + assert(canvas.setup(state, null)) + assert(canvas.get_rendered_pixel_count() == GRID_SIZE * GRID_SIZE) + var artwork := canvas.get("_pixel_instance") as MeshInstance3D + var arrays: Array = artwork.mesh.surface_get_arrays(0) + var vertices: PackedVector3Array = arrays[Mesh.ARRAY_VERTEX] + assert( + vertices.size() + <= (SurfaceDrawingCanvas.FINALIZED_MAX_SUBDIVISIONS + 1) ** 2 + ) + var setup_msec: float = ( + float(Time.get_ticks_usec() - started_usec) / 1000.0 + ) + var memory_mib: float = ( + float(OS.get_static_memory_usage() - memory_before) / 1048576.0 + ) + assert( + setup_msec <= MAX_SETUP_MSEC, + "finalized artwork setup took %.2f ms" % setup_msec, + ) + assert( + memory_mib <= MAX_STATIC_MEMORY_MIB, + "finalized artwork retained %.2f MiB" % memory_mib, + ) + print( + "Surface drawing performance validation: PASS (%.2f ms, %.2f MiB)" + % [setup_msec, memory_mib] + ) + drawing_root.queue_free() + await process_frame + quit() + + +func _validate_finalized_capacity() -> void: + var world_scene := load( + "res://world/generation/generated_world_region.tscn" + ) as PackedScene + assert(world_scene != null) + var world_region: Node = world_scene.instantiate() + var generator := world_region.get_node( + "Terrain/TerrainChunkGenerator" + ) as TerrainChunkGenerator + assert(generator != null and generator.catalog != null) + var canvas_extent: float = ( + float(SurfaceDrawingProtocol.MAX_GRID_SIZE) + * SurfaceDrawingProtocol.CELL_SIZE + ) + var required_columns: int = ceili( + float(generator.grid_size.x) * generator.catalog.chunk_size + / canvas_extent + ) + var required_rows: int = ceili( + float(generator.grid_size.y) * generator.catalog.chunk_size + / canvas_extent + ) + var required_canvases: int = required_columns * required_rows + var cells_per_canvas: int = ( + SurfaceDrawingProtocol.MAX_GRID_SIZE + * SurfaceDrawingProtocol.MAX_GRID_SIZE + ) + assert( + SurfaceDrawingProtocol.MAX_FINALIZED_CANVASES >= required_canvases, + "finalized canvas budget cannot tile the generated world", + ) + assert( + SurfaceDrawingProtocol.MAX_FINALIZED_GRID_CELLS + >= required_canvases * cells_per_canvas, + "finalized cell budget cannot tile the generated world", + ) + world_region.free() + + +func _validate_dense_cells_and_author_index() -> void: + var state: Dictionary = { + "session_id": "dense-cell-test", + "canvas_id": "dense-cell-canvas", + "origin": [0.0, 0.0, 0.0], + "normal": [0.0, 1.0, 0.0], + "tangent": [1.0, 0.0, 0.0], + "width": 16, + "height": 16, + "cell_size": SurfaceDrawingProtocol.CELL_SIZE, + "revision": 1, + "guide_visible": false, + "finalized": true, + "layer": 1, + "creator_fingerprint": FINGERPRINT_A, + "participant_fingerprints": [FINGERPRINT_A, FINGERPRINT_B], + "cells": [ + {"x": 1, "y": 2, "color_id": "coral", "author_fingerprint": FINGERPRINT_A}, + {"x": 3, "y": 4, "color_id": "blue", "author_fingerprint": FINGERPRINT_B}, + ], + } + var buffer := SurfaceDrawingCellBuffer.new() + assert(buffer.configure_from_state(state)) + assert(buffer.get_painted_count() == 2) + assert(buffer.get_author_cell_keys(FINGERPRINT_A) == PackedInt32Array([33])) + assert(buffer.get_author_cell_keys(FINGERPRINT_B) == PackedInt32Array([67])) + var compact: Dictionary = state.duplicate(true) + compact.erase("cells") + compact.merge(buffer.to_compact_fields(), true) + assert(SurfaceDrawingProtocol.validate_canvas_state(compact)) + var restored := SurfaceDrawingCellBuffer.new() + assert(restored.configure_from_state(compact)) + assert(restored.to_cells() == buffer.to_cells()) + assert(restored.apply_edits([ + {"x": 1, "y": 2, "color_id": "", "author_fingerprint": ""}, + ])) + assert(restored.get_author_cell_keys(FINGERPRINT_A).is_empty()) + assert(restored.get_painted_count() == 1) + + +func _compact_state( + canvas_id: String, + layer: int, + colors: PackedByteArray, + authors: PackedInt32Array, +) -> Dictionary: + return { + "session_id": "performance-test", + "canvas_id": canvas_id, + "origin": [float(layer) * 12.0, 0.0, 0.0], + "normal": [0.0, 1.0, 0.0], + "tangent": [1.0, 0.0, 0.0], + "width": GRID_SIZE, + "height": GRID_SIZE, + "cell_size": SurfaceDrawingProtocol.CELL_SIZE, + "revision": 1, + "guide_visible": false, + "finalized": true, + "layer": layer, + "creator_fingerprint": FINGERPRINT_A, + "participant_fingerprints": [FINGERPRINT_A], + "cell_encoding": SurfaceDrawingProtocol.CELL_ENCODING, + "cell_colors": colors, + "cell_authors": authors, + } diff --git a/tests/surface_drawing_performance_validation.gd.uid b/tests/surface_drawing_performance_validation.gd.uid new file mode 100644 index 0000000..85392a7 --- /dev/null +++ b/tests/surface_drawing_performance_validation.gd.uid @@ -0,0 +1 @@ +uid://g73q2xuy33nm diff --git a/tests/surface_drawing_texture_renderer_validation.gd b/tests/surface_drawing_texture_renderer_validation.gd index ed99383..e4bf7f7 100644 --- a/tests/surface_drawing_texture_renderer_validation.gd +++ b/tests/surface_drawing_texture_renderer_validation.gd @@ -94,6 +94,16 @@ func _run() -> void: if child is MeshInstance3D: artwork_mesh_count += 1 assert(artwork_mesh_count == 1) + var finalized_instance := canvas.get( + "_pixel_instance" + ) as MeshInstance3D + var finalized_material := finalized_instance.mesh.surface_get_material( + 0 + ) as StandardMaterial3D + assert( + finalized_material.albedo_texture + in persistent_textures + ) assert(canvas.get_export_image().get_size() == Vector2i(32, 32)) world.queue_free() await process_frame diff --git a/tests/surface_drawing_validation.gd b/tests/surface_drawing_validation.gd index 50ec1ba..d57b95a 100644 --- a/tests/surface_drawing_validation.gd +++ b/tests/surface_drawing_validation.gd @@ -44,9 +44,24 @@ func _validate_protocol_bounds() -> void: var grid_height: int = SurfaceDrawingProtocol.GRID_HEIGHT var grid_sizes: Variant = SurfaceDrawingProtocol.GRID_SIZES var cell_size: float = SurfaceDrawingProtocol.CELL_SIZE + assert( + str(SurfaceDrawingProtocol.CAPABILITY) + == NetworkProtocol.SURFACE_DRAWING_CAPABILITY + ) assert(grid_width == 16) assert(grid_height == 16) assert(grid_sizes == [16, 32, 64, 128]) + assert( + SurfaceDrawingProtocol.MAX_CANVASES + == SurfaceDrawingProtocol.MAX_ACTIVE_CANVASES + + SurfaceDrawingProtocol.MAX_FINALIZED_CANVASES + ) + assert( + SurfaceDrawingProtocol.MAX_FINALIZED_GRID_CELLS + >= SurfaceDrawingProtocol.MAX_FINALIZED_CANVASES + * SurfaceDrawingProtocol.MAX_GRID_SIZE + * SurfaceDrawingProtocol.MAX_GRID_SIZE + ) assert(is_equal_approx(cell_size, 0.075)) assert(is_equal_approx( float(grid_width) * cell_size, @@ -242,8 +257,12 @@ func _validate_canvas_geometry_and_collaboration() -> void: assert(not canvas.is_guide_visible()) assert(canvas.is_finalized()) assert(not canvas.has_guide_geometry()) - assert(pixel_instance.mesh == persistent_mesh) - assert(pixel_material.albedo_texture == persistent_texture) + var finalized_instance := canvas.get("_pixel_instance") as MeshInstance3D + var finalized_material := finalized_instance.mesh.surface_get_material( + 0 + ) as StandardMaterial3D + assert(finalized_instance.mesh != persistent_mesh) + assert(finalized_material.albedo_texture == persistent_texture) await process_frame var finished_pixel_scale: float = canvas.get_rendered_pixel_size() assert( @@ -265,8 +284,8 @@ func _validate_canvas_geometry_and_collaboration() -> void: }], } assert(canvas.apply_update(second_update)) - assert(pixel_instance.mesh == persistent_mesh) - assert(pixel_material.albedo_texture == persistent_texture) + assert(finalized_instance == canvas.get("_pixel_instance")) + assert(finalized_material.albedo_texture == persistent_texture) var cells: Array[Dictionary] = canvas.get_authoritative_cells() assert(cells.size() == 1) assert(cells[0]["color_id"] == "blue") From 4196cda1d5336b72e6d525c28aadc58d6eaef176 Mon Sep 17 00:00:00 2001 From: Voyager Date: Tue, 1 Sep 2026 17:29:57 -0400 Subject: [PATCH 28/37] Make decor occupy individual inventory slots --- inventory/player_bag.gd | 58 +++- inventory/player_inventory_layout.gd | 404 +++++++++++++++++++++--- items/catalog/basic_cube.tres | 2 +- items/item_data.gd | 1 - tests/tackle_order_validation.gd | 25 ++ tests/unified_inventory_validation.gd | 35 ++ ui/components/general_inventory_slot.gd | 17 +- ui/player_menu.gd | 29 +- ui/player_storage.gd | 24 +- 9 files changed, 516 insertions(+), 79 deletions(-) diff --git a/inventory/player_bag.gd b/inventory/player_bag.gd index d94845d..89feff4 100644 --- a/inventory/player_bag.gd +++ b/inventory/player_bag.gd @@ -4,6 +4,7 @@ extends Node const ItemCatalogType = preload("res://items/item_catalog.gd") const ItemDataType = preload("res://items/item_data.gd") const OwnedItemType = preload("res://items/owned_item.gd") +const DecorCatalogType = preload("res://homes/decor_catalog.gd") const DEFAULT_UNLOCKED_BAIT_IDS: Array[StringName] = [&"worms"] const MIN_STORAGE_SLOT_COUNT: int = 15 @@ -62,9 +63,35 @@ func add_item(item_id: StringName, quantity: int = 1) -> bool: func add_item_to_storage(item_id: StringName, quantity: int = 1) -> bool: var existing: OwnedItemType = get_owned_item(item_id) + var item: ItemDataType = _resolve_available_item(item_id) + if item != null and DecorCatalogType.has_product(item_id): + if ( + not _can_own_quantity(item, existing, quantity) + or _inventory_layout == null + or not _inventory_layout.can_accept_item_in_storage( + item_id, quantity + ) + ): + return false + for _unit: int in quantity: + if not _inventory_layout.prepare_new_item_in_first_free( + item_id, + PlayerInventoryLayout.InventoryContainer.STORAGE, + ): + _inventory_layout.cancel_prepared_item_placement(item_id) + return false + if existing != null: + existing.quantity += quantity + else: + var owned := OwnedItemType.new() + owned.item_id = item_id + owned.quantity = quantity + owned.storage_slot = _first_available_storage_slot(item, _items) + _items.append(owned) + contents_changed.emit() + return true if existing != null: return add_item(item_id, quantity) - var item: ItemDataType = _resolve_available_item(item_id) if ( item == null or quantity <= 0 @@ -87,6 +114,14 @@ func can_add_item(item_id: StringName, quantity: int = 1) -> bool: if item == null or quantity <= 0: return false var existing: OwnedItemType = get_owned_item(item_id) + if DecorCatalogType.has_product(item_id): + return ( + _can_own_quantity(item, existing, quantity) + and ( + _inventory_layout == null + or _inventory_layout.can_accept_item(item_id, quantity) + ) + ) if existing != null: return ( item.stackable @@ -226,7 +261,7 @@ func replace_all_items(items: Array[OwnedItemType]) -> bool: var item: ItemDataType = _resolve_valid_item(owned.item_id) if item == null: return false - var maximum: int = item.max_stack if item.stackable else 1 + var maximum: int = _maximum_owned_quantity(item) if owned.quantity > maximum: return false seen[owned.item_id] = true @@ -319,3 +354,22 @@ func _resolve_valid_item(item_id: StringName) -> ItemDataType: func _resolve_available_item(item_id: StringName) -> ItemDataType: var item: ItemDataType = _resolve_valid_item(item_id) return item if item != null and item.active else null + + +func _can_own_quantity( + item: ItemDataType, + existing: OwnedItemType, + quantity: int, +) -> bool: + if item == null or quantity <= 0: + return false + var current: int = existing.quantity if existing != null else 0 + return current + quantity <= _maximum_owned_quantity(item) + + +func _maximum_owned_quantity(item: ItemDataType) -> int: + if item == null: + return 0 + if DecorCatalogType.has_product(item.item_id): + return mini(item.max_stack, DecorCatalogType.MAX_OWNED_PER_PRODUCT) + return item.max_stack if item.stackable else 1 diff --git a/inventory/player_inventory_layout.gd b/inventory/player_inventory_layout.gd index bce726e..3f96270 100644 --- a/inventory/player_inventory_layout.gd +++ b/inventory/player_inventory_layout.gd @@ -9,6 +9,7 @@ const PlayerCoolerCapacityType = preload( "res://progression/player_cooler_capacity.gd" ) const PlayerWalletType = preload("res://economy/player_wallet.gd") +const DecorCatalogType = preload("res://homes/decor_catalog.gd") const INVENTORY_COLUMNS: int = 9 const INVENTORY_CAPACITIES: Array[int] = [9, 18, 27, 36] @@ -37,7 +38,7 @@ var _fish_inventory: FishInventoryType var _item_catalog: ItemCatalogType var _storage_capacity: PlayerCoolerCapacityType var _placements: Dictionary[String, Dictionary] = {} -var _prepared_item_placements: Dictionary[String, Dictionary] = {} +var _prepared_item_placements: Dictionary[StringName, Array] = {} var _reconciling: bool = false var _backpack_level: int = 0 @@ -69,14 +70,31 @@ func setup( _reconcile(true) -func can_accept_item(item_id: StringName) -> bool: +func can_accept_item(item_id: StringName, quantity: int = 1) -> bool: if not is_managed_item(item_id): return true - var key := item_key(item_id) + if quantity <= 0: + return false + if _uses_individual_item_slots(item_id): + var available: int = _available_new_item_slots( + item_id, InventoryContainer.INVENTORY + ) + for value: Variant in _prepared_item_placements.get(item_id, []): + if typeof(value) != TYPE_DICTIONARY: + continue + var placement := value as Dictionary + if ( + int(placement.get("container", -1)) + != InventoryContainer.INVENTORY + and _prepared_item_placement_available(placement) + ): + available += 1 + return available >= quantity + var key := _find_entry_key(EntryKind.ITEM, item_id) return ( - _placements.has(key) - or _is_prepared_item_placement_available(key) - or _first_free_slot(InventoryContainer.INVENTORY) >= 0 + not key.is_empty() + or _has_available_prepared_item_placement(item_id) + or _first_available_slot(InventoryContainer.INVENTORY) >= 0 ) @@ -87,30 +105,53 @@ func prepare_new_item_placement( ) -> bool: if not is_managed_item(item_id): return false - var key := item_key(item_id) if ( - _placements.has(key) + (not _uses_individual_item_slots(item_id) + and not _find_entry_key(EntryKind.ITEM, item_id).is_empty()) or not _is_slot_valid(target_container, target_slot) or not _key_at(target_container, target_slot).is_empty() or _prepared_slot_is_occupied(target_container, target_slot) ): return false - _prepared_item_placements[key] = { + var prepared: Array = _prepared_item_placements.get(item_id, []) + prepared.append({ "container": int(target_container), "slot": target_slot, - } + }) + _prepared_item_placements[item_id] = prepared return true func cancel_prepared_item_placement(item_id: StringName) -> void: - _prepared_item_placements.erase(item_key(item_id)) + _prepared_item_placements.erase(item_id) -func can_accept_item_in_storage(item_id: StringName) -> bool: +func prepare_new_item_in_first_free( + item_id: StringName, + target_container: InventoryContainer, +) -> bool: + var slot := _first_available_slot(target_container) + return slot >= 0 and prepare_new_item_placement( + item_id, target_container, slot + ) + + +func can_accept_item_in_storage( + item_id: StringName, + quantity: int = 1, +) -> bool: if not is_managed_item(item_id): return true - var key := item_key(item_id) - return _placements.has(key) or _first_free_slot(InventoryContainer.STORAGE) >= 0 + if quantity <= 0: + return false + if _uses_individual_item_slots(item_id): + return _available_new_item_slots( + item_id, InventoryContainer.STORAGE + ) >= quantity + return ( + not _find_entry_key(EntryKind.ITEM, item_id).is_empty() + or _first_available_slot(InventoryContainer.STORAGE) >= 0 + ) func can_accept_catch(catch_id: StringName = StringName()) -> bool: @@ -128,19 +169,23 @@ func is_managed_item(item_id: StringName) -> bool: func is_item_in_inventory(item_id: StringName) -> bool: - return _is_entry_in_container(item_key(item_id), InventoryContainer.INVENTORY) + return _has_entry_in_container( + EntryKind.ITEM, item_id, InventoryContainer.INVENTORY + ) func is_catch_in_inventory(catch_id: StringName) -> bool: - return _is_entry_in_container(catch_key(catch_id), InventoryContainer.INVENTORY) + return _has_entry_in_container( + EntryKind.CATCH, catch_id, InventoryContainer.INVENTORY + ) func is_item_carried(item_id: StringName) -> bool: - return _is_entry_carried(item_key(item_id)) + return _has_carried_entry(EntryKind.ITEM, item_id) func is_catch_carried(catch_id: StringName) -> bool: - return _is_entry_carried(catch_key(catch_id)) + return _has_carried_entry(EntryKind.CATCH, catch_id) func get_inventory_count() -> int: @@ -223,7 +268,9 @@ func get_entries(container: InventoryContainer) -> Array[Dictionary]: func get_entry(kind: EntryKind, identity: StringName) -> Dictionary: - var key := _entry_key(kind, identity) + var key := _find_entry_key(kind, identity) + if key.is_empty(): + return {} return _placements.get(key, {}).duplicate(true) @@ -252,7 +299,17 @@ func move_entry( target_container: InventoryContainer, target_slot: int, ) -> bool: - var key := _entry_key(kind, identity) + var key := _find_entry_key_for_move( + kind, identity, target_container, target_slot + ) + return move_entry_by_key(key, target_container, target_slot) + + +func move_entry_by_key( + key: String, + target_container: InventoryContainer, + target_slot: int, +) -> bool: if not _placements.has(key) or not _is_slot_valid(target_container, target_slot): return false var source: Dictionary = _placements[key] @@ -285,15 +342,20 @@ func move_entry_to_first_free( return slot >= 0 and move_entry(kind, identity, target_container, slot) +func move_entry_key_to_first_free( + key: String, + target_container: InventoryContainer, +) -> bool: + var slot := _first_free_slot(target_container) + return slot >= 0 and move_entry_by_key(key, target_container, slot) + + func return_hotbar_entry_to_inventory(slot: int) -> bool: var key := _key_at(InventoryContainer.HOTBAR, slot) if key.is_empty(): return true - var placement: Dictionary = _placements[key] - return move_entry_to_first_free( - int(placement.get("kind", -1)) as EntryKind, - StringName(str(placement.get("identity", ""))), - InventoryContainer.INVENTORY, + return move_entry_key_to_first_free( + key, InventoryContainer.INVENTORY ) @@ -302,10 +364,8 @@ func return_all_hotbar_entries_to_inventory() -> bool: if get_inventory_count() + entries.size() > get_inventory_capacity(): return false for entry: Dictionary in entries: - if not move_entry_to_first_free( - int(entry.get("kind", -1)) as EntryKind, - StringName(str(entry.get("identity", ""))), - InventoryContainer.INVENTORY, + if not move_entry_key_to_first_free( + str(entry.get("key", "")), InventoryContainer.INVENTORY ): return false return true @@ -321,6 +381,7 @@ func to_save_data() -> Dictionary: serialized.append({ "kind": int(placement.get("kind", EntryKind.ITEM)), "identity": str(placement.get("identity", "")), + "unit": int(placement.get("unit", -1)), "container": int(placement.get("container", InventoryContainer.INVENTORY)), "slot": int(placement.get("slot", -1)), }) @@ -339,6 +400,7 @@ func restore_from_save_data(data: Dictionary) -> bool: return false _backpack_level = clampi(int(level_value), 0, MAX_BACKPACK_LEVEL) var restored: Dictionary[String, Dictionary] = {} + var restored_item_units: Dictionary[StringName, Dictionary] = {} var values: Variant = data.get("placements", []) if typeof(values) != TYPE_ARRAY: return false @@ -361,12 +423,27 @@ func restore_from_save_data(data: Dictionary) -> bool: or not _is_slot_valid(container as InventoryContainer, slot) ): continue - var key := _entry_key(kind as EntryKind, identity) + var unit: int = -1 + var key: String + if ( + kind == EntryKind.ITEM + and _uses_individual_item_slots(identity) + ): + var used_units: Dictionary = restored_item_units.get(identity, {}) + unit = int(record.get("unit", -1)) + if unit < 0 or used_units.has(unit): + unit = _first_unused_unit(used_units) + used_units[unit] = true + restored_item_units[identity] = used_units + key = item_unit_key(identity, unit) + else: + key = _entry_key(kind as EntryKind, identity) if restored.has(key) or _placement_slot_occupied(restored, container, slot): continue restored[key] = { "kind": kind, "identity": identity, + "unit": unit, "container": container, "slot": slot, } @@ -390,6 +467,10 @@ static func item_key(item_id: StringName) -> String: return "item:%s" % String(item_id) +static func item_unit_key(item_id: StringName, unit: int) -> String: + return "%s:unit:%d" % [item_key(item_id), unit] + + static func catch_key(catch_id: StringName) -> String: return "catch:%s" % String(catch_id) @@ -398,15 +479,27 @@ func _entry_key(kind: EntryKind, identity: StringName) -> String: return item_key(identity) if kind == EntryKind.ITEM else catch_key(identity) -func _is_entry_in_container(key: String, container: InventoryContainer) -> bool: - var placement: Dictionary = _placements.get(key, {}) - return int(placement.get("container", -1)) == int(container) +func _has_entry_in_container( + kind: EntryKind, + identity: StringName, + container: InventoryContainer, +) -> bool: + for key: String in _placements: + var placement: Dictionary = _placements[key] + if ( + int(placement.get("kind", -1)) == int(kind) + and StringName(str(placement.get("identity", ""))) == identity + and int(placement.get("container", -1)) == int(container) + ): + return true + return false -func _is_entry_carried(key: String) -> bool: - var placement: Dictionary = _placements.get(key, {}) - var container: int = int(placement.get("container", -1)) - return container in [InventoryContainer.INVENTORY, InventoryContainer.HOTBAR] +func _has_carried_entry(kind: EntryKind, identity: StringName) -> bool: + return ( + _has_entry_in_container(kind, identity, InventoryContainer.INVENTORY) + or _has_entry_in_container(kind, identity, InventoryContainer.HOTBAR) + ) func _on_contents_changed() -> void: @@ -425,8 +518,17 @@ func _reconcile(force_signal: bool) -> void: for owned in _bag.get_all_items(): if owned == null or not is_managed_item(owned.item_id): continue - var key := item_key(owned.item_id) - expected[key] = {"kind": EntryKind.ITEM, "identity": owned.item_id} + if _uses_individual_item_slots(owned.item_id): + _add_expected_individual_items( + expected, owned.item_id, owned.quantity + ) + else: + var key := item_key(owned.item_id) + expected[key] = { + "kind": EntryKind.ITEM, + "identity": owned.item_id, + "unit": -1, + } for fish_catch in _fish_inventory.get_all_catches(): if fish_catch == null or not fish_catch.is_valid(): continue @@ -442,15 +544,15 @@ func _reconcile(force_signal: bool) -> void: for key: String in expected: if _placements.has(key): continue - var prepared: Dictionary = _prepared_item_placements.get(key, {}) + var identity := StringName(str(expected[key].get("identity", ""))) + var prepared: Dictionary = _take_prepared_item_placement(identity) var target_container := InventoryContainer.INVENTORY var target_slot: int = -1 - if _is_prepared_item_placement_available(key): + if not prepared.is_empty(): target_container = int( prepared["container"] ) as InventoryContainer target_slot = int(prepared["slot"]) - _prepared_item_placements.erase(key) if target_slot < 0: target_slot = _first_free_slot(target_container) if target_slot < 0: @@ -469,6 +571,59 @@ func _reconcile(force_signal: bool) -> void: layout_changed.emit() +func _add_expected_individual_items( + expected: Dictionary[String, Dictionary], + item_id: StringName, + quantity: int, +) -> void: + var existing_keys: Array[String] = _item_entry_keys(item_id) + existing_keys.sort_custom( + func(left: String, right: String) -> bool: + return _placement_preservation_priority(left) < ( + _placement_preservation_priority(right) + ) + ) + var used_units: Dictionary[int, bool] = {} + var retained: int = 0 + for key: String in existing_keys: + if retained >= quantity: + break + var placement: Dictionary = _placements[key] + var unit: int = int(placement.get("unit", -1)) + if unit < 0 or used_units.has(unit): + continue + used_units[unit] = true + expected[key] = { + "kind": EntryKind.ITEM, + "identity": item_id, + "unit": unit, + } + retained += 1 + while retained < quantity: + var unit := _first_unused_unit(used_units) + used_units[unit] = true + var key := item_unit_key(item_id, unit) + expected[key] = { + "kind": EntryKind.ITEM, + "identity": item_id, + "unit": unit, + } + retained += 1 + + +func _placement_preservation_priority(key: String) -> int: + var placement: Dictionary = _placements.get(key, {}) + var container: int = int(placement.get("container", -1)) + match container: + InventoryContainer.HOTBAR: + return 0 + InventoryContainer.INVENTORY: + return 1 + InventoryContainer.STORAGE: + return 2 + return 3 + + func _normalize_existing_placements() -> void: var occupied_inventory: Dictionary[int, bool] = {} var occupied_storage: Dictionary[int, bool] = {} @@ -528,15 +683,55 @@ func _first_free_slot(container: InventoryContainer) -> int: else get_storage_capacity() ) for slot: int in capacity: - if _key_at(container, slot).is_empty(): + if ( + _key_at(container, slot).is_empty() + and not _prepared_slot_is_occupied(container, slot) + ): return slot return -1 -func _is_prepared_item_placement_available(key: String) -> bool: - var placement: Dictionary = _prepared_item_placements.get(key, {}) - if placement.is_empty(): - return false +func _first_available_slot(container: InventoryContainer) -> int: + var capacity := ( + get_inventory_capacity() if container == InventoryContainer.INVENTORY + else HOTBAR_SLOT_COUNT if container == InventoryContainer.HOTBAR + else get_storage_capacity() + ) + for slot: int in capacity: + if ( + _key_at(container, slot).is_empty() + and not _prepared_slot_is_occupied(container, slot) + ): + return slot + return -1 + + +func _has_available_prepared_item_placement(item_id: StringName) -> bool: + for value: Variant in _prepared_item_placements.get(item_id, []): + if typeof(value) != TYPE_DICTIONARY: + continue + if _prepared_item_placement_available(value as Dictionary): + return true + return false + + +func _take_prepared_item_placement(item_id: StringName) -> Dictionary: + var prepared: Array = _prepared_item_placements.get(item_id, []) + while not prepared.is_empty(): + var value: Variant = prepared.pop_front() + if prepared.is_empty(): + _prepared_item_placements.erase(item_id) + else: + _prepared_item_placements[item_id] = prepared + if ( + typeof(value) == TYPE_DICTIONARY + and _prepared_item_placement_available(value as Dictionary) + ): + return (value as Dictionary).duplicate(true) + return {} + + +func _prepared_item_placement_available(placement: Dictionary) -> bool: var container: int = int(placement.get("container", -1)) var slot: int = int(placement.get("slot", -1)) if ( @@ -555,13 +750,120 @@ func _prepared_slot_is_occupied( container: InventoryContainer, slot: int, ) -> bool: - for placement: Dictionary in _prepared_item_placements.values(): + for prepared: Array in _prepared_item_placements.values(): + for value: Variant in prepared: + if typeof(value) != TYPE_DICTIONARY: + continue + var placement := value as Dictionary + if ( + int(placement.get("container", -1)) == int(container) + and int(placement.get("slot", -1)) == slot + ): + return true + return false + + +func _available_new_item_slots( + item_id: StringName, + container: InventoryContainer, +) -> int: + var available: int = 0 + for value: Variant in _prepared_item_placements.get(item_id, []): + if typeof(value) != TYPE_DICTIONARY: + continue + var placement := value as Dictionary if ( int(placement.get("container", -1)) == int(container) - and int(placement.get("slot", -1)) == slot + and _prepared_item_placement_available(placement) ): - return true - return false + available += 1 + var capacity := ( + get_inventory_capacity() if container == InventoryContainer.INVENTORY + else HOTBAR_SLOT_COUNT if container == InventoryContainer.HOTBAR + else get_storage_capacity() + ) + for slot: int in capacity: + if ( + _key_at(container, slot).is_empty() + and not _prepared_slot_is_occupied(container, slot) + ): + available += 1 + return available + + +func _uses_individual_item_slots(item_id: StringName) -> bool: + return DecorCatalogType.has_product(item_id) + + +func _item_entry_keys(item_id: StringName) -> Array[String]: + var result: Array[String] = [] + for key: String in _placements: + var placement: Dictionary = _placements[key] + if ( + int(placement.get("kind", -1)) == EntryKind.ITEM + and StringName(str(placement.get("identity", ""))) == item_id + ): + result.append(key) + return result + + +func _find_entry_key(kind: EntryKind, identity: StringName) -> String: + var preferred_key: String = "" + var preferred_priority: int = 99 + for key: String in _placements: + var placement: Dictionary = _placements[key] + if ( + int(placement.get("kind", -1)) != int(kind) + or StringName(str(placement.get("identity", ""))) != identity + ): + continue + var priority := _placement_preservation_priority(key) + if priority < preferred_priority: + preferred_key = key + preferred_priority = priority + return preferred_key + + +func _find_entry_key_for_move( + kind: EntryKind, + identity: StringName, + target_container: InventoryContainer, + target_slot: int, +) -> String: + var target_key := _key_at(target_container, target_slot) + if not target_key.is_empty(): + var target: Dictionary = _placements[target_key] + if ( + int(target.get("kind", -1)) == int(kind) + and StringName(str(target.get("identity", ""))) == identity + ): + return target_key + var preferred_key: String = "" + var preferred_priority: int = 99 + for key: String in _placements: + var placement: Dictionary = _placements[key] + if ( + int(placement.get("kind", -1)) != int(kind) + or StringName(str(placement.get("identity", ""))) != identity + ): + continue + var container: int = int(placement.get("container", -1)) + var priority: int = ( + 0 if container == InventoryContainer.INVENTORY + else 1 if container == InventoryContainer.STORAGE + else 2 + ) + if priority < preferred_priority: + preferred_key = key + preferred_priority = priority + return preferred_key + + +func _first_unused_unit(used_units: Dictionary) -> int: + var unit: int = 0 + while used_units.has(unit): + unit += 1 + return unit func _key_at(container: InventoryContainer, slot: int) -> String: diff --git a/items/catalog/basic_cube.tres b/items/catalog/basic_cube.tres index 86a2cf9..54dfb15 100644 --- a/items/catalog/basic_cube.tres +++ b/items/catalog/basic_cube.tres @@ -10,7 +10,7 @@ display_name = "basic cube" description = "a simple piece of decor for testing your RV layout." category = 6 icon = ExtResource("2_icon") -stackable = true +stackable = false max_stack = 32 usable = false equippable = true diff --git a/items/item_data.gd b/items/item_data.gd index 72ac0d6..1f126a9 100644 --- a/items/item_data.gd +++ b/items/item_data.gd @@ -36,7 +36,6 @@ func is_valid() -> bool: not item_id.is_empty() and not display_name.strip_edges().is_empty() and max_stack >= 1 - and (stackable or max_stack == 1) ) diff --git a/tests/tackle_order_validation.gd b/tests/tackle_order_validation.gd index 5a38e06..bf93469 100644 --- a/tests/tackle_order_validation.gd +++ b/tests/tackle_order_validation.gd @@ -55,6 +55,31 @@ func _run() -> void: assert(bag.move_item_to_storage_slot(&"worms", shrimp_slot)) assert(bag.get_storage_slot(&"worms") == shrimp_slot) assert(bag.get_storage_slot(&"shrimp") == worms_slot) + + # Exhausting bait removes its owned record while retaining the unlock. A + # later refill therefore receives whichever inventory slot happens to be free + # at that moment. The tackle page must keep catalog order instead of exposing + # that incidental refill order. + for item_id: StringName in EXPECTED_BAIT_ORDER: + if bag.get_quantity(item_id) == 0: + assert(bag.add_item(item_id, 1)) + for item_id: StringName in EXPECTED_BAIT_ORDER: + assert(bag.remove_item(item_id, 1)) + var reverse_refill_order: Array[StringName] = EXPECTED_BAIT_ORDER.duplicate() + reverse_refill_order.reverse() + for item_id: StringName in reverse_refill_order: + assert(bag.add_item(item_id, 1)) + var refilled_items: Array[OwnedItem] = bag.get_unlocked_bait_items() + refilled_items.sort_custom( + func(first: OwnedItem, second: OwnedItem) -> bool: + return bool(player_menu.call( + "_sort_tackle_items", first, second + )) + ) + var refilled_ids: Array[StringName] = [] + for owned: OwnedItem in refilled_items: + refilled_ids.append(owned.item_id) + assert(refilled_ids == EXPECTED_BAIT_ORDER) bag.free() player_menu.free() print("Tackle order validation: PASS") diff --git a/tests/unified_inventory_validation.gd b/tests/unified_inventory_validation.gd index c02f188..5fe3d7d 100644 --- a/tests/unified_inventory_validation.gd +++ b/tests/unified_inventory_validation.gd @@ -41,6 +41,7 @@ func _run() -> void: assert(basic_cube != null) assert(basic_cube.icon != null) assert(basic_cube.hotbar_allowed) + assert(not basic_cube.stackable) assert(bag.add_item(&"basic_cube")) assert(layout.is_item_in_inventory(&"basic_cube")) assert(hotbar.assign_item(0, &"basic_cube")) @@ -73,6 +74,40 @@ func _run() -> void: assert(hotbar.get_selected_item_id() == &"basic_cube") assert(bag.remove_item(&"basic_cube")) + # Decor ownership remains an aggregate count for persistence, but each + # physical piece receives its own movable inventory placement. + assert(bag.add_item(&"basic_cube", 3)) + assert(bag.get_quantity(&"basic_cube") == 3) + assert(layout.get_inventory_count() == 3) + var decor_entries := layout.get_entries( + PlayerInventoryLayout.InventoryContainer.INVENTORY + ) + assert(decor_entries.size() == 3) + var decor_keys: Dictionary[String, bool] = {} + for entry: Dictionary in decor_entries: + assert(StringName(str(entry.get("identity", ""))) == &"basic_cube") + assert(int(entry.get("unit", -1)) >= 0) + decor_keys[str(entry.get("key", ""))] = true + assert(decor_keys.size() == 3) + var moved_decor_key: String = str(decor_entries[1].get("key", "")) + assert(layout.move_entry_key_to_first_free( + moved_decor_key, + PlayerInventoryLayout.InventoryContainer.STORAGE, + )) + assert(layout.get_inventory_count() == 2) + assert(layout.get_storage_count() == 1) + var decor_layout_save := layout.to_save_data() + assert(layout.move_entry_key_to_first_free( + moved_decor_key, + PlayerInventoryLayout.InventoryContainer.INVENTORY, + )) + assert(layout.restore_from_save_data(decor_layout_save)) + assert(layout.get_inventory_count() == 2) + assert(layout.get_storage_count() == 1) + assert(bag.remove_item(&"basic_cube", 3)) + assert(layout.get_inventory_count() == 0) + assert(layout.get_storage_count() == 0) + assert(bag.add_item(&"coffee", 3)) assert(layout.get_inventory_count() == 1) assert(layout.get_inventory_capacity() == 9) diff --git a/ui/components/general_inventory_slot.gd b/ui/components/general_inventory_slot.gd index cf9ccc4..93060f6 100644 --- a/ui/components/general_inventory_slot.gd +++ b/ui/components/general_inventory_slot.gd @@ -21,6 +21,7 @@ var slot_index: int = -1 var container: int = -1 var entry_kind: int = -1 var entry_identity: StringName +var entry_key: String = "" var _locked: bool = false var _layout: PlayerInventoryLayout @@ -107,6 +108,7 @@ func refresh() -> void: call_deferred("_update_context_presence") entry_kind = -1 entry_identity = StringName() + entry_key = "" _context_text = "" _quality_tier = -1 _icon.texture = null @@ -142,6 +144,7 @@ func refresh() -> void: return entry_kind = int(entry.get("kind", -1)) entry_identity = StringName(str(entry.get("identity", ""))) + entry_key = str(entry.get("key", "")) if entry_kind == PlayerInventoryLayout.EntryKind.ITEM: var item: ItemDataType = ( _item_catalog.get_item_by_id(entry_identity) @@ -150,7 +153,11 @@ func refresh() -> void: if item == null: return _icon.texture = item.icon - var quantity := _bag.get_quantity(entry_identity) if _bag != null else 0 + var quantity := ( + 1 + if int(entry.get("unit", -1)) >= 0 + else _bag.get_quantity(entry_identity) if _bag != null else 0 + ) _quantity.text = "×%d" % quantity if quantity > 1 else "" _context_text = _item_context_text(item, quantity) accessibility_name = "%s, slot %d" % [item.display_name, slot_index + 1] @@ -273,6 +280,7 @@ func _get_drag_data(_at_position: Vector2) -> Variant: return { "kind": "bag_item", "item_id": String(entry_identity), + "entry_key": entry_key, } @@ -310,7 +318,12 @@ func _drop_data(_at_position: Vector2, data: Variant) -> void: "", ) )) - moved = _layout.move_entry(kind, identity, container, slot_index) + var source_key: String = str(payload.get("entry_key", "")) + moved = ( + _layout.move_entry_by_key(source_key, container, slot_index) + if not source_key.is_empty() + else _layout.move_entry(kind, identity, container, slot_index) + ) if moved: entry_moved.emit() diff --git a/ui/player_menu.gd b/ui/player_menu.gd index 0545dd4..83875a2 100644 --- a/ui/player_menu.gd +++ b/ui/player_menu.gd @@ -359,6 +359,7 @@ var _selected_inventory_kind: int = -1 var _selected_inventory_identity: StringName var _inventory_move_kind: int = -1 var _inventory_move_identity: StringName +var _inventory_move_key: String = "" var _context_tooltip: PanelContainer var _context_tooltip_label: Label var _context_tooltip_source: Control @@ -3865,6 +3866,7 @@ func _on_general_inventory_slot_activated( return _inventory_move_kind = slot.entry_kind _inventory_move_identity = slot.entry_identity + _inventory_move_key = slot.entry_key _selected_inventory_kind = slot.entry_kind _selected_inventory_identity = slot.entry_identity _selected_bag_item_id = ( @@ -3883,15 +3885,23 @@ func _on_general_inventory_slot_activated( return var move_kind: int = _inventory_move_kind var move_identity: StringName = _inventory_move_identity + var move_key: String = _inventory_move_key _cancel_inventory_move(false) if _inventory_layout == null: return - _inventory_layout.move_entry( - move_kind, - move_identity, - PlayerInventoryLayout.InventoryContainer.INVENTORY, - slot.slot_index, - ) + if not move_key.is_empty(): + _inventory_layout.move_entry_by_key( + move_key, + PlayerInventoryLayout.InventoryContainer.INVENTORY, + slot.slot_index, + ) + else: + _inventory_layout.move_entry( + move_kind, + move_identity, + PlayerInventoryLayout.InventoryContainer.INVENTORY, + slot.slot_index, + ) func _open_general_inventory_notepad( @@ -3944,6 +3954,7 @@ func _cancel_inventory_move(hide_tooltip: bool = true) -> bool: return false _inventory_move_kind = -1 _inventory_move_identity = StringName() + _inventory_move_key = "" if _general_inventory_grid != null: for slot: GeneralInventorySlotType in _general_inventory_grid.get_slots(): slot.set_move_source(false) @@ -4316,12 +4327,6 @@ func _sort_bag_storage_items(a: OwnedItemType, b: OwnedItemType) -> bool: func _sort_tackle_items(a: OwnedItemType, b: OwnedItemType) -> bool: - if a.storage_slot >= 0 and b.storage_slot >= 0: - return a.storage_slot < b.storage_slot - if a.storage_slot >= 0: - return true - if b.storage_slot >= 0: - return false var order_a := FishingShopStockType.get_stock_order_index(a.item_id) var order_b := FishingShopStockType.get_stock_order_index(b.item_id) if order_a >= 0 and order_b >= 0 and order_a != order_b: diff --git a/ui/player_storage.gd b/ui/player_storage.gd index e5369a4..397c74e 100644 --- a/ui/player_storage.gd +++ b/ui/player_storage.gd @@ -59,13 +59,13 @@ func setup( item_catalog, PlayerInventoryLayout.InventoryContainer.STORAGE, ) - _inventory_grid.entry_selected.connect( - _on_entry_selected.bind( + _inventory_grid.slot_activated.connect( + _on_slot_activated.bind( PlayerInventoryLayout.InventoryContainer.STORAGE ) ) - _storage_grid.entry_selected.connect( - _on_entry_selected.bind( + _storage_grid.slot_activated.connect( + _on_slot_activated.bind( PlayerInventoryLayout.InventoryContainer.INVENTORY ) ) @@ -170,20 +170,24 @@ func consume_escape() -> bool: func _unhandled_input(event: InputEvent) -> void: - if not visible or not event.is_action_pressed("ui_cancel"): + if not visible: + return + var close_requested: bool = event.is_action_pressed("ui_cancel") or ( + _home_access and event.is_action_pressed("interact") + ) + if not close_requested or (event is InputEventKey and event.echo): return close_storage() get_viewport().set_input_as_handled() -func _on_entry_selected( - kind: int, - identity: StringName, +func _on_slot_activated( + slot: GeneralInventorySlot, target_container: int, ) -> void: - if kind < 0 or identity.is_empty() or _layout == null: + if slot == null or slot.entry_key.is_empty() or _layout == null: return - if _layout.move_entry_to_first_free(kind, identity, target_container): + if _layout.move_entry_key_to_first_free(slot.entry_key, target_container): _feedback.text = ( "moved to storage" if target_container == PlayerInventoryLayout.InventoryContainer.STORAGE From cd00f3c55eab6d0c21d3fba98a19fea722842d2d Mon Sep 17 00:00:00 2001 From: Voyager Date: Tue, 1 Sep 2026 17:30:04 -0400 Subject: [PATCH 29/37] Restore remote locomotion after fishing returns --- fishing/remote_fishing_presentation.gd | 17 +++++++++++++++ tests/fishing_multiplayer_validation.gd | 12 ++++++++++ tests/fishing_surface_validation.gd | 29 +++++++++++++++++++++++++ 3 files changed, 58 insertions(+) diff --git a/fishing/remote_fishing_presentation.gd b/fishing/remote_fishing_presentation.gd index 380afdf..d813503 100644 --- a/fishing/remote_fishing_presentation.gd +++ b/fishing/remote_fishing_presentation.gd @@ -57,6 +57,10 @@ func show_cast( ): return _kill_cast_tween() + # A previous attempt can finish its fighting presentation immediately before + # a replacement cast is reconstructed. Reset the owning avatar as well as our + # local bookkeeping so fighting cannot continue to outrank the release pose. + _owner.set_fighting_visual(false) _active = true _attempt_id = attempt_id _observer_fighting_active = false @@ -256,6 +260,7 @@ func _on_return_finished() -> void: _showcase_tween.tween_interval(2.5) _showcase_tween.finished.connect(_on_showcase_finished) return + _restore_owner_after_return() return_completed.emit() @@ -271,6 +276,18 @@ func _on_showcase_put_away_finished() -> void: return_completed.emit() +func _restore_owner_after_return() -> void: + # Return completion owns the transition out of the observer-only fishing + # poses. This must happen before completion listeners queue_free this node; + # otherwise an escape or withdrawal leaves RETRACT selected indefinitely and + # masks every later locomotion animation on this observer. + _observer_fighting_active = false + if _owner == null or not is_instance_valid(_owner): + return + _owner.set_fighting_visual(false) + _owner.set_fishing_visual(false) + + func _kill_cast_tween() -> void: if _cast_tween != null and _cast_tween.is_valid(): _cast_tween.kill() diff --git a/tests/fishing_multiplayer_validation.gd b/tests/fishing_multiplayer_validation.gd index 667d87e..f660fc0 100644 --- a/tests/fishing_multiplayer_validation.gd +++ b/tests/fishing_multiplayer_validation.gd @@ -194,6 +194,18 @@ func _run_host() -> void: ): await process_frame assert(remote_avatar.is_retract_visual_complete()) + var observer_cleanup_deadline: int = Time.get_ticks_msec() + 3000 + while ( + Time.get_ticks_msec() < observer_cleanup_deadline + and int(remote_avatar.get("_fishing_visual_phase")) + != Player.FishingVisualPhase.NONE + ): + await process_frame + assert( + int(remote_avatar.get("_fishing_visual_phase")) + == Player.FishingVisualPhase.NONE + ) + assert(remote_animation_player.assigned_animation != &"retract_sit") # Give the client that owns the same presentation a frame boundary to finish # local cleanup before the host intentionally tears down this test session. for _frame: int in 4: diff --git a/tests/fishing_surface_validation.gd b/tests/fishing_surface_validation.gd index 8248c36..eddc66e 100644 --- a/tests/fishing_surface_validation.gd +++ b/tests/fishing_surface_validation.gd @@ -545,6 +545,35 @@ func _validate_remote_presentation() -> void: presentation.synchronize_active("late-attempt", target, false) assert(not bool(player.get("_fighting_visual_active"))) + # An escape or withdrawal has no showcase to clear the retract pose. Return + # completion itself must restore ordinary locomotion before listeners dispose + # of the observer presentation. + presentation.play_return() + await presentation.return_completed + assert( + int(player.get("_fishing_visual_phase")) + == Player.FishingVisualPhase.NONE + ) + assert(not bool(player.get("_fighting_visual_active"))) + player.set_physics_process(false) + player.velocity = Vector3(8.0, 0.0, 0.0) + player.call("_update_character_animation") + var animation_player := player.get_node( + "Visuals/CharacterRig/AnimationPlayer" + ) as AnimationPlayer + assert(animation_player.assigned_animation == &"running") + var running_position: float = animation_player.current_animation_position + await create_timer(0.1).timeout + assert(animation_player.current_animation == &"running") + assert( + not is_equal_approx( + animation_player.current_animation_position, + running_position, + ) + ) + presentation.cleanup() + presentation.synchronize_active("catch-attempt", target, false) + var fish_catch := FishCatchType.new() var fish: FishData = PondPool.candidates.front() fish_catch.fish = fish From 6029eb29b8237881371d11cd6ad70fc9b511222e Mon Sep 17 00:00:00 2001 From: Voyager Date: Tue, 1 Sep 2026 17:30:10 -0400 Subject: [PATCH 30/37] Keep generated stream casts in freshwater --- tests/terrain_chunk_generator_validation.gd | 3 ++- world/generation/chunks/definitions/chunk_0003.tres | 2 +- world/generation/chunks/definitions/chunk_0016.tres | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/terrain_chunk_generator_validation.gd b/tests/terrain_chunk_generator_validation.gd index 0576d81..4bbb5a3 100644 --- a/tests/terrain_chunk_generator_validation.gd +++ b/tests/terrain_chunk_generator_validation.gd @@ -447,6 +447,7 @@ func _validate_catalog() -> void: and stream_variant.water_inlet_edges == stream.water_inlet_edges and stream_variant.water_outlet_edges == stream.water_outlet_edges and stream_variant.water_surface_size == stream.water_surface_size + and stream.water_surface_size.x >= 4.0 and stream.water_surface_offset.x < 0.0 and stream_variant.water_surface_offset.x > 0.0 and is_equal_approx( @@ -455,7 +456,7 @@ func _validate_catalog() -> void: ), ( "Both pond-stream visuals must share one combined selection weight " - + "and mirrored water footprints." + + "and waterline-wide mirrored water footprints." ), ) _check( diff --git a/world/generation/chunks/definitions/chunk_0003.tres b/world/generation/chunks/definitions/chunk_0003.tres index f681406..6575013 100644 --- a/world/generation/chunks/definitions/chunk_0003.tres +++ b/world/generation/chunks/definitions/chunk_0003.tres @@ -16,5 +16,5 @@ allowed_neighbor_tags = PackedStringArray("grass") preferred_neighbor_tags = PackedStringArray("grass") water_inlet_edges = 1 water_outlet_edges = 4 -water_surface_size = Vector2(2.3, 10) +water_surface_size = Vector2(4.2, 10) water_surface_offset = Vector2(-0.315, 0) diff --git a/world/generation/chunks/definitions/chunk_0016.tres b/world/generation/chunks/definitions/chunk_0016.tres index 14474e9..ac8bea7 100644 --- a/world/generation/chunks/definitions/chunk_0016.tres +++ b/world/generation/chunks/definitions/chunk_0016.tres @@ -16,5 +16,5 @@ allowed_neighbor_tags = PackedStringArray("grass") preferred_neighbor_tags = PackedStringArray("grass") water_inlet_edges = 1 water_outlet_edges = 4 -water_surface_size = Vector2(2.3, 10) +water_surface_size = Vector2(4.2, 10) water_surface_offset = Vector2(0.323, 0) From 134ece4a10fdb49d3242a57b1b969e1abb7a5048 Mon Sep 17 00:00:00 2001 From: Voyager Date: Tue, 1 Sep 2026 17:30:18 -0400 Subject: [PATCH 31/37] Reduce fog and suppress weather indoors --- jobs/job_catalog.gd | 20 ++++++++++++++++---- tests/world_weather_validation.gd | 22 ++++++++++++++++++++++ world/rain_ambience.gd | 21 +++++++++++++++++++-- world/shoreline_ambience.gd | 21 +++++++++++++++++++-- world/world_time_visual_controller.gd | 25 +++++++++++++++++++++++++ world/world_weather_service.gd | 6 ++++-- 6 files changed, 105 insertions(+), 10 deletions(-) diff --git a/jobs/job_catalog.gd b/jobs/job_catalog.gd index eb3ea02..b88fcbf 100644 --- a/jobs/job_catalog.gd +++ b/jobs/job_catalog.gd @@ -28,6 +28,10 @@ const WEATHER_SEGMENT_COUNT: int = ( ) const LEGACY_WEATHER_SEGMENT_HOURS: float = 2.0 const LEGACY_WEATHER_SEGMENT_COUNT: int = 12 +const SUNNY_WEATHER_WEIGHT: float = 0.48 +const CLOUDY_WEATHER_WEIGHT: float = 0.29 +const RAINY_WEATHER_WEIGHT: float = 0.19 +const FOGGY_WEATHER_WEIGHT: float = 0.04 const MAX_JOB_REWARD_COINS: int = 100000 const MAX_JOB_REWARD_EXPERIENCE: int = 10000 @@ -159,13 +163,21 @@ static func generate_weather_schedule( rng.seed = plan_id.hash() ^ 0x57454154 var weather_values: Array[int] = [] for index: int in WEATHER_SEGMENT_COUNT: - var roll: float = rng.randf() + var total_weight: float = ( + SUNNY_WEATHER_WEIGHT + + CLOUDY_WEATHER_WEIGHT + + RAINY_WEATHER_WEIGHT + + FOGGY_WEATHER_WEIGHT + ) + var roll: float = rng.randf() * total_weight var weather: int = int(WorldWeatherService.Weather.SUNNY) - if roll >= 0.42 and roll < 0.70: + var cloudy_end: float = SUNNY_WEATHER_WEIGHT + CLOUDY_WEATHER_WEIGHT + var rainy_end: float = cloudy_end + RAINY_WEATHER_WEIGHT + if roll >= SUNNY_WEATHER_WEIGHT and roll < cloudy_end: weather = int(WorldWeatherService.Weather.CLOUDY) - elif roll >= 0.70 and roll < 0.88: + elif roll >= cloudy_end and roll < rainy_end: weather = int(WorldWeatherService.Weather.RAINY) - elif roll >= 0.88: + elif roll >= rainy_end: weather = int(WorldWeatherService.Weather.FOGGY) weather_values.append(weather) for requirement_index: int in required.size(): diff --git a/tests/world_weather_validation.gd b/tests/world_weather_validation.gd index 57be98d..f3c41a3 100644 --- a/tests/world_weather_validation.gd +++ b/tests/world_weather_validation.gd @@ -39,6 +39,16 @@ func _run() -> void: func _validate_weather_scheduler() -> void: + assert(JobCatalog.FOGGY_WEATHER_WEIGHT < JobCatalog.SUNNY_WEATHER_WEIGHT) + assert(JobCatalog.FOGGY_WEATHER_WEIGHT < JobCatalog.CLOUDY_WEATHER_WEIGHT) + assert(JobCatalog.FOGGY_WEATHER_WEIGHT < JobCatalog.RAINY_WEATHER_WEIGHT) + assert(is_equal_approx( + JobCatalog.SUNNY_WEATHER_WEIGHT + + JobCatalog.CLOUDY_WEATHER_WEIGHT + + JobCatalog.RAINY_WEATHER_WEIGHT + + JobCatalog.FOGGY_WEATHER_WEIGHT, + 1.0, + )) var weather := WorldWeatherServiceType.new() root.add_child(weather) weather.begin_authoritative_session(20260802) @@ -526,6 +536,18 @@ func _validate_weather_presentation() -> void: assert(rain.emitting) assert(rain.amount_ratio > 0.99) assert(rain.amount == WorldTimeVisualControllerType.RAIN_PARTICLE_AMOUNT) + visuals.set_local_home_interior_active(true) + assert(not rain.visible) + assert(not rain.emitting) + assert(is_zero_approx(rain.amount_ratio)) + assert(not runtime_environment.fog_enabled) + assert(not storm_clouds.visible) + assert(is_zero_approx(float(storm_clouds.call("get_storm_amount")))) + visuals.set_local_home_interior_active(false) + assert(rain.visible) + assert(rain.emitting) + assert(rain.amount_ratio > 0.99) + assert(storm_clouds.visible) var rain_emitter_offset: Vector3 = ( WorldTimeVisualControllerType.RAIN_EMITTER_OFFSET ) diff --git a/world/rain_ambience.gd b/world/rain_ambience.gd index 0a3a9a1..f308827 100644 --- a/world/rain_ambience.gd +++ b/world/rain_ambience.gd @@ -13,6 +13,7 @@ var _weather_service: WorldWeatherService var _fade_tween: Tween var _is_active: bool = false var _audio_enabled: bool = false +var _suppressed: bool = false func _ready() -> void: @@ -77,6 +78,18 @@ func set_active(active: bool) -> void: ) +func set_suppressed(suppressed: bool) -> void: + if _suppressed == suppressed: + return + _suppressed = suppressed + if suppressed: + _silence_immediately() + return + _transition_to_rain( + _weather_service != null and _weather_service.is_raining() + ) + + func _on_weather_changed( weather: WorldWeatherService.Weather, _seconds_remaining: float, @@ -85,7 +98,7 @@ func _on_weather_changed( func _transition_to_rain(is_raining: bool) -> void: - if not _is_active or not _audio_enabled: + if not _is_active or not _audio_enabled or _suppressed: return _stop_fade() if is_raining: @@ -120,7 +133,11 @@ func _fade_volume_to(target_volume_db: float, stop_after_fade: bool) -> void: func _finish_fade_out() -> void: - if _weather_service != null and _weather_service.is_raining(): + if ( + not _suppressed + and _weather_service != null + and _weather_service.is_raining() + ): return stop() volume_db = SILENT_VOLUME_DB diff --git a/world/shoreline_ambience.gd b/world/shoreline_ambience.gd index b86da69..9bda5f6 100644 --- a/world/shoreline_ambience.gd +++ b/world/shoreline_ambience.gd @@ -18,6 +18,7 @@ var _distance_update_remaining: float = 0.0 var _target_volume_db: float = -80.0 var _is_active := false var _audio_enabled: bool = false +var _suppressed: bool = false func _ready() -> void: @@ -58,8 +59,8 @@ func configure(listener: Node3D, shoreline_mesh: MeshInstance3D) -> void: func set_active(active: bool) -> void: _is_active = active - set_process(active and _audio_enabled) - if active: + set_process(active and _audio_enabled and not _suppressed) + if active and not _suppressed: if not _audio_enabled: return _distance_update_remaining = 0.0 @@ -72,6 +73,22 @@ func set_active(active: bool) -> void: _waves_audio.volume_db = -80.0 +func set_suppressed(suppressed: bool) -> void: + if _suppressed == suppressed: + return + _suppressed = suppressed + set_process(_is_active and _audio_enabled and not suppressed) + if suppressed: + _waves_audio.stop() + _waves_audio.volume_db = -80.0 + elif _is_active and _audio_enabled: + _distance_update_remaining = 0.0 + _update_target_volume() + _waves_audio.volume_db = _target_volume_db + if _waves_audio.stream != null: + _waves_audio.play() + + func _process(delta: float) -> void: if not _is_active: return diff --git a/world/world_time_visual_controller.gd b/world/world_time_visual_controller.gd index 92614c5..bc1e4d2 100644 --- a/world/world_time_visual_controller.gd +++ b/world/world_time_visual_controller.gd @@ -115,6 +115,7 @@ var _weather_to: WorldWeatherService.Weather = ( ) var _weather_transition: float = 1.0 var _light_performance_profile: bool = false +var _local_home_interior_active: bool = false func setup( @@ -185,6 +186,28 @@ func apply_weather_immediately( _apply_time(_time_service.get_time_hours()) +func set_local_home_interior_active(active: bool) -> void: + if _local_home_interior_active == active: + return + _local_home_interior_active = active + if _rain != null: + _rain.visible = not active + _rain.process_mode = ( + Node.PROCESS_MODE_DISABLED if active else Node.PROCESS_MODE_INHERIT + ) + if _rain_collision != null: + _rain_collision.visible = not active + _rain_collision.process_mode = ( + Node.PROCESS_MODE_DISABLED if active else Node.PROCESS_MODE_INHERIT + ) + if _storm_clouds != null: + _storm_clouds.process_mode = ( + Node.PROCESS_MODE_DISABLED if active else Node.PROCESS_MODE_INHERIT + ) + if _time_service != null: + _apply_time(_time_service.get_time_hours()) + + func _prepare_runtime_environment() -> bool: if ( _time_service == null @@ -700,6 +723,8 @@ func _weather_value( rainy: float, foggy: float, ) -> float: + if _local_home_interior_active: + return sunny return lerpf( _weather_state_value(_weather_from, sunny, cloudy, rainy, foggy), _weather_state_value(_weather_to, sunny, cloudy, rainy, foggy), diff --git a/world/world_weather_service.gd b/world/world_weather_service.gd index 9c8d995..74b1f4b 100644 --- a/world/world_weather_service.gd +++ b/world/world_weather_service.gd @@ -27,6 +27,8 @@ const FOGGY_DURATION_RANGE := Vector2( const MAX_PERSISTED_SECONDS: float = WEATHER_PERIOD_SECONDS const DAILY_PLAN_SEGMENT_HOURS: float = 1.0 const DAILY_PLAN_SEGMENT_COUNT: int = 24 +const CLOUDY_TO_SUNNY_THRESHOLD: float = 0.50 +const CLOUDY_TO_RAINY_THRESHOLD: float = 0.95 var _weather: Weather = DEFAULT_WEATHER var _seconds_remaining: float = SUNNY_DURATION_RANGE.x @@ -328,9 +330,9 @@ func _choose_next_weather() -> Weather: return Weather.CLOUDY Weather.CLOUDY: var roll: float = _rng.randf() - if roll < 0.45: + if roll < CLOUDY_TO_SUNNY_THRESHOLD: return Weather.SUNNY - if roll < 0.80: + if roll < CLOUDY_TO_RAINY_THRESHOLD: return Weather.RAINY return Weather.FOGGY return Weather.SUNNY From 76b4f19e4d45988341d1247ebe2f6bc61945a6a7 Mon Sep 17 00:00:00 2001 From: Voyager Date: Tue, 1 Sep 2026 17:30:27 -0400 Subject: [PATCH 32/37] Let shopkeepers roam safely around their shops --- tests/generated_world_runtime_validation.gd | 80 ++ tests/world_layout_validation.gd | 39 + world/fishing_shop_interaction.gd | 845 +++++++++++++++++- world/generation/generated_world_region.gd | 11 +- world/interactables/decor_shop_world.tscn | 4 +- world/interactables/fishing_shop_world.tscn | 4 +- .../interactables/rv_upgrade_shop_world.tscn | 4 +- world/regions/starter_island_region.tscn | 2 +- world/world_character_display.gd | 26 + 9 files changed, 990 insertions(+), 25 deletions(-) diff --git a/tests/generated_world_runtime_validation.gd b/tests/generated_world_runtime_validation.gd index ac2f61a..9df5f1d 100644 --- a/tests/generated_world_runtime_validation.gd +++ b/tests/generated_world_runtime_validation.gd @@ -12,6 +12,9 @@ const GeneratedLakePool: FishPool = preload( const GeneratedRiverPool: FishPool = preload( "res://fish/pools/generated_river_pool.tres" ) +const FishingSurfaceResolverType = preload( + "res://fishing/fishing_surface_resolver.gd" +) const Gatherables: GatherableCatalog = preload( "res://gathering/catalog/gatherable_catalog.tres" ) @@ -415,13 +418,51 @@ func _validate_generated_region( var shop := region.get_node("Interactables/FishingShopWorld") as Node3D var storage := region.get_node("Interactables/PlayerStorageBox") as Node3D + var decor_shop := region.get_node( + "Interactables/DecorShopWorld" + ) as Node3D + var rv_upgrade_shop := region.get_node( + "Interactables/RVUpgradeShopWorld" + ) as Node3D assert(shop != null and shop.has_node("Shopkeeper")) assert(storage != null and storage.has_node("InteractionArea")) + assert(decor_shop != null and decor_shop.has_node("Shopkeeper")) + assert(rv_upgrade_shop != null and rv_upgrade_shop.has_node("Shopkeeper")) + for shop_root: Node3D in [shop, decor_shop, rv_upgrade_shop]: + var interaction := shop_root.get_node( + "InteractionArea" + ) as FishingShopInteraction + var interaction_shape := shop_root.get_node( + "InteractionArea/InteractionShape" + ) as CollisionShape3D + var sphere := interaction_shape.shape as SphereShape3D + assert(sphere != null and is_equal_approx(sphere.radius, 1.5)) + assert(interaction != null) + assert(interaction.roaming_radius >= 2.75) + assert(interaction.minimum_route_distance >= 1.25) + assert(is_equal_approx(interaction.local_interaction_reach, 1.5)) + assert( + is_equal_approx( + interaction.get_authority_interaction_radius(), + interaction.roaming_radius + interaction.local_interaction_reach, + ) + ) var spawn_chunk_center := generator.chunk_position(center) var shop_offset := shop.position - spawn_chunk_center var storage_offset := storage.position - spawn_chunk_center assert(absf(shop_offset.x) < 5.0 and absf(shop_offset.z) < 5.0) assert(absf(storage_offset.x) < 5.0 and absf(storage_offset.z) < 5.0) + for pair: Array in [ + [shop, decor_shop], + [shop, rv_upgrade_shop], + [decor_shop, rv_upgrade_shop], + ]: + var first_shop := pair[0] as Node3D + var second_shop := pair[1] as Node3D + assert( + first_shop.position.distance_to(second_shop.position) + >= GeneratedWorldRegion.SHOPKEEPER_MINIMUM_SEPARATION - 0.001 + ) assert(region.get_fishing_shop() != null) assert(region.get_player_storage() != null) assert(region.get_player_spawn_transform().origin.y > 0.0) @@ -468,6 +509,8 @@ func _validate_generated_region( == 20 + river_placement_count ) var river_body_count := 0 + var surface_resolver := FishingSurfaceResolverType.new() + var space_state := region.get_world_3d().direct_space_state for child: Node in fresh_root.get_children(): var fresh := child as WaterBodyAuthoring assert(fresh != null) @@ -527,7 +570,44 @@ func _validate_generated_region( else: assert(&"pond" in fresh.location_tags) assert(fresh.fish_pool == GeneratedPondPool) + # Generated fresh water shares the ocean's visible plane. Confirm that + # every habitat collider wins at runtime rather than merely checking the + # resource assigned to an otherwise-unused body. + var probe_position := fresh.global_position + if fresh.surface_polygon.size() >= 3: + var probe_indices := Geometry2D.triangulate_polygon( + fresh.surface_polygon, + ) + assert(probe_indices.size() >= 3) + var probe_local := Vector2.ZERO + for probe_offset: int in 3: + probe_local += fresh.surface_polygon[ + probe_indices[probe_offset] + ] + probe_local /= 3.0 + probe_position = fresh.to_global(Vector3( + probe_local.x, + 0.0, + probe_local.y, + )) + var selected_region: FishableWaterRegion = surface_resolver.call( + "_find_highest_water_region", + space_state, + probe_position, + probe_position.y + 100.0, + probe_position.y - 100.0, + ) + assert(selected_region == fresh.get_node("FishingRegion")) + assert(selected_region.fish_pool == fresh.fish_pool) assert(river_body_count == river_placement_count) + var resolved_ocean := surface_resolver.resolve_surface( + space_state, + Vector3(1000.0, GeneratedWorldRegion.WATER_HEIGHT, 1000.0), + GeneratedWorldRegion.WATER_HEIGHT + 2.0, + ) + assert(resolved_ocean.is_fishable()) + assert(resolved_ocean.water_region == ocean.get_node("FishingRegion")) + assert(resolved_ocean.water_region.water_type == WaterType.Type.SALT_WATER) _validate_authored_chunk_surfaces(region, generator) _validate_projected_terrain_materials( diff --git a/tests/world_layout_validation.gd b/tests/world_layout_validation.gd index 6c7f728..f21120c 100644 --- a/tests/world_layout_validation.gd +++ b/tests/world_layout_validation.gd @@ -100,6 +100,7 @@ func _validate_world_switching() -> void: assert(world.get_fishing_shop() != null) assert(world.get_player_storage() != null) assert(not world.get_fishable_water_regions().is_empty()) + _validate_starter_shopkeeper_roaming(world) var starter_safe_points := world.get_safe_respawn_points() assert(not starter_safe_points.is_empty()) var authored_safe_point: SafeRespawnPoint = starter_safe_points.back() @@ -117,6 +118,44 @@ func _validate_world_switching() -> void: await process_frame +func _validate_starter_shopkeeper_roaming(world: TestWorld) -> void: + var starter_region := world.get_node( + "Regions/StarterIslandRegion" + ) as StarterIslandRegion + assert(starter_region != null) + for interaction: FishingShopInteraction in [ + starter_region.get_fishing_shop(), + starter_region.get_decor_shop(), + starter_region.get_rv_upgrade_shop(), + ]: + assert(interaction != null) + # Presentation patrols are inactive on a dedicated/headless world until a + # local player is bound, so they cannot spend physics-query budget there. + assert( + not interaction.is_processing() + and not interaction.is_physics_processing() + ) + var visual := interaction.get_node("../Shopkeeper") as Node3D + var visual_transform := visual.transform + var fixed_area_transform := interaction.global_transform + var route_found := false + for _attempt_cycle: int in 4: + interaction.call("_choose_roaming_destination") + if interaction.is_roaming_walking(): + route_found = true + break + assert(route_found) + assert(not (interaction.get("_roaming_route") as Array).is_empty()) + for _movement_slice: int in 24: + interaction.call("_advance_roaming_walk", 0.05) + if visual.position.distance_to(visual_transform.origin) > 0.01: + break + assert(visual.position.distance_to(visual_transform.origin) > 0.01) + assert(interaction.global_transform.is_equal_approx(fixed_area_transform)) + visual.transform = visual_transform + interaction.call("_schedule_idle") + + func _validate_world_boundary_clearance(world: TestWorld) -> void: var active_region := world.get("_active_region") as WorldRegion assert(active_region != null) diff --git a/world/fishing_shop_interaction.gd b/world/fishing_shop_interaction.gd index 9628ee6..3289bf8 100644 --- a/world/fishing_shop_interaction.gd +++ b/world/fishing_shop_interaction.gd @@ -6,27 +6,82 @@ signal local_player_range_changed(in_range: bool) const DIALOGUE_TEXT: String = ( "Listen, you may suck at fishing but I've got some things that might help." ) +const TERRAIN_COLLISION_MASK: int = 1 +const WATER_COLLISION_MASK: int = 4 | 8 +const SHOPKEEPER_INTERACTION_GROUP: StringName = &"shopkeeper_interactions" +const ROAMING_ORIGIN_META: StringName = &"shopkeeper_roaming_origin" @export_node_path("Node3D") var look_character_path: NodePath = ^"../Shopkeeper" +@export_category("Shopkeeper Roaming") +@export var roaming_enabled: bool = true +@export_range(0.1, 5.0, 0.05, "suffix:m") var roaming_radius: float = 2.8 +@export_range(0.1, 4.0, 0.05, "suffix:m") var minimum_route_distance: float = 1.5 +@export_range(0.1, 5.0, 0.05, "suffix:m") var maximum_route_distance: float = 2.35 +@export_range(0.1, 2.0, 0.05, "suffix:m/s") var roaming_speed: float = 0.55 +@export_range(0.1, 10.0, 0.1, "suffix:s") var minimum_idle_seconds: float = 2.0 +@export_range(0.1, 15.0, 0.1, "suffix:s") var maximum_idle_seconds: float = 5.0 +@export_range(90.0, 1080.0, 15.0, "degrees/s") var turn_speed_degrees: float = 600.0 +@export_category("Shopkeeper Route Safety") +@export_range(0.1, 1.0, 0.05, "suffix:m") var route_sample_spacing: float = 0.45 +@export_range(0.0, 1.0, 0.01) var minimum_ground_up_dot: float = 0.78 +@export_range(0.05, 1.0, 0.05, "suffix:m") var maximum_step_height: float = 0.3 +@export_range(0.1, 2.0, 0.05, "suffix:m") var maximum_route_height_change: float = 0.55 +@export_range(0.1, 2.0, 0.05, "suffix:m") var other_shopkeeper_clearance: float = 1.2 +@export_range(0.1, 2.0, 0.05, "suffix:m") var local_player_clearance: float = 0.85 +@export_category("Shopkeeper Interaction") +@export_range(0.5, 3.0, 0.05, "suffix:m") var local_interaction_reach: float = 1.5 +@export_range(0.5, 5.0, 0.05, "suffix:m") var interaction_height_tolerance: float = 1.25 var _local_player: Player var _local_player_in_range: bool = false var _look_character: WorldCharacterDisplay +var _shopkeeper_root: Node3D +var _roaming_origin: Vector3 +var _roaming_destination: Vector3 +var _roaming_initialized: bool = false +var _roaming_walking: bool = false +var _roaming_route: Array[Vector3] = [] +var _roaming_route_index: int = 0 +var _idle_seconds_remaining: float = 0.0 +var _engaged: bool = false +var _roaming_rng := RandomNumberGenerator.new() +var _roaming_heading := Vector2.ZERO +var _yielding_to_priority_key: String = "" +var _separation_retry_seconds: float = 0.0 func _ready() -> void: _look_character = get_node_or_null( look_character_path ) as WorldCharacterDisplay + # Only the presentation roams. The authoritative interaction Area3D stays at + # its authored location so host/client purchase validation never depends on + # unsynchronised ambient motion. + _shopkeeper_root = _look_character + _roaming_rng.seed = hash(get_path()) + var initial_heading_angle := _roaming_rng.randf_range(0.0, TAU) + _roaming_heading = Vector2( + cos(initial_heading_angle), + sin(initial_heading_angle), + ) + _initialize_roaming_origin() + add_to_group(SHOPKEEPER_INTERACTION_GROUP) body_entered.connect(_on_body_entered) body_exited.connect(_on_body_exited) + set_process(false) + set_physics_process(false) func setup_local_player(player: Player) -> void: _local_player = player if _look_character != null: _look_character.set_head_look_target(player) - _refresh_overlaps() + _initialize_roaming_origin() + _schedule_idle() + # Local eligibility follows the moving presentation even when roaming is + # disabled at runtime, so the authored Area3D is never treated as its proxy. + set_physics_process(true) + _refresh_local_player_proximity() func is_local_player_in_range() -> bool: @@ -34,45 +89,807 @@ func is_local_player_in_range() -> bool: func is_avatar_in_range(avatar: Player) -> bool: + if avatar == null or not is_instance_valid(avatar): + return false + var offset := avatar.global_position - _get_roaming_origin_global() + var vertical_distance := absf(offset.y) + offset.y = 0.0 + # Ambient presentation motion is intentionally local-only. The host cannot + # trust an unsynchronised visual position, so purchase authorization uses a + # conservative envelope around the fixed authored origin. The Area3D itself + # remains fixed and is never enlarged or moved by the patrol. return ( - avatar != null - and is_instance_valid(avatar) - and avatar in get_overlapping_bodies() + offset.length() + <= get_authority_interaction_radius() + and vertical_distance <= interaction_height_tolerance ) +func get_authority_interaction_radius() -> float: + return roaming_radius + local_interaction_reach + + func get_dialogue_text(_home_tier: int = -1) -> String: return DIALOGUE_TEXT func get_prompt_anchor_position() -> Vector3: if _look_character != null: - return _look_character.get_head_anchor_position() + # Keep the world prompt tied to the stable character root. Bone-driven + # anchors bob during walking and make a compact interaction glyph jitter. + return _look_character.global_position + Vector3.UP * 2.05 return global_position + Vector3.UP * 1.25 -func _refresh_overlaps() -> void: - var is_overlapping: bool = ( - _local_player != null - and is_instance_valid(_local_player) - and _local_player in get_overlapping_bodies() +func set_engaged(engaged: bool) -> void: + if _engaged == engaged: + return + _engaged = engaged + _roaming_walking = false + _roaming_route.clear() + _roaming_route_index = 0 + _yielding_to_priority_key = "" + _separation_retry_seconds = 0.0 + if _look_character != null: + _look_character.set_locomotion_walking(false) + _look_character.set_head_look_active( + engaged or _local_player_in_range + ) + if not engaged: + _schedule_idle() + + +func is_engaged() -> bool: + return _engaged + + +func get_shopkeeper_position() -> Vector3: + if _look_character != null and is_instance_valid(_look_character): + return _look_character.global_position + return global_position + + +func _physics_process(delta: float) -> void: + _process(delta) + + +# Kept as a separate update entry point so focused runtime validations can +# advance deterministic slices without waiting on the SceneTree clock. +func _process(delta: float) -> void: + _refresh_local_player_proximity() + if _shopkeeper_root == null or not is_instance_valid(_shopkeeper_root): + return + if _engaged: + _face_local_player(delta) + return + if not roaming_enabled: + _set_roaming_walking(false) + return + if not _roaming_initialized: + _initialize_roaming_origin() + if _separation_retry_seconds > 0.0: + _separation_retry_seconds = maxf( + _separation_retry_seconds - delta, + 0.0, + ) + return + if _separate_from_overlapping_shopkeeper(delta): + return + if _roaming_walking: + _advance_roaming_walk(delta) + return + _idle_seconds_remaining -= delta + if _idle_seconds_remaining <= 0.0: + _choose_roaming_destination() + + +func get_local_player_distance_squared() -> float: + if _local_player == null or not is_instance_valid(_local_player): + return INF + var character_position: Vector3 = global_position + if _look_character != null and is_instance_valid(_look_character): + # Use the character root rather than the animated head/prompt anchor so + # nearest-shop handoffs stay stable while the NPC idles or looks around. + character_position = _look_character.global_position + var offset: Vector3 = _local_player.global_position - character_position + # Shop selection is about which character the player is standing beside. + # A small terrain-height difference must not let a farther NPC win. + offset.y = 0.0 + return offset.length_squared() + + +func _initialize_roaming_origin() -> void: + if _shopkeeper_root == null or not is_instance_valid(_shopkeeper_root): + return + if _roaming_initialized: + return + # The origin is local to the shop root, so it is safe to capture at _ready() + # and survives later generated-world root placement. + # Never recapture after a patrol has started: setup can run again when active + # world bindings refresh, and turning the current waypoint into a new origin + # would let the safety envelope drift indefinitely. + if _shopkeeper_root.has_meta(ROAMING_ORIGIN_META): + _roaming_origin = _shopkeeper_root.get_meta( + ROAMING_ORIGIN_META, + _shopkeeper_root.position, + ) as Vector3 + else: + _roaming_origin = _shopkeeper_root.position + _shopkeeper_root.set_meta(ROAMING_ORIGIN_META, _roaming_origin) + _roaming_destination = _roaming_origin + _roaming_initialized = true + + +func _get_roaming_origin_global() -> Vector3: + if ( + _shopkeeper_root != null + and is_instance_valid(_shopkeeper_root) + and _shopkeeper_root.get_parent_node_3d() != null + ): + var local_origin := ( + _roaming_origin + if _roaming_initialized + else _shopkeeper_root.position + ) + return _shopkeeper_root.get_parent_node_3d().to_global(local_origin) + # Area3D is authored one metre above the character's feet. + return global_position - Vector3.UP + + +func _schedule_idle() -> void: + _set_roaming_walking(false) + _roaming_route.clear() + _roaming_route_index = 0 + _yielding_to_priority_key = "" + _idle_seconds_remaining = _roaming_rng.randf_range( + minf(minimum_idle_seconds, maximum_idle_seconds), + maxf(minimum_idle_seconds, maximum_idle_seconds), + ) + + +func _schedule_route_retry() -> void: + _set_roaming_walking(false) + _roaming_route.clear() + _roaming_route_index = 0 + _idle_seconds_remaining = _roaming_rng.randf_range(0.35, 0.8) + + +func _choose_roaming_destination() -> void: + if _shopkeeper_root == null or not is_instance_valid(_shopkeeper_root): + return + var current := _shopkeeper_root.position + var current_2d := Vector2(current.x, current.z) + var origin_2d := Vector2(_roaming_origin.x, _roaming_origin.z) + var origin_offset := current_2d - origin_2d + var safe_radius := maxf(roaming_radius, 0.1) + var requested_minimum := minf( + minimum_route_distance, + safe_radius * 0.8, + ) + var requested_maximum := maxf( + requested_minimum, + minf(maximum_route_distance, safe_radius * 1.25), + ) + var base_heading := _roaming_heading.normalized() + if base_heading.is_zero_approx(): + var fallback_angle := _roaming_rng.randf_range(0.0, TAU) + base_heading = Vector2(cos(fallback_angle), sin(fallback_angle)) + # This is a correlated random walk: most legs continue in roughly the same + # direction from the NPC's CURRENT position. Only near the safety boundary + # does it gradually steer back inward. The authored origin is a fence, not a + # behavioral target, so the result reads as exploring instead of orbiting. + var boundary_ratio := clampf(origin_offset.length() / safe_radius, 0.0, 1.0) + if boundary_ratio > 0.68 and not origin_offset.is_zero_approx(): + var inward := -origin_offset.normalized() + var inward_weight := remap(boundary_ratio, 0.68, 1.0, 0.15, 0.82) + base_heading = base_heading.lerp(inward, inward_weight).normalized() + # Route selection is intentionally capped: even a completely blocked patch + # cannot turn an ambient idle transition into a large one-frame query spike. + for attempt: int in 4: + var turn_limit := deg_to_rad(38.0 + minf(float(attempt), 8.0) * 6.0) + var candidate_heading := base_heading.rotated( + _roaming_rng.randf_range(-turn_limit, turn_limit) + ).normalized() + var route_distance := _roaming_rng.randf_range( + requested_minimum, + requested_maximum, + ) + var candidate_2d := current_2d + candidate_heading * route_distance + var candidate_from_origin := candidate_2d - origin_2d + if candidate_from_origin.length() > safe_radius: + continue + var candidate := Vector3(candidate_2d.x, current.y, candidate_2d.y) + var safe_destination := _resolve_safe_route_destination(candidate) + if safe_destination.is_empty(): + continue + _roaming_destination = safe_destination["position"] as Vector3 + _roaming_route.clear() + for waypoint: Vector3 in safe_destination.get("waypoints", []): + _roaming_route.append(waypoint) + _roaming_route_index = 0 + _yielding_to_priority_key = "" + var accepted_offset := _roaming_destination - current + _roaming_heading = Vector2( + accepted_offset.x, + accepted_offset.z, + ).normalized() + _set_roaming_walking(true) + return + # Staying put is preferable to walking through a tree, over a cliff, or into + # water. Spread retries across frames so a boxed-in NPC cannot spend hundreds + # of physics queries in one idle transition on a low-end device. + _schedule_route_retry() + + +func _resolve_safe_route_destination(candidate: Vector3) -> Dictionary: + if ( + _shopkeeper_root == null + or not is_instance_valid(_shopkeeper_root) + or not is_inside_tree() + ): + return {} + var parent := _shopkeeper_root.get_parent_node_3d() + if parent == null or get_world_3d() == null: + return {} + var current_world := _shopkeeper_root.global_position + var candidate_world := parent.to_global(candidate) + var horizontal_route := candidate_world - current_world + horizontal_route.y = 0.0 + var route_length := horizontal_route.length() + if route_length < maxf(minimum_route_distance, 0.05): + return {} + if _route_conflicts_with_reserved_corridors(current_world, candidate_world): + return {} + var sample_count := maxi( + 2, + ceili(route_length / maxf(route_sample_spacing, 0.1)), + ) + var first_ground := _probe_walkable_ground(current_world, current_world.y) + if first_ground.is_empty(): + return {} + var first_position := first_ground["position"] as Vector3 + var previous_position := first_position + var waypoints: Array[Vector3] = [] + for sample_index: int in range(1, sample_count + 1): + var progress := float(sample_index) / float(sample_count) + var sample_horizontal := current_world.lerp(candidate_world, progress) + sample_horizontal.y = previous_position.y + var ground := _probe_walkable_ground( + sample_horizontal, + previous_position.y, + ) + if ground.is_empty(): + return {} + var ground_position := ground["position"] as Vector3 + if ( + absf(ground_position.y - previous_position.y) + > maximum_step_height + or absf(ground_position.y - first_position.y) + > maximum_route_height_change + or _segment_has_obstacle(previous_position, ground_position) + or _is_too_close_to_other_shopkeeper(ground_position) + ): + return {} + previous_position = ground_position + waypoints.append(parent.to_local(ground_position)) + return { + "position": parent.to_local(previous_position), + "waypoints": waypoints, + } + + +func _probe_walkable_ground( + world_position: Vector3, + reference_height: float, +) -> Dictionary: + var space_state := get_world_3d().direct_space_state + var ray_start := Vector3( + world_position.x, + reference_height + 1.75, + world_position.z, + ) + var ray_end := Vector3( + world_position.x, + reference_height - 2.5, + world_position.z, + ) + var query := PhysicsRayQueryParameters3D.create( + ray_start, + ray_end, + TERRAIN_COLLISION_MASK, + ) + query.collide_with_areas = false + query.collide_with_bodies = true + var result := space_state.intersect_ray(query) + if result.is_empty(): + return {} + var normal := result.get("normal", Vector3.ZERO) as Vector3 + if normal.dot(Vector3.UP) < minimum_ground_up_dot: + return {} + var ground_position := result.get("position", world_position) as Vector3 + if _is_water_position(ground_position + Vector3.UP * 0.15): + return {} + return { + "position": ground_position, + "normal": normal, + } + + +func _segment_has_obstacle(from_ground: Vector3, to_ground: Vector3) -> bool: + var route := to_ground - from_ground + var horizontal := Vector3(route.x, 0.0, route.z) + if horizontal.length_squared() <= 0.000001: + return false + var side := Vector3.UP.cross(horizontal.normalized()) * 0.22 + var space_state := get_world_3d().direct_space_state + for side_offset: Vector3 in [-side, Vector3.ZERO, side]: + var query := PhysicsRayQueryParameters3D.create( + from_ground + side_offset + Vector3.UP * 0.55, + to_ground + side_offset + Vector3.UP * 0.55, + TERRAIN_COLLISION_MASK, + ) + query.collide_with_areas = false + query.collide_with_bodies = true + if not space_state.intersect_ray(query).is_empty(): + return true + return false + + +func _is_water_position(world_position: Vector3) -> bool: + var query := PhysicsPointQueryParameters3D.new() + query.position = world_position + query.collision_mask = WATER_COLLISION_MASK + query.collide_with_areas = true + query.collide_with_bodies = false + return not get_world_3d().direct_space_state.intersect_point( + query, + 8, + ).is_empty() + + +func _is_too_close_to_other_shopkeeper(world_position: Vector3) -> bool: + if other_shopkeeper_clearance <= 0.0: + return false + var minimum_distance_squared := other_shopkeeper_clearance * other_shopkeeper_clearance + for node: Node in get_tree().get_nodes_in_group( + SHOPKEEPER_INTERACTION_GROUP + ): + var other := node as FishingShopInteraction + if other == null or other == self or not is_instance_valid(other): + continue + var offset := other.get_shopkeeper_position() - world_position + offset.y = 0.0 + if offset.length_squared() < minimum_distance_squared: + return true + return false + + +func _route_conflicts_with_reserved_corridors( + from_world: Vector3, + to_world: Vector3, +) -> bool: + var from_2d := Vector2(from_world.x, from_world.z) + var to_2d := Vector2(to_world.x, to_world.z) + var npc_clearance_squared := ( + other_shopkeeper_clearance * other_shopkeeper_clearance + ) + for node: Node in get_tree().get_nodes_in_group( + SHOPKEEPER_INTERACTION_GROUP + ): + var other := node as FishingShopInteraction + if other == null or other == self or not is_instance_valid(other): + continue + var other_from_world := other.get_shopkeeper_position() + var other_to_world := other.get_roaming_destination_global() + var other_from := Vector2(other_from_world.x, other_from_world.z) + var other_to := Vector2(other_to_world.x, other_to_world.z) + if not other.is_roaming_walking(): + other_to = other_from + if ( + _segment_distance_squared(from_2d, to_2d, other_from, other_to) + < npc_clearance_squared + ): + return true + if _local_player != null and is_instance_valid(_local_player): + var player_position := Vector2( + _local_player.global_position.x, + _local_player.global_position.z, + ) + if ( + _point_segment_distance_squared(player_position, from_2d, to_2d) + < local_player_clearance * local_player_clearance + ): + return true + return false + + +func _segment_distance_squared( + first_start: Vector2, + first_end: Vector2, + second_start: Vector2, + second_end: Vector2, +) -> float: + if Geometry2D.segment_intersects_segment( + first_start, + first_end, + second_start, + second_end, + ) != null: + return 0.0 + return minf( + minf( + _point_segment_distance_squared( + first_start, + second_start, + second_end, + ), + _point_segment_distance_squared( + first_end, + second_start, + second_end, + ), + ), + minf( + _point_segment_distance_squared( + second_start, + first_start, + first_end, + ), + _point_segment_distance_squared( + second_end, + first_start, + first_end, + ), + ), + ) + + +func _point_segment_distance_squared( + point: Vector2, + segment_start: Vector2, + segment_end: Vector2, +) -> float: + var segment := segment_end - segment_start + var segment_length_squared := segment.length_squared() + if segment_length_squared <= 0.000001: + return point.distance_squared_to(segment_start) + var progress := clampf( + (point - segment_start).dot(segment) / segment_length_squared, + 0.0, + 1.0, + ) + return point.distance_squared_to(segment_start + segment * progress) + + +func get_roaming_destination_global() -> Vector3: + if ( + _shopkeeper_root != null + and is_instance_valid(_shopkeeper_root) + and _shopkeeper_root.get_parent_node_3d() != null + ): + return _shopkeeper_root.get_parent_node_3d().to_global( + _roaming_destination + ) + return get_shopkeeper_position() + + +func is_roaming_walking() -> bool: + return _roaming_walking + + +func _advance_roaming_walk(delta: float) -> void: + if _separate_from_overlapping_shopkeeper(delta): + return + if _roaming_route_index >= _roaming_route.size(): + _schedule_route_retry() + return + var route_target := _roaming_route[_roaming_route_index] + var offset := route_target - _shopkeeper_root.position + if offset.length_squared() <= 0.0025: + _shopkeeper_root.position = route_target + _roaming_route_index += 1 + if _roaming_route_index >= _roaming_route.size(): + _shopkeeper_root.position = _roaming_destination + _schedule_idle() + return + var horizontal_offset := offset + horizontal_offset.y = 0.0 + if horizontal_offset.length_squared() <= 0.000001: + _shopkeeper_root.position = _shopkeeper_root.position.move_toward( + route_target, + roaming_speed * delta, + ) + return + if _should_yield_for_live_traffic(route_target, delta): + return + _turn_root_toward( + _shopkeeper_root.get_parent_node_3d().to_global(route_target), + delta, + ) + var local_forward := _shopkeeper_root.basis.z.normalized() + var travel_direction := horizontal_offset.normalized() + var facing_alignment := local_forward.dot(travel_direction) + # Turn in place briefly rather than skating sideways while the body catches + # up to a newly selected patrol leg. + if facing_alignment < cos(deg_to_rad(10.0)): + if _look_character != null: + _look_character.set_locomotion_walking(false) + return + if _look_character != null: + _look_character.set_locomotion_walking(true) + _shopkeeper_root.position = _shopkeeper_root.position.move_toward( + route_target, + roaming_speed * delta, + ) + + +func _separate_from_overlapping_shopkeeper(delta: float) -> bool: + var current_world := get_shopkeeper_position() + var nearest: FishingShopInteraction + var nearest_offset := Vector3.ZERO + var nearest_distance_squared := INF + var clearance_squared := ( + other_shopkeeper_clearance * other_shopkeeper_clearance + ) + for node: Node in get_tree().get_nodes_in_group( + SHOPKEEPER_INTERACTION_GROUP + ): + var other := node as FishingShopInteraction + if other == null or other == self or not is_instance_valid(other): + continue + var offset := current_world - other.get_shopkeeper_position() + offset.y = 0.0 + var distance_squared := offset.length_squared() + if ( + distance_squared < clearance_squared + and distance_squared < nearest_distance_squared + ): + nearest = other + nearest_offset = offset + nearest_distance_squared = distance_squared + if nearest == null: + return false + var away := nearest_offset.normalized() + if away.is_zero_approx(): + # Exact overlaps use opposite deterministic axes, so both characters move + # apart instead of choosing the same random escape direction. + away = ( + Vector3.RIGHT + if _traffic_priority_key() < nearest._traffic_priority_key() + else Vector3.LEFT + ) + var turn_sign := ( + 1.0 + if _traffic_priority_key() < nearest._traffic_priority_key() + else -1.0 + ) + var inward := _get_roaming_origin_global() - current_world + inward.y = 0.0 + var escape_directions: Array[Vector3] = [ + away, + away.rotated(Vector3.UP, turn_sign * PI * 0.25), + away.rotated(Vector3.UP, turn_sign * PI * 0.5), + ] + if not inward.is_zero_approx(): + escape_directions.append(inward.normalized()) + escape_directions.append( + inward.normalized().rotated( + Vector3.UP, + turn_sign * PI * 0.25, + ) + ) + for escape_direction: Vector3 in escape_directions: + if _try_live_separation_step(escape_direction, delta): + _separation_retry_seconds = 0.0 + return true + # If terrain or props block every deterministic escape, avoid repeating the + # same raycast set every physics frame. Another NPC can still move clear while + # this one pauses, then normal route planning resumes after the short cooldown. + _separation_retry_seconds = 0.25 + return true + + +func _try_live_separation_step(world_direction: Vector3, delta: float) -> bool: + var parent := _shopkeeper_root.get_parent_node_3d() + if parent == null: + return false + var direction := world_direction + direction.y = 0.0 + direction = direction.normalized() + if direction.is_zero_approx(): + return false + var current_world := _shopkeeper_root.global_position + var candidate_world := ( + current_world + direction * roaming_speed * maxf(delta, 0.001) + ) + var origin_offset := candidate_world - _get_roaming_origin_global() + origin_offset.y = 0.0 + if origin_offset.length() > roaming_radius: + return false + var ground := _probe_walkable_ground(candidate_world, current_world.y) + if ground.is_empty(): + return false + var ground_position := ground["position"] as Vector3 + if ( + absf(ground_position.y - current_world.y) > maximum_step_height + or _segment_has_obstacle(current_world, ground_position) + ): + return false + _roaming_route.clear() + _roaming_route_index = 0 + _roaming_destination = parent.to_local( + ground_position + direction * other_shopkeeper_clearance + ) + _roaming_walking = true + _yielding_to_priority_key = "" + _turn_root_toward(ground_position + direction, delta) + var local_direction := parent.global_basis.inverse() * direction + local_direction.y = 0.0 + local_direction = local_direction.normalized() + if ( + _shopkeeper_root.basis.z.normalized().dot(local_direction) + < cos(deg_to_rad(12.0)) + ): + if _look_character != null: + _look_character.set_locomotion_walking(false) + return true + if _look_character != null: + _look_character.set_locomotion_walking(true) + _shopkeeper_root.global_position = ground_position + return true + + +func _should_yield_for_live_traffic( + local_target: Vector3, + delta: float, +) -> bool: + var current_world := get_shopkeeper_position() + var target_world := _shopkeeper_root.get_parent_node_3d().to_global( + local_target + ) + var proposed_world := current_world.move_toward( + target_world, + roaming_speed * maxf(delta, 0.001), + ) + var current_2d := Vector2(current_world.x, current_world.z) + var proposed_2d := Vector2(proposed_world.x, proposed_world.z) + var clearance_squared := ( + other_shopkeeper_clearance * other_shopkeeper_clearance + ) + for node: Node in get_tree().get_nodes_in_group( + SHOPKEEPER_INTERACTION_GROUP + ): + var other := node as FishingShopInteraction + if other == null or other == self or not is_instance_valid(other): + continue + if other._yielding_to_priority_key == _traffic_priority_key(): + continue + var other_current_world := other.get_shopkeeper_position() + var other_target_world := other.get_next_roaming_target_global() + var other_current := Vector2( + other_current_world.x, + other_current_world.z, + ) + var other_target := Vector2( + other_target_world.x, + other_target_world.z, + ) + if not other.is_roaming_walking(): + other_target = other_current + if ( + _segment_distance_squared( + current_2d, + proposed_2d, + other_current, + other_target, + ) >= clearance_squared + ): + continue + if ( + other.is_roaming_walking() + and _traffic_priority_key() < other._traffic_priority_key() + ): + continue + _yielding_to_priority_key = other._traffic_priority_key() + _schedule_route_retry() + return true + if _local_player != null and is_instance_valid(_local_player): + var player_2d := Vector2( + _local_player.global_position.x, + _local_player.global_position.z, + ) + if ( + _point_segment_distance_squared( + player_2d, + current_2d, + proposed_2d, + ) < local_player_clearance * local_player_clearance + ): + _yielding_to_priority_key = "" + _schedule_route_retry() + return true + return false + + +func get_next_roaming_target_global() -> Vector3: + if ( + _shopkeeper_root != null + and is_instance_valid(_shopkeeper_root) + and _shopkeeper_root.get_parent_node_3d() != null + and _roaming_route_index < _roaming_route.size() + ): + return _shopkeeper_root.get_parent_node_3d().to_global( + _roaming_route[_roaming_route_index] + ) + return get_roaming_destination_global() + + +func _traffic_priority_key() -> String: + return str(get_path()) + + +func _set_roaming_walking(walking: bool) -> void: + if _roaming_walking == walking: + return + _roaming_walking = walking + if _look_character != null: + # A new patrol leg starts with a short idle turn-in-place. Translation + # switches to walking once the body is within ten degrees of its route. + _look_character.set_locomotion_walking(false) + + +func _face_local_player(delta: float) -> void: + if _local_player == null or not is_instance_valid(_local_player): + return + var target := _local_player.global_position + if _shopkeeper_root != null and is_instance_valid(_shopkeeper_root): + target.y = _shopkeeper_root.global_position.y + _turn_root_toward(target, delta) + + +func _turn_root_toward(world_target: Vector3, delta: float) -> void: + if _shopkeeper_root == null or not is_instance_valid(_shopkeeper_root): + return + var local_target := _shopkeeper_root.get_parent_node_3d().to_local( + world_target + ) + var direction := local_target - _shopkeeper_root.position + direction.y = 0.0 + if direction.length_squared() <= 0.000001: + return + # The imported standalone character faces local +Z (unlike Player's + # additional 180-degree rig wrapper). + var target_yaw := atan2(direction.x, direction.z) + _shopkeeper_root.rotation.y = rotate_toward( + _shopkeeper_root.rotation.y, + target_yaw, + deg_to_rad(turn_speed_degrees) * delta, + ) + + +func _refresh_local_player_proximity() -> void: + if _local_player == null or not is_instance_valid(_local_player): + _set_local_player_in_range(false) + return + var offset := _local_player.global_position - get_shopkeeper_position() + _set_local_player_in_range( + offset.length() <= local_interaction_reach ) - _set_local_player_in_range(is_overlapping) func _on_body_entered(body: Node3D) -> void: if body == _local_player: - _set_local_player_in_range(true) + _refresh_local_player_proximity() func _on_body_exited(body: Node3D) -> void: if body == _local_player: - _set_local_player_in_range(false) + _refresh_local_player_proximity() func _set_local_player_in_range(in_range: bool) -> void: if _look_character != null: - _look_character.set_head_look_active(in_range) + _look_character.set_head_look_active(in_range or _engaged) if _local_player_in_range == in_range: return _local_player_in_range = in_range diff --git a/world/generation/generated_world_region.gd b/world/generation/generated_world_region.gd index e567369..9c59692 100644 --- a/world/generation/generated_world_region.gd +++ b/world/generation/generated_world_region.gd @@ -62,6 +62,7 @@ const WATER_RECOVERY_MAXIMUM_INSET := 1.5 const WATER_RECOVERY_SEARCH_EXPANSIONS: Array[float] = [1.5, 4.0, 12.0] const HOME_GROUND_HEIGHT_TOLERANCE := 0.5 const HOME_ELEVATION_HEIGHT_TOLERANCE := 0.6 +const SHOPKEEPER_MINIMUM_SEPARATION := 3.7 const PROP_SURFACE_SAMPLE_DIRECTIONS: Array[Vector2] = [ Vector2(1.0, 0.0), Vector2(0.70710678, 0.70710678), @@ -706,13 +707,15 @@ func _assign_biomes( func _place_spawn_amenities(center: Vector3) -> void: _player_spawn.position = center + Vector3(0.0, 0.18, 2.2) _safe_spawn.position = _player_spawn.position - _shop_root.position = center + Vector3(2.35, 0.0, -1.35) + # Keep each shopkeeper in a distinct approach lane. Their compact prompt + # areas retain only a narrow seam overlap for a continuous handoff. + _shop_root.position = center + Vector3(3.0, 0.0, -2.0) _shop_root.rotation.y = PI - _storage_root.position = center + Vector3(-2.4, 0.0, 1.2) + _storage_root.position = center + Vector3(-0.5, 0.0, 3.2) _storage_root.rotation.y = PI * 0.5 - _decor_shop_root.position = center + Vector3(-2.4, 0.0, 1.2) + _decor_shop_root.position = center + Vector3(-3.0, 0.0, 1.7) _decor_shop_root.rotation.y = PI * 0.5 - _rv_upgrade_shop_root.position = center + Vector3(-2.35, 0.0, -1.35) + _rv_upgrade_shop_root.position = center + Vector3(-3.0, 0.0, -2.0) _rv_upgrade_shop_root.rotation.y = PI diff --git a/world/interactables/decor_shop_world.tscn b/world/interactables/decor_shop_world.tscn index 7f94ec4..cd51771 100644 --- a/world/interactables/decor_shop_world.tscn +++ b/world/interactables/decor_shop_world.tscn @@ -6,7 +6,7 @@ [sub_resource type="SphereShape3D" id="InteractionShape"] resource_local_to_scene = true -radius = 2.1 +radius = 1.5 [node name="DecorShopWorld" type="Node3D"] @@ -26,7 +26,7 @@ autoplay = "idle" [node name="InteractionArea" type="Area3D" parent="."] unique_name_in_owner = true -position = Vector3(0, 1, -0.3) +position = Vector3(0, 1, 0) collision_layer = 0 collision_mask = 2 script = ExtResource("1_shop") diff --git a/world/interactables/fishing_shop_world.tscn b/world/interactables/fishing_shop_world.tscn index 040b558..4daee51 100644 --- a/world/interactables/fishing_shop_world.tscn +++ b/world/interactables/fishing_shop_world.tscn @@ -6,7 +6,7 @@ [sub_resource type="SphereShape3D" id="InteractionShape"] resource_local_to_scene = true -radius = 2.1 +radius = 1.5 [node name="FishingShopWorld" type="Node3D"] @@ -26,7 +26,7 @@ autoplay = "idle" [node name="InteractionArea" type="Area3D" parent="."] unique_name_in_owner = true -position = Vector3(0, 1, -0.3) +position = Vector3(0, 1, 0) collision_layer = 0 collision_mask = 2 script = ExtResource("1_shop") diff --git a/world/interactables/rv_upgrade_shop_world.tscn b/world/interactables/rv_upgrade_shop_world.tscn index 9fd0ed2..83f9126 100644 --- a/world/interactables/rv_upgrade_shop_world.tscn +++ b/world/interactables/rv_upgrade_shop_world.tscn @@ -6,7 +6,7 @@ [sub_resource type="SphereShape3D" id="InteractionShape"] resource_local_to_scene = true -radius = 2.1 +radius = 1.5 [node name="RVUpgradeShopWorld" type="Node3D"] @@ -26,7 +26,7 @@ autoplay = "idle" [node name="InteractionArea" type="Area3D" parent="."] unique_name_in_owner = true -position = Vector3(0, 1, -0.3) +position = Vector3(0, 1, 0) collision_layer = 0 collision_mask = 2 script = ExtResource("1_shop") diff --git a/world/regions/starter_island_region.tscn b/world/regions/starter_island_region.tscn index 7682491..6f7f10b 100644 --- a/world/regions/starter_island_region.tscn +++ b/world/regions/starter_island_region.tscn @@ -292,7 +292,7 @@ transform = Transform3D(-0.9976046, 0, -0.06917416, 0, 1, 0, 0.06917416, 0, -0.9 position = Vector3(-3.25, 3.42, 11.25) [node name="DecorShopWorld" parent="Interactables" instance=ExtResource("25_decor_shop")] -position = Vector3(-3.25, 3.42, 11.25) +position = Vector3(-3.15, 3.42, 11.25) rotation = Vector3(0, 1.5707964, 0) [node name="RVUpgradeShopWorld" parent="Interactables" instance=ExtResource("26_rv_upgrade")] diff --git a/world/world_character_display.gd b/world/world_character_display.gd index a145f3b..5a5a91c 100644 --- a/world/world_character_display.gd +++ b/world/world_character_display.gd @@ -50,6 +50,8 @@ var _skeleton: Skeleton3D var _look_target: Node3D var _look_target_proxy: Node3D var _head_look_requested: bool = false +var _animation_player: AnimationPlayer +var _locomotion_walking: bool = false func _ready() -> void: @@ -62,7 +64,9 @@ func _ready() -> void: appearance["nose"] = nose_id appearance["mouth"] = mouth_id PlayerVisualPresenterType.apply_appearance(self, appearance) + _animation_player = find_child("AnimationPlayer", true, false) as AnimationPlayer _prepare_head_look() + _apply_locomotion_animation() func _process(delta: float) -> void: @@ -93,6 +97,28 @@ func set_head_look_active(active: bool) -> void: _head_look_requested = active +func set_locomotion_walking(walking: bool) -> void: + if _locomotion_walking == walking: + return + _locomotion_walking = walking + _apply_locomotion_animation() + + +func is_locomotion_walking() -> bool: + return _locomotion_walking + + +func _apply_locomotion_animation() -> void: + if _animation_player == null: + return + var requested: StringName = &"walking" if _locomotion_walking else &"idle" + if ( + _animation_player.has_animation(requested) + and _animation_player.current_animation != requested + ): + _animation_player.play(requested, 0.18) + + func get_head_anchor_position() -> Vector3: if _skeleton == null: return global_position + Vector3.UP * 1.8 From ac82a28f3b93638b67c402590006bd3b968c5d6e Mon Sep 17 00:00:00 2001 From: Voyager Date: Tue, 1 Sep 2026 17:30:34 -0400 Subject: [PATCH 33/37] Harden home exits and interior presentation --- homes/home_decor_controller.gd | 4 ++ homes/home_world_service.gd | 99 +++++++++++++++++++++++++-------- network/network_home_service.gd | 16 ++++-- ui/home_decor_toolbar.gd | 27 +++++++-- 4 files changed, 114 insertions(+), 32 deletions(-) diff --git a/homes/home_decor_controller.gd b/homes/home_decor_controller.gd index f67207f..380bdae 100644 --- a/homes/home_decor_controller.gd +++ b/homes/home_decor_controller.gd @@ -1,6 +1,8 @@ class_name HomeDecorController extends Node +signal exit_requested + const DecorCatalogType = preload("res://homes/decor_catalog.gd") const DRAG_RESPONSE: float = 22.0 const DRAG_POSITION_EPSILON: float = 0.005 @@ -64,6 +66,8 @@ func setup( _toolbar.rotate_requested.connect(_rotate_selected) _toolbar.store_requested.connect(_store_selected) _toolbar.cancel_requested.connect(_clear_selection) + if not _toolbar.exit_requested.is_connected(exit_requested.emit): + _toolbar.exit_requested.connect(exit_requested.emit) _toolbar.set_mode(_mode) _refresh_toolbar() diff --git a/homes/home_world_service.gd b/homes/home_world_service.gd index 6148776..1309339 100644 --- a/homes/home_world_service.gd +++ b/homes/home_world_service.gd @@ -39,6 +39,13 @@ const INTERIOR_SPACING: float = 14.0 const INTERIOR_MAX_SPAWN_SLOTS: int = 64 const TENT_INTERIOR_SIZE := Vector2(4.0, 4.0) const STARTER_RV_INTERIOR_SIZE := Vector2(4.0, 6.0) +const STARTER_RV_EXIT_LOCAL_X: float = 1.45 +const INTERIOR_EXIT_LOCAL_Y: float = 0.35 +const INTERIOR_EXIT_DOORWAY_HALF_WIDTH: float = 0.48 +const INTERIOR_EXIT_TRIGGER_DEPTH: float = 0.45 +const INTERIOR_SHELL_COLLISION_META: StringName = ( + &"home_interior_shell_collision" +) const MIN_EXTERIOR_TRIANGLE_AREA: float = 1.0 const MIN_EXTERIOR_SEPARATION: float = 14.6 const EXTERIOR_FOOTPRINT_HALF_EXTENTS := Vector2(6.65, 3.73) @@ -585,9 +592,14 @@ func is_avatar_near_interior_exit( ) -> bool: if avatar == null: return false - return avatar.global_position.distance_to( - get_interior_exit_position(owner_fingerprint) - ) <= INTERIOR_EXIT_DISTANCE + for exit_position: Vector3 in get_interior_exit_positions( + owner_fingerprint + ): + if avatar.global_position.distance_to(exit_position) <= ( + INTERIOR_EXIT_DISTANCE + ): + return true + return false func has_avatar_crossed_interior_exit_threshold( @@ -597,22 +609,30 @@ func has_avatar_crossed_interior_exit_threshold( if avatar == null: return false var local_position: Vector3 = interior_global_to_local( - owner_fingerprint, - avatar.global_position, + owner_fingerprint, avatar.global_position ) - var threshold_position: Vector3 = interior_global_to_local( - owner_fingerprint, - get_interior_exit_position(owner_fingerprint), - ) - var exit_direction: Vector3 = get_interior_exit_direction( + for exit_position: Vector3 in get_interior_exit_positions( owner_fingerprint - ) - return ( - (local_position - threshold_position).dot(exit_direction) >= 0.0 - and absf(local_position.z - threshold_position.z) <= 0.85 - and local_position.y >= -0.25 - and local_position.y <= 2.25 - ) + ): + var threshold_position: Vector3 = interior_global_to_local( + owner_fingerprint, exit_position + ) + var exit_direction: Vector3 = get_interior_exit_direction_near( + owner_fingerprint, exit_position + ) + var outward_distance: float = ( + (local_position - threshold_position).dot(exit_direction) + ) + if ( + outward_distance >= 0.0 + and outward_distance <= INTERIOR_EXIT_TRIGGER_DEPTH + and absf(local_position.z - threshold_position.z) + <= INTERIOR_EXIT_DOORWAY_HALF_WIDTH + and local_position.y >= -0.25 + and local_position.y <= 2.25 + ): + return true + return false func get_interior_exit_direction(owner_fingerprint: String) -> Vector3: @@ -625,11 +645,41 @@ func get_interior_exit_direction(owner_fingerprint: String) -> Vector3: func get_interior_exit_position(owner_fingerprint: String) -> Vector3: - var tier: int = _home_tier(owner_fingerprint) - return get_interior_anchor(owner_fingerprint) + ( - Vector3(-STARTER_RV_INTERIOR_SIZE.x * 0.5 + 0.6, 0.35, 0.0) - if tier >= PlayerHomeStateType.STARTER_RV_TIER - else Vector3(TENT_INTERIOR_SIZE.x * 0.5 - 0.55, 0.35, 0.0) + return get_interior_exit_positions(owner_fingerprint)[0] + + +func get_interior_exit_positions( + owner_fingerprint: String, +) -> Array[Vector3]: + var anchor: Vector3 = get_interior_anchor(owner_fingerprint) + if _home_tier(owner_fingerprint) >= PlayerHomeStateType.STARTER_RV_TIER: + return [ + anchor + Vector3( + -STARTER_RV_EXIT_LOCAL_X, INTERIOR_EXIT_LOCAL_Y, 0.0 + ), + anchor + Vector3( + STARTER_RV_EXIT_LOCAL_X, INTERIOR_EXIT_LOCAL_Y, 0.0 + ), + ] + return [ + anchor + Vector3( + TENT_INTERIOR_SIZE.x * 0.5 - 0.55, + INTERIOR_EXIT_LOCAL_Y, + 0.0, + ), + ] + + +func get_interior_exit_direction_near( + owner_fingerprint: String, + world_position: Vector3, +) -> Vector3: + if _home_tier(owner_fingerprint) < PlayerHomeStateType.STARTER_RV_TIER: + return Vector3.RIGHT + return ( + Vector3.RIGHT + if world_position.x >= get_interior_anchor(owner_fingerprint).x + else Vector3.LEFT ) @@ -1200,9 +1250,14 @@ func _add_imported_mesh_collision(mesh_instance: MeshInstance3D) -> void: var shape: ConcavePolygonShape3D = mesh_instance.mesh.create_trimesh_shape() if shape == null: return + # Imported room shells are authored to render from both sides, but concave + # collision defaults to front faces only. Interior walls therefore need + # back-face collision or the player can walk through their inward side. + shape.backface_collision = true var body := StaticBody3D.new() body.name = "%sCollision" % mesh_instance.name body.transform = mesh_instance.transform + body.set_meta(INTERIOR_SHELL_COLLISION_META, true) var collision := CollisionShape3D.new() collision.shape = shape body.add_child(collision) diff --git a/network/network_home_service.gd b/network/network_home_service.gd index 4885961..6f78cd6 100644 --- a/network/network_home_service.gd +++ b/network/network_home_service.gd @@ -63,6 +63,8 @@ func setup( _session.peer_authenticated.connect(_on_peer_authenticated) if not _session.peer_removed.is_connected(_on_peer_removed): _session.peer_removed.connect(_on_peer_removed) + if not _spawn_service.avatar_spawned.is_connected(_on_avatar_spawned): + _spawn_service.avatar_spawned.connect(_on_avatar_spawned) if not _local_home.changed.is_connected(_on_local_home_changed): _local_home.changed.connect(_on_local_home_changed) @@ -1126,11 +1128,8 @@ func _process_transition_request(peer_id: int, data: Dictionary) -> void: if ( _session.get_peer_space(peer_id) != NetworkHomeProtocolType.make_space_id(owner_fingerprint) - or not _world_service.is_avatar_near_interior_exit( - avatar, owner_fingerprint - ) ): - _send_transition_rejection(peer_id, "Move closer to the home door.") + _send_transition_rejection(peer_id, "You are not inside that home.") return _apply_host_transition( peer_id, @@ -1276,6 +1275,15 @@ func _refresh_peer_visibility() -> void: ) +func _on_avatar_spawned(peer_id: int, _avatar: Player) -> void: + var local_peer_id: int = _session.get_local_peer_id() + if local_peer_id <= 0 or peer_id == local_peer_id: + return + _spawn_service.set_peer_presentation_visible( + peer_id, _session.peers_share_space(local_peer_id, peer_id) + ) + + func _on_local_home_changed() -> void: if _suppress_local_submission or _publish_queued: return diff --git a/ui/home_decor_toolbar.gd b/ui/home_decor_toolbar.gd index 50ae444..0214c86 100644 --- a/ui/home_decor_toolbar.gd +++ b/ui/home_decor_toolbar.gd @@ -5,26 +5,34 @@ signal placement_mode_requested(mode: int) signal rotate_requested signal store_requested signal cancel_requested +signal exit_requested var _mode_button: Button var _selection_label: Label var _rotate_button: Button var _store_button: Button var _clear_button: Button +var _exit_button: Button var _mode: PlayerHomeState.PlacementMode = PlayerHomeState.PlacementMode.GRID var _interactive: bool = true var _selection_active: bool = false +var _active: bool = false +var _menu_obscured: bool = false func _ready() -> void: _build_ui() - hide() + _refresh_visibility() func set_active(active: bool) -> void: - if visible == active: - return - visible = active + _active = active + _refresh_visibility() + + +func set_menu_obscured(obscured: bool) -> void: + _menu_obscured = obscured + _refresh_visibility() func set_interactive(interactive: bool) -> void: @@ -59,13 +67,17 @@ func report_status(message: String) -> void: _selection_label.text = message +func _refresh_visibility() -> void: + visible = _active and not _menu_obscured + + func _build_ui() -> void: set_anchors_preset(Control.PRESET_TOP_RIGHT) - offset_left = -500.0 + offset_left = -610.0 offset_top = 0.0 offset_right = 0.0 offset_bottom = 106.0 - custom_minimum_size = Vector2(500.0, 0.0) + custom_minimum_size = Vector2(610.0, 0.0) z_index = 85 mouse_filter = Control.MOUSE_FILTER_STOP var panel_style: StyleBoxFlat = UtilityPageStyle.panel_style() @@ -102,6 +114,9 @@ func _build_ui() -> void: _store_button.pressed.connect(store_requested.emit) _clear_button = _add_tool_button(row, "clear", "clear selection", 82.0) _clear_button.pressed.connect(cancel_requested.emit) + _exit_button = _add_tool_button(row, "Exit RV", "exit the RV", 100.0) + _exit_button.name = "ExitRVButton" + _exit_button.pressed.connect(exit_requested.emit) _selection_label = Label.new() _selection_label.text = "use held decor to place; click or drag to edit" _selection_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART From 4fda6e97f65d4277573e9aeccbff6f628234f5b6 Mon Sep 17 00:00:00 2001 From: Voyager Date: Tue, 1 Sep 2026 17:30:50 -0400 Subject: [PATCH 34/37] Integrate per-save identity and interaction UI --- gathering/catalog/crab_blue.tres | 3 +- gathering/catalog/crab_brown.tres | 3 +- gathering/catalog/crab_dungeness.tres | 3 +- gathering/catalog/crab_ghost.tres | 3 +- gathering/gatherable_data.gd | 2 + gathering/world_gatherable.gd | 9 +- main/main.gd | 648 +++++++++++------- main/main.tscn | 30 - network/discovery_client.gd | 10 +- network/network_chat_protocol.gd | 44 +- network/network_chat_service.gd | 15 +- network/network_mail_service.gd | 5 +- network/network_player_list_service.gd | 10 +- network/network_profile_preferences.gd | 171 ++++- network/network_profile_protocol.gd | 3 + network/network_profile_service.gd | 77 ++- network/network_protocol.gd | 12 +- network/network_session.gd | 41 +- network/peer_registry.gd | 12 + network/player_data_root.gd | 50 ++ player/player.gd | 236 ++++++- progression/player_appearance_store.gd | 33 + save/player_save_manager.gd | 187 ++++- save/player_save_slot_catalog.gd | 64 ++ scripts/run_validations.sh | 3 + tests/art_tools_validation.gd | 138 +++- tests/chat_privacy_multiplayer_validation.gd | 108 ++- ...ontroller_menu_accessibility_validation.gd | 69 ++ ...controller_world_interaction_validation.gd | 398 ++++++++++- tests/economy_regression_validation.gd | 5 +- tests/fish_hotbar_showcase_validation.gd | 2 +- tests/fish_quality_validation.gd | 2 +- tests/home_spawn_multiplayer_validation.gd | 106 +++ tests/light_performance_profile_validation.gd | 37 +- tests/logbook_runtime_validation.gd | 3 +- tests/movement_multiplayer_validation.gd | 47 +- tests/network_chat_protocol_validation.gd | 23 + tests/profile_multiplayer_validation.gd | 25 +- tests/profile_title_validation.gd | 151 ++++ tests/profile_title_validation.gd.uid | 1 + tests/progression_archive_validation.gd | 60 ++ tests/save_reload_conflict_validation.gd | 166 +++++ tests/save_reload_conflict_validation.gd.uid | 1 + .../session_switch_multiplayer_validation.gd | 26 + tests/tooltip_escape_validation.gd | 43 ++ tests/tooltip_escape_validation.gd.uid | 1 + tests/ui_scaling_runtime_validation.gd | 72 ++ tests/world_spawn_protocol_validation.gd | 32 +- ui/chat_ui.gd | 324 ++++++++- ui/game_ui.gd | 163 +++-- ui/game_ui.tscn | 14 +- ui/network/join_game_page.gd | 9 +- ui/players_page.gd | 14 +- ui/profile_page.gd | 130 +++- ui/save_slots_page.gd | 42 +- ui/save_slots_page.tscn | 12 +- ui/title_screen.gd | 3 + ui/typewriter_reveal.gd | 31 + 58 files changed, 3471 insertions(+), 461 deletions(-) create mode 100644 tests/profile_title_validation.gd create mode 100644 tests/profile_title_validation.gd.uid create mode 100644 tests/save_reload_conflict_validation.gd create mode 100644 tests/save_reload_conflict_validation.gd.uid create mode 100644 tests/tooltip_escape_validation.gd create mode 100644 tests/tooltip_escape_validation.gd.uid diff --git a/gathering/catalog/crab_blue.tres b/gathering/catalog/crab_blue.tres index 705948e..8e19b2b 100644 --- a/gathering/catalog/crab_blue.tres +++ b/gathering/catalog/crab_blue.tres @@ -14,4 +14,5 @@ surface_water_relation = 2 population = 4 surface_population_per_100_square_meters = 0.4 maximum_surface_population = 16 -sprite_pixel_size = 0.0005 +sprite_pixel_size = 0.01 +sprite_surface_offset = 0.11 diff --git a/gathering/catalog/crab_brown.tres b/gathering/catalog/crab_brown.tres index b27bb7e..042e3d2 100644 --- a/gathering/catalog/crab_brown.tres +++ b/gathering/catalog/crab_brown.tres @@ -20,7 +20,8 @@ scare_radius = 2.8 capture_radius = 0.7 interaction_range = 2.6 charge_duration = 2.0 -sprite_pixel_size = 0.0005 +sprite_pixel_size = 0.01 +sprite_surface_offset = 0.11 sprite_tilt_degrees = -45.0 capture_respawn_min_seconds = 480.0 capture_respawn_max_seconds = 720.0 diff --git a/gathering/catalog/crab_dungeness.tres b/gathering/catalog/crab_dungeness.tres index 12eb7a6..cee4c45 100644 --- a/gathering/catalog/crab_dungeness.tres +++ b/gathering/catalog/crab_dungeness.tres @@ -11,4 +11,5 @@ required_tool_id = &"crab_net" surface_materials = Array[StringName]([&"sand"]) minimum_surface_y = -0.5 population = 4 -sprite_pixel_size = 0.0005 +sprite_pixel_size = 0.01 +sprite_surface_offset = 0.11 diff --git a/gathering/catalog/crab_ghost.tres b/gathering/catalog/crab_ghost.tres index 62ce103..13241da 100644 --- a/gathering/catalog/crab_ghost.tres +++ b/gathering/catalog/crab_ghost.tres @@ -11,4 +11,5 @@ required_tool_id = &"crab_net" surface_materials = Array[StringName]([&"sand"]) minimum_surface_y = 0.08 population = 4 -sprite_pixel_size = 0.0005 +sprite_pixel_size = 0.01 +sprite_surface_offset = 0.11 diff --git a/gathering/gatherable_data.gd b/gathering/gatherable_data.gd index 41de7fe..608c2be 100644 --- a/gathering/gatherable_data.gd +++ b/gathering/gatherable_data.gd @@ -61,6 +61,7 @@ var surface_population_per_100_square_meters := 0.0 @export_range(0.1, 10.0, 0.05) var interaction_range: float = 2.6 @export_range(0.1, 10.0, 0.05) var charge_duration: float = 2.0 @export_range(0.0001, 0.01, 0.00005) var sprite_pixel_size: float = 0.001 +@export_range(-2.0, 2.0, 0.01) var sprite_surface_offset: float = 0.11 @export_range(-90.0, 90.0, 1.0) var sprite_tilt_degrees: float = -45.0 @export_category("Respawn Budget") @export_range(0.0, 3600.0, 1.0) var capture_respawn_min_seconds: float = 480.0 @@ -117,6 +118,7 @@ func is_valid() -> bool: and interaction_range > 0.0 and charge_duration > 0.0 and sprite_pixel_size > 0.0 + and is_finite(sprite_surface_offset) and capture_respawn_max_seconds >= capture_respawn_min_seconds and scare_respawn_max_seconds >= scare_respawn_min_seconds ) diff --git a/gathering/world_gatherable.gd b/gathering/world_gatherable.gd index a30ffc7..3a2219d 100644 --- a/gathering/world_gatherable.gd +++ b/gathering/world_gatherable.gd @@ -2,8 +2,6 @@ class_name WorldGatherable extends Node3D const GatherableDataType = preload("res://gathering/gatherable_data.gd") -const REFERENCE_SPRITE_PIXEL_SIZE: float = 0.001 -const REFERENCE_SPRITE_HEIGHT: float = 0.22 const WATER_SPURT_INTERVAL_SECONDS: float = 1.15 const WATER_SPURT_COLOR := Color(0.48, 0.82, 0.84, 1.0) const WATER_SPURT_HOLE_COLOR := Color(0.23, 0.27, 0.24, 1.0) @@ -47,11 +45,7 @@ func configure( _sprite.position.y = ( 0.0 if not data.spawn_anchor_set_id.is_empty() - else ( - REFERENCE_SPRITE_HEIGHT - * data.sprite_pixel_size - / REFERENCE_SPRITE_PIXEL_SIZE - ) + else data.sprite_surface_offset ) _sprite.rotation_degrees.x = data.sprite_tilt_degrees @@ -118,7 +112,6 @@ func _ensure_visual() -> void: return _sprite = Sprite3D.new() _sprite.name = "GatherableSprite" - _sprite.position.y = REFERENCE_SPRITE_HEIGHT _sprite.shaded = false _sprite.double_sided = true _sprite.billboard = BaseMaterial3D.BILLBOARD_ENABLED diff --git a/main/main.gd b/main/main.gd index ab013d7..a42e8c1 100644 --- a/main/main.gd +++ b/main/main.gd @@ -146,9 +146,6 @@ const TITLE_MUSIC_PATH: String = ( const NEW_GAME_MUSIC_PATH: String = "res://audio/music/world/tulips.wav" const DUSK_MUSIC_PATH: String = "res://audio/music/world/craft.mp3" const TIME_CROSSING_EPSILON_HOURS: float = 0.000001 -const PLAYER_MENU_PATTERN_SCALE: float = 0.85 -const PLAYER_MENU_PATTERN_SCROLL_VELOCITY := Vector2(-7.0, -5.0) -const SHOP_PATTERN_SCALE: float = 1.75 const DEDICATED_IDLE_PHYSICS_TICKS_PER_SECOND: int = 10 const DEDICATED_ACTIVE_PHYSICS_TICKS_PER_SECOND: int = 30 const HOME_ENTRY_INPUT_OWNER: StringName = &"home_entry_transition" @@ -158,6 +155,8 @@ const HOME_ENTRY_WALK_DISTANCE: float = 1.05 const HOME_ENTRY_WALK_DURATION: float = 0.55 const HOME_EXIT_WALK_DISTANCE: float = 1.25 const HOME_EXIT_WALK_DURATION: float = 0.62 +const SHOP_NPC_HANDOFF_HYSTERESIS_METERS: float = 0.1 +const SHOP_NPC_CONVERSATION_INPUT_OWNER: StringName = &"shop_npc_conversation" @export var fish_catalog: FishPoolType @export var pelican_buyer_profile: FishBuyerProfileType @@ -263,14 +262,16 @@ const HOME_EXIT_WALK_DURATION: float = 0.62 @onready var _world_gatherables_root: Node3D = $WorldGatherables @onready var _home_world: HomeWorldServiceType = %HomeWorldService @onready var _title_background: ColorRect = %TitleBackground -@onready var _player_menu_backdrop: ColorRect = %PlayerMenuBackdrop -@onready var _shop_backdrop: ColorRect = %ShopBackdrop var _gameplay_started: bool = false var _save_slots := PlayerSaveSlotCatalogType.new() var _shop_interaction: FishingShopInteractionType var _decor_shop_interaction: DecorShopInteractionType var _rv_upgrade_shop_interaction: RVUpgradeInteractionType +var _active_shop_npc_interaction: FishingShopInteractionType +var _engaged_shop_npc_interaction: FishingShopInteractionType +var _shop_conversation_shop_opened: bool = false +var _shop_conversation_camera_restoring: bool = false var _storage_interaction: PlayerStorageInteractionType var _title_music_tween: Tween var _title_music_transition_generation: int = 0 @@ -279,8 +280,6 @@ var _dusk_music_played_for_natural_day: bool = false var _quit_in_progress: bool = false var _join_requested_from_title: bool = false var _join_requested_from_pause: bool = false -var _player_menu_backdrop_tween: Tween -var _shop_backdrop_tween: Tween var _pending_join_endpoint: String = "" var _social_prompt_queue: Array[Dictionary] = [] var _active_social_prompt: Dictionary = {} @@ -307,6 +306,7 @@ var _home_exit_start_position: Vector3 = Vector3.ZERO var _home_exit_walk_tween: Tween var _home_entry_transition_active: bool = false var _home_entry_walk_tween: Tween +var _observed_cancel_input_frame: int = -1 @onready var _shoreline_ambience: ShorelineAmbience = %ShorelineAmbience var _rain_ambience: RainAmbienceType @@ -341,8 +341,6 @@ func _ready() -> void: _player, _test_world.get_saltwater_shoreline_mesh(), ) - get_window().size_changed.connect(_resize_native_overlays) - _resize_native_overlays() if not _settings_manager.settings_changed.is_connected( _apply_runtime_settings ): @@ -370,44 +368,6 @@ func _configure_presentation_performance_profile(light_profile: bool) -> void: "animation_enabled", not light_profile, ) - var menu_pattern_material := ( - _player_menu_backdrop.material as ShaderMaterial - ) - if menu_pattern_material != null: - menu_pattern_material.set_shader_parameter( - "animation_enabled", - not light_profile, - ) - menu_pattern_material.set_shader_parameter( - "display_scale", - PLAYER_MENU_PATTERN_SCALE, - ) - menu_pattern_material.set_shader_parameter( - "scroll_velocity_pixels", - ( - Vector2.ZERO - if light_profile - else PLAYER_MENU_PATTERN_SCROLL_VELOCITY - ), - ) - var shop_pattern_material := _shop_backdrop.material as ShaderMaterial - if shop_pattern_material != null: - shop_pattern_material.set_shader_parameter( - "animation_enabled", - not light_profile, - ) - shop_pattern_material.set_shader_parameter( - "display_scale", - SHOP_PATTERN_SCALE, - ) - shop_pattern_material.set_shader_parameter( - "scroll_velocity_pixels", - ( - Vector2.ZERO - if light_profile - else PLAYER_MENU_PATTERN_SCROLL_VELOCITY - ), - ) func _configure_audio_performance_profile(light_profile: bool) -> void: @@ -437,8 +397,6 @@ func _is_dedicated_server_runtime() -> bool: func _disable_dedicated_presentation_tree() -> void: for path: NodePath in [ NodePath("TitleBackgroundLayer"), - NodePath("PlayerMenuBackdrop"), - NodePath("ShopBackdrop"), NodePath("WorldPixelationPostprocess"), NodePath("UIPresentation"), NodePath("PixelationResetOverlay"), @@ -779,6 +737,7 @@ func _initialize_application(dedicated: bool) -> void: _shop_interaction = _test_world.get_fishing_shop() _decor_shop_interaction = _test_world.get_decor_shop() _rv_upgrade_shop_interaction = _test_world.get_rv_upgrade_shop() + _active_shop_npc_interaction = null _storage_interaction = _test_world.get_player_storage() if not dedicated: if not _home_state.changed.is_connected(_on_home_state_changed): @@ -818,6 +777,8 @@ func _initialize_application(dedicated: bool) -> void: _player_jobs, _player, _home_state, + _network_profile if not dedicated else null, + _appearance_store if not dedicated else null, ) _home_world.setup( _test_world, @@ -1045,6 +1006,9 @@ func _initialize_application(dedicated: bool) -> void: _fishing_spot, _game_ui.get_home_decor_toolbar(), ) + _home_decor_controller.exit_requested.connect( + _on_home_toolbar_exit_requested + ) _game_ui.get_player_storage().decorate_requested.connect( _home_decor_controller.begin_decorating ) @@ -1117,12 +1081,19 @@ func _initialize_application(dedicated: bool) -> void: _game_ui.passive_pointer_ui_changed.connect( _ui_pixelation.set_passive_pointer_ui_enabled ) - _game_ui.player_menu_backdrop_visibility_changed.connect( - _set_player_menu_backdrop_visible - ) - _game_ui.shop_backdrop_visibility_changed.connect( - _set_shop_backdrop_visible + _game_ui.get_node("%PlayerMenu").connect( + &"menu_visibility_changed", + _on_player_menu_conversation_visibility_changed ) + for shop_menu: Node in [ + _game_ui.get_fishing_shop(), + _game_ui.get_decor_shop(), + _game_ui.get_rv_upgrade_shop(), + ]: + shop_menu.connect( + &"menu_visibility_changed", + _on_shop_conversation_menu_visibility_changed + ) _pixelation_reset.return_to_settings_requested.connect( _game_ui.focus_open_settings_back_button ) @@ -1167,6 +1138,9 @@ func _initialize_application(dedicated: bool) -> void: pause_menu.menu_visibility_changed.connect( _game_ui.set_system_menu_open ) + pause_menu.menu_visibility_changed.connect( + _on_pause_menu_conversation_visibility_changed + ) _player.hotbar.selected_assignment_changed.connect( _on_active_hotbar_item_changed ) @@ -1441,8 +1415,15 @@ func _on_data_root_changed() -> void: _save_manager.set_autosave_enabled(false) _save_manager.cancel_pending_autosave() _configure_portable_stores() - if not _network_profile_service.reload_persisted_profile(): + var profile_reloaded: bool = ( + _network_profile_service.reload_persisted_profile() + ) + if not profile_reloaded: push_warning("The selected data folder's player profile could not be loaded.") + else: + _save_manager.capture_legacy_character_fallback() + if not _save_manager.load_character_profile(): + push_warning("The active save's character profile could not be loaded.") _network_session.set_local_appearance_snapshot( _appearance_store.get_snapshot() ) @@ -1547,6 +1528,25 @@ func _input(event: InputEvent) -> void: if _home_exit_transition_active: get_viewport().set_input_as_handled() return + # While dialogue is active the conversation owns the complete input stream. + # The second interaction press advances into the shop; cancel safely leaves + # the conversation without opening another menu behind it. + if ( + is_instance_valid(_engaged_shop_npc_interaction) + and not _shop_conversation_shop_opened + ): + if ( + event.is_action_pressed("interact") + and not (event is InputEventKey and event.echo) + ): + _open_engaged_shop() + elif ( + event.is_action_pressed("ui_cancel") + or event.is_action_pressed("open_system_menu") + ): + _end_shop_npc_conversation(false) + get_viewport().set_input_as_handled() + return # Do not let controller aliases close or manipulate the world/menu behind # the modal on-screen keyboard. The keyboard consumes the event itself. if _game_ui.is_controller_text_entry_open(): @@ -1564,6 +1564,8 @@ func _input(event: InputEvent) -> void: or (event is InputEventKey and event.echo) ): return + if event.is_action_pressed("ui_cancel"): + _observed_cancel_input_frame = Engine.get_process_frames() var pause_open_requested: bool = _is_pause_open_request(event) var title_screen: TitleScreenType = _game_ui.get_title_screen() if title_screen.visible or not _gameplay_started: @@ -1712,31 +1714,16 @@ func _unhandled_input(event: InputEvent) -> void: _refresh_home_door_prompt({}) get_viewport().set_input_as_handled() return + # All shop prompts and interactions resolve through the same nearest-NPC + # selection. This prevents overlapping trigger margins from making a fixed + # shop priority open (or speak for) someone the player is not facing. + _refresh_shop_npc_speech_state() + var active_shop_interaction := _get_active_shop_npc_interaction() if ( - _rv_upgrade_shop_interaction != null - and _rv_upgrade_shop_interaction.is_local_player_in_range() + active_shop_interaction != null and _fishing_spot.can_open_fishing_shop() - and _game_ui.get_rv_upgrade_shop().open_shop() ): - _game_ui.set_shop_prompt_visible(false) - get_viewport().set_input_as_handled() - return - if ( - _decor_shop_interaction != null - and _decor_shop_interaction.is_local_player_in_range() - and _fishing_spot.can_open_fishing_shop() - and _game_ui.get_decor_shop().open_shop() - ): - _game_ui.set_shop_prompt_visible(false) - get_viewport().set_input_as_handled() - return - if ( - _shop_interaction != null - and _shop_interaction.is_local_player_in_range() - and _fishing_spot.can_open_fishing_shop() - and _game_ui.get_fishing_shop().open_shop() - ): - _game_ui.set_shop_prompt_visible(false) + _begin_shop_npc_conversation(active_shop_interaction) get_viewport().set_input_as_handled() @@ -1750,25 +1737,33 @@ func _process(delta: float) -> void: ) _print_dedicated_metrics() return + # Native Godot tooltip popups can take ownership of Escape before this + # scene's _input callback sees it. Poll the action once as a fallback so a + # visible tooltip never forces a second Escape press to close its menu. + if ( + Input.is_action_just_pressed("ui_cancel") + and _observed_cancel_input_frame != Engine.get_process_frames() + ): + _consume_tooltip_captured_escape() _maybe_begin_home_exit_transition() - var show_rv_upgrade_prompt := _can_show_rv_upgrade_shop_prompt() - var show_decor_shop_prompt := _can_show_decor_shop_prompt() - var show_shop_prompt := ( - show_rv_upgrade_prompt - or show_decor_shop_prompt - or _can_show_shop_prompt() + # Shop close animations/signals may finish after the input frame that asked + # for them. Keep the cinematic held until the UI is actually gone. + if ( + _shop_conversation_shop_opened + and is_instance_valid(_engaged_shop_npc_interaction) + and not _is_any_shop_menu_visible() + ): + _end_shop_npc_conversation(false) + # Re-evaluate while moving, not only when an Area3D emits enter/exit. This + # gives overlapping edge cases an immediate nearest-character handoff. + _refresh_shop_npc_speech_state() + var active_shop_interaction := _get_active_shop_npc_interaction() + var show_shop_prompt := _can_show_active_shop_prompt( + active_shop_interaction ) var shop_prompt_anchor := ( - _rv_upgrade_shop_interaction.get_prompt_anchor_position() - if show_rv_upgrade_prompt - else ( - _decor_shop_interaction.get_prompt_anchor_position() - if show_decor_shop_prompt - else ( - _shop_interaction.get_prompt_anchor_position() - if _shop_interaction != null else Vector3.ZERO - ) - ) + active_shop_interaction.get_prompt_anchor_position() + if active_shop_interaction != null else Vector3.ZERO ) _game_ui.set_shop_prompt_visible( show_shop_prompt, @@ -1781,6 +1776,28 @@ func _process(delta: float) -> void: ) +func _consume_tooltip_captured_escape() -> bool: + if ( + not _gameplay_started + or _game_ui.get_title_screen().visible + or _home_exit_transition_active + or _game_ui.is_controller_text_entry_open() + or _game_ui.is_input_mapping_capturing() + ): + return false + if _game_ui.get_player_storage().consume_escape(): + return true + if _game_ui.get_decor_shop().consume_escape(): + return true + if _game_ui.get_rv_upgrade_shop().consume_escape(): + return true + if _game_ui.get_fishing_shop().consume_escape(): + return true + if _game_ui.get_pause_menu().handle_escape(): + return true + return _game_ui.consume_player_menu_escape() + + func _apply_runtime_settings(settings: PlayerSettingsType) -> void: if settings == null: return @@ -1866,11 +1883,22 @@ func _reset_pixelation() -> void: func _set_gameplay_active(active: bool) -> void: var was_gameplay_started: bool = _gameplay_started + if not active and was_gameplay_started and _save_manager.is_dirty(): + # Session teardown can mutate transient multiplayer state immediately + # before this method runs. Preserve any real progression first, then + # discard teardown-only dirty notifications once gameplay is inactive. + _save_manager.save_if_dirty() _gameplay_started = active # Session loss, a world switch, or a return to title can interrupt the home # handoff before its fade callback runs. Do not carry its input suppressors # or black screen into the next gameplay session. if not active: + if ( + is_instance_valid(_engaged_shop_npc_interaction) + or _shop_conversation_camera_restoring + or _player.is_shop_conversation_camera_active() + ): + _end_shop_npc_conversation(true) _cancel_home_entry_transition() _cancel_home_exit_transition(true) _shoreline_ambience.set_active(active) @@ -1901,8 +1929,7 @@ func _set_gameplay_active(active: bool) -> void: _refresh_active_hotbar_item() else: _player_jobs.end_progression_session() - _set_player_menu_backdrop_visible(false) - _set_shop_backdrop_visible(false) + _save_manager.cancel_pending_autosave() func _on_natural_time_advanced(advanced_hours: float) -> void: @@ -1953,85 +1980,6 @@ static func _natural_interval_crosses_hour( ) -func _set_player_menu_backdrop_visible(requested_visible: bool) -> void: - if _player_menu_backdrop_tween != null: - _player_menu_backdrop_tween.kill() - _player_menu_backdrop_tween = null - var should_show: bool = requested_visible and _gameplay_started - if should_show: - var was_visible: bool = _player_menu_backdrop.visible - _player_menu_backdrop.visible = true - if not was_visible: - _player_menu_backdrop.modulate.a = 0.0 - _player_menu_backdrop_tween = create_tween() - _player_menu_backdrop_tween.tween_property( - _player_menu_backdrop, - "modulate:a", - 1.0, - UIMotion.PLAYER_MENU_ENTER_DURATION, - ).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_OUT) - return - if not _player_menu_backdrop.visible: - return - _player_menu_backdrop_tween = create_tween() - _player_menu_backdrop_tween.tween_property( - _player_menu_backdrop, - "modulate:a", - 0.0, - UIMotion.PLAYER_MENU_EXIT_DURATION, - ).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_IN) - _player_menu_backdrop_tween.finished.connect( - func() -> void: - _player_menu_backdrop.visible = false - _player_menu_backdrop.modulate.a = 1.0 - _player_menu_backdrop_tween = null - ) - - -func _set_shop_backdrop_visible(requested_visible: bool) -> void: - if _shop_backdrop_tween != null: - _shop_backdrop_tween.kill() - _shop_backdrop_tween = null - var should_show: bool = requested_visible and _gameplay_started - if should_show: - var was_visible: bool = _shop_backdrop.visible - _shop_backdrop.visible = true - if not was_visible: - _shop_backdrop.modulate.a = 0.0 - _shop_backdrop_tween = create_tween() - _shop_backdrop_tween.tween_property( - _shop_backdrop, - "modulate:a", - 1.0, - UIMotion.PLAYER_MENU_ENTER_DURATION, - ).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_OUT) - return - if not _shop_backdrop.visible: - return - _shop_backdrop_tween = create_tween() - _shop_backdrop_tween.tween_property( - _shop_backdrop, - "modulate:a", - 0.0, - UIMotion.PLAYER_MENU_EXIT_DURATION, - ).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_IN) - _shop_backdrop_tween.finished.connect( - func() -> void: - _shop_backdrop.visible = false - _shop_backdrop.modulate.a = 1.0 - _shop_backdrop_tween = null - ) - - -func _resize_native_overlays() -> void: - if not is_node_ready(): - return - _player_menu_backdrop.position = Vector2.ZERO - _player_menu_backdrop.size = Vector2(get_window().size) - _shop_backdrop.position = Vector2.ZERO - _shop_backdrop.size = Vector2(get_window().size) - - func _on_new_game_requested( world_layout: StringName, world_seed: int, @@ -2039,6 +1987,15 @@ func _on_new_game_requested( if _gameplay_started or _quit_in_progress: return _start_new_game_music() + if ( + not _save_manager.delete_progression_save() + or not _save_manager.initialize_new_game(world_seed, world_layout) + ): + _show_title_music(true) + _game_ui.get_title_screen().report_network_error( + "Could not initialize local progression. Existing data was preserved where possible." + ) + return if not _apply_world(world_layout, world_seed, true): _show_title_music(true) _game_ui.get_title_screen().report_network_error( @@ -2054,16 +2011,6 @@ func _on_new_game_requested( if not _prepare_private_host(): _show_title_music(true) return - if ( - not _save_manager.delete_progression_save() - or not _save_manager.initialize_new_game(world_seed, world_layout) - ): - _network_session.disconnect_session("New Game setup failed.") - _show_title_music(true) - _game_ui.get_title_screen().report_network_error( - "Could not initialize local progression. Existing data was preserved where possible." - ) - return _enter_gameplay() @@ -2152,6 +2099,18 @@ func _on_new_slot_requested( _on_slot_play_requested(slot_id) return _start_new_game_music() + # Reset progression before the private session publishes its first home + # manifest. Doing this after hosting allowed the previous slot's RV tier to + # be announced and spawned into an otherwise brand-new save. + if ( + not _save_manager.delete_progression_save() + or not _save_manager.initialize_new_game(world_seed, world_layout) + ): + _show_title_music(true) + _game_ui.get_title_screen().report_network_error( + "Could not initialize local progression." + ) + return if not _apply_world(world_layout, world_seed, true): _show_title_music(true) _game_ui.get_title_screen().report_network_error( @@ -2167,16 +2126,6 @@ func _on_new_slot_requested( if not _prepare_private_host(): _show_title_music(true) return - if ( - not _save_manager.delete_progression_save() - or not _save_manager.initialize_new_game(world_seed, world_layout) - ): - _network_session.disconnect_session("New Game setup failed.") - _show_title_music(true) - _game_ui.get_title_screen().report_network_error( - "Could not initialize local progression." - ) - return _save_slots.mark_played(slot_id) _enter_gameplay() @@ -2243,10 +2192,17 @@ func _on_title_join_game_requested(requested_route: Variant) -> void: "That connection address is invalid." ) return - var active_slot: Dictionary = _save_slots.ensure_active_slot() - if not bool(active_slot.get("ok", false)): + var online_slot: Dictionary = _save_slots.ensure_online_slot() + if not bool(online_slot.get("ok", false)): _game_ui.get_title_screen().report_network_error( - str(active_slot.get("message", "Local progression is unavailable.")) + str(online_slot.get( + "message", "Online progression is unavailable." + )) + ) + return + if not _save_manager.load_character_profile(): + _game_ui.get_title_screen().report_network_error( + "The selected online character could not be loaded." ) return if _network_session.state != NetworkSessionType.State.INACTIVE: @@ -2356,7 +2312,9 @@ func _show_next_social_prompt() -> void: _active_social_prompt = _social_prompt_queue.pop_front() var kind := str(_active_social_prompt.get("kind", "")) var display_name := str( - _active_social_prompt.get("display_name", "Player") + _active_social_prompt.get( + "display_name", NetworkProfilePreferences.DEFAULT_DISPLAY_NAME + ) ) var shown: bool = false if kind == "friend_request": @@ -2468,7 +2426,11 @@ func _on_network_join_authenticated() -> void: var progression_ready: bool = ( _save_manager.load_player_data() if inspection.can_continue() - else _save_manager.initialize_new_game() + else _save_manager.initialize_new_game( + PlayerSaveManager.DEFAULT_WORLD_SEED, + WorldLayout.GENERATED, + false, + ) ) if not progression_ready: _network_session.disconnect_session( @@ -2662,6 +2624,12 @@ func _apply_world( func _refresh_active_world_bindings() -> void: + if ( + is_instance_valid(_engaged_shop_npc_interaction) + or _shop_conversation_camera_restoring + or _player.is_shop_conversation_camera_active() + ): + _end_shop_npc_conversation(true) if is_instance_valid(_shop_interaction): if _shop_interaction.local_player_range_changed.is_connected( _on_shop_range_changed @@ -2693,6 +2661,7 @@ func _refresh_active_world_bindings() -> void: _shop_interaction = _test_world.get_fishing_shop() _decor_shop_interaction = _test_world.get_decor_shop() _rv_upgrade_shop_interaction = _test_world.get_rv_upgrade_shop() + _active_shop_npc_interaction = null _storage_interaction = _test_world.get_player_storage() _network_sale.set_shop_interaction(_shop_interaction) _network_shop.set_shop_interaction(_shop_interaction) @@ -2747,6 +2716,12 @@ func _refresh_active_world_bindings() -> void: func _on_water_recovery_starting() -> void: + if ( + is_instance_valid(_engaged_shop_npc_interaction) + or _shop_conversation_camera_restoring + or _player.is_shop_conversation_camera_active() + ): + _end_shop_npc_conversation(true) _local_recovery_attempt_id = ( "recovery:%s" % Crypto.new().generate_random_bytes(16).hex_encode() @@ -2957,6 +2932,15 @@ func _finish_quit() -> void: func _exit_tree() -> void: + if ( + is_instance_valid(_player) + and ( + is_instance_valid(_engaged_shop_npc_interaction) + or _shop_conversation_camera_restoring + or _player.is_shop_conversation_camera_active() + ) + ): + _end_shop_npc_conversation(true) _cancel_home_entry_transition() _cancel_home_exit_transition(true) if _dedicated_runtime and _network_session != null: @@ -2976,10 +2960,15 @@ func _exit_tree() -> void: func _on_shop_range_changed(in_range: bool) -> void: - _refresh_shop_npc_speech_state() + # Speech ownership is resolved once per frame after all Area3D enter/exit + # signals have settled, avoiding a one-frame clear during zone handoffs. if not in_range: _game_ui.get_fishing_shop().close_for_range_exit() - _game_ui.set_shop_prompt_visible(_can_show_any_shop_prompt()) + if ( + _engaged_shop_npc_interaction == _shop_interaction + and not _shop_conversation_shop_opened + ): + _end_shop_npc_conversation(false) func _on_storage_range_changed(in_range: bool) -> void: @@ -2993,17 +2982,23 @@ func _on_storage_range_changed(in_range: bool) -> void: func _on_decor_shop_range_changed(in_range: bool) -> void: - _refresh_shop_npc_speech_state() if not in_range: _game_ui.get_decor_shop().close_for_range_exit() - _game_ui.set_shop_prompt_visible(_can_show_any_shop_prompt()) + if ( + _engaged_shop_npc_interaction == _decor_shop_interaction + and not _shop_conversation_shop_opened + ): + _end_shop_npc_conversation(false) func _on_rv_upgrade_shop_range_changed(in_range: bool) -> void: - _refresh_shop_npc_speech_state() if not in_range: _game_ui.get_rv_upgrade_shop().close_for_range_exit() - _game_ui.set_shop_prompt_visible(_can_show_any_shop_prompt()) + if ( + _engaged_shop_npc_interaction == _rv_upgrade_shop_interaction + and not _shop_conversation_shop_opened + ): + _end_shop_npc_conversation(false) func _on_home_state_changed() -> void: @@ -3015,6 +3010,11 @@ func _on_local_home_space_changed( owner_fingerprint: String, ) -> void: var inside_rv: bool = String(space_id).begins_with("rv:") + _world_time_visuals.set_local_home_interior_active(inside_rv) + _rain_ambience.set_suppressed(inside_rv) + _shoreline_ambience.set_suppressed(inside_rv) + _surface_drawings_root.visible = not inside_rv + _world_gatherables_root.visible = not inside_rv _refresh_active_hotbar_item() _fishing_spot.set_fishing_environment_enabled(not inside_rv) _game_ui.set_rv_interior_camera_mode( @@ -3094,7 +3094,12 @@ func _maybe_begin_home_exit_transition() -> void: _begin_home_exit_transition(owner_fingerprint) -func _begin_home_exit_transition(owner_fingerprint: String) -> void: +func _begin_home_exit_transition( + owner_fingerprint: String, + skip_walk: bool = false, +) -> void: + if owner_fingerprint.is_empty() or _home_exit_transition_active: + return _home_exit_transition_active = true _home_exit_waiting_for_network = false _home_exit_start_position = _player.global_position @@ -3107,8 +3112,11 @@ func _begin_home_exit_transition(owner_fingerprint: String) -> void: _game_ui.get_player_storage().close_storage() _game_ui.set_rv_storage_button_visible(false) _game_ui.set_gameplay_input_locked(true) - var exit_direction: Vector3 = _home_world.get_interior_exit_direction( - owner_fingerprint + if skip_walk: + _on_home_exit_walk_finished() + return + var exit_direction: Vector3 = _home_world.get_interior_exit_direction_near( + owner_fingerprint, _player.global_position ) _player.face_world_direction(exit_direction) _player.begin_animation_action(PlayerType.CHARACTER_WALKING_ANIMATION) @@ -3127,6 +3135,19 @@ func _begin_home_exit_transition(owner_fingerprint: String) -> void: ) +func _on_home_toolbar_exit_requested() -> void: + if _home_exit_transition_active: + return + var owner_fingerprint: String = ( + _network_home.get_local_home_owner_fingerprint() + ) + if owner_fingerprint.is_empty(): + return + if _home_entry_transition_active: + _cancel_home_entry_transition() + _begin_home_exit_transition(owner_fingerprint, true) + + func _on_home_exit_walk_finished() -> void: _home_exit_walk_tween = null if not _home_exit_transition_active: @@ -3209,35 +3230,33 @@ func _on_rv_storage_requested() -> void: func _can_show_shop_prompt() -> bool: return ( - _gameplay_started - and _shop_interaction != null - and _shop_interaction.is_local_player_in_range() - and not _game_ui.get_fishing_shop().visible - and not _game_ui.get_decor_shop().visible - and not _game_ui.get_rv_upgrade_shop().visible - and not _water_recovery.is_recovery_active() - and _fishing_spot.can_open_fishing_shop() + _get_active_shop_npc_interaction() == _shop_interaction + and _can_show_active_shop_prompt(_shop_interaction) ) func _can_show_decor_shop_prompt() -> bool: return ( - _gameplay_started - and _decor_shop_interaction != null - and _decor_shop_interaction.is_local_player_in_range() - and not _game_ui.get_decor_shop().visible - and not _game_ui.get_fishing_shop().visible - and not _game_ui.get_rv_upgrade_shop().visible - and not _water_recovery.is_recovery_active() - and _fishing_spot.can_open_fishing_shop() + _get_active_shop_npc_interaction() == _decor_shop_interaction + and _can_show_active_shop_prompt(_decor_shop_interaction) ) func _can_show_rv_upgrade_shop_prompt() -> bool: + return ( + _get_active_shop_npc_interaction() == _rv_upgrade_shop_interaction + and _can_show_active_shop_prompt(_rv_upgrade_shop_interaction) + ) + + +func _can_show_active_shop_prompt( + interaction: FishingShopInteractionType, +) -> bool: return ( _gameplay_started - and _rv_upgrade_shop_interaction != null - and _rv_upgrade_shop_interaction.is_local_player_in_range() + and not _shop_conversation_camera_restoring + and interaction != null + and interaction.is_local_player_in_range() and not _game_ui.get_rv_upgrade_shop().visible and not _game_ui.get_fishing_shop().visible and not _game_ui.get_decor_shop().visible @@ -3247,10 +3266,8 @@ func _can_show_rv_upgrade_shop_prompt() -> bool: func _can_show_any_shop_prompt() -> bool: - return ( - _can_show_shop_prompt() - or _can_show_decor_shop_prompt() - or _can_show_rv_upgrade_shop_prompt() + return _can_show_active_shop_prompt( + _get_active_shop_npc_interaction() ) @@ -3272,34 +3289,181 @@ func _is_any_shop_npc_in_range() -> bool: func _refresh_shop_npc_speech_state() -> void: + if ( + _engaged_shop_npc_interaction != null + and ( + not is_instance_valid(_engaged_shop_npc_interaction) + or not _engaged_shop_npc_interaction.is_local_player_in_range() + ) + ): + if _shop_conversation_shop_opened and _is_any_shop_menu_visible(): + _game_ui.set_shop_npc_player_in_range(false) + return + _end_shop_npc_conversation(false) var interaction := _get_active_shop_npc_interaction() var dialogue_text: String = "" if interaction != null: dialogue_text = interaction.get_dialogue_text(_home_state.get_tier()) _game_ui.set_shop_npc_player_in_range( - interaction != null, + interaction != null and not _shop_conversation_shop_opened, dialogue_text, + interaction.get_instance_id() if interaction != null else 0, + interaction == _engaged_shop_npc_interaction + and not _shop_conversation_shop_opened, ) func _get_active_shop_npc_interaction() -> FishingShopInteractionType: - # Match the interaction and prompt priority used above: RV, decor, fishing. if ( - _rv_upgrade_shop_interaction != null - and _rv_upgrade_shop_interaction.is_local_player_in_range() + is_instance_valid(_engaged_shop_npc_interaction) + and _engaged_shop_npc_interaction.is_local_player_in_range() ): - return _rv_upgrade_shop_interaction + _active_shop_npc_interaction = _engaged_shop_npc_interaction + return _active_shop_npc_interaction + var candidates: Array[FishingShopInteractionType] = [] + if _shop_interaction != null: + candidates.append(_shop_interaction) + if _decor_shop_interaction != null: + candidates.append(_decor_shop_interaction) + if _rv_upgrade_shop_interaction != null: + candidates.append(_rv_upgrade_shop_interaction) + var nearest: FishingShopInteractionType + var nearest_distance_squared: float = INF + for interaction: FishingShopInteractionType in candidates: + if not interaction.is_local_player_in_range(): + continue + var distance_squared := interaction.get_local_player_distance_squared() + if distance_squared < nearest_distance_squared: + nearest = interaction + nearest_distance_squared = distance_squared if ( - _decor_shop_interaction != null - and _decor_shop_interaction.is_local_player_in_range() + nearest != null + and nearest != _active_shop_npc_interaction + and is_instance_valid(_active_shop_npc_interaction) + and _active_shop_npc_interaction.is_local_player_in_range() ): - return _decor_shop_interaction + var active_distance_squared := ( + _active_shop_npc_interaction.get_local_player_distance_squared() + ) + # Require a small, visible distance advantage before ownership switches. + # This keeps a player standing on the zone seam from chattering between + # two NPCs while still handing off well before the old compact zone ends. + if ( + sqrt(nearest_distance_squared) + + SHOP_NPC_HANDOFF_HYSTERESIS_METERS + >= sqrt(active_distance_squared) + ): + nearest = _active_shop_npc_interaction + _active_shop_npc_interaction = nearest + return _active_shop_npc_interaction + + +func _begin_shop_npc_conversation( + interaction: FishingShopInteractionType, +) -> bool: if ( - _shop_interaction != null - and _shop_interaction.is_local_player_in_range() + _shop_conversation_camera_restoring + or is_instance_valid(_engaged_shop_npc_interaction) + or interaction == null + or not interaction.is_local_player_in_range() + or not _fishing_spot.can_open_fishing_shop() ): - return _shop_interaction - return null + return false + _engaged_shop_npc_interaction = interaction + _active_shop_npc_interaction = interaction + _shop_conversation_shop_opened = false + interaction.set_engaged(true) + _player.begin_shop_conversation_camera( + interaction.get_shopkeeper_position() + ) + _player.set_local_input_suppressed( + SHOP_NPC_CONVERSATION_INPUT_OWNER, true + ) + _player.set_camera_input_suppressed( + SHOP_NPC_CONVERSATION_INPUT_OWNER, true + ) + _refresh_shop_npc_speech_state() + return true + + +func _open_engaged_shop() -> bool: + var interaction := _engaged_shop_npc_interaction + if ( + interaction == null + or not is_instance_valid(interaction) + or not interaction.is_local_player_in_range() + or _shop_conversation_shop_opened + ): + return false + var opened: bool = false + if interaction == _rv_upgrade_shop_interaction: + opened = _game_ui.get_rv_upgrade_shop().open_shop() + elif interaction == _decor_shop_interaction: + opened = _game_ui.get_decor_shop().open_shop() + elif interaction == _shop_interaction: + opened = _game_ui.get_fishing_shop().open_shop() + if not opened: + return false + _shop_conversation_shop_opened = true + _game_ui.set_shop_prompt_visible(false) + _refresh_shop_npc_speech_state() + return true + + +func _end_shop_npc_conversation(immediate_camera: bool = false) -> void: + if _shop_conversation_camera_restoring and not immediate_camera: + return + var interaction := _engaged_shop_npc_interaction + if is_instance_valid(interaction): + interaction.set_engaged(false) + _engaged_shop_npc_interaction = null + _shop_conversation_shop_opened = false + _game_ui.set_shop_npc_player_in_range(false) + var camera_was_active := _player.is_shop_conversation_camera_active() + _shop_conversation_camera_restoring = camera_was_active and not immediate_camera + _player.restore_shop_conversation_camera( + immediate_camera, + _finish_shop_npc_conversation_restore, + ) + + +func _finish_shop_npc_conversation_restore() -> void: + _player.set_local_input_suppressed( + SHOP_NPC_CONVERSATION_INPUT_OWNER, false + ) + _player.set_camera_input_suppressed( + SHOP_NPC_CONVERSATION_INPUT_OWNER, false + ) + _shop_conversation_camera_restoring = false + if _gameplay_started and is_instance_valid(_game_ui): + _refresh_shop_npc_speech_state() + + +func _is_any_shop_menu_visible() -> bool: + return ( + _game_ui.get_fishing_shop().visible + or _game_ui.get_decor_shop().visible + or _game_ui.get_rv_upgrade_shop().visible + ) + + +func _on_shop_conversation_menu_visibility_changed(is_open: bool) -> void: + if ( + not is_open + and _shop_conversation_shop_opened + and not _is_any_shop_menu_visible() + ): + _end_shop_npc_conversation(false) + + +func _on_pause_menu_conversation_visibility_changed(is_open: bool) -> void: + if is_open and is_instance_valid(_engaged_shop_npc_interaction): + _end_shop_npc_conversation(false) + + +func _on_player_menu_conversation_visibility_changed(is_open: bool) -> void: + if is_open and is_instance_valid(_engaged_shop_npc_interaction): + _end_shop_npc_conversation(false) func _can_show_storage_prompt() -> bool: diff --git a/main/main.tscn b/main/main.tscn index 778a1d4..aeea011 100644 --- a/main/main.tscn +++ b/main/main.tscn @@ -39,9 +39,7 @@ [ext_resource type="Script" uid="uid://bu5q4a8jfvxkf" path="res://network/identity_backup_service.gd" id="38_identity_backup"] [ext_resource type="Script" uid="uid://djmxy6jibi5y3" path="res://ui/interface_font_controller.gd" id="39_fonts"] [ext_resource type="Texture2D" uid="uid://doju2lbj2ghwa" path="res://world/generation/chunks/assets/chunk_0000_grass_lite.png" id="40_title_grass"] -[ext_resource type="Texture2D" uid="uid://f8a0cs0s7ler" path="res://art/patterns/pattern_tealdot.png" id="41_menu_pattern"] [ext_resource type="Shader" uid="uid://byw3iub66qvog" path="res://ui/player_menu_pattern.gdshader" id="42_menu_pattern"] -[ext_resource type="Texture2D" uid="uid://b6xws1d2dnbnn" path="res://art/patterns/pattern_moneyfish.png" id="43_shop_pattern"] [ext_resource type="Script" uid="uid://m4n0bn38f34i" path="res://network/network_fish_showcase_service.gd" id="45_fish_showcase"] [ext_resource type="Script" uid="uid://bkiepgu8j5r6t" path="res://network/network_surface_drawing_service.gd" id="46_surface_drawing"] [ext_resource type="Script" uid="uid://5lceyulaglpf" path="res://world/world_time_service.gd" id="47_world_time"] @@ -70,20 +68,6 @@ shader_parameter/source_tile_size = Vector2(128, 128) shader_parameter/display_scale = 1.0 shader_parameter/scroll_velocity_pixels = Vector2(-7.5, -7.5) -[sub_resource type="ShaderMaterial" id="ShaderMaterial_player_menu_pattern"] -shader = ExtResource("42_menu_pattern") -shader_parameter/pattern_texture = ExtResource("41_menu_pattern") -shader_parameter/source_tile_size = Vector2(128, 128) -shader_parameter/display_scale = 0.85 -shader_parameter/scroll_velocity_pixels = Vector2(-7, -5) - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_shop_pattern"] -shader = ExtResource("42_menu_pattern") -shader_parameter/pattern_texture = ExtResource("43_shop_pattern") -shader_parameter/source_tile_size = Vector2(64, 64) -shader_parameter/display_scale = 1.75 -shader_parameter/scroll_velocity_pixels = Vector2(-7, -5) - [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_hifdc"] data = PackedVector3Array(-13.598646, -21.527378, 3.4402227, -13.598646, -21.04931, 3.716229, -13.64679, -21.345833, 3.1714065, -13.64679, -21.345833, 3.1714065, -13.598646, -21.04931, 3.716229, -13.598646, -21.04931, 3.1642165, -13.598646, -21.601322, 3.716229, -13.598646, -21.04931, 3.716229, -13.598646, -21.527378, 3.4402227, -13.598646, -21.04931, 3.1642165, -13.598646, -21.04931, 3.716229, -13.598646, -20.773304, 3.238161, -13.604641, -21.54901, 3.9200878, -13.598646, -21.04931, 3.716229, -13.598646, -21.601322, 3.716229, -13.598646, -20.773304, 3.238161, -13.598646, -21.04931, 3.716229, -13.598646, -20.571243, 3.4402227, -13.598646, -21.325317, 4.194297, -13.598646, -21.04931, 3.716229, -13.604641, -21.54901, 3.9200878, -13.598646, -20.571243, 3.4402227, -13.598646, -21.04931, 3.716229, -13.598646, -20.4973, 3.716229, -13.602205, -21.078318, 4.268241, -13.598646, -21.04931, 3.716229, -13.598646, -21.325317, 4.194297, -13.598646, -20.4973, 3.716229, -13.598646, -21.04931, 3.716229, -13.598646, -20.571243, 3.992235, -13.598646, -20.773304, 4.194297, -13.598646, -21.04931, 3.716229, -13.602205, -21.078318, 4.268241, -13.598646, -20.571243, 3.992235, -13.598646, -21.04931, 3.716229, -13.598646, -20.773304, 4.194297, -19.042458, -21.325317, 3.2381601, -19.042458, -21.04931, 3.716228, -19.042458, -21.527378, 3.4402218, -19.042458, -21.527378, 3.4402218, -19.042458, -21.04931, 3.716228, -19.042458, -21.601322, 3.716228, -19.042458, -21.04931, 3.1642156, -19.042458, -21.04931, 3.716228, -19.042458, -21.325317, 3.2381601, -19.042458, -21.601322, 3.716228, -19.042458, -21.04931, 3.716228, -19.042458, -21.527378, 3.992234, -19.042458, -20.773304, 3.2381601, -19.042458, -21.04931, 3.716228, -19.042458, -21.04931, 3.1642156, -19.042458, -21.527378, 3.992234, -19.042458, -21.04931, 3.716228, -19.042458, -21.325317, 4.194296, -18.784327, -20.60149, 3.4511306, -19.042458, -21.04931, 3.716228, -19.042458, -20.773304, 3.2381601, -19.042458, -21.325317, 4.194296, -19.042458, -21.04931, 3.716228, -19.042458, -21.04931, 4.26824, -19.042458, -20.4973, 3.716228, -19.042458, -21.04931, 3.716228, -18.784327, -20.60149, 3.4511306, -19.042458, -21.04931, 4.26824, -19.042458, -21.04931, 3.716228, -19.042458, -20.773304, 4.194296, -19.042458, -20.571243, 3.992234, -19.042458, -21.04931, 3.716228, -19.042458, -20.4973, 3.716228, -19.042458, -20.773304, 4.194296, -19.042458, -21.04931, 3.716228, -19.042458, -20.571243, 3.992234, -14.534702, -21.32513, 3.238533, -17.467253, -21.04931, 3.1645257, -17.467253, -21.32513, 3.2384703, -17.467253, -21.32513, 3.2384703, -19.084044, -21.586075, 3.4063175, -17.467253, -21.52707, 3.440408, -17.467253, -21.32513, 3.2384703, -19.084044, -21.35922, 3.1794631, -19.084044, -21.586075, 3.4063175, -17.467253, -21.04931, 3.1645257, -19.084044, -21.35922, 3.1794631, -17.467253, -21.32513, 3.2384703, -17.467253, -21.32513, 3.2384703, -17.467253, -21.52707, 3.440408, -14.516907, -21.527006, 3.4404085, -17.467253, -21.32513, 3.2384703, -14.516907, -21.527006, 3.4404085, -14.534702, -21.32513, 3.238533, -17.467253, -21.04931, 3.1645257, -19.084044, -21.04931, 3.0964072, -19.084044, -21.35922, 3.1794631, -13.605204, -21.379738, 3.1126475, -14.534702, -21.32513, 3.238533, -14.516907, -21.527006, 3.4404085, -13.605204, -21.379738, 3.1126475, -14.516907, -21.527006, 3.4404085, -13.55706, -21.586075, 3.4063187, -13.55706, -21.04931, 3.0964081, -14.534702, -21.32513, 3.238533, -13.605204, -21.379738, 3.1126475, -13.55706, -21.04931, 3.0964081, -14.519905, -21.04931, 3.1645882, -14.534702, -21.32513, 3.238533, -14.534702, -21.32513, 3.238533, -14.519905, -21.04931, 3.1645882, -17.467253, -21.04931, 3.1645257, -13.55706, -20.7394, 3.179464, -14.519905, -21.04931, 3.1645882, -13.55706, -21.04931, 3.0964081, -17.467253, -20.77349, 3.2384703, -19.084044, -21.04931, 3.0964072, -17.467253, -21.04931, 3.1645257, -17.467253, -20.77349, 3.2384703, -17.467253, -21.04931, 3.1645257, -14.519905, -21.04931, 3.1645882, -17.467253, -20.77349, 3.2384703, -19.084044, -20.7394, 3.1794631, -19.084044, -21.04931, 3.0964072, -17.467253, -20.571552, 3.440408, -19.084044, -20.7394, 3.1794631, -17.467253, -20.77349, 3.2384703, -17.467253, -20.571552, 3.440408, -18.82591, -20.542793, 3.4172263, -19.084044, -20.7394, 3.1794631, -17.467253, -20.77349, 3.2384703, -14.519905, -21.04931, 3.1645882, -14.509039, -20.77349, 3.238533, -17.467253, -20.571552, 3.440408, -17.467253, -20.77349, 3.2384703, -14.509039, -20.77349, 3.238533, -13.55706, -20.7394, 3.179464, -14.509039, -20.77349, 3.238533, -14.519905, -21.04931, 3.1645882, -17.467253, -20.571552, 3.440408, -14.509039, -20.77349, 3.238533, -14.509039, -20.571615, 3.4404085, -13.55706, -20.512547, 3.4063187, -14.509039, -20.77349, 3.238533, -13.55706, -20.7394, 3.179464, -13.55706, -20.512547, 3.4063187, -14.509039, -20.571615, 3.4404085, -14.509039, -20.77349, 3.238533, -17.467253, -21.52707, 3.440408, -14.509039, -21.60095, 3.7162287, -14.516907, -21.527006, 3.4404085, -13.55706, -21.586075, 3.4063187, -14.516907, -21.527006, 3.4404085, -14.509039, -21.60095, 3.7162287, -13.55706, -21.586075, 3.4063187, -14.509039, -21.60095, 3.7162287, -13.55706, -21.669132, 3.716229, -13.55706, -21.669132, 3.716229, -14.509039, -21.60095, 3.7162287, -14.511475, -21.527006, 3.992049, -13.55706, -21.669132, 3.716229, -14.511475, -21.527006, 3.992049, -13.563242, -21.607708, 3.9539921, -17.467253, -21.601013, 3.7162282, -14.511475, -21.527006, 3.992049, -14.509039, -21.60095, 3.7162287, -17.467253, -21.52707, 3.440408, -17.467253, -21.601013, 3.7162282, -14.509039, -21.60095, 3.7162287, -17.467253, -21.601013, 3.7162282, -17.467253, -21.52707, 3.9920485, -14.511475, -21.527006, 3.992049, -17.467253, -21.601013, 3.7162282, -19.084044, -21.586075, 4.0261383, -17.467253, -21.52707, 3.9920485, -17.467253, -21.601013, 3.7162282, -19.084044, -21.669132, 3.716228, -19.084044, -21.586075, 4.0261383, -17.467253, -21.52707, 3.440408, -19.084044, -21.669132, 3.716228, -17.467253, -21.601013, 3.7162282, -17.467253, -21.52707, 3.440408, -19.084044, -21.586075, 3.4063175, -19.084044, -21.669132, 3.716228, -17.467253, -21.52707, 3.9920485, -14.509039, -21.32513, 4.1939244, -14.511475, -21.527006, 3.992049, -13.563242, -21.607708, 3.9539921, -14.511475, -21.527006, 3.992049, -14.509039, -21.32513, 4.1939244, -13.563242, -21.607708, 3.9539921, -14.509039, -21.32513, 4.1939244, -13.557062, -21.35922, 4.2529936, -13.557062, -21.35922, 4.2529936, -14.509039, -21.32513, 4.1939244, -14.510912, -21.04931, 4.267869, -13.557062, -21.35922, 4.2529936, -14.510912, -21.04931, 4.267869, -13.560621, -21.078318, 4.3360496, -17.467253, -21.52707, 3.9920485, -17.467253, -21.32513, 4.193986, -14.509039, -21.32513, 4.1939244, -17.467253, -21.32513, 4.193986, -14.510912, -21.04931, 4.267869, -14.509039, -21.32513, 4.1939244, -17.467253, -21.52707, 3.9920485, -19.084044, -21.35922, 4.2529926, -17.467253, -21.32513, 4.193986, -17.467253, -21.52707, 3.9920485, -19.084044, -21.586075, 4.0261383, -19.084044, -21.35922, 4.2529926, -17.467253, -21.32513, 4.193986, -19.084044, -21.35922, 4.2529926, -19.084044, -21.04931, 4.3360486, -17.467253, -21.32513, 4.193986, -19.084044, -21.04931, 4.3360486, -17.467253, -21.04931, 4.2679305, -17.467253, -21.32513, 4.193986, -17.467253, -21.04931, 4.2679305, -14.510912, -21.04931, 4.267869, -17.467253, -21.04931, 4.2679305, -19.084044, -21.04931, 4.3360486, -19.084044, -20.7394, 4.2529926, -13.560621, -21.078318, 4.3360496, -14.510912, -21.04931, 4.267869, -14.510912, -20.795122, 4.1217775, -17.467253, -21.04931, 4.2679305, -14.510912, -20.795122, 4.1217775, -14.510912, -21.04931, 4.267869, -13.560621, -21.078318, 4.3360496, -14.510912, -20.795122, 4.1217775, -13.557062, -20.7394, 4.2529936, -17.467253, -21.04931, 4.2679305, -19.084044, -20.7394, 4.2529926, -17.467253, -20.77349, 4.193986, -17.467253, -21.04931, 4.2679305, -17.467253, -20.77349, 4.193986, -14.510912, -20.795122, 4.1217775, -17.467253, -20.77349, 4.193986, -19.084044, -20.7394, 4.2529926, -19.084044, -20.512547, 4.0261383, -17.467253, -20.77349, 4.193986, -19.084044, -20.512547, 4.0261383, -17.467253, -20.571552, 3.9920485, -17.467253, -20.77349, 4.193986, -17.467253, -20.571552, 3.9920485, -14.509039, -20.571615, 3.992049, -17.467253, -20.77349, 4.193986, -14.509039, -20.571615, 3.992049, -14.510912, -20.795122, 4.1217775, -13.557062, -20.7394, 4.2529936, -14.510912, -20.795122, 4.1217775, -14.509039, -20.571615, 3.992049, -13.557062, -20.7394, 4.2529936, -14.509039, -20.571615, 3.992049, -13.55706, -20.512547, 4.0261393, -17.467253, -20.571552, 3.9920485, -14.509039, -20.497732, 3.7162287, -14.509039, -20.571615, 3.992049, -13.55706, -20.512547, 4.0261393, -14.509039, -20.571615, 3.992049, -14.509039, -20.497732, 3.7162287, -13.55706, -20.512547, 4.0261393, -14.509039, -20.497732, 3.7162287, -13.55706, -20.42949, 3.716229, -13.55706, -20.42949, 3.716229, -14.509039, -20.497732, 3.7162287, -14.509039, -20.571615, 3.4404085, -13.55706, -20.42949, 3.716229, -14.509039, -20.571615, 3.4404085, -13.55706, -20.512547, 3.4063187, -17.467253, -20.497608, 3.7162282, -14.509039, -20.571615, 3.4404085, -14.509039, -20.497732, 3.7162287, -17.467253, -20.571552, 3.9920485, -17.467253, -20.497608, 3.7162282, -14.509039, -20.497732, 3.7162287, -17.467253, -20.497608, 3.7162282, -17.467253, -20.571552, 3.440408, -14.509039, -20.571615, 3.4404085, -17.467253, -20.497608, 3.7162282, -18.82591, -20.542793, 3.4172263, -17.467253, -20.571552, 3.440408, -17.467253, -20.497608, 3.7162282, -19.084044, -20.42949, 3.716228, -18.82591, -20.542793, 3.4172263, -17.467253, -20.571552, 3.9920485, -19.084044, -20.42949, 3.716228, -17.467253, -20.497608, 3.7162282, -17.467253, -20.571552, 3.9920485, -19.084044, -20.512547, 4.0261383, -19.084044, -20.42949, 3.716228, -19.084044, -21.35922, 3.1794631, -19.084044, -21.586075, 3.4063175, -19.084044, -21.586075, 3.4063175, -19.084044, -21.586075, 3.4063175, -19.084044, -21.586075, 3.4063175, -19.084044, -21.669132, 3.716228, -19.084044, -21.35922, 3.1794631, -19.084044, -21.35922, 3.1794631, -19.084044, -21.586075, 3.4063175, -19.084044, -21.04931, 3.0964072, -19.084044, -21.35922, 3.1794631, -19.084044, -21.35922, 3.1794631, -19.084044, -21.04931, 3.0964072, -19.084044, -21.04931, 3.0964072, -19.084044, -21.35922, 3.1794631, -19.084044, -21.586075, 3.4063175, -19.084044, -21.669132, 3.716228, -19.084044, -21.669132, 3.716228, -19.084044, -21.669132, 3.716228, -19.084044, -21.669132, 3.716228, -19.084044, -21.586075, 4.0261383, -19.084044, -21.669132, 3.716228, -19.084044, -21.586075, 4.0261383, -19.084044, -21.586075, 4.0261383, -19.084044, -21.586075, 4.0261383, -19.084044, -21.586075, 4.0261383, -19.084044, -21.35922, 4.2529926, -19.084044, -21.586075, 4.0261383, -19.084044, -21.35922, 4.2529926, -19.084044, -21.35922, 4.2529926, -19.084044, -21.35922, 4.2529926, -19.084044, -21.35922, 4.2529926, -19.084044, -21.04931, 4.3360486, -19.084044, -21.35922, 4.2529926, -19.084044, -21.04931, 4.3360486, -19.084044, -21.04931, 4.3360486, -19.084044, -21.04931, 4.3360486, -19.084044, -21.04931, 4.3360486, -19.084044, -20.7394, 4.2529926, -19.084044, -21.04931, 4.3360486, -19.084044, -20.7394, 4.2529926, -19.084044, -20.7394, 4.2529926, -19.084044, -20.7394, 4.2529926, -19.084044, -20.7394, 4.2529926, -19.084044, -20.512547, 4.0261383, -19.084044, -20.7394, 4.2529926, -19.084044, -20.512547, 4.0261383, -19.084044, -20.512547, 4.0261383, -19.084044, -20.512547, 4.0261383, -19.084044, -20.512547, 4.0261383, -19.084044, -20.42949, 3.716228, -19.084044, -20.512547, 4.0261383, -19.084044, -20.42949, 3.716228, -19.084044, -20.42949, 3.716228, -19.084044, -20.42949, 3.716228, -19.084044, -20.42949, 3.716228, -18.82591, -20.542793, 3.4172263, -19.084044, -20.42949, 3.716228, -18.82591, -20.542793, 3.4172263, -18.82591, -20.542793, 3.4172263, -18.82591, -20.542793, 3.4172263, -19.084044, -20.7394, 3.1794631, -19.084044, -20.7394, 3.1794631, -18.82591, -20.542793, 3.4172263, -18.82591, -20.542793, 3.4172263, -19.084044, -20.7394, 3.1794631, -19.084044, -20.7394, 3.1794631, -19.084044, -21.04931, 3.0964072, -19.084044, -21.04931, 3.0964072, -19.084044, -20.7394, 3.1794631, -19.084044, -20.7394, 3.1794631, -19.084044, -21.04931, 3.0964072, -13.55706, -21.586075, 3.4063187, -13.605204, -21.345833, 3.1714065, -13.605204, -21.379738, 3.1126475, -13.605204, -21.379738, 3.1126475, -13.605204, -21.345833, 3.1714065, -13.55706, -21.04931, 3.1642165, -13.55706, -21.586075, 3.4063187, -13.55706, -21.527378, 3.4402227, -13.605204, -21.345833, 3.1714065, -13.605204, -21.379738, 3.1126475, -13.55706, -21.04931, 3.1642165, -13.55706, -21.04931, 3.0964081, -13.55706, -21.669132, 3.716229, -13.55706, -21.527378, 3.4402227, -13.55706, -21.586075, 3.4063187, -13.55706, -21.04931, 3.0964081, -13.55706, -21.04931, 3.1642165, -13.55706, -20.773304, 3.238161, -13.55706, -21.669132, 3.716229, -13.55706, -21.601322, 3.716229, -13.55706, -21.527378, 3.4402227, -13.55706, -21.04931, 3.0964081, -13.55706, -20.773304, 3.238161, -13.55706, -20.7394, 3.179464, -13.563242, -21.607708, 3.9539921, -13.55706, -21.601322, 3.716229, -13.55706, -21.669132, 3.716229, -13.55706, -20.7394, 3.179464, -13.55706, -20.773304, 3.238161, -13.55706, -20.571243, 3.4402227, -13.563242, -21.607708, 3.9539921, -13.563242, -21.54901, 3.9200878, -13.55706, -21.601322, 3.716229, -13.55706, -20.7394, 3.179464, -13.55706, -20.571243, 3.4402227, -13.55706, -20.512547, 3.4063187, -13.557062, -21.35922, 4.2529936, -13.563242, -21.54901, 3.9200878, -13.563242, -21.607708, 3.9539921, -13.55706, -20.512547, 3.4063187, -13.55706, -20.571243, 3.4402227, -13.55706, -20.4973, 3.716229, -13.557062, -21.35922, 4.2529936, -13.55706, -21.325317, 4.194297, -13.563242, -21.54901, 3.9200878, -13.55706, -20.512547, 3.4063187, -13.55706, -20.4973, 3.716229, -13.55706, -20.42949, 3.716229, -13.560621, -21.078318, 4.3360496, -13.55706, -21.325317, 4.194297, -13.557062, -21.35922, 4.2529936, -13.55706, -20.42949, 3.716229, -13.55706, -20.4973, 3.716229, -13.55706, -20.571243, 3.9922352, -13.560621, -21.078318, 4.3360496, -13.560621, -21.078318, 4.268241, -13.55706, -21.325317, 4.194297, -13.55706, -20.42949, 3.716229, -13.55706, -20.571243, 3.9922352, -13.55706, -20.512547, 4.0261393, -13.557062, -20.7394, 4.2529936, -13.560621, -21.078318, 4.268241, -13.560621, -21.078318, 4.3360496, -13.55706, -20.512547, 4.0261393, -13.55706, -20.571243, 3.9922352, -13.55706, -20.773304, 4.194297, -13.557062, -20.7394, 4.2529936, -13.55706, -20.773304, 4.194297, -13.560621, -21.078318, 4.268241, -13.55706, -20.512547, 4.0261393, -13.55706, -20.773304, 4.194297, -13.557062, -20.7394, 4.2529936, -19.084044, -21.35922, 3.1794631, -19.084044, -21.527378, 3.4402218, -19.084044, -21.586075, 3.4063175, -19.084044, -21.586075, 3.4063175, -19.084044, -21.527378, 3.4402218, -19.084044, -21.601322, 3.716228, -19.084044, -21.35922, 3.1794631, -19.084044, -21.325317, 3.2381601, -19.084044, -21.527378, 3.4402218, -19.084044, -21.586075, 3.4063175, -19.084044, -21.601322, 3.716228, -19.084044, -21.669132, 3.716228, -19.084044, -21.04931, 3.0964072, -19.084044, -21.325317, 3.2381601, -19.084044, -21.35922, 3.1794631, -19.084044, -21.669132, 3.716228, -19.084044, -21.601322, 3.716228, -19.084044, -21.527378, 3.992234, -19.084044, -21.04931, 3.0964072, -19.084044, -21.04931, 3.1642156, -19.084044, -21.325317, 3.2381601, -19.084044, -21.669132, 3.716228, -19.084044, -21.527378, 3.992234, -19.084044, -21.586075, 4.0261383, -19.084044, -20.7394, 3.1794631, -19.084044, -21.04931, 3.1642156, -19.084044, -21.04931, 3.0964072, -19.084044, -21.586075, 4.0261383, -19.084044, -21.527378, 3.992234, -19.084044, -21.325317, 4.194296, -19.084044, -20.7394, 3.1794631, -19.084044, -20.773304, 3.2381601, -19.084044, -21.04931, 3.1642156, -19.084044, -21.586075, 4.0261383, -19.084044, -21.325317, 4.194296, -19.084044, -21.35922, 4.2529926, -18.82591, -20.542793, 3.4172263, -19.084044, -20.773304, 3.2381601, -19.084044, -20.7394, 3.1794631, -19.084044, -21.35922, 4.2529926, -19.084044, -21.325317, 4.194296, -19.084044, -21.04931, 4.26824, -18.82591, -20.542793, 3.4172263, -18.82591, -20.60149, 3.4511306, -19.084044, -20.773304, 3.2381601, -19.084044, -21.35922, 4.2529926, -19.084044, -21.04931, 4.26824, -19.084044, -21.04931, 4.3360486, -19.084044, -20.42949, 3.716228, -18.82591, -20.60149, 3.4511306, -18.82591, -20.542793, 3.4172263, -19.084044, -21.04931, 4.3360486, -19.084044, -21.04931, 4.26824, -19.084044, -20.773304, 4.194296, -19.084044, -20.42949, 3.716228, -19.084044, -20.4973, 3.716228, -18.82591, -20.60149, 3.4511306, -19.084044, -21.04931, 4.3360486, -19.084044, -20.773304, 4.194296, -19.084044, -20.7394, 4.2529926, -19.084044, -20.512547, 4.0261383, -19.084044, -20.4973, 3.716228, -19.084044, -20.42949, 3.716228, -19.084044, -20.7394, 4.2529926, -19.084044, -20.773304, 4.194296, -19.084044, -20.571243, 3.992234, -19.084044, -20.512547, 4.0261383, -19.084044, -20.571243, 3.992234, -19.084044, -20.4973, 3.716228, -19.084044, -20.7394, 4.2529926, -19.084044, -20.571243, 3.992234, -19.084044, -20.512547, 4.0261383, -13.55706, -21.527378, 3.4402227, -13.64679, -21.345833, 3.1714065, -13.605204, -21.345833, 3.1714065, -13.55706, -21.527378, 3.4402227, -13.598646, -21.527378, 3.4402227, -13.64679, -21.345833, 3.1714065, -13.55706, -21.601322, 3.716229, -13.598646, -21.527378, 3.4402227, -13.55706, -21.527378, 3.4402227, -13.55706, -21.601322, 3.716229, -13.598646, -21.601322, 3.716229, -13.598646, -21.527378, 3.4402227, -13.563242, -21.54901, 3.9200878, -13.598646, -21.601322, 3.716229, -13.55706, -21.601322, 3.716229, -13.563242, -21.54901, 3.9200878, -13.604641, -21.54901, 3.9200878, -13.598646, -21.601322, 3.716229, -13.55706, -21.325317, 4.194297, -13.604641, -21.54901, 3.9200878, -13.563242, -21.54901, 3.9200878, -13.55706, -21.325317, 4.194297, -13.598646, -21.325317, 4.194297, -13.604641, -21.54901, 3.9200878, -13.560621, -21.078318, 4.268241, -13.598646, -21.325317, 4.194297, -13.55706, -21.325317, 4.194297, -13.560621, -21.078318, 4.268241, -13.602205, -21.078318, 4.268241, -13.598646, -21.325317, 4.194297, -13.55706, -20.773304, 4.194297, -13.602205, -21.078318, 4.268241, -13.560621, -21.078318, 4.268241, -13.55706, -20.773304, 4.194297, -13.598646, -20.773304, 4.194297, -13.602205, -21.078318, 4.268241, -13.55706, -20.571243, 3.9922352, -13.598646, -20.773304, 4.194297, -13.55706, -20.773304, 4.194297, -13.55706, -20.571243, 3.9922352, -13.598646, -20.571243, 3.992235, -13.598646, -20.773304, 4.194297, -13.55706, -20.4973, 3.716229, -13.598646, -20.571243, 3.992235, -13.55706, -20.571243, 3.9922352, -13.55706, -20.4973, 3.716229, -13.598646, -20.4973, 3.716229, -13.598646, -20.571243, 3.992235, -13.55706, -20.571243, 3.4402227, -13.598646, -20.4973, 3.716229, -13.55706, -20.4973, 3.716229, -13.55706, -20.571243, 3.4402227, -13.598646, -20.571243, 3.4402227, -13.598646, -20.4973, 3.716229, -13.55706, -20.773304, 3.238161, -13.598646, -20.571243, 3.4402227, -13.55706, -20.571243, 3.4402227, -13.55706, -20.773304, 3.238161, -13.598646, -20.773304, 3.238161, -13.598646, -20.571243, 3.4402227, -13.55706, -21.04931, 3.1642165, -13.598646, -20.773304, 3.238161, -13.55706, -20.773304, 3.238161, -13.55706, -21.04931, 3.1642165, -13.598646, -21.04931, 3.1642165, -13.598646, -20.773304, 3.238161, -13.605204, -21.345833, 3.1714065, -13.598646, -21.04931, 3.1642165, -13.55706, -21.04931, 3.1642165, -13.605204, -21.345833, 3.1714065, -13.64679, -21.345833, 3.1714065, -13.598646, -21.04931, 3.1642165, -19.084044, -21.325317, 3.2381601, -19.042458, -21.527378, 3.4402218, -19.084044, -21.527378, 3.4402218, -19.084044, -21.325317, 3.2381601, -19.042458, -21.325317, 3.2381601, -19.042458, -21.527378, 3.4402218, -19.084044, -21.527378, 3.4402218, -19.042458, -21.601322, 3.716228, -19.084044, -21.601322, 3.716228, -19.084044, -21.527378, 3.4402218, -19.042458, -21.527378, 3.4402218, -19.042458, -21.601322, 3.716228, -19.084044, -21.601322, 3.716228, -19.042458, -21.527378, 3.992234, -19.084044, -21.527378, 3.992234, -19.084044, -21.601322, 3.716228, -19.042458, -21.601322, 3.716228, -19.042458, -21.527378, 3.992234, -19.084044, -21.527378, 3.992234, -19.042458, -21.325317, 4.194296, -19.084044, -21.325317, 4.194296, -19.084044, -21.527378, 3.992234, -19.042458, -21.527378, 3.992234, -19.042458, -21.325317, 4.194296, -19.084044, -21.325317, 4.194296, -19.042458, -21.04931, 4.26824, -19.084044, -21.04931, 4.26824, -19.084044, -21.325317, 4.194296, -19.042458, -21.325317, 4.194296, -19.042458, -21.04931, 4.26824, -19.084044, -21.04931, 4.26824, -19.042458, -21.04931, 4.26824, -19.042458, -20.773304, 4.194296, -19.084044, -21.04931, 4.26824, -19.042458, -20.773304, 4.194296, -19.084044, -20.773304, 4.194296, -19.084044, -20.773304, 4.194296, -19.042458, -20.571243, 3.992234, -19.084044, -20.571243, 3.992234, -19.084044, -20.773304, 4.194296, -19.042458, -20.773304, 4.194296, -19.042458, -20.571243, 3.992234, -19.084044, -20.571243, 3.992234, -19.042458, -20.4973, 3.716228, -19.084044, -20.4973, 3.716228, -19.084044, -20.571243, 3.992234, -19.042458, -20.571243, 3.992234, -19.042458, -20.4973, 3.716228, -19.084044, -20.4973, 3.716228, -18.784327, -20.60149, 3.4511306, -18.82591, -20.60149, 3.4511306, -19.084044, -20.4973, 3.716228, -19.042458, -20.4973, 3.716228, -18.784327, -20.60149, 3.4511306, -18.82591, -20.60149, 3.4511306, -19.042458, -20.773304, 3.2381601, -19.084044, -20.773304, 3.2381601, -18.82591, -20.60149, 3.4511306, -18.784327, -20.60149, 3.4511306, -19.042458, -20.773304, 3.2381601, -19.084044, -20.773304, 3.2381601, -19.042458, -21.04931, 3.1642156, -19.084044, -21.04931, 3.1642156, -19.084044, -20.773304, 3.2381601, -19.042458, -20.773304, 3.2381601, -19.042458, -21.04931, 3.1642156, -19.084044, -21.04931, 3.1642156, -19.042458, -21.04931, 3.1642156, -19.042458, -21.325317, 3.2381601, -19.084044, -21.04931, 3.1642156, -19.042458, -21.325317, 3.2381601, -19.084044, -21.325317, 3.2381601, -0.49230337, 3.2260702, -2.5408025, -0.2174604, 3.7041378, -2.5661154, -0.75557137, 3.4076157, -2.4682097, -0.75557137, 3.4076157, -2.4682097, -0.2174604, 3.7041378, -2.5661154, -0.7671461, 3.7041378, -2.5154896, -0.2174604, 3.1521254, -2.5661154, -0.2174604, 3.7041378, -2.5661154, -0.49230337, 3.2260702, -2.5408025, -0.7671461, 3.7041378, -2.5154896, -0.2174604, 3.7041378, -2.5661154, -0.6935134, 3.980144, -2.5222712, -0.01391077, 3.2044384, -2.5788422, -0.2174604, 3.7041378, -2.5661154, -0.2174604, 3.1521254, -2.5661154, -0.6935134, 3.980144, -2.5222712, -0.2174604, 3.7041378, -2.5661154, -0.49230337, 4.1822057, -2.5408025, 0.2585926, 3.4281316, -2.6099591, -0.2174604, 3.7041378, -2.5661154, -0.01391077, 3.2044384, -2.5788422, -0.49230337, 4.1822057, -2.5408025, -0.2174604, 3.7041378, -2.5661154, -0.2174604, 4.2561502, -2.5661154, 0.33255196, 3.6751301, -2.6131968, -0.2174604, 3.7041378, -2.5661154, 0.2585926, 3.4281316, -2.6099591, -0.2174604, 4.2561502, -2.5661154, -0.2174604, 3.7041378, -2.5661154, 0.057382584, 4.1822057, -2.5914283, 0.2585926, 3.980144, -2.6099591, -0.2174604, 3.7041378, -2.5661154, 0.33255196, 3.6751301, -2.6131968, 0.057382584, 4.1822057, -2.5914283, -0.2174604, 3.7041378, -2.5661154, 0.2585926, 3.980144, -2.6099591, -0.19425559, 3.4281316, 2.8985977, 0.2817974, 3.7041378, 2.8547535, 0.0069544315, 3.2260702, 2.8800664, 0.0069544315, 3.2260702, 2.8800664, 0.2817974, 3.7041378, 2.8547535, 0.2817974, 3.1521254, 2.8547535, -0.26788855, 3.7041378, 2.9053793, 0.2817974, 3.7041378, 2.8547535, -0.19425559, 3.4281316, 2.8985977, 0.2817974, 3.1521254, 2.8547535, 0.2817974, 3.7041378, 2.8547535, 0.55664027, 3.2260702, 2.8294406, -0.19425559, 3.980144, 2.8985977, 0.2817974, 3.7041378, 2.8547535, -0.26788855, 3.7041378, 2.9053793, 0.55664027, 3.2260702, 2.8294406, 0.2817974, 3.7041378, 2.8547535, 0.75785017, 3.4281316, 2.8109093, -0.0058562756, 4.1519585, 2.6220222, 0.2817974, 3.7041378, 2.8547535, -0.19425559, 3.980144, 2.8985977, 0.75785017, 3.4281316, 2.8109093, 0.2817974, 3.7041378, 2.8547535, 0.8314831, 3.7041378, 2.8041277, 0.2817974, 4.2561502, 2.8547535, 0.2817974, 3.7041378, 2.8547535, -0.0058562756, 4.1519585, 2.6220222, 0.8314831, 3.7041378, 2.8041277, 0.2817974, 3.7041378, 2.8547535, 0.75785017, 3.980144, 2.8109093, 0.55664027, 4.1822057, 2.8294406, 0.2817974, 3.7041378, 2.8547535, 0.2817974, 4.2561502, 2.8547535, 0.75785017, 3.980144, 2.8109093, 0.2817974, 3.7041378, 2.8547535, 0.55664027, 4.1822057, 2.8294406, -0.6072962, 3.4283175, -1.5901942, -0.41204357, 3.7041378, 1.3367851, -0.33841062, 3.4283175, 1.3300035, -0.33841062, 3.4283175, 1.3300035, -0.022993088, 3.1673732, 2.9245868, -0.1373241, 3.2263799, 1.3114836, -0.33841062, 3.4283175, 1.3300035, -0.24889135, 3.3942275, 2.9453917, -0.022993088, 3.1673732, 2.9245868, -0.41204357, 3.7041378, 1.3367851, -0.24889135, 3.3942275, 2.9453917, -0.33841062, 3.4283175, 1.3300035, -0.33841062, 3.4283175, 1.3300035, -0.1373241, 3.2263799, 1.3114836, -0.40790343, 3.2264419, -1.6264291, -0.33841062, 3.4283175, 1.3300035, -0.40790343, 3.2264419, -1.6264291, -0.6072962, 3.4283175, -1.5901942, -0.41204357, 3.7041378, 1.3367851, -0.33159733, 3.7041378, 2.9530087, -0.24889135, 3.3942275, 2.9453917, -0.81789684, 3.3737113, -2.5042315, -0.6072962, 3.4283175, -1.5901942, -0.40790343, 3.2264419, -1.6264291, -0.81789684, 3.3737113, -2.5042315, -0.40790343, 3.2264419, -1.6264291, -0.5298786, 3.1673732, -2.5791035, -0.83848286, 3.7041378, -2.5506816, -0.6072962, 3.4283175, -1.5901942, -0.81789684, 3.3737113, -2.5042315, -0.83848286, 3.7041378, -2.5506816, -0.6822865, 3.7041378, -1.5981488, -0.6072962, 3.4283175, -1.5901942, -0.6072962, 3.4283175, -1.5901942, -0.6822865, 3.7041378, -1.5981488, -0.41204357, 3.7041378, 1.3367851, -0.7557769, 4.014048, -2.5582986, -0.6822865, 3.7041378, -1.5981488, -0.83848286, 3.7041378, -2.5506816, -0.33841062, 3.979958, 1.3300035, -0.33159733, 3.7041378, 2.9530087, -0.41204357, 3.7041378, 1.3367851, -0.33841062, 3.979958, 1.3300035, -0.41204357, 3.7041378, 1.3367851, -0.6822865, 3.7041378, -1.5981488, -0.33841062, 3.979958, 1.3300035, -0.24889135, 4.014048, 2.9453917, -0.33159733, 3.7041378, 2.9530087, -0.1373241, 4.1818957, 1.3114836, -0.24889135, 4.014048, 2.9453917, -0.33841062, 3.979958, 1.3300035, -0.1373241, 4.1818957, 1.3114836, -0.035803795, 4.210655, 2.666542, -0.24889135, 4.014048, 2.9453917, -0.33841062, 3.979958, 1.3300035, -0.6822865, 3.7041378, -1.5981488, -0.6096499, 3.979958, -1.6157494, -0.1373241, 4.1818957, 1.3114836, -0.33841062, 3.979958, 1.3300035, -0.6096499, 3.979958, -1.6157494, -0.7557769, 4.014048, -2.5582986, -0.6096499, 3.979958, -1.6157494, -0.6822865, 3.7041378, -1.5981488, -0.1373241, 4.1818957, 1.3114836, -0.6096499, 3.979958, -1.6157494, -0.40862513, 4.1818337, -1.6342635, -0.5298786, 4.2409024, -2.5791035, -0.6096499, 3.979958, -1.6157494, -0.7557769, 4.014048, -2.5582986, -0.5298786, 4.2409024, -2.5791035, -0.40862513, 4.1818337, -1.6342635, -0.6096499, 3.979958, -1.6157494, -0.1373241, 3.2263799, 1.3114836, -0.13396716, 3.1524973, -1.6595592, -0.40790343, 3.2264419, -1.6264291, -0.5298786, 3.1673732, -2.5791035, -0.40790343, 3.2264419, -1.6264291, -0.13396716, 3.1524973, -1.6595592, -0.5298786, 3.1673732, -2.5791035, -0.13396716, 3.1524973, -1.6595592, -0.22127414, 3.0843172, -2.6075258, -0.22127414, 3.0843172, -2.6075258, -0.13396716, 3.1524973, -1.6595592, 0.14091396, 3.2264419, -1.68243, -0.22127414, 3.0843172, -2.6075258, 0.14091396, 3.2264419, -1.68243, 0.016053915, 3.1457415, -2.6231756, 0.13733363, 3.1524353, 1.2861879, 0.14091396, 3.2264419, -1.68243, -0.13396716, 3.1524973, -1.6595592, -0.1373241, 3.2263799, 1.3114836, 0.13733363, 3.1524353, 1.2861879, -0.13396716, 3.1524973, -1.6595592, 0.13733363, 3.1524353, 1.2861879, 0.4119916, 3.2263799, 1.2608922, 0.14091396, 3.2264419, -1.68243, 0.13733363, 3.1524353, 1.2861879, 0.5942155, 3.1673732, 2.867742, 0.4119916, 3.2263799, 1.2608922, 0.13733363, 3.1524353, 1.2861879, 0.28561115, 3.0843172, 2.8961644, 0.5942155, 3.1673732, 2.867742, -0.1373241, 3.2263799, 1.3114836, 0.28561115, 3.0843172, 2.8961644, 0.13733363, 3.1524353, 1.2861879, -0.1373241, 3.2263799, 1.3114836, -0.022993088, 3.1673732, 2.9245868, 0.28561115, 3.0843172, 2.8961644, 0.4119916, 3.2263799, 1.2608922, 0.34171534, 3.4283175, -1.7033694, 0.14091396, 3.2264419, -1.68243, 0.016053915, 3.1457415, -2.6231756, 0.14091396, 3.2264419, -1.68243, 0.34171534, 3.4283175, -1.7033694, 0.016053915, 3.1457415, -2.6231756, 0.34171534, 3.4283175, -1.7033694, 0.31322837, 3.3942275, -2.656753, 0.31322837, 3.3942275, -2.656753, 0.34171534, 3.4283175, -1.7033694, 0.4155202, 3.7041378, -1.7082856, 0.31322837, 3.3942275, -2.656753, 0.4155202, 3.7041378, -1.7082856, 0.39626074, 3.6751301, -2.6608262, 0.4119916, 3.2263799, 1.2608922, 0.613078, 3.4283175, 1.2423723, 0.34171534, 3.4283175, -1.7033694, 0.613078, 3.4283175, 1.2423723, 0.4155202, 3.7041378, -1.7082856, 0.34171534, 3.4283175, -1.7033694, 0.4119916, 3.2263799, 1.2608922, 0.8201138, 3.3942275, 2.8469372, 0.613078, 3.4283175, 1.2423723, 0.4119916, 3.2263799, 1.2608922, 0.5942155, 3.1673732, 2.867742, 0.8201138, 3.3942275, 2.8469372, 0.613078, 3.4283175, 1.2423723, 0.8201138, 3.3942275, 2.8469372, 0.90281975, 3.7041378, 2.8393202, 0.613078, 3.4283175, 1.2423723, 0.90281975, 3.7041378, 2.8393202, 0.68671095, 3.7041378, 1.2355907, 0.613078, 3.4283175, 1.2423723, 0.68671095, 3.7041378, 1.2355907, 0.4155202, 3.7041378, -1.7082856, 0.68671095, 3.7041378, 1.2355907, 0.90281975, 3.7041378, 2.8393202, 0.8201138, 4.014048, 2.8469372, 0.39626074, 3.6751301, -2.6608262, 0.4155202, 3.7041378, -1.7082856, 0.2700441, 3.9583263, -1.6948872, 0.68671095, 3.7041378, 1.2355907, 0.2700441, 3.9583263, -1.6948872, 0.4155202, 3.7041378, -1.7082856, 0.39626074, 3.6751301, -2.6608262, 0.2700441, 3.9583263, -1.6948872, 0.31322837, 4.014048, -2.656753, 0.68671095, 3.7041378, 1.2355907, 0.8201138, 4.014048, 2.8469372, 0.613078, 3.979958, 1.2423723, 0.68671095, 3.7041378, 1.2355907, 0.613078, 3.979958, 1.2423723, 0.2700441, 3.9583263, -1.6948872, 0.613078, 3.979958, 1.2423723, 0.8201138, 4.014048, 2.8469372, 0.5942155, 4.2409024, 2.867742, 0.613078, 3.979958, 1.2423723, 0.5942155, 4.2409024, 2.867742, 0.4119916, 4.1818957, 1.2608922, 0.613078, 3.979958, 1.2423723, 0.4119916, 4.1818957, 1.2608922, 0.14069057, 4.1818337, -1.684855, 0.613078, 3.979958, 1.2423723, 0.14069057, 4.1818337, -1.684855, 0.2700441, 3.9583263, -1.6948872, 0.31322837, 4.014048, -2.656753, 0.2700441, 3.9583263, -1.6948872, 0.14069057, 4.1818337, -1.684855, 0.31322837, 4.014048, -2.656753, 0.14069057, 4.1818337, -1.684855, 0.0873301, 4.2409024, -2.6359482, 0.4119916, 4.1818957, 1.2608922, -0.13396716, 4.2557163, -1.6595592, 0.14069057, 4.1818337, -1.684855, 0.0873301, 4.2409024, -2.6359482, 0.14069057, 4.1818337, -1.684855, -0.13396716, 4.2557163, -1.6595592, 0.0873301, 4.2409024, -2.6359482, -0.13396716, 4.2557163, -1.6595592, -0.22127414, 4.3239584, -2.6075258, -0.22127414, 4.3239584, -2.6075258, -0.13396716, 4.2557163, -1.6595592, -0.40862513, 4.1818337, -1.6342635, -0.22127414, 4.3239584, -2.6075258, -0.40862513, 4.1818337, -1.6342635, -0.5298786, 4.2409024, -2.5791035, 0.13733363, 4.2558403, 1.2861879, -0.40862513, 4.1818337, -1.6342635, -0.13396716, 4.2557163, -1.6595592, 0.4119916, 4.1818957, 1.2608922, 0.13733363, 4.2558403, 1.2861879, -0.13396716, 4.2557163, -1.6595592, 0.13733363, 4.2558403, 1.2861879, -0.1373241, 4.1818957, 1.3114836, -0.40862513, 4.1818337, -1.6342635, 0.13733363, 4.2558403, 1.2861879, -0.035803795, 4.210655, 2.666542, -0.1373241, 4.1818957, 1.3114836, 0.13733363, 4.2558403, 1.2861879, 0.28561115, 4.3239584, 2.8961644, -0.035803795, 4.210655, 2.666542, 0.4119916, 4.1818957, 1.2608922, 0.28561115, 4.3239584, 2.8961644, 0.13733363, 4.2558403, 1.2861879, 0.4119916, 4.1818957, 1.2608922, 0.5942155, 4.2409024, 2.867742, 0.28561115, 4.3239584, 2.8961644, -0.24889135, 3.3942275, 2.9453917, -0.022993088, 3.1673732, 2.9245868, -0.022993088, 3.1673732, 2.9245868, -0.022993088, 3.1673732, 2.9245868, -0.022993088, 3.1673732, 2.9245868, 0.28561115, 3.0843172, 2.8961644, -0.24889135, 3.3942275, 2.9453917, -0.24889135, 3.3942275, 2.9453917, -0.022993088, 3.1673732, 2.9245868, -0.33159733, 3.7041378, 2.9530087, -0.24889135, 3.3942275, 2.9453917, -0.24889135, 3.3942275, 2.9453917, -0.33159733, 3.7041378, 2.9530087, -0.33159733, 3.7041378, 2.9530087, -0.24889135, 3.3942275, 2.9453917, -0.022993088, 3.1673732, 2.9245868, 0.28561115, 3.0843172, 2.8961644, 0.28561115, 3.0843172, 2.8961644, 0.28561115, 3.0843172, 2.8961644, 0.28561115, 3.0843172, 2.8961644, 0.5942155, 3.1673732, 2.867742, 0.28561115, 3.0843172, 2.8961644, 0.5942155, 3.1673732, 2.867742, 0.5942155, 3.1673732, 2.867742, 0.5942155, 3.1673732, 2.867742, 0.5942155, 3.1673732, 2.867742, 0.8201138, 3.3942275, 2.8469372, 0.5942155, 3.1673732, 2.867742, 0.8201138, 3.3942275, 2.8469372, 0.8201138, 3.3942275, 2.8469372, 0.8201138, 3.3942275, 2.8469372, 0.8201138, 3.3942275, 2.8469372, 0.90281975, 3.7041378, 2.8393202, 0.8201138, 3.3942275, 2.8469372, 0.90281975, 3.7041378, 2.8393202, 0.90281975, 3.7041378, 2.8393202, 0.90281975, 3.7041378, 2.8393202, 0.90281975, 3.7041378, 2.8393202, 0.8201138, 4.014048, 2.8469372, 0.90281975, 3.7041378, 2.8393202, 0.8201138, 4.014048, 2.8469372, 0.8201138, 4.014048, 2.8469372, 0.8201138, 4.014048, 2.8469372, 0.8201138, 4.014048, 2.8469372, 0.5942155, 4.2409024, 2.867742, 0.8201138, 4.014048, 2.8469372, 0.5942155, 4.2409024, 2.867742, 0.5942155, 4.2409024, 2.867742, 0.5942155, 4.2409024, 2.867742, 0.5942155, 4.2409024, 2.867742, 0.28561115, 4.3239584, 2.8961644, 0.5942155, 4.2409024, 2.867742, 0.28561115, 4.3239584, 2.8961644, 0.28561115, 4.3239584, 2.8961644, 0.28561115, 4.3239584, 2.8961644, 0.28561115, 4.3239584, 2.8961644, -0.035803795, 4.210655, 2.666542, 0.28561115, 4.3239584, 2.8961644, -0.035803795, 4.210655, 2.666542, -0.035803795, 4.210655, 2.666542, -0.035803795, 4.210655, 2.666542, -0.24889135, 4.014048, 2.9453917, -0.24889135, 4.014048, 2.9453917, -0.035803795, 4.210655, 2.666542, -0.035803795, 4.210655, 2.666542, -0.24889135, 4.014048, 2.9453917, -0.24889135, 4.014048, 2.9453917, -0.33159733, 3.7041378, 2.9530087, -0.33159733, 3.7041378, 2.9530087, -0.24889135, 4.014048, 2.9453917, -0.24889135, 4.014048, 2.9453917, -0.33159733, 3.7041378, 2.9530087, -0.5298786, 3.1673732, -2.5791035, -0.75938535, 3.4076157, -2.5096202, -0.81789684, 3.3737113, -2.5042315, -0.81789684, 3.3737113, -2.5042315, -0.75938535, 3.4076157, -2.5096202, -0.7709601, 3.7041378, -2.5569, -0.5298786, 3.1673732, -2.5791035, -0.49611712, 3.2260702, -2.582213, -0.75938535, 3.4076157, -2.5096202, -0.81789684, 3.3737113, -2.5042315, -0.7709601, 3.7041378, -2.5569, -0.83848286, 3.7041378, -2.5506816, -0.22127414, 3.0843172, -2.6075258, -0.49611712, 3.2260702, -2.582213, -0.5298786, 3.1673732, -2.5791035, -0.83848286, 3.7041378, -2.5506816, -0.7709601, 3.7041378, -2.5569, -0.69732714, 3.980144, -2.5636816, -0.22127414, 3.0843172, -2.6075258, -0.22127414, 3.1521254, -2.6075258, -0.49611712, 3.2260702, -2.582213, -0.83848286, 3.7041378, -2.5506816, -0.69732714, 3.980144, -2.5636816, -0.7557769, 4.014048, -2.5582986, 0.016053915, 3.1457415, -2.6231756, -0.22127414, 3.1521254, -2.6075258, -0.22127414, 3.0843172, -2.6075258, -0.7557769, 4.014048, -2.5582986, -0.69732714, 3.980144, -2.5636816, -0.49611712, 4.1822057, -2.582213, 0.016053915, 3.1457415, -2.6231756, -0.017707348, 3.2044384, -2.6200662, -0.22127414, 3.1521254, -2.6075258, -0.7557769, 4.014048, -2.5582986, -0.49611712, 4.1822057, -2.582213, -0.5298786, 4.2409024, -2.5791035, 0.31322837, 3.3942275, -2.656753, -0.017707348, 3.2044384, -2.6200662, 0.016053915, 3.1457415, -2.6231756, -0.5298786, 4.2409024, -2.5791035, -0.49611712, 4.1822057, -2.582213, -0.22127414, 4.2561502, -2.6075258, 0.31322837, 3.3942275, -2.656753, 0.25477862, 3.4281316, -2.65137, -0.017707348, 3.2044384, -2.6200662, -0.5298786, 4.2409024, -2.5791035, -0.22127414, 4.2561502, -2.6075258, -0.22127414, 4.3239584, -2.6075258, 0.39626074, 3.6751301, -2.6608262, 0.25477862, 3.4281316, -2.65137, 0.31322837, 3.3942275, -2.656753, -0.22127414, 4.3239584, -2.6075258, -0.22127414, 4.2561502, -2.6075258, 0.05356884, 4.1822057, -2.6328387, 0.39626074, 3.6751301, -2.6608262, 0.32873797, 3.6751301, -2.6546073, 0.25477862, 3.4281316, -2.65137, -0.22127414, 4.3239584, -2.6075258, 0.05356884, 4.1822057, -2.6328387, 0.0873301, 4.2409024, -2.6359482, 0.31322837, 4.014048, -2.656753, 0.32873797, 3.6751301, -2.6546073, 0.39626074, 3.6751301, -2.6608262, 0.0873301, 4.2409024, -2.6359482, 0.05356884, 4.1822057, -2.6328387, 0.25477862, 3.980144, -2.65137, 0.31322837, 4.014048, -2.656753, 0.25477862, 3.980144, -2.65137, 0.32873797, 3.6751301, -2.6546073, 0.0873301, 4.2409024, -2.6359482, 0.25477862, 3.980144, -2.65137, 0.31322837, 4.014048, -2.656753, -0.24889135, 3.3942275, 2.9453917, 0.010768175, 3.2260702, 2.9214773, -0.022993088, 3.1673732, 2.9245868, -0.022993088, 3.1673732, 2.9245868, 0.010768175, 3.2260702, 2.9214773, 0.28561115, 3.1521254, 2.8961644, -0.24889135, 3.3942275, 2.9453917, -0.19044161, 3.4281316, 2.9400086, 0.010768175, 3.2260702, 2.9214773, -0.022993088, 3.1673732, 2.9245868, 0.28561115, 3.1521254, 2.8961644, 0.28561115, 3.0843172, 2.8961644, -0.33159733, 3.7041378, 2.9530087, -0.19044161, 3.4281316, 2.9400086, -0.24889135, 3.3942275, 2.9453917, 0.28561115, 3.0843172, 2.8961644, 0.28561115, 3.1521254, 2.8961644, 0.56045413, 3.2260702, 2.8708515, -0.33159733, 3.7041378, 2.9530087, -0.2640748, 3.7041378, 2.9467902, -0.19044161, 3.4281316, 2.9400086, 0.28561115, 3.0843172, 2.8961644, 0.56045413, 3.2260702, 2.8708515, 0.5942155, 3.1673732, 2.867742, -0.24889135, 4.014048, 2.9453917, -0.2640748, 3.7041378, 2.9467902, -0.33159733, 3.7041378, 2.9530087, 0.5942155, 3.1673732, 2.867742, 0.56045413, 3.2260702, 2.8708515, 0.76166415, 3.4281316, 2.8523202, -0.24889135, 4.014048, 2.9453917, -0.19044161, 3.980144, 2.9400086, -0.2640748, 3.7041378, 2.9467902, 0.5942155, 3.1673732, 2.867742, 0.76166415, 3.4281316, 2.8523202, 0.8201138, 3.3942275, 2.8469372, -0.035803795, 4.210655, 2.666542, -0.19044161, 3.980144, 2.9400086, -0.24889135, 4.014048, 2.9453917, 0.8201138, 3.3942275, 2.8469372, 0.76166415, 3.4281316, 2.8523202, 0.8352971, 3.7041378, 2.8455386, -0.035803795, 4.210655, 2.666542, -0.002042532, 4.1519585, 2.6634326, -0.19044161, 3.980144, 2.9400086, 0.8201138, 3.3942275, 2.8469372, 0.8352971, 3.7041378, 2.8455386, 0.90281975, 3.7041378, 2.8393202, 0.28561115, 4.3239584, 2.8961644, -0.002042532, 4.1519585, 2.6634326, -0.035803795, 4.210655, 2.666542, 0.90281975, 3.7041378, 2.8393202, 0.8352971, 3.7041378, 2.8455386, 0.76166415, 3.980144, 2.8523202, 0.28561115, 4.3239584, 2.8961644, 0.28561115, 4.2561502, 2.8961644, -0.002042532, 4.1519585, 2.6634326, 0.90281975, 3.7041378, 2.8393202, 0.76166415, 3.980144, 2.8523202, 0.8201138, 4.014048, 2.8469372, 0.5942155, 4.2409024, 2.867742, 0.28561115, 4.2561502, 2.8961644, 0.28561115, 4.3239584, 2.8961644, 0.8201138, 4.014048, 2.8469372, 0.76166415, 3.980144, 2.8523202, 0.56045413, 4.1822057, 2.8708515, 0.5942155, 4.2409024, 2.867742, 0.56045413, 4.1822057, 2.8708515, 0.28561115, 4.2561502, 2.8961644, 0.8201138, 4.014048, 2.8469372, 0.56045413, 4.1822057, 2.8708515, 0.5942155, 4.2409024, 2.867742, -0.49611712, 3.2260702, -2.582213, -0.75557137, 3.4076157, -2.4682097, -0.75938535, 3.4076157, -2.5096202, -0.49611712, 3.2260702, -2.582213, -0.49230337, 3.2260702, -2.5408025, -0.75557137, 3.4076157, -2.4682097, -0.22127414, 3.1521254, -2.6075258, -0.49230337, 3.2260702, -2.5408025, -0.49611712, 3.2260702, -2.582213, -0.22127414, 3.1521254, -2.6075258, -0.2174604, 3.1521254, -2.5661154, -0.49230337, 3.2260702, -2.5408025, -0.017707348, 3.2044384, -2.6200662, -0.2174604, 3.1521254, -2.5661154, -0.22127414, 3.1521254, -2.6075258, -0.017707348, 3.2044384, -2.6200662, -0.01391077, 3.2044384, -2.5788422, -0.2174604, 3.1521254, -2.5661154, 0.25477862, 3.4281316, -2.65137, -0.01391077, 3.2044384, -2.5788422, -0.017707348, 3.2044384, -2.6200662, 0.25477862, 3.4281316, -2.65137, 0.2585926, 3.4281316, -2.6099591, -0.01391077, 3.2044384, -2.5788422, 0.32873797, 3.6751301, -2.6546073, 0.2585926, 3.4281316, -2.6099591, 0.25477862, 3.4281316, -2.65137, 0.32873797, 3.6751301, -2.6546073, 0.33255196, 3.6751301, -2.6131968, 0.2585926, 3.4281316, -2.6099591, 0.25477862, 3.980144, -2.65137, 0.33255196, 3.6751301, -2.6131968, 0.32873797, 3.6751301, -2.6546073, 0.25477862, 3.980144, -2.65137, 0.2585926, 3.980144, -2.6099591, 0.33255196, 3.6751301, -2.6131968, 0.05356884, 4.1822057, -2.6328387, 0.2585926, 3.980144, -2.6099591, 0.25477862, 3.980144, -2.65137, 0.05356884, 4.1822057, -2.6328387, 0.057382584, 4.1822057, -2.5914283, 0.2585926, 3.980144, -2.6099591, -0.22127414, 4.2561502, -2.6075258, 0.057382584, 4.1822057, -2.5914283, 0.05356884, 4.1822057, -2.6328387, -0.22127414, 4.2561502, -2.6075258, -0.2174604, 4.2561502, -2.5661154, 0.057382584, 4.1822057, -2.5914283, -0.49611712, 4.1822057, -2.582213, -0.2174604, 4.2561502, -2.5661154, -0.22127414, 4.2561502, -2.6075258, -0.49611712, 4.1822057, -2.582213, -0.49230337, 4.1822057, -2.5408025, -0.2174604, 4.2561502, -2.5661154, -0.69732714, 3.980144, -2.5636816, -0.49230337, 4.1822057, -2.5408025, -0.49611712, 4.1822057, -2.582213, -0.69732714, 3.980144, -2.5636816, -0.6935134, 3.980144, -2.5222712, -0.49230337, 4.1822057, -2.5408025, -0.7709601, 3.7041378, -2.5569, -0.6935134, 3.980144, -2.5222712, -0.69732714, 3.980144, -2.5636816, -0.7709601, 3.7041378, -2.5569, -0.7671461, 3.7041378, -2.5154896, -0.6935134, 3.980144, -2.5222712, -0.75938535, 3.4076157, -2.5096202, -0.7671461, 3.7041378, -2.5154896, -0.7709601, 3.7041378, -2.5569, -0.75938535, 3.4076157, -2.5096202, -0.75557137, 3.4076157, -2.4682097, -0.7671461, 3.7041378, -2.5154896, -0.19044161, 3.4281316, 2.9400086, 0.0069544315, 3.2260702, 2.8800664, 0.010768175, 3.2260702, 2.9214773, -0.19044161, 3.4281316, 2.9400086, -0.19425559, 3.4281316, 2.8985977, 0.0069544315, 3.2260702, 2.8800664, 0.010768175, 3.2260702, 2.9214773, 0.2817974, 3.1521254, 2.8547535, 0.28561115, 3.1521254, 2.8961644, 0.010768175, 3.2260702, 2.9214773, 0.0069544315, 3.2260702, 2.8800664, 0.2817974, 3.1521254, 2.8547535, 0.28561115, 3.1521254, 2.8961644, 0.55664027, 3.2260702, 2.8294406, 0.56045413, 3.2260702, 2.8708515, 0.28561115, 3.1521254, 2.8961644, 0.2817974, 3.1521254, 2.8547535, 0.55664027, 3.2260702, 2.8294406, 0.56045413, 3.2260702, 2.8708515, 0.75785017, 3.4281316, 2.8109093, 0.76166415, 3.4281316, 2.8523202, 0.56045413, 3.2260702, 2.8708515, 0.55664027, 3.2260702, 2.8294406, 0.75785017, 3.4281316, 2.8109093, 0.76166415, 3.4281316, 2.8523202, 0.8314831, 3.7041378, 2.8041277, 0.8352971, 3.7041378, 2.8455386, 0.76166415, 3.4281316, 2.8523202, 0.75785017, 3.4281316, 2.8109093, 0.8314831, 3.7041378, 2.8041277, 0.8352971, 3.7041378, 2.8455386, 0.8314831, 3.7041378, 2.8041277, 0.75785017, 3.980144, 2.8109093, 0.8352971, 3.7041378, 2.8455386, 0.75785017, 3.980144, 2.8109093, 0.76166415, 3.980144, 2.8523202, 0.76166415, 3.980144, 2.8523202, 0.55664027, 4.1822057, 2.8294406, 0.56045413, 4.1822057, 2.8708515, 0.76166415, 3.980144, 2.8523202, 0.75785017, 3.980144, 2.8109093, 0.55664027, 4.1822057, 2.8294406, 0.56045413, 4.1822057, 2.8708515, 0.2817974, 4.2561502, 2.8547535, 0.28561115, 4.2561502, 2.8961644, 0.56045413, 4.1822057, 2.8708515, 0.55664027, 4.1822057, 2.8294406, 0.2817974, 4.2561502, 2.8547535, 0.28561115, 4.2561502, 2.8961644, -0.0058562756, 4.1519585, 2.6220222, -0.002042532, 4.1519585, 2.6634326, 0.28561115, 4.2561502, 2.8961644, 0.2817974, 4.2561502, 2.8547535, -0.0058562756, 4.1519585, 2.6220222, -0.002042532, 4.1519585, 2.6634326, -0.19425559, 3.980144, 2.8985977, -0.19044161, 3.980144, 2.9400086, -0.002042532, 4.1519585, 2.6634326, -0.0058562756, 4.1519585, 2.6220222, -0.19425559, 3.980144, 2.8985977, -0.19044161, 3.980144, 2.9400086, -0.26788855, 3.7041378, 2.9053793, -0.2640748, 3.7041378, 2.9467902, -0.19044161, 3.980144, 2.9400086, -0.19425559, 3.980144, 2.8985977, -0.26788855, 3.7041378, 2.9053793, -0.2640748, 3.7041378, 2.9467902, -0.26788855, 3.7041378, 2.9053793, -0.19425559, 3.4281316, 2.8985977, -0.2640748, 3.7041378, 2.9467902, -0.19425559, 3.4281316, 2.8985977, -0.19044161, 3.4281316, 2.9400086, -5.555945, -21.30843, 0.44781768, -3.54707, -21.129436, 0.3570392, -5.555945, -21.129436, 0.44781768, -5.555945, -21.30843, 0.44781768, -3.54707, -21.30843, 0.3570392, -3.54707, -21.129436, 0.3570392, -7.629112, -21.129436, 0.3570392, -5.555945, -21.30843, 0.44781768, -5.555945, -21.129436, 0.44781768, -7.629112, -21.129436, 0.3570392, -7.629112, -21.30843, 0.3570392, -5.555945, -21.30843, 0.44781768, -5.555945, -21.30843, 0.9271282, -3.54707, -21.30843, 0.3570392, -5.555945, -21.30843, 0.44781768, -5.555945, -21.30843, 0.9271282, -3.54707, -21.30843, 0.7632997, -3.54707, -21.30843, 0.3570392, -5.555945, -21.30843, 0.44781768, -7.629112, -21.30843, 0.91196275, -5.555945, -21.30843, 0.9271282, -5.555945, -21.30843, 0.44781768, -7.629112, -21.30843, 0.62980187, -7.629112, -21.30843, 0.91196275, -7.629112, -21.30843, 0.62980187, -5.555945, -21.30843, 0.44781768, -7.629112, -21.30843, 0.3570392, -3.54707, -21.30843, 0.7632997, -3.54707, -21.129436, 0.3570392, -3.54707, -21.30843, 0.3570392, -3.54707, -21.30843, 0.7632997, -3.54707, -21.129435, 0.7632997, -3.54707, -21.129436, 0.3570392, -7.629112, -21.129436, 0.5971217, -7.5507226, -21.183048, 0.6447537, -7.629112, -21.30843, 0.62980187, -5.555945, -21.129435, 0.80730057, -5.555945, -21.174292, 0.9271282, -6.0741305, -21.129435, 0.92328346, -5.555945, -21.129435, 0.80730057, -5.0537796, -21.129435, 0.8861177, -5.555945, -21.174292, 0.9271282, -5.555945, -21.129435, 0.80730057, -3.54707, -21.129435, 0.7632997, -5.0537796, -21.129435, 0.8861177, -5.555945, -21.129435, 0.80730057, -3.54707, -21.129436, 0.3570392, -3.54707, -21.129435, 0.7632997, -3.54707, -21.129436, 0.3570392, -5.555945, -21.129435, 0.80730057, -5.555945, -21.129436, 0.44781768, -6.0741305, -21.129435, 0.92328346, -5.555945, -21.129436, 0.44781768, -5.555945, -21.129435, 0.80730057, -5.555945, -21.129436, 0.44781768, -7.629112, -21.129436, 0.5971217, -7.629112, -21.129436, 0.3570392, -5.555945, -21.129436, 0.44781768, -7.2726197, -21.129435, 0.6462488, -7.629112, -21.129436, 0.5971217, -6.0741305, -21.129435, 0.92328346, -7.2726197, -21.129435, 0.6462488, -5.555945, -21.129436, 0.44781768, -7.5507226, -21.183048, 0.6447537, -7.629112, -21.129436, 0.5971217, -7.2726197, -21.129435, 0.6462488, -7.629112, -21.129435, 0.7325418, -7.5507226, -21.183048, 0.6447537, -7.2726197, -21.129435, 0.6462488, -7.2726197, -21.129435, 0.6462488, -6.0741305, -21.129435, 0.92328346, -7.629112, -21.129435, 0.7325418, -7.629112, -21.129435, 0.7325418, -6.0741305, -21.129435, 0.92328346, -7.629112, -21.129435, 0.91196275, -7.629112, -21.30843, 0.3570392, -7.629112, -21.129436, 0.5971217, -7.629112, -21.30843, 0.62980187, -7.629112, -21.30843, 0.3570392, -7.629112, -21.129436, 0.3570392, -7.629112, -21.129436, 0.5971217, -7.629112, -21.129435, 0.7325418, -7.629112, -21.30843, 0.91196275, -7.629112, -21.30843, 0.62980187, -7.629112, -21.129435, 0.7325418, -7.629112, -21.129435, 0.91196275, -7.629112, -21.30843, 0.91196275, -7.5507226, -21.183048, 0.6447537, -7.629112, -21.129435, 0.7325418, -7.629112, -21.30843, 0.62980187, -7.629112, -21.129435, 0.91196275, -5.555945, -21.30843, 0.9271282, -7.629112, -21.30843, 0.91196275, -5.555945, -21.30843, 0.9271282, -7.629112, -21.129435, 0.91196275, -6.0741305, -21.129435, 0.92328346, -5.555945, -21.30843, 0.9271282, -6.0741305, -21.129435, 0.92328346, -5.555945, -21.174292, 0.9271282, -5.555945, -21.174292, 0.9271282, -3.54707, -21.30843, 0.7632997, -5.555945, -21.30843, 0.9271282, -5.555945, -21.174292, 0.9271282, -3.54707, -21.129435, 0.7632997, -3.54707, -21.30843, 0.7632997, -3.54707, -21.129435, 0.7632997, -5.555945, -21.174292, 0.9271282, -5.0537796, -21.129435, 0.8861177, -3.988361, -21.129435, 2.1034038, -3.54707, -21.30843, 2.1130157, -3.988361, -21.30843, 2.1034038, -3.988361, -21.129435, 2.1034038, -3.54707, -21.129435, 2.1130157, -3.54707, -21.30843, 2.1130157, -3.988361, -21.30843, 2.1034038, -6.7189775, -21.129435, 2.110666, -3.988361, -21.129435, 2.1034038, -3.988361, -21.30843, 2.1034038, -7.629112, -21.17429, 2.1130157, -6.7189775, -21.129435, 2.110666, -7.629112, -21.17429, 2.1130157, -3.988361, -21.30843, 2.1034038, -7.629112, -21.30843, 2.1130157, -3.54707, -21.129435, 1.6317828, -3.988361, -21.129435, 2.1034038, -3.988361, -21.129435, 1.6206758, -6.7189775, -21.129435, 2.110666, -3.988361, -21.129435, 1.6206758, -3.988361, -21.129435, 2.1034038, -6.7189775, -21.129435, 2.110666, -7.629112, -21.129435, 1.7067552, -3.988361, -21.129435, 1.6206758, -7.629112, -21.129435, 1.7067552, -6.7189775, -21.129435, 2.110666, -7.629112, -21.129435, 2.0113437, -7.629112, -21.129435, 2.0113437, -6.7189775, -21.129435, 2.110666, -7.629112, -21.17429, 2.1130157, -3.988361, -21.129435, 2.1034038, -3.54707, -21.129435, 1.6317828, -3.78224, -21.129435, 1.8853219, -3.78224, -21.129435, 1.8853219, -3.54707, -21.129435, 1.6317828, -3.54707, -21.129435, 1.8257284, -3.54707, -21.129435, 1.8257284, -3.5872264, -21.197786, 1.8791275, -3.78224, -21.129435, 1.8853219, -3.5872264, -21.197786, 1.8791275, -3.54707, -21.129435, 1.959867, -3.78224, -21.129435, 1.8853219, -3.988361, -21.129435, 2.1034038, -3.78224, -21.129435, 1.8853219, -3.54707, -21.129435, 1.959867, -3.988361, -21.129435, 2.1034038, -3.54707, -21.129435, 1.959867, -3.54707, -21.129435, 2.1130157, -3.988361, -21.30843, 1.6206758, -3.54707, -21.129435, 1.6317828, -3.988361, -21.129435, 1.6206758, -3.988361, -21.30843, 1.6206758, -3.54707, -21.30843, 1.6317829, -3.54707, -21.129435, 1.6317828, -7.629112, -21.129435, 1.7067552, -3.988361, -21.30843, 1.6206758, -3.988361, -21.129435, 1.6206758, -7.629112, -21.129435, 1.7067552, -7.629112, -21.30843, 1.7067553, -3.988361, -21.30843, 1.6206758, -3.54707, -21.30843, 2.1130157, -3.988361, -21.30843, 1.6206758, -3.988361, -21.30843, 2.1034038, -3.988361, -21.30843, 1.6206758, -3.54707, -21.30843, 2.1130157, -3.54707, -21.30843, 1.8528552, -3.988361, -21.30843, 1.6206758, -3.54707, -21.30843, 1.8528552, -3.54707, -21.30843, 1.6317829, -7.629112, -21.30843, 1.7067553, -3.988361, -21.30843, 2.1034038, -3.988361, -21.30843, 1.6206758, -7.629112, -21.30843, 1.7067553, -7.629112, -21.30843, 2.1130157, -3.988361, -21.30843, 2.1034038, -3.54707, -21.129435, 1.959867, -3.5872264, -21.197786, 1.8791275, -3.54707, -21.30843, 1.8528552, -3.5872264, -21.197786, 1.8791275, -3.54707, -21.129435, 1.8257284, -3.54707, -21.30843, 1.8528552, -3.54707, -21.30843, 2.1130157, -3.54707, -21.129435, 1.959867, -3.54707, -21.30843, 1.8528552, -3.54707, -21.30843, 2.1130157, -3.54707, -21.129435, 2.1130157, -3.54707, -21.129435, 1.959867, -3.54707, -21.129435, 1.8257284, -3.54707, -21.30843, 1.6317829, -3.54707, -21.30843, 1.8528552, -3.54707, -21.129435, 1.8257284, -3.54707, -21.129435, 1.6317828, -3.54707, -21.30843, 1.6317829, -7.629112, -21.129435, 1.7067552, -7.629112, -21.30843, 2.1130157, -7.629112, -21.30843, 1.7067553, -7.629112, -21.30843, 2.1130157, -7.629112, -21.129435, 1.7067552, -7.629112, -21.129435, 2.0113437, -7.629112, -21.30843, 2.1130157, -7.629112, -21.129435, 2.0113437, -7.629112, -21.17429, 2.1130157, -3.9170194, -21.320818, -0.44629717, -3.8958735, -21.335342, -0.95978284, -3.8958735, -21.34047, -0.43775296, -3.9170194, -21.320818, -0.44629717, -3.9170194, -21.31612, -0.95081186, -3.8958735, -21.335342, -0.95978284, -3.9170194, -21.31612, -0.95081186, -3.8958735, -21.210388, -0.979434, -3.8958735, -21.335342, -0.95978284, -3.9170194, -21.31612, -0.95081186, -3.9170194, -21.215515, -0.9587152, -3.8958735, -21.210388, -0.979434, -3.8958735, -21.34047, -0.43775296, -3.9170194, -21.35478, -0.9687538, -3.9170194, -21.36012, -0.4289956, -3.8958735, -21.34047, -0.43775296, -3.8958735, -21.335342, -0.95978284, -3.9170194, -21.35478, -0.9687538, -3.8958735, -21.335342, -0.95978284, -3.9170194, -21.205263, -1.0001528, -3.9170194, -21.35478, -0.9687538, -3.8958735, -21.335342, -0.95978284, -3.8958735, -21.210388, -0.979434, -3.9170194, -21.205263, -1.0001528, -3.9170194, -21.36012, -0.4289956, -3.9385924, -21.335342, -0.95978284, -3.9385924, -21.34047, -0.43775296, -3.9170194, -21.36012, -0.4289956, -3.9170194, -21.35478, -0.9687538, -3.9385924, -21.335342, -0.95978284, -3.9170194, -21.35478, -0.9687538, -3.9385924, -21.210388, -0.979434, -3.9385924, -21.335342, -0.95978284, -3.9170194, -21.35478, -0.9687538, -3.9170194, -21.205263, -1.0001528, -3.9385924, -21.210388, -0.979434, -3.9385924, -21.34047, -0.43775296, -3.9170194, -21.31612, -0.95081186, -3.9170194, -21.320818, -0.44629717, -3.9385924, -21.34047, -0.43775296, -3.9385924, -21.335342, -0.95978284, -3.9170194, -21.31612, -0.95081186, -3.9385924, -21.335342, -0.95978284, -3.9170194, -21.215515, -0.9587152, -3.9170194, -21.31612, -0.95081186, -3.9385924, -21.335342, -0.95978284, -3.9385924, -21.210388, -0.979434, -3.9170194, -21.215515, -0.9587152, -3.9170194, -21.215515, -0.9587152, -3.8958735, -21.105513, -0.94718075, -3.8958735, -21.210388, -0.979434, -3.9170194, -21.215515, -0.9587152, -3.9170194, -21.126446, -0.9426954, -3.8958735, -21.105513, -0.94718075, -3.9170194, -21.126446, -0.9426954, -3.8958735, -21.10359, -0.44181156, -3.8958735, -21.105513, -0.94718075, -3.9170194, -21.126446, -0.9426954, -3.9170194, -21.12431, -0.44693804, -3.8958735, -21.10359, -0.44181156, -3.9170194, -21.12431, -0.44693804, -3.8958735, -21.219788, -0.39460683, -3.8958735, -21.10359, -0.44181156, -3.9170194, -21.12431, -0.44693804, -3.9170194, -21.22406, -0.4155395, -3.8958735, -21.219788, -0.39460683, -3.8958735, -21.210388, -0.979434, -3.9170194, -21.084795, -0.95188, -3.9170194, -21.205263, -1.0001528, -3.8958735, -21.210388, -0.979434, -3.8958735, -21.105513, -0.94718075, -3.9170194, -21.084795, -0.95188, -3.8958735, -21.105513, -0.94718075, -3.9170194, -21.082659, -0.43668532, -3.9170194, -21.084795, -0.95188, -3.8958735, -21.105513, -0.94718075, -3.8958735, -21.10359, -0.44181156, -3.9170194, -21.082659, -0.43668532, -3.8958735, -21.10359, -0.44181156, -3.9170194, -21.215515, -0.3736744, -3.9170194, -21.082659, -0.43668532, -3.8958735, -21.10359, -0.44181156, -3.8958735, -21.219788, -0.39460683, -3.9170194, -21.215515, -0.3736744, -3.9170194, -21.205263, -1.0001528, -3.9385924, -21.105513, -0.94718075, -3.9385924, -21.210388, -0.979434, -3.9170194, -21.205263, -1.0001528, -3.9170194, -21.084795, -0.95188, -3.9385924, -21.105513, -0.94718075, -3.9385924, -21.210388, -0.979434, -3.9170194, -21.126446, -0.9426954, -3.9170194, -21.215515, -0.9587152, -3.9385924, -21.210388, -0.979434, -3.9385924, -21.105513, -0.94718075, -3.9170194, -21.126446, -0.9426954, -3.9385924, -21.105513, -0.94718075, -3.9170194, -21.12431, -0.44693804, -3.9170194, -21.126446, -0.9426954, -3.9385924, -21.105513, -0.94718075, -3.9385924, -21.10359, -0.44181156, -3.9170194, -21.12431, -0.44693804, -3.9385924, -21.10359, -0.44181156, -3.9170194, -21.22406, -0.4155395, -3.9170194, -21.12431, -0.44693804, -3.9385924, -21.10359, -0.44181156, -3.9385924, -21.219788, -0.39460683, -3.9170194, -21.22406, -0.4155395, -3.9170194, -21.084795, -0.95188, -3.9385924, -21.10359, -0.44181156, -3.9385924, -21.105513, -0.94718075, -3.9170194, -21.084795, -0.95188, -3.9170194, -21.082659, -0.43668532, -3.9385924, -21.10359, -0.44181156, -3.9170194, -21.082659, -0.43668532, -3.9385924, -21.219788, -0.39460683, -3.9385924, -21.10359, -0.44181156, -3.9170194, -21.082659, -0.43668532, -3.9170194, -21.215515, -0.3736744, -3.9385924, -21.219788, -0.39460683, -3.9170194, -21.22406, -0.4155395, -3.8958735, -21.34047, -0.43775296, -3.8958735, -21.219788, -0.39460683, -3.9170194, -21.22406, -0.4155395, -3.9170194, -21.320818, -0.44629717, -3.8958735, -21.34047, -0.43775296, -3.8958735, -21.219788, -0.39460683, -3.9170194, -21.36012, -0.4289956, -3.9170194, -21.215515, -0.3736744, -3.8958735, -21.219788, -0.39460683, -3.8958735, -21.34047, -0.43775296, -3.9170194, -21.36012, -0.4289956, -3.9170194, -21.215515, -0.3736744, -3.9385924, -21.34047, -0.43775296, -3.9385924, -21.219788, -0.39460683, -3.9170194, -21.215515, -0.3736744, -3.9170194, -21.36012, -0.4289956, -3.9385924, -21.34047, -0.43775296, -3.9385924, -21.219788, -0.39460683, -3.9170194, -21.320818, -0.44629717, -3.9170194, -21.22406, -0.4155395, -3.9385924, -21.219788, -0.39460683, -3.9385924, -21.34047, -0.43775296, -3.9170194, -21.320818, -0.44629717, -7.464643, -21.40476, 5.450674, -7.3512235, -21.359264, 5.450674, -7.3512235, -21.40476, 5.450674, -7.464643, -21.40476, 5.450674, -7.464643, -21.359264, 5.450674, -7.3512235, -21.359264, 5.450674, -7.464643, -21.359264, 5.450674, -7.3512235, -21.359266, -1.0281336, -7.3512235, -21.359264, 5.450674, -7.464643, -21.359264, 5.450674, -7.464643, -21.359266, -1.0281336, -7.3512235, -21.359266, -1.0281336, -7.464643, -21.359266, -1.0281336, -7.3512235, -21.404762, -1.0281336, -7.3512235, -21.359266, -1.0281336, -7.464643, -21.359266, -1.0281336, -7.464643, -21.404762, -1.0281336, -7.3512235, -21.404762, -1.0281336, -7.464643, -21.404762, -1.0281336, -7.3512235, -21.40476, 5.450674, -7.3512235, -21.404762, -1.0281336, -7.464643, -21.404762, -1.0281336, -7.464643, -21.40476, 5.450674, -7.3512235, -21.40476, 5.450674, -7.3512235, -21.40476, 5.450674, -7.3512235, -21.359266, -1.0281336, -7.3512235, -21.404762, -1.0281336, -7.3512235, -21.40476, 5.450674, -7.3512235, -21.359264, 5.450674, -7.3512235, -21.359266, -1.0281336, -7.464643, -21.404762, -1.0281336, -7.464643, -21.359264, 5.450674, -7.464643, -21.40476, 5.450674, -7.464643, -21.404762, -1.0281336, -7.464643, -21.359266, -1.0281336, -7.464643, -21.359264, 5.450674, -6.9564967, -21.30843, -0.21347666, -3.4046016, -21.129436, -0.29165316, -6.9564967, -21.129436, -0.2134769, -6.9564967, -21.30843, -0.21347666, -3.4046016, -21.30843, -0.29165292, -3.4046016, -21.129436, -0.29165316, -7.7713675, -21.129436, -0.21689463, -6.9564967, -21.30843, -0.21347666, -6.9564967, -21.129436, -0.2134769, -7.7713675, -21.129436, -0.21689463, -7.7713675, -21.30843, -0.21689439, -6.9564967, -21.30843, -0.21347666, -6.9564967, -21.30843, 0.28014445, -3.4046016, -21.30843, -0.29165292, -6.9564967, -21.30843, -0.21347666, -6.9564967, -21.30843, 0.28014445, -3.4046016, -21.30843, 0.1893661, -3.4046016, -21.30843, -0.29165292, -7.7713675, -21.30843, -0.21689439, -6.9564967, -21.30843, 0.28014445, -6.9564967, -21.30843, -0.21347666, -7.7713675, -21.30843, -0.21689439, -7.7713675, -21.30843, 0.1893661, -6.9564967, -21.30843, 0.28014445, -7.7713675, -21.30843, -0.21689439, -7.7713675, -21.129436, 0.18936586, -7.7713675, -21.30843, 0.1893661, -7.7713675, -21.30843, -0.21689439, -7.7713675, -21.129436, -0.21689463, -7.7713675, -21.129436, 0.18936586, -6.9564967, -21.129436, 0.15668559, -6.9564967, -21.174292, 0.28014445, -7.1602683, -21.129436, 0.25750327, -6.9564967, -21.129436, 0.15668559, -6.0685763, -21.129436, 0.25750327, -6.9564967, -21.174292, 0.28014445, -6.9564967, -21.129436, 0.15668559, -4.0705953, -21.129436, 0.20624006, -6.0685763, -21.129436, 0.25750327, -7.1602683, -21.129436, 0.25750327, -6.9564967, -21.129436, -0.2134769, -6.9564967, -21.129436, 0.15668559, -7.1602683, -21.129436, 0.25750327, -7.7713675, -21.129436, -0.21689463, -6.9564967, -21.129436, -0.2134769, -7.7713675, -21.129436, -0.21689463, -7.1602683, -21.129436, 0.25750327, -7.7713675, -21.129436, 0.18936586, -3.4046016, -21.129436, -0.29165316, -6.9564967, -21.129436, 0.15668559, -6.9564967, -21.129436, -0.2134769, -6.9564967, -21.129436, 0.15668559, -3.4046016, -21.129436, -0.29165316, -4.0705953, -21.129436, 0.20624006, -4.0705953, -21.129436, 0.20624006, -3.4046016, -21.129436, -0.29165316, -3.4046016, -21.129436, 0.06911111, -4.0705953, -21.129436, 0.20624006, -3.4046016, -21.129436, 0.06911111, -3.4046016, -21.174292, 0.18936586, -7.7713675, -21.129436, 0.18936586, -6.9564967, -21.30843, 0.28014445, -7.7713675, -21.30843, 0.1893661, -6.9564967, -21.30843, 0.28014445, -7.7713675, -21.129436, 0.18936586, -7.1602683, -21.129436, 0.25750327, -6.9564967, -21.30843, 0.28014445, -7.1602683, -21.129436, 0.25750327, -6.9564967, -21.174292, 0.28014445, -6.9564967, -21.174292, 0.28014445, -3.4046016, -21.30843, 0.1893661, -6.9564967, -21.30843, 0.28014445, -6.9564967, -21.174292, 0.28014445, -4.0705953, -21.129436, 0.20624006, -3.4046016, -21.30843, 0.1893661, -3.4046016, -21.30843, 0.1893661, -4.0705953, -21.129436, 0.20624006, -3.4046016, -21.174292, 0.18936586, -4.0705953, -21.129436, 0.20624006, -6.9564967, -21.174292, 0.28014445, -6.0685763, -21.129436, 0.25750327, -3.4046016, -21.174292, 0.18936586, -3.4046016, -21.30843, -0.29165292, -3.4046016, -21.30843, 0.1893661, -3.4046016, -21.30843, -0.29165292, -3.4046016, -21.174292, 0.18936586, -3.4046016, -21.129436, 0.06911111, -3.4046016, -21.30843, -0.29165292, -3.4046016, -21.129436, 0.06911111, -3.4046016, -21.129436, -0.29165316, -7.7320657, -21.3975, -1.0330465, -7.351437, -19.082968, -0.9484632, -7.4360213, -21.3975, -1.0330465, -7.7320657, -21.3975, -1.0330465, -7.81665, -19.082968, -0.9484632, -7.351437, -19.082968, -0.9484632, -7.81665, -19.082968, -0.9484632, -7.351437, -19.082968, -1.4134626, -7.351437, -19.082968, -0.9484632, -7.81665, -19.082968, -0.9484632, -7.81665, -19.082968, -1.4134626, -7.351437, -19.082968, -1.4134626, -7.81665, -19.082968, -1.4134626, -7.4360213, -21.3975, -1.3288774, -7.351437, -19.082968, -1.4134626, -7.81665, -19.082968, -1.4134626, -7.7320657, -21.3975, -1.3288774, -7.4360213, -21.3975, -1.3288774, -7.7320657, -21.3975, -1.3288774, -7.4360213, -21.3975, -1.0330465, -7.4360213, -21.3975, -1.3288774, -7.7320657, -21.3975, -1.3288774, -7.7320657, -21.3975, -1.0330465, -7.4360213, -21.3975, -1.0330465, -7.4360213, -21.3975, -1.0330465, -7.351437, -19.082968, -1.4134626, -7.4360213, -21.3975, -1.3288774, -7.4360213, -21.3975, -1.0330465, -7.351437, -19.082968, -0.9484632, -7.351437, -19.082968, -1.4134626, -7.7320657, -21.3975, -1.3288774, -7.81665, -19.082968, -0.9484632, -7.7320657, -21.3975, -1.0330465, -7.7320657, -21.3975, -1.3288774, -7.81665, -19.082968, -1.4134626, -7.81665, -19.082968, -0.9484632, -3.988361, -21.129436, -0.4571905, -3.54707, -21.30843, -0.4477923, -3.988361, -21.30843, -0.45719028, -3.988361, -21.129436, -0.4571905, -3.54707, -21.129436, -0.44779253, -3.54707, -21.30843, -0.4477923, -3.988361, -21.30843, -0.45719028, -6.7189775, -21.129436, -0.4501419, -3.988361, -21.129436, -0.4571905, -3.988361, -21.30843, -0.45719028, -7.629112, -21.174292, -0.44779253, -6.7189775, -21.129436, -0.4501419, -7.629112, -21.174292, -0.44779253, -3.988361, -21.30843, -0.45719028, -7.629112, -21.30843, -0.4477923, -3.54707, -21.129436, -0.92881155, -3.988361, -21.129436, -0.4571905, -3.988361, -21.129436, -0.9401324, -6.7189775, -21.129436, -0.4501419, -3.988361, -21.129436, -0.9401324, -3.988361, -21.129436, -0.4571905, -6.7189775, -21.129436, -0.4501419, -7.629112, -21.129436, -0.8540528, -3.988361, -21.129436, -0.9401324, -7.629112, -21.129436, -0.8540528, -6.7189775, -21.129436, -0.4501419, -7.629112, -21.129436, -0.5492506, -7.629112, -21.129436, -0.5492506, -6.7189775, -21.129436, -0.4501419, -7.629112, -21.174292, -0.44779253, -3.988361, -21.129436, -0.4571905, -3.54707, -21.129436, -0.92881155, -3.78224, -21.129436, -0.6754861, -3.78224, -21.129436, -0.6754861, -3.54707, -21.129436, -0.92881155, -3.54707, -21.129436, -0.7350795, -3.54707, -21.129436, -0.7350795, -3.5872264, -21.197786, -0.68168044, -3.78224, -21.129436, -0.6754861, -3.5872264, -21.197786, -0.68168044, -3.54707, -21.129436, -0.6009412, -3.78224, -21.129436, -0.6754861, -3.988361, -21.129436, -0.4571905, -3.78224, -21.129436, -0.6754861, -3.54707, -21.129436, -0.6009412, -3.988361, -21.129436, -0.4571905, -3.54707, -21.129436, -0.6009412, -3.54707, -21.129436, -0.44779253, -3.988361, -21.30843, -0.94013214, -3.54707, -21.129436, -0.92881155, -3.988361, -21.129436, -0.9401324, -3.988361, -21.30843, -0.94013214, -3.54707, -21.30843, -0.9288113, -3.54707, -21.129436, -0.92881155, -7.629112, -21.129436, -0.8540528, -3.988361, -21.30843, -0.94013214, -3.988361, -21.129436, -0.9401324, -7.629112, -21.129436, -0.8540528, -7.629112, -21.30843, -0.85405254, -3.988361, -21.30843, -0.94013214, -3.54707, -21.30843, -0.4477923, -3.988361, -21.30843, -0.94013214, -3.988361, -21.30843, -0.45719028, -3.988361, -21.30843, -0.94013214, -3.54707, -21.30843, -0.4477923, -3.54707, -21.30843, -0.7079525, -3.988361, -21.30843, -0.94013214, -3.54707, -21.30843, -0.7079525, -3.54707, -21.30843, -0.9288113, -7.629112, -21.30843, -0.85405254, -3.988361, -21.30843, -0.45719028, -3.988361, -21.30843, -0.94013214, -7.629112, -21.30843, -0.85405254, -7.629112, -21.30843, -0.4477923, -3.988361, -21.30843, -0.45719028, -3.54707, -21.129436, -0.6009412, -3.5872264, -21.197786, -0.68168044, -3.54707, -21.30843, -0.7079525, -3.5872264, -21.197786, -0.68168044, -3.54707, -21.129436, -0.7350795, -3.54707, -21.30843, -0.7079525, -3.54707, -21.30843, -0.4477923, -3.54707, -21.129436, -0.6009412, -3.54707, -21.30843, -0.7079525, -3.54707, -21.30843, -0.4477923, -3.54707, -21.129436, -0.44779253, -3.54707, -21.129436, -0.6009412, -3.54707, -21.129436, -0.7350795, -3.54707, -21.30843, -0.9288113, -3.54707, -21.30843, -0.7079525, -3.54707, -21.129436, -0.7350795, -3.54707, -21.129436, -0.92881155, -3.54707, -21.30843, -0.9288113, -7.629112, -21.129436, -0.8540528, -7.629112, -21.30843, -0.4477923, -7.629112, -21.30843, -0.85405254, -7.629112, -21.30843, -0.4477923, -7.629112, -21.129436, -0.8540528, -7.629112, -21.129436, -0.5492506, -7.629112, -21.30843, -0.4477923, -7.629112, -21.129436, -0.5492506, -7.629112, -21.174292, -0.44779253, -3.8766494, -21.129435, 2.6811824, -3.4046016, -21.308428, 2.6905806, -3.8766494, -21.308428, 2.6811824, -3.8766494, -21.129435, 2.6811824, -3.4046016, -21.129435, 2.6905804, -3.4046016, -21.308428, 2.6905806, -3.8766494, -21.308428, 2.6811824, -6.797795, -21.129435, 2.688231, -3.8766494, -21.129435, 2.6811824, -3.8766494, -21.308428, 2.6811824, -7.7713675, -21.17429, 2.6905804, -6.797795, -21.129435, 2.688231, -7.7713675, -21.17429, 2.6905804, -3.8766494, -21.308428, 2.6811824, -7.7713675, -21.308428, 2.6905806, -3.4046016, -21.129435, 2.2095613, -3.8766494, -21.129435, 2.6811824, -3.8766494, -21.129435, 2.1984541, -6.797795, -21.129435, 2.688231, -3.8766494, -21.129435, 2.1984541, -3.8766494, -21.129435, 2.6811824, -6.797795, -21.129435, 2.688231, -7.7713675, -21.129435, 2.28432, -3.8766494, -21.129435, 2.1984541, -7.7713675, -21.129435, 2.28432, -6.797795, -21.129435, 2.688231, -7.7713675, -21.129435, 2.5891223, -7.7713675, -21.129435, 2.5891223, -6.797795, -21.129435, 2.688231, -7.7713675, -21.17429, 2.6905804, -3.8766494, -21.129435, 2.6811824, -3.4046016, -21.129435, 2.2095613, -3.656218, -21.129435, 2.4631002, -3.656218, -21.129435, 2.4631002, -3.4046016, -21.129435, 2.2095613, -3.4046016, -21.129435, 2.4032931, -3.4046016, -21.129435, 2.4032931, -3.4477482, -21.197786, 2.4566922, -3.656218, -21.129435, 2.4631002, -3.4477482, -21.197786, 2.4566922, -3.4046016, -21.129435, 2.5376453, -3.656218, -21.129435, 2.4631002, -3.8766494, -21.129435, 2.6811824, -3.656218, -21.129435, 2.4631002, -3.4046016, -21.129435, 2.5376453, -3.8766494, -21.129435, 2.6811824, -3.4046016, -21.129435, 2.5376453, -3.4046016, -21.129435, 2.6905804, -3.8766494, -21.30843, 2.1984544, -3.4046016, -21.129435, 2.2095613, -3.8766494, -21.129435, 2.1984541, -3.8766494, -21.30843, 2.1984544, -3.4046016, -21.30843, 2.2095613, -3.4046016, -21.129435, 2.2095613, -7.7713675, -21.129435, 2.28432, -3.8766494, -21.30843, 2.1984544, -3.8766494, -21.129435, 2.1984541, -7.7713675, -21.129435, 2.28432, -7.7713675, -21.30843, 2.28432, -3.8766494, -21.30843, 2.1984544, -3.4046016, -21.308428, 2.6905806, -3.8766494, -21.30843, 2.1984544, -3.8766494, -21.308428, 2.6811824, -3.8766494, -21.30843, 2.1984544, -3.4046016, -21.308428, 2.6905806, -3.4046016, -21.308428, 2.4306335, -3.8766494, -21.30843, 2.1984544, -3.4046016, -21.308428, 2.4306335, -3.4046016, -21.30843, 2.2095613, -7.7713675, -21.30843, 2.28432, -3.8766494, -21.308428, 2.6811824, -3.8766494, -21.30843, 2.1984544, -7.7713675, -21.30843, 2.28432, -7.7713675, -21.308428, 2.6905806, -3.8766494, -21.308428, 2.6811824, -3.4046016, -21.129435, 2.5376453, -3.4477482, -21.197786, 2.4566922, -3.4046016, -21.308428, 2.4306335, -3.4477482, -21.197786, 2.4566922, -3.4046016, -21.129435, 2.4032931, -3.4046016, -21.308428, 2.4306335, -3.4046016, -21.308428, 2.6905806, -3.4046016, -21.129435, 2.5376453, -3.4046016, -21.308428, 2.4306335, -3.4046016, -21.308428, 2.6905806, -3.4046016, -21.129435, 2.6905804, -3.4046016, -21.129435, 2.5376453, -3.4046016, -21.129435, 2.4032931, -3.4046016, -21.30843, 2.2095613, -3.4046016, -21.308428, 2.4306335, -3.4046016, -21.129435, 2.4032931, -3.4046016, -21.129435, 2.2095613, -3.4046016, -21.30843, 2.2095613, -7.7713675, -21.129435, 2.28432, -7.7713675, -21.308428, 2.6905806, -7.7713675, -21.30843, 2.28432, -7.7713675, -21.308428, 2.6905806, -7.7713675, -21.129435, 2.28432, -7.7713675, -21.129435, 2.5891223, -7.7713675, -21.308428, 2.6905806, -7.7713675, -21.129435, 2.5891223, -7.7713675, -21.17429, 2.6905804, -5.5538087, -21.308428, 2.944333, -3.4046016, -21.129435, 2.853768, -5.5538087, -21.129435, 2.944333, -5.5538087, -21.308428, 2.944333, -3.4046016, -21.308428, 2.8537683, -3.4046016, -21.129435, 2.853768, -7.7713675, -21.129435, 2.853768, -5.5538087, -21.308428, 2.944333, -5.5538087, -21.129435, 2.944333, -7.7713675, -21.129435, 2.853768, -7.7713675, -21.308428, 2.8537683, -5.5538087, -21.308428, 2.944333, -5.5538087, -21.308428, 3.4236436, -3.4046016, -21.308428, 2.8537683, -5.5538087, -21.308428, 2.944333, -5.5538087, -21.308428, 3.4236436, -3.4046016, -21.308428, 3.2600288, -3.4046016, -21.308428, 2.8537683, -5.5538087, -21.308428, 2.944333, -7.7713675, -21.308428, 3.4084783, -5.5538087, -21.308428, 3.4236436, -5.5538087, -21.308428, 2.944333, -7.7713675, -21.308428, 3.126531, -7.7713675, -21.308428, 3.4084783, -7.7713675, -21.308428, 3.126531, -5.5538087, -21.308428, 2.944333, -7.7713675, -21.308428, 2.8537683, -3.4046016, -21.308428, 3.2600288, -3.4046016, -21.129435, 2.853768, -3.4046016, -21.308428, 2.8537683, -3.4046016, -21.308428, 3.2600288, -3.4046016, -21.129435, 3.2600288, -3.4046016, -21.129435, 2.853768, -7.7713675, -21.129435, 3.0938506, -7.687638, -21.183048, 3.1414826, -7.7713675, -21.308428, 3.126531, -5.5538087, -21.129435, 3.3038158, -5.5538087, -21.17429, 3.4236436, -6.108092, -21.129435, 3.4197989, -5.5538087, -21.129435, 3.3038158, -5.0164003, -21.129435, 3.3828466, -5.5538087, -21.17429, 3.4236436, -5.5538087, -21.129435, 3.3038158, -3.4046016, -21.129435, 3.2600288, -5.0164003, -21.129435, 3.3828466, -5.5538087, -21.129435, 3.3038158, -3.4046016, -21.129435, 2.853768, -3.4046016, -21.129435, 3.2600288, -3.4046016, -21.129435, 2.853768, -5.5538087, -21.129435, 3.3038158, -5.5538087, -21.129435, 2.944333, -6.108092, -21.129435, 3.4197989, -5.5538087, -21.129435, 2.944333, -5.5538087, -21.129435, 3.3038158, -5.5538087, -21.129435, 2.944333, -7.7713675, -21.129435, 3.0938506, -7.7713675, -21.129435, 2.853768, -5.5538087, -21.129435, 2.944333, -7.3903117, -21.129435, 3.142764, -7.7713675, -21.129435, 3.0938506, -6.108092, -21.129435, 3.4197989, -7.3903117, -21.129435, 3.142764, -5.5538087, -21.129435, 2.944333, -7.687638, -21.183048, 3.1414826, -7.7713675, -21.129435, 3.0938506, -7.3903117, -21.129435, 3.142764, -7.7713675, -21.129435, 3.2290573, -7.687638, -21.183048, 3.1414826, -7.3903117, -21.129435, 3.142764, -7.3903117, -21.129435, 3.142764, -6.108092, -21.129435, 3.4197989, -7.7713675, -21.129435, 3.2290573, -7.7713675, -21.129435, 3.2290573, -6.108092, -21.129435, 3.4197989, -7.7713675, -21.129435, 3.4084783, -7.7713675, -21.308428, 2.8537683, -7.7713675, -21.129435, 3.0938506, -7.7713675, -21.308428, 3.126531, -7.7713675, -21.308428, 2.8537683, -7.7713675, -21.129435, 2.853768, -7.7713675, -21.129435, 3.0938506, -7.7713675, -21.129435, 3.2290573, -7.7713675, -21.308428, 3.4084783, -7.7713675, -21.308428, 3.126531, -7.7713675, -21.129435, 3.2290573, -7.7713675, -21.129435, 3.4084783, -7.7713675, -21.308428, 3.4084783, -7.687638, -21.183048, 3.1414826, -7.7713675, -21.129435, 3.2290573, -7.7713675, -21.308428, 3.126531, -7.7713675, -21.129435, 3.4084783, -5.5538087, -21.308428, 3.4236436, -7.7713675, -21.308428, 3.4084783, -5.5538087, -21.308428, 3.4236436, -7.7713675, -21.129435, 3.4084783, -6.108092, -21.129435, 3.4197989, -5.5538087, -21.308428, 3.4236436, -6.108092, -21.129435, 3.4197989, -5.5538087, -21.17429, 3.4236436, -5.5538087, -21.17429, 3.4236436, -3.4046016, -21.308428, 3.2600288, -5.5538087, -21.308428, 3.4236436, -5.5538087, -21.17429, 3.4236436, -3.4046016, -21.129435, 3.2600288, -3.4046016, -21.308428, 3.2600288, -3.4046016, -21.129435, 3.2600288, -5.5538087, -21.17429, 3.4236436, -5.0164003, -21.129435, 3.3828466, -3.988361, -21.129435, 4.050549, -3.54707, -21.308428, 4.0599475, -3.988361, -21.308428, 4.050549, -3.988361, -21.129435, 4.050549, -3.54707, -21.129435, 4.0599475, -3.54707, -21.308428, 4.0599475, -3.988361, -21.308428, 4.050549, -6.7189775, -21.129435, 4.057598, -3.988361, -21.129435, 4.050549, -3.988361, -21.308428, 4.050549, -7.629112, -21.17429, 4.0599475, -6.7189775, -21.129435, 4.057598, -7.629112, -21.17429, 4.0599475, -3.988361, -21.308428, 4.050549, -7.629112, -21.308428, 4.0599475, -3.54707, -21.129435, 3.5789282, -3.988361, -21.129435, 4.050549, -3.988361, -21.129435, 3.567821, -6.7189775, -21.129435, 4.057598, -3.988361, -21.129435, 3.567821, -3.988361, -21.129435, 4.050549, -6.7189775, -21.129435, 4.057598, -7.629112, -21.129435, 3.653687, -3.988361, -21.129435, 3.567821, -7.629112, -21.129435, 3.653687, -6.7189775, -21.129435, 4.057598, -7.629112, -21.129435, 3.958489, -7.629112, -21.129435, 3.958489, -6.7189775, -21.129435, 4.057598, -7.629112, -21.17429, 4.0599475, -3.988361, -21.129435, 4.050549, -3.54707, -21.129435, 3.5789282, -3.78224, -21.129435, 3.8322535, -3.78224, -21.129435, 3.8322535, -3.54707, -21.129435, 3.5789282, -3.54707, -21.129435, 3.7726603, -3.54707, -21.129435, 3.7726603, -3.5872264, -21.197784, 3.8260593, -3.78224, -21.129435, 3.8322535, -3.5872264, -21.197784, 3.8260593, -3.54707, -21.129435, 3.9070125, -3.78224, -21.129435, 3.8322535, -3.988361, -21.129435, 4.050549, -3.78224, -21.129435, 3.8322535, -3.54707, -21.129435, 3.9070125, -3.988361, -21.129435, 4.050549, -3.54707, -21.129435, 3.9070125, -3.54707, -21.129435, 4.0599475, -3.988361, -21.308428, 3.567821, -3.54707, -21.129435, 3.5789282, -3.988361, -21.129435, 3.567821, -3.988361, -21.308428, 3.567821, -3.54707, -21.308428, 3.5789282, -3.54707, -21.129435, 3.5789282, -7.629112, -21.129435, 3.653687, -3.988361, -21.308428, 3.567821, -3.988361, -21.129435, 3.567821, -7.629112, -21.129435, 3.653687, -7.629112, -21.308428, 3.653687, -3.988361, -21.308428, 3.567821, -3.54707, -21.308428, 4.0599475, -3.988361, -21.308428, 3.567821, -3.988361, -21.308428, 4.050549, -3.988361, -21.308428, 3.567821, -3.54707, -21.308428, 4.0599475, -3.54707, -21.308428, 3.799787, -3.988361, -21.308428, 3.567821, -3.54707, -21.308428, 3.799787, -3.54707, -21.308428, 3.5789282, -7.629112, -21.308428, 3.653687, -3.988361, -21.308428, 4.050549, -3.988361, -21.308428, 3.567821, -7.629112, -21.308428, 3.653687, -7.629112, -21.308428, 4.0599475, -3.988361, -21.308428, 4.050549, -3.54707, -21.129435, 3.9070125, -3.5872264, -21.197784, 3.8260593, -3.54707, -21.308428, 3.799787, -3.5872264, -21.197784, 3.8260593, -3.54707, -21.129435, 3.7726603, -3.54707, -21.308428, 3.799787, -3.54707, -21.308428, 4.0599475, -3.54707, -21.129435, 3.9070125, -3.54707, -21.308428, 3.799787, -3.54707, -21.308428, 4.0599475, -3.54707, -21.129435, 4.0599475, -3.54707, -21.129435, 3.9070125, -3.54707, -21.129435, 3.7726603, -3.54707, -21.308428, 3.5789282, -3.54707, -21.308428, 3.799787, -3.54707, -21.129435, 3.7726603, -3.54707, -21.129435, 3.5789282, -3.54707, -21.308428, 3.5789282, -7.629112, -21.129435, 3.653687, -7.629112, -21.308428, 4.0599475, -7.629112, -21.308428, 3.653687, -7.629112, -21.308428, 4.0599475, -7.629112, -21.129435, 3.653687, -7.629112, -21.129435, 3.958489, -7.629112, -21.308428, 4.0599475, -7.629112, -21.129435, 3.958489, -7.629112, -21.17429, 4.0599475, -3.950554, -21.3975, -1.0022886, -3.6320815, -19.082968, -1.0409505, -3.5934205, -21.3975, -1.0022886, -3.950554, -21.3975, -1.0022886, -3.911893, -19.082968, -1.0409505, -3.6320815, -19.082968, -1.0409505, -3.911893, -19.082968, -1.0409505, -3.6320815, -19.082968, -1.3209753, -3.6320815, -19.082968, -1.0409505, -3.911893, -19.082968, -1.0409505, -3.911893, -19.082968, -1.3209753, -3.6320815, -19.082968, -1.3209753, -3.911893, -19.082968, -1.3209753, -3.5934205, -21.3975, -1.3596354, -3.6320815, -19.082968, -1.3209753, -3.911893, -19.082968, -1.3209753, -3.950554, -21.3975, -1.3596354, -3.5934205, -21.3975, -1.3596354, -3.950554, -21.3975, -1.3596354, -3.5934205, -21.3975, -1.0022886, -3.5934205, -21.3975, -1.3596354, -3.950554, -21.3975, -1.3596354, -3.950554, -21.3975, -1.0022886, -3.5934205, -21.3975, -1.0022886, -3.5934205, -21.3975, -1.0022886, -3.6320815, -19.082968, -1.3209753, -3.5934205, -21.3975, -1.3596354, -3.5934205, -21.3975, -1.0022886, -3.6320815, -19.082968, -1.0409505, -3.6320815, -19.082968, -1.3209753, -3.950554, -21.3975, -1.3596354, -3.911893, -19.082968, -1.0409505, -3.950554, -21.3975, -1.0022886, -3.950554, -21.3975, -1.3596354, -3.911893, -19.082968, -1.3209753, -3.911893, -19.082968, -1.0409505, -7.8010573, -21.397497, 5.803108, -7.4439244, -19.082966, 5.8031073, -7.4439244, -21.397497, 5.803108, -7.8010573, -21.397497, 5.803108, -7.8010573, -19.082966, 5.8031073, -7.4439244, -19.082966, 5.8031073, -7.8010573, -21.397497, 5.4459753, -7.4439244, -21.397497, 5.803108, -7.4439244, -21.397497, 5.4459753, -7.8010573, -21.397497, 5.4459753, -7.8010573, -21.397497, 5.803108, -7.4439244, -21.397497, 5.803108, -7.4439244, -21.397497, 5.803108, -7.4439244, -19.082966, 5.4459743, -7.4439244, -21.397497, 5.4459753, -7.4439244, -21.397497, 5.803108, -7.4439244, -19.082966, 5.8031073, -7.4439244, -19.082966, 5.4459743, -7.8010573, -19.661598, 5.4459743, -7.7117743, -19.082966, 5.4459743, -7.8010573, -19.082966, 5.5352573, -7.8010573, -21.397497, 5.803108, -7.8010573, -19.661598, 5.4459743, -7.8010573, -19.082966, 5.5352573, -7.8010573, -19.661598, 5.4459743, -7.8010573, -21.397497, 5.803108, -7.8010573, -21.397497, 5.4459753, -7.8010573, -21.397497, 5.803108, -7.8010573, -19.082966, 5.5352573, -7.8010573, -19.082966, 5.8031073, -7.8010573, -19.082966, 5.5352573, -7.4439244, -19.082966, 5.8031073, -7.8010573, -19.082966, 5.8031073, -7.4439244, -19.082966, 5.8031073, -7.8010573, -19.082966, 5.5352573, -7.7117743, -19.082966, 5.4459743, -7.4439244, -19.082966, 5.8031073, -7.7117743, -19.082966, 5.4459743, -7.4439244, -19.082966, 5.4459743, -7.8010573, -21.397497, 5.4459753, -7.7117743, -19.082966, 5.4459743, -7.8010573, -19.661598, 5.4459743, -7.7117743, -19.082966, 5.4459743, -7.8010573, -21.397497, 5.4459753, -7.4439244, -21.397497, 5.4459753, -7.7117743, -19.082966, 5.4459743, -7.4439244, -21.397497, 5.4459753, -7.4439244, -19.082966, 5.4459743, -5.555945, -21.308428, 4.955558, -3.54707, -21.129435, 4.8647785, -5.555945, -21.129435, 4.9555573, -5.555945, -21.308428, 4.955558, -3.54707, -21.308428, 4.864779, -3.54707, -21.129435, 4.8647785, -7.629112, -21.129435, 4.8647785, -5.555945, -21.308428, 4.955558, -5.555945, -21.129435, 4.9555573, -7.629112, -21.129435, 4.8647785, -7.629112, -21.308428, 4.864779, -5.555945, -21.308428, 4.955558, -5.555945, -21.308428, 5.434868, -3.54707, -21.308428, 4.864779, -5.555945, -21.308428, 4.955558, -5.555945, -21.308428, 5.434868, -3.54707, -21.308428, 5.2710395, -3.54707, -21.308428, 4.864779, -5.555945, -21.308428, 4.955558, -7.629112, -21.308428, 5.4197025, -5.555945, -21.308428, 5.434868, -5.555945, -21.308428, 4.955558, -7.629112, -21.308428, 5.137542, -7.629112, -21.308428, 5.4197025, -7.629112, -21.308428, 5.137542, -5.555945, -21.308428, 4.955558, -7.629112, -21.308428, 4.864779, -3.54707, -21.308428, 5.2710395, -3.54707, -21.129435, 4.8647785, -3.54707, -21.308428, 4.864779, -3.54707, -21.308428, 5.2710395, -3.54707, -21.129435, 5.271039, -3.54707, -21.129435, 4.8647785, -7.629112, -21.129435, 5.1048613, -7.5507226, -21.183046, 5.1524935, -7.629112, -21.308428, 5.137542, -5.555945, -21.129435, 5.31504, -5.555945, -21.17429, 5.434868, -6.0741305, -21.129435, 5.431023, -5.555945, -21.129435, 5.31504, -5.0537796, -21.129435, 5.3940706, -5.555945, -21.17429, 5.434868, -5.555945, -21.129435, 5.31504, -3.54707, -21.129435, 5.271039, -5.0537796, -21.129435, 5.3940706, -5.555945, -21.129435, 5.31504, -3.54707, -21.129435, 4.8647785, -3.54707, -21.129435, 5.271039, -3.54707, -21.129435, 4.8647785, -5.555945, -21.129435, 5.31504, -5.555945, -21.129435, 4.9555573, -6.0741305, -21.129435, 5.431023, -5.555945, -21.129435, 4.9555573, -5.555945, -21.129435, 5.31504, -5.555945, -21.129435, 4.9555573, -7.629112, -21.129435, 5.1048613, -7.629112, -21.129435, 4.8647785, -5.555945, -21.129435, 4.9555573, -7.2726197, -21.129435, 5.1539884, -7.629112, -21.129435, 5.1048613, -6.0741305, -21.129435, 5.431023, -7.2726197, -21.129435, 5.1539884, -5.555945, -21.129435, 4.9555573, -7.5507226, -21.183046, 5.1524935, -7.629112, -21.129435, 5.1048613, -7.2726197, -21.129435, 5.1539884, -7.629112, -21.129435, 5.240281, -7.5507226, -21.183046, 5.1524935, -7.2726197, -21.129435, 5.1539884, -7.2726197, -21.129435, 5.1539884, -6.0741305, -21.129435, 5.431023, -7.629112, -21.129435, 5.240281, -7.629112, -21.129435, 5.240281, -6.0741305, -21.129435, 5.431023, -7.629112, -21.129435, 5.4197025, -7.629112, -21.308428, 4.864779, -7.629112, -21.129435, 5.1048613, -7.629112, -21.308428, 5.137542, -7.629112, -21.308428, 4.864779, -7.629112, -21.129435, 4.8647785, -7.629112, -21.129435, 5.1048613, -7.629112, -21.129435, 5.240281, -7.629112, -21.308428, 5.4197025, -7.629112, -21.308428, 5.137542, -7.629112, -21.129435, 5.240281, -7.629112, -21.129435, 5.4197025, -7.629112, -21.308428, 5.4197025, -7.5507226, -21.183046, 5.1524935, -7.629112, -21.129435, 5.240281, -7.629112, -21.308428, 5.137542, -7.629112, -21.129435, 5.4197025, -5.555945, -21.308428, 5.434868, -7.629112, -21.308428, 5.4197025, -5.555945, -21.308428, 5.434868, -7.629112, -21.129435, 5.4197025, -6.0741305, -21.129435, 5.431023, -5.555945, -21.308428, 5.434868, -6.0741305, -21.129435, 5.431023, -5.555945, -21.17429, 5.434868, -5.555945, -21.17429, 5.434868, -3.54707, -21.308428, 5.2710395, -5.555945, -21.308428, 5.434868, -5.555945, -21.17429, 5.434868, -3.54707, -21.129435, 5.271039, -3.54707, -21.308428, 5.2710395, -3.54707, -21.129435, 5.271039, -5.555945, -21.17429, 5.434868, -5.0537796, -21.129435, 5.3940706, -6.926807, -21.30843, 1.0420431, -3.4520202, -21.129435, 0.96386683, -6.926807, -21.129435, 1.0420431, -6.926807, -21.30843, 1.0420431, -3.4520202, -21.30843, 0.96386683, -3.4520202, -21.129435, 0.96386683, -7.723949, -21.129435, 1.0386255, -6.926807, -21.30843, 1.0420431, -6.926807, -21.129435, 1.0420431, -7.723949, -21.129435, 1.0386255, -7.723949, -21.30843, 1.0386255, -6.926807, -21.30843, 1.0420431, -6.926807, -21.30843, 1.5358781, -3.4520202, -21.30843, 0.96386683, -6.926807, -21.30843, 1.0420431, -6.926807, -21.30843, 1.5358781, -3.4520202, -21.30843, 1.444886, -3.4520202, -21.30843, 0.96386683, -7.723949, -21.30843, 1.0386255, -6.926807, -21.30843, 1.5358781, -6.926807, -21.30843, 1.0420431, -7.723949, -21.30843, 1.0386255, -7.723949, -21.30843, 1.444886, -6.926807, -21.30843, 1.5358781, -7.723949, -21.30843, 1.0386255, -7.723949, -21.129435, 1.444886, -7.723949, -21.30843, 1.444886, -7.723949, -21.30843, 1.0386255, -7.723949, -21.129435, 1.0386255, -7.723949, -21.129435, 1.444886, -6.926807, -21.129435, 1.4124193, -6.926807, -21.17429, 1.5358781, -7.1260924, -21.129435, 1.5130231, -6.926807, -21.129435, 1.4124193, -6.0581107, -21.129435, 1.5130231, -6.926807, -21.17429, 1.5358781, -6.926807, -21.129435, 1.4124193, -4.1037025, -21.129435, 1.4619737, -6.0581107, -21.129435, 1.5130231, -7.1260924, -21.129435, 1.5130231, -6.926807, -21.129435, 1.0420431, -6.926807, -21.129435, 1.4124193, -7.1260924, -21.129435, 1.5130231, -7.723949, -21.129435, 1.0386255, -6.926807, -21.129435, 1.0420431, -7.723949, -21.129435, 1.0386255, -7.1260924, -21.129435, 1.5130231, -7.723949, -21.129435, 1.444886, -3.4520202, -21.129435, 0.96386683, -6.926807, -21.129435, 1.4124193, -6.926807, -21.129435, 1.0420431, -6.926807, -21.129435, 1.4124193, -3.4520202, -21.129435, 0.96386683, -4.1037025, -21.129435, 1.4619737, -4.1037025, -21.129435, 1.4619737, -3.4520202, -21.129435, 0.96386683, -3.4520202, -21.129435, 1.3246312, -4.1037025, -21.129435, 1.4619737, -3.4520202, -21.129435, 1.3246312, -3.4520202, -21.17429, 1.444886, -7.723949, -21.129435, 1.444886, -6.926807, -21.30843, 1.5358781, -7.723949, -21.30843, 1.444886, -6.926807, -21.30843, 1.5358781, -7.723949, -21.129435, 1.444886, -7.1260924, -21.129435, 1.5130231, -6.926807, -21.30843, 1.5358781, -7.1260924, -21.129435, 1.5130231, -6.926807, -21.17429, 1.5358781, -6.926807, -21.17429, 1.5358781, -3.4520202, -21.30843, 1.444886, -6.926807, -21.30843, 1.5358781, -6.926807, -21.17429, 1.5358781, -4.1037025, -21.129435, 1.4619737, -3.4520202, -21.30843, 1.444886, -3.4520202, -21.30843, 1.444886, -4.1037025, -21.129435, 1.4619737, -3.4520202, -21.17429, 1.444886, -4.1037025, -21.129435, 1.4619737, -6.926807, -21.17429, 1.5358781, -6.0581107, -21.129435, 1.5130231, -3.4520202, -21.17429, 1.444886, -3.4520202, -21.30843, 0.96386683, -3.4520202, -21.30843, 1.444886, -3.4520202, -21.30843, 0.96386683, -3.4520202, -21.17429, 1.444886, -3.4520202, -21.129435, 1.3246312, -3.4520202, -21.30843, 0.96386683, -3.4520202, -21.129435, 1.3246312, -3.4520202, -21.129435, 0.96386683, -6.9564967, -21.308428, 4.294263, -3.4046016, -21.129435, 4.2160864, -6.9564967, -21.129435, 4.294263, -6.9564967, -21.308428, 4.294263, -3.4046016, -21.308428, 4.2160864, -3.4046016, -21.129435, 4.2160864, -7.7713675, -21.129435, 4.290845, -6.9564967, -21.308428, 4.294263, -6.9564967, -21.129435, 4.294263, -7.7713675, -21.129435, 4.290845, -7.7713675, -21.308428, 4.2908454, -6.9564967, -21.308428, 4.294263, -6.9564967, -21.308428, 4.787884, -3.4046016, -21.308428, 4.2160864, -6.9564967, -21.308428, 4.294263, -6.9564967, -21.308428, 4.787884, -3.4046016, -21.308428, 4.6971054, -3.4046016, -21.308428, 4.2160864, -7.7713675, -21.308428, 4.2908454, -6.9564967, -21.308428, 4.787884, -6.9564967, -21.308428, 4.294263, -7.7713675, -21.308428, 4.2908454, -7.7713675, -21.308428, 4.6971054, -6.9564967, -21.308428, 4.787884, -7.7713675, -21.308428, 4.2908454, -7.7713675, -21.129435, 4.6971054, -7.7713675, -21.308428, 4.6971054, -7.7713675, -21.308428, 4.2908454, -7.7713675, -21.129435, 4.290845, -7.7713675, -21.129435, 4.6971054, -6.9564967, -21.129435, 4.6646385, -6.9564967, -21.17429, 4.7878838, -7.1602683, -21.129435, 4.7652426, -6.9564967, -21.129435, 4.6646385, -6.0685763, -21.129435, 4.7652426, -6.9564967, -21.17429, 4.7878838, -6.9564967, -21.129435, 4.6646385, -4.0705953, -21.129435, 4.7141933, -6.0685763, -21.129435, 4.7652426, -7.1602683, -21.129435, 4.7652426, -6.9564967, -21.129435, 4.294263, -6.9564967, -21.129435, 4.6646385, -7.1602683, -21.129435, 4.7652426, -7.7713675, -21.129435, 4.290845, -6.9564967, -21.129435, 4.294263, -7.7713675, -21.129435, 4.290845, -7.1602683, -21.129435, 4.7652426, -7.7713675, -21.129435, 4.6971054, -3.4046016, -21.129435, 4.2160864, -6.9564967, -21.129435, 4.6646385, -6.9564967, -21.129435, 4.294263, -6.9564967, -21.129435, 4.6646385, -3.4046016, -21.129435, 4.2160864, -4.0705953, -21.129435, 4.7141933, -4.0705953, -21.129435, 4.7141933, -3.4046016, -21.129435, 4.2160864, -3.4046016, -21.129435, 4.576851, -4.0705953, -21.129435, 4.7141933, -3.4046016, -21.129435, 4.576851, -3.4046016, -21.17429, 4.6971054, -7.7713675, -21.129435, 4.6971054, -6.9564967, -21.308428, 4.787884, -7.7713675, -21.308428, 4.6971054, -6.9564967, -21.308428, 4.787884, -7.7713675, -21.129435, 4.6971054, -7.1602683, -21.129435, 4.7652426, -6.9564967, -21.308428, 4.787884, -7.1602683, -21.129435, 4.7652426, -6.9564967, -21.17429, 4.7878838, -6.9564967, -21.17429, 4.7878838, -3.4046016, -21.308428, 4.6971054, -6.9564967, -21.308428, 4.787884, -6.9564967, -21.17429, 4.7878838, -4.0705953, -21.129435, 4.7141933, -3.4046016, -21.308428, 4.6971054, -3.4046016, -21.308428, 4.6971054, -4.0705953, -21.129435, 4.7141933, -3.4046016, -21.17429, 4.6971054, -4.0705953, -21.129435, 4.7141933, -6.9564967, -21.17429, 4.7878838, -6.0685763, -21.129435, 4.7652426, -3.4046016, -21.17429, 4.6971054, -3.4046016, -21.308428, 4.2160864, -3.4046016, -21.308428, 4.6971054, -3.4046016, -21.308428, 4.2160864, -3.4046016, -21.17429, 4.6971054, -3.4046016, -21.129435, 4.576851, -3.4046016, -21.308428, 4.2160864, -3.4046016, -21.129435, 4.576851, -3.4046016, -21.129435, 4.2160864, -3.8851933, -21.397497, 5.744369, -3.5280604, -19.082966, 5.744368, -3.5280604, -21.397497, 5.744369, -3.8851933, -21.397497, 5.744369, -3.8851933, -19.351458, 5.7443686, -3.5280604, -19.082966, 5.744368, -3.8851933, -19.351458, 5.7443686, -3.5280604, -19.082966, 5.387021, -3.5280604, -19.082966, 5.744368, -3.8851933, -19.351458, 5.7443686, -3.8851933, -19.082966, 5.387021, -3.5280604, -19.082966, 5.387021, -3.8851933, -19.082966, 5.387021, -3.5280604, -21.397497, 5.387022, -3.5280604, -19.082966, 5.387021, -3.8851933, -19.082966, 5.387021, -3.8851933, -21.397497, 5.387022, -3.5280604, -21.397497, 5.387022, -3.8851933, -21.397497, 5.387022, -3.5280604, -21.397497, 5.744369, -3.5280604, -21.397497, 5.387022, -3.8851933, -21.397497, 5.387022, -3.8851933, -21.397497, 5.744369, -3.5280604, -21.397497, 5.744369, -3.5280604, -21.397497, 5.744369, -3.5280604, -19.082966, 5.387021, -3.5280604, -21.397497, 5.387022, -3.5280604, -21.397497, 5.744369, -3.5280604, -19.082966, 5.744368, -3.5280604, -19.082966, 5.387021, -3.8851933, -21.397497, 5.387022, -3.8851933, -19.351458, 5.7443686, -3.8851933, -21.397497, 5.744369, -3.8851933, -21.397497, 5.387022, -3.8851933, -19.082966, 5.387021, -3.8851933, -19.351458, 5.7443686, -3.8144932, -21.40476, 5.450674, -3.7010732, -21.359264, 5.450674, -3.7010732, -21.40476, 5.450674, -3.8144932, -21.40476, 5.450674, -3.8144932, -21.359264, 5.450674, -3.7010732, -21.359264, 5.450674, -3.8144932, -21.359264, 5.450674, -3.7010732, -21.359266, -1.0281336, -3.7010732, -21.359264, 5.450674, -3.8144932, -21.359264, 5.450674, -3.8144932, -21.359266, -1.0281336, -3.7010732, -21.359266, -1.0281336, -3.8144932, -21.359266, -1.0281336, -3.7010732, -21.404762, -1.0281336, -3.7010732, -21.359266, -1.0281336, -3.8144932, -21.359266, -1.0281336, -3.8144932, -21.404762, -1.0281336, -3.7010732, -21.404762, -1.0281336, -3.8144932, -21.404762, -1.0281336, -3.7010732, -21.40476, 5.450674, -3.7010732, -21.404762, -1.0281336, -3.8144932, -21.404762, -1.0281336, -3.8144932, -21.40476, 5.450674, -3.7010732, -21.40476, 5.450674, -3.7010732, -21.40476, 5.450674, -3.7010732, -21.359266, -1.0281336, -3.7010732, -21.404762, -1.0281336, -3.7010732, -21.40476, 5.450674, -3.7010732, -21.359264, 5.450674, -3.7010732, -21.359266, -1.0281336, -3.8144932, -21.404762, -1.0281336, -3.8144932, -21.359264, 5.450674, -3.8144932, -21.40476, 5.450674, -3.8144932, -21.404762, -1.0281336, -3.8144932, -21.359266, -1.0281336, -3.8144932, -21.359264, 5.450674, -7.4172244, -21.333633, 0.22268713, -7.393088, -21.35008, -0.25406027, -7.393088, -21.355635, 0.23059022, -7.4172244, -21.333633, 0.22268713, -7.4172244, -21.328295, -0.24551606, -7.393088, -21.35008, -0.25406027, -7.4172244, -21.328295, -0.24551606, -7.393088, -21.208893, -0.27221608, -7.393088, -21.35008, -0.25406027, -7.4172244, -21.328295, -0.24551606, -7.4172244, -21.21466, -0.25277877, -7.393088, -21.208893, -0.27221608, -7.393088, -21.355635, 0.23059022, -7.4172244, -21.371868, -0.26239038, -7.4172244, -21.377848, 0.2384932, -7.393088, -21.355635, 0.23059022, -7.393088, -21.35008, -0.25406027, -7.4172244, -21.371868, -0.26239038, -7.393088, -21.35008, -0.25406027, -7.4172244, -21.20334, -0.29122615, -7.4172244, -21.371868, -0.26239038, -7.393088, -21.35008, -0.25406027, -7.393088, -21.208893, -0.27221608, -7.4172244, -21.20334, -0.29122615, -7.4172244, -21.377848, 0.2384932, -7.441361, -21.35008, -0.25406027, -7.441361, -21.355635, 0.23059022, -7.4172244, -21.377848, 0.2384932, -7.4172244, -21.371868, -0.26239038, -7.441361, -21.35008, -0.25406027, -7.4172244, -21.371868, -0.26239038, -7.441361, -21.208893, -0.27221608, -7.441361, -21.35008, -0.25406027, -7.4172244, -21.371868, -0.26239038, -7.4172244, -21.20334, -0.29122615, -7.441361, -21.208893, -0.27221608, -7.441361, -21.355635, 0.23059022, -7.4172244, -21.328295, -0.24551606, -7.4172244, -21.333633, 0.22268713, -7.441361, -21.355635, 0.23059022, -7.441361, -21.35008, -0.25406027, -7.4172244, -21.328295, -0.24551606, -7.441361, -21.35008, -0.25406027, -7.4172244, -21.21466, -0.25277877, -7.4172244, -21.328295, -0.24551606, -7.441361, -21.35008, -0.25406027, -7.441361, -21.208893, -0.27221608, -7.4172244, -21.21466, -0.25277877, -7.4172244, -21.21466, -0.25277877, -7.393088, -21.090775, -0.24231243, -7.393088, -21.208893, -0.27221608, -7.4172244, -21.21466, -0.25277877, -7.4172244, -21.114271, -0.23804045, -7.393088, -21.090775, -0.24231243, -7.4172244, -21.114271, -0.23804045, -7.393088, -21.088425, 0.22674549, -7.393088, -21.090775, -0.24231243, -7.4172244, -21.114271, -0.23804045, -7.4172244, -21.111708, 0.22204626, -7.393088, -21.088425, 0.22674549, -7.4172244, -21.111708, 0.22204626, -7.393088, -21.219574, 0.2705326, -7.393088, -21.088425, 0.22674549, -7.4172244, -21.111708, 0.22204626, -7.4172244, -21.224485, 0.2510954, -7.393088, -21.219574, 0.2705326, -7.393088, -21.208893, -0.27221608, -7.4172244, -21.06728, -0.24658465, -7.4172244, -21.20334, -0.29122615, -7.393088, -21.208893, -0.27221608, -7.393088, -21.090775, -0.24231243, -7.4172244, -21.06728, -0.24658465, -7.393088, -21.090775, -0.24231243, -7.4172244, -21.06493, 0.23144436, -7.4172244, -21.06728, -0.24658465, -7.393088, -21.090775, -0.24231243, -7.393088, -21.088425, 0.22674549, -7.4172244, -21.06493, 0.23144436, -7.393088, -21.088425, 0.22674549, -7.4172244, -21.214874, 0.28996992, -7.4172244, -21.06493, 0.23144436, -7.393088, -21.088425, 0.22674549, -7.393088, -21.219574, 0.2705326, -7.4172244, -21.214874, 0.28996992, -7.4172244, -21.20334, -0.29122615, -7.441361, -21.090775, -0.24231243, -7.441361, -21.208893, -0.27221608, -7.4172244, -21.20334, -0.29122615, -7.4172244, -21.06728, -0.24658465, -7.441361, -21.090775, -0.24231243, -7.441361, -21.208893, -0.27221608, -7.4172244, -21.114271, -0.23804045, -7.4172244, -21.21466, -0.25277877, -7.441361, -21.208893, -0.27221608, -7.441361, -21.090775, -0.24231243, -7.4172244, -21.114271, -0.23804045, -7.441361, -21.090775, -0.24231243, -7.4172244, -21.111708, 0.22204626, -7.4172244, -21.114271, -0.23804045, -7.441361, -21.090775, -0.24231243, -7.441361, -21.088425, 0.22674549, -7.4172244, -21.111708, 0.22204626, -7.441361, -21.088425, 0.22674549, -7.4172244, -21.224485, 0.2510954, -7.4172244, -21.111708, 0.22204626, -7.441361, -21.088425, 0.22674549, -7.441361, -21.219574, 0.2705326, -7.4172244, -21.224485, 0.2510954, -7.4172244, -21.06728, -0.24658465, -7.441361, -21.088425, 0.22674549, -7.441361, -21.090775, -0.24231243, -7.4172244, -21.06728, -0.24658465, -7.4172244, -21.06493, 0.23144436, -7.441361, -21.088425, 0.22674549, -7.4172244, -21.06493, 0.23144436, -7.441361, -21.219574, 0.2705326, -7.441361, -21.088425, 0.22674549, -7.4172244, -21.06493, 0.23144436, -7.4172244, -21.214874, 0.28996992, -7.441361, -21.219574, 0.2705326, -7.4172244, -21.224485, 0.2510954, -7.393088, -21.355635, 0.23059022, -7.393088, -21.219574, 0.2705326, -7.4172244, -21.224485, 0.2510954, -7.4172244, -21.333633, 0.22268713, -7.393088, -21.355635, 0.23059022, -7.393088, -21.219574, 0.2705326, -7.4172244, -21.377848, 0.2384932, -7.4172244, -21.214874, 0.28996992, -7.393088, -21.219574, 0.2705326, -7.393088, -21.355635, 0.23059022, -7.4172244, -21.377848, 0.2384932, -7.4172244, -21.214874, 0.28996992, -7.441361, -21.355635, 0.23059022, -7.441361, -21.219574, 0.2705326, -7.4172244, -21.214874, 0.28996992, -7.4172244, -21.377848, 0.2384932, -7.441361, -21.355635, 0.23059022, -7.441361, -21.219574, 0.2705326, -7.4172244, -21.333633, 0.22268713, -7.4172244, -21.224485, 0.2510954, -7.441361, -21.219574, 0.2705326, -7.441361, -21.355635, 0.23059022, -7.4172244, -21.333633, 0.22268713, -3.8775039, -21.320818, 0.20923042, -3.8561444, -21.335342, -0.30446887, -3.8561444, -21.34047, 0.21777427, -3.8775039, -21.320818, 0.20923042, -3.8775039, -21.316118, -0.29528427, -3.8561444, -21.335342, -0.30446887, -3.8775039, -21.316118, -0.29528427, -3.8561444, -21.210388, -0.32390642, -3.8561444, -21.335342, -0.30446887, -3.8775039, -21.316118, -0.29528427, -3.8775039, -21.215515, -0.3031876, -3.8561444, -21.210388, -0.32390642, -3.8561444, -21.34047, 0.21777427, -3.8775039, -21.35478, -0.31322622, -3.8775039, -21.36012, 0.22631812, -3.8561444, -21.34047, 0.21777427, -3.8561444, -21.335342, -0.30446887, -3.8775039, -21.35478, -0.31322622, -3.8561444, -21.335342, -0.30446887, -3.8775039, -21.205263, -0.34462523, -3.8775039, -21.35478, -0.31322622, -3.8561444, -21.335342, -0.30446887, -3.8561444, -21.210388, -0.32390642, -3.8775039, -21.205263, -0.34462523, -3.8775039, -21.36012, 0.22631812, -3.8988638, -21.335342, -0.30446887, -3.8988638, -21.34047, 0.21777427, -3.8775039, -21.36012, 0.22631812, -3.8775039, -21.35478, -0.31322622, -3.8988638, -21.335342, -0.30446887, -3.8775039, -21.35478, -0.31322622, -3.8988638, -21.210388, -0.32390642, -3.8988638, -21.335342, -0.30446887, -3.8775039, -21.35478, -0.31322622, -3.8775039, -21.205263, -0.34462523, -3.8988638, -21.210388, -0.32390642, -3.8988638, -21.34047, 0.21777427, -3.8775039, -21.316118, -0.29528427, -3.8775039, -21.320818, 0.20923042, -3.8988638, -21.34047, 0.21777427, -3.8988638, -21.335342, -0.30446887, -3.8775039, -21.316118, -0.29528427, -3.8988638, -21.335342, -0.30446887, -3.8775039, -21.215515, -0.3031876, -3.8775039, -21.316118, -0.29528427, -3.8988638, -21.335342, -0.30446887, -3.8988638, -21.210388, -0.32390642, -3.8775039, -21.215515, -0.3031876, -3.8775039, -21.215515, -0.3031876, -3.8561444, -21.105513, -0.29165316, -3.8561444, -21.210388, -0.32390642, -3.8775039, -21.215515, -0.3031876, -3.8775039, -21.126446, -0.2871678, -3.8561444, -21.105513, -0.29165316, -3.8775039, -21.126446, -0.2871678, -3.8561444, -21.10359, 0.2135024, -3.8561444, -21.105513, -0.29165316, -3.8775039, -21.126446, -0.2871678, -3.8775039, -21.12431, 0.20858967, -3.8561444, -21.10359, 0.2135024, -3.8775039, -21.12431, 0.20858967, -3.8561444, -21.219788, 0.26070714, -3.8561444, -21.10359, 0.2135024, -3.8775039, -21.12431, 0.20858967, -3.8775039, -21.224058, 0.23977482, -3.8561444, -21.219788, 0.26070714, -3.8561444, -21.210388, -0.32390642, -3.8775039, -21.084795, -0.2963524, -3.8775039, -21.205263, -0.34462523, -3.8561444, -21.210388, -0.32390642, -3.8561444, -21.105513, -0.29165316, -3.8775039, -21.084795, -0.2963524, -3.8561444, -21.105513, -0.29165316, -3.8775039, -21.082659, 0.21862864, -3.8775039, -21.084795, -0.2963524, -3.8561444, -21.105513, -0.29165316, -3.8561444, -21.10359, 0.2135024, -3.8775039, -21.082659, 0.21862864, -3.8561444, -21.10359, 0.2135024, -3.8775039, -21.215515, 0.2816397, -3.8775039, -21.082659, 0.21862864, -3.8561444, -21.10359, 0.2135024, -3.8561444, -21.219788, 0.26070714, -3.8775039, -21.215515, 0.2816397, -3.8775039, -21.205263, -0.34462523, -3.8988638, -21.105513, -0.29165316, -3.8988638, -21.210388, -0.32390642, -3.8775039, -21.205263, -0.34462523, -3.8775039, -21.084795, -0.2963524, -3.8988638, -21.105513, -0.29165316, -3.8988638, -21.210388, -0.32390642, -3.8775039, -21.126446, -0.2871678, -3.8775039, -21.215515, -0.3031876, -3.8988638, -21.210388, -0.32390642, -3.8988638, -21.105513, -0.29165316, -3.8775039, -21.126446, -0.2871678, -3.8988638, -21.105513, -0.29165316, -3.8775039, -21.12431, 0.20858967, -3.8775039, -21.126446, -0.2871678, -3.8988638, -21.105513, -0.29165316, -3.8988638, -21.10359, 0.2135024, -3.8775039, -21.12431, 0.20858967, -3.8988638, -21.10359, 0.2135024, -3.8775039, -21.224058, 0.23977482, -3.8775039, -21.12431, 0.20858967, -3.8988638, -21.10359, 0.2135024, -3.8988638, -21.219788, 0.26070714, -3.8775039, -21.224058, 0.23977482, -3.8775039, -21.084795, -0.2963524, -3.8988638, -21.10359, 0.2135024, -3.8988638, -21.105513, -0.29165316, -3.8775039, -21.084795, -0.2963524, -3.8775039, -21.082659, 0.21862864, -3.8988638, -21.10359, 0.2135024, -3.8775039, -21.082659, 0.21862864, -3.8988638, -21.219788, 0.26070714, -3.8988638, -21.10359, 0.2135024, -3.8775039, -21.082659, 0.21862864, -3.8775039, -21.215515, 0.2816397, -3.8988638, -21.219788, 0.26070714, -3.8775039, -21.224058, 0.23977482, -3.8561444, -21.34047, 0.21777427, -3.8561444, -21.219788, 0.26070714, -3.8775039, -21.224058, 0.23977482, -3.8775039, -21.320818, 0.20923042, -3.8561444, -21.34047, 0.21777427, -3.8561444, -21.219788, 0.26070714, -3.8775039, -21.36012, 0.22631812, -3.8775039, -21.215515, 0.2816397, -3.8561444, -21.219788, 0.26070714, -3.8561444, -21.34047, 0.21777427, -3.8775039, -21.36012, 0.22631812, -3.8775039, -21.215515, 0.2816397, -3.8988638, -21.34047, 0.21777427, -3.8988638, -21.219788, 0.26070714, -3.8775039, -21.215515, 0.2816397, -3.8775039, -21.36012, 0.22631812, -3.8988638, -21.34047, 0.21777427, -3.8988638, -21.219788, 0.26070714, -3.8775039, -21.320818, 0.20923042, -3.8775039, -21.224058, 0.23977482, -3.8988638, -21.219788, 0.26070714, -3.8988638, -21.34047, 0.21777427, -3.8775039, -21.320818, 0.20923042, -7.34631, -21.333633, 0.9091861, -7.3221745, -21.35008, 0.3158151, -7.3221745, -21.355635, 0.9190115, -7.34631, -21.333633, 0.9091861, -7.34631, -21.328295, 0.3260677, -7.3221745, -21.35008, 0.3158151, -7.34631, -21.328295, 0.3260677, -7.3221745, -21.208893, 0.2931739, -7.3221745, -21.35008, 0.3158151, -7.34631, -21.328295, 0.3260677, -7.34631, -21.21466, 0.3170967, -7.3221745, -21.208893, 0.2931739, -7.3221745, -21.355635, 0.9190115, -7.34631, -21.371868, 0.30534887, -7.34631, -21.377848, 0.92883694, -7.3221745, -21.355635, 0.9190115, -7.3221745, -21.35008, 0.3158151, -7.34631, -21.371868, 0.30534887, -7.3221745, -21.35008, 0.3158151, -7.34631, -21.20334, 0.2692511, -7.34631, -21.371868, 0.30534887, -7.3221745, -21.35008, 0.3158151, -7.3221745, -21.208893, 0.2931739, -7.34631, -21.20334, 0.2692511, -7.34631, -21.377848, 0.92883694, -7.3704467, -21.35008, 0.3158151, -7.3704467, -21.355635, 0.9190115, -7.34631, -21.377848, 0.92883694, -7.34631, -21.371868, 0.30534887, -7.3704467, -21.35008, 0.3158151, -7.34631, -21.371868, 0.30534887, -7.3704467, -21.208893, 0.2931739, -7.3704467, -21.35008, 0.3158151, -7.34631, -21.371868, 0.30534887, -7.34631, -21.20334, 0.2692511, -7.3704467, -21.208893, 0.2931739, -7.3704467, -21.355635, 0.9190115, -7.34631, -21.328295, 0.3260677, -7.34631, -21.333633, 0.9091861, -7.3704467, -21.355635, 0.9190115, -7.3704467, -21.35008, 0.3158151, -7.34631, -21.328295, 0.3260677, -7.3704467, -21.35008, 0.3158151, -7.34631, -21.21466, 0.3170967, -7.34631, -21.328295, 0.3260677, -7.3704467, -21.35008, 0.3158151, -7.3704467, -21.208893, 0.2931739, -7.34631, -21.21466, 0.3170967, -7.34631, -21.21466, 0.3170967, -7.3221745, -21.090775, 0.33033967, -7.3221745, -21.208893, 0.2931739, -7.34631, -21.21466, 0.3170967, -7.34631, -21.114271, 0.33567965, -7.3221745, -21.090775, 0.33033967, -7.34631, -21.114271, 0.33567965, -7.3221745, -21.088425, 0.91409886, -7.3221745, -21.090775, 0.33033967, -7.34631, -21.114271, 0.33567965, -7.34631, -21.111708, 0.90833163, -7.3221745, -21.088425, 0.91409886, -7.34631, -21.111708, 0.90833163, -7.3221745, -21.219574, 0.96877944, -7.3221745, -21.088425, 0.91409886, -7.34631, -21.111708, 0.90833163, -7.34631, -21.224485, 0.9444295, -7.3221745, -21.219574, 0.96877944, -7.3221745, -21.208893, 0.2931739, -7.34631, -21.06728, 0.32499957, -7.34631, -21.20334, 0.2692511, -7.3221745, -21.208893, 0.2931739, -7.3221745, -21.090775, 0.33033967, -7.34631, -21.06728, 0.32499957, -7.3221745, -21.090775, 0.33033967, -7.34631, -21.06493, 0.92007935, -7.34631, -21.06728, 0.32499957, -7.3221745, -21.090775, 0.33033967, -7.3221745, -21.088425, 0.91409886, -7.34631, -21.06493, 0.92007935, -7.3221745, -21.088425, 0.91409886, -7.34631, -21.214874, 0.99291587, -7.34631, -21.06493, 0.92007935, -7.3221745, -21.088425, 0.91409886, -7.3221745, -21.219574, 0.96877944, -7.34631, -21.214874, 0.99291587, -7.34631, -21.20334, 0.2692511, -7.3704467, -21.090775, 0.33033967, -7.3704467, -21.208893, 0.2931739, -7.34631, -21.20334, 0.2692511, -7.34631, -21.06728, 0.32499957, -7.3704467, -21.090775, 0.33033967, -7.3704467, -21.208893, 0.2931739, -7.34631, -21.114271, 0.33567965, -7.34631, -21.21466, 0.3170967, -7.3704467, -21.208893, 0.2931739, -7.3704467, -21.090775, 0.33033967, -7.34631, -21.114271, 0.33567965, -7.3704467, -21.090775, 0.33033967, -7.34631, -21.111708, 0.90833163, -7.34631, -21.114271, 0.33567965, -7.3704467, -21.090775, 0.33033967, -7.3704467, -21.088425, 0.91409886, -7.34631, -21.111708, 0.90833163, -7.3704467, -21.088425, 0.91409886, -7.34631, -21.224485, 0.9444295, -7.34631, -21.111708, 0.90833163, -7.3704467, -21.088425, 0.91409886, -7.3704467, -21.219574, 0.96877944, -7.34631, -21.224485, 0.9444295, -7.34631, -21.06728, 0.32499957, -7.3704467, -21.088425, 0.91409886, -7.3704467, -21.090775, 0.33033967, -7.34631, -21.06728, 0.32499957, -7.34631, -21.06493, 0.92007935, -7.3704467, -21.088425, 0.91409886, -7.34631, -21.06493, 0.92007935, -7.3704467, -21.219574, 0.96877944, -7.3704467, -21.088425, 0.91409886, -7.34631, -21.06493, 0.92007935, -7.34631, -21.214874, 0.99291587, -7.3704467, -21.219574, 0.96877944, -7.34631, -21.224485, 0.9444295, -7.3221745, -21.355635, 0.9190115, -7.3221745, -21.219574, 0.96877944, -7.34631, -21.224485, 0.9444295, -7.34631, -21.333633, 0.9091861, -7.3221745, -21.355635, 0.9190115, -7.3221745, -21.219574, 0.96877944, -7.34631, -21.377848, 0.92883694, -7.34631, -21.214874, 0.99291587, -7.3221745, -21.219574, 0.96877944, -7.3221745, -21.355635, 0.9190115, -7.34631, -21.377848, 0.92883694, -7.34631, -21.214874, 0.99291587, -7.3704467, -21.355635, 0.9190115, -7.3704467, -21.219574, 0.96877944, -7.34631, -21.214874, 0.99291587, -7.34631, -21.377848, 0.92883694, -7.3704467, -21.355635, 0.9190115, -7.3704467, -21.219574, 0.96877944, -7.34631, -21.333633, 0.9091861, -7.34631, -21.224485, 0.9444295, -7.3704467, -21.219574, 0.96877944, -7.3704467, -21.355635, 0.9190115, -7.34631, -21.333633, 0.9091861, -7.433244, -21.333633, 2.1138701, -7.4093213, -21.35008, 1.6759974, -7.4093213, -21.355633, 2.1211324, -7.433244, -21.333633, 2.1138701, -7.433244, -21.328293, 1.6839005, -7.4093213, -21.35008, 1.6759974, -7.4093213, -21.355633, 2.1211324, -7.433244, -21.371868, 1.6683079, -7.433244, -21.377848, 2.1283946, -7.4093213, -21.355633, 2.1211324, -7.4093213, -21.35008, 1.6759974, -7.433244, -21.371868, 1.6683079, -7.433244, -21.377848, 2.1283946, -7.457381, -21.35008, 1.6759974, -7.457381, -21.355633, 2.1211324, -7.433244, -21.377848, 2.1283946, -7.433244, -21.371868, 1.6683079, -7.457381, -21.35008, 1.6759974, -7.457381, -21.355633, 2.1211324, -7.433244, -21.328293, 1.6839005, -7.433244, -21.333633, 2.1138701, -7.457381, -21.355633, 2.1211324, -7.457381, -21.35008, 1.6759974, -7.433244, -21.328293, 1.6839005, -7.433244, -21.328293, 1.6839005, -7.4093213, -21.208893, 1.6595504, -7.4093213, -21.35008, 1.6759974, -7.433244, -21.328293, 1.6839005, -7.433244, -21.21466, 1.6770654, -7.4093213, -21.208893, 1.6595504, -7.4093213, -21.35008, 1.6759974, -7.433244, -21.203339, 1.6418219, -7.433244, -21.371868, 1.6683079, -7.4093213, -21.35008, 1.6759974, -7.4093213, -21.208893, 1.6595504, -7.433244, -21.203339, 1.6418219, -7.433244, -21.371868, 1.6683079, -7.457381, -21.208893, 1.6595504, -7.457381, -21.35008, 1.6759974, -7.433244, -21.371868, 1.6683079, -7.433244, -21.203339, 1.6418219, -7.457381, -21.208893, 1.6595504, -7.457381, -21.35008, 1.6759974, -7.433244, -21.21466, 1.6770654, -7.433244, -21.328293, 1.6839005, -7.457381, -21.35008, 1.6759974, -7.457381, -21.208893, 1.6595504, -7.433244, -21.21466, 1.6770654, -7.433244, -21.21466, 1.6770654, -7.4093213, -21.090775, 1.6868907, -7.4093213, -21.208893, 1.6595504, -7.433244, -21.21466, 1.6770654, -7.433244, -21.11427, 1.6907355, -7.4093213, -21.090775, 1.6868907, -7.4093213, -21.208893, 1.6595504, -7.433244, -21.067278, 1.6828324, -7.433244, -21.203339, 1.6418219, -7.4093213, -21.208893, 1.6595504, -7.4093213, -21.090775, 1.6868907, -7.433244, -21.067278, 1.6828324, -7.433244, -21.203339, 1.6418219, -7.457381, -21.090775, 1.6868907, -7.457381, -21.208893, 1.6595504, -7.433244, -21.203339, 1.6418219, -7.433244, -21.067278, 1.6828324, -7.457381, -21.090775, 1.6868907, -7.457381, -21.208893, 1.6595504, -7.433244, -21.11427, 1.6907355, -7.433244, -21.21466, 1.6770654, -7.457381, -21.208893, 1.6595504, -7.457381, -21.090775, 1.6868907, -7.433244, -21.11427, 1.6907355, -7.433244, -21.11427, 1.6907355, -7.4093213, -21.088425, 2.1175013, -7.4093213, -21.090775, 1.6868907, -7.433244, -21.11427, 1.6907355, -7.433244, -21.111706, 2.1132293, -7.4093213, -21.088425, 2.1175013, -7.433244, -21.111706, 2.1132293, -7.4093213, -21.219572, 2.157871, -7.4093213, -21.088425, 2.1175013, -7.433244, -21.111706, 2.1132293, -7.433244, -21.224485, 2.1399288, -7.4093213, -21.219572, 2.157871, -7.4093213, -21.090775, 1.6868907, -7.433244, -21.064928, 2.121773, -7.433244, -21.067278, 1.6828324, -7.4093213, -21.090775, 1.6868907, -7.4093213, -21.088425, 2.1175013, -7.433244, -21.064928, 2.121773, -7.4093213, -21.088425, 2.1175013, -7.433244, -21.214874, 2.1755996, -7.433244, -21.064928, 2.121773, -7.4093213, -21.088425, 2.1175013, -7.4093213, -21.219572, 2.157871, -7.433244, -21.214874, 2.1755996, -7.433244, -21.067278, 1.6828324, -7.457381, -21.088425, 2.1175013, -7.457381, -21.090775, 1.6868907, -7.433244, -21.067278, 1.6828324, -7.433244, -21.064928, 2.121773, -7.457381, -21.088425, 2.1175013, -7.433244, -21.064928, 2.121773, -7.457381, -21.219572, 2.157871, -7.457381, -21.088425, 2.1175013, -7.433244, -21.064928, 2.121773, -7.433244, -21.214874, 2.1755996, -7.457381, -21.219572, 2.157871, -7.457381, -21.090775, 1.6868907, -7.433244, -21.111706, 2.1132293, -7.433244, -21.11427, 1.6907355, -7.457381, -21.090775, 1.6868907, -7.457381, -21.088425, 2.1175013, -7.433244, -21.111706, 2.1132293, -7.457381, -21.088425, 2.1175013, -7.433244, -21.224485, 2.1399288, -7.433244, -21.111706, 2.1132293, -7.457381, -21.088425, 2.1175013, -7.457381, -21.219572, 2.157871, -7.433244, -21.224485, 2.1399288, -7.433244, -21.224485, 2.1399288, -7.4093213, -21.355633, 2.1211324, -7.4093213, -21.219572, 2.157871, -7.433244, -21.224485, 2.1399288, -7.433244, -21.333633, 2.1138701, -7.4093213, -21.355633, 2.1211324, -7.4093213, -21.219572, 2.157871, -7.433244, -21.377848, 2.1283946, -7.433244, -21.214874, 2.1755996, -7.4093213, -21.219572, 2.157871, -7.4093213, -21.355633, 2.1211324, -7.433244, -21.377848, 2.1283946, -7.433244, -21.214874, 2.1755996, -7.457381, -21.355633, 2.1211324, -7.457381, -21.219572, 2.157871, -7.433244, -21.214874, 2.1755996, -7.433244, -21.377848, 2.1283946, -7.457381, -21.355633, 2.1211324, -7.457381, -21.219572, 2.157871, -7.433244, -21.333633, 2.1138701, -7.433244, -21.224485, 2.1399288, -7.457381, -21.219572, 2.157871, -7.457381, -21.355633, 2.1211324, -7.433244, -21.333633, 2.1138701, -7.433244, -21.333633, 3.4082646, -7.4093213, -21.35008, 2.8360398, -7.4093213, -21.355633, 3.4176629, -7.433244, -21.333633, 3.4082646, -7.433244, -21.328293, 2.8460789, -7.4093213, -21.35008, 2.8360398, -7.433244, -21.328293, 2.8460789, -7.4093213, -21.208893, 2.8142529, -7.4093213, -21.35008, 2.8360398, -7.433244, -21.328293, 2.8460789, -7.433244, -21.21466, 2.837535, -7.4093213, -21.208893, 2.8142529, -7.4093213, -21.355633, 3.4176629, -7.433244, -21.371866, 2.8260007, -7.433244, -21.377848, 3.4272747, -7.4093213, -21.355633, 3.4176629, -7.4093213, -21.35008, 2.8360398, -7.433244, -21.371866, 2.8260007, -7.4093213, -21.35008, 2.8360398, -7.433244, -21.203339, 2.7911844, -7.433244, -21.371866, 2.8260007, -7.4093213, -21.35008, 2.8360398, -7.4093213, -21.208893, 2.8142529, -7.433244, -21.203339, 2.7911844, -7.433244, -21.377848, 3.4272747, -7.457381, -21.35008, 2.8360398, -7.457381, -21.355633, 3.4176629, -7.433244, -21.377848, 3.4272747, -7.433244, -21.371866, 2.8260007, -7.457381, -21.35008, 2.8360398, -7.433244, -21.371866, 2.8260007, -7.457381, -21.208893, 2.8142529, -7.457381, -21.35008, 2.8360398, -7.433244, -21.371866, 2.8260007, -7.433244, -21.203339, 2.7911844, -7.457381, -21.208893, 2.8142529, -7.457381, -21.355633, 3.4176629, -7.433244, -21.328293, 2.8460789, -7.433244, -21.333633, 3.4082646, -7.457381, -21.355633, 3.4176629, -7.457381, -21.35008, 2.8360398, -7.433244, -21.328293, 2.8460789, -7.457381, -21.35008, 2.8360398, -7.433244, -21.21466, 2.837535, -7.433244, -21.328293, 2.8460789, -7.457381, -21.35008, 2.8360398, -7.457381, -21.208893, 2.8142529, -7.433244, -21.21466, 2.837535, -7.433244, -21.21466, 2.837535, -7.4093213, -21.090775, 2.850137, -7.4093213, -21.208893, 2.8142529, -7.433244, -21.21466, 2.837535, -7.433244, -21.11427, 2.8552632, -7.4093213, -21.090775, 2.850137, -7.433244, -21.11427, 2.8552632, -7.4093213, -21.088425, 3.4129639, -7.4093213, -21.090775, 2.850137, -7.433244, -21.11427, 2.8552632, -7.433244, -21.111706, 3.4071965, -7.4093213, -21.088425, 3.4129639, -7.433244, -21.111706, 3.4071965, -7.4093213, -21.219572, 3.4655085, -7.4093213, -21.088425, 3.4129639, -7.433244, -21.111706, 3.4071965, -7.433244, -21.224485, 3.4422264, -7.4093213, -21.219572, 3.4655085, -7.4093213, -21.208893, 2.8142529, -7.433244, -21.067278, 2.8450108, -7.433244, -21.203339, 2.7911844, -7.4093213, -21.208893, 2.8142529, -7.4093213, -21.090775, 2.850137, -7.433244, -21.067278, 2.8450108, -7.4093213, -21.090775, 2.850137, -7.433244, -21.064928, 3.4187307, -7.433244, -21.067278, 2.8450108, -7.4093213, -21.090775, 2.850137, -7.4093213, -21.088425, 3.4129639, -7.433244, -21.064928, 3.4187307, -7.4093213, -21.088425, 3.4129639, -7.433244, -21.214872, 3.4887905, -7.433244, -21.064928, 3.4187307, -7.4093213, -21.088425, 3.4129639, -7.4093213, -21.219572, 3.4655085, -7.433244, -21.214872, 3.4887905, -7.433244, -21.203339, 2.7911844, -7.457381, -21.090775, 2.850137, -7.457381, -21.208893, 2.8142529, -7.433244, -21.203339, 2.7911844, -7.433244, -21.067278, 2.8450108, -7.457381, -21.090775, 2.850137, -7.457381, -21.208893, 2.8142529, -7.433244, -21.11427, 2.8552632, -7.433244, -21.21466, 2.837535, -7.457381, -21.208893, 2.8142529, -7.457381, -21.090775, 2.850137, -7.433244, -21.11427, 2.8552632, -7.457381, -21.090775, 2.850137, -7.433244, -21.111706, 3.4071965, -7.433244, -21.11427, 2.8552632, -7.457381, -21.090775, 2.850137, -7.457381, -21.088425, 3.4129639, -7.433244, -21.111706, 3.4071965, -7.457381, -21.088425, 3.4129639, -7.433244, -21.224485, 3.4422264, -7.433244, -21.111706, 3.4071965, -7.457381, -21.088425, 3.4129639, -7.457381, -21.219572, 3.4655085, -7.433244, -21.224485, 3.4422264, -7.433244, -21.067278, 2.8450108, -7.457381, -21.088425, 3.4129639, -7.457381, -21.090775, 2.850137, -7.433244, -21.067278, 2.8450108, -7.433244, -21.064928, 3.4187307, -7.457381, -21.088425, 3.4129639, -7.433244, -21.064928, 3.4187307, -7.457381, -21.219572, 3.4655085, -7.457381, -21.088425, 3.4129639, -7.433244, -21.064928, 3.4187307, -7.433244, -21.214872, 3.4887905, -7.457381, -21.219572, 3.4655085, -7.433244, -21.224485, 3.4422264, -7.4093213, -21.355633, 3.4176629, -7.4093213, -21.219572, 3.4655085, -7.433244, -21.224485, 3.4422264, -7.433244, -21.333633, 3.4082646, -7.4093213, -21.355633, 3.4176629, -7.4093213, -21.219572, 3.4655085, -7.433244, -21.377848, 3.4272747, -7.433244, -21.214872, 3.4887905, -7.4093213, -21.219572, 3.4655085, -7.4093213, -21.355633, 3.4176629, -7.433244, -21.377848, 3.4272747, -7.433244, -21.214872, 3.4887905, -7.457381, -21.355633, 3.4176629, -7.457381, -21.219572, 3.4655085, -7.433244, -21.214872, 3.4887905, -7.433244, -21.377848, 3.4272747, -7.457381, -21.355633, 3.4176629, -7.457381, -21.219572, 3.4655085, -7.433244, -21.333633, 3.4082646, -7.433244, -21.224485, 3.4422264, -7.457381, -21.219572, 3.4655085, -7.457381, -21.355633, 3.4176629, -7.433244, -21.333633, 3.4082646, -3.7589583, -21.320816, 4.036238, -3.7375984, -21.335342, 3.5225387, -3.7375984, -21.340467, 4.044782, -3.7589583, -21.320816, 4.036238, -3.7589583, -21.316118, 3.5317235, -3.7375984, -21.335342, 3.5225387, -3.7589583, -21.316118, 3.5317235, -3.7375984, -21.210388, 3.5031013, -3.7375984, -21.335342, 3.5225387, -3.7589583, -21.316118, 3.5317235, -3.7589583, -21.215513, 3.5238204, -3.7375984, -21.210388, 3.5031013, -3.7375984, -21.340467, 4.044782, -3.7589583, -21.354778, 3.5137813, -3.7589583, -21.360119, 4.0533257, -3.7375984, -21.340467, 4.044782, -3.7375984, -21.335342, 3.5225387, -3.7589583, -21.354778, 3.5137813, -3.7375984, -21.335342, 3.5225387, -3.7589583, -21.205261, 3.4823828, -3.7589583, -21.354778, 3.5137813, -3.7375984, -21.335342, 3.5225387, -3.7375984, -21.210388, 3.5031013, -3.7589583, -21.205261, 3.4823828, -3.7589583, -21.360119, 4.0533257, -3.7803178, -21.335342, 3.5225387, -3.7803178, -21.340467, 4.044782, -3.7589583, -21.360119, 4.0533257, -3.7589583, -21.354778, 3.5137813, -3.7803178, -21.335342, 3.5225387, -3.7589583, -21.354778, 3.5137813, -3.7803178, -21.210388, 3.5031013, -3.7803178, -21.335342, 3.5225387, -3.7589583, -21.354778, 3.5137813, -3.7589583, -21.205261, 3.4823828, -3.7803178, -21.210388, 3.5031013, -3.7803178, -21.340467, 4.044782, -3.7589583, -21.316118, 3.5317235, -3.7589583, -21.320816, 4.036238, -3.7803178, -21.340467, 4.044782, -3.7803178, -21.335342, 3.5225387, -3.7589583, -21.316118, 3.5317235, -3.7803178, -21.335342, 3.5225387, -3.7589583, -21.215513, 3.5238204, -3.7589583, -21.316118, 3.5317235, -3.7803178, -21.335342, 3.5225387, -3.7803178, -21.210388, 3.5031013, -3.7589583, -21.215513, 3.5238204, -3.7589583, -21.215513, 3.5238204, -3.7375984, -21.105513, 3.5353546, -3.7375984, -21.210388, 3.5031013, -3.7589583, -21.215513, 3.5238204, -3.7589583, -21.126444, 3.5398402, -3.7375984, -21.105513, 3.5353546, -3.7589583, -21.126444, 3.5398402, -3.7375984, -21.10359, 4.04051, -3.7375984, -21.105513, 3.5353546, -3.7589583, -21.126444, 3.5398402, -3.7589583, -21.124308, 4.0355973, -3.7375984, -21.10359, 4.04051, -3.7589583, -21.124308, 4.0355973, -3.7375984, -21.219786, 4.087715, -3.7375984, -21.10359, 4.04051, -3.7589583, -21.124308, 4.0355973, -3.7589583, -21.224058, 4.0667825, -3.7375984, -21.219786, 4.087715, -3.7375984, -21.210388, 3.5031013, -3.7589583, -21.084793, 3.5306554, -3.7589583, -21.205261, 3.4823828, -3.7375984, -21.210388, 3.5031013, -3.7375984, -21.105513, 3.5353546, -3.7589583, -21.084793, 3.5306554, -3.7375984, -21.105513, 3.5353546, -3.7589583, -21.082657, 4.045636, -3.7589583, -21.084793, 3.5306554, -3.7375984, -21.105513, 3.5353546, -3.7375984, -21.10359, 4.04051, -3.7589583, -21.082657, 4.045636, -3.7375984, -21.10359, 4.04051, -3.7589583, -21.215513, 4.1086473, -3.7589583, -21.082657, 4.045636, -3.7375984, -21.10359, 4.04051, -3.7375984, -21.219786, 4.087715, -3.7589583, -21.215513, 4.1086473, -3.7589583, -21.205261, 3.4823828, -3.7803178, -21.105513, 3.5353546, -3.7803178, -21.210388, 3.5031013, -3.7589583, -21.205261, 3.4823828, -3.7589583, -21.084793, 3.5306554, -3.7803178, -21.105513, 3.5353546, -3.7803178, -21.210388, 3.5031013, -3.7589583, -21.126444, 3.5398402, -3.7589583, -21.215513, 3.5238204, -3.7803178, -21.210388, 3.5031013, -3.7803178, -21.105513, 3.5353546, -3.7589583, -21.126444, 3.5398402, -3.7803178, -21.105513, 3.5353546, -3.7589583, -21.124308, 4.0355973, -3.7589583, -21.126444, 3.5398402, -3.7803178, -21.105513, 3.5353546, -3.7803178, -21.10359, 4.04051, -3.7589583, -21.124308, 4.0355973, -3.7803178, -21.10359, 4.04051, -3.7589583, -21.224058, 4.0667825, -3.7589583, -21.124308, 4.0355973, -3.7803178, -21.10359, 4.04051, -3.7803178, -21.219786, 4.087715, -3.7589583, -21.224058, 4.0667825, -3.7589583, -21.084793, 3.5306554, -3.7803178, -21.10359, 4.04051, -3.7803178, -21.105513, 3.5353546, -3.7589583, -21.084793, 3.5306554, -3.7589583, -21.082657, 4.045636, -3.7803178, -21.10359, 4.04051, -3.7589583, -21.082657, 4.045636, -3.7803178, -21.219786, 4.087715, -3.7803178, -21.10359, 4.04051, -3.7589583, -21.082657, 4.045636, -3.7589583, -21.215513, 4.1086473, -3.7803178, -21.219786, 4.087715, -3.7589583, -21.224058, 4.0667825, -3.7375984, -21.340467, 4.044782, -3.7375984, -21.219786, 4.087715, -3.7589583, -21.224058, 4.0667825, -3.7589583, -21.320816, 4.036238, -3.7375984, -21.340467, 4.044782, -3.7375984, -21.219786, 4.087715, -3.7589583, -21.360119, 4.0533257, -3.7589583, -21.215513, 4.1086473, -3.7375984, -21.219786, 4.087715, -3.7375984, -21.340467, 4.044782, -3.7589583, -21.360119, 4.0533257, -3.7589583, -21.215513, 4.1086473, -3.7803178, -21.340467, 4.044782, -3.7803178, -21.219786, 4.087715, -3.7589583, -21.215513, 4.1086473, -3.7589583, -21.360119, 4.0533257, -3.7803178, -21.340467, 4.044782, -3.7803178, -21.219786, 4.087715, -3.7589583, -21.320816, 4.036238, -3.7589583, -21.224058, 4.0667825, -3.7803178, -21.219786, 4.087715, -3.7803178, -21.340467, 4.044782, -3.7589583, -21.320816, 4.036238, -7.491342, -21.333633, 1.4549251, -7.4672065, -21.35008, 1.0367032, -7.4672065, -21.355635, 1.4619738, -7.491342, -21.333633, 1.4549251, -7.491342, -21.328293, 1.0439655, -7.4672065, -21.35008, 1.0367032, -7.4672065, -21.355635, 1.4619738, -7.491342, -21.371868, 1.0292273, -7.491342, -21.377848, 1.4688089, -7.4672065, -21.355635, 1.4619738, -7.4672065, -21.35008, 1.0367032, -7.491342, -21.371868, 1.0292273, -7.491342, -21.377848, 1.4688089, -7.5154786, -21.35008, 1.0367032, -7.5154786, -21.355635, 1.4619738, -7.491342, -21.377848, 1.4688089, -7.491342, -21.371868, 1.0292273, -7.5154786, -21.35008, 1.0367032, -7.5154786, -21.355635, 1.4619738, -7.491342, -21.328293, 1.0439655, -7.491342, -21.333633, 1.4549251, -7.5154786, -21.355635, 1.4619738, -7.5154786, -21.35008, 1.0367032, -7.491342, -21.328293, 1.0439655, -7.491342, -21.328293, 1.0439655, -7.4672065, -21.208893, 1.0206835, -7.4672065, -21.35008, 1.0367032, -7.491342, -21.328293, 1.0439655, -7.491342, -21.21466, 1.0375576, -7.4672065, -21.208893, 1.0206835, -7.4672065, -21.35008, 1.0367032, -7.491342, -21.20334, 1.0038093, -7.491342, -21.371868, 1.0292273, -7.4672065, -21.35008, 1.0367032, -7.4672065, -21.208893, 1.0206835, -7.491342, -21.20334, 1.0038093, -7.491342, -21.371868, 1.0292273, -7.5154786, -21.208893, 1.0206835, -7.5154786, -21.35008, 1.0367032, -7.491342, -21.371868, 1.0292273, -7.491342, -21.20334, 1.0038093, -7.5154786, -21.208893, 1.0206835, -7.5154786, -21.35008, 1.0367032, -7.491342, -21.21466, 1.0375576, -7.491342, -21.328293, 1.0439655, -7.5154786, -21.35008, 1.0367032, -7.5154786, -21.208893, 1.0206835, -7.491342, -21.21466, 1.0375576, -7.491342, -21.21466, 1.0375576, -7.4672065, -21.090775, 1.0469557, -7.4672065, -21.208893, 1.0206835, -7.491342, -21.21466, 1.0375576, -7.491342, -21.11427, 1.0505869, -7.4672065, -21.090775, 1.0469557, -7.4672065, -21.208893, 1.0206835, -7.491342, -21.067278, 1.0431108, -7.491342, -21.20334, 1.0038093, -7.4672065, -21.208893, 1.0206835, -7.4672065, -21.090775, 1.0469557, -7.491342, -21.067278, 1.0431108, -7.491342, -21.20334, 1.0038093, -7.5154786, -21.090775, 1.0469557, -7.5154786, -21.208893, 1.0206835, -7.491342, -21.20334, 1.0038093, -7.491342, -21.067278, 1.0431108, -7.5154786, -21.090775, 1.0469557, -7.5154786, -21.208893, 1.0206835, -7.491342, -21.11427, 1.0505869, -7.491342, -21.21466, 1.0375576, -7.5154786, -21.208893, 1.0206835, -7.5154786, -21.090775, 1.0469557, -7.491342, -21.11427, 1.0505869, -7.491342, -21.11427, 1.0505869, -7.4672065, -21.088425, 1.4585562, -7.4672065, -21.090775, 1.0469557, -7.491342, -21.11427, 1.0505869, -7.491342, -21.111706, 1.4542842, -7.4672065, -21.088425, 1.4585562, -7.4672065, -21.090775, 1.0469557, -7.491342, -21.06493, 1.4626144, -7.491342, -21.067278, 1.0431108, -7.4672065, -21.090775, 1.0469557, -7.4672065, -21.088425, 1.4585562, -7.491342, -21.06493, 1.4626144, -7.491342, -21.067278, 1.0431108, -7.5154786, -21.088425, 1.4585562, -7.5154786, -21.090775, 1.0469557, -7.491342, -21.067278, 1.0431108, -7.491342, -21.06493, 1.4626144, -7.5154786, -21.088425, 1.4585562, -7.5154786, -21.090775, 1.0469557, -7.491342, -21.111706, 1.4542842, -7.491342, -21.11427, 1.0505869, -7.5154786, -21.090775, 1.0469557, -7.5154786, -21.088425, 1.4585562, -7.491342, -21.111706, 1.4542842, -7.491342, -21.111706, 1.4542842, -7.4672065, -21.219572, 1.4970036, -7.4672065, -21.088425, 1.4585562, -7.491342, -21.111706, 1.4542842, -7.491342, -21.224485, 1.4799159, -7.4672065, -21.219572, 1.4970036, -7.4672065, -21.088425, 1.4585562, -7.491342, -21.214874, 1.5138776, -7.491342, -21.06493, 1.4626144, -7.4672065, -21.088425, 1.4585562, -7.4672065, -21.219572, 1.4970036, -7.491342, -21.214874, 1.5138776, -7.491342, -21.06493, 1.4626144, -7.5154786, -21.219572, 1.4970036, -7.5154786, -21.088425, 1.4585562, -7.491342, -21.06493, 1.4626144, -7.491342, -21.214874, 1.5138776, -7.5154786, -21.219572, 1.4970036, -7.5154786, -21.088425, 1.4585562, -7.491342, -21.224485, 1.4799159, -7.491342, -21.111706, 1.4542842, -7.5154786, -21.088425, 1.4585562, -7.5154786, -21.219572, 1.4970036, -7.491342, -21.224485, 1.4799159, -7.491342, -21.224485, 1.4799159, -7.4672065, -21.355635, 1.4619738, -7.4672065, -21.219572, 1.4970036, -7.491342, -21.224485, 1.4799159, -7.491342, -21.333633, 1.4549251, -7.4672065, -21.355635, 1.4619738, -7.4672065, -21.219572, 1.4970036, -7.491342, -21.377848, 1.4688089, -7.491342, -21.214874, 1.5138776, -7.4672065, -21.219572, 1.4970036, -7.4672065, -21.355635, 1.4619738, -7.491342, -21.377848, 1.4688089, -7.491342, -21.214874, 1.5138776, -7.5154786, -21.355635, 1.4619738, -7.5154786, -21.219572, 1.4970036, -7.491342, -21.214874, 1.5138776, -7.491342, -21.377848, 1.4688089, -7.5154786, -21.355635, 1.4619738, -7.5154786, -21.219572, 1.4970036, -7.491342, -21.333633, 1.4549251, -7.491342, -21.224485, 1.4799159, -7.5154786, -21.219572, 1.4970036, -7.5154786, -21.355635, 1.4619738, -7.491342, -21.333633, 1.4549251, -7.4881387, -21.333633, 2.66858, -7.464002, -21.35008, 2.2503583, -7.464002, -21.355633, 2.6756287, -7.4881387, -21.333633, 2.66858, -7.4881387, -21.328293, 2.2576206, -7.464002, -21.35008, 2.2503583, -7.464002, -21.355633, 2.6756287, -7.4881387, -21.371866, 2.2428825, -7.4881387, -21.377848, 2.682464, -7.464002, -21.355633, 2.6756287, -7.464002, -21.35008, 2.2503583, -7.4881387, -21.371866, 2.2428825, -7.4881387, -21.377848, 2.682464, -7.512275, -21.35008, 2.2503583, -7.512275, -21.355633, 2.6756287, -7.4881387, -21.377848, 2.682464, -7.4881387, -21.371866, 2.2428825, -7.512275, -21.35008, 2.2503583, -7.512275, -21.355633, 2.6756287, -7.4881387, -21.328293, 2.2576206, -7.4881387, -21.333633, 2.66858, -7.512275, -21.355633, 2.6756287, -7.512275, -21.35008, 2.2503583, -7.4881387, -21.328293, 2.2576206, -7.4881387, -21.328293, 2.2576206, -7.464002, -21.208893, 2.2343385, -7.464002, -21.35008, 2.2503583, -7.4881387, -21.328293, 2.2576206, -7.4881387, -21.21466, 2.2512126, -7.464002, -21.208893, 2.2343385, -7.464002, -21.35008, 2.2503583, -7.4881387, -21.203339, 2.2174644, -7.4881387, -21.371866, 2.2428825, -7.464002, -21.35008, 2.2503583, -7.464002, -21.208893, 2.2343385, -7.4881387, -21.203339, 2.2174644, -7.4881387, -21.371866, 2.2428825, -7.512275, -21.208893, 2.2343385, -7.512275, -21.35008, 2.2503583, -7.4881387, -21.371866, 2.2428825, -7.4881387, -21.203339, 2.2174644, -7.512275, -21.208893, 2.2343385, -7.512275, -21.35008, 2.2503583, -7.4881387, -21.21466, 2.2512126, -7.4881387, -21.328293, 2.2576206, -7.512275, -21.35008, 2.2503583, -7.512275, -21.208893, 2.2343385, -7.4881387, -21.21466, 2.2512126, -7.4881387, -21.21466, 2.2512126, -7.464002, -21.090775, 2.2606108, -7.464002, -21.208893, 2.2343385, -7.4881387, -21.21466, 2.2512126, -7.4881387, -21.11427, 2.264242, -7.464002, -21.090775, 2.2606108, -7.464002, -21.208893, 2.2343385, -7.4881387, -21.067278, 2.256766, -7.4881387, -21.203339, 2.2174644, -7.464002, -21.208893, 2.2343385, -7.464002, -21.090775, 2.2606108, -7.4881387, -21.067278, 2.256766, -7.4881387, -21.203339, 2.2174644, -7.512275, -21.090775, 2.2606108, -7.512275, -21.208893, 2.2343385, -7.4881387, -21.203339, 2.2174644, -7.4881387, -21.067278, 2.256766, -7.512275, -21.090775, 2.2606108, -7.512275, -21.208893, 2.2343385, -7.4881387, -21.11427, 2.264242, -7.4881387, -21.21466, 2.2512126, -7.512275, -21.208893, 2.2343385, -7.512275, -21.090775, 2.2606108, -7.4881387, -21.11427, 2.264242, -7.4881387, -21.11427, 2.264242, -7.464002, -21.088425, 2.6722112, -7.464002, -21.090775, 2.2606108, -7.4881387, -21.11427, 2.264242, -7.4881387, -21.111706, 2.6679392, -7.464002, -21.088425, 2.6722112, -7.464002, -21.090775, 2.2606108, -7.4881387, -21.064928, 2.6762695, -7.4881387, -21.067278, 2.256766, -7.464002, -21.090775, 2.2606108, -7.464002, -21.088425, 2.6722112, -7.4881387, -21.064928, 2.6762695, -7.4881387, -21.067278, 2.256766, -7.512275, -21.088425, 2.6722112, -7.512275, -21.090775, 2.2606108, -7.4881387, -21.067278, 2.256766, -7.4881387, -21.064928, 2.6762695, -7.512275, -21.088425, 2.6722112, -7.512275, -21.090775, 2.2606108, -7.4881387, -21.111706, 2.6679392, -7.4881387, -21.11427, 2.264242, -7.512275, -21.090775, 2.2606108, -7.512275, -21.088425, 2.6722112, -7.4881387, -21.111706, 2.6679392, -7.4881387, -21.111706, 2.6679392, -7.464002, -21.219572, 2.7106586, -7.464002, -21.088425, 2.6722112, -7.4881387, -21.111706, 2.6679392, -7.4881387, -21.224485, 2.6935709, -7.464002, -21.219572, 2.7106586, -7.464002, -21.088425, 2.6722112, -7.4881387, -21.214874, 2.7275326, -7.4881387, -21.064928, 2.6762695, -7.464002, -21.088425, 2.6722112, -7.464002, -21.219572, 2.7106586, -7.4881387, -21.214874, 2.7275326, -7.4881387, -21.064928, 2.6762695, -7.512275, -21.219572, 2.7106586, -7.512275, -21.088425, 2.6722112, -7.4881387, -21.064928, 2.6762695, -7.4881387, -21.214874, 2.7275326, -7.512275, -21.219572, 2.7106586, -7.512275, -21.088425, 2.6722112, -7.4881387, -21.224485, 2.6935709, -7.4881387, -21.111706, 2.6679392, -7.512275, -21.088425, 2.6722112, -7.512275, -21.219572, 2.7106586, -7.4881387, -21.224485, 2.6935709, -7.4881387, -21.224485, 2.6935709, -7.464002, -21.355633, 2.6756287, -7.464002, -21.219572, 2.7106586, -7.4881387, -21.224485, 2.6935709, -7.4881387, -21.333633, 2.66858, -7.464002, -21.355633, 2.6756287, -7.464002, -21.219572, 2.7106586, -7.4881387, -21.377848, 2.682464, -7.4881387, -21.214874, 2.7275326, -7.464002, -21.219572, 2.7106586, -7.464002, -21.355633, 2.6756287, -7.4881387, -21.377848, 2.682464, -7.4881387, -21.214874, 2.7275326, -7.512275, -21.355633, 2.6756287, -7.512275, -21.219572, 2.7106586, -7.4881387, -21.214874, 2.7275326, -7.4881387, -21.377848, 2.682464, -7.512275, -21.355633, 2.6756287, -7.512275, -21.219572, 2.7106586, -7.4881387, -21.333633, 2.66858, -7.4881387, -21.224485, 2.6935709, -7.512275, -21.219572, 2.7106586, -7.512275, -21.355633, 2.6756287, -7.4881387, -21.333633, 2.66858, -3.7905703, -21.320818, 1.4850421, -3.7692103, -21.335342, 0.9713427, -3.7692103, -21.34047, 1.4933724, -3.7905703, -21.320818, 1.4850421, -3.7905703, -21.316118, 0.98031366, -3.7692103, -21.335342, 0.9713427, -3.7905703, -21.316118, 0.98031366, -3.7692103, -21.210388, 0.95169187, -3.7692103, -21.335342, 0.9713427, -3.7905703, -21.316118, 0.98031366, -3.7905703, -21.215515, 0.9724107, -3.7692103, -21.210388, 0.95169187, -3.7692103, -21.34047, 1.4933724, -3.7905703, -21.35478, 0.9623716, -3.7905703, -21.360119, 1.5019164, -3.7692103, -21.34047, 1.4933724, -3.7692103, -21.335342, 0.9713427, -3.7905703, -21.35478, 0.9623716, -3.7692103, -21.335342, 0.9713427, -3.7905703, -21.205261, 0.93097293, -3.7905703, -21.35478, 0.9623716, -3.7692103, -21.335342, 0.9713427, -3.7692103, -21.210388, 0.95169187, -3.7905703, -21.205261, 0.93097293, -3.7905703, -21.360119, 1.5019164, -3.8119302, -21.335342, 0.9713427, -3.8119302, -21.34047, 1.4933724, -3.7905703, -21.360119, 1.5019164, -3.7905703, -21.35478, 0.9623716, -3.8119302, -21.335342, 0.9713427, -3.7905703, -21.35478, 0.9623716, -3.8119302, -21.210388, 0.95169187, -3.8119302, -21.335342, 0.9713427, -3.7905703, -21.35478, 0.9623716, -3.7905703, -21.205261, 0.93097293, -3.8119302, -21.210388, 0.95169187, -3.8119302, -21.34047, 1.4933724, -3.7905703, -21.316118, 0.98031366, -3.7905703, -21.320818, 1.4850421, -3.8119302, -21.34047, 1.4933724, -3.8119302, -21.335342, 0.9713427, -3.7905703, -21.316118, 0.98031366, -3.8119302, -21.335342, 0.9713427, -3.7905703, -21.215515, 0.9724107, -3.7905703, -21.316118, 0.98031366, -3.8119302, -21.335342, 0.9713427, -3.8119302, -21.210388, 0.95169187, -3.7905703, -21.215515, 0.9724107, -3.7905703, -21.215515, 0.9724107, -3.7692103, -21.105513, 0.9839448, -3.7692103, -21.210388, 0.95169187, -3.7905703, -21.215515, 0.9724107, -3.7905703, -21.126446, 0.9884304, -3.7692103, -21.105513, 0.9839448, -3.7905703, -21.126446, 0.9884304, -3.7692103, -21.10359, 1.489314, -3.7692103, -21.105513, 0.9839448, -3.7905703, -21.126446, 0.9884304, -3.7905703, -21.12431, 1.4841876, -3.7692103, -21.10359, 1.489314, -3.7905703, -21.12431, 1.4841876, -3.7692103, -21.219786, 1.5363052, -3.7692103, -21.10359, 1.489314, -3.7905703, -21.12431, 1.4841876, -3.7905703, -21.224058, 1.5153728, -3.7692103, -21.219786, 1.5363052, -3.7692103, -21.210388, 0.95169187, -3.7905703, -21.084793, 0.9792458, -3.7905703, -21.205261, 0.93097293, -3.7692103, -21.210388, 0.95169187, -3.7692103, -21.105513, 0.9839448, -3.7905703, -21.084793, 0.9792458, -3.7692103, -21.105513, 0.9839448, -3.7905703, -21.082657, 1.4942267, -3.7905703, -21.084793, 0.9792458, -3.7692103, -21.105513, 0.9839448, -3.7692103, -21.10359, 1.489314, -3.7905703, -21.082657, 1.4942267, -3.7692103, -21.10359, 1.489314, -3.7905703, -21.215515, 1.5574512, -3.7905703, -21.082657, 1.4942267, -3.7692103, -21.10359, 1.489314, -3.7692103, -21.219786, 1.5363052, -3.7905703, -21.215515, 1.5574512, -3.7905703, -21.205261, 0.93097293, -3.8119302, -21.105513, 0.9839448, -3.8119302, -21.210388, 0.95169187, -3.7905703, -21.205261, 0.93097293, -3.7905703, -21.084793, 0.9792458, -3.8119302, -21.105513, 0.9839448, -3.8119302, -21.210388, 0.95169187, -3.7905703, -21.126446, 0.9884304, -3.7905703, -21.215515, 0.9724107, -3.8119302, -21.210388, 0.95169187, -3.8119302, -21.105513, 0.9839448, -3.7905703, -21.126446, 0.9884304, -3.8119302, -21.105513, 0.9839448, -3.7905703, -21.12431, 1.4841876, -3.7905703, -21.126446, 0.9884304, -3.8119302, -21.105513, 0.9839448, -3.8119302, -21.10359, 1.489314, -3.7905703, -21.12431, 1.4841876, -3.8119302, -21.10359, 1.489314, -3.7905703, -21.224058, 1.5153728, -3.7905703, -21.12431, 1.4841876, -3.8119302, -21.10359, 1.489314, -3.8119302, -21.219786, 1.5363052, -3.7905703, -21.224058, 1.5153728, -3.7905703, -21.084793, 0.9792458, -3.8119302, -21.10359, 1.489314, -3.8119302, -21.105513, 0.9839448, -3.7905703, -21.084793, 0.9792458, -3.7905703, -21.082657, 1.4942267, -3.8119302, -21.10359, 1.489314, -3.7905703, -21.082657, 1.4942267, -3.8119302, -21.219786, 1.5363052, -3.8119302, -21.10359, 1.489314, -3.7905703, -21.082657, 1.4942267, -3.7905703, -21.215515, 1.5574512, -3.8119302, -21.219786, 1.5363052, -3.7905703, -21.224058, 1.5153728, -3.7692103, -21.34047, 1.4933724, -3.7692103, -21.219786, 1.5363052, -3.7905703, -21.224058, 1.5153728, -3.7905703, -21.320818, 1.4850421, -3.7692103, -21.34047, 1.4933724, -3.7692103, -21.219786, 1.5363052, -3.7905703, -21.360119, 1.5019164, -3.7905703, -21.215515, 1.5574512, -3.7692103, -21.219786, 1.5363052, -3.7692103, -21.34047, 1.4933724, -3.7905703, -21.360119, 1.5019164, -3.7905703, -21.215515, 1.5574512, -3.8119302, -21.34047, 1.4933724, -3.8119302, -21.219786, 1.5363052, -3.7905703, -21.215515, 1.5574512, -3.7905703, -21.360119, 1.5019164, -3.8119302, -21.34047, 1.4933724, -3.8119302, -21.219786, 1.5363052, -3.7905703, -21.320818, 1.4850421, -3.7905703, -21.224058, 1.5153728, -3.8119302, -21.219786, 1.5363052, -3.8119302, -21.34047, 1.4933724, -3.7905703, -21.320818, 1.4850421, -3.8458915, -21.320818, 2.7324455, -3.824532, -21.335342, 2.218746, -3.824532, -21.340467, 2.7409892, -3.8458915, -21.320818, 2.7324455, -3.8458915, -21.316118, 2.227717, -3.824532, -21.335342, 2.218746, -3.8458915, -21.316118, 2.227717, -3.824532, -21.210388, 2.199095, -3.824532, -21.335342, 2.218746, -3.8458915, -21.316118, 2.227717, -3.8458915, -21.215515, 2.2200274, -3.824532, -21.210388, 2.199095, -3.824532, -21.340467, 2.7409892, -3.8458915, -21.354778, 2.209775, -3.8458915, -21.360119, 2.7495332, -3.824532, -21.340467, 2.7409892, -3.824532, -21.335342, 2.218746, -3.8458915, -21.354778, 2.209775, -3.824532, -21.335342, 2.218746, -3.8458915, -21.205261, 2.1783762, -3.8458915, -21.354778, 2.209775, -3.824532, -21.335342, 2.218746, -3.824532, -21.210388, 2.199095, -3.8458915, -21.205261, 2.1783762, -3.8458915, -21.360119, 2.7495332, -3.8672514, -21.335342, 2.218746, -3.8672514, -21.340467, 2.7409892, -3.8458915, -21.360119, 2.7495332, -3.8458915, -21.354778, 2.209775, -3.8672514, -21.335342, 2.218746, -3.8458915, -21.354778, 2.209775, -3.8672514, -21.210388, 2.199095, -3.8672514, -21.335342, 2.218746, -3.8458915, -21.354778, 2.209775, -3.8458915, -21.205261, 2.1783762, -3.8672514, -21.210388, 2.199095, -3.8672514, -21.340467, 2.7409892, -3.8458915, -21.316118, 2.227717, -3.8458915, -21.320818, 2.7324455, -3.8672514, -21.340467, 2.7409892, -3.8672514, -21.335342, 2.218746, -3.8458915, -21.316118, 2.227717, -3.8672514, -21.335342, 2.218746, -3.8458915, -21.215515, 2.2200274, -3.8458915, -21.316118, 2.227717, -3.8672514, -21.335342, 2.218746, -3.8672514, -21.210388, 2.199095, -3.8458915, -21.215515, 2.2200274, -3.8458915, -21.215515, 2.2200274, -3.824532, -21.105513, 2.231348, -3.824532, -21.210388, 2.199095, -3.8458915, -21.215515, 2.2200274, -3.8458915, -21.126444, 2.2360473, -3.824532, -21.105513, 2.231348, -3.8458915, -21.126444, 2.2360473, -3.824532, -21.10359, 2.7367172, -3.824532, -21.105513, 2.231348, -3.8458915, -21.126444, 2.2360473, -3.8458915, -21.124308, 2.731591, -3.824532, -21.10359, 2.7367172, -3.8458915, -21.124308, 2.731591, -3.824532, -21.219786, 2.7839222, -3.824532, -21.10359, 2.7367172, -3.8458915, -21.124308, 2.731591, -3.8458915, -21.224058, 2.7629898, -3.824532, -21.219786, 2.7839222, -3.824532, -21.210388, 2.199095, -3.8458915, -21.084793, 2.2268624, -3.8458915, -21.205261, 2.1783762, -3.824532, -21.210388, 2.199095, -3.824532, -21.105513, 2.231348, -3.8458915, -21.084793, 2.2268624, -3.824532, -21.105513, 2.231348, -3.8458915, -21.082657, 2.7418437, -3.8458915, -21.084793, 2.2268624, -3.824532, -21.105513, 2.231348, -3.824532, -21.10359, 2.7367172, -3.8458915, -21.082657, 2.7418437, -3.824532, -21.10359, 2.7367172, -3.8458915, -21.215513, 2.8048546, -3.8458915, -21.082657, 2.7418437, -3.824532, -21.10359, 2.7367172, -3.824532, -21.219786, 2.7839222, -3.8458915, -21.215513, 2.8048546, -3.8458915, -21.205261, 2.1783762, -3.8672514, -21.105513, 2.231348, -3.8672514, -21.210388, 2.199095, -3.8458915, -21.205261, 2.1783762, -3.8458915, -21.084793, 2.2268624, -3.8672514, -21.105513, 2.231348, -3.8672514, -21.210388, 2.199095, -3.8458915, -21.126444, 2.2360473, -3.8458915, -21.215515, 2.2200274, -3.8672514, -21.210388, 2.199095, -3.8672514, -21.105513, 2.231348, -3.8458915, -21.126444, 2.2360473, -3.8672514, -21.105513, 2.231348, -3.8458915, -21.124308, 2.731591, -3.8458915, -21.126444, 2.2360473, -3.8672514, -21.105513, 2.231348, -3.8672514, -21.10359, 2.7367172, -3.8458915, -21.124308, 2.731591, -3.8672514, -21.10359, 2.7367172, -3.8458915, -21.224058, 2.7629898, -3.8458915, -21.124308, 2.731591, -3.8672514, -21.10359, 2.7367172, -3.8672514, -21.219786, 2.7839222, -3.8458915, -21.224058, 2.7629898, -3.8458915, -21.084793, 2.2268624, -3.8672514, -21.10359, 2.7367172, -3.8672514, -21.105513, 2.231348, -3.8458915, -21.084793, 2.2268624, -3.8458915, -21.082657, 2.7418437, -3.8672514, -21.10359, 2.7367172, -3.8458915, -21.082657, 2.7418437, -3.8672514, -21.219786, 2.7839222, -3.8672514, -21.10359, 2.7367172, -3.8458915, -21.082657, 2.7418437, -3.8458915, -21.215513, 2.8048546, -3.8672514, -21.219786, 2.7839222, -3.8458915, -21.224058, 2.7629898, -3.824532, -21.340467, 2.7409892, -3.824532, -21.219786, 2.7839222, -3.8458915, -21.224058, 2.7629898, -3.8458915, -21.320818, 2.7324455, -3.824532, -21.340467, 2.7409892, -3.824532, -21.219786, 2.7839222, -3.8458915, -21.360119, 2.7495332, -3.8458915, -21.215513, 2.8048546, -3.824532, -21.219786, 2.7839222, -3.824532, -21.340467, 2.7409892, -3.8458915, -21.360119, 2.7495332, -3.8458915, -21.215513, 2.8048546, -3.8672514, -21.340467, 2.7409892, -3.8672514, -21.219786, 2.7839222, -3.8458915, -21.215513, 2.8048546, -3.8458915, -21.360119, 2.7495332, -3.8672514, -21.340467, 2.7409892, -3.8672514, -21.219786, 2.7839222, -3.8458915, -21.320818, 2.7324455, -3.8458915, -21.224058, 2.7629898, -3.8672514, -21.219786, 2.7839222, -3.8672514, -21.340467, 2.7409892, -3.8458915, -21.320818, 2.7324455, -3.774764, -21.320818, 2.140356, -3.7534046, -21.335342, 1.6268702, -3.7534046, -21.340467, 2.1489, -3.774764, -21.320818, 2.140356, -3.774764, -21.316118, 1.6358411, -3.7534046, -21.335342, 1.6268702, -3.774764, -21.316118, 1.6358411, -3.7534046, -21.210388, 1.6072192, -3.7534046, -21.335342, 1.6268702, -3.774764, -21.316118, 1.6358411, -3.774764, -21.215515, 1.6279382, -3.7534046, -21.210388, 1.6072192, -3.7534046, -21.340467, 2.1489, -3.774764, -21.35478, 1.6176856, -3.774764, -21.360119, 2.1574438, -3.7534046, -21.340467, 2.1489, -3.7534046, -21.335342, 1.6268702, -3.774764, -21.35478, 1.6176856, -3.7534046, -21.335342, 1.6268702, -3.774764, -21.205261, 1.5865004, -3.774764, -21.35478, 1.6176856, -3.7534046, -21.335342, 1.6268702, -3.7534046, -21.210388, 1.6072192, -3.774764, -21.205261, 1.5865004, -3.774764, -21.360119, 2.1574438, -3.796124, -21.335342, 1.6268702, -3.796124, -21.340467, 2.1489, -3.774764, -21.360119, 2.1574438, -3.774764, -21.35478, 1.6176856, -3.796124, -21.335342, 1.6268702, -3.774764, -21.35478, 1.6176856, -3.796124, -21.210388, 1.6072192, -3.796124, -21.335342, 1.6268702, -3.774764, -21.35478, 1.6176856, -3.774764, -21.205261, 1.5865004, -3.796124, -21.210388, 1.6072192, -3.796124, -21.340467, 2.1489, -3.774764, -21.316118, 1.6358411, -3.774764, -21.320818, 2.140356, -3.796124, -21.340467, 2.1489, -3.796124, -21.335342, 1.6268702, -3.774764, -21.316118, 1.6358411, -3.796124, -21.335342, 1.6268702, -3.774764, -21.215515, 1.6279382, -3.774764, -21.316118, 1.6358411, -3.796124, -21.335342, 1.6268702, -3.796124, -21.210388, 1.6072192, -3.774764, -21.215515, 1.6279382, -3.774764, -21.215515, 1.6279382, -3.7534046, -21.105513, 1.6392586, -3.7534046, -21.210388, 1.6072192, -3.774764, -21.215515, 1.6279382, -3.774764, -21.126446, 1.6439579, -3.7534046, -21.105513, 1.6392586, -3.774764, -21.126446, 1.6439579, -3.7534046, -21.10359, 2.144628, -3.7534046, -21.105513, 1.6392586, -3.774764, -21.126446, 1.6439579, -3.774764, -21.12431, 2.1395016, -3.7534046, -21.10359, 2.144628, -3.774764, -21.12431, 2.1395016, -3.7534046, -21.219786, 2.1918328, -3.7534046, -21.10359, 2.144628, -3.774764, -21.12431, 2.1395016, -3.774764, -21.224058, 2.1709003, -3.7534046, -21.219786, 2.1918328, -3.7534046, -21.210388, 1.6072192, -3.774764, -21.084793, 1.6347731, -3.774764, -21.205261, 1.5865004, -3.7534046, -21.210388, 1.6072192, -3.7534046, -21.105513, 1.6392586, -3.774764, -21.084793, 1.6347731, -3.7534046, -21.105513, 1.6392586, -3.774764, -21.082657, 2.1497543, -3.774764, -21.084793, 1.6347731, -3.7534046, -21.105513, 1.6392586, -3.7534046, -21.10359, 2.144628, -3.774764, -21.082657, 2.1497543, -3.7534046, -21.10359, 2.144628, -3.774764, -21.215515, 2.2127652, -3.774764, -21.082657, 2.1497543, -3.7534046, -21.10359, 2.144628, -3.7534046, -21.219786, 2.1918328, -3.774764, -21.215515, 2.2127652, -3.774764, -21.205261, 1.5865004, -3.796124, -21.105513, 1.6392586, -3.796124, -21.210388, 1.6072192, -3.774764, -21.205261, 1.5865004, -3.774764, -21.084793, 1.6347731, -3.796124, -21.105513, 1.6392586, -3.796124, -21.210388, 1.6072192, -3.774764, -21.126446, 1.6439579, -3.774764, -21.215515, 1.6279382, -3.796124, -21.210388, 1.6072192, -3.796124, -21.105513, 1.6392586, -3.774764, -21.126446, 1.6439579, -3.796124, -21.105513, 1.6392586, -3.774764, -21.12431, 2.1395016, -3.774764, -21.126446, 1.6439579, -3.796124, -21.105513, 1.6392586, -3.796124, -21.10359, 2.144628, -3.774764, -21.12431, 2.1395016, -3.796124, -21.10359, 2.144628, -3.774764, -21.224058, 2.1709003, -3.774764, -21.12431, 2.1395016, -3.796124, -21.10359, 2.144628, -3.796124, -21.219786, 2.1918328, -3.774764, -21.224058, 2.1709003, -3.774764, -21.084793, 1.6347731, -3.796124, -21.10359, 2.144628, -3.796124, -21.105513, 1.6392586, -3.774764, -21.084793, 1.6347731, -3.774764, -21.082657, 2.1497543, -3.796124, -21.10359, 2.144628, -3.774764, -21.082657, 2.1497543, -3.796124, -21.219786, 2.1918328, -3.796124, -21.10359, 2.144628, -3.774764, -21.082657, 2.1497543, -3.774764, -21.215515, 2.2127652, -3.796124, -21.219786, 2.1918328, -3.774764, -21.224058, 2.1709003, -3.7534046, -21.340467, 2.1489, -3.7534046, -21.219786, 2.1918328, -3.774764, -21.224058, 2.1709003, -3.774764, -21.320818, 2.140356, -3.7534046, -21.340467, 2.1489, -3.7534046, -21.219786, 2.1918328, -3.774764, -21.360119, 2.1574438, -3.774764, -21.215515, 2.2127652, -3.7534046, -21.219786, 2.1918328, -3.7534046, -21.340467, 2.1489, -3.774764, -21.360119, 2.1574438, -3.774764, -21.215515, 2.2127652, -3.796124, -21.340467, 2.1489, -3.796124, -21.219786, 2.1918328, -3.774764, -21.215515, 2.2127652, -3.774764, -21.360119, 2.1574438, -3.796124, -21.340467, 2.1489, -3.796124, -21.219786, 2.1918328, -3.774764, -21.320818, 2.140356, -3.774764, -21.224058, 2.1709003, -3.796124, -21.219786, 2.1918328, -3.796124, -21.340467, 2.1489, -3.774764, -21.320818, 2.140356, -7.4558854, -21.333633, -0.46060777, -7.431749, -21.35008, -0.89848065, -7.431749, -21.355635, -0.45334554, -7.4558854, -21.333633, -0.46060777, -7.4558854, -21.328295, -0.89057755, -7.431749, -21.35008, -0.89848065, -7.431749, -21.355635, -0.45334554, -7.4558854, -21.371868, -0.9061701, -7.4558854, -21.37785, -0.4460833, -7.431749, -21.355635, -0.45334554, -7.431749, -21.35008, -0.89848065, -7.4558854, -21.371868, -0.9061701, -7.4558854, -21.37785, -0.4460833, -7.480022, -21.35008, -0.89848065, -7.480022, -21.355635, -0.45334554, -7.4558854, -21.37785, -0.4460833, -7.4558854, -21.371868, -0.9061701, -7.480022, -21.35008, -0.89848065, -7.480022, -21.355635, -0.45334554, -7.4558854, -21.328295, -0.89057755, -7.4558854, -21.333633, -0.46060777, -7.480022, -21.355635, -0.45334554, -7.480022, -21.35008, -0.89848065, -7.4558854, -21.328295, -0.89057755, -7.4558854, -21.328295, -0.89057755, -7.431749, -21.208895, -0.9149277, -7.431749, -21.35008, -0.89848065, -7.4558854, -21.328295, -0.89057755, -7.4558854, -21.21466, -0.8974128, -7.431749, -21.208895, -0.9149277, -7.431749, -21.35008, -0.89848065, -7.4558854, -21.20334, -0.9326565, -7.4558854, -21.371868, -0.9061701, -7.431749, -21.35008, -0.89848065, -7.431749, -21.208895, -0.9149277, -7.4558854, -21.20334, -0.9326565, -7.4558854, -21.371868, -0.9061701, -7.480022, -21.208895, -0.9149277, -7.480022, -21.35008, -0.89848065, -7.4558854, -21.371868, -0.9061701, -7.4558854, -21.20334, -0.9326565, -7.480022, -21.208895, -0.9149277, -7.480022, -21.35008, -0.89848065, -7.4558854, -21.21466, -0.8974128, -7.4558854, -21.328295, -0.89057755, -7.480022, -21.35008, -0.89848065, -7.480022, -21.208895, -0.9149277, -7.4558854, -21.21466, -0.8974128, -7.4558854, -21.21466, -0.8974128, -7.431749, -21.090775, -0.88758755, -7.431749, -21.208895, -0.9149277, -7.4558854, -21.21466, -0.8974128, -7.4558854, -21.114271, -0.8837426, -7.431749, -21.090775, -0.88758755, -7.431749, -21.208895, -0.9149277, -7.4558854, -21.06728, -0.89164567, -7.4558854, -21.20334, -0.9326565, -7.431749, -21.208895, -0.9149277, -7.431749, -21.090775, -0.88758755, -7.4558854, -21.06728, -0.89164567, -7.4558854, -21.20334, -0.9326565, -7.480022, -21.090775, -0.88758755, -7.480022, -21.208895, -0.9149277, -7.4558854, -21.20334, -0.9326565, -7.4558854, -21.06728, -0.89164567, -7.480022, -21.090775, -0.88758755, -7.480022, -21.208895, -0.9149277, -7.4558854, -21.114271, -0.8837426, -7.4558854, -21.21466, -0.8974128, -7.480022, -21.208895, -0.9149277, -7.480022, -21.090775, -0.88758755, -7.4558854, -21.114271, -0.8837426, -7.4558854, -21.114271, -0.8837426, -7.431749, -21.088425, -0.45697713, -7.431749, -21.090775, -0.88758755, -7.4558854, -21.114271, -0.8837426, -7.4558854, -21.111708, -0.46124887, -7.431749, -21.088425, -0.45697713, -7.4558854, -21.111708, -0.46124887, -7.431749, -21.219574, -0.416821, -7.431749, -21.088425, -0.45697713, -7.4558854, -21.111708, -0.46124887, -7.4558854, -21.224487, -0.43454933, -7.431749, -21.219574, -0.416821, -7.431749, -21.090775, -0.88758755, -7.4558854, -21.06493, -0.45249128, -7.4558854, -21.06728, -0.89164567, -7.431749, -21.090775, -0.88758755, -7.431749, -21.088425, -0.45697713, -7.4558854, -21.06493, -0.45249128, -7.431749, -21.088425, -0.45697713, -7.4558854, -21.214874, -0.39887857, -7.4558854, -21.06493, -0.45249128, -7.431749, -21.088425, -0.45697713, -7.431749, -21.219574, -0.416821, -7.4558854, -21.214874, -0.39887857, -7.4558854, -21.06728, -0.89164567, -7.480022, -21.088425, -0.45697713, -7.480022, -21.090775, -0.88758755, -7.4558854, -21.06728, -0.89164567, -7.4558854, -21.06493, -0.45249128, -7.480022, -21.088425, -0.45697713, -7.4558854, -21.06493, -0.45249128, -7.480022, -21.219574, -0.416821, -7.480022, -21.088425, -0.45697713, -7.4558854, -21.06493, -0.45249128, -7.4558854, -21.214874, -0.39887857, -7.480022, -21.219574, -0.416821, -7.480022, -21.090775, -0.88758755, -7.4558854, -21.111708, -0.46124887, -7.4558854, -21.114271, -0.8837426, -7.480022, -21.090775, -0.88758755, -7.480022, -21.088425, -0.45697713, -7.4558854, -21.111708, -0.46124887, -7.480022, -21.088425, -0.45697713, -7.4558854, -21.224487, -0.43454933, -7.4558854, -21.111708, -0.46124887, -7.480022, -21.088425, -0.45697713, -7.480022, -21.219574, -0.416821, -7.4558854, -21.224487, -0.43454933, -7.4558854, -21.224487, -0.43454933, -7.431749, -21.355635, -0.45334554, -7.431749, -21.219574, -0.416821, -7.4558854, -21.224487, -0.43454933, -7.4558854, -21.333633, -0.46060777, -7.431749, -21.355635, -0.45334554, -7.431749, -21.219574, -0.416821, -7.4558854, -21.37785, -0.4460833, -7.4558854, -21.214874, -0.39887857, -7.431749, -21.219574, -0.416821, -7.431749, -21.355635, -0.45334554, -7.4558854, -21.37785, -0.4460833, -7.4558854, -21.214874, -0.39887857, -7.480022, -21.355635, -0.45334554, -7.480022, -21.219574, -0.416821, -7.4558854, -21.214874, -0.39887857, -7.4558854, -21.37785, -0.4460833, -7.480022, -21.355635, -0.45334554, -7.480022, -21.219574, -0.416821, -7.4558854, -21.333633, -0.46060777, -7.4558854, -21.224487, -0.43454933, -7.480022, -21.219574, -0.416821, -7.480022, -21.355635, -0.45334554, -7.4558854, -21.333633, -0.46060777, -3.8775039, -21.320818, 0.85066056, -3.8561444, -21.335342, 0.33696115, -3.8561444, -21.34047, 0.85920453, -3.8775039, -21.320818, 0.85066056, -3.8775039, -21.316118, 0.34593213, -3.8561444, -21.335342, 0.33696115, -3.8775039, -21.316118, 0.34593213, -3.8561444, -21.210388, 0.31752384, -3.8561444, -21.335342, 0.33696115, -3.8775039, -21.316118, 0.34593213, -3.8775039, -21.215515, 0.33824265, -3.8561444, -21.210388, 0.31752384, -3.8561444, -21.34047, 0.85920453, -3.8775039, -21.35478, 0.32799017, -3.8775039, -21.360119, 0.8677484, -3.8561444, -21.34047, 0.85920453, -3.8561444, -21.335342, 0.33696115, -3.8775039, -21.35478, 0.32799017, -3.8561444, -21.335342, 0.33696115, -3.8775039, -21.205263, 0.29680502, -3.8775039, -21.35478, 0.32799017, -3.8561444, -21.335342, 0.33696115, -3.8561444, -21.210388, 0.31752384, -3.8775039, -21.205263, 0.29680502, -3.8775039, -21.360119, 0.8677484, -3.8988638, -21.335342, 0.33696115, -3.8988638, -21.34047, 0.85920453, -3.8775039, -21.360119, 0.8677484, -3.8775039, -21.35478, 0.32799017, -3.8988638, -21.335342, 0.33696115, -3.8775039, -21.35478, 0.32799017, -3.8988638, -21.210388, 0.31752384, -3.8988638, -21.335342, 0.33696115, -3.8775039, -21.35478, 0.32799017, -3.8775039, -21.205263, 0.29680502, -3.8988638, -21.210388, 0.31752384, -3.8988638, -21.34047, 0.85920453, -3.8775039, -21.316118, 0.34593213, -3.8775039, -21.320818, 0.85066056, -3.8988638, -21.34047, 0.85920453, -3.8988638, -21.335342, 0.33696115, -3.8775039, -21.316118, 0.34593213, -3.8988638, -21.335342, 0.33696115, -3.8775039, -21.215515, 0.33824265, -3.8775039, -21.316118, 0.34593213, -3.8988638, -21.335342, 0.33696115, -3.8988638, -21.210388, 0.31752384, -3.8775039, -21.215515, 0.33824265, -3.8775039, -21.215515, 0.33824265, -3.8561444, -21.105513, 0.34956324, -3.8561444, -21.210388, 0.31752384, -3.8775039, -21.215515, 0.33824265, -3.8775039, -21.126446, 0.35404897, -3.8561444, -21.105513, 0.34956324, -3.8775039, -21.126446, 0.35404897, -3.8561444, -21.10359, 0.85493267, -3.8561444, -21.105513, 0.34956324, -3.8775039, -21.126446, 0.35404897, -3.8775039, -21.12431, 0.8498062, -3.8561444, -21.10359, 0.85493267, -3.8775039, -21.12431, 0.8498062, -3.8561444, -21.219788, 0.9021374, -3.8561444, -21.10359, 0.85493267, -3.8775039, -21.12431, 0.8498062, -3.8775039, -21.224058, 0.88120484, -3.8561444, -21.219788, 0.9021374, -3.8561444, -21.210388, 0.31752384, -3.8775039, -21.084793, 0.34507775, -3.8775039, -21.205263, 0.29680502, -3.8561444, -21.210388, 0.31752384, -3.8561444, -21.105513, 0.34956324, -3.8775039, -21.084793, 0.34507775, -3.8561444, -21.105513, 0.34956324, -3.8775039, -21.082657, 0.8600589, -3.8775039, -21.084793, 0.34507775, -3.8561444, -21.105513, 0.34956324, -3.8561444, -21.10359, 0.85493267, -3.8775039, -21.082657, 0.8600589, -3.8561444, -21.10359, 0.85493267, -3.8775039, -21.215515, 0.92306983, -3.8775039, -21.082657, 0.8600589, -3.8561444, -21.10359, 0.85493267, -3.8561444, -21.219788, 0.9021374, -3.8775039, -21.215515, 0.92306983, -3.8775039, -21.205263, 0.29680502, -3.8988638, -21.105513, 0.34956324, -3.8988638, -21.210388, 0.31752384, -3.8775039, -21.205263, 0.29680502, -3.8775039, -21.084793, 0.34507775, -3.8988638, -21.105513, 0.34956324, -3.8988638, -21.210388, 0.31752384, -3.8775039, -21.126446, 0.35404897, -3.8775039, -21.215515, 0.33824265, -3.8988638, -21.210388, 0.31752384, -3.8988638, -21.105513, 0.34956324, -3.8775039, -21.126446, 0.35404897, -3.8988638, -21.105513, 0.34956324, -3.8775039, -21.12431, 0.8498062, -3.8775039, -21.126446, 0.35404897, -3.8988638, -21.105513, 0.34956324, -3.8988638, -21.10359, 0.85493267, -3.8775039, -21.12431, 0.8498062, -3.8988638, -21.10359, 0.85493267, -3.8775039, -21.224058, 0.88120484, -3.8775039, -21.12431, 0.8498062, -3.8988638, -21.10359, 0.85493267, -3.8988638, -21.219788, 0.9021374, -3.8775039, -21.224058, 0.88120484, -3.8775039, -21.084793, 0.34507775, -3.8988638, -21.10359, 0.85493267, -3.8988638, -21.105513, 0.34956324, -3.8775039, -21.084793, 0.34507775, -3.8775039, -21.082657, 0.8600589, -3.8988638, -21.10359, 0.85493267, -3.8775039, -21.082657, 0.8600589, -3.8988638, -21.219788, 0.9021374, -3.8988638, -21.10359, 0.85493267, -3.8775039, -21.082657, 0.8600589, -3.8775039, -21.215515, 0.92306983, -3.8988638, -21.219788, 0.9021374, -3.8775039, -21.224058, 0.88120484, -3.8561444, -21.34047, 0.85920453, -3.8561444, -21.219788, 0.9021374, -3.8775039, -21.224058, 0.88120484, -3.8775039, -21.320818, 0.85066056, -3.8561444, -21.34047, 0.85920453, -3.8561444, -21.219788, 0.9021374, -3.8775039, -21.360119, 0.8677484, -3.8775039, -21.215515, 0.92306983, -3.8561444, -21.219788, 0.9021374, -3.8561444, -21.34047, 0.85920453, -3.8775039, -21.360119, 0.8677484, -3.8775039, -21.215515, 0.92306983, -3.8988638, -21.34047, 0.85920453, -3.8988638, -21.219788, 0.9021374, -3.8775039, -21.215515, 0.92306983, -3.8775039, -21.360119, 0.8677484, -3.8988638, -21.34047, 0.85920453, -3.8988638, -21.219788, 0.9021374, -3.8775039, -21.320818, 0.85066056, -3.8775039, -21.224058, 0.88120484, -3.8988638, -21.219788, 0.9021374, -3.8988638, -21.34047, 0.85920453, -3.8775039, -21.320818, 0.85066056, -3.7194428, -21.320816, 3.3595648, -3.698083, -21.335342, 2.8460789, -3.698083, -21.340467, 3.3681085, -3.7194428, -21.320816, 3.3595648, -3.7194428, -21.316118, 2.8550498, -3.698083, -21.335342, 2.8460789, -3.7194428, -21.316118, 2.8550498, -3.698083, -21.210388, 2.826428, -3.698083, -21.335342, 2.8460789, -3.7194428, -21.316118, 2.8550498, -3.7194428, -21.215513, 2.8471467, -3.698083, -21.210388, 2.826428, -3.698083, -21.340467, 3.3681085, -3.7194428, -21.354778, 2.836894, -3.7194428, -21.360119, 3.3768659, -3.698083, -21.340467, 3.3681085, -3.698083, -21.335342, 2.8460789, -3.7194428, -21.354778, 2.836894, -3.698083, -21.335342, 2.8460789, -3.7194428, -21.205261, 2.805709, -3.7194428, -21.354778, 2.836894, -3.698083, -21.335342, 2.8460789, -3.698083, -21.210388, 2.826428, -3.7194428, -21.205261, 2.805709, -3.7194428, -21.360119, 3.3768659, -3.7408023, -21.335342, 2.8460789, -3.7408023, -21.340467, 3.3681085, -3.7194428, -21.360119, 3.3768659, -3.7194428, -21.354778, 2.836894, -3.7408023, -21.335342, 2.8460789, -3.7194428, -21.354778, 2.836894, -3.7408023, -21.210388, 2.826428, -3.7408023, -21.335342, 2.8460789, -3.7194428, -21.354778, 2.836894, -3.7194428, -21.205261, 2.805709, -3.7408023, -21.210388, 2.826428, -3.7408023, -21.340467, 3.3681085, -3.7194428, -21.316118, 2.8550498, -3.7194428, -21.320816, 3.3595648, -3.7408023, -21.340467, 3.3681085, -3.7408023, -21.335342, 2.8460789, -3.7194428, -21.316118, 2.8550498, -3.7408023, -21.335342, 2.8460789, -3.7194428, -21.215513, 2.8471467, -3.7194428, -21.316118, 2.8550498, -3.7408023, -21.335342, 2.8460789, -3.7408023, -21.210388, 2.826428, -3.7194428, -21.215513, 2.8471467, -3.7194428, -21.215513, 2.8471467, -3.698083, -21.105513, 2.8586807, -3.698083, -21.210388, 2.826428, -3.7194428, -21.215513, 2.8471467, -3.7194428, -21.126444, 2.8631663, -3.698083, -21.105513, 2.8586807, -3.7194428, -21.126444, 2.8631663, -3.698083, -21.10359, 3.3640501, -3.698083, -21.105513, 2.8586807, -3.7194428, -21.126444, 2.8631663, -3.7194428, -21.124308, 3.358924, -3.698083, -21.10359, 3.3640501, -3.7194428, -21.124308, 3.358924, -3.698083, -21.219786, 3.411255, -3.698083, -21.10359, 3.3640501, -3.7194428, -21.124308, 3.358924, -3.7194428, -21.224058, 3.3903227, -3.698083, -21.219786, 3.411255, -3.698083, -21.210388, 2.826428, -3.7194428, -21.084793, 2.8539817, -3.7194428, -21.205261, 2.805709, -3.698083, -21.210388, 2.826428, -3.698083, -21.105513, 2.8586807, -3.7194428, -21.084793, 2.8539817, -3.698083, -21.105513, 2.8586807, -3.7194428, -21.082657, 3.3691764, -3.7194428, -21.084793, 2.8539817, -3.698083, -21.105513, 2.8586807, -3.698083, -21.10359, 3.3640501, -3.7194428, -21.082657, 3.3691764, -3.698083, -21.10359, 3.3640501, -3.7194428, -21.215513, 3.431974, -3.7194428, -21.082657, 3.3691764, -3.698083, -21.10359, 3.3640501, -3.698083, -21.219786, 3.411255, -3.7194428, -21.215513, 3.431974, -3.7194428, -21.205261, 2.805709, -3.7408023, -21.105513, 2.8586807, -3.7408023, -21.210388, 2.826428, -3.7194428, -21.205261, 2.805709, -3.7194428, -21.084793, 2.8539817, -3.7408023, -21.105513, 2.8586807, -3.7408023, -21.210388, 2.826428, -3.7194428, -21.126444, 2.8631663, -3.7194428, -21.215513, 2.8471467, -3.7408023, -21.210388, 2.826428, -3.7408023, -21.105513, 2.8586807, -3.7194428, -21.126444, 2.8631663, -3.7408023, -21.105513, 2.8586807, -3.7194428, -21.124308, 3.358924, -3.7194428, -21.126444, 2.8631663, -3.7408023, -21.105513, 2.8586807, -3.7408023, -21.10359, 3.3640501, -3.7194428, -21.124308, 3.358924, -3.7408023, -21.10359, 3.3640501, -3.7194428, -21.224058, 3.3903227, -3.7194428, -21.124308, 3.358924, -3.7408023, -21.10359, 3.3640501, -3.7408023, -21.219786, 3.411255, -3.7194428, -21.224058, 3.3903227, -3.7194428, -21.084793, 2.8539817, -3.7408023, -21.10359, 3.3640501, -3.7408023, -21.105513, 2.8586807, -3.7194428, -21.084793, 2.8539817, -3.7194428, -21.082657, 3.3691764, -3.7408023, -21.10359, 3.3640501, -3.7194428, -21.082657, 3.3691764, -3.7408023, -21.219786, 3.411255, -3.7408023, -21.10359, 3.3640501, -3.7194428, -21.082657, 3.3691764, -3.7194428, -21.215513, 3.431974, -3.7408023, -21.219786, 3.411255, -3.7194428, -21.224058, 3.3903227, -3.698083, -21.340467, 3.3681085, -3.698083, -21.219786, 3.411255, -3.7194428, -21.224058, 3.3903227, -3.7194428, -21.320816, 3.3595648, -3.698083, -21.340467, 3.3681085, -3.698083, -21.219786, 3.411255, -3.7194428, -21.360119, 3.3768659, -3.7194428, -21.215513, 3.431974, -3.698083, -21.219786, 3.411255, -3.698083, -21.340467, 3.3681085, -3.7194428, -21.360119, 3.3768659, -3.7194428, -21.215513, 3.431974, -3.7408023, -21.340467, 3.3681085, -3.7408023, -21.219786, 3.411255, -3.7194428, -21.215513, 3.431974, -3.7194428, -21.360119, 3.3768659, -3.7408023, -21.340467, 3.3681085, -3.7408023, -21.219786, 3.411255, -3.7194428, -21.320816, 3.3595648, -3.7194428, -21.224058, 3.3903227, -3.7408023, -21.219786, 3.411255, -3.7408023, -21.340467, 3.3681085, -3.7194428, -21.320816, 3.3595648, -7.4172244, -21.333633, 4.035811, -7.393088, -21.35008, 3.6370263, -7.393088, -21.355633, 4.0424323, -7.4172244, -21.333633, 4.035811, -7.4172244, -21.328293, 3.6438615, -7.393088, -21.35008, 3.6370263, -7.393088, -21.355633, 4.0424323, -7.4172244, -21.371866, 3.6299777, -7.4172244, -21.377848, 4.049054, -7.393088, -21.355633, 4.0424323, -7.393088, -21.35008, 3.6370263, -7.4172244, -21.371866, 3.6299777, -7.4172244, -21.377848, 4.049054, -7.441361, -21.35008, 3.6370263, -7.441361, -21.355633, 4.0424323, -7.4172244, -21.377848, 4.049054, -7.4172244, -21.371866, 3.6299777, -7.441361, -21.35008, 3.6370263, -7.441361, -21.355633, 4.0424323, -7.4172244, -21.328293, 3.6438615, -7.4172244, -21.333633, 4.035811, -7.441361, -21.355633, 4.0424323, -7.441361, -21.35008, 3.6370263, -7.4172244, -21.328293, 3.6438615, -7.4172244, -21.328293, 3.6438615, -7.393088, -21.208893, 3.621861, -7.393088, -21.35008, 3.6370263, -7.4172244, -21.328293, 3.6438615, -7.4172244, -21.214659, 3.6378808, -7.393088, -21.208893, 3.621861, -7.393088, -21.35008, 3.6370263, -7.4172244, -21.203339, 3.6056278, -7.4172244, -21.371866, 3.6299777, -7.393088, -21.35008, 3.6370263, -7.393088, -21.208893, 3.621861, -7.4172244, -21.203339, 3.6056278, -7.4172244, -21.371866, 3.6299777, -7.441361, -21.208893, 3.621861, -7.441361, -21.35008, 3.6370263, -7.4172244, -21.371866, 3.6299777, -7.4172244, -21.203339, 3.6056278, -7.441361, -21.208893, 3.621861, -7.441361, -21.35008, 3.6370263, -7.4172244, -21.214659, 3.6378808, -7.4172244, -21.328293, 3.6438615, -7.441361, -21.35008, 3.6370263, -7.441361, -21.208893, 3.621861, -7.4172244, -21.214659, 3.6378808, -7.4172244, -21.214659, 3.6378808, -7.393088, -21.090773, 3.6466384, -7.393088, -21.208893, 3.621861, -7.4172244, -21.214659, 3.6378808, -7.4172244, -21.11427, 3.6502695, -7.393088, -21.090773, 3.6466384, -7.393088, -21.208893, 3.621861, -7.4172244, -21.067278, 3.6432207, -7.4172244, -21.203339, 3.6056278, -7.393088, -21.208893, 3.621861, -7.393088, -21.090773, 3.6466384, -7.4172244, -21.067278, 3.6432207, -7.4172244, -21.203339, 3.6056278, -7.441361, -21.090773, 3.6466384, -7.441361, -21.208893, 3.621861, -7.4172244, -21.203339, 3.6056278, -7.4172244, -21.067278, 3.6432207, -7.441361, -21.090773, 3.6466384, -7.441361, -21.208893, 3.621861, -7.4172244, -21.11427, 3.6502695, -7.4172244, -21.214659, 3.6378808, -7.441361, -21.208893, 3.621861, -7.441361, -21.090773, 3.6466384, -7.4172244, -21.11427, 3.6502695, -7.4172244, -21.11427, 3.6502695, -7.393088, -21.088425, 4.0392284, -7.393088, -21.090773, 3.6466384, -7.4172244, -21.11427, 3.6502695, -7.4172244, -21.111706, 4.03517, -7.393088, -21.088425, 4.0392284, -7.393088, -21.090773, 3.6466384, -7.4172244, -21.064928, 4.043073, -7.4172244, -21.067278, 3.6432207, -7.393088, -21.090773, 3.6466384, -7.393088, -21.088425, 4.0392284, -7.4172244, -21.064928, 4.043073, -7.4172244, -21.067278, 3.6432207, -7.441361, -21.088425, 4.0392284, -7.441361, -21.090773, 3.6466384, -7.4172244, -21.067278, 3.6432207, -7.4172244, -21.064928, 4.043073, -7.441361, -21.088425, 4.0392284, -7.441361, -21.090773, 3.6466384, -7.4172244, -21.111706, 4.03517, -7.4172244, -21.11427, 3.6502695, -7.441361, -21.090773, 3.6466384, -7.441361, -21.088425, 4.0392284, -7.4172244, -21.111706, 4.03517, -7.4172244, -21.111706, 4.03517, -7.393088, -21.219572, 4.0757537, -7.393088, -21.088425, 4.0392284, -7.4172244, -21.111706, 4.03517, -7.4172244, -21.224485, 4.0595202, -7.393088, -21.219572, 4.0757537, -7.393088, -21.088425, 4.0392284, -7.4172244, -21.214872, 4.0919867, -7.4172244, -21.064928, 4.043073, -7.393088, -21.088425, 4.0392284, -7.393088, -21.219572, 4.0757537, -7.4172244, -21.214872, 4.0919867, -7.4172244, -21.064928, 4.043073, -7.441361, -21.219572, 4.0757537, -7.441361, -21.088425, 4.0392284, -7.4172244, -21.064928, 4.043073, -7.4172244, -21.214872, 4.0919867, -7.441361, -21.219572, 4.0757537, -7.441361, -21.088425, 4.0392284, -7.4172244, -21.224485, 4.0595202, -7.4172244, -21.111706, 4.03517, -7.441361, -21.088425, 4.0392284, -7.441361, -21.219572, 4.0757537, -7.4172244, -21.224485, 4.0595202, -7.4172244, -21.224485, 4.0595202, -7.393088, -21.355633, 4.0424323, -7.393088, -21.219572, 4.0757537, -7.4172244, -21.224485, 4.0595202, -7.4172244, -21.333633, 4.035811, -7.393088, -21.355633, 4.0424323, -7.393088, -21.219572, 4.0757537, -7.4172244, -21.377848, 4.049054, -7.4172244, -21.214872, 4.0919867, -7.393088, -21.219572, 4.0757537, -7.393088, -21.355633, 4.0424323, -7.4172244, -21.377848, 4.049054, -7.4172244, -21.214872, 4.0919867, -7.441361, -21.355633, 4.0424323, -7.441361, -21.219572, 4.0757537, -7.4172244, -21.214872, 4.0919867, -7.4172244, -21.377848, 4.049054, -7.441361, -21.355633, 4.0424323, -7.441361, -21.219572, 4.0757537, -7.4172244, -21.333633, 4.035811, -7.4172244, -21.224485, 4.0595202, -7.441361, -21.219572, 4.0757537, -7.441361, -21.355633, 4.0424323, -7.4172244, -21.333633, 4.035811, -7.4558854, -21.333632, 4.726582, -7.431749, -21.350079, 4.2887096, -7.431749, -21.355633, 4.7338443, -7.4558854, -21.333632, 4.726582, -7.4558854, -21.328293, 4.2966127, -7.431749, -21.350079, 4.2887096, -7.431749, -21.355633, 4.7338443, -7.4558854, -21.371866, 4.281234, -7.4558854, -21.377846, 4.7411065, -7.431749, -21.355633, 4.7338443, -7.431749, -21.350079, 4.2887096, -7.4558854, -21.371866, 4.281234, -7.4558854, -21.377846, 4.7411065, -7.480022, -21.350079, 4.2887096, -7.480022, -21.355633, 4.7338443, -7.4558854, -21.377846, 4.7411065, -7.4558854, -21.371866, 4.281234, -7.480022, -21.350079, 4.2887096, -7.480022, -21.355633, 4.7338443, -7.4558854, -21.328293, 4.2966127, -7.4558854, -21.333632, 4.726582, -7.480022, -21.355633, 4.7338443, -7.480022, -21.350079, 4.2887096, -7.4558854, -21.328293, 4.2966127, -7.4558854, -21.328293, 4.2966127, -7.431749, -21.208893, 4.272262, -7.431749, -21.350079, 4.2887096, -7.4558854, -21.328293, 4.2966127, -7.4558854, -21.214659, 4.2899904, -7.431749, -21.208893, 4.272262, -7.431749, -21.350079, 4.2887096, -7.4558854, -21.203339, 4.254534, -7.4558854, -21.371866, 4.281234, -7.431749, -21.350079, 4.2887096, -7.431749, -21.208893, 4.272262, -7.4558854, -21.203339, 4.254534, -7.4558854, -21.371866, 4.281234, -7.480022, -21.208893, 4.272262, -7.480022, -21.350079, 4.2887096, -7.4558854, -21.371866, 4.281234, -7.4558854, -21.203339, 4.254534, -7.480022, -21.208893, 4.272262, -7.480022, -21.350079, 4.2887096, -7.4558854, -21.214659, 4.2899904, -7.4558854, -21.328293, 4.2966127, -7.480022, -21.350079, 4.2887096, -7.480022, -21.208893, 4.272262, -7.4558854, -21.214659, 4.2899904, -7.4558854, -21.214659, 4.2899904, -7.431749, -21.090773, 4.2996025, -7.431749, -21.208893, 4.272262, -7.4558854, -21.214659, 4.2899904, -7.4558854, -21.11427, 4.3034472, -7.431749, -21.090773, 4.2996025, -7.431749, -21.208893, 4.272262, -7.4558854, -21.067278, 4.295544, -7.4558854, -21.203339, 4.254534, -7.431749, -21.208893, 4.272262, -7.431749, -21.090773, 4.2996025, -7.4558854, -21.067278, 4.295544, -7.4558854, -21.203339, 4.254534, -7.480022, -21.090773, 4.2996025, -7.480022, -21.208893, 4.272262, -7.4558854, -21.203339, 4.254534, -7.4558854, -21.067278, 4.295544, -7.480022, -21.090773, 4.2996025, -7.480022, -21.208893, 4.272262, -7.4558854, -21.11427, 4.3034472, -7.4558854, -21.214659, 4.2899904, -7.480022, -21.208893, 4.272262, -7.480022, -21.090773, 4.2996025, -7.4558854, -21.11427, 4.3034472, -7.4558854, -21.11427, 4.3034472, -7.431749, -21.088423, 4.730213, -7.431749, -21.090773, 4.2996025, -7.4558854, -21.11427, 4.3034472, -7.4558854, -21.111706, 4.7259407, -7.431749, -21.088423, 4.730213, -7.4558854, -21.111706, 4.7259407, -7.431749, -21.219572, 4.770369, -7.431749, -21.088423, 4.730213, -7.4558854, -21.111706, 4.7259407, -7.4558854, -21.224485, 4.7526407, -7.431749, -21.219572, 4.770369, -7.431749, -21.090773, 4.2996025, -7.4558854, -21.064928, 4.7346983, -7.4558854, -21.067278, 4.295544, -7.431749, -21.090773, 4.2996025, -7.431749, -21.088423, 4.730213, -7.4558854, -21.064928, 4.7346983, -7.431749, -21.088423, 4.730213, -7.4558854, -21.214872, 4.788311, -7.4558854, -21.064928, 4.7346983, -7.431749, -21.088423, 4.730213, -7.431749, -21.219572, 4.770369, -7.4558854, -21.214872, 4.788311, -7.4558854, -21.067278, 4.295544, -7.480022, -21.088423, 4.730213, -7.480022, -21.090773, 4.2996025, -7.4558854, -21.067278, 4.295544, -7.4558854, -21.064928, 4.7346983, -7.480022, -21.088423, 4.730213, -7.4558854, -21.064928, 4.7346983, -7.480022, -21.219572, 4.770369, -7.480022, -21.088423, 4.730213, -7.4558854, -21.064928, 4.7346983, -7.4558854, -21.214872, 4.788311, -7.480022, -21.219572, 4.770369, -7.480022, -21.090773, 4.2996025, -7.4558854, -21.111706, 4.7259407, -7.4558854, -21.11427, 4.3034472, -7.480022, -21.090773, 4.2996025, -7.480022, -21.088423, 4.730213, -7.4558854, -21.111706, 4.7259407, -7.480022, -21.088423, 4.730213, -7.4558854, -21.224485, 4.7526407, -7.4558854, -21.111706, 4.7259407, -7.480022, -21.088423, 4.730213, -7.480022, -21.219572, 4.770369, -7.4558854, -21.224485, 4.7526407, -7.4558854, -21.224485, 4.7526407, -7.431749, -21.355633, 4.7338443, -7.431749, -21.219572, 4.770369, -7.4558854, -21.224485, 4.7526407, -7.4558854, -21.333632, 4.726582, -7.431749, -21.355633, 4.7338443, -7.431749, -21.219572, 4.770369, -7.4558854, -21.377846, 4.7411065, -7.4558854, -21.214872, 4.788311, -7.431749, -21.219572, 4.770369, -7.431749, -21.355633, 4.7338443, -7.4558854, -21.377846, 4.7411065, -7.4558854, -21.214872, 4.788311, -7.480022, -21.355633, 4.7338443, -7.480022, -21.219572, 4.770369, -7.4558854, -21.214872, 4.788311, -7.4558854, -21.377846, 4.7411065, -7.480022, -21.355633, 4.7338443, -7.480022, -21.219572, 4.770369, -7.4558854, -21.333632, 4.726582, -7.4558854, -21.224485, 4.7526407, -7.480022, -21.219572, 4.770369, -7.480022, -21.355633, 4.7338443, -7.4558854, -21.333632, 4.726582, -3.7589583, -21.320816, 4.7411065, -3.7375984, -21.33534, 4.2274075, -3.7375984, -21.340467, 4.7496505, -3.7589583, -21.320816, 4.7411065, -3.7589583, -21.316118, 4.236378, -3.7375984, -21.33534, 4.2274075, -3.7589583, -21.316118, 4.236378, -3.7375984, -21.210388, 4.2079697, -3.7375984, -21.33534, 4.2274075, -3.7589583, -21.316118, 4.236378, -3.7589583, -21.215513, 4.2284746, -3.7375984, -21.210388, 4.2079697, -3.7375984, -21.340467, 4.7496505, -3.7589583, -21.354778, 4.2184362, -3.7589583, -21.360119, 4.758194, -3.7375984, -21.340467, 4.7496505, -3.7375984, -21.33534, 4.2274075, -3.7589583, -21.354778, 4.2184362, -3.7375984, -21.33534, 4.2274075, -3.7589583, -21.205261, 4.1870375, -3.7589583, -21.354778, 4.2184362, -3.7375984, -21.33534, 4.2274075, -3.7375984, -21.210388, 4.2079697, -3.7589583, -21.205261, 4.1870375, -3.7589583, -21.360119, 4.758194, -3.7803178, -21.33534, 4.2274075, -3.7803178, -21.340467, 4.7496505, -3.7589583, -21.360119, 4.758194, -3.7589583, -21.354778, 4.2184362, -3.7803178, -21.33534, 4.2274075, -3.7589583, -21.354778, 4.2184362, -3.7803178, -21.210388, 4.2079697, -3.7803178, -21.33534, 4.2274075, -3.7589583, -21.354778, 4.2184362, -3.7589583, -21.205261, 4.1870375, -3.7803178, -21.210388, 4.2079697, -3.7803178, -21.340467, 4.7496505, -3.7589583, -21.316118, 4.236378, -3.7589583, -21.320816, 4.7411065, -3.7803178, -21.340467, 4.7496505, -3.7803178, -21.33534, 4.2274075, -3.7589583, -21.316118, 4.236378, -3.7803178, -21.33534, 4.2274075, -3.7589583, -21.215513, 4.2284746, -3.7589583, -21.316118, 4.236378, -3.7803178, -21.33534, 4.2274075, -3.7803178, -21.210388, 4.2079697, -3.7589583, -21.215513, 4.2284746, -3.7589583, -21.215513, 4.2284746, -3.7375984, -21.10551, 4.2400093, -3.7375984, -21.210388, 4.2079697, -3.7589583, -21.215513, 4.2284746, -3.7589583, -21.126444, 4.2444944, -3.7375984, -21.10551, 4.2400093, -3.7589583, -21.126444, 4.2444944, -3.7375984, -21.103588, 4.7453785, -3.7375984, -21.10551, 4.2400093, -3.7589583, -21.126444, 4.2444944, -3.7589583, -21.124308, 4.740252, -3.7375984, -21.103588, 4.7453785, -3.7589583, -21.124308, 4.740252, -3.7375984, -21.219786, 4.7925835, -3.7375984, -21.103588, 4.7453785, -3.7589583, -21.124308, 4.740252, -3.7589583, -21.224058, 4.7716503, -3.7375984, -21.219786, 4.7925835, -3.7375984, -21.210388, 4.2079697, -3.7589583, -21.084793, 4.23531, -3.7589583, -21.205261, 4.1870375, -3.7375984, -21.210388, 4.2079697, -3.7375984, -21.10551, 4.2400093, -3.7589583, -21.084793, 4.23531, -3.7375984, -21.10551, 4.2400093, -3.7589583, -21.082657, 4.7505045, -3.7589583, -21.084793, 4.23531, -3.7375984, -21.10551, 4.2400093, -3.7375984, -21.103588, 4.7453785, -3.7589583, -21.082657, 4.7505045, -3.7375984, -21.103588, 4.7453785, -3.7589583, -21.215513, 4.8135157, -3.7589583, -21.082657, 4.7505045, -3.7375984, -21.103588, 4.7453785, -3.7375984, -21.219786, 4.7925835, -3.7589583, -21.215513, 4.8135157, -3.7589583, -21.205261, 4.1870375, -3.7803178, -21.10551, 4.2400093, -3.7803178, -21.210388, 4.2079697, -3.7589583, -21.205261, 4.1870375, -3.7589583, -21.084793, 4.23531, -3.7803178, -21.10551, 4.2400093, -3.7803178, -21.210388, 4.2079697, -3.7589583, -21.126444, 4.2444944, -3.7589583, -21.215513, 4.2284746, -3.7803178, -21.210388, 4.2079697, -3.7803178, -21.10551, 4.2400093, -3.7589583, -21.126444, 4.2444944, -3.7803178, -21.10551, 4.2400093, -3.7589583, -21.124308, 4.740252, -3.7589583, -21.126444, 4.2444944, -3.7803178, -21.10551, 4.2400093, -3.7803178, -21.103588, 4.7453785, -3.7589583, -21.124308, 4.740252, -3.7803178, -21.103588, 4.7453785, -3.7589583, -21.224058, 4.7716503, -3.7589583, -21.124308, 4.740252, -3.7803178, -21.103588, 4.7453785, -3.7803178, -21.219786, 4.7925835, -3.7589583, -21.224058, 4.7716503, -3.7589583, -21.084793, 4.23531, -3.7803178, -21.103588, 4.7453785, -3.7803178, -21.10551, 4.2400093, -3.7589583, -21.084793, 4.23531, -3.7589583, -21.082657, 4.7505045, -3.7803178, -21.103588, 4.7453785, -3.7589583, -21.082657, 4.7505045, -3.7803178, -21.219786, 4.7925835, -3.7803178, -21.103588, 4.7453785, -3.7589583, -21.082657, 4.7505045, -3.7589583, -21.215513, 4.8135157, -3.7803178, -21.219786, 4.7925835, -3.7589583, -21.224058, 4.7716503, -3.7375984, -21.340467, 4.7496505, -3.7375984, -21.219786, 4.7925835, -3.7589583, -21.224058, 4.7716503, -3.7589583, -21.320816, 4.7411065, -3.7375984, -21.340467, 4.7496505, -3.7375984, -21.219786, 4.7925835, -3.7589583, -21.360119, 4.758194, -3.7589583, -21.215513, 4.8135157, -3.7375984, -21.219786, 4.7925835, -3.7375984, -21.340467, 4.7496505, -3.7589583, -21.360119, 4.758194, -3.7589583, -21.215513, 4.8135157, -3.7803178, -21.340467, 4.7496505, -3.7803178, -21.219786, 4.7925835, -3.7589583, -21.215513, 4.8135157, -3.7589583, -21.360119, 4.758194, -3.7803178, -21.340467, 4.7496505, -3.7803178, -21.219786, 4.7925835, -3.7589583, -21.320816, 4.7411065, -3.7589583, -21.224058, 4.7716503, -3.7803178, -21.219786, 4.7925835, -3.7803178, -21.340467, 4.7496505, -3.7589583, -21.320816, 4.7411065, -3.7589583, -21.320816, 5.3611774, -3.7375984, -21.33534, 4.8476915, -3.7375984, -21.340467, 5.3697214, -3.7589583, -21.320816, 5.3611774, -3.7589583, -21.316116, 4.8566623, -3.7375984, -21.33534, 4.8476915, -3.7589583, -21.316116, 4.8566623, -3.7375984, -21.210386, 4.82804, -3.7375984, -21.33534, 4.8476915, -3.7589583, -21.316116, 4.8566623, -3.7589583, -21.215513, 4.8487587, -3.7375984, -21.210386, 4.82804, -3.7375984, -21.340467, 5.3697214, -3.7589583, -21.354778, 4.8387203, -3.7589583, -21.360119, 5.378265, -3.7375984, -21.340467, 5.3697214, -3.7375984, -21.33534, 4.8476915, -3.7589583, -21.354778, 4.8387203, -3.7375984, -21.33534, 4.8476915, -3.7589583, -21.205261, 4.8073215, -3.7589583, -21.354778, 4.8387203, -3.7375984, -21.33534, 4.8476915, -3.7375984, -21.210386, 4.82804, -3.7589583, -21.205261, 4.8073215, -3.7589583, -21.360119, 5.378265, -3.7803178, -21.33534, 4.8476915, -3.7803178, -21.340467, 5.3697214, -3.7589583, -21.360119, 5.378265, -3.7589583, -21.354778, 4.8387203, -3.7803178, -21.33534, 4.8476915, -3.7589583, -21.354778, 4.8387203, -3.7803178, -21.210386, 4.82804, -3.7803178, -21.33534, 4.8476915, -3.7589583, -21.354778, 4.8387203, -3.7589583, -21.205261, 4.8073215, -3.7803178, -21.210386, 4.82804, -3.7803178, -21.340467, 5.3697214, -3.7589583, -21.316116, 4.8566623, -3.7589583, -21.320816, 5.3611774, -3.7803178, -21.340467, 5.3697214, -3.7803178, -21.33534, 4.8476915, -3.7589583, -21.316116, 4.8566623, -3.7803178, -21.33534, 4.8476915, -3.7589583, -21.215513, 4.8487587, -3.7589583, -21.316116, 4.8566623, -3.7803178, -21.33534, 4.8476915, -3.7803178, -21.210386, 4.82804, -3.7589583, -21.215513, 4.8487587, -3.7589583, -21.215513, 4.8487587, -3.7375984, -21.10551, 4.8602934, -3.7375984, -21.210386, 4.82804, -3.7589583, -21.215513, 4.8487587, -3.7589583, -21.126444, 4.8647785, -3.7375984, -21.10551, 4.8602934, -3.7589583, -21.126444, 4.8647785, -3.7375984, -21.103588, 5.3656626, -3.7375984, -21.10551, 4.8602934, -3.7589583, -21.126444, 4.8647785, -3.7589583, -21.124308, 5.3605366, -3.7375984, -21.103588, 5.3656626, -3.7589583, -21.124308, 5.3605366, -3.7375984, -21.219786, 5.412654, -3.7375984, -21.103588, 5.3656626, -3.7589583, -21.124308, 5.3605366, -3.7589583, -21.224056, 5.3917212, -3.7375984, -21.219786, 5.412654, -3.7375984, -21.210386, 4.82804, -3.7589583, -21.084793, 4.855594, -3.7589583, -21.205261, 4.8073215, -3.7375984, -21.210386, 4.82804, -3.7375984, -21.10551, 4.8602934, -3.7589583, -21.084793, 4.855594, -3.7375984, -21.10551, 4.8602934, -3.7589583, -21.082657, 5.370575, -3.7589583, -21.084793, 4.855594, -3.7375984, -21.10551, 4.8602934, -3.7375984, -21.103588, 5.3656626, -3.7589583, -21.082657, 5.370575, -3.7375984, -21.103588, 5.3656626, -3.7589583, -21.215513, 5.433586, -3.7589583, -21.082657, 5.370575, -3.7375984, -21.103588, 5.3656626, -3.7375984, -21.219786, 5.412654, -3.7589583, -21.215513, 5.433586, -3.7589583, -21.205261, 4.8073215, -3.7803178, -21.10551, 4.8602934, -3.7803178, -21.210386, 4.82804, -3.7589583, -21.205261, 4.8073215, -3.7589583, -21.084793, 4.855594, -3.7803178, -21.10551, 4.8602934, -3.7803178, -21.210386, 4.82804, -3.7589583, -21.126444, 4.8647785, -3.7589583, -21.215513, 4.8487587, -3.7803178, -21.210386, 4.82804, -3.7803178, -21.10551, 4.8602934, -3.7589583, -21.126444, 4.8647785, -3.7803178, -21.10551, 4.8602934, -3.7589583, -21.124308, 5.3605366, -3.7589583, -21.126444, 4.8647785, -3.7803178, -21.10551, 4.8602934, -3.7803178, -21.103588, 5.3656626, -3.7589583, -21.124308, 5.3605366, -3.7803178, -21.103588, 5.3656626, -3.7589583, -21.224056, 5.3917212, -3.7589583, -21.124308, 5.3605366, -3.7803178, -21.103588, 5.3656626, -3.7803178, -21.219786, 5.412654, -3.7589583, -21.224056, 5.3917212, -3.7589583, -21.084793, 4.855594, -3.7803178, -21.103588, 5.3656626, -3.7803178, -21.10551, 4.8602934, -3.7589583, -21.084793, 4.855594, -3.7589583, -21.082657, 5.370575, -3.7803178, -21.103588, 5.3656626, -3.7589583, -21.082657, 5.370575, -3.7803178, -21.219786, 5.412654, -3.7803178, -21.103588, 5.3656626, -3.7589583, -21.082657, 5.370575, -3.7589583, -21.215513, 5.433586, -3.7803178, -21.219786, 5.412654, -3.7589583, -21.224056, 5.3917212, -3.7375984, -21.340467, 5.3697214, -3.7375984, -21.219786, 5.412654, -3.7589583, -21.224056, 5.3917212, -3.7589583, -21.320816, 5.3611774, -3.7375984, -21.340467, 5.3697214, -3.7375984, -21.219786, 5.412654, -3.7589583, -21.360119, 5.378265, -3.7589583, -21.215513, 5.433586, -3.7375984, -21.219786, 5.412654, -3.7375984, -21.340467, 5.3697214, -3.7589583, -21.360119, 5.378265, -3.7589583, -21.215513, 5.433586, -3.7803178, -21.340467, 5.3697214, -3.7803178, -21.219786, 5.412654, -3.7589583, -21.215513, 5.433586, -3.7589583, -21.360119, 5.378265, -3.7803178, -21.340467, 5.3697214, -3.7803178, -21.219786, 5.412654, -3.7589583, -21.320816, 5.3611774, -3.7589583, -21.224056, 5.3917212, -3.7803178, -21.219786, 5.412654, -3.7803178, -21.340467, 5.3697214, -3.7589583, -21.320816, 5.3611774, -7.3817677, -21.333632, 5.409023, -7.357631, -21.350079, 4.8643517, -7.357631, -21.355633, 5.418207, -7.3817677, -21.333632, 5.409023, -7.3817677, -21.328293, 4.8739634, -7.357631, -21.350079, 4.8643517, -7.3817677, -21.328293, 4.8739634, -7.357631, -21.208893, 4.8436327, -7.357631, -21.350079, 4.8643517, -7.3817677, -21.328293, 4.8739634, -7.3817677, -21.214659, 4.8654194, -7.357631, -21.208893, 4.8436327, -7.357631, -21.355633, 5.418207, -7.3817677, -21.371866, 4.85474, -7.3817677, -21.377846, 5.4271784, -7.357631, -21.355633, 5.418207, -7.357631, -21.350079, 4.8643517, -7.3817677, -21.371866, 4.85474, -7.357631, -21.350079, 4.8643517, -7.3817677, -21.203339, 4.8216324, -7.3817677, -21.371866, 4.85474, -7.357631, -21.350079, 4.8643517, -7.357631, -21.208893, 4.8436327, -7.3817677, -21.203339, 4.8216324, -7.3817677, -21.377846, 5.4271784, -7.4059043, -21.350079, 4.8643517, -7.4059043, -21.355633, 5.418207, -7.3817677, -21.377846, 5.4271784, -7.3817677, -21.371866, 4.85474, -7.4059043, -21.350079, 4.8643517, -7.3817677, -21.371866, 4.85474, -7.4059043, -21.208893, 4.8436327, -7.4059043, -21.350079, 4.8643517, -7.3817677, -21.371866, 4.85474, -7.3817677, -21.203339, 4.8216324, -7.4059043, -21.208893, 4.8436327, -7.4059043, -21.355633, 5.418207, -7.3817677, -21.328293, 4.8739634, -7.3817677, -21.333632, 5.409023, -7.4059043, -21.355633, 5.418207, -7.4059043, -21.350079, 4.8643517, -7.3817677, -21.328293, 4.8739634, -7.4059043, -21.350079, 4.8643517, -7.3817677, -21.214659, 4.8654194, -7.3817677, -21.328293, 4.8739634, -7.4059043, -21.350079, 4.8643517, -7.4059043, -21.208893, 4.8436327, -7.3817677, -21.214659, 4.8654194, -7.3817677, -21.214659, 4.8654194, -7.357631, -21.090773, 4.8775945, -7.357631, -21.208893, 4.8436327, -7.3817677, -21.214659, 4.8654194, -7.3817677, -21.11427, 4.8825073, -7.357631, -21.090773, 4.8775945, -7.3817677, -21.11427, 4.8825073, -7.357631, -21.088423, 5.4137216, -7.357631, -21.090773, 4.8775945, -7.3817677, -21.11427, 4.8825073, -7.3817677, -21.111706, 5.4083815, -7.357631, -21.088423, 5.4137216, -7.3817677, -21.111706, 5.4083815, -7.357631, -21.219572, 5.463703, -7.357631, -21.088423, 5.4137216, -7.3817677, -21.111706, 5.4083815, -7.3817677, -21.224483, 5.441489, -7.357631, -21.219572, 5.463703, -7.357631, -21.208893, 4.8436327, -7.3817677, -21.067278, 4.8726816, -7.3817677, -21.203339, 4.8216324, -7.357631, -21.208893, 4.8436327, -7.357631, -21.090773, 4.8775945, -7.3817677, -21.067278, 4.8726816, -7.357631, -21.090773, 4.8775945, -7.3817677, -21.064928, 5.4190617, -7.3817677, -21.067278, 4.8726816, -7.357631, -21.090773, 4.8775945, -7.357631, -21.088423, 5.4137216, -7.3817677, -21.064928, 5.4190617, -7.357631, -21.088423, 5.4137216, -7.3817677, -21.214872, 5.485917, -7.3817677, -21.064928, 5.4190617, -7.357631, -21.088423, 5.4137216, -7.357631, -21.219572, 5.463703, -7.3817677, -21.214872, 5.485917, -7.3817677, -21.203339, 4.8216324, -7.4059043, -21.090773, 4.8775945, -7.4059043, -21.208893, 4.8436327, -7.3817677, -21.203339, 4.8216324, -7.3817677, -21.067278, 4.8726816, -7.4059043, -21.090773, 4.8775945, -7.4059043, -21.208893, 4.8436327, -7.3817677, -21.11427, 4.8825073, -7.3817677, -21.214659, 4.8654194, -7.4059043, -21.208893, 4.8436327, -7.4059043, -21.090773, 4.8775945, -7.3817677, -21.11427, 4.8825073, -7.4059043, -21.090773, 4.8775945, -7.3817677, -21.111706, 5.4083815, -7.3817677, -21.11427, 4.8825073, -7.4059043, -21.090773, 4.8775945, -7.4059043, -21.088423, 5.4137216, -7.3817677, -21.111706, 5.4083815, -7.4059043, -21.088423, 5.4137216, -7.3817677, -21.224483, 5.441489, -7.3817677, -21.111706, 5.4083815, -7.4059043, -21.088423, 5.4137216, -7.4059043, -21.219572, 5.463703, -7.3817677, -21.224483, 5.441489, -7.3817677, -21.067278, 4.8726816, -7.4059043, -21.088423, 5.4137216, -7.4059043, -21.090773, 4.8775945, -7.3817677, -21.067278, 4.8726816, -7.3817677, -21.064928, 5.4190617, -7.4059043, -21.088423, 5.4137216, -7.3817677, -21.064928, 5.4190617, -7.4059043, -21.219572, 5.463703, -7.4059043, -21.088423, 5.4137216, -7.3817677, -21.064928, 5.4190617, -7.3817677, -21.214872, 5.485917, -7.4059043, -21.219572, 5.463703, -7.3817677, -21.224483, 5.441489, -7.357631, -21.355633, 5.418207, -7.357631, -21.219572, 5.463703, -7.3817677, -21.224483, 5.441489, -7.3817677, -21.333632, 5.409023, -7.357631, -21.355633, 5.418207, -7.357631, -21.219572, 5.463703, -7.3817677, -21.377846, 5.4271784, -7.3817677, -21.214872, 5.485917, -7.357631, -21.219572, 5.463703, -7.357631, -21.355633, 5.418207, -7.3817677, -21.377846, 5.4271784, -7.3817677, -21.214872, 5.485917, -7.4059043, -21.355633, 5.418207, -7.4059043, -21.219572, 5.463703, -7.3817677, -21.214872, 5.485917, -7.3817677, -21.377846, 5.4271784, -7.4059043, -21.355633, 5.418207, -7.4059043, -21.219572, 5.463703, -7.3817677, -21.333632, 5.409023, -7.3817677, -21.224483, 5.441489, -7.4059043, -21.219572, 5.463703, -7.4059043, -21.355633, 5.418207, -7.3817677, -21.333632, 5.409023, 16.86181, -22.803505, -1.1805243, 12.459326, -22.631578, -0.992887, 16.845665, -22.437832, -1.1752877, 16.86181, -22.803505, -1.1805243, 12.4754715, -22.996815, -0.99855995, 12.459326, -22.631578, -0.992887, 21.372076, -22.244087, -0.9867778, 16.86181, -22.803505, -1.1805243, 16.845665, -22.437832, -1.1752877, 21.372076, -22.244087, -0.9867778, 21.38822, -22.609324, -0.9924512, 16.86181, -22.803505, -1.1805243, 16.86181, -22.78867, -2.160163, 12.4754715, -22.996815, -0.99855995, 16.86181, -22.803505, -1.1805243, 16.86181, -22.78867, -2.160163, 12.4754715, -22.984161, -1.8285255, 12.4754715, -22.996815, -0.99855995, 16.86181, -22.803505, -1.1805243, 21.38822, -22.592306, -2.12569, 16.86181, -22.78867, -2.160163, 16.86181, -22.803505, -1.1805243, 21.38822, -22.601032, -1.5496888, 21.38822, -22.592306, -2.12569, 21.38822, -22.601032, -1.5496888, 16.86181, -22.803505, -1.1805243, 21.38822, -22.609324, -0.9924512, 12.4754715, -22.984161, -1.8285255, 12.459326, -22.631578, -0.992887, 12.4754715, -22.996815, -0.99855995, 12.4754715, -22.984161, -1.8285255, 12.459326, -22.618923, -1.8228531, 12.459326, -22.631578, -0.992887, 21.372076, -22.236668, -1.4776883, 21.20582, -22.351868, -1.5763068, 21.38822, -22.601032, -1.5496888, 16.845665, -22.426924, -1.9096894, 16.849592, -22.514633, -2.155799, 17.977158, -22.374123, -2.1461992, 16.845665, -22.426924, -1.9096894, 15.749081, -22.472305, -2.0715804, 16.849592, -22.514633, -2.155799, 16.845665, -22.426924, -1.9096894, 12.459326, -22.618923, -1.8228531, 15.749081, -22.472305, -2.0715804, 16.845665, -22.426924, -1.9096894, 12.459326, -22.631578, -0.992887, 12.459326, -22.618923, -1.8228531, 12.459326, -22.631578, -0.992887, 16.845665, -22.426924, -1.9096894, 16.845665, -22.437832, -1.1752877, 17.977158, -22.374123, -2.1461992, 16.845665, -22.437832, -1.1752877, 16.845665, -22.426924, -1.9096894, 16.845665, -22.437832, -1.1752877, 21.372076, -22.236668, -1.4776883, 21.372076, -22.244087, -0.9867778, 16.845665, -22.437832, -1.1752877, 20.594036, -22.268959, -1.5780525, 21.372076, -22.236668, -1.4776883, 17.977158, -22.374123, -2.1461992, 20.594036, -22.268959, -1.5780525, 16.845665, -22.437832, -1.1752877, 21.20582, -22.351868, -1.5763068, 21.372076, -22.236668, -1.4776883, 20.594036, -22.268959, -1.5780525, 21.372076, -22.232304, -1.7539072, 21.20582, -22.351868, -1.5763068, 20.594036, -22.268959, -1.5780525, 20.594036, -22.268959, -1.5780525, 17.977158, -22.374123, -2.1461992, 21.372076, -22.232304, -1.7539072, 21.372076, -22.232304, -1.7539072, 17.977158, -22.374123, -2.1461992, 21.37251, -22.227068, -2.1200175, 21.38822, -22.609324, -0.9924512, 21.372076, -22.236668, -1.4776883, 21.38822, -22.601032, -1.5496888, 21.38822, -22.609324, -0.9924512, 21.372076, -22.244087, -0.9867778, 21.372076, -22.236668, -1.4776883, 21.372076, -22.232304, -1.7539072, 21.38822, -22.592306, -2.12569, 21.38822, -22.601032, -1.5496888, 21.372076, -22.232304, -1.7539072, 21.37251, -22.227068, -2.1200175, 21.38822, -22.592306, -2.12569, 21.20582, -22.351868, -1.5763068, 21.372076, -22.232304, -1.7539072, 21.38822, -22.601032, -1.5496888, 21.37251, -22.227068, -2.1200175, 16.86181, -22.78867, -2.160163, 21.38822, -22.592306, -2.12569, 16.86181, -22.78867, -2.160163, 21.37251, -22.227068, -2.1200175, 16.849592, -22.514633, -2.155799, 16.849592, -22.514633, -2.155799, 21.37251, -22.227068, -2.1200175, 17.977158, -22.374123, -2.1461992, 16.849592, -22.514633, -2.155799, 12.459326, -22.618923, -1.8228531, 16.86181, -22.78867, -2.160163, 16.86181, -22.78867, -2.160163, 12.459326, -22.618923, -1.8228531, 12.4754715, -22.984161, -1.8285255, 12.459326, -22.618923, -1.8228531, 16.849592, -22.514633, -2.155799, 15.749081, -22.472305, -2.0715804, 13.651039, -22.54256, -3.436966, 12.76609, -22.946634, -3.462275, 13.666748, -22.907797, -3.4426389, 13.651039, -22.54256, -3.436966, 12.749945, -22.581396, -3.4570384, 12.76609, -22.946634, -3.462275, 13.666748, -22.907797, -3.4426389, 21.08582, -22.31085, -3.4526749, 13.651039, -22.54256, -3.436966, 13.651039, -22.54256, -3.436966, 21.08582, -22.31085, -3.4526749, 19.224287, -22.300377, -3.4474387, 21.08582, -22.31085, -3.4526749, 13.666748, -22.907797, -3.4426389, 21.0976, -22.584887, -3.4566026, 12.749945, -22.596233, -2.4743457, 13.651039, -22.54256, -3.436966, 13.651039, -22.557396, -2.4507813, 19.224287, -22.300377, -3.4474387, 13.651039, -22.557396, -2.4507813, 13.651039, -22.54256, -3.436966, 19.224287, -22.300377, -3.4474387, 21.081892, -22.231869, -2.6214004, 13.651039, -22.557396, -2.4507813, 21.081892, -22.231869, -2.6214004, 19.224287, -22.300377, -3.4474387, 21.081892, -22.222704, -3.2436562, 21.081892, -22.222704, -3.2436562, 19.224287, -22.300377, -3.4474387, 21.08582, -22.31085, -3.4526749, 13.651039, -22.54256, -3.436966, 12.749945, -22.596233, -2.4743457, 13.230383, -22.567432, -2.9914374, 13.230383, -22.567432, -2.9914374, 12.749945, -22.596233, -2.4743457, 12.749945, -22.590124, -2.8701282, 12.749945, -22.590124, -2.8701282, 12.838528, -22.724524, -2.981401, 13.230383, -22.567432, -2.9914374, 12.838528, -22.724524, -2.981401, 12.749945, -22.586197, -3.144165, 13.230383, -22.567432, -2.9914374, 13.651039, -22.54256, -3.436966, 13.230383, -22.567432, -2.9914374, 12.749945, -22.586197, -3.144165, 13.651039, -22.54256, -3.436966, 12.749945, -22.586197, -3.144165, 12.749945, -22.581396, -3.4570384, 13.666748, -22.923069, -2.4560184, 12.749945, -22.596233, -2.4743457, 13.651039, -22.557396, -2.4507813, 13.666748, -22.923069, -2.4560184, 12.76609, -22.96147, -2.4795818, 12.749945, -22.596233, -2.4743457, 21.081892, -22.231869, -2.6214004, 13.666748, -22.923069, -2.4560184, 13.651039, -22.557396, -2.4507813, 21.081892, -22.231869, -2.6214004, 21.0976, -22.597105, -2.6270728, 13.666748, -22.923069, -2.4560184, 12.76609, -22.946634, -3.462275, 13.666748, -22.923069, -2.4560184, 13.666748, -22.907797, -3.4426389, 13.666748, -22.923069, -2.4560184, 12.76609, -22.946634, -3.462275, 12.76609, -22.954924, -2.931219, 13.666748, -22.923069, -2.4560184, 12.76609, -22.954924, -2.931219, 12.76609, -22.96147, -2.4795818, 21.0976, -22.597105, -2.6270728, 13.666748, -22.907797, -3.4426389, 13.666748, -22.923069, -2.4560184, 21.0976, -22.597105, -2.6270728, 21.0976, -22.584887, -3.4566026, 13.666748, -22.907797, -3.4426389, 12.749945, -22.586197, -3.144165, 12.838528, -22.724524, -2.981401, 12.76609, -22.954924, -2.931219, 12.838528, -22.724524, -2.981401, 12.749945, -22.590124, -2.8701282, 12.76609, -22.954924, -2.931219, 12.76609, -22.946634, -3.462275, 12.749945, -22.586197, -3.144165, 12.76609, -22.954924, -2.931219, 12.76609, -22.946634, -3.462275, 12.749945, -22.581396, -3.4570384, 12.749945, -22.586197, -3.144165, 12.749945, -22.590124, -2.8701282, 12.76609, -22.96147, -2.4795818, 12.76609, -22.954924, -2.931219, 12.749945, -22.590124, -2.8701282, 12.749945, -22.596233, -2.4743457, 12.76609, -22.96147, -2.4795818, 21.081892, -22.231869, -2.6214004, 21.0976, -22.584887, -3.4566026, 21.0976, -22.597105, -2.6270728, 21.0976, -22.584887, -3.4566026, 21.081892, -22.231869, -2.6214004, 21.08582, -22.31085, -3.4526749, 21.08582, -22.31085, -3.4526749, 21.081892, -22.231869, -2.6214004, 21.081892, -22.222704, -3.2436562, 16.86661, -22.74067, -5.2888975, 12.750381, -22.556524, -5.1012607, 16.850464, -22.375433, -5.2836614, 16.86661, -22.74067, -5.2888975, 12.76609, -22.92176, -5.1069336, 12.750381, -22.556524, -5.1012607, 21.081892, -22.194342, -5.0951514, 16.86661, -22.74067, -5.2888975, 16.850464, -22.375433, -5.2836614, 21.081892, -22.194342, -5.0951514, 21.0976, -22.559578, -5.100825, 16.86661, -22.74067, -5.2888975, 16.86661, -22.725834, -6.2681003, 12.76609, -22.92176, -5.1069336, 16.86661, -22.74067, -5.2888975, 16.86661, -22.725834, -6.2681003, 12.76609, -22.909105, -5.936463, 12.76609, -22.92176, -5.1069336, 16.86661, -22.74067, -5.2888975, 21.0976, -22.54256, -6.2344995, 16.86661, -22.725834, -6.2681003, 16.86661, -22.74067, -5.2888975, 21.0976, -22.551287, -5.658062, 21.0976, -22.54256, -6.2344995, 21.0976, -22.551287, -5.658062, 16.86661, -22.74067, -5.2888975, 21.0976, -22.559578, -5.100825, 12.76609, -22.909105, -5.936463, 12.750381, -22.556524, -5.1012607, 12.76609, -22.92176, -5.1069336, 12.76609, -22.909105, -5.936463, 12.750381, -22.543869, -5.93079, 12.750381, -22.556524, -5.1012607, 21.081892, -22.186922, -5.5856256, 20.926546, -22.301687, -5.6846805, 21.0976, -22.551287, -5.658062, 16.850464, -22.364523, -6.018063, 16.854391, -22.451796, -6.2637362, 17.908213, -22.314777, -6.2541366, 16.850464, -22.364523, -6.018063, 15.825443, -22.406414, -6.179518, 16.854391, -22.451796, -6.2637362, 16.850464, -22.364523, -6.018063, 12.750381, -22.543869, -5.93079, 15.825443, -22.406414, -6.179518, 16.850464, -22.364523, -6.018063, 12.750381, -22.556524, -5.1012607, 12.750381, -22.543869, -5.93079, 12.750381, -22.556524, -5.1012607, 16.850464, -22.364523, -6.018063, 16.850464, -22.375433, -5.2836614, 17.908213, -22.314777, -6.2541366, 16.850464, -22.375433, -5.2836614, 16.850464, -22.364523, -6.018063, 16.850464, -22.375433, -5.2836614, 21.081892, -22.186922, -5.5856256, 21.081892, -22.194342, -5.0951514, 16.850464, -22.375433, -5.2836614, 20.354473, -22.217031, -5.6864257, 21.081892, -22.186922, -5.5856256, 17.908213, -22.314777, -6.2541366, 20.354473, -22.217031, -5.6864257, 16.850464, -22.375433, -5.2836614, 20.926546, -22.301687, -5.6846805, 21.081892, -22.186922, -5.5856256, 20.354473, -22.217031, -5.6864257, 21.081892, -22.182995, -5.862281, 20.926546, -22.301687, -5.6846805, 20.354473, -22.217031, -5.6864257, 20.354473, -22.217031, -5.6864257, 17.908213, -22.314777, -6.2541366, 21.081892, -22.182995, -5.862281, 21.081892, -22.182995, -5.862281, 17.908213, -22.314777, -6.2541366, 21.081892, -22.177322, -6.228827, 21.0976, -22.559578, -5.100825, 21.081892, -22.186922, -5.5856256, 21.0976, -22.551287, -5.658062, 21.0976, -22.559578, -5.100825, 21.081892, -22.194342, -5.0951514, 21.081892, -22.186922, -5.5856256, 21.081892, -22.182995, -5.862281, 21.0976, -22.54256, -6.2344995, 21.0976, -22.551287, -5.658062, 21.081892, -22.182995, -5.862281, 21.081892, -22.177322, -6.228827, 21.0976, -22.54256, -6.2344995, 20.926546, -22.301687, -5.6846805, 21.081892, -22.182995, -5.862281, 21.0976, -22.551287, -5.658062, 21.081892, -22.177322, -6.228827, 16.86661, -22.725834, -6.2681003, 21.0976, -22.54256, -6.2344995, 16.86661, -22.725834, -6.2681003, 21.081892, -22.177322, -6.228827, 16.854391, -22.451796, -6.2637362, 16.854391, -22.451796, -6.2637362, 21.081892, -22.177322, -6.228827, 17.908213, -22.314777, -6.2541366, 16.854391, -22.451796, -6.2637362, 12.750381, -22.543869, -5.93079, 16.86661, -22.725834, -6.2681003, 16.86661, -22.725834, -6.2681003, 12.750381, -22.543869, -5.93079, 12.76609, -22.909105, -5.936463, 12.750381, -22.543869, -5.93079, 16.854391, -22.451796, -6.2637362, 15.825443, -22.406414, -6.179518, 19.724798, -22.63725, -3.9361672, 12.459763, -22.58925, -3.7760215, 19.70909, -22.271578, -3.9304943, 19.724798, -22.63725, -3.9361672, 12.4754715, -22.954489, -3.781694, 12.459763, -22.58925, -3.7760215, 21.37251, -22.199577, -3.9226394, 19.724798, -22.63725, -3.9361672, 19.70909, -22.271578, -3.9304943, 21.37251, -22.199577, -3.9226394, 21.38822, -22.564814, -3.9283128, 19.724798, -22.63725, -3.9361672, 19.724798, -22.621979, -4.944606, 12.4754715, -22.954489, -3.781694, 19.724798, -22.63725, -3.9361672, 19.724798, -22.621979, -4.944606, 12.4754715, -22.939651, -4.764387, 12.4754715, -22.954489, -3.781694, 21.38822, -22.564814, -3.9283128, 19.724798, -22.621979, -4.944606, 19.724798, -22.63725, -3.9361672, 21.38822, -22.564814, -3.9283128, 21.38822, -22.55216, -4.7578416, 19.724798, -22.621979, -4.944606, 21.38822, -22.564814, -3.9283128, 21.37251, -22.186922, -4.752169, 21.38822, -22.55216, -4.7578416, 21.38822, -22.564814, -3.9283128, 21.37251, -22.199577, -3.9226394, 21.37251, -22.186922, -4.752169, 19.70909, -22.260231, -4.6867146, 19.713017, -22.34794, -4.9402423, 20.124945, -22.239286, -4.8926787, 19.70909, -22.260231, -4.6867146, 17.896868, -22.335724, -4.8939877, 19.713017, -22.34794, -4.9402423, 19.70909, -22.260231, -4.6867146, 13.819038, -22.514633, -4.792751, 17.896868, -22.335724, -4.8939877, 20.124945, -22.239286, -4.8926787, 19.70909, -22.271578, -3.9304943, 19.70909, -22.260231, -4.6867146, 20.124945, -22.239286, -4.8926787, 21.37251, -22.199577, -3.9226394, 19.70909, -22.271578, -3.9304943, 21.37251, -22.199577, -3.9226394, 20.124945, -22.239286, -4.8926787, 21.37251, -22.186922, -4.752169, 12.459763, -22.58925, -3.7760215, 19.70909, -22.260231, -4.6867146, 19.70909, -22.271578, -3.9304943, 19.70909, -22.260231, -4.6867146, 12.459763, -22.58925, -3.7760215, 13.819038, -22.514633, -4.792751, 13.819038, -22.514633, -4.792751, 12.459763, -22.58925, -3.7760215, 12.459763, -22.577906, -4.513041, 13.819038, -22.514633, -4.792751, 12.459763, -22.577906, -4.513041, 12.46369, -22.665615, -4.7600236, 21.37251, -22.186922, -4.752169, 19.724798, -22.621979, -4.944606, 21.38822, -22.55216, -4.7578416, 19.724798, -22.621979, -4.944606, 21.37251, -22.186922, -4.752169, 19.713017, -22.34794, -4.9402423, 19.713017, -22.34794, -4.9402423, 21.37251, -22.186922, -4.752169, 20.124945, -22.239286, -4.8926787, 19.713017, -22.34794, -4.9402423, 12.46369, -22.665615, -4.7600236, 19.724798, -22.621979, -4.944606, 19.724798, -22.621979, -4.944606, 12.46369, -22.665615, -4.7600236, 12.4754715, -22.939651, -4.764387, 12.46369, -22.665615, -4.7600236, 19.713017, -22.34794, -4.9402423, 13.819038, -22.514633, -4.792751, 13.819038, -22.514633, -4.792751, 19.713017, -22.34794, -4.9402423, 17.896868, -22.335724, -4.8939877, 12.46369, -22.665615, -4.7600236, 12.4754715, -22.954489, -3.781694, 12.4754715, -22.939651, -4.764387, 12.4754715, -22.954489, -3.781694, 12.46369, -22.665615, -4.7600236, 12.459763, -22.58925, -3.7760215, 12.459763, -22.58925, -3.7760215, 12.46369, -22.665615, -4.7600236, 12.459763, -22.577906, -4.513041, 16.95781, -23.00336, -0.79565, 21.06182, -22.63725, -0.9811053, 16.95781, -22.63725, -0.79565, 16.95781, -23.00336, -0.79565, 21.06182, -23.00336, -0.9811053, 21.06182, -22.63725, -0.9811053, 12.722454, -22.63725, -0.9811053, 16.95781, -23.00336, -0.79565, 16.95781, -22.63725, -0.79565, 12.722454, -22.63725, -0.9811053, 12.722454, -23.00336, -0.9811053, 16.95781, -23.00336, -0.79565, 16.95781, -23.00336, 0.18311548, 21.06182, -23.00336, -0.9811053, 16.95781, -23.00336, -0.79565, 16.95781, -23.00336, 0.18311548, 21.06182, -23.00336, -0.15113974, 21.06182, -23.00336, -0.9811053, 16.95781, -23.00336, -0.79565, 12.722454, -23.00336, 0.15257025, 16.95781, -23.00336, 0.18311548, 16.95781, -23.00336, -0.79565, 12.722454, -23.00336, -0.4238677, 12.722454, -23.00336, 0.15257025, 12.722454, -23.00336, -0.4238677, 16.95781, -23.00336, -0.79565, 12.722454, -23.00336, -0.9811053, 21.06182, -23.00336, -0.15113974, 21.06182, -22.63725, -0.9811053, 21.06182, -23.00336, -0.9811053, 21.06182, -23.00336, -0.15113974, 21.06182, -22.63725, -0.15113974, 21.06182, -22.63725, -0.9811053, 12.722454, -22.63725, -0.49063158, 12.882601, -22.746778, -0.39288568, 12.722454, -23.00336, -0.4238677, 16.95781, -22.63725, -0.06124878, 16.95781, -22.728888, 0.18311548, 15.899189, -22.63725, 0.17569733, 16.95781, -22.63725, -0.06124878, 17.983704, -22.63725, 0.09977007, 16.95781, -22.728888, 0.18311548, 16.95781, -22.63725, -0.06124878, 21.06182, -22.63725, -0.15113974, 17.983704, -22.63725, 0.09977007, 16.95781, -22.63725, -0.06124878, 21.06182, -22.63725, -0.9811053, 21.06182, -22.63725, -0.15113974, 21.06182, -22.63725, -0.9811053, 16.95781, -22.63725, -0.06124878, 16.95781, -22.63725, -0.79565, 15.899189, -22.63725, 0.17569733, 16.95781, -22.63725, -0.79565, 16.95781, -22.63725, -0.06124878, 16.95781, -22.63725, -0.79565, 12.722454, -22.63725, -0.49063158, 12.722454, -22.63725, -0.9811053, 16.95781, -22.63725, -0.79565, 13.450312, -22.63725, -0.39070415, 12.722454, -22.63725, -0.49063158, 15.899189, -22.63725, 0.17569733, 13.450312, -22.63725, -0.39070415, 16.95781, -22.63725, -0.79565, 12.882601, -22.746778, -0.39288568, 12.722454, -22.63725, -0.49063158, 13.450312, -22.63725, -0.39070415, 12.722454, -22.63725, -0.21441269, 12.882601, -22.746778, -0.39288568, 13.450312, -22.63725, -0.39070415, 13.450312, -22.63725, -0.39070415, 15.899189, -22.63725, 0.17569733, 12.722454, -22.63725, -0.21441269, 12.722454, -22.63725, -0.21441269, 15.899189, -22.63725, 0.17569733, 12.722454, -22.63725, 0.15257025, 12.722454, -23.00336, -0.9811053, 12.722454, -22.63725, -0.49063158, 12.722454, -23.00336, -0.4238677, 12.722454, -23.00336, -0.9811053, 12.722454, -22.63725, -0.9811053, 12.722454, -22.63725, -0.49063158, 12.722454, -22.63725, -0.21441269, 12.722454, -23.00336, 0.15257025, 12.722454, -23.00336, -0.4238677, 12.722454, -22.63725, -0.21441269, 12.722454, -22.63725, 0.15257025, 12.722454, -23.00336, 0.15257025, 12.882601, -22.746778, -0.39288568, 12.722454, -22.63725, -0.21441269, 12.722454, -23.00336, -0.4238677, 12.722454, -22.63725, 0.15257025, 16.95781, -23.00336, 0.18311548, 12.722454, -23.00336, 0.15257025, 16.95781, -23.00336, 0.18311548, 12.722454, -22.63725, 0.15257025, 15.899189, -22.63725, 0.17569733, 16.95781, -23.00336, 0.18311548, 15.899189, -22.63725, 0.17569733, 16.95781, -22.728888, 0.18311548, 16.95781, -22.728888, 0.18311548, 21.06182, -23.00336, -0.15113974, 16.95781, -23.00336, 0.18311548, 16.95781, -22.728888, 0.18311548, 21.06182, -22.63725, -0.15113974, 21.06182, -23.00336, -0.15113974, 21.06182, -22.63725, -0.15113974, 16.95781, -22.728888, 0.18311548, 17.983704, -22.63725, 0.09977007, 20.16029, -22.63725, 2.5866122, 21.06182, -23.00336, 2.6058125, 20.16029, -23.00336, 2.5866122, 20.16029, -22.63725, 2.5866122, 21.06182, -22.63725, 2.6058125, 21.06182, -23.00336, 2.6058125, 20.16029, -23.00336, 2.5866122, 14.582241, -22.63725, 2.6010118, 20.16029, -22.63725, 2.5866122, 20.16029, -23.00336, 2.5866122, 12.722454, -22.728888, 2.6058125, 14.582241, -22.63725, 2.6010118, 12.722454, -22.728888, 2.6058125, 20.16029, -23.00336, 2.5866122, 12.722454, -23.00336, 2.6058125, 21.06182, -22.63725, 1.6231189, 20.16029, -22.63725, 2.5866122, 20.16029, -22.63725, 1.6004281, 14.582241, -22.63725, 2.6010118, 20.16029, -22.63725, 1.6004281, 20.16029, -22.63725, 2.5866122, 14.582241, -22.63725, 2.6010118, 12.722454, -22.63725, 1.7762828, 20.16029, -22.63725, 1.6004281, 12.722454, -22.63725, 1.7762828, 14.582241, -22.63725, 2.6010118, 12.722454, -22.63725, 2.398975, 12.722454, -22.63725, 2.398975, 14.582241, -22.63725, 2.6010118, 12.722454, -22.728888, 2.6058125, 20.16029, -22.63725, 2.5866122, 21.06182, -22.63725, 1.6231189, 20.581383, -22.63725, 2.1410842, 20.581383, -22.63725, 2.1410842, 21.06182, -22.63725, 1.6231189, 21.06182, -22.63725, 2.0193381, 21.06182, -22.63725, 2.0193381, 20.979784, -22.776888, 2.128429, 20.581383, -22.63725, 2.1410842, 20.979784, -22.776888, 2.128429, 21.06182, -22.63725, 2.2933755, 20.581383, -22.63725, 2.1410842, 20.16029, -22.63725, 2.5866122, 20.581383, -22.63725, 2.1410842, 21.06182, -22.63725, 2.2933755, 20.16029, -22.63725, 2.5866122, 21.06182, -22.63725, 2.2933755, 21.06182, -22.63725, 2.6058125, 20.16029, -23.00336, 1.6004281, 21.06182, -22.63725, 1.6231189, 20.16029, -22.63725, 1.6004281, 20.16029, -23.00336, 1.6004281, 21.06182, -23.00336, 1.6231189, 21.06182, -22.63725, 1.6231189, 12.722454, -22.63725, 1.7762828, 20.16029, -23.00336, 1.6004281, 20.16029, -22.63725, 1.6004281, 12.722454, -22.63725, 1.7762828, 12.722454, -23.00336, 1.7762828, 20.16029, -23.00336, 1.6004281, 21.06182, -23.00336, 2.6058125, 20.16029, -23.00336, 1.6004281, 20.16029, -23.00336, 2.5866122, 20.16029, -23.00336, 1.6004281, 21.06182, -23.00336, 2.6058125, 21.06182, -23.00336, 2.0747561, 20.16029, -23.00336, 1.6004281, 21.06182, -23.00336, 2.0747561, 21.06182, -23.00336, 1.6231189, 12.722454, -23.00336, 1.7762828, 20.16029, -23.00336, 2.5866122, 20.16029, -23.00336, 1.6004281, 12.722454, -23.00336, 1.7762828, 12.722454, -23.00336, 2.6058125, 20.16029, -23.00336, 2.5866122, 21.06182, -22.63725, 2.2933755, 20.979784, -22.776888, 2.128429, 21.06182, -23.00336, 2.0747561, 20.979784, -22.776888, 2.128429, 21.06182, -22.63725, 2.0193381, 21.06182, -23.00336, 2.0747561, 21.06182, -23.00336, 2.6058125, 21.06182, -22.63725, 2.2933755, 21.06182, -23.00336, 2.0747561, 21.06182, -23.00336, 2.6058125, 21.06182, -22.63725, 2.6058125, 21.06182, -22.63725, 2.2933755, 21.06182, -22.63725, 2.0193381, 21.06182, -23.00336, 1.6231189, 21.06182, -23.00336, 2.0747561, 21.06182, -22.63725, 2.0193381, 21.06182, -22.63725, 1.6231189, 21.06182, -23.00336, 1.6231189, 12.722454, -22.63725, 1.7762828, 12.722454, -23.00336, 2.6058125, 12.722454, -23.00336, 1.7762828, 12.722454, -23.00336, 2.6058125, 12.722454, -22.63725, 1.7762828, 12.722454, -22.63725, 2.398975, 12.722454, -23.00336, 2.6058125, 12.722454, -22.63725, 2.398975, 12.722454, -22.728888, 2.6058125, 20.38851, -22.63725, 3.7669787, 21.352875, -23.00336, 3.786178, 20.38851, -23.00336, 3.7669787, 20.38851, -22.63725, 3.7669787, 21.352875, -22.63725, 3.786178, 21.352875, -23.00336, 3.786178, 20.38851, -23.00336, 3.7669787, 14.420786, -22.63725, 3.7813792, 20.38851, -22.63725, 3.7669787, 20.38851, -23.00336, 3.7669787, 12.431835, -22.728888, 3.786178, 14.420786, -22.63725, 3.7813792, 12.431835, -22.728888, 3.786178, 20.38851, -23.00336, 3.7669787, 12.431835, -23.00336, 3.786178, 21.352875, -22.63725, 2.8034854, 20.38851, -22.63725, 3.7669787, 20.38851, -22.63725, 2.7803578, 14.420786, -22.63725, 3.7813792, 20.38851, -22.63725, 2.7803578, 20.38851, -22.63725, 3.7669787, 14.420786, -22.63725, 3.7813792, 12.431835, -22.63725, 2.9562135, 20.38851, -22.63725, 2.7803578, 12.431835, -22.63725, 2.9562135, 14.420786, -22.63725, 3.7813792, 12.431835, -22.63725, 3.5784698, 12.431835, -22.63725, 3.5784698, 14.420786, -22.63725, 3.7813792, 12.431835, -22.728888, 3.786178, 20.38851, -22.63725, 3.7669787, 21.352875, -22.63725, 2.8034854, 20.838837, -22.63725, 3.321015, 20.838837, -22.63725, 3.321015, 21.352875, -22.63725, 2.8034854, 21.352875, -22.63725, 3.1997046, 21.352875, -22.63725, 3.1997046, 21.264729, -22.776888, 3.3083596, 20.838837, -22.63725, 3.321015, 21.264729, -22.776888, 3.3083596, 21.352875, -22.63725, 3.4733052, 20.838837, -22.63725, 3.321015, 20.38851, -22.63725, 3.7669787, 20.838837, -22.63725, 3.321015, 21.352875, -22.63725, 3.4733052, 20.38851, -22.63725, 3.7669787, 21.352875, -22.63725, 3.4733052, 21.352875, -22.63725, 3.786178, 20.38851, -23.00336, 2.7803578, 21.352875, -22.63725, 2.8034854, 20.38851, -22.63725, 2.7803578, 20.38851, -23.00336, 2.7803578, 21.352875, -23.00336, 2.8034854, 21.352875, -22.63725, 2.8034854, 12.431835, -22.63725, 2.9562135, 20.38851, -23.00336, 2.7803578, 20.38851, -22.63725, 2.7803578, 12.431835, -22.63725, 2.9562135, 12.431835, -23.00336, 2.9562135, 20.38851, -23.00336, 2.7803578, 21.352875, -23.00336, 3.786178, 20.38851, -23.00336, 2.7803578, 20.38851, -23.00336, 3.7669787, 20.38851, -23.00336, 2.7803578, 21.352875, -23.00336, 3.786178, 21.352875, -23.00336, 3.2546868, 20.38851, -23.00336, 2.7803578, 21.352875, -23.00336, 3.2546868, 21.352875, -23.00336, 2.8034854, 12.431835, -23.00336, 2.9562135, 20.38851, -23.00336, 3.7669787, 20.38851, -23.00336, 2.7803578, 12.431835, -23.00336, 2.9562135, 12.431835, -23.00336, 3.786178, 20.38851, -23.00336, 3.7669787, 21.352875, -22.63725, 3.4733052, 21.264729, -22.776888, 3.3083596, 21.352875, -23.00336, 3.2546868, 21.264729, -22.776888, 3.3083596, 21.352875, -22.63725, 3.1997046, 21.352875, -23.00336, 3.2546868, 21.352875, -23.00336, 3.786178, 21.352875, -22.63725, 3.4733052, 21.352875, -23.00336, 3.2546868, 21.352875, -23.00336, 3.786178, 21.352875, -22.63725, 3.786178, 21.352875, -22.63725, 3.4733052, 21.352875, -22.63725, 3.1997046, 21.352875, -23.00336, 2.8034854, 21.352875, -23.00336, 3.2546868, 21.352875, -22.63725, 3.1997046, 21.352875, -22.63725, 2.8034854, 21.352875, -23.00336, 2.8034854, 12.431835, -22.63725, 2.9562135, 12.431835, -23.00336, 3.786178, 12.431835, -23.00336, 2.9562135, 12.431835, -23.00336, 3.786178, 12.431835, -22.63725, 2.9562135, 12.431835, -22.63725, 3.5784698, 12.431835, -23.00336, 3.786178, 12.431835, -22.63725, 3.5784698, 12.431835, -22.728888, 3.786178, 14.157221, -23.00336, 0.4183159, 21.256002, -22.63725, 0.25860643, 14.157221, -22.63725, 0.4183159, 14.157221, -23.00336, 0.4183159, 21.256002, -23.00336, 0.25860643, 21.256002, -22.63725, 0.25860643, 12.528709, -22.63725, 0.41177034, 14.157221, -23.00336, 0.4183159, 14.157221, -22.63725, 0.4183159, 12.528709, -22.63725, 0.41177034, 12.528709, -23.00336, 0.41177034, 14.157221, -23.00336, 0.4183159, 14.157221, -23.00336, 1.4267545, 21.256002, -23.00336, 0.25860643, 14.157221, -23.00336, 0.4183159, 14.157221, -23.00336, 1.4267545, 21.256002, -23.00336, 1.2413001, 21.256002, -23.00336, 0.25860643, 12.528709, -23.00336, 0.41177034, 14.157221, -23.00336, 1.4267545, 14.157221, -23.00336, 0.4183159, 12.528709, -23.00336, 0.41177034, 12.528709, -23.00336, 1.2413001, 14.157221, -23.00336, 1.4267545, 12.528709, -23.00336, 0.41177034, 12.528709, -22.63725, 1.2413001, 12.528709, -23.00336, 1.2413001, 12.528709, -23.00336, 0.41177034, 12.528709, -22.63725, 0.41177034, 12.528709, -22.63725, 1.2413001, 14.157221, -22.63725, 1.1745362, 14.157221, -22.728888, 1.4267545, 13.750093, -22.63725, 1.3805003, 14.157221, -22.63725, 1.1745362, 15.931917, -22.63725, 1.3805003, 14.157221, -22.728888, 1.4267545, 14.157221, -22.63725, 1.1745362, 19.925089, -22.63725, 1.2762094, 15.931917, -22.63725, 1.3805003, 13.750093, -22.63725, 1.3805003, 14.157221, -22.63725, 0.4183159, 14.157221, -22.63725, 1.1745362, 13.750093, -22.63725, 1.3805003, 12.528709, -22.63725, 0.41177034, 14.157221, -22.63725, 0.4183159, 12.528709, -22.63725, 0.41177034, 13.750093, -22.63725, 1.3805003, 12.528709, -22.63725, 1.2413001, 21.256002, -22.63725, 0.25860643, 14.157221, -22.63725, 1.1745362, 14.157221, -22.63725, 0.4183159, 14.157221, -22.63725, 1.1745362, 21.256002, -22.63725, 0.25860643, 19.925089, -22.63725, 1.2762094, 19.925089, -22.63725, 1.2762094, 21.256002, -22.63725, 0.25860643, 21.256002, -22.63725, 0.99606276, 19.925089, -22.63725, 1.2762094, 21.256002, -22.63725, 0.99606276, 21.256002, -22.728888, 1.2413001, 12.528709, -22.63725, 1.2413001, 14.157221, -23.00336, 1.4267545, 12.528709, -23.00336, 1.2413001, 14.157221, -23.00336, 1.4267545, 12.528709, -22.63725, 1.2413001, 13.750093, -22.63725, 1.3805003, 14.157221, -23.00336, 1.4267545, 13.750093, -22.63725, 1.3805003, 14.157221, -22.728888, 1.4267545, 14.157221, -22.728888, 1.4267545, 21.256002, -23.00336, 1.2413001, 14.157221, -23.00336, 1.4267545, 14.157221, -22.728888, 1.4267545, 19.925089, -22.63725, 1.2762094, 21.256002, -23.00336, 1.2413001, 21.256002, -23.00336, 1.2413001, 19.925089, -22.63725, 1.2762094, 21.256002, -22.728888, 1.2413001, 19.925089, -22.63725, 1.2762094, 14.157221, -22.728888, 1.4267545, 15.931917, -22.63725, 1.3805003, 21.256002, -22.728888, 1.2413001, 21.256002, -23.00336, 0.25860643, 21.256002, -23.00336, 1.2413001, 21.256002, -23.00336, 0.25860643, 21.256002, -22.728888, 1.2413001, 21.256002, -22.63725, 0.99606276, 21.256002, -23.00336, 0.25860643, 21.256002, -22.63725, 0.99606276, 21.256002, -22.63725, 0.25860643, 17.195192, -22.439577, -16.726889, 21.299639, -22.073904, -16.912344, 17.195192, -22.073904, -16.726889, 17.195192, -22.439577, -16.726889, 21.299639, -22.439577, -16.912344, 21.299639, -22.073904, -16.912344, 12.960274, -22.073904, -16.912344, 17.195192, -22.439577, -16.726889, 17.195192, -22.073904, -16.726889, 12.960274, -22.073904, -16.912344, 12.960274, -22.439577, -16.912344, 17.195192, -22.439577, -16.726889, 17.195192, -22.439577, -15.748123, 21.299639, -22.439577, -16.912344, 17.195192, -22.439577, -16.726889, 17.195192, -22.439577, -15.748123, 21.299639, -22.439577, -16.082378, 21.299639, -22.439577, -16.912344, 17.195192, -22.439577, -16.726889, 12.960274, -22.439577, -15.779104, 17.195192, -22.439577, -15.748123, 17.195192, -22.439577, -16.726889, 12.960274, -22.439577, -16.355106, 12.960274, -22.439577, -15.779104, 12.960274, -22.439577, -16.355106, 17.195192, -22.439577, -16.726889, 12.960274, -22.439577, -16.912344, 21.299639, -22.439577, -16.082378, 21.299639, -22.073904, -16.912344, 21.299639, -22.439577, -16.912344, 21.299639, -22.439577, -16.082378, 21.299639, -22.073904, -16.082378, 21.299639, -22.073904, -16.912344, 12.960274, -22.073904, -16.422306, 13.119982, -22.182995, -16.32456, 12.960274, -22.439577, -16.355106, 17.195192, -22.073904, -15.992487, 17.195192, -22.165104, -15.748123, 16.136572, -22.073904, -15.755539, 17.195192, -22.073904, -15.992487, 18.221523, -22.073904, -15.831467, 17.195192, -22.165104, -15.748123, 17.195192, -22.073904, -15.992487, 21.299639, -22.073904, -16.082378, 18.221523, -22.073904, -15.831467, 17.195192, -22.073904, -15.992487, 21.299639, -22.073904, -16.912344, 21.299639, -22.073904, -16.082378, 21.299639, -22.073904, -16.912344, 17.195192, -22.073904, -15.992487, 17.195192, -22.073904, -16.726889, 16.136572, -22.073904, -15.755539, 17.195192, -22.073904, -16.726889, 17.195192, -22.073904, -15.992487, 17.195192, -22.073904, -16.726889, 12.960274, -22.073904, -16.422306, 12.960274, -22.073904, -16.912344, 17.195192, -22.073904, -16.726889, 13.688129, -22.073904, -16.321941, 12.960274, -22.073904, -16.422306, 16.136572, -22.073904, -15.755539, 13.688129, -22.073904, -16.321941, 17.195192, -22.073904, -16.726889, 13.119982, -22.182995, -16.32456, 12.960274, -22.073904, -16.422306, 13.688129, -22.073904, -16.321941, 12.960274, -22.073904, -16.14565, 13.119982, -22.182995, -16.32456, 13.688129, -22.073904, -16.321941, 13.688129, -22.073904, -16.321941, 16.136572, -22.073904, -15.755539, 12.960274, -22.073904, -16.14565, 12.960274, -22.073904, -16.14565, 16.136572, -22.073904, -15.755539, 12.960274, -22.073904, -15.779104, 12.960274, -22.439577, -16.912344, 12.960274, -22.073904, -16.422306, 12.960274, -22.439577, -16.355106, 12.960274, -22.439577, -16.912344, 12.960274, -22.073904, -16.912344, 12.960274, -22.073904, -16.422306, 12.960274, -22.073904, -16.14565, 12.960274, -22.439577, -15.779104, 12.960274, -22.439577, -16.355106, 12.960274, -22.073904, -16.14565, 12.960274, -22.073904, -15.779104, 12.960274, -22.439577, -15.779104, 13.119982, -22.182995, -16.32456, 12.960274, -22.073904, -16.14565, 12.960274, -22.439577, -16.355106, 12.960274, -22.073904, -15.779104, 17.195192, -22.439577, -15.748123, 12.960274, -22.439577, -15.779104, 17.195192, -22.439577, -15.748123, 12.960274, -22.073904, -15.779104, 16.136572, -22.073904, -15.755539, 17.195192, -22.439577, -15.748123, 16.136572, -22.073904, -15.755539, 17.195192, -22.165104, -15.748123, 17.195192, -22.165104, -15.748123, 21.299639, -22.439577, -16.082378, 17.195192, -22.439577, -15.748123, 17.195192, -22.165104, -15.748123, 21.299639, -22.073904, -16.082378, 21.299639, -22.439577, -16.082378, 21.299639, -22.073904, -16.082378, 17.195192, -22.165104, -15.748123, 18.221523, -22.073904, -15.831467, 20.39811, -22.073904, -13.344625, 21.299639, -22.439577, -13.325426, 20.39811, -22.439577, -13.344625, 20.39811, -22.073904, -13.344625, 21.299639, -22.073904, -13.325426, 21.299639, -22.439577, -13.325426, 20.39811, -22.439577, -13.344625, 14.819624, -22.073904, -13.330225, 20.39811, -22.073904, -13.344625, 20.39811, -22.439577, -13.344625, 12.960274, -22.165104, -13.325426, 14.819624, -22.073904, -13.330225, 12.960274, -22.165104, -13.325426, 20.39811, -22.439577, -13.344625, 12.960274, -22.439577, -13.325426, 21.299639, -22.073904, -14.308119, 20.39811, -22.073904, -13.344625, 20.39811, -22.073904, -14.331245, 14.819624, -22.073904, -13.330225, 20.39811, -22.073904, -14.331245, 20.39811, -22.073904, -13.344625, 14.819624, -22.073904, -13.330225, 12.960274, -22.073904, -14.154955, 20.39811, -22.073904, -14.331245, 12.960274, -22.073904, -14.154955, 14.819624, -22.073904, -13.330225, 12.960274, -22.073904, -13.5327, 12.960274, -22.073904, -13.5327, 14.819624, -22.073904, -13.330225, 12.960274, -22.165104, -13.325426, 20.39811, -22.073904, -13.344625, 21.299639, -22.073904, -14.308119, 20.818766, -22.073904, -13.7901535, 20.818766, -22.073904, -13.7901535, 21.299639, -22.073904, -14.308119, 21.299639, -22.073904, -13.9119, 21.299639, -22.073904, -13.9119, 21.217165, -22.213541, -13.803246, 20.818766, -22.073904, -13.7901535, 21.217165, -22.213541, -13.803246, 21.299639, -22.073904, -13.6383, 20.818766, -22.073904, -13.7901535, 20.39811, -22.073904, -13.344625, 20.818766, -22.073904, -13.7901535, 21.299639, -22.073904, -13.6383, 20.39811, -22.073904, -13.344625, 21.299639, -22.073904, -13.6383, 21.299639, -22.073904, -13.325426, 20.39811, -22.439577, -14.331245, 21.299639, -22.073904, -14.308119, 20.39811, -22.073904, -14.331245, 20.39811, -22.439577, -14.331245, 21.299639, -22.439577, -14.308119, 21.299639, -22.073904, -14.308119, 12.960274, -22.073904, -14.154955, 20.39811, -22.439577, -14.331245, 20.39811, -22.073904, -14.331245, 12.960274, -22.073904, -14.154955, 12.960274, -22.439577, -14.154955, 20.39811, -22.439577, -14.331245, 21.299639, -22.439577, -13.325426, 20.39811, -22.439577, -14.331245, 20.39811, -22.439577, -13.344625, 20.39811, -22.439577, -14.331245, 21.299639, -22.439577, -13.325426, 21.299639, -22.439577, -13.856482, 20.39811, -22.439577, -14.331245, 21.299639, -22.439577, -13.856482, 21.299639, -22.439577, -14.308119, 12.960274, -22.439577, -14.154955, 20.39811, -22.439577, -13.344625, 20.39811, -22.439577, -14.331245, 12.960274, -22.439577, -14.154955, 12.960274, -22.439577, -13.325426, 20.39811, -22.439577, -13.344625, 21.299639, -22.073904, -13.6383, 21.217165, -22.213541, -13.803246, 21.299639, -22.439577, -13.856482, 21.217165, -22.213541, -13.803246, 21.299639, -22.073904, -13.9119, 21.299639, -22.439577, -13.856482, 21.299639, -22.439577, -13.325426, 21.299639, -22.073904, -13.6383, 21.299639, -22.439577, -13.856482, 21.299639, -22.439577, -13.325426, 21.299639, -22.073904, -13.325426, 21.299639, -22.073904, -13.6383, 21.299639, -22.073904, -13.9119, 21.299639, -22.439577, -14.308119, 21.299639, -22.439577, -13.856482, 21.299639, -22.073904, -13.9119, 21.299639, -22.073904, -14.308119, 21.299639, -22.439577, -14.308119, 12.960274, -22.073904, -14.154955, 12.960274, -22.439577, -13.325426, 12.960274, -22.439577, -14.154955, 12.960274, -22.439577, -13.325426, 12.960274, -22.073904, -14.154955, 12.960274, -22.073904, -13.5327, 12.960274, -22.439577, -13.325426, 12.960274, -22.073904, -13.5327, 12.960274, -22.165104, -13.325426, 13.295837, -22.635942, 4.8980365, 13.527548, -22.543432, 4.8980365, 13.527548, -22.635942, 4.8980365, 13.295837, -22.635942, 4.8980365, 13.295837, -22.543432, 4.8980365, 13.527548, -22.543432, 4.8980365, 13.295837, -22.543432, 4.8980365, 13.527548, -22.543432, -19.742168, 13.527548, -22.543432, 4.8980365, 13.295837, -22.543432, 4.8980365, 13.295837, -22.543432, -19.742168, 13.527548, -22.543432, -19.742168, 13.295837, -22.543432, -19.742168, 13.527548, -22.635942, -19.742168, 13.527548, -22.543432, -19.742168, 13.295837, -22.543432, -19.742168, 13.295837, -22.635942, -19.742168, 13.527548, -22.635942, -19.742168, 13.295837, -22.635942, -19.742168, 13.527548, -22.635942, 4.8980365, 13.527548, -22.635942, -19.742168, 13.295837, -22.635942, -19.742168, 13.295837, -22.635942, 4.8980365, 13.527548, -22.635942, 4.8980365, 13.527548, -22.635942, 4.8980365, 13.527548, -22.543432, -19.742168, 13.527548, -22.635942, -19.742168, 13.527548, -22.635942, 4.8980365, 13.527548, -22.543432, 4.8980365, 13.527548, -22.543432, -19.742168, 13.295837, -22.635942, -19.742168, 13.295837, -22.543432, 4.8980365, 13.295837, -22.635942, 4.8980365, 13.295837, -22.635942, -19.742168, 13.295837, -22.543432, -19.742168, 13.295837, -22.543432, 4.8980365, 14.33395, -22.439577, -18.07831, 21.590258, -22.073904, -18.237583, 14.33395, -22.073904, -18.07831, 14.33395, -22.439577, -18.07831, 21.590258, -22.439577, -18.237583, 21.590258, -22.073904, -18.237583, 12.669218, -22.073904, -18.084854, 14.33395, -22.439577, -18.07831, 14.33395, -22.073904, -18.07831, 12.669218, -22.073904, -18.084854, 12.669218, -22.439577, -18.084854, 14.33395, -22.439577, -18.07831, 14.33395, -22.439577, -17.069435, 21.590258, -22.439577, -18.237583, 14.33395, -22.439577, -18.07831, 14.33395, -22.439577, -17.069435, 21.590258, -22.439577, -17.25489, 21.590258, -22.439577, -18.237583, 12.669218, -22.439577, -18.084854, 14.33395, -22.439577, -17.069435, 14.33395, -22.439577, -18.07831, 12.669218, -22.439577, -18.084854, 12.669218, -22.439577, -17.25489, 14.33395, -22.439577, -17.069435, 12.669218, -22.439577, -18.084854, 12.669218, -22.073904, -17.25489, 12.669218, -22.439577, -17.25489, 12.669218, -22.439577, -18.084854, 12.669218, -22.073904, -18.084854, 12.669218, -22.073904, -17.25489, 14.33395, -22.073904, -17.321653, 14.33395, -22.165104, -17.069435, 13.917658, -22.073904, -17.115688, 14.33395, -22.073904, -17.321653, 16.147917, -22.073904, -17.115688, 14.33395, -22.165104, -17.069435, 14.33395, -22.073904, -17.321653, 20.229671, -22.073904, -17.220417, 16.147917, -22.073904, -17.115688, 13.917658, -22.073904, -17.115688, 14.33395, -22.073904, -18.07831, 14.33395, -22.073904, -17.321653, 13.917658, -22.073904, -17.115688, 12.669218, -22.073904, -18.084854, 14.33395, -22.073904, -18.07831, 12.669218, -22.073904, -18.084854, 13.917658, -22.073904, -17.115688, 12.669218, -22.073904, -17.25489, 21.590258, -22.073904, -18.237583, 14.33395, -22.073904, -17.321653, 14.33395, -22.073904, -18.07831, 14.33395, -22.073904, -17.321653, 21.590258, -22.073904, -18.237583, 20.229671, -22.073904, -17.220417, 20.229671, -22.073904, -17.220417, 21.590258, -22.073904, -18.237583, 21.590258, -22.073904, -17.501, 20.229671, -22.073904, -17.220417, 21.590258, -22.073904, -17.501, 21.590258, -22.165104, -17.25489, 12.669218, -22.073904, -17.25489, 14.33395, -22.439577, -17.069435, 12.669218, -22.439577, -17.25489, 14.33395, -22.439577, -17.069435, 12.669218, -22.073904, -17.25489, 13.917658, -22.073904, -17.115688, 14.33395, -22.439577, -17.069435, 13.917658, -22.073904, -17.115688, 14.33395, -22.165104, -17.069435, 14.33395, -22.165104, -17.069435, 21.590258, -22.439577, -17.25489, 14.33395, -22.439577, -17.069435, 14.33395, -22.165104, -17.069435, 20.229671, -22.073904, -17.220417, 21.590258, -22.439577, -17.25489, 21.590258, -22.439577, -17.25489, 20.229671, -22.073904, -17.220417, 21.590258, -22.165104, -17.25489, 20.229671, -22.073904, -17.220417, 14.33395, -22.165104, -17.069435, 16.147917, -22.073904, -17.115688, 21.590258, -22.165104, -17.25489, 21.590258, -22.439577, -18.237583, 21.590258, -22.439577, -17.25489, 21.590258, -22.439577, -18.237583, 21.590258, -22.165104, -17.25489, 21.590258, -22.073904, -17.501, 21.590258, -22.439577, -18.237583, 21.590258, -22.073904, -17.501, 21.590258, -22.073904, -18.237583, 12.749508, -25.90344, -19.752205, 13.527111, -21.174994, -19.579403, 13.354311, -25.90344, -19.752205, 12.749508, -25.90344, -19.752205, 12.57671, -21.174994, -19.579403, 13.527111, -21.174994, -19.579403, 12.57671, -21.174994, -19.579403, 13.527111, -21.174994, -20.52937, 13.527111, -21.174994, -19.579403, 12.57671, -21.174994, -19.579403, 12.57671, -21.174994, -20.52937, 13.527111, -21.174994, -20.52937, 12.57671, -21.174994, -20.52937, 13.354311, -25.90344, -20.356571, 13.527111, -21.174994, -20.52937, 12.57671, -21.174994, -20.52937, 12.749508, -25.90344, -20.356571, 13.354311, -25.90344, -20.356571, 12.749508, -25.90344, -20.356571, 13.354311, -25.90344, -19.752205, 13.354311, -25.90344, -20.356571, 12.749508, -25.90344, -20.356571, 12.749508, -25.90344, -19.752205, 13.354311, -25.90344, -19.752205, 13.354311, -25.90344, -19.752205, 13.527111, -21.174994, -20.52937, 13.354311, -25.90344, -20.356571, 13.354311, -25.90344, -19.752205, 13.527111, -21.174994, -19.579403, 13.527111, -21.174994, -20.52937, 12.749508, -25.90344, -20.356571, 12.57671, -21.174994, -19.579403, 12.749508, -25.90344, -19.752205, 12.749508, -25.90344, -20.356571, 12.57671, -21.174994, -20.52937, 12.57671, -21.174994, -19.579403, 20.39811, -22.073904, -18.576202, 21.299639, -22.439577, -18.556564, 20.39811, -22.439577, -18.576202, 20.39811, -22.073904, -18.576202, 21.299639, -22.073904, -18.556564, 21.299639, -22.439577, -18.556564, 20.39811, -22.439577, -18.576202, 14.819624, -22.073904, -18.561365, 20.39811, -22.073904, -18.576202, 20.39811, -22.439577, -18.576202, 12.960274, -22.165104, -18.556564, 14.819624, -22.073904, -18.561365, 12.960274, -22.165104, -18.556564, 20.39811, -22.439577, -18.576202, 12.960274, -22.439577, -18.556564, 21.299639, -22.073904, -19.539696, 20.39811, -22.073904, -18.576202, 20.39811, -22.073904, -19.562386, 14.819624, -22.073904, -18.561365, 20.39811, -22.073904, -19.562386, 20.39811, -22.073904, -18.576202, 14.819624, -22.073904, -18.561365, 12.960274, -22.073904, -19.386532, 20.39811, -22.073904, -19.562386, 12.960274, -22.073904, -19.386532, 14.819624, -22.073904, -18.561365, 12.960274, -22.073904, -18.764275, 12.960274, -22.073904, -18.764275, 14.819624, -22.073904, -18.561365, 12.960274, -22.165104, -18.556564, 20.39811, -22.073904, -18.576202, 21.299639, -22.073904, -19.539696, 20.818766, -22.073904, -19.022167, 20.818766, -22.073904, -19.022167, 21.299639, -22.073904, -19.539696, 21.299639, -22.073904, -19.143913, 21.299639, -22.073904, -19.143913, 21.217165, -22.213541, -19.034386, 20.818766, -22.073904, -19.022167, 21.217165, -22.213541, -19.034386, 21.299639, -22.073904, -18.869438, 20.818766, -22.073904, -19.022167, 20.39811, -22.073904, -18.576202, 20.818766, -22.073904, -19.022167, 21.299639, -22.073904, -18.869438, 20.39811, -22.073904, -18.576202, 21.299639, -22.073904, -18.869438, 21.299639, -22.073904, -18.556564, 20.39811, -22.439577, -19.562386, 21.299639, -22.073904, -19.539696, 20.39811, -22.073904, -19.562386, 20.39811, -22.439577, -19.562386, 21.299639, -22.439577, -19.539696, 21.299639, -22.073904, -19.539696, 12.960274, -22.073904, -19.386532, 20.39811, -22.439577, -19.562386, 20.39811, -22.073904, -19.562386, 12.960274, -22.073904, -19.386532, 12.960274, -22.439577, -19.386532, 20.39811, -22.439577, -19.562386, 21.299639, -22.439577, -18.556564, 20.39811, -22.439577, -19.562386, 20.39811, -22.439577, -18.576202, 20.39811, -22.439577, -19.562386, 21.299639, -22.439577, -18.556564, 21.299639, -22.439577, -19.088493, 20.39811, -22.439577, -19.562386, 21.299639, -22.439577, -19.088493, 21.299639, -22.439577, -19.539696, 12.960274, -22.439577, -19.386532, 20.39811, -22.439577, -18.576202, 20.39811, -22.439577, -19.562386, 12.960274, -22.439577, -19.386532, 12.960274, -22.439577, -18.556564, 20.39811, -22.439577, -18.576202, 21.299639, -22.073904, -18.869438, 21.217165, -22.213541, -19.034386, 21.299639, -22.439577, -19.088493, 21.217165, -22.213541, -19.034386, 21.299639, -22.073904, -19.143913, 21.299639, -22.439577, -19.088493, 21.299639, -22.439577, -18.556564, 21.299639, -22.073904, -18.869438, 21.299639, -22.439577, -19.088493, 21.299639, -22.439577, -18.556564, 21.299639, -22.073904, -18.556564, 21.299639, -22.073904, -18.869438, 21.299639, -22.073904, -19.143913, 21.299639, -22.439577, -19.539696, 21.299639, -22.439577, -19.088493, 21.299639, -22.073904, -19.143913, 21.299639, -22.073904, -19.539696, 21.299639, -22.439577, -19.539696, 12.960274, -22.073904, -19.386532, 12.960274, -22.439577, -18.556564, 12.960274, -22.439577, -19.386532, 12.960274, -22.439577, -18.556564, 12.960274, -22.073904, -19.386532, 12.960274, -22.073904, -18.764275, 12.960274, -22.439577, -18.556564, 12.960274, -22.073904, -18.764275, 12.960274, -22.165104, -18.556564, 20.62589, -22.073904, -12.164696, 21.590258, -22.439577, -12.14506, 20.62589, -22.439577, -12.164696, 20.62589, -22.073904, -12.164696, 21.590258, -22.073904, -12.14506, 21.590258, -22.439577, -12.14506, 20.62589, -22.439577, -12.164696, 14.658169, -22.073904, -12.149858, 20.62589, -22.073904, -12.164696, 20.62589, -22.439577, -12.164696, 12.669218, -22.165104, -12.14506, 14.658169, -22.073904, -12.149858, 12.669218, -22.165104, -12.14506, 20.62589, -22.439577, -12.164696, 12.669218, -22.439577, -12.14506, 21.590258, -22.073904, -13.127752, 20.62589, -22.073904, -12.164696, 20.62589, -22.073904, -13.150879, 14.658169, -22.073904, -12.149858, 20.62589, -22.073904, -13.150879, 20.62589, -22.073904, -12.164696, 14.658169, -22.073904, -12.149858, 12.669218, -22.073904, -12.975025, 20.62589, -22.073904, -13.150879, 12.669218, -22.073904, -12.975025, 14.658169, -22.073904, -12.149858, 12.669218, -22.073904, -12.352768, 12.669218, -22.073904, -12.352768, 14.658169, -22.073904, -12.149858, 12.669218, -22.165104, -12.14506, 20.62589, -22.073904, -12.164696, 21.590258, -22.073904, -13.127752, 21.07622, -22.073904, -12.610224, 21.07622, -22.073904, -12.610224, 21.590258, -22.073904, -13.127752, 21.590258, -22.073904, -12.73197, 21.590258, -22.073904, -12.73197, 21.502111, -22.213541, -12.622879, 21.07622, -22.073904, -12.610224, 21.502111, -22.213541, -12.622879, 21.590258, -22.073904, -12.457933, 21.07622, -22.073904, -12.610224, 20.62589, -22.073904, -12.164696, 21.07622, -22.073904, -12.610224, 21.590258, -22.073904, -12.457933, 20.62589, -22.073904, -12.164696, 21.590258, -22.073904, -12.457933, 21.590258, -22.073904, -12.14506, 20.62589, -22.439577, -13.150879, 21.590258, -22.073904, -13.127752, 20.62589, -22.073904, -13.150879, 20.62589, -22.439577, -13.150879, 21.590258, -22.439577, -13.127752, 21.590258, -22.073904, -13.127752, 12.669218, -22.073904, -12.975025, 20.62589, -22.439577, -13.150879, 20.62589, -22.073904, -13.150879, 12.669218, -22.073904, -12.975025, 12.669218, -22.439577, -12.975025, 20.62589, -22.439577, -13.150879, 21.590258, -22.439577, -12.14506, 20.62589, -22.439577, -13.150879, 20.62589, -22.439577, -12.164696, 20.62589, -22.439577, -13.150879, 21.590258, -22.439577, -12.14506, 21.590258, -22.439577, -12.676552, 20.62589, -22.439577, -13.150879, 21.590258, -22.439577, -12.676552, 21.590258, -22.439577, -13.127752, 12.669218, -22.439577, -12.975025, 20.62589, -22.439577, -12.164696, 20.62589, -22.439577, -13.150879, 12.669218, -22.439577, -12.975025, 12.669218, -22.439577, -12.14506, 20.62589, -22.439577, -12.164696, 21.590258, -22.073904, -12.457933, 21.502111, -22.213541, -12.622879, 21.590258, -22.439577, -12.676552, 21.502111, -22.213541, -12.622879, 21.590258, -22.073904, -12.73197, 21.590258, -22.439577, -12.676552, 21.590258, -22.439577, -12.14506, 21.590258, -22.073904, -12.457933, 21.590258, -22.439577, -12.676552, 21.590258, -22.439577, -12.14506, 21.590258, -22.073904, -12.14506, 21.590258, -22.073904, -12.457933, 21.590258, -22.073904, -12.73197, 21.590258, -22.439577, -13.127752, 21.590258, -22.439577, -12.676552, 21.590258, -22.073904, -12.73197, 21.590258, -22.073904, -13.127752, 21.590258, -22.439577, -13.127752, 12.669218, -22.073904, -12.975025, 12.669218, -22.439577, -12.14506, 12.669218, -22.439577, -12.975025, 12.669218, -22.439577, -12.14506, 12.669218, -22.073904, -12.975025, 12.669218, -22.073904, -12.352768, 12.669218, -22.439577, -12.14506, 12.669218, -22.073904, -12.352768, 12.669218, -22.165104, -12.14506, 17.199993, -22.439577, -11.627094, 21.590258, -22.073904, -11.812113, 17.199993, -22.073904, -11.627094, 17.199993, -22.439577, -11.627094, 21.590258, -22.439577, -11.812113, 21.590258, -22.073904, -11.812113, 12.669218, -22.073904, -11.812113, 17.199993, -22.439577, -11.627094, 17.199993, -22.073904, -11.627094, 12.669218, -22.073904, -11.812113, 12.669218, -22.439577, -11.812113, 17.199993, -22.439577, -11.627094, 17.199993, -22.439577, -10.647455, 21.590258, -22.439577, -11.812113, 17.199993, -22.439577, -11.627094, 17.199993, -22.439577, -10.647455, 21.590258, -22.439577, -10.982147, 21.590258, -22.439577, -11.812113, 17.199993, -22.439577, -11.627094, 12.669218, -22.439577, -10.678438, 17.199993, -22.439577, -10.647455, 17.199993, -22.439577, -11.627094, 12.669218, -22.439577, -11.254438, 12.669218, -22.439577, -10.678438, 12.669218, -22.439577, -11.254438, 17.199993, -22.439577, -11.627094, 12.669218, -22.439577, -11.812113, 21.590258, -22.439577, -10.982147, 21.590258, -22.073904, -11.812113, 21.590258, -22.439577, -11.812113, 21.590258, -22.439577, -10.982147, 21.590258, -22.073904, -10.982147, 21.590258, -22.073904, -11.812113, 12.669218, -22.073904, -11.32164, 12.840273, -22.182995, -11.224329, 12.669218, -22.439577, -11.254438, 17.199993, -22.073904, -10.892256, 17.199993, -22.165104, -10.647455, 16.06719, -22.073904, -10.65531, 17.199993, -22.073904, -10.892256, 18.29745, -22.073904, -10.731237, 17.199993, -22.165104, -10.647455, 17.199993, -22.073904, -10.892256, 21.590258, -22.073904, -10.982147, 18.29745, -22.073904, -10.731237, 17.199993, -22.073904, -10.892256, 21.590258, -22.073904, -11.812113, 21.590258, -22.073904, -10.982147, 21.590258, -22.073904, -11.812113, 17.199993, -22.073904, -10.892256, 17.199993, -22.073904, -11.627094, 16.06719, -22.073904, -10.65531, 17.199993, -22.073904, -11.627094, 17.199993, -22.073904, -10.892256, 17.199993, -22.073904, -11.627094, 12.669218, -22.073904, -11.32164, 12.669218, -22.073904, -11.812113, 17.199993, -22.073904, -11.627094, 13.447693, -22.073904, -11.221275, 12.669218, -22.073904, -11.32164, 16.06719, -22.073904, -10.65531, 13.447693, -22.073904, -11.221275, 17.199993, -22.073904, -11.627094, 12.840273, -22.182995, -11.224329, 12.669218, -22.073904, -11.32164, 13.447693, -22.073904, -11.221275, 12.669218, -22.073904, -11.044985, 12.840273, -22.182995, -11.224329, 13.447693, -22.073904, -11.221275, 13.447693, -22.073904, -11.221275, 16.06719, -22.073904, -10.65531, 12.669218, -22.073904, -11.044985, 12.669218, -22.073904, -11.044985, 16.06719, -22.073904, -10.65531, 12.669218, -22.073904, -10.678438, 12.669218, -22.439577, -11.812113, 12.669218, -22.073904, -11.32164, 12.669218, -22.439577, -11.254438, 12.669218, -22.439577, -11.812113, 12.669218, -22.073904, -11.812113, 12.669218, -22.073904, -11.32164, 12.669218, -22.073904, -11.044985, 12.669218, -22.439577, -10.678438, 12.669218, -22.439577, -11.254438, 12.669218, -22.073904, -11.044985, 12.669218, -22.073904, -10.678438, 12.669218, -22.439577, -10.678438, 12.840273, -22.182995, -11.224329, 12.669218, -22.073904, -11.044985, 12.669218, -22.439577, -11.254438, 12.669218, -22.073904, -10.678438, 17.199993, -22.439577, -10.647455, 12.669218, -22.439577, -10.678438, 17.199993, -22.439577, -10.647455, 12.669218, -22.073904, -10.678438, 16.06719, -22.073904, -10.65531, 17.199993, -22.439577, -10.647455, 16.06719, -22.073904, -10.65531, 17.199993, -22.165104, -10.647455, 17.199993, -22.165104, -10.647455, 21.590258, -22.439577, -10.982147, 17.199993, -22.439577, -10.647455, 17.199993, -22.165104, -10.647455, 21.590258, -22.073904, -10.982147, 21.590258, -22.439577, -10.982147, 21.590258, -22.073904, -10.982147, 17.199993, -22.165104, -10.647455, 18.29745, -22.073904, -10.731237, 20.39811, -22.073904, -9.367163, 21.299639, -22.439577, -9.347525, 20.39811, -22.439577, -9.367163, 20.39811, -22.073904, -9.367163, 21.299639, -22.073904, -9.347525, 21.299639, -22.439577, -9.347525, 20.39811, -22.439577, -9.367163, 14.819624, -22.073904, -9.352325, 20.39811, -22.073904, -9.367163, 20.39811, -22.439577, -9.367163, 12.960274, -22.165104, -9.347525, 14.819624, -22.073904, -9.352325, 12.960274, -22.165104, -9.347525, 20.39811, -22.439577, -9.367163, 12.960274, -22.439577, -9.347525, 21.299639, -22.073904, -10.330656, 20.39811, -22.073904, -9.367163, 20.39811, -22.073904, -10.353346, 14.819624, -22.073904, -9.352325, 20.39811, -22.073904, -10.353346, 20.39811, -22.073904, -9.367163, 14.819624, -22.073904, -9.352325, 12.960274, -22.073904, -10.17749, 20.39811, -22.073904, -10.353346, 12.960274, -22.073904, -10.17749, 14.819624, -22.073904, -9.352325, 12.960274, -22.073904, -9.555235, 12.960274, -22.073904, -9.555235, 14.819624, -22.073904, -9.352325, 12.960274, -22.165104, -9.347525, 20.39811, -22.073904, -9.367163, 21.299639, -22.073904, -10.330656, 20.818766, -22.073904, -9.8131275, 20.818766, -22.073904, -9.8131275, 21.299639, -22.073904, -10.330656, 21.299639, -22.073904, -9.934872, 21.299639, -22.073904, -9.934872, 21.217165, -22.213541, -9.825344, 20.818766, -22.073904, -9.8131275, 21.217165, -22.213541, -9.825344, 21.299639, -22.073904, -9.6603985, 20.818766, -22.073904, -9.8131275, 20.39811, -22.073904, -9.367163, 20.818766, -22.073904, -9.8131275, 21.299639, -22.073904, -9.6603985, 20.39811, -22.073904, -9.367163, 21.299639, -22.073904, -9.6603985, 21.299639, -22.073904, -9.347525, 20.39811, -22.439577, -10.353346, 21.299639, -22.073904, -10.330656, 20.39811, -22.073904, -10.353346, 20.39811, -22.439577, -10.353346, 21.299639, -22.439577, -10.330656, 21.299639, -22.073904, -10.330656, 12.960274, -22.073904, -10.17749, 20.39811, -22.439577, -10.353346, 20.39811, -22.073904, -10.353346, 12.960274, -22.073904, -10.17749, 12.960274, -22.439577, -10.17749, 20.39811, -22.439577, -10.353346, 21.299639, -22.439577, -9.347525, 20.39811, -22.439577, -10.353346, 20.39811, -22.439577, -9.367163, 20.39811, -22.439577, -10.353346, 21.299639, -22.439577, -9.347525, 21.299639, -22.439577, -9.879017, 20.39811, -22.439577, -10.353346, 21.299639, -22.439577, -9.879017, 21.299639, -22.439577, -10.330656, 12.960274, -22.439577, -10.17749, 20.39811, -22.439577, -9.367163, 20.39811, -22.439577, -10.353346, 12.960274, -22.439577, -10.17749, 12.960274, -22.439577, -9.347525, 20.39811, -22.439577, -9.367163, 21.299639, -22.073904, -9.6603985, 21.217165, -22.213541, -9.825344, 21.299639, -22.439577, -9.879017, 21.217165, -22.213541, -9.825344, 21.299639, -22.073904, -9.934872, 21.299639, -22.439577, -9.879017, 21.299639, -22.439577, -9.347525, 21.299639, -22.073904, -9.6603985, 21.299639, -22.439577, -9.879017, 21.299639, -22.439577, -9.347525, 21.299639, -22.073904, -9.347525, 21.299639, -22.073904, -9.6603985, 21.299639, -22.073904, -9.934872, 21.299639, -22.439577, -10.330656, 21.299639, -22.439577, -9.879017, 21.299639, -22.073904, -9.934872, 21.299639, -22.073904, -10.330656, 21.299639, -22.439577, -10.330656, 12.960274, -22.073904, -10.17749, 12.960274, -22.439577, -9.347525, 12.960274, -22.439577, -10.17749, 12.960274, -22.439577, -9.347525, 12.960274, -22.073904, -10.17749, 12.960274, -22.073904, -9.555235, 12.960274, -22.439577, -9.347525, 12.960274, -22.073904, -9.555235, 12.960274, -22.165104, -9.347525, 20.474909, -25.90344, -19.689804, 21.125528, -21.174994, -19.768787, 21.204512, -25.90344, -19.689804, 20.474909, -25.90344, -19.689804, 20.553892, -21.174994, -19.768787, 21.125528, -21.174994, -19.768787, 20.553892, -21.174994, -19.768787, 21.125528, -21.174994, -20.340424, 21.125528, -21.174994, -19.768787, 20.553892, -21.174994, -19.768787, 20.553892, -21.174994, -20.340424, 21.125528, -21.174994, -20.340424, 20.553892, -21.174994, -20.340424, 21.204512, -25.90344, -20.419407, 21.125528, -21.174994, -20.340424, 20.553892, -21.174994, -20.340424, 20.474909, -25.90344, -20.419407, 21.204512, -25.90344, -20.419407, 20.474909, -25.90344, -20.419407, 21.204512, -25.90344, -19.689804, 21.204512, -25.90344, -20.419407, 20.474909, -25.90344, -20.419407, 20.474909, -25.90344, -19.689804, 21.204512, -25.90344, -19.689804, 21.204512, -25.90344, -19.689804, 21.125528, -21.174994, -20.340424, 21.204512, -25.90344, -20.419407, 21.204512, -25.90344, -19.689804, 21.125528, -21.174994, -19.768787, 21.125528, -21.174994, -20.340424, 20.474909, -25.90344, -20.419407, 20.553892, -21.174994, -19.768787, 20.474909, -25.90344, -19.689804, 20.474909, -25.90344, -20.419407, 20.553892, -21.174994, -20.340424, 20.553892, -21.174994, -19.768787, 12.886963, -25.90344, 5.2994914, 13.6170025, -21.174994, 5.2994914, 13.6170025, -25.90344, 5.2994914, 12.886963, -25.90344, 5.2994914, 12.886963, -21.174994, 5.2994914, 13.6170025, -21.174994, 5.2994914, 12.886963, -25.90344, 4.5698895, 13.6170025, -25.90344, 5.2994914, 13.6170025, -25.90344, 4.5698895, 12.886963, -25.90344, 4.5698895, 12.886963, -25.90344, 5.2994914, 13.6170025, -25.90344, 5.2994914, 13.6170025, -25.90344, 5.2994914, 13.6170025, -21.174994, 4.5698895, 13.6170025, -25.90344, 4.5698895, 13.6170025, -25.90344, 5.2994914, 13.6170025, -21.174994, 5.2994914, 13.6170025, -21.174994, 4.5698895, 12.886963, -22.357105, 4.5698895, 13.069365, -21.174994, 4.5698895, 12.886963, -21.174994, 4.7522902, 12.886963, -25.90344, 5.2994914, 12.886963, -22.357105, 4.5698895, 12.886963, -21.174994, 4.7522902, 12.886963, -22.357105, 4.5698895, 12.886963, -25.90344, 5.2994914, 12.886963, -25.90344, 4.5698895, 12.886963, -25.90344, 5.2994914, 12.886963, -21.174994, 4.7522902, 12.886963, -21.174994, 5.2994914, 12.886963, -21.174994, 4.7522902, 13.6170025, -21.174994, 5.2994914, 12.886963, -21.174994, 5.2994914, 13.6170025, -21.174994, 5.2994914, 12.886963, -21.174994, 4.7522902, 13.069365, -21.174994, 4.5698895, 13.6170025, -21.174994, 5.2994914, 13.069365, -21.174994, 4.5698895, 13.6170025, -21.174994, 4.5698895, 12.886963, -25.90344, 4.5698895, 13.069365, -21.174994, 4.5698895, 12.886963, -22.357105, 4.5698895, 13.069365, -21.174994, 4.5698895, 12.886963, -25.90344, 4.5698895, 13.6170025, -25.90344, 4.5698895, 13.069365, -21.174994, 4.5698895, 13.6170025, -25.90344, 4.5698895, 13.6170025, -21.174994, 4.5698895, 17.195192, -22.439577, -7.5178485, 21.299639, -22.073904, -7.703304, 17.195192, -22.073904, -7.5178485, 17.195192, -22.439577, -7.5178485, 21.299639, -22.439577, -7.703304, 21.299639, -22.073904, -7.703304, 12.960274, -22.073904, -7.703304, 17.195192, -22.439577, -7.5178485, 17.195192, -22.073904, -7.5178485, 12.960274, -22.073904, -7.703304, 12.960274, -22.439577, -7.703304, 17.195192, -22.439577, -7.5178485, 17.195192, -22.439577, -6.539082, 21.299639, -22.439577, -7.703304, 17.195192, -22.439577, -7.5178485, 17.195192, -22.439577, -6.539082, 21.299639, -22.439577, -6.873338, 21.299639, -22.439577, -7.703304, 17.195192, -22.439577, -7.5178485, 12.960274, -22.439577, -6.570064, 17.195192, -22.439577, -6.539082, 17.195192, -22.439577, -7.5178485, 12.960274, -22.439577, -7.146065, 12.960274, -22.439577, -6.570064, 12.960274, -22.439577, -7.146065, 17.195192, -22.439577, -7.5178485, 12.960274, -22.439577, -7.703304, 21.299639, -22.439577, -6.873338, 21.299639, -22.073904, -7.703304, 21.299639, -22.439577, -7.703304, 21.299639, -22.439577, -6.873338, 21.299639, -22.073904, -6.873338, 21.299639, -22.073904, -7.703304, 12.960274, -22.073904, -7.2123933, 13.119982, -22.182995, -7.11552, 12.960274, -22.439577, -7.146065, 17.195192, -22.073904, -6.783447, 17.195192, -22.165104, -6.539082, 16.136572, -22.073904, -6.5465007, 17.195192, -22.073904, -6.783447, 18.221523, -22.073904, -6.6224284, 17.195192, -22.165104, -6.539082, 17.195192, -22.073904, -6.783447, 21.299639, -22.073904, -6.873338, 18.221523, -22.073904, -6.6224284, 17.195192, -22.073904, -6.783447, 21.299639, -22.073904, -7.703304, 21.299639, -22.073904, -6.873338, 21.299639, -22.073904, -7.703304, 17.195192, -22.073904, -6.783447, 17.195192, -22.073904, -7.5178485, 16.136572, -22.073904, -6.5465007, 17.195192, -22.073904, -7.5178485, 17.195192, -22.073904, -6.783447, 17.195192, -22.073904, -7.5178485, 12.960274, -22.073904, -7.2123933, 12.960274, -22.073904, -7.703304, 17.195192, -22.073904, -7.5178485, 13.688129, -22.073904, -7.112902, 12.960274, -22.073904, -7.2123933, 16.136572, -22.073904, -6.5465007, 13.688129, -22.073904, -7.112902, 17.195192, -22.073904, -7.5178485, 13.119982, -22.182995, -7.11552, 12.960274, -22.073904, -7.2123933, 13.688129, -22.073904, -7.112902, 12.960274, -22.073904, -6.9366107, 13.119982, -22.182995, -7.11552, 13.688129, -22.073904, -7.112902, 13.688129, -22.073904, -7.112902, 16.136572, -22.073904, -6.5465007, 12.960274, -22.073904, -6.9366107, 12.960274, -22.073904, -6.9366107, 16.136572, -22.073904, -6.5465007, 12.960274, -22.073904, -6.570064, 12.960274, -22.439577, -7.703304, 12.960274, -22.073904, -7.2123933, 12.960274, -22.439577, -7.146065, 12.960274, -22.439577, -7.703304, 12.960274, -22.073904, -7.703304, 12.960274, -22.073904, -7.2123933, 12.960274, -22.073904, -6.9366107, 12.960274, -22.439577, -6.570064, 12.960274, -22.439577, -7.146065, 12.960274, -22.073904, -6.9366107, 12.960274, -22.073904, -6.570064, 12.960274, -22.439577, -6.570064, 13.119982, -22.182995, -7.11552, 12.960274, -22.073904, -6.9366107, 12.960274, -22.439577, -7.146065, 12.960274, -22.073904, -6.570064, 17.195192, -22.439577, -6.539082, 12.960274, -22.439577, -6.570064, 17.195192, -22.439577, -6.539082, 12.960274, -22.073904, -6.570064, 16.136572, -22.073904, -6.5465007, 17.195192, -22.439577, -6.539082, 16.136572, -22.073904, -6.5465007, 17.195192, -22.165104, -6.539082, 17.195192, -22.165104, -6.539082, 21.299639, -22.439577, -6.873338, 17.195192, -22.439577, -6.539082, 17.195192, -22.165104, -6.539082, 21.299639, -22.073904, -6.873338, 21.299639, -22.439577, -6.873338, 21.299639, -22.073904, -6.873338, 17.195192, -22.165104, -6.539082, 18.221523, -22.073904, -6.6224284, 14.394604, -22.439577, -15.51292, 21.493383, -22.073904, -15.67263, 14.394604, -22.073904, -15.51292, 14.394604, -22.439577, -15.51292, 21.493383, -22.439577, -15.67263, 21.493383, -22.073904, -15.67263, 12.76609, -22.073904, -15.519905, 14.394604, -22.439577, -15.51292, 14.394604, -22.073904, -15.51292, 12.76609, -22.073904, -15.519905, 12.76609, -22.439577, -15.519905, 14.394604, -22.439577, -15.51292, 14.394604, -22.439577, -14.504482, 21.493383, -22.439577, -15.67263, 14.394604, -22.439577, -15.51292, 14.394604, -22.439577, -14.504482, 21.493383, -22.439577, -14.689938, 21.493383, -22.439577, -15.67263, 12.76609, -22.439577, -15.519905, 14.394604, -22.439577, -14.504482, 14.394604, -22.439577, -15.51292, 12.76609, -22.439577, -15.519905, 12.76609, -22.439577, -14.689938, 14.394604, -22.439577, -14.504482, 12.76609, -22.439577, -15.519905, 12.76609, -22.073904, -14.689938, 12.76609, -22.439577, -14.689938, 12.76609, -22.439577, -15.519905, 12.76609, -22.073904, -15.519905, 12.76609, -22.073904, -14.689938, 14.394604, -22.073904, -14.756702, 14.394604, -22.165104, -14.504482, 13.987476, -22.073904, -14.550737, 14.394604, -22.073904, -14.756702, 16.1693, -22.073904, -14.550737, 14.394604, -22.165104, -14.504482, 14.394604, -22.073904, -14.756702, 20.162472, -22.073904, -14.655029, 16.1693, -22.073904, -14.550737, 13.987476, -22.073904, -14.550737, 14.394604, -22.073904, -15.51292, 14.394604, -22.073904, -14.756702, 13.987476, -22.073904, -14.550737, 12.76609, -22.073904, -15.519905, 14.394604, -22.073904, -15.51292, 12.76609, -22.073904, -15.519905, 13.987476, -22.073904, -14.550737, 12.76609, -22.073904, -14.689938, 21.493383, -22.073904, -15.67263, 14.394604, -22.073904, -14.756702, 14.394604, -22.073904, -15.51292, 14.394604, -22.073904, -14.756702, 21.493383, -22.073904, -15.67263, 20.162472, -22.073904, -14.655029, 20.162472, -22.073904, -14.655029, 21.493383, -22.073904, -15.67263, 21.493383, -22.073904, -14.935175, 20.162472, -22.073904, -14.655029, 21.493383, -22.073904, -14.935175, 21.493383, -22.165104, -14.689938, 12.76609, -22.073904, -14.689938, 14.394604, -22.439577, -14.504482, 12.76609, -22.439577, -14.689938, 14.394604, -22.439577, -14.504482, 12.76609, -22.073904, -14.689938, 13.987476, -22.073904, -14.550737, 14.394604, -22.439577, -14.504482, 13.987476, -22.073904, -14.550737, 14.394604, -22.165104, -14.504482, 14.394604, -22.165104, -14.504482, 21.493383, -22.439577, -14.689938, 14.394604, -22.439577, -14.504482, 14.394604, -22.165104, -14.504482, 20.162472, -22.073904, -14.655029, 21.493383, -22.439577, -14.689938, 21.493383, -22.439577, -14.689938, 20.162472, -22.073904, -14.655029, 21.493383, -22.165104, -14.689938, 20.162472, -22.073904, -14.655029, 14.394604, -22.165104, -14.504482, 16.1693, -22.073904, -14.550737, 21.493383, -22.165104, -14.689938, 21.493383, -22.439577, -15.67263, 21.493383, -22.439577, -14.689938, 21.493383, -22.439577, -15.67263, 21.493383, -22.165104, -14.689938, 21.493383, -22.073904, -14.935175, 21.493383, -22.439577, -15.67263, 21.493383, -22.073904, -14.935175, 21.493383, -22.073904, -15.67263, 14.33395, -22.439577, -8.868834, 21.590258, -22.073904, -9.028543, 14.33395, -22.073904, -8.868834, 14.33395, -22.439577, -8.868834, 21.590258, -22.439577, -9.028543, 21.590258, -22.073904, -9.028543, 12.669218, -22.073904, -8.875814, 14.33395, -22.439577, -8.868834, 14.33395, -22.073904, -8.868834, 12.669218, -22.073904, -8.875814, 12.669218, -22.439577, -8.875814, 14.33395, -22.439577, -8.868834, 14.33395, -22.439577, -7.860395, 21.590258, -22.439577, -9.028543, 14.33395, -22.439577, -8.868834, 14.33395, -22.439577, -7.860395, 21.590258, -22.439577, -8.045849, 21.590258, -22.439577, -9.028543, 12.669218, -22.439577, -8.875814, 14.33395, -22.439577, -7.860395, 14.33395, -22.439577, -8.868834, 12.669218, -22.439577, -8.875814, 12.669218, -22.439577, -8.045849, 14.33395, -22.439577, -7.860395, 12.669218, -22.439577, -8.875814, 12.669218, -22.073904, -8.045849, 12.669218, -22.439577, -8.045849, 12.669218, -22.439577, -8.875814, 12.669218, -22.073904, -8.875814, 12.669218, -22.073904, -8.045849, 14.33395, -22.073904, -8.112614, 14.33395, -22.165104, -7.860395, 13.917658, -22.073904, -7.906649, 14.33395, -22.073904, -8.112614, 16.147917, -22.073904, -7.906649, 14.33395, -22.165104, -7.860395, 14.33395, -22.073904, -8.112614, 20.229671, -22.073904, -8.011377, 16.147917, -22.073904, -7.906649, 13.917658, -22.073904, -7.906649, 14.33395, -22.073904, -8.868834, 14.33395, -22.073904, -8.112614, 13.917658, -22.073904, -7.906649, 12.669218, -22.073904, -8.875814, 14.33395, -22.073904, -8.868834, 12.669218, -22.073904, -8.875814, 13.917658, -22.073904, -7.906649, 12.669218, -22.073904, -8.045849, 21.590258, -22.073904, -9.028543, 14.33395, -22.073904, -8.112614, 14.33395, -22.073904, -8.868834, 14.33395, -22.073904, -8.112614, 21.590258, -22.073904, -9.028543, 20.229671, -22.073904, -8.011377, 20.229671, -22.073904, -8.011377, 21.590258, -22.073904, -9.028543, 21.590258, -22.073904, -8.29196, 20.229671, -22.073904, -8.011377, 21.590258, -22.073904, -8.29196, 21.590258, -22.165104, -8.045849, 12.669218, -22.073904, -8.045849, 14.33395, -22.439577, -7.860395, 12.669218, -22.439577, -8.045849, 14.33395, -22.439577, -7.860395, 12.669218, -22.073904, -8.045849, 13.917658, -22.073904, -7.906649, 14.33395, -22.439577, -7.860395, 13.917658, -22.073904, -7.906649, 14.33395, -22.165104, -7.860395, 14.33395, -22.165104, -7.860395, 21.590258, -22.439577, -8.045849, 14.33395, -22.439577, -7.860395, 14.33395, -22.165104, -7.860395, 20.229671, -22.073904, -8.011377, 21.590258, -22.439577, -8.045849, 21.590258, -22.439577, -8.045849, 20.229671, -22.073904, -8.011377, 21.590258, -22.165104, -8.045849, 20.229671, -22.073904, -8.011377, 14.33395, -22.165104, -7.860395, 16.147917, -22.073904, -7.906649, 21.590258, -22.165104, -8.045849, 21.590258, -22.439577, -9.028543, 21.590258, -22.439577, -8.045849, 21.590258, -22.439577, -9.028543, 21.590258, -22.165104, -8.045849, 21.590258, -22.073904, -8.29196, 21.590258, -22.439577, -9.028543, 21.590258, -22.073904, -8.29196, 21.590258, -22.073904, -9.028543, 20.608437, -25.90344, 5.6272016, 21.338474, -21.174994, 5.6272016, 21.338474, -25.90344, 5.6272016, 20.608437, -25.90344, 5.6272016, 20.608437, -21.723503, 5.6272016, 21.338474, -21.174994, 5.6272016, 20.608437, -21.723503, 5.6272016, 21.338474, -21.174994, 4.8975997, 21.338474, -21.174994, 5.6272016, 20.608437, -21.723503, 5.6272016, 20.608437, -21.174994, 4.8975997, 21.338474, -21.174994, 4.8975997, 20.608437, -21.174994, 4.8975997, 21.338474, -25.90344, 4.8975997, 21.338474, -21.174994, 4.8975997, 20.608437, -21.174994, 4.8975997, 20.608437, -25.90344, 4.8975997, 21.338474, -25.90344, 4.8975997, 20.608437, -25.90344, 4.8975997, 21.338474, -25.90344, 5.6272016, 21.338474, -25.90344, 4.8975997, 20.608437, -25.90344, 4.8975997, 20.608437, -25.90344, 5.6272016, 21.338474, -25.90344, 5.6272016, 21.338474, -25.90344, 5.6272016, 21.338474, -21.174994, 4.8975997, 21.338474, -25.90344, 4.8975997, 21.338474, -25.90344, 5.6272016, 21.338474, -21.174994, 5.6272016, 21.338474, -21.174994, 4.8975997, 20.608437, -25.90344, 4.8975997, 20.608437, -21.723503, 5.6272016, 20.608437, -25.90344, 5.6272016, 20.608437, -25.90344, 4.8975997, 20.608437, -21.174994, 4.8975997, 20.608437, -21.723503, 5.6272016, 20.752874, -22.635942, 4.8980365, 20.984583, -22.543432, 4.8980365, 20.984583, -22.635942, 4.8980365, 20.752874, -22.635942, 4.8980365, 20.752874, -22.543432, 4.8980365, 20.984583, -22.543432, 4.8980365, 20.752874, -22.543432, 4.8980365, 20.984583, -22.543432, -19.742168, 20.984583, -22.543432, 4.8980365, 20.752874, -22.543432, 4.8980365, 20.752874, -22.543432, -19.742168, 20.984583, -22.543432, -19.742168, 20.752874, -22.543432, -19.742168, 20.984583, -22.635942, -19.742168, 20.984583, -22.543432, -19.742168, 20.752874, -22.543432, -19.742168, 20.752874, -22.635942, -19.742168, 20.984583, -22.635942, -19.742168, 20.752874, -22.635942, -19.742168, 20.984583, -22.635942, 4.8980365, 20.984583, -22.635942, -19.742168, 20.752874, -22.635942, -19.742168, 20.752874, -22.635942, 4.8980365, 20.984583, -22.635942, 4.8980365, 20.984583, -22.635942, 4.8980365, 20.984583, -22.543432, -19.742168, 20.984583, -22.635942, -19.742168, 20.984583, -22.635942, 4.8980365, 20.984583, -22.543432, 4.8980365, 20.984583, -22.543432, -19.742168, 20.752874, -22.635942, -19.742168, 20.752874, -22.543432, 4.8980365, 20.752874, -22.635942, 4.8980365, 20.752874, -22.635942, -19.742168, 20.752874, -22.543432, -19.742168, 20.752874, -22.543432, 4.8980365, 12.886963, -25.348385, -5.927299, 13.6170025, -20.619938, -5.927299, 13.6170025, -25.348385, -5.927299, 12.886963, -25.348385, -5.927299, 12.886963, -20.619938, -5.927299, 13.6170025, -20.619938, -5.927299, 12.886963, -25.348385, -6.6573377, 13.6170025, -25.348385, -5.927299, 13.6170025, -25.348385, -6.6573377, 12.886963, -25.348385, -6.6573377, 12.886963, -25.348385, -5.927299, 13.6170025, -25.348385, -5.927299, 13.6170025, -25.348385, -5.927299, 13.6170025, -20.619938, -6.6573377, 13.6170025, -25.348385, -6.6573377, 13.6170025, -25.348385, -5.927299, 13.6170025, -20.619938, -5.927299, 13.6170025, -20.619938, -6.6573377, 12.886963, -21.80205, -6.6573377, 13.069365, -20.619938, -6.6573377, 12.886963, -20.619938, -6.474937, 12.886963, -25.348385, -5.927299, 12.886963, -21.80205, -6.6573377, 12.886963, -20.619938, -6.474937, 12.886963, -21.80205, -6.6573377, 12.886963, -25.348385, -5.927299, 12.886963, -25.348385, -6.6573377, 12.886963, -25.348385, -5.927299, 12.886963, -20.619938, -6.474937, 12.886963, -20.619938, -5.927299, 12.886963, -20.619938, -6.474937, 13.6170025, -20.619938, -5.927299, 12.886963, -20.619938, -5.927299, 13.6170025, -20.619938, -5.927299, 12.886963, -20.619938, -6.474937, 13.069365, -20.619938, -6.6573377, 13.6170025, -20.619938, -5.927299, 13.069365, -20.619938, -6.6573377, 13.6170025, -20.619938, -6.6573377, 12.886963, -25.348385, -6.6573377, 13.069365, -20.619938, -6.6573377, 12.886963, -21.80205, -6.6573377, 13.069365, -20.619938, -6.6573377, 12.886963, -25.348385, -6.6573377, 13.6170025, -25.348385, -6.6573377, 13.069365, -20.619938, -6.6573377, 13.6170025, -25.348385, -6.6573377, 13.6170025, -20.619938, -6.6573377, 12.886963, -26.235077, -13.537062, 13.6170025, -21.50663, -13.537062, 13.6170025, -26.235077, -13.537062, 12.886963, -26.235077, -13.537062, 12.886963, -21.50663, -13.537062, 13.6170025, -21.50663, -13.537062, 12.886963, -26.235077, -14.2666645, 13.6170025, -26.235077, -13.537062, 13.6170025, -26.235077, -14.2666645, 12.886963, -26.235077, -14.2666645, 12.886963, -26.235077, -13.537062, 13.6170025, -26.235077, -13.537062, 13.6170025, -26.235077, -13.537062, 13.6170025, -21.50663, -14.2666645, 13.6170025, -26.235077, -14.2666645, 13.6170025, -26.235077, -13.537062, 13.6170025, -21.50663, -13.537062, 13.6170025, -21.50663, -14.2666645, 12.886963, -22.688742, -14.2666645, 13.069365, -21.50663, -14.2666645, 12.886963, -21.50663, -14.084265, 12.886963, -26.235077, -13.537062, 12.886963, -22.688742, -14.2666645, 12.886963, -21.50663, -14.084265, 12.886963, -22.688742, -14.2666645, 12.886963, -26.235077, -13.537062, 12.886963, -26.235077, -14.2666645, 12.886963, -26.235077, -13.537062, 12.886963, -21.50663, -14.084265, 12.886963, -21.50663, -13.537062, 12.886963, -21.50663, -14.084265, 13.6170025, -21.50663, -13.537062, 12.886963, -21.50663, -13.537062, 13.6170025, -21.50663, -13.537062, 12.886963, -21.50663, -14.084265, 13.069365, -21.50663, -14.2666645, 13.6170025, -21.50663, -13.537062, 13.069365, -21.50663, -14.2666645, 13.6170025, -21.50663, -14.2666645, 12.886963, -26.235077, -14.2666645, 13.069365, -21.50663, -14.2666645, 12.886963, -22.688742, -14.2666645, 13.069365, -21.50663, -14.2666645, 12.886963, -26.235077, -14.2666645, 13.6170025, -26.235077, -14.2666645, 13.069365, -21.50663, -14.2666645, 13.6170025, -26.235077, -14.2666645, 13.6170025, -21.50663, -14.2666645, 21.21673, -25.99464, -5.8286805, 21.946331, -21.266193, -5.8286805, 21.946331, -25.99464, -5.8286805, 21.21673, -25.99464, -5.8286805, 21.21673, -21.266193, -5.8286805, 21.946331, -21.266193, -5.8286805, 21.21673, -25.99464, -6.558719, 21.946331, -25.99464, -5.8286805, 21.946331, -25.99464, -6.558719, 21.21673, -25.99464, -6.558719, 21.21673, -25.99464, -5.8286805, 21.946331, -25.99464, -5.8286805, 21.946331, -25.99464, -5.8286805, 21.946331, -21.266193, -6.558719, 21.946331, -25.99464, -6.558719, 21.946331, -25.99464, -5.8286805, 21.946331, -21.266193, -5.8286805, 21.946331, -21.266193, -6.558719, 21.21673, -22.448305, -6.558719, 21.39913, -21.266193, -6.558719, 21.21673, -21.266193, -6.3763185, 21.21673, -25.99464, -5.8286805, 21.21673, -22.448305, -6.558719, 21.21673, -21.266193, -6.3763185, 21.21673, -22.448305, -6.558719, 21.21673, -25.99464, -5.8286805, 21.21673, -25.99464, -6.558719, 21.21673, -25.99464, -5.8286805, 21.21673, -21.266193, -6.3763185, 21.21673, -21.266193, -5.8286805, 21.21673, -21.266193, -6.3763185, 21.946331, -21.266193, -5.8286805, 21.21673, -21.266193, -5.8286805, 21.946331, -21.266193, -5.8286805, 21.21673, -21.266193, -6.3763185, 21.39913, -21.266193, -6.558719, 21.946331, -21.266193, -5.8286805, 21.39913, -21.266193, -6.558719, 21.946331, -21.266193, -6.558719, 21.21673, -25.99464, -6.558719, 21.39913, -21.266193, -6.558719, 21.21673, -22.448305, -6.558719, 21.39913, -21.266193, -6.558719, 21.21673, -25.99464, -6.558719, 21.946331, -25.99464, -6.558719, 21.39913, -21.266193, -6.558719, 21.946331, -25.99464, -6.558719, 21.946331, -21.266193, -6.558719, 21.21673, -25.99464, -13.537062, 21.946331, -21.266193, -13.537062, 21.946331, -25.99464, -13.537062, 21.21673, -25.99464, -13.537062, 21.21673, -21.266193, -13.537062, 21.946331, -21.266193, -13.537062, 21.21673, -25.99464, -14.2666645, 21.946331, -25.99464, -13.537062, 21.946331, -25.99464, -14.2666645, 21.21673, -25.99464, -14.2666645, 21.21673, -25.99464, -13.537062, 21.946331, -25.99464, -13.537062, 21.946331, -25.99464, -13.537062, 21.946331, -21.266193, -14.2666645, 21.946331, -25.99464, -14.2666645, 21.946331, -25.99464, -13.537062, 21.946331, -21.266193, -13.537062, 21.946331, -21.266193, -14.2666645, 21.21673, -22.448305, -14.2666645, 21.39913, -21.266193, -14.2666645, 21.21673, -21.266193, -14.084265, 21.21673, -25.99464, -13.537062, 21.21673, -22.448305, -14.2666645, 21.21673, -21.266193, -14.084265, 21.21673, -22.448305, -14.2666645, 21.21673, -25.99464, -13.537062, 21.21673, -25.99464, -14.2666645, 21.21673, -25.99464, -13.537062, 21.21673, -21.266193, -14.084265, 21.21673, -21.266193, -13.537062, 21.21673, -21.266193, -14.084265, 21.946331, -21.266193, -13.537062, 21.21673, -21.266193, -13.537062, 21.946331, -21.266193, -13.537062, 21.21673, -21.266193, -14.084265, 21.39913, -21.266193, -14.2666645, 21.946331, -21.266193, -13.537062, 21.39913, -21.266193, -14.2666645, 21.946331, -21.266193, -14.2666645, 21.21673, -25.99464, -14.2666645, 21.39913, -21.266193, -14.2666645, 21.21673, -22.448305, -14.2666645, 21.39913, -21.266193, -14.2666645, 21.21673, -25.99464, -14.2666645, 21.946331, -25.99464, -14.2666645, 21.39913, -21.266193, -14.2666645, 21.946331, -25.99464, -14.2666645, 21.946331, -21.266193, -14.2666645, -13.073534, -0.35833585, 29.034882, -8.669889, -0.18640822, 28.876835, -13.057354, 0.007337749, 29.029753, -13.073534, -0.35833585, 29.034882, -8.686073, -0.5516454, 28.882399, -8.669889, -0.18640822, 28.876835, -17.582396, 0.2010836, 28.810827, -13.073534, -0.35833585, 29.034882, -13.057354, 0.007337749, 29.029753, -17.582396, 0.2010836, 28.810827, -17.59858, -0.16415358, 28.816393, -13.073534, -0.35833585, 29.034882, -13.080118, -0.3434996, 30.014496, -8.686073, -0.5516454, 28.882399, -13.073534, -0.35833585, 29.034882, -13.080118, -0.3434996, 30.014496, -8.69165, -0.538991, 29.712345, -8.686073, -0.5516454, 28.882399, -13.073534, -0.35833585, 29.034882, -17.606195, -0.1471355, 29.949606, -13.080118, -0.3434996, 30.014496, -13.073534, -0.35833585, 29.034882, -17.602324, -0.15586269, 29.373617, -17.606195, -0.1471355, 29.949606, -17.602324, -0.15586269, 29.373617, -13.073534, -0.35833585, 29.034882, -17.59858, -0.16415358, 28.816393, -8.69165, -0.538991, 29.712345, -8.669889, -0.18640822, 28.876835, -8.686073, -0.5516454, 28.882399, -8.69165, -0.538991, 29.712345, -8.675467, -0.17375374, 29.706781, -8.669889, -0.18640822, 28.876835, -17.585695, 0.20850176, 29.301727, -17.420107, 0.093301594, 29.40146, -17.602324, -0.15586269, 29.373617, -13.06229, 0.01824683, 29.764137, -13.067871, -0.06946254, 30.010216, -14.195347, 0.07104677, 29.993038, -13.06229, 0.01824683, 29.764137, -11.966818, -0.027135193, 29.933395, -13.067871, -0.06946254, 30.010216, -13.06229, 0.01824683, 29.764137, -8.675467, -0.17375374, 29.706781, -11.966818, -0.027135193, 29.933395, -13.06229, 0.01824683, 29.764137, -8.669889, -0.18640822, 28.876835, -8.675467, -0.17375374, 29.706781, -8.669889, -0.18640822, 28.876835, -13.06229, 0.01824683, 29.764137, -13.057354, 0.007337749, 29.029753, -14.195347, 0.07104677, 29.993038, -13.057354, 0.007337749, 29.029753, -13.06229, 0.01824683, 29.764137, -13.057354, 0.007337749, 29.029753, -17.585695, 0.20850176, 29.301727, -17.582396, 0.2010836, 28.810827, -13.057354, 0.007337749, 29.029753, -16.80835, 0.17621082, 29.407318, -17.585695, 0.20850176, 29.301727, -14.195347, 0.07104677, 29.993038, -16.80835, 0.17621082, 29.407318, -13.057354, 0.007337749, 29.029753, -17.420107, 0.093301594, 29.40146, -17.585695, 0.20850176, 29.301727, -16.80835, 0.17621082, 29.407318, -17.587553, 0.21286553, 29.57794, -17.420107, 0.093301594, 29.40146, -16.80835, 0.17621082, 29.407318, -16.80835, 0.17621082, 29.407318, -14.195347, 0.07104677, 29.993038, -17.587553, 0.21286553, 29.57794, -17.587553, 0.21286553, 29.57794, -14.195347, 0.07104677, 29.993038, -17.590448, 0.21810168, 29.944038, -17.59858, -0.16415358, 28.816393, -17.585695, 0.20850176, 29.301727, -17.602324, -0.15586269, 29.373617, -17.59858, -0.16415358, 28.816393, -17.582396, 0.2010836, 28.810827, -17.585695, 0.20850176, 29.301727, -17.587553, 0.21286553, 29.57794, -17.606195, -0.1471355, 29.949606, -17.602324, -0.15586269, 29.373617, -17.587553, 0.21286553, 29.57794, -17.590448, 0.21810168, 29.944038, -17.606195, -0.1471355, 29.949606, -17.420107, 0.093301594, 29.40146, -17.587553, 0.21286553, 29.57794, -17.602324, -0.15586269, 29.373617, -17.590448, 0.21810168, 29.944038, -13.080118, -0.3434996, 30.014496, -17.606195, -0.1471355, 29.949606, -13.080118, -0.3434996, 30.014496, -17.590448, 0.21810168, 29.944038, -13.067871, -0.06946254, 30.010216, -13.067871, -0.06946254, 30.010216, -17.590448, 0.21810168, 29.944038, -14.195347, 0.07104677, 29.993038, -13.067871, -0.06946254, 30.010216, -8.675467, -0.17375374, 29.706781, -13.080118, -0.3434996, 30.014496, -13.080118, -0.3434996, 30.014496, -8.675467, -0.17375374, 29.706781, -8.69165, -0.538991, 29.712345, -8.675467, -0.17375374, 29.706781, -13.067871, -0.06946254, 30.010216, -11.966818, -0.027135193, 29.933395, -9.878, -0.097390115, 31.312849, -8.993242, -0.5014638, 31.344105, -9.893747, -0.4626273, 31.318417, -9.878, -0.097390115, 31.312849, -8.977062, -0.13622653, 31.338978, -8.993242, -0.5014638, 31.344105, -9.893747, -0.4626273, 31.318417, -17.31272, 0.1343196, 31.278593, -9.878, -0.097390115, 31.312849, -9.878, -0.097390115, 31.312849, -17.31272, 0.1343196, 31.278593, -15.451195, 0.14479238, 31.285868, -17.31272, 0.1343196, 31.278593, -9.893747, -0.4626273, 31.318417, -17.324528, -0.13971746, 31.28244, -8.970457, -0.15106285, 30.356306, -9.878, -0.097390115, 31.312849, -9.871372, -0.11222637, 30.326687, -15.451195, 0.14479238, 31.285868, -9.871372, -0.11222637, 30.326687, -9.878, -0.097390115, 31.312849, -15.451195, 0.14479238, 31.285868, -17.303205, 0.21330172, 30.447365, -9.871372, -0.11222637, 30.326687, -17.303205, 0.21330172, 30.447365, -15.451195, 0.14479238, 31.285868, -17.307388, 0.22246522, 31.069607, -17.307388, 0.22246522, 31.069607, -15.451195, 0.14479238, 31.285868, -17.31272, 0.1343196, 31.278593, -9.878, -0.097390115, 31.312849, -8.970457, -0.15106285, 30.356306, -9.454359, -0.122262776, 30.87016, -9.454359, -0.122262776, 30.87016, -8.970457, -0.15106285, 30.356306, -8.973118, -0.14495373, 30.75208, -8.973118, -0.14495373, 30.75208, -9.062445, -0.27935404, 30.862755, -9.454359, -0.122262776, 30.87016, -9.062445, -0.27935404, 30.862755, -8.974958, -0.14102644, 31.026112, -9.454359, -0.122262776, 30.87016, -9.878, -0.097390115, 31.312849, -9.454359, -0.122262776, 30.87016, -8.974958, -0.14102644, 31.026112, -9.878, -0.097390115, 31.312849, -8.974958, -0.14102644, 31.026112, -8.977062, -0.13622653, 31.338978, -9.8871155, -0.47789997, 30.331818, -8.970457, -0.15106285, 30.356306, -9.871372, -0.11222637, 30.326687, -9.8871155, -0.47789997, 30.331818, -8.986637, -0.5163001, 30.361433, -8.970457, -0.15106285, 30.356306, -17.303205, 0.21330172, 30.447365, -9.8871155, -0.47789997, 30.331818, -9.871372, -0.11222637, 30.326687, -17.303205, 0.21330172, 30.447365, -17.318953, -0.15193558, 30.45293, -9.8871155, -0.47789997, 30.331818, -8.993242, -0.5014638, 31.344105, -9.8871155, -0.47789997, 30.331818, -9.893747, -0.4626273, 31.318417, -9.8871155, -0.47789997, 30.331818, -8.993242, -0.5014638, 31.344105, -8.989674, -0.50975466, 30.81306, -9.8871155, -0.47789997, 30.331818, -8.989674, -0.50975466, 30.81306, -8.986637, -0.5163001, 30.361433, -17.318953, -0.15193558, 30.45293, -9.893747, -0.4626273, 31.318417, -9.8871155, -0.47789997, 30.331818, -17.318953, -0.15193558, 30.45293, -17.324528, -0.13971746, 31.28244, -9.893747, -0.4626273, 31.318417, -8.974958, -0.14102644, 31.026112, -9.062445, -0.27935404, 30.862755, -8.989674, -0.50975466, 30.81306, -9.062445, -0.27935404, 30.862755, -8.973118, -0.14495373, 30.75208, -8.989674, -0.50975466, 30.81306, -8.993242, -0.5014638, 31.344105, -8.974958, -0.14102644, 31.026112, -8.989674, -0.50975466, 30.81306, -8.993242, -0.5014638, 31.344105, -8.977062, -0.13622653, 31.338978, -8.974958, -0.14102644, 31.026112, -8.973118, -0.14495373, 30.75208, -8.986637, -0.5163001, 30.361433, -8.989674, -0.50975466, 30.81306, -8.973118, -0.14495373, 30.75208, -8.970457, -0.15106285, 30.356306, -8.986637, -0.5163001, 30.361433, -17.303205, 0.21330172, 30.447365, -17.324528, -0.13971746, 31.28244, -17.318953, -0.15193558, 30.45293, -17.324528, -0.13971746, 31.28244, -17.303205, 0.21330172, 30.447365, -17.31272, 0.1343196, 31.278593, -17.31272, 0.1343196, 31.278593, -17.303205, 0.21330172, 30.447365, -17.307388, 0.22246522, 31.069607, -13.105944, -0.29549986, 33.143127, -8.988548, -0.111353934, 32.98316, -13.089764, 0.069737375, 33.138, -13.105944, -0.29549986, 33.143127, -9.004295, -0.47659117, 32.988728, -8.988548, -0.111353934, 32.98316, -17.31983, 0.25082868, 32.92106, -13.105944, -0.29549986, 33.143127, -13.089764, 0.069737375, 33.138, -17.31983, 0.25082868, 32.92106, -17.335577, -0.11440843, 32.926624, -13.105944, -0.29549986, 33.143127, -13.112524, -0.2806636, 34.12231, -9.004295, -0.47659117, 32.988728, -13.105944, -0.29549986, 33.143127, -13.112524, -0.2806636, 34.12231, -9.009869, -0.4639367, 33.818237, -9.004295, -0.47659117, 32.988728, -13.105944, -0.29549986, 33.143127, -17.343197, -0.09739047, 34.060276, -13.112524, -0.2806636, 34.12231, -13.105944, -0.29549986, 33.143127, -17.339323, -0.10611755, 33.483852, -17.343197, -0.09739047, 34.060276, -17.339323, -0.10611755, 33.483852, -13.105944, -0.29549986, 33.143127, -17.335577, -0.11440843, 32.926624, -9.009869, -0.4639367, 33.818237, -8.988548, -0.111353934, 32.98316, -9.004295, -0.47659117, 32.988728, -9.009869, -0.4639367, 33.818237, -8.994122, -0.09869945, 33.812668, -8.988548, -0.111353934, 32.98316, -17.323126, 0.25824696, 33.411522, -17.16845, 0.14348298, 33.51162, -17.339323, -0.10611755, 33.483852, -13.0947, 0.080646336, 33.872387, -13.100277, -0.0066265464, 34.118027, -14.154011, 0.1303919, 34.101345, -13.0947, 0.080646336, 33.872387, -12.070787, 0.038755357, 34.040726, -13.100277, -0.0066265464, 34.118027, -13.0947, 0.080646336, 33.872387, -8.994122, -0.09869945, 33.812668, -12.070787, 0.038755357, 34.040726, -13.0947, 0.080646336, 33.872387, -8.988548, -0.111353934, 32.98316, -8.994122, -0.09869945, 33.812668, -8.988548, -0.111353934, 32.98316, -13.0947, 0.080646336, 33.872387, -13.089764, 0.069737375, 33.138, -14.154011, 0.1303919, 34.101345, -13.089764, 0.069737375, 33.138, -13.0947, 0.080646336, 33.872387, -13.089764, 0.069737375, 33.138, -17.323126, 0.25824696, 33.411522, -17.31983, 0.25082868, 32.92106, -13.089764, 0.069737375, 33.138, -16.596401, 0.22813767, 33.51721, -17.323126, 0.25824696, 33.411522, -14.154011, 0.1303919, 34.101345, -16.596401, 0.22813767, 33.51721, -13.089764, 0.069737375, 33.138, -17.16845, 0.14348298, 33.51162, -17.323126, 0.25824696, 33.411522, -16.596401, 0.22813767, 33.51721, -17.324986, 0.2621742, 33.68817, -17.16845, 0.14348298, 33.51162, -16.596401, 0.22813767, 33.51721, -16.596401, 0.22813767, 33.51721, -14.154011, 0.1303919, 34.101345, -17.324986, 0.2621742, 33.68817, -17.324986, 0.2621742, 33.68817, -14.154011, 0.1303919, 34.101345, -17.32745, 0.26784688, 34.05471, -17.335577, -0.11440843, 32.926624, -17.323126, 0.25824696, 33.411522, -17.339323, -0.10611755, 33.483852, -17.335577, -0.11440843, 32.926624, -17.31983, 0.25082868, 32.92106, -17.323126, 0.25824696, 33.411522, -17.324986, 0.2621742, 33.68817, -17.343197, -0.09739047, 34.060276, -17.339323, -0.10611755, 33.483852, -17.324986, 0.2621742, 33.68817, -17.32745, 0.26784688, 34.05471, -17.343197, -0.09739047, 34.060276, -17.16845, 0.14348298, 33.51162, -17.324986, 0.2621742, 33.68817, -17.339323, -0.10611755, 33.483852, -17.32745, 0.26784688, 34.05471, -13.112524, -0.2806636, 34.12231, -17.343197, -0.09739047, 34.060276, -13.112524, -0.2806636, 34.12231, -17.32745, 0.26784688, 34.05471, -13.100277, -0.0066265464, 34.118027, -13.100277, -0.0066265464, 34.118027, -17.32745, 0.26784688, 34.05471, -14.154011, 0.1303919, 34.101345, -13.100277, -0.0066265464, 34.118027, -8.994122, -0.09869945, 33.812668, -13.112524, -0.2806636, 34.12231, -13.112524, -0.2806636, 34.12231, -8.994122, -0.09869945, 33.812668, -9.009869, -0.4639367, 33.818237, -8.994122, -0.09869945, 33.812668, -13.100277, -0.0066265464, 34.118027, -12.070787, 0.038755357, 34.040726, -15.954979, -0.19208127, 31.771221, -8.68903, -0.14408118, 31.659903, -15.939232, 0.17359239, 31.765654, -15.954979, -0.19208127, 31.771221, -8.704777, -0.50931835, 31.66547, -8.68903, -0.14408118, 31.659903, -17.602564, 0.24559253, 31.74662, -15.954979, -0.19208127, 31.771221, -15.939232, 0.17359239, 31.765654, -17.602564, 0.24559253, 31.74662, -17.61831, -0.11964476, 31.752188, -15.954979, -0.19208127, 31.771221, -15.961756, -0.1768086, 32.779636, -8.704777, -0.50931835, 31.66547, -15.954979, -0.19208127, 31.771221, -15.961756, -0.1768086, 32.779636, -8.71138, -0.49448207, 32.64814, -8.704777, -0.50931835, 31.66547, -17.61831, -0.11964476, 31.752188, -15.961756, -0.1768086, 32.779636, -15.954979, -0.19208127, 31.771221, -17.61831, -0.11964476, 31.752188, -17.623884, -0.10699028, 32.5817, -15.961756, -0.1768086, 32.779636, -17.61831, -0.11964476, 31.752188, -17.608137, 0.25824708, 32.57613, -17.623884, -0.10699028, 32.5817, -17.61831, -0.11964476, 31.752188, -17.602564, 0.24559253, 31.74662, -17.608137, 0.25824708, 32.57613, -15.944313, 0.18493778, 32.52186, -15.949944, 0.09722847, 32.775352, -16.361544, 0.20588332, 32.72502, -15.944313, 0.18493778, 32.52186, -14.133524, 0.109446704, 32.741302, -15.949944, 0.09722847, 32.775352, -15.944313, 0.18493778, 32.52186, -10.055107, -0.069462895, 32.667473, -14.133524, 0.109446704, 32.741302, -16.361544, 0.20588332, 32.72502, -15.939232, 0.17359239, 31.765654, -15.944313, 0.18493778, 32.52186, -16.361544, 0.20588332, 32.72502, -17.602564, 0.24559253, 31.74662, -15.939232, 0.17359239, 31.765654, -17.602564, 0.24559253, 31.74662, -16.361544, 0.20588332, 32.72502, -17.608137, 0.25824708, 32.57613, -8.68903, -0.14408118, 31.659903, -15.944313, 0.18493778, 32.52186, -15.939232, 0.17359239, 31.765654, -15.944313, 0.18493778, 32.52186, -8.68903, -0.14408118, 31.659903, -10.055107, -0.069462895, 32.667473, -10.055107, -0.069462895, 32.667473, -8.68903, -0.14408118, 31.659903, -8.693983, -0.13273573, 32.396904, -10.055107, -0.069462895, 32.667473, -8.693983, -0.13273573, 32.396904, -8.69957, -0.2204451, 32.643856, -17.608137, 0.25824708, 32.57613, -15.961756, -0.1768086, 32.779636, -17.623884, -0.10699028, 32.5817, -15.961756, -0.1768086, 32.779636, -17.608137, 0.25824708, 32.57613, -15.949944, 0.09722847, 32.775352, -15.949944, 0.09722847, 32.775352, -17.608137, 0.25824708, 32.57613, -16.361544, 0.20588332, 32.72502, -15.949944, 0.09722847, 32.775352, -8.69957, -0.2204451, 32.643856, -15.961756, -0.1768086, 32.779636, -15.961756, -0.1768086, 32.779636, -8.69957, -0.2204451, 32.643856, -8.71138, -0.49448207, 32.64814, -8.69957, -0.2204451, 32.643856, -15.949944, 0.09722847, 32.775352, -10.055107, -0.069462895, 32.667473, -10.055107, -0.069462895, 32.667473, -15.949944, 0.09722847, 32.775352, -14.133524, 0.109446704, 32.741302, -8.69957, -0.2204451, 32.643856, -8.704777, -0.50931835, 31.66547, -8.71138, -0.49448207, 32.64814, -8.704777, -0.50931835, 31.66547, -8.69957, -0.2204451, 32.643856, -8.68903, -0.14408118, 31.659903, -8.68903, -0.14408118, 31.659903, -8.69957, -0.2204451, 32.643856, -8.693983, -0.13273573, 32.396904, -13.166946, -0.5581908, 28.64937, -17.27211, -0.19208091, 28.80724, -13.166946, -0.19208091, 28.64937, -13.166946, -0.5581908, 28.64937, -17.27211, -0.5581909, 28.80724, -17.27211, -0.19208091, 28.80724, -8.932932, -0.19208091, 28.863285, -13.166946, -0.5581908, 28.64937, -13.166946, -0.19208091, 28.64937, -8.932932, -0.19208091, 28.863285, -8.932932, -0.5581909, 28.863285, -13.166946, -0.5581908, 28.64937, -13.160368, -0.5581907, 27.670628, -17.27211, -0.5581909, 28.80724, -13.166946, -0.5581908, 28.64937, -13.160368, -0.5581907, 27.670628, -17.266533, -0.5581908, 27.977295, -17.27211, -0.5581909, 28.80724, -13.166946, -0.5581908, 28.64937, -8.925314, -0.55819076, 27.729633, -13.160368, -0.5581907, 27.670628, -13.166946, -0.5581908, 28.64937, -8.929188, -0.5581908, 28.306059, -8.925314, -0.55819076, 27.729633, -8.929188, -0.5581908, 28.306059, -13.166946, -0.5581908, 28.64937, -8.932932, -0.5581909, 28.863285, -17.266533, -0.5581908, 27.977295, -17.27211, -0.19208091, 28.80724, -17.27211, -0.5581909, 28.80724, -17.266533, -0.5581908, 27.977295, -17.266533, -0.1920808, 27.977295, -17.27211, -0.19208091, 28.80724, -8.929636, -0.19208086, 28.372822, -9.089121, -0.30160832, 28.274002, -8.929188, -0.5581908, 28.306059, -13.16201, -0.1920808, 27.914986, -13.160368, -0.28371733, 27.670628, -12.101822, -0.1920808, 27.685158, -13.16201, -0.1920808, 27.914986, -14.1868, -0.1920808, 27.747076, -13.160368, -0.28371733, 27.670628, -13.16201, -0.1920808, 27.914986, -17.266533, -0.1920808, 27.977295, -14.1868, -0.1920808, 27.747076, -13.16201, -0.1920808, 27.914986, -17.27211, -0.19208091, 28.80724, -17.266533, -0.1920808, 27.977295, -17.27211, -0.19208091, 28.80724, -13.16201, -0.1920808, 27.914986, -13.166946, -0.19208091, 28.64937, -12.101822, -0.1920808, 27.685158, -13.166946, -0.19208091, 28.64937, -13.16201, -0.1920808, 27.914986, -13.166946, -0.19208091, 28.64937, -8.929636, -0.19208086, 28.372822, -8.932932, -0.19208091, 28.863285, -13.166946, -0.19208091, 28.64937, -9.656805, -0.19208086, 28.268005, -8.929636, -0.19208086, 28.372822, -12.101822, -0.1920808, 27.685158, -9.656805, -0.19208086, 28.268005, -13.166946, -0.19208091, 28.64937, -9.089121, -0.30160832, 28.274002, -8.929636, -0.19208086, 28.372822, -9.656805, -0.19208086, 28.268005, -8.92778, -0.19208086, 28.09661, -9.089121, -0.30160832, 28.274002, -9.656805, -0.19208086, 28.268005, -9.656805, -0.19208086, 28.268005, -12.101822, -0.1920808, 27.685158, -8.92778, -0.19208086, 28.09661, -8.92778, -0.19208086, 28.09661, -12.101822, -0.1920808, 27.685158, -8.925314, -0.1920808, 27.729633, -8.932932, -0.5581909, 28.863285, -8.929636, -0.19208086, 28.372822, -8.929188, -0.5581908, 28.306059, -8.932932, -0.5581909, 28.863285, -8.932932, -0.19208091, 28.863285, -8.929636, -0.19208086, 28.372822, -8.92778, -0.19208086, 28.09661, -8.925314, -0.55819076, 27.729633, -8.929188, -0.5581908, 28.306059, -8.92778, -0.19208086, 28.09661, -8.925314, -0.1920808, 27.729633, -8.925314, -0.55819076, 27.729633, -9.089121, -0.30160832, 28.274002, -8.92778, -0.19208086, 28.09661, -8.929188, -0.5581908, 28.306059, -8.925314, -0.1920808, 27.729633, -13.160368, -0.5581907, 27.670628, -8.925314, -0.55819076, 27.729633, -13.160368, -0.5581907, 27.670628, -8.925314, -0.1920808, 27.729633, -12.101822, -0.1920808, 27.685158, -13.160368, -0.5581907, 27.670628, -12.101822, -0.1920808, 27.685158, -13.160368, -0.28371733, 27.670628, -13.160368, -0.28371733, 27.670628, -17.266533, -0.5581908, 27.977295, -13.160368, -0.5581907, 27.670628, -13.160368, -0.28371733, 27.670628, -17.266533, -0.1920808, 27.977295, -17.266533, -0.5581908, 27.977295, -17.266533, -0.1920808, 27.977295, -13.160368, -0.28371733, 27.670628, -14.1868, -0.1920808, 27.747076, -16.346624, -0.1920805, 25.245663, -17.248005, -0.55819046, 25.220404, -16.346624, -0.55819046, 25.245663, -16.346624, -0.1920805, 25.245663, -17.248005, -0.1920805, 25.220404, -17.248005, -0.55819046, 25.220404, -16.346624, -0.55819046, 25.245663, -10.768602, -0.1920805, 25.26875, -16.346624, -0.1920805, 25.245663, -16.346624, -0.55819046, 25.245663, -8.908827, -0.28371704, 25.276447, -10.768602, -0.1920805, 25.26875, -8.908827, -0.28371704, 25.276447, -16.346624, -0.55819046, 25.245663, -8.908827, -0.55819046, 25.276447, -17.254608, -0.19208062, 26.203075, -16.346624, -0.1920805, 25.245663, -16.353252, -0.19208062, 26.231823, -10.768602, -0.1920805, 25.26875, -16.353252, -0.19208062, 26.231823, -16.346624, -0.1920805, 25.245663, -10.768602, -0.1920805, 25.26875, -8.914402, -0.19208062, 26.105959, -16.353252, -0.19208062, 26.231823, -8.914402, -0.19208062, 26.105959, -10.768602, -0.1920805, 25.26875, -8.910217, -0.1920805, 25.48328, -8.910217, -0.1920805, 25.48328, -10.768602, -0.1920805, 25.26875, -8.908827, -0.28371704, 25.276447, -16.346624, -0.1920805, 25.245663, -17.254608, -0.19208062, 26.203075, -16.7707, -0.19208056, 25.68835, -16.7707, -0.19208056, 25.68835, -17.254608, -0.19208062, 26.203075, -17.251945, -0.19208056, 25.806864, -17.251945, -0.19208056, 25.806864, -17.169178, -0.33171725, 25.698326, -16.7707, -0.19208056, 25.68835, -17.169178, -0.33171725, 25.698326, -17.250105, -0.1920805, 25.532833, -16.7707, -0.19208056, 25.68835, -16.346624, -0.1920805, 25.245663, -16.7707, -0.19208056, 25.68835, -17.250105, -0.1920805, 25.532833, -16.346624, -0.1920805, 25.245663, -17.250105, -0.1920805, 25.532833, -17.248005, -0.1920805, 25.220404, -16.353252, -0.5581906, 26.231823, -17.254608, -0.19208062, 26.203075, -16.353252, -0.19208062, 26.231823, -16.353252, -0.5581906, 26.231823, -17.254608, -0.5581906, 26.203075, -17.254608, -0.19208062, 26.203075, -8.914402, -0.19208062, 26.105959, -16.353252, -0.5581906, 26.231823, -16.353252, -0.19208062, 26.231823, -8.914402, -0.19208062, 26.105959, -8.914402, -0.5581906, 26.105959, -16.353252, -0.5581906, 26.231823, -17.248005, -0.55819046, 25.220404, -16.353252, -0.5581906, 26.231823, -16.346624, -0.55819046, 25.245663, -16.353252, -0.5581906, 26.231823, -17.248005, -0.55819046, 25.220404, -17.251574, -0.5581905, 25.751448, -16.353252, -0.5581906, 26.231823, -17.251574, -0.5581905, 25.751448, -17.254608, -0.5581906, 26.203075, -8.914402, -0.5581906, 26.105959, -16.346624, -0.55819046, 25.245663, -16.353252, -0.5581906, 26.231823, -8.914402, -0.5581906, 26.105959, -8.908827, -0.55819046, 25.276447, -16.346624, -0.55819046, 25.245663, -17.250105, -0.1920805, 25.532833, -17.169178, -0.33171725, 25.698326, -17.251574, -0.5581905, 25.751448, -17.169178, -0.33171725, 25.698326, -17.251945, -0.19208056, 25.806864, -17.251574, -0.5581905, 25.751448, -17.248005, -0.55819046, 25.220404, -17.250105, -0.1920805, 25.532833, -17.251574, -0.5581905, 25.751448, -17.248005, -0.55819046, 25.220404, -17.248005, -0.1920805, 25.220404, -17.250105, -0.1920805, 25.532833, -17.251945, -0.19208056, 25.806864, -17.254608, -0.5581906, 26.203075, -17.251574, -0.5581905, 25.751448, -17.251945, -0.19208056, 25.806864, -17.254608, -0.19208062, 26.203075, -17.254608, -0.5581906, 26.203075, -8.914402, -0.19208062, 26.105959, -8.908827, -0.55819046, 25.276447, -8.914402, -0.5581906, 26.105959, -8.908827, -0.55819046, 25.276447, -8.914402, -0.19208062, 26.105959, -8.910217, -0.1920805, 25.48328, -8.908827, -0.55819046, 25.276447, -8.910217, -0.1920805, 25.48328, -8.908827, -0.28371704, 25.276447, -16.566906, -0.19208038, 24.06379, -17.53112, -0.55819035, 24.038109, -16.566906, -0.55819035, 24.06379, -16.566906, -0.19208038, 24.06379, -17.53112, -0.19208038, 24.038109, -17.53112, -0.55819035, 24.038109, -16.566906, -0.55819035, 24.06379, -10.599218, -0.19208038, 24.089493, -16.566906, -0.19208038, 24.06379, -16.566906, -0.55819035, 24.06379, -8.610281, -0.28371692, 24.09806, -10.599218, -0.19208038, 24.089493, -8.610281, -0.28371692, 24.09806, -16.566906, -0.55819035, 24.06379, -8.610281, -0.55819035, 24.09806, -17.537725, -0.19208044, 25.020779, -16.566906, -0.19208038, 24.06379, -16.573536, -0.1920805, 25.050386, -10.599218, -0.19208038, 24.089493, -16.573536, -0.1920805, 25.050386, -16.566906, -0.19208038, 24.06379, -10.599218, -0.19208038, 24.089493, -8.61586, -0.19208044, 24.928009, -16.573536, -0.1920805, 25.050386, -8.61586, -0.19208044, 24.928009, -10.599218, -0.19208038, 24.089493, -8.611677, -0.19208038, 24.305765, -8.611677, -0.19208038, 24.305765, -10.599218, -0.19208038, 24.089493, -8.610281, -0.28371692, 24.09806, -16.566906, -0.19208038, 24.06379, -17.537725, -0.19208044, 25.020779, -17.02022, -0.19208038, 24.506718, -17.02022, -0.19208038, 24.506718, -17.537725, -0.19208044, 25.020779, -17.535063, -0.19208044, 24.624569, -17.535063, -0.19208044, 24.624569, -17.446188, -0.33171707, 24.51651, -17.02022, -0.19208038, 24.506718, -17.446188, -0.33171707, 24.51651, -17.533224, -0.19208038, 24.350975, -17.02022, -0.19208038, 24.506718, -16.566906, -0.19208038, 24.06379, -17.02022, -0.19208038, 24.506718, -17.533224, -0.19208038, 24.350975, -16.566906, -0.19208038, 24.06379, -17.533224, -0.19208038, 24.350975, -17.53112, -0.19208038, 24.038109, -16.573536, -0.55819046, 25.050386, -17.537725, -0.19208044, 25.020779, -16.573536, -0.1920805, 25.050386, -16.573536, -0.55819046, 25.050386, -17.537725, -0.55819046, 25.020779, -17.537725, -0.19208044, 25.020779, -8.61586, -0.19208044, 24.928009, -16.573536, -0.55819046, 25.050386, -16.573536, -0.1920805, 25.050386, -8.61586, -0.19208044, 24.928009, -8.61586, -0.5581904, 24.928009, -16.573536, -0.55819046, 25.050386, -17.53112, -0.55819035, 24.038109, -16.573536, -0.55819046, 25.050386, -16.566906, -0.55819035, 24.06379, -16.573536, -0.55819046, 25.050386, -17.53112, -0.55819035, 24.038109, -17.534693, -0.55819035, 24.569588, -16.573536, -0.55819046, 25.050386, -17.534693, -0.55819035, 24.569588, -17.537725, -0.55819046, 25.020779, -8.61586, -0.5581904, 24.928009, -16.566906, -0.55819035, 24.06379, -16.573536, -0.55819046, 25.050386, -8.61586, -0.5581904, 24.928009, -8.610281, -0.55819035, 24.09806, -16.566906, -0.55819035, 24.06379, -17.533224, -0.19208038, 24.350975, -17.446188, -0.33171707, 24.51651, -17.534693, -0.55819035, 24.569588, -17.446188, -0.33171707, 24.51651, -17.535063, -0.19208044, 24.624569, -17.534693, -0.55819035, 24.569588, -17.53112, -0.55819035, 24.038109, -17.533224, -0.19208038, 24.350975, -17.534693, -0.55819035, 24.569588, -17.53112, -0.55819035, 24.038109, -17.53112, -0.19208038, 24.038109, -17.533224, -0.19208038, 24.350975, -17.535063, -0.19208044, 24.624569, -17.537725, -0.55819046, 25.020779, -17.534693, -0.55819035, 24.569588, -17.535063, -0.19208044, 24.624569, -17.537725, -0.19208044, 25.020779, -17.537725, -0.55819046, 25.020779, -8.61586, -0.19208044, 24.928009, -8.610281, -0.55819035, 24.09806, -8.61586, -0.5581904, 24.928009, -8.610281, -0.55819035, 24.09806, -8.61586, -0.19208044, 24.928009, -8.611677, -0.19208038, 24.305765, -8.610281, -0.55819035, 24.09806, -8.611677, -0.19208038, 24.305765, -8.610281, -0.28371692, 24.09806, -10.358263, -0.5581907, 27.454252, -17.457956, -0.1920808, 27.566252, -10.358263, -0.19208074, 27.454252, -10.358263, -0.5581907, 27.454252, -17.457956, -0.5581907, 27.566252, -17.457956, -0.1920808, 27.566252, -8.72983, -0.19208074, 27.471743, -10.358263, -0.5581907, 27.454252, -10.358263, -0.19208074, 27.454252, -8.72983, -0.19208074, 27.471743, -8.72983, -0.5581907, 27.471743, -10.358263, -0.5581907, 27.454252, -10.351484, -0.5581906, 26.445835, -17.457956, -0.5581907, 27.566252, -10.358263, -0.5581907, 27.454252, -10.351484, -0.5581906, 26.445835, -17.451353, -0.5581906, 26.58358, -17.457956, -0.5581907, 27.566252, -8.72983, -0.5581907, 27.471743, -10.351484, -0.5581906, 26.445835, -10.358263, -0.5581907, 27.454252, -8.72983, -0.5581907, 27.471743, -8.724255, -0.5581906, 26.642231, -10.351484, -0.5581906, 26.445835, -8.72983, -0.5581907, 27.471743, -8.724255, -0.19208068, 26.642231, -8.724255, -0.5581906, 26.642231, -8.72983, -0.5581907, 27.471743, -8.72983, -0.19208074, 27.471743, -8.724255, -0.19208068, 26.642231, -10.35318, -0.19208068, 26.69805, -10.351484, -0.28371716, 26.445835, -9.944677, -0.19208062, 26.494825, -10.35318, -0.19208068, 26.69805, -12.1264515, -0.19208062, 26.480164, -10.351484, -0.28371716, 26.445835, -10.35318, -0.19208068, 26.69805, -16.120235, -0.19208068, 26.557617, -12.1264515, -0.19208062, 26.480164, -9.944677, -0.19208062, 26.494825, -10.358263, -0.19208074, 27.454252, -10.35318, -0.19208068, 26.69805, -9.944677, -0.19208062, 26.494825, -8.72983, -0.19208074, 27.471743, -10.358263, -0.19208074, 27.454252, -8.72983, -0.19208074, 27.471743, -9.944677, -0.19208062, 26.494825, -8.724255, -0.19208068, 26.642231, -17.457956, -0.1920808, 27.566252, -10.35318, -0.19208068, 26.69805, -10.358263, -0.19208074, 27.454252, -10.35318, -0.19208068, 26.69805, -17.457956, -0.1920808, 27.566252, -16.120235, -0.19208068, 26.557617, -16.120235, -0.19208068, 26.557617, -17.457956, -0.1920808, 27.566252, -17.453001, -0.19208068, 26.828812, -16.120235, -0.19208068, 26.557617, -17.453001, -0.19208068, 26.828812, -17.451353, -0.28371722, 26.58358, -8.724255, -0.19208068, 26.642231, -10.351484, -0.5581906, 26.445835, -8.724255, -0.5581906, 26.642231, -10.351484, -0.5581906, 26.445835, -8.724255, -0.19208068, 26.642231, -9.944677, -0.19208062, 26.494825, -10.351484, -0.5581906, 26.445835, -9.944677, -0.19208062, 26.494825, -10.351484, -0.28371716, 26.445835, -10.351484, -0.28371716, 26.445835, -17.451353, -0.5581906, 26.58358, -10.351484, -0.5581906, 26.445835, -10.351484, -0.28371716, 26.445835, -16.120235, -0.19208068, 26.557617, -17.451353, -0.5581906, 26.58358, -17.451353, -0.5581906, 26.58358, -16.120235, -0.19208068, 26.557617, -17.451353, -0.28371722, 26.58358, -16.120235, -0.19208068, 26.557617, -10.351484, -0.28371716, 26.445835, -12.1264515, -0.19208062, 26.480164, -17.451353, -0.28371722, 26.58358, -17.457956, -0.5581907, 27.566252, -17.451353, -0.5581906, 26.58358, -17.457956, -0.5581907, 27.566252, -17.451353, -0.28371722, 26.58358, -17.453001, -0.19208068, 26.828812, -17.457956, -0.5581907, 27.566252, -17.453001, -0.19208068, 26.828812, -17.457956, -0.1920808, 27.566252, -13.511387, 0.0055903792, 44.578655, -17.616987, 0.37126416, 44.736523, -13.511387, 0.37126416, 44.578655, -13.511387, 0.0055903792, 44.578655, -17.616987, 0.0055903792, 44.736523, -17.616987, 0.37126416, 44.736523, -9.277809, 0.37126416, 44.792564, -13.511387, 0.0055903792, 44.578655, -13.511387, 0.37126416, 44.578655, -9.277809, 0.37126416, 44.792564, -9.277809, 0.0055903792, 44.792564, -13.511387, 0.0055903792, 44.578655, -13.50481, 0.0055904984, 43.59991, -17.616987, 0.0055903792, 44.736523, -13.511387, 0.0055903792, 44.578655, -13.50481, 0.0055904984, 43.59991, -17.61141, 0.0055904984, 43.906574, -17.616987, 0.0055903792, 44.736523, -13.511387, 0.0055903792, 44.578655, -9.270195, 0.0055904984, 43.65935, -13.50481, 0.0055904984, 43.59991, -13.511387, 0.0055903792, 44.578655, -9.274065, 0.005590439, 44.23534, -9.270195, 0.0055904984, 43.65935, -9.274065, 0.005590439, 44.23534, -13.511387, 0.0055903792, 44.578655, -9.277809, 0.0055903792, 44.792564, -17.61141, 0.0055904984, 43.906574, -17.616987, 0.37126416, 44.736523, -17.616987, 0.0055903792, 44.736523, -17.61141, 0.0055904984, 43.906574, -17.61141, 0.37126416, 43.906574, -17.616987, 0.37126416, 44.736523, -9.274517, 0.37126416, 44.30254, -9.433565, 0.26217288, 44.20372, -9.274065, 0.005590439, 44.23534, -13.506453, 0.37126416, 43.84427, -13.50481, 0.28006393, 43.59991, -12.446262, 0.37126428, 43.61444, -13.506453, 0.37126416, 43.84427, -14.531677, 0.37126428, 43.676357, -13.50481, 0.28006393, 43.59991, -13.506453, 0.37126416, 43.84427, -17.61141, 0.37126416, 43.906574, -14.531677, 0.37126428, 43.676357, -13.506453, 0.37126416, 43.84427, -17.616987, 0.37126416, 44.736523, -17.61141, 0.37126416, 43.906574, -17.616987, 0.37126416, 44.736523, -13.506453, 0.37126416, 43.84427, -13.511387, 0.37126416, 44.578655, -12.446262, 0.37126428, 43.61444, -13.511387, 0.37126416, 44.578655, -13.506453, 0.37126416, 43.84427, -13.511387, 0.37126416, 44.578655, -9.274517, 0.37126416, 44.30254, -9.277809, 0.37126416, 44.792564, -13.511387, 0.37126416, 44.578655, -10.001682, 0.37126416, 44.19729, -9.274517, 0.37126416, 44.30254, -12.446262, 0.37126428, 43.61444, -10.001682, 0.37126416, 44.19729, -13.511387, 0.37126416, 44.578655, -9.433565, 0.26217288, 44.20372, -9.274517, 0.37126416, 44.30254, -10.001682, 0.37126416, 44.19729, -9.272657, 0.37126416, 44.02589, -9.433565, 0.26217288, 44.20372, -10.001682, 0.37126416, 44.19729, -10.001682, 0.37126416, 44.19729, -12.446262, 0.37126428, 43.61444, -9.272657, 0.37126416, 44.02589, -9.272657, 0.37126416, 44.02589, -12.446262, 0.37126428, 43.61444, -9.270195, 0.37126428, 43.65935, -9.277809, 0.0055903792, 44.792564, -9.274517, 0.37126416, 44.30254, -9.274065, 0.005590439, 44.23534, -9.277809, 0.0055903792, 44.792564, -9.277809, 0.37126416, 44.792564, -9.274517, 0.37126416, 44.30254, -9.272657, 0.37126416, 44.02589, -9.270195, 0.0055904984, 43.65935, -9.274065, 0.005590439, 44.23534, -9.272657, 0.37126416, 44.02589, -9.270195, 0.37126428, 43.65935, -9.270195, 0.0055904984, 43.65935, -9.433565, 0.26217288, 44.20372, -9.272657, 0.37126416, 44.02589, -9.274065, 0.005590439, 44.23534, -9.270195, 0.37126428, 43.65935, -13.50481, 0.0055904984, 43.59991, -9.270195, 0.0055904984, 43.65935, -13.50481, 0.0055904984, 43.59991, -9.270195, 0.37126428, 43.65935, -12.446262, 0.37126428, 43.61444, -13.50481, 0.0055904984, 43.59991, -12.446262, 0.37126428, 43.61444, -13.50481, 0.28006393, 43.59991, -13.50481, 0.28006393, 43.59991, -17.61141, 0.0055904984, 43.906574, -13.50481, 0.0055904984, 43.59991, -13.50481, 0.28006393, 43.59991, -17.61141, 0.37126416, 43.906574, -17.61141, 0.0055904984, 43.906574, -17.61141, 0.37126416, 43.906574, -13.50481, 0.28006393, 43.59991, -14.531677, 0.37126428, 43.676357, -16.691502, 0.37126452, 41.174942, -17.592882, 0.0055907965, 41.149685, -16.691502, 0.0055907965, 41.174942, -16.691502, 0.37126452, 41.174942, -17.592882, 0.37126452, 41.149685, -17.592882, 0.0055907965, 41.149685, -16.691502, 0.0055907965, 41.174942, -11.113045, 0.37126452, 41.198032, -16.691502, 0.37126452, 41.174942, -16.691502, 0.0055907965, 41.174942, -9.253704, 0.28006417, 41.20573, -11.113045, 0.37126452, 41.198032, -9.253704, 0.28006417, 41.20573, -16.691502, 0.0055907965, 41.174942, -9.253704, 0.0055907965, 41.20573, -17.599485, 0.3712644, 42.132355, -16.691502, 0.37126452, 41.174942, -16.698133, 0.3712644, 42.16154, -11.113045, 0.37126452, 41.198032, -16.698133, 0.3712644, 42.16154, -16.691502, 0.37126452, 41.174942, -11.113045, 0.37126452, 41.198032, -9.259279, 0.3712644, 42.03524, -16.698133, 0.3712644, 42.16154, -9.259279, 0.3712644, 42.03524, -11.113045, 0.37126452, 41.198032, -9.255098, 0.37126452, 41.413, -9.255098, 0.37126452, 41.413, -11.113045, 0.37126452, 41.198032, -9.253704, 0.28006417, 41.20573, -16.691502, 0.37126452, 41.174942, -17.599485, 0.3712644, 42.132355, -17.115143, 0.37126452, 41.617634, -17.115143, 0.37126452, 41.617634, -17.599485, 0.3712644, 42.132355, -17.596823, 0.37126452, 41.736145, -17.596823, 0.37126452, 41.736145, -17.513622, 0.23162776, 41.628048, -17.115143, 0.37126452, 41.617634, -17.513622, 0.23162776, 41.628048, -17.594984, 0.37126452, 41.46255, -17.115143, 0.37126452, 41.617634, -16.691502, 0.37126452, 41.174942, -17.115143, 0.37126452, 41.617634, -17.594984, 0.37126452, 41.46255, -16.691502, 0.37126452, 41.174942, -17.594984, 0.37126452, 41.46255, -17.592882, 0.37126452, 41.149685, -16.698133, 0.0055906773, 42.16154, -17.599485, 0.3712644, 42.132355, -16.698133, 0.3712644, 42.16154, -16.698133, 0.0055906773, 42.16154, -17.599485, 0.0055906773, 42.132355, -17.599485, 0.3712644, 42.132355, -9.259279, 0.3712644, 42.03524, -16.698133, 0.0055906773, 42.16154, -16.698133, 0.3712644, 42.16154, -9.259279, 0.3712644, 42.03524, -9.259279, 0.005590737, 42.03524, -16.698133, 0.0055906773, 42.16154, -17.592882, 0.0055907965, 41.149685, -16.698133, 0.0055906773, 42.16154, -16.691502, 0.0055907965, 41.174942, -16.698133, 0.0055906773, 42.16154, -17.592882, 0.0055907965, 41.149685, -17.59645, 0.005590737, 41.68073, -16.698133, 0.0055906773, 42.16154, -17.59645, 0.005590737, 41.68073, -17.599485, 0.0055906773, 42.132355, -9.259279, 0.005590737, 42.03524, -16.691502, 0.0055907965, 41.174942, -16.698133, 0.0055906773, 42.16154, -9.259279, 0.005590737, 42.03524, -9.253704, 0.0055907965, 41.20573, -16.691502, 0.0055907965, 41.174942, -17.594984, 0.37126452, 41.46255, -17.513622, 0.23162776, 41.628048, -17.59645, 0.005590737, 41.68073, -17.513622, 0.23162776, 41.628048, -17.596823, 0.37126452, 41.736145, -17.59645, 0.005590737, 41.68073, -17.592882, 0.0055907965, 41.149685, -17.594984, 0.37126452, 41.46255, -17.59645, 0.005590737, 41.68073, -17.592882, 0.0055907965, 41.149685, -17.592882, 0.37126452, 41.149685, -17.594984, 0.37126452, 41.46255, -17.596823, 0.37126452, 41.736145, -17.599485, 0.0055906773, 42.132355, -17.59645, 0.005590737, 41.68073, -17.596823, 0.37126452, 41.736145, -17.599485, 0.3712644, 42.132355, -17.599485, 0.0055906773, 42.132355, -9.259279, 0.3712644, 42.03524, -9.253704, 0.0055907965, 41.20573, -9.259279, 0.005590737, 42.03524, -9.253704, 0.0055907965, 41.20573, -9.259279, 0.3712644, 42.03524, -9.255098, 0.37126452, 41.413, -9.253704, 0.0055907965, 41.20573, -9.255098, 0.37126452, 41.413, -9.253704, 0.28006417, 41.20573, -9.466791, -0.19077104, 22.980423, -9.698496, -0.09826177, 22.978865, -9.698496, -0.19077104, 22.978865, -9.466791, -0.19077104, 22.980423, -9.466791, -0.09826177, 22.980423, -9.698496, -0.09826177, 22.978865, -9.466791, -0.09826177, 22.980423, -9.864088, -0.098264754, 47.618515, -9.698496, -0.09826177, 22.978865, -9.466791, -0.09826177, 22.980423, -9.632383, -0.098264754, 47.62007, -9.864088, -0.098264754, 47.618515, -9.632383, -0.098264754, 47.62007, -9.864088, -0.19077402, 47.618515, -9.864088, -0.098264754, 47.618515, -9.632383, -0.098264754, 47.62007, -9.632383, -0.19077402, 47.62007, -9.864088, -0.19077402, 47.618515, -9.632383, -0.19077402, 47.62007, -9.698496, -0.19077104, 22.978865, -9.864088, -0.19077402, 47.618515, -9.632383, -0.19077402, 47.62007, -9.466791, -0.19077104, 22.980423, -9.698496, -0.19077104, 22.978865, -9.698496, -0.19077104, 22.978865, -9.864088, -0.098264754, 47.618515, -9.864088, -0.19077402, 47.618515, -9.698496, -0.19077104, 22.978865, -9.698496, -0.09826177, 22.978865, -9.864088, -0.098264754, 47.618515, -9.632383, -0.19077402, 47.62007, -9.466791, -0.09826177, 22.980423, -9.466791, -0.19077104, 22.980423, -9.632383, -0.19077402, 47.62007, -9.632383, -0.098264754, 47.62007, -9.466791, -0.09826177, 22.980423, -10.65929, 0.00559026, 45.949276, -17.916506, 0.37126392, 46.05978, -10.65929, 0.37126392, 45.949276, -10.65929, 0.00559026, 45.949276, -17.916506, 0.0055902004, 46.05978, -17.916506, 0.37126392, 46.05978, -8.99464, 0.37126392, 45.967007, -10.65929, 0.00559026, 45.949276, -10.65929, 0.37126392, 45.949276, -8.99464, 0.37126392, 45.967007, -8.99464, 0.00559026, 45.967007, -10.65929, 0.00559026, 45.949276, -10.65251, 0.0055903792, 44.940422, -17.916506, 0.0055902004, 46.05978, -10.65929, 0.00559026, 45.949276, -10.65251, 0.0055903792, 44.940422, -17.909903, 0.0055903196, 45.07711, -17.916506, 0.0055902004, 46.05978, -8.99464, 0.00559026, 45.967007, -10.65251, 0.0055903792, 44.940422, -10.65929, 0.00559026, 45.949276, -8.99464, 0.00559026, 45.967007, -8.989063, 0.0055903196, 45.137062, -10.65251, 0.0055903792, 44.940422, -8.99464, 0.00559026, 45.967007, -8.989063, 0.37126404, 45.137062, -8.989063, 0.0055903196, 45.137062, -8.99464, 0.00559026, 45.967007, -8.99464, 0.37126392, 45.967007, -8.989063, 0.37126404, 45.137062, -10.654205, 0.37126404, 45.192635, -10.65251, 0.2800637, 44.940422, -10.236538, 0.37126404, 44.98947, -10.654205, 0.37126404, 45.192635, -12.466749, 0.37126404, 44.974487, -10.65251, 0.2800637, 44.940422, -10.654205, 0.37126404, 45.192635, -16.549116, 0.37126404, 45.05178, -12.466749, 0.37126404, 44.974487, -10.236538, 0.37126404, 44.98947, -10.65929, 0.37126392, 45.949276, -10.654205, 0.37126404, 45.192635, -10.236538, 0.37126404, 44.98947, -8.99464, 0.37126392, 45.967007, -10.65929, 0.37126392, 45.949276, -8.99464, 0.37126392, 45.967007, -10.236538, 0.37126404, 44.98947, -8.989063, 0.37126404, 45.137062, -17.916506, 0.37126392, 46.05978, -10.654205, 0.37126404, 45.192635, -10.65929, 0.37126392, 45.949276, -10.654205, 0.37126404, 45.192635, -17.916506, 0.37126392, 46.05978, -16.549116, 0.37126404, 45.05178, -16.549116, 0.37126404, 45.05178, -17.916506, 0.37126392, 46.05978, -17.911556, 0.37126404, 45.32321, -16.549116, 0.37126404, 45.05178, -17.911556, 0.37126404, 45.32321, -17.909903, 0.2800637, 45.07711, -8.989063, 0.37126404, 45.137062, -10.65251, 0.0055903792, 44.940422, -8.989063, 0.0055903196, 45.137062, -10.65251, 0.0055903792, 44.940422, -8.989063, 0.37126404, 45.137062, -10.236538, 0.37126404, 44.98947, -10.65251, 0.0055903792, 44.940422, -10.236538, 0.37126404, 44.98947, -10.65251, 0.2800637, 44.940422, -10.65251, 0.2800637, 44.940422, -17.909903, 0.0055903196, 45.07711, -10.65251, 0.0055903792, 44.940422, -10.65251, 0.2800637, 44.940422, -16.549116, 0.37126404, 45.05178, -17.909903, 0.0055903196, 45.07711, -17.909903, 0.0055903196, 45.07711, -16.549116, 0.37126404, 45.05178, -17.909903, 0.2800637, 45.07711, -16.549116, 0.37126404, 45.05178, -10.65251, 0.2800637, 44.940422, -12.466749, 0.37126404, 44.974487, -17.909903, 0.2800637, 45.07711, -17.916506, 0.0055902004, 46.05978, -17.909903, 0.0055903196, 45.07711, -17.916506, 0.0055902004, 46.05978, -17.909903, 0.2800637, 45.07711, -17.911556, 0.37126404, 45.32321, -17.916506, 0.0055902004, 46.05978, -17.911556, 0.37126404, 45.32321, -17.916506, 0.37126392, 46.05978, -9.086136, -3.458273, 47.63378, -9.862558, 1.270175, 47.455757, -9.690924, -3.458273, 47.629715, -9.086136, -3.458273, 47.63378, -8.912178, 1.270175, 47.462143, -9.862558, 1.270175, 47.455757, -8.912178, 1.270175, 47.462143, -9.868942, 1.2701747, 48.4057, -9.862558, 1.270175, 47.455757, -8.912178, 1.270175, 47.462143, -8.918562, 1.2701747, 48.41209, -9.868942, 1.2701747, 48.4057, -8.918562, 1.2701747, 48.41209, -9.694984, -3.458273, 48.234066, -9.868942, 1.2701747, 48.4057, -8.918562, 1.2701747, 48.41209, -9.090197, -3.458273, 48.238132, -9.694984, -3.458273, 48.234066, -9.090197, -3.458273, 48.238132, -9.690924, -3.458273, 47.629715, -9.694984, -3.458273, 48.234066, -9.090197, -3.458273, 48.238132, -9.086136, -3.458273, 47.63378, -9.690924, -3.458273, 47.629715, -9.690924, -3.458273, 47.629715, -9.868942, 1.2701747, 48.4057, -9.694984, -3.458273, 48.234066, -9.690924, -3.458273, 47.629715, -9.862558, 1.270175, 47.455757, -9.868942, 1.2701747, 48.4057, -9.090197, -3.458273, 48.238132, -8.912178, 1.270175, 47.462143, -9.086136, -3.458273, 47.63378, -9.090197, -3.458273, 48.238132, -8.918562, 1.2701747, 48.41209, -8.912178, 1.270175, 47.462143, -16.72666, 0.37126392, 46.406403, -17.628038, 0.0055902004, 46.380707, -16.72666, 0.0055902004, 46.406403, -16.72666, 0.37126392, 46.406403, -17.628038, 0.37126392, 46.380707, -17.628038, 0.0055902004, 46.380707, -16.72666, 0.0055902004, 46.406403, -11.148199, 0.37126392, 46.429054, -16.72666, 0.37126392, 46.406403, -16.72666, 0.0055902004, 46.406403, -9.28886, 0.28006357, 46.436752, -11.148199, 0.37126392, 46.429054, -9.28886, 0.28006357, 46.436752, -16.72666, 0.0055902004, 46.406403, -9.28886, 0.0055902004, 46.436752, -17.634645, 0.3712638, 47.363815, -16.72666, 0.37126392, 46.406403, -16.733288, 0.3712638, 47.392563, -11.148199, 0.37126392, 46.429054, -16.733288, 0.3712638, 47.392563, -16.72666, 0.37126392, 46.406403, -11.148199, 0.37126392, 46.429054, -9.294437, 0.3712638, 47.266697, -16.733288, 0.3712638, 47.392563, -9.294437, 0.3712638, 47.266697, -11.148199, 0.37126392, 46.429054, -9.2902565, 0.37126392, 46.644455, -9.2902565, 0.37126392, 46.644455, -11.148199, 0.37126392, 46.429054, -9.28886, 0.28006357, 46.436752, -16.72666, 0.37126392, 46.406403, -17.634645, 0.3712638, 47.363815, -17.150305, 0.3712638, 46.84953, -17.150305, 0.3712638, 46.84953, -17.634645, 0.3712638, 47.363815, -17.631985, 0.3712638, 46.96804, -17.631985, 0.3712638, 46.96804, -17.548779, 0.23162705, 46.85907, -17.150305, 0.3712638, 46.84953, -17.548779, 0.23162705, 46.85907, -17.63014, 0.37126392, 46.693573, -17.150305, 0.3712638, 46.84953, -16.72666, 0.37126392, 46.406403, -17.150305, 0.3712638, 46.84953, -17.63014, 0.37126392, 46.693573, -16.72666, 0.37126392, 46.406403, -17.63014, 0.37126392, 46.693573, -17.628038, 0.37126392, 46.380707, -16.733288, 0.005590081, 47.392563, -17.634645, 0.3712638, 47.363815, -16.733288, 0.3712638, 47.392563, -16.733288, 0.005590081, 47.392563, -17.634645, 0.005590081, 47.363815, -17.634645, 0.3712638, 47.363815, -9.294437, 0.3712638, 47.266697, -16.733288, 0.005590081, 47.392563, -16.733288, 0.3712638, 47.392563, -9.294437, 0.3712638, 47.266697, -9.294437, 0.005590081, 47.266697, -16.733288, 0.005590081, 47.392563, -17.628038, 0.0055902004, 46.380707, -16.733288, 0.005590081, 47.392563, -16.72666, 0.0055902004, 46.406403, -16.733288, 0.005590081, 47.392563, -17.628038, 0.0055902004, 46.380707, -17.631613, 0.005590141, 46.912624, -16.733288, 0.005590081, 47.392563, -17.631613, 0.005590141, 46.912624, -17.634645, 0.005590081, 47.363815, -9.294437, 0.005590081, 47.266697, -16.72666, 0.0055902004, 46.406403, -16.733288, 0.005590081, 47.392563, -9.294437, 0.005590081, 47.266697, -9.28886, 0.0055902004, 46.436752, -16.72666, 0.0055902004, 46.406403, -17.63014, 0.37126392, 46.693573, -17.548779, 0.23162705, 46.85907, -17.631613, 0.005590141, 46.912624, -17.548779, 0.23162705, 46.85907, -17.631985, 0.3712638, 46.96804, -17.631613, 0.005590141, 46.912624, -17.628038, 0.0055902004, 46.380707, -17.63014, 0.37126392, 46.693573, -17.631613, 0.005590141, 46.912624, -17.628038, 0.0055902004, 46.380707, -17.628038, 0.37126392, 46.380707, -17.63014, 0.37126392, 46.693573, -17.631985, 0.3712638, 46.96804, -17.634645, 0.005590081, 47.363815, -17.631613, 0.005590141, 46.912624, -17.631985, 0.3712638, 46.96804, -17.634645, 0.3712638, 47.363815, -17.634645, 0.005590081, 47.363815, -9.294437, 0.3712638, 47.266697, -9.28886, 0.0055902004, 46.436752, -9.294437, 0.005590081, 47.266697, -9.28886, 0.0055902004, 46.436752, -9.294437, 0.3712638, 47.266697, -9.2902565, 0.37126392, 46.644455, -9.28886, 0.0055902004, 46.436752, -9.2902565, 0.37126392, 46.644455, -9.28886, 0.28006357, 46.436752, -16.91135, 0.37126464, 39.993507, -17.875563, 0.0055909753, 39.967392, -16.91135, 0.0055909753, 39.993507, -16.91135, 0.37126464, 39.993507, -17.875563, 0.37126464, 39.967392, -17.875563, 0.0055909753, 39.967392, -16.91135, 0.0055909753, 39.993507, -10.943661, 0.37126464, 40.01878, -16.91135, 0.37126464, 39.993507, -16.91135, 0.0055909753, 39.993507, -8.954723, 0.28006428, 40.027344, -10.943661, 0.37126464, 40.01878, -8.954723, 0.28006428, 40.027344, -16.91135, 0.0055909753, 39.993507, -8.954723, 0.0055909753, 40.027344, -17.882166, 0.37126452, 40.95006, -16.91135, 0.37126464, 39.993507, -16.917978, 0.37126452, 40.97967, -10.943661, 0.37126464, 40.01878, -16.917978, 0.37126452, 40.97967, -16.91135, 0.37126464, 39.993507, -10.943661, 0.37126464, 40.01878, -8.9603, 0.37126452, 40.857292, -16.917978, 0.37126452, 40.97967, -8.9603, 0.37126452, 40.857292, -10.943661, 0.37126464, 40.01878, -8.95612, 0.37126464, 40.23505, -8.95612, 0.37126464, 40.23505, -10.943661, 0.37126464, 40.01878, -8.954723, 0.28006428, 40.027344, -16.91135, 0.37126464, 39.993507, -17.882166, 0.37126452, 40.95006, -17.364662, 0.37126464, 40.436, -17.364662, 0.37126464, 40.436, -17.882166, 0.37126452, 40.95006, -17.879507, 0.37126464, 40.55429, -17.879507, 0.37126464, 40.55429, -17.79063, 0.23162788, 40.445793, -17.364662, 0.37126464, 40.436, -17.79063, 0.23162788, 40.445793, -17.877665, 0.37126464, 40.28026, -17.364662, 0.37126464, 40.436, -16.91135, 0.37126464, 39.993507, -17.364662, 0.37126464, 40.436, -17.877665, 0.37126464, 40.28026, -16.91135, 0.37126464, 39.993507, -17.877665, 0.37126464, 40.28026, -17.875563, 0.37126464, 39.967392, -16.917978, 0.005590856, 40.97967, -17.882166, 0.37126452, 40.95006, -16.917978, 0.37126452, 40.97967, -16.917978, 0.005590856, 40.97967, -17.882166, 0.005590856, 40.95006, -17.882166, 0.37126452, 40.95006, -8.9603, 0.37126452, 40.857292, -16.917978, 0.005590856, 40.97967, -16.917978, 0.37126452, 40.97967, -8.9603, 0.37126452, 40.857292, -8.9603, 0.005590856, 40.857292, -16.917978, 0.005590856, 40.97967, -17.875563, 0.0055909753, 39.967392, -16.917978, 0.005590856, 40.97967, -16.91135, 0.0055909753, 39.993507, -16.917978, 0.005590856, 40.97967, -17.875563, 0.0055909753, 39.967392, -17.879133, 0.0055909157, 40.49887, -16.917978, 0.005590856, 40.97967, -17.879133, 0.0055909157, 40.49887, -17.882166, 0.005590856, 40.95006, -8.9603, 0.005590856, 40.857292, -16.91135, 0.0055909753, 39.993507, -16.917978, 0.005590856, 40.97967, -8.9603, 0.005590856, 40.857292, -8.954723, 0.0055909753, 40.027344, -16.91135, 0.0055909753, 39.993507, -17.877665, 0.37126464, 40.28026, -17.79063, 0.23162788, 40.445793, -17.879133, 0.0055909157, 40.49887, -17.79063, 0.23162788, 40.445793, -17.879507, 0.37126464, 40.55429, -17.879133, 0.0055909157, 40.49887, -17.875563, 0.0055909753, 39.967392, -17.877665, 0.37126464, 40.28026, -17.879133, 0.0055909157, 40.49887, -17.875563, 0.0055909753, 39.967392, -17.875563, 0.37126464, 39.967392, -17.877665, 0.37126464, 40.28026, -17.879507, 0.37126464, 40.55429, -17.882166, 0.005590856, 40.95006, -17.879133, 0.0055909157, 40.49887, -17.879507, 0.37126464, 40.55429, -17.882166, 0.37126452, 40.95006, -17.882166, 0.005590856, 40.95006, -8.9603, 0.37126452, 40.857292, -8.954723, 0.0055909753, 40.027344, -8.9603, 0.005590856, 40.857292, -8.954723, 0.0055909753, 40.027344, -8.9603, 0.37126452, 40.857292, -8.95612, 0.37126464, 40.23505, -8.954723, 0.0055909753, 40.027344, -8.95612, 0.37126464, 40.23505, -8.954723, 0.28006428, 40.027344, -13.4819145, 0.005591035, 39.478943, -17.873325, 0.37126476, 39.634453, -13.4819145, 0.37126476, 39.478943, -13.4819145, 0.005591035, 39.478943, -17.873325, 0.0055909753, 39.634453, -17.873325, 0.37126476, 39.634453, -8.952486, 0.37126476, 39.694405, -13.4819145, 0.005591035, 39.478943, -13.4819145, 0.37126476, 39.478943, -8.952486, 0.37126476, 39.694405, -8.952486, 0.0055909753, 39.694405, -13.4819145, 0.005591035, 39.478943, -13.47533, 0.005591154, 38.49933, -17.873325, 0.0055909753, 39.634453, -13.4819145, 0.005591035, 39.478943, -13.47533, 0.005591154, 38.49933, -17.867746, 0.0055910945, 38.80451, -17.873325, 0.0055909753, 39.634453, -13.4819145, 0.005591035, 39.478943, -8.944866, 0.005591154, 38.560757, -13.47533, 0.005591154, 38.49933, -13.4819145, 0.005591035, 39.478943, -8.948738, 0.005591035, 39.136745, -8.944866, 0.005591154, 38.560757, -8.948738, 0.005591035, 39.136745, -13.4819145, 0.005591035, 39.478943, -8.952486, 0.0055909753, 39.694405, -17.867746, 0.0055910945, 38.80451, -17.873325, 0.37126476, 39.634453, -17.873325, 0.0055909753, 39.634453, -17.867746, 0.0055910945, 38.80451, -17.867746, 0.37126476, 38.80451, -17.873325, 0.37126476, 39.634453, -8.949188, 0.37126476, 39.203945, -9.119587, 0.26217347, 39.105488, -8.948738, 0.005591035, 39.136745, -13.476976, 0.37126487, 38.74412, -13.47533, 0.28006452, 38.49933, -12.3426075, 0.37126487, 38.514793, -13.476976, 0.37126487, 38.74412, -14.573328, 0.37126487, 38.575733, -13.47533, 0.28006452, 38.49933, -13.476976, 0.37126487, 38.74412, -17.867746, 0.37126476, 38.80451, -14.573328, 0.37126487, 38.575733, -13.476976, 0.37126487, 38.74412, -17.873325, 0.37126476, 39.634453, -17.867746, 0.37126476, 38.80451, -17.873325, 0.37126476, 39.634453, -13.476976, 0.37126487, 38.74412, -13.4819145, 0.37126476, 39.478943, -12.3426075, 0.37126487, 38.514793, -13.4819145, 0.37126476, 39.478943, -13.476976, 0.37126487, 38.74412, -13.4819145, 0.37126476, 39.478943, -8.949188, 0.37126476, 39.203945, -8.952486, 0.37126476, 39.694405, -13.4819145, 0.37126476, 39.478943, -9.726973, 0.37126476, 39.09835, -8.949188, 0.37126476, 39.203945, -12.3426075, 0.37126487, 38.514793, -9.726973, 0.37126476, 39.09835, -13.4819145, 0.37126476, 39.478943, -9.119587, 0.26217347, 39.105488, -8.949188, 0.37126476, 39.203945, -9.726973, 0.37126476, 39.09835, -8.94733, 0.37126476, 38.927296, -9.119587, 0.26217347, 39.105488, -9.726973, 0.37126476, 39.09835, -9.726973, 0.37126476, 39.09835, -12.3426075, 0.37126487, 38.514793, -8.94733, 0.37126476, 38.927296, -8.94733, 0.37126476, 38.927296, -12.3426075, 0.37126487, 38.514793, -8.944866, 0.37126487, 38.560757, -8.952486, 0.0055909753, 39.694405, -8.949188, 0.37126476, 39.203945, -8.948738, 0.005591035, 39.136745, -8.952486, 0.0055909753, 39.694405, -8.952486, 0.37126476, 39.694405, -8.949188, 0.37126476, 39.203945, -8.94733, 0.37126476, 38.927296, -8.944866, 0.005591154, 38.560757, -8.948738, 0.005591035, 39.136745, -8.94733, 0.37126476, 38.927296, -8.944866, 0.37126487, 38.560757, -8.944866, 0.005591154, 38.560757, -9.119587, 0.26217347, 39.105488, -8.94733, 0.37126476, 38.927296, -8.948738, 0.005591035, 39.136745, -8.944866, 0.37126487, 38.560757, -13.47533, 0.005591154, 38.49933, -8.944866, 0.005591154, 38.560757, -13.47533, 0.005591154, 38.49933, -8.944866, 0.37126487, 38.560757, -12.3426075, 0.37126487, 38.514793, -13.47533, 0.005591154, 38.49933, -12.3426075, 0.37126487, 38.514793, -13.47533, 0.28006452, 38.49933, -13.47533, 0.28006452, 38.49933, -17.867746, 0.0055910945, 38.80451, -13.47533, 0.005591154, 38.49933, -13.47533, 0.28006452, 38.49933, -17.867746, 0.37126476, 38.80451, -17.867746, 0.0055910945, 38.80451, -17.867746, 0.37126476, 38.80451, -13.47533, 0.28006452, 38.49933, -14.573328, 0.37126487, 38.575733, -16.664772, 0.371265, 37.19757, -17.566149, 0.0055912733, 37.171875, -16.664772, 0.0055912733, 37.19757, -16.664772, 0.371265, 37.19757, -17.566149, 0.371265, 37.171875, -17.566149, 0.0055912733, 37.171875, -16.664772, 0.0055912733, 37.19757, -11.086311, 0.371265, 37.220222, -16.664772, 0.371265, 37.19757, -16.664772, 0.0055912733, 37.19757, -9.226971, 0.28006464, 37.227917, -11.086311, 0.371265, 37.220222, -9.226971, 0.28006464, 37.227917, -16.664772, 0.0055912733, 37.19757, -9.226971, 0.0055912733, 37.227917, -17.572756, 0.37126487, 38.154984, -16.664772, 0.371265, 37.19757, -16.6714, 0.37126487, 38.18373, -11.086311, 0.371265, 37.220222, -16.6714, 0.37126487, 38.18373, -16.664772, 0.371265, 37.19757, -11.086311, 0.371265, 37.220222, -9.23255, 0.37126487, 38.057865, -16.6714, 0.37126487, 38.18373, -9.23255, 0.37126487, 38.057865, -11.086311, 0.371265, 37.220222, -9.228367, 0.371265, 37.435623, -9.228367, 0.371265, 37.435623, -11.086311, 0.371265, 37.220222, -9.226971, 0.28006464, 37.227917, -16.664772, 0.371265, 37.19757, -17.572756, 0.37126487, 38.154984, -17.088415, 0.371265, 37.640697, -17.088415, 0.371265, 37.640697, -17.572756, 0.37126487, 38.154984, -17.570097, 0.371265, 37.75921, -17.570097, 0.371265, 37.75921, -17.486889, 0.23162824, 37.650238, -17.088415, 0.371265, 37.640697, -17.486889, 0.23162824, 37.650238, -17.56825, 0.371265, 37.48474, -17.088415, 0.371265, 37.640697, -16.664772, 0.371265, 37.19757, -17.088415, 0.371265, 37.640697, -17.56825, 0.371265, 37.48474, -16.664772, 0.371265, 37.19757, -17.56825, 0.371265, 37.48474, -17.566149, 0.371265, 37.171875, -16.6714, 0.005591154, 38.18373, -17.572756, 0.37126487, 38.154984, -16.6714, 0.37126487, 38.18373, -16.6714, 0.005591154, 38.18373, -17.572756, 0.005591154, 38.154984, -17.572756, 0.37126487, 38.154984, -9.23255, 0.37126487, 38.057865, -16.6714, 0.005591154, 38.18373, -16.6714, 0.37126487, 38.18373, -9.23255, 0.37126487, 38.057865, -9.23255, 0.0055912137, 38.057865, -16.6714, 0.005591154, 38.18373, -17.566149, 0.0055912733, 37.171875, -16.6714, 0.005591154, 38.18373, -16.664772, 0.0055912733, 37.19757, -16.6714, 0.005591154, 38.18373, -17.566149, 0.0055912733, 37.171875, -17.569721, 0.0055912137, 37.703354, -16.6714, 0.005591154, 38.18373, -17.569721, 0.0055912137, 37.703354, -17.572756, 0.005591154, 38.154984, -9.23255, 0.0055912137, 38.057865, -16.664772, 0.0055912733, 37.19757, -16.6714, 0.005591154, 38.18373, -9.23255, 0.0055912137, 38.057865, -9.226971, 0.0055912733, 37.227917, -16.664772, 0.0055912733, 37.19757, -17.56825, 0.371265, 37.48474, -17.486889, 0.23162824, 37.650238, -17.569721, 0.0055912137, 37.703354, -17.486889, 0.23162824, 37.650238, -17.570097, 0.371265, 37.75921, -17.569721, 0.0055912137, 37.703354, -17.566149, 0.0055912733, 37.171875, -17.56825, 0.371265, 37.48474, -17.569721, 0.0055912137, 37.703354, -17.566149, 0.0055912733, 37.171875, -17.566149, 0.371265, 37.171875, -17.56825, 0.371265, 37.48474, -17.570097, 0.371265, 37.75921, -17.572756, 0.005591154, 38.154984, -17.569721, 0.0055912137, 37.703354, -17.570097, 0.371265, 37.75921, -17.572756, 0.37126487, 38.154984, -17.572756, 0.005591154, 38.154984, -9.23255, 0.37126487, 38.057865, -9.226971, 0.0055912733, 37.227917, -9.23255, 0.0055912137, 38.057865, -9.226971, 0.0055912733, 37.227917, -9.23255, 0.37126487, 38.057865, -9.228367, 0.371265, 37.435623, -9.226971, 0.0055912733, 37.227917, -9.228367, 0.371265, 37.435623, -9.226971, 0.28006464, 37.227917, -16.810944, -3.458273, 47.519463, -17.46208, 1.270175, 47.59407, -17.54053, -3.458273, 47.51456, -16.810944, -3.458273, 47.519463, -16.890453, 1.270175, 47.59791, -17.46208, 1.270175, 47.59407, -16.890453, 1.270175, 47.59791, -17.465921, 1.270175, 48.165695, -17.46208, 1.270175, 47.59407, -16.890453, 1.270175, 47.59791, -16.894295, 1.270175, 48.16954, -17.465921, 1.270175, 48.165695, -16.894295, 1.270175, 48.16954, -17.545431, -3.458273, 48.24415, -17.465921, 1.270175, 48.165695, -16.894295, 1.270175, 48.16954, -16.815845, -3.458273, 48.24905, -17.545431, -3.458273, 48.24415, -16.815845, -3.458273, 48.24905, -17.54053, -3.458273, 47.51456, -17.545431, -3.458273, 48.24415, -16.815845, -3.458273, 48.24905, -16.810944, -3.458273, 47.519463, -17.54053, -3.458273, 47.51456, -17.54053, -3.458273, 47.51456, -17.465921, 1.270175, 48.165695, -17.545431, -3.458273, 48.24415, -17.54053, -3.458273, 47.51456, -17.46208, 1.270175, 47.59407, -17.465921, 1.270175, 48.165695, -16.815845, -3.458273, 48.24905, -16.890453, 1.270175, 47.59791, -16.810944, -3.458273, 47.519463, -16.815845, -3.458273, 48.24905, -16.894295, 1.270175, 48.16954, -16.890453, 1.270175, 47.59791, -9.055229, -3.45827, 22.581722, -9.785252, 1.2701778, 22.576817, -9.785252, -3.45827, 22.576817, -9.055229, -3.45827, 22.581722, -9.055229, 1.2701778, 22.581722, -9.785252, 1.2701778, 22.576817, -9.060133, -3.45827, 23.31131, -9.785252, -3.45827, 22.576817, -9.790155, -3.45827, 23.306404, -9.060133, -3.45827, 23.31131, -9.055229, -3.45827, 22.581722, -9.785252, -3.45827, 22.576817, -9.785252, -3.45827, 22.576817, -9.790155, 1.2701778, 23.306404, -9.790155, -3.45827, 23.306404, -9.785252, -3.45827, 22.576817, -9.785252, 1.2701778, 22.576817, -9.790155, 1.2701778, 23.306404, -9.060133, 0.08806592, 23.31131, -9.242529, 1.2701778, 23.310083, -9.058907, 1.2701778, 23.128912, -9.055229, -3.45827, 22.581722, -9.060133, 0.08806592, 23.31131, -9.058907, 1.2701778, 23.128912, -9.060133, 0.08806592, 23.31131, -9.055229, -3.45827, 22.581722, -9.060133, -3.45827, 23.31131, -9.055229, -3.45827, 22.581722, -9.058907, 1.2701778, 23.128912, -9.055229, 1.2701778, 22.581722, -9.058907, 1.2701778, 23.128912, -9.785252, 1.2701778, 22.576817, -9.055229, 1.2701778, 22.581722, -9.785252, 1.2701778, 22.576817, -9.058907, 1.2701778, 23.128912, -9.242529, 1.2701778, 23.310083, -9.785252, 1.2701778, 22.576817, -9.242529, 1.2701778, 23.310083, -9.790155, 1.2701778, 23.306404, -9.060133, -3.45827, 23.31131, -9.242529, 1.2701778, 23.310083, -9.060133, 0.08806592, 23.31131, -9.242529, 1.2701778, 23.310083, -9.060133, -3.45827, 23.31131, -9.790155, -3.45827, 23.306404, -9.242529, 1.2701778, 23.310083, -9.790155, -3.45827, 23.306404, -9.790155, 1.2701778, 23.306404, -13.449499, 0.0055915117, 35.369823, -17.5551, 0.37126523, 35.52769, -13.449499, 0.37126523, 35.369823, -13.449499, 0.0055915117, 35.369823, -17.5551, 0.0055915117, 35.52769, -17.5551, 0.37126523, 35.52769, -9.215921, 0.37126523, 35.583733, -13.449499, 0.0055915117, 35.369823, -13.449499, 0.37126523, 35.369823, -9.215921, 0.37126523, 35.583733, -9.215921, 0.005591452, 35.583733, -13.449499, 0.0055915117, 35.369823, -13.442921, 0.005591631, 34.39108, -17.5551, 0.0055915117, 35.52769, -13.449499, 0.0055915117, 35.369823, -13.442921, 0.005591631, 34.39108, -17.54952, 0.0055915713, 34.697742, -17.5551, 0.0055915117, 35.52769, -13.449499, 0.0055915117, 35.369823, -9.208305, 0.005591631, 34.45052, -13.442921, 0.005591631, 34.39108, -13.449499, 0.0055915117, 35.369823, -9.212177, 0.0055915713, 35.02651, -9.208305, 0.005591631, 34.45052, -9.212177, 0.0055915713, 35.02651, -13.449499, 0.0055915117, 35.369823, -9.215921, 0.005591452, 35.583733, -17.54952, 0.0055915713, 34.697742, -17.5551, 0.37126523, 35.52769, -17.5551, 0.0055915117, 35.52769, -17.54952, 0.0055915713, 34.697742, -17.54952, 0.37126535, 34.697742, -17.5551, 0.37126523, 35.52769, -9.212622, 0.37126523, 35.092834, -9.371677, 0.26217395, 34.99489, -9.212177, 0.0055915713, 35.02651, -13.444563, 0.37126535, 34.635437, -13.442921, 0.280065, 34.39108, -12.384375, 0.37126535, 34.40561, -13.444563, 0.37126535, 34.635437, -14.469788, 0.37126535, 34.467525, -13.442921, 0.280065, 34.39108, -13.444563, 0.37126535, 34.635437, -17.54952, 0.37126535, 34.697742, -14.469788, 0.37126535, 34.467525, -13.444563, 0.37126535, 34.635437, -17.5551, 0.37126523, 35.52769, -17.54952, 0.37126535, 34.697742, -17.5551, 0.37126523, 35.52769, -13.444563, 0.37126535, 34.635437, -13.449499, 0.37126523, 35.369823, -12.384375, 0.37126535, 34.40561, -13.449499, 0.37126523, 35.369823, -13.444563, 0.37126535, 34.635437, -13.449499, 0.37126523, 35.369823, -9.212622, 0.37126523, 35.092834, -9.215921, 0.37126523, 35.583733, -13.449499, 0.37126523, 35.369823, -9.939795, 0.37126523, 34.988453, -9.212622, 0.37126523, 35.092834, -12.384375, 0.37126535, 34.40561, -9.939795, 0.37126523, 34.988453, -13.449499, 0.37126523, 35.369823, -9.371677, 0.26217395, 34.99489, -9.212622, 0.37126523, 35.092834, -9.939795, 0.37126523, 34.988453, -9.21077, 0.37126535, 34.81706, -9.371677, 0.26217395, 34.99489, -9.939795, 0.37126523, 34.988453, -9.939795, 0.37126523, 34.988453, -12.384375, 0.37126535, 34.40561, -9.21077, 0.37126535, 34.81706, -9.21077, 0.37126535, 34.81706, -12.384375, 0.37126535, 34.40561, -9.208305, 0.37126535, 34.45052, -9.215921, 0.005591452, 35.583733, -9.212622, 0.37126523, 35.092834, -9.212177, 0.0055915713, 35.02651, -9.215921, 0.005591452, 35.583733, -9.215921, 0.37126523, 35.583733, -9.212622, 0.37126523, 35.092834, -9.21077, 0.37126535, 34.81706, -9.208305, 0.005591631, 34.45052, -9.212177, 0.0055915713, 35.02651, -9.21077, 0.37126535, 34.81706, -9.208305, 0.37126535, 34.45052, -9.208305, 0.005591631, 34.45052, -9.371677, 0.26217395, 34.99489, -9.21077, 0.37126535, 34.81706, -9.212177, 0.0055915713, 35.02651, -9.208305, 0.37126535, 34.45052, -13.442921, 0.005591631, 34.39108, -9.208305, 0.005591631, 34.45052, -13.442921, 0.005591631, 34.39108, -9.208305, 0.37126535, 34.45052, -12.384375, 0.37126535, 34.40561, -13.442921, 0.005591631, 34.39108, -12.384375, 0.37126535, 34.40561, -13.442921, 0.280065, 34.39108, -13.442921, 0.280065, 34.39108, -17.54952, 0.0055915713, 34.697742, -13.442921, 0.005591631, 34.39108, -13.442921, 0.280065, 34.39108, -17.54952, 0.37126535, 34.697742, -17.54952, 0.0055915713, 34.697742, -17.54952, 0.37126535, 34.697742, -13.442921, 0.280065, 34.39108, -14.469788, 0.37126535, 34.467525, -10.702703, 0.005590558, 43.383537, -17.802399, 0.37126428, 43.495537, -10.702703, 0.37126428, 43.383537, -10.702703, 0.005590558, 43.383537, -17.802399, 0.005590558, 43.495537, -17.802399, 0.37126428, 43.495537, -9.074274, 0.37126428, 43.401463, -10.702703, 0.005590558, 43.383537, -10.702703, 0.37126428, 43.383537, -9.074274, 0.37126428, 43.401463, -9.074274, 0.005590558, 43.401463, -10.702703, 0.005590558, 43.383537, -10.695927, 0.0055906773, 42.375122, -17.802399, 0.005590558, 43.495537, -10.702703, 0.005590558, 43.383537, -10.695927, 0.0055906773, 42.375122, -17.795794, 0.0055906773, 42.512863, -17.802399, 0.005590558, 43.495537, -9.074274, 0.005590558, 43.401463, -10.695927, 0.0055906773, 42.375122, -10.702703, 0.005590558, 43.383537, -9.074274, 0.005590558, 43.401463, -9.068697, 0.0055906773, 42.571514, -10.695927, 0.0055906773, 42.375122, -9.074274, 0.005590558, 43.401463, -9.068697, 0.3712644, 42.571514, -9.068697, 0.0055906773, 42.571514, -9.074274, 0.005590558, 43.401463, -9.074274, 0.37126428, 43.401463, -9.068697, 0.3712644, 42.571514, -10.697622, 0.3712644, 42.627335, -10.695927, 0.28006405, 42.375122, -10.289118, 0.3712644, 42.42411, -10.697622, 0.3712644, 42.627335, -12.470892, 0.3712644, 42.409447, -10.695927, 0.28006405, 42.375122, -10.697622, 0.3712644, 42.627335, -16.464678, 0.3712644, 42.4869, -12.470892, 0.3712644, 42.409447, -10.289118, 0.3712644, 42.42411, -10.702703, 0.37126428, 43.383537, -10.697622, 0.3712644, 42.627335, -10.289118, 0.3712644, 42.42411, -9.074274, 0.37126428, 43.401463, -10.702703, 0.37126428, 43.383537, -9.074274, 0.37126428, 43.401463, -10.289118, 0.3712644, 42.42411, -9.068697, 0.3712644, 42.571514, -17.802399, 0.37126428, 43.495537, -10.697622, 0.3712644, 42.627335, -10.702703, 0.37126428, 43.383537, -10.697622, 0.3712644, 42.627335, -17.802399, 0.37126428, 43.495537, -16.464678, 0.3712644, 42.4869, -16.464678, 0.3712644, 42.4869, -17.802399, 0.37126428, 43.495537, -17.797441, 0.3712644, 42.758095, -16.464678, 0.3712644, 42.4869, -17.797441, 0.3712644, 42.758095, -17.795794, 0.28006405, 42.512863, -9.068697, 0.3712644, 42.571514, -10.695927, 0.0055906773, 42.375122, -9.068697, 0.0055906773, 42.571514, -10.695927, 0.0055906773, 42.375122, -9.068697, 0.3712644, 42.571514, -10.289118, 0.3712644, 42.42411, -10.695927, 0.0055906773, 42.375122, -10.289118, 0.3712644, 42.42411, -10.695927, 0.28006405, 42.375122, -10.695927, 0.28006405, 42.375122, -17.795794, 0.0055906773, 42.512863, -10.695927, 0.0055906773, 42.375122, -10.695927, 0.28006405, 42.375122, -16.464678, 0.3712644, 42.4869, -17.795794, 0.0055906773, 42.512863, -17.795794, 0.0055906773, 42.512863, -16.464678, 0.3712644, 42.4869, -17.795794, 0.28006405, 42.512863, -16.464678, 0.3712644, 42.4869, -10.695927, 0.28006405, 42.375122, -12.470892, 0.3712644, 42.409447, -17.795794, 0.28006405, 42.512863, -17.802399, 0.005590558, 43.495537, -17.795794, 0.0055906773, 42.512863, -17.802399, 0.005590558, 43.495537, -17.795794, 0.28006405, 42.512863, -17.797441, 0.3712644, 42.758095, -17.802399, 0.005590558, 43.495537, -17.797441, 0.3712644, 42.758095, -17.802399, 0.37126428, 43.495537, -10.597399, 0.005591333, 36.740005, -17.854618, 0.371265, 36.850945, -10.597399, 0.3712651, 36.740005, -10.597399, 0.005591333, 36.740005, -17.854618, 0.005591333, 36.850945, -17.854618, 0.371265, 36.850945, -8.932753, 0.3712651, 36.758175, -10.597399, 0.005591333, 36.740005, -10.597399, 0.3712651, 36.740005, -8.932753, 0.3712651, 36.758175, -8.932753, 0.005591333, 36.758175, -10.597399, 0.005591333, 36.740005, -10.590622, 0.005591452, 35.73159, -17.854618, 0.005591333, 36.850945, -10.597399, 0.005591333, 36.740005, -10.590622, 0.005591452, 35.73159, -17.848013, 0.005591452, 35.868275, -17.854618, 0.005591333, 36.850945, -8.932753, 0.005591333, 36.758175, -10.590622, 0.005591452, 35.73159, -10.597399, 0.005591333, 36.740005, -8.932753, 0.005591333, 36.758175, -8.927174, 0.005591452, 35.928226, -10.590622, 0.005591452, 35.73159, -8.932753, 0.005591333, 36.758175, -8.927174, 0.3712651, 35.928226, -8.927174, 0.005591452, 35.928226, -8.932753, 0.005591333, 36.758175, -8.932753, 0.3712651, 36.758175, -8.927174, 0.3712651, 35.928226, -10.592318, 0.3712651, 35.983803, -10.590622, 0.28006488, 35.73159, -10.17465, 0.37126523, 35.78064, -10.592318, 0.3712651, 35.983803, -12.40486, 0.37126523, 35.76565, -10.590622, 0.28006488, 35.73159, -10.592318, 0.3712651, 35.983803, -16.487228, 0.3712651, 35.842945, -12.40486, 0.37126523, 35.76565, -10.17465, 0.37126523, 35.78064, -10.597399, 0.3712651, 36.740005, -10.592318, 0.3712651, 35.983803, -10.17465, 0.37126523, 35.78064, -8.932753, 0.3712651, 36.758175, -10.597399, 0.3712651, 36.740005, -8.932753, 0.3712651, 36.758175, -10.17465, 0.37126523, 35.78064, -8.927174, 0.3712651, 35.928226, -17.854618, 0.371265, 36.850945, -10.592318, 0.3712651, 35.983803, -10.597399, 0.3712651, 36.740005, -10.592318, 0.3712651, 35.983803, -17.854618, 0.371265, 36.850945, -16.487228, 0.3712651, 35.842945, -16.487228, 0.3712651, 35.842945, -17.854618, 0.371265, 36.850945, -17.849669, 0.3712651, 36.11438, -16.487228, 0.3712651, 35.842945, -17.849669, 0.3712651, 36.11438, -17.848013, 0.28006476, 35.868275, -8.927174, 0.3712651, 35.928226, -10.590622, 0.005591452, 35.73159, -8.927174, 0.005591452, 35.928226, -10.590622, 0.005591452, 35.73159, -8.927174, 0.3712651, 35.928226, -10.17465, 0.37126523, 35.78064, -10.590622, 0.005591452, 35.73159, -10.17465, 0.37126523, 35.78064, -10.590622, 0.28006488, 35.73159, -10.590622, 0.28006488, 35.73159, -17.848013, 0.005591452, 35.868275, -10.590622, 0.005591452, 35.73159, -10.590622, 0.28006488, 35.73159, -16.487228, 0.3712651, 35.842945, -17.848013, 0.005591452, 35.868275, -17.848013, 0.005591452, 35.868275, -16.487228, 0.3712651, 35.842945, -17.848013, 0.28006476, 35.868275, -16.487228, 0.3712651, 35.842945, -10.590622, 0.28006488, 35.73159, -12.40486, 0.37126523, 35.76565, -17.848013, 0.28006476, 35.868275, -17.854618, 0.005591333, 36.850945, -17.848013, 0.005591452, 35.868275, -17.854618, 0.005591333, 36.850945, -17.848013, 0.28006476, 35.868275, -17.849669, 0.3712651, 36.11438, -17.854618, 0.005591333, 36.850945, -17.849669, 0.3712651, 36.11438, -17.854618, 0.371265, 36.850945, -16.774326, -3.4582698, 22.20213, -17.504349, 1.2701781, 22.197224, -17.504349, -3.4582698, 22.197224, -16.774326, -3.4582698, 22.20213, -16.774326, 0.72166747, 22.20213, -17.504349, 1.2701781, 22.197224, -16.774326, 0.72166747, 22.20213, -17.509253, 1.2701778, 22.926807, -17.504349, 1.2701781, 22.197224, -16.774326, 0.72166747, 22.20213, -16.77923, 1.2701778, 22.931713, -17.509253, 1.2701778, 22.926807, -16.77923, 1.2701778, 22.931713, -17.509253, -3.45827, 22.926807, -17.509253, 1.2701778, 22.926807, -16.77923, 1.2701778, 22.931713, -16.77923, -3.45827, 22.931713, -17.509253, -3.45827, 22.926807, -16.77923, -3.45827, 22.931713, -17.504349, -3.4582698, 22.197224, -17.509253, -3.45827, 22.926807, -16.77923, -3.45827, 22.931713, -16.774326, -3.4582698, 22.20213, -17.504349, -3.4582698, 22.197224, -17.504349, -3.4582698, 22.197224, -17.509253, 1.2701778, 22.926807, -17.509253, -3.45827, 22.926807, -17.504349, -3.4582698, 22.197224, -17.504349, 1.2701781, 22.197224, -17.509253, 1.2701778, 22.926807, -16.77923, -3.45827, 22.931713, -16.774326, 0.72166747, 22.20213, -16.774326, -3.4582698, 22.20213, -16.77923, -3.45827, 22.931713, -16.77923, 1.2701778, 22.931713, -16.774326, 0.72166747, 22.20213, -16.92366, -0.19077104, 22.930307, -17.155365, -0.09826177, 22.928751, -17.155365, -0.19077104, 22.928751, -16.92366, -0.19077104, 22.930307, -16.92366, -0.09826177, 22.930307, -17.155365, -0.09826177, 22.928751, -16.92366, -0.09826177, 22.930307, -17.320957, -0.098264754, 47.5684, -17.155365, -0.09826177, 22.928751, -16.92366, -0.09826177, 22.930307, -17.089252, -0.098264754, 47.569958, -17.320957, -0.098264754, 47.5684, -17.089252, -0.098264754, 47.569958, -17.320957, -0.19077402, 47.5684, -17.320957, -0.098264754, 47.5684, -17.089252, -0.098264754, 47.569958, -17.089252, -0.19077402, 47.569958, -17.320957, -0.19077402, 47.5684, -17.089252, -0.19077402, 47.569958, -17.155365, -0.19077104, 22.928751, -17.320957, -0.19077402, 47.5684, -17.089252, -0.19077402, 47.569958, -16.92366, -0.19077104, 22.930307, -17.155365, -0.19077104, 22.928751, -17.155365, -0.19077104, 22.928751, -17.320957, -0.098264754, 47.5684, -17.320957, -0.19077402, 47.5684, -17.155365, -0.19077104, 22.928751, -17.155365, -0.09826177, 22.928751, -17.320957, -0.098264754, 47.5684, -17.089252, -0.19077402, 47.569958, -16.92366, -0.09826177, 22.930307, -16.92366, -0.19077104, 22.930307, -17.089252, -0.19077402, 47.569958, -17.089252, -0.098264754, 47.569958, -16.92366, -0.09826177, 22.930307, -9.130678, -2.9032154, 33.80826, -9.860701, 1.8252325, 33.803356, -9.860701, -2.9032154, 33.803352, -9.130678, -2.9032154, 33.80826, -9.130678, 1.8252325, 33.80826, -9.860701, 1.8252325, 33.803356, -9.135584, -2.9032154, 34.538284, -9.860701, -2.9032154, 33.803352, -9.865606, -2.9032154, 34.53338, -9.135584, -2.9032154, 34.538284, -9.130678, -2.9032154, 33.80826, -9.860701, -2.9032154, 33.803352, -9.860701, -2.9032154, 33.803352, -9.865606, 1.8252323, 34.53338, -9.865606, -2.9032154, 34.53338, -9.860701, -2.9032154, 33.803352, -9.860701, 1.8252325, 33.803356, -9.865606, 1.8252323, 34.53338, -9.135584, 0.64312047, 34.538284, -9.317982, 1.8252323, 34.537056, -9.134359, 1.8252323, 34.35589, -9.130678, -2.9032154, 33.80826, -9.135584, 0.64312047, 34.538284, -9.134359, 1.8252323, 34.35589, -9.135584, 0.64312047, 34.538284, -9.130678, -2.9032154, 33.80826, -9.135584, -2.9032154, 34.538284, -9.130678, -2.9032154, 33.80826, -9.134359, 1.8252323, 34.35589, -9.130678, 1.8252325, 33.80826, -9.134359, 1.8252323, 34.35589, -9.860701, 1.8252325, 33.803356, -9.130678, 1.8252325, 33.80826, -9.860701, 1.8252325, 33.803356, -9.134359, 1.8252323, 34.35589, -9.317982, 1.8252323, 34.537056, -9.860701, 1.8252325, 33.803356, -9.317982, 1.8252323, 34.537056, -9.865606, 1.8252323, 34.53338, -9.135584, -2.9032154, 34.538284, -9.317982, 1.8252323, 34.537056, -9.135584, 0.64312047, 34.538284, -9.317982, 1.8252323, 34.537056, -9.135584, -2.9032154, 34.538284, -9.865606, -2.9032154, 34.53338, -9.317982, 1.8252323, 34.537056, -9.865606, -2.9032154, 34.53338, -9.865606, 1.8252323, 34.53338, -9.18182, -3.7899094, 41.417854, -9.91184, 0.9385386, 41.41295, -9.91184, -3.7899094, 41.41295, -9.18182, -3.7899094, 41.417854, -9.18182, 0.9385386, 41.417854, -9.91184, 0.9385386, 41.41295, -9.186722, -3.7899094, 42.147438, -9.91184, -3.7899094, 41.41295, -9.916744, -3.7899094, 42.142532, -9.186722, -3.7899094, 42.147438, -9.18182, -3.7899094, 41.417854, -9.91184, -3.7899094, 41.41295, -9.91184, -3.7899094, 41.41295, -9.916744, 0.9385385, 42.142532, -9.916744, -3.7899094, 42.142532, -9.91184, -3.7899094, 41.41295, -9.91184, 0.9385386, 41.41295, -9.916744, 0.9385385, 42.142532, -9.186722, -0.24357355, 42.147438, -9.36912, 0.9385385, 42.146214, -9.185497, 0.9385385, 41.965042, -9.18182, -3.7899094, 41.417854, -9.186722, -0.24357355, 42.147438, -9.185497, 0.9385385, 41.965042, -9.186722, -0.24357355, 42.147438, -9.18182, -3.7899094, 41.417854, -9.186722, -3.7899094, 42.147438, -9.18182, -3.7899094, 41.417854, -9.185497, 0.9385385, 41.965042, -9.18182, 0.9385386, 41.417854, -9.185497, 0.9385385, 41.965042, -9.91184, 0.9385386, 41.41295, -9.18182, 0.9385386, 41.417854, -9.91184, 0.9385386, 41.41295, -9.185497, 0.9385385, 41.965042, -9.36912, 0.9385385, 42.146214, -9.91184, 0.9385386, 41.41295, -9.36912, 0.9385385, 42.146214, -9.916744, 0.9385385, 42.142532, -9.186722, -3.7899094, 42.147438, -9.36912, 0.9385385, 42.146214, -9.186722, -0.24357355, 42.147438, -9.36912, 0.9385385, 42.146214, -9.186722, -3.7899094, 42.147438, -9.916744, -3.7899094, 42.142532, -9.36912, 0.9385385, 42.146214, -9.916744, -3.7899094, 42.142532, -9.916744, 0.9385385, 42.142532, -17.459593, -3.5494714, 33.653664, -18.189178, 1.1789763, 33.64876, -18.189178, -3.5494714, 33.64876, -17.459593, -3.5494714, 33.653664, -17.459593, 1.1789763, 33.653664, -18.189178, 1.1789763, 33.64876, -17.4645, -3.5494716, 34.383686, -18.189178, -3.5494714, 33.64876, -18.194086, -3.5494716, 34.378784, -17.4645, -3.5494716, 34.383686, -17.459593, -3.5494714, 33.653664, -18.189178, -3.5494714, 33.64876, -18.189178, -3.5494714, 33.64876, -18.194086, 1.178976, 34.378784, -18.194086, -3.5494716, 34.378784, -18.189178, -3.5494714, 33.64876, -18.189178, 1.1789763, 33.64876, -18.194086, 1.178976, 34.378784, -17.4645, -0.0031356215, 34.383686, -17.646896, 1.178976, 34.38246, -17.463274, 1.1789763, 34.20129, -17.459593, -3.5494714, 33.653664, -17.4645, -0.0031356215, 34.383686, -17.463274, 1.1789763, 34.20129, -17.4645, -0.0031356215, 34.383686, -17.459593, -3.5494714, 33.653664, -17.4645, -3.5494716, 34.383686, -17.459593, -3.5494714, 33.653664, -17.463274, 1.1789763, 34.20129, -17.459593, 1.1789763, 33.653664, -17.463274, 1.1789763, 34.20129, -18.189178, 1.1789763, 33.64876, -17.459593, 1.1789763, 33.653664, -18.189178, 1.1789763, 33.64876, -17.463274, 1.1789763, 34.20129, -17.646896, 1.178976, 34.38246, -18.189178, 1.1789763, 33.64876, -17.646896, 1.178976, 34.38246, -18.194086, 1.178976, 34.378784, -17.4645, -3.5494716, 34.383686, -17.646896, 1.178976, 34.38246, -17.4645, -0.0031356215, 34.383686, -17.646896, 1.178976, 34.38246, -17.4645, -3.5494716, 34.383686, -18.194086, -3.5494716, 34.378784, -17.646896, 1.178976, 34.38246, -18.194086, -3.5494716, 34.378784, -18.194086, 1.178976, 34.378784, -17.511396, -3.5494723, 41.361874, -18.240982, 1.1789753, 41.35697, -18.240982, -3.5494723, 41.35697, -17.511396, -3.5494723, 41.361874, -17.511396, 1.1789753, 41.361874, -18.240982, 1.1789753, 41.35697, -17.5163, -3.5494723, 42.09146, -18.240982, -3.5494723, 41.35697, -18.245886, -3.5494723, 42.086555, -17.5163, -3.5494723, 42.09146, -17.511396, -3.5494723, 41.361874, -18.240982, -3.5494723, 41.35697, -18.240982, -3.5494723, 41.35697, -18.245886, 1.1789753, 42.086555, -18.245886, -3.5494723, 42.086555, -18.240982, -3.5494723, 41.35697, -18.240982, 1.1789753, 41.35697, -18.245886, 1.1789753, 42.086555, -17.5163, -0.0031365752, 42.09146, -17.698698, 1.1789753, 42.090233, -17.515074, 1.1789753, 41.909065, -17.511396, -3.5494723, 41.361874, -17.5163, -0.0031365752, 42.09146, -17.515074, 1.1789753, 41.909065, -17.5163, -0.0031365752, 42.09146, -17.511396, -3.5494723, 41.361874, -17.5163, -3.5494723, 42.09146, -17.511396, -3.5494723, 41.361874, -17.515074, 1.1789753, 41.909065, -17.511396, 1.1789753, 41.361874, -17.515074, 1.1789753, 41.909065, -18.240982, 1.1789753, 41.35697, -17.511396, 1.1789753, 41.361874, -18.240982, 1.1789753, 41.35697, -17.515074, 1.1789753, 41.909065, -17.698698, 1.1789753, 42.090233, -18.240982, 1.1789753, 41.35697, -17.698698, 1.1789753, 42.090233, -18.245886, 1.1789753, 42.086555, -17.5163, -3.5494723, 42.09146, -17.698698, 1.1789753, 42.090233, -17.5163, -0.0031365752, 42.09146, -17.698698, 1.1789753, 42.090233, -17.5163, -3.5494723, 42.09146, -18.245886, -3.5494723, 42.086555, -17.698698, 1.1789753, 42.090233, -18.245886, -3.5494723, 42.086555, -18.245886, 1.1789753, 42.086555, -12.414185, -22.456995, 9.651152, -10.526909, -22.242655, 9.475412, -12.414185, -22.326996, 9.5211525, -12.414185, -22.456995, 9.651152, -10.526909, -22.391994, 9.624752, -10.526909, -22.242655, 9.475412, -19.07084, -22.391996, 9.624752, -12.414185, -22.456995, 9.651152, -12.414185, -22.326996, 9.5211525, -19.07084, -22.391996, 9.624752, -12.414185, -22.326996, 9.5211525, -19.07084, -22.242657, 9.475412, -12.414185, -22.326996, 9.5211525, -10.526909, -22.03864, 9.420736, -12.414185, -22.14938, 9.473576, -12.414185, -22.326996, 9.5211525, -10.526909, -22.242655, 9.475412, -10.526909, -22.03864, 9.420736, -19.07084, -22.242657, 9.475412, -12.414185, -22.326996, 9.5211525, -12.414185, -22.14938, 9.473576, -19.07084, -22.242657, 9.475412, -12.414185, -22.14938, 9.473576, -19.07084, -22.03864, 9.420735, -12.414185, -22.14938, 9.473576, -10.526909, -21.834621, 9.475412, -12.414185, -21.971802, 9.5211525, -12.414185, -22.14938, 9.473576, -10.526909, -22.03864, 9.420736, -10.526909, -21.834621, 9.475412, -19.07084, -22.03864, 9.420735, -12.414185, -22.14938, 9.473576, -12.414185, -21.971802, 9.5211525, -19.07084, -22.03864, 9.420735, -12.414185, -21.971802, 9.5211525, -19.07084, -21.834623, 9.475412, -12.414185, -21.971802, 9.5211525, -10.526909, -21.685282, 9.624752, -12.414185, -21.841803, 9.651152, -12.414185, -21.971802, 9.5211525, -10.526909, -21.834621, 9.475412, -10.526909, -21.685282, 9.624752, -19.07084, -21.834623, 9.475412, -12.414185, -21.971802, 9.5211525, -12.414185, -21.841803, 9.651152, -19.07084, -21.834623, 9.475412, -12.414185, -21.841803, 9.651152, -19.07084, -21.685282, 9.624752, -12.414185, -21.841803, 9.651152, -10.526909, -21.630606, 9.82877, -12.414185, -21.794186, 9.82877, -12.414185, -21.841803, 9.651152, -10.526909, -21.685282, 9.624752, -10.526909, -21.630606, 9.82877, -19.07084, -21.685282, 9.624752, -12.414185, -21.841803, 9.651152, -12.414185, -21.794186, 9.82877, -19.07084, -21.685282, 9.624752, -12.414185, -21.794186, 9.82877, -19.07084, -21.630606, 9.828769, -12.414185, -21.794186, 9.82877, -10.526909, -21.685282, 10.032785, -12.414185, -21.841803, 10.006346, -12.414185, -21.794186, 9.82877, -10.526909, -21.630606, 9.82877, -10.526909, -21.685282, 10.032785, -19.07084, -21.630606, 9.828769, -12.414185, -21.794186, 9.82877, -12.414185, -21.841803, 10.006346, -19.07084, -21.630606, 9.828769, -12.414185, -21.841803, 10.006346, -19.07084, -21.685282, 10.032785, -12.414185, -21.841803, 10.006346, -10.526909, -21.834621, 10.182125, -12.414185, -21.971802, 10.136345, -12.414185, -21.841803, 10.006346, -10.526909, -21.685282, 10.032785, -10.526909, -21.834621, 10.182125, -19.07084, -21.685282, 10.032785, -12.414185, -21.841803, 10.006346, -12.414185, -21.971802, 10.136345, -19.07084, -21.685282, 10.032785, -12.414185, -21.971802, 10.136345, -19.07084, -21.834623, 10.182125, -12.414185, -21.971802, 10.136345, -10.526909, -22.03864, 10.236803, -12.414185, -22.149378, 10.183962, -12.414185, -21.971802, 10.136345, -10.526909, -21.834621, 10.182125, -10.526909, -22.03864, 10.236803, -19.07084, -21.834623, 10.182125, -12.414185, -21.971802, 10.136345, -12.414185, -22.149378, 10.183962, -19.07084, -21.834623, 10.182125, -12.414185, -22.149378, 10.183962, -19.07084, -22.03864, 10.236801, -12.414185, -22.149378, 10.183962, -10.526909, -22.242655, 10.182125, -12.414185, -22.326996, 10.136345, -12.414185, -22.149378, 10.183962, -10.526909, -22.03864, 10.236803, -10.526909, -22.242655, 10.182125, -19.07084, -22.03864, 10.236801, -12.414185, -22.149378, 10.183962, -12.414185, -22.326996, 10.136345, -19.07084, -22.03864, 10.236801, -12.414185, -22.326996, 10.136345, -19.07084, -22.242657, 10.182125, -12.414185, -22.326996, 10.136345, -10.526909, -22.391994, 10.032785, -12.414185, -22.456995, 10.006346, -12.414185, -22.326996, 10.136345, -10.526909, -22.242655, 10.182125, -10.526909, -22.391994, 10.032785, -19.07084, -22.242657, 10.182125, -12.414185, -22.326996, 10.136345, -12.414185, -22.456995, 10.006346, -19.07084, -22.242657, 10.182125, -12.414185, -22.456995, 10.006346, -19.07084, -22.391996, 10.032785, -12.414185, -22.456995, 10.006346, -10.526909, -22.446672, 9.82877, -12.414185, -22.504572, 9.82877, -12.414185, -22.456995, 10.006346, -10.526909, -22.391994, 10.032785, -10.526909, -22.446672, 9.82877, -19.07084, -22.391996, 10.032785, -12.414185, -22.456995, 10.006346, -12.414185, -22.504572, 9.82877, -19.07084, -22.391996, 10.032785, -12.414185, -22.504572, 9.82877, -19.07084, -22.446672, 9.828769, -12.414185, -22.504572, 9.82877, -10.526909, -22.391994, 9.624752, -12.414185, -22.456995, 9.651152, -12.414185, -22.504572, 9.82877, -10.526909, -22.446672, 9.82877, -10.526909, -22.391994, 9.624752, -19.07084, -22.446672, 9.828769, -12.414185, -22.504572, 9.82877, -12.414185, -22.456995, 9.651152, -19.07084, -22.446672, 9.828769, -12.414185, -22.456995, 9.651152, -19.07084, -22.391996, 9.624752, -19.07084, -22.242657, 9.475412, -19.693949, -22.03864, 9.828769, -19.07084, -22.391996, 9.624752, -19.07084, -22.391996, 9.624752, -19.693949, -22.03864, 9.828769, -19.07084, -22.446672, 9.828769, -19.07084, -22.446672, 9.828769, -19.693949, -22.03864, 9.828769, -19.07084, -22.391996, 10.032785, -19.07084, -22.391996, 10.032785, -19.693949, -22.03864, 9.828769, -19.07084, -22.242657, 10.182125, -19.07084, -22.03864, 9.420735, -19.693949, -22.03864, 9.828769, -19.07084, -22.242657, 9.475412, -19.07084, -21.834623, 9.475412, -19.693949, -22.03864, 9.828769, -19.07084, -22.03864, 9.420735, -19.07084, -21.685282, 9.624752, -19.693949, -22.03864, 9.828769, -19.07084, -21.834623, 9.475412, -19.07084, -21.630606, 9.828769, -19.693949, -22.03864, 9.828769, -19.07084, -21.685282, 9.624752, -19.07084, -21.685282, 10.032785, -19.693949, -22.03864, 9.828769, -19.07084, -21.630606, 9.828769, -19.07084, -21.834623, 10.182125, -19.693949, -22.03864, 9.828769, -19.07084, -21.685282, 10.032785, -19.07084, -22.03864, 10.236801, -19.693949, -22.03864, 9.828769, -19.07084, -21.834623, 10.182125, -19.07084, -22.242657, 10.182125, -19.693949, -22.03864, 9.828769, -19.07084, -22.03864, 10.236801, -10.526909, -22.391994, 9.624752, -9.89662, -22.03864, 9.82877, -10.526909, -22.242655, 9.475412, -10.526909, -22.446672, 9.82877, -9.89662, -22.03864, 9.82877, -10.526909, -22.391994, 9.624752, -10.526909, -22.391994, 10.032785, -9.89662, -22.03864, 9.82877, -10.526909, -22.446672, 9.82877, -10.526909, -22.242655, 10.182125, -9.89662, -22.03864, 9.82877, -10.526909, -22.391994, 10.032785, -10.526909, -22.242655, 9.475412, -9.89662, -22.03864, 9.82877, -10.526909, -22.03864, 9.420736, -10.526909, -22.03864, 9.420736, -9.89662, -22.03864, 9.82877, -10.526909, -21.834621, 9.475412, -10.526909, -21.834621, 9.475412, -9.89662, -22.03864, 9.82877, -10.526909, -21.685282, 9.624752, -10.526909, -21.685282, 9.624752, -9.89662, -22.03864, 9.82877, -10.526909, -21.630606, 9.82877, -10.526909, -21.630606, 9.82877, -9.89662, -22.03864, 9.82877, -10.526909, -21.685282, 10.032785, -10.526909, -21.685282, 10.032785, -9.89662, -22.03864, 9.82877, -10.526909, -21.834621, 10.182125, -10.526909, -21.834621, 10.182125, -9.89662, -22.03864, 9.82877, -10.526909, -22.03864, 10.236803, -10.526909, -22.03864, 10.236803, -9.89662, -22.03864, 9.82877, -10.526909, -22.242655, 10.182125, -14.262087, -22.348663, 7.7697797, -10.526909, -22.242655, 7.6348023, -14.262087, -22.188835, 7.609912, -14.262087, -22.348663, 7.7697797, -10.526909, -22.391994, 7.7841425, -10.526909, -22.242655, 7.6348023, -19.07084, -22.391996, 7.784142, -14.262087, -22.348663, 7.7697797, -14.262087, -22.188835, 7.609912, -19.07084, -22.391996, 7.784142, -14.262087, -22.188835, 7.609912, -19.07084, -22.242657, 7.634802, -14.262087, -22.188835, 7.609912, -10.526909, -22.03864, 7.580126, -14.262087, -21.970457, 7.5514, -14.262087, -22.188835, 7.609912, -10.526909, -22.242655, 7.6348023, -10.526909, -22.03864, 7.580126, -19.07084, -22.242657, 7.634802, -14.262087, -22.188835, 7.609912, -14.262087, -21.970457, 7.5514, -19.07084, -22.242657, 7.634802, -14.262087, -21.970457, 7.5514, -19.07084, -22.03864, 7.5801253, -14.262087, -21.970457, 7.5514, -10.526909, -21.834621, 7.6348023, -14.262087, -21.752077, 7.609912, -14.262087, -21.970457, 7.5514, -10.526909, -22.03864, 7.580126, -10.526909, -21.834621, 7.6348023, -19.07084, -22.03864, 7.5801253, -14.262087, -21.970457, 7.5514, -14.262087, -21.752077, 7.609912, -19.07084, -22.03864, 7.5801253, -14.262087, -21.752077, 7.609912, -19.07084, -21.834623, 7.634802, -14.262087, -21.752077, 7.609912, -10.526909, -21.685282, 7.7841425, -14.262087, -21.592209, 7.769779, -14.262087, -21.752077, 7.609912, -10.526909, -21.834621, 7.6348023, -10.526909, -21.685282, 7.7841425, -19.07084, -21.834623, 7.634802, -14.262087, -21.752077, 7.609912, -14.262087, -21.592209, 7.769779, -19.07084, -21.834623, 7.634802, -14.262087, -21.592209, 7.769779, -19.07084, -21.685282, 7.784142, -14.262087, -21.592209, 7.769779, -10.526909, -21.630606, 7.988159, -14.262087, -21.533697, 7.9881587, -14.262087, -21.592209, 7.769779, -10.526909, -21.685282, 7.7841425, -10.526909, -21.630606, 7.988159, -19.07084, -21.685282, 7.784142, -14.262087, -21.592209, 7.769779, -14.262087, -21.533697, 7.9881587, -19.07084, -21.685282, 7.784142, -14.262087, -21.533697, 7.9881587, -19.07084, -21.630606, 7.9881587, -14.262087, -21.533697, 7.9881587, -10.526909, -21.685282, 8.192176, -14.262087, -21.592209, 8.206538, -14.262087, -21.533697, 7.9881587, -10.526909, -21.630606, 7.988159, -10.526909, -21.685282, 8.192176, -19.07084, -21.630606, 7.9881587, -14.262087, -21.533697, 7.9881587, -14.262087, -21.592209, 8.206538, -19.07084, -21.630606, 7.9881587, -14.262087, -21.592209, 8.206538, -19.07084, -21.685282, 8.192175, -14.262087, -21.592209, 8.206538, -10.526909, -21.834621, 8.3415165, -14.262087, -21.752077, 8.366365, -14.262087, -21.592209, 8.206538, -10.526909, -21.685282, 8.192176, -10.526909, -21.834621, 8.3415165, -19.07084, -21.685282, 8.192175, -14.262087, -21.592209, 8.206538, -14.262087, -21.752077, 8.366365, -19.07084, -21.685282, 8.192175, -14.262087, -21.752077, 8.366365, -19.07084, -21.834623, 8.341516, -14.262087, -21.752077, 8.366365, -10.526909, -22.03864, 8.396193, -14.262087, -21.970457, 8.424917, -14.262087, -21.752077, 8.366365, -10.526909, -21.834621, 8.3415165, -10.526909, -22.03864, 8.396193, -19.07084, -21.834623, 8.341516, -14.262087, -21.752077, 8.366365, -14.262087, -21.970457, 8.424917, -19.07084, -21.834623, 8.341516, -14.262087, -21.970457, 8.424917, -19.07084, -22.03864, 8.396193, -14.262087, -21.970457, 8.424917, -10.526909, -22.242655, 8.3415165, -14.262087, -22.188835, 8.366365, -14.262087, -21.970457, 8.424917, -10.526909, -22.03864, 8.396193, -10.526909, -22.242655, 8.3415165, -19.07084, -22.03864, 8.396193, -14.262087, -21.970457, 8.424917, -14.262087, -22.188835, 8.366365, -19.07084, -22.03864, 8.396193, -14.262087, -22.188835, 8.366365, -19.07084, -22.242657, 8.341516, -14.262087, -22.188835, 8.366365, -10.526909, -22.391994, 8.192176, -14.262087, -22.348663, 8.206538, -14.262087, -22.188835, 8.366365, -10.526909, -22.242655, 8.3415165, -10.526909, -22.391994, 8.192176, -19.07084, -22.242657, 8.341516, -14.262087, -22.188835, 8.366365, -14.262087, -22.348663, 8.206538, -19.07084, -22.242657, 8.341516, -14.262087, -22.348663, 8.206538, -19.07084, -22.391996, 8.192175, -14.262087, -22.348663, 8.206538, -10.526909, -22.446672, 7.988159, -14.262087, -22.407175, 7.9881587, -14.262087, -22.348663, 8.206538, -10.526909, -22.391994, 8.192176, -10.526909, -22.446672, 7.988159, -19.07084, -22.391996, 8.192175, -14.262087, -22.348663, 8.206538, -14.262087, -22.407175, 7.9881587, -19.07084, -22.391996, 8.192175, -14.262087, -22.407175, 7.9881587, -19.07084, -22.446672, 7.9881587, -14.262087, -22.407175, 7.9881587, -10.526909, -22.391994, 7.7841425, -14.262087, -22.348663, 7.7697797, -14.262087, -22.407175, 7.9881587, -10.526909, -22.446672, 7.988159, -10.526909, -22.391994, 7.7841425, -19.07084, -22.446672, 7.9881587, -14.262087, -22.407175, 7.9881587, -14.262087, -22.348663, 7.7697797, -19.07084, -22.446672, 7.9881587, -14.262087, -22.348663, 7.7697797, -19.07084, -22.391996, 7.784142, -19.07084, -22.242657, 7.634802, -19.693949, -22.03864, 7.9881587, -19.07084, -22.391996, 7.784142, -19.07084, -22.391996, 7.784142, -19.693949, -22.03864, 7.9881587, -19.07084, -22.446672, 7.9881587, -19.07084, -22.446672, 7.9881587, -19.693949, -22.03864, 7.9881587, -19.07084, -22.391996, 8.192175, -19.07084, -22.391996, 8.192175, -19.693949, -22.03864, 7.9881587, -19.07084, -22.242657, 8.341516, -19.07084, -22.03864, 7.5801253, -19.693949, -22.03864, 7.9881587, -19.07084, -22.242657, 7.634802, -19.07084, -21.834623, 7.634802, -19.693949, -22.03864, 7.9881587, -19.07084, -22.03864, 7.5801253, -19.07084, -21.685282, 7.784142, -19.693949, -22.03864, 7.9881587, -19.07084, -21.834623, 7.634802, -19.07084, -21.630606, 7.9881587, -19.693949, -22.03864, 7.9881587, -19.07084, -21.685282, 7.784142, -19.07084, -21.685282, 8.192175, -19.693949, -22.03864, 7.9881587, -19.07084, -21.630606, 7.9881587, -19.07084, -21.834623, 8.341516, -19.693949, -22.03864, 7.9881587, -19.07084, -21.685282, 8.192175, -19.07084, -22.03864, 8.396193, -19.693949, -22.03864, 7.9881587, -19.07084, -21.834623, 8.341516, -19.07084, -22.242657, 8.341516, -19.693949, -22.03864, 7.9881587, -19.07084, -22.03864, 8.396193, -10.526909, -22.391994, 7.7841425, -9.89662, -22.03864, 7.988159, -10.526909, -22.242655, 7.6348023, -10.526909, -22.446672, 7.988159, -9.89662, -22.03864, 7.988159, -10.526909, -22.391994, 7.7841425, -10.526909, -22.391994, 8.192176, -9.89662, -22.03864, 7.988159, -10.526909, -22.446672, 7.988159, -10.526909, -22.242655, 8.3415165, -9.89662, -22.03864, 7.988159, -10.526909, -22.391994, 8.192176, -10.526909, -22.242655, 7.6348023, -9.89662, -22.03864, 7.988159, -10.526909, -22.03864, 7.580126, -10.526909, -22.03864, 7.580126, -9.89662, -22.03864, 7.988159, -10.526909, -21.834621, 7.6348023, -10.526909, -21.834621, 7.6348023, -9.89662, -22.03864, 7.988159, -10.526909, -21.685282, 7.7841425, -10.526909, -21.685282, 7.7841425, -9.89662, -22.03864, 7.988159, -10.526909, -21.630606, 7.988159, -10.526909, -21.630606, 7.988159, -9.89662, -22.03864, 7.988159, -10.526909, -21.685282, 8.192176, -10.526909, -21.685282, 8.192176, -9.89662, -22.03864, 7.988159, -10.526909, -21.834621, 8.3415165, -10.526909, -21.834621, 8.3415165, -9.89662, -22.03864, 7.988159, -10.526909, -22.03864, 8.396193, -10.526909, -22.03864, 8.396193, -9.89662, -22.03864, 7.988159, -10.526909, -22.242655, 8.3415165, -12.004166, -22.046726, 10.088959, -12.124956, -19.902678, 9.968168, -12.124956, -22.046726, 9.968168, -12.004166, -22.046726, 10.088959, -12.004166, -19.902678, 10.088959, -12.124956, -19.902678, 9.968168, -12.124956, -22.046726, 9.968168, -12.28997, -19.902678, 9.923944, -12.28997, -22.046726, 9.923944, -12.124956, -22.046726, 9.968168, -12.124956, -19.902678, 9.968168, -12.28997, -19.902678, 9.923944, -12.28997, -22.046726, 9.923944, -12.454985, -19.902678, 9.968168, -12.454985, -22.046726, 9.968168, -12.28997, -22.046726, 9.923944, -12.28997, -19.902678, 9.923944, -12.454985, -19.902678, 9.968168, -12.454985, -22.046726, 9.968168, -12.575773, -19.902678, 10.088959, -12.575773, -22.046726, 10.088959, -12.454985, -22.046726, 9.968168, -12.454985, -19.902678, 9.968168, -12.575773, -19.902678, 10.088959, -12.575773, -22.046726, 10.088959, -12.619997, -19.902678, 10.253973, -12.619997, -22.046726, 10.253973, -12.575773, -22.046726, 10.088959, -12.575773, -19.902678, 10.088959, -12.619997, -19.902678, 10.253973, -12.619997, -22.046726, 10.253973, -12.575773, -19.902678, 10.418985, -12.575773, -22.046726, 10.418987, -12.619997, -22.046726, 10.253973, -12.619997, -19.902678, 10.253973, -12.575773, -19.902678, 10.418985, -12.575773, -22.046726, 10.418987, -12.454985, -19.902678, 10.539776, -12.454985, -22.046726, 10.539778, -12.575773, -22.046726, 10.418987, -12.575773, -19.902678, 10.418985, -12.454985, -19.902678, 10.539776, -12.454985, -22.046726, 10.539778, -12.28997, -19.902678, 10.584, -12.28997, -22.046726, 10.584002, -12.454985, -22.046726, 10.539778, -12.454985, -19.902678, 10.539776, -12.28997, -19.902678, 10.584, -12.28997, -22.046726, 10.584002, -12.124956, -19.902678, 10.539776, -12.124956, -22.046726, 10.539778, -12.28997, -22.046726, 10.584002, -12.28997, -19.902678, 10.584, -12.124956, -19.902678, 10.539776, -12.124956, -22.046726, 10.539778, -12.004166, -19.902678, 10.418985, -12.004166, -22.046726, 10.418987, -12.124956, -22.046726, 10.539778, -12.124956, -19.902678, 10.539776, -12.004166, -19.902678, 10.418985, -12.004166, -22.046726, 10.418987, -11.959942, -19.902678, 10.253973, -11.959942, -22.046726, 10.253973, -12.004166, -22.046726, 10.418987, -12.004166, -19.902678, 10.418985, -11.959942, -19.902678, 10.253973, -11.959942, -22.046726, 10.253973, -12.004166, -19.902678, 10.088959, -12.004166, -22.046726, 10.088959, -11.959942, -22.046726, 10.253973, -11.959942, -19.902678, 10.253973, -12.004166, -19.902678, 10.088959, -12.124956, -22.046726, 9.968168, -12.28997, -22.046726, 10.253973, -12.004166, -22.046726, 10.088959, -12.004166, -22.046726, 10.088959, -12.28997, -22.046726, 10.253973, -11.959942, -22.046726, 10.253973, -12.28997, -22.046726, 9.923944, -12.28997, -22.046726, 10.253973, -12.124956, -22.046726, 9.968168, -11.959942, -22.046726, 10.253973, -12.28997, -22.046726, 10.253973, -12.004166, -22.046726, 10.418987, -12.454985, -22.046726, 9.968168, -12.28997, -22.046726, 10.253973, -12.28997, -22.046726, 9.923944, -12.004166, -22.046726, 10.418987, -12.28997, -22.046726, 10.253973, -12.124956, -22.046726, 10.539778, -12.575773, -22.046726, 10.088959, -12.28997, -22.046726, 10.253973, -12.454985, -22.046726, 9.968168, -12.124956, -22.046726, 10.539778, -12.28997, -22.046726, 10.253973, -12.28997, -22.046726, 10.584002, -12.619997, -22.046726, 10.253973, -12.28997, -22.046726, 10.253973, -12.575773, -22.046726, 10.088959, -12.28997, -22.046726, 10.584002, -12.28997, -22.046726, 10.253973, -12.454985, -22.046726, 10.539778, -12.575773, -22.046726, 10.418987, -12.28997, -22.046726, 10.253973, -12.619997, -22.046726, 10.253973, -12.454985, -22.046726, 10.539778, -12.28997, -22.046726, 10.253973, -12.575773, -22.046726, 10.418987, -12.004166, -19.902678, 10.088959, -12.28997, -19.456135, 10.253971, -12.124956, -19.902678, 9.968168, -12.124956, -19.902678, 9.968168, -12.28997, -19.456135, 10.253971, -12.28997, -19.902678, 9.923944, -11.959942, -19.902678, 10.253973, -12.28997, -19.456135, 10.253971, -12.004166, -19.902678, 10.088959, -12.28997, -19.902678, 9.923944, -12.28997, -19.456135, 10.253971, -12.454985, -19.902678, 9.968168, -12.004166, -19.902678, 10.418985, -12.28997, -19.456135, 10.253971, -11.959942, -19.902678, 10.253973, -12.454985, -19.902678, 9.968168, -12.28997, -19.456135, 10.253971, -12.575773, -19.902678, 10.088959, -12.124956, -19.902678, 10.539776, -12.28997, -19.456135, 10.253971, -12.004166, -19.902678, 10.418985, -12.575773, -19.902678, 10.088959, -12.28997, -19.456135, 10.253971, -12.619997, -19.902678, 10.253973, -12.28997, -19.902678, 10.584, -12.28997, -19.456135, 10.253971, -12.124956, -19.902678, 10.539776, -12.619997, -19.902678, 10.253973, -12.28997, -19.456135, 10.253971, -12.575773, -19.902678, 10.418985, -12.454985, -19.902678, 10.539776, -12.28997, -19.456135, 10.253971, -12.28997, -19.902678, 10.584, -12.575773, -19.902678, 10.418985, -12.28997, -19.456135, 10.253971, -12.454985, -19.902678, 10.539776, -12.004166, -22.046726, 6.859756, -12.124956, -19.902678, 6.7389646, -12.124956, -22.046726, 6.7389655, -12.004166, -22.046726, 6.859756, -12.004166, -19.902678, 6.859755, -12.124956, -19.902678, 6.7389646, -12.124956, -22.046726, 6.7389655, -12.28997, -19.902678, 6.6947412, -12.28997, -22.046726, 6.6947417, -12.124956, -22.046726, 6.7389655, -12.124956, -19.902678, 6.7389646, -12.28997, -19.902678, 6.6947412, -12.28997, -22.046726, 6.6947417, -12.454985, -19.902678, 6.7389646, -12.454985, -22.046726, 6.7389655, -12.28997, -22.046726, 6.6947417, -12.28997, -19.902678, 6.6947412, -12.454985, -19.902678, 6.7389646, -12.454985, -22.046726, 6.7389655, -12.575773, -19.902678, 6.859755, -12.575773, -22.046726, 6.859756, -12.454985, -22.046726, 6.7389655, -12.454985, -19.902678, 6.7389646, -12.575773, -19.902678, 6.859755, -12.575773, -22.046726, 6.859756, -12.619997, -19.902678, 7.024769, -12.619997, -22.046726, 7.02477, -12.575773, -22.046726, 6.859756, -12.575773, -19.902678, 6.859755, -12.619997, -19.902678, 7.024769, -12.619997, -22.046726, 7.02477, -12.575773, -19.902678, 7.1897826, -12.575773, -22.046726, 7.1897836, -12.619997, -22.046726, 7.02477, -12.619997, -19.902678, 7.024769, -12.575773, -19.902678, 7.1897826, -12.575773, -22.046726, 7.1897836, -12.454985, -19.902678, 7.310573, -12.454985, -22.046726, 7.3105736, -12.575773, -22.046726, 7.1897836, -12.575773, -19.902678, 7.1897826, -12.454985, -19.902678, 7.310573, -12.454985, -22.046726, 7.3105736, -12.28997, -19.902678, 7.354797, -12.28997, -22.046726, 7.3547974, -12.454985, -22.046726, 7.3105736, -12.454985, -19.902678, 7.310573, -12.28997, -19.902678, 7.354797, -12.28997, -22.046726, 7.3547974, -12.124956, -19.902678, 7.310573, -12.124956, -22.046726, 7.3105736, -12.28997, -22.046726, 7.3547974, -12.28997, -19.902678, 7.354797, -12.124956, -19.902678, 7.310573, -12.124956, -22.046726, 7.3105736, -12.004166, -19.902678, 7.1897826, -12.004166, -22.046726, 7.1897836, -12.124956, -22.046726, 7.3105736, -12.124956, -19.902678, 7.310573, -12.004166, -19.902678, 7.1897826, -12.004166, -22.046726, 7.1897836, -11.959942, -19.902678, 7.024769, -11.959942, -22.046726, 7.02477, -12.004166, -22.046726, 7.1897836, -12.004166, -19.902678, 7.1897826, -11.959942, -19.902678, 7.024769, -11.959942, -22.046726, 7.02477, -12.004166, -19.902678, 6.859755, -12.004166, -22.046726, 6.859756, -11.959942, -22.046726, 7.02477, -11.959942, -19.902678, 7.024769, -12.004166, -19.902678, 6.859755, -12.124956, -22.046726, 6.7389655, -12.28997, -22.046726, 7.02477, -12.004166, -22.046726, 6.859756, -12.004166, -22.046726, 6.859756, -12.28997, -22.046726, 7.02477, -11.959942, -22.046726, 7.02477, -12.28997, -22.046726, 6.6947417, -12.28997, -22.046726, 7.02477, -12.124956, -22.046726, 6.7389655, -11.959942, -22.046726, 7.02477, -12.28997, -22.046726, 7.02477, -12.004166, -22.046726, 7.1897836, -12.454985, -22.046726, 6.7389655, -12.28997, -22.046726, 7.02477, -12.28997, -22.046726, 6.6947417, -12.004166, -22.046726, 7.1897836, -12.28997, -22.046726, 7.02477, -12.124956, -22.046726, 7.3105736, -12.575773, -22.046726, 6.859756, -12.28997, -22.046726, 7.02477, -12.454985, -22.046726, 6.7389655, -12.124956, -22.046726, 7.3105736, -12.28997, -22.046726, 7.02477, -12.28997, -22.046726, 7.3547974, -12.619997, -22.046726, 7.02477, -12.28997, -22.046726, 7.02477, -12.575773, -22.046726, 6.859756, -12.28997, -22.046726, 7.3547974, -12.28997, -22.046726, 7.02477, -12.454985, -22.046726, 7.3105736, -12.575773, -22.046726, 7.1897836, -12.28997, -22.046726, 7.02477, -12.619997, -22.046726, 7.02477, -12.454985, -22.046726, 7.3105736, -12.28997, -22.046726, 7.02477, -12.575773, -22.046726, 7.1897836, -12.004166, -19.902678, 6.859755, -12.28997, -19.456135, 7.024769, -12.124956, -19.902678, 6.7389646, -12.124956, -19.902678, 6.7389646, -12.28997, -19.456135, 7.024769, -12.28997, -19.902678, 6.6947412, -11.959942, -19.902678, 7.024769, -12.28997, -19.456135, 7.024769, -12.004166, -19.902678, 6.859755, -12.28997, -19.902678, 6.6947412, -12.28997, -19.456135, 7.024769, -12.454985, -19.902678, 6.7389646, -12.004166, -19.902678, 7.1897826, -12.28997, -19.456135, 7.024769, -11.959942, -19.902678, 7.024769, -12.454985, -19.902678, 6.7389646, -12.28997, -19.456135, 7.024769, -12.575773, -19.902678, 6.859755, -12.124956, -19.902678, 7.310573, -12.28997, -19.456135, 7.024769, -12.004166, -19.902678, 7.1897826, -12.575773, -19.902678, 6.859755, -12.28997, -19.456135, 7.024769, -12.619997, -19.902678, 7.024769, -12.28997, -19.902678, 7.354797, -12.28997, -19.456135, 7.024769, -12.124956, -19.902678, 7.310573, -12.619997, -19.902678, 7.024769, -12.28997, -19.456135, 7.024769, -12.575773, -19.902678, 7.1897826, -12.454985, -19.902678, 7.310573, -12.28997, -19.456135, 7.024769, -12.28997, -19.902678, 7.354797, -12.575773, -19.902678, 7.1897826, -12.28997, -19.456135, 7.024769, -12.454985, -19.902678, 7.310573, -12.917406, -22.143438, 6.933488, -12.989674, -20.442587, 6.8666687, -12.989674, -22.143438, 6.8666697, -12.917406, -22.143438, 6.933488, -12.917406, -20.442587, 6.933487, -12.989674, -20.442587, 6.8666687, -12.989674, -22.143438, 6.8666697, -13.088398, -20.442587, 6.8422055, -13.088398, -22.143438, 6.842206, -12.989674, -22.143438, 6.8666697, -12.989674, -20.442587, 6.8666687, -13.088398, -20.442587, 6.8422055, -13.088398, -22.143438, 6.842206, -13.187122, -20.442587, 6.8666687, -13.187122, -22.143438, 6.8666697, -13.088398, -22.143438, 6.842206, -13.088398, -20.442587, 6.8422055, -13.187122, -20.442587, 6.8666687, -13.187122, -22.143438, 6.8666697, -13.259388, -20.442587, 6.933487, -13.259388, -22.143438, 6.933488, -13.187122, -22.143438, 6.8666697, -13.187122, -20.442587, 6.8666687, -13.259388, -20.442587, 6.933487, -13.259388, -22.143438, 6.933488, -13.285847, -20.442587, 7.024769, -13.285847, -22.143438, 7.02477, -13.259388, -22.143438, 6.933488, -13.259388, -20.442587, 6.933487, -13.285847, -20.442587, 7.024769, -13.285847, -22.143438, 7.02477, -13.259388, -20.442587, 7.1160507, -13.259388, -22.143438, 7.116051, -13.285847, -22.143438, 7.02477, -13.285847, -20.442587, 7.024769, -13.259388, -20.442587, 7.1160507, -13.259388, -22.143438, 7.116051, -13.187122, -20.442587, 7.182869, -13.187122, -22.143438, 7.18287, -13.259388, -22.143438, 7.116051, -13.259388, -20.442587, 7.1160507, -13.187122, -20.442587, 7.182869, -13.187122, -22.143438, 7.18287, -13.088398, -20.442587, 7.2073326, -13.088398, -22.143438, 7.207333, -13.187122, -22.143438, 7.18287, -13.187122, -20.442587, 7.182869, -13.088398, -20.442587, 7.2073326, -13.088398, -22.143438, 7.207333, -12.989674, -20.442587, 7.182869, -12.989674, -22.143438, 7.18287, -13.088398, -22.143438, 7.207333, -13.088398, -20.442587, 7.2073326, -12.989674, -20.442587, 7.182869, -12.989674, -22.143438, 7.18287, -12.917406, -20.442587, 7.1160507, -12.917406, -22.143438, 7.116051, -12.989674, -22.143438, 7.18287, -12.989674, -20.442587, 7.182869, -12.917406, -20.442587, 7.1160507, -12.917406, -22.143438, 7.116051, -12.890947, -20.442587, 7.024769, -12.890947, -22.143438, 7.02477, -12.917406, -22.143438, 7.116051, -12.917406, -20.442587, 7.1160507, -12.890947, -20.442587, 7.024769, -12.890947, -22.143438, 7.02477, -12.917406, -20.442587, 6.933487, -12.917406, -22.143438, 6.933488, -12.890947, -22.143438, 7.02477, -12.890947, -20.442587, 7.024769, -12.917406, -20.442587, 6.933487, -12.989674, -22.143438, 6.8666697, -13.088398, -22.143438, 7.02477, -12.917406, -22.143438, 6.933488, -12.917406, -22.143438, 6.933488, -13.088398, -22.143438, 7.02477, -12.890947, -22.143438, 7.02477, -13.088398, -22.143438, 6.842206, -13.088398, -22.143438, 7.02477, -12.989674, -22.143438, 6.8666697, -12.890947, -22.143438, 7.02477, -13.088398, -22.143438, 7.02477, -12.917406, -22.143438, 7.116051, -13.187122, -22.143438, 6.8666697, -13.088398, -22.143438, 7.02477, -13.088398, -22.143438, 6.842206, -12.917406, -22.143438, 7.116051, -13.088398, -22.143438, 7.02477, -12.989674, -22.143438, 7.18287, -13.259388, -22.143438, 6.933488, -13.088398, -22.143438, 7.02477, -13.187122, -22.143438, 6.8666697, -12.989674, -22.143438, 7.18287, -13.088398, -22.143438, 7.02477, -13.088398, -22.143438, 7.207333, -13.285847, -22.143438, 7.02477, -13.088398, -22.143438, 7.02477, -13.259388, -22.143438, 6.933488, -13.088398, -22.143438, 7.207333, -13.088398, -22.143438, 7.02477, -13.187122, -22.143438, 7.18287, -13.259388, -22.143438, 7.116051, -13.088398, -22.143438, 7.02477, -13.285847, -22.143438, 7.02477, -13.187122, -22.143438, 7.18287, -13.088398, -22.143438, 7.02477, -13.259388, -22.143438, 7.116051, -12.917406, -20.442587, 6.933487, -13.088398, -20.08835, 7.024769, -12.989674, -20.442587, 6.8666687, -12.989674, -20.442587, 6.8666687, -13.088398, -20.08835, 7.024769, -13.088398, -20.442587, 6.8422055, -12.890947, -20.442587, 7.024769, -13.088398, -20.08835, 7.024769, -12.917406, -20.442587, 6.933487, -13.088398, -20.442587, 6.8422055, -13.088398, -20.08835, 7.024769, -13.187122, -20.442587, 6.8666687, -12.917406, -20.442587, 7.1160507, -13.088398, -20.08835, 7.024769, -12.890947, -20.442587, 7.024769, -13.187122, -20.442587, 6.8666687, -13.088398, -20.08835, 7.024769, -13.259388, -20.442587, 6.933487, -12.989674, -20.442587, 7.182869, -13.088398, -20.08835, 7.024769, -12.917406, -20.442587, 7.1160507, -13.259388, -20.442587, 6.933487, -13.088398, -20.08835, 7.024769, -13.285847, -20.442587, 7.024769, -13.088398, -20.442587, 7.2073326, -13.088398, -20.08835, 7.024769, -12.989674, -20.442587, 7.182869, -13.285847, -20.442587, 7.024769, -13.088398, -20.08835, 7.024769, -13.259388, -20.442587, 7.1160507, -13.187122, -20.442587, 7.182869, -13.088398, -20.08835, 7.024769, -13.088398, -20.442587, 7.2073326, -13.259388, -20.442587, 7.1160507, -13.088398, -20.08835, 7.024769, -13.187122, -20.442587, 7.182869, 7.7560043, -21.843687, -1.5963855, 7.8594513, -21.712654, -1.5136316, 7.8594513, -21.889545, -1.5601864, 7.7560043, -21.843687, -1.5963855, 7.7198067, -21.712654, -1.5601864, 7.8594513, -21.712654, -1.5136316, 7.7198067, -21.889545, -1.6998296, 7.7560043, -21.843687, -1.5963855, 7.8594513, -21.889545, -1.5601864, 7.7198067, -21.889545, -1.6998296, 7.7198067, -21.712654, -1.5601864, 7.7560043, -21.843687, -1.5963855, 7.7198067, -21.712654, -1.5601864, 7.8594513, -21.392513, -1.5493045, 7.8594513, -21.712654, -1.5136316, 7.8594513, -21.712654, -1.5136316, 7.8594513, -21.392513, -1.5493045, 7.9628983, -21.392513, -1.5855265, 7.7198067, -21.712654, -1.5601864, 7.7560043, -21.392513, -1.5855265, 7.8594513, -21.392513, -1.5493045, 7.8594513, -21.712654, -1.5136316, 7.9628983, -21.392513, -1.5855265, 7.999096, -21.712654, -1.5601864, 7.8594513, -21.889545, -1.5601864, 7.8594513, -21.712654, -1.5136316, 7.999096, -21.712654, -1.5601864, 7.999096, -21.712654, -1.5601864, 7.9628983, -21.392513, -1.5855265, 7.999096, -21.392513, -1.6889691, 7.673259, -21.712656, -1.6998296, 7.7560043, -21.392513, -1.5855265, 7.7198067, -21.712654, -1.5601864, 7.7198067, -21.889545, -1.6998296, 7.673259, -21.712656, -1.6998296, 7.7198067, -21.712654, -1.5601864, 7.673259, -21.712656, -1.6998296, 7.7198067, -21.392513, -1.6889691, 7.7560043, -21.392513, -1.5855265, 7.999096, -21.712654, -1.5601864, 7.999096, -21.392513, -1.6889691, 8.045644, -21.712656, -1.6998296, 8.045644, -21.712656, -1.6998296, 7.999096, -21.392513, -1.6889691, 7.9628983, -21.392513, -1.7924135, 7.8594513, -21.889545, -1.5601864, 7.999096, -21.712654, -1.5601864, 7.9628983, -21.843687, -1.5963855, 7.9628983, -21.843687, -1.5963855, 7.999096, -21.712654, -1.5601864, 8.045644, -21.712656, -1.6998296, 7.7198067, -21.889545, -1.6998296, 7.8594513, -21.889545, -1.5601864, 7.8594513, -21.948505, -1.6998296, 7.8594513, -21.948505, -1.6998296, 7.8594513, -21.889545, -1.5601864, 7.9628983, -21.843687, -1.5963855, 7.7560043, -21.843687, -1.8032722, 7.673259, -21.712656, -1.6998296, 7.7198067, -21.889545, -1.6998296, 7.7560043, -21.843687, -1.8032722, 7.7198067, -21.889545, -1.6998296, 7.8594513, -21.948505, -1.6998296, 7.7198067, -21.712656, -1.8394728, 7.7198067, -21.392513, -1.6889691, 7.673259, -21.712656, -1.6998296, 7.7560043, -21.843687, -1.8032722, 7.7198067, -21.712656, -1.8394728, 7.673259, -21.712656, -1.6998296, 7.7198067, -21.712656, -1.8394728, 7.7560043, -21.392513, -1.7924135, 7.7198067, -21.392513, -1.6889691, 7.7560043, -21.843687, -1.8032722, 7.8594513, -21.948505, -1.6998296, 7.8594513, -21.889545, -1.8394728, 7.7198067, -21.712656, -1.8394728, 7.7560043, -21.843687, -1.8032722, 7.8594513, -21.889545, -1.8394728, 7.8594513, -21.948505, -1.6998296, 7.9628983, -21.843687, -1.5963855, 7.999096, -21.889545, -1.6998296, 7.8594513, -21.889545, -1.8394728, 7.8594513, -21.948505, -1.6998296, 7.999096, -21.889545, -1.6998296, 7.9628983, -21.843687, -1.5963855, 8.045644, -21.712656, -1.6998296, 7.999096, -21.889545, -1.6998296, 7.8594513, -21.889545, -1.8394728, 7.999096, -21.889545, -1.6998296, 7.9628983, -21.843687, -1.8032722, 7.7560043, -21.392513, -1.7924135, 7.7198067, -21.712656, -1.8394728, 7.8594513, -21.712656, -1.8860278, 7.7198067, -21.712656, -1.8394728, 7.8594513, -21.889545, -1.8394728, 7.8594513, -21.712656, -1.8860278, 7.8594513, -21.712656, -1.8860278, 7.8594513, -21.889545, -1.8394728, 7.9628983, -21.843687, -1.8032722, 7.7560043, -21.392513, -1.7924135, 7.8594513, -21.712656, -1.8860278, 7.8594513, -21.392513, -1.8286123, 7.999096, -21.889545, -1.6998296, 8.045644, -21.712656, -1.6998296, 7.999096, -21.712656, -1.8394728, 7.999096, -21.889545, -1.6998296, 7.999096, -21.712656, -1.8394728, 7.9628983, -21.843687, -1.8032722, 7.8594513, -21.712656, -1.8860278, 7.9628983, -21.843687, -1.8032722, 7.999096, -21.712656, -1.8394728, 7.8594513, -21.392513, -1.8286123, 7.8594513, -21.712656, -1.8860278, 7.999096, -21.712656, -1.8394728, 8.045644, -21.712656, -1.6998296, 7.9628983, -21.392513, -1.7924135, 7.999096, -21.712656, -1.8394728, 7.8594513, -21.392513, -1.8286123, 7.999096, -21.712656, -1.8394728, 7.9628983, -21.392513, -1.7924135, 7.597028, -21.442598, -1.34617, 7.8594513, -21.312298, -1.1490684, 7.8594513, -21.49598, -1.2661133, 7.597028, -21.442598, -1.34617, 7.505172, -21.314877, -1.2550125, 7.8594513, -21.312298, -1.1490684, 7.8594513, -21.49598, -1.2661133, 7.8594513, -21.312298, -1.1490684, 8.213731, -21.314877, -1.2550125, 7.505172, -21.409956, -1.6840334, 7.505172, -21.314877, -1.2550125, 7.597028, -21.442598, -1.34617, 7.505172, -21.409956, -1.6840334, 7.597028, -21.442598, -1.34617, 7.8594513, -21.49598, -1.2661133, 7.505172, -21.409956, -1.6840334, 7.387093, -21.22724, -1.6845381, 7.505172, -21.314877, -1.2550125, 7.8594513, -21.49598, -1.2661133, 8.213731, -21.314877, -1.2550125, 8.121874, -21.442598, -1.34617, 8.121874, -21.442598, -1.34617, 8.213731, -21.314877, -1.2550125, 8.331823, -21.22724, -1.6845381, 7.505172, -21.409956, -1.6840334, 7.8594513, -21.49598, -1.2661133, 7.8594513, -21.492252, -1.6844721, 7.8594513, -21.492252, -1.6844721, 7.8594513, -21.49598, -1.2661133, 8.121874, -21.442598, -1.34617, 7.597028, -21.339413, -1.9443204, 7.387093, -21.22724, -1.6845381, 7.505172, -21.409956, -1.6840334, 7.597028, -21.339413, -1.9443204, 7.505172, -21.409956, -1.6840334, 7.8594513, -21.492252, -1.6844721, 7.597028, -21.339413, -1.9443204, 7.505172, -21.222763, -2.0274482, 7.387093, -21.22724, -1.6845381, 8.121874, -21.442598, -1.34617, 8.331823, -21.22724, -1.6845381, 8.213731, -21.409956, -1.6840334, 7.8594513, -21.492252, -1.6844721, 8.121874, -21.442598, -1.34617, 8.213731, -21.409956, -1.6840334, 8.213731, -21.409956, -1.6840334, 8.331823, -21.22724, -1.6845381, 8.213731, -21.222763, -2.0274482, 7.597028, -21.339413, -1.9443204, 7.8594513, -21.492252, -1.6844721, 7.8594513, -21.4032, -2.0336347, 7.505172, -21.222763, -2.0274482, 7.597028, -21.339413, -1.9443204, 7.8594513, -21.4032, -2.0336347, 7.8594513, -21.4032, -2.0336347, 7.8594513, -21.492252, -1.6844721, 8.213731, -21.409956, -1.6840334, 7.505172, -21.222763, -2.0274482, 7.8594513, -21.4032, -2.0336347, 7.8594513, -21.227156, -2.1436162, 8.213731, -21.409956, -1.6840334, 8.213731, -21.222763, -2.0274482, 8.121874, -21.339413, -1.9443204, 7.8594513, -21.4032, -2.0336347, 8.213731, -21.409956, -1.6840334, 8.121874, -21.339413, -1.9443204, 7.8594513, -21.227156, -2.1436162, 8.121874, -21.339413, -1.9443204, 8.213731, -21.222763, -2.0274482, 7.8594513, -21.227156, -2.1436162, 7.8594513, -21.4032, -2.0336347, 8.121874, -21.339413, -1.9443204, 7.8594513, -21.312298, -1.1490684, 8.121874, -21.111137, -1.4137647, 8.213731, -21.314877, -1.2550125, 8.213731, -21.314877, -1.2550125, 8.121874, -21.111137, -1.4137647, 8.213731, -21.024748, -1.6911418, 7.8594513, -21.312298, -1.1490684, 7.8594513, -21.038862, -1.3319969, 8.121874, -21.111137, -1.4137647, 7.8594513, -21.038862, -1.3319969, 8.213731, -21.024748, -1.6911418, 8.121874, -21.111137, -1.4137647, 8.213731, -21.314877, -1.2550125, 8.213731, -21.024748, -1.6911418, 8.331823, -21.22724, -1.6845381, 7.505172, -21.314877, -1.2550125, 7.8594513, -21.038862, -1.3319969, 7.8594513, -21.312298, -1.1490684, 7.505172, -21.314877, -1.2550125, 7.597028, -21.111137, -1.4137647, 7.8594513, -21.038862, -1.3319969, 7.387093, -21.22724, -1.6845381, 7.597028, -21.111137, -1.4137647, 7.505172, -21.314877, -1.2550125, 7.8594513, -21.038862, -1.3319969, 7.8594513, -20.941704, -1.6914926, 8.213731, -21.024748, -1.6911418, 7.597028, -21.111137, -1.4137647, 7.8594513, -20.941704, -1.6914926, 7.8594513, -21.038862, -1.3319969, 8.331823, -21.22724, -1.6845381, 8.213731, -21.024748, -1.6911418, 8.121874, -21.092463, -1.9232578, 7.8594513, -20.941704, -1.6914926, 8.121874, -21.092463, -1.9232578, 8.213731, -21.024748, -1.6911418, 8.331823, -21.22724, -1.6845381, 8.121874, -21.092463, -1.9232578, 8.213731, -21.222763, -2.0274482, 7.387093, -21.22724, -1.6845381, 7.505172, -21.024748, -1.6911418, 7.597028, -21.111137, -1.4137647, 7.597028, -21.111137, -1.4137647, 7.505172, -21.024748, -1.6911418, 7.8594513, -20.941704, -1.6914926, 7.505172, -21.222763, -2.0274482, 7.505172, -21.024748, -1.6911418, 7.387093, -21.22724, -1.6845381, 7.8594513, -21.02841, -2.012529, 8.213731, -21.222763, -2.0274482, 8.121874, -21.092463, -1.9232578, 7.8594513, -20.941704, -1.6914926, 7.8594513, -21.02841, -2.012529, 8.121874, -21.092463, -1.9232578, 7.505172, -21.024748, -1.6911418, 7.8594513, -21.02841, -2.012529, 7.8594513, -20.941704, -1.6914926, 7.8594513, -21.02841, -2.012529, 7.8594513, -21.227156, -2.1436162, 8.213731, -21.222763, -2.0274482, 7.505172, -21.222763, -2.0274482, 7.597028, -21.092463, -1.9232578, 7.505172, -21.024748, -1.6911418, 7.505172, -21.024748, -1.6911418, 7.597028, -21.092463, -1.9232578, 7.8594513, -21.02841, -2.012529, 7.597028, -21.092463, -1.9232578, 7.505172, -21.222763, -2.0274482, 7.8594513, -21.227156, -2.1436162, 7.597028, -21.092463, -1.9232578, 7.8594513, -21.227156, -2.1436162, 7.8594513, -21.02841, -2.012529, 7.7984443, -21.95358, -2.1591706, 7.8594513, -21.864279, -2.1397543, 7.8594513, -21.971691, -2.1298366, 7.7984443, -21.95358, -2.1591706, 7.7770944, -21.873667, -2.165554, 7.8594513, -21.864279, -2.1397543, 7.7770944, -21.999872, -2.2072396, 7.7984443, -21.95358, -2.1591706, 7.8594513, -21.971691, -2.1298366, 7.7770944, -21.999872, -2.2072396, 7.7770944, -21.873667, -2.165554, 7.7984443, -21.95358, -2.1591706, 7.7770944, -21.873667, -2.165554, 7.8594513, -21.694061, -2.224133, 7.8594513, -21.864279, -2.1397543, 7.8594513, -21.864279, -2.1397543, 7.8594513, -21.694061, -2.224133, 7.9204583, -21.701368, -2.2442064, 7.7770944, -21.873667, -2.165554, 7.7984443, -21.701368, -2.2442064, 7.8594513, -21.694061, -2.224133, 7.8594513, -21.864279, -2.1397543, 7.9204583, -21.701368, -2.2442064, 7.941808, -21.873667, -2.165554, 7.8594513, -21.971691, -2.1298366, 7.8594513, -21.864279, -2.1397543, 7.941808, -21.873667, -2.165554, 7.941808, -21.873667, -2.165554, 7.9204583, -21.701368, -2.2442064, 7.941808, -21.722242, -2.3015342, 7.7496324, -21.901846, -2.2429338, 7.7984443, -21.701368, -2.2442064, 7.7770944, -21.873667, -2.165554, 7.7770944, -21.999872, -2.2072396, 7.7496324, -21.901846, -2.2429338, 7.7770944, -21.873667, -2.165554, 7.7496324, -21.901846, -2.2429338, 7.7770944, -21.722242, -2.3015342, 7.7984443, -21.701368, -2.2442064, 7.941808, -21.873667, -2.165554, 7.941808, -21.722242, -2.3015342, 7.96927, -21.901846, -2.2429338, 7.96927, -21.901846, -2.2429338, 7.941808, -21.722242, -2.3015342, 7.9204583, -21.743116, -2.3588605, 7.8594513, -21.971691, -2.1298366, 7.941808, -21.873667, -2.165554, 7.9204583, -21.95358, -2.1591706, 7.9204583, -21.95358, -2.1591706, 7.941808, -21.873667, -2.165554, 7.96927, -21.901846, -2.2429338, 7.7770944, -21.999872, -2.2072396, 7.8594513, -21.971691, -2.1298366, 7.8594513, -22.032564, -2.1953483, 7.8594513, -22.032564, -2.1953483, 7.8594513, -21.971691, -2.1298366, 7.9204583, -21.95358, -2.1591706, 7.7984443, -21.995344, -2.2738247, 7.7496324, -21.901846, -2.2429338, 7.7770944, -21.999872, -2.2072396, 7.7984443, -21.995344, -2.2738247, 7.7770944, -21.999872, -2.2072396, 7.8594513, -22.032564, -2.1953483, 7.7770944, -21.930044, -2.320335, 7.7770944, -21.722242, -2.3015342, 7.7496324, -21.901846, -2.2429338, 7.7984443, -21.995344, -2.2738247, 7.7770944, -21.930044, -2.320335, 7.7496324, -21.901846, -2.2429338, 7.7770944, -21.930044, -2.320335, 7.7984443, -21.743116, -2.3588605, 7.7770944, -21.722242, -2.3015342, 7.7984443, -21.995344, -2.2738247, 7.8594513, -22.032564, -2.1953483, 7.8594513, -22.02807, -2.2846193, 7.7770944, -21.930044, -2.320335, 7.7984443, -21.995344, -2.2738247, 7.8594513, -22.02807, -2.2846193, 7.8594513, -22.032564, -2.1953483, 7.9204583, -21.95358, -2.1591706, 7.941808, -21.999872, -2.2072396, 7.8594513, -22.02807, -2.2846193, 7.8594513, -22.032564, -2.1953483, 7.941808, -21.999872, -2.2072396, 7.9204583, -21.95358, -2.1591706, 7.96927, -21.901846, -2.2429338, 7.941808, -21.999872, -2.2072396, 7.8594513, -22.02807, -2.2846193, 7.941808, -21.999872, -2.2072396, 7.9204583, -21.995344, -2.2738247, 7.7984443, -21.743116, -2.3588605, 7.7770944, -21.930044, -2.320335, 7.8594513, -21.939434, -2.3461366, 7.7770944, -21.930044, -2.320335, 7.8594513, -22.02807, -2.2846193, 7.8594513, -21.939434, -2.3461366, 7.8594513, -21.939434, -2.3461366, 7.8594513, -22.02807, -2.2846193, 7.9204583, -21.995344, -2.2738247, 7.7984443, -21.743116, -2.3588605, 7.8594513, -21.939434, -2.3461366, 7.8594513, -21.750423, -2.3789139, 7.941808, -21.999872, -2.2072396, 7.96927, -21.901846, -2.2429338, 7.941808, -21.930044, -2.320335, 7.941808, -21.999872, -2.2072396, 7.941808, -21.930044, -2.320335, 7.9204583, -21.995344, -2.2738247, 7.8594513, -21.939434, -2.3461366, 7.9204583, -21.995344, -2.2738247, 7.941808, -21.930044, -2.320335, 7.8594513, -21.750423, -2.3789139, 7.8594513, -21.939434, -2.3461366, 7.941808, -21.930044, -2.320335, 7.96927, -21.901846, -2.2429338, 7.9204583, -21.743116, -2.3588605, 7.941808, -21.930044, -2.320335, 7.8594513, -21.750423, -2.3789139, 7.941808, -21.930044, -2.320335, 7.9204583, -21.743116, -2.3588605, 7.7046704, -21.680813, -2.1014476, 7.8594513, -21.56882, -2.0185182, 7.8594513, -21.694244, -2.0463152, 7.7046704, -21.680813, -2.1014476, 7.6505113, -21.591642, -2.0767002, 7.8594513, -21.56882, -2.0185182, 7.8594513, -21.694244, -2.0463152, 7.8594513, -21.56882, -2.0185182, 8.068392, -21.591642, -2.0767002, 7.6505113, -21.730915, -2.2952814, 7.6505113, -21.591642, -2.0767002, 7.7046704, -21.680813, -2.1014476, 7.6505113, -21.730915, -2.2952814, 7.7046704, -21.680813, -2.1014476, 7.8594513, -21.694244, -2.0463152, 7.6505113, -21.730915, -2.2952814, 7.5808535, -21.62976, -2.3324466, 7.6505113, -21.591642, -2.0767002, 7.8594513, -21.694244, -2.0463152, 8.068392, -21.591642, -2.0767002, 8.014233, -21.680813, -2.1014476, 8.014233, -21.680813, -2.1014476, 8.068392, -21.591642, -2.0767002, 8.138048, -21.62976, -2.3324466, 7.6505113, -21.730915, -2.2952814, 7.8594513, -21.694244, -2.0463152, 7.8594513, -21.776608, -2.278893, 7.8594513, -21.776608, -2.278893, 7.8594513, -21.694244, -2.0463152, 8.014233, -21.680813, -2.1014476, 7.7046704, -21.744349, -2.4537702, 7.5808535, -21.62976, -2.3324466, 7.6505113, -21.730915, -2.2952814, 7.7046704, -21.744349, -2.4537702, 7.6505113, -21.730915, -2.2952814, 7.8594513, -21.776608, -2.278893, 7.7046704, -21.744349, -2.4537702, 7.6505113, -21.696476, -2.5233836, 7.5808535, -21.62976, -2.3324466, 8.014233, -21.680813, -2.1014476, 8.138048, -21.62976, -2.3324466, 8.068392, -21.730915, -2.2952814, 7.8594513, -21.776608, -2.278893, 8.014233, -21.680813, -2.1014476, 8.068392, -21.730915, -2.2952814, 8.068392, -21.730915, -2.2952814, 8.138048, -21.62976, -2.3324466, 8.068392, -21.696476, -2.5233836, 7.7046704, -21.744349, -2.4537702, 7.8594513, -21.776608, -2.278893, 7.8594513, -21.79773, -2.490386, 7.6505113, -21.696476, -2.5233836, 7.7046704, -21.744349, -2.4537702, 7.8594513, -21.79773, -2.490386, 7.8594513, -21.79773, -2.490386, 7.8594513, -21.776608, -2.278893, 8.068392, -21.730915, -2.2952814, 7.6505113, -21.696476, -2.5233836, 7.8594513, -21.79773, -2.490386, 7.8594513, -21.722359, -2.586853, 8.068392, -21.730915, -2.2952814, 8.068392, -21.696476, -2.5233836, 8.014233, -21.744349, -2.4537702, 7.8594513, -21.79773, -2.490386, 8.068392, -21.730915, -2.2952814, 8.014233, -21.744349, -2.4537702, 7.8594513, -21.722359, -2.586853, 8.014233, -21.744349, -2.4537702, 8.068392, -21.696476, -2.5233836, 7.8594513, -21.722359, -2.586853, 7.8594513, -21.79773, -2.490386, 8.014233, -21.744349, -2.4537702, 7.8594513, -21.56882, -2.0185182, 8.014233, -21.510761, -2.2058134, 8.068392, -21.591642, -2.0767002, 8.068392, -21.591642, -2.0767002, 8.014233, -21.510761, -2.2058134, 8.068392, -21.51887, -2.3769612, 7.8594513, -21.56882, -2.0185182, 7.8594513, -21.4542, -2.1750765, 8.014233, -21.510761, -2.2058134, 7.8594513, -21.4542, -2.1750765, 8.068392, -21.51887, -2.3769612, 8.014233, -21.510761, -2.2058134, 8.068392, -21.591642, -2.0767002, 8.068392, -21.51887, -2.3769612, 8.138048, -21.62976, -2.3324466, 7.6505113, -21.591642, -2.0767002, 7.8594513, -21.4542, -2.1750765, 7.8594513, -21.56882, -2.0185182, 7.6505113, -21.591642, -2.0767002, 7.7046704, -21.510761, -2.2058134, 7.8594513, -21.4542, -2.1750765, 7.5808535, -21.62976, -2.3324466, 7.7046704, -21.510761, -2.2058134, 7.6505113, -21.591642, -2.0767002, 7.8594513, -21.4542, -2.1750765, 7.8594513, -21.47291, -2.3939195, 8.068392, -21.51887, -2.3769612, 7.7046704, -21.510761, -2.2058134, 7.8594513, -21.47291, -2.3939195, 7.8594513, -21.4542, -2.1750765, 8.138048, -21.62976, -2.3324466, 8.068392, -21.51887, -2.3769612, 8.014233, -21.603245, -2.491922, 7.8594513, -21.47291, -2.3939195, 8.014233, -21.603245, -2.491922, 8.068392, -21.51887, -2.3769612, 8.138048, -21.62976, -2.3324466, 8.014233, -21.603245, -2.491922, 8.068392, -21.696476, -2.5233836, 7.5808535, -21.62976, -2.3324466, 7.6505113, -21.51887, -2.3769612, 7.7046704, -21.510761, -2.2058134, 7.7046704, -21.510761, -2.2058134, 7.6505113, -21.51887, -2.3769612, 7.8594513, -21.47291, -2.3939195, 7.6505113, -21.696476, -2.5233836, 7.6505113, -21.51887, -2.3769612, 7.5808535, -21.62976, -2.3324466, 7.8594513, -21.585766, -2.5543175, 8.068392, -21.696476, -2.5233836, 8.014233, -21.603245, -2.491922, 7.8594513, -21.47291, -2.3939195, 7.8594513, -21.585766, -2.5543175, 8.014233, -21.603245, -2.491922, 7.6505113, -21.51887, -2.3769612, 7.8594513, -21.585766, -2.5543175, 7.8594513, -21.47291, -2.3939195, 7.8594513, -21.585766, -2.5543175, 7.8594513, -21.722359, -2.586853, 8.068392, -21.696476, -2.5233836, 7.6505113, -21.696476, -2.5233836, 7.7046704, -21.603245, -2.491922, 7.6505113, -21.51887, -2.3769612, 7.6505113, -21.51887, -2.3769612, 7.7046704, -21.603245, -2.491922, 7.8594513, -21.585766, -2.5543175, 7.7046704, -21.603245, -2.491922, 7.6505113, -21.696476, -2.5233836, 7.8594513, -21.722359, -2.586853, 7.7046704, -21.603245, -2.491922, 7.8594513, -21.722359, -2.586853, 7.8594513, -21.585766, -2.5543175, -3.1935778, 3.8995895, -1.8595574, -2.9311557, 3.6870894, -1.6457057, -2.9311557, 3.8599355, -1.9618971, -3.1935778, 3.8995895, -1.8595574, -3.2854238, 3.7667134, -1.6248863, -2.9311557, 3.6870894, -1.6457057, -2.9311557, 3.8599355, -1.9618971, -2.9311557, 3.6870894, -1.6457057, -2.5768762, 3.7667134, -1.6248863, -2.9311557, 3.8599355, -1.9618971, -2.5768762, 3.7667134, -1.6248863, -2.6687322, 3.8995895, -1.8595574, -2.9311557, 3.6870894, -1.6457057, -2.6687322, 3.6513314, -1.305656, -2.5768762, 3.7667134, -1.6248863, -2.9311557, 3.6870894, -1.6457057, -2.9311557, 3.579767, -1.2413225, -2.6687322, 3.6513314, -1.305656, -3.2854238, 3.7667134, -1.6248863, -2.9311557, 3.579767, -1.2413225, -2.9311557, 3.6870894, -1.6457057, -3.2854238, 3.7667134, -1.6248863, -3.1935778, 3.6513314, -1.305656, -2.9311557, 3.579767, -1.2413225, -3.0859365, 3.6335888, -2.4534812, -2.9311557, 3.5589857, -2.2920804, -2.9311557, 3.5909512, -2.5021868, -3.0859365, 3.6335888, -2.4534812, -3.1401029, 3.6073158, -2.2966237, -2.9311557, 3.5589857, -2.2920804, -2.9311557, 3.5909512, -2.5021868, -2.9311557, 3.5589857, -2.2920804, -2.722207, 3.6073158, -2.2966237, -2.9311557, 3.5909512, -2.5021868, -2.722207, 3.6073158, -2.2966237, -2.7763748, 3.6335888, -2.4534812, -2.9311557, 3.5589857, -2.2920804, -2.7763748, 3.6077993, -2.096417, -2.722207, 3.6073158, -2.2966237, -2.9311557, 3.5589857, -2.2920804, -2.9311557, 3.5811186, -2.046321, -2.7763748, 3.6077993, -2.096417, -3.1401029, 3.6073158, -2.2966237, -2.9311557, 3.5811186, -2.046321, -2.9311557, 3.5589857, -2.2920804, -3.1401029, 3.6073158, -2.2966237, -3.0859365, 3.6077993, -2.096417, -2.9311557, 3.5811186, -2.046321, -3.1935806, 3.6513338, -1.3056598, -2.931157, 3.7287045, -1.0824075, -2.931157, 3.5797653, -1.2413273, -2.931157, 3.5797653, -1.2413273, -2.931157, 3.7287045, -1.0824075, -2.5768776, 3.7524617, -1.1856833, -3.1935806, 3.6513338, -1.3056598, -3.2854366, 3.7524617, -1.1856833, -2.931157, 3.7287045, -1.0824075, -2.931157, 3.5797653, -1.2413273, -2.5768776, 3.7524617, -1.1856833, -2.668735, 3.6513338, -1.3056598, -3.2854366, 3.766717, -1.6248941, -3.2854366, 3.7524617, -1.1856833, -3.1935806, 3.6513338, -1.3056598, -2.668735, 3.6513338, -1.3056598, -2.5768776, 3.7524617, -1.1856833, -2.4587846, 3.9438598, -1.5800798, -3.2854366, 3.766717, -1.6248941, -3.4035153, 3.9438598, -1.5800798, -3.2854366, 3.7524617, -1.1856833, -2.668735, 3.6513338, -1.3056598, -2.4587846, 3.9438598, -1.5800798, -2.5768776, 3.766717, -1.6248941, -3.1935806, 3.8995967, -1.8595555, -3.4035153, 3.9438598, -1.5800798, -3.2854366, 3.766717, -1.6248941, -2.5768776, 3.766717, -1.6248941, -2.4587846, 3.9438598, -1.5800798, -2.5768776, 4.0332108, -1.9111595, -3.1935806, 3.8995967, -1.8595555, -3.2854366, 4.0332108, -1.9111595, -3.4035153, 3.9438598, -1.5800798, -2.5768776, 3.766717, -1.6248941, -2.5768776, 4.0332108, -1.9111595, -2.668735, 3.8995967, -1.8595555, -3.2854366, 4.0332108, -1.9111595, -3.1935806, 3.8995967, -1.8595555, -2.931157, 3.8599317, -1.9618936, -2.931157, 4.0577416, -2.0247965, -2.668735, 3.8995967, -1.8595555, -2.5768776, 4.0332108, -1.9111595, -3.2854366, 4.0332108, -1.9111595, -2.931157, 3.8599317, -1.9618936, -2.931157, 4.0577416, -2.0247965, -2.931157, 4.0577416, -2.0247965, -2.931157, 3.8599317, -1.9618936, -2.668735, 3.8995967, -1.8595555, -2.931157, 3.7287045, -1.0824075, -2.668735, 3.9892077, -1.288969, -2.5768776, 3.7524617, -1.1856833, -2.5768776, 3.7524617, -1.1856833, -2.668735, 3.9892077, -1.288969, -2.5768776, 4.141674, -1.5362737, -2.931157, 3.7287045, -1.0824075, -2.931157, 4.0389485, -1.191823, -2.668735, 3.9892077, -1.288969, -2.931157, 4.0389485, -1.191823, -2.5768776, 4.141674, -1.5362737, -2.668735, 3.9892077, -1.288969, -2.5768776, 3.7524617, -1.1856833, -2.5768776, 4.141674, -1.5362737, -2.4587846, 3.9438598, -1.5800798, -3.2854366, 3.7524617, -1.1856833, -2.931157, 4.0389485, -1.191823, -2.931157, 3.7287045, -1.0824075, -3.2854366, 3.7524617, -1.1856833, -3.1935806, 3.9892077, -1.288969, -2.931157, 4.0389485, -1.191823, -3.4035153, 3.9438598, -1.5800798, -3.1935806, 3.9892077, -1.288969, -3.2854366, 3.7524617, -1.1856833, -2.931157, 4.0389485, -1.191823, -2.931157, 4.2222066, -1.5160246, -2.5768776, 4.141674, -1.5362737, -3.1935806, 3.9892077, -1.288969, -2.931157, 4.2222066, -1.5160246, -2.931157, 4.0389485, -1.191823, -2.4587846, 3.9438598, -1.5800798, -2.5768776, 4.141674, -1.5362737, -2.668735, 4.1336055, -1.777915, -2.931157, 4.2222066, -1.5160246, -2.668735, 4.1336055, -1.777915, -2.5768776, 4.141674, -1.5362737, -2.4587846, 3.9438598, -1.5800798, -2.668735, 4.1336055, -1.777915, -2.5768776, 4.0332108, -1.9111595, -3.4035153, 3.9438598, -1.5800798, -3.2854366, 4.141674, -1.5362737, -3.1935806, 3.9892077, -1.288969, -3.1935806, 3.9892077, -1.288969, -3.2854366, 4.141674, -1.5362737, -2.931157, 4.2222066, -1.5160246, -3.2854366, 4.0332108, -1.9111595, -3.2854366, 4.141674, -1.5362737, -3.4035153, 3.9438598, -1.5800798, -2.931157, 4.2177896, -1.8485272, -2.5768776, 4.0332108, -1.9111595, -2.668735, 4.1336055, -1.777915, -2.931157, 4.2222066, -1.5160246, -2.931157, 4.2177896, -1.8485272, -2.668735, 4.1336055, -1.777915, -3.2854366, 4.141674, -1.5362737, -2.931157, 4.2177896, -1.8485272, -2.931157, 4.2222066, -1.5160246, -2.931157, 4.2177896, -1.8485272, -2.931157, 4.0577416, -2.0247965, -2.5768776, 4.0332108, -1.9111595, -3.2854366, 4.0332108, -1.9111595, -3.1935806, 4.1336055, -1.777915, -3.2854366, 4.141674, -1.5362737, -3.2854366, 4.141674, -1.5362737, -3.1935806, 4.1336055, -1.777915, -2.931157, 4.2177896, -1.8485272, -3.1935806, 4.1336055, -1.777915, -3.2854366, 4.0332108, -1.9111595, -2.931157, 4.0577416, -2.0247965, -3.1935806, 4.1336055, -1.777915, -2.931157, 4.0577416, -2.0247965, -2.931157, 4.2177896, -1.8485272, -3.034594, 3.324797, -1.6474974, -2.9311528, 3.431215, -1.5348387, -2.9311528, 3.2713995, -1.6237905, -3.034594, 3.324797, -1.6474974, -3.0708017, 3.4427564, -1.5799403, -2.9311528, 3.431215, -1.5348387, -3.0708017, 3.3060207, -1.7590828, -3.034594, 3.324797, -1.6474974, -2.9311528, 3.2713995, -1.6237905, -3.0708017, 3.3060207, -1.7590828, -3.0708017, 3.4427564, -1.5799403, -3.034594, 3.324797, -1.6474974, -3.0708017, 3.4427564, -1.5799403, -2.9311528, 3.7502108, -1.490046, -2.9311528, 3.431215, -1.5348387, -2.9311528, 3.431215, -1.5348387, -2.9311528, 3.7502108, -1.490046, -2.8277116, 3.759186, -1.5251193, -3.0708017, 3.4427564, -1.5799403, -3.034594, 3.759186, -1.5251193, -2.9311528, 3.7502108, -1.490046, -2.9311528, 3.431215, -1.5348387, -2.8277116, 3.759186, -1.5251193, -2.791504, 3.4427564, -1.5799403, -2.9311528, 3.2713995, -1.6237905, -2.9311528, 3.431215, -1.5348387, -2.791504, 3.4427564, -1.5799403, -2.791504, 3.4427564, -1.5799403, -2.8277116, 3.759186, -1.5251193, -2.791504, 3.784829, -1.6253259, -3.1173468, 3.477378, -1.7152324, -3.034594, 3.759186, -1.5251193, -3.0708017, 3.4427564, -1.5799403, -3.0708017, 3.3060207, -1.7590828, -3.1173468, 3.477378, -1.7152324, -3.0708017, 3.4427564, -1.5799403, -3.1173468, 3.477378, -1.7152324, -3.0708017, 3.784829, -1.6253259, -3.034594, 3.759186, -1.5251193, -2.791504, 3.4427564, -1.5799403, -2.791504, 3.784829, -1.6253259, -2.7449532, 3.477378, -1.7152324, -2.7449532, 3.477378, -1.7152324, -2.791504, 3.784829, -1.6253259, -2.8277116, 3.8104749, -1.7255449, -2.9311528, 3.2713995, -1.6237905, -2.791504, 3.4427564, -1.5799403, -2.8277116, 3.324797, -1.6474974, -2.8277116, 3.324797, -1.6474974, -2.791504, 3.4427564, -1.5799403, -2.7449532, 3.477378, -1.7152324, -3.0708017, 3.3060207, -1.7590828, -2.9311528, 3.2713995, -1.6237905, -2.9311528, 3.2488918, -1.7737021, -2.9311528, 3.2488918, -1.7737021, -2.9311528, 3.2713995, -1.6237905, -2.8277116, 3.324797, -1.6474974, -3.034594, 3.3760855, -1.8479218, -3.1173468, 3.477378, -1.7152324, -3.0708017, 3.3060207, -1.7590828, -3.034594, 3.3760855, -1.8479218, -3.0708017, 3.3060207, -1.7590828, -2.9311528, 3.2488918, -1.7737021, -3.0708017, 3.511996, -1.8505123, -3.0708017, 3.784829, -1.6253259, -3.1173468, 3.477378, -1.7152324, -3.034594, 3.3760855, -1.8479218, -3.0708017, 3.511996, -1.8505123, -3.1173468, 3.477378, -1.7152324, -3.0708017, 3.511996, -1.8505123, -3.034594, 3.8104749, -1.7255449, -3.0708017, 3.784829, -1.6253259, -3.034594, 3.3760855, -1.8479218, -2.9311528, 3.2488918, -1.7737021, -2.9311528, 3.3406389, -1.8943624, -3.0708017, 3.511996, -1.8505123, -3.034594, 3.3760855, -1.8479218, -2.9311528, 3.3406389, -1.8943624, -2.9311528, 3.2488918, -1.7737021, -2.8277116, 3.324797, -1.6474974, -2.791504, 3.3060207, -1.7590828, -2.9311528, 3.3406389, -1.8943624, -2.9311528, 3.2488918, -1.7737021, -2.791504, 3.3060207, -1.7590828, -2.8277116, 3.324797, -1.6474974, -2.7449532, 3.477378, -1.7152324, -2.791504, 3.3060207, -1.7590828, -2.9311528, 3.3406389, -1.8943624, -2.791504, 3.3060207, -1.7590828, -2.8277116, 3.3760855, -1.8479218, -3.034594, 3.8104749, -1.7255449, -3.0708017, 3.511996, -1.8505123, -2.9311528, 3.5235374, -1.8956139, -3.0708017, 3.511996, -1.8505123, -2.9311528, 3.3406389, -1.8943624, -2.9311528, 3.5235374, -1.8956139, -2.9311528, 3.5235374, -1.8956139, -2.9311528, 3.3406389, -1.8943624, -2.8277116, 3.3760855, -1.8479218, -3.034594, 3.8104749, -1.7255449, -2.9311528, 3.5235374, -1.8956139, -2.9311528, 3.8194501, -1.7606182, -2.791504, 3.3060207, -1.7590828, -2.7449532, 3.477378, -1.7152324, -2.791504, 3.511996, -1.8505123, -2.791504, 3.3060207, -1.7590828, -2.791504, 3.511996, -1.8505123, -2.8277116, 3.3760855, -1.8479218, -2.9311528, 3.5235374, -1.8956139, -2.8277116, 3.3760855, -1.8479218, -2.791504, 3.511996, -1.8505123, -2.9311528, 3.8194501, -1.7606182, -2.9311528, 3.5235374, -1.8956139, -2.791504, 3.511996, -1.8505123, -2.7449532, 3.477378, -1.7152324, -2.8277116, 3.8104749, -1.7255449, -2.791504, 3.511996, -1.8505123, -2.9311528, 3.8194501, -1.7606182, -2.791504, 3.511996, -1.8505123, -2.8277116, 3.8104749, -1.7255449, -2.9921641, 3.357846, -2.219953, -2.9311528, 3.439559, -2.179008, -2.9311528, 3.3330348, -2.1960335, -2.9921641, 3.357846, -2.219953, -3.0135126, 3.436851, -2.2063189, -2.9311528, 3.439559, -2.179008, -3.0135126, 3.324916, -2.2780023, -2.9921641, 3.357846, -2.219953, -2.9311528, 3.3330348, -2.1960335, -3.0135126, 3.324916, -2.2780023, -3.0135126, 3.436851, -2.2063189, -2.9921641, 3.357846, -2.219953, -3.0135126, 3.436851, -2.2063189, -2.9311528, 3.6253839, -2.2185574, -2.9311528, 3.439559, -2.179008, -2.9311528, 3.439559, -2.179008, -2.9311528, 3.6253839, -2.2185574, -2.8701415, 3.6232789, -2.239798, -3.0135126, 3.436851, -2.2063189, -2.9921641, 3.6232789, -2.239798, -2.9311528, 3.6253839, -2.2185574, -2.9311528, 3.439559, -2.179008, -2.8701415, 3.6232789, -2.239798, -2.848793, 3.436851, -2.2063189, -2.9311528, 3.3330348, -2.1960335, -2.9311528, 3.439559, -2.179008, -2.848793, 3.436851, -2.2063189, -2.848793, 3.436851, -2.2063189, -2.8701415, 3.6232789, -2.239798, -2.848793, 3.617262, -2.3005147, -3.0409703, 3.428742, -2.2882862, -2.9921641, 3.6232789, -2.239798, -3.0135126, 3.436851, -2.2063189, -3.0135126, 3.324916, -2.2780023, -3.0409703, 3.428742, -2.2882862, -3.0135126, 3.436851, -2.2063189, -3.0409703, 3.428742, -2.2882862, -3.0135126, 3.617262, -2.3005147, -2.9921641, 3.6232789, -2.239798, -2.848793, 3.436851, -2.2063189, -2.848793, 3.617262, -2.3005147, -2.8213353, 3.428742, -2.2882862, -2.8213353, 3.428742, -2.2882862, -2.848793, 3.617262, -2.3005147, -2.8701415, 3.6112561, -2.361228, -2.9311528, 3.3330348, -2.1960335, -2.848793, 3.436851, -2.2063189, -2.8701415, 3.357846, -2.219953, -2.8701415, 3.357846, -2.219953, -2.848793, 3.436851, -2.2063189, -2.8213353, 3.428742, -2.2882862, -3.0135126, 3.324916, -2.2780023, -2.9311528, 3.3330348, -2.1960335, -2.9311528, 3.2903087, -2.274579, -2.9311528, 3.2903087, -2.274579, -2.9311528, 3.3330348, -2.1960335, -2.8701415, 3.357846, -2.219953, -2.9921641, 3.345823, -2.3413825, -3.0409703, 3.428742, -2.2882862, -3.0135126, 3.324916, -2.2780023, -2.9921641, 3.345823, -2.3413825, -3.0135126, 3.324916, -2.2780023, -2.9311528, 3.2903087, -2.274579, -3.0135126, 3.4206212, -2.370242, -3.0135126, 3.617262, -2.3005147, -3.0409703, 3.428742, -2.2882862, -2.9921641, 3.345823, -2.3413825, -3.0135126, 3.4206212, -2.370242, -3.0409703, 3.428742, -2.2882862, -3.0135126, 3.4206212, -2.370242, -2.9921641, 3.6112561, -2.361228, -3.0135126, 3.617262, -2.3005147, -2.9921641, 3.345823, -2.3413825, -2.9311528, 3.2903087, -2.274579, -2.9311528, 3.3167953, -2.3599591, -3.0135126, 3.4206212, -2.370242, -2.9921641, 3.345823, -2.3413825, -2.9311528, 3.3167953, -2.3599591, -2.9311528, 3.2903087, -2.274579, -2.8701415, 3.357846, -2.219953, -2.848793, 3.324916, -2.2780023, -2.9311528, 3.3167953, -2.3599591, -2.9311528, 3.2903087, -2.274579, -2.848793, 3.324916, -2.2780023, -2.8701415, 3.357846, -2.219953, -2.8213353, 3.428742, -2.2882862, -2.848793, 3.324916, -2.2780023, -2.9311528, 3.3167953, -2.3599591, -2.848793, 3.324916, -2.2780023, -2.8701415, 3.345823, -2.3413825, -2.9921641, 3.6112561, -2.361228, -3.0135126, 3.4206212, -2.370242, -2.9311528, 3.417915, -2.3975658, -3.0135126, 3.4206212, -2.370242, -2.9311528, 3.3167953, -2.3599591, -2.9311528, 3.417915, -2.3975658, -2.9311528, 3.417915, -2.3975658, -2.9311528, 3.3167953, -2.3599591, -2.8701415, 3.345823, -2.3413825, -2.9921641, 3.6112561, -2.361228, -2.9311528, 3.417915, -2.3975658, -2.9311528, 3.609141, -2.3824706, -2.848793, 3.324916, -2.2780023, -2.8213353, 3.428742, -2.2882862, -2.848793, 3.4206212, -2.370242, -2.848793, 3.324916, -2.2780023, -2.848793, 3.4206212, -2.370242, -2.8701415, 3.345823, -2.3413825, -2.9311528, 3.417915, -2.3975658, -2.8701415, 3.345823, -2.3413825, -2.848793, 3.4206212, -2.370242, -2.9311528, 3.609141, -2.3824706, -2.9311528, 3.417915, -2.3975658, -2.848793, 3.4206212, -2.370242, -2.8213353, 3.428742, -2.2882862, -2.8701415, 3.6112561, -2.361228, -2.848793, 3.4206212, -2.370242, -2.9311528, 3.609141, -2.3824706, -2.848793, 3.4206212, -2.370242, -2.8701415, 3.6112561, -2.361228, -3.085928, 3.6077986, -2.0964143, -2.9311543, 3.695728, -1.988307, -2.9311543, 3.5811217, -2.0463157, -2.9311543, 3.5811217, -2.0463157, -2.9311543, 3.695728, -1.988307, -2.7222042, 3.6880543, -2.0503378, -3.085928, 3.6077986, -2.0964143, -3.1401043, 3.6880543, -2.0503378, -2.9311543, 3.695728, -1.988307, -2.9311543, 3.5811217, -2.0463157, -2.7222042, 3.6880543, -2.0503378, -2.7763805, 3.6077986, -2.0964143, -3.1401043, 3.6073084, -2.2966123, -3.1401043, 3.6880543, -2.0503378, -3.085928, 3.6077986, -2.0964143, -2.7763805, 3.6077986, -2.0964143, -2.7222042, 3.6880543, -2.0503378, -2.6525536, 3.7145243, -2.3075337, -3.1401043, 3.6073084, -2.2966123, -3.2097464, 3.7145243, -2.3075337, -3.1401043, 3.6880543, -2.0503378, -2.7763805, 3.6077986, -2.0964143, -2.6525536, 3.7145243, -2.3075337, -2.7222042, 3.6073084, -2.2966123, -3.085928, 3.6335886, -2.4534798, -3.2097464, 3.7145243, -2.3075337, -3.1401043, 3.6073084, -2.2966123, -2.7222042, 3.6073084, -2.2966123, -2.6525536, 3.7145243, -2.3075337, -2.7222042, 3.697219, -2.5090442, -3.085928, 3.6335886, -2.4534798, -3.1401043, 3.697219, -2.5090442, -3.2097464, 3.7145243, -2.3075337, -2.7222042, 3.6073084, -2.2966123, -2.7222042, 3.697219, -2.5090442, -2.7763805, 3.6335886, -2.4534798, -3.1401043, 3.697219, -2.5090442, -3.085928, 3.6335886, -2.4534798, -2.9311543, 3.5909529, -2.5021935, -2.9311543, 3.687878, -2.5769706, -2.7763805, 3.6335886, -2.4534798, -2.7222042, 3.697219, -2.5090442, -3.1401043, 3.697219, -2.5090442, -2.9311543, 3.5909529, -2.5021935, -2.9311543, 3.687878, -2.5769706, -2.9311543, 3.687878, -2.5769706, -2.9311543, 3.5909529, -2.5021935, -2.7763805, 3.6335886, -2.4534798, -2.9311543, 3.695728, -1.988307, -2.7763805, 3.7984102, -2.1553535, -2.7222042, 3.6880543, -2.0503378, -2.7222042, 3.6880543, -2.0503378, -2.7763805, 3.7984102, -2.1553535, -2.7222042, 3.8329906, -2.3231764, -2.9311543, 3.695728, -1.988307, -2.9311543, 3.845578, -2.1115575, -2.7763805, 3.7984102, -2.1553535, -2.9311543, 3.845578, -2.1115575, -2.7222042, 3.8329906, -2.3231764, -2.7763805, 3.7984102, -2.1553535, -2.7222042, 3.6880543, -2.0503378, -2.7222042, 3.8329906, -2.3231764, -2.6525536, 3.7145243, -2.3075337, -3.1401043, 3.6880543, -2.0503378, -2.9311543, 3.845578, -2.1115575, -2.9311543, 3.695728, -1.988307, -3.1401043, 3.6880543, -2.0503378, -3.085928, 3.7984102, -2.1553535, -2.9311543, 3.845578, -2.1115575, -3.2097464, 3.7145243, -2.3075337, -3.085928, 3.7984102, -2.1553535, -3.1401043, 3.6880543, -2.0503378, -2.9311543, 3.845578, -2.1115575, -2.9311543, 3.8817086, -2.3282094, -2.7222042, 3.8329906, -2.3231764, -3.085928, 3.7984102, -2.1553535, -2.9311543, 3.8817086, -2.3282094, -2.9311543, 3.845578, -2.1115575, -2.6525536, 3.7145243, -2.3075337, -2.7222042, 3.8329906, -2.3231764, -2.7763805, 3.7797475, -2.4554658, -2.9311543, 3.8817086, -2.3282094, -2.7763805, 3.7797475, -2.4554658, -2.7222042, 3.8329906, -2.3231764, -2.6525536, 3.7145243, -2.3075337, -2.7763805, 3.7797475, -2.4554658, -2.7222042, 3.697219, -2.5090442, -3.2097464, 3.7145243, -2.3075337, -3.1401043, 3.8329906, -2.3231764, -3.085928, 3.7984102, -2.1553535, -3.085928, 3.7984102, -2.1553535, -3.1401043, 3.8329906, -2.3231764, -2.9311543, 3.8817086, -2.3282094, -3.1401043, 3.697219, -2.5090442, -3.1401043, 3.8329906, -2.3231764, -3.2097464, 3.7145243, -2.3075337, -2.9311543, 3.812152, -2.5115814, -2.7222042, 3.697219, -2.5090442, -2.7763805, 3.7797475, -2.4554658, -2.9311543, 3.8817086, -2.3282094, -2.9311543, 3.812152, -2.5115814, -2.7763805, 3.7797475, -2.4554658, -3.1401043, 3.8329906, -2.3231764, -2.9311543, 3.812152, -2.5115814, -2.9311543, 3.8817086, -2.3282094, -2.9311543, 3.812152, -2.5115814, -2.9311543, 3.687878, -2.5769706, -2.7222042, 3.697219, -2.5090442, -3.1401043, 3.697219, -2.5090442, -3.085928, 3.7797475, -2.4554658, -3.1401043, 3.8329906, -2.3231764, -3.1401043, 3.8329906, -2.3231764, -3.085928, 3.7797475, -2.4554658, -2.9311543, 3.812152, -2.5115814, -3.085928, 3.7797475, -2.4554658, -3.1401043, 3.697219, -2.5090442, -2.9311543, 3.687878, -2.5769706, -3.085928, 3.7797475, -2.4554658, -2.9311543, 3.687878, -2.5769706, -2.9311543, 3.812152, -2.5115814, -16.306217, 3.8995876, -8.693363, -16.639778, 3.6870875, -8.751106, -16.484772, 3.8599336, -8.475517, -16.306217, 3.8995876, -8.693363, -16.341208, 3.7667115, -8.942926, -16.639778, 3.6870875, -8.751106, -16.484772, 3.8599336, -8.475517, -16.639778, 3.6870875, -8.751106, -16.958773, 3.7667115, -8.595573, -16.484772, 3.8599336, -8.475517, -16.958773, 3.7667115, -8.595573, -16.763668, 3.8995876, -8.436068, -16.639778, 3.6870875, -8.751106, -17.035208, 3.6513293, -8.918842, -16.958773, 3.7667115, -8.595573, -16.639778, 3.6870875, -8.751106, -16.83802, 3.579765, -9.103563, -17.035208, 3.6513293, -8.918842, -16.341208, 3.7667115, -8.942926, -16.83802, 3.579765, -9.103563, -16.639778, 3.6870875, -8.751106, -16.341208, 3.7667115, -8.942926, -16.577757, 3.6513293, -9.17614, -16.83802, 3.579765, -9.103563, -16.108875, 3.6335871, -8.122934, -16.322905, 3.5589838, -8.187733, -16.219904, 3.5909493, -8.004604, -16.108875, 3.6335871, -8.122934, -16.138561, 3.607314, -8.286205, -16.322905, 3.5589838, -8.187733, -16.219904, 3.5909493, -8.004604, -16.322905, 3.5589838, -8.187733, -16.502796, 3.607314, -8.081339, -16.219904, 3.5909493, -8.004604, -16.502796, 3.607314, -8.081339, -16.378687, 3.6335871, -7.9711776, -16.322905, 3.5589838, -8.187733, -16.553732, 3.6077974, -8.2823925, -16.502796, 3.607314, -8.081339, -16.322905, 3.5589838, -8.187733, -16.443384, 3.5811167, -8.401934, -16.553732, 3.6077974, -8.2823925, -16.138561, 3.607314, -8.286205, -16.443384, 3.5811167, -8.401934, -16.322905, 3.5589838, -8.187733, -16.138561, 3.607314, -8.286205, -16.28392, 3.6077974, -8.434149, -16.443384, 3.5811167, -8.401934, -16.577753, 3.651332, -9.176138, -16.915924, 3.7287025, -9.242073, -16.838017, 3.5797634, -9.1035595, -16.838017, 3.5797634, -9.1035595, -16.915924, 3.7287025, -9.242073, -17.174082, 3.7524595, -8.97838, -16.577753, 3.651332, -9.176138, -16.556507, 3.7524595, -9.325739, -16.915924, 3.7287025, -9.242073, -16.838017, 3.5797634, -9.1035595, -17.174082, 3.7524595, -8.97838, -17.035204, 3.651332, -8.91884, -16.341192, 3.766715, -8.942926, -16.556507, 3.7524595, -9.325739, -16.577753, 3.651332, -9.176138, -17.035204, 3.651332, -8.91884, -17.174082, 3.7524595, -8.97838, -17.083666, 3.943858, -8.576735, -16.341192, 3.766715, -8.942926, -16.260246, 3.943858, -9.039871, -16.556507, 3.7524595, -9.325739, -17.035204, 3.651332, -8.91884, -17.083666, 3.943858, -8.576735, -16.958767, 3.7667148, -8.595568, -16.306215, 3.8995948, -8.693367, -16.260246, 3.943858, -9.039871, -16.341192, 3.766715, -8.942926, -16.958767, 3.7667148, -8.595568, -17.083666, 3.943858, -8.576735, -16.81843, 4.033209, -8.346062, -16.306215, 3.8995948, -8.693367, -16.200855, 4.033209, -8.6934185, -16.260246, 3.943858, -9.039871, -16.958767, 3.7667148, -8.595568, -16.81843, 4.033209, -8.346062, -16.763666, 3.8995945, -8.4360695, -16.200855, 4.033209, -8.6934185, -16.306215, 3.8995948, -8.693367, -16.484772, 3.8599298, -8.475521, -16.453936, 4.0577397, -8.420694, -16.763666, 3.8995945, -8.4360695, -16.81843, 4.033209, -8.346062, -16.200855, 4.033209, -8.6934185, -16.484772, 3.8599298, -8.475521, -16.453936, 4.0577397, -8.420694, -16.453936, 4.0577397, -8.420694, -16.484772, 3.8599298, -8.475521, -16.763666, 3.8995945, -8.4360695, -16.915924, 3.7287025, -9.242073, -17.043386, 3.9892056, -8.933388, -17.174082, 3.7524595, -8.97838, -17.174082, 3.7524595, -8.97838, -17.043386, 3.9892056, -8.933388, -17.00221, 4.141672, -8.672808, -16.915924, 3.7287025, -9.242073, -16.862286, 4.038946, -9.146708, -17.043386, 3.9892056, -8.933388, -16.862286, 4.038946, -9.146708, -17.00221, 4.141672, -8.672808, -17.043386, 3.9892056, -8.933388, -17.174082, 3.7524595, -8.97838, -17.00221, 4.141672, -8.672808, -17.083666, 3.943858, -8.576735, -16.556507, 3.7524595, -9.325739, -16.862286, 4.038946, -9.146708, -16.915924, 3.7287025, -9.242073, -16.556507, 3.7524595, -9.325739, -16.585936, 3.9892056, -9.190685, -16.862286, 4.038946, -9.146708, -16.260246, 3.943858, -9.039871, -16.585936, 3.9892056, -9.190685, -16.556507, 3.7524595, -9.325739, -16.862286, 4.038946, -9.146708, -16.703352, 4.2222047, -8.864136, -17.00221, 4.141672, -8.672808, -16.585936, 3.9892056, -9.190685, -16.703352, 4.2222047, -8.864136, -16.862286, 4.038946, -9.146708, -17.083666, 3.943858, -8.576735, -17.00221, 4.141672, -8.672808, -16.803688, 4.1336036, -8.507227, -16.703352, 4.2222047, -8.864136, -16.803688, 4.1336036, -8.507227, -17.00221, 4.141672, -8.672808, -17.083666, 3.943858, -8.576735, -16.803688, 4.1336036, -8.507227, -16.81843, 4.033209, -8.346062, -16.260246, 3.943858, -9.039871, -16.384638, 4.141672, -9.020166, -16.585936, 3.9892056, -9.190685, -16.585936, 3.9892056, -9.190685, -16.384638, 4.141672, -9.020166, -16.703352, 4.2222047, -8.864136, -16.200855, 4.033209, -8.6934185, -16.384638, 4.141672, -9.020166, -16.260246, 3.943858, -9.039871, -16.540348, 4.2177877, -8.574329, -16.81843, 4.033209, -8.346062, -16.803688, 4.1336036, -8.507227, -16.703352, 4.2222047, -8.864136, -16.540348, 4.2177877, -8.574329, -16.803688, 4.1336036, -8.507227, -16.384638, 4.141672, -9.020166, -16.540348, 4.2177877, -8.574329, -16.703352, 4.2222047, -8.864136, -16.540348, 4.2177877, -8.574329, -16.453936, 4.0577397, -8.420694, -16.81843, 4.033209, -8.346062, -16.200855, 4.033209, -8.6934185, -16.346237, 4.1336036, -8.764523, -16.384638, 4.141672, -9.020166, -16.384638, 4.141672, -9.020166, -16.346237, 4.1336036, -8.764523, -16.540348, 4.2177877, -8.574329, -16.346237, 4.1336036, -8.764523, -16.200855, 4.033209, -8.6934185, -16.453936, 4.0577397, -8.420694, -16.346237, 4.1336036, -8.764523, -16.453936, 4.0577397, -8.420694, -16.540348, 4.2177877, -8.574329, -16.548744, 3.324795, -8.800255, -16.694132, 3.4312131, -8.847736, -16.650524, 3.2713976, -8.770206, -16.548744, 3.324795, -8.800255, -16.550304, 3.4427547, -8.876886, -16.694132, 3.4312131, -8.847736, -16.462482, 3.3060188, -8.720747, -16.548744, 3.324795, -8.800255, -16.650524, 3.2713976, -8.770206, -16.462482, 3.3060188, -8.720747, -16.550304, 3.4427547, -8.876886, -16.548744, 3.324795, -8.800255, -16.550304, 3.4427547, -8.876886, -16.716091, 3.7502089, -8.886778, -16.694132, 3.4312131, -8.847736, -16.694132, 3.4312131, -8.847736, -16.716091, 3.7502089, -8.886778, -16.789055, 3.7591841, -8.805498, -16.550304, 3.4427547, -8.876886, -16.608738, 3.7591841, -8.906918, -16.716091, 3.7502089, -8.886778, -16.694132, 3.4312131, -8.847736, -16.789055, 3.7591841, -8.805498, -16.793737, 3.4427545, -8.739965, -16.650524, 3.2713976, -8.770206, -16.694132, 3.4312131, -8.847736, -16.793737, 3.4427545, -8.739965, -16.793737, 3.4427545, -8.739965, -16.789055, 3.7591841, -8.805498, -16.771488, 3.784827, -8.700407, -16.44341, 3.477376, -8.781784, -16.608738, 3.7591841, -8.906918, -16.550304, 3.4427547, -8.876886, -16.462482, 3.3060188, -8.720747, -16.44341, 3.477376, -8.781784, -16.550304, 3.4427547, -8.876886, -16.44341, 3.477376, -8.781784, -16.528055, 3.784827, -8.837328, -16.608738, 3.7591841, -8.906918, -16.793737, 3.4427545, -8.739965, -16.771488, 3.784827, -8.700407, -16.767986, 3.477376, -8.599226, -16.767986, 3.477376, -8.599226, -16.771488, 3.784827, -8.700407, -16.6908, 3.810473, -8.630808, -16.650524, 3.2713976, -8.770206, -16.793737, 3.4427545, -8.739965, -16.729061, 3.324795, -8.698833, -16.729061, 3.324795, -8.698833, -16.793737, 3.4427545, -8.739965, -16.767986, 3.477376, -8.599226, -16.462482, 3.3060188, -8.720747, -16.650524, 3.2713976, -8.770206, -16.577034, 3.2488902, -8.639545, -16.577034, 3.2488902, -8.639545, -16.650524, 3.2713976, -8.770206, -16.729061, 3.324795, -8.698833, -16.450489, 3.3760836, -8.6255665, -16.44341, 3.477376, -8.781784, -16.462482, 3.3060188, -8.720747, -16.450489, 3.3760836, -8.6255665, -16.462482, 3.3060188, -8.720747, -16.577034, 3.2488902, -8.639545, -16.417662, 3.5119941, -8.641058, -16.528055, 3.784827, -8.837328, -16.44341, 3.477376, -8.781784, -16.450489, 3.3760836, -8.6255665, -16.417662, 3.5119941, -8.641058, -16.44341, 3.477376, -8.781784, -16.417662, 3.5119941, -8.641058, -16.510483, 3.810473, -8.732229, -16.528055, 3.784827, -8.837328, -16.450489, 3.3760836, -8.6255665, -16.577034, 3.2488902, -8.639545, -16.517881, 3.340637, -8.534378, -16.417662, 3.5119941, -8.641058, -16.450489, 3.3760836, -8.6255665, -16.517881, 3.340637, -8.534378, -16.577034, 3.2488902, -8.639545, -16.729061, 3.324795, -8.698833, -16.705917, 3.3060188, -8.583826, -16.517881, 3.340637, -8.534378, -16.577034, 3.2488902, -8.639545, -16.705917, 3.3060188, -8.583826, -16.729061, 3.324795, -8.698833, -16.767986, 3.477376, -8.599226, -16.705917, 3.3060188, -8.583826, -16.517881, 3.340637, -8.534378, -16.705917, 3.3060188, -8.583826, -16.630806, 3.3760836, -8.524145, -16.510483, 3.810473, -8.732229, -16.417662, 3.5119941, -8.641058, -16.517267, 3.5235355, -8.533287, -16.417662, 3.5119941, -8.641058, -16.517881, 3.340637, -8.534378, -16.517267, 3.5235355, -8.533287, -16.517267, 3.5235355, -8.533287, -16.517881, 3.340637, -8.534378, -16.630806, 3.3760836, -8.524145, -16.510483, 3.810473, -8.732229, -16.517267, 3.5235355, -8.533287, -16.583447, 3.8194482, -8.6509495, -16.705917, 3.3060188, -8.583826, -16.767986, 3.477376, -8.599226, -16.661095, 3.5119941, -8.504137, -16.705917, 3.3060188, -8.583826, -16.661095, 3.5119941, -8.504137, -16.630806, 3.3760836, -8.524145, -16.517267, 3.5235355, -8.533287, -16.630806, 3.3760836, -8.524145, -16.661095, 3.5119941, -8.504137, -16.583447, 3.8194482, -8.6509495, -16.517267, 3.5235355, -8.533287, -16.661095, 3.5119941, -8.504137, -16.767986, 3.477376, -8.599226, -16.6908, 3.810473, -8.630808, -16.661095, 3.5119941, -8.504137, -16.583447, 3.8194482, -8.6509495, -16.661095, 3.5119941, -8.504137, -16.6908, 3.810473, -8.630808, -16.30509, 3.357844, -8.280506, -16.37834, 3.439557, -8.2862835, -16.369993, 3.333033, -8.271444, -16.30509, 3.357844, -8.280506, -16.293167, 3.436849, -8.302855, -16.37834, 3.439557, -8.2862835, -16.258024, 3.324914, -8.240377, -16.30509, 3.357844, -8.280506, -16.369993, 3.333033, -8.271444, -16.258024, 3.324914, -8.240377, -16.293167, 3.436849, -8.302855, -16.30509, 3.357844, -8.280506, -16.293167, 3.436849, -8.302855, -16.358952, 3.625382, -8.251812, -16.37834, 3.439557, -8.2862835, -16.37834, 3.439557, -8.2862835, -16.358952, 3.625382, -8.251812, -16.401714, 3.6232772, -8.20339, -16.293167, 3.436849, -8.302855, -16.29536, 3.6232772, -8.263208, -16.358952, 3.625382, -8.251812, -16.37834, 3.439557, -8.2862835, -16.401714, 3.6232772, -8.20339, -16.436735, 3.436849, -8.222103, -16.369993, 3.333033, -8.271444, -16.37834, 3.439557, -8.2862835, -16.436735, 3.436849, -8.222103, -16.436735, 3.436849, -8.222103, -16.401714, 3.6232772, -8.20339, -16.390556, 3.61726, -8.140003, -16.229052, 3.4287403, -8.244873, -16.29536, 3.6232772, -8.263208, -16.293167, 3.436849, -8.302855, -16.258024, 3.324914, -8.240377, -16.229052, 3.4287403, -8.244873, -16.293167, 3.436849, -8.302855, -16.229052, 3.4287403, -8.244873, -16.246988, 3.61726, -8.220755, -16.29536, 3.6232772, -8.263208, -16.436735, 3.436849, -8.222103, -16.390556, 3.61726, -8.140003, -16.420483, 3.4287403, -8.137201, -16.420483, 3.4287403, -8.137201, -16.390556, 3.61726, -8.140003, -16.342186, 3.6112542, -8.097551, -16.369993, 3.333033, -8.271444, -16.436735, 3.436849, -8.222103, -16.411444, 3.357844, -8.220686, -16.411444, 3.357844, -8.220686, -16.436735, 3.436849, -8.222103, -16.420483, 3.4287403, -8.137201, -16.258024, 3.324914, -8.240377, -16.369993, 3.333033, -8.271444, -16.331488, 3.290307, -8.202984, -16.331488, 3.290307, -8.202984, -16.369993, 3.333033, -8.271444, -16.411444, 3.357844, -8.220686, -16.245562, 3.3458211, -8.174669, -16.229052, 3.4287403, -8.244873, -16.258024, 3.324914, -8.240377, -16.245562, 3.3458211, -8.174669, -16.258024, 3.324914, -8.240377, -16.331488, 3.290307, -8.202984, -16.212805, 3.4206195, -8.159981, -16.246988, 3.61726, -8.220755, -16.229052, 3.4287403, -8.244873, -16.245562, 3.3458211, -8.174669, -16.212805, 3.4206195, -8.159981, -16.229052, 3.4287403, -8.244873, -16.212805, 3.4206195, -8.159981, -16.235832, 3.6112542, -8.1573715, -16.246988, 3.61726, -8.220755, -16.245562, 3.3458211, -8.174669, -16.331488, 3.290307, -8.202984, -16.28963, 3.3167934, -8.128569, -16.212805, 3.4206195, -8.159981, -16.245562, 3.3458211, -8.174669, -16.28963, 3.3167934, -8.128569, -16.331488, 3.290307, -8.202984, -16.411444, 3.357844, -8.220686, -16.401594, 3.324914, -8.159626, -16.28963, 3.3167934, -8.128569, -16.331488, 3.290307, -8.202984, -16.401594, 3.324914, -8.159626, -16.411444, 3.357844, -8.220686, -16.420483, 3.4287403, -8.137201, -16.401594, 3.324914, -8.159626, -16.28963, 3.3167934, -8.128569, -16.401594, 3.324914, -8.159626, -16.351915, 3.3458211, -8.114849, -16.235832, 3.6112542, -8.1573715, -16.212805, 3.4206195, -8.159981, -16.271194, 3.4179132, -8.095791, -16.212805, 3.4206195, -8.159981, -16.28963, 3.3167934, -8.128569, -16.271194, 3.4179132, -8.095791, -16.271194, 3.4179132, -8.095791, -16.28963, 3.3167934, -8.128569, -16.351915, 3.3458211, -8.114849, -16.235832, 3.6112542, -8.1573715, -16.271194, 3.4179132, -8.095791, -16.278595, 3.6091392, -8.108948, -16.401594, 3.324914, -8.159626, -16.420483, 3.4287403, -8.137201, -16.356375, 3.4206195, -8.079229, -16.401594, 3.324914, -8.159626, -16.356375, 3.4206195, -8.079229, -16.351915, 3.3458211, -8.114849, -16.271194, 3.4179132, -8.095791, -16.351915, 3.3458211, -8.114849, -16.356375, 3.4206195, -8.079229, -16.278595, 3.6091392, -8.108948, -16.271194, 3.4179132, -8.095791, -16.356375, 3.4206195, -8.079229, -16.420483, 3.4287403, -8.137201, -16.342186, 3.6112542, -8.097551, -16.356375, 3.4206195, -8.079229, -16.278595, 3.6091392, -8.108948, -16.356375, 3.4206195, -8.079229, -16.342186, 3.6112542, -8.097551, -16.283928, 3.6077967, -8.434147, -16.471827, 3.6957262, -8.4524975, -16.443388, 3.5811198, -8.4019375, -16.443388, 3.5811198, -8.4019375, -16.471827, 3.6957262, -8.4524975, -16.623535, 3.6880524, -8.295998, -16.283928, 3.6077967, -8.434147, -16.259296, 3.6880524, -8.500866, -16.471827, 3.6957262, -8.4524975, -16.443388, 3.5811198, -8.4019375, -16.623535, 3.6880524, -8.295998, -16.553728, 3.6077967, -8.282396, -16.138565, 3.6073067, -8.286215, -16.259296, 3.6880524, -8.500866, -16.283928, 3.6077967, -8.434147, -16.553728, 3.6077967, -8.282396, -16.623535, 3.6880524, -8.295998, -16.558157, 3.7145224, -8.0376835, -16.138565, 3.6073067, -8.286215, -16.072512, 3.7145224, -8.310837, -16.259296, 3.6880524, -8.500866, -16.553728, 3.6077967, -8.282396, -16.558157, 3.7145224, -8.0376835, -16.502804, 3.6073067, -8.0813465, -16.108883, 3.6335866, -8.122932, -16.072512, 3.7145224, -8.310837, -16.138565, 3.6073067, -8.286215, -16.502804, 3.6073067, -8.0813465, -16.558157, 3.7145224, -8.0376835, -16.398663, 3.697217, -7.896193, -16.108883, 3.6335866, -8.122932, -16.034424, 3.697217, -8.101061, -16.072512, 3.7145224, -8.310837, -16.502804, 3.6073067, -8.0813465, -16.398663, 3.697217, -7.896193, -16.378683, 3.6335866, -7.9711814, -16.034424, 3.697217, -8.101061, -16.108883, 3.6335866, -8.122932, -16.219902, 3.5909512, -8.004599, -16.183245, 3.687876, -7.939423, -16.378683, 3.6335866, -7.9711814, -16.398663, 3.697217, -7.896193, -16.034424, 3.697217, -8.101061, -16.219902, 3.5909512, -8.004599, -16.183245, 3.687876, -7.939423, -16.183245, 3.687876, -7.939423, -16.219902, 3.5909512, -8.004599, -16.378683, 3.6335866, -7.9711814, -16.471827, 3.6957262, -8.4524975, -16.524834, 3.7984083, -8.231026, -16.623535, 3.6880524, -8.295998, -16.623535, 3.6880524, -8.295998, -16.524834, 3.7984083, -8.231026, -16.48978, 3.8329887, -8.058193, -16.471827, 3.6957262, -8.4524975, -16.411404, 3.845576, -8.345074, -16.524834, 3.7984083, -8.231026, -16.411404, 3.845576, -8.345074, -16.48978, 3.8329887, -8.058193, -16.524834, 3.7984083, -8.231026, -16.623535, 3.6880524, -8.295998, -16.48978, 3.8329887, -8.058193, -16.558157, 3.7145224, -8.0376835, -16.259296, 3.6880524, -8.500866, -16.411404, 3.845576, -8.345074, -16.471827, 3.6957262, -8.4524975, -16.259296, 3.6880524, -8.500866, -16.255035, 3.7984083, -8.382776, -16.411404, 3.845576, -8.345074, -16.072512, 3.7145224, -8.310837, -16.255035, 3.7984083, -8.382776, -16.259296, 3.6880524, -8.500866, -16.411404, 3.845576, -8.345074, -16.305195, 3.881707, -8.156242, -16.48978, 3.8329887, -8.058193, -16.255035, 3.7984083, -8.382776, -16.305195, 3.881707, -8.156242, -16.411404, 3.845576, -8.345074, -16.558157, 3.7145224, -8.0376835, -16.48978, 3.8329887, -8.058193, -16.377708, 3.7797456, -7.9694505, -16.305195, 3.881707, -8.156242, -16.377708, 3.7797456, -7.9694505, -16.48978, 3.8329887, -8.058193, -16.558157, 3.7145224, -8.0376835, -16.377708, 3.7797456, -7.9694505, -16.398663, 3.697217, -7.896193, -16.072512, 3.7145224, -8.310837, -16.125544, 3.8329887, -8.263062, -16.255035, 3.7984083, -8.382776, -16.255035, 3.7984083, -8.382776, -16.125544, 3.8329887, -8.263062, -16.305195, 3.881707, -8.156242, -16.034424, 3.697217, -8.101061, -16.125544, 3.8329887, -8.263062, -16.072512, 3.7145224, -8.310837, -16.2153, 3.8121502, -7.9964156, -16.398663, 3.697217, -7.896193, -16.377708, 3.7797456, -7.9694505, -16.305195, 3.881707, -8.156242, -16.2153, 3.8121502, -7.9964156, -16.377708, 3.7797456, -7.9694505, -16.125544, 3.8329887, -8.263062, -16.2153, 3.8121502, -7.9964156, -16.305195, 3.881707, -8.156242, -16.2153, 3.8121502, -7.9964156, -16.183245, 3.687876, -7.939423, -16.398663, 3.697217, -7.896193, -16.034424, 3.697217, -8.101061, -16.10791, 3.7797456, -8.121201, -16.125544, 3.8329887, -8.263062, -16.125544, 3.8329887, -8.263062, -16.10791, 3.7797456, -8.121201, -16.2153, 3.8121502, -7.9964156, -16.10791, 3.7797456, -8.121201, -16.034424, 3.697217, -8.101061, -16.183245, 3.687876, -7.939423, -16.10791, 3.7797456, -8.121201, -16.183245, 3.687876, -7.939423, -16.2153, 3.8121502, -7.9964156, -7.086538, 9.0531025, 23.60468, -7.939819, 8.776951, 23.477636, -7.89693, 8.906714, 23.382841, -7.086538, 9.0531025, 23.60468, -7.1825204, 8.414909, 24.04463, -7.939819, 8.776951, 23.477636, -6.961786, 8.872082, 22.884235, -7.2900796, 8.958991, 23.246565, -7.2749104, 8.879946, 22.997782, -6.961786, 8.872082, 22.884235, -7.086538, 9.0531025, 23.60468, -7.2900796, 8.958991, 23.246565, -3.8860898, 6.9690914, 23.62356, -4.5446486, 7.7101564, 23.798996, -4.6237864, 7.655897, 23.206228, -3.8860898, 6.9690914, 23.62356, -3.8783517, 6.953966, 23.7307, -4.5446486, 7.7101564, 23.798996, -4.5446486, 7.7101564, 23.798996, -4.823362, 7.815732, 23.123234, -4.6237864, 7.655897, 23.206228, -4.5446486, 7.7101564, 23.798996, -4.899761, 7.976705, 23.460878, -4.823362, 7.815732, 23.123234, -4.899761, 7.976705, 23.460878, -4.5446486, 7.7101564, 23.798996, -5.2783494, 8.404766, 23.83276, -4.899761, 7.976705, 23.460878, -5.2783494, 8.404766, 23.83276, -5.3587403, 8.23149, 22.899555, -4.899761, 7.976705, 23.460878, -5.3587403, 8.23149, 22.899555, -5.0027404, 7.957439, 23.048418, -5.3587403, 8.23149, 22.899555, -5.5498886, 8.408549, 23.109316, -5.46656, 8.274823, 22.889973, -5.3587403, 8.23149, 22.899555, -5.2783494, 8.404766, 23.83276, -5.5498886, 8.408549, 23.109316, -6.134132, 8.667774, 22.83608, -6.545529, 8.861699, 23.146437, -6.347387, 8.715011, 22.84835, -6.134132, 8.667774, 22.83608, -6.2255015, 8.901371, 23.757235, -6.545529, 8.861699, 23.146437, -3.9216104, 6.895205, 23.810205, -4.5446486, 7.7101564, 23.798996, -3.8783517, 6.953966, 23.7307, -4.5446486, 7.7101564, 23.798996, -3.9216104, 6.895205, 23.810205, -4.32818, 7.252925, 23.874067, -4.32818, 7.252925, 23.874067, -3.9216104, 6.895205, 23.810205, -4.2883744, 7.0421944, 23.9518, -4.5446486, 7.7101564, 23.798996, -5.1261964, 7.754751, 24.078827, -5.2783494, 8.404766, 23.83276, -4.5446486, 7.7101564, 23.798996, -4.9056582, 7.542821, 24.083008, -5.1261964, 7.754751, 24.078827, -5.6396194, 7.681168, 24.366714, -6.2255015, 8.901371, 23.757235, -5.2783494, 8.404766, 23.83276, -6.2255015, 8.901371, 23.757235, -5.6396194, 7.681168, 24.366714, -6.046368, 7.8717294, 24.331638, -6.2255015, 8.901371, 23.757235, -6.046368, 7.8717294, 24.331638, -6.119331, 8.248653, 24.137571, -6.7146773, 8.708108, 23.8794, -7.086538, 9.0531025, 23.60468, -6.2255015, 8.901371, 23.757235, -7.086538, 9.0531025, 23.60468, -6.7146773, 8.708108, 23.8794, -7.0044417, 8.349307, 24.104824, -7.086538, 9.0531025, 23.60468, -7.0044417, 8.349307, 24.104824, -7.1825204, 8.414909, 24.04463, -6.2255015, 8.901371, 23.757235, -5.5498886, 8.408549, 23.109316, -5.2783494, 8.404766, 23.83276, -5.953386, 8.703066, 23.382, -5.5498886, 8.408549, 23.109316, -6.2255015, 8.901371, 23.757235, -5.5498886, 8.408549, 23.109316, -5.953386, 8.703066, 23.382, -5.8336997, 8.425533, 22.857294, -5.5498886, 8.408549, 23.109316, -5.8336997, 8.425533, 22.857294, -5.650786, 8.361013, 22.874142, -6.2255015, 8.901371, 23.757235, -5.9328055, 8.570662, 22.853338, -5.953386, 8.703066, 23.382, -6.2255015, 8.901371, 23.757235, -6.134132, 8.667774, 22.83608, -5.9328055, 8.570662, 22.853338, -6.119331, 8.248653, 24.137571, -6.4117084, 8.071957, 24.301369, -6.2255015, 8.901371, 23.757235, -6.119331, 8.248653, 24.137571, -6.237124, 7.9882894, 24.31635, -6.4117084, 8.071957, 24.301369, -7.086538, 9.0531025, 23.60468, -6.545529, 8.861699, 23.146437, -6.2255015, 8.901371, 23.757235, -6.545529, 8.861699, 23.146437, -7.086538, 9.0531025, 23.60468, -6.961786, 8.872082, 22.884235, -6.545529, 8.861699, 23.146437, -6.961786, 8.872082, 22.884235, -6.66091, 8.812481, 22.867199, -6.7146773, 8.708108, 23.8794, -6.4117084, 8.071957, 24.301369, -6.875569, 8.223388, 24.143358, -6.7146773, 8.708108, 23.8794, -6.2255015, 8.901371, 23.757235, -6.4117084, 8.071957, 24.301369, -7.89693, 8.906714, 23.382841, -7.2900796, 8.958991, 23.246565, -7.086538, 9.0531025, 23.60468, -7.2900796, 8.958991, 23.246565, -7.89693, 8.906714, 23.382841, -7.890431, 8.871303, 23.22045, -7.2900796, 8.958991, 23.246565, -7.890431, 8.871303, 23.22045, -7.484878, 8.8925495, 23.073898, -5.1261964, 7.754751, 24.078827, -5.6396194, 7.681168, 24.366714, -5.2783494, 8.404766, 23.83276, -5.1261964, 7.754751, 24.078827, -5.328693, 7.544381, 24.286783, -5.6396194, 7.681168, 24.366714, -4.9056582, 7.542821, 24.083008, -5.1280284, 7.4066963, 24.234045, -5.1261964, 7.754751, 24.078827, -4.9056582, 7.542821, 24.083008, -5.0212817, 7.379748, 24.207062, -5.1280284, 7.4066963, 24.234045, -4.9056582, 7.542821, 24.083008, -4.5446486, 7.7101564, 23.798996, -4.804087, 7.2903175, 24.15141, -4.32818, 7.252925, 23.874067, -4.804087, 7.2903175, 24.15141, -4.5446486, 7.7101564, 23.798996, -4.32818, 7.252925, 23.874067, -4.4737935, 7.144829, 24.02375, -4.804087, 7.2903175, 24.15141, -8.469263, 8.833129, 23.903402, -7.7564616, 8.8668, 23.1668, -7.7024093, 8.948188, 23.326448, -8.469263, 8.833129, 23.903402, -8.792166, 8.398045, 23.2395, -7.7564616, 8.8668, 23.1668, -7.939649, 8.319658, 24.36807, -8.019506, 8.693222, 23.9122, -7.814714, 8.502601, 24.04807, -7.939649, 8.319658, 24.36807, -8.469263, 8.833129, 23.903402, -8.019506, 8.693222, 23.9122, -10.742025, 5.3900876, 25.65433, -10.427696, 6.4519587, 25.310745, -9.86124, 6.2139215, 25.59392, -10.742025, 5.3900876, 25.65433, -10.839937, 5.4104342, 25.586737, -10.427696, 6.4519587, 25.310745, -10.427696, 6.4519587, 25.310745, -9.6490345, 6.4258494, 25.54795, -9.86124, 6.2139215, 25.59392, -10.427696, 6.4519587, 25.310745, -9.8865795, 6.741735, 25.338587, -9.6490345, 6.4258494, 25.54795, -9.8865795, 6.741735, 25.338587, -10.427696, 6.4519587, 25.310745, -9.939594, 7.468337, 24.97506, -9.8865795, 6.741735, 25.338587, -9.939594, 7.468337, 24.97506, -9.078133, 6.986556, 25.424217, -9.8865795, 6.741735, 25.338587, -9.078133, 6.986556, 25.424217, -9.458067, 6.6153927, 25.506601, -9.078133, 6.986556, 25.424217, -9.126747, 7.324047, 25.200722, -8.992649, 7.0699244, 25.362774, -9.078133, 6.986556, 25.424217, -9.939594, 7.468337, 24.97506, -9.126747, 7.324047, 25.200722, -8.48115, 7.732603, 24.99367, -8.460228, 8.226148, 24.537516, -8.340681, 7.875271, 24.831814, -8.48115, 7.732603, 24.99367, -9.20825, 8.35639, 24.448666, -8.460228, 8.226148, 24.537516, -10.878963, 5.39891, 25.472626, -10.427696, 6.4519587, 25.310745, -10.839937, 5.4104342, 25.586737, -10.427696, 6.4519587, 25.310745, -10.878963, 5.39891, 25.472626, -10.647385, 5.933868, 25.242573, -10.647385, 5.933868, 25.242573, -10.878963, 5.39891, 25.472626, -10.741941, 5.7328005, 25.138784, -10.427696, 6.4519587, 25.310745, -10.264824, 6.8368664, 24.649649, -9.939594, 7.468337, 24.97506, -10.427696, 6.4519587, 25.310745, -10.423819, 6.5334654, 24.740517, -10.264824, 6.8368664, 24.649649, -10.154926, 7.080727, 23.99825, -9.20825, 8.35639, 24.448666, -9.939594, 7.468337, 24.97506, -9.20825, 8.35639, 24.448666, -10.154926, 7.080727, 23.99825, -9.836353, 7.4272223, 23.768997, -9.20825, 8.35639, 24.448666, -9.836353, 7.4272223, 23.768997, -9.618614, 7.784581, 23.992184, -8.975733, 8.430757, 23.866367, -8.469263, 8.833129, 23.903402, -9.20825, 8.35639, 24.448666, -8.469263, 8.833129, 23.903402, -8.975733, 8.430757, 23.866367, -8.970964, 8.277404, 23.316208, -8.469263, 8.833129, 23.903402, -8.970964, 8.277404, 23.316208, -8.792166, 8.398045, 23.2395, -9.20825, 8.35639, 24.448666, -9.126747, 7.324047, 25.200722, -9.939594, 7.468337, 24.97506, -9.079264, 7.896097, 24.814846, -9.126747, 7.324047, 25.200722, -9.20825, 8.35639, 24.448666, -9.126747, 7.324047, 25.200722, -9.079264, 7.896097, 24.814846, -8.702198, 7.3584385, 25.153973, -9.126747, 7.324047, 25.200722, -8.702198, 7.3584385, 25.153973, -8.848383, 7.227356, 25.258986, -9.20825, 8.35639, 24.448666, -8.638075, 7.5534444, 25.106686, -9.079264, 7.896097, 24.814846, -9.20825, 8.35639, 24.448666, -8.48115, 7.732603, 24.99367, -8.638075, 7.5534444, 25.106686, -9.618614, 7.784581, 23.992184, -9.555359, 7.787944, 23.5661, -9.20825, 8.35639, 24.448666, -9.618614, 7.784581, 23.992184, -9.691614, 7.632971, 23.664253, -9.555359, 7.787944, 23.5661, -8.469263, 8.833129, 23.903402, -8.460228, 8.226148, 24.537516, -9.20825, 8.35639, 24.448666, -8.460228, 8.226148, 24.537516, -8.469263, 8.833129, 23.903402, -7.939649, 8.319658, 24.36807, -8.460228, 8.226148, 24.537516, -7.939649, 8.319658, 24.36807, -8.1381, 8.120274, 24.596785, -8.975733, 8.430757, 23.866367, -9.555359, 7.787944, 23.5661, -9.08618, 8.070576, 23.364449, -8.975733, 8.430757, 23.866367, -9.20825, 8.35639, 24.448666, -9.555359, 7.787944, 23.5661, -7.7024093, 8.948188, 23.326448, -8.019506, 8.693222, 23.9122, -8.469263, 8.833129, 23.903402, -8.019506, 8.693222, 23.9122, -7.7024093, 8.948188, 23.326448, -7.56801, 8.854256, 23.41686, -8.019506, 8.693222, 23.9122, -7.56801, 8.854256, 23.41686, -7.7330556, 8.652529, 23.835022, -10.264824, 6.8368664, 24.649649, -10.154926, 7.080727, 23.99825, -9.939594, 7.468337, 24.97506, -10.264824, 6.8368664, 24.649649, -10.304508, 6.7830296, 24.250587, -10.154926, 7.080727, 23.99825, -10.423819, 6.5334654, 24.740517, -10.394926, 6.530945, 24.408104, -10.264824, 6.8368664, 24.649649, -10.423819, 6.5334654, 24.740517, -10.448719, 6.45382, 24.497004, -10.394926, 6.530945, 24.408104, -10.423819, 6.5334654, 24.740517, -10.427696, 6.4519587, 25.310745, -10.554361, 6.258996, 24.674118, -10.647385, 5.933868, 25.242573, -10.554361, 6.258996, 24.674118, -10.427696, 6.4519587, 25.310745, -10.647385, 5.933868, 25.242573, -10.675802, 5.9358487, 24.97307, -10.554361, 6.258996, 24.674118, -8.476179, 9.272415, 23.238873, -7.6357913, 8.757383, 23.254288, -7.649511, 8.880784, 23.39443, -8.476179, 9.272415, 23.238873, -8.520136, 8.706246, 22.59189, -7.6357913, 8.757383, 23.254288, -8.663195, 8.882344, 23.984976, -8.29641, 9.024534, 23.588913, -8.32843, 8.858036, 23.843124, -8.663195, 8.882344, 23.984976, -8.476179, 9.272415, 23.238873, -8.29641, 9.024534, 23.588913, -12.152782, 7.7485704, 22.986092, -11.339409, 8.419413, 22.91118, -11.277941, 8.172669, 23.538235, -12.152782, 7.7485704, 22.986092, -12.161711, 7.7648354, 22.866318, -11.339409, 8.419413, 22.91118, -11.339409, 8.419413, 22.91118, -11.045532, 8.272723, 23.64941, -11.277941, 8.172669, 23.538235, -11.339409, 8.419413, 22.91118, -10.934807, 8.523428, 23.311256, -11.045532, 8.272723, 23.64941, -10.934807, 8.523428, 23.311256, -11.339409, 8.419413, 22.91118, -10.46002, 9.004967, 22.97543, -10.934807, 8.523428, 23.311256, -10.46002, 9.004967, 22.97543, -10.420095, 8.532848, 23.947876, -10.934807, 8.523428, 23.311256, -10.420095, 8.532848, 23.947876, -10.836201, 8.361673, 23.749374, -10.420095, 8.532848, 23.947876, -10.197205, 8.742559, 23.74126, -10.297283, 8.550915, 23.961588, -10.420095, 8.532848, 23.947876, -10.46002, 9.004967, 22.97543, -10.197205, 8.742559, 23.74126, -9.557905, 8.814163, 24.051355, -9.097107, 9.033176, 23.725506, -9.326338, 8.822926, 24.033926, -9.557905, 8.814163, 24.051355, -9.396812, 9.323492, 23.09922, -9.097107, 9.033176, 23.725506, -12.129438, 7.7163987, 22.76176, -11.339409, 8.419413, 22.91118, -12.161711, 7.7648354, 22.866318, -11.339409, 8.419413, 22.91118, -12.129438, 7.7163987, 22.76176, -11.6488285, 8.007675, 22.739779, -11.6488285, 8.007675, 22.739779, -12.129438, 7.7163987, 22.76176, -11.723551, 7.814352, 22.611177, -11.339409, 8.419413, 22.91118, -10.748026, 8.414791, 22.562681, -10.46002, 9.004967, 22.97543, -11.339409, 8.419413, 22.91118, -11.012053, 8.2395935, 22.52716, -10.748026, 8.414791, 22.562681, -10.238874, 8.305614, 22.187637, -9.396812, 9.323492, 23.09922, -10.46002, 9.004967, 22.97543, -9.396812, 9.323492, 23.09922, -10.238874, 8.305614, 22.187637, -9.780174, 8.406629, 22.240479, -9.396812, 9.323492, 23.09922, -9.780174, 8.406629, 22.240479, -9.642679, 8.753303, 22.532566, -8.943731, 9.065945, 22.87788, -8.476179, 9.272415, 23.238873, -9.396812, 9.323492, 23.09922, -8.476179, 9.272415, 23.238873, -8.943731, 9.065945, 22.87788, -8.7198925, 8.690582, 22.52244, -8.476179, 9.272415, 23.238873, -8.7198925, 8.690582, 22.52244, -8.520136, 8.706246, 22.59189, -9.396812, 9.323492, 23.09922, -10.197205, 8.742559, 23.74126, -10.46002, 9.004967, 22.97543, -9.730011, 9.053403, 23.47832, -10.197205, 8.742559, 23.74126, -9.396812, 9.323492, 23.09922, -10.197205, 8.742559, 23.74126, -9.730011, 9.053403, 23.47832, -9.879805, 8.6168785, 24.008417, -10.197205, 8.742559, 23.74126, -9.879805, 8.6168785, 24.008417, -10.089674, 8.597132, 23.985575, -9.396812, 9.323492, 23.09922, -9.784039, 8.756422, 24.024965, -9.730011, 9.053403, 23.47832, -9.396812, 9.323492, 23.09922, -9.557905, 8.814163, 24.051355, -9.784039, 8.756422, 24.024965, -9.642679, 8.753303, 22.532566, -9.374041, 8.548035, 22.28962, -9.396812, 9.323492, 23.09922, -9.642679, 8.753303, 22.532566, -9.570545, 8.498457, 22.26675, -9.374041, 8.548035, 22.28962, -8.476179, 9.272415, 23.238873, -9.097107, 9.033176, 23.725506, -9.396812, 9.323492, 23.09922, -9.097107, 9.033176, 23.725506, -8.476179, 9.272415, 23.238873, -8.663195, 8.882344, 23.984976, -9.097107, 9.033176, 23.725506, -8.663195, 8.882344, 23.984976, -8.990536, 8.872201, 24.00973, -8.943731, 9.065945, 22.87788, -9.374041, 8.548035, 22.28962, -8.84972, 8.556498, 22.469631, -8.943731, 9.065945, 22.87788, -9.396812, 9.323492, 23.09922, -9.374041, 8.548035, 22.28962, -7.649511, 8.880784, 23.39443, -8.29641, 9.024534, 23.588913, -8.476179, 9.272415, 23.238873, -8.29641, 9.024534, 23.588913, -7.649511, 8.880784, 23.39443, -7.667808, 8.801199, 23.562954, -8.29641, 9.024534, 23.588913, -7.667808, 8.801199, 23.562954, -8.106319, 8.869322, 23.749159, -10.748026, 8.414791, 22.562681, -10.238874, 8.305614, 22.187637, -10.46002, 9.004967, 22.97543, -10.748026, 8.414791, 22.562681, -10.583004, 8.204302, 22.268263, -10.238874, 8.305614, 22.187637, -11.012053, 8.2395935, 22.52716, -10.796698, 8.076697, 22.316998, -10.748026, 8.414791, 22.562681, -11.012053, 8.2395935, 22.52716, -10.918375, 8.067935, 22.346127, -10.796698, 8.076697, 22.316998, -11.012053, 8.2395935, 22.52716, -11.339409, 8.419413, 22.91118, -11.160143, 8.010557, 22.403072, -11.6488285, 8.007675, 22.739779, -11.160143, 8.010557, 22.403072, -11.339409, 8.419413, 22.91118, -11.6488285, 8.007675, 22.739779, -11.5230255, 7.8992805, 22.537394, -11.160143, 8.010557, 22.403072, -8.041105, 9.099136, 22.774368, -7.6169944, 8.80678, 23.443369, -7.7392535, 8.897409, 23.481745, -8.041105, 9.099136, 22.774368, -7.5259223, 8.667595, 22.517582, -7.6169944, 8.80678, 23.443369, -8.604433, 8.708588, 23.005474, -8.175547, 8.90155, 23.08837, -8.352665, 8.7482605, 23.189362, -8.604433, 8.708588, 23.005474, -8.041105, 9.099136, 22.774368, -8.175547, 8.90155, 23.08837, -9.354351, 7.2679915, 20.05077, -9.012537, 7.976405, 20.566238, -9.399052, 7.74749, 20.912569, -9.354351, 7.2679915, 20.05077, -9.275749, 7.2862973, 19.989244, -9.012537, 7.976405, 20.566238, -9.012537, 7.976405, 20.566238, -9.383741, 7.8629084, 21.12708, -9.399052, 7.74749, 20.912569, -9.012537, 7.976405, 20.566238, -9.122709, 8.10707, 21.038918, -9.383741, 7.8629084, 21.12708, -9.122709, 8.10707, 21.038918, -9.012537, 7.976405, 20.566238, -8.725763, 8.597912, 21.202042, -9.122709, 8.10707, 21.038918, -8.725763, 8.597912, 21.202042, -9.341703, 8.161026, 21.703133, -9.122709, 8.10707, 21.038918, -9.341703, 8.161026, 21.703133, -9.369871, 7.9649425, 21.320047, -9.341703, 8.161026, 21.703133, -9.114939, 8.379078, 21.764282, -9.299545, 8.194818, 21.797089, -9.341703, 8.161026, 21.703133, -8.725763, 8.597912, 21.202042, -9.114939, 8.379078, 21.764282, -9.049728, 8.516345, 22.375086, -8.632957, 8.781511, 22.557295, -8.934408, 8.559859, 22.53762, -9.049728, 8.516345, 22.375086, -8.364826, 9.012768, 22.024788, -8.632957, 8.781511, 22.557295, -9.180586, 7.258568, 19.97211, -9.012537, 7.976405, 20.566238, -9.275749, 7.2862973, 19.989244, -9.012537, 7.976405, 20.566238, -9.180586, 7.258568, 19.97211, -8.98185, 7.591978, 20.29632, -8.98185, 7.591978, 20.29632, -9.180586, 7.258568, 19.97211, -8.903774, 7.424042, 20.197647, -9.012537, 7.976405, 20.566238, -8.491125, 8.092604, 20.86079, -8.725763, 8.597912, 21.202042, -9.012537, 7.976405, 20.566238, -8.566002, 7.9071417, 20.66232, -8.491125, 8.092604, 20.86079, -7.9790645, 8.107249, 21.086702, -8.364826, 9.012768, 22.024788, -8.725763, 8.597912, 21.202042, -8.364826, 9.012768, 22.024788, -7.9790645, 8.107249, 21.086702, -7.822355, 8.259277, 21.4402, -8.364826, 9.012768, 22.024788, -7.822355, 8.259277, 21.4402, -8.002892, 8.544012, 21.647385, -7.964889, 8.880724, 22.295406, -8.041105, 9.099136, 22.774368, -8.364826, 9.012768, 22.024788, -8.041105, 9.099136, 22.774368, -7.964889, 8.880724, 22.295406, -7.5640388, 8.629003, 22.34164, -8.041105, 9.099136, 22.774368, -7.5640388, 8.629003, 22.34164, -7.5259223, 8.667595, 22.517582, -8.364826, 9.012768, 22.024788, -9.114939, 8.379078, 21.764282, -8.725763, 8.597912, 21.202042, -8.749628, 8.718971, 21.97248, -9.114939, 8.379078, 21.764282, -8.364826, 9.012768, 22.024788, -9.114939, 8.379078, 21.764282, -8.749628, 8.718971, 21.97248, -9.156193, 8.312938, 22.116726, -9.114939, 8.379078, 21.764282, -9.156193, 8.312938, 22.116726, -9.228645, 8.264259, 21.957209, -8.364826, 9.012768, 22.024788, -9.126802, 8.436518, 22.200216, -8.749628, 8.718971, 21.97248, -8.364826, 9.012768, 22.024788, -9.049728, 8.516345, 22.375086, -9.126802, 8.436518, 22.200216, -8.002892, 8.544012, 21.647385, -7.684996, 8.432556, 21.75747, -8.364826, 9.012768, 22.024788, -8.002892, 8.544012, 21.647385, -7.7519794, 8.363534, 21.605556, -7.684996, 8.432556, 21.75747, -8.041105, 9.099136, 22.774368, -8.632957, 8.781511, 22.557295, -8.364826, 9.012768, 22.024788, -8.632957, 8.781511, 22.557295, -8.041105, 9.099136, 22.774368, -8.604433, 8.708588, 23.005474, -8.632957, 8.781511, 22.557295, -8.604433, 8.708588, 23.005474, -8.767645, 8.649889, 22.776098, -7.964889, 8.880724, 22.295406, -7.684996, 8.432556, 21.75747, -7.5840287, 8.511244, 22.2162, -7.964889, 8.880724, 22.295406, -8.364826, 9.012768, 22.024788, -7.684996, 8.432556, 21.75747, -7.7392535, 8.897409, 23.481745, -8.175547, 8.90155, 23.08837, -8.041105, 9.099136, 22.774368, -8.175547, 8.90155, 23.08837, -7.7392535, 8.897409, 23.481745, -7.856048, 8.8193245, 23.551592, -8.175547, 8.90155, 23.08837, -7.856048, 8.8193245, 23.551592, -8.1856785, 8.794295, 23.313171, -8.491125, 8.092604, 20.86079, -7.9790645, 8.107249, 21.086702, -8.725763, 8.597912, 21.202042, -8.491125, 8.092604, 20.86079, -8.181248, 7.964281, 20.873774, -7.9790645, 8.107249, 21.086702, -8.566002, 7.9071417, 20.66232, -8.305813, 7.8208942, 20.736774, -8.491125, 8.092604, 20.86079, -8.566002, 7.9071417, 20.66232, -8.377768, 7.7919035, 20.663399, -8.305813, 7.8208942, 20.736774, -8.566002, 7.9071417, 20.66232, -9.012537, 7.976405, 20.566238, -8.519827, 7.7004347, 20.51477, -8.98185, 7.591978, 20.29632, -8.519827, 7.7004347, 20.51477, -9.012537, 7.976405, 20.566238, -8.98185, 7.591978, 20.29632, -8.76738, 7.536939, 20.311623, -8.519827, 7.7004347, 20.51477, -7.2060475, 9.208552, 22.897741, -7.80905, 8.817884, 23.60042, -7.899529, 8.892069, 23.45427, -7.2060475, 9.208552, 22.897741, -6.7061973, 8.855337, 23.494766, -7.80905, 8.817884, 23.60042, -7.4934087, 8.594069, 22.34334, -7.539685, 8.893689, 22.84897, -7.65863, 8.6545105, 22.680805, -7.4934087, 8.594069, 22.34334, -7.2060475, 9.208552, 22.897741, -7.539685, 8.893689, 22.84897, -4.068832, 7.336172, 20.780975, -4.714312, 8.10803, 21.257643, -5.132072, 7.6965923, 20.921396, -4.068832, 7.336172, 20.780975, -3.9881473, 7.385569, 20.85462, -4.714312, 8.10803, 21.257643, -4.714312, 8.10803, 21.257643, -5.3909154, 7.790823, 20.987743, -5.132072, 7.6965923, 20.921396, -4.714312, 8.10803, 21.257643, -5.2879725, 8.145002, 21.248096, -5.3909154, 7.790823, 20.987743, -5.2879725, 8.145002, 21.248096, -4.714312, 8.10803, 21.257643, -5.489513, 8.767287, 21.711481, -5.2879725, 8.145002, 21.248096, -5.489513, 8.767287, 21.711481, -6.085754, 8.035226, 21.16589, -5.2879725, 8.145002, 21.248096, -6.085754, 8.035226, 21.16589, -5.623652, 7.8744917, 21.047535, -6.085754, 8.035226, 21.16589, -6.1478257, 8.328001, 21.433554, -6.1905837, 8.063794, 21.235548, -6.085754, 8.035226, 21.16589, -5.489513, 8.767287, 21.711481, -6.1478257, 8.328001, 21.433554, -6.841514, 8.391562, 21.667154, -7.0118194, 8.758585, 22.183632, -7.009152, 8.4349575, 21.841381, -6.841514, 8.391562, 21.667154, -6.416242, 9.177944, 22.323563, -7.0118194, 8.758585, 22.183632, -3.9419742, 7.374406, 20.966194, -4.714312, 8.10803, 21.257643, -3.9881473, 7.385569, 20.85462, -4.714312, 8.10803, 21.257643, -3.9419742, 7.374406, 20.966194, -4.32668, 7.7234807, 21.258965, -4.32668, 7.7234807, 21.258965, -3.9419742, 7.374406, 20.966194, -4.1686845, 7.564969, 21.337112, -4.714312, 8.10803, 21.257643, -4.9478, 8.286828, 21.951738, -5.489513, 8.767287, 21.711481, -4.714312, 8.10803, 21.257643, -4.704924, 8.094104, 21.826122, -4.9478, 8.286828, 21.951738, -5.0908885, 8.360533, 22.620289, -6.416242, 9.177944, 22.323563, -5.489513, 8.767287, 21.711481, -6.416242, 9.177944, 22.323563, -5.0908885, 8.360533, 22.620289, -5.486716, 8.50116, 22.883144, -6.416242, 9.177944, 22.323563, -5.486716, 8.50116, 22.883144, -5.8117423, 8.768128, 22.703707, -6.5980697, 9.059402, 22.89238, -7.2060475, 9.208552, 22.897741, -6.416242, 9.177944, 22.323563, -7.2060475, 9.208552, 22.897741, -6.5980697, 9.059402, 22.89238, -6.507363, 8.83523, 23.408497, -7.2060475, 9.208552, 22.897741, -6.507363, 8.83523, 23.408497, -6.7061973, 8.855337, 23.494766, -6.416242, 9.177944, 22.323563, -6.1478257, 8.328001, 21.433554, -5.489513, 8.767287, 21.711481, -6.3719687, 8.766026, 21.89067, -6.1478257, 8.328001, 21.433554, -6.416242, 9.177944, 22.323563, -6.1478257, 8.328001, 21.433554, -6.3719687, 8.766026, 21.89067, -6.5476384, 8.165707, 21.472878, -6.1478257, 8.328001, 21.433554, -6.5476384, 8.165707, 21.472878, -6.369827, 8.1280155, 21.354618, -6.416242, 9.177944, 22.323563, -6.645247, 8.314198, 21.536797, -6.3719687, 8.766026, 21.89067, -6.416242, 9.177944, 22.323563, -6.841514, 8.391562, 21.667154, -6.645247, 8.314198, 21.536797, -5.8117423, 8.768128, 22.703707, -5.8438954, 8.677977, 23.119993, -6.416242, 9.177944, 22.323563, -5.8117423, 8.768128, 22.703707, -5.6736007, 8.611357, 23.006952, -5.8438954, 8.677977, 23.119993, -7.2060475, 9.208552, 22.897741, -7.0118194, 8.758585, 22.183632, -6.416242, 9.177944, 22.323563, -7.0118194, 8.758585, 22.183632, -7.2060475, 9.208552, 22.897741, -7.4934087, 8.594069, 22.34334, -7.0118194, 8.758585, 22.183632, -7.4934087, 8.594069, 22.34334, -7.256623, 8.534951, 22.097307, -6.5980697, 9.059402, 22.89238, -5.8438954, 8.677977, 23.119993, -6.361113, 8.698025, 23.343914, -6.5980697, 9.059402, 22.89238, -6.416242, 9.177944, 22.323563, -5.8438954, 8.677977, 23.119993, -7.899529, 8.892069, 23.45427, -7.539685, 8.893689, 22.84897, -7.2060475, 9.208552, 22.897741, -7.539685, 8.893689, 22.84897, -7.899529, 8.892069, 23.45427, -7.983706, 8.764886, 23.345701, -7.539685, 8.893689, 22.84897, -7.983706, 8.764886, 23.345701, -7.7710595, 8.722573, 22.907578, -4.9478, 8.286828, 21.951738, -5.0908885, 8.360533, 22.620289, -5.489513, 8.767287, 21.711481, -4.9478, 8.286828, 21.951738, -4.867348, 8.1940365, 22.336489, -5.0908885, 8.360533, 22.620289, -4.704924, 8.094104, 21.826122, -4.7211885, 8.02508, 22.154125, -4.9478, 8.286828, 21.951738, -4.704924, 8.094104, 21.826122, -4.6452146, 7.9936295, 22.056368, -4.7211885, 8.02508, 22.154125, -4.704924, 8.094104, 21.826122, -4.714312, 8.10803, 21.257643, -4.489761, 7.8906374, 21.858315, -4.32668, 7.7234807, 21.258965, -4.489761, 7.8906374, 21.858315, -4.714312, 8.10803, 21.257643, -4.32668, 7.7234807, 21.258965, -4.284569, 7.6962314, 21.524137, -4.489761, 7.8906374, 21.858315, -7.4770913, 9.070688, 24.137522, -7.9792457, 8.86656, 23.280897, -7.798713, 8.910673, 23.258356, -7.4770913, 9.070688, 24.137522, -8.267395, 8.83601, 24.344084, -7.9792457, 8.86656, 23.280897, -6.969793, 8.361493, 23.999329, -7.3750834, 8.766386, 23.809656, -7.2131476, 8.500739, 23.731937, -6.969793, 8.361493, 23.999329, -7.4770913, 9.070688, 24.137522, -7.3750834, 8.766386, 23.809656, -6.8215938, 6.6485844, 27.584244, -6.934275, 7.533578, 26.905539, -6.54954, 7.0755653, 26.591766, -6.8215938, 6.6485844, 27.584244, -6.908404, 6.709503, 27.638208, -6.934275, 7.533578, 26.905539, -6.934275, 7.533578, 26.905539, -6.512714, 7.1929045, 26.339361, -6.54954, 7.0755653, 26.591766, -6.934275, 7.533578, 26.905539, -6.735351, 7.5916777, 26.38232, -6.512714, 7.1929045, 26.339361, -6.735351, 7.5916777, 26.38232, -6.934275, 7.533578, 26.905539, -7.004352, 8.309274, 26.101746, -6.735351, 7.5916777, 26.38232, -7.004352, 8.309274, 26.101746, -6.413199, 7.4994855, 25.660645, -6.735351, 7.5916777, 26.38232, -6.413199, 7.4994855, 25.660645, -6.4796042, 7.2974, 26.112244, -6.413199, 7.4994855, 25.660645, -6.6031613, 7.8468814, 25.541204, -6.4362464, 7.5467825, 25.541874, -6.413199, 7.4994855, 25.660645, -7.004352, 8.309274, 26.101746, -6.6031613, 7.8468814, 25.541204, -6.5875335, 7.9890084, 24.822481, -6.9586644, 8.467667, 24.52183, -6.6856866, 8.076338, 24.609621, -6.5875335, 7.9890084, 24.822481, -7.210817, 8.882824, 25.071764, -6.9586644, 8.467667, 24.52183, -7.030128, 6.721147, 27.639519, -6.934275, 7.533578, 26.905539, -6.908404, 6.709503, 27.638208, -6.934275, 7.533578, 26.905539, -7.030128, 6.721147, 27.639519, -7.122934, 7.142128, 27.21883, -7.122934, 7.142128, 27.21883, -7.030128, 6.721147, 27.639519, -7.2680945, 6.9975395, 27.31846, -6.934275, 7.533578, 26.905539, -7.48521, 7.8700495, 26.46049, -7.004352, 8.309274, 26.101746, -6.934275, 7.533578, 26.905539, -7.476253, 7.6441336, 26.707956, -7.48521, 7.8700495, 26.46049, -8.052195, 8.094164, 26.095999, -7.210817, 8.882824, 25.071764, -7.004352, 8.309274, 26.101746, -7.210817, 8.882824, 25.071764, -8.052195, 8.094164, 26.095999, -8.141077, 8.305193, 25.651417, -7.210817, 8.882824, 25.071764, -8.141077, 8.305193, 25.651417, -7.8344674, 8.5407715, 25.446497, -7.7096314, 8.899331, 24.684853, -7.4770913, 9.070688, 24.137522, -7.210817, 8.882824, 25.071764, -7.4770913, 9.070688, 24.137522, -7.7096314, 8.899331, 24.684853, -8.258791, 8.789434, 24.556768, -7.4770913, 9.070688, 24.137522, -8.258791, 8.789434, 24.556768, -8.267395, 8.83601, 24.344084, -7.210817, 8.882824, 25.071764, -6.6031613, 7.8468814, 25.541204, -7.004352, 8.309274, 26.101746, -6.8924146, 8.3843, 25.220247, -6.6031613, 7.8468814, 25.541204, -7.210817, 8.882824, 25.071764, -6.6031613, 7.8468814, 25.541204, -6.8924146, 8.3843, 25.220247, -6.5150523, 7.712496, 25.137945, -6.6031613, 7.8468814, 25.541204, -6.5150523, 7.712496, 25.137945, -6.4764667, 7.6428747, 25.340647, -7.210817, 8.882824, 25.071764, -6.543115, 7.8768907, 25.041906, -6.8924146, 8.3843, 25.220247, -7.210817, 8.882824, 25.071764, -6.5875335, 7.9890084, 24.822481, -6.543115, 7.8768907, 25.041906, -7.8344674, 8.5407715, 25.446497, -8.223946, 8.544853, 25.256237, -7.210817, 8.882824, 25.071764, -7.8344674, 8.5407715, 25.446497, -8.185364, 8.448042, 25.446867, -8.223946, 8.544853, 25.256237, -7.4770913, 9.070688, 24.137522, -6.9586644, 8.467667, 24.52183, -7.210817, 8.882824, 25.071764, -6.9586644, 8.467667, 24.52183, -7.4770913, 9.070688, 24.137522, -6.969793, 8.361493, 23.999329, -6.9586644, 8.467667, 24.52183, -6.969793, 8.361493, 23.999329, -6.8314404, 8.240372, 24.300121, -7.7096314, 8.899331, 24.684853, -8.223946, 8.544853, 25.256237, -8.244255, 8.633982, 24.69929, -7.7096314, 8.899331, 24.684853, -7.210817, 8.882824, 25.071764, -8.223946, 8.544853, 25.256237, -7.798713, 8.910673, 23.258356, -7.3750834, 8.766386, 23.809656, -7.4770913, 9.070688, 24.137522, -7.3750834, 8.766386, 23.809656, -7.798713, 8.910673, 23.258356, -7.6923747, 8.766327, 23.204716, -7.3750834, 8.766386, 23.809656, -7.6923747, 8.766327, 23.204716, -7.3779397, 8.62144, 23.55421, -7.48521, 7.8700495, 26.46049, -8.052195, 8.094164, 26.095999, -7.004352, 8.309274, 26.101746, -7.48521, 7.8700495, 26.46049, -7.886131, 7.860207, 26.385628, -8.052195, 8.094164, 26.095999, -7.476253, 7.6441336, 26.707956, -7.776336, 7.6484556, 26.566654, -7.48521, 7.8700495, 26.46049, -7.476253, 7.6441336, 26.707956, -7.720366, 7.5934772, 26.668566, -7.776336, 7.6484556, 26.566654, -7.476253, 7.6441336, 26.707956, -6.934275, 7.533578, 26.905539, -7.604976, 7.443248, 26.871801, -7.122934, 7.142128, 27.21883, -7.604976, 7.443248, 26.871801, -6.934275, 7.533578, 26.905539, -7.122934, 7.142128, 27.21883, -7.3896413, 7.171777, 27.159313, -7.604976, 7.443248, 26.871801, -6.0571437, 2.278272, 22.798777, -6.422816, 4.561778, 23.067327, -6.255482, 4.6069903, 22.866049, -6.0571437, 2.278272, 22.798777, -6.2640643, 2.2363775, 23.040073, -6.422816, 4.561778, 23.067327, -6.229696, -0.29725552, 22.954578, -6.2640643, 2.2363775, 23.040073, -6.0571437, 2.278272, 22.798777, -6.229696, -0.29725552, 22.954578, -6.4595838, -0.294353, 23.230642, -6.2640643, 2.2363775, 23.040073, -6.8122897, 2.1787193, 22.89551, -6.9267097, 4.515596, 22.675344, -6.886102, 4.499142, 22.937313, -6.8122897, 2.1787193, 22.89551, -6.8565516, 2.1943433, 22.589626, -6.9267097, 4.515596, 22.675344, -6.34096, 2.278272, 22.29763, -6.2974906, 4.6231685, 22.603962, -6.5006537, 4.606991, 22.43314, -6.34096, 2.278272, 22.29763, -6.0964046, 2.2940338, 22.49008, -6.2974906, 4.6231685, 22.603962, -6.886102, 4.499142, 22.937313, -7.330835, 6.6817102, 22.999025, -7.3017764, 6.6674695, 23.172724, -6.886102, 4.499142, 22.937313, -6.9267097, 4.515596, 22.675344, -7.330835, 6.6817102, 22.999025, -6.255482, 4.6069903, 22.866049, -6.9959083, 6.7194586, 23.261988, -6.883434, 6.7554083, 23.12764, -6.255482, 4.6069903, 22.866049, -6.422816, 4.561778, 23.067327, -6.9959083, 6.7194586, 23.261988, -6.883434, 6.7554083, 23.12764, -6.9959083, 6.7194586, 23.261988, -7.3726697, 7.8587894, 23.408417, -6.883434, 6.7554083, 23.12764, -7.3726697, 7.8587894, 23.408417, -7.2935386, 7.8998566, 23.310549, -6.2640643, 2.2363775, 23.040073, -6.6823287, 4.515596, 23.106857, -6.422816, 4.561778, 23.067327, -6.2640643, 2.2363775, 23.040073, -6.5727344, 2.1943433, 23.090773, -6.6823287, 4.515596, 23.106857, -6.422816, 4.561778, 23.067327, -6.6823287, 4.515596, 23.106857, -7.1677566, 6.6817102, 23.28698, -6.422816, 4.561778, 23.067327, -7.1677566, 6.6817102, 23.28698, -6.9959083, 6.7194586, 23.261988, -6.8565516, 2.1943433, 22.589626, -6.759332, 4.561778, 22.473125, -6.9267097, 4.515596, 22.675344, -6.8565516, 2.1943433, 22.589626, -6.6543117, 2.2363775, 22.350998, -6.759332, 4.561778, 22.473125, -6.9267097, 4.515596, 22.675344, -6.759332, 4.561778, 22.473125, -7.2210193, 6.7194586, 22.864502, -6.9267097, 4.515596, 22.675344, -7.2210193, 6.7194586, 22.864502, -7.330835, 6.6817102, 22.999025, -6.5006537, 4.606991, 22.43314, -6.9114146, 6.7684054, 22.951649, -7.0479617, 6.7554083, 22.837128, -6.5006537, 4.606991, 22.43314, -6.2974906, 4.6231685, 22.603962, -6.9114146, 6.7684054, 22.951649, -6.0964046, 2.2940338, 22.49008, -6.255482, 4.6069903, 22.866049, -6.2974906, 4.6231685, 22.603962, -6.0964046, 2.2940338, 22.49008, -6.0571437, 2.278272, 22.798777, -6.255482, 4.6069903, 22.866049, -6.2974906, 4.6231685, 22.603962, -6.883434, 6.7554083, 23.12764, -6.9114146, 6.7684054, 22.951649, -6.2974906, 4.6231685, 22.603962, -6.255482, 4.6069903, 22.866049, -6.883434, 6.7554083, 23.12764, -6.6543117, 2.2363775, 22.350998, -6.5006537, 4.606991, 22.43314, -6.759332, 4.561778, 22.473125, -6.6543117, 2.2363775, 22.350998, -6.34096, 2.278272, 22.29763, -6.5006537, 4.606991, 22.43314, -6.9183087, -0.294353, 22.420652, -6.34096, 2.278272, 22.29763, -6.6543117, 2.2363775, 22.350998, -6.9183087, -0.294353, 22.420652, -6.563316, -0.29725552, 22.365494, -6.34096, 2.278272, 22.29763, -6.759332, 4.561778, 22.473125, -7.0479617, 6.7554083, 22.837128, -7.2210193, 6.7194586, 22.864502, -6.759332, 4.561778, 22.473125, -6.5006537, 4.606991, 22.43314, -7.0479617, 6.7554083, 22.837128, -7.2210193, 6.7194586, 22.864502, -7.0479617, 6.7554083, 22.837128, -7.4157386, 7.8998566, 23.094776, -7.2210193, 6.7194586, 22.864502, -7.4157386, 7.8998566, 23.094776, -7.5403686, 7.8587894, 23.112305, -7.596041, 7.8030686, 23.339376, -7.8122087, 8.670566, 23.565685, -7.4973254, 7.8185544, 23.425323, -7.596041, 7.8030686, 23.339376, -7.884003, 8.657431, 23.502459, -7.8122087, 8.670566, 23.565685, -7.3726697, 7.8587894, 23.408417, -7.6698213, 8.747442, 23.485046, -7.2935386, 7.8998566, 23.310549, -7.3726697, 7.8587894, 23.408417, -7.724811, 8.710249, 23.555187, -7.6698213, 8.747442, 23.485046, -7.4973254, 7.8185544, 23.425323, -7.724811, 8.710249, 23.555187, -7.3726697, 7.8587894, 23.408417, -7.4973254, 7.8185544, 23.425323, -7.8122087, 8.670566, 23.565685, -7.724811, 8.710249, 23.555187, -7.3161235, 7.9149265, 23.18085, -7.7589135, 8.747442, 23.327732, -7.4157386, 7.8998566, 23.094776, -7.3161235, 7.9149265, 23.18085, -7.6881547, 8.763065, 23.391544, -7.7589135, 8.747442, 23.327732, -7.2935386, 7.8998566, 23.310549, -7.6881547, 8.763065, 23.391544, -7.3161235, 7.9149265, 23.18085, -7.2935386, 7.8998566, 23.310549, -7.6698213, 8.747442, 23.485046, -7.6881547, 8.763065, 23.391544, -7.5403686, 7.8587894, 23.112305, -7.901301, 8.670566, 23.408371, -7.61898, 7.8185544, 23.210514, -7.5403686, 7.8587894, 23.112305, -7.8473487, 8.710249, 23.338818, -7.901301, 8.670566, 23.408371, -7.4157386, 7.8998566, 23.094776, -7.8473487, 8.710249, 23.338818, -7.5403686, 7.8587894, 23.112305, -7.4157386, 7.8998566, 23.094776, -7.7589135, 8.747442, 23.327732, -7.8473487, 8.710249, 23.338818, -6.8164535, -0.2914486, 23.28688, -6.8122897, 2.1787193, 22.89551, -6.5727344, 2.1943433, 23.090773, -6.8164535, -0.2914486, 23.28688, -7.092834, -0.29034328, 23.054392, -6.8122897, 2.1787193, 22.89551, -7.61898, 7.8185544, 23.210514, -7.884003, 8.657431, 23.502459, -7.596041, 7.8030686, 23.339376, -7.61898, 7.8185544, 23.210514, -7.901301, 8.670566, 23.408371, -7.884003, 8.657431, 23.502459, -6.5727344, 2.1943433, 23.090773, -6.886102, 4.499142, 22.937313, -6.6823287, 4.515596, 23.106857, -6.5727344, 2.1943433, 23.090773, -6.8122897, 2.1787193, 22.89551, -6.886102, 4.499142, 22.937313, -7.092834, -0.29034328, 23.054392, -6.8565516, 2.1943433, 22.589626, -6.8122897, 2.1787193, 22.89551, -7.092834, -0.29034328, 23.054392, -7.1500726, -0.2914486, 22.697796, -6.8565516, 2.1943433, 22.589626, -6.563316, -0.29725552, 22.365494, -6.0964046, 2.2940338, 22.49008, -6.34096, 2.278272, 22.29763, -6.563316, -0.29725552, 22.365494, -6.288299, -0.2983632, 22.598755, -6.0964046, 2.2940338, 22.49008, -6.4595838, -0.294353, 23.230642, -6.5727344, 2.1943433, 23.090773, -6.2640643, 2.2363775, 23.040073, -6.4595838, -0.294353, 23.230642, -6.8164535, -0.2914486, 23.28688, -6.5727344, 2.1943433, 23.090773, -7.1500726, -0.2914486, 22.697796, -6.6543117, 2.2363775, 22.350998, -6.8565516, 2.1943433, 22.589626, -7.1500726, -0.2914486, 22.697796, -6.9183087, -0.294353, 22.420652, -6.6543117, 2.2363775, 22.350998, -6.288299, -0.2983632, 22.598755, -6.0571437, 2.278272, 22.798777, -6.0964046, 2.2940338, 22.49008, -6.288299, -0.2983632, 22.598755, -6.229696, -0.29725552, 22.954578, -6.0571437, 2.278272, 22.798777, -6.6823287, 4.515596, 23.106857, -7.3017764, 6.6674695, 23.172724, -7.1677566, 6.6817102, 23.28698, -6.6823287, 4.515596, 23.106857, -6.886102, 4.499142, 22.937313, -7.3017764, 6.6674695, 23.172724, -7.1677566, 6.6817102, 23.28698, -7.596041, 7.8030686, 23.339376, -7.4973254, 7.8185544, 23.425323, -7.1677566, 6.6817102, 23.28698, -7.3017764, 6.6674695, 23.172724, -7.596041, 7.8030686, 23.339376, -7.3017764, 6.6674695, 23.172724, -7.61898, 7.8185544, 23.210514, -7.596041, 7.8030686, 23.339376, -7.3017764, 6.6674695, 23.172724, -7.330835, 6.6817102, 22.999025, -7.61898, 7.8185544, 23.210514, -6.9959083, 6.7194586, 23.261988, -7.4973254, 7.8185544, 23.425323, -7.3726697, 7.8587894, 23.408417, -6.9959083, 6.7194586, 23.261988, -7.1677566, 6.6817102, 23.28698, -7.4973254, 7.8185544, 23.425323, -7.0479617, 6.7554083, 22.837128, -7.3161235, 7.9149265, 23.18085, -7.4157386, 7.8998566, 23.094776, -7.0479617, 6.7554083, 22.837128, -6.9114146, 6.7684054, 22.951649, -7.3161235, 7.9149265, 23.18085, -6.9114146, 6.7684054, 22.951649, -7.2935386, 7.8998566, 23.310549, -7.3161235, 7.9149265, 23.18085, -6.9114146, 6.7684054, 22.951649, -6.883434, 6.7554083, 23.12764, -7.2935386, 7.8998566, 23.310549, -7.330835, 6.6817102, 22.999025, -7.5403686, 7.8587894, 23.112305, -7.61898, 7.8185544, 23.210514, -7.330835, 6.6817102, 22.999025, -7.2210193, 6.7194586, 22.864502, -7.5403686, 7.8587894, 23.112305, -5.520864, 5.50994, 24.639458, -6.0238147, 5.3727474, 24.921116, -6.027886, 5.4678555, 24.868423, -5.520864, 5.50994, 24.639458, -5.4553275, 5.043026, 24.83633, -6.0238147, 5.3727474, 24.921116, -5.780359, 5.49264, 24.220936, -5.780785, 5.505308, 24.545547, -5.885944, 5.489472, 24.411573, -5.780359, 5.49264, 24.220936, -5.520864, 5.50994, 24.639458, -5.780785, 5.505308, 24.545547, -4.172077, 4.097315, 23.081501, -4.3400836, 4.5620866, 23.516861, -4.6323843, 4.612814, 23.259392, -4.172077, 4.097315, 23.081501, -4.1252418, 4.0723934, 23.12863, -4.3400836, 4.5620866, 23.516861, -4.3400836, 4.5620866, 23.516861, -4.7473187, 4.731488, 23.319653, -4.6323843, 4.612814, 23.259392, -4.3400836, 4.5620866, 23.516861, -4.6260543, 4.7886457, 23.530365, -4.7473187, 4.731488, 23.319653, -4.6260543, 4.7886457, 23.530365, -4.3400836, 4.5620866, 23.516861, -4.6092978, 5.019003, 23.91192, -4.6260543, 4.7886457, 23.530365, -4.6092978, 5.019003, 23.91192, -5.05752, 5.0416813, 23.479633, -4.6260543, 4.7886457, 23.530365, -5.05752, 5.0416813, 23.479633, -4.8509307, 4.836937, 23.373531, -5.05752, 5.0416813, 23.479633, -5.044219, 5.1299534, 23.679413, -5.109679, 5.073374, 23.52538, -5.05752, 5.0416813, 23.479633, -4.6092978, 5.019003, 23.91192, -5.044219, 5.1299534, 23.679413, -5.416506, 5.348407, 23.822437, -5.4675636, 5.4387703, 24.16735, -5.5109153, 5.382139, 23.924562, -5.416506, 5.348407, 23.822437, -5.0510015, 5.370203, 24.32837, -5.4675636, 5.4387703, 24.16735, -4.119844, 4.0247717, 23.180462, -4.3400836, 4.5620866, 23.516861, -4.1252418, 4.0723934, 23.12863, -4.3400836, 4.5620866, 23.516861, -4.119844, 4.0247717, 23.180462, -4.253202, 4.254257, 23.418776, -4.253202, 4.254257, 23.418776, -4.119844, 4.0247717, 23.180462, -4.22462, 4.107806, 23.420288, -4.3400836, 4.5620866, 23.516861, -4.504075, 4.5656476, 23.906963, -4.6092978, 5.019003, 23.91192, -4.3400836, 4.5620866, 23.516861, -4.4175224, 4.424284, 23.794865, -4.504075, 4.5656476, 23.906963, -4.644364, 4.490939, 24.260977, -5.0510015, 5.370203, 24.32837, -4.6092978, 5.019003, 23.91192, -5.0510015, 5.370203, 24.32837, -4.644364, 4.490939, 24.260977, -4.8376765, 4.627639, 24.436502, -5.0510015, 5.370203, 24.32837, -4.8376765, 4.627639, 24.436502, -4.9126344, 4.897375, 24.407942, -5.261839, 5.2418065, 24.581022, -5.520864, 5.50994, 24.639458, -5.0510015, 5.370203, 24.32837, -5.520864, 5.50994, 24.639458, -5.261839, 5.2418065, 24.581022, -5.3500004, 4.9882493, 24.782772, -5.520864, 5.50994, 24.639458, -5.3500004, 4.9882493, 24.782772, -5.4553275, 5.043026, 24.83633, -5.0510015, 5.370203, 24.32837, -5.044219, 5.1299534, 23.679413, -4.6092978, 5.019003, 23.91192, -5.09594, 5.2896347, 24.011734, -5.044219, 5.1299534, 23.679413, -5.0510015, 5.370203, 24.32837, -5.044219, 5.1299534, 23.679413, -5.09594, 5.2896347, 24.011734, -5.2869577, 5.1833105, 23.681408, -5.044219, 5.1299534, 23.679413, -5.2869577, 5.1833105, 23.681408, -5.197224, 5.1352034, 23.604895, -5.0510015, 5.370203, 24.32837, -5.321176, 5.2789783, 23.735258, -5.09594, 5.2896347, 24.011734, -5.0510015, 5.370203, 24.32837, -5.416506, 5.348407, 23.822437, -5.321176, 5.2789783, 23.735258, -4.9126344, 4.897375, 24.407942, -5.007563, 4.7688026, 24.597364, -5.0510015, 5.370203, 24.32837, -4.9126344, 4.897375, 24.407942, -4.924829, 4.7089424, 24.521822, -5.007563, 4.7688026, 24.597364, -5.520864, 5.50994, 24.639458, -5.4675636, 5.4387703, 24.16735, -5.0510015, 5.370203, 24.32837, -5.4675636, 5.4387703, 24.16735, -5.520864, 5.50994, 24.639458, -5.780359, 5.49264, 24.220936, -5.4675636, 5.4387703, 24.16735, -5.780359, 5.49264, 24.220936, -5.6462617, 5.4495068, 24.077614, -5.261839, 5.2418065, 24.581022, -5.007563, 4.7688026, 24.597364, -5.284591, 4.8992395, 24.734537, -5.261839, 5.2418065, 24.581022, -5.0510015, 5.370203, 24.32837, -5.007563, 4.7688026, 24.597364, -6.027886, 5.4678555, 24.868423, -5.780785, 5.505308, 24.545547, -5.520864, 5.50994, 24.639458, -5.780785, 5.505308, 24.545547, -6.027886, 5.4678555, 24.868423, -6.0964007, 5.467935, 24.783894, -5.780785, 5.505308, 24.545547, -6.0964007, 5.467935, 24.783894, -5.9559407, 5.492031, 24.540054, -4.504075, 4.5656476, 23.906963, -4.644364, 4.490939, 24.260977, -4.6092978, 5.019003, 23.91192, -4.504075, 4.5656476, 23.906963, -4.5401545, 4.407131, 24.07597, -4.644364, 4.490939, 24.260977, -4.4175224, 4.424284, 23.794865, -4.4788713, 4.3216662, 23.951574, -4.504075, 4.5656476, 23.906963, -4.4175224, 4.424284, 23.794865, -4.4406796, 4.305605, 23.890078, -4.4788713, 4.3216662, 23.951574, -4.4175224, 4.424284, 23.794865, -4.3400836, 4.5620866, 23.516861, -4.367128, 4.250943, 23.76148, -4.253202, 4.254257, 23.418776, -4.367128, 4.250943, 23.76148, -4.3400836, 4.5620866, 23.516861, -4.253202, 4.254257, 23.418776, -4.274289, 4.1678133, 23.544254, -4.367128, 4.250943, 23.76148, -6.100014, 5.3618755, 25.36038, -6.053468, 5.4692774, 24.699776, -5.951238, 5.4974275, 24.761002, -6.100014, 5.3618755, 25.36038, -6.5840898, 5.185566, 25.139408, -6.053468, 5.4692774, 24.699776, -5.702927, 4.9555445, 25.310673, -5.8909087, 5.2601395, 25.158152, -5.754765, 5.1142435, 25.118452, -5.702927, 4.9555445, 25.310673, -6.100014, 5.3618755, 25.36038, -5.8909087, 5.2601395, 25.158152, -6.868545, 2.974114, 26.87804, -6.7395024, 3.6925054, 26.67168, -6.369455, 3.4866214, 26.543037, -6.868545, 2.974114, 26.87804, -6.9426017, 2.9990473, 26.889389, -6.7395024, 3.6925054, 26.67168, -6.7395024, 3.6925054, 26.67168, -6.2608256, 3.6231003, 26.448338, -6.369455, 3.4866214, 26.543037, -6.7395024, 3.6925054, 26.67168, -6.429816, 3.8601167, 26.47786, -6.2608256, 3.6231003, 26.448338, -6.429816, 3.8601167, 26.47786, -6.7395024, 3.6925054, 26.67168, -6.5268407, 4.3764234, 26.390133, -6.429816, 3.8601167, 26.47786, -6.5268407, 4.3764234, 26.390133, -5.9696584, 3.9842505, 26.192686, -6.429816, 3.8601167, 26.47786, -5.9696584, 3.9842505, 26.192686, -6.1631923, 3.745168, 26.363018, -5.9696584, 3.9842505, 26.192686, -6.049317, 4.232349, 26.135853, -5.944036, 4.043989, 26.133595, -5.9696584, 3.9842505, 26.192686, -6.5268407, 4.3764234, 26.390133, -6.049317, 4.232349, 26.135853, -5.773127, 4.5062346, 25.794031, -5.898379, 4.8849564, 25.608694, -5.7558064, 4.6165876, 25.667988, -5.773127, 4.5062346, 25.794031, -6.2885137, 4.9992027, 25.899937, -5.898379, 4.8849564, 25.608694, -7.0106807, 3.0087154, 26.849985, -6.7395024, 3.6925054, 26.67168, -6.9426017, 2.9990473, 26.889389, -6.7395024, 3.6925054, 26.67168, -7.0106807, 3.0087154, 26.849985, -6.9334645, 3.3768253, 26.686901, -6.9334645, 3.3768253, 26.686901, -7.0106807, 3.0087154, 26.849985, -7.0455823, 3.2654228, 26.659414, -6.7395024, 3.6925054, 26.67168, -6.892614, 4.0271807, 26.316252, -6.5268407, 4.3764234, 26.390133, -6.7395024, 3.6925054, 26.67168, -6.9665236, 3.8246672, 26.401512, -6.892614, 4.0271807, 26.316252, -7.0833793, 4.2717676, 25.97569, -6.2885137, 4.9992027, 25.899937, -6.5268407, 4.3764234, 26.390133, -6.2885137, 4.9992027, 25.899937, -7.0833793, 4.2717676, 25.97569, -6.9840283, 4.5172915, 25.75856, -6.2885137, 4.9992027, 25.899937, -6.9840283, 4.5172915, 25.75856, -6.7441907, 4.708605, 25.804724, -6.4090276, 5.1228185, 25.524706, -6.100014, 5.3618755, 25.36038, -6.2885137, 4.9992027, 25.899937, -6.100014, 5.3618755, 25.36038, -6.4090276, 5.1228185, 25.524706, -6.6533313, 5.102206, 25.24277, -6.100014, 5.3618755, 25.36038, -6.6533313, 5.102206, 25.24277, -6.5840898, 5.185566, 25.139408, -6.2885137, 4.9992027, 25.899937, -6.049317, 4.232349, 26.135853, -6.5268407, 4.3764234, 26.390133, -6.123463, 4.6506386, 25.980106, -6.049317, 4.232349, 26.135853, -6.2885137, 4.9992027, 25.899937, -6.049317, 4.232349, 26.135853, -6.123463, 4.6506386, 25.980106, -5.8564105, 4.2503223, 25.933277, -6.049317, 4.232349, 26.135853, -5.8564105, 4.2503223, 25.933277, -5.898976, 4.1555033, 26.03533, -6.2885137, 4.9992027, 25.899937, -5.822971, 4.3798666, 25.900269, -6.123463, 4.6506386, 25.980106, -6.2885137, 4.9992027, 25.899937, -5.773127, 4.5062346, 25.794031, -5.822971, 4.3798666, 25.900269, -6.7441907, 4.708605, 25.804724, -6.8905606, 4.769124, 25.571657, -6.2885137, 4.9992027, 25.899937, -6.7441907, 4.708605, 25.804724, -6.933764, 4.659773, 25.663965, -6.8905606, 4.769124, 25.571657, -6.100014, 5.3618755, 25.36038, -5.898379, 4.8849564, 25.608694, -6.2885137, 4.9992027, 25.899937, -5.898379, 4.8849564, 25.608694, -6.100014, 5.3618755, 25.36038, -5.702927, 4.9555445, 25.310673, -5.898379, 4.8849564, 25.608694, -5.702927, 4.9555445, 25.310673, -5.727136, 4.8010197, 25.48896, -6.4090276, 5.1228185, 25.524706, -6.8905606, 4.769124, 25.571657, -6.712791, 4.966251, 25.297207, -6.4090276, 5.1228185, 25.524706, -6.2885137, 4.9992027, 25.899937, -6.8905606, 4.769124, 25.571657, -5.951238, 5.4974275, 24.761002, -5.8909087, 5.2601395, 25.158152, -6.100014, 5.3618755, 25.36038, -5.8909087, 5.2601395, 25.158152, -5.951238, 5.4974275, 24.761002, -5.857908, 5.4214015, 24.738348, -5.8909087, 5.2601395, 25.158152, -5.857908, 5.4214015, 24.738348, -5.786898, 5.237897, 24.993658, -6.892614, 4.0271807, 26.316252, -7.0833793, 4.2717676, 25.97569, -6.5268407, 4.3764234, 26.390133, -6.892614, 4.0271807, 26.316252, -7.084641, 4.049944, 26.135506, -7.0833793, 4.2717676, 25.97569, -6.9665236, 3.8246672, 26.401512, -7.0913386, 3.8691072, 26.228043, -6.892614, 4.0271807, 26.316252, -6.9665236, 3.8246672, 26.401512, -7.0892367, 3.8087032, 26.28731, -7.0913386, 3.8691072, 26.228043, -6.9665236, 3.8246672, 26.401512, -6.7395024, 3.6925054, 26.67168, -7.0888734, 3.6620417, 26.401033, -6.9334645, 3.3768253, 26.686901, -7.0888734, 3.6620417, 26.401033, -6.7395024, 3.6925054, 26.67168, -6.9334645, 3.3768253, 26.686901, -7.0596833, 3.4167135, 26.568975, -7.0888734, 3.6620417, 26.401033, -6.3319364, 5.7359695, 25.081383, -5.9698243, 5.384118, 24.680239, -5.904365, 5.4435186, 24.765022, -6.3319364, 5.7359695, 25.081383, -6.686463, 5.4666615, 24.73655, -5.9698243, 5.384118, 24.680239, -6.155786, 5.38664, 25.487875, -6.125067, 5.5240107, 25.150925, -6.053208, 5.3827543, 25.27274, -6.155786, 5.38664, 25.487875, -6.3319364, 5.7359695, 25.081383, -6.125067, 5.5240107, 25.150925, -8.413198, 4.890188, 26.407503, -7.970281, 5.3087463, 26.08081, -7.7057996, 5.0614824, 26.335453, -8.413198, 4.890188, 26.407503, -8.465763, 4.9176445, 26.35488, -7.970281, 5.3087463, 26.08081, -7.970281, 5.3087463, 26.08081, -7.5340934, 5.103933, 26.298006, -7.7057996, 5.0614824, 26.335453, -7.970281, 5.3087463, 26.08081, -7.592959, 5.3087974, 26.109215, -7.5340934, 5.103933, 26.298006, -7.592959, 5.3087974, 26.109215, -7.970281, 5.3087463, 26.08081, -7.4463277, 5.651639, 25.785309, -7.592959, 5.3087974, 26.109215, -7.4463277, 5.651639, 25.785309, -7.0733275, 5.2124443, 26.196064, -7.592959, 5.3087974, 26.109215, -7.0733275, 5.2124443, 26.196064, -7.379638, 5.141446, 26.26409, -7.0733275, 5.2124443, 26.196064, -7.0267406, 5.3698435, 26.018854, -7.005255, 5.218994, 26.151365, -7.0733275, 5.2124443, 26.196064, -7.4463277, 5.651639, 25.785309, -7.0267406, 5.3698435, 26.018854, -6.5752587, 5.356027, 25.89963, -6.46051, 5.5302234, 25.563005, -6.4677835, 5.358314, 25.792141, -6.5752587, 5.356027, 25.89963, -6.836881, 5.81112, 25.415369, -6.46051, 5.5302234, 25.563005, -8.498926, 4.900632, 26.286041, -7.970281, 5.3087463, 26.08081, -8.465763, 4.9176445, 26.35488, -7.970281, 5.3087463, 26.08081, -8.498926, 4.900632, 26.286041, -8.239595, 5.077715, 26.094341, -8.239595, 5.077715, 26.094341, -8.498926, 4.900632, 26.286041, -8.351461, 4.9742537, 26.046995, -7.970281, 5.3087463, 26.08081, -7.8256736, 5.34012, 25.656843, -7.4463277, 5.651639, 25.785309, -7.970281, 5.3087463, 26.08081, -7.9896913, 5.2398424, 25.73777, -7.8256736, 5.34012, 25.656843, -7.744165, 5.310528, 25.246101, -6.836881, 5.81112, 25.415369, -7.4463277, 5.651639, 25.785309, -6.836881, 5.81112, 25.415369, -7.744165, 5.310528, 25.246101, -7.485513, 5.35617, 25.082954, -6.836881, 5.81112, 25.415369, -7.485513, 5.35617, 25.082954, -7.2575336, 5.5329638, 25.196087, -6.7352633, 5.6665816, 25.089825, -6.3319364, 5.7359695, 25.081383, -6.836881, 5.81112, 25.415369, -6.3319364, 5.7359695, 25.081383, -6.7352633, 5.6665816, 25.089825, -6.815335, 5.4714, 24.787678, -6.3319364, 5.7359695, 25.081383, -6.815335, 5.4714, 24.787678, -6.686463, 5.4666615, 24.73655, -6.836881, 5.81112, 25.415369, -7.0267406, 5.3698435, 26.018854, -7.4463277, 5.651639, 25.785309, -6.8723903, 5.5936527, 25.718147, -7.0267406, 5.3698435, 26.018854, -6.836881, 5.81112, 25.415369, -7.0267406, 5.3698435, 26.018854, -6.8723903, 5.5936527, 25.718147, -6.7732606, 5.244132, 25.999937, -7.0267406, 5.3698435, 26.018854, -6.7732606, 5.244132, 25.999937, -6.888104, 5.2399597, 26.077604, -6.836881, 5.81112, 25.415369, -6.703796, 5.3285036, 25.979181, -6.8723903, 5.5936527, 25.718147, -6.836881, 5.81112, 25.415369, -6.5752587, 5.356027, 25.89963, -6.703796, 5.3285036, 25.979181, -7.2575336, 5.5329638, 25.196087, -7.249745, 5.4294252, 24.944311, -6.836881, 5.81112, 25.415369, -7.2575336, 5.5329638, 25.196087, -7.3613477, 5.405882, 25.013523, -7.249745, 5.4294252, 24.944311, -6.3319364, 5.7359695, 25.081383, -6.46051, 5.5302234, 25.563005, -6.836881, 5.81112, 25.415369, -6.46051, 5.5302234, 25.563005, -6.3319364, 5.7359695, 25.081383, -6.155786, 5.38664, 25.487875, -6.46051, 5.5302234, 25.563005, -6.155786, 5.38664, 25.487875, -6.3074155, 5.384823, 25.640076, -6.7352633, 5.6665816, 25.089825, -7.249745, 5.4294252, 24.944311, -6.916063, 5.3964624, 24.806072, -6.7352633, 5.6665816, 25.089825, -6.836881, 5.81112, 25.415369, -7.249745, 5.4294252, 24.944311, -5.904365, 5.4435186, 24.765022, -6.125067, 5.5240107, 25.150925, -6.3319364, 5.7359695, 25.081383, -6.125067, 5.5240107, 25.150925, -5.904365, 5.4435186, 24.765022, -5.8518662, 5.369458, 24.847279, -6.125067, 5.5240107, 25.150925, -5.8518662, 5.369458, 24.847279, -5.982039, 5.3976545, 25.132534, -7.8256736, 5.34012, 25.656843, -7.744165, 5.310528, 25.246101, -7.4463277, 5.651639, 25.785309, -7.8256736, 5.34012, 25.656843, -7.8908563, 5.243067, 25.42438, -7.744165, 5.310528, 25.246101, -7.9896913, 5.2398424, 25.73777, -7.989692, 5.1600666, 25.528631, -7.8256736, 5.34012, 25.656843, -7.9896913, 5.2398424, 25.73777, -8.038292, 5.1534004, 25.594398, -7.989692, 5.1600666, 25.528631, -7.9896913, 5.2398424, 25.73777, -7.970281, 5.3087463, 26.08081, -8.13969, 5.114773, 25.721031, -8.239595, 5.077715, 26.094341, -8.13969, 5.114773, 25.721031, -7.970281, 5.3087463, 26.08081, -8.239595, 5.077715, 26.094341, -8.274294, 5.0338635, 25.932472, -8.13969, 5.114773, 25.721031, -6.331285, 5.6798854, 24.653553, -5.876188, 5.388583, 24.768026, -5.910171, 5.4440794, 24.847443, -6.331285, 5.6798854, 24.653553, -6.2332807, 5.427716, 24.268461, -5.876188, 5.388583, 24.768026, -6.555012, 5.4120646, 24.973154, -6.2882495, 5.5129185, 24.845657, -6.350158, 5.405257, 24.957108, -6.555012, 5.4120646, 24.973154, -6.331285, 5.6798854, 24.653553, -6.2882495, 5.5129185, 24.845657, -8.316685, 4.926779, 23.737947, -7.8548923, 5.297988, 23.903517, -7.925697, 5.1127415, 24.21713, -8.316685, 4.926779, 23.737947, -8.301708, 4.9451656, 23.675941, -7.8548923, 5.297988, 23.903517, -7.8548923, 5.297988, 23.903517, -7.815824, 5.15586, 24.324652, -7.925697, 5.1127415, 24.21713, -7.8548923, 5.297988, 23.903517, -7.6972337, 5.3176384, 24.191387, -7.815824, 5.15586, 24.324652, -7.6972337, 5.3176384, 24.191387, -7.8548923, 5.297988, 23.903517, -7.37958, 5.598157, 24.143217, -7.6972337, 5.3176384, 24.191387, -7.37958, 5.598157, 24.143217, -7.52163, 5.2640796, 24.611933, -7.6972337, 5.3176384, 24.191387, -7.52163, 5.2640796, 24.611933, -7.717137, 5.1935024, 24.421171, -7.52163, 5.2640796, 24.611933, -7.3604617, 5.389035, 24.563318, -7.457949, 5.2713842, 24.642237, -7.52163, 5.2640796, 24.611933, -7.37958, 5.598157, 24.143217, -7.3604617, 5.389035, 24.563318, -7.058254, 5.3891068, 24.842972, -6.74797, 5.522382, 24.775219, -6.928924, 5.3911495, 24.875774, -7.058254, 5.3891068, 24.842972, -6.8127713, 5.7382603, 24.422806, -6.74797, 5.522382, 24.775219, -8.2651825, 4.9275074, 23.624132, -7.8548923, 5.297988, 23.903517, -8.301708, 4.9451656, 23.675941, -7.8548923, 5.297988, 23.903517, -8.2651825, 4.9275074, 23.624132, -7.9951816, 5.089792, 23.725204, -7.9951816, 5.089792, 23.725204, -8.2651825, 4.9275074, 23.624132, -8.016663, 4.994527, 23.62873, -7.8548923, 5.297988, 23.903517, -7.4628644, 5.3177576, 23.831608, -7.37958, 5.598157, 24.143217, -7.8548923, 5.297988, 23.903517, -7.6030936, 5.2291493, 23.751238, -7.4628644, 5.3177576, 23.831608, -7.1153607, 5.282588, 23.72141, -6.8127713, 5.7382603, 24.422806, -7.37958, 5.598157, 24.143217, -6.8127713, 5.7382603, 24.422806, -7.1153607, 5.282588, 23.72141, -6.87394, 5.326008, 23.83848, -6.8127713, 5.7382603, 24.422806, -6.87394, 5.326008, 23.83848, -6.8445373, 5.4831157, 24.042107, -6.518, 5.605947, 24.369406, -6.331285, 5.6798854, 24.653553, -6.8127713, 5.7382603, 24.422806, -6.331285, 5.6798854, 24.653553, -6.518, 5.605947, 24.369406, -6.3297257, 5.428781, 24.196327, -6.331285, 5.6798854, 24.653553, -6.3297257, 5.428781, 24.196327, -6.2332807, 5.427716, 24.268461, -6.8127713, 5.7382603, 24.422806, -7.3604617, 5.389035, 24.563318, -7.37958, 5.598157, 24.143217, -7.056313, 5.567637, 24.537035, -7.3604617, 5.389035, 24.563318, -6.8127713, 5.7382603, 24.422806, -7.3604617, 5.389035, 24.563318, -7.056313, 5.567637, 24.537035, -7.24099, 5.2982535, 24.745642, -7.3604617, 5.389035, 24.563318, -7.24099, 5.2982535, 24.745642, -7.3485713, 5.2914233, 24.69535, -6.8127713, 5.7382603, 24.422806, -7.1779733, 5.3646665, 24.78445, -7.056313, 5.567637, 24.537035, -6.8127713, 5.7382603, 24.422806, -7.058254, 5.3891068, 24.842972, -7.1779733, 5.3646665, 24.78445, -6.8445373, 5.4831157, 24.042107, -6.6547856, 5.388571, 23.94828, -6.8127713, 5.7382603, 24.422806, -6.8445373, 5.4831157, 24.042107, -6.7587676, 5.367548, 23.897482, -6.6547856, 5.388571, 23.94828, -6.331285, 5.6798854, 24.653553, -6.74797, 5.522382, 24.775219, -6.8127713, 5.7382603, 24.422806, -6.74797, 5.522382, 24.775219, -6.331285, 5.6798854, 24.653553, -6.555012, 5.4120646, 24.973154, -6.74797, 5.522382, 24.775219, -6.555012, 5.4120646, 24.973154, -6.737456, 5.410923, 24.927305, -6.518, 5.605947, 24.369406, -6.6547856, 5.388571, 23.94828, -6.404985, 5.3717523, 24.133698, -6.518, 5.605947, 24.369406, -6.8127713, 5.7382603, 24.422806, -6.6547856, 5.388571, 23.94828, -5.910171, 5.4440794, 24.847443, -6.2882495, 5.5129185, 24.845657, -6.331285, 5.6798854, 24.653553, -6.2882495, 5.5129185, 24.845657, -5.910171, 5.4440794, 24.847443, -5.947083, 5.38731, 24.924572, -6.2882495, 5.5129185, 24.845657, -5.947083, 5.38731, 24.924572, -6.211325, 5.4130735, 24.94913, -7.4628644, 5.3177576, 23.831608, -7.1153607, 5.282588, 23.72141, -7.37958, 5.598157, 24.143217, -7.4628644, 5.3177576, 23.831608, -7.319452, 5.226307, 23.692755, -7.1153607, 5.282588, 23.72141, -7.6030936, 5.2291493, 23.751238, -7.4537644, 5.1571455, 23.66732, -7.4628644, 5.3177576, 23.831608, -7.6030936, 5.2291493, 23.751238, -7.522962, 5.150751, 23.66025, -7.4537644, 5.1571455, 23.66732, -7.6030936, 5.2291493, 23.751238, -7.8548923, 5.297988, 23.903517, -7.6649528, 5.116803, 23.641397, -7.9951816, 5.089792, 23.725204, -7.6649528, 5.116803, 23.641397, -7.8548923, 5.297988, 23.903517, -7.9951816, 5.089792, 23.725204, -7.8895354, 5.0471697, 23.63519, -7.6649528, 5.116803, 23.641397, -5.857347, 5.7116084, 24.363003, -5.903773, 5.378351, 24.927797, -6.00098, 5.4485216, 24.902779, -5.857347, 5.7116084, 24.363003, -5.4018383, 5.389697, 24.404541, -5.903773, 5.378351, 24.927797, -6.2981954, 5.4044847, 24.163559, -6.076615, 5.5257673, 24.45499, -6.2318177, 5.399699, 24.403456, -6.2981954, 5.4044847, 24.163559, -5.857347, 5.7116084, 24.363003, -6.076615, 5.5257673, 24.45499, -5.4074144, 4.736121, 21.818316, -5.439855, 5.177844, 22.396505, -5.831164, 4.97289, 22.37704, -5.4074144, 4.736121, 21.818316, -5.3315473, 4.755287, 21.823586, -5.439855, 5.177844, 22.396505, -5.439855, 5.177844, 22.396505, -5.9201818, 5.030147, 22.5292, -5.831164, 4.97289, 22.37704, -5.439855, 5.177844, 22.396505, -5.7215886, 5.217056, 22.642551, -5.9201818, 5.030147, 22.5292, -5.7215886, 5.217056, 22.642551, -5.439855, 5.177844, 22.396505, -5.5580716, 5.554124, 23.009472, -5.7215886, 5.217056, 22.642551, -5.5580716, 5.554124, 23.009472, -6.160071, 5.178384, 22.936909, -5.7215886, 5.217056, 22.642551, -6.160071, 5.178384, 22.936909, -6.000282, 5.0809345, 22.665983, -6.160071, 5.178384, 22.936909, -6.046327, 5.3291693, 23.119432, -6.1793313, 5.1894274, 23.018368, -6.160071, 5.178384, 22.936909, -5.5580716, 5.554124, 23.009472, -6.046327, 5.3291693, 23.119432, -6.2826037, 5.3541317, 23.53723, -6.1099467, 5.52, 23.893438, -6.287435, 5.3614902, 23.69768, -6.2826037, 5.3541317, 23.53723, -5.7123218, 5.753208, 23.741987, -6.1099467, 5.52, 23.893438, -5.2635365, 4.7313147, 21.856642, -5.439855, 5.177844, 22.396505, -5.3315473, 4.755287, 21.823586, -5.439855, 5.177844, 22.396505, -5.2635365, 4.7313147, 21.856642, -5.291579, 4.922532, 22.195475, -5.291579, 4.922532, 22.195475, -5.2635365, 4.7313147, 21.856642, -5.19895, 4.8064184, 22.150917, -5.439855, 5.177844, 22.396505, -5.24503, 5.200137, 22.848965, -5.5580716, 5.554124, 23.009472, -5.439855, 5.177844, 22.396505, -5.1995373, 5.0887403, 22.666178, -5.24503, 5.200137, 22.848965, -5.0281267, 5.1566877, 23.240654, -5.7123218, 5.753208, 23.741987, -5.5580716, 5.554124, 23.009472, -5.7123218, 5.753208, 23.741987, -5.0281267, 5.1566877, 23.240654, -5.097282, 5.219322, 23.551094, -5.7123218, 5.753208, 23.741987, -5.097282, 5.219322, 23.551094, -5.3022, 5.4230766, 23.628416, -5.577439, 5.6020293, 24.084873, -5.857347, 5.7116084, 24.363003, -5.7123218, 5.753208, 23.741987, -5.857347, 5.7116084, 24.363003, -5.577439, 5.6020293, 24.084873, -5.342383, 5.384054, 24.275276, -5.857347, 5.7116084, 24.363003, -5.342383, 5.384054, 24.275276, -5.4018383, 5.389697, 24.404541, -5.7123218, 5.753208, 23.741987, -6.046327, 5.3291693, 23.119432, -5.5580716, 5.554124, 23.009472, -5.917007, 5.5500546, 23.476519, -6.046327, 5.3291693, 23.119432, -5.7123218, 5.753208, 23.741987, -6.046327, 5.3291693, 23.119432, -5.917007, 5.5500546, 23.476519, -6.244391, 5.2299757, 23.296265, -6.046327, 5.3291693, 23.119432, -6.244391, 5.2299757, 23.296265, -6.210569, 5.21813, 23.159012, -5.7123218, 5.753208, 23.741987, -6.2491727, 5.318202, 23.382605, -5.917007, 5.5500546, 23.476519, -5.7123218, 5.753208, 23.741987, -6.2826037, 5.3541317, 23.53723, -6.2491727, 5.318202, 23.382605, -5.3022, 5.4230766, 23.628416, -5.154279, 5.307758, 23.83554, -5.7123218, 5.753208, 23.741987, -5.3022, 5.4230766, 23.628416, -5.1251884, 5.2768984, 23.701454, -5.154279, 5.307758, 23.83554, -5.857347, 5.7116084, 24.363003, -6.1099467, 5.52, 23.893438, -5.7123218, 5.753208, 23.741987, -6.1099467, 5.52, 23.893438, -5.857347, 5.7116084, 24.363003, -6.2981954, 5.4044847, 24.163559, -6.1099467, 5.52, 23.893438, -6.2981954, 5.4044847, 24.163559, -6.291105, 5.3954716, 23.937151, -5.577439, 5.6020293, 24.084873, -5.154279, 5.307758, 23.83554, -5.3127255, 5.301915, 24.168657, -5.577439, 5.6020293, 24.084873, -5.7123218, 5.753208, 23.741987, -5.154279, 5.307758, 23.83554, -6.00098, 5.4485216, 24.902779, -6.076615, 5.5257673, 24.45499, -5.857347, 5.7116084, 24.363003, -6.076615, 5.5257673, 24.45499, -6.00098, 5.4485216, 24.902779, -6.1017814, 5.3846993, 24.875137, -6.076615, 5.5257673, 24.45499, -6.1017814, 5.3846993, 24.875137, -6.184852, 5.4140406, 24.567734, -5.24503, 5.200137, 22.848965, -5.0281267, 5.1566877, 23.240654, -5.5580716, 5.554124, 23.009472, -5.24503, 5.200137, 22.848965, -5.0552382, 5.0847697, 22.992046, -5.0281267, 5.1566877, 23.240654, -5.1995373, 5.0887403, 22.666178, -5.0783086, 4.9989347, 22.825645, -5.24503, 5.200137, 22.848965, -5.1995373, 5.0887403, 22.666178, -5.0852733, 4.9907217, 22.742779, -5.0783086, 4.9989347, 22.825645, -5.1995373, 5.0887403, 22.666178, -5.439855, 5.177844, 22.396505, -5.102995, 4.9489727, 22.570704, -5.291579, 4.922532, 22.195475, -5.102995, 4.9489727, 22.570704, -5.439855, 5.177844, 22.396505, -5.291579, 4.922532, 22.195475, -5.163247, 4.866782, 22.303133, -5.102995, 4.9489727, 22.570704, -5.488422, 5.4559135, 25.067163, -6.115338, 5.4586115, 24.851, -6.0311418, 5.4854546, 24.766218, -5.488422, 5.4559135, 25.067163, -5.8165927, 5.2966948, 25.486755, -6.115338, 5.4586115, 24.851, -5.37565, 5.0100093, 24.717901, -5.60895, 5.3052464, 24.837267, -5.5913396, 5.1425714, 24.705996, -5.37565, 5.0100093, 24.717901, -5.488422, 5.4559135, 25.067163, -5.60895, 5.3052464, 24.837267, -3.997026, 3.4084823, 26.23418, -4.2373033, 4.0717287, 26.033955, -4.2301164, 3.8139224, 25.675167, -3.997026, 3.4084823, 26.23418, -4.010387, 3.441938, 26.303183, -4.2373033, 4.0717287, 26.033955, -4.2373033, 4.0717287, 26.033955, -4.3043237, 3.923424, 25.547739, -4.2301164, 3.8139224, 25.675167, -4.2373033, 4.0717287, 26.033955, -4.351472, 4.177483, 25.700325, -4.3043237, 3.923424, 25.547739, -4.351472, 4.177483, 25.700325, -4.2373033, 4.0717287, 26.033955, -4.5209985, 4.6817417, 25.74504, -4.351472, 4.177483, 25.700325, -4.5209985, 4.6817417, 25.74504, -4.504621, 4.2121515, 25.204073, -4.351472, 4.177483, 25.700325, -4.504621, 4.2121515, 25.204073, -4.3712316, 4.021261, 25.432993, -4.504621, 4.2121515, 25.204073, -4.6092005, 4.455448, 25.259403, -4.5602574, 4.259628, 25.160809, -4.504621, 4.2121515, 25.204073, -4.5209985, 4.6817417, 25.74504, -4.6092005, 4.455448, 25.259403, -4.8856854, 4.646908, 24.917786, -5.1403203, 5.003999, 24.975368, -5.0130434, 4.735046, 24.86499, -4.8856854, 4.646908, 24.917786, -4.988566, 5.1979246, 25.387373, -5.1403203, 5.003999, 24.975368, -4.0683527, 3.4522138, 26.357347, -4.2373033, 4.0717287, 26.033955, -4.010387, 3.441938, 26.303183, -4.2373033, 4.0717287, 26.033955, -4.0683527, 3.4522138, 26.357347, -4.242745, 3.782452, 26.231682, -4.242745, 3.782452, 26.231682, -4.0683527, 3.4522138, 26.357347, -4.2885528, 3.6797438, 26.329477, -4.2373033, 4.0717287, 26.033955, -4.656346, 4.3628387, 26.08645, -4.5209985, 4.6817417, 25.74504, -4.2373033, 4.0717287, 26.033955, -4.57377, 4.1835814, 26.181997, -4.656346, 4.3628387, 26.08645, -5.062138, 4.5712886, 26.17474, -4.988566, 5.1979246, 25.387373, -4.5209985, 4.6817417, 25.74504, -4.988566, 5.1979246, 25.387373, -5.062138, 4.5712886, 26.17474, -5.2679048, 4.7707634, 26.016972, -4.988566, 5.1979246, 25.387373, -5.2679048, 4.7707634, 26.016972, -5.1766024, 4.9423556, 25.806808, -5.3932915, 5.275302, 25.41678, -5.488422, 5.4559135, 25.067163, -4.988566, 5.1979246, 25.387373, -5.488422, 5.4559135, 25.067163, -5.3932915, 5.275302, 25.41678, -5.7287784, 5.236825, 25.581738, -5.488422, 5.4559135, 25.067163, -5.7287784, 5.236825, 25.581738, -5.8165927, 5.2966948, 25.486755, -4.988566, 5.1979246, 25.387373, -4.6092005, 4.455448, 25.259403, -4.5209985, 4.6817417, 25.74504, -4.825552, 4.8508716, 25.277138, -4.6092005, 4.455448, 25.259403, -4.988566, 5.1979246, 25.387373, -4.6092005, 4.455448, 25.259403, -4.825552, 4.8508716, 25.277138, -4.749141, 4.4242043, 25.014292, -4.6092005, 4.455448, 25.259403, -4.749141, 4.4242043, 25.014292, -4.653323, 4.3502817, 25.089447, -4.988566, 5.1979246, 25.387373, -4.784744, 4.543359, 24.994701, -4.825552, 4.8508716, 25.277138, -4.988566, 5.1979246, 25.387373, -4.8856854, 4.646908, 24.917786, -4.784744, 4.543359, 24.994701, -5.1766024, 4.9423556, 25.806808, -5.4469156, 4.981415, 25.883078, -4.988566, 5.1979246, 25.387373, -5.1766024, 4.9423556, 25.806808, -5.3591576, 4.891834, 25.949957, -5.4469156, 4.981415, 25.883078, -5.488422, 5.4559135, 25.067163, -5.1403203, 5.003999, 24.975368, -4.988566, 5.1979246, 25.387373, -5.1403203, 5.003999, 24.975368, -5.488422, 5.4559135, 25.067163, -5.37565, 5.0100093, 24.717901, -5.1403203, 5.003999, 24.975368, -5.37565, 5.0100093, 24.717901, -5.1955976, 4.8869286, 24.792862, -5.3932915, 5.275302, 25.41678, -5.4469156, 4.981415, 25.883078, -5.6794295, 5.1171756, 25.630447, -5.3932915, 5.275302, 25.41678, -4.988566, 5.1979246, 25.387373, -5.4469156, 4.981415, 25.883078, -6.0311418, 5.4854546, 24.766218, -5.60895, 5.3052464, 24.837267, -5.488422, 5.4559135, 25.067163, -5.60895, 5.3052464, 24.837267, -6.0311418, 5.4854546, 24.766218, -6.01732, 5.3982096, 24.681461, -5.60895, 5.3052464, 24.837267, -6.01732, 5.3982096, 24.681461, -5.733069, 5.248727, 24.701923, -4.656346, 4.3628387, 26.08645, -5.062138, 4.5712886, 26.17474, -4.5209985, 4.6817417, 25.74504, -4.656346, 4.3628387, 26.08645, -4.8856683, 4.377059, 26.22222, -5.062138, 4.5712886, 26.17474, -4.57377, 4.1835814, 26.181997, -4.779701, 4.213683, 26.243425, -4.656346, 4.3628387, 26.08645, -4.57377, 4.1835814, 26.181997, -4.715779, 4.162856, 26.263649, -4.779701, 4.213683, 26.243425, -4.57377, 4.1835814, 26.181997, -4.2373033, 4.0717287, 26.033955, -4.590958, 4.0354905, 26.29871, -4.242745, 3.782452, 26.231682, -4.590958, 4.0354905, 26.29871, -4.2373033, 4.0717287, 26.033955, -4.242745, 3.782452, 26.231682, -4.395331, 3.8163853, 26.320553, -4.590958, 4.0354905, 26.29871, -6.1042504, 1.2728562, 23.197392, -5.918094, 2.7018955, 23.690025, -5.9148564, 2.7549148, 23.524578, -6.1042504, 1.2728562, 23.197392, -6.1098676, 1.2173094, 23.399563, -5.918094, 2.7018955, 23.690025, -6.4102006, -0.38891935, 23.115858, -6.1098676, 1.2173094, 23.399563, -6.1042504, 1.2728562, 23.197392, -6.4102006, -0.38891935, 23.115858, -6.407615, -0.42018914, 23.34877, -6.1098676, 1.2173094, 23.399563, -6.445969, 1.214475, 23.560837, -6.334398, 2.7400944, 23.713541, -6.206943, 2.6917243, 23.821266, -6.445969, 1.214475, 23.560837, -6.593639, 1.2685848, 23.43337, -6.334398, 2.7400944, 23.713541, -6.45285, 1.3504215, 23.077362, -6.04308, 2.8031602, 23.417374, -6.2159896, 2.8219187, 23.420893, -6.45285, 1.3504215, 23.077362, -6.2506223, 1.3273255, 23.06642, -6.04308, 2.8031602, 23.417374, -6.206943, 2.6917243, 23.821266, -6.1571717, 4.087394, 24.238876, -6.071984, 4.053143, 24.309086, -6.206943, 2.6917243, 23.821266, -6.334398, 2.7400944, 23.713541, -6.1571717, 4.087394, 24.238876, -5.9148564, 2.7549148, 23.524578, -5.878671, 4.066166, 24.22505, -5.875483, 4.1052194, 24.1148, -5.9148564, 2.7549148, 23.524578, -5.918094, 2.7018955, 23.690025, -5.878671, 4.066166, 24.22505, -5.875483, 4.1052194, 24.1148, -5.878671, 4.066166, 24.22505, -5.8760715, 4.7822523, 24.560642, -5.875483, 4.1052194, 24.1148, -5.8760715, 4.7822523, 24.560642, -5.8734727, 4.8202696, 24.482874, -6.1098676, 1.2173094, 23.399563, -6.0342355, 2.6733067, 23.816893, -5.918094, 2.7018955, 23.690025, -6.1098676, 1.2173094, 23.399563, -6.2450395, 1.1910194, 23.5534, -6.0342355, 2.6733067, 23.816893, -5.918094, 2.7018955, 23.690025, -6.0342355, 2.6733067, 23.816893, -5.9568696, 4.0428257, 24.307844, -5.918094, 2.7018955, 23.690025, -5.9568696, 4.0428257, 24.307844, -5.878671, 4.066166, 24.22505, -6.593639, 1.2685848, 23.43337, -6.3314233, 2.7938638, 23.547709, -6.334398, 2.7400944, 23.713541, -6.593639, 1.2685848, 23.43337, -6.589192, 1.3239617, 23.234522, -6.3314233, 2.7938638, 23.547709, -6.334398, 2.7400944, 23.713541, -6.3314233, 2.7938638, 23.547709, -6.1551642, 4.1276875, 24.129848, -6.334398, 2.7400944, 23.713541, -6.1551642, 4.1276875, 24.129848, -6.1571717, 4.087394, 24.238876, -6.2159896, 2.8219187, 23.420893, -5.9612355, 4.1389728, 24.042906, -6.0775657, 4.150184, 24.04522, -6.2159896, 2.8219187, 23.420893, -6.04308, 2.8031602, 23.417374, -5.9612355, 4.1389728, 24.042906, -6.2506223, 1.3273255, 23.06642, -5.9148564, 2.7549148, 23.524578, -6.04308, 2.8031602, 23.417374, -6.2506223, 1.3273255, 23.06642, -6.1042504, 1.2728562, 23.197392, -5.9148564, 2.7549148, 23.524578, -6.04308, 2.8031602, 23.417374, -5.875483, 4.1052194, 24.1148, -5.9612355, 4.1389728, 24.042906, -6.04308, 2.8031602, 23.417374, -5.9148564, 2.7549148, 23.524578, -5.875483, 4.1052194, 24.1148, -6.589192, 1.3239617, 23.234522, -6.2159896, 2.8219187, 23.420893, -6.3314233, 2.7938638, 23.547709, -6.589192, 1.3239617, 23.234522, -6.45285, 1.3504215, 23.077362, -6.2159896, 2.8219187, 23.420893, -6.971047, -0.29482222, 23.15477, -6.45285, 1.3504215, 23.077362, -6.589192, 1.3239617, 23.234522, -6.971047, -0.29482222, 23.15477, -6.8199706, -0.29774308, 22.974768, -6.45285, 1.3504215, 23.077362, -6.3314233, 2.7938638, 23.547709, -6.0775657, 4.150184, 24.04522, -6.1551642, 4.1276875, 24.129848, -6.3314233, 2.7938638, 23.547709, -6.2159896, 2.8219187, 23.420893, -6.0775657, 4.150184, 24.04522, -6.1551642, 4.1276875, 24.129848, -6.0775657, 4.150184, 24.04522, -6.023566, 4.8536663, 24.431192, -6.1551642, 4.1276875, 24.129848, -6.023566, 4.8536663, 24.431192, -6.082048, 4.828084, 24.48972, -6.020826, 4.7619505, 24.618555, -5.936191, 5.2892733, 24.899128, -5.934734, 4.757289, 24.618954, -6.020826, 4.7619505, 24.618555, -5.999312, 5.2915688, 24.898323, -5.936191, 5.2892733, 24.899128, -5.8760715, 4.7822523, 24.560642, -5.8913436, 5.3461533, 24.805635, -5.8734727, 4.8202696, 24.482874, -5.8760715, 4.7822523, 24.560642, -5.8932214, 5.3139095, 24.859932, -5.8913436, 5.3461533, 24.805635, -5.934734, 4.757289, 24.618954, -5.8932214, 5.3139095, 24.859932, -5.8760715, 4.7822523, 24.560642, -5.934734, 4.757289, 24.618954, -5.936191, 5.2892733, 24.899128, -5.8932214, 5.3139095, 24.859932, -5.9370246, 4.8486996, 24.431229, -6.000772, 5.3705015, 24.767956, -6.023566, 4.8536663, 24.431192, -5.9370246, 4.8486996, 24.431229, -5.937638, 5.3697376, 24.769716, -6.000772, 5.3705015, 24.767956, -5.8734727, 4.8202696, 24.482874, -5.937638, 5.3697376, 24.769716, -5.9370246, 4.8486996, 24.431229, -5.8734727, 4.8202696, 24.482874, -5.8913436, 5.3461533, 24.805635, -5.937638, 5.3697376, 24.769716, -6.082048, 4.828084, 24.48972, -6.0456195, 5.3136215, 24.86145, -6.0841565, 4.790536, 24.567505, -6.082048, 4.828084, 24.48972, -6.0437293, 5.3473988, 24.80811, -6.0456195, 5.3136215, 24.86145, -6.023566, 4.8536663, 24.431192, -6.0437293, 5.3473988, 24.80811, -6.082048, 4.828084, 24.48972, -6.023566, 4.8536663, 24.431192, -6.000772, 5.3705015, 24.767956, -6.0437293, 5.3473988, 24.80811, -6.5591636, -0.41737175, 23.530104, -6.445969, 1.214475, 23.560837, -6.2450395, 1.1910194, 23.5534, -6.5591636, -0.41737175, 23.530104, -6.791864, -0.37708354, 23.536917, -6.445969, 1.214475, 23.560837, -6.0841565, 4.790536, 24.567505, -5.999312, 5.2915688, 24.898323, -6.020826, 4.7619505, 24.618555, -6.0841565, 4.790536, 24.567505, -6.0456195, 5.3136215, 24.86145, -5.999312, 5.2915688, 24.898323, -6.2450395, 1.1910194, 23.5534, -6.206943, 2.6917243, 23.821266, -6.0342355, 2.6733067, 23.816893, -6.2450395, 1.1910194, 23.5534, -6.445969, 1.214475, 23.560837, -6.206943, 2.6917243, 23.821266, -6.791864, -0.37708354, 23.536917, -6.593639, 1.2685848, 23.43337, -6.445969, 1.214475, 23.560837, -6.791864, -0.37708354, 23.536917, -6.9689336, -0.32619548, 23.389013, -6.593639, 1.2685848, 23.43337, -6.8199706, -0.29774308, 22.974768, -6.2506223, 1.3273255, 23.06642, -6.45285, 1.3504215, 23.077362, -6.8199706, -0.29774308, 22.974768, -6.5876184, -0.33810782, 22.968916, -6.2506223, 1.3273255, 23.06642, -6.407615, -0.42018914, 23.34877, -6.2450395, 1.1910194, 23.5534, -6.1098676, 1.2173094, 23.399563, -6.407615, -0.42018914, 23.34877, -6.5591636, -0.41737175, 23.530104, -6.2450395, 1.1910194, 23.5534, -6.9689336, -0.32619548, 23.389013, -6.589192, 1.3239617, 23.234522, -6.593639, 1.2685848, 23.43337, -6.9689336, -0.32619548, 23.389013, -6.971047, -0.29482222, 23.15477, -6.589192, 1.3239617, 23.234522, -6.5876184, -0.33810782, 22.968916, -6.1042504, 1.2728562, 23.197392, -6.2506223, 1.3273255, 23.06642, -6.5876184, -0.33810782, 22.968916, -6.4102006, -0.38891935, 23.115858, -6.1042504, 1.2728562, 23.197392, -6.0342355, 2.6733067, 23.816893, -6.071984, 4.053143, 24.309086, -5.9568696, 4.0428257, 24.307844, -6.0342355, 2.6733067, 23.816893, -6.206943, 2.6917243, 23.821266, -6.071984, 4.053143, 24.309086, -5.9568696, 4.0428257, 24.307844, -6.020826, 4.7619505, 24.618555, -5.934734, 4.757289, 24.618954, -5.9568696, 4.0428257, 24.307844, -6.071984, 4.053143, 24.309086, -6.020826, 4.7619505, 24.618555, -6.071984, 4.053143, 24.309086, -6.0841565, 4.790536, 24.567505, -6.020826, 4.7619505, 24.618555, -6.071984, 4.053143, 24.309086, -6.1571717, 4.087394, 24.238876, -6.0841565, 4.790536, 24.567505, -5.878671, 4.066166, 24.22505, -5.934734, 4.757289, 24.618954, -5.8760715, 4.7822523, 24.560642, -5.878671, 4.066166, 24.22505, -5.9568696, 4.0428257, 24.307844, -5.934734, 4.757289, 24.618954, -6.0775657, 4.150184, 24.04522, -5.9370246, 4.8486996, 24.431229, -6.023566, 4.8536663, 24.431192, -6.0775657, 4.150184, 24.04522, -5.9612355, 4.1389728, 24.042906, -5.9370246, 4.8486996, 24.431229, -5.9612355, 4.1389728, 24.042906, -5.8734727, 4.8202696, 24.482874, -5.9370246, 4.8486996, 24.431229, -5.9612355, 4.1389728, 24.042906, -5.875483, 4.1052194, 24.1148, -5.8734727, 4.8202696, 24.482874, -6.1571717, 4.087394, 24.238876, -6.082048, 4.828084, 24.48972, -6.0841565, 4.790536, 24.567505, -6.1571717, 4.087394, 24.238876, -6.1551642, 4.1276875, 24.129848, -6.082048, 4.828084, 24.48972, -7.3456454, 4.1475077, 21.98113, -7.7547154, 4.0165606, 21.935587, -7.73344, 4.0729046, 21.883982, -7.3456454, 4.1475077, 21.98113, -7.39551, 3.8681917, 22.222395, -7.7547154, 4.0165606, 21.935587, -7.2885756, 4.023938, 21.648745, -7.4439178, 4.086134, 21.816298, -7.4376407, 4.0358357, 21.702383, -7.2885756, 4.023938, 21.648745, -7.3456454, 4.1475077, 21.98113, -7.4439178, 4.086134, 21.816298, -5.835222, 3.136388, 22.094479, -6.143434, 3.5016217, 22.14021, -6.182443, 3.446207, 21.86201, -5.835222, 3.136388, 22.094479, -5.831487, 3.134635, 22.146042, -6.143434, 3.5016217, 22.14021, -6.143434, 3.5016217, 22.14021, -6.276529, 3.5192416, 21.814625, -6.182443, 3.446207, 21.86201, -6.143434, 3.5016217, 22.14021, -6.311259, 3.6133804, 21.96652, -6.276529, 3.5192416, 21.814625, -6.311259, 3.6133804, 21.96652, -6.143434, 3.5016217, 22.14021, -6.488027, 3.838162, 22.121197, -6.311259, 3.6133804, 21.96652, -6.488027, 3.838162, 22.121197, -6.5290217, 3.7089415, 21.687683, -6.311259, 3.6133804, 21.96652, -6.5290217, 3.7089415, 21.687683, -6.3611083, 3.5839481, 21.772032, -6.5290217, 3.7089415, 21.687683, -6.61853, 3.8050375, 21.778206, -6.5801196, 3.7298079, 21.680998, -6.5290217, 3.7089415, 21.687683, -6.488027, 3.838162, 22.121197, -6.61853, 3.8050375, 21.778206, -6.895559, 3.9183722, 21.635805, -7.089803, 4.029269, 21.773304, -6.996865, 3.9430032, 21.63935, -6.895559, 3.9183722, 21.635805, -6.936025, 4.07687, 22.060637, -7.089803, 4.029269, 21.773304, -5.852432, 3.11117, 22.186768, -6.143434, 3.5016217, 22.14021, -5.831487, 3.134635, 22.146042, -6.143434, 3.5016217, 22.14021, -5.852432, 3.11117, 22.186768, -6.0435195, 3.2870784, 22.199028, -6.0435195, 3.2870784, 22.199028, -5.852432, 3.11117, 22.186768, -6.0259957, 3.1908565, 22.246626, -6.143434, 3.5016217, 22.14021, -6.4199605, 3.5414572, 22.270983, -6.488027, 3.838162, 22.121197, -6.143434, 3.5016217, 22.14021, -6.316384, 3.4395418, 22.283651, -6.4199605, 3.5414572, 22.270983, -6.6648736, 3.5251694, 22.411572, -6.936025, 4.07687, 22.060637, -6.488027, 3.838162, 22.121197, -6.936025, 4.07687, 22.060637, -6.6648736, 3.5251694, 22.411572, -6.8574367, 3.616784, 22.385473, -6.936025, 4.07687, 22.060637, -6.8574367, 3.616784, 22.385473, -6.8897033, 3.7860932, 22.274248, -7.1705127, 3.995197, 22.128761, -7.3456454, 4.1475077, 21.98113, -6.936025, 4.07687, 22.060637, -7.3456454, 4.1475077, 21.98113, -7.1705127, 3.995197, 22.128761, -7.311005, 3.8388238, 22.254168, -7.3456454, 4.1475077, 21.98113, -7.311005, 3.8388238, 22.254168, -7.39551, 3.8681917, 22.222395, -6.936025, 4.07687, 22.060637, -6.61853, 3.8050375, 21.778206, -6.488027, 3.838162, 22.121197, -6.808315, 3.9616337, 21.892696, -6.61853, 3.8050375, 21.778206, -6.936025, 4.07687, 22.060637, -6.61853, 3.8050375, 21.778206, -6.808315, 3.9616337, 21.892696, -6.754091, 3.8023548, 21.658047, -6.61853, 3.8050375, 21.778206, -6.754091, 3.8023548, 21.658047, -6.667336, 3.7712486, 21.66921, -6.936025, 4.07687, 22.060637, -6.8002677, 3.871698, 21.648817, -6.808315, 3.9616337, 21.892696, -6.936025, 4.07687, 22.060637, -6.895559, 3.9183722, 21.635805, -6.8002677, 3.871698, 21.648817, -6.8897033, 3.7860932, 22.274248, -7.0301766, 3.7129135, 22.36113, -6.936025, 4.07687, 22.060637, -6.8897033, 3.7860932, 22.274248, -6.94754, 3.6726983, 22.372395, -7.0301766, 3.7129135, 22.36113, -7.3456454, 4.1475077, 21.98113, -7.089803, 4.029269, 21.773304, -6.936025, 4.07687, 22.060637, -7.089803, 4.029269, 21.773304, -7.3456454, 4.1475077, 21.98113, -7.2885756, 4.023938, 21.648745, -7.089803, 4.029269, 21.773304, -7.2885756, 4.023938, 21.648745, -7.145592, 3.9925408, 21.643513, -7.1705127, 3.995197, 22.128761, -7.0301766, 3.7129135, 22.36113, -7.250442, 3.7801287, 22.278788, -7.1705127, 3.995197, 22.128761, -6.936025, 4.07687, 22.060637, -7.0301766, 3.7129135, 22.36113, -7.73344, 4.0729046, 21.883982, -7.4439178, 4.086134, 21.816298, -7.3456454, 4.1475077, 21.98113, -7.4439178, 4.086134, 21.816298, -7.73344, 4.0729046, 21.883982, -7.730845, 4.0477705, 21.8088, -7.4439178, 4.086134, 21.816298, -7.730845, 4.0477705, 21.8088, -7.537543, 4.047288, 21.737965, -6.4199605, 3.5414572, 22.270983, -6.6648736, 3.5251694, 22.411572, -6.488027, 3.838162, 22.121197, -6.4199605, 3.5414572, 22.270983, -6.5177665, 3.4538927, 22.380463, -6.6648736, 3.5251694, 22.411572, -6.316384, 3.4395418, 22.283651, -6.4231963, 3.3844132, 22.362364, -6.4199605, 3.5414572, 22.270983, -6.316384, 3.4395418, 22.283651, -6.372542, 3.369453, 22.350878, -6.4231963, 3.3844132, 22.362364, -6.316384, 3.4395418, 22.283651, -6.143434, 3.5016217, 22.14021, -6.269735, 3.3225741, 22.32892, -6.0435195, 3.2870784, 22.199028, -6.269735, 3.3225741, 22.32892, -6.143434, 3.5016217, 22.14021, -6.0435195, 3.2870784, 22.199028, -6.1135287, 3.244587, 22.275616, -6.269735, 3.3225741, 22.32892, -8.006098, 4.0689516, 22.13492, -7.6670833, 4.0418825, 21.783504, -7.640471, 4.0882125, 21.854998, -8.006098, 4.0689516, 22.13492, -8.1642685, 3.8312206, 21.842627, -7.6670833, 4.0418825, 21.783504, -7.756726, 3.8452916, 22.38111, -7.7926917, 3.9996805, 22.145943, -7.6962695, 3.9147148, 22.219965, -7.756726, 3.8452916, 22.38111, -8.006098, 4.0689516, 22.13492, -7.7926917, 3.9996805, 22.145943, -9.112757, 2.5434918, 23.142544, -8.955492, 3.0269203, 22.925161, -8.686771, 2.9242716, 23.071201, -9.112757, 2.5434918, 23.142544, -9.159386, 2.5504227, 23.109524, -8.955492, 3.0269203, 22.925161, -8.955492, 3.0269203, 22.925161, -8.584085, 3.0207791, 23.038433, -8.686771, 2.9242716, 23.071201, -8.955492, 3.0269203, 22.925161, -8.695301, 3.1616163, 22.923185, -8.584085, 3.0207791, 23.038433, -8.695301, 3.1616163, 22.923185, -8.955492, 3.0269203, 22.925161, -8.715704, 3.4878736, 22.713732, -8.695301, 3.1616163, 22.923185, -8.715704, 3.4878736, 22.713732, -8.307899, 3.2759342, 22.950727, -8.695301, 3.1616163, 22.923185, -8.307899, 3.2759342, 22.950727, -8.491686, 3.1070724, 23.009012, -8.307899, 3.2759342, 22.950727, -8.328896, 3.4248629, 22.82755, -8.266613, 3.3116674, 22.91728, -8.307899, 3.2759342, 22.950727, -8.715704, 3.4878736, 22.713732, -8.328896, 3.4248629, 22.82755, -8.018351, 3.603071, 22.708073, -8.005375, 3.8135586, 22.46657, -7.9505553, 3.661367, 22.623951, -8.018351, 3.603071, 22.708073, -8.361177, 3.876412, 22.41829, -8.005375, 3.8135586, 22.46657, -9.178247, 2.5394235, 23.05604, -8.955492, 3.0269203, 22.925161, -9.159386, 2.5504227, 23.109524, -8.955492, 3.0269203, 22.925161, -9.178247, 2.5394235, 23.05604, -9.064192, 2.7795045, 22.919472, -9.064192, 2.7795045, 22.919472, -9.178247, 2.5394235, 23.05604, -9.110924, 2.6796026, 22.880608, -8.955492, 3.0269203, 22.925161, -8.875946, 3.1743643, 22.591955, -8.715704, 3.4878736, 22.713732, -8.955492, 3.0269203, 22.925161, -8.9538765, 3.0363877, 22.650652, -8.875946, 3.1743643, 22.591955, -8.822695, 3.2558434, 22.270594, -8.361177, 3.876412, 22.41829, -8.715704, 3.4878736, 22.713732, -8.361177, 3.876412, 22.41829, -8.822695, 3.2558434, 22.270594, -8.668564, 3.40597, 22.14398, -8.361177, 3.876412, 22.41829, -8.668564, 3.40597, 22.14398, -8.56176, 3.58513, 22.231379, -8.250622, 3.8801494, 22.13827, -8.006098, 4.0689516, 22.13492, -8.361177, 3.876412, 22.41829, -8.006098, 4.0689516, 22.13492, -8.250622, 3.8801494, 22.13827, -8.250301, 3.7793045, 21.885279, -8.006098, 4.0689516, 22.13492, -8.250301, 3.7793045, 21.885279, -8.1642685, 3.8312206, 21.842627, -8.361177, 3.876412, 22.41829, -8.328896, 3.4248629, 22.82755, -8.715704, 3.4878736, 22.713732, -8.302567, 3.6759555, 22.615335, -8.328896, 3.4248629, 22.82755, -8.361177, 3.876412, 22.41829, -8.328896, 3.4248629, 22.82755, -8.302567, 3.6759555, 22.615335, -8.126291, 3.4355674, 22.803347, -8.328896, 3.4248629, 22.82755, -8.126291, 3.4355674, 22.803347, -8.196812, 3.379901, 22.85993, -8.361177, 3.876412, 22.41829, -8.094337, 3.5251052, 22.770916, -8.302567, 3.6759555, 22.615335, -8.361177, 3.876412, 22.41829, -8.018351, 3.603071, 22.708073, -8.094337, 3.5251052, 22.770916, -8.56176, 3.58513, 22.231379, -8.532204, 3.5644715, 22.029161, -8.361177, 3.876412, 22.41829, -8.56176, 3.58513, 22.231379, -8.598177, 3.497055, 22.083708, -8.532204, 3.5644715, 22.029161, -8.006098, 4.0689516, 22.13492, -8.005375, 3.8135586, 22.46657, -8.361177, 3.876412, 22.41829, -8.005375, 3.8135586, 22.46657, -8.006098, 4.0689516, 22.13492, -7.756726, 3.8452916, 22.38111, -8.005375, 3.8135586, 22.46657, -7.756726, 3.8452916, 22.38111, -7.852491, 3.7639642, 22.499866, -8.250622, 3.8801494, 22.13827, -8.532204, 3.5644715, 22.029161, -8.306704, 3.6845965, 21.918798, -8.250622, 3.8801494, 22.13827, -8.361177, 3.876412, 22.41829, -8.532204, 3.5644715, 22.029161, -7.640471, 4.0882125, 21.854998, -7.7926917, 3.9996805, 22.145943, -8.006098, 4.0689516, 22.13492, -7.7926917, 3.9996805, 22.145943, -7.640471, 4.0882125, 21.854998, -7.576958, 4.04729, 21.902573, -7.7926917, 3.9996805, 22.145943, -7.576958, 4.04729, 21.902573, -7.6565347, 3.9742813, 22.111242, -8.875946, 3.1743643, 22.591955, -8.822695, 3.2558434, 22.270594, -8.715704, 3.4878736, 22.713732, -8.875946, 3.1743643, 22.591955, -8.895857, 3.1287508, 22.405542, -8.822695, 3.2558434, 22.270594, -8.9538765, 3.0363877, 22.650652, -8.940609, 3.017987, 22.493166, -8.875946, 3.1743643, 22.591955, -8.9538765, 3.0363877, 22.650652, -8.9667015, 2.9863772, 22.539291, -8.940609, 3.017987, 22.493166, -8.9538765, 3.0363877, 22.650652, -8.955492, 3.0269203, 22.925161, -9.018259, 2.9038734, 22.63329, -9.064192, 2.7795045, 22.919472, -9.018259, 2.9038734, 22.63329, -8.955492, 3.0269203, 22.925161, -9.064192, 2.7795045, 22.919472, -9.078123, 2.7668862, 22.79162, -9.018259, 2.9038734, 22.63329, -8.007105, 4.2432814, 21.79742, -7.6102357, 3.9935734, 21.830496, -7.6156516, 4.0593348, 21.890636, -8.007105, 4.2432814, 21.79742, -8.03323, 3.9421675, 21.519663, -7.6102357, 3.9935734, 21.830496, -8.098074, 4.0979156, 22.171206, -7.9227233, 4.142306, 21.975924, -7.9388556, 4.0766134, 22.104975, -8.098074, 4.0979156, 22.171206, -8.007105, 4.2432814, 21.79742, -7.9227233, 4.142306, 21.975924, -9.771751, 3.535802, 21.75793, -9.379068, 3.8438268, 21.68758, -9.350674, 3.7584422, 21.997433, -9.771751, 3.535802, 21.75793, -9.776064, 3.537459, 21.700321, -9.379068, 3.8438268, 21.68758, -9.379068, 3.8438268, 21.68758, -9.238958, 3.8097954, 22.04487, -9.350674, 3.7584422, 21.997433, -9.379068, 3.8438268, 21.68758, -9.184797, 3.91052, 21.871664, -9.238958, 3.8097954, 22.04487, -9.184797, 3.91052, 21.871664, -9.379068, 3.8438268, 21.68758, -8.955339, 4.1180353, 21.68752, -9.184797, 3.91052, 21.871664, -8.955339, 4.1180353, 21.68752, -8.938385, 3.9436283, 22.172657, -9.184797, 3.91052, 21.871664, -8.938385, 3.9436283, 22.172657, -9.138344, 3.8554869, 22.087576, -8.938385, 3.9436283, 22.172657, -8.830858, 4.0307946, 22.063833, -8.879677, 3.9519649, 22.17815, -8.938385, 3.9436283, 22.172657, -8.955339, 4.1180353, 21.68752, -8.830858, 4.0307946, 22.063833, -8.525064, 4.0757513, 22.206758, -8.3042145, 4.1594357, 22.040773, -8.414618, 4.077264, 22.197893, -8.525064, 4.0757513, 22.206758, -8.445869, 4.2673163, 21.729216, -8.3042145, 4.1594357, 22.040773, -9.761192, 3.5089111, 21.653206, -9.379068, 3.8438268, 21.68758, -9.776064, 3.537459, 21.700321, -9.379068, 3.8438268, 21.68758, -9.761192, 3.5089111, 21.653206, -9.529911, 3.6422298, 21.627573, -9.529911, 3.6422298, 21.627573, -9.761192, 3.5089111, 21.653206, -9.567165, 3.544581, 21.576538, -9.379068, 3.8438268, 21.68758, -9.097656, 3.8193562, 21.5222, -8.955339, 4.1180353, 21.68752, -9.379068, 3.8438268, 21.68758, -9.2248955, 3.7364876, 21.514492, -9.097656, 3.8193562, 21.5222, -8.856268, 3.7445884, 21.349636, -8.445869, 4.2673163, 21.729216, -8.955339, 4.1180353, 21.68752, -8.445869, 4.2673163, 21.729216, -8.856268, 3.7445884, 21.349636, -8.63674, 3.7917051, 21.369219, -8.445869, 4.2673163, 21.729216, -8.63674, 3.7917051, 21.369219, -8.568174, 3.9699275, 21.489882, -8.232094, 4.130494, 21.637142, -8.007105, 4.2432814, 21.79742, -8.445869, 4.2673163, 21.729216, -8.007105, 4.2432814, 21.79742, -8.232094, 4.130494, 21.637142, -8.128689, 3.9327025, 21.48767, -8.007105, 4.2432814, 21.79742, -8.128689, 3.9327025, 21.48767, -8.03323, 3.9421675, 21.519663, -8.445869, 4.2673163, 21.729216, -8.830858, 4.0307946, 22.063833, -8.955339, 4.1180353, 21.68752, -8.606184, 4.161176, 21.922972, -8.830858, 4.0307946, 22.063833, -8.445869, 4.2673163, 21.729216, -8.830858, 4.0307946, 22.063833, -8.606184, 4.161176, 21.922972, -8.680071, 3.982471, 22.196703, -8.830858, 4.0307946, 22.063833, -8.680071, 3.982471, 22.196703, -8.7803135, 3.9735296, 22.187021, -8.445869, 4.2673163, 21.729216, -8.633348, 4.0487413, 22.19735, -8.606184, 4.161176, 21.922972, -8.445869, 4.2673163, 21.729216, -8.525064, 4.0757513, 22.206758, -8.633348, 4.0487413, 22.19735, -8.568174, 3.9699275, 21.489882, -8.441978, 3.8581774, 21.385015, -8.445869, 4.2673163, 21.729216, -8.568174, 3.9699275, 21.489882, -8.53607, 3.8349931, 21.376839, -8.441978, 3.8581774, 21.385015, -8.007105, 4.2432814, 21.79742, -8.3042145, 4.1594357, 22.040773, -8.445869, 4.2673163, 21.729216, -8.3042145, 4.1594357, 22.040773, -8.007105, 4.2432814, 21.79742, -8.098074, 4.0979156, 22.171206, -8.3042145, 4.1594357, 22.040773, -8.098074, 4.0979156, 22.171206, -8.254183, 4.096847, 22.18368, -8.232094, 4.130494, 21.637142, -8.441978, 3.8581774, 21.385015, -8.191664, 3.867425, 21.469576, -8.232094, 4.130494, 21.637142, -8.445869, 4.2673163, 21.729216, -8.441978, 3.8581774, 21.385015, -7.6156516, 4.0593348, 21.890636, -7.9227233, 4.142306, 21.975924, -8.007105, 4.2432814, 21.79742, -7.9227233, 4.142306, 21.975924, -7.6156516, 4.0593348, 21.890636, -7.62472, 4.0303593, 21.974613, -7.9227233, 4.142306, 21.975924, -7.62472, 4.0303593, 21.974613, -7.833011, 4.0754824, 22.059702, -9.097656, 3.8193562, 21.5222, -8.856268, 3.7445884, 21.349636, -8.955339, 4.1180353, 21.68752, -9.097656, 3.8193562, 21.5222, -9.020979, 3.7032843, 21.39327, -8.856268, 3.7445884, 21.349636, -9.2248955, 3.7364876, 21.514492, -9.123741, 3.6469016, 21.423038, -9.097656, 3.8193562, 21.5222, -9.2248955, 3.7364876, 21.514492, -9.181778, 3.6451564, 21.437378, -9.123741, 3.6469016, 21.423038, -9.2248955, 3.7364876, 21.514492, -9.379068, 3.8438268, 21.68758, -9.29739, 3.622695, 21.467472, -9.529911, 3.6422298, 21.627573, -9.29739, 3.622695, 21.467472, -9.379068, 3.8438268, 21.68758, -9.529911, 3.6422298, 21.627573, -9.471037, 3.5795534, 21.537083, -9.29739, 3.622695, 21.467472, -7.801645, 4.134115, 21.58577, -7.6006274, 4.02651, 21.917599, -7.6581864, 4.072356, 21.931242, -7.801645, 4.134115, 21.58577, -7.559606, 3.912532, 21.485746, -7.6006274, 4.02651, 21.917599, -8.072794, 3.9650502, 21.715675, -7.866752, 4.057515, 21.744825, -7.952191, 3.99135, 21.80066, -8.072794, 3.9650502, 21.715675, -7.801645, 4.134115, 21.58577, -7.866752, 4.057515, 21.744825, -8.445419, 3.1368337, 20.389019, -8.276415, 3.4964035, 20.596956, -8.461891, 3.4085104, 20.773108, -8.445419, 3.1368337, 20.389019, -8.407898, 3.1417727, 20.358862, -8.276415, 3.4964035, 20.596956, -8.276415, 3.4964035, 20.596956, -8.453417, 3.4740689, 20.868896, -8.461891, 3.4085104, 20.773108, -8.276415, 3.4964035, 20.596956, -8.327274, 3.583331, 20.814444, -8.453417, 3.4740689, 20.868896, -8.327274, 3.583331, 20.814444, -8.276415, 3.4964035, 20.596956, -8.134125, 3.821342, 20.866423, -8.327274, 3.583331, 20.814444, -8.134125, 3.821342, 20.866423, -8.4303055, 3.644507, 21.12673, -8.327274, 3.583331, 20.814444, -8.4303055, 3.644507, 21.12673, -8.445759, 3.5321927, 20.955154, -8.4303055, 3.644507, 21.12673, -8.320477, 3.7492816, 21.144423, -8.409815, 3.665008, 21.169518, -8.4303055, 3.644507, 21.12673, -8.134125, 3.821342, 20.866423, -8.320477, 3.7492816, 21.144423, -8.287462, 3.8450718, 21.426939, -8.086512, 3.9769306, 21.499489, -8.231916, 3.8731332, 21.501694, -8.287462, 3.8450718, 21.426939, -7.9577355, 4.0573144, 21.235031, -8.086512, 3.9769306, 21.499489, -8.362757, 3.127033, 20.352093, -8.276415, 3.4964035, 20.596956, -8.407898, 3.1417727, 20.358862, -8.276415, 3.4964035, 20.596956, -8.362757, 3.127033, 20.352093, -8.265045, 3.3001463, 20.48862, -8.265045, 3.3001463, 20.48862, -8.362757, 3.127033, 20.352093, -8.229216, 3.2149067, 20.450375, -8.276415, 3.4964035, 20.596956, -8.026518, 3.5625966, 20.730312, -8.134125, 3.821342, 20.866423, -8.276415, 3.4964035, 20.596956, -8.06389, 3.4651048, 20.64575, -8.026518, 3.5625966, 20.730312, -7.781936, 3.5772128, 20.836325, -7.9577355, 4.0573144, 21.235031, -8.134125, 3.821342, 20.866423, -7.9577355, 4.0573144, 21.235031, -7.781936, 3.5772128, 20.836325, -7.705567, 3.6661596, 20.99604, -7.9577355, 4.0573144, 21.235031, -7.705567, 3.6661596, 20.99604, -7.7892184, 3.8130858, 21.079828, -7.7676377, 4.0055275, 21.369812, -7.801645, 4.134115, 21.58577, -7.9577355, 4.0573144, 21.235031, -7.801645, 4.134115, 21.58577, -7.7676377, 4.0055275, 21.369812, -7.5783267, 3.8855352, 21.404331, -7.801645, 4.134115, 21.58577, -7.5783267, 3.8855352, 21.404331, -7.559606, 3.912532, 21.485746, -7.9577355, 4.0573144, 21.235031, -8.320477, 3.7492816, 21.144423, -8.134125, 3.821342, 20.866423, -8.143465, 3.9182801, 21.225508, -8.320477, 3.7492816, 21.144423, -7.9577355, 4.0573144, 21.235031, -8.320477, 3.7492816, 21.144423, -8.143465, 3.9182801, 21.225508, -8.340118, 3.7362518, 21.314922, -8.320477, 3.7492816, 21.144423, -8.340118, 3.7362518, 21.314922, -8.375259, 3.7055726, 21.241833, -7.9577355, 4.0573144, 21.235031, -8.325062, 3.7988772, 21.348167, -8.143465, 3.9182801, 21.225508, -7.9577355, 4.0573144, 21.235031, -8.287462, 3.8450718, 21.426939, -8.325062, 3.7988772, 21.348167, -7.7892184, 3.8130858, 21.079828, -7.6383195, 3.7634745, 21.137505, -7.9577355, 4.0573144, 21.235031, -7.7892184, 3.8130858, 21.079828, -7.6709933, 3.7234988, 21.069057, -7.6383195, 3.7634745, 21.137505, -7.801645, 4.134115, 21.58577, -8.086512, 3.9769306, 21.499489, -7.9577355, 4.0573144, 21.235031, -8.086512, 3.9769306, 21.499489, -7.801645, 4.134115, 21.58577, -8.072794, 3.9650502, 21.715675, -8.086512, 3.9769306, 21.499489, -8.072794, 3.9650502, 21.715675, -8.151386, 3.9267366, 21.61004, -7.7676377, 4.0055275, 21.369812, -7.6383195, 3.7634745, 21.137505, -7.588919, 3.823454, 21.350895, -7.7676377, 4.0055275, 21.369812, -7.9577355, 4.0573144, 21.235031, -7.6383195, 3.7634745, 21.137505, -7.6581864, 4.072356, 21.931242, -7.866752, 4.057515, 21.744825, -7.801645, 4.134115, 21.58577, -7.866752, 4.057515, 21.744825, -7.6581864, 4.072356, 21.931242, -7.71435, 4.039794, 21.968426, -7.866752, 4.057515, 21.744825, -7.71435, 4.039794, 21.968426, -7.87205, 4.018237, 21.856892, -8.026518, 3.5625966, 20.730312, -7.781936, 3.5772128, 20.836325, -8.134125, 3.821342, 20.866423, -8.026518, 3.5625966, 20.730312, -7.8797107, 3.5000882, 20.74282, -7.781936, 3.5772128, 20.836325, -8.06389, 3.4651048, 20.64575, -7.94037, 3.4260588, 20.685284, -8.026518, 3.5625966, 20.730312, -8.06389, 3.4651048, 20.64575, -7.975001, 3.40911, 20.652027, -7.94037, 3.4260588, 20.685284, -8.06389, 3.4651048, 20.64575, -8.276415, 3.4964035, 20.596956, -8.0436325, 3.3592296, 20.586334, -8.265045, 3.3001463, 20.48862, -8.0436325, 3.3592296, 20.586334, -8.276415, 3.4964035, 20.596956, -8.265045, 3.3001463, 20.48862, -8.163176, 3.2732167, 20.498547, -8.0436325, 3.3592296, 20.586334, -7.402509, 4.1859736, 21.63811, -7.6918817, 4.041251, 21.991617, -7.7346835, 4.0696325, 21.918596, -7.402509, 4.1859736, 21.63811, -7.1659408, 4.0452685, 21.938877, -7.6918817, 4.041251, 21.991617, -7.544909, 3.8685284, 21.406876, -7.563997, 4.036748, 21.631306, -7.6227355, 3.9156742, 21.563887, -7.544909, 3.8685284, 21.406876, -7.402509, 4.1859736, 21.63811, -7.563997, 4.036748, 21.631306, -5.9238067, 3.1665137, 20.728191, -6.2251096, 3.5616388, 20.915148, -6.4278474, 3.3525786, 20.777048, -5.9238067, 3.1665137, 20.728191, -5.8848615, 3.193083, 20.760527, -6.2251096, 3.5616388, 20.915148, -6.2251096, 3.5616388, 20.915148, -6.5504594, 3.402594, 20.803858, -6.4278474, 3.3525786, 20.777048, -6.2251096, 3.5616388, 20.915148, -6.4983582, 3.5830135, 20.909115, -6.5504594, 3.402594, 20.803858, -6.4983582, 3.5830135, 20.909115, -6.2251096, 3.5616388, 20.915148, -6.5891337, 3.903202, 21.097126, -6.4983582, 3.5830135, 20.909115, -6.5891337, 3.903202, 21.097126, -6.879663, 3.532806, 20.876286, -6.4983582, 3.5830135, 20.909115, -6.879663, 3.532806, 20.876286, -6.6607127, 3.447071, 20.828083, -6.879663, 3.532806, 20.876286, -6.9066834, 3.6857386, 20.988258, -6.9293284, 3.5507002, 20.90792, -6.879663, 3.532806, 20.876286, -6.5891337, 3.903202, 21.097126, -6.9066834, 3.6857386, 20.988258, -7.2366023, 3.7330508, 21.09622, -7.3143077, 3.9347124, 21.32243, -7.315949, 3.763792, 21.176712, -7.2366023, 3.7330508, 21.09622, -7.02702, 4.1361513, 21.366934, -7.3143077, 3.9347124, 21.32243, -5.862766, 3.1931438, 20.813963, -6.2251096, 3.5616388, 20.915148, -5.8848615, 3.193083, 20.760527, -6.2251096, 3.5616388, 20.915148, -5.862766, 3.1931438, 20.813963, -6.043155, 3.376487, 20.935175, -6.043155, 3.376487, 20.935175, -5.862766, 3.1931438, 20.813963, -5.9688907, 3.3041463, 20.98022, -6.2251096, 3.5616388, 20.915148, -6.3340783, 3.6836305, 21.23523, -6.5891337, 3.903202, 21.097126, -6.2251096, 3.5616388, 20.915148, -6.2198997, 3.5840178, 21.185366, -6.3340783, 3.6836305, 21.23523, -6.400766, 3.7538157, 21.548512, -7.02702, 4.1361513, 21.366934, -6.5891337, 3.903202, 21.097126, -7.02702, 4.1361513, 21.366934, -6.400766, 3.7538157, 21.548512, -6.588054, 3.8369021, 21.666204, -7.02702, 4.1361513, 21.366934, -6.588054, 3.8369021, 21.666204, -6.7412972, 3.9567418, 21.567703, -7.1137557, 4.110402, 21.642786, -7.402509, 4.1859736, 21.63811, -7.02702, 4.1361513, 21.366934, -7.402509, 4.1859736, 21.63811, -7.1137557, 4.110402, 21.642786, -7.0714173, 4.029825, 21.898872, -7.402509, 4.1859736, 21.63811, -7.0714173, 4.029825, 21.898872, -7.1659408, 4.0452685, 21.938877, -7.02702, 4.1361513, 21.366934, -6.9066834, 3.6857386, 20.988258, -6.5891337, 3.903202, 21.097126, -7.0096154, 3.9184318, 21.182732, -6.9066834, 3.6857386, 20.988258, -7.02702, 4.1361513, 21.366934, -6.9066834, 3.6857386, 20.988258, -7.0096154, 3.9184318, 21.182732, -7.098456, 3.6138377, 21.015465, -6.9066834, 3.6857386, 20.988258, -7.098456, 3.6138377, 21.015465, -7.014134, 3.5885832, 20.961206, -7.02702, 4.1361513, 21.366934, -7.1437945, 3.6882315, 21.038242, -7.0096154, 3.9184318, 21.182732, -7.02702, 4.1361513, 21.366934, -7.2366023, 3.7330508, 21.09622, -7.1437945, 3.6882315, 21.038242, -6.7412972, 3.9567418, 21.567703, -6.756685, 3.9355235, 21.769691, -7.02702, 4.1361513, 21.366934, -6.7412972, 3.9567418, 21.567703, -6.6761546, 3.8968792, 21.71939, -6.756685, 3.9355235, 21.769691, -7.402509, 4.1859736, 21.63811, -7.3143077, 3.9347124, 21.32243, -7.02702, 4.1361513, 21.366934, -7.3143077, 3.9347124, 21.32243, -7.402509, 4.1859736, 21.63811, -7.544909, 3.8685284, 21.406876, -7.3143077, 3.9347124, 21.32243, -7.544909, 3.8685284, 21.406876, -7.432817, 3.8261418, 21.293098, -7.1137557, 4.110402, 21.642786, -6.756685, 3.9355235, 21.769691, -7.002805, 3.9603796, 21.87517, -7.1137557, 4.110402, 21.642786, -7.02702, 4.1361513, 21.366934, -6.756685, 3.9355235, 21.769691, -7.7346835, 4.0696325, 21.918596, -7.563997, 4.036748, 21.631306, -7.402509, 4.1859736, 21.63811, -7.563997, 4.036748, 21.631306, -7.7346835, 4.0696325, 21.918596, -7.775924, 4.0044317, 21.873682, -7.563997, 4.036748, 21.631306, -7.775924, 4.0044317, 21.873682, -7.6754994, 3.960377, 21.667994, -6.3340783, 3.6836305, 21.23523, -6.400766, 3.7538157, 21.548512, -6.5891337, 3.903202, 21.097126, -6.3340783, 3.6836305, 21.23523, -6.2958436, 3.6586976, 21.422325, -6.400766, 3.7538157, 21.548512, -6.2198997, 3.5840178, 21.185366, -6.2276845, 3.568183, 21.344408, -6.3340783, 3.6836305, 21.23523, -6.2198997, 3.5840178, 21.185366, -6.1918397, 3.5477042, 21.29962, -6.2276845, 3.568183, 21.344408, -6.2198997, 3.5840178, 21.185366, -6.2251096, 3.5616388, 20.915148, -6.1187816, 3.4875863, 21.210886, -6.043155, 3.376487, 20.935175, -6.1187816, 3.4875863, 21.210886, -6.2251096, 3.5616388, 20.915148, -6.043155, 3.376487, 20.935175, -6.0228896, 3.3768027, 21.062256, -6.1187816, 3.4875863, 21.210886, -7.5309367, 4.1860266, 22.233109, -7.7731357, 4.049283, 21.837759, -7.686767, 4.0676775, 21.824697, -7.5309367, 4.1860266, 22.233109, -7.90918, 4.0913115, 22.343561, -7.7731357, 4.049283, 21.837759, -7.2945504, 3.8389473, 22.203506, -7.4850507, 4.0242515, 22.093157, -7.4099345, 3.8931296, 22.069782, -7.2945504, 3.8389473, 22.203506, -7.5309367, 4.1860266, 22.233109, -7.4850507, 4.0242515, 22.093157, -7.231361, 3.2090497, 23.990551, -7.2794967, 3.594735, 23.623615, -7.099934, 3.3586783, 23.498016, -7.231361, 3.2090497, 23.990551, -7.2722163, 3.2413416, 24.013079, -7.2794967, 3.594735, 23.623615, -7.2794967, 3.594735, 23.623615, -7.0818753, 3.401124, 23.37233, -7.099934, 3.3586783, 23.498016, -7.2794967, 3.594735, 23.623615, -7.1849923, 3.5940344, 23.37246, -7.0818753, 3.401124, 23.37233, -7.1849923, 3.5940344, 23.37246, -7.2794967, 3.594735, 23.623615, -7.3083177, 3.9218946, 23.202938, -7.1849923, 3.5940344, 23.37246, -7.3083177, 3.9218946, 23.202938, -7.0331464, 3.5110173, 23.034817, -7.1849923, 3.5940344, 23.37246, -7.0331464, 3.5110173, 23.034817, -7.0656457, 3.4388018, 23.25929, -7.0331464, 3.5110173, 23.034817, -7.121306, 3.6710267, 22.96056, -7.043958, 3.527542, 22.976107, -7.0331464, 3.5110173, 23.034817, -7.3083177, 3.9218946, 23.202938, -7.121306, 3.6710267, 22.96056, -7.113857, 3.7015529, 22.612543, -7.287684, 3.915894, 22.445786, -7.160318, 3.7328143, 22.507229, -7.113857, 3.7015529, 22.612543, -7.4040046, 4.1427026, 22.68545, -7.287684, 3.915894, 22.445786, -7.3301635, 3.2478483, 24.013186, -7.2794967, 3.594735, 23.623615, -7.2722163, 3.2413416, 24.013079, -7.2794967, 3.594735, 23.623615, -7.3301635, 3.2478483, 24.013186, -7.371898, 3.4266107, 23.792282, -7.371898, 3.4266107, 23.792282, -7.3301635, 3.2478483, 24.013186, -7.442037, 3.3642597, 23.847004, -7.2794967, 3.594735, 23.623615, -7.540323, 3.735655, 23.39579, -7.3083177, 3.9218946, 23.202938, -7.2794967, 3.594735, 23.623615, -7.5373693, 3.641142, 23.524654, -7.540323, 3.735655, 23.39579, -7.8095174, 3.8275523, 23.211908, -7.4040046, 4.1427026, 22.68545, -7.3083177, 3.9218946, 23.202938, -7.4040046, 4.1427026, 22.68545, -7.8095174, 3.8275523, 23.211908, -7.8509803, 3.9055398, 22.990408, -7.4040046, 4.1427026, 22.68545, -7.8509803, 3.9055398, 22.990408, -7.703343, 4.004422, 22.88101, -7.6422763, 4.1345253, 22.501507, -7.5309367, 4.1860266, 22.233109, -7.4040046, 4.1427026, 22.68545, -7.5309367, 4.1860266, 22.233109, -7.6422763, 4.1345253, 22.501507, -7.905112, 4.080037, 22.446768, -7.5309367, 4.1860266, 22.233109, -7.905112, 4.080037, 22.446768, -7.90918, 4.0913115, 22.343561, -7.4040046, 4.1427026, 22.68545, -7.121306, 3.6710267, 22.96056, -7.3083177, 3.9218946, 23.202938, -7.255689, 3.9115663, 22.781116, -7.121306, 3.6710267, 22.96056, -7.4040046, 4.1427026, 22.68545, -7.121306, 3.6710267, 22.96056, -7.255689, 3.9115663, 22.781116, -7.080893, 3.5860498, 22.77619, -7.121306, 3.6710267, 22.96056, -7.080893, 3.5860498, 22.77619, -7.062715, 3.563114, 22.87582, -7.4040046, 4.1427026, 22.68545, -7.0931907, 3.6592827, 22.722273, -7.255689, 3.9115663, 22.781116, -7.4040046, 4.1427026, 22.68545, -7.113857, 3.7015529, 22.612543, -7.0931907, 3.6592827, 22.722273, -7.703343, 4.004422, 22.88101, -7.8892875, 3.9995782, 22.79086, -7.4040046, 4.1427026, 22.68545, -7.703343, 4.004422, 22.88101, -7.8713326, 3.9631367, 22.88616, -7.8892875, 3.9995782, 22.79086, -7.5309367, 4.1860266, 22.233109, -7.287684, 3.915894, 22.445786, -7.4040046, 4.1427026, 22.68545, -7.287684, 3.915894, 22.445786, -7.5309367, 4.1860266, 22.233109, -7.2945504, 3.8389473, 22.203506, -7.287684, 3.915894, 22.445786, -7.2945504, 3.8389473, 22.203506, -7.2290454, 3.7958574, 22.35221, -7.6422763, 4.1345253, 22.501507, -7.8892875, 3.9995782, 22.79086, -7.8991284, 4.0135202, 22.522274, -7.6422763, 4.1345253, 22.501507, -7.4040046, 4.1427026, 22.68545, -7.8892875, 3.9995782, 22.79086, -7.686767, 4.0676775, 21.824697, -7.4850507, 4.0242515, 22.093157, -7.5309367, 4.1860266, 22.233109, -7.4850507, 4.0242515, 22.093157, -7.686767, 4.0676775, 21.824697, -7.63722, 3.9957073, 21.806574, -7.4850507, 4.0242515, 22.093157, -7.63722, 3.9957073, 21.806574, -7.487868, 3.9425092, 21.979464, -7.540323, 3.735655, 23.39579, -7.8095174, 3.8275523, 23.211908, -7.3083177, 3.9218946, 23.202938, -7.540323, 3.735655, 23.39579, -7.7316575, 3.7301946, 23.361069, -7.8095174, 3.8275523, 23.211908, -7.5373693, 3.641142, 23.524654, -7.680619, 3.6382384, 23.457644, -7.540323, 3.735655, 23.39579, -7.5373693, 3.641142, 23.524654, -7.6541924, 3.6169612, 23.508732, -7.680619, 3.6382384, 23.457644, -7.5373693, 3.641142, 23.524654, -7.2794967, 3.594735, 23.623615, -7.599995, 3.5552611, 23.612686, -7.371898, 3.4266107, 23.792282, -7.599995, 3.5552611, 23.612686, -7.2794967, 3.594735, 23.623615, -7.371898, 3.4266107, 23.792282, -7.4989257, 3.4396398, 23.762728, -7.599995, 3.5552611, 23.612686, -6.9064727, 0.8870442, 21.944698, -7.0634227, 1.9859911, 21.955528, -6.983601, 1.9958726, 21.857681, -6.9064727, 0.8870442, 21.944698, -7.0050845, 0.88108003, 22.061377, -7.0634227, 1.9859911, 21.955528, -7.007685, -0.32457638, 22.15034, -7.0050845, 0.88108003, 22.061377, -6.9064727, 0.8870442, 21.944698, -7.007685, -0.32457638, 22.15034, -7.116863, -0.30735517, 22.281223, -7.0050845, 0.88108003, 22.061377, -7.2671094, 0.85050464, 21.996153, -7.3045907, 1.9478768, 21.77239, -7.284966, 1.9531578, 21.8974, -7.2671094, 0.85050464, 21.996153, -7.288546, 0.84261394, 21.850367, -7.3045907, 1.9478768, 21.77239, -7.0425286, 0.86357975, 21.707298, -7.003896, 1.9904655, 21.73263, -7.101132, 1.9756031, 21.652607, -7.0425286, 0.86357975, 21.707298, -6.925528, 0.87903726, 21.79757, -7.003896, 1.9904655, 21.73263, -7.284966, 1.9531578, 21.8974, -7.4806666, 2.9942842, 21.815382, -7.466662, 2.9961905, 21.89844, -7.284966, 1.9531578, 21.8974, -7.3045907, 1.9478768, 21.77239, -7.4806666, 2.9942842, 21.815382, -6.983601, 1.9958726, 21.857681, -7.320312, 3.0230846, 21.937897, -7.2666173, 3.0324101, 21.872292, -6.983601, 1.9958726, 21.857681, -7.0634227, 1.9859911, 21.955528, -7.320312, 3.0230846, 21.937897, -7.2666173, 3.0324101, 21.872292, -7.320312, 3.0230846, 21.937897, -7.4912467, 3.573497, 21.949327, -7.2666173, 3.0324101, 21.872292, -7.4912467, 3.573497, 21.949327, -7.453357, 3.5873647, 21.900778, -7.0050845, 0.88108003, 22.061377, -7.1874385, 1.968081, 21.976803, -7.0634227, 1.9859911, 21.955528, -7.0050845, 0.88108003, 22.061377, -7.15249, 0.8660785, 22.087767, -7.1874385, 1.968081, 21.976803, -7.0634227, 1.9859911, 21.955528, -7.1874385, 1.968081, 21.976803, -7.40249, 3.0077667, 21.95179, -7.0634227, 1.9859911, 21.955528, -7.40249, 3.0077667, 21.95179, -7.320312, 3.0230846, 21.937897, -7.288546, 0.84261394, 21.850367, -7.2247424, 1.9581697, 21.674047, -7.3045907, 1.9478768, 21.77239, -7.288546, 0.84261394, 21.850367, -7.192162, 0.8488163, 21.734951, -7.2247424, 1.9581697, 21.674047, -7.3045907, 1.9478768, 21.77239, -7.2247424, 1.9581697, 21.674047, -7.428226, 3.0044737, 21.749603, -7.3045907, 1.9478768, 21.77239, -7.428226, 3.0044737, 21.749603, -7.4806666, 2.9942842, 21.815382, -7.101132, 1.9756031, 21.652607, -7.2801204, 3.029789, 21.78821, -7.345489, 3.018808, 21.73467, -7.101132, 1.9756031, 21.652607, -7.003896, 1.9904655, 21.73263, -7.2801204, 3.029789, 21.78821, -6.925528, 0.87903726, 21.79757, -6.983601, 1.9958726, 21.857681, -7.003896, 1.9904655, 21.73263, -6.925528, 0.87903726, 21.79757, -6.9064727, 0.8870442, 21.944698, -6.983601, 1.9958726, 21.857681, -7.003896, 1.9904655, 21.73263, -7.2666173, 3.0324101, 21.872292, -7.2801204, 3.029789, 21.78821, -7.003896, 1.9904655, 21.73263, -6.983601, 1.9958726, 21.857681, -7.2666173, 3.0324101, 21.872292, -7.192162, 0.8488163, 21.734951, -7.101132, 1.9756031, 21.652607, -7.2247424, 1.9581697, 21.674047, -7.192162, 0.8488163, 21.734951, -7.0425286, 0.86357975, 21.707298, -7.101132, 1.9756031, 21.652607, -7.3367667, -0.3452804, 21.89752, -7.0425286, 0.86357975, 21.707298, -7.192162, 0.8488163, 21.734951, -7.3367667, -0.3452804, 21.89752, -7.1676164, -0.3521583, 21.871283, -7.0425286, 0.86357975, 21.707298, -7.2247424, 1.9581697, 21.674047, -7.345489, 3.018808, 21.73467, -7.428226, 3.0044737, 21.749603, -7.2247424, 1.9581697, 21.674047, -7.101132, 1.9756031, 21.652607, -7.345489, 3.018808, 21.73467, -7.428226, 3.0044737, 21.749603, -7.345489, 3.018808, 21.73467, -7.5119376, 3.577262, 21.798561, -7.428226, 3.0044737, 21.749603, -7.5119376, 3.577262, 21.798561, -7.5716386, 3.5596325, 21.809055, -7.5982623, 3.5452437, 21.919594, -7.6945357, 3.969666, 21.982683, -7.5509553, 3.5562305, 21.959482, -7.5982623, 3.5452437, 21.919594, -7.7289567, 3.960751, 21.953426, -7.6945357, 3.969666, 21.982683, -7.4912467, 3.573497, 21.949327, -7.6261945, 4.0009108, 21.940428, -7.453357, 3.5873647, 21.900778, -7.4912467, 3.573497, 21.949327, -7.6525865, 3.9872801, 21.975618, -7.6261945, 4.0009108, 21.940428, -7.5509553, 3.5562305, 21.959482, -7.6525865, 3.9872801, 21.975618, -7.4912467, 3.573497, 21.949327, -7.5509553, 3.5562305, 21.959482, -7.6945357, 3.969666, 21.982683, -7.6525865, 3.9872801, 21.975618, -7.4642043, 3.588051, 21.838531, -7.668904, 3.9935448, 21.865906, -7.5119376, 3.577262, 21.798561, -7.4642043, 3.588051, 21.838531, -7.634957, 4.0036774, 21.895311, -7.668904, 3.9935448, 21.865906, -7.453357, 3.5873647, 21.900778, -7.634957, 4.0036774, 21.895311, -7.4642043, 3.588051, 21.838531, -7.453357, 3.5873647, 21.900778, -7.6261945, 4.0009108, 21.940428, -7.634957, 4.0036774, 21.895311, -7.5716386, 3.5596325, 21.809055, -7.737245, 3.9623003, 21.908161, -7.6092744, 3.5461726, 21.857725, -7.5716386, 3.5596325, 21.809055, -7.711328, 3.9771495, 21.873121, -7.737245, 3.9623003, 21.908161, -7.5119376, 3.577262, 21.798561, -7.711328, 3.9771495, 21.873121, -7.5716386, 3.5596325, 21.809055, -7.5119376, 3.577262, 21.798561, -7.668904, 3.9935448, 21.865906, -7.711328, 3.9771495, 21.873121, -7.2869067, -0.3004067, 22.307976, -7.2671094, 0.85050464, 21.996153, -7.15249, 0.8660785, 22.087767, -7.2869067, -0.3004067, 22.307976, -7.4190135, -0.30967426, 22.197882, -7.2671094, 0.85050464, 21.996153, -7.6092744, 3.5461726, 21.857725, -7.7289567, 3.960751, 21.953426, -7.5982623, 3.5452437, 21.919594, -7.6092744, 3.5461726, 21.857725, -7.737245, 3.9623003, 21.908161, -7.7289567, 3.960751, 21.953426, -7.15249, 0.8660785, 22.087767, -7.284966, 1.9531578, 21.8974, -7.1874385, 1.968081, 21.976803, -7.15249, 0.8660785, 22.087767, -7.2671094, 0.85050464, 21.996153, -7.284966, 1.9531578, 21.8974, -7.4190135, -0.30967426, 22.197882, -7.288546, 0.84261394, 21.850367, -7.2671094, 0.85050464, 21.996153, -7.4190135, -0.30967426, 22.197882, -7.446838, -0.32798862, 22.028917, -7.288546, 0.84261394, 21.850367, -7.1676164, -0.3521583, 21.871283, -6.925528, 0.87903726, 21.79757, -7.0425286, 0.86357975, 21.707298, -7.1676164, -0.3521583, 21.871283, -7.036158, -0.3428421, 21.981743, -6.925528, 0.87903726, 21.79757, -7.116863, -0.30735517, 22.281223, -7.15249, 0.8660785, 22.087767, -7.0050845, 0.88108003, 22.061377, -7.116863, -0.30735517, 22.281223, -7.2869067, -0.3004067, 22.307976, -7.15249, 0.8660785, 22.087767, -7.446838, -0.32798862, 22.028917, -7.192162, 0.8488163, 21.734951, -7.288546, 0.84261394, 21.850367, -7.446838, -0.32798862, 22.028917, -7.3367667, -0.3452804, 21.89752, -7.192162, 0.8488163, 21.734951, -7.036158, -0.3428421, 21.981743, -6.9064727, 0.8870442, 21.944698, -6.925528, 0.87903726, 21.79757, -7.036158, -0.3428421, 21.981743, -7.007685, -0.32457638, 22.15034, -6.9064727, 0.8870442, 21.944698, -7.1874385, 1.968081, 21.976803, -7.466662, 2.9961905, 21.89844, -7.40249, 3.0077667, 21.95179, -7.1874385, 1.968081, 21.976803, -7.284966, 1.9531578, 21.8974, -7.466662, 2.9961905, 21.89844, -7.40249, 3.0077667, 21.95179, -7.5982623, 3.5452437, 21.919594, -7.5509553, 3.5562305, 21.959482, -7.40249, 3.0077667, 21.95179, -7.466662, 2.9961905, 21.89844, -7.5982623, 3.5452437, 21.919594, -7.466662, 2.9961905, 21.89844, -7.6092744, 3.5461726, 21.857725, -7.5982623, 3.5452437, 21.919594, -7.466662, 2.9961905, 21.89844, -7.4806666, 2.9942842, 21.815382, -7.6092744, 3.5461726, 21.857725, -7.320312, 3.0230846, 21.937897, -7.5509553, 3.5562305, 21.959482, -7.4912467, 3.573497, 21.949327, -7.320312, 3.0230846, 21.937897, -7.40249, 3.0077667, 21.95179, -7.5509553, 3.5562305, 21.959482, -7.345489, 3.018808, 21.73467, -7.4642043, 3.588051, 21.838531, -7.5119376, 3.577262, 21.798561, -7.345489, 3.018808, 21.73467, -7.2801204, 3.029789, 21.78821, -7.4642043, 3.588051, 21.838531, -7.2801204, 3.029789, 21.78821, -7.453357, 3.5873647, 21.900778, -7.4642043, 3.588051, 21.838531, -7.2801204, 3.029789, 21.78821, -7.2666173, 3.0324101, 21.872292, -7.453357, 3.5873647, 21.900778, -7.4806666, 2.9942842, 21.815382, -7.5716386, 3.5596325, 21.809055, -7.6092744, 3.5461726, 21.857725, -7.4806666, 2.9942842, 21.815382, -7.428226, 3.0044737, 21.749603, -7.5716386, 3.5596325, 21.809055, -25.120148, 13.783545, 12.764626, -26.397978, 13.369994, 12.574373, -26.33375, 13.5643215, 12.432411, -25.120148, 13.783545, 12.764626, -25.263885, 12.827821, 13.423475, -26.397978, 13.369994, 12.574373, -24.933325, 13.512459, 11.685724, -25.424961, 13.642609, 12.2283325, -25.402243, 13.524235, 11.855768, -24.933325, 13.512459, 11.685724, -25.120148, 13.783545, 12.764626, -25.424961, 13.642609, 12.2283325, -20.327318, 10.662638, 12.792898, -21.313543, 11.772419, 13.055622, -21.432056, 11.691162, 12.167927, -20.327318, 10.662638, 12.792898, -20.315731, 10.639986, 12.953346, -21.313543, 11.772419, 13.055622, -21.313543, 11.772419, 13.055622, -21.73093, 11.930523, 12.043638, -21.432056, 11.691162, 12.167927, -21.313543, 11.772419, 13.055622, -21.845343, 12.171588, 12.549276, -21.73093, 11.930523, 12.043638, -21.845343, 12.171588, 12.549276, -21.313543, 11.772419, 13.055622, -22.412296, 12.812631, 13.106188, -21.845343, 12.171588, 12.549276, -22.412296, 12.812631, 13.106188, -22.532686, 12.553142, 11.708666, -21.845343, 12.171588, 12.549276, -22.532686, 12.553142, 11.708666, -21.999557, 12.142736, 11.931597, -22.532686, 12.553142, 11.708666, -22.81894, 12.8182955, 12.022795, -22.69415, 12.618034, 11.694317, -22.532686, 12.553142, 11.708666, -22.412296, 12.812631, 13.106188, -22.81894, 12.8182955, 12.022795, -23.693872, 13.206497, 11.613611, -24.30996, 13.49691, 12.078384, -24.013233, 13.277237, 11.631985, -23.693872, 13.206497, 11.613611, -23.830704, 13.556321, 12.993084, -24.30996, 13.49691, 12.078384, -20.380512, 10.551989, 13.072411, -21.313543, 11.772419, 13.055622, -20.315731, 10.639986, 12.953346, -21.313543, 11.772419, 13.055622, -20.380512, 10.551989, 13.072411, -20.98937, 11.087692, 13.168047, -20.98937, 11.087692, 13.168047, -20.380512, 10.551989, 13.072411, -20.92976, 10.772113, 13.284454, -21.313543, 11.772419, 13.055622, -22.184439, 11.839201, 13.474684, -22.412296, 12.812631, 13.106188, -21.313543, 11.772419, 13.055622, -21.854174, 11.521826, 13.480944, -22.184439, 11.839201, 13.474684, -22.953316, 11.729006, 13.905809, -23.830704, 13.556321, 12.993084, -22.412296, 12.812631, 13.106188, -23.830704, 13.556321, 12.993084, -22.953316, 11.729006, 13.905809, -23.56244, 12.014381, 13.853283, -23.830704, 13.556321, 12.993084, -23.56244, 12.014381, 13.853283, -23.671707, 12.578844, 13.562656, -24.563269, 13.266899, 13.176035, -25.120148, 13.783545, 12.764626, -23.830704, 13.556321, 12.993084, -25.120148, 13.783545, 12.764626, -24.563269, 13.266899, 13.176035, -24.997204, 12.729578, 13.513615, -25.120148, 13.783545, 12.764626, -24.997204, 12.729578, 13.513615, -25.263885, 12.827821, 13.423475, -23.830704, 13.556321, 12.993084, -22.81894, 12.8182955, 12.022795, -22.412296, 12.812631, 13.106188, -23.423197, 13.259348, 12.431152, -22.81894, 12.8182955, 12.022795, -23.830704, 13.556321, 12.993084, -22.81894, 12.8182955, 12.022795, -23.423197, 13.259348, 12.431152, -23.243961, 12.84373, 11.64538, -22.81894, 12.8182955, 12.022795, -23.243961, 12.84373, 11.64538, -22.970037, 12.747108, 11.67061, -23.830704, 13.556321, 12.993084, -23.392378, 13.061067, 11.639456, -23.423197, 13.259348, 12.431152, -23.830704, 13.556321, 12.993084, -23.693872, 13.206497, 11.613611, -23.392378, 13.061067, 11.639456, -23.671707, 12.578844, 13.562656, -24.109556, 12.314231, 13.807953, -23.830704, 13.556321, 12.993084, -23.671707, 12.578844, 13.562656, -23.848108, 12.188936, 13.830387, -24.109556, 12.314231, 13.807953, -25.120148, 13.783545, 12.764626, -24.30996, 13.49691, 12.078384, -23.830704, 13.556321, 12.993084, -24.30996, 13.49691, 12.078384, -25.120148, 13.783545, 12.764626, -24.933325, 13.512459, 11.685724, -24.30996, 13.49691, 12.078384, -24.933325, 13.512459, 11.685724, -24.482748, 13.423203, 11.660212, -24.563269, 13.266899, 13.176035, -24.109556, 12.314231, 13.807953, -24.80421, 12.541008, 13.571323, -24.563269, 13.266899, 13.176035, -23.830704, 13.556321, 12.993084, -24.109556, 12.314231, 13.807953, -26.33375, 13.5643215, 12.432411, -25.424961, 13.642609, 12.2283325, -25.120148, 13.783545, 12.764626, -25.424961, 13.642609, 12.2283325, -26.33375, 13.5643215, 12.432411, -26.324017, 13.5112915, 12.189222, -25.424961, 13.642609, 12.2283325, -26.324017, 13.5112915, 12.189222, -25.71668, 13.54311, 11.969755, -22.184439, 11.839201, 13.474684, -22.953316, 11.729006, 13.905809, -22.412296, 12.812631, 13.106188, -22.184439, 11.839201, 13.474684, -22.487688, 11.524162, 13.78611, -22.953316, 11.729006, 13.905809, -21.854174, 11.521826, 13.480944, -22.187183, 11.317971, 13.70713, -22.184439, 11.839201, 13.474684, -21.854174, 11.521826, 13.480944, -22.027325, 11.277615, 13.666721, -22.187183, 11.317971, 13.70713, -21.854174, 11.521826, 13.480944, -21.313543, 11.772419, 13.055622, -21.702065, 11.143689, 13.583382, -20.98937, 11.087692, 13.168047, -21.702065, 11.143689, 13.583382, -21.313543, 11.772419, 13.055622, -20.98937, 11.087692, 13.168047, -21.207434, 10.925812, 13.392204, -21.702065, 11.143689, 13.583382, -27.190845, 13.454124, 13.211977, -26.123392, 13.504549, 12.108877, -26.042444, 13.6264305, 12.347961, -27.190845, 13.454124, 13.211977, -27.674408, 12.802565, 12.217752, -26.123392, 13.504549, 12.108877, -26.397722, 12.685178, 13.907841, -26.517313, 13.244606, 13.225155, -26.210627, 12.959142, 13.428625, -26.397722, 12.685178, 13.907841, -27.190845, 13.454124, 13.211977, -26.517313, 13.244606, 13.225155, -30.59442, 8.298002, 15.834078, -30.123693, 9.8882065, 15.319544, -29.275402, 9.5317335, 15.74361, -30.59442, 8.298002, 15.834078, -30.741045, 8.328472, 15.732853, -30.123693, 9.8882065, 15.319544, -30.123693, 9.8882065, 15.319544, -28.95761, 9.849106, 15.67477, -29.275402, 9.5317335, 15.74361, -30.123693, 9.8882065, 15.319544, -29.313347, 10.32216, 15.361237, -28.95761, 9.849106, 15.67477, -29.313347, 10.32216, 15.361237, -30.123693, 9.8882065, 15.319544, -29.39274, 11.410282, 14.816835, -29.313347, 10.32216, 15.361237, -29.39274, 11.410282, 14.816835, -28.10266, 10.688791, 15.489471, -29.313347, 10.32216, 15.361237, -28.10266, 10.688791, 15.489471, -28.671627, 10.132956, 15.612846, -28.10266, 10.688791, 15.489471, -28.17546, 11.1942005, 15.154776, -27.974642, 10.813639, 15.397457, -28.10266, 10.688791, 15.489471, -29.39274, 11.410282, 14.816835, -28.17546, 11.1942005, 15.154776, -27.208647, 11.806034, 14.844706, -27.177315, 12.54514, 14.161594, -26.99829, 12.019685, 14.60232, -27.208647, 11.806034, 14.844706, -28.297514, 12.740184, 14.028536, -27.177315, 12.54514, 14.161594, -30.79949, 8.3112135, 15.561966, -30.123693, 9.8882065, 15.319544, -30.741045, 8.328472, 15.732853, -30.123693, 9.8882065, 15.319544, -30.79949, 8.3112135, 15.561966, -30.452688, 9.11234, 15.217451, -30.452688, 9.11234, 15.217451, -30.79949, 8.3112135, 15.561966, -30.594294, 8.811231, 15.062023, -30.123693, 9.8882065, 15.319544, -29.879786, 10.464624, 14.329517, -29.39274, 11.410282, 14.816835, -30.123693, 9.8882065, 15.319544, -30.117891, 10.010266, 14.465597, -29.879786, 10.464624, 14.329517, -29.715208, 10.829817, 13.354015, -28.297514, 12.740184, 14.028536, -29.39274, 11.410282, 14.816835, -28.297514, 12.740184, 14.028536, -29.715208, 10.829817, 13.354015, -29.23813, 11.34871, 13.010698, -28.297514, 12.740184, 14.028536, -29.23813, 11.34871, 13.010698, -28.912056, 11.883873, 13.344931, -27.949308, 12.851552, 13.156515, -27.190845, 13.454124, 13.211977, -28.297514, 12.740184, 14.028536, -27.190845, 13.454124, 13.211977, -27.949308, 12.851552, 13.156515, -27.942167, 12.621899, 12.332624, -27.190845, 13.454124, 13.211977, -27.942167, 12.621899, 12.332624, -27.674408, 12.802565, 12.217752, -28.297514, 12.740184, 14.028536, -28.17546, 11.1942005, 15.154776, -29.39274, 11.410282, 14.816835, -28.104351, 12.050874, 14.57691, -28.17546, 11.1942005, 15.154776, -28.297514, 12.740184, 14.028536, -28.17546, 11.1942005, 15.154776, -28.104351, 12.050874, 14.57691, -27.539679, 11.245704, 15.084768, -28.17546, 11.1942005, 15.154776, -27.539679, 11.245704, 15.084768, -27.758598, 11.0494, 15.242031, -28.297514, 12.740184, 14.028536, -27.44365, 11.537734, 15.013952, -28.104351, 12.050874, 14.57691, -28.297514, 12.740184, 14.028536, -27.208647, 11.806034, 14.844706, -27.44365, 11.537734, 15.013952, -28.912056, 11.883873, 13.344931, -28.817327, 11.888908, 12.70685, -28.297514, 12.740184, 14.028536, -28.912056, 11.883873, 13.344931, -29.021376, 11.656829, 12.85384, -28.817327, 11.888908, 12.70685, -27.190845, 13.454124, 13.211977, -27.177315, 12.54514, 14.161594, -28.297514, 12.740184, 14.028536, -27.177315, 12.54514, 14.161594, -27.190845, 13.454124, 13.211977, -26.397722, 12.685178, 13.907841, -27.177315, 12.54514, 14.161594, -26.397722, 12.685178, 13.907841, -26.694912, 12.386589, 14.250351, -27.949308, 12.851552, 13.156515, -28.817327, 11.888908, 12.70685, -28.11471, 12.312162, 12.404867, -27.949308, 12.851552, 13.156515, -28.297514, 12.740184, 14.028536, -28.817327, 11.888908, 12.70685, -26.042444, 13.6264305, 12.347961, -26.517313, 13.244606, 13.225155, -27.190845, 13.454124, 13.211977, -26.517313, 13.244606, 13.225155, -26.042444, 13.6264305, 12.347961, -25.841175, 13.485764, 12.483356, -26.517313, 13.244606, 13.225155, -25.841175, 13.485764, 12.483356, -26.088339, 13.183667, 13.109575, -29.879786, 10.464624, 14.329517, -29.715208, 10.829817, 13.354015, -29.39274, 11.410282, 14.816835, -29.879786, 10.464624, 14.329517, -29.939215, 10.384001, 13.731905, -29.715208, 10.829817, 13.354015, -30.117891, 10.010266, 14.465597, -30.074621, 10.006492, 13.9677925, -29.879786, 10.464624, 14.329517, -30.117891, 10.010266, 14.465597, -30.15518, 9.890993, 14.100925, -30.074621, 10.006492, 13.9677925, -30.117891, 10.010266, 14.465597, -30.123693, 9.8882065, 15.319544, -30.313383, 9.599236, 14.366161, -30.452688, 9.11234, 15.217451, -30.313383, 9.599236, 14.366161, -30.123693, 9.8882065, 15.319544, -30.452688, 9.11234, 15.217451, -30.495245, 9.115306, 14.813856, -30.313383, 9.599236, 14.366161, -27.201202, 14.111977, 12.216812, -25.942682, 13.340691, 12.239897, -25.963226, 13.52549, 12.449766, -27.201202, 14.111977, 12.216812, -27.26703, 13.264112, 11.247925, -25.942682, 13.340691, 12.239897, -27.481268, 13.527826, 13.334137, -26.931988, 13.740763, 12.7410145, -26.979942, 13.491425, 13.121708, -27.481268, 13.527826, 13.334137, -27.201202, 14.111977, 12.216812, -26.931988, 13.740763, 12.7410145, -32.707096, 11.829945, 11.838261, -31.489027, 12.834562, 11.726076, -31.396978, 12.465054, 12.665121, -32.707096, 11.829945, 11.838261, -32.720463, 11.854302, 11.658894, -31.489027, 12.834562, 11.726076, -31.489027, 12.834562, 11.726076, -31.048937, 12.614889, 12.831612, -31.396978, 12.465054, 12.665121, -31.489027, 12.834562, 11.726076, -30.883116, 12.990331, 12.325209, -31.048937, 12.614889, 12.831612, -30.883116, 12.990331, 12.325209, -31.489027, 12.834562, 11.726076, -30.172102, 13.71146, 11.822292, -30.883116, 12.990331, 12.325209, -30.172102, 13.71146, 11.822292, -30.112314, 13.00444, 13.27858, -30.883116, 12.990331, 12.325209, -30.112314, 13.00444, 13.27858, -30.735453, 12.748096, 12.981314, -30.112314, 13.00444, 13.27858, -29.77852, 13.318491, 12.969162, -29.928392, 13.031496, 13.299112, -30.112314, 13.00444, 13.27858, -30.172102, 13.71146, 11.822292, -29.77852, 13.318491, 12.969162, -28.82114, 13.425723, 13.433544, -28.131073, 13.753705, 12.945568, -28.474356, 13.438845, 13.407442, -28.82114, 13.425723, 13.433544, -28.579897, 14.188468, 12.007677, -28.131073, 13.753705, 12.945568, -32.672134, 11.781767, 11.502314, -31.489027, 12.834562, 11.726076, -32.720463, 11.854302, 11.658894, -31.489027, 12.834562, 11.726076, -32.672134, 11.781767, 11.502314, -31.952402, 12.217968, 11.469395, -31.952402, 12.217968, 11.469395, -32.672134, 11.781767, 11.502314, -32.0643, 11.928456, 11.276808, -31.489027, 12.834562, 11.726076, -30.603403, 12.827642, 11.204182, -30.172102, 13.71146, 11.822292, -31.489027, 12.834562, 11.726076, -30.9988, 12.565276, 11.150988, -30.603403, 12.827642, 11.204182, -29.840925, 12.6641445, 10.642536, -28.579897, 14.188468, 12.007677, -30.172102, 13.71146, 11.822292, -28.579897, 14.188468, 12.007677, -29.840925, 12.6641445, 10.642536, -29.154, 12.815418, 10.721668, -28.579897, 14.188468, 12.007677, -29.154, 12.815418, 10.721668, -28.948093, 13.334579, 11.159084, -27.901386, 13.802778, 11.676207, -27.201202, 14.111977, 12.216812, -28.579897, 14.188468, 12.007677, -27.201202, 14.111977, 12.216812, -27.901386, 13.802778, 11.676207, -27.566175, 13.240652, 11.143919, -27.201202, 14.111977, 12.216812, -27.566175, 13.240652, 11.143919, -27.26703, 13.264112, 11.247925, -28.579897, 14.188468, 12.007677, -29.77852, 13.318491, 12.969162, -30.172102, 13.71146, 11.822292, -29.078878, 13.783996, 12.575394, -29.77852, 13.318491, 12.969162, -28.579897, 14.188468, 12.007677, -29.77852, 13.318491, 12.969162, -29.078878, 13.783996, 12.575394, -29.3032, 13.130279, 13.369244, -29.77852, 13.318491, 12.969162, -29.3032, 13.130279, 13.369244, -29.61749, 13.100707, 13.335033, -28.579897, 14.188468, 12.007677, -29.159786, 13.339252, 13.394022, -29.078878, 13.783996, 12.575394, -28.579897, 14.188468, 12.007677, -28.82114, 13.425723, 13.433544, -29.159786, 13.339252, 13.394022, -28.948093, 13.334579, 11.159084, -28.545794, 13.027181, 10.795259, -28.579897, 14.188468, 12.007677, -28.948093, 13.334579, 11.159084, -28.840069, 12.952937, 10.761011, -28.545794, 13.027181, 10.795259, -27.201202, 14.111977, 12.216812, -28.131073, 13.753705, 12.945568, -28.579897, 14.188468, 12.007677, -28.131073, 13.753705, 12.945568, -27.201202, 14.111977, 12.216812, -27.481268, 13.527826, 13.334137, -28.131073, 13.753705, 12.945568, -27.481268, 13.527826, 13.334137, -27.971476, 13.512636, 13.371208, -27.901386, 13.802778, 11.676207, -28.545794, 13.027181, 10.795259, -27.7606, 13.039855, 11.0648365, -27.901386, 13.802778, 11.676207, -28.579897, 14.188468, 12.007677, -28.545794, 13.027181, 10.795259, -25.963226, 13.52549, 12.449766, -26.931988, 13.740763, 12.7410145, -27.201202, 14.111977, 12.216812, -26.931988, 13.740763, 12.7410145, -25.963226, 13.52549, 12.449766, -25.99063, 13.406307, 12.702139, -26.931988, 13.740763, 12.7410145, -25.99063, 13.406307, 12.702139, -26.647318, 13.508326, 12.980991, -30.603403, 12.827642, 11.204182, -29.840925, 12.6641445, 10.642536, -30.172102, 13.71146, 11.822292, -30.603403, 12.827642, 11.204182, -30.356276, 12.512424, 10.763277, -29.840925, 12.6641445, 10.642536, -30.9988, 12.565276, 11.150988, -30.676294, 12.321331, 10.836258, -30.603403, 12.827642, 11.204182, -30.9988, 12.565276, 11.150988, -30.858511, 12.308209, 10.879881, -30.676294, 12.321331, 10.836258, -30.9988, 12.565276, 11.150988, -31.489027, 12.834562, 11.726076, -31.220568, 12.222282, 10.96516, -31.952402, 12.217968, 11.469395, -31.220568, 12.222282, 10.96516, -31.489027, 12.834562, 11.726076, -31.952402, 12.217968, 11.469395, -31.764006, 12.055641, 11.166313, -31.220568, 12.222282, 10.96516, -26.549658, 13.852484, 11.521194, -25.914532, 13.414665, 12.523054, -26.09762, 13.550388, 12.580524, -26.549658, 13.852484, 11.521194, -25.778147, 13.206228, 11.136642, -25.914532, 13.414665, 12.523054, -27.393269, 13.267618, 11.867287, -26.750992, 13.556589, 11.991425, -27.016235, 13.327029, 12.142666, -27.393269, 13.267618, 11.867287, -26.549658, 13.852484, 11.521194, -26.750992, 13.556589, 11.991425, -28.51631, 11.110254, 7.4424706, -28.004425, 12.171139, 8.214411, -28.58325, 11.828327, 8.733058, -28.51631, 11.110254, 7.4424706, -28.3986, 11.137669, 7.350334, -28.004425, 12.171139, 8.214411, -28.004425, 12.171139, 8.214411, -28.560322, 12.001171, 9.0543, -28.58325, 11.828327, 8.733058, -28.004425, 12.171139, 8.214411, -28.169415, 12.366816, 8.922272, -28.560322, 12.001171, 9.0543, -28.169415, 12.366816, 8.922272, -28.004425, 12.171139, 8.214411, -27.574968, 13.101874, 9.166556, -28.169415, 12.366816, 8.922272, -27.574968, 13.101874, 9.166556, -28.497368, 12.447617, 9.9169655, -28.169415, 12.366816, 8.922272, -28.497368, 12.447617, 9.9169655, -28.539549, 12.153973, 9.343277, -28.497368, 12.447617, 9.9169655, -28.157778, 12.77416, 10.008541, -28.434235, 12.498222, 10.057671, -28.497368, 12.447617, 9.9169655, -27.574968, 13.101874, 9.166556, -28.157778, 12.77416, 10.008541, -28.060122, 12.979725, 10.923248, -27.435986, 13.376825, 11.196117, -27.887424, 13.044889, 11.166651, -28.060122, 12.979725, 10.923248, -27.034447, 13.723143, 10.398659, -27.435986, 13.376825, 11.196117, -28.256086, 11.096142, 7.324676, -28.004425, 12.171139, 8.214411, -28.3986, 11.137669, 7.350334, -28.004425, 12.171139, 8.214411, -28.256086, 11.096142, 7.324676, -27.958471, 11.59544, 7.810196, -27.958471, 11.59544, 7.810196, -28.256086, 11.096142, 7.324676, -27.841549, 11.343948, 7.662429, -28.004425, 12.171139, 8.214411, -27.223587, 12.345152, 8.655518, -27.574968, 13.101874, 9.166556, -28.004425, 12.171139, 8.214411, -27.335718, 12.067413, 8.358295, -27.223587, 12.345152, 8.655518, -26.456749, 12.367084, 8.993832, -27.034447, 13.723143, 10.398659, -27.574968, 13.101874, 9.166556, -27.034447, 13.723143, 10.398659, -26.456749, 12.367084, 8.993832, -26.222069, 12.594754, 9.523212, -27.034447, 13.723143, 10.398659, -26.222069, 12.594754, 9.523212, -26.492432, 13.021158, 9.833479, -26.435522, 13.525401, 10.803925, -26.549658, 13.852484, 11.521194, -27.034447, 13.723143, 10.398659, -26.549658, 13.852484, 11.521194, -26.435522, 13.525401, 10.803925, -25.835228, 13.148436, 10.873161, -26.549658, 13.852484, 11.521194, -25.835228, 13.148436, 10.873161, -25.778147, 13.206228, 11.136642, -27.034447, 13.723143, 10.398659, -28.157778, 12.77416, 10.008541, -27.574968, 13.101874, 9.166556, -27.610704, 13.283167, 10.320328, -28.157778, 12.77416, 10.008541, -27.034447, 13.723143, 10.398659, -28.157778, 12.77416, 10.008541, -27.610704, 13.283167, 10.320328, -28.219557, 12.675113, 10.536343, -28.157778, 12.77416, 10.008541, -28.219557, 12.675113, 10.536343, -28.328056, 12.602215, 10.297457, -27.034447, 13.723143, 10.398659, -28.175543, 12.86018, 10.661373, -27.610704, 13.283167, 10.320328, -27.034447, 13.723143, 10.398659, -28.060122, 12.979725, 10.923248, -28.175543, 12.86018, 10.661373, -26.492432, 13.021158, 9.833479, -26.016369, 12.854247, 9.998339, -27.034447, 13.723143, 10.398659, -26.492432, 13.021158, 9.833479, -26.116678, 12.750883, 9.77084, -26.016369, 12.854247, 9.998339, -26.549658, 13.852484, 11.521194, -27.435986, 13.376825, 11.196117, -27.034447, 13.723143, 10.398659, -27.435986, 13.376825, 11.196117, -26.549658, 13.852484, 11.521194, -27.393269, 13.267618, 11.867287, -27.435986, 13.376825, 11.196117, -27.393269, 13.267618, 11.867287, -27.637686, 13.179714, 11.523783, -26.435522, 13.525401, 10.803925, -26.016369, 12.854247, 9.998339, -25.865164, 12.972085, 10.685308, -26.435522, 13.525401, 10.803925, -27.034447, 13.723143, 10.398659, -26.016369, 12.854247, 9.998339, -26.09762, 13.550388, 12.580524, -26.750992, 13.556589, 11.991425, -26.549658, 13.852484, 11.521194, -26.750992, 13.556589, 11.991425, -26.09762, 13.550388, 12.580524, -26.272526, 13.433453, 12.685123, -26.750992, 13.556589, 11.991425, -26.272526, 13.433453, 12.685123, -26.766165, 13.395969, 12.328079, -27.223587, 12.345152, 8.655518, -26.456749, 12.367084, 8.993832, -27.574968, 13.101874, 9.166556, -27.223587, 12.345152, 8.655518, -26.759527, 12.152982, 8.67496, -26.456749, 12.367084, 8.993832, -27.335718, 12.067413, 8.358295, -26.946072, 11.938253, 8.469797, -27.223587, 12.345152, 8.655518, -27.335718, 12.067413, 8.358295, -27.053827, 11.894838, 8.359913, -26.946072, 11.938253, 8.469797, -27.335718, 12.067413, 8.358295, -28.004425, 12.171139, 8.214411, -27.266567, 11.75786, 8.137337, -27.958471, 11.59544, 7.810196, -27.266567, 11.75786, 8.137337, -28.004425, 12.171139, 8.214411, -27.958471, 11.59544, 7.810196, -27.63729, 11.513017, 7.833111, -27.266567, 11.75786, 8.137337, -25.299118, 14.016339, 11.705952, -26.202145, 13.431294, 12.758247, -26.33764, 13.542391, 12.539379, -25.299118, 14.016339, 11.705952, -24.55057, 13.487381, 12.600025, -26.202145, 13.431294, 12.758247, -25.729456, 13.096121, 10.875708, -25.798758, 13.544817, 11.6329155, -25.976883, 13.186634, 11.381079, -25.729456, 13.096121, 10.875708, -25.299118, 14.016339, 11.705952, -25.798758, 13.544817, 11.6329155, -20.600985, 11.212358, 8.53599, -21.567623, 12.368253, 9.249824, -22.19324, 11.752106, 8.746279, -20.600985, 11.212358, 8.53599, -20.480156, 11.286333, 8.646276, -21.567623, 12.368253, 9.249824, -21.567623, 12.368253, 9.249824, -22.58087, 11.89322, 8.845634, -22.19324, 11.752106, 8.746279, -21.567623, 12.368253, 9.249824, -22.426706, 12.42362, 9.235527, -22.58087, 11.89322, 8.845634, -22.426706, 12.42362, 9.235527, -21.567623, 12.368253, 9.249824, -22.728525, 13.355524, 9.92947, -22.426706, 12.42362, 9.235527, -22.728525, 13.355524, 9.92947, -23.621424, 12.259226, 9.112419, -22.426706, 12.42362, 9.235527, -23.621424, 12.259226, 9.112419, -22.929403, 12.018518, 8.935175, -23.621424, 12.259226, 9.112419, -23.71438, 12.69767, 9.51326, -23.778412, 12.302008, 9.216736, -23.621424, 12.259226, 9.112419, -22.728525, 13.355524, 9.92947, -23.71438, 12.69767, 9.51326, -24.753212, 12.792858, 9.863087, -25.008253, 13.342491, 10.636538, -25.004257, 12.857843, 10.124001, -24.753212, 12.792858, 9.863087, -24.116346, 13.970501, 10.84609, -25.008253, 13.342491, 10.636538, -20.411009, 11.269615, 8.813364, -21.567623, 12.368253, 9.249824, -20.480156, 11.286333, 8.646276, -21.567623, 12.368253, 9.249824, -20.411009, 11.269615, 8.813364, -20.987125, 11.792372, 9.251802, -20.987125, 11.792372, 9.251802, -20.411009, 11.269615, 8.813364, -20.750517, 11.554993, 9.368832, -21.567623, 12.368253, 9.249824, -21.917282, 12.636011, 10.289265, -22.728525, 13.355524, 9.92947, -21.567623, 12.368253, 9.249824, -21.553564, 12.347399, 10.101149, -21.917282, 12.636011, 10.289265, -22.131565, 12.746388, 11.290453, -24.116346, 13.970501, 10.84609, -22.728525, 13.355524, 9.92947, -24.116346, 13.970501, 10.84609, -22.131565, 12.746388, 11.290453, -22.724337, 12.956984, 11.684092, -24.116346, 13.970501, 10.84609, -22.724337, 12.956984, 11.684092, -23.211079, 13.356783, 11.415373, -24.388641, 13.79298, 11.697922, -25.299118, 14.016339, 11.705952, -24.116346, 13.970501, 10.84609, -25.299118, 14.016339, 11.705952, -24.388641, 13.79298, 11.697922, -24.252804, 13.45727, 12.470831, -25.299118, 14.016339, 11.705952, -24.252804, 13.45727, 12.470831, -24.55057, 13.487381, 12.600025, -24.116346, 13.970501, 10.84609, -23.71438, 12.69767, 9.51326, -22.728525, 13.355524, 9.92947, -24.050045, 13.353634, 10.197813, -23.71438, 12.69767, 9.51326, -24.116346, 13.970501, 10.84609, -23.71438, 12.69767, 9.51326, -24.050045, 13.353634, 10.197813, -24.313118, 12.454627, 9.572146, -23.71438, 12.69767, 9.51326, -24.313118, 12.454627, 9.572146, -24.046837, 12.398183, 9.39505, -24.116346, 13.970501, 10.84609, -24.459291, 12.676998, 9.6678705, -24.050045, 13.353634, 10.197813, -24.116346, 13.970501, 10.84609, -24.753212, 12.792858, 9.863087, -24.459291, 12.676998, 9.6678705, -23.211079, 13.356783, 11.415373, -23.25923, 13.221777, 12.038786, -24.116346, 13.970501, 10.84609, -23.211079, 13.356783, 11.415373, -23.004206, 13.122009, 11.869499, -23.25923, 13.221777, 12.038786, -25.299118, 14.016339, 11.705952, -25.008253, 13.342491, 10.636538, -24.116346, 13.970501, 10.84609, -25.008253, 13.342491, 10.636538, -25.299118, 14.016339, 11.705952, -25.729456, 13.096121, 10.875708, -25.008253, 13.342491, 10.636538, -25.729456, 13.096121, 10.875708, -25.374859, 13.007589, 10.507263, -24.388641, 13.79298, 11.697922, -23.25923, 13.221777, 12.038786, -24.033789, 13.251799, 12.374115, -24.388641, 13.79298, 11.697922, -24.116346, 13.970501, 10.84609, -23.25923, 13.221777, 12.038786, -26.33764, 13.542391, 12.539379, -25.798758, 13.544817, 11.6329155, -25.299118, 14.016339, 11.705952, -25.798758, 13.544817, 11.6329155, -26.33764, 13.542391, 12.539379, -26.4637, 13.351927, 12.376793, -25.798758, 13.544817, 11.6329155, -26.4637, 13.351927, 12.376793, -26.145252, 13.288563, 11.72068, -21.917282, 12.636011, 10.289265, -22.131565, 12.746388, 11.290453, -22.728525, 13.355524, 9.92947, -21.917282, 12.636011, 10.289265, -21.7968, 12.497051, 10.865448, -22.131565, 12.746388, 11.290453, -21.553564, 12.347399, 10.101149, -21.57792, 12.244032, 10.592348, -21.917282, 12.636011, 10.289265, -21.553564, 12.347399, 10.101149, -21.464146, 12.196934, 10.445953, -21.57792, 12.244032, 10.592348, -21.553564, 12.347399, 10.101149, -21.567623, 12.368253, 9.249824, -21.231346, 12.042698, 10.149359, -20.987125, 11.792372, 9.251802, -21.231346, 12.042698, 10.149359, -21.567623, 12.368253, 9.249824, -20.987125, 11.792372, 9.251802, -20.92406, 11.751565, 9.648912, -21.231346, 12.042698, 10.149359, -25.705019, 13.809881, 13.562584, -26.45702, 13.504189, 12.279745, -26.186665, 13.570251, 12.245989, -25.705019, 13.809881, 13.562584, -26.888538, 13.45844, 13.87192, -26.45702, 13.504189, 12.279745, -24.945316, 12.747828, 13.355633, -25.55226, 13.354175, 13.0715885, -25.309752, 12.956354, 12.9552, -24.945316, 12.747828, 13.355633, -25.705019, 13.809881, 13.562584, -25.55226, 13.354175, 13.0715885, -24.723381, 10.182662, 18.724218, -24.892126, 11.507984, 17.707823, -24.315966, 10.822086, 17.237934, -24.723381, 10.182662, 18.724218, -24.853382, 10.273891, 18.805033, -24.892126, 11.507984, 17.707823, -24.892126, 11.507984, 17.707823, -24.260817, 10.9978075, 16.859945, -24.315966, 10.822086, 17.237934, -24.892126, 11.507984, 17.707823, -24.594227, 11.594991, 16.92428, -24.260817, 10.9978075, 16.859945, -24.594227, 11.594991, 16.92428, -24.892126, 11.507984, 17.707823, -24.99707, 12.669626, 16.504105, -24.594227, 11.594991, 16.92428, -24.99707, 12.669626, 16.504105, -24.11179, 11.456928, 15.843534, -24.594227, 11.594991, 16.92428, -24.11179, 11.456928, 15.843534, -24.211235, 11.154295, 16.519825, -24.11179, 11.456928, 15.843534, -24.396267, 11.977171, 15.664667, -24.146303, 11.527758, 15.66567, -24.11179, 11.456928, 15.843534, -24.99707, 12.669626, 16.504105, -24.396267, 11.977171, 15.664667, -24.372864, 12.190012, 14.588343, -24.92865, 12.906826, 14.1381035, -24.519852, 12.320793, 14.269573, -24.372864, 12.190012, 14.588343, -25.306261, 13.528545, 14.961657, -24.92865, 12.906826, 14.1381035, -25.035671, 10.291328, 18.806995, -24.892126, 11.507984, 17.707823, -24.853382, 10.273891, 18.805033, -24.892126, 11.507984, 17.707823, -25.035671, 10.291328, 18.806995, -25.174652, 10.921768, 18.176992, -25.174652, 10.921768, 18.176992, -25.035671, 10.291328, 18.806995, -25.392036, 10.70524, 18.326195, -24.892126, 11.507984, 17.707823, -25.717178, 12.011866, 17.041342, -24.99707, 12.669626, 16.504105, -24.892126, 11.507984, 17.707823, -25.703766, 11.673546, 17.411934, -25.717178, 12.011866, 17.041342, -26.566265, 12.347487, 16.495499, -25.306261, 13.528545, 14.961657, -24.99707, 12.669626, 16.504105, -25.306261, 13.528545, 14.961657, -26.566265, 12.347487, 16.495499, -26.699371, 12.663515, 15.829714, -25.306261, 13.528545, 14.961657, -26.699371, 12.663515, 15.829714, -26.24021, 13.016304, 15.522837, -26.053259, 13.553265, 14.382238, -25.705019, 13.809881, 13.562584, -25.306261, 13.528545, 14.961657, -25.705019, 13.809881, 13.562584, -26.053259, 13.553265, 14.382238, -26.875654, 13.388691, 14.190426, -25.705019, 13.809881, 13.562584, -26.875654, 13.388691, 14.190426, -26.888538, 13.45844, 13.87192, -25.306261, 13.528545, 14.961657, -24.396267, 11.977171, 15.664667, -24.99707, 12.669626, 16.504105, -24.82944, 12.781982, 15.184017, -24.396267, 11.977171, 15.664667, -25.306261, 13.528545, 14.961657, -24.396267, 11.977171, 15.664667, -24.82944, 12.781982, 15.184017, -24.26432, 11.775922, 15.060766, -24.396267, 11.977171, 15.664667, -24.26432, 11.775922, 15.060766, -24.206535, 11.67166, 15.364321, -25.306261, 13.528545, 14.961657, -24.306345, 12.02211, 14.9169445, -24.82944, 12.781982, 15.184017, -25.306261, 13.528545, 14.961657, -24.372864, 12.190012, 14.588343, -24.306345, 12.02211, 14.9169445, -26.24021, 13.016304, 15.522837, -26.82347, 13.022417, 15.237913, -25.306261, 13.528545, 14.961657, -26.24021, 13.016304, 15.522837, -26.765692, 12.877438, 15.523392, -26.82347, 13.022417, 15.237913, -25.705019, 13.809881, 13.562584, -24.92865, 12.906826, 14.1381035, -25.306261, 13.528545, 14.961657, -24.92865, 12.906826, 14.1381035, -25.705019, 13.809881, 13.562584, -24.945316, 12.747828, 13.355633, -24.92865, 12.906826, 14.1381035, -24.945316, 12.747828, 13.355633, -24.738127, 12.5664425, 13.806084, -26.053259, 13.553265, 14.382238, -26.82347, 13.022417, 15.237913, -26.853886, 13.155892, 14.403858, -26.053259, 13.553265, 14.382238, -25.306261, 13.528545, 14.961657, -26.82347, 13.022417, 15.237913, -26.186665, 13.570251, 12.245989, -25.55226, 13.354175, 13.0715885, -25.705019, 13.809881, 13.562584, -25.55226, 13.354175, 13.0715885, -26.186665, 13.570251, 12.245989, -26.027418, 13.354084, 12.165661, -25.55226, 13.354175, 13.0715885, -26.027418, 13.354084, 12.165661, -25.556536, 13.13711, 12.689047, -25.717178, 12.011866, 17.041342, -26.566265, 12.347487, 16.495499, -24.99707, 12.669626, 16.504105, -25.717178, 12.011866, 17.041342, -26.317577, 11.997127, 16.929232, -26.566265, 12.347487, 16.495499, -25.703766, 11.673546, 17.411934, -26.153154, 11.680018, 17.200329, -25.717178, 12.011866, 17.041342, -25.703766, 11.673546, 17.411934, -26.069336, 11.597685, 17.352945, -26.153154, 11.680018, 17.200329, -25.703766, 11.673546, 17.411934, -24.892126, 11.507984, 17.707823, -25.896534, 11.372709, 17.657299, -25.174652, 10.921768, 18.176992, -25.896534, 11.372709, 17.657299, -24.892126, 11.507984, 17.707823, -25.174652, 10.921768, 18.176992, -25.57406, 10.966168, 18.087864, -25.896534, 11.372709, 17.657299, -23.578579, 3.6379063, 11.557745, -24.12619, 7.057568, 11.959915, -23.8756, 7.125276, 11.658489, -23.578579, 3.6379063, 11.557745, -23.888453, 3.5751674, 11.919102, -24.12619, 7.057568, 11.959915, -23.836985, -0.21907139, 11.791069, -23.888453, 3.5751674, 11.919102, -23.578579, 3.6379063, 11.557745, -23.836985, -0.21907139, 11.791069, -24.181253, -0.21472502, 12.204487, -23.888453, 3.5751674, 11.919102, -24.709448, 3.4888213, 11.70261, -24.880796, 6.9884076, 11.3729, -24.819984, 6.963768, 11.765211, -24.709448, 3.4888213, 11.70261, -24.77573, 3.5122192, 11.244535, -24.880796, 6.9884076, 11.3729, -24.003609, 3.6379066, 10.807255, -23.93851, 7.1495028, 11.266003, -24.242756, 7.125276, 11.010187, -24.003609, 3.6379066, 10.807255, -23.637373, 3.6615102, 11.095457, -23.93851, 7.1495028, 11.266003, -24.819984, 6.963768, 11.765211, -25.485994, 10.232269, 11.85763, -25.442476, 10.210943, 12.117752, -24.819984, 6.963768, 11.765211, -24.880796, 6.9884076, 11.3729, -25.485994, 10.232269, 11.85763, -23.8756, 7.125276, 11.658489, -24.984426, 10.2888, 12.251429, -24.815989, 10.342636, 12.050236, -23.8756, 7.125276, 11.658489, -24.12619, 7.057568, 11.959915, -24.984426, 10.2888, 12.251429, -24.815989, 10.342636, 12.050236, -24.984426, 10.2888, 12.251429, -25.548643, 11.995004, 12.470713, -24.815989, 10.342636, 12.050236, -25.548643, 11.995004, 12.470713, -25.430141, 12.056503, 12.32415, -23.888453, 3.5751674, 11.919102, -24.514824, 6.9884076, 12.019112, -24.12619, 7.057568, 11.959915, -23.888453, 3.5751674, 11.919102, -24.350702, 3.512219, 11.995026, -24.514824, 6.9884076, 12.019112, -24.12619, 7.057568, 11.959915, -24.514824, 6.9884076, 12.019112, -25.241776, 10.232269, 12.288855, -24.12619, 7.057568, 11.959915, -25.241776, 10.232269, 12.288855, -24.984426, 10.2888, 12.251429, -24.77573, 3.5122192, 11.244535, -24.63014, 7.057568, 11.070068, -24.880796, 6.9884076, 11.3729, -24.77573, 3.5122192, 11.244535, -24.472868, 3.5751677, 10.8871765, -24.63014, 7.057568, 11.070068, -24.880796, 6.9884076, 11.3729, -24.63014, 7.057568, 11.070068, -25.321539, 10.2888, 11.656172, -24.880796, 6.9884076, 11.3729, -25.321539, 10.2888, 11.656172, -25.485994, 10.232269, 11.85763, -24.242756, 7.125276, 11.010187, -24.857891, 10.362101, 11.78668, -25.062378, 10.342636, 11.615177, -24.242756, 7.125276, 11.010187, -23.93851, 7.1495028, 11.266003, -24.857891, 10.362101, 11.78668, -23.637373, 3.6615102, 11.095457, -23.8756, 7.125276, 11.658489, -23.93851, 7.1495028, 11.266003, -23.637373, 3.6615102, 11.095457, -23.578579, 3.6379063, 11.557745, -23.8756, 7.125276, 11.658489, -23.93851, 7.1495028, 11.266003, -24.815989, 10.342636, 12.050236, -24.857891, 10.362101, 11.78668, -23.93851, 7.1495028, 11.266003, -23.8756, 7.125276, 11.658489, -24.815989, 10.342636, 12.050236, -24.472868, 3.5751677, 10.8871765, -24.242756, 7.125276, 11.010187, -24.63014, 7.057568, 11.070068, -24.472868, 3.5751677, 10.8871765, -24.003609, 3.6379066, 10.807255, -24.242756, 7.125276, 11.010187, -24.868216, -0.21472502, 10.9914875, -24.003609, 3.6379066, 10.807255, -24.472868, 3.5751677, 10.8871765, -24.868216, -0.21472502, 10.9914875, -24.336596, -0.21907139, 10.908884, -24.003609, 3.6379066, 10.807255, -24.63014, 7.057568, 11.070068, -25.062378, 10.342636, 11.615177, -25.321539, 10.2888, 11.656172, -24.63014, 7.057568, 11.070068, -24.242756, 7.125276, 11.010187, -25.062378, 10.342636, 11.615177, -25.321539, 10.2888, 11.656172, -25.062378, 10.342636, 11.615177, -25.613142, 12.056503, 12.001019, -25.321539, 10.2888, 11.656172, -25.613142, 12.056503, 12.001019, -25.79978, 11.995004, 12.027269, -25.883152, 11.911559, 12.367321, -26.206875, 13.210678, 12.70623, -25.735323, 11.93475, 12.496033, -25.883152, 11.911559, 12.367321, -26.31439, 13.191008, 12.611546, -26.206875, 13.210678, 12.70623, -25.548643, 11.995004, 12.470713, -25.993643, 13.325804, 12.585468, -25.430141, 12.056503, 12.32415, -25.548643, 11.995004, 12.470713, -26.075993, 13.270106, 12.690508, -25.993643, 13.325804, 12.585468, -25.735323, 11.93475, 12.496033, -26.075993, 13.270106, 12.690508, -25.548643, 11.995004, 12.470713, -25.735323, 11.93475, 12.496033, -26.206875, 13.210678, 12.70623, -26.075993, 13.270106, 12.690508, -25.463963, 12.079072, 12.129919, -26.127062, 13.325804, 12.349884, -25.613142, 12.056503, 12.001019, -25.463963, 12.079072, 12.129919, -26.021097, 13.349201, 12.445444, -26.127062, 13.325804, 12.349884, -25.430141, 12.056503, 12.32415, -26.021097, 13.349201, 12.445444, -25.463963, 12.079072, 12.129919, -25.430141, 12.056503, 12.32415, -25.993643, 13.325804, 12.585468, -26.021097, 13.349201, 12.445444, -25.79978, 11.995004, 12.027269, -26.340294, 13.210678, 12.470644, -25.917505, 11.93475, 12.174345, -25.79978, 11.995004, 12.027269, -26.259499, 13.270106, 12.366484, -26.340294, 13.210678, 12.470644, -25.613142, 12.056503, 12.001019, -26.259499, 13.270106, 12.366484, -25.79978, 11.995004, 12.027269, -25.613142, 12.056503, 12.001019, -26.127062, 13.325804, 12.349884, -26.259499, 13.270106, 12.366484, -24.715683, -0.21037531, 12.288706, -24.709448, 3.4888213, 11.70261, -24.350702, 3.512219, 11.995026, -24.715683, -0.21037531, 12.288706, -25.129576, -0.2087202, 11.940542, -24.709448, 3.4888213, 11.70261, -25.917505, 11.93475, 12.174345, -26.31439, 13.191008, 12.611546, -25.883152, 11.911559, 12.367321, -25.917505, 11.93475, 12.174345, -26.340294, 13.210678, 12.470644, -26.31439, 13.191008, 12.611546, -24.350702, 3.512219, 11.995026, -24.819984, 6.963768, 11.765211, -24.514824, 6.9884076, 12.019112, -24.350702, 3.512219, 11.995026, -24.709448, 3.4888213, 11.70261, -24.819984, 6.963768, 11.765211, -25.129576, -0.2087202, 11.940542, -24.77573, 3.5122192, 11.244535, -24.709448, 3.4888213, 11.70261, -25.129576, -0.2087202, 11.940542, -25.215294, -0.21037531, 11.406523, -24.77573, 3.5122192, 11.244535, -24.336596, -0.21907139, 10.908884, -23.637373, 3.6615102, 11.095457, -24.003609, 3.6379066, 10.807255, -24.336596, -0.21907139, 10.908884, -23.924746, -0.2207303, 11.258205, -23.637373, 3.6615102, 11.095457, -24.181253, -0.21472502, 12.204487, -24.350702, 3.512219, 11.995026, -23.888453, 3.5751674, 11.919102, -24.181253, -0.21472502, 12.204487, -24.715683, -0.21037531, 12.288706, -24.350702, 3.512219, 11.995026, -25.215294, -0.21037531, 11.406523, -24.472868, 3.5751677, 10.8871765, -24.77573, 3.5122192, 11.244535, -25.215294, -0.21037531, 11.406523, -24.868216, -0.21472502, 10.9914875, -24.472868, 3.5751677, 10.8871765, -23.924746, -0.2207303, 11.258205, -23.578579, 3.6379063, 11.557745, -23.637373, 3.6615102, 11.095457, -23.924746, -0.2207303, 11.258205, -23.836985, -0.21907139, 11.791069, -23.578579, 3.6379063, 11.557745, -24.514824, 6.9884076, 12.019112, -25.442476, 10.210943, 12.117752, -25.241776, 10.232269, 12.288855, -24.514824, 6.9884076, 12.019112, -24.819984, 6.963768, 11.765211, -25.442476, 10.210943, 12.117752, -25.241776, 10.232269, 12.288855, -25.883152, 11.911559, 12.367321, -25.735323, 11.93475, 12.496033, -25.241776, 10.232269, 12.288855, -25.442476, 10.210943, 12.117752, -25.883152, 11.911559, 12.367321, -25.442476, 10.210943, 12.117752, -25.917505, 11.93475, 12.174345, -25.883152, 11.911559, 12.367321, -25.442476, 10.210943, 12.117752, -25.485994, 10.232269, 11.85763, -25.917505, 11.93475, 12.174345, -24.984426, 10.2888, 12.251429, -25.735323, 11.93475, 12.496033, -25.548643, 11.995004, 12.470713, -24.984426, 10.2888, 12.251429, -25.241776, 10.232269, 12.288855, -25.735323, 11.93475, 12.496033, -25.062378, 10.342636, 11.615177, -25.463963, 12.079072, 12.129919, -25.613142, 12.056503, 12.001019, -25.062378, 10.342636, 11.615177, -24.857891, 10.362101, 11.78668, -25.463963, 12.079072, 12.129919, -24.857891, 10.362101, 11.78668, -25.430141, 12.056503, 12.32415, -25.463963, 12.079072, 12.129919, -24.857891, 10.362101, 11.78668, -24.815989, 10.342636, 12.050236, -25.430141, 12.056503, 12.32415, -25.485994, 10.232269, 11.85763, -25.79978, 11.995004, 12.027269, -25.917505, 11.93475, 12.174345, -25.485994, 10.232269, 11.85763, -25.321539, 10.2888, 11.656172, -25.79978, 11.995004, 12.027269, 14.960796, 7.3177958, 10.284792, 14.197514, 7.0888658, 10.165964, 14.230383, 7.219601, 10.105017, 14.960796, 7.3177958, 10.284792, 14.899889, 6.6811314, 10.556076, 14.197514, 7.0888658, 10.165964, 15.035656, 7.2923393, 9.619492, 14.762205, 7.297971, 9.966335, 14.763325, 7.2744055, 9.734959, 15.035656, 7.2923393, 9.619492, 14.960796, 7.3177958, 10.284792, 14.762205, 7.297971, 9.966335, 17.810453, 5.5428567, 9.76613, 17.232166, 6.147483, 10.085447, 17.132032, 6.2065306, 9.564142, 17.810453, 5.5428567, 9.76613, 17.822802, 5.5103865, 9.856148, 17.232166, 6.147483, 10.085447, 17.232166, 6.147483, 10.085447, 16.95009, 6.3580484, 9.530783, 17.132032, 6.2065306, 9.564142, 17.232166, 6.147483, 10.085447, 16.89884, 6.4360313, 9.857285, 16.95009, 6.3580484, 9.530783, 16.89884, 6.4360313, 9.857285, 17.232166, 6.147483, 10.085447, 16.58012, 6.736306, 10.276844, 16.89884, 6.4360313, 9.857285, 16.58012, 6.736306, 10.276844, 16.462008, 6.7533646, 9.4380245, 16.89884, 6.4360313, 9.857285, 16.462008, 6.7533646, 9.4380245, 16.786558, 6.492572, 9.500252, 16.462008, 6.7533646, 9.4380245, 16.302326, 6.86697, 9.66189, 16.365639, 6.7913795, 9.442841, 16.462008, 6.7533646, 9.4380245, 16.58012, 6.736306, 10.276844, 16.302326, 6.86697, 9.66189, 15.768839, 7.134306, 9.500018, 15.418615, 7.241414, 9.825178, 15.579935, 7.1703434, 9.529699, 15.768839, 7.134306, 9.500018, 15.7336235, 7.169642, 10.347719, 15.418615, 7.241414, 9.825178, 17.788603, 5.4442396, 9.916714, 17.232166, 6.147483, 10.085447, 17.822802, 5.5103865, 9.856148, 17.232166, 6.147483, 10.085447, 17.788603, 5.4442396, 9.916714, 17.429657, 5.7386765, 10.057089, 17.429657, 5.7386765, 10.057089, 17.788603, 5.4442396, 9.916714, 17.469614, 5.541645, 10.084452, 17.232166, 6.147483, 10.085447, 16.729776, 6.127803, 10.365282, 16.58012, 6.736306, 10.276844, 17.232166, 6.147483, 10.085447, 16.926506, 5.9454803, 10.319639, 16.729776, 6.127803, 10.365282, 16.288668, 6.0046787, 10.627327, 15.7336235, 7.169642, 10.347719, 16.58012, 6.736306, 10.276844, 15.7336235, 7.169642, 10.347719, 16.288668, 6.0046787, 10.627327, 15.925083, 6.171483, 10.651344, 15.7336235, 7.169642, 10.347719, 15.925083, 6.171483, 10.651344, 15.8492565, 6.533848, 10.554647, 15.306034, 6.9726505, 10.442774, 14.960796, 7.3177958, 10.284792, 15.7336235, 7.169642, 10.347719, 14.960796, 7.3177958, 10.284792, 15.306034, 6.9726505, 10.442774, 15.061283, 6.615505, 10.587776, 14.960796, 7.3177958, 10.284792, 15.061283, 6.615505, 10.587776, 14.899889, 6.6811314, 10.556076, 15.7336235, 7.169642, 10.347719, 16.302326, 6.86697, 9.66189, 16.58012, 6.736306, 10.276844, 15.95689, 7.068595, 9.972179, 16.302326, 6.86697, 9.66189, 15.7336235, 7.169642, 10.347719, 16.302326, 6.86697, 9.66189, 15.95689, 7.068595, 9.972179, 16.037476, 6.9235826, 9.459768, 16.302326, 6.86697, 9.66189, 16.037476, 6.9235826, 9.459768, 16.200966, 6.8668146, 9.453747, 15.7336235, 7.169642, 10.347719, 15.948803, 7.0493326, 9.487534, 15.95689, 7.068595, 9.972179, 15.7336235, 7.169642, 10.347719, 15.768839, 7.134306, 9.500018, 15.948803, 7.0493326, 9.487534, 15.8492565, 6.533848, 10.554647, 15.598484, 6.34639, 10.67927, 15.7336235, 7.169642, 10.347719, 15.8492565, 6.533848, 10.554647, 15.754543, 6.2731757, 10.668556, 15.598484, 6.34639, 10.67927, 14.960796, 7.3177958, 10.284792, 15.418615, 7.241414, 9.825178, 15.7336235, 7.169642, 10.347719, 15.418615, 7.241414, 9.825178, 14.960796, 7.3177958, 10.284792, 15.035656, 7.2923393, 9.619492, 15.418615, 7.241414, 9.825178, 15.035656, 7.2923393, 9.619492, 15.302166, 7.2475796, 9.57913, 15.306034, 6.9726505, 10.442774, 15.598484, 6.34639, 10.67927, 15.17808, 6.500619, 10.592104, 15.306034, 6.9726505, 10.442774, 15.7336235, 7.169642, 10.347719, 15.598484, 6.34639, 10.67927, 14.230383, 7.219601, 10.105017, 14.762205, 7.297971, 9.966335, 14.960796, 7.3177958, 10.284792, 14.762205, 7.297971, 9.966335, 14.230383, 7.219601, 10.105017, 14.228041, 7.218266, 9.957092, 14.762205, 7.297971, 9.966335, 14.228041, 7.218266, 9.957092, 14.580687, 7.2687683, 9.813696, 16.729776, 6.127803, 10.365282, 16.288668, 6.0046787, 10.627327, 16.58012, 6.736306, 10.276844, 16.729776, 6.127803, 10.365282, 16.561163, 5.9042377, 10.517782, 16.288668, 6.0046787, 10.627327, 16.926506, 5.9454803, 10.319639, 16.737123, 5.796604, 10.437109, 16.729776, 6.127803, 10.365282, 16.926506, 5.9454803, 10.319639, 16.830635, 5.779464, 10.403534, 16.737123, 5.796604, 10.437109, 16.926506, 5.9454803, 10.319639, 17.232166, 6.147483, 10.085447, 17.020973, 5.7145977, 10.328281, 17.429657, 5.7386765, 10.057089, 17.020973, 5.7145977, 10.328281, 17.232166, 6.147483, 10.085447, 17.429657, 5.7386765, 10.057089, 17.308277, 5.615484, 10.174715, 17.020973, 5.7145977, 10.328281, 13.748751, 7.053542, 10.572222, 14.344303, 7.2258663, 9.903076, 14.400131, 7.268545, 10.054003, 13.748751, 7.053542, 10.572222, 13.42976, 6.790598, 9.931854, 14.344303, 7.2258663, 9.903076, 14.244236, 6.5294213, 10.857023, 14.149033, 6.936182, 10.532454, 14.338385, 6.748352, 10.605932, 14.244236, 6.5294213, 10.857023, 13.748751, 7.053542, 10.572222, 14.149033, 6.936182, 10.532454, 11.830196, 3.7078786, 11.580435, 12.08853, 4.698938, 11.459175, 12.606657, 4.4480114, 11.634403, 11.830196, 3.7078786, 11.580435, 11.739759, 3.7365186, 11.530159, 12.08853, 4.698938, 11.459175, 12.08853, 4.698938, 11.459175, 12.792095, 4.643725, 11.622538, 12.606657, 4.4480114, 11.634403, 12.08853, 4.698938, 11.459175, 12.569534, 4.9534965, 11.509512, 12.792095, 4.643725, 11.622538, 12.569534, 4.9534965, 11.509512, 12.08853, 4.698938, 11.459175, 12.50172, 5.6512947, 11.328012, 12.569534, 4.9534965, 11.509512, 12.50172, 5.6512947, 11.328012, 13.291006, 5.162043, 11.5888405, 12.569534, 4.9534965, 11.509512, 13.291006, 5.162043, 11.5888405, 12.958977, 4.8188252, 11.61166, 13.291006, 5.162043, 11.5888405, 13.2354355, 5.49573, 11.458206, 13.363539, 5.246913, 11.546379, 13.291006, 5.162043, 11.5888405, 12.50172, 5.6512947, 11.328012, 13.2354355, 5.49573, 11.458206, 13.796944, 5.897662, 11.320793, 13.790836, 6.4103017, 11.012831, 13.913025, 6.053091, 11.199114, 13.796944, 5.897662, 11.320793, 13.121664, 6.529729, 10.9958515, 13.790836, 6.4103017, 11.012831, 11.699358, 3.746626, 11.430775, 12.08853, 4.698938, 11.459175, 11.739759, 3.7365186, 11.530159, 12.08853, 4.698938, 11.459175, 11.699358, 3.746626, 11.430775, 11.891642, 4.2572117, 11.316582, 11.891642, 4.2572117, 11.316582, 11.699358, 3.746626, 11.430775, 11.803057, 4.0996614, 11.194469, 12.08853, 4.698938, 11.459175, 12.198441, 5.1560144, 10.946365, 12.50172, 5.6512947, 11.328012, 12.08853, 4.698938, 11.459175, 12.062822, 4.8732367, 10.978052, 12.198441, 5.1560144, 10.946365, 12.262251, 5.4878073, 10.418972, 13.121664, 6.529729, 10.9958515, 12.50172, 5.6512947, 11.328012, 13.121664, 6.529729, 10.9958515, 12.262251, 5.4878073, 10.418972, 12.532429, 5.8353195, 10.266994, 13.121664, 6.529729, 10.9958515, 12.532429, 5.8353195, 10.266994, 12.735952, 6.1089916, 10.515257, 13.298405, 6.7030754, 10.491749, 13.748751, 7.053542, 10.572222, 13.121664, 6.529729, 10.9958515, 13.748751, 7.053542, 10.572222, 13.298405, 6.7030754, 10.491749, 13.275257, 6.6692533, 9.985384, 13.748751, 7.053542, 10.572222, 13.275257, 6.6692533, 9.985384, 13.42976, 6.790598, 9.931854, 13.121664, 6.529729, 10.9958515, 13.2354355, 5.49573, 11.458206, 12.50172, 5.6512947, 11.328012, 13.256226, 6.064356, 11.224297, 13.2354355, 5.49573, 11.458206, 13.121664, 6.529729, 10.9958515, 13.2354355, 5.49573, 11.458206, 13.256226, 6.064356, 11.224297, 13.609962, 5.5398574, 11.403032, 13.2354355, 5.49573, 11.458206, 13.609962, 5.5398574, 11.403032, 13.485888, 5.4047327, 11.477678, 13.121664, 6.529729, 10.9958515, 13.663889, 5.719082, 11.394192, 13.256226, 6.064356, 11.224297, 13.121664, 6.529729, 10.9958515, 13.796944, 5.897662, 11.320793, 13.663889, 5.719082, 11.394192, 12.735952, 6.1089916, 10.515257, 12.770527, 6.18994, 10.142353, 13.121664, 6.529729, 10.9958515, 12.735952, 6.1089916, 10.515257, 12.654997, 6.03539, 10.206213, 12.770527, 6.18994, 10.142353, 13.748751, 7.053542, 10.572222, 13.790836, 6.4103017, 11.012831, 13.121664, 6.529729, 10.9958515, 13.790836, 6.4103017, 11.012831, 13.748751, 7.053542, 10.572222, 14.244236, 6.5294213, 10.857023, 13.790836, 6.4103017, 11.012831, 14.244236, 6.5294213, 10.857023, 14.080233, 6.311716, 11.029364, 13.298405, 6.7030754, 10.491749, 12.770527, 6.18994, 10.142353, 13.176046, 6.4788733, 9.995405, 13.298405, 6.7030754, 10.491749, 13.121664, 6.529729, 10.9958515, 12.770527, 6.18994, 10.142353, 14.400131, 7.268545, 10.054003, 14.149033, 6.936182, 10.532454, 13.748751, 7.053542, 10.572222, 14.149033, 6.936182, 10.532454, 14.400131, 7.268545, 10.054003, 14.524361, 7.1721907, 10.108967, 14.149033, 6.936182, 10.532454, 14.524361, 7.1721907, 10.108967, 14.399626, 6.918585, 10.443947, 12.198441, 5.1560144, 10.946365, 12.262251, 5.4878073, 10.418972, 12.50172, 5.6512947, 11.328012, 12.198441, 5.1560144, 10.946365, 12.143154, 5.1808786, 10.591608, 12.262251, 5.4878073, 10.418972, 12.062822, 4.8732367, 10.978052, 12.071648, 4.931636, 10.687195, 12.198441, 5.1560144, 10.946365, 12.062822, 4.8732367, 10.978052, 12.028627, 4.8476563, 10.753109, 12.071648, 4.931636, 10.687195, 12.062822, 4.8732367, 10.978052, 12.08853, 4.698938, 11.459175, 11.94441, 4.6445174, 10.876879, 11.891642, 4.2572117, 11.316582, 11.94441, 4.6445174, 10.876879, 12.08853, 4.698938, 11.459175, 11.891642, 4.2572117, 11.316582, 11.852747, 4.307365, 11.084038, 11.94441, 4.6445174, 10.876879, 13.7075405, 7.556304, 10.0746155, 14.456242, 7.1163726, 9.9533615, 14.450766, 7.1982546, 10.098274, 13.7075405, 7.556304, 10.0746155, 13.637535, 7.179911, 9.4115, 14.456242, 7.1163726, 9.9533615, 13.580511, 7.079011, 10.661566, 13.885704, 7.279489, 10.325115, 13.870678, 7.088043, 10.517448, 13.580511, 7.079011, 10.661566, 13.7075405, 7.556304, 10.0746155, 13.885704, 7.279489, 10.325115, 10.434713, 6.2257376, 9.758102, 11.151068, 6.834375, 9.774982, 11.238207, 6.5067883, 10.272303, 10.434713, 6.2257376, 9.758102, 10.420666, 6.2614727, 9.657367, 11.151068, 6.834375, 9.774982, 11.151068, 6.834375, 9.774982, 11.449902, 6.5769014, 10.375746, 11.238207, 6.5067883, 10.272303, 11.151068, 6.834375, 9.774982, 11.530296, 6.857931, 10.121874, 11.449902, 6.5769014, 10.375746, 11.530296, 6.857931, 10.121874, 11.151068, 6.834375, 9.774982, 11.933365, 7.3444357, 9.894124, 11.530296, 6.857931, 10.121874, 11.933365, 7.3444357, 9.894124, 12.01959, 6.757763, 10.651842, 11.530296, 6.857931, 10.121874, 12.01959, 6.757763, 10.651842, 11.640572, 6.6390653, 10.468557, 12.01959, 6.757763, 10.651842, 12.206385, 6.9807854, 10.499392, 12.129288, 6.772664, 10.661032, 12.01959, 6.757763, 10.651842, 11.933365, 7.3444357, 9.894124, 12.206385, 6.9807854, 10.499392, 12.789576, 6.995577, 10.750685, 13.181564, 7.251497, 10.484621, 12.994299, 7.0094805, 10.72579, 12.789576, 6.995577, 10.750685, 12.882765, 7.613677, 10.007544, 13.181564, 7.251497, 10.484621, 10.444181, 6.238669, 9.556094, 11.151068, 6.834375, 9.774982, 10.420666, 6.2614727, 9.657367, 11.151068, 6.834375, 9.774982, 10.444181, 6.238669, 9.556094, 10.868927, 6.502743, 9.566353, 10.868927, 6.502743, 9.566353, 10.444181, 6.238669, 9.556094, 10.796675, 6.356696, 9.423105, 11.151068, 6.834375, 9.774982, 11.658583, 6.90143, 9.442226, 11.933365, 7.3444357, 9.894124, 11.151068, 6.834375, 9.774982, 11.422882, 6.7517605, 9.392457, 11.658583, 6.90143, 9.442226, 12.092066, 6.8811474, 9.071436, 12.882765, 7.613677, 10.007544, 11.933365, 7.3444357, 9.894124, 12.882765, 7.613677, 10.007544, 12.092066, 6.8811474, 9.071436, 12.501753, 6.965708, 9.113264, 12.882765, 7.613677, 10.007544, 12.501753, 6.965708, 9.113264, 12.637543, 7.2165165, 9.423414, 13.274715, 7.4356117, 9.746176, 13.7075405, 7.556304, 10.0746155, 12.882765, 7.613677, 10.007544, 13.7075405, 7.556304, 10.0746155, 13.274715, 7.4356117, 9.746176, 13.45668, 7.17616, 9.358056, 13.7075405, 7.556304, 10.0746155, 13.45668, 7.17616, 9.358056, 13.637535, 7.179911, 9.4115, 12.882765, 7.613677, 10.007544, 12.206385, 6.9807854, 10.499392, 11.933365, 7.3444357, 9.894124, 12.606947, 7.305357, 10.3043785, 12.206385, 6.9807854, 10.499392, 12.882765, 7.613677, 10.007544, 12.206385, 6.9807854, 10.499392, 12.606947, 7.305357, 10.3043785, 12.502178, 6.827238, 10.693289, 12.206385, 6.9807854, 10.499392, 12.502178, 6.827238, 10.693289, 12.314716, 6.8113565, 10.680117, 12.882765, 7.613677, 10.007544, 12.587612, 6.947036, 10.728325, 12.606947, 7.305357, 10.3043785, 12.882765, 7.613677, 10.007544, 12.789576, 6.995577, 10.750685, 12.587612, 6.947036, 10.728325, 12.637543, 7.2165165, 9.423414, 12.864445, 7.0854006, 9.161785, 12.882765, 7.613677, 10.007544, 12.637543, 7.2165165, 9.423414, 12.688946, 7.04373, 9.142518, 12.864445, 7.0854006, 9.161785, 13.7075405, 7.556304, 10.0746155, 13.181564, 7.251497, 10.484621, 12.882765, 7.613677, 10.007544, 13.181564, 7.251497, 10.484621, 13.7075405, 7.556304, 10.0746155, 13.580511, 7.079011, 10.661566, 13.181564, 7.251497, 10.484621, 13.580511, 7.079011, 10.661566, 13.291115, 7.061289, 10.697266, 13.274715, 7.4356117, 9.746176, 12.864445, 7.0854006, 9.161785, 13.339142, 7.0672264, 9.294153, 13.274715, 7.4356117, 9.746176, 12.882765, 7.613677, 10.007544, 12.864445, 7.0854006, 9.161785, 14.450766, 7.1982546, 10.098274, 13.885704, 7.279489, 10.325115, 13.7075405, 7.556304, 10.0746155, 13.885704, 7.279489, 10.325115, 14.450766, 7.1982546, 10.098274, 14.443308, 7.0981884, 10.231224, 13.885704, 7.279489, 10.325115, 14.443308, 7.0981884, 10.231224, 14.063122, 7.117878, 10.426937, 11.658583, 6.90143, 9.442226, 12.092066, 6.8811474, 9.071436, 11.933365, 7.3444357, 9.894124, 11.658583, 6.90143, 9.442226, 11.79088, 6.773697, 9.139975, 12.092066, 6.8811474, 9.071436, 11.422882, 6.7517605, 9.392457, 11.603992, 6.6508856, 9.16963, 11.658583, 6.90143, 9.442226, 11.422882, 6.7517605, 9.392457, 11.497446, 6.636342, 9.199318, 11.603992, 6.6508856, 9.16963, 11.422882, 6.7517605, 9.392457, 11.151068, 6.834375, 9.774982, 11.28582, 6.5728126, 9.250239, 10.868927, 6.502743, 9.566353, 11.28582, 6.5728126, 9.250239, 11.151068, 6.834375, 9.774982, 10.868927, 6.502743, 9.566353, 10.970734, 6.4467087, 9.364567, 11.28582, 6.5728126, 9.250239, 14.070913, 7.495411, 9.618036, 14.482357, 7.125392, 10.12579, 14.3754425, 7.195709, 10.181591, 14.070913, 7.495411, 9.618036, 14.516771, 7.173098, 9.291218, 14.482357, 7.125392, 10.12579, 13.583624, 7.1059093, 9.775603, 13.968065, 7.2646875, 9.861715, 13.816387, 7.1105375, 9.930347, 13.583624, 7.1059093, 9.775603, 14.070913, 7.495411, 9.618036, 13.968065, 7.2646875, 9.861715, 12.772589, 6.376586, 6.9820247, 13.099979, 6.904664, 7.5420585, 12.775024, 6.637413, 7.820493, 12.772589, 6.376586, 6.9820247, 12.839212, 6.4047265, 6.9280143, 13.099979, 6.904664, 7.5420585, 13.099979, 6.904664, 7.5420585, 12.79912, 6.699265, 8.027189, 12.775024, 6.637413, 7.820493, 13.099979, 6.904664, 7.5420585, 13.025673, 6.931345, 7.982105, 12.79912, 6.699265, 8.027189, 13.025673, 6.931345, 7.982105, 13.099979, 6.904664, 7.5420585, 13.384867, 7.3345337, 8.193618, 13.025673, 6.931345, 7.982105, 13.384867, 7.3345337, 8.193618, 12.864683, 6.8550787, 8.580061, 13.025673, 6.931345, 7.982105, 12.864683, 6.8550787, 8.580061, 12.820887, 6.753347, 8.212795, 12.864683, 6.8550787, 8.580061, 13.068455, 7.0369205, 8.661718, 12.906773, 6.8680534, 8.665814, 12.864683, 6.8550787, 8.580061, 13.384867, 7.3345337, 8.193618, 13.068455, 7.0369205, 8.661718, 13.15687, 7.046695, 9.214457, 13.535355, 7.2501936, 9.400614, 13.26737, 7.0566998, 9.358015, 13.15687, 7.046695, 9.214457, 13.745743, 7.551609, 8.966543, 13.535355, 7.2501936, 9.400614, 12.922939, 6.384966, 6.9034257, 13.099979, 6.904664, 7.5420585, 12.839212, 6.4047265, 6.9280143, 13.099979, 6.904664, 7.5420585, 12.922939, 6.384966, 6.9034257, 13.11478, 6.619231, 7.236095, 13.11478, 6.619231, 7.236095, 12.922939, 6.384966, 6.9034257, 13.179651, 6.491927, 7.1159973, 13.099979, 6.904664, 7.5420585, 13.577553, 6.959513, 7.7937083, 13.384867, 7.3345337, 8.193618, 13.099979, 6.904664, 7.5420585, 13.501598, 6.832964, 7.5911536, 13.577553, 6.959513, 7.7937083, 14.043669, 6.938242, 7.9677033, 13.745743, 7.551609, 8.966543, 13.384867, 7.3345337, 8.193618, 13.745743, 7.551609, 8.966543, 14.043669, 6.938242, 7.9677033, 14.200254, 7.008704, 8.294954, 13.745743, 7.551609, 8.966543, 14.200254, 7.008704, 8.294954, 14.049522, 7.2166758, 8.535611, 14.115025, 7.3930063, 9.158257, 14.070913, 7.495411, 9.618036, 13.745743, 7.551609, 8.966543, 14.070913, 7.495411, 9.618036, 14.115025, 7.3930063, 9.158257, 14.474133, 7.170848, 9.13312, 14.070913, 7.495411, 9.618036, 14.474133, 7.170848, 9.13312, 14.516771, 7.173098, 9.291218, 13.745743, 7.551609, 8.966543, 13.068455, 7.0369205, 8.661718, 13.384867, 7.3345337, 8.193618, 13.402321, 7.300085, 8.886555, 13.068455, 7.0369205, 8.661718, 13.745743, 7.551609, 8.966543, 13.068455, 7.0369205, 8.661718, 13.402321, 7.300085, 8.886555, 13.049887, 6.9149427, 8.958126, 13.068455, 7.0369205, 8.661718, 13.049887, 6.9149427, 8.958126, 12.977623, 6.9004726, 8.814155, 13.745743, 7.551609, 8.966543, 13.079823, 7.007822, 9.05171, 13.402321, 7.300085, 8.886555, 13.745743, 7.551609, 8.966543, 13.15687, 7.046695, 9.214457, 13.079823, 7.007822, 9.05171, 14.049522, 7.2166758, 8.535611, 14.337751, 7.1039696, 8.595517, 13.745743, 7.551609, 8.966543, 14.049522, 7.2166758, 8.535611, 14.270794, 7.0704823, 8.454195, 14.337751, 7.1039696, 8.595517, 14.070913, 7.495411, 9.618036, 13.535355, 7.2501936, 9.400614, 13.745743, 7.551609, 8.966543, 13.535355, 7.2501936, 9.400614, 14.070913, 7.495411, 9.618036, 13.583624, 7.1059093, 9.775603, 13.535355, 7.2501936, 9.400614, 13.583624, 7.1059093, 9.775603, 13.427256, 7.094145, 9.573523, 14.115025, 7.3930063, 9.158257, 14.337751, 7.1039696, 8.595517, 14.450401, 7.090761, 9.003662, 14.115025, 7.3930063, 9.158257, 13.745743, 7.551609, 8.966543, 14.337751, 7.1039696, 8.595517, 14.3754425, 7.195709, 10.181591, 13.968065, 7.2646875, 9.861715, 14.070913, 7.495411, 9.618036, 13.968065, 7.2646875, 9.861715, 14.3754425, 7.195709, 10.181591, 14.275515, 7.113496, 10.233852, 13.968065, 7.2646875, 9.861715, 14.275515, 7.113496, 10.233852, 13.9707985, 7.1304455, 10.03817, 13.577553, 6.959513, 7.7937083, 14.043669, 6.938242, 7.9677033, 13.384867, 7.3345337, 8.193618, 13.577553, 6.959513, 7.7937083, 13.853798, 6.849599, 7.7665267, 14.043669, 6.938242, 7.9677033, 13.501598, 6.832964, 7.5911536, 13.736696, 6.747884, 7.6274853, 13.577553, 6.959513, 7.7937083, 13.501598, 6.832964, 7.5911536, 13.669174, 6.7349615, 7.561953, 13.736696, 6.747884, 7.6274853, 13.501598, 6.832964, 7.5911536, 13.099979, 6.904664, 7.5420585, 13.535788, 6.6803236, 7.4230866, 13.11478, 6.619231, 7.236095, 13.535788, 6.6803236, 7.4230866, 13.099979, 6.904664, 7.5420585, 13.11478, 6.619231, 7.236095, 13.306187, 6.5714235, 7.228906, 13.535788, 6.6803236, 7.4230866, 14.818359, 7.5795794, 9.704287, 14.319729, 7.1040306, 10.273739, 14.231741, 7.193877, 10.164581, 14.818359, 7.5795794, 9.704287, 15.293608, 7.170624, 10.134708, 14.319729, 7.1040306, 10.273739, 14.53705, 7.1410728, 9.124798, 14.520617, 7.3097606, 9.621042, 14.407236, 7.130357, 9.437237, 14.53705, 7.1410728, 9.124798, 14.818359, 7.5795794, 9.704287, 14.520617, 7.3097606, 9.621042, 17.50299, 6.374856, 7.3705115, 16.95148, 6.951913, 7.9566584, 16.564781, 6.648938, 7.610077, 17.50299, 6.374856, 7.3705115, 17.578213, 6.4056153, 7.4395566, 16.95148, 6.951913, 7.9566584, 16.95148, 6.951913, 7.9566584, 16.337984, 6.7154865, 7.697535, 16.564781, 6.648938, 7.610077, 16.95148, 6.951913, 7.9566584, 16.44146, 6.978112, 7.98315, 16.337984, 6.7154865, 7.697535, 16.44146, 6.978112, 7.98315, 16.95148, 6.951913, 7.9566584, 16.283978, 7.4333143, 8.50886, 16.44146, 6.978112, 7.98315, 16.283978, 7.4333143, 8.50886, 15.729202, 6.886676, 7.930798, 16.44146, 6.978112, 7.98315, 15.729202, 6.886676, 7.930798, 16.134073, 6.774377, 7.7760997, 15.729202, 6.886676, 7.930798, 15.686707, 7.0922894, 8.219696, 15.639549, 6.8975234, 8.001675, 15.729202, 6.886676, 7.930798, 16.283978, 7.4333143, 8.50886, 15.686707, 7.0922894, 8.219696, 15.082333, 7.0959883, 8.468272, 14.956093, 7.31973, 8.992256, 14.942156, 7.0999613, 8.635822, 15.082333, 7.0959883, 8.468272, 15.490726, 7.667551, 9.160905, 14.956093, 7.31973, 8.992256, 17.624905, 6.3763094, 7.5322666, 16.95148, 6.951913, 7.9566584, 17.578213, 6.4056153, 7.4395566, 16.95148, 6.951913, 7.9566584, 17.624905, 6.3763094, 7.5322666, 17.296997, 6.6220546, 7.8690057, 17.296997, 6.6220546, 7.8690057, 17.624905, 6.3763094, 7.5322666, 17.441767, 6.4720078, 7.9004264, 16.95148, 6.951913, 7.9566584, 16.778732, 6.9787436, 8.60397, 16.283978, 7.4333143, 8.50886, 16.95148, 6.951913, 7.9566584, 16.988663, 6.836954, 8.447882, 16.778732, 6.9787436, 8.60397, 16.685303, 6.91991, 9.205566, 15.490726, 7.667551, 9.160905, 16.283978, 7.4333143, 8.50886, 15.490726, 7.667551, 9.160905, 16.685303, 6.91991, 9.205566, 16.34667, 6.989422, 9.478991, 15.490726, 7.667551, 9.160905, 16.34667, 6.989422, 9.478991, 16.0481, 7.250002, 9.387381, 15.358458, 7.458866, 9.642784, 14.818359, 7.5795794, 9.704287, 15.490726, 7.667551, 9.160905, 14.818359, 7.5795794, 9.704287, 15.358458, 7.458866, 9.642784, 15.46587, 7.1714168, 10.046328, 14.818359, 7.5795794, 9.704287, 15.46587, 7.1714168, 10.046328, 15.293608, 7.170624, 10.134708, 15.490726, 7.667551, 9.160905, 15.686707, 7.0922894, 8.219696, 16.283978, 7.4333143, 8.50886, 15.509426, 7.387882, 8.707602, 15.686707, 7.0922894, 8.219696, 15.490726, 7.667551, 9.160905, 15.686707, 7.0922894, 8.219696, 15.509426, 7.387882, 8.707602, 15.334177, 6.938472, 8.243979, 15.686707, 7.0922894, 8.219696, 15.334177, 6.938472, 8.243979, 15.486206, 6.9294643, 8.125624, 15.490726, 7.667551, 9.160905, 15.250263, 7.0548754, 8.33129, 15.509426, 7.387882, 8.707602, 15.490726, 7.667551, 9.160905, 15.082333, 7.0959883, 8.468272, 15.250263, 7.0548754, 8.33129, 16.0481, 7.250002, 9.387381, 16.040924, 7.0956764, 9.734488, 15.490726, 7.667551, 9.160905, 16.0481, 7.250002, 9.387381, 16.186634, 7.0604343, 9.615782, 16.040924, 7.0956764, 9.734488, 14.818359, 7.5795794, 9.704287, 14.956093, 7.31973, 8.992256, 15.490726, 7.667551, 9.160905, 14.956093, 7.31973, 8.992256, 14.818359, 7.5795794, 9.704287, 14.53705, 7.1410728, 9.124798, 14.956093, 7.31973, 8.992256, 14.53705, 7.1410728, 9.124798, 14.7350445, 7.1373453, 8.888584, 15.358458, 7.458866, 9.642784, 16.040924, 7.0956764, 9.734488, 15.592907, 7.0656147, 9.958109, 15.358458, 7.458866, 9.642784, 15.490726, 7.667551, 9.160905, 16.040924, 7.0956764, 9.734488, 14.231741, 7.193877, 10.164581, 14.520617, 7.3097606, 9.621042, 14.818359, 7.5795794, 9.704287, 14.520617, 7.3097606, 9.621042, 14.231741, 7.193877, 10.164581, 14.1518955, 7.1016655, 10.051222, 14.520617, 7.3097606, 9.621042, 14.1518955, 7.1016655, 10.051222, 14.318668, 7.147036, 9.652245, 16.778732, 6.9787436, 8.60397, 16.685303, 6.91991, 9.205566, 16.283978, 7.4333143, 8.50886, 16.778732, 6.9787436, 8.60397, 16.869965, 6.8293467, 8.917667, 16.685303, 6.91991, 9.205566, 16.988663, 6.836954, 8.447882, 16.991056, 6.717228, 8.721294, 16.778732, 6.9787436, 8.60397, 16.988663, 6.836954, 8.447882, 17.05367, 6.7085714, 8.62688, 16.991056, 6.717228, 8.721294, 16.988663, 6.836954, 8.447882, 16.95148, 6.951913, 7.9566584, 17.18201, 6.656856, 8.4283905, 17.296997, 6.6220546, 7.8690057, 17.18201, 6.656856, 8.4283905, 16.95148, 6.951913, 7.9566584, 17.296997, 6.6220546, 7.8690057, 17.347916, 6.550868, 8.092527, 17.18201, 6.656856, 8.4283905, 14.640917, 7.231346, 10.77033, 14.15225, 7.201992, 10.013128, 14.311281, 7.246917, 9.992706, 14.640917, 7.231346, 10.77033, 13.950329, 6.9789553, 10.945974, 14.15225, 7.201992, 10.013128, 15.086668, 6.645689, 10.496582, 14.715862, 7.027137, 10.425049, 14.856575, 6.812086, 10.301319, 15.086668, 6.645689, 10.496582, 14.640917, 7.231346, 10.77033, 14.715862, 7.027137, 10.425049, 15.405359, 4.506928, 13.294855, 15.268087, 5.398923, 12.871037, 15.5953045, 5.062126, 12.496258, 15.405359, 4.506928, 13.294855, 15.330811, 4.5490294, 13.357082, 15.268087, 5.398923, 12.871037, 15.268087, 5.398923, 12.871037, 15.614843, 5.2105064, 12.296331, 15.5953045, 5.062126, 12.496258, 15.268087, 5.398923, 12.871037, 15.418043, 5.546952, 12.416988, 15.614843, 5.2105064, 12.296331, 15.418043, 5.546952, 12.416988, 15.268087, 5.398923, 12.871037, 15.162661, 6.218977, 12.31654, 15.418043, 5.546952, 12.416988, 15.162661, 6.218977, 12.31654, 15.6678505, 5.60172, 11.757086, 15.418043, 5.546952, 12.416988, 15.6678505, 5.60172, 11.757086, 15.632406, 5.343074, 12.11624, 15.6678505, 5.60172, 11.757086, 15.4920025, 5.9232817, 11.72563, 15.641216, 5.6641035, 11.663549, 15.6678505, 5.60172, 11.757086, 15.162661, 6.218977, 12.31654, 15.4920025, 5.9232817, 11.72563, 15.469013, 6.1774178, 11.125845, 15.1226845, 6.643654, 10.969555, 15.370789, 6.2906885, 10.961456, 15.469013, 6.1774178, 11.125845, 14.925304, 6.9021482, 11.535374, 15.1226845, 6.643654, 10.969555, 15.222748, 4.557292, 13.366293, 15.268087, 5.398923, 12.871037, 15.330811, 4.5490294, 13.357082, 15.268087, 5.398923, 12.871037, 15.222748, 4.557292, 13.366293, 15.117676, 4.9987955, 13.081551, 15.117676, 4.9987955, 13.081551, 15.222748, 4.557292, 13.366293, 14.994282, 4.8528996, 13.149015, 15.268087, 5.398923, 12.871037, 14.755228, 5.765085, 12.572195, 15.162661, 6.218977, 12.31654, 15.268087, 5.398923, 12.871037, 14.77644, 5.523675, 12.745871, 14.755228, 5.765085, 12.572195, 14.232555, 6.018609, 12.3237705, 14.925304, 6.9021482, 11.535374, 15.162661, 6.218977, 12.31654, 14.925304, 6.9021482, 11.535374, 14.232555, 6.018609, 12.3237705, 14.130428, 6.281682, 11.9799385, 14.925304, 6.9021482, 11.535374, 14.130428, 6.281682, 11.9799385, 14.391569, 6.5280485, 11.829561, 14.462694, 6.9798803, 11.226421, 14.640917, 7.231346, 10.77033, 14.925304, 6.9021482, 11.535374, 14.640917, 7.231346, 10.77033, 14.462694, 6.9798803, 11.226421, 13.968893, 6.899996, 11.121994, 14.640917, 7.231346, 10.77033, 13.968893, 6.899996, 11.121994, 13.950329, 6.9789553, 10.945974, 14.925304, 6.9021482, 11.535374, 15.4920025, 5.9232817, 11.72563, 15.162661, 6.218977, 12.31654, 15.217165, 6.445463, 11.55835, 15.4920025, 5.9232817, 11.72563, 14.925304, 6.9021482, 11.535374, 15.4920025, 5.9232817, 11.72563, 15.217165, 6.445463, 11.55835, 15.550241, 5.8804913, 11.346338, 15.4920025, 5.9232817, 11.72563, 15.550241, 5.8804913, 11.346338, 15.594999, 5.783677, 11.508028, 14.925304, 6.9021482, 11.535374, 15.519932, 6.0406504, 11.294071, 15.217165, 6.445463, 11.55835, 14.925304, 6.9021482, 11.535374, 15.469013, 6.1774178, 11.125845, 15.519932, 6.0406504, 11.294071, 14.391569, 6.5280485, 11.829561, 14.036055, 6.5608177, 11.683962, 14.925304, 6.9021482, 11.535374, 14.391569, 6.5280485, 11.829561, 14.080282, 6.442515, 11.830221, 14.036055, 6.5608177, 11.683962, 14.640917, 7.231346, 10.77033, 15.1226845, 6.643654, 10.969555, 14.925304, 6.9021482, 11.535374, 15.1226845, 6.643654, 10.969555, 14.640917, 7.231346, 10.77033, 15.086668, 6.645689, 10.496582, 15.1226845, 6.643654, 10.969555, 15.086668, 6.645689, 10.496582, 15.225153, 6.48761, 10.729311, 14.462694, 6.9798803, 11.226421, 14.036055, 6.5608177, 11.683962, 13.989519, 6.7390223, 11.216955, 14.462694, 6.9798803, 11.226421, 14.925304, 6.9021482, 11.535374, 14.036055, 6.5608177, 11.683962, 14.311281, 7.246917, 9.992706, 14.715862, 7.027137, 10.425049, 14.640917, 7.231346, 10.77033, 14.715862, 7.027137, 10.425049, 14.311281, 7.246917, 9.992706, 14.403456, 7.132376, 9.914658, 14.715862, 7.027137, 10.425049, 14.403456, 7.132376, 9.914658, 14.700848, 6.947154, 10.176794, 14.755228, 5.765085, 12.572195, 14.232555, 6.018609, 12.3237705, 15.162661, 6.218977, 12.31654, 14.755228, 5.765085, 12.572195, 14.395441, 5.764677, 12.524948, 14.232555, 6.018609, 12.3237705, 14.77644, 5.523675, 12.745871, 14.502789, 5.5489907, 12.638502, 14.755228, 5.765085, 12.572195, 14.77644, 5.523675, 12.745871, 14.557829, 5.4834146, 12.714375, 14.502789, 5.5489907, 12.638502, 14.77644, 5.523675, 12.745871, 15.268087, 5.398923, 12.871037, 14.671074, 5.3173504, 12.858131, 15.117676, 4.9987955, 13.081551, 14.671074, 5.3173504, 12.858131, 15.268087, 5.398923, 12.871037, 15.117676, 4.9987955, 13.081551, 14.877726, 5.0318, 13.048248, 14.671074, 5.3173504, 12.858131, 15.855707, 1.5785854, 8.303576, 15.537302, 3.513335, 8.969594, 15.675556, 3.59141, 8.79463, 15.855707, 1.5785854, 8.303576, 15.684317, 1.4956186, 8.515871, 15.537302, 3.513335, 8.969594, 15.718592, -0.6945374, 7.979791, 15.684317, 1.4956186, 8.515871, 15.855707, 1.5785854, 8.303576, 15.718592, -0.6945374, 7.979791, 15.528423, -0.7451041, 8.231567, 15.684317, 1.4956186, 8.515871, 15.190344, 1.4642165, 8.406557, 15.070126, 3.5373333, 8.645098, 15.119511, 3.4761071, 8.8678665, 15.190344, 1.4642165, 8.406557, 15.135492, 1.5326246, 8.145638, 15.070126, 3.5373333, 8.645098, 15.578283, 1.6655294, 7.8817935, 15.624922, 3.6523986, 8.571777, 15.435907, 3.6665154, 8.430279, 15.578283, 1.6655294, 7.8817935, 15.805153, 1.6476903, 8.039993, 15.624922, 3.6523986, 8.571777, 15.119511, 3.4761071, 8.8678665, 14.720741, 5.3593645, 9.339607, 14.75539, 5.3158965, 9.486606, 15.119511, 3.4761071, 8.8678665, 15.070126, 3.5373333, 8.645098, 14.720741, 5.3593645, 9.339607, 15.675556, 3.59141, 8.79463, 15.031363, 5.349116, 9.558678, 15.124321, 5.4062643, 9.4429035, 15.675556, 3.59141, 8.79463, 15.537302, 3.513335, 8.969594, 15.031363, 5.349116, 9.558678, 15.124321, 5.4062643, 9.4429035, 15.031363, 5.349116, 9.558678, 14.700575, 6.30957, 9.911303, 15.124321, 5.4062643, 9.4429035, 14.700575, 6.30957, 9.911303, 14.765755, 6.3641186, 9.829805, 15.684317, 1.4956186, 8.515871, 15.309, 3.4624698, 9.008275, 15.537302, 3.513335, 8.969594, 15.684317, 1.4956186, 8.515871, 15.412914, 1.4456806, 8.567421, 15.309, 3.4624698, 9.008275, 15.537302, 3.513335, 8.969594, 15.309, 3.4624698, 9.008275, 14.880146, 5.309407, 9.581961, 15.537302, 3.513335, 8.969594, 14.880146, 5.309407, 9.581961, 15.031363, 5.349116, 9.558678, 15.135492, 1.5326246, 8.145638, 15.208366, 3.6164234, 8.469492, 15.070126, 3.5373333, 8.645098, 15.135492, 1.5326246, 8.145638, 15.30286, 1.6151665, 7.9359193, 15.208366, 3.6164234, 8.469492, 15.070126, 3.5373333, 8.645098, 15.208366, 3.6164234, 8.469492, 14.811323, 5.4180756, 9.224138, 15.070126, 3.5373333, 8.645098, 14.811323, 5.4180756, 9.224138, 14.720741, 5.3593645, 9.339607, 15.435907, 3.6665154, 8.430279, 15.090517, 5.4490795, 9.293634, 14.963499, 5.456666, 9.198397, 15.435907, 3.6665154, 8.430279, 15.624922, 3.6523986, 8.571777, 15.090517, 5.4490795, 9.293634, 15.805153, 1.6476903, 8.039993, 15.675556, 3.59141, 8.79463, 15.624922, 3.6523986, 8.571777, 15.805153, 1.6476903, 8.039993, 15.855707, 1.5785854, 8.303576, 15.675556, 3.59141, 8.79463, 15.624922, 3.6523986, 8.571777, 15.124321, 5.4062643, 9.4429035, 15.090517, 5.4490795, 9.293634, 15.624922, 3.6523986, 8.571777, 15.675556, 3.59141, 8.79463, 15.124321, 5.4062643, 9.4429035, 15.30286, 1.6151665, 7.9359193, 15.435907, 3.6665154, 8.430279, 15.208366, 3.6164234, 8.469492, 15.30286, 1.6151665, 7.9359193, 15.578283, 1.6655294, 7.8817935, 15.435907, 3.6665154, 8.430279, 15.080032, -0.60457873, 7.549851, 15.578283, 1.6655294, 7.8817935, 15.30286, 1.6151665, 7.9359193, 15.080032, -0.60457873, 7.549851, 15.392487, -0.5923369, 7.483996, 15.578283, 1.6655294, 7.8817935, 15.208366, 3.6164234, 8.469492, 14.963499, 5.456666, 9.198397, 14.811323, 5.4180756, 9.224138, 15.208366, 3.6164234, 8.469492, 15.435907, 3.6665154, 8.430279, 14.963499, 5.456666, 9.198397, 14.811323, 5.4180756, 9.224138, 14.963499, 5.456666, 9.198397, 14.646309, 6.401553, 9.648203, 14.811323, 5.4180756, 9.224138, 14.646309, 6.401553, 9.648203, 14.5366535, 6.3609424, 9.662085, 14.498898, 6.2705493, 9.8520975, 14.315634, 6.982005, 10.216946, 14.590864, 6.2697954, 9.924797, 14.498898, 6.2705493, 9.8520975, 14.248718, 6.9810524, 10.163109, 14.315634, 6.982005, 10.216946, 14.700575, 6.30957, 9.911303, 14.437746, 7.065465, 10.1538315, 14.765755, 6.3641186, 9.829805, 14.700575, 6.30957, 9.911303, 14.392586, 7.019636, 10.210747, 14.437746, 7.065465, 10.1538315, 14.590864, 6.2697954, 9.924797, 14.392586, 7.019636, 10.210747, 14.700575, 6.30957, 9.911303, 14.590864, 6.2697954, 9.924797, 14.315634, 6.982005, 10.216946, 14.392586, 7.019636, 10.210747, 14.73908, 6.400427, 9.720892, 14.35066, 7.092757, 10.021431, 14.646309, 6.401553, 9.648203, 14.73908, 6.400427, 9.720892, 14.416679, 7.0957565, 10.076281, 14.35066, 7.092757, 10.021431, 14.765755, 6.3641186, 9.829805, 14.416679, 7.0957565, 10.076281, 14.73908, 6.400427, 9.720892, 14.765755, 6.3641186, 9.829805, 14.437746, 7.065465, 10.1538315, 14.416679, 7.0957565, 10.076281, 14.5366535, 6.3609424, 9.662085, 14.22855, 7.0092974, 10.084545, 14.471951, 6.307063, 9.744005, 14.5366535, 6.3609424, 9.662085, 14.27281, 7.057174, 10.028643, 14.22855, 7.0092974, 10.084545, 14.646309, 6.401553, 9.648203, 14.27281, 7.057174, 10.028643, 14.5366535, 6.3609424, 9.662085, 14.646309, 6.401553, 9.648203, 14.35066, 7.092757, 10.021431, 14.27281, 7.057174, 10.028643, 15.214357, -0.7575648, 8.298452, 15.190344, 1.4642165, 8.406557, 15.412914, 1.4456806, 8.567421, 15.214357, -0.7575648, 8.298452, 14.957146, -0.7182157, 8.110065, 15.190344, 1.4642165, 8.406557, 14.471951, 6.307063, 9.744005, 14.248718, 6.9810524, 10.163109, 14.498898, 6.2705493, 9.8520975, 14.471951, 6.307063, 9.744005, 14.22855, 7.0092974, 10.084545, 14.248718, 6.9810524, 10.163109, 15.412914, 1.4456806, 8.567421, 15.119511, 3.4761071, 8.8678665, 15.309, 3.4624698, 9.008275, 15.412914, 1.4456806, 8.567421, 15.190344, 1.4642165, 8.406557, 15.119511, 3.4761071, 8.8678665, 14.957146, -0.7182157, 8.110065, 15.135492, 1.5326246, 8.145638, 15.190344, 1.4642165, 8.406557, 14.957146, -0.7182157, 8.110065, 14.888254, -0.6553638, 7.8026576, 15.135492, 1.5326246, 8.145638, 15.392487, -0.5923369, 7.483996, 15.805153, 1.6476903, 8.039993, 15.578283, 1.6655294, 7.8817935, 15.392487, -0.5923369, 7.483996, 15.648527, -0.6318462, 7.673121, 15.805153, 1.6476903, 8.039993, 15.528423, -0.7451041, 8.231567, 15.412914, 1.4456806, 8.567421, 15.684317, 1.4956186, 8.515871, 15.528423, -0.7451041, 8.231567, 15.214357, -0.7575648, 8.298452, 15.412914, 1.4456806, 8.567421, 14.888254, -0.6553638, 7.8026576, 15.30286, 1.6151665, 7.9359193, 15.135492, 1.5326246, 8.145638, 14.888254, -0.6553638, 7.8026576, 15.080032, -0.60457873, 7.549851, 15.30286, 1.6151665, 7.9359193, 15.648527, -0.6318462, 7.673121, 15.855707, 1.5785854, 8.303576, 15.805153, 1.6476903, 8.039993, 15.648527, -0.6318462, 7.673121, 15.718592, -0.6945374, 7.979791, 15.855707, 1.5785854, 8.303576, 15.309, 3.4624698, 9.008275, 14.75539, 5.3158965, 9.486606, 14.880146, 5.309407, 9.581961, 15.309, 3.4624698, 9.008275, 15.119511, 3.4761071, 8.8678665, 14.75539, 5.3158965, 9.486606, 14.880146, 5.309407, 9.581961, 14.498898, 6.2705493, 9.8520975, 14.590864, 6.2697954, 9.924797, 14.880146, 5.309407, 9.581961, 14.75539, 5.3158965, 9.486606, 14.498898, 6.2705493, 9.8520975, 14.75539, 5.3158965, 9.486606, 14.471951, 6.307063, 9.744005, 14.498898, 6.2705493, 9.8520975, 14.75539, 5.3158965, 9.486606, 14.720741, 5.3593645, 9.339607, 14.471951, 6.307063, 9.744005, 15.031363, 5.349116, 9.558678, 14.590864, 6.2697954, 9.924797, 14.700575, 6.30957, 9.911303, 15.031363, 5.349116, 9.558678, 14.880146, 5.309407, 9.581961, 14.590864, 6.2697954, 9.924797, 14.963499, 5.456666, 9.198397, 14.73908, 6.400427, 9.720892, 14.646309, 6.401553, 9.648203, 14.963499, 5.456666, 9.198397, 15.090517, 5.4490795, 9.293634, 14.73908, 6.400427, 9.720892, 15.090517, 5.4490795, 9.293634, 14.765755, 6.3641186, 9.829805, 14.73908, 6.400427, 9.720892, 15.090517, 5.4490795, 9.293634, 15.124321, 5.4062643, 9.4429035, 14.765755, 6.3641186, 9.829805, 14.720741, 5.3593645, 9.339607, 14.5366535, 6.3609424, 9.662085, 14.471951, 6.307063, 9.744005, 14.720741, 5.3593645, 9.339607, 14.811323, 5.4180756, 9.224138, 14.5366535, 6.3609424, 9.662085, -18.8297, 3.3895998, -9.473499, -19.616299, 3.2075999, -9.711899, -19.1775, 3.1662998, -9.7628, -18.8297, 3.3895998, -9.473499, -19.3743, 3.391, -9.417299, -19.616299, 3.2075999, -9.711899, -19.3743, 3.391, -9.417299, -19.611, 3.187, -9.246899, -19.616299, 3.2075999, -9.711899, 10.0335, 3.3913999, -10.0343, 13.378099, 3.3913999, -13.378599, 13.378099, 3.3913999, -10.0343, 13.378099, 3.3913999, -13.378599, 16.722599, 3.3913999, -10.0343, 13.378099, 3.3913999, -10.0343, 13.378099, 3.3913999, -6.6894, 13.378099, 3.3913999, -10.0343, 16.722599, 3.3913999, -10.0343, 13.378099, 3.3913999, -6.6894, 16.722599, 3.3913999, -10.0343, 16.722599, 3.3913999, -6.6894, 10.0335, 3.3913999, -6.6894, 13.378099, 3.3913999, -10.0343, 13.378099, 3.3913999, -6.6894, 10.0335, 3.3913999, -6.6894, 10.0335, 3.3913999, -10.0343, 13.378099, 3.3913999, -10.0343, 16.722599, 3.3913999, -10.0343, 16.4746, 3.3913999, -13.3993, 16.722599, 3.3913999, -13.109999, 16.722599, 3.3913999, -10.0343, 13.378099, 3.3913999, -13.378599, 16.4746, 3.3913999, -13.3993, 16.4746, 3.3913999, -13.3993, 15.5536995, 3.3913999, -16.3177, 16.4952, 3.3913999, -15.5392, 16.4746, 3.3913999, -13.3993, 12.7383995, 3.3913999, -15.8953, 15.5536995, 3.3913999, -16.3177, 12.7383995, 3.3913999, -15.8953, 16.4746, 3.3913999, -13.3993, 13.378099, 3.3913999, -13.378599, 13.378099, 3.3913999, -13.378599, 12.460499, 3.3913999, -16.1674, 12.7383995, 3.3913999, -15.8953, 13.378099, 3.3913999, -13.378599, 10.0335, 3.3913999, -16.7235, 12.460499, 3.3913999, -16.1674, 10.0335, 3.3913999, -16.7235, 13.378099, 3.3913999, -13.378599, 10.0335, 3.3913999, -13.378599, 10.0335, 3.3913999, -10.0343, 10.0335, 3.3913999, -13.378599, 13.378099, 3.3913999, -13.378599, 6.6889997, 3.3913999, -13.378599, 10.0335, 3.3913999, -16.7235, 10.0335, 3.3913999, -13.378599, 6.6889997, 3.3913999, -13.378599, 6.6889997, 3.3913999, -16.7235, 10.0335, 3.3913999, -16.7235, 6.6889997, 3.3913999, -10.0343, 10.0335, 3.3913999, -13.378599, 10.0335, 3.3913999, -10.0343, 6.6889997, 3.3913999, -10.0343, 6.6889997, 3.3913999, -13.378599, 10.0335, 3.3913999, -13.378599, 4.6816, 3.3913999, -13.378599, 6.6889997, 3.3913999, -16.7235, 6.6889997, 3.3913999, -13.378599, 4.6816, 3.3913999, -13.378599, 3.8384998, 3.3913999, -16.7235, 6.6889997, 3.3913999, -16.7235, 4.5101, 3.3913999, -8.955799, 4.6816, 3.3913999, -13.378599, 6.6889997, 3.3913999, -13.378599, 4.5101, 3.3913999, -8.955799, 6.6889997, 3.3913999, -13.378599, 6.6889997, 3.3913999, -10.0343, 4.6816, 3.3913999, -13.378599, 4.5101, 3.3913999, -8.955799, 4.1105, 3.3913999, -9.3386, 6.6889997, 3.3913999, -6.6894, 6.6889997, 3.3913999, -10.0343, 10.0335, 3.3913999, -10.0343, 6.6889997, 3.3913999, -6.6894, 4.5101, 3.3913999, -8.955799, 6.6889997, 3.3913999, -10.0343, 6.6889997, 3.3913999, -6.6894, 10.0335, 3.3913999, -10.0343, 10.0335, 3.3913999, -6.6894, 4.1105, 3.3913999, -9.3386, 4.5101, 3.3913999, -8.955799, 3.8492, 3.3913999, -8.198, 6.6889997, 3.3913999, -6.6894, 3.8492, 3.3913999, -8.198, 4.5101, 3.3913999, -8.955799, 4.1105, 3.3913999, -9.3386, 3.8492, 3.3913999, -8.198, 3.4176, 3.3913999, -8.714399, 3.3444998, 3.3913999, -6.6894, 3.4176, 3.3913999, -8.714399, 3.8492, 3.3913999, -8.198, 3.8492, 3.3913999, -8.198, 6.6889997, 3.3913999, -6.6894, 3.3444998, 3.3913999, -6.6894, 3.3444998, 3.3913999, -6.6894, 0, 3.3913999, -8.714399, 3.4176, 3.3913999, -8.714399, 6.6889997, 3.3913999, -3.3451, 6.6889997, 3.3913999, -6.6894, 10.0335, 3.3913999, -6.6894, 6.6889997, 3.3913999, -3.3451, 10.0335, 3.3913999, -6.6894, 10.0335, 3.3913999, -3.3451, 3.3444998, 3.3913999, -3.3451, 3.3444998, 3.3913999, -6.6894, 6.6889997, 3.3913999, -6.6894, 3.3444998, 3.3913999, -3.3451, 6.6889997, 3.3913999, -6.6894, 6.6889997, 3.3913999, -3.3451, 0, 3.3913999, -8.714399, 3.3444998, 3.3913999, -6.6894, 0, 3.3913999, -6.6894, 0, 3.3913999, -6.6894, -3.5373998, 3.3913999, -9.750299, 0, 3.3913999, -8.714399, 0, 3.3913999, -3.3451, 3.3444998, 3.3913999, -6.6894, 3.3444998, 3.3913999, -3.3451, 0, 3.3913999, -3.3451, 0, 3.3913999, -6.6894, 3.3444998, 3.3913999, -6.6894, 3.3444998, 3.3913999, -0.000100016594, 3.3444998, 3.3913999, -3.3451, 6.6889997, 3.3913999, -3.3451, 3.3444998, 3.3913999, -0.000100016594, 6.6889997, 3.3913999, -3.3451, 6.6889997, 3.3913999, -0.000100016594, 3.3444998, 3.3913999, 3.3442, 3.3444998, 3.3913999, -0.000100016594, 6.6889997, 3.3913999, -0.000100016594, 3.3444998, 3.3913999, 3.3442, 6.6889997, 3.3913999, -0.000100016594, 6.6889997, 3.3913999, 3.3442, 0, 3.3913999, 3.3442, 3.3444998, 3.3913999, -0.000100016594, 3.3444998, 3.3913999, 3.3442, 3.3444998, 3.3913999, 6.6891, 3.3444998, 3.3913999, 3.3442, 6.6889997, 3.3913999, 3.3442, 0, 3.3913999, 3.3442, 0, 3.3913999, -0.000100016594, 3.3444998, 3.3913999, -0.000100016594, 0, 3.3913999, -0.000100016594, 3.3444998, 3.3913999, -3.3451, 3.3444998, 3.3913999, -0.000100016594, 0, 3.3913999, -0.000100016594, 0, 3.3913999, -3.3451, 3.3444998, 3.3913999, -3.3451, -2.9569001, 3.3913999, 3.3442, 0, 3.3913999, -0.000100016594, 0, 3.3913999, 3.3442, -2.9569001, 3.3913999, 3.3442, -2.9569001, 3.3913999, -0.000100016594, 0, 3.3913999, -0.000100016594, -2.9569001, 3.3913999, -0.000100016594, 0, 3.3913999, -3.3451, 0, 3.3913999, -0.000100016594, -2.9569001, 3.3913999, -0.000100016594, -3.6383996, 3.3913999, -2.0795999, 0, 3.3913999, -3.3451, -3.6383996, 3.3913999, -2.0795999, 0, 3.3913999, -6.6894, 0, 3.3913999, -3.3451, -3.6383996, 3.3913999, -2.0795999, -3.3452, 3.3913999, -6.6894, 0, 3.3913999, -6.6894, -6.6896996, 3.3913999, -3.7331, -3.3452, 3.3913999, -6.6894, -3.6383996, 3.3913999, -2.0795999, -3.8484998, 3.3913999, -9.5107, 0, 3.3913999, -6.6894, -3.3452, 3.3913999, -6.6894, 0, 3.3913999, -6.6894, -3.8484998, 3.3913999, -9.5107, -3.5373998, 3.3913999, -9.750299, -3.5373998, 3.3913999, -9.750299, -3.8484998, 3.3913999, -9.5107, -4.2641, 3.3913999, -9.881699, -3.3452, 3.3913999, -6.6894, -4.2641, 3.3913999, -9.881699, -3.8484998, 3.3913999, -9.5107, -3.5373998, 3.3913999, -9.750299, -4.2641, 3.3913999, -9.881699, -3.9104, 3.3913999, -10.240799, -4.2641, 3.3913999, -9.881699, -3.9104, 3.3913999, -12.1610985, -3.9104, 3.3913999, -10.240799, -6.6896996, 3.3913999, -3.7331, -6.6896996, 3.3913999, -6.6894, -3.3452, 3.3913999, -6.6894, -10.034201, 3.3913999, -3.7331, -6.6896996, 3.3913999, -6.6894, -6.6896996, 3.3913999, -3.7331, -3.3452, 3.3913999, -6.6894, -6.6896996, 3.3913999, -10.0343, -4.2641, 3.3913999, -9.881699, -6.6896996, 3.3913999, -10.0343, -3.3452, 3.3913999, -6.6894, -6.6896996, 3.3913999, -6.6894, -4.2641, 3.3913999, -9.881699, -6.6896996, 3.3913999, -12.5385, -3.9104, 3.3913999, -12.1610985, -6.6896996, 3.3913999, -12.5385, -4.2641, 3.3913999, -9.881699, -6.6896996, 3.3913999, -10.0343, -3.9104, 3.3913999, -12.1610985, -6.6896996, 3.3913999, -12.5385, -4.2794, 3.3913999, -12.5385, -10.034201, 3.3913999, -3.7331, -10.034201, 3.3913999, -6.6894, -6.6896996, 3.3913999, -6.6894, -10.034201, 3.3913999, -6.6894, -6.6896996, 3.3913999, -10.0343, -6.6896996, 3.3913999, -6.6894, -13.378799, 3.3913999, -3.7331, -10.034201, 3.3913999, -6.6894, -10.034201, 3.3913999, -3.7331, -10.034201, 3.3913999, -10.0343, -6.6896996, 3.3913999, -12.5385, -6.6896996, 3.3913999, -10.0343, -10.034201, 3.3913999, -6.6894, -10.034201, 3.3913999, -10.0343, -6.6896996, 3.3913999, -10.0343, -10.034201, 3.3913999, -10.0343, -10.6998005, 3.3913999, -13.1763, -6.6896996, 3.3913999, -12.5385, -13.378799, 3.3913999, -3.7331, -13.378799, 3.3913999, -6.6894, -10.034201, 3.3913999, -6.6894, -13.378799, 3.3913999, -6.6894, -10.034201, 3.3913999, -10.0343, -10.034201, 3.3913999, -6.6894, -16.192, 3.3913999, -3.0972, -13.378799, 3.3913999, -6.6894, -13.378799, 3.3913999, -3.7331, -13.378799, 3.3913999, -10.0343, -10.6998005, 3.3913999, -13.1763, -10.034201, 3.3913999, -10.0343, -13.378799, 3.3913999, -6.6894, -13.378799, 3.3913999, -10.0343, -10.034201, 3.3913999, -10.0343, -13.378799, 3.3913999, -10.0343, -13.378799, 3.3913999, -13.378599, -10.6998005, 3.3913999, -13.1763, -16.192, 3.3913999, -3.0972, -16.723299, 3.3913999, -6.6894, -13.378799, 3.3913999, -6.6894, -19.754599, 3.3913999, -2.7854, -16.723299, 3.3913999, -6.6894, -16.192, 3.3913999, -3.0972, -19.754599, 3.3913999, -2.7854, -19.2812, 3.3913999, -6.6894, -16.723299, 3.3913999, -6.6894, -17.111599, 3.3913999, -0.000100016594, -19.754599, 3.3913999, -2.7854, -16.192, 3.3913999, -3.0972, -17.111599, 3.3913999, -0.000100016594, -19.9515, 3.3913999, -2.5836997, -19.754599, 3.3913999, -2.7854, -19.9515, 3.3913999, -2.5836997, -17.111599, 3.3913999, -0.000100016594, -20.068499, 3.3913999, -0.000100016594, -20.068499, 3.3913999, 3.3442, -20.068499, 3.3913999, -0.000100016594, -17.111599, 3.3913999, -0.000100016594, -20.068499, 3.3913999, 3.3442, -17.111599, 3.3913999, -0.000100016594, -17.111599, 3.3913999, 3.304, -20.068499, 3.3913999, 6.6891, -20.068499, 3.3913999, 3.3442, -17.111599, 3.3913999, 3.304, -22.332499, 3.3913999, 8.990399, -22.315199, 3.3913999, 6.6891, -20.068499, 3.3913999, 6.6891, -22.332499, 3.3913999, 8.990399, -20.068499, 3.3913999, 6.6891, -20.068499, 3.3913999, 9.1673, -20.068499, 3.3913999, 9.1673, -20.068499, 3.3913999, 6.6891, -16.723299, 3.3913999, 6.6891, -20.068499, 3.3913999, 6.6891, -17.111599, 3.3913999, 3.304, -16.723299, 3.3913999, 6.6891, -20.068499, 3.3913999, 9.1673, -16.723299, 3.3913999, 6.6891, -16.285099, 3.3913999, 9.5862, -16.723299, 3.3913999, 6.6891, -16.0544, 3.3913999, 9.808, -16.285099, 3.3913999, 9.5862, -16.0544, 3.3913999, 9.808, -16.723299, 3.3913999, 6.6891, -13.136101, 3.3913999, 6.7548, -17.111599, 3.3913999, 3.304, -13.136101, 3.3913999, 6.7548, -16.723299, 3.3913999, 6.6891, -16.0544, 3.3913999, 9.808, -13.136101, 3.3913999, 6.7548, -13.378799, 3.3913999, 10.0334, -13.378799, 3.3913999, 10.0334, -13.136101, 3.3913999, 6.7548, -10.034201, 3.3913999, 7.0772, -13.378799, 3.3913999, 10.0334, -10.034201, 3.3913999, 7.0772, -10.034201, 3.3913999, 10.0334, -13.136101, 3.3913999, 6.7548, -17.111599, 3.3913999, 3.304, -14.877501, 3.3913999, 4.6651998, -14.877501, 3.3913999, 4.6651998, -17.111599, 3.3913999, 3.304, -15.5823, 3.3913999, 4.0364, -13.136101, 3.3913999, 6.7548, -14.877501, 3.3913999, 4.6651998, -14.0949, 3.3913999, 5.5070996, 3.3444998, 3.3913999, 10.0334, 6.6889997, 3.3913999, 6.6891, 6.6889997, 3.3913999, 10.0334, 0, 3.3913999, 13.3783, 0, 3.3913999, 10.0334, 3.3444998, 3.3913999, 10.0334, 0, 3.3913999, 13.3783, 3.3444998, 3.3913999, 10.0334, 3.3444998, 3.3913999, 13.3783, 3.3444998, 3.3913999, 13.3783, 3.3444998, 3.3913999, 10.0334, 6.6889997, 3.3913999, 10.0334, 3.3444998, 3.3913999, 10.0334, 3.3444998, 3.3913999, 6.6891, 6.6889997, 3.3913999, 6.6891, 3.3444998, 3.3913999, 6.6891, 6.6889997, 3.3913999, 3.3442, 6.6889997, 3.3913999, 6.6891, 6.6889997, 3.3913999, 6.6891, 6.6889997, 3.3913999, 3.3442, 10.0335, 3.3913999, 4.2546997, 6.6889997, 3.3913999, 6.6891, 10.0335, 3.3913999, 4.2546997, 10.0335, 3.3913999, 6.6891, 6.6889997, 3.3913999, 10.0334, 6.6889997, 3.3913999, 6.6891, 10.0335, 3.3913999, 6.6891, 6.6889997, 3.3913999, 10.0334, 10.0335, 3.3913999, 6.6891, 10.0335, 3.3913999, 10.0334, 3.3444998, 3.3913999, 13.3783, 6.6889997, 3.3913999, 10.0334, 6.6889997, 3.3913999, 13.3783, 3.9143, 3.3913999, 16.5144, 3.3444998, 3.3913999, 13.3783, 6.6889997, 3.3913999, 13.3783, 3.3444998, 3.3913999, 13.3783, 3.9143, 3.3913999, 16.5144, 3.6397, 3.3913999, 16.2405, 3.9143, 3.3913999, 16.5144, 6.6889997, 3.3913999, 13.3783, 6.6889997, 3.3913999, 16.7227, -3.3452, 3.3913999, 13.3783, 0, 3.3913999, 10.0334, 0, 3.3913999, 13.3783, -3.3452, 3.3913999, 13.3783, -3.3452, 3.4796999, 10.0334, 0, 3.3913999, 10.0334, 0, 3.3913999, 10.0334, 0, 3.4796999, 6.6891, 3.3444998, 3.3913999, 6.6891, 0, 3.3913999, 10.0334, 3.3444998, 3.3913999, 6.6891, 3.3444998, 3.3913999, 10.0334, 0, 3.4796999, 6.6891, 3.3444998, 3.3913999, 3.3442, 3.3444998, 3.3913999, 6.6891, 0, 3.4796999, 6.6891, 0, 3.3913999, 3.3442, 3.3444998, 3.3913999, 3.3442, 6.6889997, 3.3913999, -0.000100016594, 10.0335, 3.3913999, -3.3451, 10.0335, 3.2212, -2.2310996, 6.6889997, 3.3913999, -0.000100016594, 6.6889997, 3.3913999, -3.3451, 10.0335, 3.3913999, -3.3451, -10.034201, 3.0033998, 6.6891, -13.136101, 3.3913999, 6.7548, -12.747801, 3.0033998, 6.3666997, -10.034201, 3.0033998, 6.6891, -10.034201, 3.3913999, 7.0772, -13.136101, 3.3913999, 6.7548, -2.5679002, 2.9782999, 7.6208997, -6.6896996, 3.4796999, 7.0772, -6.6896996, 3.0033998, 6.6891, -2.5679002, 2.9782999, 7.6208997, -2.1796002, 3.3107998, 8.009, -6.6896996, 3.4796999, 7.0772, -12.747801, 3.0033998, 6.3666997, -14.0949, 3.3913999, 5.5070996, -13.694601, 3.0033998, 5.1793, -12.747801, 3.0033998, 6.3666997, -13.136101, 3.3913999, 6.7548, -14.0949, 3.3913999, 5.5070996, -6.6896996, 3.0033998, 6.6891, -10.034201, 3.3913999, 7.0772, -10.034201, 3.0033998, 6.6891, -6.6896996, 3.0033998, 6.6891, -6.6896996, 3.4796999, 7.0772, -10.034201, 3.3913999, 7.0772, -16.723299, 3.0033998, -0.000100016594, -16.192, 3.3913999, -3.0972, -15.8036995, 3.0033998, -2.7097, -16.723299, 3.0033998, -0.000100016594, -17.111599, 3.3913999, -0.000100016594, -16.192, 3.3913999, -3.0972, -13.378799, 3.3913999, -3.7331, -15.8036995, 3.0033998, -2.7097, -16.192, 3.3913999, -3.0972, -13.378799, 3.3913999, -3.7331, -13.378799, 3.0033998, -3.3451, -15.8036995, 3.0033998, -2.7097, -2.9569001, 3.3913999, -0.000100016594, -4.0260997, 3.0033998, -1.6915, -3.6383996, 3.3913999, -2.0795999, -2.9569001, 3.3913999, -0.000100016594, -3.3452, 3.0033998, -0.000100016594, -4.0260997, 3.0033998, -1.6915, -3.6383996, 3.3913999, -2.0795999, -6.6896996, 3.0033998, -3.3451, -6.6896996, 3.3913999, -3.7331, -3.6383996, 3.3913999, -2.0795999, -4.0260997, 3.0033998, -1.6915, -6.6896996, 3.0033998, -3.3451, -10.034201, 3.3913999, -3.7331, -13.378799, 3.0033998, -3.3451, -13.378799, 3.3913999, -3.7331, -10.034201, 3.3913999, -3.7331, -10.034201, 3.0033998, -3.3451, -13.378799, 3.0033998, -3.3451, -6.6896996, 3.3913999, -3.7331, -10.034201, 3.0033998, -3.3451, -10.034201, 3.3913999, -3.7331, -6.6896996, 3.3913999, -3.7331, -6.6896996, 3.0033998, -3.3451, -10.034201, 3.0033998, -3.3451, -16.723299, 3.0033998, 2.9164999, -17.111599, 3.3913999, -0.000100016594, -16.723299, 3.0033998, -0.000100016594, -16.723299, 3.0033998, 2.9164999, -17.111599, 3.3913999, 3.304, -17.111599, 3.3913999, -0.000100016594, -14.4897995, 3.0033998, 4.2777, -15.5823, 3.3913999, 4.0364, -15.3722, 3.0033998, 3.6128, -14.4897995, 3.0033998, 4.2777, -14.877501, 3.3913999, 4.6651998, -15.5823, 3.3913999, 4.0364, -2.9569001, 3.3913999, 3.3442, -3.3452, 3.0033998, -0.000100016594, -2.9569001, 3.3913999, -0.000100016594, -2.9569001, 3.3913999, 3.3442, -3.3452, 3.0033998, 3.3442, -3.3452, 3.0033998, -0.000100016594, -2.1796002, 3.3107998, 8.009, -2.1397, 3.0033998, 5.1793, -1.7839999, 3.3913999, 5.216, -2.1796002, 3.3107998, 8.009, -2.5679002, 2.9782999, 7.6208997, -2.1397, 3.0033998, 5.1793, -6.6896996, 3.3913999, 10.0334, -2.1796002, 3.3107998, 8.009, -3.3452, 3.4796999, 10.0334, -6.6896996, 3.3913999, 10.0334, -6.6896996, 3.4796999, 7.0772, -2.1796002, 3.3107998, 8.009, -10.034201, 3.3913999, 10.0334, -6.6896996, 3.4796999, 7.0772, -6.6896996, 3.3913999, 10.0334, -10.034201, 3.3913999, 10.0334, -10.034201, 3.3913999, 7.0772, -6.6896996, 3.4796999, 7.0772, -1.7839999, 3.3913999, 5.216, 0, 3.4796999, 6.6891, -2.1796002, 3.3107998, 8.009, 0, 3.4796999, 6.6891, -1.7839999, 3.3913999, 5.216, -2.9569001, 3.3913999, 3.3442, 0, 3.4796999, 6.6891, -2.9569001, 3.3913999, 3.3442, 0, 3.3913999, 3.3442, -3.3452, 3.4796999, 10.0334, 0, 3.4796999, 6.6891, 0, 3.3913999, 10.0334, -3.3452, 3.4796999, 10.0334, -2.1796002, 3.3107998, 8.009, 0, 3.4796999, 6.6891, -2.1397, 3.0033998, 5.1793, -2.9569001, 3.3913999, 3.3442, -1.7839999, 3.3913999, 5.216, -2.1397, 3.0033998, 5.1793, -3.3452, 3.0033998, 3.3442, -2.9569001, 3.3913999, 3.3442, -14.0949, 3.3913999, 5.5070996, -14.4897995, 3.0033998, 4.2777, -13.694601, 3.0033998, 5.1793, -14.0949, 3.3913999, 5.5070996, -14.877501, 3.3913999, 4.6651998, -14.4897995, 3.0033998, 4.2777, -15.5823, 3.3913999, 4.0364, -16.723299, 3.0033998, 2.9164999, -15.3722, 3.0033998, 3.6128, -15.5823, 3.3913999, 4.0364, -17.111599, 3.3913999, 3.304, -16.723299, 3.0033998, 2.9164999, 16.722599, 3.3913999, -13.109999, 16.4746, 3.3913999, -13.3993, 16.8123, 3.1578999, -13.4637985, 10.0335, 3.0523999, -19.0296, 6.6797, 3.2777998, -18.734999, 6.6763997, 3.0570998, -19.0278, 10.0335, 3.0523999, -19.0296, 10.0335, 3.2784998, -18.7001, 6.6797, 3.2777998, -18.734999, 6.6889997, 3.3913999, -16.7235, 10.0335, 3.2784998, -18.7001, 10.0335, 3.3913999, -16.7235, 6.6889997, 3.3913999, -16.7235, 6.6797, 3.2777998, -18.734999, 10.0335, 3.2784998, -18.7001, 12.7383995, 3.3913999, -15.8953, 12.460499, 3.3913999, -16.1674, 12.747099, 3.1769, -16.1994, 4.6816, 3.3913999, -13.378599, 3.5892, 3.2033, -16.7235, 3.8384998, 3.3913999, -16.7235, 4.6816, 3.3913999, -13.378599, 4.413, 3.2091, -13.357899, 3.5892, 3.2033, -16.7235, -10.6998005, 3.3913999, -13.1763, -6.6896996, 3.175, -12.867498, -6.6896996, 3.3913999, -12.5385, -10.6998005, 3.3913999, -13.1763, -10.4046, 3.1608999, -13.429499, -6.6896996, 3.175, -12.867498, -22.8711, 3.4937, 3.3673, -23.3678, 3.4459999, 0.13709998, -23.171, 3.6251, 0.12290001, -22.8711, 3.4937, 3.3673, -23.079899, 3.314, 3.3673, -23.3678, 3.4459999, 0.13709998, -22.8711, 3.4937, 3.3673, -20.068499, 3.3913999, -0.000100016594, -20.068499, 3.3913999, 3.3442, -22.8711, 3.4937, 3.3673, -23.171, 3.6251, 0.12290001, -20.068499, 3.3913999, -0.000100016594, -23.079899, 3.314, 3.3673, -22.315199, 3.3913999, 6.6891, -22.5639, 3.2219, 6.6891, -23.079899, 3.314, 3.3673, -22.8711, 3.4937, 3.3673, -22.315199, 3.3913999, 6.6891, -22.315199, 3.3913999, 6.6891, -20.068499, 3.3913999, 3.3442, -20.068499, 3.3913999, 6.6891, -22.315199, 3.3913999, 6.6891, -22.8711, 3.4937, 3.3673, -20.068499, 3.3913999, 3.3442, -15.739201, 3.2087, 12.341301, -13.378799, 3.3913999, 10.0334, -13.378799, 3.3922, 12.5714, -15.739201, 3.2087, 12.341301, -16.0544, 3.3913999, 9.808, -13.378799, 3.3913999, 10.0334, -10.034201, 3.2142, 12.105801, -13.378799, 3.1938999, 12.808599, -13.378799, 3.3922, 12.5714, -10.034201, 3.2142, 12.105801, -10.034201, 2.9384, 12.453701, -13.378799, 3.1938999, 12.808599, -13.378799, 3.3922, 12.5714, -10.034201, 3.3913999, 10.0334, -10.034201, 3.2142, 12.105801, -13.378799, 3.3922, 12.5714, -13.378799, 3.3913999, 10.0334, -10.034201, 3.3913999, 10.0334, 0, 3.2243998, 15.7092, -3.3452, 3.1497998, 15.914499, -3.3452, 3.3913999, 15.601, 0, 3.2243998, 15.7092, 0, 2.9636998, 16.0175, -3.3452, 3.1497998, 15.914499, -3.3452, 3.3913999, 15.601, 0, 3.3913999, 13.3783, 0, 3.2243998, 15.7092, -3.3452, 3.3913999, 15.601, -3.3452, 3.3913999, 13.3783, 0, 3.3913999, 13.3783, 0, 3.2243998, 15.7092, 3.3444998, 3.3913999, 13.3783, 3.6397, 3.3913999, 16.2405, 0, 3.2243998, 15.7092, 0, 3.3913999, 13.3783, 3.3444998, 3.3913999, 13.3783, 3.6397, 3.3913999, 16.2405, 3.9143, 3.3913999, 16.5144, 3.6729999, 3.1532, 16.5718, 13.2491, 2.9931, -3.474, 16.722599, 3.3913999, -6.6894, 16.722599, 3.1513, -3.6023998, 13.2491, 2.9931, -3.474, 13.378099, 3.3913999, -6.6894, 16.722599, 3.3913999, -6.6894, 10.0335, 3.3913999, -3.3451, 13.378099, 3.3913999, -6.6894, 13.2491, 2.9931, -3.474, 10.0335, 3.3913999, -3.3451, 10.0335, 3.3913999, -6.6894, 13.378099, 3.3913999, -6.6894, 19.8151, 3.3908, -10.0177, 20.1469, 3.0588999, -6.6894, 19.8317, 3.2891998, -6.6894, 19.8151, 3.3908, -10.0177, 20.188799, 3.1655998, -10.0154, 20.1469, 3.0588999, -6.6894, 19.8317, 3.2891998, -6.6894, 20.139599, 2.779, -3.3616, 19.8317, 3.0491, -3.6023998, 19.8317, 3.2891998, -6.6894, 20.1469, 3.0588999, -6.6894, 20.139599, 2.779, -3.3616, 16.722599, 3.1513, -3.6023998, 19.8317, 3.2891998, -6.6894, 19.8317, 3.0491, -3.6023998, 16.722599, 3.1513, -3.6023998, 16.722599, 3.3913999, -6.6894, 19.8317, 3.2891998, -6.6894, 16.722599, 3.3913999, -6.6894, 19.8151, 3.3908, -10.0177, 19.8317, 3.2891998, -6.6894, 16.722599, 3.3913999, -6.6894, 16.722599, 3.3913999, -10.0343, 19.8151, 3.3908, -10.0177, 20.139599, 2.779, -3.3616, 16.722599, 3.1513, -3.6023998, 19.8317, 3.0491, -3.6023998, 20.139599, 2.779, -3.3616, 16.712599, 2.8734, -3.3451, 16.722599, 3.1513, -3.6023998, 19.767899, 3.1308, -13.4058, 19.7985, 3.3913999, -12.747999, 19.4075, 3.3913999, -13.109999, 19.767899, 3.1308, -13.4058, 20.1582, 3.1318998, -13.041399, 19.7985, 3.3913999, -12.747999, 19.767899, 3.1308, -13.4058, 16.722599, 3.3913999, -13.109999, 16.8123, 3.1578999, -13.4637985, 19.767899, 3.1308, -13.4058, 19.4075, 3.3913999, -13.109999, 16.722599, 3.3913999, -13.109999, 20.188799, 3.1655998, -10.0154, 19.7985, 3.3913999, -12.747999, 20.1582, 3.1318998, -13.041399, 20.188799, 3.1655998, -10.0154, 19.8151, 3.3908, -10.0177, 19.7985, 3.3913999, -12.747999, 16.722599, 3.3913999, -13.109999, 19.8151, 3.3908, -10.0177, 16.722599, 3.3913999, -10.0343, 19.8151, 3.3908, -10.0177, 16.722599, 3.3913999, -13.109999, 19.4075, 3.3913999, -13.109999, 19.8151, 3.3908, -10.0177, 19.4075, 3.3913999, -13.109999, 19.7985, 3.3913999, -12.747999, 16.4952, 3.3913999, -15.5392, 15.828299, 3.1678, -16.6064, 16.7698, 3.1685998, -15.8202, 16.4952, 3.3913999, -15.5392, 15.5536995, 3.3913999, -16.3177, 15.828299, 3.1678, -16.6064, 16.8123, 3.1578999, -13.4637985, 16.4952, 3.3913999, -15.5392, 16.7698, 3.1685998, -15.8202, 16.8123, 3.1578999, -13.4637985, 16.4746, 3.3913999, -13.3993, 16.4952, 3.3913999, -15.5392, 15.828299, 3.1678, -16.6064, 12.7383995, 3.3913999, -15.8953, 12.747099, 3.1769, -16.1994, 15.828299, 3.1678, -16.6064, 15.5536995, 3.3913999, -16.3177, 12.7383995, 3.3913999, -15.8953, 12.4485, 3.2073998, -18.4711, 12.299599, 2.942, -19.2491, 12.726398, 2.9599, -18.824299, 12.4485, 3.2073998, -18.4711, 12.0203, 3.1891, -18.8983, 12.299599, 2.942, -19.2491, 12.4485, 3.2073998, -18.4711, 12.747099, 3.1769, -16.1994, 12.460499, 3.3913999, -16.1674, 12.4485, 3.2073998, -18.4711, 12.726398, 2.9599, -18.824299, 12.747099, 3.1769, -16.1994, 12.299599, 2.942, -19.2491, 10.0335, 3.2784998, -18.7001, 10.0335, 3.0523999, -19.0296, 12.299599, 2.942, -19.2491, 12.0203, 3.1891, -18.8983, 10.0335, 3.2784998, -18.7001, 10.0335, 3.2784998, -18.7001, 12.460499, 3.3913999, -16.1674, 10.0335, 3.3913999, -16.7235, 12.460499, 3.3913999, -16.1674, 10.0335, 3.2784998, -18.7001, 12.0203, 3.1891, -18.8983, 12.460499, 3.3913999, -16.1674, 12.0203, 3.1891, -18.8983, 12.4485, 3.2073998, -18.4711, 5.6212, 3.2835999, -18.3475, 3.9036999, 3.1690998, -17.2696, 5.4681997, 3.0900998, -18.607199, 5.6212, 3.2835999, -18.3475, 4.0333, 3.3667998, -17.0276, 3.9036999, 3.1690998, -17.2696, 4.0333, 3.3667998, -17.0276, 6.6889997, 3.3913999, -16.7235, 3.8384998, 3.3913999, -16.7235, 6.6889997, 3.3913999, -16.7235, 4.0333, 3.3667998, -17.0276, 5.6212, 3.2835999, -18.3475, 6.6889997, 3.3913999, -16.7235, 5.6212, 3.2835999, -18.3475, 6.6797, 3.2777998, -18.734999, 3.8384998, 3.3913999, -16.7235, 3.9036999, 3.1690998, -17.2696, 4.0333, 3.3667998, -17.0276, 3.8384998, 3.3913999, -16.7235, 3.5892, 3.2033, -16.7235, 3.9036999, 3.1690998, -17.2696, 6.6763997, 3.0570998, -19.0278, 5.6212, 3.2835999, -18.3475, 5.4681997, 3.0900998, -18.607199, 6.6763997, 3.0570998, -19.0278, 6.6797, 3.2777998, -18.734999, 5.6212, 3.2835999, -18.3475, -15.2073, 3.5182998, -15.4569, -16.124199, 3.3711998, -15.150499, -15.441299, 3.3151, -15.7533, -15.2073, 3.5182998, -15.4569, -15.9035, 3.5797, -14.867699, -16.124199, 3.3711998, -15.150499, -15.9035, 3.5797, -14.867699, -13.378799, 3.3913999, -13.378599, -16.1309, 3.6227, -13.6241, -13.378799, 3.3913999, -13.378599, -15.9035, 3.5797, -14.867699, -15.2073, 3.5182998, -15.4569, -13.378799, 3.3913999, -13.378599, -15.2073, 3.5182998, -15.4569, -13.3874, 3.3918998, -15.424398, -16.1309, 3.6227, -13.6241, -16.124199, 3.3711998, -15.150499, -15.9035, 3.5797, -14.867699, -16.1309, 3.6227, -13.6241, -16.3755, 3.4225, -13.6283, -16.124199, 3.3711998, -15.150499, -13.385401, 3.1832, -15.7598, -15.2073, 3.5182998, -15.4569, -15.441299, 3.3151, -15.7533, -13.385401, 3.1832, -15.7598, -13.3874, 3.3918998, -15.424398, -15.2073, 3.5182998, -15.4569, -10.749701, 3.1581, -16.1136, -10.6998005, 3.3913999, -15.507799, -11.021601, 3.3913999, -15.7846985, -10.749701, 3.1581, -16.1136, -10.429201, 3.1564, -15.8326, -10.6998005, 3.3913999, -15.507799, -10.749701, 3.1581, -16.1136, -13.3874, 3.3918998, -15.424398, -13.385401, 3.1832, -15.7598, -10.749701, 3.1581, -16.1136, -11.021601, 3.3913999, -15.7846985, -13.3874, 3.3918998, -15.424398, -10.4046, 3.1608999, -13.429499, -10.6998005, 3.3913999, -15.507799, -10.429201, 3.1564, -15.8326, -10.4046, 3.1608999, -13.429499, -10.6998005, 3.3913999, -13.1763, -10.6998005, 3.3913999, -15.507799, -13.3874, 3.3918998, -15.424398, -10.6998005, 3.3913999, -13.1763, -13.378799, 3.3913999, -13.378599, -10.6998005, 3.3913999, -13.1763, -13.3874, 3.3918998, -15.424398, -11.021601, 3.3913999, -15.7846985, -10.6998005, 3.3913999, -13.1763, -11.021601, 3.3913999, -15.7846985, -10.6998005, 3.3913999, -15.507799, -3.9104, 3.3913999, -12.1610985, -4.0188, 3.1604998, -12.820099, -3.6476998, 3.1597998, -12.4415, -3.9104, 3.3913999, -12.1610985, -4.2794, 3.3913999, -12.5385, -4.0188, 3.1604998, -12.820099, -4.0188, 3.1604998, -12.820099, -6.6896996, 3.3913999, -12.5385, -6.6896996, 3.175, -12.867498, -4.0188, 3.1604998, -12.820099, -4.2794, 3.3913999, -12.5385, -6.6896996, 3.3913999, -12.5385, -3.5373998, 3.3913999, -9.750299, -3.6144996, 3.1664, -10.4478, -3.2335, 3.1696, -9.965099, -3.5373998, 3.3913999, -9.750299, -3.9104, 3.3913999, -10.240799, -3.6144996, 3.1664, -10.4478, -3.6144996, 3.1664, -10.4478, -3.9104, 3.3913999, -12.1610985, -3.6476998, 3.1597998, -12.4415, -3.6144996, 3.1664, -10.4478, -3.9104, 3.3913999, -10.240799, -3.9104, 3.3913999, -12.1610985, -0.0046999454, 3.1827998, -9.064699, -3.5373998, 3.3913999, -9.750299, -3.2335, 3.1696, -9.965099, -0.0046999454, 3.1827998, -9.064699, 0, 3.3913999, -8.714399, -3.5373998, 3.3913999, -9.750299, 4.1105, 3.3913999, -9.3386, 3.149, 3.1724, -9.052198, 3.8465, 3.1766, -9.664, 4.1105, 3.3913999, -9.3386, 3.4176, 3.3913999, -8.714399, 3.149, 3.1724, -9.052198, 4.1105, 3.3913999, -9.3386, 4.413, 3.2091, -13.357899, 4.6816, 3.3913999, -13.378599, 4.1105, 3.3913999, -9.3386, 3.8465, 3.1766, -9.664, 4.413, 3.2091, -13.357899, 3.149, 3.1724, -9.052198, 0, 3.3913999, -8.714399, -0.0046999454, 3.1827998, -9.064699, 3.149, 3.1724, -9.052198, 3.4176, 3.3913999, -8.714399, 0, 3.3913999, -8.714399, -19.2812, 3.3913999, -6.6894, -19.611, 3.187, -9.246899, -19.3743, 3.391, -9.417299, -19.2812, 3.3913999, -6.6894, -19.515299, 3.2122, -6.6894, -19.611, 3.187, -9.246899, -16.1255, 3.4196, -10.133099, -16.240599, 3.3848999, -8.961699, -16.7605, 3.3848, -9.501299, -16.1255, 3.4196, -10.133099, -15.5737, 3.3848999, -9.614899, -16.240599, 3.3848999, -8.961699, -16.1255, 3.4196, -10.133099, -17.049099, 3.1696, -9.7829, -16.4075, 3.2108998, -10.402899, -16.1255, 3.4196, -10.133099, -16.7605, 3.3848, -9.501299, -17.049099, 3.1696, -9.7829, -16.7605, 3.3848, -9.501299, -19.1775, 3.1662998, -9.7628, -17.049099, 3.1696, -9.7829, -16.7605, 3.3848, -9.501299, -18.8297, 3.3895998, -9.473499, -19.1775, 3.1662998, -9.7628, -16.3755, 3.4225, -13.6283, -16.1255, 3.4196, -10.133099, -16.4075, 3.2108998, -10.402899, -16.3755, 3.4225, -13.6283, -16.1309, 3.6227, -13.6241, -16.1255, 3.4196, -10.133099, -16.240599, 3.3848999, -8.961699, -13.378799, 3.3913999, -6.6894, -16.723299, 3.3913999, -6.6894, -13.378799, 3.3913999, -6.6894, -16.240599, 3.3848999, -8.961699, -15.5737, 3.3848999, -9.614899, -13.378799, 3.3913999, -6.6894, -15.5737, 3.3848999, -9.614899, -13.378799, 3.3913999, -10.0343, -16.1309, 3.6227, -13.6241, -15.5737, 3.3848999, -9.614899, -16.1255, 3.4196, -10.133099, -15.5737, 3.3848999, -9.614899, -16.1309, 3.6227, -13.6241, -13.378799, 3.3913999, -13.378599, -15.5737, 3.3848999, -9.614899, -13.378799, 3.3913999, -13.378599, -13.378799, 3.3913999, -10.0343, -19.3743, 3.391, -9.417299, -16.723299, 3.3913999, -6.6894, -19.2812, 3.3913999, -6.6894, -16.723299, 3.3913999, -6.6894, -19.3743, 3.391, -9.417299, -16.7605, 3.3848, -9.501299, -16.7605, 3.3848, -9.501299, -19.3743, 3.391, -9.417299, -18.8297, 3.3895998, -9.473499, -16.723299, 3.3913999, -6.6894, -16.7605, 3.3848, -9.501299, -16.240599, 3.3848999, -8.961699, -19.754599, 3.3913999, -2.7854, -19.9515, 3.3913999, -2.5836997, -19.9495, 3.2063, -2.8084998, -19.754599, 3.3913999, -2.7854, -19.515299, 3.2122, -6.6894, -19.2812, 3.3913999, -6.6894, -19.754599, 3.3913999, -2.7854, -19.8424, 3.2077, -3.7668996, -19.515299, 3.2122, -6.6894, -22.7335, 3.5105, -2.4837003, -23.3864, 3.3542, -2.205, -22.931599, 3.3177998, -2.7097, -22.7335, 3.5105, -2.4837003, -23.1883, 3.5481, -1.9755001, -23.3864, 3.3542, -2.205, -23.1883, 3.5481, -1.9755001, -20.068499, 3.3913999, -0.000100016594, -23.171, 3.6251, 0.12290001, -20.068499, 3.3913999, -0.000100016594, -23.1883, 3.5481, -1.9755001, -22.7335, 3.5105, -2.4837003, -20.068499, 3.3913999, -0.000100016594, -22.7335, 3.5105, -2.4837003, -19.9515, 3.3913999, -2.5836997, -23.171, 3.6251, 0.12290001, -23.3864, 3.3542, -2.205, -23.1883, 3.5481, -1.9755001, -23.171, 3.6251, 0.12290001, -23.3678, 3.4459999, 0.13709998, -23.3864, 3.3542, -2.205, -22.7335, 3.5105, -2.4837003, -19.9495, 3.2063, -2.8084998, -19.9515, 3.3913999, -2.5836997, -22.7335, 3.5105, -2.4837003, -22.931599, 3.3177998, -2.7097, -19.9495, 3.2063, -2.8084998, -22.332499, 3.3913999, 8.990399, -22.5912, 3.2112, 9.44, -22.7647, 3.2136, 9.1158, -22.7647, 3.2136, 9.1158, -22.315199, 3.3913999, 6.6891, -22.332499, 3.3913999, 8.990399, -22.7647, 3.2136, 9.1158, -22.5639, 3.2219, 6.6891, -22.315199, 3.3913999, 6.6891, -22.5912, 3.2112, 9.44, -20.068499, 3.3913999, 9.1673, -20.068499, 3.1943, 9.406899, -22.5912, 3.2112, 9.44, -22.332499, 3.3913999, 8.990399, -20.068499, 3.3913999, 9.1673, -6.2755, 3.126, 16.1251, -5.9743, 3.3983, 13.383699, -5.9743, 3.393, 15.6513, -6.2755, 3.126, 16.1251, -6.2755, 3.126, 13.6215, -5.9743, 3.3983, 13.383699, -17.1362, 3.192, 9.7157, -16.285099, 3.3913999, 9.5862, -16.2818, 3.1913998, 9.8050995, -16.285099, 3.3913999, 9.5862, -16.0544, 3.3913999, 9.808, -16.2818, 3.1913998, 9.8050995, -16.285099, 3.3913999, 9.5862, -20.068499, 3.1943, 9.406899, -20.068499, 3.3913999, 9.1673, -16.285099, 3.3913999, 9.5862, -17.1362, 3.192, 9.7157, -20.068499, 3.1943, 9.406899, -16.1122, 3.066, 12.232401, -15.739201, 3.2087, 12.341301, -15.571699, 3.0688, 12.748899, -15.739201, 3.2087, 12.341301, -16.2818, 3.1913998, 9.8050995, -16.0544, 3.3913999, 9.808, -15.739201, 3.2087, 12.341301, -16.1122, 3.066, 12.232401, -16.2818, 3.1913998, 9.8050995, -13.378799, 3.3922, 12.5714, -15.571699, 3.0688, 12.748899, -15.739201, 3.2087, 12.341301, -13.378799, 3.3922, 12.5714, -13.378799, 3.1938999, 12.808599, -15.571699, 3.0688, 12.748899, -6.4743, 3.3766, 12.7861, -5.5162, 3.398, 12.9678, -5.9743, 3.3983, 13.383699, -6.4743, 3.3766, 12.7861, -6.088, 3.3981, 12.428801, -5.5162, 3.398, 12.9678, -6.4743, 3.3766, 12.7861, -6.2755, 3.126, 13.6215, -6.7781997, 3.1009, 13.0322, -6.4743, 3.3766, 12.7861, -5.9743, 3.3983, 13.383699, -6.2755, 3.126, 13.6215, -6.4743, 3.3766, 12.7861, -10.034201, 2.9384, 12.453701, -10.034201, 3.2142, 12.105801, -6.4743, 3.3766, 12.7861, -6.7781997, 3.1009, 13.0322, -10.034201, 2.9384, 12.453701, -10.034201, 3.3913999, 10.0334, -6.4743, 3.3766, 12.7861, -10.034201, 3.2142, 12.105801, -6.4743, 3.3766, 12.7861, -10.034201, 3.3913999, 10.0334, -6.6896996, 3.3913999, 10.0334, -6.4743, 3.3766, 12.7861, -6.6896996, 3.3913999, 10.0334, -6.088, 3.3981, 12.428801, -6.6896996, 3.3913999, 10.0334, -5.5162, 3.398, 12.9678, -6.088, 3.3981, 12.428801, -5.5162, 3.398, 12.9678, -6.6896996, 3.3913999, 10.0334, -3.3452, 3.4796999, 10.0334, -5.5162, 3.398, 12.9678, -3.3452, 3.4796999, 10.0334, -3.3452, 3.3913999, 13.3783, -5.9743, 3.393, 15.6513, -6.0454, 3.135, 16.5322, -6.2755, 3.126, 16.1251, -5.9743, 3.393, 15.6513, -5.5313997, 3.3918, 16.0056, -6.0454, 3.135, 16.5322, -6.0454, 3.135, 16.5322, -3.3452, 3.3913999, 15.601, -3.3452, 3.1497998, 15.914499, -6.0454, 3.135, 16.5322, -5.5313997, 3.3918, 16.0056, -3.3452, 3.3913999, 15.601, -5.9743, 3.3983, 13.383699, -5.5313997, 3.3918, 16.0056, -5.9743, 3.393, 15.6513, -5.5313997, 3.3918, 16.0056, -5.9743, 3.3983, 13.383699, -3.3452, 3.3913999, 13.3783, -3.3452, 3.3913999, 13.3783, -5.9743, 3.3983, 13.383699, -5.5162, 3.398, 12.9678, -5.5313997, 3.3918, 16.0056, -3.3452, 3.3913999, 13.3783, -3.3452, 3.3913999, 15.601, 2.7767, 3.0992, 16.3949, 3.6397, 3.3913999, 16.2405, 3.6729999, 3.1532, 16.5718, 3.6397, 3.3913999, 16.2405, 0, 2.9636998, 16.0175, 0, 3.2243998, 15.7092, 3.6397, 3.3913999, 16.2405, 2.7767, 3.0992, 16.3949, 0, 2.9636998, 16.0175, 3.9987998, 3.4764, 18.6069, 3.9143, 3.3913999, 16.5144, 6.6889997, 3.3913999, 16.7227, 3.8212, 3.3128, 18.7347, 4.941, 3.4643, 19.3458, 4.8006997, 3.3019998, 19.5215, 3.8212, 3.3128, 18.7347, 3.9987998, 3.4764, 18.6069, 4.941, 3.4643, 19.3458, 6.6923, 3.3525, 19.0394, 4.8006997, 3.3019998, 19.5215, 4.941, 3.4643, 19.3458, 6.6923, 3.3525, 19.0394, 6.7794, 3.1271, 19.2435, 4.8006997, 3.3019998, 19.5215, 3.6729999, 3.1532, 16.5718, 3.9987998, 3.4764, 18.6069, 3.8212, 3.3128, 18.7347, 3.6729999, 3.1532, 16.5718, 3.9143, 3.3913999, 16.5144, 3.9987998, 3.4764, 18.6069, 6.6889997, 3.3913999, 16.7227, 4.941, 3.4643, 19.3458, 3.9987998, 3.4764, 18.6069, 6.6923, 3.3525, 19.0394, 4.941, 3.4643, 19.3458, 6.6889997, 3.3913999, 16.7227, 8.6452, 3.3837, 18.872, 9.5275, 3.2163, 18.6602, 8.8241, 3.2010999, 19.0991, 8.6452, 3.3837, 18.872, 9.3605995, 3.3913, 18.4371, 9.5275, 3.2163, 18.6602, 8.6452, 3.3837, 18.872, 6.7794, 3.1271, 19.2435, 6.6923, 3.3525, 19.0394, 8.6452, 3.3837, 18.872, 8.8241, 3.2010999, 19.0991, 6.7794, 3.1271, 19.2435, 9.5275, 3.2163, 18.6602, 10.388599, 3.3911998, 16.7085, 10.590099, 3.2050998, 16.7167, 9.5275, 3.2163, 18.6602, 9.3605995, 3.3913, 18.4371, 10.388599, 3.3911998, 16.7085, 6.6889997, 3.3913999, 16.7227, 8.6452, 3.3837, 18.872, 6.6923, 3.3525, 19.0394, 8.6452, 3.3837, 18.872, 6.6889997, 3.3913999, 16.7227, 10.388599, 3.3911998, 16.7085, 8.6452, 3.3837, 18.872, 10.388599, 3.3911998, 16.7085, 9.3605995, 3.3913, 18.4371, 9.8819, 3.359, 13.619101, 9.838699, 3.359, 12.8258, 10.225699, 3.399, 13.197901, 9.8819, 3.359, 13.619101, 9.4411, 3.359, 13.2192, 9.838699, 3.359, 12.8258, 9.8819, 3.359, 13.619101, 10.462399, 3.2359, 13.4067, 10.122, 3.1906, 13.8256, 9.8819, 3.359, 13.619101, 10.225699, 3.399, 13.197901, 10.462399, 3.2359, 13.4067, 12.575499, 3.4812999, 13.4044, 10.225699, 3.399, 13.197901, 12.125999, 3.6032, 13.197901, 12.575499, 3.4812999, 13.4044, 10.462399, 3.2359, 13.4067, 10.225699, 3.399, 13.197901, 6.6889997, 3.3913999, 13.3783, 10.388599, 3.3911998, 16.7085, 6.6889997, 3.3913999, 16.7227, 10.388599, 3.3911998, 16.7085, 6.6889997, 3.3913999, 13.3783, 9.4411, 3.359, 13.2192, 10.388599, 3.3911998, 16.7085, 9.4411, 3.359, 13.2192, 9.8819, 3.359, 13.619101, 6.6889997, 3.3913999, 10.0334, 9.4411, 3.359, 13.2192, 6.6889997, 3.3913999, 13.3783, 9.4411, 3.359, 13.2192, 6.6889997, 3.3913999, 10.0334, 10.0335, 3.3913999, 10.0334, 9.4411, 3.359, 13.2192, 10.0335, 3.3913999, 10.0334, 9.838699, 3.359, 12.8258, 9.8819, 3.359, 13.619101, 10.590099, 3.2050998, 16.7167, 10.388599, 3.3911998, 16.7085, 9.8819, 3.359, 13.619101, 10.122, 3.1906, 13.8256, 10.590099, 3.2050998, 16.7167, 12.125999, 3.6032, 13.197901, 13.189199, 3.2312999, 12.5394, 13.262999, 3.3165998, 13.403801, 12.125999, 3.6032, 13.197901, 12.9445, 3.6148, 12.325901, 13.189199, 3.2312999, 12.5394, 13.262999, 3.3165998, 13.403801, 12.575499, 3.4812999, 13.4044, 12.125999, 3.6032, 13.197901, 13.189199, 3.2312999, 12.5394, 12.732399, 3.3913999, 10.0334, 12.977798, 3.2031, 10.0163, 13.189199, 3.2312999, 12.5394, 12.9445, 3.6148, 12.325901, 12.732399, 3.3913999, 10.0334, 10.0335, 3.3913999, 10.0334, 10.225699, 3.399, 13.197901, 9.838699, 3.359, 12.8258, 10.225699, 3.399, 13.197901, 10.0335, 3.3913999, 10.0334, 12.9445, 3.6148, 12.325901, 12.9445, 3.6148, 12.325901, 10.0335, 3.3913999, 10.0334, 12.732399, 3.3913999, 10.0334, 10.225699, 3.399, 13.197901, 12.9445, 3.6148, 12.325901, 12.125999, 3.6032, 13.197901, 12.8249, 2.8544, 7.9231997, 12.9499, 3.3256998, 8.668, 11.173199, 3.3332, 6.6548, 10.0335, 3.3913999, 6.6891, 10.0335, 3.3913999, 4.2546997, 11.173199, 3.3332, 6.6548, 12.732399, 3.3913999, 10.0334, 13.175299, 2.4743, 8.0415, 12.977798, 3.2031, 10.0163, 13.175299, 2.4743, 8.0415, 12.732399, 3.3913999, 10.0334, 12.9499, 3.3256998, 8.668, 13.175299, 2.4743, 8.0415, 12.9499, 3.3256998, 8.668, 12.8249, 2.8544, 7.9231997, 10.0335, 3.3913999, 6.6891, 12.732399, 3.3913999, 10.0334, 10.0335, 3.3913999, 10.0334, 12.732399, 3.3913999, 10.0334, 10.0335, 3.3913999, 6.6891, 11.173199, 3.3332, 6.6548, 12.732399, 3.3913999, 10.0334, 11.173199, 3.3332, 6.6548, 12.9499, 3.3256998, 8.668, 16.722599, 3.1513, -3.6023998, 15.810999, 2.9368, -3.3060002, 13.2491, 2.9931, -3.474, 16.722599, 3.1513, -3.6023998, 16.712599, 2.8734, -3.3451, 15.810999, 2.9368, -3.3060002, 10.0335, 3.2212, -2.2310996, 10.0335, 3.3913999, -3.3451, 13.2491, 2.9931, -3.474, -16.7232, 0.6137, 0, -15.754801, 0.6137, 3.5372, -16.7232, 0.6137, 2.9164, -15.754801, 0.6137, 3.5372, -16.7232, 0.6137, 0, -13.378601, 0.6137, 0, -16.7232, 0.6137, 0, -15.803801, 0.6137, -2.7093, -13.378601, 0.6137, -3.3446002, -16.7232, 0.6137, 0, -13.378601, 0.6137, -3.3446002, -13.378601, 0.6137, 0, -13.378601, 0.6137, 0, -13.378601, 0.6137, -3.3446002, -10.033899, 0.6137, -3.3446002, -15.754801, 0.6137, 3.5372, -13.378601, 0.6137, 0, -14.489201, 0.6137, 4.2777, -13.378601, 0.6137, 0, -10.033899, 0.6137, -3.3446002, -10.033899, 0.6137, 0, -14.489201, 0.6137, 4.2777, -13.378601, 0.6137, 0, -10.033899, 0.6137, 0, -10.033899, 0.6137, 0, -10.033899, 0.6137, -3.3446002, -6.6893, 0.6137, -3.3446002, -10.033899, 0.6137, 0, -6.6893, 0.6137, -3.3446002, -6.6893, 0.6137, 0, -6.6893, 0.6137, 0, -6.6893, 0.6137, -3.3446002, -4.0259, 0.6137, -1.6911998, -6.6893, 0.6137, 0, -4.0259, 0.6137, -1.6911998, -3.3446999, 0.6137, 0, -10.033899, 0.6137, 3.3446, -10.033899, 0.6137, 0, -6.6893, 0.6137, 0, -14.489201, 0.6137, 4.2777, -10.033899, 0.6137, 0, -10.033899, 0.6137, 3.3446, -6.6893, 0.6137, 3.3446, -6.6893, 0.6137, 0, -3.3446999, 0.6137, 0, -10.033899, 0.6137, 3.3446, -6.6893, 0.6137, 0, -6.6893, 0.6137, 3.3446, -6.6893, 0.6137, 3.3446, -3.3446999, 0.6137, 0, -3.3446999, 0.6137, 3.3446, -10.033899, 0.6137, 6.6893, -14.489201, 0.6137, 4.2777, -10.033899, 0.6137, 3.3446, -10.033899, 0.6137, 6.6893, -10.033899, 0.6137, 3.3446, -6.6893, 0.6137, 3.3446, -10.033899, 0.6137, 6.6893, -6.6893, 0.6137, 3.3446, -6.6893, 0.6137, 6.6893, -10.033899, 0.6137, 6.6893, -13.6772, 0.6137, 5.2616, -14.489201, 0.6137, 4.2777, -13.6772, 0.6137, 5.2616, -10.033899, 0.6137, 6.6893, -12.7477, 0.6137, 6.3669996, -6.6893, 0.6137, 3.3446, -2.5675998, 0.0266, 7.6215, -6.6893, 0.6137, 6.6893, -2.5675998, 0.0266, 7.6215, -6.6893, 0.6137, 3.3446, -3.3446999, 0.6137, 3.3446, -2.5675998, 0.0266, 7.6215, -3.3446999, 0.6137, 3.3446, -2.1193, 0.6137, 5.2736, 10.033899, 0, -20.467, 6.6766996, 3.0570998, -19.0275, 6.6893, 0, -20.1318, 10.033899, 0, -20.467, 10.033899, 3.0523999, -19.0294, 6.6766996, 3.0570998, -19.0275, 3.0140998, 0, -16.7232, 4.4131, 3.2091, -13.357698, 3.3446, -0.3989, -12.9443, 3.0140998, 0, -16.7232, 3.5895, 3.2033, -16.7232, 4.4131, 3.2091, -13.357698, -6.6893, 0, -14.263699, -10.404301, 3.1608999, -13.429499, -9.6168995, 0, -14.127899, -6.6893, 0, -14.263699, -6.6893, 3.175, -12.866999, -10.404301, 3.1608999, -13.429499, -23.412498, -0.2913, 0.26119995, -23.0793, 3.314, 3.3674998, -23.412498, 0, 3.3446, -23.412498, -0.2913, 0.26119995, -23.3676, 3.4459999, 0.1372, -23.0793, 3.314, 3.3674998, -23.412498, 0, 3.3446, -22.563799, 3.2219, 6.6893, -23.8078, 0, 6.6893, -23.412498, 0, 3.3446, -23.0793, 3.314, 3.3674998, -22.563799, 3.2219, 6.6893, -13.378601, 0, 13.378601, -10.033899, 2.9384, 12.453701, -10.033899, 0, 13.378601, -13.378601, 0, 13.378601, -13.378601, 3.194, 12.808901, -10.033899, 2.9384, 12.453701, -3.3446002, 0, 16.7232, 0, 2.9636998, 16.0179, 0, 0, 16.7232, -3.3446002, 0, 16.7232, -3.3446002, 3.1497998, 15.9146, 0, 2.9636998, 16.0179, 21.2349, 0, -6.6893, 20.188799, 3.1655998, -10.014999, 21.8888, 0, -10.033899, 21.2349, 0, -6.6893, 20.147, 3.0588999, -6.6893, 20.188799, 3.1655998, -10.014999, 20.1586, 3.1318998, -13.0413, 20.809599, 0, -13.7309, 21.251299, 0, -13.3043995, 20.1586, 3.1318998, -13.0413, 19.7684, 3.1308, -13.405399, 20.809599, 0, -13.7309, 20.809599, 0, -13.7309, 16.8128, 3.1578999, -13.463299, 18.0241, 0, -14.301899, 20.809599, 0, -13.7309, 19.7684, 3.1308, -13.405399, 16.8128, 3.1578999, -13.463299, 21.8888, 0, -10.033899, 20.1586, 3.1318998, -13.0413, 21.251299, 0, -13.3043995, 21.8888, 0, -10.033899, 20.188799, 3.1655998, -10.014999, 20.1586, 3.1318998, -13.0413, 16.7704, 3.1685998, -15.819698, 16.3113, 0, -16.9629, 17.503, 0, -15.940498, 16.7704, 3.1685998, -15.819698, 15.8286, 3.1678, -16.6059, 16.3113, 0, -16.9629, 16.3113, 0, -16.9629, 12.747099, 3.1769, -16.199, 13.701399, 0, -17.416399, 16.3113, 0, -16.9629, 15.8286, 3.1678, -16.6059, 12.747099, 3.1769, -16.199, 18.0241, 0, -14.301899, 16.7704, 3.1685998, -15.819698, 17.503, 0, -15.940498, 18.0241, 0, -14.301899, 16.8128, 3.1578999, -13.463299, 16.7704, 3.1685998, -15.819698, 12.961399, 0, -20.5828, 12.727098, 2.9599, -18.8239, 12.2999, 2.942, -19.2491, 12.961399, 0, -20.5828, 13.423399, 0, -20.1574, 12.727098, 2.9599, -18.8239, 12.961399, 0, -20.5828, 10.033899, 3.0523999, -19.0294, 10.033899, 0, -20.467, 12.961399, 0, -20.5828, 12.2999, 2.942, -19.2491, 10.033899, 3.0523999, -19.0294, 13.701399, 0, -17.416399, 12.727098, 2.9599, -18.8239, 13.423399, 0, -20.1574, 13.701399, 0, -17.416399, 12.747099, 3.1769, -16.199, 12.727098, 2.9599, -18.8239, 3.2372, 0, -19.3395, 5.4684, 3.0900998, -18.6069, 3.9039, 3.1690998, -17.2691, 3.2372, 0, -19.3395, 4.4523, 0, -20.444399, 5.4684, 3.0900998, -18.6069, 6.6893, 0, -20.1318, 5.4684, 3.0900998, -18.6069, 4.4523, 0, -20.444399, 6.6893, 0, -20.1318, 6.6766996, 3.0570998, -19.0275, 5.4684, 3.0900998, -18.6069, 3.2372, 0, -19.3395, 3.5895, 3.2033, -16.7232, 3.0140998, 0, -16.7232, 3.2372, 0, -19.3395, 3.9039, 3.1690998, -17.2691, 3.5895, 3.2033, -16.7232, -15.441, 3.3151, -15.753099, -16.7232, 0, -16.113699, -16.1493, 0, -16.8284, -15.441, 3.3151, -15.753099, -16.1238, 3.3711998, -15.15, -16.7232, 0, -16.113699, -16.7232, 0, -16.113699, -16.3753, 3.4225, -13.627699, -16.7232, 0, -13.378599, -16.7232, 0, -16.113699, -16.1238, 3.3711998, -15.15, -16.3753, 3.4225, -13.627699, -13.378601, 0, -17.3364, -15.441, 3.3151, -15.753099, -16.1493, 0, -16.8284, -13.378601, 0, -17.3364, -13.3848, 3.1832, -15.7598, -15.441, 3.3151, -15.753099, -10.3452, 0, -16.7803, -10.4286995, 3.1564, -15.832399, -10.7493, 3.1581, -16.1132, -10.3452, 0, -16.7803, -9.983101, 0, -16.4067, -10.4286995, 3.1564, -15.832399, -10.3452, 0, -16.7803, -13.3848, 3.1832, -15.7598, -13.378601, 0, -17.3364, -10.3452, 0, -16.7803, -10.7493, 3.1581, -16.1132, -13.3848, 3.1832, -15.7598, -9.6168995, 0, -14.127899, -10.4286995, 3.1564, -15.832399, -9.983101, 0, -16.4067, -9.6168995, 0, -14.127899, -10.404301, 3.1608999, -13.429499, -10.4286995, 3.1564, -15.832399, -3.6946998, 0, -13.471199, -3.6475997, 3.1597998, -12.441198, -4.0183997, 3.1606, -12.819899, -3.6946998, 0, -13.471199, -3.2535, 0, -13.020899, -3.6475997, 3.1597998, -12.441198, -3.6946998, 0, -13.471199, -6.6893, 3.175, -12.866999, -6.6893, 0, -14.263699, -3.6946998, 0, -13.471199, -4.0183997, 3.1606, -12.819899, -6.6893, 3.175, -12.866999, -3.2331, 3.1696, -9.964899, -2.7220998, 0, -10.936998, -2.2352996, 0, -10.6031, -3.2331, 3.1696, -9.964899, -3.6138997, 3.1664, -10.447599, -2.7220998, 0, -10.936998, 0, 0, -10.7654, -3.2331, 3.1696, -9.964899, -2.2352996, 0, -10.6031, 0, 0, -10.7654, -0.0039999485, 3.1827998, -9.0644, -3.2331, 3.1696, -9.964899, -2.7220998, 0, -10.936998, -3.6475997, 3.1597998, -12.441198, -3.2535, 0, -13.020899, -2.7220998, 0, -10.936998, -3.6138997, 3.1664, -10.447599, -3.6475997, 3.1597998, -12.441198, 3.847, 3.1766, -9.663599, 2.2182999, 0, -10.525, 2.9573, -0.1021, -11.0952, 3.847, 3.1766, -9.663599, 3.1496, 3.1724, -9.052, 2.2182999, 0, -10.525, 3.3446, -0.3989, -12.9443, 3.847, 3.1766, -9.663599, 2.9573, -0.1021, -11.0952, 3.3446, -0.3989, -12.9443, 4.4131, 3.2091, -13.357698, 3.847, 3.1766, -9.663599, 2.2182999, 0, -10.525, -0.0039999485, 3.1827998, -9.0644, 0, 0, -10.7654, 2.2182999, 0, -10.525, 3.1496, 3.1724, -9.052, -0.0039999485, 3.1827998, -9.0644, -20.108599, 0, -9.592199, -19.176899, 3.1662998, -9.762199, -19.6161, 3.2075999, -9.711699, -20.108599, 0, -9.592199, -19.6286, 0, -10.1098995, -19.176899, 3.1662998, -9.762199, -19.6161, 3.2075999, -9.711699, -20.3764, 0, -6.6893, -20.108599, 0, -9.592199, -20.3764, 0, -6.6893, -19.6161, 3.2075999, -9.711699, -19.610699, 3.187, -9.246599, -20.3764, 0, -6.6893, -19.610699, 3.187, -9.246599, -19.515, 3.2122, -6.6893, -16.407099, 3.2108998, -10.4028, -17.8929, 0, -10.41, -17.1586, 0, -11.120298, -16.407099, 3.2108998, -10.4028, -17.0486, 3.1696, -9.782799, -17.8929, 0, -10.41, -16.7232, 0, -13.378599, -16.407099, 3.2108998, -10.4028, -17.1586, 0, -11.120298, -16.7232, 0, -13.378599, -16.3753, 3.4225, -13.627699, -16.407099, 3.2108998, -10.4028, -17.8929, 0, -10.41, -19.176899, 3.1662998, -9.762199, -19.6286, 0, -10.1098995, -17.8929, 0, -10.41, -17.0486, 3.1696, -9.782799, -19.176899, 3.1662998, -9.762199, -19.841799, 3.2077, -3.7668, -19.7545, 3.3913999, -2.7851996, -19.9489, 3.2063, -2.8082, -19.841799, 3.2077, -3.7668, -21.0086, -0.2504, -3.5043998, -20.1607, -0.2436, -4.5060997, -19.841799, 3.2077, -3.7668, -19.9489, 3.2063, -2.8082, -21.0086, -0.2504, -3.5043998, -20.3764, 0, -6.6893, -19.841799, 3.2077, -3.7668, -20.1607, -0.2436, -4.5060997, -20.3764, 0, -6.6893, -19.515, 3.2122, -6.6893, -19.841799, 3.2077, -3.7668, -22.9314, 3.3177998, -2.7092, -23.412498, -0.0385, -2.8684, -22.9552, -0.047599997, -3.375, -22.9314, 3.3177998, -2.7092, -23.3864, 3.3542, -2.2045999, -23.412498, -0.0385, -2.8684, -23.412498, -0.0385, -2.8684, -23.3676, 3.4459999, 0.1372, -23.412498, -0.2913, 0.26119995, -23.412498, -0.0385, -2.8684, -23.3864, 3.3542, -2.2045999, -23.3676, 3.4459999, 0.1372, -21.0086, -0.2504, -3.5043998, -22.9314, 3.3177998, -2.7092, -22.9552, -0.047599997, -3.375, -21.0086, -0.2504, -3.5043998, -19.9489, 3.2063, -2.8082, -22.9314, 3.3177998, -2.7092, -22.756899, 0, 10.033899, -22.7643, 3.2136, 9.1159, -22.5907, 3.2112, 9.440499, -22.756899, 0, 10.033899, -23.489, 0, 9.386499, -22.7643, 3.2136, 9.1159, -23.8078, 0, 6.6893, -22.7643, 3.2136, 9.1159, -23.489, 0, 9.386499, -23.8078, 0, 6.6893, -22.563799, 3.2219, 6.6893, -22.7643, 3.2136, 9.1159, -16.7232, 0, 10.8878, -17.1359, 3.192, 9.715799, -16.2818, 3.1913998, 9.8056, -16.7232, 0, 10.8878, -17.583, 0, 10.033899, -17.1359, 3.192, 9.715799, -20.0679, 0, 10.033899, -17.1359, 3.192, 9.715799, -17.583, 0, 10.033899, -20.0679, 0, 10.033899, -20.0679, 3.1943, 9.407499, -17.1359, 3.192, 9.715799, -16.111599, 3.066, 12.2328, -16.223, 0, 13.378601, -16.7232, 0, 12.878401, -16.111599, 3.066, 12.2328, -15.5713005, 3.0688999, 12.748899, -16.223, 0, 13.378601, -16.223, 0, 13.378601, -13.378601, 3.194, 12.808901, -13.378601, 0, 13.378601, -16.223, 0, 13.378601, -15.5713005, 3.0688999, 12.748899, -13.378601, 3.194, 12.808901, -16.7232, 0, 10.8878, -16.111599, 3.066, 12.2328, -16.7232, 0, 12.878401, -16.7232, 0, 10.8878, -16.2818, 3.1913998, 9.8056, -16.111599, 3.066, 12.2328, -6.6893, 0, 13.8773, -6.7777, 3.1009, 13.0326, -6.2748, 3.126, 13.622, -6.6893, 0, 13.8773, -7.1966996, 0, 13.378601, -6.7777, 3.1009, 13.0326, -10.033899, 0, 13.378601, -6.7777, 3.1009, 13.0326, -7.1966996, 0, 13.378601, -10.033899, 0, 13.378601, -10.033899, 2.9384, 12.453701, -6.7777, 3.1009, 13.0326, -6.1093993, 0, 16.7232, -6.2748, 3.1260998, 16.1257, -6.0452, 3.135, 16.5325, -6.1093993, 0, 16.7232, -6.6893, 0, 16.1455, -6.2748, 3.1260998, 16.1257, -6.1093993, 0, 16.7232, -3.3446002, 3.1497998, 15.9146, -3.3446002, 0, 16.7232, -6.1093993, 0, 16.7232, -6.0452, 3.135, 16.5325, -3.3446002, 3.1497998, 15.9146, -6.6893, 0, 13.8773, -6.2748, 3.1260998, 16.1257, -6.6893, 0, 16.1455, -6.6893, 0, 13.8773, -6.2748, 3.126, 13.622, -6.2748, 3.1260998, 16.1257, 3.3446, 0, 17.592, 2.777, 3.0992, 16.3951, 3.6736, 3.1532, 16.5721, 3.3446, 0, 17.592, 2.4738998, 0, 16.7232, 2.777, 3.0992, 16.3951, 0, 0, 16.7232, 2.777, 3.0992, 16.3951, 2.4738998, 0, 16.7232, 0, 0, 16.7232, 0, 2.9636998, 16.0179, 2.777, 3.0992, 16.3951, 3.3446, 0, 17.592, 3.8212998, 3.3128, 18.735199, 3.3446, 0, 19.1425, 3.3446, 0, 17.592, 3.6736, 3.1532, 16.5721, 3.8212998, 3.3128, 18.735199, 4.275, 0, 20.0679, 6.7795997, 3.1271, 19.243599, 6.6893, 0, 20.0679, 4.275, 0, 20.0679, 4.8012, 3.3019998, 19.5215, 6.7795997, 3.1271, 19.243599, 3.8212998, 3.3128, 18.735199, 4.275, 0, 20.0679, 3.3446, 0, 19.1425, 3.8212998, 3.3128, 18.735199, 4.8012, 3.3019998, 19.5215, 4.275, 0, 20.0679, -22.756899, 0, 10.033899, -20.0679, 3.1943, 9.407499, -20.0679, 0, 10.033899, -22.756899, 0, 10.033899, -22.5907, 3.2112, 9.440499, -20.0679, 3.1943, 9.407499, 10.572599, 0, 19.5895, 8.8245, 3.2012, 19.0993, 9.5278, 3.2163, 18.6607, 10.572599, 0, 19.5895, 10.080299, 0, 20.0679, 8.8245, 3.2012, 19.0993, 6.6893, 0, 20.0679, 8.8245, 3.2012, 19.0993, 10.080299, 0, 20.0679, 6.6893, 0, 20.0679, 6.7795997, 3.1271, 19.243599, 8.8245, 3.2012, 19.0993, 10.572599, 0, 19.5895, 10.5903, 3.2052, 16.7169, 10.572599, 0, 16.7232, 10.572599, 0, 19.5895, 9.5278, 3.2163, 18.6607, 10.5903, 3.2052, 16.7169, 10.986898, 0, 13.9188, 10.122399, 3.1906, 13.826099, 10.462799, 3.2359, 13.406799, 10.986898, 0, 13.9188, 10.572599, 0, 14.3402, 10.122399, 3.1906, 13.826099, 10.572599, 0, 16.7232, 10.122399, 3.1906, 13.826099, 10.572599, 0, 14.3402, 10.572599, 0, 16.7232, 10.5903, 3.2052, 16.7169, 10.122399, 3.1906, 13.826099, 13.8046, 0, 13.2202, 12.5756, 3.4812999, 13.4049, 13.2631, 3.3165998, 13.404301, 13.8046, 0, 13.2202, 13.105099, 0, 13.9188, 12.5756, 3.4812999, 13.4049, 13.2631, 3.3165998, 13.404301, 13.8046, 0, 10.033899, 13.8046, 0, 13.2202, 13.8046, 0, 10.033899, 13.2631, 3.3165998, 13.404301, 13.1894, 3.2312999, 12.539801, 13.8046, 0, 10.033899, 13.1894, 3.2312999, 12.539801, 12.9783, 3.2031, 10.0168, 10.986898, 0, 13.9188, 12.5756, 3.4812999, 13.4049, 13.105099, 0, 13.9188, 10.986898, 0, 13.9188, 10.462799, 3.2359, 13.406799, 12.5756, 3.4812999, 13.4049, 13.8046, 0, 10.033899, 13.175798, 2.4743, 8.042, 14.0257, 0.0442, 7.3252997, 13.8046, 0, 10.033899, 12.9783, 3.2031, 10.0168, 13.175798, 2.4743, 8.042, 20.1399, 2.779, -3.3615003, 21.09, -0.0218, -4.9179, 20.613499, 1.0832, -3.1922002, 21.09, -0.0218, -4.9179, 20.1399, 2.779, -3.3615003, 20.147, 3.0588999, -6.6893, 21.09, -0.0218, -4.9179, 20.147, 3.0588999, -6.6893, 21.2349, 0, -6.6893, 15.6619, 2.2603, -2.7998996, 20.1399, 2.779, -3.3615003, 20.613499, 1.0832, -3.1922002, 20.1399, 2.779, -3.3615003, 15.6619, 2.2603, -2.7998996, 16.7127, 2.8734, -3.3446002, 16.7127, 2.8734, -3.3446002, 15.6619, 2.2603, -2.7998996, 15.810999, 2.9368, -3.3059, 13.249599, 2.9931998, -3.4737, 15.810999, 2.9368, -3.3059, 14.217899, 2.8779, -3.3838, 14.217899, 2.8779, -3.3838, 15.810999, 2.9368, -3.3059, 15.6619, 2.2603, -2.7998996, -16.7232, 3.0033998, 2.9164, -15.754801, 0.6137, 3.5372, -15.372101, 3.0033998, 3.6132, -16.7232, 3.0033998, 2.9164, -16.7232, 0.6137, 2.9164, -15.754801, 0.6137, 3.5372, -14.489201, 3.0033998, 4.2777, -13.6772, 0.6137, 5.2616, -13.694401, 3.0033998, 5.1798, -14.489201, 3.0033998, 4.2777, -14.489201, 0.6137, 4.2777, -13.6772, 0.6137, 5.2616, -15.803801, 3.0033998, -2.7093, -16.7232, 0.6137, 0, -16.7232, 3.0033998, 0, -15.803801, 3.0033998, -2.7093, -15.803801, 0.6137, -2.7093, -16.7232, 0.6137, 0, -16.7232, 3.0033998, 0, -16.7232, 0.6137, 2.9164, -16.7232, 3.0033998, 2.9164, -16.7232, 3.0033998, 0, -16.7232, 0.6137, 0, -16.7232, 0.6137, 2.9164, -3.3446999, 3.0033998, 0, -4.0259, 0.6137, -1.6911998, -4.0259, 3.0033998, -1.6911998, -3.3446999, 3.0033998, 0, -3.3446999, 0.6137, 0, -4.0259, 0.6137, -1.6911998, -3.3446999, 3.0033998, 3.3446, -3.3446999, 0.6137, 0, -3.3446999, 3.0033998, 0, -3.3446999, 3.0033998, 3.3446, -3.3446999, 0.6137, 3.3446, -3.3446999, 0.6137, 0, -12.7477, 3.0033998, 6.3669996, -10.033899, 0.6137, 6.6893, -10.033899, 3.0033998, 6.6893, -12.7477, 3.0033998, 6.3669996, -12.7477, 0.6137, 6.3669996, -10.033899, 0.6137, 6.6893, -10.033899, 3.0033998, -3.3446002, -13.378601, 0.6137, -3.3446002, -13.378601, 3.0033998, -3.3446002, -10.033899, 3.0033998, -3.3446002, -10.033899, 0.6137, -3.3446002, -13.378601, 0.6137, -3.3446002, -6.6893, 3.0033998, -3.3446002, -10.033899, 0.6137, -3.3446002, -10.033899, 3.0033998, -3.3446002, -6.6893, 3.0033998, -3.3446002, -6.6893, 0.6137, -3.3446002, -10.033899, 0.6137, -3.3446002, -13.378601, 3.0033998, -3.3446002, -15.803801, 0.6137, -2.7093, -15.803801, 3.0033998, -2.7093, -13.378601, 3.0033998, -3.3446002, -13.378601, 0.6137, -3.3446002, -15.803801, 0.6137, -2.7093, -4.0259, 3.0033998, -1.6911998, -6.6893, 0.6137, -3.3446002, -6.6893, 3.0033998, -3.3446002, -4.0259, 3.0033998, -1.6911998, -4.0259, 0.6137, -1.6911998, -6.6893, 0.6137, -3.3446002, -6.6893, 3.0033998, 6.6893, -2.5675998, 0.0266, 7.6215, -2.5675998, 2.9782, 7.6215, -6.6893, 3.0033998, 6.6893, -6.6893, 0.6137, 6.6893, -2.5675998, 0.0266, 7.6215, -10.033899, 3.0033998, 6.6893, -6.6893, 0.6137, 6.6893, -6.6893, 3.0033998, 6.6893, -10.033899, 3.0033998, 6.6893, -10.033899, 0.6137, 6.6893, -6.6893, 0.6137, 6.6893, -2.5675998, 2.9782, 7.6215, -2.1193, 0.6137, 5.2736, -2.1397996, 3.0033998, 5.1794, -2.5675998, 2.9782, 7.6215, -2.5675998, 0.0266, 7.6215, -2.1193, 0.6137, 5.2736, -2.1193, 0.6137, 5.2736, -3.3446999, 3.0033998, 3.3446, -2.1397996, 3.0033998, 5.1794, -2.1193, 0.6137, 5.2736, -3.3446999, 0.6137, 3.3446, -3.3446999, 3.0033998, 3.3446, -13.6772, 0.6137, 5.2616, -12.7477, 3.0033998, 6.3669996, -13.694401, 3.0033998, 5.1798, -13.6772, 0.6137, 5.2616, -12.7477, 0.6137, 6.3669996, -12.7477, 3.0033998, 6.3669996, -15.754801, 0.6137, 3.5372, -14.489201, 3.0033998, 4.2777, -15.372101, 3.0033998, 3.6132, -15.754801, 0.6137, 3.5372, -14.489201, 0.6137, 4.2777, -14.489201, 3.0033998, 4.2777, -3.3446002, -1.4008, -23.412498, 0, -1.0608, -26.7572, 0, -0.9271, -23.412498, -3.3446002, -1.4008, -23.412498, -3.3446002, -1.458, -26.7572, 0, -1.0608, -26.7572, -16.7232, -1.7572, -23.412498, -13.378601, -2.7663999, -26.7572, -13.378601, -1.3177999, -23.412498, -16.7232, -1.7572, -23.412498, -16.7232, -3.0929, -26.7572, -13.378601, -2.7663999, -26.7572, 10.033899, 0, -23.412498, 13.378599, -0.8401, -26.7572, 13.378599, 0, -23.412498, 10.033899, 0, -23.412498, 10.033899, -0.8648, -26.7572, 13.378599, -0.8401, -26.7572, 3.3446, -0.3434, -23.412498, 6.6893, -1.0129, -26.7572, 6.6893, 0, -23.412498, 3.3446, -0.3434, -23.412498, 3.3446, -0.98829997, -26.7572, 6.6893, -1.0129, -26.7572, -23.412498, -2.7663999, -23.412498, -20.0679, -3.0929, -26.7572, -20.0679, -2.7663999, -23.412498, -23.412498, -2.7663999, -23.412498, -23.412498, -3.0929, -26.7572, -20.0679, -3.0929, -26.7572, -26.7572, -2.7663999, -23.412498, -23.412498, -3.0929, -26.7572, -23.412498, -2.7663999, -23.412498, -26.7572, -2.7663999, -23.412498, -26.7572, -3.0929, -26.7572, -23.412498, -3.0929, -26.7572, -23.412498, -0.7606, -16.7232, -20.0679, -1.7572, -20.0679, -20.0679, -0.43429998, -16.7232, -23.412498, -0.7606, -16.7232, -23.412498, -2.7663999, -20.0679, -20.0679, -1.7572, -20.0679, -10.033899, -0.2814, 23.412498, -6.6893, 0, 20.0679, -6.6893, -0.2814, 23.412498, -6.6893, -0.2814, 23.412498, -6.6893, 0, 20.0679, -3.3446002, 0, 20.0679, -10.033899, -0.2814, 23.412498, -10.033899, 0, 20.0679, -6.6893, 0, 20.0679, -6.6893, -0.2814, 23.412498, -3.3446002, 0, 20.0679, -3.3446002, -0.2814, 23.412498, -3.3446002, -0.2814, 23.412498, -3.3446002, 0, 20.0679, 0, 0, 20.0679, -3.3446002, -0.2814, 23.412498, 0, 0, 20.0679, 0, -0.2814, 23.412498, -13.378601, 0, 20.0679, -10.033899, 0, 20.0679, -10.033899, -0.2814, 23.412498, -13.378601, 0, 20.0679, -10.033899, -0.2814, 23.412498, -12.357901, -0.2814, 23.412498, -13.378601, -0.2814, 23.412498, -13.378601, 0, 20.0679, -12.357901, -0.2814, 23.412498, -23.412498, -0.36479998, 16.7232, -23.412498, 0, 13.378601, -20.0679, -0.36479998, 16.7232, -23.412498, 0, 13.378601, -20.0679, 0, 13.378601, -20.0679, -0.36479998, 16.7232, -23.412498, -0.7373, 23.412498, -23.412498, -0.692, 20.0679, -20.0679, -0.5589, 23.412498, -16.7232, -0.36479998, 23.412498, -16.7232, -0.36479998, 20.0679, -13.378601, -0.2814, 23.412498, 16.7232, -1.0746, 16.7232, 20.0679, -1.0746, 13.378601, 20.0679, -1.8294, 16.7232, 20.0679, -1.8294, 16.7232, 20.0679, -1.0746, 13.378601, 23.412498, -1.8294, 13.378601, 16.7232, -1.8294, 20.0679, 16.7232, -1.0746, 16.7232, 20.0679, -1.8294, 16.7232, 16.7232, -2.2719998, 23.3902, 20.0679, -1.8294, 20.0679, 20.0679, -2.2719998, 23.3902, 16.7232, -2.2719998, 23.3902, 16.7232, -1.8294, 20.0679, 20.0679, -1.8294, 20.0679, 16.7232, -1.8294, 20.0679, 16.7232, -2.2719998, 23.3902, 13.378599, -2.2719998, 23.3902, 20.0679, -2.2719998, 23.3902, 20.0679, -1.8294, 20.0679, 23.412498, -1.8294, 20.0679, 20.0679, -2.2719998, 23.3902, 23.412498, -1.8294, 20.0679, 23.412498, -2.2719998, 23.3902, 23.412498, -1.8294, 20.0679, 26.7582, -2.2719998, 23.3902, 23.412498, -2.2719998, 23.3902, 23.412498, -1.8294, 20.0679, 26.7582, -1.8294, 20.0679, 26.7582, -2.2719998, 23.3902, -10.033899, -0.9271, -23.412498, -6.6893, -1.458, -26.7572, -6.6893, -1.3241999, -23.412498, -10.033899, -0.9271, -23.412498, -10.033899, -1.8786, -26.7572, -6.6893, -1.458, -26.7572, -3.3446002, -0.9271, -16.7232, 0, -0.9271, -20.0679, 0, -0.9271, -16.7232, -3.3446002, -0.9271, -16.7232, -3.3446002, -0.9271, -20.0679, 0, -0.9271, -20.0679, -6.6893, -0.9271, -20.0679, -3.3446002, -0.9271, -20.0679, -3.3446002, -0.9271, -16.7232, 16.7232, -0.3105, -23.412498, 16.7232, -1.3382, -26.7572, 20.0679, -0.8222, -23.412498, 20.0679, 0, -16.7232, 20.0679, -0.2837, -20.0679, 23.412498, -0.456, -16.7232, 13.378599, 0, -23.412498, 13.378599, -0.8401, -26.7572, 16.7232, -0.3105, -23.412498, 16.7232, 0, -20.0679, 16.7232, -0.3105, -23.412498, 20.0679, -0.2837, -20.0679, -6.6893, 0, -16.7232, -6.6893, -0.9271, -20.0679, -3.3446002, -0.9271, -16.7232, -13.378601, -1.3177999, -23.412498, -10.033899, -1.8786, -26.7572, -10.033899, -0.9271, -23.412498, -13.378601, -1.3177999, -23.412498, -13.378601, -2.7663999, -26.7572, -10.033899, -1.8786, -26.7572, -13.210501, -0.3964, -20.032099, -10.033899, -0.9271, -23.412498, -9.318001, -0.3969, -19.413, -13.210501, -0.3964, -20.032099, -13.378601, -1.3177999, -23.412498, -10.033899, -0.9271, -23.412498, -9.318001, -0.3969, -19.413, -10.033899, -0.9271, -23.412498, -6.6893, -0.9271, -20.0679, 20.0679, -1.0746, 13.378601, 20.0679, 0, 10.033899, 23.412498, -0.35529998, 10.033899, 13.378599, -2.2719998, 23.3902, 16.7232, -2.2194998, 26.781, 13.378599, -2.2194998, 26.781, 13.378599, -2.2719998, 23.3902, 16.7232, -2.2719998, 23.3902, 16.7232, -2.2194998, 26.781, 16.7232, -2.2194998, 26.781, 16.7232, -2.2719998, 23.3902, 20.0679, -2.2719998, 23.3902, 16.7232, -2.2194998, 26.781, 20.0679, -2.2719998, 23.3902, 20.0679, -2.2194998, 26.781, 20.0679, -2.2194998, 26.781, 20.0679, -2.2719998, 23.3902, 23.412498, -2.2719998, 23.3902, 20.0679, -2.2194998, 26.781, 23.412498, -2.2719998, 23.3902, 23.412498, -2.2194998, 26.781, 13.378599, -1.0746, 20.0679, 15.0508995, -0.40039998, 16.7232, 16.7232, -1.0746, 16.7232, 16.7232, -1.0746, 13.378601, 16.7232, 0, 10.033899, 20.0679, 0, 10.033899, 20.0679, 0, 10.033899, 20.0679, -1.0746, 13.378601, 16.7232, -1.0746, 13.378601, 6.6893, -1.1209999, 26.7572, 10.033899, -0.501, 23.412498, 10.033899, -1.1209999, 26.7572, 6.6893, -1.1209999, 26.7572, 6.6893, -0.2814, 23.412498, 10.033899, -0.501, 23.412498, 10.033899, -1.1209999, 26.7572, 13.378599, -2.2719998, 23.3902, 13.378599, -2.2194998, 26.781, 10.033899, -1.1209999, 26.7572, 10.033899, -0.501, 23.412498, 13.378599, -2.2719998, 23.3902, 0, -1.1209999, 26.7572, 3.3446, -0.2814, 23.412498, 3.3446, -1.1209999, 26.7572, 3.3446, -1.1209999, 26.7572, 3.3446, -0.2814, 23.412498, 6.6893, -0.2814, 23.412498, 3.3446, -1.1209999, 26.7572, 6.6893, -0.2814, 23.412498, 6.6893, -1.1209999, 26.7572, 0, -1.1209999, 26.7572, 0, -0.2814, 23.412498, 3.3446, -0.2814, 23.412498, -3.3446002, -1.1209999, 26.7572, 0, -0.2814, 23.412498, 0, -1.1209999, 26.7572, -3.3446002, -1.1209999, 26.7572, -3.3446002, -0.2814, 23.412498, 0, -0.2814, 23.412498, -6.6893, -1.1209999, 26.7572, -3.3446002, -0.2814, 23.412498, -3.3446002, -1.1209999, 26.7572, -6.6893, -1.1209999, 26.7572, -6.6893, -0.2814, 23.412498, -3.3446002, -0.2814, 23.412498, -10.033899, -1.1209999, 26.7572, -6.6893, -0.2814, 23.412498, -6.6893, -1.1209999, 26.7572, -10.033899, -1.1209999, 26.7572, -10.033899, -0.2814, 23.412498, -6.6893, -0.2814, 23.412498, -10.033899, -1.1209999, 26.7572, -12.357901, -0.2814, 23.412498, -10.033899, -0.2814, 23.412498, -10.033899, -1.1209999, 26.7572, -13.378601, -0.2814, 23.412498, -12.357901, -0.2814, 23.412498, -13.378601, -0.2814, 23.412498, -10.033899, -1.1209999, 26.7572, -13.378601, -1.1209999, 26.7572, 16.7232, -1.0746, 13.378601, 15.0508995, -0.6288, 13.378601, 16.7232, 0, 10.033899, -29.294899, -0.6617, 3.3446, -25.479, -0.4588, 0.143, -25.869999, -0.2764, 3.3446, -29.294899, -0.6617, 3.3446, -27.9812, -0.6617, 0, -25.479, -0.4588, 0.143, -29.294899, -0.6617, 6.6893, -25.869999, -0.2764, 3.3446, -25.945799, -0.25779998, 6.6893, -29.294899, -0.6617, 6.6893, -29.294899, -0.6617, 3.3446, -25.869999, -0.2764, 3.3446, -20.0679, -0.5589, 23.412498, -20.0679, -0.36479998, 20.0679, -16.7232, -0.36479998, 23.412498, -20.0679, -1.1374999, 26.7572, -20.0679, -0.5589, 23.412498, -16.7232, -1.1374999, 26.7572, -16.7232, -1.1374999, 26.7572, -16.7232, -0.36479998, 23.412498, -13.378601, -1.1209999, 26.7572, -26.7572, -1.0756, 23.412498, -25.174, -0.7391, 20.0679, -23.412498, -0.7373, 23.412498, -26.7572, -1.0756, 23.412498, -26.7572, -1.0756, 20.0679, -25.174, -0.7391, 20.0679, -26.7572, -1.2701, 26.7572, -23.412498, -0.7373, 23.412498, -23.412498, -1.1374999, 26.7572, -26.7572, -1.2701, 26.7572, -26.7572, -1.0756, 23.412498, -23.412498, -0.7373, 23.412498, -23.412498, -1.1374999, 26.7572, -23.412498, -0.7373, 23.412498, -20.0679, -1.1374999, 26.7572, -29.294899, -1.0265, 16.7232, -25.9681, -0.2875, 13.378601, -25.4212, -0.5907, 16.7232, -29.294899, -1.0265, 16.7232, -29.294899, -0.6617, 13.378601, -25.9681, -0.2875, 13.378601, -25.9681, -0.2875, 13.378601, -23.412498, -0.36479998, 16.7232, -25.4212, -0.5907, 16.7232, -23.412498, -0.36479998, 16.7232, -25.9681, -0.2875, 13.378601, -23.412498, 0, 13.378601, -26.7572, -1.0756, 20.0679, -25.4212, -0.5907, 16.7232, -25.174, -0.7391, 20.0679, -26.7572, -1.0756, 20.0679, -29.294899, -1.0265, 16.7232, -25.4212, -0.5907, 16.7232, -23.412498, -0.692, 20.0679, -23.412498, -0.36479998, 16.7232, -20.0679, -0.36479998, 20.0679, -13.378601, 0, 16.7232, -10.033899, 0, 13.378601, -10.033899, 0, 16.7232, -13.378601, 0, 16.7232, -13.378601, 0, 13.378601, -10.033899, 0, 13.378601, -13.378601, 0, 20.0679, -13.378601, 0, 16.7232, -10.033899, 0, 16.7232, -13.378601, 0, 20.0679, -10.033899, 0, 16.7232, -10.033899, 0, 20.0679, -10.033899, 0, 16.7232, -6.6893, 0, 20.0679, -10.033899, 0, 20.0679, -10.033899, 0, 13.378601, -7.2641997, 0, 16.7232, -10.033899, 0, 16.7232, -6.6893, 0, 20.0679, -10.033899, 0, 16.7232, -7.2641997, 0, 16.7232, -6.6893, 0, 13.8773, -10.033899, 0, 13.378601, -7.1966996, 0, 13.378601, -7.2641997, 0, 16.7232, -10.033899, 0, 13.378601, -6.6893, 0, 13.8773, -7.2641997, 0, 16.7232, -6.6893, 0, 13.8773, -6.6893, 0, 16.1455, -6.1093993, 0, 16.7232, -7.2641997, 0, 16.7232, -6.6893, 0, 16.1455, -6.6893, 0, 20.0679, -7.2641997, 0, 16.7232, -6.6893, 0, 17.298199, -6.1093993, 0, 16.7232, -6.6893, 0, 17.298199, -7.2641997, 0, 16.7232, -6.6893, 0, 17.298199, -3.3446002, 0, 20.0679, -6.6893, 0, 20.0679, -3.3446002, 0, 20.0679, -6.6893, 0, 17.298199, -6.1093993, 0, 16.7232, -3.3446002, 0, 20.0679, -6.1093993, 0, 16.7232, -3.3446002, 0, 16.7232, -3.3446002, 0, 20.0679, -3.3446002, 0, 16.7232, 0, 0, 16.7232, -3.3446002, 0, 20.0679, 0, 0, 16.7232, 0, 0, 20.0679, 0, 0, 16.7232, 2.4261, 0, 20.0679, 0, 0, 20.0679, 2.4261, 0, 20.0679, 0, 0, 16.7232, 3.3446, 0, 17.592, 3.3446, 0, 17.592, 0, 0, 16.7232, 2.4738998, 0, 16.7232, 2.4261, 0, 20.0679, 3.3446, 0, 17.592, 3.3446, 0, 19.1425, 4.275, 0, 20.0679, 2.4261, 0, 20.0679, 3.3446, 0, 19.1425, 4.275, 0, 20.0679, 3.3446, 0, 20.986399, 2.4261, 0, 20.0679, -26.7572, -1.6710999, -17.1511, -23.412498, -2.7663999, -20.0679, -23.412498, -0.7606, -16.7232, -26.7572, -1.6710999, -17.1511, -26.7572, -1.6710999, -20.4958, -23.412498, -2.7663999, -20.0679, -29.294899, -0.6617, -13.378599, -23.412498, -0.7606, -16.7232, -23.412498, 0, -13.378599, -29.294899, -0.6617, -13.378599, -26.7572, -1.6710999, -17.1511, -23.412498, -0.7606, -16.7232, -23.412498, 0, -13.378599, -23.412498, -0.7606, -16.7232, -20.0679, -0.43429998, -16.7232, -26.7572, -1.6710999, -20.4958, -23.412498, -2.7663999, -23.412498, -23.412498, -2.7663999, -20.0679, -26.7572, -1.6710999, -20.4958, -26.7572, -2.7663999, -23.412498, -23.412498, -2.7663999, -23.412498, -23.412498, -2.7663999, -20.0679, -20.0679, -2.7663999, -23.412498, -20.0679, -1.7572, -20.0679, -23.412498, -2.7663999, -20.0679, -23.412498, -2.7663999, -23.412498, -20.0679, -2.7663999, -23.412498, -29.294899, -0.6617, -10.033899, -23.412498, 0, -13.378599, -23.412498, 0, -10.033899, -29.294899, -0.6617, -10.033899, -29.294899, -0.6617, -13.378599, -23.412498, 0, -13.378599, -29.294899, -0.6617, -6.6893, -29.294899, -0.6617, -10.033899, -23.412498, 0, -10.033899, -29.294899, -0.6617, -6.6893, -23.412498, 0, -10.033899, -23.412498, 0, -6.6893, 0, 0, -13.378599, 0, -0.9271, -16.7232, 3.0140998, 0, -16.7232, 0, -0.9271, -23.412498, 3.3446, -0.98829997, -26.7572, 3.3446, -0.3434, -23.412498, 0, -0.9271, -23.412498, 0, -1.0608, -26.7572, 3.3446, -0.98829997, -26.7572, 21.2349, 0, -6.6893, 23.412498, 0, -10.033899, 23.412498, 0, -6.6893, 21.2349, 0, -6.6893, 21.8888, 0, -10.033899, 23.412498, 0, -10.033899, 21.8888, 0, -10.033899, 21.5122, 0, -13.6136, 23.412498, 0, -10.033899, 21.8888, 0, -10.033899, 21.251299, 0, -13.3043995, 21.5122, 0, -13.6136, 21.5122, 0, -13.6136, 23.412498, 0, -13.378599, 23.412498, 0, -10.033899, 20.809599, 0, -13.7309, 21.5122, 0, -13.6136, 21.251299, 0, -13.3043995, 21.0698, 0, -13.966099, 23.412498, 0, -13.378599, 21.5122, 0, -13.6136, 20.809599, 0, -13.7309, 21.0698, 0, -13.966099, 21.5122, 0, -13.6136, 21.0698, 0, -13.966099, 20.0679, 0, -16.7232, 23.412498, 0, -13.378599, 20.809599, 0, -13.7309, 18.053999, 0, -16.7802, 21.0698, 0, -13.966099, 18.053999, 0, -16.7802, 20.0679, 0, -16.7232, 21.0698, 0, -13.966099, 20.809599, 0, -13.7309, 17.503, 0, -15.940498, 18.053999, 0, -16.7802, 17.503, 0, -15.940498, 20.809599, 0, -13.7309, 18.0241, 0, -14.301899, 16.3113, 0, -16.9629, 18.053999, 0, -16.7802, 17.503, 0, -15.940498, 17.1022, 0, -17.6197, 20.0679, 0, -16.7232, 18.053999, 0, -16.7802, 16.3113, 0, -16.9629, 17.1022, 0, -17.6197, 18.053999, 0, -16.7802, 17.1022, 0, -17.6197, 16.7232, 0, -20.0679, 20.0679, 0, -16.7232, 16.3113, 0, -16.9629, 13.748098, 0, -20.540499, 17.1022, 0, -17.6197, 13.748098, 0, -20.540499, 16.7232, 0, -20.0679, 17.1022, 0, -17.6197, 16.3113, 0, -16.9629, 13.423399, 0, -20.1574, 13.748098, 0, -20.540499, 13.423399, 0, -20.1574, 16.3113, 0, -16.9629, 13.701399, 0, -17.416399, 12.961399, 0, -20.5828, 13.748098, 0, -20.540499, 13.423399, 0, -20.1574, 13.378599, 0, -20.9734, 16.7232, 0, -20.0679, 13.748098, 0, -20.540499, 12.961399, 0, -20.5828, 13.378599, 0, -20.9734, 13.748098, 0, -20.540499, 13.378599, 0, -20.9734, 13.378599, 0, -23.412498, 16.7232, 0, -20.0679, 10.033899, 0, -20.467, 13.378599, 0, -20.9734, 12.961399, 0, -20.5828, 10.033899, 0, -23.412498, 13.378599, 0, -23.412498, 13.378599, 0, -20.9734, 10.033899, 0, -20.467, 10.033899, 0, -23.412498, 13.378599, 0, -20.9734, 6.6893, 0, -20.1318, 10.033899, 0, -23.412498, 10.033899, 0, -20.467, 6.6893, 0, -20.1318, 6.6893, 0, -23.412498, 10.033899, 0, -23.412498, 6.6893, 0, -23.412498, 6.6893, 0, -20.1318, 4.4523, 0, -20.444399, 6.6893, 0, -23.412498, 4.4523, 0, -20.444399, 3.3446, 0, -21.6384, 3.2372, 0, -19.3395, 3.3446, 0, -21.6384, 4.4523, 0, -20.444399, 3.2372, 0, -19.3395, 2.3184, 0, -20.4362, 3.3446, 0, -21.6384, 6.6893, 0, -23.412498, 10.033899, -0.8648, -26.7572, 10.033899, 0, -23.412498, 6.6893, 0, -23.412498, 6.6893, -1.0129, -26.7572, 10.033899, -0.8648, -26.7572, -20.0679, -2.7663999, -23.412498, -16.7232, -3.0929, -26.7572, -16.7232, -1.7572, -23.412498, -20.0679, -2.7663999, -23.412498, -20.0679, -3.0929, -26.7572, -16.7232, -3.0929, -26.7572, -20.0679, -1.7572, -20.0679, -16.7232, -1.7572, -23.412498, -17.2383, -0.66719997, -19.6364, -20.0679, -1.7572, -20.0679, -20.0679, -2.7663999, -23.412498, -16.7232, -1.7572, -23.412498, -17.2383, -0.66719997, -19.6364, -13.378601, -1.3177999, -23.412498, -13.210501, -0.3964, -20.032099, -17.2383, -0.66719997, -19.6364, -16.7232, -1.7572, -23.412498, -13.378601, -1.3177999, -23.412498, -20.0679, -0.36479998, 20.0679, -20.0679, -0.36479998, 16.7232, -16.7232, -0.36479998, 20.0679, -23.412498, -0.36479998, 16.7232, -20.0679, -0.36479998, 16.7232, -20.0679, -0.36479998, 20.0679, -20.0679, -0.36479998, 20.0679, -16.7232, -0.36479998, 20.0679, -16.7232, -0.36479998, 23.412498, -16.7232, -0.36479998, 20.0679, -16.7232, -0.26209998, 16.7232, -13.378601, 0, 20.0679, 20.0679, -1.8294, 20.0679, 23.412498, -1.8294, 16.7232, 23.412498, -1.8294, 20.0679, 23.412498, -1.8294, 16.7232, 26.7582, -1.8294, 20.0679, 23.412498, -1.8294, 20.0679, 23.412498, -1.8294, 16.7232, 26.7582, -1.8294, 16.7232, 26.7582, -1.8294, 20.0679, 20.0679, -1.8294, 20.0679, 20.0679, -1.8294, 16.7232, 23.412498, -1.8294, 16.7232, 20.0679, -1.8294, 16.7232, 20.0679, -1.8294, 20.0679, 16.7232, -1.8294, 20.0679, 23.412498, -1.8294, 13.378601, 23.412498, -1.8294, 16.7232, 20.0679, -1.8294, 16.7232, 23.412498, -1.8294, 13.378601, 26.7582, -1.8294, 16.7232, 23.412498, -1.8294, 16.7232, 23.412498, -1.8294, 13.378601, 26.7582, -1.8294, 13.378601, 26.7582, -1.8294, 16.7232, -6.6893, -1.3241999, -23.412498, -3.3446002, -1.458, -26.7572, -3.3446002, -1.4008, -23.412498, -6.6893, -1.3241999, -23.412498, -6.6893, -1.458, -26.7572, -3.3446002, -1.458, -26.7572, -6.6893, -0.9271, -20.0679, -3.3446002, -1.4008, -23.412498, -3.3446002, -0.9271, -20.0679, -6.6893, -0.9271, -20.0679, -6.6893, -1.3241999, -23.412498, -3.3446002, -1.4008, -23.412498, -3.3446002, -0.9271, -20.0679, 0, -0.9271, -23.412498, 0, -0.9271, -20.0679, -3.3446002, -0.9271, -20.0679, -3.3446002, -1.4008, -23.412498, 0, -0.9271, -23.412498, 20.0679, -0.8222, -23.412498, 23.412498, -1.1158999, -26.7572, 23.412498, -1.0924, -23.412498, 20.0679, -0.8222, -23.412498, 20.0679, -1.1922, -26.7572, 23.412498, -1.1158999, -26.7572, 20.0679, -0.2837, -20.0679, 20.0679, -0.8222, -23.412498, 23.412498, -1.0924, -20.0679, 26.7573, -1.3222, -26.7572, 29.564798, -1.6410999, -23.412498, 26.7582, -1.0924, -23.412498, 26.7573, -1.3222, -26.7572, 29.3928, -1.796, -26.7572, 29.564798, -1.6410999, -23.412498, 13.378599, -1.0746, 20.0679, 16.7232, -1.8294, 20.0679, 13.378599, -2.2719998, 23.3902, 13.378599, -1.0746, 20.0679, 15.0508995, -1.0746, 20.0679, 16.7232, -1.8294, 20.0679, 0, -0.9271, -20.0679, 3.3446, 0, -21.6384, 2.3184, 0, -20.4362, 0, -0.9271, -20.0679, 3.3446, -0.3434, -23.412498, 3.3446, 0, -21.6384, 0, -0.9271, -16.7232, 3.2372, 0, -19.3395, 3.0140998, 0, -16.7232, 0, -0.9271, -16.7232, 2.3184, 0, -20.4362, 3.2372, 0, -19.3395, 3.3446, 0, -21.6384, 3.3446, -0.3434, -23.412498, 6.6893, 0, -23.412498, -16.7232, 0, -16.113699, -16.7232, 0, -17.2664, -16.1493, 0, -16.8284, -16.7232, 0, -16.113699, -17.2664, 0, -16.7232, -16.7232, 0, -17.2664, -20.0679, -0.43429998, -16.7232, -16.7232, 0, -17.2664, -17.2664, 0, -16.7232, -20.0679, -0.43429998, -16.7232, -17.2383, -0.66719997, -19.6364, -16.7232, 0, -17.2664, -20.0679, -0.43429998, -16.7232, -16.7232, 0, -13.378599, -20.0679, 0, -13.378599, -16.7232, 0, -13.378599, -20.0679, -0.43429998, -16.7232, -17.2664, 0, -16.7232, -16.7232, 0, -13.378599, -17.2664, 0, -16.7232, -16.7232, 0, -16.113699, -17.2383, -0.66719997, -19.6364, -16.1493, 0, -16.8284, -16.7232, 0, -17.2664, -16.1493, 0, -16.8284, -17.2383, -0.66719997, -19.6364, -13.210501, -0.3964, -20.032099, -16.1493, 0, -16.8284, -13.210501, -0.3964, -20.032099, -13.378601, 0, -17.3364, -10.3452, 0, -16.7803, -9.7488, 0, -16.7232, -9.983101, 0, -16.4067, -10.3452, 0, -16.7803, -10.033899, 0, -17.008299, -9.7488, 0, -16.7232, -6.6893, 0, -14.263699, -9.983101, 0, -16.4067, -9.7488, 0, -16.7232, -9.983101, 0, -16.4067, -6.6893, 0, -14.263699, -9.6168995, 0, -14.127899, -6.6893, 0, -14.263699, -9.7488, 0, -16.7232, -6.6893, 0, -16.7232, -6.6893, 0, -14.263699, -6.6893, 0, -16.7232, -3.3446002, 0, -13.7127, -6.6893, 0, -14.263699, -3.3446002, 0, -13.7127, -3.6946998, 0, -13.471199, -3.6946998, 0, -13.471199, -3.3446002, 0, -13.7127, -3.0105996, 0, -13.378599, 0, 0, -13.378599, -3.0105996, 0, -13.378599, -3.3446002, 0, -13.7127, -3.6946998, 0, -13.471199, -3.0105996, 0, -13.378599, -3.2535, 0, -13.020899, 0, 0, -13.378599, -3.2535, 0, -13.020899, -3.0105996, 0, -13.378599, -2.2352996, 0, -10.6031, -3.2535, 0, -13.020899, 0, 0, -13.378599, -3.2535, 0, -13.020899, -2.2352996, 0, -10.6031, -2.7220998, 0, -10.936998, -2.2352996, 0, -10.6031, 0, 0, -13.378599, 0, 0, -10.7654, -13.210501, -0.3964, -20.032099, -10.3452, 0, -16.7803, -13.378601, 0, -17.3364, -10.3452, 0, -16.7803, -13.210501, -0.3964, -20.032099, -9.318001, -0.3969, -19.413, -10.3452, 0, -16.7803, -9.318001, -0.3969, -19.413, -10.033899, 0, -17.008299, -10.033899, 0, -17.008299, -6.6893, 0, -16.7232, -9.7488, 0, -16.7232, -10.033899, 0, -17.008299, -9.318001, -0.3969, -19.413, -6.6893, 0, -16.7232, -3.3446002, 0, -13.7127, 0, -0.9271, -16.7232, 0, 0, -13.378599, -3.3446002, 0, -13.7127, -3.3446002, -0.9271, -16.7232, 0, -0.9271, -16.7232, 0, 0, -13.378599, 2.2182999, 0, -10.525, 0, 0, -10.7654, 2.2182999, 0, -10.525, 0, 0, -13.378599, 3.3446, -0.3989, -12.9443, 2.2182999, 0, -10.525, 3.3446, -0.3989, -12.9443, 2.9573, -0.1021, -11.0952, -20.108599, 0, -9.592199, -20.0679, 0, -10.476398, -19.6286, 0, -10.1098995, -20.108599, 0, -9.592199, -20.5103, 0, -10.033899, -20.0679, 0, -10.476398, -20.3764, 0, -6.6893, -20.5103, 0, -10.033899, -20.108599, 0, -9.592199, -20.0679, 0, -13.378599, -19.6286, 0, -10.1098995, -20.0679, 0, -10.476398, -20.5103, 0, -10.033899, -20.0679, 0, -13.378599, -20.0679, 0, -10.476398, -19.6286, 0, -10.1098995, -20.0679, 0, -13.378599, -17.1586, 0, -11.120298, -19.6286, 0, -10.1098995, -17.1586, 0, -11.120298, -17.8929, 0, -10.41, -17.1586, 0, -11.120298, -20.0679, 0, -13.378599, -16.7232, 0, -13.378599, -20.5103, 0, -10.033899, -23.412498, 0, -13.378599, -20.0679, 0, -13.378599, -23.412498, 0, -13.378599, -20.5103, 0, -10.033899, -23.412498, 0, -10.033899, -20.3764, 0, -6.6893, -23.412498, 0, -10.033899, -20.5103, 0, -10.033899, -23.412498, 0, -10.033899, -20.3764, 0, -6.6893, -23.412498, 0, -6.6893, -23.412498, -0.0385, -2.8684, -23.412498, 0, -3.7743, -22.9552, -0.047599997, -3.375, -23.412498, -0.0385, -2.8684, -23.8421, 0, -3.3446002, -23.412498, 0, -3.7743, -23.412498, 0, -6.6893, -22.9552, -0.047599997, -3.375, -23.412498, 0, -3.7743, -22.9552, -0.047599997, -3.375, -23.412498, 0, -6.6893, -20.1607, -0.2436, -4.5060997, -20.1607, -0.2436, -4.5060997, -23.412498, 0, -6.6893, -20.3764, 0, -6.6893, -22.9552, -0.047599997, -3.375, -20.1607, -0.2436, -4.5060997, -21.0086, -0.2504, -3.5043998, -29.294899, -0.6617, -6.6893, -23.8421, 0, -3.3446002, -27.9812, -0.6617, -3.3446002, -23.8421, 0, -3.3446002, -29.294899, -0.6617, -6.6893, -23.412498, 0, -6.6893, -23.8421, 0, -3.3446002, -23.412498, 0, -6.6893, -23.412498, 0, -3.7743, -27.9812, -0.6617, -3.3446002, -25.479, -0.4588, 0.143, -27.9812, -0.6617, 0, -25.479, -0.4588, 0.143, -27.9812, -0.6617, -3.3446002, -23.412498, -0.0385, -2.8684, -23.412498, -0.0385, -2.8684, -27.9812, -0.6617, -3.3446002, -23.8421, 0, -3.3446002, -25.479, -0.4588, 0.143, -23.412498, -0.0385, -2.8684, -23.412498, -0.2913, 0.26119995, -22.756899, 0, 10.033899, -24.056599, 0, 10.033899, -23.489, 0, 9.386499, -22.756899, 0, 10.033899, -23.412498, 0, 10.6779995, -24.056599, 0, 10.033899, -20.0679, 0, 13.378601, -23.412498, 0, 10.6779995, -22.756899, 0, 10.033899, -23.412498, 0, 10.6779995, -20.0679, 0, 13.378601, -23.412498, 0, 13.378601, -20.0679, 0, 13.378601, -22.756899, 0, 10.033899, -20.0679, 0, 10.033899, -20.0679, 0, 10.033899, -17.213, 0, 13.378601, -20.0679, 0, 13.378601, -17.213, 0, 13.378601, -20.0679, 0, 10.033899, -16.7232, 0, 10.8878, -16.7232, 0, 10.8878, -20.0679, 0, 10.033899, -17.583, 0, 10.033899, -17.213, 0, 13.378601, -16.7232, 0, 10.8878, -16.7232, 0, 12.878401, -16.223, 0, 13.378601, -17.213, 0, 13.378601, -16.7232, 0, 12.878401, -16.223, 0, 13.378601, -16.7232, 0, 13.868401, -17.213, 0, 13.378601, -29.294899, -0.6617, 10.033899, -25.945799, -0.25779998, 6.6893, -26.0077, -0.2465, 10.033899, -29.294899, -0.6617, 10.033899, -29.294899, -0.6617, 6.6893, -25.945799, -0.25779998, 6.6893, -29.294899, -0.6617, 13.378601, -26.0077, -0.2465, 10.033899, -25.9681, -0.2875, 13.378601, -29.294899, -0.6617, 13.378601, -29.294899, -0.6617, 10.033899, -26.0077, -0.2465, 10.033899, -20.0679, -0.36479998, 16.7232, -20.0679, 0, 13.378601, -16.7232, -0.26209998, 16.7232, -16.7232, 0, 13.868401, -13.378601, 0, 16.7232, -16.7232, -0.26209998, 16.7232, -13.378601, 0, 16.7232, -16.7232, 0, 13.868401, -16.223, 0, 13.378601, -13.378601, 0, 16.7232, -16.223, 0, 13.378601, -13.378601, 0, 13.378601, 0, 0, 20.0679, 3.3446, -0.2814, 23.412498, 0, -0.2814, 23.412498, 3.3446, -0.2814, 23.412498, 0, 0, 20.0679, 2.4261, 0, 20.0679, 3.3446, -0.2814, 23.412498, 2.4261, 0, 20.0679, 3.3446, 0, 20.986399, 3.3446, 0, 20.986399, 6.6893, -0.2814, 23.412498, 3.3446, -0.2814, 23.412498, 6.6893, -0.2814, 23.412498, 3.3446, 0, 20.986399, 4.275, 0, 20.0679, 6.6893, -0.2814, 23.412498, 4.275, 0, 20.0679, 6.6893, 0, 20.0679, 10.572599, 0, 19.5895, 10.501598, 0, 20.5087, 10.080299, 0, 20.0679, 10.572599, 0, 19.5895, 11.0191, 0, 20.0679, 10.501598, 0, 20.5087, 10.572599, 0, 19.5895, 13.378599, 0, 16.7232, 11.0191, 0, 20.0679, 10.572599, 0, 19.5895, 10.572599, 0, 16.7232, 13.378599, 0, 16.7232, 10.572599, 0, 14.3402, 13.378599, 0, 16.7232, 10.572599, 0, 16.7232, 13.378599, 0, 16.7232, 10.572599, 0, 14.3402, 13.105099, 0, 13.9188, 13.105099, 0, 13.9188, 10.572599, 0, 14.3402, 10.986898, 0, 13.9188, 13.378599, 0, 16.7232, 13.105099, 0, 13.9188, 13.700699, 0, 14.602699, 13.8046, 0, 13.2202, 13.700699, 0, 14.602699, 13.105099, 0, 13.9188, 13.8046, 0, 13.2202, 14.439199, 0, 13.6437, 13.700699, 0, 14.602699, 6.6893, -0.2814, 23.412498, 10.501598, 0, 20.5087, 10.033899, -0.501, 23.412498, 10.033899, -0.501, 23.412498, 11.0191, 0, 20.0679, 13.378599, -1.0746, 20.0679, 10.033899, -0.501, 23.412498, 10.501598, 0, 20.5087, 11.0191, 0, 20.0679, 17.4912, 0.0034999999, 7.4080997, 13.8046, 0, 10.033899, 14.0257, 0.0442, 7.3252997, 13.8046, 0, 10.033899, 17.4912, 0.0034999999, 7.4080997, 16.7232, 0, 10.033899, 13.8046, 0, 10.033899, 16.7232, 0, 10.033899, 15.0508995, 0, 10.033899, 16.7232, -1.0746, 13.378601, 15.0508995, -0.40039998, 16.7232, 15.0508995, -0.6288, 13.378601, -16.7232, -1.1374999, 26.7572, -20.0679, -1.9081, 30.3625, -20.0679, -1.1374999, 26.7572, -16.7232, -1.1374999, 26.7572, -16.7232, -1.9068999, 30.3568, -20.0679, -1.9081, 30.3625, -23.412498, -1.9093, 30.3681, -20.0679, -1.1374999, 26.7572, -20.0679, -1.9081, 30.3625, -23.412498, -1.9093, 30.3681, -23.412498, -1.1374999, 26.7572, -20.0679, -1.1374999, 26.7572, -23.412498, -2.6287, 33.7341, -23.412498, -1.9093, 30.3681, -20.0679, -1.9081, 30.3625, -16.7232, -1.9068999, 30.3568, -20.0679, -2.628, 33.7306, -20.0679, -1.9081, 30.3625, -23.412498, -2.6287, 33.7341, -20.0679, -1.9081, 30.3625, -20.0679, -2.628, 33.7306, -16.7232, -1.9068999, 30.3568, -16.7232, -2.6272, 33.726997, -20.0679, -2.628, 33.7306, -23.412498, -3.2477999, 36.6305, -23.412498, -2.6287, 33.7341, -20.0679, -2.628, 33.7306, -16.7232, -2.6272, 33.726997, -20.0679, -3.2473998, 36.6287, -20.0679, -2.628, 33.7306, -23.412498, -3.2477999, 36.6305, -20.0679, -2.628, 33.7306, -20.0679, -3.2473998, 36.6287, -16.7232, -2.6272, 33.726997, -16.7232, -3.247, 36.6269, -20.0679, -3.2473998, 36.6287, -20.0679, -3.8518999, 39.456898, -23.412498, -3.2477999, 36.6305, -20.0679, -3.2473998, 36.6287, -16.7232, -3.247, 36.6269, -20.0679, -3.8518999, 39.456898, -20.0679, -3.2473998, 36.6287, -20.0679, -3.8518999, 39.456898, -23.412498, -3.8518999, 39.456898, -23.412498, -3.2477999, 36.6305, -16.7232, -3.247, 36.6269, -16.7232, -3.8518999, 39.456898, -20.0679, -3.8518999, 39.456898, -27.9812, -0.6617, 0, -30.315699, -0.9931, 3.3446, -30.300001, -1.3205999, 0, -27.9812, -0.6617, 0, -29.294899, -0.6617, 3.3446, -30.315699, -0.9931, 3.3446, -50.290497, -8.1437, 10.033899, -53.117798, -8.6939, 6.6893, -50.290497, -8.1437, 6.6893, -50.290497, -8.1437, 10.033899, -50.290497, -8.1437, 13.378601, -53.117798, -8.6939, 6.6893, -53.117798, -8.6939, 3.3446, -50.290497, -8.1437, 6.6893, -53.117798, -8.6939, 6.6893, -53.117798, -8.6939, 3.3446, -50.290497, -8.1437, 3.3446, -50.290497, -8.1437, 6.6893, -53.117798, -8.6939, 6.6893, -50.290497, -8.1437, 13.378601, -53.117798, -8.6939, 13.378601, -53.117798, -8.6939, 0, -50.290497, -8.1437, 3.3446, -53.117798, -8.6939, 3.3446, -53.117798, -8.6939, 0, -50.290497, -8.1437, 0, -50.290497, -8.1437, 3.3446, -55.5951, -9.176, 3.3446, -53.117798, -8.6939, 3.3446, -53.117798, -8.6939, 6.6893, -53.117798, -8.6939, -3.3446002, -50.290497, -8.1437, 0, -53.117798, -8.6939, 0, -53.117798, -8.6939, -3.3446002, -50.290497, -8.1437, -3.3446002, -50.290497, -8.1437, 0, -55.5951, -9.176, 0, -53.117798, -8.6939, 0, -53.117798, -8.6939, 3.3446, -55.5951, -9.176, 0, -53.117798, -8.6939, 3.3446, -55.5951, -9.176, 3.3446, -55.5951, -9.176, -3.3446002, -53.117798, -8.6939, -3.3446002, -53.117798, -8.6939, 0, -55.5951, -9.176, -3.3446002, -53.117798, -8.6939, 0, -55.5951, -9.176, 0, -53.117798, -8.6939, -6.6893, -50.290497, -8.1437, -3.3446002, -53.117798, -8.6939, -3.3446002, -53.117798, -8.6939, -6.6893, -50.290497, -8.1437, -6.6893, -50.290497, -8.1437, -3.3446002, -55.5951, -9.176, -6.6893, -53.117798, -8.6939, -3.3446002, -55.5951, -9.176, -3.3446002, -55.5951, -9.176, -6.6893, -53.117798, -8.6939, -6.6893, -53.117798, -8.6939, -3.3446002, -53.117798, -8.6939, -10.033899, -50.290497, -8.1437, -6.6893, -53.117798, -8.6939, -6.6893, -53.117798, -8.6939, -10.033899, -50.290497, -8.1437, -10.033899, -50.290497, -8.1437, -6.6893, -55.5951, -9.176, -10.033899, -53.117798, -8.6939, -6.6893, -55.5951, -9.176, -6.6893, -55.5951, -9.176, -10.033899, -53.117798, -8.6939, -10.033899, -53.117798, -8.6939, -6.6893, -53.117798, -8.6939, -13.378599, -50.290497, -8.1437, -10.033899, -53.117798, -8.6939, -10.033899, -53.117798, -8.6939, -13.378599, -50.290497, -8.1437, -13.378599, -50.290497, -8.1437, -10.033899, -53.117798, -8.6939, -13.378599, -50.290497, -8.1437, -16.7232, -50.290497, -8.1437, -13.378599, -53.117798, -8.6939, -13.378599, -50.290497, -8.1437, -16.937199, -50.290497, -8.1437, -16.7232, -50.290497, -8.1437, -16.937199, -53.117798, -8.6939, -13.378599, -53.117798, -8.6939, -16.911499, -53.117798, -8.6939, -16.911499, -50.290497, -8.1437, -20.0679, -50.290497, -8.1437, -16.937199, -55.5951, -9.176, -13.378599, -53.117798, -8.6939, -13.378599, -53.117798, -8.6939, -10.033899, -55.5951, -9.176, -13.378599, -53.117798, -8.6939, -10.033899, -55.5951, -9.176, -10.033899, -53.117798, -8.6939, -16.911499, -50.290497, -8.1437, -20.2818, -50.290497, -8.1437, -20.0679, -55.5951, -9.176, -16.888899, -53.117798, -8.6939, -13.378599, -55.5951, -9.176, -13.378599, -55.5951, -9.176, -16.888899, -53.117798, -8.6939, -16.911499, -53.117798, -8.6939, -13.378599, -58.463497, -9.7343, -13.378599, -55.5951, -9.176, -13.378599, -55.5951, -9.176, -10.033899, -58.463497, -9.7343, -16.8629, -55.5951, -9.176, -16.888899, -55.5951, -9.176, -13.378599, -58.463497, -9.7343, -16.8629, -55.5951, -9.176, -13.378599, -58.463497, -9.7343, -13.378599, -55.5951, -9.176, -20.233599, -53.117798, -8.6939, -16.911499, -55.5951, -9.176, -16.888899, -50.290497, -8.1437, -20.2818, -53.117798, -8.6939, -16.911499, -53.117798, -8.6939, -20.2561, -55.5951, -9.176, -20.233599, -53.117798, -8.6939, -20.2561, -53.117798, -8.6939, -16.911499, -53.117798, -8.6939, -23.412498, -50.290497, -8.1437, -20.2818, -53.117798, -8.6939, -20.2561, -53.117798, -8.6939, -23.412498, -50.290497, -8.1437, -23.412498, -50.290497, -8.1437, -20.2818, -53.117798, -8.6939, -26.7572, -50.290497, -8.1437, -23.412498, -53.117798, -8.6939, -23.412498, -53.117798, -8.6939, -26.7572, -50.290497, -8.1437, -26.7572, -50.290497, -8.1437, -23.412498, -55.5951, -9.176, -26.7572, -53.117798, -8.6939, -26.7572, -53.117798, -8.6939, -23.412498, -55.5951, -9.176, -23.412498, -53.117798, -8.6939, -23.412498, -53.117798, -8.6939, -20.2561, -55.5951, -9.176, -26.7572, -53.117798, -8.6939, -23.412498, -55.5951, -9.176, -23.412498, -55.5951, -9.176, -23.412498, -53.117798, -8.6939, -20.2561, -55.5951, -9.176, -20.233599, -58.463497, -9.7343, -26.7572, -55.5951, -9.176, -26.7572, -55.5951, -9.176, -23.412498, -58.463497, -9.7343, -23.412498, -55.5951, -9.176, -23.412498, -55.5951, -9.176, -20.233599, -58.463497, -9.7343, -26.7572, -55.5951, -9.176, -23.412498, -58.463497, -9.7343, -23.412498, -62.057194, -10.4337, -23.412498, -58.463497, -9.7343, -26.7572, -58.463497, -9.7343, -23.412498, -62.057194, -10.4337, -23.412498, -62.057194, -10.4337, -26.7572, -58.463497, -9.7343, -26.7572, -62.057194, -10.4337, -20.174799, -62.057194, -10.4337, -23.412498, -58.463497, -9.7343, -23.412498, -58.463497, -9.7343, -23.412498, -55.5951, -9.176, -20.233599, -58.463497, -9.7343, -20.207499, -62.057194, -10.4337, -20.174799, -58.463497, -9.7343, -23.412498, -58.463497, -9.7343, -20.207499, -58.463497, -9.7343, -20.207499, -55.5951, -9.176, -20.233599, -55.5951, -9.176, -16.888899, -58.463497, -9.7343, -20.207499, -55.5951, -9.176, -16.888899, -58.463497, -9.7343, -16.8629, -58.463497, -9.7343, -16.8629, -62.057194, -10.4337, -20.174799, -58.463497, -9.7343, -20.207499, -58.463497, -9.7343, -16.8629, -62.057194, -10.4337, -20.0679, -62.057194, -10.4337, -20.174799, -62.057194, -10.4337, -20.0679, -58.463497, -9.7343, -16.8629, -62.057194, -10.4337, -16.8302, -58.463497, -9.7343, -13.378599, -62.057194, -10.4337, -16.8302, -58.463497, -9.7343, -16.8629, -58.463497, -9.7343, -13.378599, -62.057194, -10.4337, -16.7232, -62.057194, -10.4337, -16.8302, -62.057194, -10.4337, -16.7232, -58.463497, -9.7343, -13.378599, -62.057194, -10.4337, -13.378599, -62.057194, -10.4337, -10.033899, -62.057194, -10.4337, -13.378599, -58.463497, -9.7343, -13.378599, -62.057194, -10.4337, -10.033899, -58.463497, -9.7343, -13.378599, -58.463497, -9.7343, -10.033899, -58.463497, -9.7343, -13.378599, -55.5951, -9.176, -10.033899, -58.463497, -9.7343, -10.033899, -62.057194, -10.4337, -6.6893, -62.057194, -10.4337, -10.033899, -58.463497, -9.7343, -10.033899, -58.463497, -9.7343, -10.033899, -55.5951, -9.176, -10.033899, -55.5951, -9.176, -6.6893, -62.057194, -10.4337, -6.6893, -58.463497, -9.7343, -10.033899, -58.463497, -9.7343, -6.6893, -58.463497, -9.7343, -10.033899, -55.5951, -9.176, -6.6893, -58.463497, -9.7343, -6.6893, -62.057194, -10.4337, -3.3446002, -62.057194, -10.4337, -6.6893, -58.463497, -9.7343, -6.6893, -58.463497, -9.7343, -6.6893, -55.5951, -9.176, -6.6893, -55.5951, -9.176, -3.3446002, -62.057194, -10.4337, -3.3446002, -58.463497, -9.7343, -6.6893, -58.463497, -9.7343, -3.3446002, -58.463497, -9.7343, -6.6893, -55.5951, -9.176, -3.3446002, -58.463497, -9.7343, -3.3446002, -62.057194, -10.4337, 0, -62.057194, -10.4337, -3.3446002, -58.463497, -9.7343, -3.3446002, -58.463497, -9.7343, -3.3446002, -55.5951, -9.176, -3.3446002, -55.5951, -9.176, 0, -62.057194, -10.4337, 0, -58.463497, -9.7343, -3.3446002, -58.463497, -9.7343, 0, -58.463497, -9.7343, -3.3446002, -55.5951, -9.176, 0, -58.463497, -9.7343, 0, -62.057194, -10.4337, 3.3446, -62.057194, -10.4337, 0, -58.463497, -9.7343, 0, -58.463497, -9.7343, 0, -55.5951, -9.176, 0, -55.5951, -9.176, 3.3446, -62.057194, -10.4337, 3.3446, -58.463497, -9.7343, 0, -58.463497, -9.7343, 3.3446, -58.463497, -9.7343, 0, -55.5951, -9.176, 3.3446, -58.463497, -9.7343, 3.3446, -62.057194, -10.4337, 6.6893, -62.057194, -10.4337, 3.3446, -58.463497, -9.7343, 3.3446, -62.057194, -10.4337, 6.6893, -58.463497, -9.7343, 3.3446, -58.463497, -9.7343, 6.6893, -58.463497, -9.7343, 6.6893, -62.057194, -10.4337, 10.033899, -62.057194, -10.4337, 6.6893, -58.463497, -9.7343, 3.3446, -55.5951, -9.176, 3.3446, -55.5951, -9.176, 6.6893, -58.463497, -9.7343, 3.3446, -55.5951, -9.176, 6.6893, -58.463497, -9.7343, 6.6893, -55.5951, -9.176, 3.3446, -53.117798, -8.6939, 6.6893, -55.5951, -9.176, 6.6893, -58.463497, -9.7343, 6.6893, -62.057194, -10.4337, 13.378601, -62.057194, -10.4337, 10.033899, -53.117798, -8.6939, 13.378601, -55.5951, -9.176, 6.6893, -53.117798, -8.6939, 6.6893, -55.5951, -9.176, 13.378601, -58.463497, -9.7343, 6.6893, -55.5951, -9.176, 6.6893, -53.117798, -8.6939, 13.378601, -55.5951, -9.176, 13.378601, -55.5951, -9.176, 6.6893, -55.5951, -9.176, 13.378601, -58.463497, -9.7343, 13.378601, -58.463497, -9.7343, 6.6893, -62.057194, -10.4337, 13.378601, -58.463497, -9.7343, 6.6893, -58.463497, -9.7343, 13.378601, -53.117798, -8.6939, 16.7232, -55.5951, -9.176, 13.378601, -53.117798, -8.6939, 13.378601, -50.290497, -8.1437, 13.378601, -53.117798, -8.6939, 16.7232, -53.117798, -8.6939, 13.378601, -50.290497, -8.1437, 13.378601, -50.290497, -8.1437, 16.7232, -53.117798, -8.6939, 16.7232, -53.117798, -8.6939, 16.7232, -55.5951, -9.176, 16.7232, -55.5951, -9.176, 13.378601, -55.5951, -9.176, 16.7232, -58.463497, -9.7343, 13.378601, -55.5951, -9.176, 13.378601, -50.290497, -8.1437, 16.7232, -53.117798, -8.6939, 20.0679, -53.117798, -8.6939, 16.7232, -53.117798, -8.6939, 20.0679, -55.5951, -9.176, 16.7232, -53.117798, -8.6939, 16.7232, -50.290497, -8.1437, 16.7232, -50.290497, -8.1437, 20.0679, -53.117798, -8.6939, 20.0679, -58.463497, -9.7343, 16.7232, -62.057194, -10.4337, 13.378601, -58.463497, -9.7343, 13.378601, -55.5951, -9.176, 16.7232, -58.463497, -9.7343, 16.7232, -58.463497, -9.7343, 13.378601, -58.463497, -9.7343, 16.7232, -62.057194, -10.4337, 16.7232, -62.057194, -10.4337, 13.378601, -53.117798, -8.6939, 20.0679, -55.5951, -9.176, 20.0679, -55.5951, -9.176, 16.7232, -55.5951, -9.176, 20.0679, -58.463497, -9.7343, 16.7232, -55.5951, -9.176, 16.7232, -50.290497, -8.1437, 20.0679, -53.117798, -8.6939, 23.412498, -53.117798, -8.6939, 20.0679, -53.117798, -8.6939, 23.412498, -55.5951, -9.176, 20.0679, -53.117798, -8.6939, 20.0679, -50.290497, -8.1437, 20.0679, -50.290497, -8.1437, 23.412498, -53.117798, -8.6939, 23.412498, -50.290497, -8.1437, 23.412498, -53.117798, -8.6939, 26.7572, -53.117798, -8.6939, 23.412498, -50.290497, -8.1437, 23.412498, -50.290497, -8.1437, 26.7572, -53.117798, -8.6939, 26.7572, -53.117798, -8.6939, 26.7572, -55.5951, -9.176, 23.412498, -53.117798, -8.6939, 23.412498, -53.117798, -8.6939, 23.412498, -55.5951, -9.176, 23.412498, -55.5951, -9.176, 20.0679, -53.117798, -8.6939, 26.7572, -55.5951, -9.176, 26.7572, -55.5951, -9.176, 23.412498, -55.5951, -9.176, 20.0679, -58.463497, -9.7343, 20.0679, -58.463497, -9.7343, 16.7232, -58.463497, -9.7343, 20.0679, -62.057194, -10.4337, 16.7232, -58.463497, -9.7343, 16.7232, -55.5951, -9.176, 23.412498, -58.463497, -9.7343, 20.0679, -55.5951, -9.176, 20.0679, -58.463497, -9.7343, 20.0679, -62.057194, -10.4337, 20.0679, -62.057194, -10.4337, 16.7232, -55.5951, -9.176, 26.7572, -58.463497, -9.7343, 23.412498, -55.5951, -9.176, 23.412498, -55.5951, -9.176, 23.412498, -58.463497, -9.7343, 23.412498, -58.463497, -9.7343, 20.0679, -58.463497, -9.7343, 23.412498, -62.057194, -10.4337, 20.0679, -58.463497, -9.7343, 20.0679, -55.5951, -9.176, 26.7572, -58.463497, -9.7343, 26.7572, -58.463497, -9.7343, 23.412498, -58.463497, -9.7343, 23.412498, -62.057194, -10.4337, 23.412498, -62.057194, -10.4337, 20.0679, -58.463497, -9.7343, 26.7572, -62.057194, -10.4337, 23.412498, -58.463497, -9.7343, 23.412498, -58.463497, -9.7343, 26.7572, -62.057194, -10.4337, 26.7572, -62.057194, -10.4337, 23.412498, -62.057194, -10.4337, 0, -64.963196, -10.4337, -3.3446002, -62.057194, -10.4337, -3.3446002, -64.963196, -10.4337, -6.6893, -62.057194, -10.4337, -3.3446002, -64.963196, -10.4337, -3.3446002, -64.963196, -10.4337, -6.6893, -62.057194, -10.4337, -6.6893, -62.057194, -10.4337, -3.3446002, -62.057194, -10.4337, 0, -64.963196, -10.4337, 0, -64.963196, -10.4337, -3.3446002, -64.963196, -10.4337, 0, -62.057194, -10.4337, 0, -62.057194, -10.4337, 3.3446, -68.2489, -10.4337, -6.6893, -64.963196, -10.4337, -6.6893, -64.963196, -10.4337, -3.3446002, -64.963196, -10.4337, 0, -68.2489, -10.4337, -3.3446002, -64.963196, -10.4337, -3.3446002, -68.2489, -10.4337, -6.6893, -64.963196, -10.4337, -3.3446002, -68.2489, -10.4337, -3.3446002, -64.963196, -10.4337, -10.033899, -62.057194, -10.4337, -6.6893, -64.963196, -10.4337, -6.6893, -64.963196, -10.4337, -10.033899, -62.057194, -10.4337, -10.033899, -62.057194, -10.4337, -6.6893, -68.2489, -10.4337, -10.033899, -64.963196, -10.4337, -6.6893, -68.2489, -10.4337, -6.6893, -68.2489, -10.4337, -10.033899, -64.963196, -10.4337, -10.033899, -64.963196, -10.4337, -6.6893, -64.963196, -10.4337, -13.378599, -62.057194, -10.4337, -10.033899, -64.963196, -10.4337, -10.033899, -64.963196, -10.4337, -13.378599, -62.057194, -10.4337, -13.378599, -62.057194, -10.4337, -10.033899, -64.963196, -10.4337, -13.378599, -62.057194, -10.4337, -16.7232, -62.057194, -10.4337, -13.378599, -64.963196, -10.4337, -13.378599, -62.057194, -10.4337, -16.8302, -62.057194, -10.4337, -16.7232, -62.057194, -10.4337, -16.8302, -64.963196, -10.4337, -13.378599, -64.963196, -10.4337, -16.803799, -64.963196, -10.4337, -16.803799, -62.057194, -10.4337, -20.0679, -62.057194, -10.4337, -16.8302, -68.2489, -10.4337, -13.378599, -64.963196, -10.4337, -13.378599, -64.963196, -10.4337, -10.033899, -68.2489, -10.4337, -13.378599, -64.963196, -10.4337, -10.033899, -68.2489, -10.4337, -10.033899, -64.963196, -10.4337, -16.803799, -62.057194, -10.4337, -20.174799, -62.057194, -10.4337, -20.0679, -68.2489, -10.4337, -16.7739, -64.963196, -10.4337, -13.378599, -68.2489, -10.4337, -13.378599, -68.2489, -10.4337, -16.7739, -64.963196, -10.4337, -16.803799, -64.963196, -10.4337, -13.378599, -71.2999, -10.4337, -13.378599, -68.2489, -10.4337, -13.378599, -68.2489, -10.4337, -10.033899, -71.2999, -10.4337, -16.746199, -68.2489, -10.4337, -16.7739, -68.2489, -10.4337, -13.378599, -71.2999, -10.4337, -16.746199, -68.2489, -10.4337, -13.378599, -71.2999, -10.4337, -13.378599, -73.8239, -10.4337, -13.378599, -71.2999, -10.4337, -16.746199, -71.2999, -10.4337, -13.378599, -73.8239, -10.4337, -13.378599, -73.8239, -10.4337, -16.7232, -71.2999, -10.4337, -16.746199, -73.8239, -10.4337, -10.033899, -73.8239, -10.4337, -13.378599, -71.2999, -10.4337, -13.378599, -73.8239, -10.4337, -16.7232, -71.2999, -10.4337, -20.0908, -71.2999, -10.4337, -16.746199, -71.2999, -10.4337, -20.0908, -68.2489, -10.4337, -16.7739, -71.2999, -10.4337, -16.746199, -73.8239, -10.4337, -16.7232, -73.8239, -10.4337, -20.0679, -71.2999, -10.4337, -20.0908, -71.2999, -10.4337, -13.378599, -68.2489, -10.4337, -10.033899, -71.2999, -10.4337, -10.033899, -73.8239, -10.4337, -10.033899, -71.2999, -10.4337, -13.378599, -71.2999, -10.4337, -10.033899, -71.2999, -10.4337, -10.033899, -68.2489, -10.4337, -10.033899, -68.2489, -10.4337, -6.6893, -73.8239, -10.4337, -6.6893, -73.8239, -10.4337, -10.033899, -71.2999, -10.4337, -10.033899, -71.2999, -10.4337, -10.033899, -68.2489, -10.4337, -6.6893, -71.2999, -10.4337, -6.6893, -73.8239, -10.4337, -6.6893, -71.2999, -10.4337, -10.033899, -71.2999, -10.4337, -6.6893, -71.2999, -10.4337, -6.6893, -68.2489, -10.4337, -6.6893, -68.2489, -10.4337, -3.3446002, -73.8239, -10.4337, -3.3446002, -73.8239, -10.4337, -6.6893, -71.2999, -10.4337, -6.6893, -71.2999, -10.4337, -6.6893, -68.2489, -10.4337, -3.3446002, -71.2999, -10.4337, -3.3446002, -73.8239, -10.4337, -3.3446002, -71.2999, -10.4337, -6.6893, -71.2999, -10.4337, -3.3446002, -68.2489, -10.4337, 0, -71.2999, -10.4337, -3.3446002, -68.2489, -10.4337, -3.3446002, -71.2999, -10.4337, 0, -73.8239, -10.4337, -3.3446002, -71.2999, -10.4337, -3.3446002, -68.2489, -10.4337, 0, -71.2999, -10.4337, 0, -71.2999, -10.4337, -3.3446002, -71.2999, -10.4337, 0, -73.8239, -10.4337, 0, -73.8239, -10.4337, -3.3446002, -64.963196, -10.4337, 0, -68.2489, -10.4337, 0, -68.2489, -10.4337, -3.3446002, -73.8239, -10.4337, 0, -71.2999, -10.4337, 0, -71.2999, -10.4337, 3.3446, -73.8239, -10.4337, 0, -71.2999, -10.4337, 3.3446, -73.8239, -10.4337, 3.3446, -71.2999, -10.4337, 0, -68.2489, -10.4337, 0, -68.2489, -10.4337, 3.3446, -71.2999, -10.4337, 0, -68.2489, -10.4337, 3.3446, -71.2999, -10.4337, 3.3446, -68.2489, -10.4337, 0, -64.963196, -10.4337, 0, -64.963196, -10.4337, 3.3446, -68.2489, -10.4337, 0, -64.963196, -10.4337, 3.3446, -68.2489, -10.4337, 3.3446, -64.963196, -10.4337, 0, -62.057194, -10.4337, 3.3446, -64.963196, -10.4337, 3.3446, -62.057194, -10.4337, 3.3446, -64.963196, -10.4337, 6.6893, -64.963196, -10.4337, 3.3446, -64.963196, -10.4337, 6.6893, -68.2489, -10.4337, 3.3446, -64.963196, -10.4337, 3.3446, -62.057194, -10.4337, 3.3446, -62.057194, -10.4337, 6.6893, -64.963196, -10.4337, 6.6893, -62.057194, -10.4337, 10.033899, -64.963196, -10.4337, 6.6893, -62.057194, -10.4337, 6.6893, -64.963196, -10.4337, 6.6893, -62.057194, -10.4337, 10.033899, -62.057194, -10.4337, 13.378601, -64.963196, -10.4337, 6.6893, -68.2489, -10.4337, 6.6893, -68.2489, -10.4337, 3.3446, -68.2489, -10.4337, 6.6893, -71.2999, -10.4337, 3.3446, -68.2489, -10.4337, 3.3446, -64.963196, -10.4337, 6.6893, -62.057194, -10.4337, 13.378601, -64.963196, -10.4337, 13.378601, -64.963196, -10.4337, 13.378601, -68.2489, -10.4337, 6.6893, -64.963196, -10.4337, 6.6893, -62.057194, -10.4337, 13.378601, -64.963196, -10.4337, 16.7232, -64.963196, -10.4337, 13.378601, -62.057194, -10.4337, 13.378601, -62.057194, -10.4337, 16.7232, -64.963196, -10.4337, 16.7232, -64.963196, -10.4337, 13.378601, -68.2489, -10.4337, 13.378601, -68.2489, -10.4337, 6.6893, -64.963196, -10.4337, 16.7232, -68.2489, -10.4337, 13.378601, -64.963196, -10.4337, 13.378601, -68.2489, -10.4337, 6.6893, -71.2999, -10.4337, 6.6893, -71.2999, -10.4337, 3.3446, -68.2489, -10.4337, 13.378601, -71.2999, -10.4337, 6.6893, -68.2489, -10.4337, 6.6893, -71.2999, -10.4337, 6.6893, -73.8239, -10.4337, 3.3446, -71.2999, -10.4337, 3.3446, -71.2999, -10.4337, 6.6893, -73.8239, -10.4337, 6.6893, -73.8239, -10.4337, 3.3446, -71.2999, -10.4337, 6.6893, -73.8239, -10.4337, 10.033899, -73.8239, -10.4337, 6.6893, -71.2999, -10.4337, 6.6893, -73.8239, -10.4337, 13.378601, -73.8239, -10.4337, 10.033899, -68.2489, -10.4337, 13.378601, -71.2999, -10.4337, 13.378601, -71.2999, -10.4337, 6.6893, -73.8239, -10.4337, 13.378601, -71.2999, -10.4337, 6.6893, -71.2999, -10.4337, 13.378601, -64.963196, -10.4337, 16.7232, -68.2489, -10.4337, 16.7232, -68.2489, -10.4337, 13.378601, -68.2489, -10.4337, 16.7232, -71.2999, -10.4337, 13.378601, -68.2489, -10.4337, 13.378601, -71.2999, -10.4337, 16.7232, -73.8239, -10.4337, 13.378601, -71.2999, -10.4337, 13.378601, -68.2489, -10.4337, 16.7232, -71.2999, -10.4337, 16.7232, -71.2999, -10.4337, 13.378601, -71.2999, -10.4337, 16.7232, -73.8239, -10.4337, 16.7232, -73.8239, -10.4337, 13.378601, -64.963196, -10.4337, 20.0679, -68.2489, -10.4337, 16.7232, -64.963196, -10.4337, 16.7232, -62.057194, -10.4337, 16.7232, -64.963196, -10.4337, 20.0679, -64.963196, -10.4337, 16.7232, -62.057194, -10.4337, 16.7232, -62.057194, -10.4337, 20.0679, -64.963196, -10.4337, 20.0679, -64.963196, -10.4337, 20.0679, -68.2489, -10.4337, 20.0679, -68.2489, -10.4337, 16.7232, -68.2489, -10.4337, 20.0679, -71.2999, -10.4337, 16.7232, -68.2489, -10.4337, 16.7232, -62.057194, -10.4337, 20.0679, -64.963196, -10.4337, 23.412498, -64.963196, -10.4337, 20.0679, -64.963196, -10.4337, 23.412498, -68.2489, -10.4337, 20.0679, -64.963196, -10.4337, 20.0679, -62.057194, -10.4337, 20.0679, -62.057194, -10.4337, 23.412498, -64.963196, -10.4337, 23.412498, -71.2999, -10.4337, 20.0679, -73.8239, -10.4337, 16.7232, -71.2999, -10.4337, 16.7232, -68.2489, -10.4337, 20.0679, -71.2999, -10.4337, 20.0679, -71.2999, -10.4337, 16.7232, -71.2999, -10.4337, 20.0679, -73.8239, -10.4337, 20.0679, -73.8239, -10.4337, 16.7232, -64.963196, -10.4337, 23.412498, -68.2489, -10.4337, 23.412498, -68.2489, -10.4337, 20.0679, -68.2489, -10.4337, 23.412498, -71.2999, -10.4337, 20.0679, -68.2489, -10.4337, 20.0679, -62.057194, -10.4337, 23.412498, -64.963196, -10.4337, 26.7572, -64.963196, -10.4337, 23.412498, -64.963196, -10.4337, 26.7572, -68.2489, -10.4337, 23.412498, -64.963196, -10.4337, 23.412498, -62.057194, -10.4337, 23.412498, -62.057194, -10.4337, 26.7572, -64.963196, -10.4337, 26.7572, -71.2999, -10.4337, 23.412498, -73.8239, -10.4337, 20.0679, -71.2999, -10.4337, 20.0679, -68.2489, -10.4337, 23.412498, -71.2999, -10.4337, 23.412498, -71.2999, -10.4337, 20.0679, -71.2999, -10.4337, 23.412498, -73.8239, -10.4337, 23.412498, -73.8239, -10.4337, 20.0679, -68.2489, -10.4337, 26.7572, -71.2999, -10.4337, 23.412498, -68.2489, -10.4337, 23.412498, -64.963196, -10.4337, 26.7572, -68.2489, -10.4337, 26.7572, -68.2489, -10.4337, 23.412498, -71.2999, -10.4337, 26.7572, -73.8239, -10.4337, 23.412498, -71.2999, -10.4337, 23.412498, -68.2489, -10.4337, 26.7572, -71.2999, -10.4337, 26.7572, -71.2999, -10.4337, 23.412498, -71.2999, -10.4337, 26.7572, -73.8239, -10.4337, 26.7572, -73.8239, -10.4337, 23.412498, -73.8239, -10.4337, 26.7572, -71.2999, -10.4337, 26.7572, -72.9579, -10.4337, 27.7057, -71.2999, -10.4337, 26.7572, -71.694496, -10.4337, 29.089499, -72.9579, -10.4337, 27.7057, -71.2999, -10.4337, 26.7572, -70.1271, -10.4337, 28.0285, -71.694496, -10.4337, 29.089499, -71.2999, -10.4337, 26.7572, -68.2489, -10.4337, 26.7572, -70.1271, -10.4337, 28.0285, -70.1271, -10.4337, 28.0285, -70.3329, -10.4337, 30.580898, -71.694496, -10.4337, 29.089499, -70.1271, -10.4337, 28.0285, -68.7877, -10.4337, 29.480598, -70.3329, -10.4337, 30.580898, -68.2489, -10.4337, 26.7572, -68.7877, -10.4337, 29.480598, -70.1271, -10.4337, 28.0285, -68.7877, -10.4337, 29.480598, -69.0569, -10.4337, 31.9786, -70.3329, -10.4337, 30.580898, -68.2489, -10.4337, 26.7572, -66.948, -10.4337, 28.1705, -68.7877, -10.4337, 29.480598, -68.2489, -10.4337, 26.7572, -64.963196, -10.4337, 26.7572, -66.948, -10.4337, 28.1705, -68.7877, -10.4337, 29.480598, -67.5324, -10.4337, 30.8414, -69.0569, -10.4337, 31.9786, -66.948, -10.4337, 28.1705, -67.5324, -10.4337, 30.8414, -68.7877, -10.4337, 29.480598, -67.5324, -10.4337, 30.8414, -67.618996, -10.4337, 33.553497, -69.0569, -10.4337, 31.9786, -64.963196, -10.4337, 26.7572, -65.7283, -10.4337, 29.495699, -66.948, -10.4337, 28.1705, -66.948, -10.4337, 28.1705, -65.7283, -10.4337, 29.495699, -67.5324, -10.4337, 30.8414, -67.5324, -10.4337, 30.8414, -66.0847, -10.4337, 32.410698, -67.618996, -10.4337, 33.553497, -65.7283, -10.4337, 29.495699, -66.0847, -10.4337, 32.410698, -67.5324, -10.4337, 30.8414, -66.0847, -10.4337, 32.410698, -66.2484, -10.4337, 35.0548, -67.618996, -10.4337, 33.553497, -64.963196, -10.4337, 26.7572, -63.779697, -10.4337, 28.042099, -65.7283, -10.4337, 29.495699, -64.963196, -10.4337, 26.7572, -62.057194, -10.4337, 26.7572, -63.779697, -10.4337, 28.042099, -65.7283, -10.4337, 29.495699, -64.2815, -10.4337, 31.0675, -66.0847, -10.4337, 32.410698, -63.779697, -10.4337, 28.042099, -64.2815, -10.4337, 31.0675, -65.7283, -10.4337, 29.495699, -66.0847, -10.4337, 32.410698, -64.736496, -10.4337, 33.8722, -66.2484, -10.4337, 35.0548, -64.2815, -10.4337, 31.0675, -64.736496, -10.4337, 33.8722, -66.0847, -10.4337, 32.410698, -64.736496, -10.4337, 33.8722, -65.1522, -10.4337, 36.255398, -66.2484, -10.4337, 35.0548, -62.057194, -10.4337, 26.7572, -62.331196, -10.4337, 29.6148, -63.779697, -10.4337, 28.042099, -63.779697, -10.4337, 28.042099, -62.331196, -10.4337, 29.6148, -64.2815, -10.4337, 31.0675, -62.057194, -10.4337, 26.7572, -60.611, -10.4337, 28.3335, -62.331196, -10.4337, 29.6148, -64.2815, -10.4337, 31.0675, -62.971096, -10.4337, 32.4913, -64.736496, -10.4337, 33.8722, -62.331196, -10.4337, 29.6148, -62.971096, -10.4337, 32.4913, -64.2815, -10.4337, 31.0675, -64.736496, -10.4337, 33.8722, -63.642498, -10.4337, 35.0582, -65.1522, -10.4337, 36.255398, -62.971096, -10.4337, 32.4913, -63.642498, -10.4337, 35.0582, -64.736496, -10.4337, 33.8722, -63.642498, -10.4337, 35.0582, -63.8252, -10.4337, 37.7089, -65.1522, -10.4337, 36.255398, -60.611, -10.4337, 28.3335, -61.059097, -10.4337, 30.9959, -62.331196, -10.4337, 29.6148, -62.331196, -10.4337, 29.6148, -61.059097, -10.4337, 30.9959, -62.971096, -10.4337, 32.4913, -60.611, -10.4337, 28.3335, -59.3761, -10.4337, 29.679499, -61.059097, -10.4337, 30.9959, -62.971096, -10.4337, 32.4913, -61.8887, -10.4337, 33.667297, -63.642498, -10.4337, 35.0582, -61.059097, -10.4337, 30.9959, -61.8887, -10.4337, 33.667297, -62.971096, -10.4337, 32.4913, -63.642498, -10.4337, 35.0582, -62.323597, -10.4337, 36.4879, -63.8252, -10.4337, 37.7089, -61.8887, -10.4337, 33.667297, -62.323597, -10.4337, 36.4879, -63.642498, -10.4337, 35.0582, -62.323597, -10.4337, 36.4879, -62.558193, -10.4337, 39.0967, -63.8252, -10.4337, 37.7089, -59.3761, -10.4337, 29.679499, -59.9874, -10.4337, 32.1594, -61.059097, -10.4337, 30.9959, -61.059097, -10.4337, 30.9959, -59.9874, -10.4337, 32.1594, -61.8887, -10.4337, 33.667297, -59.3761, -10.4337, 29.679499, -58.316597, -10.4337, 30.834398, -59.9874, -10.4337, 32.1594, -61.8887, -10.4337, 33.667297, -60.59, -10.4337, 35.078197, -62.323597, -10.4337, 36.4879, -59.9874, -10.4337, 32.1594, -60.59, -10.4337, 35.078197, -61.8887, -10.4337, 33.667297, -62.323597, -10.4337, 36.4879, -61.055798, -10.4337, 37.8623, -62.558193, -10.4337, 39.0967, -60.59, -10.4337, 35.078197, -61.055798, -10.4337, 37.8623, -62.323597, -10.4337, 36.4879, -61.055798, -10.4337, 37.8623, -61.1665, -10.4337, 40.621098, -62.558193, -10.4337, 39.0967, -58.316597, -10.4337, 30.834398, -58.708298, -10.4337, 33.5481, -59.9874, -10.4337, 32.1594, -59.9874, -10.4337, 32.1594, -58.708298, -10.4337, 33.5481, -60.59, -10.4337, 35.078197, -58.316597, -10.4337, 30.834398, -57.058, -10.4337, 32.2062, -58.708298, -10.4337, 33.5481, -60.59, -10.4337, 35.078197, -59.331398, -10.4337, 36.4456, -61.055798, -10.4337, 37.8623, -58.708298, -10.4337, 33.5481, -59.331398, -10.4337, 36.4456, -60.59, -10.4337, 35.078197, -61.055798, -10.4337, 37.8623, -59.6695, -10.4337, 39.3651, -61.1665, -10.4337, 40.621098, -59.331398, -10.4337, 36.4456, -59.6695, -10.4337, 39.3651, -61.055798, -10.4337, 37.8623, -59.6695, -10.4337, 39.3651, -59.815098, -10.4337, 42.1012, -61.1665, -10.4337, 40.621098, -57.058, -10.4337, 32.2062, -57.457497, -10.4337, 34.906097, -58.708298, -10.4337, 33.5481, -58.708298, -10.4337, 33.5481, -57.457497, -10.4337, 34.906097, -59.331398, -10.4337, 36.4456, -57.058, -10.4337, 32.2062, -55.8173, -10.4337, 33.5585, -57.457497, -10.4337, 34.906097, -59.331398, -10.4337, 36.4456, -57.962597, -10.4337, 37.9328, -59.6695, -10.4337, 39.3651, -57.457497, -10.4337, 34.906097, -57.962597, -10.4337, 37.9328, -59.331398, -10.4337, 36.4456, -59.6695, -10.4337, 39.3651, -58.3182, -10.4337, 40.8299, -59.815098, -10.4337, 42.1012, -57.962597, -10.4337, 37.9328, -58.3182, -10.4337, 40.8299, -59.6695, -10.4337, 39.3651, -58.3182, -10.4337, 40.8299, -58.397198, -10.4337, 43.6543, -59.815098, -10.4337, 42.1012, -55.8173, -10.4337, 33.5585, -56.105198, -10.4337, 36.374397, -57.457497, -10.4337, 34.906097, -57.457497, -10.4337, 34.906097, -56.105198, -10.4337, 36.374397, -57.962597, -10.4337, 37.9328, -55.8173, -10.4337, 33.5585, -54.4828, -10.4337, 35.0131, -56.105198, -10.4337, 36.374397, -57.962597, -10.4337, 37.9328, -56.621998, -10.4337, 39.389297, -58.3182, -10.4337, 40.8299, -56.105198, -10.4337, 36.374397, -56.621998, -10.4337, 39.389297, -57.962597, -10.4337, 37.9328, -58.3182, -10.4337, 40.8299, -56.8974, -10.4337, 42.370197, -58.397198, -10.4337, 43.6543, -56.621998, -10.4337, 39.389297, -56.8974, -10.4337, 42.370197, -58.3182, -10.4337, 40.8299, -56.8974, -10.4337, 42.370197, -57.1702, -10.4337, 44.9982, -58.397198, -10.4337, 43.6543, -54.4828, -10.4337, 35.0131, -54.7739, -10.4337, 37.819798, -56.105198, -10.4337, 36.374397, -56.105198, -10.4337, 36.374397, -54.7739, -10.4337, 37.819798, -56.621998, -10.4337, 39.389297, -54.4828, -10.4337, 35.0131, -53.163, -10.4337, 36.4517, -54.7739, -10.4337, 37.819798, -56.621998, -10.4337, 39.389297, -55.2089, -10.4337, 40.9246, -56.8974, -10.4337, 42.370197, -54.7739, -10.4337, 37.819798, -55.2089, -10.4337, 40.9246, -56.621998, -10.4337, 39.389297, -56.8974, -10.4337, 42.370197, -55.676598, -10.4337, 43.6936, -57.1702, -10.4337, 44.9982, -55.2089, -10.4337, 40.9246, -55.676598, -10.4337, 43.6936, -56.8974, -10.4337, 42.370197, -55.676598, -10.4337, 43.6936, -55.7286, -10.4337, 46.577297, -57.1702, -10.4337, 44.9982, -53.163, -10.4337, 36.4517, -53.3668, -10.4337, 39.3474, -54.7739, -10.4337, 37.819798, -54.7739, -10.4337, 37.819798, -53.3668, -10.4337, 39.3474, -55.2089, -10.4337, 40.9246, -53.163, -10.4337, 36.4517, -51.764698, -10.4337, 37.9757, -53.3668, -10.4337, 39.3474, -55.2089, -10.4337, 40.9246, -54.004498, -10.4337, 42.233097, -55.676598, -10.4337, 43.6936, -53.3668, -10.4337, 39.3474, -54.004498, -10.4337, 42.233097, -55.2089, -10.4337, 40.9246, -55.676598, -10.4337, 43.6936, -54.2416, -10.4337, 45.2492, -55.7286, -10.4337, 46.577297, -54.004498, -10.4337, 42.233097, -54.2416, -10.4337, 45.2492, -55.676598, -10.4337, 43.6936, -54.2416, -10.4337, 45.2492, -54.056297, -10.4337, 48.408897, -55.7286, -10.4337, 46.577297, -51.764698, -10.4337, 37.9757, -52.1782, -10.4337, 40.637897, -53.3668, -10.4337, 39.3474, -53.3668, -10.4337, 39.3474, -52.1782, -10.4337, 40.637897, -54.004498, -10.4337, 42.233097, -51.764698, -10.4337, 37.9757, -50.5928, -10.4337, 39.2532, -52.1782, -10.4337, 40.637897, -54.004498, -10.4337, 42.233097, -52.5879, -10.4337, 43.772198, -54.2416, -10.4337, 45.2492, -52.1782, -10.4337, 40.637897, -52.5879, -10.4337, 43.772198, -54.004498, -10.4337, 42.233097, -54.2416, -10.4337, 45.2492, -52.5793, -10.4337, 47.051098, -54.056297, -10.4337, 48.408897, -52.5879, -10.4337, 43.772198, -52.5793, -10.4337, 47.051098, -54.2416, -10.4337, 45.2492, -52.5793, -10.4337, 47.051098, -52.2215, -10.4337, 50.418697, -54.056297, -10.4337, 48.408897, -50.5928, -10.4337, 39.2532, -50.779198, -10.4337, 42.1568, -52.1782, -10.4337, 40.637897, -52.1782, -10.4337, 40.637897, -50.779198, -10.4337, 42.1568, -52.5879, -10.4337, 43.772198, -50.5928, -10.4337, 39.2532, -49.212498, -10.4337, 40.7576, -50.779198, -10.4337, 42.1568, -52.5879, -10.4337, 43.772198, -50.9492, -10.4337, 45.552597, -52.5793, -10.4337, 47.051098, -50.779198, -10.4337, 42.1568, -50.9492, -10.4337, 45.552597, -52.5879, -10.4337, 43.772198, -52.5793, -10.4337, 47.051098, -50.741398, -10.4337, 49.0436, -52.2215, -10.4337, 50.418697, -50.9492, -10.4337, 45.552597, -50.741398, -10.4337, 49.0436, -52.5793, -10.4337, 47.051098, -50.741398, -10.4337, 49.0436, -50.267597, -10.4337, 52.5587, -52.2215, -10.4337, 50.418697, -49.212498, -10.4337, 40.7576, -49.163498, -10.4337, 43.911, -50.779198, -10.4337, 42.1568, -50.779198, -10.4337, 42.1568, -49.163498, -10.4337, 43.911, -50.9492, -10.4337, 45.552597, -49.212498, -10.4337, 40.7576, -47.620697, -10.4337, 42.4927, -49.163498, -10.4337, 43.911, -50.9492, -10.4337, 45.552597, -49.1213, -10.4337, 47.5384, -50.741398, -10.4337, 49.0436, -49.163498, -10.4337, 43.911, -49.1213, -10.4337, 47.5384, -50.9492, -10.4337, 45.552597, -50.741398, -10.4337, 49.0436, -48.787197, -10.4337, 51.162, -50.267597, -10.4337, 52.5587, -49.1213, -10.4337, 47.5384, -48.787197, -10.4337, 51.162, -50.741398, -10.4337, 49.0436, -48.787197, -10.4337, 51.162, -48.3197, -10.4337, 54.6923, -50.267597, -10.4337, 52.5587, -47.620697, -10.4337, 42.4927, -47.343597, -10.4337, 45.8868, -49.163498, -10.4337, 43.911, -49.163498, -10.4337, 43.911, -47.343597, -10.4337, 45.8868, -49.1213, -10.4337, 47.5384, -47.620697, -10.4337, 42.4927, -45.8121, -10.4337, 44.463898, -47.343597, -10.4337, 45.8868, -49.1213, -10.4337, 47.5384, -47.181, -10.4337, 49.6466, -48.787197, -10.4337, 51.162, -47.343597, -10.4337, 45.8868, -47.181, -10.4337, 49.6466, -49.1213, -10.4337, 47.5384, -48.787197, -10.4337, 51.162, -46.8489, -10.4337, 53.263298, -48.3197, -10.4337, 54.6923, -47.181, -10.4337, 49.6466, -46.8489, -10.4337, 53.263298, -48.787197, -10.4337, 51.162, -46.8489, -10.4337, 53.263298, -46.839, -10.4337, 56.314198, -48.3197, -10.4337, 54.6923, -45.8121, -10.4337, 44.463898, -45.4151, -10.4337, 47.9805, -47.343597, -10.4337, 45.8868, -47.343597, -10.4337, 45.8868, -45.4151, -10.4337, 47.9805, -47.181, -10.4337, 49.6466, -45.8121, -10.4337, 44.463898, -43.8985, -10.4337, 46.549698, -45.4151, -10.4337, 47.9805, -47.181, -10.4337, 49.6466, -45.2669, -10.4337, 51.7262, -46.8489, -10.4337, 53.263298, -45.4151, -10.4337, 47.9805, -45.2669, -10.4337, 51.7262, -47.181, -10.4337, 49.6466, -46.8489, -10.4337, 53.263298, -45.3659, -10.4337, 54.8708, -46.839, -10.4337, 56.314198, -45.2669, -10.4337, 51.7262, -45.3659, -10.4337, 54.8708, -46.8489, -10.4337, 53.263298, -45.3659, -10.4337, 54.8708, -45.411, -10.4337, 57.8783, -46.839, -10.4337, 56.314198, -43.8985, -10.4337, 46.549698, -43.524498, -10.4337, 50.0333, -45.4151, -10.4337, 47.9805, -45.4151, -10.4337, 47.9805, -43.524498, -10.4337, 50.0333, -45.2669, -10.4337, 51.7262, -43.8985, -10.4337, 46.549698, -42.032497, -10.4337, 48.5836, -43.524498, -10.4337, 50.0333, -45.2669, -10.4337, 51.7262, -43.792, -10.4337, 53.328598, -45.3659, -10.4337, 54.8708, -43.524498, -10.4337, 50.0333, -43.792, -10.4337, 53.328598, -45.2669, -10.4337, 51.7262, -45.3659, -10.4337, 54.8708, -43.935497, -10.4337, 56.421497, -45.411, -10.4337, 57.8783, -43.792, -10.4337, 53.328598, -43.935497, -10.4337, 56.421497, -45.3659, -10.4337, 54.8708, -43.935497, -10.4337, 56.421497, -43.670998, -10.4337, 59.7842, -45.411, -10.4337, 57.8783, -42.032497, -10.4337, 48.5836, -42.056, -10.4337, 51.6275, -43.524498, -10.4337, 50.0333, -43.524498, -10.4337, 50.0333, -42.056, -10.4337, 51.6275, -43.792, -10.4337, 53.328598, -42.032497, -10.4337, 48.5836, -40.572998, -10.4337, 50.1744, -42.056, -10.4337, 51.6275, -43.792, -10.4337, 53.328598, -42.368797, -10.4337, 54.874798, -43.935497, -10.4337, 56.421497, -42.056, -10.4337, 51.6275, -42.368797, -10.4337, 54.874798, -43.792, -10.4337, 53.328598, -43.935497, -10.4337, 56.421497, -42.2006, -10.4337, 58.3022, -43.670998, -10.4337, 59.7842, -42.368797, -10.4337, 54.874798, -42.2006, -10.4337, 58.3022, -43.935497, -10.4337, 56.421497, -42.2006, -10.4337, 58.3022, -41.9354, -10.4337, 61.685097, -43.670998, -10.4337, 59.7842, -40.572998, -10.4337, 50.1744, -40.6386, -10.4337, 53.1665, -42.056, -10.4337, 51.6275, -42.056, -10.4337, 51.6275, -40.6386, -10.4337, 53.1665, -42.368797, -10.4337, 54.874798, -40.572998, -10.4337, 50.1744, -39.1638, -10.4337, 51.7104, -40.6386, -10.4337, 53.1665, -42.368797, -10.4337, 54.874798, -40.6512, -10.4337, 56.7408, -42.2006, -10.4337, 58.3022, -40.6386, -10.4337, 53.1665, -40.6512, -10.4337, 56.7408, -42.368797, -10.4337, 54.874798, -42.2006, -10.4337, 58.3022, -40.4544, -10.4337, 60.1951, -41.9354, -10.4337, 61.685097, -40.6512, -10.4337, 56.7408, -40.4544, -10.4337, 60.1951, -42.2006, -10.4337, 58.3022, -40.4544, -10.4337, 60.1951, -40.3009, -10.4337, 63.4754, -41.9354, -10.4337, 61.685097, -39.1638, -10.4337, 51.7104, -38.937298, -10.4337, 55.0135, -40.6386, -10.4337, 53.1665, -40.6386, -10.4337, 53.1665, -38.937298, -10.4337, 55.0135, -40.6512, -10.4337, 56.7408, -39.1638, -10.4337, 51.7104, -37.4804, -10.4337, 53.5453, -38.937298, -10.4337, 55.0135, -40.6512, -10.4337, 56.7408, -38.9059, -10.4337, 58.6371, -40.4544, -10.4337, 60.1951, -38.937298, -10.4337, 55.0135, -38.9059, -10.4337, 58.6371, -40.6512, -10.4337, 56.7408, -40.4544, -10.4337, 60.1951, -38.822998, -10.4337, 61.9637, -40.3009, -10.4337, 63.4754, -38.9059, -10.4337, 58.6371, -38.822998, -10.4337, 61.9637, -40.4544, -10.4337, 60.1951, -38.822998, -10.4337, 61.9637, -38.953697, -10.4337, 64.951, -40.3009, -10.4337, 63.4754, -37.4804, -10.4337, 53.5453, -37.1899, -10.4337, 56.910698, -38.937298, -10.4337, 55.0135, -38.937298, -10.4337, 55.0135, -37.1899, -10.4337, 56.910698, -38.9059, -10.4337, 58.6371, -37.4804, -10.4337, 53.5453, -35.735397, -10.4337, 55.4473, -37.1899, -10.4337, 56.910698, -38.9059, -10.4337, 58.6371, -37.2887, -10.4337, 60.3941, -38.822998, -10.4337, 61.9637, -37.1899, -10.4337, 56.910698, -37.2887, -10.4337, 60.3941, -38.9059, -10.4337, 58.6371, -38.822998, -10.4337, 61.9637, -37.4867, -10.4337, 63.4123, -38.953697, -10.4337, 64.951, -37.2887, -10.4337, 60.3941, -37.4867, -10.4337, 63.4123, -38.822998, -10.4337, 61.9637, -37.4867, -10.4337, 63.4123, -37.4493, -10.4337, 66.5989, -38.953697, -10.4337, 64.951, -35.735397, -10.4337, 55.4473, -35.5858, -10.4337, 58.6522, -37.1899, -10.4337, 56.910698, -37.1899, -10.4337, 56.910698, -35.5858, -10.4337, 58.6522, -37.2887, -10.4337, 60.3941, -35.735397, -10.4337, 55.4473, -34.1461, -10.4337, 57.1796, -35.5858, -10.4337, 58.6522, -37.2887, -10.4337, 60.3941, -35.9725, -10.4337, 61.824097, -37.4867, -10.4337, 63.4123, -35.5858, -10.4337, 58.6522, -35.9725, -10.4337, 61.824097, -37.2887, -10.4337, 60.3941, -37.4867, -10.4337, 63.4123, -35.9927, -10.4337, 65.0319, -37.4493, -10.4337, 66.5989, -35.9725, -10.4337, 61.824097, -35.9927, -10.4337, 65.0319, -37.4867, -10.4337, 63.4123, -35.9927, -10.4337, 65.0319, -36.0228, -10.4337, 68.1614, -37.4493, -10.4337, 66.5989, -34.1461, -10.4337, 57.1796, -34.2898, -10.4337, 60.0593, -35.5858, -10.4337, 58.6522, -35.5858, -10.4337, 58.6522, -34.2898, -10.4337, 60.0593, -35.9725, -10.4337, 61.824097, -34.1461, -10.4337, 57.1796, -32.870197, -10.4337, 58.570297, -34.2898, -10.4337, 60.0593, -35.9725, -10.4337, 61.824097, -34.499, -10.4337, 63.425, -35.9927, -10.4337, 65.0319, -34.2898, -10.4337, 60.0593, -34.499, -10.4337, 63.425, -35.9725, -10.4337, 61.824097, -35.9927, -10.4337, 65.0319, -34.5678, -10.4337, 66.5766, -36.0228, -10.4337, 68.1614, -34.499, -10.4337, 63.425, -34.5678, -10.4337, 66.5766, -35.9927, -10.4337, 65.0319, -34.5678, -10.4337, 66.5766, -34.1187, -10.4337, 70.246895, -36.0228, -10.4337, 68.1614, -32.870197, -10.4337, 58.570297, -32.8368, -10.4337, 61.636898, -34.2898, -10.4337, 60.0593, -34.2898, -10.4337, 60.0593, -32.8368, -10.4337, 61.636898, -34.499, -10.4337, 63.425, -32.870197, -10.4337, 58.570297, -31.437601, -10.4337, 60.131798, -32.8368, -10.4337, 61.636898, -34.499, -10.4337, 63.425, -33.0849, -10.4337, 64.961395, -34.5678, -10.4337, 66.5766, -32.8368, -10.4337, 61.636898, -33.0849, -10.4337, 64.961395, -34.499, -10.4337, 63.425, -34.5678, -10.4337, 66.5766, -32.69, -10.4337, 68.6121, -34.1187, -10.4337, 70.246895, -33.0849, -10.4337, 64.961395, -32.69, -10.4337, 68.6121, -34.5678, -10.4337, 66.5766, -32.69, -10.4337, 68.6121, -32.6527, -10.4337, 71.8527, -34.1187, -10.4337, 70.246895, -31.437601, -10.4337, 60.131798, -31.4325, -10.4337, 63.1615, -32.8368, -10.4337, 61.636898, -32.8368, -10.4337, 61.636898, -31.4325, -10.4337, 63.1615, -33.0849, -10.4337, 64.961395, -31.437601, -10.4337, 60.131798, -30.044802, -10.4337, 61.649998, -31.4325, -10.4337, 63.1615, -33.0849, -10.4337, 64.961395, -31.245802, -10.4337, 66.959496, -32.69, -10.4337, 68.6121, -31.4325, -10.4337, 63.1615, -31.245802, -10.4337, 66.959496, -33.0849, -10.4337, 64.961395, -32.69, -10.4337, 68.6121, -31.2026, -10.4337, 70.2246, -32.6527, -10.4337, 71.8527, -31.245802, -10.4337, 66.959496, -31.2026, -10.4337, 70.2246, -32.69, -10.4337, 68.6121, -31.2026, -10.4337, 70.2246, -31.218801, -10.4337, 73.423195, -32.6527, -10.4337, 71.8527, -30.044802, -10.4337, 61.649998, -29.633501, -10.4337, 65.1147, -31.4325, -10.4337, 63.1615, -31.4325, -10.4337, 63.1615, -29.633501, -10.4337, 65.1147, -31.245802, -10.4337, 66.959496, -30.044802, -10.4337, 61.649998, -28.2834, -10.4337, 63.569798, -29.633501, -10.4337, 65.1147, -31.245802, -10.4337, 66.959496, -29.745901, -10.4337, 68.589, -31.2026, -10.4337, 70.2246, -29.633501, -10.4337, 65.1147, -29.745901, -10.4337, 68.589, -31.245802, -10.4337, 66.959496, -31.2026, -10.4337, 70.2246, -29.787, -10.4337, 71.7591, -31.218801, -10.4337, 73.423195, -29.745901, -10.4337, 68.589, -29.787, -10.4337, 71.7591, -31.2026, -10.4337, 70.2246, -29.787, -10.4337, 71.7591, -29.6429, -10.4337, 75.1494, -31.218801, -10.4337, 73.423195, -28.2834, -10.4337, 63.569798, -28.117498, -10.4337, 66.7606, -29.633501, -10.4337, 65.1147, -29.633501, -10.4337, 65.1147, -28.117498, -10.4337, 66.7606, -29.745901, -10.4337, 68.589, -28.2834, -10.4337, 63.569798, -26.7572, -10.4337, 65.2334, -28.117498, -10.4337, 66.7606, -29.745901, -10.4337, 68.589, -28.357399, -10.4337, 70.097496, -29.787, -10.4337, 71.7591, -28.117498, -10.4337, 66.7606, -28.357399, -10.4337, 70.097496, -29.745901, -10.4337, 68.589, -29.787, -10.4337, 71.7591, -28.1941, -10.4337, 73.4859, -29.6429, -10.4337, 75.1494, -28.357399, -10.4337, 70.097496, -28.1941, -10.4337, 73.4859, -29.787, -10.4337, 71.7591, -28.1941, -10.4337, 73.4859, -28.2134, -10.4337, 76.715096, -29.6429, -10.4337, 75.1494, -26.7572, -10.4337, 65.2334, -26.7572, -10.4337, 68.237495, -28.117498, -10.4337, 66.7606, -28.117498, -10.4337, 66.7606, -26.7572, -10.4337, 68.237495, -28.357399, -10.4337, 70.097496, -26.7572, -10.4337, 68.237495, -26.7572, -10.4337, 65.2334, -23.412498, -10.4337, 65.2334, -28.1941, -10.4337, 73.4859, -26.7572, -10.4337, 75.043594, -28.2134, -10.4337, 76.715096, -26.7572, -10.4337, 75.043594, -26.7572, -10.4337, 78.3101, -28.2134, -10.4337, 76.715096, -28.357399, -10.4337, 70.097496, -26.7572, -10.4337, 71.8361, -28.1941, -10.4337, 73.4859, -26.7572, -10.4337, 68.237495, -26.7572, -10.4337, 71.8361, -28.357399, -10.4337, 70.097496, -26.7572, -10.4337, 71.8361, -26.7572, -10.4337, 75.043594, -28.1941, -10.4337, 73.4859, -23.412498, -10.4337, 78.3101, -26.7572, -10.4337, 78.3101, -26.7572, -10.4337, 75.043594, -26.7572, -10.4337, 71.8361, -26.7572, -10.4337, 68.237495, -23.412498, -10.4337, 68.237495, -26.7572, -10.4337, 68.237495, -23.412498, -10.4337, 65.2334, -23.412498, -10.4337, 68.237495, -23.412498, -10.4337, 68.237495, -23.412498, -10.4337, 65.2334, -20.0679, -10.4337, 65.2334, -26.7572, -10.4337, 71.8361, -23.412498, -10.4337, 68.237495, -23.412498, -10.4337, 71.8361, -26.7572, -10.4337, 75.043594, -26.7572, -10.4337, 71.8361, -23.412498, -10.4337, 71.8361, -23.412498, -10.4337, 68.237495, -20.0679, -10.4337, 65.2334, -20.0679, -10.4337, 68.237495, -23.412498, -10.4337, 71.8361, -23.412498, -10.4337, 68.237495, -20.0679, -10.4337, 68.237495, -16.7232, -10.4337, 65.2334, -20.0679, -10.4337, 68.237495, -20.0679, -10.4337, 65.2334, -23.412498, -10.4337, 78.3101, -26.7572, -10.4337, 75.043594, -23.412498, -10.4337, 75.043594, -26.7572, -10.4337, 75.043594, -23.412498, -10.4337, 71.8361, -23.412498, -10.4337, 75.043594, -20.0679, -10.4337, 78.3101, -23.412498, -10.4337, 78.3101, -23.412498, -10.4337, 75.043594, -23.412498, -10.4337, 71.8361, -20.0679, -10.4337, 68.237495, -20.0679, -10.4337, 71.8361, -23.412498, -10.4337, 75.043594, -23.412498, -10.4337, 71.8361, -20.0679, -10.4337, 71.8361, -16.7232, -10.4337, 65.2334, -16.7232, -10.4337, 68.237495, -20.0679, -10.4337, 68.237495, -16.7232, -10.4337, 68.237495, -20.0679, -10.4337, 71.8361, -20.0679, -10.4337, 68.237495, -16.7232, -10.4337, 68.237495, -16.7232, -10.4337, 65.2334, -13.378601, -10.4337, 65.2334, -23.412498, -10.4337, 75.043594, -20.0679, -10.4337, 71.8361, -20.0679, -10.4337, 75.043594, -20.0679, -10.4337, 78.3101, -23.412498, -10.4337, 75.043594, -20.0679, -10.4337, 75.043594, -16.7232, -10.4337, 68.237495, -16.7232, -10.4337, 71.8361, -20.0679, -10.4337, 71.8361, -16.7232, -10.4337, 71.8361, -20.0679, -10.4337, 75.043594, -20.0679, -10.4337, 71.8361, -16.7232, -10.4337, 75.043594, -20.0679, -10.4337, 78.3101, -20.0679, -10.4337, 75.043594, -16.7232, -10.4337, 71.8361, -16.7232, -10.4337, 75.043594, -20.0679, -10.4337, 75.043594, -16.7232, -10.4337, 75.043594, -16.7232, -10.4337, 78.3101, -20.0679, -10.4337, 78.3101, -16.7232, -10.4337, 71.8361, -16.7232, -10.4337, 68.237495, -13.378601, -10.4337, 68.237495, -16.7232, -10.4337, 68.237495, -13.378601, -10.4337, 65.2334, -13.378601, -10.4337, 68.237495, -16.7232, -10.4337, 75.043594, -16.7232, -10.4337, 71.8361, -13.378601, -10.4337, 71.8361, -16.7232, -10.4337, 71.8361, -13.378601, -10.4337, 68.237495, -13.378601, -10.4337, 71.8361, -16.7232, -10.4337, 78.3101, -16.7232, -10.4337, 75.043594, -13.378601, -10.4337, 75.043594, -16.7232, -10.4337, 75.043594, -13.378601, -10.4337, 71.8361, -13.378601, -10.4337, 75.043594, -16.7232, -10.4337, 78.3101, -13.378601, -10.4337, 75.043594, -13.378601, -10.4337, 78.3101, -13.378601, -10.4337, 65.2334, -10.033899, -10.4337, 68.237495, -13.378601, -10.4337, 68.237495, -10.033899, -10.4337, 68.237495, -13.378601, -10.4337, 71.8361, -13.378601, -10.4337, 68.237495, -13.378601, -10.4337, 65.2334, -10.033899, -10.4337, 65.2334, -10.033899, -10.4337, 68.237495, -10.033899, -10.4337, 71.8361, -13.378601, -10.4337, 75.043594, -13.378601, -10.4337, 71.8361, -10.033899, -10.4337, 68.237495, -10.033899, -10.4337, 71.8361, -13.378601, -10.4337, 71.8361, -10.033899, -10.4337, 75.043594, -13.378601, -10.4337, 78.3101, -13.378601, -10.4337, 75.043594, -10.033899, -10.4337, 71.8361, -10.033899, -10.4337, 75.043594, -13.378601, -10.4337, 75.043594, -10.033899, -10.4337, 75.043594, -10.033899, -10.4337, 78.3101, -13.378601, -10.4337, 78.3101, -10.033899, -10.4337, 65.2334, -6.6893, -10.4337, 68.237495, -10.033899, -10.4337, 68.237495, -6.6893, -10.4337, 68.237495, -10.033899, -10.4337, 71.8361, -10.033899, -10.4337, 68.237495, -10.033899, -10.4337, 65.2334, -6.6893, -10.4337, 65.2334, -6.6893, -10.4337, 68.237495, -6.6893, -10.4337, 71.8361, -10.033899, -10.4337, 75.043594, -10.033899, -10.4337, 71.8361, -6.6893, -10.4337, 68.237495, -6.6893, -10.4337, 71.8361, -10.033899, -10.4337, 71.8361, -6.6893, -10.4337, 75.043594, -10.033899, -10.4337, 78.3101, -10.033899, -10.4337, 75.043594, -6.6893, -10.4337, 71.8361, -6.6893, -10.4337, 75.043594, -10.033899, -10.4337, 75.043594, -6.6893, -10.4337, 75.043594, -6.6893, -10.4337, 78.3101, -10.033899, -10.4337, 78.3101, -6.6893, -10.4337, 65.2334, -3.3446002, -10.4337, 68.237495, -6.6893, -10.4337, 68.237495, -3.3446002, -10.4337, 68.237495, -6.6893, -10.4337, 71.8361, -6.6893, -10.4337, 68.237495, -6.6893, -10.4337, 65.2334, -3.3446002, -10.4337, 65.2334, -3.3446002, -10.4337, 68.237495, -3.3446002, -10.4337, 71.8361, -6.6893, -10.4337, 75.043594, -6.6893, -10.4337, 71.8361, -3.3446002, -10.4337, 68.237495, -3.3446002, -10.4337, 71.8361, -6.6893, -10.4337, 71.8361, -3.3446002, -10.4337, 75.043594, -6.6893, -10.4337, 78.3101, -6.6893, -10.4337, 75.043594, -3.3446002, -10.4337, 71.8361, -3.3446002, -10.4337, 75.043594, -6.6893, -10.4337, 75.043594, -3.3446002, -10.4337, 75.043594, -3.3446002, -10.4337, 78.3101, -6.6893, -10.4337, 78.3101, -3.3446002, -10.4337, 65.2334, 0, -10.4337, 68.237495, -3.3446002, -10.4337, 68.237495, 0, -10.4337, 68.237495, -3.3446002, -10.4337, 71.8361, -3.3446002, -10.4337, 68.237495, -3.3446002, -10.4337, 65.2334, 0, -10.4337, 65.2334, 0, -10.4337, 68.237495, 0, -10.4337, 71.8361, -3.3446002, -10.4337, 75.043594, -3.3446002, -10.4337, 71.8361, 0, -10.4337, 68.237495, 0, -10.4337, 71.8361, -3.3446002, -10.4337, 71.8361, 0, -10.4337, 75.043594, -3.3446002, -10.4337, 78.3101, -3.3446002, -10.4337, 75.043594, 0, -10.4337, 71.8361, 0, -10.4337, 75.043594, -3.3446002, -10.4337, 75.043594, 0, -10.4337, 75.043594, 0, -10.4337, 78.3101, -3.3446002, -10.4337, 78.3101, 0, -10.4337, 65.2334, 3.3446, -10.4337, 68.237495, 0, -10.4337, 68.237495, 3.3446, -10.4337, 68.237495, 0, -10.4337, 71.8361, 0, -10.4337, 68.237495, 0, -10.4337, 65.2334, 3.3446, -10.4337, 65.2334, 3.3446, -10.4337, 68.237495, 3.3446, -10.4337, 71.8361, 0, -10.4337, 75.043594, 0, -10.4337, 71.8361, 3.3446, -10.4337, 68.237495, 3.3446, -10.4337, 71.8361, 0, -10.4337, 71.8361, 3.3446, -10.4337, 75.043594, 0, -10.4337, 78.3101, 0, -10.4337, 75.043594, 3.3446, -10.4337, 71.8361, 3.3446, -10.4337, 75.043594, 0, -10.4337, 75.043594, 3.3446, -10.4337, 75.043594, 3.3446, -10.4337, 78.3101, 0, -10.4337, 78.3101, 3.3446, -10.4337, 65.2334, 6.6893, -10.4337, 68.237495, 3.3446, -10.4337, 68.237495, 6.6893, -10.4337, 68.237495, 3.3446, -10.4337, 71.8361, 3.3446, -10.4337, 68.237495, 3.3446, -10.4337, 65.2334, 6.6893, -10.4337, 65.2334, 6.6893, -10.4337, 68.237495, 6.6893, -10.4337, 71.8361, 3.3446, -10.4337, 75.043594, 3.3446, -10.4337, 71.8361, 6.6893, -10.4337, 68.237495, 6.6893, -10.4337, 71.8361, 3.3446, -10.4337, 71.8361, 6.6893, -10.4337, 75.043594, 3.3446, -10.4337, 78.3101, 3.3446, -10.4337, 75.043594, 6.6893, -10.4337, 71.8361, 6.6893, -10.4337, 75.043594, 3.3446, -10.4337, 75.043594, 6.6893, -10.4337, 75.043594, 6.6893, -10.4337, 78.3101, 3.3446, -10.4337, 78.3101, 6.6893, -10.4337, 65.2334, 10.033899, -10.4337, 68.237495, 6.6893, -10.4337, 68.237495, 10.033899, -10.4337, 68.237495, 6.6893, -10.4337, 71.8361, 6.6893, -10.4337, 68.237495, 6.6893, -10.4337, 65.2334, 10.033899, -10.4337, 65.2334, 10.033899, -10.4337, 68.237495, 10.033899, -10.4337, 71.8361, 6.6893, -10.4337, 75.043594, 6.6893, -10.4337, 71.8361, 10.033899, -10.4337, 68.237495, 10.033899, -10.4337, 71.8361, 6.6893, -10.4337, 71.8361, 10.033899, -10.4337, 75.043594, 6.6893, -10.4337, 78.3101, 6.6893, -10.4337, 75.043594, 10.033899, -10.4337, 71.8361, 10.033899, -10.4337, 75.043594, 6.6893, -10.4337, 75.043594, 10.033899, -10.4337, 75.043594, 10.033899, -10.4337, 78.3101, 6.6893, -10.4337, 78.3101, 10.033899, -10.4337, 65.2334, 13.378599, -10.4337, 68.237495, 10.033899, -10.4337, 68.237495, 13.378599, -10.4337, 68.237495, 10.033899, -10.4337, 71.8361, 10.033899, -10.4337, 68.237495, 10.033899, -10.4337, 65.2334, 13.378599, -10.4337, 65.2334, 13.378599, -10.4337, 68.237495, 13.378599, -10.4337, 71.8361, 10.033899, -10.4337, 75.043594, 10.033899, -10.4337, 71.8361, 13.378599, -10.4337, 68.237495, 13.378599, -10.4337, 71.8361, 10.033899, -10.4337, 71.8361, 13.378599, -10.4337, 75.043594, 10.033899, -10.4337, 78.3101, 10.033899, -10.4337, 75.043594, 13.378599, -10.4337, 71.8361, 13.378599, -10.4337, 75.043594, 10.033899, -10.4337, 75.043594, 13.378599, -10.4337, 75.043594, 13.378599, -10.4337, 78.3101, 10.033899, -10.4337, 78.3101, 13.378599, -10.4337, 65.2334, 16.7232, -10.4337, 68.237495, 13.378599, -10.4337, 68.237495, 16.7232, -10.4337, 68.237495, 13.378599, -10.4337, 71.8361, 13.378599, -10.4337, 68.237495, 13.378599, -10.4337, 65.2334, 16.7232, -10.4337, 65.2334, 16.7232, -10.4337, 68.237495, 16.7232, -10.4337, 71.8361, 13.378599, -10.4337, 75.043594, 13.378599, -10.4337, 71.8361, 16.7232, -10.4337, 68.237495, 16.7232, -10.4337, 71.8361, 13.378599, -10.4337, 71.8361, 16.7232, -10.4337, 75.043594, 13.378599, -10.4337, 78.3101, 13.378599, -10.4337, 75.043594, 16.7232, -10.4337, 71.8361, 16.7232, -10.4337, 75.043594, 13.378599, -10.4337, 75.043594, 16.7232, -10.4337, 75.043594, 16.7232, -10.4337, 78.3101, 13.378599, -10.4337, 78.3101, 16.7232, -10.4337, 65.2334, 20.0679, -10.4337, 68.237495, 16.7232, -10.4337, 68.237495, 20.0679, -10.4337, 68.237495, 16.7232, -10.4337, 71.8361, 16.7232, -10.4337, 68.237495, 16.7232, -10.4337, 65.2334, 20.0679, -10.4337, 65.2334, 20.0679, -10.4337, 68.237495, 20.0679, -10.4337, 71.8361, 16.7232, -10.4337, 75.043594, 16.7232, -10.4337, 71.8361, 20.0679, -10.4337, 68.237495, 20.0679, -10.4337, 71.8361, 16.7232, -10.4337, 71.8361, 20.0679, -10.4337, 75.043594, 16.7232, -10.4337, 78.3101, 16.7232, -10.4337, 75.043594, 20.0679, -10.4337, 71.8361, 20.0679, -10.4337, 75.043594, 16.7232, -10.4337, 75.043594, 20.0679, -10.4337, 75.043594, 20.0679, -10.4337, 78.3101, 16.7232, -10.4337, 78.3101, 20.0679, -10.4337, 65.2334, 23.412498, -10.4337, 68.237495, 20.0679, -10.4337, 68.237495, 23.412498, -10.4337, 68.237495, 20.0679, -10.4337, 71.8361, 20.0679, -10.4337, 68.237495, 20.0679, -10.4337, 65.2334, 23.412498, -10.4337, 65.2334, 23.412498, -10.4337, 68.237495, 23.412498, -10.4337, 71.8361, 20.0679, -10.4337, 75.043594, 20.0679, -10.4337, 71.8361, 23.412498, -10.4337, 68.237495, 23.412498, -10.4337, 71.8361, 20.0679, -10.4337, 71.8361, 23.412498, -10.4337, 75.043594, 20.0679, -10.4337, 78.3101, 20.0679, -10.4337, 75.043594, 23.412498, -10.4337, 71.8361, 23.412498, -10.4337, 75.043594, 20.0679, -10.4337, 75.043594, 23.412498, -10.4337, 75.043594, 23.412498, -10.4337, 78.3101, 20.0679, -10.4337, 78.3101, 23.412498, -10.4337, 65.2334, 26.7582, -10.4337, 68.237495, 23.412498, -10.4337, 68.237495, 26.7582, -10.4337, 68.237495, 23.412498, -10.4337, 71.8361, 23.412498, -10.4337, 68.237495, 23.412498, -10.4337, 65.2334, 26.7582, -10.4337, 65.2334, 26.7582, -10.4337, 68.237495, 26.7582, -10.4337, 71.8361, 23.412498, -10.4337, 75.043594, 23.412498, -10.4337, 71.8361, 26.7582, -10.4337, 68.237495, 26.7582, -10.4337, 71.8361, 23.412498, -10.4337, 71.8361, 26.7582, -10.4337, 75.043594, 23.412498, -10.4337, 78.3101, 23.412498, -10.4337, 75.043594, 26.7582, -10.4337, 71.8361, 26.7582, -10.4337, 75.043594, 23.412498, -10.4337, 75.043594, 26.7582, -10.4337, 75.043594, 26.7582, -10.4337, 78.3101, 23.412498, -10.4337, 78.3101, 26.7582, -10.4337, 75.043594, 75.8818, -10.4337, 26.7572, 26.7582, -10.4337, 78.3101, 26.7582, -10.4337, 71.8361, 75.8818, -10.4337, 26.7572, 26.7582, -10.4337, 75.043594, 26.7582, -10.4337, 78.3101, 75.8818, -10.4337, 26.7572, 79.236, -10.4337, 26.7572, 79.236, -10.4337, 23.412498, 79.236, -10.4337, 26.7572, 75.8818, -10.4337, 26.7572, 71.9379, -10.4337, 26.7572, 26.7582, -10.4337, 71.8361, 26.7582, -10.4337, 68.237495, 75.8818, -10.4337, 26.7572, 26.7582, -10.4337, 71.8361, 71.9379, -10.4337, 26.7572, 68.9355, -10.4337, 26.7572, 26.7582, -10.4337, 68.237495, 26.7582, -10.4337, 65.2334, 71.9379, -10.4337, 26.7572, 26.7582, -10.4337, 68.237495, 68.9355, -10.4337, 26.7572, 68.9355, -10.4337, 26.7572, 26.7582, -10.4337, 65.2334, 66.1166, -10.4337, 26.7572, 68.9355, -10.4337, 26.7572, 66.1166, -10.4337, 26.7572, 66.1166, -10.4337, 23.412498, 68.9355, -10.4337, 26.7572, 66.1166, -10.4337, 23.412498, 68.937, -10.4337, 23.412498, 71.9379, -10.4337, 26.7572, 68.9355, -10.4337, 26.7572, 68.937, -10.4337, 23.412498, 68.937, -10.4337, 23.412498, 66.1166, -10.4337, 23.412498, 66.1166, -10.4337, 20.0679, 75.8818, -10.4337, 26.7572, 71.9379, -10.4337, 26.7572, 71.9555, -10.4337, 23.412498, 71.9379, -10.4337, 26.7572, 68.937, -10.4337, 23.412498, 71.9555, -10.4337, 23.412498, 79.236, -10.4337, 23.412498, 75.8818, -10.4337, 26.7572, 75.8708, -10.4337, 23.412498, 75.8818, -10.4337, 26.7572, 71.9555, -10.4337, 23.412498, 75.8708, -10.4337, 23.412498, 79.236, -10.4337, 20.0679, 79.236, -10.4337, 23.412498, 75.8708, -10.4337, 23.412498, 68.937, -10.4337, 23.412498, 66.1166, -10.4337, 20.0679, 68.9385, -10.4337, 20.0679, 71.9555, -10.4337, 23.412498, 68.937, -10.4337, 23.412498, 68.9385, -10.4337, 20.0679, 68.9385, -10.4337, 20.0679, 66.1166, -10.4337, 20.0679, 66.1166, -10.4337, 16.7232, 75.8708, -10.4337, 23.412498, 71.9555, -10.4337, 23.412498, 71.9732, -10.4337, 20.0679, 71.9555, -10.4337, 23.412498, 68.9385, -10.4337, 20.0679, 71.9732, -10.4337, 20.0679, 79.236, -10.4337, 20.0679, 75.8708, -10.4337, 23.412498, 75.859795, -10.4337, 20.0679, 75.8708, -10.4337, 23.412498, 71.9732, -10.4337, 20.0679, 75.859795, -10.4337, 20.0679, 79.236, -10.4337, 16.7232, 79.236, -10.4337, 20.0679, 75.859795, -10.4337, 20.0679, 68.9385, -10.4337, 20.0679, 66.1166, -10.4337, 16.7232, 68.9401, -10.4337, 16.7232, 71.9732, -10.4337, 20.0679, 68.9385, -10.4337, 20.0679, 68.9401, -10.4337, 16.7232, 68.9401, -10.4337, 16.7232, 66.1166, -10.4337, 16.7232, 66.1166, -10.4337, 13.378601, 75.859795, -10.4337, 20.0679, 71.9732, -10.4337, 20.0679, 71.9908, -10.4337, 16.7232, 71.9732, -10.4337, 20.0679, 68.9401, -10.4337, 16.7232, 71.9908, -10.4337, 16.7232, 79.236, -10.4337, 16.7232, 75.859795, -10.4337, 20.0679, 75.8488, -10.4337, 16.7232, 75.859795, -10.4337, 20.0679, 71.9908, -10.4337, 16.7232, 75.8488, -10.4337, 16.7232, 79.236, -10.4337, 13.378601, 79.236, -10.4337, 16.7232, 75.8488, -10.4337, 16.7232, 68.9401, -10.4337, 16.7232, 66.1166, -10.4337, 13.378601, 68.9416, -10.4337, 13.378601, 71.9908, -10.4337, 16.7232, 68.9401, -10.4337, 16.7232, 68.9416, -10.4337, 13.378601, 68.9416, -10.4337, 13.378601, 66.1166, -10.4337, 13.378601, 66.1166, -10.4337, 10.033899, 75.8488, -10.4337, 16.7232, 71.9908, -10.4337, 16.7232, 72.0085, -10.4337, 13.378601, 71.9908, -10.4337, 16.7232, 68.9416, -10.4337, 13.378601, 72.0085, -10.4337, 13.378601, 79.236, -10.4337, 13.378601, 75.8488, -10.4337, 16.7232, 75.8377, -10.4337, 13.378601, 75.8488, -10.4337, 16.7232, 72.0085, -10.4337, 13.378601, 75.8377, -10.4337, 13.378601, 79.236, -10.4337, 10.033899, 79.236, -10.4337, 13.378601, 75.8377, -10.4337, 13.378601, 68.9416, -10.4337, 13.378601, 66.1166, -10.4337, 10.033899, 68.9432, -10.4337, 10.033899, 72.0085, -10.4337, 13.378601, 68.9416, -10.4337, 13.378601, 68.9432, -10.4337, 10.033899, 68.9432, -10.4337, 10.033899, 66.1166, -10.4337, 10.033899, 66.1166, -10.4337, 6.6893, 75.8377, -10.4337, 13.378601, 72.0085, -10.4337, 13.378601, 72.0261, -10.4337, 10.033899, 72.0085, -10.4337, 13.378601, 68.9432, -10.4337, 10.033899, 72.0261, -10.4337, 10.033899, 79.236, -10.4337, 10.033899, 75.8377, -10.4337, 13.378601, 75.8267, -10.4337, 10.033899, 75.8377, -10.4337, 13.378601, 72.0261, -10.4337, 10.033899, 75.8267, -10.4337, 10.033899, 79.236, -10.4337, 6.6893, 79.236, -10.4337, 10.033899, 75.8267, -10.4337, 10.033899, 68.9432, -10.4337, 10.033899, 66.1166, -10.4337, 6.6893, 68.944695, -10.4337, 6.6893, 72.0261, -10.4337, 10.033899, 68.9432, -10.4337, 10.033899, 68.944695, -10.4337, 6.6893, 68.944695, -10.4337, 6.6893, 66.1166, -10.4337, 6.6893, 66.1166, -10.4337, 3.3446, 75.8267, -10.4337, 10.033899, 72.0261, -10.4337, 10.033899, 72.0437, -10.4337, 6.6893, 72.0261, -10.4337, 10.033899, 68.944695, -10.4337, 6.6893, 72.0437, -10.4337, 6.6893, 79.236, -10.4337, 6.6893, 75.8267, -10.4337, 10.033899, 75.8157, -10.4337, 6.6893, 75.8267, -10.4337, 10.033899, 72.0437, -10.4337, 6.6893, 75.8157, -10.4337, 6.6893, 79.236, -10.4337, 3.3446, 79.236, -10.4337, 6.6893, 75.8157, -10.4337, 6.6893, 68.944695, -10.4337, 6.6893, 66.1166, -10.4337, 3.3446, 68.9463, -10.4337, 3.3446, 72.0437, -10.4337, 6.6893, 68.944695, -10.4337, 6.6893, 68.9463, -10.4337, 3.3446, 68.9463, -10.4337, 3.3446, 66.1166, -10.4337, 3.3446, 66.1166, -10.4337, 0, 75.8157, -10.4337, 6.6893, 72.0437, -10.4337, 6.6893, 72.0614, -10.4337, 3.3446, 72.0437, -10.4337, 6.6893, 68.9463, -10.4337, 3.3446, 72.0614, -10.4337, 3.3446, 79.236, -10.4337, 3.3446, 75.8157, -10.4337, 6.6893, 75.804695, -10.4337, 3.3446, 75.8157, -10.4337, 6.6893, 72.0614, -10.4337, 3.3446, 75.804695, -10.4337, 3.3446, 79.236, -10.4337, 0, 79.236, -10.4337, 3.3446, 75.804695, -10.4337, 3.3446, 68.9463, -10.4337, 3.3446, 66.1166, -10.4337, 0, 68.9478, -10.4337, 0, 72.0614, -10.4337, 3.3446, 68.9463, -10.4337, 3.3446, 68.9478, -10.4337, 0, 68.9478, -10.4337, 0, 66.1166, -10.4337, 0, 66.1166, -10.4337, -3.3446002, 75.804695, -10.4337, 3.3446, 72.0614, -10.4337, 3.3446, 72.078995, -10.4337, 0, 72.0614, -10.4337, 3.3446, 68.9478, -10.4337, 0, 72.078995, -10.4337, 0, 79.236, -10.4337, 0, 75.804695, -10.4337, 3.3446, 75.793594, -10.4337, 0, 75.804695, -10.4337, 3.3446, 72.078995, -10.4337, 0, 75.793594, -10.4337, 0, 79.236, -10.4337, -3.3446002, 79.236, -10.4337, 0, 75.793594, -10.4337, 0, 68.9478, -10.4337, 0, 66.1166, -10.4337, -3.3446002, 68.9494, -10.4337, -3.3446002, 72.078995, -10.4337, 0, 68.9478, -10.4337, 0, 68.9494, -10.4337, -3.3446002, 68.9494, -10.4337, -3.3446002, 66.1166, -10.4337, -3.3446002, 66.1166, -10.4337, -6.6893, 75.793594, -10.4337, 0, 72.078995, -10.4337, 0, 72.096695, -10.4337, -3.3446002, 72.078995, -10.4337, 0, 68.9494, -10.4337, -3.3446002, 72.096695, -10.4337, -3.3446002, 79.236, -10.4337, -3.3446002, 75.793594, -10.4337, 0, 75.7826, -10.4337, -3.3446002, 75.793594, -10.4337, 0, 72.096695, -10.4337, -3.3446002, 75.7826, -10.4337, -3.3446002, 79.236, -10.4337, -6.6893, 79.236, -10.4337, -3.3446002, 75.7826, -10.4337, -3.3446002, 68.9494, -10.4337, -3.3446002, 66.1166, -10.4337, -6.6893, 68.9509, -10.4337, -6.6893, 72.096695, -10.4337, -3.3446002, 68.9494, -10.4337, -3.3446002, 68.9509, -10.4337, -6.6893, 68.9509, -10.4337, -6.6893, 66.1166, -10.4337, -6.6893, 66.1166, -10.4337, -10.033899, 75.7826, -10.4337, -3.3446002, 72.096695, -10.4337, -3.3446002, 72.114296, -10.4337, -6.6893, 72.096695, -10.4337, -3.3446002, 68.9509, -10.4337, -6.6893, 72.114296, -10.4337, -6.6893, 79.236, -10.4337, -6.6893, 75.7826, -10.4337, -3.3446002, 75.7716, -10.4337, -6.6893, 75.7826, -10.4337, -3.3446002, 72.114296, -10.4337, -6.6893, 75.7716, -10.4337, -6.6893, 79.236, -10.4337, -10.033899, 79.236, -10.4337, -6.6893, 75.7716, -10.4337, -6.6893, 68.9509, -10.4337, -6.6893, 66.1166, -10.4337, -10.033899, 68.9524, -10.4337, -10.033899, 72.114296, -10.4337, -6.6893, 68.9509, -10.4337, -6.6893, 68.9524, -10.4337, -10.033899, 68.9524, -10.4337, -10.033899, 66.1166, -10.4337, -10.033899, 66.1166, -10.4337, -13.378599, 75.7716, -10.4337, -6.6893, 72.114296, -10.4337, -6.6893, 72.1319, -10.4337, -10.033899, 72.114296, -10.4337, -6.6893, 68.9524, -10.4337, -10.033899, 72.1319, -10.4337, -10.033899, 79.236, -10.4337, -10.033899, 75.7716, -10.4337, -6.6893, 75.7606, -10.4337, -10.033899, 75.7716, -10.4337, -6.6893, 72.1319, -10.4337, -10.033899, 75.7606, -10.4337, -10.033899, 79.236, -10.4337, -13.378599, 79.236, -10.4337, -10.033899, 75.7606, -10.4337, -10.033899, 68.9524, -10.4337, -10.033899, 66.1166, -10.4337, -13.378599, 68.953995, -10.4337, -13.378599, 72.1319, -10.4337, -10.033899, 68.9524, -10.4337, -10.033899, 68.953995, -10.4337, -13.378599, 68.953995, -10.4337, -13.378599, 66.1166, -10.4337, -13.378599, 66.1166, -10.4337, -16.7232, 75.7606, -10.4337, -10.033899, 72.1319, -10.4337, -10.033899, 72.1496, -10.4337, -13.378599, 72.1319, -10.4337, -10.033899, 68.953995, -10.4337, -13.378599, 72.1496, -10.4337, -13.378599, 79.236, -10.4337, -13.378599, 75.7606, -10.4337, -10.033899, 75.749596, -10.4337, -13.378599, 75.7606, -10.4337, -10.033899, 72.1496, -10.4337, -13.378599, 75.749596, -10.4337, -13.378599, 79.236, -10.4337, -16.7232, 79.236, -10.4337, -13.378599, 75.749596, -10.4337, -13.378599, 68.953995, -10.4337, -13.378599, 66.1166, -10.4337, -16.7232, 68.9555, -10.4337, -16.7232, 72.1496, -10.4337, -13.378599, 68.953995, -10.4337, -13.378599, 68.9555, -10.4337, -16.7232, 68.9555, -10.4337, -16.7232, 66.1166, -10.4337, -16.7232, 66.1166, -10.4337, -20.0679, 75.749596, -10.4337, -13.378599, 72.1496, -10.4337, -13.378599, 72.1672, -10.4337, -16.7232, 72.1496, -10.4337, -13.378599, 68.9555, -10.4337, -16.7232, 72.1672, -10.4337, -16.7232, 79.236, -10.4337, -16.7232, 75.749596, -10.4337, -13.378599, 75.738495, -10.4337, -16.7232, 75.749596, -10.4337, -13.378599, 72.1672, -10.4337, -16.7232, 75.738495, -10.4337, -16.7232, 79.236, -10.4337, -20.0679, 79.236, -10.4337, -16.7232, 75.738495, -10.4337, -16.7232, 68.9555, -10.4337, -16.7232, 66.1166, -10.4337, -20.0679, 68.9571, -10.4337, -20.0679, 72.1672, -10.4337, -16.7232, 68.9555, -10.4337, -16.7232, 68.9571, -10.4337, -20.0679, 68.9571, -10.4337, -20.0679, 66.1166, -10.4337, -20.0679, 66.1166, -10.4337, -23.412498, 68.9571, -10.4337, -20.0679, 66.1166, -10.4337, -23.412498, 68.958595, -10.4337, -23.412498, 72.1672, -10.4337, -16.7232, 68.9571, -10.4337, -20.0679, 72.1849, -10.4337, -20.0679, 72.1849, -10.4337, -20.0679, 68.9571, -10.4337, -20.0679, 68.958595, -10.4337, -23.412498, 75.738495, -10.4337, -16.7232, 72.1672, -10.4337, -16.7232, 72.1849, -10.4337, -20.0679, 72.1849, -10.4337, -20.0679, 68.958595, -10.4337, -23.412498, 72.2025, -10.4337, -23.412498, 79.236, -10.4337, -20.0679, 75.738495, -10.4337, -16.7232, 75.7275, -10.4337, -20.0679, 75.738495, -10.4337, -16.7232, 72.1849, -10.4337, -20.0679, 75.7275, -10.4337, -20.0679, 75.7275, -10.4337, -20.0679, 72.1849, -10.4337, -20.0679, 72.2025, -10.4337, -23.412498, 79.236, -10.4337, -23.412498, 79.236, -10.4337, -20.0679, 75.7275, -10.4337, -20.0679, 75.7275, -10.4337, -20.0679, 72.2025, -10.4337, -23.412498, 75.7165, -10.4337, -23.412498, 79.236, -10.4337, -23.412498, 75.7275, -10.4337, -20.0679, 75.7165, -10.4337, -23.412498, -38.5239, -3.6573, 10.033899, -41.627, -4.8403997, 6.6893, -38.5239, -3.6573, 6.6893, -38.5239, -3.6573, 10.033899, -38.5239, -3.6573, 13.378601, -41.627, -4.8403997, 6.6893, -41.627, -4.8403997, 3.3446, -38.5239, -3.6573, 6.6893, -41.627, -4.8403997, 6.6893, -41.627, -4.8403997, 3.3446, -38.5239, -3.6573, 3.3446, -38.5239, -3.6573, 6.6893, -41.627, -4.8403997, 6.6893, -38.5239, -3.6573, 13.378601, -41.627, -4.8403997, 13.378601, -41.627, -4.8403997, 0, -38.5239, -3.6573, 3.3446, -41.627, -4.8403997, 3.3446, -41.627, -4.8403997, 0, -38.5239, -3.6573, 0, -38.5239, -3.6573, 3.3446, -44.537098, -5.95, 3.3446, -41.627, -4.8403997, 3.3446, -41.627, -4.8403997, 6.6893, -41.627, -4.8403997, -3.3446002, -38.5239, -3.6573, 0, -41.627, -4.8403997, 0, -41.627, -4.8403997, -3.3446002, -38.5239, -3.6573, -3.3446002, -38.5239, -3.6573, 0, -44.537098, -5.95, 0, -41.627, -4.8403997, 0, -41.627, -4.8403997, 3.3446, -44.537098, -5.95, 0, -41.627, -4.8403997, 3.3446, -44.537098, -5.95, 3.3446, -44.537098, -5.95, -3.3446002, -41.627, -4.8403997, -3.3446002, -41.627, -4.8403997, 0, -44.537098, -5.95, -3.3446002, -41.627, -4.8403997, 0, -44.537098, -5.95, 0, -41.627, -4.8403997, -6.6893, -38.5239, -3.6573, -3.3446002, -41.627, -4.8403997, -3.3446002, -41.627, -4.8403997, -6.6893, -38.5239, -3.6573, -6.6893, -38.5239, -3.6573, -3.3446002, -44.537098, -5.95, -6.6893, -41.627, -4.8403997, -3.3446002, -44.537098, -5.95, -3.3446002, -44.537098, -5.95, -6.6893, -41.627, -4.8403997, -6.6893, -41.627, -4.8403997, -3.3446002, -41.627, -4.8403997, -10.033899, -38.5239, -3.6573, -6.6893, -41.627, -4.8403997, -6.6893, -41.627, -4.8403997, -10.033899, -38.5239, -3.6573, -10.033899, -38.5239, -3.6573, -6.6893, -44.537098, -5.95, -10.033899, -41.627, -4.8403997, -6.6893, -44.537098, -5.95, -6.6893, -44.537098, -5.95, -10.033899, -41.627, -4.8403997, -10.033899, -41.627, -4.8403997, -6.6893, -41.627, -4.8403997, -13.378599, -38.5239, -3.6573, -10.033899, -41.627, -4.8403997, -10.033899, -41.627, -4.8403997, -13.378599, -38.5239, -3.6573, -13.378599, -38.5239, -3.6573, -10.033899, -41.627, -4.8403997, -13.378599, -38.5239, -3.6573, -16.7232, -38.5239, -3.6573, -13.378599, -41.627, -4.8403997, -13.378599, -38.5239, -3.6573, -17.0441, -38.5239, -3.6573, -16.7232, -38.5239, -3.6573, -17.0441, -41.627, -4.8403997, -13.378599, -41.627, -4.8403997, -17.0159, -41.627, -4.8403997, -17.0159, -38.5239, -3.6573, -20.0679, -38.5239, -3.6573, -17.0441, -44.537098, -5.95, -13.378599, -41.627, -4.8403997, -13.378599, -41.627, -4.8403997, -10.033899, -44.537098, -5.95, -13.378599, -41.627, -4.8403997, -10.033899, -44.537098, -5.95, -10.033899, -41.627, -4.8403997, -17.0159, -38.5239, -3.6573, -20.3888, -38.5239, -3.6573, -20.0679, -44.537098, -5.95, -16.9895, -41.627, -4.8403997, -13.378599, -44.537098, -5.95, -13.378599, -44.537098, -5.95, -16.9895, -41.627, -4.8403997, -17.0159, -41.627, -4.8403997, -13.378599, -47.4473, -7.0596, -13.378599, -44.537098, -5.95, -13.378599, -44.537098, -5.95, -10.033899, -47.4473, -7.0596, -16.963, -44.537098, -5.95, -16.9895, -44.537098, -5.95, -13.378599, -47.4473, -7.0596, -16.963, -44.537098, -5.95, -13.378599, -47.4473, -7.0596, -13.378599, -44.537098, -5.95, -20.334099, -41.627, -4.8403997, -17.0159, -44.537098, -5.95, -16.9895, -38.5239, -3.6573, -20.3888, -41.627, -4.8403997, -17.0159, -41.627, -4.8403997, -20.3606, -44.537098, -5.95, -20.334099, -41.627, -4.8403997, -20.3606, -41.627, -4.8403997, -17.0159, -41.627, -4.8403997, -23.412498, -38.5239, -3.6573, -20.3888, -41.627, -4.8403997, -20.3606, -41.627, -4.8403997, -23.412498, -38.5239, -3.6573, -23.412498, -38.5239, -3.6573, -20.3888, -41.627, -4.8403997, -26.7572, -38.5239, -3.6573, -23.412498, -41.627, -4.8403997, -23.412498, -41.627, -4.8403997, -26.7572, -38.5239, -3.6573, -26.7572, -38.5239, -3.6573, -23.412498, -44.537098, -5.95, -26.7572, -41.627, -4.8403997, -26.7572, -41.627, -4.8403997, -23.412498, -44.537098, -5.95, -23.412498, -41.627, -4.8403997, -23.412498, -41.627, -4.8403997, -20.3606, -44.537098, -5.95, -26.7572, -41.627, -4.8403997, -23.412498, -44.537098, -5.95, -23.412498, -44.537098, -5.95, -23.412498, -41.627, -4.8403997, -20.3606, -44.537098, -5.95, -20.334099, -47.4473, -7.0596, -26.7572, -44.537098, -5.95, -26.7572, -44.537098, -5.95, -23.412498, -47.4473, -7.0596, -23.412498, -44.537098, -5.95, -23.412498, -44.537098, -5.95, -20.334099, -47.4473, -7.0596, -26.7572, -44.537098, -5.95, -23.412498, -47.4473, -7.0596, -23.412498, -50.290497, -8.1437, -23.412498, -47.4473, -7.0596, -26.7572, -47.4473, -7.0596, -23.412498, -50.290497, -8.1437, -23.412498, -50.290497, -8.1437, -26.7572, -47.4473, -7.0596, -26.7572, -50.290497, -8.1437, -20.2818, -50.290497, -8.1437, -23.412498, -47.4473, -7.0596, -23.412498, -47.4473, -7.0596, -23.412498, -44.537098, -5.95, -20.334099, -47.4473, -7.0596, -20.3077, -50.290497, -8.1437, -20.2818, -47.4473, -7.0596, -23.412498, -47.4473, -7.0596, -20.3077, -47.4473, -7.0596, -20.3077, -44.537098, -5.95, -20.334099, -44.537098, -5.95, -16.9895, -47.4473, -7.0596, -20.3077, -44.537098, -5.95, -16.9895, -47.4473, -7.0596, -16.963, -47.4473, -7.0596, -16.963, -50.290497, -8.1437, -20.2818, -47.4473, -7.0596, -20.3077, -47.4473, -7.0596, -16.963, -50.290497, -8.1437, -20.0679, -50.290497, -8.1437, -20.2818, -50.290497, -8.1437, -20.0679, -47.4473, -7.0596, -16.963, -50.290497, -8.1437, -16.937199, -47.4473, -7.0596, -13.378599, -50.290497, -8.1437, -16.937199, -47.4473, -7.0596, -16.963, -47.4473, -7.0596, -13.378599, -50.290497, -8.1437, -16.7232, -50.290497, -8.1437, -16.937199, -50.290497, -8.1437, -16.7232, -47.4473, -7.0596, -13.378599, -50.290497, -8.1437, -13.378599, -50.290497, -8.1437, -10.033899, -50.290497, -8.1437, -13.378599, -47.4473, -7.0596, -13.378599, -50.290497, -8.1437, -10.033899, -47.4473, -7.0596, -13.378599, -47.4473, -7.0596, -10.033899, -47.4473, -7.0596, -13.378599, -44.537098, -5.95, -10.033899, -47.4473, -7.0596, -10.033899, -50.290497, -8.1437, -6.6893, -50.290497, -8.1437, -10.033899, -47.4473, -7.0596, -10.033899, -47.4473, -7.0596, -10.033899, -44.537098, -5.95, -10.033899, -44.537098, -5.95, -6.6893, -50.290497, -8.1437, -6.6893, -47.4473, -7.0596, -10.033899, -47.4473, -7.0596, -6.6893, -47.4473, -7.0596, -10.033899, -44.537098, -5.95, -6.6893, -47.4473, -7.0596, -6.6893, -50.290497, -8.1437, -3.3446002, -50.290497, -8.1437, -6.6893, -47.4473, -7.0596, -6.6893, -47.4473, -7.0596, -6.6893, -44.537098, -5.95, -6.6893, -44.537098, -5.95, -3.3446002, -50.290497, -8.1437, -3.3446002, -47.4473, -7.0596, -6.6893, -47.4473, -7.0596, -3.3446002, -47.4473, -7.0596, -6.6893, -44.537098, -5.95, -3.3446002, -47.4473, -7.0596, -3.3446002, -50.290497, -8.1437, 0, -50.290497, -8.1437, -3.3446002, -47.4473, -7.0596, -3.3446002, -47.4473, -7.0596, -3.3446002, -44.537098, -5.95, -3.3446002, -44.537098, -5.95, 0, -50.290497, -8.1437, 0, -47.4473, -7.0596, -3.3446002, -47.4473, -7.0596, 0, -47.4473, -7.0596, -3.3446002, -44.537098, -5.95, 0, -47.4473, -7.0596, 0, -50.290497, -8.1437, 3.3446, -50.290497, -8.1437, 0, -47.4473, -7.0596, 0, -47.4473, -7.0596, 0, -44.537098, -5.95, 0, -44.537098, -5.95, 3.3446, -50.290497, -8.1437, 3.3446, -47.4473, -7.0596, 0, -47.4473, -7.0596, 3.3446, -47.4473, -7.0596, 0, -44.537098, -5.95, 3.3446, -47.4473, -7.0596, 3.3446, -50.290497, -8.1437, 6.6893, -50.290497, -8.1437, 3.3446, -47.4473, -7.0596, 3.3446, -50.290497, -8.1437, 6.6893, -47.4473, -7.0596, 3.3446, -47.4473, -7.0596, 6.6893, -47.4473, -7.0596, 6.6893, -50.290497, -8.1437, 10.033899, -50.290497, -8.1437, 6.6893, -47.4473, -7.0596, 3.3446, -44.537098, -5.95, 3.3446, -44.537098, -5.95, 6.6893, -47.4473, -7.0596, 3.3446, -44.537098, -5.95, 6.6893, -47.4473, -7.0596, 6.6893, -44.537098, -5.95, 3.3446, -41.627, -4.8403997, 6.6893, -44.537098, -5.95, 6.6893, -47.4473, -7.0596, 6.6893, -50.290497, -8.1437, 13.378601, -50.290497, -8.1437, 10.033899, -41.627, -4.8403997, 13.378601, -44.537098, -5.95, 6.6893, -41.627, -4.8403997, 6.6893, -44.537098, -5.95, 13.378601, -47.4473, -7.0596, 6.6893, -44.537098, -5.95, 6.6893, -41.627, -4.8403997, 13.378601, -44.537098, -5.95, 13.378601, -44.537098, -5.95, 6.6893, -44.537098, -5.95, 13.378601, -47.4473, -7.0596, 13.378601, -47.4473, -7.0596, 6.6893, -50.290497, -8.1437, 13.378601, -47.4473, -7.0596, 6.6893, -47.4473, -7.0596, 13.378601, -41.627, -4.8403997, 16.7232, -44.537098, -5.95, 13.378601, -41.627, -4.8403997, 13.378601, -38.5239, -3.6573, 13.378601, -41.627, -4.8403997, 16.7232, -41.627, -4.8403997, 13.378601, -38.5239, -3.6573, 13.378601, -38.5239, -3.6573, 16.7232, -41.627, -4.8403997, 16.7232, -41.627, -4.8403997, 16.7232, -44.537098, -5.95, 16.7232, -44.537098, -5.95, 13.378601, -44.537098, -5.95, 16.7232, -47.4473, -7.0596, 13.378601, -44.537098, -5.95, 13.378601, -38.5239, -3.6573, 16.7232, -41.627, -4.8403997, 20.0679, -41.627, -4.8403997, 16.7232, -41.627, -4.8403997, 20.0679, -44.537098, -5.95, 16.7232, -41.627, -4.8403997, 16.7232, -38.5239, -3.6573, 16.7232, -38.5239, -3.6573, 20.0679, -41.627, -4.8403997, 20.0679, -47.4473, -7.0596, 16.7232, -50.290497, -8.1437, 13.378601, -47.4473, -7.0596, 13.378601, -44.537098, -5.95, 16.7232, -47.4473, -7.0596, 16.7232, -47.4473, -7.0596, 13.378601, -47.4473, -7.0596, 16.7232, -50.290497, -8.1437, 16.7232, -50.290497, -8.1437, 13.378601, -41.627, -4.8403997, 20.0679, -44.537098, -5.95, 20.0679, -44.537098, -5.95, 16.7232, -44.537098, -5.95, 20.0679, -47.4473, -7.0596, 16.7232, -44.537098, -5.95, 16.7232, -38.5239, -3.6573, 20.0679, -41.627, -4.8403997, 23.412498, -41.627, -4.8403997, 20.0679, -41.627, -4.8403997, 23.412498, -44.537098, -5.95, 20.0679, -41.627, -4.8403997, 20.0679, -38.5239, -3.6573, 20.0679, -38.5239, -3.6573, 23.412498, -41.627, -4.8403997, 23.412498, -38.5239, -3.6573, 23.412498, -41.627, -4.8403997, 26.7572, -41.627, -4.8403997, 23.412498, -38.5239, -3.6573, 23.412498, -38.5239, -3.6573, 26.7572, -41.627, -4.8403997, 26.7572, -41.627, -4.8403997, 26.7572, -44.537098, -5.95, 23.412498, -41.627, -4.8403997, 23.412498, -41.627, -4.8403997, 23.412498, -44.537098, -5.95, 23.412498, -44.537098, -5.95, 20.0679, -41.627, -4.8403997, 26.7572, -44.537098, -5.95, 26.7572, -44.537098, -5.95, 23.412498, -44.537098, -5.95, 20.0679, -47.4473, -7.0596, 20.0679, -47.4473, -7.0596, 16.7232, -47.4473, -7.0596, 20.0679, -50.290497, -8.1437, 16.7232, -47.4473, -7.0596, 16.7232, -44.537098, -5.95, 23.412498, -47.4473, -7.0596, 20.0679, -44.537098, -5.95, 20.0679, -47.4473, -7.0596, 20.0679, -50.290497, -8.1437, 20.0679, -50.290497, -8.1437, 16.7232, -44.537098, -5.95, 26.7572, -47.4473, -7.0596, 23.412498, -44.537098, -5.95, 23.412498, -44.537098, -5.95, 23.412498, -47.4473, -7.0596, 23.412498, -47.4473, -7.0596, 20.0679, -47.4473, -7.0596, 23.412498, -50.290497, -8.1437, 20.0679, -47.4473, -7.0596, 20.0679, -44.537098, -5.95, 26.7572, -47.4473, -7.0596, 26.7572, -47.4473, -7.0596, 23.412498, -47.4473, -7.0596, 23.412498, -50.290497, -8.1437, 23.412498, -50.290497, -8.1437, 20.0679, -47.4473, -7.0596, 26.7572, -50.290497, -8.1437, 23.412498, -47.4473, -7.0596, 23.412498, -47.4473, -7.0596, 26.7572, -50.290497, -8.1437, 26.7572, -50.290497, -8.1437, 23.412498, -6.6893, -8.1437, -54.500298, -3.4038, -8.6382, -57.495697, -3.4199996, -8.1437, -54.500298, -3.4038, -8.6382, -57.495697, -3.3446002, -8.1437, -54.500298, -3.4199996, -8.1437, -54.500298, -6.6893, -8.1437, -54.500298, -6.7919, -8.1437, -54.500298, -3.4038, -8.6382, -57.495697, -3.4038, -8.6382, -57.495697, -0.048199892, -8.1437, -54.500298, -3.3446002, -8.1437, -54.500298, -3.4038, -8.6382, -57.495697, -6.7919, -8.1437, -54.500298, -6.7697997, -8.6367, -57.4865, -10.033899, -8.1437, -54.500298, -6.7697997, -8.6367, -57.4865, -6.7919, -8.1437, -54.500298, -0.048199892, -8.1437, -54.500298, -3.4038, -8.6382, -57.495697, -0.037699938, -8.6397, -57.504997, -6.7697997, -8.6367, -57.4865, -10.033899, -8.1437, -54.500298, -10.141901, -8.1437, -54.500298, -0.037699938, -8.6397, -57.504997, 0, -8.1437, -54.500298, -0.048199892, -8.1437, -54.500298, -6.7697997, -8.6367, -57.4865, -10.141901, -8.1437, -54.500298, -10.1187, -8.635099, -57.4772, -13.378601, -8.1437, -54.500298, -10.1187, -8.635099, -57.4772, -10.141901, -8.1437, -54.500298, -0.037699938, -8.6397, -57.504997, 3.3446, -8.1437, -54.500298, 0, -8.1437, -54.500298, -10.1187, -8.635099, -57.4772, -13.378601, -8.1437, -54.500298, -13.4286, -8.1437, -54.500298, 3.3446, -8.1437, -54.500298, -0.037699938, -8.6397, -57.504997, 3.3446, -8.6413, -57.514297, -10.1187, -8.635099, -57.4772, -6.749, -9.1004, -60.295498, -6.7697997, -8.6367, -57.4865, 6.6893, -8.642799, -57.5235, 3.3446, -8.1437, -54.500298, 3.3446, -8.6413, -57.514297, 6.6893, -8.642799, -57.5235, 6.6893, -8.1437, -54.500298, 3.3446, -8.1437, -54.500298, 3.3446, -9.0949, -60.262497, 3.3446, -8.6413, -57.514297, -0.037699938, -8.6397, -57.504997, 10.033899, -8.6442995, -57.5327, 6.6893, -8.1437, -54.500298, 6.6893, -8.642799, -57.5235, 10.033899, -8.6442995, -57.5327, 10.033899, -8.1437, -54.500298, 6.6893, -8.1437, -54.500298, 10.033899, -8.6442995, -57.5327, 13.378599, -8.1437, -54.500298, 10.033899, -8.1437, -54.500298, 10.033899, -8.6442995, -57.5327, 13.444599, -8.1437, -54.500298, 13.378599, -8.1437, -54.500298, 13.444599, -8.1437, -54.500298, 10.033899, -8.6442995, -57.5327, 13.4300995, -8.6458, -57.5421, 13.4300995, -8.6458, -57.5421, 16.7232, -8.1437, -54.500298, 13.444599, -8.1437, -54.500298, 13.4300995, -8.6458, -57.5421, 16.8188, -8.1437, -54.500298, 16.7232, -8.1437, -54.500298, 16.8188, -8.1437, -54.500298, 13.4300995, -8.6458, -57.5421, 16.7978, -8.6474, -57.5514, 16.7978, -8.6474, -57.5514, 20.0679, -8.1437, -54.500298, 16.8188, -8.1437, -54.500298, 16.7978, -8.6474, -57.5514, 20.1975, -8.1437, -54.500298, 20.0679, -8.1437, -54.500298, 20.1975, -8.1437, -54.500298, 16.7978, -8.6474, -57.5514, 20.1689, -8.6489, -57.5607, 20.1442, -9.085899, -60.207497, 20.1689, -8.6489, -57.5607, 16.7978, -8.6474, -57.5514, 20.1442, -9.085899, -60.207497, 16.7978, -8.6474, -57.5514, 16.7794, -9.0877, -60.2185, 16.7794, -9.0877, -60.2185, 16.7978, -8.6474, -57.5514, 13.4300995, -8.6458, -57.5421, 20.112099, -9.6529, -63.642, 20.1442, -9.085899, -60.207497, 16.7794, -9.0877, -60.2185, 16.7794, -9.0877, -60.2185, 13.4300995, -8.6458, -57.5421, 13.417299, -9.089499, -60.2295, 13.417299, -9.089499, -60.2295, 13.4300995, -8.6458, -57.5421, 10.033899, -8.6442995, -57.5327, 20.112099, -9.6529, -63.642, 16.7794, -9.0877, -60.2185, 16.7557, -9.6571, -63.6679, 16.7557, -9.6571, -63.6679, 16.7794, -9.0877, -60.2185, 13.417299, -9.089499, -60.2295, 16.7232, -10.4337, -68.371895, 20.112099, -9.6529, -63.642, 16.7557, -9.6571, -63.6679, 16.7232, -10.4337, -68.371895, 20.0679, -10.4337, -68.371895, 20.112099, -9.6529, -63.642, 13.378599, -10.4337, -68.371895, 16.7232, -10.4337, -68.371895, 16.7557, -9.6571, -63.6679, 13.378599, -10.4337, -68.371895, 16.7557, -9.6571, -63.6679, 13.400799, -9.6614, -63.693794, 16.7557, -9.6571, -63.6679, 13.417299, -9.089499, -60.2295, 13.400799, -9.6614, -63.693794, 10.033899, -10.4337, -68.371895, 13.378599, -10.4337, -68.371895, 13.400799, -9.6614, -63.693794, 13.417299, -9.089499, -60.2295, 10.033899, -8.6442995, -57.5327, 10.033899, -9.0913, -60.240597, 13.400799, -9.6614, -63.693794, 13.417299, -9.089499, -60.2295, 10.033899, -9.0913, -60.240597, 10.033899, -9.0913, -60.240597, 10.033899, -8.6442995, -57.5327, 6.6893, -8.642799, -57.5235, 10.033899, -10.4337, -68.371895, 13.400799, -9.6614, -63.693794, 10.033899, -9.6657, -63.719696, 13.400799, -9.6614, -63.693794, 10.033899, -9.0913, -60.240597, 10.033899, -9.6657, -63.719696, 6.6893, -10.4337, -68.371895, 10.033899, -10.4337, -68.371895, 10.033899, -9.6657, -63.719696, 10.033899, -9.0913, -60.240597, 6.6893, -8.642799, -57.5235, 6.6893, -9.0931, -60.2515, 10.033899, -9.6657, -63.719696, 10.033899, -9.0913, -60.240597, 6.6893, -9.0931, -60.2515, 6.6893, -9.0931, -60.2515, 6.6893, -8.642799, -57.5235, 3.3446, -8.6413, -57.514297, 6.6893, -10.4337, -68.371895, 10.033899, -9.6657, -63.719696, 6.6893, -9.6699, -63.7455, 10.033899, -9.6657, -63.719696, 6.6893, -9.0931, -60.2515, 6.6893, -9.6699, -63.7455, 3.3446, -10.4337, -68.371895, 6.6893, -10.4337, -68.371895, 6.6893, -9.6699, -63.7455, 6.6893, -9.0931, -60.2515, 3.3446, -8.6413, -57.514297, 3.3446, -9.0949, -60.262497, 6.6893, -9.6699, -63.7455, 6.6893, -9.0931, -60.2515, 3.3446, -9.0949, -60.262497, 3.3446, -10.4337, -68.371895, 6.6893, -9.6699, -63.7455, 3.3446, -9.6742, -63.771194, 6.6893, -9.6699, -63.7455, 3.3446, -9.0949, -60.262497, 3.3446, -9.6742, -63.771194, 0, -10.4337, -68.371895, 3.3446, -10.4337, -68.371895, 3.3446, -9.6742, -63.771194, 3.3446, -9.6742, -63.771194, 3.3446, -9.0949, -60.262497, -0.028100014, -9.0968, -60.2735, 3.3446, -9.0949, -60.262497, -0.037699938, -8.6397, -57.504997, -0.028100014, -9.0968, -60.2735, -0.028100014, -9.0968, -60.2735, -0.037699938, -8.6397, -57.504997, -3.4038, -8.6382, -57.495697, 0, -10.4337, -68.371895, 3.3446, -9.6742, -63.771194, -0.015899897, -9.6785, -63.797096, 3.3446, -9.6742, -63.771194, -0.028100014, -9.0968, -60.2735, -0.015899897, -9.6785, -63.797096, -3.3446002, -10.4337, -68.371895, 0, -10.4337, -68.371895, -0.015899897, -9.6785, -63.797096, -0.028100014, -9.0968, -60.2735, -3.4038, -8.6382, -57.495697, -3.3885999, -9.098599, -60.2845, -0.015899897, -9.6785, -63.797096, -0.028100014, -9.0968, -60.2735, -3.3885999, -9.098599, -60.2845, -6.7697997, -8.6367, -57.4865, -3.3885999, -9.098599, -60.2845, -3.4038, -8.6382, -57.495697, -6.7697997, -8.6367, -57.4865, -6.749, -9.1004, -60.295498, -3.3885999, -9.098599, -60.2845, -0.015899897, -9.6785, -63.797096, -3.3885999, -9.098599, -60.2845, -3.3694, -9.6827, -63.8229, -3.3446002, -10.4337, -68.371895, -0.015899897, -9.6785, -63.797096, -3.3694, -9.6827, -63.8229, -6.749, -9.1004, -60.295498, -3.3694, -9.6827, -63.8229, -3.3885999, -9.098599, -60.2845, -6.7226996, -9.686999, -63.848793, -3.3446002, -10.4337, -68.371895, -3.3694, -9.6827, -63.8229, -6.749, -9.1004, -60.295498, -6.7226996, -9.686999, -63.848793, -3.3694, -9.6827, -63.8229, -6.7226996, -9.686999, -63.848793, -6.6893, -10.4337, -68.371895, -3.3446002, -10.4337, -68.371895, -10.096701, -9.1022, -60.3065, -6.7226996, -9.686999, -63.848793, -6.749, -9.1004, -60.295498, -10.068901, -9.691199, -63.874596, -6.6893, -10.4337, -68.371895, -6.7226996, -9.686999, -63.848793, -10.096701, -9.1022, -60.3065, -10.068901, -9.691199, -63.874596, -6.7226996, -9.686999, -63.848793, -10.068901, -9.691199, -63.874596, -10.033899, -10.4337, -68.371895, -6.6893, -10.4337, -68.371895, -10.1187, -8.635099, -57.4772, -10.096701, -9.1022, -60.3065, -6.749, -9.1004, -60.295498, -13.394701, -9.695499, -63.9002, -10.033899, -10.4337, -68.371895, -10.068901, -9.691199, -63.874596, -13.394701, -9.695499, -63.9002, -13.378601, -10.4337, -68.371895, -10.033899, -10.4337, -68.371895, -13.4076, -9.104, -60.3173, -10.068901, -9.691199, -63.874596, -10.096701, -9.1022, -60.3065, -13.4076, -9.104, -60.3173, -13.394701, -9.695499, -63.9002, -10.068901, -9.691199, -63.874596, -13.4179, -8.6336, -57.468098, -10.096701, -9.1022, -60.3065, -10.1187, -8.635099, -57.4772, -13.4179, -8.6336, -57.468098, -13.4076, -9.104, -60.3173, -10.096701, -9.1022, -60.3065, -10.1187, -8.635099, -57.4772, -13.4286, -8.1437, -54.500298, -13.4179, -8.6336, -57.468098, -13.4286, -8.1437, -54.500298, -16.7232, -8.6321, -57.459, -13.4179, -8.6336, -57.468098, -16.7232, -8.6321, -57.459, -13.4076, -9.104, -60.3173, -13.4179, -8.6336, -57.468098, -13.4286, -8.1437, -54.500298, -16.7232, -8.1437, -54.500298, -16.7232, -8.6321, -57.459, -16.7232, -9.1058, -60.3281, -13.394701, -9.695499, -63.9002, -13.4076, -9.104, -60.3173, -16.7232, -8.6321, -57.459, -16.7232, -9.1058, -60.3281, -13.4076, -9.104, -60.3173, -16.7232, -9.699699, -63.925797, -13.378601, -10.4337, -68.371895, -13.394701, -9.695499, -63.9002, -16.7232, -9.1058, -60.3281, -16.7232, -9.699699, -63.925797, -13.394701, -9.695499, -63.9002, -16.7232, -9.699699, -63.925797, -16.7232, -10.4337, -68.371895, -13.378601, -10.4337, -68.371895, -16.7232, -8.1437, -54.500298, -20.0679, -8.6306, -57.4498, -16.7232, -8.6321, -57.459, -20.0679, -8.6306, -57.4498, -16.7232, -9.1058, -60.3281, -16.7232, -8.6321, -57.459, -16.7232, -8.1437, -54.500298, -20.0679, -8.1437, -54.500298, -20.0679, -8.6306, -57.4498, -20.0679, -9.1076, -60.3391, -16.7232, -9.699699, -63.925797, -16.7232, -9.1058, -60.3281, -20.0679, -8.6306, -57.4498, -20.0679, -9.1076, -60.3391, -16.7232, -9.1058, -60.3281, -20.0679, -9.7039995, -63.9516, -16.7232, -10.4337, -68.371895, -16.7232, -9.699699, -63.925797, -20.0679, -9.1076, -60.3391, -20.0679, -9.7039995, -63.9516, -16.7232, -9.699699, -63.925797, -20.0679, -9.7039995, -63.9516, -20.0679, -10.4337, -68.371895, -16.7232, -10.4337, -68.371895, -20.0679, -8.1437, -54.500298, -23.412498, -8.6291, -57.440598, -20.0679, -8.6306, -57.4498, -23.412498, -8.6291, -57.440598, -20.0679, -9.1076, -60.3391, -20.0679, -8.6306, -57.4498, -20.0679, -8.1437, -54.500298, -23.412498, -8.1437, -54.500298, -23.412498, -8.6291, -57.440598, -23.412498, -8.1437, -54.500298, -26.7572, -8.6276, -57.4314, -23.412498, -8.6291, -57.440598, -23.412498, -8.1437, -54.500298, -26.7572, -8.1437, -54.500298, -26.7572, -8.6276, -57.4314, -23.412498, -8.6291, -57.440598, -23.412498, -9.1094, -60.35, -20.0679, -9.1076, -60.3391, -26.7572, -8.6276, -57.4314, -23.412498, -9.1094, -60.35, -23.412498, -8.6291, -57.440598, -23.412498, -9.1094, -60.35, -20.0679, -9.7039995, -63.9516, -20.0679, -9.1076, -60.3391, -26.7572, -8.6276, -57.4314, -26.7572, -9.111199, -60.361, -23.412498, -9.1094, -60.35, -23.412498, -9.7081995, -63.977394, -20.0679, -10.4337, -68.371895, -20.0679, -9.7039995, -63.9516, -23.412498, -9.1094, -60.35, -23.412498, -9.7081995, -63.977394, -20.0679, -9.7039995, -63.9516, -26.7572, -9.111199, -60.361, -23.412498, -9.7081995, -63.977394, -23.412498, -9.1094, -60.35, -23.412498, -9.7081995, -63.977394, -23.412498, -10.4337, -68.371895, -20.0679, -10.4337, -68.371895, -26.7572, -9.111199, -60.361, -26.7572, -9.7125, -64.0031, -23.412498, -9.7081995, -63.977394, -26.7572, -9.7125, -64.0031, -23.412498, -10.4337, -68.371895, -23.412498, -9.7081995, -63.977394, -26.7572, -9.7125, -64.0031, -26.7572, -10.4337, -68.371895, -23.412498, -10.4337, -68.371895, -3.3446002, -10.4337, -68.371895, -0.0020999908, -10.5633, -70.6314, 0, -10.4337, -68.371895, -3.3446002, -10.4337, -68.371895, -3.3514, -10.5471, -70.669, -0.0020999908, -10.5633, -70.6314, 23.412498, 0, -3.3446002, 26.7577, -0.6956, 0, 23.412498, 0, 0, 23.412498, 0, -3.3446002, 26.7577, -0.4894, -3.3446002, 26.7577, -0.6956, 0, 23.412498, 0, -6.6893, 26.7577, -0.4894, -3.3446002, 23.412498, 0, -3.3446002, 23.412498, 0, -6.6893, 26.7577, -0.3464, -6.6893, 26.7577, -0.4894, -3.3446002, 23.412498, -1.0924, -23.412498, 26.7582, -1.0924, -20.0679, 23.412498, -1.0924, -20.0679, 23.412498, -1.0924, -23.412498, 26.7582, -1.0924, -23.412498, 26.7582, -1.0924, -20.0679, 23.412498, 0, -10.033899, 26.7577, -0.3464, -6.6893, 23.412498, 0, -6.6893, 23.412498, 0, -10.033899, 26.572199, -0.4003, -10.314899, 26.7577, -0.3464, -6.6893, 23.412498, -0.35529998, 10.033899, 26.7582, -1.7623999, 10.033899, 23.412498, -1.8294, 13.378601, 23.412498, -0.456, -16.7232, 26.7577, -0.8804, -16.7232, 26.572199, -0.95549995, -13.659599, 23.412498, -1.1158999, -26.7572, 26.7582, -1.0924, -23.412498, 23.412498, -1.0924, -23.412498, 23.412498, -1.1158999, -26.7572, 26.7573, -1.3222, -26.7572, 26.7582, -1.0924, -23.412498, 23.412498, -2.2719998, 23.3902, 26.7582, -2.7837, 26.6955, 23.412498, -2.2194998, 26.781, 23.412498, -2.2719998, 23.3902, 26.7582, -2.2719998, 23.3902, 26.7582, -2.7837, 26.6955, 23.412498, 0, -13.378599, 26.572199, -0.4003, -10.314899, 23.412498, 0, -10.033899, 23.412498, 0, -13.378599, 26.572199, -0.95549995, -13.659599, 26.572199, -0.4003, -10.314899, 23.412498, 0, 0, 26.7577, -0.6956, 0, 26.7577, -0.73109996, 3.3446, 23.412498, -1.0924, -20.0679, 26.7582, -1.0924, -20.0679, 26.7577, -0.8804, -16.7232, 52.997097, -8.1437, -6.6893, 56.213997, -8.7052, -3.3446002, 52.997097, -8.1437, -3.3446002, 56.173397, -8.6981, 0, 52.997097, -8.1437, -3.3446002, 56.213997, -8.7052, -3.3446002, 56.173397, -8.6981, 0, 52.997097, -8.1437, 0, 52.997097, -8.1437, -3.3446002, 52.997097, -8.1437, -6.6893, 56.254498, -8.712299, -6.6893, 56.213997, -8.7052, -3.3446002, 56.254498, -8.712299, -6.6893, 52.997097, -8.1437, -6.6893, 52.997097, -8.1437, -10.033899, 59.1829, -9.2234, 0, 56.173397, -8.6981, 0, 56.213997, -8.7052, -3.3446002, 56.254498, -8.712299, -6.6893, 59.216, -9.229199, -3.3446002, 56.213997, -8.7052, -3.3446002, 59.1829, -9.2234, 0, 56.213997, -8.7052, -3.3446002, 59.216, -9.229199, -3.3446002, 56.1329, -8.691, 3.3446, 52.997097, -8.1437, 0, 56.173397, -8.6981, 0, 56.1329, -8.691, 3.3446, 52.997097, -8.1437, 3.3446, 52.997097, -8.1437, 0, 59.1498, -9.2176, 3.3446, 56.173397, -8.6981, 0, 59.1829, -9.2234, 0, 59.1498, -9.2176, 3.3446, 56.1329, -8.691, 3.3446, 56.173397, -8.6981, 0, 56.0924, -8.684, 6.6893, 52.997097, -8.1437, 3.3446, 56.1329, -8.691, 3.3446, 56.0924, -8.684, 6.6893, 52.997097, -8.1437, 6.6893, 52.997097, -8.1437, 3.3446, 59.1167, -9.2119, 6.6893, 56.1329, -8.691, 3.3446, 59.1498, -9.2176, 3.3446, 59.1167, -9.2119, 6.6893, 56.0924, -8.684, 6.6893, 56.1329, -8.691, 3.3446, 56.0518, -8.6769, 10.033899, 52.997097, -8.1437, 6.6893, 56.0924, -8.684, 6.6893, 56.0518, -8.6769, 10.033899, 52.997097, -8.1437, 10.033899, 52.997097, -8.1437, 6.6893, 59.0836, -9.2060995, 10.033899, 56.0924, -8.684, 6.6893, 59.1167, -9.2119, 6.6893, 59.0836, -9.2060995, 10.033899, 56.0518, -8.6769, 10.033899, 56.0924, -8.684, 6.6893, 56.0113, -8.6698, 13.378601, 52.997097, -8.1437, 10.033899, 56.0518, -8.6769, 10.033899, 56.0113, -8.6698, 13.378601, 52.997097, -8.1437, 13.378601, 52.997097, -8.1437, 10.033899, 59.0505, -9.2003, 13.378601, 56.0518, -8.6769, 10.033899, 59.0836, -9.2060995, 10.033899, 59.0505, -9.2003, 13.378601, 56.0113, -8.6698, 13.378601, 56.0518, -8.6769, 10.033899, 55.9708, -8.6627, 16.7232, 52.997097, -8.1437, 13.378601, 56.0113, -8.6698, 13.378601, 55.9708, -8.6627, 16.7232, 52.997097, -8.1437, 16.7232, 52.997097, -8.1437, 13.378601, 59.017498, -9.1945, 16.7232, 56.0113, -8.6698, 13.378601, 59.0505, -9.2003, 13.378601, 59.017498, -9.1945, 16.7232, 55.9708, -8.6627, 16.7232, 56.0113, -8.6698, 13.378601, 55.930298, -8.6557, 20.0679, 52.997097, -8.1437, 16.7232, 55.9708, -8.6627, 16.7232, 55.930298, -8.6557, 20.0679, 52.997097, -8.1437, 20.0679, 52.997097, -8.1437, 16.7232, 58.984398, -9.1888, 20.0679, 55.9708, -8.6627, 16.7232, 59.017498, -9.1945, 16.7232, 58.984398, -9.1888, 20.0679, 55.930298, -8.6557, 20.0679, 55.9708, -8.6627, 16.7232, 55.889698, -8.6486, 23.412498, 52.997097, -8.1437, 20.0679, 55.930298, -8.6557, 20.0679, 55.889698, -8.6486, 23.412498, 52.997097, -8.1437, 23.412498, 52.997097, -8.1437, 20.0679, 55.849197, -8.6414995, 26.7572, 52.997097, -8.1437, 23.412498, 55.889698, -8.6486, 23.412498, 55.849197, -8.6414995, 26.7572, 52.997097, -8.1437, 26.7572, 52.997097, -8.1437, 23.412498, 58.918198, -9.177199, 26.7572, 55.849197, -8.6414995, 26.7572, 55.889698, -8.6486, 23.412498, 58.951298, -9.183, 23.412498, 55.889698, -8.6486, 23.412498, 55.930298, -8.6557, 20.0679, 58.918198, -9.177199, 26.7572, 55.889698, -8.6486, 23.412498, 58.951298, -9.183, 23.412498, 58.951298, -9.183, 23.412498, 55.930298, -8.6557, 20.0679, 58.984398, -9.1888, 20.0679, 62.4636, -9.7961, 26.7572, 58.918198, -9.177199, 26.7572, 58.951298, -9.183, 23.412498, 62.4577, -9.795, 23.412498, 58.951298, -9.183, 23.412498, 58.984398, -9.1888, 20.0679, 62.4636, -9.7961, 26.7572, 58.951298, -9.183, 23.412498, 62.4577, -9.795, 23.412498, 66.1166, -10.4337, 23.412498, 62.4636, -9.7961, 26.7572, 62.4577, -9.795, 23.412498, 66.1166, -10.4337, 23.412498, 66.1166, -10.4337, 26.7572, 62.4636, -9.7961, 26.7572, 66.1166, -10.4337, 20.0679, 66.1166, -10.4337, 23.412498, 62.4577, -9.795, 23.412498, 62.4577, -9.795, 23.412498, 58.984398, -9.1888, 20.0679, 62.451897, -9.794, 20.0679, 66.1166, -10.4337, 20.0679, 62.4577, -9.795, 23.412498, 62.451897, -9.794, 20.0679, 62.451897, -9.794, 20.0679, 58.984398, -9.1888, 20.0679, 59.017498, -9.1945, 16.7232, 66.1166, -10.4337, 16.7232, 66.1166, -10.4337, 20.0679, 62.451897, -9.794, 20.0679, 62.451897, -9.794, 20.0679, 59.017498, -9.1945, 16.7232, 62.446, -9.793, 16.7232, 66.1166, -10.4337, 16.7232, 62.451897, -9.794, 20.0679, 62.446, -9.793, 16.7232, 62.446, -9.793, 16.7232, 59.017498, -9.1945, 16.7232, 59.0505, -9.2003, 13.378601, 66.1166, -10.4337, 13.378601, 66.1166, -10.4337, 16.7232, 62.446, -9.793, 16.7232, 62.446, -9.793, 16.7232, 59.0505, -9.2003, 13.378601, 62.440098, -9.792, 13.378601, 66.1166, -10.4337, 13.378601, 62.446, -9.793, 16.7232, 62.440098, -9.792, 13.378601, 62.440098, -9.792, 13.378601, 59.0505, -9.2003, 13.378601, 59.0836, -9.2060995, 10.033899, 66.1166, -10.4337, 10.033899, 66.1166, -10.4337, 13.378601, 62.440098, -9.792, 13.378601, 62.440098, -9.792, 13.378601, 59.0836, -9.2060995, 10.033899, 62.4343, -9.790899, 10.033899, 66.1166, -10.4337, 10.033899, 62.440098, -9.792, 13.378601, 62.4343, -9.790899, 10.033899, 62.4343, -9.790899, 10.033899, 59.0836, -9.2060995, 10.033899, 59.1167, -9.2119, 6.6893, 66.1166, -10.4337, 6.6893, 66.1166, -10.4337, 10.033899, 62.4343, -9.790899, 10.033899, 62.4343, -9.790899, 10.033899, 59.1167, -9.2119, 6.6893, 62.4284, -9.7899, 6.6893, 66.1166, -10.4337, 6.6893, 62.4343, -9.790899, 10.033899, 62.4284, -9.7899, 6.6893, 62.4284, -9.7899, 6.6893, 59.1167, -9.2119, 6.6893, 59.1498, -9.2176, 3.3446, 66.1166, -10.4337, 3.3446, 66.1166, -10.4337, 6.6893, 62.4284, -9.7899, 6.6893, 62.4284, -9.7899, 6.6893, 59.1498, -9.2176, 3.3446, 62.422497, -9.788899, 3.3446, 66.1166, -10.4337, 3.3446, 62.4284, -9.7899, 6.6893, 62.422497, -9.788899, 3.3446, 62.422497, -9.788899, 3.3446, 59.1498, -9.2176, 3.3446, 59.1829, -9.2234, 0, 66.1166, -10.4337, 0, 66.1166, -10.4337, 3.3446, 62.422497, -9.788899, 3.3446, 62.422497, -9.788899, 3.3446, 59.1829, -9.2234, 0, 62.4167, -9.7879, 0, 66.1166, -10.4337, 0, 62.422497, -9.788899, 3.3446, 62.4167, -9.7879, 0, 62.4167, -9.7879, 0, 59.1829, -9.2234, 0, 59.216, -9.229199, -3.3446002, 66.1166, -10.4337, -3.3446002, 66.1166, -10.4337, 0, 62.4167, -9.7879, 0, 62.4167, -9.7879, 0, 59.216, -9.229199, -3.3446002, 62.410797, -9.786799, -3.3446002, 66.1166, -10.4337, -3.3446002, 62.4167, -9.7879, 0, 62.410797, -9.786799, -3.3446002, 59.248997, -9.235, -6.6893, 62.410797, -9.786799, -3.3446002, 59.216, -9.229199, -3.3446002, 62.4049, -9.7858, -6.6893, 66.1166, -10.4337, -3.3446002, 62.410797, -9.786799, -3.3446002, 59.248997, -9.235, -6.6893, 62.4049, -9.7858, -6.6893, 62.410797, -9.786799, -3.3446002, 62.4049, -9.7858, -6.6893, 66.1166, -10.4337, -6.6893, 66.1166, -10.4337, -3.3446002, 56.254498, -8.712299, -6.6893, 59.248997, -9.235, -6.6893, 59.216, -9.229199, -3.3446002, 66.1166, -10.4337, -6.6893, 62.4049, -9.7858, -6.6893, 62.399, -9.7848, -10.033899, 66.1166, -10.4337, -6.6893, 62.399, -9.7848, -10.033899, 66.1166, -10.4337, -10.033899, 62.4049, -9.7858, -6.6893, 59.248997, -9.235, -6.6893, 59.282097, -9.2407, -10.033899, 62.4049, -9.7858, -6.6893, 59.282097, -9.2407, -10.033899, 62.399, -9.7848, -10.033899, 59.248997, -9.235, -6.6893, 56.254498, -8.712299, -6.6893, 56.295, -8.719299, -10.033899, 59.248997, -9.235, -6.6893, 56.295, -8.719299, -10.033899, 59.282097, -9.2407, -10.033899, 56.254498, -8.712299, -6.6893, 52.997097, -8.1437, -10.033899, 56.295, -8.719299, -10.033899, 52.997097, -8.1437, -10.033899, 56.3355, -8.726399, -13.378599, 56.295, -8.719299, -10.033899, 56.3355, -8.726399, -13.378599, 59.282097, -9.2407, -10.033899, 56.295, -8.719299, -10.033899, 52.997097, -8.1437, -10.033899, 52.997097, -8.1437, -13.378599, 56.3355, -8.726399, -13.378599, 59.315197, -9.2465, -13.378599, 62.399, -9.7848, -10.033899, 59.282097, -9.2407, -10.033899, 56.3355, -8.726399, -13.378599, 59.315197, -9.2465, -13.378599, 59.282097, -9.2407, -10.033899, 52.997097, -8.1437, -13.378599, 56.3761, -8.7335, -16.7232, 56.3355, -8.726399, -13.378599, 56.3761, -8.7335, -16.7232, 59.315197, -9.2465, -13.378599, 56.3355, -8.726399, -13.378599, 52.997097, -8.1437, -13.378599, 52.997097, -8.1437, -16.7232, 56.3761, -8.7335, -16.7232, 59.315197, -9.2465, -13.378599, 62.3932, -9.7838, -13.378599, 62.399, -9.7848, -10.033899, 62.3932, -9.7838, -13.378599, 66.1166, -10.4337, -10.033899, 62.399, -9.7848, -10.033899, 62.3932, -9.7838, -13.378599, 66.1166, -10.4337, -13.378599, 66.1166, -10.4337, -10.033899, 59.348297, -9.252299, -16.7232, 62.3932, -9.7838, -13.378599, 59.315197, -9.2465, -13.378599, 56.3761, -8.7335, -16.7232, 59.348297, -9.252299, -16.7232, 59.315197, -9.2465, -13.378599, 62.3873, -9.7827, -16.7232, 66.1166, -10.4337, -13.378599, 62.3932, -9.7838, -13.378599, 59.348297, -9.252299, -16.7232, 62.3873, -9.7827, -16.7232, 62.3932, -9.7838, -13.378599, 62.3873, -9.7827, -16.7232, 66.1166, -10.4337, -16.7232, 66.1166, -10.4337, -13.378599, 56.4166, -8.7406, -20.0679, 59.348297, -9.252299, -16.7232, 56.3761, -8.7335, -16.7232, 52.997097, -8.1437, -16.7232, 56.4166, -8.7406, -20.0679, 56.3761, -8.7335, -16.7232, 52.997097, -8.1437, -16.7232, 52.997097, -8.1437, -20.0679, 56.4166, -8.7406, -20.0679, 52.997097, -8.1437, -20.0679, 56.4571, -8.7476, -23.412498, 56.4166, -8.7406, -20.0679, 52.997097, -8.1437, -20.0679, 52.997097, -8.1437, -23.412498, 56.4571, -8.7476, -23.412498, 56.4166, -8.7406, -20.0679, 59.381397, -9.2581, -20.0679, 59.348297, -9.252299, -16.7232, 56.4571, -8.7476, -23.412498, 59.381397, -9.2581, -20.0679, 56.4166, -8.7406, -20.0679, 59.381397, -9.2581, -20.0679, 62.3873, -9.7827, -16.7232, 59.348297, -9.252299, -16.7232, 56.4571, -8.7476, -23.412498, 59.414497, -9.2638, -23.412498, 59.381397, -9.2581, -20.0679, 62.381397, -9.7817, -20.0679, 66.1166, -10.4337, -16.7232, 62.3873, -9.7827, -16.7232, 59.381397, -9.2581, -20.0679, 62.381397, -9.7817, -20.0679, 62.3873, -9.7827, -16.7232, 59.414497, -9.2638, -23.412498, 62.381397, -9.7817, -20.0679, 59.381397, -9.2581, -20.0679, 62.381397, -9.7817, -20.0679, 66.1166, -10.4337, -20.0679, 66.1166, -10.4337, -16.7232, 59.414497, -9.2638, -23.412498, 62.3756, -9.7807, -23.412498, 62.381397, -9.7817, -20.0679, 62.3756, -9.7807, -23.412498, 66.1166, -10.4337, -20.0679, 62.381397, -9.7817, -20.0679, 62.3756, -9.7807, -23.412498, 66.1166, -10.4337, -23.412498, 66.1166, -10.4337, -20.0679, 66.1166, -10.4572, -26.7572, 68.958595, -10.4337, -23.412498, 66.1166, -10.4337, -23.412498, 66.1166, -10.4572, -26.7572, 68.9481, -10.4572, -26.7572, 68.958595, -10.4337, -23.412498, 68.9481, -10.4572, -26.7572, 72.2025, -10.4337, -23.412498, 68.958595, -10.4337, -23.412498, 68.9481, -10.4572, -26.7572, 72.2092, -10.4572, -26.7572, 72.2025, -10.4337, -23.412498, 72.2092, -10.4572, -26.7572, 75.7165, -10.4337, -23.412498, 72.2025, -10.4337, -23.412498, 72.2092, -10.4572, -26.7572, 75.6957, -10.4572, -26.7572, 75.7165, -10.4337, -23.412498, 75.6957, -10.4572, -26.7572, 79.236, -10.4337, -23.412498, 75.7165, -10.4337, -23.412498, 75.6957, -10.4572, -26.7572, 79.236, -10.4572, -26.7572, 79.236, -10.4337, -23.412498, 39.877598, -3.6573, -13.378599, 42.9754, -4.7166, -10.033899, 39.877598, -3.6573, -10.033899, 39.877598, -3.6573, -13.378599, 42.951797, -4.7086, -13.378599, 42.9754, -4.7166, -10.033899, 42.951797, -4.7086, -13.378599, 46.3474, -5.8697, -10.033899, 42.9754, -4.7166, -10.033899, 42.951797, -4.7086, -13.378599, 39.877598, -3.6573, -13.378599, 39.877598, -3.6573, -16.7232, 42.951797, -4.7086, -13.378599, 46.326397, -5.8626, -13.378599, 46.3474, -5.8697, -10.033899, 46.326397, -5.8626, -13.378599, 49.4666, -6.9364, -10.033899, 46.3474, -5.8697, -10.033899, 42.951797, -4.7086, -13.378599, 39.877598, -3.6573, -16.7232, 42.9282, -4.7005, -16.7232, 46.326397, -5.8626, -13.378599, 42.951797, -4.7086, -13.378599, 42.9282, -4.7005, -16.7232, 39.877598, -3.6573, -16.7232, 42.9046, -4.6924, -20.0679, 42.9282, -4.7005, -16.7232, 39.877598, -3.6573, -16.7232, 39.877598, -3.6573, -20.0679, 42.9046, -4.6924, -20.0679, 46.326397, -5.8626, -13.378599, 42.9282, -4.7005, -16.7232, 46.3055, -5.8554, -16.7232, 42.9046, -4.6924, -20.0679, 46.3055, -5.8554, -16.7232, 42.9282, -4.7005, -16.7232, 46.326397, -5.8626, -13.378599, 49.4568, -6.9329996, -13.378599, 49.4666, -6.9364, -10.033899, 49.4568, -6.9329996, -13.378599, 46.326397, -5.8626, -13.378599, 46.3055, -5.8554, -16.7232, 49.4568, -6.9329996, -13.378599, 52.997097, -8.1437, -10.033899, 49.4666, -6.9364, -10.033899, 49.4568, -6.9329996, -13.378599, 52.997097, -8.1437, -13.378599, 52.997097, -8.1437, -10.033899, 39.877598, -3.6573, -20.0679, 42.881, -4.6844, -23.412498, 42.9046, -4.6924, -20.0679, 39.877598, -3.6573, -20.0679, 39.877598, -3.6573, -23.412498, 42.881, -4.6844, -23.412498, 42.881, -4.6844, -23.412498, 46.2845, -5.8482, -20.0679, 42.9046, -4.6924, -20.0679, 42.9046, -4.6924, -20.0679, 46.2845, -5.8482, -20.0679, 46.3055, -5.8554, -16.7232, 42.881, -4.6844, -23.412498, 46.2636, -5.8410997, -23.412498, 46.2845, -5.8482, -20.0679, 52.997097, -8.1437, -13.378599, 49.4568, -6.9329996, -13.378599, 49.447, -6.9297, -16.7232, 49.4568, -6.9329996, -13.378599, 46.3055, -5.8554, -16.7232, 49.447, -6.9297, -16.7232, 46.2845, -5.8482, -20.0679, 49.447, -6.9297, -16.7232, 46.3055, -5.8554, -16.7232, 52.997097, -8.1437, -13.378599, 49.447, -6.9297, -16.7232, 52.997097, -8.1437, -16.7232, 46.2636, -5.8410997, -23.412498, 49.4372, -6.9263997, -20.0679, 46.2845, -5.8482, -20.0679, 46.2845, -5.8482, -20.0679, 49.4372, -6.9263997, -20.0679, 49.447, -6.9297, -16.7232, 49.4372, -6.9263997, -20.0679, 52.997097, -8.1437, -16.7232, 49.447, -6.9297, -16.7232, 46.2636, -5.8410997, -23.412498, 49.427498, -6.923, -23.412498, 49.4372, -6.9263997, -20.0679, 49.4372, -6.9263997, -20.0679, 52.997097, -8.1437, -20.0679, 52.997097, -8.1437, -16.7232, 49.427498, -6.923, -23.412498, 52.997097, -8.1437, -20.0679, 49.4372, -6.9263997, -20.0679, 49.427498, -6.923, -23.412498, 52.997097, -8.1437, -23.412498, 52.997097, -8.1437, -20.0679, 20.0679, -8.1437, 52.156597, 16.7232, -8.658199, 55.0947, 16.7232, -8.1437, 52.156597, 13.378599, -8.658199, 55.0947, 16.7232, -8.1437, 52.156597, 16.7232, -8.658199, 55.0947, 13.378599, -8.658199, 55.0947, 13.378599, -8.1437, 52.156597, 16.7232, -8.1437, 52.156597, 20.0679, -8.1437, 52.156597, 20.0679, -8.658199, 55.0947, 16.7232, -8.658199, 55.0947, 20.0679, -8.658199, 55.0947, 20.0679, -8.1437, 52.156597, 23.412498, -8.1437, 52.156597, 13.378599, -9.1788, 58.067497, 13.378599, -8.658199, 55.0947, 16.7232, -8.658199, 55.0947, 20.0679, -8.658199, 55.0947, 16.7232, -9.1788, 58.067497, 16.7232, -8.658199, 55.0947, 13.378599, -9.1788, 58.067497, 16.7232, -8.658199, 55.0947, 16.7232, -9.1788, 58.067497, 10.033899, -8.658199, 55.0947, 13.378599, -8.1437, 52.156597, 13.378599, -8.658199, 55.0947, 10.033899, -8.658199, 55.0947, 10.033899, -8.1437, 52.156597, 13.378599, -8.1437, 52.156597, 10.033899, -9.1788, 58.067497, 13.378599, -8.658199, 55.0947, 13.378599, -9.1788, 58.067497, 10.033899, -9.1788, 58.067497, 10.033899, -8.658199, 55.0947, 13.378599, -8.658199, 55.0947, 6.6893, -8.658199, 55.0947, 10.033899, -8.1437, 52.156597, 10.033899, -8.658199, 55.0947, 6.6893, -8.658199, 55.0947, 6.6893, -8.1437, 52.156597, 10.033899, -8.1437, 52.156597, 6.6893, -9.1788, 58.067497, 10.033899, -8.658199, 55.0947, 10.033899, -9.1788, 58.067497, 6.6893, -9.1788, 58.067497, 6.6893, -8.658199, 55.0947, 10.033899, -8.658199, 55.0947, 3.3446, -8.658199, 55.0947, 6.6893, -8.1437, 52.156597, 6.6893, -8.658199, 55.0947, 3.3446, -8.658199, 55.0947, 3.3446, -8.1437, 52.156597, 6.6893, -8.1437, 52.156597, 3.3446, -9.1788, 58.067497, 6.6893, -8.658199, 55.0947, 6.6893, -9.1788, 58.067497, 3.3446, -9.1788, 58.067497, 3.3446, -8.658199, 55.0947, 6.6893, -8.658199, 55.0947, 0, -8.658199, 55.0947, 3.3446, -8.1437, 52.156597, 3.3446, -8.658199, 55.0947, 0, -8.658199, 55.0947, 0, -8.1437, 52.156597, 3.3446, -8.1437, 52.156597, 0, -9.1788, 58.067497, 3.3446, -8.658199, 55.0947, 3.3446, -9.1788, 58.067497, 0, -9.1788, 58.067497, 0, -8.658199, 55.0947, 3.3446, -8.658199, 55.0947, -3.3446002, -8.658199, 55.0947, 0, -8.1437, 52.156597, 0, -8.658199, 55.0947, -3.3446002, -8.658199, 55.0947, -3.3446002, -8.1437, 52.156597, 0, -8.1437, 52.156597, -3.3446002, -9.1788, 58.067497, 0, -8.658199, 55.0947, 0, -9.1788, 58.067497, -3.3446002, -9.1788, 58.067497, -3.3446002, -8.658199, 55.0947, 0, -8.658199, 55.0947, -6.6893, -8.658199, 55.0947, -3.3446002, -8.1437, 52.156597, -3.3446002, -8.658199, 55.0947, -6.6893, -8.658199, 55.0947, -6.6893, -8.1437, 52.156597, -3.3446002, -8.1437, 52.156597, -6.6893, -9.1788, 58.067497, -3.3446002, -8.658199, 55.0947, -3.3446002, -9.1788, 58.067497, -6.6893, -9.1788, 58.067497, -6.6893, -8.658199, 55.0947, -3.3446002, -8.658199, 55.0947, -10.033899, -8.658199, 55.0947, -6.6893, -8.1437, 52.156597, -6.6893, -8.658199, 55.0947, -10.033899, -8.658199, 55.0947, -10.033899, -8.1437, 52.156597, -6.6893, -8.1437, 52.156597, -10.033899, -9.1788, 58.067497, -6.6893, -8.658199, 55.0947, -6.6893, -9.1788, 58.067497, -10.033899, -9.1788, 58.067497, -10.033899, -8.658199, 55.0947, -6.6893, -8.658199, 55.0947, -13.378601, -8.658199, 55.0947, -10.033899, -8.1437, 52.156597, -10.033899, -8.658199, 55.0947, -13.378601, -8.658199, 55.0947, -13.378601, -8.1437, 52.156597, -10.033899, -8.1437, 52.156597, -13.378601, -9.1788, 58.067497, -10.033899, -8.658199, 55.0947, -10.033899, -9.1788, 58.067497, -13.378601, -9.1788, 58.067497, -13.378601, -8.658199, 55.0947, -10.033899, -8.658199, 55.0947, -16.7232, -8.658199, 55.0947, -13.378601, -8.1437, 52.156597, -13.378601, -8.658199, 55.0947, -16.7232, -8.658199, 55.0947, -16.7232, -8.1437, 52.156597, -13.378601, -8.1437, 52.156597, -16.7232, -9.1788, 58.067497, -13.378601, -8.658199, 55.0947, -13.378601, -9.1788, 58.067497, -16.7232, -9.1788, 58.067497, -16.7232, -8.658199, 55.0947, -13.378601, -8.658199, 55.0947, -20.0679, -8.658199, 55.0947, -16.7232, -8.1437, 52.156597, -16.7232, -8.658199, 55.0947, -20.0679, -8.658199, 55.0947, -20.0679, -8.1437, 52.156597, -16.7232, -8.1437, 52.156597, -20.0679, -9.1788, 58.067497, -16.7232, -8.658199, 55.0947, -16.7232, -9.1788, 58.067497, -20.0679, -9.1788, 58.067497, -20.0679, -8.658199, 55.0947, -16.7232, -8.658199, 55.0947, -23.412498, -8.658199, 55.0947, -20.0679, -8.1437, 52.156597, -20.0679, -8.658199, 55.0947, -23.412498, -8.658199, 55.0947, -23.412498, -8.1437, 52.156597, -20.0679, -8.1437, 52.156597, -26.7572, -8.658199, 55.0947, -23.412498, -8.1437, 52.156597, -23.412498, -8.658199, 55.0947, -26.7572, -8.658199, 55.0947, -26.7572, -8.1437, 52.156597, -23.412498, -8.1437, 52.156597, -26.7572, -9.1788, 58.067497, -26.7572, -8.658199, 55.0947, -23.412498, -8.658199, 55.0947, -23.412498, -9.1788, 58.067497, -23.412498, -8.658199, 55.0947, -20.0679, -8.658199, 55.0947, -26.7572, -9.1788, 58.067497, -23.412498, -8.658199, 55.0947, -23.412498, -9.1788, 58.067497, -23.412498, -9.1788, 58.067497, -20.0679, -8.658199, 55.0947, -20.0679, -9.1788, 58.067497, -26.7572, -9.8364, 61.822598, -26.7572, -9.1788, 58.067497, -23.412498, -9.1788, 58.067497, -23.412498, -9.8364, 61.822598, -23.412498, -9.1788, 58.067497, -20.0679, -9.1788, 58.067497, -26.7572, -9.8364, 61.822598, -23.412498, -9.1788, 58.067497, -23.412498, -9.8364, 61.822598, -23.412498, -10.4337, 65.2334, -26.7572, -9.8364, 61.822598, -23.412498, -9.8364, 61.822598, -23.412498, -10.4337, 65.2334, -26.7572, -10.4337, 65.2334, -26.7572, -9.8364, 61.822598, -20.0679, -10.4337, 65.2334, -23.412498, -10.4337, 65.2334, -23.412498, -9.8364, 61.822598, -23.412498, -9.8364, 61.822598, -20.0679, -9.1788, 58.067497, -20.0679, -9.8364, 61.822598, -20.0679, -10.4337, 65.2334, -23.412498, -9.8364, 61.822598, -20.0679, -9.8364, 61.822598, -20.0679, -9.8364, 61.822598, -20.0679, -9.1788, 58.067497, -16.7232, -9.1788, 58.067497, -16.7232, -10.4337, 65.2334, -20.0679, -10.4337, 65.2334, -20.0679, -9.8364, 61.822598, -20.0679, -9.8364, 61.822598, -16.7232, -9.1788, 58.067497, -16.7232, -9.8364, 61.822598, -16.7232, -10.4337, 65.2334, -20.0679, -9.8364, 61.822598, -16.7232, -9.8364, 61.822598, -16.7232, -9.8364, 61.822598, -16.7232, -9.1788, 58.067497, -13.378601, -9.1788, 58.067497, -13.378601, -10.4337, 65.2334, -16.7232, -10.4337, 65.2334, -16.7232, -9.8364, 61.822598, -16.7232, -9.8364, 61.822598, -13.378601, -9.1788, 58.067497, -13.378601, -9.8364, 61.822598, -13.378601, -10.4337, 65.2334, -16.7232, -9.8364, 61.822598, -13.378601, -9.8364, 61.822598, -13.378601, -9.8364, 61.822598, -13.378601, -9.1788, 58.067497, -10.033899, -9.1788, 58.067497, -10.033899, -10.4337, 65.2334, -13.378601, -10.4337, 65.2334, -13.378601, -9.8364, 61.822598, -13.378601, -9.8364, 61.822598, -10.033899, -9.1788, 58.067497, -10.033899, -9.8364, 61.822598, -10.033899, -10.4337, 65.2334, -13.378601, -9.8364, 61.822598, -10.033899, -9.8364, 61.822598, -10.033899, -9.8364, 61.822598, -10.033899, -9.1788, 58.067497, -6.6893, -9.1788, 58.067497, -6.6893, -10.4337, 65.2334, -10.033899, -10.4337, 65.2334, -10.033899, -9.8364, 61.822598, -10.033899, -9.8364, 61.822598, -6.6893, -9.1788, 58.067497, -6.6893, -9.8364, 61.822598, -6.6893, -10.4337, 65.2334, -10.033899, -9.8364, 61.822598, -6.6893, -9.8364, 61.822598, -6.6893, -9.8364, 61.822598, -6.6893, -9.1788, 58.067497, -3.3446002, -9.1788, 58.067497, -3.3446002, -10.4337, 65.2334, -6.6893, -10.4337, 65.2334, -6.6893, -9.8364, 61.822598, -6.6893, -9.8364, 61.822598, -3.3446002, -9.1788, 58.067497, -3.3446002, -9.8364, 61.822598, -3.3446002, -10.4337, 65.2334, -6.6893, -9.8364, 61.822598, -3.3446002, -9.8364, 61.822598, -3.3446002, -9.8364, 61.822598, -3.3446002, -9.1788, 58.067497, 0, -9.1788, 58.067497, 0, -10.4337, 65.2334, -3.3446002, -10.4337, 65.2334, -3.3446002, -9.8364, 61.822598, -3.3446002, -9.8364, 61.822598, 0, -9.1788, 58.067497, 0, -9.8364, 61.822598, 0, -10.4337, 65.2334, -3.3446002, -9.8364, 61.822598, 0, -9.8364, 61.822598, 0, -9.8364, 61.822598, 0, -9.1788, 58.067497, 3.3446, -9.1788, 58.067497, 3.3446, -10.4337, 65.2334, 0, -10.4337, 65.2334, 0, -9.8364, 61.822598, 0, -9.8364, 61.822598, 3.3446, -9.1788, 58.067497, 3.3446, -9.8364, 61.822598, 3.3446, -10.4337, 65.2334, 0, -9.8364, 61.822598, 3.3446, -9.8364, 61.822598, 3.3446, -9.8364, 61.822598, 3.3446, -9.1788, 58.067497, 6.6893, -9.1788, 58.067497, 6.6893, -10.4337, 65.2334, 3.3446, -10.4337, 65.2334, 3.3446, -9.8364, 61.822598, 3.3446, -9.8364, 61.822598, 6.6893, -9.1788, 58.067497, 6.6893, -9.8364, 61.822598, 6.6893, -10.4337, 65.2334, 3.3446, -9.8364, 61.822598, 6.6893, -9.8364, 61.822598, 6.6893, -9.8364, 61.822598, 6.6893, -9.1788, 58.067497, 10.033899, -9.1788, 58.067497, 10.033899, -10.4337, 65.2334, 6.6893, -10.4337, 65.2334, 6.6893, -9.8364, 61.822598, 6.6893, -9.8364, 61.822598, 10.033899, -9.1788, 58.067497, 10.033899, -9.8364, 61.822598, 10.033899, -10.4337, 65.2334, 6.6893, -9.8364, 61.822598, 10.033899, -9.8364, 61.822598, 10.033899, -9.8364, 61.822598, 10.033899, -9.1788, 58.067497, 13.378599, -9.1788, 58.067497, 13.378599, -10.4337, 65.2334, 10.033899, -10.4337, 65.2334, 10.033899, -9.8364, 61.822598, 10.033899, -9.8364, 61.822598, 13.378599, -9.1788, 58.067497, 13.378599, -9.8364, 61.822598, 13.378599, -10.4337, 65.2334, 10.033899, -9.8364, 61.822598, 13.378599, -9.8364, 61.822598, 13.378599, -9.8364, 61.822598, 13.378599, -9.1788, 58.067497, 16.7232, -9.1788, 58.067497, 16.7232, -10.4337, 65.2334, 13.378599, -10.4337, 65.2334, 13.378599, -9.8364, 61.822598, 13.378599, -9.8364, 61.822598, 16.7232, -9.1788, 58.067497, 16.7232, -9.8364, 61.822598, 16.7232, -10.4337, 65.2334, 13.378599, -9.8364, 61.822598, 16.7232, -9.8364, 61.822598, 20.0679, -9.1788, 58.067497, 16.7232, -9.8364, 61.822598, 16.7232, -9.1788, 58.067497, 20.0679, -9.8364, 61.822598, 16.7232, -10.4337, 65.2334, 16.7232, -9.8364, 61.822598, 20.0679, -9.1788, 58.067497, 20.0679, -9.8364, 61.822598, 16.7232, -9.8364, 61.822598, 20.0679, -9.8364, 61.822598, 20.0679, -10.4337, 65.2334, 16.7232, -10.4337, 65.2334, 20.0679, -8.658199, 55.0947, 20.0679, -9.1788, 58.067497, 16.7232, -9.1788, 58.067497, 20.0679, -10.4337, 65.2334, 20.0679, -9.8364, 61.822598, 23.412498, -9.8364, 61.822598, 20.0679, -10.4337, 65.2334, 23.412498, -9.8364, 61.822598, 23.412498, -10.4337, 65.2334, 26.7582, -9.8364, 61.822598, 23.412498, -10.4337, 65.2334, 23.412498, -9.8364, 61.822598, 26.7582, -9.8364, 61.822598, 26.7582, -10.4337, 65.2334, 23.412498, -10.4337, 65.2334, 26.7582, -9.1788, 58.067497, 26.7582, -9.8364, 61.822598, 23.412498, -9.8364, 61.822598, 20.0679, -9.8364, 61.822598, 23.412498, -9.1788, 58.067497, 23.412498, -9.8364, 61.822598, 26.7582, -9.1788, 58.067497, 23.412498, -9.8364, 61.822598, 23.412498, -9.1788, 58.067497, 20.0679, -9.8364, 61.822598, 20.0679, -9.1788, 58.067497, 23.412498, -9.1788, 58.067497, 26.7582, -8.658199, 55.0947, 26.7582, -9.1788, 58.067497, 23.412498, -9.1788, 58.067497, 20.0679, -9.1788, 58.067497, 20.0679, -8.658199, 55.0947, 23.412498, -8.658199, 55.0947, 20.0679, -9.1788, 58.067497, 23.412498, -8.658199, 55.0947, 23.412498, -9.1788, 58.067497, 26.7582, -8.658199, 55.0947, 23.412498, -9.1788, 58.067497, 23.412498, -8.658199, 55.0947, 20.0679, -8.658199, 55.0947, 23.412498, -8.1437, 52.156597, 23.412498, -8.658199, 55.0947, 23.412498, -8.1437, 52.156597, 26.7582, -8.658199, 55.0947, 23.412498, -8.658199, 55.0947, 23.412498, -8.1437, 52.156597, 26.7582, -8.1437, 52.156597, 26.7582, -8.658199, 55.0947, 20.0679, -3.8518999, 39.456898, 16.7232, -4.9595, 42.7343, 16.7232, -3.8518999, 39.456898, 13.378599, -4.9595, 42.7343, 16.7232, -3.8518999, 39.456898, 16.7232, -4.9595, 42.7343, 13.378599, -4.9595, 42.7343, 13.378599, -3.8518999, 39.456898, 16.7232, -3.8518999, 39.456898, 20.0679, -3.8518999, 39.456898, 20.0679, -4.9595, 42.7343, 16.7232, -4.9595, 42.7343, 20.0679, -4.9595, 42.7343, 20.0679, -3.8518999, 39.456898, 23.412498, -3.8518999, 39.456898, 13.378599, -6.2019997, 46.4111, 13.378599, -4.9595, 42.7343, 16.7232, -4.9595, 42.7343, 20.0679, -4.9595, 42.7343, 16.7232, -6.2019997, 46.4111, 16.7232, -4.9595, 42.7343, 13.378599, -6.2019997, 46.4111, 16.7232, -4.9595, 42.7343, 16.7232, -6.2019997, 46.4111, 10.033899, -4.9595, 42.7343, 13.378599, -3.8518999, 39.456898, 13.378599, -4.9595, 42.7343, 10.033899, -4.9595, 42.7343, 10.033899, -3.8518999, 39.456898, 13.378599, -3.8518999, 39.456898, 10.033899, -6.2019997, 46.4111, 13.378599, -4.9595, 42.7343, 13.378599, -6.2019997, 46.4111, 10.033899, -6.2019997, 46.4111, 10.033899, -4.9595, 42.7343, 13.378599, -4.9595, 42.7343, 6.6893, -4.9595, 42.7343, 10.033899, -3.8518999, 39.456898, 10.033899, -4.9595, 42.7343, 6.6893, -4.9595, 42.7343, 6.6893, -3.8518999, 39.456898, 10.033899, -3.8518999, 39.456898, 6.6893, -6.2019997, 46.4111, 10.033899, -4.9595, 42.7343, 10.033899, -6.2019997, 46.4111, 6.6893, -6.2019997, 46.4111, 6.6893, -4.9595, 42.7343, 10.033899, -4.9595, 42.7343, 3.3446, -4.9595, 42.7343, 6.6893, -3.8518999, 39.456898, 6.6893, -4.9595, 42.7343, 3.3446, -4.9595, 42.7343, 3.3446, -3.8518999, 39.456898, 6.6893, -3.8518999, 39.456898, 3.3446, -6.2019997, 46.4111, 6.6893, -4.9595, 42.7343, 6.6893, -6.2019997, 46.4111, 3.3446, -6.2019997, 46.4111, 3.3446, -4.9595, 42.7343, 6.6893, -4.9595, 42.7343, 0, -4.9595, 42.7343, 3.3446, -3.8518999, 39.456898, 3.3446, -4.9595, 42.7343, 0, -4.9595, 42.7343, 0, -3.8518999, 39.456898, 3.3446, -3.8518999, 39.456898, 0, -6.2019997, 46.4111, 3.3446, -4.9595, 42.7343, 3.3446, -6.2019997, 46.4111, 0, -6.2019997, 46.4111, 0, -4.9595, 42.7343, 3.3446, -4.9595, 42.7343, -3.3446002, -4.9595, 42.7343, 0, -3.8518999, 39.456898, 0, -4.9595, 42.7343, -3.3446002, -4.9595, 42.7343, -3.3446002, -3.8518999, 39.456898, 0, -3.8518999, 39.456898, -3.3446002, -6.2019997, 46.4111, 0, -4.9595, 42.7343, 0, -6.2019997, 46.4111, -3.3446002, -6.2019997, 46.4111, -3.3446002, -4.9595, 42.7343, 0, -4.9595, 42.7343, -6.6893, -4.9595, 42.7343, -3.3446002, -3.8518999, 39.456898, -3.3446002, -4.9595, 42.7343, -6.6893, -4.9595, 42.7343, -6.6893, -3.8518999, 39.456898, -3.3446002, -3.8518999, 39.456898, -6.6893, -6.2019997, 46.4111, -3.3446002, -4.9595, 42.7343, -3.3446002, -6.2019997, 46.4111, -6.6893, -6.2019997, 46.4111, -6.6893, -4.9595, 42.7343, -3.3446002, -4.9595, 42.7343, -10.033899, -4.9595, 42.7343, -6.6893, -3.8518999, 39.456898, -6.6893, -4.9595, 42.7343, -10.033899, -4.9595, 42.7343, -10.033899, -3.8518999, 39.456898, -6.6893, -3.8518999, 39.456898, -10.033899, -6.2019997, 46.4111, -6.6893, -4.9595, 42.7343, -6.6893, -6.2019997, 46.4111, -10.033899, -6.2019997, 46.4111, -10.033899, -4.9595, 42.7343, -6.6893, -4.9595, 42.7343, -13.378601, -4.9595, 42.7343, -10.033899, -3.8518999, 39.456898, -10.033899, -4.9595, 42.7343, -13.378601, -4.9595, 42.7343, -13.378601, -3.8518999, 39.456898, -10.033899, -3.8518999, 39.456898, -13.378601, -6.2019997, 46.4111, -10.033899, -4.9595, 42.7343, -10.033899, -6.2019997, 46.4111, -13.378601, -6.2019997, 46.4111, -13.378601, -4.9595, 42.7343, -10.033899, -4.9595, 42.7343, -16.7232, -4.9595, 42.7343, -13.378601, -3.8518999, 39.456898, -13.378601, -4.9595, 42.7343, -16.7232, -4.9595, 42.7343, -16.7232, -3.8518999, 39.456898, -13.378601, -3.8518999, 39.456898, -16.7232, -6.2019997, 46.4111, -13.378601, -4.9595, 42.7343, -13.378601, -6.2019997, 46.4111, -16.7232, -6.2019997, 46.4111, -16.7232, -4.9595, 42.7343, -13.378601, -4.9595, 42.7343, -20.0679, -4.9595, 42.7343, -16.7232, -3.8518999, 39.456898, -16.7232, -4.9595, 42.7343, -20.0679, -4.9595, 42.7343, -20.0679, -3.8518999, 39.456898, -16.7232, -3.8518999, 39.456898, -20.0679, -6.2019997, 46.4111, -16.7232, -4.9595, 42.7343, -16.7232, -6.2019997, 46.4111, -20.0679, -6.2019997, 46.4111, -20.0679, -4.9595, 42.7343, -16.7232, -4.9595, 42.7343, -23.412498, -4.9595, 42.7343, -20.0679, -3.8518999, 39.456898, -20.0679, -4.9595, 42.7343, -23.412498, -4.9595, 42.7343, -23.412498, -3.8518999, 39.456898, -20.0679, -3.8518999, 39.456898, -26.7572, -4.9595, 42.7343, -23.412498, -3.8518999, 39.456898, -23.412498, -4.9595, 42.7343, -26.7572, -4.9595, 42.7343, -26.7572, -3.8518999, 39.456898, -23.412498, -3.8518999, 39.456898, -26.7572, -6.2019997, 46.4111, -26.7572, -4.9595, 42.7343, -23.412498, -4.9595, 42.7343, -23.412498, -6.2019997, 46.4111, -23.412498, -4.9595, 42.7343, -20.0679, -4.9595, 42.7343, -26.7572, -6.2019997, 46.4111, -23.412498, -4.9595, 42.7343, -23.412498, -6.2019997, 46.4111, -23.412498, -6.2019997, 46.4111, -20.0679, -4.9595, 42.7343, -20.0679, -6.2019997, 46.4111, -26.7572, -7.286, 49.6186, -26.7572, -6.2019997, 46.4111, -23.412498, -6.2019997, 46.4111, -23.412498, -7.286, 49.6186, -23.412498, -6.2019997, 46.4111, -20.0679, -6.2019997, 46.4111, -26.7572, -7.286, 49.6186, -23.412498, -6.2019997, 46.4111, -23.412498, -7.286, 49.6186, -23.412498, -8.1437, 52.156597, -26.7572, -7.286, 49.6186, -23.412498, -7.286, 49.6186, -23.412498, -8.1437, 52.156597, -26.7572, -8.1437, 52.156597, -26.7572, -7.286, 49.6186, -20.0679, -8.1437, 52.156597, -23.412498, -8.1437, 52.156597, -23.412498, -7.286, 49.6186, -23.412498, -7.286, 49.6186, -20.0679, -6.2019997, 46.4111, -20.0679, -7.286, 49.6186, -20.0679, -8.1437, 52.156597, -23.412498, -7.286, 49.6186, -20.0679, -7.286, 49.6186, -20.0679, -7.286, 49.6186, -20.0679, -6.2019997, 46.4111, -16.7232, -6.2019997, 46.4111, -16.7232, -8.1437, 52.156597, -20.0679, -8.1437, 52.156597, -20.0679, -7.286, 49.6186, -20.0679, -7.286, 49.6186, -16.7232, -6.2019997, 46.4111, -16.7232, -7.286, 49.6186, -16.7232, -8.1437, 52.156597, -20.0679, -7.286, 49.6186, -16.7232, -7.286, 49.6186, -16.7232, -7.286, 49.6186, -16.7232, -6.2019997, 46.4111, -13.378601, -6.2019997, 46.4111, -13.378601, -8.1437, 52.156597, -16.7232, -8.1437, 52.156597, -16.7232, -7.286, 49.6186, -16.7232, -7.286, 49.6186, -13.378601, -6.2019997, 46.4111, -13.378601, -7.286, 49.6186, -13.378601, -8.1437, 52.156597, -16.7232, -7.286, 49.6186, -13.378601, -7.286, 49.6186, -13.378601, -7.286, 49.6186, -13.378601, -6.2019997, 46.4111, -10.033899, -6.2019997, 46.4111, -10.033899, -8.1437, 52.156597, -13.378601, -8.1437, 52.156597, -13.378601, -7.286, 49.6186, -13.378601, -7.286, 49.6186, -10.033899, -6.2019997, 46.4111, -10.033899, -7.286, 49.6186, -10.033899, -8.1437, 52.156597, -13.378601, -7.286, 49.6186, -10.033899, -7.286, 49.6186, -10.033899, -7.286, 49.6186, -10.033899, -6.2019997, 46.4111, -6.6893, -6.2019997, 46.4111, -6.6893, -8.1437, 52.156597, -10.033899, -8.1437, 52.156597, -10.033899, -7.286, 49.6186, -10.033899, -7.286, 49.6186, -6.6893, -6.2019997, 46.4111, -6.6893, -7.286, 49.6186, -6.6893, -8.1437, 52.156597, -10.033899, -7.286, 49.6186, -6.6893, -7.286, 49.6186, -6.6893, -7.286, 49.6186, -6.6893, -6.2019997, 46.4111, -3.3446002, -6.2019997, 46.4111, -3.3446002, -8.1437, 52.156597, -6.6893, -8.1437, 52.156597, -6.6893, -7.286, 49.6186, -6.6893, -7.286, 49.6186, -3.3446002, -6.2019997, 46.4111, -3.3446002, -7.286, 49.6186, -3.3446002, -8.1437, 52.156597, -6.6893, -7.286, 49.6186, -3.3446002, -7.286, 49.6186, -3.3446002, -7.286, 49.6186, -3.3446002, -6.2019997, 46.4111, 0, -6.2019997, 46.4111, 0, -8.1437, 52.156597, -3.3446002, -8.1437, 52.156597, -3.3446002, -7.286, 49.6186, -3.3446002, -7.286, 49.6186, 0, -6.2019997, 46.4111, 0, -7.286, 49.6186, 0, -8.1437, 52.156597, -3.3446002, -7.286, 49.6186, 0, -7.286, 49.6186, 0, -7.286, 49.6186, 0, -6.2019997, 46.4111, 3.3446, -6.2019997, 46.4111, 3.3446, -8.1437, 52.156597, 0, -8.1437, 52.156597, 0, -7.286, 49.6186, 0, -7.286, 49.6186, 3.3446, -6.2019997, 46.4111, 3.3446, -7.286, 49.6186, 3.3446, -8.1437, 52.156597, 0, -7.286, 49.6186, 3.3446, -7.286, 49.6186, 3.3446, -7.286, 49.6186, 3.3446, -6.2019997, 46.4111, 6.6893, -6.2019997, 46.4111, 6.6893, -8.1437, 52.156597, 3.3446, -8.1437, 52.156597, 3.3446, -7.286, 49.6186, 3.3446, -7.286, 49.6186, 6.6893, -6.2019997, 46.4111, 6.6893, -7.286, 49.6186, 6.6893, -8.1437, 52.156597, 3.3446, -7.286, 49.6186, 6.6893, -7.286, 49.6186, 6.6893, -7.286, 49.6186, 6.6893, -6.2019997, 46.4111, 10.033899, -6.2019997, 46.4111, 10.033899, -8.1437, 52.156597, 6.6893, -8.1437, 52.156597, 6.6893, -7.286, 49.6186, 6.6893, -7.286, 49.6186, 10.033899, -6.2019997, 46.4111, 10.033899, -7.286, 49.6186, 10.033899, -8.1437, 52.156597, 6.6893, -7.286, 49.6186, 10.033899, -7.286, 49.6186, 10.033899, -7.286, 49.6186, 10.033899, -6.2019997, 46.4111, 13.378599, -6.2019997, 46.4111, 13.378599, -8.1437, 52.156597, 10.033899, -8.1437, 52.156597, 10.033899, -7.286, 49.6186, 10.033899, -7.286, 49.6186, 13.378599, -6.2019997, 46.4111, 13.378599, -7.286, 49.6186, 13.378599, -8.1437, 52.156597, 10.033899, -7.286, 49.6186, 13.378599, -7.286, 49.6186, 13.378599, -7.286, 49.6186, 13.378599, -6.2019997, 46.4111, 16.7232, -6.2019997, 46.4111, 16.7232, -8.1437, 52.156597, 13.378599, -8.1437, 52.156597, 13.378599, -7.286, 49.6186, 13.378599, -7.286, 49.6186, 16.7232, -6.2019997, 46.4111, 16.7232, -7.286, 49.6186, 16.7232, -8.1437, 52.156597, 13.378599, -7.286, 49.6186, 16.7232, -7.286, 49.6186, 20.0679, -6.2019997, 46.4111, 16.7232, -7.286, 49.6186, 16.7232, -6.2019997, 46.4111, 20.0679, -7.286, 49.6186, 16.7232, -8.1437, 52.156597, 16.7232, -7.286, 49.6186, 20.0679, -6.2019997, 46.4111, 20.0679, -7.286, 49.6186, 16.7232, -7.286, 49.6186, 20.0679, -7.286, 49.6186, 20.0679, -8.1437, 52.156597, 16.7232, -8.1437, 52.156597, 20.0679, -4.9595, 42.7343, 20.0679, -6.2019997, 46.4111, 16.7232, -6.2019997, 46.4111, 20.0679, -8.1437, 52.156597, 20.0679, -7.286, 49.6186, 23.412498, -7.286, 49.6186, 20.0679, -8.1437, 52.156597, 23.412498, -7.286, 49.6186, 23.412498, -8.1437, 52.156597, 26.7582, -7.286, 49.6186, 23.412498, -8.1437, 52.156597, 23.412498, -7.286, 49.6186, 26.7582, -7.286, 49.6186, 26.7582, -8.1437, 52.156597, 23.412498, -8.1437, 52.156597, 26.7582, -6.2019997, 46.4111, 26.7582, -7.286, 49.6186, 23.412498, -7.286, 49.6186, 20.0679, -7.286, 49.6186, 23.412498, -6.2019997, 46.4111, 23.412498, -7.286, 49.6186, 26.7582, -6.2019997, 46.4111, 23.412498, -7.286, 49.6186, 23.412498, -6.2019997, 46.4111, 20.0679, -7.286, 49.6186, 20.0679, -6.2019997, 46.4111, 23.412498, -6.2019997, 46.4111, 26.7582, -4.9595, 42.7343, 26.7582, -6.2019997, 46.4111, 23.412498, -6.2019997, 46.4111, 20.0679, -6.2019997, 46.4111, 20.0679, -4.9595, 42.7343, 23.412498, -4.9595, 42.7343, 20.0679, -6.2019997, 46.4111, 23.412498, -4.9595, 42.7343, 23.412498, -6.2019997, 46.4111, 26.7582, -4.9595, 42.7343, 23.412498, -6.2019997, 46.4111, 23.412498, -4.9595, 42.7343, 20.0679, -4.9595, 42.7343, 23.412498, -3.8518999, 39.456898, 23.412498, -4.9595, 42.7343, 23.412498, -3.8518999, 39.456898, 26.7582, -4.9595, 42.7343, 23.412498, -4.9595, 42.7343, 23.412498, -3.8518999, 39.456898, 26.7582, -3.8518999, 39.456898, 26.7582, -4.9595, 42.7343, -26.7572, -1.2701, 26.7572, -26.7572, -2.0054, 30.3737, -28.645699, -2.01, 28.5121, -28.645699, -2.01, 28.5121, -30.426, -2.0144, 26.7572, -26.7572, -1.2701, 26.7572, -28.447899, -2.6727, 31.969099, -28.645699, -2.01, 28.5121, -26.7572, -2.0054, 30.3737, -26.7572, -2.0054, 30.3737, -26.7572, -2.6892, 33.737698, -28.447899, -2.6727, 31.969099, -30.291101, -2.6547, 30.040998, -30.426, -2.0144, 26.7572, -28.645699, -2.01, 28.5121, -28.447899, -2.6727, 31.969099, -30.291101, -2.6547, 30.040998, -28.645699, -2.01, 28.5121, -30.291101, -2.6547, 30.040998, -32.027798, -2.6376998, 28.2244, -30.426, -2.0144, 26.7572, -32.027798, -2.6376998, 28.2244, -33.4304, -2.6239998, 26.7572, -30.426, -2.0144, 26.7572, -29.8963, -3.2444, 33.336, -30.291101, -2.6547, 30.040998, -28.447899, -2.6727, 31.969099, -26.7572, -2.6892, 33.737698, -29.8963, -3.2444, 33.336, -28.447899, -2.6727, 31.969099, -31.7465, -3.2247999, 31.3933, -32.027798, -2.6376998, 28.2244, -30.291101, -2.6547, 30.040998, -29.8963, -3.2444, 33.336, -31.7465, -3.2247999, 31.3933, -30.291101, -2.6547, 30.040998, -26.7572, -2.6892, 33.737698, -28.188799, -3.2624998, 35.128998, -29.8963, -3.2444, 33.336, -28.188799, -3.2624998, 35.128998, -26.7572, -2.6892, 33.737698, -26.7572, -3.2777, 36.6322, -29.5455, -3.8058, 36.4474, -29.8963, -3.2444, 33.336, -28.188799, -3.2624998, 35.128998, -26.7572, -3.2777, 36.6322, -29.5455, -3.8058, 36.4474, -28.188799, -3.2624998, 35.128998, -26.7572, -3.2777, 36.6322, -28.1288, -3.8291998, 37.976498, -29.5455, -3.8058, 36.4474, -28.1288, -3.8291998, 37.976498, -26.7572, -3.2777, 36.6322, -26.7572, -3.8518999, 39.456898, -29.5455, -3.8058, 36.4474, -31.247301, -3.7775998, 34.6107, -29.8963, -3.2444, 33.336, -31.247301, -3.7775998, 34.6107, -31.7465, -3.2247999, 31.3933, -29.8963, -3.2444, 33.336, -31.247301, -3.7775998, 34.6107, -33.0801, -3.7473, 32.6325, -31.7465, -3.2247999, 31.3933, -33.0801, -3.7473, 32.6325, -33.4894, -3.2064, 29.5632, -31.7465, -3.2247999, 31.3933, -31.7465, -3.2247999, 31.3933, -33.4894, -3.2064, 29.5632, -32.027798, -2.6376998, 28.2244, -33.4894, -3.2064, 29.5632, -33.4304, -2.6239998, 26.7572, -32.027798, -2.6376998, 28.2244, -33.0801, -3.7473, 32.6325, -34.806297, -3.7187998, 30.769499, -33.4894, -3.2064, 29.5632, -33.4894, -3.2064, 29.5632, -34.9099, -3.1913, 28.0716, -33.4304, -2.6239998, 26.7572, -34.806297, -3.7187998, 30.769499, -34.9099, -3.1913, 28.0716, -33.4894, -3.2064, 29.5632, -34.9099, -3.1913, 28.0716, -36.161697, -3.1780999, 26.7572, -33.4304, -2.6239998, 26.7572, -34.806297, -3.7187998, 30.769499, -36.2241, -3.6952999, 29.2393, -34.9099, -3.1913, 28.0716, -36.2241, -3.6952999, 29.2393, -36.161697, -3.1780999, 26.7572, -34.9099, -3.1913, 28.0716, -36.2241, -3.6952999, 29.2393, -37.4711, -3.6747, 27.8934, -36.161697, -3.1780999, 26.7572, -37.4711, -3.6747, 27.8934, -38.5239, -3.6573, 26.7572, -36.161697, -3.1780999, 26.7572, -50.290497, -8.1437, 26.7572, -47.4473, -7.0596, 26.7572, -49.074398, -8.1437, 28.0697, -62.057194, -10.4337, 26.7572, -58.463497, -9.7343, 26.7572, -60.611, -10.4337, 28.3335, 26.7582, -9.8364, 61.822598, 66.1166, -10.4337, 26.7572, 26.7582, -10.4337, 65.2334, 26.7582, -9.8364, 61.822598, 62.4636, -9.7961, 26.7572, 66.1166, -10.4337, 26.7572, 26.7582, -9.1788, 58.067497, 62.4636, -9.7961, 26.7572, 26.7582, -9.8364, 61.822598, 26.7582, -9.1788, 58.067497, 58.918198, -9.177199, 26.7572, 62.4636, -9.7961, 26.7572, 26.7582, -9.1788, 58.067497, 55.849197, -8.6414995, 26.7572, 58.918198, -9.177199, 26.7572, 55.849197, -8.6414995, 26.7572, 26.7582, -9.1788, 58.067497, 52.997097, -8.1437, 26.7572, 52.997097, -8.1437, 26.7572, 26.7582, -9.1788, 58.067497, 26.7582, -8.1437, 52.156597, 26.7582, -8.1437, 52.156597, 26.7582, -9.1788, 58.067497, 26.7582, -8.658199, 55.0947, 43.234898, -4.8054, 26.7572, 26.7582, -3.8518999, 39.456898, 39.877598, -3.6573, 26.7572, 46.577698, -5.9484997, 26.7572, 26.7582, -3.8518999, 39.456898, 43.234898, -4.8054, 26.7572, 46.577698, -5.9484997, 26.7572, 26.7582, -6.2019997, 46.4111, 26.7582, -3.8518999, 39.456898, 26.7582, -3.8518999, 39.456898, 26.7582, -6.2019997, 46.4111, 26.7582, -4.9595, 42.7343, 26.7582, -6.2019997, 46.4111, 46.577698, -5.9484997, 26.7572, 26.7582, -8.1437, 52.156597, 26.7582, -6.2019997, 46.4111, 26.7582, -8.1437, 52.156597, 26.7582, -7.286, 49.6186, 26.7582, -8.1437, 52.156597, 46.577698, -5.9484997, 26.7572, 49.5743, -6.9732, 26.7572, 26.7582, -8.1437, 52.156597, 49.5743, -6.9732, 26.7572, 52.997097, -8.1437, 26.7572, 29.1145, -2.5956, 26.7572, 26.7582, -3.0839999, 30.2834, 26.7582, -2.7837, 26.6955, 29.1145, -2.5956, 26.7572, 26.7582, -3.3683999, 33.680798, 26.7582, -3.0839999, 30.2834, 33.146698, -3.214, 26.7572, 26.7582, -3.3683999, 33.680798, 29.1145, -2.5956, 26.7572, 33.146698, -3.214, 26.7572, 26.7582, -3.6130998, 36.6041, 26.7582, -3.3683999, 33.680798, 26.7582, -3.6130998, 36.6041, 33.146698, -3.214, 26.7572, 39.877598, -3.6573, 26.7572, 39.877598, -3.6573, 26.7572, 33.146698, -3.214, 26.7572, 36.078598, -3.0746999, 26.7572, 26.7582, -3.6130998, 36.6041, 39.877598, -3.6573, 26.7572, 26.7582, -3.8518999, 39.456898, 26.7573, -1.7447, -30.111198, 29.3928, -1.796, -26.7572, 26.7573, -1.3222, -26.7572, 26.7572, -2.5274, -33.9013, 29.3928, -1.796, -26.7572, 26.7573, -1.7447, -30.111198, 29.3928, -1.796, -26.7572, 26.7572, -2.5274, -33.9013, 26.7572, -3.9166, -40.6287, 26.7572, -3.9166, -40.6287, 26.7572, -2.5274, -33.9013, 26.7572, -3.2101, -37.2077, 29.3928, -1.796, -26.7572, 26.7572, -3.9166, -40.6287, 36.0678, -2.9959998, -26.7572, 36.0678, -2.9959998, -26.7572, 26.7572, -3.9166, -40.6287, 39.877598, -3.6808999, -26.7572, 29.3928, -1.796, -26.7572, 36.0678, -2.9959998, -26.7572, 32.9589, -2.4371, -26.7572, 49.4036, -6.9384, -26.7572, 26.7572, -8.403, -54.500298, 52.997097, -8.1672, -26.7572, 46.2278, -5.8524, -26.7572, 26.7572, -8.403, -54.500298, 49.4036, -6.9384, -26.7572, 26.7572, -8.403, -54.500298, 46.2278, -5.8524, -26.7572, 26.7572, -3.9166, -40.6287, 26.7572, -3.9166, -40.6287, 46.2278, -5.8524, -26.7572, 42.8416, -4.6944, -26.7572, 26.7572, -3.9166, -40.6287, 42.8416, -4.6944, -26.7572, 39.877598, -3.6808999, -26.7572, 26.7572, -8.403, -54.500298, 26.7572, -3.9166, -40.6287, 26.7572, -6.2504, -47.8447, 26.7572, -6.2504, -47.8447, 26.7572, -3.9166, -40.6287, 26.7572, -5.1514, -44.446598, 26.7572, -8.403, -54.500298, 26.7572, -6.2504, -47.8447, 26.7572, -7.3550997, -51.2602, 62.356697, -9.8008995, -26.7572, 26.7572, -10.693, -68.371895, 66.1166, -10.4572, -26.7572, 59.4335, -9.2907, -26.7572, 26.7572, -10.693, -68.371895, 62.356697, -9.8008995, -26.7572, 26.7572, -10.693, -68.371895, 59.4335, -9.2907, -26.7572, 26.7572, -9.312699, -60.011097, 26.7572, -10.693, -68.371895, 26.7572, -9.312699, -60.011097, 26.7572, -9.876599, -63.426796, 26.7572, -9.312699, -60.011097, 59.4335, -9.2907, -26.7572, 56.4827, -8.7755995, -26.7572, 26.7572, -9.312699, -60.011097, 56.4827, -8.7755995, -26.7572, 26.7572, -8.881, -57.3956, 26.7572, -8.881, -57.3956, 56.4827, -8.7755995, -26.7572, 52.997097, -8.1672, -26.7572, 26.7572, -8.881, -57.3956, 52.997097, -8.1672, -26.7572, 26.7572, -8.403, -54.500298, 26.7572, -10.693, -70.330795, 66.1166, -10.4572, -26.7572, 26.7572, -10.693, -68.371895, 26.7572, -10.693, -70.330795, 68.9481, -10.4572, -26.7572, 66.1166, -10.4572, -26.7572, 26.7572, -10.693, -73.1232, 68.9481, -10.4572, -26.7572, 26.7572, -10.693, -70.330795, 26.7572, -10.693, -73.1232, 72.2092, -10.4572, -26.7572, 68.9481, -10.4572, -26.7572, 26.7572, -10.693, -73.1232, 75.6957, -10.4572, -26.7572, 72.2092, -10.4572, -26.7572, 75.6957, -10.4572, -26.7572, 26.7572, -10.693, -73.1232, 26.7572, -10.693, -82.2434, 75.6957, -10.4572, -26.7572, 26.7572, -10.693, -82.2434, 79.236, -10.4572, -26.7572, 26.7572, -10.693, -82.2434, 26.7572, -10.693, -73.1232, 26.7572, -10.693, -79.5579, 26.7572, -10.693, -79.5579, 26.7572, -10.693, -73.1232, 26.7572, -10.693, -76.193, -30.173899, -3.2568, -26.7572, -26.7572, -3.2445998, -30.4851, -26.7572, -3.0929, -26.7572, -30.173899, -3.2568, -26.7572, -26.7572, -3.3862, -33.9664, -26.7572, -3.2445998, -30.4851, -30.173899, -3.2568, -26.7572, -26.7572, -3.5244, -37.3623, -26.7572, -3.3862, -33.9664, -26.7572, -3.5244, -37.3623, -30.173899, -3.2568, -26.7572, -36.0882, -3.5405, -26.7572, -36.0882, -3.5405, -26.7572, -30.173899, -3.2568, -26.7572, -33.2719, -3.4053998, -26.7572, -26.7572, -3.5244, -37.3623, -36.0882, -3.5405, -26.7572, -26.7572, -3.6573, -40.6287, -26.7572, -3.6573, -40.6287, -36.0882, -3.5405, -26.7572, -38.5239, -3.6573, -26.7572, -41.627, -4.8403997, -26.7572, -26.7572, -3.6573, -40.6287, -38.5239, -3.6573, -26.7572, -41.627, -4.8403997, -26.7572, -26.7572, -5.9270997, -47.646698, -26.7572, -3.6573, -40.6287, -26.7572, -3.6573, -40.6287, -26.7572, -5.9270997, -47.646698, -26.7572, -4.8125997, -44.200798, -44.537098, -5.95, -26.7572, -26.7572, -5.9270997, -47.646698, -41.627, -4.8403997, -26.7572, -26.7572, -5.9270997, -47.646698, -44.537098, -5.95, -26.7572, -50.290497, -8.1437, -26.7572, -50.290497, -8.1437, -26.7572, -44.537098, -5.95, -26.7572, -47.4473, -7.0596, -26.7572, -26.7572, -5.9270997, -47.646698, -50.290497, -8.1437, -26.7572, -26.7572, -7.1011, -51.2768, -26.7572, -7.1011, -51.2768, -50.290497, -8.1437, -26.7572, -26.7572, -8.1437, -54.500298, -53.117798, -8.6939, -26.7572, -26.7572, -8.1437, -54.500298, -50.290497, -8.1437, -26.7572, -55.5951, -9.176, -26.7572, -26.7572, -8.1437, -54.500298, -53.117798, -8.6939, -26.7572, -58.463497, -9.7343, -26.7572, -26.7572, -8.1437, -54.500298, -55.5951, -9.176, -26.7572, -26.7572, -8.1437, -54.500298, -58.463497, -9.7343, -26.7572, -26.7572, -9.7125, -64.0031, -26.7572, -9.7125, -64.0031, -58.463497, -9.7343, -26.7572, -62.057194, -10.4337, -26.7572, -26.7572, -9.7125, -64.0031, -62.057194, -10.4337, -26.7572, -26.7572, -10.4337, -68.371895, -26.7572, -8.1437, -54.500298, -26.7572, -9.7125, -64.0031, -26.7572, -9.111199, -60.361, -26.7572, -8.1437, -54.500298, -26.7572, -9.111199, -60.361, -26.7572, -8.6276, -57.4314, -64.963196, -10.4337, -26.7572, -26.7572, -10.4337, -68.371895, -62.057194, -10.4337, -26.7572, -64.963196, -10.4337, -26.7572, -26.7572, -10.4337, -70.9319, -26.7572, -10.4337, -68.371895, -64.963196, -10.4337, -26.7572, -62.057194, -10.4337, -26.7572, -62.057194, -10.4337, -23.412498, -68.2489, -10.4337, -26.7572, -26.7572, -10.4337, -70.9319, -64.963196, -10.4337, -26.7572, -68.2489, -10.4337, -26.7572, -26.7572, -10.4337, -73.7615, -26.7572, -10.4337, -70.9319, -64.963196, -10.4337, -26.7572, -62.057194, -10.4337, -23.412498, -64.963196, -10.4337, -23.412498, -68.2489, -10.4337, -26.7572, -64.963196, -10.4337, -26.7572, -64.963196, -10.4337, -23.412498, -64.963196, -10.4337, -23.412498, -62.057194, -10.4337, -23.412498, -62.057194, -10.4337, -20.174799, -71.2999, -10.4337, -26.7572, -26.7572, -10.4337, -73.7615, -68.2489, -10.4337, -26.7572, -71.2999, -10.4337, -26.7572, -26.7572, -10.4337, -76.6203, -26.7572, -10.4337, -73.7615, -26.7572, -10.4337, -76.6203, -71.2999, -10.4337, -26.7572, -26.7572, -10.4337, -79.0804, -26.7572, -10.4337, -79.0804, -71.2999, -10.4337, -26.7572, -26.7572, -10.4337, -82.2434, -26.7572, -10.4337, -82.2434, -71.2999, -10.4337, -26.7572, -73.8239, -10.4337, -26.7572, -73.8239, -10.4337, -23.412498, -73.8239, -10.4337, -26.7572, -71.2999, -10.4337, -26.7572, -68.2489, -10.4337, -26.7572, -64.963196, -10.4337, -23.412498, -68.2489, -10.4337, -23.412498, -71.2999, -10.4337, -26.7572, -68.2489, -10.4337, -26.7572, -68.2489, -10.4337, -23.412498, -73.8239, -10.4337, -23.412498, -71.2999, -10.4337, -26.7572, -71.2999, -10.4337, -23.412498, -71.2999, -10.4337, -26.7572, -68.2489, -10.4337, -23.412498, -71.2999, -10.4337, -23.412498, -73.8239, -10.4337, -20.0679, -73.8239, -10.4337, -23.412498, -71.2999, -10.4337, -23.412498, -73.8239, -10.4337, -20.0679, -71.2999, -10.4337, -23.412498, -71.2999, -10.4337, -20.0908, -71.2999, -10.4337, -23.412498, -68.2489, -10.4337, -20.118599, -71.2999, -10.4337, -20.0908, -71.2999, -10.4337, -23.412498, -68.2489, -10.4337, -23.412498, -68.2489, -10.4337, -20.118599, -71.2999, -10.4337, -20.0908, -68.2489, -10.4337, -20.118599, -68.2489, -10.4337, -16.7739, -68.2489, -10.4337, -20.118599, -64.963196, -10.4337, -16.803799, -68.2489, -10.4337, -16.7739, -68.2489, -10.4337, -23.412498, -64.963196, -10.4337, -20.1484, -68.2489, -10.4337, -20.118599, -68.2489, -10.4337, -20.118599, -64.963196, -10.4337, -20.1484, -64.963196, -10.4337, -16.803799, -68.2489, -10.4337, -23.412498, -64.963196, -10.4337, -23.412498, -64.963196, -10.4337, -20.1484, -62.057194, -10.4337, -20.174799, -64.963196, -10.4337, -16.803799, -64.963196, -10.4337, -20.1484, -64.963196, -10.4337, -23.412498, -62.057194, -10.4337, -20.174799, -64.963196, -10.4337, -20.1484, -3.3446002, -1.458, -26.7572, -6.6709, -1.7958, -30.683697, -3.3313003, -1.7853999, -30.628498, -3.3446002, -1.458, -26.7572, -6.6893, -1.458, -26.7572, -6.6709, -1.7958, -30.683697, -6.6893, -3.6573, -40.6287, -6.6689, -4.8491, -44.313698, -6.6243997, -3.6573, -40.6287, -6.6689, -4.8491, -44.313698, -3.3446002, -3.6573, -40.6287, -6.6243997, -3.6573, -40.6287, -6.6893, -3.6573, -40.6287, -9.908199, -3.6573, -40.6287, -6.6689, -4.8491, -44.313698, -6.6689, -4.8491, -44.313698, -3.297, -3.6573, -40.6287, -3.3446002, -3.6573, -40.6287, -6.6689, -4.8491, -44.313698, -9.908199, -3.6573, -40.6287, -9.969999, -4.8431, -44.295097, -10.033899, -3.6573, -40.6287, -9.969999, -4.8431, -44.295097, -9.908199, -3.6573, -40.6287, -9.969999, -4.8431, -44.295097, -10.033899, -3.6573, -40.6287, -13.0655, -3.6573, -40.6287, -9.969999, -4.8431, -44.295097, -13.0655, -3.6573, -40.6287, -13.160999, -4.8373, -44.2772, -13.378601, -3.6573, -40.6287, -13.160999, -4.8373, -44.2772, -13.0655, -3.6573, -40.6287, -13.160999, -4.8373, -44.2772, -13.378601, -3.6573, -40.6287, -16.3079, -3.6573, -40.6287, -13.160999, -4.8373, -44.2772, -16.3079, -3.6573, -40.6287, -16.4166, -4.8314, -44.2589, -16.7232, -3.6573, -40.6287, -16.4166, -4.8314, -44.2589, -16.3079, -3.6573, -40.6287, -16.4166, -4.8314, -44.2589, -16.7232, -3.6573, -40.6287, -19.5913, -3.6573, -40.6287, -16.4166, -4.8314, -44.2589, -19.5913, -3.6573, -40.6287, -19.7153, -4.8254, -44.2403, -20.0679, -3.6573, -40.6287, -19.7153, -4.8254, -44.2403, -19.5913, -3.6573, -40.6287, -19.7153, -4.8254, -44.2403, -20.0679, -3.6573, -40.6287, -22.8746, -3.6573, -40.6287, -19.7153, -4.8254, -44.2403, -22.8746, -3.6573, -40.6287, -23.013899, -4.8194, -44.221798, -23.412498, -3.6573, -40.6287, -23.013899, -4.8194, -44.221798, -22.8746, -3.6573, -40.6287, -23.013899, -4.8194, -44.221798, -23.412498, -3.6573, -40.6287, -26.7572, -3.6573, -40.6287, -23.013899, -4.8194, -44.221798, -26.7572, -3.6573, -40.6287, -26.7572, -4.8125997, -44.200798, -26.7572, -4.8125997, -44.200798, -23.1474, -5.9323997, -47.6632, -23.013899, -4.8194, -44.221798, -26.7572, -4.8125997, -44.200798, -26.7572, -5.9270997, -47.646698, -23.1474, -5.9323997, -47.6632, -23.013899, -4.8194, -44.221798, -19.8335, -5.9372997, -47.6783, -19.7153, -4.8254, -44.2403, -23.013899, -4.8194, -44.221798, -23.1474, -5.9323997, -47.6632, -19.8335, -5.9372997, -47.6783, -19.7153, -4.8254, -44.2403, -19.8335, -5.9372997, -47.6783, -16.5194, -5.9421997, -47.6935, -19.7153, -4.8254, -44.2403, -16.5194, -5.9421997, -47.6935, -16.4166, -4.8314, -44.2589, -26.7572, -5.9270997, -47.646698, -23.2876, -7.1015997, -51.2782, -23.1474, -5.9323997, -47.6632, -26.7572, -5.9270997, -47.646698, -26.7572, -7.1011, -51.2768, -23.2876, -7.1015997, -51.2782, -26.7572, -7.1011, -51.2768, -23.412498, -8.1437, -54.500298, -23.2876, -7.1015997, -51.2782, -26.7572, -7.1011, -51.2768, -26.7572, -8.1437, -54.500298, -23.412498, -8.1437, -54.500298, -23.2876, -7.1015997, -51.2782, -23.412498, -8.1437, -54.500298, -20.0679, -8.1437, -54.500298, -23.1474, -5.9323997, -47.6632, -23.2876, -7.1015997, -51.2782, -19.9572, -7.1019998, -51.2795, -23.2876, -7.1015997, -51.2782, -20.0679, -8.1437, -54.500298, -19.9572, -7.1019998, -51.2795, -23.1474, -5.9323997, -47.6632, -19.9572, -7.1019998, -51.2795, -19.8335, -5.9372997, -47.6783, -19.9572, -7.1019998, -51.2795, -20.0679, -8.1437, -54.500298, -16.7232, -8.1437, -54.500298, -19.8335, -5.9372997, -47.6783, -19.9572, -7.1019998, -51.2795, -16.626799, -7.1024, -51.2808, -19.9572, -7.1019998, -51.2795, -16.7232, -8.1437, -54.500298, -16.626799, -7.1024, -51.2808, -19.8335, -5.9372997, -47.6783, -16.626799, -7.1024, -51.2808, -16.5194, -5.9421997, -47.6935, -16.626799, -7.1024, -51.2808, -16.7232, -8.1437, -54.500298, -13.4286, -8.1437, -54.500298, -16.5194, -5.9421997, -47.6935, -16.626799, -7.1024, -51.2808, -13.344299, -7.1029, -51.282097, -16.626799, -7.1024, -51.2808, -13.4286, -8.1437, -54.500298, -13.344299, -7.1029, -51.282097, -16.5194, -5.9421997, -47.6935, -13.344299, -7.1029, -51.282097, -13.250801, -5.947, -47.708397, -16.4166, -4.8314, -44.2589, -16.5194, -5.9421997, -47.6935, -13.250801, -5.947, -47.708397, -16.4166, -4.8314, -44.2589, -13.250801, -5.947, -47.708397, -13.160999, -4.8373, -44.2772, -13.4286, -8.1437, -54.500298, -10.0877, -7.1032996, -51.283398, -13.344299, -7.1029, -51.282097, -13.250801, -5.947, -47.708397, -13.344299, -7.1029, -51.282097, -10.0877, -7.1032996, -51.283398, -10.0877, -7.1032996, -51.283398, -13.4286, -8.1437, -54.500298, -13.378601, -8.1437, -54.500298, -10.0877, -7.1032996, -51.283398, -13.378601, -8.1437, -54.500298, -10.141901, -8.1437, -54.500298, -13.160999, -4.8373, -44.2772, -13.250801, -5.947, -47.708397, -10.0277, -5.9518, -47.723198, -13.250801, -5.947, -47.708397, -10.0877, -7.1032996, -51.283398, -10.0277, -5.9518, -47.723198, -13.160999, -4.8373, -44.2772, -10.0277, -5.9518, -47.723198, -9.969999, -4.8431, -44.295097, -10.141901, -8.1437, -54.500298, -6.7531, -7.1036997, -51.284798, -10.0877, -7.1032996, -51.283398, -10.0277, -5.9518, -47.723198, -10.0877, -7.1032996, -51.283398, -6.7531, -7.1036997, -51.284798, -6.7531, -7.1036997, -51.284798, -10.141901, -8.1437, -54.500298, -10.033899, -8.1437, -54.500298, -6.7531, -7.1036997, -51.284798, -10.033899, -8.1437, -54.500298, -6.7919, -8.1437, -54.500298, -6.6893, -8.1437, -54.500298, -6.7531, -7.1036997, -51.284798, -6.7919, -8.1437, -54.500298, -6.7531, -7.1036997, -51.284798, -6.6893, -8.1437, -54.500298, -3.4199996, -8.1437, -54.500298, -9.969999, -4.8431, -44.295097, -10.0277, -5.9518, -47.723198, -6.7102, -5.9567, -47.7383, -10.0277, -5.9518, -47.723198, -6.7531, -7.1036997, -51.284798, -6.7102, -5.9567, -47.7383, -9.969999, -4.8431, -44.295097, -6.7102, -5.9567, -47.7383, -6.6689, -4.8491, -44.313698, -6.7531, -7.1036997, -51.284798, -3.4199996, -8.1437, -54.500298, -3.3915, -7.1040998, -51.2861, -3.3915, -7.1040998, -51.2861, -6.7102, -5.9567, -47.7383, -6.7531, -7.1036997, -51.284798, -3.3446002, -8.1437, -54.500298, -3.3915, -7.1040998, -51.2861, -3.4199996, -8.1437, -54.500298, -3.3915, -7.1040998, -51.2861, -3.3446002, -8.1437, -54.500298, -0.048199892, -8.1437, -54.500298, -3.3915, -7.1040998, -51.2861, -3.3602, -5.9617, -47.753597, -6.7102, -5.9567, -47.7383, -3.3602, -5.9617, -47.753597, -6.6689, -4.8491, -44.313698, -6.7102, -5.9567, -47.7383, -3.3915, -7.1040998, -51.2861, -0.048199892, -8.1437, -54.500298, -0.03699994, -7.1046, -51.2874, -0.03699994, -7.1046, -51.2874, -3.3602, -5.9617, -47.753597, -3.3915, -7.1040998, -51.2861, 0, -8.1437, -54.500298, -0.03699994, -7.1046, -51.2874, -0.048199892, -8.1437, -54.500298, -0.03699994, -7.1046, -51.2874, 0, -8.1437, -54.500298, 3.3446, -8.1437, -54.500298, -3.3602, -5.9617, -47.753597, -3.3298001, -4.8552, -44.3325, -6.6689, -4.8491, -44.313698, -3.297, -3.6573, -40.6287, -6.6689, -4.8491, -44.313698, -3.3298001, -4.8552, -44.3325, -0.03699994, -7.1046, -51.2874, -0.024800062, -5.9666, -47.768898, -3.3602, -5.9617, -47.753597, -0.024800062, -5.9666, -47.768898, -3.3298001, -4.8552, -44.3325, -3.3602, -5.9617, -47.753597, -0.012900114, -4.8612, -44.351097, -3.297, -3.6573, -40.6287, -3.3298001, -4.8552, -44.3325, -0.024800062, -5.9666, -47.768898, -0.012900114, -4.8612, -44.351097, -3.3298001, -4.8552, -44.3325, -0.012900114, -4.8612, -44.351097, 0, -3.6573, -40.6287, -3.297, -3.6573, -40.6287, 3.3446, -7.105, -51.2888, -0.024800062, -5.9666, -47.768898, -0.03699994, -7.1046, -51.2874, -0.03699994, -7.1046, -51.2874, 3.3446, -8.1437, -54.500298, 3.3446, -7.105, -51.2888, 3.3446, -5.9716, -47.7842, -0.012900114, -4.8612, -44.351097, -0.024800062, -5.9666, -47.768898, 3.3446, -7.105, -51.2888, 3.3446, -5.9716, -47.7842, -0.024800062, -5.9666, -47.768898, 3.3446, -4.8673, -44.37, 0, -3.6573, -40.6287, -0.012900114, -4.8612, -44.351097, 3.3446, -5.9716, -47.7842, 3.3446, -4.8673, -44.37, -0.012900114, -4.8612, -44.351097, 3.3446, -4.8673, -44.37, 3.3446, -3.6573, -40.6287, 0, -3.6573, -40.6287, 3.3446, -8.1437, -54.500298, 6.6893, -7.1053996, -51.2901, 3.3446, -7.105, -51.2888, 6.6893, -7.1053996, -51.2901, 3.3446, -5.9716, -47.7842, 3.3446, -7.105, -51.2888, 3.3446, -8.1437, -54.500298, 6.6893, -8.1437, -54.500298, 6.6893, -7.1053996, -51.2901, 6.6893, -5.9765, -47.7995, 3.3446, -4.8673, -44.37, 3.3446, -5.9716, -47.7842, 6.6893, -7.1053996, -51.2901, 6.6893, -5.9765, -47.7995, 3.3446, -5.9716, -47.7842, 6.6893, -4.8733997, -44.388798, 3.3446, -3.6573, -40.6287, 3.3446, -4.8673, -44.37, 6.6893, -5.9765, -47.7995, 6.6893, -4.8733997, -44.388798, 3.3446, -4.8673, -44.37, 6.6893, -4.8733997, -44.388798, 6.6893, -3.6573, -40.6287, 3.3446, -3.6573, -40.6287, 6.6893, -8.1437, -54.500298, 10.033899, -7.1059, -51.291397, 6.6893, -7.1053996, -51.2901, 10.033899, -7.1059, -51.291397, 6.6893, -5.9765, -47.7995, 6.6893, -7.1053996, -51.2901, 6.6893, -8.1437, -54.500298, 10.033899, -8.1437, -54.500298, 10.033899, -7.1059, -51.291397, 13.378599, -8.1437, -54.500298, 10.033899, -7.1059, -51.291397, 10.033899, -8.1437, -54.500298, 10.033899, -7.1059, -51.291397, 13.378599, -8.1437, -54.500298, 13.444599, -8.1437, -54.500298, 10.033899, -4.8795, -44.4076, 6.6893, -3.6573, -40.6287, 6.6893, -4.8733997, -44.388798, 10.033899, -5.9814, -47.8148, 6.6893, -4.8733997, -44.388798, 6.6893, -5.9765, -47.7995, 10.033899, -7.1059, -51.291397, 10.033899, -5.9814, -47.8148, 6.6893, -5.9765, -47.7995, 10.033899, -5.9814, -47.8148, 10.033899, -4.8795, -44.4076, 6.6893, -4.8733997, -44.388798, 10.033899, -7.1059, -51.291397, 13.444599, -8.1437, -54.500298, 13.429298, -7.1063, -51.292797, 13.429298, -7.1063, -51.292797, 10.033899, -5.9814, -47.8148, 10.033899, -7.1059, -51.291397, 10.033899, -4.8795, -44.4076, 10.033899, -3.6573, -40.6287, 6.6893, -3.6573, -40.6287, 16.7232, -8.1437, -54.500298, 13.429298, -7.1063, -51.292797, 13.444599, -8.1437, -54.500298, 13.429298, -7.1063, -51.292797, 16.7232, -8.1437, -54.500298, 16.8188, -8.1437, -54.500298, 13.412899, -5.9863997, -47.8302, 10.033899, -4.8795, -44.4076, 10.033899, -5.9814, -47.8148, 13.429298, -7.1063, -51.292797, 13.412899, -5.9863997, -47.8302, 10.033899, -5.9814, -47.8148, 13.3967, -4.8856, -44.4265, 10.033899, -3.6573, -40.6287, 10.033899, -4.8795, -44.4076, 13.412899, -5.9863997, -47.8302, 13.3967, -4.8856, -44.4265, 10.033899, -4.8795, -44.4076, 13.3967, -4.8856, -44.4265, 13.378599, -3.6573, -40.6287, 10.033899, -3.6573, -40.6287, 13.429298, -7.1063, -51.292797, 16.8188, -8.1437, -54.500298, 16.7967, -7.1067, -51.294098, 16.7967, -7.1067, -51.294098, 13.412899, -5.9863997, -47.8302, 13.429298, -7.1063, -51.292797, 20.0679, -8.1437, -54.500298, 16.7967, -7.1067, -51.294098, 16.8188, -8.1437, -54.500298, 16.7967, -7.1067, -51.294098, 20.0679, -8.1437, -54.500298, 20.1975, -8.1437, -54.500298, 16.7967, -7.1067, -51.294098, 20.1975, -8.1437, -54.500298, 20.1675, -7.1071997, -51.295498, 16.7967, -7.1067, -51.294098, 16.772999, -5.9914, -47.8456, 13.412899, -5.9863997, -47.8302, 20.1675, -7.1071997, -51.295498, 16.772999, -5.9914, -47.8456, 16.7967, -7.1067, -51.294098, 16.772999, -5.9914, -47.8456, 13.3967, -4.8856, -44.4265, 13.412899, -5.9863997, -47.8302, 20.1675, -7.1071997, -51.295498, 20.135399, -5.9964, -47.861, 16.772999, -5.9914, -47.8456, 16.7495, -4.8917, -44.445297, 13.378599, -3.6573, -40.6287, 13.3967, -4.8856, -44.4265, 16.772999, -5.9914, -47.8456, 16.7495, -4.8917, -44.445297, 13.3967, -4.8856, -44.4265, 20.135399, -5.9964, -47.861, 16.7495, -4.8917, -44.445297, 16.772999, -5.9914, -47.8456, 16.7495, -4.8917, -44.445297, 16.7232, -3.6573, -40.6287, 13.378599, -3.6573, -40.6287, 20.135399, -5.9964, -47.861, 20.103699, -4.8978, -44.4642, 16.7495, -4.8917, -44.445297, 20.103699, -4.8978, -44.4642, 16.7232, -3.6573, -40.6287, 16.7495, -4.8917, -44.445297, 20.103699, -4.8978, -44.4642, 20.0679, -3.6573, -40.6287, 16.7232, -3.6573, -40.6287, 16.7232, 0, 10.033899, 17.4912, 0.0034999999, 7.4080997, 20.0679, 0, 10.033899, 12.824999, 2.8544, 7.9234, 11.2783985, 2.1174998, 3.3446, 12.705599, 1.0321, 4.0927, 12.824999, 2.8544, 7.9234, 11.173899, 3.3332, 6.6554, 11.2783985, 2.1174998, 3.3446, 10.033899, 3.1929998, 0, 13.249599, 2.9931998, -3.4737, 11.278099, 2.3706, 0, 10.033899, 3.1929998, 0, 10.033899, 3.2212, -2.2307, 13.249599, 2.9931998, -3.4737, 20.613499, 1.0832, -3.1922002, 22.5396, -0.014599999, -3.3446002, 20.5402, -0.0411, -1.7683, 20.613499, 1.0832, -3.1922002, 21.09, -0.0218, -4.9179, 22.5396, -0.014599999, -3.3446002, 15.485399, 1.0792, -1.6708999, 14.217899, 2.8779, -3.3838, 15.6619, 2.2603, -2.7998996, 20.613499, 1.0832, -3.1922002, 15.485399, 1.0792, -1.6708999, 15.6619, 2.2603, -2.7998996, 20.613499, 1.0832, -3.1922002, 20.5402, -0.0411, -1.7683, 15.485399, 1.0792, -1.6708999, 20.5402, -0.0411, -1.7683, 23.412498, 0, 0, 20.2292, 0.030499998, -0.05219996, 23.412498, 0, 0, 20.5402, -0.0411, -1.7683, 22.5396, -0.014599999, -3.3446002, 23.412498, 0, 0, 22.5396, -0.014599999, -3.3446002, 23.412498, 0, -3.3446002, 21.09, -0.0218, -4.9179, 23.412498, 0, -6.6893, 22.5396, -0.014599999, -3.3446002, 21.09, -0.0218, -4.9179, 21.2349, 0, -6.6893, 23.412498, 0, -6.6893, 15.485399, 1.0792, -1.6708999, 20.2292, 0.030499998, -0.05219996, 14.261799, 0.9069, 1.1807, 14.217899, 2.8779, -3.3838, 11.278099, 2.3706, 0, 13.249599, 2.9931998, -3.4737, 11.278099, 2.3706, 0, 14.217899, 2.8779, -3.3838, 15.485399, 1.0792, -1.6708999, 11.278099, 2.3706, 0, 15.485399, 1.0792, -1.6708999, 14.261799, 0.9069, 1.1807, 15.485399, 1.0792, -1.6708999, 20.5402, -0.0411, -1.7683, 20.2292, 0.030499998, -0.05219996, 10.033899, 3.3913999, 4.2546997, 11.2783985, 2.1174998, 3.3446, 11.173899, 3.3332, 6.6554, 10.033899, 3.3913999, 4.2546997, 10.033899, 3.1929998, 3.3446, 11.2783985, 2.1174998, 3.3446, 6.6893, 3.3913999, 3.3446, 10.033899, 3.1929998, 3.3446, 10.033899, 3.3913999, 4.2546997, 10.033899, 3.2212, -2.2307, 10.033899, 3.1929998, 0, 6.6893, 3.3913999, 0, 14.0257, 0.0442, 7.3252997, 12.824999, 2.8544, 7.9234, 12.705599, 1.0321, 4.0927, 14.0257, 0.0442, 7.3252997, 13.175798, 2.4743, 8.042, 12.824999, 2.8544, 7.9234, 26.7582, -0.83089995, 6.6893, 26.7582, -1.7623999, 10.033899, 23.412498, -0.35529998, 10.033899, 23.826399, -8.175799, -54.500298, 26.7572, -7.3550997, -51.2602, 23.7466, -7.1323, -51.2931, 23.826399, -8.175799, -54.500298, 26.7572, -8.403, -54.500298, 26.7572, -7.3550997, -51.2602, 26.7572, -7.3550997, -51.2602, 23.6614, -6.0197997, -47.8736, 23.7466, -7.1323, -51.2931, 26.7572, -7.3550997, -51.2602, 26.7572, -6.2504, -47.8447, 23.6614, -6.0197997, -47.8736, 26.7572, -6.2504, -47.8447, 23.577, -4.916, -44.481, 23.6614, -6.0197997, -47.8736, 26.7572, -6.2504, -47.8447, 26.7572, -5.1514, -44.446598, 23.577, -4.916, -44.481, 26.7572, -5.1514, -44.446598, 23.480999, -3.6625998, -40.6287, 23.577, -4.916, -44.481, 26.7572, -5.1514, -44.446598, 26.7572, -3.9166, -40.6287, 23.480999, -3.6625998, -40.6287, 23.808699, -10.464399, -68.371895, 26.7572, -9.876599, -63.426796, 23.8148, -9.6761, -63.593796, 23.808699, -10.464399, -68.371895, 26.7572, -10.693, -68.371895, 26.7572, -9.876599, -63.426796, 26.7572, -9.876599, -63.426796, 23.819199, -9.111899, -60.1742, 23.8148, -9.6761, -63.593796, 26.7572, -9.876599, -63.426796, 26.7572, -9.312699, -60.011097, 23.819199, -9.111899, -60.1742, 26.7572, -9.312699, -60.011097, 23.8225, -8.6786995, -57.548298, 23.819199, -9.111899, -60.1742, 26.7572, -9.312699, -60.011097, 26.7572, -8.881, -57.3956, 23.8225, -8.6786995, -57.548298, 26.7572, -8.881, -57.3956, 23.826399, -8.175799, -54.500298, 23.8225, -8.6786995, -57.548298, 26.7572, -8.881, -57.3956, 26.7572, -8.403, -54.500298, 23.826399, -8.175799, -54.500298, 23.480999, -3.6625998, -40.6287, 26.7572, -3.2101, -37.2077, 23.4646, -2.985, -37.2919, 23.480999, -3.6625998, -40.6287, 26.7572, -3.9166, -40.6287, 26.7572, -3.2101, -37.2077, 23.412498, -8.1437, -54.500298, 20.1675, -7.1071997, -51.295498, 20.1975, -8.1437, -54.500298, 20.1675, -7.1071997, -51.295498, 23.412498, -8.1437, -54.500298, 23.826399, -8.175799, -54.500298, 20.1675, -7.1071997, -51.295498, 23.826399, -8.175799, -54.500298, 23.7466, -7.1323, -51.2931, 23.412498, -10.4337, -68.371895, 20.112099, -9.6529, -63.642, 20.0679, -10.4337, -68.371895, 20.112099, -9.6529, -63.642, 23.412498, -10.4337, -68.371895, 23.808699, -10.464399, -68.371895, 20.112099, -9.6529, -63.642, 23.808699, -10.464399, -68.371895, 23.8148, -9.6761, -63.593796, 23.412498, -3.6573, -40.6287, 20.0679, -2.9615998, -37.315, 20.0679, -3.6573, -40.6287, 20.0679, -2.9615998, -37.315, 23.412498, -3.6573, -40.6287, 23.480999, -3.6625998, -40.6287, 20.0679, -2.9615998, -37.315, 23.480999, -3.6625998, -40.6287, 23.4646, -2.985, -37.2919, 16.7232, -3.6573, -40.6287, 20.0679, -2.9615998, -37.315, 16.7232, -2.9859998, -37.3232, 16.7232, -3.6573, -40.6287, 20.0679, -3.6573, -40.6287, 20.0679, -2.9615998, -37.315, 13.378599, -3.6573, -40.6287, 16.7232, -2.9859998, -37.3232, 13.378599, -2.9889998, -37.3379, 13.378599, -3.6573, -40.6287, 16.7232, -3.6573, -40.6287, 16.7232, -2.9859998, -37.3232, 16.7232, -2.9859998, -37.3232, 13.378599, -2.3234, -34.0607, 13.378599, -2.9889998, -37.3379, 16.7232, -2.9859998, -37.3232, 16.7232, -2.3191, -34.0398, 13.378599, -2.3234, -34.0607, 16.7232, -2.3191, -34.0398, 13.378599, -1.582, -30.410397, 13.378599, -2.3234, -34.0607, 16.7232, -2.3191, -34.0398, 16.7232, -1.5709, -30.3554, 13.378599, -1.582, -30.410397, 10.033899, -3.6573, -40.6287, 13.378599, -2.9889998, -37.3379, 10.033899, -2.9973998, -37.350998, 10.033899, -3.6573, -40.6287, 13.378599, -3.6573, -40.6287, 13.378599, -2.9889998, -37.3379, 6.6893, -3.6573, -40.6287, 10.033899, -2.9973998, -37.350998, 6.6893, -3.0333998, -37.355698, 6.6893, -3.6573, -40.6287, 10.033899, -3.6573, -40.6287, 10.033899, -2.9973998, -37.350998, 3.3446, -3.6573, -40.6287, 6.6893, -3.0333998, -37.355698, 3.3446, -3.0307, -37.3722, 3.3446, -3.6573, -40.6287, 6.6893, -3.6573, -40.6287, 6.6893, -3.0333998, -37.355698, 0, -3.6573, -40.6287, 3.3446, -3.0307, -37.3722, 0, -3.0496, -37.3821, 0, -3.6573, -40.6287, 3.3446, -3.6573, -40.6287, 3.3446, -3.0307, -37.3722, -3.297, -3.6573, -40.6287, 0, -3.0496, -37.3821, -3.3081002, -3.0523, -37.396698, -3.297, -3.6573, -40.6287, 0, -3.6573, -40.6287, 0, -3.0496, -37.3821, -3.3081002, -3.0523, -37.396698, -3.3446002, -3.6573, -40.6287, -3.297, -3.6573, -40.6287, -3.3081002, -3.0523, -37.396698, -6.6243997, -3.6573, -40.6287, -3.3446002, -3.6573, -40.6287, -6.6243997, -3.6573, -40.6287, -3.3081002, -3.0523, -37.396698, -6.6394, -3.0551, -37.4115, -6.6547, -2.4452, -34.1534, -6.6394, -3.0551, -37.4115, -3.3081002, -3.0523, -37.396698, 0, -3.0496, -37.3821, -3.3193002, -2.4413, -34.1324, -3.3081002, -3.0523, -37.396698, -6.6547, -2.4452, -34.1534, -3.3081002, -3.0523, -37.396698, -3.3193002, -2.4413, -34.1324, -6.6709, -1.7958, -30.683697, -6.6547, -2.4452, -34.1534, -3.3193002, -2.4413, -34.1324, 0, -3.0496, -37.3821, 0, -2.4373999, -34.1115, -3.3193002, -2.4413, -34.1324, -6.6709, -1.7958, -30.683697, -3.3193002, -2.4413, -34.1324, -3.3313003, -1.7853999, -30.628498, 0, -2.4373999, -34.1115, -3.3313003, -1.7853999, -30.628498, -3.3193002, -2.4413, -34.1324, 0, -2.4373999, -34.1115, 0, -1.7751, -30.573498, -3.3313003, -1.7853999, -30.628498, -6.6893, -1.458, -26.7572, -9.9988, -2.089, -30.630497, -6.6709, -1.7958, -30.683697, -6.6893, -1.458, -26.7572, -10.033899, -1.8786, -26.7572, -9.9988, -2.089, -30.630497, -10.033899, -1.8786, -26.7572, -13.297701, -2.9966, -30.341599, -9.9988, -2.089, -30.630497, -10.033899, -1.8786, -26.7572, -13.378601, -2.7663999, -26.7572, -13.297701, -2.9966, -30.341599, -13.378601, -2.7663999, -26.7572, -16.6169, -3.2373998, -30.3083, -13.297701, -2.9966, -30.341599, -13.378601, -2.7663999, -26.7572, -16.7232, -3.0929, -26.7572, -16.6169, -3.2373998, -30.3083, -16.7232, -3.0929, -26.7572, -19.9439, -3.2396998, -30.366299, -16.6169, -3.2373998, -30.3083, -19.9439, -3.2396998, -30.366299, -16.5094, -3.3834999, -33.898598, -16.6169, -3.2373998, -30.3083, -16.7232, -3.0929, -26.7572, -20.0679, -3.0929, -26.7572, -19.9439, -3.2396998, -30.366299, -19.9439, -3.2396998, -30.366299, -19.8217, -3.3844, -33.920498, -16.5094, -3.3834999, -33.898598, -20.0679, -3.0929, -26.7572, -23.2703, -3.2421, -30.424297, -19.9439, -3.2396998, -30.366299, -23.2703, -3.2421, -30.424297, -19.8217, -3.3844, -33.920498, -19.9439, -3.2396998, -30.366299, -20.0679, -3.0929, -26.7572, -23.412498, -3.0929, -26.7572, -23.2703, -3.2421, -30.424297, -19.8217, -3.3844, -33.920498, -16.4072, -3.5224, -37.3144, -16.5094, -3.3834999, -33.898598, -23.412498, -3.0929, -26.7572, -26.7572, -3.2445998, -30.4851, -23.2703, -3.2421, -30.424297, -23.412498, -3.0929, -26.7572, -26.7572, -3.0929, -26.7572, -26.7572, -3.2445998, -30.4851, -26.7572, -3.2445998, -30.4851, -23.1339, -3.3852, -33.942398, -23.2703, -3.2421, -30.424297, -23.2703, -3.2421, -30.424297, -23.1339, -3.3852, -33.942398, -19.8217, -3.3844, -33.920498, -26.7572, -3.2445998, -30.4851, -26.7572, -3.3862, -33.9664, -23.1339, -3.3852, -33.942398, -16.4072, -3.5224, -37.3144, -16.7232, -3.6573, -40.6287, -16.3079, -3.6573, -40.6287, -16.4072, -3.5224, -37.3144, -19.5913, -3.6573, -40.6287, -16.7232, -3.6573, -40.6287, -19.8217, -3.3844, -33.920498, -19.7046, -3.5231, -37.3297, -16.4072, -3.5224, -37.3144, -19.5913, -3.6573, -40.6287, -16.4072, -3.5224, -37.3144, -19.7046, -3.5231, -37.3297, -23.1339, -3.3852, -33.942398, -19.7046, -3.5231, -37.3297, -19.8217, -3.3844, -33.920498, -19.7046, -3.5231, -37.3297, -20.0679, -3.6573, -40.6287, -19.5913, -3.6573, -40.6287, -19.7046, -3.5231, -37.3297, -22.8746, -3.6573, -40.6287, -20.0679, -3.6573, -40.6287, -23.1339, -3.3852, -33.942398, -23.0019, -3.5237, -37.3449, -19.7046, -3.5231, -37.3297, -22.8746, -3.6573, -40.6287, -19.7046, -3.5231, -37.3297, -23.0019, -3.5237, -37.3449, -26.7572, -3.3862, -33.9664, -23.0019, -3.5237, -37.3449, -23.1339, -3.3852, -33.942398, -23.0019, -3.5237, -37.3449, -23.412498, -3.6573, -40.6287, -22.8746, -3.6573, -40.6287, -26.7572, -3.3862, -33.9664, -26.7572, -3.5244, -37.3623, -23.0019, -3.5237, -37.3449, -23.0019, -3.5237, -37.3449, -26.7572, -3.6573, -40.6287, -23.412498, -3.6573, -40.6287, -26.7572, -3.6573, -40.6287, -23.0019, -3.5237, -37.3449, -26.7572, -3.5244, -37.3623, -13.297701, -2.9966, -30.341599, -9.9673, -2.6348999, -34.110798, -9.9988, -2.089, -30.630497, -13.297701, -2.9966, -30.341599, -13.2167, -3.2271, -33.93, -9.9673, -2.6348999, -34.110798, 6.6893, -1.7218, -30.475399, 3.3446, -0.98829997, -26.7572, 3.3446, -1.7156, -30.536999, 6.6893, -1.7218, -30.475399, 6.6893, -1.0129, -26.7572, 3.3446, -0.98829997, -26.7572, 26.7573, -1.7447, -30.111198, 23.412498, -1.1158999, -26.7572, 23.429699, -1.5537, -30.243198, 26.7573, -1.7447, -30.111198, 26.7573, -1.3222, -26.7572, 23.412498, -1.1158999, -26.7572, -9.9988, -2.089, -30.630497, -6.6547, -2.4452, -34.1534, -6.6709, -1.7958, -30.683697, -9.9988, -2.089, -30.630497, -9.9673, -2.6348999, -34.110798, -6.6547, -2.4452, -34.1534, 10.033899, -1.61, -30.458897, 6.6893, -1.0129, -26.7572, 6.6893, -1.7218, -30.475399, 10.033899, -1.61, -30.458897, 10.033899, -0.8648, -26.7572, 6.6893, -1.0129, -26.7572, 3.3446, -1.7156, -30.536999, 0, -1.0608, -26.7572, 0, -1.7751, -30.573498, 3.3446, -1.7156, -30.536999, 3.3446, -0.98829997, -26.7572, 0, -1.0608, -26.7572, 23.429699, -1.5537, -30.243198, 20.0679, -1.1922, -26.7572, 20.0679, -1.4942, -30.325497, 23.429699, -1.5537, -30.243198, 23.412498, -1.1158999, -26.7572, 20.0679, -1.1922, -26.7572, 16.7232, -1.5709, -30.3554, 16.7232, -1.3382, -26.7572, 13.378599, -1.582, -30.410397, 13.378599, -1.582, -30.410397, 10.033899, -0.8648, -26.7572, 10.033899, -1.61, -30.458897, 13.378599, -1.582, -30.410397, 13.378599, -0.8401, -26.7572, 10.033899, -0.8648, -26.7572, 0, -1.7751, -30.573498, -3.3446002, -1.458, -26.7572, -3.3313003, -1.7853999, -30.628498, 0, -1.7751, -30.573498, 0, -1.0608, -26.7572, -3.3446002, -1.458, -26.7572, 20.0679, -1.4942, -30.325497, 16.7232, -1.3382, -26.7572, 16.7232, -1.5709, -30.3554, 20.0679, -1.4942, -30.325497, 20.0679, -1.1922, -26.7572, 16.7232, -1.3382, -26.7572, -16.6169, -3.2373998, -30.3083, -13.2167, -3.2271, -33.93, -13.297701, -2.9966, -30.341599, -16.6169, -3.2373998, -30.3083, -16.5094, -3.3834999, -33.898598, -13.2167, -3.2271, -33.93, 6.6893, -2.4083, -34.0766, 3.3446, -1.7156, -30.536999, 3.3446, -2.4013999, -34.1014, 6.6893, -2.4083, -34.0766, 6.6893, -1.7218, -30.475399, 3.3446, -1.7156, -30.536999, 26.7572, -2.5274, -33.9013, 23.429699, -1.5537, -30.243198, 23.4483, -2.3157, -33.9959, 26.7572, -2.5274, -33.9013, 26.7573, -1.7447, -30.111198, 23.429699, -1.5537, -30.243198, 23.4483, -2.3157, -33.9959, 20.0679, -1.4942, -30.325497, 20.0679, -2.2726, -34.0333, 23.4483, -2.3157, -33.9959, 23.429699, -1.5537, -30.243198, 20.0679, -1.4942, -30.325497, -9.9673, -2.6348999, -34.110798, -6.6394, -3.0551, -37.4115, -6.6547, -2.4452, -34.1534, -9.9673, -2.6348999, -34.110798, -9.9375, -3.1504998, -37.3978, -6.6394, -3.0551, -37.4115, 3.3446, -2.4013999, -34.1014, 0, -1.7751, -30.573498, 0, -2.4373999, -34.1115, 3.3446, -2.4013999, -34.1014, 3.3446, -1.7156, -30.536999, 0, -1.7751, -30.573498, -16.5094, -3.3834999, -33.898598, -13.1401005, -3.445, -37.3228, -13.2167, -3.2271, -33.93, -16.5094, -3.3834999, -33.898598, -16.4072, -3.5224, -37.3144, -13.1401005, -3.445, -37.3228, 10.033899, -2.3385, -34.078, 6.6893, -1.7218, -30.475399, 6.6893, -2.4083, -34.0766, 10.033899, -2.3385, -34.078, 10.033899, -1.61, -30.458897, 6.6893, -1.7218, -30.475399, 13.378599, -2.3234, -34.0607, 10.033899, -1.61, -30.458897, 10.033899, -2.3385, -34.078, 13.378599, -2.3234, -34.0607, 13.378599, -1.582, -30.410397, 10.033899, -1.61, -30.458897, 20.0679, -2.2726, -34.0333, 16.7232, -1.5709, -30.3554, 16.7232, -2.3191, -34.0398, 20.0679, -2.2726, -34.0333, 20.0679, -1.4942, -30.325497, 16.7232, -1.5709, -30.3554, -13.2167, -3.2271, -33.93, -9.9375, -3.1504998, -37.3978, -9.9673, -2.6348999, -34.110798, -13.2167, -3.2271, -33.93, -13.1401005, -3.445, -37.3228, -9.9375, -3.1504998, -37.3978, -16.3079, -3.6573, -40.6287, -13.1401005, -3.445, -37.3228, -16.4072, -3.5224, -37.3144, -13.1401005, -3.445, -37.3228, -16.3079, -3.6573, -40.6287, -13.378601, -3.6573, -40.6287, -13.1401005, -3.445, -37.3228, -13.378601, -3.6573, -40.6287, -13.0655, -3.6573, -40.6287, -13.0655, -3.6573, -40.6287, -9.9375, -3.1504998, -37.3978, -13.1401005, -3.445, -37.3228, -9.9375, -3.1504998, -37.3978, -13.0655, -3.6573, -40.6287, -10.033899, -3.6573, -40.6287, -9.9375, -3.1504998, -37.3978, -10.033899, -3.6573, -40.6287, -9.908199, -3.6573, -40.6287, 6.6893, -3.0333998, -37.355698, 3.3446, -2.4013999, -34.1014, 3.3446, -3.0307, -37.3722, 6.6893, -3.0333998, -37.355698, 6.6893, -2.4083, -34.0766, 3.3446, -2.4013999, -34.1014, 10.033899, -2.9973998, -37.350998, 6.6893, -2.4083, -34.0766, 6.6893, -3.0333998, -37.355698, 10.033899, -2.9973998, -37.350998, 10.033899, -2.3385, -34.078, 6.6893, -2.4083, -34.0766, 3.3446, -3.0307, -37.3722, 0, -2.4373999, -34.1115, 0, -3.0496, -37.3821, 3.3446, -3.0307, -37.3722, 3.3446, -2.4013999, -34.1014, 0, -2.4373999, -34.1115, 23.4646, -2.985, -37.2919, 20.0679, -2.2726, -34.0333, 20.0679, -2.9615998, -37.315, 23.4646, -2.985, -37.2919, 23.4483, -2.3157, -33.9959, 20.0679, -2.2726, -34.0333, 26.7572, -3.2101, -37.2077, 23.4483, -2.3157, -33.9959, 23.4646, -2.985, -37.2919, 26.7572, -3.2101, -37.2077, 26.7572, -2.5274, -33.9013, 23.4483, -2.3157, -33.9959, 13.378599, -2.9889998, -37.3379, 10.033899, -2.3385, -34.078, 10.033899, -2.9973998, -37.350998, 13.378599, -2.9889998, -37.3379, 13.378599, -2.3234, -34.0607, 10.033899, -2.3385, -34.078, 20.0679, -2.9615998, -37.315, 16.7232, -2.3191, -34.0398, 16.7232, -2.9859998, -37.3232, 20.0679, -2.9615998, -37.315, 20.0679, -2.2726, -34.0333, 16.7232, -2.3191, -34.0398, -9.908199, -3.6573, -40.6287, -6.6394, -3.0551, -37.4115, -9.9375, -3.1504998, -37.3978, -6.6394, -3.0551, -37.4115, -9.908199, -3.6573, -40.6287, -6.6893, -3.6573, -40.6287, -6.6394, -3.0551, -37.4115, -6.6893, -3.6573, -40.6287, -6.6243997, -3.6573, -40.6287, 23.480999, -3.6625998, -40.6287, 20.103699, -4.8978, -44.4642, 23.577, -4.916, -44.481, 20.103699, -4.8978, -44.4642, 23.480999, -3.6625998, -40.6287, 23.412498, -3.6573, -40.6287, 20.103699, -4.8978, -44.4642, 23.412498, -3.6573, -40.6287, 20.0679, -3.6573, -40.6287, 23.6614, -6.0197997, -47.8736, 20.103699, -4.8978, -44.4642, 20.135399, -5.9964, -47.861, 23.6614, -6.0197997, -47.8736, 23.577, -4.916, -44.481, 20.103699, -4.8978, -44.4642, 23.7466, -7.1323, -51.2931, 20.135399, -5.9964, -47.861, 20.1675, -7.1071997, -51.295498, 23.7466, -7.1323, -51.2931, 23.6614, -6.0197997, -47.8736, 20.135399, -5.9964, -47.861, 23.826399, -8.175799, -54.500298, 20.1689, -8.6489, -57.5607, 23.8225, -8.6786995, -57.548298, 20.1689, -8.6489, -57.5607, 23.826399, -8.175799, -54.500298, 23.412498, -8.1437, -54.500298, 20.1689, -8.6489, -57.5607, 23.412498, -8.1437, -54.500298, 20.1975, -8.1437, -54.500298, 23.819199, -9.111899, -60.1742, 20.1689, -8.6489, -57.5607, 20.1442, -9.085899, -60.207497, 23.819199, -9.111899, -60.1742, 23.8225, -8.6786995, -57.548298, 20.1689, -8.6489, -57.5607, 23.8148, -9.6761, -63.593796, 20.1442, -9.085899, -60.207497, 20.112099, -9.6529, -63.642, 23.8148, -9.6761, -63.593796, 23.819199, -9.111899, -60.1742, 20.1442, -9.085899, -60.207497, -26.7572, -10.4337, -70.9319, -23.4177, -10.4499, -73.721596, -23.4177, -10.4499, -70.8944, -23.4177, -10.4499, -73.721596, -20.0768, -10.466, -70.856895, -23.4177, -10.4499, -70.8944, -26.7572, -10.4337, -70.9319, -26.7572, -10.4337, -73.7615, -23.4177, -10.4499, -73.721596, -23.4177, -10.4499, -73.721596, -20.0768, -10.466, -73.6818, -20.0768, -10.466, -70.856895, -20.0768, -10.466, -73.6818, -16.734499, -10.4822, -70.8193, -20.0768, -10.466, -70.856895, -26.7572, -10.4337, -73.7615, -23.4177, -10.4499, -76.5937, -23.4177, -10.4499, -73.721596, -23.4177, -10.4499, -76.5937, -20.0768, -10.466, -73.6818, -23.4177, -10.4499, -73.721596, -26.7572, -10.4337, -73.7615, -26.7572, -10.4337, -76.6203, -23.4177, -10.4499, -76.5937, -26.7572, -10.4337, -76.6203, -23.4177, -10.4499, -79.1102, -23.4177, -10.4499, -76.5937, -26.7572, -10.4337, -76.6203, -26.7572, -10.4337, -79.0804, -23.4177, -10.4499, -79.1102, -23.4177, -10.4499, -79.1102, -20.0768, -10.466, -76.567, -23.4177, -10.4499, -76.5937, -23.4177, -10.4499, -76.5937, -20.0768, -10.466, -76.567, -20.0768, -10.466, -73.6818, -23.4177, -10.4499, -79.1102, -20.0768, -10.466, -79.14, -20.0768, -10.466, -76.567, -20.0768, -10.466, -73.6818, -16.734499, -10.4822, -73.6419, -16.734499, -10.4822, -70.8193, -20.0768, -10.466, -76.567, -16.734499, -10.4822, -73.6419, -20.0768, -10.466, -73.6818, -16.734499, -10.4822, -73.6419, -13.3908, -10.4984, -70.7818, -16.734499, -10.4822, -70.8193, -20.0768, -10.466, -79.14, -16.734499, -10.4822, -76.5403, -20.0768, -10.466, -76.567, -20.0768, -10.466, -76.567, -16.734499, -10.4822, -76.5403, -16.734499, -10.4822, -73.6419, -20.0768, -10.466, -79.14, -16.734499, -10.4822, -79.1699, -16.734499, -10.4822, -76.5403, -16.734499, -10.4822, -73.6419, -13.3909, -10.4984, -73.602, -13.3908, -10.4984, -70.7818, -16.734499, -10.4822, -76.5403, -13.3909, -10.4984, -73.602, -16.734499, -10.4822, -73.6419, -13.3909, -10.4984, -73.602, -10.045801, -10.5146, -70.7442, -13.3908, -10.4984, -70.7818, -16.734499, -10.4822, -79.1699, -13.3909, -10.4984, -76.513596, -16.734499, -10.4822, -76.5403, -16.734499, -10.4822, -76.5403, -13.3909, -10.4984, -76.513596, -13.3909, -10.4984, -73.602, -16.734499, -10.4822, -79.1699, -13.3909, -10.4984, -79.1997, -13.3909, -10.4984, -76.513596, -13.3909, -10.4984, -73.602, -10.045801, -10.5146, -73.562195, -10.045801, -10.5146, -70.7442, -13.3909, -10.4984, -76.513596, -10.045801, -10.5146, -73.562195, -13.3909, -10.4984, -73.602, -10.045801, -10.5146, -73.562195, -6.6993003, -10.5309, -70.7066, -10.045801, -10.5146, -70.7442, -13.3909, -10.4984, -79.1997, -10.045801, -10.5146, -76.4869, -13.3909, -10.4984, -76.513596, -13.3909, -10.4984, -76.513596, -10.045801, -10.5146, -76.4869, -10.045801, -10.5146, -73.562195, -13.3909, -10.4984, -79.1997, -10.045801, -10.5146, -79.2295, -10.045801, -10.5146, -76.4869, -10.045801, -10.5146, -73.562195, -6.6993003, -10.5309, -73.5222, -6.6993003, -10.5309, -70.7066, -10.045801, -10.5146, -76.4869, -6.6993003, -10.5309, -73.5222, -10.045801, -10.5146, -73.562195, -6.6993003, -10.5309, -73.5222, -3.3514, -10.5471, -70.669, -6.6993003, -10.5309, -70.7066, -10.045801, -10.5146, -79.2295, -6.6993003, -10.5309, -76.4602, -10.045801, -10.5146, -76.4869, -10.045801, -10.5146, -76.4869, -6.6993003, -10.5309, -76.4602, -6.6993003, -10.5309, -73.5222, -10.045801, -10.5146, -79.2295, -6.6993003, -10.5309, -79.2594, -6.6993003, -10.5309, -76.4602, -6.6993003, -10.5309, -73.5222, -3.3514, -10.5471, -73.4823, -3.3514, -10.5471, -70.669, -6.6993003, -10.5309, -76.4602, -3.3514, -10.5471, -73.4823, -6.6993003, -10.5309, -73.5222, -3.3514, -10.5471, -73.4823, -0.0020999908, -10.5633, -70.6314, -3.3514, -10.5471, -70.669, -6.6993003, -10.5309, -79.2594, -3.3514, -10.5471, -76.433395, -6.6993003, -10.5309, -76.4602, -6.6993003, -10.5309, -76.4602, -3.3514, -10.5471, -76.433395, -3.3514, -10.5471, -73.4823, -6.6993003, -10.5309, -79.2594, -3.3514, -10.5471, -79.2893, -3.3514, -10.5471, -76.433395, -3.3514, -10.5471, -73.4823, -0.0020999908, -10.5633, -73.4424, -0.0020999908, -10.5633, -70.6314, -3.3514, -10.5471, -76.433395, -0.0020999908, -10.5633, -73.4424, -3.3514, -10.5471, -73.4823, -0.0020999908, -10.5633, -73.4424, 3.3486998, -10.579599, -70.5937, -0.0020999908, -10.5633, -70.6314, -3.3514, -10.5471, -79.2893, -0.0020999908, -10.5633, -76.4067, -3.3514, -10.5471, -76.433395, -3.3514, -10.5471, -76.433395, -0.0020999908, -10.5633, -76.4067, -0.0020999908, -10.5633, -73.4424, -3.3514, -10.5471, -79.2893, -0.0020999908, -10.5633, -79.3192, -0.0020999908, -10.5633, -76.4067, -0.0020999908, -10.5633, -73.4424, 3.3486998, -10.579599, -73.4024, 3.3486998, -10.579599, -70.5937, -0.0020999908, -10.5633, -76.4067, 3.3486998, -10.579599, -73.4024, -0.0020999908, -10.5633, -73.4424, 3.3486998, -10.579599, -73.4024, 6.7008, -10.595799, -70.5561, 3.3486998, -10.579599, -70.5937, -0.0020999908, -10.5633, -79.3192, 3.3486998, -10.579599, -76.3799, -0.0020999908, -10.5633, -76.4067, -0.0020999908, -10.5633, -76.4067, 3.3486998, -10.579599, -76.3799, 3.3486998, -10.579599, -73.4024, -0.0020999908, -10.5633, -79.3192, 3.3486998, -10.579599, -79.3491, 3.3486998, -10.579599, -76.3799, 3.3486998, -10.579599, -73.4024, 6.7008, -10.595799, -73.3624, 6.7008, -10.595799, -70.5561, 3.3486998, -10.579599, -76.3799, 6.7008, -10.595799, -73.3624, 3.3486998, -10.579599, -73.4024, 6.7008, -10.595799, -73.3624, 10.054299, -10.6119995, -70.518394, 6.7008, -10.595799, -70.5561, 3.3486998, -10.579599, -79.3491, 6.7008, -10.595799, -76.353195, 3.3486998, -10.579599, -76.3799, 3.3486998, -10.579599, -76.3799, 6.7008, -10.595799, -76.353195, 6.7008, -10.595799, -73.3624, 3.3486998, -10.579599, -79.3491, 6.7008, -10.595799, -79.379, 6.7008, -10.595799, -76.353195, 6.7008, -10.595799, -73.3624, 10.054299, -10.6119995, -73.322395, 10.054299, -10.6119995, -70.518394, 6.7008, -10.595799, -76.353195, 10.054299, -10.6119995, -73.322395, 6.7008, -10.595799, -73.3624, 10.054299, -10.6119995, -73.322395, 13.4093, -10.6283, -70.4807, 10.054299, -10.6119995, -70.518394, 6.7008, -10.595799, -79.379, 10.054299, -10.6119995, -76.3264, 6.7008, -10.595799, -76.353195, 6.7008, -10.595799, -76.353195, 10.054299, -10.6119995, -76.3264, 10.054299, -10.6119995, -73.322395, 6.7008, -10.595799, -79.379, 10.054299, -10.6119995, -79.4089, 10.054299, -10.6119995, -76.3264, 10.054299, -10.6119995, -73.322395, 13.4093, -10.6283, -73.282394, 13.4093, -10.6283, -70.4807, 10.054299, -10.6119995, -76.3264, 13.4093, -10.6283, -73.282394, 10.054299, -10.6119995, -73.322395, 13.4093, -10.6283, -73.282394, 16.7656, -10.6446, -70.443, 13.4093, -10.6283, -70.4807, 10.054299, -10.6119995, -79.4089, 13.4093, -10.6283, -76.2996, 10.054299, -10.6119995, -76.3264, 10.054299, -10.6119995, -76.3264, 13.4093, -10.6283, -76.2996, 13.4093, -10.6283, -73.282394, 10.054299, -10.6119995, -79.4089, 13.4093, -10.6283, -79.4388, 13.4093, -10.6283, -76.2996, 13.4093, -10.6283, -73.282394, 16.7656, -10.6446, -73.2424, 16.7656, -10.6446, -70.443, 13.4093, -10.6283, -76.2996, 16.7656, -10.6446, -73.2424, 13.4093, -10.6283, -73.282394, 16.7656, -10.6446, -73.2424, 20.1234, -10.6608, -70.4053, 16.7656, -10.6446, -70.443, 13.4093, -10.6283, -79.4388, 16.7656, -10.6446, -76.2728, 13.4093, -10.6283, -76.2996, 13.4093, -10.6283, -76.2996, 16.7656, -10.6446, -76.2728, 16.7656, -10.6446, -73.2424, 13.4093, -10.6283, -79.4388, 16.7656, -10.6446, -79.468796, 16.7656, -10.6446, -76.2728, 16.7656, -10.6446, -73.2424, 20.1234, -10.6608, -73.2023, 20.1234, -10.6608, -70.4053, 16.7656, -10.6446, -76.2728, 20.1234, -10.6608, -73.2023, 16.7656, -10.6446, -73.2424, 20.1234, -10.6608, -73.2023, 23.812, -10.6786995, -70.3639, 20.1234, -10.6608, -70.4053, 16.7656, -10.6446, -79.468796, 20.1234, -10.6608, -76.245995, 16.7656, -10.6446, -76.2728, 16.7656, -10.6446, -76.2728, 20.1234, -10.6608, -76.245995, 20.1234, -10.6608, -73.2023, 16.7656, -10.6446, -79.468796, 20.1234, -10.6608, -79.498695, 20.1234, -10.6608, -76.245995, 20.1234, -10.6608, -73.2023, 23.7337, -10.6783, -73.1593, 23.812, -10.6786995, -70.3639, 20.1234, -10.6608, -76.245995, 23.7337, -10.6783, -73.1593, 20.1234, -10.6608, -73.2023, 23.7337, -10.6783, -73.1593, 26.7572, -10.693, -70.330795, 23.812, -10.6786995, -70.3639, 23.7337, -10.6783, -73.1593, 26.7572, -10.693, -73.1232, 26.7572, -10.693, -70.330795, 20.1234, -10.6608, -76.245995, 23.6481, -10.677899, -76.2178, 23.7337, -10.6783, -73.1593, 23.6481, -10.677899, -76.2178, 26.7572, -10.693, -73.1232, 23.7337, -10.6783, -73.1593, 20.1234, -10.6608, -79.498695, 23.6481, -10.677899, -76.2178, 20.1234, -10.6608, -76.245995, 23.6481, -10.677899, -76.2178, 26.7572, -10.693, -76.193, 26.7572, -10.693, -73.1232, 20.1234, -10.6608, -79.498695, 23.555399, -10.6775, -79.529396, 23.6481, -10.677899, -76.2178, 23.555399, -10.6775, -79.529396, 26.7572, -10.693, -76.193, 23.6481, -10.677899, -76.2178, 23.555399, -10.6775, -79.529396, 26.7572, -10.693, -79.5579, 26.7572, -10.693, -76.193, -26.7572, -10.4337, -79.0804, -23.412498, -10.4337, -82.2434, -23.4177, -10.4499, -79.1102, -26.7572, -10.4337, -79.0804, -26.7572, -10.4337, -82.2434, -23.412498, -10.4337, -82.2434, 23.412498, -10.4337, -82.2434, 26.7572, -10.693, -79.5579, 23.555399, -10.6775, -79.529396, 23.412498, -10.4337, -82.2434, 26.7572, -10.693, -82.2434, 26.7572, -10.693, -79.5579, 23.812, -10.6786995, -70.3639, 26.7572, -10.693, -68.371895, 23.808699, -10.464399, -68.371895, 23.812, -10.6786995, -70.3639, 26.7572, -10.693, -70.330795, 26.7572, -10.693, -68.371895, 20.0679, -10.4337, -82.2434, 23.555399, -10.6775, -79.529396, 20.1234, -10.6608, -79.498695, 20.0679, -10.4337, -82.2434, 23.412498, -10.4337, -82.2434, 23.555399, -10.6775, -79.529396, 23.812, -10.6786995, -70.3639, 20.0679, -10.4337, -68.371895, 20.1234, -10.6608, -70.4053, 20.0679, -10.4337, -68.371895, 23.812, -10.6786995, -70.3639, 23.808699, -10.464399, -68.371895, 20.0679, -10.4337, -68.371895, 23.808699, -10.464399, -68.371895, 23.412498, -10.4337, -68.371895, 16.7232, -10.4337, -82.2434, 20.1234, -10.6608, -79.498695, 16.7656, -10.6446, -79.468796, 16.7232, -10.4337, -82.2434, 20.0679, -10.4337, -82.2434, 20.1234, -10.6608, -79.498695, 16.7656, -10.6446, -70.443, 20.0679, -10.4337, -68.371895, 16.7232, -10.4337, -68.371895, 16.7656, -10.6446, -70.443, 20.1234, -10.6608, -70.4053, 20.0679, -10.4337, -68.371895, 13.378599, -10.4337, -82.2434, 16.7656, -10.6446, -79.468796, 13.4093, -10.6283, -79.4388, 13.378599, -10.4337, -82.2434, 16.7232, -10.4337, -82.2434, 16.7656, -10.6446, -79.468796, 13.4093, -10.6283, -70.4807, 16.7232, -10.4337, -68.371895, 13.378599, -10.4337, -68.371895, 13.4093, -10.6283, -70.4807, 16.7656, -10.6446, -70.443, 16.7232, -10.4337, -68.371895, 10.033899, -10.4337, -82.2434, 13.4093, -10.6283, -79.4388, 10.054299, -10.6119995, -79.4089, 10.033899, -10.4337, -82.2434, 13.378599, -10.4337, -82.2434, 13.4093, -10.6283, -79.4388, 10.054299, -10.6119995, -70.518394, 13.378599, -10.4337, -68.371895, 10.033899, -10.4337, -68.371895, 10.054299, -10.6119995, -70.518394, 13.4093, -10.6283, -70.4807, 13.378599, -10.4337, -68.371895, 6.6893, -10.4337, -82.2434, 10.054299, -10.6119995, -79.4089, 6.7008, -10.595799, -79.379, 6.6893, -10.4337, -82.2434, 10.033899, -10.4337, -82.2434, 10.054299, -10.6119995, -79.4089, 6.7008, -10.595799, -70.5561, 10.033899, -10.4337, -68.371895, 6.6893, -10.4337, -68.371895, 6.7008, -10.595799, -70.5561, 10.054299, -10.6119995, -70.518394, 10.033899, -10.4337, -68.371895, 3.3446, -10.4337, -82.2434, 6.7008, -10.595799, -79.379, 3.3486998, -10.579599, -79.3491, 3.3446, -10.4337, -82.2434, 6.6893, -10.4337, -82.2434, 6.7008, -10.595799, -79.379, 3.3486998, -10.579599, -70.5937, 6.6893, -10.4337, -68.371895, 3.3446, -10.4337, -68.371895, 3.3486998, -10.579599, -70.5937, 6.7008, -10.595799, -70.5561, 6.6893, -10.4337, -68.371895, 0, -10.4337, -82.2434, 3.3486998, -10.579599, -79.3491, -0.0020999908, -10.5633, -79.3192, 0, -10.4337, -82.2434, 3.3446, -10.4337, -82.2434, 3.3486998, -10.579599, -79.3491, -0.0020999908, -10.5633, -70.6314, 3.3446, -10.4337, -68.371895, 0, -10.4337, -68.371895, -0.0020999908, -10.5633, -70.6314, 3.3486998, -10.579599, -70.5937, 3.3446, -10.4337, -68.371895, -3.3446002, -10.4337, -82.2434, -0.0020999908, -10.5633, -79.3192, -3.3514, -10.5471, -79.2893, -3.3446002, -10.4337, -82.2434, 0, -10.4337, -82.2434, -0.0020999908, -10.5633, -79.3192, -3.3514, -10.5471, -70.669, -6.6893, -10.4337, -68.371895, -6.6993003, -10.5309, -70.7066, -3.3514, -10.5471, -70.669, -3.3446002, -10.4337, -68.371895, -6.6893, -10.4337, -68.371895, -6.6893, -10.4337, -68.371895, -10.045801, -10.5146, -70.7442, -6.6993003, -10.5309, -70.7066, -6.6893, -10.4337, -68.371895, -10.033899, -10.4337, -68.371895, -10.045801, -10.5146, -70.7442, -6.6893, -10.4337, -82.2434, -3.3514, -10.5471, -79.2893, -6.6993003, -10.5309, -79.2594, -6.6893, -10.4337, -82.2434, -3.3446002, -10.4337, -82.2434, -3.3514, -10.5471, -79.2893, -10.033899, -10.4337, -82.2434, -6.6993003, -10.5309, -79.2594, -10.045801, -10.5146, -79.2295, -10.033899, -10.4337, -82.2434, -6.6893, -10.4337, -82.2434, -6.6993003, -10.5309, -79.2594, -10.033899, -10.4337, -68.371895, -13.3908, -10.4984, -70.7818, -10.045801, -10.5146, -70.7442, -10.033899, -10.4337, -68.371895, -13.378601, -10.4337, -68.371895, -13.3908, -10.4984, -70.7818, -13.378601, -10.4337, -82.2434, -10.045801, -10.5146, -79.2295, -13.3909, -10.4984, -79.1997, -13.378601, -10.4337, -82.2434, -10.033899, -10.4337, -82.2434, -10.045801, -10.5146, -79.2295, -13.378601, -10.4337, -68.371895, -16.734499, -10.4822, -70.8193, -13.3908, -10.4984, -70.7818, -13.378601, -10.4337, -68.371895, -16.7232, -10.4337, -68.371895, -16.734499, -10.4822, -70.8193, -16.7232, -10.4337, -68.371895, -20.0768, -10.466, -70.856895, -16.734499, -10.4822, -70.8193, -16.7232, -10.4337, -68.371895, -20.0679, -10.4337, -68.371895, -20.0768, -10.466, -70.856895, -16.7232, -10.4337, -82.2434, -13.3909, -10.4984, -79.1997, -16.734499, -10.4822, -79.1699, -16.7232, -10.4337, -82.2434, -13.378601, -10.4337, -82.2434, -13.3909, -10.4984, -79.1997, -20.0679, -10.4337, -68.371895, -23.4177, -10.4499, -70.8944, -20.0768, -10.466, -70.856895, -20.0679, -10.4337, -68.371895, -23.412498, -10.4337, -68.371895, -23.4177, -10.4499, -70.8944, -20.0679, -10.4337, -82.2434, -16.734499, -10.4822, -79.1699, -20.0768, -10.466, -79.14, -20.0679, -10.4337, -82.2434, -16.7232, -10.4337, -82.2434, -16.734499, -10.4822, -79.1699, -23.412498, -10.4337, -68.371895, -26.7572, -10.4337, -70.9319, -23.4177, -10.4499, -70.8944, -23.412498, -10.4337, -68.371895, -26.7572, -10.4337, -68.371895, -26.7572, -10.4337, -70.9319, -23.412498, -10.4337, -82.2434, -20.0768, -10.466, -79.14, -23.4177, -10.4499, -79.1102, -23.412498, -10.4337, -82.2434, -20.0679, -10.4337, -82.2434, -20.0768, -10.466, -79.14, 13.378599, -1.0746, 20.0679, 13.378599, -2.2719998, 23.3902, 10.033899, -0.501, 23.412498, 20.0679, -1.0746, 13.378601, 16.7232, -1.0746, 16.7232, 16.7232, -1.0746, 13.378601, 16.7232, -1.0746, 16.7232, 15.0508995, -1.0746, 20.0679, 13.378599, -1.0746, 20.0679, 16.7232, -1.0746, 16.7232, 16.7232, -1.8294, 20.0679, 15.0508995, -1.0746, 20.0679, 23.412498, -0.35529998, 10.033899, 23.412498, -1.8294, 13.378601, 20.0679, -1.0746, 13.378601, 10.501598, 0, 20.5087, 6.6893, 0, 20.0679, 10.080299, 0, 20.0679, 10.501598, 0, 20.5087, 6.6893, -0.2814, 23.412498, 6.6893, 0, 20.0679, -20.0679, 0, 13.378601, -16.7232, 0, 13.868401, -16.7232, -0.26209998, 16.7232, -20.0679, 0, 13.378601, -17.213, 0, 13.378601, -16.7232, 0, 13.868401, -16.7232, -0.26209998, 16.7232, -13.378601, 0, 16.7232, -13.378601, 0, 20.0679, -24.056599, 0, 10.033899, -25.9681, -0.2875, 13.378601, -26.0077, -0.2465, 10.033899, -25.9681, -0.2875, 13.378601, -24.056599, 0, 10.033899, -23.412498, 0, 10.6779995, -25.9681, -0.2875, 13.378601, -23.412498, 0, 10.6779995, -23.412498, 0, 13.378601, -23.8078, 0, 6.6893, -26.0077, -0.2465, 10.033899, -25.945799, -0.25779998, 6.6893, -26.0077, -0.2465, 10.033899, -23.8078, 0, 6.6893, -23.489, 0, 9.386499, -26.0077, -0.2465, 10.033899, -23.489, 0, 9.386499, -24.056599, 0, 10.033899, -25.4212, -0.5907, 16.7232, -23.412498, -0.692, 20.0679, -25.174, -0.7391, 20.0679, -25.479, -0.4588, 0.143, -23.412498, 0, 3.3446, -25.869999, -0.2764, 3.3446, -25.479, -0.4588, 0.143, -23.412498, -0.2913, 0.26119995, -23.412498, 0, 3.3446, -25.869999, -0.2764, 3.3446, -23.8078, 0, 6.6893, -25.945799, -0.25779998, 6.6893, -25.869999, -0.2764, 3.3446, -23.412498, 0, 3.3446, -23.8078, 0, 6.6893, -17.2383, -0.66719997, -19.6364, -20.0679, -0.43429998, -16.7232, -20.0679, -1.7572, -20.0679, -20.0679, -0.43429998, -16.7232, -20.0679, 0, -13.378599, -23.412498, 0, -13.378599, -9.318001, -0.3969, -19.413, -6.6893, -0.9271, -20.0679, -6.6893, 0, -16.7232, -6.6893, 0, -16.7232, -3.3446002, -0.9271, -16.7232, -3.3446002, 0, -13.7127, 16.7232, 0, -20.0679, 20.0679, -0.2837, -20.0679, 20.0679, 0, -16.7232, 13.378599, 0, -23.412498, 16.7232, -0.3105, -23.412498, 16.7232, 0, -20.0679, 20.0679, 0, -16.7232, 23.412498, -0.456, -16.7232, 23.412498, 0, -13.378599, 23.412498, 0, -6.6893, 23.412498, 0, -3.3446002, 22.5396, -0.014599999, -3.3446002, 15.0508995, -0.40039998, 16.7232, 13.378599, 0, 16.7232, 15.0508995, -0.6288, 13.378601, 14.439199, 0, 13.6437, 15.0508995, 0, 10.033899, 15.0508995, -0.6288, 13.378601, 15.0508995, 0, 10.033899, 14.439199, 0, 13.6437, 13.8046, 0, 13.2202, 15.0508995, 0, 10.033899, 13.8046, 0, 13.2202, 13.8046, 0, 10.033899, 3.0140998, 0, -16.7232, 3.3446, -0.3989, -12.9443, 0, 0, -13.378599, -23.412498, -0.692, 20.0679, -25.4212, -0.5907, 16.7232, -23.412498, -0.36479998, 16.7232, -23.412498, -0.692, 20.0679, -20.0679, -0.36479998, 20.0679, -20.0679, -0.5589, 23.412498, -16.7232, -0.36479998, 23.412498, -13.378601, -0.2814, 23.412498, -13.378601, -1.1209999, 26.7572, -20.0679, -0.36479998, 16.7232, -16.7232, -0.26209998, 16.7232, -16.7232, -0.36479998, 20.0679, -16.7232, -0.36479998, 20.0679, -13.378601, 0, 20.0679, -13.378601, -0.2814, 23.412498, -23.412498, -0.7373, 23.412498, -20.0679, -0.5589, 23.412498, -20.0679, -1.1374999, 26.7572, -25.174, -0.7391, 20.0679, -23.412498, -0.692, 20.0679, -23.412498, -0.7373, 23.412498, -20.0679, -0.5589, 23.412498, -16.7232, -0.36479998, 23.412498, -16.7232, -1.1374999, 26.7572, 26.7582, -1.7623999, 10.033899, 26.7582, -1.8294, 13.378601, 23.412498, -1.8294, 13.378601, 13.378599, 0, 16.7232, 14.439199, 0, 13.6437, 15.0508995, -0.6288, 13.378601, 13.378599, 0, 16.7232, 13.700699, 0, 14.602699, 14.439199, 0, 13.6437, 15.0508995, -0.6288, 13.378601, 15.0508995, 0, 10.033899, 16.7232, 0, 10.033899, 15.0508995, -0.40039998, 16.7232, 16.7232, -1.0746, 13.378601, 16.7232, -1.0746, 16.7232, 13.378599, 0, 16.7232, 13.378599, -1.0746, 20.0679, 11.0191, 0, 20.0679, 15.0508995, -0.40039998, 16.7232, 13.378599, -1.0746, 20.0679, 13.378599, 0, 16.7232, 20.0679, -0.2837, -20.0679, 23.412498, -1.0924, -20.0679, 23.412498, -0.456, -16.7232, 26.572199, -0.95549995, -13.659599, 23.412498, 0, -13.378599, 23.412498, -0.456, -16.7232, 13.378599, -0.8401, -26.7572, 16.7232, -1.3382, -26.7572, 16.7232, -0.3105, -23.412498, 16.7232, -0.3105, -23.412498, 20.0679, -0.8222, -23.412498, 20.0679, -0.2837, -20.0679, 16.7232, -1.3382, -26.7572, 13.378599, -0.8401, -26.7572, 13.378599, -1.582, -30.410397, 16.7232, -1.3382, -26.7572, 20.0679, -1.1922, -26.7572, 20.0679, -0.8222, -23.412498, 26.7577, -0.8804, -16.7232, 23.412498, -0.456, -16.7232, 23.412498, -1.0924, -20.0679, 20.0679, -0.8222, -23.412498, 23.412498, -1.0924, -23.412498, 23.412498, -1.0924, -20.0679, 3.3446, -0.3434, -23.412498, 0, -0.9271, -20.0679, 0, -0.9271, -23.412498, -10.033899, -0.9271, -23.412498, -6.6893, -1.3241999, -23.412498, -6.6893, -0.9271, -20.0679, 2.3184, 0, -20.4362, 0, -0.9271, -16.7232, 0, -0.9271, -20.0679, 39.877598, -3.6573, 23.412498, 36.078598, -3.0746999, 26.7572, 36.2121, -2.9357, 23.412498, 39.877598, -3.6573, 23.412498, 39.877598, -3.6573, 26.7572, 36.078598, -3.0746999, 26.7572, 52.997097, -8.1437, 23.412498, 49.5743, -6.9732, 26.7572, 49.5645, -6.9698997, 23.412498, 52.997097, -8.1437, 23.412498, 52.997097, -8.1437, 26.7572, 49.5743, -6.9732, 26.7572, 52.997097, -8.1437, 20.0679, 52.997097, -8.1437, 23.412498, 49.5645, -6.9698997, 23.412498, 49.5743, -6.9732, 26.7572, 46.556797, -5.9413, 23.412498, 49.5645, -6.9698997, 23.412498, 49.5743, -6.9732, 26.7572, 46.577698, -5.9484997, 26.7572, 46.556797, -5.9413, 23.412498, 52.997097, -8.1437, 20.0679, 49.5645, -6.9698997, 23.412498, 49.5547, -6.9665, 20.0679, 52.997097, -8.1437, 16.7232, 52.997097, -8.1437, 20.0679, 49.5547, -6.9665, 20.0679, 52.997097, -8.1437, 16.7232, 49.5547, -6.9665, 20.0679, 49.5449, -6.9631996, 16.7232, 49.5547, -6.9665, 20.0679, 46.5149, -5.927, 16.7232, 49.5449, -6.9631996, 16.7232, 49.5645, -6.9698997, 23.412498, 46.535797, -5.9342, 20.0679, 49.5547, -6.9665, 20.0679, 49.5547, -6.9665, 20.0679, 46.535797, -5.9342, 20.0679, 46.5149, -5.927, 16.7232, 49.5645, -6.9698997, 23.412498, 46.556797, -5.9413, 23.412498, 46.535797, -5.9342, 20.0679, 46.535797, -5.9342, 20.0679, 43.1641, -4.7812, 16.7232, 46.5149, -5.927, 16.7232, 46.535797, -5.9342, 20.0679, 43.1877, -4.7892, 20.0679, 43.1641, -4.7812, 16.7232, 46.556797, -5.9413, 23.412498, 43.1877, -4.7892, 20.0679, 46.535797, -5.9342, 20.0679, 43.1877, -4.7892, 20.0679, 39.877598, -3.6573, 16.7232, 43.1641, -4.7812, 16.7232, 43.1877, -4.7892, 20.0679, 39.877598, -3.6573, 20.0679, 39.877598, -3.6573, 16.7232, 46.556797, -5.9413, 23.412498, 43.2113, -4.7973, 23.412498, 43.1877, -4.7892, 20.0679, 43.2113, -4.7973, 23.412498, 39.877598, -3.6573, 20.0679, 43.1877, -4.7892, 20.0679, 46.577698, -5.9484997, 26.7572, 43.2113, -4.7973, 23.412498, 46.556797, -5.9413, 23.412498, 43.2113, -4.7973, 23.412498, 39.877598, -3.6573, 23.412498, 39.877598, -3.6573, 20.0679, 46.577698, -5.9484997, 26.7572, 43.234898, -4.8054, 26.7572, 43.2113, -4.7973, 23.412498, 43.234898, -4.8054, 26.7572, 39.877598, -3.6573, 23.412498, 43.2113, -4.7973, 23.412498, 43.234898, -4.8054, 26.7572, 39.877598, -3.6573, 26.7572, 39.877598, -3.6573, 23.412498, 39.877598, -3.6573, 20.0679, 36.2121, -2.9357, 23.412498, 36.2075, -2.9348, 20.0679, 39.877598, -3.6573, 20.0679, 39.877598, -3.6573, 23.412498, 36.2121, -2.9357, 23.412498, 39.877598, -3.6573, 16.7232, 39.877598, -3.6573, 20.0679, 36.2075, -2.9348, 20.0679, 39.877598, -3.6573, 16.7232, 36.2075, -2.9348, 20.0679, 36.2028, -2.9338999, 16.7232, 39.877598, -3.7507, 13.378601, 36.2028, -2.9338999, 16.7232, 36.1422, -2.9887998, 13.378601, 39.877598, -3.7507, 13.378601, 39.877598, -3.6573, 16.7232, 36.2028, -2.9338999, 16.7232, 52.997097, -8.1437, 13.378601, 49.5449, -6.9631996, 16.7232, 49.520397, -6.9795, 13.378601, 52.997097, -8.1437, 13.378601, 52.997097, -8.1437, 16.7232, 49.5449, -6.9631996, 16.7232, 39.877598, -3.7507, 10.033899, 36.1422, -2.9887998, 13.378601, 36.153297, -2.972, 10.033899, 39.877598, -3.7507, 10.033899, 39.877598, -3.7507, 13.378601, 36.1422, -2.9887998, 13.378601, 52.997097, -8.1437, 10.033899, 49.520397, -6.9795, 13.378601, 49.510597, -6.9763, 10.033899, 52.997097, -8.1437, 10.033899, 52.997097, -8.1437, 13.378601, 49.520397, -6.9795, 13.378601, 52.997097, -8.1437, 6.6893, 52.997097, -8.1437, 10.033899, 49.510597, -6.9763, 10.033899, 49.520397, -6.9795, 13.378601, 46.4435, -5.9493, 10.033899, 49.510597, -6.9763, 10.033899, 49.520397, -6.9795, 13.378601, 46.4646, -5.9563, 13.378601, 46.4435, -5.9493, 10.033899, 52.997097, -8.1437, 6.6893, 49.510597, -6.9763, 10.033899, 49.500698, -6.973, 6.6893, 52.997097, -8.1437, 3.3446, 52.997097, -8.1437, 6.6893, 49.500698, -6.973, 6.6893, 49.510597, -6.9763, 10.033899, 46.4435, -5.9493, 10.033899, 46.4225, -5.9421997, 6.6893, 49.510597, -6.9763, 10.033899, 46.4225, -5.9421997, 6.6893, 49.500698, -6.973, 6.6893, 46.4646, -5.9563, 13.378601, 43.0695, -4.8195, 10.033899, 46.4435, -5.9493, 10.033899, 46.4646, -5.9563, 13.378601, 43.0932, -4.8275, 13.378601, 43.0695, -4.8195, 10.033899, 43.0932, -4.8275, 13.378601, 39.877598, -3.7507, 10.033899, 43.0695, -4.8195, 10.033899, 43.0932, -4.8275, 13.378601, 39.877598, -3.7507, 13.378601, 39.877598, -3.7507, 10.033899, 43.0695, -4.8195, 10.033899, 39.877598, -3.7507, 10.033899, 39.877598, -3.7507, 6.6893, 46.4435, -5.9493, 10.033899, 43.0695, -4.8195, 10.033899, 43.0458, -4.8115997, 6.6893, 43.0695, -4.8195, 10.033899, 39.877598, -3.7507, 6.6893, 43.0458, -4.8115997, 6.6893, 46.4435, -5.9493, 10.033899, 43.0458, -4.8115997, 6.6893, 46.4225, -5.9421997, 6.6893, 43.0458, -4.8115997, 6.6893, 39.877598, -3.7507, 6.6893, 39.877598, -3.7507, 3.3446, 43.0458, -4.8115997, 6.6893, 39.877598, -3.7507, 3.3446, 43.0221, -4.8036, 3.3446, 46.4225, -5.9421997, 6.6893, 43.0458, -4.8115997, 6.6893, 43.0221, -4.8036, 3.3446, 43.0221, -4.8036, 3.3446, 39.877598, -3.7507, 3.3446, 39.877598, -3.7507, 0, 46.4225, -5.9421997, 6.6893, 43.0221, -4.8036, 3.3446, 46.4015, -5.9351997, 3.3446, 49.500698, -6.973, 6.6893, 46.4225, -5.9421997, 6.6893, 46.4015, -5.9351997, 3.3446, 43.0221, -4.8036, 3.3446, 39.877598, -3.7507, 0, 42.998398, -4.7957, 0, 46.4015, -5.9351997, 3.3446, 43.0221, -4.8036, 3.3446, 42.998398, -4.7957, 0, 42.998398, -4.7957, 0, 39.877598, -3.7507, 0, 39.877598, -3.7507, -3.3446002, 49.500698, -6.973, 6.6893, 46.4015, -5.9351997, 3.3446, 49.4909, -6.9697, 3.3446, 52.997097, -8.1437, 3.3446, 49.500698, -6.973, 6.6893, 49.4909, -6.9697, 3.3446, 52.997097, -8.1437, 0, 52.997097, -8.1437, 3.3446, 49.4909, -6.9697, 3.3446, 49.4909, -6.9697, 3.3446, 46.4015, -5.9351997, 3.3446, 46.380398, -5.9282, 0, 46.4015, -5.9351997, 3.3446, 42.998398, -4.7957, 0, 46.380398, -5.9282, 0, 52.997097, -8.1437, 0, 49.4909, -6.9697, 3.3446, 49.4811, -6.9663997, 0, 49.4909, -6.9697, 3.3446, 46.380398, -5.9282, 0, 49.4811, -6.9663997, 0, 52.997097, -8.1437, -3.3446002, 52.997097, -8.1437, 0, 49.4811, -6.9663997, 0, 42.998398, -4.7957, 0, 39.877598, -3.7507, -3.3446002, 42.974697, -4.7878, -3.3446002, 46.380398, -5.9282, 0, 42.998398, -4.7957, 0, 42.974697, -4.7878, -3.3446002, 42.974697, -4.7878, -3.3446002, 39.877598, -3.7507, -3.3446002, 39.877598, -3.7507, -6.6893, 42.974697, -4.7878, -3.3446002, 39.877598, -3.7507, -6.6893, 42.951, -4.7798, -6.6893, 46.380398, -5.9282, 0, 42.974697, -4.7878, -3.3446002, 46.359398, -5.9210997, -3.3446002, 46.359398, -5.9210997, -3.3446002, 42.974697, -4.7878, -3.3446002, 42.951, -4.7798, -6.6893, 49.4811, -6.9663997, 0, 46.380398, -5.9282, 0, 46.359398, -5.9210997, -3.3446002, 46.359398, -5.9210997, -3.3446002, 42.951, -4.7798, -6.6893, 46.338398, -5.9140997, -6.6893, 52.997097, -8.1437, -3.3446002, 49.4811, -6.9663997, 0, 49.4712, -6.9631, -3.3446002, 49.4811, -6.9663997, 0, 46.359398, -5.9210997, -3.3446002, 49.4712, -6.9631, -3.3446002, 49.4712, -6.9631, -3.3446002, 46.359398, -5.9210997, -3.3446002, 46.338398, -5.9140997, -6.6893, 52.997097, -8.1437, -6.6893, 52.997097, -8.1437, -3.3446002, 49.4712, -6.9631, -3.3446002, 49.4712, -6.9631, -3.3446002, 46.338398, -5.9140997, -6.6893, 49.4614, -6.9598, -6.6893, 52.997097, -8.1437, -6.6893, 49.4712, -6.9631, -3.3446002, 49.4614, -6.9598, -6.6893, 39.877598, -3.7507, 6.6893, 36.153297, -2.972, 10.033899, 36.1898, -2.9299998, 6.6893, 39.877598, -3.7507, 6.6893, 39.877598, -3.7507, 10.033899, 36.153297, -2.972, 10.033899, 39.877598, -3.7507, 3.3446, 36.1898, -2.9299998, 6.6893, 36.2081, -2.9062, 3.3446, 39.877598, -3.7507, 3.3446, 39.877598, -3.7507, 6.6893, 36.1898, -2.9299998, 6.6893, 39.877598, -3.7507, 0, 36.2081, -2.9062, 3.3446, 36.211597, -2.8971, 0, 39.877598, -3.7507, 0, 39.877598, -3.7507, 3.3446, 36.2081, -2.9062, 3.3446, 39.877598, -3.7507, -3.3446002, 36.211597, -2.8971, 0, 36.2533, -2.8497999, -3.3446002, 39.877598, -3.7507, -3.3446002, 39.877598, -3.7507, 0, 36.211597, -2.8971, 0, 39.877598, -3.7507, -6.6893, 36.2533, -2.8497999, -3.3446002, 36.2803, -2.8172998, -6.6893, 39.877598, -3.7507, -6.6893, 39.877598, -3.7507, -3.3446002, 36.2533, -2.8497999, -3.3446002, 52.997097, -8.1437, -10.033899, 49.4614, -6.9598, -6.6893, 49.4666, -6.9364, -10.033899, 52.997097, -8.1437, -10.033899, 52.997097, -8.1437, -6.6893, 49.4614, -6.9598, -6.6893, 39.877598, -3.6573, -10.033899, 36.2803, -2.8172998, -6.6893, 36.3083, -2.7835999, -10.109299, 39.877598, -3.6573, -10.033899, 39.877598, -3.7507, -6.6893, 36.2803, -2.8172998, -6.6893, 39.877598, -3.6573, -13.378599, 36.3083, -2.7835999, -10.109299, 36.1797, -2.9064, -13.456699, 39.877598, -3.6573, -13.378599, 39.877598, -3.6573, -10.033899, 36.3083, -2.7835999, -10.109299, 39.877598, -3.6573, -16.7232, 36.1797, -2.9064, -13.456699, 36.2015, -2.8792, -16.7232, 39.877598, -3.6573, -16.7232, 39.877598, -3.6573, -13.378599, 36.1797, -2.9064, -13.456699, 39.877598, -3.6573, -20.0679, 36.2015, -2.8792, -16.7232, 36.1471, -2.928, -20.0679, 39.877598, -3.6573, -20.0679, 39.877598, -3.6573, -16.7232, 36.2015, -2.8792, -16.7232, 39.877598, -3.6573, -23.412498, 42.8416, -4.6944, -26.7572, 42.881, -4.6844, -23.412498, 39.877598, -3.6573, -23.412498, 39.877598, -3.6808999, -26.7572, 42.8416, -4.6944, -26.7572, 42.8416, -4.6944, -26.7572, 46.2636, -5.8410997, -23.412498, 42.881, -4.6844, -23.412498, 42.8416, -4.6944, -26.7572, 46.2278, -5.8524, -26.7572, 46.2636, -5.8410997, -23.412498, 46.2278, -5.8524, -26.7572, 49.427498, -6.923, -23.412498, 46.2636, -5.8410997, -23.412498, 46.2278, -5.8524, -26.7572, 49.4036, -6.9384, -26.7572, 49.427498, -6.923, -23.412498, 49.4036, -6.9384, -26.7572, 52.997097, -8.1437, -23.412498, 49.427498, -6.923, -23.412498, 49.4036, -6.9384, -26.7572, 52.997097, -8.1672, -26.7572, 52.997097, -8.1437, -23.412498, 52.997097, -8.1437, -23.412498, 56.4827, -8.7755995, -26.7572, 56.4571, -8.7476, -23.412498, 52.997097, -8.1437, -23.412498, 52.997097, -8.1672, -26.7572, 56.4827, -8.7755995, -26.7572, 56.4827, -8.7755995, -26.7572, 59.414497, -9.2638, -23.412498, 56.4571, -8.7476, -23.412498, 56.4827, -8.7755995, -26.7572, 59.4335, -9.2907, -26.7572, 59.414497, -9.2638, -23.412498, 59.4335, -9.2907, -26.7572, 62.3756, -9.7807, -23.412498, 59.414497, -9.2638, -23.412498, 59.4335, -9.2907, -26.7572, 62.356697, -9.8008995, -26.7572, 62.3756, -9.7807, -23.412498, 62.356697, -9.8008995, -26.7572, 66.1166, -10.4337, -23.412498, 62.3756, -9.7807, -23.412498, 62.356697, -9.8008995, -26.7572, 66.1166, -10.4572, -26.7572, 66.1166, -10.4337, -23.412498, 39.877598, -3.6573, -23.412498, 36.1471, -2.928, -20.0679, 36.1424, -2.9269998, -23.412498, 39.877598, -3.6573, -23.412498, 39.877598, -3.6573, -20.0679, 36.1471, -2.928, -20.0679, 36.1471, -2.928, -20.0679, 33.0948, -2.3312, -23.412498, 36.1424, -2.9269998, -23.412498, 36.1471, -2.928, -20.0679, 33.1148, -2.3351, -20.0679, 33.0948, -2.3312, -23.412498, 33.1148, -2.3351, -20.0679, 29.564798, -1.6410999, -23.412498, 33.0948, -2.3312, -23.412498, 33.1148, -2.3351, -20.0679, 29.562698, -1.6407, -20.0679, 29.564798, -1.6410999, -23.412498, 29.562698, -1.6407, -20.0679, 26.7582, -1.0924, -23.412498, 29.564798, -1.6410999, -23.412498, 29.562698, -1.6407, -20.0679, 26.7582, -1.0924, -20.0679, 26.7582, -1.0924, -23.412498, 29.6302, -1.5764999, -13.594999, 26.7577, -0.8804, -16.7232, 29.7123, -1.5057, -16.7232, 29.6302, -1.5764999, -13.594999, 26.572199, -0.95549995, -13.659599, 26.7577, -0.8804, -16.7232, 30.0488, -1.2003, -6.6893, 26.572199, -0.4003, -10.314899, 30.0059, -1.2408999, -10.242399, 30.0488, -1.2003, -6.6893, 26.7577, -0.3464, -6.6893, 26.572199, -0.4003, -10.314899, 29.536499, -2.2303, 13.378601, 26.7582, -1.7623999, 10.033899, 29.586699, -2.188, 10.033899, 29.536499, -2.2303, 13.378601, 26.7582, -1.8294, 13.378601, 26.7582, -1.7623999, 10.033899, 29.8112, -1.4067, 0, 26.7577, -0.4894, -3.3446002, 29.9525, -1.2836, -3.3446002, 29.8112, -1.4067, 0, 26.7577, -0.6956, 0, 26.7577, -0.4894, -3.3446002, 29.550499, -2.2133, 20.0679, 26.7582, -1.8294, 16.7232, 29.552599, -2.2137, 16.7232, 29.550499, -2.2133, 20.0679, 26.7582, -1.8294, 20.0679, 26.7582, -1.8294, 16.7232, 29.3928, -1.796, -26.7572, 33.0948, -2.3312, -23.412498, 29.564798, -1.6410999, -23.412498, 29.3928, -1.796, -26.7572, 32.9589, -2.4371, -26.7572, 33.0948, -2.3312, -23.412498, 29.7136, -1.4886999, 6.6893, 26.7577, -0.73109996, 3.3446, 29.7848, -1.4277999, 3.3446, 29.7136, -1.4886999, 6.6893, 26.7582, -0.83089995, 6.6893, 26.7577, -0.73109996, 3.3446, 29.1145, -2.5956, 26.7572, 26.7582, -2.2719998, 23.3902, 29.548399, -2.2129, 23.412498, 29.1145, -2.5956, 26.7572, 26.7582, -2.7837, 26.6955, 26.7582, -2.2719998, 23.3902, 29.7123, -1.5057, -16.7232, 26.7582, -1.0924, -20.0679, 29.562698, -1.6407, -20.0679, 29.7123, -1.5057, -16.7232, 26.7577, -0.8804, -16.7232, 26.7582, -1.0924, -20.0679, 30.0059, -1.2408999, -10.242399, 26.572199, -0.95549995, -13.659599, 29.6302, -1.5764999, -13.594999, 30.0059, -1.2408999, -10.242399, 26.572199, -0.4003, -10.314899, 26.572199, -0.95549995, -13.659599, 29.586699, -2.188, 10.033899, 26.7582, -0.83089995, 6.6893, 29.7136, -1.4886999, 6.6893, 29.586699, -2.188, 10.033899, 26.7582, -1.7623999, 10.033899, 26.7582, -0.83089995, 6.6893, 29.9525, -1.2836, -3.3446002, 26.7577, -0.3464, -6.6893, 30.0488, -1.2003, -6.6893, 29.9525, -1.2836, -3.3446002, 26.7577, -0.4894, -3.3446002, 26.7577, -0.3464, -6.6893, 29.552599, -2.2137, 16.7232, 26.7582, -1.8294, 13.378601, 29.536499, -2.2303, 13.378601, 29.552599, -2.2137, 16.7232, 26.7582, -1.8294, 16.7232, 26.7582, -1.8294, 13.378601, 29.7848, -1.4277999, 3.3446, 26.7577, -0.6956, 0, 29.8112, -1.4067, 0, 29.7848, -1.4277999, 3.3446, 26.7577, -0.73109996, 3.3446, 26.7577, -0.6956, 0, 29.548399, -2.2129, 23.412498, 26.7582, -1.8294, 20.0679, 29.550499, -2.2133, 20.0679, 29.548399, -2.2129, 23.412498, 26.7582, -2.2719998, 23.3902, 26.7582, -1.8294, 20.0679, 33.1982, -2.3009999, -13.5196, 29.7123, -1.5057, -16.7232, 33.2289, -2.25, -16.7232, 33.1982, -2.3009999, -13.5196, 29.6302, -1.5764999, -13.594999, 29.7123, -1.5057, -16.7232, 33.4719, -2.0886, -6.6893, 30.0059, -1.2408999, -10.242399, 33.4514, -2.0843, -10.169699, 33.4719, -2.0886, -6.6893, 30.0488, -1.2003, -6.6893, 30.0059, -1.2408999, -10.242399, 33.2822, -2.9943, 13.378601, 29.586699, -2.188, 10.033899, 33.2915, -2.9626, 10.033899, 33.2822, -2.9943, 13.378601, 29.536499, -2.2303, 13.378601, 29.586699, -2.188, 10.033899, 33.3661, -2.2345, 0, 29.9525, -1.2836, -3.3446002, 33.4326, -2.1487, -3.3446002, 33.3661, -2.2345, 0, 29.8112, -1.4067, 0, 29.9525, -1.2836, -3.3446002, 33.3628, -2.9636998, 20.0679, 29.552599, -2.2137, 16.7232, 33.3428, -2.9598, 16.7232, 33.3628, -2.9636998, 20.0679, 29.550499, -2.2133, 20.0679, 29.552599, -2.2137, 16.7232, 33.3828, -2.9677, 23.412498, 29.550499, -2.2133, 20.0679, 33.3628, -2.9636998, 20.0679, 33.3828, -2.9677, 23.412498, 29.548399, -2.2129, 23.412498, 29.550499, -2.2133, 20.0679, 33.347797, -2.2975, 6.6893, 29.7848, -1.4277999, 3.3446, 33.370598, -2.2531, 3.3446, 33.347797, -2.2975, 6.6893, 29.7136, -1.4886999, 6.6893, 29.7848, -1.4277999, 3.3446, 33.146698, -3.214, 26.7572, 29.548399, -2.2129, 23.412498, 33.3828, -2.9677, 23.412498, 33.146698, -3.214, 26.7572, 29.1145, -2.5956, 26.7572, 29.548399, -2.2129, 23.412498, 33.2289, -2.25, -16.7232, 29.562698, -1.6407, -20.0679, 33.1148, -2.3351, -20.0679, 33.2289, -2.25, -16.7232, 29.7123, -1.5057, -16.7232, 29.562698, -1.6407, -20.0679, 32.9589, -2.4371, -26.7572, 36.1424, -2.9269998, -23.412498, 33.0948, -2.3312, -23.412498, 32.9589, -2.4371, -26.7572, 36.0678, -2.9959998, -26.7572, 36.1424, -2.9269998, -23.412498, 33.4514, -2.0843, -10.169699, 29.6302, -1.5764999, -13.594999, 33.1982, -2.3009999, -13.5196, 33.4514, -2.0843, -10.169699, 30.0059, -1.2408999, -10.242399, 29.6302, -1.5764999, -13.594999, 33.2915, -2.9626, 10.033899, 29.7136, -1.4886999, 6.6893, 33.347797, -2.2975, 6.6893, 33.2915, -2.9626, 10.033899, 29.586699, -2.188, 10.033899, 29.7136, -1.4886999, 6.6893, 33.4326, -2.1487, -3.3446002, 30.0488, -1.2003, -6.6893, 33.4719, -2.0886, -6.6893, 33.4326, -2.1487, -3.3446002, 29.9525, -1.2836, -3.3446002, 30.0488, -1.2003, -6.6893, 33.3428, -2.9598, 16.7232, 29.536499, -2.2303, 13.378601, 33.2822, -2.9943, 13.378601, 33.3428, -2.9598, 16.7232, 29.552599, -2.2137, 16.7232, 29.536499, -2.2303, 13.378601, 33.370598, -2.2531, 3.3446, 29.8112, -1.4067, 0, 33.3661, -2.2345, 0, 33.370598, -2.2531, 3.3446, 29.7848, -1.4277999, 3.3446, 29.8112, -1.4067, 0, 36.1797, -2.9064, -13.456699, 33.2289, -2.25, -16.7232, 36.2015, -2.8792, -16.7232, 36.1797, -2.9064, -13.456699, 33.1982, -2.3009999, -13.5196, 33.2289, -2.25, -16.7232, 36.2803, -2.8172998, -6.6893, 33.4514, -2.0843, -10.169699, 36.3083, -2.7835999, -10.109299, 36.2803, -2.8172998, -6.6893, 33.4719, -2.0886, -6.6893, 33.4514, -2.0843, -10.169699, 36.1422, -2.9887998, 13.378601, 33.2915, -2.9626, 10.033899, 36.153297, -2.972, 10.033899, 36.1422, -2.9887998, 13.378601, 33.2822, -2.9943, 13.378601, 33.2915, -2.9626, 10.033899, 36.211597, -2.8971, 0, 33.4326, -2.1487, -3.3446002, 36.2533, -2.8497999, -3.3446002, 36.211597, -2.8971, 0, 33.3661, -2.2345, 0, 33.4326, -2.1487, -3.3446002, 36.2075, -2.9348, 20.0679, 33.3428, -2.9598, 16.7232, 36.2028, -2.9338999, 16.7232, 36.2075, -2.9348, 20.0679, 33.3628, -2.9636998, 20.0679, 33.3428, -2.9598, 16.7232, 36.153297, -2.972, 10.033899, 33.347797, -2.2975, 6.6893, 36.1898, -2.9299998, 6.6893, 36.153297, -2.972, 10.033899, 33.2915, -2.9626, 10.033899, 33.347797, -2.2975, 6.6893, 36.1898, -2.9299998, 6.6893, 33.370598, -2.2531, 3.3446, 36.2081, -2.9062, 3.3446, 36.1898, -2.9299998, 6.6893, 33.347797, -2.2975, 6.6893, 33.370598, -2.2531, 3.3446, 36.078598, -3.0746999, 26.7572, 33.3828, -2.9677, 23.412498, 36.2121, -2.9357, 23.412498, 36.078598, -3.0746999, 26.7572, 33.146698, -3.214, 26.7572, 33.3828, -2.9677, 23.412498, 36.2015, -2.8792, -16.7232, 33.1148, -2.3351, -20.0679, 36.1471, -2.928, -20.0679, 36.2015, -2.8792, -16.7232, 33.2289, -2.25, -16.7232, 33.1148, -2.3351, -20.0679, 36.3083, -2.7835999, -10.109299, 33.1982, -2.3009999, -13.5196, 36.1797, -2.9064, -13.456699, 36.3083, -2.7835999, -10.109299, 33.4514, -2.0843, -10.169699, 33.1982, -2.3009999, -13.5196, 36.0678, -2.9959998, -26.7572, 39.877598, -3.6573, -23.412498, 36.1424, -2.9269998, -23.412498, 36.0678, -2.9959998, -26.7572, 39.877598, -3.6808999, -26.7572, 39.877598, -3.6573, -23.412498, 36.2533, -2.8497999, -3.3446002, 33.4719, -2.0886, -6.6893, 36.2803, -2.8172998, -6.6893, 36.2533, -2.8497999, -3.3446002, 33.4326, -2.1487, -3.3446002, 33.4719, -2.0886, -6.6893, 36.2028, -2.9338999, 16.7232, 33.2822, -2.9943, 13.378601, 36.1422, -2.9887998, 13.378601, 36.2028, -2.9338999, 16.7232, 33.3428, -2.9598, 16.7232, 33.2822, -2.9943, 13.378601, 36.2081, -2.9062, 3.3446, 33.3661, -2.2345, 0, 36.211597, -2.8971, 0, 36.2081, -2.9062, 3.3446, 33.370598, -2.2531, 3.3446, 33.3661, -2.2345, 0, 36.2121, -2.9357, 23.412498, 33.3628, -2.9636998, 20.0679, 36.2075, -2.9348, 20.0679, 36.2121, -2.9357, 23.412498, 33.3828, -2.9677, 23.412498, 33.3628, -2.9636998, 20.0679, 42.951, -4.7798, -6.6893, 39.877598, -3.6573, -10.033899, 42.9754, -4.7166, -10.033899, 42.951, -4.7798, -6.6893, 39.877598, -3.7507, -6.6893, 39.877598, -3.6573, -10.033899, 43.1641, -4.7812, 16.7232, 39.877598, -3.7507, 13.378601, 43.0932, -4.8275, 13.378601, 43.1641, -4.7812, 16.7232, 39.877598, -3.6573, 16.7232, 39.877598, -3.7507, 13.378601, 46.338398, -5.9140997, -6.6893, 42.9754, -4.7166, -10.033899, 46.3474, -5.8697, -10.033899, 46.338398, -5.9140997, -6.6893, 42.951, -4.7798, -6.6893, 42.9754, -4.7166, -10.033899, 46.5149, -5.927, 16.7232, 43.0932, -4.8275, 13.378601, 46.4646, -5.9563, 13.378601, 46.5149, -5.927, 16.7232, 43.1641, -4.7812, 16.7232, 43.0932, -4.8275, 13.378601, 49.4614, -6.9598, -6.6893, 46.3474, -5.8697, -10.033899, 49.4666, -6.9364, -10.033899, 49.4614, -6.9598, -6.6893, 46.338398, -5.9140997, -6.6893, 46.3474, -5.8697, -10.033899, 49.5449, -6.9631996, 16.7232, 46.4646, -5.9563, 13.378601, 49.520397, -6.9795, 13.378601, 49.5449, -6.9631996, 16.7232, 46.5149, -5.927, 16.7232, 46.4646, -5.9563, 13.378601, -23.412498, -3.8518999, 39.456898, -26.7572, -3.2777, 36.6322, -23.412498, -3.2477999, 36.6305, -23.412498, -3.8518999, 39.456898, -26.7572, -3.8518999, 39.456898, -26.7572, -3.2777, 36.6322, -16.7232, -3.8518999, 39.456898, -13.378601, -3.243, 36.6252, -13.378601, -3.8518999, 39.456898, -16.7232, -3.8518999, 39.456898, -16.7232, -3.247, 36.6269, -13.378601, -3.243, 36.6252, -13.378601, -1.1209999, 26.7572, -10.033899, -1.8925999, 30.345499, -13.378601, -1.8938999, 30.3512, -10.033899, -1.8925999, 30.345499, -13.378601, -2.619, 33.7235, -13.378601, -1.8938999, 30.3512, -13.378601, -1.1209999, 26.7572, -10.033899, -1.1209999, 26.7572, -10.033899, -1.8925999, 30.345499, -10.033899, -1.8925999, 30.345499, -10.033899, -2.6181998, 33.7199, -13.378601, -2.619, 33.7235, -10.033899, -2.6181998, 33.7199, -13.378601, -3.243, 36.6252, -13.378601, -2.619, 33.7235, -10.033899, -1.1209999, 26.7572, -6.6893, -1.8914, 30.3399, -10.033899, -1.8925999, 30.345499, -6.6893, -1.8914, 30.3399, -10.033899, -2.6181998, 33.7199, -10.033899, -1.8925999, 30.345499, -10.033899, -1.1209999, 26.7572, -6.6893, -1.1209999, 26.7572, -6.6893, -1.8914, 30.3399, -10.033899, -2.6181998, 33.7199, -10.033899, -3.2426, 36.623398, -13.378601, -3.243, 36.6252, -10.033899, -3.2426, 36.623398, -13.378601, -3.8518999, 39.456898, -13.378601, -3.243, 36.6252, -10.033899, -3.2426, 36.623398, -10.033899, -3.8518999, 39.456898, -13.378601, -3.8518999, 39.456898, -6.6893, -2.6174998, 33.7163, -10.033899, -3.2426, 36.623398, -10.033899, -2.6181998, 33.7199, -6.6893, -1.8914, 30.3399, -6.6893, -2.6174998, 33.7163, -10.033899, -2.6181998, 33.7199, -6.6893, -3.2422, 36.6217, -10.033899, -3.8518999, 39.456898, -10.033899, -3.2426, 36.623398, -6.6893, -2.6174998, 33.7163, -6.6893, -3.2422, 36.6217, -10.033899, -3.2426, 36.623398, -6.6893, -3.2422, 36.6217, -6.6893, -3.8518999, 39.456898, -10.033899, -3.8518999, 39.456898, -3.3446002, -1.8901999, 30.3342, -6.6893, -2.6174998, 33.7163, -6.6893, -1.8914, 30.3399, -6.6893, -1.1209999, 26.7572, -3.3446002, -1.8901999, 30.3342, -6.6893, -1.8914, 30.3399, -6.6893, -1.1209999, 26.7572, -3.3446002, -1.1209999, 26.7572, -3.3446002, -1.8901999, 30.3342, -3.3446002, -1.8901999, 30.3342, -3.3446002, -2.6167, 33.7128, -6.6893, -2.6174998, 33.7163, -3.3446002, -2.6167, 33.7128, -6.6893, -3.2422, 36.6217, -6.6893, -2.6174998, 33.7163, -3.3446002, -1.1209999, 26.7572, 0, -1.8889999, 30.3286, -3.3446002, -1.8901999, 30.3342, 0, -1.8889999, 30.3286, -3.3446002, -2.6167, 33.7128, -3.3446002, -1.8901999, 30.3342, -3.3446002, -1.1209999, 26.7572, 0, -1.1209999, 26.7572, 0, -1.8889999, 30.3286, -3.3446002, -3.2417998, 36.6199, -6.6893, -3.8518999, 39.456898, -6.6893, -3.2422, 36.6217, -3.3446002, -2.6167, 33.7128, -3.3446002, -3.2417998, 36.6199, -6.6893, -3.2422, 36.6217, -3.3446002, -3.2417998, 36.6199, -3.3446002, -3.8518999, 39.456898, -6.6893, -3.8518999, 39.456898, 0, -1.8889999, 30.3286, 0, -2.616, 33.709198, -3.3446002, -2.6167, 33.7128, 0, -2.616, 33.709198, -3.3446002, -3.2417998, 36.6199, -3.3446002, -2.6167, 33.7128, 0, -1.1209999, 26.7572, 3.3446, -1.8878, 30.323, 0, -1.8889999, 30.3286, 3.3446, -1.8878, 30.323, 0, -2.616, 33.709198, 0, -1.8889999, 30.3286, 0, -1.1209999, 26.7572, 3.3446, -1.1209999, 26.7572, 3.3446, -1.8878, 30.323, 0, -3.2415, 36.6182, -3.3446002, -3.8518999, 39.456898, -3.3446002, -3.2417998, 36.6199, 0, -2.616, 33.709198, 0, -3.2415, 36.6182, -3.3446002, -3.2417998, 36.6199, 0, -3.2415, 36.6182, 0, -3.8518999, 39.456898, -3.3446002, -3.8518999, 39.456898, 3.3446, -1.8878, 30.323, 3.3446, -2.6152, 33.7057, 0, -2.616, 33.709198, 3.3446, -2.6152, 33.7057, 0, -3.2415, 36.6182, 0, -2.616, 33.709198, 3.3446, -1.1209999, 26.7572, 6.6893, -1.8865999, 30.317299, 3.3446, -1.8878, 30.323, 6.6893, -1.8865999, 30.317299, 3.3446, -2.6152, 33.7057, 3.3446, -1.8878, 30.323, 3.3446, -1.1209999, 26.7572, 6.6893, -1.1209999, 26.7572, 6.6893, -1.8865999, 30.317299, 6.6893, -1.1209999, 26.7572, 10.033899, -1.8853999, 30.311699, 6.6893, -1.8865999, 30.317299, 6.6893, -1.1209999, 26.7572, 10.033899, -1.1209999, 26.7572, 10.033899, -1.8853999, 30.311699, 10.033899, -1.8853999, 30.311699, 6.6893, -2.6144, 33.7021, 6.6893, -1.8865999, 30.317299, 6.6893, -1.8865999, 30.317299, 6.6893, -2.6144, 33.7021, 3.3446, -2.6152, 33.7057, 10.033899, -1.8853999, 30.311699, 10.033899, -2.6137, 33.6986, 6.6893, -2.6144, 33.7021, 3.3446, -2.6152, 33.7057, 3.3446, -3.2410998, 36.616398, 0, -3.2415, 36.6182, 3.3446, -3.2410998, 36.616398, 0, -3.8518999, 39.456898, 0, -3.2415, 36.6182, 6.6893, -2.6144, 33.7021, 3.3446, -3.2410998, 36.616398, 3.3446, -2.6152, 33.7057, 3.3446, -3.2410998, 36.616398, 3.3446, -3.8518999, 39.456898, 0, -3.8518999, 39.456898, 10.033899, -2.6137, 33.6986, 6.6893, -3.2407, 36.6147, 6.6893, -2.6144, 33.7021, 6.6893, -2.6144, 33.7021, 6.6893, -3.2407, 36.6147, 3.3446, -3.2410998, 36.616398, 6.6893, -3.2407, 36.6147, 3.3446, -3.8518999, 39.456898, 3.3446, -3.2410998, 36.616398, 10.033899, -2.6137, 33.6986, 10.033899, -3.2403, 36.6129, 6.6893, -3.2407, 36.6147, 6.6893, -3.2407, 36.6147, 6.6893, -3.8518999, 39.456898, 3.3446, -3.8518999, 39.456898, 10.033899, -3.2403, 36.6129, 6.6893, -3.8518999, 39.456898, 6.6893, -3.2407, 36.6147, 10.033899, -3.2403, 36.6129, 10.033899, -3.8518999, 39.456898, 6.6893, -3.8518999, 39.456898, 10.033899, -1.1209999, 26.7572, 13.378599, -2.6734, 30.306, 10.033899, -1.8853999, 30.311699, 10.033899, -1.1209999, 26.7572, 13.378599, -2.2194998, 26.781, 13.378599, -2.6734, 30.306, 13.378599, -2.2194998, 26.781, 16.7232, -2.6727, 30.3004, 13.378599, -2.6734, 30.306, 16.7232, -2.6727, 30.3004, 13.378599, -3.1099, 33.695, 13.378599, -2.6734, 30.306, 13.378599, -2.2194998, 26.781, 16.7232, -2.2194998, 26.781, 16.7232, -2.6727, 30.3004, 16.7232, -2.6727, 30.3004, 16.7232, -3.1094, 33.691498, 13.378599, -3.1099, 33.695, 16.7232, -3.1094, 33.691498, 13.378599, -3.4854, 36.6112, 13.378599, -3.1099, 33.695, 16.7232, -2.2194998, 26.781, 20.0679, -2.672, 30.294699, 16.7232, -2.6727, 30.3004, 20.0679, -2.672, 30.294699, 16.7232, -3.1094, 33.691498, 16.7232, -2.6727, 30.3004, 16.7232, -2.2194998, 26.781, 20.0679, -2.2194998, 26.781, 20.0679, -2.672, 30.294699, 20.0679, -2.2194998, 26.781, 23.412498, -2.6713, 30.289099, 20.0679, -2.672, 30.294699, 20.0679, -2.2194998, 26.781, 23.412498, -2.2194998, 26.781, 23.412498, -2.6713, 30.289099, 23.412498, -2.6713, 30.289099, 20.0679, -3.109, 33.6879, 20.0679, -2.672, 30.294699, 20.0679, -2.672, 30.294699, 20.0679, -3.109, 33.6879, 16.7232, -3.1094, 33.691498, 23.412498, -2.6713, 30.289099, 23.412498, -3.1085, 33.6844, 20.0679, -3.109, 33.6879, 16.7232, -3.1094, 33.691498, 16.7232, -3.4852, 36.609398, 13.378599, -3.4854, 36.6112, 20.0679, -3.109, 33.6879, 16.7232, -3.4852, 36.609398, 16.7232, -3.1094, 33.691498, 16.7232, -3.4852, 36.609398, 13.378599, -3.8518999, 39.456898, 13.378599, -3.4854, 36.6112, 16.7232, -3.4852, 36.609398, 16.7232, -3.8518999, 39.456898, 13.378599, -3.8518999, 39.456898, 20.0679, -3.109, 33.6879, 20.0679, -3.485, 36.607597, 16.7232, -3.4852, 36.609398, 20.0679, -3.485, 36.607597, 16.7232, -3.8518999, 39.456898, 16.7232, -3.4852, 36.609398, 23.412498, -3.1085, 33.6844, 20.0679, -3.485, 36.607597, 20.0679, -3.109, 33.6879, 20.0679, -3.485, 36.607597, 20.0679, -3.8518999, 39.456898, 16.7232, -3.8518999, 39.456898, 23.412498, -3.1085, 33.6844, 23.412498, -3.4847, 36.6059, 20.0679, -3.485, 36.607597, 23.412498, -3.4847, 36.6059, 20.0679, -3.8518999, 39.456898, 20.0679, -3.485, 36.607597, 23.412498, -3.4847, 36.6059, 23.412498, -3.8518999, 39.456898, 20.0679, -3.8518999, 39.456898, 23.412498, -2.2194998, 26.781, 26.7582, -3.0839999, 30.2834, 23.412498, -2.6713, 30.289099, 23.412498, -2.2194998, 26.781, 26.7582, -2.7837, 26.6955, 26.7582, -3.0839999, 30.2834, -26.7572, -3.2777, 36.6322, -23.412498, -2.6287, 33.7341, -23.412498, -3.2477999, 36.6305, -26.7572, -3.2777, 36.6322, -26.7572, -2.6892, 33.737698, -23.412498, -2.6287, 33.7341, -16.7232, -3.247, 36.6269, -13.378601, -2.619, 33.7235, -13.378601, -3.243, 36.6252, -16.7232, -3.247, 36.6269, -16.7232, -2.6272, 33.726997, -13.378601, -2.619, 33.7235, 26.7582, -3.6130998, 36.6041, 23.412498, -3.8518999, 39.456898, 23.412498, -3.4847, 36.6059, 26.7582, -3.6130998, 36.6041, 26.7582, -3.8518999, 39.456898, 23.412498, -3.8518999, 39.456898, 13.378599, -3.4854, 36.6112, 10.033899, -3.8518999, 39.456898, 10.033899, -3.2403, 36.6129, 13.378599, -3.4854, 36.6112, 13.378599, -3.8518999, 39.456898, 10.033899, -3.8518999, 39.456898, 26.7582, -3.3683999, 33.680798, 23.412498, -3.4847, 36.6059, 23.412498, -3.1085, 33.6844, 26.7582, -3.3683999, 33.680798, 26.7582, -3.6130998, 36.6041, 23.412498, -3.4847, 36.6059, -26.7572, -2.6892, 33.737698, -23.412498, -1.9093, 30.3681, -23.412498, -2.6287, 33.7341, -26.7572, -2.6892, 33.737698, -26.7572, -2.0054, 30.3737, -23.412498, -1.9093, 30.3681, -16.7232, -2.6272, 33.726997, -13.378601, -1.8938999, 30.3512, -13.378601, -2.619, 33.7235, -16.7232, -2.6272, 33.726997, -16.7232, -1.9068999, 30.3568, -13.378601, -1.8938999, 30.3512, 13.378599, -3.1099, 33.695, 10.033899, -3.2403, 36.6129, 10.033899, -2.6137, 33.6986, 13.378599, -3.1099, 33.695, 13.378599, -3.4854, 36.6112, 10.033899, -3.2403, 36.6129, -26.7572, -2.0054, 30.3737, -23.412498, -1.1374999, 26.7572, -23.412498, -1.9093, 30.3681, -26.7572, -2.0054, 30.3737, -26.7572, -1.2701, 26.7572, -23.412498, -1.1374999, 26.7572, 26.7582, -3.0839999, 30.2834, 23.412498, -3.1085, 33.6844, 23.412498, -2.6713, 30.289099, 26.7582, -3.0839999, 30.2834, 26.7582, -3.3683999, 33.680798, 23.412498, -3.1085, 33.6844, 13.378599, -2.6734, 30.306, 10.033899, -2.6137, 33.6986, 10.033899, -1.8853999, 30.311699, 13.378599, -2.6734, 30.306, 13.378599, -3.1099, 33.695, 10.033899, -2.6137, 33.6986, -16.7232, -1.9068999, 30.3568, -13.378601, -1.1209999, 26.7572, -13.378601, -1.8938999, 30.3512, -16.7232, -1.9068999, 30.3568, -16.7232, -1.1374999, 26.7572, -13.378601, -1.1209999, 26.7572, -38.5239, -3.6573, -23.412498, -36.0882, -3.5405, -26.7572, -36.0928, -3.4731998, -23.412498, -38.5239, -3.6573, -23.412498, -38.5239, -3.6573, -26.7572, -36.0882, -3.5405, -26.7572, -38.5239, -3.6573, -20.3888, -36.0928, -3.4731998, -23.412498, -36.0969, -3.2475998, -20.410799, -38.5239, -3.6573, -20.3888, -38.5239, -3.6573, -23.412498, -36.0928, -3.4731998, -23.412498, -38.5239, -3.6573, -20.0679, -36.101498, -3.2484, -17.0662, -38.5239, -3.6573, -17.0441, -36.101498, -3.2484, -17.0662, -38.5239, -3.6573, -20.0679, -38.5239, -3.6573, -20.3888, -36.101498, -3.2484, -17.0662, -38.5239, -3.6573, -20.3888, -36.0969, -3.2475998, -20.410799, -36.0969, -3.2475998, -20.410799, -33.3005, -2.7756, -17.0916, -36.101498, -3.2484, -17.0662, -36.0969, -3.2475998, -20.410799, -33.2906, -2.7739, -20.4364, -33.3005, -2.7756, -17.0916, -33.2906, -2.7739, -20.4364, -30.219301, -2.2554998, -17.1196, -33.3005, -2.7756, -17.0916, -33.2906, -2.7739, -20.4364, -30.2036, -2.2528, -20.4644, -30.219301, -2.2554998, -17.1196, -30.2036, -2.2528, -20.4644, -26.7572, -1.6710999, -17.1511, -30.219301, -2.2554998, -17.1196, -30.2036, -2.2528, -20.4644, -26.7572, -1.6710999, -20.4958, -26.7572, -1.6710999, -17.1511, -38.5239, -3.6573, -16.7232, -36.106598, -2.8727, -13.378599, -38.5239, -3.6573, -13.378599, -36.106598, -2.8727, -13.378599, -38.5239, -3.6573, -16.7232, -38.5239, -3.6573, -17.0441, -36.106598, -2.8727, -13.378599, -38.5239, -3.6573, -17.0441, -36.101498, -3.2484, -17.0662, -38.5239, -3.6573, -10.033899, -36.106598, -2.8727, -13.378599, -36.1112, -2.8741999, -10.033899, -38.5239, -3.6573, -10.033899, -38.5239, -3.6573, -13.378599, -36.106598, -2.8727, -13.378599, -38.5239, -3.6573, -6.6893, -38.5239, -3.6573, -10.033899, -36.1112, -2.8741999, -10.033899, -38.5239, -3.6573, -6.6893, -36.1112, -2.8741999, -10.033899, -36.1158, -2.8757, -6.6893, -36.1112, -2.8741999, -10.033899, -33.3313, -1.9719, -6.6893, -36.1158, -2.8757, -6.6893, -36.106598, -2.8727, -13.378599, -33.3214, -1.9686999, -10.033899, -36.1112, -2.8741999, -10.033899, -36.1112, -2.8741999, -10.033899, -33.3214, -1.9686999, -10.033899, -33.3313, -1.9719, -6.6893, -36.106598, -2.8727, -13.378599, -33.3115, -1.9655, -13.378599, -33.3214, -1.9686999, -10.033899, -33.3214, -1.9686999, -10.033899, -30.2685, -0.9777, -6.6893, -33.3313, -1.9719, -6.6893, -33.3115, -1.9655, -13.378599, -30.252699, -0.9726, -10.033899, -33.3214, -1.9686999, -10.033899, -33.3214, -1.9686999, -10.033899, -30.252699, -0.9726, -10.033899, -30.2685, -0.9777, -6.6893, -30.252699, -0.9726, -10.033899, -29.294899, -0.6617, -6.6893, -30.2685, -0.9777, -6.6893, -33.3115, -1.9655, -13.378599, -30.237001, -0.9675, -13.378599, -30.252699, -0.9726, -10.033899, -30.252699, -0.9726, -10.033899, -29.294899, -0.6617, -10.033899, -29.294899, -0.6617, -6.6893, -30.237001, -0.9675, -13.378599, -29.294899, -0.6617, -10.033899, -30.252699, -0.9726, -10.033899, -30.237001, -0.9675, -13.378599, -29.294899, -0.6617, -13.378599, -29.294899, -0.6617, -10.033899, -38.5239, -3.6573, -3.3446002, -36.1158, -2.8757, -6.6893, -36.1204, -2.9744, -3.3446002, -38.5239, -3.6573, -3.3446002, -38.5239, -3.6573, -6.6893, -36.1158, -2.8757, -6.6893, -38.5239, -3.6573, 0, -36.1204, -2.9744, -3.3446002, -36.125, -2.9757, 0, -38.5239, -3.6573, 0, -38.5239, -3.6573, -3.3446002, -36.1204, -2.9744, -3.3446002, -36.1204, -2.9744, -3.3446002, -33.3512, -2.1875, 0, -36.125, -2.9757, 0, -36.1204, -2.9744, -3.3446002, -33.341198, -2.1847, -3.3446002, -33.3512, -2.1875, 0, -33.341198, -2.1847, -3.3446002, -30.300001, -1.3205999, 0, -33.3512, -2.1875, 0, -33.341198, -2.1847, -3.3446002, -30.2842, -1.3161, -3.3446002, -30.300001, -1.3205999, 0, -30.2842, -1.3161, -3.3446002, -27.9812, -0.6617, 0, -30.300001, -1.3205999, 0, -30.2842, -1.3161, -3.3446002, -27.9812, -0.6617, -3.3446002, -27.9812, -0.6617, 0, -29.294899, -0.6617, 3.3446, -30.3315, -0.9982, 6.6893, -30.315699, -0.9931, 3.3446, -29.294899, -0.6617, 3.3446, -29.294899, -0.6617, 6.6893, -30.3315, -0.9982, 6.6893, -29.294899, -0.6617, 10.033899, -30.3315, -0.9982, 6.6893, -29.294899, -0.6617, 6.6893, -30.3315, -0.9982, 6.6893, -29.294899, -0.6617, 10.033899, -29.294899, -0.6617, 13.378601, -30.3315, -0.9982, 6.6893, -33.3611, -1.9814999, 3.3446, -30.315699, -0.9931, 3.3446, -30.3315, -0.9982, 6.6893, -29.294899, -0.6617, 13.378601, -30.363, -1.0084, 13.378601, -30.3315, -0.9982, 6.6893, -33.371, -1.9848, 6.6893, -33.3611, -1.9814999, 3.3446, -30.363, -1.0084, 13.378601, -33.371, -1.9848, 6.6893, -30.3315, -0.9982, 6.6893, -33.371, -1.9848, 6.6893, -36.1296, -2.8801, 3.3446, -33.3611, -1.9814999, 3.3446, -30.363, -1.0084, 13.378601, -33.3908, -1.9912, 13.378601, -33.371, -1.9848, 6.6893, -33.371, -1.9848, 6.6893, -36.134197, -2.8816, 6.6893, -36.1296, -2.8801, 3.3446, -33.3908, -1.9912, 13.378601, -36.134197, -2.8816, 6.6893, -33.371, -1.9848, 6.6893, -36.134197, -2.8816, 6.6893, -38.5239, -3.6573, 3.3446, -36.1296, -2.8801, 3.3446, -33.3908, -1.9912, 13.378601, -36.1433, -2.8846, 13.378601, -36.134197, -2.8816, 6.6893, -36.134197, -2.8816, 6.6893, -38.5239, -3.6573, 6.6893, -38.5239, -3.6573, 3.3446, -38.5239, -3.6573, 13.378601, -36.134197, -2.8816, 6.6893, -36.1433, -2.8846, 13.378601, -36.134197, -2.8816, 6.6893, -38.5239, -3.6573, 10.033899, -38.5239, -3.6573, 6.6893, -36.134197, -2.8816, 6.6893, -38.5239, -3.6573, 13.378601, -38.5239, -3.6573, 10.033899, -29.294899, -1.0265, 16.7232, -30.394499, -1.8736, 20.0679, -30.378698, -1.3354, 16.7232, -29.294899, -1.0265, 16.7232, -26.7572, -1.0756, 20.0679, -30.394499, -1.8736, 20.0679, -26.7572, -1.0756, 20.0679, -30.4102, -1.8771, 23.412498, -30.394499, -1.8736, 20.0679, -26.7572, -1.0756, 20.0679, -26.7572, -1.0756, 23.412498, -30.4102, -1.8771, 23.412498, -30.4102, -1.8771, 23.412498, -33.4106, -2.5354, 20.0679, -30.394499, -1.8736, 20.0679, -30.4102, -1.8771, 23.412498, -33.420498, -2.5376, 23.412498, -33.4106, -2.5354, 20.0679, -33.420498, -2.5376, 23.412498, -36.1525, -3.1369998, 20.0679, -33.4106, -2.5354, 20.0679, -33.420498, -2.5376, 23.412498, -36.1571, -3.138, 23.412498, -36.1525, -3.1369998, 20.0679, -36.1571, -3.138, 23.412498, -38.5239, -3.6573, 20.0679, -36.1525, -3.1369998, 20.0679, -36.1571, -3.138, 23.412498, -38.5239, -3.6573, 23.412498, -38.5239, -3.6573, 20.0679, -26.7572, -1.0756, 23.412498, -30.426, -2.0144, 26.7572, -30.4102, -1.8771, 23.412498, -26.7572, -1.0756, 23.412498, -26.7572, -1.2701, 26.7572, -30.426, -2.0144, 26.7572, -29.294899, -0.6617, 13.378601, -30.378698, -1.3354, 16.7232, -30.363, -1.0084, 13.378601, -29.294899, -0.6617, 13.378601, -29.294899, -1.0265, 16.7232, -30.378698, -1.3354, 16.7232, -30.173899, -3.2568, -26.7572, -26.7572, -2.7663999, -23.412498, -30.1897, -3.0263, -23.412498, -30.173899, -3.2568, -26.7572, -26.7572, -3.0929, -26.7572, -26.7572, -2.7663999, -23.412498, -30.426, -2.0144, 26.7572, -33.420498, -2.5376, 23.412498, -30.4102, -1.8771, 23.412498, -30.426, -2.0144, 26.7572, -33.4304, -2.6239998, 26.7572, -33.420498, -2.5376, 23.412498, -30.219301, -2.2554998, -17.1196, -29.294899, -0.6617, -13.378599, -30.237001, -0.9675, -13.378599, -30.219301, -2.2554998, -17.1196, -26.7572, -1.6710999, -17.1511, -29.294899, -0.6617, -13.378599, -30.394499, -1.8736, 20.0679, -33.4007, -2.1969, 16.7232, -30.378698, -1.3354, 16.7232, -30.394499, -1.8736, 20.0679, -33.4106, -2.5354, 20.0679, -33.4007, -2.1969, 16.7232, -30.1897, -3.0263, -23.412498, -26.7572, -1.6710999, -20.4958, -30.2036, -2.2528, -20.4644, -30.1897, -3.0263, -23.412498, -26.7572, -2.7663999, -23.412498, -26.7572, -1.6710999, -20.4958, -30.315699, -0.9931, 3.3446, -33.3512, -2.1875, 0, -30.300001, -1.3205999, 0, -30.315699, -0.9931, 3.3446, -33.3611, -1.9814999, 3.3446, -33.3512, -2.1875, 0, -30.2685, -0.9777, -6.6893, -27.9812, -0.6617, -3.3446002, -30.2842, -1.3161, -3.3446002, -30.2685, -0.9777, -6.6893, -29.294899, -0.6617, -6.6893, -27.9812, -0.6617, -3.3446002, -30.378698, -1.3354, 16.7232, -33.3908, -1.9912, 13.378601, -30.363, -1.0084, 13.378601, -30.378698, -1.3354, 16.7232, -33.4007, -2.1969, 16.7232, -33.3908, -1.9912, 13.378601, -33.2719, -3.4053998, -26.7572, -30.1897, -3.0263, -23.412498, -33.2818, -3.2603998, -23.412498, -33.2719, -3.4053998, -26.7572, -30.173899, -3.2568, -26.7572, -30.1897, -3.0263, -23.412498, -33.4007, -2.1969, 16.7232, -36.1433, -2.8846, 13.378601, -33.3908, -1.9912, 13.378601, -33.4007, -2.1969, 16.7232, -36.1479, -2.98, 16.7232, -36.1433, -2.8846, 13.378601, -33.4304, -2.6239998, 26.7572, -36.1571, -3.138, 23.412498, -33.420498, -2.5376, 23.412498, -33.4304, -2.6239998, 26.7572, -36.161697, -3.1780999, 26.7572, -36.1571, -3.138, 23.412498, -33.3005, -2.7756, -17.0916, -30.237001, -0.9675, -13.378599, -33.3115, -1.9655, -13.378599, -33.3005, -2.7756, -17.0916, -30.219301, -2.2554998, -17.1196, -30.237001, -0.9675, -13.378599, -33.2818, -3.2603998, -23.412498, -30.2036, -2.2528, -20.4644, -33.2906, -2.7739, -20.4364, -33.2818, -3.2603998, -23.412498, -30.1897, -3.0263, -23.412498, -30.2036, -2.2528, -20.4644, -33.3611, -1.9814999, 3.3446, -36.125, -2.9757, 0, -33.3512, -2.1875, 0, -33.3611, -1.9814999, 3.3446, -36.1296, -2.8801, 3.3446, -36.125, -2.9757, 0, -33.4106, -2.5354, 20.0679, -36.1479, -2.98, 16.7232, -33.4007, -2.1969, 16.7232, -33.4106, -2.5354, 20.0679, -36.1525, -3.1369998, 20.0679, -36.1479, -2.98, 16.7232, -33.3313, -1.9719, -6.6893, -30.2842, -1.3161, -3.3446002, -33.341198, -2.1847, -3.3446002, -33.3313, -1.9719, -6.6893, -30.2685, -0.9777, -6.6893, -30.2842, -1.3161, -3.3446002, -36.161697, -3.1780999, 26.7572, -38.5239, -3.6573, 23.412498, -36.1571, -3.138, 23.412498, -36.161697, -3.1780999, 26.7572, -38.5239, -3.6573, 26.7572, -38.5239, -3.6573, 23.412498, -36.101498, -3.2484, -17.0662, -33.3115, -1.9655, -13.378599, -36.106598, -2.8727, -13.378599, -36.101498, -3.2484, -17.0662, -33.3005, -2.7756, -17.0916, -33.3115, -1.9655, -13.378599, -36.0928, -3.4731998, -23.412498, -33.2906, -2.7739, -20.4364, -36.0969, -3.2475998, -20.410799, -36.0928, -3.4731998, -23.412498, -33.2818, -3.2603998, -23.412498, -33.2906, -2.7739, -20.4364, -36.1296, -2.8801, 3.3446, -38.5239, -3.6573, 0, -36.125, -2.9757, 0, -36.1296, -2.8801, 3.3446, -38.5239, -3.6573, 3.3446, -38.5239, -3.6573, 0, -36.1158, -2.8757, -6.6893, -33.341198, -2.1847, -3.3446002, -36.1204, -2.9744, -3.3446002, -36.1158, -2.8757, -6.6893, -33.3313, -1.9719, -6.6893, -33.341198, -2.1847, -3.3446002, -36.1525, -3.1369998, 20.0679, -38.5239, -3.6573, 16.7232, -36.1479, -2.98, 16.7232, -36.1525, -3.1369998, 20.0679, -38.5239, -3.6573, 20.0679, -38.5239, -3.6573, 16.7232, -36.0882, -3.5405, -26.7572, -33.2818, -3.2603998, -23.412498, -36.0928, -3.4731998, -23.412498, -36.0882, -3.5405, -26.7572, -33.2719, -3.4053998, -26.7572, -33.2818, -3.2603998, -23.412498, -36.1479, -2.98, 16.7232, -38.5239, -3.6573, 13.378601, -36.1433, -2.8846, 13.378601, -36.1479, -2.98, 16.7232, -38.5239, -3.6573, 16.7232, -38.5239, -3.6573, 13.378601, -41.627, -4.8403997, 26.7572, -38.5239, -3.6573, 26.7572, -40.2616, -4.8514, 28.2242, -44.537098, -5.95, 26.7572, -41.627, -4.8403997, 26.7572, -43.2833, -5.9677997, 28.143099, -47.4473, -7.0596, 26.7572, -44.537098, -5.95, 26.7572, -46.202698, -7.0731997, 28.132399, -53.117798, -8.6939, 26.7572, -50.290497, -8.1437, 26.7572, -51.906998, -8.6923, 28.058699, -55.5951, -9.176, 26.7572, -53.117798, -8.6939, 26.7572, -54.5561, -9.1761, 27.885199, -58.463497, -9.7343, 26.7572, -55.5951, -9.176, 26.7572, -57.2836, -9.7381, 28.062199, -33.0801, -3.7473, 32.6325, -32.8819, -4.9104, 36.1535, -34.7309, -4.8956, 34.1667, -33.0801, -3.7473, 32.6325, -31.247301, -3.7775998, 34.6107, -32.8819, -4.9104, 36.1535, -34.7309, -4.8956, 34.1667, -34.5837, -6.0910997, 37.759598, -36.416798, -6.0650997, 35.7334, -34.7309, -4.8956, 34.1667, -32.8819, -4.9104, 36.1535, -34.5837, -6.0910997, 37.759598, -36.416798, -6.0650997, 35.7334, -36.1511, -7.1832, 39.2388, -37.9957, -7.1629996, 37.2007, -36.416798, -6.0650997, 35.7334, -34.5837, -6.0910997, 37.759598, -36.1511, -7.1832, 39.2388, -37.9957, -7.1629996, 37.2007, -37.5247, -8.1437, 40.5352, -39.4027, -8.1437, 38.5083, -37.9957, -7.1629996, 37.2007, -36.1511, -7.1832, 39.2388, -37.5247, -8.1437, 40.5352, -39.4027, -8.1437, 38.5083, -39.0032, -8.6748, 41.930298, -40.895798, -8.6774, 39.8957, -39.4027, -8.1437, 38.5083, -37.5247, -8.1437, 40.5352, -39.0032, -8.6748, 41.930298, -40.895798, -8.6774, 39.8957, -40.403297, -9.1775, 43.2515, -42.2959, -9.1772995, 41.196598, -40.895798, -8.6774, 39.8957, -39.0032, -8.6748, 41.930298, -40.403297, -9.1775, 43.2515, -42.2959, -9.1772995, 41.196598, -42.1009, -9.787, 44.8533, -43.9867, -9.7809, 42.7677, -42.2959, -9.1772995, 41.196598, -40.403297, -9.1775, 43.2515, -42.1009, -9.787, 44.8533, -43.9867, -9.7809, 42.7677, -43.8985, -10.4337, 46.549698, -45.8121, -10.4337, 44.463898, -43.9867, -9.7809, 42.7677, -42.1009, -9.787, 44.8533, -43.8985, -10.4337, 46.549698, -31.247301, -3.7775998, 34.6107, -31.153502, -4.9242997, 38.010498, -32.8819, -4.9104, 36.1535, -31.247301, -3.7775998, 34.6107, -29.5455, -3.8058, 36.4474, -31.153502, -4.9242997, 38.010498, -32.8819, -4.9104, 36.1535, -32.857998, -6.1155996, 39.6672, -34.5837, -6.0910997, 37.759598, -32.8819, -4.9104, 36.1535, -31.153502, -4.9242997, 38.010498, -32.857998, -6.1155996, 39.6672, -34.5837, -6.0910997, 37.759598, -34.403698, -7.2022996, 41.169598, -36.1511, -7.1832, 39.2388, -34.5837, -6.0910997, 37.759598, -32.857998, -6.1155996, 39.6672, -34.403698, -7.2022996, 41.169598, -36.1511, -7.1832, 39.2388, -35.7366, -8.1437, 42.4652, -37.5247, -8.1437, 40.5352, -36.1511, -7.1832, 39.2388, -34.403698, -7.2022996, 41.169598, -35.7366, -8.1437, 42.4652, -37.5247, -8.1437, 40.5352, -37.1909, -8.672299, 43.878498, -39.0032, -8.6748, 41.930298, -37.5247, -8.1437, 40.5352, -35.7366, -8.1437, 42.4652, -37.1909, -8.672299, 43.878498, -42.1009, -9.787, 44.8533, -42.032497, -10.4337, 48.5836, -43.8985, -10.4337, 46.549698, -42.1009, -9.787, 44.8533, -40.2735, -9.7929, 46.8743, -42.032497, -10.4337, 48.5836, -39.0032, -8.6748, 41.930298, -38.5812, -9.1777, 45.2297, -40.403297, -9.1775, 43.2515, -39.0032, -8.6748, 41.930298, -37.1909, -8.672299, 43.878498, -38.5812, -9.1777, 45.2297, -40.403297, -9.1775, 43.2515, -40.2735, -9.7929, 46.8743, -42.1009, -9.787, 44.8533, -40.403297, -9.1775, 43.2515, -38.5812, -9.1777, 45.2297, -40.2735, -9.7929, 46.8743, -40.2735, -9.7929, 46.8743, -40.572998, -10.4337, 50.1744, -42.032497, -10.4337, 48.5836, -40.2735, -9.7929, 46.8743, -38.8322, -9.7975, 48.4683, -40.572998, -10.4337, 50.1744, -32.857998, -6.1155996, 39.6672, -32.985, -7.2179, 42.7371, -34.403698, -7.2022996, 41.169598, -32.857998, -6.1155996, 39.6672, -31.445799, -6.1355996, 41.2283, -32.985, -7.2179, 42.7371, -38.5812, -9.1777, 45.2297, -38.8322, -9.7975, 48.4683, -40.2735, -9.7929, 46.8743, -38.5812, -9.1777, 45.2297, -37.1326, -9.1778, 46.802498, -38.8322, -9.7975, 48.4683, -34.403698, -7.2022996, 41.169598, -34.2949, -8.1437, 44.0212, -35.7366, -8.1437, 42.4652, -34.403698, -7.2022996, 41.169598, -32.985, -7.2179, 42.7371, -34.2949, -8.1437, 44.0212, -35.7366, -8.1437, 42.4652, -35.7403, -8.6704, 45.4379, -37.1909, -8.672299, 43.878498, -35.7366, -8.1437, 42.4652, -34.2949, -8.1437, 44.0212, -35.7403, -8.6704, 45.4379, -29.5455, -3.8058, 36.4474, -29.727, -4.9357, 39.5433, -31.153502, -4.9242997, 38.010498, -29.5455, -3.8058, 36.4474, -28.1288, -3.8291998, 37.976498, -29.727, -4.9357, 39.5433, -37.1909, -8.672299, 43.878498, -37.1326, -9.1778, 46.802498, -38.5812, -9.1777, 45.2297, -37.1909, -8.672299, 43.878498, -35.7403, -8.6704, 45.4379, -37.1326, -9.1778, 46.802498, -31.153502, -4.9242997, 38.010498, -31.445799, -6.1355996, 41.2283, -32.857998, -6.1155996, 39.6672, -31.153502, -4.9242997, 38.010498, -29.727, -4.9357, 39.5433, -31.445799, -6.1355996, 41.2283, -28.1288, -3.8291998, 37.976498, -28.3464, -4.9467, 41.0267, -29.727, -4.9357, 39.5433, -28.1288, -3.8291998, 37.976498, -26.7572, -3.8518999, 39.456898, -28.3464, -4.9467, 41.0267, -29.727, -4.9357, 39.5433, -30.0795, -6.1549, 42.738598, -31.445799, -6.1355996, 41.2283, -29.727, -4.9357, 39.5433, -28.3464, -4.9467, 41.0267, -30.0795, -6.1549, 42.738598, -38.8322, -9.7975, 48.4683, -39.1638, -10.4337, 51.7104, -40.572998, -10.4337, 50.1744, -38.8322, -9.7975, 48.4683, -37.44, -9.802, 50.008, -39.1638, -10.4337, 51.7104, -31.445799, -6.1355996, 41.2283, -31.612902, -7.2328997, 44.2532, -32.985, -7.2179, 42.7371, -31.445799, -6.1355996, 41.2283, -30.0795, -6.1549, 42.738598, -31.612902, -7.2328997, 44.2532, -37.1326, -9.1778, 46.802498, -37.44, -9.802, 50.008, -38.8322, -9.7975, 48.4683, -37.1326, -9.1778, 46.802498, -35.7329, -9.177899, 48.322197, -37.44, -9.802, 50.008, -32.985, -7.2179, 42.7371, -32.901, -8.1437, 45.5256, -34.2949, -8.1437, 44.0212, -32.985, -7.2179, 42.7371, -31.612902, -7.2328997, 44.2532, -32.901, -8.1437, 45.5256, -34.2949, -8.1437, 44.0212, -34.3383, -8.6685, 46.945, -35.7403, -8.6704, 45.4379, -34.2949, -8.1437, 44.0212, -32.901, -8.1437, 45.5256, -34.3383, -8.6685, 46.945, -35.7403, -8.6704, 45.4379, -35.7329, -9.177899, 48.322197, -37.1326, -9.1778, 46.802498, -35.7403, -8.6704, 45.4379, -34.3383, -8.6685, 46.945, -35.7329, -9.177899, 48.322197, -34.3383, -8.6685, 46.945, -34.0797, -9.1781, 50.1171, -35.7329, -9.177899, 48.322197, -34.3383, -8.6685, 46.945, -32.6904, -8.6662, 48.7166, -34.0797, -9.1781, 50.1171, -26.7572, -3.8518999, 39.456898, -26.7572, -4.9595, 42.7343, -28.3464, -4.9467, 41.0267, -28.3464, -4.9467, 41.0267, -28.496698, -6.1773996, 44.4883, -30.0795, -6.1549, 42.738598, -28.3464, -4.9467, 41.0267, -26.7572, -4.9595, 42.7343, -28.496698, -6.1773996, 44.4883, -37.44, -9.802, 50.008, -37.4804, -10.4337, 53.5453, -39.1638, -10.4337, 51.7104, -37.44, -9.802, 50.008, -35.786, -9.8073, 51.8372, -37.4804, -10.4337, 53.5453, -30.0795, -6.1549, 42.738598, -30.0148, -7.2503, 46.0191, -31.612902, -7.2328997, 44.2532, -30.0795, -6.1549, 42.738598, -28.496698, -6.1773996, 44.4883, -30.0148, -7.2503, 46.0191, -32.901, -8.1437, 45.5256, -32.6904, -8.6662, 48.7166, -34.3383, -8.6685, 46.945, -32.901, -8.1437, 45.5256, -31.270601, -8.1437, 47.285297, -32.6904, -8.6662, 48.7166, -35.7329, -9.177899, 48.322197, -35.786, -9.8073, 51.8372, -37.44, -9.802, 50.008, -35.7329, -9.177899, 48.322197, -34.0797, -9.1781, 50.1171, -35.786, -9.8073, 51.8372, -31.612902, -7.2328997, 44.2532, -31.270601, -8.1437, 47.285297, -32.901, -8.1437, 45.5256, -31.612902, -7.2328997, 44.2532, -30.0148, -7.2503, 46.0191, -31.270601, -8.1437, 47.285297, -26.7572, -4.9595, 42.7343, -26.7572, -6.2019997, 46.4111, -28.496698, -6.1773996, 44.4883, -35.786, -9.8073, 51.8372, -35.735397, -10.4337, 55.4473, -37.4804, -10.4337, 53.5453, -35.786, -9.8073, 51.8372, -34.0528, -9.8129, 53.753998, -35.735397, -10.4337, 55.4473, -28.496698, -6.1773996, 44.4883, -28.2762, -7.2693996, 47.940197, -30.0148, -7.2503, 46.0191, -28.496698, -6.1773996, 44.4883, -26.7572, -6.2019997, 46.4111, -28.2762, -7.2693996, 47.940197, -32.6904, -8.6662, 48.7166, -32.3284, -9.1783, 52.0186, -34.0797, -9.1781, 50.1171, -32.6904, -8.6662, 48.7166, -30.9289, -8.663899, 50.6101, -32.3284, -9.1783, 52.0186, -31.270601, -8.1437, 47.285297, -30.9289, -8.663899, 50.6101, -32.6904, -8.6662, 48.7166, -31.270601, -8.1437, 47.285297, -29.511599, -8.1437, 49.1838, -30.9289, -8.663899, 50.6101, -34.0797, -9.1781, 50.1171, -34.0528, -9.8129, 53.753998, -35.786, -9.8073, 51.8372, -34.0797, -9.1781, 50.1171, -32.3284, -9.1783, 52.0186, -34.0528, -9.8129, 53.753998, -30.0148, -7.2503, 46.0191, -29.511599, -8.1437, 49.1838, -31.270601, -8.1437, 47.285297, -30.0148, -7.2503, 46.0191, -28.2762, -7.2693996, 47.940197, -29.511599, -8.1437, 49.1838, -28.2762, -7.2693996, 47.940197, -27.9641, -8.1437, 50.853897, -29.511599, -8.1437, 49.1838, -28.2762, -7.2693996, 47.940197, -26.7572, -7.286, 49.6186, -27.9641, -8.1437, 50.853897, -34.0528, -9.8129, 53.753998, -34.1461, -10.4337, 57.1796, -35.735397, -10.4337, 55.4473, -34.0528, -9.8129, 53.753998, -32.4888, -9.8179, 55.4837, -34.1461, -10.4337, 57.1796, -26.7572, -6.2019997, 46.4111, -26.7572, -7.286, 49.6186, -28.2762, -7.2693996, 47.940197, -30.9289, -8.663899, 50.6101, -30.7632, -9.1784, 53.718, -32.3284, -9.1783, 52.0186, -30.9289, -8.663899, 50.6101, -29.3669, -8.6617, 52.2893, -30.7632, -9.1784, 53.718, -29.511599, -8.1437, 49.1838, -29.3669, -8.6617, 52.2893, -30.9289, -8.663899, 50.6101, -29.511599, -8.1437, 49.1838, -27.9641, -8.1437, 50.853897, -29.3669, -8.6617, 52.2893, -32.3284, -9.1783, 52.0186, -32.4888, -9.8179, 55.4837, -34.0528, -9.8129, 53.753998, -32.3284, -9.1783, 52.0186, -30.7632, -9.1784, 53.718, -32.4888, -9.8179, 55.4837, -29.3669, -8.6617, 52.2893, -29.525799, -9.1785, 55.061497, -30.7632, -9.1784, 53.718, -29.3669, -8.6617, 52.2893, -28.140299, -8.6601, 53.6078, -29.525799, -9.1785, 55.061497, -27.9641, -8.1437, 50.853897, -28.140299, -8.6601, 53.6078, -29.3669, -8.6617, 52.2893, -27.9641, -8.1437, 50.853897, -26.7572, -8.1437, 52.156597, -28.140299, -8.6601, 53.6078, -30.7632, -9.1784, 53.718, -31.2423, -9.821899, 56.862297, -32.4888, -9.8179, 55.4837, -30.7632, -9.1784, 53.718, -29.525799, -9.1785, 55.061497, -31.2423, -9.821899, 56.862297, -26.7572, -7.286, 49.6186, -26.7572, -8.1437, 52.156597, -27.9641, -8.1437, 50.853897, -32.4888, -9.8179, 55.4837, -32.870197, -10.4337, 58.570297, -34.1461, -10.4337, 57.1796, -32.4888, -9.8179, 55.4837, -31.2423, -9.821899, 56.862297, -32.870197, -10.4337, 58.570297, -28.140299, -8.6601, 53.6078, -28.1322, -9.1786995, 56.5746, -29.525799, -9.1785, 55.061497, -28.140299, -8.6601, 53.6078, -26.7572, -8.658199, 55.0947, -28.1322, -9.1786995, 56.5746, -26.7572, -8.1437, 52.156597, -26.7572, -8.658199, 55.0947, -28.140299, -8.6601, 53.6078, -29.525799, -9.1785, 55.061497, -29.8403, -9.8265, 58.4128, -31.2423, -9.821899, 56.862297, -29.525799, -9.1785, 55.061497, -28.1322, -9.1786995, 56.5746, -29.8403, -9.8265, 58.4128, -31.2423, -9.821899, 56.862297, -31.437601, -10.4337, 60.131798, -32.870197, -10.4337, 58.570297, -31.2423, -9.821899, 56.862297, -29.8403, -9.8265, 58.4128, -31.437601, -10.4337, 60.131798, -26.7572, -8.658199, 55.0947, -26.7572, -9.1788, 58.067497, -28.1322, -9.1786995, 56.5746, -28.1322, -9.1786995, 56.5746, -28.4674, -9.8309, 59.9312, -29.8403, -9.8265, 58.4128, -28.1322, -9.1786995, 56.5746, -26.7572, -9.1788, 58.067497, -28.4674, -9.8309, 59.9312, -29.8403, -9.8265, 58.4128, -30.044802, -10.4337, 61.649998, -31.437601, -10.4337, 60.131798, -29.8403, -9.8265, 58.4128, -28.4674, -9.8309, 59.9312, -30.044802, -10.4337, 61.649998, -28.4674, -9.8309, 59.9312, -28.2834, -10.4337, 63.569798, -30.044802, -10.4337, 61.649998, -28.4674, -9.8309, 59.9312, -26.7572, -9.8364, 61.822598, -28.2834, -10.4337, 63.569798, -26.7572, -9.1788, 58.067497, -26.7572, -9.8364, 61.822598, -28.4674, -9.8309, 59.9312, -26.7572, -9.8364, 61.822598, -26.7572, -10.4337, 65.2334, -28.2834, -10.4337, 63.569798, -39.7387, -7.144, 35.2747, -39.4027, -8.1437, 38.5083, -41.179398, -8.1437, 36.5907, -39.7387, -7.144, 35.2747, -37.9957, -7.1629996, 37.2007, -39.4027, -8.1437, 38.5083, -34.806297, -3.7187998, 30.769499, -34.7309, -4.8956, 34.1667, -36.474598, -4.8817, 32.293198, -34.806297, -3.7187998, 30.769499, -33.0801, -3.7473, 32.6325, -34.7309, -4.8956, 34.1667, -45.7693, -9.7752, 40.7963, -45.8121, -10.4337, 44.463898, -47.620697, -10.4337, 42.4927, -45.7693, -9.7752, 40.7963, -43.9867, -9.7809, 42.7677, -45.8121, -10.4337, 44.463898, -36.474598, -4.8817, 32.293198, -36.416798, -6.0650997, 35.7334, -38.147, -6.0406, 33.8208, -36.474598, -4.8817, 32.293198, -34.7309, -4.8956, 34.1667, -36.416798, -6.0650997, 35.7334, -38.147, -6.0406, 33.8208, -37.9957, -7.1629996, 37.2007, -39.7387, -7.144, 35.2747, -38.147, -6.0406, 33.8208, -36.416798, -6.0650997, 35.7334, -37.9957, -7.1629996, 37.2007, -41.179398, -8.1437, 36.5907, -40.895798, -8.6774, 39.8957, -42.6861, -8.6798, 37.9712, -41.179398, -8.1437, 36.5907, -39.4027, -8.1437, 38.5083, -40.895798, -8.6774, 39.8957, -42.6861, -8.6798, 37.9712, -42.2959, -9.1772995, 41.196598, -44.0855, -9.1771, 39.253498, -42.6861, -8.6798, 37.9712, -40.895798, -8.6774, 39.8957, -42.2959, -9.1772995, 41.196598, -44.0855, -9.1771, 39.253498, -43.9867, -9.7809, 42.7677, -45.7693, -9.7752, 40.7963, -44.0855, -9.1771, 39.253498, -42.2959, -9.1772995, 41.196598, -43.9867, -9.7809, 42.7677, -41.209297, -7.1278996, 33.6499, -41.179398, -8.1437, 36.5907, -42.6902, -8.1437, 34.960197, -41.209297, -7.1278996, 33.6499, -39.7387, -7.144, 35.2747, -41.179398, -8.1437, 36.5907, -36.2241, -3.6952999, 29.2393, -36.474598, -4.8817, 32.293198, -37.9203, -4.8701, 30.739899, -36.2241, -3.6952999, 29.2393, -34.806297, -3.7187998, 30.769499, -36.474598, -4.8817, 32.293198, -47.322998, -9.7702, 39.078, -47.620697, -10.4337, 42.4927, -49.212498, -10.4337, 40.7576, -47.322998, -9.7702, 39.078, -45.7693, -9.7752, 40.7963, -47.620697, -10.4337, 42.4927, -37.9203, -4.8701, 30.739899, -38.147, -6.0406, 33.8208, -39.5943, -6.0200996, 32.221, -37.9203, -4.8701, 30.739899, -36.474598, -4.8817, 32.293198, -38.147, -6.0406, 33.8208, -39.5943, -6.0200996, 32.221, -39.7387, -7.144, 35.2747, -41.209297, -7.1278996, 33.6499, -39.5943, -6.0200996, 32.221, -38.147, -6.0406, 33.8208, -39.7387, -7.144, 35.2747, -42.6902, -8.1437, 34.960197, -42.6861, -8.6798, 37.9712, -44.2212, -8.6819, 36.321, -42.6902, -8.1437, 34.960197, -41.179398, -8.1437, 36.5907, -42.6861, -8.6798, 37.9712, -44.2212, -8.6819, 36.321, -44.0855, -9.1771, 39.253498, -45.6317, -9.177, 37.5747, -44.2212, -8.6819, 36.321, -42.6861, -8.6798, 37.9712, -44.0855, -9.1771, 39.253498, -45.6317, -9.177, 37.5747, -45.7693, -9.7752, 40.7963, -47.322998, -9.7702, 39.078, -45.6317, -9.177, 37.5747, -44.0855, -9.1771, 39.253498, -45.7693, -9.7752, 40.7963, -42.4946, -7.1138, 32.2296, -42.6902, -8.1437, 34.960197, -44.0089, -8.1437, 33.5369, -42.4946, -7.1138, 32.2296, -41.209297, -7.1278996, 33.6499, -42.6902, -8.1437, 34.960197, -37.4711, -3.6747, 27.8934, -37.9203, -4.8701, 30.739899, -39.1893, -4.8599997, 29.3764, -37.4711, -3.6747, 27.8934, -36.2241, -3.6952999, 29.2393, -37.9203, -4.8701, 30.739899, -48.6723, -9.7657995, 37.585697, -49.212498, -10.4337, 40.7576, -50.5928, -10.4337, 39.2532, -48.6723, -9.7657995, 37.585697, -47.322998, -9.7702, 39.078, -49.212498, -10.4337, 40.7576, -39.1893, -4.8599997, 29.3764, -39.5943, -6.0200996, 32.221, -40.8617, -6.0021, 30.82, -39.1893, -4.8599997, 29.3764, -37.9203, -4.8701, 30.739899, -39.5943, -6.0200996, 32.221, -40.8617, -6.0021, 30.82, -41.209297, -7.1278996, 33.6499, -42.4946, -7.1138, 32.2296, -40.8617, -6.0021, 30.82, -39.5943, -6.0200996, 32.221, -41.209297, -7.1278996, 33.6499, -44.0089, -8.1437, 33.5369, -44.2212, -8.6819, 36.321, -45.559097, -8.6837, 34.882698, -44.0089, -8.1437, 33.5369, -42.6902, -8.1437, 34.960197, -44.2212, -8.6819, 36.321, -45.559097, -8.6837, 34.882698, -45.6317, -9.177, 37.5747, -46.9771, -9.1769, 36.114, -45.559097, -8.6837, 34.882698, -44.2212, -8.6819, 36.321, -45.6317, -9.177, 37.5747, -46.9771, -9.1769, 36.114, -47.322998, -9.7702, 39.078, -48.6723, -9.7657995, 37.585697, -46.9771, -9.1769, 36.114, -45.6317, -9.177, 37.5747, -47.322998, -9.7702, 39.078, -43.5821, -7.1018996, 31.028, -44.0089, -8.1437, 33.5369, -45.125797, -8.1437, 32.3315, -43.5821, -7.1018996, 31.028, -42.4946, -7.1138, 32.2296, -44.0089, -8.1437, 33.5369, -38.5239, -3.6573, 26.7572, -39.1893, -4.8599997, 29.3764, -40.2616, -4.8514, 28.2242, -38.5239, -3.6573, 26.7572, -37.4711, -3.6747, 27.8934, -39.1893, -4.8599997, 29.3764, -49.816998, -9.7621, 36.319798, -50.5928, -10.4337, 39.2532, -51.764698, -10.4337, 37.9757, -49.816998, -9.7621, 36.319798, -48.6723, -9.7657995, 37.585697, -50.5928, -10.4337, 39.2532, -40.2616, -4.8514, 28.2242, -40.8617, -6.0021, 30.82, -41.9332, -5.9869, 29.6356, -40.2616, -4.8514, 28.2242, -39.1893, -4.8599997, 29.3764, -40.8617, -6.0021, 30.82, -41.9332, -5.9869, 29.6356, -42.4946, -7.1138, 32.2296, -43.5821, -7.1018996, 31.028, -41.9332, -5.9869, 29.6356, -40.8617, -6.0021, 30.82, -42.4946, -7.1138, 32.2296, -45.125797, -8.1437, 32.3315, -45.559097, -8.6837, 34.882698, -46.692997, -8.6852, 33.6638, -45.125797, -8.1437, 32.3315, -44.0089, -8.1437, 33.5369, -45.559097, -8.6837, 34.882698, -46.692997, -8.6852, 33.6638, -46.9771, -9.1769, 36.114, -48.118, -9.1768, 34.875298, -46.692997, -8.6852, 33.6638, -45.559097, -8.6837, 34.882698, -46.9771, -9.1769, 36.114, -48.118, -9.1768, 34.875298, -48.6723, -9.7657995, 37.585697, -49.816998, -9.7621, 36.319798, -48.118, -9.1768, 34.875298, -46.9771, -9.1769, 36.114, -48.6723, -9.7657995, 37.585697, -44.939, -7.0871, 29.5287, -45.125797, -8.1437, 32.3315, -46.506897, -8.1437, 30.840899, -44.939, -7.0871, 29.5287, -43.5821, -7.1018996, 31.028, -45.125797, -8.1437, 32.3315, -51.1965, -9.7577, 34.794, -51.764698, -10.4337, 37.9757, -53.163, -10.4337, 36.4517, -51.1965, -9.7577, 34.794, -49.816998, -9.7621, 36.319798, -51.764698, -10.4337, 37.9757, -41.627, -4.8403997, 26.7572, -41.9332, -5.9869, 29.6356, -43.2833, -5.9677997, 28.143099, -41.627, -4.8403997, 26.7572, -40.2616, -4.8514, 28.2242, -41.9332, -5.9869, 29.6356, -43.2833, -5.9677997, 28.143099, -43.5821, -7.1018996, 31.028, -44.939, -7.0871, 29.5287, -43.2833, -5.9677997, 28.143099, -41.9332, -5.9869, 29.6356, -43.5821, -7.1018996, 31.028, -46.506897, -8.1437, 30.840899, -46.692997, -8.6852, 33.6638, -48.083, -8.687099, 32.1695, -46.506897, -8.1437, 30.840899, -45.125797, -8.1437, 32.3315, -46.692997, -8.6852, 33.6638, -48.083, -8.687099, 32.1695, -48.118, -9.1768, 34.875298, -49.5056, -9.1765995, 33.3687, -48.083, -8.687099, 32.1695, -46.692997, -8.6852, 33.6638, -48.118, -9.1768, 34.875298, -49.5056, -9.1765995, 33.3687, -49.816998, -9.7621, 36.319798, -51.1965, -9.7577, 34.794, -49.5056, -9.1765995, 33.3687, -48.118, -9.1768, 34.875298, -49.816998, -9.7621, 36.319798, -46.202698, -7.0731997, 28.132399, -46.506897, -8.1437, 30.840899, -47.7968, -8.1437, 29.4487, -46.202698, -7.0731997, 28.132399, -44.939, -7.0871, 29.5287, -46.506897, -8.1437, 30.840899, -52.4946, -9.7535, 33.3584, -53.163, -10.4337, 36.4517, -54.4828, -10.4337, 35.0131, -52.4946, -9.7535, 33.3584, -51.1965, -9.7577, 34.794, -53.163, -10.4337, 36.4517, -44.537098, -5.95, 26.7572, -44.939, -7.0871, 29.5287, -46.202698, -7.0731997, 28.132399, -44.537098, -5.95, 26.7572, -43.2833, -5.9677997, 28.143099, -44.939, -7.0871, 29.5287, -47.7968, -8.1437, 29.4487, -48.083, -8.687099, 32.1695, -49.384697, -8.6889, 30.770199, -47.7968, -8.1437, 29.4487, -46.506897, -8.1437, 30.840899, -48.083, -8.687099, 32.1695, -49.384697, -8.6889, 30.770199, -49.5056, -9.1765995, 33.3687, -50.808, -9.176499, 31.954699, -49.384697, -8.6889, 30.770199, -48.083, -8.687099, 32.1695, -49.5056, -9.1765995, 33.3687, -50.808, -9.176499, 31.954699, -51.1965, -9.7577, 34.794, -52.4946, -9.7535, 33.3584, -50.808, -9.176499, 31.954699, -49.5056, -9.1765995, 33.3687, -51.1965, -9.7577, 34.794, -47.4473, -7.0596, 26.7572, -47.7968, -8.1437, 29.4487, -49.074398, -8.1437, 28.0697, -47.4473, -7.0596, 26.7572, -46.202698, -7.0731997, 28.132399, -47.7968, -8.1437, 29.4487, -53.7992, -9.7493, 31.915699, -54.4828, -10.4337, 35.0131, -55.8173, -10.4337, 33.5585, -53.7992, -9.7493, 31.915699, -52.4946, -9.7535, 33.3584, -54.4828, -10.4337, 35.0131, -49.074398, -8.1437, 28.0697, -49.384697, -8.6889, 30.770199, -50.6806, -8.690599, 29.3771, -49.074398, -8.1437, 28.0697, -47.7968, -8.1437, 29.4487, -49.384697, -8.6889, 30.770199, -50.6806, -8.690599, 29.3771, -50.808, -9.176499, 31.954699, -52.1102, -9.1764, 30.5408, -50.6806, -8.690599, 29.3771, -49.384697, -8.6889, 30.770199, -50.808, -9.176499, 31.954699, -52.1102, -9.1764, 30.5408, -52.4946, -9.7535, 33.3584, -53.7992, -9.7493, 31.915699, -52.1102, -9.1764, 30.5408, -50.808, -9.176499, 31.954699, -52.4946, -9.7535, 33.3584, -50.290497, -8.1437, 26.7572, -50.6806, -8.690599, 29.3771, -51.906998, -8.6923, 28.058699, -50.290497, -8.1437, 26.7572, -49.074398, -8.1437, 28.0697, -50.6806, -8.690599, 29.3771, -51.906998, -8.6923, 28.058699, -52.1102, -9.1764, 30.5408, -53.3363, -9.1763, 29.2095, -51.906998, -8.6923, 28.058699, -50.6806, -8.690599, 29.3771, -52.1102, -9.1764, 30.5408, -55.0202, -9.745399, 30.5653, -55.8173, -10.4337, 33.5585, -57.058, -10.4337, 32.2062, -55.0202, -9.745399, 30.5653, -53.7992, -9.7493, 31.915699, -55.8173, -10.4337, 33.5585, -53.3363, -9.1763, 29.2095, -53.7992, -9.7493, 31.915699, -55.0202, -9.745399, 30.5653, -53.3363, -9.1763, 29.2095, -52.1102, -9.1764, 30.5408, -53.7992, -9.7493, 31.915699, -53.117798, -8.6939, 26.7572, -53.3363, -9.1763, 29.2095, -54.5561, -9.1761, 27.885199, -53.117798, -8.6939, 26.7572, -51.906998, -8.6923, 28.058699, -53.3363, -9.1763, 29.2095, -56.245598, -9.7414, 29.2101, -57.058, -10.4337, 32.2062, -58.316597, -10.4337, 30.834398, -56.245598, -9.7414, 29.2101, -55.0202, -9.745399, 30.5653, -57.058, -10.4337, 32.2062, -54.5561, -9.1761, 27.885199, -55.0202, -9.745399, 30.5653, -56.245598, -9.7414, 29.2101, -54.5561, -9.1761, 27.885199, -53.3363, -9.1763, 29.2095, -55.0202, -9.745399, 30.5653, -57.2836, -9.7381, 28.062199, -58.316597, -10.4337, 30.834398, -59.3761, -10.4337, 29.679499, -57.2836, -9.7381, 28.062199, -56.245598, -9.7414, 29.2101, -58.316597, -10.4337, 30.834398, -55.5951, -9.176, 26.7572, -56.245598, -9.7414, 29.2101, -57.2836, -9.7381, 28.062199, -55.5951, -9.176, 26.7572, -54.5561, -9.1761, 27.885199, -56.245598, -9.7414, 29.2101, -58.463497, -9.7343, 26.7572, -59.3761, -10.4337, 29.679499, -60.611, -10.4337, 28.3335, -58.463497, -9.7343, 26.7572, -57.2836, -9.7381, 28.062199, -59.3761, -10.4337, 29.679499, 20.0676, 0.0021, 3.3446, 23.4123, 0, -0.000100016594, 23.4123, 0, 3.3446, 20.0676, 0.0021, 3.3446, 20.229, 0.030399999, -0.05219996, 23.4123, 0, -0.000100016594, 6.6893, 3.3913999, 3.3446, 10.0336, 3.1929998, -0.000100016594, 10.0336, 3.1929998, 3.3446, 6.6893, 3.3913999, 3.3446, 6.6893, 3.3913999, -0.000100016594, 10.0336, 3.1929998, -0.000100016594, 23.4123, 0, 3.3446, 26.7582, -0.83089995, 6.6893, 23.4123, 0, 6.6893, 23.4123, 0, 3.3446, 26.7575, -0.7312, 3.3446, 26.7582, -0.83089995, 6.6893, 23.4123, 0, 6.6893, 26.7582, -0.83089995, 6.6893, 23.4123, -0.35529998, 10.033899, 20.0676, 0.0021, 3.3446, 20.0676, 0, 10.0338, 17.491, 0.0034999999, 7.408, 17.491, 0.0034999999, 7.408, 14.0257, 0.0442, 7.3251996, 20.0676, 0.0021, 3.3446, 20.0676, 0, 10.0338, 23.4123, 0, 6.6893, 23.4123, -0.35529998, 10.033899, 20.0676, 0.0021, 3.3446, 23.4123, 0, 3.3446, 23.4123, 0, 6.6893, 12.7055, 1.032, 4.0926, 11.277899, 2.3706, -0.000100016594, 14.261799, 0.9069, 1.1804999, 12.7055, 1.032, 4.0926, 11.2782, 2.1174, 3.3446, 11.277899, 2.3706, -0.000100016594, 10.0336, 3.1929998, 3.3446, 11.277899, 2.3706, -0.000100016594, 11.2782, 2.1174, 3.3446, 10.0336, 3.1929998, 3.3446, 10.0336, 3.1929998, -0.000100016594, 11.277899, 2.3706, -0.000100016594, 20.229, 0.030399999, -0.05219996, 20.0676, 0.0021, 3.3446, 14.261799, 0.9069, 1.1804999, 14.0257, 0.0442, 7.3251996, 14.261799, 0.9069, 1.1804999, 20.0676, 0.0021, 3.3446, 12.7055, 1.032, 4.0926, 14.261799, 0.9069, 1.1804999, 14.0257, 0.0442, 7.3251996, 26.7575, -0.7312, 3.3446, 23.4123, 0, 3.3446, 23.4123, 0, -0.000100016594, 20.0676, 0, 10.0338, 20.0676, 0.0021, 3.3446, 23.4123, 0, 6.6893, 17.253021, -20.068901, 7.9789844, 17.227175, -19.735691, 9.261204, 17.026821, -20.231876, 8.073181, 17.253021, -20.068901, 7.9789844, 17.434578, -19.605183, 9.12792, 17.227175, -19.735691, 9.261204, 17.434578, -19.605183, 9.12792, 17.571707, -18.471199, 10.41548, 17.227175, -19.735691, 9.261204, 17.434578, -19.605183, 9.12792, 17.629164, -18.471626, 10.358021, 17.571707, -18.471199, 10.41548, 17.227175, -19.735691, 9.261204, 17.571707, -18.471199, 10.41548, 17.608658, -18.470558, 10.487461, 17.026821, -20.231876, 8.073181, 17.227175, -19.735691, 9.261204, 17.33739, -19.946938, 9.406449, 17.227175, -19.735691, 9.261204, 17.608658, -18.470558, 10.487461, 17.33739, -19.946938, 9.406449, 17.026821, -20.231876, 8.073181, 17.33739, -19.946938, 9.406449, 17.131271, -20.495667, 8.150929, 17.33739, -19.946938, 9.406449, 17.608658, -18.470558, 10.487461, 17.688543, -18.470558, 10.474859, 17.131271, -20.495667, 8.150929, 17.33739, -19.946938, 9.406449, 17.61293, -19.946938, 9.362875, 17.33739, -19.946938, 9.406449, 17.688543, -18.470558, 10.474859, 17.61293, -19.946938, 9.362875, 17.131271, -20.495667, 8.150929, 17.61293, -19.946938, 9.362875, 17.421762, -20.495667, 8.105006, 17.61293, -19.946938, 9.362875, 17.688543, -18.470558, 10.474859, 17.701359, -18.471199, 10.394974, 17.421762, -20.495667, 8.105006, 17.61293, -19.946938, 9.362875, 17.67295, -19.735691, 9.190718, 17.61293, -19.946938, 9.362875, 17.701359, -18.471199, 10.394974, 17.67295, -19.735691, 9.190718, 17.67295, -19.735691, 9.190718, 17.701359, -18.471199, 10.394974, 17.629164, -18.471626, 10.358021, 17.421762, -20.495667, 8.105006, 17.67295, -19.735691, 9.190718, 17.497162, -20.231876, 7.998849, 17.67295, -19.735691, 9.190718, 17.629164, -18.471626, 10.358021, 17.434578, -19.605183, 9.12792, 17.497162, -20.231876, 7.998849, 17.67295, -19.735691, 9.190718, 17.434578, -19.605183, 9.12792, 17.497162, -20.231876, 7.998849, 17.434578, -19.605183, 9.12792, 17.253021, -20.068901, 7.9789844, 16.28308, -22.030998, 7.9881697, 17.28207, -19.97385, 8.213941, 16.7107, -22.030998, 8.612513, 16.28308, -22.030998, 7.9881697, 17.120804, -19.944588, 7.9881687, 17.28207, -19.97385, 8.213941, 17.120804, -19.944588, 7.9881687, 17.36345, -17.907732, 8.087917, 17.28207, -19.97385, 8.213941, 17.120804, -19.944588, 7.9881687, 17.291254, -17.900043, 7.9881682, 17.36345, -17.907732, 8.087917, 17.28207, -19.97385, 8.213941, 17.36345, -17.907732, 8.087917, 17.480074, -17.92012, 8.049685, 16.7107, -22.030998, 8.612513, 17.28207, -19.97385, 8.213941, 17.543299, -20.021269, 8.127647, 17.28207, -19.97385, 8.213941, 17.480074, -17.92012, 8.049685, 17.543299, -20.021269, 8.127647, 16.7107, -22.030998, 8.612513, 17.543299, -20.021269, 8.127647, 17.402325, -22.030998, 8.373924, 17.543299, -20.021269, 8.127647, 17.480074, -17.92012, 8.049685, 17.480074, -17.92012, 7.926439, 17.402325, -22.030998, 8.373924, 17.543299, -20.021269, 8.127647, 17.543299, -20.02127, 7.8486905, 17.543299, -20.021269, 8.127647, 17.480074, -17.92012, 7.926439, 17.543299, -20.02127, 7.8486905, 17.402325, -22.030998, 8.373924, 17.543299, -20.02127, 7.8486905, 17.402325, -22.030998, 7.602201, 17.543299, -20.02127, 7.8486905, 17.480074, -17.92012, 7.926439, 17.36345, -17.907732, 7.8884187, 17.402325, -22.030998, 7.602201, 17.543299, -20.02127, 7.8486905, 17.28207, -19.97385, 7.7623973, 17.543299, -20.02127, 7.8486905, 17.36345, -17.907732, 7.8884187, 17.28207, -19.97385, 7.7623973, 17.28207, -19.97385, 7.7623973, 17.36345, -17.907732, 7.8884187, 17.291254, -17.900043, 7.9881682, 17.402325, -22.030998, 7.602201, 17.28207, -19.97385, 7.7623973, 16.7107, -22.030998, 7.363827, 17.28207, -19.97385, 7.7623973, 17.291254, -17.900043, 7.9881682, 17.120804, -19.944588, 7.9881687, 16.7107, -22.030998, 7.363827, 17.28207, -19.97385, 7.7623973, 17.120804, -19.944588, 7.9881687, 16.7107, -22.030998, 7.363827, 17.120804, -19.944588, 7.9881687, 16.28308, -22.030998, 7.9881697, 17.194283, -19.802975, 7.602841, 18.323994, -19.463997, 6.9496627, 17.395275, -19.968939, 7.750009, 17.194283, -19.802975, 7.602841, 18.09865, -19.331139, 6.83902, 18.323994, -19.463997, 6.9496627, 18.09865, -19.331139, 6.83902, 19.147194, -18.177078, 6.041237, 18.323994, -19.463997, 6.9496627, 18.09865, -19.331139, 6.83902, 19.067095, -18.177505, 6.0213723, 19.147194, -18.177078, 6.041237, 18.323994, -19.463997, 6.9496627, 19.147194, -18.177078, 6.041237, 19.190767, -18.176437, 5.9711766, 17.395275, -19.968939, 7.750009, 18.323994, -19.463997, 6.9496627, 18.392344, -19.679089, 6.777077, 18.323994, -19.463997, 6.9496627, 19.190767, -18.176437, 5.9711766, 18.392344, -19.679089, 6.777077, 17.395275, -19.968939, 7.750009, 18.392344, -19.679089, 6.777077, 17.408092, -20.237429, 7.618006, 18.392344, -19.679089, 6.777077, 19.190767, -18.176437, 5.9711766, 19.137367, -18.176437, 5.908166, 17.408092, -20.237429, 7.618006, 18.392344, -19.679089, 6.777077, 18.209078, -19.679089, 6.560063, 18.392344, -19.679089, 6.777077, 19.137367, -18.176437, 5.908166, 18.209078, -19.679089, 6.560063, 17.408092, -20.237429, 7.618006, 18.209078, -19.679089, 6.560063, 17.214787, -20.237429, 7.389458, 18.209078, -19.679089, 6.560063, 19.137367, -18.176437, 5.908166, 19.061113, -18.177078, 5.9391375, 17.214787, -20.237429, 7.389458, 18.209078, -19.679089, 6.560063, 18.027735, -19.463997, 6.5985103, 18.209078, -19.679089, 6.560063, 19.061113, -18.177078, 5.9391375, 18.027735, -19.463997, 6.5985103, 18.027735, -19.463997, 6.5985103, 19.061113, -18.177078, 5.9391375, 19.067095, -18.177505, 6.0213723, 17.214787, -20.237429, 7.389458, 18.027735, -19.463997, 6.5985103, 17.082785, -19.968939, 7.379846, 18.027735, -19.463997, 6.5985103, 19.067095, -18.177505, 6.0213723, 18.09865, -19.331139, 6.83902, 17.082785, -19.968939, 7.379846, 18.027735, -19.463997, 6.5985103, 18.09865, -19.331139, 6.83902, 17.082785, -19.968939, 7.379846, 18.09865, -19.331139, 6.83902, 17.194283, -19.802975, 7.602841, 19.916355, -18.10766, 4.50975, 18.669378, -17.361996, 4.594761, 18.997677, -18.38085, 4.7551727, 18.997677, -18.38085, 4.7551727, 18.669378, -17.361996, 4.594761, 17.938025, -17.356228, 5.7366476, 18.997677, -18.38085, 4.7551727, 17.938025, -17.356228, 5.7366476, 18.45151, -18.10766, 5.7464733, 19.916355, -18.10766, 4.50975, 19.861246, -17.356228, 4.1126738, 18.669378, -17.361996, 4.594761, 20.759848, -18.352869, 5.1768117, 19.861246, -17.356228, 4.1126738, 19.916355, -18.10766, 4.50975, 18.669378, -17.361996, 4.594761, 18.361372, -16.59625, 5.750745, 17.938025, -17.356228, 5.7366476, 20.759848, -18.352869, 5.1768117, 20.69171, -17.339567, 4.9839334, 19.861246, -17.356228, 4.1126738, 20.916626, -18.072844, 6.2943482, 20.69171, -17.339567, 4.9839334, 20.759848, -18.352869, 5.1768117, 19.861246, -17.356228, 4.1126738, 18.80138, -16.33182, 5.093936, 18.669378, -17.361996, 4.594761, 18.669378, -17.361996, 4.594761, 18.80138, -16.33182, 5.093936, 18.361372, -16.59625, 5.750745, 20.69171, -17.339567, 4.9839334, 19.58528, -16.596252, 4.7173653, 19.861246, -17.356228, 4.1126738, 19.861246, -17.356228, 4.1126738, 19.58528, -16.596252, 4.7173653, 18.80138, -16.33182, 5.093936, 20.916626, -18.072844, 6.2943482, 20.971521, -17.322693, 6.3201933, 20.69171, -17.339567, 4.9839334, 20.971521, -17.322693, 6.3201933, 20.916626, -18.072844, 6.2943482, 20.598795, -18.324886, 7.2226386, 20.69171, -17.339567, 4.9839334, 20.07292, -16.326265, 5.255842, 19.58528, -16.596252, 4.7173653, 20.971521, -17.322693, 6.3201933, 20.07292, -16.326265, 5.255842, 20.69171, -17.339567, 4.9839334, 19.58528, -16.596252, 4.7173653, 19.312944, -15.988569, 5.813969, 18.80138, -16.33182, 5.093936, 19.58528, -16.596252, 4.7173653, 20.07292, -16.326265, 5.255842, 19.312944, -15.988569, 5.813969, 20.971521, -17.322693, 6.3201933, 20.39054, -16.581512, 6.067722, 20.07292, -16.326265, 5.255842, 20.971521, -17.322693, 6.3201933, 20.598795, -18.324886, 7.2226386, 20.51122, -17.317139, 7.2331047, 20.39054, -16.581512, 6.067722, 20.971521, -17.322693, 6.3201933, 20.51122, -17.317139, 7.2331047, 20.51122, -17.317139, 7.2331047, 20.598795, -18.324886, 7.2226386, 19.692719, -18.072844, 7.327728, 20.07292, -16.326265, 5.255842, 20.39054, -16.581512, 6.067722, 19.963133, -16.320711, 6.583985, 20.39054, -16.581512, 6.067722, 20.51122, -17.317139, 7.2331047, 19.963133, -16.320711, 6.583985, 20.07292, -16.326265, 5.255842, 19.963133, -16.320711, 6.583985, 19.312944, -15.988569, 5.813969, 20.51122, -17.317139, 7.2331047, 19.692719, -18.072844, 7.327728, 19.590406, -17.322693, 7.4862165, 19.963133, -16.320711, 6.583985, 20.51122, -17.317139, 7.2331047, 19.590406, -17.322693, 7.4862165, 18.836624, -18.352867, 6.800999, 19.590406, -17.322693, 7.4862165, 19.692719, -18.072844, 7.327728, 19.312944, -15.988569, 5.813969, 19.963133, -16.320711, 6.583985, 19.407354, -16.581512, 6.8975444, 19.963133, -16.320711, 6.583985, 19.590406, -17.322693, 7.4862165, 19.407354, -16.581512, 6.8975444, 18.836624, -18.352867, 6.800999, 18.488676, -17.339567, 6.8439317, 19.590406, -17.322693, 7.4862165, 18.488676, -17.339567, 6.8439317, 19.407354, -16.581512, 6.8975444, 19.590406, -17.322693, 7.4862165, 18.45151, -18.10766, 5.7464733, 18.488676, -17.339567, 6.8439317, 18.836624, -18.352867, 6.800999, 18.45151, -18.10766, 5.7464733, 17.938025, -17.356228, 5.7366476, 18.488676, -17.339567, 6.8439317, 18.488676, -17.339567, 6.8439317, 18.691593, -16.326265, 6.4220786, 19.407354, -16.581512, 6.8975444, 19.312944, -15.988569, 5.813969, 19.407354, -16.581512, 6.8975444, 18.691593, -16.326265, 6.4220786, 17.938025, -17.356228, 5.7366476, 18.691593, -16.326265, 6.4220786, 18.488676, -17.339567, 6.8439317, 18.80138, -16.33182, 5.093936, 19.312944, -15.988569, 5.813969, 18.691593, -16.326265, 6.4220786, 17.938025, -17.356228, 5.7366476, 18.361372, -16.59625, 5.750745, 18.691593, -16.326265, 6.4220786, 18.80138, -16.33182, 5.093936, 18.691593, -16.326265, 6.4220786, 18.361372, -16.59625, 5.750745, 20.916626, -18.072844, 6.2943482, 19.867655, -18.690779, 6.0138965, 20.598795, -18.324886, 7.2226386, 20.916626, -18.072844, 6.2943482, 20.759848, -18.352869, 5.1768117, 19.867655, -18.690779, 6.0138965, 20.598795, -18.324886, 7.2226386, 19.867655, -18.690779, 6.0138965, 18.836624, -18.352867, 6.800999, 20.598795, -18.324886, 7.2226386, 18.836624, -18.352867, 6.800999, 19.692719, -18.072844, 7.327728, 19.867655, -18.690779, 6.0138965, 18.45151, -18.10766, 5.7464733, 18.836624, -18.352867, 6.800999, 19.867655, -18.690779, 6.0138965, 18.997677, -18.38085, 4.7551727, 18.45151, -18.10766, 5.7464733, 20.759848, -18.352869, 5.1768117, 18.997677, -18.38085, 4.7551727, 19.867655, -18.690779, 6.0138965, 20.759848, -18.352869, 5.1768117, 19.916355, -18.10766, 4.50975, 18.997677, -18.38085, 4.7551727, 15.432323, -17.738777, 11.597307, 17.151134, -15.819399, 12.648415, 17.029385, -18.463295, 12.383129, 17.029385, -18.463295, 12.383129, 17.151134, -15.819399, 12.648415, 19.233913, -15.752116, 11.624861, 17.029385, -18.463295, 12.383129, 19.233913, -15.752116, 11.624861, 18.862041, -17.774446, 11.419596, 15.432323, -17.738777, 11.597307, 15.174299, -15.860622, 12.197086, 17.151134, -15.819399, 12.648415, 14.790466, -18.280245, 9.459635, 15.174299, -15.860622, 12.197086, 15.432323, -17.738777, 11.597307, 17.151134, -15.819399, 12.648415, 18.632425, -13.811806, 11.039606, 19.233913, -15.752116, 11.624861, 14.790466, -18.280245, 9.459635, 14.663164, -15.672873, 9.612782, 15.174299, -15.860622, 12.197086, 15.765963, -17.546755, 7.471905, 14.663164, -15.672873, 9.612782, 14.790466, -18.280245, 9.459635, 15.174299, -15.860622, 12.197086, 17.378614, -13.149656, 11.438818, 17.151134, -15.819399, 12.648415, 17.151134, -15.819399, 12.648415, 17.378614, -13.149656, 11.438818, 18.632425, -13.811806, 11.039606, 14.663164, -15.672873, 9.612782, 16.05389, -13.860292, 11.293999, 15.174299, -15.860622, 12.197086, 15.174299, -15.860622, 12.197086, 16.05389, -13.860292, 11.293999, 17.378614, -13.149656, 11.438818, 15.765963, -17.546755, 7.471905, 15.501957, -15.53254, 7.0716248, 14.663164, -15.672873, 9.612782, 15.501957, -15.53254, 7.0716248, 15.765963, -17.546755, 7.471905, 17.558678, -18.333218, 6.7520857, 14.663164, -15.672873, 9.612782, 15.88579, -13.113132, 9.809076, 16.05389, -13.860292, 11.293999, 15.501957, -15.53254, 7.0716248, 15.88579, -13.113132, 9.809076, 14.663164, -15.672873, 9.612782, 16.05389, -13.860292, 11.293999, 17.454443, -12.259815, 9.87465, 17.378614, -13.149656, 11.438818, 16.05389, -13.860292, 11.293999, 15.88579, -13.113132, 9.809076, 17.454443, -12.259815, 9.87465, 15.501957, -15.53254, 7.0716248, 16.199562, -13.714193, 8.2419195, 15.88579, -13.113132, 9.809076, 15.501957, -15.53254, 7.0716248, 17.558678, -18.333218, 6.7520857, 17.574484, -15.715379, 6.749949, 16.199562, -13.714193, 8.2419195, 15.501957, -15.53254, 7.0716248, 17.574484, -15.715379, 6.749949, 17.574484, -15.715379, 6.749949, 17.558678, -18.333218, 6.7520857, 19.186922, -17.80478, 7.9181085, 15.88579, -13.113132, 9.809076, 16.199562, -13.714193, 8.2419195, 17.48456, -13.123599, 8.222482, 16.199562, -13.714193, 8.2419195, 17.574484, -15.715379, 6.749949, 17.48456, -13.123599, 8.222482, 15.88579, -13.113132, 9.809076, 17.48456, -13.123599, 8.222482, 17.454443, -12.259815, 9.87465, 17.574484, -15.715379, 6.749949, 19.186922, -17.80478, 7.9181085, 19.541065, -15.924276, 7.9029427, 17.48456, -13.123599, 8.222482, 17.574484, -15.715379, 6.749949, 19.541065, -15.924276, 7.9029427, 19.797594, -18.516268, 9.675581, 19.541065, -15.924276, 7.9029427, 19.186922, -17.80478, 7.9181085, 17.454443, -12.259815, 9.87465, 17.48456, -13.123599, 8.222482, 18.768915, -13.888488, 8.611227, 17.48456, -13.123599, 8.222482, 19.541065, -15.924276, 7.9029427, 18.768915, -13.888488, 8.611227, 19.797594, -18.516268, 9.675581, 20.062454, -15.861905, 9.785582, 19.541065, -15.924276, 7.9029427, 20.062454, -15.861905, 9.785582, 18.768915, -13.888488, 8.611227, 19.541065, -15.924276, 7.9029427, 18.862041, -17.774446, 11.419596, 20.062454, -15.861905, 9.785582, 19.797594, -18.516268, 9.675581, 18.862041, -17.774446, 11.419596, 19.233913, -15.752116, 11.624861, 20.062454, -15.861905, 9.785582, 20.062454, -15.861905, 9.785582, 18.977385, -13.160124, 9.852436, 18.768915, -13.888488, 8.611227, 17.454443, -12.259815, 9.87465, 18.768915, -13.888488, 8.611227, 18.977385, -13.160124, 9.852436, 19.233913, -15.752116, 11.624861, 18.977385, -13.160124, 9.852436, 20.062454, -15.861905, 9.785582, 17.378614, -13.149656, 11.438818, 17.454443, -12.259815, 9.87465, 18.977385, -13.160124, 9.852436, 19.233913, -15.752116, 11.624861, 18.632425, -13.811806, 11.039606, 18.977385, -13.160124, 9.852436, 17.378614, -13.149656, 11.438818, 18.977385, -13.160124, 9.852436, 18.632425, -13.811806, 11.039606, 15.765963, -17.546755, 7.471905, 17.271177, -19.275177, 9.523714, 17.558678, -18.333218, 6.7520857, 15.765963, -17.546755, 7.471905, 14.790466, -18.280245, 9.459635, 17.271177, -19.275177, 9.523714, 17.558678, -18.333218, 6.7520857, 17.271177, -19.275177, 9.523714, 19.797594, -18.516268, 9.675581, 17.558678, -18.333218, 6.7520857, 19.797594, -18.516268, 9.675581, 19.186922, -17.80478, 7.9181085, 17.271177, -19.275177, 9.523714, 18.862041, -17.774446, 11.419596, 19.797594, -18.516268, 9.675581, 17.271177, -19.275177, 9.523714, 17.029385, -18.463295, 12.383129, 18.862041, -17.774446, 11.419596, 14.790466, -18.280245, 9.459635, 17.029385, -18.463295, 12.383129, 17.271177, -19.275177, 9.523714, 14.790466, -18.280245, 9.459635, 15.432323, -17.738777, 11.597307, 17.029385, -18.463295, 12.383129, 6.450511, 5.6386614, 17.721281, 5.116558, 6.049283, 18.568323, 6.1998763, 5.437825, 17.553066, 6.450511, 5.6386614, 17.721281, 5.394739, 6.2101097, 18.690458, 5.116558, 6.049283, 18.568323, 5.394739, 6.2101097, 18.690458, 4.166137, 7.607539, 19.708622, 5.116558, 6.049283, 18.568323, 5.394739, 6.2101097, 18.690458, 4.2640667, 7.6070127, 19.728611, 4.166137, 7.607539, 19.708622, 5.116558, 6.049283, 18.568323, 4.166137, 7.607539, 19.708622, 4.117188, 7.608329, 19.795757, 6.1998763, 5.437825, 17.553066, 5.116558, 6.049283, 18.568323, 5.0425253, 5.7889595, 18.780462, 5.116558, 6.049283, 18.568323, 4.117188, 7.608329, 19.795757, 5.0425253, 5.7889595, 18.780462, 6.1998763, 5.437825, 17.553066, 5.0425253, 5.7889595, 18.780462, 6.190998, 5.1124864, 17.713438, 5.0425253, 5.7889595, 18.780462, 4.117188, 7.608329, 19.795757, 4.1845627, 7.608329, 19.869196, 6.190998, 5.1124864, 17.713438, 5.0425253, 5.7889595, 18.780462, 5.2750225, 5.7889595, 19.03369, 5.0425253, 5.7889595, 18.780462, 4.1845627, 7.608329, 19.869196, 5.2750225, 5.7889595, 19.03369, 6.190998, 5.1124864, 17.713438, 5.2750225, 5.7889595, 19.03369, 6.436242, 5.1124864, 17.980635, 5.2750225, 5.7889595, 19.03369, 4.1845627, 7.608329, 19.869196, 4.2755394, 7.607539, 19.827774, 6.436242, 5.1124864, 17.980635, 5.2750225, 5.7889595, 19.03369, 5.492837, 6.049283, 18.978226, 5.2750225, 5.7889595, 19.03369, 4.2755394, 7.607539, 19.827774, 5.492837, 6.049283, 18.978226, 5.492837, 6.049283, 18.978226, 4.2755394, 7.607539, 19.827774, 4.2640667, 7.6070127, 19.728611, 6.436242, 5.1124864, 17.980635, 5.492837, 6.049283, 18.978226, 6.596695, 5.437825, 17.985352, 5.492837, 6.049283, 18.978226, 4.2640667, 7.6070127, 19.728611, 5.394739, 6.2101097, 18.690458, 6.596695, 5.437825, 17.985352, 5.492837, 6.049283, 18.978226, 5.394739, 6.2101097, 18.690458, 6.596695, 5.437825, 17.985352, 5.394739, 6.2101097, 18.690458, 6.450511, 5.6386614, 17.721281, 5.7805123, 3.2207327, 16.731695, 6.2294216, 5.7555304, 17.911285, 5.4306893, 3.2207327, 17.595985, 5.7805123, 3.2207327, 16.731695, 6.351206, 5.7918544, 17.591637, 6.2294216, 5.7555304, 17.911285, 6.351206, 5.7918544, 17.591637, 6.4141273, 8.301909, 17.908752, 6.2294216, 5.7555304, 17.911285, 6.351206, 5.7918544, 17.591637, 6.4673533, 8.311122, 17.766653, 6.4141273, 8.301909, 17.908752, 6.2294216, 5.7555304, 17.911285, 6.4141273, 8.301909, 17.908752, 6.532635, 8.286643, 18.002592, 5.4306893, 3.2207327, 17.595985, 6.2294216, 5.7555304, 17.911285, 6.495885, 5.697096, 18.12049, 6.2294216, 5.7555304, 17.911285, 6.532635, 8.286643, 18.002592, 6.495885, 5.697096, 18.12049, 5.4306893, 3.2207327, 17.595985, 6.495885, 5.697096, 18.12049, 6.146731, 3.2207327, 18.143703, 6.495885, 5.697096, 18.12049, 6.532635, 8.286643, 18.002592, 6.6594005, 8.286643, 17.918467, 6.146731, 3.2207327, 18.143703, 6.495885, 5.697096, 18.12049, 6.7823133, 5.697096, 17.930405, 6.495885, 5.697096, 18.12049, 6.6594005, 8.286643, 17.918467, 6.7823133, 5.697096, 17.930405, 6.146731, 3.2207327, 18.143703, 6.7823133, 5.697096, 17.930405, 6.939343, 3.2207327, 17.617693, 6.7823133, 5.697096, 17.930405, 6.6594005, 8.286643, 17.918467, 6.6189694, 8.301909, 17.77281, 6.939343, 3.2207327, 17.617693, 6.7823133, 5.697096, 17.930405, 6.693058, 5.7555304, 17.603598, 6.7823133, 5.697096, 17.930405, 6.6189694, 8.301909, 17.77281, 6.693058, 5.7555304, 17.603598, 6.693058, 5.7555304, 17.603598, 6.6189694, 8.301909, 17.77281, 6.4673533, 8.311122, 17.766653, 6.939343, 3.2207327, 17.617693, 6.693058, 5.7555304, 17.603598, 6.712817, 3.2207322, 16.745113, 6.693058, 5.7555304, 17.603598, 6.4673533, 8.311122, 17.766653, 6.351206, 5.7918544, 17.591637, 6.712817, 3.2207322, 16.745113, 6.693058, 5.7555304, 17.603598, 6.351206, 5.7918544, 17.591637, 6.712817, 3.2207322, 16.745113, 6.351206, 5.7918544, 17.591637, 5.7805123, 3.2207327, 16.731695, 6.732394, 5.966105, 17.783781, 8.337761, 6.384096, 17.883148, 6.83874, 5.7618475, 18.072077, 6.83874, 5.7618475, 18.072077, 6.302865, 5.6723533, 17.875813, 6.732394, 5.966105, 17.783781, 6.83874, 5.7618475, 18.072077, 6.3696475, 5.543639, 18.05737, 6.302865, 5.6723533, 17.875813, 6.732394, 5.966105, 17.783781, 8.181509, 6.5478187, 17.616283, 8.337761, 6.384096, 17.883148, 8.181509, 6.5478187, 17.616283, 9.801905, 7.9697266, 17.51171, 8.337761, 6.384096, 17.883148, 8.181509, 6.5478187, 17.616283, 9.733292, 7.9692, 17.436882, 9.801905, 7.9697266, 17.51171, 8.337761, 6.384096, 17.883148, 9.801905, 7.9697266, 17.51171, 9.894417, 7.970516, 17.469269, 8.337761, 6.384096, 17.883148, 9.894417, 7.970516, 17.469269, 8.525363, 6.119035, 17.752645, 6.83874, 5.7618475, 18.072077, 8.337761, 6.384096, 17.883148, 8.525363, 6.119035, 17.752645, 8.525363, 6.119035, 17.752645, 9.894417, 7.970516, 17.469269, 9.882729, 7.970516, 17.368353, 6.9416494, 5.4307184, 17.94534, 6.3696475, 5.543639, 18.05737, 6.83874, 5.7618475, 18.072077, 6.83874, 5.7618475, 18.072077, 8.525363, 6.119035, 17.752645, 6.9416494, 5.4307184, 17.94534, 6.9416494, 5.4307184, 17.94534, 6.4345694, 5.33517, 17.977638, 6.3696475, 5.543639, 18.05737, 8.525363, 6.119035, 17.752645, 9.882729, 7.970516, 17.368353, 8.485138, 6.119035, 17.40499, 6.9416494, 5.4307184, 17.94534, 8.525363, 6.119035, 17.752645, 8.485138, 6.119035, 17.40499, 8.485138, 6.119035, 17.40499, 9.882729, 7.970516, 17.368353, 9.783121, 7.9697266, 17.348215, 6.899346, 5.4307184, 17.578844, 6.4345694, 5.33517, 17.977638, 6.9416494, 5.4307184, 17.94534, 6.9416494, 5.4307184, 17.94534, 8.485138, 6.119035, 17.40499, 6.899346, 5.4307184, 17.578844, 6.899346, 5.4307184, 17.578844, 6.4079695, 5.33517, 17.746672, 6.4345694, 5.33517, 17.977638, 8.485138, 6.119035, 17.40499, 9.783121, 7.9697266, 17.348215, 8.2728, 6.384096, 17.320663, 6.899346, 5.4307184, 17.578844, 8.485138, 6.119035, 17.40499, 8.2728, 6.384096, 17.320663, 8.2728, 6.384096, 17.320663, 9.783121, 7.9697266, 17.348215, 9.733292, 7.9692, 17.436882, 8.2728, 6.384096, 17.320663, 9.733292, 7.9692, 17.436882, 8.181509, 6.5478187, 17.616283, 6.899346, 5.4307184, 17.578844, 8.2728, 6.384096, 17.320663, 6.7699003, 5.7618475, 17.478994, 6.7699003, 5.7618475, 17.478994, 6.4079695, 5.33517, 17.746672, 6.899346, 5.4307184, 17.578844, 6.7699003, 5.7618475, 17.478994, 8.2728, 6.384096, 17.320663, 8.181509, 6.5478187, 17.616283, 6.7699003, 5.7618475, 17.478994, 6.326483, 5.543639, 17.683863, 6.4079695, 5.33517, 17.746672, 6.7699003, 5.7618475, 17.478994, 8.181509, 6.5478187, 17.616283, 6.732394, 5.966105, 17.783781, 6.732394, 5.966105, 17.783781, 6.326483, 5.543639, 17.683863, 6.7699003, 5.7618475, 17.478994, 6.732394, 5.966105, 17.783781, 6.302865, 5.6723533, 17.875813, 6.326483, 5.543639, 17.683863, 11.635334, 8.055535, 16.46335, 10.297312, 8.974432, 15.70101, 10.525072, 7.7188787, 16.089432, 10.525072, 7.7188787, 16.089432, 10.297312, 8.974432, 15.70101, 8.768291, 8.9812765, 16.37455, 10.525072, 7.7188787, 16.089432, 8.768291, 8.9812765, 16.37455, 9.2888565, 8.055536, 16.734821, 11.635334, 8.055535, 16.46335, 11.849512, 8.981276, 16.018257, 10.297312, 8.974432, 15.70101, 12.046843, 7.75336, 17.723677, 11.849512, 8.981276, 16.018257, 11.635334, 8.055535, 16.46335, 10.297312, 8.974432, 15.70101, 9.193269, 9.9178095, 16.677896, 8.768291, 8.9812765, 16.37455, 12.046843, 7.75336, 17.723677, 12.1083145, 9.00207, 17.478806, 11.849512, 8.981276, 16.018257, 11.446236, 8.09844, 18.977428, 12.1083145, 9.00207, 17.478806, 12.046843, 7.75336, 17.723677, 11.849512, 8.981276, 16.018257, 10.092733, 10.2439375, 16.303373, 10.297312, 8.974432, 15.70101, 10.297312, 8.974432, 15.70101, 10.092733, 10.2439375, 16.303373, 9.193269, 9.9178095, 16.677896, 12.1083145, 9.00207, 17.478806, 11.154192, 9.917809, 16.450953, 11.849512, 8.981276, 16.018257, 11.849512, 8.981276, 16.018257, 11.154192, 9.917809, 16.450953, 10.092733, 10.2439375, 16.303373, 11.446236, 8.09844, 18.977428, 11.4849415, 9.022602, 19.041462, 12.1083145, 9.00207, 17.478806, 11.4849415, 9.022602, 19.041462, 11.446236, 8.09844, 18.977428, 10.487244, 7.7878428, 19.713997, 12.1083145, 9.00207, 17.478806, 11.287758, 10.250781, 17.336258, 11.154192, 9.917809, 16.450953, 11.4849415, 9.022602, 19.041462, 11.287758, 10.250781, 17.336258, 12.1083145, 9.00207, 17.478806, 11.154192, 9.917809, 16.450953, 10.127245, 10.667193, 17.391205, 10.092733, 10.2439375, 16.303373, 11.154192, 9.917809, 16.450953, 11.287758, 10.250781, 17.336258, 10.127245, 10.667193, 17.391205, 11.4849415, 9.022602, 19.041462, 11.060484, 9.936234, 18.386164, 11.287758, 10.250781, 17.336258, 11.4849415, 9.022602, 19.041462, 10.487244, 7.7878428, 19.713997, 10.390107, 9.029709, 19.664736, 11.060484, 9.936234, 18.386164, 11.4849415, 9.022602, 19.041462, 10.390107, 9.029709, 19.664736, 10.390107, 9.029709, 19.664736, 10.487244, 7.7878428, 19.713997, 9.485313, 8.098441, 19.204372, 11.287758, 10.250781, 17.336258, 11.060484, 9.936234, 18.386164, 10.269789, 10.257888, 18.624687, 11.060484, 9.936234, 18.386164, 10.390107, 9.029709, 19.664736, 10.269789, 10.257888, 18.624687, 11.287758, 10.250781, 17.336258, 10.269789, 10.257888, 18.624687, 10.127245, 10.667193, 17.391205, 10.390107, 9.029709, 19.664736, 9.485313, 8.098441, 19.204372, 9.272093, 9.022602, 19.297224, 10.269789, 10.257888, 18.624687, 10.390107, 9.029709, 19.664736, 9.272093, 9.022602, 19.297224, 8.965256, 7.7533607, 18.079897, 9.272093, 9.022602, 19.297224, 9.485313, 8.098441, 19.204372, 10.127245, 10.667193, 17.391205, 10.269789, 10.257888, 18.624687, 9.485554, 9.936234, 18.568289, 10.269789, 10.257888, 18.624687, 9.272093, 9.022602, 19.297224, 9.485554, 9.936234, 18.568289, 8.965256, 7.7533607, 18.079897, 8.57874, 9.002071, 17.886866, 9.272093, 9.022602, 19.297224, 8.57874, 9.002071, 17.886866, 9.485554, 9.936234, 18.568289, 9.272093, 9.022602, 19.297224, 9.2888565, 8.055536, 16.734821, 8.57874, 9.002071, 17.886866, 8.965256, 7.7533607, 18.079897, 9.2888565, 8.055536, 16.734821, 8.768291, 8.9812765, 16.37455, 8.57874, 9.002071, 17.886866, 8.57874, 9.002071, 17.886866, 9.07469, 10.250781, 17.592167, 9.485554, 9.936234, 18.568289, 10.127245, 10.667193, 17.391205, 9.485554, 9.936234, 18.568289, 9.07469, 10.250781, 17.592167, 8.768291, 8.9812765, 16.37455, 9.07469, 10.250781, 17.592167, 8.57874, 9.002071, 17.886866, 10.092733, 10.2439375, 16.303373, 10.127245, 10.667193, 17.391205, 9.07469, 10.250781, 17.592167, 8.768291, 8.9812765, 16.37455, 9.193269, 9.9178095, 16.677896, 9.07469, 10.250781, 17.592167, 10.092733, 10.2439375, 16.303373, 9.07469, 10.250781, 17.592167, 9.193269, 9.9178095, 16.677896, 11.446236, 8.09844, 18.977428, 10.560175, 7.3369484, 17.97454, 10.487244, 7.7878428, 19.713997, 11.446236, 8.09844, 18.977428, 12.046843, 7.75336, 17.723677, 10.560175, 7.3369484, 17.97454, 10.487244, 7.7878428, 19.713997, 10.560175, 7.3369484, 17.97454, 8.965256, 7.7533607, 18.079897, 10.487244, 7.7878428, 19.713997, 8.965256, 7.7533607, 18.079897, 9.485313, 8.098441, 19.204372, 10.560175, 7.3369484, 17.97454, 9.2888565, 8.055536, 16.734821, 8.965256, 7.7533607, 18.079897, 10.560175, 7.3369484, 17.97454, 10.525072, 7.7188787, 16.089432, 9.2888565, 8.055536, 16.734821, 12.046843, 7.75336, 17.723677, 10.525072, 7.7188787, 16.089432, 10.560175, 7.3369484, 17.97454, 12.046843, 7.75336, 17.723677, 11.635334, 8.055535, 16.46335, 10.525072, 7.7188787, 16.089432, 1.4948497, 8.510117, 18.317255, 1.5868134, 10.875402, 20.798342, 1.7763877, 7.617279, 20.49278, 1.7763877, 7.617279, 20.49278, 1.5868134, 10.875402, 20.798342, 4.0570173, 10.958316, 22.239437, 1.7763877, 7.617279, 20.49278, 4.0570173, 10.958316, 22.239437, 4.0145273, 8.465897, 21.717955, 1.4948497, 8.510117, 18.317255, 0.70318604, 10.8246, 18.46102, 1.5868134, 10.875402, 20.798342, 3.2524045, 7.8428564, 16.201567, 0.70318604, 10.8246, 18.46102, 1.4948497, 8.510117, 18.317255, 1.5868134, 10.875402, 20.798342, 4.248084, 13.349396, 21.22304, 4.0570173, 10.958316, 22.239437, 3.2524045, 7.8428564, 16.201567, 3.0084083, 11.055706, 16.17521, 0.70318604, 10.8246, 18.46102, 5.9580865, 8.746749, 15.848719, 3.0084083, 11.055706, 16.17521, 3.2524045, 7.8428564, 16.201567, 0.70318604, 10.8246, 18.46102, 2.983596, 14.165375, 20.207823, 1.5868134, 10.875402, 20.798342, 1.5868134, 10.875402, 20.798342, 2.983596, 14.165375, 20.207823, 4.248084, 13.349396, 21.22304, 3.0084083, 11.055706, 16.17521, 2.2301898, 13.289908, 18.748863, 0.70318604, 10.8246, 18.46102, 0.70318604, 10.8246, 18.46102, 2.2301898, 13.289908, 18.748863, 2.983596, 14.165375, 20.207823, 5.9580865, 8.746749, 15.848719, 6.1891904, 11.228903, 15.304886, 3.0084083, 11.055706, 16.17521, 6.1891904, 11.228903, 15.304886, 5.9580865, 8.746749, 15.848719, 7.9187675, 7.777577, 17.198952, 3.0084083, 11.055706, 16.17521, 3.6397526, 14.210384, 17.564486, 2.2301898, 13.289908, 18.748863, 6.1891904, 11.228903, 15.304886, 3.6397526, 14.210384, 17.564486, 3.0084083, 11.055706, 16.17521, 2.2301898, 13.289908, 18.748863, 4.6415443, 15.261944, 19.219688, 2.983596, 14.165375, 20.207823, 2.2301898, 13.289908, 18.748863, 3.6397526, 14.210384, 17.564486, 4.6415443, 15.261944, 19.219688, 6.1891904, 11.228903, 15.304886, 5.462911, 13.469423, 16.818632, 3.6397526, 14.210384, 17.564486, 6.1891904, 11.228903, 15.304886, 7.9187675, 7.777577, 17.198952, 7.931513, 11.003588, 17.213871, 5.462911, 13.469423, 16.818632, 6.1891904, 11.228903, 15.304886, 7.931513, 11.003588, 17.213871, 7.931513, 11.003588, 17.213871, 7.9187675, 7.777577, 17.198952, 7.831026, 8.428781, 19.665352, 3.6397526, 14.210384, 17.564486, 5.462911, 13.469423, 16.818632, 6.3584847, 14.197486, 18.1248, 5.462911, 13.469423, 16.818632, 7.931513, 11.003588, 17.213871, 6.3584847, 14.197486, 18.1248, 3.6397526, 14.210384, 17.564486, 6.3584847, 14.197486, 18.1248, 4.6415443, 15.261944, 19.219688, 7.931513, 11.003588, 17.213871, 7.831026, 8.428781, 19.665352, 8.087843, 10.745896, 20.01901, 6.3584847, 14.197486, 18.1248, 7.931513, 11.003588, 17.213871, 8.087843, 10.745896, 20.01901, 6.4428244, 7.5519996, 21.489801, 8.087843, 10.745896, 20.01901, 7.831026, 8.428781, 19.665352, 4.6415443, 15.261944, 19.219688, 6.3584847, 14.197486, 18.1248, 6.8342867, 13.254899, 19.708595, 6.3584847, 14.197486, 18.1248, 8.087843, 10.745896, 20.01901, 6.8342867, 13.254899, 19.708595, 6.4428244, 7.5519996, 21.489801, 6.510137, 10.823021, 21.836857, 8.087843, 10.745896, 20.01901, 6.510137, 10.823021, 21.836857, 6.8342867, 13.254899, 19.708595, 8.087843, 10.745896, 20.01901, 4.0145273, 8.465897, 21.717955, 6.510137, 10.823021, 21.836857, 6.4428244, 7.5519996, 21.489801, 4.0145273, 8.465897, 21.717955, 4.0570173, 10.958316, 22.239437, 6.510137, 10.823021, 21.836857, 6.510137, 10.823021, 21.836857, 5.702328, 14.152213, 20.768137, 6.8342867, 13.254899, 19.708595, 4.6415443, 15.261944, 19.219688, 6.8342867, 13.254899, 19.708595, 5.702328, 14.152213, 20.768137, 4.0570173, 10.958316, 22.239437, 5.702328, 14.152213, 20.768137, 6.510137, 10.823021, 21.836857, 2.983596, 14.165375, 20.207823, 4.6415443, 15.261944, 19.219688, 5.702328, 14.152213, 20.768137, 4.0570173, 10.958316, 22.239437, 4.248084, 13.349396, 21.22304, 5.702328, 14.152213, 20.768137, 2.983596, 14.165375, 20.207823, 5.702328, 14.152213, 20.768137, 4.248084, 13.349396, 21.22304, 5.9580865, 8.746749, 15.848719, 4.877001, 6.61652, 18.79238, 7.9187675, 7.777577, 17.198952, 5.9580865, 8.746749, 15.848719, 3.2524045, 7.8428564, 16.201567, 4.877001, 6.61652, 18.79238, 7.9187675, 7.777577, 17.198952, 4.877001, 6.61652, 18.79238, 6.4428244, 7.5519996, 21.489801, 7.9187675, 7.777577, 17.198952, 6.4428244, 7.5519996, 21.489801, 7.831026, 8.428781, 19.665352, 4.877001, 6.61652, 18.79238, 4.0145273, 8.465897, 21.717955, 6.4428244, 7.5519996, 21.489801, 4.877001, 6.61652, 18.79238, 1.7763877, 7.617279, 20.49278, 4.0145273, 8.465897, 21.717955, 3.2524045, 7.8428564, 16.201567, 1.7763877, 7.617279, 20.49278, 4.877001, 6.61652, 18.79238, 3.2524045, 7.8428564, 16.201567, 1.4948497, 8.510117, 18.317255, 1.7763877, 7.617279, 20.49278, -17.758068, 7.5774293, -6.836121, -20.570257, 8.332888, -7.573155, -17.84524, 7.2079325, -7.384581, -17.758068, 7.5774293, -6.836121, -20.386482, 8.628776, -7.04528, -20.570257, 8.332888, -7.573155, -20.386482, 8.628776, -7.04528, -23.297365, 11.199757, -7.426018, -20.570257, 8.332888, -7.573155, -20.386482, 8.628776, -7.04528, -23.201662, 11.198789, -7.2690005, -23.297365, 11.199757, -7.426018, -20.570257, 8.332888, -7.573155, -23.297365, 11.199757, -7.426018, -23.476107, 11.20121, -7.3828626, -17.84524, 7.2079325, -7.384581, -20.570257, 8.332888, -7.573155, -20.948885, 7.853947, -7.4072576, -20.570257, 8.332888, -7.573155, -23.476107, 11.20121, -7.3828626, -20.948885, 7.853947, -7.4072576, -17.84524, 7.2079325, -7.384581, -20.948885, 7.853947, -7.4072576, -18.072498, 6.6093764, -7.195704, -20.948885, 7.853947, -7.4072576, -23.476107, 11.20121, -7.3828626, -23.490705, 11.20121, -7.200089, -18.072498, 6.6093764, -7.195704, -20.948885, 7.853947, -7.4072576, -20.999002, 7.853947, -6.776777, -20.948885, 7.853947, -7.4072576, -23.490705, 11.20121, -7.200089, -20.999002, 7.853947, -6.776777, -18.072498, 6.6093764, -7.195704, -20.999002, 7.853947, -6.776777, -18.12548, 6.6093764, -6.5305486, -20.999002, 7.853947, -6.776777, -23.490705, 11.20121, -7.200089, -23.320944, 11.199757, -7.129349, -18.12548, 6.6093764, -6.5305486, -20.999002, 7.853947, -6.776777, -20.651468, 8.332888, -6.5526786, -20.999002, 7.853947, -6.776777, -23.320944, 11.199757, -7.129349, -20.651468, 8.332888, -6.5526786, -20.651468, 8.332888, -6.5526786, -23.320944, 11.199757, -7.129349, -23.201662, 11.198789, -7.2690005, -18.12548, 6.6093764, -6.5305486, -20.651468, 8.332888, -6.5526786, -17.930893, 7.2079325, -6.308391, -20.651468, 8.332888, -6.5526786, -23.201662, 11.198789, -7.2690005, -20.386482, 8.628776, -7.04528, -17.930893, 7.2079325, -6.308391, -20.651468, 8.332888, -6.5526786, -20.386482, 8.628776, -7.04528, -17.930893, 7.2079325, -6.308391, -20.386482, 8.628776, -7.04528, -17.758068, 7.5774293, -6.836121, -17.263433, 3.1289406, -8.978432, -18.291029, 7.792444, -6.8961415, -18.866385, 3.1289406, -8.367504, -17.263433, 3.1289406, -8.978432, -17.707705, 7.8592725, -7.132322, -18.291029, 7.792444, -6.8961415, -17.707705, 7.8592725, -7.132322, -18.056295, 12.477256, -6.650377, -18.291029, 7.792444, -6.8961415, -17.707705, 7.8592725, -7.132322, -17.798122, 12.494205, -6.756602, -18.056295, 12.477256, -6.650377, -18.291029, 7.792444, -6.8961415, -18.056295, 12.477256, -6.650377, -18.034353, 12.449168, -6.373137, -18.866385, 3.1289406, -8.367504, -18.291029, 7.792444, -6.8961415, -18.239275, 7.6849365, -6.2750163, -18.291029, 7.792444, -6.8961415, -18.034353, 12.449168, -6.373137, -18.239275, 7.6849365, -6.2750163, -18.866385, 3.1289406, -8.367504, -18.239275, 7.6849365, -6.2750163, -18.707829, 3.1289406, -6.716517, -18.239275, 7.6849365, -6.2750163, -18.034353, 12.449168, -6.373137, -17.762217, 12.449168, -6.3076463, -18.707829, 3.1289406, -6.716517, -18.239275, 7.6849365, -6.2750163, -17.624376, 7.6849365, -6.1270385, -18.239275, 7.6849365, -6.2750163, -17.762217, 12.449168, -6.3076463, -17.624376, 7.6849365, -6.1270385, -18.707829, 3.1289406, -6.716517, -17.624376, 7.6849365, -6.1270385, -17.006262, 3.1289406, -6.3070283, -17.624376, 7.6849365, -6.1270385, -17.762217, 12.449168, -6.3076463, -17.616545, 12.477256, -6.5445485, -17.006262, 3.1289406, -6.3070283, -17.624376, 7.6849365, -6.1270385, -17.295702, 7.792444, -6.656613, -17.624376, 7.6849365, -6.1270385, -17.616545, 12.477256, -6.5445485, -17.295702, 7.792444, -6.656613, -17.295702, 7.792444, -6.656613, -17.616545, 12.477256, -6.5445485, -17.798122, 12.494205, -6.756602, -17.006262, 3.1289406, -6.3070283, -17.295702, 7.792444, -6.656613, -16.113934, 3.1289406, -7.705115, -17.295702, 7.792444, -6.656613, -17.798122, 12.494205, -6.756602, -17.707705, 7.8592725, -7.132322, -16.113934, 3.1289406, -7.705115, -17.295702, 7.792444, -6.656613, -17.707705, 7.8592725, -7.132322, -16.113934, 3.1289406, -7.705115, -17.707705, 7.8592725, -7.132322, -17.263433, 3.1289406, -8.978432, -17.48928, 8.179858, -6.3779426, -15.612703, 8.948875, -4.0898643, -17.744648, 7.804066, -5.8735633, -17.744648, 7.804066, -5.8735633, -18.151243, 7.6394153, -6.841582, -17.48928, 8.179858, -6.3779426, -17.744648, 7.804066, -5.8735633, -18.312298, 7.402608, -6.524203, -18.151243, 7.6394153, -6.841582, -17.48928, 8.179858, -6.3779426, -15.448719, 9.250092, -4.6346655, -15.612703, 8.948875, -4.0898643, -15.448719, 9.250092, -4.6346655, -13.278458, 11.866108, -2.5817409, -15.612703, 8.948875, -4.0898643, -15.448719, 9.250092, -4.6346655, -13.263538, 11.865139, -2.7679238, -13.278458, 11.866108, -2.5817409, -15.612703, 8.948875, -4.0898643, -13.278458, 11.866108, -2.5817409, -13.1054, 11.867559, -2.5102086, -15.612703, 8.948875, -4.0898643, -13.1054, 11.867559, -2.5102086, -15.201872, 8.461218, -4.00046, -17.744648, 7.804066, -5.8735633, -15.612703, 8.948875, -4.0898643, -15.201872, 8.461218, -4.00046, -15.201872, 8.461218, -4.00046, -13.1054, 11.867559, -2.5102086, -12.98403, 11.867559, -2.6523442, -17.444958, 7.1948566, -5.8935885, -18.312298, 7.402608, -6.524203, -17.744648, 7.804066, -5.8735633, -17.744648, 7.804066, -5.8735633, -15.201872, 8.461218, -4.00046, -17.444958, 7.1948566, -5.8935885, -17.444958, 7.1948566, -5.8935885, -18.123537, 7.0190673, -6.536556, -18.312298, 7.402608, -6.524203, -15.201872, 8.461218, -4.00046, -12.98403, 11.867559, -2.6523442, -14.783697, 8.461218, -4.490066, -17.444958, 7.1948566, -5.8935885, -15.201872, 8.461218, -4.00046, -14.783697, 8.461218, -4.490066, -14.783697, 8.461218, -4.490066, -12.98403, 11.867559, -2.6523442, -13.081631, 11.866107, -2.811812, -17.003992, 7.1948566, -6.4095883, -18.123537, 7.0190673, -6.536556, -17.444958, 7.1948566, -5.8935885, -17.444958, 7.1948566, -5.8935885, -14.783697, 8.461218, -4.490066, -17.003992, 7.1948566, -6.4095883, -17.003992, 7.1948566, -6.4095883, -17.845564, 7.0190673, -6.8616605, -18.123537, 7.0190673, -6.536556, -14.783697, 8.461218, -4.490066, -13.081631, 11.866107, -2.811812, -14.935968, 8.948875, -4.8818517, -17.003992, 7.1948566, -6.4095883, -14.783697, 8.461218, -4.490066, -14.935968, 8.948875, -4.8818517, -14.935968, 8.948875, -4.8818517, -13.081631, 11.866107, -2.811812, -13.263538, 11.865139, -2.7679238, -14.935968, 8.948875, -4.8818517, -13.263538, 11.865139, -2.7679238, -15.448719, 9.250092, -4.6346655, -17.003992, 7.1948566, -6.4095883, -14.935968, 8.948875, -4.8818517, -17.031534, 7.8040657, -6.7090955, -17.031534, 7.8040657, -6.7090955, -17.845564, 7.0190673, -6.8616605, -17.003992, 7.1948566, -6.4095883, -17.031534, 7.8040657, -6.7090955, -14.935968, 8.948875, -4.8818517, -15.448719, 9.250092, -4.6346655, -17.031534, 7.8040657, -6.7090955, -17.862965, 7.402608, -7.050143, -17.845564, 7.0190673, -6.8616605, -17.031534, 7.8040657, -6.7090955, -15.448719, 9.250092, -4.6346655, -17.48928, 8.179858, -6.3779426, -17.48928, 8.179858, -6.3779426, -17.862965, 7.402608, -7.050143, -17.031534, 7.8040657, -6.7090955, -17.48928, 8.179858, -6.3779426, -18.151243, 7.6394153, -6.841582, -17.862965, 7.402608, -7.050143, -9.569414, 12.023977, -1.423661, -10.217659, 13.714559, -4.1817064, -10.455915, 11.404599, -3.3882995, -10.455915, 11.404599, -3.3882995, -10.217659, 13.714559, -4.1817064, -13.040308, 13.727151, -5.3989296, -10.455915, 11.404599, -3.3882995, -13.040308, 13.727151, -5.3989296, -12.873928, 12.023979, -4.2461476, -9.569414, 12.023977, -1.423661, -8.701311, 13.727149, -1.6924205, -10.217659, 13.714559, -4.1817064, -10.752665, 11.468038, 0.7093334, -8.701311, 13.727149, -1.6924205, -9.569414, 12.023977, -1.423661, -10.217659, 13.714559, -4.1817064, -12.916918, 15.450177, -4.4462667, -13.040308, 13.727151, -5.3989296, -10.752665, 11.468038, 0.7093334, -10.345652, 13.765407, 0.48551416, -8.701311, 13.727149, -1.6924205, -13.194582, 12.102914, 1.4700174, -10.345652, 13.765407, 0.48551416, -10.752665, 11.468038, 0.7093334, -8.701311, 13.727149, -1.6924205, -11.285702, 16.050184, -3.7030501, -10.217659, 13.714559, -4.1817064, -10.217659, 13.714559, -4.1817064, -11.285702, 16.050184, -3.7030501, -12.916918, 15.450177, -4.4462667, -10.345652, 13.765407, 0.48551416, -10.15527, 15.450176, -2.0876474, -8.701311, 13.727149, -1.6924205, -8.701311, 13.727149, -1.6924205, -10.15527, 15.450176, -2.0876474, -11.285702, 16.050184, -3.7030501, -13.194582, 12.102914, 1.4700174, -13.23241, 13.80318, 1.6023726, -10.345652, 13.765407, 0.48551416, -13.23241, 13.80318, 1.6023726, -13.194582, 12.102914, 1.4700174, -15.388298, 11.531479, 1.0999866, -10.345652, 13.765407, 0.48551416, -11.1811695, 16.062777, -0.7989111, -10.15527, 15.450176, -2.0876474, -13.23241, 13.80318, 1.6023726, -11.1811695, 16.062777, -0.7989111, -10.345652, 13.765407, 0.48551416, -10.15527, 15.450176, -2.0876474, -12.708605, 16.828888, -2.2941785, -11.285702, 16.050184, -3.7030501, -10.15527, 15.450176, -2.0876474, -11.1811695, 16.062777, -0.7989111, -12.708605, 16.828888, -2.2941785, -13.23241, 13.80318, 1.6023726, -12.880806, 15.484076, 0.2096405, -11.1811695, 16.062777, -0.7989111, -13.23241, 13.80318, 1.6023726, -15.388298, 11.531479, 1.0999866, -15.443556, 13.8162565, 0.90737486, -12.880806, 15.484076, 0.2096405, -13.23241, 13.80318, 1.6023726, -15.443556, 13.8162565, 0.90737486, -15.443556, 13.8162565, 0.90737486, -15.388298, 11.531479, 1.0999866, -15.956232, 12.102915, -0.88860226, -11.1811695, 16.062777, -0.7989111, -12.880806, 15.484076, 0.2096405, -14.192514, 16.075851, -0.5573001, -12.880806, 15.484076, 0.2096405, -15.443556, 13.8162565, 0.90737486, -14.192514, 16.075851, -0.5573001, -11.1811695, 16.062777, -0.7989111, -14.192514, 16.075851, -0.5573001, -12.708605, 16.828888, -2.2941785, -15.443556, 13.8162565, 0.90737486, -15.956232, 12.102915, -0.88860226, -16.3484, 13.803182, -1.0596855, -14.192514, 16.075851, -0.5573001, -15.443556, 13.8162565, 0.90737486, -16.3484, 13.803182, -1.0596855, -15.09202, 11.4680395, -2.9977593, -16.3484, 13.803182, -1.0596855, -15.956232, 12.102915, -0.88860226, -12.708605, 16.828888, -2.2941785, -14.192514, 16.075851, -0.5573001, -15.09865, 15.4840765, -1.6848848, -14.192514, 16.075851, -0.5573001, -16.3484, 13.803182, -1.0596855, -15.09865, 15.4840765, -1.6848848, -15.09202, 11.4680395, -2.9977593, -15.31592, 13.7654085, -3.7604294, -16.3484, 13.803182, -1.0596855, -15.31592, 13.7654085, -3.7604294, -15.09865, 15.4840765, -1.6848848, -16.3484, 13.803182, -1.0596855, -12.873928, 12.023979, -4.2461476, -15.31592, 13.7654085, -3.7604294, -15.09202, 11.4680395, -2.9977593, -12.873928, 12.023979, -4.2461476, -13.040308, 13.727151, -5.3989296, -15.31592, 13.7654085, -3.7604294, -15.31592, 13.7654085, -3.7604294, -14.29763, 16.062777, -3.461082, -15.09865, 15.4840765, -1.6848848, -12.708605, 16.828888, -2.2941785, -15.09865, 15.4840765, -1.6848848, -14.29763, 16.062777, -3.461082, -13.040308, 13.727151, -5.3989296, -14.29763, 16.062777, -3.461082, -15.31592, 13.7654085, -3.7604294, -11.285702, 16.050184, -3.7030501, -12.708605, 16.828888, -2.2941785, -14.29763, 16.062777, -3.461082, -13.040308, 13.727151, -5.3989296, -12.916918, 15.450177, -4.4462667, -14.29763, 16.062777, -3.461082, -11.285702, 16.050184, -3.7030501, -14.29763, 16.062777, -3.461082, -12.916918, 15.450177, -4.4462667, -13.194582, 12.102914, 1.4700174, -12.95261, 10.701926, -0.98015237, -15.388298, 11.531479, 1.0999866, -13.194582, 12.102914, 1.4700174, -10.752665, 11.468038, 0.7093334, -12.95261, 10.701926, -0.98015237, -15.388298, 11.531479, 1.0999866, -12.95261, 10.701926, -0.98015237, -15.09202, 11.4680395, -2.9977593, -15.388298, 11.531479, 1.0999866, -15.09202, 11.4680395, -2.9977593, -15.956232, 12.102915, -0.88860226, -12.95261, 10.701926, -0.98015237, -12.873928, 12.023979, -4.2461476, -15.09202, 11.4680395, -2.9977593, -12.95261, 10.701926, -0.98015237, -10.455915, 11.404599, -3.3882995, -12.873928, 12.023979, -4.2461476, -10.752665, 11.468038, 0.7093334, -10.455915, 11.404599, -3.3882995, -12.95261, 10.701926, -0.98015237, -10.752665, 11.468038, 0.7093334, -9.569414, 12.023977, -1.423661, -10.455915, 11.404599, -3.3882995, -24.767572, 12.860314, -12.76874, -27.996283, 17.21195, -9.537579, -27.347048, 11.217676, -9.664753, -27.347048, 11.217676, -9.664753, -27.996283, 17.21195, -9.537579, -26.84493, 17.364494, -4.4035864, -27.347048, 11.217676, -9.664753, -26.84493, 17.364494, -4.4035864, -26.195316, 12.778957, -5.113938, -24.767572, 12.860314, -12.76874, -25.952778, 17.118486, -13.655661, -27.996283, 17.21195, -9.537579, -19.715057, 11.632692, -13.049604, -25.952778, 17.118486, -13.655661, -24.767572, 12.860314, -12.76874, -27.996283, 17.21195, -9.537579, -25.235796, 21.763588, -5.4189744, -26.84493, 17.364494, -4.4035864, -19.715057, 11.632692, -13.049604, -19.985107, 17.543673, -13.411457, -25.952778, 17.118486, -13.655661, -15.851015, 13.295669, -9.844912, -19.985107, 17.543673, -13.411457, -19.715057, 11.632692, -13.049604, -25.952778, 17.118486, -13.655661, -25.451134, 23.26482, -8.394608, -27.996283, 17.21195, -9.537579, -27.996283, 17.21195, -9.537579, -25.451134, 23.26482, -8.394608, -25.235796, 21.763588, -5.4189744, -19.985107, 17.543673, -13.411457, -24.42836, 21.654142, -11.237154, -25.952778, 17.118486, -13.655661, -25.952778, 17.118486, -13.655661, -24.42836, 21.654142, -11.237154, -25.451134, 23.26482, -8.394608, -15.851015, 13.295669, -9.844912, -14.828638, 17.862318, -10.214518, -19.985107, 17.543673, -13.411457, -14.828638, 17.862318, -10.214518, -15.851015, 13.295669, -9.844912, -15.215309, 11.512592, -5.5114245, -19.985107, 17.543673, -13.411457, -21.066832, 23.347628, -10.820686, -24.42836, 21.654142, -11.237154, -14.828638, 17.862318, -10.214518, -21.066832, 23.347628, -10.820686, -19.985107, 17.543673, -13.411457, -24.42836, 21.654142, -11.237154, -22.043024, 25.28228, -7.397609, -25.451134, 23.26482, -8.394608, -24.42836, 21.654142, -11.237154, -21.066832, 23.347628, -10.820686, -22.043024, 25.28228, -7.397609, -14.828638, 17.862318, -10.214518, -17.778353, 21.984411, -9.297602, -21.066832, 23.347628, -10.820686, -14.828638, 17.862318, -10.214518, -15.215309, 11.512592, -5.5114245, -15.219456, 17.447784, -5.475563, -17.778353, 21.984411, -9.297602, -14.828638, 17.862318, -10.214518, -15.219456, 17.447784, -5.475563, -15.219456, 17.447784, -5.475563, -15.215309, 11.512592, -5.5114245, -18.649284, 12.710672, -2.540853, -21.066832, 23.347628, -10.820686, -17.778353, 21.984411, -9.297602, -18.417158, 23.323898, -6.4548, -17.778353, 21.984411, -9.297602, -15.219456, 17.447784, -5.475563, -18.417158, 23.323898, -6.4548, -21.066832, 23.347628, -10.820686, -18.417158, 23.323898, -6.4548, -22.043024, 25.28228, -7.397609, -15.219456, 17.447784, -5.475563, -18.649284, 12.710672, -2.540853, -18.8043, 16.973686, -1.7518203, -18.417158, 23.323898, -6.4548, -15.219456, 17.447784, -5.475563, -18.8043, 16.973686, -1.7518203, -22.846716, 11.097576, -2.1269307, -18.8043, 16.973686, -1.7518203, -18.649284, 12.710672, -2.540853, -22.043024, 25.28228, -7.397609, -18.417158, 23.323898, -6.4548, -19.955843, 21.589733, -3.8300514, -18.417158, 23.323898, -6.4548, -18.8043, 16.973686, -1.7518203, -19.955843, 21.589733, -3.8300514, -22.846716, 11.097576, -2.1269307, -23.23016, 17.115578, -1.6015713, -18.8043, 16.973686, -1.7518203, -23.23016, 17.115578, -1.6015713, -19.955843, 21.589733, -3.8300514, -18.8043, 16.973686, -1.7518203, -26.195316, 12.778957, -5.113938, -23.23016, 17.115578, -1.6015713, -22.846716, 11.097576, -2.1269307, -26.195316, 12.778957, -5.113938, -26.84493, 17.364494, -4.4035864, -23.23016, 17.115578, -1.6015713, -23.23016, 17.115578, -1.6015713, -22.801462, 23.240604, -4.0287204, -19.955843, 21.589733, -3.8300514, -22.043024, 25.28228, -7.397609, -19.955843, 21.589733, -3.8300514, -22.801462, 23.240604, -4.0287204, -26.84493, 17.364494, -4.4035864, -22.801462, 23.240604, -4.0287204, -23.23016, 17.115578, -1.6015713, -25.451134, 23.26482, -8.394608, -22.043024, 25.28228, -7.397609, -22.801462, 23.240604, -4.0287204, -26.84493, 17.364494, -4.4035864, -25.235796, 21.763588, -5.4189744, -22.801462, 23.240604, -4.0287204, -25.451134, 23.26482, -8.394608, -22.801462, 23.240604, -4.0287204, -25.235796, 21.763588, -5.4189744, -15.851015, 13.295669, -9.844912, -21.172243, 9.376487, -7.615418, -15.215309, 11.512592, -5.5114245, -15.851015, 13.295669, -9.844912, -19.715057, 11.632692, -13.049604, -21.172243, 9.376487, -7.615418, -15.215309, 11.512592, -5.5114245, -21.172243, 9.376487, -7.615418, -22.846716, 11.097576, -2.1269307, -15.215309, 11.512592, -5.5114245, -22.846716, 11.097576, -2.1269307, -18.649284, 12.710672, -2.540853, -21.172243, 9.376487, -7.615418, -26.195316, 12.778957, -5.113938, -22.846716, 11.097576, -2.1269307, -21.172243, 9.376487, -7.615418, -27.347048, 11.217676, -9.664753, -26.195316, 12.778957, -5.113938, -19.715057, 11.632692, -13.049604, -27.347048, 11.217676, -9.664753, -21.172243, 9.376487, -7.615418, -19.715057, 11.632692, -13.049604, -24.767572, 12.860314, -12.76874, -27.347048, 11.217676, -9.664753, 15.271845, 5.6313887, -13.373863, 13.937893, 6.0420103, -12.526823, 15.02121, 5.4305525, -13.542078, 15.271845, 5.6313887, -13.373863, 14.216074, 6.202837, -12.404688, 13.937893, 6.0420103, -12.526823, 14.216074, 6.202837, -12.404688, 12.987471, 7.6002665, -11.386524, 13.937893, 6.0420103, -12.526823, 14.216074, 6.202837, -12.404688, 13.085402, 7.59974, -11.366533, 12.987471, 7.6002665, -11.386524, 13.937893, 6.0420103, -12.526823, 12.987471, 7.6002665, -11.386524, 12.938522, 7.601056, -11.299387, 15.02121, 5.4305525, -13.542078, 13.937893, 6.0420103, -12.526823, 13.863859, 5.781687, -12.314682, 13.937893, 6.0420103, -12.526823, 12.938522, 7.601056, -11.299387, 13.863859, 5.781687, -12.314682, 15.02121, 5.4305525, -13.542078, 13.863859, 5.781687, -12.314682, 15.012333, 5.1052136, -13.381706, 13.863859, 5.781687, -12.314682, 12.938522, 7.601056, -11.299387, 13.0058975, 7.601056, -11.22595, 15.012333, 5.1052136, -13.381706, 13.863859, 5.781687, -12.314682, 14.096357, 5.781687, -12.061455, 13.863859, 5.781687, -12.314682, 13.0058975, 7.601056, -11.22595, 14.096357, 5.781687, -12.061455, 15.012333, 5.1052136, -13.381706, 14.096357, 5.781687, -12.061455, 15.257576, 5.1052136, -13.11451, 14.096357, 5.781687, -12.061455, 13.0058975, 7.601056, -11.22595, 13.096874, 7.6002665, -11.26737, 15.257576, 5.1052136, -13.11451, 14.096357, 5.781687, -12.061455, 14.314171, 6.0420103, -12.116919, 14.096357, 5.781687, -12.061455, 13.096874, 7.6002665, -11.26737, 14.314171, 6.0420103, -12.116919, 14.314171, 6.0420103, -12.116919, 13.096874, 7.6002665, -11.26737, 13.085402, 7.59974, -11.366533, 15.257576, 5.1052136, -13.11451, 14.314171, 6.0420103, -12.116919, 15.41803, 5.4305525, -13.109793, 14.314171, 6.0420103, -12.116919, 13.085402, 7.59974, -11.366533, 14.216074, 6.202837, -12.404688, 15.41803, 5.4305525, -13.109793, 14.314171, 6.0420103, -12.116919, 14.216074, 6.202837, -12.404688, 15.41803, 5.4305525, -13.109793, 14.216074, 6.202837, -12.404688, 15.271845, 5.6313887, -13.373863, 14.601847, 3.21346, -14.363449, 15.050756, 5.7482576, -13.183859, 14.252024, 3.21346, -13.499159, 14.601847, 3.21346, -14.363449, 15.172541, 5.7845817, -13.503508, 15.050756, 5.7482576, -13.183859, 15.172541, 5.7845817, -13.503508, 15.235462, 8.294637, -13.186392, 15.050756, 5.7482576, -13.183859, 15.172541, 5.7845817, -13.503508, 15.288689, 8.303849, -13.328491, 15.235462, 8.294637, -13.186392, 15.050756, 5.7482576, -13.183859, 15.235462, 8.294637, -13.186392, 15.35397, 8.27937, -13.092552, 14.252024, 3.21346, -13.499159, 15.050756, 5.7482576, -13.183859, 15.317219, 5.689823, -12.974655, 15.050756, 5.7482576, -13.183859, 15.35397, 8.27937, -13.092552, 15.317219, 5.689823, -12.974655, 14.252024, 3.21346, -13.499159, 15.317219, 5.689823, -12.974655, 14.968065, 3.21346, -12.951441, 15.317219, 5.689823, -12.974655, 15.35397, 8.27937, -13.092552, 15.480734, 8.27937, -13.17668, 14.968065, 3.21346, -12.951441, 15.317219, 5.689823, -12.974655, 15.603647, 5.689823, -13.16474, 15.317219, 5.689823, -12.974655, 15.480734, 8.27937, -13.17668, 15.603647, 5.689823, -13.16474, 14.968065, 3.21346, -12.951441, 15.603647, 5.689823, -13.16474, 15.760677, 3.21346, -13.477451, 15.603647, 5.689823, -13.16474, 15.480734, 8.27937, -13.17668, 15.440304, 8.294637, -13.322334, 15.760677, 3.21346, -13.477451, 15.603647, 5.689823, -13.16474, 15.514393, 5.7482576, -13.491547, 15.603647, 5.689823, -13.16474, 15.440304, 8.294637, -13.322334, 15.514393, 5.7482576, -13.491547, 15.514393, 5.7482576, -13.491547, 15.440304, 8.294637, -13.322334, 15.288689, 8.303849, -13.328491, 15.760677, 3.21346, -13.477451, 15.514393, 5.7482576, -13.491547, 15.534151, 3.2134595, -14.350031, 15.514393, 5.7482576, -13.491547, 15.288689, 8.303849, -13.328491, 15.172541, 5.7845817, -13.503508, 15.534151, 3.2134595, -14.350031, 15.514393, 5.7482576, -13.491547, 15.172541, 5.7845817, -13.503508, 15.534151, 3.2134595, -14.350031, 15.172541, 5.7845817, -13.503508, 14.601847, 3.21346, -14.363449, 15.553728, 5.9588323, -13.311363, 17.159096, 6.3768234, -13.211996, 15.660074, 5.754575, -13.023067, 15.660074, 5.754575, -13.023067, 15.124199, 5.6650805, -13.219332, 15.553728, 5.9588323, -13.311363, 15.660074, 5.754575, -13.023067, 15.190983, 5.5363665, -13.037777, 15.124199, 5.6650805, -13.219332, 15.553728, 5.9588323, -13.311363, 17.002844, 6.540546, -13.478861, 17.159096, 6.3768234, -13.211996, 17.002844, 6.540546, -13.478861, 18.62324, 7.962454, -13.583435, 17.159096, 6.3768234, -13.211996, 17.002844, 6.540546, -13.478861, 18.554626, 7.9619274, -13.658262, 18.62324, 7.962454, -13.583435, 17.159096, 6.3768234, -13.211996, 18.62324, 7.962454, -13.583435, 18.715752, 7.9632435, -13.625875, 17.159096, 6.3768234, -13.211996, 18.715752, 7.9632435, -13.625875, 17.346697, 6.111762, -13.342499, 15.660074, 5.754575, -13.023067, 17.159096, 6.3768234, -13.211996, 17.346697, 6.111762, -13.342499, 17.346697, 6.111762, -13.342499, 18.715752, 7.9632435, -13.625875, 18.704063, 7.9632435, -13.726791, 15.762983, 5.4234457, -13.149805, 15.190983, 5.5363665, -13.037777, 15.660074, 5.754575, -13.023067, 15.660074, 5.754575, -13.023067, 17.346697, 6.111762, -13.342499, 15.762983, 5.4234457, -13.149805, 15.762983, 5.4234457, -13.149805, 15.255903, 5.327897, -13.117506, 15.190983, 5.5363665, -13.037777, 17.346697, 6.111762, -13.342499, 18.704063, 7.9632435, -13.726791, 17.30647, 6.111762, -13.690155, 15.762983, 5.4234457, -13.149805, 17.346697, 6.111762, -13.342499, 17.30647, 6.111762, -13.690155, 17.30647, 6.111762, -13.690155, 18.704063, 7.9632435, -13.726791, 18.604456, 7.962454, -13.746929, 15.72068, 5.4234457, -13.5163, 15.255903, 5.327897, -13.117506, 15.762983, 5.4234457, -13.149805, 15.762983, 5.4234457, -13.149805, 17.30647, 6.111762, -13.690155, 15.72068, 5.4234457, -13.5163, 15.72068, 5.4234457, -13.5163, 15.229303, 5.327897, -13.348473, 15.255903, 5.327897, -13.117506, 17.30647, 6.111762, -13.690155, 18.604456, 7.962454, -13.746929, 17.094133, 6.3768234, -13.774481, 15.72068, 5.4234457, -13.5163, 17.30647, 6.111762, -13.690155, 17.094133, 6.3768234, -13.774481, 17.094133, 6.3768234, -13.774481, 18.604456, 7.962454, -13.746929, 18.554626, 7.9619274, -13.658262, 17.094133, 6.3768234, -13.774481, 18.554626, 7.9619274, -13.658262, 17.002844, 6.540546, -13.478861, 15.72068, 5.4234457, -13.5163, 17.094133, 6.3768234, -13.774481, 15.591234, 5.754575, -13.61615, 15.591234, 5.754575, -13.61615, 15.229303, 5.327897, -13.348473, 15.72068, 5.4234457, -13.5163, 15.591234, 5.754575, -13.61615, 17.094133, 6.3768234, -13.774481, 17.002844, 6.540546, -13.478861, 15.591234, 5.754575, -13.61615, 15.147818, 5.5363665, -13.411282, 15.229303, 5.327897, -13.348473, 15.591234, 5.754575, -13.61615, 17.002844, 6.540546, -13.478861, 15.553728, 5.9588323, -13.311363, 15.553728, 5.9588323, -13.311363, 15.147818, 5.5363665, -13.411282, 15.591234, 5.754575, -13.61615, 15.553728, 5.9588323, -13.311363, 15.124199, 5.6650805, -13.219332, 15.147818, 5.5363665, -13.411282, 20.456669, 8.048263, -14.631794, 19.118647, 8.967159, -15.3941345, 19.346407, 7.711606, -15.0057125, 19.346407, 7.711606, -15.0057125, 19.118647, 8.967159, -15.3941345, 17.589626, 8.974004, -14.720594, 19.346407, 7.711606, -15.0057125, 17.589626, 8.974004, -14.720594, 18.110191, 8.048264, -14.360323, 20.456669, 8.048263, -14.631794, 20.670847, 8.974003, -15.076887, 19.118647, 8.967159, -15.3941345, 20.868176, 7.746087, -13.371468, 20.670847, 8.974003, -15.076887, 20.456669, 8.048263, -14.631794, 19.118647, 8.967159, -15.3941345, 18.014603, 9.910537, -14.417248, 17.589626, 8.974004, -14.720594, 20.868176, 7.746087, -13.371468, 20.929647, 8.994798, -13.616339, 20.670847, 8.974003, -15.076887, 20.26757, 8.091167, -12.117716, 20.929647, 8.994798, -13.616339, 20.868176, 7.746087, -13.371468, 20.670847, 8.974003, -15.076887, 18.914066, 10.236665, -14.791771, 19.118647, 8.967159, -15.3941345, 19.118647, 8.967159, -15.3941345, 18.914066, 10.236665, -14.791771, 18.014603, 9.910537, -14.417248, 20.929647, 8.994798, -13.616339, 19.975527, 9.910536, -14.644192, 20.670847, 8.974003, -15.076887, 20.670847, 8.974003, -15.076887, 19.975527, 9.910536, -14.644192, 18.914066, 10.236665, -14.791771, 20.26757, 8.091167, -12.117716, 20.306274, 9.015329, -12.053684, 20.929647, 8.994798, -13.616339, 20.306274, 9.015329, -12.053684, 20.26757, 8.091167, -12.117716, 19.308578, 7.78057, -11.381147, 20.929647, 8.994798, -13.616339, 20.10909, 10.243508, -13.758886, 19.975527, 9.910536, -14.644192, 20.306274, 9.015329, -12.053684, 20.10909, 10.243508, -13.758886, 20.929647, 8.994798, -13.616339, 19.975527, 9.910536, -14.644192, 18.948578, 10.659921, -13.703939, 18.914066, 10.236665, -14.791771, 19.975527, 9.910536, -14.644192, 20.10909, 10.243508, -13.758886, 18.948578, 10.659921, -13.703939, 20.306274, 9.015329, -12.053684, 19.881817, 9.928962, -12.708981, 20.10909, 10.243508, -13.758886, 20.306274, 9.015329, -12.053684, 19.308578, 7.78057, -11.381147, 19.211441, 9.022436, -11.43041, 19.881817, 9.928962, -12.708981, 20.306274, 9.015329, -12.053684, 19.211441, 9.022436, -11.43041, 19.211441, 9.022436, -11.43041, 19.308578, 7.78057, -11.381147, 18.306646, 8.091168, -11.890772, 20.10909, 10.243508, -13.758886, 19.881817, 9.928962, -12.708981, 19.091122, 10.250615, -12.470457, 19.881817, 9.928962, -12.708981, 19.211441, 9.022436, -11.43041, 19.091122, 10.250615, -12.470457, 20.10909, 10.243508, -13.758886, 19.091122, 10.250615, -12.470457, 18.948578, 10.659921, -13.703939, 19.211441, 9.022436, -11.43041, 18.306646, 8.091168, -11.890772, 18.093428, 9.015329, -11.79792, 19.091122, 10.250615, -12.470457, 19.211441, 9.022436, -11.43041, 18.093428, 9.015329, -11.79792, 17.78659, 7.746088, -13.015247, 18.093428, 9.015329, -11.79792, 18.306646, 8.091168, -11.890772, 18.948578, 10.659921, -13.703939, 19.091122, 10.250615, -12.470457, 18.306887, 9.928962, -12.526855, 19.091122, 10.250615, -12.470457, 18.093428, 9.015329, -11.79792, 18.306887, 9.928962, -12.526855, 17.78659, 7.746088, -13.015247, 17.400074, 8.994799, -13.208279, 18.093428, 9.015329, -11.79792, 17.400074, 8.994799, -13.208279, 18.306887, 9.928962, -12.526855, 18.093428, 9.015329, -11.79792, 18.110191, 8.048264, -14.360323, 17.400074, 8.994799, -13.208279, 17.78659, 7.746088, -13.015247, 18.110191, 8.048264, -14.360323, 17.589626, 8.974004, -14.720594, 17.400074, 8.994799, -13.208279, 17.400074, 8.994799, -13.208279, 17.896025, 10.243508, -13.502977, 18.306887, 9.928962, -12.526855, 18.948578, 10.659921, -13.703939, 18.306887, 9.928962, -12.526855, 17.896025, 10.243508, -13.502977, 17.589626, 8.974004, -14.720594, 17.896025, 10.243508, -13.502977, 17.400074, 8.994799, -13.208279, 18.914066, 10.236665, -14.791771, 18.948578, 10.659921, -13.703939, 17.896025, 10.243508, -13.502977, 17.589626, 8.974004, -14.720594, 18.014603, 9.910537, -14.417248, 17.896025, 10.243508, -13.502977, 18.914066, 10.236665, -14.791771, 17.896025, 10.243508, -13.502977, 18.014603, 9.910537, -14.417248, 20.26757, 8.091167, -12.117716, 19.381508, 7.3296757, -13.120605, 19.308578, 7.78057, -11.381147, 20.26757, 8.091167, -12.117716, 20.868176, 7.746087, -13.371468, 19.381508, 7.3296757, -13.120605, 19.308578, 7.78057, -11.381147, 19.381508, 7.3296757, -13.120605, 17.78659, 7.746088, -13.015247, 19.308578, 7.78057, -11.381147, 17.78659, 7.746088, -13.015247, 18.306646, 8.091168, -11.890772, 19.381508, 7.3296757, -13.120605, 18.110191, 8.048264, -14.360323, 17.78659, 7.746088, -13.015247, 19.381508, 7.3296757, -13.120605, 19.346407, 7.711606, -15.0057125, 18.110191, 8.048264, -14.360323, 20.868176, 7.746087, -13.371468, 19.346407, 7.711606, -15.0057125, 19.381508, 7.3296757, -13.120605, 20.868176, 7.746087, -13.371468, 20.456669, 8.048263, -14.631794, 19.346407, 7.711606, -15.0057125, 10.316184, 8.502844, -12.777889, 10.408148, 10.86813, -10.2968025, 10.597721, 7.6100063, -10.6023655, 10.597721, 7.6100063, -10.6023655, 10.408148, 10.86813, -10.2968025, 12.878351, 10.951043, -8.855707, 10.597721, 7.6100063, -10.6023655, 12.878351, 10.951043, -8.855707, 12.835861, 8.458624, -9.37719, 10.316184, 8.502844, -12.777889, 9.524521, 10.8173275, -12.634127, 10.408148, 10.86813, -10.2968025, 12.073738, 7.8355837, -14.893578, 9.524521, 10.8173275, -12.634127, 10.316184, 8.502844, -12.777889, 10.408148, 10.86813, -10.2968025, 13.069418, 13.342123, -9.872105, 12.878351, 10.951043, -8.855707, 12.073738, 7.8355837, -14.893578, 11.829742, 11.048433, -14.919933, 9.524521, 10.8173275, -12.634127, 14.779421, 8.739476, -15.246426, 11.829742, 11.048433, -14.919933, 12.073738, 7.8355837, -14.893578, 9.524521, 10.8173275, -12.634127, 11.80493, 14.158102, -10.887323, 10.408148, 10.86813, -10.2968025, 10.408148, 10.86813, -10.2968025, 11.80493, 14.158102, -10.887323, 13.069418, 13.342123, -9.872105, 11.829742, 11.048433, -14.919933, 11.051523, 13.282636, -12.346281, 9.524521, 10.8173275, -12.634127, 9.524521, 10.8173275, -12.634127, 11.051523, 13.282636, -12.346281, 11.80493, 14.158102, -10.887323, 14.779421, 8.739476, -15.246426, 15.010525, 11.22163, -15.7902565, 11.829742, 11.048433, -14.919933, 15.010525, 11.22163, -15.7902565, 14.779421, 8.739476, -15.246426, 16.7401, 7.770304, -13.896193, 11.829742, 11.048433, -14.919933, 12.461086, 14.203112, -13.530659, 11.051523, 13.282636, -12.346281, 15.010525, 11.22163, -15.7902565, 12.461086, 14.203112, -13.530659, 11.829742, 11.048433, -14.919933, 11.051523, 13.282636, -12.346281, 13.462879, 15.254671, -11.875458, 11.80493, 14.158102, -10.887323, 11.051523, 13.282636, -12.346281, 12.461086, 14.203112, -13.530659, 13.462879, 15.254671, -11.875458, 15.010525, 11.22163, -15.7902565, 14.284246, 13.462151, -14.276512, 12.461086, 14.203112, -13.530659, 15.010525, 11.22163, -15.7902565, 16.7401, 7.770304, -13.896193, 16.752848, 10.996315, -13.881273, 14.284246, 13.462151, -14.276512, 15.010525, 11.22163, -15.7902565, 16.752848, 10.996315, -13.881273, 16.752848, 10.996315, -13.881273, 16.7401, 7.770304, -13.896193, 16.65236, 8.421508, -11.429792, 12.461086, 14.203112, -13.530659, 14.284246, 13.462151, -14.276512, 15.179819, 14.190213, -12.970345, 14.284246, 13.462151, -14.276512, 16.752848, 10.996315, -13.881273, 15.179819, 14.190213, -12.970345, 12.461086, 14.203112, -13.530659, 15.179819, 14.190213, -12.970345, 13.462879, 15.254671, -11.875458, 16.752848, 10.996315, -13.881273, 16.65236, 8.421508, -11.429792, 16.909176, 10.738624, -11.076134, 15.179819, 14.190213, -12.970345, 16.752848, 10.996315, -13.881273, 16.909176, 10.738624, -11.076134, 15.264158, 7.544727, -9.605343, 16.909176, 10.738624, -11.076134, 16.65236, 8.421508, -11.429792, 13.462879, 15.254671, -11.875458, 15.179819, 14.190213, -12.970345, 15.655621, 13.247626, -11.386549, 15.179819, 14.190213, -12.970345, 16.909176, 10.738624, -11.076134, 15.655621, 13.247626, -11.386549, 15.264158, 7.544727, -9.605343, 15.3314705, 10.815748, -9.258287, 16.909176, 10.738624, -11.076134, 15.3314705, 10.815748, -9.258287, 15.655621, 13.247626, -11.386549, 16.909176, 10.738624, -11.076134, 12.835861, 8.458624, -9.37719, 15.3314705, 10.815748, -9.258287, 15.264158, 7.544727, -9.605343, 12.835861, 8.458624, -9.37719, 12.878351, 10.951043, -8.855707, 15.3314705, 10.815748, -9.258287, 15.3314705, 10.815748, -9.258287, 14.523663, 14.14494, -10.327007, 15.655621, 13.247626, -11.386549, 13.462879, 15.254671, -11.875458, 15.655621, 13.247626, -11.386549, 14.523663, 14.14494, -10.327007, 12.878351, 10.951043, -8.855707, 14.523663, 14.14494, -10.327007, 15.3314705, 10.815748, -9.258287, 11.80493, 14.158102, -10.887323, 13.462879, 15.254671, -11.875458, 14.523663, 14.14494, -10.327007, 12.878351, 10.951043, -8.855707, 13.069418, 13.342123, -9.872105, 14.523663, 14.14494, -10.327007, 11.80493, 14.158102, -10.887323, 14.523663, 14.14494, -10.327007, 13.069418, 13.342123, -9.872105, 14.779421, 8.739476, -15.246426, 13.698336, 6.609247, -12.302765, 16.7401, 7.770304, -13.896193, 14.779421, 8.739476, -15.246426, 12.073738, 7.8355837, -14.893578, 13.698336, 6.609247, -12.302765, 16.7401, 7.770304, -13.896193, 13.698336, 6.609247, -12.302765, 15.264158, 7.544727, -9.605343, 16.7401, 7.770304, -13.896193, 15.264158, 7.544727, -9.605343, 16.65236, 8.421508, -11.429792, 13.698336, 6.609247, -12.302765, 12.835861, 8.458624, -9.37719, 15.264158, 7.544727, -9.605343, 13.698336, 6.609247, -12.302765, 10.597721, 7.6100063, -10.6023655, 12.835861, 8.458624, -9.37719, 12.073738, 7.8355837, -14.893578, 10.597721, 7.6100063, -10.6023655, 13.698336, 6.609247, -12.302765, 12.073738, 7.8355837, -14.893578, 10.316184, 8.502844, -12.777889, 10.597721, 7.6100063, -10.6023655, 0.9335377, -18.661976, -2.173924, 1.8889831, -18.823338, -0.58916974, 1.5114222, -18.399822, -1.4170885, 0.9335377, -18.661976, -2.173924, 0.9335377, -18.661974, 1.0975094, 1.8889831, -18.823338, -0.58916974, 1.8889831, -18.823338, -0.58916974, 0.9335377, -18.661974, 1.0975094, 1.6508096, -18.476696, 0.3862325, -0.9279604, -18.475744, -2.1898937, 0.9335377, -18.661976, -2.173924, -0.001098156, -18.845234, -2.413155, -1.7685199, -18.399822, -0.5382087, 0.9335377, -18.661976, -2.173924, -0.9279604, -18.475744, -2.1898937, 0.9335377, -18.661974, 1.0975094, 0.9335377, -18.661976, -2.173924, -1.7685199, -18.399822, -0.5382087, -1.7685199, -18.399822, -0.5382087, -0.9279604, -18.475744, -2.1898937, -1.6464877, -18.661976, -1.4825313, 0.9335377, -18.661974, 1.0975094, -1.7685199, -18.399822, -0.5382087, -0.95520806, -18.661974, 1.0975094, -0.95520806, -18.661974, 1.0975094, -1.7685199, -18.399822, -0.5382087, -1.6464877, -18.661974, 0.40619445, 0.9335377, -18.661974, 1.0975094, -0.95520806, -18.661974, 1.0975094, -0.010835171, -18.399822, 1.2195511, 1.5114222, -18.399822, -1.4170885, -0.010835171, -14.884386, -0.5382099, 0.9335377, -18.661976, -2.173924, 0.9335377, -18.661976, -2.173924, -0.010835171, -14.884386, -0.5382099, -0.001098156, -18.845234, -2.413155, -0.001098156, -18.845234, -2.413155, -0.010835171, -14.884386, -0.5382099, -0.9279604, -18.475744, -2.1898937, -0.9279604, -18.475744, -2.1898937, -0.010835171, -14.884386, -0.5382099, -1.6464877, -18.661976, -1.4825313, -1.6464877, -18.661976, -1.4825313, -0.010835171, -14.884386, -0.5382099, -1.7685199, -18.399822, -0.5382087, -1.7685199, -18.399822, -0.5382087, -0.010835171, -14.884386, -0.5382099, -1.6464877, -18.661974, 0.40619445, -1.6464877, -18.661974, 0.40619445, -0.010835171, -14.884386, -0.5382099, -0.95520806, -18.661974, 1.0975094, -0.95520806, -18.661974, 1.0975094, -0.010835171, -14.884386, -0.5382099, -0.010835171, -18.399822, 1.2195511, -0.010835171, -18.399822, 1.2195511, -0.010835171, -14.884386, -0.5382099, 0.9335377, -18.661974, 1.0975094, 0.9335377, -18.661974, 1.0975094, -0.010835171, -14.884386, -0.5382099, 1.6508096, -18.476696, 0.3862325, 1.6508096, -18.476696, 0.3862325, -0.010835171, -14.884386, -0.5382099, 1.8889831, -18.823338, -0.58916974, 1.8889831, -18.823338, -0.58916974, -0.010835171, -14.884386, -0.5382099, 1.5114222, -18.399822, -1.4170885, 0.79053855, -17.29707, -2.0162632, 1.2353985, -16.7235, -0.5382092, 1.198884, -17.024681, -1.2366474, 0.79053855, -17.29707, -2.0162632, 0.4979446, -16.83131, 0.34912467, 1.2353985, -16.7235, -0.5382092, 1.2353985, -16.7235, -0.5382092, 0.4979446, -16.83131, 0.34912467, 1.198884, -17.024681, 0.16022909, 0.4979446, -16.83131, 0.34912467, -0.88492775, -17.22686, 1.0175039, -0.010835171, -17.024681, 0.8586674, 0.4979446, -16.83131, 0.34912467, -1.2205544, -17.024681, 0.16022909, -0.88492775, -17.22686, 1.0175039, 0.79053855, -17.29707, -2.0162632, -1.2205544, -17.024681, 0.16022909, 0.4979446, -16.83131, 0.34912467, -1.2205544, -17.024681, 0.16022909, 0.79053855, -17.29707, -2.0162632, -0.6996014, -16.880219, -1.4757214, -0.6996014, -16.880219, -1.4757214, 0.79053855, -17.29707, -2.0162632, -0.010835171, -17.024681, -1.9350855, -1.2205544, -17.024681, 0.16022909, -0.6996014, -16.880219, -1.4757214, -1.2205544, -17.024681, -1.2366474, -1.2205544, -17.024681, 0.16022909, -1.2205544, -17.024681, -1.2366474, -1.5400834, -17.234833, -0.5375037, 1.198884, -17.024681, -1.2366474, -0.010835171, -14.231086, -0.53821015, 0.79053855, -17.29707, -2.0162632, 0.79053855, -17.29707, -2.0162632, -0.010835171, -14.231086, -0.53821015, -0.010835171, -17.024681, -1.9350855, -0.010835171, -17.024681, -1.9350855, -0.010835171, -14.231086, -0.53821015, -0.6996014, -16.880219, -1.4757214, -0.6996014, -16.880219, -1.4757214, -0.010835171, -14.231086, -0.53821015, -1.2205544, -17.024681, -1.2366474, -1.2205544, -17.024681, -1.2366474, -0.010835171, -14.231086, -0.53821015, -1.5400834, -17.234833, -0.5375037, -1.5400834, -17.234833, -0.5375037, -0.010835171, -14.231086, -0.53821015, -1.2205544, -17.024681, 0.16022909, -1.2205544, -17.024681, 0.16022909, -0.010835171, -14.231086, -0.53821015, -0.88492775, -17.22686, 1.0175039, -0.88492775, -17.22686, 1.0175039, -0.010835171, -14.231086, -0.53821015, -0.010835171, -17.024681, 0.8586674, -0.010835171, -17.024681, 0.8586674, -0.010835171, -14.231086, -0.53821015, 0.4979446, -16.83131, 0.34912467, 0.4979446, -16.83131, 0.34912467, -0.010835171, -14.231086, -0.53821015, 1.198884, -17.024681, 0.16022909, 1.198884, -17.024681, 0.16022909, -0.010835171, -14.231086, -0.53821015, 1.2353985, -16.7235, -0.5382092, 1.2353985, -16.7235, -0.5382092, -0.010835171, -14.231086, -0.53821015, 1.198884, -17.024681, -1.2366474, 1.3094504, -20.552734, -2.7694182, 2.5816762, -20.552734, -0.51041746, 2.2008963, -20.875694, -1.8151531, 1.3094504, -20.552734, -2.7694182, 1.2661028, -20.875694, 1.6735137, 2.5816762, -20.552734, -0.51041746, 2.5816762, -20.552734, -0.51041746, 1.2661028, -20.875694, 1.6735137, 2.2298722, -20.624132, 0.7323996, -1.2877731, -20.875696, -2.7499266, 1.3094504, -20.552734, -2.7694182, -0.039105892, -21.061094, -3.1164474, -2.5646338, -20.875694, -0.53820777, 1.3094504, -20.552734, -2.7694182, -1.2877731, -20.875696, -2.7499266, 1.2661028, -20.875694, 1.6735137, 1.3094504, -20.552734, -2.7694182, -2.5646338, -20.875694, -0.53820777, -2.5646338, -20.875694, -0.53820777, -1.2877731, -20.875696, -2.7499266, -2.1870723, -20.562729, -1.6952248, 1.2661028, -20.875694, 1.6735137, -2.5646338, -20.875694, -0.53820777, -1.2877731, -20.875694, 1.6735137, -1.2877731, -20.875694, 1.6735137, -2.5646338, -20.875694, -0.53820777, -2.1694045, -20.59831, 0.7562758, 1.2661028, -20.875694, 1.6735137, -1.2877731, -20.875694, 1.6735137, -0.033530712, -21.08287, 2.0138073, 2.2008963, -20.875694, -1.8151531, -0.010835171, -15.767945, -0.5382097, 1.3094504, -20.552734, -2.7694182, 1.3094504, -20.552734, -2.7694182, -0.010835171, -15.767945, -0.5382097, -0.039105892, -21.061094, -3.1164474, -0.039105892, -21.061094, -3.1164474, -0.010835171, -15.767945, -0.5382097, -1.2877731, -20.875696, -2.7499266, -1.2877731, -20.875696, -2.7499266, -0.010835171, -15.767945, -0.5382097, -2.1870723, -20.562729, -1.6952248, -2.1870723, -20.562729, -1.6952248, -0.010835171, -15.767945, -0.5382097, -2.5646338, -20.875694, -0.53820777, -2.5646338, -20.875694, -0.53820777, -0.010835171, -15.767945, -0.5382097, -2.1694045, -20.59831, 0.7562758, -2.1694045, -20.59831, 0.7562758, -0.010835171, -15.767945, -0.5382097, -1.2877731, -20.875694, 1.6735137, -1.2877731, -20.875694, 1.6735137, -0.010835171, -15.767945, -0.5382097, -0.033530712, -21.08287, 2.0138073, -0.033530712, -21.08287, 2.0138073, -0.010835171, -15.767945, -0.5382097, 1.2661028, -20.875694, 1.6735137, 1.2661028, -20.875694, 1.6735137, -0.010835171, -15.767945, -0.5382097, 2.2298722, -20.624132, 0.7323996, 2.2298722, -20.624132, 0.7323996, -0.010835171, -15.767945, -0.5382097, 2.5816762, -20.552734, -0.51041746, 2.5816762, -20.552734, -0.51041746, -0.010835171, -15.767945, -0.5382097, 2.2008963, -20.875694, -1.8151531, 0.5583327, -21.275528, -0.82769513, 0.37442207, -20.354485, -1.1662683, 0.31780314, -21.275528, -1.0682597, 0.5583327, -21.275528, -0.82769513, 0.65641344, -20.354485, -0.8842943, 0.37442207, -20.354485, -1.1662683, 0.6890812, -22.029617, -0.9031601, 0.5583327, -21.275528, -0.82769513, 0.31780314, -21.275528, -1.0682597, 0.6890812, -22.029617, -0.9031601, 0.31780314, -21.275528, -1.0682597, 0.39326835, -22.029617, -1.1989906, 0.31780314, -21.275528, -1.0682597, -0.010835171, -20.354485, -1.2695241, -0.010835171, -21.275528, -1.1563258, 0.31780314, -21.275528, -1.0682597, 0.37442207, -20.354485, -1.1662683, -0.010835171, -20.354485, -1.2695241, 0.39326835, -22.029617, -1.1989906, 0.31780314, -21.275528, -1.0682597, -0.010835171, -21.275528, -1.1563258, 0.39326835, -22.029617, -1.1989906, -0.010835171, -21.275528, -1.1563258, -0.010835171, -22.029617, -1.307256, -0.010835171, -21.275528, -1.1563258, -0.3960147, -20.354485, -1.1662683, -0.339396, -21.275528, -1.0682597, -0.010835171, -21.275528, -1.1563258, -0.010835171, -20.354485, -1.2695241, -0.3960147, -20.354485, -1.1662683, -0.010835171, -22.029617, -1.307256, -0.010835171, -21.275528, -1.1563258, -0.339396, -21.275528, -1.0682597, -0.010835171, -22.029617, -1.307256, -0.339396, -21.275528, -1.0682597, -0.4148612, -22.029617, -1.1989906, -0.339396, -21.275528, -1.0682597, -0.6780064, -20.354485, -0.8842943, -0.580003, -21.275528, -0.82769513, -0.339396, -21.275528, -1.0682597, -0.3960147, -20.354485, -1.1662683, -0.6780064, -20.354485, -0.8842943, -0.4148612, -22.029617, -1.1989906, -0.339396, -21.275528, -1.0682597, -0.580003, -21.275528, -0.82769513, -0.4148612, -22.029617, -1.1989906, -0.580003, -21.275528, -0.82769513, -0.71067405, -22.029617, -0.9031601, -0.580003, -21.275528, -0.82769513, -0.78126955, -20.354485, -0.49906468, -0.6680341, -21.275528, -0.49906445, -0.580003, -21.275528, -0.82769513, -0.6780064, -20.354485, -0.8842943, -0.78126955, -20.354485, -0.49906468, -0.71067405, -22.029617, -0.9031601, -0.580003, -21.275528, -0.82769513, -0.6680341, -21.275528, -0.49906445, -0.71067405, -22.029617, -0.9031601, -0.6680341, -21.275528, -0.49906445, -0.8189645, -22.029617, -0.49906397, -0.6680341, -21.275528, -0.49906445, -0.6780064, -20.354485, -0.11391497, -0.580003, -21.275528, -0.17051363, -0.6680341, -21.275528, -0.49906445, -0.78126955, -20.354485, -0.49906468, -0.6780064, -20.354485, -0.11391497, -0.8189645, -22.029617, -0.49906397, -0.6680341, -21.275528, -0.49906445, -0.580003, -21.275528, -0.17051363, -0.8189645, -22.029617, -0.49906397, -0.580003, -21.275528, -0.17051363, -0.71067405, -22.029617, -0.09504819, -0.580003, -21.275528, -0.17051363, -0.3960147, -20.354485, 0.16813636, -0.339396, -21.275528, 0.07004857, -0.580003, -21.275528, -0.17051363, -0.6780064, -20.354485, -0.11391497, -0.3960147, -20.354485, 0.16813636, -0.71067405, -22.029617, -0.09504819, -0.580003, -21.275528, -0.17051363, -0.339396, -21.275528, 0.07004857, -0.71067405, -22.029617, -0.09504819, -0.339396, -21.275528, 0.07004857, -0.4148612, -22.029617, 0.2007823, -0.339396, -21.275528, 0.07004857, -0.010835171, -20.354485, 0.27131462, -0.010835171, -21.275528, 0.15811706, -0.339396, -21.275528, 0.07004857, -0.3960147, -20.354485, 0.16813636, -0.010835171, -20.354485, 0.27131462, -0.4148612, -22.029617, 0.2007823, -0.339396, -21.275528, 0.07004857, -0.010835171, -21.275528, 0.15811706, -0.4148612, -22.029617, 0.2007823, -0.010835171, -21.275528, 0.15811706, -0.010835171, -22.029617, 0.3090477, -0.010835171, -21.275528, 0.15811706, 0.37442207, -20.354485, 0.16813636, 0.31780314, -21.275528, 0.07004857, -0.010835171, -21.275528, 0.15811706, -0.010835171, -20.354485, 0.27131462, 0.37442207, -20.354485, 0.16813636, -0.010835171, -22.029617, 0.3090477, -0.010835171, -21.275528, 0.15811706, 0.31780314, -21.275528, 0.07004857, -0.010835171, -22.029617, 0.3090477, 0.31780314, -21.275528, 0.07004857, 0.39326835, -22.029617, 0.2007823, 0.31780314, -21.275528, 0.07004857, 0.65641344, -20.354485, -0.11391497, 0.5583327, -21.275528, -0.17051363, 0.31780314, -21.275528, 0.07004857, 0.37442207, -20.354485, 0.16813636, 0.65641344, -20.354485, -0.11391497, 0.39326835, -22.029617, 0.2007823, 0.31780314, -21.275528, 0.07004857, 0.5583327, -21.275528, -0.17051363, 0.39326835, -22.029617, 0.2007823, 0.5583327, -21.275528, -0.17051363, 0.6890812, -22.029617, -0.09504819, 0.5583327, -21.275528, -0.17051363, 0.759599, -20.354485, -0.49906468, 0.64644134, -21.275528, -0.49906445, 0.5583327, -21.275528, -0.17051363, 0.65641344, -20.354485, -0.11391497, 0.759599, -20.354485, -0.49906468, 0.6890812, -22.029617, -0.09504819, 0.5583327, -21.275528, -0.17051363, 0.64644134, -21.275528, -0.49906445, 0.6890812, -22.029617, -0.09504819, 0.64644134, -21.275528, -0.49906445, 0.7973716, -22.029617, -0.49906397, 0.64644134, -21.275528, -0.49906445, 0.65641344, -20.354485, -0.8842943, 0.5583327, -21.275528, -0.82769513, 0.64644134, -21.275528, -0.49906445, 0.759599, -20.354485, -0.49906468, 0.65641344, -20.354485, -0.8842943, 0.7973716, -22.029617, -0.49906397, 0.64644134, -21.275528, -0.49906445, 0.5583327, -21.275528, -0.82769513, 0.7973716, -22.029617, -0.49906397, 0.5583327, -21.275528, -0.82769513, 0.6890812, -22.029617, -0.9031601, 0.39326835, -22.029617, -1.1989906, -0.010835171, -22.029617, -0.49906397, 0.6890812, -22.029617, -0.9031601, 0.6890812, -22.029617, -0.9031601, -0.010835171, -22.029617, -0.49906397, 0.7973716, -22.029617, -0.49906397, -0.010835171, -22.029617, -1.307256, -0.010835171, -22.029617, -0.49906397, 0.39326835, -22.029617, -1.1989906, 0.7973716, -22.029617, -0.49906397, -0.010835171, -22.029617, -0.49906397, 0.6890812, -22.029617, -0.09504819, -0.4148612, -22.029617, -1.1989906, -0.010835171, -22.029617, -0.49906397, -0.010835171, -22.029617, -1.307256, 0.6890812, -22.029617, -0.09504819, -0.010835171, -22.029617, -0.49906397, 0.39326835, -22.029617, 0.2007823, -0.71067405, -22.029617, -0.9031601, -0.010835171, -22.029617, -0.49906397, -0.4148612, -22.029617, -1.1989906, 0.39326835, -22.029617, 0.2007823, -0.010835171, -22.029617, -0.49906397, -0.010835171, -22.029617, 0.3090477, -0.8189645, -22.029617, -0.49906397, -0.010835171, -22.029617, -0.49906397, -0.71067405, -22.029617, -0.9031601, -0.010835171, -22.029617, 0.3090477, -0.010835171, -22.029617, -0.49906397, -0.4148612, -22.029617, 0.2007823, -0.71067405, -22.029617, -0.09504819, -0.010835171, -22.029617, -0.49906397, -0.8189645, -22.029617, -0.49906397, -0.4148612, -22.029617, 0.2007823, -0.010835171, -22.029617, -0.49906397, -0.71067405, -22.029617, -0.09504819, 9.266797, -17.581049, 9.7409115, 10.985607, -16.33984, 10.792019, 10.863857, -18.049467, 10.526733, 10.863857, -18.049467, 10.526733, 10.985607, -16.33984, 10.792019, 13.068386, -16.296267, 9.768465, 10.863857, -18.049467, 10.526733, 13.068386, -16.296267, 9.768465, 12.696516, -17.604118, 9.563199, 9.266797, -17.581049, 9.7409115, 9.008772, -16.366539, 10.340904, 10.985607, -16.33984, 10.792019, 8.624725, -17.931135, 7.6034517, 9.008772, -16.366539, 10.340904, 9.266797, -17.581049, 9.7409115, 10.985607, -16.33984, 10.792019, 12.4669, -15.041601, 9.18321, 13.068386, -16.296267, 9.768465, 8.624725, -17.931135, 7.6034517, 8.497637, -16.245218, 7.7565994, 9.008772, -16.366539, 10.340904, 9.600649, -17.456738, 5.615509, 8.497637, -16.245218, 7.7565994, 8.624725, -17.931135, 7.6034517, 9.008772, -16.366539, 10.340904, 11.213087, -14.61334, 9.582636, 10.985607, -16.33984, 10.792019, 10.985607, -16.33984, 10.792019, 11.213087, -14.61334, 9.582636, 12.4669, -15.041601, 9.18321, 8.497637, -16.245218, 7.7565994, 9.8885765, -15.072786, 9.437603, 9.008772, -16.366539, 10.340904, 9.008772, -16.366539, 10.340904, 9.8885765, -15.072786, 9.437603, 11.213087, -14.61334, 9.582636, 9.600649, -17.456738, 5.615509, 9.33643, -16.15444, 5.2154427, 8.497637, -16.245218, 7.7565994, 9.33643, -16.15444, 5.2154427, 9.600649, -17.456738, 5.615509, 11.392937, -17.965525, 4.8956895, 8.497637, -16.245218, 7.7565994, 9.720263, -14.589846, 7.952894, 9.8885765, -15.072786, 9.437603, 9.33643, -16.15444, 5.2154427, 9.720263, -14.589846, 7.952894, 8.497637, -16.245218, 7.7565994, 9.8885765, -15.072786, 9.437603, 11.288914, -14.037912, 8.018254, 11.213087, -14.61334, 9.582636, 9.8885765, -15.072786, 9.437603, 9.720263, -14.589846, 7.952894, 11.288914, -14.037912, 8.018254, 9.33643, -16.15444, 5.2154427, 10.034036, -14.978592, 6.3855233, 9.720263, -14.589846, 7.952894, 9.33643, -16.15444, 5.2154427, 11.392937, -17.965525, 4.8956895, 11.408957, -16.27256, 4.8937664, 10.034036, -14.978592, 6.3855233, 9.33643, -16.15444, 5.2154427, 11.408957, -16.27256, 4.8937664, 11.408957, -16.27256, 4.8937664, 11.392937, -17.965525, 4.8956895, 13.021395, -17.62377, 6.061926, 9.720263, -14.589846, 7.952894, 10.034036, -14.978592, 6.3855233, 11.318819, -14.596681, 6.3662996, 10.034036, -14.978592, 6.3855233, 11.408957, -16.27256, 4.8937664, 11.318819, -14.596681, 6.3662996, 9.720263, -14.589846, 7.952894, 11.318819, -14.596681, 6.3662996, 11.288914, -14.037912, 8.018254, 11.408957, -16.27256, 4.8937664, 13.021395, -17.62377, 6.061926, 13.375538, -16.407764, 6.04676, 11.318819, -14.596681, 6.3662996, 11.408957, -16.27256, 4.8937664, 13.375538, -16.407764, 6.04676, 13.632067, -18.083643, 7.819184, 13.375538, -16.407764, 6.04676, 13.021395, -17.62377, 6.061926, 11.288914, -14.037912, 8.018254, 11.318819, -14.596681, 6.3662996, 12.603388, -15.091156, 6.7550454, 11.318819, -14.596681, 6.3662996, 13.375538, -16.407764, 6.04676, 12.603388, -15.091156, 6.7550454, 13.632067, -18.083643, 7.819184, 13.896927, -16.367395, 7.9291854, 13.375538, -16.407764, 6.04676, 13.896927, -16.367395, 7.9291854, 12.603388, -15.091156, 6.7550454, 13.375538, -16.407764, 6.04676, 12.696516, -17.604118, 9.563199, 13.896927, -16.367395, 7.9291854, 13.632067, -18.083643, 7.819184, 12.696516, -17.604118, 9.563199, 13.068386, -16.296267, 9.768465, 13.896927, -16.367395, 7.9291854, 13.896927, -16.367395, 7.9291854, 12.811857, -14.620176, 7.996041, 12.603388, -15.091156, 6.7550454, 11.288914, -14.037912, 8.018254, 12.603388, -15.091156, 6.7550454, 12.811857, -14.620176, 7.996041, 13.068386, -16.296267, 9.768465, 12.811857, -14.620176, 7.996041, 13.896927, -16.367395, 7.9291854, 11.213087, -14.61334, 9.582636, 11.288914, -14.037912, 8.018254, 12.811857, -14.620176, 7.996041, 13.068386, -16.296267, 9.768465, 12.4669, -15.041601, 9.18321, 12.811857, -14.620176, 7.996041, 11.213087, -14.61334, 9.582636, 12.811857, -14.620176, 7.996041, 12.4669, -15.041601, 9.18321, 9.600649, -17.456738, 5.615509, 11.105434, -18.574488, 7.6675305, 11.392937, -17.965525, 4.8956895, 9.600649, -17.456738, 5.615509, 8.624725, -17.931135, 7.6034517, 11.105434, -18.574488, 7.6675305, 11.392937, -17.965525, 4.8956895, 11.105434, -18.574488, 7.6675305, 13.632067, -18.083643, 7.819184, 11.392937, -17.965525, 4.8956895, 13.632067, -18.083643, 7.819184, 13.021395, -17.62377, 6.061926, 11.105434, -18.574488, 7.6675305, 12.696516, -17.604118, 9.563199, 13.632067, -18.083643, 7.819184, 11.105434, -18.574488, 7.6675305, 10.863857, -18.049467, 10.526733, 12.696516, -17.604118, 9.563199, 8.624725, -17.931135, 7.6034517, 10.863857, -18.049467, 10.526733, 11.105434, -18.574488, 7.6675305, 8.624725, -17.931135, 7.6034517, 9.266797, -17.581049, 9.7409115, 10.863857, -18.049467, 10.526733, 7.21563, -18.140032, 8.584928, 8.205864, -17.407396, 9.311369, 8.061045, -18.408522, 8.982858, 8.061045, -18.408522, 8.982858, 8.205864, -17.407396, 9.311369, 9.478685, -17.401842, 8.917924, 8.061045, -18.408522, 8.982858, 9.478685, -17.401842, 8.917924, 9.09955, -18.140032, 8.584928, 7.21563, -18.140032, 8.584928, 7.005238, -17.401842, 8.917924, 8.205864, -17.407396, 9.311369, 7.005238, -18.380968, 7.5489845, 7.005238, -17.401842, 8.917924, 7.21563, -18.140032, 8.584928, 8.205864, -17.407396, 9.311369, 9.169825, -16.65511, 8.638754, 9.478685, -17.401842, 8.917924, 7.005238, -18.380968, 7.5489845, 6.93411, -17.385181, 7.7371626, 7.005238, -17.401842, 8.917924, 7.595832, -18.105644, 6.610869, 6.93411, -17.385181, 7.7371626, 7.005238, -18.380968, 7.5489845, 7.005238, -17.401842, 8.917924, 8.423091, -16.394949, 8.852991, 8.205864, -17.407396, 9.311369, 8.205864, -17.407396, 9.311369, 8.423091, -16.394949, 8.852991, 9.169825, -16.65511, 8.638754, 6.93411, -17.385181, 7.7371626, 7.595832, -16.65511, 8.638754, 7.005238, -17.401842, 8.917924, 7.005238, -17.401842, 8.917924, 7.595832, -16.65511, 8.638754, 8.423091, -16.394949, 8.852991, 7.595832, -18.105644, 6.610869, 7.571055, -17.368736, 6.5566154, 6.93411, -17.385181, 7.7371626, 7.571055, -17.368736, 6.5566154, 7.595832, -18.105644, 6.610869, 8.423091, -18.353416, 6.1153255, 6.93411, -17.385181, 7.7371626, 7.571055, -16.389395, 7.925341, 7.595832, -16.65511, 8.638754, 7.571055, -17.368736, 6.5566154, 7.571055, -16.389395, 7.925341, 6.93411, -17.385181, 7.7371626, 7.595832, -16.65511, 8.638754, 8.495287, -16.05768, 7.988138, 8.423091, -16.394949, 8.852991, 7.595832, -16.65511, 8.638754, 7.571055, -16.389395, 7.925341, 8.495287, -16.05768, 7.988138, 7.571055, -17.368736, 6.5566154, 7.847235, -16.640371, 7.1145287, 7.571055, -16.389395, 7.925341, 7.571055, -17.368736, 6.5566154, 8.423091, -18.353416, 6.1153255, 8.495287, -17.363182, 6.1631703, 7.847235, -16.640371, 7.1145287, 7.571055, -17.368736, 6.5566154, 8.495287, -17.363182, 6.1631703, 8.495287, -17.363182, 6.1631703, 8.423091, -18.353416, 6.1153255, 9.169825, -18.105644, 6.610869, 7.571055, -16.389395, 7.925341, 7.847235, -16.640371, 7.1145287, 8.495287, -16.384056, 6.9979053, 7.847235, -16.640371, 7.1145287, 8.495287, -17.363182, 6.1631703, 8.495287, -16.384056, 6.9979053, 7.571055, -16.389395, 7.925341, 8.495287, -16.384056, 6.9979053, 8.495287, -16.05768, 7.988138, 8.495287, -17.363182, 6.1631703, 9.169825, -18.105644, 6.610869, 9.347322, -17.368736, 6.5566154, 8.495287, -16.384056, 6.9979053, 8.495287, -17.363182, 6.1631703, 9.347322, -17.368736, 6.5566154, 9.478685, -18.380968, 7.5489845, 9.347322, -17.368736, 6.5566154, 9.169825, -18.105644, 6.610869, 8.495287, -16.05768, 7.988138, 8.495287, -16.384056, 6.9979053, 9.1112995, -16.640371, 7.1145287, 8.495287, -16.384056, 6.9979053, 9.347322, -17.368736, 6.5566154, 9.1112995, -16.640371, 7.1145287, 9.478685, -18.380968, 7.5489845, 9.767254, -17.385181, 7.7371626, 9.347322, -17.368736, 6.5566154, 9.767254, -17.385181, 7.7371626, 9.1112995, -16.640371, 7.1145287, 9.347322, -17.368736, 6.5566154, 9.09955, -18.140032, 8.584928, 9.767254, -17.385181, 7.7371626, 9.478685, -18.380968, 7.5489845, 9.09955, -18.140032, 8.584928, 9.478685, -17.401842, 8.917924, 9.767254, -17.385181, 7.7371626, 9.767254, -17.385181, 7.7371626, 9.347322, -16.389395, 7.925341, 9.1112995, -16.640371, 7.1145287, 8.495287, -16.05768, 7.988138, 9.1112995, -16.640371, 7.1145287, 9.347322, -16.389395, 7.925341, 9.478685, -17.401842, 8.917924, 9.347322, -16.389395, 7.925341, 9.767254, -17.385181, 7.7371626, 8.423091, -16.394949, 8.852991, 8.495287, -16.05768, 7.988138, 9.347322, -16.389395, 7.925341, 9.478685, -17.401842, 8.917924, 9.169825, -16.65511, 8.638754, 9.347322, -16.389395, 7.925341, 8.423091, -16.394949, 8.852991, 9.347322, -16.389395, 7.925341, 9.169825, -16.65511, 8.638754, 7.595832, -18.105644, 6.610869, 8.205864, -18.712898, 7.486401, 8.423091, -18.353416, 6.1153255, 7.595832, -18.105644, 6.610869, 7.005238, -18.380968, 7.5489845, 8.205864, -18.712898, 7.486401, 8.423091, -18.353416, 6.1153255, 8.205864, -18.712898, 7.486401, 9.478685, -18.380968, 7.5489845, 8.423091, -18.353416, 6.1153255, 9.478685, -18.380968, 7.5489845, 9.169825, -18.105644, 6.610869, 8.205864, -18.712898, 7.486401, 9.09955, -18.140032, 8.584928, 9.478685, -18.380968, 7.5489845, 8.205864, -18.712898, 7.486401, 8.061045, -18.408522, 8.982858, 9.09955, -18.140032, 8.584928, 7.005238, -18.380968, 7.5489845, 8.061045, -18.408522, 8.982858, 8.205864, -18.712898, 7.486401, 7.005238, -18.380968, 7.5489845, 7.21563, -18.140032, 8.584928, 8.061045, -18.408522, 8.982858, 11.220137, -19.80587, 7.9881396, 9.957781, -19.472874, 7.7623677, 11.16268, -19.969059, 7.7499795, 11.220137, -19.80587, 7.9881396, 10.0568905, -19.342154, 7.988139, 9.957781, -19.472874, 7.7623677, 10.0568905, -19.342154, 7.988139, 8.76399, -18.20817, 7.922565, 9.957781, -19.472874, 7.7623677, 10.0568905, -19.342154, 7.988139, 8.811623, -18.20881, 7.9881387, 8.76399, -18.20817, 7.922565, 9.957781, -19.472874, 7.7623677, 8.76399, -18.20817, 7.922565, 8.686882, -18.207743, 7.9475555, 11.16268, -19.969059, 7.7499795, 9.957781, -19.472874, 7.7623677, 9.797157, -19.68412, 7.848661, 9.957781, -19.472874, 7.7623677, 8.686882, -18.207743, 7.9475555, 9.797157, -19.68412, 7.848661, 11.16268, -19.969059, 7.7499795, 9.797157, -19.68412, 7.848661, 11.069338, -20.23285, 7.8409715, 9.797157, -19.68412, 7.848661, 8.686882, -18.207743, 7.9475555, 8.686882, -18.207743, 8.028723, 11.069338, -20.23285, 7.8409715, 9.797157, -19.68412, 7.848661, 9.797157, -19.68412, 8.127618, 9.797157, -19.68412, 7.848661, 8.686882, -18.207743, 8.028723, 9.797157, -19.68412, 8.127618, 11.069338, -20.23285, 7.8409715, 9.797157, -19.68412, 8.127618, 11.069338, -20.23285, 8.135094, 9.797157, -19.68412, 8.127618, 8.686882, -18.207743, 8.028723, 8.76399, -18.20817, 8.053713, 11.069338, -20.23285, 8.135094, 9.797157, -19.68412, 8.127618, 9.957781, -19.472874, 8.213911, 9.797157, -19.68412, 8.127618, 8.76399, -18.20817, 8.053713, 9.957781, -19.472874, 8.213911, 9.957781, -19.472874, 8.213911, 8.76399, -18.20817, 8.053713, 8.811623, -18.20881, 7.9881387, 11.069338, -20.23285, 8.135094, 9.957781, -19.472874, 8.213911, 11.16268, -19.969059, 8.226086, 9.957781, -19.472874, 8.213911, 8.811623, -18.20881, 7.9881387, 10.0568905, -19.342154, 7.988139, 11.16268, -19.969059, 8.226086, 9.957781, -19.472874, 8.213911, 10.0568905, -19.342154, 7.988139, 11.16268, -19.969059, 8.226086, 10.0568905, -19.342154, 7.988139, 11.220137, -19.80587, 7.9881396, 10.050482, -22.030905, 7.98814, 11.049473, -19.97397, 8.213911, 10.477888, -22.030905, 8.612482, 10.050482, -22.030905, 7.98814, 10.888208, -19.944494, 7.9881396, 11.049473, -19.97397, 8.213911, 10.888208, -19.944494, 7.9881396, 11.13064, -17.907639, 8.087889, 11.049473, -19.97397, 8.213911, 10.888208, -19.944494, 7.9881396, 11.058659, -17.900164, 7.9881387, 11.13064, -17.907639, 8.087889, 11.049473, -19.97397, 8.213911, 11.13064, -17.907639, 8.087889, 11.247263, -17.92024, 8.049868, 10.477888, -22.030905, 8.612482, 11.049473, -19.97397, 8.213911, 11.310488, -20.021389, 8.127618, 11.049473, -19.97397, 8.213911, 11.247263, -17.92024, 8.049868, 11.310488, -20.021389, 8.127618, 10.477888, -22.030905, 8.612482, 11.310488, -20.021389, 8.127618, 11.169514, -22.031118, 8.374109, 11.310488, -20.021389, 8.127618, 11.247263, -17.92024, 8.049868, 11.247263, -17.92024, 7.9264092, 11.169514, -22.031118, 8.374109, 11.310488, -20.021389, 8.127618, 11.310488, -20.021389, 7.848661, 11.310488, -20.021389, 8.127618, 11.247263, -17.92024, 7.9264092, 11.310488, -20.021389, 7.848661, 11.169514, -22.031118, 8.374109, 11.310488, -20.021389, 7.848661, 11.169514, -22.031118, 7.6021714, 11.310488, -20.021389, 7.848661, 11.247263, -17.92024, 7.9264092, 11.13064, -17.907639, 7.888389, 11.169514, -22.031118, 7.6021714, 11.310488, -20.021389, 7.848661, 11.049473, -19.97397, 7.762368, 11.310488, -20.021389, 7.848661, 11.13064, -17.907639, 7.888389, 11.049473, -19.97397, 7.762368, 11.049473, -19.97397, 7.762368, 11.13064, -17.907639, 7.888389, 11.058659, -17.900164, 7.9881387, 11.169514, -22.031118, 7.6021714, 11.049473, -19.97397, 7.762368, 10.477888, -22.030905, 7.3637977, 11.049473, -19.97397, 7.762368, 11.058659, -17.900164, 7.9881387, 10.888208, -19.944494, 7.9881396, 10.477888, -22.030905, 7.3637977, 11.049473, -19.97397, 7.762368, 10.888208, -19.944494, 7.9881396, 10.477888, -22.030905, 7.3637977, 10.888208, -19.944494, 7.9881396, 10.050482, -22.030905, 7.98814, 11.023628, -19.860125, 7.836486, 10.902519, -19.637772, 6.988935, 11.16268, -19.969059, 7.7499795, 11.023628, -19.860125, 7.836486, 10.7801285, -19.55041, 7.099151, 10.902519, -19.637772, 6.988935, 10.7801285, -19.55041, 7.099151, 10.55094, -18.793425, 6.265697, 10.902519, -19.637772, 6.988935, 10.7801285, -19.55041, 7.099151, 10.519327, -18.793852, 6.309698, 10.55094, -18.793425, 6.265697, 10.902519, -19.637772, 6.988935, 10.55094, -18.793425, 6.265697, 10.5189, -18.792997, 6.2221236, 11.16268, -19.969059, 7.7499795, 10.902519, -19.637772, 6.988935, 10.814302, -19.778744, 6.9052052, 10.902519, -19.637772, 6.988935, 10.5189, -18.792997, 6.2221236, 10.814302, -19.778744, 6.9052052, 11.16268, -19.969059, 7.7499795, 10.814302, -19.778744, 6.9052052, 11.085358, -20.145061, 7.710037, 10.814302, -19.778744, 6.9052052, 10.5189, -18.792997, 6.2221236, 10.4674225, -18.792997, 6.238998, 11.085358, -20.145061, 7.710037, 10.814302, -19.778744, 6.9052052, 10.637232, -19.778744, 6.963517, 10.814302, -19.778744, 6.9052052, 10.4674225, -18.792997, 6.238998, 10.637232, -19.778744, 6.963517, 11.085358, -20.145061, 7.710037, 10.637232, -19.778744, 6.963517, 10.898888, -20.145061, 7.771766, 10.637232, -19.778744, 6.963517, 10.4674225, -18.792997, 6.238998, 10.46785, -18.793425, 6.293038, 10.898888, -20.145061, 7.771766, 10.637232, -19.778744, 6.963517, 10.616299, -19.637772, 7.083345, 10.637232, -19.778744, 6.963517, 10.46785, -18.793425, 6.293038, 10.616299, -19.637772, 7.083345, 10.616299, -19.637772, 7.083345, 10.46785, -18.793425, 6.293038, 10.519327, -18.793852, 6.309698, 10.898888, -20.145061, 7.771766, 10.616299, -19.637772, 7.083345, 10.860653, -19.969059, 7.849729, 10.616299, -19.637772, 7.083345, 10.519327, -18.793852, 6.309698, 10.7801285, -19.55041, 7.099151, 10.860653, -19.969059, 7.849729, 10.616299, -19.637772, 7.083345, 10.7801285, -19.55041, 7.099151, 10.860653, -19.969059, 7.849729, 10.7801285, -19.55041, 7.099151, 11.023628, -19.860125, 7.836486, 9.806982, -18.747929, 5.422632, 9.553658, -18.258793, 6.2026863, 9.731583, -18.927135, 6.042062, 9.731583, -18.927135, 6.042062, 9.553658, -18.258793, 6.2026863, 10.069706, -18.254948, 6.927205, 9.731583, -18.927135, 6.042062, 10.069706, -18.254948, 6.927205, 10.201282, -18.747929, 6.6170635, 9.806982, -18.747929, 5.422632, 9.551735, -18.254948, 5.359194, 9.553658, -18.258793, 6.2026863, 10.419577, -18.908766, 5.0725474, 9.551735, -18.254948, 5.359194, 9.806982, -18.747929, 5.422632, 9.553658, -18.258793, 6.2026863, 10.181845, -17.756413, 6.672812, 10.069706, -18.254948, 6.927205, 10.419577, -18.908766, 5.0725474, 10.285225, -18.244055, 5.06678, 9.551735, -18.254948, 5.359194, 11.137901, -18.725073, 5.250473, 10.285225, -18.244055, 5.06678, 10.419577, -18.908766, 5.0725474, 9.551735, -18.254948, 5.359194, 9.889858, -17.582973, 6.244337, 9.553658, -18.258793, 6.2026863, 9.553658, -18.258793, 6.2026863, 9.889858, -17.582973, 6.244337, 10.181845, -17.756413, 6.672812, 10.285225, -18.244055, 5.06678, 9.852264, -17.756414, 5.6751027, 9.551735, -18.254948, 5.359194, 9.551735, -18.254948, 5.359194, 9.852264, -17.756414, 5.6751027, 9.889858, -17.582973, 6.244337, 11.137901, -18.725073, 5.250473, 11.16695, -18.232948, 5.223346, 10.285225, -18.244055, 5.06678, 11.16695, -18.232948, 5.223346, 11.137901, -18.725073, 5.250473, 11.625116, -18.890398, 5.671045, 10.285225, -18.244055, 5.06678, 10.299322, -17.579128, 5.5099926, 9.852264, -17.756414, 5.6751027, 11.16695, -18.232948, 5.223346, 10.299322, -17.579128, 5.5099926, 10.285225, -18.244055, 5.06678, 9.852264, -17.756414, 5.6751027, 10.453112, -17.357628, 6.1091304, 9.889858, -17.582973, 6.244337, 9.852264, -17.756414, 5.6751027, 10.299322, -17.579128, 5.5099926, 10.453112, -17.357628, 6.1091304, 11.16695, -18.232948, 5.223346, 10.871334, -17.746588, 5.5153327, 10.299322, -17.579128, 5.5099926, 11.16695, -18.232948, 5.223346, 11.625116, -18.890398, 5.671045, 11.610165, -18.229317, 5.727007, 10.871334, -17.746588, 5.5153327, 11.16695, -18.232948, 5.223346, 11.610165, -18.229317, 5.727007, 11.610165, -18.229317, 5.727007, 11.625116, -18.890398, 5.671045, 11.467482, -18.725073, 6.2481823, 10.299322, -17.579128, 5.5099926, 10.871334, -17.746588, 5.5153327, 11.080872, -17.575497, 5.9017286, 10.871334, -17.746588, 5.5153327, 11.610165, -18.229317, 5.727007, 11.080872, -17.575497, 5.9017286, 10.299322, -17.579128, 5.5099926, 11.080872, -17.575497, 5.9017286, 10.453112, -17.357628, 6.1091304, 11.610165, -18.229317, 5.727007, 11.467482, -18.725073, 6.2481823, 11.539036, -18.232946, 6.3494267, 11.080872, -17.575497, 5.9017286, 11.610165, -18.229317, 5.727007, 11.539036, -18.232946, 6.3494267, 10.937548, -18.908766, 6.640559, 11.539036, -18.232946, 6.3494267, 11.467482, -18.725073, 6.2481823, 10.453112, -17.357628, 6.1091304, 11.080872, -17.575497, 5.9017286, 11.135979, -17.746588, 6.316746, 11.080872, -17.575497, 5.9017286, 11.539036, -18.232946, 6.3494267, 11.135979, -17.746588, 6.316746, 10.937548, -18.908766, 6.640559, 10.878382, -18.244053, 6.8629127, 11.539036, -18.232946, 6.3494267, 10.878382, -18.244053, 6.8629127, 11.135979, -17.746588, 6.316746, 11.539036, -18.232946, 6.3494267, 10.201282, -18.747929, 6.6170635, 10.878382, -18.244053, 6.8629127, 10.937548, -18.908766, 6.640559, 10.201282, -18.747929, 6.6170635, 10.069706, -18.254948, 6.927205, 10.878382, -18.244053, 6.8629127, 10.878382, -18.244053, 6.8629127, 10.671408, -17.579128, 6.636073, 11.135979, -17.746588, 6.316746, 10.453112, -17.357628, 6.1091304, 11.135979, -17.746588, 6.316746, 10.671408, -17.579128, 6.636073, 10.069706, -18.254948, 6.927205, 10.671408, -17.579128, 6.636073, 10.878382, -18.244053, 6.8629127, 9.889858, -17.582973, 6.244337, 10.453112, -17.357628, 6.1091304, 10.671408, -17.579128, 6.636073, 10.069706, -18.254948, 6.927205, 10.181845, -17.756413, 6.672812, 10.671408, -17.579128, 6.636073, 9.889858, -17.582973, 6.244337, 10.671408, -17.579128, 6.636073, 10.181845, -17.756413, 6.672812, 11.137901, -18.725073, 5.250473, 10.710709, -19.13048, 5.8203487, 11.625116, -18.890398, 5.671045, 11.137901, -18.725073, 5.250473, 10.419577, -18.908766, 5.0725474, 10.710709, -19.13048, 5.8203487, 11.625116, -18.890398, 5.671045, 10.710709, -19.13048, 5.8203487, 10.937548, -18.908766, 6.640559, 11.625116, -18.890398, 5.671045, 10.937548, -18.908766, 6.640559, 11.467482, -18.725073, 6.2481823, 10.710709, -19.13048, 5.8203487, 10.201282, -18.747929, 6.6170635, 10.937548, -18.908766, 6.640559, 10.710709, -19.13048, 5.8203487, 9.731583, -18.927135, 6.042062, 10.201282, -18.747929, 6.6170635, 10.419577, -18.908766, 5.0725474, 9.731583, -18.927135, 6.042062, 10.710709, -19.13048, 5.8203487, 10.419577, -18.908766, 5.0725474, 9.806982, -18.747929, 5.422632, 9.731583, -18.927135, 6.042062, 15.540274, 10.966449, -3.3071837, 18.560066, 13.1471405, -1.460484, 18.346163, 10.143484, -1.9265671, 18.346163, 10.143484, -1.9265671, 18.560066, 13.1471405, -1.460484, 22.219316, 13.223694, -3.2587752, 18.346163, 10.143484, -1.9265671, 22.219316, 13.223694, -3.2587752, 21.565973, 10.92592, -3.6194077, 15.540274, 10.966449, -3.3071837, 15.086948, 13.100231, -2.2530527, 18.560066, 13.1471405, -1.460484, 14.412214, 10.35138, -7.0625033, 15.086948, 13.100231, -2.2530527, 15.540274, 10.966449, -3.3071837, 18.560066, 13.1471405, -1.460484, 21.16256, 15.42765, -4.2870145, 22.219316, 13.223694, -3.2587752, 14.412214, 10.35138, -7.0625033, 14.188929, 13.313381, -6.7934375, 15.086948, 13.100231, -2.2530527, 16.12682, 11.184852, -10.555136, 14.188929, 13.313381, -6.7934375, 14.412214, 10.35138, -7.0625033, 15.086948, 13.100231, -2.2530527, 18.959728, 16.180443, -3.5852609, 18.560066, 13.1471405, -1.460484, 18.560066, 13.1471405, -1.460484, 18.959728, 16.180443, -3.5852609, 21.16256, 15.42765, -4.2870145, 14.188929, 13.313381, -6.7934375, 16.632683, 15.373238, -3.8400683, 15.086948, 13.100231, -2.2530527, 15.086948, 13.100231, -2.2530527, 16.632683, 15.373238, -3.8400683, 18.959728, 16.180443, -3.5852609, 16.12682, 11.184852, -10.555136, 15.662611, 13.473244, -11.258017, 14.188929, 13.313381, -6.7934375, 15.662611, 13.473244, -11.258017, 16.12682, 11.184852, -10.555136, 19.275705, 10.291335, -11.819794, 14.188929, 13.313381, -6.7934375, 16.33697, 16.22172, -6.448566, 16.632683, 15.373238, -3.8400683, 15.662611, 13.473244, -11.258017, 16.33697, 16.22172, -6.448566, 14.188929, 13.313381, -6.7934375, 16.632683, 15.373238, -3.8400683, 19.092949, 17.191416, -6.333734, 18.959728, 16.180443, -3.5852609, 16.632683, 15.373238, -3.8400683, 16.33697, 16.22172, -6.448566, 19.092949, 17.191416, -6.333734, 15.662611, 13.473244, -11.258017, 16.88824, 15.538728, -9.202293, 16.33697, 16.22172, -6.448566, 15.662611, 13.473244, -11.258017, 19.275705, 10.291335, -11.819794, 19.30385, 13.265345, -11.823172, 16.88824, 15.538728, -9.202293, 15.662611, 13.473244, -11.258017, 19.30385, 13.265345, -11.823172, 19.30385, 13.265345, -11.823172, 19.275705, 10.291335, -11.819794, 22.136759, 10.891392, -9.770823, 16.33697, 16.22172, -6.448566, 16.88824, 15.538728, -9.202293, 19.145487, 16.20971, -9.236067, 16.88824, 15.538728, -9.202293, 19.30385, 13.265345, -11.823172, 19.145487, 16.20971, -9.236067, 16.33697, 16.22172, -6.448566, 19.145487, 16.20971, -9.236067, 19.092949, 17.191416, -6.333734, 19.30385, 13.265345, -11.823172, 22.136759, 10.891392, -9.770823, 22.758955, 13.0278, -9.797468, 19.145487, 16.20971, -9.236067, 19.30385, 13.265345, -11.823172, 22.758955, 13.0278, -9.797468, 23.209654, 10.083063, -6.6834817, 22.758955, 13.0278, -9.797468, 22.136759, 10.891392, -9.770823, 19.092949, 17.191416, -6.333734, 19.145487, 16.20971, -9.236067, 21.402355, 15.340961, -8.553076, 19.145487, 16.20971, -9.236067, 22.758955, 13.0278, -9.797468, 21.402355, 15.340961, -8.553076, 23.209654, 10.083063, -6.6834817, 23.674988, 13.098728, -6.4902196, 22.758955, 13.0278, -9.797468, 23.674988, 13.098728, -6.4902196, 21.402355, 15.340961, -8.553076, 22.758955, 13.0278, -9.797468, 21.565973, 10.92592, -3.6194077, 23.674988, 13.098728, -6.4902196, 23.209654, 10.083063, -6.6834817, 21.565973, 10.92592, -3.6194077, 22.219316, 13.223694, -3.2587752, 23.674988, 13.098728, -6.4902196, 23.674988, 13.098728, -6.4902196, 21.768618, 16.168056, -6.372762, 21.402355, 15.340961, -8.553076, 19.092949, 17.191416, -6.333734, 21.402355, 15.340961, -8.553076, 21.768618, 16.168056, -6.372762, 22.219316, 13.223694, -3.2587752, 21.768618, 16.168056, -6.372762, 23.674988, 13.098728, -6.4902196, 18.959728, 16.180443, -3.5852609, 19.092949, 17.191416, -6.333734, 21.768618, 16.168056, -6.372762, 22.219316, 13.223694, -3.2587752, 21.16256, 15.42765, -4.2870145, 21.768618, 16.168056, -6.372762, 18.959728, 16.180443, -3.5852609, 21.768618, 16.168056, -6.372762, 21.16256, 15.42765, -4.2870145, 16.12682, 11.184852, -10.555136, 18.770592, 9.221069, -6.949922, 19.275705, 10.291335, -11.819794, 16.12682, 11.184852, -10.555136, 14.412214, 10.35138, -7.0625033, 18.770592, 9.221069, -6.949922, 19.275705, 10.291335, -11.819794, 18.770592, 9.221069, -6.949922, 23.209654, 10.083063, -6.6834817, 19.275705, 10.291335, -11.819794, 23.209654, 10.083063, -6.6834817, 22.136759, 10.891392, -9.770823, 18.770592, 9.221069, -6.949922, 21.565973, 10.92592, -3.6194077, 23.209654, 10.083063, -6.6834817, 18.770592, 9.221069, -6.949922, 18.346163, 10.143484, -1.9265671, 21.565973, 10.92592, -3.6194077, 14.412214, 10.35138, -7.0625033, 18.346163, 10.143484, -1.9265671, 18.770592, 9.221069, -6.949922, 14.412214, 10.35138, -7.0625033, 15.540274, 10.966449, -3.3071837, 18.346163, 10.143484, -1.9265671, 11.936562, 9.984368, -5.338141, 13.67631, 11.271917, -4.06185, 13.421877, 9.512654, -4.639014, 13.421877, 9.512654, -4.639014, 13.67631, 11.271917, -4.06185, 15.91254, 11.2813, -4.7530966, 13.421877, 9.512654, -4.639014, 15.91254, 11.2813, -4.7530966, 15.246437, 9.984368, -5.338141, 11.936562, 9.984368, -5.338141, 11.566921, 11.2813, -4.7530966, 13.67631, 11.271917, -4.06185, 11.566921, 9.561063, -7.158197, 11.566921, 11.2813, -4.7530966, 11.936562, 9.984368, -5.338141, 13.67631, 11.271917, -4.06185, 15.369902, 12.5936165, -5.243574, 15.91254, 11.2813, -4.7530966, 11.566921, 9.561063, -7.158197, 11.441956, 11.310569, -6.8275857, 11.566921, 11.2813, -4.7530966, 12.604542, 10.044409, -8.806381, 11.441956, 11.310569, -6.8275857, 11.566921, 9.561063, -7.158197, 11.566921, 11.2813, -4.7530966, 14.057959, 13.050319, -4.8671794, 13.67631, 11.271917, -4.06185, 13.67631, 11.271917, -4.06185, 14.057959, 13.050319, -4.8671794, 15.369902, 12.5936165, -5.243574, 11.441956, 11.310569, -6.8275857, 12.604542, 12.5936165, -5.243574, 11.566921, 11.2813, -4.7530966, 11.566921, 11.2813, -4.7530966, 12.604542, 12.5936165, -5.243574, 14.057959, 13.050319, -4.8671794, 12.604542, 10.044409, -8.806381, 12.56101, 11.339464, -8.901699, 11.441956, 11.310569, -6.8275857, 12.56101, 11.339464, -8.901699, 12.604542, 10.044409, -8.806381, 14.057959, 9.609097, -9.677006, 11.441956, 11.310569, -6.8275857, 12.56101, 13.0597, -6.4969745, 12.604542, 12.5936165, -5.243574, 12.56101, 11.339464, -8.901699, 12.56101, 13.0597, -6.4969745, 11.441956, 11.310569, -6.8275857, 12.604542, 12.5936165, -5.243574, 14.184801, 13.643244, -6.386646, 14.057959, 13.050319, -4.8671794, 12.604542, 12.5936165, -5.243574, 12.56101, 13.0597, -6.4969745, 14.184801, 13.643244, -6.386646, 12.56101, 11.339464, -8.901699, 13.046232, 12.619133, -7.921497, 12.56101, 13.0597, -6.4969745, 12.56101, 11.339464, -8.901699, 14.057959, 9.609097, -9.677006, 14.184801, 11.34922, -9.592945, 13.046232, 12.619133, -7.921497, 12.56101, 11.339464, -8.901699, 14.184801, 11.34922, -9.592945, 14.184801, 11.34922, -9.592945, 14.057959, 9.609097, -9.677006, 15.369902, 10.044409, -8.806381, 12.56101, 13.0597, -6.4969745, 13.046232, 12.619133, -7.921497, 14.184801, 13.069456, -8.126394, 13.046232, 12.619133, -7.921497, 14.184801, 11.34922, -9.592945, 14.184801, 13.069456, -8.126394, 12.56101, 13.0597, -6.4969745, 14.184801, 13.069456, -8.126394, 14.184801, 13.643244, -6.386646, 14.184801, 11.34922, -9.592945, 15.369902, 10.044409, -8.806381, 15.681749, 11.339464, -8.901699, 14.184801, 13.069456, -8.126394, 14.184801, 11.34922, -9.592945, 15.681749, 11.339464, -8.901699, 15.91254, 9.561063, -7.158197, 15.681749, 11.339464, -8.901699, 15.369902, 10.044409, -8.806381, 14.184801, 13.643244, -6.386646, 14.184801, 13.069456, -8.126394, 15.2670765, 12.619133, -7.921497, 14.184801, 13.069456, -8.126394, 15.681749, 11.339464, -8.901699, 15.2670765, 12.619133, -7.921497, 15.91254, 9.561063, -7.158197, 16.419529, 11.310569, -6.8275857, 15.681749, 11.339464, -8.901699, 16.419529, 11.310569, -6.8275857, 15.2670765, 12.619133, -7.921497, 15.681749, 11.339464, -8.901699, 15.246437, 9.984368, -5.338141, 16.419529, 11.310569, -6.8275857, 15.91254, 9.561063, -7.158197, 15.246437, 9.984368, -5.338141, 15.91254, 11.2813, -4.7530966, 16.419529, 11.310569, -6.8275857, 16.419529, 11.310569, -6.8275857, 15.681749, 13.0597, -6.4969745, 15.2670765, 12.619133, -7.921497, 14.184801, 13.643244, -6.386646, 15.2670765, 12.619133, -7.921497, 15.681749, 13.0597, -6.4969745, 15.91254, 11.2813, -4.7530966, 15.681749, 13.0597, -6.4969745, 16.419529, 11.310569, -6.8275857, 14.057959, 13.050319, -4.8671794, 14.184801, 13.643244, -6.386646, 15.681749, 13.0597, -6.4969745, 15.91254, 11.2813, -4.7530966, 15.369902, 12.5936165, -5.243574, 15.681749, 13.0597, -6.4969745, 14.057959, 13.050319, -4.8671794, 15.681749, 13.0597, -6.4969745, 15.369902, 12.5936165, -5.243574, 12.604542, 10.044409, -8.806381, 13.67631, 8.977895, -7.268151, 14.057959, 9.609097, -9.677006, 12.604542, 10.044409, -8.806381, 11.566921, 9.561063, -7.158197, 13.67631, 8.977895, -7.268151, 14.057959, 9.609097, -9.677006, 13.67631, 8.977895, -7.268151, 15.91254, 9.561063, -7.158197, 14.057959, 9.609097, -9.677006, 15.91254, 9.561063, -7.158197, 15.369902, 10.044409, -8.806381, 13.67631, 8.977895, -7.268151, 15.246437, 9.984368, -5.338141, 15.91254, 9.561063, -7.158197, 13.67631, 8.977895, -7.268151, 13.421877, 9.512654, -4.639014, 15.246437, 9.984368, -5.338141, 11.566921, 9.561063, -7.158197, 13.421877, 9.512654, -4.639014, 13.67631, 8.977895, -7.268151, 11.566921, 9.561063, -7.158197, 11.936562, 9.984368, -5.338141, 13.421877, 9.512654, -4.639014, 16.48933, 8.916348, -10.894003, 16.04426, 9.775716, -9.5235195, 16.35686, 8.601498, -9.805721, 16.35686, 8.601498, -9.805721, 16.04426, 9.775716, -9.5235195, 16.95091, 9.782472, -8.250607, 16.35686, 8.601498, -9.805721, 16.95091, 9.782472, -8.250607, 17.182077, 8.916349, -8.795498, 16.48933, 8.916348, -10.894003, 16.040882, 9.78247, -11.005459, 16.04426, 9.775716, -9.5235195, 17.565601, 8.63377, -11.509069, 16.040882, 9.78247, -11.005459, 16.48933, 8.916348, -10.894003, 16.04426, 9.775716, -9.5235195, 17.147928, 10.65835, -8.697552, 16.95091, 9.782472, -8.250607, 17.565601, 8.63377, -11.509069, 17.329557, 9.801608, -11.519203, 16.040882, 9.78247, -11.005459, 18.827633, 8.956502, -11.19647, 17.329557, 9.801608, -11.519203, 17.565601, 8.63377, -11.509069, 16.040882, 9.78247, -11.005459, 16.634933, 10.963444, -9.450344, 16.04426, 9.775716, -9.5235195, 16.04426, 9.775716, -9.5235195, 16.634933, 10.963444, -9.450344, 17.147928, 10.65835, -8.697552, 17.329557, 9.801608, -11.519203, 16.568888, 10.658349, -10.450436, 16.040882, 9.78247, -11.005459, 16.040882, 9.78247, -11.005459, 16.568888, 10.658349, -10.450436, 16.634933, 10.963444, -9.450344, 18.827633, 8.956502, -11.19647, 18.87867, 9.821122, -11.244131, 17.329557, 9.801608, -11.519203, 18.87867, 9.821122, -11.244131, 18.827633, 8.956502, -11.19647, 19.683622, 8.666044, -10.457565, 17.329557, 9.801608, -11.519203, 17.354326, 10.969822, -10.740519, 16.568888, 10.658349, -10.450436, 18.87867, 9.821122, -11.244131, 17.354326, 10.969822, -10.740519, 17.329557, 9.801608, -11.519203, 16.568888, 10.658349, -10.450436, 17.62452, 11.358977, -9.687889, 16.634933, 10.963444, -9.450344, 16.568888, 10.658349, -10.450436, 17.354326, 10.969822, -10.740519, 17.62452, 11.358977, -9.687889, 18.87867, 9.821122, -11.244131, 18.359297, 10.6756115, -10.731136, 17.354326, 10.969822, -10.740519, 18.87867, 9.821122, -11.244131, 19.683622, 8.666044, -10.457565, 19.657354, 9.827502, -10.359245, 18.359297, 10.6756115, -10.731136, 18.87867, 9.821122, -11.244131, 19.657354, 9.827502, -10.359245, 19.657354, 9.827502, -10.359245, 19.683622, 8.666044, -10.457565, 19.406673, 8.956503, -9.443586, 17.354326, 10.969822, -10.740519, 18.359297, 10.6756115, -10.731136, 18.727436, 10.976202, -10.052275, 18.359297, 10.6756115, -10.731136, 19.657354, 9.827502, -10.359245, 18.727436, 10.976202, -10.052275, 17.354326, 10.969822, -10.740519, 18.727436, 10.976202, -10.052275, 17.62452, 11.358977, -9.687889, 19.657354, 9.827502, -10.359245, 19.406673, 8.956503, -9.443586, 19.532389, 9.821123, -9.265711, 18.727436, 10.976202, -10.052275, 19.657354, 9.827502, -10.359245, 19.532389, 9.821123, -9.265711, 18.47563, 8.633772, -8.754217, 19.532389, 9.821123, -9.265711, 19.406673, 8.956503, -9.443586, 17.62452, 11.358977, -9.687889, 18.727436, 10.976202, -10.052275, 18.824255, 10.6756115, -9.323126, 18.727436, 10.976202, -10.052275, 19.532389, 9.821123, -9.265711, 18.824255, 10.6756115, -9.323126, 18.47563, 8.633772, -8.754217, 18.371681, 9.80161, -8.363562, 19.532389, 9.821123, -9.265711, 18.371681, 9.80161, -8.363562, 18.824255, 10.6756115, -9.323126, 19.532389, 9.821123, -9.265711, 17.182077, 8.916349, -8.795498, 18.371681, 9.80161, -8.363562, 18.47563, 8.633772, -8.754217, 17.182077, 8.916349, -8.795498, 16.95091, 9.782472, -8.250607, 18.371681, 9.80161, -8.363562, 18.371681, 9.80161, -8.363562, 18.008045, 10.969824, -8.762098, 18.824255, 10.6756115, -9.323126, 17.62452, 11.358977, -9.687889, 18.824255, 10.6756115, -9.323126, 18.008045, 10.969824, -8.762098, 16.95091, 9.782472, -8.250607, 18.008045, 10.969824, -8.762098, 18.371681, 9.80161, -8.363562, 16.634933, 10.963444, -9.450344, 17.62452, 11.358977, -9.687889, 18.008045, 10.969824, -8.762098, 16.95091, 9.782472, -8.250607, 17.147928, 10.65835, -8.697552, 18.008045, 10.969824, -8.762098, 16.634933, 10.963444, -9.450344, 18.008045, 10.969824, -8.762098, 17.147928, 10.65835, -8.697552, 18.827633, 8.956502, -11.19647, 18.077095, 8.244242, -10.195251, 19.683622, 8.666044, -10.457565, 18.827633, 8.956502, -11.19647, 17.565601, 8.63377, -11.509069, 18.077095, 8.244242, -10.195251, 19.683622, 8.666044, -10.457565, 18.077095, 8.244242, -10.195251, 18.47563, 8.633772, -8.754217, 19.683622, 8.666044, -10.457565, 18.47563, 8.633772, -8.754217, 19.406673, 8.956503, -9.443586, 18.077095, 8.244242, -10.195251, 17.182077, 8.916349, -8.795498, 18.47563, 8.633772, -8.754217, 18.077095, 8.244242, -10.195251, 16.35686, 8.601498, -9.805721, 17.182077, 8.916349, -8.795498, 17.565601, 8.63377, -11.509069, 16.35686, 8.601498, -9.805721, 18.077095, 8.244242, -10.195251, 17.565601, 8.63377, -11.509069, 16.48933, 8.916348, -10.894003, 16.35686, 8.601498, -9.805721, 18.97211, 7.0576415, -6.386642, 16.75427, 7.642686, -6.783302, 18.871164, 6.7709355, -6.804692, 18.97211, 7.0576415, -6.386642, 16.92877, 7.871976, -6.386642, 16.75427, 7.642686, -6.783302, 16.92877, 7.871976, -6.386642, 14.656889, 9.864281, -6.5018516, 16.75427, 7.642686, -6.783302, 16.92877, 7.871976, -6.386642, 14.740574, 9.86353, -6.386643, 14.656889, 9.864281, -6.5018516, 16.75427, 7.642686, -6.783302, 14.656889, 9.864281, -6.5018516, 14.521418, 9.865407, -6.4579444, 18.871164, 6.7709355, -6.804692, 16.75427, 7.642686, -6.783302, 16.472067, 7.2715445, -6.6316934, 16.75427, 7.642686, -6.783302, 14.521418, 9.865407, -6.4579444, 16.472067, 7.2715445, -6.6316934, 18.871164, 6.7709355, -6.804692, 16.472067, 7.2715445, -6.6316934, 18.70717, 6.307478, -6.645202, 16.472067, 7.2715445, -6.6316934, 14.521418, 9.865407, -6.4579444, 14.521418, 9.865407, -6.3153424, 18.70717, 6.307478, -6.645202, 16.472067, 7.2715445, -6.6316934, 16.472067, 7.271545, -6.1415906, 16.472067, 7.2715445, -6.6316934, 14.521418, 9.865407, -6.3153424, 16.472067, 7.271545, -6.1415906, 18.70717, 6.307478, -6.645202, 16.472067, 7.271545, -6.1415906, 18.70717, 6.307478, -6.128081, 16.472067, 7.271545, -6.1415906, 14.521418, 9.865407, -6.3153424, 14.656889, 9.864282, -6.2714353, 18.70717, 6.307478, -6.128081, 16.472067, 7.271545, -6.1415906, 16.75427, 7.642687, -5.9899826, 16.472067, 7.271545, -6.1415906, 14.656889, 9.864282, -6.2714353, 16.75427, 7.642687, -5.9899826, 16.75427, 7.642687, -5.9899826, 14.656889, 9.864282, -6.2714353, 14.740574, 9.86353, -6.386643, 18.70717, 6.307478, -6.128081, 16.75427, 7.642687, -5.9899826, 18.871164, 6.770936, -5.9685917, 16.75427, 7.642687, -5.9899826, 14.740574, 9.86353, -6.386643, 16.92877, 7.871976, -6.386642, 18.871164, 6.770936, -5.9685917, 16.75427, 7.642687, -5.9899826, 16.92877, 7.871976, -6.386642, 18.871164, 6.770936, -5.9685917, 16.92877, 7.871976, -6.386642, 18.97211, 7.0576415, -6.386642, 16.917137, 3.1484604, -6.38664, 18.672272, 6.762305, -5.989982, 17.66805, 3.1484613, -5.289727, 16.917137, 3.1484604, -6.38664, 18.388943, 6.8137164, -6.386642, 18.672272, 6.762305, -5.989982, 18.388943, 6.8137164, -6.386642, 18.814873, 10.392285, -6.211393, 18.672272, 6.762305, -5.989982, 18.388943, 6.8137164, -6.386642, 18.688408, 10.405795, -6.386644, 18.814873, 10.392285, -6.211393, 18.672272, 6.762305, -5.989982, 18.814873, 10.392285, -6.211393, 19.01977, 10.370894, -6.278191, 17.66805, 3.1484613, -5.289727, 18.672272, 6.762305, -5.989982, 19.13085, 6.6789947, -6.1415906, 18.672272, 6.762305, -5.989982, 19.01977, 10.370894, -6.278191, 19.13085, 6.6789947, -6.1415906, 17.66805, 3.1484613, -5.289727, 19.13085, 6.6789947, -6.1415906, 18.883549, 3.148085, -5.708528, 19.13085, 6.6789947, -6.1415906, 19.01977, 10.370894, -6.278191, 19.01977, 10.370894, -6.4950967, 18.883549, 3.148085, -5.708528, 19.13085, 6.6789947, -6.1415906, 19.13085, 6.678994, -6.6316924, 19.13085, 6.6789947, -6.1415906, 19.01977, 10.370894, -6.4950967, 19.13085, 6.678994, -6.6316924, 18.883549, 3.148085, -5.708528, 19.13085, 6.678994, -6.6316924, 18.883549, 3.1480846, -7.064751, 19.13085, 6.678994, -6.6316924, 19.01977, 10.370894, -6.4950967, 18.814873, 10.392285, -6.561895, 18.883549, 3.1480846, -7.064751, 19.13085, 6.678994, -6.6316924, 18.672272, 6.7623043, -6.783302, 19.13085, 6.678994, -6.6316924, 18.814873, 10.392285, -6.561895, 18.672272, 6.7623043, -6.783302, 18.672272, 6.7623043, -6.783302, 18.814873, 10.392285, -6.561895, 18.688408, 10.405795, -6.386644, 18.883549, 3.1480846, -7.064751, 18.672272, 6.7623043, -6.783302, 17.66805, 3.14846, -7.4835525, 18.672272, 6.7623043, -6.783302, 18.688408, 10.405795, -6.386644, 18.388943, 6.8137164, -6.386642, 17.66805, 3.14846, -7.4835525, 18.672272, 6.7623043, -6.783302, 18.388943, 6.8137164, -6.386642, 17.66805, 3.14846, -7.4835525, 18.388943, 6.8137164, -6.386642, 16.917137, 3.1484604, -6.38664, 18.62724, 6.962323, -6.6530833, 18.414085, 7.3529778, -8.142153, 18.871164, 6.7709355, -6.804692, 18.62724, 6.962323, -6.6530833, 18.199057, 7.5060873, -7.9485135, 18.414085, 7.3529778, -8.142153, 18.199057, 7.5060873, -7.9485135, 17.796392, 8.836041, -9.412815, 18.414085, 7.3529778, -8.142153, 18.199057, 7.5060873, -7.9485135, 17.740852, 8.835667, -9.33551, 17.796392, 8.836041, -9.412815, 18.414085, 7.3529778, -8.142153, 17.796392, 8.836041, -9.412815, 17.740103, 8.836792, -9.48937, 18.871164, 6.7709355, -6.804692, 18.414085, 7.3529778, -8.142153, 18.258724, 7.1053, -8.289257, 18.414085, 7.3529778, -8.142153, 17.740103, 8.836792, -9.48937, 18.258724, 7.1053, -8.289257, 18.871164, 6.7709355, -6.804692, 18.258724, 7.1053, -8.289257, 18.735317, 6.461338, -6.8752427, 18.258724, 7.1053, -8.289257, 17.740103, 8.836792, -9.48937, 17.650038, 8.836792, -9.459724, 18.735317, 6.461338, -6.8752427, 18.258724, 7.1053, -8.289257, 17.948002, 7.1053, -8.18681, 18.258724, 7.1053, -8.289257, 17.650038, 8.836792, -9.459724, 17.948002, 7.1053, -8.18681, 18.735317, 6.461338, -6.8752427, 17.948002, 7.1053, -8.18681, 18.407707, 6.461338, -6.7671647, 17.948002, 7.1053, -8.18681, 17.650038, 8.836792, -9.459724, 17.650414, 8.836041, -9.36478, 18.407707, 6.461338, -6.7671647, 17.948002, 7.1053, -8.18681, 17.911226, 7.3529778, -7.975908, 17.948002, 7.1053, -8.18681, 17.650414, 8.836041, -9.36478, 17.911226, 7.3529778, -7.975908, 17.911226, 7.3529778, -7.975908, 17.650414, 8.836041, -9.36478, 17.740852, 8.835667, -9.33551, 18.407707, 6.461338, -6.7671647, 17.911226, 7.3529778, -7.975908, 18.340908, 6.7709355, -6.6298165, 17.911226, 7.3529778, -7.975908, 17.740852, 8.835667, -9.33551, 18.199057, 7.5060873, -7.9485135, 18.340908, 6.7709355, -6.6298165, 17.911226, 7.3529778, -7.975908, 18.199057, 7.5060873, -7.9485135, 18.340908, 6.7709355, -6.6298165, 18.199057, 7.5060873, -7.9485135, 18.62724, 6.962323, -6.6530833, -21.319002, 11.927798, 5.296257, -17.92721, 14.377124, 7.3704467, -18.167463, 11.003454, 6.8469477, -18.167463, 11.003454, 6.8469477, -17.92721, 14.377124, 7.3704467, -13.817183, 14.463108, 5.3506293, -18.167463, 11.003454, 6.8469477, -13.817183, 14.463108, 5.3506293, -14.551012, 11.882277, 4.945571, -21.319002, 11.927798, 5.296257, -21.828173, 14.324436, 6.480244, -17.92721, 14.377124, 7.3704467, -22.586025, 11.236962, 1.0783278, -21.828173, 14.324436, 6.480244, -21.319002, 11.927798, 5.296257, -17.92721, 14.377124, 7.3704467, -15.004122, 16.938564, 4.195724, -13.817183, 14.463108, 5.3506293, -22.586025, 11.236962, 1.0783278, -22.836817, 14.563845, 1.3805406, -21.828173, 14.324436, 6.480244, -20.660202, 12.173107, -2.8445535, -22.836817, 14.563845, 1.3805406, -22.586025, 11.236962, 1.0783278, -21.828173, 14.324436, 6.480244, -17.478313, 17.78409, 4.983925, -17.92721, 14.377124, 7.3704467, -17.92721, 14.377124, 7.3704467, -17.478313, 17.78409, 4.983925, -15.004122, 16.938564, 4.195724, -22.836817, 14.563845, 1.3805406, -20.092022, 16.877449, 4.697728, -21.828173, 14.324436, 6.480244, -21.828173, 14.324436, 6.480244, -20.092022, 16.877449, 4.697728, -17.478313, 17.78409, 4.983925, -20.660202, 12.173107, -2.8445535, -21.181595, 14.743402, -3.6340203, -22.836817, 14.563845, 1.3805406, -21.181595, 14.743402, -3.6340203, -20.660202, 12.173107, -2.8445535, -17.123413, 11.16952, -4.2650013, -22.836817, 14.563845, 1.3805406, -20.424162, 17.830454, 1.7678959, -20.092022, 16.877449, 4.697728, -21.181595, 14.743402, -3.6340203, -20.424162, 17.830454, 1.7678959, -22.836817, 14.563845, 1.3805406, -20.092022, 16.877449, 4.697728, -17.328682, 18.919605, 1.896874, -17.478313, 17.78409, 4.983925, -20.092022, 16.877449, 4.697728, -20.424162, 17.830454, 1.7678959, -17.328682, 18.919605, 1.896874, -21.181595, 14.743402, -3.6340203, -19.804983, 17.063326, -1.3250556, -20.424162, 17.830454, 1.7678959, -21.181595, 14.743402, -3.6340203, -17.123413, 11.16952, -4.2650013, -17.0918, 14.5098915, -4.268796, -19.804983, 17.063326, -1.3250556, -21.181595, 14.743402, -3.6340203, -17.0918, 14.5098915, -4.268796, -17.0918, 14.5098915, -4.268796, -17.123413, 11.16952, -4.2650013, -13.909912, 11.843496, -1.963623, -20.424162, 17.830454, 1.7678959, -19.804983, 17.063326, -1.3250556, -17.269672, 17.816965, -1.3629904, -19.804983, 17.063326, -1.3250556, -17.0918, 14.5098915, -4.268796, -17.269672, 17.816965, -1.3629904, -20.424162, 17.830454, 1.7678959, -17.269672, 17.816965, -1.3629904, -17.328682, 18.919605, 1.896874, -17.0918, 14.5098915, -4.268796, -13.909912, 11.843496, -1.963623, -13.211069, 14.243084, -1.9935503, -17.269672, 17.816965, -1.3629904, -17.0918, 14.5098915, -4.268796, -13.211069, 14.243084, -1.9935503, -12.704849, 10.935591, 1.5040407, -13.211069, 14.243084, -1.9935503, -13.909912, 11.843496, -1.963623, -17.328682, 18.919605, 1.896874, -17.269672, 17.816965, -1.3629904, -14.734785, 16.841198, -0.5958638, -17.269672, 17.816965, -1.3629904, -13.211069, 14.243084, -1.9935503, -14.734785, 16.841198, -0.5958638, -12.704849, 10.935591, 1.5040407, -12.182192, 14.322748, 1.7211109, -13.211069, 14.243084, -1.9935503, -12.182192, 14.322748, 1.7211109, -14.734785, 16.841198, -0.5958638, -13.211069, 14.243084, -1.9935503, -14.551012, 11.882277, 4.945571, -12.182192, 14.322748, 1.7211109, -12.704849, 10.935591, 1.5040407, -14.551012, 11.882277, 4.945571, -13.817183, 14.463108, 5.3506293, -12.182192, 14.322748, 1.7211109, -12.182192, 14.322748, 1.7211109, -14.323402, 17.77018, 1.8530385, -14.734785, 16.841198, -0.5958638, -17.328682, 18.919605, 1.896874, -14.734785, 16.841198, -0.5958638, -14.323402, 17.77018, 1.8530385, -13.817183, 14.463108, 5.3506293, -14.323402, 17.77018, 1.8530385, -12.182192, 14.322748, 1.7211109, -17.478313, 17.78409, 4.983925, -17.328682, 18.919605, 1.896874, -14.323402, 17.77018, 1.8530385, -13.817183, 14.463108, 5.3506293, -15.004122, 16.938564, 4.195724, -14.323402, 17.77018, 1.8530385, -17.478313, 17.78409, 4.983925, -14.323402, 17.77018, 1.8530385, -15.004122, 16.938564, 4.195724, -20.660202, 12.173107, -2.8445535, -17.690748, 9.96741, 1.2047776, -17.123413, 11.16952, -4.2650013, -20.660202, 12.173107, -2.8445535, -22.586025, 11.236962, 1.0783278, -17.690748, 9.96741, 1.2047776, -17.123413, 11.16952, -4.2650013, -17.690748, 9.96741, 1.2047776, -12.704849, 10.935591, 1.5040407, -17.123413, 11.16952, -4.2650013, -12.704849, 10.935591, 1.5040407, -13.909912, 11.843496, -1.963623, -17.690748, 9.96741, 1.2047776, -14.551012, 11.882277, 4.945571, -12.704849, 10.935591, 1.5040407, -17.690748, 9.96741, 1.2047776, -18.167463, 11.003454, 6.8469477, -14.551012, 11.882277, 4.945571, -22.586025, 11.236962, 1.0783278, -18.167463, 11.003454, 6.8469477, -17.690748, 9.96741, 1.2047776, -22.586025, 11.236962, 1.0783278, -21.319002, 11.927798, 5.296257, -18.167463, 11.003454, 6.8469477, -25.366648, 10.824738, 3.0151107, -23.412582, 12.270897, 4.4486246, -23.698359, 10.294915, 3.8003616, -23.698359, 10.294915, 3.8003616, -23.412582, 12.270897, 4.4486246, -20.900877, 12.281435, 3.6722255, -23.698359, 10.294915, 3.8003616, -20.900877, 12.281435, 3.6722255, -21.649036, 10.824738, 3.0151107, -25.366648, 10.824738, 3.0151107, -25.781822, 12.281435, 3.6722255, -23.412582, 12.270897, 4.4486246, -25.781822, 10.349287, 0.97084606, -25.781822, 12.281435, 3.6722255, -25.366648, 10.824738, 3.0151107, -23.412582, 12.270897, 4.4486246, -21.510363, 13.755413, 3.1213274, -20.900877, 12.281435, 3.6722255, -25.781822, 10.349287, 0.97084606, -25.922182, 12.314311, 1.342185, -25.781822, 12.281435, 3.6722255, -24.61638, 10.892176, -0.880373, -25.922182, 12.314311, 1.342185, -25.781822, 10.349287, 0.97084606, -25.781822, 12.281435, 3.6722255, -22.98392, 14.268375, 3.5440893, -23.412582, 12.270897, 4.4486246, -23.412582, 12.270897, 4.4486246, -22.98392, 14.268375, 3.5440893, -21.510363, 13.755413, 3.1213274, -25.922182, 12.314311, 1.342185, -24.61638, 13.755413, 3.1213274, -25.781822, 12.281435, 3.6722255, -25.781822, 12.281435, 3.6722255, -24.61638, 13.755413, 3.1213274, -22.98392, 14.268375, 3.5440893, -24.61638, 10.892176, -0.880373, -24.665274, 12.3467655, -0.9874339, -25.922182, 12.314311, 1.342185, -24.665274, 12.3467655, -0.9874339, -24.61638, 10.892176, -0.880373, -22.98392, 10.403238, -1.8582478, -25.922182, 12.314311, 1.342185, -24.665274, 14.278913, 1.713524, -24.61638, 13.755413, 3.1213274, -24.665274, 12.3467655, -0.9874339, -24.665274, 14.278913, 1.713524, -25.922182, 12.314311, 1.342185, -24.61638, 13.755413, 3.1213274, -22.841454, 14.934341, 1.8374442, -22.98392, 14.268375, 3.5440893, -24.61638, 13.755413, 3.1213274, -24.665274, 14.278913, 1.713524, -22.841454, 14.934341, 1.8374442, -24.665274, 12.3467655, -0.9874339, -24.120277, 13.784074, 0.11351812, -24.665274, 14.278913, 1.713524, -24.665274, 12.3467655, -0.9874339, -22.98392, 10.403238, -1.8582478, -22.841454, 12.357724, -1.763833, -24.120277, 13.784074, 0.11351812, -24.665274, 12.3467655, -0.9874339, -22.841454, 12.357724, -1.763833, -22.841454, 12.357724, -1.763833, -22.98392, 10.403238, -1.8582478, -21.510363, 10.892176, -0.880373, -24.665274, 14.278913, 1.713524, -24.120277, 13.784074, 0.11351812, -22.841454, 14.289871, -0.116620064, -24.120277, 13.784074, 0.11351812, -22.841454, 12.357724, -1.763833, -22.841454, 14.289871, -0.116620064, -24.665274, 14.278913, 1.713524, -22.841454, 14.289871, -0.116620064, -22.841454, 14.934341, 1.8374442, -22.841454, 12.357724, -1.763833, -21.510363, 10.892176, -0.880373, -21.160097, 12.3467655, -0.9874339, -22.841454, 14.289871, -0.116620064, -22.841454, 12.357724, -1.763833, -21.160097, 12.3467655, -0.9874339, -20.900877, 10.349287, 0.97084606, -21.160097, 12.3467655, -0.9874339, -21.510363, 10.892176, -0.880373, -22.841454, 14.934341, 1.8374442, -22.841454, 14.289871, -0.116620064, -21.625853, 13.784074, 0.11351812, -22.841454, 14.289871, -0.116620064, -21.160097, 12.3467655, -0.9874339, -21.625853, 13.784074, 0.11351812, -20.900877, 10.349287, 0.97084606, -20.331432, 12.314311, 1.342185, -21.160097, 12.3467655, -0.9874339, -20.331432, 12.314311, 1.342185, -21.625853, 13.784074, 0.11351812, -21.160097, 12.3467655, -0.9874339, -21.649036, 10.824738, 3.0151107, -20.331432, 12.314311, 1.342185, -20.900877, 10.349287, 0.97084606, -21.649036, 10.824738, 3.0151107, -20.900877, 12.281435, 3.6722255, -20.331432, 12.314311, 1.342185, -20.331432, 12.314311, 1.342185, -21.160097, 14.278913, 1.713524, -21.625853, 13.784074, 0.11351812, -22.841454, 14.934341, 1.8374442, -21.625853, 13.784074, 0.11351812, -21.160097, 14.278913, 1.713524, -20.900877, 12.281435, 3.6722255, -21.160097, 14.278913, 1.713524, -20.331432, 12.314311, 1.342185, -22.98392, 14.268375, 3.5440893, -22.841454, 14.934341, 1.8374442, -21.160097, 14.278913, 1.713524, -20.900877, 12.281435, 3.6722255, -21.510363, 13.755413, 3.1213274, -21.160097, 14.278913, 1.713524, -22.98392, 14.268375, 3.5440893, -21.160097, 14.278913, 1.713524, -21.510363, 13.755413, 3.1213274, -24.61638, 10.892176, -0.880373, -23.412582, 9.69428, 0.8473475, -22.98392, 10.403238, -1.8582478, -24.61638, 10.892176, -0.880373, -25.781822, 10.349287, 0.97084606, -23.412582, 9.69428, 0.8473475, -22.98392, 10.403238, -1.8582478, -23.412582, 9.69428, 0.8473475, -20.900877, 10.349287, 0.97084606, -22.98392, 10.403238, -1.8582478, -20.900877, 10.349287, 0.97084606, -21.510363, 10.892176, -0.880373, -23.412582, 9.69428, 0.8473475, -21.649036, 10.824738, 3.0151107, -20.900877, 10.349287, 0.97084606, -23.412582, 9.69428, 0.8473475, -23.698359, 10.294915, 3.8003616, -21.649036, 10.824738, 3.0151107, -25.781822, 10.349287, 0.97084606, -23.698359, 10.294915, 3.8003616, -23.412582, 9.69428, 0.8473475, -25.781822, 10.349287, 0.97084606, -25.366648, 10.824738, 3.0151107, -23.698359, 10.294915, 3.8003616, -20.253035, 9.625153, -3.2251654, -20.752932, 10.590384, -1.6858549, -20.401823, 9.271516, -2.002821, -20.401823, 9.271516, -2.002821, -20.752932, 10.590384, -1.6858549, -19.734592, 10.597971, -0.2561345, -20.401823, 9.271516, -2.002821, -19.734592, 10.597971, -0.2561345, -19.474949, 9.625154, -0.8681493, -20.253035, 9.625153, -3.2251654, -20.756725, 10.597969, -3.3503504, -20.752932, 10.590384, -1.6858549, -19.044178, 9.307764, -3.9160008, -20.756725, 10.597969, -3.3503504, -20.253035, 9.625153, -3.2251654, -20.752932, 10.590384, -1.6858549, -19.513306, 11.581747, -0.75813866, -19.734592, 10.597971, -0.2561345, -19.044178, 9.307764, -3.9160008, -19.309301, 10.619466, -3.9273815, -20.756725, 10.597969, -3.3503504, -17.62668, 9.670253, -3.5648928, -19.309301, 10.619466, -3.9273815, -19.044178, 9.307764, -3.9160008, -20.756725, 10.597969, -3.3503504, -20.089493, 11.924424, -1.6036634, -20.752932, 10.590384, -1.6858549, -20.752932, 10.590384, -1.6858549, -20.089493, 11.924424, -1.6036634, -19.513306, 11.581747, -0.75813866, -19.309301, 10.619466, -3.9273815, -20.163677, 11.581746, -2.7269554, -20.756725, 10.597969, -3.3503504, -20.756725, 10.597969, -3.3503504, -20.163677, 11.581746, -2.7269554, -20.089493, 11.924424, -1.6036634, -17.62668, 9.670253, -3.5648928, -17.569357, 10.641384, -3.6184235, -19.309301, 10.619466, -3.9273815, -17.569357, 10.641384, -3.6184235, -17.62668, 9.670253, -3.5648928, -16.665245, 9.344013, -2.7349634, -19.309301, 10.619466, -3.9273815, -19.281483, 11.931589, -3.052774, -20.163677, 11.581746, -2.7269554, -17.569357, 10.641384, -3.6184235, -19.281483, 11.931589, -3.052774, -19.309301, 10.619466, -3.9273815, -20.163677, 11.581746, -2.7269554, -18.978003, 12.368683, -1.870472, -20.089493, 11.924424, -1.6036634, -20.163677, 11.581746, -2.7269554, -19.281483, 11.931589, -3.052774, -18.978003, 12.368683, -1.870472, -17.569357, 10.641384, -3.6184235, -18.15271, 11.601134, -3.0422359, -19.281483, 11.931589, -3.052774, -17.569357, 10.641384, -3.6184235, -16.665245, 9.344013, -2.7349634, -16.69475, 10.64855, -2.6245313, -18.15271, 11.601134, -3.0422359, -17.569357, 10.641384, -3.6184235, -16.69475, 10.64855, -2.6245313, -16.69475, 10.64855, -2.6245313, -16.665245, 9.344013, -2.7349634, -16.976309, 9.670254, -1.596076, -19.281483, 11.931589, -3.052774, -18.15271, 11.601134, -3.0422359, -17.739222, 11.938755, -2.279746, -18.15271, 11.601134, -3.0422359, -16.69475, 10.64855, -2.6245313, -17.739222, 11.938755, -2.279746, -19.281483, 11.931589, -3.052774, -17.739222, 11.938755, -2.279746, -18.978003, 12.368683, -1.870472, -16.69475, 10.64855, -2.6245313, -16.976309, 9.670254, -1.596076, -16.835108, 10.641384, -1.396286, -17.739222, 11.938755, -2.279746, -16.69475, 10.64855, -2.6245313, -16.835108, 10.641384, -1.396286, -18.022047, 9.307765, -0.821784, -16.835108, 10.641384, -1.396286, -16.976309, 9.670254, -1.596076, -18.978003, 12.368683, -1.870472, -17.739222, 11.938755, -2.279746, -17.630474, 11.601135, -1.4607759, -17.739222, 11.938755, -2.279746, -16.835108, 10.641384, -1.396286, -17.630474, 11.601135, -1.4607759, -18.022047, 9.307765, -0.821784, -18.138802, 10.619467, -0.38300514, -16.835108, 10.641384, -1.396286, -18.138802, 10.619467, -0.38300514, -17.630474, 11.601135, -1.4607759, -16.835108, 10.641384, -1.396286, -19.474949, 9.625154, -0.8681493, -18.138802, 10.619467, -0.38300514, -18.022047, 9.307765, -0.821784, -19.474949, 9.625154, -0.8681493, -19.734592, 10.597971, -0.2561345, -18.138802, 10.619467, -0.38300514, -18.138802, 10.619467, -0.38300514, -18.547232, 11.93159, -0.8306365, -17.630474, 11.601135, -1.4607759, -18.978003, 12.368683, -1.870472, -17.630474, 11.601135, -1.4607759, -18.547232, 11.93159, -0.8306365, -19.734592, 10.597971, -0.2561345, -18.547232, 11.93159, -0.8306365, -18.138802, 10.619467, -0.38300514, -20.089493, 11.924424, -1.6036634, -18.978003, 12.368683, -1.870472, -18.547232, 11.93159, -0.8306365, -19.734592, 10.597971, -0.2561345, -19.513306, 11.581747, -0.75813866, -18.547232, 11.93159, -0.8306365, -20.089493, 11.924424, -1.6036634, -18.547232, 11.93159, -0.8306365, -19.513306, 11.581747, -0.75813866, -17.62668, 9.670253, -3.5648928, -18.469677, 8.87025, -2.4403362, -16.665245, 9.344013, -2.7349634, -17.62668, 9.670253, -3.5648928, -19.044178, 9.307764, -3.9160008, -18.469677, 8.87025, -2.4403362, -16.665245, 9.344013, -2.7349634, -18.469677, 8.87025, -2.4403362, -18.022047, 9.307765, -0.821784, -16.665245, 9.344013, -2.7349634, -18.022047, 9.307765, -0.821784, -16.976309, 9.670254, -1.596076, -18.469677, 8.87025, -2.4403362, -19.474949, 9.625154, -0.8681493, -18.022047, 9.307765, -0.821784, -18.469677, 8.87025, -2.4403362, -20.401823, 9.271516, -2.002821, -19.474949, 9.625154, -0.8681493, -19.044178, 9.307764, -3.9160008, -20.401823, 9.271516, -2.002821, -18.469677, 8.87025, -2.4403362, -19.044178, 9.307764, -3.9160008, -20.253035, 9.625153, -3.2251654, -20.401823, 9.271516, -2.002821, -17.464405, 7.537475, 1.8374468, -19.955458, 8.19459, 1.3919232, -17.577787, 7.2154503, 1.3678982, -17.464405, 7.537475, 1.8374468, -19.75946, 8.452126, 1.8374465, -19.955458, 8.19459, 1.3919232, -19.75946, 8.452126, 1.8374465, -22.311209, 10.6898575, 1.7080457, -19.955458, 8.19459, 1.3919232, -19.75946, 8.452126, 1.8374465, -22.217215, 10.689015, 1.8374457, -22.311209, 10.6898575, 1.7080457, -19.955458, 8.19459, 1.3919232, -22.311209, 10.6898575, 1.7080457, -22.46337, 10.691122, 1.757361, -17.577787, 7.2154503, 1.3678982, -19.955458, 8.19459, 1.3919232, -20.272423, 7.7777286, 1.5622085, -19.955458, 8.19459, 1.3919232, -22.46337, 10.691122, 1.757361, -20.272423, 7.7777286, 1.5622085, -17.577787, 7.2154503, 1.3678982, -20.272423, 7.7777286, 1.5622085, -17.761982, 6.6949005, 1.547035, -20.272423, 7.7777286, 1.5622085, -22.46337, 10.691122, 1.757361, -22.46337, 10.691122, 1.9175303, -17.761982, 6.6949005, 1.547035, -20.272423, 7.7777286, 1.5622085, -20.272423, 7.777729, 2.1126847, -20.272423, 7.7777286, 1.5622085, -22.46337, 10.691122, 1.9175303, -20.272423, 7.777729, 2.1126847, -17.761982, 6.6949005, 1.547035, -20.272423, 7.777729, 2.1126847, -17.761982, 6.694901, 2.127859, -20.272423, 7.777729, 2.1126847, -22.46337, 10.691122, 1.9175303, -22.311209, 10.689858, 1.9668455, -17.761982, 6.694901, 2.127859, -20.272423, 7.777729, 2.1126847, -19.955458, 8.194591, 2.28297, -20.272423, 7.777729, 2.1126847, -22.311209, 10.689858, 1.9668455, -19.955458, 8.194591, 2.28297, -19.955458, 8.194591, 2.28297, -22.311209, 10.689858, 1.9668455, -22.217215, 10.689015, 1.8374457, -17.761982, 6.694901, 2.127859, -19.955458, 8.194591, 2.28297, -17.577787, 7.215451, 2.3069956, -19.955458, 8.194591, 2.28297, -22.217215, 10.689015, 1.8374457, -19.75946, 8.452126, 1.8374465, -17.577787, 7.215451, 2.3069956, -19.955458, 8.194591, 2.28297, -19.75946, 8.452126, 1.8374465, -17.577787, 7.215451, 2.3069956, -19.75946, 8.452126, 1.8374465, -17.464405, 7.537475, 1.8374468, -19.772528, 3.1467314, 1.8374484, -17.801182, 7.205756, 2.2829702, -18.92911, 3.1467319, 3.0694866, -19.772528, 3.1467314, 1.8374484, -18.119411, 7.263501, 1.8374469, -17.801182, 7.205756, 2.2829702, -18.119411, 7.263501, 1.8374469, -17.641012, 11.282906, 2.034285, -17.801182, 7.205756, 2.2829702, -18.119411, 7.263501, 1.8374469, -17.783056, 11.2980795, 1.8374455, -17.641012, 11.282906, 2.034285, -17.801182, 7.205756, 2.2829702, -17.641012, 11.282906, 2.034285, -17.410873, 11.258881, 1.9592583, -18.92911, 3.1467319, 3.0694866, -17.801182, 7.205756, 2.2829702, -17.28611, 7.1121836, 2.1126852, -17.801182, 7.205756, 2.2829702, -17.410873, 11.258881, 1.9592583, -17.28611, 7.1121836, 2.1126852, -18.92911, 3.1467319, 3.0694866, -17.28611, 7.1121836, 2.1126852, -17.563877, 3.1463103, 2.599095, -17.28611, 7.1121836, 2.1126852, -17.410873, 11.258881, 1.9592583, -17.410873, 11.25888, 1.7156326, -17.563877, 3.1463103, 2.599095, -17.28611, 7.1121836, 2.1126852, -17.28611, 7.1121836, 1.5622088, -17.28611, 7.1121836, 2.1126852, -17.410873, 11.25888, 1.7156326, -17.28611, 7.1121836, 1.5622088, -17.563877, 3.1463103, 2.599095, -17.28611, 7.1121836, 1.5622088, -17.563877, 3.1463099, 1.0758016, -17.28611, 7.1121836, 1.5622088, -17.410873, 11.25888, 1.7156326, -17.641012, 11.282906, 1.6406059, -17.563877, 3.1463099, 1.0758016, -17.28611, 7.1121836, 1.5622088, -17.801182, 7.205756, 1.3919237, -17.28611, 7.1121836, 1.5622088, -17.641012, 11.282906, 1.6406059, -17.801182, 7.205756, 1.3919237, -17.801182, 7.205756, 1.3919237, -17.641012, 11.282906, 1.6406059, -17.783056, 11.2980795, 1.8374455, -17.563877, 3.1463099, 1.0758016, -17.801182, 7.205756, 1.3919237, -18.92911, 3.146731, 0.60541, -17.801182, 7.205756, 1.3919237, -17.783056, 11.2980795, 1.8374455, -18.119411, 7.263501, 1.8374469, -18.92911, 3.146731, 0.60541, -17.801182, 7.205756, 1.3919237, -18.119411, 7.263501, 1.8374469, -18.92911, 3.146731, 0.60541, -18.119411, 7.263501, 1.8374469, -19.772528, 3.1467314, 1.8374484, -17.85176, 7.430414, 1.5381833, -18.091171, 7.869193, -0.13432074, -17.577787, 7.2154503, 1.3678982, -17.85176, 7.430414, 1.5381833, -18.33269, 8.041164, 0.08317232, -18.091171, 7.869193, -0.13432074, -18.33269, 8.041164, 0.08317232, -18.784958, 9.534952, -1.5615134, -18.091171, 7.869193, -0.13432074, -18.33269, 8.041164, 0.08317232, -18.84734, 9.534531, -1.4746847, -18.784958, 9.534952, -1.5615134, -18.091171, 7.869193, -0.13432074, -18.784958, 9.534952, -1.5615134, -18.848183, 9.535795, -1.6474986, -17.577787, 7.2154503, 1.3678982, -18.091171, 7.869193, -0.13432074, -18.265673, 7.5910044, -0.29954767, -18.091171, 7.869193, -0.13432074, -18.848183, 9.535795, -1.6474986, -18.265673, 7.5910044, -0.29954767, -17.577787, 7.2154503, 1.3678982, -18.265673, 7.5910044, -0.29954767, -17.73037, 6.867715, 1.2886567, -18.265673, 7.5910044, -0.29954767, -18.848183, 9.535795, -1.6474986, -18.94934, 9.535795, -1.6142006, -17.73037, 6.867715, 1.2886567, -18.265673, 7.5910044, -0.29954767, -18.614672, 7.591005, -0.18447876, -18.265673, 7.5910044, -0.29954767, -18.94934, 9.535795, -1.6142006, -18.614672, 7.591005, -0.18447876, -17.73037, 6.867715, 1.2886567, -18.614672, 7.591005, -0.18447876, -18.098337, 6.867715, 1.4100481, -18.614672, 7.591005, -0.18447876, -18.94934, 9.535795, -1.6142006, -18.94892, 9.534952, -1.5075612, -18.098337, 6.867715, 1.4100481, -18.614672, 7.591005, -0.18447876, -18.65598, 7.869193, 0.052403092, -18.614672, 7.591005, -0.18447876, -18.94892, 9.534952, -1.5075612, -18.65598, 7.869193, 0.052403092, -18.65598, 7.869193, 0.052403092, -18.94892, 9.534952, -1.5075612, -18.84734, 9.534531, -1.4746847, -18.098337, 6.867715, 1.4100481, -18.65598, 7.869193, 0.052403092, -18.173365, 7.2154503, 1.5643163, -18.65598, 7.869193, 0.052403092, -18.84734, 9.534531, -1.4746847, -18.33269, 8.041164, 0.08317232, -18.173365, 7.2154503, 1.5643163, -18.65598, 7.869193, 0.052403092, -18.33269, 8.041164, 0.08317232, -18.173365, 7.2154503, 1.5643163, -18.33269, 8.041164, 0.08317232, -17.85176, 7.430414, 1.5381833, -18.021717, 16.363804, -17.998592, -21.997292, 20.020512, -13.591122, -21.163078, 14.983807, -13.799868, -21.163078, 14.983807, -13.799868, -21.997292, 20.020512, -13.591122, -20.16242, 20.148884, -7.004968, -21.163078, 14.983807, -13.799868, -20.16242, 20.148884, -7.004968, -19.366419, 16.295841, -7.970547, -18.021717, 16.363804, -17.998592, -19.619282, 19.941853, -19.07104, -21.997292, 20.020512, -13.591122, -11.484028, 15.332424, -18.699127, -19.619282, 19.941853, -19.07104, -18.021717, 16.363804, -17.998592, -21.997292, 20.020512, -13.591122, -18.141577, 23.844606, -8.429464, -20.16242, 20.148884, -7.004968, -11.484028, 15.332424, -18.699127, -11.858614, 20.29928, -19.150177, -19.619282, 19.941853, -19.07104, -6.256456, 16.73004, -14.795372, -11.858614, 20.29928, -19.150177, -11.484028, 15.332424, -18.699127, -19.619282, 19.941853, -19.07104, -18.61851, 25.10693, -12.27676, -21.997292, 20.020512, -13.591122, -21.997292, 20.020512, -13.591122, -18.61851, 25.10693, -12.27676, -18.141577, 23.844606, -8.429464, -11.858614, 20.29928, -19.150177, -17.480486, 23.753365, -16.033627, -19.619282, 19.941853, -19.07104, -19.619282, 19.941853, -19.07104, -17.480486, 23.753365, -16.033627, -18.61851, 25.10693, -12.27676, -6.256456, 16.73004, -14.795372, -4.954714, 20.567348, -15.343607, -11.858614, 20.29928, -19.150177, -4.954714, 20.567348, -15.343607, -6.256456, 16.73004, -14.795372, -5.1436496, 15.231738, -9.215076, -11.858614, 20.29928, -19.150177, -13.089849, 25.17615, -15.716137, -17.480486, 23.753365, -16.033627, -4.954714, 20.567348, -15.343607, -13.089849, 25.17615, -15.716137, -11.858614, 20.29928, -19.150177, -17.480486, 23.753365, -16.033627, -14.129517, 26.802193, -11.209101, -18.61851, 25.10693, -12.27676, -17.480486, 23.753365, -16.033627, -13.089849, 25.17615, -15.716137, -14.129517, 26.802193, -11.209101, -4.954714, 20.567348, -15.343607, -8.721195, 24.030872, -13.957819, -13.089849, 25.17615, -15.716137, -4.954714, 20.567348, -15.343607, -5.1436496, 15.231738, -9.215076, -5.146767, 20.21873, -9.1676445, -8.721195, 24.030872, -13.957819, -4.954714, 20.567348, -15.343607, -5.146767, 20.21873, -9.1676445, -5.146767, 20.21873, -9.1676445, -5.1436496, 15.231738, -9.215076, -9.403631, 16.237947, -5.131659, -13.089849, 25.17615, -15.716137, -8.721195, 24.030872, -13.957819, -9.362032, 25.156012, -10.226952, -8.721195, 24.030872, -13.957819, -5.146767, 20.21873, -9.1676445, -9.362032, 25.156012, -10.226952, -13.089849, 25.17615, -15.716137, -9.362032, 25.156012, -10.226952, -14.129517, 26.802193, -11.209101, -5.146767, 20.21873, -9.1676445, -9.403631, 16.237947, -5.131659, -9.5517025, 19.8204, -4.097917, -9.362032, 25.156012, -10.226952, -5.146767, 20.21873, -9.1676445, -9.5517025, 19.8204, -4.097917, -14.8233185, 14.882492, -4.315932, -9.5517025, 19.8204, -4.097917, -9.403631, 16.237947, -5.131659, -14.129517, 26.802193, -11.209101, -9.362032, 25.156012, -10.226952, -11.184143, 23.699244, -6.717871, -9.362032, 25.156012, -10.226952, -9.5517025, 19.8204, -4.097917, -11.184143, 23.699244, -6.717871, -14.8233185, 14.882492, -4.315932, -15.285444, 19.939335, -3.6085896, -9.5517025, 19.8204, -4.097917, -15.285444, 19.939335, -3.6085896, -11.184143, 23.699244, -6.717871, -9.5517025, 19.8204, -4.097917, -19.366419, 16.295841, -7.970547, -15.285444, 19.939335, -3.6085896, -14.8233185, 14.882492, -4.315932, -19.366419, 16.295841, -7.970547, -20.16242, 20.148884, -7.004968, -15.285444, 19.939335, -3.6085896, -15.285444, 19.939335, -3.6085896, -14.890806, 25.086163, -6.7869554, -11.184143, 23.699244, -6.717871, -14.129517, 26.802193, -11.209101, -11.184143, 23.699244, -6.717871, -14.890806, 25.086163, -6.7869554, -20.16242, 20.148884, -7.004968, -14.890806, 25.086163, -6.7869554, -15.285444, 19.939335, -3.6085896, -18.61851, 25.10693, -12.27676, -14.129517, 26.802193, -11.209101, -14.890806, 25.086163, -6.7869554, -20.16242, 20.148884, -7.004968, -18.141577, 23.844606, -8.429464, -14.890806, 25.086163, -6.7869554, -18.61851, 25.10693, -12.27676, -14.890806, 25.086163, -6.7869554, -18.141577, 23.844606, -8.429464, -6.256456, 16.73004, -14.795372, -13.014427, 13.437051, -11.550283, -5.1436496, 15.231738, -9.215076, -6.256456, 16.73004, -14.795372, -11.484028, 15.332424, -18.699127, -13.014427, 13.437051, -11.550283, -5.1436496, 15.231738, -9.215076, -13.014427, 13.437051, -11.550283, -14.8233185, 14.882492, -4.315932, -5.1436496, 15.231738, -9.215076, -14.8233185, 14.882492, -4.315932, -9.403631, 16.237947, -5.131659, -13.014427, 13.437051, -11.550283, -19.366419, 16.295841, -7.970547, -14.8233185, 14.882492, -4.315932, -13.014427, 13.437051, -11.550283, -21.163078, 14.983807, -13.799868, -19.366419, 16.295841, -7.970547, -11.484028, 15.332424, -18.699127, -21.163078, 14.983807, -13.799868, -13.014427, 13.437051, -11.550283, -11.484028, 15.332424, -18.699127, -18.021717, 16.363804, -17.998592, -21.163078, 14.983807, -13.799868, -13.562267, 14.716995, -23.311634, -16.202703, 16.876032, -20.837955, -15.172899, 13.925998, -21.079226, -15.172899, 13.925998, -21.079226, -16.202703, 16.876032, -20.837955, -15.753397, 16.891764, -16.938854, -15.172899, 13.925998, -21.079226, -15.753397, 16.891764, -16.938854, -14.583576, 14.716994, -17.856216, -13.562267, 14.716995, -23.311634, -14.412493, 16.891764, -24.101406, -16.202703, 16.876032, -20.837955, -10.448349, 14.0071745, -23.35928, -14.412493, 16.891764, -24.101406, -13.562267, 14.716995, -23.311634, -16.202703, 16.876032, -20.837955, -14.777542, 19.092333, -17.681902, -15.753397, 16.891764, -16.938854, -10.448349, 14.0071745, -23.35928, -10.954712, 16.940847, -23.667263, -14.412493, 16.891764, -24.101406, -8.051947, 14.8176775, -21.140478, -10.954712, 16.940847, -23.667263, -10.448349, 14.0071745, -23.35928, -14.412493, 16.891764, -24.101406, -14.993107, 19.85816, -19.960417, -16.202703, 16.876032, -20.837955, -16.202703, 16.876032, -20.837955, -14.993107, 19.85816, -19.960417, -14.777542, 19.092333, -17.681902, -10.954712, 16.940847, -23.667263, -13.92425, 19.092335, -22.239834, -14.412493, 16.891764, -24.101406, -14.412493, 16.891764, -24.101406, -13.92425, 19.092335, -22.239834, -14.993107, 19.85816, -19.960417, -8.051947, 14.8176775, -21.140478, -7.8814073, 16.989302, -21.182816, -10.954712, 16.940847, -23.667263, -7.8814073, 16.989302, -21.182816, -8.051947, 14.8176775, -21.140478, -7.065434, 14.08772, -18.476276, -10.954712, 16.940847, -23.667263, -11.844934, 19.873892, -21.924828, -13.92425, 19.092335, -22.239834, -7.8814073, 16.989302, -21.182816, -11.844934, 19.873892, -21.924828, -10.954712, 16.940847, -23.667263, -13.92425, 19.092335, -22.239834, -12.527824, 20.852411, -19.282501, -14.993107, 19.85816, -19.960417, -13.92425, 19.092335, -22.239834, -11.844934, 19.873892, -21.924828, -12.527824, 20.852411, -19.282501, -7.8814073, 16.989302, -21.182816, -9.646725, 19.135124, -20.685514, -11.844934, 19.873892, -21.924828, -7.8814073, 16.989302, -21.182816, -7.065434, 14.08772, -18.476276, -7.2431235, 17.005661, -18.293152, -9.646725, 19.135124, -20.685514, -7.8814073, 16.989302, -21.182816, -7.2431235, 17.005661, -18.293152, -7.2431235, 17.005661, -18.293152, -7.065434, 14.08772, -18.476276, -8.905237, 14.8176775, -16.582546, -11.844934, 19.873892, -21.924828, -9.646725, 19.135124, -20.685514, -9.66033, 19.890251, -18.745678, -9.646725, 19.135124, -20.685514, -7.2431235, 17.005661, -18.293152, -9.66033, 19.890251, -18.745678, -11.844934, 19.873892, -21.924828, -9.66033, 19.890251, -18.745678, -12.527824, 20.852411, -19.282501, -7.2431235, 17.005661, -18.293152, -8.905237, 14.8176775, -16.582546, -8.844357, 16.9893, -16.039139, -9.66033, 19.890251, -18.745678, -7.2431235, 17.005661, -18.293152, -8.844357, 16.9893, -16.039139, -11.789251, 14.007174, -16.196726, -8.844357, 16.9893, -16.039139, -8.905237, 14.8176775, -16.582546, -12.527824, 20.852411, -19.282501, -9.66033, 19.890251, -18.745678, -10.331999, 19.135124, -17.025066, -9.66033, 19.890251, -18.745678, -8.844357, 16.9893, -16.039139, -10.331999, 19.135124, -17.025066, -11.789251, 14.007174, -16.196726, -12.490612, 16.940847, -15.46311, -8.844357, 16.9893, -16.039139, -12.490612, 16.940847, -15.46311, -10.331999, 19.135124, -17.025066, -8.844357, 16.9893, -16.039139, -14.583576, 14.716994, -17.856216, -12.490612, 16.940847, -15.46311, -11.789251, 14.007174, -16.196726, -14.583576, 14.716994, -17.856216, -15.753397, 16.891764, -16.938854, -12.490612, 16.940847, -15.46311, -12.490612, 16.940847, -15.46311, -12.807882, 19.87389, -16.78115, -10.331999, 19.135124, -17.025066, -12.527824, 20.852411, -19.282501, -10.331999, 19.135124, -17.025066, -12.807882, 19.87389, -16.78115, -15.753397, 16.891764, -16.938854, -12.807882, 19.87389, -16.78115, -12.490612, 16.940847, -15.46311, -14.993107, 19.85816, -19.960417, -12.527824, 20.852411, -19.282501, -12.807882, 19.87389, -16.78115, -15.753397, 16.891764, -16.938854, -14.777542, 19.092333, -17.681902, -12.807882, 19.87389, -16.78115, -14.993107, 19.85816, -19.960417, -12.807882, 19.87389, -16.78115, -14.777542, 19.092333, -17.681902, -8.051947, 14.8176775, -21.140478, -10.918001, 13.029283, -19.848606, -7.065434, 14.08772, -18.476276, -8.051947, 14.8176775, -21.140478, -10.448349, 14.0071745, -23.35928, -10.918001, 13.029283, -19.848606, -7.065434, 14.08772, -18.476276, -10.918001, 13.029283, -19.848606, -11.789251, 14.007174, -16.196726, -7.065434, 14.08772, -18.476276, -11.789251, 14.007174, -16.196726, -8.905237, 14.8176775, -16.582546, -10.918001, 13.029283, -19.848606, -14.583576, 14.716994, -17.856216, -11.789251, 14.007174, -16.196726, -10.918001, 13.029283, -19.848606, -15.172899, 13.925998, -21.079226, -14.583576, 14.716994, -17.856216, -10.448349, 14.0071745, -23.35928, -15.172899, 13.925998, -21.079226, -10.918001, 13.029283, -19.848606, -10.448349, 14.0071745, -23.35928, -13.562267, 14.716995, -23.311634, -15.172899, 13.925998, -21.079226, -5.8097816, 12.926081, -14.093311, -7.931314, 14.367117, -15.249769, -7.562638, 12.39812, -14.647457, -7.562638, 12.39812, -14.647457, -7.931314, 14.367117, -15.249769, -10.30912, 14.378445, -14.14818, -7.562638, 12.39812, -14.647457, -10.30912, 14.378445, -14.14818, -9.4823475, 12.926081, -13.599033, -5.8097816, 12.926081, -14.093311, -5.4877048, 14.378444, -14.798061, -7.931314, 14.367117, -15.249769, -5.128114, 12.452237, -12.129587, -5.4877048, 14.378444, -14.798061, -5.8097816, 12.926081, -14.093311, -7.931314, 14.367117, -15.249769, -9.633245, 15.847169, -13.685543, -10.30912, 14.378445, -14.14818, -5.128114, 12.452237, -12.129587, -5.038579, 14.410537, -12.515514, -5.4877048, 14.378444, -14.798061, -6.032766, 12.993412, -10.145935, -5.038579, 14.410537, -12.515514, -5.128114, 12.452237, -12.129587, -5.4877048, 14.378444, -14.798061, -8.234188, 16.358768, -14.298784, -7.931314, 14.367117, -15.249769, -7.931314, 14.367117, -15.249769, -8.234188, 16.358768, -14.298784, -9.633245, 15.847169, -13.685543, -5.038579, 14.410537, -12.515514, -6.565431, 15.847169, -14.099052, -5.4877048, 14.378444, -14.798061, -5.4877048, 14.378444, -14.798061, -6.565431, 15.847169, -14.099052, -8.234188, 16.358768, -14.298784, -6.032766, 12.993412, -10.145935, -5.9699607, 14.443258, -10.047108, -5.038579, 14.410537, -12.515514, -5.9699607, 14.443258, -10.047108, -6.032766, 12.993412, -10.145935, -7.5147758, 12.506355, -8.963072, -5.038579, 14.410537, -12.515514, -6.3296666, 16.369465, -12.714966, -6.565431, 15.847169, -14.099052, -5.9699607, 14.443258, -10.047108, -6.3296666, 16.369465, -12.714966, -5.038579, 14.410537, -12.515514, -6.565431, 15.847169, -14.099052, -8.14801, 17.022022, -12.594429, -8.234188, 16.358768, -14.298784, -6.565431, 15.847169, -14.099052, -6.3296666, 16.369465, -12.714966, -8.14801, 17.022022, -12.594429, -5.9699607, 14.443258, -10.047108, -6.655229, 15.876115, -11.061441, -6.3296666, 16.369465, -12.714966, -5.9699607, 14.443258, -10.047108, -7.5147758, 12.506355, -8.963072, -7.6687236, 14.453957, -9.036707, -6.655229, 15.876115, -11.061441, -5.9699607, 14.443258, -10.047108, -7.6687236, 14.453957, -9.036707, -7.6687236, 14.453957, -9.036707, -7.5147758, 12.506355, -8.963072, -9.10058, 12.993413, -9.732424, -6.3296666, 16.369465, -12.714966, -6.655229, 15.876115, -11.061441, -7.8877406, 16.380163, -10.664139, -6.655229, 15.876115, -11.061441, -7.6687236, 14.453957, -9.036707, -7.8877406, 16.380163, -10.664139, -6.3296666, 16.369465, -12.714966, -7.8877406, 16.380163, -10.664139, -8.14801, 17.022022, -12.594429, -7.6687236, 14.453957, -9.036707, -9.10058, 12.993413, -9.732424, -9.432554, 14.443259, -9.580103, -7.8877406, 16.380163, -10.664139, -7.6687236, 14.453957, -9.036707, -9.432554, 14.443259, -9.580103, -9.94953, 12.452238, -11.479706, -9.432554, 14.443259, -9.580103, -9.10058, 12.993413, -9.732424, -8.14801, 17.022022, -12.594429, -7.8877406, 16.380163, -10.664139, -9.119415, 15.876115, -10.7295475, -7.8877406, 16.380163, -10.664139, -9.432554, 14.443259, -9.580103, -9.119415, 15.876115, -10.7295475, -9.94953, 12.452238, -11.479706, -10.561342, 14.410537, -11.77158, -9.432554, 14.443259, -9.580103, -10.561342, 14.410537, -11.77158, -9.119415, 15.876115, -10.7295475, -9.432554, 14.443259, -9.580103, -9.4823475, 12.926081, -13.599033, -10.561342, 14.410537, -11.77158, -9.94953, 12.452238, -11.479706, -9.4823475, 12.926081, -13.599033, -10.30912, 14.378445, -14.14818, -10.561342, 14.410537, -11.77158, -10.561342, 14.410537, -11.77158, -9.792261, 16.369465, -12.247959, -9.119415, 15.876115, -10.7295475, -8.14801, 17.022022, -12.594429, -9.119415, 15.876115, -10.7295475, -9.792261, 16.369465, -12.247959, -10.30912, 14.378445, -14.14818, -9.792261, 16.369465, -12.247959, -10.561342, 14.410537, -11.77158, -8.234188, 16.358768, -14.298784, -8.14801, 17.022022, -12.594429, -9.792261, 16.369465, -12.247959, -10.30912, 14.378445, -14.14818, -9.633245, 15.847169, -13.685543, -9.792261, 16.369465, -12.247959, -8.234188, 16.358768, -14.298784, -9.792261, 16.369465, -12.247959, -9.633245, 15.847169, -13.685543, -6.032766, 12.993412, -10.145935, -7.45141, 11.799051, -11.691931, -7.5147758, 12.506355, -8.963072, -6.032766, 12.993412, -10.145935, -5.128114, 12.452237, -12.129587, -7.45141, 11.799051, -11.691931, -7.5147758, 12.506355, -8.963072, -7.45141, 11.799051, -11.691931, -9.94953, 12.452238, -11.479706, -7.5147758, 12.506355, -8.963072, -9.94953, 12.452238, -11.479706, -9.10058, 12.993413, -9.732424, -7.45141, 11.799051, -11.691931, -9.4823475, 12.926081, -13.599033, -9.94953, 12.452238, -11.479706, -7.45141, 11.799051, -11.691931, -7.562638, 12.39812, -14.647457, -9.4823475, 12.926081, -13.599033, -5.128114, 12.452237, -12.129587, -7.562638, 12.39812, -14.647457, -7.45141, 11.799051, -11.691931, -5.128114, 12.452237, -12.129587, -5.8097816, 12.926081, -14.093311, -7.562638, 12.39812, -14.647457, -14.00502, 9.80929, -11.391943, -12.666889, 10.790327, -14.925047, -13.28483, 9.328525, -11.429331, -14.00502, 9.80929, -11.391943, -13.374517, 11.174813, -14.759827, -12.666889, 10.790327, -14.925047, -13.374517, 11.174813, -14.759827, -12.483606, 14.515627, -18.468845, -12.666889, 10.790327, -14.925047, -13.374517, 11.174813, -14.759827, -12.699318, 14.514368, -18.366463, -12.483606, 14.515627, -18.468845, -12.666889, 10.790327, -14.925047, -12.483606, 14.515627, -18.468845, -12.5141735, 14.517514, -18.70568, -13.28483, 9.328525, -11.429331, -12.666889, 10.790327, -14.925047, -12.829697, 10.167975, -15.43696, -12.666889, 10.790327, -14.925047, -12.5141735, 14.517514, -18.70568, -12.829697, 10.167975, -15.43696, -13.28483, 9.328525, -11.429331, -12.829697, 10.167975, -15.43696, -13.497103, 8.551372, -11.74884, -12.829697, 10.167975, -15.43696, -12.5141735, 14.517514, -18.70568, -12.749214, 14.517514, -18.749683, -13.497103, 8.551372, -11.74884, -12.829697, 10.167975, -15.43696, -13.637495, 10.167976, -15.588188, -12.829697, 10.167975, -15.43696, -12.749214, 14.517514, -18.749683, -13.637495, 10.167976, -15.588188, -13.497103, 8.551372, -11.74884, -13.637495, 10.167976, -15.588188, -14.349434, 8.551372, -11.908405, -13.637495, 10.167976, -15.588188, -12.749214, 14.517514, -18.749683, -12.863384, 14.515627, -18.539944, -14.349434, 8.551372, -11.908405, -13.637495, 10.167976, -15.588188, -13.974457, 10.790327, -15.169838, -13.637495, 10.167976, -15.588188, -12.863384, 14.515627, -18.539944, -13.974457, 10.790327, -15.169838, -13.974457, 10.790327, -15.169838, -12.863384, 14.515627, -18.539944, -12.699318, 14.514368, -18.366463, -14.349434, 8.551372, -11.908405, -13.974457, 10.790327, -15.169838, -14.662912, 9.328525, -11.687323, -13.974457, 10.790327, -15.169838, -12.699318, 14.514368, -18.366463, -13.374517, 11.174813, -14.759827, -14.662912, 9.328525, -11.687323, -13.974457, 10.790327, -15.169838, -13.374517, 11.174813, -14.759827, -14.662912, 9.328525, -11.687323, -13.374517, 11.174813, -14.759827, -14.00502, 9.80929, -11.391943, -13.370928, 3.2541475, -14.779001, -14.566284, 9.314051, -12.008541, -15.410591, 3.2541475, -13.879795, -13.370928, 3.2541475, -14.779001, -13.825075, 9.400261, -12.353134, -14.566284, 9.314051, -12.008541, -13.825075, 9.400261, -12.353134, -14.245354, 15.401014, -11.705181, -14.566284, 9.314051, -12.008541, -13.825075, 9.400261, -12.353134, -13.917479, 15.423668, -11.859549, -14.245354, 15.401014, -11.705181, -14.566284, 9.314051, -12.008541, -14.245354, 15.401014, -11.705181, -14.198481, 15.365146, -11.346853, -15.410591, 3.2541475, -13.879795, -14.566284, 9.314051, -12.008541, -14.457899, 9.174353, -11.205919, -14.566284, 9.314051, -12.008541, -14.198481, 15.365146, -11.346853, -14.457899, 9.174353, -11.205919, -15.410591, 3.2541475, -13.879795, -14.457899, 9.174353, -11.205919, -15.095373, 3.253518, -11.747156, -14.457899, 9.174353, -11.205919, -14.198481, 15.365146, -11.346853, -13.840971, 15.365146, -11.279924, -15.095373, 3.253518, -11.747156, -14.457899, 9.174353, -11.205919, -13.650103, 9.174353, -11.054691, -14.457899, 9.174353, -11.205919, -13.840971, 15.365146, -11.279924, -13.650103, 9.174353, -11.054691, -15.095373, 3.253518, -11.747156, -13.650103, 9.174353, -11.054691, -12.860012, 3.253518, -11.328674, -13.650103, 9.174353, -11.054691, -13.840971, 15.365146, -11.279924, -13.667648, 15.401014, -11.597029, -12.860012, 3.253518, -11.328674, -13.650103, 9.174353, -11.054691, -13.258715, 9.314051, -11.763752, -13.650103, 9.174353, -11.054691, -13.667648, 15.401014, -11.597029, -13.258715, 9.314051, -11.763752, -13.258715, 9.314051, -11.763752, -13.667648, 15.401014, -11.597029, -13.917479, 15.423668, -11.859549, -12.860012, 3.253518, -11.328674, -13.258715, 9.314051, -11.763752, -11.794676, 3.2541475, -13.20286, -13.258715, 9.314051, -11.763752, -13.917479, 15.423668, -11.859549, -13.825075, 9.400261, -12.353134, -11.794676, 3.2541475, -13.20286, -13.258715, 9.314051, -11.763752, -13.825075, 9.400261, -12.353134, -11.794676, 3.2541475, -13.20286, -13.825075, 9.400261, -12.353134, -13.370928, 3.2541475, -14.779001, -13.45945, 9.649454, -11.878155, -10.93936, 10.304527, -11.770006, -13.28483, 9.328525, -11.429331, -13.45945, 9.649454, -11.878155, -11.192169, 10.561271, -12.184172, -10.93936, 10.304527, -11.770006, -11.192169, 10.561271, -12.184172, -8.654425, 12.791416, -12.396021, -10.93936, 10.304527, -11.770006, -11.192169, 10.561271, -12.184172, -8.764704, 12.790787, -12.511417, -8.654425, 12.791416, -12.396021, -10.93936, 10.304527, -11.770006, -8.654425, 12.791416, -12.396021, -8.510876, 12.792675, -12.465178, -13.28483, 9.328525, -11.429331, -10.93936, 10.304527, -11.770006, -10.648958, 9.889207, -11.980684, -10.93936, 10.304527, -11.770006, -8.510876, 12.792675, -12.465178, -10.648958, 9.889207, -11.980684, -13.28483, 9.328525, -11.429331, -10.648958, 9.889207, -11.980684, -13.126629, 8.809374, -11.63147, -10.648958, 9.889207, -11.980684, -8.510876, 12.792675, -12.465178, -8.53195, 12.792675, -12.622772, -13.126629, 8.809374, -11.63147, -10.648958, 9.889207, -11.980684, -10.721937, 9.889207, -12.524437, -10.648958, 9.889207, -11.980684, -8.53195, 12.792675, -12.622772, -10.721937, 9.889207, -12.524437, -13.126629, 8.809374, -11.63147, -10.721937, 9.889207, -12.524437, -13.203676, 8.809374, -12.204792, -10.721937, 9.889207, -12.524437, -8.53195, 12.792675, -12.622772, -8.688553, 12.791416, -12.651451, -13.203676, 8.809374, -12.204792, -10.721937, 9.889207, -12.524437, -11.058203, 10.304527, -12.650129, -10.721937, 9.889207, -12.524437, -8.688553, 12.791416, -12.651451, -11.058203, 10.304527, -12.650129, -11.058203, 10.304527, -12.650129, -8.688553, 12.791416, -12.651451, -8.764704, 12.790787, -12.511417, -13.203676, 8.809374, -12.204792, -11.058203, 10.304527, -12.650129, -13.409447, 9.328525, -12.357271, -11.058203, 10.304527, -12.650129, -8.764704, 12.790787, -12.511417, -11.192169, 10.561271, -12.184172, -13.409447, 9.328525, -12.357271, -11.058203, 10.304527, -12.650129, -11.192169, 10.561271, -12.184172, -13.409447, 9.328525, -12.357271, -11.192169, 10.561271, -12.184172, -13.45945, 9.649454, -11.878155, 1.2086613, -17.361609, 9.414333, 2.631641, -16.33421, 10.284525, 2.5310369, -17.7495, 10.064947, 2.5310369, -17.7495, 10.064947, 2.631641, -16.33421, 10.284525, 4.3560047, -16.298113, 9.437187, 2.5310369, -17.7495, 10.064947, 4.3560047, -16.298113, 9.437187, 4.0482125, -17.380833, 9.267164, 1.2086613, -17.361609, 9.414333, 0.99485135, -16.35621, 9.910944, 2.631641, -16.33421, 10.284525, 0.67701983, -17.65146, 7.644686, 0.99485135, -16.35621, 9.910944, 1.2086613, -17.361609, 9.414333, 2.631641, -16.33421, 10.284525, 3.8578982, -15.259179, 8.952537, 4.3560047, -16.298113, 9.437187, 0.67701983, -17.65146, 7.644686, 0.57171667, -16.255608, 7.7713485, 0.99485135, -16.35621, 9.910944, 1.4848416, -17.258871, 5.9989257, 0.57171667, -16.255608, 7.7713485, 0.67701983, -17.65146, 7.644686, 0.99485135, -16.35621, 9.910944, 2.820033, -14.904823, 9.283184, 2.631641, -16.33421, 10.284525, 2.631641, -16.33421, 10.284525, 2.820033, -14.904823, 9.283184, 3.8578982, -15.259179, 8.952537, 0.57171667, -16.255608, 7.7713485, 1.7232151, -15.285238, 9.163143, 0.99485135, -16.35621, 9.910944, 0.99485135, -16.35621, 9.910944, 1.7232151, -15.285238, 9.163143, 2.820033, -14.904823, 9.283184, 1.4848416, -17.258871, 5.9989257, 1.2661188, -16.180422, 5.6674232, 0.57171667, -16.255608, 7.7713485, 1.2661188, -16.180422, 5.6674232, 1.4848416, -17.258871, 5.9989257, 2.9689097, -17.679869, 5.4027777, 0.57171667, -16.255608, 7.7713485, 1.5839503, -14.885172, 7.933895, 1.7232151, -15.285238, 9.163143, 1.2661188, -16.180422, 5.6674232, 1.5839503, -14.885172, 7.933895, 0.57171667, -16.255608, 7.7713485, 1.7232151, -15.285238, 9.163143, 2.8828304, -14.428289, 7.988148, 2.820033, -14.904823, 9.283184, 1.7232151, -15.285238, 9.163143, 1.5839503, -14.885172, 7.933895, 2.8828304, -14.428289, 7.988148, 1.2661188, -16.180422, 5.6674232, 1.8436836, -15.206849, 6.6362967, 1.5839503, -14.885172, 7.933895, 1.2661188, -16.180422, 5.6674232, 2.9689097, -17.679869, 5.4027777, 2.9821527, -16.278463, 5.4012823, 1.8436836, -15.206849, 6.6362967, 1.2661188, -16.180422, 5.6674232, 2.9821527, -16.278463, 5.4012823, 2.9821527, -16.278463, 5.4012823, 2.9689097, -17.679869, 5.4027777, 4.3171306, -17.397068, 6.368234, 1.5839503, -14.885172, 7.933895, 1.8436836, -15.206849, 6.6362967, 2.9076076, -14.890726, 6.620277, 1.8436836, -15.206849, 6.6362967, 2.9821527, -16.278463, 5.4012823, 2.9076076, -14.890726, 6.620277, 1.5839503, -14.885172, 7.933895, 2.9076076, -14.890726, 6.620277, 2.8828304, -14.428289, 7.988148, 2.9821527, -16.278463, 5.4012823, 4.3171306, -17.397068, 6.368234, 4.6103983, -16.390173, 6.355845, 2.9076076, -14.890726, 6.620277, 2.9821527, -16.278463, 5.4012823, 4.6103983, -16.390173, 6.355845, 4.8227134, -17.777908, 7.823253, 4.6103983, -16.390173, 6.355845, 4.3171306, -17.397068, 6.368234, 2.8828304, -14.428289, 7.988148, 2.9076076, -14.890726, 6.620277, 3.9711041, -15.30019, 6.942167, 2.9076076, -14.890726, 6.620277, 4.6103983, -16.390173, 6.355845, 3.9711041, -15.30019, 6.942167, 4.8227134, -17.777908, 7.823253, 5.042077, -16.356638, 7.9142447, 4.6103983, -16.390173, 6.355845, 5.042077, -16.356638, 7.9142447, 3.9711041, -15.30019, 6.942167, 4.6103983, -16.390173, 6.355845, 4.0482125, -17.380833, 9.267164, 5.042077, -16.356638, 7.9142447, 4.8227134, -17.777908, 7.823253, 4.0482125, -17.380833, 9.267164, 4.3560047, -16.298113, 9.437187, 5.042077, -16.356638, 7.9142447, 5.042077, -16.356638, 7.9142447, 4.1434765, -14.910377, 7.969779, 3.9711041, -15.30019, 6.942167, 2.8828304, -14.428289, 7.988148, 3.9711041, -15.30019, 6.942167, 4.1434765, -14.910377, 7.969779, 4.3560047, -16.298113, 9.437187, 4.1434765, -14.910377, 7.969779, 5.042077, -16.356638, 7.9142447, 2.820033, -14.904823, 9.283184, 2.8828304, -14.428289, 7.988148, 4.1434765, -14.910377, 7.969779, 4.3560047, -16.298113, 9.437187, 3.8578982, -15.259179, 8.952537, 4.1434765, -14.910377, 7.969779, 2.820033, -14.904823, 9.283184, 4.1434765, -14.910377, 7.969779, 3.8578982, -15.259179, 8.952537, 1.4848416, -17.258871, 5.9989257, 2.7309632, -18.18417, 7.6976585, 2.9689097, -17.679869, 5.4027777, 1.4848416, -17.258871, 5.9989257, 0.67701983, -17.65146, 7.644686, 2.7309632, -18.18417, 7.6976585, 2.9689097, -17.679869, 5.4027777, 2.7309632, -18.18417, 7.6976585, 4.8227134, -17.777908, 7.823253, 2.9689097, -17.679869, 5.4027777, 4.8227134, -17.777908, 7.823253, 4.3171306, -17.397068, 6.368234, 2.7309632, -18.18417, 7.6976585, 4.0482125, -17.380833, 9.267164, 4.8227134, -17.777908, 7.823253, 2.7309632, -18.18417, 7.6976585, 2.5310369, -17.7495, 10.064947, 4.0482125, -17.380833, 9.267164, 0.67701983, -17.65146, 7.644686, 2.5310369, -17.7495, 10.064947, 2.7309632, -18.18417, 7.6976585, 0.67701983, -17.65146, 7.644686, 1.2086613, -17.361609, 9.414333, 2.5310369, -17.7495, 10.064947, -1.1748617, -18.139956, 8.584938, -0.18462849, -17.407104, 9.311379, -0.3294468, -18.408445, 8.982868, -0.3294468, -18.408445, 8.982868, -0.18462849, -17.407104, 9.311379, 1.0884066, -17.401766, 8.917934, -0.3294468, -18.408445, 8.982868, 1.0884066, -17.401766, 8.917934, 0.70905924, -18.139956, 8.584938, -1.1748617, -18.139956, 8.584938, -1.3850405, -17.401766, 8.917934, -0.18462849, -17.407104, 9.311379, -1.3850405, -18.381105, 7.5489955, -1.3850405, -17.401766, 8.917934, -1.1748617, -18.139956, 8.584938, -0.18462849, -17.407104, 9.311379, 0.7793324, -16.655033, 8.638763, 1.0884066, -17.401766, 8.917934, -1.3850405, -18.381105, 7.5489955, -1.4563816, -17.385319, 7.7371736, -1.3850405, -17.401766, 8.917934, -0.79465985, -18.10578, 6.6108794, -1.4563816, -17.385319, 7.7371736, -1.3850405, -18.381105, 7.5489955, -1.3850405, -17.401766, 8.917934, 0.03259921, -16.395086, 8.853001, -0.18462849, -17.407104, 9.311379, -0.18462849, -17.407104, 9.311379, 0.03259921, -16.395086, 8.853001, 0.7793324, -16.655033, 8.638763, -1.4563816, -17.385319, 7.7371736, -0.79465985, -16.655033, 8.638763, -1.3850405, -17.401766, 8.917934, -1.3850405, -17.401766, 8.917934, -0.79465985, -16.655033, 8.638763, 0.03259921, -16.395086, 8.853001, -0.79465985, -18.10578, 6.6108794, -0.8192234, -17.368872, 6.556626, -1.4563816, -17.385319, 7.7371736, -0.8192234, -17.368872, 6.556626, -0.79465985, -18.10578, 6.6108794, 0.03259921, -18.353552, 6.115336, -1.4563816, -17.385319, 7.7371736, -0.8192234, -16.389532, 7.9253516, -0.79465985, -16.655033, 8.638763, -0.8192234, -17.368872, 6.556626, -0.8192234, -16.389532, 7.9253516, -1.4563816, -17.385319, 7.7371736, -0.79465985, -16.655033, 8.638763, 0.10500836, -16.057604, 7.9881487, 0.03259921, -16.395086, 8.853001, -0.79465985, -16.655033, 8.638763, -0.8192234, -16.389532, 7.9253516, 0.10500836, -16.057604, 7.9881487, -0.8192234, -17.368872, 6.556626, -0.54325676, -16.640295, 7.1145396, -0.8192234, -16.389532, 7.9253516, -0.8192234, -17.368872, 6.556626, 0.03259921, -18.353552, 6.115336, 0.10500836, -17.36332, 6.1631813, -0.54325676, -16.640295, 7.1145396, -0.8192234, -17.368872, 6.556626, 0.10500836, -17.36332, 6.1631813, 0.10500836, -17.36332, 6.1631813, 0.03259921, -18.353552, 6.115336, 0.7793324, -18.10578, 6.6108794, -0.8192234, -16.389532, 7.9253516, -0.54325676, -16.640295, 7.1145396, 0.10500836, -16.38398, 6.9979157, -0.54325676, -16.640295, 7.1145396, 0.10500836, -17.36332, 6.1631813, 0.10500836, -16.38398, 6.9979157, -0.8192234, -16.389532, 7.9253516, 0.10500836, -16.38398, 6.9979157, 0.10500836, -16.057604, 7.9881487, 0.10500836, -17.36332, 6.1631813, 0.7793324, -18.10578, 6.6108794, 0.9570446, -17.368872, 6.556626, 0.10500836, -16.38398, 6.9979157, 0.10500836, -17.36332, 6.1631813, 0.9570446, -17.368872, 6.556626, 1.0884066, -18.381105, 7.5489955, 0.9570446, -17.368872, 6.556626, 0.7793324, -18.10578, 6.6108794, 0.10500836, -16.057604, 7.9881487, 0.10500836, -16.38398, 6.9979157, 0.7210206, -16.640295, 7.1145396, 0.10500836, -16.38398, 6.9979157, 0.9570446, -17.368872, 6.556626, 0.7210206, -16.640295, 7.1145396, 1.0884066, -18.381105, 7.5489955, 1.3767617, -17.385319, 7.7371736, 0.9570446, -17.368872, 6.556626, 1.3767617, -17.385319, 7.7371736, 0.7210206, -16.640295, 7.1145396, 0.9570446, -17.368872, 6.556626, 0.70905924, -18.139956, 8.584938, 1.3767617, -17.385319, 7.7371736, 1.0884066, -18.381105, 7.5489955, 0.70905924, -18.139956, 8.584938, 1.0884066, -17.401766, 8.917934, 1.3767617, -17.385319, 7.7371736, 1.3767617, -17.385319, 7.7371736, 0.9570446, -16.389532, 7.9253516, 0.7210206, -16.640295, 7.1145396, 0.10500836, -16.057604, 7.9881487, 0.7210206, -16.640295, 7.1145396, 0.9570446, -16.389532, 7.9253516, 1.0884066, -17.401766, 8.917934, 0.9570446, -16.389532, 7.9253516, 1.3767617, -17.385319, 7.7371736, 0.03259921, -16.395086, 8.853001, 0.10500836, -16.057604, 7.9881487, 0.9570446, -16.389532, 7.9253516, 1.0884066, -17.401766, 8.917934, 0.7793324, -16.655033, 8.638763, 0.9570446, -16.389532, 7.9253516, 0.03259921, -16.395086, 8.853001, 0.9570446, -16.389532, 7.9253516, 0.7793324, -16.655033, 8.638763, -0.79465985, -18.10578, 6.6108794, -0.18462849, -18.712822, 7.4864116, 0.03259921, -18.353552, 6.115336, -0.79465985, -18.10578, 6.6108794, -1.3850405, -18.381105, 7.5489955, -0.18462849, -18.712822, 7.4864116, 0.03259921, -18.353552, 6.115336, -0.18462849, -18.712822, 7.4864116, 1.0884066, -18.381105, 7.5489955, 0.03259921, -18.353552, 6.115336, 1.0884066, -18.381105, 7.5489955, 0.7793324, -18.10578, 6.6108794, -0.18462849, -18.712822, 7.4864116, 0.70905924, -18.139956, 8.584938, 1.0884066, -18.381105, 7.5489955, -0.18462849, -18.712822, 7.4864116, -0.3294468, -18.408445, 8.982868, 0.70905924, -18.139956, 8.584938, -1.3850405, -18.381105, 7.5489955, -0.3294468, -18.408445, 8.982868, -0.18462849, -18.712822, 7.4864116, -1.3850405, -18.381105, 7.5489955, -1.1748617, -18.139956, 8.584938, -0.3294468, -18.408445, 8.982868, 2.6649618, -19.729753, 7.98815, 1.5668626, -19.439903, 7.791855, 2.6147668, -19.871582, 7.781175, 2.6649618, -19.729753, 7.98815, 1.6531556, -19.32627, 7.98815, 1.5668626, -19.439903, 7.791855, 1.6531556, -19.32627, 7.98815, 0.52835655, -18.340096, 7.9311194, 1.5668626, -19.439903, 7.791855, 1.6531556, -19.32627, 7.98815, 0.5697943, -18.34031, 7.9881496, 0.52835655, -18.340096, 7.9311194, 1.5668626, -19.439903, 7.791855, 0.52835655, -18.340096, 7.9311194, 0.46128738, -18.339455, 7.952906, 2.6147668, -19.871582, 7.781175, 1.5668626, -19.439903, 7.791855, 1.4271705, -19.62381, 7.8668275, 1.5668626, -19.439903, 7.791855, 0.46128738, -18.339455, 7.952906, 1.4271705, -19.62381, 7.8668275, 2.6147668, -19.871582, 7.781175, 1.4271705, -19.62381, 7.8668275, 2.5338137, -20.101198, 7.860206, 1.4271705, -19.62381, 7.8668275, 0.46128738, -18.339455, 7.952906, 0.46128738, -18.339455, 8.023394, 2.5338137, -20.101198, 7.860206, 1.4271705, -19.62381, 7.8668275, 1.4271705, -19.62381, 8.109472, 1.4271705, -19.62381, 7.8668275, 0.46128738, -18.339455, 8.023394, 1.4271705, -19.62381, 8.109472, 2.5338137, -20.101198, 7.860206, 1.4271705, -19.62381, 8.109472, 2.5338137, -20.101198, 8.116095, 1.4271705, -19.62381, 8.109472, 0.46128738, -18.339455, 8.023394, 0.52835655, -18.340096, 8.045179, 2.5338137, -20.101198, 8.116095, 1.4271705, -19.62381, 8.109472, 1.5668626, -19.439903, 8.184445, 1.4271705, -19.62381, 8.109472, 0.52835655, -18.340096, 8.045179, 1.5668626, -19.439903, 8.184445, 1.5668626, -19.439903, 8.184445, 0.52835655, -18.340096, 8.045179, 0.5697943, -18.34031, 7.9881496, 2.5338137, -20.101198, 8.116095, 1.5668626, -19.439903, 8.184445, 2.6147668, -19.871582, 8.195126, 1.5668626, -19.439903, 8.184445, 0.5697943, -18.34031, 7.9881496, 1.6531556, -19.32627, 7.98815, 2.6147668, -19.871582, 8.195126, 1.5668626, -19.439903, 8.184445, 1.6531556, -19.32627, 7.98815, 2.6147668, -19.871582, 8.195126, 1.6531556, -19.32627, 7.98815, 2.6649618, -19.729753, 7.98815, 1.5335416, -22.031042, 7.988151, 2.5325322, -19.973894, 8.213709, 1.9611616, -22.031042, 8.6124935, 1.5335416, -22.031042, 7.988151, 2.3712668, -19.944632, 7.98815, 2.5325322, -19.973894, 8.213709, 2.3712668, -19.944632, 7.98815, 2.613699, -17.907776, 8.087899, 2.5325322, -19.973894, 8.213709, 2.3712668, -19.944632, 7.98815, 2.5417168, -17.900085, 7.9881496, 2.613699, -17.907776, 8.087899, 2.5325322, -19.973894, 8.213709, 2.613699, -17.907776, 8.087899, 2.730536, -17.920164, 8.049879, 1.9611616, -22.031042, 8.6124935, 2.5325322, -19.973894, 8.213709, 2.7935472, -20.021313, 8.127628, 2.5325322, -19.973894, 8.213709, 2.730536, -17.920164, 8.049879, 2.7935472, -20.021313, 8.127628, 1.9611616, -22.031042, 8.6124935, 2.7935472, -20.021313, 8.127628, 2.652787, -22.031042, 8.373906, 2.7935472, -20.021313, 8.127628, 2.730536, -17.920164, 8.049879, 2.730536, -17.920164, 7.92642, 2.652787, -22.031042, 8.373906, 2.7935472, -20.021313, 8.127628, 2.7935472, -20.021313, 7.848672, 2.7935472, -20.021313, 8.127628, 2.730536, -17.920164, 7.92642, 2.7935472, -20.021313, 7.848672, 2.652787, -22.031042, 8.373906, 2.7935472, -20.021313, 7.848672, 2.652787, -22.031042, 7.6021824, 2.7935472, -20.021313, 7.848672, 2.730536, -17.920164, 7.92642, 2.613699, -17.907776, 7.8884, 2.652787, -22.031042, 7.6021824, 2.7935472, -20.021313, 7.848672, 2.5325322, -19.973894, 7.7623787, 2.7935472, -20.021313, 7.848672, 2.613699, -17.907776, 7.8884, 2.5325322, -19.973894, 7.7623787, 2.5325322, -19.973894, 7.7623787, 2.613699, -17.907776, 7.8884, 2.5417168, -17.900085, 7.9881496, 2.652787, -22.031042, 7.6021824, 2.5325322, -19.973894, 7.7623787, 1.9611616, -22.031042, 7.3638086, 2.5325322, -19.973894, 7.7623787, 2.5417168, -17.900085, 7.9881496, 2.3712668, -19.944632, 7.98815, 1.9611616, -22.031042, 7.3638086, 2.5325322, -19.973894, 7.7623787, 2.3712668, -19.944632, 7.98815, 1.9611616, -22.031042, 7.3638086, 2.3712668, -19.944632, 7.98815, 1.5335416, -22.031042, 7.988151, 7.7761884, 7.8527765, 15.352116, 9.199167, 8.88039, 16.222307, 9.098564, 7.4648857, 16.002731, 9.098564, 7.4648857, 16.002731, 9.199167, 8.88039, 16.222307, 10.9235325, 8.916273, 15.3749695, 9.098564, 7.4648857, 16.002731, 10.9235325, 8.916273, 15.3749695, 10.61574, 7.8335533, 15.204948, 7.7761884, 7.8527765, 15.352116, 7.562378, 8.858175, 15.848726, 9.199167, 8.88039, 16.222307, 7.2445464, 7.562926, 13.58247, 7.562378, 8.858175, 15.848726, 7.7761884, 7.8527765, 15.352116, 9.199167, 8.88039, 16.222307, 10.425425, 9.955207, 14.89032, 10.9235325, 8.916273, 15.3749695, 7.2445464, 7.562926, 13.58247, 7.1392436, 8.958778, 13.709131, 7.562378, 8.858175, 15.848726, 8.052368, 7.9555154, 11.936708, 7.1392436, 8.958778, 13.709131, 7.2445464, 7.562926, 13.58247, 7.562378, 8.858175, 15.848726, 9.38756, 10.309776, 15.220966, 9.199167, 8.88039, 16.222307, 9.199167, 8.88039, 16.222307, 9.38756, 10.309776, 15.220966, 10.425425, 9.955207, 14.89032, 7.1392436, 8.958778, 13.709131, 8.290742, 9.929361, 15.100925, 7.562378, 8.858175, 15.848726, 7.562378, 8.858175, 15.848726, 8.290742, 9.929361, 15.100925, 9.38756, 10.309776, 15.220966, 8.052368, 7.9555154, 11.936708, 7.8336453, 9.033964, 11.605206, 7.1392436, 8.958778, 13.709131, 7.8336453, 9.033964, 11.605206, 8.052368, 7.9555154, 11.936708, 9.536436, 7.534303, 11.340561, 7.1392436, 8.958778, 13.709131, 8.151478, 10.329214, 13.871677, 8.290742, 9.929361, 15.100925, 7.8336453, 9.033964, 11.605206, 8.151478, 10.329214, 13.871677, 7.1392436, 8.958778, 13.709131, 8.290742, 9.929361, 15.100925, 9.450357, 10.786097, 13.925932, 9.38756, 10.309776, 15.220966, 8.290742, 9.929361, 15.100925, 8.151478, 10.329214, 13.871677, 9.450357, 10.786097, 13.925932, 7.8336453, 9.033964, 11.605206, 8.411211, 10.007323, 12.5740795, 8.151478, 10.329214, 13.871677, 7.8336453, 9.033964, 11.605206, 9.536436, 7.534303, 11.340561, 9.549679, 8.935923, 11.339066, 8.411211, 10.007323, 12.5740795, 7.8336453, 9.033964, 11.605206, 9.549679, 8.935923, 11.339066, 9.549679, 8.935923, 11.339066, 9.536436, 7.534303, 11.340561, 10.884657, 7.817319, 12.306017, 8.151478, 10.329214, 13.871677, 8.411211, 10.007323, 12.5740795, 9.475134, 10.32366, 12.55806, 8.411211, 10.007323, 12.5740795, 9.549679, 8.935923, 11.339066, 9.475134, 10.32366, 12.55806, 8.151478, 10.329214, 13.871677, 9.475134, 10.32366, 12.55806, 9.450357, 10.786097, 13.925932, 9.549679, 8.935923, 11.339066, 10.884657, 7.817319, 12.306017, 11.177925, 8.823998, 12.293627, 9.475134, 10.32366, 12.55806, 9.549679, 8.935923, 11.339066, 11.177925, 8.823998, 12.293627, 11.39024, 7.4364767, 13.761036, 11.177925, 8.823998, 12.293627, 10.884657, 7.817319, 12.306017, 9.450357, 10.786097, 13.925932, 9.475134, 10.32366, 12.55806, 10.538631, 9.914196, 12.87995, 9.475134, 10.32366, 12.55806, 11.177925, 8.823998, 12.293627, 10.538631, 9.914196, 12.87995, 11.39024, 7.4364767, 13.761036, 11.609604, 8.857534, 13.852028, 11.177925, 8.823998, 12.293627, 11.609604, 8.857534, 13.852028, 10.538631, 9.914196, 12.87995, 11.177925, 8.823998, 12.293627, 10.61574, 7.8335533, 15.204948, 11.609604, 8.857534, 13.852028, 11.39024, 7.4364767, 13.761036, 10.61574, 7.8335533, 15.204948, 10.9235325, 8.916273, 15.3749695, 11.609604, 8.857534, 13.852028, 11.609604, 8.857534, 13.852028, 10.711004, 10.304009, 13.907562, 10.538631, 9.914196, 12.87995, 9.450357, 10.786097, 13.925932, 10.538631, 9.914196, 12.87995, 10.711004, 10.304009, 13.907562, 10.9235325, 8.916273, 15.3749695, 10.711004, 10.304009, 13.907562, 11.609604, 8.857534, 13.852028, 9.38756, 10.309776, 15.220966, 9.450357, 10.786097, 13.925932, 10.711004, 10.304009, 13.907562, 10.9235325, 8.916273, 15.3749695, 10.425425, 9.955207, 14.89032, 10.711004, 10.304009, 13.907562, 9.38756, 10.309776, 15.220966, 10.711004, 10.304009, 13.907562, 10.425425, 9.955207, 14.89032, 8.052368, 7.9555154, 11.936708, 9.298491, 7.030216, 13.635441, 9.536436, 7.534303, 11.340561, 8.052368, 7.9555154, 11.936708, 7.2445464, 7.562926, 13.58247, 9.298491, 7.030216, 13.635441, 9.536436, 7.534303, 11.340561, 9.298491, 7.030216, 13.635441, 11.39024, 7.4364767, 13.761036, 9.536436, 7.534303, 11.340561, 11.39024, 7.4364767, 13.761036, 10.884657, 7.817319, 12.306017, 9.298491, 7.030216, 13.635441, 10.61574, 7.8335533, 15.204948, 11.39024, 7.4364767, 13.761036, 9.298491, 7.030216, 13.635441, 9.098564, 7.4648857, 16.002731, 10.61574, 7.8335533, 15.204948, 7.2445464, 7.562926, 13.58247, 9.098564, 7.4648857, 16.002731, 9.298491, 7.030216, 13.635441, 7.2445464, 7.562926, 13.58247, 7.7761884, 7.8527765, 15.352116, 9.098564, 7.4648857, 16.002731, 5.392665, 7.074431, 14.52272, 6.3828983, 7.807067, 15.249163, 6.23808, 6.805727, 14.9206505, 6.23808, 6.805727, 14.9206505, 6.3828983, 7.807067, 15.249163, 7.6559334, 7.8126206, 14.855719, 6.23808, 6.805727, 14.9206505, 7.6559334, 7.8126206, 14.855719, 7.276586, 7.074431, 14.52272, 5.392665, 7.074431, 14.52272, 5.1824865, 7.8126206, 14.855719, 6.3828983, 7.807067, 15.249163, 5.1824865, 6.83328, 13.486778, 5.1824865, 7.8126206, 14.855719, 5.392665, 7.074431, 14.52272, 6.3828983, 7.807067, 15.249163, 7.3468595, 8.559354, 14.576548, 7.6559334, 7.8126206, 14.855719, 5.1824865, 6.83328, 13.486778, 5.111145, 7.829067, 13.674955, 5.1824865, 7.8126206, 14.855719, 5.772867, 7.108606, 12.548662, 5.111145, 7.829067, 13.674955, 5.1824865, 6.83328, 13.486778, 5.1824865, 7.8126206, 14.855719, 6.600126, 8.819301, 14.790783, 6.3828983, 7.807067, 15.249163, 6.3828983, 7.807067, 15.249163, 6.600126, 8.819301, 14.790783, 7.3468595, 8.559354, 14.576548, 5.111145, 7.829067, 13.674955, 5.772867, 8.559354, 14.576548, 5.1824865, 7.8126206, 14.855719, 5.1824865, 7.8126206, 14.855719, 5.772867, 8.559354, 14.576548, 6.600126, 8.819301, 14.790783, 5.772867, 7.108606, 12.548662, 5.7483034, 7.8455133, 12.49441, 5.111145, 7.829067, 13.674955, 5.7483034, 7.8455133, 12.49441, 5.772867, 7.108606, 12.548662, 6.600126, 6.8608336, 12.05312, 5.111145, 7.829067, 13.674955, 5.7483034, 8.824854, 13.863134, 5.772867, 8.559354, 14.576548, 5.7483034, 7.8455133, 12.49441, 5.7483034, 8.824854, 13.863134, 5.111145, 7.829067, 13.674955, 5.772867, 8.559354, 14.576548, 6.6725354, 9.156782, 13.925932, 6.600126, 8.819301, 14.790783, 5.772867, 8.559354, 14.576548, 5.7483034, 8.824854, 13.863134, 6.6725354, 9.156782, 13.925932, 5.7483034, 7.8455133, 12.49441, 6.02427, 8.574091, 13.052322, 5.7483034, 8.824854, 13.863134, 5.7483034, 7.8455133, 12.49441, 6.600126, 6.8608336, 12.05312, 6.6725354, 7.8510666, 12.100964, 6.02427, 8.574091, 13.052322, 5.7483034, 7.8455133, 12.49441, 6.6725354, 7.8510666, 12.100964, 6.6725354, 7.8510666, 12.100964, 6.600126, 6.8608336, 12.05312, 7.3468595, 7.108606, 12.548662, 5.7483034, 8.824854, 13.863134, 6.02427, 8.574091, 13.052322, 6.6725354, 8.830407, 12.935699, 6.02427, 8.574091, 13.052322, 6.6725354, 7.8510666, 12.100964, 6.6725354, 8.830407, 12.935699, 5.7483034, 8.824854, 13.863134, 6.6725354, 8.830407, 12.935699, 6.6725354, 9.156782, 13.925932, 6.6725354, 7.8510666, 12.100964, 7.3468595, 7.108606, 12.548662, 7.5245714, 7.8455133, 12.49441, 6.6725354, 8.830407, 12.935699, 6.6725354, 7.8510666, 12.100964, 7.5245714, 7.8455133, 12.49441, 7.6559334, 6.83328, 13.486778, 7.5245714, 7.8455133, 12.49441, 7.3468595, 7.108606, 12.548662, 6.6725354, 9.156782, 13.925932, 6.6725354, 8.830407, 12.935699, 7.2885475, 8.574091, 13.052322, 6.6725354, 8.830407, 12.935699, 7.5245714, 7.8455133, 12.49441, 7.2885475, 8.574091, 13.052322, 7.6559334, 6.83328, 13.486778, 7.9442887, 7.829067, 13.674955, 7.5245714, 7.8455133, 12.49441, 7.9442887, 7.829067, 13.674955, 7.2885475, 8.574091, 13.052322, 7.5245714, 7.8455133, 12.49441, 7.276586, 7.074431, 14.52272, 7.9442887, 7.829067, 13.674955, 7.6559334, 6.83328, 13.486778, 7.276586, 7.074431, 14.52272, 7.6559334, 7.8126206, 14.855719, 7.9442887, 7.829067, 13.674955, 7.9442887, 7.829067, 13.674955, 7.5245714, 8.824854, 13.863134, 7.2885475, 8.574091, 13.052322, 6.6725354, 9.156782, 13.925932, 7.2885475, 8.574091, 13.052322, 7.5245714, 8.824854, 13.863134, 7.6559334, 7.8126206, 14.855719, 7.5245714, 8.824854, 13.863134, 7.9442887, 7.829067, 13.674955, 6.600126, 8.819301, 14.790783, 6.6725354, 9.156782, 13.925932, 7.5245714, 8.824854, 13.863134, 7.6559334, 7.8126206, 14.855719, 7.3468595, 8.559354, 14.576548, 7.5245714, 8.824854, 13.863134, 6.600126, 8.819301, 14.790783, 7.5245714, 8.824854, 13.863134, 7.3468595, 8.559354, 14.576548, 5.772867, 7.108606, 12.548662, 6.3828983, 6.5013514, 13.424194, 6.600126, 6.8608336, 12.05312, 5.772867, 7.108606, 12.548662, 5.1824865, 6.83328, 13.486778, 6.3828983, 6.5013514, 13.424194, 6.600126, 6.8608336, 12.05312, 6.3828983, 6.5013514, 13.424194, 7.6559334, 6.83328, 13.486778, 6.600126, 6.8608336, 12.05312, 7.6559334, 6.83328, 13.486778, 7.3468595, 7.108606, 12.548662, 6.3828983, 6.5013514, 13.424194, 7.276586, 7.074431, 14.52272, 7.6559334, 6.83328, 13.486778, 6.3828983, 6.5013514, 13.424194, 6.23808, 6.805727, 14.9206505, 7.276586, 7.074431, 14.52272, 5.1824865, 6.83328, 13.486778, 6.23808, 6.805727, 14.9206505, 6.3828983, 6.5013514, 13.424194, 5.1824865, 6.83328, 13.486778, 5.392665, 7.074431, 14.52272, 6.23808, 6.805727, 14.9206505, 9.232489, 5.4846325, 13.925934, 8.13439, 5.7744827, 13.729637, 9.182293, 5.342804, 13.718958, 9.232489, 5.4846325, 13.925934, 8.220682, 5.8879023, 13.925932, 8.13439, 5.7744827, 13.729637, 8.220682, 5.8879023, 13.925932, 7.0958834, 6.874291, 13.868902, 8.13439, 5.7744827, 13.729637, 8.220682, 5.8879023, 13.925932, 7.137321, 6.8738637, 13.925932, 7.0958834, 6.874291, 13.868902, 8.13439, 5.7744827, 13.729637, 7.0958834, 6.874291, 13.868902, 7.0288143, 6.874932, 13.89069, 9.182293, 5.342804, 13.718958, 8.13439, 5.7744827, 13.729637, 7.994697, 5.590576, 13.804609, 8.13439, 5.7744827, 13.729637, 7.0288143, 6.874932, 13.89069, 7.994697, 5.590576, 13.804609, 9.182293, 5.342804, 13.718958, 7.994697, 5.590576, 13.804609, 9.101341, 5.1134014, 13.797989, 7.994697, 5.590576, 13.804609, 7.0288143, 6.874932, 13.89069, 7.0288143, 6.874932, 13.961176, 9.101341, 5.1134014, 13.797989, 7.994697, 5.590576, 13.804609, 7.994697, 5.590576, 14.047256, 7.994697, 5.590576, 13.804609, 7.0288143, 6.874932, 13.961176, 7.994697, 5.590576, 14.047256, 9.101341, 5.1134014, 13.797989, 7.994697, 5.590576, 14.047256, 9.101341, 5.113402, 14.053877, 7.994697, 5.590576, 14.047256, 7.0288143, 6.874932, 13.961176, 7.0958834, 6.874291, 13.982964, 9.101341, 5.113402, 14.053877, 7.994697, 5.590576, 14.047256, 8.13439, 5.7744827, 14.122229, 7.994697, 5.590576, 14.047256, 7.0958834, 6.874291, 13.982964, 8.13439, 5.7744827, 14.122229, 8.13439, 5.7744827, 14.122229, 7.0958834, 6.874291, 13.982964, 7.137321, 6.8738637, 13.925932, 9.101341, 5.113402, 14.053877, 8.13439, 5.7744827, 14.122229, 9.182293, 5.3428044, 14.132908, 8.13439, 5.7744827, 14.122229, 7.137321, 6.8738637, 13.925932, 8.220682, 5.8879023, 13.925932, 9.182293, 5.3428044, 14.132908, 8.13439, 5.7744827, 14.122229, 8.220682, 5.8879023, 13.925932, 9.182293, 5.3428044, 14.132908, 8.220682, 5.8879023, 13.925932, 9.232489, 5.4846325, 13.925934, 8.1010685, 3.1833441, 13.925934, 9.1000595, 5.240492, 14.151705, 8.528688, 3.1833444, 14.550276, 8.1010685, 3.1833441, 13.925934, 8.938793, 5.2697544, 13.925934, 9.1000595, 5.240492, 14.151705, 8.938793, 5.2697544, 13.925934, 9.181226, 7.30661, 14.025682, 9.1000595, 5.240492, 14.151705, 8.938793, 5.2697544, 13.925934, 9.109243, 7.314086, 13.925932, 9.181226, 7.30661, 14.025682, 9.1000595, 5.240492, 14.151705, 9.181226, 7.30661, 14.025682, 9.298063, 7.2942214, 13.987661, 8.528688, 3.1833444, 14.550276, 9.1000595, 5.240492, 14.151705, 9.361288, 5.1928596, 14.0654125, 9.1000595, 5.240492, 14.151705, 9.298063, 7.2942214, 13.987661, 9.361288, 5.1928596, 14.0654125, 8.528688, 3.1833444, 14.550276, 9.361288, 5.1928596, 14.0654125, 9.220314, 3.1833444, 14.311903, 9.361288, 5.1928596, 14.0654125, 9.298063, 7.2942214, 13.987661, 9.298063, 7.2942214, 13.8642025, 9.220314, 3.1833444, 14.311903, 9.361288, 5.1928596, 14.0654125, 9.361074, 5.1928596, 13.786455, 9.361288, 5.1928596, 14.0654125, 9.298063, 7.2942214, 13.8642025, 9.361074, 5.1928596, 13.786455, 9.220314, 3.1833444, 14.311903, 9.361074, 5.1928596, 13.786455, 9.220314, 3.1833441, 13.539965, 9.361074, 5.1928596, 13.786455, 9.298063, 7.2942214, 13.8642025, 9.181226, 7.30661, 13.826183, 9.220314, 3.1833441, 13.539965, 9.361074, 5.1928596, 13.786455, 9.1000595, 5.240492, 13.700161, 9.361074, 5.1928596, 13.786455, 9.181226, 7.30661, 13.826183, 9.1000595, 5.240492, 13.700161, 9.1000595, 5.240492, 13.700161, 9.181226, 7.30661, 13.826183, 9.109243, 7.314086, 13.925932, 9.220314, 3.1833441, 13.539965, 9.1000595, 5.240492, 13.700161, 8.528688, 3.183344, 13.301592, 9.1000595, 5.240492, 13.700161, 9.109243, 7.314086, 13.925932, 8.938793, 5.2697544, 13.925934, 8.528688, 3.183344, 13.301592, 9.1000595, 5.240492, 13.700161, 8.938793, 5.2697544, 13.925934, 8.528688, 3.183344, 13.301592, 8.938793, 5.2697544, 13.925934, 8.1010685, 3.1833441, 13.925934, -21.010672, 7.8103647, 2.1272998, -19.587692, 8.837978, 2.9974916, -19.688295, 7.422474, 2.7779148, -19.688295, 7.422474, 2.7779148, -19.587692, 8.837978, 2.9974916, -17.863327, 8.873861, 2.1501544, -19.688295, 7.422474, 2.7779148, -17.863327, 8.873861, 2.1501544, -18.17112, 7.7911415, 1.9801317, -21.010672, 7.8103647, 2.1272998, -21.224482, 8.815763, 2.6239111, -19.587692, 8.837978, 2.9974916, -21.542313, 7.520514, 0.35765326, -21.224482, 8.815763, 2.6239111, -21.010672, 7.8103647, 2.1272998, -19.587692, 8.837978, 2.9974916, -18.361435, 9.912795, 1.6655035, -17.863327, 8.873861, 2.1501544, -21.542313, 7.520514, 0.35765326, -21.647615, 8.916367, 0.4843155, -21.224482, 8.815763, 2.6239111, -20.734491, 7.9131036, -1.2881074, -21.647615, 8.916367, 0.4843155, -21.542313, 7.520514, 0.35765326, -21.224482, 8.815763, 2.6239111, -19.3993, 10.2673645, 1.9961507, -19.587692, 8.837978, 2.9974916, -19.587692, 8.837978, 2.9974916, -19.3993, 10.2673645, 1.9961507, -18.361435, 9.912795, 1.6655035, -21.647615, 8.916367, 0.4843155, -20.496117, 9.88695, 1.8761096, -21.224482, 8.815763, 2.6239111, -21.224482, 8.815763, 2.6239111, -20.496117, 9.88695, 1.8761096, -19.3993, 10.2673645, 1.9961507, -20.734491, 7.9131036, -1.2881074, -20.953215, 8.991552, -1.6196096, -21.647615, 8.916367, 0.4843155, -20.953215, 8.991552, -1.6196096, -20.734491, 7.9131036, -1.2881074, -19.250423, 7.4918914, -1.8842552, -21.647615, 8.916367, 0.4843155, -20.635382, 10.286802, 0.6468619, -20.496117, 9.88695, 1.8761096, -20.953215, 8.991552, -1.6196096, -20.635382, 10.286802, 0.6468619, -21.647615, 8.916367, 0.4843155, -20.496117, 9.88695, 1.8761096, -19.336502, 10.743685, 0.70111525, -19.3993, 10.2673645, 1.9961507, -20.496117, 9.88695, 1.8761096, -20.635382, 10.286802, 0.6468619, -19.336502, 10.743685, 0.70111525, -20.953215, 8.991552, -1.6196096, -20.375648, 9.964911, -0.65073633, -20.635382, 10.286802, 0.6468619, -20.953215, 8.991552, -1.6196096, -19.250423, 7.4918914, -1.8842552, -19.23718, 8.893511, -1.885751, -20.375648, 9.964911, -0.65073633, -20.953215, 8.991552, -1.6196096, -19.23718, 8.893511, -1.885751, -19.23718, 8.893511, -1.885751, -19.250423, 7.4918914, -1.8842552, -17.902203, 7.774907, -0.91879916, -20.635382, 10.286802, 0.6468619, -20.375648, 9.964911, -0.65073633, -19.311726, 10.281248, -0.66675615, -20.375648, 9.964911, -0.65073633, -19.23718, 8.893511, -1.885751, -19.311726, 10.281248, -0.66675615, -20.635382, 10.286802, 0.6468619, -19.311726, 10.281248, -0.66675615, -19.336502, 10.743685, 0.70111525, -19.23718, 8.893511, -1.885751, -17.902203, 7.774907, -0.91879916, -17.608934, 8.781587, -0.9311881, -19.311726, 10.281248, -0.66675615, -19.23718, 8.893511, -1.885751, -17.608934, 8.781587, -0.9311881, -17.39662, 7.394065, 0.53621995, -17.608934, 8.781587, -0.9311881, -17.902203, 7.774907, -0.91879916, -19.336502, 10.743685, 0.70111525, -19.311726, 10.281248, -0.66675615, -18.248228, 9.871784, -0.34486628, -19.311726, 10.281248, -0.66675615, -17.608934, 8.781587, -0.9311881, -18.248228, 9.871784, -0.34486628, -17.39662, 7.394065, 0.53621995, -17.177256, 8.815123, 0.6272116, -17.608934, 8.781587, -0.9311881, -17.177256, 8.815123, 0.6272116, -18.248228, 9.871784, -0.34486628, -17.608934, 8.781587, -0.9311881, -18.17112, 7.7911415, 1.9801317, -17.177256, 8.815123, 0.6272116, -17.39662, 7.394065, 0.53621995, -18.17112, 7.7911415, 1.9801317, -17.863327, 8.873861, 2.1501544, -17.177256, 8.815123, 0.6272116, -17.177256, 8.815123, 0.6272116, -18.075855, 10.261598, 0.6827462, -18.248228, 9.871784, -0.34486628, -19.336502, 10.743685, 0.70111525, -18.248228, 9.871784, -0.34486628, -18.075855, 10.261598, 0.6827462, -17.863327, 8.873861, 2.1501544, -18.075855, 10.261598, 0.6827462, -17.177256, 8.815123, 0.6272116, -19.3993, 10.2673645, 1.9961507, -19.336502, 10.743685, 0.70111525, -18.075855, 10.261598, 0.6827462, -17.863327, 8.873861, 2.1501544, -18.361435, 9.912795, 1.6655035, -18.075855, 10.261598, 0.6827462, -19.3993, 10.2673645, 1.9961507, -18.075855, 10.261598, 0.6827462, -18.361435, 9.912795, 1.6655035, -20.734491, 7.9131036, -1.2881074, -19.488369, 6.9878044, 0.41062546, -19.250423, 7.4918914, -1.8842552, -20.734491, 7.9131036, -1.2881074, -21.542313, 7.520514, 0.35765326, -19.488369, 6.9878044, 0.41062546, -19.250423, 7.4918914, -1.8842552, -19.488369, 6.9878044, 0.41062546, -17.39662, 7.394065, 0.53621995, -19.250423, 7.4918914, -1.8842552, -17.39662, 7.394065, 0.53621995, -17.902203, 7.774907, -0.91879916, -19.488369, 6.9878044, 0.41062546, -18.17112, 7.7911415, 1.9801317, -17.39662, 7.394065, 0.53621995, -19.488369, 6.9878044, 0.41062546, -19.688295, 7.422474, 2.7779148, -18.17112, 7.7911415, 1.9801317, -21.542313, 7.520514, 0.35765326, -19.688295, 7.422474, 2.7779148, -19.488369, 6.9878044, 0.41062546, -21.542313, 7.520514, 0.35765326, -21.010672, 7.8103647, 2.1272998, -19.688295, 7.422474, 2.7779148, -23.394194, 7.032019, 1.297905, -22.403961, 7.764655, 2.0243464, -22.54878, 6.763315, 1.6958355, -22.54878, 6.763315, 1.6958355, -22.403961, 7.764655, 2.0243464, -21.130926, 7.770209, 1.6309018, -22.54878, 6.763315, 1.6958355, -21.130926, 7.770209, 1.6309018, -21.510273, 7.032019, 1.297905, -23.394194, 7.032019, 1.297905, -23.604374, 7.770209, 1.6309018, -22.403961, 7.764655, 2.0243464, -23.604374, 6.7908683, 0.2619624, -23.604374, 7.770209, 1.6309018, -23.394194, 7.032019, 1.297905, -22.403961, 7.764655, 2.0243464, -21.44, 8.516942, 1.3517308, -21.130926, 7.770209, 1.6309018, -23.604374, 6.7908683, 0.2619624, -23.675714, 7.7866554, 0.45014048, -23.604374, 7.770209, 1.6309018, -23.013992, 7.066194, -0.6761534, -23.675714, 7.7866554, 0.45014048, -23.604374, 6.7908683, 0.2619624, -23.604374, 7.770209, 1.6309018, -22.186733, 8.776889, 1.5659679, -22.403961, 7.764655, 2.0243464, -22.403961, 7.764655, 2.0243464, -22.186733, 8.776889, 1.5659679, -21.44, 8.516942, 1.3517308, -23.675714, 7.7866554, 0.45014048, -23.013992, 8.516942, 1.3517308, -23.604374, 7.770209, 1.6309018, -23.604374, 7.770209, 1.6309018, -23.013992, 8.516942, 1.3517308, -22.186733, 8.776889, 1.5659679, -23.013992, 7.066194, -0.6761534, -23.038557, 7.8031015, -0.73040724, -23.675714, 7.7866554, 0.45014048, -23.038557, 7.8031015, -0.73040724, -23.013992, 7.066194, -0.6761534, -22.186733, 6.818422, -1.1716971, -23.675714, 7.7866554, 0.45014048, -23.038557, 8.782442, 0.63831854, -23.013992, 8.516942, 1.3517308, -23.038557, 7.8031015, -0.73040724, -23.038557, 8.782442, 0.63831854, -23.675714, 7.7866554, 0.45014048, -23.013992, 8.516942, 1.3517308, -22.114325, 9.11437, 0.70111585, -22.186733, 8.776889, 1.5659679, -23.013992, 8.516942, 1.3517308, -23.038557, 8.782442, 0.63831854, -22.114325, 9.11437, 0.70111585, -23.038557, 7.8031015, -0.73040724, -22.76259, 8.531679, -0.17249346, -23.038557, 8.782442, 0.63831854, -23.038557, 7.8031015, -0.73040724, -22.186733, 6.818422, -1.1716971, -22.114325, 7.808655, -1.1238518, -22.76259, 8.531679, -0.17249346, -23.038557, 7.8031015, -0.73040724, -22.114325, 7.808655, -1.1238518, -22.114325, 7.808655, -1.1238518, -22.186733, 6.818422, -1.1716971, -21.44, 7.066194, -0.6761534, -23.038557, 8.782442, 0.63831854, -22.76259, 8.531679, -0.17249346, -22.114325, 8.787995, -0.28911734, -22.76259, 8.531679, -0.17249346, -22.114325, 7.808655, -1.1238518, -22.114325, 8.787995, -0.28911734, -23.038557, 8.782442, 0.63831854, -22.114325, 8.787995, -0.28911734, -22.114325, 9.11437, 0.70111585, -22.114325, 7.808655, -1.1238518, -21.44, 7.066194, -0.6761534, -21.262287, 7.8031015, -0.73040724, -22.114325, 8.787995, -0.28911734, -22.114325, 7.808655, -1.1238518, -21.262287, 7.8031015, -0.73040724, -21.130926, 6.7908683, 0.2619624, -21.262287, 7.8031015, -0.73040724, -21.44, 7.066194, -0.6761534, -22.114325, 9.11437, 0.70111585, -22.114325, 8.787995, -0.28911734, -21.498312, 8.531679, -0.17249346, -22.114325, 8.787995, -0.28911734, -21.262287, 7.8031015, -0.73040724, -21.498312, 8.531679, -0.17249346, -21.130926, 6.7908683, 0.2619624, -20.842571, 7.7866554, 0.45014048, -21.262287, 7.8031015, -0.73040724, -20.842571, 7.7866554, 0.45014048, -21.498312, 8.531679, -0.17249346, -21.262287, 7.8031015, -0.73040724, -21.510273, 7.032019, 1.297905, -20.842571, 7.7866554, 0.45014048, -21.130926, 6.7908683, 0.2619624, -21.510273, 7.032019, 1.297905, -21.130926, 7.770209, 1.6309018, -20.842571, 7.7866554, 0.45014048, -20.842571, 7.7866554, 0.45014048, -21.262287, 8.782442, 0.63831854, -21.498312, 8.531679, -0.17249346, -22.114325, 9.11437, 0.70111585, -21.498312, 8.531679, -0.17249346, -21.262287, 8.782442, 0.63831854, -21.130926, 7.770209, 1.6309018, -21.262287, 8.782442, 0.63831854, -20.842571, 7.7866554, 0.45014048, -22.186733, 8.776889, 1.5659679, -22.114325, 9.11437, 0.70111585, -21.262287, 8.782442, 0.63831854, -21.130926, 7.770209, 1.6309018, -21.44, 8.516942, 1.3517308, -21.262287, 8.782442, 0.63831854, -22.186733, 8.776889, 1.5659679, -21.262287, 8.782442, 0.63831854, -21.44, 8.516942, 1.3517308, -23.013992, 7.066194, -0.6761534, -22.403961, 6.4589396, 0.19937873, -22.186733, 6.818422, -1.1716971, -23.013992, 7.066194, -0.6761534, -23.604374, 6.7908683, 0.2619624, -22.403961, 6.4589396, 0.19937873, -22.186733, 6.818422, -1.1716971, -22.403961, 6.4589396, 0.19937873, -21.130926, 6.7908683, 0.2619624, -22.186733, 6.818422, -1.1716971, -21.130926, 6.7908683, 0.2619624, -21.44, 7.066194, -0.6761534, -22.403961, 6.4589396, 0.19937873, -21.510273, 7.032019, 1.297905, -21.130926, 6.7908683, 0.2619624, -22.403961, 6.4589396, 0.19937873, -22.54878, 6.763315, 1.6958355, -21.510273, 7.032019, 1.297905, -23.604374, 6.7908683, 0.2619624, -22.54878, 6.763315, 1.6958355, -22.403961, 6.4589396, 0.19937873, -23.604374, 6.7908683, 0.2619624, -23.394194, 7.032019, 1.297905, -22.54878, 6.763315, 1.6958355, -19.55437, 5.4422207, 0.70111716, -20.65247, 5.732071, 0.5048219, -19.604567, 5.300392, 0.49414217, -19.55437, 5.4422207, 0.70111716, -20.566177, 5.8454905, 0.70111704, -20.65247, 5.732071, 0.5048219, -20.566177, 5.8454905, 0.70111704, -21.690977, 6.831879, 0.64408636, -20.65247, 5.732071, 0.5048219, -20.566177, 5.8454905, 0.70111704, -21.649538, 6.831452, 0.7011167, -21.690977, 6.831879, 0.64408636, -20.65247, 5.732071, 0.5048219, -21.690977, 6.831879, 0.64408636, -21.758045, 6.83252, 0.66587317, -19.604567, 5.300392, 0.49414217, -20.65247, 5.732071, 0.5048219, -20.792162, 5.5481644, 0.5797943, -20.65247, 5.732071, 0.5048219, -21.758045, 6.83252, 0.66587317, -20.792162, 5.5481644, 0.5797943, -19.604567, 5.300392, 0.49414217, -20.792162, 5.5481644, 0.5797943, -19.685518, 5.0709896, 0.57317305, -20.792162, 5.5481644, 0.5797943, -21.758045, 6.83252, 0.66587317, -21.758045, 6.83252, 0.7363601, -19.685518, 5.0709896, 0.57317305, -20.792162, 5.5481644, 0.5797943, -20.792162, 5.5481644, 0.8224399, -20.792162, 5.5481644, 0.5797943, -21.758045, 6.83252, 0.7363601, -20.792162, 5.5481644, 0.8224399, -19.685518, 5.0709896, 0.57317305, -20.792162, 5.5481644, 0.8224399, -19.685518, 5.07099, 0.8290615, -20.792162, 5.5481644, 0.8224399, -21.758045, 6.83252, 0.7363601, -21.690977, 6.831879, 0.7581469, -19.685518, 5.07099, 0.8290615, -20.792162, 5.5481644, 0.8224399, -20.65247, 5.732071, 0.8974122, -20.792162, 5.5481644, 0.8224399, -21.690977, 6.831879, 0.7581469, -20.65247, 5.732071, 0.8974122, -20.65247, 5.732071, 0.8974122, -21.690977, 6.831879, 0.7581469, -21.649538, 6.831452, 0.7011167, -19.685518, 5.07099, 0.8290615, -20.65247, 5.732071, 0.8974122, -19.604567, 5.3003926, 0.90809214, -20.65247, 5.732071, 0.8974122, -21.649538, 6.831452, 0.7011167, -20.566177, 5.8454905, 0.70111704, -19.604567, 5.3003926, 0.90809214, -20.65247, 5.732071, 0.8974122, -20.566177, 5.8454905, 0.70111704, -19.604567, 5.3003926, 0.90809214, -20.566177, 5.8454905, 0.70111704, -19.55437, 5.4422207, 0.70111716, -20.685791, 3.1409323, 0.701118, -19.6868, 5.19808, 0.9268887, -20.258171, 3.1409326, 1.3254604, -20.685791, 3.1409323, 0.701118, -19.848066, 5.2273426, 0.70111716, -19.6868, 5.19808, 0.9268887, -19.848066, 5.2273426, 0.70111716, -19.605635, 7.2641983, 0.800866, -19.6868, 5.19808, 0.9268887, -19.848066, 5.2273426, 0.70111716, -19.677616, 7.271674, 0.70111644, -19.605635, 7.2641983, 0.800866, -19.6868, 5.19808, 0.9268887, -19.605635, 7.2641983, 0.800866, -19.488796, 7.2518096, 0.7628459, -20.258171, 3.1409326, 1.3254604, -19.6868, 5.19808, 0.9268887, -19.425571, 5.150448, 0.8405957, -19.6868, 5.19808, 0.9268887, -19.488796, 7.2518096, 0.7628459, -19.425571, 5.150448, 0.8405957, -20.258171, 3.1409326, 1.3254604, -19.425571, 5.150448, 0.8405957, -19.566545, 3.1409326, 1.0870868, -19.425571, 5.150448, 0.8405957, -19.488796, 7.2518096, 0.7628459, -19.488796, 7.2518096, 0.63938713, -19.566545, 3.1409326, 1.0870868, -19.425571, 5.150448, 0.8405957, -19.425785, 5.150448, 0.5616387, -19.425571, 5.150448, 0.8405957, -19.488796, 7.2518096, 0.63938713, -19.425785, 5.150448, 0.5616387, -19.566545, 3.1409326, 1.0870868, -19.425785, 5.150448, 0.5616387, -19.566545, 3.1409323, 0.3151492, -19.425785, 5.150448, 0.5616387, -19.488796, 7.2518096, 0.63938713, -19.605635, 7.2641983, 0.601367, -19.566545, 3.1409323, 0.3151492, -19.425785, 5.150448, 0.5616387, -19.6868, 5.19808, 0.47534573, -19.425785, 5.150448, 0.5616387, -19.605635, 7.2641983, 0.601367, -19.6868, 5.19808, 0.47534573, -19.6868, 5.19808, 0.47534573, -19.605635, 7.2641983, 0.601367, -19.677616, 7.271674, 0.70111644, -19.566545, 3.1409323, 0.3151492, -19.6868, 5.19808, 0.47534573, -20.258171, 3.140932, 0.07677555, -19.6868, 5.19808, 0.47534573, -19.677616, 7.271674, 0.70111644, -19.848066, 5.2273426, 0.70111716, -20.258171, 3.140932, 0.07677555, -19.6868, 5.19808, 0.47534573, -19.848066, 5.2273426, 0.70111716, -20.258171, 3.140932, 0.07677555, -19.848066, 5.2273426, 0.70111716, -20.685791, 3.1409323, 0.701118, -9.178474, 7.896264, -9.667162, -7.7554946, 8.923878, -8.79697, -7.8560977, 7.5083733, -9.016546, -7.8560977, 7.5083733, -9.016546, -7.7554946, 8.923878, -8.79697, -6.0311303, 8.959761, -9.644308, -7.8560977, 7.5083733, -9.016546, -6.0311303, 8.959761, -9.644308, -6.338922, 7.877041, -9.814329, -9.178474, 7.896264, -9.667162, -9.392284, 8.901663, -9.170551, -7.7554946, 8.923878, -8.79697, -9.710115, 7.6064134, -11.436808, -9.392284, 8.901663, -9.170551, -9.178474, 7.896264, -9.667162, -7.7554946, 8.923878, -8.79697, -6.5292373, 9.998694, -10.128958, -6.0311303, 8.959761, -9.644308, -9.710115, 7.6064134, -11.436808, -9.815418, 9.002266, -11.310146, -9.392284, 8.901663, -9.170551, -8.902294, 7.999003, -13.082569, -9.815418, 9.002266, -11.310146, -9.710115, 7.6064134, -11.436808, -9.392284, 8.901663, -9.170551, -7.567102, 10.353264, -9.798311, -7.7554946, 8.923878, -8.79697, -7.7554946, 8.923878, -8.79697, -7.567102, 10.353264, -9.798311, -6.5292373, 9.998694, -10.128958, -9.815418, 9.002266, -11.310146, -8.663919, 9.972849, -9.918352, -9.392284, 8.901663, -9.170551, -9.392284, 8.901663, -9.170551, -8.663919, 9.972849, -9.918352, -7.567102, 10.353264, -9.798311, -8.902294, 7.999003, -13.082569, -9.121016, 9.077452, -13.414072, -9.815418, 9.002266, -11.310146, -9.121016, 9.077452, -13.414072, -8.902294, 7.999003, -13.082569, -7.418226, 7.5777907, -13.678717, -9.815418, 9.002266, -11.310146, -8.8031845, 10.372702, -11.1476, -8.663919, 9.972849, -9.918352, -9.121016, 9.077452, -13.414072, -8.8031845, 10.372702, -11.1476, -9.815418, 9.002266, -11.310146, -8.663919, 9.972849, -9.918352, -7.5043044, 10.829584, -11.093346, -7.567102, 10.353264, -9.798311, -8.663919, 9.972849, -9.918352, -8.8031845, 10.372702, -11.1476, -7.5043044, 10.829584, -11.093346, -9.121016, 9.077452, -13.414072, -8.543451, 10.050811, -12.445198, -8.8031845, 10.372702, -11.1476, -9.121016, 9.077452, -13.414072, -7.418226, 7.5777907, -13.678717, -7.404982, 8.97941, -13.680212, -8.543451, 10.050811, -12.445198, -9.121016, 9.077452, -13.414072, -7.404982, 8.97941, -13.680212, -7.404982, 8.97941, -13.680212, -7.418226, 7.5777907, -13.678717, -6.070005, 7.8608065, -12.713261, -8.8031845, 10.372702, -11.1476, -8.543451, 10.050811, -12.445198, -7.479528, 10.367147, -12.461218, -8.543451, 10.050811, -12.445198, -7.404982, 8.97941, -13.680212, -7.479528, 10.367147, -12.461218, -8.8031845, 10.372702, -11.1476, -7.479528, 10.367147, -12.461218, -7.5043044, 10.829584, -11.093346, -7.404982, 8.97941, -13.680212, -6.070005, 7.8608065, -12.713261, -5.7767367, 8.867486, -12.725651, -7.479528, 10.367147, -12.461218, -7.404982, 8.97941, -13.680212, -5.7767367, 8.867486, -12.725651, -5.564422, 7.4799643, -11.258242, -5.7767367, 8.867486, -12.725651, -6.070005, 7.8608065, -12.713261, -7.5043044, 10.829584, -11.093346, -7.479528, 10.367147, -12.461218, -6.4160304, 9.957684, -12.139328, -7.479528, 10.367147, -12.461218, -5.7767367, 8.867486, -12.725651, -6.4160304, 9.957684, -12.139328, -5.564422, 7.4799643, -11.258242, -5.345058, 8.901022, -11.16725, -5.7767367, 8.867486, -12.725651, -5.345058, 8.901022, -11.16725, -6.4160304, 9.957684, -12.139328, -5.7767367, 8.867486, -12.725651, -6.338922, 7.877041, -9.814329, -5.345058, 8.901022, -11.16725, -5.564422, 7.4799643, -11.258242, -6.338922, 7.877041, -9.814329, -6.0311303, 8.959761, -9.644308, -5.345058, 8.901022, -11.16725, -5.345058, 8.901022, -11.16725, -6.2436585, 10.347497, -11.111715, -6.4160304, 9.957684, -12.139328, -7.5043044, 10.829584, -11.093346, -6.4160304, 9.957684, -12.139328, -6.2436585, 10.347497, -11.111715, -6.0311303, 8.959761, -9.644308, -6.2436585, 10.347497, -11.111715, -5.345058, 8.901022, -11.16725, -7.567102, 10.353264, -9.798311, -7.5043044, 10.829584, -11.093346, -6.2436585, 10.347497, -11.111715, -6.0311303, 8.959761, -9.644308, -6.5292373, 9.998694, -10.128958, -6.2436585, 10.347497, -11.111715, -7.567102, 10.353264, -9.798311, -6.2436585, 10.347497, -11.111715, -6.5292373, 9.998694, -10.128958, -8.902294, 7.999003, -13.082569, -7.6561713, 7.073704, -11.383837, -7.418226, 7.5777907, -13.678717, -8.902294, 7.999003, -13.082569, -9.710115, 7.6064134, -11.436808, -7.6561713, 7.073704, -11.383837, -7.418226, 7.5777907, -13.678717, -7.6561713, 7.073704, -11.383837, -5.564422, 7.4799643, -11.258242, -7.418226, 7.5777907, -13.678717, -5.564422, 7.4799643, -11.258242, -6.070005, 7.8608065, -12.713261, -7.6561713, 7.073704, -11.383837, -6.338922, 7.877041, -9.814329, -5.564422, 7.4799643, -11.258242, -7.6561713, 7.073704, -11.383837, -7.8560977, 7.5083733, -9.016546, -6.338922, 7.877041, -9.814329, -9.710115, 7.6064134, -11.436808, -7.8560977, 7.5083733, -9.016546, -7.6561713, 7.073704, -11.383837, -9.710115, 7.6064134, -11.436808, -9.178474, 7.896264, -9.667162, -7.8560977, 7.5083733, -9.016546, -11.561996, 7.1179185, -10.496557, -10.571764, 7.8505545, -9.770115, -10.716581, 6.8492146, -10.098627, -10.716581, 6.8492146, -10.098627, -10.571764, 7.8505545, -9.770115, -9.298729, 7.856108, -10.163559, -10.716581, 6.8492146, -10.098627, -9.298729, 7.856108, -10.163559, -9.678076, 7.1179185, -10.496557, -11.561996, 7.1179185, -10.496557, -11.772175, 7.856108, -10.163559, -10.571764, 7.8505545, -9.770115, -11.772175, 6.8767676, -11.532499, -11.772175, 7.856108, -10.163559, -11.561996, 7.1179185, -10.496557, -10.571764, 7.8505545, -9.770115, -9.607803, 8.602841, -10.44273, -9.298729, 7.856108, -10.163559, -11.772175, 6.8767676, -11.532499, -11.843517, 7.872555, -11.344322, -11.772175, 7.856108, -10.163559, -11.181795, 7.1520934, -12.470615, -11.843517, 7.872555, -11.344322, -11.772175, 6.8767676, -11.532499, -11.772175, 7.856108, -10.163559, -10.354536, 8.862788, -10.228495, -10.571764, 7.8505545, -9.770115, -10.571764, 7.8505545, -9.770115, -10.354536, 8.862788, -10.228495, -9.607803, 8.602841, -10.44273, -11.843517, 7.872555, -11.344322, -11.181795, 8.602841, -10.44273, -11.772175, 7.856108, -10.163559, -11.772175, 7.856108, -10.163559, -11.181795, 8.602841, -10.44273, -10.354536, 8.862788, -10.228495, -11.181795, 7.1520934, -12.470615, -11.206358, 7.889001, -12.524868, -11.843517, 7.872555, -11.344322, -11.206358, 7.889001, -12.524868, -11.181795, 7.1520934, -12.470615, -10.354536, 6.904321, -12.966158, -11.843517, 7.872555, -11.344322, -11.206358, 8.868341, -11.156143, -11.181795, 8.602841, -10.44273, -11.206358, 7.889001, -12.524868, -11.206358, 8.868341, -11.156143, -11.843517, 7.872555, -11.344322, -11.181795, 8.602841, -10.44273, -10.282127, 9.20027, -11.093346, -10.354536, 8.862788, -10.228495, -11.181795, 8.602841, -10.44273, -11.206358, 8.868341, -11.156143, -10.282127, 9.20027, -11.093346, -11.206358, 7.889001, -12.524868, -10.930391, 8.6175785, -11.966955, -11.206358, 8.868341, -11.156143, -11.206358, 7.889001, -12.524868, -10.354536, 6.904321, -12.966158, -10.282127, 7.894554, -12.918314, -10.930391, 8.6175785, -11.966955, -11.206358, 7.889001, -12.524868, -10.282127, 7.894554, -12.918314, -10.282127, 7.894554, -12.918314, -10.354536, 6.904321, -12.966158, -9.607803, 7.1520934, -12.470615, -11.206358, 8.868341, -11.156143, -10.930391, 8.6175785, -11.966955, -10.282127, 8.873895, -12.083578, -10.930391, 8.6175785, -11.966955, -10.282127, 7.894554, -12.918314, -10.282127, 8.873895, -12.083578, -11.206358, 8.868341, -11.156143, -10.282127, 8.873895, -12.083578, -10.282127, 9.20027, -11.093346, -10.282127, 7.894554, -12.918314, -9.607803, 7.1520934, -12.470615, -9.43009, 7.889001, -12.524868, -10.282127, 8.873895, -12.083578, -10.282127, 7.894554, -12.918314, -9.43009, 7.889001, -12.524868, -9.298729, 6.8767676, -11.532499, -9.43009, 7.889001, -12.524868, -9.607803, 7.1520934, -12.470615, -10.282127, 9.20027, -11.093346, -10.282127, 8.873895, -12.083578, -9.666115, 8.6175785, -11.966955, -10.282127, 8.873895, -12.083578, -9.43009, 7.889001, -12.524868, -9.666115, 8.6175785, -11.966955, -9.298729, 6.8767676, -11.532499, -9.010374, 7.872555, -11.344322, -9.43009, 7.889001, -12.524868, -9.010374, 7.872555, -11.344322, -9.666115, 8.6175785, -11.966955, -9.43009, 7.889001, -12.524868, -9.678076, 7.1179185, -10.496557, -9.010374, 7.872555, -11.344322, -9.298729, 6.8767676, -11.532499, -9.678076, 7.1179185, -10.496557, -9.298729, 7.856108, -10.163559, -9.010374, 7.872555, -11.344322, -9.010374, 7.872555, -11.344322, -9.43009, 8.868341, -11.156143, -9.666115, 8.6175785, -11.966955, -10.282127, 9.20027, -11.093346, -9.666115, 8.6175785, -11.966955, -9.43009, 8.868341, -11.156143, -9.298729, 7.856108, -10.163559, -9.43009, 8.868341, -11.156143, -9.010374, 7.872555, -11.344322, -10.354536, 8.862788, -10.228495, -10.282127, 9.20027, -11.093346, -9.43009, 8.868341, -11.156143, -9.298729, 7.856108, -10.163559, -9.607803, 8.602841, -10.44273, -9.43009, 8.868341, -11.156143, -10.354536, 8.862788, -10.228495, -9.43009, 8.868341, -11.156143, -9.607803, 8.602841, -10.44273, -11.181795, 7.1520934, -12.470615, -10.571764, 6.544839, -11.595083, -10.354536, 6.904321, -12.966158, -11.181795, 7.1520934, -12.470615, -11.772175, 6.8767676, -11.532499, -10.571764, 6.544839, -11.595083, -10.354536, 6.904321, -12.966158, -10.571764, 6.544839, -11.595083, -9.298729, 6.8767676, -11.532499, -10.354536, 6.904321, -12.966158, -9.298729, 6.8767676, -11.532499, -9.607803, 7.1520934, -12.470615, -10.571764, 6.544839, -11.595083, -9.678076, 7.1179185, -10.496557, -9.298729, 6.8767676, -11.532499, -10.571764, 6.544839, -11.595083, -10.716581, 6.8492146, -10.098627, -9.678076, 7.1179185, -10.496557, -11.772175, 6.8767676, -11.532499, -10.716581, 6.8492146, -10.098627, -10.571764, 6.544839, -11.595083, -11.772175, 6.8767676, -11.532499, -11.561996, 7.1179185, -10.496557, -10.716581, 6.8492146, -10.098627, -7.722173, 5.52812, -11.093344, -8.820272, 5.8179703, -11.28964, -7.772368, 5.3862915, -11.30032, -7.722173, 5.52812, -11.093344, -8.73398, 5.93139, -11.093346, -8.820272, 5.8179703, -11.28964, -8.73398, 5.93139, -11.093346, -9.858778, 6.9177785, -11.150375, -8.820272, 5.8179703, -11.28964, -8.73398, 5.93139, -11.093346, -9.817341, 6.9173512, -11.093346, -9.858778, 6.9177785, -11.150375, -8.820272, 5.8179703, -11.28964, -9.858778, 6.9177785, -11.150375, -9.925848, 6.9184194, -11.128588, -7.772368, 5.3862915, -11.30032, -8.820272, 5.8179703, -11.28964, -8.959965, 5.6340637, -11.214668, -8.820272, 5.8179703, -11.28964, -9.925848, 6.9184194, -11.128588, -8.959965, 5.6340637, -11.214668, -7.772368, 5.3862915, -11.30032, -8.959965, 5.6340637, -11.214668, -7.8533216, 5.156889, -11.221289, -8.959965, 5.6340637, -11.214668, -9.925848, 6.9184194, -11.128588, -9.925848, 6.9184194, -11.058102, -7.8533216, 5.156889, -11.221289, -8.959965, 5.6340637, -11.214668, -8.959965, 5.6340637, -10.972021, -8.959965, 5.6340637, -11.214668, -9.925848, 6.9184194, -11.058102, -8.959965, 5.6340637, -10.972021, -7.8533216, 5.156889, -11.221289, -8.959965, 5.6340637, -10.972021, -7.8533216, 5.1568894, -10.965401, -8.959965, 5.6340637, -10.972021, -9.925848, 6.9184194, -11.058102, -9.858778, 6.9177785, -11.036314, -7.8533216, 5.1568894, -10.965401, -8.959965, 5.6340637, -10.972021, -8.820272, 5.8179703, -10.897049, -8.959965, 5.6340637, -10.972021, -9.858778, 6.9177785, -11.036314, -8.820272, 5.8179703, -10.897049, -8.820272, 5.8179703, -10.897049, -9.858778, 6.9177785, -11.036314, -9.817341, 6.9173512, -11.093346, -7.8533216, 5.1568894, -10.965401, -8.820272, 5.8179703, -10.897049, -7.772368, 5.386292, -10.88637, -8.820272, 5.8179703, -10.897049, -9.817341, 6.9173512, -11.093346, -8.73398, 5.93139, -11.093346, -7.772368, 5.386292, -10.88637, -8.820272, 5.8179703, -10.897049, -8.73398, 5.93139, -11.093346, -7.772368, 5.386292, -10.88637, -8.73398, 5.93139, -11.093346, -7.722173, 5.52812, -11.093344, -8.853594, 3.2268317, -11.093344, -7.8546023, 5.2839794, -10.867573, -8.425974, 3.226832, -10.469002, -8.853594, 3.2268317, -11.093344, -8.015869, 5.313242, -11.093344, -7.8546023, 5.2839794, -10.867573, -8.015869, 5.313242, -11.093344, -7.773436, 7.3500977, -10.993595, -7.8546023, 5.2839794, -10.867573, -8.015869, 5.313242, -11.093344, -7.8454185, 7.3575735, -11.093346, -7.773436, 7.3500977, -10.993595, -7.8546023, 5.2839794, -10.867573, -7.773436, 7.3500977, -10.993595, -7.6565986, 7.337709, -11.031616, -8.425974, 3.226832, -10.469002, -7.8546023, 5.2839794, -10.867573, -7.5933747, 5.236347, -10.953865, -7.8546023, 5.2839794, -10.867573, -7.6565986, 7.337709, -11.031616, -7.5933747, 5.236347, -10.953865, -8.425974, 3.226832, -10.469002, -7.5933747, 5.236347, -10.953865, -7.734348, 3.226832, -10.707375, -7.5933747, 5.236347, -10.953865, -7.6565986, 7.337709, -11.031616, -7.6565986, 7.337709, -11.155075, -7.734348, 3.226832, -10.707375, -7.5933747, 5.236347, -10.953865, -7.5935884, 5.236347, -11.232822, -7.5933747, 5.236347, -10.953865, -7.6565986, 7.337709, -11.155075, -7.5935884, 5.236347, -11.232822, -7.734348, 3.226832, -10.707375, -7.5935884, 5.236347, -11.232822, -7.734348, 3.2268317, -11.479313, -7.5935884, 5.236347, -11.232822, -7.6565986, 7.337709, -11.155075, -7.773436, 7.3500977, -11.193094, -7.734348, 3.2268317, -11.479313, -7.5935884, 5.236347, -11.232822, -7.8546023, 5.2839794, -11.319117, -7.5935884, 5.236347, -11.232822, -7.773436, 7.3500977, -11.193094, -7.8546023, 5.2839794, -11.319117, -7.8546023, 5.2839794, -11.319117, -7.773436, 7.3500977, -11.193094, -7.8454185, 7.3575735, -11.093346, -7.734348, 3.2268317, -11.479313, -7.8546023, 5.2839794, -11.319117, -8.425974, 3.2268314, -11.717686, -7.8546023, 5.2839794, -11.319117, -7.8454185, 7.3575735, -11.093346, -8.015869, 5.313242, -11.093344, -8.425974, 3.2268314, -11.717686, -7.8546023, 5.2839794, -11.319117, -8.015869, 5.313242, -11.093344, -8.425974, 3.2268314, -11.717686, -8.015869, 5.313242, -11.093344, -8.853594, 3.2268317, -11.093344) @@ -145,20 +129,6 @@ grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 -[node name="PlayerMenuBackdrop" type="ColorRect" parent="." unique_id=2055423661] -unique_name_in_owner = true -visible = false -z_index = 10 -material = SubResource("ShaderMaterial_player_menu_pattern") -mouse_filter = 2 - -[node name="ShopBackdrop" type="ColorRect" parent="." unique_id=1404109502] -unique_name_in_owner = true -visible = false -z_index = 10 -material = SubResource("ShaderMaterial_shop_pattern") -mouse_filter = 2 - [node name="InterfaceFontController" type="Node" parent="." unique_id=384169781] unique_name_in_owner = true script = ExtResource("39_fonts") diff --git a/network/discovery_client.gd b/network/discovery_client.gd index 583f104..8bb28c0 100644 --- a/network/discovery_client.gd +++ b/network/discovery_client.gd @@ -278,7 +278,10 @@ func get_friend_presence() -> Array[Dictionary]: result.append({ "fingerprint": fingerprint, "display_name": str( - friend.get("last_known_display_name", "Player") + friend.get( + "last_known_display_name", + NetworkProfilePreferences.DEFAULT_DISPLAY_NAME, + ) ), "online": bool(live.get("online", false)), "room": ( @@ -1444,7 +1447,10 @@ func _on_invitation_poll_completed( continue friend_invite_received.emit( fingerprint, - str(friend.get("last_known_display_name", "Player")), + str(friend.get( + "last_known_display_name", + NetworkProfilePreferences.DEFAULT_DISPLAY_NAME, + )), room.duplicate(true), ) diff --git a/network/network_chat_protocol.gd b/network/network_chat_protocol.gd index 2e91432..865edaa 100644 --- a/network/network_chat_protocol.gd +++ b/network/network_chat_protocol.gd @@ -15,6 +15,9 @@ static var _invisible_edge_pattern: RegEx = RegEx.create_from_string( static var _visible_content_pattern: RegEx = RegEx.create_from_string( "[^\\s\\p{Z}\\p{Cf}\\x{2800}]" ) +static var _roleplay_separator_pattern: RegEx = RegEx.create_from_string( + "^[\\s\\p{Z}\\p{Cf}\\x{2800}]" +) enum Kind { PLAYER, SYSTEM } @@ -40,12 +43,40 @@ static func sanitize_body(value: Variant) -> String: return result +static func is_roleplay_body(value: Variant) -> bool: + var body: String = sanitize_body(value) + if body.length() < 3 or body.left(3).to_lower() != "/me": + return false + return ( + body.length() == 3 + or _roleplay_separator_pattern.search(body.substr(3, 1)) != null + ) + + +static func roleplay_action(value: Variant) -> String: + var body: String = sanitize_body(value) + if not is_roleplay_body(body): + return "" + return sanitize_body(body.substr(3)) + + +static func valid_user_body(value: Variant) -> bool: + var body: String = sanitize_body(value) + return ( + not body.is_empty() + and ( + not is_roleplay_body(body) + or not roleplay_action(body).is_empty() + ) + ) + + static func validate_request(data: Variant) -> bool: return ( typeof(data) == TYPE_DICTIONARY and _valid_id(data.get("request_id")) and _valid_id(data.get("session_id")) - and not sanitize_body(data.get("body")).is_empty() + and valid_user_body(data.get("body")) and NetworkIdentityCrypto.valid_fingerprint( data.get("sender_fingerprint") ) @@ -67,7 +98,16 @@ static func validate_message(data: Variant) -> bool: and typeof(data.get("sender_peer_id")) == TYPE_INT and typeof(data.get("sender_display_name")) == TYPE_STRING and str(data["sender_display_name"]).length() <= 24 - and not sanitize_body(data.get("body")).is_empty() + and ( + ( + int(data["kind"]) == Kind.SYSTEM + and not sanitize_body(data.get("body")).is_empty() + ) + or ( + int(data["kind"]) == Kind.PLAYER + and valid_user_body(data.get("body")) + ) + ) and NetworkIdentityCrypto.valid_fingerprint( data.get("sender_fingerprint") ) diff --git a/network/network_chat_service.gd b/network/network_chat_service.gd index 03b6e66..8dc4c9a 100644 --- a/network/network_chat_service.gd +++ b/network/network_chat_service.gd @@ -115,7 +115,10 @@ func send_local_message( send_rejected.emit("Chat is unavailable.") return false var clean := NetworkChatProtocol.sanitize_body(body) - if clean.is_empty(): + if not NetworkChatProtocol.valid_user_body(clean): + if NetworkChatProtocol.is_roleplay_body(clean): + send_rejected.emit("Usage: /me [action].") + return false send_rejected.emit("Message is empty or too long.") return false var request := { @@ -412,6 +415,7 @@ func _apply_message( return var kind := int(data["kind"]) var valid_signature := false + var canonical_sender_name: String = "" if kind == NetworkChatProtocol.Kind.SYSTEM: valid_signature = _session.verify_host_action( "chat_system", @@ -424,6 +428,7 @@ func _apply_message( if record == null: _queue_pending_peer_message(sender_id, data, emit_live_signals) return + canonical_sender_name = record.display_name.left(24) valid_signature = ( record.identity_fingerprint == str(data["sender_fingerprint"]) and _session.verify_peer_action( @@ -437,6 +442,10 @@ func _apply_message( return _seen_messages[data["message_id"]] = true var stored_message := data.duplicate(true) + if kind == NetworkChatProtocol.Kind.PLAYER: + # The authenticated peer registry, not sender-controlled message data, + # owns the name shown beside chat and roleplay actions. + stored_message["sender_display_name"] = canonical_sender_name # Suppression is immutable for this received copy. Relationship changes # later must never resurrect text that was hidden on arrival. stored_message["locally_suppressed"] = ( @@ -548,7 +557,9 @@ func _on_peer_removed(peer_id: int) -> void: _pending_peer_messages.erase(peer_id) if not _session.is_host(): return - var display_name: String = _peer_names.get(peer_id, "Player") + var display_name: String = _peer_names.get( + peer_id, NetworkProfilePreferences.DEFAULT_DISPLAY_NAME + ) _peer_names.erase(peer_id) _broadcast(_make_message( NetworkChatProtocol.Kind.SYSTEM, 0, "", "%s left." % display_name diff --git a/network/network_mail_service.gd b/network/network_mail_service.gd index 675a5aa..085c921 100644 --- a/network/network_mail_service.gd +++ b/network/network_mail_service.gd @@ -152,7 +152,10 @@ func is_local_recipient(letter: Dictionary) -> bool: func get_local_display_name() -> String: var record := _session.get_peer_record(_session.get_local_peer_id()) - return record.display_name if record != null else "Player" + return ( + record.display_name + if record != null else NetworkProfilePreferences.DEFAULT_DISPLAY_NAME + ) func get_recipient_choices() -> Array[Dictionary]: diff --git a/network/network_player_list_service.gd b/network/network_player_list_service.gd index 677df05..e2f79c7 100644 --- a/network/network_player_list_service.gd +++ b/network/network_player_list_service.gd @@ -477,7 +477,10 @@ func request_ban(peer_id: int, fingerprint: String) -> void: if not _valid_operator_sender(sender_id): return var record: PeerRegistry.PeerRecord = _session.get_peer_record(peer_id) - var display_name: String = record.display_name if record != null else "Player" + var display_name: String = ( + record.display_name + if record != null else NetworkProfilePreferences.DEFAULT_DISPLAY_NAME + ) var ok: bool = _ban_on_host( peer_id, fingerprint, display_name, -1, false ) @@ -544,7 +547,10 @@ func receive_ban_snapshot(records: Array) -> void: var record: Dictionary = value var fingerprint: String = str(record.get("target_fingerprint", "")) var display_name: String = str( - record.get("last_known_display_name", "Player") + record.get( + "last_known_display_name", + NetworkProfilePreferences.DEFAULT_DISPLAY_NAME, + ) ).strip_edges().left(NetworkProtocol.MAX_DISPLAY_NAME_LENGTH) if ( not NetworkIdentityCrypto.valid_fingerprint(fingerprint) diff --git a/network/network_profile_preferences.gd b/network/network_profile_preferences.gd index b6cac63..382f6d1 100644 --- a/network/network_profile_preferences.gd +++ b/network/network_profile_preferences.gd @@ -1,12 +1,17 @@ class_name NetworkProfilePreferences extends Node +signal profile_changed + const FORMAT_VERSION: int = 1 +const DEFAULT_DISPLAY_NAME: String = "stray" +const DEFAULT_TITLE: String = "newbie" const VoiceProfilesType = preload( "res://player/animalese_voice_profiles.gd" ) var profile_id: String = "" -var display_name: String = "Player" +var display_name: String = DEFAULT_DISPLAY_NAME +var title: String = DEFAULT_TITLE var voice_id: String = VoiceProfilesType.DEFAULT_ID var speech_speed_id: String = VoiceProfilesType.DEFAULT_SPEED_ID var call_id: String = VoiceProfilesType.DEFAULT_CALL_ID @@ -56,7 +61,8 @@ func load_or_create() -> bool: int(Time.get_unix_time_from_system()), Time.get_ticks_usec(), ] - display_name = "Player" + display_name = DEFAULT_DISPLAY_NAME + title = DEFAULT_TITLE voice_id = VoiceProfilesType.DEFAULT_ID speech_speed_id = VoiceProfilesType.DEFAULT_SPEED_ID call_id = VoiceProfilesType.DEFAULT_CALL_ID @@ -65,6 +71,113 @@ func load_or_create() -> bool: return _save_atomic() +func to_save_data() -> Dictionary: + return { + "profile_id": profile_id, + "display_name": display_name, + "title": title, + "voice_id": voice_id, + "speech_speed_id": speech_speed_id, + "call_id": call_id, + "sample_set_id": sample_set_id, + "created_at_unix": created_at_unix, + } + + +static func validate_save_data(value: Variant) -> bool: + if typeof(value) != TYPE_DICTIONARY: + return false + var data: Dictionary = value + if ( + typeof(data.get("profile_id")) != TYPE_STRING + or typeof(data.get("display_name")) != TYPE_STRING + or ( + data.has("title") + and typeof(data.get("title")) != TYPE_STRING + ) + or typeof(data.get("created_at_unix")) not in [TYPE_INT, TYPE_FLOAT] + ): + return false + var saved_profile_id := str(data.get("profile_id", "")) + var saved_name := str(data.get("display_name", "")) + var saved_title := str(data.get("title", DEFAULT_TITLE)) + return ( + not saved_profile_id.is_empty() + and saved_profile_id.length() <= NetworkProtocol.MAX_PROFILE_ID_LENGTH + and is_valid_display_name(saved_name) + and is_valid_title(saved_title) + and VoiceProfilesType.is_valid(str(data.get( + "voice_id", + VoiceProfilesType.DEFAULT_ID, + ))) + and VoiceProfilesType.is_valid_speed(str(data.get( + "speech_speed_id", + VoiceProfilesType.DEFAULT_SPEED_ID, + ))) + and VoiceProfilesType.is_valid_call(str(data.get( + "call_id", + VoiceProfilesType.DEFAULT_CALL_ID, + ))) + and VoiceProfilesType.is_valid_sample_set(str(data.get( + "sample_set_id", + VoiceProfilesType.DEFAULT_SAMPLE_SET_ID, + ))) + and int(data.get("created_at_unix", -1)) >= 0 + ) + + +func restore_from_save_data( + value: Variant, + persist_to_profile_file: bool = true, +) -> bool: + if not validate_save_data(value): + return false + var data: Dictionary = value + var previous: Dictionary = to_save_data() + profile_id = str(data["profile_id"]) + display_name = str(data["display_name"]).strip_edges() + title = str(data.get("title", DEFAULT_TITLE)).strip_edges() + voice_id = str(data.get("voice_id", VoiceProfilesType.DEFAULT_ID)) + speech_speed_id = str(data.get( + "speech_speed_id", + VoiceProfilesType.DEFAULT_SPEED_ID, + )) + call_id = str(data.get("call_id", VoiceProfilesType.DEFAULT_CALL_ID)) + sample_set_id = str(data.get( + "sample_set_id", + VoiceProfilesType.DEFAULT_SAMPLE_SET_ID, + )) + created_at_unix = int(data["created_at_unix"]) + if persist_to_profile_file and not _save_atomic(): + _assign_save_data(previous) + return false + if to_save_data() != previous: + profile_changed.emit() + return true + + +func reset_to_defaults(persist_to_profile_file: bool = true) -> bool: + var previous: Dictionary = to_save_data() + profile_id = Crypto.new().generate_random_bytes(16).hex_encode() + if profile_id.is_empty(): + profile_id = "%d-%d" % [ + int(Time.get_unix_time_from_system()), + Time.get_ticks_usec(), + ] + display_name = DEFAULT_DISPLAY_NAME + title = DEFAULT_TITLE + voice_id = VoiceProfilesType.DEFAULT_ID + speech_speed_id = VoiceProfilesType.DEFAULT_SPEED_ID + call_id = VoiceProfilesType.DEFAULT_CALL_ID + sample_set_id = VoiceProfilesType.DEFAULT_SAMPLE_SET_ID + created_at_unix = int(Time.get_unix_time_from_system()) + if persist_to_profile_file and not _save_atomic(): + _assign_save_data(previous) + return false + profile_changed.emit() + return true + + func set_display_name(value: String) -> bool: return set_profile_identity( value, @@ -72,6 +185,7 @@ func set_display_name(value: String) -> bool: speech_speed_id, call_id, sample_set_id, + title, ) @@ -81,10 +195,15 @@ func set_profile_identity( selected_speech_speed_id: String, selected_call_id: String, selected_sample_set_id: String = VoiceProfilesType.DEFAULT_SAMPLE_SET_ID, + selected_title: String = "", ) -> bool: var clean_name: String = value.strip_edges() + var clean_title: String = ( + title if selected_title.is_empty() else selected_title.strip_edges() + ) if ( not is_valid_display_name(clean_name) + or not is_valid_title(clean_title) or not VoiceProfilesType.is_valid(selected_voice_id) or not VoiceProfilesType.is_valid_speed(selected_speech_speed_id) or not VoiceProfilesType.is_valid_call(selected_call_id) @@ -92,18 +211,30 @@ func set_profile_identity( ): return false var previous_name: String = display_name + var previous_title: String = title var previous_voice_id: String = voice_id var previous_speech_speed_id: String = speech_speed_id var previous_call_id: String = call_id var previous_sample_set_id: String = sample_set_id display_name = clean_name + title = clean_title voice_id = selected_voice_id speech_speed_id = selected_speech_speed_id call_id = selected_call_id sample_set_id = selected_sample_set_id if _save_atomic(): + if ( + display_name != previous_name + or voice_id != previous_voice_id + or title != previous_title + or speech_speed_id != previous_speech_speed_id + or call_id != previous_call_id + or sample_set_id != previous_sample_set_id + ): + profile_changed.emit() return true display_name = previous_name + title = previous_title voice_id = previous_voice_id speech_speed_id = previous_speech_speed_id call_id = previous_call_id @@ -111,6 +242,23 @@ func set_profile_identity( return false +func _assign_save_data(data: Dictionary) -> void: + profile_id = str(data.get("profile_id", "")) + display_name = str(data.get("display_name", DEFAULT_DISPLAY_NAME)) + title = str(data.get("title", DEFAULT_TITLE)) + voice_id = str(data.get("voice_id", VoiceProfilesType.DEFAULT_ID)) + speech_speed_id = str(data.get( + "speech_speed_id", + VoiceProfilesType.DEFAULT_SPEED_ID, + )) + call_id = str(data.get("call_id", VoiceProfilesType.DEFAULT_CALL_ID)) + sample_set_id = str(data.get( + "sample_set_id", + VoiceProfilesType.DEFAULT_SAMPLE_SET_ID, + )) + created_at_unix = int(data.get("created_at_unix", 0)) + + static func is_valid_display_name(value: String) -> bool: var clean_name := value.strip_edges() if clean_name.is_empty() or clean_name.length() > 24: @@ -122,6 +270,17 @@ static func is_valid_display_name(value: String) -> bool: return true +static func is_valid_title(value: String) -> bool: + var clean_title := value.strip_edges() + if clean_title.is_empty() or clean_title.length() > NetworkProtocol.MAX_PLAYER_TITLE_LENGTH: + return false + for index: int in clean_title.length(): + var codepoint: int = clean_title.unicode_at(index) + if codepoint < 32 or codepoint == 127: + return false + return true + + func _load_existing() -> bool: var file := FileAccess.open(_profile_path, FileAccess.READ) if file == null: @@ -142,20 +301,27 @@ func _load_existing() -> bool: data.get("format_version") != FORMAT_VERSION or typeof(data.get("profile_id")) != TYPE_STRING or typeof(data.get("display_name")) != TYPE_STRING + or ( + data.has("title") + and typeof(data.get("title")) != TYPE_STRING + ) or typeof(data.get("created_at_unix")) not in [TYPE_INT, TYPE_FLOAT] ): return false var loaded_id: String = data["profile_id"] var loaded_name: String = data["display_name"] + var loaded_title := str(data.get("title", DEFAULT_TITLE)) if ( loaded_id.is_empty() or loaded_id.length() > NetworkProtocol.MAX_PROFILE_ID_LENGTH or loaded_name.is_empty() or loaded_name.length() > NetworkProtocol.MAX_DISPLAY_NAME_LENGTH + or not is_valid_title(loaded_title) ): return false profile_id = loaded_id display_name = loaded_name + title = loaded_title.strip_edges() voice_id = VoiceProfilesType.sanitized_id( str(data.get("voice_id", VoiceProfilesType.DEFAULT_ID)) ) @@ -180,6 +346,7 @@ func _save_atomic() -> bool: "format_version": FORMAT_VERSION, "profile_id": profile_id, "display_name": display_name, + "title": title, "voice_id": voice_id, "speech_speed_id": speech_speed_id, "call_id": call_id, diff --git a/network/network_profile_protocol.gd b/network/network_profile_protocol.gd index 5c1e879..2da3c71 100644 --- a/network/network_profile_protocol.gd +++ b/network/network_profile_protocol.gd @@ -31,6 +31,8 @@ static func valid_check_request(data: Variant) -> bool: static func valid_apply_request(data: Variant) -> bool: return ( valid_check_request(data) + and typeof(data.get("player_title")) == TYPE_STRING + and NetworkProfilePreferences.is_valid_title(data["player_title"]) and typeof(data.get("appearance")) == TYPE_DICTIONARY and valid_snapshot(data["appearance"]) and typeof(data.get("use_anyway")) == TYPE_BOOL @@ -63,6 +65,7 @@ static func signature_fields(data: Dictionary) -> Array: str(data.get("request_id", "")), str(data.get("sender_fingerprint", "")), str(data.get("display_name", "")), + str(data.get("player_title", "")), ] result.append_array( CharacterCustomizationCatalog.appearance_signature_values(appearance) diff --git a/network/network_profile_service.gd b/network/network_profile_service.gd index ff967f1..707637a 100644 --- a/network/network_profile_service.gd +++ b/network/network_profile_service.gd @@ -16,6 +16,7 @@ signal profile_snapshot_changed( display_name: String, appearance: Dictionary, ) +signal profile_title_changed(peer_id: int, title: String) var _session: NetworkSession var _preferences: NetworkProfilePreferences @@ -26,6 +27,7 @@ var _pending_voice_ids: Dictionary[String, String] = {} var _pending_speech_speed_ids: Dictionary[String, String] = {} var _pending_call_ids: Dictionary[String, String] = {} var _pending_sample_set_ids: Dictionary[String, String] = {} +var _pending_titles: Dictionary[String, String] = {} var _host_pending_apply: Dictionary[String, Dictionary] = {} var _latest_check_id: String = "" var _latest_check_name: String = "" @@ -42,6 +44,16 @@ func setup( _appearance_store = appearance_store _spawn_service = spawn_service _appearance_store.load_preferences() + if not _preferences.profile_changed.is_connected( + _on_local_profile_store_changed + ): + _preferences.profile_changed.connect(_on_local_profile_store_changed) + if not _appearance_store.appearance_changed.is_connected( + _on_local_appearance_store_changed + ): + _appearance_store.appearance_changed.connect( + _on_local_appearance_store_changed + ) _session.peer_authenticated.connect(_on_peer_authenticated) _session.peer_removed.connect(_on_peer_removed) _session.peer_display_name_changed.connect(_on_peer_display_name_changed) @@ -51,6 +63,20 @@ func setup( _apply_local_voice_to_avatar() +func _on_local_profile_store_changed() -> void: + _apply_local_voice_to_avatar() + + +func _on_local_appearance_store_changed() -> void: + var snapshot: Dictionary = _appearance_store.get_snapshot() + var local_peer_id: int = ( + _session.get_local_peer_id() if _session != null else 1 + ) + _apply_to_avatar(local_peer_id, snapshot) + if _session != null: + _session.set_local_appearance_snapshot(snapshot) + + func reload_persisted_profile() -> bool: if ( not _preferences.load_or_create() @@ -66,6 +92,10 @@ func get_persisted_name() -> String: return _preferences.display_name +func get_persisted_title() -> String: + return _preferences.title + + func get_persisted_appearance() -> Dictionary: return _appearance_store.get_snapshot() @@ -107,6 +137,7 @@ func preview_appearance(appearance: Dictionary) -> bool: local_peer_id, _preferences.display_name, snapshot, + _preferences.title, ) var authorization := _make_appearance_preview_authorization(snapshot) var local_record := _session.get_peer_record(local_peer_id) @@ -179,10 +210,16 @@ func apply_profile( speech_speed_id: String = VoiceProfilesType.DEFAULT_SPEED_ID, call_id: String = VoiceProfilesType.DEFAULT_CALL_ID, sample_set_id: String = VoiceProfilesType.DEFAULT_SAMPLE_SET_ID, + player_title: String = "", ) -> bool: var clean_name := display_name.strip_edges() + var clean_title := ( + _preferences.title + if player_title.is_empty() else player_title.strip_edges() + ) if ( not NetworkProfilePreferences.is_valid_display_name(clean_name) + or not NetworkProfilePreferences.is_valid_title(clean_title) or not CharacterCustomizationCatalog.validate_snapshot(appearance) or not VoiceProfilesType.is_valid(voice_id) or not VoiceProfilesType.is_valid_speed(speech_speed_id) @@ -196,6 +233,7 @@ func apply_profile( "request_id": request_id, "session_id": _session.get_session_id() if _session != null else "", "display_name": clean_name, + "player_title": clean_title, "appearance": appearance.duplicate(true), "use_anyway": use_anyway, "sender_fingerprint": _session.get_local_identity_fingerprint(), @@ -208,6 +246,7 @@ func apply_profile( _pending_speech_speed_ids[request_id] = speech_speed_id _pending_call_ids[request_id] = call_id _pending_sample_set_ids[request_id] = sample_set_id + _pending_titles[request_id] = clean_title if _session == null or not _session.is_gameplay_session_active(): _apply_local_result(request_id, true, "", false, PackedStringArray()) elif _session.is_host(): @@ -303,6 +342,7 @@ func submit_appearance_preview(data: Dictionary) -> void: sender_id, record.display_name, appearance, + record.title, ) _apply_to_avatar(sender_id, appearance) _broadcast_appearance_preview_to_supported_peers(sender_id, appearance) @@ -310,6 +350,7 @@ func submit_appearance_preview(data: Dictionary) -> void: func _process_apply_request(peer_id: int, data: Dictionary) -> void: var display_name: String = str(data["display_name"]).strip_edges() + var player_title: String = str(data["player_title"]).strip_edges() var conflict: bool = _name_conflicts(peer_id, display_name) var accepted: bool = not conflict or bool(data["use_anyway"]) var suggestions: PackedStringArray = ( @@ -325,7 +366,8 @@ func _process_apply_request(peer_id: int, data: Dictionary) -> void: if accepted: _host_pending_apply[str(data["request_id"])] = { "peer_id": peer_id, - "display_name": display_name, + "display_name": display_name, + "player_title": player_title, "appearance": Dictionary(data["appearance"]).duplicate(true), "authorization": { "request_id": data["request_id"], @@ -356,8 +398,11 @@ func confirm_profile_saved(request_id: String) -> void: return _host_pending_apply.erase(request_id) var display_name: String = str(pending["display_name"]) + var player_title: String = str(pending["player_title"]) var appearance: Dictionary = Dictionary(pending["appearance"]) - _session.apply_canonical_profile(sender_id, display_name, appearance) + _session.apply_canonical_profile( + sender_id, display_name, appearance, player_title + ) var record: PeerRegistry.PeerRecord = _session.get_peer_record(sender_id) if record != null: record.profile_authorization = pending.get("authorization", {}).duplicate(true) @@ -365,6 +410,7 @@ func confirm_profile_saved(request_id: String) -> void: broadcast_profile_snapshot.rpc( sender_id, display_name, + player_title, appearance, pending.get("authorization", {}), ) @@ -405,10 +451,12 @@ func _apply_local_result( _pending_speech_speed_ids.erase(request_id) _pending_call_ids.erase(request_id) _pending_sample_set_ids.erase(request_id) + _pending_titles.erase(request_id) conflict_result.emit(request_id, conflict, suggestions) apply_finished.emit(false, message) return var previous_name := _preferences.display_name + var previous_title := _preferences.title var previous_voice_id := _preferences.voice_id var previous_speech_speed_id := _preferences.speech_speed_id var previous_call_id := _preferences.call_id @@ -429,18 +477,24 @@ func _apply_local_result( request_id, VoiceProfilesType.DEFAULT_SAMPLE_SET_ID, ) + var requested_title: String = _pending_titles.get( + request_id, + NetworkProfilePreferences.DEFAULT_TITLE, + ) if not _preferences.set_profile_identity( str(request["display_name"]), requested_voice_id, requested_speech_speed_id, requested_call_id, requested_sample_set_id, + requested_title, ): _pending_apply.erase(request_id) _pending_voice_ids.erase(request_id) _pending_speech_speed_ids.erase(request_id) _pending_call_ids.erase(request_id) _pending_sample_set_ids.erase(request_id) + _pending_titles.erase(request_id) apply_finished.emit(false, "Profile could not be saved.") return if not _appearance_store.save_snapshot(request["appearance"]): @@ -450,12 +504,14 @@ func _apply_local_result( previous_speech_speed_id, previous_call_id, previous_sample_set_id, + previous_title, ) _pending_apply.erase(request_id) _pending_voice_ids.erase(request_id) _pending_speech_speed_ids.erase(request_id) _pending_call_ids.erase(request_id) _pending_sample_set_ids.erase(request_id) + _pending_titles.erase(request_id) apply_finished.emit(false, "Profile could not be saved.") return _pending_apply.erase(request_id) @@ -463,6 +519,7 @@ func _apply_local_result( _pending_speech_speed_ids.erase(request_id) _pending_call_ids.erase(request_id) _pending_sample_set_ids.erase(request_id) + _pending_titles.erase(request_id) if _session != null: _session.set_local_appearance_snapshot(_appearance_store.get_snapshot()) if _session != null and _session.is_gameplay_session_active(): @@ -471,6 +528,7 @@ func _apply_local_result( _session.get_local_peer_id(), _preferences.display_name, _appearance_store.get_snapshot(), + _preferences.title, ) var record := _session.get_peer_record( _session.get_local_peer_id() @@ -480,6 +538,7 @@ func _apply_local_result( broadcast_profile_snapshot.rpc( _session.get_local_peer_id(), _preferences.display_name, + _preferences.title, _appearance_store.get_snapshot(), request, ) @@ -499,11 +558,13 @@ func _apply_local_result( func broadcast_profile_snapshot( peer_id: int, display_name: String, + player_title: String, appearance: Dictionary, authorization: Dictionary = {}, ) -> void: if ( not NetworkProfilePreferences.is_valid_display_name(display_name) + or not NetworkProfilePreferences.is_valid_title(player_title) or not CharacterCustomizationCatalog.validate_snapshot(appearance) ): return @@ -514,12 +575,16 @@ func broadcast_profile_snapshot( display_name, appearance, authorization, + player_title, ) ): return - _session.apply_canonical_profile(peer_id, display_name, appearance) + _session.apply_canonical_profile( + peer_id, display_name, appearance, player_title + ) _apply_to_avatar(peer_id, appearance) profile_snapshot_changed.emit(peer_id, display_name, appearance.duplicate(true)) + profile_title_changed.emit(peer_id, player_title) @rpc("authority", "call_remote", "reliable", NetworkProfileProtocol.RELIABLE_CHANNEL) @@ -533,7 +598,9 @@ func broadcast_appearance_preview( if record == null: return var snapshot := CharacterCustomizationCatalog.sanitized_snapshot(appearance) - _session.apply_canonical_profile(peer_id, record.display_name, snapshot) + _session.apply_canonical_profile( + peer_id, record.display_name, snapshot, record.title + ) _apply_to_avatar(peer_id, snapshot) profile_snapshot_changed.emit( peer_id, @@ -575,6 +642,7 @@ func _on_peer_authenticated(peer_id: int, _display_name: String) -> void: peer_id, existing_id, record.display_name, + record.title, record.appearance_snapshot, record.profile_authorization, ) @@ -638,6 +706,7 @@ func _on_session_state_changed(state: NetworkSession.State) -> void: _pending_speech_speed_ids.clear() _pending_call_ids.clear() _pending_sample_set_ids.clear() + _pending_titles.clear() _host_pending_apply.clear() _latest_check_id = "" _latest_check_name = "" diff --git a/network/network_protocol.gd b/network/network_protocol.gd index d994c96..d586c23 100644 --- a/network/network_protocol.gd +++ b/network/network_protocol.gd @@ -3,10 +3,11 @@ extends RefCounted const WorldLayoutType = preload("res://world/world_layout.gd") -const PROTOCOL_VERSION: int = 12 +const PROTOCOL_VERSION: int = 13 const GAME_BUILD: String = "prealpha" const MAX_GAME_VERSION_LENGTH: int = 64 const MAX_DISPLAY_NAME_LENGTH: int = 24 +const MAX_PLAYER_TITLE_LENGTH: int = 24 const MAX_PROFILE_ID_LENGTH: int = 96 const MAX_NONCE_LENGTH: int = 96 const MAX_PUBLIC_KEY_LENGTH: int = 8192 @@ -183,6 +184,7 @@ static func make_client_hello( cosmetic_snapshot: Dictionary = {}, identity_fingerprint: String = "", identity_signature: PackedByteArray = PackedByteArray(), + player_title: String = NetworkProfilePreferences.DEFAULT_TITLE, ) -> Dictionary: return { "protocol_version": PROTOCOL_VERSION, @@ -190,6 +192,7 @@ static func make_client_hello( "game_build": GAME_BUILD, "local_profile_id": profile_id, "display_name": display_name, + "player_title": player_title, "client_nonce": client_nonce, "capability_flags": PackedStringArray([ FISH_QUALITY_CAPABILITY, @@ -224,6 +227,7 @@ static func validate_client_hello(data: Variant) -> String: "game_build", "local_profile_id", "display_name", + "player_title", "client_nonce", "capability_flags", "cosmetic_snapshot", @@ -246,6 +250,11 @@ static func validate_client_hello(data: Variant) -> String: return "Profile ID is invalid." if typeof(payload["display_name"]) != TYPE_STRING: return "Display name is invalid." + if ( + typeof(payload["player_title"]) != TYPE_STRING + or not NetworkProfilePreferences.is_valid_title(payload["player_title"]) + ): + return "Player title is invalid." if typeof(payload["client_nonce"]) != TYPE_STRING: return "Client nonce is invalid." if typeof(payload["capability_flags"]) not in [ @@ -295,6 +304,7 @@ static func client_profile_fields(data: Dictionary) -> Array: str(data.get("identity_fingerprint", "")), str(data.get("local_profile_id", "")), str(data.get("display_name", "")), + str(data.get("player_title", "")), ] result.append_array( CharacterCustomizationCatalog.appearance_signature_values(appearance) diff --git a/network/network_session.gd b/network/network_session.gd index 13c05d3..3c599e2 100644 --- a/network/network_session.gd +++ b/network/network_session.gd @@ -67,6 +67,7 @@ signal host_openness_changed(is_open: bool) signal session_display_name_changed(display_name: String) signal peer_count_changed(player_count: int, max_players: int) signal peer_display_name_changed(peer_id: int, display_name: String) +signal peer_title_changed(peer_id: int, title: String) signal peer_profile_changed( peer_id: int, display_name: String, @@ -354,6 +355,7 @@ func _register_player_host() -> void: NetworkProtocol.HOME_CAPABILITY, NetworkProtocol.HOME_UPGRADE_CAPABILITY, ]), + _profile.title, ) _registry.update_appearance(1, _local_appearance_snapshot) var host_profile_hello := NetworkProtocol.make_client_hello( @@ -362,6 +364,8 @@ func _register_player_host() -> void: NetworkIdentityCrypto.secure_id(32), _local_appearance_snapshot, _player_identity.fingerprint, + PackedByteArray(), + _profile.title, ) host_profile_hello["identity_signature"] = _player_identity.sign( "handshake_client_profile", @@ -931,13 +935,16 @@ func apply_canonical_profile( peer_id: int, display_name: String, appearance: Dictionary, + player_title: String = NetworkProfilePreferences.DEFAULT_TITLE, ) -> bool: if ( not NetworkProfilePreferences.is_valid_display_name(display_name) + or not NetworkProfilePreferences.is_valid_title(player_title) or not CharacterCustomizationCatalog.validate_snapshot(appearance) ): return false var name_changed := _registry.update_display_name(peer_id, display_name) + var title_changed: bool = _registry.update_title(peer_id, player_title) var appearance_changed := _registry.update_appearance(peer_id, appearance) if name_changed: peer_display_name_changed.emit(peer_id, display_name) @@ -945,9 +952,11 @@ func apply_canonical_profile( var avatar: Player = _spawn_service.get_avatar(peer_id) if avatar != null: avatar.apply_appearance_snapshot(appearance) + if title_changed: + peer_title_changed.emit(peer_id, player_title) if name_changed or appearance_changed: peer_profile_changed.emit(peer_id, display_name, appearance.duplicate(true)) - return name_changed or appearance_changed + return name_changed or title_changed or appearance_changed @rpc("any_peer", "call_remote", "reliable", 0) @@ -1376,6 +1385,8 @@ func request_client_profile() -> void: _client_nonce, _local_appearance_snapshot, _player_identity.fingerprint, + PackedByteArray(), + _profile.title, ) hello["identity_signature"] = _player_identity.sign( "handshake_client_profile", @@ -1459,6 +1470,7 @@ func submit_client_hello(data: Dictionary) -> void: return var profile_id: String = data["local_profile_id"] var display_name: String = data["display_name"] + var player_title: String = data["player_title"] if not NetworkProfilePreferences.is_valid_display_name(display_name): _reject_peer( sender_id, @@ -1473,6 +1485,7 @@ func submit_client_hello(data: Dictionary) -> void: identity["fingerprint"], identity["public_key"], client_capabilities, + player_title, ): _reject_peer( sender_id, @@ -1515,6 +1528,7 @@ func submit_client_hello(data: Dictionary) -> void: display_name, submitted_appearance.duplicate(true), ) + peer_title_changed.emit(sender_id, player_title) receive_server_hello.rpc_id( sender_id, NetworkProtocol.make_server_hello( @@ -1691,6 +1705,7 @@ func receive_server_hello(data: Dictionary) -> void: NetworkProtocol.HOME_CAPABILITY, NetworkProtocol.HOME_UPGRADE_CAPABILITY, ]), + _profile.title, ) _registry.update_appearance(local_peer_id, _local_appearance_snapshot) var local_record := _registry.get_peer(local_peer_id) @@ -1777,6 +1792,10 @@ func _apply_spawn_entry(entry: Dictionary) -> void: typeof(entry.get("peer_id")) != TYPE_INT or typeof(entry.get("profile_id")) != TYPE_STRING or typeof(entry.get("display_name")) != TYPE_STRING + or typeof(entry.get("player_title")) != TYPE_STRING + or not NetworkProfilePreferences.is_valid_title( + str(entry["player_title"]) + ) or typeof(entry.get("position")) != TYPE_ARRAY or typeof(entry.get("yaw")) not in [TYPE_FLOAT, TYPE_INT] or typeof(entry.get("sitting")) != TYPE_BOOL @@ -1811,6 +1830,7 @@ func _apply_spawn_entry(entry: Dictionary) -> void: str(entry.get("identity_fingerprint", "")), str(entry.get("identity_public_key", "")), _sanitized_capabilities(entry.get("capability_flags", [])), + str(entry["player_title"]), ): return peer_was_added = true @@ -1894,6 +1914,10 @@ func _make_spawn_entry( "peer_id": peer_id, "profile_id": record.profile_id if record != null else "", "display_name": display_name, + "player_title": ( + record.title + if record != null else NetworkProfilePreferences.DEFAULT_TITLE + ), "position": [ transform.origin.x, transform.origin.y, @@ -1978,6 +2002,7 @@ func verify_profile_authorization( display_name: String, appearance: Dictionary, authorization: Dictionary, + player_title: String = NetworkProfilePreferences.DEFAULT_TITLE, ) -> bool: var record := _registry.get_peer(peer_id) if record == null: @@ -1986,6 +2011,7 @@ func verify_profile_authorization( peer_id, record.profile_id, display_name, + player_title, appearance, record.identity_fingerprint, record.identity_public_key, @@ -2000,6 +2026,7 @@ func _verify_spawn_identity(entry: Dictionary) -> bool: int(entry.get("peer_id", 0)), str(entry.get("profile_id", "")), str(entry.get("display_name", "")), + str(entry.get("player_title", NetworkProfilePreferences.DEFAULT_TITLE)), Dictionary(entry.get("appearance", {})), str(entry.get("identity_fingerprint", "")), str(entry.get("identity_public_key", "")), @@ -2011,6 +2038,7 @@ func _verify_profile_authorization_fields( peer_id: int, profile_id: String, display_name: String, + player_title: String, appearance: Dictionary, fingerprint: String, identity_public_key: String, @@ -2021,6 +2049,8 @@ func _verify_profile_authorization_fields( ) if NetworkIdentityCrypto.fingerprint_public_pem(public_pem) != fingerprint: return false + if not NetworkProfilePreferences.is_valid_title(player_title): + return false if authorization.is_empty(): return peer_id == 1 if authorization.get("domain") == "handshake_client_profile": @@ -2031,6 +2061,7 @@ func _verify_profile_authorization_fields( appearance, fingerprint, authorization.get("signature", PackedByteArray()), + player_title, ) return NetworkIdentityCrypto.verify_fields( NetworkIdentityCrypto.load_public_key(public_pem), @@ -2054,6 +2085,7 @@ func _verify_profile_authorization_fields( return false var signed := authorization.duplicate(true) signed["display_name"] = display_name + signed["player_title"] = player_title signed["appearance"] = appearance return NetworkIdentityCrypto.verify_fields( NetworkIdentityCrypto.load_public_key(public_pem), @@ -2182,7 +2214,6 @@ func _maybe_send_local_animation_action() -> void: str(action["id"]), int(action["sequence"]), bool(action.get("paused", false)), - avatar.get_network_sitting_intent(), ] if signature == _last_local_animation_action_signature: return @@ -2237,9 +2268,9 @@ func submit_movement_animation_action(encoded: Array) -> void: avatar.apply_authoritative_network_animation_action( animation_state["action"] ) - avatar.apply_authoritative_network_sitting_state( - bool(animation_state["sitting"]) - ) + # Sitting is authoritative only on sequenced movement input. The legacy bit + # remains in this packet's wire shape for protocol compatibility, but acting + # on it here would race jump input across two independent ENet channels. static func _encode_movement_input(data: Dictionary) -> Array: diff --git a/network/peer_registry.gd b/network/peer_registry.gd index 2cab061..8067451 100644 --- a/network/peer_registry.gd +++ b/network/peer_registry.gd @@ -7,6 +7,7 @@ class PeerRecord: var peer_id: int = 0 var profile_id: String = "" var display_name: String = "" + var title: String = NetworkProfilePreferences.DEFAULT_TITLE var protocol_version: int = 0 var joined_at_unix: int = 0 var appearance_snapshot: Dictionary = ( @@ -30,10 +31,12 @@ func add_peer( identity_fingerprint: String = "", identity_public_key: String = "", capability_flags: PackedStringArray = PackedStringArray(), + player_title: String = NetworkProfilePreferences.DEFAULT_TITLE, ) -> bool: if ( peer_id <= 0 or profile_id.is_empty() + or not NetworkProfilePreferences.is_valid_title(player_title) or ( not identity_fingerprint.is_empty() and has_fingerprint(identity_fingerprint) @@ -44,6 +47,7 @@ func add_peer( record.peer_id = peer_id record.profile_id = profile_id record.display_name = display_name + record.title = player_title record.protocol_version = protocol_version record.joined_at_unix = int(Time.get_unix_time_from_system()) record.identity_fingerprint = identity_fingerprint @@ -74,6 +78,14 @@ func update_display_name(peer_id: int, display_name: String) -> bool: return true +func update_title(peer_id: int, player_title: String) -> bool: + var record: PeerRecord = _records.get(peer_id) + if record == null or not NetworkProfilePreferences.is_valid_title(player_title): + return false + record.title = player_title.strip_edges() + return true + + func update_appearance(peer_id: int, snapshot: Dictionary) -> bool: var record: PeerRecord = _records.get(peer_id) if record == null or not CharacterCustomizationCatalog.validate_snapshot(snapshot): diff --git a/network/player_data_root.gd b/network/player_data_root.gd index e173577..fd1265a 100644 --- a/network/player_data_root.gd +++ b/network/player_data_root.gd @@ -16,6 +16,10 @@ const ENVIRONMENT_VARIABLE := "straywild_DATA_DIR" const CREATE_ENVIRONMENT_VARIABLE := "straywild_CREATE_DATA_DIR" const LEGACY_ENVIRONMENT_VARIABLE := "NETFISHING_DATA_DIR" const LEGACY_CREATE_ENVIRONMENT_VARIABLE := "NETFISHING_CREATE_DATA_DIR" +const ISOLATED_VALIDATION_ENVIRONMENT := ( + "straywild_ISOLATED_VALIDATION_STORAGE" +) +const ISOLATED_VALIDATION_DIRECTORY := "isolated-validation-data" const APPLICATION_ID := "straywild" const LEGACY_APPLICATION_ID := "netfishing" const APP_DATA_PORTABLE_PATH := "user://portable-data" @@ -57,6 +61,9 @@ enum Mode { COMMAND_LINE_OVERRIDE, } +static var _process_validation_root := "" +static var _process_validation_device_id := "" + var mode := Mode.UNRESOLVED var root_path := "" var root_id := "" @@ -67,6 +74,11 @@ var override_active := false func resolve() -> bool: + # Validation scripts may be launched directly instead of through the + # repository runner. Keep the opt-in flag fail-safe: it must never follow a + # real user's bootstrap pointer merely because XDG isolation was omitted. + if _isolated_validation_requested(): + return _resolve_isolated_validation_root() prepare_legacy_user_data() _load_bootstrap_identity() var command_line: String = _command_line_override() @@ -116,6 +128,44 @@ func resolve() -> bool: return false +func _resolve_isolated_validation_root() -> bool: + # Behave like app-data storage after choosing the isolated root so migration + # tests can still exercise live root switching within their sandbox. + override_active = false + mode = Mode.APP_DATA + if _process_validation_device_id.is_empty(): + _process_validation_device_id = ( + Crypto.new().generate_random_bytes(16).hex_encode() + ) + device_id = _process_validation_device_id + if _process_validation_root.is_empty(): + var parent: String + if OS.has_environment("XDG_DATA_HOME"): + parent = ProjectSettings.globalize_path("user://") + else: + parent = OS.get_temp_dir().path_join( + "straywild-validation-%d-%d" + % [OS.get_process_id(), Time.get_ticks_usec()] + ) + _process_validation_root = parent.path_join( + ISOLATED_VALIDATION_DIRECTORY + ) + if not has_data_manifest(_process_validation_root): + var created: Dictionary = create_unbound_root( + _process_validation_root + ) + if not bool(created.get("ok", false)): + return false + return _activate_existing(_process_validation_root, "", false) + + +static func _isolated_validation_requested() -> bool: + return ( + DisplayServer.get_name() == "headless" + and OS.get_environment(ISOLATED_VALIDATION_ENVIRONMENT) == "1" + ) + + func prepare_legacy_user_data() -> void: var current_root: String = _normalize( ProjectSettings.globalize_path("user://") diff --git a/player/player.gd b/player/player.gd index 54bfa49..51263e3 100644 --- a/player/player.gd +++ b/player/player.gd @@ -388,6 +388,17 @@ class ShowcaseCameraSnapshot: var camera_dragging: bool +class ConversationCameraSnapshot: + extends RefCounted + + var yaw_transform: Transform3D + var yaw_rotation: Vector3 + var pitch_rotation: Vector3 + var spring_length: float + var target_zoom: float + var camera_dragging: bool + + @export_category("Movement") @export var walk_speed: float = 2.25 @export var sprint_speed: float = 4.5 @@ -446,6 +457,11 @@ var _rv_previous_camera_environment: Environment @export_range(0.0, 1.0, 0.01) var controller_trigger_threshold: float = 0.55 @export_range(1.0, 40.0, 0.5) var free_camera_speed: float = 10.0 @export_range(1.0, 10.0, 0.5) var free_camera_sprint_multiplier: float = 3.0 +@export_category("Conversation Camera") +@export_range(0.05, 1.0, 0.01) var conversation_camera_transition_seconds: float = 0.42 +@export_range(-45.0, 20.0, 1.0) var conversation_camera_pitch_degrees: float = -9.0 +@export_range(1.5, 8.0, 0.1, "suffix:m") var conversation_camera_distance: float = 3.65 +@export_range(0.5, 2.5, 0.05, "suffix:m") var conversation_camera_target_height: float = 1.3 @onready var _visuals: Node3D = %Visuals @onready var _character_rig: Node3D = get_node_or_null( @@ -521,6 +537,9 @@ var _showcase_restore_tween: Tween var _showcase_camera_tween: Tween var _showcase_camera_snapshot: ShowcaseCameraSnapshot var _showcase_restore_generation: int = 0 +var _conversation_camera_tween: Tween +var _conversation_camera_snapshot: ConversationCameraSnapshot +var _conversation_camera_generation: int = 0 var _network_peer_id: int = 0 var _network_authoritative_simulation: bool = false var _network_interpolation_enabled: bool = false @@ -1070,7 +1089,18 @@ func _simulate_movement_physics(delta: float) -> void: if jump_requested: _set_sitting(false, local_control_enabled) else: - velocity = Vector3.ZERO + # Keep the body participating in physics while seated. In particular, + # move_and_slide() refreshes Godot's floor state, so a stale grounded + # flag from prediction or a delayed packet cannot trap this early-return + # path forever after the capsule has moved into the air. + velocity.x = 0.0 + velocity.z = 0.0 + if not is_on_floor(): + velocity.y -= _gravity * fall_gravity_multiplier * delta + move_and_slide() + if not is_on_floor(): + _sit_after_landing = true + _set_sitting(false) _network_jump_pending = false return if _water_recovery_active: @@ -1726,6 +1756,10 @@ func toggle_sitting() -> void: return if not _can_begin_sitting(): _sit_after_landing = true + # Queue and repeat the intent until an owner snapshot acknowledges it. + # Previously this branch returned before marking a local sitting intent, + # so a delayed authoritative audit could race the deferred sit. + _set_sitting(false, local_control_enabled) return _set_sitting(should_sit, local_control_enabled) @@ -1750,7 +1784,11 @@ func _set_sitting( return _sitting = should_sit if _sitting: - velocity = Vector3.ZERO + # Sitting stops horizontal locomotion, but vertical motion remains owned by + # physics. Clearing Y here allowed a delayed seated state to repeatedly + # cancel gravity in a high-latency session. + velocity.x = 0.0 + velocity.z = 0.0 _character_animation_name = &"" _update_character_animation() @@ -1803,6 +1841,24 @@ func apply_authoritative_network_sitting_state(should_sit: bool) -> void: _set_sitting(should_sit) +func _apply_local_prediction_sitting_state(should_sit: bool) -> void: + # Owner audits can arrive several physics frames behind the locally predicted + # jump. Treat an authoritative seated bit as an intent until this capsule is + # actually grounded; applying it directly zeros vertical velocity and lets a + # stream of high-latency snapshots hold the local player in mid-air. + if _local_network_jump_intent_pending: + _sit_after_landing = false + _set_sitting(false) + return + if should_sit and not _can_begin_sitting(): + _sit_after_landing = true + _set_sitting(false) + return + if should_sit: + _sit_after_landing = false + _set_sitting(should_sit) + + func _input(event: InputEvent) -> void: # Camera dragging must observe the complete mouse gesture before GUI controls # get a chance to consume one part of it. Do not claim the event here: the @@ -2048,6 +2104,162 @@ func get_active_gameplay_camera() -> Camera3D: return _camera +func begin_shop_conversation_camera(npc_world_position: Vector3) -> bool: + if ( + not local_control_enabled + or _camera_yaw == null + or _camera_pitch == null + or _spring_arm == null + ): + return false + if _free_camera_active: + _set_free_camera_active(false) + _kill_conversation_camera_tween() + if _conversation_camera_snapshot == null: + _conversation_camera_snapshot = ConversationCameraSnapshot.new() + _conversation_camera_snapshot.yaw_transform = _camera_yaw.transform + _conversation_camera_snapshot.yaw_rotation = _camera_yaw.rotation + _conversation_camera_snapshot.pitch_rotation = _camera_pitch.rotation + _conversation_camera_snapshot.spring_length = _spring_arm.spring_length + _conversation_camera_snapshot.target_zoom = _target_zoom + _conversation_camera_snapshot.camera_dragging = _camera_dragging + _set_camera_dragging(false) + + var pair_direction := npc_world_position - global_position + pair_direction.y = 0.0 + if pair_direction.length_squared() <= 0.000001: + pair_direction = Vector3.RIGHT + else: + pair_direction = pair_direction.normalized() + # Frame the midpoint, with the camera's right axis running from the player + # toward the NPC. This naturally places the player left and shopkeeper right. + var target_world_yaw := atan2(-pair_direction.z, pair_direction.x) + var target_local_yaw := target_world_yaw - global_rotation.y + var shortest_target_yaw := ( + _camera_yaw.rotation.y + + wrapf(target_local_yaw - _camera_yaw.rotation.y, -PI, PI) + ) + var pair_midpoint := (global_position + npc_world_position) * 0.5 + pair_midpoint.y = global_position.y + conversation_camera_target_height + var target_position := to_local(pair_midpoint) + var duration := maxf(conversation_camera_transition_seconds, 0.05) + _conversation_camera_tween = create_tween() + _conversation_camera_tween.set_parallel(true) + _conversation_camera_tween.set_trans(Tween.TRANS_QUAD) + _conversation_camera_tween.set_ease(Tween.EASE_IN_OUT) + _conversation_camera_tween.tween_property( + _camera_yaw, "rotation:y", shortest_target_yaw, duration + ) + _conversation_camera_tween.tween_property( + _camera_yaw, "position", target_position, duration + ) + _conversation_camera_tween.tween_property( + _camera_pitch, + "rotation:x", + deg_to_rad(conversation_camera_pitch_degrees), + duration, + ) + _conversation_camera_tween.tween_property( + _spring_arm, + "spring_length", + maxf(conversation_camera_distance, 0.1), + duration, + ) + return true + + +func restore_shop_conversation_camera( + immediate: bool = false, + restored_callback: Callable = Callable(), +) -> void: + _kill_conversation_camera_tween() + if _conversation_camera_snapshot == null: + if restored_callback.is_valid(): + restored_callback.call() + return + if immediate: + _complete_conversation_camera_restore(restored_callback) + return + var yaw_target := _conversation_camera_snapshot.yaw_rotation + yaw_target.y = ( + _camera_yaw.rotation.y + + wrapf(yaw_target.y - _camera_yaw.rotation.y, -PI, PI) + ) + var generation := _conversation_camera_generation + var duration := maxf(conversation_camera_transition_seconds, 0.05) + _conversation_camera_tween = create_tween() + _conversation_camera_tween.set_parallel(true) + _conversation_camera_tween.set_trans(Tween.TRANS_QUAD) + _conversation_camera_tween.set_ease(Tween.EASE_IN_OUT) + _conversation_camera_tween.tween_property( + _camera_yaw, "rotation", yaw_target, duration + ) + _conversation_camera_tween.tween_property( + _camera_yaw, + "position", + _conversation_camera_snapshot.yaw_transform.origin, + duration, + ) + _conversation_camera_tween.tween_property( + _camera_pitch, + "rotation", + _conversation_camera_snapshot.pitch_rotation, + duration, + ) + _conversation_camera_tween.tween_property( + _spring_arm, + "spring_length", + _conversation_camera_snapshot.spring_length, + duration, + ) + _conversation_camera_tween.finished.connect( + _on_conversation_camera_restore_finished.bind( + generation, restored_callback + ) + ) + + +func is_shop_conversation_camera_active() -> bool: + return _conversation_camera_snapshot != null + + +func _kill_conversation_camera_tween() -> void: + if ( + _conversation_camera_tween != null + and _conversation_camera_tween.is_valid() + ): + _conversation_camera_tween.kill() + _conversation_camera_tween = null + _conversation_camera_generation += 1 + + +func _on_conversation_camera_restore_finished( + generation: int, + restored_callback: Callable, +) -> void: + if generation != _conversation_camera_generation: + return + _conversation_camera_tween = null + _complete_conversation_camera_restore(restored_callback) + + +func _complete_conversation_camera_restore( + restored_callback: Callable, +) -> void: + if _conversation_camera_snapshot != null: + _camera_yaw.transform = _conversation_camera_snapshot.yaw_transform + _camera_pitch.rotation = _conversation_camera_snapshot.pitch_rotation + _spring_arm.spring_length = _conversation_camera_snapshot.spring_length + _target_zoom = _conversation_camera_snapshot.target_zoom + _set_camera_dragging( + _conversation_camera_snapshot.camera_dragging + and Input.is_action_pressed("camera_drag") + ) + _conversation_camera_snapshot = null + if restored_callback.is_valid(): + restored_callback.call() + + func _set_target_zoom(value: float) -> void: _target_zoom = clampf( value, @@ -2526,7 +2738,7 @@ func apply_local_prediction_correction( ): _clear_local_network_jump_intent() if not _sitting_intent_pending: - _set_sitting(bool(parsed["sitting"])) + _apply_local_prediction_sitting_state(bool(parsed["sitting"])) var authoritative_position: Vector3 = parsed["position"] var transit_seconds: float = resolve_local_prediction_transit_seconds( acknowledged_input, @@ -3322,9 +3534,23 @@ func get_body_center_position() -> Vector3: func get_chat_anchor_position() -> Vector3: + return get_nameplate_anchor_position() + + +func get_nameplate_anchor_position() -> Vector3: + # Character head meshes keep stable authored bounds while skeletal animation + # plays. Restricting the anchor to them prevents rods, nets, held catches, + # and showcase props from making overhead UI bounce during an action. var highest_y := -INF - for node: Node in _visuals.find_children("*", "MeshInstance3D", true, false): - var mesh_instance := node as MeshInstance3D + var skeleton := get_node_or_null( + "Visuals/CharacterRig/CharacterRig/Skeleton3D" + ) as Skeleton3D + for head_name: String in ["head_round", "head_pointy"]: + var mesh_instance := ( + skeleton.get_node_or_null(head_name) as MeshInstance3D + if skeleton != null + else null + ) if mesh_instance == null or not mesh_instance.is_visible_in_tree(): continue var bounds := mesh_instance.get_aabb() diff --git a/progression/player_appearance_store.gd b/progression/player_appearance_store.gd index febe43d..cca4436 100644 --- a/progression/player_appearance_store.gd +++ b/progression/player_appearance_store.gd @@ -1,6 +1,8 @@ class_name PlayerAppearanceStore extends Node +signal appearance_changed + const FORMAT_VERSION: int = 1 var _snapshot: Dictionary = CharacterCustomizationCatalog.default_snapshot() var _loaded: bool = false @@ -70,11 +72,42 @@ func save_snapshot(value: Dictionary) -> bool: _snapshot = value.duplicate(true) if _save_atomic(): _loaded = true + if _snapshot != previous: + appearance_changed.emit() return true _snapshot = previous return false +func restore_from_save_data( + value: Variant, + persist_to_profile_file: bool = true, +) -> bool: + if ( + typeof(value) != TYPE_DICTIONARY + or not CharacterCustomizationCatalog.validate_snapshot(value) + ): + return false + var sanitized: Dictionary = ( + CharacterCustomizationCatalog.sanitized_snapshot(value) + ) + if persist_to_profile_file: + return save_snapshot(sanitized) + var previous: Dictionary = _snapshot.duplicate(true) + _snapshot = sanitized + _loaded = true + if _snapshot != previous: + appearance_changed.emit() + return true + + +func reset_to_defaults(persist_to_profile_file: bool = true) -> bool: + return restore_from_save_data( + CharacterCustomizationCatalog.default_snapshot(), + persist_to_profile_file, + ) + + func is_loaded() -> bool: return _loaded diff --git a/save/player_save_manager.gd b/save/player_save_manager.gd index c41f861..6383920 100644 --- a/save/player_save_manager.gd +++ b/save/player_save_manager.gd @@ -35,6 +35,13 @@ const WorldLayoutType = preload("res://world/world_layout.gd") const PlayerJobServiceType = preload("res://jobs/player_job_service.gd") const PlayerType = preload("res://player/player.gd") const PlayerHomeStateType = preload("res://homes/player_home_state.gd") +const DecorCatalogType = preload("res://homes/decor_catalog.gd") +const NetworkProfilePreferencesType = preload( + "res://network/network_profile_preferences.gd" +) +const PlayerAppearanceStoreType = preload( + "res://progression/player_appearance_store.gd" +) const SAVE_VERSION: int = 11 const LEGACY_SAVE_FILENAME := "player_save.json" @@ -78,6 +85,9 @@ class LoadSnapshot: ) var jobs_data: Dictionary = PlayerJobServiceType.default_save_data() var home_data: Dictionary = PlayerHomeStateType.default_save_data() + var has_character_data: bool = false + var character_profile_data: Dictionary = {} + var appearance_data: Dictionary = {} @export_range(0.05, 5.0, 0.05) var autosave_delay: float = 0.5 @@ -99,6 +109,9 @@ var _world_weather: WorldWeatherServiceType var _jobs: PlayerJobServiceType var _player: PlayerType var _home_state: PlayerHomeStateType +var _network_profile: NetworkProfilePreferencesType +var _appearance_store: PlayerAppearanceStoreType +var _legacy_character_data: Dictionary = {} var _autosave_timer: Timer var _is_configured: bool = false var _is_restoring: bool = false @@ -179,6 +192,8 @@ func setup( jobs: PlayerJobServiceType, player: PlayerType, home_state: PlayerHomeStateType, + network_profile: NetworkProfilePreferencesType = null, + appearance_store: PlayerAppearanceStoreType = null, ) -> void: _inventory = inventory _collection_log = collection_log @@ -197,6 +212,9 @@ func setup( _jobs = jobs _player = player _home_state = home_state + _network_profile = network_profile + _appearance_store = appearance_store + capture_legacy_character_fallback() _is_configured = ( _inventory != null and _collection_log != null @@ -263,6 +281,132 @@ func setup( _player.active_lure_changed.connect(_on_active_tackle_changed) if not _home_state.changed.is_connected(_mark_dirty): _home_state.changed.connect(_mark_dirty) + if ( + _network_profile != null + and not _network_profile.profile_changed.is_connected(_mark_dirty) + ): + _network_profile.profile_changed.connect(_mark_dirty) + if ( + _appearance_store != null + and not _appearance_store.appearance_changed.is_connected(_mark_dirty) + ): + _appearance_store.appearance_changed.connect(_mark_dirty) + + +func capture_legacy_character_fallback() -> void: + _legacy_character_data = _current_character_data() + + +func load_character_profile() -> bool: + if _network_profile == null or _appearance_store == null: + return true + _recover_interrupted_write() + var read_path: String = _read_path() + var previous_restoring: bool = _is_restoring + _is_restoring = true + if read_path.is_empty(): + var reset_ok: bool = _reset_character_profile() + _is_restoring = previous_restoring + return reset_ok + var decoded: Dictionary = ProgressionSaveCodec.read_local_save( + read_path, + read_path == _legacy_save_path(), + ) + if not bool(decoded.get("ok", false)): + _is_restoring = previous_restoring + return false + var save_data: Dictionary = decoded["data"] + var version: int = _read_integer(save_data.get("save_version"), -1) + if version < 1 or version > SAVE_VERSION: + _is_restoring = previous_restoring + return false + if version != SAVE_VERSION: + save_data = _migrate_save(save_data, version) + if save_data.is_empty(): + _is_restoring = previous_restoring + return false + var character: Dictionary = _character_data_from_save(save_data) + var restored: bool = ( + not character.is_empty() + and _restore_character_data(character) + ) + _is_restoring = previous_restoring + return restored + + +func _current_character_data() -> Dictionary: + if _network_profile == null or _appearance_store == null: + return {} + var profile: Dictionary = _network_profile.to_save_data() + var appearance: Dictionary = _appearance_store.get_snapshot() + if ( + not NetworkProfilePreferencesType.validate_save_data(profile) + or not CharacterCustomizationCatalog.validate_snapshot(appearance) + ): + return {} + return { + "profile": profile, + "appearance": appearance, + } + + +func _character_data_from_save(save_data: Dictionary) -> Dictionary: + if not save_data.has("character"): + return _legacy_character_data.duplicate(true) + if typeof(save_data.get("character")) != TYPE_DICTIONARY: + return {} + var character: Dictionary = save_data["character"] + if ( + not NetworkProfilePreferencesType.validate_save_data( + character.get("profile") + ) + or typeof(character.get("appearance")) != TYPE_DICTIONARY + or not CharacterCustomizationCatalog.validate_snapshot( + character.get("appearance") + ) + ): + return {} + return { + "profile": (character["profile"] as Dictionary).duplicate(true), + "appearance": CharacterCustomizationCatalog.sanitized_snapshot( + character["appearance"] + ), + } + + +func _restore_character_data(character: Dictionary) -> bool: + if _network_profile == null or _appearance_store == null: + return true + # The selected progression save is authoritative here. Applying it must not + # rewrite the compatibility profile mirrors: their guarded writes may be + # stale after a Syncthing edit, and that must not make a valid slot unloadable. + var previous_profile: Dictionary = _network_profile.to_save_data() + var previous_appearance: Dictionary = _appearance_store.get_snapshot() + if not _network_profile.restore_from_save_data( + character.get("profile"), false + ): + return false + if _appearance_store.restore_from_save_data( + character.get("appearance"), false + ): + return true + _network_profile.restore_from_save_data(previous_profile, false) + _appearance_store.restore_from_save_data(previous_appearance, false) + return false + + +func _reset_character_profile() -> bool: + if _network_profile == null or _appearance_store == null: + return true + var previous_profile: Dictionary = _network_profile.to_save_data() + var previous_appearance: Dictionary = _appearance_store.get_snapshot() + if not _network_profile.reset_to_defaults(false): + return false + if _appearance_store.reset_to_defaults(false): + return true + _network_profile.restore_from_save_data(previous_profile, false) + _appearance_store.restore_from_save_data(previous_appearance, false) + return false func load_player_data() -> bool: @@ -315,6 +459,12 @@ func load_player_data() -> bool: return false _is_restoring = true + var character_restored: bool = true + if snapshot.has_character_data: + character_restored = _restore_character_data({ + "profile": snapshot.character_profile_data, + "appearance": snapshot.appearance_data, + }) var inventory_restored: bool = _inventory.replace_all_catches( snapshot.catches, snapshot.next_catch_sequence @@ -390,13 +540,14 @@ func load_player_data() -> bool: or not world_weather_restored or not jobs_restored or not home_restored + or not character_restored ): push_error( ( "Validated player save could not be restored: " + "inventory=%s collection=%s wallet=%s bag=%s tackle=%s hotbar=%s " + "upgrades=%s cooler=%s layout=%s art=%s experience=%s " - + "time=%s weather=%s jobs=%s home=%s" + + "time=%s weather=%s jobs=%s home=%s character=%s" ) % [ inventory_restored, @@ -414,6 +565,7 @@ func load_player_data() -> bool: world_weather_restored, jobs_restored, home_restored, + character_restored, ] ) return false @@ -669,6 +821,7 @@ func copy_progression_to_path( func initialize_new_game( world_seed: int = DEFAULT_WORLD_SEED, world_layout: StringName = WorldLayoutType.GENERATED, + reset_character_profile: bool = true, ) -> bool: if not _is_configured: return false @@ -679,6 +832,12 @@ func initialize_new_game( ): return false _automatic_saving_blocked = false + if reset_character_profile: + _is_restoring = true + var character_reset: bool = _reset_character_profile() + _is_restoring = false + if not character_reset: + return false _restore_defaults() _world_layout = world_layout _world_seed = world_seed @@ -872,7 +1031,7 @@ func _build_save_dictionary() -> Dictionary: ): return {} - return { + var save_data: Dictionary = { "save_version": SAVE_VERSION, "wallet": { "balance": _wallet.get_balance(), @@ -916,6 +1075,12 @@ func _build_save_dictionary() -> Dictionary: "jobs": _jobs.to_save_data(), "home": _home_state.to_save_data(), } + var character: Dictionary = _current_character_data() + if _network_profile != null and _appearance_store != null: + if character.is_empty(): + return {} + save_data["character"] = character + return save_data func _build_load_snapshot(save_data: Dictionary) -> LoadSnapshot: @@ -998,6 +1163,17 @@ func _build_load_snapshot(save_data: Dictionary) -> LoadSnapshot: return null var snapshot := LoadSnapshot.new() + var character: Dictionary = _character_data_from_save(save_data) + if save_data.has("character") and character.is_empty(): + return null + if not character.is_empty(): + snapshot.has_character_data = true + snapshot.character_profile_data = ( + character["profile"] as Dictionary + ).duplicate(true) + snapshot.appearance_data = ( + character["appearance"] as Dictionary + ).duplicate(true) if world_data.has("layout"): if not WorldLayoutType.is_valid(world_data["layout"]): return null @@ -1208,7 +1384,12 @@ func _build_load_snapshot(save_data: Dictionary) -> LoadSnapshot: ) continue var maximum: int = ( - item_data.max_stack if item_data.stackable else 1 + mini( + item_data.max_stack, + DecorCatalogType.MAX_OWNED_PER_PRODUCT, + ) + if DecorCatalogType.has_product(item_id) + else item_data.max_stack if item_data.stackable else 1 ) if quantity > maximum: push_warning( diff --git a/save/player_save_slot_catalog.gd b/save/player_save_slot_catalog.gd index d3b9d23..f96293b 100644 --- a/save/player_save_slot_catalog.gd +++ b/save/player_save_slot_catalog.gd @@ -14,6 +14,7 @@ var _manifest_path := "" var _slots_directory := "" var _slots: Array[Dictionary] = [] var _active_slot_id := "" +var _online_slot_id := "" var _expected_hash := "" var _error_message := "" @@ -30,6 +31,7 @@ func configure( _slots_directory = data_root.root_path.path_join("player/saves") _slots.clear() _active_slot_id = "" + _online_slot_id = "" _expected_hash = "" _error_message = "" if DirAccess.make_dir_recursive_absolute(_slots_directory) != OK: @@ -43,13 +45,17 @@ func configure( return false var slot_count_before_discovery: int = _slots.size() var active_before_discovery: String = _active_slot_id + var online_before_discovery: String = _online_slot_id _discover_untracked_saves() if _active_slot_id.is_empty() and not _slots.is_empty(): _active_slot_id = str(_slots.front().get("slot_id", "")) + if _online_slot_id.is_empty() and not _slots.is_empty(): + _online_slot_id = _active_slot_id if ( not loaded or _slots.size() != slot_count_before_discovery or _active_slot_id != active_before_discovery + or _online_slot_id != online_before_discovery ): if not _save_manifest(): return false @@ -86,6 +92,24 @@ func get_active_slot_id() -> String: return _active_slot_id +func get_online_slot_id() -> String: + return _online_slot_id + + +func mark_slot_for_online(slot_id: String) -> bool: + if _find_slot(slot_id).is_empty(): + return false + if _online_slot_id == slot_id: + return true + var previous: String = _online_slot_id + _online_slot_id = slot_id + if not _save_manifest(): + _online_slot_id = previous + return false + slots_changed.emit() + return true + + func has_slots() -> bool: return not _slots.is_empty() @@ -102,6 +126,26 @@ func ensure_active_slot() -> Dictionary: return {"ok": true, "slot_id": slot_id} +func ensure_online_slot() -> Dictionary: + var slot_id: String = _online_slot_id + if slot_id.is_empty() or _find_slot(slot_id).is_empty(): + var active: Dictionary = ensure_active_slot() + if not bool(active.get("ok", false)): + return active + slot_id = str(active.get("slot_id", "")) + if not mark_slot_for_online(slot_id): + return { + "ok": false, + "message": "the online progression could not be selected.", + } + if _active_slot_id != slot_id and not activate_slot(slot_id): + return { + "ok": false, + "message": "the online progression could not be opened.", + } + return {"ok": true, "slot_id": slot_id} + + func create_empty_slot(display_name: String) -> Dictionary: if _slots.size() >= MAX_SLOTS: return {"ok": false, "message": "the maximum number of save slots has been reached."} @@ -117,8 +161,12 @@ func create_empty_slot(display_name: String) -> Dictionary: "last_played_at_unix": 0, "legacy": false, }) + var previous_online: String = _online_slot_id + if _online_slot_id.is_empty(): + _online_slot_id = slot_id if not _save_manifest(): _slots.pop_back() + _online_slot_id = previous_online return {"ok": false, "message": "the save-slot catalog could not be updated."} slots_changed.emit() return {"ok": true, "slot_id": slot_id} @@ -267,6 +315,7 @@ func delete_slot(slot_id: String) -> bool: for previous_entry: Dictionary in _slots: previous_slots.append(previous_entry.duplicate(true)) var previous_active: String = _active_slot_id + var previous_online: String = _online_slot_id var entry: Dictionary = _slots[index] var source_path: String = _existing_slot_path(entry) var preserved_path := "" @@ -281,9 +330,18 @@ func delete_slot(slot_id: String) -> bool: if not _slots.is_empty() else "" ) + if _online_slot_id == slot_id: + _online_slot_id = ( + _active_slot_id + if not _active_slot_id.is_empty() + else str(_slots.front().get("slot_id", "")) + if not _slots.is_empty() + else "" + ) if not _select_configured_storage() or not _save_manifest(): _slots = previous_slots _active_slot_id = previous_active + _online_slot_id = previous_online _select_configured_storage() if not preserved_path.is_empty(): _rename_file(preserved_path, source_path) @@ -315,6 +373,7 @@ func _build_slot_summary(entry: Dictionary) -> Dictionary: path.ends_with(".json"), ) summary["active"] = str(entry.get("slot_id", "")) == _active_slot_id + summary["online"] = str(entry.get("slot_id", "")) == _online_slot_id summary["has_save"] = inspection.can_continue() summary["save_status"] = inspection.status summary["status_message"] = inspection.message @@ -360,6 +419,9 @@ func _load_manifest() -> bool: _active_slot_id = str(data.get("active_slot_id", "")) if not _active_slot_id.is_empty() and not seen_ids.has(_active_slot_id): _active_slot_id = "" + _online_slot_id = str(data.get("online_slot_id", "")) + if not _online_slot_id.is_empty() and not seen_ids.has(_online_slot_id): + _online_slot_id = "" _expected_hash = PortableFileGuard.hash_file(_manifest_path) return true @@ -368,6 +430,7 @@ func _save_manifest() -> bool: var data: Dictionary = { "format_version": FORMAT_VERSION, "active_slot_id": _active_slot_id, + "online_slot_id": _online_slot_id, "slots": _slots, } var result: Dictionary = PortableFileGuard.write_guarded( @@ -576,6 +639,7 @@ func _preserve_invalid_manifest() -> bool: _expected_hash = "" _slots.clear() _active_slot_id = "" + _online_slot_id = "" return true diff --git a/scripts/run_validations.sh b/scripts/run_validations.sh index 8bae718..f71cb60 100755 --- a/scripts/run_validations.sh +++ b/scripts/run_validations.sh @@ -44,6 +44,7 @@ readonly -a QUICK_TESTS=( "tests/on_screen_keyboard_validation.gd" "tests/player_gathering_animation_validation.gd" "tests/player_experience_validation.gd" + "tests/profile_title_validation.gd" "tests/shoreline_ambience_validation.gd" "tests/surface_drawing_validation.gd" "tests/surface_drawing_performance_validation.gd" @@ -54,6 +55,7 @@ readonly -a QUICK_TESTS=( "tests/terrain_chunk_generator_validation.gd" "tests/texture_sampling_validation.gd" "tests/tree_gathering_prototype_validation.gd" + "tests/tooltip_escape_validation.gd" "tests/unified_inventory_validation.gd" "tests/world_time_validation.gd" "tests/world_layout_validation.gd" @@ -80,6 +82,7 @@ readonly -a HOST_TESTS=( "tests/inventory_storage_persistence_validation.gd" "tests/job_system_validation.gd" "tests/progression_archive_validation.gd" + "tests/save_reload_conflict_validation.gd" "tests/surface_drawing_runtime_validation.gd" ) diff --git a/tests/art_tools_validation.gd b/tests/art_tools_validation.gd index 146fb4e..8ae45bf 100644 --- a/tests/art_tools_validation.gd +++ b/tests/art_tools_validation.gd @@ -409,7 +409,17 @@ func _run() -> void: # not the inactive normal gameplay camera. var normal_camera := player.get_gameplay_camera() var normal_camera_transform: Transform3D = normal_camera.global_transform - var chat_anchor: Vector3 = player.get_chat_anchor_position() + var chat_anchor: Vector3 = player.get_nameplate_anchor_position() + assert(player.get_chat_anchor_position().is_equal_approx(chat_anchor)) + var held_gear_probe := MeshInstance3D.new() + var held_gear_mesh := BoxMesh.new() + held_gear_mesh.size = Vector3(0.5, 4.0, 0.5) + held_gear_probe.mesh = held_gear_mesh + held_gear_probe.position = Vector3(0.0, 6.0, 0.0) + player.get_node("%Visuals").add_child(held_gear_probe) + assert(player.get_nameplate_anchor_position().is_equal_approx(chat_anchor)) + assert(player.get_chat_anchor_position().is_equal_approx(chat_anchor)) + held_gear_probe.free() normal_camera.look_at( normal_camera.global_position - (chat_anchor - normal_camera.global_position), @@ -417,6 +427,120 @@ func _run() -> void: ) assert(normal_camera.is_position_behind(chat_anchor)) assert(not free_camera.is_position_behind(chat_anchor)) + free_camera.look_at(chat_anchor, Vector3.UP) + chat_ui.call("_update_nameplates") + var nameplate_layer := chat_ui.get("_nameplate_layer") as Control + var nameplates: Dictionary = chat_ui.get("_nameplates") + var local_nameplate: Dictionary = nameplates.get( + session.get_local_peer_id(), {} + ) + var nameplate_control := local_nameplate.get("control") as Control + var nameplate_name := local_nameplate.get("name") as Label + var nameplate_title := local_nameplate.get("title") as Label + var local_record := session.get_peer_record(session.get_local_peer_id()) + assert( + nameplate_control != null and nameplate_control.visible, + ( + "local nameplate must be visible (available=%s world=%s layer=%s " + + "shared=%s remote_visible=%s behind=%s occluded=%s screen=%s viewport=%s)" + ) + % [ + bool(chat_ui.get("_available")), + chat_ui.is_world_speech_visible(), + nameplate_layer.visible, + bool(chat_ui.call( + "_speaker_shares_local_space", session.get_local_peer_id() + )), + player.is_remote_presentation_visible(), + free_camera.is_position_behind(chat_anchor), + bool(chat_ui.call( + "_is_speech_world_occluded", free_camera, player, chat_anchor + )), + free_camera.unproject_position(chat_anchor) + / float(chat_ui.get("_output_scale")), + chat_ui.get_viewport_rect().size, + ], + ) + assert(nameplate_name != null and nameplate_title != null) + assert(nameplate_name.text == local_record.display_name) + assert(nameplate_title.text == local_record.title) + assert( + nameplate_name.get_theme_font_size("font_size") + == ChatUI.NAMEPLATE_NAME_FONT_SIZE + ) + assert( + nameplate_title.get_theme_font_size("font_size") + == ChatUI.NAMEPLATE_TITLE_FONT_SIZE + ) + assert( + nameplate_name.get_theme_font_size("font_size") + > nameplate_title.get_theme_font_size("font_size") + ) + assert(ChatUI.NAMEPLATE_NAME_FONT_SIZE == 20) + assert(ChatUI.NAMEPLATE_TITLE_TOP < ChatUI.NAMEPLATE_NAME_HEIGHT) + assert(ChatUI.NAMEPLATE_HEIGHT < 42.0) + assert(nameplate_title.position.y == ChatUI.NAMEPLATE_TITLE_TOP) + for flat_label: Label in [nameplate_name, nameplate_title]: + assert(flat_label.get_theme_color("font_color") == Color.WHITE) + assert(flat_label.get_theme_constant("outline_size") == 0) + assert(flat_label.get_theme_color("font_outline_color").a == 0.0) + assert(flat_label.get_theme_color("font_shadow_color").a == 0.0) + + # Persistent remote labels obey both the authoritative home-space boundary + # and the avatar presentation mask. They return only when the avatar shares + # the local space and its world presentation is visible. + var spawn_service := main.get_node( + "%PlayerSpawnService" + ) as PlayerSpawnService + var registry := session.get("_registry") as PeerRegistry + const NAMEPLATE_TEST_PEER_ID: int = 9191 + assert(registry.add_peer( + NAMEPLATE_TEST_PEER_ID, + "nameplate-test-profile", + "remote stray", + NetworkProtocol.PROTOCOL_VERSION, + "", + "", + PackedStringArray(), + "trailblazer", + )) + var remote_transform: Transform3D = player.global_transform + remote_transform.origin += Vector3(0.8, 0.0, 0.0) + var remote_avatar := spawn_service.spawn_remote_player( + NAMEPLATE_TEST_PEER_ID, + remote_transform, + ) + assert(remote_avatar != null) + assert(session.set_peer_space(NAMEPLATE_TEST_PEER_ID, &"rv:privacy-test")) + remote_avatar.set_remote_presentation_visible(true) + chat_ui.call("_update_nameplates") + var remote_nameplate: Dictionary = nameplates.get( + NAMEPLATE_TEST_PEER_ID, {} + ) + var remote_plate := remote_nameplate.get("control") as Control + assert(remote_plate != null and not remote_plate.visible) + assert(session.set_peer_space( + NAMEPLATE_TEST_PEER_ID, + session.get_peer_space(session.get_local_peer_id()), + )) + remote_avatar.set_remote_presentation_visible(false) + chat_ui.call("_update_nameplates") + assert(not remote_plate.visible) + remote_avatar.set_remote_presentation_visible(true) + free_camera.look_at( + remote_avatar.get_nameplate_anchor_position(), Vector3.UP + ) + chat_ui.call("_update_nameplates") + assert(remote_plate.visible) + assert((remote_nameplate.get("name") as Label).text == "remote stray") + assert((remote_nameplate.get("title") as Label).text == "trailblazer") + spawn_service.remove_peer(NAMEPLATE_TEST_PEER_ID) + registry.remove_peer(NAMEPLATE_TEST_PEER_ID) + chat_ui.call("_update_nameplates") + assert(not nameplates.has(NAMEPLATE_TEST_PEER_ID)) + free_camera.look_at(chat_anchor, Vector3.UP) + chat_ui.call("_update_nameplates") + assert(nameplate_control.visible) var shop_prompt := game_ui.get_node("%ShopPrompt") as Control var storage_prompt := game_ui.get_node("%StoragePrompt") as Control game_ui.set_shop_prompt_visible(true, chat_anchor) @@ -432,11 +556,19 @@ func _run() -> void: assert(not first_speech_mouth.is_empty()) assert(not second_speech_mouth.is_empty()) assert(first_speech_mouth != second_speech_mouth) + free_camera.look_at(chat_anchor, Vector3.UP) + chat_ui.call("_update_nameplates") chat_ui.call("_update_speech") var speech: Dictionary = chat_ui.get("_speech") var local_speech: Dictionary = speech.get(session.get_local_peer_id(), {}) var speech_bubble := local_speech.get("bubble") as PanelContainer assert(speech_bubble != null and speech_bubble.visible) + assert( + speech_bubble.position.y + + speech_bubble.size.y + + ChatUI.SPEECH_POINTER_HEIGHT + <= nameplate_control.position.y + ) normal_camera.global_transform = normal_camera_transform await create_timer(0.6).timeout assert(not bool(player.get("_speech_mouth_active"))) @@ -448,6 +580,7 @@ func _run() -> void: await process_frame assert(game_ui.is_gameplay_hud_hidden()) assert(chat_ui.is_hud_hidden()) + assert(not nameplate_layer.visible) assert(not ( game_ui.get_node("%GameplayTransientHUD") as Control ).visible) @@ -479,6 +612,8 @@ func _run() -> void: chat_ui.open_chat() await process_frame assert(chat_ui.is_open() and chat_panel.visible) + assert(not chat_ui.is_hud_hidden()) + assert(not nameplate_layer.visible) chat_ui.refocus_gameplay() assert(chat_ui.is_hud_hidden()) var cancel_button := InputEventJoypadButton.new() @@ -503,6 +638,7 @@ func _run() -> void: await process_frame assert(not game_ui.is_gameplay_hud_hidden()) assert(not chat_ui.is_hud_hidden()) + assert(nameplate_layer.visible) assert(not service.can_activate()) assert(not service.is_active() and not toolbar.visible) assert(player.bag.add_item(ArtShopStock.ART_KIT_ITEM_ID, 1)) diff --git a/tests/chat_privacy_multiplayer_validation.gd b/tests/chat_privacy_multiplayer_validation.gd index e1d6f87..75972b6 100644 --- a/tests/chat_privacy_multiplayer_validation.gd +++ b/tests/chat_privacy_multiplayer_validation.gd @@ -4,6 +4,8 @@ const MainScene: PackedScene = preload("res://main/main.tscn") const TEST_PORT: int = 18152 const PREJOIN_MESSAGE: String = "private prejoin message" const LIVE_MESSAGE: String = "live message after join" +const HOST_ROLEPLAY: String = "/me grabs [b]his fishing rod[/b]" +const CLIENT_ROLEPLAY: String = "/me waves [color=red]hello[/color]" func _initialize() -> void: @@ -39,11 +41,34 @@ func _run_host() -> void: var chat_service := main.get_node( "%NetworkChatService" ) as NetworkChatService + assert(not chat_service.send_local_message("/me")) assert(chat_service.send_local_message(PREJOIN_MESSAGE)) var remote_peer_id: int = await _wait_for_remote_peer(session) assert(remote_peer_id > 1) await create_timer(1.0).timeout assert(chat_service.send_local_message(LIVE_MESSAGE)) + assert(chat_service.send_local_message(HOST_ROLEPLAY)) + var client_roleplay_deadline: int = Time.get_ticks_msec() + 8000 + while ( + Time.get_ticks_msec() < client_roleplay_deadline + and not _history_contains(chat_service, CLIENT_ROLEPLAY) + ): + await process_frame + assert(_history_contains(chat_service, CLIENT_ROLEPLAY)) + var client_roleplay: Dictionary = _history_message( + chat_service, CLIENT_ROLEPLAY + ) + assert(int(client_roleplay.get("sender_peer_id", 0)) == remote_peer_id) + assert( + str(client_roleplay.get("sender_display_name", "")) + == session.get_peer_record(remote_peer_id).display_name + ) + _assert_roleplay_rendered( + main, + str(client_roleplay["sender_display_name"]), + "waves [color=red]hello[/color]", + ) + _assert_no_world_speech(main, remote_peer_id) var disconnect_deadline: int = Time.get_ticks_msec() + 8000 while ( Time.get_ticks_msec() < disconnect_deadline @@ -75,11 +100,39 @@ func _run_client() -> void: var live_deadline: int = Time.get_ticks_msec() + 8000 while ( Time.get_ticks_msec() < live_deadline - and not _history_contains(chat_service, LIVE_MESSAGE) + and ( + not _history_contains(chat_service, LIVE_MESSAGE) + or not _history_contains(chat_service, HOST_ROLEPLAY) + ) ): await process_frame assert(_history_contains(chat_service, LIVE_MESSAGE)) + assert(_history_contains(chat_service, HOST_ROLEPLAY)) assert(not _history_contains(chat_service, PREJOIN_MESSAGE)) + var host_roleplay: Dictionary = _history_message( + chat_service, HOST_ROLEPLAY + ) + var host_peer_id: int = int(host_roleplay.get("sender_peer_id", 0)) + assert(host_peer_id > 0) + assert( + str(host_roleplay.get("sender_display_name", "")) + == session.get_peer_record(host_peer_id).display_name + ) + _assert_roleplay_rendered( + main, + str(host_roleplay["sender_display_name"]), + "grabs [b]his fishing rod[/b]", + ) + _assert_world_speech_body(main, host_peer_id, LIVE_MESSAGE) + assert(chat_service.send_local_message(CLIENT_ROLEPLAY)) + var confirmation_deadline: int = Time.get_ticks_msec() + 8000 + while ( + Time.get_ticks_msec() < confirmation_deadline + and not _history_contains(chat_service, CLIENT_ROLEPLAY) + ): + await process_frame + assert(_history_contains(chat_service, CLIENT_ROLEPLAY)) + _assert_no_world_speech(main, session.get_local_peer_id()) print("Chat privacy multiplayer client validation: PASS") await _session_cleanup(main, session) @@ -91,6 +144,59 @@ func _history_contains(service: NetworkChatService, body: String) -> bool: ) +func _history_message( + service: NetworkChatService, + body: String, +) -> Dictionary: + for message: Dictionary in service.get_history(): + if str(message.get("body", "")) == body: + return message + return {} + + +func _assert_roleplay_rendered( + main: Node, + display_name: String, + action: String, +) -> void: + var chat_ui := main.get_node("%GameUI").get_node("%ChatUI") as ChatUI + var history := chat_ui.get("_history") as RichTextLabel + assert(history != null) + var expected: String = "%s %s" % [display_name, action] + assert(history.get_parsed_text().contains(expected)) + assert(not history.get_parsed_text().contains( + "%s: /me" % display_name + )) + assert(not history.bbcode_enabled) + var italic_font := history.get_theme_font("italics_font") as FontVariation + assert(italic_font != null) + assert(not is_zero_approx(italic_font.variation_transform.y.x)) + + +func _assert_no_world_speech(main: Node, peer_id: int) -> void: + var chat_ui := main.get_node("%GameUI").get_node("%ChatUI") as ChatUI + var speech: Dictionary = chat_ui.get("_speech") + assert(not speech.has(peer_id)) + + +func _assert_world_speech_body( + main: Node, + peer_id: int, + expected_body: String, +) -> void: + var chat_ui := main.get_node("%GameUI").get_node("%ChatUI") as ChatUI + var speech: Dictionary = chat_ui.get("_speech") + assert(speech.has(peer_id)) + var state: Dictionary = speech[peer_id] + var bubble := state.get("bubble") as PanelContainer + assert(bubble != null) + for child: Node in bubble.get_children(): + if child is Label: + assert((child as Label).text == expected_body) + return + assert(false, "Speech bubble label is missing.") + + func _create_initialized_main() -> Node: root.size = Vector2i(1280, 720) var main: Node = MainScene.instantiate() diff --git a/tests/controller_menu_accessibility_validation.gd b/tests/controller_menu_accessibility_validation.gd index 283290a..a29e3ee 100644 --- a/tests/controller_menu_accessibility_validation.gd +++ b/tests/controller_menu_accessibility_validation.gd @@ -187,6 +187,19 @@ func _validate_primary_menu_navigation() -> void: ) for title_control: Control in title_controls: _assert_directionally_reachable(title_control, title_controls) + var version_row := title.get_node("%VersionRow") as Control + title.call("_on_continue_pressed") + await process_frame + _expect( + not version_row.visible, + "The title version remains visible behind the Save Slots panel.", + ) + title.call("_close_save_slots") + await process_frame + _expect( + version_row.visible, + "The title version was not restored after closing Save Slots.", + ) title.queue_free() await process_frame @@ -221,7 +234,17 @@ func _validate_save_slots_navigation() -> void: await create_timer(0.25).timeout var saves_tab := page.get_node("%SavesTab") as Button var new_tab := page.get_node("%NewSlotTab") as Button + var main_panel := page.get_node("%MainPanel") as PanelContainer var content_panel := page.get_node("%ContentPanel") as PanelContainer + var back_button := page.get_node("%BackButton") as Button + _expect( + main_panel.size.is_equal_approx(Vector2(880.0, 660.0)), + "Save Slots changed the fixed 880 by 660 outer panel size.", + ) + _expect( + main_panel.get_global_rect().encloses(back_button.get_global_rect()), + "The Save Slots Back button extends beyond the outer panel.", + ) var tab_overlap: float = ( saves_tab.get_global_rect().end.y - content_panel.get_global_rect().position.y @@ -258,6 +281,40 @@ func _validate_save_slots_navigation() -> void: var duplicate_slot := page.get_node("%DuplicateSlotButton") as Button var export_slot := page.get_node("%ExportSlotButton") as Button var delete_slot := page.get_node("%DeleteSlotButton") as Button + var slot_summary := page.get_node("%SlotSummary") as RichTextLabel + slot_summary.text = str(page.call("_format_slot_summary", { + "has_save": true, + "player_level": 100, + "catch_count": 9999, + "discovered_species_count": 999, + "wallet_balance": 999999, + "world_layout": &"generated", + "world_seed": 2147483647, + "last_played_at_unix": 1788282000, + })) + for _frame: int in 2: + await process_frame + var content_rect: Rect2 = content_panel.get_global_rect() + for control: Control in [ + import_button, + page.get_node("%SelectedSlotName") as Control, + slot_summary, + page.get_node("%OnlineSlotButton") as Control, + play_slot, + rename_slot, + duplicate_slot, + export_slot, + delete_slot, + ]: + _expect( + content_rect.encloses(control.get_global_rect()), + "Save-slot control %s extends beyond the content panel." + % control.name, + ) + _expect( + content_rect.end.y <= back_button.get_global_rect().position.y, + "Save-slot content overlaps the Back button.", + ) _expect( saves_tab.find_valid_focus_neighbor(SIDE_BOTTOM) == import_button, "An empty Save Slots page does not lead from its tab to Import Save.", @@ -960,6 +1017,18 @@ func _validate_profile_confirmation_focus() -> void: page.call("set_interactive", true) page.call("reset_controller_zone") var name_edit := page.get("_name_edit") as LineEdit + var customize := page.get("_customize_button") as Button + for _frame: int in 2: + await process_frame + _expect( + root.gui_get_focus_owner() == customize, + "Opening Profile activated the player-name field instead of its " + + "non-text customization action.", + ) + _expect( + not name_edit.has_focus(), + "Opening Profile activated the player-name field without user input.", + ) name_edit.grab_focus() page.call("_on_name_changed", "V") _expect( diff --git a/tests/controller_world_interaction_validation.gd b/tests/controller_world_interaction_validation.gd index 3d684cb..bc102c5 100644 --- a/tests/controller_world_interaction_validation.gd +++ b/tests/controller_world_interaction_validation.gd @@ -49,12 +49,16 @@ func _run() -> void: var player := main.get("_player") as Player var interaction := main.get("_shop_interaction") as FishingShopInteraction + var decor_interaction := main.get( + "_decor_shop_interaction" + ) as DecorShopInteraction var game_ui := main.get("_game_ui") as GameUI var chat_service := main.get_node( "%NetworkChatService" ) as NetworkChatService _expect(player != null, "local player is unavailable") _expect(interaction != null, "shop interaction is unavailable") + _expect(decor_interaction != null, "decor interaction is unavailable") _expect(game_ui != null, "game UI is unavailable") _expect(chat_service != null, "network chat service is unavailable") if ( @@ -70,6 +74,136 @@ func _run() -> void: interaction.is_local_player_in_range(), "local player did not enter the shop interaction range", ) + var shop_prompt := game_ui.get_node("%ShopPrompt") as Control + var shop_message := game_ui.get_node("%ShopPromptMessage") as Label + _expect( + not bool(game_ui.get("_shop_npc_dialogue_active")) + and not shop_message.visible, + "shopkeeper spoke before the player initiated conversation", + ) + _expect( + shop_prompt.size == Vector2(30.0, 30.0), + "nearby shop prompt was not reduced to the compact interaction glyph", + ) + var fixed_area_transform := interaction.global_transform + var shopkeeper := interaction.get_node("../Shopkeeper") as WorldCharacterDisplay + var shopkeeper_start := shopkeeper.position + var camera_yaw := player.get_node("CameraYaw") as Node3D + var camera_pitch := player.get_node("CameraYaw/CameraPitch") as Node3D + var spring_arm := player.get_node( + "CameraYaw/CameraPitch/SpringArm3D" + ) as SpringArm3D + var initial_camera_yaw_transform := camera_yaw.transform + var initial_camera_pitch := camera_pitch.rotation + var initial_spring_length := spring_arm.spring_length + # Route planning treats the player as a live obstacle. Move the validation + # avatar clear before forcing an ambient patrol leg. + player.global_position = interaction.global_position + Vector3(20.0, 0.0, 0.0) + interaction.call("_refresh_local_player_proximity") + interaction.call("_choose_roaming_destination") + var roaming_destination: Vector3 = interaction.get( + "_roaming_destination" + ) + var safe_route: Dictionary = interaction.call( + "_resolve_safe_route_destination", + roaming_destination, + ) + _expect( + not safe_route.is_empty(), + "shopkeeper accepted a destination that failed its terrain route probe", + ) + var initial_route_offset := roaming_destination - shopkeeper.position + shopkeeper.rotation.y = ( + atan2(initial_route_offset.x, initial_route_offset.z) + PI + ) + interaction.call("_process", 0.05) + _expect( + shopkeeper.position.is_equal_approx(shopkeeper_start) + and not shopkeeper.is_locomotion_walking(), + "shopkeeper translated before finishing its turn-in-place", + ) + # A patrol leg deliberately starts by turning in place. Advance in small + # slices until the body is aligned and translation begins. + for _turn_frame: int in 20: + interaction.call("_process", 0.05) + if shopkeeper.position.distance_to(shopkeeper_start) > 0.001: + break + _expect( + interaction.global_transform.is_equal_approx(fixed_area_transform), + "ambient shopkeeper roaming moved the authoritative interaction area", + ) + _expect( + shopkeeper.position.distance_to(shopkeeper_start) > 0.001 + and shopkeeper.is_locomotion_walking(), + "shopkeeper did not walk toward an ambient roaming destination", + ) + var roaming_direction := ( + shopkeeper.position - shopkeeper_start + ).normalized() + var roaming_origin: Vector3 = interaction.get("_roaming_origin") + _expect( + roaming_destination.distance_to(shopkeeper_start) + >= interaction.minimum_route_distance + and roaming_destination.distance_to(shopkeeper_start) + <= interaction.maximum_route_distance + 0.001 + and roaming_destination.distance_to(roaming_origin) + <= interaction.roaming_radius + 0.001 + and shopkeeper.basis.z.normalized().dot(roaming_direction) > 0.95, + ( + "shopkeeper patrol leg was unsafe, too short, or did not face " + + "its travel direction" + ), + ) + + # Ambient visuals may roam well beyond their original compact trigger, but + # the trigger itself must remain fixed for multiplayer authority. Local UI + # eligibility follows the moving character, while the host validates a + # conservative authored-origin envelope that covers the full patrol. + var captured_roaming_origin: Vector3 = interaction.get( + "_roaming_origin" + ) + interaction.roaming_enabled = false + shopkeeper.position = captured_roaming_origin + Vector3(2.6, 0.0, 0.0) + interaction.setup_local_player(player) + _expect( + (interaction.get("_roaming_origin") as Vector3).is_equal_approx( + captured_roaming_origin + ), + "rebinding the player recaptured a wandered position as the patrol origin", + ) + player.global_position = shopkeeper.global_position + Vector3(1.4, 0.0, 0.0) + interaction.call("_refresh_local_player_proximity") + _expect( + interaction.is_local_player_in_range() + and interaction.is_avatar_in_range(player), + "moving-shopkeeper reach was not covered locally and authoritatively", + ) + player.global_position = interaction.call("_get_roaming_origin_global") + interaction.call("_refresh_local_player_proximity") + _expect( + not interaction.is_local_player_in_range() + and interaction.is_avatar_in_range(player), + "local proximity still followed the fixed authored Area3D", + ) + var authority_radius := interaction.get_authority_interaction_radius() + player.global_position = ( + interaction.call("_get_roaming_origin_global") + + Vector3(authority_radius + 0.1, 0.0, 0.0) + ) + _expect( + not interaction.is_avatar_in_range(player), + "shop authority accepted a player beyond the fixed patrol envelope", + ) + shopkeeper.position = shopkeeper_start + interaction.roaming_enabled = true + player.global_position = ( + shopkeeper.global_position + Vector3(0.0, 0.0, -1.0) + ) + interaction.call("_refresh_local_player_proximity") + _expect( + interaction.global_transform.is_equal_approx(fixed_area_transform), + "proximity validation moved the authoritative interaction area", + ) var character_calls: Array[String] = [] var capture_call := func( _peer_id: int, @@ -94,12 +228,57 @@ func _run() -> void: main.call("_unhandled_input", press) await process_frame _expect( - game_ui.get_fishing_shop().visible, - "Y did not open the shop while the player was in range", + not game_ui.get_fishing_shop().visible + and main.get("_engaged_shop_npc_interaction") == interaction + and interaction.is_engaged(), + "first Y press did not enter shopkeeper dialogue without opening", + ) + _expect( + bool(game_ui.get("_shop_npc_dialogue_active")) + and shop_message.visible + and shop_message.text == FishingShopInteraction.DIALOGUE_TEXT, + "engaged shopkeeper dialogue was not presented", + ) + _expect( + not bool(player.call("_is_movement_input_enabled")) + and not bool(player.call("_is_camera_input_enabled")) + and player.is_shop_conversation_camera_active(), + "shopkeeper dialogue did not lock movement and hold its camera frame", ) _expect( character_calls.is_empty(), - "Y played a character call instead of opening the shop", + "Y played a character call instead of starting shopkeeper dialogue", + ) + await create_timer(0.5).timeout + var player_to_shopkeeper := ( + shopkeeper.global_position - player.global_position + ) + player_to_shopkeeper.y = 0.0 + player_to_shopkeeper = player_to_shopkeeper.normalized() + _expect( + camera_yaw.global_basis.x.normalized().dot(player_to_shopkeeper) + > 0.9 + and spring_arm.spring_length < initial_spring_length, + "conversation camera did not frame player-left and NPC-right", + ) + _expect( + shopkeeper.global_basis.z.normalized().dot( + (player.global_position - shopkeeper.global_position).normalized() + ) > 0.9 + and not shopkeeper.is_locomotion_walking(), + "engaged shopkeeper did not stop and face the player", + ) + main.call("_input", press) + await process_frame + _expect( + game_ui.get_fishing_shop().visible + and bool(main.get("_shop_conversation_shop_opened")), + "second Y press did not dismiss dialogue and open the shop", + ) + _expect( + main.get("_engaged_shop_npc_interaction") == interaction + and not bool(player.call("_is_camera_input_enabled")), + "shop opening released the conversation frame before close", ) player.global_position = interaction.global_position + Vector3(20.0, 0.0, 0.0) for _frame: int in 6: @@ -108,6 +287,12 @@ func _run() -> void: if not game_ui.get_fishing_shop().visible: break await process_frame + for _frame: int in 40: + if not player.is_shop_conversation_camera_active(): + break + await process_frame + if player.is_shop_conversation_camera_active(): + await create_timer(0.55).timeout _expect( not interaction.is_local_player_in_range(), "local player did not leave the shop interaction range", @@ -116,12 +301,219 @@ func _run() -> void: not game_ui.get_fishing_shop().visible, "shop did not close after leaving its interaction range", ) + _expect( + main.get("_engaged_shop_npc_interaction") == null + and bool(player.call("_is_movement_input_enabled")) + and bool(player.call("_is_camera_input_enabled")), + ( + "shop close did not restore conversation controls and camera " + + "(engaged=%s movement=%s camera=%s restoring=%s)" + ) % [ + main.get("_engaged_shop_npc_interaction"), + player.call("_is_movement_input_enabled"), + player.call("_is_camera_input_enabled"), + main.get("_shop_conversation_camera_restoring"), + ], + ) + _expect( + camera_yaw.transform.is_equal_approx( + initial_camera_yaw_transform + ) + and camera_pitch.rotation.is_equal_approx(initial_camera_pitch) + and is_equal_approx(spring_arm.spring_length, initial_spring_length), + "conversation camera did not restore its exact pre-dialogue frame", + ) game_ui.call("_input", press) await process_frame _expect( character_calls.size() == 1, "Y did not play a character call away from an interaction", ) + + # Deliberately overlap two shop margins to validate the transition case. + # Whichever character the player is actually closest to must own both the + # dialogue/prompt and the interaction button, regardless of shop type. + if decor_interaction != null: + var fishing_root := interaction.get_parent() as Node3D + var decor_root := decor_interaction.get_parent() as Node3D + var original_decor_transform := decor_root.global_transform + interaction.roaming_enabled = false + decor_interaction.roaming_enabled = false + (interaction.get_node("../Shopkeeper") as Node3D).position = Vector3.ZERO + (decor_interaction.get_node("../Shopkeeper") as Node3D).position = Vector3.ZERO + decor_root.global_position = ( + fishing_root.global_position + Vector3(1.1, 0.0, 0.0) + ) + player.global_position = decor_root.global_position + for _frame: int in 6: + await physics_frame + _expect( + interaction.is_local_player_in_range() + and decor_interaction.is_local_player_in_range(), + "overlapping shop transition margins were not established", + ) + _expect( + main.call("_get_active_shop_npc_interaction") + == decor_interaction, + "nearest decor NPC did not own the overlapping interaction", + ) + _expect( + int(game_ui.get("_shop_npc_source_id")) + == decor_interaction.get_instance_id() + and shop_message.text + == DecorShopInteraction.DECOR_DIALOGUE_TEXT, + "decor dialogue did not follow the active NPC handoff", + ) + player.global_position = ( + fishing_root.global_position + Vector3(0.57, 0.0, 0.0) + ) + for _frame: int in 3: + await physics_frame + _expect( + main.call("_get_active_shop_npc_interaction") + == decor_interaction, + "shop handoff hysteresis did not stabilize a near-tie", + ) + player.global_position = ( + fishing_root.global_position + Vector3(0.45, 0.0, 0.0) + ) + for _frame: int in 3: + await physics_frame + _expect( + main.call("_get_active_shop_npc_interaction") + == interaction, + "shop ownership did not switch after a clear distance lead", + ) + _expect( + int(game_ui.get("_shop_npc_source_id")) + == interaction.get_instance_id() + and shop_message.text == FishingShopInteraction.DIALOGUE_TEXT, + "fishing dialogue did not replace the prior NPC cleanly", + ) + player.global_position = decor_root.global_position + for _frame: int in 3: + await physics_frame + game_ui.call("_input", press) + main.call("_unhandled_input", press) + await process_frame + _expect( + not game_ui.get_decor_shop().visible + and main.get("_engaged_shop_npc_interaction") + == decor_interaction, + "first Y did not engage the nearest decor NPC in an overlap", + ) + main.call("_input", press) + await process_frame + _expect( + game_ui.get_decor_shop().visible + and main.get("_engaged_shop_npc_interaction") + == decor_interaction, + "second Y did not open the engaged decor shop", + ) + _expect( + character_calls.size() == 1, + "Y emitted a character call instead of opening the decor shop", + ) + game_ui.get_decor_shop().close_shop() + for _frame: int in 40: + if not player.is_shop_conversation_camera_active(): + break + await process_frame + if player.is_shop_conversation_camera_active(): + await create_timer(0.55).timeout + player.global_position = fishing_root.global_position + for _frame: int in 6: + await physics_frame + _expect( + main.call("_get_active_shop_npc_interaction") + == interaction, + "shop ownership did not hand back to the nearer fishing NPC", + ) + decor_root.global_transform = original_decor_transform + + # Idle visuals can still begin a frame overlapped (for example after two + # independently planned routes converge). They must separate without + # moving either authoritative Area3D, deadlocking on their reservations, + # or waiting for one NPC to already be in the walking state. + var fishing_visual := interaction.get_node( + "../Shopkeeper" + ) as WorldCharacterDisplay + var decor_visual := decor_interaction.get_node( + "../Shopkeeper" + ) as WorldCharacterDisplay + var fishing_visual_transform := fishing_visual.global_transform + var decor_visual_transform := decor_visual.global_transform + var fishing_area_transform := interaction.global_transform + var decor_area_transform := decor_interaction.global_transform + player.global_position = fishing_visual.global_position + Vector3(20.0, 0.0, 0.0) + interaction.roaming_enabled = true + decor_interaction.roaming_enabled = true + interaction.call("_schedule_idle") + decor_interaction.call("_schedule_idle") + var crossing_center := fishing_visual.global_position + decor_visual.global_position = ( + crossing_center + Vector3(1.0, 0.0, -1.0) + ) + decor_interaction.set( + "_roaming_destination", + decor_visual.get_parent_node_3d().to_local( + crossing_center + Vector3(1.0, 0.0, 1.0) + ), + ) + decor_interaction.set("_roaming_walking", true) + _expect( + bool(interaction.call( + "_route_conflicts_with_reserved_corridors", + crossing_center, + crossing_center + Vector3(2.0, 0.0, 0.0), + )), + "crossing shopkeeper route corridors were not reserved", + ) + decor_interaction.call("_schedule_idle") + var fishing_priority: String = interaction.call( + "_traffic_priority_key" + ) + var decor_priority: String = decor_interaction.call( + "_traffic_priority_key" + ) + var blocked_outward_direction := ( + Vector3.RIGHT + if fishing_priority < decor_priority + else Vector3.LEFT + ) + fishing_visual.global_position = ( + interaction.call("_get_roaming_origin_global") + + blocked_outward_direction * interaction.roaming_radius + ) + decor_visual.global_position = fishing_visual.global_position + var overlapped_position := fishing_visual.global_position + for _separation_frame: int in 80: + interaction.call("_process", 0.05) + decor_interaction.call("_process", 0.05) + var separation := fishing_visual.global_position - decor_visual.global_position + separation.y = 0.0 + if separation.length() >= interaction.other_shopkeeper_clearance: + break + var resolved_separation := ( + fishing_visual.global_position - decor_visual.global_position + ) + resolved_separation.y = 0.0 + _expect( + resolved_separation.length() + >= interaction.other_shopkeeper_clearance - 0.02 + and fishing_visual.global_position.distance_to(overlapped_position) + > 0.1, + "idle-overlapped shopkeepers did not separate and resume safely", + ) + _expect( + interaction.global_transform.is_equal_approx(fishing_area_transform) + and decor_interaction.global_transform.is_equal_approx( + decor_area_transform + ), + "live shopkeeper separation moved an authoritative Area3D", + ) + fishing_visual.global_transform = fishing_visual_transform + decor_visual.global_transform = decor_visual_transform chat_service.character_call_received.disconnect(capture_call) var session := main.get_node("%NetworkSession") as NetworkSession diff --git a/tests/economy_regression_validation.gd b/tests/economy_regression_validation.gd index 1bb6409..7cb9666 100644 --- a/tests/economy_regression_validation.gd +++ b/tests/economy_regression_validation.gd @@ -622,7 +622,6 @@ func _test_fishing_shop_sale_ui( var game_ui := main.get_node("%GameUI") as GameUI var shop := game_ui.get_node("%FishingShop") as FishingShop var player_menu := game_ui.get_node("%PlayerMenu") as PlayerMenu - var shop_backdrop := main.get_node("%ShopBackdrop") as ColorRect var ui_viewport := main.get_node( "UIPresentation/UIViewport" ) as SubViewport @@ -630,7 +629,6 @@ func _test_fishing_shop_sale_ui( interaction != null and shop != null and player_menu != null - and shop_backdrop != null and ui_viewport != null ) var item_catalog := main.get("item_catalog") as ItemCatalog @@ -701,8 +699,7 @@ func _test_fishing_shop_sale_ui( assert(shop.open_shop()) for _frame: int in 2: await process_frame - assert(shop_backdrop.visible) - assert(shop_backdrop.material is ShaderMaterial) + assert(main.get_node_or_null("%ShopBackdrop") == null) assert(shop.has_node("InputBlocker") and not shop.has_node("Dimmer")) var shop_panel := shop.get_node("%ShopPanel") as PanelContainer assert(shop_panel != null and shop_panel.size == Vector2(980.0, 600.0)) diff --git a/tests/fish_hotbar_showcase_validation.gd b/tests/fish_hotbar_showcase_validation.gd index 77f6ed6..ab18f07 100644 --- a/tests/fish_hotbar_showcase_validation.gd +++ b/tests/fish_hotbar_showcase_validation.gd @@ -204,7 +204,7 @@ func _run() -> void: var enet_channel_count: int = NetworkProtocol.ENET_CHANNEL_COUNT var fish_quality_capability: String = NetworkProtocol.FISH_QUALITY_CAPABILITY var showcase_capability: StringName = NetworkFishShowcaseProtocol.CAPABILITY - assert(protocol_version == 12) + assert(protocol_version == 13) assert(enet_channel_count == 18) assert( fish_quality_capability == "fish_quality_v1" diff --git a/tests/fish_quality_validation.gd b/tests/fish_quality_validation.gd index 4be1ffc..b323880 100644 --- a/tests/fish_quality_validation.gd +++ b/tests/fish_quality_validation.gd @@ -38,7 +38,7 @@ func _run() -> void: NetworkProtocol.FISHING_REPLICATION_CAPABILITY ) var fish_quality_capability: String = NetworkProtocol.FISH_QUALITY_CAPABILITY - assert(protocol_version == 12) + assert(protocol_version == 13) assert(enet_channel_count == 18) assert(movement_animation_channel == 11) assert( diff --git a/tests/home_spawn_multiplayer_validation.gd b/tests/home_spawn_multiplayer_validation.gd index 2855eb2..d76533c 100644 --- a/tests/home_spawn_multiplayer_validation.gd +++ b/tests/home_spawn_multiplayer_validation.gd @@ -31,6 +31,7 @@ func _run_host() -> void: "%PlayerSpawnService" ) as PlayerSpawnService var save_manager := main.get("_save_manager") as PlayerSaveManager + var home_state := main.get_node("%PlayerHomeState") as PlayerHomeState assert(bool(main.call( "_apply_world", WorldLayout.STARTER_ISLAND, 1, true ))) @@ -59,6 +60,60 @@ func _run_host() -> void: await physics_frame assert(_same_door_position(host_avatar.global_position, host_spawn.origin)) assert(_faces_away_from_home(host_avatar, home_world, host_fingerprint)) + var upgrade_result_id := "home-test-upgrade" + network_home.authorize_home_upgrade( + session.get_local_peer_id(), + PlayerHomeState.STARTER_RV_TIER, + upgrade_result_id, + ) + assert(home_state.upgrade_to_next_tier()) + var rv_deadline: int = Time.get_ticks_msec() + 5000 + while ( + Time.get_ticks_msec() < rv_deadline + and home_world.get_interior_exit_positions(host_fingerprint).size() < 2 + ): + await process_frame + var rv_exits: Array[Vector3] = home_world.get_interior_exit_positions( + host_fingerprint + ) + assert(rv_exits.size() == 2) + network_home.finalize_home_upgrade( + session.get_local_peer_id(), upgrade_result_id, true + ) + assert(rv_exits[0].x < rv_exits[1].x) + for exit_position: Vector3 in rv_exits: + host_avatar.global_position = ( + exit_position + + home_world.get_interior_exit_direction_near( + host_fingerprint, exit_position + ) * 0.05 + ) + assert(home_world.has_avatar_crossed_interior_exit_threshold( + host_avatar, host_fingerprint + )) + host_avatar.global_position = rv_exits[0] + Vector3(0.0, 0.0, 1.1) + assert(not home_world.has_avatar_crossed_interior_exit_threshold( + host_avatar, host_fingerprint + )) + var presentations: Dictionary = home_world.get( + "_presentations_by_fingerprint" + ) + var host_presentation: Dictionary = presentations.get(host_fingerprint, {}) + var host_interior := host_presentation.get("interior") as Node3D + assert(host_interior != null) + var wall_collision := host_interior.find_child( + "WallWestCollision", true, false + ) as StaticBody3D + assert(wall_collision != null) + assert(bool(wall_collision.get_meta( + HomeWorldService.INTERIOR_SHELL_COLLISION_META, false + ))) + var wall_shape := wall_collision.get_child(0) as CollisionShape3D + assert(wall_shape != null) + assert((wall_shape.shape as ConcavePolygonShape3D).backface_collision) + host_avatar.global_position = host_spawn.origin + assert(network_home.request_enter(host_fingerprint)) + await physics_frame var remote_peer_id: int = await _wait_for_remote_peer(session) assert(remote_peer_id > 1) @@ -66,6 +121,53 @@ func _run_host() -> void: var remote_fingerprint: String = remote_record.identity_fingerprint assert(await _wait_for_home(network_home, remote_fingerprint)) var remote_avatar: Player = spawn_service.get_avatar(remote_peer_id) + assert(not remote_avatar.is_remote_presentation_visible()) + var chat_ui := main.get_node("%GameUI").get_node("%ChatUI") as ChatUI + chat_ui.call( + "_show_speech_bubble", remote_peer_id, "outside", remote_fingerprint + ) + var speech_states: Dictionary = chat_ui.get("_speech") + assert(not speech_states.has(remote_peer_id)) + var toolbar := main.get_node("%GameUI").get_node( + "%HomeDecorToolbar" + ) as HomeDecorToolbar + assert(toolbar.visible) + var exit_button := toolbar.find_child( + "ExitRVButton", true, false + ) as Button + assert(exit_button != null and exit_button.text == "Exit RV") + var storage := main.get_node("%GameUI").get_node( + "%PlayerStorage" + ) as PlayerStorage + assert(storage.open_storage_from_home(true)) + var close_storage_event := InputEventAction.new() + close_storage_event.action = &"interact" + close_storage_event.pressed = true + storage._unhandled_input(close_storage_event) + assert(not storage.visible) + exit_button.pressed.emit() + var exit_deadline: int = Time.get_ticks_msec() + 5000 + while ( + Time.get_ticks_msec() < exit_deadline + and not network_home.get_local_home_owner_fingerprint().is_empty() + ): + await process_frame + assert(network_home.get_local_home_owner_fingerprint().is_empty()) + var visibility_deadline: int = Time.get_ticks_msec() + 1000 + while ( + Time.get_ticks_msec() < visibility_deadline + and is_instance_valid(remote_avatar) + and not remote_avatar.is_remote_presentation_visible() + ): + await process_frame + assert(is_instance_valid(remote_avatar)) + assert(remote_avatar.is_remote_presentation_visible()) + chat_ui.call( + "_show_speech_bubble", remote_peer_id, "inside", remote_fingerprint + ) + speech_states = chat_ui.get("_speech") + assert(speech_states.has(remote_peer_id)) + chat_ui.call("_on_peer_removed", remote_peer_id) var remote_spawn: Transform3D = home_world.get_exterior_spawn_transform( remote_fingerprint ) @@ -124,6 +226,10 @@ func _run_client() -> void: player.global_position, exterior_spawn.origin )) assert(_faces_away_from_home(player, home_world, fingerprint)) + # Keep the peer present long enough for the host to rebuild the upgraded RV, + # exercise late-spawn visibility, and use the toolbar transition back to the + # shared world. A two-second grace period raced the host on slower machines. + await create_timer(10.0).timeout print("Home spawn multiplayer client validation: PASS") await _cleanup(main, session) diff --git a/tests/light_performance_profile_validation.gd b/tests/light_performance_profile_validation.gd index 5cb8df3..5252193 100644 --- a/tests/light_performance_profile_validation.gd +++ b/tests/light_performance_profile_validation.gd @@ -105,21 +105,7 @@ func _validate_main_profile(main: Node) -> void: assert(not bool(title_material.get_shader_parameter( "animation_enabled" ))) - for backdrop_name: StringName in [ - &"PlayerMenuBackdrop", - &"ShopBackdrop", - ]: - var backdrop := main.get_node("%%%s" % backdrop_name) as ColorRect - var backdrop_material := backdrop.material as ShaderMaterial - assert(backdrop_material != null) - assert(not bool(backdrop_material.get_shader_parameter( - "animation_enabled" - ))) - assert( - backdrop_material.get_shader_parameter( - "scroll_velocity_pixels" - ) == Vector2.ZERO - ) + _validate_no_full_screen_menu_backdrops(main) var game_ui := main.get_node("%GameUI") as GameUI var title_screen := game_ui.get_title_screen() assert(title_screen != null) @@ -166,21 +152,7 @@ func _validate_normal_profile(main: Node) -> void: var title_material := title_background.material as ShaderMaterial assert(title_material != null) assert(bool(title_material.get_shader_parameter("animation_enabled"))) - for backdrop_name: StringName in [ - &"PlayerMenuBackdrop", - &"ShopBackdrop", - ]: - var backdrop := main.get_node("%%%s" % backdrop_name) as ColorRect - var backdrop_material := backdrop.material as ShaderMaterial - assert(backdrop_material != null) - assert(bool(backdrop_material.get_shader_parameter( - "animation_enabled" - ))) - assert( - backdrop_material.get_shader_parameter( - "scroll_velocity_pixels" - ) != Vector2.ZERO - ) + _validate_no_full_screen_menu_backdrops(main) var visuals: WorldTimeVisualController = main.get_node( "%WorldTimeVisualController" ) @@ -216,6 +188,11 @@ func _validate_new_game_music_transition(main: Node) -> void: assert(title_music.playing) +func _validate_no_full_screen_menu_backdrops(main: Node) -> void: + assert(main.get_node_or_null("%PlayerMenuBackdrop") == null) + assert(main.get_node_or_null("%ShopBackdrop") == null) + + func _first_fresh_water_visual(main: Node) -> MeshInstance3D: var fresh_water_root := main.get_node( "TestWorld/Regions/GeneratedWorldRegion/WaterBodies/FreshWaterBodies" diff --git a/tests/logbook_runtime_validation.gd b/tests/logbook_runtime_validation.gd index e33e551..7fc2311 100644 --- a/tests/logbook_runtime_validation.gd +++ b/tests/logbook_runtime_validation.gd @@ -35,7 +35,6 @@ func _run() -> void: var game_ui := main.get_node("%GameUI") as GameUI var player_menu := game_ui.get_node("%PlayerMenu") as PlayerMenu var logbook := player_menu.get_node("%CatalogLogbook") as LogbookPage - var backdrop := main.get_node("%PlayerMenuBackdrop") as ColorRect var hotbar := game_ui.get_node("%Hotbar") as Control var fishing_spot := main.get("_fishing_spot") as FishingSpot assert(logbook.get("_fishing_spot") == fishing_spot) @@ -49,7 +48,7 @@ func _run() -> void: await create_timer(MENU_TRANSITION_SETTLE_SECONDS).timeout assert(player_menu.visible) assert(logbook.visible) - assert(backdrop.visible) + assert(main.get_node_or_null("%PlayerMenuBackdrop") == null) assert(not bool(game_ui.get("_player_menu_hotbar_visible"))) assert(not hotbar.visible) diff --git a/tests/movement_multiplayer_validation.gd b/tests/movement_multiplayer_validation.gd index a59f703..611658a 100644 --- a/tests/movement_multiplayer_validation.gd +++ b/tests/movement_multiplayer_validation.gd @@ -195,11 +195,56 @@ func _validate_compact_animation_encoding() -> void: func _validate_airborne_sitting(avatar: Player) -> void: avatar.reset_network_movement_state() avatar.set_local_control(true) - avatar.set("_sit_after_landing", true) + avatar.global_position = Vector3(0.0, 2.0, 0.0) + avatar.velocity = Vector3(0.0, -1.0, 0.0) + avatar.toggle_sitting() assert(avatar.get_network_sitting_intent()) assert(not avatar.get_network_sitting_state()) + assert(bool(avatar.get("_sitting_intent_pending"))) assert(not bool(avatar.make_network_snapshot(2)["sitting"])) assert(bool(avatar.capture_network_input(1)["sitting"])) + + # Reproduce the high-RTT owner audit race: the host has reached the ground + # and reports the deferred sit while this client's predicted capsule is still + # airborne. Repeated seated snapshots must not zero its falling velocity. + var delayed_sit_snapshot: Dictionary = _network_snapshot( + avatar.global_position, + Vector3.ZERO, + 1, + ) + delayed_sit_snapshot["sitting"] = true + avatar.apply_local_prediction_correction( + delayed_sit_snapshot, + 1, + 1.0 / 30.0, + 0.3, + 0.1, + ) + assert(not avatar.is_sitting()) + assert(bool(avatar.get("_sit_after_landing"))) + assert(avatar.velocity.y < 0.0) + var airborne_height: float = avatar.global_position.y + avatar.call("_simulate_movement_physics", 0.1) + assert(avatar.global_position.y < airborne_height) + assert(avatar.velocity.y < -1.0) + for _delayed_audit: int in 3: + delayed_sit_snapshot["position"] = [ + avatar.global_position.x, + avatar.global_position.y, + avatar.global_position.z, + ] + var falling_velocity: float = avatar.velocity.y + avatar.apply_local_prediction_correction( + delayed_sit_snapshot, + 1, + 1.0 / 30.0, + 0.3, + 0.1, + ) + assert(not avatar.is_sitting()) + assert(is_equal_approx(avatar.velocity.y, falling_velocity)) + avatar.call("_simulate_movement_physics", 0.1) + assert(avatar.global_position.y < airborne_height) avatar.call("_queue_local_network_jump_intent") var jumping_input: Dictionary = avatar.capture_network_input(2) assert(bool(jumping_input["jump"])) diff --git a/tests/network_chat_protocol_validation.gd b/tests/network_chat_protocol_validation.gd index 9368189..669d07a 100644 --- a/tests/network_chat_protocol_validation.gd +++ b/tests/network_chat_protocol_validation.gd @@ -10,6 +10,7 @@ func _initialize() -> void: func _validate_protocol() -> void: _validate_type_and_empty_handling() _validate_message_cleanup() + _validate_roleplay_commands() _validate_protocol_limits() print("Network chat protocol validation: PASS") quit() @@ -34,6 +35,28 @@ func _validate_message_cleanup() -> void: ) +func _validate_roleplay_commands() -> void: + assert(NetworkChatProtocol.is_roleplay_body("/me waves")) + assert(NetworkChatProtocol.is_roleplay_body("/ME waves")) + assert(NetworkChatProtocol.is_roleplay_body("/me")) + assert(not NetworkChatProtocol.is_roleplay_body("/meow")) + assert(NetworkChatProtocol.roleplay_action("/me waves") == "waves") + assert(NetworkChatProtocol.roleplay_action( + "/me [color=red]waves[/color]" + ) == "[color=red]waves[/color]") + assert(NetworkChatProtocol.valid_user_body("/me waves")) + assert(not NetworkChatProtocol.valid_user_body("/me")) + assert(not NetworkChatProtocol.valid_user_body("/me ")) + assert(NetworkChatProtocol.valid_user_body("/meow")) + var signed_fields: Array = NetworkChatProtocol.signature_fields({ + "session_id": "session", + "request_id": "request", + "sender_fingerprint": "fingerprint", + "body": "/me waves", + }) + assert(signed_fields.back() == "/me waves") + + func _validate_protocol_limits() -> void: var maximum_body: String = "a".repeat( NetworkChatProtocol.MAX_VISIBLE_CHARACTERS diff --git a/tests/profile_multiplayer_validation.gd b/tests/profile_multiplayer_validation.gd index 4d2bd70..c279721 100644 --- a/tests/profile_multiplayer_validation.gd +++ b/tests/profile_multiplayer_validation.gd @@ -48,6 +48,8 @@ func _run_host() -> void: var profile := main.get_node( "%NetworkProfilePreferences" ) as NetworkProfilePreferences + var save_manager := main.get("_save_manager") as PlayerSaveManager + assert(save_manager.initialize_new_game()) assert(profile.set_profile_identity( profile.display_name, "deep", @@ -55,7 +57,6 @@ func _run_host() -> void: profile.call_id, "kim", )) - var save_manager := main.get("_save_manager") as PlayerSaveManager assert(bool(main.call( "_apply_world", WorldLayout.STARTER_ISLAND, 1, true ))) @@ -67,7 +68,6 @@ func _run_host() -> void: assert(local_avatar != null) assert(local_avatar.get_animalese_voice_id() == "deep") assert(local_avatar.get_animalese_sample_set_id() == "kim") - assert(save_manager.initialize_new_game()) main.call("_enter_gameplay") for _frame: int in 4: await physics_frame @@ -99,6 +99,7 @@ func _run_host() -> void: await _wait_for_remote_appearance(session, remote_peer_id, changed) await _wait_for_remote_appearance(session, remote_peer_id, original) await _wait_for_remote_appearance(session, remote_peer_id, changed) + await _wait_for_remote_title(session, remote_peer_id, "trail guide") var avatar := main.get_node("%PlayerSpawnService").get_avatar( remote_peer_id ) as Player @@ -187,6 +188,7 @@ func _run_client() -> void: service.get_persisted_speech_speed_id(), service.get_persisted_call_id(), "kim", + "trail guide", )) var apply_deadline: int = Time.get_ticks_msec() + 8000 while Time.get_ticks_msec() < apply_deadline and apply_results.is_empty(): @@ -196,6 +198,11 @@ func _run_client() -> void: assert(service.get_persisted_appearance() == changed) assert(service.get_persisted_voice_id() == "deep") assert(service.get_persisted_sample_set_id() == "kim") + assert(service.get_persisted_title() == "trail guide") + assert( + session.get_peer_record(session.get_local_peer_id()).title + == "trail guide" + ) assert(Dictionary(session.get("_local_appearance_snapshot")) == changed) var player := main.get_node("%PlayerSpawnService").get_local_player() as Player assert(player.get_animalese_voice_id() == "deep") @@ -278,6 +285,20 @@ func _wait_for_remote_appearance( assert(false, "Timed out waiting for a remote appearance update.") +func _wait_for_remote_title( + session: NetworkSession, + peer_id: int, + expected: String, +) -> void: + var deadline: int = Time.get_ticks_msec() + 8000 + while Time.get_ticks_msec() < deadline: + await process_frame + var record := session.get_peer_record(peer_id) + if record != null and record.title == expected: + return + assert(false, "Timed out waiting for a remote player title update.") + + func _create_initialized_main() -> Node: root.size = Vector2i(1280, 720) var main: Node = MainScene.instantiate() diff --git a/tests/profile_title_validation.gd b/tests/profile_title_validation.gd new file mode 100644 index 0000000..d441e35 --- /dev/null +++ b/tests/profile_title_validation.gd @@ -0,0 +1,151 @@ +extends SceneTree + + +func _initialize() -> void: + _run.call_deferred() + + +func _run() -> void: + _validate_profile_defaults_and_legacy_data() + _validate_network_payloads() + _validate_peer_registry_title() + await _validate_profile_layout() + print("Profile title validation: PASS") + quit(0) + + +func _validate_profile_defaults_and_legacy_data() -> void: + var preferences := NetworkProfilePreferences.new() + assert(preferences.display_name == "stray") + assert(preferences.title == "newbie") + assert(NetworkProfilePreferences.is_valid_title("trail guide")) + assert(not NetworkProfilePreferences.is_valid_title("")) + assert(not NetworkProfilePreferences.is_valid_title("x".repeat( + NetworkProtocol.MAX_PLAYER_TITLE_LENGTH + 1 + ))) + preferences.profile_id = "profile-id" + preferences.created_at_unix = 1 + var save_data := preferences.to_save_data() + assert(str(save_data.get("title", "")) == "newbie") + assert(NetworkProfilePreferences.validate_save_data(save_data)) + # Title was added without invalidating existing per-save character records. + var legacy_save := save_data.duplicate(true) + legacy_save.erase("title") + assert(NetworkProfilePreferences.validate_save_data(legacy_save)) + legacy_save["title"] = 7 + assert(not NetworkProfilePreferences.validate_save_data(legacy_save)) + preferences.free() + + +func _validate_network_payloads() -> void: + var appearance := CharacterCustomizationCatalog.default_snapshot() + var fingerprint := "a".repeat(64) + var hello := NetworkProtocol.make_client_hello( + "profile-id", + "stray", + "client-nonce", + appearance, + fingerprint, + PackedByteArray(), + "trail guide", + ) + assert(NetworkProtocol.validate_client_hello(hello).is_empty()) + assert(str(hello.get("player_title", "")) == "trail guide") + var invalid_hello := hello.duplicate(true) + invalid_hello["player_title"] = "" + assert(not NetworkProtocol.validate_client_hello(invalid_hello).is_empty()) + + var check_request := { + "request_id": "check", + "session_id": "session", + "display_name": "stray", + } + assert(NetworkProfileProtocol.valid_check_request(check_request)) + var apply_request := check_request.duplicate(true) + apply_request.merge({ + "player_title": "trail guide", + "appearance": appearance, + "use_anyway": false, + "sender_fingerprint": fingerprint, + "sender_signature": PackedByteArray(), + }) + assert(NetworkProfileProtocol.valid_apply_request(apply_request)) + var signed_fields := NetworkProfileProtocol.signature_fields(apply_request) + assert(signed_fields.has("trail guide")) + apply_request.erase("player_title") + assert(not NetworkProfileProtocol.valid_apply_request(apply_request)) + + +func _validate_peer_registry_title() -> void: + var registry := PeerRegistry.new() + assert(registry.add_peer( + 2, + "profile-id", + "stray", + NetworkProtocol.PROTOCOL_VERSION, + "", + "", + PackedStringArray(), + "trail guide", + )) + assert(registry.get_peer(2).title == "trail guide") + assert(registry.update_title(2, "river scout")) + assert(registry.get_peer(2).title == "river scout") + assert(not registry.update_title(2, "")) + assert(not registry.add_peer( + 3, + "invalid-profile", + "stray", + NetworkProtocol.PROTOCOL_VERSION, + "", + "", + PackedStringArray(), + "", + )) + + +func _validate_profile_layout() -> void: + root.size = Vector2i(1280, 720) + var page := ProfilePage.new() + page.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + root.add_child(page) + await process_frame + await process_frame + var name_label := page.get("_name_label") as Label + var name_edit := page.get("_name_edit") as LineEdit + var title_edit := page.get("_title_edit") as LineEdit + var identity := page.find_child("IdentityFingerprint", true, false) as Label + var identity_stack := page.find_child( + "ProfileIdentityStack", true, false + ) as VBoxContainer + var experience_row := page.find_child( + "ProfileExperienceRow", true, false + ) as HBoxContainer + assert(name_label != null and name_edit != null and title_edit != null) + assert(name_label.text == "name") + assert(identity != null and identity_stack != null and experience_row != null) + assert(name_edit.placeholder_text == "stray") + assert(title_edit.placeholder_text == "newbie") + assert(title_edit.global_position.y > name_edit.global_position.y) + assert(is_equal_approx(title_edit.position.x, name_edit.position.x)) + assert(identity.get_parent() == identity_stack) + assert(experience_row.get_parent() == identity_stack) + assert(identity.horizontal_alignment == HORIZONTAL_ALIGNMENT_RIGHT) + assert(identity_stack.global_position.x > name_edit.global_position.x) + assert(name_label.tooltip_text.contains( + "Shown to other players in multiplayer." + )) + page.call("_set_name_status", "Name is available in this game.") + assert(name_label.tooltip_text.contains( + "Name is available in this game." + )) + for visible_label: Label in page.find_children("*", "Label", true, false): + if visible_label.visible: + assert(visible_label.text != "Shown to other players in multiplayer.") + assert(visible_label.text != "Name is available in this game.") + var account_controls: Array = page.call("_account_controller_controls") + assert(name_edit in account_controls) + assert(title_edit in account_controls) + page.queue_free() + for _frame: int in 4: + await process_frame diff --git a/tests/profile_title_validation.gd.uid b/tests/profile_title_validation.gd.uid new file mode 100644 index 0000000..f095103 --- /dev/null +++ b/tests/profile_title_validation.gd.uid @@ -0,0 +1 @@ +uid://cat806v782sr7 diff --git a/tests/progression_archive_validation.gd b/tests/progression_archive_validation.gd index 30f0df6..0daae87 100644 --- a/tests/progression_archive_validation.gd +++ b/tests/progression_archive_validation.gd @@ -23,14 +23,35 @@ func _run() -> void: var player := main.get("_player") as Player var data_root := main.get("_data_root") as PlayerDataRoot var home_state := main.get("_home_state") as PlayerHomeState + var network_profile := main.get_node( + "%NetworkProfilePreferences" + ) as NetworkProfilePreferences + var appearance_store := main.get_node( + "%PlayerAppearanceStore" + ) as PlayerAppearanceStore assert( save_manager != null and player != null and data_root != null and home_state != null + and network_profile != null + and appearance_store != null ) assert(save_manager.initialize_new_game(864209)) save_manager.set_autosave_enabled(true) + var first_profile_id: String = network_profile.profile_id + var first_appearance: Dictionary = appearance_store.get_snapshot() + first_appearance["scale"] = 0.8 + assert(CharacterCustomizationCatalog.validate_snapshot(first_appearance)) + assert(network_profile.set_profile_identity( + "first save character", + "deep", + network_profile.speech_speed_id, + network_profile.call_id, + network_profile.sample_set_id, + "trailblazer", + )) + assert(appearance_store.save_snapshot(first_appearance)) assert(player.wallet.restore_balance(4321)) assert(player.bag.add_item(&"coffee")) assert(home_state.add_owned_decor(&"basic_cube")) @@ -52,6 +73,39 @@ func _run() -> void: var decoded: Dictionary = ProgressionSaveCodec.read_local_save(save_path) assert(bool(decoded.get("ok", false))) assert(int((decoded["data"] as Dictionary)["save_version"]) == 11) + var saved_character: Dictionary = ( + (decoded["data"] as Dictionary).get("character", {}) + ) + assert(NetworkProfilePreferences.validate_save_data( + (saved_character.get("profile", {}) as Dictionary) + )) + assert(str((saved_character["profile"] as Dictionary)["profile_id"]) + == first_profile_id) + assert(str((saved_character["profile"] as Dictionary)["display_name"]) + == "first save character") + assert(str((saved_character["profile"] as Dictionary)["title"]) + == "trailblazer") + assert( + (saved_character["appearance"] as Dictionary) + == first_appearance + ) + # Starting another save must feel like a new character, then loading this + # archive must restore only this slot's name, voice, and appearance. + assert(save_manager.initialize_new_game(97531)) + assert(network_profile.profile_id != first_profile_id) + assert(network_profile.display_name == "stray") + assert(network_profile.title == "newbie") + assert(network_profile.voice_id != "deep") + assert( + appearance_store.get_snapshot() + == CharacterCustomizationCatalog.default_snapshot() + ) + assert(save_manager.load_player_data()) + assert(network_profile.profile_id == first_profile_id) + assert(network_profile.display_name == "first save character") + assert(network_profile.title == "trailblazer") + assert(network_profile.voice_id == "deep") + assert(appearance_store.get_snapshot() == first_appearance) assert(not PlayerHomeState.sanitize_save_data( (decoded["data"] as Dictionary).get("home", {}) ).is_empty()) @@ -122,6 +176,8 @@ func _run() -> void: var adopted_slot_id: String = str(adopted_slots.front().get("slot_id", "")) assert(bool(adopted_slots.front().get("legacy", false))) assert(bool(adopted_slots.front().get("has_save", false))) + assert(save_slots.get_online_slot_id() == adopted_slot_id) + assert(bool(adopted_slots.front().get("online", false))) var duplicated: Dictionary = save_slots.duplicate_slot( adopted_slot_id, @@ -135,6 +191,9 @@ func _run() -> void: assert(int(duplicate_summary.get("wallet_balance", -1)) == 4321) assert(int(duplicate_summary.get("world_seed", -1)) == 97531) assert(save_slots.activate_slot(duplicated_slot_id)) + assert(save_slots.mark_slot_for_online(duplicated_slot_id)) + assert(save_slots.get_online_slot_id() == duplicated_slot_id) + assert(bool(save_slots.get_slot(duplicated_slot_id).get("online", false))) assert(save_manager.load_player_data()) assert(player.wallet.get_balance() == 4321) assert(save_manager.get_world_seed() == 97531) @@ -157,6 +216,7 @@ func _run() -> void: assert(save_slots.delete_slot(duplicated_slot_id)) assert(save_slots.get_slot(duplicated_slot_id).is_empty()) assert(save_slots.list_slots().size() == 2) + assert(save_slots.get_online_slot_id() == save_slots.get_active_slot_id()) var settings_panels: Array[Node] = main.find_children( "*", "SettingsPanel", true, false diff --git a/tests/save_reload_conflict_validation.gd b/tests/save_reload_conflict_validation.gd new file mode 100644 index 0000000..8b4387d --- /dev/null +++ b/tests/save_reload_conflict_validation.gd @@ -0,0 +1,166 @@ +extends SceneTree + +const MainScene: PackedScene = preload("res://main/main.tscn") +const WAIT_MILLISECONDS: int = 20_000 + +var _conflicts: Array[Dictionary] = [] + + +func _initialize() -> void: + _run.call_deferred() + + +func _run() -> void: + root.size = Vector2i(1280, 720) + var main: Node = MainScene.instantiate() + root.add_child(main) + for _frame: int in 4: + await process_frame + if not bool(main.get("_application_initialized")): + main.call("_activate_selected_data_path", "", true) + for _frame: int in 8: + await process_frame + assert(bool(main.get("_application_initialized"))) + + var data_root := main.get("_data_root") as PlayerDataRoot + var save_manager := main.get("_save_manager") as PlayerSaveManager + var save_slots := main.get("_save_slots") as PlayerSaveSlotCatalog + var player := main.get("_player") as Player + var session := main.get_node("%NetworkSession") as NetworkSession + var network_profile := main.get_node( + "%NetworkProfilePreferences" + ) as NetworkProfilePreferences + var appearance_store := main.get_node( + "%PlayerAppearanceStore" + ) as PlayerAppearanceStore + assert( + data_root != null + and save_manager != null + and save_slots != null + and player != null + and session != null + and network_profile != null + and appearance_store != null + ) + var conflict_dialog_callback := Callable(main, "_on_portable_conflict") + if data_root.conflict_detected.is_connected(conflict_dialog_callback): + data_root.conflict_detected.disconnect(conflict_dialog_callback) + data_root.conflict_detected.connect(_on_conflict_detected) + if OS.get_environment( + PlayerDataRoot.ISOLATED_VALIDATION_ENVIRONMENT + ) == "1": + assert( + PlayerDataRoot.ISOLATED_VALIDATION_DIRECTORY + in data_root.root_path + ) + + main.call( + "_on_new_slot_requested", + "reload regression", + WorldLayout.STARTER_ISLAND, + 424242, + "", + ) + assert(await _wait_for_gameplay(main, true)) + var slot_id: String = save_slots.get_active_slot_id() + assert(not slot_id.is_empty()) + assert(player.wallet.restore_balance(321)) + assert(network_profile.set_profile_identity( + "reload stray", + "deep", + network_profile.speech_speed_id, + network_profile.call_id, + network_profile.sample_set_id, + "returner", + )) + var custom_appearance: Dictionary = appearance_store.get_snapshot() + custom_appearance["scale"] = 0.8 + assert(appearance_store.save_snapshot(custom_appearance)) + main.call("_on_return_to_title_requested") + assert(await _wait_for_gameplay(main, false)) + assert(not save_manager.is_dirty()) + + # Establish the exact reported lifecycle once: load a local slot, return to + # title, then immediately select that same slot again in this process. + main.call("_on_slot_play_requested", slot_id) + assert(await _wait_for_gameplay(main, true)) + main.call("_on_return_to_title_requested") + assert(await _wait_for_gameplay(main, false)) + assert(not save_manager.is_dirty()) + + # A selected save owns its character state. An out-of-band edit to the + # compatibility profile mirror must not make that valid save unloadable or + # be overwritten merely by loading it. A later explicit profile edit must + # still detect the external mutation. + var profile_path: String = data_root.path_for(&"network_profile") + var external_profile_bytes := PortableFileGuard.read_bytes(profile_path) + assert(not external_profile_bytes.is_empty()) + external_profile_bytes.append(0x0a) + assert(_write_external_bytes(profile_path, external_profile_bytes)) + _conflicts.clear() + main.call("_on_slot_play_requested", slot_id) + assert(await _wait_for_gameplay(main, true)) + assert( + _conflicts.is_empty(), + "same-process same-slot reload reported false conflicts: %s" + % [_conflicts], + ) + assert(player.wallet.get_balance() == 321) + assert(network_profile.display_name == "reload stray") + assert(network_profile.title == "returner") + assert(appearance_store.get_snapshot() == custom_appearance) + assert( + PortableFileGuard.read_bytes(profile_path) + == external_profile_bytes + ) + _conflicts.clear() + assert(not network_profile.set_display_name("explicit overwrite")) + assert(_conflicts.size() == 1) + assert(FileAccess.file_exists(str(_conflicts.front().get("path", "")))) + + # A real out-of-band edit must still be caught. Mutating the canonical bytes + # after load simulates a Syncthing/device replacement while this process is + # holding an older expected hash. + var save_path: String = str(save_manager.get("_save_path")) + var external_bytes := PortableFileGuard.read_bytes(save_path) + assert(not external_bytes.is_empty()) + external_bytes.append(0x7f) + assert(_write_external_bytes(save_path, external_bytes)) + assert(player.wallet.restore_balance(654)) + _conflicts.clear() + assert(not save_manager.save_now()) + assert(_conflicts.size() == 1) + assert(FileAccess.file_exists(str(_conflicts.front().get("path", "")))) + + save_manager.set_autosave_enabled(false) + save_manager.cancel_pending_autosave() + session.disconnect_session("Save reload conflict validation complete.") + main.queue_free() + for _frame: int in 4: + await process_frame + print("Save reload conflict validation: PASS") + quit(0) + + +func _wait_for_gameplay(main: Node, expected: bool) -> bool: + var deadline: int = Time.get_ticks_msec() + WAIT_MILLISECONDS + while Time.get_ticks_msec() < deadline: + if bool(main.get("_gameplay_started")) == expected: + return true + await process_frame + return false + + +func _on_conflict_detected(message: String, path: String) -> void: + _conflicts.append({"message": message, "path": path}) + + +func _write_external_bytes(path: String, bytes: PackedByteArray) -> bool: + var file := FileAccess.open(path, FileAccess.WRITE) + if file == null: + return false + file.store_buffer(bytes) + file.flush() + var succeeded: bool = file.get_error() == OK + file.close() + return succeeded diff --git a/tests/save_reload_conflict_validation.gd.uid b/tests/save_reload_conflict_validation.gd.uid new file mode 100644 index 0000000..fa26ace --- /dev/null +++ b/tests/save_reload_conflict_validation.gd.uid @@ -0,0 +1 @@ +uid://cmd4elmipmywa diff --git a/tests/session_switch_multiplayer_validation.gd b/tests/session_switch_multiplayer_validation.gd index 86c9a84..37f5c5b 100644 --- a/tests/session_switch_multiplayer_validation.gd +++ b/tests/session_switch_multiplayer_validation.gd @@ -123,6 +123,32 @@ func _run_client() -> void: ) await _wait_for_join(main, session, SECOND_HOST_PORT) assert(bool(main.get("_gameplay_started"))) + var save_slots := main.get("_save_slots") as PlayerSaveSlotCatalog + var save_manager := main.get("_save_manager") as PlayerSaveManager + var local_slot_id: String = save_slots.get_active_slot_id() + assert(not local_slot_id.is_empty()) + main.call("_on_return_to_title_requested") + var title_deadline: int = Time.get_ticks_msec() + WAIT_SECONDS * 1000 + while ( + Time.get_ticks_msec() < title_deadline + and session.state != NetworkSession.State.INACTIVE + ): + await process_frame + assert(session.state == NetworkSession.State.INACTIVE) + assert(not bool(main.get("_gameplay_started"))) + assert(not save_manager.is_dirty()) + main.call("_on_slot_play_requested", local_slot_id) + var local_deadline: int = Time.get_ticks_msec() + WAIT_SECONDS * 1000 + while ( + Time.get_ticks_msec() < local_deadline + and ( + not session.is_host() + or not bool(main.get("_gameplay_started")) + ) + ): + await process_frame + assert(session.is_host()) + assert(bool(main.get("_gameplay_started"))) print("Session switch multiplayer client validation: PASS") session.disconnect_session("") main.queue_free() diff --git a/tests/tooltip_escape_validation.gd b/tests/tooltip_escape_validation.gd new file mode 100644 index 0000000..531476e --- /dev/null +++ b/tests/tooltip_escape_validation.gd @@ -0,0 +1,43 @@ +extends SceneTree + +const MainScene: PackedScene = preload("res://main/main.tscn") + + +func _initialize() -> void: + call_deferred("_run") + + +func _run() -> void: + root.size = Vector2i(1280, 720) + var main: Node = MainScene.instantiate() + root.add_child(main) + for _frame: int in 4: + await process_frame + if not bool(main.get("_application_initialized")): + main.call("_activate_selected_data_path", "", true) + for _frame: int in 8: + await process_frame + assert(bool(main.get("_application_initialized"))) + + var game_ui: GameUI = main.get("_game_ui") as GameUI + var player_menu: PlayerMenu = game_ui.get_node("%PlayerMenu") as PlayerMenu + assert(game_ui != null and player_menu != null) + game_ui.get_title_screen().hide() + main.set("_gameplay_started", true) + player_menu.show() + player_menu.set("_transitioning", false) + + # Input.action_press updates global action state without delivering an + # InputEvent to Main._input. That reproduces the path used when a native + # tooltip window consumes Escape before the gameplay viewport receives it. + Input.action_press("ui_cancel") + await process_frame + Input.action_release("ui_cancel") + for _frame: int in 40: + await process_frame + assert(not player_menu.visible) + + main.queue_free() + await process_frame + print("Tooltip Escape validation: PASS") + quit(0) diff --git a/tests/tooltip_escape_validation.gd.uid b/tests/tooltip_escape_validation.gd.uid new file mode 100644 index 0000000..f4049ab --- /dev/null +++ b/tests/tooltip_escape_validation.gd.uid @@ -0,0 +1 @@ +uid://cwc8lnci5ccph diff --git a/tests/ui_scaling_runtime_validation.gd b/tests/ui_scaling_runtime_validation.gd index 6e6182a..95316ae 100644 --- a/tests/ui_scaling_runtime_validation.gd +++ b/tests/ui_scaling_runtime_validation.gd @@ -39,6 +39,15 @@ func _run() -> void: var canonical_stage := game_ui.get_node( "UIRoot/CanonicalStage" ) as Control + var gameplay_screen_effects := game_ui.get_node( + "UIRoot/GameplayScreenEffects" + ) as Control + var fishing_danger_vignette := game_ui.get_node( + "UIRoot/GameplayScreenEffects/FishingDangerVignette" + ) as ColorRect + var gameplay_transient_hud := game_ui.get_node( + "UIRoot/CanonicalStage/GameplayTransientHUD" + ) as Control var chat_ui := game_ui.get_node("UIRoot/ChatUI") as ChatUI var player_menu := game_ui.get_node( "UIRoot/CanonicalStage/PlayerMenu" @@ -49,9 +58,15 @@ func _run() -> void: var hotbar := game_ui.get_node( "UIRoot/CanonicalStage/Hotbar" ) as HotbarUI + var home_decor_toolbar := game_ui.get_node( + "UIRoot/CanonicalStage/HomeDecorToolbar" + ) as HomeDecorToolbar assert(game_ui.get_node_or_null( "UIRoot/CanonicalStage/GameplayTransientHUD/EffectStatus" ) == null) + assert(game_ui.get_node_or_null( + "UIRoot/CanonicalStage/GameplayTransientHUD/FishingDangerVignette" + ) == null) var screen_fade := game_ui.get_node("UIRoot/ScreenFade") as Control var title_screen := game_ui.get_node("UIRoot/TitleScreen") as TitleScreen var title_content_stage := title_screen.get_node( @@ -71,15 +86,63 @@ func _run() -> void: root.add_child(presenter) await process_frame chat_ui.set_available(true) + var nameplate_layer := chat_ui.get("_nameplate_layer") as Control var speech_layer := chat_ui.get("_speech_layer") as Control + assert(nameplate_layer != null and nameplate_layer.visible) assert(speech_layer != null and speech_layer.visible) + home_decor_toolbar.set_active(true) + assert(home_decor_toolbar.visible) game_ui.call("_on_player_menu_visibility_changed", true) assert(not chat_ui.is_world_speech_visible()) + assert(not nameplate_layer.visible) assert(not speech_layer.visible) + assert(not home_decor_toolbar.visible) game_ui.call("_on_player_menu_visibility_changed", false) assert(chat_ui.is_world_speech_visible()) + assert(not nameplate_layer.visible) assert(speech_layer.visible) chat_ui.set_available(true) + assert(nameplate_layer.visible) + chat_ui.set_available(false) + assert(not nameplate_layer.visible) + assert(speech_layer.visible) + chat_ui.set_available(true) + assert(nameplate_layer.visible) + chat_ui.set_hud_hidden(true) + assert(not nameplate_layer.visible) + assert(speech_layer.visible) + chat_ui.set_hud_hidden(false) + assert(nameplate_layer.visible) + chat_ui.set_world_nameplates_hud_hidden(true) + assert(not chat_ui.is_hud_hidden()) + assert(not nameplate_layer.visible) + assert(speech_layer.visible) + chat_ui.set_world_nameplates_hud_hidden(false) + assert(nameplate_layer.visible) + assert(home_decor_toolbar.visible) + game_ui.set("_storage_open", true) + game_ui.call("_emit_interactive_pointer_ui_changed") + assert(not home_decor_toolbar.visible) + game_ui.call("_on_player_menu_visibility_changed", true) + game_ui.set("_storage_open", false) + game_ui.call("_emit_interactive_pointer_ui_changed") + assert(not home_decor_toolbar.visible) + game_ui.call("_on_player_menu_visibility_changed", false) + assert(home_decor_toolbar.visible) + home_decor_toolbar.set_active(false) + game_ui.set("_gameplay_ui_enabled", true) + game_ui.set("_gameplay_hud_hidden", false) + game_ui.call("_refresh_gameplay_hud_visibility") + assert(gameplay_screen_effects.visible) + assert(gameplay_transient_hud.visible) + game_ui.set("_system_menu_open", true) + game_ui.call("_refresh_gameplay_hud_visibility") + assert(not gameplay_screen_effects.visible) + assert(not gameplay_transient_hud.visible) + game_ui.set("_system_menu_open", false) + game_ui.set("_gameplay_ui_enabled", false) + game_ui.call("_refresh_gameplay_hud_visibility") + chat_ui.set_available(true) chat_ui.call( "_set_presentation_state", ChatUI.PresentationState.EXPANDED, @@ -121,7 +184,16 @@ func _run() -> void: assert(canonical_stage.position.is_equal_approx( UIReferencePresentationType.get_stage_position(display_size) )) + assert(gameplay_screen_effects.position.is_equal_approx(Vector2.ZERO)) + assert(gameplay_screen_effects.size.is_equal_approx( + expected_visible_size + )) + assert(fishing_danger_vignette.position.is_equal_approx(Vector2.ZERO)) + assert(fishing_danger_vignette.size.is_equal_approx( + expected_visible_size + )) assert(chat_ui.size.is_equal_approx(expected_visible_size)) + assert(nameplate_layer.size.is_equal_approx(expected_visible_size)) assert(screen_fade.size.is_equal_approx(expected_visible_size)) assert(player_menu.position.is_equal_approx(Vector2.ZERO)) assert(player_menu.size.is_equal_approx( diff --git a/tests/world_spawn_protocol_validation.gd b/tests/world_spawn_protocol_validation.gd index 779818e..d828fdf 100644 --- a/tests/world_spawn_protocol_validation.gd +++ b/tests/world_spawn_protocol_validation.gd @@ -9,7 +9,9 @@ const GatheringControllerType = preload( ) const WorldGatherableType = preload("res://gathering/world_gatherable.gd") -const CRAB_PIXEL_SIZE: float = 0.0005 +const CRAB_PIXEL_SIZE: float = 0.01 +const CRAB_SURFACE_OFFSET: float = 0.11 +const CRAB_SPRITE_EXTENT: float = 0.64 const REDUCED_CATCH_RING_RADIUS: float = 0.175 const NET_STRIKE_MARKER_DISTANCE: float = 0.85 const CalendarSeasonType = preload("res://world/calendar_season.gd") @@ -30,7 +32,7 @@ func _run() -> void: var snapshot_entities_per_envelope: int = ( NetworkWorldSpawnProtocol.SNAPSHOT_ENTITIES_PER_ENVELOPE ) - assert(protocol_version == 12) + assert(protocol_version == 13) assert( world_spawn_capability == protocol_world_spawn_capability ) @@ -56,6 +58,10 @@ func _validate_catalog_statuses() -> void: CRAB_PIXEL_SIZE, ) ) + assert(is_equal_approx( + brown.sprite_surface_offset, + CRAB_SURFACE_OFFSET, + )) _validate_quality_behavior(brown) assert(is_equal_approx(brown.capture_respawn_min_seconds, 480.0)) assert(is_equal_approx(brown.capture_respawn_max_seconds, 720.0)) @@ -121,6 +127,11 @@ func _validate_catalog_statuses() -> void: 0.4, )) assert(blue.maximum_surface_population == 16) + assert(is_equal_approx(blue.sprite_pixel_size, CRAB_PIXEL_SIZE)) + assert(is_equal_approx( + blue.sprite_surface_offset, + CRAB_SURFACE_OFFSET, + )) assert(blue.target_population_for_surface_area(100.0) == 4) assert(blue.target_population_for_surface_area(2250.0) == 9) assert(FishCatalog.get_fish_by_id(&"crab_blue") == blue.catch_data) @@ -138,6 +149,10 @@ func _validate_catalog_statuses() -> void: CRAB_PIXEL_SIZE, ) ) + assert(is_equal_approx( + entry.sprite_surface_offset, + CRAB_SURFACE_OFFSET, + )) assert(entry.catch_data.collection_method == FishData.CollectionMethod.NET) assert( entry.catch_data.logbook_section @@ -182,13 +197,22 @@ func _validate_catalog_statuses() -> void: func _validate_billboard_presentation() -> void: var gatherable := WorldGatherableType.new() - gatherable.call("_ensure_visual") + root.add_child(gatherable) + var brown: GatherableData = Gatherables.get_entry(&"crab_brown") + gatherable.configure("crab-size-validation", brown, Vector3.ZERO, 0.0) var sprite := gatherable.get_node("GatherableSprite") as Sprite3D assert(sprite != null) assert(sprite.billboard == BaseMaterial3D.BILLBOARD_ENABLED) assert(sprite.texture_filter == BaseMaterial3D.TEXTURE_FILTER_NEAREST) assert(not sprite.shaded) - gatherable.free() + assert(is_equal_approx(sprite.pixel_size, CRAB_PIXEL_SIZE)) + assert(is_equal_approx(sprite.position.y, CRAB_SURFACE_OFFSET)) + assert(is_equal_approx( + float(sprite.texture.get_width()) * sprite.pixel_size, + CRAB_SPRITE_EXTENT, + )) + gatherable.queue_free() + await process_frame var unconfigured_hotspot := WorldGatherableType.new() unconfigured_hotspot.call("_ensure_water_spurt_visual") diff --git a/ui/chat_ui.gd b/ui/chat_ui.gd index d310def..17b3330 100644 --- a/ui/chat_ui.gd +++ b/ui/chat_ui.gd @@ -25,9 +25,21 @@ const SPEECH_BUBBLE_WIDTH: float = 320.0 const SPEECH_POINTER_HALF_WIDTH: float = 12.0 const SPEECH_POINTER_HEIGHT: float = 14.0 const SPEECH_POINTER_OVERLAP: float = 3.0 +const NAMEPLATE_WIDTH: float = 300.0 +const NAMEPLATE_NAME_HEIGHT: float = 24.0 +const NAMEPLATE_TITLE_TOP: float = 21.0 +const NAMEPLATE_TITLE_HEIGHT: float = 18.0 +const NAMEPLATE_HEIGHT: float = ( + NAMEPLATE_TITLE_TOP + NAMEPLATE_TITLE_HEIGHT +) +const NAMEPLATE_NAME_FONT_SIZE: int = 20 +const NAMEPLATE_TITLE_FONT_SIZE: int = 14 +const NAMEPLATE_HEAD_GAP: float = 3.0 +const NAMEPLATE_SPEECH_GAP: float = 5.0 const ANIMALESE_FULL_VOLUME_DISTANCE: float = 4.0 const ANIMALESE_SILENT_DISTANCE: float = 24.0 const ANIMALESE_SILENT_VOLUME_DB: float = -80.0 +const ROLEPLAY_FONT_SLANT: float = -0.18 const MAX_EDITOR_GIVE_BALANCE: int = 1_000_000_000_000 const MOBILE_COMPACT_WIDTH: float = 620.0 const MOBILE_EXPANDED_WIDTH: float = 820.0 @@ -107,6 +119,7 @@ var _player: Player var _fishing_spot: FishingSpot var _settings: PlayerSettingsManager var _history: RichTextLabel +var _roleplay_font: FontVariation var _entry: LineEdit var _status: Label var _panel: PanelContainer @@ -114,6 +127,7 @@ var _collapse_button: Button var _height_button: Button var _unread_indicator: Label var _hint: Label +var _nameplate_layer: Control var _speech_layer: Control var _animalese_voice: AnimaleseVoiceType var _clock_panel: PanelContainer @@ -125,6 +139,7 @@ var _calendar_balance: CurrencyAmount var _weather_icon: WeatherIconType var _status_effect_column: VBoxContainer var _status_effect_icons: Dictionary[StringName, TextureRect] = {} +var _nameplates: Dictionary[int, Dictionary] = {} var _speech: Dictionary[int, Dictionary] = {} var _draft_save_timer: Timer var _opacity_tween: Tween @@ -132,6 +147,7 @@ var _height_tween: Tween var _opened: bool = false var _available: bool = false var _hud_hidden: bool = false +var _nameplates_hud_hidden: bool = false var _world_speech_visible: bool = true var _presentation_state := PresentationState.COMPACT var _visible_state_before_collapse := PresentationState.COMPACT @@ -247,7 +263,12 @@ func setup( _service.local_message_confirmed.connect(_on_local_message_confirmed) _service.history_replaced.connect(_on_history) _service.send_rejected.connect(_on_rejected) - _session.peer_removed.connect(_on_peer_removed) + _session.peer_authenticated.connect(_on_peer_authenticated) + _session.peer_display_name_changed.connect(_on_peer_display_name_changed) + _session.peer_title_changed.connect(_on_peer_title_changed) + _session.peer_removed.connect(_on_session_peer_removed) + _spawn.avatar_spawned.connect(_on_avatar_spawned) + _spawn.avatar_removed.connect(_on_avatar_removed) _entry.text = _settings.current_settings.chat_draft _entry.caret_column = _entry.text.length() _set_presentation_state( @@ -258,6 +279,7 @@ func setup( false, ) _refresh_history() + _reconcile_nameplates() func _rebuild_status_effect_icons() -> void: @@ -370,6 +392,7 @@ func open_command_chat() -> void: func set_available(value: bool) -> void: _available = value + _refresh_nameplate_layer_visibility() if not value: _clear_suspended_chat_state() _send_pending = false @@ -601,6 +624,7 @@ func _process(_delta: float) -> void: _refresh_visibility() _update_status_effect_icons() _update_panel_opacity() + _update_nameplates() _update_speech() @@ -612,6 +636,11 @@ func _exit_tree() -> void: func _build_ui() -> void: + _roleplay_font = FontVariation.new() + _roleplay_font.base_font = UtilityPageStyle.TuffyFont + var roleplay_transform := Transform2D.IDENTITY + roleplay_transform.y.x = ROLEPLAY_FONT_SLANT + _roleplay_font.variation_transform = roleplay_transform _clock_panel = PanelContainer.new() _clock_panel.name = "WorldClockPanel" _clock_panel.size = CLOCK_SIZE @@ -720,7 +749,9 @@ func _build_ui() -> void: _history.scroll_following = true _history.vertical_alignment = VERTICAL_ALIGNMENT_BOTTOM _history.mouse_filter = Control.MOUSE_FILTER_STOP + _history.bbcode_enabled = false _history.add_theme_font_override("normal_font", UtilityPageStyle.TuffyFont) + _history.add_theme_font_override("italics_font", _roleplay_font) _history.add_theme_font_size_override("normal_font_size", HISTORY_FONT_SIZE) _history.add_theme_color_override("default_color", UtilityPageStyle.LIGHT_TEXT) _history.add_theme_stylebox_override("normal", _borderless_style(Color.TRANSPARENT)) @@ -846,7 +877,16 @@ func _build_ui() -> void: _hint.add_theme_constant_override("shadow_offset_x", 1) _hint.add_theme_constant_override("shadow_offset_y", 2) add_child(_hint) + _nameplate_layer = Control.new() + _nameplate_layer.name = "PlayerNameplateLayer" + _nameplate_layer.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + _nameplate_layer.mouse_filter = Control.MOUSE_FILTER_IGNORE + _nameplate_layer.visible = ( + _available and _world_speech_visible and not _nameplates_hud_hidden + ) + add_child(_nameplate_layer) _speech_layer = Control.new() + _speech_layer.name = "PlayerSpeechLayer" _speech_layer.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) _speech_layer.mouse_filter = Control.MOUSE_FILTER_IGNORE add_child(_speech_layer) @@ -1193,10 +1233,15 @@ func _on_message(message: Dictionary) -> void: _update_panel_opacity(true) if int(message["kind"]) != NetworkChatProtocol.Kind.PLAYER: return + var body: String = str(message["body"]) + # Roleplay actions belong only in chat history. They deliberately do not + # create world speech, animalese, or a talking animation. + if NetworkChatProtocol.is_roleplay_body(body): + return var peer_id: int = message["sender_peer_id"] _show_speech_bubble( peer_id, - str(message["body"]), + body, str(message.get("sender_fingerprint", "")), VoiceProfilesType.sanitized_id(str(message.get( "voice_id", VoiceProfilesType.DEFAULT_ID @@ -1221,6 +1266,8 @@ func _show_speech_bubble( requested_sample_set_id: String = "", ) -> void: _on_peer_removed(peer_id) + if not _speaker_shares_local_space(peer_id): + return var bubble := PanelContainer.new() bubble.mouse_filter = Control.MOUSE_FILTER_IGNORE bubble.custom_minimum_size = Vector2(SPEECH_BUBBLE_WIDTH, 0.0) @@ -1342,16 +1389,27 @@ func _on_rejected(message: String) -> void: func _refresh_history() -> void: if _service == null: return - var lines: Array[String] = [] var messages := _service.get_history() - for message: Dictionary in messages: + _history.clear() + for message_index: int in messages.size(): + var message: Dictionary = messages[message_index] + if message_index > 0: + _history.add_text("\n") if int(message["kind"]) == NetworkChatProtocol.Kind.SYSTEM: - lines.append("• %s" % str(message["body"])) - else: - lines.append("%s: %s" % [ - str(message["sender_display_name"]), str(message["body"]), + _history.add_text("• %s" % str(message["body"])) + continue + var body: String = str(message["body"]) + if NetworkChatProtocol.is_roleplay_body(body): + _history.push_italics() + _history.add_text("%s %s" % [ + str(message["sender_display_name"]), + NetworkChatProtocol.roleplay_action(body), ]) - _history.text = "\n".join(lines) + _history.pop() + continue + _history.add_text("%s: %s" % [ + str(message["sender_display_name"]), body, + ]) _scroll_history_to_bottom.call_deferred() @@ -1465,6 +1523,8 @@ func is_mobile_mode() -> bool: func set_hud_hidden(is_hidden: bool) -> void: _hud_hidden = is_hidden + _nameplates_hud_hidden = is_hidden + _refresh_nameplate_layer_visibility() _refresh_visibility() @@ -1472,8 +1532,14 @@ func is_hud_hidden() -> bool: return _hud_hidden +func set_world_nameplates_hud_hidden(is_hidden: bool) -> void: + _nameplates_hud_hidden = is_hidden + _refresh_nameplate_layer_visibility() + + func set_world_speech_visible(should_be_visible: bool) -> void: _world_speech_visible = should_be_visible + _refresh_nameplate_layer_visibility() if _speech_layer != null: _speech_layer.visible = should_be_visible @@ -1482,6 +1548,14 @@ func is_world_speech_visible() -> bool: return _world_speech_visible +func _refresh_nameplate_layer_visibility() -> void: + if _nameplate_layer == null: + return + _nameplate_layer.visible = ( + _available and _world_speech_visible and not _nameplates_hud_hidden + ) + + func _refresh_handle_labels(state: PresentationState) -> void: var collapsed := state == PresentationState.COLLAPSED var height_state := _visible_state_before_collapse if collapsed else state @@ -1538,11 +1612,217 @@ func _update_panel_opacity(immediate_recheck: bool = false) -> void: ).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_OUT) +func _update_nameplates() -> void: + _reconcile_nameplates() + if _spawn == null or _player == null: + _hide_all_nameplates() + return + var camera := _player.get_active_gameplay_camera() + if camera == null: + _hide_all_nameplates() + return + var viewport_size := get_viewport_rect().size + for peer_id: int in _nameplates.keys(): + var state: Dictionary = _nameplates[peer_id] + var plate := state.get("control") as Control + var avatar := _spawn.get_avatar(peer_id) + if plate == null: + continue + if ( + avatar == null + or not _available + or _nameplates_hud_hidden + or not _world_speech_visible + or not _speaker_shares_local_space(peer_id) + or not _avatar_presentation_visible(peer_id, avatar) + ): + plate.hide() + continue + var world_position := avatar.get_nameplate_anchor_position() + if ( + camera.is_position_behind(world_position) + or _is_speech_world_occluded(camera, avatar, world_position) + ): + plate.hide() + continue + var screen_position := ( + camera.unproject_position(world_position) / _output_scale + ) + if ( + screen_position.x < -NAMEPLATE_WIDTH * 0.5 + or screen_position.x > viewport_size.x + NAMEPLATE_WIDTH * 0.5 + or screen_position.y < -NAMEPLATE_HEIGHT + or screen_position.y > viewport_size.y + NAMEPLATE_HEIGHT + ): + plate.hide() + continue + plate.position = Vector2( + screen_position.x - NAMEPLATE_WIDTH * 0.5, + screen_position.y - NAMEPLATE_HEIGHT - NAMEPLATE_HEAD_GAP, + ) + plate.show() + + +func _reconcile_nameplates() -> void: + if _spawn == null or _session == null or _nameplate_layer == null: + return + var live_peer_ids: Dictionary[int, bool] = {} + for peer_id: int in _spawn.get_peer_ids(): + if ( + _spawn.get_avatar(peer_id) == null + or _session.get_peer_record(peer_id) == null + ): + continue + live_peer_ids[peer_id] = true + _ensure_nameplate(peer_id) + for peer_id: int in _nameplates.keys(): + if not live_peer_ids.has(peer_id): + _remove_nameplate(peer_id) + + +func _ensure_nameplate(peer_id: int) -> void: + if _nameplates.has(peer_id): + _refresh_nameplate_text(peer_id) + return + var plate := Control.new() + plate.name = "PlayerNameplate_%d" % peer_id + plate.size = Vector2(NAMEPLATE_WIDTH, NAMEPLATE_HEIGHT) + plate.mouse_filter = Control.MOUSE_FILTER_IGNORE + plate.hide() + var name_label := _create_nameplate_label( + "PlayerName", + NAMEPLATE_NAME_FONT_SIZE, + 0.0, + NAMEPLATE_NAME_HEIGHT, + ) + var title_label := _create_nameplate_label( + "PlayerTitle", + NAMEPLATE_TITLE_FONT_SIZE, + NAMEPLATE_TITLE_TOP, + NAMEPLATE_TITLE_HEIGHT, + ) + plate.add_child(name_label) + plate.add_child(title_label) + _nameplate_layer.add_child(plate) + _nameplates[peer_id] = { + "control": plate, + "name": name_label, + "title": title_label, + } + _refresh_nameplate_text(peer_id) + + +func _create_nameplate_label( + node_name: String, + font_size: int, + vertical_position: float, + height: float, +) -> Label: + var label := Label.new() + label.name = node_name + label.position = Vector2(0.0, vertical_position) + label.size = Vector2(NAMEPLATE_WIDTH, height) + label.mouse_filter = Control.MOUSE_FILTER_IGNORE + label.clip_text = true + label.text_overrun_behavior = TextServer.OVERRUN_TRIM_ELLIPSIS + label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER + label.add_theme_font_override("font", UtilityPageStyle.TuffyFont) + label.add_theme_font_size_override("font_size", font_size) + label.add_theme_color_override("font_color", Color.WHITE) + label.add_theme_color_override("font_outline_color", Color.TRANSPARENT) + label.add_theme_color_override("font_shadow_color", Color.TRANSPARENT) + label.add_theme_constant_override("outline_size", 0) + label.add_theme_constant_override("shadow_offset_x", 0) + label.add_theme_constant_override("shadow_offset_y", 0) + return label + + +func _refresh_nameplate_text(peer_id: int) -> void: + if _session == null or not _nameplates.has(peer_id): + return + var record := _session.get_peer_record(peer_id) + if record == null: + return + var state: Dictionary = _nameplates[peer_id] + var name_label := state.get("name") as Label + var title_label := state.get("title") as Label + if name_label != null: + name_label.text = ( + record.display_name + if not record.display_name.is_empty() + else NetworkProfilePreferences.DEFAULT_DISPLAY_NAME + ) + if title_label != null: + title_label.text = ( + record.title + if not record.title.is_empty() + else NetworkProfilePreferences.DEFAULT_TITLE + ) + + +func _remove_nameplate(peer_id: int) -> void: + var state: Dictionary = _nameplates.get(peer_id, {}) + var plate := state.get("control") as Control + if plate != null: + plate.queue_free() + _nameplates.erase(peer_id) + + +func _hide_all_nameplates() -> void: + for state: Dictionary in _nameplates.values(): + var plate := state.get("control") as Control + if plate != null: + plate.hide() + + +func _avatar_presentation_visible(peer_id: int, avatar: Player) -> bool: + if _session == null or peer_id == _session.get_local_peer_id(): + return true + return avatar.is_remote_presentation_visible() + + +func _nameplate_speech_clearance(peer_id: int) -> float: + var state: Dictionary = _nameplates.get(peer_id, {}) + var plate := state.get("control") as Control + if plate == null or not plate.is_visible_in_tree(): + return 0.0 + return NAMEPLATE_HEIGHT + NAMEPLATE_HEAD_GAP + NAMEPLATE_SPEECH_GAP + + +func _on_peer_authenticated(peer_id: int, _display_name: String) -> void: + _ensure_nameplate(peer_id) + + +func _on_peer_display_name_changed(peer_id: int, _display_name: String) -> void: + _ensure_nameplate(peer_id) + + +func _on_peer_title_changed(peer_id: int, _title: String) -> void: + _ensure_nameplate(peer_id) + + +func _on_avatar_spawned(peer_id: int, _avatar: Player) -> void: + _ensure_nameplate(peer_id) + + +func _on_avatar_removed(peer_id: int) -> void: + _remove_nameplate(peer_id) + + +func _on_session_peer_removed(peer_id: int) -> void: + _on_peer_removed(peer_id) + _remove_nameplate(peer_id) + + func _update_speech() -> void: var now := Time.get_ticks_msec() / 1000.0 for peer_id: int in _speech.keys(): var state: Dictionary = _speech[peer_id] var bubble := state.get("bubble") as PanelContainer + if not _speaker_shares_local_space(peer_id): + _on_peer_removed(peer_id) + continue if bubble == null or now >= float(state.get("expires", 0.0)): if bubble != null: bubble.queue_free() @@ -1553,10 +1833,14 @@ func _update_speech() -> void: continue var avatar := _spawn.get_avatar(peer_id) var camera := _player.get_active_gameplay_camera() - if avatar == null or camera == null: + if ( + avatar == null + or camera == null + or not _avatar_presentation_visible(peer_id, avatar) + ): bubble.hide() continue - var world_position := avatar.get_chat_anchor_position() + var world_position := avatar.get_nameplate_anchor_position() if camera.is_position_behind(world_position): bubble.hide() continue @@ -1566,6 +1850,7 @@ func _update_speech() -> void: var screen_position := ( camera.unproject_position(world_position) / _output_scale ) + screen_position.y -= _nameplate_speech_clearance(peer_id) var viewport_size := get_viewport_rect().size if ( screen_position.x < -80.0 @@ -1631,10 +1916,27 @@ func _is_speech_world_occluded( if collider is Player: excluded.append(collider.get_rid()) continue + if ( + collider != null + and bool(collider.get_meta( + HomeWorldService.INTERIOR_SHELL_COLLISION_META, false + )) + ): + excluded.append(collider.get_rid()) + continue return true return false +func _speaker_shares_local_space(peer_id: int) -> bool: + if _session == null: + return true + var local_peer_id: int = _session.get_local_peer_id() + if local_peer_id <= 0: + return true + return _session.peers_share_space(local_peer_id, peer_id) + + func _on_draft_changed(_value: String) -> void: if _settings == null: return diff --git a/ui/game_ui.gd b/ui/game_ui.gd index 0141b0c..4f4b271 100644 --- a/ui/game_ui.gd +++ b/ui/game_ui.gd @@ -88,8 +88,6 @@ signal pixelation_settings_visibility_changed(is_visible: bool) signal crisp_reset_focus_requested signal interactive_pointer_ui_changed(is_open: bool) signal passive_pointer_ui_changed(is_enabled: bool) -signal player_menu_backdrop_visibility_changed(is_visible: bool) -signal shop_backdrop_visibility_changed(is_visible: bool) signal virtual_pointer_mode_changed(is_active: bool) signal social_prompt_accepted signal social_prompt_declined @@ -119,6 +117,7 @@ const FISHING_PANEL_SHOWCASE_BOTTOM_OFFSET: float = -104.0 @onready var _status_label: Label = %StatusLabel @onready var _bite_prompt_button: Button = %BitePromptButton @onready var _gameplay_transient_hud: Control = %GameplayTransientHUD +@onready var _gameplay_screen_effects: Control = %GameplayScreenEffects @onready var _active_bait_indicator: Control = %ActiveBaitIndicator @onready var _active_bait_button: Button = %ActiveBaitButton @onready var _active_bait_quantity_badge: Panel = %ActiveBaitQuantityBadge @@ -148,7 +147,8 @@ const VoiceProfilesType = preload( const SHOP_ANIMALESE_VOICE_ID: String = "natural" const SHOP_ANIMALESE_BASE_PITCH: float = 1.08 const SHOP_SPEECH_CHARACTERS_PER_SECOND: float = 28.0 -const SHOP_NPC_SPEECH_COOLDOWN_MILLISECONDS: int = 5000 +const SHOP_PROMPT_DIALOGUE_SIZE := Vector2(300.0, 72.0) +const SHOP_PROMPT_COMPACT_SIZE := Vector2(30.0, 30.0) const FISHING_DANGER_START_GAP: float = 0.15 const FISHING_DANGER_FULL_GAP: float = 0.025 @@ -175,9 +175,11 @@ const FISHING_DANGER_FULL_GAP: float = 0.025 @onready var _shop_prompt_key: Label = %ShopPromptKey @onready var _shop_prompt_pointer: Polygon2D = %ShopPromptPointer var _shop_animalese_voice: AnimaleseVoiceType +var _shop_speech_tween: Tween var _shop_npc_player_in_range: bool = false +var _shop_npc_dialogue_active: bool = false var _shop_npc_spoken_for_current_visit: bool = false -var _shop_npc_next_speech_msec: int = 0 +var _shop_npc_source_id: int = 0 @onready var _chat_ui: ChatUIType = %ChatUI @onready var _emote_radial_menu: EmoteRadialMenuType = %EmoteRadialMenu @onready var _quick_radial_menu: QuickRadialMenuType = %QuickRadialMenu @@ -559,11 +561,8 @@ func setup( _on_storage_visibility_changed ) _fishing_shop.menu_visibility_changed.connect(_on_shop_visibility_changed) - _fishing_shop.menu_exit_started.connect(_on_shop_exit_started) _decor_shop.menu_visibility_changed.connect(_on_shop_visibility_changed) - _decor_shop.menu_exit_started.connect(_on_shop_exit_started) _rv_upgrade_shop.menu_visibility_changed.connect(_on_shop_visibility_changed) - _rv_upgrade_shop.menu_exit_started.connect(_on_shop_exit_started) _fishing_shop.sell_fish_requested.connect(_on_shop_sell_fish_requested) _fishing_shop.shop_cooler_return_requested.connect( _on_shop_cooler_return_requested @@ -700,6 +699,7 @@ func _input(event: InputEvent) -> void: can_open and not _quick_radial_menu.is_open(), ): var emote_is_open: bool = _emote_radial_menu.is_open() + _refresh_home_decor_toolbar_obscuring() if emote_is_open != emote_was_open and _player != null: _player.set_camera_input_suppressed( EMOTE_RADIAL_CAMERA_OWNER, @@ -713,6 +713,7 @@ func _input(event: InputEvent) -> void: can_open and not _emote_radial_menu.is_open(), ): var quick_is_open: bool = _quick_radial_menu.is_open() + _refresh_home_decor_toolbar_obscuring() if quick_is_open != quick_was_open and _player != null: _player.set_camera_input_suppressed( QUICK_RADIAL_CAMERA_OWNER, @@ -755,6 +756,7 @@ func _close_radial_menus() -> void: func _close_emote_radial_menu() -> void: if _emote_radial_menu != null and _emote_radial_menu.is_open(): _emote_radial_menu.close_menu() + _refresh_home_decor_toolbar_obscuring() if _player != null and is_instance_valid(_player): _player.set_camera_input_suppressed( EMOTE_RADIAL_CAMERA_OWNER, @@ -765,6 +767,7 @@ func _close_emote_radial_menu() -> void: func _close_quick_radial_menu() -> void: if _quick_radial_menu != null and _quick_radial_menu.is_open(): _quick_radial_menu.close_menu() + _refresh_home_decor_toolbar_obscuring() if _player != null and is_instance_valid(_player): _player.set_camera_input_suppressed( QUICK_RADIAL_CAMERA_OWNER, @@ -798,6 +801,14 @@ func _character_call_yields_to_world_interaction( _shop_interaction != null and _shop_interaction.is_local_player_in_range() ) + or ( + _decor_shop_interaction != null + and _decor_shop_interaction.is_local_player_in_range() + ) + or ( + _rv_upgrade_shop_interaction != null + and _rv_upgrade_shop_interaction.is_local_player_in_range() + ) or ( _storage_interaction != null and _storage_interaction.is_local_player_in_range() @@ -806,6 +817,8 @@ func _character_call_yields_to_world_interaction( and _fishing_spot != null and _fishing_spot.can_open_fishing_shop() and not _fishing_shop.visible + and not _decor_shop.visible + and not _rv_upgrade_shop.visible ) @@ -1544,12 +1557,19 @@ func _refresh_interaction_prompt_bindings() -> void: func _resize_interaction_prompts() -> void: - var badge_width: float = maxf( - 24.0, - ceilf(_shop_prompt_key.get_combined_minimum_size().x) + 12.0, - ) - _shop_prompt_key_badge.position.x = _shop_prompt.size.x - badge_width + 6.0 - _shop_prompt_key_badge.size.x = badge_width + if not _shop_npc_dialogue_active: + _shop_prompt_key_badge.position = Vector2.ZERO + _shop_prompt_key_badge.size = SHOP_PROMPT_COMPACT_SIZE + else: + var badge_width: float = maxf( + 24.0, + ceilf(_shop_prompt_key.get_combined_minimum_size().x) + 12.0, + ) + _shop_prompt_key_badge.position = Vector2( + _shop_prompt.size.x - badge_width + 6.0, + -8.0, + ) + _shop_prompt_key_badge.size = Vector2(badge_width, 24.0) var storage_width: float = maxf( 220.0, ceilf(_storage_prompt_message.get_combined_minimum_size().x) + 24.0, @@ -1925,6 +1945,7 @@ func _refresh_gameplay_hud_visibility() -> void: and not _storage_open ) _gameplay_transient_hud.visible = show_world_hud + _gameplay_screen_effects.visible = show_world_hud _experience_presentation.visible = ( _gameplay_ui_enabled and not _gameplay_hud_hidden ) @@ -2110,19 +2131,39 @@ func set_shop_prompt_visible( func set_shop_npc_player_in_range( in_range: bool, dialogue_text: String = "", + source_id: int = 0, + dialogue_active: bool = false, ) -> void: + var source_changed: bool = source_id != _shop_npc_source_id + var next_dialogue_active: bool = in_range and dialogue_active + var dialogue_stage_changed: bool = ( + next_dialogue_active != _shop_npc_dialogue_active + ) var dialogue_changed: bool = ( not dialogue_text.is_empty() and _shop_prompt_message.text != dialogue_text ) + if source_changed or dialogue_changed or dialogue_stage_changed: + _cancel_shop_npc_speech() + _shop_npc_source_id = source_id if dialogue_changed: _shop_prompt_message.text = dialogue_text _shop_prompt_message.visible_characters = -1 _shop_npc_spoken_for_current_visit = false - if _shop_npc_player_in_range == in_range and not dialogue_changed: + if source_changed or dialogue_stage_changed: + _shop_npc_spoken_for_current_visit = false + if ( + _shop_npc_player_in_range == in_range + and not dialogue_changed + and not source_changed + and not dialogue_stage_changed + ): return _shop_npc_player_in_range = in_range - if not in_range: + _shop_npc_dialogue_active = next_dialogue_active + _apply_shop_prompt_mode() + if not in_range or not _shop_npc_dialogue_active: + _cancel_shop_npc_speech() _shop_npc_spoken_for_current_visit = false return _try_start_shop_npc_speech() @@ -2131,31 +2172,33 @@ func set_shop_npc_player_in_range( func _try_start_shop_npc_speech() -> void: if ( not _shop_npc_player_in_range + or not _shop_npc_dialogue_active or _shop_npc_spoken_for_current_visit or not _gameplay_ui_enabled ): return - var now_msec: int = Time.get_ticks_msec() - if now_msec < _shop_npc_next_speech_msec: - return _shop_npc_spoken_for_current_visit = true - _shop_npc_next_speech_msec = ( - now_msec + SHOP_NPC_SPEECH_COOLDOWN_MILLISECONDS - ) _ensure_shop_animalese_voice() TypewriterRevealType.start( _shop_prompt_message, SHOP_SPEECH_CHARACTERS_PER_SECOND, ) - _shop_animalese_voice.speak_text( + _shop_speech_tween = _shop_animalese_voice.speak_text( _shop_prompt_message, _shop_prompt_message.text, - "shopkeeper", + "shopkeeper:%d" % _shop_npc_source_id, SHOP_ANIMALESE_VOICE_ID, SHOP_SPEECH_CHARACTERS_PER_SECOND, ) +func _cancel_shop_npc_speech() -> void: + TypewriterRevealType.cancel(_shop_prompt_message) + if _shop_speech_tween != null and _shop_speech_tween.is_valid(): + _shop_speech_tween.kill() + _shop_speech_tween = null + + func _ensure_shop_animalese_voice() -> void: if _shop_animalese_voice != null: return @@ -2191,6 +2234,29 @@ func _apply_shop_prompt_style() -> void: UtilityPageStyle.OCEAN_PANEL_MID, 0.96, ) + _apply_shop_prompt_mode() + + +func _apply_shop_prompt_mode() -> void: + if not is_node_ready(): + return + var dialogue_mode: bool = _shop_npc_dialogue_active + var requested_size := ( + SHOP_PROMPT_DIALOGUE_SIZE + if dialogue_mode + else SHOP_PROMPT_COMPACT_SIZE + ) + _shop_prompt.custom_minimum_size = requested_size + _shop_prompt.size = requested_size + _shop_prompt_bubble.visible = dialogue_mode + _shop_prompt_message.visible = dialogue_mode + _shop_prompt_pointer.visible = dialogue_mode + var badge_style := ( + _shop_prompt_key_badge.get_theme_stylebox("panel") as StyleBoxFlat + ) + if badge_style != null: + badge_style.set_corner_radius_all(12 if dialogue_mode else 15) + _resize_interaction_prompts() func _position_shop_prompt(world_anchor: Vector3) -> void: @@ -2219,7 +2285,7 @@ func _position_shop_prompt(world_anchor: Vector3) -> void: ): _shop_prompt.hide() return - var pointer_height := 10.0 + var pointer_height := 10.0 if _shop_npc_dialogue_active else 6.0 var desired := screen_position - Vector2( _shop_prompt.size.x * 0.5, _shop_prompt.size.y + pointer_height, @@ -2236,14 +2302,15 @@ func _position_shop_prompt(world_anchor: Vector3) -> void: ui_viewport_size.y - _shop_prompt.size.y - pointer_height - 8.0, ), ) - _shop_prompt_pointer.position = Vector2( - clampf( - screen_position.x - _shop_prompt.position.x, - 20.0, - _shop_prompt.size.x - 20.0, - ), - _shop_prompt.size.y - 1.0, - ) + if _shop_npc_dialogue_active: + _shop_prompt_pointer.position = Vector2( + clampf( + screen_position.x - _shop_prompt.position.x, + 20.0, + _shop_prompt.size.x - 20.0, + ), + _shop_prompt.size.y - 1.0, + ) func get_screen_fade() -> ScreenFade: @@ -2831,7 +2898,6 @@ func _on_player_menu_visibility_changed(is_open: bool) -> void: true, UIMotion.PLAYER_MENU_ENTER_DURATION, ) - player_menu_backdrop_visibility_changed.emit(true) else: _player_menu_hotbar_visible = false _hotbar_ui.set_presentation_visible(false, false) @@ -2862,13 +2928,6 @@ func _on_player_menu_exit_started() -> void: true, UIMotion.PLAYER_MENU_EXIT_DURATION, ) - player_menu_backdrop_visibility_changed.emit(false) - - -func _on_shop_exit_started() -> void: - if not _shop_open: - return - shop_backdrop_visibility_changed.emit(false) func _on_shop_visibility_changed(is_open: bool) -> void: @@ -2876,8 +2935,6 @@ func _on_shop_visibility_changed(is_open: bool) -> void: if is_open: _close_radial_menus() _refresh_surface_drawing_activation() - if is_open: - shop_backdrop_visibility_changed.emit(true) if not is_open and _player_menu.is_shop_cooler_mounted(): _player_menu.unmount_shop_cooler() _refresh_gameplay_hud_visibility() @@ -3049,6 +3106,7 @@ func _refresh_hotbar_visibility() -> void: func _emit_interactive_pointer_ui_changed() -> void: _refresh_active_bait_indicator_visibility() _refresh_rv_storage_button_visibility() + _refresh_home_decor_toolbar_obscuring() interactive_pointer_ui_changed.emit( _system_menu_open or _player_menu_open @@ -3058,6 +3116,26 @@ func _emit_interactive_pointer_ui_changed() -> void: ) +func _refresh_home_decor_toolbar_obscuring() -> void: + if _home_decor_toolbar == null: + return + _home_decor_toolbar.set_menu_obscured( + _system_menu_open + or _player_menu_open + or _shop_open + or _storage_open + or _chat_input_open + or ( + _emote_radial_menu != null + and _emote_radial_menu.is_open() + ) + or ( + _quick_radial_menu != null + and _quick_radial_menu.is_open() + ) + ) + + func _on_chat_text_entry_ownership_changed(active: bool) -> void: _chat_input_open = active if active: @@ -3080,4 +3158,5 @@ func _refresh_chat_availability() -> void: ) _chat_ui.set_available(chat_available) _chat_ui.set_hud_hidden(_gameplay_hud_hidden and not _chat_input_open) + _chat_ui.set_world_nameplates_hud_hidden(_gameplay_hud_hidden) passive_pointer_ui_changed.emit(chat_available) diff --git a/ui/game_ui.tscn b/ui/game_ui.tscn index c5dea31..6c802e0 100644 --- a/ui/game_ui.tscn +++ b/ui/game_ui.tscn @@ -81,7 +81,7 @@ mouse_filter = 2 [node name="SurfaceDrawingToolbar" parent="UIRoot" instance=ExtResource("11_drawing_toolbar")] unique_name_in_owner = true -[node name="GameplayTransientHUD" type="Control" parent="UIRoot/CanonicalStage"] +[node name="GameplayScreenEffects" type="Control" parent="UIRoot"] unique_name_in_owner = true layout_mode = 1 anchors_preset = 15 @@ -91,7 +91,7 @@ grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 -[node name="FishingDangerVignette" type="ColorRect" parent="UIRoot/CanonicalStage/GameplayTransientHUD"] +[node name="FishingDangerVignette" type="ColorRect" parent="UIRoot/GameplayScreenEffects"] unique_name_in_owner = true visible = false z_index = 50 @@ -105,6 +105,16 @@ mouse_filter = 2 material = SubResource("ShaderMaterial_fishing_vignette") color = Color(1, 1, 1, 1) +[node name="GameplayTransientHUD" type="Control" parent="UIRoot/CanonicalStage"] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + [node name="ActiveBaitIndicator" type="Control" parent="UIRoot/CanonicalStage/GameplayTransientHUD"] unique_name_in_owner = true z_index = 54 diff --git a/ui/network/join_game_page.gd b/ui/network/join_game_page.gd index 1cd6c10..71b39c2 100644 --- a/ui/network/join_game_page.gd +++ b/ui/network/join_game_page.gd @@ -801,7 +801,10 @@ func _refresh_entries() -> void: else "online" ) _server_list.add_item("%s — %s" % [ - str(friend.get("display_name", "Player")), state, + str(friend.get( + "display_name", + NetworkProfilePreferences.DEFAULT_DISPLAY_NAME, + )), state, ]) return if _saved_servers == null or _mode == Mode.DIRECT: @@ -1451,7 +1454,9 @@ func _format_friend_details(friend: Dictionary) -> String: return "Select a friend." var room := _selected_friend_room() var lines: Array[String] = [ - "Friend: %s" % str(friend.get("display_name", "Player")), + "Friend: %s" % str(friend.get( + "display_name", NetworkProfilePreferences.DEFAULT_DISPLAY_NAME + )), "Status: %s" % ( "online" if bool(friend.get("online", false)) else "offline" ), diff --git a/ui/players_page.gd b/ui/players_page.gd index 31ebad5..396f3b4 100644 --- a/ui/players_page.gd +++ b/ui/players_page.gd @@ -689,7 +689,10 @@ func _build_relationship_rows() -> void: label.text_overrun_behavior = TextServer.OVERRUN_TRIM_ELLIPSIS var fingerprint := str(record["fingerprint"]) label.text = "%s %s" % [ - str(record.get("last_known_display_name", "Player")), + str(record.get( + "last_known_display_name", + NetworkProfilePreferences.DEFAULT_DISPLAY_NAME, + )), "Blocked" if bool(record.get("blocked", false)) else "Muted", ] _configure_identity_tooltip( @@ -733,7 +736,9 @@ func _build_friend_rows() -> void: for friend: Dictionary in friends: var row := _make_row() var fingerprint := str(friend.get("fingerprint", "")) - var display_name := str(friend.get("display_name", "Player")) + var display_name := str(friend.get( + "display_name", NetworkProfilePreferences.DEFAULT_DISPLAY_NAME + )) var room: Dictionary = ( friend.get("room", {}) if typeof(friend.get("room", {})) == TYPE_DICTIONARY @@ -835,7 +840,10 @@ func _build_ban_rows() -> void: label.clip_text = true label.text_overrun_behavior = TextServer.OVERRUN_TRIM_ELLIPSIS label.text = "%s banned %s" % [ - str(record.get("last_known_display_name", "Player")), + str(record.get( + "last_known_display_name", + NetworkProfilePreferences.DEFAULT_DISPLAY_NAME, + )), Time.get_date_string_from_unix_time(int(record.get("banned_unix", 0))), ] _configure_identity_tooltip( diff --git a/ui/profile_page.gd b/ui/profile_page.gd index 910333b..c94a0b2 100644 --- a/ui/profile_page.gd +++ b/ui/profile_page.gd @@ -34,6 +34,7 @@ const VoiceProfilesType = preload( "res://player/animalese_voice_profiles.gd" ) const VOICE_CATEGORY_ID: String = "voice" +const NAME_TOOLTIP_BASE: String = "Shown to other players in multiplayer." enum ControllerZone { ACCOUNT, @@ -45,8 +46,10 @@ enum ControllerZone { var _service: NetworkProfileService var _experience: PlayerExperience var _draft_name: String = "" +var _draft_title: String = NetworkProfilePreferences.DEFAULT_TITLE var _draft_appearance: Dictionary = {} var _persisted_name: String = "" +var _persisted_title: String = NetworkProfilePreferences.DEFAULT_TITLE var _persisted_appearance: Dictionary = {} var _draft_voice_id: String = VoiceProfilesType.DEFAULT_ID var _persisted_voice_id: String = VoiceProfilesType.DEFAULT_ID @@ -61,6 +64,8 @@ var _dirty: bool = false var _allow_duplicate: bool = false var _name_edit: LineEdit +var _title_edit: LineEdit +var _name_label: Label var _name_status: Label var _suggestions: HBoxContainer var _category_list: VBoxContainer @@ -215,8 +220,9 @@ func consume_escape() -> bool: if _discard_confirmation.visible: _close_discard_confirmation() return true - if _name_edit.has_focus(): + if _name_edit.has_focus() or _title_edit.has_focus(): _name_edit.release_focus() + _title_edit.release_focus() return true if _dirty: _show_confirmation("discard") @@ -426,6 +432,18 @@ func _focus_controller_zone() -> void: if not _profile_interactive: return var controls: Array[Control] = _active_controller_zone_controls() + # The account zone starts with a LineEdit in layout order. Do not activate + # text entry merely because the Profile page opened or controller focus + # returned from customization; keep the name field opt-in. + if ( + _controller_zone == ControllerZone.ACCOUNT + and _customize_button in controls + and _customize_button.focus_mode != Control.FOCUS_NONE + and _customize_button.is_visible_in_tree() + and not _customize_button.disabled + ): + _customize_button.grab_focus() + return for control: Control in controls: var button := control as BaseButton if ( @@ -496,6 +514,7 @@ func _account_controller_controls() -> Array[Control]: var controls: Array[Control] = [] for control: Control in [ _name_edit, + _title_edit, _customize_button, _apply_button, _revert_button, @@ -604,22 +623,26 @@ func _build_ui() -> void: layout.add_child(account_row) var account_stack := VBoxContainer.new() account_stack.size_flags_horizontal = Control.SIZE_EXPAND_FILL - account_stack.add_theme_constant_override("separation", 2) + account_stack.add_theme_constant_override("separation", 7) account_row.add_child(account_stack) var name_line := HBoxContainer.new() + name_line.name = "PlayerNameRow" name_line.add_theme_constant_override("separation", 10) account_stack.add_child(name_line) - var name_label := Label.new() - name_label.text = "player name" - name_label.custom_minimum_size.x = 98.0 - name_label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER - name_label.add_theme_color_override( + _name_label = Label.new() + _name_label.name = "PlayerNameLabel" + _name_label.text = "name" + _name_label.tooltip_text = NAME_TOOLTIP_BASE + _name_label.custom_minimum_size.x = 128.0 + _name_label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER + _name_label.add_theme_color_override( "font_color", UtilityPageStyle.OCEAN_TEXT_PRIMARY ) - name_line.add_child(name_label) + name_line.add_child(_name_label) _name_edit = LineEdit.new() + _name_edit.name = "PlayerNameEdit" _name_edit.max_length = NetworkProtocol.MAX_DISPLAY_NAME_LENGTH - _name_edit.placeholder_text = "Player" + _name_edit.placeholder_text = NetworkProfilePreferences.DEFAULT_DISPLAY_NAME _name_edit.custom_minimum_size = Vector2(280, 34) UtilityPageStyle.apply_ocean_line_edit(_name_edit) _name_edit.add_theme_stylebox_override( @@ -629,23 +652,46 @@ func _build_ui() -> void: ) _name_edit.text_changed.connect(_on_name_changed) name_line.add_child(_name_edit) - var helper := Label.new() - helper.text = "Shown to other players in multiplayer." - helper.add_theme_font_size_override("font_size", 12) - helper.add_theme_color_override( - "font_color", UtilityPageStyle.OCEAN_TEXT_SECONDARY + var title_line := HBoxContainer.new() + title_line.name = "PlayerTitleRow" + title_line.add_theme_constant_override("separation", 10) + account_stack.add_child(title_line) + var title_label := Label.new() + title_label.name = "PlayerTitleLabel" + title_label.text = "title" + title_label.tooltip_text = "Shown below your name to other players." + title_label.custom_minimum_size.x = 128.0 + title_label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER + title_label.add_theme_color_override( + "font_color", UtilityPageStyle.OCEAN_TEXT_PRIMARY ) - account_stack.add_child(helper) + title_line.add_child(title_label) + _title_edit = LineEdit.new() + _title_edit.name = "PlayerTitleEdit" + _title_edit.max_length = NetworkProtocol.MAX_PLAYER_TITLE_LENGTH + _title_edit.placeholder_text = NetworkProfilePreferences.DEFAULT_TITLE + _title_edit.custom_minimum_size = Vector2(280, 34) + UtilityPageStyle.apply_ocean_line_edit(_title_edit) + _title_edit.add_theme_stylebox_override( + "normal", UtilityPageStyle.ocean_button_style( + UtilityPageStyle.OCEAN_PANEL_MID + ) + ) + _title_edit.text_changed.connect(_on_title_changed) + title_line.add_child(_title_edit) _name_status = Label.new() - _name_status.add_theme_font_size_override("font_size", 12) - _name_status.add_theme_color_override( - "font_color", UtilityPageStyle.OCEAN_TEXT_SECONDARY - ) + _name_status.name = "PlayerNameStatus" + _name_status.visible = false account_stack.add_child(_name_status) _suggestions = HBoxContainer.new() _suggestions.add_theme_constant_override("separation", 6) account_stack.add_child(_suggestions) + var account_info_stack := VBoxContainer.new() + account_info_stack.name = "ProfileIdentityStack" + account_info_stack.size_flags_horizontal = Control.SIZE_EXPAND_FILL + account_info_stack.add_theme_constant_override("separation", 7) + account_row.add_child(account_info_stack) var identity_value := Label.new() identity_value.name = "IdentityFingerprint" identity_value.text = "identity • stored on this device" @@ -656,11 +702,14 @@ func _build_ui() -> void: identity_value.add_theme_color_override( "font_color", UtilityPageStyle.OCEAN_TEXT_SECONDARY ) - account_stack.add_child(identity_value) + identity_value.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT + account_info_stack.add_child(identity_value) var experience_row := HBoxContainer.new() + experience_row.name = "ProfileExperienceRow" + experience_row.alignment = BoxContainer.ALIGNMENT_END experience_row.add_theme_constant_override("separation", 9) - account_stack.add_child(experience_row) + account_info_stack.add_child(experience_row) _experience_level = Label.new() _experience_level.custom_minimum_size.x = 64.0 _experience_level.add_theme_font_size_override("font_size", 14) @@ -695,7 +744,7 @@ func _build_ui() -> void: actions.alignment = BoxContainer.ALIGNMENT_END actions.size_flags_vertical = Control.SIZE_SHRINK_BEGIN actions.add_theme_constant_override("separation", 7) - account_row.add_child(actions) + account_info_stack.add_child(actions) _customize_button = Button.new() _customize_button.text = "customize" _customize_button.custom_minimum_size.x = 96.0 @@ -2127,10 +2176,16 @@ func _on_name_changed(value: String) -> void: _refresh_actions() _clear_suggestions() if NetworkProfilePreferences.is_valid_display_name(value): - _name_status.text = "Checking this game…" + _set_name_status("Checking this game…") _debounce.start() else: - _name_status.text = "Use 1–24 plain-text characters." + _set_name_status("Use 1–24 plain-text characters.") + + +func _on_title_changed(value: String) -> void: + _draft_title = value + _dirty = _draft_differs() + _refresh_actions() func _request_conflict_check() -> void: @@ -2145,9 +2200,9 @@ func _on_conflict_result( ) -> void: _clear_suggestions() if not has_conflict: - _name_status.text = "Name is available in this game." + _set_name_status("Name is available in this game.") return - _name_status.text = "That name is already in use in this game." + _set_name_status("That name is already in use in this game.") for suggestion: String in suggestion_names: var button := Button.new() button.text = suggestion @@ -2158,7 +2213,7 @@ func _on_conflict_result( anyway.text = "use anyway" anyway.pressed.connect(func() -> void: _allow_duplicate = true - _name_status.text = "Duplicate name allowed for this apply." + _set_name_status("Duplicate name allowed for this apply.") ) UtilityPageStyle.apply_compact_ocean_button(anyway) _suggestions.add_child(anyway) @@ -2209,12 +2264,13 @@ func _apply() -> void: _draft_speech_speed_id, _draft_call_id, _draft_sample_set_id, + _draft_title, ) func _on_apply_finished(accepted: bool, message: String) -> void: _apply_button.disabled = false - _name_status.text = message + _set_name_status(message) if accepted: _load_persisted() @@ -2223,6 +2279,7 @@ func _load_persisted() -> void: if _service == null: return _persisted_name = _service.get_persisted_name() + _persisted_title = _service.get_persisted_title() _persisted_appearance = _service.get_persisted_appearance() _persisted_voice_id = _service.get_persisted_voice_id() _persisted_speech_speed_id = ( @@ -2231,6 +2288,7 @@ func _load_persisted() -> void: _persisted_call_id = _service.get_persisted_call_id() _persisted_sample_set_id = _service.get_persisted_sample_set_id() _draft_name = _persisted_name + _draft_title = _persisted_title _draft_appearance = _persisted_appearance.duplicate(true) _draft_voice_id = _persisted_voice_id _draft_speech_speed_id = _persisted_speech_speed_id @@ -2240,12 +2298,13 @@ func _load_persisted() -> void: VoiceProfilesType.speed_for(_persisted_speech_speed_id) ) _name_edit.text = _draft_name + _title_edit.text = _draft_title _preview.apply_appearance_profile(_draft_appearance) _appearance_preview_timer.stop() _service.preview_appearance(_persisted_appearance) _dirty = false _allow_duplicate = false - _name_status.text = "" + _set_name_status("") _clear_suggestions() _refresh_options() _refresh_actions() @@ -2288,6 +2347,8 @@ func _confirm_pending_action() -> void: _draft_speech_speed_id = VoiceProfilesType.DEFAULT_SPEED_ID _draft_call_id = VoiceProfilesType.DEFAULT_CALL_ID _draft_sample_set_id = VoiceProfilesType.DEFAULT_SAMPLE_SET_ID + _draft_title = NetworkProfilePreferences.DEFAULT_TITLE + _title_edit.text = _draft_title _preview.apply_appearance_profile(_draft_appearance) _queue_draft_appearance_preview() _dirty = _draft_differs() @@ -2318,6 +2379,7 @@ func _publish_draft_appearance() -> void: func _draft_differs() -> bool: return ( _draft_name.strip_edges() != _persisted_name + or _draft_title.strip_edges() != _persisted_title or _draft_appearance != _persisted_appearance or _draft_voice_id != _persisted_voice_id or _draft_speech_speed_id != _persisted_speech_speed_id @@ -2330,6 +2392,7 @@ func _refresh_actions() -> void: _apply_button.disabled = ( not _dirty or not NetworkProfilePreferences.is_valid_display_name(_draft_name) + or not NetworkProfilePreferences.is_valid_title(_draft_title) ) _revert_button.disabled = not _dirty @@ -2339,3 +2402,12 @@ func _clear_suggestions() -> void: _suggestions.remove_child(child) child.queue_free() _apply_controller_zone_focus() + + +func _set_name_status(message: String) -> void: + _name_status.text = message + _name_label.tooltip_text = ( + NAME_TOOLTIP_BASE + if message.is_empty() + else "%s\n%s" % [NAME_TOOLTIP_BASE, message] + ) diff --git a/ui/save_slots_page.gd b/ui/save_slots_page.gd index 41b25b4..c8666fc 100644 --- a/ui/save_slots_page.gd +++ b/ui/save_slots_page.gd @@ -34,6 +34,7 @@ enum SeedMode { @onready var _empty_slots_label: Label = %EmptySlotsLabel @onready var _slot_name_edit: LineEdit = %SelectedSlotName @onready var _slot_summary: RichTextLabel = %SlotSummary +@onready var _online_slot_button: CheckButton = %OnlineSlotButton @onready var _play_button: Button = %PlaySlotButton @onready var _rename_button: Button = %RenameSlotButton @onready var _duplicate_button: Button = %DuplicateSlotButton @@ -75,6 +76,7 @@ func _ready() -> void: _saves_tab.pressed.connect(_select_page.bind(PAGE_SAVES, true)) _new_slot_tab.pressed.connect(_open_fresh_slot_page) _play_button.pressed.connect(_request_play) + _online_slot_button.toggled.connect(_on_online_slot_toggled) _rename_button.pressed.connect(_rename_selected_slot) _duplicate_button.pressed.connect(_prepare_duplicate) _export_button.pressed.connect(_choose_export_path) @@ -285,9 +287,14 @@ func _refresh_slots() -> void: button.size_flags_horizontal = Control.SIZE_EXPAND_FILL button.focus_mode = Control.FOCUS_ALL button.toggle_mode = true - button.text = str(slot.get("display_name", "save")) + ( - " · active" if bool(slot.get("active", false)) else "" - ) + var markers: Array[String] = [] + if bool(slot.get("active", false)): + markers.append("loaded") + if bool(slot.get("online", false)): + markers.append("online") + button.text = str(slot.get("display_name", "save")) + if not markers.is_empty(): + button.text += " · " + " · ".join(markers) button.alignment = HORIZONTAL_ALIGNMENT_LEFT UtilityPageStyle.apply_ocean_button(button) button.pressed.connect(_select_slot.bind(slot_id, false)) @@ -321,10 +328,14 @@ func _refresh_selected_slot() -> void: _slot_name_edit.text = "" _slot_name_edit.editable = false _slot_summary.text = "[center]create or import a save slot to begin.[/center]" + _online_slot_button.set_pressed_no_signal(false) else: _slot_name_edit.editable = true _slot_name_edit.text = str(slot.get("display_name", "save")) _slot_summary.text = _format_slot_summary(slot) + _online_slot_button.set_pressed_no_signal( + bool(slot.get("online", false)) + ) _refresh_action_state() @@ -337,9 +348,9 @@ func _format_slot_summary(slot: Dictionary) -> String: int(slot.get("last_played_at_unix", 0)) ) return ( - "[font_size=24]level %d[/font_size]\n\n" + "[font_size=24]level %d[/font_size]\n" + "%d catches · %d discovered\n" - + "%d fishcoins\n\n" + + "%d fishcoins\n" + "%s · seed %d\n" + "last played %s" ) % [ @@ -358,6 +369,7 @@ func _refresh_action_state() -> void: var has_slot: bool = not slot.is_empty() var has_save: bool = has_slot and bool(slot.get("has_save", false)) _play_button.disabled = _busy or not has_save + _online_slot_button.disabled = _busy or not has_save _rename_button.disabled = _busy or not has_slot _duplicate_button.disabled = _busy or not has_save _export_button.disabled = _busy or not has_save @@ -375,6 +387,21 @@ func _request_play() -> void: play_requested.emit(_selected_slot_id) +func _on_online_slot_toggled(enabled: bool) -> void: + if _catalog == null or _selected_slot_id.is_empty(): + return + if not enabled: + _online_slot_button.set_pressed_no_signal( + _catalog.get_online_slot_id() == _selected_slot_id + ) + return + if not _catalog.mark_slot_for_online(_selected_slot_id): + _status.text = "the online progression could not be changed." + _online_slot_button.set_pressed_no_signal(false) + return + _status.text = "this progression will be used when joining online games." + + func _rename_selected_slot() -> void: if _catalog == null or _rename_button.disabled: return @@ -644,8 +671,9 @@ func _configure_controller_focus() -> void: var bottom: Control = _import_button if index == _slot_buttons.size() - 1 else _slot_buttons[index + 1] _set_neighbors(button, button, _slot_name_edit, top, bottom) _set_neighbors(_import_button, _import_button, _slot_name_edit, last, _back_button) - _set_neighbors(_slot_name_edit, first, _slot_name_edit, _saves_tab, _play_button) - _set_neighbors(_play_button, _import_button, _play_button, _slot_name_edit, _rename_button) + _set_neighbors(_slot_name_edit, first, _slot_name_edit, _saves_tab, _online_slot_button) + _set_neighbors(_online_slot_button, _import_button, _online_slot_button, _slot_name_edit, _play_button) + _set_neighbors(_play_button, _import_button, _play_button, _online_slot_button, _rename_button) _set_neighbors(_rename_button, _import_button, _duplicate_button, _play_button, _export_button) _set_neighbors(_duplicate_button, _rename_button, _duplicate_button, _play_button, _delete_button) _set_neighbors(_export_button, _import_button, _delete_button, _rename_button, _back_button) diff --git a/ui/save_slots_page.tscn b/ui/save_slots_page.tscn index 87d5f93..982cd0a 100644 --- a/ui/save_slots_page.tscn +++ b/ui/save_slots_page.tscn @@ -140,7 +140,7 @@ layout_mode = 2 [node name="DetailsColumn" type="VBoxContainer" parent="MainPanel/OuterMargin/Layout/ContentPanel/ContentMargin/PageStack/SavesPage"] layout_mode = 2 size_flags_horizontal = 3 -theme_override_constants/separation = 10 +theme_override_constants/separation = 8 [node name="Title" type="Label" parent="MainPanel/OuterMargin/Layout/ContentPanel/ContentMargin/PageStack/SavesPage/DetailsColumn"] layout_mode = 2 @@ -165,6 +165,14 @@ scroll_active = false autowrap_mode = 2 vertical_alignment = 1 +[node name="OnlineSlotButton" type="CheckButton" parent="MainPanel/OuterMargin/Layout/ContentPanel/ContentMargin/PageStack/SavesPage/DetailsColumn"] +unique_name_in_owner = true +custom_minimum_size = Vector2(0, 44) +layout_mode = 2 +focus_mode = 2 +text = "use this save online" +tooltip_text = "Use this save when joining an online room" + [node name="Actions" type="VBoxContainer" parent="MainPanel/OuterMargin/Layout/ContentPanel/ContentMargin/PageStack/SavesPage/DetailsColumn"] unique_name_in_owner = true layout_mode = 2 @@ -330,7 +338,7 @@ text = "create and play" [node name="FooterGroup" type="MarginContainer" parent="MainPanel/OuterMargin/Layout"] layout_mode = 2 -theme_override_constants/margin_top = 34 +theme_override_constants/margin_top = 32 [node name="FooterLayout" type="VBoxContainer" parent="MainPanel/OuterMargin/Layout/FooterGroup"] layout_mode = 2 diff --git a/ui/title_screen.gd b/ui/title_screen.gd index d39be9c..f376fae 100644 --- a/ui/title_screen.gd +++ b/ui/title_screen.gd @@ -628,6 +628,7 @@ func _prepare_awaiting_start_input() -> void: _continue_stats_drawer.hide() _continue_stats_drawer.modulate.a = 0.0 _continue_stats_drawer.scale = Vector2(1.0, 0.001) + _version_row.show() _main_content.show() _start_prompt_center.show() _start_prompt_center.modulate.a = 1.0 @@ -927,6 +928,7 @@ func _on_continue_pressed() -> void: _release_primary_menu_focus() _presentation_center.hide() _start_prompt_center.hide() + _version_row.hide() _join_game_page.close_page() _credits_page.close_page() _new_game_setup_page.close_page() @@ -935,6 +937,7 @@ func _on_continue_pressed() -> void: func _close_save_slots() -> void: _save_slots_page.close_page() + _version_row.show() _presentation_center.show() _button_center.show() _start_prompt_center.hide() diff --git a/ui/typewriter_reveal.gd b/ui/typewriter_reveal.gd index aa4f3d6..e068451 100644 --- a/ui/typewriter_reveal.gd +++ b/ui/typewriter_reveal.gd @@ -4,6 +4,7 @@ extends RefCounted const DEFAULT_CHARACTERS_PER_SECOND: float = 28.0 const MIN_CHARACTERS_PER_SECOND: float = 12.0 const MAX_CHARACTERS_PER_SECOND: float = 60.0 +const ACTIVE_TWEEN_META: StringName = &"typewriter_reveal_active_tween" static var _characters_per_second: float = DEFAULT_CHARACTERS_PER_SECOND @@ -26,6 +27,7 @@ static func start( ) -> float: if label == null: return 0.0 + cancel(label, false) var character_count: int = label.get_total_character_count() if character_count <= 0: label.visible_characters = -1 @@ -38,10 +40,39 @@ static func start( ) var duration := float(character_count) / resolved_characters_per_second var reveal_tween := label.create_tween() + label.set_meta(ACTIVE_TWEEN_META, reveal_tween) reveal_tween.tween_property( label, "visible_characters", character_count, duration, ).from(0).set_trans(Tween.TRANS_LINEAR) + reveal_tween.finished.connect( + _on_reveal_finished.bind(label, reveal_tween), + CONNECT_ONE_SHOT, + ) return duration + + +static func cancel(label: Label, reveal_all: bool = true) -> void: + if label == null: + return + var reveal_tween: Tween + if label.has_meta(ACTIVE_TWEEN_META): + reveal_tween = label.get_meta(ACTIVE_TWEEN_META) as Tween + if reveal_tween != null and reveal_tween.is_valid(): + reveal_tween.kill() + if label.has_meta(ACTIVE_TWEEN_META): + label.remove_meta(ACTIVE_TWEEN_META) + if reveal_all: + label.visible_characters = -1 + + +static func _on_reveal_finished(label: Label, reveal_tween: Tween) -> void: + if label == null or not is_instance_valid(label): + return + if ( + label.has_meta(ACTIVE_TWEEN_META) + and label.get_meta(ACTIVE_TWEEN_META) == reveal_tween + ): + label.remove_meta(ACTIVE_TWEEN_META) From 41b4f86ddfcfa41b2d5db9fa75ed08b189250ebe Mon Sep 17 00:00:00 2001 From: Voyager Date: Tue, 1 Sep 2026 19:00:13 -0400 Subject: [PATCH 35/37] restore full world effects outside portmaster --- docs/PORTMASTER.md | 23 +- export_presets.cfg | 30 +++ main/main.gd | 25 +++ main/runtime_performance_profile.gd | 11 + scripts/build_portmaster.sh | 19 +- tests/controller_ui_navigation_validation.gd | 10 + tests/generated_world_runtime_validation.gd | 43 ++++ tests/light_performance_profile_validation.gd | 205 +++++++++--------- tests/world_layout_validation.gd | 30 +++ world/generation/generated_world_region.gd | 37 +++- world/generation/generated_world_region.tscn | 6 +- world/regions/starter_island_region.gd | 32 ++- world/regions/world_region.gd | 8 + world/test_world.gd | 24 ++ world/water_surface_motion.gd | 17 +- 15 files changed, 398 insertions(+), 122 deletions(-) diff --git a/docs/PORTMASTER.md b/docs/PORTMASTER.md index 6fbeb26..262f930 100644 --- a/docs/PORTMASTER.md +++ b/docs/PORTMASTER.md @@ -76,9 +76,11 @@ builds/v/straywild.zip ``` `--package-only` is reserved for repackaging an already validated -PortMaster-specific ARM64 export. It does not rebuild game content. The -standard Linux ARM64 release staging directory remains separate so building -PortMaster cannot replace the normal Linux ARM64 payload with reduced assets. +PortMaster-specific ARM64 export. It does not rebuild game content, and verifies +the tagged-export marker written by a prior full build so a generic Linux ARM64 +binary cannot accidentally be repackaged as PortMaster. The standard Linux +ARM64 release staging directory remains separate so building PortMaster cannot +replace the normal Linux ARM64 payload with reduced assets. For a packaging-only correction to an already published game release, commit only PortMaster launcher, packaging-script, or PortMaster documentation changes @@ -217,7 +219,11 @@ The light profile passes these Godot options: - `--audio-output-latency 40` It also passes `straywild_PERFORMANCE_PROFILE=light` and -`straywild_LOW_END=1`. The game renders the 3D world at 37.5% linear +`straywild_LOW_END=1`. Those selectors are honored only by the dedicated +PortMaster export, which carries the immutable `straywild_portmaster` Godot +feature tag; desktop, Android, macOS, generic ARM64, and dedicated-server +builds always use the full presentation even if those environment variables +are present. The game renders the 3D world at 37.5% linear resolution with nearest-neighbor scaling, reducing 3D pixel work by about 86% while the separately rendered UI retains its canonical resolution. The light profile also: @@ -263,10 +269,11 @@ On a typical muOS installation, the full path is: /mnt/mmc/ports/straywild/conf/performance_profile ``` -Set the file to `light`, or remove it, to restore the default. An externally -provided `straywild_PERFORMANCE_PROFILE=normal` or `light` environment value -takes precedence over the persistent file. Invalid values safely fall back to -the light profile and are reported in `straywild/log.txt`. +Set the file to `light`, or remove it, to restore the default. Within the +PortMaster package, an externally provided +`straywild_PERFORMANCE_PROFILE=normal` or `light` environment value takes +precedence over the persistent file. Invalid values safely fall back to the +light profile and are reported in `straywild/log.txt`. Do not use Godot's low processor mode for the light profile. It reduces idle CPU usage by sleeping between updates and is not a game-performance diff --git a/export_presets.cfg b/export_presets.cfg index 76fdef3..7c19ad7 100644 --- a/export_presets.cfg +++ b/export_presets.cfg @@ -239,3 +239,33 @@ ssh_remote_deploy/extra_args_ssh="" ssh_remote_deploy/extra_args_scp="" ssh_remote_deploy/run_script="#!/usr/bin/env bash\nexport DISPLAY=:0\nunzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"\nchmod +x \"{temp_dir}/{exe_name}\"\n\"{temp_dir}/{exe_name}\" {cmd_args}" ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash\nkill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\")\nrm -rf \"{temp_dir}\"" + +[preset.6] + +name="PortMaster ARM64" +platform="Linux" +runnable=false +advanced_options=false +dedicated_server=false +custom_features="straywild_portmaster" +export_filter="all_resources" +include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" +exclude_filter="builds/*,scripts/*" +export_path="builds/v0.20.3-alpha/portmaster-arm64/straywild.arm64" +patches=PackedStringArray() +encryption_include_filters="" +encryption_exclude_filters="" +seed=0 +encrypt_pck=false +encrypt_directory=false +script_export_mode=2 + +[preset.6.options] + +custom_template/debug="" +custom_template/release="" +debug/export_console_wrapper=0 +binary_format/embed_pck=false +binary_format/architecture="arm64" +texture_format/s3tc_bptc=false +texture_format/etc2_astc=true diff --git a/main/main.gd b/main/main.gd index a42e8c1..20120d6 100644 --- a/main/main.gd +++ b/main/main.gd @@ -146,6 +146,7 @@ const TITLE_MUSIC_PATH: String = ( const NEW_GAME_MUSIC_PATH: String = "res://audio/music/world/tulips.wav" const DUSK_MUSIC_PATH: String = "res://audio/music/world/craft.mp3" const TIME_CROSSING_EPSILON_HOURS: float = 0.000001 +const RAIN_VISUAL_MOTION_MULTIPLIER: float = 2.0 const DEDICATED_IDLE_PHYSICS_TICKS_PER_SECOND: int = 10 const DEDICATED_ACTIVE_PHYSICS_TICKS_PER_SECOND: int = 30 const HOME_ENTRY_INPUT_OWNER: StringName = &"home_entry_transition" @@ -382,6 +383,25 @@ func _configure_audio_performance_profile(light_profile: bool) -> void: _rain_ambience.set_audio_enabled(true) +func _on_world_weather_changed( + weather: WorldWeatherService.Weather, + _seconds_remaining: float, +) -> void: + _apply_weather_visual_motion(weather) + + +func _apply_weather_visual_motion( + weather: WorldWeatherService.Weather, +) -> void: + var multiplier: float = ( + RAIN_VISUAL_MOTION_MULTIPLIER + if weather == WorldWeatherService.Weather.RAINY + else 1.0 + ) + _test_world.set_foliage_wind_strength_multiplier(multiplier) + _test_world.set_water_motion_strength_multiplier(multiplier) + + func _load_optional_audio_stream(path: String) -> AudioStream: if not ResourceLoader.exists(path, "AudioStream"): return null @@ -654,6 +674,11 @@ func _initialize_application(dedicated: bool) -> void: Callable(_player, "get_active_gameplay_camera"), _performance_profile.is_light(), ) + if not _world_weather.weather_changed.is_connected( + _on_world_weather_changed + ): + _world_weather.weather_changed.connect(_on_world_weather_changed) + _apply_weather_visual_motion(_world_weather.get_weather()) if not _world_time.natural_time_advanced.is_connected( _on_natural_time_advanced ): diff --git a/main/runtime_performance_profile.gd b/main/runtime_performance_profile.gd index f18e63a..3f44e38 100644 --- a/main/runtime_performance_profile.gd +++ b/main/runtime_performance_profile.gd @@ -9,6 +9,7 @@ const NETFISHING_PROFILE_ENVIRONMENT_VARIABLE := ( "NETFISHING_PERFORMANCE_PROFILE" ) const NETFISHING_LIGHT_ENVIRONMENT_VARIABLE := "NETFISHING_LOW_END" +const PORTMASTER_BUILD_FEATURE: StringName = &"straywild_portmaster" const NORMAL_PROFILE: StringName = &"normal" const LIGHT_PROFILE: StringName = &"light" const NORMAL_WORLD_RENDER_SCALE: float = 1.0 @@ -18,6 +19,16 @@ var _profile_name: StringName = NORMAL_PROFILE static func from_environment() -> RuntimePerformanceProfile: + return from_environment_for_portmaster_build( + OS.has_feature(PORTMASTER_BUILD_FEATURE) + ) + + +static func from_environment_for_portmaster_build( + is_portmaster_build: bool, +) -> RuntimePerformanceProfile: + if not is_portmaster_build: + return from_name(NORMAL_PROFILE) var profile_name: String = OS.get_environment( PROFILE_ENVIRONMENT_VARIABLE ) diff --git a/scripts/build_portmaster.sh b/scripts/build_portmaster.sh index 077167f..cb4c101 100755 --- a/scripts/build_portmaster.sh +++ b/scripts/build_portmaster.sh @@ -44,6 +44,8 @@ readonly RELEASE_ROOT="${PROJECT_ROOT}/builds/${RELEASE_TAG}" readonly ARM64_ROOT="${RELEASE_ROOT}/portmaster-arm64" readonly ARM64_EXECUTABLE="${ARM64_ROOT}/straywild.arm64" readonly ARM64_PCK="${ARM64_ROOT}/straywild.pck" +readonly PORTMASTER_FEATURE_TAG="straywild_portmaster" +readonly PORTMASTER_FEATURE_MARKER="${ARM64_ROOT}/.portmaster-feature-tag" readonly STAGE_ROOT="${RELEASE_ROOT}/portmaster-stage" readonly GAME_ROOT="${STAGE_ROOT}/straywild" readonly ARCHIVE="${RELEASE_ROOT}/straywild.zip" @@ -103,7 +105,10 @@ if [[ ${PACKAGE_ONLY} -eq 0 ]]; then rm -rf -- "${EXPORT_PROJECT_ROOT}" } trap cleanup_export_project EXIT INT TERM - rm -f -- "${ARM64_EXECUTABLE}" "${ARM64_PCK}" + rm -f -- \ + "${ARM64_EXECUTABLE}" \ + "${ARM64_PCK}" \ + "${PORTMASTER_FEATURE_MARKER}" rsync -a \ --exclude '/.git/' \ --exclude '/.godot/' \ @@ -124,14 +129,24 @@ if [[ ${PACKAGE_ONLY} -eq 0 ]]; then "${GODOT_BIN}" \ --headless \ --path "${EXPORT_PROJECT_ROOT}" \ - --export-release "Linux ARM64" \ + --export-release "PortMaster ARM64" \ "${ARM64_EXECUTABLE}" + printf '%s\n%s\n' \ + "${PORTMASTER_FEATURE_TAG}" \ + "${TAG_COMMIT}" >"${PORTMASTER_FEATURE_MARKER}" cleanup_export_project trap - EXIT INT TERM fi test -s "${ARM64_EXECUTABLE}" test -s "${ARM64_PCK}" +if [[ ! -f "${PORTMASTER_FEATURE_MARKER}" ]] \ + || ! grep -Fxq "${PORTMASTER_FEATURE_TAG}" "${PORTMASTER_FEATURE_MARKER}" \ + || ! grep -Fxq "${TAG_COMMIT}" "${PORTMASTER_FEATURE_MARKER}"; then + echo "PortMaster export is missing its tagged-preset marker." >&2 + echo "Run a full PortMaster build before using --package-only." >&2 + exit 1 +fi file "${ARM64_EXECUTABLE}" | grep -q "ARM aarch64" rm -rf -- "${STAGE_ROOT}" diff --git a/tests/controller_ui_navigation_validation.gd b/tests/controller_ui_navigation_validation.gd index 24f39f9..2471617 100644 --- a/tests/controller_ui_navigation_validation.gd +++ b/tests/controller_ui_navigation_validation.gd @@ -282,6 +282,16 @@ func _validate_low_end_profile_contract() -> void: ) assert(builder.contains("prepare_portmaster_assets.sh")) assert(builder.contains("straywild-portmaster-export")) + assert(builder.contains('--export-release "PortMaster ARM64"')) + assert(builder.contains("PORTMASTER_FEATURE_MARKER")) + assert(builder.contains("Run a full PortMaster build before using --package-only.")) + var export_presets: String = FileAccess.get_file_as_string( + "res://export_presets.cfg" + ) + assert(export_presets.contains('name="PortMaster ARM64"')) + assert(export_presets.contains( + 'custom_features="straywild_portmaster"' + )) var asset_profile: String = FileAccess.get_file_as_string( "res://scripts/prepare_portmaster_assets.sh" ) diff --git a/tests/generated_world_runtime_validation.gd b/tests/generated_world_runtime_validation.gd index 9df5f1d..524e7b3 100644 --- a/tests/generated_world_runtime_validation.gd +++ b/tests/generated_world_runtime_validation.gd @@ -474,6 +474,19 @@ func _validate_generated_region( assert(ocean != null and fresh_root != null) assert(ocean.water_type == WaterType.Type.SALT_WATER) assert(is_equal_approx(ocean.position.y, GeneratedWorldRegion.WATER_HEIGHT)) + var ocean_motion := ocean.get_node("VisualWater") as WaterSurfaceMotion + assert(ocean_motion != null and ocean_motion.is_processing()) + var normal_water_amplitude: float = ocean_motion.get_effective_amplitude() + assert(normal_water_amplitude > 0.0) + region.set_water_motion_strength_multiplier(2.0) + assert(is_equal_approx( + ocean_motion.get_effective_amplitude(), + normal_water_amplitude * 2.0, + )) + region.set_water_motion_strength_multiplier(1.0) + assert(is_equal_approx( + ocean_motion.get_effective_amplitude(), normal_water_amplitude + )) var ocean_recovery := ocean.get_node("RecoveryRegion") as PlayerWaterTrigger assert( ocean_recovery.entry_height_reference @@ -635,6 +648,20 @@ func _validate_generated_region( "GatherableAnchors/ReachableTreeTrunks" ) as GatherableAnchorSet3D assert(decorations != null and decorations.get_child_count() > 0) + var normal_foliage_wind := _first_foliage_wind_material(decorations) + assert(normal_foliage_wind != null) + var normal_foliage_strength: float = float( + normal_foliage_wind.get_shader_parameter("local_wind_strength") + ) + assert(normal_foliage_strength > 0.0) + region.set_foliage_wind_strength_multiplier(2.0) + var rainy_foliage_wind := _first_foliage_wind_material(decorations) + assert(rainy_foliage_wind != null) + assert(is_equal_approx( + float(rainy_foliage_wind.get_shader_parameter("local_wind_strength")), + normal_foliage_strength * 2.0, + )) + region.set_foliage_wind_strength_multiplier(1.0) assert(anchors != null) assert(anchors.get_spawn_positions().size() > 0) _validate_tree_gatherable_anchors(region, decorations, anchors) @@ -1567,6 +1594,22 @@ func _find_mesh_instance(root_node: Node) -> MeshInstance3D: return null +func _first_foliage_wind_material(root_node: Node) -> ShaderMaterial: + var mesh_instance := root_node as MeshInstance3D + if mesh_instance != null and mesh_instance.mesh != null: + for surface_index: int in mesh_instance.mesh.get_surface_count(): + var material := mesh_instance.get_surface_override_material( + surface_index + ) as ShaderMaterial + if material != null and material.shader == FOLIAGE_WIND_SHADER: + return material + for child: Node in root_node.get_children(): + var found := _first_foliage_wind_material(child) + if found != null: + return found + return null + + func _has_precipitation_occlusion_layer(root_node: Node) -> bool: var mesh_instance := root_node as MeshInstance3D if ( diff --git a/tests/light_performance_profile_validation.gd b/tests/light_performance_profile_validation.gd index 5252193..ada8f93 100644 --- a/tests/light_performance_profile_validation.gd +++ b/tests/light_performance_profile_validation.gd @@ -4,6 +4,9 @@ const MainScene: PackedScene = preload("res://main/main.tscn") const RuntimePerformanceProfileType = preload( "res://main/runtime_performance_profile.gd" ) +const FOLIAGE_WIND_SHADER: Shader = preload( + "res://world/materials/foliage_wind.gdshader" +) func _initialize() -> void: call_deferred("_run") @@ -30,8 +33,11 @@ func _run() -> void: PlayerSaveManager.DEFAULT_WORLD_SEED, true, ))) - _validate_main_profile(main) - _validate_minimal_weather(main) + # A regular editor/desktop runtime must ignore a light-profile environment + # variable. Only the tagged PortMaster export is allowed to honor it. + _validate_normal_profile(main) + _validate_rain_visual_motion(main) + _validate_new_game_music_transition(main) _stop_audio_players(main) main.queue_free() for _frame: int in 8: @@ -39,28 +45,7 @@ func _run() -> void: OS.unset_environment( RuntimePerformanceProfileType.PROFILE_ENVIRONMENT_VARIABLE ) - var normal_main: Node = MainScene.instantiate() - root.add_child(normal_main) - for _frame: int in 4: - await process_frame - if not bool(normal_main.get("_application_initialized")): - normal_main.call("_activate_selected_data_path", "", true) - for _frame: int in 8: - await process_frame - assert(bool(normal_main.get("_application_initialized"))) - assert(bool(normal_main.call( - "_apply_world", - WorldLayout.GENERATED, - PlayerSaveManager.DEFAULT_WORLD_SEED, - true, - ))) - _validate_normal_profile(normal_main) - _validate_new_game_music_transition(normal_main) - _stop_audio_players(normal_main) - normal_main.queue_free() - for _frame: int in 8: - await process_frame - print("Light performance profile validation: PASS") + print("Runtime performance profile validation: PASS") quit() @@ -73,53 +58,31 @@ func _validate_profile_resolution() -> void: assert(light.is_light()) assert(is_equal_approx(light.get_world_render_scale(), 0.375)) assert(legacy.is_light()) - - -func _validate_main_profile(main: Node) -> void: - var profile: RuntimePerformanceProfile = main.get("_performance_profile") - assert(profile != null and profile.is_light()) - assert(is_equal_approx(root.scaling_3d_scale, 0.375)) - var pixelation: Node = main.get_node("%WorldPixelationPostprocess") - assert(bool(pixelation.call("is_light_performance_profile"))) - pixelation.call("set_gameplay_active", true) - var screen_grid := pixelation.get_node("ScreenGrid") as ColorRect - assert(screen_grid != null and not screen_grid.visible) - - var pond := _first_fresh_water_visual(main) - var ocean := main.get_node( - "TestWorld/Regions/GeneratedWorldRegion/WaterBodies/OceanWater/VisualWater" - ) as MeshInstance3D - assert(not pond.visible) - assert(ocean.material_override is StandardMaterial3D) - assert(not ocean.material_override is ShaderMaterial) - _validate_ocean_fishing_coverage(main, ocean) - var region := main.get_node( - "TestWorld/Regions/GeneratedWorldRegion" - ) as GeneratedWorldRegion - assert(region != null) - assert(region.get_node("Decorations").get_child_count() > 0) - - var title_background := main.get_node("%TitleBackground") as ColorRect - var title_material := title_background.material as ShaderMaterial - assert(title_material != null) - assert(not bool(title_material.get_shader_parameter( - "animation_enabled" - ))) - _validate_no_full_screen_menu_backdrops(main) - var game_ui := main.get_node("%GameUI") as GameUI - var title_screen := game_ui.get_title_screen() - assert(title_screen != null) - var player_menu := game_ui.get("_player_menu") as PlayerMenu - assert(player_menu != null) - assert(not player_menu.is_cooler_water_effect_enabled()) - assert((main.get_node("%TitleMusic") as AudioStreamPlayer).stream != null) - assert((main.get_node("%NewGameMusic") as AudioStreamPlayer).stream != null) - assert((main.get_node("%DuskMusic") as AudioStreamPlayer).stream != null) - assert( - (main.get_node("%WavesAudio") as AudioStreamPlayer).stream == null + OS.set_environment( + RuntimePerformanceProfileType.PROFILE_ENVIRONMENT_VARIABLE, + "light", ) - assert( - (main.get_node("RainAmbience") as AudioStreamPlayer).stream == null + assert(not RuntimePerformanceProfileType.from_environment_for_portmaster_build( + false + ).is_light()) + assert(RuntimePerformanceProfileType.from_environment_for_portmaster_build( + true + ).is_light()) + OS.unset_environment( + RuntimePerformanceProfileType.PROFILE_ENVIRONMENT_VARIABLE + ) + OS.set_environment( + RuntimePerformanceProfileType.LEGACY_LIGHT_ENVIRONMENT_VARIABLE, + "1", + ) + assert(not RuntimePerformanceProfileType.from_environment_for_portmaster_build( + false + ).is_light()) + assert(RuntimePerformanceProfileType.from_environment_for_portmaster_build( + true + ).is_light()) + OS.unset_environment( + RuntimePerformanceProfileType.LEGACY_LIGHT_ENVIRONMENT_VARIABLE ) @@ -176,6 +139,54 @@ func _validate_normal_profile(main: Node) -> void: ) +func _validate_rain_visual_motion(main: Node) -> void: + var region := main.get_node( + "TestWorld/Regions/GeneratedWorldRegion" + ) as GeneratedWorldRegion + assert(region != null) + var ocean_motion := region.get_node( + "WaterBodies/OceanWater/VisualWater" + ) as WaterSurfaceMotion + assert(ocean_motion != null) + var normal_water_amplitude: float = ocean_motion.get_effective_amplitude() + var decorations := region.get_node("Decorations") as Node3D + assert(decorations != null) + var normal_wind := _first_foliage_wind_material(decorations) + assert(normal_wind != null) + var normal_wind_strength: float = float( + normal_wind.get_shader_parameter("local_wind_strength") + ) + var weather := main.get_node("%WorldWeatherService") as WorldWeatherService + assert(weather != null) + weather.apply_authoritative_snapshot( + WorldWeatherService.Weather.RAINY, + 60.0, + ) + assert(is_equal_approx( + ocean_motion.get_effective_amplitude(), + normal_water_amplitude * 2.0, + )) + var rainy_wind := _first_foliage_wind_material(decorations) + assert(rainy_wind != null) + assert(is_equal_approx( + float(rainy_wind.get_shader_parameter("local_wind_strength")), + normal_wind_strength * 2.0, + )) + weather.apply_authoritative_snapshot( + WorldWeatherService.Weather.SUNNY, + 60.0, + ) + assert(is_equal_approx( + ocean_motion.get_effective_amplitude(), normal_water_amplitude + )) + var restored_wind := _first_foliage_wind_material(decorations) + assert(restored_wind != null) + assert(is_equal_approx( + float(restored_wind.get_shader_parameter("local_wind_strength")), + normal_wind_strength, + )) + + func _validate_new_game_music_transition(main: Node) -> void: var title_music := main.get_node("%TitleMusic") as AudioStreamPlayer var new_game_music := main.get_node("%NewGameMusic") as AudioStreamPlayer @@ -201,6 +212,22 @@ func _first_fresh_water_visual(main: Node) -> MeshInstance3D: return fresh_water_root.get_child(0).get_node("VisualWater") as MeshInstance3D +func _first_foliage_wind_material(root_node: Node) -> ShaderMaterial: + for node: Node in root_node.find_children( + "*", "MeshInstance3D", true, false + ): + var mesh_instance := node as MeshInstance3D + if mesh_instance == null or mesh_instance.mesh == null: + continue + for surface_index: int in mesh_instance.mesh.get_surface_count(): + var material := mesh_instance.get_surface_override_material( + surface_index + ) as ShaderMaterial + if material != null and material.shader == FOLIAGE_WIND_SHADER: + return material + return null + + func _validate_ocean_fishing_coverage( main: Node, ocean: MeshInstance3D, @@ -230,41 +257,3 @@ func _stop_audio_players(root_node: Node) -> void: (root_node as AudioStreamPlayer3D).stop() for child: Node in root_node.get_children(): _stop_audio_players(child) - - -func _validate_minimal_weather(main: Node) -> void: - var visuals: WorldTimeVisualController = main.get_node( - "%WorldTimeVisualController" - ) - var rain := visuals.get_node("LocalRain") as GPUParticles3D - assert(rain.amount == WorldTimeVisualController.LIGHT_RAIN_PARTICLE_AMOUNT) - assert(rain.fixed_fps == WorldTimeVisualController.LIGHT_RAIN_FIXED_FPS) - assert(rain.amount == 48) - assert(rain.fixed_fps == 8) - var clouds := visuals.get_node("LocalStormClouds") as LocalStormCloudLayer - assert(clouds.get_patch_count() == 1) - var ceiling := clouds.get_node("CloudCeiling") as MeshInstance3D - assert(ceiling != null and ceiling.mesh is PlaneMesh) - assert(ceiling.material_override == null) - assert((ceiling.mesh as PlaneMesh).material is StandardMaterial3D) - - visuals.apply_weather_immediately(WorldWeatherService.Weather.RAINY) - assert(rain.emitting and rain.amount_ratio > 0.99) - assert(clouds.visible and clouds.get_storm_amount() > 0.87) - var cloud_material := ( - (ceiling.mesh as PlaneMesh).material as StandardMaterial3D - ) - assert(cloud_material.albedo_color.a < 0.65) - var test_world := main.get_node("TestWorld") as TestWorld - var runtime_environment := ( - test_world.get_world_environment().environment as Environment - ) - var sky_material := ( - runtime_environment.sky.sky_material as ShaderMaterial - ) - assert(is_zero_approx(float( - sky_material.get_shader_parameter("cloud_coverage") - ))) - assert(is_zero_approx(float( - sky_material.get_shader_parameter("cloud_opacity") - ))) diff --git a/tests/world_layout_validation.gd b/tests/world_layout_validation.gd index f21120c..473b45e 100644 --- a/tests/world_layout_validation.gd +++ b/tests/world_layout_validation.gd @@ -84,6 +84,8 @@ func _validate_world_switching() -> void: root.add_child(world) await process_frame assert(world.get_world_layout() == WorldLayout.GENERATED) + world.set_foliage_wind_strength_multiplier(2.0) + world.set_water_motion_strength_multiplier(2.0) var initial_generator := world.get_node( "Regions/GeneratedWorldRegion/Terrain/TerrainChunkGenerator" ) as TerrainChunkGenerator @@ -97,6 +99,20 @@ func _validate_world_switching() -> void: assert(world.get_generation_seed() == 13579) assert(world.get_node_or_null("Regions/StarterIslandRegion") != null) assert(world.get_node_or_null("Regions/GeneratedWorldRegion") == null) + var starter_region := world.get_node( + "Regions/StarterIslandRegion" + ) as StarterIslandRegion + assert(starter_region != null) + assert(is_equal_approx( + float(starter_region.get("_foliage_wind_strength_multiplier")), 2.0 + )) + var starter_ocean_motion := starter_region.get_node( + "WaterBodies/Ocean/VisualWater" + ) as WaterSurfaceMotion + assert(starter_ocean_motion != null) + assert(is_equal_approx( + starter_ocean_motion.get_motion_strength_multiplier(), 2.0 + )) assert(world.get_fishing_shop() != null) assert(world.get_player_storage() != null) assert(not world.get_fishable_water_regions().is_empty()) @@ -114,6 +130,20 @@ func _validate_world_switching() -> void: assert(world.get_generation_seed() == 24680) assert(world.get_node_or_null("Regions/GeneratedWorldRegion") != null) assert(world.get_node_or_null("Regions/StarterIslandRegion") == null) + var generated_region := world.get_node( + "Regions/GeneratedWorldRegion" + ) as GeneratedWorldRegion + assert(generated_region != null) + assert(is_equal_approx( + float(generated_region.get("_foliage_wind_strength_multiplier")), 2.0 + )) + var generated_ocean_motion := generated_region.get_node( + "WaterBodies/OceanWater/VisualWater" + ) as WaterSurfaceMotion + assert(generated_ocean_motion != null) + assert(is_equal_approx( + generated_ocean_motion.get_motion_strength_multiplier(), 2.0 + )) world.queue_free() await process_frame diff --git a/world/generation/generated_world_region.gd b/world/generation/generated_world_region.gd index 9c59692..9c7568d 100644 --- a/world/generation/generated_world_region.gd +++ b/world/generation/generated_world_region.gd @@ -138,6 +138,7 @@ var _biome_assignments: Dictionary[Vector2i, StringName] = {} var _water_recovery_triangles_by_coordinate: Dictionary[Vector2i, Array] = {} var _home_accessible_elevations_by_coordinate: Dictionary[Vector2i, Array] = {} var _foliage_wind_enabled: bool = false +var _foliage_wind_strength_multiplier: float = 1.0 func _ready() -> void: @@ -218,6 +219,24 @@ func set_light_performance_profile(enabled: bool) -> void: _light_performance_profile = enabled _set_foliage_wind_enabled(not enabled) _apply_water_materials() + var surface_motion := _get_ocean_surface_motion() + if surface_motion != null: + surface_motion.set_motion_enabled(not enabled) + + +func set_foliage_wind_strength_multiplier(multiplier: float) -> void: + _foliage_wind_strength_multiplier = maxf(multiplier, 0.0) + _set_foliage_wind_enabled(_foliage_wind_enabled) + + +func set_water_motion_strength_multiplier(multiplier: float) -> void: + var surface_motion := _get_ocean_surface_motion() + if surface_motion != null: + surface_motion.set_motion_strength_multiplier(multiplier) + + +func _get_ocean_surface_motion() -> WaterSurfaceMotion: + return _ocean.get_node_or_null(^"VisualWater") as WaterSurfaceMotion func get_spawn_surface_triangles( @@ -611,13 +630,29 @@ func _apply_foliage_wind_to_mesh(mesh_instance: MeshInstance3D) -> void: (mesh_global_scale.x + mesh_global_scale.z) * 0.5, 0.001, ) - var local_strength: float = foliage_wind_strength / horizontal_scale + var local_strength: float = ( + foliage_wind_strength * _foliage_wind_strength_multiplier + / horizontal_scale + ) var phase: float = fposmod( mesh_instance.global_position.x * 0.73 + mesh_instance.global_position.z * 0.41, TAU, ) for surface_index: int in mesh_instance.mesh.get_surface_count(): + var override_material: Material = ( + mesh_instance.get_surface_override_material(surface_index) + ) + var existing_wind := override_material as ShaderMaterial + if ( + existing_wind != null + and existing_wind.shader == FOLIAGE_WIND_SHADER + ): + existing_wind.set_shader_parameter( + "local_wind_strength", + local_strength, + ) + continue var source_material: Material = mesh_instance.get_active_material( surface_index ) diff --git a/world/generation/generated_world_region.tscn b/world/generation/generated_world_region.tscn index c996b88..b4b3dba 100644 --- a/world/generation/generated_world_region.tscn +++ b/world/generation/generated_world_region.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=16 format=3] +[gd_scene load_steps=17 format=3] [ext_resource type="Script" path="res://world/generation/generated_world_region.gd" id="1_region"] [ext_resource type="Script" path="res://world/generation/terrain_chunk_generator.gd" id="2_generator"] @@ -15,6 +15,7 @@ [ext_resource type="Resource" path="res://world/generation/biomes/terrain_biome_catalog.tres" id="13_biome_catalog"] [ext_resource type="PackedScene" path="res://world/interactables/decor_shop_world.tscn" id="14_decor_shop"] [ext_resource type="PackedScene" path="res://world/interactables/rv_upgrade_shop_world.tscn" id="15_rv_upgrade"] +[ext_resource type="Script" path="res://world/water_surface_motion.gd" id="16_water_motion"] [node name="GeneratedWorldRegion" type="Node3D"] script = ExtResource("1_region") @@ -60,6 +61,9 @@ fish_pool = ExtResource("10_ocean_pool") water_type = 1 location_tags = Array[StringName]([&"coast", &"ocean", &"generated_ocean"]) +[node name="VisualWater" parent="WaterBodies/OceanWater" index="0"] +script = ExtResource("16_water_motion") + [node name="FreshWaterBodies" type="Node3D" parent="WaterBodies"] unique_name_in_owner = true diff --git a/world/regions/starter_island_region.gd b/world/regions/starter_island_region.gd index c690e4b..5352c39 100644 --- a/world/regions/starter_island_region.gd +++ b/world/regions/starter_island_region.gd @@ -72,6 +72,7 @@ var rv_upgrade_shop_path: NodePath = ( @export_range(0.0, 4.0, 0.05) var foliage_wind_speed: float = 0.9 var _foliage_wind_enabled: bool = false +var _foliage_wind_strength_multiplier: float = 1.0 func _ready() -> void: @@ -141,6 +142,19 @@ func set_light_performance_profile(enabled: bool) -> void: surface_motion.set_motion_enabled(not enabled) +func set_foliage_wind_strength_multiplier(multiplier: float) -> void: + _foliage_wind_strength_multiplier = maxf(multiplier, 0.0) + _set_foliage_wind_enabled(_foliage_wind_enabled) + + +func set_water_motion_strength_multiplier(multiplier: float) -> void: + var ocean := get_node_or_null( + ^"WaterBodies/Ocean/VisualWater" + ) as WaterSurfaceMotion + if ocean != null: + ocean.set_motion_strength_multiplier(multiplier) + + func is_foliage_wind_enabled() -> bool: return _foliage_wind_enabled @@ -342,13 +356,29 @@ func _apply_foliage_wind_to_mesh(mesh_instance: MeshInstance3D) -> void: (mesh_global_scale.x + mesh_global_scale.z) * 0.5, 0.001, ) - var local_strength: float = foliage_wind_strength / horizontal_scale + var local_strength: float = ( + foliage_wind_strength * _foliage_wind_strength_multiplier + / horizontal_scale + ) var phase: float = fposmod( mesh_instance.global_position.x * 0.73 + mesh_instance.global_position.z * 0.41, TAU, ) for surface_index: int in mesh_instance.mesh.get_surface_count(): + var override_material: Material = ( + mesh_instance.get_surface_override_material(surface_index) + ) + var existing_wind := override_material as ShaderMaterial + if ( + existing_wind != null + and existing_wind.shader == FOLIAGE_WIND_SHADER + ): + existing_wind.set_shader_parameter( + "local_wind_strength", + local_strength, + ) + continue var source_material: Material = mesh_instance.get_active_material( surface_index ) diff --git a/world/regions/world_region.gd b/world/regions/world_region.gd index d054938..ac5b2ff 100644 --- a/world/regions/world_region.gd +++ b/world/regions/world_region.gd @@ -38,6 +38,14 @@ func set_light_performance_profile(_enabled: bool) -> void: pass +func set_foliage_wind_strength_multiplier(_multiplier: float) -> void: + pass + + +func set_water_motion_strength_multiplier(_multiplier: float) -> void: + pass + + func get_playable_half_extents() -> Vector2: return Vector2(50.0, 50.0) diff --git a/world/test_world.gd b/world/test_world.gd index 9d81d4d..b036626 100644 --- a/world/test_world.gd +++ b/world/test_world.gd @@ -36,6 +36,8 @@ const WORLD_BOUNDARY_SHORELINE_CLEARANCE := 18.0 var _world_layout: StringName = WorldLayoutType.GENERATED var _world_seed: int = PlayerSaveManager.DEFAULT_WORLD_SEED var _light_performance_profile: bool = false +var _foliage_wind_strength_multiplier: float = 1.0 +var _water_motion_strength_multiplier: float = 1.0 var _dedicated_simulation: bool = false var _local_home_interior_presentation_active: bool = false @@ -100,6 +102,22 @@ func set_light_performance_profile(enabled: bool) -> void: _active_region.set_light_performance_profile(enabled) +func set_foliage_wind_strength_multiplier(multiplier: float) -> void: + _foliage_wind_strength_multiplier = maxf(multiplier, 0.0) + if _active_region != null: + _active_region.set_foliage_wind_strength_multiplier( + _foliage_wind_strength_multiplier + ) + + +func set_water_motion_strength_multiplier(multiplier: float) -> void: + _water_motion_strength_multiplier = maxf(multiplier, 0.0) + if _active_region != null: + _active_region.set_water_motion_strength_multiplier( + _water_motion_strength_multiplier + ) + + func set_local_home_interior_presentation_active(enabled: bool) -> void: _local_home_interior_presentation_active = enabled if _active_region != null and not _dedicated_simulation: @@ -310,6 +328,12 @@ func _replace_active_region(layout: StringName, world_seed: int) -> bool: _active_region = replacement _regions_root.add_child(_active_region) _active_region.set_light_performance_profile(_light_performance_profile) + _active_region.set_foliage_wind_strength_multiplier( + _foliage_wind_strength_multiplier + ) + _active_region.set_water_motion_strength_multiplier( + _water_motion_strength_multiplier + ) if _dedicated_simulation: _set_region_presentation_enabled(_active_region, false) else: diff --git a/world/water_surface_motion.gd b/world/water_surface_motion.gd index 02e397e..d8dbd4d 100644 --- a/world/water_surface_motion.gd +++ b/world/water_surface_motion.gd @@ -18,6 +18,7 @@ const DEFAULT_PHASE_OFFSET: float = 0.0 @export_range(0.0, TAU, 0.01, "radians") var phase_offset: float = 0.0 var _base_height: float +var _motion_strength_multiplier: float = 1.0 func _ready() -> void: @@ -28,7 +29,7 @@ func _ready() -> void: func _process(_delta: float) -> void: position.y = _base_height + calculate_height_offset( _current_time_seconds(), - amplitude, + get_effective_amplitude(), cycle_seconds, secondary_swell, phase_offset, @@ -41,6 +42,20 @@ func set_motion_enabled(enabled: bool) -> void: position.y = _base_height +func set_motion_strength_multiplier(multiplier: float) -> void: + _motion_strength_multiplier = maxf(multiplier, 0.0) + if _motion_strength_multiplier <= 0.0: + position.y = _base_height + + +func get_motion_strength_multiplier() -> float: + return _motion_strength_multiplier + + +func get_effective_amplitude() -> float: + return amplitude * _motion_strength_multiplier + + static func get_default_height_offset() -> float: return calculate_height_offset( _current_time_seconds(), From eeef99793da9e95122a5e94c181ef78ae9c26bc8 Mon Sep 17 00:00:00 2001 From: Voyager Date: Tue, 1 Sep 2026 19:07:24 -0400 Subject: [PATCH 36/37] Prepare private v0.20.4-alpha test build --- docs/README-PLAYTEST.txt | 4 ++-- export_presets.cfg | 28 ++++++++++++++-------------- project.godot | 2 +- scripts/build_playtest.sh | 6 +++--- ui/title_screen.tscn | 2 +- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/docs/README-PLAYTEST.txt b/docs/README-PLAYTEST.txt index e7632e2..98e2029 100644 --- a/docs/README-PLAYTEST.txt +++ b/docs/README-PLAYTEST.txt @@ -1,6 +1,6 @@ straywild -v0.20.3-alpha -Alpha 0.20.3 +v0.20.4-alpha +Alpha 0.20.4 Thank you for supporting this private testing release. diff --git a/export_presets.cfg b/export_presets.cfg index 7c19ad7..c7dbaa9 100644 --- a/export_presets.cfg +++ b/export_presets.cfg @@ -9,7 +9,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.20.3-alpha/windows-x86_64/straywild.exe" +export_path="builds/v0.20.4-alpha/windows-x86_64/straywild.exe" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -35,11 +35,11 @@ application/modify_resources=true application/icon="res://art/exported/system_icons/straywild.ico" application/console_wrapper_icon="" application/icon_interpolation=0 -application/file_version="0.20.3.0" -application/product_version="0.20.3.0" +application/file_version="0.20.4.0" +application/product_version="0.20.4.0" application/company_name="Woofmeow" application/product_name="straywild" -application/file_description="straywild v0.20.3-alpha" +application/file_description="straywild v0.20.4-alpha" application/copyright="Copyright © 2026 Woofmeow" application/trademarks="straywild and Woofmeow branding is reserved; see TRADEMARKS.md" application/export_angle=0 @@ -62,7 +62,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.20.3-alpha/linux-arm64/straywild.arm64" +export_path="builds/v0.20.4-alpha/linux-arm64/straywild.arm64" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -92,7 +92,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.20.3-alpha/macos/straywild.zip" +export_path="builds/v0.20.4-alpha/macos/straywild.zip" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -108,8 +108,8 @@ custom_template/release="" application/bundle_identifier="io.woofmeow.netfishing" application/icon="res://art/exported/system_icons/straywild_1024.png" application/icon_interpolation=0 -application/short_version="0.20.3" -application/version="0.20.3" +application/short_version="0.20.4" +application/version="0.20.4" application/architecture="universal" codesign/enable=false notarization/enable=false @@ -125,7 +125,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*,tests/*" -export_path="builds/v0.20.3-alpha/server-linux-x86_64/straywildServer.x86_64" +export_path="builds/v0.20.4-alpha/server-linux-x86_64/straywildServer.x86_64" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -155,7 +155,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.20.3-alpha/android/straywild.apk" +export_path="builds/v0.20.4-alpha/android/straywild.apk" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -176,8 +176,8 @@ architectures/armeabi-v7a=false architectures/arm64-v8a=true architectures/x86=false architectures/x86_64=false -version/code=200200 -version/name="v0.20.3-alpha" +version/code=200400 +version/name="v0.20.4-alpha" package/unique_name="io.woofmeow.netfishing" package/name="straywild" package/signed=true @@ -214,7 +214,7 @@ custom_features="" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.20.3-alpha/linux-x86_64/straywild.x86_64" +export_path="builds/v0.20.4-alpha/linux-x86_64/straywild.x86_64" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" @@ -251,7 +251,7 @@ custom_features="straywild_portmaster" export_filter="all_resources" include_filter="LICENSE,ASSET-LICENSE.md,TRADEMARKS.md,docs/ATTRIBUTION.md,ui/fonts/*LICENSE.txt" exclude_filter="builds/*,scripts/*" -export_path="builds/v0.20.3-alpha/portmaster-arm64/straywild.arm64" +export_path="builds/v0.20.4-alpha/portmaster-arm64/straywild.arm64" patches=PackedStringArray() encryption_include_filters="" encryption_exclude_filters="" diff --git a/project.godot b/project.godot index be91dfd..727a49a 100644 --- a/project.godot +++ b/project.godot @@ -11,7 +11,7 @@ config_version=5 [application] config/name="straywild" -config/version="0.20.3-alpha" +config/version="0.20.4-alpha" run/main_scene="res://main/main.tscn" config/features=PackedStringArray("4.7", "GL Compatibility") config/icon="res://art/exported/system_icons/straywild_256.png" diff --git a/scripts/build_playtest.sh b/scripts/build_playtest.sh index b4e6230..4b2c58f 100755 --- a/scripts/build_playtest.sh +++ b/scripts/build_playtest.sh @@ -4,14 +4,14 @@ set -euo pipefail readonly SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" readonly PROJECT_ROOT="$(cd -- "${SCRIPT_DIR}/.." && pwd)" -readonly BUILD_ROOT="${PROJECT_ROOT}/builds/v0.20.3-alpha" +readonly BUILD_ROOT="${PROJECT_ROOT}/builds/v0.20.4-alpha" readonly WINDOWS_DIR="${BUILD_ROOT}/windows-x86_64" readonly LINUX_DIR="${BUILD_ROOT}/linux-x86_64" readonly README_SOURCE="${PROJECT_ROOT}/docs/README-PLAYTEST.txt" readonly SOURCE_COMMIT="$(git -C "${PROJECT_ROOT}" rev-parse HEAD)" readonly SOURCE_URL="https://forge.makearmy.io/woofmeow/straywild" -readonly WINDOWS_ZIP="${BUILD_ROOT}/straywild-v0.20.3-alpha-windows-x86_64.zip" -readonly LINUX_ZIP="${BUILD_ROOT}/straywild-v0.20.3-alpha-linux-x86_64.zip" +readonly WINDOWS_ZIP="${BUILD_ROOT}/straywild-v0.20.4-alpha-windows-x86_64.zip" +readonly LINUX_ZIP="${BUILD_ROOT}/straywild-v0.20.4-alpha-linux-x86_64.zip" readonly GODOT_BIN="${GODOT_BIN:-godot}" if [[ ! -f "${PROJECT_ROOT}/project.godot" ]]; then diff --git a/ui/title_screen.tscn b/ui/title_screen.tscn index 8c8cae1..daf8c0a 100644 --- a/ui/title_screen.tscn +++ b/ui/title_screen.tscn @@ -213,7 +213,7 @@ unique_name_in_owner = true layout_mode = 2 theme_override_colors/font_color = Color(0.682, 0.733, 0.761, 1) theme_override_font_sizes/font_size = 22 -text = "v0.20.3-alpha" +text = "v0.20.4-alpha" horizontal_alignment = 1 [node name="Spacer" type="Control" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent"] From 3a61056ce50cc5949bea537532a5921367720337 Mon Sep 17 00:00:00 2001 From: Voyager Date: Wed, 2 Sep 2026 01:27:20 -0400 Subject: [PATCH 37/37] feat: add rain puddles and stabilize shoreline water --- addons/straywild_shoreline_baker/plugin.cfg | 7 - .../shoreline_auto_baker.gd | 66 -- .../shoreline_auto_baker.gd.uid | 1 - docs/ATTRIBUTION.md | 6 +- docs/DEVELOPMENT.md | 10 +- docs/PORTMASTER.md | 2 +- main/main.gd | 30 +- main/main.tscn | 9 - project.godot | 4 - scripts/bake_shoreline_ribbons.gd | 42 -- scripts/bake_shoreline_ribbons.gd.uid | 1 - scripts/build_portmaster.sh | 2 +- scripts/run_validations.sh | 1 - tests/art_tools_validation.gd | 25 +- tests/fish_catalog_content_validation.gd | 13 +- tests/light_performance_profile_validation.gd | 3 - tests/profile_multiplayer_validation.gd | 9 + tests/rain_puddle_runtime_validation.gd | 84 +++ tests/rain_puddle_runtime_validation.gd.uid | 1 + tests/shoreline_ambience_validation.gd | 50 -- tests/shoreline_ambience_validation.gd.uid | 1 - tests/shoreline_ribbon_validation.gd | 97 --- tests/shoreline_ribbon_validation.gd.uid | 1 - tests/world_weather_validation.gd | 51 ++ ui/chat_ui.gd | 32 +- .../shorelines/starter_ocean_shoreline.tres | 14 - world/generation/generated_world_region.gd | 49 +- world/generation/generated_world_region.tscn | 5 - world/materials/shoreline_tide.gdshader | 71 -- world/materials/shoreline_tide.gdshader.uid | 1 - world/materials/shoreline_tide.tres | 19 - world/materials/stylized_water.gdshader | 382 +++-------- world/materials/stylized_water.tres | 23 +- world/materials/stylized_water_fresh.tres | 23 +- world/rain_puddle_presentation.gd | 645 ++++++++++++++++++ world/rain_puddle_presentation.gd.uid | 1 + world/regions/starter_island_region.gd | 24 +- world/regions/starter_island_region.tscn | 37 - world/regions/world_region.gd | 4 - world/shoreline_ambience.gd | 200 ------ world/shoreline_ambience.gd.uid | 1 - world/test_world.gd | 4 - world/water/shoreline_ribbon_baker.gd | 139 ---- world/water/shoreline_ribbon_baker.gd.uid | 1 - world/water/shoreline_ribbon_config.gd | 15 - world/water/shoreline_ribbon_config.gd.uid | 1 - world/water/shoreline_ribbon_generator.gd | 636 ----------------- world/water/shoreline_ribbon_generator.gd.uid | 1 - world/water_surface_motion.gd | 41 +- 49 files changed, 1033 insertions(+), 1852 deletions(-) delete mode 100644 addons/straywild_shoreline_baker/plugin.cfg delete mode 100644 addons/straywild_shoreline_baker/shoreline_auto_baker.gd delete mode 100644 addons/straywild_shoreline_baker/shoreline_auto_baker.gd.uid delete mode 100644 scripts/bake_shoreline_ribbons.gd delete mode 100644 scripts/bake_shoreline_ribbons.gd.uid create mode 100644 tests/rain_puddle_runtime_validation.gd create mode 100644 tests/rain_puddle_runtime_validation.gd.uid delete mode 100644 tests/shoreline_ambience_validation.gd delete mode 100644 tests/shoreline_ambience_validation.gd.uid delete mode 100644 tests/shoreline_ribbon_validation.gd delete mode 100644 tests/shoreline_ribbon_validation.gd.uid delete mode 100644 world/generated/shorelines/starter_ocean_shoreline.tres delete mode 100644 world/materials/shoreline_tide.gdshader delete mode 100644 world/materials/shoreline_tide.gdshader.uid delete mode 100644 world/materials/shoreline_tide.tres create mode 100644 world/rain_puddle_presentation.gd create mode 100644 world/rain_puddle_presentation.gd.uid delete mode 100644 world/shoreline_ambience.gd delete mode 100644 world/shoreline_ambience.gd.uid delete mode 100644 world/water/shoreline_ribbon_baker.gd delete mode 100644 world/water/shoreline_ribbon_baker.gd.uid delete mode 100644 world/water/shoreline_ribbon_config.gd delete mode 100644 world/water/shoreline_ribbon_config.gd.uid delete mode 100644 world/water/shoreline_ribbon_generator.gd delete mode 100644 world/water/shoreline_ribbon_generator.gd.uid diff --git a/addons/straywild_shoreline_baker/plugin.cfg b/addons/straywild_shoreline_baker/plugin.cfg deleted file mode 100644 index c3f4e47..0000000 --- a/addons/straywild_shoreline_baker/plugin.cfg +++ /dev/null @@ -1,7 +0,0 @@ -[plugin] - -name="straywild Shoreline Auto-Baker" -description="Rebuilds configured static shoreline ribbons after authored terrain reimports." -author="woofmeow" -version="1.0.0" -script="shoreline_auto_baker.gd" diff --git a/addons/straywild_shoreline_baker/shoreline_auto_baker.gd b/addons/straywild_shoreline_baker/shoreline_auto_baker.gd deleted file mode 100644 index 18da4af..0000000 --- a/addons/straywild_shoreline_baker/shoreline_auto_baker.gd +++ /dev/null @@ -1,66 +0,0 @@ -@tool -extends EditorPlugin - -const TERRAIN_RESOURCE := ( - "res://art/exported/environment/terrain/starter_island.glb" -) -const REGION_SCENE := "res://world/regions/starter_island_region.tscn" - -var _bake_pending := false - - -func _enter_tree() -> void: - var filesystem := get_editor_interface().get_resource_filesystem() - if not filesystem.resources_reimported.is_connected(_on_resources_reimported): - filesystem.resources_reimported.connect(_on_resources_reimported) - - -func _exit_tree() -> void: - var filesystem := get_editor_interface().get_resource_filesystem() - if filesystem.resources_reimported.is_connected(_on_resources_reimported): - filesystem.resources_reimported.disconnect(_on_resources_reimported) - - -func _on_resources_reimported(resources: PackedStringArray) -> void: - if not resources.has(TERRAIN_RESOURCE) or _bake_pending: - return - _bake_pending = true - call_deferred("_bake_configured_shorelines") - - -func _bake_configured_shorelines() -> void: - _bake_pending = false - var packed_region := ResourceLoader.load( - REGION_SCENE, - "PackedScene", - ResourceLoader.CACHE_MODE_REPLACE, - ) as PackedScene - if packed_region == null: - push_error("Shoreline auto-bake could not load %s." % REGION_SCENE) - return - var region := packed_region.instantiate() as Node3D - add_child(region) - var baker := region.get_node_or_null( - "ShorelineRibbonBaker" - ) as ShorelineRibbonBaker - if baker == null: - push_error("Shoreline auto-bake found no configured baker.") - region.queue_free() - return - var results := baker.rebuild_all() - for result: Dictionary in results: - if result.get("skipped", false): - continue - var output_path: String = result.get("output_path", "") - if not output_path.is_empty(): - ResourceLoader.load( - output_path, - "ArrayMesh", - ResourceLoader.CACHE_MODE_REPLACE, - ) - print( - "Shoreline auto-bake: %s, %d loops, %d triangles" - % [output_path, result.loop_count, result.triangle_count] - ) - region.queue_free() - get_editor_interface().get_resource_filesystem().scan() diff --git a/addons/straywild_shoreline_baker/shoreline_auto_baker.gd.uid b/addons/straywild_shoreline_baker/shoreline_auto_baker.gd.uid deleted file mode 100644 index a143fcb..0000000 --- a/addons/straywild_shoreline_baker/shoreline_auto_baker.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cbk4xpalei5v3 diff --git a/docs/ATTRIBUTION.md b/docs/ATTRIBUTION.md index d8676f0..e4ab55b 100644 --- a/docs/ATTRIBUTION.md +++ b/docs/ATTRIBUTION.md @@ -309,9 +309,9 @@ revision-specific inventory. ## Generated resources -Godot `.import` sidecars and deterministic shoreline `.tres` meshes are derived -repository resources, not original artwork. `.godot/imported/`, editor caches, -captures, exports, and temporary test data are not tracked. +Godot `.import` sidecars and other deterministic generated resources are +derived repository resources, not original artwork. `.godot/imported/`, editor +caches, captures, exports, and temporary test data are not tracked. ## Release gate diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index a5ebc03..25d3549 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -233,12 +233,10 @@ materials local to the scene. ### Shoreline presentation -The visible shoreline treatment is currently produced by the water materials. -The older smooth-ribbon baker and generated starter-island ribbon resource are -retained as development history/tooling, but the ribbon mesh is disabled and -is not part of the current rendered shoreline. Do not treat a ribbon rebuild -as a normal terrain-authoring requirement or re-enable the mesh as incidental -cleanup. +The visible shoreline treatment is produced entirely by the water materials. +It does not require supplemental shoreline meshes or generation tooling. Keep +shoreline foam and edge-effect work in the water materials rather than adding +terrain-authoring requirements. ### Facial-feature textures diff --git a/docs/PORTMASTER.md b/docs/PORTMASTER.md index 262f930..374ca22 100644 --- a/docs/PORTMASTER.md +++ b/docs/PORTMASTER.md @@ -235,7 +235,7 @@ profile also: - keeps the title water and full-window menu patterns static; - replaces the animated cooler water and decorative bubbles with flat water; - disables decorative title-screen fish and bubbles; -- retains title and dusk music while omitting rain and shoreline ambience; +- retains title and dusk music while omitting rain ambience; - reduces rain to 48 particles simulated at 8 FPS; and - replaces procedural sky clouds and 81 moving local cloud patches with one flat cloud ceiling. diff --git a/main/main.gd b/main/main.gd index 20120d6..6cacbca 100644 --- a/main/main.gd +++ b/main/main.gd @@ -119,6 +119,9 @@ const NetworkWorldWeatherServiceType = preload( "res://network/network_world_weather_service.gd" ) const RainAmbienceType = preload("res://world/rain_ambience.gd") +const RainPuddlePresentationType = preload( + "res://world/rain_puddle_presentation.gd" +) const PlayerJobServiceType = preload("res://jobs/player_job_service.gd") const NetworkJobServiceType = preload("res://network/network_job_service.gd") const GatherableCatalogType = preload( @@ -309,8 +312,8 @@ var _home_entry_transition_active: bool = false var _home_entry_walk_tween: Tween var _observed_cancel_input_frame: int = -1 -@onready var _shoreline_ambience: ShorelineAmbience = %ShorelineAmbience var _rain_ambience: RainAmbienceType +var _rain_puddles: RainPuddlePresentationType func _ready() -> void: @@ -337,11 +340,10 @@ func _ready() -> void: _rain_ambience.name = "RainAmbience" add_child(_rain_ambience) _rain_ambience.configure(_world_weather) + _rain_puddles = RainPuddlePresentationType.new() + _rain_puddles.name = "RainPuddlePresentation" + add_child(_rain_puddles) _configure_audio_performance_profile(_performance_profile.is_light()) - _shoreline_ambience.configure( - _player, - _test_world.get_saltwater_shoreline_mesh(), - ) if not _settings_manager.settings_changed.is_connected( _apply_runtime_settings ): @@ -376,10 +378,8 @@ func _configure_audio_performance_profile(light_profile: bool) -> void: _new_game_music.stream = _load_optional_audio_stream(NEW_GAME_MUSIC_PATH) _dusk_music.stream = _load_optional_audio_stream(DUSK_MUSIC_PATH) if light_profile: - _shoreline_ambience.set_audio_enabled(false) _rain_ambience.set_audio_enabled(false) return - _shoreline_ambience.set_audio_enabled(true) _rain_ambience.set_audio_enabled(true) @@ -439,7 +439,6 @@ func _disable_dedicated_presentation_tree() -> void: NodePath("TitleMusic"), NodePath("NewGameMusic"), NodePath("DuskMusic"), - NodePath("ShorelineAmbience"), ]: var audio_node: Node = get_node_or_null(audio_path) if audio_node == null: @@ -674,6 +673,12 @@ func _initialize_application(dedicated: bool) -> void: Callable(_player, "get_active_gameplay_camera"), _performance_profile.is_light(), ) + _rain_puddles.configure( + _test_world, + _world_weather, + _player, + _performance_profile.is_light(), + ) if not _world_weather.weather_changed.is_connected( _on_world_weather_changed ): @@ -1926,8 +1931,8 @@ func _set_gameplay_active(active: bool) -> void: _end_shop_npc_conversation(true) _cancel_home_entry_transition() _cancel_home_exit_transition(true) - _shoreline_ambience.set_active(active) _rain_ambience.set_active(active) + _rain_puddles.set_active(active) if active and not was_gameplay_started: var current_hour: float = _world_time.get_time_hours() _dusk_music_played_for_natural_day = ( @@ -2641,10 +2646,7 @@ func _apply_world( _test_world.get_safe_respawn_points(), Callable(_test_world, "get_water_recovery_position"), ) - _shoreline_ambience.configure( - _player, - _test_world.get_saltwater_shoreline_mesh(), - ) + _rain_puddles.refresh_world() return true @@ -3037,7 +3039,7 @@ func _on_local_home_space_changed( var inside_rv: bool = String(space_id).begins_with("rv:") _world_time_visuals.set_local_home_interior_active(inside_rv) _rain_ambience.set_suppressed(inside_rv) - _shoreline_ambience.set_suppressed(inside_rv) + _rain_puddles.set_suppressed(inside_rv) _surface_drawings_root.visible = not inside_rv _world_gatherables_root.visible = not inside_rv _refresh_active_hotbar_item() diff --git a/main/main.tscn b/main/main.tscn index aeea011..a86500f 100644 --- a/main/main.tscn +++ b/main/main.tscn @@ -49,7 +49,6 @@ [ext_resource type="Script" uid="uid://llj46fx0oco7" path="res://network/network_world_weather_service.gd" id="51_network_world_weather"] [ext_resource type="Script" uid="uid://daqtje84gqgu0" path="res://jobs/player_job_service.gd" id="52_player_jobs"] [ext_resource type="Script" uid="uid://drlyytr2o3uw8" path="res://network/network_job_service.gd" id="53_network_jobs"] -[ext_resource type="Script" uid="uid://b0c3o2vy76fg3" path="res://world/shoreline_ambience.gd" id="54_shoreline_ambience"] [ext_resource type="Script" uid="uid://c80x8jkdnx0xy" path="res://settings/controller_mapping_manager.gd" id="56_controller_mapping"] [ext_resource type="Script" path="res://settings/keyboard_mouse_mapping_manager.gd" id="keyboard_mouse_mapping"] [ext_resource type="Script" uid="uid://d0jv8n2nfqia0" path="res://network/discovery_client.gd" id="57_discovery"] @@ -353,14 +352,6 @@ bus = &"Music" unique_name_in_owner = true bus = &"Music" -[node name="ShorelineAmbience" type="Node" parent="." unique_id=1948037177] -unique_name_in_owner = true -script = ExtResource("54_shoreline_ambience") - -[node name="WavesAudio" type="AudioStreamPlayer" parent="ShorelineAmbience" unique_id=193530658] -unique_name_in_owner = true -bus = &"Environment" - [node name="WorldPixelationPostprocess" parent="." unique_id=344378000 instance=ExtResource("16_world_pixelation")] unique_name_in_owner = true diff --git a/project.godot b/project.godot index 727a49a..559f8f4 100644 --- a/project.godot +++ b/project.godot @@ -24,10 +24,6 @@ TextureSamplingPolicy="*res://main/texture_sampling_policy.gd" window/stretch/aspect="expand" -[editor_plugins] - -enabled=PackedStringArray("res://addons/straywild_shoreline_baker/plugin.cfg") - [gui] timers/tooltip_delay_sec=0.0 diff --git a/scripts/bake_shoreline_ribbons.gd b/scripts/bake_shoreline_ribbons.gd deleted file mode 100644 index c030579..0000000 --- a/scripts/bake_shoreline_ribbons.gd +++ /dev/null @@ -1,42 +0,0 @@ -extends SceneTree - -const REGION_SCENE := preload("res://world/regions/starter_island_region.tscn") -func _initialize() -> void: - call_deferred("_bake") - - -func _bake() -> void: - var started := Time.get_ticks_usec() - var region := REGION_SCENE.instantiate() - root.add_child(region) - var baker := region.get_node_or_null("ShorelineRibbonBaker") as ShorelineRibbonBaker - if baker == null: - push_error("The map does not contain a configured ShorelineRibbonBaker.") - quit(1) - return - var results := baker.rebuild_all() - if results.size() != baker.water_bodies.size(): - quit(1) - return - for result: Dictionary in results: - if result.get("skipped", false): - print( - "Shoreline %s: type=%s skipped intentionally" - % [result["output_path"], WaterType.label(result["water_type"])] - ) - continue - print( - "Shoreline %s: type=%s segments=%d loops=%d raw=%d simplified=%d smoothed=%d triangles=%d" - % [ - result["output_path"], - WaterType.label(result["water_type"]), - result["segment_count"], - result["loop_count"], - result["raw_point_count"], - result["simplified_point_count"], - result["smoothed_point_count"], - result["triangle_count"], - ] - ) - print("Shoreline bake completed in %.2f ms" % ((Time.get_ticks_usec() - started) / 1000.0)) - quit() diff --git a/scripts/bake_shoreline_ribbons.gd.uid b/scripts/bake_shoreline_ribbons.gd.uid deleted file mode 100644 index 7b789be..0000000 --- a/scripts/bake_shoreline_ribbons.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://eosavaa6wu1e diff --git a/scripts/build_portmaster.sh b/scripts/build_portmaster.sh index cb4c101..da7dabc 100755 --- a/scripts/build_portmaster.sh +++ b/scripts/build_portmaster.sh @@ -233,7 +233,7 @@ selected data root. Device-local configuration remains under PortMaster launches use the light performance profile by default. Put the word \`normal\` in \`straywild/conf/performance_profile\` to opt a capable device into the normal rendering profile. PortMaster packages retain title and world -music while omitting rain and shoreline ambience in both profiles. See +music while omitting rain ambience in both profiles. See \`straywild/licenses/\` for bundled credits and license information. ## Controls diff --git a/scripts/run_validations.sh b/scripts/run_validations.sh index f71cb60..64cfb31 100755 --- a/scripts/run_validations.sh +++ b/scripts/run_validations.sh @@ -45,7 +45,6 @@ readonly -a QUICK_TESTS=( "tests/player_gathering_animation_validation.gd" "tests/player_experience_validation.gd" "tests/profile_title_validation.gd" - "tests/shoreline_ambience_validation.gd" "tests/surface_drawing_validation.gd" "tests/surface_drawing_performance_validation.gd" "tests/surface_drawing_texture_renderer_validation.gd" diff --git a/tests/art_tools_validation.gd b/tests/art_tools_validation.gd index 8ae45bf..1ac593d 100644 --- a/tests/art_tools_validation.gd +++ b/tests/art_tools_validation.gd @@ -505,7 +505,7 @@ func _run() -> void: "trailblazer", )) var remote_transform: Transform3D = player.global_transform - remote_transform.origin += Vector3(0.8, 0.0, 0.0) + remote_transform.origin += Vector3(20.0, 0.0, 0.0) var remote_avatar := spawn_service.spawn_remote_player( NAMEPLATE_TEST_PEER_ID, remote_transform, @@ -534,6 +534,29 @@ func _run() -> void: assert(remote_plate.visible) assert((remote_nameplate.get("name") as Label).text == "remote stray") assert((remote_nameplate.get("title") as Label).text == "trailblazer") + chat_ui.call( + "_show_speech_bubble", + NAMEPLATE_TEST_PEER_ID, + "distant hello", + "", + ) + await process_frame + chat_ui.call("_update_speech") + var remote_speech_entries: Dictionary = chat_ui.get("_speech") + var remote_speech: Dictionary = remote_speech_entries.get( + NAMEPLATE_TEST_PEER_ID, + {}, + ) + var remote_speech_bubble := remote_speech.get("bubble") as PanelContainer + assert(remote_speech_bubble != null and remote_speech_bubble.visible) + assert(is_equal_approx( + remote_speech_bubble.scale.x, + ChatUI.speech_scale_for_distance( + remote_avatar.global_position.distance_to(player.global_position) + ), + )) + assert(remote_speech_bubble.scale.x < 1.0) + chat_ui.call("_on_peer_removed", NAMEPLATE_TEST_PEER_ID) spawn_service.remove_peer(NAMEPLATE_TEST_PEER_ID) registry.remove_peer(NAMEPLATE_TEST_PEER_ID) chat_ui.call("_update_nameplates") diff --git a/tests/fish_catalog_content_validation.gd b/tests/fish_catalog_content_validation.gd index 82f5604..2c635c6 100644 --- a/tests/fish_catalog_content_validation.gd +++ b/tests/fish_catalog_content_validation.gd @@ -524,21 +524,16 @@ func _validate_starter_water_bodies() -> void: assert(ocean.water_type == WaterType.Type.SALT_WATER) assert(pond.fish_pool == PondPool) assert(ocean.fish_pool == OceanPool) - assert(region.get_node_or_null("ShorelineRibbons/Pond") == null) - var shoreline_geometry := ( - region.get_node_or_null("ShorelineRibbons/Ocean") as MeshInstance3D - ) - assert(shoreline_geometry != null) - assert(not shoreline_geometry.visible) - assert(shoreline_geometry.material_override == null) var pond_material := ( region.get_node("WaterBodies/Pond/VisualWater") as MeshInstance3D ).material_override as ShaderMaterial var ocean_material := ( region.get_node("WaterBodies/Ocean/VisualWater") as MeshInstance3D ).material_override as ShaderMaterial - assert(not bool(pond_material.get_shader_parameter("tide_effect_enabled"))) - assert(bool(ocean_material.get_shader_parameter("tide_effect_enabled"))) + assert(pond_material != null) + assert(ocean_material != null) + assert(float(ocean_material.get_shader_parameter("shoreline_foam_depth")) > 0.0) + assert(float(ocean_material.get_shader_parameter("shoreline_foam_strength")) > 0.0) region.free() diff --git a/tests/light_performance_profile_validation.gd b/tests/light_performance_profile_validation.gd index ada8f93..2a06fc9 100644 --- a/tests/light_performance_profile_validation.gd +++ b/tests/light_performance_profile_validation.gd @@ -131,9 +131,6 @@ func _validate_normal_profile(main: Node) -> void: assert((main.get_node("%TitleMusic") as AudioStreamPlayer).stream != null) assert((main.get_node("%NewGameMusic") as AudioStreamPlayer).stream != null) assert((main.get_node("%DuskMusic") as AudioStreamPlayer).stream != null) - assert( - (main.get_node("%WavesAudio") as AudioStreamPlayer).stream != null - ) assert( (main.get_node("RainAmbience") as AudioStreamPlayer).stream != null ) diff --git a/tests/profile_multiplayer_validation.gd b/tests/profile_multiplayer_validation.gd index c279721..b4ff5d0 100644 --- a/tests/profile_multiplayer_validation.gd +++ b/tests/profile_multiplayer_validation.gd @@ -40,6 +40,15 @@ func _validate_voice_distance_attenuation() -> void: ChatUI.animalese_volume_offset_db_for_distance(24.0), -80.0, )) + assert(is_equal_approx(ChatUI.speech_scale_for_distance(0.0), 1.0)) + assert(is_equal_approx(ChatUI.speech_scale_for_distance(4.0), 1.0)) + var middle_distance_scale := ChatUI.speech_scale_for_distance(14.0) + assert(middle_distance_scale < 1.0) + assert(middle_distance_scale > ChatUI.SPEECH_MINIMUM_SCALE) + assert(is_equal_approx( + ChatUI.speech_scale_for_distance(24.0), + ChatUI.SPEECH_MINIMUM_SCALE, + )) func _run_host() -> void: diff --git a/tests/rain_puddle_runtime_validation.gd b/tests/rain_puddle_runtime_validation.gd new file mode 100644 index 0000000..6456276 --- /dev/null +++ b/tests/rain_puddle_runtime_validation.gd @@ -0,0 +1,84 @@ +extends SceneTree + +const MainScene: PackedScene = preload("res://main/main.tscn") + + +func _initialize() -> void: + call_deferred("_run") + + +func _run() -> void: + root.size = Vector2i(1280, 720) + var main: Node = MainScene.instantiate() + root.add_child(main) + for _frame: int in 4: + await process_frame + if not bool(main.get("_application_initialized")): + main.call("_activate_selected_data_path", "", true) + for _frame: int in 8: + await process_frame + assert(bool(main.get("_application_initialized"))) + assert(bool(main.call( + "_apply_world", + WorldLayout.GENERATED, + PlayerSaveManager.DEFAULT_WORLD_SEED, + true, + ))) + var weather := main.get_node( + "%WorldWeatherService" + ) as WorldWeatherService + assert(weather != null) + weather.apply_authoritative_snapshot( + WorldWeatherService.Weather.RAINY, + 60.0, + ) + main.call("_set_gameplay_active", true) + await physics_frame + await physics_frame + + var puddles := main.get_node( + "RainPuddlePresentation" + ) as RainPuddlePresentation + assert(puddles != null) + assert(not puddles.is_light_performance_profile()) + assert(puddles.is_processing()) + puddles.set_suppressed(true) + assert(not puddles.is_processing()) + puddles.set_suppressed(false) + assert(puddles.is_processing()) + puddles.set_active(false) + assert(not puddles.is_processing()) + puddles.set_active(true) + assert(puddles.is_processing()) + for _tick: int in 18: + puddles.call("_process", 0.25) + assert(puddles.get_active_puddle_count() > 0) + var visual_root := puddles.get_node("PuddleVisuals") as Node3D + assert(visual_root != null) + for puddle_visual: Node in visual_root.get_children(): + assert(puddle_visual is MeshInstance3D) + assert(puddle_visual.get_child_count() == 0) + + weather.apply_authoritative_snapshot( + WorldWeatherService.Weather.SUNNY, + 60.0, + ) + puddles.call("_process", 30.0) + assert(puddles.get_active_puddle_count() == 0) + _stop_audio_players(main) + main.queue_free() + for _frame: int in 8: + await process_frame + print("Rain puddle runtime validation: PASS") + quit() + + +func _stop_audio_players(root_node: Node) -> void: + if root_node is AudioStreamPlayer: + (root_node as AudioStreamPlayer).stop() + elif root_node is AudioStreamPlayer2D: + (root_node as AudioStreamPlayer2D).stop() + elif root_node is AudioStreamPlayer3D: + (root_node as AudioStreamPlayer3D).stop() + for child: Node in root_node.get_children(): + _stop_audio_players(child) diff --git a/tests/rain_puddle_runtime_validation.gd.uid b/tests/rain_puddle_runtime_validation.gd.uid new file mode 100644 index 0000000..2937f9c --- /dev/null +++ b/tests/rain_puddle_runtime_validation.gd.uid @@ -0,0 +1 @@ +uid://jo5lqk2n8bik diff --git a/tests/shoreline_ambience_validation.gd b/tests/shoreline_ambience_validation.gd deleted file mode 100644 index 78829f1..0000000 --- a/tests/shoreline_ambience_validation.gd +++ /dev/null @@ -1,50 +0,0 @@ -extends SceneTree - -const ShorelineAmbienceType := preload("res://world/shoreline_ambience.gd") -const WavesStream := preload("res://audio/ambience/waves.wav") - - -func _initialize() -> void: - call_deferred("_run") - - -func _run() -> void: - var waves := WavesStream as AudioStreamWAV - assert(waves != null) - - var segments: Array[PackedVector2Array] = [ - PackedVector2Array([Vector2.ZERO, Vector2(10.0, 0.0)]), - ] - assert(is_equal_approx( - ShorelineAmbienceType.distance_to_segments(Vector2(5.0, 3.0), segments), - 3.0, - )) - assert(is_equal_approx( - ShorelineAmbienceType.distance_to_segments(Vector2(-4.0, 0.0), segments), - 4.0, - )) - - var controller := ShorelineAmbienceType.new() as ShorelineAmbience - var runtime_audio := AudioStreamPlayer.new() - runtime_audio.name = "WavesAudio" - runtime_audio.unique_name_in_owner = true - runtime_audio.stream = WavesStream - runtime_audio.bus = &"SFX" - controller.add_child(runtime_audio) - runtime_audio.owner = controller - root.add_child(controller) - await process_frame - assert(runtime_audio.bus == &"Environment") - assert(runtime_audio.stream == null) - controller.set_audio_enabled(true) - assert(controller.near_distance < controller.far_distance) - assert(controller.near_volume_db > controller.far_volume_db) - var runtime_waves := runtime_audio.stream as AudioStreamWAV - assert(runtime_waves.loop_mode == AudioStreamWAV.LOOP_FORWARD) - assert(runtime_waves.loop_begin == 0) - assert(runtime_waves.loop_end == 1044956) - controller.free() - await process_frame - - print("Shoreline ambience validation: PASS") - quit() diff --git a/tests/shoreline_ambience_validation.gd.uid b/tests/shoreline_ambience_validation.gd.uid deleted file mode 100644 index 4b7987b..0000000 --- a/tests/shoreline_ambience_validation.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bwvhgpbkb00l1 diff --git a/tests/shoreline_ribbon_validation.gd b/tests/shoreline_ribbon_validation.gd deleted file mode 100644 index e502d70..0000000 --- a/tests/shoreline_ribbon_validation.gd +++ /dev/null @@ -1,97 +0,0 @@ -extends SceneTree - -const ShorelineMesh: ArrayMesh = preload( - "res://world/generated/shorelines/starter_ocean_shoreline.tres" -) -const GEOMETRY_EPSILON := 0.0001 -const CROSSING_NEIGHBORHOOD := 32 - - -func _initialize() -> void: - call_deferred("_run") - - -func _run() -> void: - assert(ShorelineMesh.get_surface_count() == 1) - var arrays := ShorelineMesh.surface_get_arrays(0) - var vertices := arrays[Mesh.ARRAY_VERTEX] as PackedVector3Array - var indices := arrays[Mesh.ARRAY_INDEX] as PackedInt32Array - assert(not vertices.is_empty()) - assert(vertices.size() % 2 == 0) - assert(indices.size() == vertices.size() * 3) - var point_count: int = int(float(vertices.size()) / 2.0) - var land_edge := PackedVector2Array() - var water_edge := PackedVector2Array() - for index: int in point_count: - var land := vertices[index * 2] - var water := vertices[index * 2 + 1] - land_edge.append(Vector2(land.x, land.z)) - water_edge.append(Vector2(water.x, water.z)) - var ribbon_width := land.distance_to(water) - assert(ribbon_width >= 0.34) - assert(ribbon_width <= 1.5) - var crossing_count := ( - _count_local_crossings(water_edge) - + _count_local_crossings(land_edge) - ) - if crossing_count > 0: - push_error( - "Shoreline ribbon contains %d local edge crossings." - % crossing_count - ) - quit(1) - return - print("Shoreline ribbon validation: PASS") - quit() - - -func _count_local_crossings(points: PackedVector2Array) -> int: - var crossing_count := 0 - for first: int in points.size(): - var first_next := (first + 1) % points.size() - var checked_neighbors := mini( - CROSSING_NEIGHBORHOOD, - points.size() - 2, - ) - for offset: int in range(2, checked_neighbors + 1): - var second := (first + offset) % points.size() - var second_next := (second + 1) % points.size() - if second_next == first: - continue - if _segments_cross( - points[first], - points[first_next], - points[second], - points[second_next], - ): - crossing_count += 1 - return crossing_count - - -func _segments_cross( - a: Vector2, - b: Vector2, - c: Vector2, - d: Vector2, -) -> bool: - if ( - maxf(a.x, b.x) < minf(c.x, d.x) - GEOMETRY_EPSILON - or maxf(c.x, d.x) < minf(a.x, b.x) - GEOMETRY_EPSILON - or maxf(a.y, b.y) < minf(c.y, d.y) - GEOMETRY_EPSILON - or maxf(c.y, d.y) < minf(a.y, b.y) - GEOMETRY_EPSILON - ): - return false - var first_direction := b - a - var second_direction := d - c - var denominator := first_direction.cross(second_direction) - if absf(denominator) <= GEOMETRY_EPSILON: - return false - var offset := c - a - var first_amount := offset.cross(second_direction) / denominator - var second_amount := offset.cross(first_direction) / denominator - return ( - first_amount > GEOMETRY_EPSILON - and first_amount < 1.0 - GEOMETRY_EPSILON - and second_amount > GEOMETRY_EPSILON - and second_amount < 1.0 - GEOMETRY_EPSILON - ) diff --git a/tests/shoreline_ribbon_validation.gd.uid b/tests/shoreline_ribbon_validation.gd.uid deleted file mode 100644 index 7989d89..0000000 --- a/tests/shoreline_ribbon_validation.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c73frygpfhred diff --git a/tests/world_weather_validation.gd b/tests/world_weather_validation.gd index f3c41a3..beb3541 100644 --- a/tests/world_weather_validation.gd +++ b/tests/world_weather_validation.gd @@ -19,6 +19,9 @@ const FishAvailabilityType = preload("res://fish/fish_availability.gd") const FishableWaterRegionType = preload( "res://world/fishable_water_region.gd" ) +const RainPuddlePresentationType = preload( + "res://world/rain_puddle_presentation.gd" +) func _initialize() -> void: @@ -34,6 +37,7 @@ func _run() -> void: _validate_fishing_weather_seams() _validate_fishing_spot_context() _validate_weather_presentation() + _validate_rain_puddle_surface_rules() print("World weather validation: PASS") quit() @@ -285,6 +289,53 @@ func _validate_fishing_spot_context() -> void: weather.free() +func _validate_rain_puddle_surface_rules() -> void: + var dry_flat := PackedVector3Array([ + Vector3(-1.0, 0.0, -1.0), + Vector3(2.0, 0.0, -1.0), + Vector3(-1.0, 0.0, 2.0), + ]) + assert(RainPuddlePresentationType.is_puddle_surface_eligible( + dry_flat, + -0.25, + )) + var water_edge := PackedVector3Array([ + Vector3(-1.0, 0.0, -1.0), + Vector3(2.0, 0.0, -1.0), + Vector3(-1.0, -0.2, 2.0), + ]) + assert(not RainPuddlePresentationType.is_puddle_surface_eligible( + water_edge, + -0.25, + )) + var steep_ground := PackedVector3Array([ + Vector3(-1.0, 0.0, -1.0), + Vector3(2.0, 0.0, -1.0), + Vector3(-1.0, 2.0, -0.75), + ]) + assert(not RainPuddlePresentationType.is_puddle_surface_eligible( + steep_ground, + -0.25, + )) + var center := Vector3(4.0, 1.0, -3.0) + var radii := Vector2(1.0, 0.5) + assert(RainPuddlePresentationType.is_point_inside_puddle( + Vector3(4.75, 1.0, -3.0), + center, + radii, + )) + assert(not RainPuddlePresentationType.is_point_inside_puddle( + Vector3(5.1, 1.0, -3.0), + center, + radii, + )) + assert(not RainPuddlePresentationType.is_point_inside_puddle( + Vector3(4.0, 2.1, -3.0), + center, + radii, + )) + + func _validate_weather_presentation() -> void: var world_root := Node3D.new() root.add_child(world_root) diff --git a/ui/chat_ui.gd b/ui/chat_ui.gd index 17b3330..4cf88a0 100644 --- a/ui/chat_ui.gd +++ b/ui/chat_ui.gd @@ -39,6 +39,7 @@ const NAMEPLATE_SPEECH_GAP: float = 5.0 const ANIMALESE_FULL_VOLUME_DISTANCE: float = 4.0 const ANIMALESE_SILENT_DISTANCE: float = 24.0 const ANIMALESE_SILENT_VOLUME_DB: float = -80.0 +const SPEECH_MINIMUM_SCALE: float = 0.60 const ROLEPLAY_FONT_SLANT: float = -0.18 const MAX_EDITOR_GIVE_BALANCE: int = 1_000_000_000_000 const MOBILE_COMPACT_WIDTH: float = 620.0 @@ -1357,6 +1358,19 @@ static func animalese_volume_offset_db_for_distance(distance: float) -> float: return maxf(linear_to_db(amplitude), ANIMALESE_SILENT_VOLUME_DB) +static func speech_scale_for_distance(distance: float) -> float: + if not is_finite(distance) or distance >= ANIMALESE_SILENT_DISTANCE: + return SPEECH_MINIMUM_SCALE + if distance <= ANIMALESE_FULL_VOLUME_DISTANCE: + return 1.0 + var distance_weight := inverse_lerp( + ANIMALESE_FULL_VOLUME_DISTANCE, + ANIMALESE_SILENT_DISTANCE, + distance, + ) + return lerpf(1.0, SPEECH_MINIMUM_SCALE, distance_weight) + + func _on_history(messages: Array) -> void: for peer_id: int in _speech.keys(): var state: Dictionary = _speech[peer_id] @@ -1841,6 +1855,10 @@ func _update_speech() -> void: bubble.hide() continue var world_position := avatar.get_nameplate_anchor_position() + var bubble_scale := speech_scale_for_distance( + avatar.global_position.distance_to(_player.global_position) + ) + bubble.scale = Vector2.ONE * bubble_scale if camera.is_position_behind(world_position): bubble.hide() continue @@ -1860,18 +1878,20 @@ func _update_speech() -> void: ): bubble.hide() continue + var visual_size := bubble.size * bubble_scale + var visual_pointer_height := SPEECH_POINTER_HEIGHT * bubble_scale var desired := screen_position - Vector2( - bubble.size.x * 0.5, - bubble.size.y + SPEECH_POINTER_HEIGHT, + visual_size.x * 0.5, + visual_size.y + visual_pointer_height, ) bubble.position = Vector2( - clampf(desired.x, 8.0, viewport_size.x - bubble.size.x - 8.0), + clampf(desired.x, 8.0, viewport_size.x - visual_size.x - 8.0), clampf( desired.y, 8.0, viewport_size.y - - bubble.size.y - - SPEECH_POINTER_HEIGHT + - visual_size.y + - visual_pointer_height - 8.0, ), ) @@ -1879,7 +1899,7 @@ func _update_speech() -> void: if pointer != null: pointer.position = Vector2( clampf( - screen_position.x - bubble.position.x, + (screen_position.x - bubble.position.x) / bubble_scale, SPEECH_POINTER_HALF_WIDTH + 12.0, bubble.size.x - SPEECH_POINTER_HALF_WIDTH - 12.0, ), diff --git a/world/generated/shorelines/starter_ocean_shoreline.tres b/world/generated/shorelines/starter_ocean_shoreline.tres deleted file mode 100644 index 627b08e..0000000 --- a/world/generated/shorelines/starter_ocean_shoreline.tres +++ /dev/null @@ -1,14 +0,0 @@ -[gd_resource type="ArrayMesh" format=4 uid="uid://dmgps6rhbdjlw"] - -[resource] -_surfaces = [{ -"aabb": AABB(-27.86245, -0.432, -26.431866, 54.402885, 1e-05, 51.728455), -"attribute_data": PackedByteArray("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"), -"format": 34359742487, -"index_count": 6588, -"index_data": PackedByteArray("AAACAAEAAQACAAMAAgAEAAMAAwAEAAUABAAGAAUABQAGAAcABgAIAAcABwAIAAkACAAKAAkACQAKAAsACgAMAAsACwAMAA0ADAAOAA0ADQAOAA8ADgAQAA8ADwAQABEAEAASABEAEQASABMAEgAUABMAEwAUABUAFAAWABUAFQAWABcAFgAYABcAFwAYABkAGAAaABkAGQAaABsAGgAcABsAGwAcAB0AHAAeAB0AHQAeAB8AHgAgAB8AHwAgACEAIAAiACEAIQAiACMAIgAkACMAIwAkACUAJAAmACUAJQAmACcAJgAoACcAJwAoACkAKAAqACkAKQAqACsAKgAsACsAKwAsAC0ALAAuAC0ALQAuAC8ALgAwAC8ALwAwADEAMAAyADEAMQAyADMAMgA0ADMAMwA0ADUANAA2ADUANQA2ADcANgA4ADcANwA4ADkAOAA6ADkAOQA6ADsAOgA8ADsAOwA8AD0APAA+AD0APQA+AD8APgBAAD8APwBAAEEAQABCAEEAQQBCAEMAQgBEAEMAQwBEAEUARABGAEUARQBGAEcARgBIAEcARwBIAEkASABKAEkASQBKAEsASgBMAEsASwBMAE0ATABOAE0ATQBOAE8ATgBQAE8ATwBQAFEAUABSAFEAUQBSAFMAUgBUAFMAUwBUAFUAVABWAFUAVQBWAFcAVgBYAFcAVwBYAFkAWABaAFkAWQBaAFsAWgBcAFsAWwBcAF0AXABeAF0AXQBeAF8AXgBgAF8AXwBgAGEAYABiAGEAYQBiAGMAYgBkAGMAYwBkAGUAZABmAGUAZQBmAGcAZgBoAGcAZwBoAGkAaABqAGkAaQBqAGsAagBsAGsAawBsAG0AbABuAG0AbQBuAG8AbgBwAG8AbwBwAHEAcAByAHEAcQByAHMAcgB0AHMAcwB0AHUAdAB2AHUAdQB2AHcAdgB4AHcAdwB4AHkAeAB6AHkAeQB6AHsAegB8AHsAewB8AH0AfAB+AH0AfQB+AH8AfgCAAH8AfwCAAIEAgACCAIEAgQCCAIMAggCEAIMAgwCEAIUAhACGAIUAhQCGAIcAhgCIAIcAhwCIAIkAiACKAIkAiQCKAIsAigCMAIsAiwCMAI0AjACOAI0AjQCOAI8AjgCQAI8AjwCQAJEAkACSAJEAkQCSAJMAkgCUAJMAkwCUAJUAlACWAJUAlQCWAJcAlgCYAJcAlwCYAJkAmACaAJkAmQCaAJsAmgCcAJsAmwCcAJ0AnACeAJ0AnQCeAJ8AngCgAJ8AnwCgAKEAoACiAKEAoQCiAKMAogCkAKMAowCkAKUApACmAKUApQCmAKcApgCoAKcApwCoAKkAqACqAKkAqQCqAKsAqgCsAKsAqwCsAK0ArACuAK0ArQCuAK8ArgCwAK8ArwCwALEAsACyALEAsQCyALMAsgC0ALMAswC0ALUAtAC2ALUAtQC2ALcAtgC4ALcAtwC4ALkAuAC6ALkAuQC6ALsAugC8ALsAuwC8AL0AvAC+AL0AvQC+AL8AvgDAAL8AvwDAAMEAwADCAMEAwQDCAMMAwgDEAMMAwwDEAMUAxADGAMUAxQDGAMcAxgDIAMcAxwDIAMkAyADKAMkAyQDKAMsAygDMAMsAywDMAM0AzADOAM0AzQDOAM8AzgDQAM8AzwDQANEA0ADSANEA0QDSANMA0gDUANMA0wDUANUA1ADWANUA1QDWANcA1gDYANcA1wDYANkA2ADaANkA2QDaANsA2gDcANsA2wDcAN0A3ADeAN0A3QDeAN8A3gDgAN8A3wDgAOEA4ADiAOEA4QDiAOMA4gDkAOMA4wDkAOUA5ADmAOUA5QDmAOcA5gDoAOcA5wDoAOkA6ADqAOkA6QDqAOsA6gDsAOsA6wDsAO0A7ADuAO0A7QDuAO8A7gDwAO8A7wDwAPEA8ADyAPEA8QDyAPMA8gD0APMA8wD0APUA9AD2APUA9QD2APcA9gD4APcA9wD4APkA+AD6APkA+QD6APsA+gD8APsA+wD8AP0A/AD+AP0A/QD+AP8A/gAAAf8A/wAAAQEBAAECAQEBAQECAQMBAgEEAQMBAwEEAQUBBAEGAQUBBQEGAQcBBgEIAQcBBwEIAQkBCAEKAQkBCQEKAQsBCgEMAQsBCwEMAQ0BDAEOAQ0BDQEOAQ8BDgEQAQ8BDwEQAREBEAESAREBEQESARMBEgEUARMBEwEUARUBFAEWARUBFQEWARcBFgEYARcBFwEYARkBGAEaARkBGQEaARsBGgEcARsBGwEcAR0BHAEeAR0BHQEeAR8BHgEgAR8BHwEgASEBIAEiASEBIQEiASMBIgEkASMBIwEkASUBJAEmASUBJQEmAScBJgEoAScBJwEoASkBKAEqASkBKQEqASsBKgEsASsBKwEsAS0BLAEuAS0BLQEuAS8BLgEwAS8BLwEwATEBMAEyATEBMQEyATMBMgE0ATMBMwE0ATUBNAE2ATUBNQE2ATcBNgE4ATcBNwE4ATkBOAE6ATkBOQE6ATsBOgE8ATsBOwE8AT0BPAE+AT0BPQE+AT8BPgFAAT8BPwFAAUEBQAFCAUEBQQFCAUMBQgFEAUMBQwFEAUUBRAFGAUUBRQFGAUcBRgFIAUcBRwFIAUkBSAFKAUkBSQFKAUsBSgFMAUsBSwFMAU0BTAFOAU0BTQFOAU8BTgFQAU8BTwFQAVEBUAFSAVEBUQFSAVMBUgFUAVMBUwFUAVUBVAFWAVUBVQFWAVcBVgFYAVcBVwFYAVkBWAFaAVkBWQFaAVsBWgFcAVsBWwFcAV0BXAFeAV0BXQFeAV8BXgFgAV8BXwFgAWEBYAFiAWEBYQFiAWMBYgFkAWMBYwFkAWUBZAFmAWUBZQFmAWcBZgFoAWcBZwFoAWkBaAFqAWkBaQFqAWsBagFsAWsBawFsAW0BbAFuAW0BbQFuAW8BbgFwAW8BbwFwAXEBcAFyAXEBcQFyAXMBcgF0AXMBcwF0AXUBdAF2AXUBdQF2AXcBdgF4AXcBdwF4AXkBeAF6AXkBeQF6AXsBegF8AXsBewF8AX0BfAF+AX0BfQF+AX8BfgGAAX8BfwGAAYEBgAGCAYEBgQGCAYMBggGEAYMBgwGEAYUBhAGGAYUBhQGGAYcBhgGIAYcBhwGIAYkBiAGKAYkBiQGKAYsBigGMAYsBiwGMAY0BjAGOAY0BjQGOAY8BjgGQAY8BjwGQAZEBkAGSAZEBkQGSAZMBkgGUAZMBkwGUAZUBlAGWAZUBlQGWAZcBlgGYAZcBlwGYAZkBmAGaAZkBmQGaAZsBmgGcAZsBmwGcAZ0BnAGeAZ0BnQGeAZ8BngGgAZ8BnwGgAaEBoAGiAaEBoQGiAaMBogGkAaMBowGkAaUBpAGmAaUBpQGmAacBpgGoAacBpwGoAakBqAGqAakBqQGqAasBqgGsAasBqwGsAa0BrAGuAa0BrQGuAa8BrgGwAa8BrwGwAbEBsAGyAbEBsQGyAbMBsgG0AbMBswG0AbUBtAG2AbUBtQG2AbcBtgG4AbcBtwG4AbkBuAG6AbkBuQG6AbsBugG8AbsBuwG8Ab0BvAG+Ab0BvQG+Ab8BvgHAAb8BvwHAAcEBwAHCAcEBwQHCAcMBwgHEAcMBwwHEAcUBxAHGAcUBxQHGAccBxgHIAccBxwHIAckByAHKAckByQHKAcsBygHMAcsBywHMAc0BzAHOAc0BzQHOAc8BzgHQAc8BzwHQAdEB0AHSAdEB0QHSAdMB0gHUAdMB0wHUAdUB1AHWAdUB1QHWAdcB1gHYAdcB1wHYAdkB2AHaAdkB2QHaAdsB2gHcAdsB2wHcAd0B3AHeAd0B3QHeAd8B3gHgAd8B3wHgAeEB4AHiAeEB4QHiAeMB4gHkAeMB4wHkAeUB5AHmAeUB5QHmAecB5gHoAecB5wHoAekB6AHqAekB6QHqAesB6gHsAesB6wHsAe0B7AHuAe0B7QHuAe8B7gHwAe8B7wHwAfEB8AHyAfEB8QHyAfMB8gH0AfMB8wH0AfUB9AH2AfUB9QH2AfcB9gH4AfcB9wH4AfkB+AH6AfkB+QH6AfsB+gH8AfsB+wH8Af0B/AH+Af0B/QH+Af8B/gEAAv8B/wEAAgECAAICAgECAQICAgMCAgIEAgMCAwIEAgUCBAIGAgUCBQIGAgcCBgIIAgcCBwIIAgkCCAIKAgkCCQIKAgsCCgIMAgsCCwIMAg0CDAIOAg0CDQIOAg8CDgIQAg8CDwIQAhECEAISAhECEQISAhMCEgIUAhMCEwIUAhUCFAIWAhUCFQIWAhcCFgIYAhcCFwIYAhkCGAIaAhkCGQIaAhsCGgIcAhsCGwIcAh0CHAIeAh0CHQIeAh8CHgIgAh8CHwIgAiECIAIiAiECIQIiAiMCIgIkAiMCIwIkAiUCJAImAiUCJQImAicCJgIoAicCJwIoAikCKAIqAikCKQIqAisCKgIsAisCKwIsAi0CLAIuAi0CLQIuAi8CLgIwAi8CLwIwAjECMAIyAjECMQIyAjMCMgI0AjMCMwI0AjUCNAI2AjUCNQI2AjcCNgI4AjcCNwI4AjkCOAI6AjkCOQI6AjsCOgI8AjsCOwI8Aj0CPAI+Aj0CPQI+Aj8CPgJAAj8CPwJAAkECQAJCAkECQQJCAkMCQgJEAkMCQwJEAkUCRAJGAkUCRQJGAkcCRgJIAkcCRwJIAkkCSAJKAkkCSQJKAksCSgJMAksCSwJMAk0CTAJOAk0CTQJOAk8CTgJQAk8CTwJQAlECUAJSAlECUQJSAlMCUgJUAlMCUwJUAlUCVAJWAlUCVQJWAlcCVgJYAlcCVwJYAlkCWAJaAlkCWQJaAlsCWgJcAlsCWwJcAl0CXAJeAl0CXQJeAl8CXgJgAl8CXwJgAmECYAJiAmECYQJiAmMCYgJkAmMCYwJkAmUCZAJmAmUCZQJmAmcCZgJoAmcCZwJoAmkCaAJqAmkCaQJqAmsCagJsAmsCawJsAm0CbAJuAm0CbQJuAm8CbgJwAm8CbwJwAnECcAJyAnECcQJyAnMCcgJ0AnMCcwJ0AnUCdAJ2AnUCdQJ2AncCdgJ4AncCdwJ4AnkCeAJ6AnkCeQJ6AnsCegJ8AnsCewJ8An0CfAJ+An0CfQJ+An8CfgKAAn8CfwKAAoECgAKCAoECgQKCAoMCggKEAoMCgwKEAoUChAKGAoUChQKGAocChgKIAocChwKIAokCiAKKAokCiQKKAosCigKMAosCiwKMAo0CjAKOAo0CjQKOAo8CjgKQAo8CjwKQApECkAKSApECkQKSApMCkgKUApMCkwKUApUClAKWApUClQKWApcClgKYApcClwKYApkCmAKaApkCmQKaApsCmgKcApsCmwKcAp0CnAKeAp0CnQKeAp8CngKgAp8CnwKgAqECoAKiAqECoQKiAqMCogKkAqMCowKkAqUCpAKmAqUCpQKmAqcCpgKoAqcCpwKoAqkCqAKqAqkCqQKqAqsCqgKsAqsCqwKsAq0CrAKuAq0CrQKuAq8CrgKwAq8CrwKwArECsAKyArECsQKyArMCsgK0ArMCswK0ArUCtAK2ArUCtQK2ArcCtgK4ArcCtwK4ArkCuAK6ArkCuQK6ArsCugK8ArsCuwK8Ar0CvAK+Ar0CvQK+Ar8CvgLAAr8CvwLAAsECwALCAsECwQLCAsMCwgLEAsMCwwLEAsUCxALGAsUCxQLGAscCxgLIAscCxwLIAskCyALKAskCyQLKAssCygLMAssCywLMAs0CzALOAs0CzQLOAs8CzgLQAs8CzwLQAtEC0ALSAtEC0QLSAtMC0gLUAtMC0wLUAtUC1ALWAtUC1QLWAtcC1gLYAtcC1wLYAtkC2ALaAtkC2QLaAtsC2gLcAtsC2wLcAt0C3ALeAt0C3QLeAt8C3gLgAt8C3wLgAuEC4ALiAuEC4QLiAuMC4gLkAuMC4wLkAuUC5ALmAuUC5QLmAucC5gLoAucC5wLoAukC6ALqAukC6QLqAusC6gLsAusC6wLsAu0C7ALuAu0C7QLuAu8C7gLwAu8C7wLwAvEC8ALyAvEC8QLyAvMC8gL0AvMC8wL0AvUC9AL2AvUC9QL2AvcC9gL4AvcC9wL4AvkC+AL6AvkC+QL6AvsC+gL8AvsC+wL8Av0C/AL+Av0C/QL+Av8C/gIAA/8C/wIAAwEDAAMCAwEDAQMCAwMDAgMEAwMDAwMEAwUDBAMGAwUDBQMGAwcDBgMIAwcDBwMIAwkDCAMKAwkDCQMKAwsDCgMMAwsDCwMMAw0DDAMOAw0DDQMOAw8DDgMQAw8DDwMQAxEDEAMSAxEDEQMSAxMDEgMUAxMDEwMUAxUDFAMWAxUDFQMWAxcDFgMYAxcDFwMYAxkDGAMaAxkDGQMaAxsDGgMcAxsDGwMcAx0DHAMeAx0DHQMeAx8DHgMgAx8DHwMgAyEDIAMiAyEDIQMiAyMDIgMkAyMDIwMkAyUDJAMmAyUDJQMmAycDJgMoAycDJwMoAykDKAMqAykDKQMqAysDKgMsAysDKwMsAy0DLAMuAy0DLQMuAy8DLgMwAy8DLwMwAzEDMAMyAzEDMQMyAzMDMgM0AzMDMwM0AzUDNAM2AzUDNQM2AzcDNgM4AzcDNwM4AzkDOAM6AzkDOQM6AzsDOgM8AzsDOwM8Az0DPAM+Az0DPQM+Az8DPgNAAz8DPwNAA0EDQANCA0EDQQNCA0MDQgNEA0MDQwNEA0UDRANGA0UDRQNGA0cDRgNIA0cDRwNIA0kDSANKA0kDSQNKA0sDSgNMA0sDSwNMA00DTANOA00DTQNOA08DTgNQA08DTwNQA1EDUANSA1EDUQNSA1MDUgNUA1MDUwNUA1UDVANWA1UDVQNWA1cDVgNYA1cDVwNYA1kDWANaA1kDWQNaA1sDWgNcA1sDWwNcA10DXANeA10DXQNeA18DXgNgA18DXwNgA2EDYANiA2EDYQNiA2MDYgNkA2MDYwNkA2UDZANmA2UDZQNmA2cDZgNoA2cDZwNoA2kDaANqA2kDaQNqA2sDagNsA2sDawNsA20DbANuA20DbQNuA28DbgNwA28DbwNwA3EDcANyA3EDcQNyA3MDcgN0A3MDcwN0A3UDdAN2A3UDdQN2A3cDdgN4A3cDdwN4A3kDeAN6A3kDeQN6A3sDegN8A3sDewN8A30DfAN+A30DfQN+A38DfgOAA38DfwOAA4EDgAOCA4EDgQOCA4MDggOEA4MDgwOEA4UDhAOGA4UDhQOGA4cDhgOIA4cDhwOIA4kDiAOKA4kDiQOKA4sDigOMA4sDiwOMA40DjAOOA40DjQOOA48DjgOQA48DjwOQA5EDkAOSA5EDkQOSA5MDkgOUA5MDkwOUA5UDlAOWA5UDlQOWA5cDlgOYA5cDlwOYA5kDmAOaA5kDmQOaA5sDmgOcA5sDmwOcA50DnAOeA50DnQOeA58DngOgA58DnwOgA6EDoAOiA6EDoQOiA6MDogOkA6MDowOkA6UDpAOmA6UDpQOmA6cDpgOoA6cDpwOoA6kDqAOqA6kDqQOqA6sDqgOsA6sDqwOsA60DrAOuA60DrQOuA68DrgOwA68DrwOwA7EDsAOyA7EDsQOyA7MDsgO0A7MDswO0A7UDtAO2A7UDtQO2A7cDtgO4A7cDtwO4A7kDuAO6A7kDuQO6A7sDugO8A7sDuwO8A70DvAO+A70DvQO+A78DvgPAA78DvwPAA8EDwAPCA8EDwQPCA8MDwgPEA8MDwwPEA8UDxAPGA8UDxQPGA8cDxgPIA8cDxwPIA8kDyAPKA8kDyQPKA8sDygPMA8sDywPMA80DzAPOA80DzQPOA88DzgPQA88DzwPQA9ED0APSA9ED0QPSA9MD0gPUA9MD0wPUA9UD1APWA9UD1QPWA9cD1gPYA9cD1wPYA9kD2APaA9kD2QPaA9sD2gPcA9sD2wPcA90D3APeA90D3QPeA98D3gPgA98D3wPgA+ED4APiA+ED4QPiA+MD4gPkA+MD4wPkA+UD5APmA+UD5QPmA+cD5gPoA+cD5wPoA+kD6APqA+kD6QPqA+sD6gPsA+sD6wPsA+0D7APuA+0D7QPuA+8D7gPwA+8D7wPwA/ED8APyA/ED8QPyA/MD8gP0A/MD8wP0A/UD9AP2A/UD9QP2A/cD9gP4A/cD9wP4A/kD+AP6A/kD+QP6A/sD+gP8A/sD+wP8A/0D/AP+A/0D/QP+A/8D/gMABP8D/wMABAEEAAQCBAEEAQQCBAMEAgQEBAMEAwQEBAUEBAQGBAUEBQQGBAcEBgQIBAcEBwQIBAkECAQKBAkECQQKBAsECgQMBAsECwQMBA0EDAQOBA0EDQQOBA8EDgQQBA8EDwQQBBEEEAQSBBEEEQQSBBMEEgQUBBMEEwQUBBUEFAQWBBUEFQQWBBcEFgQYBBcEFwQYBBkEGAQaBBkEGQQaBBsEGgQcBBsEGwQcBB0EHAQeBB0EHQQeBB8EHgQgBB8EHwQgBCEEIAQiBCEEIQQiBCMEIgQkBCMEIwQkBCUEJAQmBCUEJQQmBCcEJgQoBCcEJwQoBCkEKAQqBCkEKQQqBCsEKgQsBCsEKwQsBC0ELAQuBC0ELQQuBC8ELgQwBC8ELwQwBDEEMAQyBDEEMQQyBDMEMgQ0BDMEMwQ0BDUENAQ2BDUENQQ2BDcENgQ4BDcENwQ4BDkEOAQ6BDkEOQQ6BDsEOgQ8BDsEOwQ8BD0EPAQ+BD0EPQQ+BD8EPgRABD8EPwRABEEEQARCBEEEQQRCBEMEQgREBEMEQwREBEUERARGBEUERQRGBEcERgRIBEcERwRIBEkESARKBEkESQRKBEsESgRMBEsESwRMBE0ETAROBE0ETQROBE8ETgRQBE8ETwRQBFEEUARSBFEEUQRSBFMEUgRUBFMEUwRUBFUEVARWBFUEVQRWBFcEVgRYBFcEVwRYBFkEWARaBFkEWQRaBFsEWgRcBFsEWwRcBF0EXAReBF0EXQReBF8EXgRgBF8EXwRgBGEEYARiBGEEYQRiBGMEYgRkBGMEYwRkBGUEZARmBGUEZQRmBGcEZgRoBGcEZwRoBGkEaARqBGkEaQRqBGsEagRsBGsEawRsBG0EbARuBG0EbQRuBG8EbgRwBG8EbwRwBHEEcARyBHEEcQRyBHMEcgR0BHMEcwR0BHUEdAR2BHUEdQR2BHcEdgR4BHcEdwR4BHkEeAR6BHkEeQR6BHsEegR8BHsEewR8BH0EfAR+BH0EfQR+BH8EfgSABH8EfwSABIEEgASCBIEEgQSCBIMEggSEBIMEgwSEBIUEhASGBIUEhQSGBIcEhgSIBIcEhwSIBIkEiASKBIkEiQSKBIsEigSMBIsEiwSMBI0EjASOBI0EjQSOBI8EjgSQBI8EjwSQBJEEkASSBJEEkQSSBJMEkgSUBJMEkwSUBJUElASWBJUElQSWBJcElgSYBJcElwSYBJkEmASaBJkEmQSaBJsEmgScBJsEmwScBJ0EnASeBJ0EnQSeBJ8EngSgBJ8EnwSgBKEEoASiBKEEoQSiBKMEogSkBKMEowSkBKUEpASmBKUEpQSmBKcEpgSoBKcEpwSoBKkEqASqBKkEqQSqBKsEqgSsBKsEqwSsBK0ErASuBK0ErQSuBK8ErgSwBK8ErwSwBLEEsASyBLEEsQSyBLMEsgS0BLMEswS0BLUEtAS2BLUEtQS2BLcEtgS4BLcEtwS4BLkEuAS6BLkEuQS6BLsEugS8BLsEuwS8BL0EvAS+BL0EvQS+BL8EvgTABL8EvwTABMEEwATCBMEEwQTCBMMEwgTEBMMEwwTEBMUExATGBMUExQTGBMcExgTIBMcExwTIBMkEyATKBMkEyQTKBMsEygTMBMsEywTMBM0EzATOBM0EzQTOBM8EzgTQBM8EzwTQBNEE0ATSBNEE0QTSBNME0gTUBNME0wTUBNUE1ATWBNUE1QTWBNcE1gTYBNcE1wTYBNkE2ATaBNkE2QTaBNsE2gTcBNsE2wTcBN0E3ATeBN0E3QTeBN8E3gTgBN8E3wTgBOEE4ATiBOEE4QTiBOME4gTkBOME4wTkBOUE5ATmBOUE5QTmBOcE5gToBOcE5wToBOkE6ATqBOkE6QTqBOsE6gTsBOsE6wTsBO0E7ATuBO0E7QTuBO8E7gTwBO8E7wTwBPEE8ATyBPEE8QTyBPME8gT0BPME8wT0BPUE9AT2BPUE9QT2BPcE9gT4BPcE9wT4BPkE+AT6BPkE+QT6BPsE+gT8BPsE+wT8BP0E/AT+BP0E/QT+BP8E/gQABf8E/wQABQEFAAUCBQEFAQUCBQMFAgUEBQMFAwUEBQUFBAUGBQUFBQUGBQcFBgUIBQcFBwUIBQkFCAUKBQkFCQUKBQsFCgUMBQsFCwUMBQ0FDAUOBQ0FDQUOBQ8FDgUQBQ8FDwUQBREFEAUSBREFEQUSBRMFEgUUBRMFEwUUBRUFFAUWBRUFFQUWBRcFFgUYBRcFFwUYBRkFGAUaBRkFGQUaBRsFGgUcBRsFGwUcBR0FHAUeBR0FHQUeBR8FHgUgBR8FHwUgBSEFIAUiBSEFIQUiBSMFIgUkBSMFIwUkBSUFJAUmBSUFJQUmBScFJgUoBScFJwUoBSkFKAUqBSkFKQUqBSsFKgUsBSsFKwUsBS0FLAUuBS0FLQUuBS8FLgUwBS8FLwUwBTEFMAUyBTEFMQUyBTMFMgU0BTMFMwU0BTUFNAU2BTUFNQU2BTcFNgU4BTcFNwU4BTkFOAU6BTkFOQU6BTsFOgU8BTsFOwU8BT0FPAU+BT0FPQU+BT8FPgVABT8FPwVABUEFQAVCBUEFQQVCBUMFQgVEBUMFQwVEBUUFRAVGBUUFRQVGBUcFRgVIBUcFRwVIBUkFSAVKBUkFSQVKBUsFSgVMBUsFSwVMBU0FTAVOBU0FTQVOBU8FTgVQBU8FTwVQBVEFUAVSBVEFUQVSBVMFUgVUBVMFUwVUBVUFVAVWBVUFVQVWBVcFVgVYBVcFVwVYBVkFWAVaBVkFWQVaBVsFWgVcBVsFWwVcBV0FXAVeBV0FXQVeBV8FXgVgBV8FXwVgBWEFYAViBWEFYQViBWMFYgVkBWMFYwVkBWUFZAVmBWUFZQVmBWcFZgVoBWcFZwVoBWkFaAVqBWkFaQVqBWsFagVsBWsFawVsBW0FbAVuBW0FbQVuBW8FbgVwBW8FbwVwBXEFcAVyBXEFcQVyBXMFcgV0BXMFcwV0BXUFdAV2BXUFdQV2BXcFdgV4BXcFdwV4BXkFeAV6BXkFeQV6BXsFegV8BXsFewV8BX0FfAV+BX0FfQV+BX8FfgWABX8FfwWABYEFgAWCBYEFgQWCBYMFggWEBYMFgwWEBYUFhAWGBYUFhQWGBYcFhgWIBYcFhwWIBYkFiAWKBYkFiQWKBYsFigWMBYsFiwWMBY0FjAWOBY0FjQWOBY8FjgWQBY8FjwWQBZEFkAWSBZEFkQWSBZMFkgWUBZMFkwWUBZUFlAWWBZUFlQWWBZcFlgWYBZcFlwWYBZkFmAWaBZkFmQWaBZsFmgWcBZsFmwWcBZ0FnAWeBZ0FnQWeBZ8FngWgBZ8FnwWgBaEFoAWiBaEFoQWiBaMFogWkBaMFowWkBaUFpAWmBaUFpQWmBacFpgWoBacFpwWoBakFqAWqBakFqQWqBasFqgWsBasFqwWsBa0FrAWuBa0FrQWuBa8FrgWwBa8FrwWwBbEFsAWyBbEFsQWyBbMFsgW0BbMFswW0BbUFtAW2BbUFtQW2BbcFtgW4BbcFtwW4BbkFuAW6BbkFuQW6BbsFugW8BbsFuwW8Bb0FvAW+Bb0FvQW+Bb8FvgXABb8FvwXABcEFwAXCBcEFwQXCBcMFwgXEBcMFwwXEBcUFxAXGBcUFxQXGBccFxgXIBccFxwXIBckFyAXKBckFyQXKBcsFygXMBcsFywXMBc0FzAXOBc0FzQXOBc8FzgXQBc8FzwXQBdEF0AXSBdEF0QXSBdMF0gXUBdMF0wXUBdUF1AXWBdUF1QXWBdcF1gXYBdcF1wXYBdkF2AXaBdkF2QXaBdsF2gXcBdsF2wXcBd0F3AXeBd0F3QXeBd8F3gXgBd8F3wXgBeEF4AXiBeEF4QXiBeMF4gXkBeMF4wXkBeUF5AXmBeUF5QXmBecF5gXoBecF5wXoBekF6AXqBekF6QXqBesF6gXsBesF6wXsBe0F7AXuBe0F7QXuBe8F7gXwBe8F7wXwBfEF8AXyBfEF8QXyBfMF8gX0BfMF8wX0BfUF9AX2BfUF9QX2BfcF9gX4BfcF9wX4BfkF+AX6BfkF+QX6BfsF+gX8BfsF+wX8Bf0F/AX+Bf0F/QX+Bf8F/gUABv8F/wUABgEGAAYCBgEGAQYCBgMGAgYEBgMGAwYEBgUGBAYGBgUGBQYGBgcGBgYIBgcGBwYIBgkGCAYKBgkGCQYKBgsGCgYMBgsGCwYMBg0GDAYOBg0GDQYOBg8GDgYQBg8GDwYQBhEGEAYSBhEGEQYSBhMGEgYUBhMGEwYUBhUGFAYWBhUGFQYWBhcGFgYYBhcGFwYYBhkGGAYaBhkGGQYaBhsGGgYcBhsGGwYcBh0GHAYeBh0GHQYeBh8GHgYgBh8GHwYgBiEGIAYiBiEGIQYiBiMGIgYkBiMGIwYkBiUGJAYmBiUGJQYmBicGJgYoBicGJwYoBikGKAYqBikGKQYqBisGKgYsBisGKwYsBi0GLAYuBi0GLQYuBi8GLgYwBi8GLwYwBjEGMAYyBjEGMQYyBjMGMgY0BjMGMwY0BjUGNAY2BjUGNQY2BjcGNgY4BjcGNwY4BjkGOAY6BjkGOQY6BjsGOgY8BjsGOwY8Bj0GPAY+Bj0GPQY+Bj8GPgZABj8GPwZABkEGQAZCBkEGQQZCBkMGQgZEBkMGQwZEBkUGRAZGBkUGRQZGBkcGRgZIBkcGRwZIBkkGSAZKBkkGSQZKBksGSgZMBksGSwZMBk0GTAZOBk0GTQZOBk8GTgZQBk8GTwZQBlEGUAZSBlEGUQZSBlMGUgZUBlMGUwZUBlUGVAZWBlUGVQZWBlcGVgZYBlcGVwZYBlkGWAZaBlkGWQZaBlsGWgZcBlsGWwZcBl0GXAZeBl0GXQZeBl8GXgZgBl8GXwZgBmEGYAZiBmEGYQZiBmMGYgZkBmMGYwZkBmUGZAZmBmUGZQZmBmcGZgZoBmcGZwZoBmkGaAZqBmkGaQZqBmsGagZsBmsGawZsBm0GbAZuBm0GbQZuBm8GbgZwBm8GbwZwBnEGcAZyBnEGcQZyBnMGcgZ0BnMGcwZ0BnUGdAZ2BnUGdQZ2BncGdgZ4BncGdwZ4BnkGeAZ6BnkGeQZ6BnsGegZ8BnsGewZ8Bn0GfAZ+Bn0GfQZ+Bn8GfgaABn8GfwaABoEGgAaCBoEGgQaCBoMGggaEBoMGgwaEBoUGhAaGBoUGhQaGBocGhgaIBocGhwaIBokGiAaKBokGiQaKBosGigaMBosGiwaMBo0GjAaOBo0GjQaOBo8GjgaQBo8GjwaQBpEGkAaSBpEGkQaSBpMGkgaUBpMGkwaUBpUGlAaWBpUGlQaWBpcGlgaYBpcGlwaYBpkGmAaaBpkGmQaaBpsGmgacBpsGmwacBp0GnAaeBp0GnQaeBp8GngagBp8GnwagBqEGoAaiBqEGoQaiBqMGogakBqMGowakBqUGpAamBqUGpQamBqcGpgaoBqcGpwaoBqkGqAaqBqkGqQaqBqsGqgasBqsGqwasBq0GrAauBq0GrQauBq8GrgawBq8GrwawBrEGsAayBrEGsQayBrMGsga0BrMGswa0BrUGtAa2BrUGtQa2BrcGtga4BrcGtwa4BrkGuAa6BrkGuQa6BrsGuga8BrsGuwa8Br0GvAa+Br0GvQa+Br8GvgbABr8GvwbABsEGwAbCBsEGwQbCBsMGwgbEBsMGwwbEBsUGxAbGBsUGxQbGBscGxgbIBscGxwbIBskGyAbKBskGyQbKBssGygbMBssGywbMBs0GzAbOBs0GzQbOBs8GzgbQBs8GzwbQBtEG0AbSBtEG0QbSBtMG0gbUBtMG0wbUBtUG1AbWBtUG1QbWBtcG1gbYBtcG1wbYBtkG2AbaBtkG2QbaBtsG2gbcBtsG2wbcBt0G3AbeBt0G3QbeBt8G3gbgBt8G3wbgBuEG4AbiBuEG4QbiBuMG4gbkBuMG4wbkBuUG5AbmBuUG5QbmBucG5gboBucG5wboBukG6AbqBukG6QbqBusG6gbsBusG6wbsBu0G7AbuBu0G7QbuBu8G7gbwBu8G7wbwBvEG8AbyBvEG8QbyBvMG8gb0BvMG8wb0BvUG9Ab2BvUG9Qb2BvcG9gb4BvcG9wb4BvkG+Ab6BvkG+Qb6BvsG+gb8BvsG+wb8Bv0G/Ab+Bv0G/Qb+Bv8G/gYAB/8G/wYABwEHAAcCBwEHAQcCBwMHAgcEBwMHAwcEBwUHBAcGBwUHBQcGBwcHBgcIBwcHBwcIBwkHCAcKBwkHCQcKBwsHCgcMBwsHCwcMBw0HDAcOBw0HDQcOBw8HDgcQBw8HDwcQBxEHEAcSBxEHEQcSBxMHEgcUBxMHEwcUBxUHFAcWBxUHFQcWBxcHFgcYBxcHFwcYBxkHGAcaBxkHGQcaBxsHGgccBxsHGwccBx0HHAceBx0HHQceBx8HHgcgBx8HHwcgByEHIAciByEHIQciByMHIgckByMHIwckByUHJAcmByUHJQcmBycHJgcoBycHJwcoBykHKAcqBykHKQcqBysHKgcsBysHKwcsBy0HLAcuBy0HLQcuBy8HLgcwBy8HLwcwBzEHMAcyBzEHMQcyBzMHMgc0BzMHMwc0BzUHNAc2BzUHNQc2BzcHNgc4BzcHNwc4BzkHOAc6BzkHOQc6BzsHOgc8BzsHOwc8Bz0HPAc+Bz0HPQc+Bz8HPgdABz8HPwdAB0EHQAdCB0EHQQdCB0MHQgdEB0MHQwdEB0UHRAdGB0UHRQdGB0cHRgdIB0cHRwdIB0kHSAdKB0kHSQdKB0sHSgdMB0sHSwdMB00HTAdOB00HTQdOB08HTgdQB08HTwdQB1EHUAdSB1EHUQdSB1MHUgdUB1MHUwdUB1UHVAdWB1UHVQdWB1cHVgdYB1cHVwdYB1kHWAdaB1kHWQdaB1sHWgdcB1sHWwdcB10HXAdeB10HXQdeB18HXgdgB18HXwdgB2EHYAdiB2EHYQdiB2MHYgdkB2MHYwdkB2UHZAdmB2UHZQdmB2cHZgdoB2cHZwdoB2kHaAdqB2kHaQdqB2sHagdsB2sHawdsB20HbAduB20HbQduB28HbgdwB28HbwdwB3EHcAdyB3EHcQdyB3MHcgd0B3MHcwd0B3UHdAd2B3UHdQd2B3cHdgd4B3cHdwd4B3kHeAd6B3kHeQd6B3sHegd8B3sHewd8B30HfAd+B30HfQd+B38HfgeAB38HfweAB4EHgAeCB4EHgQeCB4MHggeEB4MHgweEB4UHhAeGB4UHhQeGB4cHhgeIB4cHhweIB4kHiAeKB4kHiQeKB4sHigeMB4sHiweMB40HjAeOB40HjQeOB48HjgeQB48HjweQB5EHkAeSB5EHkQeSB5MHkgeUB5MHkweUB5UHlAeWB5UHlQeWB5cHlgeYB5cHlweYB5kHmAeaB5kHmQeaB5sHmgecB5sHmwecB50HnAeeB50HnQeeB58HngegB58HnwegB6EHoAeiB6EHoQeiB6MHogekB6MHowekB6UHpAemB6UHpQemB6cHpgeoB6cHpweoB6kHqAeqB6kHqQeqB6sHqgesB6sHqwesB60HrAeuB60HrQeuB68HrgewB68HrwewB7EHsAeyB7EHsQeyB7MHsge0B7MHswe0B7UHtAe2B7UHtQe2B7cHtge4B7cHtwe4B7kHuAe6B7kHuQe6B7sHuge8B7sHuwe8B70HvAe+B70HvQe+B78HvgfAB78HvwfAB8EHwAfCB8EHwQfCB8MHwgfEB8MHwwfEB8UHxAfGB8UHxQfGB8cHxgfIB8cHxwfIB8kHyAfKB8kHyQfKB8sHygfMB8sHywfMB80HzAfOB80HzQfOB88HzgfQB88HzwfQB9EH0AfSB9EH0QfSB9MH0gfUB9MH0wfUB9UH1AfWB9UH1QfWB9cH1gfYB9cH1wfYB9kH2AfaB9kH2QfaB9sH2gfcB9sH2wfcB90H3AfeB90H3QfeB98H3gfgB98H3wfgB+EH4AfiB+EH4QfiB+MH4gfkB+MH4wfkB+UH5AfmB+UH5QfmB+cH5gfoB+cH5wfoB+kH6AfqB+kH6QfqB+sH6gfsB+sH6wfsB+0H7AfuB+0H7QfuB+8H7gfwB+8H7wfwB/EH8AfyB/EH8QfyB/MH8gf0B/MH8wf0B/UH9Af2B/UH9Qf2B/cH9gf4B/cH9wf4B/kH+Af6B/kH+Qf6B/sH+gf8B/sH+wf8B/0H/Af+B/0H/Qf+B/8H/gcACP8H/wcACAEIAAgCCAEIAQgCCAMIAggECAMIAwgECAUIBAgGCAUIBQgGCAcIBggICAcIBwgICAkICAgKCAkICQgKCAsICggMCAsICwgMCA0IDAgOCA0IDQgOCA8IDggQCA8IDwgQCBEIEAgSCBEIEQgSCBMIEggUCBMIEwgUCBUIFAgWCBUIFQgWCBcIFggYCBcIFwgYCBkIGAgaCBkIGQgaCBsIGggcCBsIGwgcCB0IHAgeCB0IHQgeCB8IHgggCB8IHwggCCEIIAgiCCEIIQgiCCMIIggkCCMIIwgkCCUIJAgmCCUIJQgmCCcIJggoCCcIJwgoCCkIKAgqCCkIKQgqCCsIKggsCCsIKwgsCC0ILAguCC0ILQguCC8ILggwCC8ILwgwCDEIMAgyCDEIMQgyCDMIMgg0CDMIMwg0CDUINAg2CDUINQg2CDcINgg4CDcINwg4CDkIOAg6CDkIOQg6CDsIOgg8CDsIOwg8CD0IPAg+CD0IPQg+CD8IPghACD8IPwhACEEIQAhCCEEIQQhCCEMIQghECEMIQwhECEUIRAhGCEUIRQhGCEcIRghICEcIRwhICEkISAhKCEkISQhKCEsISghMCEsISwhMCE0ITAhOCE0ITQhOCE8ITghQCE8ITwhQCFEIUAhSCFEIUQhSCFMIUghUCFMIUwhUCFUIVAhWCFUIVQhWCFcIVghYCFcIVwhYCFkIWAhaCFkIWQhaCFsIWghcCFsIWwhcCF0IXAheCF0IXQheCF8IXghgCF8IXwhgCGEIYAhiCGEIYQhiCGMIYghkCGMIYwhkCGUIZAhmCGUIZQhmCGcIZghoCGcIZwhoCGkIaAhqCGkIaQhqCGsIaghsCGsIawhsCG0IbAhuCG0IbQhuCG8IbghwCG8IbwhwCHEIcAhyCHEIcQhyCHMIcgh0CHMIcwh0CHUIdAh2CHUIdQh2CHcIdgh4CHcIdwh4CHkIeAh6CHkIeQh6CHsIegh8CHsIewh8CH0IfAh+CH0IfQh+CH8IfgiACH8IfwiACIEIgAiCCIEIgQiCCIMIggiECIMIgwiECIUIhAiGCIUIhQiGCIcIhgiICIcIhwiICIkIiAiKCIkIiQiKCIsIigiMCIsIiwiMCI0IjAiOCI0IjQiOCI8IjgiQCI8IjwiQCJEIkAiSCJEIkQiSCJMIkggAAJMIkwgAAAEA"), -"primitive": 3, -"uv_scale": Vector4(0, 0, 0, 0), -"vertex_count": 2196, -"vertex_data": PackedByteArray("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qQmcQRsv3b6xxLTBq2qVQRsv3b7zI6zBX/ScQRsv3b7x37PBYVWWQRsv3b4zP6vBFd+dQRsv3b4x+7LBF0CXQRsv3b5zWqrBy8meQRsv3b5xFrLBRSmYQRsv3b40d6nBMMSfQRsv3b5FIrHBqQ2ZQRsv3b6xkKjBJcKgQRsv3b4RIrDBivGZQRsv3b6jpqfBfa6hQRsv3b5bL6/BLNaaQRsv3b7Qu6bBH5OiQRsv3b6IRK7Bz7qbQRsv3b790KXBwHejQRsv3b63Wa3Bcp+cQRsv3b4q5qTBY1ykQRsv3b7kbqzBE4SdQRsv3b5X+6PBBkGlQRsv3b4PhKvB/3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+//3///wAA/7//f///AAD/v/9///8AAP+/") -}] diff --git a/world/generation/generated_world_region.gd b/world/generation/generated_world_region.gd index 9c7568d..6ba1786 100644 --- a/world/generation/generated_world_region.gd +++ b/world/generation/generated_world_region.gd @@ -126,7 +126,6 @@ const FOLIAGE_WIND_SOURCE_MATERIALS_META: StringName = ( @onready var _diggable_beach: DiggableArea3D = %DiggableBeach @onready var _ocean: WaterBodyAuthoring = %OceanWater @onready var _fresh_water_root: Node3D = %FreshWaterBodies -@onready var _shoreline_reference: MeshInstance3D = %ShorelineReference var _current_seed := PlayerSaveManager.DEFAULT_WORLD_SEED var _light_performance_profile := false @@ -146,7 +145,6 @@ func _ready() -> void: _validate_prop_catalog() _validate_biome_catalog() _configure_static_water() - _build_shoreline_reference() _set_foliage_wind_enabled(not _light_performance_profile) @@ -199,10 +197,6 @@ func get_rv_upgrade_shop() -> RVUpgradeInteractionType: return _rv_upgrade_shop -func get_saltwater_shoreline_mesh() -> MeshInstance3D: - return _shoreline_reference - - func get_prop_catalog() -> TerrainPropCatalog: return prop_catalog @@ -218,10 +212,13 @@ func get_biome_at(coordinate: Vector2i) -> StringName: func set_light_performance_profile(enabled: bool) -> void: _light_performance_profile = enabled _set_foliage_wind_enabled(not enabled) - _apply_water_materials() var surface_motion := _get_ocean_surface_motion() if surface_motion != null: - surface_motion.set_motion_enabled(not enabled) + # Reset the old shader material before _apply_water_materials() swaps it. + surface_motion.set_motion_enabled(false) + _apply_water_materials() + if surface_motion != null and not enabled: + surface_motion.set_motion_enabled(true) func set_foliage_wind_strength_multiplier(multiplier: float) -> void: @@ -1921,42 +1918,6 @@ func _add_prop_collision( body.add_child(collision) -func _build_shoreline_reference() -> void: - var half := get_playable_half_extents() - var width := 0.05 - var vertices := PackedVector3Array() - var indices := PackedInt32Array() - var corners := [ - Vector3(-half.x, WATER_HEIGHT, -half.y), - Vector3(half.x, WATER_HEIGHT, -half.y), - Vector3(half.x, WATER_HEIGHT, half.y), - Vector3(-half.x, WATER_HEIGHT, half.y), - ] - for index: int in 4: - var start: Vector3 = corners[index] - var finish: Vector3 = corners[(index + 1) % 4] - var direction := (finish - start).normalized() - var perpendicular := Vector3(-direction.z, 0.0, direction.x) * width - var base := vertices.size() - vertices.append_array(PackedVector3Array([ - start - perpendicular, - start + perpendicular, - finish + perpendicular, - finish - perpendicular, - ])) - indices.append_array(PackedInt32Array([ - base, base + 1, base + 2, - base, base + 2, base + 3, - ])) - var arrays := [] - arrays.resize(Mesh.ARRAY_MAX) - arrays[Mesh.ARRAY_VERTEX] = vertices - arrays[Mesh.ARRAY_INDEX] = indices - var mesh := ArrayMesh.new() - mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays) - _shoreline_reference.mesh = mesh - - func _append_surface_triangles( result: Array[PackedVector3Array], mesh_instance: MeshInstance3D, diff --git a/world/generation/generated_world_region.tscn b/world/generation/generated_world_region.tscn index b4b3dba..03446a0 100644 --- a/world/generation/generated_world_region.tscn +++ b/world/generation/generated_world_region.tscn @@ -112,8 +112,3 @@ unique_name_in_owner = true [node name="Decorations" type="Node3D" parent="."] unique_name_in_owner = true - -[node name="ShorelineReference" type="MeshInstance3D" parent="."] -unique_name_in_owner = true -visible = false -cast_shadow = 0 diff --git a/world/materials/shoreline_tide.gdshader b/world/materials/shoreline_tide.gdshader deleted file mode 100644 index f8a58e0..0000000 --- a/world/materials/shoreline_tide.gdshader +++ /dev/null @@ -1,71 +0,0 @@ -shader_type spatial; -render_mode blend_mix, depth_draw_never, cull_disabled, unshaded; - -uniform vec4 lead_color : source_color = vec4(0.780, 0.960, 0.930, 1.0); -uniform vec4 trail_color : source_color = vec4(0.500, 0.840, 0.820, 1.0); -uniform float ribbon_width : hint_range(0.2, 2.0, 0.01) = 1.35; -uniform float land_inset : hint_range(0.0, 0.4, 0.01) = 0.12; -uniform float tide_speed : hint_range(0.1, 3.0, 0.01) = 1.42; -uniform float tide_distance : hint_range(0.0, 0.6, 0.01) = 0.42; -uniform float lead_width : hint_range(0.01, 0.2, 0.005) = 0.14; -uniform float trail_width : hint_range(0.02, 0.4, 0.005) = 0.32; -uniform float lead_strength : hint_range(0.0, 1.0, 0.01) = 0.88; -uniform float trail_strength : hint_range(0.0, 1.0, 0.01) = 0.52; -uniform float phase_scale : hint_range(0.001, 0.2, 0.001) = 0.035; -uniform float phase_strength : hint_range(0.0, 2.0, 0.01) = 0.55; - -varying vec3 world_position; - - -float hash_21(vec2 point) { - return fract(sin(dot(point, vec2(127.1, 311.7))) * 43758.5453); -} - - -float value_noise(vec2 point) { - vec2 cell = floor(point); - vec2 local = fract(point); - vec2 blend = local * local * (3.0 - 2.0 * local); - float bottom = mix(hash_21(cell), hash_21(cell + vec2(1.0, 0.0)), blend.x); - float top = mix( - hash_21(cell + vec2(0.0, 1.0)), - hash_21(cell + vec2(1.0, 1.0)), - blend.x - ); - return mix(bottom, top, blend.y); -} - - -float soft_line(float coordinate, float center, float width) { - float normalized_width = max(width / ribbon_width, 0.001); - float derivative_width = min(fwidth(coordinate) * 1.25, normalized_width * 0.65); - return 1.0 - smoothstep( - max(normalized_width * 0.25 - derivative_width, 0.0), - normalized_width + derivative_width, - abs(coordinate - center) - ); -} - - -void vertex() { - world_position = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz; -} - - -void fragment() { - float phase = ( - value_noise(world_position.xz * phase_scale) * 2.0 - 1.0 - ) * phase_strength; - float ebb = sin(TIME * tide_speed + phase) * 0.5 + 0.5; - float shoreline = land_inset / ribbon_width; - float lead_position = shoreline + ebb * tide_distance / ribbon_width; - float trail_position = lead_position + max(tide_distance * 0.72, 0.10) / ribbon_width; - float lead = soft_line(UV.y, lead_position, lead_width); - float trail = soft_line(UV.y, trail_position, trail_width); - float edge_fade = smoothstep(0.0, 0.055, UV.y) * (1.0 - smoothstep(0.90, 1.0, UV.y)); - float lead_alpha = lead * lead_strength; - float trail_alpha = trail * trail_strength; - float combined_alpha = max(lead_alpha, trail_alpha) * edge_fade; - ALBEDO = mix(trail_color.rgb, lead_color.rgb, lead_alpha); - ALPHA = combined_alpha; -} diff --git a/world/materials/shoreline_tide.gdshader.uid b/world/materials/shoreline_tide.gdshader.uid deleted file mode 100644 index e8e5d36..0000000 --- a/world/materials/shoreline_tide.gdshader.uid +++ /dev/null @@ -1 +0,0 @@ -uid://5dauni8hb2lv diff --git a/world/materials/shoreline_tide.tres b/world/materials/shoreline_tide.tres deleted file mode 100644 index 65d2fa8..0000000 --- a/world/materials/shoreline_tide.tres +++ /dev/null @@ -1,19 +0,0 @@ -[gd_resource type="ShaderMaterial" load_steps=2 format=3] - -[ext_resource type="Shader" path="res://world/materials/shoreline_tide.gdshader" id="1_shader"] - -[resource] -render_priority = 1 -shader = ExtResource("1_shader") -shader_parameter/lead_color = Color(0.78, 0.96, 0.93, 1) -shader_parameter/trail_color = Color(0.5, 0.84, 0.82, 1) -shader_parameter/ribbon_width = 1.35 -shader_parameter/land_inset = 0.12 -shader_parameter/tide_speed = 1.42 -shader_parameter/tide_distance = 0.42 -shader_parameter/lead_width = 0.14 -shader_parameter/trail_width = 0.32 -shader_parameter/lead_strength = 0.88 -shader_parameter/trail_strength = 0.52 -shader_parameter/phase_scale = 0.035 -shader_parameter/phase_strength = 0.55 diff --git a/world/materials/stylized_water.gdshader b/world/materials/stylized_water.gdshader index 669f649..61e5622 100644 --- a/world/materials/stylized_water.gdshader +++ b/world/materials/stylized_water.gdshader @@ -1,35 +1,27 @@ shader_type spatial; render_mode blend_mix, depth_draw_never, cull_back, unshaded, fog_disabled; +// Use one depth sample directly behind this water pixel. Do not turn this into +// a neighbourhood filter: samples from adjacent cliff faces are what caused +// the former wedges and folding at corners. uniform sampler2D depth_texture : hint_depth_texture, repeat_disable, filter_nearest; uniform vec4 shore_color : source_color = vec4(0.475, 0.788, 0.796, 1.0); uniform vec4 shallow_color : source_color = vec4(0.227, 0.604, 0.663, 1.0); uniform vec4 deep_color : source_color = vec4(0.110, 0.345, 0.435, 1.0); -uniform vec4 tide_wash_color : source_color = vec4(0.360, 0.720, 0.735, 1.0); +uniform vec4 shoreline_foam_color : source_color = vec4(0.580, 0.850, 0.860, 1.0); uniform float shallow_depth : hint_range(0.1, 3.0, 0.01) = 0.70; uniform float deep_depth : hint_range(0.5, 12.0, 0.05) = 3.60; -uniform float shore_depth_width : hint_range(0.02, 1.0, 0.01) = 0.16; uniform float shore_alpha : hint_range(0.1, 1.0, 0.01) = 0.44; uniform float shallow_alpha : hint_range(0.1, 1.0, 0.01) = 0.60; uniform float deep_alpha : hint_range(0.1, 1.0, 0.01) = 0.82; -uniform bool tide_effect_enabled = true; -uniform float tide_speed : hint_range(0.1, 3.0, 0.01) = 1.42; -uniform float tide_distance : hint_range(0.0, 0.6, 0.01) = 0.30; -uniform float tide_wash_width : hint_range(0.05, 1.0, 0.01) = 0.38; -uniform float tide_wash_strength : hint_range(0.0, 0.3, 0.01) = 0.11; -uniform float tide_wash_alpha_shift : hint_range(0.0, 0.15, 0.005) = 0.045; - -uniform float phase_noise_scale : hint_range(0.001, 0.5, 0.001) = 0.055; -uniform float phase_noise_strength : hint_range(0.0, 2.0, 0.01) = 0.68; -uniform float contour_corner_variation : hint_range(0.0, 0.15, 0.005) = 0.045; -uniform float contour_smoothing_pixels : hint_range(0.0, 2.5, 0.05) = 1.0; -uniform float contour_smoothing_strength : hint_range(0.0, 1.0, 0.01) = 0.72; -uniform float contour_depth_reject : hint_range(0.05, 2.0, 0.01) = 0.60; -uniform float shoreline_horizontal_reach : hint_range(0.05, 1.5, 0.01) = 0.32; +// WaterSurfaceMotion supplies the inverse of its visual bob here. Shore +// coloration and foam therefore use the physical waterline rather than a +// surface that moves a few centimetres through the terrain every frame. +uniform float stable_surface_height_offset = 0.0; uniform float contact_fade_depth : hint_range(0.0, 0.1, 0.001) = 0.018; uniform float open_water_drift_scale : hint_range(0.001, 0.3, 0.001) = 0.018; uniform vec2 open_water_drift_speed = vec2(0.010, -0.007); @@ -41,14 +33,17 @@ uniform float surface_mark_strength : hint_range(0.0, 0.3, 0.005) = 0.12; uniform float surface_mottle_scale : hint_range(0.01, 1.0, 0.01) = 0.11; uniform vec2 surface_mottle_speed = vec2(-0.018, 0.013); uniform float surface_mottle_strength : hint_range(0.0, 0.2, 0.005) = 0.07; +uniform float shoreline_foam_speed : hint_range(0.1, 3.0, 0.01) = 1.42; +uniform float shoreline_foam_phase_noise_scale : hint_range(0.001, 0.5, 0.001) = 0.055; +uniform float shoreline_foam_phase_noise_strength : hint_range(0.0, 2.0, 0.01) = 0.68; uniform vec2 shoreline_mark_density = vec2(4.60, 3.20); uniform vec2 shoreline_mark_drift = vec2(0.085, -0.060); -uniform float shoreline_mark_depth : hint_range(0.1, 2.0, 0.01) = 0.95; -uniform float shoreline_mark_strength : hint_range(0.0, 1.0, 0.01) = 0.82; -uniform float shoreline_base_fill : hint_range(0.0, 1.0, 0.01) = 0.32; -uniform float shoreline_opacity_boost : hint_range(0.0, 0.5, 0.01) = 0.26; +uniform float shoreline_foam_depth : hint_range(0.1, 2.0, 0.01) = 0.55; +uniform float shoreline_foam_strength : hint_range(0.0, 1.0, 0.01) = 0.95; +uniform float shoreline_base_fill : hint_range(0.0, 1.0, 0.01) = 0.58; +uniform float shoreline_opacity_boost : hint_range(0.0, 0.5, 0.01) = 0.38; uniform float surface_highlight_night_floor : hint_range(0.0, 1.0, 0.01) = 0.72; -uniform float shoreline_minimum_reach : hint_range(0.1, 1.0, 0.01) = 0.48; +uniform float shoreline_minimum_reach : hint_range(0.1, 1.0, 0.01) = 0.22; uniform float distant_alpha_start : hint_range(10.0, 2000.0, 1.0) = 260.0; uniform float distant_alpha_end : hint_range(20.0, 5000.0, 1.0) = 1400.0; @@ -171,40 +166,6 @@ vec3 reconstruct_world_position( } -float sample_water_depth( - vec2 screen_uv, - float water_surface_height, - mat4 inverse_projection, - mat4 inverse_view -) { - float raw_depth = texture(depth_texture, screen_uv).r; - vec3 scene_world_position = reconstruct_world_position( - screen_uv, - raw_depth, - inverse_projection, - inverse_view - ); - return water_surface_height - scene_world_position.y; -} - - -float contour_neighbor_weight( - float center_depth, - float neighbor_depth, - float rejection_distance -) { - if (neighbor_depth <= 0.0) { - return 0.0; - } - float safe_rejection = max(rejection_distance, 0.001); - return 1.0 - smoothstep( - safe_rejection * 0.35, - safe_rejection, - abs(neighbor_depth - center_depth) - ); -} - - void vertex() { vec4 world_vertex = MODEL_MATRIX * vec4(VERTEX, 1.0); vec4 view_vertex = VIEW_MATRIX * world_vertex; @@ -221,151 +182,32 @@ void vertex() { void fragment() { float raw_depth = texture(depth_texture, SCREEN_UV).r; - vec3 scene_world_position = reconstruct_world_position( - SCREEN_UV, - raw_depth, - INV_PROJECTION_MATRIX, - INV_VIEW_MATRIX - ); - float water_depth = max(world_position.y - scene_world_position.y, 0.0); - water_depth = min(water_depth, deep_depth * 4.0); - - float contour_depth = water_depth; - float contour_feature_support = 1.0; - if (tide_effect_enabled) { - vec2 contour_texel = ( - vec2(1.0) / vec2(textureSize(depth_texture, 0)) - * contour_smoothing_pixels - ); - float contour_depth_sum = water_depth; - float contour_weight_sum = 1.0; - float left_depth = sample_water_depth( - SCREEN_UV - vec2(contour_texel.x, 0.0), - world_position.y, - INV_PROJECTION_MATRIX, - INV_VIEW_MATRIX - ); - float right_depth = sample_water_depth( - SCREEN_UV + vec2(contour_texel.x, 0.0), - world_position.y, - INV_PROJECTION_MATRIX, - INV_VIEW_MATRIX - ); - float upper_depth = sample_water_depth( - SCREEN_UV - vec2(0.0, contour_texel.y), - world_position.y, - INV_PROJECTION_MATRIX, - INV_VIEW_MATRIX - ); - float lower_depth = sample_water_depth( - SCREEN_UV + vec2(0.0, contour_texel.y), - world_position.y, - INV_PROJECTION_MATRIX, - INV_VIEW_MATRIX - ); - float upper_left_depth = sample_water_depth( - SCREEN_UV - contour_texel, - world_position.y, - INV_PROJECTION_MATRIX, - INV_VIEW_MATRIX - ); - float upper_right_depth = sample_water_depth( - SCREEN_UV + vec2(contour_texel.x, -contour_texel.y), - world_position.y, - INV_PROJECTION_MATRIX, - INV_VIEW_MATRIX - ); - float lower_left_depth = sample_water_depth( - SCREEN_UV + vec2(-contour_texel.x, contour_texel.y), - world_position.y, - INV_PROJECTION_MATRIX, - INV_VIEW_MATRIX - ); - float lower_right_depth = sample_water_depth( - SCREEN_UV + contour_texel, - world_position.y, - INV_PROJECTION_MATRIX, - INV_VIEW_MATRIX - ); - float left_weight = contour_neighbor_weight( - water_depth, left_depth, contour_depth_reject - ); - float right_weight = contour_neighbor_weight( - water_depth, right_depth, contour_depth_reject - ); - float upper_weight = contour_neighbor_weight( - water_depth, upper_depth, contour_depth_reject - ); - float lower_weight = contour_neighbor_weight( - water_depth, lower_depth, contour_depth_reject - ); - float diagonal_scale = 0.70710678; - float upper_left_weight = contour_neighbor_weight( - water_depth, upper_left_depth, contour_depth_reject - ) * diagonal_scale; - float upper_right_weight = contour_neighbor_weight( - water_depth, upper_right_depth, contour_depth_reject - ) * diagonal_scale; - float lower_left_weight = contour_neighbor_weight( - water_depth, lower_left_depth, contour_depth_reject - ) * diagonal_scale; - float lower_right_weight = contour_neighbor_weight( - water_depth, lower_right_depth, contour_depth_reject - ) * diagonal_scale; - contour_depth_sum += left_depth * left_weight; - contour_depth_sum += right_depth * right_weight; - contour_depth_sum += upper_depth * upper_weight; - contour_depth_sum += lower_depth * lower_weight; - contour_depth_sum += upper_left_depth * upper_left_weight; - contour_depth_sum += upper_right_depth * upper_right_weight; - contour_depth_sum += lower_left_depth * lower_left_weight; - contour_depth_sum += lower_right_depth * lower_right_weight; - float neighbor_support = ( - left_weight - + right_weight - + upper_weight - + lower_weight - + upper_left_weight - + upper_right_weight - + lower_left_weight - + lower_right_weight - ); - contour_weight_sum += neighbor_support; - float smoothed_contour_depth = contour_depth_sum / contour_weight_sum; - contour_depth = mix( - water_depth, - smoothed_contour_depth, - contour_smoothing_strength - ); - contour_feature_support = smoothstep(0.75, 1.75, neighbor_support); + // The ocean is a single flat surface. Its visible surf must not be inferred + // from neighbouring depth-buffer pixels: that is camera dependent at cliffs + // and corners, and previously created flickering triangular shoreline masks. + // Use only the terrain sample directly behind this pixel for depth coloration + // and foam. Clear depth is sky/open water, not an imaginary zero-depth shore. + bool has_scene_depth = raw_depth < 0.99999; + float water_depth = deep_depth * 4.0; + if (has_scene_depth) { + vec3 scene_world_position = reconstruct_world_position( + SCREEN_UV, + raw_depth, + INV_PROJECTION_MATRIX, + INV_VIEW_MATRIX + ); + float stable_surface_height = ( + world_position.y + stable_surface_height_offset + ); + water_depth = max(stable_surface_height - scene_world_position.y, 0.0); } - - vec2 scene_world_dx = dFdx(scene_world_position.xz); - vec2 scene_world_dy = dFdy(scene_world_position.xz); - float horizontal_dx = max(length(scene_world_dx), 0.0001); - float horizontal_dy = max(length(scene_world_dy), 0.0001); - float depth_gradient = length(vec2( - dFdx(water_depth) / horizontal_dx, - dFdy(water_depth) / horizontal_dy - )); - float estimated_shore_distance = min( - water_depth / max(depth_gradient, 0.001), - shoreline_horizontal_reach * 4.0 - ); - float proximity_center = shoreline_horizontal_reach * 0.86; - float proximity_filter_width = max( - fwidth(estimated_shore_distance) * 1.5, - shoreline_horizontal_reach * 0.12 - ); - float shoreline_proximity = 1.0 - smoothstep( - max(proximity_center - proximity_filter_width, 0.0), - proximity_center + proximity_filter_width, - estimated_shore_distance - ); - float contact_filter_width = max(fwidth(water_depth) * 1.5, 0.004); + water_depth = min(water_depth, deep_depth * 4.0); + // A very thin alpha threshold is visibly unstable at oblique angles, even + // with a correct centre depth sample. Blend the final contact over a broad, + // fixed physical range rather than toggling it across a single screen pixel. float contact_stability = smoothstep( - max(contact_fade_depth - contact_filter_width, 0.0), - contact_fade_depth + contact_filter_width, + 0.0, + max(contact_fade_depth, 0.10), water_depth ); @@ -376,36 +218,67 @@ void fragment() { float water_alpha = mix(shore_alpha, shallow_alpha, shallow_mix); water_alpha = mix(water_alpha, deep_alpha, deep_mix); - if (tide_effect_enabled) { - vec2 phase_coordinates = world_position.xz * phase_noise_scale; - float phase_variation = ( - value_noise(phase_coordinates) - + value_noise(phase_coordinates * 0.47 + vec2(9.7, 3.1)) * 0.5 - - 0.75 - ) * phase_noise_strength; - float corner_variation = ( - value_noise(phase_coordinates * 1.73 + vec2(4.2, 13.6)) * 2.0 - 1.0 - ) * contour_corner_variation; - float ebb = sin(TIME * tide_speed + phase_variation) * 0.5 + 0.5; - float lead_threshold = shore_depth_width + ebb * tide_distance + corner_variation; - float tide_wash = 1.0 - smoothstep( - lead_threshold, - lead_threshold + max(tide_wash_width, 0.001), - contour_depth - ); - tide_wash *= contour_feature_support; - tide_wash *= shoreline_proximity; - tide_wash *= 1.0 - smoothstep(shallow_depth, deep_depth, water_depth); - water_color = mix( - water_color, - tide_wash_color.rgb, - tide_wash * tide_wash_strength - ); - water_alpha = min( - water_alpha - + tide_wash * tide_wash_alpha_shift, - 0.96 - ); + // Foam is driven by the exact same stable, one-pixel terrain depth as the + // base shoreline. Its breakup pattern lives in world coordinates, so camera + // motion cannot bend, fold, or slide it across unrelated terrain at corners. + float shoreline_foam = 0.0; + if (has_scene_depth) { + vec2 phase_coordinates = ( + world_position.xz * shoreline_foam_phase_noise_scale + ); + float shoreline_phase = ( + value_noise(phase_coordinates) + + value_noise( + phase_coordinates * 0.47 + vec2(9.7, 3.1) + ) * 0.5 + - 0.75 + ) * shoreline_foam_phase_noise_strength; + float shoreline_cycle = ( + sin(TIME * shoreline_foam_speed + shoreline_phase) * 0.5 + 0.5 + ); + float animated_shoreline_depth = shoreline_foam_depth * mix( + shoreline_minimum_reach, + 1.0, + shoreline_cycle + ); + float shoreline_mask = 1.0 - smoothstep( + max(animated_shoreline_depth * 0.08, 0.01), + max(animated_shoreline_depth, 0.02), + water_depth + ); + shoreline_mask *= 1.0 - smoothstep( + shallow_depth, + deep_depth, + water_depth + ); + float shoreline_marks = max( + blocky_mark_layer( + world_position.xz * shoreline_mark_density + + TIME * shoreline_mark_drift, + 17.0, + 0.04 + ), + blocky_mark_layer( + world_position.xz * shoreline_mark_density * 1.37 + - TIME * shoreline_mark_drift.yx * 0.73, + 41.0, + 0.08 + ) + ); + shoreline_foam = shoreline_mask * mix( + shoreline_base_fill, + 1.0, + shoreline_marks + ); + water_color = mix( + water_color, + shoreline_foam_color.rgb, + shoreline_foam * shoreline_foam_strength + ); + water_alpha = min( + water_alpha + shoreline_foam * shoreline_opacity_boost, + 0.98 + ); } vec2 flowing_grid = ( @@ -464,57 +337,6 @@ void fragment() { surface_mark * surface_mark_strength * mark_visibility ); - vec2 shoreline_phase_coordinates = world_position.xz * phase_noise_scale; - float shoreline_phase = ( - value_noise(shoreline_phase_coordinates) - + value_noise( - shoreline_phase_coordinates * 0.47 + vec2(9.7, 3.1) - ) * 0.5 - - 0.75 - ) * phase_noise_strength; - float shoreline_cycle = ( - sin(TIME * tide_speed + shoreline_phase) * 0.5 + 0.5 - ); - float animated_shoreline_depth = shoreline_mark_depth * mix( - shoreline_minimum_reach, - 1.0, - shoreline_cycle - ); - float shoreline_mask = 1.0 - smoothstep( - max(animated_shoreline_depth * 0.08, 0.01), - max(animated_shoreline_depth, 0.02), - contour_depth - ); - float shoreline_depth_visibility = 1.0 - smoothstep( - shallow_depth, - deep_depth, - water_depth - ); - shoreline_mask *= shoreline_depth_visibility; - float shoreline_marks = max( - blocky_mark_layer( - world_position.xz * shoreline_mark_density - + TIME * shoreline_mark_drift, - 17.0, - 0.04 - ), - blocky_mark_layer( - world_position.xz * shoreline_mark_density * 1.37 - - TIME * shoreline_mark_drift.yx * 0.73, - 41.0, - 0.08 - ) - ); - float shoreline_foam = shoreline_mask * mix( - shoreline_base_fill, - 1.0, - shoreline_marks - ); - shoreline_foam *= shoreline_proximity; - water_alpha = min( - water_alpha + shoreline_foam * shoreline_opacity_boost, - 0.98 - ); // Keep the water tint visually continuous across authored terrain contact. // Fully fading here exposes the raised sand edge as a broken tan seam; the // fishing resolver, rather than this presentation shader, owns castability. @@ -551,7 +373,7 @@ void fragment() { ); float visible_highlight = max( surface_highlight, - shoreline_foam * shoreline_mark_strength + shoreline_foam * shoreline_foam_strength ); water_color = mix( water_color, diff --git a/world/materials/stylized_water.tres b/world/materials/stylized_water.tres index 7f4671a..ae99df2 100644 --- a/world/materials/stylized_water.tres +++ b/world/materials/stylized_water.tres @@ -8,26 +8,12 @@ shader = ExtResource("1_water_shader") shader_parameter/shore_color = Color(0.47451, 0.788235, 0.796078, 1) shader_parameter/shallow_color = Color(0.227451, 0.603922, 0.662745, 1) shader_parameter/deep_color = Color(0.109804, 0.345098, 0.435294, 1) -shader_parameter/tide_wash_color = Color(0.360784, 0.721569, 0.733333, 1) +shader_parameter/shoreline_foam_color = Color(0.580392, 0.85098, 0.858824, 1) shader_parameter/shallow_depth = 0.7 shader_parameter/deep_depth = 3.6 -shader_parameter/shore_depth_width = 0.1 shader_parameter/shore_alpha = 0.68 shader_parameter/shallow_alpha = 0.78 shader_parameter/deep_alpha = 0.9 -shader_parameter/tide_effect_enabled = true -shader_parameter/tide_speed = 1.42 -shader_parameter/tide_distance = 0.11 -shader_parameter/tide_wash_width = 0.16 -shader_parameter/tide_wash_strength = 0.11 -shader_parameter/tide_wash_alpha_shift = 0.045 -shader_parameter/phase_noise_scale = 0.055 -shader_parameter/phase_noise_strength = 0.68 -shader_parameter/contour_corner_variation = 0.025 -shader_parameter/contour_smoothing_pixels = 1.35 -shader_parameter/contour_smoothing_strength = 0.88 -shader_parameter/contour_depth_reject = 0.6 -shader_parameter/shoreline_horizontal_reach = 0.32 shader_parameter/contact_fade_depth = 0.018 shader_parameter/open_water_drift_scale = 0.018 shader_parameter/open_water_drift_speed = Vector2(0.01, -0.007) @@ -39,10 +25,13 @@ shader_parameter/surface_mark_strength = 0.12 shader_parameter/surface_mottle_scale = 0.11 shader_parameter/surface_mottle_speed = Vector2(-0.018, 0.013) shader_parameter/surface_mottle_strength = 0.07 +shader_parameter/shoreline_foam_speed = 1.42 +shader_parameter/shoreline_foam_phase_noise_scale = 0.055 +shader_parameter/shoreline_foam_phase_noise_strength = 0.68 shader_parameter/shoreline_mark_density = Vector2(4.6, 3.2) shader_parameter/shoreline_mark_drift = Vector2(0.085, -0.06) -shader_parameter/shoreline_mark_depth = 0.55 -shader_parameter/shoreline_mark_strength = 0.95 +shader_parameter/shoreline_foam_depth = 0.55 +shader_parameter/shoreline_foam_strength = 0.95 shader_parameter/shoreline_base_fill = 0.58 shader_parameter/shoreline_opacity_boost = 0.38 shader_parameter/surface_highlight_night_floor = 0.72 diff --git a/world/materials/stylized_water_fresh.tres b/world/materials/stylized_water_fresh.tres index 5fe4c8f..07bbfd3 100644 --- a/world/materials/stylized_water_fresh.tres +++ b/world/materials/stylized_water_fresh.tres @@ -8,26 +8,12 @@ shader = ExtResource("1_water_shader") shader_parameter/shore_color = Color(0.47451, 0.788235, 0.796078, 1) shader_parameter/shallow_color = Color(0.227451, 0.603922, 0.662745, 1) shader_parameter/deep_color = Color(0.109804, 0.345098, 0.435294, 1) -shader_parameter/tide_wash_color = Color(0.360784, 0.721569, 0.733333, 1) +shader_parameter/shoreline_foam_color = Color(0.580392, 0.85098, 0.858824, 1) shader_parameter/shallow_depth = 0.7 shader_parameter/deep_depth = 3.6 -shader_parameter/shore_depth_width = 0.1 shader_parameter/shore_alpha = 0.68 shader_parameter/shallow_alpha = 0.78 shader_parameter/deep_alpha = 0.9 -shader_parameter/tide_effect_enabled = false -shader_parameter/tide_speed = 1.42 -shader_parameter/tide_distance = 0.3 -shader_parameter/tide_wash_width = 0.38 -shader_parameter/tide_wash_strength = 0.11 -shader_parameter/tide_wash_alpha_shift = 0.045 -shader_parameter/phase_noise_scale = 0.055 -shader_parameter/phase_noise_strength = 0.68 -shader_parameter/contour_corner_variation = 0.045 -shader_parameter/contour_smoothing_pixels = 1.35 -shader_parameter/contour_smoothing_strength = 0.88 -shader_parameter/contour_depth_reject = 0.6 -shader_parameter/shoreline_horizontal_reach = 0.32 shader_parameter/contact_fade_depth = 0.018 shader_parameter/open_water_drift_scale = 0.018 shader_parameter/open_water_drift_speed = Vector2(0.01, -0.007) @@ -39,10 +25,13 @@ shader_parameter/surface_mark_strength = 0.12 shader_parameter/surface_mottle_scale = 0.11 shader_parameter/surface_mottle_speed = Vector2(-0.018, 0.013) shader_parameter/surface_mottle_strength = 0.07 +shader_parameter/shoreline_foam_speed = 1.42 +shader_parameter/shoreline_foam_phase_noise_scale = 0.055 +shader_parameter/shoreline_foam_phase_noise_strength = 0.68 shader_parameter/shoreline_mark_density = Vector2(4.6, 3.2) shader_parameter/shoreline_mark_drift = Vector2(0.085, -0.06) -shader_parameter/shoreline_mark_depth = 0.55 -shader_parameter/shoreline_mark_strength = 0.95 +shader_parameter/shoreline_foam_depth = 0.55 +shader_parameter/shoreline_foam_strength = 0.95 shader_parameter/shoreline_base_fill = 0.58 shader_parameter/shoreline_opacity_boost = 0.38 shader_parameter/surface_highlight_night_floor = 0.72 diff --git a/world/rain_puddle_presentation.gd b/world/rain_puddle_presentation.gd new file mode 100644 index 0000000..82c2a39 --- /dev/null +++ b/world/rain_puddle_presentation.gd @@ -0,0 +1,645 @@ +class_name RainPuddlePresentation +extends Node3D + +## Client-only rain puddles. These are deliberately visual-only: they have no +## collision, water-region, fishing, persistence, or networking components. + +const PUDDLE_SURFACE_MATERIALS: Array[StringName] = [ + &"grass_lite", + &"grass", + &"sand", +] +const TERRAIN_COLLISION_MASK: int = 1 +const MAX_PUDDLES: int = 14 +const SURFACE_CELL_SIZE: float = 8.0 +const SURFACE_SEARCH_CELL_RADIUS: int = 3 +const SURFACE_CLEARANCE_ABOVE_WATER: float = 0.08 +const MINIMUM_SURFACE_UP_DOT: float = 0.985 +const MINIMUM_PLAYER_DISTANCE: float = 2.5 +const MAXIMUM_PLAYER_DISTANCE: float = 17.0 +const RELEASE_DISTANCE: float = 23.0 +# Puddle radius is intentionally generous: the presentation should read from +# the normal gameplay camera rather than as tiny ground specks. +const MINIMUM_PUDDLE_RADIUS: float = 0.78 +const MAXIMUM_PUDDLE_RADIUS: float = 2.76 +const MINIMUM_PUDDLE_SPACING: float = 4.35 +const MAXIMUM_PLAYER_HEIGHT_OFFSET: float = 1.0 +const SPAWN_INTERVAL_SECONDS: float = 0.18 +const FADE_IN_ALPHA_PER_SECOND: float = 0.85 +const FADE_OUT_ALPHA_PER_SECOND: float = 0.055 +const SPLASH_COOLDOWN_SECONDS: float = 0.34 +const SPLASH_COLOR := Color(0.42, 0.76, 0.80, 0.92) +const PUDDLE_COLOR := Color(0.055, 0.18, 0.225, 0.42) + + +class PuddleState: + var visual: MeshInstance3D + var material: StandardMaterial3D + var center: Vector3 = Vector3.ZERO + var radii: Vector2 = Vector2.ONE + var rotation_y: float = 0.0 + var alpha: float = 0.0 + var active: bool = false + var player_was_inside: bool = false + var splash_cooldown: float = 0.0 + + +var _test_world: TestWorld +var _weather_service: WorldWeatherService +var _local_player: Player +var _light_performance_profile: bool = false +var _is_active: bool = false +var _suppressed: bool = false +var _surface_cache_ready: bool = false +var _surface_triangles: Array[PackedVector3Array] = [] +var _surface_triangle_indices_by_cell: Dictionary = {} +var _puddles: Array[PuddleState] = [] +var _random := RandomNumberGenerator.new() +var _spawn_accumulator: float = 0.0 +var _player_was_grounded: bool = false +var _visual_root: Node3D +var _splash_root: Node3D +var _puddle_mesh: CylinderMesh + + +func _ready() -> void: + set_process(false) + + +func _exit_tree() -> void: + if ( + _weather_service != null + and _weather_service.weather_changed.is_connected( + _on_weather_changed + ) + ): + _weather_service.weather_changed.disconnect(_on_weather_changed) + + +func configure( + test_world: TestWorld, + weather_service: WorldWeatherService, + local_player: Player, + light_performance_profile: bool, +) -> void: + if ( + _weather_service != null + and _weather_service.weather_changed.is_connected( + _on_weather_changed + ) + ): + _weather_service.weather_changed.disconnect(_on_weather_changed) + _test_world = test_world + _weather_service = weather_service + _local_player = local_player + _light_performance_profile = light_performance_profile + _random.seed = _seed_for_world() + if ( + _weather_service != null + and not _weather_service.weather_changed.is_connected( + _on_weather_changed + ) + ): + _weather_service.weather_changed.connect(_on_weather_changed) + if not _light_performance_profile: + _prepare_visual_pool() + refresh_world() + _refresh_processing() + + +func set_active(active: bool) -> void: + if _is_active == active: + return + _is_active = active + if not _is_active: + _clear_puddles() + _refresh_processing() + + +func set_suppressed(suppressed: bool) -> void: + if _suppressed == suppressed: + return + _suppressed = suppressed + if _suppressed: + _clear_puddles() + _refresh_processing() + + +func refresh_world() -> void: + _surface_cache_ready = false + _surface_triangles.clear() + _surface_triangle_indices_by_cell.clear() + _spawn_accumulator = 0.0 + _player_was_grounded = false + _random.seed = _seed_for_world() + _clear_puddles() + _refresh_processing() + + +func is_light_performance_profile() -> bool: + return _light_performance_profile + + +func get_active_puddle_count() -> int: + var count: int = 0 + for puddle: PuddleState in _puddles: + if puddle.active and puddle.alpha > 0.0: + count += 1 + return count + + +func _process(delta: float) -> void: + if not _can_present_puddles(): + return + var player_position: Vector3 = _local_player.global_position + var is_raining: bool = _weather_service.is_raining() + if is_raining: + _ensure_surface_cache() + _release_distant_puddles(player_position) + _fade_puddles_in(delta) + _spawn_accumulator += delta + while _spawn_accumulator >= SPAWN_INTERVAL_SECONDS: + _spawn_accumulator -= SPAWN_INTERVAL_SECONDS + if not _spawn_puddle_near(player_position): + break + else: + _fade_puddles_out(delta) + _update_player_splashes(player_position, delta) + _refresh_processing() + + +func _on_weather_changed( + _weather: WorldWeatherService.Weather, + _seconds_remaining: float, +) -> void: + if _weather_service != null and _weather_service.is_raining(): + _spawn_accumulator = SPAWN_INTERVAL_SECONDS + _refresh_processing() + + +func _can_present_puddles() -> bool: + return ( + not _light_performance_profile + and _is_active + and not _suppressed + and _test_world != null + and _test_world.is_world_ready() + and _weather_service != null + and _local_player != null + and _local_player.is_local_control_enabled() + ) + + +func _refresh_processing() -> void: + var should_process: bool = ( + _can_present_puddles() + and ( + _weather_service.is_raining() + or _has_active_puddles() + ) + ) + set_process(should_process) + + +func _has_active_puddles() -> bool: + for puddle: PuddleState in _puddles: + if puddle.active: + return true + return false + + +func _prepare_visual_pool() -> void: + if _visual_root != null: + return + _visual_root = Node3D.new() + _visual_root.name = "PuddleVisuals" + add_child(_visual_root) + _splash_root = Node3D.new() + _splash_root.name = "PuddleSplashes" + add_child(_splash_root) + _puddle_mesh = CylinderMesh.new() + _puddle_mesh.top_radius = 1.0 + _puddle_mesh.bottom_radius = 1.0 + _puddle_mesh.height = 0.012 + _puddle_mesh.radial_segments = 12 + _puddle_mesh.rings = 1 + for _index: int in MAX_PUDDLES: + var material := StandardMaterial3D.new() + material.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA + material.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + material.cull_mode = BaseMaterial3D.CULL_DISABLED + material.roughness = 0.18 + material.metallic = 0.0 + var visual := MeshInstance3D.new() + visual.name = "RainPuddle" + visual.mesh = _puddle_mesh + visual.material_override = material + visual.cast_shadow = GeometryInstance3D.SHADOW_CASTING_SETTING_OFF + visual.visible = false + _visual_root.add_child(visual) + var puddle := PuddleState.new() + puddle.visual = visual + puddle.material = material + _puddles.append(puddle) + + +func _ensure_surface_cache() -> void: + if _surface_cache_ready or _test_world == null: + return + _surface_cache_ready = true + var saltwater_height: float = _test_world.get_saltwater_surface_height() + if is_nan(saltwater_height): + return + var candidate_triangles: Array[PackedVector3Array] = ( + _test_world.get_spawn_surface_triangles( + PUDDLE_SURFACE_MATERIALS, + saltwater_height + SURFACE_CLEARANCE_ABOVE_WATER, + MINIMUM_SURFACE_UP_DOT, + ) + ) + for triangle: PackedVector3Array in candidate_triangles: + if not is_puddle_surface_eligible(triangle, saltwater_height): + continue + var triangle_index: int = _surface_triangles.size() + _surface_triangles.append(triangle) + var center: Vector3 = ( + triangle[0] + triangle[1] + triangle[2] + ) / 3.0 + var cell: Vector2i = _surface_cell_for(center) + var triangle_indices: Array = ( + _surface_triangle_indices_by_cell.get(cell, []) as Array + ) + triangle_indices.append(triangle_index) + _surface_triangle_indices_by_cell[cell] = triangle_indices + + +func _spawn_puddle_near(player_position: Vector3) -> bool: + if _active_puddle_count() >= MAX_PUDDLES: + return false + var puddle: PuddleState = _first_inactive_puddle() + if puddle == null: + return false + for _attempt: int in 24: + var triangle_index: int = _random_nearby_triangle_index( + player_position + ) + if triangle_index < 0 or triangle_index >= _surface_triangles.size(): + return false + var triangle: PackedVector3Array = _surface_triangles[triangle_index] + var position: Vector3 = _random_point_in_triangle(triangle) + var horizontal_distance: float = Vector2( + position.x, + position.z, + ).distance_to(Vector2(player_position.x, player_position.z)) + if ( + horizontal_distance < MINIMUM_PLAYER_DISTANCE + or horizontal_distance > MAXIMUM_PLAYER_DISTANCE + or _is_candidate_blocked(position) + or _is_near_existing_puddle(position) + ): + continue + var maximum_radius: float = minf( + MAXIMUM_PUDDLE_RADIUS, + _minimum_triangle_edge_distance(position, triangle) * 0.65, + ) + if maximum_radius < MINIMUM_PUDDLE_RADIUS: + continue + var radius_x: float = _random.randf_range( + MINIMUM_PUDDLE_RADIUS, + maximum_radius, + ) + var radius_z: float = radius_x * _random.randf_range(0.58, 0.86) + _activate_puddle( + puddle, + position, + Vector2(radius_x, radius_z), + _random.randf_range(0.0, TAU), + ) + return true + return false + + +func _active_puddle_count() -> int: + var count: int = 0 + for puddle: PuddleState in _puddles: + if puddle.active: + count += 1 + return count + + +func _first_inactive_puddle() -> PuddleState: + for puddle: PuddleState in _puddles: + if not puddle.active: + return puddle + return null + + +func _random_nearby_triangle_index(player_position: Vector3) -> int: + var base_cell: Vector2i = _surface_cell_for(player_position) + for _attempt: int in 16: + var cell := base_cell + Vector2i( + _random.randi_range( + -SURFACE_SEARCH_CELL_RADIUS, + SURFACE_SEARCH_CELL_RADIUS, + ), + _random.randi_range( + -SURFACE_SEARCH_CELL_RADIUS, + SURFACE_SEARCH_CELL_RADIUS, + ), + ) + var triangle_indices: Array = ( + _surface_triangle_indices_by_cell.get(cell, []) as Array + ) + if not triangle_indices.is_empty(): + return int(triangle_indices[_random.randi_range( + 0, + triangle_indices.size() - 1, + )]) + return -1 + + +func _activate_puddle( + puddle: PuddleState, + center: Vector3, + radii: Vector2, + rotation_y: float, +) -> void: + puddle.center = center + puddle.radii = radii + puddle.rotation_y = rotation_y + puddle.alpha = 0.0 + puddle.active = true + puddle.player_was_inside = false + puddle.splash_cooldown = 0.0 + puddle.visual.global_position = center + Vector3.UP * 0.012 + puddle.visual.rotation = Vector3(0.0, rotation_y, 0.0) + puddle.visual.scale = Vector3(radii.x, 1.0, radii.y) + _apply_puddle_alpha(puddle) + puddle.visual.visible = true + + +func _fade_puddles_in(delta: float) -> void: + for puddle: PuddleState in _puddles: + if not puddle.active: + continue + puddle.alpha = minf( + 1.0, + puddle.alpha + FADE_IN_ALPHA_PER_SECOND * delta, + ) + _apply_puddle_alpha(puddle) + + +func _fade_puddles_out(delta: float) -> void: + for puddle: PuddleState in _puddles: + if not puddle.active: + continue + puddle.alpha = maxf( + 0.0, + puddle.alpha - FADE_OUT_ALPHA_PER_SECOND * delta, + ) + if puddle.alpha <= 0.0: + _deactivate_puddle(puddle) + continue + _apply_puddle_alpha(puddle) + + +func _release_distant_puddles(player_position: Vector3) -> void: + for puddle: PuddleState in _puddles: + if ( + puddle.active + and Vector2(puddle.center.x, puddle.center.z).distance_to( + Vector2(player_position.x, player_position.z) + ) > RELEASE_DISTANCE + ): + _deactivate_puddle(puddle) + + +func _deactivate_puddle(puddle: PuddleState) -> void: + puddle.active = false + puddle.alpha = 0.0 + puddle.player_was_inside = false + puddle.splash_cooldown = 0.0 + if puddle.visual != null: + puddle.visual.visible = false + + +func _clear_puddles() -> void: + for puddle: PuddleState in _puddles: + _deactivate_puddle(puddle) + if _splash_root == null: + return + for splash: Node in _splash_root.get_children(): + splash.queue_free() + + +func _apply_puddle_alpha(puddle: PuddleState) -> void: + if puddle.material == null: + return + var color := PUDDLE_COLOR + color.a *= puddle.alpha + puddle.material.albedo_color = color + + +func _is_candidate_blocked(position: Vector3) -> bool: + if not is_inside_tree(): + return false + var world: World3D = get_world_3d() + if world == null: + return false + var query := PhysicsRayQueryParameters3D.create( + position + Vector3.UP * 0.05, + position + Vector3.UP * 1.75, + TERRAIN_COLLISION_MASK, + ) + query.collide_with_areas = false + query.collide_with_bodies = true + return not world.direct_space_state.intersect_ray(query).is_empty() + + +func _is_near_existing_puddle(position: Vector3) -> bool: + var horizontal_position := Vector2(position.x, position.z) + for puddle: PuddleState in _puddles: + if not puddle.active: + continue + var minimum_distance: float = ( + MINIMUM_PUDDLE_SPACING + maxf(puddle.radii.x, puddle.radii.y) + ) + if horizontal_position.distance_to( + Vector2(puddle.center.x, puddle.center.z) + ) < minimum_distance: + return true + return false + + +func _update_player_splashes( + player_position: Vector3, + delta: float, +) -> void: + var grounded: bool = _local_player.is_on_floor() + for puddle: PuddleState in _puddles: + if not puddle.active or puddle.alpha <= 0.08: + continue + puddle.splash_cooldown = maxf( + 0.0, + puddle.splash_cooldown - delta, + ) + var is_inside: bool = is_point_inside_puddle( + player_position, + puddle.center, + puddle.radii, + puddle.rotation_y, + ) + var should_splash: bool = ( + is_inside + and puddle.splash_cooldown <= 0.0 + and ( + not puddle.player_was_inside + or (not _player_was_grounded and grounded) + ) + ) + if should_splash: + _emit_splash(player_position, puddle.center.y) + puddle.splash_cooldown = SPLASH_COOLDOWN_SECONDS + puddle.player_was_inside = is_inside + _player_was_grounded = grounded + + +func _emit_splash(player_position: Vector3, surface_height: float) -> void: + if _splash_root == null or not _splash_root.visible: + return + var particles := CPUParticles3D.new() + particles.name = "RainPuddleSplash" + particles.global_position = Vector3( + player_position.x, + surface_height + 0.04, + player_position.z, + ) + particles.amount = 7 + particles.lifetime = 0.38 + particles.one_shot = true + particles.local_coords = true + particles.explosiveness = 1.0 + particles.direction = Vector3.UP + particles.spread = 48.0 + particles.gravity = Vector3(0.0, -3.2, 0.0) + particles.initial_velocity_min = 0.65 + particles.initial_velocity_max = 1.15 + particles.scale_amount_min = 0.7 + particles.scale_amount_max = 1.0 + var material := StandardMaterial3D.new() + material.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA + material.albedo_color = SPLASH_COLOR + material.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED + material.roughness = 1.0 + var droplet_mesh := BoxMesh.new() + droplet_mesh.size = Vector3(0.028, 0.04, 0.028) + droplet_mesh.material = material + particles.mesh = droplet_mesh + _splash_root.add_child(particles) + particles.emitting = true + var cleanup := create_tween() + cleanup.tween_interval(0.5) + cleanup.tween_callback(particles.queue_free) + + +func _seed_for_world() -> int: + if _test_world == null: + return 1 + return max(_test_world.get_generation_seed(), 1) ^ 0x5261696e + + +func _surface_cell_for(position: Vector3) -> Vector2i: + return Vector2i( + floori(position.x / SURFACE_CELL_SIZE), + floori(position.z / SURFACE_CELL_SIZE), + ) + + +func _random_point_in_triangle(triangle: PackedVector3Array) -> Vector3: + var first: float = _random.randf() + var second: float = _random.randf() + if first + second > 1.0: + first = 1.0 - first + second = 1.0 - second + return triangle[0] + (triangle[1] - triangle[0]) * first + ( + triangle[2] - triangle[0] + ) * second + + +func _minimum_triangle_edge_distance( + position: Vector3, + triangle: PackedVector3Array, +) -> float: + var horizontal_position := Vector2(position.x, position.z) + return minf( + _horizontal_distance_to_segment( + horizontal_position, + Vector2(triangle[0].x, triangle[0].z), + Vector2(triangle[1].x, triangle[1].z), + ), + minf( + _horizontal_distance_to_segment( + horizontal_position, + Vector2(triangle[1].x, triangle[1].z), + Vector2(triangle[2].x, triangle[2].z), + ), + _horizontal_distance_to_segment( + horizontal_position, + Vector2(triangle[2].x, triangle[2].z), + Vector2(triangle[0].x, triangle[0].z), + ), + ), + ) + + +static func is_puddle_surface_eligible( + triangle: PackedVector3Array, + saltwater_height: float, +) -> bool: + if triangle.size() != 3 or is_nan(saltwater_height): + return false + for vertex: Vector3 in triangle: + if vertex.y <= saltwater_height + SURFACE_CLEARANCE_ABOVE_WATER: + return false + var cross: Vector3 = (triangle[1] - triangle[0]).cross( + triangle[2] - triangle[0] + ) + return ( + cross.length_squared() > 0.0000001 + and absf(cross.normalized().dot(Vector3.UP)) >= MINIMUM_SURFACE_UP_DOT + ) + + +static func is_point_inside_puddle( + world_position: Vector3, + center: Vector3, + radii: Vector2, + rotation_y: float = 0.0, +) -> bool: + if radii.x <= 0.0 or radii.y <= 0.0: + return false + if absf(world_position.y - center.y) > MAXIMUM_PLAYER_HEIGHT_OFFSET: + return false + var offset := Vector2( + world_position.x - center.x, + world_position.z - center.z, + ).rotated(-rotation_y) + offset = Vector2(offset.x / radii.x, offset.y / radii.y) + return offset.length_squared() <= 1.0 + + +static func _horizontal_distance_to_segment( + point: Vector2, + start: Vector2, + end: Vector2, +) -> float: + var segment: Vector2 = end - start + var segment_length_squared: float = segment.length_squared() + if segment_length_squared <= 0.0000001: + return point.distance_to(start) + var ratio: float = clampf( + (point - start).dot(segment) / segment_length_squared, + 0.0, + 1.0, + ) + return point.distance_to(start + segment * ratio) diff --git a/world/rain_puddle_presentation.gd.uid b/world/rain_puddle_presentation.gd.uid new file mode 100644 index 0000000..6fff927 --- /dev/null +++ b/world/rain_puddle_presentation.gd.uid @@ -0,0 +1 @@ +uid://lhwc7dc1pivp diff --git a/world/regions/starter_island_region.gd b/world/regions/starter_island_region.gd index 5352c39..130da68 100644 --- a/world/regions/starter_island_region.gd +++ b/world/regions/starter_island_region.gd @@ -107,8 +107,10 @@ func get_rv_upgrade_shop() -> RVUpgradeInteractionType: return get_node_or_null(rv_upgrade_shop_path) as RVUpgradeInteractionType -func get_saltwater_shoreline_mesh() -> MeshInstance3D: - return get_node_or_null(^"ShorelineRibbons/Ocean") as MeshInstance3D +func _get_ocean_surface_motion() -> WaterSurfaceMotion: + return get_node_or_null( + ^"WaterBodies/Ocean/VisualWater" + ) as WaterSurfaceMotion func set_light_performance_profile(enabled: bool) -> void: @@ -116,9 +118,7 @@ func set_light_performance_profile(enabled: bool) -> void: var pond := get_node_or_null( ^"WaterBodies/Pond/VisualWater" ) as MeshInstance3D - var ocean := get_node_or_null( - ^"WaterBodies/Ocean/VisualWater" - ) as MeshInstance3D + var ocean := _get_ocean_surface_motion() if pond != null: pond.material_override = ( _create_light_water_material( @@ -129,6 +129,9 @@ func set_light_performance_profile(enabled: bool) -> void: else NORMAL_FRESH_WATER_MATERIAL ) if ocean != null: + # Reset the old shader material before replacing it with the lite material. + # Otherwise its last bob offset could leak into the next normal-profile use. + ocean.set_motion_enabled(false) ocean.material_override = ( _create_light_water_material( LIGHT_SALT_WATER_COLOR, @@ -137,20 +140,15 @@ func set_light_performance_profile(enabled: bool) -> void: if enabled else NORMAL_SALT_WATER_MATERIAL ) - var surface_motion := ocean as WaterSurfaceMotion - if surface_motion != null: - surface_motion.set_motion_enabled(not enabled) - - + if not enabled: + ocean.set_motion_enabled(true) func set_foliage_wind_strength_multiplier(multiplier: float) -> void: _foliage_wind_strength_multiplier = maxf(multiplier, 0.0) _set_foliage_wind_enabled(_foliage_wind_enabled) func set_water_motion_strength_multiplier(multiplier: float) -> void: - var ocean := get_node_or_null( - ^"WaterBodies/Ocean/VisualWater" - ) as WaterSurfaceMotion + var ocean := _get_ocean_surface_motion() if ocean != null: ocean.set_motion_strength_multiplier(multiplier) diff --git a/world/regions/starter_island_region.tscn b/world/regions/starter_island_region.tscn index 6f7f10b..3da63eb 100644 --- a/world/regions/starter_island_region.tscn +++ b/world/regions/starter_island_region.tscn @@ -11,11 +11,8 @@ [ext_resource type="PackedScene" path="res://world/interactables/player_storage_box.tscn" id="8_storage"] [ext_resource type="Script" uid="uid://dtcgnxl1kmdu1" path="res://world/water_body_authoring.gd" id="10_water_body"] [ext_resource type="Material" path="res://world/materials/stylized_water.tres" id="13_water"] -[ext_resource type="ArrayMesh" path="res://world/generated/shorelines/starter_ocean_shoreline.tres" id="17_ocean_shoreline"] [ext_resource type="Material" path="res://world/materials/stylized_water_fresh.tres" id="19_fresh_water"] [ext_resource type="Script" uid="uid://drdjm443o35tc" path="res://world/water_surface_motion.gd" id="20_surface_motion"] -[ext_resource type="Script" path="res://world/water/shoreline_ribbon_baker.gd" id="21_shoreline_baker"] -[ext_resource type="Script" path="res://world/water/shoreline_ribbon_config.gd" id="22_shoreline_config"] [ext_resource type="Script" path="res://world/digging/diggable_area_3d.gd" id="23_diggable_area"] [ext_resource type="Script" path="res://world/gathering/gatherable_anchor_set_3d.gd" id="24_gatherable_anchors"] [ext_resource type="PackedScene" path="res://world/interactables/decor_shop_world.tscn" id="25_decor_shop"] @@ -60,29 +57,6 @@ size = Vector3(48, 5, 18) resource_local_to_scene = true size = Vector3(48, 5, 18) -[sub_resource type="Resource" id="ShorelineRibbonConfigPond"] -script = ExtResource("22_shoreline_config") -terrain_source = NodePath("../Terrain/Visual/starter_island") -water_height = 2.51 -generation_bounds = Rect2(-17.45, -4.08375, 16.1, 12.3675) -water_reference = Vector2(-9.4, 2.1) -water_is_inside = true -output_resource_path = "res://world/generated/shorelines/starter_pond_shoreline.tres" - -[sub_resource type="Resource" id="ShorelineRibbonConfigOcean"] -script = ExtResource("22_shoreline_config") -terrain_source = NodePath("../Terrain/Visual/starter_island") -water_type = 1 -water_height = -0.45 -generation_bounds = Rect2(-42, -50, 108, 100) -water_reference = Vector2(0, 0) -water_is_inside = false -output_resource_path = "res://world/generated/shorelines/starter_ocean_shoreline.tres" -simplification_tolerance = 0.55 -smoothing_iterations = 3 -resample_spacing = 0.16 -corner_rounding_distance = 2.4 - [node name="StarterIslandRegion" type="Node3D" unique_id=1830415700] script = ExtResource("1_region") region_id = &"starter_island" @@ -142,17 +116,6 @@ position = Vector3(-19.4381, 4.4016, 0.5559) [node name="TreeWestNorth" type="Marker3D" parent="GatherableAnchors/ReachableTreeTrunks"] position = Vector3(-17.4368, 4.3886, 1.3864) -[node name="ShorelineRibbonBaker" type="Node" parent="."] -script = ExtResource("21_shoreline_baker") -water_bodies = Array[ExtResource("22_shoreline_config")]([SubResource("ShorelineRibbonConfigPond"), SubResource("ShorelineRibbonConfigOcean")]) - -[node name="ShorelineRibbons" type="Node3D" parent="."] - -[node name="Ocean" type="MeshInstance3D" parent="ShorelineRibbons"] -visible = false -cast_shadow = 0 -mesh = ExtResource("17_ocean_shoreline") - [node name="WaterBodies" type="Node3D" parent="." unique_id=1417012172] [node name="Pond" type="Node3D" parent="WaterBodies" unique_id=995477450] diff --git a/world/regions/world_region.gd b/world/regions/world_region.gd index ac5b2ff..b19175d 100644 --- a/world/regions/world_region.gd +++ b/world/regions/world_region.gd @@ -30,10 +30,6 @@ func get_player_storage() -> PlayerStorageInteraction: return null -func get_saltwater_shoreline_mesh() -> MeshInstance3D: - return null - - func set_light_performance_profile(_enabled: bool) -> void: pass diff --git a/world/shoreline_ambience.gd b/world/shoreline_ambience.gd deleted file mode 100644 index 9bda5f6..0000000 --- a/world/shoreline_ambience.gd +++ /dev/null @@ -1,200 +0,0 @@ -class_name ShorelineAmbience -extends Node - -const WAVES_STREAM_PATH: String = "res://audio/ambience/waves.wav" - -@export_range(0.0, 20.0, 0.1) var near_distance: float = 2.0 -@export_range(1.0, 100.0, 0.5) var far_distance: float = 24.0 -@export_range(-40.0, 12.0, 0.5) var near_volume_db: float = 1.0 -@export_range(-80.0, 0.0, 0.5) var far_volume_db: float = -18.0 -@export_range(0.05, 1.0, 0.05) var distance_update_interval: float = 0.2 -@export_range(0.1, 20.0, 0.1) var volume_smoothing_speed: float = 4.0 - -@onready var _waves_audio: AudioStreamPlayer = %WavesAudio - -var _listener: Node3D -var _shoreline_segments: Array[PackedVector2Array] = [] -var _distance_update_remaining: float = 0.0 -var _target_volume_db: float = -80.0 -var _is_active := false -var _audio_enabled: bool = false -var _suppressed: bool = false - - -func _ready() -> void: - _waves_audio.bus = &"Environment" - _waves_audio.stream = null - _waves_audio.volume_db = -80.0 - set_process(false) - - -func set_audio_enabled(enabled: bool) -> void: - if _audio_enabled == enabled: - return - _audio_enabled = enabled - if not _audio_enabled: - _waves_audio.stop() - _waves_audio.stream = null - set_process(false) - return - if not ResourceLoader.exists(WAVES_STREAM_PATH, "AudioStream"): - return - _waves_audio.stream = load(WAVES_STREAM_PATH) as AudioStream - _configure_audio_loop(_waves_audio.stream) - if _is_active: - set_process(true) - _update_target_volume() - _waves_audio.volume_db = _target_volume_db - if _waves_audio.stream != null: - _waves_audio.play() - - -func configure(listener: Node3D, shoreline_mesh: MeshInstance3D) -> void: - _listener = listener - _shoreline_segments = _extract_shoreline_segments(shoreline_mesh) - _distance_update_remaining = 0.0 - if _shoreline_segments.is_empty(): - push_warning("Saltwater shoreline ambience has no coastline geometry.") - - -func set_active(active: bool) -> void: - _is_active = active - set_process(active and _audio_enabled and not _suppressed) - if active and not _suppressed: - if not _audio_enabled: - return - _distance_update_remaining = 0.0 - _update_target_volume() - _waves_audio.volume_db = _target_volume_db - if not _waves_audio.playing and _waves_audio.stream != null: - _waves_audio.play() - else: - _waves_audio.stop() - _waves_audio.volume_db = -80.0 - - -func set_suppressed(suppressed: bool) -> void: - if _suppressed == suppressed: - return - _suppressed = suppressed - set_process(_is_active and _audio_enabled and not suppressed) - if suppressed: - _waves_audio.stop() - _waves_audio.volume_db = -80.0 - elif _is_active and _audio_enabled: - _distance_update_remaining = 0.0 - _update_target_volume() - _waves_audio.volume_db = _target_volume_db - if _waves_audio.stream != null: - _waves_audio.play() - - -func _process(delta: float) -> void: - if not _is_active: - return - _distance_update_remaining -= delta - if _distance_update_remaining <= 0.0: - _distance_update_remaining = distance_update_interval - _update_target_volume() - _waves_audio.volume_db = lerpf( - _waves_audio.volume_db, - _target_volume_db, - 1.0 - exp(-volume_smoothing_speed * delta), - ) - - -func _update_target_volume() -> void: - if _listener == null or _shoreline_segments.is_empty(): - _target_volume_db = -80.0 - return - var listener_position := Vector2( - _listener.global_position.x, - _listener.global_position.z, - ) - var distance := distance_to_segments(listener_position, _shoreline_segments) - var blend := clampf( - inverse_lerp(near_distance, maxf(near_distance + 0.01, far_distance), distance), - 0.0, - 1.0, - ) - _target_volume_db = lerpf(near_volume_db, far_volume_db, smoothstep(0.0, 1.0, blend)) - - -func _extract_shoreline_segments( - shoreline_mesh: MeshInstance3D, -) -> Array[PackedVector2Array]: - var segments: Array[PackedVector2Array] = [] - var seen_segments: Dictionary = {} - if shoreline_mesh == null or shoreline_mesh.mesh == null: - return segments - for surface_index in shoreline_mesh.mesh.get_surface_count(): - var arrays := shoreline_mesh.mesh.surface_get_arrays(surface_index) - var vertices: PackedVector3Array = arrays[Mesh.ARRAY_VERTEX] - var indices: PackedInt32Array = arrays[Mesh.ARRAY_INDEX] - if indices.is_empty(): - continue - for index_offset in range(0, indices.size() - 2, 3): - var triangle := PackedVector2Array() - for corner in 3: - var vertex := shoreline_mesh.to_global( - vertices[indices[index_offset + corner]] - ) - triangle.append(Vector2(vertex.x, vertex.z)) - _append_unique_segment(segments, seen_segments, triangle[0], triangle[1]) - _append_unique_segment(segments, seen_segments, triangle[1], triangle[2]) - _append_unique_segment(segments, seen_segments, triangle[2], triangle[0]) - return segments - - -func _append_unique_segment( - segments: Array[PackedVector2Array], - seen_segments: Dictionary, - start: Vector2, - end: Vector2, -) -> void: - if start.distance_squared_to(end) <= 0.000001: - return - # The baked ribbon repeats shared triangle edges. Quantized canonical keys - # keep only distinct segments without an O(n²) startup pass. - var first := start - var second := end - if first.x > second.x or (is_equal_approx(first.x, second.x) and first.y > second.y): - first = end - second = start - var key := "%d,%d:%d,%d" % [ - roundi(first.x * 10000.0), - roundi(first.y * 10000.0), - roundi(second.x * 10000.0), - roundi(second.y * 10000.0), - ] - if seen_segments.has(key): - return - seen_segments[key] = true - segments.append(PackedVector2Array([start, end])) - - -static func distance_to_segments( - point: Vector2, - segments: Array[PackedVector2Array], -) -> float: - var closest_squared := INF - for segment in segments: - if segment.size() < 2: - continue - var closest := Geometry2D.get_closest_point_to_segment( - point, - segment[0], - segment[1], - ) - closest_squared = minf(closest_squared, point.distance_squared_to(closest)) - return sqrt(closest_squared) if closest_squared < INF else INF - - -func _configure_audio_loop(stream: AudioStream) -> void: - var wav := stream as AudioStreamWAV - if wav == null: - return - wav.loop_mode = AudioStreamWAV.LOOP_FORWARD - if wav.loop_end <= wav.loop_begin: - wav.loop_begin = 0 - wav.loop_end = int(round(wav.get_length() * wav.mix_rate)) diff --git a/world/shoreline_ambience.gd.uid b/world/shoreline_ambience.gd.uid deleted file mode 100644 index 3188ec7..0000000 --- a/world/shoreline_ambience.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://b0c3o2vy76fg3 diff --git a/world/test_world.gd b/world/test_world.gd index b036626..64dd157 100644 --- a/world/test_world.gd +++ b/world/test_world.gd @@ -188,10 +188,6 @@ func get_fishable_water_regions() -> Array[FishableWaterRegion]: ) -func get_saltwater_shoreline_mesh() -> MeshInstance3D: - return _active_region.get_saltwater_shoreline_mesh() - - func get_spawn_surface_triangles( material_names: Array[StringName], minimum_global_y: float, diff --git a/world/water/shoreline_ribbon_baker.gd b/world/water/shoreline_ribbon_baker.gd deleted file mode 100644 index a88b6e4..0000000 --- a/world/water/shoreline_ribbon_baker.gd +++ /dev/null @@ -1,139 +0,0 @@ -@tool -class_name ShorelineRibbonBaker -extends Node - -@export var water_bodies: Array[ShorelineRibbonConfig] = [] -@export_enum("Off", "Raw", "Simplified", "Smoothed") var debug_path_stage := 0 -@export_tool_button("Rebuild Shoreline Ribbons") -var rebuild_shorelines: Callable = rebuild_all - - -func rebuild_all() -> Array[Dictionary]: - var results: Array[Dictionary] = [] - for configuration: ShorelineRibbonConfig in water_bodies: - var result := _rebuild(configuration) - if result.is_empty(): - return [] - results.append(result) - _update_debug_display(results) - return results - - -func _rebuild(configuration: ShorelineRibbonConfig) -> Dictionary: - if configuration == null: - push_error("Shoreline ribbon configuration is missing.") - return {} - if configuration.water_type != WaterType.Type.SALT_WATER: - return { - "skipped": true, - "water_type": configuration.water_type, - "output_path": configuration.output_resource_path, - } - var source := get_node_or_null(configuration.terrain_source) as Node3D - if source == null: - push_error( - "Shoreline terrain source was not found: %s" - % configuration.terrain_source - ) - return {} - if configuration.output_resource_path.is_empty(): - push_error("Shoreline output resource path is empty.") - return {} - var faces := _terrain_faces(source) - if faces.is_empty(): - push_error("Configured shoreline terrain source exposes no triangles.") - return {} - var result := ShorelineRibbonGenerator.generate( - faces, - configuration.water_height, - configuration.generation_bounds, - configuration.water_reference, - configuration.water_is_inside, - configuration.simplification_tolerance, - configuration.smoothing_iterations, - configuration.resample_spacing, - configuration.corner_rounding_distance, - ) - var output_directory := configuration.output_resource_path.get_base_dir() - DirAccess.make_dir_recursive_absolute(ProjectSettings.globalize_path(output_directory)) - var save_error := ResourceSaver.save( - result["mesh"], configuration.output_resource_path - ) - if save_error != OK: - push_error( - "Failed to save %s: %s" - % [configuration.output_resource_path, error_string(save_error)] - ) - return {} - result["output_path"] = configuration.output_resource_path - result["water_height"] = configuration.water_height - result["water_type"] = configuration.water_type - result["skipped"] = false - return result - - -func _update_debug_display(results: Array[Dictionary]) -> void: - var previous := get_node_or_null("_ShorelinePathDebug") - if previous != null: - previous.queue_free() - if not Engine.is_editor_hint() or debug_path_stage == 0: - return - var debug_mesh := ImmediateMesh.new() - var debug_material := StandardMaterial3D.new() - debug_material.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED - debug_material.albedo_color = Color(1.0, 0.35, 0.65, 1.0) - var stage_key: String = [ - "", "debug_raw_paths", "debug_simplified_paths", "debug_smoothed_paths" - ][debug_path_stage] - for result: Dictionary in results: - if result.get("skipped", false): - continue - var height := float(result["water_height"]) + 0.06 - for path_data: Dictionary in result[stage_key]: - var points: PackedVector2Array = path_data["points"] - if points.size() < 2: - continue - debug_mesh.surface_begin(Mesh.PRIMITIVE_LINE_STRIP, debug_material) - for point: Vector2 in points: - debug_mesh.surface_add_vertex(Vector3(point.x, height, point.y)) - if path_data["closed"]: - debug_mesh.surface_add_vertex(Vector3(points[0].x, height, points[0].y)) - debug_mesh.surface_end() - var debug_instance := MeshInstance3D.new() - debug_instance.name = "_ShorelinePathDebug" - debug_instance.mesh = debug_mesh - add_child(debug_instance) - - -func _terrain_faces(source: Node3D) -> PackedVector3Array: - var result := PackedVector3Array() - if source is CollisionShape3D: - var collision_shape := source as CollisionShape3D - var concave_shape := collision_shape.shape as ConcavePolygonShape3D - if concave_shape == null: - return result - for vertex: Vector3 in concave_shape.get_faces(): - result.append(_to_map_space(source, vertex)) - return result - if source is MeshInstance3D: - var mesh_instance := source as MeshInstance3D - if mesh_instance.mesh == null: - return result - for surface: int in mesh_instance.mesh.get_surface_count(): - var arrays := mesh_instance.mesh.surface_get_arrays(surface) - var vertices := arrays[Mesh.ARRAY_VERTEX] as PackedVector3Array - var indices := arrays[Mesh.ARRAY_INDEX] as PackedInt32Array - if indices.is_empty(): - for vertex: Vector3 in vertices: - result.append(_to_map_space(source, vertex)) - else: - for index: int in indices: - result.append(_to_map_space(source, vertices[index])) - return result - - -func _to_map_space(source: Node3D, vertex: Vector3) -> Vector3: - var map_root := get_parent() as Node3D - if map_root == null: - return source.to_global(vertex) - return map_root.to_local(source.to_global(vertex)) diff --git a/world/water/shoreline_ribbon_baker.gd.uid b/world/water/shoreline_ribbon_baker.gd.uid deleted file mode 100644 index 2991de4..0000000 --- a/world/water/shoreline_ribbon_baker.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bj704rvwwh77b diff --git a/world/water/shoreline_ribbon_config.gd b/world/water/shoreline_ribbon_config.gd deleted file mode 100644 index 682bfed..0000000 --- a/world/water/shoreline_ribbon_config.gd +++ /dev/null @@ -1,15 +0,0 @@ -class_name ShorelineRibbonConfig -extends Resource - -@export_node_path("CollisionShape3D", "MeshInstance3D") var terrain_source: NodePath -@export var water_type: WaterType.Type = WaterType.Type.FRESH_WATER -@export var water_height := 0.0 -@export var generation_bounds := Rect2() -@export var water_reference := Vector2.ZERO -@export var water_is_inside := true -@export_file("*.tres") var output_resource_path := "" -@export_group("Optional Smoothing Overrides") -@export var simplification_tolerance := -1.0 -@export_range(-1, 4, 1) var smoothing_iterations := -1 -@export var resample_spacing := -1.0 -@export var corner_rounding_distance := -1.0 diff --git a/world/water/shoreline_ribbon_config.gd.uid b/world/water/shoreline_ribbon_config.gd.uid deleted file mode 100644 index 6a563e3..0000000 --- a/world/water/shoreline_ribbon_config.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c8hk3eojujyax diff --git a/world/water/shoreline_ribbon_generator.gd b/world/water/shoreline_ribbon_generator.gd deleted file mode 100644 index 9708b06..0000000 --- a/world/water/shoreline_ribbon_generator.gd +++ /dev/null @@ -1,636 +0,0 @@ -class_name ShorelineRibbonGenerator -extends RefCounted - -const WATER_PLANE_EPSILON := 0.001 -const ENDPOINT_MERGE_TOLERANCE := 0.03 -const LOOP_CLOSURE_TOLERANCE := 0.06 -const MINIMUM_FRAGMENT_LENGTH := 2.0 -const SIMPLIFICATION_TOLERANCE := 0.55 -const SMOOTHING_ITERATIONS := 3 -const RESAMPLE_SPACING := 0.16 -const CORNER_ROUNDING_DISTANCE := 2.4 -const CORNER_ROUNDING_START_DEGREES := 24.0 -const CORNER_ROUNDING_FULL_DEGREES := 78.0 -const MAXIMUM_JOIN_SCALE := 1.0 -const RIBBON_REACH_GROWTH_PER_METER := 0.52 -const RIBBON_WIDTH := 1.35 -const LAND_INSET := 0.12 -const SURFACE_OFFSET := 0.018 - - -static func generate( - faces: PackedVector3Array, - water_height: float, - bounds: Rect2, - water_reference: Vector2, - water_is_inside: bool, - simplification_override := -1.0, - smoothing_iterations_override := -1, - resample_spacing_override := -1.0, - corner_rounding_override := -1.0 -) -> Dictionary: - var simplification := ( - SIMPLIFICATION_TOLERANCE - if simplification_override < 0.0 - else simplification_override - ) - var smoothing_iterations := ( - SMOOTHING_ITERATIONS - if smoothing_iterations_override < 0 - else smoothing_iterations_override - ) - var resample_spacing := ( - RESAMPLE_SPACING - if resample_spacing_override < 0.0 - else resample_spacing_override - ) - var corner_rounding := ( - CORNER_ROUNDING_DISTANCE - if corner_rounding_override < 0.0 - else corner_rounding_override - ) - var segments := _extract_segments(faces, water_height, bounds) - var raw_paths := _stitch_segments(segments) - var processed_paths: Array[Dictionary] = [] - var simplified_paths: Array[Dictionary] = [] - var raw_point_count := 0 - var simplified_point_count := 0 - var smoothed_point_count := 0 - for path_data: Dictionary in raw_paths: - var raw_points: PackedVector2Array = path_data["points"] - var closed: bool = path_data["closed"] - if _path_length(raw_points, closed) < MINIMUM_FRAGMENT_LENGTH: - continue - var simplified := _simplify(raw_points, closed, simplification) - simplified_paths.append({"points": simplified, "closed": closed}) - var rounded := _round_sharp_corners( - simplified, - closed, - corner_rounding, - ) - var smoothed := _chaikin(rounded, closed, smoothing_iterations) - var resampled := _resample(smoothed, closed, resample_spacing) - if resampled.size() < (3 if closed else 2): - continue - raw_point_count += raw_points.size() - simplified_point_count += simplified.size() - smoothed_point_count += resampled.size() - processed_paths.append({"points": resampled, "closed": closed}) - var mesh := _build_mesh( - processed_paths, - water_height, - water_reference, - water_is_inside - ) - return { - "mesh": mesh, - "segment_count": segments.size(), - "loop_count": processed_paths.size(), - "raw_point_count": raw_point_count, - "simplified_point_count": simplified_point_count, - "smoothed_point_count": smoothed_point_count, - "triangle_count": _mesh_triangle_count(mesh), - "debug_raw_paths": raw_paths, - "debug_simplified_paths": simplified_paths, - "debug_smoothed_paths": processed_paths, - } - - -static func _extract_segments( - faces: PackedVector3Array, - water_height: float, - bounds: Rect2 -) -> Array[PackedVector2Array]: - var segments: Array[PackedVector2Array] = [] - for index: int in range(0, faces.size(), 3): - var triangle: Array[Vector3] = [ - faces[index], faces[index + 1], faces[index + 2] - ] - var hits := PackedVector2Array() - for edge: int in 3: - var a := triangle[edge] - var b := triangle[(edge + 1) % 3] - var distance_a := a.y - water_height - var distance_b := b.y - water_height - if ( - absf(distance_a) <= WATER_PLANE_EPSILON - and absf(distance_b) <= WATER_PLANE_EPSILON - ): - continue - if not ( - distance_a * distance_b < 0.0 - or absf(distance_a) <= WATER_PLANE_EPSILON - or absf(distance_b) <= WATER_PLANE_EPSILON - ): - continue - var denominator := distance_a - distance_b - var amount := ( - 0.0 - if absf(denominator) <= WATER_PLANE_EPSILON - else distance_a / denominator - ) - var hit3 := a.lerp(b, clampf(amount, 0.0, 1.0)) - var hit := Vector2(hit3.x, hit3.z) - if bounds.has_point(hit) and not _contains_near(hits, hit): - hits.append(hit) - if ( - hits.size() == 2 - and hits[0].distance_to(hits[1]) > WATER_PLANE_EPSILON - ): - segments.append(hits) - return segments - - -static func _stitch_segments( - segments: Array[PackedVector2Array] -) -> Array[Dictionary]: - var point_by_key: Dictionary = {} - var adjacency: Dictionary = {} - var unused_edges: Dictionary = {} - for segment: PackedVector2Array in segments: - var a_key := _point_key(segment[0]) - var b_key := _point_key(segment[1]) - if a_key == b_key: - continue - point_by_key[a_key] = segment[0] - point_by_key[b_key] = segment[1] - if not adjacency.has(a_key): - adjacency[a_key] = [] - if not adjacency.has(b_key): - adjacency[b_key] = [] - var edge_key := _edge_key(a_key, b_key) - if unused_edges.has(edge_key): - continue - (adjacency[a_key] as Array).append(b_key) - (adjacency[b_key] as Array).append(a_key) - unused_edges[edge_key] = true - - var starts: Array = [] - for key: Vector2i in adjacency: - if (adjacency[key] as Array).size() != 2: - starts.append(key) - for key: Vector2i in adjacency: - if not starts.has(key): - starts.append(key) - - var paths: Array[Dictionary] = [] - for start: Vector2i in starts: - while _has_unused_neighbor(start, adjacency, unused_edges): - var walked := _walk_path(start, point_by_key, adjacency, unused_edges) - if (walked["points"] as PackedVector2Array).size() >= 2: - paths.append(walked) - return paths - - -static func _walk_path( - start: Vector2i, - point_by_key: Dictionary, - adjacency: Dictionary, - unused_edges: Dictionary -) -> Dictionary: - var points := PackedVector2Array() - var previous := Vector2i(2147483647, 2147483647) - var current := start - var closed := false - var guard := unused_edges.size() + 2 - while guard > 0: - guard -= 1 - points.append(point_by_key[current]) - var next_key := Vector2i(2147483647, 2147483647) - for candidate: Vector2i in adjacency[current]: - if candidate == previous and (adjacency[current] as Array).size() > 1: - continue - if unused_edges.get(_edge_key(current, candidate), false): - next_key = candidate - break - if next_key.x == 2147483647: - for candidate: Vector2i in adjacency[current]: - if unused_edges.get(_edge_key(current, candidate), false): - next_key = candidate - break - if next_key.x == 2147483647: - break - unused_edges[_edge_key(current, next_key)] = false - previous = current - current = next_key - if current == start: - closed = true - break - return {"points": points, "closed": closed} - - -static func _simplify( - points: PackedVector2Array, - closed: bool, - tolerance: float -) -> PackedVector2Array: - if points.size() <= (4 if closed else 2): - return points - if not closed: - return _rdp_open(points, tolerance) - var split_a := 0 - var split_b := 1 - var greatest_distance := 0.0 - for a: int in points.size(): - for b: int in range(a + 1, points.size()): - var distance := points[a].distance_squared_to(points[b]) - if distance > greatest_distance: - greatest_distance = distance - split_a = a - split_b = b - var first_arc := _closed_arc(points, split_a, split_b) - var second_arc := _closed_arc(points, split_b, split_a) - var first_result := _rdp_open(first_arc, tolerance) - var second_result := _rdp_open(second_arc, tolerance) - var result := PackedVector2Array() - for index: int in first_result.size() - 1: - result.append(first_result[index]) - for index: int in second_result.size() - 1: - result.append(second_result[index]) - return result if result.size() >= 4 else points - - -static func _rdp_open( - points: PackedVector2Array, - tolerance: float -) -> PackedVector2Array: - if points.size() <= 2: - return points - var greatest_distance := 0.0 - var split_index := 0 - for index: int in range(1, points.size() - 1): - var distance := _point_segment_distance( - points[index], points[0], points[points.size() - 1] - ) - if distance > greatest_distance: - greatest_distance = distance - split_index = index - if greatest_distance <= tolerance: - return PackedVector2Array([points[0], points[points.size() - 1]]) - var left := _rdp_open(points.slice(0, split_index + 1), tolerance) - var right := _rdp_open(points.slice(split_index), tolerance) - var result := PackedVector2Array() - for index: int in left.size() - 1: - result.append(left[index]) - result.append_array(right) - return result - - -static func _closed_arc( - points: PackedVector2Array, - start: int, - finish: int -) -> PackedVector2Array: - var result := PackedVector2Array() - var index := start - result.append(points[index]) - while index != finish: - index = (index + 1) % points.size() - result.append(points[index]) - return result - - -static func _chaikin( - points: PackedVector2Array, - closed: bool, - iterations: int -) -> PackedVector2Array: - var result := points - for _iteration: int in iterations: - var next := PackedVector2Array() - if not closed: - next.append(result[0]) - var edge_count := result.size() if closed else result.size() - 1 - for index: int in edge_count: - var a := result[index] - var b := result[(index + 1) % result.size()] - next.append(a.lerp(b, 0.25)) - next.append(a.lerp(b, 0.75)) - if not closed: - next.append(result[result.size() - 1]) - result = next - return result - - -static func _round_sharp_corners( - points: PackedVector2Array, - closed: bool, - rounding_distance: float, -) -> PackedVector2Array: - if rounding_distance <= WATER_PLANE_EPSILON or points.size() < 3: - return points - var result := PackedVector2Array() - for index: int in points.size(): - if not closed and (index == 0 or index == points.size() - 1): - result.append(points[index]) - continue - var previous := points[(index - 1 + points.size()) % points.size()] - var point := points[index] - var following := points[(index + 1) % points.size()] - var incoming_vector := point - previous - var outgoing_vector := following - point - var incoming_length := incoming_vector.length() - var outgoing_length := outgoing_vector.length() - if ( - incoming_length <= WATER_PLANE_EPSILON - or outgoing_length <= WATER_PLANE_EPSILON - ): - result.append(point) - continue - var incoming := incoming_vector / incoming_length - var outgoing := outgoing_vector / outgoing_length - var turn_degrees := rad_to_deg( - acos(clampf(incoming.dot(outgoing), -1.0, 1.0)) - ) - var corner_weight := smoothstep( - CORNER_ROUNDING_START_DEGREES, - CORNER_ROUNDING_FULL_DEGREES, - turn_degrees, - ) - var cut_distance := minf( - rounding_distance * corner_weight, - minf(incoming_length, outgoing_length) * 0.44, - ) - if cut_distance <= WATER_PLANE_EPSILON: - result.append(point) - continue - var entry := point - incoming * cut_distance - var exit := point + outgoing * cut_distance - var curve_steps := maxi(3, ceili(cut_distance / 0.22)) - for step: int in curve_steps + 1: - var amount := float(step) / float(curve_steps) - var first := entry.lerp(point, amount) - var second := point.lerp(exit, amount) - var rounded_point := first.lerp(second, amount) - if ( - result.is_empty() - or result[result.size() - 1].distance_to(rounded_point) - > WATER_PLANE_EPSILON - ): - result.append(rounded_point) - return result - - -static func _resample( - points: PackedVector2Array, - closed: bool, - spacing: float -) -> PackedVector2Array: - var total_length := _path_length(points, closed) - if total_length <= spacing: - return points - var count := maxi(roundi(total_length / spacing), 3 if closed else 2) - var actual_spacing := total_length / float(count if closed else count - 1) - var result := PackedVector2Array() - var edge := 0 - var edge_start_distance := 0.0 - var edge_length := points[0].distance_to(points[1]) - for sample: int in count: - var target := actual_spacing * sample - while target > edge_start_distance + edge_length and edge < points.size() - 1: - edge_start_distance += edge_length - edge += 1 - if edge >= points.size() - 1: - edge_length = points[edge].distance_to(points[0]) if closed else 0.0 - else: - edge_length = points[edge].distance_to(points[edge + 1]) - var next_index := (edge + 1) % points.size() - var amount := ( - 0.0 - if edge_length <= WATER_PLANE_EPSILON - else (target - edge_start_distance) / edge_length - ) - result.append(points[edge].lerp(points[next_index], clampf(amount, 0.0, 1.0))) - return result - - -static func _build_mesh( - paths: Array[Dictionary], - water_height: float, - water_reference: Vector2, - water_is_inside: bool -) -> ArrayMesh: - var vertices := PackedVector3Array() - var normals := PackedVector3Array() - var uvs := PackedVector2Array() - var indices := PackedInt32Array() - for path_data: Dictionary in paths: - var points: PackedVector2Array = path_data["points"] - var closed: bool = path_data["closed"] - var closed_water_side := ( - _closed_path_water_side(points, water_is_inside) - if closed - else 0.0 - ) - var base_index := vertices.size() - var water_normals := PackedVector2Array() - var join_scales := PackedFloat32Array() - var water_reaches := PackedFloat32Array() - for index: int in points.size(): - var previous := points[(index - 1 + points.size()) % points.size()] - var following := points[(index + 1) % points.size()] - if not closed: - previous = points[maxi(index - 1, 0)] - following = points[mini(index + 1, points.size() - 1)] - var point := points[index] - var incoming := previous.direction_to(point) - var outgoing := point.direction_to(following) - if incoming.is_zero_approx(): - incoming = outgoing - if outgoing.is_zero_approx(): - outgoing = incoming - var incoming_normal := Vector2(-incoming.y, incoming.x) - var outgoing_normal := Vector2(-outgoing.y, outgoing.x) - var water_normal := incoming_normal + outgoing_normal - if water_normal.is_zero_approx(): - water_normal = outgoing_normal - water_normal = water_normal.normalized() - if closed: - water_normal *= closed_water_side - else: - var toward_reference := point.direction_to(water_reference) - if ( - (water_is_inside and water_normal.dot(toward_reference) < 0.0) - or (not water_is_inside and water_normal.dot(toward_reference) > 0.0) - ): - water_normal = -water_normal - var join_scale := minf( - 1.0 / maxf(absf(water_normal.dot(outgoing_normal)), 0.55), - MAXIMUM_JOIN_SCALE, - ) - var water_reach := _safe_water_reach( - incoming, - outgoing, - water_normal, - previous.distance_to(point), - point.distance_to(following), - (RIBBON_WIDTH - LAND_INSET) * join_scale, - ) - water_normals.append(water_normal) - join_scales.append(join_scale) - water_reaches.append(water_reach) - water_reaches = _smooth_water_reaches( - points, - water_reaches, - closed, - ) - var path_distance := 0.0 - for index: int in points.size(): - if index > 0: - path_distance += points[index - 1].distance_to(points[index]) - var point := points[index] - var water_normal := water_normals[index] - var join_scale := join_scales[index] - var land_point := ( - point - water_normal * LAND_INSET * join_scale - ) - var water_point := ( - point - + water_normal * water_reaches[index] - ) - vertices.append(Vector3(land_point.x, water_height + SURFACE_OFFSET, land_point.y)) - vertices.append(Vector3(water_point.x, water_height + SURFACE_OFFSET, water_point.y)) - normals.append(Vector3.UP) - normals.append(Vector3.UP) - uvs.append(Vector2(path_distance, 0.0)) - uvs.append(Vector2(path_distance, 1.0)) - var edge_count := points.size() if closed else points.size() - 1 - for index: int in edge_count: - var next := (index + 1) % points.size() - var a := base_index + index * 2 - var b := a + 1 - var c := base_index + next * 2 - var d := c + 1 - indices.append_array(PackedInt32Array([a, c, b, b, c, d])) - var arrays := [] - arrays.resize(Mesh.ARRAY_MAX) - arrays[Mesh.ARRAY_VERTEX] = vertices - arrays[Mesh.ARRAY_NORMAL] = normals - arrays[Mesh.ARRAY_TEX_UV] = uvs - arrays[Mesh.ARRAY_INDEX] = indices - var mesh := ArrayMesh.new() - if not vertices.is_empty(): - mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays) - return mesh - - -static func _safe_water_reach( - incoming: Vector2, - outgoing: Vector2, - water_normal: Vector2, - incoming_length: float, - outgoing_length: float, - desired_reach: float, -) -> float: - var turn_cross := incoming.cross(outgoing) - var water_side := incoming.cross(water_normal) - if turn_cross * water_side <= 0.0: - return desired_reach - var turn_angle := acos(clampf(incoming.dot(outgoing), -1.0, 1.0)) - if turn_angle <= WATER_PLANE_EPSILON: - return desired_reach - var radius := minf(incoming_length, outgoing_length) / maxf( - 2.0 * sin(turn_angle * 0.5), - WATER_PLANE_EPSILON, - ) - return minf(desired_reach, maxf(radius * 0.58, 0.24)) - - -static func _smooth_water_reaches( - points: PackedVector2Array, - reaches: PackedFloat32Array, - closed: bool, -) -> PackedFloat32Array: - var result := reaches.duplicate() - if result.size() < 2: - return result - for _pass: int in 3: - var forward_start := 0 if closed else 1 - for index: int in range(forward_start, result.size()): - var previous := (index - 1 + result.size()) % result.size() - var allowed := ( - result[previous] - + points[previous].distance_to(points[index]) - * RIBBON_REACH_GROWTH_PER_METER - ) - result[index] = minf(result[index], allowed) - var backward_start := result.size() - 1 if closed else result.size() - 2 - for index: int in range(backward_start, -1, -1): - var following := (index + 1) % result.size() - var allowed := ( - result[following] - + points[index].distance_to(points[following]) - * RIBBON_REACH_GROWTH_PER_METER - ) - result[index] = minf(result[index], allowed) - return result - - -static func _closed_path_water_side( - points: PackedVector2Array, - water_is_inside: bool, -) -> float: - var signed_area_twice := 0.0 - for index: int in points.size(): - signed_area_twice += points[index].cross( - points[(index + 1) % points.size()] - ) - var interior_side := 1.0 if signed_area_twice >= 0.0 else -1.0 - return interior_side if water_is_inside else -interior_side - - -static func _point_key(point: Vector2) -> Vector2i: - return Vector2i( - roundi(point.x / ENDPOINT_MERGE_TOLERANCE), - roundi(point.y / ENDPOINT_MERGE_TOLERANCE) - ) - - -static func _edge_key(a: Vector2i, b: Vector2i) -> String: - if a.x < b.x or (a.x == b.x and a.y <= b.y): - return "%d:%d|%d:%d" % [a.x, a.y, b.x, b.y] - return "%d:%d|%d:%d" % [b.x, b.y, a.x, a.y] - - -static func _has_unused_neighbor( - key: Vector2i, - adjacency: Dictionary, - unused_edges: Dictionary -) -> bool: - for neighbor: Vector2i in adjacency[key]: - if unused_edges.get(_edge_key(key, neighbor), false): - return true - return false - - -static func _contains_near(points: PackedVector2Array, point: Vector2) -> bool: - for existing: Vector2 in points: - if existing.distance_to(point) <= WATER_PLANE_EPSILON: - return true - return false - - -static func _point_segment_distance(point: Vector2, a: Vector2, b: Vector2) -> float: - var segment := b - a - if segment.length_squared() <= WATER_PLANE_EPSILON: - return point.distance_to(a) - var amount := clampf((point - a).dot(segment) / segment.length_squared(), 0.0, 1.0) - return point.distance_to(a + segment * amount) - - -static func _path_length(points: PackedVector2Array, closed: bool) -> float: - var result := 0.0 - for index: int in points.size() - 1: - result += points[index].distance_to(points[index + 1]) - if closed and points.size() > 2: - result += points[points.size() - 1].distance_to(points[0]) - return result - - -static func _mesh_triangle_count(mesh: ArrayMesh) -> int: - if mesh.get_surface_count() == 0: - return 0 - var arrays := mesh.surface_get_arrays(0) - return floori( - float((arrays[Mesh.ARRAY_INDEX] as PackedInt32Array).size()) / 3.0 - ) diff --git a/world/water/shoreline_ribbon_generator.gd.uid b/world/water/shoreline_ribbon_generator.gd.uid deleted file mode 100644 index 2edffe8..0000000 --- a/world/water/shoreline_ribbon_generator.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dhp7ctspabll diff --git a/world/water_surface_motion.gd b/world/water_surface_motion.gd index d8dbd4d..0957646 100644 --- a/world/water_surface_motion.gd +++ b/world/water_surface_motion.gd @@ -5,6 +5,9 @@ const DEFAULT_AMPLITUDE: float = 0.055 const DEFAULT_CYCLE_SECONDS: float = 7.0 const DEFAULT_SECONDARY_SWELL: float = 0.18 const DEFAULT_PHASE_OFFSET: float = 0.0 +const STABLE_SURFACE_HEIGHT_OFFSET_PARAMETER: StringName = ( + &"stable_surface_height_offset" +) @export_range(0.0, 0.2, 0.005, "suffix:m") var amplitude: float = ( DEFAULT_AMPLITUDE @@ -23,29 +26,32 @@ var _motion_strength_multiplier: float = 1.0 func _ready() -> void: _base_height = position.y + _apply_height_offset(0.0) set_process(amplitude > 0.0) func _process(_delta: float) -> void: - position.y = _base_height + calculate_height_offset( - _current_time_seconds(), - get_effective_amplitude(), - cycle_seconds, - secondary_swell, - phase_offset, + _apply_height_offset( + calculate_height_offset( + _current_time_seconds(), + get_effective_amplitude(), + cycle_seconds, + secondary_swell, + phase_offset, + ) ) func set_motion_enabled(enabled: bool) -> void: set_process(enabled and amplitude > 0.0) if not enabled: - position.y = _base_height + _apply_height_offset(0.0) func set_motion_strength_multiplier(multiplier: float) -> void: _motion_strength_multiplier = maxf(multiplier, 0.0) if _motion_strength_multiplier <= 0.0: - position.y = _base_height + _apply_height_offset(0.0) func get_motion_strength_multiplier() -> float: @@ -56,6 +62,25 @@ func get_effective_amplitude() -> float: return amplitude * _motion_strength_multiplier +func _apply_height_offset(height_offset: float) -> void: + position.y = _base_height + height_offset + # Headless worlds have no visible shoreline to correct. Skip the visual + # material update there and keep dedicated/headless worlds presentation-free. + if DisplayServer.get_name() == "headless": + return + # The surface can still bob visually, but all shoreline shader thresholds + # should remain at the authored waterline. Only the active ocean uses this + # moving material, so publishing the offset on that material is sufficient. + var shader_material := material_override as ShaderMaterial + if shader_material == null: + shader_material = get_active_material(0) as ShaderMaterial + if shader_material != null: + shader_material.set_shader_parameter( + STABLE_SURFACE_HEIGHT_OFFSET_PARAMETER, + -height_offset + ) + + static func get_default_height_offset() -> float: return calculate_height_offset( _current_time_seconds(),