diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 83d7f78ca4..f9cbc48274 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -26,7 +26,7 @@ jobs:
# build-release-macos: # LF volunteer
build-release-ubuntu1804:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-18.04
steps:
- name: Set env
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
diff --git a/.github/workflows/unittests.yml b/.github/workflows/unittests.yml
index 2691fa9b8b..1c8ab10c70 100644
--- a/.github/workflows/unittests.yml
+++ b/.github/workflows/unittests.yml
@@ -34,7 +34,7 @@ jobs:
run: |
python -m pip install --upgrade pip
pip install flake8 pytest
- python ModuleUpdate.py --yes --force
+ python ModuleUpdate.py --yes --force --append "WebHostLib/requirements.txt"
- name: Unittests
run: |
pytest test
diff --git a/.gitignore b/.gitignore
index 3bdaaabac2..b052625508 100644
--- a/.gitignore
+++ b/.gitignore
@@ -77,6 +77,7 @@ MANIFEST
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
+installer.log
# Unit test / coverage reports
htmlcov/
@@ -154,6 +155,7 @@ cython_debug/
#minecraft server stuff
jdk*/
minecraft*/
+minecraft_versions.json
#pyenv
.python-version
diff --git a/BaseClasses.py b/BaseClasses.py
index a60951b2ad..6cd0db6b7a 100644
--- a/BaseClasses.py
+++ b/BaseClasses.py
@@ -6,7 +6,8 @@ import logging
import json
import functools
from collections import OrderedDict, Counter, deque
-from typing import List, Dict, Optional, Set, Iterable, Union, Any, Tuple, TypedDict, Callable
+from typing import List, Dict, Optional, Set, Iterable, Union, Any, Tuple, TypedDict, Callable, NamedTuple
+import typing # this can go away when Python 3.8 support is dropped
import secrets
import random
@@ -22,6 +23,8 @@ class Group(TypedDict, total=False):
players: Set[int]
item_pool: Set[str]
replacement_items: Dict[int, Optional[str]]
+ local_items: Set[str]
+ non_local_items: Set[str]
class MultiWorld():
@@ -35,7 +38,7 @@ class MultiWorld():
plando_texts: List[Dict[str, str]]
plando_items: List[List[Dict[str, Any]]]
plando_connections: List
- worlds: Dict[int, Any]
+ worlds: Dict[int, auto_world]
groups: Dict[int, Group]
itempool: List[Item]
is_race: bool = False
@@ -217,27 +220,47 @@ class MultiWorld():
raise Exception(f"Cannot ItemLink across games. Link: {item_link['name']}")
item_links[item_link["name"]]["players"][player] = item_link["replacement_item"]
item_links[item_link["name"]]["item_pool"] &= set(item_link["item_pool"])
+ item_links[item_link["name"]]["exclude"] |= set(item_link.get("exclude", []))
+ item_links[item_link["name"]]["local_items"] &= set(item_link.get("local_items", []))
+ item_links[item_link["name"]]["non_local_items"] &= set(item_link.get("non_local_items", []))
else:
if item_link["name"] in self.player_name.values():
raise Exception(f"Cannot name a ItemLink group the same as a player ({item_link['name']}) ({self.get_player_name(player)}).")
item_links[item_link["name"]] = {
"players": {player: item_link["replacement_item"]},
"item_pool": set(item_link["item_pool"]),
- "game": self.game[player]
+ "exclude": set(item_link.get("exclude", [])),
+ "game": self.game[player],
+ "local_items": set(item_link.get("local_items", [])),
+ "non_local_items": set(item_link.get("non_local_items", []))
}
for name, item_link in item_links.items():
current_item_name_groups = AutoWorld.AutoWorldRegister.world_types[item_link["game"]].item_name_groups
pool = set()
+ local_items = set()
+ non_local_items = set()
for item in item_link["item_pool"]:
pool |= current_item_name_groups.get(item, {item})
+ for item in item_link["exclude"]:
+ pool -= current_item_name_groups.get(item, {item})
+ for item in item_link["local_items"]:
+ local_items |= current_item_name_groups.get(item, {item})
+ for item in item_link["non_local_items"]:
+ non_local_items |= current_item_name_groups.get(item, {item})
+ local_items &= pool
+ non_local_items &= pool
item_link["item_pool"] = pool
+ item_link["local_items"] = local_items
+ item_link["non_local_items"] = non_local_items
for group_name, item_link in item_links.items():
game = item_link["game"]
group_id, group = self.add_group(group_name, game, set(item_link["players"]))
group["item_pool"] = item_link["item_pool"]
group["replacement_items"] = item_link["players"]
+ group["local_items"] = item_link["local_items"]
+ group["non_local_items"] = item_link["non_local_items"]
# intended for unittests
def set_default_common_options(self):
@@ -563,9 +586,20 @@ class MultiWorld():
return False
+PathValue = Tuple[str, Optional["PathValue"]]
+
+
class CollectionState():
- additional_init_functions: List[Callable] = []
- additional_copy_functions: List[Callable] = []
+ prog_items: typing.Counter[Tuple[str, int]]
+ world: MultiWorld
+ reachable_regions: Dict[int, Set[Region]]
+ blocked_connections: Dict[int, Set[Entrance]]
+ events: Set[Location]
+ path: Dict[Union[Region, Entrance], PathValue]
+ locations_checked: Set[Location]
+ stale: Dict[int, bool]
+ additional_init_functions: List[Callable[[CollectionState, MultiWorld], None]] = []
+ additional_copy_functions: List[Callable[[CollectionState, CollectionState], CollectionState]] = []
def __init__(self, parent: MultiWorld):
self.prog_items = Counter()
@@ -603,6 +637,7 @@ class CollectionState():
if new_region in rrp:
bc.remove(connection)
elif connection.can_reach(self):
+ assert new_region, "tried to search through an Entrance with no Region"
rrp.add(new_region)
bc.remove(connection)
bc.update(new_region.exits)
@@ -633,7 +668,8 @@ class CollectionState():
spot: Union[Location, Entrance, Region, str],
resolution_hint: Optional[str] = None,
player: Optional[int] = None) -> bool:
- if not hasattr(spot, "can_reach"):
+ if isinstance(spot, str):
+ assert isinstance(player, int), "can_reach: player is required if spot is str"
# try to resolve a name
if resolution_hint == 'Location':
spot = self.world.get_location(spot, player)
@@ -644,7 +680,7 @@ class CollectionState():
spot = self.world.get_region(spot, player)
return spot.can_reach(self)
- def sweep_for_events(self, key_only: bool = False, locations: Set[Location] = None):
+ def sweep_for_events(self, key_only: bool = False, locations: Optional[Iterable[Location]] = None) -> None:
if locations is None:
locations = self.world.get_filled_locations()
new_locations = True
@@ -656,6 +692,7 @@ class CollectionState():
new_locations = reachable_events - self.events
for event in new_locations:
self.events.add(event)
+ assert isinstance(event.item, Item), "tried to collect Event with no Item"
self.collect(event.item, True, event)
def has(self, item: str, player: int, count: int = 1) -> bool:
@@ -670,7 +707,7 @@ class CollectionState():
def count(self, item: str, player: int) -> int:
return self.prog_items[item, player]
- def has_group(self, item_name_group: str, player: int, count: int = 1):
+ def has_group(self, item_name_group: str, player: int, count: int = 1) -> bool:
found: int = 0
for item_name in self.world.worlds[player].item_name_groups[item_name_group]:
found += self.prog_items[item_name, player]
@@ -678,7 +715,7 @@ class CollectionState():
return True
return False
- def count_group(self, item_name_group: str, player: int):
+ def count_group(self, item_name_group: str, player: int) -> int:
found: int = 0
for item_name in self.world.worlds[player].item_name_groups[item_name_group]:
found += self.prog_items[item_name, player]
@@ -1443,6 +1480,19 @@ class Spoiler():
AutoWorld.call_all(self.world, "write_spoiler_end", outfile)
+class Tutorial(NamedTuple):
+ """Class to build website tutorial pages from a .md file in the world's /docs folder. Order is as follows.
+ Name of the tutorial as it will appear on the site. Concise description covering what the guide will entail.
+ Language the guide is written in. Name of the file ex 'setup_en.md'. Name of the link on the site; game name is
+ filled automatically so 'setup/en' etc. Author or authors."""
+ tutorial_name: str
+ description: str
+ language: str
+ file_name: str
+ link: str
+ author: List[str]
+
+
seeddigits = 20
@@ -1455,4 +1505,4 @@ def get_seed(seed=None) -> int:
from worlds import AutoWorld
-auto_world = AutoWorld.World
\ No newline at end of file
+auto_world = AutoWorld.World
diff --git a/CommonClient.py b/CommonClient.py
index 1603c87faf..bd8e124802 100644
--- a/CommonClient.py
+++ b/CommonClient.py
@@ -17,14 +17,14 @@ if __name__ == "__main__":
Utils.init_logging("TextClient", exception_logger="Client")
from MultiServer import CommandProcessor
-from NetUtils import Endpoint, decode, NetworkItem, encode, JSONtoTextParser, ClientStatus, Permission
+from NetUtils import Endpoint, decode, NetworkItem, encode, JSONtoTextParser, ClientStatus, Permission, NetworkSlot
from Utils import Version, stream_input
from worlds import network_data_package, AutoWorldRegister
import os
logger = logging.getLogger("Client")
-# without terminal we have to use gui mode
+# without terminal, we have to use gui mode
gui_enabled = not sys.stdout or "--nogui" not in sys.argv
@@ -119,11 +119,14 @@ class CommonContext():
starting_reconnect_delay: int = 5
current_reconnect_delay: int = starting_reconnect_delay
command_processor: int = ClientCommandProcessor
- game = None
+ game: typing.Optional[str] = None
ui = None
- keep_alive_task = None
+ ui_task: typing.Optional[asyncio.Task] = None
+ input_task: typing.Optional[asyncio.Task] = None
+ keep_alive_task: typing.Optional[asyncio.Task] = None
items_handling: typing.Optional[int] = None
- current_energy_link_value = 0 # to display in UI, gets set by server
+ slot_info: typing.Dict[int, NetworkSlot]
+ current_energy_link_value: int = 0 # to display in UI, gets set by server
def __init__(self, server_address, password):
# server state
@@ -134,6 +137,7 @@ class CommonContext():
self.server_version = Version(0, 0, 0)
self.hint_cost: typing.Optional[int] = None
self.games: typing.Dict[int, str] = {}
+ self.slot_info = {}
self.permissions = {
"forfeit": "disabled",
"collect": "disabled",
@@ -179,14 +183,26 @@ class CommonContext():
return len(self.checked_locations | self.missing_locations)
async def connection_closed(self):
+ self.reset_server_state()
+ if self.server and self.server.socket is not None:
+ await self.server.socket.close()
+
+ def reset_server_state(self):
self.auth = None
+ self.slot = None
+ self.team = None
self.items_received = []
self.locations_info = {}
self.server_version = Version(0, 0, 0)
- if self.server and self.server.socket is not None:
- await self.server.socket.close()
self.server = None
self.server_task = None
+ self.games = {}
+ self.hint_cost = None
+ self.permissions = {
+ "forfeit": "disabled",
+ "collect": "disabled",
+ "remaining": "disabled",
+ }
# noinspection PyAttributeOutsideInit
def set_getters(self, data_package: dict, network=False):
@@ -207,23 +223,16 @@ class CommonContext():
for location_name, location_id in gamedata["location_name_to_id"].items():
locations_lookup[location_id] = location_name
- def get_item_name_from_id(code: int):
+ def get_item_name_from_id(code: int) -> str:
return item_lookup.get(code, f'Unknown item (ID:{code})')
self.item_name_getter = get_item_name_from_id
- def get_location_name_from_address(address: int):
+ def get_location_name_from_address(address: int) -> str:
return locations_lookup.get(address, f'Unknown location (ID:{address})')
self.location_name_getter = get_location_name_from_address
- @property
- def endpoints(self):
- if self.server:
- return [self.server]
- else:
- return []
-
async def disconnect(self):
if self.server and not self.server.socket.closed:
await self.server.socket.close()
@@ -309,6 +318,10 @@ class CommonContext():
self.input_queue.put_nowait(None)
self.input_requests -= 1
self.keep_alive_task.cancel()
+ if self.ui_task:
+ await self.ui_task
+ if self.input_task:
+ self.input_task.cancel()
# DeathLink hooks
@@ -334,7 +347,7 @@ class CommonContext():
}
}])
- async def update_death_link(self, death_link):
+ async def update_death_link(self, death_link: bool):
old_tags = self.tags.copy()
if death_link:
self.tags.add("DeathLink")
@@ -343,6 +356,27 @@ class CommonContext():
if old_tags != self.tags and self.server and not self.server.socket.closed:
await self.send_msgs([{"cmd": "ConnectUpdate", "tags": self.tags}])
+ def run_gui(self):
+ """Import kivy UI system and start running it as self.ui_task."""
+ from kvui import GameManager
+
+ class TextManager(GameManager):
+ logging_pairs = [
+ ("Client", "Archipelago")
+ ]
+ base_title = "Archipelago Text Client"
+
+ self.ui = TextManager(self)
+ self.ui_task = asyncio.create_task(self.ui.async_run(), name="UI")
+
+ def run_cli(self):
+ if sys.stdin:
+ # steam overlay breaks when starting console_loop
+ if 'gameoverlayrenderer' in os.environ.get('LD_PRELOAD', ''):
+ logger.info("Skipping terminal input, due to conflicting Steam Overlay detected. Please use GUI only.")
+ else:
+ self.input_task = asyncio.create_task(console_loop(self), name="Input")
+
async def keep_alive(ctx: CommonContext, seconds_between_checks=100):
"""some ISPs/network configurations drop TCP connections if no payload is sent (ignore TCP-keep-alive)
@@ -358,7 +392,6 @@ async def keep_alive(ctx: CommonContext, seconds_between_checks=100):
async def server_loop(ctx: CommonContext, address=None):
- cached_address = None
if ctx.server and ctx.server.socket:
logger.error('Already connected')
return
@@ -386,16 +419,12 @@ async def server_loop(ctx: CommonContext, address=None):
await process_server_cmd(ctx, msg)
logger.warning('Disconnected from multiworld server, type /connect to reconnect')
except ConnectionRefusedError:
- if cached_address:
- logger.error('Unable to connect to multiworld server at cached address. '
- 'Please use the connect button above.')
- else:
- logger.exception('Connection refused by the multiworld server')
+ logger.exception('Connection refused by the server. May not be running Archipelago on that address or port.')
except websockets.InvalidURI:
logger.exception('Failed to connect to the multiworld server (invalid URI)')
- except (OSError, websockets.InvalidURI):
+ except OSError:
logger.exception('Failed to connect to the multiworld server')
- except Exception as e:
+ except Exception:
logger.exception('Lost connection to the multiworld server, type /connect to reconnect')
finally:
await ctx.connection_closed()
@@ -467,8 +496,6 @@ async def process_server_cmd(ctx: CommonContext, args: dict):
ctx.event_invalid_slot()
elif 'InvalidGame' in errors:
ctx.event_invalid_game()
- elif 'SlotAlreadyTaken' in errors:
- raise Exception('Player slot already in use for that team')
elif 'IncompatibleVersion' in errors:
raise Exception('Server reported your client version as incompatible')
elif 'InvalidItemsHandling' in errors:
@@ -486,6 +513,8 @@ async def process_server_cmd(ctx: CommonContext, args: dict):
elif cmd == 'Connected':
ctx.team = args["team"]
ctx.slot = args["slot"]
+ # int keys get lost in JSON transfer
+ ctx.slot_info = {int(pid): data for pid, data in args["slot_info"].items()}
ctx.consume_players_package(args["players"])
msgs = []
if ctx.locations_checked:
@@ -565,7 +594,6 @@ async def process_server_cmd(ctx: CommonContext, args: dict):
async def console_loop(ctx: CommonContext):
- import sys
commandprocessor = ctx.command_processor(ctx)
queue = asyncio.Queue()
stream_input(sys.stdin, queue)
@@ -619,36 +647,33 @@ if __name__ == '__main__':
async def main(args):
ctx = TextContext(args.connect, args.password)
+ ctx.auth = args.name
ctx.server_task = asyncio.create_task(server_loop(ctx), name="server loop")
- input_task = None
- steam_overlay = False
if gui_enabled:
- from kvui import TextManager
- ctx.ui = TextManager(ctx)
- ui_task = asyncio.create_task(ctx.ui.async_run(), name="UI")
- steam_overlay = 'gameoverlayrenderer' in os.environ.get('LD_PRELOAD', '')
- else:
- ui_task = None
- if sys.stdin and not steam_overlay: # steam overlay breaks when starting console_loop
- input_task = asyncio.create_task(console_loop(ctx), name="Input")
+ ctx.run_gui()
+ ctx.run_cli()
+
await ctx.exit_event.wait()
-
await ctx.shutdown()
- if ui_task:
- await ui_task
- if input_task:
- input_task.cancel()
import colorama
parser = get_base_parser(description="Gameless Archipelago Client, for text interfacing.")
+ parser.add_argument('--name', default=None, help="Slot Name to connect as.")
+ parser.add_argument("url", nargs="?", help="Archipelago connection url")
+ args = parser.parse_args()
+
+ if args.url:
+ url = urllib.parse.urlparse(args.url)
+ args.connect = url.netloc
+ if url.username:
+ args.name = urllib.parse.unquote(url.username)
+ if url.password:
+ args.password = urllib.parse.unquote(url.password)
- args, rest = parser.parse_known_args()
colorama.init()
- loop = asyncio.get_event_loop()
- loop.run_until_complete(main(args))
- loop.close()
+ asyncio.run(main(args))
colorama.deinit()
diff --git a/FF1Client.py b/FF1Client.py
index c40449682a..f6bd08299f 100644
--- a/FF1Client.py
+++ b/FF1Client.py
@@ -102,6 +102,18 @@ class FF1Context(CommonContext):
f"{receiving_player_name}"
self._set_message(msg, item.item)
+ def run_gui(self):
+ from kvui import GameManager
+
+ class FF1Manager(GameManager):
+ logging_pairs = [
+ ("Client", "Archipelago")
+ ]
+ base_title = "Archipelago Final Fantasy 1 Client"
+
+ self.ui = FF1Manager(self)
+ self.ui_task = asyncio.create_task(self.ui.async_run(), name="UI")
+
def get_payload(ctx: FF1Context):
current_time = time.time()
@@ -175,6 +187,9 @@ async def nes_sync_task(ctx: FF1Context):
asyncio.create_task(parse_locations(data_decoded['locations'], ctx, False))
if not ctx.auth:
ctx.auth = ''.join([chr(i) for i in data_decoded['playerName'] if i != 0])
+ if ctx.auth == '':
+ logger.info("Invalid ROM detected. No player name built into the ROM. Please regenerate"
+ "the ROM using the same link but adding your slot name")
if ctx.awaiting_rom:
await ctx.server_auth(False)
except asyncio.TimeoutError:
@@ -232,14 +247,8 @@ if __name__ == '__main__':
ctx = FF1Context(args.connect, args.password)
ctx.server_task = asyncio.create_task(server_loop(ctx), name="ServerLoop")
if gui_enabled:
- input_task = None
- from kvui import FF1Manager
- ctx.ui = FF1Manager(ctx)
- ui_task = asyncio.create_task(ctx.ui.async_run(), name="UI")
- else:
- input_task = asyncio.create_task(console_loop(ctx), name="Input")
- ui_task = None
-
+ ctx.run_gui()
+ ctx.run_cli()
ctx.nes_sync_task = asyncio.create_task(nes_sync_task(ctx), name="NES Sync")
await ctx.exit_event.wait()
@@ -250,20 +259,12 @@ if __name__ == '__main__':
if ctx.nes_sync_task:
await ctx.nes_sync_task
- if ui_task:
- await ui_task
-
- if input_task:
- input_task.cancel()
-
import colorama
parser = get_base_parser()
- args, rest = parser.parse_known_args()
+ args = parser.parse_args()
colorama.init()
- loop = asyncio.get_event_loop()
- loop.run_until_complete(main(args))
- loop.close()
+ asyncio.run(main(args))
colorama.deinit()
diff --git a/FactorioClient.py b/FactorioClient.py
index 94c6844aa9..31798392dd 100644
--- a/FactorioClient.py
+++ b/FactorioClient.py
@@ -5,7 +5,6 @@ import json
import string
import copy
import subprocess
-import sys
import time
import random
@@ -121,10 +120,24 @@ class FactorioContext(CommonContext):
gained = int(args["original_value"] - args["value"])
gained_text = Utils.format_SI_prefix(gained) + "J"
if gained:
- logger.info(f"EnergyLink: Received {gained_text}. "
- f"{Utils.format_SI_prefix(args['value'])}J remaining.")
+ logger.debug(f"EnergyLink: Received {gained_text}. "
+ f"{Utils.format_SI_prefix(args['value'])}J remaining.")
self.rcon_client.send_command(f"/ap-energylink {gained}")
+ def run_gui(self):
+ from kvui import GameManager
+
+ class FactorioManager(GameManager):
+ logging_pairs = [
+ ("Client", "Archipelago"),
+ ("FactorioServer", "Factorio Server Log"),
+ ("FactorioWatcher", "Bridge Data Log"),
+ ]
+ base_title = "Archipelago Factorio Client"
+
+ self.ui = FactorioManager(self)
+ self.ui_task = asyncio.create_task(self.ui.async_run(), name="UI")
+
async def game_watcher(ctx: FactorioContext):
bridge_logger = logging.getLogger("FactorioWatcher")
@@ -187,7 +200,7 @@ async def game_watcher(ctx: FactorioContext):
}]))
ctx.rcon_client.send_command(
f"/ap-energylink -{value}")
- logger.info(f"EnergyLink: Sent {Utils.format_SI_prefix(value)}J")
+ logger.debug(f"EnergyLink: Sent {Utils.format_SI_prefix(value)}J")
await asyncio.sleep(0.1)
@@ -346,15 +359,11 @@ async def factorio_spinup_server(ctx: FactorioContext) -> bool:
async def main(args):
ctx = FactorioContext(args.connect, args.password)
ctx.server_task = asyncio.create_task(server_loop(ctx), name="ServerLoop")
- input_task = None
+
if gui_enabled:
- from kvui import FactorioManager
- ctx.ui = FactorioManager(ctx)
- ui_task = asyncio.create_task(ctx.ui.async_run(), name="UI")
- else:
- ui_task = None
- if sys.stdin:
- input_task = asyncio.create_task(console_loop(ctx), name="Input")
+ ctx.run_gui()
+ ctx.run_cli()
+
factorio_server_task = asyncio.create_task(factorio_spinup_server(ctx), name="FactorioSpinupServer")
successful_launch = await factorio_server_task
if successful_launch:
@@ -370,12 +379,6 @@ async def main(args):
await ctx.shutdown()
- if ui_task:
- await ui_task
-
- if input_task:
- input_task.cancel()
-
class FactorioJSONtoTextParser(JSONtoTextParser):
def _handle_color(self, node: JSONMessagePart):
@@ -416,7 +419,5 @@ if __name__ == '__main__':
server_args = ("--rcon-port", rcon_port, "--rcon-password", rcon_password, *rest)
- loop = asyncio.get_event_loop()
- loop.run_until_complete(main(args))
- loop.close()
+ asyncio.run(main(args))
colorama.deinit()
diff --git a/Fill.py b/Fill.py
index 9f5b62ecac..855f86caef 100644
--- a/Fill.py
+++ b/Fill.py
@@ -166,7 +166,7 @@ def distribute_items_restrictive(world: MultiWorld) -> None:
defaultlocations = locations[LocationProgressType.DEFAULT]
excludedlocations = locations[LocationProgressType.EXCLUDED]
- fill_restrictive(world, world.state, prioritylocations, progitempool)
+ fill_restrictive(world, world.state, prioritylocations, progitempool, lock=True)
if prioritylocations:
defaultlocations = prioritylocations + defaultlocations
@@ -220,15 +220,15 @@ def distribute_items_restrictive(world: MultiWorld) -> None:
restitempool, defaultlocations = fast_fill(
world, restitempool, defaultlocations)
unplaced = progitempool + restitempool
- unfilled = [location.name for location in defaultlocations]
+ unfilled = defaultlocations
if unplaced or unfilled:
logging.warning(
f'Unplaced items({len(unplaced)}): {unplaced} - Unfilled Locations({len(unfilled)}): {unfilled}')
- items_counter = Counter([location.item.player for location in world.get_locations() if location.item])
- locations_counter = Counter([location.player for location in world.get_locations()])
- items_counter.update([item.player for item in unplaced])
- locations_counter.update([location.player for location in unfilled])
+ items_counter = Counter(location.item.player for location in world.get_locations() if location.item)
+ locations_counter = Counter(location.player for location in world.get_locations())
+ items_counter.update(item.player for item in unplaced)
+ locations_counter.update(location.player for location in unfilled)
print_data = {"items": items_counter, "locations": locations_counter}
logging.info(f'Per-Player counts: {print_data})')
@@ -305,16 +305,21 @@ def flood_items(world: MultiWorld) -> None:
def balance_multiworld_progression(world: MultiWorld) -> None:
# A system to reduce situations where players have no checks remaining, popularly known as "BK mode."
- # Overall progression balancing algorithm:
+ # Overall progression balancing algorithm:
# Gather up all locations in a sphere.
# Define a threshold value based on the player with the most available locations.
# If other players are below the threshold value, swap progression in this sphere into earlier spheres,
# which gives more locations available by this sphere.
- balanceable_players: typing.Set[int] = {player for player in world.player_ids if world.progression_balancing[player]}
+ balanceable_players: typing.Dict[int, float] = {
+ player: world.progression_balancing[player] / 100
+ for player in world.player_ids
+ if world.progression_balancing[player] > 0
+ }
if not balanceable_players:
logging.info('Skipping multiworld progression balancing.')
else:
logging.info(f'Balancing multiworld progression for {len(balanceable_players)} Players.')
+ logging.debug(balanceable_players)
state: CollectionState = CollectionState(world)
checked_locations: typing.Set[Location] = set()
unchecked_locations: typing.Set[Location] = set(world.get_locations())
@@ -324,10 +329,16 @@ def balance_multiworld_progression(world: MultiWorld) -> None:
for player in world.player_ids
if len(world.get_filled_locations(player)) != 0
}
- total_locations_count: Counter = Counter(location.player for location in world.get_locations() if
- not location.locked)
- balanceable_players = {player for player in balanceable_players if
- total_locations_count[player]}
+ total_locations_count: typing.Counter[int] = Counter(
+ location.player
+ for location in world.get_locations()
+ if not location.locked
+ )
+ balanceable_players = {
+ player: balanceable_players[player]
+ for player in balanceable_players
+ if total_locations_count[player]
+ }
sphere_num: int = 1
moved_item_count: int = 0
@@ -359,13 +370,19 @@ def balance_multiworld_progression(world: MultiWorld) -> None:
sphere_num += 1
if checked_locations:
- # The 10% threshold can be modified for "progression balancing strength"
- # right now it approximates the old 20/216 bound.
- threshold_percentage = max(map(lambda p: item_percentage(p, reachable_locations_count[p]),
- reachable_locations_count)) - 0.10
- logging.debug(f"Threshold: {threshold_percentage}")
- balancing_players = {player for player, reachables in reachable_locations_count.items() if
- item_percentage(player, reachables) < threshold_percentage and player in balanceable_players}
+ max_percentage = max(map(lambda p: item_percentage(p, reachable_locations_count[p]),
+ reachable_locations_count))
+ threshold_percentages = {
+ player: max_percentage * balanceable_players[player]
+ for player in balanceable_players
+ }
+ logging.debug(f"Thresholds: {threshold_percentages}")
+ balancing_players = {
+ player
+ for player, reachables in reachable_locations_count.items()
+ if (player in threshold_percentages
+ and item_percentage(player, reachables) < threshold_percentages[player])
+ }
if balancing_players:
balancing_state = state.copy()
balancing_unchecked_locations = unchecked_locations.copy()
@@ -391,8 +408,9 @@ def balance_multiworld_progression(world: MultiWorld) -> None:
if not location.locked:
balancing_reachables[location.player] += 1
if world.has_beaten_game(balancing_state) or all(
- item_percentage(player, reachables) >= threshold_percentage
- for player, reachables in balancing_reachables.items()):
+ item_percentage(player, reachables) >= threshold_percentages[player]
+ for player, reachables in balancing_reachables.items()
+ if player in threshold_percentages):
break
elif not balancing_sphere:
raise RuntimeError('Not all required items reachable. Something went terribly wrong here.')
@@ -404,7 +422,9 @@ def balance_multiworld_progression(world: MultiWorld) -> None:
items_to_replace: typing.List[Location] = []
for player in balancing_players:
locations_to_test = unlocked_locations[player]
- items_to_test = candidate_items[player]
+ items_to_test = list(candidate_items[player])
+ items_to_test.sort()
+ world.random.shuffle(items_to_test)
while items_to_test:
testing = items_to_test.pop()
reducing_state = state.copy()
@@ -422,7 +442,7 @@ def balance_multiworld_progression(world: MultiWorld) -> None:
else:
reduced_sphere = get_sphere_locations(reducing_state, locations_to_test)
p = item_percentage(player, reachable_locations_count[player] + len(reduced_sphere))
- if p < threshold_percentage:
+ if p < threshold_percentages[player]:
items_to_replace.append(testing)
replaced_items = False
diff --git a/Launcher.py b/Launcher.py
index 9ebba4e684..acf235ff8a 100644
--- a/Launcher.py
+++ b/Launcher.py
@@ -152,6 +152,8 @@ components: Iterable[Component] = (
Component('FF1 Client', 'FF1Client'),
# ChecksFinder
Component('ChecksFinder Client', 'ChecksFinderClient'),
+ # Starcraft 2
+ Component('Starcraft 2 Client', 'Starcraft2Client'),
# Functions
Component('Open host.yaml', func=open_host_yaml),
Component('Open Patch', func=open_patch),
diff --git a/LttPAdjuster.py b/LttPAdjuster.py
index 8835fdc213..a34d9f89d6 100644
--- a/LttPAdjuster.py
+++ b/LttPAdjuster.py
@@ -513,25 +513,29 @@ def get_rom_frame(parent=None):
def get_rom_options_frame(parent=None):
adjuster_settings = get_adjuster_settings(GAME_ALTTP)
+ defaults = {
+ "auto_apply": 'ask',
+ "music": True,
+ "reduceflashing": True,
+ "deathlink": False,
+ "sprite": None,
+ "quickswap": True,
+ "menuspeed": 'normal',
+ "heartcolor": 'red',
+ "heartbeep": 'normal',
+ "ow_palettes": 'default',
+ "uw_palettes": 'default',
+ "hud_palettes": 'default',
+ "sword_palettes": 'default',
+ "shield_palettes": 'default',
+ "sprite_pool": [],
+ "allowcollect": False,
+ }
if not adjuster_settings:
adjuster_settings = Namespace()
- adjuster_settings.auto_apply = 'ask'
- adjuster_settings.music = True
- adjuster_settings.reduceflashing = True
- adjuster_settings.deathlink = False
- adjuster_settings.allowcollect = False
- adjuster_settings.sprite = None
- adjuster_settings.quickswap = True
- adjuster_settings.menuspeed = 'normal'
- adjuster_settings.heartcolor = 'red'
- adjuster_settings.heartbeep = 'normal'
- adjuster_settings.ow_palettes = 'default'
- adjuster_settings.uw_palettes = 'default'
- adjuster_settings.hud_palettes = 'default'
- adjuster_settings.sword_palettes = 'default'
- adjuster_settings.shield_palettes = 'default'
- if not hasattr(adjuster_settings, 'sprite_pool'):
- adjuster_settings.sprite_pool = []
+ for key, defaultvalue in defaults.items():
+ if not hasattr(adjuster_settings, key):
+ setattr(adjuster_settings, key, defaultvalue)
romOptionsFrame = LabelFrame(parent, text="Rom options")
romOptionsFrame.columnconfigure(0, weight=1)
diff --git a/Main.py b/Main.py
index dcef439220..04ac212431 100644
--- a/Main.py
+++ b/Main.py
@@ -17,7 +17,7 @@ from worlds.alttp.Regions import lookup_vanilla_location_to_entrance
from Fill import distribute_items_restrictive, flood_items, balance_multiworld_progression, distribute_planned
from worlds.alttp.Shops import SHOP_ID_START, total_shop_slots, FillDisabledShopSlots
from Utils import output_path, get_options, __version__, version_tuple
-from worlds.generic.Rules import locality_rules, exclusion_rules
+from worlds.generic.Rules import locality_rules, exclusion_rules, group_locality_rules
from worlds import AutoWorld
ordered_areas = (
@@ -86,12 +86,14 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No
numlength = 8
for name, cls in AutoWorld.AutoWorldRegister.world_types.items():
if not cls.hidden:
- logger.info(f" {name:{longest_name}}: {len(cls.item_names):3} Items | "
- f"{len(cls.location_names):3} Locations")
- logger.info(f" Item IDs: {min(cls.item_id_to_name):{numlength}} - "
- f"{max(cls.item_id_to_name):{numlength}} | "
- f"Location IDs: {min(cls.location_id_to_name):{numlength}} - "
- f"{max(cls.location_id_to_name):{numlength}}")
+ logger.info(f" {name:{longest_name}}: {len(cls.item_names):3} "
+ f"Items (IDs: {min(cls.item_id_to_name):{numlength}} - "
+ f"{max(cls.item_id_to_name):{numlength}}) | "
+ f"{len(cls.location_names):3} "
+ f"Locations (IDs: {min(cls.location_id_to_name):{numlength}} - "
+ f"{max(cls.location_id_to_name):{numlength}})")
+
+ AutoWorld.call_stage(world, "assert_generate")
AutoWorld.call_all(world, "generate_early")
@@ -125,6 +127,7 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No
if world.players > 1:
for player in world.player_ids:
locality_rules(world, player)
+ group_locality_rules(world)
else:
world.non_local_items[1].value = set()
world.local_items[1].value = set()
diff --git a/MinecraftClient.py b/MinecraftClient.py
index 5c0fc535e0..d75f6d0ff5 100644
--- a/MinecraftClient.py
+++ b/MinecraftClient.py
@@ -1,4 +1,5 @@
import argparse
+import json
import os
import sys
import re
@@ -17,7 +18,6 @@ atexit.register(input, "Press enter to exit.")
# 1 or more digits followed by m or g, then optional b
max_heap_re = re.compile(r"^\d+[mMgG][bB]?$")
-forge_version = "1.17.1-37.1.1"
is_windows = sys.platform in ("win32", "cygwin", "msys")
@@ -34,8 +34,8 @@ def prompt_yes_no(prompt):
print('Please respond with "y" or "n".')
-# Create mods folder if needed; find AP randomizer jar; return None if not found.
def find_ap_randomizer_jar(forge_dir):
+ """Create mods folder if needed; find AP randomizer jar; return None if not found."""
mods_dir = os.path.join(forge_dir, 'mods')
if os.path.isdir(mods_dir):
for entry in os.scandir(mods_dir):
@@ -49,8 +49,8 @@ def find_ap_randomizer_jar(forge_dir):
return None
-# Create APData folder if needed; clean .apmc files from APData; copy given .apmc into directory.
def replace_apmc_files(forge_dir, apmc_file):
+ """Create APData folder if needed; clean .apmc files from APData; copy given .apmc into directory."""
if apmc_file is None:
return
apdata_dir = os.path.join(forge_dir, 'APData')
@@ -72,27 +72,21 @@ def replace_apmc_files(forge_dir, apmc_file):
def read_apmc_file(apmc_file):
from base64 import b64decode
- import json
with open(apmc_file, 'r') as f:
- data = json.loads(b64decode(f.read()))
- return data
+ return json.loads(b64decode(f.read()))
-# Check mod version, download new mod from GitHub releases page if needed.
-def update_mod(forge_dir, apmc_file, get_prereleases=False):
+def update_mod(forge_dir, minecraft_version: str, get_prereleases=False):
+ """Check mod version, download new mod from GitHub releases page if needed. """
ap_randomizer = find_ap_randomizer_jar(forge_dir)
- if apmc_file is not None:
- data = read_apmc_file(apmc_file)
- minecraft_version = data.get('minecraft_version', '')
-
client_releases_endpoint = "https://api.github.com/repos/KonoTyran/Minecraft_AP_Randomizer/releases"
resp = requests.get(client_releases_endpoint)
if resp.status_code == 200: # OK
try:
- latest_release = next(filter(lambda release: (not release['prerelease'] or get_prereleases) and
- (apmc_file is None or minecraft_version in release['assets'][0]['name']),
+ latest_release = next(filter(lambda release: (not release['prerelease'] or get_prereleases) and
+ (minecraft_version in release['assets'][0]['name']),
resp.json()))
if ap_randomizer != latest_release['assets'][0]['name']:
logging.info(f"A new release of the Minecraft AP randomizer mod was found: "
@@ -128,8 +122,8 @@ def update_mod(forge_dir, apmc_file, get_prereleases=False):
sys.exit(0)
-# Check if the EULA is agreed to, and prompt the user to read and agree if necessary.
def check_eula(forge_dir):
+ """Check if the EULA is agreed to, and prompt the user to read and agree if necessary."""
eula_path = os.path.join(forge_dir, "eula.txt")
if not os.path.isfile(eula_path):
# Create eula.txt
@@ -152,17 +146,18 @@ def check_eula(forge_dir):
sys.exit(0)
-# get the current JDK16
-def find_jdk_dir() -> str:
+def find_jdk_dir(version: str) -> str:
+ """get the specified versions jdk directory"""
for entry in os.listdir():
- if os.path.isdir(entry) and entry.startswith("jdk16"):
+ if os.path.isdir(entry) and entry.startswith(f"jdk{version}"):
return os.path.abspath(entry)
-# get the java exe location
-def find_jdk() -> str:
+def find_jdk(version: str) -> str:
+ """get the java exe location"""
+
if is_windows:
- jdk = find_jdk_dir()
+ jdk = find_jdk_dir(version)
jdk_exe = os.path.join(jdk, "bin", "java.exe")
if os.path.isfile(jdk_exe):
return jdk_exe
@@ -173,16 +168,17 @@ def find_jdk() -> str:
return jdk_exe
-# Download Corretto 16 (Amazon JDK)
-def download_java():
- jdk = find_jdk_dir()
+def download_java(java: str):
+ """Download Corretto (Amazon JDK)"""
+
+ jdk = find_jdk_dir(java)
if jdk is not None:
print(f"Removing old JDK...")
from shutil import rmtree
rmtree(jdk)
print(f"Downloading Java...")
- jdk_url = "https://corretto.aws/downloads/latest/amazon-corretto-16-x64-windows-jdk.zip"
+ jdk_url = f"https://corretto.aws/downloads/latest/amazon-corretto-{java}-x64-windows-jdk.zip"
resp = requests.get(jdk_url)
if resp.status_code == 200: # OK
print(f"Extracting...")
@@ -197,9 +193,10 @@ def download_java():
sys.exit(0)
-# download and install forge
-def install_forge(directory: str):
- jdk = find_jdk()
+def install_forge(directory: str, forge_version: str, java_version: str):
+ """download and install forge"""
+
+ jdk = find_jdk(java_version)
if jdk is not None:
print(f"Downloading Forge {forge_version}...")
forge_url = f"https://maven.minecraftforge.net/net/minecraftforge/forge/{forge_version}/forge-{forge_version}-installer.jar"
@@ -211,20 +208,20 @@ def install_forge(directory: str):
with open(forge_install_jar, 'wb') as f:
f.write(resp.content)
print(f"Installing Forge...")
- argstring = ' '.join([jdk, "-jar", "\"" + forge_install_jar+ "\"", "--installServer", "\"" + directory + "\""])
+ argstring = ' '.join([jdk, "-jar", "\"" + forge_install_jar + "\"", "--installServer", "\"" + directory + "\""])
install_process = Popen(argstring, shell=not is_windows)
install_process.wait()
os.remove(forge_install_jar)
-# Run the Forge server. Return process object
-def run_forge_server(forge_dir: str, heap_arg):
+def run_forge_server(forge_dir: str, java_version: str, heap_arg: str) -> Popen:
+ """Run the Forge server."""
- java_exe = find_jdk()
+ java_exe = find_jdk(java_version)
if not os.path.isfile(java_exe):
java_exe = "java" # try to fall back on java in the PATH
- heap_arg = max_heap_re.match(max_heap).group()
+ heap_arg = max_heap_re.match(heap_arg).group()
if heap_arg[-1] in ['b', 'B']:
heap_arg = heap_arg[:-1]
heap_arg = "-Xmx" + heap_arg
@@ -242,46 +239,109 @@ def run_forge_server(forge_dir: str, heap_arg):
return Popen(argstring, shell=not is_windows)
+def get_minecraft_versions(version, release_channel="release"):
+ version_file_endpoint = "https://raw.githubusercontent.com/KonoTyran/Minecraft_AP_Randomizer/master/versions/minecraft_versions.json"
+ resp = requests.get(version_file_endpoint)
+ local = False
+ if resp.status_code == 200: # OK
+ try:
+ data = resp.json()
+ except requests.exceptions.JSONDecodeError:
+ logging.warning(f"Unable to fetch version update file, using local version. (status code {resp.status_code}).")
+ local = True
+ else:
+ logging.warning(f"Unable to fetch version update file, using local version. (status code {resp.status_code}).")
+ local = True
+
+ if local:
+ with open(Utils.local_path("minecraft_versions.json"), 'r') as f:
+ data = json.load(f)
+ else:
+ with open(Utils.local_path("minecraft_versions.json"), 'w') as f:
+ json.dump(data, f)
+
+ try:
+ if version:
+ return next(filter(lambda entry: entry["version"] == version, data[release_channel]))
+ else:
+ return resp.json()[release_channel][0]
+ except StopIteration:
+ logging.error(f"No compatible mod version found for client version {version}.")
+
+
+def is_correct_forge(forge_dir) -> bool:
+ if os.path.isdir(os.path.join(forge_dir, "libraries", "net", "minecraftforge", "forge", forge_version)):
+ return True
+ return False
+
+
if __name__ == '__main__':
Utils.init_logging("MinecraftClient")
parser = argparse.ArgumentParser()
parser.add_argument("apmc_file", default=None, nargs='?', help="Path to an Archipelago Minecraft data file (.apmc)")
- parser.add_argument('--install', '-i', dest='install', default=False, action='store_true',
- help="Download and install Java and the Forge server. Does not launch the client afterwards.")
- parser.add_argument('--prerelease', default=False, action='store_true',
- help="Auto-update prerelease versions.")
+ parser.add_argument('--install', '-i', dest='install', default=False, action='store_true',
+ help="Download and install Java and the Forge server. Does not launch the client afterwards.")
+ parser.add_argument('--release_channel', '-r', dest="channel", type=str, action='store',
+ help="Specify release channel to use.")
+ parser.add_argument('--java', '-j', metavar='17', dest='java', type=str, default=False, action='store',
+ help="specify java version.")
+ parser.add_argument('--forge', '-f', metavar='1.18.2-40.1.0', dest='forge', type=str, default=False, action='store',
+ help="specify forge version. (Minecraft Version-Forge Version)")
args = parser.parse_args()
apmc_file = os.path.abspath(args.apmc_file) if args.apmc_file else None
# Change to executable's working directory
os.chdir(os.path.abspath(os.path.dirname(sys.argv[0])))
-
+
options = Utils.get_options()
+ channel = args.channel or options["minecraft_options"]["release_channel"]
+ apmc_data = None
+ data_version = None
+
+ if apmc_file is not None:
+ apmc_data = read_apmc_file(apmc_file)
+ data_version = apmc_data.get('client_version', '')
+
+ versions = get_minecraft_versions(data_version, channel)
+
forge_dir = options["minecraft_options"]["forge_directory"]
max_heap = options["minecraft_options"]["max_heap_size"]
+ forge_version = args.forge or versions["forge"]
+ java_version = args.java or versions["java"]
+ java_dir = find_jdk_dir(java_version)
if args.install:
if is_windows:
print("Installing Java and Minecraft Forge")
- download_java()
+ download_java(java_version)
else:
print("Installing Minecraft Forge")
- install_forge(forge_dir)
+ install_forge(forge_dir, forge_version, java_version)
sys.exit(0)
- if apmc_file is not None and not os.path.isfile(apmc_file):
- raise FileNotFoundError(f"Path {apmc_file} does not exist or could not be accessed.")
- if not os.path.isdir(forge_dir):
- if prompt_yes_no("Did not find forge directory. Download and install forge now?"):
- install_forge(forge_dir)
+ if apmc_data is None:
+ raise FileNotFoundError(f"APMC file does not exist or is inaccessible at the given location ({apmc_file})")
+
+ if is_windows:
+ if java_dir is None or not os.path.isdir(java_dir):
+ if prompt_yes_no("Did not find java directory. Download and install java now?"):
+ download_java(java_version)
+ java_dir = find_jdk_dir(java_version)
+ if java_dir is None or not os.path.isdir(java_dir):
+ raise NotADirectoryError(f"Path {java_dir} does not exist or could not be accessed.")
+
+ if not is_correct_forge(forge_dir):
+ if prompt_yes_no(f"Did not find forge version {forge_version} download and install it now?"):
+ install_forge(forge_dir, forge_version, java_version)
if not os.path.isdir(forge_dir):
raise NotADirectoryError(f"Path {forge_dir} does not exist or could not be accessed.")
+
if not max_heap_re.match(max_heap):
raise Exception(f"Max heap size {max_heap} in incorrect format. Use a number followed by M or G, e.g. 512M or 2G.")
- update_mod(forge_dir, apmc_file, args.prerelease)
+ update_mod(forge_dir, f"MC{forge_version.split('-')[0]}", channel != "release")
replace_apmc_files(forge_dir, apmc_file)
check_eula(forge_dir)
- server_process = run_forge_server(forge_dir, max_heap)
+ server_process = run_forge_server(forge_dir, java_version, max_heap)
server_process.wait()
diff --git a/ModuleUpdate.py b/ModuleUpdate.py
index d8b011715d..17eb0906b1 100644
--- a/ModuleUpdate.py
+++ b/ModuleUpdate.py
@@ -62,6 +62,9 @@ if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Install archipelago requirements')
parser.add_argument('-y', '--yes', dest='yes', action='store_true', help='answer "yes" to all questions')
parser.add_argument('-f', '--force', dest='force', action='store_true', help='force update')
+ parser.add_argument('-a', '--append', nargs="*", dest='additional_requirements',
+ help='List paths to additional requirement files.')
args = parser.parse_args()
-
+ if args.additional_requirements:
+ requirements_files.update(args.additional_requirements)
update(args.yes, args.force)
diff --git a/MultiServer.py b/MultiServer.py
index ca113a2c5a..a11a2649d2 100644
--- a/MultiServer.py
+++ b/MultiServer.py
@@ -24,8 +24,6 @@ ModuleUpdate.update()
import websockets
import colorama
-from thefuzz import process as fuzzy_process
-
import NetUtils
from worlds.AutoWorld import AutoWorldRegister
@@ -907,7 +905,7 @@ def json_format_send_event(net_item: NetworkItem, receiving_player: int):
def get_intended_text(input_text: str, possible_answers) -> typing.Tuple[str, bool, str]:
- picks = fuzzy_process.extract(input_text, possible_answers, limit=2)
+ picks = Utils.get_fuzzy_results(input_text, possible_answers, limit=2)
if len(picks) > 1:
dif = picks[0][1] - picks[1][1]
if picks[0][1] == 100:
@@ -1060,7 +1058,10 @@ class ClientMessageProcessor(CommonCommandProcessor):
@mark_raw
def _cmd_admin(self, command: str = ""):
- """Allow remote administration of the multiworld server"""
+ """Allow remote administration of the multiworld server
+ Usage: "!admin login " in order to log in to the remote interface.
+ Once logged in, you can then use "!admin " to issue commands.
+ If you need further help once logged in. use "!admin /help" """
output = f"!admin {command}"
if output.lower().startswith(
@@ -1466,7 +1467,13 @@ async def process_client_cmd(ctx: Context, client: Client, args: dict):
elif cmd == "GetDataPackage":
exclusions = args.get("exclusions", [])
- if exclusions:
+ if "games" in args:
+ games = {name: game_data for name, game_data in network_data_package["games"].items()
+ if name in set(args.get("games", []))}
+ await ctx.send_msgs(client, [{"cmd": "DataPackage",
+ "data": {"games": games}}])
+ # TODO: remove exclusions behaviour around 0.5.0
+ elif exclusions:
exclusions = set(exclusions)
games = {name: game_data for name, game_data in network_data_package["games"].items()
if name not in exclusions}
@@ -1474,6 +1481,7 @@ async def process_client_cmd(ctx: Context, client: Client, args: dict):
package["games"] = games
await ctx.send_msgs(client, [{"cmd": "DataPackage",
"data": package}])
+
else:
await ctx.send_msgs(client, [{"cmd": "DataPackage",
"data": network_data_package}])
@@ -1811,7 +1819,7 @@ class ServerCommandProcessor(CommonCommandProcessor):
return False
def _cmd_option(self, option_name: str, option: str):
- """Set options for the server. Warning: expires on restart"""
+ """Set options for the server."""
attrtype = self.ctx.simple_options.get(option_name, None)
if attrtype:
diff --git a/NetUtils.py b/NetUtils.py
index c581175673..9b207715b3 100644
--- a/NetUtils.py
+++ b/NetUtils.py
@@ -111,6 +111,7 @@ def get_any_version(data: dict) -> Version:
whitelist = {
"NetworkPlayer": NetworkPlayer,
"NetworkItem": NetworkItem,
+ "NetworkSlot": NetworkSlot
}
custom_hooks = {
diff --git a/OoTClient.py b/OoTClient.py
index a469f225c3..e455efdcd3 100644
--- a/OoTClient.py
+++ b/OoTClient.py
@@ -48,9 +48,12 @@ deathlink_sent_this_death: we interacted with the multiworld on this death, wait
oot_loc_name_to_id = network_data_package["games"]["Ocarina of Time"]["location_name_to_id"]
+script_version: int = 1
+
def get_item_value(ap_id):
return ap_id - 66000
+
class OoTCommandProcessor(ClientCommandProcessor):
def __init__(self, ctx):
super().__init__(ctx)
@@ -60,6 +63,13 @@ class OoTCommandProcessor(ClientCommandProcessor):
if isinstance(self.ctx, OoTContext):
logger.info(f"N64 Status: {self.ctx.n64_status}")
+ def _cmd_deathlink(self):
+ """Toggle deathlink from client. Overrides default setting."""
+ if isinstance(self.ctx, OoTContext):
+ self.ctx.deathlink_client_override = True
+ self.ctx.deathlink_enabled = not self.ctx.deathlink_enabled
+ asyncio.create_task(self.ctx.update_death_link(self.ctx.deathlink_enabled), name="Update Deathlink")
+
class OoTContext(CommonContext):
command_processor = OoTCommandProcessor
@@ -76,6 +86,8 @@ class OoTContext(CommonContext):
self.deathlink_enabled = False
self.deathlink_pending = False
self.deathlink_sent_this_death = False
+ self.deathlink_client_override = False
+ self.version_warning = False
async def server_auth(self, password_requested: bool = False):
if password_requested and not self.password:
@@ -91,6 +103,18 @@ class OoTContext(CommonContext):
self.deathlink_pending = True
super().on_deathlink(data)
+ def run_gui(self):
+ from kvui import GameManager
+
+ class OoTManager(GameManager):
+ logging_pairs = [
+ ("Client", "Archipelago")
+ ]
+ base_title = "Archipelago Ocarina of Time Client"
+
+ self.ui = OoTManager(self)
+ self.ui_task = asyncio.create_task(self.ui.async_run(), name="UI")
+
def get_payload(ctx: OoTContext):
if ctx.deathlink_enabled and ctx.deathlink_pending:
@@ -108,8 +132,8 @@ def get_payload(ctx: OoTContext):
async def parse_payload(payload: dict, ctx: OoTContext, force: bool):
- # Turn on deathlink if it is on
- if payload['deathlinkActive'] and not ctx.deathlink_enabled:
+ # Turn on deathlink if it is on, and if the client hasn't overriden it
+ if payload['deathlinkActive'] and not ctx.deathlink_enabled and not ctx.deathlink_client_override:
await ctx.update_death_link(True)
ctx.deathlink_enabled = True
@@ -152,21 +176,30 @@ async def n64_sync_task(ctx: OoTContext):
try:
await asyncio.wait_for(writer.drain(), timeout=1.5)
try:
- # Data will return a dict with up to five fields:
+ # Data will return a dict with up to six fields:
# 1. str: player name (always)
- # 2. bool: deathlink active (always)
- # 3. dict[str, bool]: checked locations
- # 4. bool: whether Link is currently at 0 HP
- # 5. bool: whether the game currently registers as complete
+ # 2. int: script version (always)
+ # 3. bool: deathlink active (always)
+ # 4. dict[str, bool]: checked locations
+ # 5. bool: whether Link is currently at 0 HP
+ # 6. bool: whether the game currently registers as complete
data = await asyncio.wait_for(reader.readline(), timeout=10)
data_decoded = json.loads(data.decode())
- if ctx.game is not None and 'locations' in data_decoded:
- # Not just a keep alive ping, parse
- asyncio.create_task(parse_payload(data_decoded, ctx, False))
- if not ctx.auth:
- ctx.auth = data_decoded['playerName']
- if ctx.awaiting_rom:
- await ctx.server_auth(False)
+ reported_version = data_decoded.get('scriptVersion', 0)
+ if reported_version == script_version:
+ if ctx.game is not None and 'locations' in data_decoded:
+ # Not just a keep alive ping, parse
+ asyncio.create_task(parse_payload(data_decoded, ctx, False))
+ if not ctx.auth:
+ ctx.auth = data_decoded['playerName']
+ if ctx.awaiting_rom:
+ await ctx.server_auth(False)
+ else:
+ if not ctx.version_warning:
+ logger.warning(f"Your Lua script is version {reported_version}, expected {script_version}. "
+ "Please update to the latest version. "
+ "Your connection to the Archipelago server will not be accepted.")
+ ctx.version_warning = True
except asyncio.TimeoutError:
logger.debug("Read Timed Out, Reconnecting")
error_status = CONNECTION_TIMING_OUT_STATUS
@@ -253,13 +286,8 @@ if __name__ == '__main__':
ctx = OoTContext(args.connect, args.password)
ctx.server_task = asyncio.create_task(server_loop(ctx), name="Server Loop")
if gui_enabled:
- input_task = None
- from kvui import OoTManager
- ctx.ui = OoTManager(ctx)
- ui_task = asyncio.create_task(ctx.ui.async_run(), name="UI")
- else:
- input_task = asyncio.create_task(console_loop(ctx), name="Input")
- ui_task = None
+ ctx.run_gui()
+ ctx.run_cli()
ctx.n64_sync_task = asyncio.create_task(n64_sync_task(ctx), name="N64 Sync")
@@ -271,17 +299,9 @@ if __name__ == '__main__':
if ctx.n64_sync_task:
await ctx.n64_sync_task
- if ui_task:
- await ui_task
-
- if input_task:
- input_task.cancel()
-
import colorama
colorama.init()
- loop = asyncio.get_event_loop()
- loop.run_until_complete(main())
- loop.close()
+ asyncio.run(main())
colorama.deinit()
diff --git a/Options.py b/Options.py
index 5ff5a67573..2fdb92dae7 100644
--- a/Options.py
+++ b/Options.py
@@ -5,7 +5,8 @@ import numbers
import typing
import random
-from schema import Schema, And, Or
+from schema import Schema, And, Or, Optional
+from Utils import get_fuzzy_results
class AssembleOptions(abc.ABCMeta):
@@ -413,6 +414,15 @@ class Range(NumericOption):
return cls(cls.range_end)
elif text == "low":
return cls(cls.range_start)
+ elif cls.range_start == 0 \
+ and hasattr(cls, "default") \
+ and cls.default != 0 \
+ and text in ("true", "false"):
+ # these are the conditions where "true" and "false" make sense
+ if text == "true":
+ return cls(cls.default)
+ else: # "false"
+ return cls(0)
return cls(int(text))
@classmethod
@@ -456,13 +466,17 @@ class VerifyKeys:
if self.verify_item_name:
for item_name in self.value:
if item_name not in world.item_names:
+ picks = get_fuzzy_results(item_name, world.item_names, limit=1)
raise Exception(f"Item {item_name} from option {self} "
- f"is not a valid item name from {world.game}")
+ f"is not a valid item name from {world.game}. "
+ f"Did you mean '{picks[0][0]}' ({picks[0][1]}% sure)")
elif self.verify_location_name:
for location_name in self.value:
if location_name not in world.location_names:
+ picks = get_fuzzy_results(location_name, world.location_names, limit=1)
raise Exception(f"Location {location_name} from option {self} "
- f"is not a valid location name from {world.game}")
+ f"is not a valid location name from {world.game}. "
+ f"Did you mean '{picks[0][0]}' ({picks[0][1]}% sure)")
class OptionDict(Option[typing.Dict[str, typing.Any]], VerifyKeys):
@@ -567,8 +581,12 @@ class Accessibility(Choice):
default = 1
-class ProgressionBalancing(DefaultOnToggle):
- """A system that moves progression earlier, to try and prevent the player from getting stuck and bored early."""
+class ProgressionBalancing(Range):
+ """A system that can move progression earlier, to try and prevent the player from getting stuck and bored early.
+ [0-99, default 50] A lower setting means more getting stuck. A higher setting means less getting stuck."""
+ default = 50
+ range_start = 0
+ range_end = 99
display_name = "Progression Balancing"
@@ -607,6 +625,7 @@ class StartHints(ItemSet):
class StartLocationHints(OptionSet):
"""Start with these locations and their item prefilled into the !hint command"""
display_name = "Start Location Hints"
+ verify_location_name = True
class ExcludeLocations(OptionSet):
@@ -633,10 +652,31 @@ class ItemLinks(OptionList):
{
"name": And(str, len),
"item_pool": [And(str, len)],
- "replacement_item": Or(And(str, len), None)
+ Optional("exclude"): [And(str, len)],
+ "replacement_item": Or(And(str, len), None),
+ Optional("local_items"): [And(str, len)],
+ Optional("non_local_items"): [And(str, len)]
}
])
+ @staticmethod
+ def verify_items(items: typing.List[str], item_link: str, pool_name: str, world, allow_item_groups: bool = True) -> typing.Set:
+ pool = set()
+ for item_name in items:
+ if item_name not in world.item_names and (not allow_item_groups or item_name not in world.item_name_groups):
+ picks = get_fuzzy_results(item_name, world.item_names, limit=1)
+ picks_group = get_fuzzy_results(item_name, world.item_name_groups.keys(), limit=1)
+ picks_group = f" or '{picks_group[0][0]}' ({picks_group[0][1]}% sure)" if allow_item_groups else ""
+
+ raise Exception(f"Item {item_name} from item link {item_link} "
+ f"is not a valid item from {world.game} for {pool_name}. "
+ f"Did you mean '{picks[0][0]}' ({picks[0][1]}% sure){picks_group}")
+ if allow_item_groups:
+ pool |= world.item_name_groups.get(item_name, {item_name})
+ else:
+ pool |= {item_name}
+ return pool
+
def verify(self, world):
super(ItemLinks, self).verify(world)
existing_links = set()
@@ -644,13 +684,27 @@ class ItemLinks(OptionList):
if link["name"] in existing_links:
raise Exception(f"You cannot have more than one link named {link['name']}.")
existing_links.add(link["name"])
- for item_name in link["item_pool"]:
- if item_name not in world.item_names and item_name not in world.item_name_groups:
- raise Exception(f"Item {item_name} from item link {link} "
- f"is not a valid item name from {world.game}")
- if link["replacement_item"] and link["replacement_item"] not in world.item_names:
- raise Exception(f"Item {link['replacement_item']} from item link {link} "
- f"is not a valid item name from {world.game}")
+
+ pool = self.verify_items(link["item_pool"], link["name"], "item_pool", world)
+ local_items = set()
+ non_local_items = set()
+
+ if "exclude" in link:
+ pool -= self.verify_items(link["exclude"], link["name"], "exclude", world)
+ if link["replacement_item"]:
+ self.verify_items([link["replacement_item"]], link["name"], "replacement_item", world, False)
+ if "local_items" in link:
+ local_items = self.verify_items(link["local_items"], link["name"], "local_items", world)
+ local_items &= pool
+ if "non_local_items" in link:
+ non_local_items = self.verify_items(link["non_local_items"], link["name"], "non_local_items", world)
+ non_local_items &= pool
+
+ intersection = local_items.intersection(non_local_items)
+ if intersection:
+ raise Exception(f"item_link {link['name']} has {intersection} items in both its local_items and non_local_items pool.")
+
+
per_game_common_options = {
diff --git a/README.md b/README.md
index 935f34b521..6b6dac410f 100644
--- a/README.md
+++ b/README.md
@@ -23,6 +23,9 @@ Currently, the following games are supported:
* ChecksFinder
* ArchipIDLE
* Hollow Knight
+* The Witness
+* Sonic Adventure 2: Battle
+* Starcraft 2: Wings of Liberty
For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/).
Downloads can be found at [Releases](https://github.com/ArchipelagoMW/Archipelago/releases), including compiled
diff --git a/SNIClient.py b/SNIClient.py
index 9ba9871762..ff56595afc 100644
--- a/SNIClient.py
+++ b/SNIClient.py
@@ -28,7 +28,7 @@ from worlds.alttp.Rom import ROM_PLAYER_LIMIT
from worlds.sm.Rom import ROM_PLAYER_LIMIT as SM_ROM_PLAYER_LIMIT
from worlds.smz3.Rom import ROM_PLAYER_LIMIT as SMZ3_ROM_PLAYER_LIMIT
import Utils
-from CommonClient import CommonContext, server_loop, console_loop, ClientCommandProcessor, gui_enabled, get_base_parser
+from CommonClient import CommonContext, server_loop, ClientCommandProcessor, gui_enabled, get_base_parser
from Patch import GAME_ALTTP, GAME_SM, GAME_SMZ3
snes_logger = logging.getLogger("SNES")
@@ -186,6 +186,19 @@ class Context(CommonContext):
# Once the games handled by SNIClient gets made to be remote items, this will no longer be needed.
asyncio.create_task(self.send_msgs([{"cmd": "LocationScouts", "locations": list(new_locations)}]))
+ def run_gui(self):
+ from kvui import GameManager
+
+ class SNIManager(GameManager):
+ logging_pairs = [
+ ("Client", "Archipelago"),
+ ("SNES", "SNES"),
+ ]
+ base_title = "Archipelago SNI Client"
+
+ self.ui = SNIManager(self)
+ self.ui_task = asyncio.create_task(self.ui.async_run(), name="UI")
+
async def deathlink_kill_player(ctx: Context):
ctx.death_state = DeathState.killing_player
@@ -517,7 +530,8 @@ boss_locations = {Regions.lookup_name_to_id[name] for name in {'Eastern Palace -
"Thieves' Town - Boss",
'Ice Palace - Boss',
'Misery Mire - Boss',
- 'Turtle Rock - Boss'}}
+ 'Turtle Rock - Boss',
+ 'Sahasrahla'}}
location_table_uw_id = {Regions.lookup_name_to_id[name]: data for name, data in location_table_uw.items()}
@@ -961,8 +975,9 @@ async def track_locations(ctx: Context, roomid, roomdata):
for location_id, mask in location_table_npc_id.items():
if npc_value & mask != 0 and location_id not in ctx.locations_checked:
new_check(location_id)
- if ctx.allow_collect and location_id in ctx.checked_locations and location_id not in ctx.locations_checked \
- and location_id in ctx.locations_info and ctx.locations_info[location_id].player != ctx.slot:
+ if ctx.allow_collect and location_id not in boss_locations and location_id in ctx.checked_locations \
+ and location_id not in ctx.locations_checked and location_id in ctx.locations_info \
+ and ctx.locations_info[location_id].player != ctx.slot:
npc_value |= mask
npc_value_changed = True
if npc_value_changed:
@@ -1170,7 +1185,10 @@ async def game_watcher(ctx: Context):
if itemOutPtr < len(ctx.items_received):
item = ctx.items_received[itemOutPtr]
itemId = item.item - items_start_id
- locationId = (item.location - locations_start_id) if item.location >= 0 and bool(ctx.items_handling & 0b010) else 0x00
+ if bool(ctx.items_handling & 0b010):
+ locationId = (item.location - locations_start_id) if (item.location >= 0 and item.player == ctx.slot) else 0xFF
+ else:
+ locationId = 0x00 #backward compat
playerID = item.player if item.player <= SM_ROM_PLAYER_LIMIT else 0
snes_buffered_write(ctx, SM_RECV_PROGRESS_ADDR + itemOutPtr * 4, bytes(
@@ -1291,15 +1309,10 @@ async def main():
ctx = Context(args.snes, args.connect, args.password)
if ctx.server_task is None:
ctx.server_task = asyncio.create_task(server_loop(ctx), name="ServerLoop")
- input_task = None
+
if gui_enabled:
- from kvui import SNIManager
- ctx.ui = SNIManager(ctx)
- ui_task = asyncio.create_task(ctx.ui.async_run(), name="UI")
- else:
- ui_task = None
- if sys.stdin:
- input_task = asyncio.create_task(console_loop(ctx), name="Input")
+ ctx.run_gui()
+ ctx.run_cli()
snes_connect_task = asyncio.create_task(snes_connect(ctx, ctx.snes_address), name="SNES Connect")
watcher_task = asyncio.create_task(game_watcher(ctx), name="GameWatcher")
@@ -1315,12 +1328,6 @@ async def main():
await watcher_task
await ctx.shutdown()
- if ui_task:
- await ui_task
-
- if input_task:
- input_task.cancel()
-
def get_alttp_settings(romfile: str):
lastSettings = Utils.get_adjuster_settings(GAME_ALTTP)
@@ -1432,7 +1439,7 @@ def get_alttp_settings(romfile: str):
if hasattr(lastSettings, "world"):
delattr(lastSettings, "world")
else:
- adjusted = False;
+ adjusted = False
if adjusted:
try:
shutil.move(adjustedromfile, romfile)
@@ -1446,7 +1453,5 @@ def get_alttp_settings(romfile: str):
if __name__ == '__main__':
colorama.init()
- loop = asyncio.get_event_loop()
- loop.run_until_complete(main())
- loop.close()
+ asyncio.run(main())
colorama.deinit()
diff --git a/Starcraft2Client.py b/Starcraft2Client.py
new file mode 100644
index 0000000000..c1962f961e
--- /dev/null
+++ b/Starcraft2Client.py
@@ -0,0 +1,715 @@
+from __future__ import annotations
+
+import multiprocessing
+import logging
+import asyncio
+import os.path
+
+import nest_asyncio
+import sc2
+
+from sc2.main import run_game
+from sc2.data import Race
+from sc2.bot_ai import BotAI
+from sc2.player import Bot
+
+from worlds.sc2wol.Regions import MissionInfo
+from worlds.sc2wol.MissionTables import lookup_id_to_mission
+from worlds.sc2wol.Items import lookup_id_to_name, item_table
+from worlds.sc2wol.Locations import SC2WOL_LOC_ID_OFFSET
+from worlds.sc2wol import SC2WoLWorld
+
+from Utils import init_logging
+
+if __name__ == "__main__":
+ init_logging("SC2Client", exception_logger="Client")
+
+logger = logging.getLogger("Client")
+sc2_logger = logging.getLogger("Starcraft2")
+
+import colorama
+
+from NetUtils import *
+from CommonClient import CommonContext, server_loop, ClientCommandProcessor, gui_enabled, get_base_parser
+
+nest_asyncio.apply()
+
+
+class StarcraftClientProcessor(ClientCommandProcessor):
+ ctx: Context
+
+ def _cmd_disable_mission_check(self) -> bool:
+ """Disables the check to see if a mission is available to play. Meant for co-op runs where one player can play
+ the next mission in a chain the other player is doing."""
+ self.ctx.missions_unlocked = True
+ sc2_logger.info("Mission check has been disabled")
+
+ def _cmd_play(self, mission_id: str = "") -> bool:
+ """Start a Starcraft 2 mission"""
+
+ options = mission_id.split()
+ num_options = len(options)
+
+ if num_options > 0:
+ mission_number = int(options[0])
+
+ self.ctx.play_mission(mission_number)
+
+ else:
+ sc2_logger.info(
+ "Mission ID needs to be specified. Use /unfinished or /available to view ids for available missions.")
+
+ return True
+
+ def _cmd_available(self) -> bool:
+ """Get what missions are currently available to play"""
+
+ request_available_missions(self.ctx.checked_locations, self.ctx.mission_req_table, self.ctx.ui)
+ return True
+
+ def _cmd_unfinished(self) -> bool:
+ """Get what missions are currently available to play and have not had all locations checked"""
+
+ request_unfinished_missions(self.ctx.checked_locations, self.ctx.mission_req_table, self.ctx.ui, self.ctx)
+ return True
+
+
+class Context(CommonContext):
+ command_processor = StarcraftClientProcessor
+ game = "Starcraft 2 Wings of Liberty"
+ items_handling = 0b111
+ difficulty = -1
+ all_in_choice = 0
+ mission_req_table = None
+ items_rec_to_announce = []
+ rec_announce_pos = 0
+ items_sent_to_announce = []
+ sent_announce_pos = 0
+ announcements = []
+ announcement_pos = 0
+ sc2_run_task: typing.Optional[asyncio.Task] = None
+ missions_unlocked = False
+
+ async def server_auth(self, password_requested: bool = False):
+ if password_requested and not self.password:
+ await super(Context, self).server_auth(password_requested)
+ if not self.auth:
+ logger.info('Enter slot name:')
+ self.auth = await self.console_input()
+
+ await self.send_connect()
+
+ def on_package(self, cmd: str, args: dict):
+ if cmd in {"Connected"}:
+ self.difficulty = args["slot_data"]["game_difficulty"]
+ self.all_in_choice = args["slot_data"]["all_in_map"]
+ slot_req_table = args["slot_data"]["mission_req"]
+ self.mission_req_table = {}
+ for mission in slot_req_table:
+ self.mission_req_table[mission] = MissionInfo(**slot_req_table[mission])
+
+ if cmd in {"PrintJSON"}:
+ noted = False
+ if "receiving" in args:
+ if args["receiving"] == self.slot:
+ self.announcements.append(args["data"])
+ noted = True
+ if not noted and "item" in args:
+ if args["item"].player == self.slot:
+ self.announcements.append(args["data"])
+
+ def run_gui(self):
+ from kvui import GameManager
+ from kivy.base import Clock
+ from kivy.uix.tabbedpanel import TabbedPanelItem
+ from kivy.uix.gridlayout import GridLayout
+ from kivy.lang import Builder
+ from kivy.uix.label import Label
+ from kivy.uix.button import Button
+
+ import Utils
+
+ class MissionButton(Button):
+ pass
+
+ class MissionLayout(GridLayout):
+ pass
+
+ class MissionCategory(GridLayout):
+ pass
+
+ class SC2Manager(GameManager):
+ logging_pairs = [
+ ("Client", "Archipelago"),
+ ("Starcraft2", "Starcraft2"),
+ ]
+ base_title = "Archipelago Starcraft 2 Client"
+
+ mission_panel = None
+ last_checked_locations = {}
+ mission_id_to_button = {}
+
+ def __init__(self, ctx):
+ super().__init__(ctx)
+
+ def build(self):
+ container = super().build()
+
+ panel = TabbedPanelItem(text="Starcraft 2 Launcher")
+ self.mission_panel = panel.content = MissionLayout()
+
+ self.tabs.add_widget(panel)
+
+ Clock.schedule_interval(self.build_mission_table, 0.5)
+
+ return container
+
+ def build_mission_table(self, dt):
+ self.mission_panel.clear_widgets()
+
+ if self.ctx.mission_req_table:
+ self.mission_id_to_button = {}
+ categories = {}
+ available_missions = []
+ unfinished_missions = calc_unfinished_missions(self.ctx.checked_locations, self.ctx.mission_req_table,
+ self.ctx, available_missions=available_missions)
+
+ self.last_checked_locations = self.ctx.checked_locations
+
+ # separate missions into categories
+ for mission in self.ctx.mission_req_table:
+ if not self.ctx.mission_req_table[mission].category in categories:
+ categories[self.ctx.mission_req_table[mission].category] = []
+
+ categories[self.ctx.mission_req_table[mission].category].append(mission)
+
+ for category in categories:
+ category_panel = MissionCategory()
+ category_panel.add_widget(Label(text=category, size_hint_y=None, height=50, outline_width=1))
+
+ for mission in categories[category]:
+ text = mission
+
+ if mission in unfinished_missions:
+ text = f"[color=6495ED]{text}[/color]"
+ elif mission in available_missions:
+ text = f"[color=FFFFFF]{text}[/color]"
+ else:
+ text = f"[color=a9a9a9]{text}[/color]"
+
+ mission_button = MissionButton(text=text, size_hint_y=None, height=50)
+ mission_button.bind(on_press=self.mission_callback)
+ self.mission_id_to_button[self.ctx.mission_req_table[mission].id] = mission_button
+ category_panel.add_widget(mission_button)
+
+ category_panel.add_widget(Label(text=""))
+ self.mission_panel.add_widget(category_panel)
+
+ def mission_callback(self, button):
+ self.ctx.play_mission(list(self.mission_id_to_button.keys())
+ [list(self.mission_id_to_button.values()).index(button)])
+
+ self.ui = SC2Manager(self)
+ self.ui_task = asyncio.create_task(self.ui.async_run(), name="UI")
+
+ Builder.load_file(Utils.local_path(os.path.dirname(SC2WoLWorld.__file__), "Starcraft2.kv"))
+
+ async def shutdown(self):
+ await super(Context, self).shutdown()
+ if self.sc2_run_task:
+ self.sc2_run_task.cancel()
+
+ def play_mission(self, mission_id):
+ if self.missions_unlocked or \
+ is_mission_available(mission_id, self.checked_locations, self.mission_req_table):
+ if self.sc2_run_task:
+ if not self.sc2_run_task.done():
+ sc2_logger.warning("Starcraft 2 Client is still running!")
+ self.sc2_run_task.cancel() # doesn't actually close the game, just stops the python task
+ if self.slot is None:
+ sc2_logger.warning("Launching Mission without Archipelago authentication, "
+ "checks will not be registered to server.")
+ self.sc2_run_task = asyncio.create_task(starcraft_launch(self, mission_id),
+ name="Starcraft 2 Launch")
+ else:
+ sc2_logger.info(
+ f"{lookup_id_to_mission[mission_id]} is not currently unlocked. "
+ f"Use /unfinished or /available to see what is available.")
+
+
+async def main():
+ multiprocessing.freeze_support()
+ parser = get_base_parser()
+ parser.add_argument('--name', default=None, help="Slot Name to connect as.")
+ args = parser.parse_args()
+
+ ctx = Context(args.connect, args.password)
+ ctx.auth = args.name
+ if ctx.server_task is None:
+ ctx.server_task = asyncio.create_task(server_loop(ctx), name="ServerLoop")
+
+ if gui_enabled:
+ ctx.run_gui()
+ ctx.run_cli()
+
+ await ctx.exit_event.wait()
+
+ await ctx.shutdown()
+
+
+maps_table = [
+ "ap_traynor01", "ap_traynor02", "ap_traynor03",
+ "ap_thanson01", "ap_thanson02", "ap_thanson03a", "ap_thanson03b",
+ "ap_ttychus01", "ap_ttychus02", "ap_ttychus03", "ap_ttychus04", "ap_ttychus05",
+ "ap_ttosh01", "ap_ttosh02", "ap_ttosh03a", "ap_ttosh03b",
+ "ap_thorner01", "ap_thorner02", "ap_thorner03", "ap_thorner04", "ap_thorner05s",
+ "ap_tzeratul01", "ap_tzeratul02", "ap_tzeratul03", "ap_tzeratul04",
+ "ap_tvalerian01", "ap_tvalerian02a", "ap_tvalerian02b", "ap_tvalerian03"
+]
+
+
+def calculate_items(items):
+ unit_unlocks = 0
+ armory1_unlocks = 0
+ armory2_unlocks = 0
+ upgrade_unlocks = 0
+ building_unlocks = 0
+ merc_unlocks = 0
+ lab_unlocks = 0
+ protoss_unlock = 0
+ minerals = 0
+ vespene = 0
+
+ for item in items:
+ data = lookup_id_to_name[item.item]
+
+ if item_table[data].type == "Unit":
+ unit_unlocks += (1 << item_table[data].number)
+ elif item_table[data].type == "Upgrade":
+ upgrade_unlocks += (1 << item_table[data].number)
+ elif item_table[data].type == "Armory 1":
+ armory1_unlocks += (1 << item_table[data].number)
+ elif item_table[data].type == "Armory 2":
+ armory2_unlocks += (1 << item_table[data].number)
+ elif item_table[data].type == "Building":
+ building_unlocks += (1 << item_table[data].number)
+ elif item_table[data].type == "Mercenary":
+ merc_unlocks += (1 << item_table[data].number)
+ elif item_table[data].type == "Laboratory":
+ lab_unlocks += (1 << item_table[data].number)
+ elif item_table[data].type == "Protoss":
+ protoss_unlock += (1 << item_table[data].number)
+ elif item_table[data].type == "Minerals":
+ minerals += item_table[data].number
+ elif item_table[data].type == "Vespene":
+ vespene += item_table[data].number
+
+ return [unit_unlocks, upgrade_unlocks, armory1_unlocks, armory2_unlocks, building_unlocks, merc_unlocks,
+ lab_unlocks, protoss_unlock, minerals, vespene]
+
+
+def calc_difficulty(difficulty):
+ if difficulty == 0:
+ return 'C'
+ elif difficulty == 1:
+ return 'N'
+ elif difficulty == 2:
+ return 'H'
+ elif difficulty == 3:
+ return 'B'
+
+ return 'X'
+
+
+async def starcraft_launch(ctx: Context, mission_id):
+ ctx.rec_announce_pos = len(ctx.items_rec_to_announce)
+ ctx.sent_announce_pos = len(ctx.items_sent_to_announce)
+ ctx.announcements_pos = len(ctx.announcements)
+
+ sc2_logger.info(f"Launching {lookup_id_to_mission[mission_id]}. If game does not launch check log file for errors.")
+
+ run_game(sc2.maps.get(maps_table[mission_id - 1]), [Bot(Race.Terran, ArchipelagoBot(ctx, mission_id),
+ name="Archipelago", fullscreen=True)], realtime=True)
+
+
+class ArchipelagoBot(sc2.bot_ai.BotAI):
+ game_running = False
+ mission_completed = False
+ first_bonus = False
+ second_bonus = False
+ third_bonus = False
+ fourth_bonus = False
+ fifth_bonus = False
+ sixth_bonus = False
+ seventh_bonus = False
+ eight_bonus = False
+ ctx: Context = None
+ mission_id = 0
+
+ can_read_game = False
+
+ last_received_update = 0
+
+ def __init__(self, ctx: Context, mission_id):
+ self.ctx = ctx
+ self.mission_id = mission_id
+
+ super(ArchipelagoBot, self).__init__()
+
+ async def on_step(self, iteration: int):
+ game_state = 0
+ if iteration == 0:
+ start_items = calculate_items(self.ctx.items_received)
+ difficulty = calc_difficulty(self.ctx.difficulty)
+ await self.chat_send("ArchipelagoLoad {} {} {} {} {} {} {} {} {} {} {} {}".format(
+ difficulty,
+ start_items[0], start_items[1], start_items[2], start_items[3], start_items[4],
+ start_items[5], start_items[6], start_items[7], start_items[8], start_items[9],
+ self.ctx.all_in_choice))
+ self.last_received_update = len(self.ctx.items_received)
+
+ else:
+ if self.ctx.announcement_pos < len(self.ctx.announcements):
+ index = 0
+ message = ""
+ while index < len(self.ctx.announcements[self.ctx.announcement_pos]):
+ message += self.ctx.announcements[self.ctx.announcement_pos][index]["text"]
+ index += 1
+
+ index = 0
+ start_rem_pos = -1
+ # Remove unneeded [Color] tags
+ while index < len(message):
+ if message[index] == '[':
+ start_rem_pos = index
+ index += 1
+ elif message[index] == ']' and start_rem_pos > -1:
+ temp_msg = ""
+
+ if start_rem_pos > 0:
+ temp_msg = message[:start_rem_pos]
+ if index < len(message) - 1:
+ temp_msg += message[index + 1:]
+
+ message = temp_msg
+ index += start_rem_pos - index
+ start_rem_pos = -1
+ else:
+ index += 1
+
+ await self.chat_send("SendMessage " + message)
+ self.ctx.announcement_pos += 1
+
+ # Archipelago reads the health
+ for unit in self.all_own_units():
+ if unit.health_max == 38281:
+ game_state = int(38281 - unit.health)
+ self.can_read_game = True
+
+ if iteration == 160 and not game_state & 1:
+ await self.chat_send("SendMessage Warning: Archipelago unable to connect or has lost connection to " +
+ "Starcraft 2 (This is likely a map issue)")
+
+ if self.last_received_update < len(self.ctx.items_received):
+ current_items = calculate_items(self.ctx.items_received)
+ await self.chat_send("UpdateTech {} {} {} {} {} {} {} {}".format(
+ current_items[0], current_items[1], current_items[2], current_items[3], current_items[4],
+ current_items[5], current_items[6], current_items[7]))
+ self.last_received_update = len(self.ctx.items_received)
+
+ if game_state & 1:
+ if not self.game_running:
+ print("Archipelago Connected")
+ self.game_running = True
+
+ if self.can_read_game:
+ if game_state & (1 << 1) and not self.mission_completed:
+ if self.mission_id != 29:
+ print("Mission Completed")
+ await self.ctx.send_msgs([
+ {"cmd": 'LocationChecks', "locations": [SC2WOL_LOC_ID_OFFSET + 100 * self.mission_id]}])
+ self.mission_completed = True
+ else:
+ print("Game Complete")
+ await self.ctx.send_msgs([{"cmd": 'StatusUpdate', "status": ClientStatus.CLIENT_GOAL}])
+ self.mission_completed = True
+
+ if game_state & (1 << 2) and not self.first_bonus:
+ print("1st Bonus Collected")
+ await self.ctx.send_msgs(
+ [{"cmd": 'LocationChecks',
+ "locations": [SC2WOL_LOC_ID_OFFSET + 100 * self.mission_id + 1]}])
+ self.first_bonus = True
+
+ if not self.second_bonus and game_state & (1 << 3):
+ print("2nd Bonus Collected")
+ await self.ctx.send_msgs(
+ [{"cmd": 'LocationChecks',
+ "locations": [SC2WOL_LOC_ID_OFFSET + 100 * self.mission_id + 2]}])
+ self.second_bonus = True
+
+ if not self.third_bonus and game_state & (1 << 4):
+ print("3rd Bonus Collected")
+ await self.ctx.send_msgs(
+ [{"cmd": 'LocationChecks',
+ "locations": [SC2WOL_LOC_ID_OFFSET + 100 * self.mission_id + 3]}])
+ self.third_bonus = True
+
+ if not self.fourth_bonus and game_state & (1 << 5):
+ print("4th Bonus Collected")
+ await self.ctx.send_msgs(
+ [{"cmd": 'LocationChecks',
+ "locations": [SC2WOL_LOC_ID_OFFSET + 100 * self.mission_id + 4]}])
+ self.fourth_bonus = True
+
+ if not self.fifth_bonus and game_state & (1 << 6):
+ print("5th Bonus Collected")
+ await self.ctx.send_msgs(
+ [{"cmd": 'LocationChecks',
+ "locations": [SC2WOL_LOC_ID_OFFSET + 100 * self.mission_id + 5]}])
+ self.fifth_bonus = True
+
+ if not self.sixth_bonus and game_state & (1 << 7):
+ print("6th Bonus Collected")
+ await self.ctx.send_msgs(
+ [{"cmd": 'LocationChecks',
+ "locations": [SC2WOL_LOC_ID_OFFSET + 100 * self.mission_id + 6]}])
+ self.sixth_bonus = True
+
+ if not self.seventh_bonus and game_state & (1 << 8):
+ print("6th Bonus Collected")
+ await self.ctx.send_msgs(
+ [{"cmd": 'LocationChecks',
+ "locations": [SC2WOL_LOC_ID_OFFSET + 100 * self.mission_id + 7]}])
+ self.seventh_bonus = True
+
+ if not self.eight_bonus and game_state & (1 << 9):
+ print("6th Bonus Collected")
+ await self.ctx.send_msgs(
+ [{"cmd": 'LocationChecks',
+ "locations": [SC2WOL_LOC_ID_OFFSET + 100 * self.mission_id + 8]}])
+ self.eight_bonus = True
+
+ else:
+ await self.chat_send("LostConnection - Lost connection to game.")
+
+
+def calc_objectives_completed(mission, missions_info, locations_done, unfinished_locations, ctx):
+ objectives_complete = 0
+
+ if missions_info[mission].extra_locations > 0:
+ for i in range(missions_info[mission].extra_locations):
+ if (missions_info[mission].id * 100 + SC2WOL_LOC_ID_OFFSET + i) in locations_done:
+ objectives_complete += 1
+ else:
+ unfinished_locations[mission].append(ctx.location_name_getter(
+ missions_info[mission].id * 100 + SC2WOL_LOC_ID_OFFSET + i))
+
+ return objectives_complete
+
+ else:
+ return -1
+
+
+def request_unfinished_missions(locations_done, location_table, ui, ctx):
+ if location_table:
+ message = "Unfinished Missions: "
+ unlocks = initialize_blank_mission_dict(location_table)
+ unfinished_locations = initialize_blank_mission_dict(location_table)
+
+ unfinished_missions = calc_unfinished_missions(locations_done, location_table, ctx, unlocks=unlocks,
+ unfinished_locations=unfinished_locations)
+
+ message += ", ".join(f"{mark_up_mission_name(mission, location_table, ui,unlocks)}[{location_table[mission].id}] " +
+ mark_up_objectives(
+ f"[{unfinished_missions[mission]}/{location_table[mission].extra_locations}]",
+ ctx, unfinished_locations, mission)
+ for mission in unfinished_missions)
+
+ if ui:
+ ui.log_panels['All'].on_message_markup(message)
+ ui.log_panels['Starcraft2'].on_message_markup(message)
+ else:
+ sc2_logger.info(message)
+ else:
+ sc2_logger.warning("No mission table found, you are likely not connected to a server.")
+
+
+def calc_unfinished_missions(locations_done, locations, ctx, unlocks=None, unfinished_locations=None,
+ available_missions=[]):
+ unfinished_missions = []
+ locations_completed = []
+
+ if not unlocks:
+ unlocks = initialize_blank_mission_dict(locations)
+
+ if not unfinished_locations:
+ unfinished_locations = initialize_blank_mission_dict(locations)
+
+ if len(available_missions) > 0:
+ available_missions = []
+
+ available_missions.extend(calc_available_missions(locations_done, locations, unlocks))
+
+ for name in available_missions:
+ if not locations[name].extra_locations == -1:
+ objectives_completed = calc_objectives_completed(name, locations, locations_done, unfinished_locations, ctx)
+
+ if objectives_completed < locations[name].extra_locations:
+ unfinished_missions.append(name)
+ locations_completed.append(objectives_completed)
+
+ else:
+ unfinished_missions.append(name)
+ locations_completed.append(-1)
+
+ return {unfinished_missions[i]: locations_completed[i] for i in range(len(unfinished_missions))}
+
+
+def is_mission_available(mission_id_to_check, locations_done, locations):
+ unfinished_missions = calc_available_missions(locations_done, locations)
+
+ return any(mission_id_to_check == locations[mission].id for mission in unfinished_missions)
+
+
+def mark_up_mission_name(mission, location_table, ui, unlock_table):
+ """Checks if the mission is required for game completion and adds '*' to the name to mark that."""
+
+ if location_table[mission].completion_critical:
+ if ui:
+ message = "[color=AF99EF]" + mission + "[/color]"
+ else:
+ message = "*" + mission + "*"
+ else:
+ message = mission
+
+ if ui:
+ unlocks = unlock_table[mission]
+
+ if len(unlocks) > 0:
+ pre_message = f"[ref={list(location_table).index(mission)}|Unlocks: "
+ pre_message += ", ".join(f"{unlock}({location_table[unlock].id})" for unlock in unlocks)
+ pre_message += f"]"
+ message = pre_message + message + "[/ref]"
+
+ return message
+
+
+def mark_up_objectives(message, ctx, unfinished_locations, mission):
+ formatted_message = message
+
+ if ctx.ui:
+ locations = unfinished_locations[mission]
+
+ pre_message = f"[ref={list(ctx.mission_req_table).index(mission)+30}|"
+ pre_message += " ".join(location for location in locations)
+ pre_message += f"]"
+ formatted_message = pre_message + message + "[/ref]"
+
+ return formatted_message
+
+
+def request_available_missions(locations_done, location_table, ui):
+ if location_table:
+ message = "Available Missions: "
+
+ # Initialize mission unlock table
+ unlocks = initialize_blank_mission_dict(location_table)
+
+ missions = calc_available_missions(locations_done, location_table, unlocks)
+ message += \
+ ", ".join(f"{mark_up_mission_name(mission, location_table, ui, unlocks)}[{location_table[mission].id}]"
+ for mission in missions)
+
+ if ui:
+ ui.log_panels['All'].on_message_markup(message)
+ ui.log_panels['Starcraft2'].on_message_markup(message)
+ else:
+ sc2_logger.info(message)
+ else:
+ sc2_logger.warning("No mission table found, you are likely not connected to a server.")
+
+
+def calc_available_missions(locations_done, locations, unlocks=None):
+ available_missions = []
+ missions_complete = 0
+
+ # Get number of missions completed
+ for loc in locations_done:
+ if loc % 100 == 0:
+ missions_complete += 1
+
+ for name in locations:
+ # Go through the required missions for each mission and fill up unlock table used later for hover-over tooltips
+ if unlocks:
+ for unlock in locations[name].required_world:
+ unlocks[list(locations)[unlock-1]].append(name)
+
+ if mission_reqs_completed(name, missions_complete, locations_done, locations):
+ available_missions.append(name)
+
+ return available_missions
+
+
+def mission_reqs_completed(location_to_check, missions_complete, locations_done, locations):
+ """Returns a bool signifying if the mission has all requirements complete and can be done
+
+ Keyword arguments:
+ locations_to_check -- the mission string name to check
+ missions_complete -- an int of how many missions have been completed
+ locations_done -- a list of the location ids that have been complete
+ locations -- a dict of MissionInfo for mission requirements for this world"""
+ if len(locations[location_to_check].required_world) >= 1:
+ # A check for when the requirements are being or'd
+ or_success = False
+
+ # Loop through required missions
+ for req_mission in locations[location_to_check].required_world:
+ req_success = True
+
+ # Check if required mission has been completed
+ if not (locations[list(locations)[req_mission-1]].id * 100 + SC2WOL_LOC_ID_OFFSET) in locations_done:
+ if not locations[location_to_check].or_requirements:
+ return False
+ else:
+ req_success = False
+
+ # Recursively check required mission to see if it's requirements are met, in case !collect has been done
+ if not mission_reqs_completed(list(locations)[req_mission-1], missions_complete, locations_done,
+ locations):
+ if not locations[location_to_check].or_requirements:
+ return False
+ else:
+ req_success = False
+
+ # If requirement check succeeded mark or as satisfied
+ if locations[location_to_check].or_requirements and req_success:
+ or_success = True
+
+ if locations[location_to_check].or_requirements:
+ # Return false if or requirements not met
+ if not or_success:
+ return False
+
+ # Check number of missions
+ if missions_complete >= locations[location_to_check].number:
+ return True
+ else:
+ return False
+ else:
+ return True
+
+
+def initialize_blank_mission_dict(location_table):
+ unlocks = {}
+
+ for mission in list(location_table):
+ unlocks[mission] = []
+
+ return unlocks
+
+
+if __name__ == '__main__':
+ colorama.init()
+ asyncio.run(main())
+ colorama.deinit()
diff --git a/Utils.py b/Utils.py
index e6450f3689..12870c8eb1 100644
--- a/Utils.py
+++ b/Utils.py
@@ -12,7 +12,11 @@ import io
import collections
import importlib
import logging
-from tkinter import Tk
+
+if typing.TYPE_CHECKING:
+ from tkinter import Tk
+else:
+ Tk = typing.Any
def tuplize_version(version: str) -> Version:
@@ -28,6 +32,7 @@ class Version(typing.NamedTuple):
__version__ = "0.3.2"
version_tuple = tuplize_version(__version__)
+import jellyfish
from yaml import load, load_all, dump, SafeLoader
try:
@@ -36,41 +41,44 @@ except ImportError:
from yaml import Loader
-def int16_as_bytes(value):
+def int16_as_bytes(value: int) -> typing.List[int]:
value = value & 0xFFFF
return [value & 0xFF, (value >> 8) & 0xFF]
-def int32_as_bytes(value):
+def int32_as_bytes(value: int) -> typing.List[int]:
value = value & 0xFFFFFFFF
return [value & 0xFF, (value >> 8) & 0xFF, (value >> 16) & 0xFF, (value >> 24) & 0xFF]
-def pc_to_snes(value):
+def pc_to_snes(value: int) -> int:
return ((value << 1) & 0x7F0000) | (value & 0x7FFF) | 0x8000
-def snes_to_pc(value):
+def snes_to_pc(value: int) -> int:
return ((value & 0x7F0000) >> 1) | (value & 0x7FFF)
-def cache_argsless(function):
- if function.__code__.co_argcount:
- raise Exception("Can only cache 0 argument functions with this cache.")
+RetType = typing.TypeVar("RetType")
- result = sentinel = object()
- def _wrap():
+def cache_argsless(function: typing.Callable[[], RetType]) -> typing.Callable[[], RetType]:
+ assert not function.__code__.co_argcount, "Can only cache 0 argument functions with this cache."
+
+ sentinel = object()
+ result: typing.Union[object, RetType] = sentinel
+
+ def _wrap() -> RetType:
nonlocal result
if result is sentinel:
result = function()
- return result
+ return typing.cast(RetType, result)
return _wrap
def is_frozen() -> bool:
- return getattr(sys, 'frozen', False)
+ return typing.cast(bool, getattr(sys, 'frozen', False))
def local_path(*path: str) -> str:
@@ -259,7 +267,8 @@ def get_default_options() -> dict:
},
"minecraft_options": {
"forge_directory": "Minecraft Forge server",
- "max_heap_size": "2G"
+ "max_heap_size": "2G",
+ "release_channel": "release"
},
"oot_options": {
"rom_file": "The Legend of Zelda - Ocarina of Time.z64",
@@ -417,7 +426,7 @@ loglevel_mapping = {'error': logging.ERROR, 'info': logging.INFO, 'warning': log
def init_logging(name: str, loglevel: typing.Union[str, int] = logging.INFO, write_mode: str = "w",
- log_format: str = "[%(name)s]: %(message)s", exception_logger: str = ""):
+ log_format: str = "[%(name)s at %(asctime)s]: %(message)s", exception_logger: str = ""):
loglevel: int = loglevel_mapping.get(loglevel, loglevel)
log_folder = user_path("logs")
os.makedirs(log_folder, exist_ok=True)
@@ -478,7 +487,8 @@ class VersionException(Exception):
pass
-def format_SI_prefix(value, power=1000, power_labels=('', 'k', 'M', 'G', 'T', "P", "E", "Z", "Y")):
+# noinspection PyPep8Naming
+def format_SI_prefix(value, power=1000, power_labels=('', 'k', 'M', 'G', 'T', "P", "E", "Z", "Y")) -> str:
n = 0
while value > power:
@@ -488,3 +498,24 @@ def format_SI_prefix(value, power=1000, power_labels=('', 'k', 'M', 'G', 'T', "P
return f"{value} {power_labels[n]}"
else:
return f"{value:0.3f} {power_labels[n]}"
+
+
+def get_fuzzy_ratio(word1: str, word2: str) -> float:
+ return (1 - jellyfish.damerau_levenshtein_distance(word1.lower(), word2.lower())
+ / max(len(word1), len(word2)))
+
+
+def get_fuzzy_results(input_word: str, wordlist: typing.Sequence[str], limit: typing.Optional[int] = None) \
+ -> typing.List[typing.Tuple[str, int]]:
+ limit: int = limit if limit else len(wordlist)
+ return list(
+ map(
+ lambda container: (container[0], int(container[1]*100)), # convert up to limit to int %
+ sorted(
+ map(lambda candidate:
+ (candidate, get_fuzzy_ratio(input_word, candidate)),
+ wordlist),
+ key=lambda element: element[1],
+ reverse=True)[0:limit]
+ )
+ )
diff --git a/WebHost.py b/WebHost.py
index 773120b791..dc558a9afc 100644
--- a/WebHost.py
+++ b/WebHost.py
@@ -1,6 +1,8 @@
import os
+import sys
import multiprocessing
import logging
+import typing
import ModuleUpdate
@@ -20,6 +22,8 @@ from WebHostLib.autolauncher import autohost, autogen
from WebHostLib.lttpsprites import update_sprites_lttp
from WebHostLib.options import create as create_options_files
+from worlds.AutoWorld import AutoWorldRegister, WebWorld
+
configpath = os.path.abspath("config.yaml")
if not os.path.exists(configpath): # fall back to config.yaml in home
configpath = os.path.abspath(Utils.user_path('config.yaml'))
@@ -36,13 +40,55 @@ def get_app():
return app
-def create_ordered_tutorials_file():
+def create_ordered_tutorials_file() -> typing.List[typing.Dict[str, typing.Any]]:
import json
- with open(os.path.join("WebHostLib", "static", "assets", "tutorial", "tutorials.json")) as source:
- data = json.load(source)
- data = sorted(data, key=lambda entry: entry["gameTitle"].lower())
- with open(os.path.join("WebHostLib", "static", "generated", "tutorials.json"), "w") as target:
- json.dump(data, target)
+ import shutil
+ worlds = {}
+ data = []
+ for game, world in AutoWorldRegister.world_types.items():
+ if hasattr(world.web, 'tutorials'):
+ worlds[game] = world
+ for game, world in worlds.items():
+ # copy files from world's docs folder to the generated folder
+ source_path = Utils.local_path(os.path.dirname(sys.modules[world.__module__].__file__), 'docs')
+ target_path = Utils.local_path("WebHostLib", "static", "generated", "docs", game)
+ files = os.listdir(source_path)
+ for file in files:
+ os.makedirs(os.path.dirname(Utils.local_path(target_path, file)), exist_ok=True)
+ shutil.copyfile(Utils.local_path(source_path, file), Utils.local_path(target_path, file))
+ # build a json tutorial dict per game
+ game_data = {'gameTitle': game, 'tutorials': []}
+ for tutorial in world.web.tutorials:
+ # build dict for the json file
+ current_tutorial = {
+ 'name': tutorial.tutorial_name,
+ 'description': tutorial.description,
+ 'files': [{
+ 'language': tutorial.language,
+ 'filename': game + '/' + tutorial.file_name,
+ 'link': f'{game}/{tutorial.link}',
+ 'authors': tutorial.author
+ }]
+ }
+
+ # check if the name of the current guide exists already
+ for guide in game_data['tutorials']:
+ if guide and tutorial.tutorial_name == guide['name']:
+ guide['files'].append(current_tutorial['files'][0])
+ added = True
+ break
+ else:
+ game_data['tutorials'].append(current_tutorial)
+
+ data.append(game_data)
+ with open(Utils.local_path("WebHostLib", "static", "generated", "tutorials.json"), 'w', encoding='utf-8-sig') as json_target:
+ generic_data = {}
+ for games in data:
+ if 'Archipelago' in games['gameTitle']:
+ generic_data = data.pop(data.index(games))
+ sorted_data = [generic_data] + sorted(data, key=lambda entry: entry["gameTitle"].lower())
+ json.dump(sorted_data, json_target, indent=2, ensure_ascii=False)
+ return sorted_data
if __name__ == "__main__":
diff --git a/WebHostLib/__init__.py b/WebHostLib/__init__.py
index b13a0961d8..9bb1cb7908 100644
--- a/WebHostLib/__init__.py
+++ b/WebHostLib/__init__.py
@@ -129,6 +129,10 @@ def tutorial(game, file, lang):
@app.route('/tutorial/')
def tutorial_landing():
+ worlds = {}
+ for game, world in AutoWorldRegister.world_types.items():
+ if not world.hidden:
+ worlds[game] = world
return render_template("tutorialLanding.html")
@@ -207,6 +211,7 @@ def get_datapackge():
return Response(json.dumps(network_data_package, indent=4), mimetype="text/plain")
+@app.route('/index')
@app.route('/sitemap')
def get_sitemap():
available_games = []
@@ -217,6 +222,6 @@ def get_sitemap():
from WebHostLib.customserver import run_server_process
-from . import tracker, upload, landing, check, generate, downloads, api # to trigger app routing picking up on it
+from . import tracker, upload, landing, check, generate, downloads, api, stats # to trigger app routing picking up on it
app.register_blueprint(api.api_endpoints)
diff --git a/WebHostLib/api/generate.py b/WebHostLib/api/generate.py
index 90280ebade..faad50e1c6 100644
--- a/WebHostLib/api/generate.py
+++ b/WebHostLib/api/generate.py
@@ -45,7 +45,7 @@ def generate_api():
"detail": app.config["MAX_ROLL"]}, 409
meta = get_meta(meta_options_source)
meta["race"] = race
- results, gen_options = roll_options(options)
+ results, gen_options = roll_options(options, meta["plando_options"])
if any(type(result) == str for result in results.values()):
return {"text": str(results),
"detail": results}, 400
diff --git a/WebHostLib/autolauncher.py b/WebHostLib/autolauncher.py
index 97db4ca6f5..dc88c20253 100644
--- a/WebHostLib/autolauncher.py
+++ b/WebHostLib/autolauncher.py
@@ -53,7 +53,7 @@ else: # unix
def __enter__(self):
try:
self.fp = open(self.lockfile, "wb")
- fcntl.flock(self.fp.fileno(), fcntl.LOCK_EX)
+ fcntl.flock(self.fp.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)
except OSError as e:
raise AlreadyRunningException() from e
diff --git a/WebHostLib/check.py b/WebHostLib/check.py
index 991af59b22..b560801c1b 100644
--- a/WebHostLib/check.py
+++ b/WebHostLib/check.py
@@ -62,7 +62,10 @@ def get_yaml_data(file) -> Union[Dict[str, str], str]:
return options
-def roll_options(options: Dict[str, Union[dict, str]]) -> Tuple[Dict[str, Union[str, bool]], Dict[str, dict]]:
+def roll_options(options: Dict[str, Union[dict, str]],
+ plando_options: Set[str] = frozenset({"bosses", "items", "connections", "texts"})) -> \
+ Tuple[Dict[str, Union[str, bool]], Dict[str, dict]]:
+ plando_options = set(plando_options)
results = {}
rolled_results = {}
for filename, text in options.items():
@@ -77,11 +80,11 @@ def roll_options(options: Dict[str, Union[dict, str]]) -> Tuple[Dict[str, Union[
try:
if len(yaml_datas) == 1:
rolled_results[filename] = roll_settings(yaml_datas[0],
- plando_options={"bosses", "items", "connections", "texts"})
+ plando_options=plando_options)
else:
for i, yaml_data in enumerate(yaml_datas):
rolled_results[f"{filename}/{i + 1}"] = roll_settings(yaml_data,
- plando_options={"bosses", "items", "connections", "texts"})
+ plando_options=plando_options)
except Exception as e:
results[filename] = f"Failed to generate mystery in {filename}: {e}"
else:
diff --git a/WebHostLib/generate.py b/WebHostLib/generate.py
index da821cf539..d8d46037ad 100644
--- a/WebHostLib/generate.py
+++ b/WebHostLib/generate.py
@@ -22,11 +22,22 @@ from .upload import upload_zip_to_db
def get_meta(options_source: dict) -> dict:
+ plando_options = {
+ options_source.get("plando_bosses", ""),
+ options_source.get("plando_items", ""),
+ options_source.get("plando_connections", ""),
+ options_source.get("plando_texts", "")
+ }
+ plando_options -= {""}
+
meta = {
"hint_cost": int(options_source.get("hint_cost", 10)),
"forfeit_mode": options_source.get("forfeit_mode", "goal"),
"remaining_mode": options_source.get("remaining_mode", "disabled"),
"collect_mode": options_source.get("collect_mode", "disabled"),
+ "item_cheat": bool(int(options_source.get("item_cheat", 1))),
+ "server_password": options_source.get("server_password", None),
+ "plando_options": list(plando_options)
}
return meta
@@ -44,10 +55,9 @@ def generate(race=False):
if type(options) == str:
flash(options)
else:
- results, gen_options = roll_options(options)
- # get form data -> server settings
meta = get_meta(request.form)
meta["race"] = race
+ results, gen_options = roll_options(options, meta["plando_options"])
if race:
meta["item_cheat"] = False
@@ -89,6 +99,8 @@ def gen_game(gen_options, meta: TypeOptional[Dict[str, object]] = None, owner=No
meta.setdefault("hint_cost", 10)
race = meta.get("race", False)
del (meta["race"])
+ plando_options = meta.get("plando", {"bosses", "items", "connections", "texts"})
+ del (meta["plando_options"])
try:
target = tempfile.TemporaryDirectory()
playercount = len(gen_options)
@@ -108,6 +120,7 @@ def gen_game(gen_options, meta: TypeOptional[Dict[str, object]] = None, owner=No
erargs.outputname = seedname
erargs.outputpath = target.name
erargs.teams = 1
+ erargs.plando_options = ", ".join(plando_options)
name_counter = Counter()
for player, (playerfile, settings) in enumerate(gen_options.items(), 1):
diff --git a/WebHostLib/requirements.txt b/WebHostLib/requirements.txt
index 4046409165..258fa42374 100644
--- a/WebHostLib/requirements.txt
+++ b/WebHostLib/requirements.txt
@@ -1,6 +1,7 @@
-flask>=2.0.3
+flask>=2.1.2
pony>=0.7.16
-waitress>=2.1.0
-flask-caching>=1.10.1
-Flask-Compress>=1.11
-Flask-Limiter>=2.2.0
+waitress>=2.1.1
+flask-caching==1.10.1
+Flask-Compress>=1.12
+Flask-Limiter>=2.4.5.1
+bokeh>=2.4.3
\ No newline at end of file
diff --git a/WebHostLib/static/assets/gameInfo.js b/WebHostLib/static/assets/gameInfo.js
index 5a8a45db26..8a9c8b3f22 100644
--- a/WebHostLib/static/assets/gameInfo.js
+++ b/WebHostLib/static/assets/gameInfo.js
@@ -14,7 +14,7 @@ window.addEventListener('load', () => {
}
resolve(ajax.responseText);
};
- ajax.open('GET', `${window.location.origin}/static/assets/gameInfo/` +
+ ajax.open('GET', `${window.location.origin}/static/generated/docs/${gameInfo.getAttribute('data-game')}/` +
`${gameInfo.getAttribute('data-lang')}_${gameInfo.getAttribute('data-game')}.md`, true);
ajax.send();
}).then((results) => {
diff --git a/WebHostLib/static/assets/tutorial.js b/WebHostLib/static/assets/tutorial.js
index e943c62921..23d2f076fc 100644
--- a/WebHostLib/static/assets/tutorial.js
+++ b/WebHostLib/static/assets/tutorial.js
@@ -14,7 +14,7 @@ window.addEventListener('load', () => {
}
resolve(ajax.responseText);
};
- ajax.open('GET', `${window.location.origin}/static/assets/tutorial/` +
+ ajax.open('GET', `${window.location.origin}/static/generated/docs/` +
`${tutorialWrapper.getAttribute('data-game')}/${tutorialWrapper.getAttribute('data-file')}_` +
`${tutorialWrapper.getAttribute('data-lang')}.md`, true);
ajax.send();
diff --git a/WebHostLib/static/assets/tutorial/tutorials.json b/WebHostLib/static/assets/tutorial/tutorials.json
deleted file mode 100644
index 39ad81d4f8..0000000000
--- a/WebHostLib/static/assets/tutorial/tutorials.json
+++ /dev/null
@@ -1,578 +0,0 @@
-[
- {
- "gameTitle": "Archipelago",
- "tutorials": [
- {
- "name": "Multiworld Setup Tutorial",
- "description": "A guide to setting up the Archipelago software to generate and host multiworld games on your computer and using the website.",
- "files": [
- {
- "language": "English",
- "filename": "Archipelago/setup_en.md",
- "link": "Archipelago/setup/en",
- "authors": [
- "alwaysintreble"
- ]
- }
- ]
- },
- {
- "name": "Archipelago Website User Guide",
- "description": "A guide to using the Archipelago website to generate multiworlds or host pre-generated multiworlds.",
- "files": [
- {
- "language": "English",
- "filename": "Archipelago/using_website.md",
- "link": "Archipelago/using_website/en",
- "authors": [
- "alwaysintreble"
- ]
- }
- ]
- },
- {
- "name": "Archipelago Server and Client Commands",
- "description": "A guide detailing the commands available to the user when participating in an Archipelago session.",
- "files": [
- {
- "language": "English",
- "filename": "Archipelago/commands_en.md",
- "link": "Archipelago/commands/en",
- "authors": [
- "jat2980",
- "Ijwu"
- ]
- }
- ]
- },
- {
- "name": "Advanced YAML Guide",
- "description": "A guide to reading yaml files and editing them to fully customize your game.",
- "files": [
- {
- "language": "English",
- "filename": "Archipelago/advanced_settings_en.md",
- "link": "Archipelago/advanced_settings/en",
- "authors": [
- "alwaysintreble",
- "Alchav"
- ]
- }
- ]
- },
- {
- "name": "Archipelago Triggers Guide",
- "description": "A guide to setting up and using triggers in your game settings.",
- "files": [
- {
- "language": "English",
- "filename": "Archipelago/triggers_en.md",
- "link": "Archipelago/triggers/en",
- "authors": [
- "alwaysintreble"
- ]
- }
- ]
- },
- {
- "name": "Archipelago Plando Guide",
- "description": "A guide to understanding and using plando for your game.",
- "files": [
- {
- "language": "English",
- "filename": "Archipelago/plando_en.md",
- "link": "Archipelago/plando/en",
- "authors": [
- "alwaysintreble",
- "Alchav"
- ]
- }
- ]
- }
- ]
- },
- {
- "gameTitle": "The Legend of Zelda: A Link to the Past",
- "tutorials": [
- {
- "name": "Multiworld Setup Tutorial",
- "description": "A guide to setting up the Archipelago ALttP software on your computer. This guide covers single-player, multiworld, and related software.",
- "files": [
- {
- "language": "English",
- "filename": "A Link to the Past/multiworld_en.md",
- "link": "A Link to the Past/multiworld/en",
- "authors": [
- "Farrak Kilhn"
- ]
- },
- {
- "language": "Deutsch",
- "filename": "A Link to the Past/multiworld_de.md",
- "link": "A Link to the Past/multiworld/de",
- "authors": [
- "Fischfilet"
- ]
- },
- {
- "language": "Español",
- "filename": "A Link to the Past/multiworld_es.md",
- "link": "A Link to the Past/multiworld/es",
- "authors": [
- "Edos"
- ]
- },
- {
- "language": "Français",
- "filename": "A Link to the Past/multiworld_fr.md",
- "link": "A Link to the Past/multiworld/fr",
- "authors": [
- "Coxla"
- ]
- }
- ]
- },
- {
- "name": "MSU-1 Setup Tutorial",
- "description": "A guide to setting up MSU-1, which allows for custom in-game music.",
- "files": [
- {
- "language": "English",
- "filename": "A Link to the Past/msu1_en.md",
- "link": "A Link to the Past/msu1/en",
- "authors": [
- "Farrak Kilhn"
- ]
- },
- {
- "language": "Español",
- "filename": "A Link to the Past/msu1_es.md",
- "link": "A Link to the Past/msu1/es",
- "authors": [
- "Edos"
- ]
- },
- {
- "language": "Français",
- "filename": "A Link to the Past/msu1_fr.md",
- "link": "A Link to the Past/msu1/fr",
- "authors": [
- "Coxla"
- ]
- }
- ]
- },
- {
- "name": "Plando Tutorial",
- "description": "A guide to creating Multiworld Plandos",
- "files": [
- {
- "language": "English",
- "filename": "A Link to the Past/plando_en.md",
- "link": "A Link to the Past/plando/en",
- "authors": [
- "Berserker"
- ]
- }
- ]
- }
- ]
- },
- {
- "gameTitle": "The Legend of Zelda: Ocarina of Time",
- "tutorials": [
- {
- "name": "Multiworld Setup Tutorial",
- "description": "A guide to setting up the Archipelago Ocarina of Time software on your computer.",
- "files": [
- {
- "language": "English",
- "filename": "Ocarina of Time/setup_en.md",
- "link": "Ocarina of Time/setup/en",
- "authors": [
- "Edos"
- ]
- },
- {
- "language": "Spanish",
- "filename": "Ocarina of Time/setup_es.md",
- "link": "Ocarina of Time/setup/es",
- "authors": [
- "Edos"
- ]
- }
- ]
- }
- ]
- },
- {
- "gameTitle": "Factorio",
- "tutorials": [
- {
- "name": "Multiworld Setup Tutorial",
- "description": "A guide to setting up the Archipelago Factorio software on your computer.",
- "files": [
- {
- "language": "English",
- "filename": "Factorio/setup_en.md",
- "link": "Factorio/setup/en",
- "authors": [
- "Berserker",
- "Farrak Kilhn"
- ]
- }
- ]
- }
- ]
- },
- {
- "gameTitle": "Meritous",
- "tutorials": [
- {
- "name": "Meritous Setup Tutorial",
- "description": "A guide to setting up the Archipelago Meritous software on your computer.",
- "files": [
- {
- "language": "English",
- "filename": "Meritous/setup_en.md",
- "link": "Meritous/setup/en",
- "authors": [
- "KewlioMZX"
- ]
- }
- ]
- }
- ]
- },
- {
- "gameTitle": "Minecraft",
- "tutorials": [
- {
- "name": "Multiworld Setup Tutorial",
- "description": "A guide to setting up the Archipelago Minecraft software on your computer. This guide covers single-player, multiworld, and related software.",
- "files": [
- {
- "language": "English",
- "filename": "Minecraft/minecraft_en.md",
- "link": "Minecraft/minecraft/en",
- "authors": [
- "Kono Tyran"
- ]
- },
- {
- "language": "Spanish",
- "filename": "Minecraft/minecraft_es.md",
- "link": "Minecraft/minecraft/es",
- "authors": [
- "Edos"
- ]
- },
- {
- "language": "Swedish",
- "filename": "Minecraft/minecraft_sv.md",
- "link": "Minecraft/minecraft/sv",
- "authors": [
- "Albinum"
- ]
- }
- ]
- }
- ]
- },
- {
- "gameTitle": "Risk of Rain 2",
- "tutorials": [
- {
- "name": "Multiworld Setup Guide",
- "description": "A guide to setting up the Risk of Rain 2 integration for Archipelago multiworld games.",
- "files": [
- {
- "language": "English",
- "filename": "Risk of Rain 2/setup_en.md",
- "link": "Risk of Rain 2/setup/en",
- "authors": [
- "Ijwu"
- ]
- }
- ]
- }
- ]
- },
- {
- "gameTitle": "Raft",
- "tutorials": [
- {
- "name": "Multiworld Setup Guide",
- "description": "A guide to setting up Raft integration for Archipelago multiworld games.",
- "files": [
- {
- "language": "English",
- "filename": "Raft/setup_en.md",
- "link": "Raft/setup/en",
- "authors": [
- "SunnyBat",
- "Awareqwx"
- ]
- }
- ]
- }
- ]
- },
- {
- "gameTitle": "Timespinner",
- "tutorials": [
- {
- "name": "Multiworld Setup Guide",
- "description": "A guide to setting up the Timespinner randomizer connected to an Archipelago Multiworld",
- "files": [
- {
- "language": "English",
- "filename": "Timespinner/setup_en.md",
- "link": "Timespinner/setup/en",
- "authors": [
- "Jarno"
- ]
- },
- {
- "language": "German",
- "filename": "Timespinner/setup_de.md",
- "link": "Timespinner/setup/de",
- "authors": [
- "Grrmo",
- "Fynxes",
- "Blaze0168"
- ]
- }
- ]
- }
- ]
- },
- {
- "gameTitle": "SMZ3",
- "tutorials": [
- {
- "name": "Multiworld Setup Guide",
- "description": "A guide to setting up the Archipelago Super Metroid and A Link to the Past Crossover randomizer on your computer. This guide covers single-player, multiworld, and related software.",
- "files": [
- {
- "language": "English",
- "filename": "SMZ3/multiworld_en.md",
- "link": "SMZ3/multiworld/en",
- "authors": [
- "lordlou"
- ]
- }
- ]
- }
- ]
- },
- {
- "gameTitle": "Subnautica",
- "tutorials": [
- {
- "name": "Multiworld Setup Guide",
- "description": "A guide to setting up the Subnautica randomizer connected to an Archipelago Multiworld",
- "files": [
- {
- "language": "English",
- "filename": "Subnautica/setup_en.md",
- "link": "Subnautica/setup/en",
- "authors": [
- "Berserker"
- ]
- }
- ]
- }
- ]
- },
- {
- "gameTitle": "Super Metroid",
- "tutorials": [
- {
- "name": "Multiworld Setup Guide",
- "description": "A guide to setting up the Super Metroid Client on your computer. This guide covers single-player, multiworld, and related software.",
- "files": [
- {
- "language": "English",
- "filename": "Super Metroid/multiworld_en.md",
- "link": "Super Metroid/multiworld/en",
- "authors": [
- "Farrak Kilhn"
- ]
- }
- ]
- }
- ]
- },
- {
- "gameTitle": "Secret of Evermore",
- "tutorials": [
- {
- "name": "Multiworld Setup Guide",
- "description": "A guide to playing Secret of Evermore randomizer. This guide covers single-player, multiworld and related software.",
- "files": [
- {
- "language": "English",
- "filename": "Secret of Evermore/multiworld_en.md",
- "link": "Secret of Evermore/multiworld/en",
- "authors": [
- "Black Sliver"
- ]
- }
- ]
- }
- ]
- },
- {
- "gameTitle": "Final Fantasy",
- "tutorials": [
- {
- "name": "Multiworld Setup Guide",
- "description": "A guide to playing Final Fantasy multiworld. This guide only covers playing multiworld.",
- "files": [
- {
- "language": "English",
- "filename": "Final Fantasy/multiworld_en.md",
- "link": "Final Fantasy/multiworld/en",
- "authors": [
- "jat2980"
- ]
- }
- ]
- }
- ]
- },
- {
- "gameTitle": "Rogue Legacy",
- "tutorials": [
- {
- "name": "Multiworld Setup Guide",
- "description": "A guide to setting up the Rogue Legacy Randomizer software on your computer. This guide covers single-player, multiworld, and related software.",
- "files": [
- {
- "language": "English",
- "filename": "Rogue Legacy/rogue-legacy_en.md",
- "link": "Rogue Legacy/rogue-legacy/en",
- "authors": [
- "Phar"
- ]
- }
- ]
- }
- ]
- },
- {
- "gameTitle": "Slay the Spire",
- "tutorials": [
- {
- "name": "Multiworld Setup Guide",
- "description": "A guide to setting up Slay the Spire for Archipelago. This guide covers single-player, multiworld, and related software.",
- "files": [
- {
- "language": "English",
- "filename": "Slay the Spire/slay-the-spire_en.md",
- "link": "Slay the Spire/slay-the-spire/en",
- "authors": [
- "Phar"
- ]
- }
- ]
- }
- ]
- },
- {
- "gameTitle": "Super Mario 64 EX",
- "tutorials": [
- {
- "name": "Multiworld Setup Guide",
- "description": "A guide to setting up SM64EX for MultiWorld.",
- "files": [
- {
- "language": "English",
- "filename": "Super Mario 64/setup_en.md",
- "link": "Super Mario 64/setup/en",
- "authors": [
- "N00byKing"
- ]
- }
- ]
- }
- ]
- },
- {
- "gameTitle": "VVVVVV",
- "tutorials": [
- {
- "name": "Multiworld Setup Guide",
- "description": "A guide to setting up VVVVVV for MultiWorld.",
- "files": [
- {
- "language": "English",
- "filename": "VVVVVV/setup_en.md",
- "link": "VVVVVV/setup/en",
- "authors": [
- "N00byKing"
- ]
- }
- ]
- }
- ]
- },
- {
- "gameTitle": "ChecksFinder",
- "tutorials": [
- {
- "name": "Multiworld Setup Tutorial",
- "description": "A guide to setting up the Archipelago ChecksFinder software on your computer. This guide covers single-player, multiworld, and related software.",
- "files": [
- {
- "language": "English",
- "filename": "ChecksFinder/checksfinder_en.md",
- "link": "ChecksFinder/checksfinder/en",
- "authors": [
- "Mewlif"
- ]
- }
- ]
- }
- ]
- },
- {
- "gameTitle": "ArchipIDLE",
- "tutorials": [
- {
- "name": "Setup Guide",
- "description": "A guide to playing ArchipIDLE",
- "files": [
- {
- "language": "English",
- "filename": "ArchipIDLE/guide_en.md",
- "link": "ArchipIDLE/guide/en",
- "authors": [
- "Farrak Kilhn"
- ]
- }
- ]
- }
- ]
- },
- {
- "gameTitle": "Hollow Knight",
- "tutorials": [
- {
- "name": "Mod Setup and Use Guide",
- "description": "A guide to playing Hollow Knight with Archipelago.",
- "files": [
- {
- "language": "English",
- "filename": "Hollow Knight/setup_en.md",
- "link": "Hollow Knight/setup/en",
- "authors": [
- "ijwu"
- ]
- }
- ]
- }
- ]
- }
-]
diff --git a/WebHostLib/static/styles/generate.css b/WebHostLib/static/styles/generate.css
index 8b77d98191..066fb8a7c5 100644
--- a/WebHostLib/static/styles/generate.css
+++ b/WebHostLib/static/styles/generate.css
@@ -6,7 +6,7 @@
}
#generate-game{
- width: 700px;
+ width: 990px;
min-height: 360px;
text-align: center;
}
@@ -25,9 +25,26 @@
margin-bottom: 1rem;
}
+#generate-game-tables-container{
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: space-around;
+}
+
+.table-wrapper select {
+ width: 200px;
+}
+
+.table-wrapper input:not([type]){
+ width: 200px;
+}
+
#generate-game-form-wrapper table td{
text-align: left;
padding-right: 0.5rem;
+ vertical-align: top;
+ width: 230px;
}
#generate-form-button-row{
diff --git a/WebHostLib/static/styles/stats.css b/WebHostLib/static/styles/stats.css
new file mode 100644
index 0000000000..9eb165abdc
--- /dev/null
+++ b/WebHostLib/static/styles/stats.css
@@ -0,0 +1,15 @@
+#charts-wrapper{
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: space-between;
+}
+
+.chart-container{
+ display: flex;
+ flex-direction: column;
+ width: calc(50% - 15px);
+ min-width: 400px;
+ margin-bottom: 30px;
+}
+
diff --git a/WebHostLib/static/styles/tooltip.css b/WebHostLib/static/styles/tooltip.css
index a5d8c7596b..0c5c0c6969 100644
--- a/WebHostLib/static/styles/tooltip.css
+++ b/WebHostLib/static/styles/tooltip.css
@@ -47,7 +47,7 @@ give it one of the following classes: tooltip-left, tooltip-right, tooltip-top,
/** Directional arrow styles */
.tooltip:before, [data-tooltip]:before {
- z-index: 1001;
+ z-index: 10000;
border: 6px solid transparent;
background: transparent;
content: "";
@@ -55,7 +55,7 @@ give it one of the following classes: tooltip-left, tooltip-right, tooltip-top,
/** Content styles */
.tooltip:after, [data-tooltip]:after {
- z-index: 1000;
+ z-index: 10000;
padding: 8px;
width: 160px;
border-radius: 4px;
diff --git a/WebHostLib/stats.py b/WebHostLib/stats.py
new file mode 100644
index 0000000000..9a164d02cb
--- /dev/null
+++ b/WebHostLib/stats.py
@@ -0,0 +1,76 @@
+from collections import Counter, defaultdict
+from itertools import cycle
+from datetime import datetime, timedelta, date
+from math import tau
+
+from bokeh.embed import components
+from bokeh.palettes import Dark2_8 as palette
+from bokeh.plotting import figure, ColumnDataSource
+from bokeh.resources import INLINE
+from flask import render_template
+from pony.orm import select
+
+from . import app, cache
+from .models import Room
+
+
+def get_db_data():
+ games_played = defaultdict(Counter)
+ total_games = Counter()
+ cutoff = date.today()-timedelta(days=30000)
+ room: Room
+ for room in select(room for room in Room if room.creation_time >= cutoff):
+ for slot in room.seed.slots:
+ total_games[slot.game] += 1
+ games_played[room.creation_time.date()][slot.game] += 1
+ return total_games, games_played
+
+
+@app.route('/stats')
+@cache.memoize(timeout=60*60) # regen once per hour should be plenty
+def stats():
+ plot = figure(title="Games Played Per Day", x_axis_type='datetime', x_axis_label="Date",
+ y_axis_label="Games Played", sizing_mode="scale_both", width=500, height=500)
+
+ total_games, games_played = get_db_data()
+ days = sorted(games_played)
+
+ cyc_palette = cycle(palette)
+
+ for game in sorted(total_games):
+ occurences = []
+ for day in days:
+ occurences.append(games_played[day][game])
+ plot.line([datetime.combine(day, datetime.min.time()) for day in days],
+ occurences, legend_label=game, line_width=2, color=next(cyc_palette))
+
+ total = sum(total_games.values())
+ pie = figure(plot_height=350, title=f"Games Played in the Last 30 Days (Total: {total})", toolbar_location=None,
+ tools="hover", tooltips=[("Game:", "@games"), ("Played:", "@count")],
+ sizing_mode="scale_both", width=500, height=500)
+ pie.axis.visible = False
+
+ data = {
+ "games": [],
+ "count": [],
+ "start_angles": [],
+ "end_angles": [],
+ }
+ current_angle = 0
+ for i, (game, count) in enumerate(total_games.most_common()):
+ data["games"].append(game)
+ data["count"].append(count)
+ data["start_angles"].append(current_angle)
+ angle = count / total * tau
+ current_angle += angle
+ data["end_angles"].append(current_angle)
+
+ data["colors"] = [element[1] for element in sorted((game, color) for game, color in
+ zip(data["games"], cycle(palette)))]
+ pie.wedge(x=0.5, y=0.5, radius=0.5,
+ start_angle="start_angles", end_angle="end_angles", fill_color="colors",
+ source=ColumnDataSource(data=data), legend_field="games")
+
+ script, charts = components((plot, pie))
+ return render_template("stats.html", js_resources=INLINE.render_js(), css_resources=INLINE.render_css(),
+ chart_data=script, charts=charts)
diff --git a/WebHostLib/templates/generate.html b/WebHostLib/templates/generate.html
index 8b07940f7d..916ed72b8d 100644
--- a/WebHostLib/templates/generate.html
+++ b/WebHostLib/templates/generate.html
@@ -35,86 +35,157 @@
{{ patch.player_id }}
- {{ patch.player_name }}
+ {{ patch.player_name }}
{{ patch.game }}
{% if patch.game == "Minecraft" %}
diff --git a/WebHostLib/templates/siteMap.html b/WebHostLib/templates/siteMap.html
index dcce772723..9626aef3f5 100644
--- a/WebHostLib/templates/siteMap.html
+++ b/WebHostLib/templates/siteMap.html
@@ -25,6 +25,7 @@
Tutorials Page
User Content
Weighted Settings Page
+ Game Statistics
Game Info Pages
diff --git a/WebHostLib/templates/stats.html b/WebHostLib/templates/stats.html
new file mode 100644
index 0000000000..3e60c7afdd
--- /dev/null
+++ b/WebHostLib/templates/stats.html
@@ -0,0 +1,28 @@
+{% extends 'pageWrapper.html' %}
+
+{% block head %}
+ Archipelago Game Statistics
+
+
+ {{ css_resources|indent(4)|safe }}
+ {{ js_resources|indent(4)|safe }}
+ {{ chart_data|indent(4)|safe }}
+{% endblock %}
+
+{% block body %}
+ {% include 'header/grassFlowersHeader.html' %}
+
+
Archipelago Game Statistics
+
+ The data on this page is updated hourly.
+
+
+
+ {% for chart in charts %}
+
+ {{ chart|indent(16)|safe }}
+
+ {% endfor %}
+
+
+{% endblock %}
diff --git a/WebHostLib/tracker.py b/WebHostLib/tracker.py
index d2289c127f..c4713b54a3 100644
--- a/WebHostLib/tracker.py
+++ b/WebHostLib/tracker.py
@@ -634,7 +634,8 @@ def __renderOoTTracker(multisave: Dict[str, Any], room: Room, locations: Dict[in
"Shadow Temple": (67485, 67532),
"Spirit Temple": (67533, 67582),
"Ice Cavern": (67583, 67596),
- "Gerudo Training Grounds": (67597, 67635),
+ "Gerudo Training Ground": (67597, 67635),
+ "Thieves' Hideout": (67259, 67263),
"Ganon's Castle": (67636, 67673),
}
@@ -642,7 +643,7 @@ def __renderOoTTracker(multisave: Dict[str, Any], room: Room, locations: Dict[in
full_name = lookup_any_location_id_to_name[id]
if id == 67673:
return full_name[13:] # Ganons Tower Boss Key Chest
- if area != 'Overworld':
+ if area not in ["Overworld", "Thieves' Hideout"]:
# trim dungeon name. leaves an extra space that doesn't display, or trims fully for DC/Jabu/GC
return full_name[len(area):]
return full_name
@@ -653,6 +654,13 @@ def __renderOoTTracker(multisave: Dict[str, Any], room: Room, locations: Dict[in
checks_done = {area: len(list(filter(lambda x: x, location_info[area].values()))) for area in area_id_ranges}
checks_in_area = {area: len([id for id in range(min_id, max_id+1) if id in locations[player]])
for area, (min_id, max_id) in area_id_ranges.items()}
+
+ # Remove Thieves' Hideout checks from Overworld, since it's in the middle of the range
+ checks_in_area["Overworld"] -= checks_in_area["Thieves' Hideout"]
+ checks_done["Overworld"] -= checks_done["Thieves' Hideout"]
+ for loc in location_info["Thieves' Hideout"]:
+ del location_info["Overworld"][loc]
+
checks_done['Total'] = sum(checks_done.values())
checks_in_area['Total'] = sum(checks_in_area.values())
@@ -670,7 +678,8 @@ def __renderOoTTracker(multisave: Dict[str, Any], room: Room, locations: Dict[in
"Spirit Temple": inventory[66178],
"Shadow Temple": inventory[66179],
"Bottom of the Well": inventory[66180],
- "Gerudo Training Grounds": inventory[66181],
+ "Gerudo Training Ground": inventory[66181],
+ "Thieves' Hideout": inventory[66182],
"Ganon's Castle": inventory[66183],
}
boss_key_counts = {
diff --git a/data/client.kv b/data/client.kv
index 09be018830..4f924896d9 100644
--- a/data/client.kv
+++ b/data/client.kv
@@ -30,7 +30,7 @@
size_hint_x: 1
size_hint_y: 1
pos: (0, 0)
-:
+:
size: self.texture_size
size_hint: None, None
font_size: dp(18)
@@ -51,4 +51,6 @@
rgba: 0.235, 0.678, 0.843, 1
Line:
width: 1
- rectangle: self.x-2, self.y-2, self.width+4, self.height+4
\ No newline at end of file
+ rectangle: self.x-2, self.y-2, self.width+4, self.height+4
+:
+ pos_hint: {'center_y': 0.5, 'center_x': 0.5}
diff --git a/data/lua/OOT/oot_connector.lua b/data/lua/OOT/oot_connector.lua
index 0d42e62659..96eee4f78f 100644
--- a/data/lua/OOT/oot_connector.lua
+++ b/data/lua/OOT/oot_connector.lua
@@ -2,14 +2,14 @@ local socket = require("socket")
local json = require('json')
local math = require('math')
-local script_version = '2022-03-22' -- Should be the last modified date
+local last_modified_date = '2022-05-25' -- Should be the last modified date
+local script_version = 1
--------------------------------------------------
-- Heavily modified form of RiptideSage's tracker
--------------------------------------------------
--- TODO: read this from the ROM
-local NUM_BIG_POES_REQUIRED = 1
+local NUM_BIG_POES_REQUIRED = 10
-- The offset constants are all from N64 RAM start. Offsets in the check statements are relative.
local save_context_offset = 0x11A5D0
@@ -464,7 +464,7 @@ local read_graveyard_checks = function()
local checks = {}
checks["Graveyard Shield Grave Chest"] = chest_check(0x40, 0x00)
checks["Graveyard Heart Piece Grave Chest"] = chest_check(0x3F, 0x00)
- checks["Graveyard Composers Grave Chest"] = chest_check(0x41, 0x00)
+ checks["Graveyard Royal Familys Tomb Chest"] = chest_check(0x41, 0x00)
checks["Graveyard Freestanding PoH"] = on_the_ground_check(0x53, 0x4)
checks["Graveyard Dampe Gravedigging Tour"] = on_the_ground_check(0x53, 0x8)
checks["Graveyard Hookshot Chest"] = chest_check(0x48, 0x00)
@@ -899,11 +899,11 @@ end
local read_gerudo_fortress_checks = function()
local checks = {}
- checks["GF North F1 Carpenter"] = on_the_ground_check(0xC, 0xC)
- checks["GF North F2 Carpenter"] = on_the_ground_check(0xC, 0xA)
- checks["GF South F1 Carpenter"] = on_the_ground_check(0xC, 0xE)
- checks["GF South F2 Carpenter"] = on_the_ground_check(0xC, 0xF)
- checks["GF Gerudo Membership Card"] = membership_card_check(0xC, 0x2)
+ checks["Hideout Jail Guard (1 Torch)"] = on_the_ground_check(0xC, 0xC)
+ checks["Hideout Jail Guard (2 Torches)"] = on_the_ground_check(0xC, 0xF)
+ checks["Hideout Jail Guard (3 Torches)"] = on_the_ground_check(0xC, 0xA)
+ checks["Hideout Jail Guard (4 Torches)"] = on_the_ground_check(0xC, 0xE)
+ checks["Hideout Gerudo Membership Card"] = membership_card_check(0xC, 0x2)
checks["GF Chest"] = chest_check(0x5D, 0x0)
checks["GF HBA 1000 Points"] = info_table_check(0x33, 0x0)
checks["GF HBA 1500 Points"] = item_get_info_check(0x0, 0x7)
@@ -915,46 +915,46 @@ end
local read_gerudo_training_ground_checks = function(mq_table_address)
local checks = {}
if not is_master_quest_dungeon(mq_table_address, 0xB) then
- checks["Gerudo Training Grounds Lobby Left Chest"] = chest_check(0x0B, 0x13)
- checks["Gerudo Training Grounds Lobby Right Chest"] = chest_check(0x0B, 0x07)
- checks["Gerudo Training Grounds Stalfos Chest"] = chest_check(0x0B, 0x00)
- checks["Gerudo Training Grounds Before Heavy Block Chest"] = chest_check(0x0B, 0x11)
- checks["Gerudo Training Grounds Heavy Block First Chest"] = chest_check(0x0B, 0x0F)
- checks["Gerudo Training Grounds Heavy Block Second Chest"] = chest_check(0x0B, 0x0E)
- checks["Gerudo Training Grounds Heavy Block Third Chest"] = chest_check(0x0B, 0x14)
- checks["Gerudo Training Grounds Heavy Block Fourth Chest"] = chest_check(0x0B, 0x02)
- checks["Gerudo Training Grounds Eye Statue Chest"] = chest_check(0x0B, 0x03)
- checks["Gerudo Training Grounds Near Scarecrow Chest"] = chest_check(0x0B, 0x04)
- checks["Gerudo Training Grounds Hammer Room Clear Chest"] = chest_check(0x0B, 0x12)
- checks["Gerudo Training Grounds Hammer Room Switch Chest"] = chest_check(0x0B, 0x10)
- checks["Gerudo Training Grounds Freestanding Key"] = on_the_ground_check(0x0B, 0x1)
- checks["Gerudo Training Grounds Maze Right Central Chest"] = chest_check(0x0B, 0x05)
- checks["Gerudo Training Grounds Maze Right Side Chest"] = chest_check(0x0B, 0x08)
- checks["Gerudo Training Grounds Underwater Silver Rupee Chest"] = chest_check(0x0B, 0x0D)
- checks["Gerudo Training Grounds Beamos Chest"] = chest_check(0x0B, 0x01)
- checks["Gerudo Training Grounds Hidden Ceiling Chest"] = chest_check(0x0B, 0x0B)
- checks["Gerudo Training Grounds Maze Path First Chest"] = chest_check(0x0B, 0x06)
- checks["Gerudo Training Grounds Maze Path Second Chest"] = chest_check(0x0B, 0x0A)
- checks["Gerudo Training Grounds Maze Path Third Chest"] = chest_check(0x0B, 0x09)
- checks["Gerudo Training Grounds Maze Path Final Chest"] = chest_check(0x0B, 0x0C)
+ checks["Gerudo Training Ground Lobby Left Chest"] = chest_check(0x0B, 0x13)
+ checks["Gerudo Training Ground Lobby Right Chest"] = chest_check(0x0B, 0x07)
+ checks["Gerudo Training Ground Stalfos Chest"] = chest_check(0x0B, 0x00)
+ checks["Gerudo Training Ground Before Heavy Block Chest"] = chest_check(0x0B, 0x11)
+ checks["Gerudo Training Ground Heavy Block First Chest"] = chest_check(0x0B, 0x0F)
+ checks["Gerudo Training Ground Heavy Block Second Chest"] = chest_check(0x0B, 0x0E)
+ checks["Gerudo Training Ground Heavy Block Third Chest"] = chest_check(0x0B, 0x14)
+ checks["Gerudo Training Ground Heavy Block Fourth Chest"] = chest_check(0x0B, 0x02)
+ checks["Gerudo Training Ground Eye Statue Chest"] = chest_check(0x0B, 0x03)
+ checks["Gerudo Training Ground Near Scarecrow Chest"] = chest_check(0x0B, 0x04)
+ checks["Gerudo Training Ground Hammer Room Clear Chest"] = chest_check(0x0B, 0x12)
+ checks["Gerudo Training Ground Hammer Room Switch Chest"] = chest_check(0x0B, 0x10)
+ checks["Gerudo Training Ground Freestanding Key"] = on_the_ground_check(0x0B, 0x1)
+ checks["Gerudo Training Ground Maze Right Central Chest"] = chest_check(0x0B, 0x05)
+ checks["Gerudo Training Ground Maze Right Side Chest"] = chest_check(0x0B, 0x08)
+ checks["Gerudo Training Ground Underwater Silver Rupee Chest"] = chest_check(0x0B, 0x0D)
+ checks["Gerudo Training Ground Beamos Chest"] = chest_check(0x0B, 0x01)
+ checks["Gerudo Training Ground Hidden Ceiling Chest"] = chest_check(0x0B, 0x0B)
+ checks["Gerudo Training Ground Maze Path First Chest"] = chest_check(0x0B, 0x06)
+ checks["Gerudo Training Ground Maze Path Second Chest"] = chest_check(0x0B, 0x0A)
+ checks["Gerudo Training Ground Maze Path Third Chest"] = chest_check(0x0B, 0x09)
+ checks["Gerudo Training Ground Maze Path Final Chest"] = chest_check(0x0B, 0x0C)
else
- checks["Gerudo Training Grounds MQ Lobby Left Chest"] = chest_check(0xB, 0x13)
- checks["Gerudo Training Grounds MQ Lobby Right Chest"] = chest_check(0xB, 0x7)
- checks["Gerudo Training Grounds MQ First Iron Knuckle Chest"] = chest_check(0xB, 0x0)
- checks["Gerudo Training Grounds MQ Before Heavy Block Chest"] = chest_check(0xB, 0x11)
- checks["Gerudo Training Grounds MQ Heavy Block Chest"] = chest_check(0xB, 0x2)
- checks["Gerudo Training Grounds MQ Eye Statue Chest"] = chest_check(0xB, 0x3)
- checks["Gerudo Training Grounds MQ Ice Arrows Chest"] = chest_check(0xB, 0x4)
- checks["Gerudo Training Grounds MQ Second Iron Knuckle Chest"] = chest_check(0xB, 0x12)
- checks["Gerudo Training Grounds MQ Flame Circle Chest"] = chest_check(0xB, 0xE)
- checks["Gerudo Training Grounds MQ Maze Right Central Chest"] = chest_check(0xB, 0x5)
- checks["Gerudo Training Grounds MQ Maze Right Side Chest"] = chest_check(0xB, 0x8)
- checks["Gerudo Training Grounds MQ Underwater Silver Rupee Chest"] = chest_check(0xB, 0xD)
- checks["Gerudo Training Grounds MQ Dinolfos Chest"] = chest_check(0xB, 0x1)
- checks["Gerudo Training Grounds MQ Hidden Ceiling Chest"] = chest_check(0xB, 0xB)
- checks["Gerudo Training Grounds MQ Maze Path First Chest"] = chest_check(0xB, 0x6)
- checks["Gerudo Training Grounds MQ Maze Path Third Chest"] = chest_check(0xB, 0x9)
- checks["Gerudo Training Grounds MQ Maze Path Second Chest"] = chest_check(0xB, 0xA)
+ checks["Gerudo Training Ground MQ Lobby Left Chest"] = chest_check(0xB, 0x13)
+ checks["Gerudo Training Ground MQ Lobby Right Chest"] = chest_check(0xB, 0x7)
+ checks["Gerudo Training Ground MQ First Iron Knuckle Chest"] = chest_check(0xB, 0x0)
+ checks["Gerudo Training Ground MQ Before Heavy Block Chest"] = chest_check(0xB, 0x11)
+ checks["Gerudo Training Ground MQ Heavy Block Chest"] = chest_check(0xB, 0x2)
+ checks["Gerudo Training Ground MQ Eye Statue Chest"] = chest_check(0xB, 0x3)
+ checks["Gerudo Training Ground MQ Ice Arrows Chest"] = chest_check(0xB, 0x4)
+ checks["Gerudo Training Ground MQ Second Iron Knuckle Chest"] = chest_check(0xB, 0x12)
+ checks["Gerudo Training Ground MQ Flame Circle Chest"] = chest_check(0xB, 0xE)
+ checks["Gerudo Training Ground MQ Maze Right Central Chest"] = chest_check(0xB, 0x5)
+ checks["Gerudo Training Ground MQ Maze Right Side Chest"] = chest_check(0xB, 0x8)
+ checks["Gerudo Training Ground MQ Underwater Silver Rupee Chest"] = chest_check(0xB, 0xD)
+ checks["Gerudo Training Ground MQ Dinolfos Chest"] = chest_check(0xB, 0x1)
+ checks["Gerudo Training Ground MQ Hidden Ceiling Chest"] = chest_check(0xB, 0xB)
+ checks["Gerudo Training Ground MQ Maze Path First Chest"] = chest_check(0xB, 0x6)
+ checks["Gerudo Training Ground MQ Maze Path Third Chest"] = chest_check(0xB, 0x9)
+ checks["Gerudo Training Ground MQ Maze Path Second Chest"] = chest_check(0xB, 0xA)
end
return checks
end
@@ -1107,7 +1107,7 @@ local read_song_checks = function()
checks["Song from Impa"] = event_check(0x5, 0x9) -- Zelda's Lullaby
checks["Song from Malon"] = event_check(0x5, 0x8) -- Epona's Song
checks["Song from Saria"] = event_check(0x5, 0x7) -- Saria's Song
- checks["Song from Composers Grave"] = event_check(0x5, 0xA) -- Sun's Song
+ checks["Song from Royal Familys Tomb"] = event_check(0x5, 0xA) -- Sun's Song
checks["Song from Ocarina of Time"] = event_check(0xA, 0x9) -- Song of Time
checks["Song from Windmill"] = event_check(0x5, 0xB) -- Song of Storms
checks["Sheik in Forest"] = event_check(0x5, 0x0) -- Minuet of Forest
@@ -1546,7 +1546,7 @@ local player_names_address = coop_context + 20
local player_name_length = 8 -- 8 bytes
local rom_name_location = player_names_address + 0x800
-local master_quest_table_address = rando_context + 0xB220
+local master_quest_table_address = rando_context + (mainmemory.read_u32_be(rando_context + 0x0CE0) - 0x03480000)
local save_context_addr = 0x11A5D0
local internal_count_addr = save_context_addr + 0x90
@@ -1555,6 +1555,8 @@ local item_queue = {}
local first_connect = true
local game_complete = false
+NUM_BIG_POES_REQUIRED = mainmemory.read_u8(rando_context + 0x0CEE)
+
local bytes_to_string = function(bytes)
local string = ''
for i=0,#(bytes) do
@@ -1781,6 +1783,7 @@ function receive()
-- Determine message to send back
local retTable = {}
retTable["playerName"] = get_player_name()
+ retTable["scriptVersion"] = script_version
retTable["deathlinkActive"] = deathlink_enabled()
if InSafeState() then
retTable["locations"] = check_all_locations(master_quest_table_address)
diff --git a/docs/api.md b/docs/api.md
index cb1b1e4bdd..7c81adb3cd 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -67,6 +67,11 @@ for your world specifically on the webhost.
`bug_report_page` (optional) can be a link to a bug reporting page, most likely a GitHub issue page, that will be placed by the site to help direct users to report bugs.
+`tutorials` list of `Tutorial` classes where each class represents a guide to be generated on the webhost.
+
+`game_info_languages` (optional) List of strings for defining the existing gameinfo pages your game supports. The documents must be
+prefixed with the same string as defined here. Default already has 'en'.
+
### MultiWorld Object
The `MultiWorld` object references the whole multiworld (all items and locations
@@ -341,7 +346,7 @@ from .Options import mygame_options # the options we defined earlier
from .Items import mygame_items # data used below to add items to the World
from .Locations import mygame_locations # same as above
from ..AutoWorld import World
-from BaseClasses import Region, Location, Entrance, Item
+from BaseClasses import Region, Location, Entrance, Item, RegionType
from Utils import get_options, output_path
class MyGameItem(Item): # or from Items import MyGameItem
@@ -426,11 +431,14 @@ In addition, the following methods can be implemented and attributes can be set
* `required_client_version: Tuple(int, int, int)`
Client version as tuple of 3 ints to make sure the client is compatible to
this world (e.g. implements all required features) when connecting.
+* `assert_generate(cls, world)` is a class method called at the start of
+ generation to check the existence of prerequisite files, usually a ROM for
+ games which require one.
#### generate_early
```python
-def generate_early(self):
+def generate_early(self) -> None:
# read player settings to world instance
self.final_boss_hp = self.world.final_boss_hp[self.player].value
```
@@ -456,7 +464,7 @@ def create_event(self, event: str):
#### create_items
```python
-def create_items(self):
+def create_items(self) -> None:
# Add items to the Multiworld.
# If there are two of the same item, the item has to be twice in the pool.
# Which items are added to the pool may depend on player settings,
@@ -483,23 +491,23 @@ def create_items(self):
#### create_regions
```python
-def create_regions(self):
+def create_regions(self) -> None:
# Add regions to the multiworld. "Menu" is the required starting point.
# Arguments to Region() are name, type, human_readable_name, player, world
- r = Region("Menu", None, "Menu", self.player, self.world)
+ r = Region("Menu", RegionType.Generic, "Menu", self.player, self.world)
# Set Region.exits to a list of entrances that are reachable from region
r.exits = [Entrance(self.player, "New game", r)] # or use r.exits.append
# Append region to MultiWorld's regions
self.world.regions.append(r) # or use += [r...]
- r = Region("Main Area", None, "Main Area", self.player, self.world)
+ r = Region("Main Area", RegionType.Generic, "Main Area", self.player, self.world)
# Add main area's locations to main area (all but final boss)
r.locations = [MyGameLocation(self.player, location.name,
self.location_name_to_id[location.name], r)]
r.exits = [Entrance(self.player, "Boss Door", r)]
self.world.regions.append(r)
- r = Region("Boss Room", None, "Boss Room", self.player, self.world)
+ r = Region("Boss Room", RegionType.Generic, "Boss Room", self.player, self.world)
# add event to Boss Room
r.locations = [MyGameLocation(self.player, "Final Boss", None, r)]
self.world.regions.append(r)
@@ -518,7 +526,7 @@ def create_regions(self):
#### generate_basic
```python
-def generate_basic(self):
+def generate_basic(self) -> None:
# place "Victory" at "Final Boss" and set collection as win condition
self.world.get_location("Final Boss", self.player)\
.place_locked_item(self.create_event("Victory"))
@@ -539,7 +547,7 @@ def generate_basic(self):
from ..generic.Rules import add_rule, set_rule, forbid_item
from Items import get_item_type
-def set_rules(self):
+def set_rules(self) -> None:
# For some worlds this step can be omitted if either a Logic mixin
# (see below) is used, it's easier to apply the rules from data during
# location generation or everything is in generate_basic
@@ -623,7 +631,7 @@ class MyGameWorld(World):
# ...
def set_rules(self):
set_rule(self.world.get_location("A Door", self.player),
- lamda state: state._myworld_has_key(self.world, self.player))
+ lamda state: state._mygame_has_key(self.world, self.player))
```
### Generate Output
diff --git a/docs/network diagram.jpg b/docs/network diagram.jpg
new file mode 100644
index 0000000000..96f7d084eb
Binary files /dev/null and b/docs/network diagram.jpg differ
diff --git a/docs/network diagram.md b/docs/network diagram.md
new file mode 100644
index 0000000000..95f959b7cc
--- /dev/null
+++ b/docs/network diagram.md
@@ -0,0 +1,157 @@
+```mermaid
+flowchart LR
+ %% Diagram arranged specifically so output generates no terrible crossing lines.
+ %% AP Server
+ AS{Archipelago Server}
+
+ %% CommonClient.py
+ CC[CommonClient.py]
+ AS <-- WebSockets --> CC
+
+ %% ChecksFinder
+ subgraph ChecksFinder
+ CFC[ChecksFinderClient]
+ CF[ChecksFinder]
+ CFC <--> CF
+ end
+ CC <-- Integrated --> CFC
+
+ %% A Link to the Past
+ subgraph A Link to the Past
+ LTTP[SNES]
+ end
+ SNI <-- Various, depending on SNES device --> LTTP
+
+ %% Final Fantasy
+ subgraph Final Fantasy 1
+ FF1[FF1Client]
+ FFLUA[Lua Connector]
+ BZFF[BizHawk with Final Fantasy Loaded]
+ FF1 <-- LuaSockets --> FFLUA
+ FFLUA <--> BZFF
+ end
+ CC <-- Integrated --> FF1
+
+ %% Ocarina of Time
+ subgraph Ocarina of Time
+ OC[OoTClient]
+ LC[Lua Connector]
+ OCB[BizHawk with Ocarina of Time Loaded]
+ OC <-- LuaSockets --> LC
+ LC <--> OCB
+ end
+ CC <-- Integrated --> OC
+
+ %% SNI Connectors
+ SC[SNIClient]
+ SNI["Super Nintendo Interface (SNI)"]
+ CC <-- Integrated --> SC
+ SC <-- WebSockets --> SNI
+
+ %% Super Metroid
+ subgraph Super Metroid
+ SM[SNES]
+ end
+ SNI <-- Various, depending on SNES device --> SM
+
+ %% Super Metroid/A Link to the Past Combo Randomizer
+ subgraph "SMZ3"
+ SMZ[SNES]
+ end
+ SNI <-- Various, depending on SNES device --> SMZ
+
+ %% Native Clients or Games
+ %% Games or clients which compile to native or which the client is integrated in the game.
+ subgraph "Native"
+ APCLIENTPP[Game using apclientpp Client Library]
+ APCPP[Game using Apcpp Client Library]
+ subgraph Secret of Evermore
+ SOE[ap-soeclient]
+ end
+ SM64[Super Mario 64 Ex]
+ V6[VVVVVV]
+ MT[Meritous]
+ TW[The Witness]
+
+ APCLIENTPP <--> SOE
+ APCLIENTPP <--> MT
+ APCLIENTPP <-- The Witness Randomizer --> TW
+ APCPP <--> SM64
+ APCPP <--> V6
+ end
+ SOE <--> SNI <-- Various, depending on SNES device --> SOESNES
+ AS <-- WebSockets --> APCLIENTPP
+ AS <-- WebSockets --> APCPP
+
+ %% Java Based Games
+ subgraph Java
+ JM[Mod with Archipelago.MultiClient.Java]
+ STS[Slay the Spire]
+ JM <-- Mod the Spire --> STS
+ subgraph Minecraft
+ MCS[Minecraft Forge Server]
+ JMC[Any Java Minecraft Clients]
+ MCS <-- TCP --> JMC
+ end
+ JM <-- Forge Mod Loader --> MCS
+ end
+ AS <-- WebSockets --> JM
+
+ %% .NET Based Games
+ subgraph .NET
+ NM[Mod with Archipelago.MultiClient.Net]
+ subgraph FNA/XNA
+ TS[Timespinner]
+ RL[Rogue Legacy]
+ end
+ NM <-- TsRandomizer --> TS
+ NM <-- RogueLegacyRandomizer --> RL
+ subgraph Unity
+ ROR[Risk of Rain 2]
+ SN[Subnautica]
+ HK[Hollow Knight]
+ R[Raft]
+ end
+ NM <-- BepInEx --> ROR
+ NM <-- "QModLoader (BepInEx)" --> SN
+ NM <-- HK Modding API --> HK
+ NM <--> R
+ end
+ AS <-- WebSockets --> NM
+
+ %% Archipelago WebHost
+ subgraph "WebHost (archipelago.gg)"
+ WHNOTE(["Configurable (waitress, gunicorn, flask)"])
+ AH[AutoHoster]
+ PDB[(PonyORM DB)]
+ WH[WebHost]
+ FWC[Flask WebContent]
+ AG[AutoGenerator]
+
+ AH <-- SQL --> PDB
+ WH -- Subprocesses --> AH
+ FWC <-- SQL --> PDB
+ WH --> FWC
+ AG -- Deposit Generated Worlds --> PDB
+ PDB -- Provide Generation Instructions --> AG
+ WH -- Subprocesses --> AG
+ end
+ AH -- Subprocesses --> AS
+
+ %% Special subgraph for SoE for its SNES connection
+ subgraph Secret of Evermore
+ SOESNES[SNES]
+ end
+
+ %% Factorio
+ subgraph Factorio
+ FC[FactorioClient] <-- RCON --> FS[Factorio Server]
+ FS <-- UDP --> FG[Factorio Games]
+ FMOD[Factorio Mod Generated by AP]
+ FMAPI[Factorio Modding API]
+ FMAPI <--> FS
+ FMAPI <--> FG
+ FMOD <--> FMAPI
+ end
+ CC <-- Integrated --> FC
+```
\ No newline at end of file
diff --git a/docs/network diagram.svg b/docs/network diagram.svg
new file mode 100644
index 0000000000..927883a6d8
--- /dev/null
+++ b/docs/network diagram.svg
@@ -0,0 +1 @@
+Factorio
Secret of Evermore
WebHost (archipelago.gg)
.NET
Java
Native
SMZ3
Super Metroid
Ocarina of Time
Final Fantasy 1
A Link to the Past
ChecksFinder
FNA/XNA
Unity
Minecraft
Secret of Evermore
WebSockets
Integrated
Various, depending on SNES device
LuaSockets
Integrated
LuaSockets
Integrated
Integrated
WebSockets
Various, depending on SNES device
Various, depending on SNES device
The Witness Randomizer
Various, depending on SNES device
WebSockets
WebSockets
Mod the Spire
TCP
Forge Mod Loader
WebSockets
TsRandomizer
RogueLegacyRandomizer
BepInEx
QModLoader (BepInEx)
HK Modding API
WebSockets
SQL
Subprocesses
SQL
Deposit Generated Worlds
Provide Generation Instructions
Subprocesses
Subprocesses
RCON
UDP
Integrated
Factorio Server
FactorioClient
Factorio Games
Factorio Mod Generated by AP
Factorio Modding API
SNES
Configurable (waitress, gunicorn, flask)
AutoHoster
PonyORM DB
WebHost
Flask WebContent
AutoGenerator
Mod with Archipelago.MultiClient.Net
Risk of Rain 2
Subnautica
Hollow Knight
Raft
Timespinner
Rogue Legacy
Mod with Archipelago.MultiClient.Java
Slay the Spire
Minecraft Forge Server
Any Java Minecraft Clients
Game using apclientpp Client Library
Game using Apcpp Client Library
Super Mario 64 Ex
VVVVVV
Meritous
The Witness
ap-soeclient
SNES
SNES
OoTClient
Lua Connector
BizHawk with Ocarina of Time Loaded
FF1Client
Lua Connector
BizHawk with Final Fantasy Loaded
SNES
ChecksFinderClient
ChecksFinder
Archipelago Server
CommonClient.py
Super Nintendo Interface (SNI)
SNIClient
```
\ No newline at end of file
diff --git a/docs/network protocol.md b/docs/network protocol.md
index ae93e369ee..f728e4f68e 100644
--- a/docs/network protocol.md
+++ b/docs/network protocol.md
@@ -65,8 +65,8 @@ Sent to clients when they connect to an Archipelago server.
| location_check_points | int | The amount of hint points you receive per item/location check completed. ||
| players | list\[[NetworkPlayer](#NetworkPlayer)\] | Sent only if the client is properly authenticated (see [Archipelago Connection Handshake](#Archipelago-Connection-Handshake)). Information on the players currently connected to the server. |
| games | list\[str\] | sorted list of game names for the players, so first player's game will be games\[0\]. Matches game names in datapackage. |
-| datapackage_version | int | Data version of the [data package](#Data-Package-Contents) the server will send. Used to update the client's (optional) local cache. |
-| datapackage_versions | dict\[str, int\] | Data versions of the individual games' data packages the server will send. |
+| datapackage_version | int | Sum of individual games' datapackage version. Deprecated. Use `datapackage_versions` instead. |
+| datapackage_versions | dict\[str, int\] | Data versions of the individual games' data packages the server will send. Used to decide which games' caches are outdated. See [Data Package Contents](#Data-Package-Contents). |
| seed_name | str | uniquely identifying name of this generation |
| time | float | Unix time stamp of "now". Send for time synchronization if wanted for things like the DeathLink Bounce. |
@@ -101,11 +101,10 @@ Sent to clients when the server refuses connection. This is sent during the init
#### Arguments
| Name | Type | Notes |
| ---- | ---- | ----- |
-| errors | list\[str\] | Optional. When provided, should contain any one of: `InvalidSlot`, `InvalidGame`, `SlotAlreadyTaken`, `IncompatibleVersion`, `InvalidPassword`, or `InvalidItemsHandling`. |
+| errors | list\[str\] | Optional. When provided, should contain any one of: `InvalidSlot`, `InvalidGame`, `IncompatibleVersion`, `InvalidPassword`, or `InvalidItemsHandling`. |
InvalidSlot indicates that the sent 'name' field did not match any auth entry on the server.
InvalidGame indicates that a correctly named slot was found, but the game for it mismatched.
-SlotAlreadyTaken indicates a connection with a different uuid is already established.
IncompatibleVersion indicates a version mismatch.
InvalidPassword indicates the wrong, or no password when it was required, was sent.
InvalidItemsHandling indicates a wrong value type or flag combination was sent.
@@ -121,7 +120,7 @@ Sent to clients when the connection handshake is successfully completed.
| missing_locations | list\[int\] | Contains ids of remaining locations that need to be checked. Useful for trackers, among other things. |
| checked_locations | list\[int\] | Contains ids of all locations that have been checked. Useful for trackers, among other things. Location ids are in the range of ± 253 -1. |
| slot_data | dict | Contains a json object for slot related data, differs per game. Empty if not required. |
-| slot_info | dict\[int, NetworkSlot\] | maps each slot to a NetworkSlot information |
+| slot_info | dict\[int, [NetworkSlot](#NetworkSlot)\] | maps each slot to a [NetworkSlot](#NetworkSlot) information |
### ReceivedItems
Sent to clients when they receive an item.
@@ -305,9 +304,9 @@ Basic chat command which sends text to the server to be distributed to other cli
Requests the data package from the server. Does not require client authentication.
#### Arguments
-| Name | Type | Notes |
-| ------ | ----- | ------ |
-| exclusions | list\[str\] | Optional. If specified, will not send back the specified data. Such as, \["Factorio"\] -> Datapackage without Factorio data.|
+| Name | Type | Notes |
+|-------| ----- |---------------------------------------------------------------------------------------------------------------------------------|
+| games | list\[str\] | Optional. If specified, will only send back the specified data. Such as, \["Factorio"\] -> Datapackage with only Factorio data. |
### Bounce
Send this message to the server, tell it which clients should receive the message and
@@ -569,7 +568,6 @@ Note:
| Name | Type | Notes |
| ------ | ----- | ------ |
| games | dict[str, GameData] | Mapping of all Games and their respective data |
-| version | int | Sum of all per-game version numbers, for clients that don't bother with per-game caching/updating. |
#### GameData
GameData is a **dict** but contains these keys and values. It's broken out into another "type" for ease of documentation.
diff --git a/docs/network.graphml b/docs/network.graphml
deleted file mode 100644
index 1262484298..0000000000
--- a/docs/network.graphml
+++ /dev/null
@@ -1,1004 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Archipelago Server
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Factorio
-
-
-
-
-
-
-
-
-
- Folder 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- FactorioClient
-
-
-
-
-
-
-
-
-
-
-
- Factorio Server
-
-
-
-
-
-
-
-
-
-
-
- Factorio Games
-
-
-
-
-
-
-
-
-
-
-
- Generated AP Factorio Mod
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- WebHost (archipelago.gg)
-
-
-
-
-
-
-
-
- Folder 3
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- WebHost
-
-
-
-
-
-
-
-
-
-
-
- Flask WebContent
-
-
-
-
-
-
-
-
-
-
-
- AutoHoster
-
-
-
-
-
-
-
-
-
-
-
- PonyORM DB
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- .Net
-
-
-
-
-
-
-
-
-
- Folder 5
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Mod with Archipelago.MultiClient.Net
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Unity
-
-
-
-
-
-
-
-
-
- Folder 4
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Risk of Rain 2
-
-
-
-
-
-
-
-
-
-
-
- Subnautica
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- FNA
-
-
-
-
-
-
-
-
-
- Folder 4
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Timespinner
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Java
-
-
-
-
-
-
-
-
-
- Folder 6
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Minecraft
-
-
-
-
-
-
-
-
-
- Folder 4
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Minecraft Forge Server
-
-
-
-
-
-
-
-
-
-
-
- Any Java Minecraft Clients
-
-
-
-
-
-
-
-
-
-
-
-
-
- Mod with Archipelago.MultiClient.Java
-
-
-
-
-
-
-
-
-
-
-
- Slay the Spire
-
-
-
-
-
-
-
-
-
-
-
-
-
- CommonClient.py
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- A Link to the Past
-
-
-
-
-
-
-
-
-
- Folder 2
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Z3Client
-
-
-
-
-
-
-
-
-
-
-
- SNI
-
-
-
-
-
-
-
-
-
-
-
- SNES
-
-
-
-
-
-
-
-
-
-
-
- LttPClient
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Ocarina of Time
-
-
-
-
-
-
-
-
-
- 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Z5Client
-
-
-
-
-
-
-
-
-
-
-
- Lua Connector
-
-
-
-
-
-
-
-
-
-
-
- BizHawk with Ocarina of Time loaded
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- RCON
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- UDP
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Configurable (waitress, gunicorn, flask)
-
-
-
-
-
-
-
-
-
-
-
- Subprocess
-
-
-
-
-
-
-
-
-
-
-
- SQL
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- SQL
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- QModLoader (BepInEx)
- BepInEx
- TsRandomizer
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- TCP
-
-
-
-
-
-
-
-
-
-
- Mod the Spire
-
-
-
-
-
-
-
-
-
-
- Forge Mod Loader
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- gRPC
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Various, depends on SNES device type
-
-
-
-
-
-
-
-
-
-
- WebSocket
-
-
-
-
-
-
-
-
-
-
- LuaSockets
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- WebSocket
-
-
-
-
-
-
-
-
-
-
-
- Subprocesses
-
-
-
-
-
-
-
-
-
-
- WebSocket
-
-
-
-
-
-
-
-
-
-
- WebSocket
-
-
-
-
-
-
-
-
-
-
- WebSocket
-
-
-
-
-
-
-
-
-
-
- Integrated
-
-
-
-
-
-
-
-
-
-
- Integrated
-
-
-
-
-
-
-
-
-
-
- WebSocket
-
-
-
-
-
-
-
-
-
diff --git a/docs/network.png b/docs/network.png
deleted file mode 100644
index 86691d2fd2..0000000000
Binary files a/docs/network.png and /dev/null differ
diff --git a/host.yaml b/host.yaml
index a96d7f1b9a..cfa49d4dd3 100644
--- a/host.yaml
+++ b/host.yaml
@@ -105,7 +105,10 @@ factorio_options:
minecraft_options:
forge_directory: "Minecraft Forge server"
max_heap_size: "2G"
-oot_options:
+ # release channel, currently "release", or "beta"
+ # any games played on the "beta" channel have a high likelihood of no longer working on the "release" channel.
+ release_channel: "release"
+oot_options:
# File name of the OoT v1.0 ROM
rom_file: "The Legend of Zelda - Ocarina of Time.z64"
# Set this to false to never autostart a rom (such as after patching)
diff --git a/inno_setup.iss b/inno_setup.iss
index 3ecb93c1f3..1dee01af18 100644
--- a/inno_setup.iss
+++ b/inno_setup.iss
@@ -5,7 +5,7 @@
#define MyAppExeName "ArchipelagoServer.exe"
#define MyAppIcon "data/icon.ico"
#dim VersionTuple[4]
-#define MyAppVersion ParseVersion(source_path + '\ArchipelagoServer.exe', VersionTuple[0], VersionTuple[1], VersionTuple[2], VersionTuple[3])
+#define MyAppVersion GetVersionComponents(source_path + '\ArchipelagoServer.exe', VersionTuple[0], VersionTuple[1], VersionTuple[2], VersionTuple[3])
#define MyAppVersionText Str(VersionTuple[0])+"."+Str(VersionTuple[1])+"."+Str(VersionTuple[2])
@@ -67,6 +67,7 @@ Name: "client/minecraft"; Description: "Minecraft"; Types: full playing; ExtraDi
Name: "client/oot"; Description: "Ocarina of Time"; Types: full playing
Name: "client/ff1"; Description: "Final Fantasy 1"; Types: full playing
Name: "client/cf"; Description: "ChecksFinder"; Types: full playing
+Name: "client/sc2"; Description: "Starcraft 2"; Types: full playing
Name: "client/text"; Description: "Text, to !command and chat"; Types: full playing
[Dirs]
@@ -92,6 +93,7 @@ Source: "{#source_path}\ArchipelagoOoTClient.exe"; DestDir: "{app}"; Flags: igno
Source: "{#source_path}\ArchipelagoOoTAdjuster.exe"; DestDir: "{app}"; Flags: ignoreversion; Components: client/oot
Source: "{#source_path}\ArchipelagoFF1Client.exe"; DestDir: "{app}"; Flags: ignoreversion; Components: client/ff1
Source: "{#source_path}\ArchipelagoChecksFinderClient.exe"; DestDir: "{app}"; Flags: ignoreversion; Components: client/cf
+Source: "{#source_path}\ArchipelagoStarcraft2Client.exe"; DestDir: "{app}"; Flags: ignoreversion; Components: client/sc2
Source: "vc_redist.x64.exe"; DestDir: {tmp}; Flags: deleteafterinstall
[Icons]
@@ -104,6 +106,7 @@ Name: "{group}\{#MyAppName} Minecraft Client"; Filename: "{app}\ArchipelagoMinec
Name: "{group}\{#MyAppName} Ocarina of Time Client"; Filename: "{app}\ArchipelagoOoTClient.exe"; Components: client/oot
Name: "{group}\{#MyAppName} Final Fantasy 1 Client"; Filename: "{app}\ArchipelagoFF1Client.exe"; Components: client/ff1
Name: "{group}\{#MyAppName} ChecksFinder Client"; Filename: "{app}\ArchipelagoChecksFinderClient.exe"; Components: client/cf
+Name: "{group}\{#MyAppName} Starcraft 2 Client"; Filename: "{app}\ArchipelagoStarcraft2Client.exe"; Components: client/sc2
Name: "{commondesktop}\{#MyAppName} Folder"; Filename: "{app}"; Tasks: desktopicon
Name: "{commondesktop}\{#MyAppName} Server"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon; Components: server
@@ -113,6 +116,7 @@ Name: "{commondesktop}\{#MyAppName} Minecraft Client"; Filename: "{app}\Archipel
Name: "{commondesktop}\{#MyAppName} Ocarina of Time Client"; Filename: "{app}\ArchipelagoOoTClient.exe"; Tasks: desktopicon; Components: client/oot
Name: "{commondesktop}\{#MyAppName} Final Fantasy 1 Client"; Filename: "{app}\ArchipelagoFF1Client.exe"; Tasks: desktopicon; Components: client/ff1
Name: "{commondesktop}\{#MyAppName} ChecksFinder Client"; Filename: "{app}\ArchipelagoChecksFinderClient.exe"; Tasks: desktopicon; Components: client/cf
+Name: "{commondesktop}\{#MyAppName} Starcraft 2 Client"; Filename: "{app}\ArchipelagoStarcraft2Client.exe"; Tasks: desktopicon; Components: client/sc2
[Run]
@@ -163,6 +167,10 @@ Root: HKCR; Subkey: "{#MyAppName}multidata"; ValueData: "Arc
Root: HKCR; Subkey: "{#MyAppName}multidata\DefaultIcon"; ValueData: "{app}\ArchipelagoServer.exe,0"; ValueType: string; ValueName: ""; Components: server
Root: HKCR; Subkey: "{#MyAppName}multidata\shell\open\command"; ValueData: """{app}\ArchipelagoServer.exe"" ""%1"""; ValueType: string; ValueName: ""; Components: server
+Root: HKCR; Subkey: "archipelago"; ValueType: "string"; ValueData: "Archipegalo Protocol"; Flags: uninsdeletekey; Components: client/text
+Root: HKCR; Subkey: "archipelago"; ValueType: "string"; ValueName: "URL Protocol"; ValueData: ""; Components: client/text
+Root: HKCR; Subkey: "archipelago\DefaultIcon"; ValueType: "string"; ValueData: "{app}\ArchipelagoTextClient.exe,0"; Components: client/text
+Root: HKCR; Subkey: "archipelago\shell\open\command"; ValueType: "string"; ValueData: """{app}\ArchipelagoTextClient.exe"" ""%1"""; Components: client/text
[Code]
const
diff --git a/kvui.py b/kvui.py
index 9e619305dc..be334def5d 100644
--- a/kvui.py
+++ b/kvui.py
@@ -36,9 +36,12 @@ from kivy.uix.recycleview.views import RecycleDataViewBehavior
from kivy.uix.behaviors import FocusBehavior
from kivy.uix.recycleboxlayout import RecycleBoxLayout
from kivy.uix.recycleview.layout import LayoutSelectionBehavior
+from kivy.animation import Animation
+
+fade_in_animation = Animation(opacity=0, duration=0) + Animation(opacity=1, duration=0.25)
import Utils
-from NetUtils import JSONtoTextParser, JSONMessagePart
+from NetUtils import JSONtoTextParser, JSONMessagePart, SlotType
if typing.TYPE_CHECKING:
import CommonClient
@@ -50,7 +53,7 @@ else:
# I was surprised to find this didn't already exist in kivy :(
class HoverBehavior(object):
- """from https://stackoverflow.com/a/605348110"""
+ """originally from https://stackoverflow.com/a/605348110"""
hovered = BooleanProperty(False)
border_point = ObjectProperty(None)
@@ -61,11 +64,11 @@ class HoverBehavior(object):
Window.bind(on_cursor_leave=self.on_cursor_leave)
super(HoverBehavior, self).__init__(**kwargs)
- def on_mouse_pos(self, *args):
+ def on_mouse_pos(self, window, pos):
if not self.get_root_window():
- return # do proceed if I'm not displayed <=> If have no parent
- pos = args[1]
- # Next line to_widget allow to compensate for relative layout
+ return # Abort if not displayed
+
+ # to_widget translates window pos to within widget pos
inside = self.collide_point(*self.to_widget(*pos))
if self.hovered == inside:
return # We have already done what was needed
@@ -87,11 +90,19 @@ class HoverBehavior(object):
Factory.register('HoverBehavior', HoverBehavior)
-class ServerToolTip(Label):
+class ToolTip(Label):
+ pass
+
+
+class ServerToolTip(ToolTip):
pass
class HovererableLabel(HoverBehavior, Label):
+ pass
+
+
+class ServerLabel(HovererableLabel):
def __init__(self, *args, **kwargs):
super(HovererableLabel, self).__init__(*args, **kwargs)
self.layout = FloatLayout()
@@ -101,6 +112,7 @@ class HovererableLabel(HoverBehavior, Label):
def on_enter(self):
self.popuplabel.text = self.get_text()
App.get_running_app().root.add_widget(self.layout)
+ fade_in_animation.start(self.layout)
def on_leave(self):
App.get_running_app().root.remove_widget(self.layout)
@@ -109,8 +121,6 @@ class HovererableLabel(HoverBehavior, Label):
def ctx(self) -> context_type:
return App.get_running_app().ctx
-
-class ServerLabel(HovererableLabel):
def get_text(self):
if self.ctx.server:
ctx = self.ctx
@@ -158,10 +168,11 @@ class SelectableRecycleBoxLayout(FocusBehavior, LayoutSelectionBehavior,
""" Adds selection and focus behaviour to the view. """
-class SelectableLabel(RecycleDataViewBehavior, Label):
+class SelectableLabel(RecycleDataViewBehavior, HovererableLabel):
""" Add selection support to the Label """
index = None
selected = BooleanProperty(False)
+ tooltip = None
def refresh_view_attrs(self, rv, index, data):
""" Catch and handle the view changes """
@@ -169,6 +180,56 @@ class SelectableLabel(RecycleDataViewBehavior, Label):
return super(SelectableLabel, self).refresh_view_attrs(
rv, index, data)
+ def create_tooltip(self, text, x, y):
+ text = text.replace(" ", "\n").replace('&', '&').replace('&bl;', '[').replace('&br;', ']')
+ if self.tooltip:
+ # update
+ self.tooltip.children[0].text = text
+ else:
+ self.tooltip = FloatLayout()
+ tooltip_label = ToolTip(text=text)
+ self.tooltip.add_widget(tooltip_label)
+ fade_in_animation.start(self.tooltip)
+ App.get_running_app().root.add_widget(self.tooltip)
+
+ # handle left-side boundary to not render off-screen
+ x = max(x, 3+self.tooltip.children[0].texture_size[0] / 2)
+
+ # position float layout
+ self.tooltip.x = x - self.tooltip.width / 2
+ self.tooltip.y = y - self.tooltip.height / 2 + 48
+
+ def remove_tooltip(self):
+ if self.tooltip:
+ App.get_running_app().root.remove_widget(self.tooltip)
+ self.tooltip = None
+
+ def on_mouse_pos(self, window, pos):
+ if not self.get_root_window():
+ return # Abort if not displayed
+ super().on_mouse_pos(window, pos)
+ if self.refs and self.hovered:
+
+ tx, ty = self.to_widget(*pos, relative=True)
+ # Why TF is Y flipped *within* the texture?
+ ty = self.texture_size[1] - ty
+ hit = False
+ for uid, zones in self.refs.items():
+ for zone in zones:
+ x, y, w, h = zone
+ if x <= tx <= w and y <= ty <= h:
+ self.create_tooltip(uid.split("|", 1)[1], *pos)
+ hit = True
+ break
+ if not hit:
+ self.remove_tooltip()
+
+ def on_enter(self):
+ pass
+
+ def on_leave(self):
+ self.remove_tooltip()
+
def on_touch_down(self, touch):
""" Add selection on touch down """
if super(SelectableLabel, self).on_touch_down(touch):
@@ -179,7 +240,7 @@ class SelectableLabel(RecycleDataViewBehavior, Label):
else:
# Not a fan of the following few lines, but they work.
temp = MarkupLabel(text=self.text).markup
- text = "".join(part for part in temp if not part.startswith(("[color", "[/color]")))
+ text = "".join(part for part in temp if not part.startswith(("[color", "[/color]", "[ref=", "[/ref]")))
cmdinput = App.get_running_app().textinput
if not cmdinput.text and " did you mean " in text:
for question in ("Didn't find something that closely matches, did you mean ",
@@ -192,7 +253,7 @@ class SelectableLabel(RecycleDataViewBehavior, Label):
elif not cmdinput.text and text.startswith("Missing: "):
cmdinput.text = text.replace("Missing: ", "!hint_location ")
- Clipboard.copy(text)
+ Clipboard.copy(text.replace('&', '&').replace('&bl;', '[').replace('&br;', ']'))
return self.parent.select_with_touch(self.index, touch)
def apply_selection(self, rv, index, is_selected):
@@ -302,7 +363,8 @@ class GameManager(App):
return self.container
def update_texts(self, dt):
- self.tabs.content.children[0].fix_heights() # TODO: remove this when Kivy fixes this upstream
+ if hasattr(self.tabs.content.children[0], 'fix_heights'):
+ self.tabs.content.children[0].fix_heights() # TODO: remove this when Kivy fixes this upstream
if self.ctx.server:
self.title = self.base_title + " " + Utils.__version__ + \
f" | Connected to: {self.ctx.server_address} " \
@@ -369,15 +431,6 @@ class GameManager(App):
self.energy_link_label.text = f"EL: {Utils.format_SI_prefix(self.ctx.current_energy_link_value)}J"
-class FactorioManager(GameManager):
- logging_pairs = [
- ("Client", "Archipelago"),
- ("FactorioServer", "Factorio Server Log"),
- ("FactorioWatcher", "Bridge Data Log"),
- ]
- base_title = "Archipelago Factorio Client"
-
-
class ChecksFinderManager(GameManager):
logging_pairs = [
("Client", "Archipelago")
@@ -385,34 +438,6 @@ class ChecksFinderManager(GameManager):
base_title = "Archipelago ChecksFinder Client"
-class SNIManager(GameManager):
- logging_pairs = [
- ("Client", "Archipelago"),
- ("SNES", "SNES"),
- ]
- base_title = "Archipelago SNI Client"
-
-
-class TextManager(GameManager):
- logging_pairs = [
- ("Client", "Archipelago")
- ]
- base_title = "Archipelago Text Client"
-
-
-class FF1Manager(GameManager):
- logging_pairs = [
- ("Client", "Archipelago")
- ]
- base_title = "Archipelago Final Fantasy 1 Client"
-
-class OoTManager(GameManager):
- logging_pairs = [
- ("Client", "Archipelago")
- ]
- base_title = "Archipelago Ocarina of Time Client"
-
-
class LogtoUI(logging.Handler):
def __init__(self, on_log):
super(LogtoUI, self).__init__(logging.INFO)
@@ -453,6 +478,34 @@ class E(ExceptionHandler):
class KivyJSONtoTextParser(JSONtoTextParser):
+ def __call__(self, *args, **kwargs):
+ self.ref_count = 0
+ return super(KivyJSONtoTextParser, self).__call__(*args, **kwargs)
+
+ def _handle_item_name(self, node: JSONMessagePart):
+ flags = node.get("flags", 0)
+ if flags & 0b001: # advancement
+ itemtype = "progression"
+ elif flags & 0b010: # never_exclude
+ itemtype = "useful"
+ elif flags & 0b100: # trap
+ itemtype = "trap"
+ else:
+ itemtype = "normal"
+ node.setdefault("refs", []).append("Item Class: " + itemtype)
+ return super(KivyJSONtoTextParser, self)._handle_item_name(node)
+
+ def _handle_player_id(self, node: JSONMessagePart):
+ player = int(node["text"])
+ slot_info = self.ctx.slot_info.get(player, None)
+ if slot_info:
+ text = f"Game: {slot_info.game} " \
+ f"Type: {SlotType(slot_info.type).name}"
+ if slot_info.group_members:
+ text += f" Members: " + \
+ ' '.join(self.ctx.player_names[player] for player in slot_info.group_members)
+ node.setdefault("refs", []).append(text)
+ return super(KivyJSONtoTextParser, self)._handle_player_id(node)
def _handle_color(self, node: JSONMessagePart):
colors = node["color"].split(";")
@@ -464,6 +517,12 @@ class KivyJSONtoTextParser(JSONtoTextParser):
return self._handle_text(node)
return self._handle_text(node)
+ def _handle_text(self, node: JSONMessagePart):
+ for ref in node.get("refs", []):
+ node["text"] = f"[ref={self.ref_count}|{ref}]{node['text']}[/ref]"
+ self.ref_count += 1
+ return super(KivyJSONtoTextParser, self)._handle_text(node)
+
ExceptionManager.add_handler(E())
diff --git a/playerSettings.yaml b/playerSettings.yaml
index 716b9fa5f1..ce26888c8a 100644
--- a/playerSettings.yaml
+++ b/playerSettings.yaml
@@ -32,9 +32,11 @@ accessibility:
items: 0 # Guarantees you will be able to acquire all items, but you may not be able to access all locations
locations: 50 # Guarantees you will be able to access all locations, and therefore all items
none: 0 # Guarantees only that the game is beatable. You may not be able to access all locations or acquire all items
-progression_balancing:
- on: 50 # A system to reduce BK, as in times during which you can't do anything by moving your items into an earlier access sphere to make it likely you have stuff to do
- off: 0 # Turn this off if you don't mind a longer multiworld, or can glitch/sequence break around missing items.
+progression_balancing: # A system to reduce BK, as in times during which you can't do anything, by moving your items into an earlier access sphere
+ 0: 0 # Choose a lower number if you don't mind a longer multiworld, or can glitch/sequence break around missing items.
+ 25: 0
+ 50: 50 # Make it likely you have stuff to do.
+ 99: 0 # Get important items early, and stay at the front of the progression.
A Link to the Past:
### Logic Section ###
glitches_required: # Determine the logic required to complete the seed
diff --git a/requirements.txt b/requirements.txt
index e300fa007c..0067d461d7 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,8 +1,8 @@
colorama>=0.4.4
-websockets>=10.2
+websockets>=10.3
PyYAML>=6.0
-thefuzz[speedup]>=0.19.0
-jinja2>=3.1.1
+jellyfish>=0.9.0
+jinja2>=3.1.2
schema>=0.7.4
kivy>=2.1.0
bsdiff4>=1.2.2
\ No newline at end of file
diff --git a/setup.py b/setup.py
index 87a471d253..fb466c8f27 100644
--- a/setup.py
+++ b/setup.py
@@ -29,9 +29,9 @@ except pkg_resources.ResolutionError:
if os.path.exists("X:/pw.txt"):
print("Using signtool")
- with open("X:/pw.txt") as f:
+ with open("X:/pw.txt", encoding="utf-8-sig") as f:
pw = f.read()
- signtool = r'signtool sign /f X:/_SITS_Zertifikat_.pfx /p ' + pw + r' /fd sha256 /tr http://timestamp.digicert.com/ '
+ signtool = r'signtool sign /f X:/_SITS_Zertifikat_.pfx /p "' + pw + r'" /fd sha256 /tr http://timestamp.digicert.com/ '
else:
signtool = None
@@ -321,6 +321,7 @@ $APPDIR/$exe "$@"
self.app_id = self.app_name.lower()
def run(self):
+ import platform
self.dist_file.parent.mkdir(parents=True, exist_ok=True)
if self.app_dir.is_dir():
shutil.rmtree(self.app_dir)
@@ -333,7 +334,7 @@ $APPDIR/$exe "$@"
self.write_desktop()
self.write_launcher(self.app_exec)
print(f'{self.app_dir} -> {self.dist_file}')
- subprocess.call(f'./appimagetool -n "{self.app_dir}" "{self.dist_file}"', shell=True)
+ subprocess.call(f'ARCH={platform.machine()} ./appimagetool -n "{self.app_dir}" "{self.dist_file}"', shell=True)
cx_Freeze.setup(
@@ -348,7 +349,7 @@ cx_Freeze.setup(
"excludes": ["numpy", "Cython", "PySide2", "PIL",
"pandas"],
"zip_include_packages": ["*"],
- "zip_exclude_packages": ["worlds", "kivy"],
+ "zip_exclude_packages": ["worlds", "kivy", "sc2"],
"include_files": [],
"include_msvcr": False,
"replace_paths": [("*", "")],
diff --git a/test/general/TestFill.py b/test/general/TestFill.py
index 80b549a1b5..c7a3276dbb 100644
--- a/test/general/TestFill.py
+++ b/test/general/TestFill.py
@@ -584,7 +584,7 @@ class TestDistributeItemsRestrictive(unittest.TestCase):
class TestBalanceMultiworldProgression(unittest.TestCase):
- def assertRegionContains(self, region: Region, item: Item):
+ def assertRegionContains(self, region: Region, item: Item) -> bool:
for location in region.locations:
if location.item and location.item == item:
return True
@@ -592,7 +592,7 @@ class TestBalanceMultiworldProgression(unittest.TestCase):
self.fail("Expected " + region.name + " to contain " + item.name +
"\n Contains" + str(list(map(lambda location: location.item, region.locations))))
- def setUp(self):
+ def setUp(self) -> None:
multi_world = generate_multi_world(2)
self.multi_world = multi_world
player1 = generate_player_data(
@@ -628,10 +628,10 @@ class TestBalanceMultiworldProgression(unittest.TestCase):
items = fillRegion(multi_world, region, [
player2.prog_items[1]] + items)
- multi_world.progression_balancing[player1.id] = True
- multi_world.progression_balancing[player2.id] = True
+ def test_balances_progression(self) -> None:
+ self.multi_world.progression_balancing[self.player1.id].value = 50
+ self.multi_world.progression_balancing[self.player2.id].value = 50
- def test_balances_progression(self):
self.assertRegionContains(
self.player1.regions[2], self.player2.prog_items[0])
@@ -640,7 +640,48 @@ class TestBalanceMultiworldProgression(unittest.TestCase):
self.assertRegionContains(
self.player1.regions[1], self.player2.prog_items[0])
- def test_ignores_priority_locations(self):
+ def test_balances_progression_light(self) -> None:
+ self.multi_world.progression_balancing[self.player1.id].value = 1
+ self.multi_world.progression_balancing[self.player2.id].value = 1
+
+ self.assertRegionContains(
+ self.player1.regions[2], self.player2.prog_items[0])
+
+ balance_multiworld_progression(self.multi_world)
+
+ # TODO: arrange for a result that's different from the default
+ self.assertRegionContains(
+ self.player1.regions[1], self.player2.prog_items[0])
+
+ def test_balances_progression_heavy(self) -> None:
+ self.multi_world.progression_balancing[self.player1.id].value = 99
+ self.multi_world.progression_balancing[self.player2.id].value = 99
+
+ self.assertRegionContains(
+ self.player1.regions[2], self.player2.prog_items[0])
+
+ balance_multiworld_progression(self.multi_world)
+
+ # TODO: arrange for a result that's different from the default
+ self.assertRegionContains(
+ self.player1.regions[1], self.player2.prog_items[0])
+
+ def test_skips_balancing_progression(self) -> None:
+ self.multi_world.progression_balancing[self.player1.id].value = 0
+ self.multi_world.progression_balancing[self.player2.id].value = 0
+
+ self.assertRegionContains(
+ self.player1.regions[2], self.player2.prog_items[0])
+
+ balance_multiworld_progression(self.multi_world)
+
+ self.assertRegionContains(
+ self.player1.regions[2], self.player2.prog_items[0])
+
+ def test_ignores_priority_locations(self) -> None:
+ self.multi_world.progression_balancing[self.player1.id].value = 50
+ self.multi_world.progression_balancing[self.player2.id].value = 50
+
self.player2.prog_items[0].location.progress_type = LocationProgressType.PRIORITY
balance_multiworld_progression(self.multi_world)
diff --git a/test/general/TestImplemented.py b/test/general/TestImplemented.py
new file mode 100644
index 0000000000..b2e696ab0d
--- /dev/null
+++ b/test/general/TestImplemented.py
@@ -0,0 +1,14 @@
+import unittest
+from worlds.AutoWorld import AutoWorldRegister
+
+from . import setup_default_world
+
+
+class TestImplemented(unittest.TestCase):
+ def testCompletionCondition(self):
+ """Ensure a completion condition is set that has requirements."""
+ for gamename, world_type in AutoWorldRegister.world_types.items():
+ if not world_type.hidden and gamename not in {"ArchipIDLE", "Final Fantasy"}:
+ with self.subTest(gamename):
+ world = setup_default_world(world_type)
+ self.assertFalse(world.completion_condition[1](world.state))
diff --git a/test/general/TestReachability.py b/test/general/TestReachability.py
index 331f52bf3a..2cadf9d29a 100644
--- a/test/general/TestReachability.py
+++ b/test/general/TestReachability.py
@@ -22,6 +22,9 @@ class TestBase(unittest.TestCase):
with self.subTest("Location should be reached", location=location):
self.assertTrue(location.can_reach(state))
+ with self.subTest("Completion Condition"):
+ self.assertTrue(world.can_beat_game(state))
+
def testEmptyStateCanReachSomething(self):
for game_name, world_type in AutoWorldRegister.world_types.items():
# Final Fantasy logic is controlled by finalfantasyrandomizer.com
diff --git a/test/general/__init__.py b/test/general/__init__.py
index c59af4d4b9..8b966c0e34 100644
--- a/test/general/__init__.py
+++ b/test/general/__init__.py
@@ -1,12 +1,12 @@
from argparse import Namespace
-from BaseClasses import MultiWorld, CollectionState
+from BaseClasses import MultiWorld
from worlds.AutoWorld import call_all
gen_steps = ["generate_early", "create_regions", "create_items", "set_rules", "generate_basic", "pre_fill"]
-def setup_default_world(world_type):
+def setup_default_world(world_type) -> MultiWorld:
world = MultiWorld(1)
world.game[1] = world_type.game
world.player_name = {1: "Tester"}
diff --git a/test/programs/TestGenerate.py b/test/programs/TestGenerate.py
index 31b759970f..da227df5e2 100644
--- a/test/programs/TestGenerate.py
+++ b/test/programs/TestGenerate.py
@@ -34,6 +34,9 @@ class TestGenerateMain(unittest.TestCase):
os.chdir(self.run_dir)
self.output_tempdir = TemporaryDirectory(prefix='AP_out_')
+ def tearDown(self):
+ self.output_tempdir.cleanup()
+
def test_generate_absolute(self):
sys.argv = [sys.argv[0], '--seed', '0',
'--player_files_path', str(self.abs_input_dir),
diff --git a/test/webhost/TestDocs.py b/test/webhost/TestDocs.py
new file mode 100644
index 0000000000..6922deb122
--- /dev/null
+++ b/test/webhost/TestDocs.py
@@ -0,0 +1,38 @@
+import unittest
+import Utils
+import os
+
+import WebHost
+from worlds.AutoWorld import AutoWorldRegister
+
+
+class TestDocs(unittest.TestCase):
+ def setUp(self) -> None:
+ self.tutorials_data = WebHost.create_ordered_tutorials_file()
+
+ def testHasTutorial(self):
+ games_with_tutorial = set(entry["gameTitle"] for entry in self.tutorials_data)
+ for game_name, world_type in AutoWorldRegister.world_types.items():
+ if not world_type.hidden:
+ with self.subTest(game_name):
+ try:
+ self.assertIn(game_name, games_with_tutorial)
+ except AssertionError:
+ # look for partial name in the tutorial name
+ for game in games_with_tutorial:
+ if game_name in game:
+ break
+ else:
+ self.fail(f"{game_name} has no setup tutorial. "
+ f"Games with Tutorial: {games_with_tutorial}")
+
+ def testHasGameInfo(self):
+ for game_name, world_type in AutoWorldRegister.world_types.items():
+ if not world_type.hidden:
+ target_path = Utils.local_path("WebHostLib", "static", "generated", "docs", game_name)
+ for game_info_lang in world_type.web.game_info_languages:
+ with self.subTest(game_name):
+ self.assertTrue(
+ os.path.isfile(Utils.local_path(target_path, f'{game_info_lang}_{game_name}.md')),
+ f'{game_name} missing game info file for "{game_info_lang}" language.'
+ )
diff --git a/test/webhost/__init__.py b/test/webhost/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/worlds/AutoWorld.py b/worlds/AutoWorld.py
index b2df8486d0..0bce31b424 100644
--- a/worlds/AutoWorld.py
+++ b/worlds/AutoWorld.py
@@ -1,16 +1,17 @@
from __future__ import annotations
import logging
-from typing import Dict, Set, Tuple, List, Optional, TextIO, Any, Callable, Union
+import sys
+from typing import Dict, FrozenSet, Set, Tuple, List, Optional, TextIO, Any, Callable, Union, NamedTuple
-from BaseClasses import MultiWorld, Item, CollectionState, Location
+from BaseClasses import MultiWorld, Item, CollectionState, Location, Tutorial
from Options import Option
class AutoWorldRegister(type):
- world_types: Dict[str, World] = {}
+ world_types: Dict[str, type(World)] = {}
- def __new__(cls, name: str, bases, dct: Dict[str, Any]):
+ def __new__(mcs, name: str, bases: Tuple[type, ...], dct: Dict[str, Any]) -> AutoWorldRegister:
if "web" in dct:
assert isinstance(dct["web"], WebWorld), "WebWorld has to be instantiated."
# filter out any events
@@ -34,19 +35,21 @@ class AutoWorldRegister(type):
if "required_client_version" in dct and bases:
for base in bases:
if "required_client_version" in base.__dict__:
- dct["required_client_version"] = max(dct["required_client_version"], base.required_client_version)
+ dct["required_client_version"] = max(dct["required_client_version"],
+ base.__dict__["required_client_version"])
# construct class
- new_class = super().__new__(cls, name, bases, dct)
+ new_class = super().__new__(mcs, name, bases, dct)
if "game" in dct:
AutoWorldRegister.world_types[dct["game"]] = new_class
+ new_class.__file__ = sys.modules[new_class.__module__].__file__
return new_class
class AutoLogicRegister(type):
- def __new__(cls, name, bases, dct):
+ def __new__(cls, name: str, bases: Tuple[type, ...], dct: Dict[str, Any]) -> AutoLogicRegister:
new_class = super().__new__(cls, name, bases, dct)
- function: Callable
+ function: Callable[..., Any]
for item_name, function in dct.items():
if item_name == "copy_mixin":
CollectionState.additional_copy_functions.append(function)
@@ -59,13 +62,13 @@ class AutoLogicRegister(type):
return new_class
-def call_single(world: MultiWorld, method_name: str, player: int, *args):
+def call_single(world: MultiWorld, method_name: str, player: int, *args: Any) -> Any:
method = getattr(world.worlds[player], method_name)
return method(*args)
-def call_all(world: MultiWorld, method_name: str, *args):
- world_types = set()
+def call_all(world: MultiWorld, method_name: str, *args: Any) -> None:
+ world_types: Set[AutoWorldRegister] = set()
for player in world.player_ids:
world_types.add(world.worlds[player].__class__)
call_single(world, method_name, player, *args)
@@ -76,7 +79,7 @@ def call_all(world: MultiWorld, method_name: str, *args):
stage_callable(world, *args)
-def call_stage(world: MultiWorld, method_name: str, *args):
+def call_stage(world: MultiWorld, method_name: str, *args: Any) -> None:
world_types = {world.worlds[player].__class__ for player in world.player_ids}
for world_type in world_types:
stage_callable = getattr(world_type, f"stage_{method_name}", None)
@@ -89,6 +92,13 @@ class WebWorld:
# display a settings page. Can be a link to an out-of-ap settings tool too.
settings_page: Union[bool, str] = True
+ # docs folder will be scanned for game info pages using this list in the format '{language}_{game_name}.md'
+ game_info_languages: List[str] = ['en']
+
+ # docs folder will also be scanned for tutorial guides given the relevant information in this list. Each Tutorial
+ # class is to be used for one guide.
+ tutorials: List[Tutorial]
+
# Choose a theme for your /game/* pages
# Available: dirt, grass, grassFlowers, ice, jungle, ocean, partyTime
theme = "grass"
@@ -101,10 +111,12 @@ class World(metaclass=AutoWorldRegister):
"""A World object encompasses a game's Items, Locations, Rules and additional data or functionality required.
A Game should have its own subclass of World in which it defines the required data structures."""
- options: Dict[str, type(Option)] = {} # link your Options mapping
+ options: Dict[str, Option[Any]] = {} # link your Options mapping
game: str # name the game
topology_present: bool = False # indicate if world type has any meaningful layout/pathing
- all_item_and_group_names: Set[str] = frozenset() # gets automatically populated with all item and item group names
+
+ # gets automatically populated with all item and item group names
+ all_item_and_group_names: FrozenSet[str] = frozenset()
# map names to their IDs
item_name_to_id: Dict[str, int] = {}
@@ -126,7 +138,7 @@ class World(metaclass=AutoWorldRegister):
# update this if the resulting multidata breaks forward-compatibility of the server
required_server_version: Tuple[int, int, int] = (0, 2, 4)
- hint_blacklist: Set[str] = frozenset() # any names that should not be hintable
+ hint_blacklist: FrozenSet[str] = frozenset() # any names that should not be hintable
# NOTE: remote_items and remote_start_inventory are now available in the network protocol for the client to set.
# These values will be removed.
@@ -168,61 +180,71 @@ class World(metaclass=AutoWorldRegister):
# can also be implemented as a classmethod and called "stage_",
# in that case the MultiWorld object is passed as an argument and it gets called once for the entire multiworld.
# An example of this can be found in alttp as stage_pre_fill
- def generate_early(self):
+ @classmethod
+ def assert_generate(cls) -> None:
+ """Checks that a game is capable of generating, usually checks for some base file like a ROM.
+ Not run for unittests since they don't produce output"""
pass
- def create_regions(self):
+ def generate_early(self) -> None:
pass
- def create_items(self):
+ def create_regions(self) -> None:
pass
- def set_rules(self):
+ def create_items(self) -> None:
pass
- def generate_basic(self):
+ def set_rules(self) -> None:
pass
- def pre_fill(self):
+ def generate_basic(self) -> None:
+ pass
+
+ def pre_fill(self) -> None:
"""Optional method that is supposed to be used for special fill stages. This is run *after* plando."""
pass
@classmethod
- def fill_hook(cls, progitempool: List[Item], nonexcludeditempool: List[Item],
- localrestitempool: Dict[int, List[Item]], nonlocalrestitempool: Dict[int, List[Item]],
- restitempool: List[Item], fill_locations: List[Location]):
+ def fill_hook(cls,
+ progitempool: List[Item],
+ nonexcludeditempool: List[Item],
+ localrestitempool: Dict[int, List[Item]],
+ nonlocalrestitempool: Dict[int, List[Item]],
+ restitempool: List[Item],
+ fill_locations: List[Location]) -> None:
"""Special method that gets called as part of distribute_items_restrictive (main fill).
This gets called once per present world type."""
pass
- def post_fill(self):
+ def post_fill(self) -> None:
"""Optional Method that is called after regular fill. Can be used to do adjustments before output generation."""
- def generate_output(self, output_directory: str):
+ def generate_output(self, output_directory: str) -> None:
"""This method gets called from a threadpool, do not use world.random here.
If you need any last-second randomization, use MultiWorld.slot_seeds[slot] instead."""
pass
- def fill_slot_data(self) -> dict:
+ def fill_slot_data(self) -> Dict[str, Any]: # json of WebHostLib.models.Slot
"""Fill in the slot_data field in the Connected network package."""
return {}
- def modify_multidata(self, multidata: dict):
+ def modify_multidata(self, multidata: Dict[str, Any]) -> None: # TODO: TypedDict for multidata?
"""For deeper modification of server multidata."""
pass
# Spoiler writing is optional, these may not get called.
- def write_spoiler_header(self, spoiler_handle: TextIO):
+ def write_spoiler_header(self, spoiler_handle: TextIO) -> None:
"""Write to the spoiler header. If individual it's right at the end of that player's options,
if as stage it's right under the common header before per-player options."""
pass
- def write_spoiler(self, spoiler_handle: TextIO):
+ def write_spoiler(self, spoiler_handle: TextIO) -> None:
"""Write to the spoiler "middle", this is after the per-player options and before locations,
meant for useful or interesting info."""
pass
- def write_spoiler_end(self, spoiler_handle: TextIO):
+ def write_spoiler_end(self, spoiler_handle: TextIO) -> None:
"""Write to the end of the spoiler"""
pass
@@ -236,7 +258,7 @@ class World(metaclass=AutoWorldRegister):
def get_filler_item_name(self) -> str:
"""Called when the item pool needs to be filled with additional items to match location count."""
logging.warning(f"World {self} is generating a filler item without custom filler pool.")
- return self.world.random.choice(self.item_name_to_id)
+ return self.world.random.choice(tuple(self.item_name_to_id.keys()))
# decent place to implement progressive items, in most cases can stay as-is
def collect_item(self, state: CollectionState, item: Item, remove: bool = False) -> Optional[str]:
@@ -247,6 +269,7 @@ class World(metaclass=AutoWorldRegister):
:param remove: indicate if this is meant to remove from state instead of adding."""
if item.advancement:
return item.name
+ return None
# called to create all_state, return Items that are created during pre_fill
def get_pre_fill_items(self) -> List[Item]:
@@ -277,4 +300,3 @@ class World(metaclass=AutoWorldRegister):
# please use a prefix as all of them get clobbered together
class LogicMixin(metaclass=AutoLogicRegister):
pass
-
diff --git a/worlds/alttp/ItemPool.py b/worlds/alttp/ItemPool.py
index e00c666740..ccb739e976 100644
--- a/worlds/alttp/ItemPool.py
+++ b/worlds/alttp/ItemPool.py
@@ -244,7 +244,7 @@ def generate_itempool(world):
world.push_item(world.get_location('Ganon', player), ItemFactory('Triforce', player), False)
if world.goal[player] == 'icerodhunt':
- world.progression_balancing[player].value = False
+ world.progression_balancing[player].value = 0
loc = world.get_location('Turtle Rock - Boss', player)
world.push_item(loc, ItemFactory('Triforce Piece', player), False)
world.treasure_hunt_count[player] = 1
diff --git a/worlds/alttp/Options.py b/worlds/alttp/Options.py
index ca2772fa5a..6d741b7612 100644
--- a/worlds/alttp/Options.py
+++ b/worlds/alttp/Options.py
@@ -159,11 +159,9 @@ class RestrictBossItem(Toggle):
class Hints(Choice):
- """Vendors: King Zora and Bottle Merchant say what they're selling.
- On/Full: Put item and entrance placement hints on telepathic tiles and some NPCs, Full removes joke hints."""
+ """On/Full: Put item and entrance placement hints on telepathic tiles and some NPCs, Full removes joke hints."""
display_name = "Hints"
option_off = 0
- option_vendors = 1
option_on = 2
option_full = 3
default = 2
@@ -171,6 +169,22 @@ class Hints(Choice):
alias_true = 2
+class Scams(Choice):
+ """If on, these Merchants will no longer tell you what they're selling."""
+ display_name = "Scams"
+ option_off = 0
+ option_king_zora = 1
+ option_bottle_merchant = 2
+ option_all = 3
+ alias_false = 0
+
+ def gives_king_zora_hint(self):
+ return self.value in {0, 2}
+
+ def gives_bottle_merchant_hint(self):
+ return self.value in {0, 1}
+
+
class EnemyShuffle(Toggle):
"""Randomize every enemy spawn.
If mode is Standard, Hyrule Castle is left out (may result in visually wrong enemy sprites in that area.)"""
@@ -318,6 +332,7 @@ alttp_options: typing.Dict[str, type(Option)] = {
"swordless": Swordless,
"retro": Retro,
"hints": Hints,
+ "scams": Scams,
"restrict_dungeon_item_on_boss": RestrictBossItem,
"pot_shuffle": PotShuffle,
"enemy_shuffle": EnemyShuffle,
diff --git a/worlds/alttp/Rom.py b/worlds/alttp/Rom.py
index a2ee848102..c4e1cd6485 100644
--- a/worlds/alttp/Rom.py
+++ b/worlds/alttp/Rom.py
@@ -1723,7 +1723,7 @@ def write_custom_shops(rom, world, player):
price_data = get_price_data(item['price'], item["price_type"])
replacement_price_data = get_price_data(item['replacement_price'], item['replacement_price_type'])
slot = 0 if shop.type == ShopType.TakeAny else index
- if not item['item'] in item_table: # item not native to ALTTP
+ if item['player'] and world.game[item['player']] != "A Link to the Past": # item not native to ALTTP
item_code = get_nonnative_item_sprite(item['item'])
else:
item_code = ItemFactory(item['item'], player).code
@@ -2120,16 +2120,19 @@ def write_strings(rom, world, player):
hint += f" for {world.player_name[dest.player]}"
return hint
- # For hints, first we write hints about entrances, some from the inconvenient list others from all reasonable entrances.
- if world.hints[player]:
+ if world.scams[player].gives_king_zora_hint:
# Zora hint
zora_location = world.get_location("King Zora", player)
tt['zora_tells_cost'] = f"You got 500 rupees to buy {hint_text(zora_location.item)}" \
f"\n ≥ Duh\n Oh carp\n{{CHOICE}}"
+ if world.scams[player].gives_bottle_merchant_hint:
# Bottle Vendor hint
vendor_location = world.get_location("Bottle Merchant", player)
tt['bottle_vendor_choice'] = f"I gots {hint_text(vendor_location.item)}\nYous gots 100 rupees?" \
f"\n ≥ I want\n no way!\n{{CHOICE}}"
+
+ # First we write hints about entrances, some from the inconvenient list others from all reasonable entrances.
+ if world.hints[player]:
if world.hints[player].value >= 2:
if world.hints[player] == "full":
tt['sign_north_of_links_house'] = '> Randomizer The telepathic tiles have hints!'
@@ -2280,7 +2283,7 @@ def write_strings(rom, world, player):
items_to_hint |= item_name_groups["Big Keys"]
if world.hints[player] == "full":
- hint_count = len(hint_locations) # fill all remaining hint locations with Item hints.
+ hint_count = len(hint_locations) # fill all remaining hint locations with Item hints.
else:
hint_count = 5 if world.shuffle[player] not in ['vanilla', 'dungeonssimple', 'dungeonsfull',
'dungeonscrossed'] else 8
diff --git a/worlds/alttp/Rules.py b/worlds/alttp/Rules.py
index 589766d40e..7e16d6e566 100644
--- a/worlds/alttp/Rules.py
+++ b/worlds/alttp/Rules.py
@@ -30,7 +30,7 @@ def set_rules(world):
# Set access rules according to max glitches for multiworld progression.
# Set accessibility to none, and shuffle assuming the no logic players can always win
world.accessibility[player] = world.accessibility[player].from_text("minimal")
- world.progression_balancing[player].value = False
+ world.progression_balancing[player].value = 0
else:
world.completion_condition[player] = lambda state: state.has('Triforce', player)
diff --git a/worlds/alttp/Shops.py b/worlds/alttp/Shops.py
index b16eff3ca7..73714abcc4 100644
--- a/worlds/alttp/Shops.py
+++ b/worlds/alttp/Shops.py
@@ -267,7 +267,7 @@ def ShopSlotFill(world):
min(int(price * world.shop_price_modifier[location.player] / 100) * 5, 9999), 1,
location.item.player if location.item.player != location.player else 0)
if 'P' in world.shop_shuffle[location.player]:
- price_to_funny_price(shop.inventory[location.shop_slot], world, location.player)
+ price_to_funny_price(world, shop.inventory[location.shop_slot], location.player)
def create_shops(world, player: int):
@@ -499,7 +499,7 @@ def shuffle_shops(world, items, player: int):
if 'P' in option:
for item in total_inventory:
- price_to_funny_price(item, world, player)
+ price_to_funny_price(world, item, player)
# Don't apply to upgrade shops
# Upgrade shop is only one place, and will generally be too easy to
# replenish hearts and bombs
@@ -529,14 +529,14 @@ price_blacklist = {
price_chart = {
ShopPriceType.Rupees: lambda p: p,
- ShopPriceType.Hearts: lambda p: min(5, p // 5) * 8, # Each heart is 0x8 in memory, Max of 5 hearts (20 total??)
- ShopPriceType.Magic: lambda p: min(15, p // 5) * 8, # Each pip is 0x8 in memory, Max of 15 pips (16 total...)
- ShopPriceType.Bombs: lambda p: max(1, min(10, p // 5)), # 10 Bombs max
- ShopPriceType.Arrows: lambda p: max(1, min(30, p // 5)), # 30 Arrows Max
+ ShopPriceType.Hearts: lambda p: min(5, p // 5) * 8, # Each heart is 0x8 in memory, Max of 5 hearts (20 total??)
+ ShopPriceType.Magic: lambda p: min(15, p // 5) * 8, # Each pip is 0x8 in memory, Max of 15 pips (16 total...)
+ ShopPriceType.Bombs: lambda p: max(1, min(10, p // 5)), # 10 Bombs max
+ ShopPriceType.Arrows: lambda p: max(1, min(30, p // 5)), # 30 Arrows Max
ShopPriceType.HeartContainer: lambda p: 0x8,
ShopPriceType.BombUpgrade: lambda p: 0x1,
ShopPriceType.ArrowUpgrade: lambda p: 0x1,
- ShopPriceType.Keys: lambda p: min(3, (p // 100) + 1), # Max of 3 keys for a price
+ ShopPriceType.Keys: lambda p: min(3, (p // 100) + 1), # Max of 3 keys for a price
ShopPriceType.Potion: lambda p: (p // 5) % 5,
}
@@ -564,27 +564,27 @@ simple_price_types = [
]
-def price_to_funny_price(item: dict, world, player: int):
+def price_to_funny_price(world, item: dict, player: int):
"""
Converts a raw Rupee price into a special price type
"""
if item:
- my_price_types = simple_price_types.copy()
- world.random.shuffle(my_price_types)
- for p_type in my_price_types:
- # Ignore rupee prices, logic-based prices or Keys (if we're not on universal keys)
- if p_type in [ShopPriceType.Rupees, ShopPriceType.BombUpgrade, ShopPriceType.ArrowUpgrade]:
+ price_types = [
+ ShopPriceType.Rupees, # included as a chance to not change price type
+ ShopPriceType.Hearts,
+ ShopPriceType.Bombs,
+ ]
+ # don't pay in universal keys to get access to universal keys
+ if world.smallkey_shuffle[player] == smallkey_shuffle.option_universal \
+ and not "Small Key (Universal)" == item['replacement']:
+ price_types.append(ShopPriceType.Keys)
+ if not world.retro[player]:
+ price_types.append(ShopPriceType.Arrows)
+ world.random.shuffle(price_types)
+ for p_type in price_types:
+ # Ignore rupee prices
+ if p_type == ShopPriceType.Rupees:
return
- # If we're using keys...
- # Check if we're in universal, check if our replacement isn't a Small Key
- # Check if price isn't super small... (this will ideally be handled in a future table)
- if p_type in [ShopPriceType.Keys]:
- if world.smallkey_shuffle[player] != smallkey_shuffle.option_universal:
- continue
- elif item['replacement'] and 'Small Key' in item['replacement']:
- continue
- if item['price'] < 50:
- continue
if any(x in item['item'] for x in price_blacklist[p_type]):
continue
else:
diff --git a/worlds/alttp/__init__.py b/worlds/alttp/__init__.py
index 1a3453f922..b782a15d02 100644
--- a/worlds/alttp/__init__.py
+++ b/worlds/alttp/__init__.py
@@ -4,11 +4,11 @@ import os
import threading
import typing
-from BaseClasses import Item, CollectionState
+from BaseClasses import Item, CollectionState, Tutorial
from .SubClasses import ALttPItem
-from ..AutoWorld import World, LogicMixin
+from ..AutoWorld import World, WebWorld, LogicMixin
from .Options import alttp_options, smallkey_shuffle
-from .Items import as_dict_item_table, item_name_groups, item_table
+from .Items import as_dict_item_table, item_name_groups, item_table, GetBeemizerItem
from .Regions import lookup_name_to_id, create_regions, mark_light_world_regions
from .Rules import set_rules
from .ItemPool import generate_itempool, difficulties
@@ -17,6 +17,7 @@ from .Dungeons import create_dungeons
from .Rom import LocalRom, patch_rom, patch_race_rom, patch_enemizer, apply_rom_settings, get_hash_string, \
get_base_rom_path, LttPDeltaPatch
import Patch
+from itertools import chain
from .InvertedRegions import create_inverted_regions, mark_dark_world_regions
from .EntranceShuffle import link_entrances, link_inverted_entrances, plando_connect
@@ -24,6 +25,82 @@ from .EntranceShuffle import link_entrances, link_inverted_entrances, plando_con
lttp_logger = logging.getLogger("A Link to the Past")
+class ALTTPWeb(WebWorld):
+ setup_en = Tutorial(
+ "Multiworld Setup Tutorial",
+ "A guide to setting up the Archipelago ALttP Software on your computer. This guide covers single-player, multiworld, and related software.",
+ "English",
+ "multiworld_en.md",
+ "multiworld/en",
+ ["Farrak Kilhn"]
+ )
+
+ setup_de = Tutorial(
+ setup_en.tutorial_name,
+ setup_en.description,
+ "Deutsch",
+ "multiworld_de.md",
+ "multiworld/de",
+ ["Fischfilet"]
+ )
+
+ setup_es = Tutorial(
+ setup_en.tutorial_name,
+ setup_en.description,
+ "Español",
+ "multiworld_es.md",
+ "multiworld/es",
+ ["Edos"]
+ )
+
+ setup_fr = Tutorial(
+ setup_en.tutorial_name,
+ setup_en.description,
+ "Français",
+ "multiworld_fr.md",
+ "multiworld/fr",
+ ["Coxla"]
+ )
+
+ msu = Tutorial(
+ "MSU-1 Setup Tutorial",
+ "A guide to setting up MSU-1, which allows for custom in-game music.",
+ "English",
+ "msu1_en.md",
+ "msu1/en",
+ ["Farrak Kilhn"]
+ )
+
+ msu_es = Tutorial(
+ msu.tutorial_name,
+ msu.description,
+ "Español",
+ "msu1_es.md",
+ "msu1/en",
+ ["Edos"]
+ )
+
+ msu_fr = Tutorial(
+ msu.tutorial_name,
+ msu.description,
+ "Français",
+ "msu1_fr.md",
+ "msu1/fr",
+ ["Coxla"]
+ )
+
+ plando = Tutorial(
+ "Plando Tutorial",
+ "A guide to creating Multiworld Plandos with LTTP",
+ "English",
+ "plando_en.md",
+ "plando/en",
+ ["Berserker"]
+ )
+
+ tutorials = [setup_en, setup_de, setup_es, setup_fr, msu, msu_es, msu_fr, plando]
+
+
class ALTTPWorld(World):
"""
The Legend of Zelda: A Link to the Past is an action/adventure game. Take on the role of
@@ -44,6 +121,7 @@ class ALTTPWorld(World):
remote_items: bool = False
remote_start_inventory: bool = False
required_client_version = (0, 3, 2)
+ web = ALTTPWeb()
set_rules = set_rules
@@ -56,6 +134,12 @@ class ALTTPWorld(World):
self.has_progressive_bows = False
super(ALTTPWorld, self).__init__(*args, **kwargs)
+ @classmethod
+ def stage_assert_generate(cls, world):
+ rom_file = get_base_rom_path()
+ if not os.path.exists(rom_file):
+ raise FileNotFoundError(rom_file)
+
def generate_early(self):
player = self.player
world = self.world
@@ -396,7 +480,11 @@ class ALTTPWorld(World):
trash_count -= 1
def get_filler_item_name(self) -> str:
- return "Rupees (5)" # temporary
+ if self.world.goal[self.player] == "icerodhunt":
+ item = "Nothing"
+ else:
+ item = self.world.random.choice(chain(difficulties[self.world.difficulty[self.player]].extras[0:5]))
+ return GetBeemizerItem(self.world, self.player, item)
def get_pre_fill_items(self):
res = []
diff --git a/WebHostLib/static/assets/gameInfo/en_A Link to the Past.md b/worlds/alttp/docs/en_A Link to the Past.md
similarity index 100%
rename from WebHostLib/static/assets/gameInfo/en_A Link to the Past.md
rename to worlds/alttp/docs/en_A Link to the Past.md
diff --git a/WebHostLib/static/assets/tutorial/A Link to the Past/msu1_en.md b/worlds/alttp/docs/msu1_en.md
similarity index 100%
rename from WebHostLib/static/assets/tutorial/A Link to the Past/msu1_en.md
rename to worlds/alttp/docs/msu1_en.md
diff --git a/WebHostLib/static/assets/tutorial/A Link to the Past/msu1_es.md b/worlds/alttp/docs/msu1_es.md
similarity index 100%
rename from WebHostLib/static/assets/tutorial/A Link to the Past/msu1_es.md
rename to worlds/alttp/docs/msu1_es.md
diff --git a/WebHostLib/static/assets/tutorial/A Link to the Past/msu1_fr.md b/worlds/alttp/docs/msu1_fr.md
similarity index 100%
rename from WebHostLib/static/assets/tutorial/A Link to the Past/msu1_fr.md
rename to worlds/alttp/docs/msu1_fr.md
diff --git a/WebHostLib/static/assets/tutorial/A Link to the Past/multiworld_de.md b/worlds/alttp/docs/multiworld_de.md
similarity index 100%
rename from WebHostLib/static/assets/tutorial/A Link to the Past/multiworld_de.md
rename to worlds/alttp/docs/multiworld_de.md
diff --git a/WebHostLib/static/assets/tutorial/A Link to the Past/multiworld_en.md b/worlds/alttp/docs/multiworld_en.md
similarity index 98%
rename from WebHostLib/static/assets/tutorial/A Link to the Past/multiworld_en.md
rename to worlds/alttp/docs/multiworld_en.md
index d9b2625e0a..9b94868fcc 100644
--- a/WebHostLib/static/assets/tutorial/A Link to the Past/multiworld_en.md
+++ b/worlds/alttp/docs/multiworld_en.md
@@ -111,7 +111,8 @@ You only have to do these steps once.
2. Go to Settings --> User Interface. Set "Show Advanced Settings" to ON.
3. Go to Settings --> Network. Set "Network Commands" to ON. (It is found below Request Device 16.) Leave the default
Network Command Port at 55355.
-
+
+
4. Go to Main Menu --> Online Updater --> Core Downloader. Scroll down and select "Nintendo - SNES / SFC (bsnes-mercury
Performance)".
diff --git a/WebHostLib/static/assets/tutorial/A Link to the Past/multiworld_es.md b/worlds/alttp/docs/multiworld_es.md
similarity index 100%
rename from WebHostLib/static/assets/tutorial/A Link to the Past/multiworld_es.md
rename to worlds/alttp/docs/multiworld_es.md
diff --git a/WebHostLib/static/assets/tutorial/A Link to the Past/multiworld_fr.md b/worlds/alttp/docs/multiworld_fr.md
similarity index 100%
rename from WebHostLib/static/assets/tutorial/A Link to the Past/multiworld_fr.md
rename to worlds/alttp/docs/multiworld_fr.md
diff --git a/WebHostLib/static/assets/tutorial/A Link to the Past/plando_en.md b/worlds/alttp/docs/plando_en.md
similarity index 100%
rename from WebHostLib/static/assets/tutorial/A Link to the Past/plando_en.md
rename to worlds/alttp/docs/plando_en.md
diff --git a/WebHostLib/static/assets/tutorial/retroarch-network-commands-en.png b/worlds/alttp/docs/retroarch-network-commands-en.png
old mode 100755
new mode 100644
similarity index 100%
rename from WebHostLib/static/assets/tutorial/retroarch-network-commands-en.png
rename to worlds/alttp/docs/retroarch-network-commands-en.png
diff --git a/worlds/archipidle/__init__.py b/worlds/archipidle/__init__.py
index da6deeb597..c515330260 100644
--- a/worlds/archipidle/__init__.py
+++ b/worlds/archipidle/__init__.py
@@ -1,11 +1,20 @@
-from BaseClasses import Item, MultiWorld, Region, Location, Entrance
+from BaseClasses import Item, MultiWorld, Region, Location, Entrance, Tutorial
from .Items import item_table
from .Rules import set_rules
from ..AutoWorld import World, WebWorld
+from datetime import datetime
class ArchipIDLEWebWorld(WebWorld):
theme = 'partyTime'
+ tutorials = [Tutorial(
+ "Setup Guide",
+ "A guide to playing ArchipIDLE",
+ "English",
+ "guide_en.md",
+ "guide/en",
+ ["Farrak Kilhn"]
+ )]
class ArchipIDLEWorld(World):
@@ -15,6 +24,7 @@ class ArchipIDLEWorld(World):
game = "ArchipIDLE"
topology_present = False
data_version = 3
+ hidden = (datetime.now().month != 4) # ArchipIDLE is only visible during April
web = ArchipIDLEWebWorld()
item_name_to_id = {}
@@ -62,6 +72,8 @@ class ArchipIDLEWorld(World):
self.world.get_entrance('Entrance to IDLE Zone', self.player)\
.connect(self.world.get_region('IDLE Zone', self.player))
+ def get_filler_item_name(self) -> str:
+ return self.world.random.choice(item_table)
def create_region(world: MultiWorld, player: int, name: str, locations=None, exits=None):
region = Region(name, None, name, player)
diff --git a/WebHostLib/static/assets/gameInfo/en_ArchipIDLE.md b/worlds/archipidle/docs/en_ArchipIDLE.md
similarity index 100%
rename from WebHostLib/static/assets/gameInfo/en_ArchipIDLE.md
rename to worlds/archipidle/docs/en_ArchipIDLE.md
diff --git a/WebHostLib/static/assets/tutorial/ArchipIDLE/guide_en.md b/worlds/archipidle/docs/guide_en.md
similarity index 100%
rename from WebHostLib/static/assets/tutorial/ArchipIDLE/guide_en.md
rename to worlds/archipidle/docs/guide_en.md
diff --git a/worlds/checksfinder/__init__.py b/worlds/checksfinder/__init__.py
index b3b5d2a7ce..7b5a61c952 100644
--- a/worlds/checksfinder/__init__.py
+++ b/worlds/checksfinder/__init__.py
@@ -9,12 +9,25 @@ from .Regions import checksfinder_regions, link_checksfinder_structures
from .Rules import set_rules, set_completion_rules
from worlds.generic.Rules import exclusion_rules
-from BaseClasses import Region, Entrance, Item
+from BaseClasses import Region, Entrance, Item, Tutorial
from .Options import checksfinder_options
-from ..AutoWorld import World
+from ..AutoWorld import World, WebWorld
client_version = 7
+
+class ChecksFinderWeb(WebWorld):
+ tutorials = [Tutorial(
+ "Multiworld Setup Tutorial",
+ "A guide to setting up the Archipelago ChecksFinder software on your computer. This guide covers "
+ "single-player, multiworld, and related software.",
+ "English",
+ "checksfinder_en.md",
+ "checksfinder/en",
+ ["Mewlif"]
+ )]
+
+
class ChecksFinderWorld(World):
"""
ChecksFinder is a game where you avoid mines and find checks inside the board
@@ -23,6 +36,7 @@ class ChecksFinderWorld(World):
game: str = "ChecksFinder"
options = checksfinder_options
topology_present = True
+ web = ChecksFinderWeb()
item_name_to_id = {name: data.code for name, data in item_table.items()}
location_name_to_id = {name: data.id for name, data in advancement_table.items()}
diff --git a/WebHostLib/static/assets/tutorial/ChecksFinder/checksfinder_en.md b/worlds/checksfinder/docs/checksfinder_en.md
similarity index 100%
rename from WebHostLib/static/assets/tutorial/ChecksFinder/checksfinder_en.md
rename to worlds/checksfinder/docs/checksfinder_en.md
diff --git a/WebHostLib/static/assets/gameInfo/en_ChecksFinder.md b/worlds/checksfinder/docs/en_ChecksFinder.md
similarity index 100%
rename from WebHostLib/static/assets/gameInfo/en_ChecksFinder.md
rename to worlds/checksfinder/docs/en_ChecksFinder.md
diff --git a/worlds/factorio/Options.py b/worlds/factorio/Options.py
index 2e24fe0718..b7d13c6464 100644
--- a/worlds/factorio/Options.py
+++ b/worlds/factorio/Options.py
@@ -262,6 +262,8 @@ class FactorioWorldGen(OptionDict):
}
},
Optional("seed"): Or(None, And(int, lambda n: n >= 0)),
+ Optional("width"): And(int, lambda n: n >= 0),
+ Optional("height"): And(int, lambda n: n >= 0),
Optional("starting_area"): FloatRange(0.166, 6),
Optional("peaceful_mode"): LuaBool,
Optional("cliff_settings"): {
@@ -270,11 +272,12 @@ class FactorioWorldGen(OptionDict):
"richness": FloatRange(0, 6)
},
Optional("property_expression_names"): Schema({
- "control-setting:moisture:bias": FloatRange(-0.5, 0.5),
- "control-setting:moisture:frequency:multiplier": FloatRange(0.166, 6),
- "control-setting:aux:bias": FloatRange(-0.5, 0.5),
- "control-setting:aux:frequency:multiplier": FloatRange(0.166, 6)
- }, ignore_extra_keys=True)
+ Optional("control-setting:moisture:bias"): FloatRange(-0.5, 0.5),
+ Optional("control-setting:moisture:frequency:multiplier"): FloatRange(0.166, 6),
+ Optional("control-setting:aux:bias"): FloatRange(-0.5, 0.5),
+ Optional("control-setting:aux:frequency:multiplier"): FloatRange(0.166, 6),
+ Optional(str): object # allow overriding all properties
+ }),
},
"advanced": {
Optional("pollution"): {
diff --git a/worlds/factorio/Technologies.py b/worlds/factorio/Technologies.py
index 7ffd1d1712..d7d1b88b41 100644
--- a/worlds/factorio/Technologies.py
+++ b/worlds/factorio/Technologies.py
@@ -193,8 +193,18 @@ del (raw)
recipes = {}
all_product_sources: Dict[str, Set[Recipe]] = {"character": set()}
# add uranium mining to logic graph. TODO: add to automatic extractor for mod support
-raw_recipes["uranium-ore"] = {"ingredients": {"sulfuric-acid": 1}, "products": {"uranium-ore": 1}, "category": "mining",
- "energy": 2}
+raw_recipes["uranium-ore"] = {
+ "ingredients": {"sulfuric-acid": 1},
+ "products": {"uranium-ore": 1},
+ "category": "mining",
+ "energy": 2
+}
+raw_recipes["crude-oil"] = {
+ "ingredients": {},
+ "products": {"crude-oil": 1},
+ "category": "basic-fluid",
+ "energy": 1
+}
# raw_recipes["iron-ore"] = {"ingredients": {}, "products": {"iron-ore": 1}, "category": "mining", "energy": 2}
# raw_recipes["copper-ore"] = {"ingredients": {}, "products": {"copper-ore": 1}, "category": "mining", "energy": 2}
@@ -225,6 +235,7 @@ for name, categories in raw_machines.items():
# add electric mining drill as a crafting machine to resolve uranium-ore
machines["electric-mining-drill"] = Machine("electric-mining-drill", {"mining"})
+machines["pumpjack"] = Machine("pumpjack", {"basic-fluid"})
machines["assembling-machine-1"].categories.add("crafting-with-fluid") # mod enables this
machines["character"].categories.add("basic-crafting") # somehow this is implied and not exported
del (raw_machines)
@@ -301,6 +312,7 @@ for category_name, machine_name in machine_per_category.items():
required_technologies: Dict[str, FrozenSet[Technology]] = Utils.KeyedDefaultDict(lambda ingredient_name: frozenset(
recursively_get_unlocking_technologies(ingredient_name, unlock_func=unlock)))
+
def get_rocket_requirements(silo_recipe: Recipe, part_recipe: Recipe, satellite_recipe: Recipe) -> Set[str]:
techs = set()
if silo_recipe:
diff --git a/worlds/factorio/__init__.py b/worlds/factorio/__init__.py
index 02665391dc..6cf6f35751 100644
--- a/worlds/factorio/__init__.py
+++ b/worlds/factorio/__init__.py
@@ -1,9 +1,9 @@
import collections
import typing
-from ..AutoWorld import World
+from ..AutoWorld import World, WebWorld
-from BaseClasses import Region, Entrance, Location, Item, RegionType
+from BaseClasses import Region, Entrance, Location, Item, RegionType, Tutorial
from .Technologies import base_tech_table, recipe_sources, base_technology_table, \
all_ingredient_names, all_product_sources, required_technologies, get_rocket_requirements, rocket_recipes, \
progressive_technology_table, common_tech_table, tech_to_progressive_lookup, progressive_tech_table, \
@@ -16,6 +16,17 @@ from .Options import factorio_options, MaxSciencePack, Silo, Satellite, TechTree
import logging
+class FactorioWeb(WebWorld):
+ tutorials = [Tutorial(
+ "Multiworld Setup Tutorial",
+ "A guide to setting up the Archipelago Factorio software on your computer.",
+ "English",
+ "setup_en.md",
+ "setup/en",
+ ["Berserker, Farrak Kilhn"]
+ )]
+
+
class FactorioItem(Item):
game = "Factorio"
@@ -36,6 +47,8 @@ class Factorio(World):
custom_recipes: typing.Dict[str, Recipe]
advancement_technologies: typing.Set[str]
+ web = FactorioWeb()
+
item_name_to_id = all_items
location_name_to_id = base_tech_table
item_name_groups = {
@@ -232,14 +245,16 @@ class Factorio(World):
ingredient = pool.pop()
if liquids_used == allow_liquids and ingredient in liquids:
continue # can't use this ingredient as we already have maximum liquid in our recipe.
+ ingredient_raw = 0
if ingredient in all_product_sources:
ingredient_recipe = min(all_product_sources[ingredient], key=lambda recipe: recipe.rel_cost)
ingredient_raw = sum((count for ingredient, count in ingredient_recipe.base_cost.items()))
ingredient_energy = ingredient_recipe.total_energy
else:
# assume simple ore TODO: remove if tree when mining data is harvested from Factorio
- ingredient_raw = 1
ingredient_energy = 2
+ if not ingredient_raw:
+ ingredient_raw = 1
if remaining_num_ingredients == 1:
max_raw = 1.1 * remaining_raw
min_raw = 0.9 * remaining_raw
diff --git a/worlds/factorio/data/mod_template/data-final-fixes.lua b/worlds/factorio/data/mod_template/data-final-fixes.lua
index d9b16bf5fa..36d1df5393 100644
--- a/worlds/factorio/data/mod_template/data-final-fixes.lua
+++ b/worlds/factorio/data/mod_template/data-final-fixes.lua
@@ -178,13 +178,13 @@ data:extend{new_tree_copy}
{% endfor %}
{% if recipe_time_scale %}
{%- for recipe_name, recipe in recipes.items() %}
-{%- if recipe.category != "mining" %}
+{%- if recipe.category not in ("mining", "basic-fluid") %}
adjust_energy("{{ recipe_name }}", {{ flop_random(*recipe_time_scale) }})
{%- endif %}
{%- endfor -%}
{% elif recipe_time_range %}
{%- for recipe_name, recipe in recipes.items() %}
-{%- if recipe.category != "mining" %}
+{%- if recipe.category not in ("mining", "basic-fluid") %}
set_energy("{{ recipe_name }}", {{ flop_random(*recipe_time_range) }})
{%- endif %}
{%- endfor -%}
diff --git a/WebHostLib/static/assets/tutorial/Factorio/connect-to-ap-server.png b/worlds/factorio/docs/connect-to-ap-server.png
similarity index 100%
rename from WebHostLib/static/assets/tutorial/Factorio/connect-to-ap-server.png
rename to worlds/factorio/docs/connect-to-ap-server.png
diff --git a/WebHostLib/static/assets/gameInfo/en_Factorio.md b/worlds/factorio/docs/en_Factorio.md
similarity index 100%
rename from WebHostLib/static/assets/gameInfo/en_Factorio.md
rename to worlds/factorio/docs/en_Factorio.md
diff --git a/WebHostLib/static/assets/tutorial/Factorio/factorio-download.png b/worlds/factorio/docs/factorio-download.png
similarity index 100%
rename from WebHostLib/static/assets/tutorial/Factorio/factorio-download.png
rename to worlds/factorio/docs/factorio-download.png
diff --git a/WebHostLib/static/assets/tutorial/Factorio/setup_en.md b/worlds/factorio/docs/setup_en.md
similarity index 97%
rename from WebHostLib/static/assets/tutorial/Factorio/setup_en.md
rename to worlds/factorio/docs/setup_en.md
index aa866d5ab9..fc83c190f1 100644
--- a/WebHostLib/static/assets/tutorial/Factorio/setup_en.md
+++ b/worlds/factorio/docs/setup_en.md
@@ -91,7 +91,7 @@ potential conflicts with your currently-installed version of Factorio. Download
appropriate to your operating system, and extract the folder to a convenient location (we recommend `C:\Factorio` or
similar).
-
+
Next, you should launch your Factorio Server by running `factorio.exe`, which is located at: `bin/x64/factorio.exe`. You
will be asked to log in to your Factorio account using the same credentials you used on Factorio's website. After you
@@ -120,7 +120,7 @@ This allows you to host your own Factorio game.
Archipelago if you chose to include it during the installation process.
6. Enter `/connect [server-address]` into the input box at the bottom of the Archipelago Client and press "Enter"
-
+
7. Launch your Factorio Client
8. Click on "Multiplayer" in the main menu
diff --git a/worlds/ff1/__init__.py b/worlds/ff1/__init__.py
index bad40c1636..761d9fbbe4 100644
--- a/worlds/ff1/__init__.py
+++ b/worlds/ff1/__init__.py
@@ -1,5 +1,5 @@
from typing import Dict
-from BaseClasses import Item, Location, MultiWorld
+from BaseClasses import Item, Location, MultiWorld, Tutorial
from .Items import ItemData, FF1Items, FF1_STARTER_ITEMS, FF1_PROGRESSION_LIST, FF1_BRIDGE
from .Locations import EventId, FF1Locations, generate_rule, CHAOS_TERMINATED_EVENT
from .Options import ff1_options
@@ -8,6 +8,14 @@ from ..AutoWorld import World, WebWorld
class FF1Web(WebWorld):
settings_page = "https://finalfantasyrandomizer.com/"
+ tutorials = [Tutorial(
+ "Multiworld Setup Guide",
+ "A guide to playing Final Fantasy multiworld. This guide only covers playing multiworld.",
+ "English",
+ "multiworld_en.md",
+ "multiworld/en",
+ ["jat2980"]
+ )]
class FF1World(World):
@@ -103,6 +111,8 @@ class FF1World(World):
return slot_data
+ def get_filler_item_name(self) -> str:
+ return self.world.random.choice(["Heal", "Pure", "Soft", "Tent", "Cabin", "House"])
def get_options(world: MultiWorld, name: str, player: int):
return getattr(world, name, None)[player].value
diff --git a/WebHostLib/static/assets/gameInfo/en_Final Fantasy.md b/worlds/ff1/docs/en_Final Fantasy.md
similarity index 100%
rename from WebHostLib/static/assets/gameInfo/en_Final Fantasy.md
rename to worlds/ff1/docs/en_Final Fantasy.md
diff --git a/WebHostLib/static/assets/tutorial/Final Fantasy/multiworld_en.md b/worlds/ff1/docs/multiworld_en.md
similarity index 94%
rename from WebHostLib/static/assets/tutorial/Final Fantasy/multiworld_en.md
rename to worlds/ff1/docs/multiworld_en.md
index 44d95dbe30..1528791e21 100644
--- a/WebHostLib/static/assets/tutorial/Final Fantasy/multiworld_en.md
+++ b/worlds/ff1/docs/multiworld_en.md
@@ -29,7 +29,8 @@ the [Final Fantasy Randomizer Homepage](https://finalfantasyrandomizer.com/).
Generate a game by going to the site and performing the following steps:
1. Select the randomization options (also known as `Flags` in the community) of your choice. If you do not know what you
- prefer, or it is your first time playing select the "Archipelago" preset on the main page.
+ prefer, or it is your first time we suggest starting with the 'Shard Hunt' preset (which requires you to collect a
+ number of shards to go to the end dungeon) or the 'Beginner' preset if you prefer to kill the original fiends.
2. Go to the `Beta` tab and ensure `Archipelago` is enabled. Set your player name to any name that represents you.
3. Upload you `Final Fantasy(USA).nes` (and click `Remember ROM` for the future!)
4. Press the `NEW` button beside `Seed` a few times
diff --git a/worlds/generic/Rules.py b/worlds/generic/Rules.py
index 2a607d9860..e82242091d 100644
--- a/worlds/generic/Rules.py
+++ b/worlds/generic/Rules.py
@@ -12,6 +12,20 @@ else:
ItemRule = typing.Callable[[object], bool]
+def group_locality_rules(world):
+ for group_id, group in world.groups.items():
+ if set(world.player_ids) == set(group["players"]):
+ continue
+ if group["local_items"]:
+ for location in world.get_locations():
+ if location.player not in group["players"]:
+ forbid_items_for_player(location, group["local_items"], group_id)
+ if group["non_local_items"]:
+ for location in world.get_locations():
+ if location.player in group["players"]:
+ forbid_items_for_player(location, group["non_local_items"], group_id)
+
+
def locality_rules(world, player: int):
if world.local_items[player].value:
for location in world.get_locations():
diff --git a/worlds/generic/__init__.py b/worlds/generic/__init__.py
index 926e0e1b5e..ee3ff46368 100644
--- a/worlds/generic/__init__.py
+++ b/worlds/generic/__init__.py
@@ -1,12 +1,33 @@
from typing import NamedTuple, Union
import logging
-from BaseClasses import Item
+from BaseClasses import Item, Tutorial
-from ..AutoWorld import World
+from ..AutoWorld import World, WebWorld
from NetUtils import SlotType
+class GenericWeb(WebWorld):
+ advanced_settings = Tutorial('Advanced YAML Guide',
+ 'A guide to reading YAML files and editing them to fully customize your game.',
+ 'English', 'advanced_settings_en.md', 'advanced_settings/en',
+ ['alwaysintreble', 'Alchav'])
+ commands = Tutorial('Archipelago Server and Client Commands',
+ 'A guide detailing the commands available to the user when participating in an Archipelago session.',
+ 'English', 'commands_en.md', 'commands/en', ['jat2980', 'Ijwu'])
+ plando = Tutorial('Archipelago Plando Guide', 'A guide to understanding and using plando for your game.',
+ 'English', 'plando_en.md', 'plando/en', ['alwaysintreble', 'Alchav'])
+ setup = Tutorial('Multiworld Setup Tutorial',
+ 'A guide to setting up the Archipelago software to generate and host multiworld games on your computer.',
+ 'English', 'setup_en.md', 'setup/en', ['alwaysintreble'])
+ triggers = Tutorial('Archipelago Triggers Guide', 'A guide to setting up and using triggers in your game settings.',
+ 'English', 'triggers_en.md', 'triggers/en', ['alwaysintreble'])
+ using_website = Tutorial('Archipelago Website User Guide',
+ 'A guide to using the Archipelago website to generate multiworlds or host pre-generated multiworlds.',
+ 'English', 'using_website_en.md', 'using_website/en', ['alwaysintreble'])
+ tutorials = [setup, using_website, commands, advanced_settings, triggers, plando]
+
+
class GenericWorld(World):
game = "Archipelago"
topology_present = False
@@ -18,6 +39,7 @@ class GenericWorld(World):
"Server": -2
}
hidden = True
+ web = GenericWeb()
def generate_early(self):
self.world.player_types[self.player] = SlotType.spectator # mark as spectator
diff --git a/WebHostLib/static/assets/tutorial/Archipelago/advanced_settings_en.md b/worlds/generic/docs/advanced_settings_en.md
similarity index 93%
rename from WebHostLib/static/assets/tutorial/Archipelago/advanced_settings_en.md
rename to worlds/generic/docs/advanced_settings_en.md
index 072a7873d8..734962feac 100644
--- a/WebHostLib/static/assets/tutorial/Archipelago/advanced_settings_en.md
+++ b/worlds/generic/docs/advanced_settings_en.md
@@ -85,12 +85,15 @@ games you want settings for.
* `progression_balancing` is a system the Archipelago generator uses to try and reduce "BK mode" as much as possible.
This primarily involves moving necessary progression items into earlier logic spheres to make the games more
- accessible so that players almost always have something to do. This can be turned `on` or `off` and is `on` by
- default.
+ accessible so that players almost always have something to do. This can be in a range from 0 to 99, and is 50 by
+ default. This number represents a percentage of the furthest progressible player.
+ * For example: With the default of 50%, if the furthest player can access 40% of their items, the randomizer tries
+ to let you access at least 20% of your items. 50% of 40% is 20%.
+ * Note that it is not always guaranteed that it will be able to bring you up to this threshold.
- * `triggers` is one of the more advanced options that allows you to create conditional adjustments. You can read
- more triggers in the triggers guide. Triggers
- guide: [Archipelago Triggers Guide](/tutorial/Archipelago/triggers/en)
+* `triggers` is one of the more advanced options that allows you to create conditional adjustments. You can read
+ more triggers in the triggers guide. Triggers
+ guide: [Archipelago Triggers Guide](/tutorial/Archipelago/triggers/en)
### Game Options
@@ -198,8 +201,8 @@ triggers:
* `requires` is set to require release version 0.2.0 or higher.
* `accesibility` is set to `none` which will set this seed to beatable only meaning some locations and items may be
completely inaccessible but the seed will still be completable.
-* `progression_balancing` is set on meaning we will likely receive important items earlier increasing the chance of
- having things to do.
+* `progression_balancing` is set on, giving it the default value, meaning we will likely receive important items
+ earlier increasing the chance of having things to do.
* `A Link to the Past` defines a location for us to nest all the game options we would like to use for our
game `A Link to the Past`.
* `smallkey_shuffle` is an option for A Link to the Past which determines how dungeon small keys are shuffled. In this
diff --git a/WebHostLib/static/assets/tutorial/Archipelago/commands_en.md b/worlds/generic/docs/commands_en.md
similarity index 100%
rename from WebHostLib/static/assets/tutorial/Archipelago/commands_en.md
rename to worlds/generic/docs/commands_en.md
diff --git a/WebHostLib/static/assets/tutorial/Archipelago/plando_en.md b/worlds/generic/docs/plando_en.md
similarity index 98%
rename from WebHostLib/static/assets/tutorial/Archipelago/plando_en.md
rename to worlds/generic/docs/plando_en.md
index dc04fab05a..c73fa8d398 100644
--- a/WebHostLib/static/assets/tutorial/Archipelago/plando_en.md
+++ b/worlds/generic/docs/plando_en.md
@@ -159,12 +159,12 @@ into any locations within the game slots named BobsSlaytheSpire and BobsRogueLeg
## Boss Plando
As this is currently only supported by A Link to the Past instead of explaining here please refer to the
-[relevant guide](/tutorial/zelda3/plando/en)
+relevant guide: [A Link to the Past Plando Guide](/tutorial/A%20Link%20to%20the%20Past/plando/en)
## Text Plando
As this is currently only supported by A Link to the Past instead of explaining here please refer to the
-[relevant guide](/tutorial/zelda3/plando/en)
+relevant guide: [A Link to the Past Plando Guide](/tutorial/A%20Link%20to%20the%20Past/plando/en)
## Connections Plando
diff --git a/WebHostLib/static/assets/tutorial/Archipelago/setup_en.md b/worlds/generic/docs/setup_en.md
similarity index 97%
rename from WebHostLib/static/assets/tutorial/Archipelago/setup_en.md
rename to worlds/generic/docs/setup_en.md
index 1792c57077..7d7425b8b9 100644
--- a/WebHostLib/static/assets/tutorial/Archipelago/setup_en.md
+++ b/worlds/generic/docs/setup_en.md
@@ -55,7 +55,7 @@ wish to play with.
Typically, a single participant of the multiworld will gather the YAML files from all other players. After getting the
YAML files of each participant for your multiworld game they can be compressed into a ZIP folder to then be uploaded to
the multiworld generator page. Multiworld generator
-page: [Archipelago Seed Generator Page](https://archipelago.gg/generate)
+page: [Archipelago Seed Generator Page](/generate)
#### Rolling a YAML Locally
@@ -78,7 +78,7 @@ files after generation so if rolling locally ensure this file is edited to your
## Hosting an Archipelago Server
The output of rolling a YAML will be a `.archipelago` file which can be subsequently uploaded to the Archipelago host
-game page. Archipelago host game page: [Archipelago Seed Upload Page](https://archipelago.gg/uploads)
+game page. Archipelago host game page: [Archipelago Seed Upload Page](/uploads)
The `.archipelago` file may be run locally in order to host the multiworld on the local machine. This is done by
running `ArchipelagoServer.exe` and pointing the resulting file selection prompt to the `.archipelago` file that was
diff --git a/WebHostLib/static/assets/tutorial/Archipelago/triggers_en.md b/worlds/generic/docs/triggers_en.md
similarity index 98%
rename from WebHostLib/static/assets/tutorial/Archipelago/triggers_en.md
rename to worlds/generic/docs/triggers_en.md
index 3fa62daf07..03ce9c65cb 100644
--- a/WebHostLib/static/assets/tutorial/Archipelago/triggers_en.md
+++ b/worlds/generic/docs/triggers_en.md
@@ -17,7 +17,7 @@ For more information on plando you can reference the general plando guide or the
General plando guide: [Archipelago Plando Guide](/tutorial/Archipelago/plando/en)
-Link to the Past plando guide: [LttP Plando Guide](/tutorial/zelda3/plando/en)
+Link to the Past plando guide: [LttP Plando Guide](/tutorial/A%20Link%20to%20the%20Past/plando/en)
## Trigger use
diff --git a/WebHostLib/static/assets/tutorial/Archipelago/using_website_en.md b/worlds/generic/docs/using_website_en.md
similarity index 91%
rename from WebHostLib/static/assets/tutorial/Archipelago/using_website_en.md
rename to worlds/generic/docs/using_website_en.md
index 7a9ae2fef7..92cc7aec4d 100644
--- a/WebHostLib/static/assets/tutorial/Archipelago/using_website_en.md
+++ b/worlds/generic/docs/using_website_en.md
@@ -7,7 +7,7 @@ should only take a couple of minutes to read.
1. After gathering the YAML files together in one location, select all the files and compress them into a `.ZIP` file.
2. Next go to the "Generate Game" page. Generate game
- page: [Archipelago Seed Generation Page](https://archipelago.gg/generate). Here, you can adjust some server settings
+ page: [Archipelago Seed Generation Page](/generate). Here, you can adjust some server settings
such as forfeit rules and the cost for a player to use a hint before generation.
3. After adjusting the host settings to your liking click on the Upload File button and using the explorer window that
opens, navigate to the location where you zipped the player files and upload this zip. The page will generate your
@@ -26,7 +26,7 @@ games.
If for some reason the seed was rolled on a machine, then either the resulting zip file or the
resulting `AP_XXXXX.archipelago` inside the zip file can be uploaded to the host game page. Host game
-page: [Archipelago Seed Upload Page](https://archipelago.gg/uploads)
+page: [Archipelago Seed Upload Page](/uploads)
This will give a page with the seed info and a link to the spoiler log, if it exists. Click on "Create New Room" and
then share the link to the resulting page the other players so that they can download their patches or mods. The room
diff --git a/worlds/hk/__init__.py b/worlds/hk/__init__.py
index 6fb2cb9c11..015cb12c63 100644
--- a/worlds/hk/__init__.py
+++ b/worlds/hk/__init__.py
@@ -14,8 +14,8 @@ from .ExtractedData import locations, starts, multi_locations, location_to_regio
event_names, item_effects, connectors, one_ways
from .Charms import names as charm_names
-from BaseClasses import Region, Entrance, Location, MultiWorld, Item, RegionType
-from ..AutoWorld import World, LogicMixin
+from BaseClasses import Region, Entrance, Location, MultiWorld, Item, RegionType, Tutorial
+from ..AutoWorld import World, LogicMixin, WebWorld
white_palace_locations = {
"Soul_Totem-Path_of_Pain_Below_Thornskip",
@@ -88,6 +88,17 @@ progression_charms = {
}
+class HKWeb(WebWorld):
+ tutorials = [Tutorial(
+ "Mod Setup and Use Guide",
+ "A guide to playing Hollow Knight with Archipelago.",
+ "English",
+ "setup_en.md",
+ "setup/en",
+ ["Ijwu"]
+ )]
+
+
class HKWorld(World):
"""Beneath the fading town of Dirtmouth sleeps a vast, ancient kingdom. Many are drawn beneath the surface,
searching for riches, or glory, or answers to old secrets.
@@ -97,6 +108,8 @@ class HKWorld(World):
game: str = "Hollow Knight"
options = hollow_knight_options
+ web = HKWeb()
+
item_name_to_id = {name: data.id for name, data in item_table.items()}
location_name_to_id = {location_name: location_id for location_id, location_name in
enumerate(locations, start=0x1000000)}
diff --git a/WebHostLib/static/assets/gameInfo/en_Hollow Knight.md b/worlds/hk/docs/en_Hollow Knight.md
similarity index 100%
rename from WebHostLib/static/assets/gameInfo/en_Hollow Knight.md
rename to worlds/hk/docs/en_Hollow Knight.md
diff --git a/WebHostLib/static/assets/tutorial/Hollow Knight/setup_en.md b/worlds/hk/docs/setup_en.md
similarity index 100%
rename from WebHostLib/static/assets/tutorial/Hollow Knight/setup_en.md
rename to worlds/hk/docs/setup_en.md
diff --git a/worlds/meritous/Items.py b/worlds/meritous/Items.py
index a2d9c86c96..4f02ee9d5b 100644
--- a/worlds/meritous/Items.py
+++ b/worlds/meritous/Items.py
@@ -163,6 +163,8 @@ class MeritousItem(Item):
self.type = name
elif name == "Extra Life":
self.type = "Other"
+ elif self.advancement:
+ self.type = "Important Artifact"
else:
self.type = "Artifact"
self.never_exclude = True
@@ -210,5 +212,6 @@ item_groups = {
"Artifacts": ["Map", "Shield Boost", "Crystal Efficiency", "Circuit Booster",
"Metabolism", "Dodge Enhancer", "Ethereal Monocle", "Crystal Gatherer",
"Portable Compass"],
+ "Important Artifacts": ["Shield Boost", "Circuit Booster", "Metabolism", "Dodge Enhancer"],
"Crystals": ["Crystals x500", "Crystals x1000", "Crystals x2000"]
}
diff --git a/worlds/meritous/Regions.py b/worlds/meritous/Regions.py
index 502a40972d..2fdafb6926 100644
--- a/worlds/meritous/Regions.py
+++ b/worlds/meritous/Regions.py
@@ -68,7 +68,8 @@ def create_regions(world: MultiWorld, player: int):
entrance_map = {
"To Meridian": {
"to": "Meridian",
- "rule": lambda state: state.has_group("PSI Keys", player, 1)
+ "rule": lambda state: state.has_group("PSI Keys", player, 1) and
+ state.has_group("Important Artifacts", player, 1)
},
"To Second Quarter": {
"to": "Second Quarter",
@@ -76,7 +77,8 @@ def create_regions(world: MultiWorld, player: int):
},
"To Ataraxia": {
"to": "Ataraxia",
- "rule": lambda state: state.has_group("PSI Keys", player, 2)
+ "rule": lambda state: state.has_group("PSI Keys", player, 2) and
+ state.has_group("Important Artifacts", player, 2)
},
"To Third Quarter": {
"to": "Third Quarter",
@@ -84,7 +86,8 @@ def create_regions(world: MultiWorld, player: int):
},
"To Merodach": {
"to": "Merodach",
- "rule": lambda state: state.has_group("PSI Keys", player, 3)
+ "rule": lambda state: state.has_group("PSI Keys", player, 3) and
+ state.has_group("Important Artifacts", player, 3)
},
"To Last Quarter": {
"to": "Last Quarter",
diff --git a/worlds/meritous/__init__.py b/worlds/meritous/__init__.py
index 24b9808b81..2f59f7825c 100644
--- a/worlds/meritous/__init__.py
+++ b/worlds/meritous/__init__.py
@@ -3,18 +3,31 @@
# This software is released under the MIT License.
# https://opensource.org/licenses/MIT
-from BaseClasses import Item, MultiWorld
+from BaseClasses import Item, MultiWorld, Tutorial
from Fill import fill_restrictive
from .Items import item_table, item_groups, MeritousItem
from .Locations import location_table, MeritousLocation
from .Options import meritous_options, cost_scales
from .Regions import create_regions
from .Rules import set_rules
-from ..AutoWorld import World
+from ..AutoWorld import World, WebWorld
client_version = 1
+class MeritousWeb(WebWorld):
+ tutorials = [Tutorial(
+ "Meritous Setup Tutorial",
+ "A guide to setting up the Archipelago Meritous software on your computer.",
+ "English",
+ "setup_en.md",
+ "setup/en",
+ ["KewlioMZX"]
+ )]
+ theme = "ice"
+ bug_report_page = "https://github.com/FelicitusNeko/meritous-ap/issues"
+
+
class MeritousWorld(World):
"""
Meritous Gaiden is a procedurally generated bullet-hell dungeon crawl game.
@@ -25,6 +38,8 @@ class MeritousWorld(World):
game: str = "Meritous"
topology_present: False
+ web = MeritousWeb()
+
item_name_to_id = item_table
location_name_to_id = location_table
item_name_groups = item_groups
@@ -47,7 +62,10 @@ class MeritousWorld(World):
@staticmethod
def _is_progression(name):
- return "PSI Key" in name or name in ["Cursed Seal", "Agate Knife"]
+ return "PSI Key" in name or name in [
+ "Cursed Seal", "Agate Knife", "Dodge Enhancer",
+ "Shield Boost", "Metabolism", "Circuit Booster"
+ ]
def create_item(self, name: str) -> Item:
return MeritousItem(name, self._is_progression(
diff --git a/WebHostLib/static/assets/gameInfo/en_Meritous.md b/worlds/meritous/docs/en_Meritous.md
similarity index 100%
rename from WebHostLib/static/assets/gameInfo/en_Meritous.md
rename to worlds/meritous/docs/en_Meritous.md
diff --git a/WebHostLib/static/assets/tutorial/Meritous/setup_en.md b/worlds/meritous/docs/setup_en.md
similarity index 97%
rename from WebHostLib/static/assets/tutorial/Meritous/setup_en.md
rename to worlds/meritous/docs/setup_en.md
index 4cfdb6fdb2..c829765e53 100644
--- a/WebHostLib/static/assets/tutorial/Meritous/setup_en.md
+++ b/worlds/meritous/docs/setup_en.md
@@ -58,7 +58,6 @@ More in-depth information about the game can be found in the game's help file, a
- `Disconnected`: If the game does not reconnect automatically, you may need to save, quit, and reload the game to reconnect. Keep in mind that the game does not auto-save, and it is only possible to save the game at Save Tiles.
- `InvalidSlot`, `InvalidGame`: Make sure the `slotname` in `meritous-ap.json` matches the name provided in your Meritous YAML file.
-- `SlotAlreadyTaken`: Make sure Meritous Gaiden is not already running and connected to the server.
- `IncompatibleVersion`: Make sure Meritous Gaiden has been updated to the latest version.
- `InvalidPassword`: Make sure the `password` in `meritous-ap.json` matches the password for your game. If there is no password, either set this to `null` (no quotes) or omit/remove it completely.
- `InvalidItemsHandling`: This is a bug and shouldn't happen if you downloaded a precompiled copy of the game. If you downloaded a precompiled copy, please let KewlioMZX know over GitHub or the AP Discord.
diff --git a/worlds/minecraft/Items.py b/worlds/minecraft/Items.py
index a176c4f7ae..c142ec2e7d 100644
--- a/worlds/minecraft/Items.py
+++ b/worlds/minecraft/Items.py
@@ -57,7 +57,7 @@ item_table = {
"Shulker Box": ItemData(45042, False),
"Dragon Egg Shard": ItemData(45043, True),
"Spyglass": ItemData(45044, True),
- "Bee Trap (Minecraft)": ItemData(45100, False),
+ "Bee Trap": ItemData(45100, False),
"Blaze Rods": ItemData(None, True),
"Defeat Ender Dragon": ItemData(None, True),
diff --git a/worlds/minecraft/Locations.py b/worlds/minecraft/Locations.py
index 7dbf85def0..a5c0421fa6 100644
--- a/worlds/minecraft/Locations.py
+++ b/worlds/minecraft/Locations.py
@@ -119,6 +119,10 @@ advancement_table = {
"Light as a Rabbit": AdvData(42100, 'Overworld'),
"Glow and Behold!": AdvData(42101, 'Overworld'),
"Whatever Floats Your Goat!": AdvData(42102, 'Overworld'),
+ "Caves & Cliffs": AdvData(42103, 'Overworld'),
+ "Feels like home": AdvData(42104, 'The Nether'),
+ "Sound of Music": AdvData(42105, 'Overworld'),
+ "Star Trader": AdvData(42106, 'Village'),
"Blaze Spawner": AdvData(None, 'Nether Fortress'),
"Ender Dragon": AdvData(None, 'The End'),
@@ -139,7 +143,8 @@ exclusion_table = {
"Cover Me in Debris",
"A Complete Catalogue",
"Surge Protector",
- "Light as a Rabbit", # will be normal in 1.18
+ "Sound of Music",
+ "Star Trader",
},
"unreasonable": {
"How Did We Get Here?",
diff --git a/worlds/minecraft/Options.py b/worlds/minecraft/Options.py
index 19a166d509..f35866f7ae 100644
--- a/worlds/minecraft/Options.py
+++ b/worlds/minecraft/Options.py
@@ -1,12 +1,12 @@
import typing
-from Options import Choice, Option, Toggle, Range, OptionList, DeathLink
+from Options import Choice, Option, Toggle, DefaultOnToggle, Range, OptionList, DeathLink
class AdvancementGoal(Range):
"""Number of advancements required to spawn bosses."""
display_name = "Advancement Goal"
range_start = 0
- range_end = 92
+ range_end = 95
default = 40
@@ -36,16 +36,14 @@ class BossGoal(Choice):
default = 1
-class ShuffleStructures(Toggle):
+class ShuffleStructures(DefaultOnToggle):
"""Enables shuffling of villages, outposts, fortresses, bastions, and end cities."""
display_name = "Shuffle Structures"
- default = 1
-class StructureCompasses(Toggle):
+class StructureCompasses(DefaultOnToggle):
"""Adds structure compasses to the item pool, which point to the nearest indicated structure."""
display_name = "Structure Compasses"
- default = 1
class BeeTraps(Range):
@@ -68,25 +66,21 @@ class CombatDifficulty(Choice):
class HardAdvancements(Toggle):
"""Enables certain RNG-reliant or tedious advancements."""
display_name = "Include Hard Advancements"
- default = 0
class UnreasonableAdvancements(Toggle):
"""Enables the extremely difficult advancements "How Did We Get Here?" and "Adventuring Time.\""""
display_name = "Include Unreasonable Advancements"
- default = 0
class PostgameAdvancements(Toggle):
"""Enables advancements that require spawning and defeating the required bosses."""
display_name = "Include Postgame Advancements"
- default = 0
class SendDefeatedMobs(Toggle):
"""Send killed mobs to other Minecraft worlds which have this option enabled."""
display_name = "Send Defeated Mobs"
- default = 0
class StartingItems(OptionList):
diff --git a/worlds/minecraft/Rules.py b/worlds/minecraft/Rules.py
index b66de59d18..f2872e2d97 100644
--- a/worlds/minecraft/Rules.py
+++ b/worlds/minecraft/Rules.py
@@ -41,8 +41,17 @@ class MinecraftLogic(LogicMixin):
def _mc_can_piglin_trade(self, player: int):
return self._mc_has_gold_ingots(player) and (
- self.can_reach('The Nether', 'Region', player) or self.can_reach('Bastion Remnant', 'Region',
- player))
+ self.can_reach('The Nether', 'Region', player) or
+ self.can_reach('Bastion Remnant', 'Region', player))
+
+ def _mc_overworld_villager(self, player: int):
+ village_region = self.world.get_region('Village', player).entrances[0].parent_region.name
+ if village_region == 'The Nether': # 2 options: cure zombie villager or build portal in village
+ return (self.can_reach('Zombie Doctor', 'Location', player) or
+ (self._mc_has_diamond_pickaxe(player) and self.can_reach('Village', 'Region', player)))
+ elif village_region == 'The End':
+ return self.can_reach('Zombie Doctor', 'Location', player)
+ return self.can_reach('Village', 'Region', player)
def _mc_enter_stronghold(self, player: int):
return self.has('Blaze Rods', player) and self.has('Brewing', player) and self.has('3 Ender Pearls', player)
@@ -132,8 +141,8 @@ def set_advancement_rules(world: MultiWorld, player: int):
set_rule(world.get_location("Who is Cutting Onions?", player), lambda state: state._mc_can_piglin_trade(player))
set_rule(world.get_location("Oh Shiny", player), lambda state: state._mc_can_piglin_trade(player))
set_rule(world.get_location("Suit Up", player), lambda state: state.has("Progressive Armor", player) and state._mc_has_iron_ingots(player))
- set_rule(world.get_location("Very Very Frightening", player), lambda state: state.has("Channeling Book", player) and state._mc_can_use_anvil(player) and state._mc_can_enchant(player) and \
- ((world.get_region('Village', player).entrances[0].parent_region.name != 'The End' and state.can_reach('Village', 'Region', player)) or state.can_reach('Zombie Doctor', 'Location', player))) # need villager into the overworld for lightning strike
+ set_rule(world.get_location("Very Very Frightening", player), lambda state: state.has("Channeling Book", player) and
+ state._mc_can_use_anvil(player) and state._mc_can_enchant(player) and state._mc_overworld_villager(player))
set_rule(world.get_location("Hot Stuff", player), lambda state: state.has("Bucket", player) and state._mc_has_iron_ingots(player))
set_rule(world.get_location("Free the End", player), lambda state: state._mc_can_respawn_ender_dragon(player) and state._mc_can_kill_ender_dragon(player))
set_rule(world.get_location("A Furious Cocktail", player), lambda state: state._mc_can_brew_potions(player) and
@@ -252,11 +261,19 @@ def set_advancement_rules(world: MultiWorld, player: int):
set_rule(world.get_location("Is It a Bird?", player), lambda state: state._mc_has_spyglass(player) and state._mc_can_adventure(player))
set_rule(world.get_location("Is It a Balloon?", player), lambda state: state._mc_has_spyglass(player))
set_rule(world.get_location("Is It a Plane?", player), lambda state: state._mc_has_spyglass(player) and state._mc_can_respawn_ender_dragon(player))
- set_rule(world.get_location("Surge Protector", player), lambda state: state.has("Channeling Book", player) and state._mc_can_use_anvil(player) and state._mc_can_enchant(player) and \
- ((world.get_region('Village', player).entrances[0].parent_region.name != 'The End' and state.can_reach('Village', 'Region', player)) or state.can_reach('Zombie Doctor', 'Location', player)))
+ set_rule(world.get_location("Surge Protector", player), lambda state: state.has("Channeling Book", player) and
+ state._mc_can_use_anvil(player) and state._mc_can_enchant(player) and state._mc_overworld_villager(player))
set_rule(world.get_location("Light as a Rabbit", player), lambda state: state._mc_can_adventure(player) and state._mc_has_iron_ingots(player) and state.has('Bucket', player))
set_rule(world.get_location("Glow and Behold!", player), lambda state: state._mc_can_adventure(player))
set_rule(world.get_location("Whatever Floats Your Goat!", player), lambda state: state._mc_can_adventure(player))
+ set_rule(world.get_location("Caves & Cliffs", player), lambda state: state._mc_has_iron_ingots(player) and state.has('Bucket', player) and state.has('Progressive Tools', player, 2))
+ set_rule(world.get_location("Feels like home", player), lambda state: state._mc_has_iron_ingots(player) and state.has('Bucket', player) and state.has('Fishing Rod', player) and
+ (state._mc_fortress_loot(player) or state._mc_complete_raid(player)) and state.has("Saddle", player))
+ set_rule(world.get_location("Sound of Music", player), lambda state: state.can_reach("Diamonds!", "Location", player) and state._mc_basic_combat(player))
+ set_rule(world.get_location("Star Trader", player), lambda state: state._mc_has_iron_ingots(player) and state.has('Bucket', player) and
+ (state.can_reach("The Nether", 'Region', player) or state.can_reach("Nether Fortress", 'Region', player) or state._mc_can_piglin_trade(player)) and # soul sand for water elevator
+ state._mc_overworld_villager(player))
+
# Sets rules on completion condition and postgame advancements
def set_completion_rules(world: MultiWorld, player: int):
diff --git a/worlds/minecraft/__init__.py b/worlds/minecraft/__init__.py
index af57296a84..b1090cac24 100644
--- a/worlds/minecraft/__init__.py
+++ b/worlds/minecraft/__init__.py
@@ -9,18 +9,46 @@ from .Regions import mc_regions, link_minecraft_structures, default_connections
from .Rules import set_advancement_rules, set_completion_rules
from worlds.generic.Rules import exclusion_rules
-from BaseClasses import Region, Entrance, Item
+from BaseClasses import Region, Entrance, Item, Tutorial
from .Options import minecraft_options
from ..AutoWorld import World, WebWorld
-client_version = 7
-minecraft_version = "1.17.1"
-
+client_version = 8
class MinecraftWebWorld(WebWorld):
theme = "jungle"
bug_report_page = "https://github.com/KonoTyran/Minecraft_AP_Randomizer/issues/new?assignees=&labels=bug&template=bug_report.yaml&title=%5BBug%5D%3A+Brief+Description+of+bug+here"
+ setup = Tutorial(
+ "Multiworld Setup Tutorial",
+ "A guide to setting up the Archipelago Minecraft software on your computer. This guide covers"
+ "single-player, multiworld, and related software.",
+ "English",
+ "minecraft_en.md",
+ "minecraft/en",
+ ["Kono Tyran"]
+ )
+
+ setup_es = Tutorial(
+ setup.tutorial_name,
+ setup.description,
+ "Español",
+ "minecraft_es.md",
+ "minecraft/es",
+ ["Edos"]
+ )
+
+ setup_sv = Tutorial(
+ setup.tutorial_name,
+ setup.description,
+ "Swedish",
+ "minecraft_sv.md",
+ "minecraft/sv",
+ ["Albinum"]
+ )
+
+ tutorials = [setup, setup_es, setup_sv]
+
class MinecraftWorld(World):
"""
@@ -37,7 +65,7 @@ class MinecraftWorld(World):
item_name_to_id = {name: data.code for name, data in item_table.items()}
location_name_to_id = {name: data.id for name, data in advancement_table.items()}
- data_version = 4
+ data_version = 6
def _get_mc_data(self):
exits = [connection[0] for connection in default_connections]
@@ -47,7 +75,6 @@ class MinecraftWorld(World):
'player_name': self.world.get_player_name(self.player),
'player_id': self.player,
'client_version': client_version,
- 'minecraft_version': minecraft_version,
'structures': {exit: self.world.get_entrance(exit, self.player).connected_region.name for exit in exits},
'advancement_goal': self.world.advancement_goal[self.player].value,
'egg_shards_required': min(self.world.egg_shards_required[self.player].value,
@@ -78,7 +105,7 @@ class MinecraftWorld(World):
itempool += ["Dragon Egg Shard"] * self.world.egg_shards_available[self.player]
# Add bee traps if desired
bee_trap_quantity = ceil(self.world.bee_traps[self.player] * (len(self.location_names)-len(itempool)) * 0.01)
- itempool += ["Bee Trap (Minecraft)"] * bee_trap_quantity
+ itempool += ["Bee Trap"] * bee_trap_quantity
# Fill remaining items with randomly generated junk
itempool += self.world.random.choices(list(junk_pool.keys()), weights=list(junk_pool.values()), k=len(self.location_names)-len(itempool))
# Convert itempool into real items
@@ -101,6 +128,9 @@ class MinecraftWorld(World):
self.world.itempool += itempool
+ def get_filler_item_name(self) -> str:
+ return self.world.random.choices(list(junk_weights.keys()), weights=list(junk_weights.values()))[0]
+
def set_rules(self):
set_advancement_rules(self.world, self.player)
set_completion_rules(self.world, self.player)
@@ -138,6 +168,8 @@ class MinecraftWorld(World):
nonexcluded_items = ["Sharpness III Book", "Infinity Book", "Looting III Book"]
if name in nonexcluded_items: # prevent books from going on excluded locations
item.never_exclude = True
+ if name == "Bee Trap":
+ item.trap = True
return item
def mc_update_output(raw_data, server, port):
diff --git a/WebHostLib/static/assets/gameInfo/en_Minecraft.md b/worlds/minecraft/docs/en_Minecraft.md
similarity index 100%
rename from WebHostLib/static/assets/gameInfo/en_Minecraft.md
rename to worlds/minecraft/docs/en_Minecraft.md
diff --git a/WebHostLib/static/assets/tutorial/Minecraft/minecraft_en.md b/worlds/minecraft/docs/minecraft_en.md
similarity index 100%
rename from WebHostLib/static/assets/tutorial/Minecraft/minecraft_en.md
rename to worlds/minecraft/docs/minecraft_en.md
diff --git a/WebHostLib/static/assets/tutorial/Minecraft/minecraft_es.md b/worlds/minecraft/docs/minecraft_es.md
similarity index 99%
rename from WebHostLib/static/assets/tutorial/Minecraft/minecraft_es.md
rename to worlds/minecraft/docs/minecraft_es.md
index e827ac7947..3f2df6e7ba 100644
--- a/WebHostLib/static/assets/tutorial/Minecraft/minecraft_es.md
+++ b/worlds/minecraft/docs/minecraft_es.md
@@ -30,7 +30,7 @@ game: Minecraft
# Opciones compartidas por todos los juegos:
accessibility: locations
-progression_balancing: on
+progression_balancing: 50
# Opciones Especficicas para Minecraft
Minecraft:
diff --git a/WebHostLib/static/assets/tutorial/Minecraft/minecraft_sv.md b/worlds/minecraft/docs/minecraft_sv.md
similarity index 99%
rename from WebHostLib/static/assets/tutorial/Minecraft/minecraft_sv.md
rename to worlds/minecraft/docs/minecraft_sv.md
index eb799024c2..e86d293939 100644
--- a/WebHostLib/static/assets/tutorial/Minecraft/minecraft_sv.md
+++ b/worlds/minecraft/docs/minecraft_sv.md
@@ -80,7 +80,7 @@ description: Template Name
name: YourName
game: Minecraft
accessibility: locations
-progression_balancing: off
+progression_balancing: 0
advancement_goal:
few: 0
normal: 1
diff --git a/worlds/oot/DungeonList.py b/worlds/oot/DungeonList.py
index 8d3a95345b..ab4fc88125 100644
--- a/worlds/oot/DungeonList.py
+++ b/worlds/oot/DungeonList.py
@@ -87,8 +87,8 @@ dungeon_table = [
'dungeon_item': 1,
},
{
- 'name': 'Gerudo Training Grounds',
- 'hint': 'the Gerudo Training Grounds',
+ 'name': 'Gerudo Training Ground',
+ 'hint': 'the Gerudo Training Ground',
'font_color': 'Yellow',
'boss_key': 0,
'small_key': 9,
@@ -122,7 +122,7 @@ def create_dungeons(ootworld):
hint = dungeon_info['hint'] if 'hint' in dungeon_info else name
font_color = dungeon_info['font_color'] if 'font_color' in dungeon_info else 'White'
- if ootworld.logic_rules == 'glitchless':
+ if ootworld.logic_rules == 'glitchless' or ootworld.logic_rules == 'no_logic': # ER + NL
if not ootworld.dungeon_mq[name]:
dungeon_json = os.path.join(data_path('World'), name + '.json')
else:
diff --git a/worlds/oot/EntranceShuffle.py b/worlds/oot/EntranceShuffle.py
index 9008ccdff2..08d1e3ff79 100644
--- a/worlds/oot/EntranceShuffle.py
+++ b/worlds/oot/EntranceShuffle.py
@@ -93,8 +93,8 @@ entrance_shuffle_table = [
('Bottom of the Well -> Kakariko Village', { 'index': 0x02A6 })),
('Dungeon', ('ZF Ice Ledge -> Ice Cavern Beginning', { 'index': 0x0088 }),
('Ice Cavern Beginning -> ZF Ice Ledge', { 'index': 0x03D4 })),
- ('Dungeon', ('Gerudo Fortress -> Gerudo Training Grounds Lobby', { 'index': 0x0008 }),
- ('Gerudo Training Grounds Lobby -> Gerudo Fortress', { 'index': 0x03A8 })),
+ ('Dungeon', ('Gerudo Fortress -> Gerudo Training Ground Lobby', { 'index': 0x0008 }),
+ ('Gerudo Training Ground Lobby -> Gerudo Fortress', { 'index': 0x03A8 })),
('Interior', ('Kokiri Forest -> KF Midos House', { 'index': 0x0433 }),
('KF Midos House -> Kokiri Forest', { 'index': 0x0443 })),
@@ -251,8 +251,8 @@ entrance_shuffle_table = [
('Graveyard Shield Grave -> Graveyard', { 'index': 0x035D })),
('Grave', ('Graveyard -> Graveyard Heart Piece Grave', { 'index': 0x031C }),
('Graveyard Heart Piece Grave -> Graveyard', { 'index': 0x0361 })),
- ('Grave', ('Graveyard -> Graveyard Composers Grave', { 'index': 0x002D }),
- ('Graveyard Composers Grave -> Graveyard', { 'index': 0x050B })),
+ ('Grave', ('Graveyard -> Graveyard Royal Familys Tomb', { 'index': 0x002D }),
+ ('Graveyard Royal Familys Tomb -> Graveyard', { 'index': 0x050B })),
('Grave', ('Graveyard -> Graveyard Dampes Grave', { 'index': 0x044F }),
('Graveyard Dampes Grave -> Graveyard', { 'index': 0x0359 })),
diff --git a/worlds/oot/HintList.py b/worlds/oot/HintList.py
index e94fd5f323..06af1a9be3 100644
--- a/worlds/oot/HintList.py
+++ b/worlds/oot/HintList.py
@@ -6,7 +6,7 @@ from BaseClasses import LocationProgressType
# DMC Death Mountain Crater
# DMT Death Mountain Trail
# GC Goron City
-# GF Gerudo Fortress
+# GF Gerudo's Fortress
# GS Gold Skulltula
# GV Gerudo Valley
# HC Hyrule Castle
@@ -17,6 +17,7 @@ from BaseClasses import LocationProgressType
# LW Lost Woods
# OGC Outside Ganon's Castle
# SFM Sacred Forest Meadow
+# TH Thieves' Hideout
# ZD Zora's Domain
# ZF Zora's Fountain
# ZR Zora's River
@@ -247,7 +248,7 @@ hintTable = {
'BossKey': (["a master of unlocking", "a dungeon's master pass"], "a Boss Key", 'item'),
'GanonBossKey': (["a master of unlocking", "a dungeon's master pass"], "a Boss Key", 'item'),
'SmallKey': (["a tool for unlocking", "a dungeon pass", "a lock remover", "a lockpick"], "a Small Key", 'item'),
- 'FortressSmallKey': (["a get out of jail free card"], "a Jail Key", 'item'),
+ 'HideoutSmallKey': (["a get out of jail free card"], "a Jail Key", 'item'),
'KeyError': (["something mysterious", "an unknown treasure"], "An Error (Please Report This)", 'item'),
'Arrows (5)': (["a few danger darts", "a few sharp shafts"], "Arrows (5 pieces)", 'item'),
'Arrows (10)': (["some danger darts", "some sharp shafts"], "Arrows (10 pieces)", 'item'),
@@ -271,7 +272,7 @@ hintTable = {
'KF Links House Cow': ("the #bovine bounty of a horseback hustle# gifts", "#Malon's obstacle course# leads to", 'always'),
'Song from Ocarina of Time': ("the #Ocarina of Time# teaches", None, ['song', 'sometimes']),
- 'Song from Composers Grave': (["#ReDead in the Composers' Grave# guard", "the #Composer Brothers wrote#"], None, ['song', 'sometimes']),
+ 'Song from Royal Familys Tomb': (["#ReDead in the royal tomb# guard", "the #Composer Brothers wrote#"], None, ['song', 'sometimes']),
'Sheik in Forest': ("#in a meadow# Sheik teaches", None, ['song', 'sometimes']),
'Sheik at Temple': ("Sheik waits at a #monument to time# to teach", None, ['song', 'sometimes']),
'Sheik in Crater': ("the #crater's melody# is", None, ['song', 'sometimes']),
@@ -304,7 +305,7 @@ hintTable = {
'ZF GS Hidden Cave': ("a spider high #above the icy waters# holds", None, ['overworld', 'sometimes']),
'Wasteland Chest': (["#deep in the wasteland# is", "beneath #the sands#, flames reveal"], None, ['overworld', 'sometimes']),
'Wasteland GS': ("a #spider in the wasteland# holds", None, ['overworld', 'sometimes']),
- 'Graveyard Composers Grave Chest': (["#flames in the Composers' Grave# reveal", "the #Composer Brothers hid#"], None, ['overworld', 'sometimes']),
+ 'Royal Familys Tomb Chest': (["#flames in the royal tomb# reveal", "the #Composer Brothers hid#"], None, ['overworld', 'sometimes']),
'ZF Bottom Freestanding PoH': ("#under the icy waters# lies", None, ['overworld', 'sometimes']),
'GC Pot Freestanding PoH': ("spinning #Goron pottery# contains", None, ['overworld', 'sometimes']),
'ZD King Zora Thawed': ("a #defrosted dignitary# gifts", "unfreezing #King Zora# grants", ['overworld', 'sometimes']),
@@ -327,10 +328,10 @@ hintTable = {
'Water Temple MQ Freestanding Key': ("hidden in a #box under the lake# lies", "hidden in a #box in the Water Temple# lies", ['dungeon', 'sometimes']),
'Water Temple MQ GS Freestanding Key Area': ("the #locked spider under the lake# holds", "the #locked spider in the Water Temple# holds", ['dungeon', 'sometimes']),
'Water Temple MQ GS Triple Wall Torch': ("a spider behind a #gate under the lake# holds", "a spider behind a #gate in the Water Temple# holds", ['dungeon', 'sometimes']),
- 'Gerudo Training Grounds Underwater Silver Rupee Chest': (["those who seek #sunken silver rupees# will find", "the #thieves' underwater training# rewards"], None, ['dungeon', 'sometimes']),
- 'Gerudo Training Grounds MQ Underwater Silver Rupee Chest': (["those who seek #sunken silver rupees# will find", "the #thieves' underwater training# rewards"], None, ['dungeon', 'sometimes']),
- 'Gerudo Training Grounds Maze Path Final Chest': ("the final prize of #the thieves' training# is", None, ['dungeon', 'sometimes']),
- 'Gerudo Training Grounds MQ Ice Arrows Chest': ("the final prize of #the thieves' training# is", None, ['dungeon', 'sometimes']),
+ 'Gerudo Training Ground Underwater Silver Rupee Chest': (["those who seek #sunken silver rupees# will find", "the #thieves' underwater training# rewards"], None, ['dungeon', 'sometimes']),
+ 'Gerudo Training Ground MQ Underwater Silver Rupee Chest': (["those who seek #sunken silver rupees# will find", "the #thieves' underwater training# rewards"], None, ['dungeon', 'sometimes']),
+ 'Gerudo Training Ground Maze Path Final Chest': ("the final prize of #the thieves' training# is", None, ['dungeon', 'sometimes']),
+ 'Gerudo Training Ground MQ Ice Arrows Chest': ("the final prize of #the thieves' training# is", None, ['dungeon', 'sometimes']),
'Bottom of the Well Lens of Truth Chest': (["the well's #grasping ghoul# hides", "a #nether dweller in the well# holds"], "#Dead Hand in the well# holds", ['dungeon', 'sometimes']),
'Bottom of the Well MQ Compass Chest': (["the well's #grasping ghoul# hides", "a #nether dweller in the well# holds"], "#Dead Hand in the well# holds", ['dungeon', 'sometimes']),
'Spirit Temple Silver Gauntlets Chest': ("the treasure #sought by Nabooru# is", "upon the #Colossus's right hand# is", ['dungeon', 'sometimes']),
@@ -402,7 +403,7 @@ hintTable = {
'LLR Talons Chickens': ("#finding Super Cuccos# is rewarded with", None, 'exclude'),
'GC Rolling Goron as Child': ("the prize offered by a #large rolling Goron# is", None, 'exclude'),
'LH Underwater Item': ("the #sunken treasure in a lake# is", None, 'exclude'),
- 'GF Gerudo Membership Card': ("#rescuing captured carpenters# is rewarded with", None, 'exclude'),
+ 'Hideout Gerudo Membership Card': ("#rescuing captured carpenters# is rewarded with", None, 'exclude'),
'Wasteland Bombchu Salesman': ("a #carpet guru# sells", None, 'exclude'),
'Kak Impas House Freestanding PoH': ("#imprisoned in a house# lies", None, 'exclude'),
@@ -422,10 +423,10 @@ hintTable = {
'DMT Freestanding PoH': ("above a #mountain cavern entrance# is", None, 'exclude'),
'DMC Wall Freestanding PoH': ("nestled in a #volcanic wall# is", None, 'exclude'),
'DMC Volcano Freestanding PoH': ("obscured by #volcanic ash# is", None, 'exclude'),
- 'GF North F1 Carpenter': ("#defeating Gerudo guards# reveals", None, 'exclude'),
- 'GF North F2 Carpenter': ("#defeating Gerudo guards# reveals", None, 'exclude'),
- 'GF South F1 Carpenter': ("#defeating Gerudo guards# reveals", None, 'exclude'),
- 'GF South F2 Carpenter': ("#defeating Gerudo guards# reveals", None, 'exclude'),
+ 'Hideout Jail Guard (1 Torch)': ("#defeating Gerudo guards# reveals", None, 'exclude'),
+ 'Hideout Jail Guard (2 Torches)': ("#defeating Gerudo guards# reveals", None, 'exclude'),
+ 'Hideout Jail Guard (3 Torches)': ("#defeating Gerudo guards# reveals", None, 'exclude'),
+ 'Hideout Jail Guard (4 Torches)': ("#defeating Gerudo guards# reveals", None, 'exclude'),
'Deku Tree Map Chest': ("in the #center of the Deku Tree# lies", None, 'exclude'),
'Deku Tree Slingshot Chest': ("the #treasure guarded by a scrub# in the Deku Tree is", None, 'exclude'),
@@ -641,42 +642,42 @@ hintTable = {
'Ice Cavern MQ Map Chest': ("a #wall of ice# protects", None, 'exclude'),
'Ice Cavern MQ Freestanding PoH': ("#winds of ice# surround", None, 'exclude'),
- 'Gerudo Training Grounds Lobby Left Chest': ("a #blinded eye in the Gerudo Training Grounds# drops", None, 'exclude'),
- 'Gerudo Training Grounds Lobby Right Chest': ("a #blinded eye in the Gerudo Training Grounds# drops", None, 'exclude'),
- 'Gerudo Training Grounds Stalfos Chest': ("#soldiers walking on shifting sands# in the Gerudo Training Grounds guard", None, 'exclude'),
- 'Gerudo Training Grounds Beamos Chest': ("#reptilian warriors# in the Gerudo Training Grounds protect", None, 'exclude'),
- 'Gerudo Training Grounds Hidden Ceiling Chest': ("the #Eye of Truth# in the Gerudo Training Grounds reveals", None, 'exclude'),
- 'Gerudo Training Grounds Maze Path First Chest': ("the first prize of #the thieves' training# is", None, 'exclude'),
- 'Gerudo Training Grounds Maze Path Second Chest': ("the second prize of #the thieves' training# is", None, 'exclude'),
- 'Gerudo Training Grounds Maze Path Third Chest': ("the third prize of #the thieves' training# is", None, 'exclude'),
- 'Gerudo Training Grounds Maze Right Central Chest': ("the #Song of Time# in the Gerudo Training Grounds leads to", None, 'exclude'),
- 'Gerudo Training Grounds Maze Right Side Chest': ("the #Song of Time# in the Gerudo Training Grounds leads to", None, 'exclude'),
- 'Gerudo Training Grounds Hammer Room Clear Chest': ("#fiery foes# in the Gerudo Training Grounds guard", None, 'exclude'),
- 'Gerudo Training Grounds Hammer Room Switch Chest': ("#engulfed in flame# where thieves train lies", None, 'exclude'),
- 'Gerudo Training Grounds Eye Statue Chest': ("thieves #blind four faces# to find", None, 'exclude'),
- 'Gerudo Training Grounds Near Scarecrow Chest': ("thieves #blind four faces# to find", None, 'exclude'),
- 'Gerudo Training Grounds Before Heavy Block Chest': ("#before a block of silver# thieves can find", None, 'exclude'),
- 'Gerudo Training Grounds Heavy Block First Chest': ("a #feat of strength# rewards thieves with", None, 'exclude'),
- 'Gerudo Training Grounds Heavy Block Second Chest': ("a #feat of strength# rewards thieves with", None, 'exclude'),
- 'Gerudo Training Grounds Heavy Block Third Chest': ("a #feat of strength# rewards thieves with", None, 'exclude'),
- 'Gerudo Training Grounds Heavy Block Fourth Chest': ("a #feat of strength# rewards thieves with", None, 'exclude'),
- 'Gerudo Training Grounds Freestanding Key': ("the #Song of Time# in the Gerudo Training Grounds leads to", None, 'exclude'),
+ 'Gerudo Training Ground Lobby Left Chest': ("a #blinded eye in the Gerudo Training Ground# drops", None, 'exclude'),
+ 'Gerudo Training Ground Lobby Right Chest': ("a #blinded eye in the Gerudo Training Ground# drops", None, 'exclude'),
+ 'Gerudo Training Ground Stalfos Chest': ("#soldiers walking on shifting sands# in the Gerudo Training Ground guard", None, 'exclude'),
+ 'Gerudo Training Ground Beamos Chest': ("#reptilian warriors# in the Gerudo Training Ground protect", None, 'exclude'),
+ 'Gerudo Training Ground Hidden Ceiling Chest': ("the #Eye of Truth# in the Gerudo Training Ground reveals", None, 'exclude'),
+ 'Gerudo Training Ground Maze Path First Chest': ("the first prize of #the thieves' training# is", None, 'exclude'),
+ 'Gerudo Training Ground Maze Path Second Chest': ("the second prize of #the thieves' training# is", None, 'exclude'),
+ 'Gerudo Training Ground Maze Path Third Chest': ("the third prize of #the thieves' training# is", None, 'exclude'),
+ 'Gerudo Training Ground Maze Right Central Chest': ("the #Song of Time# in the Gerudo Training Ground leads to", None, 'exclude'),
+ 'Gerudo Training Ground Maze Right Side Chest': ("the #Song of Time# in the Gerudo Training Ground leads to", None, 'exclude'),
+ 'Gerudo Training Ground Hammer Room Clear Chest': ("#fiery foes# in the Gerudo Training Ground guard", None, 'exclude'),
+ 'Gerudo Training Ground Hammer Room Switch Chest': ("#engulfed in flame# where thieves train lies", None, 'exclude'),
+ 'Gerudo Training Ground Eye Statue Chest': ("thieves #blind four faces# to find", None, 'exclude'),
+ 'Gerudo Training Ground Near Scarecrow Chest': ("thieves #blind four faces# to find", None, 'exclude'),
+ 'Gerudo Training Ground Before Heavy Block Chest': ("#before a block of silver# thieves can find", None, 'exclude'),
+ 'Gerudo Training Ground Heavy Block First Chest': ("a #feat of strength# rewards thieves with", None, 'exclude'),
+ 'Gerudo Training Ground Heavy Block Second Chest': ("a #feat of strength# rewards thieves with", None, 'exclude'),
+ 'Gerudo Training Ground Heavy Block Third Chest': ("a #feat of strength# rewards thieves with", None, 'exclude'),
+ 'Gerudo Training Ground Heavy Block Fourth Chest': ("a #feat of strength# rewards thieves with", None, 'exclude'),
+ 'Gerudo Training Ground Freestanding Key': ("the #Song of Time# in the Gerudo Training Ground leads to", None, 'exclude'),
- 'Gerudo Training Grounds MQ Lobby Right Chest': ("#thieves prepare for training# with", None, 'exclude'),
- 'Gerudo Training Grounds MQ Lobby Left Chest': ("#thieves prepare for training# with", None, 'exclude'),
- 'Gerudo Training Grounds MQ First Iron Knuckle Chest': ("#soldiers walking on shifting sands# in the Gerudo Training Grounds guard", None, 'exclude'),
- 'Gerudo Training Grounds MQ Before Heavy Block Chest': ("#before a block of silver# thieves can find", None, 'exclude'),
- 'Gerudo Training Grounds MQ Eye Statue Chest': ("thieves #blind four faces# to find", None, 'exclude'),
- 'Gerudo Training Grounds MQ Flame Circle Chest': ("#engulfed in flame# where thieves train lies", None, 'exclude'),
- 'Gerudo Training Grounds MQ Second Iron Knuckle Chest': ("#fiery foes# in the Gerudo Training Grounds guard", None, 'exclude'),
- 'Gerudo Training Grounds MQ Dinolfos Chest': ("#reptilian warriors# in the Gerudo Training Grounds protect", None, 'exclude'),
- 'Gerudo Training Grounds MQ Maze Right Central Chest': ("a #path of fire# leads thieves to", None, 'exclude'),
- 'Gerudo Training Grounds MQ Maze Path First Chest': ("the first prize of #the thieves' training# is", None, 'exclude'),
- 'Gerudo Training Grounds MQ Maze Right Side Chest': ("a #path of fire# leads thieves to", None, 'exclude'),
- 'Gerudo Training Grounds MQ Maze Path Third Chest': ("the third prize of #the thieves' training# is", None, 'exclude'),
- 'Gerudo Training Grounds MQ Maze Path Second Chest': ("the second prize of #the thieves' training# is", None, 'exclude'),
- 'Gerudo Training Grounds MQ Hidden Ceiling Chest': ("the #Eye of Truth# in the Gerudo Training Grounds reveals", None, 'exclude'),
- 'Gerudo Training Grounds MQ Heavy Block Chest': ("a #feat of strength# rewards thieves with", None, 'exclude'),
+ 'Gerudo Training Ground MQ Lobby Right Chest': ("#thieves prepare for training# with", None, 'exclude'),
+ 'Gerudo Training Ground MQ Lobby Left Chest': ("#thieves prepare for training# with", None, 'exclude'),
+ 'Gerudo Training Ground MQ First Iron Knuckle Chest': ("#soldiers walking on shifting sands# in the Gerudo Training Ground guard", None, 'exclude'),
+ 'Gerudo Training Ground MQ Before Heavy Block Chest': ("#before a block of silver# thieves can find", None, 'exclude'),
+ 'Gerudo Training Ground MQ Eye Statue Chest': ("thieves #blind four faces# to find", None, 'exclude'),
+ 'Gerudo Training Ground MQ Flame Circle Chest': ("#engulfed in flame# where thieves train lies", None, 'exclude'),
+ 'Gerudo Training Ground MQ Second Iron Knuckle Chest': ("#fiery foes# in the Gerudo Training Ground guard", None, 'exclude'),
+ 'Gerudo Training Ground MQ Dinolfos Chest': ("#reptilian warriors# in the Gerudo Training Ground protect", None, 'exclude'),
+ 'Gerudo Training Ground MQ Maze Right Central Chest': ("a #path of fire# leads thieves to", None, 'exclude'),
+ 'Gerudo Training Ground MQ Maze Path First Chest': ("the first prize of #the thieves' training# is", None, 'exclude'),
+ 'Gerudo Training Ground MQ Maze Right Side Chest': ("a #path of fire# leads thieves to", None, 'exclude'),
+ 'Gerudo Training Ground MQ Maze Path Third Chest': ("the third prize of #the thieves' training# is", None, 'exclude'),
+ 'Gerudo Training Ground MQ Maze Path Second Chest': ("the second prize of #the thieves' training# is", None, 'exclude'),
+ 'Gerudo Training Ground MQ Hidden Ceiling Chest': ("the #Eye of Truth# in the Gerudo Training Ground reveals", None, 'exclude'),
+ 'Gerudo Training Ground MQ Heavy Block Chest': ("a #feat of strength# rewards thieves with", None, 'exclude'),
'Ganons Tower Boss Key Chest': ("the #Evil King# hoards", None, 'exclude'),
@@ -1038,7 +1039,7 @@ hintTable = {
'GV Fortress Side -> GV Carpenter Tent': ("a #tent in the valley# covers", None, 'entrance'),
'Graveyard Warp Pad Region -> Shadow Temple Entryway': ("at the #back of the Graveyard#, there is", None, 'entrance'),
'Lake Hylia -> Water Temple Lobby': ("deep #under a vast lake#, one can find", None, 'entrance'),
- 'Gerudo Fortress -> Gerudo Training Grounds Lobby': ("paying a #fee to the Gerudos# grants access to", None, 'entrance'),
+ 'Gerudo Fortress -> Gerudo Training Ground Lobby': ("paying a #fee to the Gerudos# grants access to", None, 'entrance'),
'Zoras Fountain -> Jabu Jabus Belly Beginning': ("inside #Jabu Jabu#, one can find", None, 'entrance'),
'Kakariko Village -> Bottom of the Well': ("a #village well# leads to", None, 'entrance'),
@@ -1085,7 +1086,7 @@ hintTable = {
'ZF Great Fairy Fountain': ("a #Great Fairy Fountain#", None, 'region'),
'Graveyard Shield Grave': ("a #grave with a free chest#", None, 'region'),
'Graveyard Heart Piece Grave': ("a chest spawned by #Sun's Song#", None, 'region'),
- 'Graveyard Composers Grave': ("the #Composers' Grave#", None, 'region'),
+ 'Royal Familys Tomb': ("the #Royal Family's Tomb#", None, 'region'),
'Graveyard Dampes Grave': ("Dampé's Grave", None, 'region'),
'DMT Cow Grotto': ("a solitary #Cow#", None, 'region'),
'HC Storms Grotto': ("a sandy grotto with #fragile walls#", None, 'region'),
@@ -1198,7 +1199,7 @@ hintTable = {
'Spirit Temple': ("the goddess of the sand", "Spirit Temple", 'dungeonName'),
'Ice Cavern': ("a frozen maze", "Ice Cavern", 'dungeonName'),
'Bottom of the Well': ("a shadow\'s prison", "Bottom of the Well", 'dungeonName'),
- 'Gerudo Training Grounds': ("the test of thieves", "Gerudo Training Grounds", 'dungeonName'),
+ 'Gerudo Training Ground': ("the test of thieves", "Gerudo Training Ground", 'dungeonName'),
'Ganons Castle': ("a conquered citadel", "Inside Ganon's Castle", 'dungeonName'),
'Queen Gohma': ("One inside an #ancient tree#...", "One in the #Deku Tree#...", 'boss'),
diff --git a/worlds/oot/Hints.py b/worlds/oot/Hints.py
index 0f28ca9c1a..4250c5590e 100644
--- a/worlds/oot/Hints.py
+++ b/worlds/oot/Hints.py
@@ -636,7 +636,7 @@ def buildWorldGossipHints(world, checkedLocations=None):
world.woth_dungeon = 0
if checkedLocations is None:
- checkedLocations = {player: set() for player in world.world.player_ids}
+ checkedLocations = {player: set() for player in world.world.get_all_ids()}
# If Ganondorf hints Light Arrows and is reachable without them, add to checkedLocations to prevent extra hinting
# Can only be forced with vanilla bridge or trials
diff --git a/worlds/oot/ItemPool.py b/worlds/oot/ItemPool.py
index d4b77f074b..24dda8e24f 100644
--- a/worlds/oot/ItemPool.py
+++ b/worlds/oot/ItemPool.py
@@ -570,15 +570,15 @@ vanillaSK = {
'Forest Temple Well Chest': 'Small Key (Forest Temple)',
'Ganons Castle Light Trial Invisible Enemies Chest': 'Small Key (Ganons Castle)',
'Ganons Castle Light Trial Lullaby Chest': 'Small Key (Ganons Castle)',
- 'Gerudo Training Grounds Beamos Chest': 'Small Key (Gerudo Training Grounds)',
- 'Gerudo Training Grounds Eye Statue Chest': 'Small Key (Gerudo Training Grounds)',
- 'Gerudo Training Grounds Hammer Room Switch Chest': 'Small Key (Gerudo Training Grounds)',
- 'Gerudo Training Grounds Heavy Block Third Chest': 'Small Key (Gerudo Training Grounds)',
- 'Gerudo Training Grounds Hidden Ceiling Chest': 'Small Key (Gerudo Training Grounds)',
- 'Gerudo Training Grounds Near Scarecrow Chest': 'Small Key (Gerudo Training Grounds)',
- 'Gerudo Training Grounds Stalfos Chest': 'Small Key (Gerudo Training Grounds)',
- 'Gerudo Training Grounds Underwater Silver Rupee Chest': 'Small Key (Gerudo Training Grounds)',
- 'Gerudo Training Grounds Freestanding Key': 'Small Key (Gerudo Training Grounds)',
+ 'Gerudo Training Ground Beamos Chest': 'Small Key (Gerudo Training Ground)',
+ 'Gerudo Training Ground Eye Statue Chest': 'Small Key (Gerudo Training Ground)',
+ 'Gerudo Training Ground Hammer Room Switch Chest': 'Small Key (Gerudo Training Ground)',
+ 'Gerudo Training Ground Heavy Block Third Chest': 'Small Key (Gerudo Training Ground)',
+ 'Gerudo Training Ground Hidden Ceiling Chest': 'Small Key (Gerudo Training Ground)',
+ 'Gerudo Training Ground Near Scarecrow Chest': 'Small Key (Gerudo Training Ground)',
+ 'Gerudo Training Ground Stalfos Chest': 'Small Key (Gerudo Training Ground)',
+ 'Gerudo Training Ground Underwater Silver Rupee Chest': 'Small Key (Gerudo Training Ground)',
+ 'Gerudo Training Ground Freestanding Key': 'Small Key (Gerudo Training Ground)',
'Shadow Temple After Wind Hidden Chest': 'Small Key (Shadow Temple)',
'Shadow Temple Early Silver Rupee Chest': 'Small Key (Shadow Temple)',
'Shadow Temple Falling Spikes Switch Chest': 'Small Key (Shadow Temple)',
@@ -612,9 +612,9 @@ vanillaSK = {
'Ganons Castle MQ Shadow Trial Eye Switch Chest': 'Small Key (Ganons Castle)',
'Ganons Castle MQ Spirit Trial Sun Back Left Chest': 'Small Key (Ganons Castle)',
'Ganons Castle MQ Forest Trial Freestanding Key': 'Small Key (Ganons Castle)',
- 'Gerudo Training Grounds MQ Dinolfos Chest': 'Small Key (Gerudo Training Grounds)',
- 'Gerudo Training Grounds MQ Flame Circle Chest': 'Small Key (Gerudo Training Grounds)',
- 'Gerudo Training Grounds MQ Underwater Silver Rupee Chest': 'Small Key (Gerudo Training Grounds)',
+ 'Gerudo Training Ground MQ Dinolfos Chest': 'Small Key (Gerudo Training Ground)',
+ 'Gerudo Training Ground MQ Flame Circle Chest': 'Small Key (Gerudo Training Ground)',
+ 'Gerudo Training Ground MQ Underwater Silver Rupee Chest': 'Small Key (Gerudo Training Ground)',
'Shadow Temple MQ Falling Spikes Switch Chest': 'Small Key (Shadow Temple)',
'Shadow Temple MQ Invisible Blades Invisible Chest': 'Small Key (Shadow Temple)',
'Shadow Temple MQ Early Gibdos Chest': 'Small Key (Shadow Temple)',
@@ -1031,7 +1031,7 @@ def get_pool_core(world):
pool.extend(['Bombchus'] * 2)
if not world.dungeon_mq['Bottom of the Well']:
pool.extend(['Bombchus'])
- if world.dungeon_mq['Gerudo Training Grounds']:
+ if world.dungeon_mq['Gerudo Training Ground']:
pool.extend(['Bombchus'])
if world.shuffle_medigoron_carpet_salesman:
pool.append('Bombchus')
@@ -1044,7 +1044,7 @@ def get_pool_core(world):
pool.extend(['Bombchus (10)'] * 2)
if not world.dungeon_mq['Bottom of the Well']:
pool.extend(['Bombchus (10)'])
- if world.dungeon_mq['Gerudo Training Grounds']:
+ if world.dungeon_mq['Gerudo Training Ground']:
pool.extend(['Bombchus (10)'])
if world.dungeon_mq['Ganons Castle']:
pool.extend(['Bombchus (10)'])
@@ -1058,49 +1058,49 @@ def get_pool_core(world):
skip_in_spoiler_locations.append('Wasteland Bombchu Salesman')
pool.extend(['Ice Trap'])
- if not world.dungeon_mq['Gerudo Training Grounds']:
+ if not world.dungeon_mq['Gerudo Training Ground']:
pool.extend(['Ice Trap'])
if not world.dungeon_mq['Ganons Castle']:
pool.extend(['Ice Trap'] * 4)
if world.gerudo_fortress == 'open':
- placed_items['GF North F1 Carpenter'] = 'Recovery Heart'
- placed_items['GF North F2 Carpenter'] = 'Recovery Heart'
- placed_items['GF South F1 Carpenter'] = 'Recovery Heart'
- placed_items['GF South F2 Carpenter'] = 'Recovery Heart'
- skip_in_spoiler_locations.extend(['GF North F1 Carpenter', 'GF North F2 Carpenter', 'GF South F1 Carpenter', 'GF South F2 Carpenter'])
+ placed_items['Hideout Jail Guard (1 Torch)'] = 'Recovery Heart'
+ placed_items['Hideout Jail Guard (2 Torches)'] = 'Recovery Heart'
+ placed_items['Hideout Jail Guard (3 Torches)'] = 'Recovery Heart'
+ placed_items['Hideout Jail Guard (4 Torches)'] = 'Recovery Heart'
+ skip_in_spoiler_locations.extend(['Hideout Jail Guard (1 Torch)', 'Hideout Jail Guard (2 Torches)', 'Hideout Jail Guard (3 Torches)', 'Hideout Jail Guard (4 Torches)'])
elif world.shuffle_fortresskeys in ['any_dungeon', 'overworld', 'keysanity']:
if world.gerudo_fortress == 'fast':
- pool.append('Small Key (Gerudo Fortress)')
- placed_items['GF North F2 Carpenter'] = 'Recovery Heart'
- placed_items['GF South F1 Carpenter'] = 'Recovery Heart'
- placed_items['GF South F2 Carpenter'] = 'Recovery Heart'
- skip_in_spoiler_locations.extend(['GF North F2 Carpenter', 'GF South F1 Carpenter', 'GF South F2 Carpenter'])
+ pool.append('Small Key (Thieves Hideout)')
+ placed_items['Hideout Jail Guard (2 Torches)'] = 'Recovery Heart'
+ placed_items['Hideout Jail Guard (3 Torches)'] = 'Recovery Heart'
+ placed_items['Hideout Jail Guard (4 Torches)'] = 'Recovery Heart'
+ skip_in_spoiler_locations.extend(['Hideout Jail Guard (2 Torches)', 'Hideout Jail Guard (3 Torches)', 'Hideout Jail Guard (4 Torches)'])
else:
- pool.extend(['Small Key (Gerudo Fortress)'] * 4)
+ pool.extend(['Small Key (Thieves Hideout)'] * 4)
if world.item_pool_value == 'plentiful':
- pending_junk_pool.append('Small Key (Gerudo Fortress)')
+ pending_junk_pool.append('Small Key (Thieves Hideout)')
else:
if world.gerudo_fortress == 'fast':
- placed_items['GF North F1 Carpenter'] = 'Small Key (Gerudo Fortress)'
- placed_items['GF North F2 Carpenter'] = 'Recovery Heart'
- placed_items['GF South F1 Carpenter'] = 'Recovery Heart'
- placed_items['GF South F2 Carpenter'] = 'Recovery Heart'
- skip_in_spoiler_locations.extend(['GF North F2 Carpenter', 'GF South F1 Carpenter', 'GF South F2 Carpenter'])
+ placed_items['Hideout Jail Guard (1 Torch)'] = 'Small Key (Thieves Hideout)'
+ placed_items['Hideout Jail Guard (2 Torches)'] = 'Recovery Heart'
+ placed_items['Hideout Jail Guard (3 Torches)'] = 'Recovery Heart'
+ placed_items['Hideout Jail Guard (4 Torches)'] = 'Recovery Heart'
+ skip_in_spoiler_locations.extend(['Hideout Jail Guard (2 Torches)', 'Hideout Jail Guard (3 Torches)', 'Hideout Jail Guard (4 Torches)'])
else:
- placed_items['GF North F1 Carpenter'] = 'Small Key (Gerudo Fortress)'
- placed_items['GF North F2 Carpenter'] = 'Small Key (Gerudo Fortress)'
- placed_items['GF South F1 Carpenter'] = 'Small Key (Gerudo Fortress)'
- placed_items['GF South F2 Carpenter'] = 'Small Key (Gerudo Fortress)'
+ placed_items['Hideout Jail Guard (1 Torch)'] = 'Small Key (Gerudo Fortress)'
+ placed_items['Hideout Jail Guard (2 Torches)'] = 'Small Key (Gerudo Fortress)'
+ placed_items['Hideout Jail Guard (3 Torches)'] = 'Small Key (Gerudo Fortress)'
+ placed_items['Hideout Jail Guard (4 Torches)'] = 'Small Key (Gerudo Fortress)'
if world.shuffle_gerudo_card and world.gerudo_fortress != 'open':
pool.append('Gerudo Membership Card')
elif world.shuffle_gerudo_card:
pending_junk_pool.append('Gerudo Membership Card')
- placed_items['GF Gerudo Membership Card'] = 'Ice Trap'
- skip_in_spoiler_locations.append('GF Gerudo Membership Card')
+ placed_items['Hideout Gerudo Membership Card'] = 'Ice Trap'
+ skip_in_spoiler_locations.append('Hideout Gerudo Membership Card')
else:
- placed_items['GF Gerudo Membership Card'] = 'Gerudo Membership Card'
+ placed_items['Hideout Gerudo Membership Card'] = 'Gerudo Membership Card'
if world.shuffle_gerudo_card and world.item_pool_value == 'plentiful':
pending_junk_pool.append('Gerudo Membership Card')
@@ -1111,7 +1111,7 @@ def get_pool_core(world):
pending_junk_pool.append('Small Key (Water Temple)')
pending_junk_pool.append('Small Key (Shadow Temple)')
pending_junk_pool.append('Small Key (Spirit Temple)')
- pending_junk_pool.append('Small Key (Gerudo Training Grounds)')
+ pending_junk_pool.append('Small Key (Gerudo Training Ground)')
pending_junk_pool.append('Small Key (Ganons Castle)')
if world.item_pool_value == 'plentiful' and world.shuffle_bosskeys in ['any_dungeon', 'overworld', 'keysanity']:
@@ -1250,7 +1250,7 @@ def get_pool_core(world):
pool.extend(ShT_vanilla)
if not world.dungeon_mq['Bottom of the Well']:
pool.extend(BW_vanilla)
- if world.dungeon_mq['Gerudo Training Grounds']:
+ if world.dungeon_mq['Gerudo Training Ground']:
pool.extend(GTG_MQ)
else:
pool.extend(GTG_vanilla)
diff --git a/worlds/oot/Items.py b/worlds/oot/Items.py
index 964137f868..9cf16424d7 100644
--- a/worlds/oot/Items.py
+++ b/worlds/oot/Items.py
@@ -6,7 +6,7 @@ def oot_data_to_ap_id(data, event):
if event or data[2] is None or data[0] == 'Shop':
return None
offset = 66000
- if data[0] in ['Item', 'BossKey', 'Compass', 'Map', 'SmallKey', 'Token', 'GanonBossKey', 'FortressSmallKey', 'Song']:
+ if data[0] in ['Item', 'BossKey', 'Compass', 'Map', 'SmallKey', 'Token', 'GanonBossKey', 'HideoutSmallKey', 'Song']:
return offset + data[2]
else:
raise Exception(f'Unexpected OOT item type found: {data[0]}')
@@ -53,7 +53,7 @@ class OOTItem(Item):
@property
def dungeonitem(self) -> bool:
- return self.type in ['SmallKey', 'FortressSmallKey', 'BossKey', 'GanonBossKey', 'Map', 'Compass']
+ return self.type in ['SmallKey', 'HideoutSmallKey', 'BossKey', 'GanonBossKey', 'Map', 'Compass']
@@ -193,8 +193,8 @@ item_table = {
'Small Key (Spirit Temple)': ('SmallKey', True, 0xB2, {'progressive': float('Inf')}),
'Small Key (Shadow Temple)': ('SmallKey', True, 0xB3, {'progressive': float('Inf')}),
'Small Key (Bottom of the Well)': ('SmallKey', True, 0xB4, {'progressive': float('Inf')}),
- 'Small Key (Gerudo Training Grounds)': ('SmallKey',True, 0xB5, {'progressive': float('Inf')}),
- 'Small Key (Gerudo Fortress)': ('FortressSmallKey',True, 0xB6, {'progressive': float('Inf')}),
+ 'Small Key (Gerudo Training Ground)': ('SmallKey',True, 0xB5, {'progressive': float('Inf')}),
+ 'Small Key (Thieves Hideout)': ('HideoutSmallKey',True, 0xB6, {'progressive': float('Inf')}),
'Small Key (Ganons Castle)': ('SmallKey', True, 0xB7, {'progressive': float('Inf')}),
'Double Defense': ('Item', True, 0xB8, None),
'Magic Bean Pack': ('Item', True, 0xC9, None),
diff --git a/worlds/oot/LocationList.py b/worlds/oot/LocationList.py
index e487522fc3..829ec70262 100644
--- a/worlds/oot/LocationList.py
+++ b/worlds/oot/LocationList.py
@@ -19,6 +19,7 @@ def shop_address(shop_id, shelf_id):
# LW Lost Woods
# OGC Outside Ganon's Castle
# SFM Sacred Forest Meadow
+# TH Thieves' Hideout
# ToT Temple of Time
# ZD Zora's Domain
# ZF Zora's Fountain
@@ -52,7 +53,7 @@ location_table = OrderedDict([
("Song from Impa", ("Song", 0xFF, 0x26, (0x2E8E925, 0x2E8E925), 'Zeldas Lullaby', ("Hyrule Castle", "Market", "Songs"))),
("Song from Malon", ("Song", 0xFF, 0x27, (0x0D7EB53, 0x0D7EBCF), 'Eponas Song', ("Lon Lon Ranch", "Songs",))),
("Song from Saria", ("Song", 0xFF, 0x28, (0x20B1DB1, 0x20B1DB1), 'Sarias Song', ("Sacred Forest Meadow", "Forest", "Songs"))),
- ("Song from Composers Grave", ("Song", 0xFF, 0x29, (0x332A871, 0x332A871), 'Suns Song', ("the Graveyard", "Kakariko", "Songs"))),
+ ("Song from Royal Familys Tomb", ("Song", 0xFF, 0x29, (0x332A871, 0x332A871), 'Suns Song', ("the Graveyard", "Kakariko", "Songs"))),
("Song from Ocarina of Time", ("Song", 0xFF, 0x2A, (0x252FC89, 0x252FC89), 'Song of Time', ("Hyrule Field", "Songs", "Need Spiritual Stones"))),
("Song from Windmill", ("Song", 0xFF, 0x2B, (0x0E42C07, 0x0E42B8B), 'Song of Storms', ("Kakariko Village", "Kakariko", "Songs"))),
("Sheik in Forest", ("Song", 0xFF, 0x20, (0x20B0809, 0x20B0809), 'Minuet of Forest', ("Sacred Forest Meadow", "Forest", "Songs"))),
@@ -70,7 +71,7 @@ location_table = OrderedDict([
("KF Midos Bottom Right Chest", ("Chest", 0x28, 0x03, None, 'Recovery Heart', ("Kokiri Forest", "Forest",))),
("KF Kokiri Sword Chest", ("Chest", 0x55, 0x00, None, 'Kokiri Sword', ("Kokiri Forest", "Forest",))),
("KF Storms Grotto Chest", ("Chest", 0x3E, 0x0C, None, 'Rupees (20)', ("Kokiri Forest", "Forest", "Grottos"))),
- ("KF Links House Cow", ("NPC", 0x34, 0x15, None, 'Milk', ("KF Links House", "Forest", "Cow", "Minigames"))),
+ ("KF Links House Cow", ("NPC", 0x34, 0x15, None, 'Milk', ("Kokiri Forest", "Forest", "Cow", "Minigames"))),
("KF GS Know It All House", ("GS Token", 0x0C, 0x02, None, 'Gold Skulltula Token', ("Kokiri Forest", "Skulltulas",))),
("KF GS Bean Patch", ("GS Token", 0x0C, 0x01, None, 'Gold Skulltula Token', ("Kokiri Forest", "Skulltulas",))),
("KF GS House of Twins", ("GS Token", 0x0C, 0x04, None, 'Gold Skulltula Token', ("Kokiri Forest", "Skulltulas",))),
@@ -163,7 +164,7 @@ location_table = OrderedDict([
("HC GS Storms Grotto", ("GS Token", 0x0E, 0x02, None, 'Gold Skulltula Token', ("Hyrule Castle", "Skulltulas", "Grottos"))),
# Lon Lon Ranch
- ("LLR Talons Chickens", ("NPC", 0x4C, 0x14, None, 'Bottle with Milk', ("Lon Lon Ranch", "Kakariko", "Minigames"))),
+ ("LLR Talons Chickens", ("NPC", 0x4C, 0x14, None, 'Bottle with Milk', ("Lon Lon Ranch", "Minigames"))),
("LLR Freestanding PoH", ("Collectable", 0x4C, 0x01, None, 'Piece of Heart', ("Lon Lon Ranch",))),
("LLR Deku Scrub Grotto Left", ("GrottoNPC", 0xFC, 0x30, None, 'Buy Deku Nut (5)', ("Lon Lon Ranch", "Deku Scrub", "Grottos"))),
("LLR Deku Scrub Grotto Center", ("GrottoNPC", 0xFC, 0x33, None, 'Buy Deku Seeds (30)', ("Lon Lon Ranch", "Deku Scrub", "Grottos"))),
@@ -218,7 +219,7 @@ location_table = OrderedDict([
# Graveyard
("Graveyard Shield Grave Chest", ("Chest", 0x40, 0x00, None, 'Hylian Shield', ("the Graveyard", "Kakariko",))),
("Graveyard Heart Piece Grave Chest", ("Chest", 0x3F, 0x00, None, 'Piece of Heart', ("the Graveyard", "Kakariko",))),
- ("Graveyard Composers Grave Chest", ("Chest", 0x41, 0x00, None, 'Bombs (5)', ("the Graveyard", "Kakariko",))),
+ ("Graveyard Royal Familys Tomb Chest", ("Chest", 0x41, 0x00, None, 'Bombs (5)', ("the Graveyard", "Kakariko",))),
("Graveyard Freestanding PoH", ("Collectable", 0x53, 0x04, None, 'Piece of Heart', ("the Graveyard", "Kakariko",))),
("Graveyard Dampe Gravedigging Tour", ("Collectable", 0x53, 0x08, None, 'Piece of Heart', ("the Graveyard", "Kakariko",))),
("Graveyard Hookshot Chest", ("Chest", 0x48, 0x00, None, 'Progressive Hookshot', ("the Graveyard", "Kakariko",))),
@@ -337,12 +338,14 @@ location_table = OrderedDict([
("GV GS Behind Tent", ("GS Token", 0x13, 0x08, None, 'Gold Skulltula Token', ("Gerudo Valley", "Skulltulas",))),
("GV GS Pillar", ("GS Token", 0x13, 0x04, None, 'Gold Skulltula Token', ("Gerudo Valley", "Skulltulas",))),
+ # Thieves' Hideout
+ ("Hideout Jail Guard (1 Torch)", ("Collectable", 0x0C, 0x0C, None, 'Small Key (Thieves Hideout)', ("Thieves' Hideout", "Gerudo",))),
+ ("Hideout Jail Guard (2 Torches)", ("Collectable", 0x0C, 0x0F, None, 'Small Key (Thieves Hideout)', ("Thieves' Hideout", "Gerudo",))),
+ ("Hideout Jail Guard (3 Torches)", ("Collectable", 0x0C, 0x0A, None, 'Small Key (Thieves Hideout)', ("Thieves' Hideout", "Gerudo",))),
+ ("Hideout Jail Guard (4 Torches)", ("Collectable", 0x0C, 0x0E, None, 'Small Key (Thieves Hideout)', ("Thieves' Hideout", "Gerudo",))),
+ ("Hideout Gerudo Membership Card", ("NPC", 0x0C, 0x3A, None, 'Gerudo Membership Card', ("Thieves' Hideout", "Gerudo",))),
+
# Gerudo's Fortress
- ("GF North F1 Carpenter", ("Collectable", 0x0C, 0x0C, None, 'Small Key (Gerudo Fortress)', ("Gerudo's Fortress", "Gerudo",))),
- ("GF North F2 Carpenter", ("Collectable", 0x0C, 0x0A, None, 'Small Key (Gerudo Fortress)', ("Gerudo's Fortress", "Gerudo",))),
- ("GF South F1 Carpenter", ("Collectable", 0x0C, 0x0E, None, 'Small Key (Gerudo Fortress)', ("Gerudo's Fortress", "Gerudo",))),
- ("GF South F2 Carpenter", ("Collectable", 0x0C, 0x0F, None, 'Small Key (Gerudo Fortress)', ("Gerudo's Fortress", "Gerudo",))),
- ("GF Gerudo Membership Card", ("NPC", 0x0C, 0x3A, None, 'Gerudo Membership Card', ("Gerudo's Fortress", "Gerudo",))),
("GF Chest", ("Chest", 0x5D, 0x00, None, 'Piece of Heart', ("Gerudo's Fortress", "Gerudo",))),
("GF HBA 1000 Points", ("NPC", 0x5D, 0x3E, None, 'Piece of Heart', ("Gerudo's Fortress", "Gerudo", "Minigames"))),
("GF HBA 1500 Points", ("NPC", 0x5D, 0x30, None, 'Bow', ("Gerudo's Fortress", "Gerudo", "Minigames"))),
@@ -364,8 +367,8 @@ location_table = OrderedDict([
("Colossus GS Hill", ("GS Token", 0x15, 0x04, None, 'Gold Skulltula Token', ("Desert Colossus", "Skulltulas",))),
# Outside Ganon's Castle
- ("OGC Great Fairy Reward", ("Cutscene", 0xFF, 0x15, None, 'Double Defense', ("outside Ganon's Castle", "Market", "Fairies"))),
- ("OGC GS", ("GS Token", 0x0E, 0x01, None, 'Gold Skulltula Token', ("outside Ganon's Castle", "Skulltulas",))),
+ ("OGC Great Fairy Reward", ("Cutscene", 0xFF, 0x15, None, 'Double Defense', ("Outside Ganon's Castle", "Market", "Fairies"))),
+ ("OGC GS", ("GS Token", 0x0E, 0x01, None, 'Gold Skulltula Token', ("Outside Ganon's Castle", "Skulltulas",))),
## Dungeons
# Deku Tree vanilla
@@ -725,47 +728,47 @@ location_table = OrderedDict([
("Ice Cavern MQ GS Ice Block", ("GS Token", 0x09, 0x04, None, 'Gold Skulltula Token', ("Ice Cavern", "Master Quest", "Skulltulas",))),
("Ice Cavern MQ GS Scarecrow", ("GS Token", 0x09, 0x01, None, 'Gold Skulltula Token', ("Ice Cavern", "Master Quest", "Skulltulas",))),
- # Gerudo Training Grounds vanilla
- ("Gerudo Training Grounds Lobby Left Chest", ("Chest", 0x0B, 0x13, None, 'Rupees (5)', ("Gerudo Training Grounds", "Vanilla",))),
- ("Gerudo Training Grounds Lobby Right Chest", ("Chest", 0x0B, 0x07, None, 'Arrows (10)', ("Gerudo Training Grounds", "Vanilla",))),
- ("Gerudo Training Grounds Stalfos Chest", ("Chest", 0x0B, 0x00, None, 'Small Key (Gerudo Training Grounds)', ("Gerudo Training Grounds", "Vanilla",))),
- ("Gerudo Training Grounds Before Heavy Block Chest", ("Chest", 0x0B, 0x11, None, 'Arrows (30)', ("Gerudo Training Grounds", "Vanilla",))),
- ("Gerudo Training Grounds Heavy Block First Chest", ("Chest", 0x0B, 0x0F, None, 'Rupees (200)', ("Gerudo Training Grounds", "Vanilla",))),
- ("Gerudo Training Grounds Heavy Block Second Chest", ("Chest", 0x0B, 0x0E, None, 'Rupees (5)', ("Gerudo Training Grounds", "Vanilla",))),
- ("Gerudo Training Grounds Heavy Block Third Chest", ("Chest", 0x0B, 0x14, None, 'Small Key (Gerudo Training Grounds)', ("Gerudo Training Grounds", "Vanilla",))),
- ("Gerudo Training Grounds Heavy Block Fourth Chest", ("Chest", 0x0B, 0x02, None, 'Ice Trap', ("Gerudo Training Grounds", "Vanilla",))),
- ("Gerudo Training Grounds Eye Statue Chest", ("Chest", 0x0B, 0x03, None, 'Small Key (Gerudo Training Grounds)', ("Gerudo Training Grounds", "Vanilla",))),
- ("Gerudo Training Grounds Near Scarecrow Chest", ("Chest", 0x0B, 0x04, None, 'Small Key (Gerudo Training Grounds)', ("Gerudo Training Grounds", "Vanilla",))),
- ("Gerudo Training Grounds Hammer Room Clear Chest", ("Chest", 0x0B, 0x12, None, 'Arrows (10)', ("Gerudo Training Grounds", "Vanilla",))),
- ("Gerudo Training Grounds Hammer Room Switch Chest", ("Chest", 0x0B, 0x10, None, 'Small Key (Gerudo Training Grounds)', ("Gerudo Training Grounds", "Vanilla",))),
- ("Gerudo Training Grounds Freestanding Key", ("Collectable", 0x0B, 0x01, None, 'Small Key (Gerudo Training Grounds)', ("Gerudo Training Grounds", "Vanilla",))),
- ("Gerudo Training Grounds Maze Right Central Chest", ("Chest", 0x0B, 0x05, None, 'Bombchus (5)', ("Gerudo Training Grounds", "Vanilla",))),
- ("Gerudo Training Grounds Maze Right Side Chest", ("Chest", 0x0B, 0x08, None, 'Arrows (30)', ("Gerudo Training Grounds", "Vanilla",))),
- ("Gerudo Training Grounds Underwater Silver Rupee Chest", ("Chest", 0x0B, 0x0D, None, 'Small Key (Gerudo Training Grounds)', ("Gerudo Training Grounds", "Vanilla",))),
- ("Gerudo Training Grounds Beamos Chest", ("Chest", 0x0B, 0x01, None, 'Small Key (Gerudo Training Grounds)', ("Gerudo Training Grounds", "Vanilla",))),
- ("Gerudo Training Grounds Hidden Ceiling Chest", ("Chest", 0x0B, 0x0B, None, 'Small Key (Gerudo Training Grounds)', ("Gerudo Training Grounds", "Vanilla",))),
- ("Gerudo Training Grounds Maze Path First Chest", ("Chest", 0x0B, 0x06, None, 'Rupees (50)', ("Gerudo Training Grounds", "Vanilla",))),
- ("Gerudo Training Grounds Maze Path Second Chest", ("Chest", 0x0B, 0x0A, None, 'Rupees (20)', ("Gerudo Training Grounds", "Vanilla",))),
- ("Gerudo Training Grounds Maze Path Third Chest", ("Chest", 0x0B, 0x09, None, 'Arrows (30)', ("Gerudo Training Grounds", "Vanilla",))),
- ("Gerudo Training Grounds Maze Path Final Chest", ("Chest", 0x0B, 0x0C, None, 'Ice Arrows', ("Gerudo Training Grounds", "Vanilla",))),
- # Gerudo Training Grounds MQ
- ("Gerudo Training Grounds MQ Lobby Left Chest", ("Chest", 0x0B, 0x13, None, 'Arrows (10)', ("Gerudo Training Grounds", "Master Quest",))),
- ("Gerudo Training Grounds MQ Lobby Right Chest", ("Chest", 0x0B, 0x07, None, 'Bombchus (5)', ("Gerudo Training Grounds", "Master Quest",))),
- ("Gerudo Training Grounds MQ First Iron Knuckle Chest", ("Chest", 0x0B, 0x00, None, 'Rupees (5)', ("Gerudo Training Grounds", "Master Quest",))),
- ("Gerudo Training Grounds MQ Before Heavy Block Chest", ("Chest", 0x0B, 0x11, None, 'Arrows (10)', ("Gerudo Training Grounds", "Master Quest",))),
- ("Gerudo Training Grounds MQ Heavy Block Chest", ("Chest", 0x0B, 0x02, None, 'Rupees (50)', ("Gerudo Training Grounds", "Master Quest",))),
- ("Gerudo Training Grounds MQ Eye Statue Chest", ("Chest", 0x0B, 0x03, None, 'Bombchus (10)', ("Gerudo Training Grounds", "Master Quest",))),
- ("Gerudo Training Grounds MQ Ice Arrows Chest", ("Chest", 0x0B, 0x04, None, 'Ice Arrows', ("Gerudo Training Grounds", "Master Quest",))),
- ("Gerudo Training Grounds MQ Second Iron Knuckle Chest", ("Chest", 0x0B, 0x12, None, 'Arrows (10)', ("Gerudo Training Grounds", "Master Quest",))),
- ("Gerudo Training Grounds MQ Flame Circle Chest", ("Chest", 0x0B, 0x0E, None, 'Small Key (Gerudo Training Grounds)', ("Gerudo Training Grounds", "Master Quest",))),
- ("Gerudo Training Grounds MQ Maze Right Central Chest", ("Chest", 0x0B, 0x05, None, 'Rupees (5)', ("Gerudo Training Grounds", "Master Quest",))),
- ("Gerudo Training Grounds MQ Maze Right Side Chest", ("Chest", 0x0B, 0x08, None, 'Rupee (Treasure Chest Game)', ("Gerudo Training Grounds", "Master Quest",))),
- ("Gerudo Training Grounds MQ Underwater Silver Rupee Chest", ("Chest", 0x0B, 0x0D, None, 'Small Key (Gerudo Training Grounds)', ("Gerudo Training Grounds", "Master Quest",))),
- ("Gerudo Training Grounds MQ Dinolfos Chest", ("Chest", 0x0B, 0x01, None, 'Small Key (Gerudo Training Grounds)', ("Gerudo Training Grounds", "Master Quest",))),
- ("Gerudo Training Grounds MQ Hidden Ceiling Chest", ("Chest", 0x0B, 0x0B, None, 'Rupees (50)', ("Gerudo Training Grounds", "Master Quest",))),
- ("Gerudo Training Grounds MQ Maze Path First Chest", ("Chest", 0x0B, 0x06, None, 'Rupee (1)', ("Gerudo Training Grounds", "Master Quest",))),
- ("Gerudo Training Grounds MQ Maze Path Third Chest", ("Chest", 0x0B, 0x09, None, 'Rupee (Treasure Chest Game)', ("Gerudo Training Grounds", "Master Quest",))),
- ("Gerudo Training Grounds MQ Maze Path Second Chest", ("Chest", 0x0B, 0x0A, None, 'Rupees (20)', ("Gerudo Training Grounds", "Master Quest",))),
+ # Gerudo Training Ground vanilla
+ ("Gerudo Training Ground Lobby Left Chest", ("Chest", 0x0B, 0x13, None, 'Rupees (5)', ("Gerudo Training Ground", "Vanilla",))),
+ ("Gerudo Training Ground Lobby Right Chest", ("Chest", 0x0B, 0x07, None, 'Arrows (10)', ("Gerudo Training Ground", "Vanilla",))),
+ ("Gerudo Training Ground Stalfos Chest", ("Chest", 0x0B, 0x00, None, 'Small Key (Gerudo Training Ground)', ("Gerudo Training Ground", "Vanilla",))),
+ ("Gerudo Training Ground Before Heavy Block Chest", ("Chest", 0x0B, 0x11, None, 'Arrows (30)', ("Gerudo Training Ground", "Vanilla",))),
+ ("Gerudo Training Ground Heavy Block First Chest", ("Chest", 0x0B, 0x0F, None, 'Rupees (200)', ("Gerudo Training Ground", "Vanilla",))),
+ ("Gerudo Training Ground Heavy Block Second Chest", ("Chest", 0x0B, 0x0E, None, 'Rupees (5)', ("Gerudo Training Ground", "Vanilla",))),
+ ("Gerudo Training Ground Heavy Block Third Chest", ("Chest", 0x0B, 0x14, None, 'Small Key (Gerudo Training Ground)', ("Gerudo Training Ground", "Vanilla",))),
+ ("Gerudo Training Ground Heavy Block Fourth Chest", ("Chest", 0x0B, 0x02, None, 'Ice Trap', ("Gerudo Training Ground", "Vanilla",))),
+ ("Gerudo Training Ground Eye Statue Chest", ("Chest", 0x0B, 0x03, None, 'Small Key (Gerudo Training Ground)', ("Gerudo Training Ground", "Vanilla",))),
+ ("Gerudo Training Ground Near Scarecrow Chest", ("Chest", 0x0B, 0x04, None, 'Small Key (Gerudo Training Ground)', ("Gerudo Training Ground", "Vanilla",))),
+ ("Gerudo Training Ground Hammer Room Clear Chest", ("Chest", 0x0B, 0x12, None, 'Arrows (10)', ("Gerudo Training Ground", "Vanilla",))),
+ ("Gerudo Training Ground Hammer Room Switch Chest", ("Chest", 0x0B, 0x10, None, 'Small Key (Gerudo Training Ground)', ("Gerudo Training Ground", "Vanilla",))),
+ ("Gerudo Training Ground Freestanding Key", ("Collectable", 0x0B, 0x01, None, 'Small Key (Gerudo Training Ground)', ("Gerudo Training Ground", "Vanilla",))),
+ ("Gerudo Training Ground Maze Right Central Chest", ("Chest", 0x0B, 0x05, None, 'Bombchus (5)', ("Gerudo Training Ground", "Vanilla",))),
+ ("Gerudo Training Ground Maze Right Side Chest", ("Chest", 0x0B, 0x08, None, 'Arrows (30)', ("Gerudo Training Ground", "Vanilla",))),
+ ("Gerudo Training Ground Underwater Silver Rupee Chest", ("Chest", 0x0B, 0x0D, None, 'Small Key (Gerudo Training Ground)', ("Gerudo Training Ground", "Vanilla",))),
+ ("Gerudo Training Ground Beamos Chest", ("Chest", 0x0B, 0x01, None, 'Small Key (Gerudo Training Ground)', ("Gerudo Training Ground", "Vanilla",))),
+ ("Gerudo Training Ground Hidden Ceiling Chest", ("Chest", 0x0B, 0x0B, None, 'Small Key (Gerudo Training Ground)', ("Gerudo Training Ground", "Vanilla",))),
+ ("Gerudo Training Ground Maze Path First Chest", ("Chest", 0x0B, 0x06, None, 'Rupees (50)', ("Gerudo Training Ground", "Vanilla",))),
+ ("Gerudo Training Ground Maze Path Second Chest", ("Chest", 0x0B, 0x0A, None, 'Rupees (20)', ("Gerudo Training Ground", "Vanilla",))),
+ ("Gerudo Training Ground Maze Path Third Chest", ("Chest", 0x0B, 0x09, None, 'Arrows (30)', ("Gerudo Training Ground", "Vanilla",))),
+ ("Gerudo Training Ground Maze Path Final Chest", ("Chest", 0x0B, 0x0C, None, 'Ice Arrows', ("Gerudo Training Ground", "Vanilla",))),
+ # Gerudo Training Ground MQ
+ ("Gerudo Training Ground MQ Lobby Left Chest", ("Chest", 0x0B, 0x13, None, 'Arrows (10)', ("Gerudo Training Ground", "Master Quest",))),
+ ("Gerudo Training Ground MQ Lobby Right Chest", ("Chest", 0x0B, 0x07, None, 'Bombchus (5)', ("Gerudo Training Ground", "Master Quest",))),
+ ("Gerudo Training Ground MQ First Iron Knuckle Chest", ("Chest", 0x0B, 0x00, None, 'Rupees (5)', ("Gerudo Training Ground", "Master Quest",))),
+ ("Gerudo Training Ground MQ Before Heavy Block Chest", ("Chest", 0x0B, 0x11, None, 'Arrows (10)', ("Gerudo Training Ground", "Master Quest",))),
+ ("Gerudo Training Ground MQ Heavy Block Chest", ("Chest", 0x0B, 0x02, None, 'Rupees (50)', ("Gerudo Training Ground", "Master Quest",))),
+ ("Gerudo Training Ground MQ Eye Statue Chest", ("Chest", 0x0B, 0x03, None, 'Bombchus (10)', ("Gerudo Training Ground", "Master Quest",))),
+ ("Gerudo Training Ground MQ Ice Arrows Chest", ("Chest", 0x0B, 0x04, None, 'Ice Arrows', ("Gerudo Training Ground", "Master Quest",))),
+ ("Gerudo Training Ground MQ Second Iron Knuckle Chest", ("Chest", 0x0B, 0x12, None, 'Arrows (10)', ("Gerudo Training Ground", "Master Quest",))),
+ ("Gerudo Training Ground MQ Flame Circle Chest", ("Chest", 0x0B, 0x0E, None, 'Small Key (Gerudo Training Ground)', ("Gerudo Training Ground", "Master Quest",))),
+ ("Gerudo Training Ground MQ Maze Right Central Chest", ("Chest", 0x0B, 0x05, None, 'Rupees (5)', ("Gerudo Training Ground", "Master Quest",))),
+ ("Gerudo Training Ground MQ Maze Right Side Chest", ("Chest", 0x0B, 0x08, None, 'Rupee (Treasure Chest Game)', ("Gerudo Training Ground", "Master Quest",))),
+ ("Gerudo Training Ground MQ Underwater Silver Rupee Chest", ("Chest", 0x0B, 0x0D, None, 'Small Key (Gerudo Training Ground)', ("Gerudo Training Ground", "Master Quest",))),
+ ("Gerudo Training Ground MQ Dinolfos Chest", ("Chest", 0x0B, 0x01, None, 'Small Key (Gerudo Training Ground)', ("Gerudo Training Ground", "Master Quest",))),
+ ("Gerudo Training Ground MQ Hidden Ceiling Chest", ("Chest", 0x0B, 0x0B, None, 'Rupees (50)', ("Gerudo Training Ground", "Master Quest",))),
+ ("Gerudo Training Ground MQ Maze Path First Chest", ("Chest", 0x0B, 0x06, None, 'Rupee (1)', ("Gerudo Training Ground", "Master Quest",))),
+ ("Gerudo Training Ground MQ Maze Path Third Chest", ("Chest", 0x0B, 0x09, None, 'Rupee (Treasure Chest Game)', ("Gerudo Training Ground", "Master Quest",))),
+ ("Gerudo Training Ground MQ Maze Path Second Chest", ("Chest", 0x0B, 0x0A, None, 'Rupees (20)', ("Gerudo Training Ground", "Master Quest",))),
# Ganon's Castle vanilla
("Ganons Castle Forest Trial Chest", ("Chest", 0x0D, 0x09, None, 'Rupees (5)', ("Ganon's Castle", "Vanilla",))),
@@ -902,7 +905,7 @@ business_scrubs = [
(0x79, 40, 0x10DD, ["enable you to pick up more \x05\x41Deku\x01Nuts", "sell you a \x05\x42mysterious item"]),
]
-dungeons = ('Deku Tree', 'Dodongo\'s Cavern', 'Jabu Jabu\'s Belly', 'Forest Temple', 'Fire Temple', 'Water Temple', 'Spirit Temple', 'Shadow Temple', 'Ice Cavern', 'Bottom of the Well', 'Gerudo Training Grounds', 'Ganon\'s Castle')
+dungeons = ('Deku Tree', 'Dodongo\'s Cavern', 'Jabu Jabu\'s Belly', 'Forest Temple', 'Fire Temple', 'Water Temple', 'Spirit Temple', 'Shadow Temple', 'Ice Cavern', 'Bottom of the Well', 'Gerudo Training Ground', 'Ganon\'s Castle')
location_groups = {
'Song': [name for (name, data) in location_table.items() if data[0] == 'Song'],
'Chest': [name for (name, data) in location_table.items() if data[0] == 'Chest'],
diff --git a/worlds/oot/LogicTricks.py b/worlds/oot/LogicTricks.py
index db8b792ab5..6950bc2124 100644
--- a/worlds/oot/LogicTricks.py
+++ b/worlds/oot/LogicTricks.py
@@ -1,7 +1,7 @@
known_logic_tricks = {
'Fewer Tunic Requirements': {
'name' : 'logic_fewer_tunic_requirements',
- 'tags' : ("General", "Fire Temple", "Water Temple", "Gerudo Training Grounds", "Zora's Fountain",),
+ 'tags' : ("General", "Fire Temple", "Water Temple", "Gerudo Training Ground", "Zora's Fountain",),
'tooltip' : '''\
Allows the following possible without Tunics:
- Enter Water Temple. The key below the center
@@ -10,7 +10,7 @@ known_logic_tricks = {
accessible, and not Volvagia.
- Zora's Fountain Bottom Freestanding PoH.
Might not have enough health to resurface.
- - Gerudo Training Grounds Underwater
+ - Gerudo Training Ground Underwater
Silver Rupee Chest. May need to make multiple
trips.
'''},
@@ -73,9 +73,9 @@ known_logic_tricks = {
from below, by shooting it through the vines,
bypassing the need to lower the staircase.
'''},
- 'Gerudo Fortress "Kitchen" with No Additional Items': {
+ 'Thieves\' Hideout "Kitchen" with No Additional Items': {
'name' : 'logic_gerudo_kitchen',
- 'tags' : ("Gerudo's Fortress",),
+ 'tags' : ("Thieves' Hideout", "Gerudo's Fortress"),
'tooltip' : '''\
The logic normally guarantees one of Bow, Hookshot,
or Hover Boots.
@@ -185,9 +185,9 @@ known_logic_tricks = {
a particularly egregious example. Logic normally
expects Din's Fire and Song of Time.
'''},
- 'Gerudo Training Grounds MQ Left Side Silver Rupees with Hookshot': {
+ 'Gerudo Training Ground MQ Left Side Silver Rupees with Hookshot': {
'name' : 'logic_gtg_mq_with_hookshot',
- 'tags' : ("Gerudo Training Grounds",),
+ 'tags' : ("Gerudo Training Ground",),
'tooltip' : '''\
The highest silver rupee can be obtained by
hookshotting the target and then immediately jump
@@ -239,14 +239,6 @@ known_logic_tricks = {
or hit the shortcut switch at the top of the
room and jump from the glass blocks that spawn.
'''},
- 'Forest Temple MQ Twisted Hallway Switch with Hookshot': {
- 'name' : 'logic_forest_mq_hallway_switch_hookshot',
- 'tags' : ("Forest Temple",),
- 'tooltip' : '''\
- There's a very small gap between the glass block
- and the wall. Through that gap you can hookshot
- the target on the ceiling.
- '''},
'Death Mountain Trail Chest with Strength': {
'name' : 'logic_dmt_bombable',
'tags' : ("Death Mountain Trail",),
@@ -907,9 +899,9 @@ known_logic_tricks = {
Skulltula and obtain the token by having the Boomerang
interact with it along the return path.
'''},
- 'Gerudo Training Grounds Left Side Silver Rupees without Hookshot': {
+ 'Gerudo Training Ground Left Side Silver Rupees without Hookshot': {
'name' : 'logic_gtg_without_hookshot',
- 'tags' : ("Gerudo Training Grounds",),
+ 'tags' : ("Gerudo Training Ground",),
'tooltip' : '''\
After collecting the rest of the silver rupees in the room,
you can reach the final silver rupee on the ceiling by being
@@ -919,9 +911,9 @@ known_logic_tricks = {
the edge of a flame wall before it can rise up to block you.
To do so without taking damage is more precise.
'''},
- 'Gerudo Training Grounds MQ Left Side Silver Rupees without Hookshot': {
+ 'Gerudo Training Ground MQ Left Side Silver Rupees without Hookshot': {
'name' : 'logic_gtg_mq_without_hookshot',
- 'tags' : ("Gerudo Training Grounds",),
+ 'tags' : ("Gerudo Training Ground",),
'tooltip' : '''\
After collecting the rest of the silver rupees in the room,
you can reach the final silver rupee on the ceiling by being
@@ -932,18 +924,18 @@ known_logic_tricks = {
Also included with this trick is that fact that the switch
that unbars the door to the final chest of GTG can be hit
without a projectile, using a precise jump slash.
- This trick supersedes "Gerudo Training Grounds MQ Left Side
+ This trick supersedes "Gerudo Training Ground MQ Left Side
Silver Rupees with Hookshot".
'''},
- 'Reach Gerudo Training Grounds Fake Wall Ledge with Hover Boots': {
+ 'Reach Gerudo Training Ground Fake Wall Ledge with Hover Boots': {
'name' : 'logic_gtg_fake_wall',
- 'tags' : ("Gerudo Training Grounds",),
+ 'tags' : ("Gerudo Training Ground",),
'tooltip' : '''\
A precise Hover Boots use from the top of the chest can allow
you to grab the ledge without needing the usual requirements.
In Master Quest, this always skips a Song of Time requirement.
In Vanilla, this skips a Hookshot requirement, but is only
- relevant if "Gerudo Training Grounds Left Side Silver Rupees
+ relevant if "Gerudo Training Ground Left Side Silver Rupees
without Hookshot" is enabled.
'''},
'Water Temple Cracked Wall with No Additional Items': {
@@ -1299,19 +1291,19 @@ known_logic_tricks = {
Removes the requirements for the Lens of Truth
in Ganon's Castle.
'''},
- 'Gerudo Training Grounds MQ without Lens of Truth': {
+ 'Gerudo Training Ground MQ without Lens of Truth': {
'name' : 'logic_lens_gtg_mq',
- 'tags' : ("Lens of Truth","Gerudo Training Grounds",),
+ 'tags' : ("Lens of Truth","Gerudo Training Ground",),
'tooltip' : '''\
Removes the requirements for the Lens of Truth
- in Gerudo Training Grounds MQ.
+ in Gerudo Training Ground MQ.
'''},
- 'Gerudo Training Grounds without Lens of Truth': {
+ 'Gerudo Training Ground without Lens of Truth': {
'name' : 'logic_lens_gtg',
- 'tags' : ("Lens of Truth","Gerudo Training Grounds",),
+ 'tags' : ("Lens of Truth","Gerudo Training Ground",),
'tooltip' : '''\
Removes the requirements for the Lens of Truth
- in Gerudo Training Grounds.
+ in Gerudo Training Ground.
'''},
'Jabu MQ without Lens of Truth': {
'name' : 'logic_lens_jabu_mq',
diff --git a/worlds/oot/Messages.py b/worlds/oot/Messages.py
index 8423562612..e576b96b51 100644
--- a/worlds/oot/Messages.py
+++ b/worlds/oot/Messages.py
@@ -308,7 +308,7 @@ KEYSANITY_MESSAGES = {
0x0095: "\x13\x77\x08You found a \x05\x41Small Key\x05\x40\x01for the \x05\x43Water Temple\x05\x40!\x09",
0x009B: "\x13\x77\x08You found a \x05\x41Small Key\x05\x40\x01for the \x05\x45Bottom of the Well\x05\x40!\x09",
0x009F: "\x13\x77\x08You found a \x05\x41Small Key\x05\x40\x01for the \x05\x46Gerudo Training\x01Grounds\x05\x40!\x09",
- 0x00A0: "\x13\x77\x08You found a \x05\x41Small Key\x05\x40\x01for the \x05\x46Gerudo's Fortress\x05\x40!\x09",
+ 0x00A0: "\x13\x77\x08You found a \x05\x41Small Key\x05\x40\x01for the \x05\x46Thieves' Hideout\x05\x40!\x09",
0x00A1: "\x13\x77\x08You found a \x05\x41Small Key\x05\x40\x01for \x05\x41Ganon's Castle\x05\x40!\x09",
0x00A2: "\x13\x75\x08You found the \x05\x41Compass\x05\x40\x01for the \x05\x45Bottom of the Well\x05\x40!\x09",
0x00A3: "\x13\x76\x08You found the \x05\x41Dungeon Map\x05\x40\x01for the \x05\x45Shadow Temple\x05\x40!\x09",
diff --git a/worlds/oot/Options.py b/worlds/oot/Options.py
index f0715f2a2c..50b6c26c86 100644
--- a/worlds/oot/Options.py
+++ b/worlds/oot/Options.py
@@ -421,8 +421,8 @@ class ShuffleKeys(Choice):
class ShuffleGerudoKeys(Choice):
- """Control where to shuffle the Gerudo Fortress small keys."""
- display_name = "Gerudo Fortress Keys"
+ """Control where to shuffle the Thieves' Hideout small keys."""
+ display_name = "Thieves' Hideout Keys"
option_vanilla = 0
option_overworld = 1
option_any_dungeon = 2
@@ -532,6 +532,14 @@ class ChickenCount(Range):
default = 7
+class BigPoeCount(Range):
+ """Number of Big Poes required for the Poe Collector's item."""
+ display_name = "Big Poe Count"
+ range_start = 1
+ range_end = 10
+ default = 1
+
+
timesavers_options: typing.Dict[str, type(Option)] = {
"skip_child_zelda": SkipChildZelda,
"no_escape_sequence": SkipEscape,
@@ -544,7 +552,7 @@ timesavers_options: typing.Dict[str, type(Option)] = {
"free_scarecrow": FreeScarecrow,
"fast_bunny_hood": FastBunny,
"chicken_count": ChickenCount,
- # "big_poe_count": make_range(1, 10, 1),
+ "big_poe_count": BigPoeCount,
}
diff --git a/worlds/oot/Patches.py b/worlds/oot/Patches.py
index cb7732f1b9..177a4c6165 100644
--- a/worlds/oot/Patches.py
+++ b/worlds/oot/Patches.py
@@ -710,7 +710,7 @@ def patch_rom(world, rom):
rom.write_byte(address,0x01)
# Allow Warp Songs in additional places
- rom.write_byte(0xB6D3D2, 0x00) # Gerudo Training Grounds
+ rom.write_byte(0xB6D3D2, 0x00) # Gerudo Training Ground
rom.write_byte(0xB6D42A, 0x00) # Inside Ganon's Castle
#Tell Sheik at Ice Cavern we are always an Adult
@@ -719,10 +719,10 @@ def patch_rom(world, rom):
rom.write_int32(0xc7BCA4, 0x00000000)
# Allow Farore's Wind in dungeons where it's normally forbidden
- rom.write_byte(0xB6D3D3, 0x00) # Gerudo Training Grounds
+ rom.write_byte(0xB6D3D3, 0x00) # Gerudo Training Ground
rom.write_byte(0xB6D42B, 0x00) # Inside Ganon's Castle
- # Remove disruptive text from Gerudo Training Grounds and early Shadow Temple (vanilla)
+ # Remove disruptive text from Gerudo Training Ground and early Shadow Temple (vanilla)
Wonder_text = [0x27C00BC, 0x27C00CC, 0x27C00DC, 0x27C00EC, 0x27C00FC, 0x27C010C, 0x27C011C, 0x27C012C, 0x27CE080,
0x27CE090, 0x2887070, 0x2887080, 0x2887090, 0x2897070, 0x28C7134, 0x28D91BC, 0x28A60F4, 0x28AE084,
0x28B9174, 0x28BF168, 0x28BF178, 0x28BF188, 0x28A1144, 0x28A6104, 0x28D0094]
@@ -826,10 +826,6 @@ def patch_rom(world, rom):
exit_table = generate_exit_lookup_table()
- if world.entrance_shuffle:
- # Disable the fog state entirely to avoid fog glitches
- rom.write_byte(rom.sym('NO_FOG_STATE'), 1)
-
if world.disable_trade_revert:
# Disable trade quest timers and prevent trade items from ever reverting
rom.write_byte(rom.sym('DISABLE_TIMERS'), 0x01)
@@ -1202,7 +1198,7 @@ def patch_rom(world, rom):
if world.dungeon_mq['Ice Cavern']:
mq_scenes.append(9)
# Scene 10 has no layout changes, so it doesn't need to be patched
- if world.dungeon_mq['Gerudo Training Grounds']:
+ if world.dungeon_mq['Gerudo Training Ground']:
mq_scenes.append(11)
if world.dungeon_mq['Ganons Castle']:
mq_scenes.append(13)
@@ -1378,7 +1374,7 @@ def patch_rom(world, rom):
rom.write_byte(0x2E8E931, special['text_id']) #Fix text box
elif location.name == 'Song from Malon':
rom.write_byte(rom.sym('MALON_TEXT_ID'), special['text_id'])
- elif location.name == 'Song from Composers Grave':
+ elif location.name == 'Song from Royal Familys Tomb':
rom.write_int16(0xE09F66, bit_mask_pointer)
rom.write_byte(0x332A87D, special['text_id']) #Fix text box
elif location.name == 'Song from Saria':
@@ -1685,7 +1681,7 @@ def patch_rom(world, rom):
'Shadow Temple': ("the \x05\x45Shadow Temple", 'Bongo Bongo', 0x7f, 0xa3),
}
for dungeon in world.dungeon_mq:
- if dungeon in ['Gerudo Training Grounds', 'Ganons Castle']:
+ if dungeon in ['Gerudo Training Ground', 'Ganons Castle']:
pass
elif dungeon in ['Bottom of the Well', 'Ice Cavern']:
dungeon_name, boss_name, compass_id, map_id = dungeon_list[dungeon]
@@ -1785,6 +1781,35 @@ def patch_rom(world, rom):
save_context.equip_current_items(world.starting_age)
save_context.write_save_table(rom)
+ # Write data into AP autotracking context
+ rom.write_int32(rom.sym('DUNGEON_IS_MQ_ADDRESS'), rom.sym('cfg_dungeon_is_mq'))
+ rom.write_int32(rom.sym('DUNGEON_REWARDS_ADDRESS'), rom.sym('cfg_dungeon_rewards'))
+ rom.write_byte(rom.sym('BIG_POE_COUNT'), world.big_poe_count)
+ if world.enhance_map_compass:
+ rom.write_byte(rom.sym('ENHANCE_MAP_COMPASS'), 0x01)
+ if world.enhance_map_compass or world.misc_hints:
+ rom.write_byte(rom.sym('SHOW_DUNGEON_REWARDS'), 0x01)
+ if world.shuffle_smallkeys == 'remove':
+ rom.write_byte(rom.sym('SMALL_KEY_SHUFFLE'), 0x01)
+ elif world.shuffle_smallkeys in ['overworld', 'any_dungeon', 'keysanity']:
+ rom.write_byte(rom.sym('SMALL_KEY_SHUFFLE'), 0x02)
+ if world.shuffle_scrubs != 'off':
+ rom.write_byte(rom.sym('SHUFFLE_SCRUBS'), 0x01)
+ if world.open_forest == 'closed_deku':
+ rom.write_byte(rom.sym('OPEN_FOREST'), 0x01)
+ elif world.open_forest == 'closed':
+ rom.write_byte(rom.sym('OPEN_FOREST'), 0x02)
+ if world.zora_fountain == 'adult':
+ rom.write_byte(rom.sym('OPEN_FOUNTAIN'), 0x01)
+ elif world.zora_fountain == 'closed':
+ rom.write_byte(rom.sym('OPEN_FOUNTAIN'), 0x02)
+
+ rom.write_bytes(rom.sym('SHOP_SLOTS'), [
+ sum(f'{shop} Item {idx}' in world.shop_prices for idx in ('7', '5', '8', '6'))
+ for shop in ('KF Shop', 'Market Bazaar', 'Market Potion Shop', 'Market Bombchu Shop',
+ 'Kak Bazaar', 'Kak Potion Shop', 'GC Shop', 'ZD Shop')
+ ])
+
return rom
@@ -1832,7 +1857,6 @@ def get_override_entry(player_id, location):
player_id = 0 if player_id == location.item.player else min(location.item.player, 255)
if location.item.game != 'Ocarina of Time':
# This is an AP sendable. It's guaranteed to not be None.
- looks_like_item_id = 0
if location.item.advancement:
item_id = 0xCB
else:
@@ -1842,10 +1866,11 @@ def get_override_entry(player_id, location):
if None in [scene, default, item_id]:
return None
- if location.item.looks_like_item is not None:
- looks_like_item_id = location.item.looks_like_item.index
- else:
- looks_like_item_id = 0
+ if location.item.trap:
+ item_id = 0x7C # Ice Trap ID, to get "X is a fool" message
+ looks_like_item_id = location.item.looks_like_item.index
+ else:
+ looks_like_item_id = 0
if location.type in ['NPC', 'BossHeart']:
type = 0
@@ -2082,15 +2107,15 @@ def place_shop_items(rom, world, shop_items, messages, locations, init_shop_id=F
shop_objs.add(location.item.special['object'])
rom.write_int16(location.address1, location.item.index)
else:
- if location.item.game != "Ocarina of Time":
+ if location.item.trap:
+ item_display = location.item.looks_like_item
+ elif location.item.game != "Ocarina of Time":
item_display = location.item
if location.item.advancement:
item_display.index = 0xCB
else:
item_display.index = 0xCC
item_display.special = {}
- elif location.item.looks_like_item is not None:
- item_display = location.item.looks_like_item
else:
item_display = location.item
@@ -2141,7 +2166,7 @@ def place_shop_items(rom, world, shop_items, messages, locations, init_shop_id=F
else:
shop_item_name = item_display.name
- if location.item.name == 'Ice Trap':
+ if location.item.trap:
shop_item_name = create_fake_name(shop_item_name)
if len(world.world.worlds) > 1:
@@ -2184,7 +2209,7 @@ def configure_dungeon_info(rom, world):
codes = ['Deku Tree', 'Dodongos Cavern', 'Jabu Jabus Belly', 'Forest Temple',
'Fire Temple', 'Water Temple', 'Spirit Temple', 'Shadow Temple',
'Bottom of the Well', 'Ice Cavern', 'Tower (N/A)',
- 'Gerudo Training Grounds', 'Hideout (N/A)', 'Ganons Castle']
+ 'Gerudo Training Ground', 'Hideout (N/A)', 'Ganons Castle']
dungeon_is_mq = [1 if world.dungeon_mq.get(c) else 0 for c in codes]
rom.write_int32(rom.sym('cfg_dungeon_info_enable'), 1)
diff --git a/worlds/oot/__init__.py b/worlds/oot/__init__.py
index 9898f4b127..c134eba672 100644
--- a/worlds/oot/__init__.py
+++ b/worlds/oot/__init__.py
@@ -27,11 +27,11 @@ from .HintList import getRequiredHints
from .SaveContext import SaveContext
from Utils import get_options, output_path
-from BaseClasses import MultiWorld, CollectionState, RegionType
+from BaseClasses import MultiWorld, CollectionState, RegionType, Tutorial
from Options import Range, Toggle, OptionList
from Fill import fill_restrictive, FillError
from worlds.generic.Rules import exclusion_rules
-from ..AutoWorld import World, AutoLogicRegister
+from ..AutoWorld import World, AutoLogicRegister, WebWorld
location_id_offset = 67000
@@ -66,6 +66,28 @@ class OOTCollectionState(metaclass=AutoLogicRegister):
return ret
+class OOTWeb(WebWorld):
+ setup = Tutorial(
+ "Multiworld Setup Tutorial",
+ "A guide to setting up the Archipelago Ocarina of Time software on your computer.",
+ "English",
+ "setup_en.md",
+ "setup/en",
+ ["Edos"]
+ )
+
+ setup_es = Tutorial(
+ setup.tutorial_name,
+ setup.description,
+ "Español",
+ "setup_es.md",
+ "setup/es",
+ setup.author
+ )
+
+ tutorials = [setup, setup_es]
+
+
class OOTWorld(World):
"""
The Legend of Zelda: Ocarina of Time is a 3D action/adventure game. Travel through Hyrule in two time periods,
@@ -80,13 +102,20 @@ class OOTWorld(World):
location_name_to_id = location_name_to_id
remote_items: bool = False
remote_start_inventory: bool = False
+ web = OOTWeb()
- data_version = 1
+ data_version = 2
+
+ required_client_version = (0, 3, 2)
def __init__(self, world, player):
self.hint_data_available = threading.Event()
super(OOTWorld, self).__init__(world, player)
+ @classmethod
+ def stage_assert_generate(cls, world: MultiWorld):
+ rom = Rom(file=get_options()['oot_options']['rom_file'])
+
def generate_early(self):
# Player name MUST be at most 16 bytes ascii-encoded, otherwise won't write to ROM correctly
if len(bytes(self.world.get_player_name(self.player), 'ascii')) > 16:
@@ -161,17 +190,24 @@ class OOTWorld(World):
self.dungeon_mq = {item['name']: (item in mq_dungeons) for item in dungeon_table}
# Determine tricks in logic
- for trick in self.logic_tricks:
- normalized_name = trick.casefold()
- if normalized_name in normalized_name_tricks:
- setattr(self, normalized_name_tricks[normalized_name]['name'], True)
- else:
- raise Exception(f'Unknown OOT logic trick for player {self.player}: {trick}')
+ if self.logic_rules == 'glitchless':
+ for trick in self.logic_tricks:
+ normalized_name = trick.casefold()
+ if normalized_name in normalized_name_tricks:
+ setattr(self, normalized_name_tricks[normalized_name]['name'], True)
+ else:
+ raise Exception(f'Unknown OOT logic trick for player {self.player}: {trick}')
+
+ # No Logic forces all tricks on, prog balancing off and beatable-only
+ elif self.logic_rules == 'no_logic':
+ self.world.progression_balancing[self.player].value = False
+ self.world.accessibility[self.player] = self.world.accessibility[self.player].from_text("minimal")
+ for trick in normalized_name_tricks.values():
+ setattr(self, trick['name'], True)
# Not implemented for now, but needed to placate the generator. Remove as they are implemented
self.mq_dungeons_random = False # this will be a deprecated option later
self.ocarina_songs = False # just need to pull in the OcarinaSongs module
- self.big_poe_count = 1 # disabled due to client-side issues for now
self.mix_entrance_pools = False
self.decouple_entrances = False
@@ -289,8 +325,7 @@ class OOTWorld(World):
continue
new_location.parent_region = new_region
new_location.rule_string = rule
- if self.world.logic_rules != 'none':
- self.parser.parse_spot_rule(new_location)
+ self.parser.parse_spot_rule(new_location)
if new_location.never:
# We still need to fill the location even if ALR is off.
logger.debug('Unreachable location: %s', new_location.name)
@@ -302,8 +337,7 @@ class OOTWorld(World):
lname = '%s from %s' % (event, new_region.name)
new_location = OOTLocation(self.player, lname, type='Event', parent=new_region)
new_location.rule_string = rule
- if self.world.logic_rules != 'none':
- self.parser.parse_spot_rule(new_location)
+ self.parser.parse_spot_rule(new_location)
if new_location.never:
logger.debug('Dropping unreachable event: %s', new_location.name)
else:
@@ -427,7 +461,7 @@ class OOTWorld(World):
return item
def create_regions(self): # create and link regions
- if self.logic_rules == 'glitchless':
+ if self.logic_rules == 'glitchless' or self.logic_rules == 'no_logic': # enables ER + NL
world_type = 'World'
else:
world_type = 'Glitched World'
@@ -497,6 +531,8 @@ class OOTWorld(World):
raise e
# Restore original state and delete assumed entrances
for entrance in self.get_shuffled_entrances():
+ if entrance.connected_region is not None:
+ entrance.disconnect()
entrance.connect(self.world.get_region(entrance.vanilla_connected_region, self.player))
if entrance.assumed:
assumed_entrance = entrance.assumed
@@ -530,7 +566,7 @@ class OOTWorld(World):
self.fake_items.extend(item for item in self.itempool if item.index and self.is_major_item(item))
if self.ice_trap_appearance in ['junk_only', 'anything']:
self.fake_items.extend(item for item in self.itempool if
- item.index and not self.is_major_item(item) and item.name != 'Ice Trap')
+ item.index and not item.type == 'Shop' and not self.is_major_item(item) and item.name != 'Ice Trap')
# Kill unreachable events that can't be gotten even with all items
# Make sure to only kill actual internal events, not in-game "events"
@@ -574,7 +610,7 @@ class OOTWorld(World):
# only one exists
"Bottom of the Well Lens of Truth Chest", "Bottom of the Well MQ Lens of Truth Chest",
# only one exists
- "Gerudo Training Grounds Maze Path Final Chest", "Gerudo Training Grounds MQ Ice Arrows Chest",
+ "Gerudo Training Ground Maze Path Final Chest", "Gerudo Training Ground MQ Ice Arrows Chest",
]
# Place/set rules for dungeon items
@@ -610,32 +646,33 @@ class OOTWorld(World):
# Now fill items that can go into any dungeon. Retrieve the Gerudo Fortress keys from the pool if necessary
if self.shuffle_fortresskeys == 'any_dungeon':
- fortresskeys = filter(lambda item: item.player == self.player and item.type == 'FortressSmallKey',
+ fortresskeys = filter(lambda item: item.player == self.player and item.type == 'HideoutSmallKey',
self.world.itempool)
itempools['any_dungeon'].extend(fortresskeys)
if itempools['any_dungeon']:
for item in itempools['any_dungeon']:
self.world.itempool.remove(item)
itempools['any_dungeon'].sort(key=lambda item:
- {'GanonBossKey': 4, 'BossKey': 3, 'SmallKey': 2, 'FortressSmallKey': 1}.get(item.type, 0))
+ {'GanonBossKey': 4, 'BossKey': 3, 'SmallKey': 2, 'HideoutSmallKey': 1}.get(item.type, 0))
self.world.random.shuffle(any_dungeon_locations)
fill_restrictive(self.world, self.world.get_all_state(False), any_dungeon_locations,
itempools['any_dungeon'], True, True)
# If anything is overworld-only, fill into local non-dungeon locations
if self.shuffle_fortresskeys == 'overworld':
- fortresskeys = filter(lambda item: item.player == self.player and item.type == 'FortressSmallKey',
+ fortresskeys = filter(lambda item: item.player == self.player and item.type == 'HideoutSmallKey',
self.world.itempool)
itempools['overworld'].extend(fortresskeys)
if itempools['overworld']:
for item in itempools['overworld']:
self.world.itempool.remove(item)
itempools['overworld'].sort(key=lambda item:
- {'GanonBossKey': 4, 'BossKey': 3, 'SmallKey': 2, 'FortressSmallKey': 1}.get(item.type, 0))
+ {'GanonBossKey': 4, 'BossKey': 3, 'SmallKey': 2, 'HideoutSmallKey': 1}.get(item.type, 0))
non_dungeon_locations = [loc for loc in self.get_locations() if
- not loc.item and loc not in any_dungeon_locations
- and loc.type != 'Shop' and (
- loc.type != 'Song' or self.shuffle_song_items != 'song')]
+ not loc.item and loc not in any_dungeon_locations and
+ (loc.type != 'Shop' or loc.name in self.shop_prices) and
+ (loc.type != 'Song' or self.shuffle_song_items != 'song') and
+ (loc.name not in dungeon_song_locations or self.shuffle_song_items != 'dungeon')]
self.world.random.shuffle(non_dungeon_locations)
fill_restrictive(self.world, self.world.get_all_state(False), non_dungeon_locations,
itempools['overworld'], True, True)
@@ -765,8 +802,8 @@ class OOTWorld(World):
self.hint_data_available.wait()
with i_o_limiter:
- # Make ice traps appear as other random items
- ice_traps = [loc.item for loc in self.get_locations() if loc.item.name == 'Ice Trap']
+ # Make traps appear as other random items
+ ice_traps = [loc.item for loc in self.get_locations() if loc.item.trap]
for trap in ice_traps:
trap.looks_like_item = self.create_item(self.world.slot_seeds[self.player].choice(self.fake_items).name)
@@ -794,7 +831,7 @@ class OOTWorld(World):
else:
entrance = loadzone.reverse
if entrance.reverse is not None:
- self.world.spoiler.set_entrance(entrance, entrance.replaces, 'both', self.player)
+ self.world.spoiler.set_entrance(entrance, entrance.replaces.reverse, 'both', self.player)
else:
self.world.spoiler.set_entrance(entrance, entrance.replaces, 'entrance', self.player)
else:
@@ -834,7 +871,7 @@ class OOTWorld(World):
if loc.game == "Ocarina of Time" and loc.item.code and (not loc.locked or
(loc.item.type == 'Song' or
(loc.item.type == 'SmallKey' and world.worlds[loc.player].shuffle_smallkeys == 'any_dungeon') or
- (loc.item.type == 'FortressSmallKey' and world.worlds[loc.player].shuffle_fortresskeys == 'any_dungeon') or
+ (loc.item.type == 'HideoutSmallKey' and world.worlds[loc.player].shuffle_fortresskeys == 'any_dungeon') or
(loc.item.type == 'BossKey' and world.worlds[loc.player].shuffle_bosskeys == 'any_dungeon') or
(loc.item.type == 'GanonBossKey' and world.worlds[loc.player].shuffle_ganon_bosskey == 'any_dungeon'))):
if loc.player in barren_hint_players:
@@ -879,28 +916,45 @@ class OOTWorld(World):
if len(entrance) > 2:
hint_entrances.add(entrance[2][0])
+ # Get main hint entrance to region.
+ # If the region is directly adjacent to a hint-entrance, we return that one.
+ # If it's in a dungeon, scan all the entrances for all the regions in the dungeon.
+ # This should terminate on the first region anyway, but we scan everything to be safe.
+ # If it's one of the special cases, go one level deeper.
+ # Otherwise return None.
def get_entrance_to_region(region):
- if region.name == 'Root':
- return None
+ special_case_regions = {
+ "Beyond Door of Time",
+ "Kak Impas House Near Cow",
+ }
+
for entrance in region.entrances:
if entrance.name in hint_entrances:
return entrance
- for entrance in region.entrances:
- return get_entrance_to_region(entrance.parent_region)
+ if region.dungeon is not None:
+ for r in region.dungeon.regions:
+ for e in r.entrances:
+ if e.name in hint_entrances:
+ return e
+ if region.name in special_case_regions:
+ return get_entrance_to_region(region.entrances[0].parent_region)
+ return None
# Remove undesired items from start_inventory
+ # This is because we don't want them to show up in the autotracker,
+ # they just don't exist in-game.
for item_name in self.remove_from_start_inventory:
item_id = self.item_name_to_id.get(item_name, None)
- try:
- multidata["precollected_items"][self.player].remove(item_id)
- except ValueError as e:
- logger.warning(
- f"Attempted to remove nonexistent item id {item_id} from OoT precollected items ({item_name})")
+ if item_id is None:
+ continue
+ multidata["precollected_items"][self.player].remove(item_id)
# Add ER hint data
if self.shuffle_interior_entrances != 'off' or self.shuffle_dungeon_entrances or self.shuffle_grotto_entrances:
er_hint_data = {}
for region in self.regions:
+ if not any(bool(loc.address) for loc in region.locations): # check if region has any non-event locations
+ continue
main_entrance = get_entrance_to_region(region)
if main_entrance is not None and main_entrance.shuffled:
for location in region.locations:
@@ -949,7 +1003,7 @@ class OOTWorld(World):
return False
if item.type == 'SmallKey' and self.shuffle_smallkeys in ['dungeon', 'vanilla']:
return False
- if item.type == 'FortressSmallKey' and self.shuffle_fortresskeys == 'vanilla':
+ if item.type == 'HideoutSmallKey' and self.shuffle_fortresskeys == 'vanilla':
return False
if item.type == 'BossKey' and self.shuffle_bosskeys in ['dungeon', 'vanilla']:
return False
@@ -983,3 +1037,6 @@ class OOTWorld(World):
all_state.stale[self.player] = True
return all_state
+
+ def get_filler_item_name(self) -> str:
+ return get_junk_item(count=1, pool=get_junk_pool(self))[0]
diff --git a/worlds/oot/data/Glitched World/Gerudo Training Ground MQ.json b/worlds/oot/data/Glitched World/Gerudo Training Ground MQ.json
new file mode 100644
index 0000000000..d36472fc9b
--- /dev/null
+++ b/worlds/oot/data/Glitched World/Gerudo Training Ground MQ.json
@@ -0,0 +1,79 @@
+[
+ {
+ "region_name": "Gerudo Training Ground Lobby",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground MQ Lobby Left Chest": "True",
+ "Gerudo Training Ground MQ Lobby Right Chest": "True",
+ "Gerudo Training Ground MQ Hidden Ceiling Chest": "logic_lens_gtg_mq or can_use(Lens_of_Truth)",
+ "Gerudo Training Ground MQ Maze Path First Chest": "True",
+ "Gerudo Training Ground MQ Maze Path Second Chest": "True",
+ "Gerudo Training Ground MQ Maze Path Third Chest": "(Small_Key_Gerudo_Training_Ground, 1)"
+ },
+ "exits": {
+ "Gerudo Fortress": "True",
+ "Gerudo Training Ground Left Side": "has_fire_source",
+ "Gerudo Training Ground Right Side": "Bow"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Right Side",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground MQ Dinolfos Chest": "True",
+ "Gerudo Training Ground MQ Underwater Silver Rupee Chest": "
+ (Hover_Boots or at('Gerudo Training Ground Central Maze Right', can_use(Longshot) or Bow)) and
+ has_fire_source and Iron_Boots and (logic_fewer_tunic_requirements or can_use(Zora_Tunic)) and
+ can_take_damage",
+ "Wall Fairy": "has_bottle and can_use(Bow)" #in the Dinalfos room shoot the Gerudo symbol above the door to the lava room.
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Left Side",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground MQ First Iron Knuckle Chest": "True"
+ },
+ "exits": {
+ "Gerudo Training Ground Stalfos Room": "can_use(Longshot) or (logic_gtg_mq_with_hookshot and can_use(Hookshot))"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Stalfos Room",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground MQ Before Heavy Block Chest": "True",
+ "Gerudo Training Ground MQ Heavy Block Chest": "can_use(Silver_Gauntlets)",
+ "Blue Fire": "has_bottle"
+ },
+ "exits": {
+ "Gerudo Training Ground Back Areas": "can_play(Song_of_Time) and (logic_lens_gtg_mq or can_use(Lens_of_Truth)) and Blue_Fire"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Back Areas",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground MQ Eye Statue Chest": "Bow",
+ "Gerudo Training Ground MQ Second Iron Knuckle Chest": "True",
+ "Gerudo Training Ground MQ Flame Circle Chest": "True"
+ },
+ "exits": {
+ "Gerudo Training Ground Central Maze Right": "Megaton_Hammer",
+ "Gerudo Training Ground Right Side": "can_use(Longshot)"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Central Maze Right",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground MQ Maze Right Central Chest": "True",
+ "Gerudo Training Ground MQ Maze Right Side Chest": "True",
+ "Gerudo Training Ground MQ Ice Arrows Chest": "
+ (Small_Key_Gerudo_Training_Ground, 3)"
+ },
+ "exits": {
+ "Gerudo Training Ground Right Side": "True"
+ }
+ }
+]
diff --git a/worlds/oot/data/Glitched World/Gerudo Training Ground.json b/worlds/oot/data/Glitched World/Gerudo Training Ground.json
new file mode 100644
index 0000000000..7c46ee62a5
--- /dev/null
+++ b/worlds/oot/data/Glitched World/Gerudo Training Ground.json
@@ -0,0 +1,112 @@
+[
+ {
+ "region_name": "Gerudo Training Ground Lobby",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground Lobby Left Chest": "can_use(Bow) or can_use(Slingshot)",
+ "Gerudo Training Ground Lobby Right Chest": "can_use(Bow) or can_use(Slingshot)",
+ "Gerudo Training Ground Stalfos Chest": "can_jumpslash",
+ "Gerudo Training Ground Beamos Chest": "has_explosives and can_jumpslash",
+ "Wall Fairy": "has_bottle and can_use(Bow)" #in the Beamos room shoot the Gerudo symbol above the door to the lava room.
+ },
+ "exits": {
+ "Gerudo Training Ground Heavy Block Room": "True",
+ "Gerudo Training Ground Lava Room": "
+ here(has_explosives and can_jumpslash)",
+ "Gerudo Training Ground Central Maze": "True"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Central Maze",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground Hidden Ceiling Chest": "(Small_Key_Gerudo_Training_Ground, 3)
+ or (can_use(Hookshot) and can_mega) or (is_child and has_explosives and (can_live_dmg(0.5) or can_use(Nayrus_Love)))",
+ "Gerudo Training Ground Maze Path First Chest": "(Small_Key_Gerudo_Training_Ground, 4)
+ or (can_use(Hookshot) and can_mega) or (is_child and has_explosives and (can_live_dmg(1.0) or can_use(Nayrus_Love)))",
+ "Gerudo Training Ground Maze Path Second Chest": "(Small_Key_Gerudo_Training_Ground, 6)
+ or (can_use(Hookshot) and can_mega) or (is_child and has_explosives and (can_live_dmg(1.0) or can_use(Nayrus_Love)))",
+ "Gerudo Training Ground Maze Path Third Chest": "(Small_Key_Gerudo_Training_Ground, 7)
+ or (can_use(Hookshot) and can_mega) or (is_child and has_explosives and (can_live_dmg(0.5) or can_use(Nayrus_Love)))",
+ "Gerudo Training Ground Maze Path Final Chest": "(Small_Key_Gerudo_Training_Ground, 9)
+ or (can_use(Hookshot) and can_mega) or (is_child and has_explosives and (can_live_dmg(0.5) or can_use(Nayrus_Love)))"
+ },
+ "exits": {
+ "Gerudo Training Ground Central Maze Right": "(Small_Key_Gerudo_Training_Ground, 9)
+ or (can_use(Hookshot) and can_mega) or (is_child and has_explosives)"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Central Maze Right",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground Maze Right Central Chest": "True",
+ "Gerudo Training Ground Maze Right Side Chest": "True",
+ "Gerudo Training Ground Freestanding Key": "True"
+ },
+ "exits": {
+ "Gerudo Training Ground Lava Room": "True"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Lava Room",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground Underwater Silver Rupee Chest": "
+ can_use(Hookshot) and (can_play(Song_of_Time) or can_mega) and Iron_Boots"
+ },
+ "exits": {
+ "Gerudo Training Ground Central Maze Right": "can_play(Song_of_Time) or is_child
+ or (can_use(Hookshot) and can_use(Hover_Boots) and can_shield and Bombs)",
+ "Gerudo Training Ground Hammer Room": "can_use(Hookshot)"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Hammer Room",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground Hammer Room Clear Chest": "True",
+ "Gerudo Training Ground Hammer Room Switch Chest": "can_use(Megaton_Hammer) or
+ can_live_dmg(0.5) or can_use(Nayrus_Love)"
+ },
+ "exits": {
+ "Gerudo Training Ground Eye Statue Lower": "can_use(Bow)",
+ "Gerudo Training Ground Lava Room": "True"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Eye Statue Lower",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground Eye Statue Chest": "can_use(Bow)"
+ },
+ "exits": {
+ "Gerudo Training Ground Hammer Room": "True"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Eye Statue Upper",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground Near Scarecrow Chest": "can_use(Bow)"
+ },
+ "exits": {
+ "Gerudo Training Ground Eye Statue Lower": "True"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Heavy Block Room",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground Before Heavy Block Chest": "True",
+ "Gerudo Training Ground Heavy Block First Chest": "can_use(Silver_Gauntlets)",
+ "Gerudo Training Ground Heavy Block Second Chest": "can_use(Silver_Gauntlets)",
+ "Gerudo Training Ground Heavy Block Third Chest": "can_use(Silver_Gauntlets)",
+ "Gerudo Training Ground Heavy Block Fourth Chest": "can_use(Silver_Gauntlets)"
+ },
+ "exits": {
+ "Gerudo Training Ground Eye Statue Upper": "can_use(Hookshot) or can_hover or
+ (is_adult and (Hover_Boots or (can_shield and Bombs)))"
+ }
+ }
+]
diff --git a/worlds/oot/data/Glitched World/Gerudo Training Grounds MQ.json b/worlds/oot/data/Glitched World/Gerudo Training Grounds MQ.json
deleted file mode 100644
index 388d4b59bb..0000000000
--- a/worlds/oot/data/Glitched World/Gerudo Training Grounds MQ.json
+++ /dev/null
@@ -1,79 +0,0 @@
-[
- {
- "region_name": "Gerudo Training Grounds Lobby",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds MQ Lobby Left Chest": "True",
- "Gerudo Training Grounds MQ Lobby Right Chest": "True",
- "Gerudo Training Grounds MQ Hidden Ceiling Chest": "logic_lens_gtg_mq or can_use(Lens_of_Truth)",
- "Gerudo Training Grounds MQ Maze Path First Chest": "True",
- "Gerudo Training Grounds MQ Maze Path Second Chest": "True",
- "Gerudo Training Grounds MQ Maze Path Third Chest": "(Small_Key_Gerudo_Training_Grounds, 1)"
- },
- "exits": {
- "Gerudo Fortress": "True",
- "Gerudo Training Grounds Left Side": "has_fire_source",
- "Gerudo Training Grounds Right Side": "Bow"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Right Side",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds MQ Dinolfos Chest": "True",
- "Gerudo Training Grounds MQ Underwater Silver Rupee Chest": "
- (Hover_Boots or at('Gerudo Training Grounds Central Maze Right', can_use(Longshot) or Bow)) and
- has_fire_source and Iron_Boots and (logic_fewer_tunic_requirements or can_use(Zora_Tunic)) and
- can_take_damage",
- "Wall Fairy": "has_bottle and can_use(Bow)" #in the Dinalfos room shoot the Gerudo symbol above the door to the lava room.
- }
- },
- {
- "region_name": "Gerudo Training Grounds Left Side",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds MQ First Iron Knuckle Chest": "True"
- },
- "exits": {
- "Gerudo Training Grounds Stalfos Room": "can_use(Longshot) or (logic_gtg_mq_with_hookshot and can_use(Hookshot))"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Stalfos Room",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds MQ Before Heavy Block Chest": "True",
- "Gerudo Training Grounds MQ Heavy Block Chest": "can_use(Silver_Gauntlets)",
- "Blue Fire": "has_bottle"
- },
- "exits": {
- "Gerudo Training Grounds Back Areas": "can_play(Song_of_Time) and (logic_lens_gtg_mq or can_use(Lens_of_Truth)) and Blue_Fire"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Back Areas",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds MQ Eye Statue Chest": "Bow",
- "Gerudo Training Grounds MQ Second Iron Knuckle Chest": "True",
- "Gerudo Training Grounds MQ Flame Circle Chest": "True"
- },
- "exits": {
- "Gerudo Training Grounds Central Maze Right": "Megaton_Hammer",
- "Gerudo Training Grounds Right Side": "can_use(Longshot)"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Central Maze Right",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds MQ Maze Right Central Chest": "True",
- "Gerudo Training Grounds MQ Maze Right Side Chest": "True",
- "Gerudo Training Grounds MQ Ice Arrows Chest": "
- (Small_Key_Gerudo_Training_Grounds, 3)"
- },
- "exits": {
- "Gerudo Training Grounds Right Side": "True"
- }
- }
-]
diff --git a/worlds/oot/data/Glitched World/Gerudo Training Grounds.json b/worlds/oot/data/Glitched World/Gerudo Training Grounds.json
deleted file mode 100644
index 793c115b43..0000000000
--- a/worlds/oot/data/Glitched World/Gerudo Training Grounds.json
+++ /dev/null
@@ -1,112 +0,0 @@
-[
- {
- "region_name": "Gerudo Training Grounds Lobby",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds Lobby Left Chest": "can_use(Bow) or can_use(Slingshot)",
- "Gerudo Training Grounds Lobby Right Chest": "can_use(Bow) or can_use(Slingshot)",
- "Gerudo Training Grounds Stalfos Chest": "can_jumpslash",
- "Gerudo Training Grounds Beamos Chest": "has_explosives and can_jumpslash",
- "Wall Fairy": "has_bottle and can_use(Bow)" #in the Beamos room shoot the Gerudo symbol above the door to the lava room.
- },
- "exits": {
- "Gerudo Training Grounds Heavy Block Room": "True",
- "Gerudo Training Grounds Lava Room": "
- here(has_explosives and can_jumpslash)",
- "Gerudo Training Grounds Central Maze": "True"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Central Maze",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds Hidden Ceiling Chest": "(Small_Key_Gerudo_Training_Grounds, 3)
- or (can_use(Hookshot) and can_mega) or (is_child and has_explosives and (can_live_dmg(0.5) or can_use(Nayrus_Love)))",
- "Gerudo Training Grounds Maze Path First Chest": "(Small_Key_Gerudo_Training_Grounds, 4)
- or (can_use(Hookshot) and can_mega) or (is_child and has_explosives and (can_live_dmg(1.0) or can_use(Nayrus_Love)))",
- "Gerudo Training Grounds Maze Path Second Chest": "(Small_Key_Gerudo_Training_Grounds, 6)
- or (can_use(Hookshot) and can_mega) or (is_child and has_explosives and (can_live_dmg(1.0) or can_use(Nayrus_Love)))",
- "Gerudo Training Grounds Maze Path Third Chest": "(Small_Key_Gerudo_Training_Grounds, 7)
- or (can_use(Hookshot) and can_mega) or (is_child and has_explosives and (can_live_dmg(0.5) or can_use(Nayrus_Love)))",
- "Gerudo Training Grounds Maze Path Final Chest": "(Small_Key_Gerudo_Training_Grounds, 9)
- or (can_use(Hookshot) and can_mega) or (is_child and has_explosives and (can_live_dmg(0.5) or can_use(Nayrus_Love)))"
- },
- "exits": {
- "Gerudo Training Grounds Central Maze Right": "(Small_Key_Gerudo_Training_Grounds, 9)
- or (can_use(Hookshot) and can_mega) or (is_child and has_explosives)"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Central Maze Right",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds Maze Right Central Chest": "True",
- "Gerudo Training Grounds Maze Right Side Chest": "True",
- "Gerudo Training Grounds Freestanding Key": "True"
- },
- "exits": {
- "Gerudo Training Grounds Lava Room": "True"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Lava Room",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds Underwater Silver Rupee Chest": "
- can_use(Hookshot) and (can_play(Song_of_Time) or can_mega) and Iron_Boots"
- },
- "exits": {
- "Gerudo Training Grounds Central Maze Right": "can_play(Song_of_Time) or is_child
- or (can_use(Hookshot) and can_use(Hover_Boots) and can_shield and Bombs)",
- "Gerudo Training Grounds Hammer Room": "can_use(Hookshot)"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Hammer Room",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds Hammer Room Clear Chest": "True",
- "Gerudo Training Grounds Hammer Room Switch Chest": "can_use(Megaton_Hammer) or
- can_live_dmg(0.5) or can_use(Nayrus_Love)"
- },
- "exits": {
- "Gerudo Training Grounds Eye Statue Lower": "can_use(Bow)",
- "Gerudo Training Grounds Lava Room": "True"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Eye Statue Lower",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds Eye Statue Chest": "can_use(Bow)"
- },
- "exits": {
- "Gerudo Training Grounds Hammer Room": "True"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Eye Statue Upper",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds Near Scarecrow Chest": "can_use(Bow)"
- },
- "exits": {
- "Gerudo Training Grounds Eye Statue Lower": "True"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Heavy Block Room",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds Before Heavy Block Chest": "True",
- "Gerudo Training Grounds Heavy Block First Chest": "can_use(Silver_Gauntlets)",
- "Gerudo Training Grounds Heavy Block Second Chest": "can_use(Silver_Gauntlets)",
- "Gerudo Training Grounds Heavy Block Third Chest": "can_use(Silver_Gauntlets)",
- "Gerudo Training Grounds Heavy Block Fourth Chest": "can_use(Silver_Gauntlets)"
- },
- "exits": {
- "Gerudo Training Grounds Eye Statue Upper": "can_use(Hookshot) or can_hover or
- (is_adult and (Hover_Boots or (can_shield and Bombs)))"
- }
- }
-]
diff --git a/worlds/oot/data/Glitched World/Overworld.json b/worlds/oot/data/Glitched World/Overworld.json
index 056aa9eea3..f47c85a0b3 100644
--- a/worlds/oot/data/Glitched World/Overworld.json
+++ b/worlds/oot/data/Glitched World/Overworld.json
@@ -324,18 +324,18 @@
Gerudo_Membership_Card and can_ride_epona and Bow and is_adult",
"GF HBA 1500 Points": "
Gerudo_Membership_Card and can_ride_epona and Bow and is_adult",
- "GF North F1 Carpenter": "is_adult or (is_child and can_child_damage)",
- "GF North F2 Carpenter": "is_adult or (is_child and can_child_damage)",
- "GF South F1 Carpenter": "is_adult or (is_child and can_child_damage)",
- "GF South F2 Carpenter": "is_adult or (is_child and can_child_damage)",
- "GF Gerudo Membership Card": "can_finish_GerudoFortress",
+ "Hideout Jail Guard (1 Torch)": "is_adult or (is_child and can_child_damage)",
+ "Hideout Jail Guard (2 Torches)": "is_adult or (is_child and can_child_damage)",
+ "Hideout Jail Guard (3 Torches)": "is_adult or (is_child and can_child_damage)",
+ "Hideout Jail Guard (4 Torches)": "is_adult or (is_child and can_child_damage)",
+ "Hideout Gerudo Membership Card": "can_finish_GerudoFortress",
"GF GS Archery Range": "can_use(Hookshot) and at_night",
"GF GS Top Floor": "at_night and is_adult"
},
"exits": {
"Haunted Wasteland": "is_child or 'GF Gate Open' or
((Progressive_Hookshot and (Hover_Boots or can_mega)) or (can_isg and Bombs) )",
- "Gerudo Training Grounds Lobby": "True"
+ "Gerudo Training Ground Lobby": "True"
}
},
{
@@ -707,7 +707,7 @@
},
"exits": {
"Graveyard Shield Grave": "True",
- "Graveyard Composers Grave": "can_play(Zeldas_Lullaby) or at('Graveyard Warp Pad Region', True)",
+ "Graveyard Royal Familys Tomb": "can_play(Zeldas_Lullaby) or at('Graveyard Warp Pad Region', True)",
"Graveyard Heart Piece Grave": "True",
"Graveyard Dampes Grave": "is_adult or at('Graveyard Warp Pad Region', True)",
"Graveyard Dampes House": "True",
@@ -728,10 +728,10 @@
}
},
{
- "region_name": "Graveyard Composers Grave",
+ "region_name": "Graveyard Royal Familys Tomb",
"locations": {
- "Graveyard Composers Grave Chest": "has_fire_source or (is_child and Sticks and (can_live_dmg(0.75) or can_use(Nayrus_Love)))",
- "Song from Composers Grave": "
+ "Graveyard Royal Familys Tomb Chest": "has_fire_source or (is_child and Sticks and (can_live_dmg(0.75) or can_use(Nayrus_Love)))",
+ "Song from Royal Familys Tomb": "
is_adult or
(Slingshot or Boomerang or Sticks or
has_explosives or Kokiri_Sword)"
diff --git a/worlds/oot/data/LogicHelpers.json b/worlds/oot/data/LogicHelpers.json
index c1766a1e99..099aa2ea63 100644
--- a/worlds/oot/data/LogicHelpers.json
+++ b/worlds/oot/data/LogicHelpers.json
@@ -83,8 +83,8 @@
"has_fire_source_with_torch": "has_fire_source or (is_child and Sticks)",
# Gerudo Fortress
- "can_finish_GerudoFortress": "(gerudo_fortress == 'normal' and (Small_Key_Gerudo_Fortress, 4) and (is_adult or Kokiri_Sword or is_glitched) and (is_adult and (Bow or Hookshot or Hover_Boots) or Gerudo_Membership_Card or logic_gerudo_kitchen or is_glitched))
- or (gerudo_fortress == 'fast' and Small_Key_Gerudo_Fortress and (is_adult or Kokiri_Sword or is_glitched))
+ "can_finish_GerudoFortress": "(gerudo_fortress == 'normal' and (Small_Key_Thieves_Hideout, 4) and (is_adult or Kokiri_Sword or is_glitched) and (is_adult and (Bow or Hookshot or Hover_Boots) or Gerudo_Membership_Card or logic_gerudo_kitchen or is_glitched))
+ or (gerudo_fortress == 'fast' and Small_Key_Thieves_Hideout and (is_adult or Kokiri_Sword or is_glitched))
or (gerudo_fortress != 'normal' and gerudo_fortress != 'fast')",
# Mirror shield does not count because it cannot reflect scrub attack.
"has_shield": "(is_adult and Hylian_Shield) or (is_child and Deku_Shield)",
diff --git a/worlds/oot/data/World/Deku Tree MQ.json b/worlds/oot/data/World/Deku Tree MQ.json
index 3fbafc3587..e5fc840ed5 100644
--- a/worlds/oot/data/World/Deku Tree MQ.json
+++ b/worlds/oot/data/World/Deku Tree MQ.json
@@ -32,7 +32,7 @@
(can_use(Hookshot) or can_use(Boomerang)) and
here(has_bombchus or
(Bombs and (can_play(Song_of_Time) or is_adult)) or
- (can_use(Hammer) and (can_play(Song_of_Time) or logic_deku_mq_compass_gs)))"
+ (can_use(Megaton_Hammer) and (can_play(Song_of_Time) or logic_deku_mq_compass_gs)))"
},
"exits": {
"Deku Tree Lobby": "True"
diff --git a/worlds/oot/data/World/Dodongos Cavern MQ.json b/worlds/oot/data/World/Dodongos Cavern MQ.json
index 298604befe..cd466cc677 100644
--- a/worlds/oot/data/World/Dodongos Cavern MQ.json
+++ b/worlds/oot/data/World/Dodongos Cavern MQ.json
@@ -41,7 +41,7 @@
(logic_dc_mq_eyes and Progressive_Strength_Upgrade and
(is_adult or logic_dc_mq_child_back) and
(here(can_use(Sticks)) or can_use(Dins_Fire) or
- (is_adult and (logic_dc_jump or Hammer or Hover_Boots or Hookshot))))"
+ (is_adult and (logic_dc_jump or Megaton_Hammer or Hover_Boots or Hookshot))))"
}
},
{
diff --git a/worlds/oot/data/World/Forest Temple MQ.json b/worlds/oot/data/World/Forest Temple MQ.json
index a259412256..4050a6fb6f 100644
--- a/worlds/oot/data/World/Forest Temple MQ.json
+++ b/worlds/oot/data/World/Forest Temple MQ.json
@@ -33,8 +33,7 @@
is_adult and (Progressive_Strength_Upgrade or
(logic_forest_mq_block_puzzle and has_bombchus and can_use(Hookshot)))",
"Forest Temple Outdoor Ledge": "
- (logic_forest_mq_hallway_switch_jumpslash and can_use(Hover_Boots)) or
- (logic_forest_mq_hallway_switch_hookshot and can_use(Hookshot))",
+ (logic_forest_mq_hallway_switch_jumpslash and can_use(Hover_Boots))",
"Forest Temple Boss Region": "
Forest_Temple_Jo_and_Beth and Forest_Temple_Amy_and_Meg"
}
diff --git a/worlds/oot/data/World/Gerudo Training Ground MQ.json b/worlds/oot/data/World/Gerudo Training Ground MQ.json
new file mode 100644
index 0000000000..98c68b8707
--- /dev/null
+++ b/worlds/oot/data/World/Gerudo Training Ground MQ.json
@@ -0,0 +1,98 @@
+[
+ {
+ "region_name": "Gerudo Training Ground Lobby",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground MQ Lobby Left Chest": "True",
+ "Gerudo Training Ground MQ Lobby Right Chest": "True",
+ "Gerudo Training Ground MQ Hidden Ceiling Chest": "logic_lens_gtg_mq or can_use(Lens_of_Truth)",
+ "Gerudo Training Ground MQ Maze Path First Chest": "True",
+ "Gerudo Training Ground MQ Maze Path Second Chest": "True",
+ "Gerudo Training Ground MQ Maze Path Third Chest": "(Small_Key_Gerudo_Training_Ground, 1)"
+ },
+ "exits": {
+ "Gerudo Fortress": "True",
+ "Gerudo Training Ground Left Side": "here(has_fire_source)",
+ "Gerudo Training Ground Right Side": "here(can_use(Bow) or can_use(Slingshot))"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Right Side",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground MQ Dinolfos Chest": "is_adult",
+ "Wall Fairy": "has_bottle and can_use(Bow)" #in the Dinalfos room shoot the Gerudo symbol above the door to the lava room.
+ },
+ "exits": {
+ # Still requires has_fire_source in the room
+ "Gerudo Training Ground Underwater": "
+ (Bow or can_use(Longshot)) and can_use(Hover_Boots)"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Underwater",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground MQ Underwater Silver Rupee Chest": "
+ has_fire_source and can_use(Iron_Boots) and
+ (logic_fewer_tunic_requirements or can_use(Zora_Tunic)) and can_take_damage"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Left Side",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground MQ First Iron Knuckle Chest": "is_adult or Kokiri_Sword or has_explosives"
+ },
+ "exits": {
+ "Gerudo Training Ground Stalfos Room": "
+ can_use(Longshot) or logic_gtg_mq_without_hookshot or
+ (logic_gtg_mq_with_hookshot and can_use(Hookshot))"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Stalfos Room",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ # Very difficult to fight the Stalfos and Stulltulas under the time limit as child.
+ "Gerudo Training Ground MQ Before Heavy Block Chest": "is_adult",
+ "Gerudo Training Ground MQ Heavy Block Chest": "can_use(Silver_Gauntlets)",
+ "Blue Fire": "has_bottle"
+ },
+ "exits": {
+ "Gerudo Training Ground Back Areas": "
+ is_adult and (logic_lens_gtg_mq or can_use(Lens_of_Truth)) and Blue_Fire and
+ (can_play(Song_of_Time) or (logic_gtg_fake_wall and can_use(Hover_Boots)))"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Back Areas",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground MQ Eye Statue Chest": "Bow",
+ "Gerudo Training Ground MQ Second Iron Knuckle Chest": "True",
+ "Gerudo Training Ground MQ Flame Circle Chest": "can_use(Hookshot) or Bow or has_explosives"
+ },
+ "exits": {
+ "Gerudo Training Ground Central Maze Right": "Megaton_Hammer",
+ "Gerudo Training Ground Right Side": "can_use(Longshot)"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Central Maze Right",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground MQ Maze Right Central Chest": "True",
+ "Gerudo Training Ground MQ Maze Right Side Chest": "True",
+ # The switch that opens the door to the Ice Arrows chest can be hit with a precise jumpslash.
+ "Gerudo Training Ground MQ Ice Arrows Chest": "
+ (Small_Key_Gerudo_Training_Ground, 3)"
+ },
+ "exits": {
+ # guarantees fire with torch
+ "Gerudo Training Ground Underwater": "
+ can_use(Longshot) or (can_use(Hookshot) and Bow)",
+ "Gerudo Training Ground Right Side": "can_use(Hookshot)"
+ }
+ }
+]
diff --git a/worlds/oot/data/World/Gerudo Training Ground.json b/worlds/oot/data/World/Gerudo Training Ground.json
new file mode 100644
index 0000000000..dfaed49a8c
--- /dev/null
+++ b/worlds/oot/data/World/Gerudo Training Ground.json
@@ -0,0 +1,120 @@
+[
+ {
+ "region_name": "Gerudo Training Ground Lobby",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground Lobby Left Chest": "can_use(Bow) or can_use(Slingshot)",
+ "Gerudo Training Ground Lobby Right Chest": "can_use(Bow) or can_use(Slingshot)",
+ "Gerudo Training Ground Stalfos Chest": "is_adult or Kokiri_Sword",
+ "Gerudo Training Ground Beamos Chest": "has_explosives and (is_adult or Kokiri_Sword)",
+ "Wall Fairy": "has_bottle and can_use(Bow)" #in the Beamos room shoot the Gerudo symbol above the door to the lava room.
+ },
+ "exits": {
+ "Gerudo Fortress": "True",
+ "Gerudo Training Ground Heavy Block Room": "
+ (is_adult or Kokiri_Sword) and
+ (can_use(Hookshot) or logic_gtg_without_hookshot)",
+ "Gerudo Training Ground Lava Room": "
+ here(has_explosives and (is_adult or Kokiri_Sword))",
+ "Gerudo Training Ground Central Maze": "True"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Central Maze",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground Hidden Ceiling Chest": "(Small_Key_Gerudo_Training_Ground, 3) and (logic_lens_gtg or can_use(Lens_of_Truth))",
+ "Gerudo Training Ground Maze Path First Chest": "(Small_Key_Gerudo_Training_Ground, 4)",
+ "Gerudo Training Ground Maze Path Second Chest": "(Small_Key_Gerudo_Training_Ground, 6)",
+ "Gerudo Training Ground Maze Path Third Chest": "(Small_Key_Gerudo_Training_Ground, 7)",
+ "Gerudo Training Ground Maze Path Final Chest": "(Small_Key_Gerudo_Training_Ground, 9)"
+ },
+ "exits": {
+ "Gerudo Training Ground Central Maze Right": "(Small_Key_Gerudo_Training_Ground, 9)"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Central Maze Right",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground Maze Right Central Chest": "True",
+ "Gerudo Training Ground Maze Right Side Chest": "True",
+ "Gerudo Training Ground Freestanding Key": "True"
+ },
+ "exits": {
+ "Gerudo Training Ground Hammer Room": "can_use(Hookshot)",
+ "Gerudo Training Ground Lava Room": "True"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Lava Room",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground Underwater Silver Rupee Chest": "
+ can_use(Hookshot) and can_play(Song_of_Time) and Iron_Boots and
+ (logic_fewer_tunic_requirements or can_use(Zora_Tunic))"
+ },
+ "exits": {
+ "Gerudo Training Ground Central Maze Right": "can_play(Song_of_Time) or is_child",
+ "Gerudo Training Ground Hammer Room": "
+ can_use(Longshot) or (can_use(Hookshot) and can_use(Hover_Boots))"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Hammer Room",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground Hammer Room Clear Chest": "True",
+ "Gerudo Training Ground Hammer Room Switch Chest": "can_use(Megaton_Hammer)"
+ },
+ "exits": {
+ "Gerudo Training Ground Eye Statue Lower": "can_use(Megaton_Hammer) and Bow",
+ "Gerudo Training Ground Lava Room": "True"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Eye Statue Lower",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground Eye Statue Chest": "can_use(Bow)"
+ },
+ "exits": {
+ "Gerudo Training Ground Hammer Room": "True"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Eye Statue Upper",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground Near Scarecrow Chest": "can_use(Bow)"
+ },
+ "exits": {
+ "Gerudo Training Ground Eye Statue Lower": "True"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Heavy Block Room",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground Before Heavy Block Chest": "True"
+ },
+ "exits": {
+ "Gerudo Training Ground Eye Statue Upper": "
+ (logic_lens_gtg or can_use(Lens_of_Truth)) and
+ (can_use(Hookshot) or (logic_gtg_fake_wall and can_use(Hover_Boots)))",
+ "Gerudo Training Ground Like Like Room": "
+ can_use(Silver_Gauntlets) and (logic_lens_gtg or can_use(Lens_of_Truth)) and
+ (can_use(Hookshot) or (logic_gtg_fake_wall and can_use(Hover_Boots)))"
+ }
+ },
+ {
+ "region_name": "Gerudo Training Ground Like Like Room",
+ "dungeon": "Gerudo Training Ground",
+ "locations": {
+ "Gerudo Training Ground Heavy Block First Chest": "True",
+ "Gerudo Training Ground Heavy Block Second Chest": "True",
+ "Gerudo Training Ground Heavy Block Third Chest": "True",
+ "Gerudo Training Ground Heavy Block Fourth Chest": "True"
+ }
+ }
+]
diff --git a/worlds/oot/data/World/Gerudo Training Grounds MQ.json b/worlds/oot/data/World/Gerudo Training Grounds MQ.json
deleted file mode 100644
index 34dc2f2f3d..0000000000
--- a/worlds/oot/data/World/Gerudo Training Grounds MQ.json
+++ /dev/null
@@ -1,98 +0,0 @@
-[
- {
- "region_name": "Gerudo Training Grounds Lobby",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds MQ Lobby Left Chest": "True",
- "Gerudo Training Grounds MQ Lobby Right Chest": "True",
- "Gerudo Training Grounds MQ Hidden Ceiling Chest": "logic_lens_gtg_mq or can_use(Lens_of_Truth)",
- "Gerudo Training Grounds MQ Maze Path First Chest": "True",
- "Gerudo Training Grounds MQ Maze Path Second Chest": "True",
- "Gerudo Training Grounds MQ Maze Path Third Chest": "(Small_Key_Gerudo_Training_Grounds, 1)"
- },
- "exits": {
- "Gerudo Fortress": "True",
- "Gerudo Training Grounds Left Side": "here(has_fire_source)",
- "Gerudo Training Grounds Right Side": "here(can_use(Bow) or can_use(Slingshot))"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Right Side",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds MQ Dinolfos Chest": "is_adult",
- "Wall Fairy": "has_bottle and can_use(Bow)" #in the Dinalfos room shoot the Gerudo symbol above the door to the lava room.
- },
- "exits": {
- # Still requires has_fire_source in the room
- "Gerudo Training Grounds Underwater": "
- (Bow or can_use(Longshot)) and can_use(Hover_Boots)"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Underwater",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds MQ Underwater Silver Rupee Chest": "
- has_fire_source and can_use(Iron_Boots) and
- (logic_fewer_tunic_requirements or can_use(Zora_Tunic)) and can_take_damage"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Left Side",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds MQ First Iron Knuckle Chest": "is_adult or Kokiri_Sword or has_explosives"
- },
- "exits": {
- "Gerudo Training Grounds Stalfos Room": "
- can_use(Longshot) or logic_gtg_mq_without_hookshot or
- (logic_gtg_mq_with_hookshot and can_use(Hookshot))"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Stalfos Room",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- # Very difficult to fight the Stalfos and Stulltulas under the time limit as child.
- "Gerudo Training Grounds MQ Before Heavy Block Chest": "is_adult",
- "Gerudo Training Grounds MQ Heavy Block Chest": "can_use(Silver_Gauntlets)",
- "Blue Fire": "has_bottle"
- },
- "exits": {
- "Gerudo Training Grounds Back Areas": "
- is_adult and (logic_lens_gtg_mq or can_use(Lens_of_Truth)) and Blue_Fire and
- (can_play(Song_of_Time) or (logic_gtg_fake_wall and can_use(Hover_Boots)))"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Back Areas",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds MQ Eye Statue Chest": "Bow",
- "Gerudo Training Grounds MQ Second Iron Knuckle Chest": "True",
- "Gerudo Training Grounds MQ Flame Circle Chest": "can_use(Hookshot) or Bow or has_explosives"
- },
- "exits": {
- "Gerudo Training Grounds Central Maze Right": "Megaton_Hammer",
- "Gerudo Training Grounds Right Side": "can_use(Longshot)"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Central Maze Right",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds MQ Maze Right Central Chest": "True",
- "Gerudo Training Grounds MQ Maze Right Side Chest": "True",
- # The switch that opens the door to the Ice Arrows chest can be hit with a precise jumpslash.
- "Gerudo Training Grounds MQ Ice Arrows Chest": "
- (Small_Key_Gerudo_Training_Grounds, 3)"
- },
- "exits": {
- # guarantees fire with torch
- "Gerudo Training Grounds Underwater": "
- can_use(Longshot) or (can_use(Hookshot) and Bow)",
- "Gerudo Training Grounds Right Side": "can_use(Hookshot)"
- }
- }
-]
diff --git a/worlds/oot/data/World/Gerudo Training Grounds.json b/worlds/oot/data/World/Gerudo Training Grounds.json
deleted file mode 100644
index a5b4f940dd..0000000000
--- a/worlds/oot/data/World/Gerudo Training Grounds.json
+++ /dev/null
@@ -1,120 +0,0 @@
-[
- {
- "region_name": "Gerudo Training Grounds Lobby",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds Lobby Left Chest": "can_use(Bow) or can_use(Slingshot)",
- "Gerudo Training Grounds Lobby Right Chest": "can_use(Bow) or can_use(Slingshot)",
- "Gerudo Training Grounds Stalfos Chest": "is_adult or Kokiri_Sword",
- "Gerudo Training Grounds Beamos Chest": "has_explosives and (is_adult or Kokiri_Sword)",
- "Wall Fairy": "has_bottle and can_use(Bow)" #in the Beamos room shoot the Gerudo symbol above the door to the lava room.
- },
- "exits": {
- "Gerudo Fortress": "True",
- "Gerudo Training Grounds Heavy Block Room": "
- (is_adult or Kokiri_Sword) and
- (can_use(Hookshot) or logic_gtg_without_hookshot)",
- "Gerudo Training Grounds Lava Room": "
- here(has_explosives and (is_adult or Kokiri_Sword))",
- "Gerudo Training Grounds Central Maze": "True"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Central Maze",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds Hidden Ceiling Chest": "(Small_Key_Gerudo_Training_Grounds, 3) and (logic_lens_gtg or can_use(Lens_of_Truth))",
- "Gerudo Training Grounds Maze Path First Chest": "(Small_Key_Gerudo_Training_Grounds, 4)",
- "Gerudo Training Grounds Maze Path Second Chest": "(Small_Key_Gerudo_Training_Grounds, 6)",
- "Gerudo Training Grounds Maze Path Third Chest": "(Small_Key_Gerudo_Training_Grounds, 7)",
- "Gerudo Training Grounds Maze Path Final Chest": "(Small_Key_Gerudo_Training_Grounds, 9)"
- },
- "exits": {
- "Gerudo Training Grounds Central Maze Right": "(Small_Key_Gerudo_Training_Grounds, 9)"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Central Maze Right",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds Maze Right Central Chest": "True",
- "Gerudo Training Grounds Maze Right Side Chest": "True",
- "Gerudo Training Grounds Freestanding Key": "True"
- },
- "exits": {
- "Gerudo Training Grounds Hammer Room": "can_use(Hookshot)",
- "Gerudo Training Grounds Lava Room": "True"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Lava Room",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds Underwater Silver Rupee Chest": "
- can_use(Hookshot) and can_play(Song_of_Time) and Iron_Boots and
- (logic_fewer_tunic_requirements or can_use(Zora_Tunic))"
- },
- "exits": {
- "Gerudo Training Grounds Central Maze Right": "can_play(Song_of_Time) or is_child",
- "Gerudo Training Grounds Hammer Room": "
- can_use(Longshot) or (can_use(Hookshot) and can_use(Hover_Boots))"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Hammer Room",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds Hammer Room Clear Chest": "True",
- "Gerudo Training Grounds Hammer Room Switch Chest": "can_use(Megaton_Hammer)"
- },
- "exits": {
- "Gerudo Training Grounds Eye Statue Lower": "can_use(Megaton_Hammer) and Bow",
- "Gerudo Training Grounds Lava Room": "True"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Eye Statue Lower",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds Eye Statue Chest": "can_use(Bow)"
- },
- "exits": {
- "Gerudo Training Grounds Hammer Room": "True"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Eye Statue Upper",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds Near Scarecrow Chest": "can_use(Bow)"
- },
- "exits": {
- "Gerudo Training Grounds Eye Statue Lower": "True"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Heavy Block Room",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds Before Heavy Block Chest": "True"
- },
- "exits": {
- "Gerudo Training Grounds Eye Statue Upper": "
- (logic_lens_gtg or can_use(Lens_of_Truth)) and
- (can_use(Hookshot) or (logic_gtg_fake_wall and can_use(Hover_Boots)))",
- "Gerudo Training Grounds Like Like Room": "
- can_use(Silver_Gauntlets) and (logic_lens_gtg or can_use(Lens_of_Truth)) and
- (can_use(Hookshot) or (logic_gtg_fake_wall and can_use(Hover_Boots)))"
- }
- },
- {
- "region_name": "Gerudo Training Grounds Like Like Room",
- "dungeon": "Gerudo Training Grounds",
- "locations": {
- "Gerudo Training Grounds Heavy Block First Chest": "True",
- "Gerudo Training Grounds Heavy Block Second Chest": "True",
- "Gerudo Training Grounds Heavy Block Third Chest": "True",
- "Gerudo Training Grounds Heavy Block Fourth Chest": "True"
- }
- }
-]
diff --git a/worlds/oot/data/World/Overworld.json b/worlds/oot/data/World/Overworld.json
index fa01ab6072..fca10a7a8b 100644
--- a/worlds/oot/data/World/Overworld.json
+++ b/worlds/oot/data/World/Overworld.json
@@ -589,14 +589,14 @@
Gerudo_Membership_Card and can_ride_epona and Bow and at_day",
"GF HBA 1500 Points": "
Gerudo_Membership_Card and can_ride_epona and Bow and at_day",
- "GF North F1 Carpenter": "is_adult or Kokiri_Sword",
- "GF North F2 Carpenter": "
+ "Hideout Jail Guard (1 Torch)": "is_adult or Kokiri_Sword",
+ "Hideout Jail Guard (2 Torches)": "is_adult or Kokiri_Sword",
+ "Hideout Jail Guard (3 Torches)": "
(is_adult or Kokiri_Sword) and
(Gerudo_Membership_Card or can_use(Bow) or can_use(Hookshot)
or can_use(Hover_Boots) or logic_gerudo_kitchen)",
- "GF South F1 Carpenter": "is_adult or Kokiri_Sword",
- "GF South F2 Carpenter": "is_adult or Kokiri_Sword",
- "GF Gerudo Membership Card": "can_finish_GerudoFortress",
+ "Hideout Jail Guard (4 Torches)": "is_adult or Kokiri_Sword",
+ "Hideout Gerudo Membership Card": "can_finish_GerudoFortress",
"GF GS Archery Range": "
can_use(Hookshot) and Gerudo_Membership_Card and at_night",
"GF GS Top Floor": "
@@ -607,7 +607,7 @@
"exits": {
"GV Fortress Side": "True",
"GF Outside Gate": "'GF Gate Open'",
- "Gerudo Training Grounds Lobby": "Gerudo_Membership_Card and is_adult",
+ "Gerudo Training Ground Lobby": "Gerudo_Membership_Card and is_adult",
"GF Storms Grotto": "is_adult and can_open_storm_grotto" # Not there as child
}
},
@@ -1290,7 +1290,7 @@
},
"exits": {
"Graveyard Shield Grave": "is_adult or at_night",
- "Graveyard Composers Grave": "can_play(Zeldas_Lullaby)",
+ "Graveyard Royal Familys Tomb": "can_play(Zeldas_Lullaby)",
"Graveyard Heart Piece Grave": "is_adult or at_night",
"Graveyard Dampes Grave": "is_adult",
"Graveyard Dampes House": "is_adult or at_dampe_time",
@@ -1321,12 +1321,12 @@
}
},
{
- "region_name": "Graveyard Composers Grave",
- "pretty_name": "the Composers' Grave",
- "scene": "Graveyard Composers Grave",
+ "region_name": "Graveyard Royal Familys Tomb",
+ "pretty_name": "the Royal Family's Tomb",
+ "scene": "Graveyard Royal Familys Tomb",
"locations": {
- "Graveyard Composers Grave Chest": "has_fire_source",
- "Song from Composers Grave": "
+ "Graveyard Royal Familys Tomb Chest": "has_fire_source",
+ "Song from Royal Familys Tomb": "
is_adult or
(Slingshot or Boomerang or Sticks or
has_explosives or Kokiri_Sword)"
diff --git a/worlds/oot/data/generated/rom_patch.txt b/worlds/oot/data/generated/rom_patch.txt
index 78e8e76f98..0d78b0bf0c 100644
--- a/worlds/oot/data/generated/rom_patch.txt
+++ b/worlds/oot/data/generated/rom_patch.txt
@@ -1,7 +1,7 @@
-10,107b723a
-14,b03a17fc
+10,107b6b7a
+14,368db766
d1b0,3480000
-d1b4,348ef80
+d1b4,348f330
d1b8,3480000
d1c0,0
d1c4,0
@@ -186,23 +186,23 @@ d288,0
89ebe8,0
89ebec,0
89ebf0,0
-a88f78,c102366
-a89048,c10237f
-a98c30,c1003c6
-a9e838,810077c
-ac7ad4,c100346
+a88f78,c1023ae
+a89048,c1023c7
+a98c30,c1003cb
+a9e838,8100781
+ac7ad4,c10034b
ac8608,902025
ac860c,848e00a4
ac8610,34010043
ac8614,0
ac8618,0
ac91b4,0
-ac9abc,c100407
+ac9abc,c10040c
ac9ac0,0
-accd34,c1004c1
+accd34,c1004c6
accd38,8e190000
-accde0,c101b73
-acce18,c1008d6
+accde0,c101bac
+acce18,c1008db
acce1c,8e0200a4
acce20,1060001e
acce24,0
@@ -211,7 +211,7 @@ acce2c,0
acce34,0
acce38,0
acce3c,0
-acce88,c101a37
+acce88,c101a70
acce8c,34040001
acce90,0
acce94,0
@@ -229,45 +229,45 @@ adaa78,0
adaba8,0
adabcc,0
adabe4,0
-ae5764,81006a2
+ae5764,81006a7
ae5768,0
-ae59e0,81006be
-ae5df8,c1003ff
+ae59e0,81006c3
+ae5df8,c100404
ae5e04,0
ae74d8,340e0000
ae807c,6010007
ae8080,84b80030
-ae8084,c100b2d
+ae8084,c100b29
ae8088,0
ae8090,0
ae8094,0
ae8098,0
-ae986c,8100b0d
+ae986c,8100b09
ae9870,3c01800f
ae9ed8,35ee0000
-aeb67c,c1009b3
+aeb67c,c1009b8
aeb680,0
aeb764,26380008
aeb768,ae9802b0
-aeb76c,c101daf
+aeb76c,c101de8
aeb778,400821
-af1814,c100e6e
+af1814,c100e6a
af1818,0
af74f8,afbf0044
-af74fc,c100a3e
+af74fc,c100a3a
af7500,0
af7504,8fbf0044
af7650,afbf0034
-af7654,c100a4c
+af7654,c100a48
af7658,0
af765c,8fbf0034
af76b8,afbf000c
-af76bc,c100a33
+af76bc,c100a2f
af76c4,8fbf000c
b06400,820f0ede
b0640c,31f80002
b06bb8,34190000
-b06c2c,c1007bd
+b06c2c,c1007c2
b06c30,a2280020
b10218,afa40020
b1021c,30a8fffe
@@ -319,22 +319,23 @@ b10320,242983fc
b10324,242a82c4
b10328,242b83e4
b1032c,242c83d8
-b10cc0,c1004a9
+b10cc0,c1004ae
b10cc4,3c010001
-b12a34,c100655
+b12a34,c10065a
b12a38,0
-b12a60,8101f93
-b12e44,8101fa2
+b12a60,8101fca
+b12e30,c101fdb
+b12e44,8101fea
b17bb4,afbf001c
b17bb8,afa40140
b17bbc,3c048040
-b17bc0,3406ef80
+b17bc0,3406f330
b17bc4,c00037c
b17bc8,3c050348
-b17bcc,c100339
+b17bcc,c10033e
b17bd0,0
b17bd4,0
-b2b488,c100bf8
+b2b488,c100bf4
b2b48c,0
b2b490,0
b2b494,0
@@ -343,7 +344,7 @@ b2b49c,0
b2b4f0,3c048013
b2b4f4,24848a50
b2b4f8,3c058040
-b2b4fc,24a52fc0
+b2b4fc,24a52fb0
b2b500,c015c0c
b2b504,34060018
b2b508,3c048013
@@ -364,53 +365,53 @@ b2e830,8ca5b188
b2e854,3c058001
b2e858,8ca5b198
b3dd3c,3c018040
-b3dd40,8c242fd8
+b3dd40,8c242fc8
b3dd44,c02e195
-b3dd48,8c252fdc
+b3dd48,8c252fcc
b3dd4c,8fbf0014
b3dd54,27bd0018
-b51694,c1007d0
-b516c4,c1007d7
-b52784,c1007f1
+b51694,c1007d5
+b516c4,c1007dc
+b52784,c1007f6
b52788,0
b5278c,8fbf003c
b5293c,10000018
-b54b38,c10076b
-b54e5c,c100758
+b54b38,c100770
+b54e5c,c10075d
b55428,a42063ed
-b55a64,c1007a2
+b55a64,c1007a7
b575c8,acae0000
b58320,afbf0000
-b58324,c1009f8
+b58324,c1009f4
b58328,0
b5832c,8fbf0000
b58330,0
b7ec4c,8009a3ac
-ba16ac,c100ce2
+ba16ac,c100cde
ba16b0,a42fca2a
-ba16e0,c100ced
+ba16e0,c100ce9
ba16e4,a439ca2a
ba18c4,340c00c8
ba1980,340800c8
ba19dc,0
-ba1c68,c100cf8
+ba1c68,c100cf4
ba1c6c,a42dca2a
ba1c70,850e4a38
-ba1cd0,c100d03
+ba1cd0,c100cff
ba1cd4,a439ca2a
-ba1d04,c100d0e
+ba1d04,c100d0a
ba1d08,0
ba1e20,340d00c8
-ba32cc,c100d19
+ba32cc,c100d15
ba32d0,a439ca2a
-ba3300,c100d24
+ba3300,c100d20
ba3304,a42bca2a
ba34dc,341800c8
ba3654,0
ba39d0,340d00c8
-baa168,c100ccc
+baa168,c100cc8
baa16c,a42eca2a
-baa198,c100cd7
+baa198,c100cd3
baa19c,a42dca2a
baa3ac,a07025
bac064,7821
@@ -421,10 +422,10 @@ bae5a4,a46b4a6c
bae5c8,0
bae864,0
baed6c,0
-baf4f4,c100d2f
+baf4f4,c100d2b
baf4f8,2002025
baf738,102825
-baf73c,c101877
+baf73c,c101850
baf740,330400ff
baf744,8fb00018
baf748,8fbf001c
@@ -456,91 +457,92 @@ bb6134,0
bb6138,0
bb61e0,0
bb61e4,0
-bb6688,c100664
+bb6688,c100669
bb668c,0
-bb67c4,c100664
+bb67c4,c100669
bb67c8,1826021
-bb6cf0,c100693
+bb6cf0,c100698
bb6cf4,0
bb77b4,0
bb7894,0
bb7ba0,0
bb7bfc,0
-bb7c88,c10065e
+bb7c88,c100663
bb7c8c,1cf8821
-bb7d10,c10065e
+bb7d10,c100663
bb7d14,0
-bc088c,c100671
+bc088c,c100676
bc0890,0
-bcdbd8,c100d41
-bcecbc,8100377
+bcdbd8,c100d3d
+bcecbc,810037c
bcecc0,0
bcecc4,0
bcecc8,0
bceccc,0
bcecd0,0
bcf73c,afbf0000
-bcf740,c10080f
+bcf740,c100814
bcf744,0
bcf748,8fbf0000
-bcf914,c100807
+bcf914,c10080c
bcf918,0
-bd4c58,c100ba1
+bd4c58,c100b9d
bd4c5c,270821
-bd5c58,c1005c0
+bd5c58,c1005c5
bd5c5c,301c825
-bd6958,c100a29
+bd6958,c100a25
bd695c,0
-bd9a04,c1009d9
+bd9a04,c1009d5
bd9a08,0
-bda0a0,c10034a
-bda0d8,c100367
+bda0a0,c10034f
+bda0d8,c10036c
bda0e4,0
-bda264,c10036a
+bda264,c10036f
bda270,0
-bda2e8,c100385
+bda2e8,c10038a
bda2ec,812a0002
bda2f0,5600018
bda2f4,0
-be1bc8,c1005d1
+be1bc8,c1005d6
be1bcc,afa50034
be1c98,3c014218
-be4a14,c100e1c
-be4a40,c100e36
-be4a60,8100e4e
+be4a14,c100e18
+be4a40,c100e32
+be4a60,8100e4a
be4a64,0
-be5d8c,c100e78
+be5d8c,c100e74
be5d90,0
-be9ac0,c1003a1
-be9ad8,c1003ac
+be9ac0,c1003a6
+be9ad8,c1003b1
be9adc,8fa20024
be9ae4,8fa40028
be9bdc,24018383
-bea044,c100485
+bea044,c10048a
bea048,0
-c004ec,81005fa
+c004ec,81005ff
c0067c,28610064
c0082c,340e0018
c00830,8c4f00a0
-c01078,c100844
+c01078,c100849
c0107c,0
c01080,0
c01084,0
c01088,0
c0108c,0
-c018a0,c10060f
-c064bc,c1009bd
-c06e5c,c1009bd
-c0722c,c1009bd
-c07230,add80008
-c07494,c1009bd
-c075a8,c1009c8
-c07648,c1009c8
-c0e77c,c1007b7
+c018a0,c100614
+c06198,c1009c2
+c064bc,920201ec
+c06e5c,920201ec
+c07230,920201ec
+c07494,920201ec
+c075a8,931901ed
+c07648,931901ed
+c0796c,1f0
+c0e77c,c1007bc
c0e780,ac400428
-c5a9f0,c100cc7
-c6c7a8,c10061f
-c6c920,c10061f
+c5a9f0,c100cc3
+c6c7a8,c100624
+c6c920,c100624
c6cedc,340b0001
c6ed84,946f00a2
c6ed88,31f80018
@@ -550,7 +552,7 @@ c6ff38,4600848d
c6ff3c,44069000
c6ff44,27bdffe8
c6ff48,afbf0004
-c6ff4c,c100a04
+c6ff4c,c100a00
c6ff50,0
c6ff54,8fbf0004
c6ff58,27bd0018
@@ -561,7 +563,7 @@ c6ff68,0
c6ff6c,0
c6ff70,0
c6ff74,0
-c72c64,c100bdf
+c72c64,c100bdb
c72c68,2002021
c72c70,15e00006
c72c74,0
@@ -575,32 +577,32 @@ c7bd08,0
c82550,0
c892dc,340e0001
c8931c,340a0001
-c89744,c1003d3
+c89744,c1003d8
c89868,920e1d28
c898a4,92191d29
c898c8,920a1d2a
-c8b24c,c100504
+c8b24c,c100509
c8b250,2002025
-ca6dc0,81023a1
+ca6dc0,81023e9
ca6dc4,0
-cb6874,c10069c
-cc0038,c100465
+cb6874,c1006a1
+cc0038,c10046a
cc003c,8fa40018
cc3fa8,a20101f8
cc4024,0
-cc4038,c1009a2
+cc4038,c1009a7
cc403c,240c0004
cc453c,806
-cc8594,c1005e4
+cc8594,c1005e9
cc8598,24180006
-cc85b8,c100e01
+cc85b8,c100dfd
cc85bc,afa50064
-cce9a4,c100ec0
+cce9a4,c100ebc
cce9a8,8e04011c
cdf3ec,0
cdf404,0
-cdf420,c1005b4
-cdf638,c1005c8
+cdf420,c1005b9
+cdf638,c1005cd
cdf63c,e7a40034
cdf790,2405001e
cf1ab8,0
@@ -609,44 +611,44 @@ cf1ac0,31280040
cf1ac4,35390040
cf1ac8,af19b4a8
cf1acc,34090006
-cf73c8,c100bb9
+cf73c8,c100bb5
cf73cc,3c010001
-cf7ad4,c1005ae
+cf7ad4,c1005b3
cf7ad8,afa50044
d12f78,340f0000
-d357d4,c100b1b
+d357d4,c100b17
d35efc,0
d35f54,10000008
-d4bcb0,c100ddc
+d4bcb0,c100dd8
d4bcb4,8619001c
-d4be6c,c100986
-d52698,c1004e0
+d4be6c,c10098b
+d52698,c1004e5
d5269c,8e190024
-d5b264,c100aa9
-d5b660,8100aac
+d5b264,c100aa5
+d5b660,8100aa8
d5b664,0
-d5ff94,c100eb6
+d5ff94,c100eb2
d5ff98,44d9f800
-d62100,c100c69
+d62100,c100c65
d62110,3c014248
d62128,0
d6215c,0
-d621cc,c100c77
+d621cc,c100c73
d621dc,3c014248
d6221c,0
-d68d68,c100c21
+d68d68,c100c1d
d68d6c,afb20044
d68d70,3c098040
-d68d74,2529307c
+d68d74,2529306c
d68d78,81290000
d68d7c,11200186
d68d80,8fbf004c
-d68d84,c100c35
+d68d84,c100c31
d68d88,f7b80030
-d69c80,c100c3d
-d6cc18,c100cbf
+d69c80,c100c39
+d6cc18,c100cbb
d6cc1c,0
-d6cdd4,c100cc3
+d6cdd4,c100cbf
d6cdd8,0
d73118,0
d73128,0
@@ -713,34 +715,34 @@ d7e8d4,340e0001
d7e8d8,804f0ede
d7e8e0,5700000f
d7eb4c,0
-d7eb70,c100d5e
+d7eb70,c100d5a
d7eb74,acc80004
d7ebbc,0
-d7ebc8,c100d66
+d7ebc8,c100d62
d7ebf0,27bdffe8
d7ebf4,afbf0014
-d7ebf8,c100d71
+d7ebf8,c100d6d
d7ebfc,8ca21c44
d7ec04,0
-d7ec10,c100d75
+d7ec10,c100d71
d7ec14,971804c6
d7ec2c,0
-d7ec34,c100d8c
+d7ec34,c100d88
d7ec40,0
d7ec54,0
-d7ec60,8100d7e
-d7ec70,8100da4
+d7ec60,8100d7a
+d7ec70,8100da0
db13d0,24090076
-db532c,c100435
-db53e8,81023d3
+db532c,c10043a
+db53e8,810241b
db53ec,0
dbec80,34020000
-dbf428,c1007f9
+dbf428,c1007fe
dbf434,44989000
dbf438,e652019c
dbf484,0
dbf4a8,0
-dc7090,c100819
+dc7090,c10081e
dc7094,c60a0198
dc87a0,0
dc87bc,0
@@ -760,7 +762,7 @@ dd3754,3c064000
dd375c,3c074000
dd3760,0
dd3764,0
-de1018,c1023ec
+de1018,c102434
de101c,0
de1020,0
de1024,0
@@ -770,20 +772,20 @@ de1030,0
de1034,0
de1038,0
de103c,0
-de1050,81023ec
+de1050,8102434
de1054,0
df2644,76
df7a90,340e0018
df7a94,8c4f00a0
-df7cb0,c10063f
+df7cb0,c100644
dfec3c,3c188012
dfec40,8f18ae8c
dfec48,33190010
dfec4c,0
e09f68,806f0ede
e09f74,31f80004
-e09fb0,c100422
-e0ec50,c100c0f
+e09fb0,c100427
+e0ec50,c100c0b
e0ec54,2202825
e11e98,9442a674
e11e9c,304e0040
@@ -798,35 +800,35 @@ e11ebc,0
e11ec0,0
e11ec4,0
e11ec8,0
-e11f90,c1004eb
+e11f90,c1004f0
e11f94,0
-e12a04,c100e55
+e12a04,c100e51
e12a20,ac8302a4
e1f72c,27bdffe8
e1f730,afbf0014
-e1f734,c100e9a
+e1f734,c100e96
e1f738,0
e1f73c,8fbf0014
e1f740,27bd0018
e1f744,28410005
e1f748,14200012
e1f74c,24010005
-e1feac,c100eac
+e1feac,c100ea8
e1feb0,3c0743cf
-e20410,c100b47
+e20410,c100b43
e20414,0
-e206dc,c100b55
+e206dc,c100b51
e206e0,0
-e2076c,c100b65
+e2076c,c100b61
e20770,afa40020
-e20798,c100b5d
+e20798,c100b59
e2079c,0
-e24e7c,c1004b8
+e24e7c,c1004bd
e24e80,0
-e29388,8100443
-e2a044,c10044c
-e2b0b4,c100454
-e2b434,c100857
+e29388,8100448
+e2a044,c100451
+e2b0b4,c100459
+e2b434,c10085c
e2b438,0
e2b43c,0
e2b440,0
@@ -838,28 +840,28 @@ e2b454,0
e2b458,0
e2b45c,0
e2b460,0
-e2c03c,c100979
+e2c03c,c10097e
e2c040,2442a5d0
e2cc1c,3c058012
e2cc20,24a5a5d0
e2cc24,86080270
e2cc28,15000009
e2cc2c,90b9008a
-e2d714,c100826
+e2d714,c10082b
e2d71c,340900bf
e2d720,0
-e2d890,c100835
+e2d890,c10083a
e2d894,0
e2f090,34
-e429dc,c100559
+e429dc,c10055e
e429e0,0
e429e4,10000053
e429e8,0
-e42b5c,c10053f
+e42b5c,c100544
e42b64,1000000d
e42b68,0
-e42c00,c100537
-e42c44,c1005a0
+e42c00,c10053c
+e42c44,c1005a5
e42c48,860e008a
e42c4c,15400045
e50888,340403e7
@@ -867,18 +869,37 @@ e55c4c,340c0000
e56290,0
e56294,340b401f
e56298,0
-e565d0,c100c00
+e565d0,c100bfc
e565d4,0
e565d8,2002025
+e571d0,3c038041
+e571d4,906db5c4
+e571d8,340c0001
+e571dc,11ac0004
+e571e0,0
+e57208,3c038041
+e5720c,906db5c4
+e57210,340c0002
+e57214,11ac000d
+e57218,0
+e5721c,0
+e57220,0
+e57224,0
+e57228,0
+e5722c,0
+e57230,0
+e57234,0
+e57238,0
+e5723c,0
e59cd4,0
e59cd8,0
-e59e68,8102425
+e59e68,810246d
e59e6c,0
-e59ecc,810244e
+e59ecc,8102496
e59ed0,0
-e5b2f4,c100e83
+e5b2f4,c100e7f
e5b2f8,afa5001c
-e5b538,c100e8f
+e5b538,c100e8b
e5b53c,3c07461c
e62630,a48001f8
e62634,2463a5d0
@@ -934,7 +955,7 @@ e6befc,0
e6bf4c,340d0000
e6bf50,0
e7cc90,240e000c
-e7d19c,c100d35
+e7d19c,c100d31
e7d1a0,3c050600
e7d1a4,10a80003
e7d1a8,3025
@@ -954,19 +975,19 @@ e9f5b0,3e00008
e9f5b4,0
e9f5b8,0
e9f5bc,0
-e9f678,c1004eb
+e9f678,c1004f0
e9f67c,0
-e9f7a8,c1004eb
+e9f7a8,c1004f0
e9f7ac,0
-ebb85c,c10062a
+ebb85c,c10062f
ebb864,14400012
ebb86c,10000014
-ec1120,c1004eb
+ec1120,c1004f0
ec1124,0
ec68bc,8fad002c
ec68c0,340c000a
ec68c4,a5ac0110
-ec68c8,c101b31
+ec68c8,c101b6a
ec68cc,2002021
ec68d0,0
ec68d4,0
@@ -976,14 +997,14 @@ ec68e0,0
ec69ac,8fad002c
ec69b0,340c000a
ec69b4,a5ac0110
-ec69b8,c101b31
+ec69b8,c101b6a
ec69bc,2002021
ec69c0,0
ec69c4,0
ec69c8,0
ec69cc,0
ec69d0,0
-ec6b04,81023ba
+ec6b04,8102402
ec6b08,0
ec9ce4,2419007a
ed2858,20180008
@@ -991,9 +1012,9 @@ ed2fac,806e0f18
ed2fec,340a0000
ed5a28,340e0018
ed5a2c,8ccf00a0
-ed645c,c100822
+ed645c,c100827
ed6460,0
-ee7b84,c100950
+ee7b84,c100955
ee7b8c,0
ee7b90,0
ee7b94,0
@@ -1001,19 +1022,19 @@ ee7b98,0
ee7b9c,0
ee7ba0,0
ee7ba4,0
-ee7e4c,c100a8f
-ef32b8,c100a84
+ee7e4c,c100a8b
+ef32b8,c100a80
ef32bc,0
ef32c0,8fbf003c
-ef36e4,c100a5a
+ef36e4,c100a56
ef36e8,0
-ef373c,c100a6c
-ef4f98,c100795
+ef373c,c100a68
+ef4f98,c10079a
ef4f9c,0
26c10e0,38ff
3480000,80400020
3480004,80400844
-3480008,80409fd4
+3480008,8040a334
3480020,3
3480034,dfdfdfdf
3480038,dfdfdfdf
@@ -1546,12054 +1567,12280 @@ ef4f9c,0
3480888,100
3480cd0,640000
3480cd4,100
-3480ce4,27bdffe8
-3480ce8,afbf0010
-3480cec,c101f73
-3480cf4,3c028012
-3480cf8,2442d2a0
-3480cfc,240e0140
-3480d00,3c018010
-3480d04,ac2ee500
-3480d08,240f00f0
-3480d0c,8fbf0010
-3480d10,3e00008
-3480d14,27bd0018
-3480d18,3c088040
-3480d1c,ac4815d4
-3480d20,3e00008
-3480d24,340215c0
-3480d28,308400ff
-3480d2c,3c088012
-3480d30,2508a5d0
-3480d34,3401008c
-3480d38,10810016
-3480d3c,91020075
-3480d40,3401008d
-3480d44,10810013
-3480d48,91020075
-3480d4c,10800011
-3480d50,91020074
-3480d54,3401008a
-3480d58,1081000e
-3480d5c,91020074
-3480d60,3401008b
-3480d64,1081000b
-3480d68,91020074
-3480d6c,34010058
-3480d70,10810008
-3480d74,34020000
-3480d78,34010078
-3480d7c,10810005
-3480d80,34020000
-3480d84,34010079
-3480d88,10810002
-3480d8c,34020000
-3480d90,340200ff
-3480d94,3e00008
-3480d9c,8fa60030
-3480da0,810036d
-3480da4,84c50004
-3480da8,8fb9002c
-3480dac,810036d
-3480db0,87250004
-3480db4,3c0a8041
-3480db8,254ab1e8
-3480dbc,8d4a0000
-3480dc0,11400004
-3480dc8,3c058041
-3480dcc,24a5b1dc
-3480dd0,8ca50000
-3480dd4,3e00008
-3480ddc,3c088041
-3480de0,2508b1e8
-3480de4,8d080000
-3480de8,11000004
-3480df0,3c038041
-3480df4,2463b1d8
-3480df8,8c630000
-3480dfc,30fc3
-3480e00,614026
-3480e04,1014023
-3480e08,a0880852
-3480e0c,3e00008
-3480e14,3c088040
-3480e18,25080cd6
-3480e1c,91080000
-3480e20,1500000c
-3480e24,240bffff
-3480e28,3c088041
-3480e2c,2508b1e8
-3480e30,8d080000
-3480e34,11000007
-3480e38,1405821
+3480ce8,10000
+3480cf8,27bdffe8
+3480cfc,afbf0010
+3480d00,c101fac
+3480d08,3c028012
+3480d0c,2442d2a0
+3480d10,240e0140
+3480d14,3c018010
+3480d18,ac2ee500
+3480d1c,240f00f0
+3480d20,8fbf0010
+3480d24,3e00008
+3480d28,27bd0018
+3480d2c,3c088040
+3480d30,ac4815d4
+3480d34,3e00008
+3480d38,340215c0
+3480d3c,308400ff
+3480d40,3c088012
+3480d44,2508a5d0
+3480d48,3401008c
+3480d4c,10810016
+3480d50,91020075
+3480d54,3401008d
+3480d58,10810013
+3480d5c,91020075
+3480d60,10800011
+3480d64,91020074
+3480d68,3401008a
+3480d6c,1081000e
+3480d70,91020074
+3480d74,3401008b
+3480d78,1081000b
+3480d7c,91020074
+3480d80,34010058
+3480d84,10810008
+3480d88,34020000
+3480d8c,34010078
+3480d90,10810005
+3480d94,34020000
+3480d98,34010079
+3480d9c,10810002
+3480da0,34020000
+3480da4,340200ff
+3480da8,3e00008
+3480db0,8fa60030
+3480db4,8100372
+3480db8,84c50004
+3480dbc,8fb9002c
+3480dc0,8100372
+3480dc4,87250004
+3480dc8,3c0a8041
+3480dcc,254ab58c
+3480dd0,8d4a0000
+3480dd4,11400004
+3480ddc,3c058041
+3480de0,24a5b580
+3480de4,8ca50000
+3480de8,3e00008
+3480df0,3c088041
+3480df4,2508b58c
+3480df8,8d080000
+3480dfc,11000004
+3480e04,3c038041
+3480e08,2463b57c
+3480e0c,8c630000
+3480e10,30fc3
+3480e14,614026
+3480e18,1014023
+3480e1c,a0880852
+3480e20,3e00008
+3480e28,3c088040
+3480e2c,25080cd6
+3480e30,91080000
+3480e34,1500000c
+3480e38,240bffff
3480e3c,3c088041
-3480e40,2508b1d4
+3480e40,2508b58c
3480e44,8d080000
-3480e48,15000002
-3480e4c,240bffff
-3480e50,340b0001
-3480e54,5600009
-3480e5c,27bdffe8
-3480e60,afab0010
-3480e64,afbf0014
-3480e68,c01c508
-3480e70,8fab0010
-3480e74,8fbf0014
-3480e78,27bd0018
-3480e7c,3e00008
-3480e84,90450003
-3480e88,3c088041
-3480e8c,2508b1e8
-3480e90,8d080000
-3480e94,11000004
-3480e9c,3c058041
-3480ea0,24a5b1e0
-3480ea4,8ca50000
-3480ea8,3e00008
-3480eb0,27bdffe8
-3480eb4,afb00010
-3480eb8,afbf0014
-3480ebc,3c088041
-3480ec0,2508b1ec
-3480ec4,8d080000
-3480ec8,31080001
-3480ecc,1500000b
-3480ed0,34100041
-3480ed4,3c048041
-3480ed8,2484b1e8
-3480edc,8c840000
-3480ee0,10800006
-3480ee4,90500000
-3480ee8,3c088041
-3480eec,2508b1e4
-3480ef0,8d100000
-3480ef4,c101eca
-3480efc,c101a84
-3480f04,2002821
-3480f08,8fb00010
-3480f0c,8fbf0014
-3480f10,3e00008
-3480f14,27bd0018
-3480f18,27bdffe0
-3480f1c,afa70010
-3480f20,afa20014
-3480f24,afa30018
-3480f28,afbf001c
-3480f2c,c101af5
-3480f30,e02821
-3480f34,8fa70010
-3480f38,8fa20014
-3480f3c,8fa30018
-3480f40,8fbf001c
-3480f44,3e00008
-3480f48,27bd0020
-3480f4c,27bdffe8
-3480f50,afbf0010
-3480f54,8c881d2c
-3480f58,34090001
-3480f5c,94e00
-3480f60,1091024
-3480f64,10400021
-3480f6c,94ca02dc
-3480f70,3c0b8012
-3480f74,256ba5d0
-3480f78,948c00a4
-3480f7c,3401003d
-3480f80,1181000a
-3480f88,8a6021
-3480f8c,918d1d28
-3480f90,15a00014
-3480f98,340d0001
-3480f9c,a18d1d28
-3480fa0,254a0013
-3480fa4,1000000a
-3480fac,340c0001
-3480fb0,14c6004
-3480fb4,916d0ef2
-3480fb8,1ac7024
-3480fbc,15c00009
-3480fc4,1ac7025
-3480fc8,a16e0ef2
-3480fcc,254a0010
-3480fd0,1294827
-3480fd4,1094024
-3480fd8,ac881d2c
-3480fdc,c101a37
-3480fe0,1402021
-3480fe4,c1024f2
-3480fec,8fbf0010
-3480ff0,34020000
-3480ff4,3e00008
-3480ff8,27bd0018
-3480ffc,27bdffe8
-3481000,afbf0010
-3481004,c101a37
-3481008,20e4ffc6
-348100c,340200ff
-3481010,8fbf0010
-3481014,3e00008
-3481018,27bd0018
-348101c,27bdffe0
-3481020,afa10010
-3481024,afa30014
-3481028,afbf0018
-348102c,c101a37
-3481030,34040023
-3481034,8fa10010
-3481038,8fa30014
-348103c,8fbf0018
-3481040,3e00008
-3481044,27bd0020
-3481048,27bdffe0
-348104c,afa60010
-3481050,afa70014
-3481054,afbf0018
-3481058,3c018012
-348105c,2421a5d0
-3481060,80280ede
-3481064,35080001
-3481068,a0280ede
-348106c,c101a37
-3481070,34040027
-3481074,8fa60010
-3481078,8fa70014
-348107c,8fbf0018
-3481080,3e00008
-3481084,27bd0020
-3481088,27bdffe8
-348108c,afa30010
-3481090,afbf0014
-3481094,3c018012
-3481098,2421a5d0
-348109c,80280ede
-34810a0,35080004
-34810a4,a0280ede
-34810a8,3c188040
-34810ac,83180cd8
-34810b0,13000003
-34810b8,c101a37
-34810bc,34040029
-34810c0,240f0001
-34810c4,8fa30010
-34810c8,8fbf0014
-34810cc,3e00008
-34810d0,27bd0018
-34810d4,27bdffd8
-34810d8,afa40010
-34810dc,afa20014
-34810e0,afaf0018
-34810e4,afbf0020
-34810e8,c101a37
-34810ec,3404002a
-34810f0,34050003
-34810f4,8fa40010
-34810f8,8fa20014
-34810fc,8faf0018
-3481100,8fbf0020
-3481104,3e00008
-3481108,27bd0028
-348110c,607821
-3481110,81ec0edf
-3481114,318e0080
-3481118,11c00003
-348111c,34030005
-3481120,3e00008
-3481124,34020002
-3481128,3e00008
-348112c,601021
-3481130,85c200a4
-3481134,3c088012
-3481138,2508a5d0
-348113c,81090edf
-3481140,35290080
-3481144,a1090edf
-3481148,3e00008
-3481150,27bdfff0
-3481154,afbf0004
-3481158,c035886
-3481160,3c0c8012
-3481164,258ca5d0
-3481168,858d0f2e
-348116c,8d980004
-3481170,13000002
-3481174,340e0001
-3481178,340e0002
-348117c,1ae6825
-3481180,a58d0f2e
-3481184,8fbf0004
-3481188,27bd0010
-348118c,3e00008
-3481194,24090041
-3481198,27bdffe0
-348119c,afa80004
-34811a0,afa90008
-34811a4,afaa000c
-34811a8,afac0010
-34811ac,3c0affff
-34811b0,a5403
-34811b4,3c08801d
-34811b8,850c894c
-34811bc,118a0002
-34811c4,a500894c
-34811c8,3c08801e
-34811cc,810a887c
-34811d0,11400009
-34811d8,3c090036
-34811dc,94c03
-34811e0,a109887c
-34811e4,3c090002
-34811e8,94c03
-34811ec,a109895f
-34811f0,3c08801f
-34811f4,a1008d38
-34811f8,8fac0010
-34811fc,8faa000c
-3481200,8fa90008
-3481204,8fa80004
-3481208,3e00008
-348120c,27bd0020
-3481214,3c0a8010
-3481218,254ae49c
-348121c,8d4a0000
-3481220,1140001e
-3481228,3c08801d
-348122c,250884a0
-3481230,3c0b0001
-3481234,356b04c4
-3481238,10b4020
-348123c,85090000
-3481240,3c0b0002
-3481244,356b26cc
-3481248,14b5020
-348124c,94840
-3481250,12a5021
-3481254,85490000
-3481258,a5091956
-348125c,3c0c801e
-3481260,258c84a0
-3481264,34090003
-3481268,a1891e5e
-348126c,34090014
-3481270,a1091951
-3481274,34090001
-3481278,3c018040
-348127c,a0291210
-3481280,3c088012
-3481284,2508a5d0
-3481288,850913d2
-348128c,11200003
-3481294,34090001
-3481298,a50913d4
-348129c,3e00008
-34812a4,3421241c
-34812a8,3c0d8040
-34812ac,25ad1210
-34812b0,81a90000
-34812b4,11200008
-34812b8,862a00a4
-34812bc,340b005e
-34812c0,114b0005
-34812c4,3c0c801e
-34812c8,258c84a0
-34812cc,34090003
-34812d0,a1891e5e
-34812d4,a1a00000
-34812d8,3e00008
-34812e0,3c02801d
-34812e4,244284a0
-34812e8,3c010001
-34812ec,411020
-34812f0,3401047e
-34812f4,a4411e1a
-34812f8,34010014
-34812fc,3e00008
-3481300,a0411e15
-3481304,27bdffe8
-3481308,afbf0014
-348130c,afa40018
-3481310,8e190004
-3481314,17200015
-3481318,8e190000
-348131c,3c018010
-3481320,24219c90
-3481324,19c880
-3481328,3210820
-348132c,90210000
-3481330,34190052
-3481334,1721000d
-3481338,8e190000
-348133c,960200a6
-3481340,304c0007
-3481344,398c0007
-3481348,15800008
-348134c,240400aa
-3481350,c00a22d
-3481358,14400004
-348135c,8e190000
-3481360,341900db
-3481364,10000002
-3481368,ae190000
-348136c,340101e1
-3481370,8fbf0014
-3481374,8fa40018
-3481378,3e00008
-348137c,27bd0018
-3481380,3c088040
-3481384,81080cdf
-3481388,11000005
-348138c,3c018012
-3481390,2421a5d0
-3481394,80280ed6
-3481398,35080001
-348139c,a0280ed6
-34813a0,34080000
-34813a4,3e00008
-34813a8,adf90000
-34813ac,3c0b801d
-34813b0,256b84a0
-34813b4,856b00a4
-34813b8,340c005a
-34813bc,156c0003
-34813c0,340b01a5
-34813c4,a42b1e1a
-34813c8,1000000e
-34813cc,3c0c8012
-34813d0,258ca5d0
-34813d4,8d8c0004
-34813d8,15800008
-34813dc,3c0b8040
-34813e0,816b0cdf
-34813e4,11600007
-34813e8,842b1e1a
-34813ec,340c01a5
-34813f0,116c0002
-34813f8,10000002
-34813fc,340b0129
-3481400,a42b1e1a
-3481404,3e00008
-3481410,2202825
-3481414,3c0a801e
-3481418,254aaa30
-348141c,c544002c
-3481420,3c0bc43c
-3481424,256b8000
-3481428,448b3000
-348142c,4606203c
-3481434,45000026
-348143c,c5440024
-3481440,3c0bc28a
-3481444,448b3000
-3481448,4606203c
-3481450,4501001f
-3481458,3c0b41c8
-348145c,448b3000
-3481460,4606203c
-3481468,45000019
-3481470,3c098040
-3481474,2529140c
-3481478,814b0424
-348147c,1160000e
-3481480,812e0000
-3481484,340c007e
-3481488,116c000b
-3481490,15c00009
-3481494,340c0001
-3481498,a12c0000
-348149c,3c0dc1a0
-34814a0,ad4d0024
-34814a4,3c0d4120
-34814a8,ad4d0028
-34814ac,3c0dc446
-34814b0,25ad8000
-34814b4,ad4d002c
-34814b8,11c00005
-34814c0,15600003
-34814c4,340d8000
-34814c8,a54d00b6
-34814cc,a1200000
-34814d0,3e00008
-34814dc,3c0a801e
-34814e0,254aaa30
-34814e4,8d4b066c
-34814e8,3c0cd000
-34814ec,258cffff
-34814f0,16c5824
-34814f4,3e00008
-34814f8,ad4b066c
-34814fc,27bdffe0
-3481500,afbf0014
-3481504,afa40018
-3481508,1c17825
-348150c,ac4f0680
-3481510,34040001
-3481514,c01b638
-348151c,3c088040
-3481520,81080cd8
-3481524,15000007
-348152c,3c04801d
-3481530,248484a0
-3481534,3c058040
-3481538,80a50cd9
-348153c,c037500
-3481544,8fa40018
-3481548,8c880138
-348154c,8d090010
-3481550,252a03d4
-3481554,ac8a029c
-3481558,8fbf0014
-348155c,3e00008
-3481560,27bd0020
-3481564,27bdffe0
-3481568,afbf0014
-348156c,afa40018
-3481570,3c088040
-3481574,81080cd8
-3481578,1500001a
-3481580,3c09801e
-3481584,2529887c
-3481588,81280000
-348158c,340b0036
-3481590,150b001e
-3481598,3c088040
-348159c,810814d8
-34815a0,1500001a
-34815a8,34080001
-34815ac,3c018040
-34815b0,a02814d8
-34815b4,3c04801d
-34815b8,248484a0
-34815bc,3c058040
-34815c0,90a50cda
-34815c4,34060000
-34815c8,c037385
-34815d0,34044802
-34815d4,c0191bc
-34815dc,10000025
-34815e4,3c04801d
-34815e8,248484a0
-34815ec,34050065
-34815f0,c01bf73
-34815f8,34040032
-34815fc,c01b638
-3481604,1000000c
-348160c,8fa40018
-3481610,3c05801d
-3481614,24a584a0
-3481618,c008ab4
-3481620,10400014
-3481628,3c088040
-348162c,810814d8
-3481630,11000010
-3481638,8fa40018
-348163c,8c880138
-3481640,8d090010
-3481644,252a035c
-3481648,ac8a029c
-348164c,3c028012
-3481650,2442a5d0
-3481654,94490ee0
-3481658,352a0020
-348165c,a44a0ee0
-3481660,8c880004
-3481664,3c09ffff
-3481668,2529ffff
-348166c,1094024
-3481670,ac880004
-3481674,8fbf0014
-3481678,3e00008
-348167c,27bd0020
-3481680,860f00b6
-3481684,9739b4ae
-3481688,3c09801e
-348168c,2529aa30
-3481690,812a0424
-3481694,11400004
-348169c,3409007e
-34816a0,15490003
-34816a8,3e00008
-34816ac,340a0000
-34816b0,3e00008
-34816b4,340a0001
-34816b8,8c8e0134
-34816bc,15c00002
-34816c0,3c0e4480
-34816c4,ac8e0024
-34816c8,3e00008
-34816cc,8fae0044
-34816d0,260501a4
-34816d4,27bdffe0
-34816d8,afbf0014
-34816dc,afa50018
-34816e0,8625001c
-34816e4,52a03
-34816e8,c008134
-34816ec,30a5003f
-34816f0,8fa50018
-34816f4,8fbf0014
-34816f8,3e00008
-34816fc,27bd0020
-3481700,ae19066c
-3481704,8e0a0428
-3481708,3c09801e
-348170c,2529aa30
-3481710,854b00b6
-3481714,216b8000
-3481718,3e00008
-348171c,a52b00b6
-3481720,3c08801e
-3481724,2508aa30
-3481728,810a0434
-348172c,340b0008
-3481730,154b0002
-3481734,34090007
-3481738,a1090434
-348173c,3e00008
-3481740,c606000c
-3481744,3c08801e
-3481748,2508aa30
-348174c,8d0901ac
-3481750,3c0a0400
-3481754,254a2f98
-3481758,152a000b
-348175c,8d0b01bc
-3481760,3c0c42cf
-3481764,156c0003
-3481768,3c0d4364
-348176c,10000006
-3481770,ad0d01bc
-3481774,3c0c4379
+3480e48,11000007
+3480e4c,1405821
+3480e50,3c088041
+3480e54,2508b578
+3480e58,8d080000
+3480e5c,15000002
+3480e60,240bffff
+3480e64,340b0001
+3480e68,5600009
+3480e70,27bdffe8
+3480e74,afab0010
+3480e78,afbf0014
+3480e7c,c01c508
+3480e84,8fab0010
+3480e88,8fbf0014
+3480e8c,27bd0018
+3480e90,3e00008
+3480e98,90450003
+3480e9c,3c088041
+3480ea0,2508b58c
+3480ea4,8d080000
+3480ea8,11000004
+3480eb0,3c058041
+3480eb4,24a5b584
+3480eb8,8ca50000
+3480ebc,3e00008
+3480ec4,27bdffe8
+3480ec8,afb00010
+3480ecc,afbf0014
+3480ed0,3c088041
+3480ed4,2508b590
+3480ed8,8d080000
+3480edc,31080001
+3480ee0,1500000b
+3480ee4,34100041
+3480ee8,3c048041
+3480eec,2484b58c
+3480ef0,8c840000
+3480ef4,10800006
+3480ef8,90500000
+3480efc,3c088041
+3480f00,2508b588
+3480f04,8d100000
+3480f08,c101f03
+3480f10,c101abd
+3480f18,2002821
+3480f1c,8fb00010
+3480f20,8fbf0014
+3480f24,3e00008
+3480f28,27bd0018
+3480f2c,27bdffe0
+3480f30,afa70010
+3480f34,afa20014
+3480f38,afa30018
+3480f3c,afbf001c
+3480f40,c101b2e
+3480f44,e02821
+3480f48,8fa70010
+3480f4c,8fa20014
+3480f50,8fa30018
+3480f54,8fbf001c
+3480f58,3e00008
+3480f5c,27bd0020
+3480f60,27bdffe8
+3480f64,afbf0010
+3480f68,8c881d2c
+3480f6c,34090001
+3480f70,94e00
+3480f74,1091024
+3480f78,10400021
+3480f80,94ca02dc
+3480f84,3c0b8012
+3480f88,256ba5d0
+3480f8c,948c00a4
+3480f90,3401003d
+3480f94,1181000a
+3480f9c,8a6021
+3480fa0,918d1d28
+3480fa4,15a00014
+3480fac,340d0001
+3480fb0,a18d1d28
+3480fb4,254a0013
+3480fb8,1000000a
+3480fc0,340c0001
+3480fc4,14c6004
+3480fc8,916d0ef2
+3480fcc,1ac7024
+3480fd0,15c00009
+3480fd8,1ac7025
+3480fdc,a16e0ef2
+3480fe0,254a0010
+3480fe4,1294827
+3480fe8,1094024
+3480fec,ac881d2c
+3480ff0,c101a70
+3480ff4,1402021
+3480ff8,c10253a
+3481000,8fbf0010
+3481004,34020000
+3481008,3e00008
+348100c,27bd0018
+3481010,27bdffe8
+3481014,afbf0010
+3481018,c101a70
+348101c,20e4ffc6
+3481020,340200ff
+3481024,8fbf0010
+3481028,3e00008
+348102c,27bd0018
+3481030,27bdffe0
+3481034,afa10010
+3481038,afa30014
+348103c,afbf0018
+3481040,c101a70
+3481044,34040023
+3481048,8fa10010
+348104c,8fa30014
+3481050,8fbf0018
+3481054,3e00008
+3481058,27bd0020
+348105c,27bdffe0
+3481060,afa60010
+3481064,afa70014
+3481068,afbf0018
+348106c,3c018012
+3481070,2421a5d0
+3481074,80280ede
+3481078,35080001
+348107c,a0280ede
+3481080,c101a70
+3481084,34040027
+3481088,8fa60010
+348108c,8fa70014
+3481090,8fbf0018
+3481094,3e00008
+3481098,27bd0020
+348109c,27bdffe8
+34810a0,afa30010
+34810a4,afbf0014
+34810a8,3c018012
+34810ac,2421a5d0
+34810b0,80280ede
+34810b4,35080004
+34810b8,a0280ede
+34810bc,3c188040
+34810c0,83180cd8
+34810c4,13000003
+34810cc,c101a70
+34810d0,34040029
+34810d4,240f0001
+34810d8,8fa30010
+34810dc,8fbf0014
+34810e0,3e00008
+34810e4,27bd0018
+34810e8,27bdffd8
+34810ec,afa40010
+34810f0,afa20014
+34810f4,afaf0018
+34810f8,afbf0020
+34810fc,c101a70
+3481100,3404002a
+3481104,34050003
+3481108,8fa40010
+348110c,8fa20014
+3481110,8faf0018
+3481114,8fbf0020
+3481118,3e00008
+348111c,27bd0028
+3481120,607821
+3481124,81ec0edf
+3481128,318e0080
+348112c,11c00003
+3481130,34030005
+3481134,3e00008
+3481138,34020002
+348113c,3e00008
+3481140,601021
+3481144,85c200a4
+3481148,3c088012
+348114c,2508a5d0
+3481150,81090edf
+3481154,35290080
+3481158,a1090edf
+348115c,3e00008
+3481164,27bdfff0
+3481168,afbf0004
+348116c,c035886
+3481174,3c0c8012
+3481178,258ca5d0
+348117c,858d0f2e
+3481180,8d980004
+3481184,13000002
+3481188,340e0001
+348118c,340e0002
+3481190,1ae6825
+3481194,a58d0f2e
+3481198,8fbf0004
+348119c,27bd0010
+34811a0,3e00008
+34811a8,24090041
+34811ac,27bdffe0
+34811b0,afa80004
+34811b4,afa90008
+34811b8,afaa000c
+34811bc,afac0010
+34811c0,3c0affff
+34811c4,a5403
+34811c8,3c08801d
+34811cc,850c894c
+34811d0,118a0002
+34811d8,a500894c
+34811dc,3c08801e
+34811e0,810a887c
+34811e4,11400009
+34811ec,3c090036
+34811f0,94c03
+34811f4,a109887c
+34811f8,3c090002
+34811fc,94c03
+3481200,a109895f
+3481204,3c08801f
+3481208,a1008d38
+348120c,8fac0010
+3481210,8faa000c
+3481214,8fa90008
+3481218,8fa80004
+348121c,3e00008
+3481220,27bd0020
+3481228,3c0a8010
+348122c,254ae49c
+3481230,8d4a0000
+3481234,1140001e
+348123c,3c08801d
+3481240,250884a0
+3481244,3c0b0001
+3481248,356b04c4
+348124c,10b4020
+3481250,85090000
+3481254,3c0b0002
+3481258,356b26cc
+348125c,14b5020
+3481260,94840
+3481264,12a5021
+3481268,85490000
+348126c,a5091956
+3481270,3c0c801e
+3481274,258c84a0
+3481278,34090003
+348127c,a1891e5e
+3481280,34090014
+3481284,a1091951
+3481288,34090001
+348128c,3c018040
+3481290,a0291224
+3481294,3c088012
+3481298,2508a5d0
+348129c,850913d2
+34812a0,11200003
+34812a8,34090001
+34812ac,a50913d4
+34812b0,3e00008
+34812b8,3421241c
+34812bc,3c0d8040
+34812c0,25ad1224
+34812c4,81a90000
+34812c8,11200008
+34812cc,862a00a4
+34812d0,340b005e
+34812d4,114b0005
+34812d8,3c0c801e
+34812dc,258c84a0
+34812e0,34090003
+34812e4,a1891e5e
+34812e8,a1a00000
+34812ec,3e00008
+34812f4,3c02801d
+34812f8,244284a0
+34812fc,3c010001
+3481300,411020
+3481304,3401047e
+3481308,a4411e1a
+348130c,34010014
+3481310,3e00008
+3481314,a0411e15
+3481318,27bdffe8
+348131c,afbf0014
+3481320,afa40018
+3481324,8e190004
+3481328,17200015
+348132c,8e190000
+3481330,3c018010
+3481334,24219c90
+3481338,19c880
+348133c,3210820
+3481340,90210000
+3481344,34190052
+3481348,1721000d
+348134c,8e190000
+3481350,960200a6
+3481354,304c0007
+3481358,398c0007
+348135c,15800008
+3481360,240400aa
+3481364,c00a22d
+348136c,14400004
+3481370,8e190000
+3481374,341900db
+3481378,10000002
+348137c,ae190000
+3481380,340101e1
+3481384,8fbf0014
+3481388,8fa40018
+348138c,3e00008
+3481390,27bd0018
+3481394,3c088040
+3481398,81080cde
+348139c,11000005
+34813a0,3c018012
+34813a4,2421a5d0
+34813a8,80280ed6
+34813ac,35080001
+34813b0,a0280ed6
+34813b4,34080000
+34813b8,3e00008
+34813bc,adf90000
+34813c0,3c0b801d
+34813c4,256b84a0
+34813c8,856b00a4
+34813cc,340c005a
+34813d0,156c0003
+34813d4,340b01a5
+34813d8,a42b1e1a
+34813dc,1000000e
+34813e0,3c0c8012
+34813e4,258ca5d0
+34813e8,8d8c0004
+34813ec,15800008
+34813f0,3c0b8040
+34813f4,816b0cde
+34813f8,11600007
+34813fc,842b1e1a
+3481400,340c01a5
+3481404,116c0002
+348140c,10000002
+3481410,340b0129
+3481414,a42b1e1a
+3481418,3e00008
+3481424,2202825
+3481428,3c0a801e
+348142c,254aaa30
+3481430,c544002c
+3481434,3c0bc43c
+3481438,256b8000
+348143c,448b3000
+3481440,4606203c
+3481448,45000026
+3481450,c5440024
+3481454,3c0bc28a
+3481458,448b3000
+348145c,4606203c
+3481464,4501001f
+348146c,3c0b41c8
+3481470,448b3000
+3481474,4606203c
+348147c,45000019
+3481484,3c098040
+3481488,25291420
+348148c,814b0424
+3481490,1160000e
+3481494,812e0000
+3481498,340c007e
+348149c,116c000b
+34814a4,15c00009
+34814a8,340c0001
+34814ac,a12c0000
+34814b0,3c0dc1a0
+34814b4,ad4d0024
+34814b8,3c0d4120
+34814bc,ad4d0028
+34814c0,3c0dc446
+34814c4,25ad8000
+34814c8,ad4d002c
+34814cc,11c00005
+34814d4,15600003
+34814d8,340d8000
+34814dc,a54d00b6
+34814e0,a1200000
+34814e4,3e00008
+34814f0,3c0a801e
+34814f4,254aaa30
+34814f8,8d4b066c
+34814fc,3c0cd000
+3481500,258cffff
+3481504,16c5824
+3481508,3e00008
+348150c,ad4b066c
+3481510,27bdffe0
+3481514,afbf0014
+3481518,afa40018
+348151c,1c17825
+3481520,ac4f0680
+3481524,34040001
+3481528,c01b638
+3481530,3c088040
+3481534,81080cd8
+3481538,15000007
+3481540,3c04801d
+3481544,248484a0
+3481548,3c058040
+348154c,80a50cd9
+3481550,c037500
+3481558,8fa40018
+348155c,8c880138
+3481560,8d090010
+3481564,252a03d4
+3481568,ac8a029c
+348156c,8fbf0014
+3481570,3e00008
+3481574,27bd0020
+3481578,27bdffe0
+348157c,afbf0014
+3481580,afa40018
+3481584,3c088040
+3481588,81080cd8
+348158c,1500001a
+3481594,3c09801e
+3481598,2529887c
+348159c,81280000
+34815a0,340b0036
+34815a4,150b001e
+34815ac,3c088040
+34815b0,810814ec
+34815b4,1500001a
+34815bc,34080001
+34815c0,3c018040
+34815c4,a02814ec
+34815c8,3c04801d
+34815cc,248484a0
+34815d0,3c058040
+34815d4,90a50cda
+34815d8,34060000
+34815dc,c037385
+34815e4,34044802
+34815e8,c0191bc
+34815f0,10000025
+34815f8,3c04801d
+34815fc,248484a0
+3481600,34050065
+3481604,c01bf73
+348160c,34040032
+3481610,c01b638
+3481618,1000000c
+3481620,8fa40018
+3481624,3c05801d
+3481628,24a584a0
+348162c,c008ab4
+3481634,10400014
+348163c,3c088040
+3481640,810814ec
+3481644,11000010
+348164c,8fa40018
+3481650,8c880138
+3481654,8d090010
+3481658,252a035c
+348165c,ac8a029c
+3481660,3c028012
+3481664,2442a5d0
+3481668,94490ee0
+348166c,352a0020
+3481670,a44a0ee0
+3481674,8c880004
+3481678,3c09ffff
+348167c,2529ffff
+3481680,1094024
+3481684,ac880004
+3481688,8fbf0014
+348168c,3e00008
+3481690,27bd0020
+3481694,860f00b6
+3481698,9739b4ae
+348169c,3c09801e
+34816a0,2529aa30
+34816a4,812a0424
+34816a8,11400004
+34816b0,3409007e
+34816b4,15490003
+34816bc,3e00008
+34816c0,340a0000
+34816c4,3e00008
+34816c8,340a0001
+34816cc,8c8e0134
+34816d0,15c00002
+34816d4,3c0e4480
+34816d8,ac8e0024
+34816dc,3e00008
+34816e0,8fae0044
+34816e4,260501a4
+34816e8,27bdffe0
+34816ec,afbf0014
+34816f0,afa50018
+34816f4,8625001c
+34816f8,52a03
+34816fc,c008134
+3481700,30a5003f
+3481704,8fa50018
+3481708,8fbf0014
+348170c,3e00008
+3481710,27bd0020
+3481714,ae19066c
+3481718,8e0a0428
+348171c,3c09801e
+3481720,2529aa30
+3481724,854b00b6
+3481728,216b8000
+348172c,3e00008
+3481730,a52b00b6
+3481734,3c08801e
+3481738,2508aa30
+348173c,810a0434
+3481740,340b0008
+3481744,154b0002
+3481748,34090007
+348174c,a1090434
+3481750,3e00008
+3481754,c606000c
+3481758,3c08801e
+348175c,2508aa30
+3481760,8d0901ac
+3481764,3c0a0400
+3481768,254a2f98
+348176c,152a000b
+3481770,8d0b01bc
+3481774,3c0c42cf
3481778,156c0003
-348177c,3c09803b
-3481780,2529967c
-3481784,ad090664
-3481788,3e00008
-348178c,260501a4
-3481790,a498017c
-3481794,3c08801d
-3481798,250884a0
-348179c,850900a4
-34817a0,340a0002
-34817a4,152a000e
-34817a8,8c890138
-34817ac,8d290010
-34817b0,252a3398
-34817b4,ac8a0184
-34817b8,340b0001
-34817bc,a48b017c
-34817c0,27bdffe8
-34817c4,afbf0014
-34817c8,3c053dcd
-34817cc,24a5cccd
-34817d0,c0083e2
-34817d8,8fbf0014
-34817dc,27bd0018
-34817e0,3e00008
-34817e8,948e001c
-34817ec,21cdffce
-34817f0,5a00010
-34817f4,34020000
-34817f8,31a90007
-34817fc,340a0001
-3481800,12a5004
-3481804,d48c2
-3481808,3c0c8012
-348180c,258ca5d0
-3481810,1896020
-3481814,918b05b4
-3481818,16a5824
-348181c,34020000
-3481820,11600004
-3481828,340d0026
-348182c,a48d001c
-3481830,34020001
-3481834,3e00008
-348183c,94ae001c
-3481840,21cdffce
-3481844,5a0000b
-3481848,34020000
-348184c,31a90007
-3481850,340a0001
-3481854,12a5004
-3481858,d48c2
-348185c,3c0c8012
-3481860,258ca5d0
-3481864,1896020
-3481868,918b05b4
-348186c,16a5825
-3481870,a18b05b4
-3481874,3e00008
-348187c,27bdfff0
-3481880,afbf0008
-3481884,28810032
-3481888,10200003
-348188c,801021
-3481890,320f809
-3481898,8fbf0008
-348189c,27bd0010
-34818a0,3e00008
-34818a8,3c08801d
-34818ac,250884a0
-34818b0,3c098012
-34818b4,2529a5d0
-34818b8,950a00a4
-34818bc,3401003e
-34818c0,15410002
-34818c4,912b1397
-34818c8,216aff2a
-34818cc,960b001c
-34818d0,216b0001
-34818d4,340c0001
-34818d8,16c6004
-34818dc,3401001c
-34818e0,1410018
-34818e4,6812
-34818e8,12d7020
-34818ec,8dcf00e4
-34818f0,18f1024
-34818f4,3e00008
-34818fc,3c08801d
-3481900,250884a0
-3481904,3c098012
-3481908,2529a5d0
-348190c,950a00a4
-3481910,3401003e
-3481914,15410002
-3481918,912b1397
-348191c,216aff2a
-3481920,848b001c
-3481924,216b0001
-3481928,340c0001
-348192c,16c6004
-3481930,3401001c
-3481934,1410018
-3481938,6812
-348193c,12d7020
-3481940,8dcf00e4
-3481944,18f7825
-3481948,adcf00e4
-348194c,3e00008
-3481954,27bdffe8
-3481958,afbf0010
-348195c,c101f82
-3481964,8fbf0010
-3481968,27bd0018
-348196c,8fae0018
-3481970,3e00008
-3481974,3c018010
-3481978,340100ff
-348197c,15210002
-3481980,92220000
-3481984,340200ff
-3481988,3e00008
-348198c,34010009
-3481990,27bdffe8
-3481994,afa20010
-3481998,afbf0014
-348199c,c100688
-34819a4,14400002
-34819a8,91830000
-34819ac,340300ff
-34819b0,8fa20010
-34819b4,8fbf0014
-34819b8,27bd0018
-34819bc,3e00008
-34819c0,34010009
-34819c4,27bdffe8
-34819c8,afa20010
-34819cc,afbf0014
-34819d0,960201e8
-34819d4,34010003
-34819d8,14410007
-34819e0,c100688
-34819e8,14400007
-34819f0,10000005
-34819f4,3403007a
-34819f8,3401017a
-34819fc,14610002
-3481a04,3403007a
-3481a08,36280
-3481a0c,18d2821
-3481a10,8fa20010
-3481a14,8fbf0014
-3481a18,3e00008
-3481a1c,27bd0018
-3481a20,27bdfff0
-3481a24,afbf0000
-3481a28,afa30004
-3481a2c,afa40008
-3481a30,c101faf
-3481a38,8fbf0000
-3481a3c,8fa30004
-3481a40,8fa40008
-3481a44,3e00008
-3481a48,27bd0010
-3481a4c,6d7024
-3481a50,15c00002
-3481a54,91ec0000
-3481a58,27ff003c
-3481a5c,3e00008
-3481a70,3c088012
-3481a74,2508a5d0
-3481a78,8509009c
-3481a7c,352a0002
-3481a80,3e00008
-3481a84,a50a009c
-3481a88,3c058012
-3481a8c,24a5a5d0
-3481a90,3c088040
-3481a94,25081a64
-3481a98,8ca90068
-3481a9c,ad090000
-3481aa0,8ca9006c
-3481aa4,ad090004
-3481aa8,94a90070
-3481aac,a5090008
-3481ab0,94a9009c
-3481ab4,a509000a
-3481ab8,340807e4
-3481abc,1054021
-3481ac0,34090e64
-3481ac4,1254821
-3481ac8,340a0008
-3481acc,8d0b0000
-3481ad0,8d2c0000
-3481ad4,ad2b0000
-3481ad8,ad0c0000
-3481adc,2508001c
-3481ae0,25290004
-3481ae4,254affff
-3481ae8,1d40fff8
-3481af0,801be03
-3481af8,27bdffe0
-3481afc,afb00010
-3481b00,afb10014
-3481b04,afbf0018
-3481b08,3c108012
-3481b0c,2610a5d0
-3481b10,3c118040
-3481b14,26311a64
-3481b18,8e080004
-3481b1c,11000005
-3481b24,c1006e8
-3481b2c,10000003
-3481b34,c1006fb
-3481b3c,c1006db
-3481b40,34040000
-3481b44,c1006db
-3481b48,34040001
-3481b4c,c1006db
-3481b50,34040002
-3481b54,8fb00010
-3481b58,8fb10014
-3481b5c,8fbf0018
-3481b60,27bd0020
-3481b64,3e00008
-3481b6c,2044021
-3481b70,9109006c
-3481b74,340100ff
-3481b78,11210007
-3481b80,2094821
-3481b84,91290074
-3481b88,3401002c
-3481b8c,11210002
-3481b94,a1090069
-3481b98,3e00008
-3481ba0,27bdffe8
-3481ba4,afbf0010
-3481ba8,8e280000
-3481bac,ae080040
-3481bb0,8e280004
-3481bb4,ae080044
-3481bb8,96280008
-3481bbc,a6080048
-3481bc0,a2000f33
-3481bc4,9208004a
-3481bc8,340100ff
-3481bcc,15010003
-3481bd4,c10070e
-3481bdc,8fbf0010
-3481be0,27bd0018
-3481be4,3e00008
-3481bec,8e080040
-3481bf0,ae080068
-3481bf4,8e080044
-3481bf8,ae08006c
-3481bfc,96080048
-3481c00,9209009d
-3481c04,31290020
-3481c08,15200002
-3481c10,3108ffdf
-3481c14,a6080070
-3481c18,92080068
-3481c1c,340100ff
-3481c20,15010003
-3481c28,34080001
-3481c2c,a2080f33
-3481c30,3e00008
-3481c38,27bdffe8
-3481c3c,afbf0010
-3481c40,9608009c
-3481c44,31080040
-3481c48,11000005
-3481c50,96080070
-3481c54,3108ff0f
-3481c58,35080030
-3481c5c,a6080070
-3481c60,92280001
-3481c64,a2080069
-3481c68,96280002
-3481c6c,a608006a
-3481c70,8e280004
-3481c74,ae08006c
-3481c78,c100728
-3481c7c,34040000
-3481c80,c100728
-3481c84,34040001
-3481c88,c100728
-3481c8c,34040002
-3481c90,8fbf0010
-3481c94,27bd0018
-3481c98,3e00008
-3481ca0,2044021
-3481ca4,3c098040
-3481ca8,25291d48
-3481cac,910a006c
-3481cb0,340100ff
-3481cb4,11410005
-3481cbc,12a4821
-3481cc0,91290000
-3481cc4,1520001c
-3481ccc,3c098040
-3481cd0,25291d3f
-3481cd4,25290001
-3481cd8,912a0000
-3481cdc,11400013
-3481ce4,20a5821
-3481ce8,916b0074
-3481cec,340100ff
-3481cf0,1161fff8
-3481cf8,920c006c
-3481cfc,118afff5
-3481d04,920c006d
-3481d08,118afff2
-3481d10,920c006e
-3481d14,118affef
-3481d1c,a10b0069
-3481d20,a10a006c
-3481d24,10000004
-3481d2c,340900ff
-3481d30,a1090069
-3481d34,a109006c
-3481d38,3e00008
-3481d40,90f0203
-3481d44,10d0b00
-3481d48,10101
-3481d4c,1010001
-3481d50,1010101
-3481d54,10001
-3481d58,1010101
-3481d5c,1010100
-3481d60,330821
-3481d64,200f0047
-3481d68,15ea000e
-3481d6c,3c028012
-3481d70,8c42a5d4
-3481d74,8e6f00a4
-3481d78,f7a03
-3481d7c,14400005
-3481d80,34024830
-3481d84,15e20007
-3481d8c,24190003
-3481d90,10000004
-3481d94,34026311
-3481d98,15e20002
+348177c,3c0d4364
+3481780,10000006
+3481784,ad0d01bc
+3481788,3c0c4379
+348178c,156c0003
+3481790,3c09803b
+3481794,2529967c
+3481798,ad090664
+348179c,3e00008
+34817a0,260501a4
+34817a4,a498017c
+34817a8,3c08801d
+34817ac,250884a0
+34817b0,850900a4
+34817b4,340a0002
+34817b8,152a000e
+34817bc,8c890138
+34817c0,8d290010
+34817c4,252a3398
+34817c8,ac8a0184
+34817cc,340b0001
+34817d0,a48b017c
+34817d4,27bdffe8
+34817d8,afbf0014
+34817dc,3c053dcd
+34817e0,24a5cccd
+34817e4,c0083e2
+34817ec,8fbf0014
+34817f0,27bd0018
+34817f4,3e00008
+34817fc,948e001c
+3481800,21cdffce
+3481804,5a00010
+3481808,34020000
+348180c,31a90007
+3481810,340a0001
+3481814,12a5004
+3481818,d48c2
+348181c,3c0c8012
+3481820,258ca5d0
+3481824,1896020
+3481828,918b05b4
+348182c,16a5824
+3481830,34020000
+3481834,11600004
+348183c,340d0026
+3481840,a48d001c
+3481844,34020001
+3481848,3e00008
+3481850,94ae001c
+3481854,21cdffce
+3481858,5a0000b
+348185c,34020000
+3481860,31a90007
+3481864,340a0001
+3481868,12a5004
+348186c,d48c2
+3481870,3c0c8012
+3481874,258ca5d0
+3481878,1896020
+348187c,918b05b4
+3481880,16a5825
+3481884,a18b05b4
+3481888,3e00008
+3481890,27bdfff0
+3481894,afbf0008
+3481898,28810032
+348189c,10200003
+34818a0,801021
+34818a4,320f809
+34818ac,8fbf0008
+34818b0,27bd0010
+34818b4,3e00008
+34818bc,3c08801d
+34818c0,250884a0
+34818c4,3c098012
+34818c8,2529a5d0
+34818cc,950a00a4
+34818d0,3401003e
+34818d4,15410002
+34818d8,912b1397
+34818dc,216aff2a
+34818e0,960b001c
+34818e4,216b0001
+34818e8,340c0001
+34818ec,16c6004
+34818f0,3401001c
+34818f4,1410018
+34818f8,6812
+34818fc,12d7020
+3481900,8dcf00e4
+3481904,18f1024
+3481908,3e00008
+3481910,3c08801d
+3481914,250884a0
+3481918,3c098012
+348191c,2529a5d0
+3481920,950a00a4
+3481924,3401003e
+3481928,15410002
+348192c,912b1397
+3481930,216aff2a
+3481934,848b001c
+3481938,216b0001
+348193c,340c0001
+3481940,16c6004
+3481944,3401001c
+3481948,1410018
+348194c,6812
+3481950,12d7020
+3481954,8dcf00e4
+3481958,18f7825
+348195c,adcf00e4
+3481960,3e00008
+3481968,27bdffe8
+348196c,afbf0010
+3481970,c101fbb
+3481978,8fbf0010
+348197c,27bd0018
+3481980,8fae0018
+3481984,3e00008
+3481988,3c018010
+348198c,340100ff
+3481990,15210002
+3481994,92220000
+3481998,340200ff
+348199c,3e00008
+34819a0,34010009
+34819a4,27bdffe8
+34819a8,afa20010
+34819ac,afbf0014
+34819b0,c10068d
+34819b8,14400002
+34819bc,91830000
+34819c0,340300ff
+34819c4,8fa20010
+34819c8,8fbf0014
+34819cc,27bd0018
+34819d0,3e00008
+34819d4,34010009
+34819d8,27bdffe8
+34819dc,afa20010
+34819e0,afbf0014
+34819e4,960201e8
+34819e8,34010003
+34819ec,14410007
+34819f4,c10068d
+34819fc,14400007
+3481a04,10000005
+3481a08,3403007a
+3481a0c,3401017a
+3481a10,14610002
+3481a18,3403007a
+3481a1c,36280
+3481a20,18d2821
+3481a24,8fa20010
+3481a28,8fbf0014
+3481a2c,3e00008
+3481a30,27bd0018
+3481a34,27bdfff0
+3481a38,afbf0000
+3481a3c,afa30004
+3481a40,afa40008
+3481a44,c101ff7
+3481a4c,8fbf0000
+3481a50,8fa30004
+3481a54,8fa40008
+3481a58,3e00008
+3481a5c,27bd0010
+3481a60,6d7024
+3481a64,15c00002
+3481a68,91ec0000
+3481a6c,27ff003c
+3481a70,3e00008
+3481a84,3c088012
+3481a88,2508a5d0
+3481a8c,8509009c
+3481a90,352a0002
+3481a94,3e00008
+3481a98,a50a009c
+3481a9c,3c058012
+3481aa0,24a5a5d0
+3481aa4,3c088040
+3481aa8,25081a78
+3481aac,8ca90068
+3481ab0,ad090000
+3481ab4,8ca9006c
+3481ab8,ad090004
+3481abc,94a90070
+3481ac0,a5090008
+3481ac4,94a9009c
+3481ac8,a509000a
+3481acc,340807e4
+3481ad0,1054021
+3481ad4,34090e64
+3481ad8,1254821
+3481adc,340a0008
+3481ae0,8d0b0000
+3481ae4,8d2c0000
+3481ae8,ad2b0000
+3481aec,ad0c0000
+3481af0,2508001c
+3481af4,25290004
+3481af8,254affff
+3481afc,1d40fff8
+3481b04,801be03
+3481b0c,27bdffe0
+3481b10,afb00010
+3481b14,afb10014
+3481b18,afbf0018
+3481b1c,3c108012
+3481b20,2610a5d0
+3481b24,3c118040
+3481b28,26311a78
+3481b2c,8e080004
+3481b30,11000005
+3481b38,c1006ed
+3481b40,10000003
+3481b48,c100700
+3481b50,c1006e0
+3481b54,34040000
+3481b58,c1006e0
+3481b5c,34040001
+3481b60,c1006e0
+3481b64,34040002
+3481b68,8fb00010
+3481b6c,8fb10014
+3481b70,8fbf0018
+3481b74,27bd0020
+3481b78,3e00008
+3481b80,2044021
+3481b84,9109006c
+3481b88,340100ff
+3481b8c,11210007
+3481b94,2094821
+3481b98,91290074
+3481b9c,3401002c
+3481ba0,11210002
+3481ba8,a1090069
+3481bac,3e00008
+3481bb4,27bdffe8
+3481bb8,afbf0010
+3481bbc,8e280000
+3481bc0,ae080040
+3481bc4,8e280004
+3481bc8,ae080044
+3481bcc,96280008
+3481bd0,a6080048
+3481bd4,a2000f33
+3481bd8,9208004a
+3481bdc,340100ff
+3481be0,15010003
+3481be8,c100713
+3481bf0,8fbf0010
+3481bf4,27bd0018
+3481bf8,3e00008
+3481c00,8e080040
+3481c04,ae080068
+3481c08,8e080044
+3481c0c,ae08006c
+3481c10,96080048
+3481c14,9209009d
+3481c18,31290020
+3481c1c,15200002
+3481c24,3108ffdf
+3481c28,a6080070
+3481c2c,92080068
+3481c30,340100ff
+3481c34,15010003
+3481c3c,34080001
+3481c40,a2080f33
+3481c44,3e00008
+3481c4c,27bdffe8
+3481c50,afbf0010
+3481c54,9608009c
+3481c58,31080040
+3481c5c,11000005
+3481c64,96080070
+3481c68,3108ff0f
+3481c6c,35080030
+3481c70,a6080070
+3481c74,92280001
+3481c78,a2080069
+3481c7c,96280002
+3481c80,a608006a
+3481c84,8e280004
+3481c88,ae08006c
+3481c8c,c10072d
+3481c90,34040000
+3481c94,c10072d
+3481c98,34040001
+3481c9c,c10072d
+3481ca0,34040002
+3481ca4,8fbf0010
+3481ca8,27bd0018
+3481cac,3e00008
+3481cb4,2044021
+3481cb8,3c098040
+3481cbc,25291d5c
+3481cc0,910a006c
+3481cc4,340100ff
+3481cc8,11410005
+3481cd0,12a4821
+3481cd4,91290000
+3481cd8,1520001c
+3481ce0,3c098040
+3481ce4,25291d53
+3481ce8,25290001
+3481cec,912a0000
+3481cf0,11400013
+3481cf8,20a5821
+3481cfc,916b0074
+3481d00,340100ff
+3481d04,1161fff8
+3481d0c,920c006c
+3481d10,118afff5
+3481d18,920c006d
+3481d1c,118afff2
+3481d24,920c006e
+3481d28,118affef
+3481d30,a10b0069
+3481d34,a10a006c
+3481d38,10000004
+3481d40,340900ff
+3481d44,a1090069
+3481d48,a109006c
+3481d4c,3e00008
+3481d54,90f0203
+3481d58,10d0b00
+3481d5c,10101
+3481d60,1010001
+3481d64,1010101
+3481d68,10001
+3481d6c,1010101
+3481d70,1010100
+3481d74,330821
+3481d78,200f0047
+3481d7c,15ea000e
+3481d80,3c028012
+3481d84,8c42a5d4
+3481d88,8e6f00a4
+3481d8c,f7a03
+3481d90,14400005
+3481d94,34024830
+3481d98,15e20007
3481da0,24190003
-3481da4,3e00008
-3481dac,330821
-3481db0,3c028012
-3481db4,8c42a5d4
-3481db8,8e6f00a4
-3481dbc,f7a03
-3481dc0,14400005
-3481dc4,34024830
-3481dc8,15e20007
-3481dd0,24190003
-3481dd4,10000004
-3481dd8,34026311
-3481ddc,15e20002
+3481da4,10000004
+3481da8,34026311
+3481dac,15e20002
+3481db4,24190003
+3481db8,3e00008
+3481dc0,330821
+3481dc4,3c028012
+3481dc8,8c42a5d4
+3481dcc,8e6f00a4
+3481dd0,f7a03
+3481dd4,14400005
+3481dd8,34024830
+3481ddc,15e20007
3481de4,24190003
-3481de8,3e00008
-3481df0,34010018
-3481df4,14810015
-3481dfc,14400013
-3481e04,3c0a8012
-3481e08,254aa5d0
-3481e0c,814800a6
-3481e10,31080020
-3481e14,1100000d
-3481e18,34020000
-3481e1c,8148007b
-3481e20,34090007
-3481e24,11090005
-3481e28,34090008
-3481e2c,11090003
-3481e34,8100793
-3481e38,34020000
-3481e3c,81480ed6
-3481e40,35080001
-3481e44,a1480ed6
-3481e48,34020001
-3481e4c,3e00008
-3481e54,3c018040
-3481e58,8c210ccc
-3481e5c,10200006
-3481e64,94480670
-3481e68,31010800
-3481e6c,34080800
-3481e70,3e00008
-3481e78,950804c6
-3481e7c,3401000b
-3481e80,3e00008
-3481e88,27bdffe8
-3481e8c,afa50000
-3481e90,afa60004
-3481e94,afa70008
-3481e98,afbf0010
-3481e9c,80a80000
-3481ea0,25090001
-3481ea4,15200005
-3481eac,52025
-3481eb0,24a50008
-3481eb4,c015c0c
-3481eb8,24c6fff8
-3481ebc,c1024fc
-3481ec4,8fbf0010
-3481ec8,8fa70008
-3481ecc,8fa60004
-3481ed0,8fa50000
-3481ed4,8015c0c
-3481ed8,27bd0018
-3481edc,ac4d066c
-3481ee0,a0400141
-3481ee4,a0400144
-3481ee8,340e00fe
-3481eec,3e00008
-3481ef0,a04e0142
-3481ef4,a2250021
-3481ef8,3c108040
-3481efc,26100898
-3481f00,26100004
-3481f04,8e0a0000
-3481f08,1140000b
-3481f10,a7c02
-3481f14,1f17820
-3481f18,3158ff00
-3481f1c,18c202
-3481f20,17000003
-3481f24,315900ff
-3481f28,81ea0000
-3481f2c,32ac825
-3481f30,81007c0
-3481f34,a1f90000
-3481f38,3e00008
-3481f40,27bdfff0
-3481f44,afbf0008
-3481f48,c1007de
-3481f4c,2264ffff
-3481f50,344a0000
-3481f54,8fbf0008
-3481f58,27bd0010
-3481f5c,27bdfff0
-3481f60,afbf0008
-3481f64,c1007de
-3481f68,36440000
-3481f6c,34500000
-3481f70,8fbf0008
-3481f74,27bd0010
-3481f78,3c088040
-3481f7c,25080025
-3481f80,91080000
-3481f84,15000007
-3481f8c,3c088012
-3481f90,2508a5d0
-3481f94,1044020
-3481f98,91020024
-3481f9c,10000007
-3481fa4,840c0
-3481fa8,3c028040
-3481fac,24420034
-3481fb0,1024020
-3481fb4,1044020
-3481fb8,91020000
-3481fbc,3e00008
-3481fc4,8fb60030
-3481fc8,8fb70034
-3481fcc,8fbe0038
-3481fd0,3c088040
-3481fd4,25080025
-3481fd8,a1000000
-3481fdc,3e00008
-3481fe4,3c0a8012
-3481fe8,8d4aa5d4
-3481fec,15400006
-3481ff0,31780001
-3481ff4,17000007
-3481ff8,3c184230
-3481ffc,3c184250
-3482000,3e00008
-3482008,17000002
-348200c,3c184210
-3482010,3c184238
+3481de8,10000004
+3481dec,34026311
+3481df0,15e20002
+3481df8,24190003
+3481dfc,3e00008
+3481e04,34010018
+3481e08,14810015
+3481e10,14400013
+3481e18,3c0a8012
+3481e1c,254aa5d0
+3481e20,814800a6
+3481e24,31080020
+3481e28,1100000d
+3481e2c,34020000
+3481e30,8148007b
+3481e34,34090007
+3481e38,11090005
+3481e3c,34090008
+3481e40,11090003
+3481e48,8100798
+3481e4c,34020000
+3481e50,81480ed6
+3481e54,35080001
+3481e58,a1480ed6
+3481e5c,34020001
+3481e60,3e00008
+3481e68,3c018040
+3481e6c,8c210ccc
+3481e70,10200006
+3481e78,94480670
+3481e7c,31010800
+3481e80,34080800
+3481e84,3e00008
+3481e8c,950804c6
+3481e90,3401000b
+3481e94,3e00008
+3481e9c,27bdffe8
+3481ea0,afa50000
+3481ea4,afa60004
+3481ea8,afa70008
+3481eac,afbf0010
+3481eb0,80a80000
+3481eb4,25090001
+3481eb8,15200005
+3481ec0,52025
+3481ec4,24a50008
+3481ec8,c015c0c
+3481ecc,24c6fff8
+3481ed0,c102544
+3481ed8,8fbf0010
+3481edc,8fa70008
+3481ee0,8fa60004
+3481ee4,8fa50000
+3481ee8,8015c0c
+3481eec,27bd0018
+3481ef0,ac4d066c
+3481ef4,a0400141
+3481ef8,a0400144
+3481efc,340e00fe
+3481f00,3e00008
+3481f04,a04e0142
+3481f08,a2250021
+3481f0c,3c108040
+3481f10,26100898
+3481f14,26100004
+3481f18,8e0a0000
+3481f1c,1140000b
+3481f24,a7c02
+3481f28,1f17820
+3481f2c,3158ff00
+3481f30,18c202
+3481f34,17000003
+3481f38,315900ff
+3481f3c,81ea0000
+3481f40,32ac825
+3481f44,81007c5
+3481f48,a1f90000
+3481f4c,3e00008
+3481f54,27bdfff0
+3481f58,afbf0008
+3481f5c,c1007e3
+3481f60,2264ffff
+3481f64,344a0000
+3481f68,8fbf0008
+3481f6c,27bd0010
+3481f70,27bdfff0
+3481f74,afbf0008
+3481f78,c1007e3
+3481f7c,36440000
+3481f80,34500000
+3481f84,8fbf0008
+3481f88,27bd0010
+3481f8c,3c088040
+3481f90,25080025
+3481f94,91080000
+3481f98,15000007
+3481fa0,3c088012
+3481fa4,2508a5d0
+3481fa8,1044020
+3481fac,91020024
+3481fb0,10000007
+3481fb8,840c0
+3481fbc,3c028040
+3481fc0,24420034
+3481fc4,1024020
+3481fc8,1044020
+3481fcc,91020000
+3481fd0,3e00008
+3481fd8,8fb60030
+3481fdc,8fb70034
+3481fe0,8fbe0038
+3481fe4,3c088040
+3481fe8,25080025
+3481fec,a1000000
+3481ff0,3e00008
+3481ff8,3c0a8012
+3481ffc,8d4aa5d4
+3482000,15400006
+3482004,31780001
+3482008,17000007
+348200c,3c184230
+3482010,3c184250
3482014,3e00008
-348201c,906e13e2
-3482020,90620068
-3482024,34010059
-3482028,10410002
-348202c,34010fff
-3482030,340100ff
-3482034,3e00008
-348203c,3c048012
-3482040,2484a5d0
-3482044,908e13e2
-3482048,90820068
-348204c,34010059
-3482050,10410002
-3482054,34010fff
-3482058,340100ff
-348205c,3e00008
-3482064,3c08801f
-3482068,25085de0
-348206c,8d01009c
-3482070,14200003
-3482074,46025102
-3482078,3c083f80
-348207c,44882000
-3482080,3e00008
-3482088,ac800118
-348208c,27ff0030
-3482090,3e00008
-3482094,ac8e0180
-3482098,3c018040
-348209c,8c210cbc
-34820a0,10200008
-34820a8,81efa64c
-34820ac,34180009
-34820b0,11f80002
-34820b4,34180001
-34820b8,34180000
-34820bc,3e00008
-34820c4,8defa670
-34820c8,31f80018
-34820cc,3e00008
-34820d4,3c018040
-34820d8,8c210cbc
-34820dc,10200008
-34820e4,816ba64c
-34820e8,340c0009
-34820ec,116c0002
-34820f0,340c0001
-34820f4,340c0000
-34820f8,3e00008
-3482100,8d6ba670
-3482104,316c0018
-3482108,3e00008
-3482110,3c018040
-3482114,8c210cbc
-3482118,10200008
-3482120,3c098012
-3482124,812aa64c
-3482128,340b0009
-348212c,114b0009
-3482130,34020000
-3482134,3e00008
-3482138,34020002
-348213c,3c098012
-3482140,812aa673
-3482144,314a0038
-3482148,15400002
-348214c,34020000
-3482150,34020002
-3482154,3e00008
-348215c,3c0a8040
-3482160,8d4a0cc0
-3482164,1140000a
-3482168,34010001
-348216c,1141000b
-3482170,34010002
-3482174,11410026
-3482178,34010003
-348217c,11410051
-3482180,34010004
-3482184,11410069
-3482188,34010005
-348218c,11410061
-3482190,34010000
-3482194,3e00008
-3482198,340a0000
-348219c,3401003f
-34821a0,415024
-34821a4,340f0000
-34821a8,31580001
-34821ac,13000002
-34821b4,25ef0001
-34821b8,31580002
-34821bc,13000002
-34821c4,25ef0001
-34821c8,31580004
-34821cc,13000002
-34821d4,25ef0001
-34821d8,31580008
-34821dc,13000002
-34821e4,25ef0001
-34821e8,31580010
-34821ec,13000002
-34821f4,25ef0001
-34821f8,31580020
-34821fc,13000002
-3482204,25ef0001
-3482208,10000043
-3482210,3c01001c
-3482214,2421003f
-3482218,415024
-348221c,340f0000
-3482220,31580001
-3482224,13000002
-348222c,25ef0001
-3482230,31580002
-3482234,13000002
-348223c,25ef0001
-3482240,31580004
-3482244,13000002
-348224c,25ef0001
-3482250,31580008
-3482254,13000002
-348225c,25ef0001
-3482260,31580010
-3482264,13000002
-348226c,25ef0001
-3482270,31580020
-3482274,13000002
-348227c,25ef0001
-3482280,3c180004
-3482284,158c024
+348201c,17000002
+3482020,3c184210
+3482024,3c184238
+3482028,3e00008
+3482030,906e13e2
+3482034,90620068
+3482038,34010059
+348203c,10410002
+3482040,34010fff
+3482044,340100ff
+3482048,3e00008
+3482050,3c048012
+3482054,2484a5d0
+3482058,908e13e2
+348205c,90820068
+3482060,34010059
+3482064,10410002
+3482068,34010fff
+348206c,340100ff
+3482070,3e00008
+3482078,3c08801f
+348207c,25085de0
+3482080,8d01009c
+3482084,14200003
+3482088,46025102
+348208c,3c083f80
+3482090,44882000
+3482094,3e00008
+348209c,ac800118
+34820a0,27ff0030
+34820a4,3e00008
+34820a8,ac8e0180
+34820ac,3c018040
+34820b0,8c210cbc
+34820b4,10200008
+34820bc,81efa64c
+34820c0,34180009
+34820c4,11f80002
+34820c8,34180001
+34820cc,34180000
+34820d0,3e00008
+34820d8,8defa670
+34820dc,31f80018
+34820e0,3e00008
+34820e8,3c018040
+34820ec,8c210cbc
+34820f0,10200008
+34820f8,816ba64c
+34820fc,340c0009
+3482100,116c0002
+3482104,340c0001
+3482108,340c0000
+348210c,3e00008
+3482114,8d6ba670
+3482118,316c0018
+348211c,3e00008
+3482124,3c018040
+3482128,8c210cbc
+348212c,10200008
+3482134,3c098012
+3482138,812aa64c
+348213c,340b0009
+3482140,114b0009
+3482144,34020000
+3482148,3e00008
+348214c,34020002
+3482150,3c098012
+3482154,812aa673
+3482158,314a0038
+348215c,15400002
+3482160,34020000
+3482164,34020002
+3482168,3e00008
+3482170,3c0a8040
+3482174,8d4a0cc0
+3482178,1140000a
+348217c,34010001
+3482180,1141000b
+3482184,34010002
+3482188,11410026
+348218c,34010003
+3482190,11410051
+3482194,34010004
+3482198,11410069
+348219c,34010005
+34821a0,11410061
+34821a4,34010000
+34821a8,3e00008
+34821ac,340a0000
+34821b0,3401003f
+34821b4,415024
+34821b8,340f0000
+34821bc,31580001
+34821c0,13000002
+34821c8,25ef0001
+34821cc,31580002
+34821d0,13000002
+34821d8,25ef0001
+34821dc,31580004
+34821e0,13000002
+34821e8,25ef0001
+34821ec,31580008
+34821f0,13000002
+34821f8,25ef0001
+34821fc,31580010
+3482200,13000002
+3482208,25ef0001
+348220c,31580020
+3482210,13000002
+3482218,25ef0001
+348221c,10000043
+3482224,3c01001c
+3482228,2421003f
+348222c,415024
+3482230,340f0000
+3482234,31580001
+3482238,13000002
+3482240,25ef0001
+3482244,31580002
+3482248,13000002
+3482250,25ef0001
+3482254,31580004
+3482258,13000002
+3482260,25ef0001
+3482264,31580008
+3482268,13000002
+3482270,25ef0001
+3482274,31580010
+3482278,13000002
+3482280,25ef0001
+3482284,31580020
3482288,13000002
3482290,25ef0001
-3482294,3c180008
+3482294,3c180004
3482298,158c024
348229c,13000002
34822a4,25ef0001
-34822a8,3c180010
+34822a8,3c180008
34822ac,158c024
34822b0,13000002
34822b8,25ef0001
-34822bc,10000016
-34822c4,3c01001c
-34822c8,415024
-34822cc,340f0000
-34822d0,3c180004
-34822d4,158c024
-34822d8,13000002
-34822e0,25ef0001
-34822e4,3c180008
+34822bc,3c180010
+34822c0,158c024
+34822c4,13000002
+34822cc,25ef0001
+34822d0,10000016
+34822d8,3c01001c
+34822dc,415024
+34822e0,340f0000
+34822e4,3c180004
34822e8,158c024
34822ec,13000002
34822f4,25ef0001
-34822f8,3c180010
+34822f8,3c180008
34822fc,158c024
3482300,13000002
3482308,25ef0001
-348230c,10000002
-3482314,84ef00d0
-3482318,34010000
-348231c,3c188040
-3482320,87180cd0
-3482324,3e00008
-3482328,1f8502a
-348232c,34010018
-3482330,415024
-3482334,15410006
-348233c,90ef0084
-3482340,340a0012
-3482344,114f0002
-348234c,3401ffff
-3482350,3e00008
-3482354,415024
-3482358,3c098040
-348235c,8d290cc4
-3482360,340a0001
-3482364,112a000e
-3482368,340a0002
-348236c,112a0029
-3482370,340a0003
-3482374,112a0054
-3482378,340a0004
-348237c,112a0066
-3482384,340b0018
-3482388,4b5024
-348238c,156a0002
-3482390,34030000
-3482394,34030001
-3482398,3e00008
-34823a0,3401003f
-34823a4,415024
-34823a8,340c0000
-34823ac,314b0001
-34823b0,11600002
-34823b8,258c0001
-34823bc,314b0002
-34823c0,11600002
-34823c8,258c0001
-34823cc,314b0004
-34823d0,11600002
-34823d8,258c0001
-34823dc,314b0008
-34823e0,11600002
-34823e8,258c0001
-34823ec,314b0010
-34823f0,11600002
-34823f8,258c0001
-34823fc,314b0020
-3482400,11600002
-3482408,258c0001
-348240c,10000043
-3482414,3c01001c
-3482418,2421003f
-348241c,415024
-3482420,340c0000
-3482424,314b0001
-3482428,11600002
-3482430,258c0001
-3482434,314b0002
-3482438,11600002
-3482440,258c0001
-3482444,314b0004
-3482448,11600002
-3482450,258c0001
-3482454,314b0008
-3482458,11600002
-3482460,258c0001
-3482464,314b0010
-3482468,11600002
-3482470,258c0001
-3482474,314b0020
-3482478,11600002
-3482480,258c0001
-3482484,3c0b0004
-3482488,14b5824
+348230c,3c180010
+3482310,158c024
+3482314,13000002
+348231c,25ef0001
+3482320,10000002
+3482328,84ef00d0
+348232c,34010000
+3482330,3c188040
+3482334,87180cd0
+3482338,3e00008
+348233c,1f8502a
+3482340,34010018
+3482344,415024
+3482348,15410006
+3482350,90ef0084
+3482354,340a0012
+3482358,114f0002
+3482360,3401ffff
+3482364,3e00008
+3482368,415024
+348236c,3c098040
+3482370,8d290cc4
+3482374,340a0001
+3482378,112a000e
+348237c,340a0002
+3482380,112a0029
+3482384,340a0003
+3482388,112a0054
+348238c,340a0004
+3482390,112a0066
+3482398,340b0018
+348239c,4b5024
+34823a0,156a0002
+34823a4,34030000
+34823a8,34030001
+34823ac,3e00008
+34823b4,3401003f
+34823b8,415024
+34823bc,340c0000
+34823c0,314b0001
+34823c4,11600002
+34823cc,258c0001
+34823d0,314b0002
+34823d4,11600002
+34823dc,258c0001
+34823e0,314b0004
+34823e4,11600002
+34823ec,258c0001
+34823f0,314b0008
+34823f4,11600002
+34823fc,258c0001
+3482400,314b0010
+3482404,11600002
+348240c,258c0001
+3482410,314b0020
+3482414,11600002
+348241c,258c0001
+3482420,10000043
+3482428,3c01001c
+348242c,2421003f
+3482430,415024
+3482434,340c0000
+3482438,314b0001
+348243c,11600002
+3482444,258c0001
+3482448,314b0002
+348244c,11600002
+3482454,258c0001
+3482458,314b0004
+348245c,11600002
+3482464,258c0001
+3482468,314b0008
+348246c,11600002
+3482474,258c0001
+3482478,314b0010
+348247c,11600002
+3482484,258c0001
+3482488,314b0020
348248c,11600002
3482494,258c0001
-3482498,3c0b0008
+3482498,3c0b0004
348249c,14b5824
34824a0,11600002
34824a8,258c0001
-34824ac,3c0b0010
+34824ac,3c0b0008
34824b0,14b5824
34824b4,11600002
34824bc,258c0001
-34824c0,10000016
-34824c8,3c01001c
-34824cc,415024
-34824d0,340c0000
-34824d4,3c0b0004
-34824d8,14b5824
-34824dc,11600002
-34824e4,258c0001
-34824e8,3c0b0008
+34824c0,3c0b0010
+34824c4,14b5824
+34824c8,11600002
+34824d0,258c0001
+34824d4,10000016
+34824dc,3c01001c
+34824e0,415024
+34824e4,340c0000
+34824e8,3c0b0004
34824ec,14b5824
34824f0,11600002
34824f8,258c0001
-34824fc,3c0b0010
+34824fc,3c0b0008
3482500,14b5824
3482504,11600002
348250c,258c0001
-3482510,10000002
-3482518,860c00d0
-348251c,34010000
-3482520,3c0b8040
-3482524,856b0cd2
-3482528,18b602a
-348252c,15800002
-3482530,34030000
-3482534,34030001
-3482538,3e00008
-3482540,27bdffe4
-3482544,afb10014
-3482548,afbf0018
-348254c,3c038012
-3482550,2463a5d0
-3482554,860f001c
-3482558,31f800ff
-348255c,340100ff
-3482560,17010004
-3482564,27110400
-3482568,90781397
-348256c,3318001f
-3482570,27110430
-3482574,31e18000
-3482578,14200015
-3482580,3c088040
-3482584,8d080cc8
-3482588,1100000b
-348258c,34010001
-3482590,11010003
-3482598,1000000d
-34825a0,806100a5
-34825a4,30210020
-34825a8,10200008
-34825b0,10000007
-34825b8,c01e6d1
-34825c0,34010008
-34825c4,10410002
-34825cc,34112053
-34825d0,a611010e
-34825d4,8fbf0018
-34825d8,8fb10014
-34825dc,3e00008
-34825e0,27bd001c
-34825e4,9059008a
-34825e8,340900ff
-34825ec,11390007
-34825f4,2b290031
-34825f8,15200005
-34825fc,34190000
-3482600,34190001
-3482604,10000002
-348260c,34190000
-3482610,3e00008
-3482618,27bdfff0
-348261c,afa80000
-3482620,e7a20004
-3482624,e7a40008
-3482628,3c088040
-348262c,25080cd4
-3482630,91080000
-3482634,1100000f
-3482638,340d0200
-348263c,3c08801e
-3482640,2508aa30
-3482644,c5020028
-3482648,3c08c496
-348264c,44882000
-3482654,4604103c
-348265c,45010004
-3482664,340d0200
-3482668,10000002
-3482670,340d00c0
-3482674,c7a40008
-3482678,c7a20004
-348267c,8fa80000
-3482680,3e00008
-3482684,27bd0010
-3482688,8e2a1d44
-348268c,314a0100
-3482690,1540000a
-3482698,8e2a1d48
-348269c,314a0100
-34826a0,15400007
-34826a8,8e211d48
-34826ac,342a0100
-34826b0,ae2a1d48
-34826b4,10000003
-34826b8,5024
-34826bc,240c0000
-34826c0,340a0001
-34826c4,3e00008
-34826cc,27bdfff0
-34826d0,afbf0000
-34826d4,c10106e
-34826dc,8ece1c44
-34826e0,3c18db06
-34826e4,8fbf0000
-34826e8,3e00008
-34826ec,27bd0010
-34826f4,27bdfff0
-34826f8,afbf0004
-34826fc,afa40008
-3482700,afa1000c
-3482704,c100f64
-3482708,2002021
-348270c,8fbf0004
-3482710,8fa40008
-3482714,8fa1000c
-3482718,3e00008
-348271c,27bd0010
-3482720,27bdffe0
-3482724,afbf0004
-3482728,afa10008
-348272c,afa2000c
-3482730,afa30010
-3482734,afac0014
-3482738,c100f8b
-348273c,3002021
-3482740,40c821
-3482744,8fbf0004
-3482748,8fa10008
-348274c,8fa2000c
-3482750,8fa30010
-3482754,8fac0014
-3482758,3e00008
-348275c,27bd0020
-3482760,3f800000
-3482764,34080004
-3482768,3c09801d
-348276c,252984a0
-3482770,8d291c44
-3482774,11200016
-348277c,3c018040
-3482780,c4362760
-3482788,46166302
-348278c,9127014f
-3482790,1507000f
-3482794,448f2000
-3482798,3c07803a
-348279c,24e78bc0
-34827a0,8d280664
-34827a4,1507000a
-34827ac,3c088040
-34827b0,25080ce0
-34827b4,91080000
-34827b8,11000005
-34827c0,3c083fc0
-34827c4,4488b000
-34827cc,46166302
-34827d4,44056000
-34827d8,3e00008
-34827e0,3c188040
-34827e4,97180848
-34827e8,a5d80794
-34827ec,3c188040
-34827f0,9718084a
-34827f4,a5d80796
-34827f8,3c188040
-34827fc,9718084c
-3482800,a5d80798
-3482804,ec021
-3482808,3e00008
-3482810,27bdffe8
-3482814,afbf0004
-3482818,afb00008
-348281c,808021
-3482820,3c048040
-3482824,9484086c
-3482828,c100a1e
-3482830,ae02022c
-3482834,3c048040
-3482838,9484086e
-348283c,c100a1e
-3482844,ae020230
-3482848,3c048040
-348284c,94840870
-3482850,c100a1e
-3482858,ae020234
-348285c,c100a1e
-3482860,340400ff
-3482864,ae020238
-3482868,8fbf0004
-348286c,8fb00008
-3482870,3e00008
-3482874,27bd0018
-3482878,28810020
-348287c,14200005
-3482880,288100e0
-3482884,10200003
-348288c,10000002
-3482890,861023
-3482894,851023
-3482898,3e00008
-348289c,304200ff
-34828a4,2b010192
-34828a8,10200004
-34828b0,3c088010
+3482510,3c0b0010
+3482514,14b5824
+3482518,11600002
+3482520,258c0001
+3482524,10000002
+348252c,860c00d0
+3482530,34010000
+3482534,3c0b8040
+3482538,856b0cd2
+348253c,18b602a
+3482540,15800002
+3482544,34030000
+3482548,34030001
+348254c,3e00008
+3482554,27bdffe4
+3482558,afb10014
+348255c,afbf0018
+3482560,3c038012
+3482564,2463a5d0
+3482568,860f001c
+348256c,31f800ff
+3482570,340100ff
+3482574,17010004
+3482578,27110400
+348257c,90781397
+3482580,3318001f
+3482584,27110430
+3482588,31e18000
+348258c,14200015
+3482594,3c088040
+3482598,8d080cc8
+348259c,1100000b
+34825a0,34010001
+34825a4,11010003
+34825ac,1000000d
+34825b4,806100a5
+34825b8,30210020
+34825bc,10200008
+34825c4,10000007
+34825cc,c01e6d1
+34825d4,34010008
+34825d8,10410002
+34825e0,34112053
+34825e4,a611010e
+34825e8,8fbf0018
+34825ec,8fb10014
+34825f0,3e00008
+34825f4,27bd001c
+34825f8,9059008a
+34825fc,340900ff
+3482600,11390007
+3482608,2b290031
+348260c,15200005
+3482610,34190000
+3482614,34190001
+3482618,10000002
+3482620,34190000
+3482624,3e00008
+348262c,27bdfff0
+3482630,afa80000
+3482634,e7a20004
+3482638,e7a40008
+348263c,3c088040
+3482640,25080cd4
+3482644,91080000
+3482648,1100000f
+348264c,340d0200
+3482650,3c08801e
+3482654,2508aa30
+3482658,c5020028
+348265c,3c08c496
+3482660,44882000
+3482668,4604103c
+3482670,45010004
+3482678,340d0200
+348267c,10000002
+3482684,340d00c0
+3482688,c7a40008
+348268c,c7a20004
+3482690,8fa80000
+3482694,3e00008
+3482698,27bd0010
+348269c,8e2a1d44
+34826a0,314a0100
+34826a4,1540000a
+34826ac,8e2a1d48
+34826b0,314a0100
+34826b4,15400007
+34826bc,8e211d48
+34826c0,342a0100
+34826c4,ae2a1d48
+34826c8,10000003
+34826cc,5024
+34826d0,240c0000
+34826d4,340a0001
+34826d8,3e00008
+34826e0,27bdfff0
+34826e4,afbf0000
+34826e8,c101047
+34826f0,8ece1c44
+34826f4,3c18db06
+34826f8,8fbf0000
+34826fc,3e00008
+3482700,27bd0010
+3482708,a21901e9
+348270c,27bdffe0
+3482710,afbf0004
+3482714,afa40008
+3482718,afa5000c
+348271c,afa80010
+3482720,e7aa0014
+3482724,e7b00018
+3482728,c100f60
+348272c,2002021
+3482730,8fbf0004
+3482734,8fa40008
+3482738,8fa5000c
+348273c,8fa80010
+3482740,c7aa0014
+3482744,c7b00018
+3482748,3e00008
+348274c,27bd0020
+3482750,3f800000
+3482754,34080004
+3482758,3c09801d
+348275c,252984a0
+3482760,8d291c44
+3482764,11200016
+348276c,3c018040
+3482770,c4362750
+3482778,46166302
+348277c,9127014f
+3482780,1507000f
+3482784,448f2000
+3482788,3c07803a
+348278c,24e78bc0
+3482790,8d280664
+3482794,1507000a
+348279c,3c088040
+34827a0,25080cdf
+34827a4,91080000
+34827a8,11000005
+34827b0,3c083fc0
+34827b4,4488b000
+34827bc,46166302
+34827c4,44056000
+34827c8,3e00008
+34827d0,3c188040
+34827d4,97180848
+34827d8,a5d80794
+34827dc,3c188040
+34827e0,9718084a
+34827e4,a5d80796
+34827e8,3c188040
+34827ec,9718084c
+34827f0,a5d80798
+34827f4,ec021
+34827f8,3e00008
+3482800,27bdffe8
+3482804,afbf0004
+3482808,afb00008
+348280c,808021
+3482810,3c048040
+3482814,9484086c
+3482818,c100a1a
+3482820,ae02022c
+3482824,3c048040
+3482828,9484086e
+348282c,c100a1a
+3482834,ae020230
+3482838,3c048040
+348283c,94840870
+3482840,c100a1a
+3482848,ae020234
+348284c,c100a1a
+3482850,340400ff
+3482854,ae020238
+3482858,8fbf0004
+348285c,8fb00008
+3482860,3e00008
+3482864,27bd0018
+3482868,28810020
+348286c,14200005
+3482870,288100e0
+3482874,10200003
+348287c,10000002
+3482880,861023
+3482884,851023
+3482888,3e00008
+348288c,304200ff
+3482894,2b010192
+3482898,10200004
+34828a0,3c088010
+34828a4,3e00008
+34828a8,25088ff8
+34828ac,3c088040
+34828b0,25080c9c
34828b4,3e00008
-34828b8,25088ff8
-34828bc,3c088040
-34828c0,25080c9c
-34828c4,3e00008
-34828c8,2718fe6d
-34828cc,8e1821
-34828d0,28c10192
-34828d4,10200004
-34828dc,3c198010
+34828b8,2718fe6d
+34828bc,8e1821
+34828c0,28c10192
+34828c4,10200004
+34828cc,3c198010
+34828d0,3e00008
+34828d4,27398ff8
+34828d8,3c198040
+34828dc,27390c9c
34828e0,3e00008
-34828e4,27398ff8
-34828e8,3c198040
-34828ec,27390c9c
-34828f0,3e00008
-34828f4,24c6fe6d
-34828f8,86190000
-34828fc,8e050004
-3482900,26040008
-3482904,194023
-3482908,29010192
-348290c,10200004
-3482914,3c138010
+34828e4,24c6fe6d
+34828e8,86190000
+34828ec,8e050004
+34828f0,26040008
+34828f4,194023
+34828f8,29010192
+34828fc,10200004
+3482904,3c138010
+3482908,3e00008
+348290c,26738ff8
+3482910,3c138040
+3482914,26730c9c
3482918,3e00008
-348291c,26738ff8
-3482920,3c138040
-3482924,26730c9c
-3482928,3e00008
-348292c,2508fe6d
-3482930,8e040010
-3482934,28610192
-3482938,10200004
-3482940,3c138010
-3482944,8100a56
-3482948,26738ff8
-348294c,3c138040
-3482950,26730c9c
-3482954,2463fe6d
-3482958,378c0
-348295c,26f1021
-3482960,3e00008
-3482964,8c450000
-3482968,8fa40020
-348296c,3c088040
-3482970,81080cd7
-3482974,24060050
-3482978,1100000b
-3482980,84860014
-3482984,50c00008
+348291c,2508fe6d
+3482920,8e040010
+3482924,28610192
+3482928,10200004
+3482930,3c138010
+3482934,8100a52
+3482938,26738ff8
+348293c,3c138040
+3482940,26730c9c
+3482944,2463fe6d
+3482948,378c0
+348294c,26f1021
+3482950,3e00008
+3482954,8c450000
+3482958,8fa40020
+348295c,3c088040
+3482960,81080cd7
+3482964,24060050
+3482968,1100000b
+3482970,84860014
+3482974,50c00008
+3482978,24060050
+348297c,80a81d44
+3482980,c85824
+3482984,55600004
3482988,24060050
-348298c,80a81d44
-3482990,c85824
-3482994,55600004
-3482998,24060050
-348299c,1064025
-34829a0,a0a81d44
-34829a4,24c60014
-34829a8,3e00008
-34829b0,27bdfff0
-34829b4,afbf0004
-34829b8,afa80008
-34829bc,afa9000c
-34829c0,3c088040
-34829c4,81080cd7
-34829c8,11000009
-34829d0,86080014
-34829d4,11000006
-34829dc,82291d44
-34829e0,1094024
-34829e4,24020001
-34829e8,11000003
-34829f0,c01c6a5
-34829f8,8fbf0004
-34829fc,8fa80008
-3482a00,8fa9000c
-3482a04,27bd0010
-3482a08,3e00008
-3482a10,8fb00034
-3482a14,848800b4
-3482a18,11000002
-3482a20,a48000b0
-3482a24,3e00008
-3482a2c,1b9fcd5
-3482a30,fb251ad2
-3482a34,f2dc
-3482a38,8022
-3482a3c,23bdffec
-3482a40,afbf0010
-3482a44,9608001c
-3482a48,31088000
-3482a4c,1100000f
-3482a54,3c038012
-3482a58,2463a5d0
-3482a5c,946d0edc
-3482a60,31ad0400
-3482a64,11a0000b
-3482a6c,8c6e0004
-3482a70,15c00008
-3482a78,948d1d2a
-3482a7c,35ae0001
-3482a80,a48e1d2a
-3482a84,10000003
-3482a8c,c037385
-3482a94,8fbf0010
-3482a98,23bd0014
-3482a9c,3e00008
-3482aa4,8c6e0004
-3482aa8,3e00008
-3482ab0,8488001c
-3482ab4,34010002
-3482ab8,15010015
-3482ac0,3c028012
-3482ac4,2442a5d0
-3482ac8,8c4b0004
-3482acc,15600012
-3482ad4,3c098040
-3482ad8,25292b20
-3482adc,ac890154
-3482ae0,27bdffe0
-3482ae4,afbf0010
-3482ae8,afa50014
-3482aec,8fa60014
-3482af0,3c058040
-3482af4,24a52a2c
-3482af8,c009571
-3482afc,24c41c24
-3482b00,8fbf0010
-3482b04,27bd0020
-3482b08,10000003
-3482b10,afa40000
-3482b14,afa50004
-3482b18,3e00008
-3482b20,27bdffd8
-3482b24,afb00020
-3482b28,afbf0024
-3482b2c,afa5002c
-3482b30,808025
-3482b34,c600015c
-3482b38,3c01c4a4
-3482b3c,24212000
-3482b40,44811000
-3482b44,3c028012
-3482b48,2442a5d0
-3482b4c,944b0edc
-3482b50,316c0400
-3482b54,944b0ee0
-3482b58,11800031
-3482b60,94ad1d2a
-3482b64,31ae0001
-3482b68,11c00006
-3482b70,31adfffe
-3482b74,a4ad1d2a
-3482b78,34010200
-3482b7c,1615826
-3482b80,a44b0ee0
-3482b84,316c0200
-3482b88,1180000b
-3482b90,34010000
-3482b94,44812000
-3482b98,3c064080
-3482b9c,44863000
-3482ba4,46060200
-3482ba8,4604403c
-3482bb0,10000009
-3482bb8,3c01c42a
-3482bbc,44812000
-3482bc0,3c06c080
-3482bc4,44863000
-3482bcc,46060200
-3482bd0,4608203c
-3482bd8,45000005
-3482be0,46004106
-3482be4,c008c42
-3482be8,3405205e
-3482bec,2002025
-3482bf0,e604015c
-3482bf4,46022100
-3482bf8,e6040028
-3482bfc,4600240d
-3482c00,44098000
-3482c04,8fa2002c
-3482c08,8c5807c0
-3482c0c,8f190028
-3482c10,240ffb57
-3482c14,a72f0012
-3482c18,a7290022
-3482c1c,a7290032
-3482c20,8fbf0024
-3482c24,8fb00020
-3482c28,27bd0028
-3482c2c,3e00008
-3482c34,ac20753c
-3482c38,3c018040
-3482c3c,90210cdc
-3482c40,10200008
-3482c44,3c01801d
-3482c48,242184a0
-3482c4c,94211d2c
-3482c50,302100c0
-3482c54,14200003
-3482c5c,801ce4c
-3482c64,801ce45
-3482c6c,3c088012
-3482c70,2508a5d0
-3482c74,8d0a0004
-3482c78,11400006
-3482c7c,8d090000
-3482c80,3401003b
-3482c84,15210008
-3482c8c,3c0bc47a
-3482c90,ac8b0028
-3482c94,3401016d
-3482c98,15210003
-3482ca0,3c0bc47a
-3482ca4,ac8b0028
-3482ca8,3e00008
-3482cac,340e0001
-3482cb4,3c0f8040
-3482cb8,25ef2cb0
-3482cbc,81ef0000
-3482cc0,3c188040
-3482cc4,27182cb1
-3482cc8,83180000
-3482ccc,1f87820
-3482cd0,5e00007
-3482cd4,34010003
-3482cd8,1e1082a
-3482cdc,14200002
-3482ce4,340f0008
-3482ce8,10000003
-3482cec,1f08004
-3482cf0,f7822
-3482cf4,1f08007
-3482cf8,90af003d
-3482cfc,11e00004
-3482d04,108043
-3482d08,108400
-3482d0c,108403
-3482d10,3e00008
-3482d1c,4f1021
-3482d20,3c098040
-3482d24,81292d18
-3482d28,11200008
-3482d2c,8042a65c
-3482d30,3c0a801d
-3482d34,254a84a0
-3482d38,8d491d44
-3482d3c,31210002
-3482d40,14200002
-3482d44,3402000a
-3482d48,34020000
-3482d4c,3e00008
-3482d54,594021
-3482d58,3c0a8040
-3482d5c,814a2d18
-3482d60,11400002
-3482d64,8109008c
-3482d68,34090000
-3482d6c,3e00008
-3482d74,1ee7821
-3482d78,3c0a8040
-3482d7c,814a2d18
-3482d80,11400002
-3482d84,81efa65c
-3482d88,340f0000
-3482d8c,3e00008
-3482d94,3c098040
-3482d98,81292d18
-3482d9c,11200005
-3482da0,3c0a801d
-3482da4,254a84a0
-3482da8,8d491d44
-3482dac,35290002
-3482db0,ad491d44
-3482db4,3e00008
-3482db8,afa50024
-3482e80,ff00
-3482e84,3c0a8040
-3482e88,254a2e82
-3482e8c,914b0000
-3482e90,340c00ff
-3482e94,a14c0000
-3482e98,34087fff
-3482e9c,15c80006
-3482ea0,3c098040
-3482ea4,25292e40
-3482ea8,116c000c
-3482eac,b5840
-3482eb0,12b4821
-3482eb4,952e0000
-3482eb8,27bdfff0
-3482ebc,afbf0004
-3482ec0,afa40008
-3482ec4,c100bcb
-3482ec8,1c02021
-3482ecc,407021
-3482ed0,8fbf0004
-3482ed4,8fa40008
-3482ed8,27bd0010
-3482edc,3e00008
-3482ee0,a42e1e1a
-3482ee4,9608001c
-3482ee8,84303
-3482eec,3108000f
-3482ef0,29090002
-3482ef4,1520000b
-3482efc,960d0018
-3482f00,27bdfff0
-3482f04,afbf0004
-3482f08,afa40008
-3482f0c,c100bcb
-3482f10,1a02021
-3482f14,406821
-3482f18,8fbf0004
-3482f1c,8fa40008
-3482f20,27bd0010
-3482f24,3e00008
-3482f28,270821
-3482f2c,34087ff9
-3482f30,884022
-3482f34,501000f
-3482f38,34081000
-3482f3c,884022
-3482f40,500000c
-3482f44,3c098012
-3482f48,2529a5d0
-3482f4c,3c0a8040
-3482f50,254a2dbc
-3482f54,3c0b8040
-3482f58,256b2e82
-3482f5c,a1680000
-3482f60,84080
-3482f64,1485021
-3482f68,95440000
-3482f6c,91480002
-3482f70,a1281397
-3482f74,3e00008
-3482f78,801021
-3482f7c,8c6d0004
-3482f80,3c0e8040
-3482f84,81ce0cde
-3482f88,1ae7825
-3482f8c,11e0000a
-3482f94,11c00006
-3482f9c,946e0ed4
-3482fa0,31ce0010
-3482fa4,1cd7025
-3482fa8,11c00003
-3482fb0,3e00008
-3482fb4,340f0001
-3482fb8,3e00008
-3482fbc,340f0000
-3482fc0,1000
-3482fc4,4800
-3482fcc,7000
-3482fd0,4800
-3482fd8,8040ef80
-3482fdc,42890
-3482fe0,34191000
-3482fe4,340a4800
-3482fe8,340d0000
-3482fec,340c7000
-3482ff0,340e4800
-3482ff4,3e00008
-3482ff8,34180000
-3483000,3c088012
-3483004,2508a5d0
-3483008,95090eda
-348300c,31290008
-3483010,15200008
-3483014,8d090004
-3483018,15200004
-348301c,3c098040
-3483020,81292ffc
-3483024,15200003
-348302c,3e00008
-3483030,34090000
-3483034,3e00008
-3483038,34090001
-348303c,3c08801d
-3483040,25082578
-3483044,3409006c
-3483048,8d0a6300
-348304c,112a0009
-3483050,340a0001
-3483054,340b0036
-3483058,ad0a6300
-348305c,a10b6304
-3483060,240cffff
-3483064,810e63e7
-3483068,15cc0002
-348306c,340d0002
-3483070,a10d63e7
-3483074,3e00008
-3483078,24060022
-3483084,afb0003c
-3483088,27bdffe0
-348308c,afbf0014
-3483090,3c098040
-3483094,2529307c
-3483098,812a0000
-348309c,1540000a
-34830a4,8e4b0028
-34830a8,3c0c4370
-34830ac,16c082a
-34830b0,14200005
-34830b4,340d0001
-34830b8,a12d0000
-34830bc,3404001b
-34830c0,c032a9c
-34830c8,8fbf0014
-34830cc,3e00008
-34830d0,27bd0020
-34830d4,8e721c44
-34830d8,240e0003
-34830dc,a22e05b0
-34830e0,926f07af
-34830e4,4406b000
-34830e8,4407a000
-34830ec,3e00008
-34830f4,90580000
-34830f8,27bdffd0
-34830fc,afbf0014
-3483100,afa40018
-3483104,afa5001c
-3483108,afa60020
-348310c,afa70024
+348298c,1064025
+3482990,a0a81d44
+3482994,24c60014
+3482998,3e00008
+34829a0,27bdfff0
+34829a4,afbf0004
+34829a8,afa80008
+34829ac,afa9000c
+34829b0,3c088040
+34829b4,81080cd7
+34829b8,11000009
+34829c0,86080014
+34829c4,11000006
+34829cc,82291d44
+34829d0,1094024
+34829d4,24020001
+34829d8,11000003
+34829e0,c01c6a5
+34829e8,8fbf0004
+34829ec,8fa80008
+34829f0,8fa9000c
+34829f4,27bd0010
+34829f8,3e00008
+3482a00,8fb00034
+3482a04,848800b4
+3482a08,11000002
+3482a10,a48000b0
+3482a14,3e00008
+3482a1c,1b9fcd5
+3482a20,fb251ad2
+3482a24,f2dc
+3482a28,8022
+3482a2c,23bdffec
+3482a30,afbf0010
+3482a34,9608001c
+3482a38,31088000
+3482a3c,1100000f
+3482a44,3c038012
+3482a48,2463a5d0
+3482a4c,946d0edc
+3482a50,31ad0400
+3482a54,11a0000b
+3482a5c,8c6e0004
+3482a60,15c00008
+3482a68,948d1d2a
+3482a6c,35ae0001
+3482a70,a48e1d2a
+3482a74,10000003
+3482a7c,c037385
+3482a84,8fbf0010
+3482a88,23bd0014
+3482a8c,3e00008
+3482a94,8c6e0004
+3482a98,3e00008
+3482aa0,8488001c
+3482aa4,34010002
+3482aa8,15010015
+3482ab0,3c028012
+3482ab4,2442a5d0
+3482ab8,8c4b0004
+3482abc,15600012
+3482ac4,3c098040
+3482ac8,25292b10
+3482acc,ac890154
+3482ad0,27bdffe0
+3482ad4,afbf0010
+3482ad8,afa50014
+3482adc,8fa60014
+3482ae0,3c058040
+3482ae4,24a52a1c
+3482ae8,c009571
+3482aec,24c41c24
+3482af0,8fbf0010
+3482af4,27bd0020
+3482af8,10000003
+3482b00,afa40000
+3482b04,afa50004
+3482b08,3e00008
+3482b10,27bdffd8
+3482b14,afb00020
+3482b18,afbf0024
+3482b1c,afa5002c
+3482b20,808025
+3482b24,c600015c
+3482b28,3c01c4a4
+3482b2c,24212000
+3482b30,44811000
+3482b34,3c028012
+3482b38,2442a5d0
+3482b3c,944b0edc
+3482b40,316c0400
+3482b44,944b0ee0
+3482b48,11800031
+3482b50,94ad1d2a
+3482b54,31ae0001
+3482b58,11c00006
+3482b60,31adfffe
+3482b64,a4ad1d2a
+3482b68,34010200
+3482b6c,1615826
+3482b70,a44b0ee0
+3482b74,316c0200
+3482b78,1180000b
+3482b80,34010000
+3482b84,44812000
+3482b88,3c064080
+3482b8c,44863000
+3482b94,46060200
+3482b98,4604403c
+3482ba0,10000009
+3482ba8,3c01c42a
+3482bac,44812000
+3482bb0,3c06c080
+3482bb4,44863000
+3482bbc,46060200
+3482bc0,4608203c
+3482bc8,45000005
+3482bd0,46004106
+3482bd4,c008c42
+3482bd8,3405205e
+3482bdc,2002025
+3482be0,e604015c
+3482be4,46022100
+3482be8,e6040028
+3482bec,4600240d
+3482bf0,44098000
+3482bf4,8fa2002c
+3482bf8,8c5807c0
+3482bfc,8f190028
+3482c00,240ffb57
+3482c04,a72f0012
+3482c08,a7290022
+3482c0c,a7290032
+3482c10,8fbf0024
+3482c14,8fb00020
+3482c18,27bd0028
+3482c1c,3e00008
+3482c24,ac20753c
+3482c28,3c018040
+3482c2c,90210cdc
+3482c30,10200008
+3482c34,3c01801d
+3482c38,242184a0
+3482c3c,94211d2c
+3482c40,302100c0
+3482c44,14200003
+3482c4c,801ce4c
+3482c54,801ce45
+3482c5c,3c088012
+3482c60,2508a5d0
+3482c64,8d0a0004
+3482c68,11400006
+3482c6c,8d090000
+3482c70,3401003b
+3482c74,15210008
+3482c7c,3c0bc47a
+3482c80,ac8b0028
+3482c84,3401016d
+3482c88,15210003
+3482c90,3c0bc47a
+3482c94,ac8b0028
+3482c98,3e00008
+3482c9c,340e0001
+3482ca4,3c0f8040
+3482ca8,25ef2ca0
+3482cac,81ef0000
+3482cb0,3c188040
+3482cb4,27182ca1
+3482cb8,83180000
+3482cbc,1f87820
+3482cc0,5e00007
+3482cc4,34010003
+3482cc8,1e1082a
+3482ccc,14200002
+3482cd4,340f0008
+3482cd8,10000003
+3482cdc,1f08004
+3482ce0,f7822
+3482ce4,1f08007
+3482ce8,90af003d
+3482cec,11e00004
+3482cf4,108043
+3482cf8,108400
+3482cfc,108403
+3482d00,3e00008
+3482d0c,4f1021
+3482d10,3c098040
+3482d14,81292d08
+3482d18,11200008
+3482d1c,8042a65c
+3482d20,3c0a801d
+3482d24,254a84a0
+3482d28,8d491d44
+3482d2c,31210002
+3482d30,14200002
+3482d34,3402000a
+3482d38,34020000
+3482d3c,3e00008
+3482d44,594021
+3482d48,3c0a8040
+3482d4c,814a2d08
+3482d50,11400002
+3482d54,8109008c
+3482d58,34090000
+3482d5c,3e00008
+3482d64,1ee7821
+3482d68,3c0a8040
+3482d6c,814a2d08
+3482d70,11400002
+3482d74,81efa65c
+3482d78,340f0000
+3482d7c,3e00008
+3482d84,3c098040
+3482d88,81292d08
+3482d8c,11200005
+3482d90,3c0a801d
+3482d94,254a84a0
+3482d98,8d491d44
+3482d9c,35290002
+3482da0,ad491d44
+3482da4,3e00008
+3482da8,afa50024
+3482e70,ff00
+3482e74,3c0a8040
+3482e78,254a2e72
+3482e7c,914b0000
+3482e80,340c00ff
+3482e84,a14c0000
+3482e88,34087fff
+3482e8c,15c80006
+3482e90,3c098040
+3482e94,25292e30
+3482e98,116c000c
+3482e9c,b5840
+3482ea0,12b4821
+3482ea4,952e0000
+3482ea8,27bdfff0
+3482eac,afbf0004
+3482eb0,afa40008
+3482eb4,c100bc7
+3482eb8,1c02021
+3482ebc,407021
+3482ec0,8fbf0004
+3482ec4,8fa40008
+3482ec8,27bd0010
+3482ecc,3e00008
+3482ed0,a42e1e1a
+3482ed4,9608001c
+3482ed8,84303
+3482edc,3108000f
+3482ee0,29090002
+3482ee4,1520000b
+3482eec,960d0018
+3482ef0,27bdfff0
+3482ef4,afbf0004
+3482ef8,afa40008
+3482efc,c100bc7
+3482f00,1a02021
+3482f04,406821
+3482f08,8fbf0004
+3482f0c,8fa40008
+3482f10,27bd0010
+3482f14,3e00008
+3482f18,270821
+3482f1c,34087ff9
+3482f20,884022
+3482f24,501000f
+3482f28,34081000
+3482f2c,884022
+3482f30,500000c
+3482f34,3c098012
+3482f38,2529a5d0
+3482f3c,3c0a8040
+3482f40,254a2dac
+3482f44,3c0b8040
+3482f48,256b2e72
+3482f4c,a1680000
+3482f50,84080
+3482f54,1485021
+3482f58,95440000
+3482f5c,91480002
+3482f60,a1281397
+3482f64,3e00008
+3482f68,801021
+3482f6c,8c6d0004
+3482f70,3c0e8040
+3482f74,81ce0cdd
+3482f78,1ae7825
+3482f7c,11e0000a
+3482f84,11c00006
+3482f8c,946e0ed4
+3482f90,31ce0010
+3482f94,1cd7025
+3482f98,11c00003
+3482fa0,3e00008
+3482fa4,340f0001
+3482fa8,3e00008
+3482fac,340f0000
+3482fb0,1000
+3482fb4,4800
+3482fbc,7000
+3482fc0,4800
+3482fc8,8040f330
+3482fcc,42890
+3482fd0,34191000
+3482fd4,340a4800
+3482fd8,340d0000
+3482fdc,340c7000
+3482fe0,340e4800
+3482fe4,3e00008
+3482fe8,34180000
+3482ff0,3c088012
+3482ff4,2508a5d0
+3482ff8,95090eda
+3482ffc,31290008
+3483000,15200008
+3483004,8d090004
+3483008,15200004
+348300c,3c098040
+3483010,81292fec
+3483014,15200003
+348301c,3e00008
+3483020,34090000
+3483024,3e00008
+3483028,34090001
+348302c,3c08801d
+3483030,25082578
+3483034,3409006c
+3483038,8d0a6300
+348303c,112a0009
+3483040,340a0001
+3483044,340b0036
+3483048,ad0a6300
+348304c,a10b6304
+3483050,240cffff
+3483054,810e63e7
+3483058,15cc0002
+348305c,340d0002
+3483060,a10d63e7
+3483064,3e00008
+3483068,24060022
+3483074,afb0003c
+3483078,27bdffe0
+348307c,afbf0014
+3483080,3c098040
+3483084,2529306c
+3483088,812a0000
+348308c,1540000a
+3483094,8e4b0028
+3483098,3c0c4370
+348309c,16c082a
+34830a0,14200005
+34830a4,340d0001
+34830a8,a12d0000
+34830ac,3404001b
+34830b0,c032a9c
+34830b8,8fbf0014
+34830bc,3e00008
+34830c0,27bd0020
+34830c4,8e721c44
+34830c8,240e0003
+34830cc,a22e05b0
+34830d0,926f07af
+34830d4,4406b000
+34830d8,4407a000
+34830dc,3e00008
+34830e4,90580000
+34830e8,27bdffd0
+34830ec,afbf0014
+34830f0,afa40018
+34830f4,afa5001c
+34830f8,afa60020
+34830fc,afa70024
+3483100,3c048040
+3483104,8084306c
+3483108,1080001b
3483110,3c048040
-3483114,8084307c
-3483118,1080001b
-3483120,3c048040
-3483124,8c843080
-3483128,2885001e
-348312c,14a00016
-3483134,28850050
-3483138,10a0000c
-3483140,3c043d4d
-3483144,2484cccd
-3483148,ae4404d0
-348314c,2402025
-3483150,248404c8
-3483154,3c05437f
-3483158,3c063f80
-348315c,3c074120
-3483160,c0190a0
-3483168,10000007
-348316c,2402025
-3483170,248404c8
-3483174,34050000
-3483178,3c063f80
-348317c,3c074120
-3483180,c0190a0
-3483188,8fbf0014
-348318c,8fa40018
-3483190,8fa5001c
-3483194,8fa60020
-3483198,8fa70024
-348319c,3e00008
-34831a0,27bd0030
-34831a4,860800b6
-34831a8,25084000
-34831ac,a60800b6
-34831b0,34080001
-34831b4,a20805e8
-34831b8,a2000554
-34831bc,8e090004
-34831c0,240afffe
-34831c4,1495824
-34831c8,ae0b0004
-34831cc,3c088040
-34831d0,25083214
-34831d4,3e00008
-34831d8,ae08013c
-34831dc,860800b6
-34831e0,2508c000
-34831e4,a60800b6
-34831e8,34080001
-34831ec,a20805e8
-34831f0,a2000554
-34831f4,8e090004
-34831f8,240afffe
-34831fc,1495824
-3483200,ae0b0004
-3483204,3c088040
-3483208,25083214
-348320c,3e00008
-3483210,ae08013c
-3483214,27bdffd0
-3483218,afbf0014
-348321c,afa40018
-3483220,afa5001c
-3483224,34080001
-3483228,a0880554
-348322c,8488001c
-3483230,11000006
-3483238,3c048040
-348323c,8c843080
-3483240,24850001
-3483244,3c018040
-3483248,ac253080
-348324c,3c048040
-3483250,8c843080
-3483254,34050003
-3483258,14850009
-3483260,8fa40018
-3483264,8488001c
-3483268,34090001
-348326c,11090002
-3483270,240539b0
-3483274,240539b1
-3483278,c008bf4
-3483280,28850028
-3483284,14a0001a
-348328c,8fa40018
-3483290,24840028
-3483294,3c0543c8
-3483298,3c063f80
-348329c,3c0740c0
-34832a0,c0190a0
+3483114,8c843070
+3483118,2885001e
+348311c,14a00016
+3483124,28850050
+3483128,10a0000c
+3483130,3c043d4d
+3483134,2484cccd
+3483138,ae4404d0
+348313c,2402025
+3483140,248404c8
+3483144,3c05437f
+3483148,3c063f80
+348314c,3c074120
+3483150,c0190a0
+3483158,10000007
+348315c,2402025
+3483160,248404c8
+3483164,34050000
+3483168,3c063f80
+348316c,3c074120
+3483170,c0190a0
+3483178,8fbf0014
+348317c,8fa40018
+3483180,8fa5001c
+3483184,8fa60020
+3483188,8fa70024
+348318c,3e00008
+3483190,27bd0030
+3483194,860800b6
+3483198,25084000
+348319c,a60800b6
+34831a0,34080001
+34831a4,a20805e8
+34831a8,a2000554
+34831ac,8e090004
+34831b0,240afffe
+34831b4,1495824
+34831b8,ae0b0004
+34831bc,3c088040
+34831c0,25083204
+34831c4,3e00008
+34831c8,ae08013c
+34831cc,860800b6
+34831d0,2508c000
+34831d4,a60800b6
+34831d8,34080001
+34831dc,a20805e8
+34831e0,a2000554
+34831e4,8e090004
+34831e8,240afffe
+34831ec,1495824
+34831f0,ae0b0004
+34831f4,3c088040
+34831f8,25083204
+34831fc,3e00008
+3483200,ae08013c
+3483204,27bdffd0
+3483208,afbf0014
+348320c,afa40018
+3483210,afa5001c
+3483214,34080001
+3483218,a0880554
+348321c,8488001c
+3483220,11000006
+3483228,3c048040
+348322c,8c843070
+3483230,24850001
+3483234,3c018040
+3483238,ac253070
+348323c,3c048040
+3483240,8c843070
+3483244,34050003
+3483248,14850009
+3483250,8fa40018
+3483254,8488001c
+3483258,34090001
+348325c,11090002
+3483260,240539b0
+3483264,240539b1
+3483268,c008bf4
+3483270,28850028
+3483274,14a0001a
+348327c,8fa40018
+3483280,24840028
+3483284,3c0543c8
+3483288,3c063f80
+348328c,3c0740c0
+3483290,c0190a0
+3483298,8fa40018
+348329c,24840558
+34832a0,c023270
34832a8,8fa40018
-34832ac,24840558
-34832b0,c023270
-34832b8,8fa40018
-34832bc,c008bf4
-34832c0,2405311f
-34832c4,3c048040
-34832c8,8c843080
-34832cc,34080061
-34832d0,14880007
-34832d8,8fa40018
-34832dc,8fa5001c
-34832e0,8c8b0138
-34832e4,8d6b0010
-34832e8,256913ec
-34832ec,ac89013c
-34832f0,8fbf0014
+34832ac,c008bf4
+34832b0,2405311f
+34832b4,3c048040
+34832b8,8c843070
+34832bc,34080061
+34832c0,14880007
+34832c8,8fa40018
+34832cc,8fa5001c
+34832d0,8c8b0138
+34832d4,8d6b0010
+34832d8,256913ec
+34832dc,ac89013c
+34832e0,8fbf0014
+34832e4,3e00008
+34832e8,27bd0030
+34832ec,3c01c416
+34832f0,44816000
34832f4,3e00008
-34832f8,27bd0030
-34832fc,3c01c416
+34832f8,3025
+34832fc,3c014416
3483300,44816000
3483304,3e00008
3483308,3025
-348330c,3c014416
-3483310,44816000
-3483314,3e00008
-3483318,3025
-348331c,afa40018
-3483320,3c08801e
-3483324,2508aa30
-3483328,3e00008
-348332c,ad000678
-3483330,27bdffe8
-3483334,afaa0004
-3483338,846f4a2a
-348333c,340a0002
-3483340,15ea0002
-3483344,340a0001
-3483348,a46a4a2a
-348334c,846f4a2a
-3483350,8faa0004
-3483354,3e00008
-3483358,27bd0018
-348335c,27bdffe8
-3483360,afaa0004
-3483364,846e4a2a
-3483368,340a0002
-348336c,15ca0002
-3483370,340a0003
-3483374,a46a4a2a
-3483378,846e4a2a
-348337c,8faa0004
-3483380,3e00008
-3483384,27bd0018
-3483388,27bdffe8
-348338c,afaa0004
-3483390,85034a2a
-3483394,340a0002
-3483398,146a0002
-348339c,340a0001
-34833a0,a50a4a2a
-34833a4,85034a2a
-34833a8,8faa0004
-34833ac,3e00008
-34833b0,27bd0018
-34833b4,27bdffe8
-34833b8,afaa0004
-34833bc,85034a2a
-34833c0,340a0002
-34833c4,146a0002
-34833c8,340a0003
-34833cc,a50a4a2a
-34833d0,85034a2a
-34833d4,8faa0004
-34833d8,3e00008
-34833dc,27bd0018
-34833e0,27bdffe8
-34833e4,afaa0004
-34833e8,85034a2a
-34833ec,340a0002
-34833f0,146a0002
-34833f4,340a0001
-34833f8,a50a4a2a
-34833fc,85034a2a
-3483400,8faa0004
-3483404,3e00008
-3483408,27bd0018
-348340c,27bdffe8
-3483410,afaa0004
-3483414,85034a2a
-3483418,340a0002
-348341c,146a0002
-3483420,340a0003
-3483424,a50a4a2a
-3483428,85034a2a
-348342c,8faa0004
-3483430,3e00008
-3483434,27bd0018
-3483438,27bdffe8
-348343c,afaa0004
-3483440,a42bca2a
-3483444,340a0002
-3483448,156a0002
-348344c,340a0003
-3483450,a50a4a2a
-3483454,85034a2a
-3483458,8faa0004
-348345c,3e00008
-3483460,27bd0018
-3483464,27bdffe8
-3483468,afaa0004
-348346c,85034a2a
-3483470,340a0002
-3483474,146a0002
-3483478,340a0001
-348347c,a50a4a2a
-3483480,85034a2a
-3483484,8faa0004
-3483488,3e00008
-348348c,27bd0018
-3483490,27bdffe8
-3483494,afaa0004
-3483498,85034a2a
-348349c,340a0002
-34834a0,146a0002
-34834a4,340a0003
-34834a8,a50a4a2a
-34834ac,85034a2a
-34834b0,8faa0004
-34834b4,3e00008
-34834b8,27bd0018
-34834bc,3c08801e
-34834c0,25084ee8
-34834c4,3409f000
-34834c8,a5090000
-34834cc,3e00008
-34834d0,84cb4a2e
-34834d4,24a56f04
-34834d8,8c880144
-34834dc,11050007
-34834e0,3c09801e
-34834e4,2529aa30
-34834e8,3c0a446a
-34834ec,254ac000
-34834f0,3c0bc324
-34834f4,ad2a0024
-34834f8,ad2b002c
-34834fc,3e00008
-3483504,27bdffd8
-3483508,afbf0024
-348350c,afa40028
-3483510,afa5002c
-3483514,afa60030
-3483518,c022865
-348351c,8fa40030
-3483520,44822000
-3483524,44800000
-3483528,240e0002
-348352c,468021a0
-3483530,afae0018
-3483534,8fa40028
-3483538,8fa5002c
-348353c,8fa60030
-3483540,3c073f80
-3483544,3c080400
-3483548,250832b0
-348354c,14c80002
-3483554,3c074040
-3483558,e7a60014
-348355c,e7a00010
-3483560,c023000
-3483564,e7a0001c
-3483568,8fbf0024
-348356c,8fbf0024
-3483570,3e00008
-3483574,27bd0028
-3483578,3c0a8040
-348357c,814a0cd8
-3483580,11400003
-3483584,8ccb0138
-3483588,8d6b0010
-348358c,25690adc
-3483590,3e00008
-3483594,acc90180
-3483598,27bdffe8
-348359c,afbf0014
-34835a0,3c0a8040
-34835a4,814a0cd8
-34835a8,15400003
-34835b0,c037500
-34835b8,8fbf0014
+348330c,afa40018
+3483310,3c08801e
+3483314,2508aa30
+3483318,3e00008
+348331c,ad000678
+3483320,27bdffe8
+3483324,afaa0004
+3483328,846f4a2a
+348332c,340a0002
+3483330,15ea0002
+3483334,340a0001
+3483338,a46a4a2a
+348333c,846f4a2a
+3483340,8faa0004
+3483344,3e00008
+3483348,27bd0018
+348334c,27bdffe8
+3483350,afaa0004
+3483354,846e4a2a
+3483358,340a0002
+348335c,15ca0002
+3483360,340a0003
+3483364,a46a4a2a
+3483368,846e4a2a
+348336c,8faa0004
+3483370,3e00008
+3483374,27bd0018
+3483378,27bdffe8
+348337c,afaa0004
+3483380,85034a2a
+3483384,340a0002
+3483388,146a0002
+348338c,340a0001
+3483390,a50a4a2a
+3483394,85034a2a
+3483398,8faa0004
+348339c,3e00008
+34833a0,27bd0018
+34833a4,27bdffe8
+34833a8,afaa0004
+34833ac,85034a2a
+34833b0,340a0002
+34833b4,146a0002
+34833b8,340a0003
+34833bc,a50a4a2a
+34833c0,85034a2a
+34833c4,8faa0004
+34833c8,3e00008
+34833cc,27bd0018
+34833d0,27bdffe8
+34833d4,afaa0004
+34833d8,85034a2a
+34833dc,340a0002
+34833e0,146a0002
+34833e4,340a0001
+34833e8,a50a4a2a
+34833ec,85034a2a
+34833f0,8faa0004
+34833f4,3e00008
+34833f8,27bd0018
+34833fc,27bdffe8
+3483400,afaa0004
+3483404,85034a2a
+3483408,340a0002
+348340c,146a0002
+3483410,340a0003
+3483414,a50a4a2a
+3483418,85034a2a
+348341c,8faa0004
+3483420,3e00008
+3483424,27bd0018
+3483428,27bdffe8
+348342c,afaa0004
+3483430,a42bca2a
+3483434,340a0002
+3483438,156a0002
+348343c,340a0003
+3483440,a50a4a2a
+3483444,85034a2a
+3483448,8faa0004
+348344c,3e00008
+3483450,27bd0018
+3483454,27bdffe8
+3483458,afaa0004
+348345c,85034a2a
+3483460,340a0002
+3483464,146a0002
+3483468,340a0001
+348346c,a50a4a2a
+3483470,85034a2a
+3483474,8faa0004
+3483478,3e00008
+348347c,27bd0018
+3483480,27bdffe8
+3483484,afaa0004
+3483488,85034a2a
+348348c,340a0002
+3483490,146a0002
+3483494,340a0003
+3483498,a50a4a2a
+348349c,85034a2a
+34834a0,8faa0004
+34834a4,3e00008
+34834a8,27bd0018
+34834ac,3c08801e
+34834b0,25084ee8
+34834b4,3409f000
+34834b8,a5090000
+34834bc,3e00008
+34834c0,84cb4a2e
+34834c4,24a56f04
+34834c8,8c880144
+34834cc,11050007
+34834d0,3c09801e
+34834d4,2529aa30
+34834d8,3c0a446a
+34834dc,254ac000
+34834e0,3c0bc324
+34834e4,ad2a0024
+34834e8,ad2b002c
+34834ec,3e00008
+34834f4,27bdffd8
+34834f8,afbf0024
+34834fc,afa40028
+3483500,afa5002c
+3483504,afa60030
+3483508,c022865
+348350c,8fa40030
+3483510,44822000
+3483514,44800000
+3483518,240e0002
+348351c,468021a0
+3483520,afae0018
+3483524,8fa40028
+3483528,8fa5002c
+348352c,8fa60030
+3483530,3c073f80
+3483534,3c080400
+3483538,250832b0
+348353c,14c80002
+3483544,3c074040
+3483548,e7a60014
+348354c,e7a00010
+3483550,c023000
+3483554,e7a0001c
+3483558,8fbf0024
+348355c,8fbf0024
+3483560,3e00008
+3483564,27bd0028
+3483568,3c0a8040
+348356c,814a0cd8
+3483570,11400003
+3483574,8ccb0138
+3483578,8d6b0010
+348357c,25690adc
+3483580,3e00008
+3483584,acc90180
+3483588,27bdffe8
+348358c,afbf0014
+3483590,3c0a8040
+3483594,814a0cd8
+3483598,15400003
+34835a0,c037500
+34835a8,8fbf0014
+34835ac,3e00008
+34835b0,27bd0018
+34835b4,3c010080
+34835b8,3c180001
34835bc,3e00008
-34835c0,27bd0018
-34835c4,3c010080
-34835c8,3c180001
-34835cc,3e00008
-34835d0,8c4e0670
-34835d4,3c0a8040
-34835d8,814a0cd8
-34835dc,11400002
-34835e4,34180003
-34835e8,3c078012
-34835ec,24e7a5d0
-34835f0,3e00008
-34835f4,24010003
-34835f8,3c0a8040
-34835fc,814a0cd8
-3483600,11400008
-3483608,c100412
-3483610,3c08801e
-3483614,25088966
-3483618,34090004
-348361c,a5090000
-3483624,8fbf0014
-3483628,3e00008
-348362c,27bd0018
-3483630,27bdffe0
-3483634,afbf0014
-3483638,afa10018
-348363c,afa4001c
-3483640,3c0a8040
-3483644,814a0cd8
-3483648,1540000b
-3483650,3c04801d
-3483654,248484a0
-3483658,3c058040
-348365c,90a50cdb
-3483660,34060000
-3483664,c037385
-348366c,34044802
-3483670,c0191bc
-3483678,8fa4001c
-348367c,8fa10018
-3483680,8fbf0014
-3483684,3e00008
-3483688,27bd0020
-3483690,27bdffe0
-3483694,afbf0014
-3483698,afa40018
-348369c,3c0d8040
-34836a0,81ad368c
-34836a4,15a0000c
-34836ac,3c08801e
-34836b0,2508aa30
-34836b4,8d090670
-34836b8,340a4000
-34836bc,12a5824
-34836c0,1160000d
-34836c8,34080001
-34836cc,3c018040
-34836d0,a028368c
-34836d4,10000023
-34836d8,3c08801e
-34836dc,2508aa30
-34836e0,8d090670
-34836e4,340a4000
-34836e8,12a5824
-34836ec,1160000c
-34836f4,1000001b
-34836f8,24a420d8
-34836fc,c037519
-3483704,24010002
-3483708,14410016
-3483710,3c08801e
-3483714,25088966
-3483718,34090004
-348371c,a5090000
-3483720,3c0b8012
-3483724,256ba5d0
-3483728,816c0ede
-348372c,358c0001
-3483730,a16c0ede
-3483734,3c09801e
-3483738,2529a2ba
-348373c,340802ae
-3483740,a5280000
-3483744,3408002a
+34835c0,8c4e0670
+34835c4,3c0a8040
+34835c8,814a0cd8
+34835cc,11400002
+34835d4,34180003
+34835d8,3c078012
+34835dc,24e7a5d0
+34835e0,3e00008
+34835e4,24010003
+34835e8,3c0a8040
+34835ec,814a0cd8
+34835f0,11400008
+34835f8,c100417
+3483600,3c08801e
+3483604,25088966
+3483608,34090004
+348360c,a5090000
+3483614,8fbf0014
+3483618,3e00008
+348361c,27bd0018
+3483620,27bdffe0
+3483624,afbf0014
+3483628,afa10018
+348362c,afa4001c
+3483630,3c0a8040
+3483634,814a0cd8
+3483638,1540000b
+3483640,3c04801d
+3483644,248484a0
+3483648,3c058040
+348364c,90a50cdb
+3483650,34060000
+3483654,c037385
+348365c,34044802
+3483660,c0191bc
+3483668,8fa4001c
+348366c,8fa10018
+3483670,8fbf0014
+3483674,3e00008
+3483678,27bd0020
+3483680,27bdffe0
+3483684,afbf0014
+3483688,afa40018
+348368c,3c0d8040
+3483690,81ad367c
+3483694,15a0000c
+348369c,3c08801e
+34836a0,2508aa30
+34836a4,8d090670
+34836a8,340a4000
+34836ac,12a5824
+34836b0,1160000d
+34836b8,34080001
+34836bc,3c018040
+34836c0,a028367c
+34836c4,10000023
+34836c8,3c08801e
+34836cc,2508aa30
+34836d0,8d090670
+34836d4,340a4000
+34836d8,12a5824
+34836dc,1160000c
+34836e4,1000001b
+34836e8,24a420d8
+34836ec,c037519
+34836f4,24010002
+34836f8,14410016
+3483700,3c08801e
+3483704,25088966
+3483708,34090004
+348370c,a5090000
+3483710,3c0b8012
+3483714,256ba5d0
+3483718,816c0ede
+348371c,358c0001
+3483720,a16c0ede
+3483724,3c09801e
+3483728,2529a2ba
+348372c,340802ae
+3483730,a5280000
+3483734,3408002a
+3483738,3c09801e
+348373c,2529a2fe
+3483740,a1280000
+3483744,34080014
3483748,3c09801e
-348374c,2529a2fe
+348374c,2529a2b5
3483750,a1280000
-3483754,34080014
-3483758,3c09801e
-348375c,2529a2b5
-3483760,a1280000
-3483764,8fbf0014
-3483768,3e00008
-348376c,27bd0020
-3483770,27bdffd0
-3483774,afbf0014
-3483778,afa80018
-348377c,afa9001c
-3483780,afaa0020
-3483784,afab0024
-3483788,afac0028
-348378c,afad002c
-3483790,3c088012
-3483794,2508a5d0
-3483798,85090f20
-348379c,31290040
-34837a0,1120000e
-34837a4,3c08801e
-34837a8,2508aa30
-34837ac,8d09039c
-34837b0,1120000a
-34837b4,340a00a1
-34837b8,852b0000
-34837bc,154b0007
-34837c0,240cf7ff
-34837c4,8d0d066c
-34837c8,18d6824
-34837cc,ad0d066c
-34837d0,ad00039c
-34837d4,ad00011c
-34837d8,ad200118
-34837dc,afad002c
-34837e0,afac0028
-34837e4,afab0024
-34837e8,afaa0020
-34837ec,afa9001c
-34837f0,afa80018
-34837f4,afbf0014
-34837f8,860e001c
-34837fc,3e00008
-3483800,27bd0030
-3483804,27bdffd0
-3483808,afbf0014
-348380c,afa80018
-3483810,afa9001c
-3483814,afaa0020
-3483818,84a800a4
-348381c,34090002
-3483820,1509000c
-3483824,340a0006
-3483828,80880003
-348382c,150a0009
-3483834,3c088012
-3483838,2508a5d0
-348383c,85090f20
-3483840,31290040
-3483844,11200003
-348384c,c0083ad
-3483854,8faa0020
-3483858,8fa9001c
-348385c,8fa80018
-3483860,8fbf0014
-3483864,8602001c
-3483868,3e00008
-348386c,27bd0030
-3483870,27bdffd0
-3483874,afbf001c
-3483878,afa40020
-348387c,afa50024
-3483880,e7a00028
-3483884,4602003c
-348388c,45010005
-3483894,c100ecc
-348389c,10000003
-34838a4,c100ece
-34838ac,34060014
-34838b0,3407000a
-34838b4,44801000
-34838b8,c7a00028
-34838bc,8fa50024
-34838c0,8fa40020
-34838c4,8fbf001c
-34838c8,4602003c
-34838cc,27bd0030
-34838d0,3e00008
-34838d8,27bdffd0
-34838dc,afbf001c
-34838e0,afa40020
-34838e4,afa50024
-34838e8,e7a40028
-34838ec,e7a6002c
-34838f0,4606203c
-34838f8,45000003
-3483900,c100ed9
-3483908,34060014
-348390c,3407000a
-3483910,44801000
-3483914,c7a6002c
-3483918,c7a40028
-348391c,8fa50024
-3483920,8fa40020
-3483924,8fbf001c
-3483928,4606203c
-348392c,27bd0030
-3483930,3e00008
-3483938,c100f3c
-3483940,8fbf001c
-3483944,27bd0020
-3483948,3e00008
-3483954,27bdffe8
-3483958,afbf0014
-348395c,c008ab4
-3483964,8fbf0014
-3483968,27bd0018
-348396c,8fa40018
-3483970,8c8a0138
-3483974,8d4a0010
-3483978,25431618
-348397c,3c088040
-3483980,81083950
-3483984,1100000a
-3483988,3c098012
-348398c,2529a5d0
-3483990,95281406
-3483994,290105dc
-3483998,14200005
-348399c,9488029c
-34839a0,31080002
-34839a4,15000002
-34839ac,254314d0
-34839b0,3e00008
-34839b8,3c188012
-34839bc,2718a5d0
-34839c0,8f180004
-34839c4,17000003
-34839cc,3c0a8041
-34839d0,254ab138
-34839d4,24780008
-34839d8,3e00008
-34839dc,adf802c0
-34839e0,3c0f8012
-34839e4,25efa5d0
-34839e8,8def0004
-34839ec,15e00003
-34839f4,3c0e8041
-34839f8,25ceb138
-34839fc,ac4e0004
-3483a00,3e00008
-3483a04,820f013f
-3483a0c,3c088040
-3483a10,81083a08
-3483a14,11000007
-3483a18,3c09801d
-3483a1c,252984a0
-3483a20,8d281d44
-3483a24,31080002
-3483a28,11000002
-3483a30,34069100
-3483a34,3e00008
-3483a38,afa60020
-3483a3c,3c088040
-3483a40,81083a08
-3483a44,11000005
-3483a48,3c09801d
-3483a4c,252984a0
-3483a50,8d281d44
-3483a54,35080002
-3483a58,ad281d44
-3483a5c,3e00008
-3483a60,34e74000
-3483a68,3c038012
-3483a6c,2463a5d0
-3483a70,8c6e0004
-3483a74,15c0000c
-3483a78,24020005
-3483a7c,24020011
-3483a80,3c088040
-3483a84,81083a64
-3483a88,11000007
-3483a8c,3c09801d
-3483a90,252984a0
-3483a94,8d281d44
-3483a98,31080002
-3483a9c,11000002
-3483aa0,34020001
-3483aa4,34020003
-3483aa8,3e00008
-3483aac,3c048010
-3483ab0,3c088040
-3483ab4,81083a64
-3483ab8,11000005
-3483abc,3c09801d
-3483ac0,252984a0
-3483ac4,8d281d44
-3483ac8,35080002
-3483acc,ad281d44
-3483ad0,3e00008
-3483ad4,34e78000
-3483ad8,27bdffe8
-3483adc,afa20010
-3483ae0,afbf0014
-3483ae4,c10211e
-3483ae8,46000306
-3483aec,406821
-3483af0,8fa20010
-3483af4,8fbf0014
-3483af8,3e00008
-3483afc,27bd0018
-3483b00,ac800130
-3483b04,ac800134
-3483b08,3c018012
-3483b0c,2421a5d0
-3483b10,80280edc
-3483b14,35080008
-3483b18,a0280edc
-3483b1c,3c013f80
+3483754,8fbf0014
+3483758,3e00008
+348375c,27bd0020
+3483760,27bdffd0
+3483764,afbf0014
+3483768,afa80018
+348376c,afa9001c
+3483770,afaa0020
+3483774,afab0024
+3483778,afac0028
+348377c,afad002c
+3483780,3c088012
+3483784,2508a5d0
+3483788,85090f20
+348378c,31290040
+3483790,1120000e
+3483794,3c08801e
+3483798,2508aa30
+348379c,8d09039c
+34837a0,1120000a
+34837a4,340a00a1
+34837a8,852b0000
+34837ac,154b0007
+34837b0,240cf7ff
+34837b4,8d0d066c
+34837b8,18d6824
+34837bc,ad0d066c
+34837c0,ad00039c
+34837c4,ad00011c
+34837c8,ad200118
+34837cc,afad002c
+34837d0,afac0028
+34837d4,afab0024
+34837d8,afaa0020
+34837dc,afa9001c
+34837e0,afa80018
+34837e4,afbf0014
+34837e8,860e001c
+34837ec,3e00008
+34837f0,27bd0030
+34837f4,27bdffd0
+34837f8,afbf0014
+34837fc,afa80018
+3483800,afa9001c
+3483804,afaa0020
+3483808,84a800a4
+348380c,34090002
+3483810,1509000c
+3483814,340a0006
+3483818,80880003
+348381c,150a0009
+3483824,3c088012
+3483828,2508a5d0
+348382c,85090f20
+3483830,31290040
+3483834,11200003
+348383c,c0083ad
+3483844,8faa0020
+3483848,8fa9001c
+348384c,8fa80018
+3483850,8fbf0014
+3483854,8602001c
+3483858,3e00008
+348385c,27bd0030
+3483860,27bdffd0
+3483864,afbf001c
+3483868,afa40020
+348386c,afa50024
+3483870,e7a00028
+3483874,4602003c
+348387c,45010005
+3483884,c100ec8
+348388c,10000003
+3483894,c100eca
+348389c,34060014
+34838a0,3407000a
+34838a4,44801000
+34838a8,c7a00028
+34838ac,8fa50024
+34838b0,8fa40020
+34838b4,8fbf001c
+34838b8,4602003c
+34838bc,27bd0030
+34838c0,3e00008
+34838c8,27bdffd0
+34838cc,afbf001c
+34838d0,afa40020
+34838d4,afa50024
+34838d8,e7a40028
+34838dc,e7a6002c
+34838e0,4606203c
+34838e8,45000003
+34838f0,c100ed5
+34838f8,34060014
+34838fc,3407000a
+3483900,44801000
+3483904,c7a6002c
+3483908,c7a40028
+348390c,8fa50024
+3483910,8fa40020
+3483914,8fbf001c
+3483918,4606203c
+348391c,27bd0030
+3483920,3e00008
+3483928,c100f38
+3483930,8fbf001c
+3483934,27bd0020
+3483938,3e00008
+3483944,27bdffe8
+3483948,afbf0014
+348394c,c008ab4
+3483954,8fbf0014
+3483958,27bd0018
+348395c,8fa40018
+3483960,8c8a0138
+3483964,8d4a0010
+3483968,25431618
+348396c,3c088040
+3483970,81083940
+3483974,1100000a
+3483978,3c098012
+348397c,2529a5d0
+3483980,95281406
+3483984,290105dc
+3483988,14200005
+348398c,9488029c
+3483990,31080002
+3483994,15000002
+348399c,254314d0
+34839a0,3e00008
+34839a8,3c188012
+34839ac,2718a5d0
+34839b0,8f180004
+34839b4,17000003
+34839bc,3c0a8041
+34839c0,254ab4d8
+34839c4,24780008
+34839c8,3e00008
+34839cc,adf802c0
+34839d0,3c0f8012
+34839d4,25efa5d0
+34839d8,8def0004
+34839dc,15e00003
+34839e4,3c0e8041
+34839e8,25ceb4d8
+34839ec,ac4e0004
+34839f0,3e00008
+34839f4,820f013f
+34839fc,3c088040
+3483a00,810839f8
+3483a04,11000007
+3483a08,3c09801d
+3483a0c,252984a0
+3483a10,8d281d44
+3483a14,31080002
+3483a18,11000002
+3483a20,34069100
+3483a24,3e00008
+3483a28,afa60020
+3483a2c,3c088040
+3483a30,810839f8
+3483a34,11000005
+3483a38,3c09801d
+3483a3c,252984a0
+3483a40,8d281d44
+3483a44,35080002
+3483a48,ad281d44
+3483a4c,3e00008
+3483a50,34e74000
+3483a58,3c038012
+3483a5c,2463a5d0
+3483a60,8c6e0004
+3483a64,15c0000c
+3483a68,24020005
+3483a6c,24020011
+3483a70,3c088040
+3483a74,81083a54
+3483a78,11000007
+3483a7c,3c09801d
+3483a80,252984a0
+3483a84,8d281d44
+3483a88,31080002
+3483a8c,11000002
+3483a90,34020001
+3483a94,34020003
+3483a98,3e00008
+3483a9c,3c048010
+3483aa0,3c088040
+3483aa4,81083a54
+3483aa8,11000005
+3483aac,3c09801d
+3483ab0,252984a0
+3483ab4,8d281d44
+3483ab8,35080002
+3483abc,ad281d44
+3483ac0,3e00008
+3483ac4,34e78000
+3483ac8,27bdffe8
+3483acc,afa20010
+3483ad0,afbf0014
+3483ad4,c102166
+3483ad8,46000306
+3483adc,406821
+3483ae0,8fa20010
+3483ae4,8fbf0014
+3483ae8,3e00008
+3483aec,27bd0018
+3483af0,ac800130
+3483af4,ac800134
+3483af8,3c018012
+3483afc,2421a5d0
+3483b00,80280edc
+3483b04,35080008
+3483b08,a0280edc
+3483b0c,3c013f80
+3483b10,3e00008
+3483b14,44813000
3483b20,3e00008
-3483b24,44813000
-3483b30,3e00008
-3483b38,3c028041
-3483b3c,8c439f10
+3483b28,3c028041
+3483b2c,8c43a270
+3483b30,3c028041
+3483b34,24429fe2
+3483b38,14620004
+3483b3c,3c038041
3483b40,3c028041
-3483b44,24429c82
-3483b48,14620004
-3483b4c,3c038041
-3483b50,3c028041
-3483b54,24429c84
-3483b58,ac629f10
-3483b5c,3e00008
-3483b64,3c028041
-3483b68,8c439f10
-3483b6c,3c028041
-3483b70,24429c68
-3483b74,10620003
-3483b78,3c028041
-3483b7c,10000003
-3483b80,24429c88
-3483b84,3c028041
-3483b88,24429c6a
-3483b8c,3c038041
-3483b90,3e00008
-3483b94,ac629f10
-3483b98,27bdffc8
-3483b9c,afbf0034
-3483ba0,afb40030
-3483ba4,afb3002c
-3483ba8,afb20028
-3483bac,afb10024
-3483bb0,afb00020
-3483bb4,809025
-3483bb8,3c02801c
-3483bbc,344284a0
-3483bc0,3c030001
-3483bc4,431021
-3483bc8,90420745
-3483bcc,240300aa
-3483bd0,14430002
-3483bd4,a08825
-3483bd8,240200ff
-3483bdc,3c03801c
-3483be0,346384a0
-3483be4,8c700000
-3483be8,8e0302b0
-3483bec,24640008
-3483bf0,ae0402b0
-3483bf4,3c04de00
-3483bf8,ac640000
-3483bfc,3c048041
-3483c00,2484a0e8
-3483c04,ac640004
-3483c08,8e0302b0
-3483c0c,24640008
-3483c10,ae0402b0
-3483c14,3c04e700
-3483c18,ac640000
-3483c1c,ac600004
-3483c20,8e0302b0
-3483c24,24640008
-3483c28,ae0402b0
-3483c2c,3c04fc11
-3483c30,34849623
-3483c34,ac640000
-3483c38,3c04ff2f
-3483c3c,3484ffff
-3483c40,ac640004
-3483c44,8e0402b0
-3483c48,24830008
-3483c4c,ae0302b0
-3483c50,3c03fa00
-3483c54,ac830000
-3483c58,401825
-3483c5c,c2102b
-3483c60,10400002
-3483c64,261302a8
-3483c68,c01825
-3483c6c,2402ff00
-3483c70,621825
-3483c74,ac830004
-3483c78,24070001
-3483c7c,24060009
-3483c80,3c148041
-3483c84,2685a0a8
-3483c88,c101ba6
-3483c8c,2602025
-3483c90,24020010
-3483c94,afa20018
-3483c98,afa20014
-3483c9c,263100bd
-3483ca0,afb10010
-3483ca4,2647001b
-3483ca8,3025
-3483cac,2685a0a8
-3483cb0,c101c0e
-3483cb4,2602025
-3483cb8,8e0202b0
-3483cbc,24430008
-3483cc0,ae0302b0
-3483cc4,3c03e700
-3483cc8,ac430000
-3483ccc,ac400004
-3483cd0,8fbf0034
-3483cd4,8fb40030
-3483cd8,8fb3002c
-3483cdc,8fb20028
-3483ce0,8fb10024
-3483ce4,8fb00020
-3483ce8,3e00008
-3483cec,27bd0038
-3483cf0,3c028041
-3483cf4,8c439f10
-3483cf8,3c028041
-3483cfc,24429c68
-3483d00,10620021
-3483d08,27bdffe8
-3483d0c,afbf0014
-3483d10,90660000
-3483d14,90620001
-3483d18,22600
-3483d1c,42603
-3483d20,42183
-3483d24,3042003f
-3483d28,21040
-3483d2c,3c038041
-3483d30,24639c68
-3483d34,621021
-3483d38,3c038041
-3483d3c,ac629f10
-3483d40,3c02801c
-3483d44,344284a0
-3483d48,944300a4
-3483d4c,28620011
-3483d50,10400008
-3483d54,2825
-3483d58,3c028011
-3483d5c,3442a5d0
-3483d60,431021
-3483d64,804500bc
-3483d68,52fc3
-3483d6c,30a50011
-3483d70,24a5ffef
-3483d74,c100ee6
-3483d7c,8fbf0014
-3483d80,3e00008
-3483d84,27bd0018
-3483d88,3e00008
-3483d90,27bdffd8
-3483d94,afbf0024
-3483d98,afb10020
-3483d9c,afb0001c
-3483da0,3c028040
-3483da4,8c4226f0
-3483da8,14400003
-3483dac,808025
-3483db0,10000019
-3483db4,908201e9
-3483db8,9487001c
-3483dbc,73943
-3483dc0,30e7007f
-3483dc4,3c02801c
-3483dc8,344284a0
-3483dcc,904600a5
-3483dd0,802825
-3483dd4,c1019a8
-3483dd8,27a40010
-3483ddc,97b10014
-3483de0,16200003
-3483de8,1000000b
-3483dec,920201e9
-3483df0,c101ea3
-3483df4,93a40017
-3483df8,54400004
-3483dfc,90420007
-3483e00,c101ea3
-3483e04,2202025
-3483e08,90420007
-3483e0c,30420001
-3483e10,54400001
-3483e14,24020005
-3483e18,8fbf0024
-3483e1c,8fb10020
-3483e20,8fb0001c
-3483e24,3e00008
-3483e28,27bd0028
-3483e2c,27bdffd8
-3483e30,afbf0024
-3483e34,afb10020
-3483e38,afb0001c
-3483e3c,3c028040
-3483e40,8c4226f0
-3483e44,14400003
-3483e48,808025
-3483e4c,10000017
-3483e50,908201e9
-3483e54,9487001c
-3483e58,73943
-3483e5c,30e7007f
-3483e60,3c02801c
-3483e64,344284a0
-3483e68,904600a5
-3483e6c,802825
-3483e70,c1019a8
-3483e74,27a40010
-3483e78,97b10014
-3483e7c,16200003
-3483e84,10000009
-3483e88,920201e9
-3483e8c,c101ea3
-3483e90,93a40017
-3483e94,54400004
-3483e98,90420007
-3483e9c,c101ea3
-3483ea0,2202025
-3483ea4,90420007
-3483ea8,30420002
-3483eac,8fbf0024
-3483eb0,8fb10020
-3483eb4,8fb0001c
-3483eb8,3e00008
-3483ebc,27bd0028
-3483ec0,27bdffd8
-3483ec4,afbf0024
-3483ec8,afb10020
-3483ecc,afb0001c
-3483ed0,3c02801c
-3483ed4,344284a0
-3483ed8,94500020
-3483edc,3c02801d
-3483ee0,3442aa30
-3483ee4,8c42066c
-3483ee8,3c033000
-3483eec,24630483
-3483ef0,431024
-3483ef4,544000ac
+3483b44,24429fe4
+3483b48,ac62a270
+3483b4c,3e00008
+3483b54,3c028041
+3483b58,8c43a270
+3483b5c,3c028041
+3483b60,24429fc8
+3483b64,10620003
+3483b68,3c028041
+3483b6c,10000003
+3483b70,24429fe8
+3483b74,3c028041
+3483b78,24429fca
+3483b7c,3c038041
+3483b80,3e00008
+3483b84,ac62a270
+3483b88,27bdffc8
+3483b8c,afbf0034
+3483b90,afb40030
+3483b94,afb3002c
+3483b98,afb20028
+3483b9c,afb10024
+3483ba0,afb00020
+3483ba4,809025
+3483ba8,3c02801c
+3483bac,344284a0
+3483bb0,3c030001
+3483bb4,431021
+3483bb8,90420745
+3483bbc,240300aa
+3483bc0,14430002
+3483bc4,a08825
+3483bc8,240200ff
+3483bcc,3c03801c
+3483bd0,346384a0
+3483bd4,8c700000
+3483bd8,8e0302b0
+3483bdc,24640008
+3483be0,ae0402b0
+3483be4,3c04de00
+3483be8,ac640000
+3483bec,3c048041
+3483bf0,2484a488
+3483bf4,ac640004
+3483bf8,8e0302b0
+3483bfc,24640008
+3483c00,ae0402b0
+3483c04,3c04e700
+3483c08,ac640000
+3483c0c,ac600004
+3483c10,8e0302b0
+3483c14,24640008
+3483c18,ae0402b0
+3483c1c,3c04fc11
+3483c20,34849623
+3483c24,ac640000
+3483c28,3c04ff2f
+3483c2c,3484ffff
+3483c30,ac640004
+3483c34,8e0402b0
+3483c38,24830008
+3483c3c,ae0302b0
+3483c40,3c03fa00
+3483c44,ac830000
+3483c48,401825
+3483c4c,c2102b
+3483c50,10400002
+3483c54,261302a8
+3483c58,c01825
+3483c5c,2402ff00
+3483c60,621825
+3483c64,ac830004
+3483c68,24070001
+3483c6c,24060009
+3483c70,3c148041
+3483c74,2685a448
+3483c78,c101bdf
+3483c7c,2602025
+3483c80,24020010
+3483c84,afa20018
+3483c88,afa20014
+3483c8c,263100bd
+3483c90,afb10010
+3483c94,2647001b
+3483c98,3025
+3483c9c,2685a448
+3483ca0,c101c47
+3483ca4,2602025
+3483ca8,8e0202b0
+3483cac,24430008
+3483cb0,ae0302b0
+3483cb4,3c03e700
+3483cb8,ac430000
+3483cbc,ac400004
+3483cc0,8fbf0034
+3483cc4,8fb40030
+3483cc8,8fb3002c
+3483ccc,8fb20028
+3483cd0,8fb10024
+3483cd4,8fb00020
+3483cd8,3e00008
+3483cdc,27bd0038
+3483ce0,3c028041
+3483ce4,8c43a270
+3483ce8,3c028041
+3483cec,24429fc8
+3483cf0,10620021
+3483cf8,27bdffe8
+3483cfc,afbf0014
+3483d00,90660000
+3483d04,90620001
+3483d08,22600
+3483d0c,42603
+3483d10,42183
+3483d14,3042003f
+3483d18,21040
+3483d1c,3c038041
+3483d20,24639fc8
+3483d24,621021
+3483d28,3c038041
+3483d2c,ac62a270
+3483d30,3c02801c
+3483d34,344284a0
+3483d38,944300a4
+3483d3c,28620011
+3483d40,10400008
+3483d44,2825
+3483d48,3c028011
+3483d4c,3442a5d0
+3483d50,431021
+3483d54,804500bc
+3483d58,52fc3
+3483d5c,30a50011
+3483d60,24a5ffef
+3483d64,c100ee2
+3483d6c,8fbf0014
+3483d70,3e00008
+3483d74,27bd0018
+3483d78,3e00008
+3483d80,27bdffd8
+3483d84,afbf0024
+3483d88,afb20020
+3483d8c,afb1001c
+3483d90,afb00018
+3483d94,808025
+3483d98,909101e9
+3483d9c,3c028040
+3483da0,8c432704
+3483da4,10600018
+3483da8,2201025
+3483dac,9487001c
+3483db0,73943
+3483db4,30e7007f
+3483db8,3c02801c
+3483dbc,344284a0
+3483dc0,904600a5
+3483dc4,802825
+3483dc8,c1019e1
+3483dcc,27a40010
+3483dd0,97b20014
+3483dd4,1240000c
+3483dd8,2201025
+3483ddc,c101edc
+3483de0,93a40017
+3483de4,54400004
+3483de8,90420007
+3483dec,c101edc
+3483df0,2402025
+3483df4,90420007
+3483df8,30510001
+3483dfc,56200001
+3483e00,24110005
+3483e04,30420002
+3483e08,a21101ec
+3483e0c,a20201ed
+3483e10,8fbf0024
+3483e14,8fb20020
+3483e18,8fb1001c
+3483e1c,8fb00018
+3483e20,3e00008
+3483e24,27bd0028
+3483e28,27bdffd8
+3483e2c,afbf0024
+3483e30,afb10020
+3483e34,afb0001c
+3483e38,3c02801c
+3483e3c,344284a0
+3483e40,94500020
+3483e44,3c02801d
+3483e48,3442aa30
+3483e4c,8c42066c
+3483e50,3c033000
+3483e54,24630483
+3483e58,431024
+3483e5c,544000ab
+3483e60,8fbf0024
+3483e64,3c02801c
+3483e68,344284a0
+3483e6c,8c430008
+3483e70,3c02800f
+3483e74,8c4213ec
+3483e78,546200a4
+3483e7c,8fbf0024
+3483e80,3c028011
+3483e84,3442a5d0
+3483e88,8c42135c
+3483e8c,5440009f
+3483e90,8fbf0024
+3483e94,3c02800e
+3483e98,3442f1b0
+3483e9c,8c420000
+3483ea0,30420020
+3483ea4,54400099
+3483ea8,8fbf0024
+3483eac,3c028011
+3483eb0,3442a5d0
+3483eb4,8c42009c
+3483eb8,3c036000
+3483ebc,431024
+3483ec0,10400007
+3483ec4,3c028011
+3483ec8,3442a5d0
+3483ecc,8c420004
+3483ed0,50400010
+3483ed4,32020200
+3483ed8,10000085
+3483edc,3c028011
+3483ee0,3442a5d0
+3483ee4,8042007b
+3483ee8,24030007
+3483eec,10430003
+3483ef0,24030008
+3483ef4,14430085
3483ef8,8fbf0024
-3483efc,3c02801c
-3483f00,344284a0
-3483f04,8c430008
-3483f08,3c02800f
-3483f0c,8c4213ec
-3483f10,546200a5
-3483f14,8fbf0024
-3483f18,3c028011
-3483f1c,3442a5d0
-3483f20,8c43135c
-3483f24,24020001
-3483f28,1062009e
-3483f2c,3c02800e
-3483f30,3442f1b0
-3483f34,8c420000
-3483f38,30420020
-3483f3c,5440009a
-3483f40,8fbf0024
-3483f44,3c028011
-3483f48,3442a5d0
-3483f4c,8c42009c
-3483f50,3c036000
-3483f54,431024
-3483f58,10400007
-3483f5c,3c028011
-3483f60,3442a5d0
-3483f64,8c420004
-3483f68,50400010
-3483f6c,32020200
-3483f70,10000085
-3483f74,3c028011
-3483f78,3442a5d0
-3483f7c,8042007b
-3483f80,24030007
-3483f84,10430003
-3483f88,24030008
-3483f8c,14430086
-3483f90,8fbf0024
-3483f94,3c028011
-3483f98,3442a5d0
-3483f9c,8c420004
-3483fa0,54400053
-3483fa4,32100400
-3483fa8,32020200
-3483fac,10400026
-3483fb0,3211ffff
-3483fb4,3c028011
-3483fb8,3442a5d0
-3483fbc,9442009c
-3483fc0,30422000
-3483fc4,50400021
-3483fc8,32310100
-3483fcc,3c028011
-3483fd0,3442a5d0
-3483fd4,94420070
-3483fd8,3042f000
-3483fdc,38422000
-3483fe0,2102b
-3483fe4,24420001
-3483fe8,3c048011
-3483fec,3484a5d0
-3483ff0,21300
-3483ff4,94830070
-3483ff8,30630fff
-3483ffc,621025
-3484000,a4820070
-3484004,3c04801d
-3484008,3485aa30
-348400c,3c028007
-3484010,34429764
-3484014,40f809
-3484018,248484a0
-348401c,3c058010
-3484020,24a243a8
-3484024,afa20014
-3484028,24a743a0
-348402c,afa70010
-3484030,24060004
-3484034,24a54394
-3484038,3c02800c
-348403c,3442806c
-3484040,40f809
-3484044,24040835
-3484048,32310100
-348404c,52200028
-3484050,32100400
-3484054,3c028011
-3484058,3442a5d0
-348405c,9442009c
-3484060,30424000
-3484064,50400022
-3484068,32100400
-348406c,3c028011
-3484070,3442a5d0
-3484074,94420070
-3484078,3042f000
-348407c,24033000
-3484080,50430002
-3484084,24040001
-3484088,24040003
-348408c,3c038011
-3484090,3463a5d0
-3484094,42300
-3484098,94620070
-348409c,30420fff
-34840a0,441025
-34840a4,a4620070
-34840a8,3c04801d
-34840ac,3485aa30
-34840b0,3c028007
-34840b4,34429764
-34840b8,40f809
-34840bc,248484a0
-34840c0,3c058010
-34840c4,24a243a8
-34840c8,afa20014
-34840cc,24a743a0
-34840d0,afa70010
-34840d4,24060004
-34840d8,24a54394
-34840dc,3c02800c
-34840e0,3442806c
-34840e4,40f809
-34840e8,24040835
-34840ec,32100400
-34840f0,1200002d
-34840f4,8fbf0024
-34840f8,3c02801c
-34840fc,344284a0
-3484100,3c030001
-3484104,431021
-3484108,94420934
-348410c,14400027
-3484110,8fb10020
-3484114,3c028011
-3484118,3442a5d0
-348411c,9046007b
-3484120,24c2fff9
-3484124,304200ff
-3484128,2c420002
-348412c,10400020
-3484130,8fb0001c
-3484134,3c02801c
-3484138,344284a0
-348413c,431021
-3484140,90420758
-3484144,1440001a
-3484148,3c02801d
-348414c,3442aa30
-3484150,8c42066c
-3484154,3c0308a0
-3484158,24630800
-348415c,431024
-3484160,14400013
-3484164,24070002
-3484168,3c04801d
-348416c,3485aa30
-3484170,3c028038
-3484174,3442c9a0
-3484178,40f809
-348417c,248484a0
-3484180,10000009
-3484184,8fbf0024
-3484188,3442a5d0
-348418c,8042007b
-3484190,24030007
-3484194,1043ffd5
-3484198,24030008
-348419c,1043ffd4
-34841a0,32100400
-34841a4,8fbf0024
-34841a8,8fb10020
-34841ac,8fb0001c
-34841b0,3e00008
-34841b4,27bd0028
-34841b8,3c028011
-34841bc,3442a5d0
-34841c0,8c42009c
-34841c4,3c036000
-34841c8,431024
-34841cc,10400006
-34841d0,3c028011
-34841d4,3442a5d0
-34841d8,8c420004
-34841dc,1040000a
-34841e0,3c028040
-34841e4,3c028011
-34841e8,3442a5d0
-34841ec,9042007b
-34841f0,2442fff9
-34841f4,304200ff
-34841f8,2c420002
-34841fc,10400123
-3484204,3c028040
-3484208,9042088a
-348420c,1040011f
-3484214,27bdffc8
-3484218,afbf0034
-348421c,afb30030
-3484220,afb2002c
-3484224,afb10028
-3484228,afb00024
-348422c,3c02801c
-3484230,344284a0
-3484234,8c500000
-3484238,8e0302b0
-348423c,24640008
-3484240,ae0402b0
-3484244,3c04de00
-3484248,ac640000
-348424c,3c048041
-3484250,2484a0e8
-3484254,ac640004
-3484258,8e0302b0
-348425c,24640008
-3484260,ae0402b0
-3484264,3c04e700
-3484268,ac640000
-348426c,ac600004
-3484270,8e0302b0
-3484274,24640008
-3484278,ae0402b0
-348427c,3c04fc11
-3484280,34849623
-3484284,ac640000
-3484288,3c04ff2f
-348428c,3484ffff
-3484290,ac640004
-3484294,3c030001
-3484298,431021
-348429c,94520744
-34842a0,240200aa
-34842a4,124200e0
-34842a8,24070001
-34842ac,261102a8
-34842b0,8e0202b0
-34842b4,24430008
-34842b8,ae0302b0
-34842bc,3c03fa00
-34842c0,ac430000
-34842c4,2403ff00
-34842c8,2431825
-34842cc,ac430004
-34842d0,3025
-34842d4,3c138041
-34842d8,2665a088
-34842dc,c101ba6
-34842e0,2202025
-34842e4,24020010
-34842e8,afa20018
-34842ec,afa20014
-34842f0,24020040
-34842f4,afa20010
-34842f8,2407010f
-34842fc,3025
-3484300,2665a088
-3484304,c101c0e
-3484308,2202025
-348430c,240200ff
-3484310,16420023
+3483efc,3c028011
+3483f00,3442a5d0
+3483f04,8c420004
+3483f08,54400053
+3483f0c,32100400
+3483f10,32020200
+3483f14,10400026
+3483f18,3211ffff
+3483f1c,3c028011
+3483f20,3442a5d0
+3483f24,9442009c
+3483f28,30422000
+3483f2c,50400021
+3483f30,32310100
+3483f34,3c028011
+3483f38,3442a5d0
+3483f3c,94420070
+3483f40,3042f000
+3483f44,38422000
+3483f48,2102b
+3483f4c,24420001
+3483f50,3c048011
+3483f54,3484a5d0
+3483f58,21300
+3483f5c,94830070
+3483f60,30630fff
+3483f64,621025
+3483f68,a4820070
+3483f6c,3c04801d
+3483f70,3485aa30
+3483f74,3c028007
+3483f78,34429764
+3483f7c,40f809
+3483f80,248484a0
+3483f84,3c058010
+3483f88,24a243a8
+3483f8c,afa20014
+3483f90,24a743a0
+3483f94,afa70010
+3483f98,24060004
+3483f9c,24a54394
+3483fa0,3c02800c
+3483fa4,3442806c
+3483fa8,40f809
+3483fac,24040835
+3483fb0,32310100
+3483fb4,52200028
+3483fb8,32100400
+3483fbc,3c028011
+3483fc0,3442a5d0
+3483fc4,9442009c
+3483fc8,30424000
+3483fcc,50400022
+3483fd0,32100400
+3483fd4,3c028011
+3483fd8,3442a5d0
+3483fdc,94420070
+3483fe0,3042f000
+3483fe4,24033000
+3483fe8,50430002
+3483fec,24040001
+3483ff0,24040003
+3483ff4,3c038011
+3483ff8,3463a5d0
+3483ffc,42300
+3484000,94620070
+3484004,30420fff
+3484008,441025
+348400c,a4620070
+3484010,3c04801d
+3484014,3485aa30
+3484018,3c028007
+348401c,34429764
+3484020,40f809
+3484024,248484a0
+3484028,3c058010
+348402c,24a243a8
+3484030,afa20014
+3484034,24a743a0
+3484038,afa70010
+348403c,24060004
+3484040,24a54394
+3484044,3c02800c
+3484048,3442806c
+348404c,40f809
+3484050,24040835
+3484054,32100400
+3484058,1200002c
+348405c,8fbf0024
+3484060,3c02801c
+3484064,344284a0
+3484068,3c030001
+348406c,431021
+3484070,94420934
+3484074,14400026
+3484078,8fb10020
+348407c,3c028011
+3484080,3442a5d0
+3484084,9046007b
+3484088,24c2fff9
+348408c,304200ff
+3484090,2c420002
+3484094,1040001f
+3484098,8fb0001c
+348409c,3c02801c
+34840a0,344284a0
+34840a4,431021
+34840a8,90420758
+34840ac,14400019
+34840b0,3c02801d
+34840b4,3442aa30
+34840b8,8c42066c
+34840bc,3c0308a0
+34840c0,24630800
+34840c4,431024
+34840c8,14400012
+34840cc,24070002
+34840d0,3c04801d
+34840d4,3485aa30
+34840d8,3c028038
+34840dc,3442c9a0
+34840e0,40f809
+34840e4,248484a0
+34840e8,10000008
+34840ec,8fbf0024
+34840f0,3442a5d0
+34840f4,8042007b
+34840f8,24030007
+34840fc,1043ffd5
+3484100,24030008
+3484104,1043ffd3
+3484108,8fbf0024
+348410c,8fb10020
+3484110,8fb0001c
+3484114,3e00008
+3484118,27bd0028
+348411c,3c028011
+3484120,3442a5d0
+3484124,8c42009c
+3484128,3c036000
+348412c,431024
+3484130,10400006
+3484134,3c028011
+3484138,3442a5d0
+348413c,8c420004
+3484140,1040000a
+3484144,3c028040
+3484148,3c028011
+348414c,3442a5d0
+3484150,9042007b
+3484154,2442fff9
+3484158,304200ff
+348415c,2c420002
+3484160,10400123
+3484168,3c028040
+348416c,9042088a
+3484170,1040011f
+3484178,27bdffc8
+348417c,afbf0034
+3484180,afb30030
+3484184,afb2002c
+3484188,afb10028
+348418c,afb00024
+3484190,3c02801c
+3484194,344284a0
+3484198,8c500000
+348419c,8e0302b0
+34841a0,24640008
+34841a4,ae0402b0
+34841a8,3c04de00
+34841ac,ac640000
+34841b0,3c048041
+34841b4,2484a488
+34841b8,ac640004
+34841bc,8e0302b0
+34841c0,24640008
+34841c4,ae0402b0
+34841c8,3c04e700
+34841cc,ac640000
+34841d0,ac600004
+34841d4,8e0302b0
+34841d8,24640008
+34841dc,ae0402b0
+34841e0,3c04fc11
+34841e4,34849623
+34841e8,ac640000
+34841ec,3c04ff2f
+34841f0,3484ffff
+34841f4,ac640004
+34841f8,3c030001
+34841fc,431021
+3484200,94520744
+3484204,240200aa
+3484208,124200e0
+348420c,24070001
+3484210,261102a8
+3484214,8e0202b0
+3484218,24430008
+348421c,ae0302b0
+3484220,3c03fa00
+3484224,ac430000
+3484228,2403ff00
+348422c,2431825
+3484230,ac430004
+3484234,3025
+3484238,3c138041
+348423c,2665a428
+3484240,c101bdf
+3484244,2202025
+3484248,24020010
+348424c,afa20018
+3484250,afa20014
+3484254,24020040
+3484258,afa20010
+348425c,2407010f
+3484260,3025
+3484264,2665a428
+3484268,c101c47
+348426c,2202025
+3484270,240200ff
+3484274,16420023
+3484278,3c028011
+348427c,3c02801d
+3484280,3442aa30
+3484284,8c42066c
+3484288,3c033000
+348428c,24630483
+3484290,431024
+3484294,10400009
+3484298,3c02801c
+348429c,8e0202b0
+34842a0,24430008
+34842a4,ae0302b0
+34842a8,3c03fa00
+34842ac,ac430000
+34842b0,2403ff46
+34842b4,10000012
+34842b8,ac430004
+34842bc,344284a0
+34842c0,8c430008
+34842c4,3c02800f
+34842c8,8c4213ec
+34842cc,5462fff4
+34842d0,8e0202b0
+34842d4,3c028011
+34842d8,3442a5d0
+34842dc,8c42135c
+34842e0,5440ffef
+34842e4,8e0202b0
+34842e8,3c02800e
+34842ec,3442f1b0
+34842f0,8c420000
+34842f4,30420020
+34842f8,5440ffe9
+34842fc,8e0202b0
+3484300,3c028011
+3484304,3442a5d0
+3484308,9442009c
+348430c,30422000
+3484310,1040002a
3484314,3c028011
-3484318,3c02801d
-348431c,3442aa30
-3484320,8c42066c
-3484324,3c033000
-3484328,24630483
-348432c,431024
-3484330,10400009
-3484334,3c02801c
-3484338,8e0202b0
-348433c,24430008
-3484340,ae0302b0
-3484344,3c03fa00
-3484348,ac430000
-348434c,2403ff46
-3484350,10000012
-3484354,ac430004
-3484358,344284a0
-348435c,8c430008
-3484360,3c02800f
-3484364,8c4213ec
-3484368,5462fff4
-348436c,8e0202b0
-3484370,3c028011
-3484374,3442a5d0
-3484378,8c43135c
-348437c,24020001
-3484380,1062ffed
-3484384,3c02800e
-3484388,3442f1b0
-348438c,8c420000
-3484390,30420020
-3484394,5440ffe9
-3484398,8e0202b0
-348439c,3c028011
-34843a0,3442a5d0
-34843a4,9442009c
-34843a8,30422000
-34843ac,1040002a
-34843b0,3c028011
-34843b4,3442a5d0
-34843b8,8c420004
-34843bc,14400054
-34843c0,3c028011
-34843c4,24070001
-34843c8,24060045
-34843cc,3c058041
-34843d0,24a5a0b8
-34843d4,c101ba6
-34843d8,2202025
+3484318,3442a5d0
+348431c,8c420004
+3484320,14400054
+3484324,3c028011
+3484328,24070001
+348432c,24060045
+3484330,3c058041
+3484334,24a5a458
+3484338,c101bdf
+348433c,2202025
+3484340,3c028011
+3484344,3442a5d0
+3484348,94420070
+348434c,3042f000
+3484350,24032000
+3484354,5443000e
+3484358,2402000c
+348435c,24020010
+3484360,afa20018
+3484364,afa20014
+3484368,24020040
+348436c,afa20010
+3484370,24070102
+3484374,3025
+3484378,3c058041
+348437c,24a5a458
+3484380,c101c47
+3484384,2202025
+3484388,1000000c
+348438c,3c028011
+3484390,afa20018
+3484394,afa20014
+3484398,24020042
+348439c,afa20010
+34843a0,24070104
+34843a4,3025
+34843a8,3c058041
+34843ac,24a5a458
+34843b0,c101c47
+34843b4,2202025
+34843b8,3c028011
+34843bc,3442a5d0
+34843c0,9442009c
+34843c4,30424000
+34843c8,1040002a
+34843cc,3c028011
+34843d0,3442a5d0
+34843d4,8c420004
+34843d8,14400026
34843dc,3c028011
-34843e0,3442a5d0
-34843e4,94420070
-34843e8,3042f000
-34843ec,24032000
-34843f0,5443000e
-34843f4,2402000c
-34843f8,24020010
-34843fc,afa20018
-3484400,afa20014
-3484404,24020040
-3484408,afa20010
-348440c,24070102
-3484410,3025
-3484414,3c058041
-3484418,24a5a0b8
-348441c,c101c0e
-3484420,2202025
-3484424,1000000c
-3484428,3c028011
-348442c,afa20018
-3484430,afa20014
-3484434,24020042
-3484438,afa20010
-348443c,24070104
-3484440,3025
-3484444,3c058041
-3484448,24a5a0b8
-348444c,c101c0e
-3484450,2202025
-3484454,3c028011
-3484458,3442a5d0
-348445c,9442009c
-3484460,30424000
-3484464,1040002a
-3484468,3c028011
-348446c,3442a5d0
-3484470,8c420004
-3484474,14400026
-3484478,3c028011
-348447c,24070001
-3484480,24060046
-3484484,3c058041
-3484488,24a5a0b8
-348448c,c101ba6
-3484490,2202025
-3484494,3c028011
-3484498,3442a5d0
-348449c,94420070
-34844a0,3042f000
-34844a4,24033000
-34844a8,5443000e
-34844ac,2402000c
-34844b0,24020010
-34844b4,afa20018
-34844b8,afa20014
-34844bc,24020040
-34844c0,afa20010
-34844c4,2407011b
-34844c8,3025
-34844cc,3c058041
-34844d0,24a5a0b8
-34844d4,c101c0e
-34844d8,2202025
-34844dc,1000000c
-34844e0,3c028011
-34844e4,afa20018
-34844e8,afa20014
-34844ec,24020042
-34844f0,afa20010
-34844f4,2407011d
-34844f8,3025
-34844fc,3c058041
-3484500,24a5a0b8
-3484504,c101c0e
-3484508,2202025
-348450c,3c028011
-3484510,3442a5d0
-3484514,9042007b
-3484518,2442fff9
-348451c,304200ff
-3484520,2c420002
-3484524,50400034
-3484528,8e0202b0
-348452c,240200ff
-3484530,1642001f
-3484534,24070001
-3484538,3c02801c
-348453c,344284a0
-3484540,3c030001
-3484544,431021
-3484548,94420934
-348454c,10400009
-3484550,3c02801c
-3484554,8e0202b0
-3484558,24430008
-348455c,ae0302b0
-3484560,3c03fa00
-3484564,ac430000
-3484568,2403ff46
-348456c,1000000f
-3484570,ac430004
-3484574,344284a0
-3484578,3c030001
-348457c,431021
-3484580,90420758
-3484584,5440fff4
-3484588,8e0202b0
-348458c,3c02801d
-3484590,3442aa30
-3484594,8c42066c
-3484598,3c0308a0
-348459c,24630800
-34845a0,431024
-34845a4,5440ffec
-34845a8,8e0202b0
-34845ac,24070001
-34845b0,3c028011
-34845b4,3442a5d0
-34845b8,8046007b
-34845bc,3c128041
-34845c0,2645a0b8
-34845c4,c101ba6
-34845c8,2202025
-34845cc,2402000c
-34845d0,afa20018
-34845d4,afa20014
-34845d8,2402004d
-34845dc,afa20010
-34845e0,24070111
-34845e4,3025
-34845e8,2645a0b8
-34845ec,c101c0e
-34845f0,2202025
-34845f4,8e0202b0
-34845f8,24430008
-34845fc,ae0302b0
-3484600,3c03e700
-3484604,ac430000
-3484608,ac400004
-348460c,8fbf0034
-3484610,8fb30030
-3484614,8fb2002c
-3484618,8fb10028
-348461c,8fb00024
-3484620,3e00008
-3484624,27bd0038
-3484628,261102a8
-348462c,8e0202b0
-3484630,24430008
-3484634,ae0302b0
-3484638,3c03fa00
-348463c,ac430000
-3484640,2403ffff
-3484644,ac430004
-3484648,3025
-348464c,3c128041
-3484650,2645a088
-3484654,c101ba6
-3484658,2202025
-348465c,24020010
-3484660,afa20018
-3484664,afa20014
-3484668,24020040
-348466c,afa20010
-3484670,2407010f
-3484674,3025
-3484678,2645a088
-348467c,c101c0e
-3484680,2202025
-3484684,1000ff24
-3484688,241200ff
-348468c,3e00008
-3484694,3c028041
-3484698,8c42b11c
-348469c,10400274
-34846a0,3c02801c
-34846a4,27bdff90
-34846a8,afbf006c
-34846ac,afbe0068
-34846b0,afb70064
-34846b4,afb60060
-34846b8,afb5005c
-34846bc,afb40058
-34846c0,afb30054
-34846c4,afb20050
-34846c8,afb1004c
-34846cc,afb00048
-34846d0,344284a0
-34846d4,3c030001
-34846d8,431021
-34846dc,94430934
-34846e0,24020006
-34846e4,14620256
-34846e8,808025
-34846ec,3c02801c
-34846f0,344284a0
-34846f4,3c030001
-34846f8,431021
-34846fc,94420948
-3484700,1440024f
-3484704,3c02801c
-3484708,344284a0
-348470c,431021
-3484710,94420944
-3484714,1440024a
-3484718,3c02801c
-348471c,344284a0
-3484720,84420014
-3484724,4430247
-3484728,8fbf006c
-348472c,8c820004
-3484730,24430008
-3484734,ac830008
-3484738,3c03de00
-348473c,ac430000
-3484740,3c038041
-3484744,2463a0e8
-3484748,ac430004
-348474c,3c028011
-3484750,3442a5d0
-3484754,94430f2e
-3484758,3c028041
-348475c,8c42b118
-3484760,10400012
-3484764,3025
-3484768,3c028041
-348476c,8c42b1b4
-3484770,10400010
-3484774,24060001
-3484778,30620001
-348477c,54400006
-3484780,30630002
-3484784,3c028041
-3484788,8c42b1b4
-348478c,1040000c
-3484790,3025
-3484794,30630002
-3484798,24020001
-348479c,1460000a
-34847a0,afa2003c
-34847a4,10000008
-34847a8,afa0003c
-34847ac,10000006
-34847b0,afa0003c
-34847b4,24020001
-34847b8,10000003
-34847bc,afa2003c
-34847c0,24020001
-34847c4,afa2003c
-34847c8,3c028041
-34847cc,8c55b1c0
-34847d0,12a00007
-34847d4,2a01825
-34847d8,3c028041
-34847dc,9442a09c
-34847e0,21840
-34847e4,621821
-34847e8,31840
-34847ec,24630001
-34847f0,3c028041
-34847f4,9442a09c
-34847f8,210c0
-34847fc,24420057
-3484800,431021
-3484804,24030140
-3484808,621823
-348480c,38fc2
-3484810,2238821
-3484814,118843
-3484818,26230001
-348481c,afa30038
+34843e0,24070001
+34843e4,24060046
+34843e8,3c058041
+34843ec,24a5a458
+34843f0,c101bdf
+34843f4,2202025
+34843f8,3c028011
+34843fc,3442a5d0
+3484400,94420070
+3484404,3042f000
+3484408,24033000
+348440c,5443000e
+3484410,2402000c
+3484414,24020010
+3484418,afa20018
+348441c,afa20014
+3484420,24020040
+3484424,afa20010
+3484428,2407011b
+348442c,3025
+3484430,3c058041
+3484434,24a5a458
+3484438,c101c47
+348443c,2202025
+3484440,1000000c
+3484444,3c028011
+3484448,afa20018
+348444c,afa20014
+3484450,24020042
+3484454,afa20010
+3484458,2407011d
+348445c,3025
+3484460,3c058041
+3484464,24a5a458
+3484468,c101c47
+348446c,2202025
+3484470,3c028011
+3484474,3442a5d0
+3484478,9042007b
+348447c,2442fff9
+3484480,304200ff
+3484484,2c420002
+3484488,50400034
+348448c,8e0202b0
+3484490,240200ff
+3484494,1642001f
+3484498,24070001
+348449c,3c02801c
+34844a0,344284a0
+34844a4,3c030001
+34844a8,431021
+34844ac,94420934
+34844b0,10400009
+34844b4,3c02801c
+34844b8,8e0202b0
+34844bc,24430008
+34844c0,ae0302b0
+34844c4,3c03fa00
+34844c8,ac430000
+34844cc,2403ff46
+34844d0,1000000f
+34844d4,ac430004
+34844d8,344284a0
+34844dc,3c030001
+34844e0,431021
+34844e4,90420758
+34844e8,5440fff4
+34844ec,8e0202b0
+34844f0,3c02801d
+34844f4,3442aa30
+34844f8,8c42066c
+34844fc,3c0308a0
+3484500,24630800
+3484504,431024
+3484508,5440ffec
+348450c,8e0202b0
+3484510,24070001
+3484514,3c028011
+3484518,3442a5d0
+348451c,8046007b
+3484520,3c128041
+3484524,2645a458
+3484528,c101bdf
+348452c,2202025
+3484530,2402000c
+3484534,afa20018
+3484538,afa20014
+348453c,2402004d
+3484540,afa20010
+3484544,24070111
+3484548,3025
+348454c,2645a458
+3484550,c101c47
+3484554,2202025
+3484558,8e0202b0
+348455c,24430008
+3484560,ae0302b0
+3484564,3c03e700
+3484568,ac430000
+348456c,ac400004
+3484570,8fbf0034
+3484574,8fb30030
+3484578,8fb2002c
+348457c,8fb10028
+3484580,8fb00024
+3484584,3e00008
+3484588,27bd0038
+348458c,261102a8
+3484590,8e0202b0
+3484594,24430008
+3484598,ae0302b0
+348459c,3c03fa00
+34845a0,ac430000
+34845a4,2403ffff
+34845a8,ac430004
+34845ac,3025
+34845b0,3c128041
+34845b4,2645a428
+34845b8,c101bdf
+34845bc,2202025
+34845c0,24020010
+34845c4,afa20018
+34845c8,afa20014
+34845cc,24020040
+34845d0,afa20010
+34845d4,2407010f
+34845d8,3025
+34845dc,2645a428
+34845e0,c101c47
+34845e4,2202025
+34845e8,1000ff24
+34845ec,241200ff
+34845f0,3e00008
+34845f8,3c028041
+34845fc,8c42b4bc
+3484600,10400274
+3484604,3c02801c
+3484608,27bdff90
+348460c,afbf006c
+3484610,afbe0068
+3484614,afb70064
+3484618,afb60060
+348461c,afb5005c
+3484620,afb40058
+3484624,afb30054
+3484628,afb20050
+348462c,afb1004c
+3484630,afb00048
+3484634,344284a0
+3484638,3c030001
+348463c,431021
+3484640,94430934
+3484644,24020006
+3484648,14620256
+348464c,808025
+3484650,3c02801c
+3484654,344284a0
+3484658,3c030001
+348465c,431021
+3484660,94420948
+3484664,1440024f
+3484668,3c02801c
+348466c,344284a0
+3484670,431021
+3484674,94420944
+3484678,1440024a
+348467c,3c02801c
+3484680,344284a0
+3484684,84420014
+3484688,4430247
+348468c,8fbf006c
+3484690,8c820004
+3484694,24430008
+3484698,ac830008
+348469c,3c03de00
+34846a0,ac430000
+34846a4,3c038041
+34846a8,2463a488
+34846ac,ac430004
+34846b0,3c028011
+34846b4,3442a5d0
+34846b8,94430f2e
+34846bc,3c028041
+34846c0,8c42b4b8
+34846c4,10400012
+34846c8,3025
+34846cc,3c028041
+34846d0,8c42b554
+34846d4,10400010
+34846d8,24060001
+34846dc,30620001
+34846e0,54400006
+34846e4,30630002
+34846e8,3c028041
+34846ec,8c42b554
+34846f0,1040000c
+34846f4,3025
+34846f8,30630002
+34846fc,24020001
+3484700,1460000a
+3484704,afa2003c
+3484708,10000008
+348470c,afa0003c
+3484710,10000006
+3484714,afa0003c
+3484718,24020001
+348471c,10000003
+3484720,afa2003c
+3484724,24020001
+3484728,afa2003c
+348472c,3c028041
+3484730,8c55b560
+3484734,12a00007
+3484738,2a01825
+348473c,3c028041
+3484740,9442a43c
+3484744,21840
+3484748,621821
+348474c,31840
+3484750,24630001
+3484754,3c028041
+3484758,9442a43c
+348475c,210c0
+3484760,24420057
+3484764,431021
+3484768,24030140
+348476c,621823
+3484770,38fc2
+3484774,2238821
+3484778,118843
+348477c,26230001
+3484780,afa30038
+3484784,8e030008
+3484788,24640008
+348478c,ae040008
+3484790,3c04fcff
+3484794,3484ffff
+3484798,ac640000
+348479c,3c04fffd
+34847a0,3484f6fb
+34847a4,ac640004
+34847a8,8e030008
+34847ac,24640008
+34847b0,ae040008
+34847b4,3c04fa00
+34847b8,ac640000
+34847bc,240400d0
+34847c0,ac640004
+34847c4,511021
+34847c8,21380
+34847cc,3c0300ff
+34847d0,3463f000
+34847d4,431024
+34847d8,3c04e400
+34847dc,2484039c
+34847e0,441025
+34847e4,afa20020
+34847e8,111380
+34847ec,431024
+34847f0,34420024
+34847f4,afa20024
+34847f8,3c02e100
+34847fc,afa20028
+3484800,afa0002c
+3484804,3c02f100
+3484808,afa20030
+348480c,3c020400
+3484810,24420400
+3484814,afa20034
+3484818,27a20020
+348481c,27a70038
3484820,8e030008
3484824,24640008
3484828,ae040008
-348482c,3c04fcff
-3484830,3484ffff
-3484834,ac640000
-3484838,3c04fffd
-348483c,3484f6fb
-3484840,ac640004
-3484844,8e030008
-3484848,24640008
-348484c,ae040008
-3484850,3c04fa00
-3484854,ac640000
-3484858,240400d0
-348485c,ac640004
-3484860,511021
-3484864,21380
-3484868,3c0300ff
-348486c,3463f000
-3484870,431024
-3484874,3c04e400
-3484878,2484039c
-348487c,441025
-3484880,afa20020
-3484884,111380
-3484888,431024
-348488c,34420024
-3484890,afa20024
-3484894,3c02e100
-3484898,afa20028
-348489c,afa0002c
-34848a0,3c02f100
-34848a4,afa20030
-34848a8,3c020400
-34848ac,24420400
-34848b0,afa20034
-34848b4,27a20020
-34848b8,27a70038
-34848bc,8e030008
-34848c0,24640008
-34848c4,ae040008
-34848c8,8c450004
-34848cc,8c440000
-34848d0,ac650004
-34848d4,24420008
-34848d8,14e2fff8
-34848dc,ac640000
-34848e0,8e020008
-34848e4,24430008
-34848e8,ae030008
-34848ec,3c03e700
-34848f0,ac430000
-34848f4,ac400004
-34848f8,8e020008
-34848fc,24430008
-3484900,ae030008
-3484904,3c03fc11
-3484908,34639623
-348490c,ac430000
-3484910,3c03ff2f
-3484914,3463ffff
-3484918,10c0004c
-348491c,ac430004
-3484920,3c058041
-3484924,24a5a0c8
-3484928,94a70008
-348492c,3025
-3484930,c101ba6
-3484934,2002025
-3484938,3c028041
-348493c,8c42b120
-3484940,18400042
-3484944,3c028041
-3484948,3c128041
-348494c,26529f38
-3484950,2414000a
-3484954,9825
-3484958,3c1e8041
-348495c,3c168041
-3484960,26d69f14
-3484964,24429f24
-3484968,afa20040
-348496c,3c028041
-3484970,2442a0c8
-3484974,afa20044
-3484978,3c178041
-348497c,8fc2b1b8
-3484980,5040000b
-3484984,92420000
-3484988,92430000
-348498c,3c028011
-3484990,3442a5d0
-3484994,431021
-3484998,904200a8
-348499c,21042
-34849a0,30420001
-34849a4,50400024
-34849a8,26730001
-34849ac,92420000
-34849b0,561021
-34849b4,80460000
-34849b8,28c20003
-34849bc,5440001e
-34849c0,26730001
-34849c4,24c6fffd
-34849c8,61840
-34849cc,661821
-34849d0,8fa20040
-34849d4,621821
-34849d8,90620000
-34849dc,21600
-34849e0,90640002
-34849e4,42200
-34849e8,441025
-34849ec,90630001
-34849f0,31c00
-34849f4,431025
-34849f8,344200ff
-34849fc,8e030008
-3484a00,24640008
-3484a04,ae040008
-3484a08,3c04fa00
-3484a0c,ac640000
-3484a10,ac620004
-3484a14,24020010
-3484a18,afa20018
-3484a1c,afa20014
-3484a20,afb40010
-3484a24,8fa70038
-3484a28,8fa50044
-3484a2c,c101c0e
-3484a30,2002025
-3484a34,26730001
-3484a38,2652000c
-3484a3c,8ee2b120
-3484a40,262102a
-3484a44,1440ffcd
-3484a48,26940011
-3484a4c,8e020008
-3484a50,24430008
-3484a54,ae030008
-3484a58,3c03fa00
-3484a5c,ac430000
-3484a60,2403ffff
-3484a64,ac430004
-3484a68,8fa2003c
-3484a6c,10400037
-3484a70,3c028041
-3484a74,3c058041
-3484a78,24a5a0d8
-3484a7c,94a70008
-3484a80,3025
-3484a84,c101ba6
-3484a88,2002025
-3484a8c,3c028041
-3484a90,8c42b120
-3484a94,18400168
-3484a98,3c1e8041
-3484a9c,3c128041
-3484aa0,26529f38
-3484aa4,2414000a
-3484aa8,9825
-3484aac,3c168041
-3484ab0,26d69f14
-3484ab4,3c028041
-3484ab8,2442a0d8
-3484abc,afa20040
-3484ac0,3c028011
-3484ac4,3442a5d0
-3484ac8,afa2003c
-3484acc,3c178041
-3484ad0,8fc2b1b8
-3484ad4,10400009
-3484ad8,92420000
-3484adc,8fa3003c
-3484ae0,621021
-3484ae4,904200a8
-3484ae8,21042
-3484aec,30420001
-3484af0,50400010
-3484af4,26730001
-3484af8,92420000
-3484afc,561021
-3484b00,80460000
-3484b04,2cc20003
-3484b08,5040000a
-3484b0c,26730001
-3484b10,24020010
-3484b14,afa20018
-3484b18,afa20014
-3484b1c,afb40010
-3484b20,8fa70038
-3484b24,8fa50040
-3484b28,c101c0e
-3484b2c,2002025
-3484b30,26730001
-3484b34,2652000c
-3484b38,8ee2b120
-3484b3c,262102a
-3484b40,1440ffe3
-3484b44,26940011
-3484b48,3c028041
-3484b4c,8c42b120
-3484b50,18400010
-3484b54,26310012
-3484b58,3c128041
-3484b5c,26529f3a
-3484b60,2414000b
-3484b64,9825
-3484b68,3c168041
-3484b6c,2803025
-3484b70,2202825
-3484b74,c102519
-3484b78,2402025
-3484b7c,26730001
-3484b80,2652000c
-3484b84,8ec2b120
-3484b88,262102a
-3484b8c,1440fff7
-3484b90,26940011
-3484b94,3c028041
-3484b98,9456a09c
-3484b9c,16b0c0
-3484ba0,26d60001
-3484ba4,2d1b021
-3484ba8,24070001
-3484bac,24060011
-3484bb0,3c058041
-3484bb4,24a5a0a8
-3484bb8,c101ba6
-3484bbc,2002025
-3484bc0,3c028041
-3484bc4,8c42b120
-3484bc8,18400024
-3484bcc,241e3000
-3484bd0,3c118041
-3484bd4,26319f38
-3484bd8,2413000b
-3484bdc,9025
-3484be0,3c178011
-3484be4,36f7a5d0
-3484be8,3c148041
-3484bec,82220001
-3484bf0,4430015
-3484bf4,26520001
-3484bf8,92220000
-3484bfc,2e21021
-3484c00,904200bc
-3484c04,21e00
-3484c08,31e03
-3484c0c,2863000a
-3484c10,50600001
-3484c14,24020009
-3484c18,21e00
-3484c1c,31e03
-3484c20,4620001
-3484c24,1025
-3484c28,a7be0020
-3484c2c,24420030
-3484c30,a3a20020
-3484c34,2603025
-3484c38,2c02825
-3484c3c,c102519
-3484c40,27a40020
+348482c,8c450004
+3484830,8c440000
+3484834,ac650004
+3484838,24420008
+348483c,14e2fff8
+3484840,ac640000
+3484844,8e020008
+3484848,24430008
+348484c,ae030008
+3484850,3c03e700
+3484854,ac430000
+3484858,ac400004
+348485c,8e020008
+3484860,24430008
+3484864,ae030008
+3484868,3c03fc11
+348486c,34639623
+3484870,ac430000
+3484874,3c03ff2f
+3484878,3463ffff
+348487c,10c0004c
+3484880,ac430004
+3484884,3c058041
+3484888,24a5a468
+348488c,94a70008
+3484890,3025
+3484894,c101bdf
+3484898,2002025
+348489c,3c028041
+34848a0,8c42b4c0
+34848a4,18400042
+34848a8,3c028041
+34848ac,3c128041
+34848b0,2652a298
+34848b4,2414000a
+34848b8,9825
+34848bc,3c1e8041
+34848c0,3c168041
+34848c4,26d6a274
+34848c8,2442a284
+34848cc,afa20040
+34848d0,3c028041
+34848d4,2442a468
+34848d8,afa20044
+34848dc,3c178041
+34848e0,8fc2b558
+34848e4,5040000b
+34848e8,92420000
+34848ec,92430000
+34848f0,3c028011
+34848f4,3442a5d0
+34848f8,431021
+34848fc,904200a8
+3484900,21042
+3484904,30420001
+3484908,50400024
+348490c,26730001
+3484910,92420000
+3484914,561021
+3484918,80460000
+348491c,28c20003
+3484920,5440001e
+3484924,26730001
+3484928,24c6fffd
+348492c,61840
+3484930,661821
+3484934,8fa20040
+3484938,621821
+348493c,90620000
+3484940,21600
+3484944,90640002
+3484948,42200
+348494c,441025
+3484950,90630001
+3484954,31c00
+3484958,431025
+348495c,344200ff
+3484960,8e030008
+3484964,24640008
+3484968,ae040008
+348496c,3c04fa00
+3484970,ac640000
+3484974,ac620004
+3484978,24020010
+348497c,afa20018
+3484980,afa20014
+3484984,afb40010
+3484988,8fa70038
+348498c,8fa50044
+3484990,c101c47
+3484994,2002025
+3484998,26730001
+348499c,2652000c
+34849a0,8ee2b4c0
+34849a4,262102a
+34849a8,1440ffcd
+34849ac,26940011
+34849b0,8e020008
+34849b4,24430008
+34849b8,ae030008
+34849bc,3c03fa00
+34849c0,ac430000
+34849c4,2403ffff
+34849c8,ac430004
+34849cc,8fa2003c
+34849d0,10400037
+34849d4,3c028041
+34849d8,3c058041
+34849dc,24a5a478
+34849e0,94a70008
+34849e4,3025
+34849e8,c101bdf
+34849ec,2002025
+34849f0,3c028041
+34849f4,8c42b4c0
+34849f8,18400168
+34849fc,3c1e8041
+3484a00,3c128041
+3484a04,2652a298
+3484a08,2414000a
+3484a0c,9825
+3484a10,3c168041
+3484a14,26d6a274
+3484a18,3c028041
+3484a1c,2442a478
+3484a20,afa20040
+3484a24,3c028011
+3484a28,3442a5d0
+3484a2c,afa2003c
+3484a30,3c178041
+3484a34,8fc2b558
+3484a38,10400009
+3484a3c,92420000
+3484a40,8fa3003c
+3484a44,621021
+3484a48,904200a8
+3484a4c,21042
+3484a50,30420001
+3484a54,50400010
+3484a58,26730001
+3484a5c,92420000
+3484a60,561021
+3484a64,80460000
+3484a68,2cc20003
+3484a6c,5040000a
+3484a70,26730001
+3484a74,24020010
+3484a78,afa20018
+3484a7c,afa20014
+3484a80,afb40010
+3484a84,8fa70038
+3484a88,8fa50040
+3484a8c,c101c47
+3484a90,2002025
+3484a94,26730001
+3484a98,2652000c
+3484a9c,8ee2b4c0
+3484aa0,262102a
+3484aa4,1440ffe3
+3484aa8,26940011
+3484aac,3c028041
+3484ab0,8c42b4c0
+3484ab4,18400010
+3484ab8,26310012
+3484abc,3c128041
+3484ac0,2652a29a
+3484ac4,2414000b
+3484ac8,9825
+3484acc,3c168041
+3484ad0,2803025
+3484ad4,2202825
+3484ad8,c102561
+3484adc,2402025
+3484ae0,26730001
+3484ae4,2652000c
+3484ae8,8ec2b4c0
+3484aec,262102a
+3484af0,1440fff7
+3484af4,26940011
+3484af8,3c028041
+3484afc,9456a43c
+3484b00,16b0c0
+3484b04,26d60001
+3484b08,2d1b021
+3484b0c,24070001
+3484b10,24060011
+3484b14,3c058041
+3484b18,24a5a448
+3484b1c,c101bdf
+3484b20,2002025
+3484b24,3c028041
+3484b28,8c42b4c0
+3484b2c,18400024
+3484b30,241e3000
+3484b34,3c118041
+3484b38,2631a298
+3484b3c,2413000b
+3484b40,9025
+3484b44,3c178011
+3484b48,36f7a5d0
+3484b4c,3c148041
+3484b50,82220001
+3484b54,4430015
+3484b58,26520001
+3484b5c,92220000
+3484b60,2e21021
+3484b64,904200bc
+3484b68,21e00
+3484b6c,31e03
+3484b70,2863000a
+3484b74,50600001
+3484b78,24020009
+3484b7c,21e00
+3484b80,31e03
+3484b84,4620001
+3484b88,1025
+3484b8c,a7be0020
+3484b90,24420030
+3484b94,a3a20020
+3484b98,2603025
+3484b9c,2c02825
+3484ba0,c102561
+3484ba4,27a40020
+3484ba8,26520001
+3484bac,2631000c
+3484bb0,8e82b4c0
+3484bb4,242102a
+3484bb8,1440ffe5
+3484bbc,26730011
+3484bc0,26de0011
+3484bc4,24070001
+3484bc8,2406000e
+3484bcc,3c058041
+3484bd0,24a5a448
+3484bd4,c101bdf
+3484bd8,2002025
+3484bdc,3c028041
+3484be0,8c42b4c0
+3484be4,18400027
+3484be8,3c028041
+3484bec,3c118041
+3484bf0,2631a298
+3484bf4,2413000a
+3484bf8,9025
+3484bfc,3c178011
+3484c00,36f7a5d0
+3484c04,2442a448
+3484c08,afa20038
+3484c0c,3c148041
+3484c10,92230000
+3484c14,2404000d
+3484c18,14640002
+3484c1c,2201025
+3484c20,2403000a
+3484c24,90420001
+3484c28,30420040
+3484c2c,50400010
+3484c30,26520001
+3484c34,2e31821
+3484c38,906200a8
+3484c3c,30420001
+3484c40,5040000b
3484c44,26520001
-3484c48,2631000c
-3484c4c,8e82b120
-3484c50,242102a
-3484c54,1440ffe5
-3484c58,26730011
-3484c5c,26de0011
-3484c60,24070001
-3484c64,2406000e
-3484c68,3c058041
-3484c6c,24a5a0a8
-3484c70,c101ba6
-3484c74,2002025
-3484c78,3c028041
-3484c7c,8c42b120
-3484c80,18400027
-3484c84,3c028041
-3484c88,3c118041
-3484c8c,26319f38
-3484c90,2413000a
-3484c94,9025
-3484c98,3c178011
-3484c9c,36f7a5d0
-3484ca0,2442a0a8
-3484ca4,afa20038
-3484ca8,3c148041
-3484cac,92230000
-3484cb0,2404000d
-3484cb4,14640002
-3484cb8,2201025
-3484cbc,2403000a
-3484cc0,90420001
-3484cc4,30420040
-3484cc8,50400010
-3484ccc,26520001
-3484cd0,2e31821
-3484cd4,906200a8
-3484cd8,30420001
-3484cdc,5040000b
-3484ce0,26520001
-3484ce4,24020010
-3484ce8,afa20018
-3484cec,afa20014
-3484cf0,afb30010
-3484cf4,3c03825
-3484cf8,3025
-3484cfc,8fa50038
-3484d00,c101c0e
-3484d04,2002025
-3484d08,26520001
-3484d0c,2631000c
-3484d10,8e82b120
-3484d14,242102a
-3484d18,1440ffe4
-3484d1c,26730011
-3484d20,24070001
-3484d24,2406000a
-3484d28,3c058041
-3484d2c,24a5a0a8
-3484d30,c101ba6
-3484d34,2002025
-3484d38,3c028041
-3484d3c,8c42b120
-3484d40,18400022
-3484d44,3c028041
-3484d48,3c118041
-3484d4c,26319f39
-3484d50,2413000a
-3484d54,9025
-3484d58,3c178011
-3484d5c,36f7a5d0
-3484d60,2442a0a8
-3484d64,afa20038
-3484d68,3c148041
-3484d6c,92220000
-3484d70,30420020
-3484d74,50400010
-3484d78,26520001
-3484d7c,8ee200a4
-3484d80,3c030040
-3484d84,431024
-3484d88,5040000b
+3484c48,24020010
+3484c4c,afa20018
+3484c50,afa20014
+3484c54,afb30010
+3484c58,3c03825
+3484c5c,3025
+3484c60,8fa50038
+3484c64,c101c47
+3484c68,2002025
+3484c6c,26520001
+3484c70,2631000c
+3484c74,8e82b4c0
+3484c78,242102a
+3484c7c,1440ffe4
+3484c80,26730011
+3484c84,24070001
+3484c88,2406000a
+3484c8c,3c058041
+3484c90,24a5a448
+3484c94,c101bdf
+3484c98,2002025
+3484c9c,3c028041
+3484ca0,8c42b4c0
+3484ca4,18400022
+3484ca8,3c028041
+3484cac,3c118041
+3484cb0,2631a299
+3484cb4,2413000a
+3484cb8,9025
+3484cbc,3c178011
+3484cc0,36f7a5d0
+3484cc4,2442a448
+3484cc8,afa20038
+3484ccc,3c148041
+3484cd0,92220000
+3484cd4,30420020
+3484cd8,50400010
+3484cdc,26520001
+3484ce0,8ee200a4
+3484ce4,3c030040
+3484ce8,431024
+3484cec,5040000b
+3484cf0,26520001
+3484cf4,24020010
+3484cf8,afa20018
+3484cfc,afa20014
+3484d00,afb30010
+3484d04,3c03825
+3484d08,3025
+3484d0c,8fa50038
+3484d10,c101c47
+3484d14,2002025
+3484d18,26520001
+3484d1c,2631000c
+3484d20,8e82b4c0
+3484d24,242102a
+3484d28,1440ffe9
+3484d2c,26730011
+3484d30,26de0022
+3484d34,24070001
+3484d38,24060010
+3484d3c,3c058041
+3484d40,24a5a448
+3484d44,c101bdf
+3484d48,2002025
+3484d4c,3c028041
+3484d50,8c42b4c0
+3484d54,18400024
+3484d58,3c118041
+3484d5c,2631a298
+3484d60,2413000a
+3484d64,9025
+3484d68,3c178011
+3484d6c,36f7a5d0
+3484d70,3c028041
+3484d74,2442a448
+3484d78,afa20038
+3484d7c,3c148041
+3484d80,92220001
+3484d84,30420010
+3484d88,50400012
3484d8c,26520001
-3484d90,24020010
-3484d94,afa20018
-3484d98,afa20014
-3484d9c,afb30010
-3484da0,3c03825
-3484da4,3025
-3484da8,8fa50038
-3484dac,c101c0e
-3484db0,2002025
-3484db4,26520001
-3484db8,2631000c
-3484dbc,8e82b120
-3484dc0,242102a
-3484dc4,1440ffe9
-3484dc8,26730011
-3484dcc,26de0022
-3484dd0,24070001
-3484dd4,24060010
-3484dd8,3c058041
-3484ddc,24a5a0a8
-3484de0,c101ba6
-3484de4,2002025
-3484de8,3c028041
-3484dec,8c42b120
-3484df0,18400024
-3484df4,3c118041
-3484df8,26319f38
-3484dfc,2413000a
-3484e00,9025
-3484e04,3c178011
-3484e08,36f7a5d0
-3484e0c,3c028041
-3484e10,2442a0a8
-3484e14,afa20038
-3484e18,3c148041
-3484e1c,92220001
-3484e20,30420010
-3484e24,50400012
-3484e28,26520001
-3484e2c,92220000
-3484e30,2e21021
-3484e34,904200a8
-3484e38,21082
-3484e3c,30420001
-3484e40,5040000b
-3484e44,26520001
-3484e48,24020010
-3484e4c,afa20018
-3484e50,afa20014
-3484e54,afb30010
-3484e58,3c03825
-3484e5c,3025
-3484e60,8fa50038
-3484e64,c101c0e
-3484e68,2002025
-3484e6c,26520001
-3484e70,2631000c
-3484e74,8e82b120
-3484e78,242102a
-3484e7c,1440ffe7
-3484e80,26730011
-3484e84,26c20033
-3484e88,afa20038
-3484e8c,24070001
-3484e90,2406000f
-3484e94,3c058041
-3484e98,24a5a0a8
-3484e9c,c101ba6
-3484ea0,2002025
-3484ea4,3c028041
-3484ea8,8c42b120
-3484eac,18400053
-3484eb0,3c148041
-3484eb4,26949f38
-3484eb8,2808825
-3484ebc,2413000a
-3484ec0,9025
-3484ec4,3c1e8011
-3484ec8,37dea5d0
-3484ecc,3c028041
-3484ed0,2442a0a8
-3484ed4,afa2003c
-3484ed8,3c178041
-3484edc,92220001
-3484ee0,30420010
-3484ee4,50400012
-3484ee8,26520001
-3484eec,92220000
-3484ef0,3c21021
-3484ef4,904200a8
-3484ef8,21042
-3484efc,30420001
-3484f00,5040000b
-3484f04,26520001
-3484f08,24020010
-3484f0c,afa20018
-3484f10,afa20014
-3484f14,afb30010
-3484f18,8fa70038
-3484f1c,3025
-3484f20,8fa5003c
-3484f24,c101c0e
-3484f28,2002025
-3484f2c,26520001
-3484f30,8ee2b120
-3484f34,2631000c
-3484f38,242182a
-3484f3c,1460ffe7
-3484f40,26730011
-3484f44,12a0002d
-3484f4c,1840002b
-3484f50,26d60044
-3484f54,2412000b
-3484f58,8825
-3484f5c,3c1e8041
-3484f60,3c158041
-3484f64,26b5b220
-3484f68,3c138041
-3484f6c,26739e98
-3484f70,3c028041
-3484f74,24429e9c
-3484f78,afa20038
-3484f7c,3c178041
-3484f80,8fc2b1bc
-3484f84,5040000f
-3484f88,92820000
-3484f8c,92820001
-3484f90,30420010
-3484f94,5040000b
-3484f98,92820000
-3484f9c,92830000
-3484fa0,3c028011
-3484fa4,3442a5d0
-3484fa8,431021
-3484fac,904200a8
-3484fb0,21082
-3484fb4,30420001
-3484fb8,5040000b
-3484fbc,26310001
-3484fc0,92820000
-3484fc4,551021
-3484fc8,90420000
-3484fcc,14400002
-3484fd0,2602025
-3484fd4,8fa40038
-3484fd8,2403025
-3484fdc,c102519
-3484fe0,2c02825
-3484fe4,26310001
-3484fe8,2694000c
-3484fec,8ee2b120
-3484ff0,222102a
-3484ff4,1440ffe2
-3484ff8,26520011
-3484ffc,c102543
-3485000,2002025
-3485004,8e020008
-3485008,24430008
-348500c,ae030008
-3485010,3c03e900
-3485014,ac430000
-3485018,ac400004
-348501c,8e020008
-3485020,24430008
-3485024,ae030008
-3485028,3c03df00
-348502c,ac430000
-3485030,10000003
-3485034,ac400004
-3485038,1000fed6
-348503c,26310012
-3485040,8fbf006c
-3485044,8fbe0068
-3485048,8fb70064
-348504c,8fb60060
-3485050,8fb5005c
-3485054,8fb40058
-3485058,8fb30054
-348505c,8fb20050
-3485060,8fb1004c
-3485064,8fb00048
-3485068,3e00008
-348506c,27bd0070
-3485070,3e00008
-3485078,44860000
-348507c,44801000
-3485084,46020032
-348508c,45030011
-3485090,46007006
-3485094,460e603c
-348509c,45000007
-34850a0,460c0000
-34850a4,4600703c
-34850ac,45000009
-34850b4,3e00008
-34850b8,46007006
-34850bc,460e003c
-34850c4,45000003
-34850cc,3e00008
-34850d0,46007006
-34850d4,3e00008
-34850dc,3c02801c
-34850e0,344284a0
-34850e4,c44000d4
-34850e8,3c028041
-34850ec,3e00008
-34850f0,e440b128
-34850f4,27bdffe8
-34850f8,afbf0014
-34850fc,3c028041
-3485100,90429fe0
-3485104,5040001b
-3485108,3c028041
-348510c,3c038011
-3485110,3463a5d0
-3485114,8c630070
-3485118,31f02
-348511c,1062000d
-3485120,21300
-3485124,3c048011
-3485128,3484a5d0
-348512c,94830070
-3485130,30630fff
-3485134,621025
-3485138,a4820070
-348513c,3c04801d
-3485140,3485aa30
-3485144,3c028007
-3485148,34429764
-348514c,40f809
-3485150,248484a0
-3485154,3c028041
-3485158,90439fe0
-348515c,24020001
-3485160,14620004
-3485164,3c028041
-3485168,3c028041
-348516c,a0409fe0
-3485170,3c028041
-3485174,c44e9fd8
-3485178,44800000
-3485180,46007032
-3485188,45010010
-348518c,3c02801c
-3485190,344284a0
-3485194,c44000d4
-3485198,46007032
-34851a0,45010019
-34851a4,3c02801c
-34851a8,3c028041
-34851ac,8c469ea4
+3484d90,92220000
+3484d94,2e21021
+3484d98,904200a8
+3484d9c,21082
+3484da0,30420001
+3484da4,5040000b
+3484da8,26520001
+3484dac,24020010
+3484db0,afa20018
+3484db4,afa20014
+3484db8,afb30010
+3484dbc,3c03825
+3484dc0,3025
+3484dc4,8fa50038
+3484dc8,c101c47
+3484dcc,2002025
+3484dd0,26520001
+3484dd4,2631000c
+3484dd8,8e82b4c0
+3484ddc,242102a
+3484de0,1440ffe7
+3484de4,26730011
+3484de8,26c20033
+3484dec,afa20038
+3484df0,24070001
+3484df4,2406000f
+3484df8,3c058041
+3484dfc,24a5a448
+3484e00,c101bdf
+3484e04,2002025
+3484e08,3c028041
+3484e0c,8c42b4c0
+3484e10,18400053
+3484e14,3c148041
+3484e18,2694a298
+3484e1c,2808825
+3484e20,2413000a
+3484e24,9025
+3484e28,3c1e8011
+3484e2c,37dea5d0
+3484e30,3c028041
+3484e34,2442a448
+3484e38,afa2003c
+3484e3c,3c178041
+3484e40,92220001
+3484e44,30420010
+3484e48,50400012
+3484e4c,26520001
+3484e50,92220000
+3484e54,3c21021
+3484e58,904200a8
+3484e5c,21042
+3484e60,30420001
+3484e64,5040000b
+3484e68,26520001
+3484e6c,24020010
+3484e70,afa20018
+3484e74,afa20014
+3484e78,afb30010
+3484e7c,8fa70038
+3484e80,3025
+3484e84,8fa5003c
+3484e88,c101c47
+3484e8c,2002025
+3484e90,26520001
+3484e94,8ee2b4c0
+3484e98,2631000c
+3484e9c,242182a
+3484ea0,1460ffe7
+3484ea4,26730011
+3484ea8,12a0002d
+3484eb0,1840002b
+3484eb4,26d60044
+3484eb8,2412000b
+3484ebc,8825
+3484ec0,3c1e8041
+3484ec4,3c158041
+3484ec8,26b5b5c8
+3484ecc,3c138041
+3484ed0,2673a1f8
+3484ed4,3c028041
+3484ed8,2442a1fc
+3484edc,afa20038
+3484ee0,3c178041
+3484ee4,8fc2b55c
+3484ee8,5040000f
+3484eec,92820000
+3484ef0,92820001
+3484ef4,30420010
+3484ef8,5040000b
+3484efc,92820000
+3484f00,92830000
+3484f04,3c028011
+3484f08,3442a5d0
+3484f0c,431021
+3484f10,904200a8
+3484f14,21082
+3484f18,30420001
+3484f1c,5040000b
+3484f20,26310001
+3484f24,92820000
+3484f28,551021
+3484f2c,90420000
+3484f30,14400002
+3484f34,2602025
+3484f38,8fa40038
+3484f3c,2403025
+3484f40,c102561
+3484f44,2c02825
+3484f48,26310001
+3484f4c,2694000c
+3484f50,8ee2b4c0
+3484f54,222102a
+3484f58,1440ffe2
+3484f5c,26520011
+3484f60,c10258b
+3484f64,2002025
+3484f68,8e020008
+3484f6c,24430008
+3484f70,ae030008
+3484f74,3c03e900
+3484f78,ac430000
+3484f7c,ac400004
+3484f80,8e020008
+3484f84,24430008
+3484f88,ae030008
+3484f8c,3c03df00
+3484f90,ac430000
+3484f94,10000003
+3484f98,ac400004
+3484f9c,1000fed6
+3484fa0,26310012
+3484fa4,8fbf006c
+3484fa8,8fbe0068
+3484fac,8fb70064
+3484fb0,8fb60060
+3484fb4,8fb5005c
+3484fb8,8fb40058
+3484fbc,8fb30054
+3484fc0,8fb20050
+3484fc4,8fb1004c
+3484fc8,8fb00048
+3484fcc,3e00008
+3484fd0,27bd0070
+3484fd4,3e00008
+3484fdc,44860000
+3484fe0,44801000
+3484fe8,46020032
+3484ff0,45030011
+3484ff4,46007006
+3484ff8,460e603c
+3485000,45000007
+3485004,460c0000
+3485008,4600703c
+3485010,45000009
+3485018,3e00008
+348501c,46007006
+3485020,460e003c
+3485028,45000003
+3485030,3e00008
+3485034,46007006
+3485038,3e00008
+3485040,3c02801c
+3485044,344284a0
+3485048,c44000d4
+348504c,3c028041
+3485050,3e00008
+3485054,e440b4c8
+3485058,27bdffe8
+348505c,afbf0014
+3485060,3c028041
+3485064,9042a340
+3485068,5040001b
+348506c,3c028041
+3485070,3c038011
+3485074,3463a5d0
+3485078,8c630070
+348507c,31f02
+3485080,1062000d
+3485084,21300
+3485088,3c048011
+348508c,3484a5d0
+3485090,94830070
+3485094,30630fff
+3485098,621025
+348509c,a4820070
+34850a0,3c04801d
+34850a4,3485aa30
+34850a8,3c028007
+34850ac,34429764
+34850b0,40f809
+34850b4,248484a0
+34850b8,3c028041
+34850bc,9043a340
+34850c0,24020001
+34850c4,14620004
+34850c8,3c028041
+34850cc,3c028041
+34850d0,a040a340
+34850d4,3c028041
+34850d8,c44ea338
+34850dc,44800000
+34850e4,46007032
+34850ec,45010010
+34850f0,3c02801c
+34850f4,344284a0
+34850f8,c44000d4
+34850fc,46007032
+3485104,45010019
+3485108,3c02801c
+348510c,3c028041
+3485110,8c46a204
+3485114,3c028041
+3485118,c1013f7
+348511c,c44cb4c4
+3485120,3c02801c
+3485124,344284a0
+3485128,1000000f
+348512c,e44000d4
+3485130,344284a0
+3485134,c44c00d4
+3485138,3c028041
+348513c,c44eb4c8
+3485140,460e6032
+3485148,45010008
+348514c,3c02801c
+3485150,3c028041
+3485154,c1013f7
+3485158,8c46a208
+348515c,3c02801c
+3485160,344284a0
+3485164,e44000d4
+3485168,3c02801c
+348516c,344284a0
+3485170,c44000d4
+3485174,3c028041
+3485178,e440b4c4
+348517c,3c028041
+3485180,9042a341
+3485184,24030001
+3485188,1443000f
+348518c,24030002
+3485190,3c02801c
+3485194,344284a0
+3485198,94420322
+348519c,3c038041
+34851a0,24639ff0
+34851a4,431021
+34851a8,90420000
+34851ac,10400018
34851b0,3c028041
-34851b4,c10141e
-34851b8,c44cb124
-34851bc,3c02801c
-34851c0,344284a0
-34851c4,1000000f
-34851c8,e44000d4
-34851cc,344284a0
-34851d0,c44c00d4
-34851d4,3c028041
-34851d8,c44eb128
-34851dc,460e6032
-34851e4,45010008
-34851e8,3c02801c
-34851ec,3c028041
-34851f0,c10141e
-34851f4,8c469ea8
-34851f8,3c02801c
-34851fc,344284a0
-3485200,e44000d4
-3485204,3c02801c
-3485208,344284a0
-348520c,c44000d4
-3485210,3c028041
-3485214,e440b124
-3485218,3c028041
-348521c,90429fe1
-3485220,24030001
-3485224,1443000f
-3485228,24030002
-348522c,3c02801c
-3485230,344284a0
-3485234,94420322
-3485238,3c038041
-348523c,24639c90
-3485240,431021
-3485244,90420000
-3485248,10400018
-348524c,3c028041
-3485250,3c02801c
-3485254,344284a0
-3485258,24030035
-348525c,10000012
-3485260,a4430322
-3485264,14430011
-3485268,3c028041
-348526c,3c02801c
-3485270,344284a0
-3485274,94420322
-3485278,3c038041
-348527c,24639c90
-3485280,431021
-3485284,90420000
-3485288,10400006
-348528c,3c028041
-3485290,3c02801c
-3485294,344284a0
-3485298,2403001f
-348529c,a4430322
-34852a0,3c028041
-34852a4,a0409fe1
-34852a8,3c028041
-34852ac,24429fd4
-34852b0,c4400008
-34852b4,3c038040
-34852b8,e4602760
-34852bc,9044000e
-34852c0,3c038040
-34852c4,a0642cb1
-34852c8,9042000f
-34852cc,50400006
-34852d0,3c028041
-34852d4,2442ffff
-34852d8,3c038041
-34852dc,c101dc6
-34852e0,a0629fe3
-34852e4,3c028041
-34852e8,90429fe4
-34852ec,1040000b
-34852f0,3c028041
-34852f4,3c02801c
-34852f8,344284a0
-34852fc,94430014
-3485300,2404dfff
-3485304,641824
-3485308,a4430014
-348530c,94430020
-3485310,641824
-3485314,a4430020
-3485318,3c028041
-348531c,90429fe5
-3485320,10400016
-3485324,8fbf0014
-3485328,3c02801c
-348532c,344284a0
-3485330,90430016
-3485334,31823
-3485338,a0430016
-348533c,90430017
-3485340,31823
-3485344,a0430017
-3485348,90430022
-348534c,31823
-3485350,a0430022
-3485354,90430023
-3485358,31823
-348535c,a0430023
-3485360,90430028
-3485364,31823
-3485368,a0430028
-348536c,90430029
-3485370,31823
-3485374,a0430029
-3485378,8fbf0014
-348537c,3e00008
-3485380,27bd0018
-3485384,850018
-3485388,1812
-348538c,24620001
-3485390,3042ffff
-3485394,31a02
-3485398,431021
-348539c,21203
-34853a0,3e00008
-34853a4,304200ff
-34853a8,2402ffff
-34853ac,a0820002
-34853b0,a0820001
-34853b4,4a00031
-34853b8,a0820000
-34853bc,a01825
-34853c0,28a503e8
-34853c4,50a00001
-34853c8,240303e7
-34853cc,31c00
-34853d0,31c03
-34853d4,3c026666
-34853d8,24426667
-34853dc,620018
-34853e0,1010
-34853e4,21083
-34853e8,32fc3
-34853ec,451023
-34853f0,22880
-34853f4,a22821
-34853f8,52840
-34853fc,651823
-3485400,21400
-3485404,21403
-3485408,1040001c
-348540c,a0830002
-3485410,3c036666
-3485414,24636667
-3485418,430018
-348541c,1810
-3485420,31883
-3485424,22fc3
-3485428,651823
-348542c,32880
-3485430,a32821
-3485434,52840
-3485438,451023
-348543c,a0820001
-3485440,31400
-3485444,21403
-3485448,1040000c
-348544c,3c036666
-3485450,24636667
-3485454,430018
-3485458,1810
-348545c,31883
-3485460,22fc3
-3485464,651823
-3485468,32880
-348546c,a31821
-3485470,31840
-3485474,431023
-3485478,a0820000
-348547c,3e00008
-3485484,27bdffd0
-3485488,afbf002c
-348548c,afb20028
-3485490,afb10024
-3485494,afb00020
-3485498,808025
-348549c,a08825
-34854a0,afa7003c
-34854a4,8fb20040
-34854a8,c101ba6
-34854ac,24070001
-34854b0,93a7003c
-34854b4,afb20018
-34854b8,afb20014
-34854bc,83a2003d
-34854c0,2442005c
-34854c4,afa20010
-34854c8,24e70037
-34854cc,3025
-34854d0,2202825
-34854d4,c101c0e
-34854d8,2002025
-34854dc,8fbf002c
-34854e0,8fb20028
-34854e4,8fb10024
-34854e8,8fb00020
-34854ec,3e00008
-34854f0,27bd0030
-34854f4,27bdffe0
-34854f8,afbf001c
-34854fc,afb20018
-3485500,afb10014
-3485504,afb00010
-3485508,808025
-348550c,24850074
-3485510,24070001
-3485514,4825
-3485518,3c028041
-348551c,24429d54
-3485520,2408ffe0
-3485524,3c048041
-3485528,24849d9c
-348552c,90430000
-3485530,1031824
-3485534,14600005
-3485538,80a60000
-348553c,90430001
-3485540,30c600ff
-3485544,50660001
-3485548,1274825
-348554c,24420004
-3485550,73840
-3485554,1444fff5
-3485558,24a50001
-348555c,3c028041
-3485560,ac49b230
-3485564,8e1100a4
-3485568,2442b230
-348556c,3223003f
-3485570,a0430004
-3485574,9602009c
-3485578,8203003e
-348557c,10600002
-3485580,3042fffb
-3485584,34420004
-3485588,3c038041
-348558c,a462b236
-3485590,112c02
-3485594,30a5007c
-3485598,26030086
-348559c,2606008a
-34855a0,2407001b
-34855a4,90640000
-34855a8,2482ffec
-34855ac,304200ff
-34855b0,2c42000d
-34855b4,50400004
-34855b8,24630001
-34855bc,54870001
-34855c0,34a50001
-34855c4,24630001
-34855c8,5466fff7
-34855cc,90640000
-34855d0,3c028041
-34855d4,a045b235
-34855d8,9203007b
-34855dc,2462fff9
-34855e0,304200ff
-34855e4,2c420002
-34855e8,14400003
-34855ec,2025
-34855f0,10000002
-34855f4,24030007
+34851b4,3c02801c
+34851b8,344284a0
+34851bc,24030035
+34851c0,10000012
+34851c4,a4430322
+34851c8,14430011
+34851cc,3c028041
+34851d0,3c02801c
+34851d4,344284a0
+34851d8,94420322
+34851dc,3c038041
+34851e0,24639ff0
+34851e4,431021
+34851e8,90420000
+34851ec,10400006
+34851f0,3c028041
+34851f4,3c02801c
+34851f8,344284a0
+34851fc,2403001f
+3485200,a4430322
+3485204,3c028041
+3485208,a040a341
+348520c,3c028041
+3485210,2442a334
+3485214,c4400008
+3485218,3c038040
+348521c,e4602750
+3485220,9044000e
+3485224,3c038040
+3485228,a0642ca1
+348522c,9042000f
+3485230,50400006
+3485234,3c028041
+3485238,2442ffff
+348523c,3c038041
+3485240,c101dff
+3485244,a062a343
+3485248,3c028041
+348524c,9042a344
+3485250,1040000b
+3485254,3c028041
+3485258,3c02801c
+348525c,344284a0
+3485260,94430014
+3485264,2404dfff
+3485268,641824
+348526c,a4430014
+3485270,94430020
+3485274,641824
+3485278,a4430020
+348527c,3c028041
+3485280,9042a345
+3485284,10400016
+3485288,8fbf0014
+348528c,3c02801c
+3485290,344284a0
+3485294,90430016
+3485298,31823
+348529c,a0430016
+34852a0,90430017
+34852a4,31823
+34852a8,a0430017
+34852ac,90430022
+34852b0,31823
+34852b4,a0430022
+34852b8,90430023
+34852bc,31823
+34852c0,a0430023
+34852c4,90430028
+34852c8,31823
+34852cc,a0430028
+34852d0,90430029
+34852d4,31823
+34852d8,a0430029
+34852dc,8fbf0014
+34852e0,3e00008
+34852e4,27bd0018
+34852e8,850018
+34852ec,1812
+34852f0,24620001
+34852f4,3042ffff
+34852f8,31a02
+34852fc,431021
+3485300,21203
+3485304,3e00008
+3485308,304200ff
+348530c,2402ffff
+3485310,a0820002
+3485314,a0820001
+3485318,4a00031
+348531c,a0820000
+3485320,a01825
+3485324,28a503e8
+3485328,50a00001
+348532c,240303e7
+3485330,31c00
+3485334,31c03
+3485338,3c026666
+348533c,24426667
+3485340,620018
+3485344,1010
+3485348,21083
+348534c,32fc3
+3485350,451023
+3485354,22880
+3485358,a22821
+348535c,52840
+3485360,651823
+3485364,21400
+3485368,21403
+348536c,1040001c
+3485370,a0830002
+3485374,3c036666
+3485378,24636667
+348537c,430018
+3485380,1810
+3485384,31883
+3485388,22fc3
+348538c,651823
+3485390,32880
+3485394,a32821
+3485398,52840
+348539c,451023
+34853a0,a0820001
+34853a4,31400
+34853a8,21403
+34853ac,1040000c
+34853b0,3c036666
+34853b4,24636667
+34853b8,430018
+34853bc,1810
+34853c0,31883
+34853c4,22fc3
+34853c8,651823
+34853cc,32880
+34853d0,a31821
+34853d4,31840
+34853d8,431023
+34853dc,a0820000
+34853e0,3e00008
+34853e8,27bdffd0
+34853ec,afbf002c
+34853f0,afb20028
+34853f4,afb10024
+34853f8,afb00020
+34853fc,808025
+3485400,a08825
+3485404,afa7003c
+3485408,8fb20040
+348540c,c101bdf
+3485410,24070001
+3485414,93a7003c
+3485418,afb20018
+348541c,afb20014
+3485420,83a2003d
+3485424,2442005c
+3485428,afa20010
+348542c,24e70037
+3485430,3025
+3485434,2202825
+3485438,c101c47
+348543c,2002025
+3485440,8fbf002c
+3485444,8fb20028
+3485448,8fb10024
+348544c,8fb00020
+3485450,3e00008
+3485454,27bd0030
+3485458,27bdffe0
+348545c,afbf001c
+3485460,afb20018
+3485464,afb10014
+3485468,afb00010
+348546c,808025
+3485470,24850074
+3485474,24070001
+3485478,4825
+348547c,3c028041
+3485480,2442a0b4
+3485484,2408ffe0
+3485488,3c048041
+348548c,2484a0fc
+3485490,90430000
+3485494,1031824
+3485498,14600005
+348549c,80a60000
+34854a0,90430001
+34854a4,30c600ff
+34854a8,50660001
+34854ac,1274825
+34854b0,24420004
+34854b4,73840
+34854b8,1444fff5
+34854bc,24a50001
+34854c0,3c028041
+34854c4,ac49b5d8
+34854c8,8e1100a4
+34854cc,2442b5d8
+34854d0,3223003f
+34854d4,a0430004
+34854d8,9602009c
+34854dc,8203003e
+34854e0,10600002
+34854e4,3042fffb
+34854e8,34420004
+34854ec,3c038041
+34854f0,a462b5de
+34854f4,112c02
+34854f8,30a5007c
+34854fc,26030086
+3485500,2606008a
+3485504,2407001b
+3485508,90640000
+348550c,2482ffec
+3485510,304200ff
+3485514,2c42000d
+3485518,50400004
+348551c,24630001
+3485520,54870001
+3485524,34a50001
+3485528,24630001
+348552c,5466fff7
+3485530,90640000
+3485534,3c028041
+3485538,a045b5dd
+348553c,9203007b
+3485540,2462fff9
+3485544,304200ff
+3485548,2c420002
+348554c,14400003
+3485550,2025
+3485554,10000002
+3485558,24030007
+348555c,24040001
+3485560,3c028041
+3485564,2442b5d8
+3485568,a0440008
+348556c,a0430009
+3485570,9203007d
+3485574,2462fff6
+3485578,304200ff
+348557c,2c420002
+3485580,14400003
+3485584,2025
+3485588,10000002
+348558c,2403000a
+3485590,24040001
+3485594,3c028041
+3485598,2442b5d8
+348559c,a044000a
+34855a0,a043000b
+34855a4,86020ef6
+34855a8,4400016
+34855ac,2403002b
+34855b0,96020ef4
+34855b4,210c2
+34855b8,3042008f
+34855bc,2c430010
+34855c0,10600012
+34855c4,2403002b
+34855c8,50400007
+34855cc,9203008b
+34855d0,3c038041
+34855d4,2463a034
+34855d8,431021
+34855dc,90430000
+34855e0,1000000d
+34855e4,24040001
+34855e8,2462ffdf
+34855ec,304200ff
+34855f0,2c420003
+34855f4,14400008
34855f8,24040001
-34855fc,3c028041
-3485600,2442b230
-3485604,a0440008
-3485608,a0430009
-348560c,9203007d
-3485610,2462fff6
-3485614,304200ff
-3485618,2c420002
-348561c,14400003
-3485620,2025
-3485624,10000002
-3485628,2403000a
-348562c,24040001
-3485630,3c028041
-3485634,2442b230
-3485638,a044000a
-348563c,a043000b
-3485640,86020ef6
-3485644,4400016
-3485648,2403002b
-348564c,96020ef4
-3485650,210c2
-3485654,3042008f
-3485658,2c430010
-348565c,10600012
-3485660,2403002b
-3485664,50400007
-3485668,9203008b
-348566c,3c038041
-3485670,24639cd4
-3485674,431021
-3485678,90430000
-348567c,1000000d
-3485680,24040001
-3485684,2462ffdf
-3485688,304200ff
-348568c,2c420003
-3485690,14400008
-3485694,24040001
-3485698,10000005
-348569c,2403002b
-34856a0,10000004
-34856a4,24040001
-34856a8,10000002
-34856ac,24040001
-34856b0,2025
-34856b4,3c028041
-34856b8,2442b230
-34856bc,a043000d
-34856c0,a044000c
-34856c4,9203008a
-34856c8,2462ffd3
-34856cc,304200ff
-34856d0,2c42000b
-34856d4,14400003
-34856d8,24040001
-34856dc,24030037
+34855fc,10000005
+3485600,2403002b
+3485604,10000004
+3485608,24040001
+348560c,10000002
+3485610,24040001
+3485614,2025
+3485618,3c028041
+348561c,2442b5d8
+3485620,a043000d
+3485624,a044000c
+3485628,9203008a
+348562c,2462ffd3
+3485630,304200ff
+3485634,2c42000b
+3485638,14400003
+348563c,24040001
+3485640,24030037
+3485644,2025
+3485648,3c028041
+348564c,2442b5d8
+3485650,a043000f
+3485654,a044000e
+3485658,9202003c
+348565c,10400005
+3485660,3c028041
+3485664,24030013
+3485668,a043b5e9
+348566c,10000004
+3485670,24030001
+3485674,24030012
+3485678,a043b5e9
+348567c,9203003a
+3485680,3c028041
+3485684,a043b5e8
+3485688,8e0200a0
+348568c,21182
+3485690,30420007
+3485694,10400009
+3485698,2025
+348569c,401825
+34856a0,2c420004
+34856a4,50400001
+34856a8,24030003
+34856ac,2463004f
+34856b0,306300ff
+34856b4,10000002
+34856b8,24040001
+34856bc,24030050
+34856c0,3c028041
+34856c4,2442b5d8
+34856c8,a0440012
+34856cc,a0430013
+34856d0,8e0200a0
+34856d4,21242
+34856d8,30420007
+34856dc,50400009
34856e0,2025
-34856e4,3c028041
-34856e8,2442b230
-34856ec,a043000f
-34856f0,a044000e
-34856f4,9202003c
-34856f8,10400005
-34856fc,3c028041
-3485700,24030013
-3485704,a043b241
-3485708,10000004
-348570c,24030001
-3485710,24030012
-3485714,a043b241
-3485718,9203003a
-348571c,3c028041
-3485720,a043b240
-3485724,8e0200a0
-3485728,21182
-348572c,30420007
-3485730,10400009
-3485734,2025
-3485738,401825
-348573c,2c420004
-3485740,50400001
-3485744,24030003
-3485748,2463004f
-348574c,306300ff
-3485750,10000002
-3485754,24040001
-3485758,24030050
-348575c,3c028041
-3485760,2442b230
-3485764,a0440012
-3485768,a0430013
-348576c,8e0200a0
-3485770,21242
-3485774,30420007
-3485778,50400009
-348577c,2025
-3485780,401825
-3485784,2c420003
-3485788,50400001
-348578c,24030002
-3485790,24630052
-3485794,306300ff
-3485798,10000002
-348579c,24040001
-34857a0,24030053
-34857a4,3c028041
-34857a8,2442b230
-34857ac,a0440014
-34857b0,a0430015
-34857b4,8e0300a0
-34857b8,31b02
-34857bc,30630003
-34857c0,a0430016
-34857c4,86050034
-34857c8,3c048041
-34857cc,c1014ea
-34857d0,2484b24b
-34857d4,3c020080
-34857d8,2221024
-34857dc,10400002
-34857e0,2825
-34857e4,860500d0
-34857e8,3c048041
-34857ec,c1014ea
-34857f0,2484b24e
-34857f4,860508c6
-34857f8,58a00001
-34857fc,2405ffff
-3485800,3c048041
-3485804,c1014ea
-3485808,2484b251
-348580c,3c128041
-3485810,2652b230
-3485814,9202003d
-3485818,a2420017
-348581c,8602002e
-3485820,22fc3
-3485824,30a5000f
-3485828,a22821
-348582c,52903
-3485830,3c048041
-3485834,c1014ea
-3485838,2484b248
-348583c,86050022
-3485840,3c048041
-3485844,c1014ea
-3485848,2484b254
-348584c,118982
-3485850,32310fff
-3485854,a6510028
-3485858,8fbf001c
-348585c,8fb20018
-3485860,8fb10014
-3485864,8fb00010
-3485868,3e00008
-348586c,27bd0020
-3485870,27bdff88
-3485874,afbf0074
-3485878,afbe0070
-348587c,afb7006c
-3485880,afb60068
-3485884,afb50064
-3485888,afb40060
-348588c,afb3005c
-3485890,afb20058
-3485894,afb10054
-3485898,afb00050
-348589c,3c020002
-34858a0,a21021
-34858a4,9443ca42
-34858a8,24020008
-34858ac,14620021
-34858b0,808825
-34858b4,3c020002
-34858b8,a21021
-34858bc,9442ca36
-34858c0,14400006
-34858c4,3c020002
-34858c8,a21021
-34858cc,9444ca2e
-34858d0,24020002
-34858d4,10820009
-34858d8,3c020002
-34858dc,a21021
-34858e0,9442ca30
-34858e4,24040005
-34858e8,50440005
-34858ec,3c020002
-34858f0,24040016
-34858f4,14440010
-34858f8,3c020002
-34858fc,3c020002
-3485900,a21021
-3485904,9443ca38
-3485908,31080
-348590c,431021
-3485910,21980
-3485914,431021
-3485918,21100
-348591c,24420020
-3485920,8ca401d8
-3485924,c10153d
-3485928,822021
-348592c,10000220
-3485930,8fbf0074
-3485934,3c020002
-3485938,a21021
-348593c,9042ca37
-3485940,1440001d
-3485944,2c44009a
-3485948,3c020002
-348594c,a22821
-3485950,90a2ca31
-3485954,34420080
-3485958,2c44009a
-348595c,10800214
-3485960,8fbf0074
-3485964,2c440086
-3485968,14800211
-348596c,2442007a
-3485970,24040001
-3485974,441004
-3485978,3c040008
-348597c,24840014
-3485980,442024
-3485984,1480003b
-3485988,3c040002
-348598c,24840081
-3485990,442024
-3485994,54800030
-3485998,24020008
-348599c,3c030004
-34859a0,24630002
-34859a4,431024
-34859a8,10400202
-34859ac,8fbe0070
-34859b0,10000039
-34859b4,241600c8
-34859b8,108001fd
-34859bc,8fbf0074
-34859c0,2c440086
-34859c4,5080000e
-34859c8,2442007a
-34859cc,24040004
-34859d0,10440028
-34859d4,2c440005
-34859d8,5080001b
-34859dc,24030006
-34859e0,24040002
-34859e4,5044001c
-34859e8,24020008
-34859ec,24030003
-34859f0,1043002d
-34859f4,241600c8
-34859f8,100001ee
-34859fc,8fbe0070
-3485a00,24040001
-3485a04,441004
-3485a08,3c040008
-3485a0c,24840014
-3485a10,442024
-3485a14,14800017
-3485a18,3c040002
-3485a1c,24840081
-3485a20,442024
-3485a24,5480000c
-3485a28,24020008
-3485a2c,3c030004
-3485a30,24630002
-3485a34,431024
-3485a38,104001dd
-3485a3c,8fbf0074
-3485a40,10000017
-3485a44,241600c8
-3485a48,10430017
-3485a4c,241600c8
-3485a50,100001d7
-3485a54,8fbf0074
-3485a58,431023
-3485a5c,21840
-3485a60,431821
-3485a64,318c0
-3485a68,431021
-3485a6c,10000006
-3485a70,305600ff
-3485a74,31040
-3485a78,621021
-3485a7c,210c0
-3485a80,621821
-3485a84,307600ff
-3485a88,12c001c9
-3485a8c,8fbf0074
-3485a90,10000006
-3485a94,8e220008
-3485a98,10000004
-3485a9c,8e220008
-3485aa0,10000002
-3485aa4,8e220008
-3485aa8,8e220008
-3485aac,24430008
-3485ab0,ae230008
-3485ab4,3c03e700
-3485ab8,ac430000
-3485abc,ac400004
-3485ac0,8e220008
-3485ac4,24430008
-3485ac8,ae230008
-3485acc,3c03fc11
-3485ad0,34639623
-3485ad4,ac430000
-3485ad8,3c03ff2f
-3485adc,3463ffff
-3485ae0,ac430004
-3485ae4,2c02825
-3485ae8,c1014e1
-3485aec,24040090
-3485af0,afa20048
-3485af4,afa20044
-3485af8,a025
-3485afc,24030040
-3485b00,3c028041
-3485b04,afa20030
-3485b08,3c028041
-3485b0c,2442b230
-3485b10,afa2004c
-3485b14,3c178041
-3485b18,26f79ed4
-3485b1c,3c158041
-3485b20,26b59e54
-3485b24,8e240008
-3485b28,24820008
-3485b2c,ae220008
-3485b30,3c02fa00
-3485b34,ac820000
-3485b38,31600
-3485b3c,32c00
-3485b40,451025
-3485b44,8fa50044
-3485b48,451025
-3485b4c,31a00
-3485b50,431025
-3485b54,ac820004
-3485b58,8fa20030
-3485b5c,24539dd4
-3485b60,8fbe004c
-3485b64,2670ff80
-3485b68,8fd20000
-3485b6c,92020000
-3485b70,3042001f
-3485b74,50400012
-3485b78,26100004
-3485b7c,32420001
-3485b80,5682000f
-3485b84,26100004
-3485b88,8e020000
-3485b8c,21f42
-3485b90,31880
-3485b94,751821
-3485b98,21602
-3485b9c,3042001f
-3485ba0,afa20010
-3485ba4,96070002
-3485ba8,73c00
-3485bac,92060001
-3485bb0,8c650000
-3485bb4,c101521
-3485bb8,2202025
-3485bbc,26100004
-3485bc0,1613ffea
-3485bc4,129042
-3485bc8,26730080
-3485bcc,16f3ffe5
-3485bd0,27de0004
-3485bd4,2c02825
-3485bd8,c1014e1
-3485bdc,240400ff
-3485be0,afa20044
-3485be4,26940001
-3485be8,24020002
-3485bec,1682ffcd
-3485bf0,240300ff
-3485bf4,8fa50048
-3485bf8,9825
-3485bfc,24030040
-3485c00,3c178041
-3485c04,3c1e8041
-3485c08,3c158041
-3485c0c,26b59e54
-3485c10,2416000c
-3485c14,3c148041
-3485c18,10000002
-3485c1c,2694b246
-3485c20,8fa50044
-3485c24,8e240008
-3485c28,24820008
-3485c2c,ae220008
-3485c30,3c02fa00
-3485c34,ac820000
-3485c38,31600
-3485c3c,33400
-3485c40,461025
-3485c44,451025
-3485c48,31a00
-3485c4c,431025
-3485c50,ac820004
-3485c54,26f29d3c
-3485c58,27d0b238
-3485c5c,92020000
-3485c60,5453000f
-3485c64,26100002
-3485c68,92420000
-3485c6c,21080
-3485c70,551021
-3485c74,afb60010
-3485c78,92430001
-3485c7c,31a00
-3485c80,92470002
-3485c84,e33825
-3485c88,73c00
-3485c8c,92060001
-3485c90,8c450000
-3485c94,c101521
-3485c98,2202025
-3485c9c,26100002
-3485ca0,1614ffee
-3485ca4,26520003
-3485ca8,26730001
-3485cac,327300ff
-3485cb0,24020002
-3485cb4,1662ffda
-3485cb8,240300ff
-3485cbc,3c028041
-3485cc0,9456b258
-3485cc4,24070001
-3485cc8,3025
-3485ccc,3c058041
-3485cd0,24a5a068
-3485cd4,c101ba6
-3485cd8,2202025
-3485cdc,afa00038
-3485ce0,afa00034
-3485ce4,afa00030
-3485ce8,b825
-3485cec,3c108041
-3485cf0,26109d00
-3485cf4,8fa20044
-3485cf8,afa2003c
-3485cfc,3c028041
-3485d00,2442a068
-3485d04,afa20040
-3485d08,3c1e8041
-3485d0c,10000005
-3485d10,27de9d3c
-3485d14,afb50038
-3485d18,afb40034
-3485d1c,afb30030
-3485d20,240b825
-3485d24,92120000
-3485d28,92130001
-3485d2c,92140002
-3485d30,32c20001
-3485d34,1440000e
-3485d38,8fb5003c
-3485d3c,24050040
-3485d40,c1014e1
-3485d44,2402025
-3485d48,409025
-3485d4c,24050040
-3485d50,c1014e1
-3485d54,2602025
-3485d58,409825
-3485d5c,24050040
-3485d60,c1014e1
-3485d64,2802025
-3485d68,40a025
-3485d6c,8fb50048
-3485d70,16570007
-3485d74,8fa20030
-3485d78,14530005
-3485d7c,8fa20034
-3485d80,16820003
-3485d84,8fa20038
-3485d88,5055000e
-3485d8c,92070003
-3485d90,8e230008
-3485d94,24620008
-3485d98,ae220008
-3485d9c,3c02fa00
-3485da0,ac620000
-3485da4,121600
-3485da8,132400
-3485dac,441025
-3485db0,551025
-3485db4,142200
-3485db8,441025
-3485dbc,ac620004
-3485dc0,92070003
-3485dc4,2402000a
-3485dc8,afa20018
-3485dcc,24020006
-3485dd0,afa20014
-3485dd4,82020004
-3485dd8,2442005c
-3485ddc,afa20010
-3485de0,24e70037
-3485de4,3025
-3485de8,8fa50040
-3485dec,c101c0e
-3485df0,2202025
-3485df4,26100005
-3485df8,161effc6
-3485dfc,16b042
-3485e00,3c108041
-3485e04,2610b230
-3485e08,92020016
-3485e0c,8fb50044
-3485e10,2a09025
-3485e14,21840
-3485e18,621821
-3485e1c,3c028041
-3485e20,24429e60
-3485e24,621821
-3485e28,90620000
-3485e2c,21600
-3485e30,90640001
-3485e34,42400
-3485e38,441025
-3485e3c,90630002
-3485e40,31a00
-3485e44,431025
-3485e48,551025
-3485e4c,8e230008
-3485e50,24640008
-3485e54,ae240008
-3485e58,3c13fa00
-3485e5c,ac730000
-3485e60,ac620004
-3485e64,3c028041
-3485e68,24429ce4
-3485e6c,24030010
-3485e70,afa30010
-3485e74,90430005
-3485e78,31a00
-3485e7c,90470006
-3485e80,e33825
-3485e84,73c00
-3485e88,24060001
-3485e8c,3c058041
-3485e90,24a5a058
-3485e94,c101521
+34856e4,401825
+34856e8,2c420003
+34856ec,50400001
+34856f0,24030002
+34856f4,24630052
+34856f8,306300ff
+34856fc,10000002
+3485700,24040001
+3485704,24030053
+3485708,3c028041
+348570c,2442b5d8
+3485710,a0440014
+3485714,a0430015
+3485718,8e0300a0
+348571c,31b02
+3485720,30630003
+3485724,a0430016
+3485728,86050034
+348572c,3c048041
+3485730,c1014c3
+3485734,2484b5f3
+3485738,3c020080
+348573c,2221024
+3485740,10400002
+3485744,2825
+3485748,860500d0
+348574c,3c048041
+3485750,c1014c3
+3485754,2484b5f6
+3485758,860508c6
+348575c,58a00001
+3485760,2405ffff
+3485764,3c048041
+3485768,c1014c3
+348576c,2484b5f9
+3485770,3c128041
+3485774,2652b5d8
+3485778,9202003d
+348577c,a2420017
+3485780,8602002e
+3485784,22fc3
+3485788,30a5000f
+348578c,a22821
+3485790,52903
+3485794,3c048041
+3485798,c1014c3
+348579c,2484b5f0
+34857a0,86050022
+34857a4,3c048041
+34857a8,c1014c3
+34857ac,2484b5fc
+34857b0,118982
+34857b4,32310fff
+34857b8,a6510028
+34857bc,8fbf001c
+34857c0,8fb20018
+34857c4,8fb10014
+34857c8,8fb00010
+34857cc,3e00008
+34857d0,27bd0020
+34857d4,27bdff88
+34857d8,afbf0074
+34857dc,afbe0070
+34857e0,afb7006c
+34857e4,afb60068
+34857e8,afb50064
+34857ec,afb40060
+34857f0,afb3005c
+34857f4,afb20058
+34857f8,afb10054
+34857fc,afb00050
+3485800,3c020002
+3485804,a21021
+3485808,9443ca42
+348580c,24020008
+3485810,14620021
+3485814,808825
+3485818,3c020002
+348581c,a21021
+3485820,9442ca36
+3485824,14400006
+3485828,3c020002
+348582c,a21021
+3485830,9444ca2e
+3485834,24020002
+3485838,10820009
+348583c,3c020002
+3485840,a21021
+3485844,9442ca30
+3485848,24040005
+348584c,50440005
+3485850,3c020002
+3485854,24040016
+3485858,14440010
+348585c,3c020002
+3485860,3c020002
+3485864,a21021
+3485868,9443ca38
+348586c,31080
+3485870,431021
+3485874,21980
+3485878,431021
+348587c,21100
+3485880,24420020
+3485884,8ca401d8
+3485888,c101516
+348588c,822021
+3485890,10000220
+3485894,8fbf0074
+3485898,3c020002
+348589c,a21021
+34858a0,9042ca37
+34858a4,1440001d
+34858a8,2c44009a
+34858ac,3c020002
+34858b0,a22821
+34858b4,90a2ca31
+34858b8,34420080
+34858bc,2c44009a
+34858c0,10800214
+34858c4,8fbf0074
+34858c8,2c440086
+34858cc,14800211
+34858d0,2442007a
+34858d4,24040001
+34858d8,441004
+34858dc,3c040008
+34858e0,24840014
+34858e4,442024
+34858e8,1480003b
+34858ec,3c040002
+34858f0,24840081
+34858f4,442024
+34858f8,54800030
+34858fc,24020008
+3485900,3c030004
+3485904,24630002
+3485908,431024
+348590c,10400202
+3485910,8fbe0070
+3485914,10000039
+3485918,241600c8
+348591c,108001fd
+3485920,8fbf0074
+3485924,2c440086
+3485928,5080000e
+348592c,2442007a
+3485930,24040004
+3485934,10440028
+3485938,2c440005
+348593c,5080001b
+3485940,24030006
+3485944,24040002
+3485948,5044001c
+348594c,24020008
+3485950,24030003
+3485954,1043002d
+3485958,241600c8
+348595c,100001ee
+3485960,8fbe0070
+3485964,24040001
+3485968,441004
+348596c,3c040008
+3485970,24840014
+3485974,442024
+3485978,14800017
+348597c,3c040002
+3485980,24840081
+3485984,442024
+3485988,5480000c
+348598c,24020008
+3485990,3c030004
+3485994,24630002
+3485998,431024
+348599c,104001dd
+34859a0,8fbf0074
+34859a4,10000017
+34859a8,241600c8
+34859ac,10430017
+34859b0,241600c8
+34859b4,100001d7
+34859b8,8fbf0074
+34859bc,431023
+34859c0,21840
+34859c4,431821
+34859c8,318c0
+34859cc,431021
+34859d0,10000006
+34859d4,305600ff
+34859d8,31040
+34859dc,621021
+34859e0,210c0
+34859e4,621821
+34859e8,307600ff
+34859ec,12c001c9
+34859f0,8fbf0074
+34859f4,10000006
+34859f8,8e220008
+34859fc,10000004
+3485a00,8e220008
+3485a04,10000002
+3485a08,8e220008
+3485a0c,8e220008
+3485a10,24430008
+3485a14,ae230008
+3485a18,3c03e700
+3485a1c,ac430000
+3485a20,ac400004
+3485a24,8e220008
+3485a28,24430008
+3485a2c,ae230008
+3485a30,3c03fc11
+3485a34,34639623
+3485a38,ac430000
+3485a3c,3c03ff2f
+3485a40,3463ffff
+3485a44,ac430004
+3485a48,2c02825
+3485a4c,c1014ba
+3485a50,24040090
+3485a54,afa20048
+3485a58,afa20044
+3485a5c,a025
+3485a60,24030040
+3485a64,3c028041
+3485a68,afa20030
+3485a6c,3c028041
+3485a70,2442b5d8
+3485a74,afa2004c
+3485a78,3c178041
+3485a7c,26f7a234
+3485a80,3c158041
+3485a84,26b5a1b4
+3485a88,8e240008
+3485a8c,24820008
+3485a90,ae220008
+3485a94,3c02fa00
+3485a98,ac820000
+3485a9c,31600
+3485aa0,32c00
+3485aa4,451025
+3485aa8,8fa50044
+3485aac,451025
+3485ab0,31a00
+3485ab4,431025
+3485ab8,ac820004
+3485abc,8fa20030
+3485ac0,2453a134
+3485ac4,8fbe004c
+3485ac8,2670ff80
+3485acc,8fd20000
+3485ad0,92020000
+3485ad4,3042001f
+3485ad8,50400012
+3485adc,26100004
+3485ae0,32420001
+3485ae4,5682000f
+3485ae8,26100004
+3485aec,8e020000
+3485af0,21f42
+3485af4,31880
+3485af8,751821
+3485afc,21602
+3485b00,3042001f
+3485b04,afa20010
+3485b08,96070002
+3485b0c,73c00
+3485b10,92060001
+3485b14,8c650000
+3485b18,c1014fa
+3485b1c,2202025
+3485b20,26100004
+3485b24,1613ffea
+3485b28,129042
+3485b2c,26730080
+3485b30,16f3ffe5
+3485b34,27de0004
+3485b38,2c02825
+3485b3c,c1014ba
+3485b40,240400ff
+3485b44,afa20044
+3485b48,26940001
+3485b4c,24020002
+3485b50,1682ffcd
+3485b54,240300ff
+3485b58,8fa50048
+3485b5c,9825
+3485b60,24030040
+3485b64,3c178041
+3485b68,3c1e8041
+3485b6c,3c158041
+3485b70,26b5a1b4
+3485b74,2416000c
+3485b78,3c148041
+3485b7c,10000002
+3485b80,2694b5ee
+3485b84,8fa50044
+3485b88,8e240008
+3485b8c,24820008
+3485b90,ae220008
+3485b94,3c02fa00
+3485b98,ac820000
+3485b9c,31600
+3485ba0,33400
+3485ba4,461025
+3485ba8,451025
+3485bac,31a00
+3485bb0,431025
+3485bb4,ac820004
+3485bb8,26f2a09c
+3485bbc,27d0b5e0
+3485bc0,92020000
+3485bc4,5453000f
+3485bc8,26100002
+3485bcc,92420000
+3485bd0,21080
+3485bd4,551021
+3485bd8,afb60010
+3485bdc,92430001
+3485be0,31a00
+3485be4,92470002
+3485be8,e33825
+3485bec,73c00
+3485bf0,92060001
+3485bf4,8c450000
+3485bf8,c1014fa
+3485bfc,2202025
+3485c00,26100002
+3485c04,1614ffee
+3485c08,26520003
+3485c0c,26730001
+3485c10,327300ff
+3485c14,24020002
+3485c18,1662ffda
+3485c1c,240300ff
+3485c20,3c028041
+3485c24,9456b600
+3485c28,24070001
+3485c2c,3025
+3485c30,3c058041
+3485c34,24a5a408
+3485c38,c101bdf
+3485c3c,2202025
+3485c40,afa00038
+3485c44,afa00034
+3485c48,afa00030
+3485c4c,b825
+3485c50,3c108041
+3485c54,2610a060
+3485c58,8fa20044
+3485c5c,afa2003c
+3485c60,3c028041
+3485c64,2442a408
+3485c68,afa20040
+3485c6c,3c1e8041
+3485c70,10000005
+3485c74,27dea09c
+3485c78,afb50038
+3485c7c,afb40034
+3485c80,afb30030
+3485c84,240b825
+3485c88,92120000
+3485c8c,92130001
+3485c90,92140002
+3485c94,32c20001
+3485c98,1440000e
+3485c9c,8fb5003c
+3485ca0,24050040
+3485ca4,c1014ba
+3485ca8,2402025
+3485cac,409025
+3485cb0,24050040
+3485cb4,c1014ba
+3485cb8,2602025
+3485cbc,409825
+3485cc0,24050040
+3485cc4,c1014ba
+3485cc8,2802025
+3485ccc,40a025
+3485cd0,8fb50048
+3485cd4,16570007
+3485cd8,8fa20030
+3485cdc,14530005
+3485ce0,8fa20034
+3485ce4,16820003
+3485ce8,8fa20038
+3485cec,5055000e
+3485cf0,92070003
+3485cf4,8e230008
+3485cf8,24620008
+3485cfc,ae220008
+3485d00,3c02fa00
+3485d04,ac620000
+3485d08,121600
+3485d0c,132400
+3485d10,441025
+3485d14,551025
+3485d18,142200
+3485d1c,441025
+3485d20,ac620004
+3485d24,92070003
+3485d28,2402000a
+3485d2c,afa20018
+3485d30,24020006
+3485d34,afa20014
+3485d38,82020004
+3485d3c,2442005c
+3485d40,afa20010
+3485d44,24e70037
+3485d48,3025
+3485d4c,8fa50040
+3485d50,c101c47
+3485d54,2202025
+3485d58,26100005
+3485d5c,161effc6
+3485d60,16b042
+3485d64,3c108041
+3485d68,2610b5d8
+3485d6c,92020016
+3485d70,8fb50044
+3485d74,2a09025
+3485d78,21840
+3485d7c,621821
+3485d80,3c028041
+3485d84,2442a1c0
+3485d88,621821
+3485d8c,90620000
+3485d90,21600
+3485d94,90640001
+3485d98,42400
+3485d9c,441025
+3485da0,90630002
+3485da4,31a00
+3485da8,431025
+3485dac,551025
+3485db0,8e230008
+3485db4,24640008
+3485db8,ae240008
+3485dbc,3c13fa00
+3485dc0,ac730000
+3485dc4,ac620004
+3485dc8,3c028041
+3485dcc,2442a044
+3485dd0,24030010
+3485dd4,afa30010
+3485dd8,90430005
+3485ddc,31a00
+3485de0,90470006
+3485de4,e33825
+3485de8,73c00
+3485dec,24060001
+3485df0,3c058041
+3485df4,24a5a3f8
+3485df8,c1014fa
+3485dfc,2202025
+3485e00,2414ff00
+3485e04,2b4a025
+3485e08,8e220008
+3485e0c,24430008
+3485e10,ae230008
+3485e14,ac530000
+3485e18,ac540004
+3485e1c,24070001
+3485e20,2406000c
+3485e24,3c058041
+3485e28,24a5a448
+3485e2c,c101bdf
+3485e30,2202025
+3485e34,92020017
+3485e38,1440000e
+3485e3c,24100010
+3485e40,24020010
+3485e44,afa20018
+3485e48,afa20014
+3485e4c,2402005c
+3485e50,afa20010
+3485e54,2407003c
+3485e58,3025
+3485e5c,3c058041
+3485e60,24a5a448
+3485e64,c101c47
+3485e68,2202025
+3485e6c,10000014
+3485e70,3c028041
+3485e74,afb00018
+3485e78,afb00014
+3485e7c,2415005c
+3485e80,afb50010
+3485e84,2407003a
+3485e88,3025
+3485e8c,3c138041
+3485e90,2665a448
+3485e94,c101c47
3485e98,2202025
-3485e9c,2414ff00
-3485ea0,2b4a025
-3485ea4,8e220008
-3485ea8,24430008
-3485eac,ae230008
-3485eb0,ac530000
-3485eb4,ac540004
-3485eb8,24070001
-3485ebc,2406000c
-3485ec0,3c058041
-3485ec4,24a5a0a8
-3485ec8,c101ba6
-3485ecc,2202025
-3485ed0,92020017
-3485ed4,1440000e
-3485ed8,24100010
-3485edc,24020010
-3485ee0,afa20018
-3485ee4,afa20014
-3485ee8,2402005c
-3485eec,afa20010
-3485ef0,2407003c
-3485ef4,3025
-3485ef8,3c058041
-3485efc,24a5a0a8
-3485f00,c101c0e
-3485f04,2202025
-3485f08,10000014
-3485f0c,3c028041
-3485f10,afb00018
-3485f14,afb00014
-3485f18,2415005c
-3485f1c,afb50010
-3485f20,2407003a
+3485e9c,afb00018
+3485ea0,afb00014
+3485ea4,afb50010
+3485ea8,2407003e
+3485eac,3025
+3485eb0,2665a448
+3485eb4,c101c47
+3485eb8,2202025
+3485ebc,3c028041
+3485ec0,9042b5fe
+3485ec4,2c42000a
+3485ec8,1040000b
+3485ecc,24070001
+3485ed0,2402000a
+3485ed4,afa20010
+3485ed8,3c028041
+3485edc,8c47a058
+3485ee0,24060001
+3485ee4,3c058041
+3485ee8,24a5a3d8
+3485eec,c1014fa
+3485ef0,2202025
+3485ef4,24070001
+3485ef8,2406000b
+3485efc,3c108041
+3485f00,2605a448
+3485f04,c101bdf
+3485f08,2202025
+3485f0c,24020010
+3485f10,afa20018
+3485f14,afa20014
+3485f18,24020086
+3485f1c,afa20010
+3485f20,2407003c
3485f24,3025
-3485f28,3c138041
-3485f2c,2665a0a8
-3485f30,c101c0e
-3485f34,2202025
-3485f38,afb00018
-3485f3c,afb00014
-3485f40,afb50010
-3485f44,2407003e
-3485f48,3025
-3485f4c,2665a0a8
-3485f50,c101c0e
-3485f54,2202025
-3485f58,3c028041
-3485f5c,9042b256
-3485f60,2c42000a
-3485f64,1040000b
-3485f68,24070001
-3485f6c,2402000a
-3485f70,afa20010
-3485f74,3c028041
-3485f78,8c479cf8
-3485f7c,24060001
-3485f80,3c058041
-3485f84,24a5a038
-3485f88,c101521
-3485f8c,2202025
-3485f90,24070001
-3485f94,2406000b
-3485f98,3c108041
-3485f9c,2605a0a8
-3485fa0,c101ba6
-3485fa4,2202025
-3485fa8,24020010
-3485fac,afa20018
-3485fb0,afa20014
-3485fb4,24020086
-3485fb8,afa20010
-3485fbc,2407003c
-3485fc0,3025
-3485fc4,2605a0a8
-3485fc8,c101c0e
-3485fcc,2202025
-3485fd0,3c028041
-3485fd4,9042b253
-3485fd8,2c42000a
-3485fdc,1040001d
-3485fe0,8e220008
-3485fe4,24430008
-3485fe8,ae230008
-3485fec,3c03fa00
-3485ff0,ac430000
-3485ff4,3c03f4ec
-3485ff8,24633000
-3485ffc,2439025
-3486000,ac520004
-3486004,3c038041
-3486008,9062b1c4
-348600c,24440001
-3486010,a064b1c4
-3486014,3c038041
-3486018,24639ce4
-348601c,21082
-3486020,24040010
-3486024,afa40010
-3486028,9064000f
-348602c,42200
-3486030,90670010
-3486034,e43825
-3486038,73c00
-348603c,3046000f
-3486040,3c058041
-3486044,24a5a078
-3486048,c101521
-348604c,2202025
-3486050,8e220008
-3486054,24430008
-3486058,ae230008
-348605c,3c03fa00
-3486060,ac430000
-3486064,ac540004
-3486068,2407000a
-348606c,3025
-3486070,3c058041
-3486074,24a5a048
-3486078,c101ba6
-348607c,2202025
-3486080,8fa2004c
-3486084,2453001b
-3486088,3c168041
-348608c,26d6b248
-3486090,3c148041
-3486094,26949ce4
-3486098,26820019
-348609c,afa20034
-34860a0,24170001
-34860a4,241e0008
-34860a8,3c028041
-34860ac,2442a048
-34860b0,afa20038
-34860b4,afa00020
-34860b8,afa00024
-34860bc,afa00028
-34860c0,afa0002c
-34860c4,27b20020
-34860c8,2401825
-34860cc,2c02025
-34860d0,90820000
-34860d4,54570006
-34860d8,2c42000a
-34860dc,8c620000
-34860e0,2442ffff
-34860e4,ac620000
-34860e8,10000003
-34860ec,24020005
-34860f0,21023
-34860f4,30420006
-34860f8,8c650000
-34860fc,a21021
-3486100,ac620004
-3486104,24840001
-3486108,1493fff1
-348610c,24630004
-3486110,92950000
-3486114,26b50037
-3486118,82820002
-348611c,2a2a821
-3486120,92820004
-3486124,10400006
-3486128,2801825
-348612c,8fa4002c
-3486130,417c2
-3486134,441021
-3486138,21043
-348613c,2a2a823
-3486140,80620001
-3486144,2442005c
-3486148,80630003
-348614c,431021
-3486150,afa20030
-3486154,2c08025
-3486158,92060000
-348615c,2cc2000a
-3486160,5040000b
-3486164,26100001
-3486168,8e470000
-348616c,afbe0018
-3486170,afbe0014
-3486174,8fa20030
-3486178,afa20010
-348617c,2a73821
-3486180,8fa50038
-3486184,c101c0e
-3486188,2202025
-348618c,26100001
-3486190,1613fff1
-3486194,26520004
-3486198,26730003
-348619c,26940005
-34861a0,8fa20034
-34861a4,1454ffc3
-34861a8,26d60003
-34861ac,8fbf0074
-34861b0,8fbe0070
-34861b4,8fb7006c
-34861b8,8fb60068
-34861bc,8fb50064
-34861c0,8fb40060
-34861c4,8fb3005c
-34861c8,8fb20058
-34861cc,8fb10054
-34861d0,8fb00050
-34861d4,3e00008
-34861d8,27bd0078
-34861dc,27bdffa0
-34861e0,afbf005c
-34861e4,afbe0058
-34861e8,afb70054
-34861ec,afb60050
-34861f0,afb5004c
-34861f4,afb40048
-34861f8,afb30044
-34861fc,afb20040
-3486200,afb1003c
-3486204,afb00038
-3486208,afa40060
-348620c,afa50064
-3486210,3c02801c
-3486214,344284a0
-3486218,8c500000
-348621c,261402b8
-3486220,8e0202c0
-3486224,24430008
-3486228,ae0302c0
-348622c,3c03de00
-3486230,ac430000
-3486234,3c038041
-3486238,2463a0e8
-348623c,ac430004
-3486240,8e0202c0
-3486244,24430008
-3486248,ae0302c0
-348624c,3c03e700
-3486250,ac430000
-3486254,ac400004
-3486258,8e0202c0
-348625c,24430008
-3486260,ae0302c0
-3486264,3c03fc11
-3486268,34639623
-348626c,ac430000
-3486270,3c03ff2f
-3486274,3463ffff
-3486278,ac430004
-348627c,8e0202c0
-3486280,24430008
-3486284,ae0302c0
-3486288,3c03fa00
-348628c,ac430000
-3486290,2403ffff
-3486294,ac430004
-3486298,3c028041
-348629c,8c52b1c8
-34862a0,24110054
-34862a4,3c178041
-34862a8,26f79fe8
-34862ac,3c168041
-34862b0,26d6b12c
-34862b4,24150018
-34862b8,241e000c
-34862bc,3242001f
-34862c0,21040
-34862c4,129143
-34862c8,571021
-34862cc,90430000
-34862d0,31880
-34862d4,761821
-34862d8,8c730000
-34862dc,24070001
-34862e0,90460001
-34862e4,2602825
-34862e8,c101ba6
-34862ec,2802025
-34862f0,afb50018
-34862f4,afb50014
-34862f8,afbe0010
-34862fc,2203825
-3486300,3025
-3486304,2602825
-3486308,c101c0e
-348630c,2802025
-3486310,26310020
-3486314,240200f4
-3486318,1622ffe9
-348631c,3242001f
-3486320,8fa50064
-3486324,c10161c
-3486328,2802025
-348632c,8e0202c0
-3486330,24430008
-3486334,ae0302c0
-3486338,3c03e700
-348633c,ac430000
-3486340,ac400004
-3486344,8e0202c0
-3486348,24430008
-348634c,ae0302c0
-3486350,3c03fcff
-3486354,3463ffff
-3486358,ac430000
-348635c,3c03fffd
-3486360,3463f6fb
-3486364,ac430004
-3486368,8e0202c0
-348636c,24430008
-3486370,ae0302c0
-3486374,3c03fa00
-3486378,ac430000
-348637c,93a30063
-3486380,ac430004
-3486384,3c02e450
-3486388,244203c0
-348638c,afa20020
-3486390,afa00024
-3486394,3c02e100
-3486398,afa20028
-348639c,afa0002c
-34863a0,3c02f100
-34863a4,afa20030
-34863a8,3c020400
-34863ac,24420400
-34863b0,afa20034
-34863b4,27a20020
-34863b8,27a60038
-34863bc,8e0302c0
-34863c0,24640008
-34863c4,ae0402c0
-34863c8,8c450004
-34863cc,8c440000
-34863d0,ac650004
-34863d4,24420008
-34863d8,14c2fff8
-34863dc,ac640000
-34863e0,8fbf005c
-34863e4,8fbe0058
-34863e8,8fb70054
-34863ec,8fb60050
-34863f0,8fb5004c
-34863f4,8fb40048
-34863f8,8fb30044
-34863fc,8fb20040
-3486400,8fb1003c
-3486404,8fb00038
+3485f28,2605a448
+3485f2c,c101c47
+3485f30,2202025
+3485f34,3c028041
+3485f38,9042b5fb
+3485f3c,2c42000a
+3485f40,1040001d
+3485f44,8e220008
+3485f48,24430008
+3485f4c,ae230008
+3485f50,3c03fa00
+3485f54,ac430000
+3485f58,3c03f4ec
+3485f5c,24633000
+3485f60,2439025
+3485f64,ac520004
+3485f68,3c038041
+3485f6c,9062b564
+3485f70,24440001
+3485f74,a064b564
+3485f78,3c038041
+3485f7c,2463a044
+3485f80,21082
+3485f84,24040010
+3485f88,afa40010
+3485f8c,9064000f
+3485f90,42200
+3485f94,90670010
+3485f98,e43825
+3485f9c,73c00
+3485fa0,3046000f
+3485fa4,3c058041
+3485fa8,24a5a418
+3485fac,c1014fa
+3485fb0,2202025
+3485fb4,8e220008
+3485fb8,24430008
+3485fbc,ae230008
+3485fc0,3c03fa00
+3485fc4,ac430000
+3485fc8,ac540004
+3485fcc,2407000a
+3485fd0,3025
+3485fd4,3c058041
+3485fd8,24a5a3e8
+3485fdc,c101bdf
+3485fe0,2202025
+3485fe4,8fa2004c
+3485fe8,2453001b
+3485fec,3c168041
+3485ff0,26d6b5f0
+3485ff4,3c148041
+3485ff8,2694a044
+3485ffc,26820019
+3486000,afa20034
+3486004,24170001
+3486008,241e0008
+348600c,3c028041
+3486010,2442a3e8
+3486014,afa20038
+3486018,afa00020
+348601c,afa00024
+3486020,afa00028
+3486024,afa0002c
+3486028,27b20020
+348602c,2401825
+3486030,2c02025
+3486034,90820000
+3486038,54570006
+348603c,2c42000a
+3486040,8c620000
+3486044,2442ffff
+3486048,ac620000
+348604c,10000003
+3486050,24020005
+3486054,21023
+3486058,30420006
+348605c,8c650000
+3486060,a21021
+3486064,ac620004
+3486068,24840001
+348606c,1493fff1
+3486070,24630004
+3486074,92950000
+3486078,26b50037
+348607c,82820002
+3486080,2a2a821
+3486084,92820004
+3486088,10400006
+348608c,2801825
+3486090,8fa4002c
+3486094,417c2
+3486098,441021
+348609c,21043
+34860a0,2a2a823
+34860a4,80620001
+34860a8,2442005c
+34860ac,80630003
+34860b0,431021
+34860b4,afa20030
+34860b8,2c08025
+34860bc,92060000
+34860c0,2cc2000a
+34860c4,5040000b
+34860c8,26100001
+34860cc,8e470000
+34860d0,afbe0018
+34860d4,afbe0014
+34860d8,8fa20030
+34860dc,afa20010
+34860e0,2a73821
+34860e4,8fa50038
+34860e8,c101c47
+34860ec,2202025
+34860f0,26100001
+34860f4,1613fff1
+34860f8,26520004
+34860fc,26730003
+3486100,26940005
+3486104,8fa20034
+3486108,1454ffc3
+348610c,26d60003
+3486110,8fbf0074
+3486114,8fbe0070
+3486118,8fb7006c
+348611c,8fb60068
+3486120,8fb50064
+3486124,8fb40060
+3486128,8fb3005c
+348612c,8fb20058
+3486130,8fb10054
+3486134,8fb00050
+3486138,3e00008
+348613c,27bd0078
+3486140,27bdffa0
+3486144,afbf005c
+3486148,afbe0058
+348614c,afb70054
+3486150,afb60050
+3486154,afb5004c
+3486158,afb40048
+348615c,afb30044
+3486160,afb20040
+3486164,afb1003c
+3486168,afb00038
+348616c,afa40060
+3486170,afa50064
+3486174,3c02801c
+3486178,344284a0
+348617c,8c500000
+3486180,261402b8
+3486184,8e0202c0
+3486188,24430008
+348618c,ae0302c0
+3486190,3c03de00
+3486194,ac430000
+3486198,3c038041
+348619c,2463a488
+34861a0,ac430004
+34861a4,8e0202c0
+34861a8,24430008
+34861ac,ae0302c0
+34861b0,3c03e700
+34861b4,ac430000
+34861b8,ac400004
+34861bc,8e0202c0
+34861c0,24430008
+34861c4,ae0302c0
+34861c8,3c03fc11
+34861cc,34639623
+34861d0,ac430000
+34861d4,3c03ff2f
+34861d8,3463ffff
+34861dc,ac430004
+34861e0,8e0202c0
+34861e4,24430008
+34861e8,ae0302c0
+34861ec,3c03fa00
+34861f0,ac430000
+34861f4,2403ffff
+34861f8,ac430004
+34861fc,3c028041
+3486200,8c52b568
+3486204,24110054
+3486208,3c178041
+348620c,26f7a348
+3486210,3c168041
+3486214,26d6b4cc
+3486218,24150018
+348621c,241e000c
+3486220,3242001f
+3486224,21040
+3486228,129143
+348622c,571021
+3486230,90430000
+3486234,31880
+3486238,761821
+348623c,8c730000
+3486240,24070001
+3486244,90460001
+3486248,2602825
+348624c,c101bdf
+3486250,2802025
+3486254,afb50018
+3486258,afb50014
+348625c,afbe0010
+3486260,2203825
+3486264,3025
+3486268,2602825
+348626c,c101c47
+3486270,2802025
+3486274,26310020
+3486278,240200f4
+348627c,1622ffe9
+3486280,3242001f
+3486284,8fa50064
+3486288,c1015f5
+348628c,2802025
+3486290,8e0202c0
+3486294,24430008
+3486298,ae0302c0
+348629c,3c03e700
+34862a0,ac430000
+34862a4,ac400004
+34862a8,8e0202c0
+34862ac,24430008
+34862b0,ae0302c0
+34862b4,3c03fcff
+34862b8,3463ffff
+34862bc,ac430000
+34862c0,3c03fffd
+34862c4,3463f6fb
+34862c8,ac430004
+34862cc,8e0202c0
+34862d0,24430008
+34862d4,ae0302c0
+34862d8,3c03fa00
+34862dc,ac430000
+34862e0,93a30063
+34862e4,ac430004
+34862e8,3c02e450
+34862ec,244203c0
+34862f0,afa20020
+34862f4,afa00024
+34862f8,3c02e100
+34862fc,afa20028
+3486300,afa0002c
+3486304,3c02f100
+3486308,afa20030
+348630c,3c020400
+3486310,24420400
+3486314,afa20034
+3486318,27a20020
+348631c,27a60038
+3486320,8e0302c0
+3486324,24640008
+3486328,ae0402c0
+348632c,8c450004
+3486330,8c440000
+3486334,ac650004
+3486338,24420008
+348633c,14c2fff8
+3486340,ac640000
+3486344,8fbf005c
+3486348,8fbe0058
+348634c,8fb70054
+3486350,8fb60050
+3486354,8fb5004c
+3486358,8fb40048
+348635c,8fb30044
+3486360,8fb20040
+3486364,8fb1003c
+3486368,8fb00038
+348636c,3e00008
+3486370,27bd0060
+3486374,3c028041
+3486378,9042b56c
+348637c,1040000d
+3486380,3c028011
+3486384,3442a5d0
+3486388,8c430000
+348638c,24020517
+3486390,14620008
+3486398,27bdffe8
+348639c,afbf0014
+34863a0,c10253a
+34863a8,8fbf0014
+34863ac,3e00008
+34863b0,27bd0018
+34863b4,3e00008
+34863bc,14800003
+34863c0,3c028041
+34863c4,3e00008
+34863c8,8c42a388
+34863cc,27bdffe8
+34863d0,afbf0014
+34863d4,afb00010
+34863d8,808025
+34863dc,c1018ef
+34863e0,42102
+34863e4,3210000f
+34863e8,108080
+34863ec,3c038041
+34863f0,2463a388
+34863f4,2038021
+34863f8,8e030000
+34863fc,431021
+3486400,8fbf0014
+3486404,8fb00010
3486408,3e00008
-348640c,27bd0060
-3486410,3c028040
-3486414,90420cdd
-3486418,10400002
-348641c,3c02800f
-3486420,a0401640
-3486424,3e00008
-348642c,3c028041
-3486430,9042b1cc
-3486434,1040000d
-3486438,3c028011
-348643c,3442a5d0
-3486440,8c430000
-3486444,24020517
-3486448,14620008
-3486450,27bdffe8
-3486454,afbf0014
-3486458,c1024f2
-3486460,8fbf0014
-3486464,3e00008
-3486468,27bd0018
-348646c,3e00008
-3486474,27bdffe8
-3486478,afbf0014
-348647c,3c028041
-3486480,8c42b1fc
-3486484,218c0
-3486488,3c048041
-348648c,2484b274
-3486490,641821
-3486494,8c630000
-3486498,1060000c
-348649c,24420001
-34864a0,220c0
-34864a4,3c038041
-34864a8,2463b274
-34864ac,641821
-34864b0,402825
-34864b4,8c640000
-34864b8,24420001
-34864bc,1480fffc
-34864c0,24630008
-34864c4,3c028041
-34864c8,ac45b1fc
-34864cc,c1026fa
-34864d0,2404013c
-34864d4,3c038041
-34864d8,ac62b1f8
-34864dc,24030001
-34864e0,ac430130
-34864e4,8fbf0014
-34864e8,3e00008
-34864ec,27bd0018
-34864f0,801025
-34864f4,84a30000
-34864f8,2404000a
-34864fc,14640012
-3486500,24040015
-3486504,24030010
-3486508,14c30008
-348650c,94a3001c
-3486510,31942
-3486514,3063007f
-3486518,24040075
-348651c,54640003
-3486520,94a3001c
-3486524,3e00008
-3486528,ac400000
-348652c,3063001f
-3486530,a0400000
-3486534,a0460001
-3486538,24040001
-348653c,a0440002
-3486540,3e00008
-3486544,a0430003
-3486548,14640010
-348654c,2404019c
-3486550,90a3001d
-3486554,24040006
-3486558,10640005
-348655c,24040011
-3486560,50640004
-3486564,90a30141
-3486568,3e00008
-348656c,ac400000
-3486570,90a30141
-3486574,a0400000
-3486578,a0460001
-348657c,24040002
-3486580,a0440002
-3486584,3e00008
-3486588,a0430003
-348658c,1464000a
-3486590,2404003e
-3486594,94a4001c
-3486598,a0400000
-348659c,41a02
-34865a0,3063001f
-34865a4,a0430001
-34865a8,24030003
-34865ac,a0430002
-34865b0,3e00008
-34865b4,a0440003
-34865b8,54c4000d
-34865bc,a4400000
-34865c0,2404011a
-34865c4,5464000a
-34865c8,a4400000
-34865cc,3c038011
-34865d0,3463a5d0
-34865d4,90631397
-34865d8,a0400000
-34865dc,a0430001
-34865e0,24030004
-34865e4,a0430002
-34865e8,3e00008
-34865ec,a0470003
-34865f0,a0400002
-34865f4,a0460001
-34865f8,3e00008
-34865fc,a0470003
-3486600,3c038041
-3486604,8c67b1fc
-3486608,24e7ffff
-348660c,4e00021
-3486610,801025
-3486614,27bdfff8
-3486618,4825
-348661c,3c0a8041
-3486620,254ab274
-3486624,1273021
-3486628,61fc2
-348662c,661821
-3486630,31843
-3486634,330c0
-3486638,ca3021
-348663c,8cc80000
-3486640,8cc60004
-3486644,afa60004
-3486648,a8302b
-348664c,10c00003
-3486650,105302b
-3486654,10000008
-3486658,2467ffff
-348665c,50c00003
-3486660,ac480000
-3486664,10000004
-3486668,24690001
-348666c,8fa30004
-3486670,10000006
-3486674,ac430004
-3486678,e9182a
-348667c,1060ffea
-3486680,1273021
-3486684,ac400000
-3486688,ac400004
-348668c,3e00008
-3486690,27bd0008
-3486694,ac800000
-3486698,3e00008
-348669c,ac800004
-34866a0,27bdffe0
-34866a4,afbf001c
-34866a8,afb00018
-34866ac,808025
-34866b0,c10193c
-34866b4,27a40010
-34866b8,8fa50010
-34866bc,14a00004
-34866c4,ae000000
-34866c8,10000003
-34866cc,ae000004
-34866d0,c101980
-34866d4,2002025
-34866d8,2001025
-34866dc,8fbf001c
-34866e0,8fb00018
-34866e4,3e00008
-34866e8,27bd0020
-34866ec,27bdffe8
-34866f0,afbf0014
-34866f4,afb00010
-34866f8,afa40018
-34866fc,58202
-3486700,afa5001c
-3486704,321000ff
-3486708,c101eb2
-348670c,52402
-3486710,c101ea3
-3486714,402025
-3486718,3c038041
-348671c,8fa40018
-3486720,ac64b1f0
-3486724,2463b1f0
-3486728,8fa4001c
-348672c,ac640004
-3486730,10202b
-3486734,3c038041
-3486738,ac64b1ec
-348673c,3c038041
-3486740,ac62b1e8
-3486744,90440001
-3486748,3c038041
-348674c,ac64b1e4
-3486750,94440002
-3486754,3c038041
-3486758,ac64b1e0
-348675c,94440004
-3486760,3c038041
-3486764,ac64b1dc
-3486768,80440006
-348676c,3c038041
-3486770,ac64b1d8
-3486774,90420007
-3486778,30420001
-348677c,3c038041
-3486780,16000003
-3486784,ac62b1d4
-3486788,3c028040
-348678c,90500024
-3486790,3c028040
-3486794,a0500025
-3486798,8fbf0014
-348679c,8fb00010
-34867a0,3e00008
-34867a4,27bd0018
-34867a8,3c028041
-34867ac,ac40b1f0
-34867b0,2442b1f0
-34867b4,ac400004
-34867b8,3c028041
-34867bc,ac40b1ec
-34867c0,3c028041
-34867c4,ac40b1e8
-34867c8,3c028041
-34867cc,ac40b1e4
-34867d0,3c028041
-34867d4,ac40b1e0
-34867d8,3c028041
-34867dc,ac40b1dc
-34867e0,3c028041
-34867e4,ac40b1d8
-34867e8,3c028041
-34867ec,3e00008
-34867f0,ac40b1d4
-34867f4,8c830000
-34867f8,3c028040
-34867fc,ac43002c
-3486800,94830004
-3486804,3c028040
-3486808,a4430030
-348680c,90830006
-3486810,3c028040
-3486814,3e00008
-3486818,a4430032
-348681c,afa40000
-3486820,afa50004
-3486824,3c028041
-3486828,2442b25c
-348682c,1825
-3486830,24060003
-3486834,8c450000
-3486838,14a0000a
-3486840,318c0
-3486844,3c028041
-3486848,2442b25c
-348684c,621821
-3486850,8fa20000
-3486854,ac620000
-3486858,8fa20004
-348685c,3e00008
-3486860,ac620004
-3486864,10a40003
-3486868,24630001
-348686c,1466fff1
-3486870,24420008
-3486874,3e00008
-348687c,3c028040
-3486880,94420028
-3486884,10400013
-3486888,2403ffff
-348688c,27bdffe0
-3486890,afbf001c
-3486894,afa00010
-3486898,afa00014
-348689c,a3a30011
-34868a0,24040005
-34868a4,a3a40012
-34868a8,a3a30013
-34868ac,3c038040
-34868b0,94630026
-34868b4,a3a30016
-34868b8,a7a20014
-34868bc,8fa40010
-34868c0,c101a07
-34868c4,8fa50014
-34868c8,8fbf001c
-34868cc,3e00008
-34868d0,27bd0020
-34868d4,3e00008
-34868dc,27bdffe0
-34868e0,afbf001c
-34868e4,3c0200ff
-34868e8,34420500
-34868ec,442825
-34868f0,c101980
-34868f4,27a40010
-34868f8,8fa20010
-34868fc,10400005
-3486900,8fbf001c
-3486904,402025
-3486908,c101a07
-348690c,8fa50014
-3486910,8fbf001c
-3486914,3e00008
-3486918,27bd0020
-348691c,3c038041
-3486920,2462b25c
-3486924,8c450008
-3486928,8c44000c
-348692c,ac65b25c
-3486930,ac440004
-3486934,8c440010
-3486938,8c430014
-348693c,ac440008
-3486940,ac43000c
-3486944,ac400010
-3486948,3e00008
-348694c,ac400014
-3486950,801825
-3486954,3084ffff
-3486958,240205ff
-348695c,1482000b
-3486960,27bdfff8
-3486964,3c028011
-3486968,3442a660
-348696c,94430000
-3486970,24630001
-3486974,a4430000
-3486978,3c028040
-348697c,a4400028
-3486980,3c028040
-3486984,10000009
-3486988,a4400026
-348698c,3c020057
-3486990,24420058
-3486994,14620005
-3486998,3c02801c
-348699c,344284a0
-34869a0,8c431d38
-34869a4,34630001
-34869a8,ac431d38
-34869ac,3e00008
-34869b0,27bd0008
-34869b4,27bdffe0
-34869b8,afbf001c
-34869bc,afb00018
-34869c0,3c028041
-34869c4,8c50b25c
-34869c8,2442b25c
-34869cc,8c420004
-34869d0,afa20010
-34869d4,2403ff00
-34869d8,431024
-34869dc,3c03007c
-34869e0,14430008
+348640c,27bd0018
+3486410,3c028011
+3486414,3442a5d0
+3486418,8c42135c
+348641c,1440004c
+3486420,3c028041
+3486424,9042b570
+3486428,10400049
+348642c,3c038011
+3486430,3463a5d0
+3486434,906300b2
+3486438,30630001
+348643c,14600044
+3486440,24030003
+3486444,27bdffe8
+3486448,10430028
+348644c,afbf0014
+3486450,2c430004
+3486454,10600007
+3486458,24030001
+348645c,1043000a
+3486460,24030002
+3486464,10430014
+3486468,3c028011
+348646c,10000036
+3486470,8fbf0014
+3486474,24030004
+3486478,10430029
+348647c,3c028011
+3486480,10000031
+3486484,8fbf0014
+3486488,3c028011
+348648c,3442a5d0
+3486490,8c4400a4
+3486494,c1018ef
+3486498,3084003f
+348649c,3c038041
+34864a0,9463b56e
+34864a4,43102b
+34864a8,10400024
+34864ac,8fbf0014
+34864b0,10000025
+34864b8,3442a5d0
+34864bc,8c4400a4
+34864c0,3c02001c
+34864c4,2442003f
+34864c8,c1018ef
+34864cc,822024
+34864d0,3c038041
+34864d4,9463b56e
+34864d8,43102b
+34864dc,10400017
+34864e0,8fbf0014
+34864e4,10000018
+34864ec,3c028011
+34864f0,3442a5d0
+34864f4,8c4400a4
+34864f8,3c02001c
+34864fc,c1018ef
+3486500,822024
+3486504,3c038041
+3486508,9463b56e
+348650c,43102b
+3486510,1040000a
+3486514,8fbf0014
+3486518,1000000b
+3486520,3442a5d0
+3486524,844200d0
+3486528,3c038041
+348652c,9463b56e
+3486530,43102a
+3486534,14400004
+3486538,8fbf0014
+348653c,c101a70
+3486540,24040003
+3486544,8fbf0014
+3486548,3e00008
+348654c,27bd0018
+3486550,3e00008
+3486558,27bdffe8
+348655c,afbf0014
+3486560,3c028041
+3486564,8c42b5a0
+3486568,218c0
+348656c,3c048041
+3486570,2484b61c
+3486574,641821
+3486578,8c630000
+348657c,1060000c
+3486580,24420001
+3486584,220c0
+3486588,3c038041
+348658c,2463b61c
+3486590,641821
+3486594,402825
+3486598,8c640000
+348659c,24420001
+34865a0,1480fffc
+34865a4,24630008
+34865a8,3c028041
+34865ac,ac45b5a0
+34865b0,c102742
+34865b4,2404013c
+34865b8,3c038041
+34865bc,ac62b59c
+34865c0,24030001
+34865c4,ac430130
+34865c8,8fbf0014
+34865cc,3e00008
+34865d0,27bd0018
+34865d4,801025
+34865d8,84a30000
+34865dc,2404000a
+34865e0,14640012
+34865e4,24040015
+34865e8,24030010
+34865ec,14c30008
+34865f0,94a3001c
+34865f4,31942
+34865f8,3063007f
+34865fc,24040075
+3486600,54640003
+3486604,94a3001c
+3486608,3e00008
+348660c,ac400000
+3486610,3063001f
+3486614,a0400000
+3486618,a0460001
+348661c,24040001
+3486620,a0440002
+3486624,3e00008
+3486628,a0430003
+348662c,14640010
+3486630,2404019c
+3486634,90a3001d
+3486638,24040006
+348663c,10640005
+3486640,24040011
+3486644,50640004
+3486648,90a30141
+348664c,3e00008
+3486650,ac400000
+3486654,90a30141
+3486658,a0400000
+348665c,a0460001
+3486660,24040002
+3486664,a0440002
+3486668,3e00008
+348666c,a0430003
+3486670,1464000a
+3486674,2404003e
+3486678,94a4001c
+348667c,a0400000
+3486680,41a02
+3486684,3063001f
+3486688,a0430001
+348668c,24030003
+3486690,a0430002
+3486694,3e00008
+3486698,a0440003
+348669c,54c4000d
+34866a0,a4400000
+34866a4,2404011a
+34866a8,5464000a
+34866ac,a4400000
+34866b0,3c038011
+34866b4,3463a5d0
+34866b8,90631397
+34866bc,a0400000
+34866c0,a0430001
+34866c4,24030004
+34866c8,a0430002
+34866cc,3e00008
+34866d0,a0470003
+34866d4,a0400002
+34866d8,a0460001
+34866dc,3e00008
+34866e0,a0470003
+34866e4,3c038041
+34866e8,8c67b5a0
+34866ec,24e7ffff
+34866f0,4e00021
+34866f4,801025
+34866f8,27bdfff8
+34866fc,4825
+3486700,3c0a8041
+3486704,254ab61c
+3486708,1273021
+348670c,61fc2
+3486710,661821
+3486714,31843
+3486718,330c0
+348671c,ca3021
+3486720,8cc80000
+3486724,8cc60004
+3486728,afa60004
+348672c,a8302b
+3486730,10c00003
+3486734,105302b
+3486738,10000008
+348673c,2467ffff
+3486740,50c00003
+3486744,ac480000
+3486748,10000004
+348674c,24690001
+3486750,8fa30004
+3486754,10000006
+3486758,ac430004
+348675c,e9182a
+3486760,1060ffea
+3486764,1273021
+3486768,ac400000
+348676c,ac400004
+3486770,3e00008
+3486774,27bd0008
+3486778,ac800000
+348677c,3e00008
+3486780,ac800004
+3486784,27bdffe0
+3486788,afbf001c
+348678c,afb00018
+3486790,808025
+3486794,c101975
+3486798,27a40010
+348679c,8fa50010
+34867a0,14a00004
+34867a8,ae000000
+34867ac,10000003
+34867b0,ae000004
+34867b4,c1019b9
+34867b8,2002025
+34867bc,2001025
+34867c0,8fbf001c
+34867c4,8fb00018
+34867c8,3e00008
+34867cc,27bd0020
+34867d0,27bdffe8
+34867d4,afbf0014
+34867d8,afb00010
+34867dc,afa40018
+34867e0,58202
+34867e4,afa5001c
+34867e8,321000ff
+34867ec,c101eeb
+34867f0,52402
+34867f4,c101edc
+34867f8,402025
+34867fc,3c038041
+3486800,8fa40018
+3486804,ac64b594
+3486808,2463b594
+348680c,8fa4001c
+3486810,ac640004
+3486814,10202b
+3486818,3c038041
+348681c,ac64b590
+3486820,3c038041
+3486824,ac62b58c
+3486828,90440001
+348682c,3c038041
+3486830,ac64b588
+3486834,94440002
+3486838,3c038041
+348683c,ac64b584
+3486840,94440004
+3486844,3c038041
+3486848,ac64b580
+348684c,80440006
+3486850,3c038041
+3486854,ac64b57c
+3486858,90420007
+348685c,30420001
+3486860,3c038041
+3486864,16000003
+3486868,ac62b578
+348686c,3c028040
+3486870,90500024
+3486874,3c028040
+3486878,a0500025
+348687c,8fbf0014
+3486880,8fb00010
+3486884,3e00008
+3486888,27bd0018
+348688c,3c028041
+3486890,ac40b594
+3486894,2442b594
+3486898,ac400004
+348689c,3c028041
+34868a0,ac40b590
+34868a4,3c028041
+34868a8,ac40b58c
+34868ac,3c028041
+34868b0,ac40b588
+34868b4,3c028041
+34868b8,ac40b584
+34868bc,3c028041
+34868c0,ac40b580
+34868c4,3c028041
+34868c8,ac40b57c
+34868cc,3c028041
+34868d0,3e00008
+34868d4,ac40b578
+34868d8,8c830000
+34868dc,3c028040
+34868e0,ac43002c
+34868e4,94830004
+34868e8,3c028040
+34868ec,a4430030
+34868f0,90830006
+34868f4,3c028040
+34868f8,3e00008
+34868fc,a4430032
+3486900,afa40000
+3486904,afa50004
+3486908,3c028041
+348690c,2442b604
+3486910,1825
+3486914,24060003
+3486918,8c450000
+348691c,14a0000a
+3486924,318c0
+3486928,3c028041
+348692c,2442b604
+3486930,621821
+3486934,8fa20000
+3486938,ac620000
+348693c,8fa20004
+3486940,3e00008
+3486944,ac620004
+3486948,10a40003
+348694c,24630001
+3486950,1466fff1
+3486954,24420008
+3486958,3e00008
+3486960,3c028040
+3486964,94420028
+3486968,10400013
+348696c,2403ffff
+3486970,27bdffe0
+3486974,afbf001c
+3486978,afa00010
+348697c,afa00014
+3486980,a3a30011
+3486984,24040005
+3486988,a3a40012
+348698c,a3a30013
+3486990,3c038040
+3486994,94630026
+3486998,a3a30016
+348699c,a7a20014
+34869a0,8fa40010
+34869a4,c101a40
+34869a8,8fa50014
+34869ac,8fbf001c
+34869b0,3e00008
+34869b4,27bd0020
+34869b8,3e00008
+34869c0,27bdffe0
+34869c4,afbf001c
+34869c8,3c0200ff
+34869cc,34420500
+34869d0,442825
+34869d4,c1019b9
+34869d8,27a40010
+34869dc,8fa20010
+34869e0,10400005
34869e4,8fbf001c
-34869e8,c101dc6
-34869f0,c101a47
-34869f8,c101a54
-34869fc,2002025
-3486a00,8fbf001c
-3486a04,8fb00018
-3486a08,3e00008
-3486a0c,27bd0020
-3486a10,27bdffe8
-3486a14,afbf0014
-3486a18,afb00010
-3486a1c,3c028041
-3486a20,8c50b1f0
-3486a24,1200000e
-3486a28,8fbf0014
-3486a2c,c1019fd
-3486a30,2444b1f0
-3486a34,3c028041
-3486a38,8c42b25c
-3486a3c,14500003
-3486a44,c101a47
-3486a4c,c101a54
-3486a50,2002025
-3486a54,c1019ea
-3486a5c,8fbf0014
-3486a60,8fb00010
-3486a64,3e00008
-3486a68,27bd0018
-3486a6c,27bdffe0
-3486a70,afbf001c
-3486a74,3c028041
-3486a78,8c43b25c
-3486a7c,2442b25c
-3486a80,8c420004
-3486a84,afa30010
-3486a88,1060000d
-3486a8c,afa20014
-3486a90,602025
-3486a94,c1019bb
-3486a98,402825
-3486a9c,3c02801d
-3486aa0,3442aa30
-3486aa4,3c038041
-3486aa8,8c63b1f8
-3486aac,ac430428
-3486ab0,3c038041
-3486ab4,8c63b1e8
-3486ab8,80630000
-3486abc,a0430424
-3486ac0,8fbf001c
-3486ac4,3e00008
-3486ac8,27bd0020
-3486acc,27bdffe8
-3486ad0,afbf0014
-3486ad4,c101a1f
-3486adc,3c02801d
-3486ae0,3442aa30
-3486ae4,8c42066c
-3486ae8,3c03fcac
-3486aec,24632485
-3486af0,431024
-3486af4,14400033
-3486af8,3c028041
-3486afc,3c02801d
-3486b00,3442aa30
-3486b04,94420088
-3486b08,30420001
-3486b0c,1040002a
-3486b10,1025
-3486b14,3c02801d
-3486b18,3442aa30
-3486b1c,8c420670
-3486b20,3c03000c
-3486b24,431024
-3486b28,14400023
-3486b2c,1025
-3486b30,3c02800e
-3486b34,3442f1b0
-3486b38,8c420000
-3486b3c,30420020
-3486b40,1440001d
-3486b44,1025
-3486b48,3c02801c
-3486b4c,344284a0
-3486b50,8c420794
-3486b54,14400018
-3486b58,1025
-3486b5c,3c028041
-3486b60,9042b1d0
-3486b64,24420001
-3486b68,304200ff
-3486b6c,2c430002
-3486b70,14600012
-3486b74,3c038041
-3486b78,3c028041
-3486b7c,c101a6d
-3486b80,a040b1d0
-3486b84,c101dc2
-3486b8c,10400005
-3486b94,c101dcb
-3486b9c,1000000b
-3486ba0,8fbf0014
-3486ba4,c101a9b
-3486bac,10000007
-3486bb0,8fbf0014
-3486bb4,1025
-3486bb8,3c038041
-3486bbc,10000002
-3486bc0,a062b1d0
-3486bc4,a040b1d0
-3486bc8,8fbf0014
-3486bcc,3e00008
-3486bd0,27bd0018
-3486bd4,27bdffd8
-3486bd8,afbf0024
-3486bdc,afb20020
-3486be0,afb1001c
-3486be4,afb00018
-3486be8,a09025
-3486bec,10800012
-3486bf0,c08825
-3486bf4,10c00010
-3486bf8,808025
-3486bfc,4c10004
-3486c00,c03825
-3486c04,63823
-3486c08,73e00
-3486c0c,73e03
-3486c10,30e700ff
-3486c14,3c02801c
-3486c18,344284a0
-3486c1c,904600a5
-3486c20,2002825
-3486c24,c1019a8
-3486c28,27a40010
-3486c2c,8fa20010
-3486c30,14400005
-3486c34,8fa40010
-3486c38,c1019ea
-3486c40,10000019
-3486c44,2201025
-3486c48,c1019bb
-3486c4c,8fa50014
-3486c50,3c028041
-3486c54,8c42b1e8
-3486c58,86040000
-3486c5c,2403000a
-3486c60,1483000c
-3486c64,80420000
-3486c68,8fa30014
-3486c6c,2404ff00
-3486c70,641824
-3486c74,3c04007c
-3486c78,50640001
-3486c7c,2402007c
-3486c80,9603001c
-3486c84,3063f01f
-3486c88,22140
-3486c8c,641825
-3486c90,a603001c
-3486c94,6230005
-3486c98,a2420424
-3486c9c,21023
-3486ca0,21600
-3486ca4,21603
-3486ca8,a2420424
-3486cac,8fbf0024
-3486cb0,8fb20020
-3486cb4,8fb1001c
-3486cb8,8fb00018
-3486cbc,3e00008
-3486cc0,27bd0028
-3486cc4,27bdffd8
-3486cc8,afbf0024
-3486ccc,afb20020
-3486cd0,afb1001c
-3486cd4,afb00018
-3486cd8,808825
-3486cdc,3825
-3486ce0,3025
-3486ce4,802825
-3486ce8,c1019a8
-3486cec,27a40010
-3486cf0,8fa20010
-3486cf4,10400029
-3486cf8,93b20016
-3486cfc,c101eb2
-3486d00,97a40014
-3486d04,c101ea3
-3486d08,402025
-3486d0c,408025
-3486d10,ae200134
-3486d14,3c028040
-3486d18,16400015
-3486d1c,a0520025
-3486d20,3c028040
-3486d24,90430024
-3486d28,3c028040
-3486d2c,a0430025
-3486d30,3025
-3486d34,96050002
-3486d38,3c11801c
-3486d3c,3c02800d
-3486d40,3442ce14
-3486d44,40f809
-3486d48,362484a0
-3486d4c,92050001
-3486d50,3c028006
-3486d54,3442fdcc
-3486d58,40f809
-3486d5c,362484a0
-3486d60,c101eca
-3486d64,2002025
-3486d68,10000013
-3486d6c,8fbf0024
-3486d70,3025
-3486d74,96050002
-3486d78,3c04801c
-3486d7c,3c02800d
-3486d80,3442ce14
-3486d84,40f809
-3486d88,348484a0
-3486d8c,c1019fd
-3486d90,27a40010
-3486d94,10000008
-3486d98,8fbf0024
-3486d9c,c101eb2
-3486da0,2404005b
-3486da4,c101ea3
-3486da8,402025
-3486dac,408025
-3486db0,1000ffdb
-3486db4,ae200134
-3486db8,8fb20020
-3486dbc,8fb1001c
-3486dc0,8fb00018
-3486dc4,3e00008
-3486dc8,27bd0028
-3486dcc,27bdffe8
-3486dd0,afbf0014
-3486dd4,afb00010
-3486dd8,3c028011
-3486ddc,3442a5d0
-3486de0,94500eec
-3486de4,32100002
-3486de8,1600000c
-3486dec,3c028040
-3486df0,90420cd5
-3486df4,50400004
-3486df8,3c028011
-3486dfc,c101a37
-3486e00,24040002
-3486e04,3c028011
-3486e08,3442a5d0
-3486e0c,94430eec
-3486e10,34630002
-3486e14,a4430eec
-3486e18,3c028040
-3486e1c,90430cd5
-3486e20,14600002
-3486e24,24020001
-3486e28,10102b
-3486e2c,8fbf0014
-3486e30,8fb00010
-3486e34,3e00008
-3486e38,27bd0018
-3486e3c,94830004
-3486e40,94820006
-3486e44,620018
-3486e48,9082000c
-3486e4c,1812
-3486e58,620018
-3486e5c,1012
-3486e60,3e00008
-3486e68,27bdffe8
-3486e6c,afbf0014
-3486e70,afb00010
-3486e74,c101b8f
-3486e78,808025
-3486e7c,96030008
-3486e80,620018
-3486e84,1012
-3486e88,8fbf0014
-3486e8c,8fb00010
-3486e90,3e00008
-3486e94,27bd0018
-3486e98,27bdff98
-3486e9c,afbf0064
-3486ea0,afb60060
-3486ea4,afb5005c
-3486ea8,afb40058
-3486eac,afb30054
-3486eb0,afb20050
-3486eb4,afb1004c
-3486eb8,afb00048
-3486ebc,808025
-3486ec0,a0a025
-3486ec4,c0a825
-3486ec8,94b10004
-3486ecc,94a20006
-3486ed0,470018
-3486ed4,9012
-3486ed8,90b6000b
-3486edc,90b3000a
-3486ee0,139d40
-3486ee4,3c0200e0
-3486ee8,2629824
-3486eec,1614c0
-3486ef0,3c030018
-3486ef4,431024
-3486ef8,2629825
-3486efc,2622ffff
-3486f00,30420fff
-3486f04,531025
-3486f08,3c03fd00
-3486f0c,431025
-3486f10,afa20010
-3486f14,c101b8f
-3486f18,a02025
-3486f1c,550018
-3486f20,8e820000
-3486f24,1812
-3486f28,431021
-3486f2c,afa20014
-3486f30,2ec30002
-3486f34,10600003
-3486f38,24020010
-3486f3c,24020004
-3486f40,2c21004
-3486f44,510018
-3486f48,1812
-3486f4c,2463003f
-3486f50,317c3
-3486f54,3042003f
-3486f58,431021
-3486f5c,210c0
-3486f60,3c030003
-3486f64,3463fe00
-3486f68,431024
-3486f6c,531025
-3486f70,3c03f500
-3486f74,431025
-3486f78,afa20018
-3486f7c,3c040700
-3486f80,afa4001c
-3486f84,3c03e600
-3486f88,afa30020
-3486f8c,afa00024
-3486f90,3c03f400
-3486f94,afa30028
-3486f98,2623ffff
-3486f9c,31b80
-3486fa0,3c0500ff
-3486fa4,34a5f000
-3486fa8,651824
-3486fac,2652ffff
-3486fb0,129080
-3486fb4,32520ffc
-3486fb8,721825
-3486fbc,642025
-3486fc0,afa4002c
-3486fc4,3c04e700
-3486fc8,afa40030
-3486fcc,afa00034
-3486fd0,afa20038
-3486fd4,afa0003c
-3486fd8,3c02f200
-3486fdc,afa20040
-3486fe0,afa30044
-3486fe4,27a20010
-3486fe8,27a60048
-3486fec,8e030008
-3486ff0,24640008
-3486ff4,ae040008
-3486ff8,8c450004
-3486ffc,8c440000
-3487000,ac650004
-3487004,24420008
-3487008,1446fff8
-348700c,ac640000
-3487010,8fbf0064
-3487014,8fb60060
-3487018,8fb5005c
-348701c,8fb40058
-3487020,8fb30054
-3487024,8fb20050
-3487028,8fb1004c
-348702c,8fb00048
-3487030,3e00008
-3487034,27bd0068
-3487038,27bdffe0
-348703c,8fa80030
-3487040,8fa20034
-3487044,8faa0038
-3487048,94a30004
-348704c,31a80
-3487050,14400002
-3487054,62001a
-3487058,7000d
-348705c,4812
-3487060,94a30006
-3487064,471021
-3487068,21380
-348706c,3c0b00ff
-3487070,356bf000
-3487074,4b1024
-3487078,1482821
-348707c,52880
-3487080,30a50fff
-3487084,451025
-3487088,3c05e400
-348708c,451025
-3487090,afa20000
-3487094,73b80
-3487098,eb3824
-348709c,84080
-34870a0,31080fff
-34870a4,e83825
-34870a8,afa70004
-34870ac,3c02e100
-34870b0,afa20008
-34870b4,660018
-34870b8,1012
-34870bc,21140
-34870c0,3042ffff
-34870c4,afa2000c
-34870c8,3c02f100
-34870cc,afa20010
-34870d0,31a80
-34870d4,15400002
-34870d8,6a001a
-34870dc,7000d
-34870e0,1012
-34870e4,3042ffff
-34870e8,94c00
-34870ec,491025
-34870f0,afa20014
-34870f4,afbd0018
-34870f8,27a50018
-34870fc,8c820008
-3487100,24430008
-3487104,ac830008
-3487108,8fa30018
-348710c,8c670004
-3487110,8c660000
-3487114,ac470004
-3487118,ac460000
-348711c,24620008
-3487120,1445fff6
-3487124,afa20018
-3487128,3e00008
-348712c,27bd0020
-3487130,27bdffa0
-3487134,afbf005c
-3487138,afb10058
-348713c,afb00054
-3487140,afa00010
-3487144,3c0201a0
-3487148,24422000
-348714c,afa20014
-3487150,3c110003
-3487154,362295c0
-3487158,afa20018
-348715c,c102709
-3487160,27a40010
-3487164,afa0001c
-3487168,3c020084
-348716c,24426000
-3487170,afa20020
-3487174,3402b400
-3487178,afa20024
-348717c,c102709
-3487180,27a4001c
-3487184,afa00028
-3487188,3c02007b
-348718c,3442d000
-3487190,afa2002c
-3487194,3c100008
-3487198,361088a0
-348719c,afb00030
-34871a0,c102709
-34871a4,27a40028
-34871a8,afa00034
-34871ac,3c0201a3
-34871b0,3442c000
-34871b4,afa20038
-34871b8,24023b00
-34871bc,afa2003c
-34871c0,c102709
-34871c4,27a40034
-34871c8,afa00040
-34871cc,3c020085
-34871d0,3442e000
-34871d4,afa20044
-34871d8,24021d80
-34871dc,afa20048
-34871e0,c102709
-34871e4,27a40040
-34871e8,8fa20010
-34871ec,2631a300
-34871f0,518821
-34871f4,3c038041
-34871f8,ac71a0d8
-34871fc,24422980
-3487200,3c038041
-3487204,ac62a0c8
-3487208,8fa20028
-348720c,3c038041
-3487210,ac62a0b8
-3487214,3c038041
-3487218,8fa4001c
-348721c,ac64a0a8
-3487220,3c048041
-3487224,3c038041
-3487228,2463d780
-348722c,ac83a088
-3487230,3c048041
-3487234,3c038041
-3487238,2463df80
-348723c,ac83a078
-3487240,2610f7a0
-3487244,501021
-3487248,3c038041
-348724c,ac62a068
-3487250,8fa20034
-3487254,24441e00
-3487258,3c038041
-348725c,ac64a058
-3487260,244435c0
-3487264,3c038041
-3487268,ac64a048
-348726c,8fa30040
-3487270,24631980
-3487274,3c048041
-3487278,ac83a038
-348727c,3c038041
-3487280,ac62a028
-3487284,3c118041
-3487288,c101b9a
-348728c,2624a098
-3487290,408025
-3487294,c1026fa
-3487298,402025
-348729c,104fc2
-34872a0,1304821
-34872a4,2a100002
-34872a8,16000018
-34872ac,ae22a098
-34872b0,94843
-34872b4,3c038041
-34872b8,2463c2b8
-34872bc,2025
-34872c0,3025
-34872c4,2204025
-34872c8,2407fff0
-34872cc,8d05a098
-34872d0,a42821
-34872d4,90620000
-34872d8,21102
-34872dc,471025
-34872e0,a0a20000
-34872e4,8d02a098
-34872e8,441021
-34872ec,90650000
-34872f0,a72825
-34872f4,a0450001
-34872f8,24c60001
-34872fc,24630001
-3487300,c9102a
-3487304,1440fff1
-3487308,24840002
-348730c,8fbf005c
-3487310,8fb10058
-3487314,8fb00054
-3487318,3e00008
-348731c,27bd0060
-3487320,3c038040
-3487324,9462084e
-3487328,2463084e
-348732c,94640002
-3487330,94630004
-3487334,3c058041
-3487338,8ca5b1a0
-348733c,a4a20000
-3487340,a4a40002
-3487344,a4a30004
-3487348,3c058041
-348734c,8ca6b19c
-3487350,a4c20000
-3487354,8ca5b19c
-3487358,a4a40004
-348735c,a4a30008
-3487360,240500ff
-3487364,1445000a
-3487368,3c058041
-348736c,24050046
-3487370,14850007
-3487374,3c058041
-3487378,24050032
-348737c,14650004
-3487380,3c058041
-3487384,1825
-3487388,2025
-348738c,240200c8
-3487390,8ca5b198
-3487394,a4a20000
-3487398,a4a40002
-348739c,a4a30004
-34873a0,3c058041
-34873a4,8ca5b194
-34873a8,a4a20000
-34873ac,a4a40002
-34873b0,a4a30004
-34873b4,3c028041
-34873b8,8c43b190
-34873bc,3c028040
-34873c0,94450854
-34873c4,24420854
-34873c8,94440002
-34873cc,94420004
-34873d0,a4650000
-34873d4,a4640002
-34873d8,a4620004
-34873dc,3c028041
-34873e0,8c43b18c
-34873e4,3c028040
-34873e8,9445085a
-34873ec,2442085a
-34873f0,94440002
-34873f4,94420004
-34873f8,a4650000
-34873fc,a4640002
-3487400,a4620004
-3487404,3c028041
-3487408,8c43b188
-348740c,3c028040
-3487410,94450860
-3487414,24420860
-3487418,94440002
-348741c,94420004
-3487420,a4650000
-3487424,a4640002
-3487428,a4620004
-348742c,3c028041
-3487430,8c42b184
-3487434,3c068040
-3487438,94c30872
-348743c,a4430000
-3487440,3c028041
-3487444,8c43b180
-3487448,24c20872
-348744c,94440002
-3487450,a4640000
-3487454,3c038041
-3487458,8c63b17c
-348745c,94440004
-3487460,a4640000
-3487464,3c038041
-3487468,8c63b178
-348746c,3c058040
-3487470,94a40878
-3487474,a4640000
-3487478,3c038041
-348747c,8c64b174
-3487480,24a30878
-3487484,94670002
-3487488,a4870000
-348748c,3c048041
-3487490,8c84b170
-3487494,94670004
-3487498,a4870000
-348749c,3c048041
-34874a0,8c84b16c
-34874a4,94c80872
-34874a8,94470002
-34874ac,94460004
-34874b0,a4880000
-34874b4,a4870002
-34874b8,a4860004
-34874bc,3c048041
-34874c0,8c84b15c
-34874c4,94a60878
-34874c8,94650002
-34874cc,94630004
-34874d0,a4860000
-34874d4,a4850002
-34874d8,a4830004
-34874dc,94420002
-34874e0,3043ffff
-34874e4,2c6300ce
-34874e8,50600001
-34874ec,240200cd
-34874f0,24420032
-34874f4,3047ffff
-34874f8,3c028040
-34874fc,94420876
-3487500,3043ffff
-3487504,2c6300ce
-3487508,50600001
-348750c,240200cd
-3487510,24420032
-3487514,3046ffff
-3487518,3c028040
-348751c,94420878
-3487520,3043ffff
-3487524,2c6300ce
-3487528,50600001
-348752c,240200cd
-3487530,24420032
-3487534,3044ffff
-3487538,3c028040
-348753c,9442087a
-3487540,3043ffff
-3487544,2c6300ce
-3487548,50600001
-348754c,240200cd
-3487550,24420032
-3487554,3043ffff
-3487558,3c028040
-348755c,9442087c
-3487560,3045ffff
-3487564,2ca500ce
-3487568,50a00001
-348756c,240200cd
-3487570,24420032
-3487574,3c058041
-3487578,8ca8b168
-348757c,3c058040
-3487580,94a50872
-3487584,30a9ffff
-3487588,2d2900ce
-348758c,15200002
-3487590,3042ffff
-3487594,240500cd
-3487598,24a50032
-348759c,a5050000
-34875a0,a5070002
-34875a4,a5060004
-34875a8,3c058041
-34875ac,8ca5b158
-34875b0,a4a40000
-34875b4,a4a30002
-34875b8,a4a20004
-34875bc,3c028041
-34875c0,8c43b160
-34875c4,3c028040
-34875c8,94450872
-34875cc,24420872
-34875d0,94440002
-34875d4,94420004
-34875d8,a4650000
-34875dc,a4640002
-34875e0,a4620004
-34875e4,3c028041
-34875e8,8c43b150
-34875ec,3c028040
-34875f0,94450878
-34875f4,24420878
-34875f8,94440002
-34875fc,94420004
-3487600,a4650000
-3487604,a4640002
-3487608,a4620004
-348760c,3c028041
-3487610,8c43b14c
-3487614,3c028040
-3487618,94460866
-348761c,24440866
-3487620,94850002
-3487624,94840004
-3487628,a4660000
-348762c,a4650002
-3487630,a4640004
-3487634,94420866
+34869e8,402025
+34869ec,c101a40
+34869f0,8fa50014
+34869f4,8fbf001c
+34869f8,3e00008
+34869fc,27bd0020
+3486a00,3c038041
+3486a04,2462b604
+3486a08,8c450008
+3486a0c,8c44000c
+3486a10,ac65b604
+3486a14,ac440004
+3486a18,8c440010
+3486a1c,8c430014
+3486a20,ac440008
+3486a24,ac43000c
+3486a28,ac400010
+3486a2c,3e00008
+3486a30,ac400014
+3486a34,801825
+3486a38,3084ffff
+3486a3c,240205ff
+3486a40,1482000b
+3486a44,27bdfff8
+3486a48,3c028011
+3486a4c,3442a660
+3486a50,94430000
+3486a54,24630001
+3486a58,a4430000
+3486a5c,3c028040
+3486a60,a4400028
+3486a64,3c028040
+3486a68,10000009
+3486a6c,a4400026
+3486a70,3c020057
+3486a74,24420058
+3486a78,14620005
+3486a7c,3c02801c
+3486a80,344284a0
+3486a84,8c431d38
+3486a88,34630001
+3486a8c,ac431d38
+3486a90,3e00008
+3486a94,27bd0008
+3486a98,27bdffe0
+3486a9c,afbf001c
+3486aa0,afb00018
+3486aa4,3c028041
+3486aa8,8c50b604
+3486aac,2442b604
+3486ab0,8c420004
+3486ab4,afa20010
+3486ab8,2403ff00
+3486abc,431024
+3486ac0,3c03007c
+3486ac4,14430008
+3486ac8,8fbf001c
+3486acc,c101dff
+3486ad4,c101a80
+3486adc,c101a8d
+3486ae0,2002025
+3486ae4,8fbf001c
+3486ae8,8fb00018
+3486aec,3e00008
+3486af0,27bd0020
+3486af4,27bdffe8
+3486af8,afbf0014
+3486afc,afb00010
+3486b00,3c028041
+3486b04,8c50b594
+3486b08,1200000e
+3486b0c,8fbf0014
+3486b10,c101a36
+3486b14,2444b594
+3486b18,3c028041
+3486b1c,8c42b604
+3486b20,14500003
+3486b28,c101a80
+3486b30,c101a8d
+3486b34,2002025
+3486b38,c101a23
+3486b40,8fbf0014
+3486b44,8fb00010
+3486b48,3e00008
+3486b4c,27bd0018
+3486b50,27bdffe0
+3486b54,afbf001c
+3486b58,3c028041
+3486b5c,8c43b604
+3486b60,2442b604
+3486b64,8c420004
+3486b68,afa30010
+3486b6c,1060000d
+3486b70,afa20014
+3486b74,602025
+3486b78,c1019f4
+3486b7c,402825
+3486b80,3c02801d
+3486b84,3442aa30
+3486b88,3c038041
+3486b8c,8c63b59c
+3486b90,ac430428
+3486b94,3c038041
+3486b98,8c63b58c
+3486b9c,80630000
+3486ba0,a0430424
+3486ba4,8fbf001c
+3486ba8,3e00008
+3486bac,27bd0020
+3486bb0,27bdffe8
+3486bb4,afbf0014
+3486bb8,c101a58
+3486bc0,3c02801d
+3486bc4,3442aa30
+3486bc8,8c42066c
+3486bcc,3c03fcac
+3486bd0,24632485
+3486bd4,431024
+3486bd8,14400033
+3486bdc,3c028041
+3486be0,3c02801d
+3486be4,3442aa30
+3486be8,94420088
+3486bec,30420001
+3486bf0,1040002a
+3486bf4,1025
+3486bf8,3c02801d
+3486bfc,3442aa30
+3486c00,8c420670
+3486c04,3c03000c
+3486c08,431024
+3486c0c,14400023
+3486c10,1025
+3486c14,3c02800e
+3486c18,3442f1b0
+3486c1c,8c420000
+3486c20,30420020
+3486c24,1440001d
+3486c28,1025
+3486c2c,3c02801c
+3486c30,344284a0
+3486c34,8c420794
+3486c38,14400018
+3486c3c,1025
+3486c40,3c028041
+3486c44,9042b574
+3486c48,24420001
+3486c4c,304200ff
+3486c50,2c430002
+3486c54,14600012
+3486c58,3c038041
+3486c5c,3c028041
+3486c60,c101aa6
+3486c64,a040b574
+3486c68,c101dfb
+3486c70,10400005
+3486c78,c101e04
+3486c80,1000000b
+3486c84,8fbf0014
+3486c88,c101ad4
+3486c90,10000007
+3486c94,8fbf0014
+3486c98,1025
+3486c9c,3c038041
+3486ca0,10000002
+3486ca4,a062b574
+3486ca8,a040b574
+3486cac,8fbf0014
+3486cb0,3e00008
+3486cb4,27bd0018
+3486cb8,27bdffd8
+3486cbc,afbf0024
+3486cc0,afb20020
+3486cc4,afb1001c
+3486cc8,afb00018
+3486ccc,a09025
+3486cd0,10800012
+3486cd4,c08825
+3486cd8,10c00010
+3486cdc,808025
+3486ce0,4c10004
+3486ce4,c03825
+3486ce8,63823
+3486cec,73e00
+3486cf0,73e03
+3486cf4,30e700ff
+3486cf8,3c02801c
+3486cfc,344284a0
+3486d00,904600a5
+3486d04,2002825
+3486d08,c1019e1
+3486d0c,27a40010
+3486d10,8fa20010
+3486d14,14400005
+3486d18,8fa40010
+3486d1c,c101a23
+3486d24,10000019
+3486d28,2201025
+3486d2c,c1019f4
+3486d30,8fa50014
+3486d34,3c028041
+3486d38,8c42b58c
+3486d3c,86040000
+3486d40,2403000a
+3486d44,1483000c
+3486d48,80420000
+3486d4c,8fa30014
+3486d50,2404ff00
+3486d54,641824
+3486d58,3c04007c
+3486d5c,50640001
+3486d60,2402007c
+3486d64,9603001c
+3486d68,3063f01f
+3486d6c,22140
+3486d70,641825
+3486d74,a603001c
+3486d78,6230005
+3486d7c,a2420424
+3486d80,21023
+3486d84,21600
+3486d88,21603
+3486d8c,a2420424
+3486d90,8fbf0024
+3486d94,8fb20020
+3486d98,8fb1001c
+3486d9c,8fb00018
+3486da0,3e00008
+3486da4,27bd0028
+3486da8,27bdffd8
+3486dac,afbf0024
+3486db0,afb20020
+3486db4,afb1001c
+3486db8,afb00018
+3486dbc,808825
+3486dc0,3825
+3486dc4,3025
+3486dc8,802825
+3486dcc,c1019e1
+3486dd0,27a40010
+3486dd4,8fa20010
+3486dd8,10400029
+3486ddc,93b20016
+3486de0,c101eeb
+3486de4,97a40014
+3486de8,c101edc
+3486dec,402025
+3486df0,408025
+3486df4,ae200134
+3486df8,3c028040
+3486dfc,16400015
+3486e00,a0520025
+3486e04,3c028040
+3486e08,90430024
+3486e0c,3c028040
+3486e10,a0430025
+3486e14,3025
+3486e18,96050002
+3486e1c,3c11801c
+3486e20,3c02800d
+3486e24,3442ce14
+3486e28,40f809
+3486e2c,362484a0
+3486e30,92050001
+3486e34,3c028006
+3486e38,3442fdcc
+3486e3c,40f809
+3486e40,362484a0
+3486e44,c101f03
+3486e48,2002025
+3486e4c,10000013
+3486e50,8fbf0024
+3486e54,3025
+3486e58,96050002
+3486e5c,3c04801c
+3486e60,3c02800d
+3486e64,3442ce14
+3486e68,40f809
+3486e6c,348484a0
+3486e70,c101a36
+3486e74,27a40010
+3486e78,10000008
+3486e7c,8fbf0024
+3486e80,c101eeb
+3486e84,2404005b
+3486e88,c101edc
+3486e8c,402025
+3486e90,408025
+3486e94,1000ffdb
+3486e98,ae200134
+3486e9c,8fb20020
+3486ea0,8fb1001c
+3486ea4,8fb00018
+3486ea8,3e00008
+3486eac,27bd0028
+3486eb0,27bdffe8
+3486eb4,afbf0014
+3486eb8,afb00010
+3486ebc,3c028011
+3486ec0,3442a5d0
+3486ec4,94500eec
+3486ec8,32100002
+3486ecc,1600000c
+3486ed0,3c028040
+3486ed4,90420cd5
+3486ed8,50400004
+3486edc,3c028011
+3486ee0,c101a70
+3486ee4,24040002
+3486ee8,3c028011
+3486eec,3442a5d0
+3486ef0,94430eec
+3486ef4,34630002
+3486ef8,a4430eec
+3486efc,3c028040
+3486f00,90430cd5
+3486f04,14600002
+3486f08,24020001
+3486f0c,10102b
+3486f10,8fbf0014
+3486f14,8fb00010
+3486f18,3e00008
+3486f1c,27bd0018
+3486f20,94830004
+3486f24,94820006
+3486f28,620018
+3486f2c,9082000c
+3486f30,1812
+3486f3c,620018
+3486f40,1012
+3486f44,3e00008
+3486f4c,27bdffe8
+3486f50,afbf0014
+3486f54,afb00010
+3486f58,c101bc8
+3486f5c,808025
+3486f60,96030008
+3486f64,620018
+3486f68,1012
+3486f6c,8fbf0014
+3486f70,8fb00010
+3486f74,3e00008
+3486f78,27bd0018
+3486f7c,27bdff98
+3486f80,afbf0064
+3486f84,afb60060
+3486f88,afb5005c
+3486f8c,afb40058
+3486f90,afb30054
+3486f94,afb20050
+3486f98,afb1004c
+3486f9c,afb00048
+3486fa0,808025
+3486fa4,a0a025
+3486fa8,c0a825
+3486fac,94b10004
+3486fb0,94a20006
+3486fb4,470018
+3486fb8,9012
+3486fbc,90b6000b
+3486fc0,90b3000a
+3486fc4,139d40
+3486fc8,3c0200e0
+3486fcc,2629824
+3486fd0,1614c0
+3486fd4,3c030018
+3486fd8,431024
+3486fdc,2629825
+3486fe0,2622ffff
+3486fe4,30420fff
+3486fe8,531025
+3486fec,3c03fd00
+3486ff0,431025
+3486ff4,afa20010
+3486ff8,c101bc8
+3486ffc,a02025
+3487000,550018
+3487004,8e820000
+3487008,1812
+348700c,431021
+3487010,afa20014
+3487014,2ec30002
+3487018,10600003
+348701c,24020010
+3487020,24020004
+3487024,2c21004
+3487028,510018
+348702c,1812
+3487030,2463003f
+3487034,317c3
+3487038,3042003f
+348703c,431021
+3487040,210c0
+3487044,3c030003
+3487048,3463fe00
+348704c,431024
+3487050,531025
+3487054,3c03f500
+3487058,431025
+348705c,afa20018
+3487060,3c040700
+3487064,afa4001c
+3487068,3c03e600
+348706c,afa30020
+3487070,afa00024
+3487074,3c03f400
+3487078,afa30028
+348707c,2623ffff
+3487080,31b80
+3487084,3c0500ff
+3487088,34a5f000
+348708c,651824
+3487090,2652ffff
+3487094,129080
+3487098,32520ffc
+348709c,721825
+34870a0,642025
+34870a4,afa4002c
+34870a8,3c04e700
+34870ac,afa40030
+34870b0,afa00034
+34870b4,afa20038
+34870b8,afa0003c
+34870bc,3c02f200
+34870c0,afa20040
+34870c4,afa30044
+34870c8,27a20010
+34870cc,27a60048
+34870d0,8e030008
+34870d4,24640008
+34870d8,ae040008
+34870dc,8c450004
+34870e0,8c440000
+34870e4,ac650004
+34870e8,24420008
+34870ec,1446fff8
+34870f0,ac640000
+34870f4,8fbf0064
+34870f8,8fb60060
+34870fc,8fb5005c
+3487100,8fb40058
+3487104,8fb30054
+3487108,8fb20050
+348710c,8fb1004c
+3487110,8fb00048
+3487114,3e00008
+3487118,27bd0068
+348711c,27bdffe0
+3487120,8fa80030
+3487124,8fa20034
+3487128,8faa0038
+348712c,94a30004
+3487130,31a80
+3487134,14400002
+3487138,62001a
+348713c,7000d
+3487140,4812
+3487144,94a30006
+3487148,471021
+348714c,21380
+3487150,3c0b00ff
+3487154,356bf000
+3487158,4b1024
+348715c,1482821
+3487160,52880
+3487164,30a50fff
+3487168,451025
+348716c,3c05e400
+3487170,451025
+3487174,afa20000
+3487178,73b80
+348717c,eb3824
+3487180,84080
+3487184,31080fff
+3487188,e83825
+348718c,afa70004
+3487190,3c02e100
+3487194,afa20008
+3487198,660018
+348719c,1012
+34871a0,21140
+34871a4,3042ffff
+34871a8,afa2000c
+34871ac,3c02f100
+34871b0,afa20010
+34871b4,31a80
+34871b8,15400002
+34871bc,6a001a
+34871c0,7000d
+34871c4,1012
+34871c8,3042ffff
+34871cc,94c00
+34871d0,491025
+34871d4,afa20014
+34871d8,afbd0018
+34871dc,27a50018
+34871e0,8c820008
+34871e4,24430008
+34871e8,ac830008
+34871ec,8fa30018
+34871f0,8c670004
+34871f4,8c660000
+34871f8,ac470004
+34871fc,ac460000
+3487200,24620008
+3487204,1445fff6
+3487208,afa20018
+348720c,3e00008
+3487210,27bd0020
+3487214,27bdffa0
+3487218,afbf005c
+348721c,afb10058
+3487220,afb00054
+3487224,afa00010
+3487228,3c0201a0
+348722c,24422000
+3487230,afa20014
+3487234,3c110003
+3487238,362295c0
+348723c,afa20018
+3487240,c102751
+3487244,27a40010
+3487248,afa0001c
+348724c,3c020084
+3487250,24426000
+3487254,afa20020
+3487258,3402b400
+348725c,afa20024
+3487260,c102751
+3487264,27a4001c
+3487268,afa00028
+348726c,3c02007b
+3487270,3442d000
+3487274,afa2002c
+3487278,3c100008
+348727c,361088a0
+3487280,afb00030
+3487284,c102751
+3487288,27a40028
+348728c,afa00034
+3487290,3c0201a3
+3487294,3442c000
+3487298,afa20038
+348729c,24023b00
+34872a0,afa2003c
+34872a4,c102751
+34872a8,27a40034
+34872ac,afa00040
+34872b0,3c020085
+34872b4,3442e000
+34872b8,afa20044
+34872bc,24021d80
+34872c0,afa20048
+34872c4,c102751
+34872c8,27a40040
+34872cc,8fa20010
+34872d0,2631a300
+34872d4,518821
+34872d8,3c038041
+34872dc,ac71a478
+34872e0,24422980
+34872e4,3c038041
+34872e8,ac62a468
+34872ec,8fa20028
+34872f0,3c038041
+34872f4,ac62a458
+34872f8,3c038041
+34872fc,8fa4001c
+3487300,ac64a448
+3487304,3c048041
+3487308,3c038041
+348730c,2463db28
+3487310,ac83a428
+3487314,3c048041
+3487318,3c038041
+348731c,2463e328
+3487320,ac83a418
+3487324,2610f7a0
+3487328,501021
+348732c,3c038041
+3487330,ac62a408
+3487334,8fa20034
+3487338,24441e00
+348733c,3c038041
+3487340,ac64a3f8
+3487344,244435c0
+3487348,3c038041
+348734c,ac64a3e8
+3487350,8fa30040
+3487354,24631980
+3487358,3c048041
+348735c,ac83a3d8
+3487360,3c038041
+3487364,ac62a3c8
+3487368,3c118041
+348736c,c101bd3
+3487370,2624a438
+3487374,408025
+3487378,c102742
+348737c,402025
+3487380,104fc2
+3487384,1304821
+3487388,2a100002
+348738c,16000018
+3487390,ae22a438
+3487394,94843
+3487398,3c038041
+348739c,2463c660
+34873a0,2025
+34873a4,3025
+34873a8,2204025
+34873ac,2407fff0
+34873b0,8d05a438
+34873b4,a42821
+34873b8,90620000
+34873bc,21102
+34873c0,471025
+34873c4,a0a20000
+34873c8,8d02a438
+34873cc,441021
+34873d0,90650000
+34873d4,a72825
+34873d8,a0450001
+34873dc,24c60001
+34873e0,24630001
+34873e4,c9102a
+34873e8,1440fff1
+34873ec,24840002
+34873f0,8fbf005c
+34873f4,8fb10058
+34873f8,8fb00054
+34873fc,3e00008
+3487400,27bd0060
+3487404,3c038040
+3487408,9462084e
+348740c,2463084e
+3487410,94640002
+3487414,94630004
+3487418,3c058041
+348741c,8ca5b540
+3487420,a4a20000
+3487424,a4a40002
+3487428,a4a30004
+348742c,3c058041
+3487430,8ca6b53c
+3487434,a4c20000
+3487438,8ca5b53c
+348743c,a4a40004
+3487440,a4a30008
+3487444,240500ff
+3487448,1445000a
+348744c,3c058041
+3487450,24050046
+3487454,14850007
+3487458,3c058041
+348745c,24050032
+3487460,14650004
+3487464,3c058041
+3487468,1825
+348746c,2025
+3487470,240200c8
+3487474,8ca5b538
+3487478,a4a20000
+348747c,a4a40002
+3487480,a4a30004
+3487484,3c058041
+3487488,8ca5b534
+348748c,a4a20000
+3487490,a4a40002
+3487494,a4a30004
+3487498,3c028041
+348749c,8c43b530
+34874a0,3c028040
+34874a4,94450854
+34874a8,24420854
+34874ac,94440002
+34874b0,94420004
+34874b4,a4650000
+34874b8,a4640002
+34874bc,a4620004
+34874c0,3c028041
+34874c4,8c43b52c
+34874c8,3c028040
+34874cc,9445085a
+34874d0,2442085a
+34874d4,94440002
+34874d8,94420004
+34874dc,a4650000
+34874e0,a4640002
+34874e4,a4620004
+34874e8,3c028041
+34874ec,8c43b528
+34874f0,3c028040
+34874f4,94450860
+34874f8,24420860
+34874fc,94440002
+3487500,94420004
+3487504,a4650000
+3487508,a4640002
+348750c,a4620004
+3487510,3c028041
+3487514,8c42b524
+3487518,3c068040
+348751c,94c30872
+3487520,a4430000
+3487524,3c028041
+3487528,8c43b520
+348752c,24c20872
+3487530,94440002
+3487534,a4640000
+3487538,3c038041
+348753c,8c63b51c
+3487540,94440004
+3487544,a4640000
+3487548,3c038041
+348754c,8c63b518
+3487550,3c058040
+3487554,94a40878
+3487558,a4640000
+348755c,3c038041
+3487560,8c64b514
+3487564,24a30878
+3487568,94670002
+348756c,a4870000
+3487570,3c048041
+3487574,8c84b510
+3487578,94670004
+348757c,a4870000
+3487580,3c048041
+3487584,8c84b50c
+3487588,94c80872
+348758c,94470002
+3487590,94460004
+3487594,a4880000
+3487598,a4870002
+348759c,a4860004
+34875a0,3c048041
+34875a4,8c84b4fc
+34875a8,94a60878
+34875ac,94650002
+34875b0,94630004
+34875b4,a4860000
+34875b8,a4850002
+34875bc,a4830004
+34875c0,94420002
+34875c4,3043ffff
+34875c8,2c6300ce
+34875cc,50600001
+34875d0,240200cd
+34875d4,24420032
+34875d8,3047ffff
+34875dc,3c028040
+34875e0,94420876
+34875e4,3043ffff
+34875e8,2c6300ce
+34875ec,50600001
+34875f0,240200cd
+34875f4,24420032
+34875f8,3046ffff
+34875fc,3c028040
+3487600,94420878
+3487604,3043ffff
+3487608,2c6300ce
+348760c,50600001
+3487610,240200cd
+3487614,24420032
+3487618,3044ffff
+348761c,3c028040
+3487620,9442087a
+3487624,3043ffff
+3487628,2c6300ce
+348762c,50600001
+3487630,240200cd
+3487634,24420032
3487638,3043ffff
-348763c,2c6300ce
-3487640,50600001
-3487644,240200cd
-3487648,24420032
-348764c,3044ffff
-3487650,3c028040
-3487654,94420868
-3487658,3043ffff
-348765c,2c6300ce
-3487660,50600001
-3487664,240200cd
-3487668,24420032
-348766c,3043ffff
-3487670,3c028040
-3487674,9442086a
-3487678,3045ffff
-348767c,2ca500ce
-3487680,50a00001
-3487684,240200cd
-3487688,24420032
-348768c,3042ffff
-3487690,3c058041
-3487694,8ca5b148
-3487698,a4a40000
-348769c,a4a30002
-34876a0,a4a20004
-34876a4,3c058041
-34876a8,8ca5b140
-34876ac,a4a40000
-34876b0,a4a30002
-34876b4,3e00008
-34876b8,a4a20004
-34876bc,3c028011
-34876c0,3442a5d0
-34876c4,8c4200a0
-34876c8,21302
-34876cc,30420003
-34876d0,21840
-34876d4,621821
-34876d8,3c028041
-34876dc,24429e60
-34876e0,621821
-34876e4,90640000
-34876e8,42600
-34876ec,90620001
-34876f0,21400
-34876f4,822021
-34876f8,90620002
-34876fc,21200
-3487700,3e00008
-3487704,821021
-3487708,3c028041
-348770c,9042b200
-3487710,3e00008
-3487714,2102b
-3487718,3c038041
-348771c,9062b200
-3487720,24420001
-3487724,3e00008
-3487728,a062b200
-348772c,3c028041
-3487730,9042b200
-3487734,1040001b
-3487738,2442ffff
-348773c,27bdffd8
-3487740,afbf0024
-3487744,afb10020
-3487748,afb0001c
-348774c,3c038041
-3487750,a062b200
-3487754,3c108038
-3487758,3610e578
-348775c,24050014
-3487760,3c11801d
-3487764,200f809
-3487768,3624aa30
-348776c,24020014
-3487770,afa20014
-3487774,afa00010
-3487778,26100130
-348777c,3825
-3487780,24060003
-3487784,3625aa30
-3487788,200f809
-348778c,262484a0
-3487790,8fbf0024
-3487794,8fb10020
-3487798,8fb0001c
-348779c,3e00008
-34877a0,27bd0028
-34877a4,3e00008
-34877ac,3e00008
-34877b4,24020140
-34877b8,3e00008
-34877bc,a4821424
-34877c0,27bdffe0
-34877c4,afbf001c
-34877c8,afb10018
-34877cc,afb00014
-34877d0,808025
-34877d4,8c8208c4
-34877d8,24420001
-34877dc,c102598
-34877e0,ac8208c4
-34877e4,3c028041
-34877e8,9442b1b2
-34877ec,8e0308c4
-34877f0,1462001e
-34877f4,8fbf001c
-34877f8,920200b2
-34877fc,34420001
-3487800,a20200b2
-3487804,3c04801c
-3487808,348484a0
-348780c,3c110001
-3487810,918821
-3487814,86221e1a
-3487818,ae020000
-348781c,948200a4
-3487820,a6020066
-3487824,3c108009
-3487828,3602d894
-348782c,40f809
-3487830,261005d4
-3487834,3c04a34b
-3487838,200f809
-348783c,3484e820
-3487840,3c028011
-3487844,3442a5d0
-3487848,2403fff8
-348784c,a4431412
-3487850,240200a0
-3487854,a6221e1a
-3487858,24020014
-348785c,a2221e15
-3487860,24020001
-3487864,a2221e5e
-3487868,8fbf001c
-348786c,8fb10018
-3487870,8fb00014
-3487874,3e00008
-3487878,27bd0020
-348787c,8c8200a0
-3487880,34423000
-3487884,ac8200a0
-3487888,3c028041
-348788c,9042b203
-3487890,304200ff
-3487894,10400005
-3487898,52840
-348789c,3c028010
-34878a0,451021
-34878a4,94428cec
-34878a8,a4820034
-34878ac,3e00008
-34878b4,24020001
-34878b8,3e00008
-34878bc,a082003e
-34878c0,24020012
-34878c4,2406ffff
-34878c8,24070016
-34878cc,821821
-34878d0,80630074
-34878d4,54660004
-34878d8,24420001
-34878dc,822021
-34878e0,3e00008
-34878e4,a0850074
-34878e8,1447fff9
-34878ec,821821
-34878f0,3e00008
-34878f8,862021
-34878fc,908200a8
-3487900,a22825
-3487904,3e00008
-3487908,a08500a8
-348790c,852021
-3487910,908200bc
-3487914,21e00
-3487918,31e03
-348791c,4620001
-3487920,1025
-3487924,24420001
-3487928,3e00008
-348792c,a08200bc
-3487930,24020001
-3487934,a082003d
-3487938,24020014
-348793c,a08200cf
-3487940,24020140
-3487944,3e00008
-3487948,a4821424
-348794c,24020001
-3487950,a0820032
-3487954,a082003a
-3487958,24020030
-348795c,a48213f4
-3487960,3e00008
-3487964,a0820033
-3487968,24020002
-348796c,a0820032
-3487970,24020001
-3487974,a082003a
-3487978,a082003c
-348797c,24020060
-3487980,a48213f4
-3487984,3e00008
-3487988,a0820033
-348798c,24020007
+348763c,3c028040
+3487640,9442087c
+3487644,3045ffff
+3487648,2ca500ce
+348764c,50a00001
+3487650,240200cd
+3487654,24420032
+3487658,3c058041
+348765c,8ca8b508
+3487660,3c058040
+3487664,94a50872
+3487668,30a9ffff
+348766c,2d2900ce
+3487670,15200002
+3487674,3042ffff
+3487678,240500cd
+348767c,24a50032
+3487680,a5050000
+3487684,a5070002
+3487688,a5060004
+348768c,3c058041
+3487690,8ca5b4f8
+3487694,a4a40000
+3487698,a4a30002
+348769c,a4a20004
+34876a0,3c028041
+34876a4,8c43b500
+34876a8,3c028040
+34876ac,94450872
+34876b0,24420872
+34876b4,94440002
+34876b8,94420004
+34876bc,a4650000
+34876c0,a4640002
+34876c4,a4620004
+34876c8,3c028041
+34876cc,8c43b4f0
+34876d0,3c028040
+34876d4,94450878
+34876d8,24420878
+34876dc,94440002
+34876e0,94420004
+34876e4,a4650000
+34876e8,a4640002
+34876ec,a4620004
+34876f0,3c028041
+34876f4,8c43b4ec
+34876f8,3c028040
+34876fc,94460866
+3487700,24440866
+3487704,94850002
+3487708,94840004
+348770c,a4660000
+3487710,a4650002
+3487714,a4640004
+3487718,94420866
+348771c,3043ffff
+3487720,2c6300ce
+3487724,50600001
+3487728,240200cd
+348772c,24420032
+3487730,3044ffff
+3487734,3c028040
+3487738,94420868
+348773c,3043ffff
+3487740,2c6300ce
+3487744,50600001
+3487748,240200cd
+348774c,24420032
+3487750,3043ffff
+3487754,3c028040
+3487758,9442086a
+348775c,3045ffff
+3487760,2ca500ce
+3487764,50a00001
+3487768,240200cd
+348776c,24420032
+3487770,3042ffff
+3487774,3c058041
+3487778,8ca5b4e8
+348777c,a4a40000
+3487780,a4a30002
+3487784,a4a20004
+3487788,3c058041
+348778c,8ca5b4e0
+3487790,a4a40000
+3487794,a4a30002
+3487798,3e00008
+348779c,a4a20004
+34877a0,3c028011
+34877a4,3442a5d0
+34877a8,8c4200a0
+34877ac,21302
+34877b0,30420003
+34877b4,21840
+34877b8,621821
+34877bc,3c028041
+34877c0,2442a1c0
+34877c4,621821
+34877c8,90640000
+34877cc,42600
+34877d0,90620001
+34877d4,21400
+34877d8,822021
+34877dc,90620002
+34877e0,21200
+34877e4,3e00008
+34877e8,821021
+34877ec,3c028041
+34877f0,9042b5a4
+34877f4,3e00008
+34877f8,2102b
+34877fc,3c038041
+3487800,9062b5a4
+3487804,24420001
+3487808,3e00008
+348780c,a062b5a4
+3487810,3c028041
+3487814,9042b5a4
+3487818,1040001b
+348781c,2442ffff
+3487820,27bdffd8
+3487824,afbf0024
+3487828,afb10020
+348782c,afb0001c
+3487830,3c038041
+3487834,a062b5a4
+3487838,3c108038
+348783c,3610e578
+3487840,24050014
+3487844,3c11801d
+3487848,200f809
+348784c,3624aa30
+3487850,24020014
+3487854,afa20014
+3487858,afa00010
+348785c,26100130
+3487860,3825
+3487864,24060003
+3487868,3625aa30
+348786c,200f809
+3487870,262484a0
+3487874,8fbf0024
+3487878,8fb10020
+348787c,8fb0001c
+3487880,3e00008
+3487884,27bd0028
+3487888,3e00008
+3487890,3e00008
+3487898,24020140
+348789c,3e00008
+34878a0,a4821424
+34878a4,27bdffe0
+34878a8,afbf001c
+34878ac,afb10018
+34878b0,afb00014
+34878b4,808025
+34878b8,8c8208c4
+34878bc,24420001
+34878c0,c1025e0
+34878c4,ac8208c4
+34878c8,3c028041
+34878cc,9442b552
+34878d0,8e0308c4
+34878d4,1462001e
+34878d8,8fbf001c
+34878dc,920200b2
+34878e0,34420001
+34878e4,a20200b2
+34878e8,3c04801c
+34878ec,348484a0
+34878f0,3c110001
+34878f4,918821
+34878f8,86221e1a
+34878fc,ae020000
+3487900,948200a4
+3487904,a6020066
+3487908,3c108009
+348790c,3602d894
+3487910,40f809
+3487914,261005d4
+3487918,3c04a34b
+348791c,200f809
+3487920,3484e820
+3487924,3c028011
+3487928,3442a5d0
+348792c,2403fff8
+3487930,a4431412
+3487934,240200a0
+3487938,a6221e1a
+348793c,24020014
+3487940,a2221e15
+3487944,24020001
+3487948,a2221e5e
+348794c,8fbf001c
+3487950,8fb10018
+3487954,8fb00014
+3487958,3e00008
+348795c,27bd0020
+3487960,8c8200a0
+3487964,34423000
+3487968,ac8200a0
+348796c,3c028041
+3487970,9042b5a7
+3487974,304200ff
+3487978,10400005
+348797c,52840
+3487980,3c028010
+3487984,451021
+3487988,94428cec
+348798c,a4820034
3487990,3e00008
-3487994,a082007b
3487998,24020001
-348799c,a21004
-34879a0,8c8500a4
-34879a4,a22825
-34879a8,3e00008
-34879ac,ac8500a4
-34879b0,27bdffe8
-34879b4,afbf0014
-34879b8,c101dc6
-34879c0,8fbf0014
+348799c,3e00008
+34879a0,a082003e
+34879a4,24020012
+34879a8,2406ffff
+34879ac,24070016
+34879b0,821821
+34879b4,80630074
+34879b8,54660004
+34879bc,24420001
+34879c0,822021
34879c4,3e00008
-34879c8,27bd0018
-34879cc,24020010
-34879d0,a0820082
-34879d4,9082009a
-34879d8,2442000a
-34879dc,3e00008
-34879e0,a082009a
-34879e4,3c028041
-34879e8,9042b203
-34879ec,304200ff
-34879f0,10400005
-34879f4,52840
-34879f8,3c028010
-34879fc,451021
-3487a00,94428cec
-3487a04,a4820034
-3487a08,3e00008
-3487a10,3c028041
-3487a14,9042b202
-3487a18,1040000c
-3487a1c,3c028041
-3487a20,94820f06
-3487a24,34420040
-3487a28,a4820f06
-3487a2c,3c028041
-3487a30,9042b201
-3487a34,54400009
-3487a38,94820f06
-3487a3c,94820ef4
-3487a40,3042fb87
+34879c8,a0850074
+34879cc,1447fff9
+34879d0,821821
+34879d4,3e00008
+34879dc,862021
+34879e0,908200a8
+34879e4,a22825
+34879e8,3e00008
+34879ec,a08500a8
+34879f0,852021
+34879f4,908200bc
+34879f8,21e00
+34879fc,31e03
+3487a00,4620001
+3487a04,1025
+3487a08,24420001
+3487a0c,3e00008
+3487a10,a08200bc
+3487a14,24020001
+3487a18,a082003d
+3487a1c,24020014
+3487a20,a08200cf
+3487a24,24020140
+3487a28,3e00008
+3487a2c,a4821424
+3487a30,24020001
+3487a34,a0820032
+3487a38,a082003a
+3487a3c,24020030
+3487a40,a48213f4
3487a44,3e00008
-3487a48,a4820ef4
-3487a4c,9042b201
-3487a50,1040000c
-3487a58,94820f06
-3487a5c,34420080
-3487a60,a4820f06
-3487a64,94820ef6
-3487a68,24038f00
-3487a6c,431025
-3487a70,a4820ef6
-3487a74,94820ee4
-3487a78,2403f000
-3487a7c,431025
-3487a80,a4820ee4
-3487a84,3e00008
-3487a8c,2c8200cd
-3487a90,1040000b
-3487a94,41880
-3487a98,641021
-3487a9c,21080
-3487aa0,3c058041
-3487aa4,24a5a110
-3487aa8,a21021
-3487aac,80430000
-3487ab0,3182b
-3487ab4,31823
-3487ab8,3e00008
-3487abc,431024
+3487a48,a0820033
+3487a4c,24020002
+3487a50,a0820032
+3487a54,24020001
+3487a58,a082003a
+3487a5c,a082003c
+3487a60,24020060
+3487a64,a48213f4
+3487a68,3e00008
+3487a6c,a0820033
+3487a70,24020007
+3487a74,3e00008
+3487a78,a082007b
+3487a7c,24020001
+3487a80,a21004
+3487a84,8c8500a4
+3487a88,a22825
+3487a8c,3e00008
+3487a90,ac8500a4
+3487a94,27bdffe8
+3487a98,afbf0014
+3487a9c,c101dff
+3487aa4,8fbf0014
+3487aa8,3e00008
+3487aac,27bd0018
+3487ab0,24020010
+3487ab4,a0820082
+3487ab8,9082009a
+3487abc,2442000a
3487ac0,3e00008
-3487ac4,1025
-3487ac8,27bdffe0
-3487acc,afbf001c
-3487ad0,afb20018
-3487ad4,afb10014
-3487ad8,afb00010
-3487adc,808025
-3487ae0,3c128011
-3487ae4,3652a5d0
-3487ae8,c101ea3
-3487aec,2002025
-3487af0,2008825
-3487af4,8c420008
-3487af8,2002825
-3487afc,40f809
-3487b00,2402025
-3487b04,1622fff8
-3487b08,408025
-3487b0c,2201025
-3487b10,8fbf001c
-3487b14,8fb20018
-3487b18,8fb10014
-3487b1c,8fb00010
-3487b20,3e00008
-3487b24,27bd0020
-3487b28,27bdffe8
-3487b2c,afbf0014
-3487b30,8c82000c
-3487b34,84860012
-3487b38,84850010
-3487b3c,3c048011
-3487b40,40f809
-3487b44,3484a5d0
-3487b48,8fbf0014
-3487b4c,3e00008
-3487b50,27bd0018
-3487b54,3e00008
-3487b58,a01025
-3487b5c,8082007d
-3487b60,21027
-3487b64,2102b
+3487ac4,a082009a
+3487ac8,3c028041
+3487acc,9042b5a7
+3487ad0,304200ff
+3487ad4,10400005
+3487ad8,52840
+3487adc,3c028010
+3487ae0,451021
+3487ae4,94428cec
+3487ae8,a4820034
+3487aec,3e00008
+3487af4,3c028041
+3487af8,9042b5a6
+3487afc,1040000c
+3487b00,3c028041
+3487b04,94820f06
+3487b08,34420040
+3487b0c,a4820f06
+3487b10,3c028041
+3487b14,9042b5a5
+3487b18,54400009
+3487b1c,94820f06
+3487b20,94820ef4
+3487b24,3042fb87
+3487b28,3e00008
+3487b2c,a4820ef4
+3487b30,9042b5a5
+3487b34,1040000c
+3487b3c,94820f06
+3487b40,34420080
+3487b44,a4820f06
+3487b48,94820ef6
+3487b4c,24038f00
+3487b50,431025
+3487b54,a4820ef6
+3487b58,94820ee4
+3487b5c,2403f000
+3487b60,431025
+3487b64,a4820ee4
3487b68,3e00008
-3487b6c,24420008
-3487b70,8c8200a0
-3487b74,21182
-3487b78,30420007
-3487b7c,10400005
-3487b84,38420001
-3487b88,2102b
-3487b8c,3e00008
-3487b90,24420035
-3487b94,3e00008
-3487b98,24020054
-3487b9c,8c8200a0
-3487ba0,210c2
-3487ba4,30420007
-3487ba8,10400005
-3487bb0,38420001
-3487bb4,2102b
-3487bb8,3e00008
-3487bbc,24420033
-3487bc0,3e00008
-3487bc4,24020032
-3487bc8,8c8200a0
-3487bcc,30420007
-3487bd0,10400005
-3487bd8,38420001
-3487bdc,2102b
-3487be0,3e00008
-3487be4,24420030
-3487be8,3e00008
-3487bec,24020004
-3487bf0,8c8300a0
-3487bf4,31b82
-3487bf8,30630007
-3487bfc,10600005
-3487c00,24040001
-3487c04,14640004
-3487c08,2402007b
-3487c0c,3e00008
-3487c10,24020060
-3487c14,24020005
-3487c18,3e00008
-3487c20,8c8300a0
-3487c24,31b02
-3487c28,30630003
-3487c2c,10600005
-3487c30,24040001
-3487c34,14640004
-3487c38,240200c7
-3487c3c,3e00008
-3487c40,24020046
-3487c44,24020045
-3487c48,3e00008
-3487c50,8c8200a0
-3487c54,21242
-3487c58,30420007
-3487c5c,2102b
-3487c60,3e00008
-3487c64,24420037
-3487c68,8c8200a0
-3487c6c,21502
-3487c70,30420007
-3487c74,2c420002
-3487c78,2c420001
-3487c7c,3e00008
-3487c80,24420079
-3487c84,8c8200a0
-3487c88,21442
-3487c8c,30420007
-3487c90,2c420002
-3487c94,2c420001
-3487c98,3e00008
-3487c9c,24420077
-3487ca0,9082003a
-3487ca4,2102b
-3487ca8,3e00008
-3487cac,244200b9
-3487cb0,8083007c
-3487cb4,2402ffff
-3487cb8,50620007
-3487cbc,2402006b
-3487cc0,80830094
-3487cc4,28630006
-3487cc8,10600003
-3487ccc,2402006a
-3487cd0,3e00008
-3487cd4,24020003
-3487cd8,3e00008
-3487ce0,8083007b
-3487ce4,2402ffff
-3487ce8,10620003
+3487b70,2c8200cd
+3487b74,1040000b
+3487b78,41880
+3487b7c,641021
+3487b80,21080
+3487b84,3c058041
+3487b88,24a5a4b0
+3487b8c,a21021
+3487b90,80430000
+3487b94,3182b
+3487b98,31823
+3487b9c,3e00008
+3487ba0,431024
+3487ba4,3e00008
+3487ba8,1025
+3487bac,27bdffe0
+3487bb0,afbf001c
+3487bb4,afb20018
+3487bb8,afb10014
+3487bbc,afb00010
+3487bc0,808025
+3487bc4,3c128011
+3487bc8,3652a5d0
+3487bcc,c101edc
+3487bd0,2002025
+3487bd4,2008825
+3487bd8,8c420008
+3487bdc,2002825
+3487be0,40f809
+3487be4,2402025
+3487be8,1622fff8
+3487bec,408025
+3487bf0,2201025
+3487bf4,8fbf001c
+3487bf8,8fb20018
+3487bfc,8fb10014
+3487c00,8fb00010
+3487c04,3e00008
+3487c08,27bd0020
+3487c0c,27bdffe8
+3487c10,afbf0014
+3487c14,8c82000c
+3487c18,84860012
+3487c1c,84850010
+3487c20,3c048011
+3487c24,40f809
+3487c28,3484a5d0
+3487c2c,8fbf0014
+3487c30,3e00008
+3487c34,27bd0018
+3487c38,3e00008
+3487c3c,a01025
+3487c40,8082007d
+3487c44,21027
+3487c48,2102b
+3487c4c,3e00008
+3487c50,24420008
+3487c54,8c8200a0
+3487c58,21182
+3487c5c,30420007
+3487c60,10400005
+3487c68,38420001
+3487c6c,2102b
+3487c70,3e00008
+3487c74,24420035
+3487c78,3e00008
+3487c7c,24020054
+3487c80,8c8200a0
+3487c84,210c2
+3487c88,30420007
+3487c8c,10400005
+3487c94,38420001
+3487c98,2102b
+3487c9c,3e00008
+3487ca0,24420033
+3487ca4,3e00008
+3487ca8,24020032
+3487cac,8c8200a0
+3487cb0,30420007
+3487cb4,10400005
+3487cbc,38420001
+3487cc0,2102b
+3487cc4,3e00008
+3487cc8,24420030
+3487ccc,3e00008
+3487cd0,24020004
+3487cd4,8c8300a0
+3487cd8,31b82
+3487cdc,30630007
+3487ce0,10600005
+3487ce4,24040001
+3487ce8,14640004
+3487cec,2402007b
3487cf0,3e00008
-3487cf4,2402000c
-3487cf8,3e00008
-3487cfc,2402003b
-3487d00,8c8300a0
-3487d04,30630007
-3487d08,14600002
-3487d0c,a01025
-3487d10,2402004d
-3487d14,3e00008
-3487d1c,8c8300a0
-3487d20,30630038
-3487d24,14600002
-3487d28,a01025
-3487d2c,2402004d
-3487d30,3e00008
-3487d38,8c8300a0
-3487d3c,3c040001
-3487d40,3484c000
-3487d44,641824
-3487d48,14600002
-3487d4c,a01025
-3487d50,2402004d
-3487d54,3e00008
-3487d5c,94820eda
-3487d60,30420008
-3487d64,14400010
-3487d6c,80830086
-3487d70,2402001b
-3487d74,1062000e
-3487d7c,80830087
-3487d80,1062000d
-3487d88,80830088
-3487d8c,1062000c
-3487d90,2403001b
-3487d94,80840089
-3487d98,1483000a
-3487d9c,a01025
-3487da0,3e00008
-3487da4,240200c8
-3487da8,3e00008
-3487dac,240200c8
-3487db0,3e00008
-3487db4,240200c8
-3487db8,3e00008
-3487dbc,240200c8
-3487dc0,240200c8
-3487dc4,3e00008
-3487dcc,27bdffe8
-3487dd0,afbf0014
-3487dd4,c1026f5
-3487ddc,c101c4c
-3487de4,c10250e
-3487dec,c10191d
-3487df4,c102321
-3487dfc,8fbf0014
-3487e00,3e00008
-3487e04,27bd0018
-3487e08,27bdffe8
-3487e0c,afbf0014
-3487e10,c101ab3
-3487e18,c100fb0
-3487e20,c102244
-3487e28,c101cc8
-3487e30,c10143d
-3487e38,c101904
-3487e40,8fbf0014
-3487e44,3e00008
-3487e48,27bd0018
-3487e4c,27bdffe8
-3487e50,afbf0014
-3487e54,afb00010
-3487e58,3c10801c
-3487e5c,361084a0
-3487e60,8e040000
-3487e64,c1011a5
-3487e68,248402a8
-3487e6c,8e040000
-3487e70,c1025a2
-3487e74,248402a8
-3487e78,8fbf0014
-3487e7c,8fb00010
-3487e80,3e00008
-3487e84,27bd0018
-3487e88,27bdffe8
-3487e8c,afbf0014
-3487e90,c10190b
-3487e98,c1026f0
-3487ea0,c102334
-3487ea8,c101437
-3487eb0,8fbf0014
-3487eb4,3e00008
-3487eb8,27bd0018
-3487ebc,3c02801c
-3487ec0,344284a0
-3487ec4,3c030001
-3487ec8,431021
-3487ecc,84430988
-3487ed0,14600022
-3487ed4,3c02801c
-3487ed8,344284a0
-3487edc,3c030001
-3487ee0,431021
-3487ee4,84420992
-3487ee8,14400014
-3487eec,21840
-3487ef0,3c028011
-3487ef4,3442a5d0
-3487ef8,8c420004
-3487efc,14400009
-3487f00,3c028011
-3487f04,3442a5d0
-3487f08,8c4300a0
-3487f0c,3c020001
-3487f10,3442c007
-3487f14,621824
-3487f18,14600026
-3487f1c,24020001
-3487f20,3c028011
-3487f24,3442a5d0
-3487f28,8c4200a0
-3487f2c,21382
-3487f30,30420007
-3487f34,3e00008
-3487f38,2102b
-3487f3c,621821
-3487f40,3c028011
-3487f44,3442a5d0
-3487f48,8c4200a0
-3487f4c,621006
-3487f50,30420007
-3487f54,3e00008
-3487f58,2102b
-3487f5c,344284a0
-3487f60,3c040001
-3487f64,441021
-3487f68,84440992
-3487f6c,1480000a
-3487f70,3c028011
-3487f74,24020003
-3487f78,14620007
-3487f7c,3c028011
-3487f80,3442a5d0
-3487f84,8c42009c
-3487f88,3c03000c
-3487f8c,431024
-3487f90,3e00008
-3487f94,2102b
-3487f98,3442a5d0
-3487f9c,9442009c
-3487fa0,42080
-3487fa4,2463ffff
-3487fa8,832021
-3487fac,821007
-3487fb0,30420001
-3487fb4,3e00008
-3487fbc,27bdffe0
-3487fc0,afbf001c
-3487fc4,3c028040
-3487fc8,9042088b
-3487fcc,10400010
-3487fd0,3c028040
-3487fd4,2406000c
-3487fd8,3c028041
-3487fdc,8c45b204
-3487fe0,c102467
-3487fe4,27a40010
-3487fe8,3c028011
-3487fec,97a30010
-3487ff0,a4435dd2
-3487ff4,93a30012
-3487ff8,a0435dd4
-3487ffc,97a30010
-3488000,a4435dda
-3488004,93a30012
-3488008,a0435ddc
-348800c,3c028040
-3488010,9042088c
-3488014,10400010
-3488018,8fbf001c
-348801c,2406000a
-3488020,3c028041
-3488024,8c45b204
-3488028,c102467
-348802c,27a40010
-3488030,3c028011
-3488034,97a30010
-3488038,a4435dce
-348803c,93a30012
-3488040,a0435dd0
-3488044,97a30010
-3488048,a4435dd6
-348804c,93a30012
-3488050,a0435dd8
-3488054,8fbf001c
-3488058,3e00008
-348805c,27bd0020
-3488060,3c02801d
-3488064,3442aa30
-3488068,8c420678
-348806c,10400063
-3488074,8c430130
-3488078,10600060
-3488080,8c4201c8
-3488084,2c43001f
-3488088,1060005c
-3488090,27bdffd8
-3488094,afbf0024
-3488098,afb10020
-348809c,afb0001c
-34880a0,280c0
-34880a4,2028023
-34880a8,108080
-34880ac,2028023
-34880b0,108100
-34880b4,3c028011
-34880b8,2028021
-34880bc,3c028040
-34880c0,9042088d
-34880c4,10400018
-34880c8,2610572c
-34880cc,3c118041
-34880d0,24060006
-34880d4,8e25b204
-34880d8,c102467
-34880dc,27a40010
-34880e0,93a20010
-34880e4,a2020192
-34880e8,93a20011
-34880ec,a2020193
-34880f0,93a20012
-34880f4,a2020194
-34880f8,8e25b204
-34880fc,24060006
-3488100,24a5000c
-3488104,c102467
-3488108,27a40010
-348810c,93a20010
-3488110,a202019a
-3488114,93a20011
-3488118,a202019b
-348811c,93a20012
-3488120,1000000c
-3488124,a202019c
-3488128,3c028040
-348812c,9044087e
-3488130,a2040192
-3488134,2442087e
-3488138,90430001
-348813c,a2030193
-3488140,90420002
-3488144,a2020194
-3488148,a204019a
-348814c,a203019b
-3488150,a202019c
-3488154,3c028040
-3488158,9042088e
-348815c,10400018
-3488160,3c028040
-3488164,3c118041
-3488168,24060005
-348816c,8e25b204
-3488170,c102467
-3488174,27a40010
-3488178,93a20010
-348817c,a2020196
-3488180,93a20011
-3488184,a2020197
-3488188,93a20012
-348818c,a2020198
-3488190,8e25b204
-3488194,24060005
-3488198,24a5000a
-348819c,c102467
-34881a0,27a40010
-34881a4,93a20010
-34881a8,a202019e
-34881ac,93a20011
-34881b0,a202019f
-34881b4,93a20012
-34881b8,1000000b
-34881bc,a20201a0
-34881c0,90440881
-34881c4,a2040196
-34881c8,24420881
-34881cc,90430001
-34881d0,a2030197
-34881d4,90420002
-34881d8,a2020198
-34881dc,a204019e
-34881e0,a203019f
-34881e4,a20201a0
-34881e8,8fbf0024
-34881ec,8fb10020
-34881f0,8fb0001c
-34881f4,3e00008
-34881f8,27bd0028
-34881fc,3e00008
-3488204,27bdffd0
-3488208,afbf002c
-348820c,afb20028
-3488210,afb10024
-3488214,afb00020
-3488218,3c028040
-348821c,90430884
-3488220,240200fa
-3488224,14620008
-3488228,24100001
-348822c,3c028040
-3488230,24420884
-3488234,90500001
-3488238,90420002
-348823c,2028025
-3488240,321000ff
-3488244,10802b
+3487cf4,24020060
+3487cf8,24020005
+3487cfc,3e00008
+3487d04,8c8300a0
+3487d08,31b02
+3487d0c,30630003
+3487d10,10600005
+3487d14,24040001
+3487d18,14640004
+3487d1c,240200c7
+3487d20,3e00008
+3487d24,24020046
+3487d28,24020045
+3487d2c,3e00008
+3487d34,8c8200a0
+3487d38,21242
+3487d3c,30420007
+3487d40,2102b
+3487d44,3e00008
+3487d48,24420037
+3487d4c,8c8200a0
+3487d50,21502
+3487d54,30420007
+3487d58,2c420002
+3487d5c,2c420001
+3487d60,3e00008
+3487d64,24420079
+3487d68,8c8200a0
+3487d6c,21442
+3487d70,30420007
+3487d74,2c420002
+3487d78,2c420001
+3487d7c,3e00008
+3487d80,24420077
+3487d84,9082003a
+3487d88,2102b
+3487d8c,3e00008
+3487d90,244200b9
+3487d94,8083007c
+3487d98,2402ffff
+3487d9c,50620007
+3487da0,2402006b
+3487da4,80830094
+3487da8,28630006
+3487dac,10600003
+3487db0,2402006a
+3487db4,3e00008
+3487db8,24020003
+3487dbc,3e00008
+3487dc4,8083007b
+3487dc8,2402ffff
+3487dcc,10620003
+3487dd4,3e00008
+3487dd8,2402000c
+3487ddc,3e00008
+3487de0,2402003b
+3487de4,8c8300a0
+3487de8,30630007
+3487dec,14600002
+3487df0,a01025
+3487df4,2402004d
+3487df8,3e00008
+3487e00,8c8300a0
+3487e04,30630038
+3487e08,14600002
+3487e0c,a01025
+3487e10,2402004d
+3487e14,3e00008
+3487e1c,8c8300a0
+3487e20,3c040001
+3487e24,3484c000
+3487e28,641824
+3487e2c,14600002
+3487e30,a01025
+3487e34,2402004d
+3487e38,3e00008
+3487e40,94820eda
+3487e44,30420008
+3487e48,14400010
+3487e50,80830086
+3487e54,2402001b
+3487e58,1062000e
+3487e60,80830087
+3487e64,1062000d
+3487e6c,80830088
+3487e70,1062000c
+3487e74,2403001b
+3487e78,80840089
+3487e7c,1483000a
+3487e80,a01025
+3487e84,3e00008
+3487e88,240200c8
+3487e8c,3e00008
+3487e90,240200c8
+3487e94,3e00008
+3487e98,240200c8
+3487e9c,3e00008
+3487ea0,240200c8
+3487ea4,240200c8
+3487ea8,3e00008
+3487eb0,27bdffe8
+3487eb4,afbf0014
+3487eb8,c10273d
+3487ec0,c101c85
+3487ec8,c102556
+3487ed0,c101956
+3487ed8,c102369
+3487ee0,8fbf0014
+3487ee4,3e00008
+3487ee8,27bd0018
+3487eec,27bdffe8
+3487ef0,afbf0014
+3487ef4,c101aec
+3487efc,c100f8a
+3487f04,c10228c
+3487f0c,c101d01
+3487f14,c101416
+3487f1c,8fbf0014
+3487f20,3e00008
+3487f24,27bd0018
+3487f28,27bdffe8
+3487f2c,afbf0014
+3487f30,afb00010
+3487f34,3c10801c
+3487f38,361084a0
+3487f3c,8e040000
+3487f40,c10117e
+3487f44,248402a8
+3487f48,8e040000
+3487f4c,c1025ea
+3487f50,248402a8
+3487f54,c101904
+3487f5c,8fbf0014
+3487f60,8fb00010
+3487f64,3e00008
+3487f68,27bd0018
+3487f6c,27bdffe0
+3487f70,afbf001c
+3487f74,afb10018
+3487f78,afb00014
+3487f7c,808025
+3487f80,c102762
+3487f84,a08825
+3487f88,2202825
+3487f8c,c027368
+3487f90,2002025
+3487f94,8fbf001c
+3487f98,8fb10018
+3487f9c,8fb00014
+3487fa0,3e00008
+3487fa4,27bd0020
+3487fa8,27bdffe8
+3487fac,afbf0014
+3487fb0,c1018dd
+3487fb8,c102738
+3487fc0,c10237c
+3487fc8,c101410
+3487fd0,8fbf0014
+3487fd4,3e00008
+3487fd8,27bd0018
+3487fdc,3c02801c
+3487fe0,344284a0
+3487fe4,3c030001
+3487fe8,431021
+3487fec,84430988
+3487ff0,14600022
+3487ff4,3c02801c
+3487ff8,344284a0
+3487ffc,3c030001
+3488000,431021
+3488004,84420992
+3488008,14400014
+348800c,21840
+3488010,3c028011
+3488014,3442a5d0
+3488018,8c420004
+348801c,14400009
+3488020,3c028011
+3488024,3442a5d0
+3488028,8c4300a0
+348802c,3c020001
+3488030,3442c007
+3488034,621824
+3488038,14600026
+348803c,24020001
+3488040,3c028011
+3488044,3442a5d0
+3488048,8c4200a0
+348804c,21382
+3488050,30420007
+3488054,3e00008
+3488058,2102b
+348805c,621821
+3488060,3c028011
+3488064,3442a5d0
+3488068,8c4200a0
+348806c,621006
+3488070,30420007
+3488074,3e00008
+3488078,2102b
+348807c,344284a0
+3488080,3c040001
+3488084,441021
+3488088,84440992
+348808c,1480000a
+3488090,3c028011
+3488094,24020003
+3488098,14620007
+348809c,3c028011
+34880a0,3442a5d0
+34880a4,8c42009c
+34880a8,3c03000c
+34880ac,431024
+34880b0,3e00008
+34880b4,2102b
+34880b8,3442a5d0
+34880bc,9442009c
+34880c0,42080
+34880c4,2463ffff
+34880c8,832021
+34880cc,821007
+34880d0,30420001
+34880d4,3e00008
+34880dc,27bdffe0
+34880e0,afbf001c
+34880e4,3c028040
+34880e8,9042088b
+34880ec,10400010
+34880f0,3c028040
+34880f4,2406000c
+34880f8,3c028041
+34880fc,8c45b5a8
+3488100,c1024af
+3488104,27a40010
+3488108,3c028011
+348810c,97a30010
+3488110,a4435dd2
+3488114,93a30012
+3488118,a0435dd4
+348811c,97a30010
+3488120,a4435dda
+3488124,93a30012
+3488128,a0435ddc
+348812c,3c028040
+3488130,9042088c
+3488134,10400010
+3488138,8fbf001c
+348813c,2406000a
+3488140,3c028041
+3488144,8c45b5a8
+3488148,c1024af
+348814c,27a40010
+3488150,3c028011
+3488154,97a30010
+3488158,a4435dce
+348815c,93a30012
+3488160,a0435dd0
+3488164,97a30010
+3488168,a4435dd6
+348816c,93a30012
+3488170,a0435dd8
+3488174,8fbf001c
+3488178,3e00008
+348817c,27bd0020
+3488180,3c02801d
+3488184,3442aa30
+3488188,8c420678
+348818c,10400063
+3488194,8c430130
+3488198,10600060
+34881a0,8c4201c8
+34881a4,2c43001f
+34881a8,1060005c
+34881b0,27bdffd8
+34881b4,afbf0024
+34881b8,afb10020
+34881bc,afb0001c
+34881c0,280c0
+34881c4,2028023
+34881c8,108080
+34881cc,2028023
+34881d0,108100
+34881d4,3c028011
+34881d8,2028021
+34881dc,3c028040
+34881e0,9042088d
+34881e4,10400018
+34881e8,2610572c
+34881ec,3c118041
+34881f0,24060006
+34881f4,8e25b5a8
+34881f8,c1024af
+34881fc,27a40010
+3488200,93a20010
+3488204,a2020192
+3488208,93a20011
+348820c,a2020193
+3488210,93a20012
+3488214,a2020194
+3488218,8e25b5a8
+348821c,24060006
+3488220,24a5000c
+3488224,c1024af
+3488228,27a40010
+348822c,93a20010
+3488230,a202019a
+3488234,93a20011
+3488238,a202019b
+348823c,93a20012
+3488240,1000000c
+3488244,a202019c
3488248,3c028040
-348824c,90430887
-3488250,240200fa
-3488254,14620008
-3488258,24110001
-348825c,3c028040
-3488260,24420887
-3488264,90510001
-3488268,90420002
-348826c,2228825
-3488270,323100ff
-3488274,11882b
-3488278,3c128041
-348827c,24060009
-3488280,8e45b204
-3488284,c102467
-3488288,27a40010
-348828c,8e45b204
-3488290,24060009
-3488294,24a50012
-3488298,c102467
-348829c,27a40014
-34882a0,24060007
-34882a4,8e45b204
-34882a8,c102467
-34882ac,27a40018
-34882b0,8e45b204
-34882b4,24060007
-34882b8,24a5000e
-34882bc,c102467
-34882c0,27a4001c
-34882c4,3c02801c
-34882c8,344284a0
-34882cc,8c421c4c
-34882d0,10400064
-34882d4,8fbf002c
-34882d8,240500da
-34882dc,3c068011
-34882e0,24c65c3c
-34882e4,3c088040
-34882e8,3c078040
-34882ec,3c0a8040
-34882f0,254c0887
-34882f4,3c098040
-34882f8,252b0884
-34882fc,8c430130
-3488300,50600055
-3488304,8c420124
-3488308,84430000
-348830c,54650052
-3488310,8c420124
-3488314,8c43016c
-3488318,320c0
-348831c,832023
-3488320,42080
-3488324,832023
-3488328,42100
-348832c,2484faf0
-3488330,862021
-3488334,8c4d0170
-3488338,d18c0
-348833c,6d1823
-3488340,31880
-3488344,6d1823
-3488348,31900
-348834c,2463faf0
-3488350,910d088f
-3488354,11a0000e
-3488358,661821
-348835c,97ae0010
-3488360,a48e0192
-3488364,93ad0012
-3488368,a08d0194
-348836c,a46e0192
-3488370,a06d0194
-3488374,97ae0014
-3488378,a48e019a
-348837c,93ad0016
-3488380,a08d019c
-3488384,a46e019a
-3488388,10000012
-348838c,a06d019c
-3488390,12000011
-3488394,90ed0890
-3488398,912f0884
-348839c,a08f0192
-34883a0,916e0001
-34883a4,a08e0193
-34883a8,916d0002
-34883ac,a08d0194
-34883b0,a06f0192
-34883b4,a06e0193
-34883b8,a06d0194
-34883bc,a08f019a
-34883c0,a08e019b
-34883c4,a08d019c
-34883c8,a06f019a
-34883cc,a06e019b
-34883d0,a06d019c
-34883d4,90ed0890
-34883d8,11a0000d
-34883dc,97ae0018
-34883e0,a48e0196
-34883e4,93ad001a
-34883e8,a08d0198
-34883ec,a46e0196
-34883f0,a06d0198
-34883f4,97ae001c
-34883f8,a48e019e
-34883fc,93ad001e
-3488400,a08d01a0
-3488404,a46e019e
-3488408,10000012
-348840c,a06d01a0
-3488410,52200011
-3488414,8c420124
-3488418,914f0887
-348841c,a08f0196
-3488420,918e0001
-3488424,a08e0197
-3488428,918d0002
-348842c,a08d0198
-3488430,a06f0196
-3488434,a06e0197
-3488438,a06d0198
-348843c,a08f019e
-3488440,a08e019f
-3488444,a08d01a0
-3488448,a06f019e
-348844c,a06e019f
-3488450,a06d01a0
-3488454,8c420124
-3488458,5440ffa9
-348845c,8c430130
-3488460,8fbf002c
-3488464,8fb20028
-3488468,8fb10024
-348846c,8fb00020
-3488470,3e00008
-3488474,27bd0030
-3488478,27bdffd8
-348847c,afbf001c
-3488480,f7b40020
-3488484,3c028040
-3488488,9042088f
-348848c,1040000a
-3488490,46006506
-3488494,24060009
-3488498,3c028041
-348849c,8c45b204
-34884a0,c102467
-34884a4,27a40010
-34884a8,93a20010
-34884ac,93a30011
-34884b0,10000006
-34884b4,93a40012
-34884b8,3c048040
-34884bc,90820884
-34884c0,24840884
-34884c4,90830001
-34884c8,90840002
-34884cc,240500fa
-34884d0,14450043
-34884d4,642825
-34884d8,14a00041
-34884e0,3c028041
-34884e4,c4409eac
-34884e8,4600a002
-34884ec,3c028041
-34884f0,c4429eb0
-34884f4,46020000
-34884f8,3c028041
-34884fc,c4429eb4
-3488500,4600103e
-3488508,45030005
-348850c,46020001
-3488510,4600000d
-3488514,44020000
-3488518,10000006
-348851c,304200ff
-3488520,4600000d
-3488524,44020000
-3488528,3c038000
-348852c,431025
-3488530,304200ff
-3488534,3c038041
-3488538,c4609eb8
-348853c,4600a002
-3488540,3c038041
-3488544,c4629eb0
-3488548,46020000
-348854c,3c038041
-3488550,c4629eb4
-3488554,4600103e
-348855c,45030005
-3488560,46020001
-3488564,4600000d
-3488568,44030000
-348856c,10000006
-3488570,306300ff
-3488574,4600000d
-3488578,44030000
-348857c,3c048000
-3488580,641825
-3488584,306300ff
-3488588,3c048041
-348858c,c4809ebc
-3488590,4600a002
-3488594,3c048041
-3488598,c4829ec0
-348859c,46020000
-34885a0,3c048041
-34885a4,c4829eb4
-34885a8,4600103e
-34885b0,45030005
-34885b4,46020001
-34885b8,4600000d
-34885bc,44040000
-34885c0,10000040
-34885c4,308400ff
-34885c8,4600000d
-34885cc,44040000
-34885d0,3c058000
-34885d4,852025
-34885d8,1000003a
-34885dc,308400ff
-34885e0,44820000
-34885e8,46800020
-34885ec,46140002
-34885f0,3c028041
-34885f4,c4429eb4
-34885f8,4600103e
-3488600,45030005
-3488604,46020001
-3488608,4600000d
-348860c,44020000
-3488610,10000006
-3488614,304200ff
-3488618,4600000d
-348861c,44020000
-3488620,3c058000
-3488624,451025
-3488628,304200ff
-348862c,44830000
-3488634,46800020
-3488638,46140002
-348863c,3c038041
-3488640,c4629eb4
-3488644,4600103e
-348864c,45030005
-3488650,46020001
-3488654,4600000d
-3488658,44030000
-348865c,10000006
-3488660,306300ff
-3488664,4600000d
-3488668,44030000
-348866c,3c058000
-3488670,651825
-3488674,306300ff
-3488678,44840000
-3488680,46800020
-3488684,46140002
-3488688,3c048041
-348868c,c4829eb4
-3488690,4600103e
-3488698,45030005
-348869c,46020001
-34886a0,4600000d
-34886a4,44040000
-34886a8,10000006
-34886ac,308400ff
-34886b0,4600000d
-34886b4,44040000
-34886b8,3c058000
-34886bc,852025
-34886c0,308400ff
-34886c4,21600
-34886c8,42200
-34886cc,441025
-34886d0,31c00
-34886d4,431025
-34886d8,344200ff
-34886dc,8fbf001c
-34886e0,d7b40020
-34886e4,3e00008
-34886e8,27bd0028
-34886ec,27bdffd8
-34886f0,afbf0024
-34886f4,afb20020
-34886f8,afb1001c
-34886fc,afb00018
-3488700,3c02801c
-3488704,344284a0
-3488708,90421cda
-348870c,24030004
-3488710,10430015
-3488714,2c430005
-3488718,50600006
-348871c,2442fffb
-3488720,24030002
-3488724,50430008
-3488728,3c028040
-348872c,10000013
-3488730,3c028040
-3488734,304200fb
-3488738,54400010
-348873c,3c028040
-3488740,10000005
-3488744,3c028040
-3488748,90500891
-348874c,3c028040
-3488750,1000000d
-3488754,90510892
-3488758,90500893
-348875c,3c028040
-3488760,10000009
-3488764,90510894
-3488768,3c028040
-348876c,90500895
-3488770,3c028040
-3488774,10000004
-3488778,90510896
-348877c,90500897
-3488780,3c028040
-3488784,90510898
-3488788,2111025
-348878c,1040005b
-3488790,8fbf0024
-3488794,3c128041
-3488798,2406000e
-348879c,8e45b204
-34887a0,c102467
-34887a4,27a40010
-34887a8,2406000c
-34887ac,8e45b204
-34887b0,c102467
-34887b4,27a40014
-34887b8,1200000a
-34887bc,3c02801c
-34887c0,344284a0
-34887c4,90431cda
-34887c8,318c0
-34887cc,3c02800f
-34887d0,431021
-34887d4,97a30010
-34887d8,a4438214
-34887dc,93a30012
-34887e0,a0438216
-34887e4,1220000a
-34887e8,3c02801c
-34887ec,344284a0
-34887f0,90431cda
-34887f4,318c0
-34887f8,3c02800f
-34887fc,431021
-3488800,97a30014
-3488804,a4438218
-3488808,93a30016
-348880c,a043821a
-3488810,12000010
-3488814,3c02801d
-3488818,3c02801c
-348881c,344284a0
-3488820,97a30010
-3488824,a4431cf0
-3488828,93a30012
-348882c,a0431cf2
-3488830,97a30010
-3488834,a4431d04
-3488838,93a30012
-348883c,a0431d06
-3488840,97a30010
-3488844,a4431d18
-3488848,93a30012
-348884c,a0431d1a
-3488850,3c02801d
-3488854,3442aa30
-3488858,8c42067c
-348885c,10400027
-3488860,8fbf0024
-3488864,8c430130
-3488868,10600025
-348886c,8fb20020
-3488870,12000010
-3488874,24430234
-3488878,93a40010
-348887c,44840000
-3488884,46800020
-3488888,e4400234
-348888c,93a20011
-3488890,44820000
-3488898,46800020
-348889c,e4600004
-34888a0,93a20012
-34888a4,44820000
-34888ac,46800020
-34888b0,e4600008
-34888b4,12200011
-34888b8,8fbf0024
-34888bc,93a20014
-34888c0,44820000
-34888c8,46800020
-34888cc,e4600010
-34888d0,93a20015
-34888d4,44820000
-34888dc,46800020
-34888e0,e4600014
-34888e4,93a20016
-34888e8,44820000
-34888f0,46800020
-34888f4,e4600018
-34888f8,8fbf0024
-34888fc,8fb20020
-3488900,8fb1001c
-3488904,8fb00018
-3488908,3e00008
-348890c,27bd0028
-3488910,27bdffe8
-3488914,afbf0014
-3488918,3c038041
-348891c,8c62b204
-3488920,24420001
-3488924,c101fef
-3488928,ac62b204
-348892c,c102018
-3488934,c102081
-348893c,c1021bb
-3488944,8fbf0014
-3488948,3e00008
-348894c,27bd0018
-3488950,27bdffe8
-3488954,afbf0014
-3488958,801025
-348895c,2c430193
-3488960,10600006
-3488964,a02025
-3488968,210c0
-348896c,3c03800f
-3488970,34638ff8
-3488974,10000008
-3488978,431021
-348897c,2442fe6e
-3488980,21080
-3488984,2403fff8
-3488988,431024
-348898c,3c038040
-3488990,24630c9c
-3488994,621021
-3488998,8c450000
-348899c,8c460004
-34889a0,3c028000
-34889a4,24420df0
-34889a8,40f809
-34889ac,c53023
-34889b0,8fbf0014
-34889b4,3e00008
-34889b8,27bd0018
-34889bc,27bdffe8
-34889c0,afbf0014
-34889c4,801025
-34889c8,a02025
-34889cc,a4450000
-34889d0,c102254
-34889d4,8c450004
-34889d8,8fbf0014
-34889dc,3e00008
-34889e0,27bd0018
-34889e4,27bdffe8
-34889e8,afbf0014
-34889ec,afb00010
-34889f0,3c028041
-34889f4,2442c274
-34889f8,24450040
-34889fc,94430000
-3488a00,1064000b
-3488a04,408025
-3488a08,54600006
-3488a0c,24420008
-3488a10,802825
-3488a14,c10226f
-3488a18,402025
-3488a1c,10000005
-3488a20,2001025
-3488a24,5445fff6
-3488a28,94430000
-3488a2c,8025
-3488a30,2001025
-3488a34,8fbf0014
-3488a38,8fb00010
-3488a3c,3e00008
-3488a40,27bd0018
-3488a44,3c03801c
-3488a48,346384a0
-3488a4c,8c620000
-3488a50,8c860004
-3488a54,8c4502d0
-3488a58,24a70008
-3488a5c,ac4702d0
-3488a60,3c02db06
-3488a64,24420018
-3488a68,aca20000
-3488a6c,aca60004
-3488a70,8c650000
-3488a74,8c840004
-3488a78,8ca302c0
-3488a7c,24660008
-3488a80,aca602c0
-3488a84,ac620000
-3488a88,3e00008
-3488a8c,ac640004
-3488a90,27bdffe0
-3488a94,afbf0014
-3488a98,f7b40018
-3488a9c,3c02800a
-3488aa0,3442a78c
-3488aa4,40f809
-3488aa8,46006506
-3488aac,2442000c
-3488ab0,2025
-3488ab4,1000000a
-3488ab8,2405000c
-3488abc,c4600000
-3488ac0,46140002
-3488ac4,e4600000
-3488ac8,24630004
-3488acc,5462fffc
-3488ad0,c4600000
-3488ad4,24840004
-3488ad8,10850003
-3488adc,24420010
-3488ae0,1000fff6
-3488ae4,2443fff4
-3488ae8,8fbf0014
-3488aec,d7b40018
-3488af0,3e00008
-3488af4,27bd0020
-3488af8,27bdffd8
-3488afc,afbf0024
-3488b00,afb30020
-3488b04,afb2001c
-3488b08,afb10018
-3488b0c,afb00014
-3488b10,809825
-3488b14,a09025
-3488b18,c08025
-3488b1c,3c118002
-3488b20,26222438
-3488b24,3025
-3488b28,2002825
-3488b2c,40f809
-3488b30,2402025
-3488b34,26312554
-3488b38,3025
-3488b3c,2002825
-3488b40,220f809
-3488b44,2402025
-3488b48,2602825
-3488b4c,3c028005
-3488b50,244270c0
-3488b54,40f809
-3488b58,2002025
-3488b5c,8fbf0024
-3488b60,8fb30020
-3488b64,8fb2001c
-3488b68,8fb10018
-3488b6c,8fb00014
-3488b70,3e00008
-3488b74,27bd0028
-3488b78,44860000
-3488b7c,24020063
-3488b80,54820005
-3488b84,84a20000
-3488b88,3c028041
-3488b8c,c4429ec8
-3488b90,3e00008
-3488b94,46020002
-3488b98,240300f1
-3488b9c,54430008
-3488ba0,24030015
-3488ba4,24020046
-3488ba8,1082000d
-3488bac,2402002f
-3488bb0,1482000e
-3488bb4,3c028041
-3488bb8,3e00008
-3488bbc,c4409ec4
-3488bc0,1443000a
-3488bc4,24020011
-3488bc8,90a3001d
-3488bcc,14620007
-3488bd0,3c028041
-3488bd4,c4429ec8
-3488bd8,3e00008
-3488bdc,46020002
-3488be0,3c028041
-3488be4,3e00008
-3488be8,c4409ec4
-3488bec,3e00008
-3488bf4,27bdffd8
-3488bf8,afbf001c
-3488bfc,afb20018
-3488c00,afb10014
-3488c04,afb00010
-3488c08,f7b40020
-3488c0c,48202
-3488c10,afa40028
-3488c14,a08825
-3488c18,c09025
-3488c1c,4487a000
-3488c20,108600
-3488c24,108603
-3488c28,c102279
-3488c2c,42402
-3488c30,c102291
-3488c34,402025
-3488c38,4406a000
-3488c3c,2202825
-3488c40,c1022de
-3488c44,2002025
-3488c48,c1022a4
-3488c4c,46000306
-3488c50,2604ffff
-3488c54,2403025
-3488c58,2202825
-3488c5c,42600
-3488c60,c1022be
-3488c64,42603
-3488c68,8fbf001c
-3488c6c,8fb20018
-3488c70,8fb10014
-3488c74,8fb00010
-3488c78,d7b40020
-3488c7c,3e00008
-3488c80,27bd0028
-3488c84,27bdffe0
-3488c88,afbf001c
-3488c8c,afb10018
-3488c90,afb00014
-3488c94,3c108041
-3488c98,2610c274
-3488c9c,26110040
-3488ca0,a6000000
-3488ca4,c1026fa
-3488ca8,24041e70
-3488cac,ae020004
-3488cb0,26100008
-3488cb4,5611fffb
-3488cb8,a6000000
-3488cbc,8fbf001c
-3488cc0,8fb10018
-3488cc4,8fb00014
-3488cc8,3e00008
-3488ccc,27bd0020
-3488cd0,3c028041
-3488cd4,a440c274
-3488cd8,2442c274
-3488cdc,a4400008
-3488ce0,a4400010
-3488ce4,a4400018
-3488ce8,a4400020
-3488cec,a4400028
-3488cf0,a4400030
-3488cf4,3e00008
-3488cf8,a4400038
-3488cfc,27bdffe8
-3488d00,afbf0014
-3488d04,afb00010
-3488d08,afa5001c
-3488d0c,10a0000e
-3488d10,afa60020
-3488d14,808025
-3488d18,93a40023
-3488d1c,50800002
-3488d20,97a40020
-3488d24,3084ffff
-3488d28,c101eb2
-3488d30,c101ea3
-3488d34,402025
-3488d38,94430004
-3488d3c,a6030000
-3488d40,80420006
-3488d44,a2020002
-3488d48,8fbf0014
-3488d4c,8fb00010
-3488d50,3e00008
-3488d54,27bd0018
-3488d58,27bdffe0
-3488d5c,afbf001c
-3488d60,afb00018
-3488d64,808025
-3488d68,30e700ff
-3488d6c,90c600a5
-3488d70,c1019a8
-3488d74,27a40010
-3488d78,8fa50010
-3488d7c,8fa60014
-3488d80,c10233f
-3488d84,2002025
+348824c,9044087e
+3488250,a2040192
+3488254,2442087e
+3488258,90430001
+348825c,a2030193
+3488260,90420002
+3488264,a2020194
+3488268,a204019a
+348826c,a203019b
+3488270,a202019c
+3488274,3c028040
+3488278,9042088e
+348827c,10400018
+3488280,3c028040
+3488284,3c118041
+3488288,24060005
+348828c,8e25b5a8
+3488290,c1024af
+3488294,27a40010
+3488298,93a20010
+348829c,a2020196
+34882a0,93a20011
+34882a4,a2020197
+34882a8,93a20012
+34882ac,a2020198
+34882b0,8e25b5a8
+34882b4,24060005
+34882b8,24a5000a
+34882bc,c1024af
+34882c0,27a40010
+34882c4,93a20010
+34882c8,a202019e
+34882cc,93a20011
+34882d0,a202019f
+34882d4,93a20012
+34882d8,1000000b
+34882dc,a20201a0
+34882e0,90440881
+34882e4,a2040196
+34882e8,24420881
+34882ec,90430001
+34882f0,a2030197
+34882f4,90420002
+34882f8,a2020198
+34882fc,a204019e
+3488300,a203019f
+3488304,a20201a0
+3488308,8fbf0024
+348830c,8fb10020
+3488310,8fb0001c
+3488314,3e00008
+3488318,27bd0028
+348831c,3e00008
+3488324,27bdffd0
+3488328,afbf002c
+348832c,afb20028
+3488330,afb10024
+3488334,afb00020
+3488338,3c028040
+348833c,90430884
+3488340,240200fa
+3488344,14620008
+3488348,24100001
+348834c,3c028040
+3488350,24420884
+3488354,90500001
+3488358,90420002
+348835c,2028025
+3488360,321000ff
+3488364,10802b
+3488368,3c028040
+348836c,90430887
+3488370,240200fa
+3488374,14620008
+3488378,24110001
+348837c,3c028040
+3488380,24420887
+3488384,90510001
+3488388,90420002
+348838c,2228825
+3488390,323100ff
+3488394,11882b
+3488398,3c128041
+348839c,24060009
+34883a0,8e45b5a8
+34883a4,c1024af
+34883a8,27a40010
+34883ac,8e45b5a8
+34883b0,24060009
+34883b4,24a50012
+34883b8,c1024af
+34883bc,27a40014
+34883c0,24060007
+34883c4,8e45b5a8
+34883c8,c1024af
+34883cc,27a40018
+34883d0,8e45b5a8
+34883d4,24060007
+34883d8,24a5000e
+34883dc,c1024af
+34883e0,27a4001c
+34883e4,3c02801c
+34883e8,344284a0
+34883ec,8c421c4c
+34883f0,10400064
+34883f4,8fbf002c
+34883f8,240500da
+34883fc,3c068011
+3488400,24c65c3c
+3488404,3c088040
+3488408,3c078040
+348840c,3c0a8040
+3488410,254c0887
+3488414,3c098040
+3488418,252b0884
+348841c,8c430130
+3488420,50600055
+3488424,8c420124
+3488428,84430000
+348842c,54650052
+3488430,8c420124
+3488434,8c43016c
+3488438,320c0
+348843c,832023
+3488440,42080
+3488444,832023
+3488448,42100
+348844c,2484faf0
+3488450,862021
+3488454,8c4d0170
+3488458,d18c0
+348845c,6d1823
+3488460,31880
+3488464,6d1823
+3488468,31900
+348846c,2463faf0
+3488470,910d088f
+3488474,11a0000e
+3488478,661821
+348847c,97ae0010
+3488480,a48e0192
+3488484,93ad0012
+3488488,a08d0194
+348848c,a46e0192
+3488490,a06d0194
+3488494,97ae0014
+3488498,a48e019a
+348849c,93ad0016
+34884a0,a08d019c
+34884a4,a46e019a
+34884a8,10000012
+34884ac,a06d019c
+34884b0,12000011
+34884b4,90ed0890
+34884b8,912f0884
+34884bc,a08f0192
+34884c0,916e0001
+34884c4,a08e0193
+34884c8,916d0002
+34884cc,a08d0194
+34884d0,a06f0192
+34884d4,a06e0193
+34884d8,a06d0194
+34884dc,a08f019a
+34884e0,a08e019b
+34884e4,a08d019c
+34884e8,a06f019a
+34884ec,a06e019b
+34884f0,a06d019c
+34884f4,90ed0890
+34884f8,11a0000d
+34884fc,97ae0018
+3488500,a48e0196
+3488504,93ad001a
+3488508,a08d0198
+348850c,a46e0196
+3488510,a06d0198
+3488514,97ae001c
+3488518,a48e019e
+348851c,93ad001e
+3488520,a08d01a0
+3488524,a46e019e
+3488528,10000012
+348852c,a06d01a0
+3488530,52200011
+3488534,8c420124
+3488538,914f0887
+348853c,a08f0196
+3488540,918e0001
+3488544,a08e0197
+3488548,918d0002
+348854c,a08d0198
+3488550,a06f0196
+3488554,a06e0197
+3488558,a06d0198
+348855c,a08f019e
+3488560,a08e019f
+3488564,a08d01a0
+3488568,a06f019e
+348856c,a06e019f
+3488570,a06d01a0
+3488574,8c420124
+3488578,5440ffa9
+348857c,8c430130
+3488580,8fbf002c
+3488584,8fb20028
+3488588,8fb10024
+348858c,8fb00020
+3488590,3e00008
+3488594,27bd0030
+3488598,27bdffd8
+348859c,afbf001c
+34885a0,f7b40020
+34885a4,3c028040
+34885a8,9042088f
+34885ac,1040000a
+34885b0,46006506
+34885b4,24060009
+34885b8,3c028041
+34885bc,8c45b5a8
+34885c0,c1024af
+34885c4,27a40010
+34885c8,93a20010
+34885cc,93a30011
+34885d0,10000006
+34885d4,93a40012
+34885d8,3c048040
+34885dc,90820884
+34885e0,24840884
+34885e4,90830001
+34885e8,90840002
+34885ec,240500fa
+34885f0,14450043
+34885f4,642825
+34885f8,14a00041
+3488600,3c028041
+3488604,c440a20c
+3488608,4600a002
+348860c,3c028041
+3488610,c442a210
+3488614,46020000
+3488618,3c028041
+348861c,c442a214
+3488620,4600103e
+3488628,45030005
+348862c,46020001
+3488630,4600000d
+3488634,44020000
+3488638,10000006
+348863c,304200ff
+3488640,4600000d
+3488644,44020000
+3488648,3c038000
+348864c,431025
+3488650,304200ff
+3488654,3c038041
+3488658,c460a218
+348865c,4600a002
+3488660,3c038041
+3488664,c462a210
+3488668,46020000
+348866c,3c038041
+3488670,c462a214
+3488674,4600103e
+348867c,45030005
+3488680,46020001
+3488684,4600000d
+3488688,44030000
+348868c,10000006
+3488690,306300ff
+3488694,4600000d
+3488698,44030000
+348869c,3c048000
+34886a0,641825
+34886a4,306300ff
+34886a8,3c048041
+34886ac,c480a21c
+34886b0,4600a002
+34886b4,3c048041
+34886b8,c482a220
+34886bc,46020000
+34886c0,3c048041
+34886c4,c482a214
+34886c8,4600103e
+34886d0,45030005
+34886d4,46020001
+34886d8,4600000d
+34886dc,44040000
+34886e0,10000040
+34886e4,308400ff
+34886e8,4600000d
+34886ec,44040000
+34886f0,3c058000
+34886f4,852025
+34886f8,1000003a
+34886fc,308400ff
+3488700,44820000
+3488708,46800020
+348870c,46140002
+3488710,3c028041
+3488714,c442a214
+3488718,4600103e
+3488720,45030005
+3488724,46020001
+3488728,4600000d
+348872c,44020000
+3488730,10000006
+3488734,304200ff
+3488738,4600000d
+348873c,44020000
+3488740,3c058000
+3488744,451025
+3488748,304200ff
+348874c,44830000
+3488754,46800020
+3488758,46140002
+348875c,3c038041
+3488760,c462a214
+3488764,4600103e
+348876c,45030005
+3488770,46020001
+3488774,4600000d
+3488778,44030000
+348877c,10000006
+3488780,306300ff
+3488784,4600000d
+3488788,44030000
+348878c,3c058000
+3488790,651825
+3488794,306300ff
+3488798,44840000
+34887a0,46800020
+34887a4,46140002
+34887a8,3c048041
+34887ac,c482a214
+34887b0,4600103e
+34887b8,45030005
+34887bc,46020001
+34887c0,4600000d
+34887c4,44040000
+34887c8,10000006
+34887cc,308400ff
+34887d0,4600000d
+34887d4,44040000
+34887d8,3c058000
+34887dc,852025
+34887e0,308400ff
+34887e4,21600
+34887e8,42200
+34887ec,441025
+34887f0,31c00
+34887f4,431025
+34887f8,344200ff
+34887fc,8fbf001c
+3488800,d7b40020
+3488804,3e00008
+3488808,27bd0028
+348880c,27bdffd8
+3488810,afbf0024
+3488814,afb20020
+3488818,afb1001c
+348881c,afb00018
+3488820,3c02801c
+3488824,344284a0
+3488828,90421cda
+348882c,24030004
+3488830,10430015
+3488834,2c430005
+3488838,50600006
+348883c,2442fffb
+3488840,24030002
+3488844,50430008
+3488848,3c028040
+348884c,10000013
+3488850,3c028040
+3488854,304200fb
+3488858,54400010
+348885c,3c028040
+3488860,10000005
+3488864,3c028040
+3488868,90500891
+348886c,3c028040
+3488870,1000000d
+3488874,90510892
+3488878,90500893
+348887c,3c028040
+3488880,10000009
+3488884,90510894
+3488888,3c028040
+348888c,90500895
+3488890,3c028040
+3488894,10000004
+3488898,90510896
+348889c,90500897
+34888a0,3c028040
+34888a4,90510898
+34888a8,2111025
+34888ac,1040005b
+34888b0,8fbf0024
+34888b4,3c128041
+34888b8,2406000e
+34888bc,8e45b5a8
+34888c0,c1024af
+34888c4,27a40010
+34888c8,2406000c
+34888cc,8e45b5a8
+34888d0,c1024af
+34888d4,27a40014
+34888d8,1200000a
+34888dc,3c02801c
+34888e0,344284a0
+34888e4,90431cda
+34888e8,318c0
+34888ec,3c02800f
+34888f0,431021
+34888f4,97a30010
+34888f8,a4438214
+34888fc,93a30012
+3488900,a0438216
+3488904,1220000a
+3488908,3c02801c
+348890c,344284a0
+3488910,90431cda
+3488914,318c0
+3488918,3c02800f
+348891c,431021
+3488920,97a30014
+3488924,a4438218
+3488928,93a30016
+348892c,a043821a
+3488930,12000010
+3488934,3c02801d
+3488938,3c02801c
+348893c,344284a0
+3488940,97a30010
+3488944,a4431cf0
+3488948,93a30012
+348894c,a0431cf2
+3488950,97a30010
+3488954,a4431d04
+3488958,93a30012
+348895c,a0431d06
+3488960,97a30010
+3488964,a4431d18
+3488968,93a30012
+348896c,a0431d1a
+3488970,3c02801d
+3488974,3442aa30
+3488978,8c42067c
+348897c,10400027
+3488980,8fbf0024
+3488984,8c430130
+3488988,10600025
+348898c,8fb20020
+3488990,12000010
+3488994,24430234
+3488998,93a40010
+348899c,44840000
+34889a4,46800020
+34889a8,e4400234
+34889ac,93a20011
+34889b0,44820000
+34889b8,46800020
+34889bc,e4600004
+34889c0,93a20012
+34889c4,44820000
+34889cc,46800020
+34889d0,e4600008
+34889d4,12200011
+34889d8,8fbf0024
+34889dc,93a20014
+34889e0,44820000
+34889e8,46800020
+34889ec,e4600010
+34889f0,93a20015
+34889f4,44820000
+34889fc,46800020
+3488a00,e4600014
+3488a04,93a20016
+3488a08,44820000
+3488a10,46800020
+3488a14,e4600018
+3488a18,8fbf0024
+3488a1c,8fb20020
+3488a20,8fb1001c
+3488a24,8fb00018
+3488a28,3e00008
+3488a2c,27bd0028
+3488a30,27bdffe8
+3488a34,afbf0014
+3488a38,3c038041
+3488a3c,8c62b5a8
+3488a40,24420001
+3488a44,c102037
+3488a48,ac62b5a8
+3488a4c,c102060
+3488a54,c1020c9
+3488a5c,c102203
+3488a64,8fbf0014
+3488a68,3e00008
+3488a6c,27bd0018
+3488a70,27bdffe8
+3488a74,afbf0014
+3488a78,801025
+3488a7c,2c430193
+3488a80,10600006
+3488a84,a02025
+3488a88,210c0
+3488a8c,3c03800f
+3488a90,34638ff8
+3488a94,10000008
+3488a98,431021
+3488a9c,2442fe6e
+3488aa0,21080
+3488aa4,2403fff8
+3488aa8,431024
+3488aac,3c038040
+3488ab0,24630c9c
+3488ab4,621021
+3488ab8,8c450000
+3488abc,8c460004
+3488ac0,3c028000
+3488ac4,24420df0
+3488ac8,40f809
+3488acc,c53023
+3488ad0,8fbf0014
+3488ad4,3e00008
+3488ad8,27bd0018
+3488adc,27bdffe8
+3488ae0,afbf0014
+3488ae4,801025
+3488ae8,a02025
+3488aec,a4450000
+3488af0,c10229c
+3488af4,8c450004
+3488af8,8fbf0014
+3488afc,3e00008
+3488b00,27bd0018
+3488b04,27bdffe8
+3488b08,afbf0014
+3488b0c,afb00010
+3488b10,3c028041
+3488b14,2442c61c
+3488b18,24450040
+3488b1c,94430000
+3488b20,1064000b
+3488b24,408025
+3488b28,54600006
+3488b2c,24420008
+3488b30,802825
+3488b34,c1022b7
+3488b38,402025
+3488b3c,10000005
+3488b40,2001025
+3488b44,5445fff6
+3488b48,94430000
+3488b4c,8025
+3488b50,2001025
+3488b54,8fbf0014
+3488b58,8fb00010
+3488b5c,3e00008
+3488b60,27bd0018
+3488b64,3c03801c
+3488b68,346384a0
+3488b6c,8c620000
+3488b70,8c860004
+3488b74,8c4502d0
+3488b78,24a70008
+3488b7c,ac4702d0
+3488b80,3c02db06
+3488b84,24420018
+3488b88,aca20000
+3488b8c,aca60004
+3488b90,8c650000
+3488b94,8c840004
+3488b98,8ca302c0
+3488b9c,24660008
+3488ba0,aca602c0
+3488ba4,ac620000
+3488ba8,3e00008
+3488bac,ac640004
+3488bb0,27bdffe0
+3488bb4,afbf0014
+3488bb8,f7b40018
+3488bbc,3c02800a
+3488bc0,3442a78c
+3488bc4,40f809
+3488bc8,46006506
+3488bcc,2442000c
+3488bd0,2025
+3488bd4,1000000a
+3488bd8,2405000c
+3488bdc,c4600000
+3488be0,46140002
+3488be4,e4600000
+3488be8,24630004
+3488bec,5462fffc
+3488bf0,c4600000
+3488bf4,24840004
+3488bf8,10850003
+3488bfc,24420010
+3488c00,1000fff6
+3488c04,2443fff4
+3488c08,8fbf0014
+3488c0c,d7b40018
+3488c10,3e00008
+3488c14,27bd0020
+3488c18,27bdffd8
+3488c1c,afbf0024
+3488c20,afb30020
+3488c24,afb2001c
+3488c28,afb10018
+3488c2c,afb00014
+3488c30,809825
+3488c34,a09025
+3488c38,c08025
+3488c3c,3c118002
+3488c40,26222438
+3488c44,3025
+3488c48,2002825
+3488c4c,40f809
+3488c50,2402025
+3488c54,26312554
+3488c58,3025
+3488c5c,2002825
+3488c60,220f809
+3488c64,2402025
+3488c68,2602825
+3488c6c,3c028005
+3488c70,244270c0
+3488c74,40f809
+3488c78,2002025
+3488c7c,8fbf0024
+3488c80,8fb30020
+3488c84,8fb2001c
+3488c88,8fb10018
+3488c8c,8fb00014
+3488c90,3e00008
+3488c94,27bd0028
+3488c98,44860000
+3488c9c,24020063
+3488ca0,54820005
+3488ca4,84a20000
+3488ca8,3c028041
+3488cac,c442a228
+3488cb0,3e00008
+3488cb4,46020002
+3488cb8,240300f1
+3488cbc,54430008
+3488cc0,24030015
+3488cc4,24020046
+3488cc8,1082000d
+3488ccc,2402002f
+3488cd0,1482000e
+3488cd4,3c028041
+3488cd8,3e00008
+3488cdc,c440a224
+3488ce0,1443000a
+3488ce4,24020011
+3488ce8,90a3001d
+3488cec,14620007
+3488cf0,3c028041
+3488cf4,c442a228
+3488cf8,3e00008
+3488cfc,46020002
+3488d00,3c028041
+3488d04,3e00008
+3488d08,c440a224
+3488d0c,3e00008
+3488d14,27bdffd8
+3488d18,afbf001c
+3488d1c,afb20018
+3488d20,afb10014
+3488d24,afb00010
+3488d28,f7b40020
+3488d2c,48202
+3488d30,afa40028
+3488d34,a08825
+3488d38,c09025
+3488d3c,4487a000
+3488d40,108600
+3488d44,108603
+3488d48,c1022c1
+3488d4c,42402
+3488d50,c1022d9
+3488d54,402025
+3488d58,4406a000
+3488d5c,2202825
+3488d60,c102326
+3488d64,2002025
+3488d68,c1022ec
+3488d6c,46000306
+3488d70,2604ffff
+3488d74,2403025
+3488d78,2202825
+3488d7c,42600
+3488d80,c102306
+3488d84,42603
3488d88,8fbf001c
-3488d8c,8fb00018
-3488d90,3e00008
-3488d94,27bd0020
-3488d98,27bdffd8
-3488d9c,afbf0024
-3488da0,afb10020
-3488da4,afb0001c
-3488da8,808025
-3488dac,a08825
-3488db0,3c028041
-3488db4,8c429e6c
-3488db8,afa20010
-3488dbc,3825
-3488dc0,a03025
-3488dc4,802825
-3488dc8,c102356
-3488dcc,27a40010
-3488dd0,3c028041
-3488dd4,8c479ecc
-3488dd8,2203025
-3488ddc,2002825
-3488de0,c1022fd
-3488de4,8fa40010
-3488de8,8fbf0024
-3488dec,8fb10020
-3488df0,8fb0001c
-3488df4,3e00008
-3488df8,27bd0028
-3488dfc,27bdffd8
-3488e00,afbf0024
-3488e04,afb10020
-3488e08,afb0001c
-3488e0c,808025
-3488e10,9083001d
-3488e14,24020011
-3488e18,10620007
-3488e1c,a08825
-3488e20,3c028001
-3488e24,24423268
-3488e28,40f809
-3488e30,10000010
-3488e34,8fbf0024
-3488e38,3c028041
-3488e3c,8c429e70
-3488e40,afa20010
-3488e44,3825
-3488e48,a03025
-3488e4c,802825
-3488e50,c102356
-3488e54,27a40010
-3488e58,3c028041
-3488e5c,8c479ecc
-3488e60,2203025
-3488e64,2002825
-3488e68,c1022fd
-3488e6c,8fa40010
-3488e70,8fbf0024
-3488e74,8fb10020
-3488e78,8fb0001c
-3488e7c,3e00008
-3488e80,27bd0028
-3488e84,27bdffd8
-3488e88,afbf0024
-3488e8c,afb10020
-3488e90,afb0001c
-3488e94,808025
-3488e98,a08825
-3488e9c,3c028041
-3488ea0,8c429e74
-3488ea4,afa20010
-3488ea8,2407004f
-3488eac,a03025
-3488eb0,802825
-3488eb4,c102356
-3488eb8,27a40010
-3488ebc,3c028041
-3488ec0,8c479ed0
-3488ec4,2203025
-3488ec8,2002825
-3488ecc,c1022fd
-3488ed0,8fa40010
-3488ed4,8fbf0024
-3488ed8,8fb10020
-3488edc,8fb0001c
-3488ee0,3e00008
-3488ee4,27bd0028
-3488ee8,27bdffd8
-3488eec,afbf0024
-3488ef0,afb10020
-3488ef4,afb0001c
-3488ef8,808025
-3488efc,a08825
-3488f00,3c028041
-3488f04,8c429e78
-3488f08,afa20010
-3488f0c,3825
-3488f10,a03025
-3488f14,802825
-3488f18,c102356
-3488f1c,27a40010
-3488f20,3c028041
-3488f24,8c479ed4
-3488f28,2203025
-3488f2c,2002825
-3488f30,c1022fd
-3488f34,8fa40010
-3488f38,8fbf0024
-3488f3c,8fb10020
-3488f40,8fb0001c
-3488f44,3e00008
-3488f48,27bd0028
-3488f4c,27bdffd8
-3488f50,afbf0024
-3488f54,afb10020
-3488f58,afb0001c
-3488f5c,808025
-3488f60,a08825
-3488f64,3c028041
-3488f68,8c429e7c
-3488f6c,afa20010
-3488f70,2407000c
-3488f74,a03025
-3488f78,802825
-3488f7c,c102356
-3488f80,27a40010
-3488f84,3c028041
-3488f88,8c479ed8
-3488f8c,2203025
-3488f90,2002825
-3488f94,c1022fd
-3488f98,8fa40010
-3488f9c,8fbf0024
-3488fa0,8fb10020
-3488fa4,8fb0001c
-3488fa8,3e00008
-3488fac,27bd0028
-3488fb0,27bdffd0
-3488fb4,afbf002c
-3488fb8,afb10028
-3488fbc,afb00024
-3488fc0,808025
-3488fc4,afa00010
-3488fc8,afa00014
-3488fcc,9482001c
-3488fd0,24030001
-3488fd4,14430008
-3488fd8,a08825
-3488fdc,24070015
-3488fe0,90a600a5
-3488fe4,802825
-3488fe8,c1019a8
-3488fec,27a40010
-3488ff0,10000012
-3488ff4,afa00018
-3488ff8,24030007
-3488ffc,14430008
-3489000,24030a0c
-3489004,24070058
-3489008,90a600a5
-348900c,802825
-3489010,c1019a8
-3489014,27a40010
-3489018,10000008
-348901c,afa00018
-3489020,54430006
-3489024,afa00018
-3489028,3c050010
-348902c,34a5010a
-3489030,c101980
-3489034,27a40010
-3489038,afa00018
-348903c,8fa50010
-3489040,8fa60014
-3489044,c10233f
-3489048,27a40018
-348904c,97a20018
-3489050,10400008
-3489054,2203025
-3489058,3c028041
-348905c,8c479ec4
-3489060,2002825
-3489064,c1022fd
-3489068,8fa40018
-348906c,10000005
-3489070,8fbf002c
-3489074,2002825
-3489078,c1022be
-348907c,82040141
-3489080,8fbf002c
-3489084,8fb10028
-3489088,8fb00024
-348908c,3e00008
-3489090,27bd0030
-3489094,27bdffd0
-3489098,afbf002c
-348909c,afb10028
-34890a0,afb00024
-34890a4,808025
-34890a8,afa00010
-34890ac,afa00014
-34890b0,9482001c
-34890b4,10400004
-34890b8,a08825
-34890bc,24030005
-34890c0,54430007
-34890c4,afa00018
-34890c8,24070034
-34890cc,922600a5
-34890d0,2002825
-34890d4,c1019a8
-34890d8,27a40010
-34890dc,afa00018
-34890e0,8fa50010
-34890e4,8fa60014
-34890e8,c10233f
-34890ec,27a40018
-34890f0,97a20018
-34890f4,10400008
-34890f8,2203025
-34890fc,3c028041
-3489100,8c479ec4
-3489104,2002825
-3489108,c1022fd
-348910c,8fa40018
-3489110,10000005
-3489114,8fbf002c
-3489118,2002825
-348911c,c1022be
-3489120,82040147
-3489124,8fbf002c
-3489128,8fb10028
-348912c,8fb00024
-3489130,3e00008
-3489134,27bd0030
-3489138,27bdffd8
-348913c,afbf0024
-3489140,afb10020
-3489144,afb0001c
-3489148,808025
-348914c,a08825
-3489150,3c028041
-3489154,8c429e6c
-3489158,afa20010
-348915c,2407003e
-3489160,a03025
-3489164,802825
-3489168,c102356
-348916c,27a40010
-3489170,3c028041
-3489174,8c479ec4
-3489178,2203025
-348917c,2002825
-3489180,c1022fd
-3489184,8fa40010
-3489188,8fbf0024
-348918c,8fb10020
-3489190,8fb0001c
-3489194,3e00008
-3489198,27bd0028
-348919c,801025
-34891a0,14c00002
-34891a4,a6001b
-34891a8,7000d
-34891ac,2810
-34891b0,3812
-34891b4,3c03aaaa
-34891b8,3463aaab
-34891bc,e30019
-34891c0,1810
-34891c4,31882
-34891c8,32040
-34891cc,831821
-34891d0,31840
-34891d4,e31823
-34891d8,44850000
-34891dc,4a10004
-34891e0,468000a1
-34891e4,3c048041
-34891e8,d4809ee8
-34891ec,46201080
-34891f0,462010a0
-34891f4,44860000
-34891f8,4c10004
-34891fc,46800021
-3489200,3c048041
-3489204,d4849ee8
-3489208,46240000
-348920c,46200020
-3489210,46001083
-3489214,3c048041
-3489218,c4849edc
-348921c,46022101
-3489220,24640001
-3489224,3c068041
-3489228,24c69e80
-348922c,32840
-3489230,a32821
-3489234,c52821
-3489238,90a50001
-348923c,44850000
-3489244,46800020
-3489248,46040002
-348924c,42840
-3489250,a42821
-3489254,c53021
-3489258,90c50001
-348925c,44853000
-3489264,468031a0
-3489268,46023182
-348926c,46060000
-3489270,3c058041
-3489274,c4a69ee0
-3489278,4600303e
-3489280,45030005
-3489284,46060001
-3489288,4600000d
-348928c,44050000
-3489290,10000006
-3489294,30a700ff
-3489298,4600000d
-348929c,44050000
-34892a0,3c068000
-34892a4,a62825
-34892a8,30a700ff
-34892ac,3c068041
-34892b0,24c69e80
-34892b4,32840
-34892b8,a32821
-34892bc,c52821
-34892c0,90a50002
-34892c4,44850000
-34892cc,46800020
-34892d0,46040002
-34892d4,42840
-34892d8,a42821
-34892dc,c53021
-34892e0,90c50002
-34892e4,44853000
-34892ec,468031a0
-34892f0,46023182
-34892f4,46060000
-34892f8,3c058041
-34892fc,c4a69ee0
-3489300,4600303e
-3489308,45030005
-348930c,46060001
-3489310,4600000d
-3489314,44050000
-3489318,10000006
-348931c,30a600ff
-3489320,4600000d
-3489324,44050000
-3489328,3c068000
-348932c,a62825
-3489330,30a600ff
-3489334,32840
-3489338,a31821
-348933c,3c088041
-3489340,25089e80
-3489344,681821
-3489348,90650000
-348934c,44850000
-3489354,46800020
-3489358,46040002
-348935c,41840
-3489360,641821
-3489364,681821
-3489368,90630000
-348936c,44832000
-3489374,46802120
-3489378,46022082
-348937c,46020000
-3489380,3c038041
-3489384,c4629ee0
-3489388,4600103e
-3489390,45030005
-3489394,46020001
-3489398,4600000d
-348939c,44030000
-34893a0,10000006
-34893a4,a0430000
+3488d8c,8fb20018
+3488d90,8fb10014
+3488d94,8fb00010
+3488d98,d7b40020
+3488d9c,3e00008
+3488da0,27bd0028
+3488da4,27bdffe0
+3488da8,afbf001c
+3488dac,afb10018
+3488db0,afb00014
+3488db4,3c108041
+3488db8,2610c61c
+3488dbc,26110040
+3488dc0,a6000000
+3488dc4,c102742
+3488dc8,24041e70
+3488dcc,ae020004
+3488dd0,26100008
+3488dd4,5611fffb
+3488dd8,a6000000
+3488ddc,8fbf001c
+3488de0,8fb10018
+3488de4,8fb00014
+3488de8,3e00008
+3488dec,27bd0020
+3488df0,3c028041
+3488df4,a440c61c
+3488df8,2442c61c
+3488dfc,a4400008
+3488e00,a4400010
+3488e04,a4400018
+3488e08,a4400020
+3488e0c,a4400028
+3488e10,a4400030
+3488e14,3e00008
+3488e18,a4400038
+3488e1c,27bdffe8
+3488e20,afbf0014
+3488e24,afb00010
+3488e28,afa5001c
+3488e2c,10a0000e
+3488e30,afa60020
+3488e34,808025
+3488e38,93a40023
+3488e3c,50800002
+3488e40,97a40020
+3488e44,3084ffff
+3488e48,c101eeb
+3488e50,c101edc
+3488e54,402025
+3488e58,94430004
+3488e5c,a6030000
+3488e60,80420006
+3488e64,a2020002
+3488e68,8fbf0014
+3488e6c,8fb00010
+3488e70,3e00008
+3488e74,27bd0018
+3488e78,27bdffe0
+3488e7c,afbf001c
+3488e80,afb00018
+3488e84,808025
+3488e88,30e700ff
+3488e8c,90c600a5
+3488e90,c1019e1
+3488e94,27a40010
+3488e98,8fa50010
+3488e9c,8fa60014
+3488ea0,c102387
+3488ea4,2002025
+3488ea8,8fbf001c
+3488eac,8fb00018
+3488eb0,3e00008
+3488eb4,27bd0020
+3488eb8,27bdffd8
+3488ebc,afbf0024
+3488ec0,afb10020
+3488ec4,afb0001c
+3488ec8,808025
+3488ecc,a08825
+3488ed0,3c028041
+3488ed4,8c42a1cc
+3488ed8,afa20010
+3488edc,3825
+3488ee0,a03025
+3488ee4,802825
+3488ee8,c10239e
+3488eec,27a40010
+3488ef0,3c028041
+3488ef4,8c47a22c
+3488ef8,2203025
+3488efc,2002825
+3488f00,c102345
+3488f04,8fa40010
+3488f08,8fbf0024
+3488f0c,8fb10020
+3488f10,8fb0001c
+3488f14,3e00008
+3488f18,27bd0028
+3488f1c,27bdffd8
+3488f20,afbf0024
+3488f24,afb10020
+3488f28,afb0001c
+3488f2c,808025
+3488f30,9083001d
+3488f34,24020011
+3488f38,10620007
+3488f3c,a08825
+3488f40,3c028001
+3488f44,24423268
+3488f48,40f809
+3488f50,10000010
+3488f54,8fbf0024
+3488f58,3c028041
+3488f5c,8c42a1d0
+3488f60,afa20010
+3488f64,3825
+3488f68,a03025
+3488f6c,802825
+3488f70,c10239e
+3488f74,27a40010
+3488f78,3c028041
+3488f7c,8c47a22c
+3488f80,2203025
+3488f84,2002825
+3488f88,c102345
+3488f8c,8fa40010
+3488f90,8fbf0024
+3488f94,8fb10020
+3488f98,8fb0001c
+3488f9c,3e00008
+3488fa0,27bd0028
+3488fa4,27bdffd8
+3488fa8,afbf0024
+3488fac,afb10020
+3488fb0,afb0001c
+3488fb4,808025
+3488fb8,a08825
+3488fbc,3c028041
+3488fc0,8c42a1d4
+3488fc4,afa20010
+3488fc8,2407004f
+3488fcc,a03025
+3488fd0,802825
+3488fd4,c10239e
+3488fd8,27a40010
+3488fdc,3c028041
+3488fe0,8c47a230
+3488fe4,2203025
+3488fe8,2002825
+3488fec,c102345
+3488ff0,8fa40010
+3488ff4,8fbf0024
+3488ff8,8fb10020
+3488ffc,8fb0001c
+3489000,3e00008
+3489004,27bd0028
+3489008,27bdffd8
+348900c,afbf0024
+3489010,afb10020
+3489014,afb0001c
+3489018,808025
+348901c,a08825
+3489020,3c028041
+3489024,8c42a1d8
+3489028,afa20010
+348902c,3825
+3489030,a03025
+3489034,802825
+3489038,c10239e
+348903c,27a40010
+3489040,3c028041
+3489044,8c47a234
+3489048,2203025
+348904c,2002825
+3489050,c102345
+3489054,8fa40010
+3489058,8fbf0024
+348905c,8fb10020
+3489060,8fb0001c
+3489064,3e00008
+3489068,27bd0028
+348906c,27bdffd8
+3489070,afbf0024
+3489074,afb10020
+3489078,afb0001c
+348907c,808025
+3489080,a08825
+3489084,3c028041
+3489088,8c42a1dc
+348908c,afa20010
+3489090,2407000c
+3489094,a03025
+3489098,802825
+348909c,c10239e
+34890a0,27a40010
+34890a4,3c028041
+34890a8,8c47a238
+34890ac,2203025
+34890b0,2002825
+34890b4,c102345
+34890b8,8fa40010
+34890bc,8fbf0024
+34890c0,8fb10020
+34890c4,8fb0001c
+34890c8,3e00008
+34890cc,27bd0028
+34890d0,27bdffd0
+34890d4,afbf002c
+34890d8,afb10028
+34890dc,afb00024
+34890e0,808025
+34890e4,afa00010
+34890e8,afa00014
+34890ec,9482001c
+34890f0,24030001
+34890f4,14430008
+34890f8,a08825
+34890fc,24070015
+3489100,90a600a5
+3489104,802825
+3489108,c1019e1
+348910c,27a40010
+3489110,10000012
+3489114,afa00018
+3489118,24030007
+348911c,14430008
+3489120,24030a0c
+3489124,24070058
+3489128,90a600a5
+348912c,802825
+3489130,c1019e1
+3489134,27a40010
+3489138,10000008
+348913c,afa00018
+3489140,54430006
+3489144,afa00018
+3489148,3c050010
+348914c,34a5010a
+3489150,c1019b9
+3489154,27a40010
+3489158,afa00018
+348915c,8fa50010
+3489160,8fa60014
+3489164,c102387
+3489168,27a40018
+348916c,97a20018
+3489170,10400008
+3489174,2203025
+3489178,3c028041
+348917c,8c47a224
+3489180,2002825
+3489184,c102345
+3489188,8fa40018
+348918c,10000005
+3489190,8fbf002c
+3489194,2002825
+3489198,c102306
+348919c,82040141
+34891a0,8fbf002c
+34891a4,8fb10028
+34891a8,8fb00024
+34891ac,3e00008
+34891b0,27bd0030
+34891b4,27bdffd0
+34891b8,afbf002c
+34891bc,afb10028
+34891c0,afb00024
+34891c4,808025
+34891c8,afa00010
+34891cc,afa00014
+34891d0,9482001c
+34891d4,10400004
+34891d8,a08825
+34891dc,24030005
+34891e0,54430007
+34891e4,afa00018
+34891e8,24070034
+34891ec,922600a5
+34891f0,2002825
+34891f4,c1019e1
+34891f8,27a40010
+34891fc,afa00018
+3489200,8fa50010
+3489204,8fa60014
+3489208,c102387
+348920c,27a40018
+3489210,97a20018
+3489214,10400008
+3489218,2203025
+348921c,3c028041
+3489220,8c47a224
+3489224,2002825
+3489228,c102345
+348922c,8fa40018
+3489230,10000005
+3489234,8fbf002c
+3489238,2002825
+348923c,c102306
+3489240,82040147
+3489244,8fbf002c
+3489248,8fb10028
+348924c,8fb00024
+3489250,3e00008
+3489254,27bd0030
+3489258,27bdffd8
+348925c,afbf0024
+3489260,afb10020
+3489264,afb0001c
+3489268,808025
+348926c,a08825
+3489270,3c028041
+3489274,8c42a1cc
+3489278,afa20010
+348927c,2407003e
+3489280,a03025
+3489284,802825
+3489288,c10239e
+348928c,27a40010
+3489290,3c028041
+3489294,8c47a224
+3489298,2203025
+348929c,2002825
+34892a0,c102345
+34892a4,8fa40010
+34892a8,8fbf0024
+34892ac,8fb10020
+34892b0,8fb0001c
+34892b4,3e00008
+34892b8,27bd0028
+34892bc,801025
+34892c0,14c00002
+34892c4,a6001b
+34892c8,7000d
+34892cc,2810
+34892d0,3812
+34892d4,3c03aaaa
+34892d8,3463aaab
+34892dc,e30019
+34892e0,1810
+34892e4,31882
+34892e8,32040
+34892ec,831821
+34892f0,31840
+34892f4,e31823
+34892f8,44850000
+34892fc,4a10004
+3489300,468000a1
+3489304,3c048041
+3489308,d480a248
+348930c,46201080
+3489310,462010a0
+3489314,44860000
+3489318,4c10004
+348931c,46800021
+3489320,3c048041
+3489324,d484a248
+3489328,46240000
+348932c,46200020
+3489330,46001083
+3489334,3c048041
+3489338,c484a23c
+348933c,46022101
+3489340,24640001
+3489344,3c068041
+3489348,24c6a1e0
+348934c,32840
+3489350,a32821
+3489354,c52821
+3489358,90a50001
+348935c,44850000
+3489364,46800020
+3489368,46040002
+348936c,42840
+3489370,a42821
+3489374,c53021
+3489378,90c50001
+348937c,44853000
+3489384,468031a0
+3489388,46023182
+348938c,46060000
+3489390,3c058041
+3489394,c4a6a240
+3489398,4600303e
+34893a0,45030005
+34893a4,46060001
34893a8,4600000d
-34893ac,44030000
-34893b0,3c048000
-34893b4,641825
-34893b8,a0430000
-34893bc,a0470001
-34893c0,3e00008
-34893c4,a0460002
-34893c8,3c028011
-34893cc,3442a5d0
-34893d0,24030140
-34893d4,a4431424
-34893d8,90440032
-34893dc,41840
-34893e0,641821
-34893e4,31900
-34893e8,3e00008
-34893ec,a0430033
-34893f0,24a20002
-34893f4,24a50082
-34893f8,24065700
-34893fc,24070004
-3489400,9443fffe
-3489404,50660008
-3489408,24420004
-348940c,50600006
-3489410,24420004
-3489414,94430000
-3489418,2c630004
-348941c,54600001
-3489420,a4470000
-3489424,24420004
-3489428,5445fff6
-348942c,9443fffe
-3489430,3e00008
-3489438,27bdffe8
-348943c,afbf0014
-3489440,c1026fa
-3489444,24040400
-3489448,3c038041
-348944c,ac62b208
-3489450,3c038041
-3489454,ac62b20c
-3489458,8fbf0014
-348945c,3e00008
-3489460,27bd0018
-3489464,80820000
-3489468,10400026
-348946c,24870001
-3489470,3c038041
-3489474,8c68b208
-3489478,25080400
-348947c,3c038041
-3489480,8c63b20c
-3489484,5825
-3489488,3c0aff00
-348948c,254a0fff
-3489490,30c60fff
-3489494,240df000
-3489498,3c098041
-348949c,2529a098
-34894a0,240c0001
-34894a4,68202b
-34894a8,54800005
-34894ac,a0620000
-34894b0,11600014
-34894b4,3c028041
-34894b8,3e00008
-34894bc,ac43b20c
-34894c0,30a40fff
-34894c4,42300
-34894c8,8c620000
-34894cc,4a1024
-34894d0,441025
-34894d4,4d1024
-34894d8,461025
-34894dc,ac620000
-34894e0,24630004
-34894e4,95220004
-34894e8,a22821
-34894ec,24e70001
-34894f0,80e2ffff
-34894f4,1440ffeb
-34894f8,1805825
-34894fc,3c028041
-3489500,ac43b20c
-3489504,3e00008
-348950c,27bdffb8
-3489510,afbf0044
-3489514,afbe0040
-3489518,afb7003c
-348951c,afb60038
-3489520,afb50034
-3489524,afb40030
-3489528,afb3002c
-348952c,afb20028
-3489530,afb10024
-3489534,afb00020
-3489538,80a825
-348953c,b025
-3489540,9025
-3489544,3c138041
-3489548,2673a098
-348954c,3c178041
-3489550,3c148041
-3489554,3c1e38e3
-3489558,24070012
-348955c,2c03025
-3489560,2602825
-3489564,c101ba6
-3489568,2a02025
-348956c,8ef0b208
-3489570,8e82b20c
-3489574,202102b
-3489578,50400026
-348957c,26520001
-3489580,37d18e39
-3489584,82020000
-3489588,2002825
-348958c,2442ffe0
-3489590,510018
-3489594,1810
-3489598,31883
-348959c,227c3
-34895a0,641823
-34895a4,14720016
-34895a8,26100004
-34895ac,8ca70000
-34895b0,73b02
-34895b4,510018
-34895b8,1810
-34895bc,31883
-34895c0,641823
-34895c4,330c0
-34895c8,c33021
-34895cc,63040
-34895d0,96630006
-34895d4,afa30018
-34895d8,96630004
-34895dc,afa30014
-34895e0,8ca30000
-34895e4,30630fff
-34895e8,afa30010
-34895ec,30e70fff
-34895f0,463023
-34895f4,2602825
-34895f8,c101c0e
-34895fc,2a02025
-3489600,8e82b20c
-3489604,202102b
-3489608,5440ffdf
-348960c,82020000
-3489610,26520001
-3489614,24020006
-3489618,1642ffcf
-348961c,26d60012
-3489620,3c028041
-3489624,8c43b208
-3489628,3c028041
-348962c,ac43b20c
-3489630,8fbf0044
-3489634,8fbe0040
-3489638,8fb7003c
-348963c,8fb60038
-3489640,8fb50034
-3489644,8fb40030
-3489648,8fb3002c
-348964c,8fb20028
-3489650,8fb10024
-3489654,8fb00020
-3489658,3e00008
-348965c,27bd0048
-3489660,3c028041
-3489664,24030001
-3489668,ac43b214
-348966c,3c038041
-3489670,8c62b218
-3489674,2c440006
-3489678,50800001
-348967c,24020005
-3489680,3e00008
-3489684,ac62b218
-3489688,27bdffb8
-348968c,afbf0044
-3489690,afbe0040
-3489694,afb6003c
-3489698,afb50038
-348969c,afb40034
-34896a0,afb30030
-34896a4,afb2002c
-34896a8,afb10028
-34896ac,afb00024
-34896b0,3a0f025
-34896b4,3c028041
-34896b8,9442b210
-34896bc,10400133
-34896c0,3a0a825
-34896c4,3c02801d
-34896c8,3442aa30
-34896cc,8c42066c
-34896d0,3c033000
-34896d4,24630483
-34896d8,431024
-34896dc,1440012b
-34896e0,808025
-34896e4,3c02801c
-34896e8,344284a0
-34896ec,8c430008
-34896f0,3c02800f
-34896f4,8c4213ec
-34896f8,54620125
-34896fc,2a0e825
-3489700,3c028011
-3489704,3442a5d0
-3489708,8c47135c
-348970c,14e0011f
-3489710,3c02800e
-3489714,3442f1b0
-3489718,8c420000
-348971c,30420020
-3489720,1440011a
-3489724,3c028041
-3489728,8c43b214
-348972c,24020001
-3489730,1062000a
-3489734,3c02801c
-3489738,344284a0
-348973c,3c030001
-3489740,431021
-3489744,94430934
-3489748,24020006
-348974c,54620110
-3489750,2a0e825
-3489754,10000009
-3489758,3c038041
-348975c,344284a0
-3489760,3c030001
-3489764,431021
-3489768,94430934
-348976c,24020006
-3489770,14620007
-3489774,3c028041
-3489778,3c038041
-348977c,8c62b218
-3489780,3042001f
-3489784,ac62b218
-3489788,10000022
-348978c,241300ff
-3489790,8c42b218
-3489794,2c430006
-3489798,1060000a
-348979c,2c43006a
-34897a0,29a00
-34897a4,2629823
-34897a8,3c02cccc
-34897ac,3442cccd
-34897b0,2620019
-34897b4,9810
-34897b8,139882
-34897bc,10000015
-34897c0,327300ff
-34897c4,14600013
-34897c8,241300ff
-34897cc,2c4300ba
-34897d0,1060000b
-34897d4,21a00
-34897d8,621023
-34897dc,24429769
-34897e0,3c03cccc
-34897e4,3463cccd
-34897e8,430019
-34897ec,1010
-34897f0,29982
-34897f4,139827
-34897f8,10000006
-34897fc,327300ff
-3489800,3c028041
-3489804,ac40b214
-3489808,3c028041
-348980c,100000df
-3489810,ac40b218
-3489814,3c038041
-3489818,8c62b218
-348981c,24420001
-3489820,ac62b218
-3489824,3c028011
-3489828,3442a5d0
-348982c,8c4808c4
-3489830,19000011
-3489834,1001025
-3489838,e05025
-348983c,3c056666
-3489840,24a56667
-3489844,254a0001
-3489848,401825
-348984c,450018
-3489850,2010
-3489854,42083
-3489858,217c3
-348985c,2863000a
-3489860,1060fff8
-3489864,821023
-3489868,15400005
-348986c,3c028041
-3489870,10000002
-3489874,240a0001
-3489878,240a0001
-348987c,3c028041
-3489880,9445b1b2
-3489884,18a00010
-3489888,a01025
-348988c,3c066666
-3489890,24c66667
-3489894,24e70001
-3489898,401825
-348989c,460018
-34898a0,2010
-34898a4,42083
-34898a8,217c3
-34898ac,2863000a
-34898b0,1060fff8
-34898b4,821023
-34898b8,54e00005
-34898bc,1473821
-34898c0,10000002
-34898c4,24070001
-34898c8,24070001
-34898cc,1473821
-34898d0,24f40001
-34898d4,3c028041
-34898d8,2442a098
-34898dc,94430004
-34898e0,740018
-34898e4,2012
-34898e8,3c038041
-34898ec,2463a078
-34898f0,94660004
-34898f4,862021
-34898f8,497c2
-34898fc,2449021
-3489900,129043
-3489904,129023
-3489908,265200a0
-348990c,94420006
-3489910,44820000
-3489918,46800021
-348991c,3c028041
-3489920,d4469ef0
-3489924,46260002
+34893ac,44050000
+34893b0,10000006
+34893b4,30a700ff
+34893b8,4600000d
+34893bc,44050000
+34893c0,3c068000
+34893c4,a62825
+34893c8,30a700ff
+34893cc,3c068041
+34893d0,24c6a1e0
+34893d4,32840
+34893d8,a32821
+34893dc,c52821
+34893e0,90a50002
+34893e4,44850000
+34893ec,46800020
+34893f0,46040002
+34893f4,42840
+34893f8,a42821
+34893fc,c53021
+3489400,90c50002
+3489404,44853000
+348940c,468031a0
+3489410,46023182
+3489414,46060000
+3489418,3c058041
+348941c,c4a6a240
+3489420,4600303e
+3489428,45030005
+348942c,46060001
+3489430,4600000d
+3489434,44050000
+3489438,10000006
+348943c,30a600ff
+3489440,4600000d
+3489444,44050000
+3489448,3c068000
+348944c,a62825
+3489450,30a600ff
+3489454,32840
+3489458,a31821
+348945c,3c088041
+3489460,2508a1e0
+3489464,681821
+3489468,90650000
+348946c,44850000
+3489474,46800020
+3489478,46040002
+348947c,41840
+3489480,641821
+3489484,681821
+3489488,90630000
+348948c,44832000
+3489494,46802120
+3489498,46022082
+348949c,46020000
+34894a0,3c038041
+34894a4,c462a240
+34894a8,4600103e
+34894b0,45030005
+34894b4,46020001
+34894b8,4600000d
+34894bc,44030000
+34894c0,10000006
+34894c4,a0430000
+34894c8,4600000d
+34894cc,44030000
+34894d0,3c048000
+34894d4,641825
+34894d8,a0430000
+34894dc,a0470001
+34894e0,3e00008
+34894e4,a0460002
+34894e8,3c028011
+34894ec,3442a5d0
+34894f0,24030140
+34894f4,a4431424
+34894f8,90440032
+34894fc,41840
+3489500,641821
+3489504,31900
+3489508,3e00008
+348950c,a0430033
+3489510,24a20002
+3489514,24a50082
+3489518,24065700
+348951c,24070004
+3489520,9443fffe
+3489524,50660008
+3489528,24420004
+348952c,50600006
+3489530,24420004
+3489534,94430000
+3489538,2c630004
+348953c,54600001
+3489540,a4470000
+3489544,24420004
+3489548,5445fff6
+348954c,9443fffe
+3489550,3e00008
+3489558,27bdffe8
+348955c,afbf0014
+3489560,c102742
+3489564,24040400
+3489568,3c038041
+348956c,ac62b5ac
+3489570,3c038041
+3489574,ac62b5b0
+3489578,8fbf0014
+348957c,3e00008
+3489580,27bd0018
+3489584,80820000
+3489588,10400026
+348958c,24870001
+3489590,3c038041
+3489594,8c68b5ac
+3489598,25080400
+348959c,3c038041
+34895a0,8c63b5b0
+34895a4,5825
+34895a8,3c0aff00
+34895ac,254a0fff
+34895b0,30c60fff
+34895b4,240df000
+34895b8,3c098041
+34895bc,2529a438
+34895c0,240c0001
+34895c4,68202b
+34895c8,54800005
+34895cc,a0620000
+34895d0,11600014
+34895d4,3c028041
+34895d8,3e00008
+34895dc,ac43b5b0
+34895e0,30a40fff
+34895e4,42300
+34895e8,8c620000
+34895ec,4a1024
+34895f0,441025
+34895f4,4d1024
+34895f8,461025
+34895fc,ac620000
+3489600,24630004
+3489604,95220004
+3489608,a22821
+348960c,24e70001
+3489610,80e2ffff
+3489614,1440ffeb
+3489618,1805825
+348961c,3c028041
+3489620,ac43b5b0
+3489624,3e00008
+348962c,27bdffb8
+3489630,afbf0044
+3489634,afbe0040
+3489638,afb7003c
+348963c,afb60038
+3489640,afb50034
+3489644,afb40030
+3489648,afb3002c
+348964c,afb20028
+3489650,afb10024
+3489654,afb00020
+3489658,80a825
+348965c,b025
+3489660,9025
+3489664,3c138041
+3489668,2673a438
+348966c,3c178041
+3489670,3c148041
+3489674,3c1e38e3
+3489678,24070012
+348967c,2c03025
+3489680,2602825
+3489684,c101bdf
+3489688,2a02025
+348968c,8ef0b5ac
+3489690,8e82b5b0
+3489694,202102b
+3489698,50400026
+348969c,26520001
+34896a0,37d18e39
+34896a4,82020000
+34896a8,2002825
+34896ac,2442ffe0
+34896b0,510018
+34896b4,1810
+34896b8,31883
+34896bc,227c3
+34896c0,641823
+34896c4,14720016
+34896c8,26100004
+34896cc,8ca70000
+34896d0,73b02
+34896d4,510018
+34896d8,1810
+34896dc,31883
+34896e0,641823
+34896e4,330c0
+34896e8,c33021
+34896ec,63040
+34896f0,96630006
+34896f4,afa30018
+34896f8,96630004
+34896fc,afa30014
+3489700,8ca30000
+3489704,30630fff
+3489708,afa30010
+348970c,30e70fff
+3489710,463023
+3489714,2602825
+3489718,c101c47
+348971c,2a02025
+3489720,8e82b5b0
+3489724,202102b
+3489728,5440ffdf
+348972c,82020000
+3489730,26520001
+3489734,24020006
+3489738,1642ffcf
+348973c,26d60012
+3489740,3c028041
+3489744,8c43b5ac
+3489748,3c028041
+348974c,ac43b5b0
+3489750,8fbf0044
+3489754,8fbe0040
+3489758,8fb7003c
+348975c,8fb60038
+3489760,8fb50034
+3489764,8fb40030
+3489768,8fb3002c
+348976c,8fb20028
+3489770,8fb10024
+3489774,8fb00020
+3489778,3e00008
+348977c,27bd0048
+3489780,3c028041
+3489784,24030001
+3489788,ac43b5b8
+348978c,3c038041
+3489790,8c62b5bc
+3489794,2c440006
+3489798,50800001
+348979c,24020005
+34897a0,3e00008
+34897a4,ac62b5bc
+34897a8,27bdffb8
+34897ac,afbf0044
+34897b0,afbe0040
+34897b4,afb6003c
+34897b8,afb50038
+34897bc,afb40034
+34897c0,afb30030
+34897c4,afb2002c
+34897c8,afb10028
+34897cc,afb00024
+34897d0,3a0f025
+34897d4,3c028041
+34897d8,9442b5b4
+34897dc,10400133
+34897e0,3a0a825
+34897e4,3c02801d
+34897e8,3442aa30
+34897ec,8c42066c
+34897f0,3c033000
+34897f4,24630483
+34897f8,431024
+34897fc,1440012b
+3489800,808025
+3489804,3c02801c
+3489808,344284a0
+348980c,8c430008
+3489810,3c02800f
+3489814,8c4213ec
+3489818,54620125
+348981c,2a0e825
+3489820,3c028011
+3489824,3442a5d0
+3489828,8c47135c
+348982c,14e0011f
+3489830,3c02800e
+3489834,3442f1b0
+3489838,8c420000
+348983c,30420020
+3489840,1440011a
+3489844,3c028041
+3489848,8c43b5b8
+348984c,24020001
+3489850,1062000a
+3489854,3c02801c
+3489858,344284a0
+348985c,3c030001
+3489860,431021
+3489864,94430934
+3489868,24020006
+348986c,54620110
+3489870,2a0e825
+3489874,10000009
+3489878,3c038041
+348987c,344284a0
+3489880,3c030001
+3489884,431021
+3489888,94430934
+348988c,24020006
+3489890,14620007
+3489894,3c028041
+3489898,3c038041
+348989c,8c62b5bc
+34898a0,3042001f
+34898a4,ac62b5bc
+34898a8,10000022
+34898ac,241300ff
+34898b0,8c42b5bc
+34898b4,2c430006
+34898b8,1060000a
+34898bc,2c43006a
+34898c0,29a00
+34898c4,2629823
+34898c8,3c02cccc
+34898cc,3442cccd
+34898d0,2620019
+34898d4,9810
+34898d8,139882
+34898dc,10000015
+34898e0,327300ff
+34898e4,14600013
+34898e8,241300ff
+34898ec,2c4300ba
+34898f0,1060000b
+34898f4,21a00
+34898f8,621023
+34898fc,24429769
+3489900,3c03cccc
+3489904,3463cccd
+3489908,430019
+348990c,1010
+3489910,29982
+3489914,139827
+3489918,10000006
+348991c,327300ff
+3489920,3c028041
+3489924,ac40b5b8
3489928,3c028041
-348992c,d4429ef8
-3489930,46201001
-3489934,3c028041
-3489938,d4449f00
-348993c,46240000
-3489940,4620000d
-3489944,44060000
-3489948,94620006
-348994c,44820000
-3489954,46800021
-3489958,46260002
-348995c,46201081
-3489960,3c028041
-3489964,d4409f08
-3489968,46201080
-348996c,46241080
-3489970,4620100d
-3489974,44110000
-3489978,24e20009
-348997c,210c2
-3489980,210c0
-3489984,3a2e823
-3489988,27a40020
-348998c,941021
-3489990,19400015
-3489994,a0400000
-3489998,2549ffff
-348999c,894821
-34899a0,806025
-34899a4,3c0b6666
-34899a8,256b6667
-34899ac,10b0018
-34899b0,1810
-34899b4,31883
-34899b8,817c3
-34899bc,621823
-34899c0,31080
-34899c4,431021
-34899c8,21040
-34899cc,1021023
-34899d0,24420030
-34899d4,a1220000
-34899d8,604025
-34899dc,1201025
-34899e0,144cfff2
-34899e4,2529ffff
-34899e8,8a1021
-34899ec,2403002f
-34899f0,a0430000
-34899f4,147102a
-34899f8,10400012
-34899fc,873821
-3489a00,8a5021
-3489a04,3c086666
-3489a08,25086667
-3489a0c,a80018
-3489a10,1810
-3489a14,31883
-3489a18,517c3
-3489a1c,621823
-3489a20,31080
-3489a24,431021
-3489a28,21040
-3489a2c,a21023
-3489a30,24420030
-3489a34,a0e20000
-3489a38,24e7ffff
-3489a3c,14eafff3
-3489a40,602825
-3489a44,8e020008
-3489a48,24430008
-3489a4c,ae030008
-3489a50,3c03de00
-3489a54,ac430000
-3489a58,3c038041
-3489a5c,2463a0e8
-3489a60,ac430004
-3489a64,8e020008
-3489a68,24430008
-3489a6c,ae030008
-3489a70,3c03e700
-3489a74,ac430000
-3489a78,ac400004
-3489a7c,8e020008
-3489a80,24430008
-3489a84,ae030008
-3489a88,3c03fc11
-3489a8c,34639623
-3489a90,ac430000
-3489a94,3c03ff2f
-3489a98,3463ffff
-3489a9c,ac430004
-3489aa0,8e030008
-3489aa4,24620008
-3489aa8,ae020008
-3489aac,3c16fa00
-3489ab0,ac760000
-3489ab4,3c02dad3
-3489ab8,24420b00
-3489abc,2621025
-3489ac0,ac620004
-3489ac4,c102519
-3489ac8,2402825
-3489acc,3c028041
-3489ad0,9442a09c
-3489ad4,540018
-3489ad8,a012
-3489adc,292a021
-3489ae0,8e020008
-3489ae4,24430008
-3489ae8,ae030008
-3489aec,ac560000
-3489af0,3c03f4ec
-3489af4,24633000
-3489af8,2639825
-3489afc,ac530004
-3489b00,3c028041
-3489b04,8c46b218
-3489b08,63042
-3489b0c,24070001
-3489b10,30c6000f
-3489b14,3c128041
-3489b18,2645a078
-3489b1c,c101ba6
-3489b20,2002025
-3489b24,2645a078
-3489b28,94a20006
-3489b2c,afa20018
-3489b30,94a20004
-3489b34,afa20014
-3489b38,afb10010
-3489b3c,2803825
-3489b40,3025
-3489b44,c101c0e
-3489b48,2002025
-3489b4c,c102543
-3489b50,2002025
-3489b54,8e020008
-3489b58,24430008
-3489b5c,ae030008
-3489b60,3c03e900
-3489b64,ac430000
-3489b68,ac400004
-3489b6c,8e020008
-3489b70,24430008
-3489b74,ae030008
-3489b78,3c03df00
-3489b7c,ac430000
-3489b80,ac400004
-3489b84,10000002
-3489b88,2a0e825
-3489b8c,2a0e825
-3489b90,3c0e825
-3489b94,8fbf0044
-3489b98,8fbe0040
-3489b9c,8fb6003c
-3489ba0,8fb50038
-3489ba4,8fb40034
-3489ba8,8fb30030
-3489bac,8fb2002c
-3489bb0,8fb10028
-3489bb4,8fb00024
-3489bb8,3e00008
-3489bbc,27bd0048
-3489bc0,3c028040
-3489bc4,a040307c
-3489bc8,3c028040
-3489bcc,3e00008
-3489bd0,ac403080
-3489bd4,3c038041
-3489bd8,3c028050
-3489bdc,24420000
-3489be0,3e00008
-3489be4,ac62b21c
-3489be8,3082000f
-3489bec,10400009
-3489bf0,3c038041
-3489bf4,417c3
-3489bf8,21702
-3489bfc,821821
-3489c00,3063000f
-3489c04,431023
-3489c08,24420010
-3489c0c,822021
-3489c10,3c038041
-3489c14,8c62b21c
-3489c18,442021
-3489c1c,3e00008
-3489c20,ac64b21c
-3489c24,27bdffe8
-3489c28,afbf0014
-3489c2c,afb00010
-3489c30,808025
-3489c34,c1026fa
-3489c38,8c840008
-3489c3c,402025
-3489c40,ae020000
-3489c44,8e060008
-3489c48,3c028000
-3489c4c,24420df0
-3489c50,40f809
-3489c54,8e050004
-3489c58,8fbf0014
-3489c5c,8fb00010
-3489c60,3e00008
-3489c64,27bd0018
-3489c68,33c2
-3489c6c,664399c4
-3489c70,cc45ffc6
-3489c74,ff47ffc8
-3489c78,ff49e0ca
-3489c7c,c24ba3cc
-3489c80,854d660d
-3489c84,440f2200
-3489c88,85d1a352
-3489c8c,c2d3e045
-3489c90,1010101
-3489c94,1010101
-3489c98,1010101
-3489c9c,1010101
-3489ca0,1010101
-3489cbc,1010000
-3489cc4,1010101
-3489cc8,1000101
-3489ccc,10101
-3489cd0,10000
-3489cd4,2b242525
-3489cd8,26262626
-3489cdc,27272727
-3489ce0,27272727
-3489ce4,500080d
-3489ce8,1051508
-3489cec,d01052a
-3489cf0,80d0127
-3489cf4,f080b01
-3489cf8,4d510b02
-3489d00,97ff6350
-3489d04,45ff5028
-3489d08,57456397
-3489d0c,ff5e45ff
-3489d10,9f006545
-3489d14,ff63ff6c
-3489d18,45fff063
-3489d1c,7345ffff
-3489d20,ff503aff
-3489d24,ffff573a
-3489d28,ffffff5e
-3489d2c,3affffff
-3489d30,653affff
-3489d34,ff6c3aff
-3489d38,ffff733a
-3489d3c,5a0c00
-3489d40,720c0096
-3489d44,c009618
-3489d48,1652a00
-3489d4c,4e2a005a
-3489d50,2a000000
-3489d54,c004e00
-3489d58,c015a00
-3489d5c,c026600
-3489d60,c037200
-3489d64,c047e00
-3489d68,c058a00
-3489d6c,c064e0c
-3489d70,75a0c
-3489d74,c09660c
-3489d78,a720c
-3489d7c,c0c7e0c
-3489d80,c0d8a0c
-3489d84,c0e4e18
-3489d88,c0f5a18
-3489d8c,c106618
-3489d90,c117218
-3489d94,c127e18
-3489d98,c138a18
-3489d9c,ffff
-3489da0,ffff
-3489da4,ffff
-3489da8,ffff
-3489dac,ffff
-3489db0,ffff
-3489db4,ffff
-3489db8,ffff
-3489dbc,ffff
-3489dc0,ffff
-3489dc4,ffff
-3489dc8,ffff
-3489dcc,ffff
-3489dd0,ffff
-3489dd4,c3b7e2a
-3489dd8,c3c8a2a
-3489ddc,c3d962a
-3489de0,ffff
-3489de4,c3e7e36
-3489de8,b3f8b37
-3489dec,b409737
-3489df0,ffff
-3489df4,c417e42
-3489df8,c428a42
-3489dfc,c439642
-3489e00,ffff
-3489e04,c447e4f
-3489e08,c458a4f
-3489e0c,c46964f
-3489e10,ffff
-3489e14,c149600
-3489e18,ffff
-3489e1c,2c061b31
-3489e20,2c072931
-3489e24,2c083731
-3489e28,2a096f51
-3489e2c,2c0a722a
-3489e30,ffff
-3489e34,2c00370a
-3489e38,2c01371a
-3489e3c,2c022922
-3489e40,2c031b1a
-3489e44,2c041b0a
-3489e48,2c052902
-3489e4c,ffff
-3489e50,ffff
-3489e54,8040a0b8
-3489e58,8040a0a8
-3489e5c,8040a038
-3489e60,c8ff6482
-3489e64,82ffff64
-3489e68,64ff5aff
-3489e6c,bd1400
-3489e70,aa0200
-3489e74,bd1300
-3489e78,15c6300
-3489e7c,de2f00
-3489e80,e01010e0
-3489e84,e01010e0
-3489e88,1010e0e0
-3489e8c,1010e0e0
-3489e90,10e0e010
-3489e94,10000000
-3489e98,4d510000
-3489e9c,4e6f726d
-3489ea0,616c0000
-3489ea4,bdcccccd
-3489ea8,3dcccccd
-3489eac,43510000
-3489eb0,41100000
-3489eb4,4f000000
-3489eb8,42080000
-3489ebc,c20c0000
-3489ec0,420c0000
-3489ec4,3f800000
-3489ec8,3f000000
-3489ecc,41c80000
-3489ed0,3fa00000
-3489ed4,40000000
-3489ed8,40200000
-3489edc,3f800000
-3489ee0,4f000000
-3489ee8,41f00000
-3489ef0,3ff80000
-3489ef8,406e0000
-3489f00,3ff00000
-3489f08,40080000
-3489f10,80409c68
-3489f14,10203
-3489f18,4050607
-3489f1c,ffffffff
-3489f20,ffff0000
-3489f24,ff00ff
-3489f28,3c000064
-3489f2c,ffff8200
-3489f30,c832ffc8
-3489f34,c8000000
-3489f38,104465
-3489f3c,6b750000
-3489f44,110446f
-3489f48,646f6e67
-3489f4c,6f000000
-3489f50,2104a61
-3489f54,62750000
-3489f5c,3d0466f
-3489f60,72657374
-3489f68,4d04669
-3489f6c,72650000
-3489f74,5d05761
-3489f78,74657200
-3489f80,7d05368
-3489f84,61646f77
-3489f8c,6d05370
-3489f90,69726974
-3489f98,890426f
-3489f9c,74570000
-3489fa4,9104963
-3489fa8,65000000
-3489fb0,ca04765
-3489fb4,7275646f
-3489fbc,b804754
-3489fc0,47000000
-3489fc8,dc04761
-3489fcc,6e6f6e00
-3489fd4,2
-3489fdc,3f800000
-3489fe8,1
-3489fec,30006
-3489ff0,70009
-3489ff4,b000e
-3489ff8,f0010
-3489ffc,110019
-348a000,1a002b
-348a004,2c002e
-348a008,300032
-348a00c,35003c
-348a010,400041
-348a014,460051
-348a018,540109
-348a01c,10b010c
-348a020,10e010f
-348a024,1100113
-348a02c,100010
-348a030,a0301
-348a034,1000000
-348a03c,100010
-348a040,20002
-348a044,2000000
-348a04c,80008
-348a050,a0301
-348a054,1000000
-348a05c,100010
-348a060,30301
-348a064,1000000
-348a06c,100018
-348a070,10301
-348a074,1000000
-348a07c,100010
-348a080,100301
-348a084,1000000
-348a08c,200020
-348a090,10302
-348a094,2000000
-348a09c,8000e
-348a0a0,5f0301
-348a0a4,1000000
-348a0ac,180018
-348a0b0,140003
-348a0b4,4000000
-348a0bc,200020
-348a0c0,5a0003
-348a0c4,4000000
-348a0cc,100010
-348a0d0,60301
-348a0d4,1000000
-348a0dc,100010
-348a0e0,30003
-348a0e4,4000000
-348a0e8,e7000000
-348a0f0,d9000000
-348a0f8,ed000000
-348a0fc,5003c0
-348a100,ef002cf0
-348a104,504244
-348a108,df000000
-348a124,4d8e0032
-348a128,ce2001
-348a12c,80407d1c
-348a130,804077ac
-348a134,ffffffff
-348a138,4d8c0034
-348a13c,bb1201
-348a140,80407b54
-348a144,804077ac
-348a148,ffffffff
-348a14c,4d090033
-348a150,d92801
-348a154,80407b54
-348a158,804077ac
-348a15c,ffffffff
-348a160,53030031
-348a164,e93500
-348a168,80407b54
-348a16c,804077ac
-348a170,ffffffff
-348a174,53060030
-348a178,e73300
-348a17c,80407b54
-348a180,804077ac
-348a184,ffffffff
-348a188,530e0035
-348a18c,e83400
-348a190,80407b54
-348a194,804077ac
-348a198,ffffffff
-348a19c,4d000037
-348a1a0,c71b01
-348a1a4,80407b54
-348a1a8,804077ac
-348a1ac,ffffffff
-348a1b0,530a0036
-348a1b4,dd2d00
-348a1b8,80407b54
-348a1bc,804077ac
-348a1c0,ffffffff
-348a1c4,530b004f
-348a1c8,dd2e00
-348a1cc,80407b54
-348a1d0,804077ac
-348a1d4,ffffffff
-348a1d8,530f0039
-348a1dc,ea3600
-348a1e0,80407b54
-348a1e4,804077ac
-348a1e8,ffffffff
-348a1ec,53230069
-348a1f0,ef3b00
-348a1f4,80407b54
-348a1f8,80407a10
-348a1fc,ffffffff
-348a200,5308003a
-348a204,de2f00
-348a208,80407b54
-348a20c,804077ac
-348a210,ffffffff
-348a214,53110038
-348a218,f64100
-348a21c,80407b54
-348a220,804077ac
-348a224,ffffffff
-348a228,532f0002
-348a22c,1095e00
-348a230,80407b54
-348a234,804077ac
-348a238,ffffffff
-348a23c,53140042
-348a240,c60100
-348a244,80407b54
-348a248,804077ac
-348a24c,ffffffff
-348a250,53150043
-348a254,eb3800
-348a258,80407b54
-348a25c,804077ac
-348a260,ffffffff
-348a264,53160044
-348a268,eb3700
-348a26c,80407b54
-348a270,804077ac
-348a274,ffffffff
-348a278,53170045
-348a27c,eb3900
-348a280,80407b54
-348a284,804077ac
-348a288,ffffffff
-348a28c,53180046
-348a290,c60100
-348a294,80407b54
-348a298,804077ac
-348a29c,ffffffff
-348a2a0,531a0098
-348a2a4,df3000
-348a2a8,80407b54
-348a2ac,804077ac
-348a2b0,ffffffff
-348a2b4,531b0099
-348a2b8,10b4500
-348a2bc,80407d5c
-348a2c0,804077ac
-348a2c4,ffffffff
-348a2c8,53100048
-348a2cc,f33e01
-348a2d0,80407b54
-348a2d4,804077ac
-348a2d8,ffffffff
-348a2dc,53250010
-348a2e0,1364f00
-348a2e4,80407b54
-348a2e8,804077ac
-348a2ec,ffffffff
-348a2f0,53260011
-348a2f4,1353200
-348a2f8,80407b54
-348a2fc,804077ac
-348a300,ffffffff
-348a304,5322000b
-348a308,1094400
-348a30c,80407b54
-348a310,804077ac
-348a314,ffffffff
-348a318,53240012
-348a31c,1343100
-348a320,80407b54
-348a324,804077ac
-348a328,ffffffff
-348a32c,53270013
-348a330,1375000
-348a334,80407b54
-348a338,804077ac
-348a33c,ffffffff
-348a340,532b0017
-348a344,1385100
-348a348,80407b54
-348a34c,804077ac
-348a350,ffffffff
-348a354,532d9001
-348a358,da2900
-348a35c,80407b54
-348a360,804077ac
-348a364,ffffffff
-348a368,532e000b
-348a36c,1094400
-348a370,80407b54
-348a374,804077ac
-348a378,ffffffff
-348a37c,53300003
-348a380,1415400
-348a384,80407b54
-348a388,804077ac
-348a38c,ffffffff
-348a390,53310004
-348a394,1405300
-348a398,80407b54
-348a39c,804077ac
-348a3a0,ffffffff
-348a3a4,53320005
-348a3a8,f54000
-348a3ac,80407b54
-348a3b0,804077ac
-348a3b4,ffffffff
-348a3b8,53330008
-348a3bc,1435600
-348a3c0,80407b54
-348a3c4,804077ac
-348a3c8,ffffffff
-348a3cc,53340009
-348a3d0,1465700
-348a3d4,80407b54
-348a3d8,804077ac
-348a3dc,ffffffff
-348a3e0,5335000d
-348a3e4,1495a00
-348a3e8,80407b54
-348a3ec,804077ac
-348a3f0,ffffffff
-348a3f4,5336000e
-348a3f8,13f5200
-348a3fc,80407b54
-348a400,804077ac
-348a404,ffffffff
-348a408,5337000a
-348a40c,1425500
-348a410,80407b54
-348a414,804077ac
-348a418,ffffffff
-348a41c,533b00a4
-348a420,18d7400
-348a424,80407b54
-348a428,804077ac
-348a42c,ffffffff
-348a430,533d004b
-348a434,f84300
-348a438,80407b54
-348a43c,804077ac
-348a440,ffffffff
-348a444,533e004c
-348a448,cb1d01
-348a44c,80407b54
-348a450,804077ac
-348a454,ffffffff
-348a458,533f004d
-348a45c,dc2c01
-348a460,80407b54
-348a464,804077ac
-348a468,ffffffff
-348a46c,5340004e
-348a470,ee3a00
-348a474,80407b54
-348a478,804077ac
-348a47c,ffffffff
-348a480,53420050
-348a484,f23c00
-348a488,80407b54
-348a48c,804077ac
-348a490,ffffffff
-348a494,53430051
-348a498,f23d00
-348a49c,80407b54
-348a4a0,804077ac
-348a4a4,ffffffff
-348a4a8,53450053
-348a4ac,1184700
-348a4b0,80407b54
-348a4b4,804077ac
-348a4b8,ffffffff
-348a4bc,53460054
-348a4c0,1575f00
-348a4c4,80407b54
-348a4c8,804077ac
-348a4cc,ffffffff
-348a4d0,534b0056
-348a4d4,be1600
-348a4d8,80407b54
-348a4dc,804077ac
-348a4e0,ffffffff
-348a4e4,534c0057
-348a4e8,be1700
-348a4ec,80407b54
-348a4f0,804077ac
-348a4f4,ffffffff
-348a4f8,534d0058
-348a4fc,bf1800
-348a500,80407b54
-348a504,804077ac
-348a508,ffffffff
-348a50c,534e0059
-348a510,bf1900
-348a514,80407b54
-348a518,804077ac
-348a51c,ffffffff
-348a520,534f005a
-348a524,bf1a00
-348a528,80407b54
-348a52c,804077ac
-348a530,ffffffff
-348a534,5351005b
-348a538,12d4900
-348a53c,80407b54
-348a540,804077ac
-348a544,ffffffff
-348a548,5352005c
-348a54c,12d4a00
-348a550,80407b54
-348a554,804077ac
-348a558,ffffffff
-348a55c,535300cd
-348a560,db2a00
-348a564,80407b54
-348a568,804077ac
-348a56c,ffffffff
-348a570,535400ce
-348a574,db2b00
-348a578,80407b54
-348a57c,804077ac
-348a580,ffffffff
-348a584,536f0068
-348a588,c82100
-348a58c,80407b54
-348a590,804077ac
-348a594,ffffffff
-348a598,5370007b
-348a59c,d72400
-348a5a0,80407b54
-348a5a4,804077ac
-348a5a8,ffffffff
-348a5ac,5341004a
-348a5b0,10e4600
-348a5b4,80407b54
-348a5b8,8040798c
-348a5bc,ffffffff
-348a5c0,4d5800dc
-348a5c4,1194801
-348a5c8,80407d38
-348a5cc,804077ac
-348a5d0,ffffffff
-348a5d4,3d7200c6
-348a5d8,bd1301
-348a5dc,80407b54
-348a5e0,804077b4
-348a5e4,ffffffff
-348a5e8,3e7a00c2
-348a5ec,bd1401
-348a5f0,80407b54
-348a5f4,804077b4
-348a5f8,ffffffff
-348a5fc,537400c7
-348a600,b90a02
-348a604,80407b54
-348a608,804077ac
-348a60c,ffffffff
-348a610,53750067
-348a614,b80b01
-348a618,80407b54
-348a61c,804077ac
-348a620,ffffffff
-348a624,53760066
-348a628,c81c01
-348a62c,80407b54
-348a630,804077ac
-348a634,ffffffff
-348a638,53770060
-348a63c,aa0203
-348a640,80407b54
-348a644,804077ac
-348a648,ffffffff
-348a64c,53780052
-348a650,cd1e01
-348a654,80407b54
-348a658,804077ac
-348a65c,ffffffff
-348a660,53790052
-348a664,cd1f01
-348a668,80407b54
-348a66c,804077ac
-348a670,ffffffff
-348a674,5356005e
-348a678,d12200
-348a67c,80407b54
-348a680,804079e4
-348a684,1ffff
-348a688,5357005f
-348a68c,d12300
-348a690,80407b54
-348a694,804079e4
-348a698,2ffff
-348a69c,5321009a
-348a6a0,da2900
-348a6a4,80407b54
-348a6a8,804077ac
-348a6ac,ffffffff
-348a6b0,4d830055
-348a6b4,b70901
-348a6b8,80407b54
-348a6bc,804077ac
-348a6c0,ffffffff
-348a6c4,4d9200e6
-348a6c8,d82501
-348a6cc,80407d00
-348a6d0,804077ac
-348a6d4,ffffffff
-348a6d8,4d9300e6
-348a6dc,d82601
-348a6e0,80407d00
-348a6e4,804077ac
-348a6e8,ffffffff
-348a6ec,4d9400e6
-348a6f0,d82701
-348a6f4,80407d00
-348a6f8,804077ac
-348a6fc,ffffffff
-348a700,4d84006f
-348a704,17f6d01
-348a708,80407b54
-348a70c,804077ac
-348a710,ffffffff
-348a714,4d8500cc
-348a718,17f6e01
-348a71c,80407b54
-348a720,804077ac
-348a724,ffffffff
-348a728,4d8600f0
-348a72c,17f6f01
-348a730,80407b54
-348a734,804077ac
-348a738,ffffffff
-348a73c,3d7200c6
-348a740,bd1301
-348a744,80407b54
-348a748,804077b4
-348a74c,ffffffff
-348a750,53820098
-348a754,df3000
-348a758,80407b54
-348a75c,804077ac
-348a760,ffffffff
-348a764,53280014
-348a768,1505b00
-348a76c,80407b54
-348a770,804077ac
-348a774,ffffffff
-348a778,53290015
-348a77c,1515c00
-348a780,80407b54
-348a784,804077ac
-348a788,ffffffff
-348a78c,532a0016
-348a790,1525d00
-348a794,80407b54
-348a798,804077ac
-348a79c,ffffffff
-348a7a0,53500079
-348a7a4,1475800
-348a7a8,80407b54
-348a7ac,804077ac
-348a7b0,ffffffff
-348a7b4,4d8700f1
-348a7b8,17f7101
-348a7bc,80407b54
-348a7c0,804077ac
-348a7c4,ffffffff
-348a7c8,4d8800f2
-348a7cc,17f7201
-348a7d0,80407b54
-348a7d4,804077ac
-348a7d8,ffffffff
-348a7dc,533d000c
-348a7e0,f84300
-348a7e4,80407b54
-348a7e8,804078b4
-348a7ec,ffffffff
-348a7f0,53040070
-348a7f4,1586000
-348a7f8,80407b54
-348a7fc,804077ac
-348a800,ffffffff
-348a804,530c0071
-348a808,1586100
-348a80c,80407b54
-348a810,804077ac
-348a814,ffffffff
-348a818,53120072
-348a81c,1586200
-348a820,80407b54
-348a824,804077ac
-348a828,ffffffff
-348a82c,5b7100b4
-348a830,15c6301
-348a834,80407b54
-348a838,804077ac
-348a83c,ffffffff
-348a840,530500ad
-348a844,15d6400
-348a848,80407b54
-348a84c,804077ac
-348a850,ffffffff
-348a854,530d00ae
-348a858,15d6500
-348a85c,80407b54
-348a860,804077ac
-348a864,ffffffff
-348a868,531300af
-348a86c,15d6600
-348a870,80407b54
-348a874,804077ac
-348a878,ffffffff
-348a87c,53470007
-348a880,17b6c00
-348a884,80407b54
-348a888,804077ac
-348a88c,ffffffff
-348a890,53480007
-348a894,17b6c00
-348a898,80407b54
-348a89c,804077ac
-348a8a0,ffffffff
-348a8a4,4d8a0037
-348a8a8,c71b01
-348a8ac,80407b54
-348a8b0,804077ac
-348a8b4,ffffffff
-348a8b8,4d8b0037
-348a8bc,c71b01
-348a8c0,80407b54
-348a8c4,804077ac
-348a8c8,ffffffff
-348a8cc,4d8c0034
-348a8d0,bb1201
-348a8d4,80407b54
-348a8d8,804077ac
-348a8dc,ffffffff
-348a8e0,4d8d0034
-348a8e4,bb1201
-348a8e8,80407b54
-348a8ec,804077ac
-348a8f0,ffffffff
-348a8f4,4d020032
-348a8f8,ce2001
-348a8fc,80407d1c
-348a900,804077ac
-348a904,ffffffff
-348a908,4d8f0032
-348a90c,ce2001
-348a910,80407d1c
-348a914,804077ac
-348a918,ffffffff
-348a91c,4d900032
-348a920,ce2001
-348a924,80407d1c
-348a928,804077ac
-348a92c,ffffffff
-348a930,4d910032
-348a934,ce2001
-348a938,80407d1c
-348a93c,804077ac
-348a940,ffffffff
-348a944,4d9500dc
-348a948,1194801
-348a94c,80407d38
-348a950,804077ac
-348a954,ffffffff
-348a958,4d960033
-348a95c,d92801
-348a960,80407b54
-348a964,804077ac
-348a968,ffffffff
-348a96c,4d970033
-348a970,d92801
-348a974,80407b54
-348a978,804077ac
-348a97c,ffffffff
-348a980,53190047
-348a984,f43f00
-348a988,80407b54
-348a98c,804077ac
-348a990,ffffffff
-348a994,531d007a
-348a998,1746800
-348a99c,80407b54
-348a9a0,804077ac
-348a9a4,ffffffff
-348a9a8,531c005d
-348a9ac,1736700
-348a9b0,80407b54
-348a9b4,804077ac
-348a9b8,ffffffff
-348a9bc,53200097
-348a9c0,1766a00
-348a9c4,80407b54
-348a9c8,804077ac
-348a9cc,ffffffff
-348a9d0,531e00f9
-348a9d4,1767000
-348a9d8,80407b54
-348a9dc,804077ac
-348a9e0,ffffffff
-348a9e4,537700f3
-348a9e8,aa0201
-348a9ec,80407b54
-348a9f0,804077ac
-348a9f4,ffffffff
-348a9f8,4d8400f4
-348a9fc,17f6d01
-348aa00,80407b54
-348aa04,804077ac
-348aa08,ffffffff
-348aa0c,4d8500f5
-348aa10,17f6e01
-348aa14,80407b54
-348aa18,804077ac
-348aa1c,ffffffff
-348aa20,4d8600f6
-348aa24,17f6f01
-348aa28,80407b54
-348aa2c,804077ac
-348aa30,ffffffff
-348aa34,4d8700f7
-348aa38,17f7101
-348aa3c,80407b54
-348aa40,804077ac
-348aa44,ffffffff
-348aa48,537a00fa
-348aa4c,bd1401
-348aa50,80407b54
-348aa54,804077b4
-348aa58,ffffffff
-348aa5c,53980090
-348aa60,c71b01
-348aa64,80407b54
-348aa68,804077ac
-348aa6c,ffffffff
-348aa70,53990091
-348aa74,c71b01
-348aa78,80407b54
-348aa7c,804077ac
-348aa80,ffffffff
-348aa84,539a00a7
-348aa88,bb1201
-348aa8c,80407b54
-348aa90,804077ac
-348aa94,ffffffff
-348aa98,539b00a8
-348aa9c,bb1201
-348aaa0,80407b54
-348aaa4,804077ac
-348aaa8,ffffffff
-348aaac,5349006c
-348aab0,17b7300
-348aab4,80407b54
-348aab8,804077ac
-348aabc,ffffffff
-348aac0,53419002
-348aac8,80407b54
-348aacc,804079b0
-348aad0,ffffffff
-348ab10,ffffffff
-348ab14,dd2d00
-348ab18,80407b5c
-348ab1c,804077ac
-348ab20,ffffffff
-348ab24,ffffffff
-348ab28,1475800
-348ab2c,80407b70
-348ab30,804077ac
-348ab34,ffffffff
-348ab38,ffffffff
-348ab3c,bf1800
-348ab40,80407b9c
-348ab44,804077ac
-348ab48,ffffffff
-348ab4c,ffffffff
-348ab50,e93500
-348ab54,80407bc8
-348ab58,804077ac
-348ab5c,ffffffff
-348ab60,ffffffff
-348ab64,e73300
-348ab68,80407bf0
-348ab6c,804077ac
-348ab70,ffffffff
-348ab74,ffffffff
-348ab78,d12200
-348ab7c,80407c20
-348ab80,804077ac
-348ab84,ffffffff
-348ab88,ffffffff
-348ab8c,db2a00
-348ab90,80407c50
-348ab94,804077ac
-348ab98,ffffffff
-348ab9c,ffffffff
-348aba0,bb1201
-348aba4,80407c68
-348aba8,804077ac
-348abac,ffffffff
-348abb0,ffffffff
-348abb4,c71b01
-348abb8,80407c84
-348abbc,804077ac
-348abc0,ffffffff
-348abc4,ffffffff
-348abc8,d92800
-348abcc,80407cb0
-348abd0,804077ac
-348abd4,ffffffff
-348abd8,ffffffff
-348abdc,cd1e00
-348abe0,80407ca0
-348abe4,804077ac
-348abe8,ffffffff
-348abec,ffffffff
-348abf0,10e4600
-348abf4,80407ce0
-348abf8,804077ac
-348abfc,ffffffff
-348ac00,53410043
-348ac04,c60100
-348ac08,80407b54
-348ac0c,804078c0
-348ac10,15ffff
-348ac14,53410044
-348ac18,c60100
-348ac1c,80407b54
-348ac20,804078c0
-348ac24,16ffff
-348ac28,53410045
-348ac2c,c60100
-348ac30,80407b54
-348ac34,804078c0
-348ac38,17ffff
-348ac3c,53410046
-348ac40,1776b00
-348ac44,80407b54
-348ac48,804078c0
-348ac4c,18ffff
-348ac50,53410047
-348ac54,f43f00
-348ac58,80407b54
-348ac5c,804078c0
-348ac60,19ffff
-348ac64,5341005d
-348ac68,1736700
-348ac6c,80407b54
-348ac70,804078c0
-348ac74,1cffff
-348ac78,5341007a
-348ac7c,1746800
-348ac80,80407b54
-348ac84,804078c0
-348ac88,1dffff
-348ac8c,534100f9
-348ac90,1767000
-348ac94,80407b54
-348ac98,804078c0
-348ac9c,1effff
-348aca0,53410097
-348aca4,1766a00
-348aca8,80407b54
-348acac,804078c0
-348acb0,20ffff
-348acb4,53410006
-348acb8,b90a02
-348acbc,80407b54
-348acc0,804078f8
-348acc4,10003
-348acc8,5341001c
-348accc,b90a02
-348acd0,80407b54
-348acd4,804078f8
-348acd8,10004
-348acdc,5341001d
-348ace0,b90a02
-348ace4,80407b54
-348ace8,804078f8
-348acec,10005
-348acf0,5341001e
-348acf4,b90a02
-348acf8,80407b54
-348acfc,804078f8
-348ad00,10006
-348ad04,5341002a
-348ad08,b90a02
-348ad0c,80407b54
-348ad10,804078f8
-348ad14,10007
-348ad18,53410061
-348ad1c,b90a02
-348ad20,80407b54
-348ad24,804078f8
-348ad28,1000a
-348ad2c,53410062
-348ad30,b80b01
-348ad34,80407b54
-348ad38,804078f8
-348ad3c,20000
-348ad40,53410063
-348ad44,b80b01
-348ad48,80407b54
-348ad4c,804078f8
-348ad50,20001
-348ad54,53410064
-348ad58,b80b01
-348ad5c,80407b54
-348ad60,804078f8
-348ad64,20002
-348ad68,53410065
-348ad6c,b80b01
-348ad70,80407b54
-348ad74,804078f8
-348ad78,20003
-348ad7c,5341007c
-348ad80,b80b01
-348ad84,80407b54
-348ad88,804078f8
-348ad8c,20004
-348ad90,5341007d
-348ad94,b80b01
-348ad98,80407b54
-348ad9c,804078f8
-348ada0,20005
-348ada4,5341007e
-348ada8,b80b01
-348adac,80407b54
-348adb0,804078f8
-348adb4,20006
-348adb8,5341007f
-348adbc,b80b01
-348adc0,80407b54
-348adc4,804078f8
-348adc8,20007
-348adcc,534100a2
-348add0,b80b01
-348add4,80407b54
-348add8,804078f8
-348addc,20008
-348ade0,53410087
-348ade4,b80b01
-348ade8,80407b54
-348adec,804078f8
-348adf0,20009
-348adf4,53410088
-348adf8,c81c01
-348adfc,80407b54
-348ae00,804078f8
-348ae04,40000
-348ae08,53410089
-348ae0c,c81c01
-348ae10,80407b54
-348ae14,804078f8
-348ae18,40001
-348ae1c,5341008a
-348ae20,c81c01
-348ae24,80407b54
-348ae28,804078f8
-348ae2c,40002
-348ae30,5341008b
-348ae34,c81c01
-348ae38,80407b54
-348ae3c,804078f8
-348ae40,40003
-348ae44,5341008c
-348ae48,c81c01
-348ae4c,80407b54
-348ae50,804078f8
-348ae54,40004
-348ae58,5341008e
-348ae5c,c81c01
-348ae60,80407b54
-348ae64,804078f8
-348ae68,40005
-348ae6c,5341008f
-348ae70,c81c01
-348ae74,80407b54
-348ae78,804078f8
-348ae7c,40006
-348ae80,534100a3
-348ae84,c81c01
-348ae88,80407b54
-348ae8c,804078f8
-348ae90,40007
-348ae94,534100a5
-348ae98,c81c01
-348ae9c,80407b54
-348aea0,804078f8
-348aea4,40008
-348aea8,53410092
-348aeac,c81c01
-348aeb0,80407b54
-348aeb4,804078f8
-348aeb8,40009
-348aebc,53410093
-348aec0,aa0203
-348aec4,80407b54
-348aec8,8040790c
-348aecc,3ffff
-348aed0,53410094
-348aed4,aa0203
-348aed8,80407b54
-348aedc,8040790c
-348aee0,4ffff
-348aee4,53410095
-348aee8,aa0203
-348aeec,80407b54
-348aef0,8040790c
-348aef4,5ffff
-348aef8,534100a6
-348aefc,aa0203
-348af00,80407b54
-348af04,8040790c
-348af08,6ffff
-348af0c,534100a9
-348af10,aa0203
-348af14,80407b54
-348af18,8040790c
-348af1c,7ffff
-348af20,5341009b
-348af24,aa0203
-348af28,80407b54
-348af2c,8040790c
-348af30,8ffff
-348af34,5341009f
-348af38,aa0203
-348af3c,80407b54
-348af40,8040790c
-348af44,bffff
-348af48,534100a0
-348af4c,aa0203
-348af50,80407b54
-348af54,8040790c
-348af58,cffff
-348af5c,534100a1
-348af60,aa0203
-348af64,80407b54
-348af68,8040790c
-348af6c,dffff
-348af70,534100e9
-348af74,1941300
-348af78,80407b54
-348af7c,80407930
-348af80,ffffffff
-348af84,534100e4
-348af88,cd1e00
-348af8c,80407b54
-348af90,8040794c
-348af94,ffffffff
-348af98,534100e8
-348af9c,cd1f00
-348afa0,80407b54
-348afa4,80407968
-348afa8,ffffffff
-348afac,53410073
-348afb0,b60300
-348afb4,80407b54
-348afb8,80407998
-348afbc,6ffff
-348afc0,53410074
-348afc4,b60400
-348afc8,80407b54
-348afcc,80407998
-348afd0,7ffff
-348afd4,53410075
-348afd8,b60500
-348afdc,80407b54
-348afe0,80407998
-348afe4,8ffff
-348afe8,53410076
-348afec,b60600
-348aff0,80407b54
-348aff4,80407998
-348aff8,9ffff
-348affc,53410077
-348b000,b60700
-348b004,80407b54
-348b008,80407998
-348b00c,affff
-348b010,53410078
-348b014,b60800
-348b018,80407b54
-348b01c,80407998
-348b020,bffff
-348b024,534100d4
-348b028,b60400
-348b02c,80407b54
-348b030,80407998
-348b034,cffff
-348b038,534100d2
-348b03c,b60600
-348b040,80407b54
-348b044,80407998
-348b048,dffff
-348b04c,534100d1
-348b050,b60300
-348b054,80407b54
-348b058,80407998
-348b05c,effff
-348b060,534100d3
-348b064,b60800
-348b068,80407b54
-348b06c,80407998
-348b070,fffff
-348b074,534100d5
-348b078,b60500
-348b07c,80407b54
-348b080,80407998
-348b084,10ffff
-348b088,534100d6
-348b08c,b60700
-348b090,80407b54
-348b094,80407998
-348b098,11ffff
-348b09c,534100f8
-348b0a0,d12300
-348b0a4,80407b54
-348b0a8,8040787c
-348b0ac,3ffff
-348b0b0,53149099
-348b0b4,10b4500
-348b0b8,80407b54
-348b0bc,804077ac
-348b0c0,ffffffff
-348b0c4,53419048
-348b0c8,f33e00
-348b0cc,80407b54
-348b0d0,804079cc
-348b0d4,ffffffff
-348b0d8,53419003
-348b0dc,1933500
-348b0e0,80407b54
-348b0e4,804077c0
-348b0e8,ffffffff
-348b0ec,53419097
-348b0f0,ef3b00
-348b0f4,80407b54
-348b0f8,804077ac
-348b0fc,ffffffff
-348b100,4d419098
-348b104,ef3b01
-348b108,80407b54
-348b10c,804077ac
-348b110,ffffffff
-348b118,1
-348b11c,1
-348b120,d
-348b124,41200000
-348b128,41200000
-348b12c,8040a0b8
-348b130,8040a0a8
-348b138,df000000
-348b140,80112f1a
-348b144,80112f14
-348b148,80112f0e
-348b14c,80112f08
-348b150,8011320a
-348b154,80113204
-348b158,801131fe
-348b15c,801131f8
-348b160,801131f2
-348b164,801131ec
-348b168,801131e6
-348b16c,801131e0
-348b170,8012be1e
-348b174,8012be20
-348b178,8012be1c
-348b17c,8012be12
-348b180,8012be14
-348b184,8012be10
-348b188,801c7672
-348b18c,801c767a
-348b190,801c7950
-348b194,8011bd50
-348b198,8011bd38
-348b19c,801d8b9e
-348b1a0,801d8b92
-348b1a4,c80000
-348b1ac,ff0046
-348b1b0,32ffff
-348c2f8,db000
-348c2fc,db000
-348c300,db000
-348c304,cb000
-348c308,cb000
-348c30c,ca000
-348c314,db000
-348c318,db000
-348c330,e8ac00
-348c334,e8ac00
-348c338,e8ac00
-348c33c,e8ac00
-348c364,d77d0
-348c368,2e3ab0
-348c36c,7d0c90
-348c370,8ffffffd
-348c374,c96e00
-348c378,2e4ac00
-348c37c,effffff4
-348c380,ab0e500
-348c384,c95e000
-348c388,e59c000
-348c3a0,79000
-348c3a4,5ceeb40
-348c3a8,cc8a990
-348c3ac,da79000
-348c3b0,8ecb400
-348c3b4,4adda0
-348c3b8,797e2
-348c3bc,c88aae0
-348c3c0,6ceed70
-348c3c4,79000
-348c3c8,79000
-348c3d8,6dea0000
-348c3dc,c94d6000
-348c3e0,c94d6033
-348c3e4,6deb6bc6
-348c3e8,8cb600
-348c3ec,7ca4cec4
-348c3f0,3109c3bb
-348c3f4,9c3bb
-348c3f8,2ced4
-348c410,4cefb00
-348c414,ad50000
-348c418,8e30000
-348c41c,9ec0000
-348c420,7e4db0ab
-348c424,bb05e8aa
-348c428,bc008ed6
-348c42c,7e936ed0
-348c430,8ded9ea
-348c448,ca000
-348c44c,ca000
-348c450,ca000
-348c454,ca000
-348c478,c900
-348c47c,7e200
-348c480,cb000
-348c484,e8000
-348c488,6f3000
-348c48c,8e0000
-348c490,8e0000
-348c494,6f4000
-348c498,e8000
-348c49c,cb000
-348c4a0,7e200
-348c4a4,c900
-348c4b0,bb0000
-348c4b4,5e4000
-348c4b8,ca000
-348c4bc,ad000
-348c4c0,7e100
-348c4c4,6f400
-348c4c8,6f400
-348c4cc,7e100
-348c4d0,ad000
-348c4d4,ca000
-348c4d8,5e4000
-348c4dc,bb0000
-348c4f0,a8000
-348c4f4,c8a8ab0
-348c4f8,3beda10
-348c4fc,3beda10
-348c500,c8a8ab0
-348c504,a8000
-348c52c,ca000
-348c530,ca000
-348c534,ca000
-348c538,affffff8
-348c53c,ca000
-348c540,ca000
-348c544,ca000
-348c57c,dd000
-348c580,ec000
-348c584,4f8000
-348c588,9d0000
-348c5ac,dffb00
-348c5ec,ec000
-348c5f0,ec000
-348c608,bc0
-348c60c,4e60
-348c610,bc00
-348c614,3e800
-348c618,ad000
-348c61c,1e9000
-348c620,9e2000
-348c624,da0000
-348c628,7e30000
-348c62c,cb00000
-348c630,6e500000
-348c640,3ceeb00
-348c644,bd57e90
-348c648,e900bd0
-348c64c,5f7009e0
-348c650,6f6cb9e0
-348c654,5f7009e0
-348c658,e900bd0
-348c65c,bd57e90
-348c660,3ceeb00
-348c678,affe000
-348c67c,8e000
-348c680,8e000
-348c684,8e000
-348c688,8e000
-348c68c,8e000
-348c690,8e000
-348c694,8e000
-348c698,8ffffe0
-348c6b0,8deea00
-348c6b4,c837e90
-348c6b8,cc0
-348c6bc,2ea0
-348c6c0,bd20
-348c6c4,bd400
-348c6c8,bd4000
-348c6cc,bd40000
-348c6d0,2fffffd0
-348c6e8,7ceea00
-348c6ec,c837e90
-348c6f0,cb0
-348c6f4,27e90
-348c6f8,bffb00
-348c6fc,27da0
-348c700,ad0
-348c704,5c627db0
-348c708,9deeb30
-348c720,2de00
-348c724,bde00
-348c728,7d9e00
-348c72c,2d79e00
-348c730,bb09e00
-348c734,6e409e00
-348c738,9ffffff7
-348c73c,9e00
-348c740,9e00
-348c758,cffff50
-348c75c,ca00000
-348c760,ca00000
-348c764,ceeea00
-348c768,38e90
-348c76c,bc0
-348c770,bc0
-348c774,5c638e90
-348c778,9deda00
-348c790,aeec30
-348c794,ae83980
-348c798,e900000
-348c79c,4faeec40
-348c7a0,6fd55dc0
-348c7a4,5f9009e0
-348c7a8,e9009e0
-348c7ac,cd55dc0
-348c7b0,3ceec40
-348c7c8,5fffffd0
-348c7cc,da0
-348c7d0,7e40
-348c7d4,cc00
-348c7d8,4e800
-348c7dc,ad000
-348c7e0,da000
-348c7e4,8e4000
-348c7e8,cc0000
-348c800,5ceec30
-348c804,dc45db0
-348c808,e900bd0
-348c80c,bc45d90
-348c810,4dffc20
-348c814,1db45cc0
-348c818,5f6009e0
-348c81c,2eb35cd0
-348c820,7deec50
-348c838,6deeb00
-348c83c,db37e90
-348c840,5f500bd0
-348c844,5f500be0
-348c848,db37ee0
-348c84c,6dedbe0
-348c850,bc0
-348c854,9749e70
-348c858,5ded800
-348c878,ec000
-348c87c,ec000
-348c88c,ec000
-348c890,ec000
-348c8b0,ec000
-348c8b4,ec000
-348c8c4,dd000
-348c8c8,ec000
-348c8cc,4f8000
-348c8d0,9d0000
-348c8e8,29c8
-348c8ec,7bed93
-348c8f0,8dda4000
-348c8f4,8dda4000
-348c8f8,7bec93
-348c8fc,29c8
-348c924,affffff8
-348c930,affffff8
-348c958,ac810000
-348c95c,4adeb600
-348c960,6add6
-348c964,6add6
-348c968,4adeb600
-348c96c,ac810000
-348c988,4beec30
-348c98c,9a46ea0
-348c990,1da0
-348c994,2cd30
-348c998,cc100
-348c99c,e9000
-348c9a4,e9000
-348c9a8,e9000
-348c9c0,1aeed70
-348c9c4,cd739e4
-348c9c8,7e2000c9
-348c9cc,ba0aeeca
-348c9d0,d76e64da
-348c9d4,d69c00aa
-348c9d8,d76e64da
-348c9dc,ba0aeeca
-348c9e0,6e400000
-348c9e4,ad83000
-348c9e8,8dee90
-348c9f8,3ed000
-348c9fc,9de600
-348ca00,cbcb00
-348ca04,3e8ad00
-348ca08,8e26f60
-348ca0c,cc00ea0
-348ca10,2effffd0
-348ca14,8e5008f5
-348ca18,cd0001ea
-348ca30,effec40
-348ca34,e905dc0
-348ca38,e900ae0
-348ca3c,e905dc0
-348ca40,efffd50
-348ca44,e904bd2
-348ca48,e9005f6
-348ca4c,e904be3
-348ca50,effed80
-348ca68,9ded80
-348ca6c,8e936b0
-348ca70,db00000
-348ca74,3f900000
-348ca78,5f700000
-348ca7c,1e900000
-348ca80,db00000
-348ca84,8e947b0
-348ca88,9ded80
-348caa0,5ffed800
-348caa4,5f65ae80
-348caa8,5f600cd0
-348caac,5f6009e0
-348cab0,5f6009f0
-348cab4,5f6009e0
-348cab8,5f600cd0
-348cabc,5f65ae80
-348cac0,5ffed800
-348cad8,dffffe0
-348cadc,db00000
-348cae0,db00000
-348cae4,db00000
-348cae8,dffffc0
-348caec,db00000
-348caf0,db00000
-348caf4,db00000
-348caf8,dfffff0
-348cb10,bfffff4
-348cb14,bd00000
-348cb18,bd00000
-348cb1c,bd00000
-348cb20,bffffc0
-348cb24,bd00000
-348cb28,bd00000
-348cb2c,bd00000
-348cb30,bd00000
-348cb48,1aeed60
-348cb4c,be738a0
-348cb50,4e900000
-348cb54,8f400000
-348cb58,9f10bff2
-348cb5c,7f4007f2
-348cb60,4e9007f2
-348cb64,be739f2
-348cb68,1beed90
-348cb80,5f6009e0
-348cb84,5f6009e0
-348cb88,5f6009e0
-348cb8c,5f6009e0
-348cb90,5fffffe0
-348cb94,5f6009e0
-348cb98,5f6009e0
-348cb9c,5f6009e0
-348cba0,5f6009e0
-348cbb8,dffffb0
-348cbbc,db000
-348cbc0,db000
-348cbc4,db000
-348cbc8,db000
-348cbcc,db000
-348cbd0,db000
-348cbd4,db000
-348cbd8,dffffb0
-348cbf0,cfff40
-348cbf4,7f40
-348cbf8,7f40
-348cbfc,7f40
-348cc00,7f40
-348cc04,7f30
-348cc08,75009e00
-348cc0c,8d64dc00
-348cc10,2beec500
-348cc28,5f6009e7
-348cc2c,5f609e70
-348cc30,5f69e700
-348cc34,5fbe8000
-348cc38,5fedb000
-348cc3c,5f87e800
-348cc40,5f60ae40
-348cc44,5f601dc0
-348cc48,5f6006ea
-348cc60,cc00000
-348cc64,cc00000
-348cc68,cc00000
-348cc6c,cc00000
-348cc70,cc00000
-348cc74,cc00000
-348cc78,cc00000
-348cc7c,cc00000
-348cc80,cfffff7
-348cc98,afa00cf8
-348cc9c,aed02ee8
-348cca0,add59be8
-348cca4,adaac8e8
-348cca8,ad5de1e8
-348ccac,ad0db0e8
-348ccb0,ad0000e8
-348ccb4,ad0000e8
-348ccb8,ad0000e8
-348ccd0,5fc008e0
-348ccd4,5fe608e0
-348ccd8,5fcb08e0
-348ccdc,5f7e48e0
-348cce0,5f5ca8e0
-348cce4,5f57e8e0
-348cce8,5f50dce0
-348ccec,5f509ee0
-348ccf0,5f502ee0
-348cd08,4ceeb20
-348cd0c,cd56ea0
-348cd10,3e800ae0
-348cd14,7f5008f2
-348cd18,7f4008f4
-348cd1c,7f5008f2
-348cd20,3e800ae0
-348cd24,cd56eb0
-348cd28,4ceeb20
-348cd40,dffed60
-348cd44,db05ce2
-348cd48,db006f6
-348cd4c,db006f6
-348cd50,db05ce2
-348cd54,dffed60
-348cd58,db00000
-348cd5c,db00000
-348cd60,db00000
-348cd78,4ceeb20
-348cd7c,cd56ea0
-348cd80,3e800ae0
-348cd84,7f5008f2
-348cd88,7f4008f4
-348cd8c,7f5008f1
-348cd90,3e800ad0
-348cd94,cd56ea0
-348cd98,4cefc20
-348cd9c,ae50
-348cda0,c80
-348cdb0,5ffeeb20
-348cdb4,5f717eb0
-348cdb8,5f700cd0
-348cdbc,5f716ea0
-348cdc0,5fffea00
-348cdc4,5f72ae40
-348cdc8,5f700db0
-348cdcc,5f7008e5
-348cdd0,5f7000db
-348cde8,6ceeb30
-348cdec,dc45a90
-348cdf0,4f600000
-348cdf4,ec60000
-348cdf8,5ceeb40
-348cdfc,6cc0
-348ce00,8e0
-348ce04,c735cd0
-348ce08,8deec50
-348ce20,cffffffb
-348ce24,db000
-348ce28,db000
-348ce2c,db000
-348ce30,db000
-348ce34,db000
-348ce38,db000
-348ce3c,db000
-348ce40,db000
-348ce58,4f7009e0
-348ce5c,4f7009e0
-348ce60,4f7009e0
-348ce64,4f7009e0
-348ce68,4f7009e0
-348ce6c,3f7009e0
-348ce70,2e700ad0
-348ce74,dc45dc0
-348ce78,5ceec40
-348ce90,ad0003e8
-348ce94,6f5008e3
-348ce98,e900bc0
-348ce9c,bc00d90
-348cea0,8e15e40
-348cea4,2e7ad00
-348cea8,cbca00
-348ceac,9de600
-348ceb0,3ed000
-348cec8,e80000ad
-348cecc,da0000cb
-348ced0,cb0000da
-348ced4,ac0ec0e8
-348ced8,8d6de1e5
-348cedc,6e9bd8e0
-348cee0,1ec8acd0
-348cee4,de37ec0
-348cee8,cd00ea0
-348cf00,6e7007e7
-348cf04,ad21db0
-348cf08,2daad20
-348cf0c,7ee700
-348cf10,3ee200
-348cf14,bdda00
-348cf18,7e67e60
-348cf1c,3ea00bd0
-348cf20,bd2004e9
-348cf38,ae2005e8
-348cf3c,2da00cc0
-348cf40,7e57e50
-348cf44,ccda00
-348cf48,4ed200
-348cf4c,db000
-348cf50,db000
-348cf54,db000
-348cf58,db000
-348cf70,efffff8
-348cf74,bd3
-348cf78,7e70
-348cf7c,3ea00
-348cf80,bd100
-348cf84,8e5000
-348cf88,4e90000
-348cf8c,cc00000
-348cf90,1ffffffa
-348cfa0,4ffc00
-348cfa4,4f5000
-348cfa8,4f5000
-348cfac,4f5000
-348cfb0,4f5000
-348cfb4,4f5000
-348cfb8,4f5000
-348cfbc,4f5000
-348cfc0,4f5000
-348cfc4,4f5000
-348cfc8,4f5000
-348cfcc,4ffc00
-348cfe0,6e500000
-348cfe4,cb00000
-348cfe8,7e30000
-348cfec,da0000
-348cff0,9e2000
-348cff4,1e9000
-348cff8,ad000
-348cffc,3e800
-348d000,bc00
-348d004,4e60
-348d008,bc0
-348d010,dfe000
-348d014,8e000
-348d018,8e000
-348d01c,8e000
-348d020,8e000
-348d024,8e000
-348d028,8e000
-348d02c,8e000
-348d030,8e000
-348d034,8e000
-348d038,8e000
-348d03c,dfe000
-348d050,5ed200
-348d054,dcdb00
-348d058,ad25e80
-348d05c,7e5007e5
-348d0b4,fffffffd
-348d0bc,2ca0000
-348d0c0,2c9000
-348d100,5ceeb10
-348d104,b936da0
-348d108,bc0
-348d10c,8deffc0
-348d110,3e930bd0
-348d114,4f827ed0
-348d118,aeedbd0
-348d128,d900000
-348d12c,d900000
-348d130,d900000
-348d134,d900000
-348d138,dbdec40
-348d13c,de65dc0
-348d140,db008e0
-348d144,da007f2
-348d148,db008e0
-348d14c,de64db0
-348d150,dbdec40
-348d170,8ded70
-348d174,7e936a0
-348d178,cc00000
-348d17c,db00000
-348d180,cc00000
-348d184,7e936a0
-348d188,8ded70
-348d198,bc0
-348d19c,bc0
-348d1a0,bc0
-348d1a4,bc0
-348d1a8,5dedcc0
-348d1ac,dc48ec0
-348d1b0,5f600cc0
-348d1b4,7f300bc0
-348d1b8,5f600cc0
-348d1bc,dc48ec0
-348d1c0,5dedcc0
-348d1e0,3beec30
-348d1e4,cd54cc0
-348d1e8,4f6007e0
-348d1ec,6ffffff3
-348d1f0,4f500000
-348d1f4,cc538c0
-348d1f8,3beec60
-348d208,5ded0
-348d20c,cb200
-348d210,d9000
-348d214,e8000
-348d218,dffffd0
-348d21c,e8000
-348d220,e8000
-348d224,e8000
-348d228,e8000
-348d22c,e8000
-348d230,e8000
-348d250,5dedcc0
-348d254,dc48ec0
-348d258,5f600cc0
-348d25c,7f300bc0
-348d260,5f600cc0
-348d264,dc48ec0
-348d268,5dedcb0
-348d26c,ca0
-348d270,9947e60
-348d274,4cee900
-348d278,da00000
-348d27c,da00000
-348d280,da00000
-348d284,da00000
-348d288,dbded40
-348d28c,de65da0
-348d290,db00bc0
-348d294,da00bc0
-348d298,da00bc0
-348d29c,da00bc0
-348d2a0,da00bc0
-348d2b0,bc000
-348d2c0,9ffc000
-348d2c4,bc000
-348d2c8,bc000
-348d2cc,bc000
-348d2d0,bc000
-348d2d4,bc000
-348d2d8,effffe0
-348d2e8,7e000
-348d2f8,7ffe000
-348d2fc,7e000
-348d300,7e000
-348d304,7e000
-348d308,7e000
-348d30c,7e000
-348d310,7e000
-348d314,7e000
-348d318,1bd000
-348d31c,dfe7000
-348d320,bc00000
-348d324,bc00000
-348d328,bc00000
-348d32c,bc00000
-348d330,bc03dc2
-348d334,bc3db00
-348d338,bddc000
-348d33c,bfce500
-348d340,bd0cd10
-348d344,bc03db0
-348d348,bc007e8
-348d358,eff4000
-348d35c,5f4000
-348d360,5f4000
-348d364,5f4000
-348d368,5f4000
-348d36c,5f4000
-348d370,5f4000
-348d374,5f4000
-348d378,4f5000
-348d37c,ea000
-348d380,8efb0
-348d3a0,8dddaec0
-348d3a4,8e4dc5e4
-348d3a8,8d0cb0e6
-348d3ac,8d0ba0e7
-348d3b0,8d0ba0e7
-348d3b4,8d0ba0e7
-348d3b8,8d0ba0e7
-348d3d8,dbded40
-348d3dc,de65da0
-348d3e0,db00bc0
-348d3e4,da00bc0
-348d3e8,da00bc0
-348d3ec,da00bc0
-348d3f0,da00bc0
-348d410,4ceeb20
-348d414,cd56da0
-348d418,1e700ad0
-348d41c,5f6008e0
-348d420,1e700ad0
-348d424,cd46db0
-348d428,4ceeb20
-348d448,dbdec30
-348d44c,de65db0
-348d450,db009e0
-348d454,da007e0
-348d458,db008e0
-348d45c,de65db0
-348d460,dbeec40
-348d464,d900000
-348d468,d900000
-348d46c,d900000
-348d480,4cedcc0
-348d484,cc47ec0
-348d488,1e700cc0
-348d48c,5f600bc0
-348d490,2e700cc0
-348d494,cc47ec0
-348d498,5cedbc0
-348d49c,ac0
-348d4a0,ac0
-348d4a4,ac0
-348d4b8,ccdef9
-348d4bc,ce8300
-348d4c0,cb0000
-348d4c4,ca0000
-348d4c8,ca0000
-348d4cc,ca0000
-348d4d0,ca0000
-348d4f0,4ceea10
-348d4f4,bd45b60
-348d4f8,bd40000
-348d4fc,3bddb20
-348d500,4da0
-348d504,b945ea0
-348d508,5ceeb20
-348d520,8e0000
-348d524,8e0000
-348d528,6fffffb0
-348d52c,8e0000
-348d530,8e0000
-348d534,8e0000
-348d538,8e0000
-348d53c,6e7000
-348d540,befb0
-348d560,da00bc0
-348d564,da00bc0
-348d568,da00bc0
-348d56c,da00bc0
-348d570,da00bc0
-348d574,bd47ec0
-348d578,5dedbc0
-348d598,6e3007e3
-348d59c,d900bc0
-348d5a0,ad01e80
-348d5a4,5e48e20
-348d5a8,dacb00
-348d5ac,9de700
-348d5b0,3ee000
-348d5d0,e80000ac
-348d5d4,ca0000ca
-348d5d8,ac0db0e7
-348d5dc,6e3dd5e2
-348d5e0,eabcad0
-348d5e4,ce79eb0
-348d5e8,ae15f80
-348d608,3da00bc0
-348d60c,6e69e40
-348d610,9ee700
-348d614,2ed000
-348d618,ccda00
-348d61c,9e46e70
-348d620,6e7009e4
-348d640,6e5005e5
-348d644,da00bd0
-348d648,9e00e90
-348d64c,3e78e30
-348d650,cccc00
-348d654,7ee700
-348d658,de000
-348d65c,da000
-348d660,8e5000
-348d664,dea0000
-348d678,bffffc0
-348d67c,5e70
-348d680,3d900
-348d684,cb000
-348d688,bd2000
-348d68c,9e40000
-348d690,dffffc0
-348d6a0,6dea0
-348d6a4,bd300
-348d6a8,cb000
-348d6ac,cb000
-348d6b0,5ea000
-348d6b4,bfd2000
-348d6b8,7e9000
-348d6bc,db000
-348d6c0,cb000
-348d6c4,cb000
-348d6c8,bd400
-348d6cc,5dea0
-348d6d8,ca000
-348d6dc,ca000
-348d6e0,ca000
-348d6e4,ca000
-348d6e8,ca000
-348d6ec,ca000
-348d6f0,ca000
-348d6f4,ca000
-348d6f8,ca000
-348d6fc,ca000
-348d700,ca000
-348d704,ca000
-348d708,ca000
-348d710,bed3000
-348d714,4e9000
-348d718,da000
-348d71c,ca000
-348d720,bc400
-348d724,5efa0
-348d728,bd500
-348d72c,cb000
-348d730,da000
-348d734,da000
-348d738,5e8000
-348d73c,bec2000
-348d760,5ded83a7
-348d764,9838dec3
-348d7d8,7f024429
-348d7dc,3c334133
-348d7e0,41334633
-348d7e4,44297f02
-348d814,5409
-348d818,4dc548ff
-348d81c,41ff43ff
-348d820,47ff49ff
-348d824,43ff20c5
-348d828,c0000
-348d854,3f75
-348d858,49ff33ff
-348d85c,28ff2dff
-348d860,33ff39ff
-348d864,3cff00ff
-348d868,770000
-348d894,329d
-348d898,37ff1bff
-348d89c,21ff28ff
-348d8a0,2fff35ff
-348d8a4,3cff00ff
-348d8a8,9d0000
-348d8d4,329e
-348d8d8,35ff21ff
-348d8dc,28ff06ff
-348d8e0,9ff3cff
-348d8e4,42ff00ff
-348d8e8,9e0000
-348d914,359e
-348d918,39ff27ff
-348d91c,2eff00ff
-348d920,2ff42ff
-348d924,48ff00ff
-348d928,9e0000
-348d954,3a9e
-348d958,3eff2eff
-348d95c,35ff00ff
-348d960,dff48ff
-348d964,4dff00ff
-348d968,9e0000
-348d994,3e9e
-348d998,42ff35ff
-348d99c,3bff1bff
-348d9a0,27ff4dff
-348d9a4,53ff00ff
-348d9a8,9e0000
-348d9d4,439e
-348d9d8,47ff3bff
-348d9dc,41ff47ff
-348d9e0,4dff52ff
-348d9e4,58ff00ff
-348d9e8,9e0000
-348da14,4d9e
-348da18,4dff41ff
-348da1c,47ff4dff
-348da20,52ff57ff
-348da24,5cff00ff
-348da28,9e0000
-348da44,3f04474f
-348da48,3e663e66
-348da4c,43664666
-348da50,48664d66
-348da54,57665bc5
-348da58,53ff47ff
-348da5c,4dff52ff
-348da60,57ff5cff
-348da64,60ff0eff
-348da68,19c56666
-348da6c,66666466
-348da70,61665f66
-348da74,5c665a66
-348da78,504f3f04
-348da80,6605
-348da84,4ec34bff
-348da88,41ff41ff
-348da8c,45ff48ff
-348da90,4cff4fff
-348da94,55ff59ff
-348da98,4fff4dff
-348da9c,52ff57ff
-348daa0,5cff60ff
-348daa4,64ff61ff
-348daa8,67ff66ff
-348daac,64ff62ff
-348dab0,60ff5dff
-348dab4,5bff57ff
-348dab8,49ff0ec3
-348dabc,50000
-348dac0,3958
-348dac4,44ff31ff
-348dac8,20ff25ff
-348dacc,2bff31ff
-348dad0,38ff3eff
-348dad4,44ff49ff
-348dad8,4dff52ff
-348dadc,57ff5cff
-348dae0,60ff64ff
-348dae4,68ff67ff
-348dae8,64ff60ff
-348daec,5cff58ff
-348daf0,53ff4eff
-348daf4,48ff43ff
-348daf8,32ff00ff
-348dafc,580000
-348db00,2f71
-348db04,36ff1dff
-348db08,1fff26ff
-348db0c,2dff34ff
-348db10,3aff41ff
-348db14,47ff4cff
-348db18,52ff57ff
-348db1c,5cff60ff
-348db20,64ff68ff
-348db24,67ff64ff
-348db28,60ff5bff
-348db2c,57ff51ff
-348db30,4cff46ff
-348db34,40ff3aff
-348db38,27ff00ff
-348db3c,710000
-348db40,2f71
-348db44,36ff21ff
-348db48,16ff00ff
-348db4c,ff00ff
-348db50,2cff47ff
-348db54,4cff52ff
-348db58,57ff5cff
-348db5c,60ff64ff
-348db60,67ff67ff
-348db64,64ff60ff
-348db68,5bff57ff
-348db6c,52ff0dff
-348db70,ff00ff
-348db74,aff33ff
-348db78,21ff00ff
-348db7c,710000
-348db80,3371
-348db84,3aff28ff
-348db88,22ff0fff
-348db8c,13ff19ff
-348db90,39ff4cff
-348db94,52ff57ff
-348db98,5bff60ff
-348db9c,64ff67ff
-348dba0,67ff64ff
-348dba4,60ff5cff
-348dba8,57ff52ff
-348dbac,4cff1dff
-348dbb0,12ff14ff
-348dbb4,19ff2dff
-348dbb8,1bff00ff
-348dbbc,710000
-348dbc0,3871
-348dbc4,3dff2fff
-348dbc8,33ff3aff
-348dbcc,40ff46ff
-348dbd0,4cff51ff
-348dbd4,57ff5bff
-348dbd8,60ff64ff
-348dbdc,67ff68ff
-348dbe0,64ff60ff
-348dbe4,5cff57ff
-348dbe8,52ff4cff
-348dbec,47ff41ff
-348dbf0,3aff34ff
-348dbf4,2dff26ff
-348dbf8,12ff00ff
-348dbfc,710000
-348dc00,3569
-348dc04,37ff33ff
-348dc08,3aff40ff
-348dc0c,46ff4cff
-348dc10,51ff57ff
-348dc14,5bff60ff
-348dc18,64ff67ff
-348dc1c,68ff64ff
-348dc20,60ff5cff
-348dc24,57ff52ff
-348dc28,4dff47ff
-348dc2c,41ff3aff
-348dc30,34ff2dff
-348dc34,26ff1fff
-348dc38,6ff00ff
-348dc3c,690000
-348dc40,1e21
-348dc44,2f600ff
-348dc48,ff00ff
-348dc4c,ff00ff
-348dc50,ff00ff
-348dc54,2ff1eff
-348dc58,60ff68ff
-348dc5c,64ff60ff
-348dc60,5cff57ff
-348dc64,52ff2cff
-348dc68,6ff00ff
-348dc6c,ff00ff
-348dc70,ff00ff
-348dc74,ff00ff
-348dc78,ff00f6
-348dc7c,210000
-348dc84,3b00ae
-348dc88,cc00cc
-348dc8c,cc00cc
-348dc90,cc00cc
-348dc94,cc03ec
-348dc98,62ff64ff
-348dc9c,60ff5cff
-348dca0,57ff52ff
-348dca4,4dff00ff
-348dca8,ec00cc
-348dcac,cc00cc
-348dcb0,cc00cc
-348dcb4,cc00cc
-348dcb8,ae003b
-348dcd4,5f9e
-348dcd8,65ff60ff
-348dcdc,5cff57ff
-348dce0,52ff4dff
-348dce4,47ff00ff
-348dce8,9e0000
-348dd14,659e
-348dd18,63ff5cff
-348dd1c,57ff52ff
-348dd20,4dff47ff
-348dd24,41ff00ff
-348dd28,9e0000
-348dd54,649e
-348dd58,61ff58ff
-348dd5c,53ff35ff
-348dd60,31ff41ff
-348dd64,3bff00ff
-348dd68,9e0000
-348dd94,609e
-348dd98,5eff53ff
-348dd9c,4dff00ff
-348dda0,ff3bff
-348dda4,35ff00ff
-348dda8,9e0000
-348ddd4,5d9e
-348ddd8,5bff4dff
-348dddc,48ff00ff
-348dde0,6ff35ff
-348dde4,2eff00ff
-348dde8,9e0000
-348de14,5a9e
-348de18,57ff48ff
-348de1c,42ff03ff
-348de20,cff2eff
-348de24,28ff00ff
-348de28,9e0000
-348de54,559e
-348de58,53ff42ff
-348de5c,3cff2dff
-348de60,28ff28ff
-348de64,1fff00ff
-348de68,9e0000
-348de94,4b91
-348de98,44ff33ff
-348de9c,35ff2fff
-348dea0,28ff1fff
-348dea4,7ff00ff
-348dea8,900000
-348ded4,1229
-348ded8,f700ff
-348dedc,ff00ff
-348dee0,ff00ff
-348dee4,ff00f8
-348dee8,2e0000
-348df18,30008c
-348df1c,990099
-348df20,990099
-348df24,8c0030
-348df80,f0f0f0f0
-348df84,f0f0f0f0
-348df88,f0f0f0f0
-348df8c,f0f0f0f0
-348df90,f0f0f0f0
-348df94,f0f0f0f0
-348df98,dff0f0f0
-348df9c,f0f0f0f0
-348dfa0,f0f0f0f0
-348dfa4,f0f0f0df
-348dfa8,dff0f0f0
-348dfac,f0f0f0f0
-348dfb0,f0f0f0f0
-348dfb4,f0f0f0df
-348dfb8,dfcff0f0
-348dfbc,f0f0f0f0
-348dfc0,f0f0f0f0
-348dfc4,f0f0cfcf
-348dfc8,cfcff0f0
-348dfcc,f0f0f0f0
-348dfd0,f0f0f0f0
-348dfd4,f0f0cfcf
-348dfd8,cfcfcff0
-348dfdc,f0f0f0f0
-348dfe0,f0f0f0f0
-348dfe4,f0cfcfcf
-348dfe8,cfcfcff0
-348dfec,f0f0f0f0
-348dff0,f0f0f0f0
-348dff4,f0cfcfcf
-348dff8,cfcfcfcf
-348dffc,f0f0f0f0
-348e000,f0f0f0f0
-348e004,cfcfcfcf
-348e008,cfbfbfbf
-348e00c,f0f0f0f0
-348e010,f0f0f0f0
-348e014,bfbfbfbf
-348e018,bfbfbfbf
-348e01c,f0f0f0f0
-348e020,f0f0f0bf
-348e024,bfbfbfbf
-348e028,bfbfbfbf
-348e02c,bff0f0f0
-348e030,f0f0f0bf
-348e034,bfbff0f0
-348e038,f0f0f0f0
-348e03c,f0f0f0f0
-348e040,f0f0f0f0
-348e044,f0f0f0f0
-348e048,f0f0f0f0
-348e04c,f0f0f0f0
-348e050,f0f0f0f0
-348e054,f0f0f0f0
-348e058,f0f0f0f0
-348e05c,f0f0f0f0
-348e060,f0f0f0f0
-348e064,f0f0f0f0
-348e068,f0f0f0f0
-348e06c,f0f0f0f0
-348e070,f0f0f0f0
-348e074,f0f0f0f0
-348e078,f0f0f0f0
-348e07c,f0f0f0f0
-348e080,f0f0f0f0
-348e084,f0f0f0f0
-348e088,f0f0f0f0
-348e08c,f0f0f0f0
-348e090,f0f0f0f0
-348e094,f0f0f0cf
-348e098,cff0f0f0
-348e09c,f0f0f0f0
-348e0a0,f0f0f0f0
-348e0a4,f0f0f0cf
-348e0a8,cfcff0f0
-348e0ac,f0f0f0f0
-348e0b0,f0f0f0f0
-348e0b4,f0f0bfcf
-348e0b8,cfcff0f0
-348e0bc,f0f0f0f0
-348e0c0,f0f0f0f0
-348e0c4,f0f0bfcf
-348e0c8,cfcff0f0
-348e0cc,f0f0f0f0
-348e0d0,f0f0f0f0
-348e0d4,f0bfcfbf
-348e0d8,bfbfbff0
-348e0dc,f0f0f0f0
-348e0e0,f0f0f0f0
-348e0e4,f0bfbfbf
-348e0e8,bfbfbff0
-348e0ec,f0f0f0f0
-348e0f0,f0f0f0f0
-348e0f4,bfbfbfbf
-348e0f8,bfbfbfbf
-348e0fc,f0f0f0f0
-348e100,f0f0f0f0
-348e104,bfbfbfbf
-348e108,bfbfbfbf
-348e10c,f0f0f0f0
-348e110,f0f0f0f0
-348e114,bfbfbfbf
-348e118,bfbfbfaf
-348e11c,f0f0f0f0
-348e120,f0f0f0af
-348e124,bfbfbfbf
-348e128,afafaff0
-348e12c,f0f0f0f0
-348e130,f0f0f0bf
-348e134,bfbfaff0
-348e138,f0f0f0f0
-348e13c,f0f0f0f0
-348e140,f0f0f0f0
-348e144,f0f0f0f0
-348e148,f0f0f0f0
-348e14c,f0f0f0f0
-348e150,f0f0f0f0
-348e154,f0f0f0f0
-348e158,f0f0f0f0
-348e15c,f0f0f0f0
-348e160,f0f0f0f0
-348e164,f0f0f0f0
-348e168,f0f0f0f0
-348e16c,f0f0f0f0
-348e170,f0f0f0f0
-348e174,f0f0f0f0
-348e178,f0f0f0f0
-348e17c,f0f0f0f0
-348e180,f0f0f0f0
-348e184,f0f0f0f0
-348e188,f0f0f0f0
-348e18c,f0f0f0f0
-348e190,f0f0f0f0
-348e194,f0f0f0ef
-348e198,eff0f0f0
-348e19c,f0f0f0f0
-348e1a0,f0f0f0f0
-348e1a4,f0f0f0ef
-348e1a8,bfbff0f0
-348e1ac,f0f0f0f0
-348e1b0,f0f0f0f0
-348e1b4,f0f0dfdf
-348e1b8,bfbff0f0
-348e1bc,f0f0f0f0
-348e1c0,f0f0f0f0
-348e1c4,f0f0dfbf
-348e1c8,afaff0f0
-348e1cc,f0f0f0f0
-348e1d0,f0f0f0f0
-348e1d4,f0dfdfaf
-348e1d8,afafaff0
-348e1dc,f0f0f0f0
-348e1e0,f0f0f0f0
-348e1e4,f0dfafaf
-348e1e8,afafaff0
-348e1ec,f0f0f0f0
-348e1f0,f0f0f0f0
-348e1f4,dfdfafaf
-348e1f8,afafaff0
-348e1fc,f0f0f0f0
-348e200,f0f0f0f0
-348e204,dfdfafaf
-348e208,afafaf9f
-348e20c,f0f0f0f0
-348e210,f0f0f0f0
-348e214,cfafafaf
-348e218,afaf9f9f
-348e21c,f0f0f0f0
-348e220,f0f0f0cf
-348e224,cfafafaf
-348e228,9f9ff0f0
-348e22c,f0f0f0f0
-348e230,f0f0f0cf
-348e234,afafaf9f
-348e238,f0f0f0f0
-348e23c,f0f0f0f0
-348e240,f0f0f0cf
-348e244,aff0f0f0
-348e248,f0f0f0f0
-348e24c,f0f0f0f0
-348e250,f0f0f0f0
-348e254,f0f0f0f0
-348e258,f0f0f0f0
-348e25c,f0f0f0f0
-348e260,f0f0f0f0
-348e264,f0f0f0f0
-348e268,f0f0f0f0
-348e26c,f0f0f0f0
-348e270,f0f0f0f0
-348e274,f0f0f0f0
-348e278,f0f0f0f0
-348e27c,f0f0f0f0
-348e280,f0f0f0f0
-348e284,f0f0f0f0
-348e288,f0f0f0f0
-348e28c,f0f0f0f0
-348e290,f0f0f0f0
-348e294,f0f0f0ff
-348e298,ff9ff0f0
-348e29c,f0f0f0f0
-348e2a0,f0f0f0f0
-348e2a4,f0f0ffff
-348e2a8,ff9ff0f0
-348e2ac,f0f0f0f0
-348e2b0,f0f0f0f0
-348e2b4,f0f0ffff
-348e2b8,9f9ff0f0
-348e2bc,f0f0f0f0
-348e2c0,f0f0f0f0
-348e2c4,f0f0ffff
-348e2c8,9f9ff0f0
-348e2cc,f0f0f0f0
-348e2d0,f0f0f0f0
-348e2d4,f0efef9f
-348e2d8,9f9f9ff0
-348e2dc,f0f0f0f0
-348e2e0,f0f0f0f0
-348e2e4,f0efef9f
-348e2e8,9f9f8ff0
-348e2ec,f0f0f0f0
-348e2f0,f0f0f0f0
-348e2f4,f0efef9f
-348e2f8,9f8f8ff0
-348e2fc,f0f0f0f0
-348e300,f0f0f0f0
-348e304,efef9f9f
-348e308,8f8f8ff0
-348e30c,f0f0f0f0
-348e310,f0f0f0f0
-348e314,efef9f8f
-348e318,8f8f8ff0
-348e31c,f0f0f0f0
-348e320,f0f0f0ef
-348e324,efef8f8f
-348e328,8f8ff0f0
+348992c,100000df
+3489930,ac40b5bc
+3489934,3c038041
+3489938,8c62b5bc
+348993c,24420001
+3489940,ac62b5bc
+3489944,3c028011
+3489948,3442a5d0
+348994c,8c4808c4
+3489950,19000011
+3489954,1001025
+3489958,e05025
+348995c,3c056666
+3489960,24a56667
+3489964,254a0001
+3489968,401825
+348996c,450018
+3489970,2010
+3489974,42083
+3489978,217c3
+348997c,2863000a
+3489980,1060fff8
+3489984,821023
+3489988,15400005
+348998c,3c028041
+3489990,10000002
+3489994,240a0001
+3489998,240a0001
+348999c,3c028041
+34899a0,9445b552
+34899a4,18a00010
+34899a8,a01025
+34899ac,3c066666
+34899b0,24c66667
+34899b4,24e70001
+34899b8,401825
+34899bc,460018
+34899c0,2010
+34899c4,42083
+34899c8,217c3
+34899cc,2863000a
+34899d0,1060fff8
+34899d4,821023
+34899d8,54e00005
+34899dc,1473821
+34899e0,10000002
+34899e4,24070001
+34899e8,24070001
+34899ec,1473821
+34899f0,24f40001
+34899f4,3c028041
+34899f8,2442a438
+34899fc,94430004
+3489a00,740018
+3489a04,2012
+3489a08,3c038041
+3489a0c,2463a418
+3489a10,94660004
+3489a14,862021
+3489a18,497c2
+3489a1c,2449021
+3489a20,129043
+3489a24,129023
+3489a28,265200a0
+3489a2c,94420006
+3489a30,44820000
+3489a38,46800021
+3489a3c,3c028041
+3489a40,d446a250
+3489a44,46260002
+3489a48,3c028041
+3489a4c,d442a258
+3489a50,46201001
+3489a54,3c028041
+3489a58,d444a260
+3489a5c,46240000
+3489a60,4620000d
+3489a64,44060000
+3489a68,94620006
+3489a6c,44820000
+3489a74,46800021
+3489a78,46260002
+3489a7c,46201081
+3489a80,3c028041
+3489a84,d440a268
+3489a88,46201080
+3489a8c,46241080
+3489a90,4620100d
+3489a94,44110000
+3489a98,24e20009
+3489a9c,210c2
+3489aa0,210c0
+3489aa4,3a2e823
+3489aa8,27a40020
+3489aac,941021
+3489ab0,19400015
+3489ab4,a0400000
+3489ab8,2549ffff
+3489abc,894821
+3489ac0,806025
+3489ac4,3c0b6666
+3489ac8,256b6667
+3489acc,10b0018
+3489ad0,1810
+3489ad4,31883
+3489ad8,817c3
+3489adc,621823
+3489ae0,31080
+3489ae4,431021
+3489ae8,21040
+3489aec,1021023
+3489af0,24420030
+3489af4,a1220000
+3489af8,604025
+3489afc,1201025
+3489b00,144cfff2
+3489b04,2529ffff
+3489b08,8a1021
+3489b0c,2403002f
+3489b10,a0430000
+3489b14,147102a
+3489b18,10400012
+3489b1c,873821
+3489b20,8a5021
+3489b24,3c086666
+3489b28,25086667
+3489b2c,a80018
+3489b30,1810
+3489b34,31883
+3489b38,517c3
+3489b3c,621823
+3489b40,31080
+3489b44,431021
+3489b48,21040
+3489b4c,a21023
+3489b50,24420030
+3489b54,a0e20000
+3489b58,24e7ffff
+3489b5c,14eafff3
+3489b60,602825
+3489b64,8e020008
+3489b68,24430008
+3489b6c,ae030008
+3489b70,3c03de00
+3489b74,ac430000
+3489b78,3c038041
+3489b7c,2463a488
+3489b80,ac430004
+3489b84,8e020008
+3489b88,24430008
+3489b8c,ae030008
+3489b90,3c03e700
+3489b94,ac430000
+3489b98,ac400004
+3489b9c,8e020008
+3489ba0,24430008
+3489ba4,ae030008
+3489ba8,3c03fc11
+3489bac,34639623
+3489bb0,ac430000
+3489bb4,3c03ff2f
+3489bb8,3463ffff
+3489bbc,ac430004
+3489bc0,8e030008
+3489bc4,24620008
+3489bc8,ae020008
+3489bcc,3c16fa00
+3489bd0,ac760000
+3489bd4,3c02dad3
+3489bd8,24420b00
+3489bdc,2621025
+3489be0,ac620004
+3489be4,c102561
+3489be8,2402825
+3489bec,3c028041
+3489bf0,9442a43c
+3489bf4,540018
+3489bf8,a012
+3489bfc,292a021
+3489c00,8e020008
+3489c04,24430008
+3489c08,ae030008
+3489c0c,ac560000
+3489c10,3c03f4ec
+3489c14,24633000
+3489c18,2639825
+3489c1c,ac530004
+3489c20,3c028041
+3489c24,8c46b5bc
+3489c28,63042
+3489c2c,24070001
+3489c30,30c6000f
+3489c34,3c128041
+3489c38,2645a418
+3489c3c,c101bdf
+3489c40,2002025
+3489c44,2645a418
+3489c48,94a20006
+3489c4c,afa20018
+3489c50,94a20004
+3489c54,afa20014
+3489c58,afb10010
+3489c5c,2803825
+3489c60,3025
+3489c64,c101c47
+3489c68,2002025
+3489c6c,c10258b
+3489c70,2002025
+3489c74,8e020008
+3489c78,24430008
+3489c7c,ae030008
+3489c80,3c03e900
+3489c84,ac430000
+3489c88,ac400004
+3489c8c,8e020008
+3489c90,24430008
+3489c94,ae030008
+3489c98,3c03df00
+3489c9c,ac430000
+3489ca0,ac400004
+3489ca4,10000002
+3489ca8,2a0e825
+3489cac,2a0e825
+3489cb0,3c0e825
+3489cb4,8fbf0044
+3489cb8,8fbe0040
+3489cbc,8fb6003c
+3489cc0,8fb50038
+3489cc4,8fb40034
+3489cc8,8fb30030
+3489ccc,8fb2002c
+3489cd0,8fb10028
+3489cd4,8fb00024
+3489cd8,3e00008
+3489cdc,27bd0048
+3489ce0,3c028040
+3489ce4,a040306c
+3489ce8,3c028040
+3489cec,3e00008
+3489cf0,ac403070
+3489cf4,3c038041
+3489cf8,3c028050
+3489cfc,24420000
+3489d00,3e00008
+3489d04,ac62b5c0
+3489d08,3082000f
+3489d0c,10400009
+3489d10,3c038041
+3489d14,417c3
+3489d18,21702
+3489d1c,821821
+3489d20,3063000f
+3489d24,431023
+3489d28,24420010
+3489d2c,822021
+3489d30,3c038041
+3489d34,8c62b5c0
+3489d38,442021
+3489d3c,3e00008
+3489d40,ac64b5c0
+3489d44,27bdffe8
+3489d48,afbf0014
+3489d4c,afb00010
+3489d50,808025
+3489d54,c102742
+3489d58,8c840008
+3489d5c,402025
+3489d60,ae020000
+3489d64,8e060008
+3489d68,3c028000
+3489d6c,24420df0
+3489d70,40f809
+3489d74,8e050004
+3489d78,8fbf0014
+3489d7c,8fb00010
+3489d80,3e00008
+3489d84,27bd0018
+3489d88,3c02800f
+3489d8c,a0401640
+3489d90,3c028041
+3489d94,a040b5c4
+3489d98,3c028011
+3489d9c,3442a5d0
+3489da0,8c420004
+3489da4,14400086
+3489da8,3c028011
+3489dac,3442a5d0
+3489db0,8c421360
+3489db4,2c420004
+3489db8,10400081
+3489dbc,3c028011
+3489dc0,3442a5d0
+3489dc4,8c420000
+3489dc8,240301fd
+3489dcc,14430005
+3489dd0,3c038011
+3489dd4,3c02800f
+3489dd8,24030001
+3489ddc,3e00008
+3489de0,a0431640
+3489de4,3463a5d0
+3489de8,94630ed6
+3489dec,30630100
+3489df0,1460000a
+3489df4,3c038011
+3489df8,24030157
+3489dfc,10430003
+3489e00,240301f9
+3489e04,14430005
+3489e08,3c038011
+3489e0c,3c02800f
+3489e10,24030002
+3489e14,3e00008
+3489e18,a0431640
+3489e1c,3463a5d0
+3489e20,94630edc
+3489e24,30640400
+3489e28,54800016
+3489e2c,3c028011
+3489e30,240404da
+3489e34,10440005
+3489e38,2404ffbf
+3489e3c,441024
+3489e40,2404019d
+3489e44,14440005
+3489e48,3c02801c
+3489e4c,3c02800f
+3489e50,24030003
+3489e54,3e00008
+3489e58,a0431640
+3489e5c,344284a0
+3489e60,944200a4
+3489e64,2442ffa8
+3489e68,2c420002
+3489e6c,10400005
+3489e70,3c028011
+3489e74,3c02800f
+3489e78,24030003
+3489e7c,3e00008
+3489e80,a0431640
+3489e84,3442a5d0
+3489e88,8c4200a4
+3489e8c,30420007
+3489e90,24040007
+3489e94,5444001f
+3489e98,30630200
+3489e9c,3c028011
+3489ea0,3442a5d0
+3489ea4,8c42037c
+3489ea8,30420002
+3489eac,54400019
+3489eb0,30630200
+3489eb4,3c02801c
+3489eb8,344284a0
+3489ebc,944200a4
+3489ec0,2442ffae
+3489ec4,2c420002
+3489ec8,50400012
+3489ecc,30630200
+3489ed0,3c028041
+3489ed4,24040002
+3489ed8,a044b5c4
+3489edc,3c028011
+3489ee0,3442a5d0
+3489ee4,8c420000
+3489ee8,24040191
+3489eec,10440008
+3489ef0,24040205
+3489ef4,10440006
+3489ef8,240400db
+3489efc,10440004
+3489f00,3c02800f
+3489f04,24030005
+3489f08,3e00008
+3489f0c,a0431640
+3489f10,30630200
+3489f14,1460002a
+3489f18,3c02801c
+3489f1c,344284a0
+3489f20,3c030001
+3489f24,431021
+3489f28,84431e1a
+3489f2c,240204d6
+3489f30,14620005
+3489f34,3c02801c
+3489f38,3c02800f
+3489f3c,24030002
+3489f40,3e00008
+3489f44,a0431640
+3489f48,344284a0
+3489f4c,944200a4
+3489f50,2c430054
+3489f54,50600006
+3489f58,2442ffa0
+3489f5c,2c420052
+3489f60,14400017
+3489f64,3c028041
+3489f68,10000006
+3489f6c,9042b5c4
+3489f70,3042ffff
+3489f74,2c420002
+3489f78,10400011
+3489f7c,3c028041
+3489f80,9042b5c4
+3489f84,14400005
+3489f88,3c028011
+3489f8c,3c028041
+3489f90,24030001
+3489f94,a043b5c4
+3489f98,3c028011
+3489f9c,3442a5d0
+3489fa0,8c420000
+3489fa4,240300db
+3489fa8,10430005
+3489fac,24030195
+3489fb0,10430003
+3489fb4,3c02800f
+3489fb8,24030002
+3489fbc,a0431640
+3489fc0,3e00008
+3489fc8,33c2
+3489fcc,664399c4
+3489fd0,cc45ffc6
+3489fd4,ff47ffc8
+3489fd8,ff49e0ca
+3489fdc,c24ba3cc
+3489fe0,854d660d
+3489fe4,440f2200
+3489fe8,85d1a352
+3489fec,c2d3e045
+3489ff0,1010101
+3489ff4,1010101
+3489ff8,1010101
+3489ffc,1010101
+348a000,1010101
+348a01c,1010000
+348a024,1010101
+348a028,1000101
+348a02c,10101
+348a030,10000
+348a034,2b242525
+348a038,26262626
+348a03c,27272727
+348a040,27272727
+348a044,500080d
+348a048,1051508
+348a04c,d01052a
+348a050,80d0127
+348a054,f080b01
+348a058,4d510b02
+348a060,97ff6350
+348a064,45ff5028
+348a068,57456397
+348a06c,ff5e45ff
+348a070,9f006545
+348a074,ff63ff6c
+348a078,45fff063
+348a07c,7345ffff
+348a080,ff503aff
+348a084,ffff573a
+348a088,ffffff5e
+348a08c,3affffff
+348a090,653affff
+348a094,ff6c3aff
+348a098,ffff733a
+348a09c,5a0c00
+348a0a0,720c0096
+348a0a4,c009618
+348a0a8,1652a00
+348a0ac,4e2a005a
+348a0b0,2a000000
+348a0b4,c004e00
+348a0b8,c015a00
+348a0bc,c026600
+348a0c0,c037200
+348a0c4,c047e00
+348a0c8,c058a00
+348a0cc,c064e0c
+348a0d0,75a0c
+348a0d4,c09660c
+348a0d8,a720c
+348a0dc,c0c7e0c
+348a0e0,c0d8a0c
+348a0e4,c0e4e18
+348a0e8,c0f5a18
+348a0ec,c106618
+348a0f0,c117218
+348a0f4,c127e18
+348a0f8,c138a18
+348a0fc,ffff
+348a100,ffff
+348a104,ffff
+348a108,ffff
+348a10c,ffff
+348a110,ffff
+348a114,ffff
+348a118,ffff
+348a11c,ffff
+348a120,ffff
+348a124,ffff
+348a128,ffff
+348a12c,ffff
+348a130,ffff
+348a134,c3b7e2a
+348a138,c3c8a2a
+348a13c,c3d962a
+348a140,ffff
+348a144,c3e7e36
+348a148,b3f8b37
+348a14c,b409737
+348a150,ffff
+348a154,c417e42
+348a158,c428a42
+348a15c,c439642
+348a160,ffff
+348a164,c447e4f
+348a168,c458a4f
+348a16c,c46964f
+348a170,ffff
+348a174,c149600
+348a178,ffff
+348a17c,2c061b31
+348a180,2c072931
+348a184,2c083731
+348a188,2a096f51
+348a18c,2c0a722a
+348a190,ffff
+348a194,2c00370a
+348a198,2c01371a
+348a19c,2c022922
+348a1a0,2c031b1a
+348a1a4,2c041b0a
+348a1a8,2c052902
+348a1ac,ffff
+348a1b0,ffff
+348a1b4,8040a458
+348a1b8,8040a448
+348a1bc,8040a3d8
+348a1c0,c8ff6482
+348a1c4,82ffff64
+348a1c8,64ff5aff
+348a1cc,bd1400
+348a1d0,aa0200
+348a1d4,bd1300
+348a1d8,15c6300
+348a1dc,de2f00
+348a1e0,e01010e0
+348a1e4,e01010e0
+348a1e8,1010e0e0
+348a1ec,1010e0e0
+348a1f0,10e0e010
+348a1f4,10000000
+348a1f8,4d510000
+348a1fc,4e6f726d
+348a200,616c0000
+348a204,bdcccccd
+348a208,3dcccccd
+348a20c,43510000
+348a210,41100000
+348a214,4f000000
+348a218,42080000
+348a21c,c20c0000
+348a220,420c0000
+348a224,3f800000
+348a228,3f000000
+348a22c,41c80000
+348a230,3fa00000
+348a234,40000000
+348a238,40200000
+348a23c,3f800000
+348a240,4f000000
+348a248,41f00000
+348a250,3ff80000
+348a258,406e0000
+348a260,3ff00000
+348a268,40080000
+348a270,80409fc8
+348a274,10203
+348a278,4050607
+348a27c,ffffffff
+348a280,ffff0000
+348a284,ff00ff
+348a288,3c000064
+348a28c,ffff8200
+348a290,c832ffc8
+348a294,c8000000
+348a298,104465
+348a29c,6b750000
+348a2a4,110446f
+348a2a8,646f6e67
+348a2ac,6f000000
+348a2b0,2104a61
+348a2b4,62750000
+348a2bc,3d0466f
+348a2c0,72657374
+348a2c8,4d04669
+348a2cc,72650000
+348a2d4,5d05761
+348a2d8,74657200
+348a2e0,7d05368
+348a2e4,61646f77
+348a2ec,6d05370
+348a2f0,69726974
+348a2f8,890426f
+348a2fc,74570000
+348a304,9104963
+348a308,65000000
+348a310,ca04869
+348a314,64656f75
+348a318,74000000
+348a31c,b804754
+348a320,47000000
+348a328,dc04761
+348a32c,6e6f6e00
+348a334,2
+348a33c,3f800000
+348a348,1
+348a34c,30006
+348a350,70009
+348a354,b000e
+348a358,f0010
+348a35c,110019
+348a360,1a002b
+348a364,2c002e
+348a368,300032
+348a36c,35003c
+348a370,400041
+348a374,460051
+348a378,540109
+348a37c,10b010c
+348a380,10e010f
+348a384,1100113
+348a38c,1
+348a390,1
+348a394,2
+348a398,1
+348a39c,2
+348a3a0,2
+348a3a4,3
+348a3a8,1
+348a3ac,2
+348a3b0,2
+348a3b4,3
+348a3b8,2
+348a3bc,3
+348a3c0,3
+348a3c4,4
+348a3cc,100010
+348a3d0,a0301
+348a3d4,1000000
+348a3dc,100010
+348a3e0,20002
+348a3e4,2000000
+348a3ec,80008
+348a3f0,a0301
+348a3f4,1000000
+348a3fc,100010
+348a400,30301
+348a404,1000000
+348a40c,100018
+348a410,10301
+348a414,1000000
+348a41c,100010
+348a420,100301
+348a424,1000000
+348a42c,200020
+348a430,10302
+348a434,2000000
+348a43c,8000e
+348a440,5f0301
+348a444,1000000
+348a44c,180018
+348a450,140003
+348a454,4000000
+348a45c,200020
+348a460,5a0003
+348a464,4000000
+348a46c,100010
+348a470,60301
+348a474,1000000
+348a47c,100010
+348a480,30003
+348a484,4000000
+348a488,e7000000
+348a490,d9000000
+348a498,ed000000
+348a49c,5003c0
+348a4a0,ef002cf0
+348a4a4,504244
+348a4a8,df000000
+348a4c4,4d8e0032
+348a4c8,ce2001
+348a4cc,80407e00
+348a4d0,80407890
+348a4d4,ffffffff
+348a4d8,4d8c0034
+348a4dc,bb1201
+348a4e0,80407c38
+348a4e4,80407890
+348a4e8,ffffffff
+348a4ec,4d090033
+348a4f0,d92801
+348a4f4,80407c38
+348a4f8,80407890
+348a4fc,ffffffff
+348a500,53030031
+348a504,e93500
+348a508,80407c38
+348a50c,80407890
+348a510,ffffffff
+348a514,53060030
+348a518,e73300
+348a51c,80407c38
+348a520,80407890
+348a524,ffffffff
+348a528,530e0035
+348a52c,e83400
+348a530,80407c38
+348a534,80407890
+348a538,ffffffff
+348a53c,4d000037
+348a540,c71b01
+348a544,80407c38
+348a548,80407890
+348a54c,ffffffff
+348a550,530a0036
+348a554,dd2d00
+348a558,80407c38
+348a55c,80407890
+348a560,ffffffff
+348a564,530b004f
+348a568,dd2e00
+348a56c,80407c38
+348a570,80407890
+348a574,ffffffff
+348a578,530f0039
+348a57c,ea3600
+348a580,80407c38
+348a584,80407890
+348a588,ffffffff
+348a58c,53230069
+348a590,ef3b00
+348a594,80407c38
+348a598,80407af4
+348a59c,ffffffff
+348a5a0,5308003a
+348a5a4,de2f00
+348a5a8,80407c38
+348a5ac,80407890
+348a5b0,ffffffff
+348a5b4,53110038
+348a5b8,f64100
+348a5bc,80407c38
+348a5c0,80407890
+348a5c4,ffffffff
+348a5c8,532f0002
+348a5cc,1095e00
+348a5d0,80407c38
+348a5d4,80407890
+348a5d8,ffffffff
+348a5dc,53140042
+348a5e0,c60100
+348a5e4,80407c38
+348a5e8,80407890
+348a5ec,ffffffff
+348a5f0,53150043
+348a5f4,eb3800
+348a5f8,80407c38
+348a5fc,80407890
+348a600,ffffffff
+348a604,53160044
+348a608,eb3700
+348a60c,80407c38
+348a610,80407890
+348a614,ffffffff
+348a618,53170045
+348a61c,eb3900
+348a620,80407c38
+348a624,80407890
+348a628,ffffffff
+348a62c,53180046
+348a630,c60100
+348a634,80407c38
+348a638,80407890
+348a63c,ffffffff
+348a640,531a0098
+348a644,df3000
+348a648,80407c38
+348a64c,80407890
+348a650,ffffffff
+348a654,531b0099
+348a658,10b4500
+348a65c,80407e40
+348a660,80407890
+348a664,ffffffff
+348a668,53100048
+348a66c,f33e01
+348a670,80407c38
+348a674,80407890
+348a678,ffffffff
+348a67c,53250010
+348a680,1364f00
+348a684,80407c38
+348a688,80407890
+348a68c,ffffffff
+348a690,53260011
+348a694,1353200
+348a698,80407c38
+348a69c,80407890
+348a6a0,ffffffff
+348a6a4,5322000b
+348a6a8,1094400
+348a6ac,80407c38
+348a6b0,80407890
+348a6b4,ffffffff
+348a6b8,53240012
+348a6bc,1343100
+348a6c0,80407c38
+348a6c4,80407890
+348a6c8,ffffffff
+348a6cc,53270013
+348a6d0,1375000
+348a6d4,80407c38
+348a6d8,80407890
+348a6dc,ffffffff
+348a6e0,532b0017
+348a6e4,1385100
+348a6e8,80407c38
+348a6ec,80407890
+348a6f0,ffffffff
+348a6f4,532d9001
+348a6f8,da2900
+348a6fc,80407c38
+348a700,80407890
+348a704,ffffffff
+348a708,532e000b
+348a70c,1094400
+348a710,80407c38
+348a714,80407890
+348a718,ffffffff
+348a71c,53300003
+348a720,1415400
+348a724,80407c38
+348a728,80407890
+348a72c,ffffffff
+348a730,53310004
+348a734,1405300
+348a738,80407c38
+348a73c,80407890
+348a740,ffffffff
+348a744,53320005
+348a748,f54000
+348a74c,80407c38
+348a750,80407890
+348a754,ffffffff
+348a758,53330008
+348a75c,1435600
+348a760,80407c38
+348a764,80407890
+348a768,ffffffff
+348a76c,53340009
+348a770,1465700
+348a774,80407c38
+348a778,80407890
+348a77c,ffffffff
+348a780,5335000d
+348a784,1495a00
+348a788,80407c38
+348a78c,80407890
+348a790,ffffffff
+348a794,5336000e
+348a798,13f5200
+348a79c,80407c38
+348a7a0,80407890
+348a7a4,ffffffff
+348a7a8,5337000a
+348a7ac,1425500
+348a7b0,80407c38
+348a7b4,80407890
+348a7b8,ffffffff
+348a7bc,533b00a4
+348a7c0,18d7400
+348a7c4,80407c38
+348a7c8,80407890
+348a7cc,ffffffff
+348a7d0,533d004b
+348a7d4,f84300
+348a7d8,80407c38
+348a7dc,80407890
+348a7e0,ffffffff
+348a7e4,533e004c
+348a7e8,cb1d01
+348a7ec,80407c38
+348a7f0,80407890
+348a7f4,ffffffff
+348a7f8,533f004d
+348a7fc,dc2c01
+348a800,80407c38
+348a804,80407890
+348a808,ffffffff
+348a80c,5340004e
+348a810,ee3a00
+348a814,80407c38
+348a818,80407890
+348a81c,ffffffff
+348a820,53420050
+348a824,f23c00
+348a828,80407c38
+348a82c,80407890
+348a830,ffffffff
+348a834,53430051
+348a838,f23d00
+348a83c,80407c38
+348a840,80407890
+348a844,ffffffff
+348a848,53450053
+348a84c,1184700
+348a850,80407c38
+348a854,80407890
+348a858,ffffffff
+348a85c,53460054
+348a860,1575f00
+348a864,80407c38
+348a868,80407890
+348a86c,ffffffff
+348a870,534b0056
+348a874,be1600
+348a878,80407c38
+348a87c,80407890
+348a880,ffffffff
+348a884,534c0057
+348a888,be1700
+348a88c,80407c38
+348a890,80407890
+348a894,ffffffff
+348a898,534d0058
+348a89c,bf1800
+348a8a0,80407c38
+348a8a4,80407890
+348a8a8,ffffffff
+348a8ac,534e0059
+348a8b0,bf1900
+348a8b4,80407c38
+348a8b8,80407890
+348a8bc,ffffffff
+348a8c0,534f005a
+348a8c4,bf1a00
+348a8c8,80407c38
+348a8cc,80407890
+348a8d0,ffffffff
+348a8d4,5351005b
+348a8d8,12d4900
+348a8dc,80407c38
+348a8e0,80407890
+348a8e4,ffffffff
+348a8e8,5352005c
+348a8ec,12d4a00
+348a8f0,80407c38
+348a8f4,80407890
+348a8f8,ffffffff
+348a8fc,535300cd
+348a900,db2a00
+348a904,80407c38
+348a908,80407890
+348a90c,ffffffff
+348a910,535400ce
+348a914,db2b00
+348a918,80407c38
+348a91c,80407890
+348a920,ffffffff
+348a924,536f0068
+348a928,c82100
+348a92c,80407c38
+348a930,80407890
+348a934,ffffffff
+348a938,5370007b
+348a93c,d72400
+348a940,80407c38
+348a944,80407890
+348a948,ffffffff
+348a94c,5341004a
+348a950,10e4600
+348a954,80407c38
+348a958,80407a70
+348a95c,ffffffff
+348a960,4d5800dc
+348a964,1194801
+348a968,80407e1c
+348a96c,80407890
+348a970,ffffffff
+348a974,3d7200c6
+348a978,bd1301
+348a97c,80407c38
+348a980,80407898
+348a984,ffffffff
+348a988,3e7a00c2
+348a98c,bd1401
+348a990,80407c38
+348a994,80407898
+348a998,ffffffff
+348a99c,537400c7
+348a9a0,b90a02
+348a9a4,80407c38
+348a9a8,80407890
+348a9ac,ffffffff
+348a9b0,53750067
+348a9b4,b80b01
+348a9b8,80407c38
+348a9bc,80407890
+348a9c0,ffffffff
+348a9c4,53760066
+348a9c8,c81c01
+348a9cc,80407c38
+348a9d0,80407890
+348a9d4,ffffffff
+348a9d8,53770060
+348a9dc,aa0203
+348a9e0,80407c38
+348a9e4,80407890
+348a9e8,ffffffff
+348a9ec,53780052
+348a9f0,cd1e01
+348a9f4,80407c38
+348a9f8,80407890
+348a9fc,ffffffff
+348aa00,53790052
+348aa04,cd1f01
+348aa08,80407c38
+348aa0c,80407890
+348aa10,ffffffff
+348aa14,5356005e
+348aa18,d12200
+348aa1c,80407c38
+348aa20,80407ac8
+348aa24,1ffff
+348aa28,5357005f
+348aa2c,d12300
+348aa30,80407c38
+348aa34,80407ac8
+348aa38,2ffff
+348aa3c,5321009a
+348aa40,da2900
+348aa44,80407c38
+348aa48,80407890
+348aa4c,ffffffff
+348aa50,4d830055
+348aa54,b70901
+348aa58,80407c38
+348aa5c,80407890
+348aa60,ffffffff
+348aa64,4d9200e6
+348aa68,d82501
+348aa6c,80407de4
+348aa70,80407890
+348aa74,ffffffff
+348aa78,4d9300e6
+348aa7c,d82601
+348aa80,80407de4
+348aa84,80407890
+348aa88,ffffffff
+348aa8c,4d9400e6
+348aa90,d82701
+348aa94,80407de4
+348aa98,80407890
+348aa9c,ffffffff
+348aaa0,4d84006f
+348aaa4,17f6d01
+348aaa8,80407c38
+348aaac,80407890
+348aab0,ffffffff
+348aab4,4d8500cc
+348aab8,17f6e01
+348aabc,80407c38
+348aac0,80407890
+348aac4,ffffffff
+348aac8,4d8600f0
+348aacc,17f6f01
+348aad0,80407c38
+348aad4,80407890
+348aad8,ffffffff
+348aadc,3d7200c6
+348aae0,bd1301
+348aae4,80407c38
+348aae8,80407898
+348aaec,ffffffff
+348aaf0,53820098
+348aaf4,df3000
+348aaf8,80407c38
+348aafc,80407890
+348ab00,ffffffff
+348ab04,53280014
+348ab08,1505b00
+348ab0c,80407c38
+348ab10,80407890
+348ab14,ffffffff
+348ab18,53290015
+348ab1c,1515c00
+348ab20,80407c38
+348ab24,80407890
+348ab28,ffffffff
+348ab2c,532a0016
+348ab30,1525d00
+348ab34,80407c38
+348ab38,80407890
+348ab3c,ffffffff
+348ab40,53500079
+348ab44,1475800
+348ab48,80407c38
+348ab4c,80407890
+348ab50,ffffffff
+348ab54,4d8700f1
+348ab58,17f7101
+348ab5c,80407c38
+348ab60,80407890
+348ab64,ffffffff
+348ab68,4d8800f2
+348ab6c,17f7201
+348ab70,80407c38
+348ab74,80407890
+348ab78,ffffffff
+348ab7c,533d000c
+348ab80,f84300
+348ab84,80407c38
+348ab88,80407998
+348ab8c,ffffffff
+348ab90,53040070
+348ab94,1586000
+348ab98,80407c38
+348ab9c,80407890
+348aba0,ffffffff
+348aba4,530c0071
+348aba8,1586100
+348abac,80407c38
+348abb0,80407890
+348abb4,ffffffff
+348abb8,53120072
+348abbc,1586200
+348abc0,80407c38
+348abc4,80407890
+348abc8,ffffffff
+348abcc,5b7100b4
+348abd0,15c6301
+348abd4,80407c38
+348abd8,80407890
+348abdc,ffffffff
+348abe0,530500ad
+348abe4,15d6400
+348abe8,80407c38
+348abec,80407890
+348abf0,ffffffff
+348abf4,530d00ae
+348abf8,15d6500
+348abfc,80407c38
+348ac00,80407890
+348ac04,ffffffff
+348ac08,531300af
+348ac0c,15d6600
+348ac10,80407c38
+348ac14,80407890
+348ac18,ffffffff
+348ac1c,53470007
+348ac20,17b6c00
+348ac24,80407c38
+348ac28,80407890
+348ac2c,ffffffff
+348ac30,53480007
+348ac34,17b6c00
+348ac38,80407c38
+348ac3c,80407890
+348ac40,ffffffff
+348ac44,4d8a0037
+348ac48,c71b01
+348ac4c,80407c38
+348ac50,80407890
+348ac54,ffffffff
+348ac58,4d8b0037
+348ac5c,c71b01
+348ac60,80407c38
+348ac64,80407890
+348ac68,ffffffff
+348ac6c,4d8c0034
+348ac70,bb1201
+348ac74,80407c38
+348ac78,80407890
+348ac7c,ffffffff
+348ac80,4d8d0034
+348ac84,bb1201
+348ac88,80407c38
+348ac8c,80407890
+348ac90,ffffffff
+348ac94,4d020032
+348ac98,ce2001
+348ac9c,80407e00
+348aca0,80407890
+348aca4,ffffffff
+348aca8,4d8f0032
+348acac,ce2001
+348acb0,80407e00
+348acb4,80407890
+348acb8,ffffffff
+348acbc,4d900032
+348acc0,ce2001
+348acc4,80407e00
+348acc8,80407890
+348accc,ffffffff
+348acd0,4d910032
+348acd4,ce2001
+348acd8,80407e00
+348acdc,80407890
+348ace0,ffffffff
+348ace4,4d9500dc
+348ace8,1194801
+348acec,80407e1c
+348acf0,80407890
+348acf4,ffffffff
+348acf8,4d960033
+348acfc,d92801
+348ad00,80407c38
+348ad04,80407890
+348ad08,ffffffff
+348ad0c,4d970033
+348ad10,d92801
+348ad14,80407c38
+348ad18,80407890
+348ad1c,ffffffff
+348ad20,53190047
+348ad24,f43f00
+348ad28,80407c38
+348ad2c,80407890
+348ad30,ffffffff
+348ad34,531d007a
+348ad38,1746800
+348ad3c,80407c38
+348ad40,80407890
+348ad44,ffffffff
+348ad48,531c005d
+348ad4c,1736700
+348ad50,80407c38
+348ad54,80407890
+348ad58,ffffffff
+348ad5c,53200097
+348ad60,1766a00
+348ad64,80407c38
+348ad68,80407890
+348ad6c,ffffffff
+348ad70,531e00f9
+348ad74,1767000
+348ad78,80407c38
+348ad7c,80407890
+348ad80,ffffffff
+348ad84,537700f3
+348ad88,aa0201
+348ad8c,80407c38
+348ad90,80407890
+348ad94,ffffffff
+348ad98,4d8400f4
+348ad9c,17f6d01
+348ada0,80407c38
+348ada4,80407890
+348ada8,ffffffff
+348adac,4d8500f5
+348adb0,17f6e01
+348adb4,80407c38
+348adb8,80407890
+348adbc,ffffffff
+348adc0,4d8600f6
+348adc4,17f6f01
+348adc8,80407c38
+348adcc,80407890
+348add0,ffffffff
+348add4,4d8700f7
+348add8,17f7101
+348addc,80407c38
+348ade0,80407890
+348ade4,ffffffff
+348ade8,537a00fa
+348adec,bd1401
+348adf0,80407c38
+348adf4,80407898
+348adf8,ffffffff
+348adfc,53980090
+348ae00,c71b01
+348ae04,80407c38
+348ae08,80407890
+348ae0c,ffffffff
+348ae10,53990091
+348ae14,c71b01
+348ae18,80407c38
+348ae1c,80407890
+348ae20,ffffffff
+348ae24,539a00a7
+348ae28,bb1201
+348ae2c,80407c38
+348ae30,80407890
+348ae34,ffffffff
+348ae38,539b00a8
+348ae3c,bb1201
+348ae40,80407c38
+348ae44,80407890
+348ae48,ffffffff
+348ae4c,5349006c
+348ae50,17b7300
+348ae54,80407c38
+348ae58,80407890
+348ae5c,ffffffff
+348ae60,53419002
+348ae68,80407c38
+348ae6c,80407a94
+348ae70,ffffffff
+348aeb0,ffffffff
+348aeb4,dd2d00
+348aeb8,80407c40
+348aebc,80407890
+348aec0,ffffffff
+348aec4,ffffffff
+348aec8,1475800
+348aecc,80407c54
+348aed0,80407890
+348aed4,ffffffff
+348aed8,ffffffff
+348aedc,bf1800
+348aee0,80407c80
+348aee4,80407890
+348aee8,ffffffff
+348aeec,ffffffff
+348aef0,e93500
+348aef4,80407cac
+348aef8,80407890
+348aefc,ffffffff
+348af00,ffffffff
+348af04,e73300
+348af08,80407cd4
+348af0c,80407890
+348af10,ffffffff
+348af14,ffffffff
+348af18,d12200
+348af1c,80407d04
+348af20,80407890
+348af24,ffffffff
+348af28,ffffffff
+348af2c,db2a00
+348af30,80407d34
+348af34,80407890
+348af38,ffffffff
+348af3c,ffffffff
+348af40,bb1201
+348af44,80407d4c
+348af48,80407890
+348af4c,ffffffff
+348af50,ffffffff
+348af54,c71b01
+348af58,80407d68
+348af5c,80407890
+348af60,ffffffff
+348af64,ffffffff
+348af68,d92800
+348af6c,80407d94
+348af70,80407890
+348af74,ffffffff
+348af78,ffffffff
+348af7c,cd1e00
+348af80,80407d84
+348af84,80407890
+348af88,ffffffff
+348af8c,ffffffff
+348af90,10e4600
+348af94,80407dc4
+348af98,80407890
+348af9c,ffffffff
+348afa0,53410043
+348afa4,c60100
+348afa8,80407c38
+348afac,804079a4
+348afb0,15ffff
+348afb4,53410044
+348afb8,c60100
+348afbc,80407c38
+348afc0,804079a4
+348afc4,16ffff
+348afc8,53410045
+348afcc,c60100
+348afd0,80407c38
+348afd4,804079a4
+348afd8,17ffff
+348afdc,53410046
+348afe0,1776b00
+348afe4,80407c38
+348afe8,804079a4
+348afec,18ffff
+348aff0,53410047
+348aff4,f43f00
+348aff8,80407c38
+348affc,804079a4
+348b000,19ffff
+348b004,5341005d
+348b008,1736700
+348b00c,80407c38
+348b010,804079a4
+348b014,1cffff
+348b018,5341007a
+348b01c,1746800
+348b020,80407c38
+348b024,804079a4
+348b028,1dffff
+348b02c,534100f9
+348b030,1767000
+348b034,80407c38
+348b038,804079a4
+348b03c,1effff
+348b040,53410097
+348b044,1766a00
+348b048,80407c38
+348b04c,804079a4
+348b050,20ffff
+348b054,53410006
+348b058,b90a02
+348b05c,80407c38
+348b060,804079dc
+348b064,10003
+348b068,5341001c
+348b06c,b90a02
+348b070,80407c38
+348b074,804079dc
+348b078,10004
+348b07c,5341001d
+348b080,b90a02
+348b084,80407c38
+348b088,804079dc
+348b08c,10005
+348b090,5341001e
+348b094,b90a02
+348b098,80407c38
+348b09c,804079dc
+348b0a0,10006
+348b0a4,5341002a
+348b0a8,b90a02
+348b0ac,80407c38
+348b0b0,804079dc
+348b0b4,10007
+348b0b8,53410061
+348b0bc,b90a02
+348b0c0,80407c38
+348b0c4,804079dc
+348b0c8,1000a
+348b0cc,53410062
+348b0d0,b80b01
+348b0d4,80407c38
+348b0d8,804079dc
+348b0dc,20000
+348b0e0,53410063
+348b0e4,b80b01
+348b0e8,80407c38
+348b0ec,804079dc
+348b0f0,20001
+348b0f4,53410064
+348b0f8,b80b01
+348b0fc,80407c38
+348b100,804079dc
+348b104,20002
+348b108,53410065
+348b10c,b80b01
+348b110,80407c38
+348b114,804079dc
+348b118,20003
+348b11c,5341007c
+348b120,b80b01
+348b124,80407c38
+348b128,804079dc
+348b12c,20004
+348b130,5341007d
+348b134,b80b01
+348b138,80407c38
+348b13c,804079dc
+348b140,20005
+348b144,5341007e
+348b148,b80b01
+348b14c,80407c38
+348b150,804079dc
+348b154,20006
+348b158,5341007f
+348b15c,b80b01
+348b160,80407c38
+348b164,804079dc
+348b168,20007
+348b16c,534100a2
+348b170,b80b01
+348b174,80407c38
+348b178,804079dc
+348b17c,20008
+348b180,53410087
+348b184,b80b01
+348b188,80407c38
+348b18c,804079dc
+348b190,20009
+348b194,53410088
+348b198,c81c01
+348b19c,80407c38
+348b1a0,804079dc
+348b1a4,40000
+348b1a8,53410089
+348b1ac,c81c01
+348b1b0,80407c38
+348b1b4,804079dc
+348b1b8,40001
+348b1bc,5341008a
+348b1c0,c81c01
+348b1c4,80407c38
+348b1c8,804079dc
+348b1cc,40002
+348b1d0,5341008b
+348b1d4,c81c01
+348b1d8,80407c38
+348b1dc,804079dc
+348b1e0,40003
+348b1e4,5341008c
+348b1e8,c81c01
+348b1ec,80407c38
+348b1f0,804079dc
+348b1f4,40004
+348b1f8,5341008e
+348b1fc,c81c01
+348b200,80407c38
+348b204,804079dc
+348b208,40005
+348b20c,5341008f
+348b210,c81c01
+348b214,80407c38
+348b218,804079dc
+348b21c,40006
+348b220,534100a3
+348b224,c81c01
+348b228,80407c38
+348b22c,804079dc
+348b230,40007
+348b234,534100a5
+348b238,c81c01
+348b23c,80407c38
+348b240,804079dc
+348b244,40008
+348b248,53410092
+348b24c,c81c01
+348b250,80407c38
+348b254,804079dc
+348b258,40009
+348b25c,53410093
+348b260,aa0203
+348b264,80407c38
+348b268,804079f0
+348b26c,3ffff
+348b270,53410094
+348b274,aa0203
+348b278,80407c38
+348b27c,804079f0
+348b280,4ffff
+348b284,53410095
+348b288,aa0203
+348b28c,80407c38
+348b290,804079f0
+348b294,5ffff
+348b298,534100a6
+348b29c,aa0203
+348b2a0,80407c38
+348b2a4,804079f0
+348b2a8,6ffff
+348b2ac,534100a9
+348b2b0,aa0203
+348b2b4,80407c38
+348b2b8,804079f0
+348b2bc,7ffff
+348b2c0,5341009b
+348b2c4,aa0203
+348b2c8,80407c38
+348b2cc,804079f0
+348b2d0,8ffff
+348b2d4,5341009f
+348b2d8,aa0203
+348b2dc,80407c38
+348b2e0,804079f0
+348b2e4,bffff
+348b2e8,534100a0
+348b2ec,aa0203
+348b2f0,80407c38
+348b2f4,804079f0
+348b2f8,cffff
+348b2fc,534100a1
+348b300,aa0203
+348b304,80407c38
+348b308,804079f0
+348b30c,dffff
+348b310,534100e9
+348b314,1941300
+348b318,80407c38
+348b31c,80407a14
+348b320,ffffffff
+348b324,534100e4
+348b328,cd1e00
+348b32c,80407c38
+348b330,80407a30
+348b334,ffffffff
+348b338,534100e8
+348b33c,cd1f00
+348b340,80407c38
+348b344,80407a4c
+348b348,ffffffff
+348b34c,53410073
+348b350,b60300
+348b354,80407c38
+348b358,80407a7c
+348b35c,6ffff
+348b360,53410074
+348b364,b60400
+348b368,80407c38
+348b36c,80407a7c
+348b370,7ffff
+348b374,53410075
+348b378,b60500
+348b37c,80407c38
+348b380,80407a7c
+348b384,8ffff
+348b388,53410076
+348b38c,b60600
+348b390,80407c38
+348b394,80407a7c
+348b398,9ffff
+348b39c,53410077
+348b3a0,b60700
+348b3a4,80407c38
+348b3a8,80407a7c
+348b3ac,affff
+348b3b0,53410078
+348b3b4,b60800
+348b3b8,80407c38
+348b3bc,80407a7c
+348b3c0,bffff
+348b3c4,534100d4
+348b3c8,b60400
+348b3cc,80407c38
+348b3d0,80407a7c
+348b3d4,cffff
+348b3d8,534100d2
+348b3dc,b60600
+348b3e0,80407c38
+348b3e4,80407a7c
+348b3e8,dffff
+348b3ec,534100d1
+348b3f0,b60300
+348b3f4,80407c38
+348b3f8,80407a7c
+348b3fc,effff
+348b400,534100d3
+348b404,b60800
+348b408,80407c38
+348b40c,80407a7c
+348b410,fffff
+348b414,534100d5
+348b418,b60500
+348b41c,80407c38
+348b420,80407a7c
+348b424,10ffff
+348b428,534100d6
+348b42c,b60700
+348b430,80407c38
+348b434,80407a7c
+348b438,11ffff
+348b43c,534100f8
+348b440,d12300
+348b444,80407c38
+348b448,80407960
+348b44c,3ffff
+348b450,53149099
+348b454,10b4500
+348b458,80407c38
+348b45c,80407890
+348b460,ffffffff
+348b464,53419048
+348b468,f33e00
+348b46c,80407c38
+348b470,80407ab0
+348b474,ffffffff
+348b478,53419003
+348b47c,1933500
+348b480,80407c38
+348b484,804078a4
+348b488,ffffffff
+348b48c,53419097
+348b490,ef3b00
+348b494,80407c38
+348b498,80407890
+348b49c,ffffffff
+348b4a0,4d419098
+348b4a4,ef3b01
+348b4a8,80407c38
+348b4ac,80407890
+348b4b0,ffffffff
+348b4b8,1
+348b4bc,1
+348b4c0,d
+348b4c4,41200000
+348b4c8,41200000
+348b4cc,8040a458
+348b4d0,8040a448
+348b4d8,df000000
+348b4e0,80112f1a
+348b4e4,80112f14
+348b4e8,80112f0e
+348b4ec,80112f08
+348b4f0,8011320a
+348b4f4,80113204
+348b4f8,801131fe
+348b4fc,801131f8
+348b500,801131f2
+348b504,801131ec
+348b508,801131e6
+348b50c,801131e0
+348b510,8012be1e
+348b514,8012be20
+348b518,8012be1c
+348b51c,8012be12
+348b520,8012be14
+348b524,8012be10
+348b528,801c7672
+348b52c,801c767a
+348b530,801c7950
+348b534,8011bd50
+348b538,8011bd38
+348b53c,801d8b9e
+348b540,801d8b92
+348b544,c80000
+348b54c,ff0046
+348b550,32ffff
+348c6a0,db000
+348c6a4,db000
+348c6a8,db000
+348c6ac,cb000
+348c6b0,cb000
+348c6b4,ca000
+348c6bc,db000
+348c6c0,db000
+348c6d8,e8ac00
+348c6dc,e8ac00
+348c6e0,e8ac00
+348c6e4,e8ac00
+348c70c,d77d0
+348c710,2e3ab0
+348c714,7d0c90
+348c718,8ffffffd
+348c71c,c96e00
+348c720,2e4ac00
+348c724,effffff4
+348c728,ab0e500
+348c72c,c95e000
+348c730,e59c000
+348c748,79000
+348c74c,5ceeb40
+348c750,cc8a990
+348c754,da79000
+348c758,8ecb400
+348c75c,4adda0
+348c760,797e2
+348c764,c88aae0
+348c768,6ceed70
+348c76c,79000
+348c770,79000
+348c780,6dea0000
+348c784,c94d6000
+348c788,c94d6033
+348c78c,6deb6bc6
+348c790,8cb600
+348c794,7ca4cec4
+348c798,3109c3bb
+348c79c,9c3bb
+348c7a0,2ced4
+348c7b8,4cefb00
+348c7bc,ad50000
+348c7c0,8e30000
+348c7c4,9ec0000
+348c7c8,7e4db0ab
+348c7cc,bb05e8aa
+348c7d0,bc008ed6
+348c7d4,7e936ed0
+348c7d8,8ded9ea
+348c7f0,ca000
+348c7f4,ca000
+348c7f8,ca000
+348c7fc,ca000
+348c820,c900
+348c824,7e200
+348c828,cb000
+348c82c,e8000
+348c830,6f3000
+348c834,8e0000
+348c838,8e0000
+348c83c,6f4000
+348c840,e8000
+348c844,cb000
+348c848,7e200
+348c84c,c900
+348c858,bb0000
+348c85c,5e4000
+348c860,ca000
+348c864,ad000
+348c868,7e100
+348c86c,6f400
+348c870,6f400
+348c874,7e100
+348c878,ad000
+348c87c,ca000
+348c880,5e4000
+348c884,bb0000
+348c898,a8000
+348c89c,c8a8ab0
+348c8a0,3beda10
+348c8a4,3beda10
+348c8a8,c8a8ab0
+348c8ac,a8000
+348c8d4,ca000
+348c8d8,ca000
+348c8dc,ca000
+348c8e0,affffff8
+348c8e4,ca000
+348c8e8,ca000
+348c8ec,ca000
+348c924,dd000
+348c928,ec000
+348c92c,4f8000
+348c930,9d0000
+348c954,dffb00
+348c994,ec000
+348c998,ec000
+348c9b0,bc0
+348c9b4,4e60
+348c9b8,bc00
+348c9bc,3e800
+348c9c0,ad000
+348c9c4,1e9000
+348c9c8,9e2000
+348c9cc,da0000
+348c9d0,7e30000
+348c9d4,cb00000
+348c9d8,6e500000
+348c9e8,3ceeb00
+348c9ec,bd57e90
+348c9f0,e900bd0
+348c9f4,5f7009e0
+348c9f8,6f6cb9e0
+348c9fc,5f7009e0
+348ca00,e900bd0
+348ca04,bd57e90
+348ca08,3ceeb00
+348ca20,affe000
+348ca24,8e000
+348ca28,8e000
+348ca2c,8e000
+348ca30,8e000
+348ca34,8e000
+348ca38,8e000
+348ca3c,8e000
+348ca40,8ffffe0
+348ca58,8deea00
+348ca5c,c837e90
+348ca60,cc0
+348ca64,2ea0
+348ca68,bd20
+348ca6c,bd400
+348ca70,bd4000
+348ca74,bd40000
+348ca78,2fffffd0
+348ca90,7ceea00
+348ca94,c837e90
+348ca98,cb0
+348ca9c,27e90
+348caa0,bffb00
+348caa4,27da0
+348caa8,ad0
+348caac,5c627db0
+348cab0,9deeb30
+348cac8,2de00
+348cacc,bde00
+348cad0,7d9e00
+348cad4,2d79e00
+348cad8,bb09e00
+348cadc,6e409e00
+348cae0,9ffffff7
+348cae4,9e00
+348cae8,9e00
+348cb00,cffff50
+348cb04,ca00000
+348cb08,ca00000
+348cb0c,ceeea00
+348cb10,38e90
+348cb14,bc0
+348cb18,bc0
+348cb1c,5c638e90
+348cb20,9deda00
+348cb38,aeec30
+348cb3c,ae83980
+348cb40,e900000
+348cb44,4faeec40
+348cb48,6fd55dc0
+348cb4c,5f9009e0
+348cb50,e9009e0
+348cb54,cd55dc0
+348cb58,3ceec40
+348cb70,5fffffd0
+348cb74,da0
+348cb78,7e40
+348cb7c,cc00
+348cb80,4e800
+348cb84,ad000
+348cb88,da000
+348cb8c,8e4000
+348cb90,cc0000
+348cba8,5ceec30
+348cbac,dc45db0
+348cbb0,e900bd0
+348cbb4,bc45d90
+348cbb8,4dffc20
+348cbbc,1db45cc0
+348cbc0,5f6009e0
+348cbc4,2eb35cd0
+348cbc8,7deec50
+348cbe0,6deeb00
+348cbe4,db37e90
+348cbe8,5f500bd0
+348cbec,5f500be0
+348cbf0,db37ee0
+348cbf4,6dedbe0
+348cbf8,bc0
+348cbfc,9749e70
+348cc00,5ded800
+348cc20,ec000
+348cc24,ec000
+348cc34,ec000
+348cc38,ec000
+348cc58,ec000
+348cc5c,ec000
+348cc6c,dd000
+348cc70,ec000
+348cc74,4f8000
+348cc78,9d0000
+348cc90,29c8
+348cc94,7bed93
+348cc98,8dda4000
+348cc9c,8dda4000
+348cca0,7bec93
+348cca4,29c8
+348cccc,affffff8
+348ccd8,affffff8
+348cd00,ac810000
+348cd04,4adeb600
+348cd08,6add6
+348cd0c,6add6
+348cd10,4adeb600
+348cd14,ac810000
+348cd30,4beec30
+348cd34,9a46ea0
+348cd38,1da0
+348cd3c,2cd30
+348cd40,cc100
+348cd44,e9000
+348cd4c,e9000
+348cd50,e9000
+348cd68,1aeed70
+348cd6c,cd739e4
+348cd70,7e2000c9
+348cd74,ba0aeeca
+348cd78,d76e64da
+348cd7c,d69c00aa
+348cd80,d76e64da
+348cd84,ba0aeeca
+348cd88,6e400000
+348cd8c,ad83000
+348cd90,8dee90
+348cda0,3ed000
+348cda4,9de600
+348cda8,cbcb00
+348cdac,3e8ad00
+348cdb0,8e26f60
+348cdb4,cc00ea0
+348cdb8,2effffd0
+348cdbc,8e5008f5
+348cdc0,cd0001ea
+348cdd8,effec40
+348cddc,e905dc0
+348cde0,e900ae0
+348cde4,e905dc0
+348cde8,efffd50
+348cdec,e904bd2
+348cdf0,e9005f6
+348cdf4,e904be3
+348cdf8,effed80
+348ce10,9ded80
+348ce14,8e936b0
+348ce18,db00000
+348ce1c,3f900000
+348ce20,5f700000
+348ce24,1e900000
+348ce28,db00000
+348ce2c,8e947b0
+348ce30,9ded80
+348ce48,5ffed800
+348ce4c,5f65ae80
+348ce50,5f600cd0
+348ce54,5f6009e0
+348ce58,5f6009f0
+348ce5c,5f6009e0
+348ce60,5f600cd0
+348ce64,5f65ae80
+348ce68,5ffed800
+348ce80,dffffe0
+348ce84,db00000
+348ce88,db00000
+348ce8c,db00000
+348ce90,dffffc0
+348ce94,db00000
+348ce98,db00000
+348ce9c,db00000
+348cea0,dfffff0
+348ceb8,bfffff4
+348cebc,bd00000
+348cec0,bd00000
+348cec4,bd00000
+348cec8,bffffc0
+348cecc,bd00000
+348ced0,bd00000
+348ced4,bd00000
+348ced8,bd00000
+348cef0,1aeed60
+348cef4,be738a0
+348cef8,4e900000
+348cefc,8f400000
+348cf00,9f10bff2
+348cf04,7f4007f2
+348cf08,4e9007f2
+348cf0c,be739f2
+348cf10,1beed90
+348cf28,5f6009e0
+348cf2c,5f6009e0
+348cf30,5f6009e0
+348cf34,5f6009e0
+348cf38,5fffffe0
+348cf3c,5f6009e0
+348cf40,5f6009e0
+348cf44,5f6009e0
+348cf48,5f6009e0
+348cf60,dffffb0
+348cf64,db000
+348cf68,db000
+348cf6c,db000
+348cf70,db000
+348cf74,db000
+348cf78,db000
+348cf7c,db000
+348cf80,dffffb0
+348cf98,cfff40
+348cf9c,7f40
+348cfa0,7f40
+348cfa4,7f40
+348cfa8,7f40
+348cfac,7f30
+348cfb0,75009e00
+348cfb4,8d64dc00
+348cfb8,2beec500
+348cfd0,5f6009e7
+348cfd4,5f609e70
+348cfd8,5f69e700
+348cfdc,5fbe8000
+348cfe0,5fedb000
+348cfe4,5f87e800
+348cfe8,5f60ae40
+348cfec,5f601dc0
+348cff0,5f6006ea
+348d008,cc00000
+348d00c,cc00000
+348d010,cc00000
+348d014,cc00000
+348d018,cc00000
+348d01c,cc00000
+348d020,cc00000
+348d024,cc00000
+348d028,cfffff7
+348d040,afa00cf8
+348d044,aed02ee8
+348d048,add59be8
+348d04c,adaac8e8
+348d050,ad5de1e8
+348d054,ad0db0e8
+348d058,ad0000e8
+348d05c,ad0000e8
+348d060,ad0000e8
+348d078,5fc008e0
+348d07c,5fe608e0
+348d080,5fcb08e0
+348d084,5f7e48e0
+348d088,5f5ca8e0
+348d08c,5f57e8e0
+348d090,5f50dce0
+348d094,5f509ee0
+348d098,5f502ee0
+348d0b0,4ceeb20
+348d0b4,cd56ea0
+348d0b8,3e800ae0
+348d0bc,7f5008f2
+348d0c0,7f4008f4
+348d0c4,7f5008f2
+348d0c8,3e800ae0
+348d0cc,cd56eb0
+348d0d0,4ceeb20
+348d0e8,dffed60
+348d0ec,db05ce2
+348d0f0,db006f6
+348d0f4,db006f6
+348d0f8,db05ce2
+348d0fc,dffed60
+348d100,db00000
+348d104,db00000
+348d108,db00000
+348d120,4ceeb20
+348d124,cd56ea0
+348d128,3e800ae0
+348d12c,7f5008f2
+348d130,7f4008f4
+348d134,7f5008f1
+348d138,3e800ad0
+348d13c,cd56ea0
+348d140,4cefc20
+348d144,ae50
+348d148,c80
+348d158,5ffeeb20
+348d15c,5f717eb0
+348d160,5f700cd0
+348d164,5f716ea0
+348d168,5fffea00
+348d16c,5f72ae40
+348d170,5f700db0
+348d174,5f7008e5
+348d178,5f7000db
+348d190,6ceeb30
+348d194,dc45a90
+348d198,4f600000
+348d19c,ec60000
+348d1a0,5ceeb40
+348d1a4,6cc0
+348d1a8,8e0
+348d1ac,c735cd0
+348d1b0,8deec50
+348d1c8,cffffffb
+348d1cc,db000
+348d1d0,db000
+348d1d4,db000
+348d1d8,db000
+348d1dc,db000
+348d1e0,db000
+348d1e4,db000
+348d1e8,db000
+348d200,4f7009e0
+348d204,4f7009e0
+348d208,4f7009e0
+348d20c,4f7009e0
+348d210,4f7009e0
+348d214,3f7009e0
+348d218,2e700ad0
+348d21c,dc45dc0
+348d220,5ceec40
+348d238,ad0003e8
+348d23c,6f5008e3
+348d240,e900bc0
+348d244,bc00d90
+348d248,8e15e40
+348d24c,2e7ad00
+348d250,cbca00
+348d254,9de600
+348d258,3ed000
+348d270,e80000ad
+348d274,da0000cb
+348d278,cb0000da
+348d27c,ac0ec0e8
+348d280,8d6de1e5
+348d284,6e9bd8e0
+348d288,1ec8acd0
+348d28c,de37ec0
+348d290,cd00ea0
+348d2a8,6e7007e7
+348d2ac,ad21db0
+348d2b0,2daad20
+348d2b4,7ee700
+348d2b8,3ee200
+348d2bc,bdda00
+348d2c0,7e67e60
+348d2c4,3ea00bd0
+348d2c8,bd2004e9
+348d2e0,ae2005e8
+348d2e4,2da00cc0
+348d2e8,7e57e50
+348d2ec,ccda00
+348d2f0,4ed200
+348d2f4,db000
+348d2f8,db000
+348d2fc,db000
+348d300,db000
+348d318,efffff8
+348d31c,bd3
+348d320,7e70
+348d324,3ea00
+348d328,bd100
+348d32c,8e5000
+348d330,4e90000
+348d334,cc00000
+348d338,1ffffffa
+348d348,4ffc00
+348d34c,4f5000
+348d350,4f5000
+348d354,4f5000
+348d358,4f5000
+348d35c,4f5000
+348d360,4f5000
+348d364,4f5000
+348d368,4f5000
+348d36c,4f5000
+348d370,4f5000
+348d374,4ffc00
+348d388,6e500000
+348d38c,cb00000
+348d390,7e30000
+348d394,da0000
+348d398,9e2000
+348d39c,1e9000
+348d3a0,ad000
+348d3a4,3e800
+348d3a8,bc00
+348d3ac,4e60
+348d3b0,bc0
+348d3b8,dfe000
+348d3bc,8e000
+348d3c0,8e000
+348d3c4,8e000
+348d3c8,8e000
+348d3cc,8e000
+348d3d0,8e000
+348d3d4,8e000
+348d3d8,8e000
+348d3dc,8e000
+348d3e0,8e000
+348d3e4,dfe000
+348d3f8,5ed200
+348d3fc,dcdb00
+348d400,ad25e80
+348d404,7e5007e5
+348d45c,fffffffd
+348d464,2ca0000
+348d468,2c9000
+348d4a8,5ceeb10
+348d4ac,b936da0
+348d4b0,bc0
+348d4b4,8deffc0
+348d4b8,3e930bd0
+348d4bc,4f827ed0
+348d4c0,aeedbd0
+348d4d0,d900000
+348d4d4,d900000
+348d4d8,d900000
+348d4dc,d900000
+348d4e0,dbdec40
+348d4e4,de65dc0
+348d4e8,db008e0
+348d4ec,da007f2
+348d4f0,db008e0
+348d4f4,de64db0
+348d4f8,dbdec40
+348d518,8ded70
+348d51c,7e936a0
+348d520,cc00000
+348d524,db00000
+348d528,cc00000
+348d52c,7e936a0
+348d530,8ded70
+348d540,bc0
+348d544,bc0
+348d548,bc0
+348d54c,bc0
+348d550,5dedcc0
+348d554,dc48ec0
+348d558,5f600cc0
+348d55c,7f300bc0
+348d560,5f600cc0
+348d564,dc48ec0
+348d568,5dedcc0
+348d588,3beec30
+348d58c,cd54cc0
+348d590,4f6007e0
+348d594,6ffffff3
+348d598,4f500000
+348d59c,cc538c0
+348d5a0,3beec60
+348d5b0,5ded0
+348d5b4,cb200
+348d5b8,d9000
+348d5bc,e8000
+348d5c0,dffffd0
+348d5c4,e8000
+348d5c8,e8000
+348d5cc,e8000
+348d5d0,e8000
+348d5d4,e8000
+348d5d8,e8000
+348d5f8,5dedcc0
+348d5fc,dc48ec0
+348d600,5f600cc0
+348d604,7f300bc0
+348d608,5f600cc0
+348d60c,dc48ec0
+348d610,5dedcb0
+348d614,ca0
+348d618,9947e60
+348d61c,4cee900
+348d620,da00000
+348d624,da00000
+348d628,da00000
+348d62c,da00000
+348d630,dbded40
+348d634,de65da0
+348d638,db00bc0
+348d63c,da00bc0
+348d640,da00bc0
+348d644,da00bc0
+348d648,da00bc0
+348d658,bc000
+348d668,9ffc000
+348d66c,bc000
+348d670,bc000
+348d674,bc000
+348d678,bc000
+348d67c,bc000
+348d680,effffe0
+348d690,7e000
+348d6a0,7ffe000
+348d6a4,7e000
+348d6a8,7e000
+348d6ac,7e000
+348d6b0,7e000
+348d6b4,7e000
+348d6b8,7e000
+348d6bc,7e000
+348d6c0,1bd000
+348d6c4,dfe7000
+348d6c8,bc00000
+348d6cc,bc00000
+348d6d0,bc00000
+348d6d4,bc00000
+348d6d8,bc03dc2
+348d6dc,bc3db00
+348d6e0,bddc000
+348d6e4,bfce500
+348d6e8,bd0cd10
+348d6ec,bc03db0
+348d6f0,bc007e8
+348d700,eff4000
+348d704,5f4000
+348d708,5f4000
+348d70c,5f4000
+348d710,5f4000
+348d714,5f4000
+348d718,5f4000
+348d71c,5f4000
+348d720,4f5000
+348d724,ea000
+348d728,8efb0
+348d748,8dddaec0
+348d74c,8e4dc5e4
+348d750,8d0cb0e6
+348d754,8d0ba0e7
+348d758,8d0ba0e7
+348d75c,8d0ba0e7
+348d760,8d0ba0e7
+348d780,dbded40
+348d784,de65da0
+348d788,db00bc0
+348d78c,da00bc0
+348d790,da00bc0
+348d794,da00bc0
+348d798,da00bc0
+348d7b8,4ceeb20
+348d7bc,cd56da0
+348d7c0,1e700ad0
+348d7c4,5f6008e0
+348d7c8,1e700ad0
+348d7cc,cd46db0
+348d7d0,4ceeb20
+348d7f0,dbdec30
+348d7f4,de65db0
+348d7f8,db009e0
+348d7fc,da007e0
+348d800,db008e0
+348d804,de65db0
+348d808,dbeec40
+348d80c,d900000
+348d810,d900000
+348d814,d900000
+348d828,4cedcc0
+348d82c,cc47ec0
+348d830,1e700cc0
+348d834,5f600bc0
+348d838,2e700cc0
+348d83c,cc47ec0
+348d840,5cedbc0
+348d844,ac0
+348d848,ac0
+348d84c,ac0
+348d860,ccdef9
+348d864,ce8300
+348d868,cb0000
+348d86c,ca0000
+348d870,ca0000
+348d874,ca0000
+348d878,ca0000
+348d898,4ceea10
+348d89c,bd45b60
+348d8a0,bd40000
+348d8a4,3bddb20
+348d8a8,4da0
+348d8ac,b945ea0
+348d8b0,5ceeb20
+348d8c8,8e0000
+348d8cc,8e0000
+348d8d0,6fffffb0
+348d8d4,8e0000
+348d8d8,8e0000
+348d8dc,8e0000
+348d8e0,8e0000
+348d8e4,6e7000
+348d8e8,befb0
+348d908,da00bc0
+348d90c,da00bc0
+348d910,da00bc0
+348d914,da00bc0
+348d918,da00bc0
+348d91c,bd47ec0
+348d920,5dedbc0
+348d940,6e3007e3
+348d944,d900bc0
+348d948,ad01e80
+348d94c,5e48e20
+348d950,dacb00
+348d954,9de700
+348d958,3ee000
+348d978,e80000ac
+348d97c,ca0000ca
+348d980,ac0db0e7
+348d984,6e3dd5e2
+348d988,eabcad0
+348d98c,ce79eb0
+348d990,ae15f80
+348d9b0,3da00bc0
+348d9b4,6e69e40
+348d9b8,9ee700
+348d9bc,2ed000
+348d9c0,ccda00
+348d9c4,9e46e70
+348d9c8,6e7009e4
+348d9e8,6e5005e5
+348d9ec,da00bd0
+348d9f0,9e00e90
+348d9f4,3e78e30
+348d9f8,cccc00
+348d9fc,7ee700
+348da00,de000
+348da04,da000
+348da08,8e5000
+348da0c,dea0000
+348da20,bffffc0
+348da24,5e70
+348da28,3d900
+348da2c,cb000
+348da30,bd2000
+348da34,9e40000
+348da38,dffffc0
+348da48,6dea0
+348da4c,bd300
+348da50,cb000
+348da54,cb000
+348da58,5ea000
+348da5c,bfd2000
+348da60,7e9000
+348da64,db000
+348da68,cb000
+348da6c,cb000
+348da70,bd400
+348da74,5dea0
+348da80,ca000
+348da84,ca000
+348da88,ca000
+348da8c,ca000
+348da90,ca000
+348da94,ca000
+348da98,ca000
+348da9c,ca000
+348daa0,ca000
+348daa4,ca000
+348daa8,ca000
+348daac,ca000
+348dab0,ca000
+348dab8,bed3000
+348dabc,4e9000
+348dac0,da000
+348dac4,ca000
+348dac8,bc400
+348dacc,5efa0
+348dad0,bd500
+348dad4,cb000
+348dad8,da000
+348dadc,da000
+348dae0,5e8000
+348dae4,bec2000
+348db08,5ded83a7
+348db0c,9838dec3
+348db80,7f024429
+348db84,3c334133
+348db88,41334633
+348db8c,44297f02
+348dbbc,5409
+348dbc0,4dc548ff
+348dbc4,41ff43ff
+348dbc8,47ff49ff
+348dbcc,43ff20c5
+348dbd0,c0000
+348dbfc,3f75
+348dc00,49ff33ff
+348dc04,28ff2dff
+348dc08,33ff39ff
+348dc0c,3cff00ff
+348dc10,770000
+348dc3c,329d
+348dc40,37ff1bff
+348dc44,21ff28ff
+348dc48,2fff35ff
+348dc4c,3cff00ff
+348dc50,9d0000
+348dc7c,329e
+348dc80,35ff21ff
+348dc84,28ff06ff
+348dc88,9ff3cff
+348dc8c,42ff00ff
+348dc90,9e0000
+348dcbc,359e
+348dcc0,39ff27ff
+348dcc4,2eff00ff
+348dcc8,2ff42ff
+348dccc,48ff00ff
+348dcd0,9e0000
+348dcfc,3a9e
+348dd00,3eff2eff
+348dd04,35ff00ff
+348dd08,dff48ff
+348dd0c,4dff00ff
+348dd10,9e0000
+348dd3c,3e9e
+348dd40,42ff35ff
+348dd44,3bff1bff
+348dd48,27ff4dff
+348dd4c,53ff00ff
+348dd50,9e0000
+348dd7c,439e
+348dd80,47ff3bff
+348dd84,41ff47ff
+348dd88,4dff52ff
+348dd8c,58ff00ff
+348dd90,9e0000
+348ddbc,4d9e
+348ddc0,4dff41ff
+348ddc4,47ff4dff
+348ddc8,52ff57ff
+348ddcc,5cff00ff
+348ddd0,9e0000
+348ddec,3f04474f
+348ddf0,3e663e66
+348ddf4,43664666
+348ddf8,48664d66
+348ddfc,57665bc5
+348de00,53ff47ff
+348de04,4dff52ff
+348de08,57ff5cff
+348de0c,60ff0eff
+348de10,19c56666
+348de14,66666466
+348de18,61665f66
+348de1c,5c665a66
+348de20,504f3f04
+348de28,6605
+348de2c,4ec34bff
+348de30,41ff41ff
+348de34,45ff48ff
+348de38,4cff4fff
+348de3c,55ff59ff
+348de40,4fff4dff
+348de44,52ff57ff
+348de48,5cff60ff
+348de4c,64ff61ff
+348de50,67ff66ff
+348de54,64ff62ff
+348de58,60ff5dff
+348de5c,5bff57ff
+348de60,49ff0ec3
+348de64,50000
+348de68,3958
+348de6c,44ff31ff
+348de70,20ff25ff
+348de74,2bff31ff
+348de78,38ff3eff
+348de7c,44ff49ff
+348de80,4dff52ff
+348de84,57ff5cff
+348de88,60ff64ff
+348de8c,68ff67ff
+348de90,64ff60ff
+348de94,5cff58ff
+348de98,53ff4eff
+348de9c,48ff43ff
+348dea0,32ff00ff
+348dea4,580000
+348dea8,2f71
+348deac,36ff1dff
+348deb0,1fff26ff
+348deb4,2dff34ff
+348deb8,3aff41ff
+348debc,47ff4cff
+348dec0,52ff57ff
+348dec4,5cff60ff
+348dec8,64ff68ff
+348decc,67ff64ff
+348ded0,60ff5bff
+348ded4,57ff51ff
+348ded8,4cff46ff
+348dedc,40ff3aff
+348dee0,27ff00ff
+348dee4,710000
+348dee8,2f71
+348deec,36ff21ff
+348def0,16ff00ff
+348def4,ff00ff
+348def8,2cff47ff
+348defc,4cff52ff
+348df00,57ff5cff
+348df04,60ff64ff
+348df08,67ff67ff
+348df0c,64ff60ff
+348df10,5bff57ff
+348df14,52ff0dff
+348df18,ff00ff
+348df1c,aff33ff
+348df20,21ff00ff
+348df24,710000
+348df28,3371
+348df2c,3aff28ff
+348df30,22ff0fff
+348df34,13ff19ff
+348df38,39ff4cff
+348df3c,52ff57ff
+348df40,5bff60ff
+348df44,64ff67ff
+348df48,67ff64ff
+348df4c,60ff5cff
+348df50,57ff52ff
+348df54,4cff1dff
+348df58,12ff14ff
+348df5c,19ff2dff
+348df60,1bff00ff
+348df64,710000
+348df68,3871
+348df6c,3dff2fff
+348df70,33ff3aff
+348df74,40ff46ff
+348df78,4cff51ff
+348df7c,57ff5bff
+348df80,60ff64ff
+348df84,67ff68ff
+348df88,64ff60ff
+348df8c,5cff57ff
+348df90,52ff4cff
+348df94,47ff41ff
+348df98,3aff34ff
+348df9c,2dff26ff
+348dfa0,12ff00ff
+348dfa4,710000
+348dfa8,3569
+348dfac,37ff33ff
+348dfb0,3aff40ff
+348dfb4,46ff4cff
+348dfb8,51ff57ff
+348dfbc,5bff60ff
+348dfc0,64ff67ff
+348dfc4,68ff64ff
+348dfc8,60ff5cff
+348dfcc,57ff52ff
+348dfd0,4dff47ff
+348dfd4,41ff3aff
+348dfd8,34ff2dff
+348dfdc,26ff1fff
+348dfe0,6ff00ff
+348dfe4,690000
+348dfe8,1e21
+348dfec,2f600ff
+348dff0,ff00ff
+348dff4,ff00ff
+348dff8,ff00ff
+348dffc,2ff1eff
+348e000,60ff68ff
+348e004,64ff60ff
+348e008,5cff57ff
+348e00c,52ff2cff
+348e010,6ff00ff
+348e014,ff00ff
+348e018,ff00ff
+348e01c,ff00ff
+348e020,ff00f6
+348e024,210000
+348e02c,3b00ae
+348e030,cc00cc
+348e034,cc00cc
+348e038,cc00cc
+348e03c,cc03ec
+348e040,62ff64ff
+348e044,60ff5cff
+348e048,57ff52ff
+348e04c,4dff00ff
+348e050,ec00cc
+348e054,cc00cc
+348e058,cc00cc
+348e05c,cc00cc
+348e060,ae003b
+348e07c,5f9e
+348e080,65ff60ff
+348e084,5cff57ff
+348e088,52ff4dff
+348e08c,47ff00ff
+348e090,9e0000
+348e0bc,659e
+348e0c0,63ff5cff
+348e0c4,57ff52ff
+348e0c8,4dff47ff
+348e0cc,41ff00ff
+348e0d0,9e0000
+348e0fc,649e
+348e100,61ff58ff
+348e104,53ff35ff
+348e108,31ff41ff
+348e10c,3bff00ff
+348e110,9e0000
+348e13c,609e
+348e140,5eff53ff
+348e144,4dff00ff
+348e148,ff3bff
+348e14c,35ff00ff
+348e150,9e0000
+348e17c,5d9e
+348e180,5bff4dff
+348e184,48ff00ff
+348e188,6ff35ff
+348e18c,2eff00ff
+348e190,9e0000
+348e1bc,5a9e
+348e1c0,57ff48ff
+348e1c4,42ff03ff
+348e1c8,cff2eff
+348e1cc,28ff00ff
+348e1d0,9e0000
+348e1fc,559e
+348e200,53ff42ff
+348e204,3cff2dff
+348e208,28ff28ff
+348e20c,1fff00ff
+348e210,9e0000
+348e23c,4b91
+348e240,44ff33ff
+348e244,35ff2fff
+348e248,28ff1fff
+348e24c,7ff00ff
+348e250,900000
+348e27c,1229
+348e280,f700ff
+348e284,ff00ff
+348e288,ff00ff
+348e28c,ff00f8
+348e290,2e0000
+348e2c0,30008c
+348e2c4,990099
+348e2c8,990099
+348e2cc,8c0030
+348e328,f0f0f0f0
348e32c,f0f0f0f0
-348e330,f0f0f0ef
-348e334,ef8f8f8f
+348e330,f0f0f0f0
+348e334,f0f0f0f0
348e338,f0f0f0f0
348e33c,f0f0f0f0
-348e340,f0f0f0ef
-348e344,ef8f8ff0
+348e340,dff0f0f0
+348e344,f0f0f0f0
348e348,f0f0f0f0
-348e34c,f0f0f0f0
-348e350,f0f0f0f0
-348e354,8ff0f0f0
+348e34c,f0f0f0df
+348e350,dff0f0f0
+348e354,f0f0f0f0
348e358,f0f0f0f0
-348e35c,f0f0f0f0
-348e360,f0f0f0f0
+348e35c,f0f0f0df
+348e360,dfcff0f0
348e364,f0f0f0f0
348e368,f0f0f0f0
-348e36c,f0f0f0f0
-348e370,f0f0f0f0
+348e36c,f0f0cfcf
+348e370,cfcff0f0
348e374,f0f0f0f0
348e378,f0f0f0f0
-348e37c,f0f0f0f0
-348e380,f0f0f0f0
+348e37c,f0f0cfcf
+348e380,cfcfcff0
348e384,f0f0f0f0
348e388,f0f0f0f0
-348e38c,f0f0f0f0
-348e390,f0f0f0f0
-348e394,f0f0f0ff
-348e398,ff7ff0f0
-348e39c,f0f0f0f0
-348e3a0,f0f0f0f0
-348e3a4,f0f0ffff
-348e3a8,ff7ff0f0
-348e3ac,f0f0f0f0
-348e3b0,f0f0f0f0
-348e3b4,f0f0ffff
-348e3b8,ff7ff0f0
-348e3bc,f0f0f0f0
-348e3c0,f0f0f0f0
-348e3c4,f0f0ffff
-348e3c8,7f7ff0f0
-348e3cc,f0f0f0f0
-348e3d0,f0f0f0f0
-348e3d4,f0ffffff
-348e3d8,7f7ff0f0
-348e3dc,f0f0f0f0
+348e38c,f0cfcfcf
+348e390,cfcfcff0
+348e394,f0f0f0f0
+348e398,f0f0f0f0
+348e39c,f0cfcfcf
+348e3a0,cfcfcfcf
+348e3a4,f0f0f0f0
+348e3a8,f0f0f0f0
+348e3ac,cfcfcfcf
+348e3b0,cfbfbfbf
+348e3b4,f0f0f0f0
+348e3b8,f0f0f0f0
+348e3bc,bfbfbfbf
+348e3c0,bfbfbfbf
+348e3c4,f0f0f0f0
+348e3c8,f0f0f0bf
+348e3cc,bfbfbfbf
+348e3d0,bfbfbfbf
+348e3d4,bff0f0f0
+348e3d8,f0f0f0bf
+348e3dc,bfbff0f0
348e3e0,f0f0f0f0
-348e3e4,f0ffffff
-348e3e8,7f7ff0f0
+348e3e4,f0f0f0f0
+348e3e8,f0f0f0f0
348e3ec,f0f0f0f0
348e3f0,f0f0f0f0
-348e3f4,f0ffff7f
-348e3f8,7f7f7ff0
+348e3f4,f0f0f0f0
+348e3f8,f0f0f0f0
348e3fc,f0f0f0f0
348e400,f0f0f0f0
-348e404,ffffff7f
-348e408,7f7f6ff0
+348e404,f0f0f0f0
+348e408,f0f0f0f0
348e40c,f0f0f0f0
348e410,f0f0f0f0
-348e414,ffffff7f
-348e418,7f6f6ff0
+348e414,f0f0f0f0
+348e418,f0f0f0f0
348e41c,f0f0f0f0
348e420,f0f0f0f0
-348e424,ffffff7f
-348e428,7f6ff0f0
+348e424,f0f0f0f0
+348e428,f0f0f0f0
348e42c,f0f0f0f0
348e430,f0f0f0f0
-348e434,ffff7f7f
+348e434,f0f0f0f0
348e438,f0f0f0f0
-348e43c,f0f0f0f0
-348e440,f0f0f0ff
-348e444,ffff7ff0
+348e43c,f0f0f0cf
+348e440,cff0f0f0
+348e444,f0f0f0f0
348e448,f0f0f0f0
-348e44c,f0f0f0f0
-348e450,f0f0f0f0
-348e454,fffff0f0
+348e44c,f0f0f0cf
+348e450,cfcff0f0
+348e454,f0f0f0f0
348e458,f0f0f0f0
-348e45c,f0f0f0f0
-348e460,f0f0f0f0
+348e45c,f0f0bfcf
+348e460,cfcff0f0
348e464,f0f0f0f0
348e468,f0f0f0f0
-348e46c,f0f0f0f0
-348e470,f0f0f0f0
+348e46c,f0f0bfcf
+348e470,cfcff0f0
348e474,f0f0f0f0
348e478,f0f0f0f0
-348e47c,f0f0f0f0
-348e480,f0f0f0f0
+348e47c,f0bfcfbf
+348e480,bfbfbff0
348e484,f0f0f0f0
348e488,f0f0f0f0
-348e48c,f0f0f0f0
-348e490,f0f0f0f0
-348e494,f0f0ffff
-348e498,ff5ff0f0
-348e49c,f0f0f0f0
-348e4a0,f0f0f0f0
-348e4a4,f0f0ffff
-348e4a8,ff5ff0f0
-348e4ac,f0f0f0f0
-348e4b0,f0f0f0f0
-348e4b4,f0f0ffff
-348e4b8,ff5ff0f0
-348e4bc,f0f0f0f0
-348e4c0,f0f0f0f0
-348e4c4,f0f0ffff
-348e4c8,ff5ff0f0
-348e4cc,f0f0f0f0
-348e4d0,f0f0f0f0
-348e4d4,f0f0ffff
-348e4d8,ff5ff0f0
-348e4dc,f0f0f0f0
+348e48c,f0bfbfbf
+348e490,bfbfbff0
+348e494,f0f0f0f0
+348e498,f0f0f0f0
+348e49c,bfbfbfbf
+348e4a0,bfbfbfbf
+348e4a4,f0f0f0f0
+348e4a8,f0f0f0f0
+348e4ac,bfbfbfbf
+348e4b0,bfbfbfbf
+348e4b4,f0f0f0f0
+348e4b8,f0f0f0f0
+348e4bc,bfbfbfbf
+348e4c0,bfbfbfaf
+348e4c4,f0f0f0f0
+348e4c8,f0f0f0af
+348e4cc,bfbfbfbf
+348e4d0,afafaff0
+348e4d4,f0f0f0f0
+348e4d8,f0f0f0bf
+348e4dc,bfbfaff0
348e4e0,f0f0f0f0
-348e4e4,f0ffffff
-348e4e8,5f5ff0f0
+348e4e4,f0f0f0f0
+348e4e8,f0f0f0f0
348e4ec,f0f0f0f0
348e4f0,f0f0f0f0
-348e4f4,f0ffffff
-348e4f8,5f5ff0f0
+348e4f4,f0f0f0f0
+348e4f8,f0f0f0f0
348e4fc,f0f0f0f0
348e500,f0f0f0f0
-348e504,f0ffffff
-348e508,5f5ff0f0
+348e504,f0f0f0f0
+348e508,f0f0f0f0
348e50c,f0f0f0f0
348e510,f0f0f0f0
-348e514,f0ffffff
-348e518,5f5ff0f0
+348e514,f0f0f0f0
+348e518,f0f0f0f0
348e51c,f0f0f0f0
348e520,f0f0f0f0
-348e524,ffffffff
-348e528,5ff0f0f0
+348e524,f0f0f0f0
+348e528,f0f0f0f0
348e52c,f0f0f0f0
348e530,f0f0f0f0
-348e534,ffffff5f
-348e538,5ff0f0f0
-348e53c,f0f0f0f0
-348e540,f0f0f0f0
-348e544,ffffff5f
+348e534,f0f0f0f0
+348e538,f0f0f0f0
+348e53c,f0f0f0ef
+348e540,eff0f0f0
+348e544,f0f0f0f0
348e548,f0f0f0f0
-348e54c,f0f0f0f0
-348e550,f0f0f0f0
-348e554,ffffff5f
+348e54c,f0f0f0ef
+348e550,bfbff0f0
+348e554,f0f0f0f0
348e558,f0f0f0f0
-348e55c,f0f0f0f0
-348e560,f0f0f0f0
-348e564,f0f0fff0
+348e55c,f0f0dfdf
+348e560,bfbff0f0
+348e564,f0f0f0f0
348e568,f0f0f0f0
-348e56c,f0f0f0f0
-348e570,f0f0f0f0
+348e56c,f0f0dfbf
+348e570,afaff0f0
348e574,f0f0f0f0
348e578,f0f0f0f0
-348e57c,f0f0f0f0
-348e580,f0f0f0f0
+348e57c,f0dfdfaf
+348e580,afafaff0
348e584,f0f0f0f0
348e588,f0f0f0f0
-348e58c,f0f0f0f0
-348e590,f0f0f0f0
-348e594,f0f0ffff
-348e598,fffff0f0
-348e59c,f0f0f0f0
-348e5a0,f0f0f0f0
-348e5a4,f0f0ffff
-348e5a8,fffff0f0
-348e5ac,f0f0f0f0
-348e5b0,f0f0f0f0
-348e5b4,f0f0ffff
-348e5b8,ff3ff0f0
-348e5bc,f0f0f0f0
-348e5c0,f0f0f0f0
-348e5c4,f0f0ffff
-348e5c8,ff3ff0f0
-348e5cc,f0f0f0f0
-348e5d0,f0f0f0f0
-348e5d4,f0f0ffff
-348e5d8,ff3ff0f0
-348e5dc,f0f0f0f0
+348e58c,f0dfafaf
+348e590,afafaff0
+348e594,f0f0f0f0
+348e598,f0f0f0f0
+348e59c,dfdfafaf
+348e5a0,afafaff0
+348e5a4,f0f0f0f0
+348e5a8,f0f0f0f0
+348e5ac,dfdfafaf
+348e5b0,afafaf9f
+348e5b4,f0f0f0f0
+348e5b8,f0f0f0f0
+348e5bc,cfafafaf
+348e5c0,afaf9f9f
+348e5c4,f0f0f0f0
+348e5c8,f0f0f0cf
+348e5cc,cfafafaf
+348e5d0,9f9ff0f0
+348e5d4,f0f0f0f0
+348e5d8,f0f0f0cf
+348e5dc,afafaf9f
348e5e0,f0f0f0f0
-348e5e4,f0f0ffff
-348e5e8,ff3ff0f0
-348e5ec,f0f0f0f0
+348e5e4,f0f0f0f0
+348e5e8,f0f0f0cf
+348e5ec,aff0f0f0
348e5f0,f0f0f0f0
-348e5f4,f0f0ffff
-348e5f8,ff3ff0f0
+348e5f4,f0f0f0f0
+348e5f8,f0f0f0f0
348e5fc,f0f0f0f0
348e600,f0f0f0f0
-348e604,f0ffffff
-348e608,ff3ff0f0
+348e604,f0f0f0f0
+348e608,f0f0f0f0
348e60c,f0f0f0f0
348e610,f0f0f0f0
-348e614,f0ffffff
-348e618,fff0f0f0
+348e614,f0f0f0f0
+348e618,f0f0f0f0
348e61c,f0f0f0f0
348e620,f0f0f0f0
-348e624,f0ffffff
-348e628,fff0f0f0
+348e624,f0f0f0f0
+348e628,f0f0f0f0
348e62c,f0f0f0f0
348e630,f0f0f0f0
-348e634,f0ffffff
-348e638,fff0f0f0
-348e63c,f0f0f0f0
-348e640,f0f0f0f0
-348e644,f0ffffff
-348e648,fff0f0f0
-348e64c,f0f0f0f0
-348e650,f0f0f0f0
-348e654,f0ffffff
-348e658,fff0f0f0
-348e65c,f0f0f0f0
-348e660,f0f0f0f0
-348e664,f0f0f0ff
+348e634,f0f0f0f0
+348e638,f0f0f0f0
+348e63c,f0f0f0ff
+348e640,ff9ff0f0
+348e644,f0f0f0f0
+348e648,f0f0f0f0
+348e64c,f0f0ffff
+348e650,ff9ff0f0
+348e654,f0f0f0f0
+348e658,f0f0f0f0
+348e65c,f0f0ffff
+348e660,9f9ff0f0
+348e664,f0f0f0f0
348e668,f0f0f0f0
-348e66c,f0f0f0f0
-348e670,f0f0f0f0
+348e66c,f0f0ffff
+348e670,9f9ff0f0
348e674,f0f0f0f0
348e678,f0f0f0f0
-348e67c,f0f0f0f0
-348e680,f0f0f0f0
+348e67c,f0efef9f
+348e680,9f9f9ff0
348e684,f0f0f0f0
348e688,f0f0f0f0
-348e68c,f0f0f0f0
-348e690,f0f0f0f0
-348e694,f0f0ffff
-348e698,fffff0f0
-348e69c,f0f0f0f0
-348e6a0,f0f0f0f0
-348e6a4,f0f0ffff
-348e6a8,fffff0f0
-348e6ac,f0f0f0f0
-348e6b0,f0f0f0f0
-348e6b4,f0f0ffff
-348e6b8,fffff0f0
-348e6bc,f0f0f0f0
-348e6c0,f0f0f0f0
-348e6c4,f0f0ffff
-348e6c8,fffff0f0
-348e6cc,f0f0f0f0
-348e6d0,f0f0f0f0
-348e6d4,f0f0ffff
-348e6d8,fffff0f0
-348e6dc,f0f0f0f0
+348e68c,f0efef9f
+348e690,9f9f8ff0
+348e694,f0f0f0f0
+348e698,f0f0f0f0
+348e69c,f0efef9f
+348e6a0,9f8f8ff0
+348e6a4,f0f0f0f0
+348e6a8,f0f0f0f0
+348e6ac,efef9f9f
+348e6b0,8f8f8ff0
+348e6b4,f0f0f0f0
+348e6b8,f0f0f0f0
+348e6bc,efef9f8f
+348e6c0,8f8f8ff0
+348e6c4,f0f0f0f0
+348e6c8,f0f0f0ef
+348e6cc,efef8f8f
+348e6d0,8f8ff0f0
+348e6d4,f0f0f0f0
+348e6d8,f0f0f0ef
+348e6dc,ef8f8f8f
348e6e0,f0f0f0f0
-348e6e4,f0f0ffff
-348e6e8,fffff0f0
-348e6ec,f0f0f0f0
+348e6e4,f0f0f0f0
+348e6e8,f0f0f0ef
+348e6ec,ef8f8ff0
348e6f0,f0f0f0f0
-348e6f4,f0f0ffff
-348e6f8,fffff0f0
-348e6fc,f0f0f0f0
+348e6f4,f0f0f0f0
+348e6f8,f0f0f0f0
+348e6fc,8ff0f0f0
348e700,f0f0f0f0
-348e704,f0f0ffff
-348e708,fffff0f0
+348e704,f0f0f0f0
+348e708,f0f0f0f0
348e70c,f0f0f0f0
348e710,f0f0f0f0
-348e714,f0f0ffff
-348e718,fffff0f0
+348e714,f0f0f0f0
+348e718,f0f0f0f0
348e71c,f0f0f0f0
348e720,f0f0f0f0
-348e724,f0f0ffff
-348e728,fffff0f0
+348e724,f0f0f0f0
+348e728,f0f0f0f0
348e72c,f0f0f0f0
348e730,f0f0f0f0
-348e734,f0f0ffff
-348e738,fffff0f0
-348e73c,f0f0f0f0
-348e740,f0f0f0f0
-348e744,f0f0ffff
-348e748,fffff0f0
-348e74c,f0f0f0f0
-348e750,f0f0f0f0
-348e754,f0f0ffff
-348e758,fffff0f0
-348e75c,f0f0f0f0
-348e760,f0f0f0f0
-348e764,f0f0ffff
-348e768,fffff0f0
-348e76c,f0f0f0f0
-348e770,f0f0f0f0
+348e734,f0f0f0f0
+348e738,f0f0f0f0
+348e73c,f0f0f0ff
+348e740,ff7ff0f0
+348e744,f0f0f0f0
+348e748,f0f0f0f0
+348e74c,f0f0ffff
+348e750,ff7ff0f0
+348e754,f0f0f0f0
+348e758,f0f0f0f0
+348e75c,f0f0ffff
+348e760,ff7ff0f0
+348e764,f0f0f0f0
+348e768,f0f0f0f0
+348e76c,f0f0ffff
+348e770,7f7ff0f0
348e774,f0f0f0f0
348e778,f0f0f0f0
-348e77c,f0f0f0f0
-348e780,f0f0f0f0
+348e77c,f0ffffff
+348e780,7f7ff0f0
348e784,f0f0f0f0
348e788,f0f0f0f0
-348e78c,f0f0f0f0
-348e790,f0f0f0f0
-348e794,f0f0ffff
-348e798,fffff0f0
-348e79c,f0f0f0f0
-348e7a0,f0f0f0f0
-348e7a4,f0f0ffff
-348e7a8,fffff0f0
-348e7ac,f0f0f0f0
-348e7b0,f0f0f0f0
-348e7b4,f0f03fff
-348e7b8,fffff0f0
-348e7bc,f0f0f0f0
-348e7c0,f0f0f0f0
-348e7c4,f0f03fff
-348e7c8,fffff0f0
-348e7cc,f0f0f0f0
-348e7d0,f0f0f0f0
-348e7d4,f0f03fff
-348e7d8,fffff0f0
-348e7dc,f0f0f0f0
+348e78c,f0ffffff
+348e790,7f7ff0f0
+348e794,f0f0f0f0
+348e798,f0f0f0f0
+348e79c,f0ffff7f
+348e7a0,7f7f7ff0
+348e7a4,f0f0f0f0
+348e7a8,f0f0f0f0
+348e7ac,ffffff7f
+348e7b0,7f7f6ff0
+348e7b4,f0f0f0f0
+348e7b8,f0f0f0f0
+348e7bc,ffffff7f
+348e7c0,7f6f6ff0
+348e7c4,f0f0f0f0
+348e7c8,f0f0f0f0
+348e7cc,ffffff7f
+348e7d0,7f6ff0f0
+348e7d4,f0f0f0f0
+348e7d8,f0f0f0f0
+348e7dc,ffff7f7f
348e7e0,f0f0f0f0
-348e7e4,f0f03fff
-348e7e8,fffff0f0
-348e7ec,f0f0f0f0
+348e7e4,f0f0f0f0
+348e7e8,f0f0f0ff
+348e7ec,ffff7ff0
348e7f0,f0f0f0f0
-348e7f4,f0f03fff
-348e7f8,fffff0f0
-348e7fc,f0f0f0f0
+348e7f4,f0f0f0f0
+348e7f8,f0f0f0f0
+348e7fc,fffff0f0
348e800,f0f0f0f0
-348e804,f0f03fff
-348e808,fffffff0
+348e804,f0f0f0f0
+348e808,f0f0f0f0
348e80c,f0f0f0f0
348e810,f0f0f0f0
-348e814,f0f0f0ff
-348e818,fffffff0
+348e814,f0f0f0f0
+348e818,f0f0f0f0
348e81c,f0f0f0f0
348e820,f0f0f0f0
-348e824,f0f0f0ff
-348e828,fffffff0
+348e824,f0f0f0f0
+348e828,f0f0f0f0
348e82c,f0f0f0f0
348e830,f0f0f0f0
-348e834,f0f0f0ff
-348e838,fffffff0
-348e83c,f0f0f0f0
-348e840,f0f0f0f0
-348e844,f0f0f0ff
-348e848,fffffff0
-348e84c,f0f0f0f0
-348e850,f0f0f0f0
-348e854,f0f0f0ff
-348e858,fffffff0
-348e85c,f0f0f0f0
-348e860,f0f0f0f0
+348e834,f0f0f0f0
+348e838,f0f0f0f0
+348e83c,f0f0ffff
+348e840,ff5ff0f0
+348e844,f0f0f0f0
+348e848,f0f0f0f0
+348e84c,f0f0ffff
+348e850,ff5ff0f0
+348e854,f0f0f0f0
+348e858,f0f0f0f0
+348e85c,f0f0ffff
+348e860,ff5ff0f0
348e864,f0f0f0f0
-348e868,fff0f0f0
-348e86c,f0f0f0f0
-348e870,f0f0f0f0
+348e868,f0f0f0f0
+348e86c,f0f0ffff
+348e870,ff5ff0f0
348e874,f0f0f0f0
348e878,f0f0f0f0
-348e87c,f0f0f0f0
-348e880,f0f0f0f0
+348e87c,f0f0ffff
+348e880,ff5ff0f0
348e884,f0f0f0f0
348e888,f0f0f0f0
-348e88c,f0f0f0f0
-348e890,f0f0f0f0
-348e894,f0f05fff
-348e898,fffff0f0
-348e89c,f0f0f0f0
-348e8a0,f0f0f0f0
-348e8a4,f0f05fff
-348e8a8,fffff0f0
-348e8ac,f0f0f0f0
-348e8b0,f0f0f0f0
-348e8b4,f0f05fff
-348e8b8,fffff0f0
-348e8bc,f0f0f0f0
-348e8c0,f0f0f0f0
-348e8c4,f0f05fff
-348e8c8,fffff0f0
-348e8cc,f0f0f0f0
-348e8d0,f0f0f0f0
-348e8d4,f0f05fff
-348e8d8,fffff0f0
-348e8dc,f0f0f0f0
-348e8e0,f0f0f0f0
-348e8e4,f0f05f5f
-348e8e8,fffffff0
-348e8ec,f0f0f0f0
+348e88c,f0ffffff
+348e890,5f5ff0f0
+348e894,f0f0f0f0
+348e898,f0f0f0f0
+348e89c,f0ffffff
+348e8a0,5f5ff0f0
+348e8a4,f0f0f0f0
+348e8a8,f0f0f0f0
+348e8ac,f0ffffff
+348e8b0,5f5ff0f0
+348e8b4,f0f0f0f0
+348e8b8,f0f0f0f0
+348e8bc,f0ffffff
+348e8c0,5f5ff0f0
+348e8c4,f0f0f0f0
+348e8c8,f0f0f0f0
+348e8cc,ffffffff
+348e8d0,5ff0f0f0
+348e8d4,f0f0f0f0
+348e8d8,f0f0f0f0
+348e8dc,ffffff5f
+348e8e0,5ff0f0f0
+348e8e4,f0f0f0f0
+348e8e8,f0f0f0f0
+348e8ec,ffffff5f
348e8f0,f0f0f0f0
-348e8f4,f0f05f5f
-348e8f8,fffffff0
-348e8fc,f0f0f0f0
+348e8f4,f0f0f0f0
+348e8f8,f0f0f0f0
+348e8fc,ffffff5f
348e900,f0f0f0f0
-348e904,f0f05f5f
-348e908,fffffff0
-348e90c,f0f0f0f0
+348e904,f0f0f0f0
+348e908,f0f0f0f0
+348e90c,f0f0fff0
348e910,f0f0f0f0
-348e914,f0f05f5f
-348e918,fffffff0
+348e914,f0f0f0f0
+348e918,f0f0f0f0
348e91c,f0f0f0f0
348e920,f0f0f0f0
-348e924,f0f0f05f
-348e928,ffffffff
+348e924,f0f0f0f0
+348e928,f0f0f0f0
348e92c,f0f0f0f0
348e930,f0f0f0f0
-348e934,f0f0f05f
-348e938,5fffffff
-348e93c,f0f0f0f0
-348e940,f0f0f0f0
+348e934,f0f0f0f0
+348e938,f0f0f0f0
+348e93c,f0f0ffff
+348e940,fffff0f0
348e944,f0f0f0f0
-348e948,5fffffff
-348e94c,f0f0f0f0
-348e950,f0f0f0f0
+348e948,f0f0f0f0
+348e94c,f0f0ffff
+348e950,fffff0f0
348e954,f0f0f0f0
-348e958,5fffffff
-348e95c,f0f0f0f0
-348e960,f0f0f0f0
+348e958,f0f0f0f0
+348e95c,f0f0ffff
+348e960,ff3ff0f0
348e964,f0f0f0f0
-348e968,f0fff0f0
-348e96c,f0f0f0f0
-348e970,f0f0f0f0
+348e968,f0f0f0f0
+348e96c,f0f0ffff
+348e970,ff3ff0f0
348e974,f0f0f0f0
348e978,f0f0f0f0
-348e97c,f0f0f0f0
-348e980,f0f0f0f0
+348e97c,f0f0ffff
+348e980,ff3ff0f0
348e984,f0f0f0f0
348e988,f0f0f0f0
-348e98c,f0f0f0f0
-348e990,f0f0f0f0
-348e994,f0f07fff
-348e998,fff0f0f0
-348e99c,f0f0f0f0
-348e9a0,f0f0f0f0
-348e9a4,f0f07fff
-348e9a8,fffff0f0
-348e9ac,f0f0f0f0
-348e9b0,f0f0f0f0
-348e9b4,f0f07fff
-348e9b8,fffff0f0
-348e9bc,f0f0f0f0
-348e9c0,f0f0f0f0
-348e9c4,f0f07f7f
-348e9c8,fffff0f0
-348e9cc,f0f0f0f0
-348e9d0,f0f0f0f0
-348e9d4,f0f07f7f
-348e9d8,fffffff0
-348e9dc,f0f0f0f0
-348e9e0,f0f0f0f0
-348e9e4,f0f07f7f
-348e9e8,fffffff0
-348e9ec,f0f0f0f0
-348e9f0,f0f0f0f0
-348e9f4,f07f7f7f
-348e9f8,7ffffff0
-348e9fc,f0f0f0f0
-348ea00,f0f0f0f0
-348ea04,f06f7f7f
-348ea08,7fffffff
-348ea0c,f0f0f0f0
+348e98c,f0f0ffff
+348e990,ff3ff0f0
+348e994,f0f0f0f0
+348e998,f0f0f0f0
+348e99c,f0f0ffff
+348e9a0,ff3ff0f0
+348e9a4,f0f0f0f0
+348e9a8,f0f0f0f0
+348e9ac,f0ffffff
+348e9b0,ff3ff0f0
+348e9b4,f0f0f0f0
+348e9b8,f0f0f0f0
+348e9bc,f0ffffff
+348e9c0,fff0f0f0
+348e9c4,f0f0f0f0
+348e9c8,f0f0f0f0
+348e9cc,f0ffffff
+348e9d0,fff0f0f0
+348e9d4,f0f0f0f0
+348e9d8,f0f0f0f0
+348e9dc,f0ffffff
+348e9e0,fff0f0f0
+348e9e4,f0f0f0f0
+348e9e8,f0f0f0f0
+348e9ec,f0ffffff
+348e9f0,fff0f0f0
+348e9f4,f0f0f0f0
+348e9f8,f0f0f0f0
+348e9fc,f0ffffff
+348ea00,fff0f0f0
+348ea04,f0f0f0f0
+348ea08,f0f0f0f0
+348ea0c,f0f0f0ff
348ea10,f0f0f0f0
-348ea14,f06f6f7f
-348ea18,7fffffff
+348ea14,f0f0f0f0
+348ea18,f0f0f0f0
348ea1c,f0f0f0f0
348ea20,f0f0f0f0
-348ea24,f0f06f7f
-348ea28,7fffffff
+348ea24,f0f0f0f0
+348ea28,f0f0f0f0
348ea2c,f0f0f0f0
348ea30,f0f0f0f0
348ea34,f0f0f0f0
-348ea38,7f7fffff
-348ea3c,f0f0f0f0
-348ea40,f0f0f0f0
+348ea38,f0f0f0f0
+348ea3c,f0f0ffff
+348ea40,fffff0f0
348ea44,f0f0f0f0
-348ea48,f07fffff
-348ea4c,fff0f0f0
-348ea50,f0f0f0f0
+348ea48,f0f0f0f0
+348ea4c,f0f0ffff
+348ea50,fffff0f0
348ea54,f0f0f0f0
-348ea58,f0f0ffff
-348ea5c,f0f0f0f0
-348ea60,f0f0f0f0
+348ea58,f0f0f0f0
+348ea5c,f0f0ffff
+348ea60,fffff0f0
348ea64,f0f0f0f0
348ea68,f0f0f0f0
-348ea6c,f0f0f0f0
-348ea70,f0f0f0f0
+348ea6c,f0f0ffff
+348ea70,fffff0f0
348ea74,f0f0f0f0
348ea78,f0f0f0f0
-348ea7c,f0f0f0f0
-348ea80,f0f0f0f0
+348ea7c,f0f0ffff
+348ea80,fffff0f0
348ea84,f0f0f0f0
348ea88,f0f0f0f0
-348ea8c,f0f0f0f0
-348ea90,f0f0f0f0
-348ea94,f0f09fff
-348ea98,fff0f0f0
-348ea9c,f0f0f0f0
-348eaa0,f0f0f0f0
-348eaa4,f0f09fff
-348eaa8,fffff0f0
-348eaac,f0f0f0f0
-348eab0,f0f0f0f0
-348eab4,f0f09f9f
-348eab8,fffff0f0
-348eabc,f0f0f0f0
-348eac0,f0f0f0f0
-348eac4,f0f09f9f
-348eac8,fffff0f0
-348eacc,f0f0f0f0
-348ead0,f0f0f0f0
-348ead4,f09f9f9f
-348ead8,9fffeff0
-348eadc,f0f0f0f0
-348eae0,f0f0f0f0
-348eae4,f08f9f9f
-348eae8,9fefeff0
-348eaec,f0f0f0f0
-348eaf0,f0f0f0f0
-348eaf4,f08f8f9f
-348eaf8,9fefeff0
-348eafc,f0f0f0f0
-348eb00,f0f0f0f0
-348eb04,f08f8f8f
-348eb08,9f9fefef
-348eb0c,f0f0f0f0
-348eb10,f0f0f0f0
-348eb14,f08f8f8f
-348eb18,8f9fefef
+348ea8c,f0f0ffff
+348ea90,fffff0f0
+348ea94,f0f0f0f0
+348ea98,f0f0f0f0
+348ea9c,f0f0ffff
+348eaa0,fffff0f0
+348eaa4,f0f0f0f0
+348eaa8,f0f0f0f0
+348eaac,f0f0ffff
+348eab0,fffff0f0
+348eab4,f0f0f0f0
+348eab8,f0f0f0f0
+348eabc,f0f0ffff
+348eac0,fffff0f0
+348eac4,f0f0f0f0
+348eac8,f0f0f0f0
+348eacc,f0f0ffff
+348ead0,fffff0f0
+348ead4,f0f0f0f0
+348ead8,f0f0f0f0
+348eadc,f0f0ffff
+348eae0,fffff0f0
+348eae4,f0f0f0f0
+348eae8,f0f0f0f0
+348eaec,f0f0ffff
+348eaf0,fffff0f0
+348eaf4,f0f0f0f0
+348eaf8,f0f0f0f0
+348eafc,f0f0ffff
+348eb00,fffff0f0
+348eb04,f0f0f0f0
+348eb08,f0f0f0f0
+348eb0c,f0f0ffff
+348eb10,fffff0f0
+348eb14,f0f0f0f0
+348eb18,f0f0f0f0
348eb1c,f0f0f0f0
348eb20,f0f0f0f0
-348eb24,f0f08f8f
-348eb28,8f8fefef
-348eb2c,eff0f0f0
+348eb24,f0f0f0f0
+348eb28,f0f0f0f0
+348eb2c,f0f0f0f0
348eb30,f0f0f0f0
348eb34,f0f0f0f0
-348eb38,8f8f8fef
-348eb3c,eff0f0f0
-348eb40,f0f0f0f0
+348eb38,f0f0f0f0
+348eb3c,f0f0ffff
+348eb40,fffff0f0
348eb44,f0f0f0f0
-348eb48,f08f8fef
-348eb4c,eff0f0f0
-348eb50,f0f0f0f0
+348eb48,f0f0f0f0
+348eb4c,f0f0ffff
+348eb50,fffff0f0
348eb54,f0f0f0f0
-348eb58,f0f0f08f
-348eb5c,f0f0f0f0
-348eb60,f0f0f0f0
+348eb58,f0f0f0f0
+348eb5c,f0f03fff
+348eb60,fffff0f0
348eb64,f0f0f0f0
348eb68,f0f0f0f0
-348eb6c,f0f0f0f0
-348eb70,f0f0f0f0
+348eb6c,f0f03fff
+348eb70,fffff0f0
348eb74,f0f0f0f0
348eb78,f0f0f0f0
-348eb7c,f0f0f0f0
-348eb80,f0f0f0f0
+348eb7c,f0f03fff
+348eb80,fffff0f0
348eb84,f0f0f0f0
348eb88,f0f0f0f0
-348eb8c,f0f0f0f0
-348eb90,f0f0f0f0
-348eb94,f0f0f0ef
-348eb98,eff0f0f0
-348eb9c,f0f0f0f0
-348eba0,f0f0f0f0
-348eba4,f0f0bfbf
-348eba8,eff0f0f0
-348ebac,f0f0f0f0
-348ebb0,f0f0f0f0
-348ebb4,f0f0bfbf
-348ebb8,dfdff0f0
-348ebbc,f0f0f0f0
-348ebc0,f0f0f0f0
-348ebc4,f0f0afbf
-348ebc8,bfdff0f0
-348ebcc,f0f0f0f0
-348ebd0,f0f0f0f0
-348ebd4,f0afafaf
-348ebd8,afdfdff0
-348ebdc,f0f0f0f0
-348ebe0,f0f0f0f0
-348ebe4,f0afafaf
-348ebe8,afafdff0
-348ebec,f0f0f0f0
-348ebf0,f0f0f0f0
-348ebf4,f0afafaf
-348ebf8,afafdfdf
-348ebfc,f0f0f0f0
-348ec00,f0f0f0f0
-348ec04,9fafafaf
-348ec08,afafdfdf
+348eb8c,f0f03fff
+348eb90,fffff0f0
+348eb94,f0f0f0f0
+348eb98,f0f0f0f0
+348eb9c,f0f03fff
+348eba0,fffff0f0
+348eba4,f0f0f0f0
+348eba8,f0f0f0f0
+348ebac,f0f03fff
+348ebb0,fffffff0
+348ebb4,f0f0f0f0
+348ebb8,f0f0f0f0
+348ebbc,f0f0f0ff
+348ebc0,fffffff0
+348ebc4,f0f0f0f0
+348ebc8,f0f0f0f0
+348ebcc,f0f0f0ff
+348ebd0,fffffff0
+348ebd4,f0f0f0f0
+348ebd8,f0f0f0f0
+348ebdc,f0f0f0ff
+348ebe0,fffffff0
+348ebe4,f0f0f0f0
+348ebe8,f0f0f0f0
+348ebec,f0f0f0ff
+348ebf0,fffffff0
+348ebf4,f0f0f0f0
+348ebf8,f0f0f0f0
+348ebfc,f0f0f0ff
+348ec00,fffffff0
+348ec04,f0f0f0f0
+348ec08,f0f0f0f0
348ec0c,f0f0f0f0
-348ec10,f0f0f0f0
-348ec14,9f9fafaf
-348ec18,afafafcf
+348ec10,fff0f0f0
+348ec14,f0f0f0f0
+348ec18,f0f0f0f0
348ec1c,f0f0f0f0
348ec20,f0f0f0f0
-348ec24,f0f09f9f
-348ec28,afafafcf
-348ec2c,cff0f0f0
+348ec24,f0f0f0f0
+348ec28,f0f0f0f0
+348ec2c,f0f0f0f0
348ec30,f0f0f0f0
348ec34,f0f0f0f0
-348ec38,9fafafaf
-348ec3c,cff0f0f0
-348ec40,f0f0f0f0
+348ec38,f0f0f0f0
+348ec3c,f0f05fff
+348ec40,fffff0f0
348ec44,f0f0f0f0
-348ec48,f0f0f0af
-348ec4c,cff0f0f0
-348ec50,f0f0f0f0
+348ec48,f0f0f0f0
+348ec4c,f0f05fff
+348ec50,fffff0f0
348ec54,f0f0f0f0
348ec58,f0f0f0f0
-348ec5c,f0f0f0f0
-348ec60,f0f0f0f0
+348ec5c,f0f05fff
+348ec60,fffff0f0
348ec64,f0f0f0f0
348ec68,f0f0f0f0
-348ec6c,f0f0f0f0
-348ec70,f0f0f0f0
+348ec6c,f0f05fff
+348ec70,fffff0f0
348ec74,f0f0f0f0
348ec78,f0f0f0f0
-348ec7c,f0f0f0f0
-348ec80,f0f0f0f0
+348ec7c,f0f05fff
+348ec80,fffff0f0
348ec84,f0f0f0f0
348ec88,f0f0f0f0
-348ec8c,f0f0f0f0
-348ec90,f0f0f0f0
-348ec94,f0f0f0cf
-348ec98,cff0f0f0
-348ec9c,f0f0f0f0
-348eca0,f0f0f0f0
-348eca4,f0f0cfcf
-348eca8,cff0f0f0
-348ecac,f0f0f0f0
-348ecb0,f0f0f0f0
-348ecb4,f0f0cfcf
-348ecb8,cfbff0f0
-348ecbc,f0f0f0f0
-348ecc0,f0f0f0f0
-348ecc4,f0f0cfcf
-348ecc8,cfbff0f0
-348eccc,f0f0f0f0
-348ecd0,f0f0f0f0
-348ecd4,f0bfbfbf
-348ecd8,cfcfbff0
-348ecdc,f0f0f0f0
-348ece0,f0f0f0f0
-348ece4,f0bfbfbf
-348ece8,bfbfbff0
+348ec8c,f0f05f5f
+348ec90,fffffff0
+348ec94,f0f0f0f0
+348ec98,f0f0f0f0
+348ec9c,f0f05f5f
+348eca0,fffffff0
+348eca4,f0f0f0f0
+348eca8,f0f0f0f0
+348ecac,f0f05f5f
+348ecb0,fffffff0
+348ecb4,f0f0f0f0
+348ecb8,f0f0f0f0
+348ecbc,f0f05f5f
+348ecc0,fffffff0
+348ecc4,f0f0f0f0
+348ecc8,f0f0f0f0
+348eccc,f0f0f05f
+348ecd0,ffffffff
+348ecd4,f0f0f0f0
+348ecd8,f0f0f0f0
+348ecdc,f0f0f05f
+348ece0,5fffffff
+348ece4,f0f0f0f0
+348ece8,f0f0f0f0
348ecec,f0f0f0f0
-348ecf0,f0f0f0f0
-348ecf4,bfbfbfbf
-348ecf8,bfbfbfbf
+348ecf0,5fffffff
+348ecf4,f0f0f0f0
+348ecf8,f0f0f0f0
348ecfc,f0f0f0f0
-348ed00,f0f0f0f0
-348ed04,bfbfbfbf
-348ed08,bfbfbfbf
+348ed00,5fffffff
+348ed04,f0f0f0f0
+348ed08,f0f0f0f0
348ed0c,f0f0f0f0
-348ed10,f0f0f0f0
-348ed14,afafbfbf
-348ed18,bfbfbfbf
+348ed10,f0fff0f0
+348ed14,f0f0f0f0
+348ed18,f0f0f0f0
348ed1c,f0f0f0f0
348ed20,f0f0f0f0
-348ed24,f0afafaf
-348ed28,bfbfbfbf
-348ed2c,aff0f0f0
+348ed24,f0f0f0f0
+348ed28,f0f0f0f0
+348ed2c,f0f0f0f0
348ed30,f0f0f0f0
348ed34,f0f0f0f0
-348ed38,f0afbfbf
-348ed3c,bff0f0f0
-348ed40,f0f0f0f0
+348ed38,f0f0f0f0
+348ed3c,f0f07fff
+348ed40,fff0f0f0
348ed44,f0f0f0f0
348ed48,f0f0f0f0
-348ed4c,f0f0f0f0
-348ed50,f0f0f0f0
+348ed4c,f0f07fff
+348ed50,fffff0f0
348ed54,f0f0f0f0
348ed58,f0f0f0f0
-348ed5c,f0f0f0f0
-348ed60,f0f0f0f0
+348ed5c,f0f07fff
+348ed60,fffff0f0
348ed64,f0f0f0f0
348ed68,f0f0f0f0
-348ed6c,f0f0f0f0
-348ed70,f0f0f0f0
+348ed6c,f0f07f7f
+348ed70,fffff0f0
348ed74,f0f0f0f0
348ed78,f0f0f0f0
-348ed7c,f0f0f0f0
-348ed80,f0f0f0f0
+348ed7c,f0f07f7f
+348ed80,fffffff0
348ed84,f0f0f0f0
348ed88,f0f0f0f0
-348ed8c,f0f0f0f0
-348ed90,f0f0f0f0
-348ed94,f0f0f0df
+348ed8c,f0f07f7f
+348ed90,fffffff0
+348ed94,f0f0f0f0
348ed98,f0f0f0f0
-348ed9c,f0f0f0f0
-348eda0,f0f0f0f0
-348eda4,f0f0f0df
-348eda8,dff0f0f0
-348edac,f0f0f0f0
-348edb0,f0f0f0f0
-348edb4,f0f0cfdf
-348edb8,dff0f0f0
-348edbc,f0f0f0f0
-348edc0,f0f0f0f0
-348edc4,f0f0cfcf
-348edc8,cfcff0f0
-348edcc,f0f0f0f0
-348edd0,f0f0f0f0
-348edd4,f0cfcfcf
-348edd8,cfcff0f0
+348ed9c,f07f7f7f
+348eda0,7ffffff0
+348eda4,f0f0f0f0
+348eda8,f0f0f0f0
+348edac,f06f7f7f
+348edb0,7fffffff
+348edb4,f0f0f0f0
+348edb8,f0f0f0f0
+348edbc,f06f6f7f
+348edc0,7fffffff
+348edc4,f0f0f0f0
+348edc8,f0f0f0f0
+348edcc,f0f06f7f
+348edd0,7fffffff
+348edd4,f0f0f0f0
+348edd8,f0f0f0f0
348eddc,f0f0f0f0
-348ede0,f0f0f0f0
-348ede4,f0cfcfcf
-348ede8,cfcfcff0
+348ede0,7f7fffff
+348ede4,f0f0f0f0
+348ede8,f0f0f0f0
348edec,f0f0f0f0
-348edf0,f0f0f0f0
-348edf4,cfcfcfcf
-348edf8,cfcfcff0
+348edf0,f07fffff
+348edf4,fff0f0f0
+348edf8,f0f0f0f0
348edfc,f0f0f0f0
-348ee00,f0f0f0f0
-348ee04,bfbfcfcf
-348ee08,cfcfcfcf
+348ee00,f0f0ffff
+348ee04,f0f0f0f0
+348ee08,f0f0f0f0
348ee0c,f0f0f0f0
348ee10,f0f0f0f0
-348ee14,bfbfbfbf
-348ee18,bfbfbfbf
+348ee14,f0f0f0f0
+348ee18,f0f0f0f0
348ee1c,f0f0f0f0
-348ee20,f0f0f0bf
-348ee24,bfbfbfbf
-348ee28,bfbfbfbf
-348ee2c,bff0f0f0
+348ee20,f0f0f0f0
+348ee24,f0f0f0f0
+348ee28,f0f0f0f0
+348ee2c,f0f0f0f0
348ee30,f0f0f0f0
348ee34,f0f0f0f0
-348ee38,f0f0bfbf
-348ee3c,bff0f0f0
-348ee40,f0f0f0f0
+348ee38,f0f0f0f0
+348ee3c,f0f09fff
+348ee40,fff0f0f0
348ee44,f0f0f0f0
348ee48,f0f0f0f0
-348ee4c,f0f0f0f0
-348ee50,f0f0f0f0
+348ee4c,f0f09fff
+348ee50,fffff0f0
348ee54,f0f0f0f0
348ee58,f0f0f0f0
-348ee5c,f0f0f0f0
-348ee60,f0f0f0f0
+348ee5c,f0f09f9f
+348ee60,fffff0f0
348ee64,f0f0f0f0
348ee68,f0f0f0f0
-348ee6c,f0f0f0f0
-348ee70,f0f0f0f0
+348ee6c,f0f09f9f
+348ee70,fffff0f0
348ee74,f0f0f0f0
348ee78,f0f0f0f0
-348ee7c,f0f0f0f0
-348ee80,f0f0f0f0
+348ee7c,f09f9f9f
+348ee80,9fffeff0
348ee84,f0f0f0f0
348ee88,f0f0f0f0
-348ee8c,f0f0f0f0
-348ee90,f0f0f0f0
-348ee94,f0f0f0df
-348ee98,dff0f0f0
-348ee9c,f0f0f0f0
-348eea0,f0f0f0f0
-348eea4,f0f0f0df
-348eea8,dff0f0f0
-348eeac,f0f0f0f0
-348eeb0,f0f0f0f0
-348eeb4,f0f0dfdf
-348eeb8,dfdff0f0
-348eebc,f0f0f0f0
-348eec0,f0f0f0f0
-348eec4,f0f0dfdf
-348eec8,dfdff0f0
-348eecc,f0f0f0f0
-348eed0,f0f0f0f0
-348eed4,f0f0cfcf
-348eed8,cfcff0f0
+348ee8c,f08f9f9f
+348ee90,9fefeff0
+348ee94,f0f0f0f0
+348ee98,f0f0f0f0
+348ee9c,f08f8f9f
+348eea0,9fefeff0
+348eea4,f0f0f0f0
+348eea8,f0f0f0f0
+348eeac,f08f8f8f
+348eeb0,9f9fefef
+348eeb4,f0f0f0f0
+348eeb8,f0f0f0f0
+348eebc,f08f8f8f
+348eec0,8f9fefef
+348eec4,f0f0f0f0
+348eec8,f0f0f0f0
+348eecc,f0f08f8f
+348eed0,8f8fefef
+348eed4,eff0f0f0
+348eed8,f0f0f0f0
348eedc,f0f0f0f0
-348eee0,f0f0f0f0
-348eee4,f0cfcfcf
-348eee8,cfcfcff0
+348eee0,8f8f8fef
+348eee4,eff0f0f0
+348eee8,f0f0f0f0
348eeec,f0f0f0f0
-348eef0,f0f0f0f0
-348eef4,f0cfcfcf
-348eef8,cfcfcff0
+348eef0,f08f8fef
+348eef4,eff0f0f0
+348eef8,f0f0f0f0
348eefc,f0f0f0f0
-348ef00,f0f0f0f0
-348ef04,cfcfcfcf
-348ef08,cfcfcfcf
+348ef00,f0f0f08f
+348ef04,f0f0f0f0
+348ef08,f0f0f0f0
348ef0c,f0f0f0f0
348ef10,f0f0f0f0
-348ef14,cfcfcfcf
-348ef18,cfcfcfcf
+348ef14,f0f0f0f0
+348ef18,f0f0f0f0
348ef1c,f0f0f0f0
-348ef20,f0f0f0bf
-348ef24,bfbfbfbf
-348ef28,bfbfbfbf
-348ef2c,bff0f0f0
+348ef20,f0f0f0f0
+348ef24,f0f0f0f0
+348ef28,f0f0f0f0
+348ef2c,f0f0f0f0
348ef30,f0f0f0f0
348ef34,f0f0f0f0
348ef38,f0f0f0f0
-348ef3c,f0f0f0f0
-348ef40,f0f0f0f0
+348ef3c,f0f0f0ef
+348ef40,eff0f0f0
348ef44,f0f0f0f0
348ef48,f0f0f0f0
-348ef4c,f0f0f0f0
-348ef50,f0f0f0f0
+348ef4c,f0f0bfbf
+348ef50,eff0f0f0
348ef54,f0f0f0f0
348ef58,f0f0f0f0
-348ef5c,f0f0f0f0
-348ef60,f0f0f0f0
+348ef5c,f0f0bfbf
+348ef60,dfdff0f0
348ef64,f0f0f0f0
348ef68,f0f0f0f0
-348ef6c,f0f0f0f0
-348ef70,f0f0f0f0
+348ef6c,f0f0afbf
+348ef70,bfdff0f0
348ef74,f0f0f0f0
348ef78,f0f0f0f0
-348ef7c,f0f0f0f0
+348ef7c,f0afafaf
+348ef80,afdfdff0
+348ef84,f0f0f0f0
+348ef88,f0f0f0f0
+348ef8c,f0afafaf
+348ef90,afafdff0
+348ef94,f0f0f0f0
+348ef98,f0f0f0f0
+348ef9c,f0afafaf
+348efa0,afafdfdf
+348efa4,f0f0f0f0
+348efa8,f0f0f0f0
+348efac,9fafafaf
+348efb0,afafdfdf
+348efb4,f0f0f0f0
+348efb8,f0f0f0f0
+348efbc,9f9fafaf
+348efc0,afafafcf
+348efc4,f0f0f0f0
+348efc8,f0f0f0f0
+348efcc,f0f09f9f
+348efd0,afafafcf
+348efd4,cff0f0f0
+348efd8,f0f0f0f0
+348efdc,f0f0f0f0
+348efe0,9fafafaf
+348efe4,cff0f0f0
+348efe8,f0f0f0f0
+348efec,f0f0f0f0
+348eff0,f0f0f0af
+348eff4,cff0f0f0
+348eff8,f0f0f0f0
+348effc,f0f0f0f0
+348f000,f0f0f0f0
+348f004,f0f0f0f0
+348f008,f0f0f0f0
+348f00c,f0f0f0f0
+348f010,f0f0f0f0
+348f014,f0f0f0f0
+348f018,f0f0f0f0
+348f01c,f0f0f0f0
+348f020,f0f0f0f0
+348f024,f0f0f0f0
+348f028,f0f0f0f0
+348f02c,f0f0f0f0
+348f030,f0f0f0f0
+348f034,f0f0f0f0
+348f038,f0f0f0f0
+348f03c,f0f0f0cf
+348f040,cff0f0f0
+348f044,f0f0f0f0
+348f048,f0f0f0f0
+348f04c,f0f0cfcf
+348f050,cff0f0f0
+348f054,f0f0f0f0
+348f058,f0f0f0f0
+348f05c,f0f0cfcf
+348f060,cfbff0f0
+348f064,f0f0f0f0
+348f068,f0f0f0f0
+348f06c,f0f0cfcf
+348f070,cfbff0f0
+348f074,f0f0f0f0
+348f078,f0f0f0f0
+348f07c,f0bfbfbf
+348f080,cfcfbff0
+348f084,f0f0f0f0
+348f088,f0f0f0f0
+348f08c,f0bfbfbf
+348f090,bfbfbff0
+348f094,f0f0f0f0
+348f098,f0f0f0f0
+348f09c,bfbfbfbf
+348f0a0,bfbfbfbf
+348f0a4,f0f0f0f0
+348f0a8,f0f0f0f0
+348f0ac,bfbfbfbf
+348f0b0,bfbfbfbf
+348f0b4,f0f0f0f0
+348f0b8,f0f0f0f0
+348f0bc,afafbfbf
+348f0c0,bfbfbfbf
+348f0c4,f0f0f0f0
+348f0c8,f0f0f0f0
+348f0cc,f0afafaf
+348f0d0,bfbfbfbf
+348f0d4,aff0f0f0
+348f0d8,f0f0f0f0
+348f0dc,f0f0f0f0
+348f0e0,f0afbfbf
+348f0e4,bff0f0f0
+348f0e8,f0f0f0f0
+348f0ec,f0f0f0f0
+348f0f0,f0f0f0f0
+348f0f4,f0f0f0f0
+348f0f8,f0f0f0f0
+348f0fc,f0f0f0f0
+348f100,f0f0f0f0
+348f104,f0f0f0f0
+348f108,f0f0f0f0
+348f10c,f0f0f0f0
+348f110,f0f0f0f0
+348f114,f0f0f0f0
+348f118,f0f0f0f0
+348f11c,f0f0f0f0
+348f120,f0f0f0f0
+348f124,f0f0f0f0
+348f128,f0f0f0f0
+348f12c,f0f0f0f0
+348f130,f0f0f0f0
+348f134,f0f0f0f0
+348f138,f0f0f0f0
+348f13c,f0f0f0df
+348f140,f0f0f0f0
+348f144,f0f0f0f0
+348f148,f0f0f0f0
+348f14c,f0f0f0df
+348f150,dff0f0f0
+348f154,f0f0f0f0
+348f158,f0f0f0f0
+348f15c,f0f0cfdf
+348f160,dff0f0f0
+348f164,f0f0f0f0
+348f168,f0f0f0f0
+348f16c,f0f0cfcf
+348f170,cfcff0f0
+348f174,f0f0f0f0
+348f178,f0f0f0f0
+348f17c,f0cfcfcf
+348f180,cfcff0f0
+348f184,f0f0f0f0
+348f188,f0f0f0f0
+348f18c,f0cfcfcf
+348f190,cfcfcff0
+348f194,f0f0f0f0
+348f198,f0f0f0f0
+348f19c,cfcfcfcf
+348f1a0,cfcfcff0
+348f1a4,f0f0f0f0
+348f1a8,f0f0f0f0
+348f1ac,bfbfcfcf
+348f1b0,cfcfcfcf
+348f1b4,f0f0f0f0
+348f1b8,f0f0f0f0
+348f1bc,bfbfbfbf
+348f1c0,bfbfbfbf
+348f1c4,f0f0f0f0
+348f1c8,f0f0f0bf
+348f1cc,bfbfbfbf
+348f1d0,bfbfbfbf
+348f1d4,bff0f0f0
+348f1d8,f0f0f0f0
+348f1dc,f0f0f0f0
+348f1e0,f0f0bfbf
+348f1e4,bff0f0f0
+348f1e8,f0f0f0f0
+348f1ec,f0f0f0f0
+348f1f0,f0f0f0f0
+348f1f4,f0f0f0f0
+348f1f8,f0f0f0f0
+348f1fc,f0f0f0f0
+348f200,f0f0f0f0
+348f204,f0f0f0f0
+348f208,f0f0f0f0
+348f20c,f0f0f0f0
+348f210,f0f0f0f0
+348f214,f0f0f0f0
+348f218,f0f0f0f0
+348f21c,f0f0f0f0
+348f220,f0f0f0f0
+348f224,f0f0f0f0
+348f228,f0f0f0f0
+348f22c,f0f0f0f0
+348f230,f0f0f0f0
+348f234,f0f0f0f0
+348f238,f0f0f0f0
+348f23c,f0f0f0df
+348f240,dff0f0f0
+348f244,f0f0f0f0
+348f248,f0f0f0f0
+348f24c,f0f0f0df
+348f250,dff0f0f0
+348f254,f0f0f0f0
+348f258,f0f0f0f0
+348f25c,f0f0dfdf
+348f260,dfdff0f0
+348f264,f0f0f0f0
+348f268,f0f0f0f0
+348f26c,f0f0dfdf
+348f270,dfdff0f0
+348f274,f0f0f0f0
+348f278,f0f0f0f0
+348f27c,f0f0cfcf
+348f280,cfcff0f0
+348f284,f0f0f0f0
+348f288,f0f0f0f0
+348f28c,f0cfcfcf
+348f290,cfcfcff0
+348f294,f0f0f0f0
+348f298,f0f0f0f0
+348f29c,f0cfcfcf
+348f2a0,cfcfcff0
+348f2a4,f0f0f0f0
+348f2a8,f0f0f0f0
+348f2ac,cfcfcfcf
+348f2b0,cfcfcfcf
+348f2b4,f0f0f0f0
+348f2b8,f0f0f0f0
+348f2bc,cfcfcfcf
+348f2c0,cfcfcfcf
+348f2c4,f0f0f0f0
+348f2c8,f0f0f0bf
+348f2cc,bfbfbfbf
+348f2d0,bfbfbfbf
+348f2d4,bff0f0f0
+348f2d8,f0f0f0f0
+348f2dc,f0f0f0f0
+348f2e0,f0f0f0f0
+348f2e4,f0f0f0f0
+348f2e8,f0f0f0f0
+348f2ec,f0f0f0f0
+348f2f0,f0f0f0f0
+348f2f4,f0f0f0f0
+348f2f8,f0f0f0f0
+348f2fc,f0f0f0f0
+348f300,f0f0f0f0
+348f304,f0f0f0f0
+348f308,f0f0f0f0
+348f30c,f0f0f0f0
+348f310,f0f0f0f0
+348f314,f0f0f0f0
+348f318,f0f0f0f0
+348f31c,f0f0f0f0
+348f320,f0f0f0f0
+348f324,f0f0f0f0
diff --git a/worlds/oot/data/generated/symbols.json b/worlds/oot/data/generated/symbols.json
index 8b868c77f3..c5c0d5c0fb 100644
--- a/worlds/oot/data/generated/symbols.json
+++ b/worlds/oot/data/generated/symbols.json
@@ -1,11 +1,12 @@
{
- "ADULT_INIT_ITEMS": "03481D40",
- "ADULT_VALID_ITEMS": "03481D48",
+ "ADULT_INIT_ITEMS": "03481D54",
+ "ADULT_VALID_ITEMS": "03481D5C",
"AP_PLAYER_NAME": "03480834",
- "AUDIO_THREAD_INFO": "03482FC0",
- "AUDIO_THREAD_INFO_MEM_SIZE": "03482FDC",
- "AUDIO_THREAD_INFO_MEM_START": "03482FD8",
- "AUDIO_THREAD_MEM_START": "0348EF80",
+ "AUDIO_THREAD_INFO": "03482FB0",
+ "AUDIO_THREAD_INFO_MEM_SIZE": "03482FCC",
+ "AUDIO_THREAD_INFO_MEM_START": "03482FC8",
+ "AUDIO_THREAD_MEM_START": "0348F330",
+ "BIG_POE_COUNT": "03480CEE",
"BOMBCHUS_IN_LOGIC": "03480CBC",
"CFG_A_BUTTON_COLOR": "03480854",
"CFG_A_NOTE_COLOR": "03480872",
@@ -16,7 +17,7 @@
"CFG_B_BUTTON_COLOR": "0348085A",
"CFG_C_BUTTON_COLOR": "03480860",
"CFG_C_NOTE_COLOR": "03480878",
- "CFG_DAMAGE_MULTIPLYER": "03482CB0",
+ "CFG_DAMAGE_MULTIPLYER": "03482CA0",
"CFG_DISPLAY_DPAD": "0348088A",
"CFG_HEART_COLOR": "0348084E",
"CFG_MAGIC_COLOR": "03480848",
@@ -36,149 +37,160 @@
"CFG_RAINBOW_SWORD_OUTER_ENABLED": "0348088C",
"CFG_SHOP_CURSOR_COLOR": "0348086C",
"CFG_TEXT_CURSOR_COLOR": "03480866",
- "CHAIN_HBA_REWARDS": "03483950",
- "CHEST_SIZE_MATCH_CONTENTS": "034826F0",
- "COMPLETE_MASK_QUEST": "0348B201",
+ "CHAIN_HBA_REWARDS": "03483940",
+ "CHEST_SIZE_MATCH_CONTENTS": "03482704",
+ "COMPLETE_MASK_QUEST": "0348B5A5",
"COOP_CONTEXT": "03480020",
"COOP_VERSION": "03480020",
"COSMETIC_CONTEXT": "03480844",
"COSMETIC_FORMAT_VERSION": "03480844",
- "CURRENT_GROTTO_ID": "03482E82",
+ "CURRENT_GROTTO_ID": "03482E72",
"DEATH_LINK": "0348002A",
- "DEBUG_OFFSET": "034828A0",
+ "DEBUG_OFFSET": "03482890",
"DISABLE_TIMERS": "03480CDC",
- "DPAD_TEXTURE": "0348D780",
- "DUNGEONS_SHUFFLED": "03480CDE",
+ "DPAD_TEXTURE": "0348DB28",
+ "DUNGEONS_SHUFFLED": "03480CDD",
+ "DUNGEON_IS_MQ_ADDRESS": "03480CE0",
+ "DUNGEON_REWARDS_ADDRESS": "03480CE4",
+ "ENHANCE_MAP_COMPASS": "03480CE8",
"EXTENDED_OBJECT_TABLE": "03480C9C",
- "EXTERN_DAMAGE_MULTIPLYER": "03482CB1",
- "FAST_BUNNY_HOOD_ENABLED": "03480CE0",
+ "EXTERN_DAMAGE_MULTIPLYER": "03482CA1",
+ "FAST_BUNNY_HOOD_ENABLED": "03480CDF",
"FAST_CHESTS": "03480CD6",
- "FONT_TEXTURE": "0348C2B8",
+ "FONT_TEXTURE": "0348C660",
"FREE_SCARECROW_ENABLED": "03480CCC",
- "GET_CHEST_OVERRIDE_COLOR_WRAPPER": "03482720",
- "GET_CHEST_OVERRIDE_SIZE_WRAPPER": "034826F4",
- "GET_ITEM_TRIGGERED": "0348140C",
+ "GANON_BOSS_KEY_CONDITION": "0348B570",
+ "GANON_BOSS_KEY_CONDITION_COUNT": "0348B56E",
+ "GET_CHEST_OVERRIDE_WRAPPER": "03482708",
+ "GET_ITEM_TRIGGERED": "03481420",
"GOSSIP_HINT_CONDITION": "03480CC8",
- "GROTTO_EXIT_LIST": "03482E40",
- "GROTTO_LOAD_TABLE": "03482DBC",
+ "GROTTO_EXIT_LIST": "03482E30",
+ "GROTTO_LOAD_TABLE": "03482DAC",
"INCOMING_ITEM": "03480028",
"INCOMING_PLAYER": "03480026",
"INITIAL_SAVE_DATA": "0348089C",
"JABU_ELEVATOR_ENABLE": "03480CD4",
+ "KAKARIKO_WEATHER_FORECAST": "0348B5C4",
"LACS_CONDITION": "03480CC4",
"LACS_CONDITION_COUNT": "03480CD2",
- "MALON_GAVE_ICETRAP": "0348368C",
+ "MALON_GAVE_ICETRAP": "0348367C",
"MALON_TEXT_ID": "03480CDB",
- "MAX_RUPEES": "0348B203",
- "MOVED_ADULT_KING_ZORA": "03482FFC",
- "NO_ESCAPE_SEQUENCE": "0348B1CC",
- "NO_FOG_STATE": "03480CDD",
+ "MAX_RUPEES": "0348B5A7",
+ "MOVED_ADULT_KING_ZORA": "03482FEC",
+ "NO_ESCAPE_SEQUENCE": "0348B56C",
"OCARINAS_SHUFFLED": "03480CD5",
- "OPEN_KAKARIKO": "0348B202",
+ "OPEN_FOREST": "03480CEC",
+ "OPEN_FOUNTAIN": "03480CED",
+ "OPEN_KAKARIKO": "0348B5A6",
"OUTGOING_ITEM": "03480030",
"OUTGOING_KEY": "0348002C",
"OUTGOING_PLAYER": "03480032",
- "OVERWORLD_SHUFFLED": "03480CDF",
- "PAYLOAD_END": "0348EF80",
+ "OVERWORLD_SHUFFLED": "03480CDE",
+ "PAYLOAD_END": "0348F330",
"PAYLOAD_START": "03480000",
- "PLAYED_WARP_SONG": "03481210",
+ "PLAYED_WARP_SONG": "03481224",
"PLAYER_ID": "03480024",
"PLAYER_NAMES": "03480034",
"PLAYER_NAME_ID": "03480025",
"RAINBOW_BRIDGE_CONDITION": "03480CC0",
"RAINBOW_BRIDGE_COUNT": "03480CD0",
"RANDO_CONTEXT": "03480000",
- "SHUFFLE_BEANS": "03482D18",
- "SHUFFLE_CARPET_SALESMAN": "03483A08",
+ "SHOP_SLOTS": "03480CEF",
+ "SHOW_DUNGEON_REWARDS": "03480CE9",
+ "SHUFFLE_BEANS": "03482D08",
+ "SHUFFLE_CARPET_SALESMAN": "034839F8",
"SHUFFLE_COWS": "03480CD7",
- "SHUFFLE_MEDIGORON": "03483A64",
+ "SHUFFLE_MEDIGORON": "03483A54",
+ "SHUFFLE_SCRUBS": "03480CEB",
+ "SMALL_KEY_SHUFFLE": "03480CEA",
"SONGS_AS_ITEMS": "03480CD8",
- "SOS_ITEM_GIVEN": "034814D8",
- "SPEED_MULTIPLIER": "03482760",
- "START_TWINROVA_FIGHT": "0348307C",
- "TIME_TRAVEL_SAVED_EQUIPS": "03481A64",
- "TRIFORCE_ICON_TEXTURE": "0348DF80",
- "TWINROVA_ACTION_TIMER": "03483080",
+ "SOS_ITEM_GIVEN": "034814EC",
+ "SPEED_MULTIPLIER": "03482750",
+ "START_TWINROVA_FIGHT": "0348306C",
+ "TIME_TRAVEL_SAVED_EQUIPS": "03481A78",
+ "TRIFORCE_ICON_TEXTURE": "0348E328",
+ "TWINROVA_ACTION_TIMER": "03483070",
"WINDMILL_SONG_ID": "03480CD9",
"WINDMILL_TEXT_ID": "03480CDA",
- "a_button": "0348B190",
- "a_note_b": "0348B17C",
- "a_note_font_glow_base": "0348B164",
- "a_note_font_glow_max": "0348B160",
- "a_note_g": "0348B180",
- "a_note_glow_base": "0348B16C",
- "a_note_glow_max": "0348B168",
- "a_note_r": "0348B184",
- "active_item_action_id": "0348B1E4",
- "active_item_fast_chest": "0348B1D4",
- "active_item_graphic_id": "0348B1D8",
- "active_item_object_id": "0348B1DC",
- "active_item_row": "0348B1E8",
- "active_item_text_id": "0348B1E0",
- "active_override": "0348B1F0",
- "active_override_is_outgoing": "0348B1EC",
- "b_button": "0348B18C",
- "beating_dd": "0348B198",
- "beating_no_dd": "0348B1A0",
- "c_button": "0348B188",
- "c_note_b": "0348B170",
- "c_note_font_glow_base": "0348B154",
- "c_note_font_glow_max": "0348B150",
- "c_note_g": "0348B174",
- "c_note_glow_base": "0348B15C",
- "c_note_glow_max": "0348B158",
- "c_note_r": "0348B178",
- "cfg_dungeon_info_enable": "0348B11C",
- "cfg_dungeon_info_mq_enable": "0348B1C0",
- "cfg_dungeon_info_mq_need_map": "0348B1BC",
- "cfg_dungeon_info_reward_enable": "0348B118",
- "cfg_dungeon_info_reward_need_altar": "0348B1B4",
- "cfg_dungeon_info_reward_need_compass": "0348B1B8",
- "cfg_dungeon_is_mq": "0348B220",
- "cfg_dungeon_rewards": "03489F14",
- "cfg_file_select_hash": "0348B1C8",
- "cfg_item_overrides": "0348B274",
- "defaultDDHeart": "0348B1A4",
- "defaultHeart": "0348B1AC",
- "dpad_sprite": "0348A088",
- "dummy_actor": "0348B1F8",
- "dungeon_count": "0348B120",
- "dungeons": "03489F38",
- "empty_dlist": "0348B138",
- "extern_ctxt": "03489FD4",
- "font_sprite": "0348A098",
- "freecam_modes": "03489C90",
- "hash_sprites": "0348B12C",
- "hash_symbols": "03489FE8",
- "heap_next": "0348B21C",
- "heart_sprite": "0348A028",
- "icon_sprites": "03489E54",
- "item_digit_sprite": "0348A048",
- "item_overrides_count": "0348B1FC",
- "item_table": "0348A110",
- "items_sprite": "0348A0B8",
- "key_rupee_clock_sprite": "0348A058",
- "last_fog_distance": "0348B124",
- "linkhead_skull_sprite": "0348A038",
- "medal_colors": "03489F24",
- "medals_sprite": "0348A0C8",
- "normal_dd": "0348B194",
- "normal_no_dd": "0348B19C",
- "object_slots": "0348C274",
- "pending_freezes": "0348B200",
- "pending_item_queue": "0348B25C",
- "quest_items_sprite": "0348A0A8",
- "rupee_colors": "03489E60",
- "satisified_pending_frames": "0348B1D0",
- "scene_fog_distance": "0348B128",
- "setup_db": "0348A0E8",
- "song_note_sprite": "0348A068",
- "stones_sprite": "0348A0D8",
- "text_cursor_border_base": "0348B144",
- "text_cursor_border_max": "0348B140",
- "text_cursor_inner_base": "0348B14C",
- "text_cursor_inner_max": "0348B148",
- "triforce_hunt_enabled": "0348B210",
- "triforce_pieces_requied": "0348B1B2",
- "triforce_sprite": "0348A078"
+ "a_button": "0348B530",
+ "a_note_b": "0348B51C",
+ "a_note_font_glow_base": "0348B504",
+ "a_note_font_glow_max": "0348B500",
+ "a_note_g": "0348B520",
+ "a_note_glow_base": "0348B50C",
+ "a_note_glow_max": "0348B508",
+ "a_note_r": "0348B524",
+ "active_item_action_id": "0348B588",
+ "active_item_fast_chest": "0348B578",
+ "active_item_graphic_id": "0348B57C",
+ "active_item_object_id": "0348B580",
+ "active_item_row": "0348B58C",
+ "active_item_text_id": "0348B584",
+ "active_override": "0348B594",
+ "active_override_is_outgoing": "0348B590",
+ "b_button": "0348B52C",
+ "beating_dd": "0348B538",
+ "beating_no_dd": "0348B540",
+ "c_button": "0348B528",
+ "c_note_b": "0348B510",
+ "c_note_font_glow_base": "0348B4F4",
+ "c_note_font_glow_max": "0348B4F0",
+ "c_note_g": "0348B514",
+ "c_note_glow_base": "0348B4FC",
+ "c_note_glow_max": "0348B4F8",
+ "c_note_r": "0348B518",
+ "cfg_dungeon_info_enable": "0348B4BC",
+ "cfg_dungeon_info_mq_enable": "0348B560",
+ "cfg_dungeon_info_mq_need_map": "0348B55C",
+ "cfg_dungeon_info_reward_enable": "0348B4B8",
+ "cfg_dungeon_info_reward_need_altar": "0348B554",
+ "cfg_dungeon_info_reward_need_compass": "0348B558",
+ "cfg_dungeon_is_mq": "0348B5C8",
+ "cfg_dungeon_rewards": "0348A274",
+ "cfg_file_select_hash": "0348B568",
+ "cfg_item_overrides": "0348B61C",
+ "defaultDDHeart": "0348B544",
+ "defaultHeart": "0348B54C",
+ "dpad_sprite": "0348A428",
+ "dummy_actor": "0348B59C",
+ "dungeon_count": "0348B4C0",
+ "dungeons": "0348A298",
+ "empty_dlist": "0348B4D8",
+ "extern_ctxt": "0348A334",
+ "font_sprite": "0348A438",
+ "freecam_modes": "03489FF0",
+ "hash_sprites": "0348B4CC",
+ "hash_symbols": "0348A348",
+ "heap_next": "0348B5C0",
+ "heart_sprite": "0348A3C8",
+ "icon_sprites": "0348A1B4",
+ "item_digit_sprite": "0348A3E8",
+ "item_overrides_count": "0348B5A0",
+ "item_table": "0348A4B0",
+ "items_sprite": "0348A458",
+ "key_rupee_clock_sprite": "0348A3F8",
+ "last_fog_distance": "0348B4C4",
+ "linkhead_skull_sprite": "0348A3D8",
+ "medal_colors": "0348A284",
+ "medals_sprite": "0348A468",
+ "normal_dd": "0348B534",
+ "normal_no_dd": "0348B53C",
+ "num_to_bits": "0348A388",
+ "object_slots": "0348C61C",
+ "pending_freezes": "0348B5A4",
+ "pending_item_queue": "0348B604",
+ "quest_items_sprite": "0348A448",
+ "rupee_colors": "0348A1C0",
+ "satisified_pending_frames": "0348B574",
+ "scene_fog_distance": "0348B4C8",
+ "setup_db": "0348A488",
+ "song_note_sprite": "0348A408",
+ "stones_sprite": "0348A478",
+ "text_cursor_border_base": "0348B4E4",
+ "text_cursor_border_max": "0348B4E0",
+ "text_cursor_inner_base": "0348B4EC",
+ "text_cursor_inner_max": "0348B4E8",
+ "triforce_hunt_enabled": "0348B5B4",
+ "triforce_pieces_requied": "0348B552",
+ "triforce_sprite": "0348A418"
}
\ No newline at end of file
diff --git a/WebHostLib/static/assets/gameInfo/en_Ocarina of Time.md b/worlds/oot/docs/en_Ocarina of Time.md
similarity index 100%
rename from WebHostLib/static/assets/gameInfo/en_Ocarina of Time.md
rename to worlds/oot/docs/en_Ocarina of Time.md
diff --git a/WebHostLib/static/assets/tutorial/Ocarina of Time/setup_en.md b/worlds/oot/docs/setup_en.md
similarity index 97%
rename from WebHostLib/static/assets/tutorial/Ocarina of Time/setup_en.md
rename to worlds/oot/docs/setup_en.md
index 0c0f25b944..d12dbe437f 100644
--- a/WebHostLib/static/assets/tutorial/Ocarina of Time/setup_en.md
+++ b/worlds/oot/docs/setup_en.md
@@ -62,9 +62,11 @@ accessibility:
items: 0 # Guarantees you will be able to acquire all items, but you may not be able to access all locations
locations: 50 # Guarantees you will be able to access all locations, and therefore all items
none: 0 # Guarantees only that the game is beatable. You may not be able to access all locations or acquire all items
-progression_balancing:
- on: 50 # A system to reduce BK, as in times during which you can't do anything by moving your items into an earlier access sphere to make it likely you have stuff to do
- off: 0 # Turn this off if you don't mind a longer multiworld, or can glitch/sequence break around missing items.
+progression_balancing: # A system to reduce BK, as in times during which you can't do anything, by moving your items into an earlier access sphere
+ 0: 0 # Choose a lower number if you don't mind a longer multiworld, or can glitch/sequence break around missing items.
+ 25: 0
+ 50: 50 # Make it likely you have stuff to do.
+ 99: 0 # Get important items early, and stay at the front of the progression.
Ocarina of Time:
logic_rules: # Set the logic used for the generator.
glitchless: 50
diff --git a/WebHostLib/static/assets/tutorial/Ocarina of Time/setup_es.md b/worlds/oot/docs/setup_es.md
similarity index 98%
rename from WebHostLib/static/assets/tutorial/Ocarina of Time/setup_es.md
rename to worlds/oot/docs/setup_es.md
index 193866fba7..4e40d03dae 100644
--- a/WebHostLib/static/assets/tutorial/Ocarina of Time/setup_es.md
+++ b/worlds/oot/docs/setup_es.md
@@ -52,9 +52,11 @@ accessibility:
items: 0 # Garantiza que puedes obtener todos los objetos pero no todas las localizaciones
locations: 50 # Garantiza que puedes obtener todas las localizaciones
none: 0 # Solo garantiza que el juego pueda completarse.
-progression_balancing:
- on: 50 # Un sistema para reducir tiempos de espera en una partida multiworld
- off: 0
+progression_balancing: # Un sistema para reducir tiempos de espera en una partida multiworld
+ 0: 0 # Con un número más bajo, es más probable esperar objetos de otros jugadores.
+ 25: 0
+ 50: 50
+ 99: 0 # Objetos importantes al principio del juego, para no esperar
Ocarina of Time:
logic_rules: # Logica usada por el randomizer.
glitchless: 50
diff --git a/worlds/raft/__init__.py b/worlds/raft/__init__.py
index 8a4a6443fd..5322a7e3bc 100644
--- a/worlds/raft/__init__.py
+++ b/worlds/raft/__init__.py
@@ -9,8 +9,20 @@ from .Regions import create_regions, getConnectionName
from .Rules import set_rules
from .Options import raft_options
-from BaseClasses import Region, RegionType, Entrance, Location, MultiWorld, Item
-from ..AutoWorld import World
+from BaseClasses import Region, RegionType, Entrance, Location, MultiWorld, Item, Tutorial
+from ..AutoWorld import World, WebWorld
+
+
+class RaftWeb(WebWorld):
+ tutorials = [Tutorial(
+ "Multiworld Setup Guide",
+ "A guide to setting up Raft integration for Archipelago multiworld games.",
+ "English",
+ "setup_en.md",
+ "setup/en",
+ ["SunnyBat", "Awareqwx"]
+ )]
+
class RaftWorld(World):
"""
@@ -19,6 +31,7 @@ class RaftWorld(World):
islands that you come across.
"""
game: str = "Raft"
+ web = RaftWeb()
item_name_to_id = items_lookup_name_to_id.copy()
lastItemId = max(filter(lambda val: val is not None, item_name_to_id.values()))
diff --git a/WebHostLib/static/assets/gameInfo/en_Raft.md b/worlds/raft/docs/en_Raft.md
similarity index 100%
rename from WebHostLib/static/assets/gameInfo/en_Raft.md
rename to worlds/raft/docs/en_Raft.md
diff --git a/WebHostLib/static/assets/tutorial/Raft/setup_en.md b/worlds/raft/docs/setup_en.md
similarity index 100%
rename from WebHostLib/static/assets/tutorial/Raft/setup_en.md
rename to worlds/raft/docs/setup_en.md
diff --git a/worlds/rogue-legacy/__init__.py b/worlds/rogue-legacy/__init__.py
index 323484941b..a02396d33a 100644
--- a/worlds/rogue-legacy/__init__.py
+++ b/worlds/rogue-legacy/__init__.py
@@ -1,6 +1,6 @@
import typing
-from BaseClasses import Item, MultiWorld
+from BaseClasses import Item, MultiWorld, Tutorial
from .Items import LegacyItem, ItemData, item_table, vendors_table, static_classes_table, progressive_classes_table, \
skill_unlocks_table, blueprints_table, runes_table, misc_items_table
from .Locations import LegacyLocation, location_table, base_location_table
@@ -8,7 +8,18 @@ from .Options import legacy_options
from .Regions import create_regions
from .Rules import set_rules
from .Names import ItemName
-from ..AutoWorld import World
+from ..AutoWorld import World, WebWorld
+
+
+class LegacyWeb(WebWorld):
+ tutorials = [Tutorial(
+ "Multiworld Setup Guide",
+ "A guide to setting up the Rogue Legacy Randomizer software on your computer. This guide covers single-player, multiworld, and related software.",
+ "English",
+ "rogue-legacy_en.md",
+ "rogue-legacy/en",
+ ["Phar"]
+ )]
class LegacyWorld(World):
@@ -22,6 +33,7 @@ class LegacyWorld(World):
topology_present = False
data_version = 3
required_client_version = (0, 2, 3)
+ web = LegacyWeb()
item_name_to_id = {name: data.code for name, data in item_table.items()}
location_name_to_id = location_table
@@ -149,6 +161,9 @@ class LegacyWorld(World):
self.world.itempool += itempool
+ def get_filler_item_name(self) -> str:
+ return self.world.random.choice(list(misc_items_table.keys()))
+
def create_regions(self):
create_regions(self.world, self.player)
diff --git a/WebHostLib/static/assets/gameInfo/en_Rogue Legacy.md b/worlds/rogue-legacy/docs/en_Rogue Legacy.md
similarity index 100%
rename from WebHostLib/static/assets/gameInfo/en_Rogue Legacy.md
rename to worlds/rogue-legacy/docs/en_Rogue Legacy.md
diff --git a/WebHostLib/static/assets/tutorial/Rogue Legacy/rogue-legacy_en.md b/worlds/rogue-legacy/docs/rogue-legacy_en.md
similarity index 100%
rename from WebHostLib/static/assets/tutorial/Rogue Legacy/rogue-legacy_en.md
rename to worlds/rogue-legacy/docs/rogue-legacy_en.md
diff --git a/worlds/ror2/__init__.py b/worlds/ror2/__init__.py
index 0c3f6e333a..27011c606f 100644
--- a/worlds/ror2/__init__.py
+++ b/worlds/ror2/__init__.py
@@ -3,13 +3,24 @@ from .Items import RiskOfRainItem, item_table, item_pool_weights
from .Locations import location_table, RiskOfRainLocation, base_location_table
from .Rules import set_rules
-from BaseClasses import Region, Entrance, Item, MultiWorld
+from BaseClasses import Region, Entrance, Item, MultiWorld, Tutorial
from .Options import ror2_options
-from ..AutoWorld import World
+from ..AutoWorld import World, WebWorld
client_version = 1
+class RiskOfWeb(WebWorld):
+ tutorials = [Tutorial(
+ "Multiworld Setup Guide",
+ "A guide to setting up the Risk of Rain 2 integration for Archipelago multiworld games.",
+ "English",
+ "setup_en.md",
+ "setup/en",
+ ["Ijwu"]
+ )]
+
+
class RiskOfRainWorld(World):
"""
Escape a chaotic alien planet by fighting through hordes of frenzied monsters – with your friends, or on your own.
@@ -25,6 +36,7 @@ class RiskOfRainWorld(World):
data_version = 3
forced_auto_forfeit = True
+ web = RiskOfWeb()
def generate_basic(self):
# shortcut for starting_inventory... The start_with_revive option lets you start with a Dio's Best Friend
diff --git a/WebHostLib/static/assets/gameInfo/en_Risk of Rain 2.md b/worlds/ror2/docs/en_Risk of Rain 2.md
similarity index 100%
rename from WebHostLib/static/assets/gameInfo/en_Risk of Rain 2.md
rename to worlds/ror2/docs/en_Risk of Rain 2.md
diff --git a/WebHostLib/static/assets/tutorial/Risk of Rain 2/setup_en.md b/worlds/ror2/docs/setup_en.md
similarity index 100%
rename from WebHostLib/static/assets/tutorial/Risk of Rain 2/setup_en.md
rename to worlds/ror2/docs/setup_en.md
diff --git a/worlds/sa2b/Items.py b/worlds/sa2b/Items.py
new file mode 100644
index 0000000000..0d1f60ce63
--- /dev/null
+++ b/worlds/sa2b/Items.py
@@ -0,0 +1,76 @@
+import typing
+
+from BaseClasses import Item
+from .Names import ItemName
+
+
+class ItemData(typing.NamedTuple):
+ code: typing.Optional[int]
+ progression: bool
+ quantity: int = 1
+ event: bool = False
+
+
+class SA2BItem(Item):
+ game: str = "Sonic Adventure 2: Battle"
+
+ def __init__(self, name, advancement: bool = False, code: int = None, player: int = None):
+ super(SA2BItem, self).__init__(name, advancement, code, player)
+
+ if self.name == ItemName.sonic_light_shoes or self.name == ItemName.shadow_air_shoes:
+ self.pedestal_credit_text = "and the Soap Shoes"
+
+
+# Separate tables for each type of item.
+emblems_table = {
+ ItemName.emblem: ItemData(0xFF0000, True),
+}
+
+upgrades_table = {
+ ItemName.sonic_gloves: ItemData(0xFF0001, False),
+ ItemName.sonic_light_shoes: ItemData(0xFF0002, True),
+ ItemName.sonic_ancient_light: ItemData(0xFF0003, False),
+ ItemName.sonic_bounce_bracelet: ItemData(0xFF0004, True),
+ ItemName.sonic_flame_ring: ItemData(0xFF0005, True),
+ ItemName.sonic_mystic_melody: ItemData(0xFF0006, True),
+
+ ItemName.tails_laser_blaster: ItemData(0xFF0007, False),
+ ItemName.tails_booster: ItemData(0xFF0008, True),
+ ItemName.tails_mystic_melody: ItemData(0xFF0009, True),
+ ItemName.tails_bazooka: ItemData(0xFF000A, True),
+
+ ItemName.knuckles_mystic_melody: ItemData(0xFF000B, True),
+ ItemName.knuckles_shovel_claws: ItemData(0xFF000C, True),
+ ItemName.knuckles_air_necklace: ItemData(0xFF000D, True),
+ ItemName.knuckles_hammer_gloves: ItemData(0xFF000E, True),
+ ItemName.knuckles_sunglasses: ItemData(0xFF000F, True),
+
+ ItemName.shadow_flame_ring: ItemData(0xFF0010, True),
+ ItemName.shadow_air_shoes: ItemData(0xFF0011, True),
+ ItemName.shadow_ancient_light: ItemData(0xFF0012, False),
+ ItemName.shadow_mystic_melody: ItemData(0xFF0013, True),
+
+ ItemName.eggman_laser_blaster: ItemData(0xFF0014, False),
+ ItemName.eggman_mystic_melody: ItemData(0xFF0015, True),
+ ItemName.eggman_jet_engine: ItemData(0xFF0016, True),
+ ItemName.eggman_large_cannon: ItemData(0xFF0017, True),
+ ItemName.eggman_protective_armor: ItemData(0xFF0018, False),
+
+ ItemName.rouge_mystic_melody: ItemData(0xFF0019, True),
+ ItemName.rouge_pick_nails: ItemData(0xFF001A, True),
+ ItemName.rouge_treasure_scope: ItemData(0xFF001B, True),
+ ItemName.rouge_iron_boots: ItemData(0xFF001C, True),
+}
+
+event_table = {
+ ItemName.maria: ItemData(0xFF001D, True),
+}
+
+# Complete item table.
+item_table = {
+ **emblems_table,
+ **upgrades_table,
+ **event_table,
+}
+
+lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in item_table.items() if data.code}
diff --git a/worlds/sa2b/Locations.py b/worlds/sa2b/Locations.py
new file mode 100644
index 0000000000..1496783730
--- /dev/null
+++ b/worlds/sa2b/Locations.py
@@ -0,0 +1,277 @@
+import typing
+
+from BaseClasses import Location
+from .Names import LocationName
+
+
+class SA2BLocation(Location):
+ game: str = "Sonic Adventure 2: Battle"
+
+
+first_mission_location_table = {
+ LocationName.city_escape_1: 0xFF0000,
+ LocationName.wild_canyon_1: 0xFF0001,
+ LocationName.prison_lane_1: 0xFF0002,
+ LocationName.metal_harbor_1: 0xFF0003,
+ LocationName.green_forest_1: 0xFF0004,
+ LocationName.pumpkin_hill_1: 0xFF0005,
+ LocationName.mission_street_1: 0xFF0006,
+ LocationName.aquatic_mine_1: 0xFF0007,
+ LocationName.route_101_1: 0xFF0008,
+ LocationName.hidden_base_1: 0xFF0009,
+ LocationName.pyramid_cave_1: 0xFF000A,
+ LocationName.death_chamber_1: 0xFF000B,
+ LocationName.eternal_engine_1: 0xFF000C,
+ LocationName.meteor_herd_1: 0xFF000D,
+ LocationName.crazy_gadget_1: 0xFF000E,
+ LocationName.final_rush_1: 0xFF000F,
+
+ LocationName.iron_gate_1: 0xFF0010,
+ LocationName.dry_lagoon_1: 0xFF0011,
+ LocationName.sand_ocean_1: 0xFF0012,
+ LocationName.radical_highway_1: 0xFF0013,
+ LocationName.egg_quarters_1: 0xFF0014,
+ LocationName.lost_colony_1: 0xFF0015,
+ LocationName.weapons_bed_1: 0xFF0016,
+ LocationName.security_hall_1: 0xFF0017,
+ LocationName.white_jungle_1: 0xFF0018,
+ LocationName.route_280_1: 0xFF0019,
+ LocationName.sky_rail_1: 0xFF001A,
+ LocationName.mad_space_1: 0xFF001B,
+ LocationName.cosmic_wall_1: 0xFF001C,
+ LocationName.final_chase_1: 0xFF001D,
+
+ LocationName.cannon_core_1: 0xFF001E,
+}
+
+second_mission_location_table = {
+ LocationName.city_escape_2: 0xFF0020,
+ LocationName.wild_canyon_2: 0xFF0021,
+ LocationName.prison_lane_2: 0xFF0022,
+ LocationName.metal_harbor_2: 0xFF0023,
+ LocationName.green_forest_2: 0xFF0024,
+ LocationName.pumpkin_hill_2: 0xFF0025,
+ LocationName.mission_street_2: 0xFF0026,
+ LocationName.aquatic_mine_2: 0xFF0027,
+ LocationName.route_101_2: 0xFF0028,
+ LocationName.hidden_base_2: 0xFF0029,
+ LocationName.pyramid_cave_2: 0xFF002A,
+ LocationName.death_chamber_2: 0xFF002B,
+ LocationName.eternal_engine_2: 0xFF002C,
+ LocationName.meteor_herd_2: 0xFF002D,
+ LocationName.crazy_gadget_2: 0xFF002E,
+ LocationName.final_rush_2: 0xFF002F,
+
+ LocationName.iron_gate_2: 0xFF0030,
+ LocationName.dry_lagoon_2: 0xFF0031,
+ LocationName.sand_ocean_2: 0xFF0032,
+ LocationName.radical_highway_2: 0xFF0033,
+ LocationName.egg_quarters_2: 0xFF0034,
+ LocationName.lost_colony_2: 0xFF0035,
+ LocationName.weapons_bed_2: 0xFF0036,
+ LocationName.security_hall_2: 0xFF0037,
+ LocationName.white_jungle_2: 0xFF0038,
+ LocationName.route_280_2: 0xFF0039,
+ LocationName.sky_rail_2: 0xFF003A,
+ LocationName.mad_space_2: 0xFF003B,
+ LocationName.cosmic_wall_2: 0xFF003C,
+ LocationName.final_chase_2: 0xFF003D,
+
+ LocationName.cannon_core_2: 0xFF003E,
+}
+
+third_mission_location_table = {
+ LocationName.city_escape_3: 0xFF0040,
+ LocationName.wild_canyon_3: 0xFF0041,
+ LocationName.prison_lane_3: 0xFF0042,
+ LocationName.metal_harbor_3: 0xFF0043,
+ LocationName.green_forest_3: 0xFF0044,
+ LocationName.pumpkin_hill_3: 0xFF0045,
+ LocationName.mission_street_3: 0xFF0046,
+ LocationName.aquatic_mine_3: 0xFF0047,
+ LocationName.route_101_3: 0xFF0048,
+ LocationName.hidden_base_3: 0xFF0049,
+ LocationName.pyramid_cave_3: 0xFF004A,
+ LocationName.death_chamber_3: 0xFF004B,
+ LocationName.eternal_engine_3: 0xFF004C,
+ LocationName.meteor_herd_3: 0xFF004D,
+ LocationName.crazy_gadget_3: 0xFF004E,
+ LocationName.final_rush_3: 0xFF004F,
+
+ LocationName.iron_gate_3: 0xFF0050,
+ LocationName.dry_lagoon_3: 0xFF0051,
+ LocationName.sand_ocean_3: 0xFF0052,
+ LocationName.radical_highway_3: 0xFF0053,
+ LocationName.egg_quarters_3: 0xFF0054,
+ LocationName.lost_colony_3: 0xFF0055,
+ LocationName.weapons_bed_3: 0xFF0056,
+ LocationName.security_hall_3: 0xFF0057,
+ LocationName.white_jungle_3: 0xFF0058,
+ LocationName.route_280_3: 0xFF0059,
+ LocationName.sky_rail_3: 0xFF005A,
+ LocationName.mad_space_3: 0xFF005B,
+ LocationName.cosmic_wall_3: 0xFF005C,
+ LocationName.final_chase_3: 0xFF005D,
+
+ LocationName.cannon_core_3: 0xFF005E,
+}
+
+fourth_mission_location_table = {
+ LocationName.city_escape_4: 0xFF0060,
+ LocationName.wild_canyon_4: 0xFF0061,
+ LocationName.prison_lane_4: 0xFF0062,
+ LocationName.metal_harbor_4: 0xFF0063,
+ LocationName.green_forest_4: 0xFF0064,
+ LocationName.pumpkin_hill_4: 0xFF0065,
+ LocationName.mission_street_4: 0xFF0066,
+ LocationName.aquatic_mine_4: 0xFF0067,
+ LocationName.route_101_4: 0xFF0068,
+ LocationName.hidden_base_4: 0xFF0069,
+ LocationName.pyramid_cave_4: 0xFF006A,
+ LocationName.death_chamber_4: 0xFF006B,
+ LocationName.eternal_engine_4: 0xFF006C,
+ LocationName.meteor_herd_4: 0xFF006D,
+ LocationName.crazy_gadget_4: 0xFF006E,
+ LocationName.final_rush_4: 0xFF006F,
+
+ LocationName.iron_gate_4: 0xFF0070,
+ LocationName.dry_lagoon_4: 0xFF0071,
+ LocationName.sand_ocean_4: 0xFF0072,
+ LocationName.radical_highway_4: 0xFF0073,
+ LocationName.egg_quarters_4: 0xFF0074,
+ LocationName.lost_colony_4: 0xFF0075,
+ LocationName.weapons_bed_4: 0xFF0076,
+ LocationName.security_hall_4: 0xFF0077,
+ LocationName.white_jungle_4: 0xFF0078,
+ LocationName.route_280_4: 0xFF0079,
+ LocationName.sky_rail_4: 0xFF007A,
+ LocationName.mad_space_4: 0xFF007B,
+ LocationName.cosmic_wall_4: 0xFF007C,
+ LocationName.final_chase_4: 0xFF007D,
+
+ LocationName.cannon_core_4: 0xFF007E,
+}
+
+fifth_mission_location_table = {
+ LocationName.city_escape_5: 0xFF0080,
+ LocationName.wild_canyon_5: 0xFF0081,
+ LocationName.prison_lane_5: 0xFF0082,
+ LocationName.metal_harbor_5: 0xFF0083,
+ LocationName.green_forest_5: 0xFF0084,
+ LocationName.pumpkin_hill_5: 0xFF0085,
+ LocationName.mission_street_5: 0xFF0086,
+ LocationName.aquatic_mine_5: 0xFF0087,
+ LocationName.route_101_5: 0xFF0088,
+ LocationName.hidden_base_5: 0xFF0089,
+ LocationName.pyramid_cave_5: 0xFF008A,
+ LocationName.death_chamber_5: 0xFF008B,
+ LocationName.eternal_engine_5: 0xFF008C,
+ LocationName.meteor_herd_5: 0xFF008D,
+ LocationName.crazy_gadget_5: 0xFF008E,
+ LocationName.final_rush_5: 0xFF008F,
+
+ LocationName.iron_gate_5: 0xFF0090,
+ LocationName.dry_lagoon_5: 0xFF0091,
+ LocationName.sand_ocean_5: 0xFF0092,
+ LocationName.radical_highway_5: 0xFF0093,
+ LocationName.egg_quarters_5: 0xFF0094,
+ LocationName.lost_colony_5: 0xFF0095,
+ LocationName.weapons_bed_5: 0xFF0096,
+ LocationName.security_hall_5: 0xFF0097,
+ LocationName.white_jungle_5: 0xFF0098,
+ LocationName.route_280_5: 0xFF0099,
+ LocationName.sky_rail_5: 0xFF009A,
+ LocationName.mad_space_5: 0xFF009B,
+ LocationName.cosmic_wall_5: 0xFF009C,
+ LocationName.final_chase_5: 0xFF009D,
+
+ LocationName.cannon_core_5: 0xFF009E,
+}
+
+upgrade_location_table = {
+ LocationName.city_escape_upgrade: 0xFF00A0,
+ LocationName.wild_canyon_upgrade: 0xFF00A1,
+ LocationName.prison_lane_upgrade: 0xFF00A2,
+ LocationName.metal_harbor_upgrade: 0xFF00A3,
+ LocationName.green_forest_upgrade: 0xFF00A4,
+ LocationName.pumpkin_hill_upgrade: 0xFF00A5,
+ LocationName.mission_street_upgrade: 0xFF00A6,
+ LocationName.aquatic_mine_upgrade: 0xFF00A7,
+ LocationName.hidden_base_upgrade: 0xFF00A9,
+ LocationName.pyramid_cave_upgrade: 0xFF00AA,
+ LocationName.death_chamber_upgrade: 0xFF00AB,
+ LocationName.eternal_engine_upgrade: 0xFF00AC,
+ LocationName.meteor_herd_upgrade: 0xFF00AD,
+ LocationName.crazy_gadget_upgrade: 0xFF00AE,
+ LocationName.final_rush_upgrade: 0xFF00AF,
+
+ LocationName.iron_gate_upgrade: 0xFF00B0,
+ LocationName.dry_lagoon_upgrade: 0xFF00B1,
+ LocationName.sand_ocean_upgrade: 0xFF00B2,
+ LocationName.radical_highway_upgrade: 0xFF00B3,
+ LocationName.egg_quarters_upgrade: 0xFF00B4,
+ LocationName.lost_colony_upgrade: 0xFF00B5,
+ LocationName.weapons_bed_upgrade: 0xFF00B6,
+ LocationName.security_hall_upgrade: 0xFF00B7,
+ LocationName.white_jungle_upgrade: 0xFF00B8,
+ LocationName.sky_rail_upgrade: 0xFF00BA,
+ LocationName.mad_space_upgrade: 0xFF00BB,
+ LocationName.cosmic_wall_upgrade: 0xFF00BC,
+ LocationName.final_chase_upgrade: 0xFF00BD,
+}
+
+chao_garden_location_table = {
+ LocationName.chao_beginner_race: 0xFF00C0,
+ LocationName.chao_jewel_race: 0xFF00C1,
+ LocationName.chao_challenge_race: 0xFF00C2,
+ LocationName.chao_hero_race: 0xFF00C3,
+ LocationName.chao_dark_race: 0xFF00C4,
+
+ LocationName.chao_beginner_karate: 0xFF00C5,
+ LocationName.chao_standard_karate: 0xFF00C6,
+ LocationName.chao_expert_karate: 0xFF00C7,
+ LocationName.chao_super_karate: 0xFF00C8,
+}
+
+other_location_table = {
+ # LocationName.green_hill: 0xFF001F,
+ LocationName.biolizard: 0xFF003F,
+}
+
+all_locations = {
+ **first_mission_location_table,
+ **second_mission_location_table,
+ **third_mission_location_table,
+ **fourth_mission_location_table,
+ **fifth_mission_location_table,
+ **upgrade_location_table,
+ **chao_garden_location_table,
+ **other_location_table,
+}
+
+location_table = {}
+
+
+def setup_locations(world, player: int):
+ location_table = {**first_mission_location_table}
+
+ if world.include_missions[player].value >= 2:
+ location_table.update({**second_mission_location_table})
+
+ if world.include_missions[player].value >= 3:
+ location_table.update({**third_mission_location_table})
+
+ if world.include_missions[player].value >= 4:
+ location_table.update({**fourth_mission_location_table})
+
+ if world.include_missions[player].value >= 5:
+ location_table.update({**fifth_mission_location_table})
+
+ location_table.update({**upgrade_location_table})
+ # location_table.update(**chao_garden_location_table})
+ location_table.update({**other_location_table})
+
+ return location_table
+
+
+lookup_id_to_name: typing.Dict[int, str] = {id: name for name, _ in all_locations.items()}
diff --git a/worlds/sa2b/Names/ItemName.py b/worlds/sa2b/Names/ItemName.py
new file mode 100644
index 0000000000..db6cc30425
--- /dev/null
+++ b/worlds/sa2b/Names/ItemName.py
@@ -0,0 +1,39 @@
+# Emblem Definition
+emblem = "Emblem"
+
+# Upgrade Definitions
+sonic_gloves = "Sonic - Magic Glove"
+sonic_light_shoes = "Sonic - Light Shoes"
+sonic_ancient_light = "Sonic - Ancient Light"
+sonic_bounce_bracelet = "Sonic - Bounce Bracelet"
+sonic_flame_ring = "Sonic - Flame Ring"
+sonic_mystic_melody = "Sonic - Mystic Melody"
+
+tails_laser_blaster = "Tails - Laser Blaster"
+tails_booster = "Tails - Booster"
+tails_mystic_melody = "Tails - Mystic Melody"
+tails_bazooka = "Tails - Bazooka"
+
+knuckles_mystic_melody = "Knuckles - Mystic Melody"
+knuckles_shovel_claws = "Knuckles - Shovel Claws"
+knuckles_air_necklace = "Knuckles - Air Necklace"
+knuckles_hammer_gloves = "Knuckles - Hammer Gloves"
+knuckles_sunglasses = "Knuckles - Sunglasses"
+
+shadow_flame_ring = "Shadow - Flame Ring"
+shadow_air_shoes = "Shadow - Air Shoes"
+shadow_ancient_light = "Shadow - Ancient Light"
+shadow_mystic_melody = "Shadow - Mystic Melody"
+
+eggman_laser_blaster = "Eggman - Laser Blaster"
+eggman_mystic_melody = "Eggman - Mystic Melody"
+eggman_jet_engine = "Eggman - Jet Engine"
+eggman_large_cannon = "Eggman - Large Cannon"
+eggman_protective_armor = "Eggman - Protective Armor"
+
+rouge_mystic_melody = "Rouge - Mystic Melody"
+rouge_pick_nails = "Rouge - Pick Nails"
+rouge_treasure_scope = "Rouge - Treasure Scope"
+rouge_iron_boots = "Rouge - Iron Boots"
+
+maria = "What Maria Wanted"
diff --git a/worlds/sa2b/Names/LocationName.py b/worlds/sa2b/Names/LocationName.py
new file mode 100644
index 0000000000..cf9721d3cf
--- /dev/null
+++ b/worlds/sa2b/Names/LocationName.py
@@ -0,0 +1,264 @@
+# Sonic Mission Definitions
+city_escape_1 = "City Escape - 1"
+city_escape_2 = "City Escape - 2"
+city_escape_3 = "City Escape - 3"
+city_escape_4 = "City Escape - 4"
+city_escape_5 = "City Escape - 5"
+city_escape_upgrade = "City Escape - Upgrade"
+metal_harbor_1 = "Metal Harbor - 1"
+metal_harbor_2 = "Metal Harbor - 2"
+metal_harbor_3 = "Metal Harbor - 3"
+metal_harbor_4 = "Metal Harbor - 4"
+metal_harbor_5 = "Metal Harbor - 5"
+metal_harbor_upgrade = "Metal Harbor - Upgrade"
+green_forest_1 = "Green Forest - 1"
+green_forest_2 = "Green Forest - 2"
+green_forest_3 = "Green Forest - 3"
+green_forest_4 = "Green Forest - 4"
+green_forest_5 = "Green Forest - 5"
+green_forest_upgrade = "Green Forest - Upgrade"
+pyramid_cave_1 = "Pyramid Cave - 1"
+pyramid_cave_2 = "Pyramid Cave - 2"
+pyramid_cave_3 = "Pyramid Cave - 3"
+pyramid_cave_4 = "Pyramid Cave - 4"
+pyramid_cave_5 = "Pyramid Cave - 5"
+pyramid_cave_upgrade = "Pyramid Cave - Upgrade"
+crazy_gadget_1 = "Crazy Gadget - 1"
+crazy_gadget_2 = "Crazy Gadget - 2"
+crazy_gadget_3 = "Crazy Gadget - 3"
+crazy_gadget_4 = "Crazy Gadget - 4"
+crazy_gadget_5 = "Crazy Gadget - 5"
+crazy_gadget_upgrade = "Crazy Gadget - Upgrade"
+final_rush_1 = "Final Rush - 1"
+final_rush_2 = "Final Rush - 2"
+final_rush_3 = "Final Rush - 3"
+final_rush_4 = "Final Rush - 4"
+final_rush_5 = "Final Rush - 5"
+final_rush_upgrade = "Final Rush - Upgrade"
+
+# Tails Mission Definitions
+prison_lane_1 = "Prison Lane - 1"
+prison_lane_2 = "Prison Lane - 2"
+prison_lane_3 = "Prison Lane - 3"
+prison_lane_4 = "Prison Lane - 4"
+prison_lane_5 = "Prison Lane - 5"
+prison_lane_upgrade = "Prison Lane - Upgrade"
+mission_street_1 = "Mission Street - 1"
+mission_street_2 = "Mission Street - 2"
+mission_street_3 = "Mission Street - 3"
+mission_street_4 = "Mission Street - 4"
+mission_street_5 = "Mission Street - 5"
+mission_street_upgrade = "Mission Street - Upgrade"
+route_101_1 = "Route 101 - 1"
+route_101_2 = "Route 101 - 2"
+route_101_3 = "Route 101 - 3"
+route_101_4 = "Route 101 - 4"
+route_101_5 = "Route 101 - 5"
+hidden_base_1 = "Hidden Base - 1"
+hidden_base_2 = "Hidden Base - 2"
+hidden_base_3 = "Hidden Base - 3"
+hidden_base_4 = "Hidden Base - 4"
+hidden_base_5 = "Hidden Base - 5"
+hidden_base_upgrade = "Hidden Base - Upgrade"
+eternal_engine_1 = "Eternal Engine - 1"
+eternal_engine_2 = "Eternal Engine - 2"
+eternal_engine_3 = "Eternal Engine - 3"
+eternal_engine_4 = "Eternal Engine - 4"
+eternal_engine_5 = "Eternal Engine - 5"
+eternal_engine_upgrade = "Eternal Engine - Upgrade"
+
+# Knuckles Mission Definitions
+wild_canyon_1 = "Wild Canyon - 1"
+wild_canyon_2 = "Wild Canyon - 2"
+wild_canyon_3 = "Wild Canyon - 3"
+wild_canyon_4 = "Wild Canyon - 4"
+wild_canyon_5 = "Wild Canyon - 5"
+wild_canyon_upgrade = "Wild Canyon - Upgrade"
+pumpkin_hill_1 = "Pumpkin Hill - 1"
+pumpkin_hill_2 = "Pumpkin Hill - 2"
+pumpkin_hill_3 = "Pumpkin Hill - 3"
+pumpkin_hill_4 = "Pumpkin Hill - 4"
+pumpkin_hill_5 = "Pumpkin Hill - 5"
+pumpkin_hill_upgrade = "Pumpkin Hill - Upgrade"
+aquatic_mine_1 = "Aquatic Mine - 1"
+aquatic_mine_2 = "Aquatic Mine - 2"
+aquatic_mine_3 = "Aquatic Mine - 3"
+aquatic_mine_4 = "Aquatic Mine - 4"
+aquatic_mine_5 = "Aquatic Mine - 5"
+aquatic_mine_upgrade = "Aquatic Mine - Upgrade"
+death_chamber_1 = "Death Chamber - 1"
+death_chamber_2 = "Death Chamber - 2"
+death_chamber_3 = "Death Chamber - 3"
+death_chamber_4 = "Death Chamber - 4"
+death_chamber_5 = "Death Chamber - 5"
+death_chamber_upgrade = "Death Chamber - Upgrade"
+meteor_herd_1 = "Meteor Herd - 1"
+meteor_herd_2 = "Meteor Herd - 2"
+meteor_herd_3 = "Meteor Herd - 3"
+meteor_herd_4 = "Meteor Herd - 4"
+meteor_herd_5 = "Meteor Herd - 5"
+meteor_herd_upgrade = "Meteor Herd - Upgrade"
+
+
+# Shadow Mission Definitions
+radical_highway_1 = "Radical Highway - 1"
+radical_highway_2 = "Radical Highway - 2"
+radical_highway_3 = "Radical Highway - 3"
+radical_highway_4 = "Radical Highway - 4"
+radical_highway_5 = "Radical Highway - 5"
+radical_highway_upgrade = "Radical Highway - Upgrade"
+white_jungle_1 = "White Jungle - 1"
+white_jungle_2 = "White Jungle - 2"
+white_jungle_3 = "White Jungle - 3"
+white_jungle_4 = "White Jungle - 4"
+white_jungle_5 = "White Jungle - 5"
+white_jungle_upgrade = "White Jungle - Upgrade"
+sky_rail_1 = "Sky Rail - 1"
+sky_rail_2 = "Sky Rail - 2"
+sky_rail_3 = "Sky Rail - 3"
+sky_rail_4 = "Sky Rail - 4"
+sky_rail_5 = "Sky Rail - 5"
+sky_rail_upgrade = "Sky Rail - Upgrade"
+final_chase_1 = "Final Chase - 1"
+final_chase_2 = "Final Chase - 2"
+final_chase_3 = "Final Chase - 3"
+final_chase_4 = "Final Chase - 4"
+final_chase_5 = "Final Chase - 5"
+final_chase_upgrade = "Final Chase - Upgrade"
+
+# Eggman Mission Definitions
+iron_gate_1 = "Iron Gate - 1"
+iron_gate_2 = "Iron Gate - 2"
+iron_gate_3 = "Iron Gate - 3"
+iron_gate_4 = "Iron Gate - 4"
+iron_gate_5 = "Iron Gate - 5"
+iron_gate_upgrade = "Iron Gate - Upgrade"
+sand_ocean_1 = "Sand Ocean - 1"
+sand_ocean_2 = "Sand Ocean - 2"
+sand_ocean_3 = "Sand Ocean - 3"
+sand_ocean_4 = "Sand Ocean - 4"
+sand_ocean_5 = "Sand Ocean - 5"
+sand_ocean_upgrade = "Sand Ocean - Upgrade"
+lost_colony_1 = "Lost Colony - 1"
+lost_colony_2 = "Lost Colony - 2"
+lost_colony_3 = "Lost Colony - 3"
+lost_colony_4 = "Lost Colony - 4"
+lost_colony_5 = "Lost Colony - 5"
+lost_colony_upgrade = "Lost Colony - Upgrade"
+weapons_bed_1 = "Weapons Bed - 1"
+weapons_bed_2 = "Weapons Bed - 2"
+weapons_bed_3 = "Weapons Bed - 3"
+weapons_bed_4 = "Weapons Bed - 4"
+weapons_bed_5 = "Weapons Bed - 5"
+weapons_bed_upgrade = "Weapons Bed - Upgrade"
+cosmic_wall_1 = "Cosmic Wall - 1"
+cosmic_wall_2 = "Cosmic Wall - 2"
+cosmic_wall_3 = "Cosmic Wall - 3"
+cosmic_wall_4 = "Cosmic Wall - 4"
+cosmic_wall_5 = "Cosmic Wall - 5"
+cosmic_wall_upgrade = "Cosmic Wall - Upgrade"
+
+# Rouge Mission Definitions
+dry_lagoon_1 = "Dry Lagoon - 1"
+dry_lagoon_2 = "Dry Lagoon - 2"
+dry_lagoon_3 = "Dry Lagoon - 3"
+dry_lagoon_4 = "Dry Lagoon - 4"
+dry_lagoon_5 = "Dry Lagoon - 5"
+dry_lagoon_upgrade = "Dry Lagoon - Upgrade"
+egg_quarters_1 = "Egg Quarters - 1"
+egg_quarters_2 = "Egg Quarters - 2"
+egg_quarters_3 = "Egg Quarters - 3"
+egg_quarters_4 = "Egg Quarters - 4"
+egg_quarters_5 = "Egg Quarters - 5"
+egg_quarters_upgrade = "Egg Quarters - Upgrade"
+security_hall_1 = "Security Hall - 1"
+security_hall_2 = "Security Hall - 2"
+security_hall_3 = "Security Hall - 3"
+security_hall_4 = "Security Hall - 4"
+security_hall_5 = "Security Hall - 5"
+security_hall_upgrade = "Security Hall - Upgrade"
+route_280_1 = "Route 280 - 1"
+route_280_2 = "Route 280 - 2"
+route_280_3 = "Route 280 - 3"
+route_280_4 = "Route 280 - 4"
+route_280_5 = "Route 280 - 5"
+mad_space_1 = "Mad Space - 1"
+mad_space_2 = "Mad Space - 2"
+mad_space_3 = "Mad Space - 3"
+mad_space_4 = "Mad Space - 4"
+mad_space_5 = "Mad Space - 5"
+mad_space_upgrade = "Mad Space - Upgrade"
+
+# Final Mission Definitions
+cannon_core_1 = "Cannon Core - 1"
+cannon_core_2 = "Cannon Core - 2"
+cannon_core_3 = "Cannon Core - 3"
+cannon_core_4 = "Cannon Core - 4"
+cannon_core_5 = "Cannon Core - 5"
+
+# Chao Garden Definitions
+chao_beginner_race = "Chao Garden - Beginner Race"
+chao_jewel_race = "Chao Garden - Jewel Race"
+chao_challenge_race = "Chao Garden - Challenge Race"
+chao_hero_race = "Chao Garden - Hero Race"
+chao_dark_race = "Chao Garden - Dark Race"
+chao_beginner_karate = "Chao Garden - Beginner Karate"
+chao_standard_karate = "Chao Garden - Standard Karate"
+chao_expert_karate = "Chao Garden - Expert Karate"
+chao_super_karate = "Chao Garden - Super Karate"
+
+# Other Definitions
+green_hill = "Green Hill"
+biolizard = "Biolizard"
+
+
+# Region Definitions
+menu_region = "Menu"
+gate_0_region = "Gate 0"
+gate_1_region = "Gate 1"
+gate_2_region = "Gate 2"
+gate_3_region = "Gate 3"
+gate_4_region = "Gate 4"
+gate_5_region = "Gate 5"
+
+city_escape_region = "City Escape"
+metal_harbor_region = "Metal Harbor"
+green_forest_region = "Green Forest"
+pyramid_cave_region = "Pyramid Cave"
+crazy_gadget_region = "Crazy Gadget"
+final_rush_region = "Final Rush"
+
+prison_lane_region = "Prison Lane"
+mission_street_region = "Mission Street"
+route_101_region = "Route 101"
+hidden_base_region = "Hidden Base"
+eternal_engine_region = "Eternal Engine"
+
+wild_canyon_region = "Wild Canyon"
+pumpkin_hill_region = "Pumpkin Hill"
+aquatic_mine_region = "Aquatic Mine"
+death_chamber_region = "Death Chamber"
+meteor_herd_region = "Meteor Herd"
+
+radical_highway_region = "Radical Highway"
+white_jungle_region = "White Jungle"
+sky_rail_region = "Sky Rail"
+final_chase_region = "Final Chase"
+
+iron_gate_region = "Iron Gate"
+sand_ocean_region = "Sand Ocean"
+lost_colony_region = "Lost Colony"
+weapons_bed_region = "Weapons Bed"
+cosmic_wall_region = "Cosmic Wall"
+
+dry_lagoon_region = "Dry Lagoon"
+egg_quarters_region = "Egg Quarters"
+security_hall_region = "Security Hall"
+route_280_region = "Route 280"
+mad_space_region = "Mad Space"
+
+cannon_core_region = "Cannon Core"
+
+biolizard_region = "Biolizard"
+
+chao_garden_region = "Chao Garden"
diff --git a/worlds/sa2b/Options.py b/worlds/sa2b/Options.py
new file mode 100644
index 0000000000..b6b9f170df
--- /dev/null
+++ b/worlds/sa2b/Options.py
@@ -0,0 +1,77 @@
+import typing
+
+from Options import Choice, Range, Option, Toggle, DeathLink, DefaultOnToggle, OptionList
+
+
+class IncludeMissions(Range):
+ """
+ Allows logic to place items in a range of Missions for each level
+ Each mission setting includes lower settings
+ 1: Base Story Missions
+ 2: 100 Ring Missions
+ 3: Lost Chao Missions
+ 4: Timer Missions
+ 5: Hard Mode Missions
+ """
+ display_name = "Include Missions"
+ range_start = 1
+ range_end = 5
+ default = 2
+
+
+class EmblemPercentageForCannonsCore(Range):
+ """
+ Allows logic to gate the final mission behind a number of Emblems
+ """
+ display_name = "Emblem Percentage for Cannons Core"
+ range_start = 0
+ range_end = 75
+ default = 50
+
+
+class NumberOfLevelGates(Range):
+ """
+ Allows logic to gate some levels behind emblem requirements
+ """
+ display_name = "Number of Level Gates"
+ range_start = 0
+ range_end = 5
+ default = 3
+
+
+class LevelGateDistribution(Choice):
+ """
+ Determines how levels are distributed between level gate regions
+ Early: Earlier regions will have more levels than later regions
+ Even: Levels will be evenly distributed between all regions
+ Late: Later regions will have more levels than earlier regions
+ """
+ display_name = "Level Gate Distribution"
+ option_early = 0
+ option_even = 1
+ option_late = 2
+ default = 1
+
+
+class MusicShuffle(Choice):
+ """
+ What type of Music Shuffle is used
+ Off: No music is shuffled.
+ Levels: Level music is shuffled.
+ Full: Level, Menu, and Additional music is shuffled.
+ """
+ display_name = "Music Shuffle Type"
+ option_none = 0
+ option_levels = 1
+ option_full = 2
+ default = 0
+
+
+sa2b_options: typing.Dict[str, type(Option)] = {
+ "death_link": DeathLink,
+ "music_shuffle": MusicShuffle,
+ "include_missions": IncludeMissions,
+ "emblem_percentage_for_cannons_core": EmblemPercentageForCannonsCore,
+ "number_of_level_gates": NumberOfLevelGates,
+ "level_gate_distribution": LevelGateDistribution,
+}
diff --git a/worlds/sa2b/Regions.py b/worlds/sa2b/Regions.py
new file mode 100644
index 0000000000..aa13fd8a69
--- /dev/null
+++ b/worlds/sa2b/Regions.py
@@ -0,0 +1,579 @@
+import typing
+
+from BaseClasses import MultiWorld, Region, Entrance
+from .Items import SA2BItem
+from .Locations import SA2BLocation
+from .Names import LocationName, ItemName
+
+
+class LevelGate:
+ gate_levels: typing.List[int]
+ gate_emblem_count: int
+
+ def __init__(self, emblems):
+ self.gate_emblem_count = emblems
+ self.gate_levels = list()
+
+
+shuffleable_regions = [
+ LocationName.city_escape_region,
+ LocationName.wild_canyon_region,
+ LocationName.prison_lane_region,
+ LocationName.metal_harbor_region,
+ LocationName.green_forest_region,
+ LocationName.pumpkin_hill_region,
+ LocationName.mission_street_region,
+ LocationName.aquatic_mine_region,
+ LocationName.route_101_region,
+ LocationName.hidden_base_region,
+ LocationName.pyramid_cave_region,
+ LocationName.death_chamber_region,
+ LocationName.eternal_engine_region,
+ LocationName.meteor_herd_region,
+ LocationName.crazy_gadget_region,
+ LocationName.final_rush_region,
+ LocationName.iron_gate_region,
+ LocationName.dry_lagoon_region,
+ LocationName.sand_ocean_region,
+ LocationName.radical_highway_region,
+ LocationName.egg_quarters_region,
+ LocationName.lost_colony_region,
+ LocationName.weapons_bed_region,
+ LocationName.security_hall_region,
+ LocationName.white_jungle_region,
+ LocationName.route_280_region,
+ LocationName.sky_rail_region,
+ LocationName.mad_space_region,
+ LocationName.cosmic_wall_region,
+ LocationName.final_chase_region,
+]
+
+gate_0_blacklist_regions = [
+ LocationName.hidden_base_region,
+ LocationName.eternal_engine_region,
+ LocationName.crazy_gadget_region,
+ LocationName.security_hall_region,
+ LocationName.cosmic_wall_region,
+]
+
+gate_0_whitelist_regions = [
+ LocationName.city_escape_region,
+ LocationName.wild_canyon_region,
+ LocationName.prison_lane_region,
+ LocationName.metal_harbor_region,
+ LocationName.green_forest_region,
+ LocationName.pumpkin_hill_region,
+ LocationName.mission_street_region,
+ LocationName.aquatic_mine_region,
+ LocationName.route_101_region,
+ LocationName.pyramid_cave_region,
+ LocationName.death_chamber_region,
+ LocationName.meteor_herd_region,
+ LocationName.final_rush_region,
+ LocationName.iron_gate_region,
+ LocationName.dry_lagoon_region,
+ LocationName.sand_ocean_region,
+ LocationName.radical_highway_region,
+ LocationName.egg_quarters_region,
+ LocationName.lost_colony_region,
+ LocationName.weapons_bed_region,
+ LocationName.white_jungle_region,
+ LocationName.route_280_region,
+ LocationName.sky_rail_region,
+ LocationName.mad_space_region,
+ LocationName.final_chase_region,
+]
+
+
+def create_regions(world, player: int, active_locations):
+ menu_region = create_region(world, player, active_locations, 'Menu', None, None)
+ gate_0_region = create_region(world, player, active_locations, 'Gate 0', None, None)
+ gate_1_region = create_region(world, player, active_locations, 'Gate 1', None, None)
+ gate_2_region = create_region(world, player, active_locations, 'Gate 2', None, None)
+ gate_3_region = create_region(world, player, active_locations, 'Gate 3', None, None)
+ gate_4_region = create_region(world, player, active_locations, 'Gate 4', None, None)
+ gate_5_region = create_region(world, player, active_locations, 'Gate 5', None, None)
+
+ city_escape_region_locations = [
+ LocationName.city_escape_1,
+ LocationName.city_escape_2,
+ LocationName.city_escape_3,
+ LocationName.city_escape_4,
+ LocationName.city_escape_5,
+ LocationName.city_escape_upgrade,
+ ]
+ city_escape_region = create_region(world, player, active_locations, LocationName.city_escape_region,
+ city_escape_region_locations, None)
+
+ metal_harbor_region_locations = [
+ LocationName.metal_harbor_1,
+ LocationName.metal_harbor_2,
+ LocationName.metal_harbor_3,
+ LocationName.metal_harbor_4,
+ LocationName.metal_harbor_5,
+ LocationName.metal_harbor_upgrade,
+ ]
+ metal_harbor_region = create_region(world, player, active_locations, LocationName.metal_harbor_region,
+ metal_harbor_region_locations, None)
+
+ green_forest_region_locations = [
+ LocationName.green_forest_1,
+ LocationName.green_forest_2,
+ LocationName.green_forest_3,
+ LocationName.green_forest_4,
+ LocationName.green_forest_5,
+ LocationName.green_forest_upgrade,
+ ]
+ green_forest_region = create_region(world, player, active_locations, LocationName.green_forest_region,
+ green_forest_region_locations, None)
+
+ pyramid_cave_region_locations = [
+ LocationName.pyramid_cave_1,
+ LocationName.pyramid_cave_2,
+ LocationName.pyramid_cave_3,
+ LocationName.pyramid_cave_4,
+ LocationName.pyramid_cave_5,
+ LocationName.pyramid_cave_upgrade,
+ ]
+ pyramid_cave_region = create_region(world, player, active_locations, LocationName.pyramid_cave_region,
+ pyramid_cave_region_locations, None)
+
+ crazy_gadget_region_locations = [
+ LocationName.crazy_gadget_1,
+ LocationName.crazy_gadget_2,
+ LocationName.crazy_gadget_3,
+ LocationName.crazy_gadget_4,
+ LocationName.crazy_gadget_5,
+ LocationName.crazy_gadget_upgrade,
+ ]
+ crazy_gadget_region = create_region(world, player, active_locations, LocationName.crazy_gadget_region,
+ crazy_gadget_region_locations, None)
+
+ final_rush_region_locations = [
+ LocationName.final_rush_1,
+ LocationName.final_rush_2,
+ LocationName.final_rush_3,
+ LocationName.final_rush_4,
+ LocationName.final_rush_5,
+ LocationName.final_rush_upgrade,
+ ]
+ final_rush_region = create_region(world, player, active_locations, LocationName.final_rush_region,
+ final_rush_region_locations, None)
+
+ prison_lane_region_locations = [
+ LocationName.prison_lane_1,
+ LocationName.prison_lane_2,
+ LocationName.prison_lane_3,
+ LocationName.prison_lane_4,
+ LocationName.prison_lane_5,
+ LocationName.prison_lane_upgrade,
+ ]
+ prison_lane_region = create_region(world, player, active_locations, LocationName.prison_lane_region,
+ prison_lane_region_locations, None)
+
+ mission_street_region_locations = [
+ LocationName.mission_street_1,
+ LocationName.mission_street_2,
+ LocationName.mission_street_3,
+ LocationName.mission_street_4,
+ LocationName.mission_street_5,
+ LocationName.mission_street_upgrade,
+ ]
+ mission_street_region = create_region(world, player, active_locations, LocationName.mission_street_region,
+ mission_street_region_locations, None)
+
+ route_101_region_locations = [
+ LocationName.route_101_1,
+ LocationName.route_101_2,
+ LocationName.route_101_3,
+ LocationName.route_101_4,
+ LocationName.route_101_5,
+ ]
+ route_101_region = create_region(world, player, active_locations, LocationName.route_101_region,
+ route_101_region_locations, None)
+
+ hidden_base_region_locations = [
+ LocationName.hidden_base_1,
+ LocationName.hidden_base_2,
+ LocationName.hidden_base_3,
+ LocationName.hidden_base_4,
+ LocationName.hidden_base_5,
+ LocationName.hidden_base_upgrade,
+ ]
+ hidden_base_region = create_region(world, player, active_locations, LocationName.hidden_base_region,
+ hidden_base_region_locations, None)
+
+ eternal_engine_region_locations = [
+ LocationName.eternal_engine_1,
+ LocationName.eternal_engine_2,
+ LocationName.eternal_engine_3,
+ LocationName.eternal_engine_4,
+ LocationName.eternal_engine_5,
+ LocationName.eternal_engine_upgrade,
+ ]
+ eternal_engine_region = create_region(world, player, active_locations, LocationName.eternal_engine_region,
+ eternal_engine_region_locations, None)
+
+ wild_canyon_region_locations = [
+ LocationName.wild_canyon_1,
+ LocationName.wild_canyon_2,
+ LocationName.wild_canyon_3,
+ LocationName.wild_canyon_4,
+ LocationName.wild_canyon_5,
+ LocationName.wild_canyon_upgrade,
+ ]
+ wild_canyon_region = create_region(world, player, active_locations, LocationName.wild_canyon_region,
+ wild_canyon_region_locations, None)
+
+ pumpkin_hill_region_locations = [
+ LocationName.pumpkin_hill_1,
+ LocationName.pumpkin_hill_2,
+ LocationName.pumpkin_hill_3,
+ LocationName.pumpkin_hill_4,
+ LocationName.pumpkin_hill_5,
+ LocationName.pumpkin_hill_upgrade,
+ ]
+ pumpkin_hill_region = create_region(world, player, active_locations, LocationName.pumpkin_hill_region,
+ pumpkin_hill_region_locations, None)
+
+ aquatic_mine_region_locations = [
+ LocationName.aquatic_mine_1,
+ LocationName.aquatic_mine_2,
+ LocationName.aquatic_mine_3,
+ LocationName.aquatic_mine_4,
+ LocationName.aquatic_mine_5,
+ LocationName.aquatic_mine_upgrade,
+ ]
+ aquatic_mine_region = create_region(world, player, active_locations, LocationName.aquatic_mine_region,
+ aquatic_mine_region_locations, None)
+
+ death_chamber_region_locations = [
+ LocationName.death_chamber_1,
+ LocationName.death_chamber_2,
+ LocationName.death_chamber_3,
+ LocationName.death_chamber_4,
+ LocationName.death_chamber_5,
+ LocationName.death_chamber_upgrade,
+ ]
+ death_chamber_region = create_region(world, player, active_locations, LocationName.death_chamber_region,
+ death_chamber_region_locations, None)
+
+ meteor_herd_region_locations = [
+ LocationName.meteor_herd_1,
+ LocationName.meteor_herd_2,
+ LocationName.meteor_herd_3,
+ LocationName.meteor_herd_4,
+ LocationName.meteor_herd_5,
+ LocationName.meteor_herd_upgrade,
+ ]
+ meteor_herd_region = create_region(world, player, active_locations, LocationName.meteor_herd_region,
+ meteor_herd_region_locations, None)
+
+ radical_highway_region_locations = [
+ LocationName.radical_highway_1,
+ LocationName.radical_highway_2,
+ LocationName.radical_highway_3,
+ LocationName.radical_highway_4,
+ LocationName.radical_highway_5,
+ LocationName.radical_highway_upgrade,
+ ]
+ radical_highway_region = create_region(world, player, active_locations, LocationName.radical_highway_region,
+ radical_highway_region_locations, None)
+
+ white_jungle_region_locations = [
+ LocationName.white_jungle_1,
+ LocationName.white_jungle_2,
+ LocationName.white_jungle_3,
+ LocationName.white_jungle_4,
+ LocationName.white_jungle_5,
+ LocationName.white_jungle_upgrade,
+ ]
+ white_jungle_region = create_region(world, player, active_locations, LocationName.white_jungle_region,
+ white_jungle_region_locations, None)
+
+ sky_rail_region_locations = [
+ LocationName.sky_rail_1,
+ LocationName.sky_rail_2,
+ LocationName.sky_rail_3,
+ LocationName.sky_rail_4,
+ LocationName.sky_rail_5,
+ LocationName.sky_rail_upgrade,
+ ]
+ sky_rail_region = create_region(world, player, active_locations, LocationName.sky_rail_region,
+ sky_rail_region_locations, None)
+
+ final_chase_region_locations = [
+ LocationName.final_chase_1,
+ LocationName.final_chase_2,
+ LocationName.final_chase_3,
+ LocationName.final_chase_4,
+ LocationName.final_chase_5,
+ LocationName.final_chase_upgrade,
+ ]
+ final_chase_region = create_region(world, player, active_locations, LocationName.final_chase_region,
+ final_chase_region_locations, None)
+
+ iron_gate_region_locations = [
+ LocationName.iron_gate_1,
+ LocationName.iron_gate_2,
+ LocationName.iron_gate_3,
+ LocationName.iron_gate_4,
+ LocationName.iron_gate_5,
+ LocationName.iron_gate_upgrade,
+ ]
+ iron_gate_region = create_region(world, player, active_locations, LocationName.iron_gate_region,
+ iron_gate_region_locations, None)
+
+ sand_ocean_region_locations = [
+ LocationName.sand_ocean_1,
+ LocationName.sand_ocean_2,
+ LocationName.sand_ocean_3,
+ LocationName.sand_ocean_4,
+ LocationName.sand_ocean_5,
+ LocationName.sand_ocean_upgrade,
+ ]
+ sand_ocean_region = create_region(world, player, active_locations, LocationName.sand_ocean_region,
+ sand_ocean_region_locations, None)
+
+ lost_colony_region_locations = [
+ LocationName.lost_colony_1,
+ LocationName.lost_colony_2,
+ LocationName.lost_colony_3,
+ LocationName.lost_colony_4,
+ LocationName.lost_colony_5,
+ LocationName.lost_colony_upgrade,
+ ]
+ lost_colony_region = create_region(world, player, active_locations, LocationName.lost_colony_region,
+ lost_colony_region_locations, None)
+
+ weapons_bed_region_locations = [
+ LocationName.weapons_bed_1,
+ LocationName.weapons_bed_2,
+ LocationName.weapons_bed_3,
+ LocationName.weapons_bed_4,
+ LocationName.weapons_bed_5,
+ LocationName.weapons_bed_upgrade,
+ ]
+ weapons_bed_region = create_region(world, player, active_locations, LocationName.weapons_bed_region,
+ weapons_bed_region_locations, None)
+
+ cosmic_wall_region_locations = [
+ LocationName.cosmic_wall_1,
+ LocationName.cosmic_wall_2,
+ LocationName.cosmic_wall_3,
+ LocationName.cosmic_wall_4,
+ LocationName.cosmic_wall_5,
+ LocationName.cosmic_wall_upgrade,
+ ]
+ cosmic_wall_region = create_region(world, player, active_locations, LocationName.cosmic_wall_region,
+ cosmic_wall_region_locations, None)
+
+ dry_lagoon_region_locations = [
+ LocationName.dry_lagoon_1,
+ LocationName.dry_lagoon_2,
+ LocationName.dry_lagoon_3,
+ LocationName.dry_lagoon_4,
+ LocationName.dry_lagoon_5,
+ LocationName.dry_lagoon_upgrade,
+ ]
+ dry_lagoon_region = create_region(world, player, active_locations, LocationName.dry_lagoon_region,
+ dry_lagoon_region_locations, None)
+
+ egg_quarters_region_locations = [
+ LocationName.egg_quarters_1,
+ LocationName.egg_quarters_2,
+ LocationName.egg_quarters_3,
+ LocationName.egg_quarters_4,
+ LocationName.egg_quarters_5,
+ LocationName.egg_quarters_upgrade,
+ ]
+ egg_quarters_region = create_region(world, player, active_locations, LocationName.egg_quarters_region,
+ egg_quarters_region_locations, None)
+
+ security_hall_region_locations = [
+ LocationName.security_hall_1,
+ LocationName.security_hall_2,
+ LocationName.security_hall_3,
+ LocationName.security_hall_4,
+ LocationName.security_hall_5,
+ LocationName.security_hall_upgrade,
+ ]
+ security_hall_region = create_region(world, player, active_locations, LocationName.security_hall_region,
+ security_hall_region_locations, None)
+
+ route_280_region_locations = [
+ LocationName.route_280_1,
+ LocationName.route_280_2,
+ LocationName.route_280_3,
+ LocationName.route_280_4,
+ LocationName.route_280_5,
+ ]
+ route_280_region = create_region(world, player, active_locations, LocationName.route_280_region,
+ route_280_region_locations, None)
+
+ mad_space_region_locations = [
+ LocationName.mad_space_1,
+ LocationName.mad_space_2,
+ LocationName.mad_space_3,
+ LocationName.mad_space_4,
+ LocationName.mad_space_5,
+ LocationName.mad_space_upgrade,
+ ]
+ mad_space_region = create_region(world, player, active_locations, LocationName.mad_space_region,
+ mad_space_region_locations, None)
+
+ cannon_core_region_locations = [
+ LocationName.cannon_core_1,
+ LocationName.cannon_core_2,
+ LocationName.cannon_core_3,
+ LocationName.cannon_core_4,
+ LocationName.cannon_core_5,
+ ]
+ cannon_core_region = create_region(world, player, active_locations, LocationName.cannon_core_region,
+ cannon_core_region_locations, None)
+
+ chao_garden_region_locations = [
+ LocationName.chao_beginner_race,
+ LocationName.chao_jewel_race,
+ LocationName.chao_challenge_race,
+ LocationName.chao_hero_race,
+ LocationName.chao_dark_race,
+ LocationName.chao_beginner_karate,
+ LocationName.chao_standard_karate,
+ LocationName.chao_expert_karate,
+ LocationName.chao_super_karate,
+ ]
+ chao_garden_region = create_region(world, player, active_locations, LocationName.chao_garden_region,
+ chao_garden_region_locations, None)
+
+ biolizard_region_locations = [
+ LocationName.biolizard,
+ ]
+ biolizard_region = create_region(world, player, active_locations, LocationName.biolizard_region,
+ biolizard_region_locations, None)
+
+ # Set up the regions correctly.
+ world.regions += [
+ menu_region,
+ gate_0_region,
+ gate_1_region,
+ gate_2_region,
+ gate_3_region,
+ gate_4_region,
+ gate_5_region,
+ city_escape_region,
+ metal_harbor_region,
+ green_forest_region,
+ pyramid_cave_region,
+ crazy_gadget_region,
+ final_rush_region,
+ prison_lane_region,
+ mission_street_region,
+ route_101_region,
+ hidden_base_region,
+ eternal_engine_region,
+ wild_canyon_region,
+ pumpkin_hill_region,
+ aquatic_mine_region,
+ death_chamber_region,
+ meteor_herd_region,
+ radical_highway_region,
+ white_jungle_region,
+ sky_rail_region,
+ final_chase_region,
+ iron_gate_region,
+ sand_ocean_region,
+ lost_colony_region,
+ weapons_bed_region,
+ cosmic_wall_region,
+ dry_lagoon_region,
+ egg_quarters_region,
+ security_hall_region,
+ route_280_region,
+ mad_space_region,
+ cannon_core_region,
+ chao_garden_region,
+ biolizard_region,
+ ]
+
+
+def connect_regions(world, player, gates: typing.List[LevelGate], cannon_core_emblems):
+ names: typing.Dict[str, int] = {}
+
+ connect(world, player, names, 'Menu', LocationName.gate_0_region)
+ connect(world, player, names, LocationName.gate_0_region, LocationName.cannon_core_region,
+ lambda state: (state.has(ItemName.emblem, player, cannon_core_emblems)))
+
+ connect(world, player, names, LocationName.cannon_core_region, LocationName.biolizard_region,
+ lambda state: (state.can_reach(LocationName.cannon_core_1, "Location", player)))
+
+ for i in range(len(gates[0].gate_levels)):
+ connect(world, player, names, LocationName.gate_0_region, shuffleable_regions[gates[0].gate_levels[i]])
+
+ if len(gates) >= 2:
+ connect(world, player, names, 'Menu', LocationName.gate_1_region,
+ lambda state: (state.has(ItemName.emblem, player, gates[1].gate_emblem_count)))
+ for i in range(len(gates[1].gate_levels)):
+ connect(world, player, names, LocationName.gate_1_region, shuffleable_regions[gates[1].gate_levels[i]])
+
+ if len(gates) >= 3:
+ connect(world, player, names, 'Menu', LocationName.gate_2_region,
+ lambda state: (state.has(ItemName.emblem, player, gates[2].gate_emblem_count)))
+ for i in range(len(gates[2].gate_levels)):
+ connect(world, player, names, LocationName.gate_2_region, shuffleable_regions[gates[2].gate_levels[i]])
+
+ if len(gates) >= 4:
+ connect(world, player, names, 'Menu', LocationName.gate_3_region,
+ lambda state: (state.has(ItemName.emblem, player, gates[3].gate_emblem_count)))
+ for i in range(len(gates[3].gate_levels)):
+ connect(world, player, names, LocationName.gate_3_region, shuffleable_regions[gates[3].gate_levels[i]])
+
+ if len(gates) >= 5:
+ connect(world, player, names, 'Menu', LocationName.gate_4_region,
+ lambda state: (state.has(ItemName.emblem, player, gates[4].gate_emblem_count)))
+ for i in range(len(gates[4].gate_levels)):
+ connect(world, player, names, LocationName.gate_4_region, shuffleable_regions[gates[4].gate_levels[i]])
+
+ if len(gates) >= 6:
+ connect(world, player, names, 'Menu', LocationName.gate_5_region,
+ lambda state: (state.has(ItemName.emblem, player, gates[5].gate_emblem_count)))
+ for i in range(len(gates[5].gate_levels)):
+ connect(world, player, names, LocationName.gate_5_region, shuffleable_regions[gates[5].gate_levels[i]])
+
+
+def create_region(world: MultiWorld, player: int, active_locations, name: str, locations=None, exits=None):
+ # Shamelessly stolen from the ROR2 definition
+ ret = Region(name, None, name, player)
+ ret.world = world
+ if locations:
+ for location in locations:
+ loc_id = active_locations.get(location, 0)
+ if loc_id:
+ location = SA2BLocation(player, location, loc_id, ret)
+ ret.locations.append(location)
+ if exits:
+ for exit in exits:
+ ret.exits.append(Entrance(player, exit, ret))
+
+ return ret
+
+
+def connect(world: MultiWorld, player: int, used_names: typing.Dict[str, int], source: str, target: str,
+ rule: typing.Optional[typing.Callable] = None):
+ source_region = world.get_region(source, player)
+ target_region = world.get_region(target, player)
+
+ if target not in used_names:
+ used_names[target] = 1
+ name = target
+ else:
+ used_names[target] += 1
+ name = target + (' ' * used_names[target])
+
+ connection = Entrance(player, name, source_region)
+
+ if rule:
+ connection.access_rule = rule
+
+ source_region.exits.append(connection)
+ connection.connect(target_region)
diff --git a/worlds/sa2b/Rules.py b/worlds/sa2b/Rules.py
new file mode 100644
index 0000000000..467840a59f
--- /dev/null
+++ b/worlds/sa2b/Rules.py
@@ -0,0 +1,397 @@
+from BaseClasses import MultiWorld
+from .Names import LocationName, ItemName
+from .Locations import first_mission_location_table, second_mission_location_table, third_mission_location_table, \
+ fourth_mission_location_table, fifth_mission_location_table, \
+ upgrade_location_table, chao_garden_location_table
+from ..AutoWorld import LogicMixin
+from ..generic.Rules import add_rule, set_rule
+
+
+def set_mission_progress_rules(world: MultiWorld, player: int):
+ for (k1, v1), (k2, v2), (k3, v3), (k4, v4), (k5, v5) in \
+ zip(sorted(first_mission_location_table.items()),
+ sorted(second_mission_location_table.items()),
+ sorted(third_mission_location_table.items()),
+ sorted(fourth_mission_location_table.items()),
+ sorted(fifth_mission_location_table.items())):
+
+ if world.include_missions[player].value >= 2:
+ set_rule(world.get_location(k2, player), lambda state, k1=k1: state.can_reach(k1, "Location", player))
+
+ if world.include_missions[player].value >= 3:
+ set_rule(world.get_location(k3, player), lambda state, k2=k2: state.can_reach(k2, "Location", player))
+
+ if world.include_missions[player].value >= 4:
+ set_rule(world.get_location(k4, player), lambda state, k3=k3: state.can_reach(k3, "Location", player))
+
+ if world.include_missions[player].value >= 5:
+ set_rule(world.get_location(k5, player), lambda state, k4=k4: state.can_reach(k4, "Location", player))
+
+
+def set_mission_upgrade_rules(world: MultiWorld, player: int):
+ # Mission 1 Upgrade Requirements
+ add_rule(world.get_location(LocationName.metal_harbor_1, player),
+ lambda state: state.has(ItemName.sonic_light_shoes, player))
+ add_rule(world.get_location(LocationName.pumpkin_hill_1, player),
+ lambda state: state.has(ItemName.knuckles_shovel_claws, player))
+ add_rule(world.get_location(LocationName.mission_street_1, player),
+ lambda state: state.has(ItemName.tails_booster, player))
+ add_rule(world.get_location(LocationName.aquatic_mine_1, player),
+ lambda state: state.has(ItemName.knuckles_shovel_claws, player))
+ add_rule(world.get_location(LocationName.hidden_base_1, player),
+ lambda state: state.has(ItemName.tails_booster, player))
+ add_rule(world.get_location(LocationName.pyramid_cave_1, player),
+ lambda state: state.has(ItemName.sonic_bounce_bracelet, player))
+ add_rule(world.get_location(LocationName.death_chamber_1, player),
+ lambda state: state.has(ItemName.knuckles_shovel_claws, player) and
+ state.has(ItemName.knuckles_hammer_gloves, player))
+ add_rule(world.get_location(LocationName.eternal_engine_1, player),
+ lambda state: state.has(ItemName.tails_booster, player) and
+ state.has(ItemName.tails_bazooka, player))
+ add_rule(world.get_location(LocationName.meteor_herd_1, player),
+ lambda state: state.has(ItemName.knuckles_shovel_claws, player) and
+ state.has(ItemName.knuckles_hammer_gloves, player))
+ add_rule(world.get_location(LocationName.crazy_gadget_1, player),
+ lambda state: state.has(ItemName.sonic_light_shoes, player) and
+ state.has(ItemName.sonic_bounce_bracelet, player) and
+ state.has(ItemName.sonic_flame_ring, player))
+ add_rule(world.get_location(LocationName.final_rush_1, player),
+ lambda state: state.has(ItemName.sonic_bounce_bracelet, player))
+
+ add_rule(world.get_location(LocationName.egg_quarters_1, player),
+ lambda state: state.has(ItemName.rouge_pick_nails, player))
+ add_rule(world.get_location(LocationName.lost_colony_1, player),
+ lambda state: state.has(ItemName.eggman_jet_engine, player))
+ add_rule(world.get_location(LocationName.weapons_bed_1, player),
+ lambda state: state.has(ItemName.eggman_jet_engine, player) and
+ state.has(ItemName.eggman_large_cannon, player))
+ add_rule(world.get_location(LocationName.security_hall_1, player),
+ lambda state: state.has(ItemName.rouge_pick_nails, player))
+ add_rule(world.get_location(LocationName.white_jungle_1, player),
+ lambda state: state.has(ItemName.shadow_air_shoes, player))
+ add_rule(world.get_location(LocationName.mad_space_1, player),
+ lambda state: state.has(ItemName.rouge_pick_nails, player) and
+ state.has(ItemName.rouge_iron_boots, player))
+ add_rule(world.get_location(LocationName.cosmic_wall_1, player),
+ lambda state: state.has(ItemName.eggman_jet_engine, player))
+
+ add_rule(world.get_location(LocationName.cannon_core_1, player),
+ lambda state: state.has(ItemName.tails_booster, player) and
+ state.has(ItemName.eggman_jet_engine, player) and
+ state.has(ItemName.knuckles_hammer_gloves, player) and
+ state.has(ItemName.knuckles_air_necklace, player) and
+ state.has(ItemName.sonic_bounce_bracelet, player))
+
+ # Mission 2 Upgrade Requirements
+ if world.include_missions[player].value >= 2:
+ add_rule(world.get_location(LocationName.metal_harbor_2, player),
+ lambda state: state.has(ItemName.sonic_light_shoes, player))
+ add_rule(world.get_location(LocationName.mission_street_2, player),
+ lambda state: state.has(ItemName.tails_booster, player))
+ add_rule(world.get_location(LocationName.hidden_base_2, player),
+ lambda state: state.has(ItemName.tails_booster, player))
+ add_rule(world.get_location(LocationName.death_chamber_2, player),
+ lambda state: state.has(ItemName.knuckles_shovel_claws, player) and
+ state.has(ItemName.knuckles_hammer_gloves, player))
+ add_rule(world.get_location(LocationName.eternal_engine_2, player),
+ lambda state: state.has(ItemName.tails_booster, player) and
+ state.has(ItemName.tails_bazooka, player))
+ add_rule(world.get_location(LocationName.crazy_gadget_2, player),
+ lambda state: state.has(ItemName.sonic_bounce_bracelet, player))
+
+ add_rule(world.get_location(LocationName.lost_colony_2, player),
+ lambda state: state.has(ItemName.eggman_jet_engine, player))
+ add_rule(world.get_location(LocationName.weapons_bed_2, player),
+ lambda state: state.has(ItemName.eggman_jet_engine, player) and
+ state.has(ItemName.eggman_large_cannon, player))
+ add_rule(world.get_location(LocationName.security_hall_2, player),
+ lambda state: state.has(ItemName.rouge_pick_nails, player))
+ add_rule(world.get_location(LocationName.mad_space_2, player),
+ lambda state: state.has(ItemName.rouge_iron_boots, player))
+ add_rule(world.get_location(LocationName.cosmic_wall_2, player),
+ lambda state: state.has(ItemName.eggman_jet_engine, player))
+
+ add_rule(world.get_location(LocationName.cannon_core_2, player),
+ lambda state: state.has(ItemName.tails_booster, player) and
+ state.has(ItemName.eggman_jet_engine, player))
+
+ # Mission 3 Upgrade Requirements
+ if world.include_missions[player].value >= 3:
+ add_rule(world.get_location(LocationName.city_escape_3, player),
+ lambda state: state.has(ItemName.sonic_mystic_melody, player))
+ add_rule(world.get_location(LocationName.wild_canyon_3, player),
+ lambda state: state.has(ItemName.knuckles_shovel_claws, player) and
+ state.has(ItemName.knuckles_hammer_gloves, player) and
+ state.has(ItemName.knuckles_mystic_melody, player))
+ add_rule(world.get_location(LocationName.prison_lane_3, player),
+ lambda state: state.has(ItemName.tails_booster, player) and
+ state.has(ItemName.tails_mystic_melody, player))
+ add_rule(world.get_location(LocationName.metal_harbor_3, player),
+ lambda state: state.has(ItemName.sonic_light_shoes, player) and
+ state.has(ItemName.sonic_bounce_bracelet, player) and
+ state.has(ItemName.sonic_mystic_melody, player))
+ add_rule(world.get_location(LocationName.green_forest_3, player),
+ lambda state: state.has(ItemName.sonic_bounce_bracelet, player) and
+ state.has(ItemName.sonic_mystic_melody, player))
+ add_rule(world.get_location(LocationName.pumpkin_hill_3, player),
+ lambda state: state.has(ItemName.knuckles_mystic_melody, player))
+ add_rule(world.get_location(LocationName.mission_street_3, player),
+ lambda state: state.has(ItemName.tails_booster, player) and
+ state.has(ItemName.tails_mystic_melody, player))
+ add_rule(world.get_location(LocationName.aquatic_mine_3, player),
+ lambda state: state.has(ItemName.knuckles_mystic_melody, player))
+ add_rule(world.get_location(LocationName.hidden_base_3, player),
+ lambda state: state.has(ItemName.tails_booster, player) and
+ state.has(ItemName.tails_mystic_melody, player))
+ add_rule(world.get_location(LocationName.pyramid_cave_3, player),
+ lambda state: state.has(ItemName.sonic_bounce_bracelet, player) and
+ state.has(ItemName.sonic_mystic_melody, player))
+ add_rule(world.get_location(LocationName.death_chamber_3, player),
+ lambda state: state.has(ItemName.knuckles_mystic_melody, player) and
+ state.has(ItemName.knuckles_air_necklace, player) and
+ state.has(ItemName.knuckles_hammer_gloves, player))
+ add_rule(world.get_location(LocationName.eternal_engine_3, player),
+ lambda state: state.has(ItemName.tails_booster, player) and
+ state.has(ItemName.tails_mystic_melody, player))
+ add_rule(world.get_location(LocationName.meteor_herd_3, player),
+ lambda state: state.has(ItemName.knuckles_mystic_melody, player))
+ add_rule(world.get_location(LocationName.crazy_gadget_3, player),
+ lambda state: state.has(ItemName.sonic_light_shoes, player) and
+ state.has(ItemName.sonic_bounce_bracelet, player) and
+ state.has(ItemName.sonic_flame_ring, player) and
+ state.has(ItemName.sonic_mystic_melody, player))
+ add_rule(world.get_location(LocationName.final_rush_3, player),
+ lambda state: state.has(ItemName.sonic_light_shoes, player) and
+ state.has(ItemName.sonic_bounce_bracelet, player) and
+ state.has(ItemName.sonic_mystic_melody, player))
+
+ add_rule(world.get_location(LocationName.iron_gate_3, player),
+ lambda state: state.has(ItemName.eggman_mystic_melody, player) and
+ state.has(ItemName.eggman_jet_engine, player) and
+ state.has(ItemName.eggman_large_cannon, player))
+ add_rule(world.get_location(LocationName.dry_lagoon_3, player),
+ lambda state: state.has(ItemName.rouge_mystic_melody, player) and
+ state.has(ItemName.rouge_pick_nails, player) and
+ state.has(ItemName.rouge_iron_boots, player))
+ add_rule(world.get_location(LocationName.sand_ocean_3, player),
+ lambda state: state.has(ItemName.eggman_jet_engine, player) and
+ state.has(ItemName.eggman_large_cannon, player))
+ add_rule(world.get_location(LocationName.radical_highway_3, player),
+ lambda state: state.has(ItemName.shadow_mystic_melody, player))
+ add_rule(world.get_location(LocationName.egg_quarters_3, player),
+ lambda state: state.has(ItemName.rouge_mystic_melody, player) and
+ state.has(ItemName.rouge_pick_nails, player) and
+ state.has(ItemName.rouge_iron_boots, player))
+ add_rule(world.get_location(LocationName.lost_colony_3, player),
+ lambda state: state.has(ItemName.eggman_mystic_melody, player) and
+ state.has(ItemName.eggman_jet_engine, player))
+ add_rule(world.get_location(LocationName.weapons_bed_3, player),
+ lambda state: state.has(ItemName.eggman_mystic_melody, player) and
+ state.has(ItemName.eggman_jet_engine, player) and
+ state.has(ItemName.eggman_large_cannon, player))
+ add_rule(world.get_location(LocationName.security_hall_3, player),
+ lambda state: state.has(ItemName.rouge_treasure_scope, player))
+ add_rule(world.get_location(LocationName.white_jungle_3, player),
+ lambda state: state.has(ItemName.shadow_air_shoes, player) and
+ state.has(ItemName.shadow_mystic_melody, player))
+ add_rule(world.get_location(LocationName.sky_rail_3, player),
+ lambda state: state.has(ItemName.shadow_air_shoes, player) and
+ state.has(ItemName.shadow_mystic_melody, player))
+ add_rule(world.get_location(LocationName.mad_space_3, player),
+ lambda state: state.has(ItemName.rouge_mystic_melody, player) and
+ state.has(ItemName.rouge_iron_boots, player))
+ add_rule(world.get_location(LocationName.cosmic_wall_3, player),
+ lambda state: state.has(ItemName.eggman_mystic_melody, player) and
+ state.has(ItemName.eggman_jet_engine, player))
+ add_rule(world.get_location(LocationName.final_chase_3, player),
+ lambda state: state.has(ItemName.shadow_air_shoes, player) and
+ state.has(ItemName.shadow_mystic_melody, player))
+
+ add_rule(world.get_location(LocationName.cannon_core_3, player),
+ lambda state: state.has(ItemName.tails_booster, player) and
+ state.has(ItemName.eggman_mystic_melody, player) and
+ state.has(ItemName.eggman_jet_engine, player) and
+ state.has(ItemName.eggman_large_cannon, player) and
+ state.has(ItemName.rouge_mystic_melody, player) and
+ state.has(ItemName.knuckles_mystic_melody, player) and
+ state.has(ItemName.knuckles_hammer_gloves, player) and
+ state.has(ItemName.knuckles_air_necklace, player) and
+ state.has(ItemName.sonic_bounce_bracelet, player) and
+ state.has(ItemName.sonic_light_shoes, player))
+
+ # Mission 4 Upgrade Requirements
+ if world.include_missions[player].value >= 4:
+ add_rule(world.get_location(LocationName.metal_harbor_4, player),
+ lambda state: state.has(ItemName.sonic_light_shoes, player))
+ add_rule(world.get_location(LocationName.pumpkin_hill_4, player),
+ lambda state: state.has(ItemName.knuckles_shovel_claws, player))
+ add_rule(world.get_location(LocationName.mission_street_4, player),
+ lambda state: state.has(ItemName.tails_booster, player))
+ add_rule(world.get_location(LocationName.aquatic_mine_4, player),
+ lambda state: state.has(ItemName.knuckles_shovel_claws, player))
+ add_rule(world.get_location(LocationName.hidden_base_4, player),
+ lambda state: state.has(ItemName.tails_booster, player))
+ add_rule(world.get_location(LocationName.pyramid_cave_4, player),
+ lambda state: state.has(ItemName.sonic_bounce_bracelet, player))
+ add_rule(world.get_location(LocationName.death_chamber_4, player),
+ lambda state: state.has(ItemName.knuckles_shovel_claws, player) and
+ state.has(ItemName.knuckles_hammer_gloves, player))
+ add_rule(world.get_location(LocationName.eternal_engine_4, player),
+ lambda state: state.has(ItemName.tails_booster, player) and
+ state.has(ItemName.tails_bazooka, player))
+ add_rule(world.get_location(LocationName.meteor_herd_4, player),
+ lambda state: state.has(ItemName.knuckles_shovel_claws, player) and
+ state.has(ItemName.knuckles_hammer_gloves, player))
+ add_rule(world.get_location(LocationName.crazy_gadget_4, player),
+ lambda state: state.has(ItemName.sonic_light_shoes, player) and
+ state.has(ItemName.sonic_bounce_bracelet, player) and
+ state.has(ItemName.sonic_flame_ring, player))
+ add_rule(world.get_location(LocationName.final_rush_4, player),
+ lambda state: state.has(ItemName.sonic_bounce_bracelet, player))
+
+ add_rule(world.get_location(LocationName.egg_quarters_4, player),
+ lambda state: state.has(ItemName.rouge_pick_nails, player))
+ add_rule(world.get_location(LocationName.lost_colony_4, player),
+ lambda state: state.has(ItemName.eggman_jet_engine, player))
+ add_rule(world.get_location(LocationName.weapons_bed_4, player),
+ lambda state: state.has(ItemName.eggman_jet_engine, player) and
+ state.has(ItemName.eggman_large_cannon, player))
+ add_rule(world.get_location(LocationName.security_hall_4, player),
+ lambda state: state.has(ItemName.rouge_pick_nails, player))
+ add_rule(world.get_location(LocationName.white_jungle_4, player),
+ lambda state: state.has(ItemName.shadow_air_shoes, player))
+ add_rule(world.get_location(LocationName.mad_space_4, player),
+ lambda state: state.has(ItemName.rouge_pick_nails, player) and
+ state.has(ItemName.rouge_iron_boots, player))
+ add_rule(world.get_location(LocationName.cosmic_wall_4, player),
+ lambda state: state.has(ItemName.eggman_jet_engine, player))
+
+ add_rule(world.get_location(LocationName.cannon_core_4, player),
+ lambda state: state.has(ItemName.tails_booster, player) and
+ state.has(ItemName.eggman_jet_engine, player) and
+ state.has(ItemName.knuckles_hammer_gloves, player) and
+ state.has(ItemName.knuckles_air_necklace, player) and
+ state.has(ItemName.sonic_bounce_bracelet, player))
+
+ # Mission 5 Upgrade Requirements
+ if world.include_missions[player].value >= 5:
+ add_rule(world.get_location(LocationName.city_escape_5, player),
+ lambda state: state.has(ItemName.sonic_flame_ring, player))
+ add_rule(world.get_location(LocationName.wild_canyon_5, player),
+ lambda state: state.has(ItemName.knuckles_shovel_claws, player) and
+ state.has(ItemName.knuckles_sunglasses, player))
+ add_rule(world.get_location(LocationName.metal_harbor_5, player),
+ lambda state: state.has(ItemName.sonic_light_shoes, player))
+ add_rule(world.get_location(LocationName.pumpkin_hill_5, player),
+ lambda state: state.has(ItemName.knuckles_shovel_claws, player) and
+ state.has(ItemName.knuckles_sunglasses, player))
+ add_rule(world.get_location(LocationName.mission_street_5, player),
+ lambda state: state.has(ItemName.tails_booster, player) and
+ state.has(ItemName.tails_bazooka, player))
+ add_rule(world.get_location(LocationName.aquatic_mine_5, player),
+ lambda state: state.has(ItemName.knuckles_mystic_melody, player) and
+ state.has(ItemName.knuckles_air_necklace, player) and
+ state.has(ItemName.knuckles_sunglasses, player))
+ add_rule(world.get_location(LocationName.hidden_base_5, player),
+ lambda state: state.has(ItemName.tails_booster, player))
+ add_rule(world.get_location(LocationName.pyramid_cave_5, player),
+ lambda state: state.has(ItemName.sonic_bounce_bracelet, player))
+ add_rule(world.get_location(LocationName.death_chamber_5, player),
+ lambda state: state.has(ItemName.knuckles_hammer_gloves, player) and
+ state.has(ItemName.knuckles_shovel_claws, player) and
+ state.has(ItemName.knuckles_mystic_melody, player) and
+ state.has(ItemName.knuckles_air_necklace, player))
+ add_rule(world.get_location(LocationName.eternal_engine_5, player),
+ lambda state: state.has(ItemName.tails_booster, player) and
+ state.has(ItemName.tails_bazooka, player))
+ add_rule(world.get_location(LocationName.meteor_herd_5, player),
+ lambda state: state.has(ItemName.knuckles_hammer_gloves, player) and
+ state.has(ItemName.knuckles_sunglasses, player))
+ add_rule(world.get_location(LocationName.crazy_gadget_5, player),
+ lambda state: state.has(ItemName.sonic_light_shoes, player) and
+ state.has(ItemName.sonic_bounce_bracelet, player) and
+ state.has(ItemName.sonic_flame_ring, player))
+ add_rule(world.get_location(LocationName.final_rush_5, player),
+ lambda state: state.has(ItemName.sonic_bounce_bracelet, player))
+
+ add_rule(world.get_location(LocationName.iron_gate_5, player),
+ lambda state: state.has(ItemName.eggman_large_cannon, player))
+ add_rule(world.get_location(LocationName.dry_lagoon_5, player),
+ lambda state: state.has(ItemName.rouge_treasure_scope, player))
+ add_rule(world.get_location(LocationName.egg_quarters_5, player),
+ lambda state: state.has(ItemName.rouge_treasure_scope, player))
+ add_rule(world.get_location(LocationName.lost_colony_5, player),
+ lambda state: state.has(ItemName.eggman_jet_engine, player) and
+ state.has(ItemName.eggman_large_cannon, player))
+ add_rule(world.get_location(LocationName.weapons_bed_5, player),
+ lambda state: state.has(ItemName.eggman_jet_engine, player) and
+ state.has(ItemName.eggman_large_cannon, player))
+ add_rule(world.get_location(LocationName.security_hall_5, player),
+ lambda state: state.has(ItemName.rouge_pick_nails, player) and
+ state.has(ItemName.rouge_treasure_scope, player))
+ add_rule(world.get_location(LocationName.white_jungle_5, player),
+ lambda state: state.has(ItemName.shadow_air_shoes, player) and
+ state.has(ItemName.shadow_flame_ring, player))
+ add_rule(world.get_location(LocationName.mad_space_5, player),
+ lambda state: state.has(ItemName.rouge_pick_nails, player) and
+ state.has(ItemName.rouge_iron_boots, player))
+ add_rule(world.get_location(LocationName.cosmic_wall_5, player),
+ lambda state: state.has(ItemName.eggman_jet_engine, player))
+
+ add_rule(world.get_location(LocationName.cannon_core_5, player),
+ lambda state: state.has(ItemName.tails_booster, player) and
+ state.has(ItemName.eggman_jet_engine, player) and
+ state.has(ItemName.knuckles_mystic_melody, player) and
+ state.has(ItemName.knuckles_hammer_gloves, player) and
+ state.has(ItemName.knuckles_air_necklace, player) and
+ state.has(ItemName.sonic_bounce_bracelet, player))
+
+ add_rule(world.get_location(LocationName.city_escape_upgrade, player),
+ lambda state: state.has(ItemName.sonic_bounce_bracelet, player) and
+ state.has(ItemName.sonic_flame_ring, player))
+ add_rule(world.get_location(LocationName.wild_canyon_upgrade, player),
+ lambda state: state.has(ItemName.knuckles_shovel_claws, player))
+ add_rule(world.get_location(LocationName.prison_lane_upgrade, player),
+ lambda state: state.has(ItemName.tails_bazooka, player))
+ add_rule(world.get_location(LocationName.hidden_base_upgrade, player),
+ lambda state: state.has(ItemName.tails_booster, player) and
+ state.has(ItemName.tails_bazooka, player))
+ add_rule(world.get_location(LocationName.eternal_engine_upgrade, player),
+ lambda state: state.has(ItemName.tails_booster, player))
+ add_rule(world.get_location(LocationName.meteor_herd_upgrade, player),
+ lambda state: state.has(ItemName.knuckles_hammer_gloves, player))
+ add_rule(world.get_location(LocationName.crazy_gadget_upgrade, player),
+ lambda state: state.has(ItemName.sonic_bounce_bracelet, player))
+ add_rule(world.get_location(LocationName.final_rush_upgrade, player),
+ lambda state: state.has(ItemName.sonic_bounce_bracelet, player))
+
+ add_rule(world.get_location(LocationName.iron_gate_upgrade, player),
+ lambda state: state.has(ItemName.eggman_large_cannon, player))
+ add_rule(world.get_location(LocationName.dry_lagoon_upgrade, player),
+ lambda state: state.has(ItemName.rouge_pick_nails, player))
+ add_rule(world.get_location(LocationName.sand_ocean_upgrade, player),
+ lambda state: state.has(ItemName.eggman_jet_engine, player))
+ add_rule(world.get_location(LocationName.radical_highway_upgrade, player),
+ lambda state: state.has(ItemName.shadow_air_shoes, player))
+ add_rule(world.get_location(LocationName.security_hall_upgrade, player),
+ lambda state: state.has(ItemName.rouge_mystic_melody, player) and
+ state.has(ItemName.rouge_iron_boots, player))
+ add_rule(world.get_location(LocationName.cosmic_wall_upgrade, player),
+ lambda state: state.has(ItemName.eggman_jet_engine, player))
+
+
+def set_rules(world: MultiWorld, player: int):
+ # Mission Progression Rules (Mission 1 begets Mission 2, etc.)
+ set_mission_progress_rules(world, player)
+
+ # Upgrade Requirements for each location
+ set_mission_upgrade_rules(world, player)
+
+ # TODO: Place Level Emblem Requirements Here
+
+ # (Edge Case)
+ # Create some reasonable arbitrary logic for Chao Races to prevent having to grind Chaos Drives in the first level
+ # for loc in chao_garden_location_table:
+ # world.get_location(loc, player).add_item_rule(loc, lambda item: False)
+
+ world.completion_condition[player] = lambda state: state.has(ItemName.maria, player)
diff --git a/worlds/sa2b/__init__.py b/worlds/sa2b/__init__.py
new file mode 100644
index 0000000000..5899192b0d
--- /dev/null
+++ b/worlds/sa2b/__init__.py
@@ -0,0 +1,223 @@
+import os
+import typing
+import math
+
+from BaseClasses import Item, MultiWorld, Tutorial
+from .Items import SA2BItem, ItemData, item_table, upgrades_table
+from .Locations import SA2BLocation, all_locations, setup_locations
+from .Options import sa2b_options
+from .Regions import create_regions, shuffleable_regions, connect_regions, LevelGate, gate_0_whitelist_regions, \
+ gate_0_blacklist_regions
+from .Rules import set_rules
+from .Names import ItemName, LocationName
+from ..AutoWorld import WebWorld, World
+import Patch
+
+
+class SA2BWeb(WebWorld):
+ theme = "partyTime"
+
+ setup_en = Tutorial(
+ "Multiworld Setup Guide",
+ "A guide to setting up the Sonic Adventure 2: Battle randomizer connected to an Archipelago Multiworld.",
+ "English",
+ "setup_en.md",
+ "setup/en",
+ ["RaspberrySpaceJam", "PoryGone"]
+ )
+
+ tutorials = [setup_en]
+
+
+def check_for_impossible_shuffle(shuffled_levels: typing.List[int], gate_0_range: int, world: MultiWorld):
+ blacklist_level_count = 0
+
+ for i in range(gate_0_range):
+ if shuffled_levels[i] in gate_0_blacklist_regions:
+ blacklist_level_count += 1
+
+ if blacklist_level_count == gate_0_range:
+ index_to_swap = world.random.randint(0, gate_0_range)
+ for i in range(len(shuffled_levels)):
+ if shuffled_levels[i] in gate_0_whitelist_regions:
+ shuffled_levels[i], shuffled_levels[index_to_swap] = shuffled_levels[index_to_swap], shuffled_levels[i]
+ break
+
+
+class SA2BWorld(World):
+ """
+ Sonic Adventure 2 Battle is an action platforming game. Play as Sonic, Tails, Knuckles, Shadow, Rogue, and Eggman across 31 stages and prevent the destruction of the earth.
+ """
+ game: str = "Sonic Adventure 2 Battle"
+ options = sa2b_options
+ topology_present = False
+ data_version = 1
+
+ item_name_to_id = {name: data.code for name, data in item_table.items()}
+ location_name_to_id = all_locations
+
+ music_map: typing.Dict[int, int]
+ emblems_for_cannons_core: int
+ region_emblem_map: typing.Dict[int, int]
+ web = SA2BWeb()
+
+ def _get_slot_data(self):
+ return {
+ "ModVersion": 100,
+ "MusicMap": self.music_map,
+ "MusicShuffle": self.world.music_shuffle[self.player].value,
+ "DeathLink": self.world.death_link[self.player].value,
+ "IncludeMissions": self.world.include_missions[self.player].value,
+ "EmblemPercentageForCannonsCore": self.world.emblem_percentage_for_cannons_core[self.player].value,
+ "NumberOfLevelGates": self.world.number_of_level_gates[self.player].value,
+ "LevelGateDistribution": self.world.level_gate_distribution[self.player].value,
+ "EmblemsForCannonsCore": self.emblems_for_cannons_core,
+ "RegionEmblemMap": self.region_emblem_map,
+ }
+
+ def _create_items(self, name: str):
+ data = item_table[name]
+ return [self.create_item(name)] * data.quantity
+
+ def fill_slot_data(self) -> dict:
+ slot_data = self._get_slot_data()
+ slot_data["MusicMap"] = self.music_map
+ for option_name in sa2b_options:
+ option = getattr(self.world, option_name)[self.player]
+ slot_data[option_name] = option.value
+
+ return slot_data
+
+ def get_levels_per_gate(self) -> list:
+ levels_per_gate = list()
+ max_gate_index = self.world.number_of_level_gates[self.player]
+ average_level_count = 30 / (max_gate_index + 1)
+ levels_added = 0
+
+ for i in range(max_gate_index + 1):
+ levels_per_gate.append(average_level_count)
+ levels_added += average_level_count
+ additional_count_iterator = 0
+ while levels_added < 30:
+ levels_per_gate[additional_count_iterator] += 1
+ levels_added += 1
+ additional_count_iterator += 1 if additional_count_iterator < max_gate_index else -max_gate_index
+
+ if self.world.level_gate_distribution[self.player] == 0 or self.world.level_gate_distribution[self.player] == 2:
+ early_distribution = self.world.level_gate_distribution[self.player] == 0
+ levels_to_distribute = 5
+ gate_index_offset = 0
+ while levels_to_distribute > 0:
+ if levels_per_gate[0 + gate_index_offset] == 1 or \
+ levels_per_gate[max_gate_index - gate_index_offset] == 1:
+ break
+ if early_distribution:
+ levels_per_gate[0 + gate_index_offset] += 1
+ levels_per_gate[max_gate_index - gate_index_offset] -= 1
+ else:
+ levels_per_gate[0 + gate_index_offset] -= 1
+ levels_per_gate[max_gate_index - gate_index_offset] += 1
+ gate_index_offset += 1
+ if gate_index_offset > math.floor(max_gate_index / 2):
+ gate_index_offset = 0
+ levels_to_distribute -= 1
+
+ return levels_per_gate
+
+ def generate_basic(self):
+ self.world.get_location(LocationName.biolizard, self.player).place_locked_item(self.create_item(ItemName.maria))
+
+ itempool: typing.List[SA2BItem] = []
+
+ # First Missions
+ total_required_locations = 31
+
+ # Mission Locations
+ total_required_locations *= self.world.include_missions[self.player].value
+
+ # Upgrades
+ total_required_locations += 28
+
+ # Fill item pool with all required items
+ for item in {**upgrades_table}:
+ itempool += self._create_items(item)
+
+ total_emblem_count = total_required_locations - len(itempool)
+
+ # itempool += [self.create_item(ItemName.emblem)] * total_emblem_count
+
+ self.emblems_for_cannons_core = math.floor(
+ total_emblem_count * (self.world.emblem_percentage_for_cannons_core[self.player].value / 100.0))
+
+ shuffled_region_list = list(range(30))
+ emblem_requirement_list = list()
+ self.world.random.shuffle(shuffled_region_list)
+ levels_per_gate = self.get_levels_per_gate()
+
+ check_for_impossible_shuffle(shuffled_region_list, math.ceil(levels_per_gate[0]), self.world)
+ levels_added_to_gate = 0
+ total_levels_added = 0
+ current_gate = 0
+ current_gate_emblems = 0
+ gates = list()
+ gates.append(LevelGate(0))
+ for i in range(30):
+ gates[current_gate].gate_levels.append(shuffled_region_list[i])
+ emblem_requirement_list.append(current_gate_emblems)
+ levels_added_to_gate += 1
+ total_levels_added += 1
+ if levels_added_to_gate >= levels_per_gate[current_gate]:
+ current_gate += 1
+ if current_gate > self.world.number_of_level_gates[self.player].value:
+ current_gate = self.world.number_of_level_gates[self.player].value
+ else:
+ current_gate_emblems = max(
+ math.floor(total_emblem_count * math.pow(total_levels_added / 30.0, 2.0)), current_gate)
+ gates.append(LevelGate(current_gate_emblems))
+ levels_added_to_gate = 0
+
+ self.region_emblem_map = dict(zip(shuffled_region_list, emblem_requirement_list))
+
+ connect_regions(self.world, self.player, gates, self.emblems_for_cannons_core)
+
+ max_required_emblems = max(max(emblem_requirement_list), self.emblems_for_cannons_core)
+ itempool += [self.create_item(ItemName.emblem)] * max_required_emblems
+ itempool += [self.create_item(ItemName.emblem, True)] * (total_emblem_count - max_required_emblems)
+
+ self.world.itempool += itempool
+
+ if self.world.music_shuffle[self.player] == "levels":
+ musiclist_o = list(range(0, 47))
+ musiclist_s = musiclist_o.copy()
+ self.world.random.shuffle(musiclist_s)
+ self.music_map = dict(zip(musiclist_o, musiclist_s))
+ elif self.world.music_shuffle[self.player] == "full":
+ musiclist_o = list(range(0, 78))
+ musiclist_s = musiclist_o.copy()
+ self.world.random.shuffle(musiclist_s)
+ self.music_map = dict(zip(musiclist_o, musiclist_s))
+ else:
+ self.music_map = dict()
+
+ def create_regions(self):
+ location_table = setup_locations(self.world, self.player)
+ create_regions(self.world, self.player, location_table)
+
+ def create_item(self, name: str, force_non_progression=False) -> Item:
+ data = item_table[name]
+ created_item = SA2BItem(name, data.progression, data.code, self.player)
+ if name == ItemName.emblem:
+ created_item.skip_in_prog_balancing = True
+ if force_non_progression:
+ created_item.advancement = False
+ return created_item
+
+ def set_rules(self):
+ set_rules(self.world, self.player)
+
+ @classmethod
+ def stage_fill_hook(cls, world, progitempool, nonexcludeditempool, localrestitempool, nonlocalrestitempool,
+ restitempool, fill_locations):
+ if world.get_game_players("Sonic Adventure 2 Battle"):
+ progitempool.sort(
+ key=lambda item: 0 if (item.name != 'Emblem') else 1)
diff --git a/worlds/sa2b/docs/en_Sonic Adventure 2 Battle.md b/worlds/sa2b/docs/en_Sonic Adventure 2 Battle.md
new file mode 100644
index 0000000000..38b24c2336
--- /dev/null
+++ b/worlds/sa2b/docs/en_Sonic Adventure 2 Battle.md
@@ -0,0 +1,30 @@
+# Sonic Adventure 2: Battle
+
+## Where is the settings page?
+
+The [player settings page for this game](../player-settings) contains all the options you need to configure and export a config file.
+
+## What does randomization do to this game?
+
+The randomizer shuffles emblems and upgrade items into the AP item pool. The story mode is disabled, but stage select is available from the start. Levels can be locked behind gates requiring a certain number of emblems to unlock. Cannons Core will be locked behind a percentage of all available emblems, and completing Cannons Core will unlock the Biolizard boss. Progress towards unlocking Cannons Core and the next stage gate will be displayed on the Stage Select screen.
+
+## What is the goal of Sonic Adventure 2: Battle when randomized?
+
+The goal is to unlock and complete Cannons Core Mission 1, then complete the Biolizard boss fight.
+
+## What items and locations get shuffled?
+
+All 30 story stages leading up to Cannons Core will be shuffled and can be optionally placed behind emblem requirement gates. All emblems from the selected mission range and all 28 character upgrade items get shuffled.
+
+## Which items can be in another player's world?
+
+Any shuffled item can be in other players' worlds.
+
+## What does another world's item look like in Sonic Adventure 2: Battle
+
+Emblems have no visualization in the randomizer and items all retain their original appearance. You won't know if an item belongs to another player until you collect.
+
+## When the player receives an emblem or item, what happens?
+
+When the player collects an emblem or item, text will appear on screen to indicate who the item was for and what the item was. When collecting items in a level, the orignal item collection text will display and will likely not be correct.
+
diff --git a/worlds/sa2b/docs/setup_en.md b/worlds/sa2b/docs/setup_en.md
new file mode 100644
index 0000000000..9e6c10df52
--- /dev/null
+++ b/worlds/sa2b/docs/setup_en.md
@@ -0,0 +1,88 @@
+# Sonic Adventure 2: Battle Randomizer Setup Guide
+
+## Required Software
+
+- Sonic Adventure 2: Battle from: [Sonic Adventure 2: Battle Steam Store Page](https://store.steampowered.com/app/213610/Sonic_Adventure_2/)
+ - Currently the DLC is not required for this mod, but it will be required in a future release.
+- Sonic Adventure 2 Mod Loader from: [Sonic Retro Mod Loader Page](http://info.sonicretro.org/SA2_Mod_Loader)
+- Microsoft Visual C++ 2013 from: [Microsoft Visual C++ 2013 Redistributable Page](https://www.microsoft.com/en-us/download/details.aspx?id=40784)
+- Archipelago Mod for Sonic Adventure 2: Battle
+ from: [Sonic Adventure 2: Battle Archipelago Randomizer Mod Releases Page](https://github.com/PoryGone/SA2B_Archipelago/releases/)
+
+## Optional Software
+- Sonic Adventure 2 Tracker
+ - PopTracker from: [PopTracker Releases Page](https://github.com/black-sliver/PopTracker/releases/)
+ - Sonic Adventure 2: Battle Archipelago PopTracker pack from: [SA2B AP Tracker Releases Page](https://github.com/PoryGone/SA2B_AP_Tracker/releases/)
+
+## Installation Procedures
+
+1. Install Sonic Adventure 2: Battle from Steam.
+
+2. Launch the game at least once without mods.
+
+3. Install Sonic Adventure 2 Mod Loader as per its instructions.
+
+4. The folder you installed the Sonic Adventure 2 Mod Loader into will now have a `/mods` directory.
+
+5. Unpack the Archipelago Mod into this folder, so that `/mods/SA2B_Archipelago` is a valid path.
+
+6. In the SA2B_Archipelago folder, run the `CopyAPCppDLL.bat` script (a window will very quickly pop up and go away).
+
+7. Launch the `SA2ModManager.exe` and make sure the SA2B_Archipelago mod is listed and enabled.
+
+## Joining a MultiWorld Game
+
+1. Before launching the game, run the `SA2ModManager.exe`, select the SA2B_Archipelago mod, and hit the `Configure...` button.
+
+2. For the `Server IP` field under `AP Settings`, enter the address of the server, such as archipelago.gg:38281, your server host should be able to tell you this.
+
+3. For the `PlayerName` field under `AP Settings`, enter your "name" field from the yaml, or website config.
+
+4. For the `Password` field under `AP Settings`, enter the server password if one exists, otherwise leave blank.
+
+5. Click The `Save` button then hit `Save & Play` to launch the game.
+
+6. Create a new save to connect to the MultiWorld game. A "Connected to Archipelago" message will appear if you sucessfully connect. If you close the game during play, you can reconnect to the MultiWorld game by selecting the same save file slot.
+
+## Additional Options
+
+Some additional settings related to the Archipelago messages in game can be adjusted in the SA2ModManager if you select `Configure...` on the SA2B_Archipelago mod. This settings will be under a `General Settings` tab.
+
+ - Message Display Count: This is the maximum number of Archipelago messages that can be displayed on screen at any given time.
+ - Message Display Duration: This dictates how long Archipelago messages are displayed on screen (in seconds).
+ - Message Font Size: The is the size of the font used to display the messages from Archipelago.
+
+## Troubleshooting
+
+- "The following mods didn't load correctly: SA2B_Archipelago: DLL error - The specified module could not be found."
+ - Make sure the `APCpp.dll` is in the same folder as the `sonic2app.exe`. (See Installation Procedures step 6)
+
+- Game is running too fast (Like Sonic).
+ - If using an NVidia graphics card:
+ 1. Open the NVIDIA Control Panel.
+ 2. Select `Manage 3D Settings` under `3D settings` on the left.
+ 3. Select the `Program Settings` tab in the main window.
+ 4. Click the `Add` button and select `sonic2app.exe` (or browse to the exe location), then click `Add Selected Program`.
+ 5. Under `Specify the settings for this program:`, find the `Max Frame Rate` feature and click the Setting column for that feature.
+ 6. Choose the `On` radial option and in the input box next to the slide enter a value of 60 (or 59 if 60 causes the game to crash).
+
+- Controller input is not working.
+ 1. Run the Launcher.exe which should be in the same folder as the SA2ModManager.
+ 2. Select the `Player` tab and reselect the controller for the player 1 input method.
+ 3. Click the `Save settings and launch SONIC ADVENTURE 2` button. (Any mod manager settings will apply even if the game is launched this way rather than through the mod manager)
+
+- Game crashes after display logos.
+ - This may be caused by a high monitor refresh rate.
+ - Change the monitor refresh rate to 60 Hz [Change display refresh rate on Windows] (https://support.microsoft.com/en-us/windows/change-your-display-refresh-rate-in-windows-c8ea729e-0678-015c-c415-f806f04aae5a)
+ - This may also be fixed by setting Windows 7 compatibility mode on the sonic app:
+ 1. Right click on the sonic2app.exe and select `Properties`.
+ 2. Select the `Compatibility` tab.
+ 3. Check the `Run this program in compatility mode for:` box and select Windows 7 in the drop down.
+ 4. Click the `Apply` button.
+
+- No resolution options in the Launcher.exe.
+ - In the `Graphics device` dropdown, select the device and display you plan to run the game on. The `Resolution` dropdown should populate once a graphics device is selected.
+
+## Save File Safeguard (Advanced Option)
+
+The mod contains a save file safeguard which associates a savefile to a specific Archipelago seed. By default, save files can only connect to Archipelago servers that match their seed. The safeguard can be disabled in the mod config.ini by setting `IgnoreFileSafety` to true. This is NOT recommended for the standard user as it will allow any save file to connect and send items to the Archipelago server.
diff --git a/worlds/sc2wol/Items.py b/worlds/sc2wol/Items.py
new file mode 100644
index 0000000000..daa3d98cfd
--- /dev/null
+++ b/worlds/sc2wol/Items.py
@@ -0,0 +1,172 @@
+from BaseClasses import Item
+import typing
+
+
+class ItemData(typing.NamedTuple):
+ code: typing.Optional[int]
+ type: typing.Optional[str]
+ number: typing.Optional[int]
+ progression: bool = False
+ never_exclude: bool = True
+ quantity: int = 1
+
+
+class StarcraftWoLItem(Item):
+ game: str = "Starcraft 2 Wings of Liberty"
+
+ def __init__(self, name, advancement: bool = False, code: int = None, player: int = None):
+ super(StarcraftWoLItem, self).__init__(name, advancement, code, player)
+
+
+def get_full_item_list():
+ return item_table
+
+
+SC2WOL_ITEM_ID_OFFSET = 1000
+
+item_table = {
+ "Marine": ItemData(0+SC2WOL_ITEM_ID_OFFSET, "Unit", 0, progression=True),
+ "Medic": ItemData(1+SC2WOL_ITEM_ID_OFFSET, "Unit", 1, progression=True),
+ "Firebat": ItemData(2+SC2WOL_ITEM_ID_OFFSET, "Unit", 2, progression=True),
+ "Marauder": ItemData(3+SC2WOL_ITEM_ID_OFFSET, "Unit", 3, progression=True),
+ "Reaper": ItemData(4+SC2WOL_ITEM_ID_OFFSET, "Unit", 4, progression=True),
+ "Hellion": ItemData(5+SC2WOL_ITEM_ID_OFFSET, "Unit", 5, progression=True),
+ "Vulture": ItemData(6+SC2WOL_ITEM_ID_OFFSET, "Unit", 6, progression=True),
+ "Goliath": ItemData(7+SC2WOL_ITEM_ID_OFFSET, "Unit", 7, progression=True),
+ "Diamondback": ItemData(8+SC2WOL_ITEM_ID_OFFSET, "Unit", 8, progression=True),
+ "Siege Tank": ItemData(9+SC2WOL_ITEM_ID_OFFSET, "Unit", 9, progression=True),
+ "Medivac": ItemData(10+SC2WOL_ITEM_ID_OFFSET, "Unit", 10, progression=True),
+ "Wraith": ItemData(11+SC2WOL_ITEM_ID_OFFSET, "Unit", 11, progression=True),
+ "Viking": ItemData(12+SC2WOL_ITEM_ID_OFFSET, "Unit", 12, progression=True),
+ "Banshee": ItemData(13+SC2WOL_ITEM_ID_OFFSET, "Unit", 13, progression=True),
+ "Battlecruiser": ItemData(14+SC2WOL_ITEM_ID_OFFSET, "Unit", 14, progression=True),
+ "Ghost": ItemData(15+SC2WOL_ITEM_ID_OFFSET, "Unit", 15, progression=True),
+ "Spectre": ItemData(16+SC2WOL_ITEM_ID_OFFSET, "Unit", 16, progression=True),
+ "Thor": ItemData(17+SC2WOL_ITEM_ID_OFFSET, "Unit", 17, progression=True),
+
+ "Progressive Infantry Weapon": ItemData (100+SC2WOL_ITEM_ID_OFFSET, "Upgrade", 0, quantity=3),
+ "Progressive Infantry Armor": ItemData (102+SC2WOL_ITEM_ID_OFFSET, "Upgrade", 2, quantity=3),
+ "Progressive Vehicle Weapon": ItemData (103+SC2WOL_ITEM_ID_OFFSET, "Upgrade", 4, quantity=3),
+ "Progressive Vehicle Armor": ItemData (104+SC2WOL_ITEM_ID_OFFSET, "Upgrade", 6, quantity=3),
+ "Progressive Ship Weapon": ItemData (105+SC2WOL_ITEM_ID_OFFSET, "Upgrade", 8, quantity=3),
+ "Progressive Ship Armor": ItemData (106+SC2WOL_ITEM_ID_OFFSET, "Upgrade", 10, quantity=3),
+
+ "Projectile Accelerator (Bunker)": ItemData (200+SC2WOL_ITEM_ID_OFFSET, "Armory 1", 0),
+ "Neosteel Bunker (Bunker)": ItemData (201+SC2WOL_ITEM_ID_OFFSET, "Armory 1", 1),
+ "Titanium Housing (Missile Turret)": ItemData (202+SC2WOL_ITEM_ID_OFFSET, "Armory 1", 2),
+ "Hellstorm Batteries (Missile Turret)": ItemData (203+SC2WOL_ITEM_ID_OFFSET, "Armory 1", 3),
+ "Advanced Construction (SCV)": ItemData (204+SC2WOL_ITEM_ID_OFFSET, "Armory 1", 4),
+ "Dual-Fusion Welders (SCV)": ItemData (205+SC2WOL_ITEM_ID_OFFSET, "Armory 1", 5),
+ "Fire-Suppression System (Building)": ItemData (206+SC2WOL_ITEM_ID_OFFSET, "Armory 1", 6),
+ "Orbital Command (Building)": ItemData (207+SC2WOL_ITEM_ID_OFFSET, "Armory 1", 7),
+ "Stimpack (Marine)": ItemData (208+SC2WOL_ITEM_ID_OFFSET, "Armory 1", 8),
+ "Combat Shield (Marine)": ItemData (209+SC2WOL_ITEM_ID_OFFSET, "Armory 1", 9),
+ "Advanced Medic Facilities (Medic)": ItemData (210+SC2WOL_ITEM_ID_OFFSET, "Armory 1", 10),
+ "Stabilizer Medpacks (Medic)": ItemData (211+SC2WOL_ITEM_ID_OFFSET, "Armory 1", 11),
+ "Incinerator Gauntlets (Firebat)": ItemData (212+SC2WOL_ITEM_ID_OFFSET, "Armory 1", 12, never_exclude=False),
+ "Juggernaut Plating (Firebat)": ItemData (213+SC2WOL_ITEM_ID_OFFSET, "Armory 1", 13),
+ "Concussive Shells (Marauder)": ItemData (214+SC2WOL_ITEM_ID_OFFSET, "Armory 1", 14),
+ "Kinetic Foam (Marauder)": ItemData (215+SC2WOL_ITEM_ID_OFFSET, "Armory 1", 15),
+ "U-238 Rounds (Reaper)": ItemData (216+SC2WOL_ITEM_ID_OFFSET, "Armory 1", 16),
+ "G-4 Clusterbomb (Reaper)": ItemData (217+SC2WOL_ITEM_ID_OFFSET, "Armory 1", 17, never_exclude=False),
+
+ "Twin-Linked Flamethrower (Hellion)": ItemData(300+SC2WOL_ITEM_ID_OFFSET, "Armory 2", 0, never_exclude=False),
+ "Thermite Filaments (Hellion)": ItemData(301+SC2WOL_ITEM_ID_OFFSET, "Armory 2", 1),
+ "Cerberus Mine (Vulture)": ItemData(302 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 2),
+ "Replenishable Magazine (Vulture)": ItemData(303 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 3),
+ "Multi-Lock Weapons System (Goliath)": ItemData(304 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 4),
+ "Ares-Class Targeting System (Goliath)": ItemData(305 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 5),
+ "Tri-Lithium Power Cell (Diamondback)": ItemData(306 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 6, never_exclude=False),
+ "Shaped Hull (Diamondback)": ItemData(307 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 7, never_exclude=False),
+ "Maelstrom Rounds (Siege Tank)": ItemData(308 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 8),
+ "Shaped Blast (Siege Tank)": ItemData(309 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 9),
+ "Rapid Deployment Tube (Medivac)": ItemData(310 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 10, never_exclude=False),
+ "Advanced Healing AI (Medivac)": ItemData(311 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 11),
+ "Tomahawk Power Cells (Wraith)": ItemData(312 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 12, never_exclude=False),
+ "Displacement Field (Wraith)": ItemData(313 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 13),
+ "Ripwave Missiles (Viking)": ItemData(314 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 14),
+ "Phobos-Class Weapons System (Viking)": ItemData(315 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 15),
+ "Cross-Spectrum Dampeners (Banshee)": ItemData(316 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 16, never_exclude=False),
+ "Shockwave Missile Battery (Banshee)": ItemData(317 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 17),
+ "Missile Pods (Battlecruiser)": ItemData(318 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 18, never_exclude=False),
+ "Defensive Matrix (Battlecruiser)": ItemData(319 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 19, never_exclude=False),
+ "Ocular Implants (Ghost)": ItemData(320 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 20),
+ "Crius Suit (Ghost)": ItemData(321 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 21),
+ "Psionic Lash (Spectre)": ItemData(322 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 22),
+ "Nyx-Class Cloaking Module (Spectre)": ItemData(323 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 23),
+ "330mm Barrage Cannon (Thor)": ItemData(324 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 24, never_exclude=False),
+ "Immortality Protocol (Thor)": ItemData(325 + SC2WOL_ITEM_ID_OFFSET, "Armory 2", 25, never_exclude=False),
+
+ "Bunker": ItemData (400+SC2WOL_ITEM_ID_OFFSET, "Building", 0, progression=True),
+ "Missile Turret": ItemData (401+SC2WOL_ITEM_ID_OFFSET, "Building", 1, progression=True),
+ "Sensor Tower": ItemData (402+SC2WOL_ITEM_ID_OFFSET, "Building", 2),
+
+ "War Pigs": ItemData (500 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 0),
+ "Devil Dogs": ItemData(501 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 1, never_exclude=False),
+ "Hammer Securities": ItemData(502 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 2),
+ "Spartan Company": ItemData(503 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 3),
+ "Siege Breakers": ItemData(504 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 4),
+ "Hel's Angel": ItemData(505 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 5),
+ "Dusk Wings": ItemData(506 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 6),
+ "Jackson's Revenge": ItemData(507 + SC2WOL_ITEM_ID_OFFSET, "Mercenary", 7),
+
+ "Ultra-Capacitors": ItemData(600 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 0),
+ "Vanadium Plating": ItemData(601 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 1),
+ "Orbital Depots": ItemData(602 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 2),
+ "Micro-Filtering": ItemData(603 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 3),
+ "Automated Refinery": ItemData(604 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 4),
+ "Command Center Reactor": ItemData(605 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 5),
+ "Raven": ItemData(606 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 6),
+ "Science Vessel": ItemData(607 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 7, progression=True),
+ "Tech Reactor": ItemData(608 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 8),
+ "Orbital Strike": ItemData(609 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 9),
+ "Shrike Turret": ItemData(610 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 10),
+ "Fortified Bunker": ItemData(611 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 11),
+ "Planetary Fortress": ItemData(612 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 12),
+ "Perdition Turret": ItemData(613 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 13),
+ "Predator": ItemData(614 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 14, never_exclude=False),
+ "Hercules": ItemData(615 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 15, progression=True),
+ "Cellular Reactor": ItemData(616 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 16, never_exclude=False),
+ "Regenerative Bio-Steel": ItemData(617 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 17, never_exclude=False),
+ "Hive Mind Emulator": ItemData(618 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 18),
+ "Psi Disrupter": ItemData(619 + SC2WOL_ITEM_ID_OFFSET, "Laboratory", 19, never_exclude=False),
+
+ "Zealot": ItemData(700 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 0, progression=True),
+ "Stalker": ItemData(701 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 1, progression=True),
+ "High Templar": ItemData(702 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 2, progression=True),
+ "Dark Templar": ItemData(703 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 3, progression=True),
+ "Immortal": ItemData(704 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 4, progression=True),
+ "Colossus": ItemData(705 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 5, progression=True),
+ "Phoenix": ItemData(706 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 6, progression=True),
+ "Void Ray": ItemData(707 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 7, progression=True),
+ "Carrier": ItemData(708 + SC2WOL_ITEM_ID_OFFSET, "Protoss", 8, progression=True),
+
+ "+5 Starting Minerals": ItemData(800+SC2WOL_ITEM_ID_OFFSET, "Minerals", 5, quantity=0, never_exclude=False),
+ "+5 Starting Vespene": ItemData(801+SC2WOL_ITEM_ID_OFFSET, "Vespene", 5, quantity=0, never_exclude=False)
+}
+
+basic_unit: typing.Tuple[str, ...] = (
+ 'Marine',
+ 'Marauder',
+ 'Firebat',
+ 'Hellion',
+ 'Vulture'
+)
+
+
+item_name_groups = {}
+for item, data in item_table.items():
+ item_name_groups.setdefault(data.type, []).append(item)
+item_name_groups["Missions"] = ["Beat Liberation Day", "Beat The Outlaws", "Beat Zero Hour", "Beat Evacuation",
+ "None Outbreak", "Beat Safe Haven", "Beat Haven's Fall", "Beat Smash and Grab", "Beat The Dig",
+ "Beat The Moebius Factor", "Beat Supernova", "Beat Maw of the Void", "Beat Devil's Playground",
+ "Beat Welcome to the Jungle", "Beat Breakout", "Beat Ghost of a Chance",
+ "Beat The Great Train Robbery", "Beat Cutthroat", "Beat Engine of Destruction",
+ "Beat Media Blitz", "Beat Piercing the Shroud"]
+
+filler_items: typing.Tuple[str, ...] = (
+ '+5 Starting Minerals',
+ '+5 Starting Vespene'
+)
+
+lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in get_full_item_list().items() if data.code}
\ No newline at end of file
diff --git a/worlds/sc2wol/Locations.py b/worlds/sc2wol/Locations.py
new file mode 100644
index 0000000000..dc2ec74a4b
--- /dev/null
+++ b/worlds/sc2wol/Locations.py
@@ -0,0 +1,288 @@
+from typing import List, Tuple, Optional, Callable, NamedTuple
+from BaseClasses import MultiWorld
+
+from BaseClasses import Location
+
+SC2WOL_LOC_ID_OFFSET = 1000
+
+
+class SC2WoLLocation(Location):
+ game: str = "Starcraft2WoL"
+
+
+class LocationData(NamedTuple):
+ region: str
+ name: str
+ code: Optional[int]
+ rule: Callable = lambda state: True
+
+
+def get_locations(world: Optional[MultiWorld], player: Optional[int]) -> Tuple[LocationData, ...]:
+ # Note: rules which are ended with or True are rules identified as needed later when restricted units is an option
+ location_table: List[LocationData] = [
+ LocationData("Liberation Day", "Liberation Day: Victory", SC2WOL_LOC_ID_OFFSET + 100),
+ LocationData("Liberation Day", "Liberation Day: First Statue", SC2WOL_LOC_ID_OFFSET + 101),
+ LocationData("Liberation Day", "Liberation Day: Second Statue", SC2WOL_LOC_ID_OFFSET + 102),
+ LocationData("Liberation Day", "Liberation Day: Third Statue", SC2WOL_LOC_ID_OFFSET + 103),
+ LocationData("Liberation Day", "Liberation Day: Fourth Statue", SC2WOL_LOC_ID_OFFSET + 104),
+ LocationData("Liberation Day", "Liberation Day: Fifth Statue", SC2WOL_LOC_ID_OFFSET + 105),
+ LocationData("Liberation Day", "Liberation Day: Sixth Statue", SC2WOL_LOC_ID_OFFSET + 106),
+ LocationData("Liberation Day", "Beat Liberation Day", None),
+ LocationData("The Outlaws", "The Outlaws: Victory", SC2WOL_LOC_ID_OFFSET + 200,
+ lambda state: state._sc2wol_has_common_unit(world, player)),
+ LocationData("The Outlaws", "The Outlaws: Rebel Base", SC2WOL_LOC_ID_OFFSET + 201,
+ lambda state: state._sc2wol_has_common_unit(world, player)),
+ LocationData("The Outlaws", "Beat The Outlaws", None,
+ lambda state: state._sc2wol_has_common_unit(world, player)),
+ LocationData("Zero Hour", "Zero Hour: Victory", SC2WOL_LOC_ID_OFFSET + 300,
+ lambda state: state._sc2wol_has_common_unit(world, player)),
+ LocationData("Zero Hour", "Zero Hour: First Group Rescued", SC2WOL_LOC_ID_OFFSET + 301),
+ LocationData("Zero Hour", "Zero Hour: Second Group Rescued", SC2WOL_LOC_ID_OFFSET + 302,
+ lambda state: state._sc2wol_has_common_unit(world, player)),
+ LocationData("Zero Hour", "Zero Hour: Third Group Rescued", SC2WOL_LOC_ID_OFFSET + 303,
+ lambda state: state._sc2wol_has_common_unit(world, player)),
+ LocationData("Zero Hour", "Beat Zero Hour", None,
+ lambda state: state._sc2wol_has_common_unit(world, player)),
+ LocationData("Evacuation", "Evacuation: Victory", SC2WOL_LOC_ID_OFFSET + 400,
+ lambda state: state._sc2wol_has_mobile_anti_air(world, player)),
+ LocationData("Evacuation", "Evacuation: First Chysalis", SC2WOL_LOC_ID_OFFSET + 401),
+ LocationData("Evacuation", "Evacuation: Second Chysalis", SC2WOL_LOC_ID_OFFSET + 402,
+ lambda state: state._sc2wol_has_common_unit(world, player)),
+ LocationData("Evacuation", "Evacuation: Third Chysalis", SC2WOL_LOC_ID_OFFSET + 403,
+ lambda state: state._sc2wol_has_common_unit(world, player)),
+ LocationData("Evacuation", "Beat Evacuation", None,
+ lambda state: state._sc2wol_has_common_unit(world, player) and
+ state._sc2wol_has_mobile_anti_air(world, player)),
+ LocationData("Outbreak", "Outbreak: Victory", SC2WOL_LOC_ID_OFFSET + 500,
+ lambda state: state._sc2wol_has_common_unit(world, player) or state.has("Reaper", player)),
+ LocationData("Outbreak", "Outbreak: Left Infestor", SC2WOL_LOC_ID_OFFSET + 501,
+ lambda state: state._sc2wol_has_common_unit(world, player) or state.has("Reaper", player)),
+ LocationData("Outbreak", "Outbreak: Right Infestor", SC2WOL_LOC_ID_OFFSET + 502,
+ lambda state: state._sc2wol_has_common_unit(world, player) or state.has("Reaper", player)),
+ LocationData("Outbreak", "Beat Outbreak", None,
+ lambda state: state._sc2wol_has_common_unit(world, player) or state.has("Reaper", player)),
+ LocationData("Safe Haven", "Safe Haven: Victory", SC2WOL_LOC_ID_OFFSET + 600,
+ lambda state: state._sc2wol_has_common_unit(world, player) and
+ state._sc2wol_has_mobile_anti_air(world, player)),
+ LocationData("Safe Haven", "Beat Safe Haven", None,
+ lambda state: state._sc2wol_has_common_unit(world, player) and
+ state._sc2wol_has_mobile_anti_air(world, player)),
+ LocationData("Haven's Fall", "Haven's Fall: Victory", SC2WOL_LOC_ID_OFFSET + 700,
+ lambda state: state._sc2wol_has_common_unit(world, player) and
+ state._sc2wol_has_mobile_anti_air(world, player)),
+ LocationData("Haven's Fall", "Beat Haven's Fall", None,
+ lambda state: state._sc2wol_has_common_unit(world, player) and
+ state._sc2wol_has_mobile_anti_air(world, player)),
+ LocationData("Smash and Grab", "Smash and Grab: Victory", SC2WOL_LOC_ID_OFFSET + 800,
+ lambda state: state._sc2wol_has_common_unit(world, player) and
+ state._sc2wol_has_mobile_anti_air(world, player)),
+ LocationData("Smash and Grab", "Smash and Grab: First Relic", SC2WOL_LOC_ID_OFFSET + 801),
+ LocationData("Smash and Grab", "Smash and Grab: Second Relic", SC2WOL_LOC_ID_OFFSET + 802),
+ LocationData("Smash and Grab", "Smash and Grab: Third Relic", SC2WOL_LOC_ID_OFFSET + 803,
+ lambda state: state._sc2wol_has_common_unit(world, player)),
+ LocationData("Smash and Grab", "Smash and Grab: Fourth Relic", SC2WOL_LOC_ID_OFFSET + 804,
+ lambda state: state._sc2wol_has_common_unit(world, player) and
+ state._sc2wol_has_anti_air(world, player)),
+ LocationData("Smash and Grab", "Beat Smash and Grab", None,
+ lambda state: state._sc2wol_has_common_unit(world, player) and
+ state._sc2wol_has_anti_air(world, player)),
+ LocationData("The Dig", "The Dig: Victory", SC2WOL_LOC_ID_OFFSET + 900,
+ lambda state: state._sc2wol_has_common_unit(world, player) and
+ state._sc2wol_has_anti_air(world, player) and
+ state._sc2wol_has_heavy_defense(world, player)),
+ LocationData("The Dig", "The Dig: Left Relic", SC2WOL_LOC_ID_OFFSET + 901,
+ lambda state: state._sc2wol_has_common_unit(world, player)),
+ LocationData("The Dig", "The Dig: Right Ground Relic", SC2WOL_LOC_ID_OFFSET + 902,
+ lambda state: state._sc2wol_has_common_unit(world, player)),
+ LocationData("The Dig", "The Dig: Right Cliff Relic", SC2WOL_LOC_ID_OFFSET + 903,
+ lambda state: state._sc2wol_has_common_unit(world, player)),
+ LocationData("The Dig", "Beat The Dig", None,
+ lambda state: state._sc2wol_has_common_unit(world, player) and
+ state._sc2wol_has_anti_air(world, player) and
+ state._sc2wol_has_heavy_defense(world, player)),
+ LocationData("The Moebius Factor", "The Moebius Factor: Victory", SC2WOL_LOC_ID_OFFSET + 1000,
+ lambda state: state._sc2wol_has_air(world, player)),
+ LocationData("The Moebius Factor", "The Moebius Factor: 1st Data Core ", SC2WOL_LOC_ID_OFFSET + 1001,
+ lambda state: state._sc2wol_has_air(world, player) or True),
+ LocationData("The Moebius Factor", "The Moebius Factor: 2nd Data Core", SC2WOL_LOC_ID_OFFSET + 1002,
+ lambda state: state._sc2wol_has_air(world, player)),
+ LocationData("The Moebius Factor", "The Moebius Factor: South Rescue", SC2WOL_LOC_ID_OFFSET + 1003,
+ lambda state: state._sc2wol_able_to_rescue(world, player) or True),
+ LocationData("The Moebius Factor", "The Moebius Factor: Wall Rescue", SC2WOL_LOC_ID_OFFSET + 1004,
+ lambda state: state._sc2wol_able_to_rescue(world, player) or True),
+ LocationData("The Moebius Factor", "The Moebius Factor: Mid Rescue", SC2WOL_LOC_ID_OFFSET + 1005,
+ lambda state: state._sc2wol_able_to_rescue(world, player) or True),
+ LocationData("The Moebius Factor", "The Moebius Factor: Nydus Roof Rescue", SC2WOL_LOC_ID_OFFSET + 1006,
+ lambda state: state._sc2wol_able_to_rescue(world, player) or True),
+ LocationData("The Moebius Factor", "The Moebius Factor: Alive Inside Rescue", SC2WOL_LOC_ID_OFFSET + 1007,
+ lambda state: state._sc2wol_able_to_rescue(world, player) or True),
+ LocationData("The Moebius Factor", "The Moebius Factor: Brutalisk", SC2WOL_LOC_ID_OFFSET + 1008,
+ lambda state: state._sc2wol_has_air(world, player)),
+ LocationData("The Moebius Factor", "Beat The Moebius Factor", None,
+ lambda state: state._sc2wol_has_air(world, player)),
+ LocationData("Supernova", "Supernova: Victory", SC2WOL_LOC_ID_OFFSET + 1100,
+ lambda state: state._sc2wol_has_common_unit(world, player)),
+ LocationData("Supernova", "Supernova: West Relic", SC2WOL_LOC_ID_OFFSET + 1101),
+ LocationData("Supernova", "Supernova: North Relic", SC2WOL_LOC_ID_OFFSET + 1102,
+ lambda state: state._sc2wol_has_common_unit(world, player)),
+ LocationData("Supernova", "Supernova: South Relic", SC2WOL_LOC_ID_OFFSET + 1103,
+ lambda state: state._sc2wol_has_common_unit(world, player)),
+ LocationData("Supernova", "Supernova: East Relic", SC2WOL_LOC_ID_OFFSET + 1104,
+ lambda state: state._sc2wol_has_common_unit(world, player)),
+ LocationData("Supernova", "Beat Supernova", None,
+ lambda state: state._sc2wol_has_common_unit(world, player)),
+ LocationData("Maw of the Void", "Maw of the Void: Victory", SC2WOL_LOC_ID_OFFSET + 1200,
+ lambda state: state.has('Battlecruiser', player) or state.has('Science Vessel', player) and
+ state._sc2wol_has_air(world, player)),
+ LocationData("Maw of the Void", "Maw of the Void: Landing Zone Cleared", SC2WOL_LOC_ID_OFFSET + 1201),
+ LocationData("Maw of the Void", "Maw of the Void: Expansion Prisoners", SC2WOL_LOC_ID_OFFSET + 1202),
+ LocationData("Maw of the Void", "Maw of the Void: South Close Prisoners", SC2WOL_LOC_ID_OFFSET + 1203,
+ lambda state: state.has('Battlecruiser', player) or state.has('Science Vessel', player) and
+ state._sc2wol_has_air(world, player)),
+ LocationData("Maw of the Void", "Maw of the Void: South Far Prisoners", SC2WOL_LOC_ID_OFFSET + 1204,
+ lambda state: state.has('Battlecruiser', player) or state.has('Science Vessel', player) and
+ state._sc2wol_has_air(world, player)),
+ LocationData("Maw of the Void", "Maw of the Void: North Prisoners", SC2WOL_LOC_ID_OFFSET + 1205,
+ lambda state: state.has('Battlecruiser', player) or state.has('Science Vessel', player) and
+ state._sc2wol_has_air(world, player)),
+ LocationData("Maw of the Void", "Beat Maw of the Void", None,
+ lambda state: state.has('Battlecruiser', player) or state.has('Science Vessel', player) and
+ state._sc2wol_has_air(world, player)),
+ LocationData("Devil's Playground", "Devil's Playground: Victory", SC2WOL_LOC_ID_OFFSET + 1300,
+ lambda state: state._sc2wol_has_common_unit(world, player) or state.has("Reaper", player)),
+ LocationData("Devil's Playground", "Devil's Playground: Tosh's Miners", SC2WOL_LOC_ID_OFFSET + 1301),
+ LocationData("Devil's Playground", "Devil's Playground: Brutalisk", SC2WOL_LOC_ID_OFFSET + 1302,
+ lambda state: state._sc2wol_has_common_unit(world, player) or state.has("Reaper", player)),
+ LocationData("Devil's Playground", "Beat Devil's Playground", None,
+ lambda state: state._sc2wol_has_common_unit(world, player) or state.has("Reaper", player)),
+ LocationData("Welcome to the Jungle", "Welcome to the Jungle: Victory", SC2WOL_LOC_ID_OFFSET + 1400,
+ lambda state: state._sc2wol_has_common_unit(world, player) and
+ state._sc2wol_has_mobile_anti_air(world, player)),
+ LocationData("Welcome to the Jungle", "Welcome to the Jungle: Close Relic", SC2WOL_LOC_ID_OFFSET + 1401),
+ LocationData("Welcome to the Jungle", "Welcome to the Jungle: West Relic", SC2WOL_LOC_ID_OFFSET + 1402,
+ lambda state: state._sc2wol_has_common_unit(world, player) and
+ state._sc2wol_has_mobile_anti_air(world, player)),
+ LocationData("Welcome to the Jungle", "Welcome to the Jungle: North-East Relic", SC2WOL_LOC_ID_OFFSET + 1403,
+ lambda state: state._sc2wol_has_common_unit(world, player) and
+ state._sc2wol_has_mobile_anti_air(world, player)),
+ LocationData("Welcome to the Jungle", "Beat Welcome to the Jungle", None,
+ lambda state: state._sc2wol_has_common_unit(world, player) and
+ state._sc2wol_has_mobile_anti_air(world, player)),
+ LocationData("Breakout", "Breakout: Victory", SC2WOL_LOC_ID_OFFSET + 1500),
+ LocationData("Breakout", "Breakout: Diamondback Prison", SC2WOL_LOC_ID_OFFSET + 1501),
+ LocationData("Breakout", "Breakout: Siegetank Prison", SC2WOL_LOC_ID_OFFSET + 1502),
+ LocationData("Breakout", "Beat Breakout", None),
+ LocationData("Ghost of a Chance", "Ghost of a Chance: Victory", SC2WOL_LOC_ID_OFFSET + 1600),
+ LocationData("Ghost of a Chance", "Ghost of a Chance: Terrazine Tank", SC2WOL_LOC_ID_OFFSET + 1601),
+ LocationData("Ghost of a Chance", "Ghost of a Chance: Jorium Stockpile", SC2WOL_LOC_ID_OFFSET + 1602),
+ LocationData("Ghost of a Chance", "Ghost of a Chance: First Island Spectres", SC2WOL_LOC_ID_OFFSET + 1603),
+ LocationData("Ghost of a Chance", "Ghost of a Chance: Second Island Spectres", SC2WOL_LOC_ID_OFFSET + 1604),
+ LocationData("Ghost of a Chance", "Ghost of a Chance: Third Island Spectres", SC2WOL_LOC_ID_OFFSET + 1605),
+ LocationData("Ghost of a Chance", "Beat Ghost of a Chance", None),
+ LocationData("The Great Train Robbery", "The Great Train Robbery: Victory", SC2WOL_LOC_ID_OFFSET + 1700,
+ lambda state: state._sc2wol_has_train_killers(world, player)),
+ LocationData("The Great Train Robbery", "The Great Train Robbery: North Defiler", SC2WOL_LOC_ID_OFFSET + 1701),
+ LocationData("The Great Train Robbery", "The Great Train Robbery: Mid Defiler", SC2WOL_LOC_ID_OFFSET + 1702),
+ LocationData("The Great Train Robbery", "The Great Train Robbery: South Defiler", SC2WOL_LOC_ID_OFFSET + 1703),
+ LocationData("The Great Train Robbery", "Beat The Great Train Robbery", None,
+ lambda state: state._sc2wol_has_train_killers(world, player)),
+ LocationData("Cutthroat", "Cutthroat: Victory", SC2WOL_LOC_ID_OFFSET + 1800,
+ lambda state: state._sc2wol_has_common_unit(world, player)),
+ LocationData("Cutthroat", "Cutthroat: Mira Han", SC2WOL_LOC_ID_OFFSET + 1801,
+ lambda state: state._sc2wol_has_common_unit(world, player)),
+ LocationData("Cutthroat", "Cutthroat: North Relic", SC2WOL_LOC_ID_OFFSET + 1802,
+ lambda state: state._sc2wol_has_common_unit(world, player)),
+ LocationData("Cutthroat", "Cutthroat: Mid Relic", SC2WOL_LOC_ID_OFFSET + 1803),
+ LocationData("Cutthroat", "Cutthroat: Southwest Relic", SC2WOL_LOC_ID_OFFSET + 1804,
+ lambda state: state._sc2wol_has_common_unit(world, player)),
+ LocationData("Cutthroat", "Beat Cutthroat", None,
+ lambda state: state._sc2wol_has_common_unit(world, player)),
+ LocationData("Engine of Destruction", "Engine of Destruction: Victory", SC2WOL_LOC_ID_OFFSET + 1900,
+ lambda state: state._sc2wol_has_mobile_anti_air(world, player)),
+ LocationData("Engine of Destruction", "Engine of Destruction: Odin", SC2WOL_LOC_ID_OFFSET + 1901),
+ LocationData("Engine of Destruction", "Engine of Destruction: Loki", SC2WOL_LOC_ID_OFFSET + 1902,
+ lambda state: state._sc2wol_has_mobile_anti_air(world, player) and
+ state._sc2wol_has_common_unit(world, player) or state.has('Wraith', player)),
+ LocationData("Engine of Destruction", "Engine of Destruction: Lab Devourer", SC2WOL_LOC_ID_OFFSET + 1903),
+ LocationData("Engine of Destruction", "Engine of Destruction: North Devourer", SC2WOL_LOC_ID_OFFSET + 1904,
+ lambda state: state._sc2wol_has_mobile_anti_air(world, player) and
+ state._sc2wol_has_common_unit(world, player) or state.has('Wraith', player)),
+ LocationData("Engine of Destruction", "Engine of Destruction: Southeast Devourer", SC2WOL_LOC_ID_OFFSET + 1905,
+ lambda state: state._sc2wol_has_mobile_anti_air(world, player) and
+ state._sc2wol_has_common_unit(world, player) or state.has('Wraith', player)),
+ LocationData("Engine of Destruction", "Beat Engine of Destruction", None,
+ lambda state: state._sc2wol_has_mobile_anti_air(world, player) and
+ state._sc2wol_has_common_unit(world, player) or state.has('Wraith', player)),
+ LocationData("Media Blitz", "Media Blitz: Victory", SC2WOL_LOC_ID_OFFSET + 2000,
+ lambda state: state._sc2wol_has_competent_comp(world, player)),
+ LocationData("Media Blitz", "Media Blitz: Tower 1", SC2WOL_LOC_ID_OFFSET + 2001,
+ lambda state: state._sc2wol_has_competent_comp(world, player)),
+ LocationData("Media Blitz", "Media Blitz: Tower 2", SC2WOL_LOC_ID_OFFSET + 2002,
+ lambda state: state._sc2wol_has_competent_comp(world, player)),
+ LocationData("Media Blitz", "Media Blitz: Tower 3", SC2WOL_LOC_ID_OFFSET + 2003,
+ lambda state: state._sc2wol_has_competent_comp(world, player)),
+ LocationData("Media Blitz", "Media Blitz: Science Facility", SC2WOL_LOC_ID_OFFSET + 2004),
+ LocationData("Media Blitz", "Beat Media Blitz", None,
+ lambda state: state._sc2wol_has_competent_comp(world, player)),
+ LocationData("Piercing the Shroud", "Piercing the Shroud: Victory", SC2WOL_LOC_ID_OFFSET + 2100),
+ LocationData("Piercing the Shroud", "Piercing the Shroud: Holding Cell Relic", SC2WOL_LOC_ID_OFFSET + 2101),
+ LocationData("Piercing the Shroud", "Piercing the Shroud: Brutalisk Relic", SC2WOL_LOC_ID_OFFSET + 2102),
+ LocationData("Piercing the Shroud", "Piercing the Shroud: First Escape Relic", SC2WOL_LOC_ID_OFFSET + 2103),
+ LocationData("Piercing the Shroud", "Piercing the Shroud: Second Escape Relic", SC2WOL_LOC_ID_OFFSET + 2104),
+ LocationData("Piercing the Shroud", "Piercing the Shroud: Brutalisk ", SC2WOL_LOC_ID_OFFSET + 2105),
+ LocationData("Piercing the Shroud", "Beat Piercing the Shroud", None),
+ LocationData("Whispers of Doom", "Whispers of Doom: Victory", SC2WOL_LOC_ID_OFFSET + 2200),
+ LocationData("Whispers of Doom", "Whispers of Doom: First Hatchery", SC2WOL_LOC_ID_OFFSET + 2201),
+ LocationData("Whispers of Doom", "Whispers of Doom: Second Hatchery", SC2WOL_LOC_ID_OFFSET + 2202),
+ LocationData("Whispers of Doom", "Whispers of Doom: Third Hatchery", SC2WOL_LOC_ID_OFFSET + 2203),
+ LocationData("Whispers of Doom", "Beat Whispers of Doom", None),
+ LocationData("A Sinister Turn", "A Sinister Turn: Victory", SC2WOL_LOC_ID_OFFSET + 2300,
+ lambda state: state._sc2wol_has_protoss_medium_units(world, player)),
+ LocationData("A Sinister Turn", "A Sinister Turn: Robotics Facility", SC2WOL_LOC_ID_OFFSET + 2301),
+ LocationData("A Sinister Turn", "A Sinister Turn: Dark Shrine", SC2WOL_LOC_ID_OFFSET + 2302),
+ LocationData("A Sinister Turn", "A Sinister Turn: Templar Archives", SC2WOL_LOC_ID_OFFSET + 2303,
+ lambda state: state._sc2wol_has_protoss_common_units(world, player)),
+ LocationData("A Sinister Turn", "Beat A Sinister Turn", None,
+ lambda state: state._sc2wol_has_protoss_medium_units(world, player)),
+ LocationData("Echoes of the Future", "Echoes of the Future: Victory", SC2WOL_LOC_ID_OFFSET + 2400,
+ lambda state: state._sc2wol_has_protoss_medium_units(world, player)),
+ LocationData("Echoes of the Future", "Echoes of the Future: Close Obelisk", SC2WOL_LOC_ID_OFFSET + 2401),
+ LocationData("Echoes of the Future", "Echoes of the Future: West Obelisk", SC2WOL_LOC_ID_OFFSET + 2402,
+ lambda state: state._sc2wol_has_protoss_common_units(world, player)),
+ LocationData("Echoes of the Future", "Beat Echoes of the Future", None,
+ lambda state: state._sc2wol_has_protoss_medium_units(world, player)),
+ LocationData("In Utter Darkness", "In Utter Darkness: Defeat", SC2WOL_LOC_ID_OFFSET + 2500,
+ lambda state: state._sc2wol_has_protoss_medium_units(world, player)),
+ LocationData("In Utter Darkness", "In Utter Darkness: Protoss Archive", SC2WOL_LOC_ID_OFFSET + 2501,
+ lambda state: state._sc2wol_has_protoss_medium_units(world, player)),
+ LocationData("In Utter Darkness", "In Utter Darkness: Kills", SC2WOL_LOC_ID_OFFSET + 2502),
+ LocationData("In Utter Darkness", "Beat In Utter Darkness", None,
+ lambda state: state._sc2wol_has_protoss_medium_units(world, player)),
+ LocationData("Gates of Hell", "Gates of Hell: Victory", SC2WOL_LOC_ID_OFFSET + 2600,
+ lambda state: state._sc2wol_has_competent_comp(world, player)),
+ LocationData("Gates of Hell", "Gates of Hell: Large Army", SC2WOL_LOC_ID_OFFSET + 2601,
+ lambda state: state._sc2wol_has_competent_comp(world, player)),
+ LocationData("Gates of Hell", "Beat Gates of Hell", None),
+ LocationData("Belly of the Beast", "Belly of the Beast: Victory", SC2WOL_LOC_ID_OFFSET + 2700),
+ LocationData("Belly of the Beast", "Belly of the Beast: First Charge", SC2WOL_LOC_ID_OFFSET + 2701),
+ LocationData("Belly of the Beast", "Belly of the Beast: Second Charge", SC2WOL_LOC_ID_OFFSET + 2702),
+ LocationData("Belly of the Beast", "Belly of the Beast: Third Charge", SC2WOL_LOC_ID_OFFSET + 2703),
+ LocationData("Belly of the Beast", "Beat Belly of the Beast", None),
+ LocationData("Shatter the Sky", "Shatter the Sky: Victory", SC2WOL_LOC_ID_OFFSET + 2800,
+ lambda state: state._sc2wol_has_competent_comp(world, player)),
+ LocationData("Shatter the Sky", "Shatter the Sky: Close Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2801,
+ lambda state: state._sc2wol_has_competent_comp(world, player)),
+ LocationData("Shatter the Sky", "Shatter the Sky: Northwest Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2802,
+ lambda state: state._sc2wol_has_competent_comp(world, player)),
+ LocationData("Shatter the Sky", "Shatter the Sky: Southeast Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2803,
+ lambda state: state._sc2wol_has_competent_comp(world, player)),
+ LocationData("Shatter the Sky", "Shatter the Sky: Southwest Coolant Tower", SC2WOL_LOC_ID_OFFSET + 2804,
+ lambda state: state._sc2wol_has_competent_comp(world, player)),
+ LocationData("Shatter the Sky", "Shatter the Sky: Leviathan", SC2WOL_LOC_ID_OFFSET + 2805,
+ lambda state: state._sc2wol_has_competent_comp(world, player)),
+ LocationData("Shatter the Sky", "Beat Shatter the Sky", None,
+ lambda state: state._sc2wol_has_competent_comp(world, player)),
+ LocationData("All-In", "All-In: Victory", None)
+ ]
+
+ return tuple(location_table)
diff --git a/worlds/sc2wol/LogicMixin.py b/worlds/sc2wol/LogicMixin.py
new file mode 100644
index 0000000000..7e2fc2f0e8
--- /dev/null
+++ b/worlds/sc2wol/LogicMixin.py
@@ -0,0 +1,52 @@
+from BaseClasses import MultiWorld
+from ..AutoWorld import LogicMixin
+
+
+class SC2WoLLogic(LogicMixin):
+ def _sc2wol_has_common_unit(self, world: MultiWorld, player: int) -> bool:
+ return self.has_any({'Marine', 'Marauder', 'Firebat', 'Hellion', 'Vulture'}, player)
+
+ def _sc2wol_has_bunker_unit(self, world: MultiWorld, player: int) -> bool:
+ return self.has_any({'Marine', 'Marauder'}, player)
+
+ def _sc2wol_has_air(self, world: MultiWorld, player: int) -> bool:
+ return self.has_any({'Viking', 'Wraith', 'Medivac', 'Banshee', 'Hercules'}, player)
+
+ def _sc2wol_has_air_anti_air(self, world: MultiWorld, player: int) -> bool:
+ return self.has_any({'Viking', 'Wraith'}, player)
+
+ def _sc2wol_has_mobile_anti_air(self, world: MultiWorld, player: int) -> bool:
+ return self.has_any({'Marine', 'Goliath'}, player) or self._sc2wol_has_air_anti_air(world, player)
+
+ def _sc2wol_has_anti_air(self, world: MultiWorld, player: int) -> bool:
+ return self.has('Missile Turret', player) or self._sc2wol_has_mobile_anti_air(world, player)
+
+ def _sc2wol_has_heavy_defense(self, world: MultiWorld, player: int) -> bool:
+ return (self.has_any({'Siege Tank', 'Vulture'}, player) or
+ self.has('Bunker', player) and self._sc2wol_has_bunker_unit(world, player)) and \
+ self._sc2wol_has_anti_air(world, player)
+
+ def _sc2wol_has_competent_comp(self, world: MultiWorld, player: int) -> bool:
+ return (self.has('Marine', player) or self.has('Marauder', player) and
+ self._sc2wol_has_mobile_anti_air(world, player)) and self.has_any({'Medivac', 'Medic'}, player) or \
+ self.has('Thor', player) or self.has("Banshee", player) and self._sc2wol_has_mobile_anti_air(world, player) or \
+ self.has('Battlecruiser', player) and self._sc2wol_has_common_unit(world, player)
+
+ def _sc2wol_has_train_killers(self, world: MultiWorld, player: int) -> bool:
+ return (self.has_any({'Siege Tank', 'Diamondback'}, player) or
+ self.has_all({'Reaper', "G-4 Clusterbomb"}, player) or self.has_all({'Spectre', 'Psionic Lash'}, player))
+
+ def _sc2wol_able_to_rescue(self, world: MultiWorld, player: int) -> bool:
+ return self.has_any({'Medivac', 'Hercules', 'Raven', 'Orbital Strike'}, player)
+
+ def _sc2wol_has_protoss_common_units(self, world: MultiWorld, player: int) -> bool:
+ return self.has_any({'Zealot', 'Immortal', 'Stalker', 'Dark Templar'}, player)
+
+ def _sc2wol_has_protoss_medium_units(self, world: MultiWorld, player: int) -> bool:
+ return self._sc2wol_has_protoss_common_units(world, player) and \
+ self.has_any({'Stalker', 'Void Ray', 'Phoenix', 'Carrier'}, player)
+
+ def _sc2wol_cleared_missions(self, world: MultiWorld, player: int, mission_count: int) -> bool:
+ return self.has_group("Missions", player, mission_count)
+
+
diff --git a/worlds/sc2wol/MissionTables.py b/worlds/sc2wol/MissionTables.py
new file mode 100644
index 0000000000..92a7189d4a
--- /dev/null
+++ b/worlds/sc2wol/MissionTables.py
@@ -0,0 +1,99 @@
+from typing import NamedTuple, Dict, List
+
+no_build_regions_list = ["Liberation Day", "Breakout", "Ghost of a Chance", "Piercing the Shroud", "Whispers of Doom",
+ "Belly of the Beast"]
+easy_regions_list = ["The Outlaws", "Zero Hour", "Evacuation", "Outbreak", "Smash and Grab", "Devil's Playground"]
+medium_regions_list = ["Safe Haven", "Haven's Fall", "The Dig", "The Moebius Factor", "Supernova",
+ "Welcome to the Jungle", "The Great Train Robbery", "Cutthroat", "Media Blitz",
+ "A Sinister Turn", "Echoes of the Future"]
+hard_regions_list = ["Maw of the Void", "Engine of Destruction", "In Utter Darkness", "Gates of Hell",
+ "Shatter the Sky"]
+
+
+class MissionInfo(NamedTuple):
+ id: int
+ extra_locations: int
+ required_world: List[int]
+ category: str
+ number: int = 0 # number of worlds need beaten
+ completion_critical: bool = False # missions needed to beat game
+ or_requirements: bool = False # true if the requirements should be or-ed instead of and-ed
+
+
+class FillMission(NamedTuple):
+ type: str
+ connect_to: List[int] # -1 connects to Menu
+ category: str
+ number: int = 0 # number of worlds need beaten
+ completion_critical: bool = False # missions needed to beat game
+ or_requirements: bool = False # true if the requirements should be or-ed instead of and-ed
+
+
+
+vanilla_shuffle_order = [
+ FillMission("no_build", [-1], "Mar Sara", completion_critical=True),
+ FillMission("easy", [0], "Mar Sara", completion_critical=True),
+ FillMission("easy", [1], "Mar Sara", completion_critical=True),
+ FillMission("easy", [2], "Colonist"),
+ FillMission("medium", [3], "Colonist"),
+ FillMission("hard", [4], "Colonist", number=7),
+ FillMission("hard", [4], "Colonist", number=7),
+ FillMission("easy", [2], "Artifact", completion_critical=True),
+ FillMission("medium", [7], "Artifact", number=8, completion_critical=True),
+ FillMission("hard", [8], "Artifact", number=11, completion_critical=True),
+ FillMission("hard", [9], "Artifact", number=14, completion_critical=True),
+ FillMission("hard", [10], "Artifact", completion_critical=True),
+ FillMission("medium", [2], "Covert", number=4),
+ FillMission("medium", [12], "Covert"),
+ FillMission("hard", [13], "Covert", number=8),
+ FillMission("hard", [13], "Covert", number=8),
+ FillMission("medium", [2], "Rebellion", number=6),
+ FillMission("hard", [16], "Rebellion"),
+ FillMission("hard", [17], "Rebellion"),
+ FillMission("hard", [18], "Rebellion"),
+ FillMission("hard", [19], "Rebellion"),
+ FillMission("medium", [8], "Prophecy"),
+ FillMission("hard", [21], "Prophecy"),
+ FillMission("hard", [22], "Prophecy"),
+ FillMission("hard", [23], "Prophecy"),
+ FillMission("hard", [11], "Char", completion_critical=True),
+ FillMission("hard", [25], "Char", completion_critical=True),
+ FillMission("hard", [25], "Char", completion_critical=True),
+ FillMission("all_in", [26, 27], "Char", completion_critical=True, or_requirements=True)
+]
+
+
+vanilla_mission_req_table = {
+ "Liberation Day": MissionInfo(1, 7, [], "Mar Sara", completion_critical=True),
+ "The Outlaws": MissionInfo(2, 2, [1], "Mar Sara", completion_critical=True),
+ "Zero Hour": MissionInfo(3, 4, [2], "Mar Sara", completion_critical=True),
+ "Evacuation": MissionInfo(4, 4, [3], "Colonist"),
+ "Outbreak": MissionInfo(5, 3, [4], "Colonist"),
+ "Safe Haven": MissionInfo(6, 1, [5], "Colonist", number=7),
+ "Haven's Fall": MissionInfo(7, 1, [5], "Colonist", number=7),
+ "Smash and Grab": MissionInfo(8, 5, [3], "Artifact", completion_critical=True),
+ "The Dig": MissionInfo(9, 4, [8], "Artifact", number=8, completion_critical=True),
+ "The Moebius Factor": MissionInfo(10, 9, [9], "Artifact", number=11, completion_critical=True),
+ "Supernova": MissionInfo(11, 5, [10], "Artifact", number=14, completion_critical=True),
+ "Maw of the Void": MissionInfo(12, 6, [11], "Artifact", completion_critical=True),
+ "Devil's Playground": MissionInfo(13, 3, [3], "Covert", number=4),
+ "Welcome to the Jungle": MissionInfo(14, 4, [13], "Covert"),
+ "Breakout": MissionInfo(15, 3, [14], "Covert", number=8),
+ "Ghost of a Chance": MissionInfo(16, 6, [14], "Covert", number=8),
+ "The Great Train Robbery": MissionInfo(17, 4, [3], "Rebellion", number=6),
+ "Cutthroat": MissionInfo(18, 5, [17], "Rebellion"),
+ "Engine of Destruction": MissionInfo(19, 6, [18], "Rebellion"),
+ "Media Blitz": MissionInfo(20, 5, [19], "Rebellion"),
+ "Piercing the Shroud": MissionInfo(21, 6, [20], "Rebellion"),
+ "Whispers of Doom": MissionInfo(22, 4, [9], "Prophecy"),
+ "A Sinister Turn": MissionInfo(23, 4, [22], "Prophecy"),
+ "Echoes of the Future": MissionInfo(24, 3, [23], "Prophecy"),
+ "In Utter Darkness": MissionInfo(25, 3, [24], "Prophecy"),
+ "Gates of Hell": MissionInfo(26, 2, [12], "Char", completion_critical=True),
+ "Belly of the Beast": MissionInfo(27, 4, [26], "Char", completion_critical=True),
+ "Shatter the Sky": MissionInfo(28, 5, [26], "Char", completion_critical=True),
+ "All-In": MissionInfo(29, -1, [27, 28], "Char", completion_critical=True, or_requirements=True)
+}
+
+lookup_id_to_mission: Dict[int, str] = {
+ data.id: mission_name for mission_name, data in vanilla_mission_req_table.items() if data.id}
diff --git a/worlds/sc2wol/Options.py b/worlds/sc2wol/Options.py
new file mode 100644
index 0000000000..fe05af2838
--- /dev/null
+++ b/worlds/sc2wol/Options.py
@@ -0,0 +1,69 @@
+from typing import Dict
+from BaseClasses import MultiWorld
+from Options import Choice, Option, DefaultOnToggle
+
+
+class GameDifficulty(Choice):
+ """The difficulty of the campaign, affects enemy AI, starting units, and game speed."""
+ display_name = "Game Difficulty"
+ option_casual = 0
+ option_normal = 1
+ option_hard = 2
+ option_brutal = 3
+
+
+class UpgradeBonus(Choice):
+ """Determines what lab upgrade to use, whether it is Ultra-Capacitors which boost attack speed with every weapon upgrade
+ or Vanadium Plating which boosts life with every armor upgrade."""
+ display_name = "Upgrade Bonus"
+ option_ultra_capacitors = 0
+ option_vanadium_plating = 1
+
+
+class BunkerUpgrade(Choice):
+ """Determines what bunker lab upgrade to use, whether it is Shrike Turret which outfits bunkers with an automated turret or
+ Fortified Bunker which boosts the life of bunkers."""
+ display_name = "Bunker Upgrade"
+ option_shrike_turret = 0
+ option_fortified_bunker = 1
+
+
+class AllInMap(Choice):
+ """Determines what version of All-In (final map) that will be generated for the campaign."""
+ display_name = "All In Map"
+ option_ground = 0
+ option_air = 1
+
+
+class MissionOrder(Choice):
+ """Determines the order the missions are played in.
+ Vanilla: Keeps the standard mission order and branching from the WoL Campaign.
+ Vanilla Shuffled: Keeps same branching paths from the WoL Campaign but randomizes the order of missions within"""
+ display_name = "Mission Order"
+ option_vanilla = 0
+ option_vanilla_shuffled = 1
+
+class ShuffleProtoss(DefaultOnToggle):
+ """Determines if the 3 protoss missions are included in the shuffle if Vanilla Shuffled is enabled. If this is
+ not the 3 protoss missions will stay in their vanilla order in the mission order making them optional to complete
+ the game."""
+ display_name = "Shuffle Protoss Missions"
+
+# noinspection PyTypeChecker
+sc2wol_options: Dict[str, Option] = {
+ "game_difficulty": GameDifficulty,
+ "upgrade_bonus": UpgradeBonus,
+ "bunker_upgrade": BunkerUpgrade,
+ "all_in_map": AllInMap,
+ "mission_order": MissionOrder,
+ "shuffle_protoss": ShuffleProtoss
+}
+
+
+def get_option_value(world: MultiWorld, player: int, name: str) -> int:
+ option = getattr(world, name, None)
+
+ if option == None:
+ return 0
+
+ return int(option[player].value)
diff --git a/worlds/sc2wol/Regions.py b/worlds/sc2wol/Regions.py
new file mode 100644
index 0000000000..003037dc89
--- /dev/null
+++ b/worlds/sc2wol/Regions.py
@@ -0,0 +1,278 @@
+from typing import List, Set, Dict, Tuple, Optional, Callable, NamedTuple
+from BaseClasses import MultiWorld, Region, Entrance, Location, RegionType
+from .Locations import LocationData
+from .Options import get_option_value
+from worlds.sc2wol.MissionTables import MissionInfo, vanilla_shuffle_order, vanilla_mission_req_table, \
+ no_build_regions_list, easy_regions_list, medium_regions_list, hard_regions_list
+import random
+
+
+def create_regions(world: MultiWorld, player: int, locations: Tuple[LocationData, ...], location_cache: List[Location]):
+ locations_per_region = get_locations_per_region(locations)
+
+ regions = [
+ create_region(world, player, locations_per_region, location_cache, "Menu"),
+ create_region(world, player, locations_per_region, location_cache, "Liberation Day"),
+ create_region(world, player, locations_per_region, location_cache, "The Outlaws"),
+ create_region(world, player, locations_per_region, location_cache, "Zero Hour"),
+ create_region(world, player, locations_per_region, location_cache, "Evacuation"),
+ create_region(world, player, locations_per_region, location_cache, "Outbreak"),
+ create_region(world, player, locations_per_region, location_cache, "Safe Haven"),
+ create_region(world, player, locations_per_region, location_cache, "Haven's Fall"),
+ create_region(world, player, locations_per_region, location_cache, "Smash and Grab"),
+ create_region(world, player, locations_per_region, location_cache, "The Dig"),
+ create_region(world, player, locations_per_region, location_cache, "The Moebius Factor"),
+ create_region(world, player, locations_per_region, location_cache, "Supernova"),
+ create_region(world, player, locations_per_region, location_cache, "Maw of the Void"),
+ create_region(world, player, locations_per_region, location_cache, "Devil's Playground"),
+ create_region(world, player, locations_per_region, location_cache, "Welcome to the Jungle"),
+ create_region(world, player, locations_per_region, location_cache, "Breakout"),
+ create_region(world, player, locations_per_region, location_cache, "Ghost of a Chance"),
+ create_region(world, player, locations_per_region, location_cache, "The Great Train Robbery"),
+ create_region(world, player, locations_per_region, location_cache, "Cutthroat"),
+ create_region(world, player, locations_per_region, location_cache, "Engine of Destruction"),
+ create_region(world, player, locations_per_region, location_cache, "Media Blitz"),
+ create_region(world, player, locations_per_region, location_cache, "Piercing the Shroud"),
+ create_region(world, player, locations_per_region, location_cache, "Whispers of Doom"),
+ create_region(world, player, locations_per_region, location_cache, "A Sinister Turn"),
+ create_region(world, player, locations_per_region, location_cache, "Echoes of the Future"),
+ create_region(world, player, locations_per_region, location_cache, "In Utter Darkness"),
+ create_region(world, player, locations_per_region, location_cache, "Gates of Hell"),
+ create_region(world, player, locations_per_region, location_cache, "Belly of the Beast"),
+ create_region(world, player, locations_per_region, location_cache, "Shatter the Sky"),
+ create_region(world, player, locations_per_region, location_cache, "All-In")
+ ]
+
+ if __debug__:
+ throwIfAnyLocationIsNotAssignedToARegion(regions, locations_per_region.keys())
+
+ world.regions += regions
+
+ names: Dict[str, int] = {}
+
+ if get_option_value(world, player, "mission_order") == 0:
+ connect(world, player, names, 'Menu', 'Liberation Day'),
+ connect(world, player, names, 'Liberation Day', 'The Outlaws',
+ lambda state: state.has("Beat Liberation Day", player)),
+ connect(world, player, names, 'The Outlaws', 'Zero Hour',
+ lambda state: state.has("Beat The Outlaws", player)),
+ connect(world, player, names, 'Zero Hour', 'Evacuation',
+ lambda state: state.has("Beat Zero Hour", player)),
+ connect(world, player, names, 'Evacuation', 'Outbreak',
+ lambda state: state.has("Beat Evacuation", player)),
+ connect(world, player, names, "Outbreak", "Safe Haven",
+ lambda state: state._sc2wol_cleared_missions(world, player, 7) and
+ state.has("Beat Outbreak", player)),
+ connect(world, player, names, "Outbreak", "Haven's Fall",
+ lambda state: state._sc2wol_cleared_missions(world, player, 7) and
+ state.has("Beat Outbreak", player)),
+ connect(world, player, names, 'Zero Hour', 'Smash and Grab',
+ lambda state: state.has("Beat Zero Hour", player)),
+ connect(world, player, names, 'Smash and Grab', 'The Dig',
+ lambda state: state._sc2wol_cleared_missions(world, player, 8) and
+ state.has("Beat Smash and Grab", player)),
+ connect(world, player, names, 'The Dig', 'The Moebius Factor',
+ lambda state: state._sc2wol_cleared_missions(world, player, 11) and
+ state.has("Beat The Dig", player)),
+ connect(world, player, names, 'The Moebius Factor', 'Supernova',
+ lambda state: state._sc2wol_cleared_missions(world, player, 14) and
+ state.has("Beat The Moebius Factor", player)),
+ connect(world, player, names, 'Supernova', 'Maw of the Void',
+ lambda state: state.has("Beat Supernova", player)),
+ connect(world, player, names, 'Zero Hour', "Devil's Playground",
+ lambda state: state._sc2wol_cleared_missions(world, player, 4) and
+ state.has("Beat Zero Hour", player)),
+ connect(world, player, names, "Devil's Playground", 'Welcome to the Jungle',
+ lambda state: state.has("Beat Devil's Playground", player)),
+ connect(world, player, names, "Welcome to the Jungle", 'Breakout',
+ lambda state: state._sc2wol_cleared_missions(world, player, 8) and
+ state.has("Beat Welcome to the Jungle", player)),
+ connect(world, player, names, "Welcome to the Jungle", 'Ghost of a Chance',
+ lambda state: state._sc2wol_cleared_missions(world, player, 8) and
+ state.has("Beat Welcome to the Jungle", player)),
+ connect(world, player, names, "Zero Hour", 'The Great Train Robbery',
+ lambda state: state._sc2wol_cleared_missions(world, player, 6) and
+ state.has("Beat Zero Hour", player)),
+ connect(world, player, names, 'The Great Train Robbery', 'Cutthroat',
+ lambda state: state.has("Beat The Great Train Robbery", player)),
+ connect(world, player, names, 'Cutthroat', 'Engine of Destruction',
+ lambda state: state.has("Beat Cutthroat", player)),
+ connect(world, player, names, 'Engine of Destruction', 'Media Blitz',
+ lambda state: state.has("Beat Engine of Destruction", player)),
+ connect(world, player, names, 'Media Blitz', 'Piercing the Shroud',
+ lambda state: state.has("Beat Media Blitz", player)),
+ connect(world, player, names, 'The Dig', 'Whispers of Doom',
+ lambda state: state.has("Beat The Dig", player)),
+ connect(world, player, names, 'Whispers of Doom', 'A Sinister Turn',
+ lambda state: state.has("Beat Whispers of Doom", player)),
+ connect(world, player, names, 'A Sinister Turn', 'Echoes of the Future',
+ lambda state: state.has("Beat A Sinister Turn", player)),
+ connect(world, player, names, 'Echoes of the Future', 'In Utter Darkness',
+ lambda state: state.has("Beat Echoes of the Future", player)),
+ connect(world, player, names, 'Maw of the Void', 'Gates of Hell',
+ lambda state: state.has("Beat Maw of the Void", player)),
+ connect(world, player, names, 'Gates of Hell', 'Belly of the Beast',
+ lambda state: state.has("Beat Gates of Hell", player)),
+ connect(world, player, names, 'Gates of Hell', 'Shatter the Sky',
+ lambda state: state.has("Beat Gates of Hell", player)),
+ connect(world, player, names, 'Gates of Hell', 'All-In',
+ lambda state: state.has('Beat Gates of Hell', player) and (
+ state.has('Beat Shatter the Sky', player) or state.has('Beat Belly of the Beast', player)))
+
+ return vanilla_mission_req_table
+
+ elif get_option_value(world, player, "mission_order") == 1:
+ missions = []
+ no_build_pool = no_build_regions_list[:]
+ easy_pool = easy_regions_list[:]
+ medium_pool = medium_regions_list[:]
+ hard_pool = hard_regions_list[:]
+
+ # Initial fill out of mission list and marking all-in mission
+ for mission in vanilla_shuffle_order:
+ if mission.type == "all_in":
+ missions.append("All-In")
+ else:
+ missions.append(mission.type)
+
+ # Place Protoss Missions if we are not using ShuffleProtoss
+ if get_option_value(world, player, "shuffle_protoss") == 0:
+ missions[22] = "A Sinister Turn"
+ medium_pool.remove("A Sinister Turn")
+ missions[23] = "Echoes of the Future"
+ medium_pool.remove("Echoes of the Future")
+ missions[24] = "In Utter Darkness"
+ hard_pool.remove("In Utter Darkness")
+
+ no_build_slots = []
+ easy_slots = []
+ medium_slots = []
+ hard_slots = []
+
+ # Search through missions to find slots needed to fill
+ for i in range(len(missions)):
+ if missions[i] == "no_build":
+ no_build_slots.append(i)
+ elif missions[i] == "easy":
+ easy_slots.append(i)
+ elif missions[i] == "medium":
+ medium_slots.append(i)
+ elif missions[i] == "hard":
+ hard_slots.append(i)
+
+ # Add no_build missions to the pool and fill in no_build slots
+ missions_to_add = no_build_pool
+ for slot in no_build_slots:
+ filler = random.randint(0, len(missions_to_add)-1)
+
+ missions[slot] = missions_to_add.pop(filler)
+
+ # Add easy missions into pool and fill in easy slots
+ missions_to_add = missions_to_add + easy_pool
+ for slot in easy_slots:
+ filler = random.randint(0, len(missions_to_add) - 1)
+
+ missions[slot] = missions_to_add.pop(filler)
+
+ # Add medium missions into pool and fill in medium slots
+ missions_to_add = missions_to_add + medium_pool
+ for slot in medium_slots:
+ filler = random.randint(0, len(missions_to_add) - 1)
+
+ missions[slot] = missions_to_add.pop(filler)
+
+ # Add hard missions into pool and fill in hard slots
+ missions_to_add = missions_to_add + hard_pool
+ for slot in hard_slots:
+ filler = random.randint(0, len(missions_to_add) - 1)
+
+ missions[slot] = missions_to_add.pop(filler)
+
+ # Loop through missions to create requirements table and connect regions
+ # TODO: Handle 'and' connections
+ mission_req_table = {}
+ for i in range(len(missions)):
+ connections = []
+ for connection in vanilla_shuffle_order[i].connect_to:
+ if connection == -1:
+ connect(world, player, names, "Menu", missions[i])
+ else:
+ connect(world, player, names, missions[connection], missions[i],
+ (lambda name: (lambda state: state.has(f"Beat {name}", player)))(missions[connection]))
+ connections.append(connection + 1)
+
+ mission_req_table.update({missions[i]: MissionInfo(
+ vanilla_mission_req_table[missions[i]].id, vanilla_mission_req_table[missions[i]].extra_locations,
+ connections, vanilla_shuffle_order[i].category, number=vanilla_shuffle_order[i].number,
+ completion_critical=vanilla_shuffle_order[i].completion_critical,
+ or_requirements=vanilla_shuffle_order[i].or_requirements)})
+
+ return mission_req_table
+
+
+def throwIfAnyLocationIsNotAssignedToARegion(regions: List[Region], regionNames: Set[str]):
+ existingRegions = set()
+
+ for region in regions:
+ existingRegions.add(region.name)
+
+ if (regionNames - existingRegions):
+ raise Exception("Starcraft: the following regions are used in locations: {}, but no such region exists".format(
+ regionNames - existingRegions))
+
+
+def create_location(player: int, location_data: LocationData, region: Region,
+ location_cache: List[Location]) -> Location:
+ location = Location(player, location_data.name, location_data.code, region)
+ location.access_rule = location_data.rule
+
+ if id is None:
+ location.event = True
+ location.locked = True
+
+ location_cache.append(location)
+
+ return location
+
+
+def create_region(world: MultiWorld, player: int, locations_per_region: Dict[str, List[LocationData]],
+ location_cache: List[Location], name: str) -> Region:
+ region = Region(name, RegionType.Generic, name, player)
+ region.world = world
+
+ if name in locations_per_region:
+ for location_data in locations_per_region[name]:
+ location = create_location(player, location_data, region, location_cache)
+ region.locations.append(location)
+
+ return region
+
+
+def connect(world: MultiWorld, player: int, used_names: Dict[str, int], source: str, target: str,
+ rule: Optional[Callable] = None):
+ sourceRegion = world.get_region(source, player)
+ targetRegion = world.get_region(target, player)
+
+ if target not in used_names:
+ used_names[target] = 1
+ name = target
+ else:
+ used_names[target] += 1
+ name = target + (' ' * used_names[target])
+
+ connection = Entrance(player, name, sourceRegion)
+
+ if rule:
+ connection.access_rule = rule
+
+ sourceRegion.exits.append(connection)
+ connection.connect(targetRegion)
+
+
+def get_locations_per_region(locations: Tuple[LocationData, ...]) -> Dict[str, List[LocationData]]:
+ per_region: Dict[str, List[LocationData]] = {}
+
+ for location in locations:
+ per_region.setdefault(location.region, []).append(location)
+
+ return per_region
diff --git a/worlds/sc2wol/Starcraft2.kv b/worlds/sc2wol/Starcraft2.kv
new file mode 100644
index 0000000000..9c52d64c47
--- /dev/null
+++ b/worlds/sc2wol/Starcraft2.kv
@@ -0,0 +1,16 @@
+:
+ rows: 1
+
+:
+ cols: 1
+ padding: [10,5,10,5]
+ spacing: [0,5]
+
+:
+ text_size: self.size
+ markup: True
+ halign: 'center'
+ valign: 'middle'
+ padding_x: 5
+ markup: True
+ outline_width: 1
diff --git a/worlds/sc2wol/__init__.py b/worlds/sc2wol/__init__.py
new file mode 100644
index 0000000000..31b759d8d7
--- /dev/null
+++ b/worlds/sc2wol/__init__.py
@@ -0,0 +1,186 @@
+import typing
+
+from typing import List, Set, Tuple, NamedTuple
+from BaseClasses import Item, MultiWorld, Location, Tutorial
+from ..AutoWorld import World, WebWorld
+from .Items import StarcraftWoLItem, item_table, filler_items, item_name_groups, get_full_item_list, \
+ basic_unit
+from .Locations import get_locations
+from .Regions import create_regions
+from .Options import sc2wol_options, get_option_value
+from .LogicMixin import SC2WoLLogic
+from ..AutoWorld import World
+
+
+class Starcraft2WoLWebWorld(WebWorld):
+ setup = Tutorial(
+ "Multiworld Setup Guide",
+ "A guide to setting up the Starcraft 2 randomizer connected to an Archipelago Multiworld",
+ "English",
+ "setup_en.md",
+ "setup/en",
+ ["TheCondor"]
+ )
+
+ tutorials = [setup]
+
+
+class SC2WoLWorld(World):
+ """
+ StarCraft II: Wings of Liberty is a science fiction real-time strategy video game developed and published by Blizzard Entertainment.
+ Command Raynor's Raiders in collecting pieces of the Keystone in order to stop the zerg threat posed by the Queen of Blades.
+ """
+
+ game = "Starcraft 2 Wings of Liberty"
+ web = Starcraft2WoLWebWorld()
+
+ item_name_to_id = {name: data.code for name, data in item_table.items()}
+ location_name_to_id = {location.name: location.code for location in get_locations(None, None)}
+ options = sc2wol_options
+
+ item_name_groups = item_name_groups
+ locked_locations: typing.List[str]
+ location_cache: typing.List[Location]
+ mission_req_table = {}
+
+ def __init__(self, world: MultiWorld, player: int):
+ super(SC2WoLWorld, self).__init__(world, player)
+ self.location_cache = []
+ self.locked_locations = []
+
+ def _create_items(self, name: str):
+ data = get_full_item_list()[name]
+ return [self.create_item(name) for _ in range(data.quantity)]
+
+ def create_item(self, name: str) -> Item:
+ data = get_full_item_list()[name]
+ return StarcraftWoLItem(name, data.progression, data.code, self.player)
+
+ def create_regions(self):
+ self.mission_req_table = create_regions(self.world, self.player, get_locations(self.world, self.player),
+ self.location_cache)
+
+ def generate_basic(self):
+ excluded_items = get_excluded_items(self, self.world, self.player)
+
+ assign_starter_items(self.world, self.player, excluded_items, self.locked_locations)
+
+ pool = get_item_pool(self.world, self.player, excluded_items)
+
+ fill_item_pool_with_dummy_items(self, self.world, self.player, self.locked_locations, self.location_cache, pool)
+
+ self.world.itempool += pool
+
+ def set_rules(self):
+ setup_events(self.world, self.player, self.locked_locations, self.location_cache)
+
+ self.world.completion_condition[self.player] = lambda state: state.has('All-In: Victory', self.player)
+
+ def get_filler_item_name(self) -> str:
+ return self.world.random.choice(filler_items)
+
+ def fill_slot_data(self):
+ slot_data = {}
+ for option_name in sc2wol_options:
+ option = getattr(self.world, option_name)[self.player]
+ if type(option.value) in {str, int}:
+ slot_data[option_name] = int(option.value)
+ slot_req_table = {}
+ for mission in self.mission_req_table:
+ slot_req_table[mission] = self.mission_req_table[mission]._asdict()
+
+ slot_data["mission_req"] = slot_req_table
+ return slot_data
+
+
+def setup_events(world: MultiWorld, player: int, locked_locations: typing.List[str], location_cache: typing.List[Location]):
+ for location in location_cache:
+ if location.address == None:
+ item = Item(location.name, True, None, player)
+
+ locked_locations.append(location.name)
+
+ location.place_locked_item(item)
+
+
+def get_excluded_items(self: SC2WoLWorld, world: MultiWorld, player: int) -> Set[str]:
+ excluded_items: Set[str] = set()
+
+ if get_option_value(world, player, "upgrade_bonus") == 1:
+ excluded_items.add("Ultra-Capacitors")
+ else:
+ excluded_items.add("Vanadium Plating")
+
+ if get_option_value(world, player, "bunker_upgrade") == 1:
+ excluded_items.add("Shrike Turret")
+ else:
+ excluded_items.add("Fortified Bunker")
+
+ for item in world.precollected_items[player]:
+ excluded_items.add(item.name)
+
+ return excluded_items
+
+
+def assign_starter_items(world: MultiWorld, player: int, excluded_items: Set[str], locked_locations: List[str]):
+ non_local_items = world.non_local_items[player].value
+
+ local_basic_unit = tuple(item for item in basic_unit if item not in non_local_items)
+ if not local_basic_unit:
+ raise Exception("At least one basic unit must be local")
+
+ # The first world should also be the starting world
+ first_location = list(world.worlds[player].mission_req_table)[0]
+
+ if first_location == "In Utter Darkness":
+ first_location = first_location + ": Defeat"
+ else:
+ first_location = first_location + ": Victory"
+
+ assign_starter_item(world, player, excluded_items, locked_locations, first_location,
+ local_basic_unit)
+
+
+def assign_starter_item(world: MultiWorld, player: int, excluded_items: Set[str], locked_locations: List[str],
+ location: str, item_list: Tuple[str, ...]):
+
+ item_name = world.random.choice(item_list)
+
+ excluded_items.add(item_name)
+
+ item = create_item_with_correct_settings(world, player, item_name)
+
+ world.get_location(location, player).place_locked_item(item)
+
+ locked_locations.append(location)
+
+
+def get_item_pool(world: MultiWorld, player: int, excluded_items: Set[str]) -> List[Item]:
+ pool: List[Item] = []
+
+ for name, data in item_table.items():
+ if name not in excluded_items:
+ for _ in range(data.quantity):
+ item = create_item_with_correct_settings(world, player, name)
+ pool.append(item)
+
+ return pool
+
+
+def fill_item_pool_with_dummy_items(self: SC2WoLWorld, world: MultiWorld, player: int, locked_locations: List[str],
+ location_cache: List[Location], pool: List[Item]):
+ for _ in range(len(location_cache) - len(locked_locations) - len(pool)):
+ item = create_item_with_correct_settings(world, player, self.get_filler_item_name())
+ pool.append(item)
+
+
+def create_item_with_correct_settings(world: MultiWorld, player: int, name: str) -> Item:
+ data = item_table[name]
+
+ item = Item(name, data.progression, data.code, player)
+ item.never_exclude = data.never_exclude
+
+ if not item.advancement:
+ return item
+
+ return item
diff --git a/worlds/sc2wol/docs/en_Starcraft 2 Wings of Liberty.md b/worlds/sc2wol/docs/en_Starcraft 2 Wings of Liberty.md
new file mode 100644
index 0000000000..aba882c7d6
--- /dev/null
+++ b/worlds/sc2wol/docs/en_Starcraft 2 Wings of Liberty.md
@@ -0,0 +1,37 @@
+# Starcraft 2 Wings of Liberty
+
+## Where is the settings page?
+
+The [player settings page for this game](../player-settings) contains all the options you need to configure and export a
+config file.
+
+## What does randomization do to this game?
+
+Items which the player would normally acquire throughout the game have been moved around. Logic remains, so the game is
+always able to be completed. Options exist to also shuffle around the mission order of the campaign.
+
+## What is the goal of Starcraft 2 when randomized?
+
+The goal remains unchanged. Beat the final mission All In.
+
+## What items and locations get shuffled?
+
+Unit unlocks, upgrade unlocks, armory upgrades, laboratory researches, and mercenary unlocks can be shuffled, and all
+bonus objectives, side missions, mission completions are now locations that can contain these items.
+
+## What has been changed from vanilla Starcraft 2?
+
+Some missions have been given more vespene gas available to mine to allow for a wider variety of unit compositions on
+those missions. Starports no longer require Factories in order to be built. In 'A Sinister Turn' and 'Echoes
+of the Future', you can research protoss air armor and weapon upgrades.
+
+## Which items can be in another player's world?
+
+Any of the items which can be shuffled may also be placed into another player's world. It is possible to choose to limit
+certain items to your own world.
+
+## When the player receives an item, what happens?
+
+When the player receives an item, they will receive a message through their text client and in game if currently playing
+ a mission. They will immediately be able to use that unlock/upgrade.
+
diff --git a/worlds/sc2wol/docs/setup_en.md b/worlds/sc2wol/docs/setup_en.md
new file mode 100644
index 0000000000..af32047be9
--- /dev/null
+++ b/worlds/sc2wol/docs/setup_en.md
@@ -0,0 +1,51 @@
+# Starcraft 2 Wings of Liberty Randomizer Setup Guide
+
+## Required Software
+
+- [Starcraft 2](https://starcraft2.com/en-us/)
+- [Starcraft 2 AP Client](https://github.com/ArchipelagoMW/Archipelago)
+- [Starcraft 2 AP Maps and Data](https://github.com/TheCondor07/Starcraft2ArchipelagoData)
+
+## General Concept
+
+Starcraft 2 AP Client launches a custom version of Starcraft 2 running modified Wings of Liberty campaign maps
+ to allow for randomization of the items
+
+## Installation Procedures
+
+Follow the installation directions at the
+[Starcraft 2 AP Maps and Data](https://github.com/TheCondor07/Starcraft2ArchipelagoData) page you can find the .zip
+files on the releases page. After it is installed just run ArchipelagoStarcraftClient.exe to start the client to connect
+to a Multiworld Game.
+
+## Joining a MultiWorld Game
+
+1. Run ArchipelagoStarcraftClient.exe
+2. Type in /connect [sever ip]
+3. Insert slot name and password as prompted
+4. Once connected, use /unfinished to find what missions you can play and '/play [mission id]' to launch a mission. For
+new games under default settings the first mission available will always be Liberation Day[1] playable using the command
+'/play 1'
+
+## Where do I get a config file?
+
+The [Player Settings](/games/Starcraft%202%20Wings%20of%20Liberty/player-settings) page on the website allows you to
+configure your personal settings and export them into a config file
+
+## Game isn't launching when I type /play
+
+First check the log file for issues (stored at [Archipelago Directory]/logs/SC2Client.txt. There is sometimes an issue
+where the client can not find Starcraft 2. Usually Documents/Starcraft 2/ExecuteInfo.txt is checked to find where
+Starcraft 2 is installed. On some computers particularly if you have OneDrive running this may fail. The following
+directions may help you in this case if you are on Windows.
+
+1. Navigate to '%userprofile%'. Easiest way to do this is to hit Windows key+R type in %userprofile% and hit run or
+type in %userprofile% in the navigation bar of your file explorer.
+2. If it does not exist create a folder in her named 'Documents'.
+3. Locate your 'My Documents' folder on your pc. If you navigate to 'My PC' on the sidebar of file explorer should be a
+link to this folder there labeled 'Documents'.
+4. Find a folder labeled 'Starcraft 2' and copy it.
+5. Paste this Starcraft 2 folder into the folder created or found in step 2.
+
+These steps have been shown to work for some people for some people having issues with launching the game. If you are
+still having issues check out our [Discord](https://discord.com/invite/8Z65BR2) for help.
\ No newline at end of file
diff --git a/worlds/sc2wol/requirements.txt b/worlds/sc2wol/requirements.txt
new file mode 100644
index 0000000000..9a2bec4f04
--- /dev/null
+++ b/worlds/sc2wol/requirements.txt
@@ -0,0 +1,3 @@
+nest-asyncio >= 1.5.5
+six >= 1.16.0
+apsc2 >= 5.5
\ No newline at end of file
diff --git a/worlds/sm/__init__.py b/worlds/sm/__init__.py
index 305ac87b79..8863114eab 100644
--- a/worlds/sm/__init__.py
+++ b/worlds/sm/__init__.py
@@ -5,7 +5,7 @@ import copy
import os
import threading
import base64
-from typing import Set, List
+from typing import Set, List, TextIO
logger = logging.getLogger("Super Metroid")
@@ -17,8 +17,8 @@ from .Options import sm_options
from .Rom import get_base_rom_path, ROM_PLAYER_LIMIT, SMDeltaPatch
import Utils
-from BaseClasses import Region, Entrance, Location, MultiWorld, Item, RegionType, CollectionState
-from ..AutoWorld import World, AutoLogicRegister
+from BaseClasses import Region, Entrance, Location, MultiWorld, Item, RegionType, CollectionState, Tutorial
+from ..AutoWorld import World, AutoLogicRegister, WebWorld
from logic.smboolmanager import SMBoolManager
from graph.vanilla.graph_locations import locationsDict
@@ -56,7 +56,24 @@ class SMCollectionState(metaclass=AutoLogicRegister):
return tuple(player for player in multiword.get_all_ids() if multiword.game[player] == game_name)
+class SMWeb(WebWorld):
+ tutorials = [Tutorial(
+ "Multiworld Setup Guide",
+ "A guide to setting up the Super Metroid Client on your computer. This guide covers single-player, multiworld, and related software.",
+ "English",
+ "multiworld_en.md",
+ "multiworld/en",
+ ["Farrak Kilhn"]
+ )]
+
+
class SMWorld(World):
+ """
+ This is Very Adaptive Randomizer of Items and Areas for Super Metroid (VARIA SM). It supports
+ a wide range of options to randomize Item locations, required skills and even the connections
+ between the main Areas!
+ """
+
game: str = "Super Metroid"
topology_present = True
data_version = 1
@@ -65,6 +82,7 @@ class SMWorld(World):
location_names: Set[str] = frozenset(locations_lookup_name_to_id)
item_name_to_id = items_lookup_name_to_id
location_name_to_id = locations_lookup_name_to_id
+ web = SMWeb()
remote_items: bool = False
remote_start_inventory: bool = False
@@ -75,14 +93,19 @@ class SMWorld(World):
itemManager: ItemManager
- locations = {}
-
Logic.factory('vanilla')
def __init__(self, world: MultiWorld, player: int):
self.rom_name_available_event = threading.Event()
+ self.locations = {}
super().__init__(world, player)
+ @classmethod
+ def stage_assert_generate(cls, world):
+ rom_file = get_base_rom_path()
+ if not os.path.exists(rom_file):
+ raise FileNotFoundError(rom_file)
+
def generate_early(self):
Logic.factory('vanilla')
@@ -118,6 +141,7 @@ class SMWorld(World):
# Generate item pool
pool = []
self.locked_items = {}
+ self.NothingPool = []
weaponCount = [0, 0, 0]
for item in itemPool:
isAdvancement = True
@@ -143,6 +167,8 @@ class SMWorld(World):
smitem = SMItem(item.Name, isAdvancement, item.Type, None if itemClass == 'Boss' else self.item_name_to_id[item.Name], player = self.player)
if itemClass == 'Boss':
self.locked_items[item.Name] = smitem
+ elif item.Category == 'Nothing':
+ self.NothingPool.append(smitem)
else:
pool.append(smitem)
@@ -158,7 +184,8 @@ class SMWorld(World):
for src, dest in self.variaRando.randoExec.areaGraph.InterAreaTransitions:
src_region = self.world.get_region(src.Name, self.player)
dest_region = self.world.get_region(dest.Name, self.player)
- src_region.exits.append(Entrance(self.player, src.Name + "->" + dest.Name, src_region))
+ if ((src.Name + "->" + dest.Name, self.player) not in self.world._entrance_cache):
+ src_region.exits.append(Entrance(self.player, src.Name + "->" + dest.Name, src_region))
srcDestEntrance = self.world.get_entrance(src.Name + "->" + dest.Name, self.player)
srcDestEntrance.connect(dest_region)
add_entrance_rule(self.world.get_entrance(src.Name + "->" + dest.Name, self.player), self.player, getAccessPoint(src.Name).traverse)
@@ -501,6 +528,21 @@ class SMWorld(World):
item = next(x for x in ItemManager.Items.values() if x.Name == name)
return SMItem(item.Name, True, item.Type, self.item_name_to_id[item.Name], player = self.player)
+ def get_filler_item_name(self) -> str:
+ if self.world.random.randint(0, 100) < self.world.minor_qty[self.player].value:
+ power_bombs = self.world.power_bomb_qty[self.player].value
+ missiles = self.world.missile_qty[self.player].value
+ super_missiles = self.world.super_qty[self.player].value
+ roll = self.world.random.randint(1, power_bombs + missiles + super_missiles)
+ if roll <= power_bombs:
+ return "Power Bomb"
+ elif roll <= power_bombs + missiles:
+ return "Missile"
+ else:
+ return "Super Missile"
+ else:
+ return "Nothing"
+
def pre_fill(self):
if (self.variaRando.args.morphPlacement == "early") and next((item for item in self.world.itempool if item.player == self.player and item.name == "Morph Ball"), False):
viable = []
@@ -517,6 +559,28 @@ class SMWorld(World):
item.player != self.player or
item.name != "Morph Ball"]
+ if len(self.NothingPool) > 0:
+ nonChozoLoc = []
+ chozoLoc = []
+
+ for loc in self.locations.values():
+ if loc.item is None:
+ if locationsDict[loc.name].isChozo():
+ chozoLoc.append(loc)
+ else:
+ nonChozoLoc.append(loc)
+
+ self.world.random.shuffle(nonChozoLoc)
+ self.world.random.shuffle(chozoLoc)
+ missingCount = len(self.NothingPool) - len(nonChozoLoc)
+ locations = nonChozoLoc
+ if (missingCount > 0):
+ locations += chozoLoc[:missingCount]
+ locations = locations[:len(self.NothingPool)]
+ for item, loc in zip(self.NothingPool, locations):
+ loc.place_locked_item(item)
+ loc.address = loc.item.code = None
+
@classmethod
def stage_fill_hook(cls, world, progitempool, nonexcludeditempool, localrestitempool, nonlocalrestitempool,
restitempool, fill_locations):
@@ -542,11 +606,20 @@ class SMWorld(World):
world.state.smbm[player].onlyBossLeft = True
break
- # Turn Nothing items into event pairs.
- for location in world.get_locations():
- if location.game == location.item.game == "Super Metroid" and location.item.type == "Nothing":
- location.address = location.item.code = None
+ def write_spoiler(self, spoiler_handle: TextIO):
+ if self.world.area_randomization[self.player].value != 0:
+ spoiler_handle.write('\n\nArea Transitions:\n\n')
+ spoiler_handle.write('\n'.join(['%s%s %s %s' % (f'{self.world.get_player_name(self.player)}: '
+ if self.world.players > 1 else '', src.Name,
+ '<=>',
+ dest.Name) for src, dest in self.variaRando.randoExec.areaGraph.InterAreaTransitions if not src.Boss]))
+ if self.world.boss_randomization[self.player].value != 0:
+ spoiler_handle.write('\n\nBoss Transitions:\n\n')
+ spoiler_handle.write('\n'.join(['%s%s %s %s' % (f'{self.world.get_player_name(self.player)}: '
+ if self.world.players > 1 else '', src.Name,
+ '<=>',
+ dest.Name) for src, dest in self.variaRando.randoExec.areaGraph.InterAreaTransitions if src.Boss]))
def create_locations(self, player: int):
for name, id in locations_lookup_name_to_id.items():
@@ -574,8 +647,18 @@ class SMLocation(Location):
super(SMLocation, self).__init__(player, name, address, parent)
def can_fill(self, state: CollectionState, item: Item, check_access=True) -> bool:
- return self.always_allow(state, item) or (self.item_rule(item) and (not check_access or self.can_reach(state)))
+ return self.always_allow(state, item) or (self.item_rule(item) and (not check_access or (self.can_reach(state) and self.can_comeback(state, item))))
+ def can_comeback(self, state: CollectionState, item: Item):
+ randoExec = state.world.worlds[self.player].variaRando.randoExec
+ for key in locationsDict[self.name].AccessFrom.keys():
+ if (randoExec.areaGraph.canAccess( state.smbm[self.player],
+ key,
+ randoExec.graphSettings.startAP,
+ state.smbm[self.player].maxDiff,
+ None)):
+ return True
+ return False
class SMItem(Item):
game = "Super Metroid"
diff --git a/WebHostLib/static/assets/gameInfo/en_Super Metroid.md b/worlds/sm/docs/en_Super Metroid.md
similarity index 100%
rename from WebHostLib/static/assets/gameInfo/en_Super Metroid.md
rename to worlds/sm/docs/en_Super Metroid.md
diff --git a/WebHostLib/static/assets/tutorial/Super Metroid/multiworld_en.md b/worlds/sm/docs/multiworld_en.md
similarity index 98%
rename from WebHostLib/static/assets/tutorial/Super Metroid/multiworld_en.md
rename to worlds/sm/docs/multiworld_en.md
index 5345f57935..9d5ed715f1 100644
--- a/WebHostLib/static/assets/tutorial/Super Metroid/multiworld_en.md
+++ b/worlds/sm/docs/multiworld_en.md
@@ -116,7 +116,8 @@ You only have to do these steps once. Note, RetroArch 1.9.x will not work as it
2. Go to Settings --> User Interface. Set "Show Advanced Settings" to ON.
3. Go to Settings --> Network. Set "Network Commands" to ON. (It is found below Request Device 16.) Leave the default
Network Command Port at 55355.
-
+
+
4. Go to Main Menu --> Online Updater --> Core Downloader. Scroll down and select "Nintendo - SNES / SFC (bsnes-mercury
Performance)".
diff --git a/worlds/sm/variaRandomizer/utils/doorsmanager.py b/worlds/sm/variaRandomizer/utils/doorsmanager.py
index 49b4540bac..bb2f5f6121 100644
--- a/worlds/sm/variaRandomizer/utils/doorsmanager.py
+++ b/worlds/sm/variaRandomizer/utils/doorsmanager.py
@@ -254,8 +254,7 @@ class DoorsManager():
@staticmethod
def setDoorsColor(player=0):
- if player not in DoorsManager.doorsDict.keys():
- DoorsManager.doorsDict[player] = copy.deepcopy(DoorsManager.doors)
+ DoorsManager.doorsDict[player] = copy.deepcopy(DoorsManager.doors)
currentDoors = DoorsManager.doorsDict[player]
# depending on loaded patches, force some doors to blue, excluding them from randomization
diff --git a/worlds/sm64ex/Options.py b/worlds/sm64ex/Options.py
index a078e9e190..99b3b3ee0b 100644
--- a/worlds/sm64ex/Options.py
+++ b/worlds/sm64ex/Options.py
@@ -45,6 +45,6 @@ sm64_options: typing.Dict[str,type(Option)] = {
"StrictCannonRequirements": StrictCannonRequirements,
"StarsToFinish": StarsToFinish,
"ExtraStars": ExtraStars,
- "DeathLink": DeathLink,
+ "death_link": DeathLink,
"BuddyChecks": BuddyChecks,
}
\ No newline at end of file
diff --git a/worlds/sm64ex/Rules.py b/worlds/sm64ex/Rules.py
index f5bb9ff77f..0ba025d77a 100644
--- a/worlds/sm64ex/Rules.py
+++ b/worlds/sm64ex/Rules.py
@@ -4,7 +4,7 @@ from .Regions import connect_regions, sm64courses
def set_rules(world, player: int, area_connections):
courseshuffle = list(range(len(sm64courses)))
- if world.AreaRandomizer[player].value:
+ if world.AreaRandomizer[player]:
world.random.shuffle(courseshuffle)
area_connections.update({index: value for index, value in enumerate(courseshuffle)})
@@ -22,7 +22,7 @@ def set_rules(world, player: int, area_connections):
connect_regions(world, player, "Basement", sm64courses[area_connections[7]])
connect_regions(world, player, "Basement", sm64courses[area_connections[8]], lambda state: state.has("Power Star", player, 30))
connect_regions(world, player, "Basement", "Bowser in the Fire Sea", lambda state: state.has("Power Star", player, 30) and
- state.can_reach("Dire, Dire Docks", 'Region', player))
+ state.can_reach("DDD: Board Bowser's Sub", 'Location', player))
connect_regions(world, player, "Menu", "Second Floor", lambda state: state.has("Second Floor Key", player) or state.has("Progressive Key", player, 2))
@@ -38,41 +38,57 @@ def set_rules(world, player: int, area_connections):
#Special Rules for some Locations
add_rule(world.get_location("Tower of the Wing Cap Switch", player), lambda state: state.has("Power Star", player, 10))
- add_rule(world.get_location("Cavern of the Metal Cap Switch", player), lambda state: state.can_reach("Hazy Maze Cave",'Region',player))
+ add_rule(world.get_location("Cavern of the Metal Cap Switch", player), lambda state: state.can_reach("Hazy Maze Cave", 'Region', player))
add_rule(world.get_location("Vanish Cap Under the Moat Switch", player), lambda state: state.can_reach("Basement", 'Region', player))
+ add_rule(world.get_location("BoB: Mario Wings to the Sky", player), lambda state: state.has("Cannon Unlock BoB", player))
add_rule(world.get_location("BBH: Eye to Eye in the Secret Room", player), lambda state: state.has("Vanish Cap", player))
- add_rule(world.get_location("DDD: Collect the Caps...", player), lambda state: state.has("Metal Cap", player) and
- state.has("Vanish Cap", player))
- add_rule(world.get_location("DDD: Pole-Jumping for Red Coins", player), lambda state: state.can_reach("Bowser in the Fire Sea",'Region',player))
+ add_rule(world.get_location("DDD: Collect the Caps...", player), lambda state: state.has("Vanish Cap", player))
+ add_rule(world.get_location("DDD: Pole-Jumping for Red Coins", player), lambda state: state.can_reach("Bowser in the Fire Sea", 'Region', player))
add_rule(world.get_location("SL: Into the Igloo", player), lambda state: state.has("Vanish Cap", player))
add_rule(world.get_location("WDW: Quick Race Through Downtown!", player), lambda state: state.has("Vanish Cap", player))
- if (world.StrictCapRequirements[player].value):
+ add_rule(world.get_location("RR: Somewhere Over the Rainbow", player), lambda state: state.has("Cannon Unlock RR", player))
+
+ if world.AreaRandomizer[player] or world.StrictCannonRequirements[player]:
+ # If area rando is on, it may not be possible to modify WDW's starting water level,
+ # which would make it impossible to reach downtown area without the cannon.
+ add_rule(world.get_location("WDW: Quick Race Through Downtown!", player), lambda state: state.has("Cannon Unlock WDW", player))
+ add_rule(world.get_location("WDW: Go to Town for Red Coins", player), lambda state: state.has("Cannon Unlock WDW", player))
+
+ if world.StrictCapRequirements[player]:
add_rule(world.get_location("BoB: Mario Wings to the Sky", player), lambda state: state.has("Wing Cap", player))
add_rule(world.get_location("HMC: Metal-Head Mario Can Move!", player), lambda state: state.has("Metal Cap", player))
add_rule(world.get_location("JRB: Through the Jet Stream", player), lambda state: state.has("Metal Cap", player))
add_rule(world.get_location("SSL: Free Flying for 8 Red Coins", player), lambda state: state.has("Wing Cap", player))
add_rule(world.get_location("DDD: Through the Jet Stream", player), lambda state: state.has("Metal Cap", player))
+ add_rule(world.get_location("DDD: Collect the Caps...", player), lambda state: state.has("Metal Cap", player))
add_rule(world.get_location("Vanish Cap Under the Moat Red Coins", player), lambda state: state.has("Vanish Cap", player))
- if (world.StrictCannonRequirements[player].value):
- add_rule(world.get_location("BoB: Mario Wings to the Sky", player), lambda state: state.has("Cannon Unlock BoB", player))
+ add_rule(world.get_location("Cavern of the Metal Cap Red Coins", player), lambda state: state.has("Metal Cap", player))
+ if world.StrictCannonRequirements[player]:
add_rule(world.get_location("WF: Blast Away the Wall", player), lambda state: state.has("Cannon Unlock WF", player))
add_rule(world.get_location("JRB: Blast to the Stone Pillar", player), lambda state: state.has("Cannon Unlock JRB", player))
- add_rule(world.get_location("RR: Somewhere Over the Rainbow", player), lambda state: state.has("Cannon Unlock RR", player))
+ add_rule(world.get_location("CCM: Wall Kicks Will Work", player), lambda state: state.has("Cannon Unlock CCM", player))
+ add_rule(world.get_location("TTM: Blast to the Lonely Mushroom", player), lambda state: state.has("Cannon Unlock TTM", player))
+ if world.StrictCapRequirements[player] and world.StrictCannonRequirements[player]:
+ # Ability to reach the floating island. Need some of those coins to get 100 coin star as well.
+ add_rule(world.get_location("BoB: Find the 8 Red Coins", player), lambda state: state.has("Cannon Unlock BoB", player) or state.has("Wing Cap", player))
+ add_rule(world.get_location("BoB: Shoot to the Island in the Sky", player), lambda state: state.has("Cannon Unlock BoB", player) or state.has("Wing Cap", player))
+ if world.EnableCoinStars[player]:
+ add_rule(world.get_location("BoB: 100 Coins", player), lambda state: state.has("Cannon Unlock BoB", player) or state.has("Wing Cap", player))
#Rules for Secret Stars
- add_rule(world.get_location("Bowser in the Sky Red Coins", player), lambda state: state.can_reach("Third Floor",'Region',player) and state.has("Power Star", player, world.StarsToFinish[player].value))
+ add_rule(world.get_location("Bowser in the Sky Red Coins", player), lambda state: state.can_reach("Third Floor", 'Region',player) and state.has("Power Star", player, world.StarsToFinish[player].value))
add_rule(world.get_location("The Princess's Secret Slide Block", player), lambda state: state.has("Power Star", player, 1))
add_rule(world.get_location("The Princess's Secret Slide Fast", player), lambda state: state.has("Power Star", player, 1))
- add_rule(world.get_location("Cavern of the Metal Cap Red Coins", player), lambda state: state.can_reach("Cavern of the Metal Cap Switch", 'Location', player) and state.has("Metal Cap", player))
+ add_rule(world.get_location("Cavern of the Metal Cap Red Coins", player), lambda state: state.can_reach("Cavern of the Metal Cap Switch", 'Location', player))
add_rule(world.get_location("Tower of the Wing Cap Red Coins", player), lambda state: state.can_reach("Tower of the Wing Cap Switch", 'Location', player))
add_rule(world.get_location("Vanish Cap Under the Moat Red Coins", player), lambda state: state.can_reach("Vanish Cap Under the Moat Switch", 'Location', player))
add_rule(world.get_location("Wing Mario Over the Rainbow", player), lambda state: state.can_reach("Third Floor", 'Region', player) and state.has("Wing Cap", player))
add_rule(world.get_location("The Secret Aquarium", player), lambda state: state.has("Power Star", player, 3))
- add_rule(world.get_location("Toad (Basement)", player), lambda state: state.can_reach("Basement",'Region',player) and state.has("Power Star", player, 12))
- add_rule(world.get_location("Toad (Second Floor)", player), lambda state: state.can_reach("Second Floor",'Region',player) and state.has("Power Star", player, 25))
- add_rule(world.get_location("Toad (Third Floor)", player), lambda state: state.can_reach("Third Floor",'Region',player) and state.has("Power Star", player, 35))
- add_rule(world.get_location("MIPS 1", player), lambda state: state.can_reach("Basement",'Region',player) and state.has("Power Star", player, 15))
- add_rule(world.get_location("MIPS 2", player), lambda state: state.can_reach("Basement",'Region',player) and state.has("Power Star", player, 50))
+ add_rule(world.get_location("Toad (Basement)", player), lambda state: state.can_reach("Basement", 'Region', player) and state.has("Power Star", player, 12))
+ add_rule(world.get_location("Toad (Second Floor)", player), lambda state: state.can_reach("Second Floor", 'Region', player) and state.has("Power Star", player, 25))
+ add_rule(world.get_location("Toad (Third Floor)", player), lambda state: state.can_reach("Third Floor", 'Region', player) and state.has("Power Star", player, 35))
+ add_rule(world.get_location("MIPS 1", player), lambda state: state.can_reach("Basement", 'Region', player) and state.has("Power Star", player, 15))
+ add_rule(world.get_location("MIPS 2", player), lambda state: state.can_reach("Basement", 'Region', player) and state.has("Power Star", player, 50))
- world.completion_condition[player] = lambda state: state.can_reach("Third Floor",'Region',player) and state.has("Power Star", player, world.StarsToFinish[player].value)
+ world.completion_condition[player] = lambda state: state.can_reach("Third Floor", 'Region', player) and state.has("Power Star", player, world.StarsToFinish[player].value)
diff --git a/worlds/sm64ex/__init__.py b/worlds/sm64ex/__init__.py
index a859872543..f7b3918235 100644
--- a/worlds/sm64ex/__init__.py
+++ b/worlds/sm64ex/__init__.py
@@ -5,12 +5,24 @@ from .Items import item_table, cannon_item_table, SM64Item
from .Locations import location_table, SM64Location
from .Options import sm64_options
from .Rules import set_rules
-from .Regions import create_regions
-from BaseClasses import Region, RegionType, Entrance, Item, MultiWorld
-from ..AutoWorld import World
+from .Regions import create_regions, sm64courses
+from BaseClasses import Region, RegionType, Entrance, Item, MultiWorld, Tutorial
+from ..AutoWorld import World, WebWorld
client_version = 1
+
+class SM64Web(WebWorld):
+ tutorials = [Tutorial(
+ "Multiworld Setup Guide",
+ "A guide to setting up SM64EX for MultiWorld.",
+ "English",
+ "setup_en.md",
+ "setup/en",
+ ["N00byKing"]
+ )]
+
+
class SM64World(World):
"""
The first Super Mario game to feature 3D gameplay, it features freedom of movement within a large open world based on polygons,
@@ -20,6 +32,8 @@ class SM64World(World):
game: str = "Super Mario 64"
topology_present = False
+ web = SM64Web()
+
item_name_to_id = item_table
location_name_to_id = location_table
@@ -39,6 +53,13 @@ class SM64World(World):
def set_rules(self):
self.area_connections = {}
set_rules(self.world, self.player, self.area_connections)
+ if self.topology_present:
+ # Write area_connections to spoiler log
+ for painting_id, course_id in self.area_connections.items():
+ self.world.spoiler.set_entrance(
+ sm64courses[painting_id] + " Painting",
+ sm64courses[course_id],
+ 'entrance', self.player)
def create_item(self, name: str) -> Item:
item_id = item_table[name]
@@ -83,11 +104,14 @@ class SM64World(World):
self.world.get_location("THI: Bob-omb Buddy", self.player).place_locked_item(self.create_item("Cannon Unlock THI"))
self.world.get_location("RR: Bob-omb Buddy", self.player).place_locked_item(self.create_item("Cannon Unlock RR"))
+ def get_filler_item_name(self) -> str:
+ return "1Up Mushroom"
+
def fill_slot_data(self):
return {
"AreaRando": self.area_connections,
"StarsToFinish": self.world.StarsToFinish[self.player].value,
- "DeathLink": self.world.DeathLink[self.player].value,
+ "DeathLink": self.world.death_link[self.player].value,
}
def generate_output(self, output_directory: str):
@@ -110,3 +134,12 @@ class SM64World(World):
filename = f"AP_{self.world.seed_name}_P{self.player}_{self.world.get_file_safe_player_name(self.player)}.apsm64ex"
with open(os.path.join(output_directory, filename), 'w') as f:
json.dump(data, f)
+
+ def modify_multidata(self, multidata):
+ if self.topology_present:
+ er_hint_data = {}
+ for painting_id, course_id in self.area_connections.items():
+ region = self.world.get_region(sm64courses[course_id], self.player)
+ for location in region.locations:
+ er_hint_data[location.address] = sm64courses[painting_id]
+ multidata['er_hint_data'][self.player] = er_hint_data
diff --git a/WebHostLib/static/assets/gameInfo/en_Super Mario 64.md b/worlds/sm64ex/docs/en_Super Mario 64.md
similarity index 100%
rename from WebHostLib/static/assets/gameInfo/en_Super Mario 64.md
rename to worlds/sm64ex/docs/en_Super Mario 64.md
diff --git a/WebHostLib/static/assets/tutorial/Super Mario 64/setup_en.md b/worlds/sm64ex/docs/setup_en.md
similarity index 98%
rename from WebHostLib/static/assets/tutorial/Super Mario 64/setup_en.md
rename to worlds/sm64ex/docs/setup_en.md
index c000e94352..5cc9113430 100644
--- a/WebHostLib/static/assets/tutorial/Super Mario 64/setup_en.md
+++ b/worlds/sm64ex/docs/setup_en.md
@@ -36,7 +36,7 @@ If it still crashes, recheck if you typed the launch options correctly (Describe
# Manual Compilation (Linux/Windows)
Dependencies for Linux: `sdl2 glew cmake python make`.
-Dependencies for Windows: `mingw-w64-x86_64-gcc mingw-w64-x86_64-glew mingw-w64-x86_64-SDL2 git make python3 cmake`
+Dependencies for Windows: `mingw-w64-x86_64-gcc mingw-w64-x86_64-glew mingw-w64-x86_64-SDL2 git make python3 mingw-w64-x86_64-cmake`
SM64EX will link `jsoncpp` dynamic if installed. If not, it will compile and link statically.
1. Clone `https://github.com/N00byKing/sm64ex` recursively
diff --git a/worlds/smz3/TotalSMZ3/Regions/Zelda/PalaceOfDarkness.py b/worlds/smz3/TotalSMZ3/Regions/Zelda/PalaceOfDarkness.py
index e83126c58a..9184fd28fc 100644
--- a/worlds/smz3/TotalSMZ3/Regions/Zelda/PalaceOfDarkness.py
+++ b/worlds/smz3/TotalSMZ3/Regions/Zelda/PalaceOfDarkness.py
@@ -29,7 +29,7 @@ class PalaceOfDarkness(Z3Region, IReward):
Location(self, 256+127, 0x1EA43, LocationType.Regular, "Palace of Darkness - Compass Chest",
lambda items: items.KeyPD >= (4 if (items.Hammer and items.Bow and items.Lamp) or config.Keysanity else 3)),
Location(self, 256+128, 0x1EA46, LocationType.Regular, "Palace of Darkness - Harmless Hellway",
- lambda items: items.KeyPD >= (4 if (items.Hammer and items.Bow and items.Lamp) or config.Keysanity else 3 if
+ lambda items: items.KeyPD >= ((4 if (items.Hammer and items.Bow and items.Lamp) or config.Keysanity else 3) if
self.GetLocation("Palace of Darkness - Harmless Hellway").ItemIs(ItemType.KeyPD, self.world) else
6 if (items.Hammer and items.Bow and items.Lamp) or config.Keysanity else 5))
.AlwaysAllow(lambda item, items: item.Is(ItemType.KeyPD, self.world) and items.KeyPD >= 5),
diff --git a/worlds/smz3/__init__.py b/worlds/smz3/__init__.py
index 6cb43878b5..0c675c9acc 100644
--- a/worlds/smz3/__init__.py
+++ b/worlds/smz3/__init__.py
@@ -5,14 +5,14 @@ import random
import threading
from typing import Dict, Set, TextIO
-from BaseClasses import Region, Entrance, Location, MultiWorld, Item, RegionType, CollectionState
+from BaseClasses import Region, Entrance, Location, MultiWorld, Item, RegionType, CollectionState, Tutorial
from worlds.generic.Rules import set_rule
import worlds.smz3.TotalSMZ3.Item as TotalSMZ3Item
from worlds.smz3.TotalSMZ3.World import World as TotalSMZ3World
from worlds.smz3.TotalSMZ3.Config import Config, GameMode, GanonInvincible, Goal, KeyShuffle, MorphLocation, SMLogic, SwordLocation, Z3Logic
from worlds.smz3.TotalSMZ3.Location import LocationType, locations_start_id, Location as TotalSMZ3Location
from worlds.smz3.TotalSMZ3.Patch import Patch as TotalSMZ3Patch, getWord, getWordArray
-from ..AutoWorld import World, AutoLogicRegister
+from ..AutoWorld import World, AutoLogicRegister, WebWorld
from .Rom import get_base_rom_bytes, SMZ3DeltaPatch
from .ips import IPS_Patch
from .Options import smz3_options
@@ -34,6 +34,17 @@ class SMZ3CollectionState(metaclass=AutoLogicRegister):
return ret
+class SMZ3Web(WebWorld):
+ tutorials = [Tutorial(
+ "Multiworld Setup Guide",
+ "A guide to setting up the Archipelago Super Metroid and A Link to the Past Crossover randomizer on your computer. This guide covers single-player, multiworld, and related software.",
+ "English",
+ "multiworld_en.md",
+ "multiworld/en",
+ ["lordlou"]
+ )]
+
+
class SMZ3World(World):
"""
A python port of Super Metroid & A Link To The Past Crossover Item Randomizer based on v11.2 of Total's SMZ3.
@@ -47,6 +58,7 @@ class SMZ3World(World):
location_names: Set[str]
item_name_to_id = TotalSMZ3Item.lookup_name_to_id
location_name_to_id: Dict[str, int] = {key : locations_start_id + value.Id for key, value in TotalSMZ3World(Config({}), "", 0, "").locationLookup.items()}
+ web = SMZ3Web()
remote_items: bool = False
remote_start_inventory: bool = False
@@ -60,6 +72,10 @@ class SMZ3World(World):
self.unreachable = []
super().__init__(world, player)
+ @classmethod
+ def stage_assert_generate(cls, world):
+ base_combined_rom = get_base_rom_bytes()
+
def generate_early(self):
config = Config({})
config.GameMode = GameMode.Multiworld
diff --git a/WebHostLib/static/assets/gameInfo/en_SMZ3.md b/worlds/smz3/docs/en_SMZ3.md
similarity index 100%
rename from WebHostLib/static/assets/gameInfo/en_SMZ3.md
rename to worlds/smz3/docs/en_SMZ3.md
diff --git a/WebHostLib/static/assets/tutorial/SMZ3/multiworld_en.md b/worlds/smz3/docs/multiworld_en.md
similarity index 98%
rename from WebHostLib/static/assets/tutorial/SMZ3/multiworld_en.md
rename to worlds/smz3/docs/multiworld_en.md
index 5abb60a451..6ce031847f 100644
--- a/WebHostLib/static/assets/tutorial/SMZ3/multiworld_en.md
+++ b/worlds/smz3/docs/multiworld_en.md
@@ -113,7 +113,8 @@ You only have to do these steps once. Note, RetroArch 1.9.x will not work as it
2. Go to Settings --> User Interface. Set "Show Advanced Settings" to ON.
3. Go to Settings --> Network. Set "Network Commands" to ON. (It is found below Request Device 16.) Leave the default
Network Command Port at 55355.
-
+
+
4. Go to Main Menu --> Online Updater --> Core Downloader. Scroll down and select "Nintendo - SNES / SFC (bsnes-mercury
Performance)".
diff --git a/worlds/soe/__init__.py b/worlds/soe/__init__.py
index 244c6f0711..a30319ef26 100644
--- a/worlds/soe/__init__.py
+++ b/worlds/soe/__init__.py
@@ -1,6 +1,6 @@
from ..AutoWorld import World, WebWorld
from ..generic.Rules import set_rule
-from BaseClasses import Region, Location, Entrance, Item, RegionType
+from BaseClasses import Region, Location, Entrance, Item, RegionType, Tutorial
from Utils import output_path
import typing
import os
@@ -134,6 +134,14 @@ def _get_item_grouping() -> typing.Dict[str, typing.Set[str]]:
class SoEWebWorld(WebWorld):
theme = 'jungle'
+ tutorials = [Tutorial(
+ "Multiworld Setup Guide",
+ "A guide to playing Secret of Evermore randomizer. This guide covers single-player, multiworld and related software.",
+ "English",
+ "multiworld_en.md",
+ "multiworld/en",
+ ["Black Sliver"]
+ )]
class SoEWorld(World):
@@ -175,6 +183,12 @@ class SoEWorld(World):
res.trap = item.type == pyevermizer.CHECK_TRAP
return res
+ @classmethod
+ def stage_assert_generate(cls, world):
+ rom_file = get_base_rom_path()
+ if not os.path.exists(rom_file):
+ raise FileNotFoundError(rom_file)
+
def create_regions(self):
# TODO: generate *some* regions from locations' requirements?
r = Region('Menu', RegionType.Generic, 'Menu', self.player, self.world)
@@ -322,6 +336,9 @@ class SoEWorld(World):
payload = multidata["connect_names"][self.world.player_name[self.player]]
multidata["connect_names"][self.connect_name] = payload
+ def get_filler_item_name(self) -> str:
+ return self.world.random.choice(list(self.item_name_groups["Ingredients"]))
+
class SoEItem(Item):
game: str = "Secret of Evermore"
diff --git a/WebHostLib/static/assets/gameInfo/en_Secret of Evermore.md b/worlds/soe/docs/en_Secret of Evermore.md
similarity index 100%
rename from WebHostLib/static/assets/gameInfo/en_Secret of Evermore.md
rename to worlds/soe/docs/en_Secret of Evermore.md
diff --git a/WebHostLib/static/assets/tutorial/Secret of Evermore/multiworld_en.md b/worlds/soe/docs/multiworld_en.md
similarity index 98%
rename from WebHostLib/static/assets/tutorial/Secret of Evermore/multiworld_en.md
rename to worlds/soe/docs/multiworld_en.md
index 37c40fa8bf..115fe5ea1a 100644
--- a/WebHostLib/static/assets/tutorial/Secret of Evermore/multiworld_en.md
+++ b/worlds/soe/docs/multiworld_en.md
@@ -101,7 +101,7 @@ You only have to do these steps once.
2. Go to Settings --> User Interface. Set "Show Advanced Settings" to ON.
3. Go to Settings --> Network. Set "Network Commands" to ON. (It is found below Request Device 16.) Leave the default
Network Command Port at 55355.
-
+
4. Go to Main Menu --> Online Updater --> Core Downloader. Scroll down and select "Nintendo - SNES / SFC (bsnes-mercury
Performance)".
diff --git a/worlds/spire/__init__.py b/worlds/spire/__init__.py
index c1f9229c44..460b263a8b 100644
--- a/worlds/spire/__init__.py
+++ b/worlds/spire/__init__.py
@@ -1,19 +1,31 @@
import string
-from BaseClasses import Item, MultiWorld, Region, Location, Entrance
+from BaseClasses import Item, MultiWorld, Region, Location, Entrance, Tutorial
from .Items import item_table, item_pool, event_item_pairs
from .Locations import location_table
from .Regions import create_regions
from .Rules import set_rules
-from ..AutoWorld import World
+from ..AutoWorld import World, WebWorld
from .Options import spire_options
+class SpireWeb(WebWorld):
+ tutorials = [Tutorial(
+ "Multiworld Setup Guide",
+ "A guide to setting up Slay the Spire for Archipelago. This guide covers single-player, multiworld, and related software.",
+ "English",
+ "slay-the-spire_en.md",
+ "slay-the-spire/en",
+ ["Phar"]
+ )]
+
+
class SpireWorld(World):
options = spire_options
game = "Slay the Spire"
topology_present = False
data_version = 1
+ web = SpireWeb()
item_name_to_id = {name: data.code for name, data in item_table.items()}
location_name_to_id = location_table
@@ -78,6 +90,9 @@ class SpireWorld(World):
slot_data[option_name] = int(option.value)
return slot_data
+ def get_filler_item_name(self) -> str:
+ return self.world.random.choice(["Card Draw", "Card Draw", "Card Draw", "Relic", "Relic"])
+
def create_region(world: MultiWorld, player: int, name: str, locations=None, exits=None):
ret = Region(name, None, name, player)
diff --git a/WebHostLib/static/assets/gameInfo/en_Slay the Spire.md b/worlds/spire/docs/en_Slay the Spire.md
similarity index 100%
rename from WebHostLib/static/assets/gameInfo/en_Slay the Spire.md
rename to worlds/spire/docs/en_Slay the Spire.md
diff --git a/WebHostLib/static/assets/tutorial/Slay the Spire/slay-the-spire_en.md b/worlds/spire/docs/slay-the-spire_en.md
similarity index 100%
rename from WebHostLib/static/assets/tutorial/Slay the Spire/slay-the-spire_en.md
rename to worlds/spire/docs/slay-the-spire_en.md
diff --git a/worlds/subnautica/__init__.py b/worlds/subnautica/__init__.py
index 9289052115..3943ea23b6 100644
--- a/worlds/subnautica/__init__.py
+++ b/worlds/subnautica/__init__.py
@@ -11,8 +11,19 @@ from .Regions import create_regions
from .Rules import set_rules
from .Options import options
-from BaseClasses import Region, Entrance, Location, MultiWorld, Item
-from ..AutoWorld import World
+from BaseClasses import Region, Entrance, Location, MultiWorld, Item, Tutorial
+from ..AutoWorld import World, WebWorld
+
+
+class SubnaticaWeb(WebWorld):
+ tutorials = [Tutorial(
+ "Multiworld Setup Guide",
+ "A guide to setting up the Subnautica randomizer connected to an Archipelago Multiworld",
+ "English",
+ "setup_en.md",
+ "setup/en",
+ ["Berserker"]
+ )]
class SubnauticaWorld(World):
@@ -22,6 +33,7 @@ class SubnauticaWorld(World):
You must find a cure for yourself, build an escape rocket, and leave the planet.
"""
game: str = "Subnautica"
+ web = SubnaticaWeb()
item_name_to_id = items_lookup_name_to_id
location_name_to_id = locations_lookup_name_to_id
diff --git a/WebHostLib/static/assets/gameInfo/en_Subnautica.md b/worlds/subnautica/docs/en_Subnautica.md
similarity index 100%
rename from WebHostLib/static/assets/gameInfo/en_Subnautica.md
rename to worlds/subnautica/docs/en_Subnautica.md
diff --git a/WebHostLib/static/assets/tutorial/Subnautica/setup_en.md b/worlds/subnautica/docs/setup_en.md
similarity index 100%
rename from WebHostLib/static/assets/tutorial/Subnautica/setup_en.md
rename to worlds/subnautica/docs/setup_en.md
diff --git a/worlds/timespinner/Options.py b/worlds/timespinner/Options.py
index 0fc0b76765..601882b833 100644
--- a/worlds/timespinner/Options.py
+++ b/worlds/timespinner/Options.py
@@ -1,6 +1,7 @@
-from typing import Dict
+from typing import Dict, Union
from BaseClasses import MultiWorld
-from Options import Toggle, DefaultOnToggle, DeathLink, Choice, Range, Option
+from Options import Toggle, DefaultOnToggle, DeathLink, Choice, Range, Option, OptionDict
+from schema import Schema, And, Optional
class StartWithJewelryBox(Toggle):
"Start with Jewelry Box unlocked"
@@ -54,9 +55,129 @@ class LoreChecks(Toggle):
"Memories and journal entries contain items."
display_name = "Lore Checks"
-class DamageRando(Toggle):
- "Each orb has a high chance of having lower base damage and a low chance of having much higher base damage."
+class DamageRando(Choice):
+ "Randomly nerfs and buffs some orbs and their associated spells as well as some associated rings."
display_name = "Damage Rando"
+ option_off = 0
+ option_allnerfs = 1
+ option_mostlynerfs = 2
+ option_balanced = 3
+ option_mostlybuffs = 4
+ option_allbuffs = 5
+ option_manual = 6
+ alias_false = 0
+ alias_true = 2
+
+class DamageRandoOverrides(OptionDict):
+ "Manual +/-/normal odds for an orb. Put 0 if you don't want a certain nerf or buff to be a possibility. Orbs that you don't specify will roll with 1/1/1 as odds"
+ schema = Schema({
+ Optional("Blue"): {
+ "MinusOdds": And(int, lambda n: n >= 0),
+ "NormalOdds": And(int, lambda n: n >= 0),
+ "PlusOdds": And(int, lambda n: n >= 0)
+ },
+ Optional("Blade"): {
+ "MinusOdds": And(int, lambda n: n >= 0),
+ "NormalOdds": And(int, lambda n: n >= 0),
+ "PlusOdds": And(int, lambda n: n >= 0)
+ },
+ Optional("Fire"): {
+ "MinusOdds": And(int, lambda n: n >= 0),
+ "NormalOdds": And(int, lambda n: n >= 0),
+ "PlusOdds": And(int, lambda n: n >= 0)
+ },
+ Optional("Plasma"): {
+ "MinusOdds": And(int, lambda n: n >= 0),
+ "NormalOdds": And(int, lambda n: n >= 0),
+ "PlusOdds": And(int, lambda n: n >= 0)
+ },
+ Optional("Iron"): {
+ "MinusOdds": And(int, lambda n: n >= 0),
+ "NormalOdds": And(int, lambda n: n >= 0),
+ "PlusOdds": And(int, lambda n: n >= 0)
+ },
+ Optional("Ice"): {
+ "MinusOdds": And(int, lambda n: n >= 0),
+ "NormalOdds": And(int, lambda n: n >= 0),
+ "PlusOdds": And(int, lambda n: n >= 0)
+ },
+ Optional("Wind"): {
+ "MinusOdds": And(int, lambda n: n >= 0),
+ "NormalOdds": And(int, lambda n: n >= 0),
+ "PlusOdds": And(int, lambda n: n >= 0)
+ },
+ Optional("Gun"): {
+ "MinusOdds": And(int, lambda n: n >= 0),
+ "NormalOdds": And(int, lambda n: n >= 0),
+ "PlusOdds": And(int, lambda n: n >= 0)
+ },
+ Optional("Umbra"): {
+ "MinusOdds": And(int, lambda n: n >= 0),
+ "NormalOdds": And(int, lambda n: n >= 0),
+ "PlusOdds": And(int, lambda n: n >= 0)
+ },
+ Optional("Empire"): {
+ "MinusOdds": And(int, lambda n: n >= 0),
+ "NormalOdds": And(int, lambda n: n >= 0),
+ "PlusOdds": And(int, lambda n: n >= 0)
+ },
+ Optional("Eye"): {
+ "MinusOdds": And(int, lambda n: n >= 0),
+ "NormalOdds": And(int, lambda n: n >= 0),
+ "PlusOdds": And(int, lambda n: n >= 0)
+ },
+ Optional("Blood"): {
+ "MinusOdds": And(int, lambda n: n >= 0),
+ "NormalOdds": And(int, lambda n: n >= 0),
+ "PlusOdds": And(int, lambda n: n >= 0)
+ },
+ Optional("ForbiddenTome"): {
+ "MinusOdds": And(int, lambda n: n >= 0),
+ "NormalOdds": And(int, lambda n: n >= 0),
+ "PlusOdds": And(int, lambda n: n >= 0)
+ },
+ Optional("Shattered"): {
+ "MinusOdds": And(int, lambda n: n >= 0),
+ "NormalOdds": And(int, lambda n: n >= 0),
+ "PlusOdds": And(int, lambda n: n >= 0)
+ },
+ Optional("Nether"): {
+ "MinusOdds": And(int, lambda n: n >= 0),
+ "NormalOdds": And(int, lambda n: n >= 0),
+ "PlusOdds": And(int, lambda n: n >= 0)
+ },
+ Optional("Radiant"): {
+ "MinusOdds": And(int, lambda n: n >= 0),
+ "NormalOdds": And(int, lambda n: n >= 0),
+ "PlusOdds": And(int, lambda n: n >= 0)
+ },
+ })
+ display_name = "Damage Rando Overrides"
+ default = {
+ "Blue": { "MinusOdds": 1, "NormalOdds": 1, "PlusOdds": 1 },
+ "Blade": { "MinusOdds": 1, "NormalOdds": 1, "PlusOdds": 1 },
+ "Fire": { "MinusOdds": 1, "NormalOdds": 1, "PlusOdds": 1 },
+ "Plasma": { "MinusOdds": 1, "NormalOdds": 1, "PlusOdds": 1 },
+ "Iron": { "MinusOdds": 1, "NormalOdds": 1, "PlusOdds": 1 },
+ "Ice": { "MinusOdds": 1, "NormalOdds": 1, "PlusOdds": 1 },
+ "Wind": { "MinusOdds": 1, "NormalOdds": 1, "PlusOdds": 1 },
+ "Gun": { "MinusOdds": 1, "NormalOdds": 1, "PlusOdds": 1 },
+ "Umbra": { "MinusOdds": 1, "NormalOdds": 1, "PlusOdds": 1 },
+ "Empire": { "MinusOdds": 1, "NormalOdds": 1, "PlusOdds": 1 },
+ "Eye": { "MinusOdds": 1, "NormalOdds": 1, "PlusOdds": 1 },
+ "Blood": { "MinusOdds": 1, "NormalOdds": 1, "PlusOdds": 1 },
+ "ForbiddenTome": { "MinusOdds": 1, "NormalOdds": 1, "PlusOdds": 1 },
+ "Shattered": { "MinusOdds": 1, "NormalOdds": 1, "PlusOdds": 1 },
+ "Nether": { "MinusOdds": 1, "NormalOdds": 1, "PlusOdds": 1 },
+ "Radiant": { "MinusOdds": 1, "NormalOdds": 1, "PlusOdds": 1 },
+ }
+
+class HpCap(Range):
+ "Sets the number that Lunais's HP maxes out at."
+ display_name = "HP Cap"
+ range_start = 1
+ range_end = 999
+ default = 999
class ShopFill(Choice):
"""Sets the items for sale in Merchant Crow's shops.
@@ -81,6 +202,24 @@ class ShopMultiplier(Range):
range_end = 10
default = 1
+class LootPool(Choice):
+ """Sets the items that drop from enemies (does not apply to boss reward checks)
+ Vanilla: Drops are the same as the base game
+ Randomized: Each slot of every enemy's drop table is given a random use item or piece of equipment.
+ Empty: Enemies drop nothing."""
+ display_name = "Loot Pool"
+ option_vanilla = 0
+ option_randomized = 1
+ option_empty = 2
+
+class ShowBestiary(Toggle):
+ "All entries in the bestiary are visible, without needing to kill one of a given enemy first"
+ display_name = "Show Bestiary Entries"
+
+class ShowDrops(Toggle):
+ "All item drops in the bestiary are visible, without needing an enemy to drop one of a given item first"
+ display_name = "Show Bestiary Item Drops"
+
# Some options that are available in the timespinner randomizer arent currently implemented
timespinner_options: Dict[str, Option] = {
"StartWithJewelryBox": StartWithJewelryBox,
@@ -97,19 +236,23 @@ timespinner_options: Dict[str, Option] = {
"Cantoran": Cantoran,
"LoreChecks": LoreChecks,
"DamageRando": DamageRando,
+ "DamageRandoOverrides": DamageRandoOverrides,
+ "HpCap": HpCap,
"ShopFill": ShopFill,
"ShopWarpShards": ShopWarpShards,
"ShopMultiplier": ShopMultiplier,
+ "LootPool": LootPool,
+ "ShowBestiary": ShowBestiary,
+ "ShowDrops": ShowDrops,
"DeathLink": DeathLink,
}
def is_option_enabled(world: MultiWorld, player: int, name: str) -> bool:
return get_option_value(world, player, name) > 0
-def get_option_value(world: MultiWorld, player: int, name: str) -> int:
+def get_option_value(world: MultiWorld, player: int, name: str) -> Union[int, dict]:
option = getattr(world, name, None)
-
if option == None:
return 0
- return int(option[player].value)
+ return option[player].value
diff --git a/worlds/timespinner/Regions.py b/worlds/timespinner/Regions.py
index c137111558..098657b473 100644
--- a/worlds/timespinner/Regions.py
+++ b/worlds/timespinner/Regions.py
@@ -120,7 +120,7 @@ def create_regions(world: MultiWorld, player: int, locations: Tuple[LocationData
connect(world, player, names, 'Sealed Caves (Xarion)', 'Sealed Caves (upper)', lambda state: state._timespinner_has_doublejump(world, player))
connect(world, player, names, 'Sealed Caves (Xarion)', 'Space time continuum', lambda state: state.has('Twin Pyramid Key', player))
connect(world, player, names, 'Refugee Camp', 'Forest')
- connect(world, player, names, 'Refugee Camp', 'Library', lambda state: not is_option_enabled(world, player, "Inverted"))
+ #connect(world, player, names, 'Refugee Camp', 'Library', lambda state: not is_option_enabled(world, player, "Inverted"))
connect(world, player, names, 'Refugee Camp', 'Space time continuum', lambda state: state.has('Twin Pyramid Key', player))
connect(world, player, names, 'Forest', 'Refugee Camp')
connect(world, player, names, 'Forest', 'Left Side forest Caves', lambda state: state.has('Talaria Attachment', player) or state._timespinner_has_timestop(world, player))
diff --git a/worlds/timespinner/__init__.py b/worlds/timespinner/__init__.py
index a3ce4db174..929cd62212 100644
--- a/worlds/timespinner/__init__.py
+++ b/worlds/timespinner/__init__.py
@@ -1,5 +1,5 @@
from typing import Dict, List, Set, Tuple, TextIO
-from BaseClasses import Item, MultiWorld, Location
+from BaseClasses import Item, MultiWorld, Location, Tutorial
from ..AutoWorld import World, WebWorld
from .LogicMixin import TimespinnerLogic
from .Items import get_item_names_per_category, item_table, starter_melee_weapons, starter_spells, starter_progression_items, filler_items
@@ -10,6 +10,25 @@ from .PyramidKeys import get_pyramid_keys_unlock
class TimespinnerWebWorld(WebWorld):
theme = "ice"
+ setup = Tutorial(
+ "Multiworld Setup Guide",
+ "A guide to setting up the Timespinner randomizer connected to an Archipelago Multiworld",
+ "English",
+ "setup_en.md",
+ "setup/en",
+ ["Jarno"]
+ )
+
+ setup_de = Tutorial(
+ setup.tutorial_name,
+ setup.description,
+ "Deutsch",
+ "setup_de.md",
+ "setup/en",
+ ["Grrmo", "Fynxes", "Blaze0168"]
+ )
+
+ tutorials = [setup, setup_de]
class TimespinnerWorld(World):
"""
diff --git a/WebHostLib/static/assets/gameInfo/en_Timespinner.md b/worlds/timespinner/docs/en_Timespinner.md
similarity index 100%
rename from WebHostLib/static/assets/gameInfo/en_Timespinner.md
rename to worlds/timespinner/docs/en_Timespinner.md
diff --git a/WebHostLib/static/assets/tutorial/Timespinner/setup_de.md b/worlds/timespinner/docs/setup_de.md
similarity index 98%
rename from WebHostLib/static/assets/tutorial/Timespinner/setup_de.md
rename to worlds/timespinner/docs/setup_de.md
index ca430dbc9e..0fe3fe1735 100644
--- a/WebHostLib/static/assets/tutorial/Timespinner/setup_de.md
+++ b/worlds/timespinner/docs/setup_de.md
@@ -1,50 +1,50 @@
-# Timespinner Randomizer Installationsanweisungen
-
-## Benötigte Software
-
-- [Timespinner (Steam)](https://store.steampowered.com/app/368620/Timespinner/)
- , [Timespinner (Humble)](https://www.humblebundle.com/store/timespinner)
- oder [Timespinner (GOG)](https://www.gog.com/game/timespinner) (andere Versionen werden nicht unterstützt)
-- [Timespinner Randomizer](https://github.com/JarnoWesthof/TsRandomizer)
-
-## Wie funktioniert's?
-
-Der Timespinner Randomizer lädt die Timespinner.exe im gleichen Verzeichnis und verändert seine Speicherinformationen um
-die Randomisierung der Gegenstände zu erlauben
-
-## Installationsanweisungen
-
-1. Die aktuellsten Dateien des Randomizers findest du ganz oben auf dieser
- Webseite: [Timespinner Randomizer Releases](https://github.com/JarnoWesthof/TsRandomizer/releases). Lade dir unter '
- Assets' die .zip Datei für dein Betriebssystem herunter
-2. Entpacke die .zip Datei im Ordner, in dem das Spiel Timespinner installiert ist
-
-## Den Randomizer starten
-
-- auf Windows: Starte die Datei TsRandomizer.exe
-- auf Linux: Starte die Datei TsRandomizer.bin.x86_64
-- auf Mac: Starte die Datei TsRandomizer.bin.osx
-
-... im Ordner in dem die Inhalte aus der .zip Datei entpackt wurden
-
-Weitere Informationen zum Randomizer findest du hier: [ReadMe](https://github.com/JarnoWesthof/TsRandomizer)
-
-## An einer Multiworld teilnehmen
-
-1. Starte den Randomizer wie unter [Den Randomizer starten](#Den-Randomizer-starten) beschrieben
-2. Wähle "New Game"
-3. Wechsle "<< Select Seed >>" zu "<< Archiplago >>" indem du "links" auf deinem Controller oder der Tastatur drückst
-4. Wähle "<< Archipelago >>" um ein neues Menu zu öffnen, wo du deine Logininformationen für Archipelago eingeben kannst
- * ANMERKUNG: Die Eingabefelder unterstützen das Einfügen von Informationen mittels 'Ctrl + V'
-5. Wähle "Connect"
-6. Wenn alles funktioniert hat, wechselt das Spiel zurück zur Auswahl des Schwierigkeitsgrads und das Spiel startet,
- sobald du einen davon ausgewählt hast
-
-## Woher bekomme ich eine Konfigurationsdatei?
-
-Die [Player Settings](https://archipelago.gg/games/Timespinner/player-settings) Seite auf der Website erlaubt dir,
-persönliche Einstellungen zu definieren und diese in eine Konfigurationsdatei zu exportieren
-
-* Die Timespinner Randomizer Option "StinkyMaw" ist in Archipelago Seeds aktuell immer an
-* Die Timespinner Randomizer Optionen "ProgressiveVerticalMovement" & "ProgressiveKeycards" werden in Archipelago Seeds
- aktuell nicht unterstützt
+# Timespinner Randomizer Installationsanweisungen
+
+## Benötigte Software
+
+- [Timespinner (Steam)](https://store.steampowered.com/app/368620/Timespinner/)
+ , [Timespinner (Humble)](https://www.humblebundle.com/store/timespinner)
+ oder [Timespinner (GOG)](https://www.gog.com/game/timespinner) (andere Versionen werden nicht unterstützt)
+- [Timespinner Randomizer](https://github.com/JarnoWesthof/TsRandomizer)
+
+## Wie funktioniert's?
+
+Der Timespinner Randomizer lädt die Timespinner.exe im gleichen Verzeichnis und verändert seine Speicherinformationen um
+die Randomisierung der Gegenstände zu erlauben
+
+## Installationsanweisungen
+
+1. Die aktuellsten Dateien des Randomizers findest du ganz oben auf dieser
+ Webseite: [Timespinner Randomizer Releases](https://github.com/JarnoWesthof/TsRandomizer/releases). Lade dir unter '
+ Assets' die .zip Datei für dein Betriebssystem herunter
+2. Entpacke die .zip Datei im Ordner, in dem das Spiel Timespinner installiert ist
+
+## Den Randomizer starten
+
+- auf Windows: Starte die Datei TsRandomizer.exe
+- auf Linux: Starte die Datei TsRandomizer.bin.x86_64
+- auf Mac: Starte die Datei TsRandomizer.bin.osx
+
+... im Ordner in dem die Inhalte aus der .zip Datei entpackt wurden
+
+Weitere Informationen zum Randomizer findest du hier: [ReadMe](https://github.com/JarnoWesthof/TsRandomizer)
+
+## An einer Multiworld teilnehmen
+
+1. Starte den Randomizer wie unter [Den Randomizer starten](#Den-Randomizer-starten) beschrieben
+2. Wähle "New Game"
+3. Wechsle "<< Select Seed >>" zu "<< Archiplago >>" indem du "links" auf deinem Controller oder der Tastatur drückst
+4. Wähle "<< Archipelago >>" um ein neues Menu zu öffnen, wo du deine Logininformationen für Archipelago eingeben kannst
+ * ANMERKUNG: Die Eingabefelder unterstützen das Einfügen von Informationen mittels 'Ctrl + V'
+5. Wähle "Connect"
+6. Wenn alles funktioniert hat, wechselt das Spiel zurück zur Auswahl des Schwierigkeitsgrads und das Spiel startet,
+ sobald du einen davon ausgewählt hast
+
+## Woher bekomme ich eine Konfigurationsdatei?
+
+Die [Player Settings](https://archipelago.gg/games/Timespinner/player-settings) Seite auf der Website erlaubt dir,
+persönliche Einstellungen zu definieren und diese in eine Konfigurationsdatei zu exportieren
+
+* Die Timespinner Randomizer Option "StinkyMaw" ist in Archipelago Seeds aktuell immer an
+* Die Timespinner Randomizer Optionen "ProgressiveVerticalMovement" & "ProgressiveKeycards" werden in Archipelago Seeds
+ aktuell nicht unterstützt
diff --git a/WebHostLib/static/assets/tutorial/Timespinner/setup_en.md b/worlds/timespinner/docs/setup_en.md
similarity index 94%
rename from WebHostLib/static/assets/tutorial/Timespinner/setup_en.md
rename to worlds/timespinner/docs/setup_en.md
index 91c0fd897d..ae8c97a1b3 100644
--- a/WebHostLib/static/assets/tutorial/Timespinner/setup_en.md
+++ b/worlds/timespinner/docs/setup_en.md
@@ -33,7 +33,7 @@ randomized mode. For more info see the [ReadMe](https://github.com/JarnoWesthof/
## Where do I get a config file?
-The [Player Settings](https://archipelago.gg/games/Timespinner/player-settings) page on the website allows you to
+The [Player Settings](/games/Timespinner/player-settings) page on the website allows you to
configure your personal settings and export them into a config file
* The Timespinner Randomizer option "StinkyMaw" is currently always enabled for Archipelago generated seeds
diff --git a/worlds/v6/Options.py b/worlds/v6/Options.py
index 0f363f351e..107fbab465 100644
--- a/worlds/v6/Options.py
+++ b/worlds/v6/Options.py
@@ -30,6 +30,6 @@ v6_options: typing.Dict[str,type(Option)] = {
"AreaRandomizer": AreaRandomizer,
"DoorCost": DoorCost,
"AreaCostRandomizer": AreaCostRandomizer,
- "DeathLink": DeathLink,
+ "death_link": DeathLink,
"DeathLinkAmnesty": DeathLinkAmnesty
}
\ No newline at end of file
diff --git a/worlds/v6/__init__.py b/worlds/v6/__init__.py
index 1970c4820e..fc9b6ed719 100644
--- a/worlds/v6/__init__.py
+++ b/worlds/v6/__init__.py
@@ -5,11 +5,23 @@ from .Locations import location_table, V6Location
from .Options import v6_options
from .Rules import set_rules
from .Regions import create_regions
-from BaseClasses import Region, RegionType, Entrance, Item, MultiWorld
-from ..AutoWorld import World
+from BaseClasses import Region, RegionType, Entrance, Item, MultiWorld, Tutorial
+from ..AutoWorld import World, WebWorld
client_version = 1
+
+class V6Web(WebWorld):
+ tutorials = [Tutorial(
+ "Multiworld Setup Guide",
+ "A guide to setting up VVVVVV for Multiworld.",
+ "English",
+ "setup_en.md",
+ "setup/en",
+ ["N00byKing"]
+ )]
+
+
class V6World(World):
"""
VVVVVV is a platform game all about exploring one simple mechanical idea - what if you reversed gravity instead of jumping?
@@ -17,6 +29,7 @@ class V6World(World):
game: str = "VVVVVV"
topology_present = False
+ web = V6Web()
item_name_to_id = item_table
location_name_to_id = location_table
@@ -58,7 +71,7 @@ class V6World(World):
"AreaRando": self.area_connections,
"DoorCost": self.world.DoorCost[self.player].value,
"AreaCostRando": self.area_cost_map,
- "DeathLink": self.world.DeathLink[self.player].value,
+ "DeathLink": self.world.death_link[self.player].value,
"DeathLink_Amnesty": self.world.DeathLinkAmnesty[self.player].value
}
diff --git a/WebHostLib/static/assets/gameInfo/en_VVVVVV.md b/worlds/v6/docs/en_VVVVVV.md
similarity index 100%
rename from WebHostLib/static/assets/gameInfo/en_VVVVVV.md
rename to worlds/v6/docs/en_VVVVVV.md
diff --git a/WebHostLib/static/assets/tutorial/VVVVVV/setup_en.md b/worlds/v6/docs/setup_en.md
similarity index 100%
rename from WebHostLib/static/assets/tutorial/VVVVVV/setup_en.md
rename to worlds/v6/docs/setup_en.md
diff --git a/worlds/witness/Disable_Unrandomized.txt b/worlds/witness/Disable_Unrandomized.txt
new file mode 100644
index 0000000000..f5c60de6d9
--- /dev/null
+++ b/worlds/witness/Disable_Unrandomized.txt
@@ -0,0 +1,104 @@
+Event Items:
+Shadows Laser Activation - 0x00021,0x17D28,0x17C71
+Bunker Laser Activation - 0x00061,0x17D01,0x17C42
+Monastery Laser Activation - 0x00A5B,0x17CE7,0x17FA9,0x17CA4
+Town Tower 4th Door Opens - 0x17CFB,0x3C12B,0x00B8D,0x17CF7
+
+Requirement Changes:
+0x17CA4 - True - True
+0x28B39 - 0x2896A - Reflection
+0x17CAB - True - True
+
+Region Changes:
+Quarry (Quarry) - Outside Quarry - 0x17C09 - Quarry Mill - 0x275ED - Quarry Mill - 0x17CAC
+
+Disabled Locations:
+0x03505 (Tutorial Gate Close)
+0x0C335 (Tutorial Pillar)
+0x0C373 (Tutorial Patio Floor)
+0x009B8 (Symmetry Island Scenery Outlines 1)
+0x003E8 (Symmetry Island Scenery Outlines 2)
+0x00A15 (Symmetry Island Scenery Outlines 3)
+0x00B53 (Symmetry Island Scenery Outlines 4)
+0x00B8D (Symmetry Island Scenery Outlines 5)
+0x00143 (Orchard Apple Tree 1)
+0x0003B (Orchard Apple Tree 2)
+0x00055 (Orchard Apple Tree 3)
+0x032F7 (Orchard Apple Tree 4)
+0x032FF (Orchard Apple Tree 5)
+0x168B5 (Shadows Lower Avoid 1)
+0x198BD (Shadows Lower Avoid 2)
+0x198BF (Shadows Lower Avoid 3)
+0x19771 (Shadows Lower Avoid 4)
+0x0A8DC (Shadows Lower Avoid 5)
+0x0AC74 (Shadows Lower Avoid 6)
+0x0AC7A (Shadows Lower Avoid 7)
+0x0A8E0 (Shadows Lower Avoid 8)
+0x386FA (Shadows Environmental Avoid 1)
+0x1C33F (Shadows Environmental Avoid 2)
+0x196E2 (Shadows Environmental Avoid 3)
+0x1972A (Shadows Environmental Avoid 4)
+0x19809 (Shadows Environmental Avoid 5)
+0x19806 (Shadows Environmental Avoid 6)
+0x196F8 (Shadows Environmental Avoid 7)
+0x1972F (Shadows Environmental Avoid 8)
+0x19797 (Shadows Follow 1)
+0x1979A (Shadows Follow 2)
+0x197E0 (Shadows Follow 3)
+0x197E8 (Shadows Follow 4)
+0x197E5 (Shadows Follow 5)
+0x19650 (Shadows Laser)
+0x00139 (Keep Hedge Maze 1)
+0x019DC (Keep Hedge Maze 2)
+0x019E7 (Keep Hedge Maze 3)
+0x01A0F (Keep Hedge Maze 4)
+0x0360E (Laser Hedges)
+0x00290 (Monastery Rhombic Avoid 1)
+0x00038 (Monastery Rhombic Avoid 2)
+0x00037 (Monastery Rhombic Avoid 3)
+0x193A7 (Monastery Branch Avoid 1)
+0x193AA (Monastery Branch Avoid 2)
+0x193AB (Monastery Branch Follow 1)
+0x193A6 (Monastery Branch Follow 2)
+0x17CA4 (Monastery Laser) - 0x193A6 - True
+0x18590 (Tree Outlines) - True - Symmetry & Environment
+0x28AE3 (Vines Shadows Follow) - 0x18590 - Shadows Follow & Environment
+0x28938 (Four-way Apple Tree) - 0x28AE3 - Environment
+0x079DF (Triple Environmental Puzzle) - 0x28938 - Shadows Avoid & Environment & Reflection
+0x28B39 (Hexagonal Reflection) - 0x079DF & 0x2896A - Reflection
+0x03553 (Theater Tutorial Video)
+0x03552 (Theater Desert Video)
+0x0354E (Theater Jungle Video)
+0x03549 (Theater Challenge Video)
+0x0354F (Theater Shipwreck Video)
+0x03545 (Theater Mountain Video)
+0x002C4 (Waves 1)
+0x00767 (Waves 2)
+0x002C6 (Waves 3)
+0x0070E (Waves 4)
+0x0070F (Waves 5)
+0x0087D (Waves 6)
+0x002C7 (Waves 7)
+0x15ADD (River Rhombic Avoid Vault)
+0x03702 (River Vault Box)
+0x17C2E (Door to Bunker) - True - Squares & Black/White Squares
+0x09F7D (Bunker Drawn Squares 1)
+0x09FDC (Bunker Drawn Squares 2)
+0x09FF7 (Bunker Drawn Squares 3)
+0x09F82 (Bunker Drawn Squares 4)
+0x09FF8 (Bunker Drawn Squares 5)
+0x09D9F (Bunker Drawn Squares 6)
+0x09DA1 (Bunker Drawn Squares 7)
+0x09DA2 (Bunker Drawn Squares 8)
+0x09DAF (Bunker Drawn Squares 9)
+0x0A010 (Bunker Drawn Squares through Tinted Glass 1)
+0x0A01B (Bunker Drawn Squares through Tinted Glass 2)
+0x0A01F (Bunker Drawn Squares through Tinted Glass 3)
+0x0A099 (Door to Bunker Proper)
+0x34BC5 (Bunker Drop-Down Door Open)
+0x34BC6 (Bunker Drop-Down Door Close)
+0x17E63 (Bunker Drop-Down Door Squares 1)
+0x17E67 (Bunker Drop-Down Door Squares 2)
+0x09DE0 (Bunker Laser)
+0x0A079 (Bunker Elevator Control)
+0x0042D (Mountaintop River Shape)
\ No newline at end of file
diff --git a/worlds/witness/Options.py b/worlds/witness/Options.py
new file mode 100644
index 0000000000..ce590810b7
--- /dev/null
+++ b/worlds/witness/Options.py
@@ -0,0 +1,80 @@
+from typing import Dict
+from BaseClasses import MultiWorld
+from Options import Toggle, DefaultOnToggle, Option, Range
+
+
+# class HardMode(Toggle):
+# "Play the randomizer in hardmode"
+# display_name = "Hard Mode"
+
+# class UnlockSymbols(DefaultOnToggle):
+# "All Puzzle symbols of a specific panel need to be unlocked before the panel can be used"
+# display_name = "Unlock Symbols"
+
+class DisableNonRandomizedPuzzles(DefaultOnToggle):
+ """Disable puzzles that cannot be randomized.
+ Non randomized puzzles are Shadows, Monastery, and Greenhouse.
+ The lasers for those areas will be activated as you solve optional puzzles throughout the island."""
+ display_name = "Disable non randomized puzzles"
+
+
+class ShuffleDiscardedPanels(Toggle):
+ """Discarded Panels will have items on them.
+ Solving certain Discarded Panels may still be necessary!"""
+ display_name = "Shuffle Discarded Panels"
+
+
+class ShuffleVaultBoxes(Toggle):
+ """Vault Boxes will have items on them."""
+ display_name = "Shuffle Vault Boxes"
+
+
+class ShuffleUncommonLocations(Toggle):
+ """Adds some optional puzzles that are somewhat difficult or out of the way.
+ Examples: Mountaintop River Shape, Tutorial Patio Floor, Theater Videos"""
+ display_name = "Shuffle Uncommon Locations"
+
+
+class ShuffleHardLocations(Toggle):
+ """Adds some harder locations into the game, e.g. Mountain Secret Area panels"""
+ display_name = "Shuffle Hard Locations"
+
+
+class ChallengeVictoryCondition(Toggle):
+ """The victory condition now becomes beating the Challenge area,
+ instead of the final elevator."""
+ display_name = "Victory on beating the Challenge"
+
+
+class TrapPercentage(Range):
+ """Replaces junk items with traps, at the specified rate."""
+ display_name = "Trap Percentage"
+ range_start = 0
+ range_end = 100
+ default = 20
+
+
+the_witness_options: Dict[str, Option] = {
+ # "hard_mode": HardMode,
+ # "unlock_symbols": UnlockSymbols,
+ "disable_non_randomized_puzzles": DisableNonRandomizedPuzzles,
+ "shuffle_discarded_panels": ShuffleDiscardedPanels,
+ "shuffle_vault_boxes": ShuffleVaultBoxes,
+ "shuffle_uncommon": ShuffleUncommonLocations,
+ "shuffle_hard": ShuffleHardLocations,
+ "challenge_victory": ChallengeVictoryCondition,
+ "trap_percentage": TrapPercentage
+}
+
+
+def is_option_enabled(world: MultiWorld, player: int, name: str) -> bool:
+ return get_option_value(world, player, name) > 0
+
+
+def get_option_value(world: MultiWorld, player: int, name: str) -> int:
+ option = getattr(world, name, None)
+
+ if option is None:
+ return 0
+
+ return int(option[player].value)
diff --git a/worlds/witness/WitnessItems.txt b/worlds/witness/WitnessItems.txt
new file mode 100644
index 0000000000..75504974d6
--- /dev/null
+++ b/worlds/witness/WitnessItems.txt
@@ -0,0 +1,21 @@
+Progression:
+0 - Dots
+1 - Colored Dots
+5 - Sound Dots
+10 - Symmetry
+20 - Triangles
+30 - Eraser
+40 - Shapers
+41 - Rotated Shapers
+50 - Negative Shapers
+60 - Stars
+61 - Stars + Same Colored Symbol
+71 - Black/White Squares
+72 - Colored Squares
+
+Boosts:
+500 - Speed Boost
+
+Traps:
+600 - Slowness
+610 - Power Surge
diff --git a/worlds/witness/WitnessLogic.txt b/worlds/witness/WitnessLogic.txt
new file mode 100644
index 0000000000..f163f4e0f4
--- /dev/null
+++ b/worlds/witness/WitnessLogic.txt
@@ -0,0 +1,712 @@
+First Hallway (First Hallway) - Entry - True:
+0x00064 (Straight) - True - True
+0x00182 (Bend) - 0x00064 - True
+
+Tutorial (Tutorial) - First Hallway - 0x00182:
+0x00293 (Front Center) - True - True
+0x00295 (Center Left) - 0x00293 - True
+0x002C2 (Front Left) - 0x00295 - True
+0x0A3B5 (Back Left) - True - True
+0x0A3B2 (Back Right) - True - True
+0x03629 (Gate Open) - 0x002C2 & 0x0A3B5 & 0x0A3B2 - True
+0x03505 (Gate Close) - 0x2FAF6 - True
+0x0C335 (Pillar) - True - Triangles - True
+0x0C373 (Patio Floor) - 0x0C335 - True
+
+Outside Tutorial (Outside Tutorial) - Tutorial - 0x03629:
+0x033D4 (Vault) - True - Dots & Squares & Black/White Squares
+0x03481 (Vault Box) - 0x033D4 - True
+0x0A171 (Optional Door 1) - 0x0A3B5 - Dots
+0x17CFB (Discard) - 0x0A171 - Triangles
+0x04CA4 (Optional Door 2) - 0x0A171 - Dots & Squares & Black/White Squares
+0x0005D (Dots Introduction 1) - True - Dots
+0x0005E (Dots Introduction 2) - 0x0005D - Dots
+0x0005F (Dots Introduction 3) - 0x0005E - Dots
+0x00060 (Dots Introduction 4) - 0x0005F - Dots
+0x00061 (Dots Introduction 5) - 0x00060 - Dots
+0x018AF (Squares Introduction 1) - True - Squares & Black/White Squares
+0x0001B (Squares Introduction 2) - 0x018AF - Squares & Black/White Squares
+0x012C9 (Squares Introduction 3) - 0x0001B - Squares & Black/White Squares
+0x0001C (Squares Introduction 4) - 0x012C9 - Squares & Black/White Squares
+0x0001D (Squares Introduction 5) - 0x0001C - Squares & Black/White Squares
+0x0001E (Squares Introduction 6) - 0x0001D - Squares & Black/White Squares
+0x0001F (Squares Introduction 7) - 0x0001E - Squares & Black/White Squares
+0x00020 (Squares Introduction 8) - 0x0001F - Squares & Black/White Squares
+0x00021 (Squares Introduction 9) - 0x00020 - Squares & Black/White Squares
+
+Main Island () - Outside Tutorial - True:
+
+Outside Glass Factory (Glass Factory) - Main Island - True:
+0x01A54 (Entry Door) - True - Symmetry
+0x3C12B (Discard) - True - Triangles
+
+Inside Glass Factory (Glass Factory) - Outside Glass Factory - 0x01A54:
+0x00086 (Vertical Symmetry 1) - True - Symmetry
+0x00087 (Vertical Symmetry 2) - 0x00086 - Symmetry
+0x00059 (Vertical Symmetry 3) - 0x00087 - Symmetry
+0x00062 (Vertical Symmetry 4) - 0x00059 - Symmetry
+0x0005C (Vertical Symmetry 5) - 0x00062 - Symmetry
+0x0008D (Rotational Symmetry 1) - 0x0005C - Symmetry
+0x00081 (Rotational Symmetry 2) - 0x0008D - Symmetry
+0x00083 (Rotational Symmetry 3) - 0x00081 - Symmetry
+0x00084 (Melting 1) - 0x00083 - Symmetry
+0x00082 (Melting 2) - 0x00084 - Symmetry
+0x0343A (Melting 3) - 0x00082 - Symmetry
+0x17CC8 (Boat Spawn) - True - Boat
+
+Outside Symmetry Island (Symmetry Island) - Main Island - True:
+0x000B0 (Door to Symmetry Island Lower) - True - Dots
+
+Symmetry Island Lower (Symmetry Island) - Outside Symmetry Island - 0x000B0:
+0x00022 (Black Dots 1) - True - Symmetry & Dots
+0x00023 (Black Dots 2) - 0x00022 - Symmetry & Dots
+0x00024 (Black Dots 3) - 0x00023 - Symmetry & Dots
+0x00025 (Black Dots 4) - 0x00024 - Symmetry & Dots
+0x00026 (Black Dots 5) - 0x00025 - Symmetry & Dots
+0x0007C (Colored Dots 1) - 0x00026 - Symmetry & Colored Dots
+0x0007E (Colored Dots 2) - 0x0007C - Symmetry & Colored Dots
+0x00075 (Colored Dots 3) - 0x0007E - Symmetry & Colored Dots
+0x00073 (Colored Dots 4) - 0x00075 - Symmetry & Colored Dots
+0x00077 (Colored Dots 5) - 0x00073 - Symmetry & Colored Dots
+0x00079 (Colored Dots 6) - 0x00077 - Symmetry & Colored Dots
+0x00065 (Fading Lines 1) - 0x00079 - Symmetry & Colored Dots
+0x0006D (Fading Lines 2) - 0x00065 - Symmetry & Colored Dots
+0x00072 (Fading Lines 3) - 0x0006D - Symmetry & Colored Dots
+0x0006F (Fading Lines 4) - 0x00072 - Symmetry & Colored Dots
+0x00070 (Fading Lines 5) - 0x0006F - Symmetry & Colored Dots
+0x00071 (Fading Lines 6) - 0x00070 - Symmetry & Colored Dots
+0x00076 (Fading Lines 7) - 0x00071 - Symmetry & Colored Dots
+0x009B8 (Scenery Outlines 1) - True - Symmetry & Environment
+0x003E8 (Scenery Outlines 2) - 0x009B8 - Symmetry & Environment
+0x00A15 (Scenery Outlines 3) - 0x003E8 - Symmetry & Environment
+0x00B53 (Scenery Outlines 4) - 0x00A15 - Symmetry & Environment
+0x00B8D (Scenery Outlines 5) - 0x00B53 - Symmetry & Environment
+0x1C349 (Door to Symmetry Island Upper) - 0x00076 - Symmetry & Dots
+
+Symmetry Island Upper (Symmetry Island) - Symmetry Island Lower - 0x1C349:
+0x00A52 (Yellow 1) - True - Symmetry & Colored Dots
+0x00A57 (Yellow 2) - 0x00A52 - Symmetry & Colored Dots
+0x00A5B (Yellow 3) - 0x00A57 - Symmetry & Colored Dots
+0x00A61 (Blue 1) - 0x00A52 - Symmetry & Colored Dots
+0x00A64 (Blue 2) - 0x00A61 & 0x00A52 - Symmetry & Colored Dots
+0x00A68 (Blue 3) - 0x00A64 & 0x00A57 - Symmetry & Colored Dots
+0x0360D (Laser) - 0x00A68 - True
+
+Orchard (Orchard) - Main Island - True:
+0x00143 (Apple Tree 1) - True - Environment
+0x0003B (Apple Tree 2) - 0x00143 - Environment
+0x00055 (Apple Tree 3) - 0x0003B - Environment
+0x032F7 (Apple Tree 4) - 0x00055 - Environment
+0x032FF (Apple Tree 5) - 0x032F7 - Environment
+
+Desert Outside (Desert) - Main Island - True:
+0x0CC7B (Vault) - True - Dots & Shapers & Rotated Shapers & Negative Shapers
+0x0339E (Vault Box) - 0x0CC7B - True
+0x17CE7 (Discard) - True - Triangles
+0x00698 (Sun Reflection 1) - True - Reflection
+0x0048F (Sun Reflection 2) - 0x00698 - Reflection
+0x09F92 (Sun Reflection 3) - 0x0048F & 0x09FA0 - Reflection
+0x09FA0 (Reflection 3 Control) - 0x0048F - True
+0x0A036 (Sun Reflection 4) - 0x09F92 - Reflection
+0x09DA6 (Sun Reflection 5) - 0x09F92 - Reflection
+0x0A049 (Sun Reflection 6) - 0x09F92 - Reflection
+0x0A053 (Sun Reflection 7) - 0x0A036 & 0x09DA6 & 0x0A049 - Reflection
+0x09F94 (Sun Reflection 8) - 0x0A053 & 0x09F86 - Reflection
+0x09F86 (Reflection 8 Control) - 0x0A053 - True
+0x0C339 (Door to Desert Flood Light Room) - 0x09F94 - True
+
+Desert Floodlight Room (Desert) - Desert Outside - 0x0C339:
+0x09FAA (Light Control) - True - True
+0x00422 (Artificial Light Reflection 1) - 0x09FAA - Reflection
+0x006E3 (Artificial Light Reflection 2) - 0x09FAA - Reflection
+0x0A02D (Artificial Light Reflection 3) - 0x09FAA & 0x00422 & 0x006E3 - Reflection
+
+Desert Pond Room (Desert) - Desert Floodlight Room - 0x0A02D:
+0x00C72 (Pond Reflection 1) - True - Reflection
+0x0129D (Pond Reflection 2) - 0x00C72 - Reflection
+0x008BB (Pond Reflection 3) - 0x0129D - Reflection
+0x0078D (Pond Reflection 4) - 0x008BB - Reflection
+0x18313 (Pond Reflection 5) - 0x0078D - Reflection
+0x0A249 (Door to Desert Water Levels Room) - 0x18313 - Reflection
+
+Desert Water Levels Room (Desert) - Desert Pond Room - 0x0A249:
+0x1C2DF (Reduce Water Level Far Left) - True - True
+0x1831E (Reduce Water Level Far Right) - True - True
+0x1C260 (Reduce Water Level Near Left) - True - True
+0x1831C (Reduce Water Level Near Right) - True - True
+0x1C2F3 (Raise Water Level Far Left) - True - True
+0x1831D (Raise Water Level Far Right) - True - True
+0x1C2B1 (Raise Water Level Near Left) - True - True
+0x1831B (Raise Water Level Near Right) - True - True
+0x04D18 (Flood Reflection 1) - True - Reflection
+0x01205 (Flood Reflection 2) - 0x04D18 - Reflection
+0x181AB (Flood Reflection 3) - 0x01205 - Reflection
+0x0117A (Flood Reflection 4) - 0x181AB - Reflection
+0x17ECA (Flood Reflection 5) - 0x0117A - Reflection
+0x18076 (Flood Reflection 6) - 0x17ECA - Reflection
+
+Desert Elevator Room (Desert) - Desert Water Levels Room - 0x18076:
+0x17C31 (Final Transparent Reflection) - True - Reflection
+0x012D7 (Final Reflection) - 0x17C31 & 0x0A015 - Reflection
+0x012D7 (Final Reflection) - 0x17C31 & 0x0A015 - Reflection
+0x0A015 (Final Reflection Control) - 0x17C31 - True
+0x0A15C (Final Bent Reflection 1) - True - Reflection
+0x09FFF (Final Bent Reflection 2) - 0x0A15C - Reflection
+0x0A15F (Final Bent Reflection 3) - 0x09FFF - Reflection
+0x03608 (Laser) - 0x012D7 & 0x0A15F - True
+
+Outside Quarry (Quarry) - Main Island - True:
+0x09E57 (Door to Quarry 1) - True - Squares & Black/White Squares
+0x17C09 (Door to Quarry 2) - 0x09E57 - Shapers
+0x17CC4 (Elevator Control) - 0x0367C - Dots & Eraser
+
+Quarry (Quarry) - Outside Quarry - 0x17C09 - Quarry Mill - 0x275ED - Quarry Mill - 0x17CAC - Shadows Ledge - 0x198BF:
+0x01E5A (Door to Mill Left) - True - Squares & Black/White Squares
+0x01E59 (Door to Mill Right) - True - Dots
+0x17CF0 (Discard) - True - Triangles
+0x03612 (Laser) - 0x0A3D0 & 0x0367C - Eraser & Shapers
+
+Quarry Mill (Quarry Mill) - Quarry - 0x01E59 & 0x01E5A:
+0x275ED (Ground Floor Shortcut Door) - True - True
+0x03678 (Lower Ramp Control) - True - Dots & Eraser
+0x00E0C (Eraser and Dots 1) - 0x03678 - Dots & Eraser
+0x01489 (Eraser and Dots 2) - 0x00E0C - Dots & Eraser
+0x0148A (Eraser and Dots 3) - 0x01489 - Dots & Eraser
+0x014D9 (Eraser and Dots 4) - 0x0148A - Dots & Eraser
+0x014E7 (Eraser and Dots 5) - 0x014D9 - Dots & Eraser
+0x014E8 (Eraser and Dots 6) - 0x014E7 - Dots & Eraser
+0x03679 (Lower Lift Control) - 0x014E8 - Dots & Eraser
+0x03675 (Upper Ramp Control) - 0x03679 - Dots & Eraser
+0x03676 (Upper Lift Control) - 0x03679 - Dots & Eraser
+0x00557 (Eraser and Squares 1) - 0x03679 - Squares & Colored Squares & Eraser
+0x005F1 (Eraser and Squares 2) - 0x00557 - Squares & Colored Squares & Eraser
+0x00620 (Eraser and Squares 3) - 0x005F1 - Squares & Colored Squares & Eraser
+0x009F5 (Eraser and Squares 4) - 0x00620 - Squares & Colored Squares & Eraser
+0x0146C (Eraser and Squares 5) - 0x009F5 - Squares & Colored Squares & Eraser
+0x3C12D (Eraser and Squares 6) - 0x0146C - Squares & Colored Squares & Eraser
+0x03686 (Eraser and Squares 7) - 0x3C12D - Squares & Colored Squares & Eraser
+0x014E9 (Eraser and Squares 8) - 0x03686 - Squares & Colored Squares & Eraser
+0x03677 (Stair Control) - 0x014E8 - Squares & Colored Squares & Eraser
+0x3C125 (Big Squares & Dots & and Eraser) - 0x0367C - Squares & Black/White Squares & Dots & Eraser
+0x0367C (Small Squares & Dots & and Eraser) - 0x014E9 - Squares & Colored Squares & Dots & Eraser
+0x17CAC (Door to Outside Quarry Stairs) - True - True
+
+Quarry Boathouse (Quarry Boathouse) - Quarry - True:
+0x034D4 (Intro Stars) - True - Stars
+0x021D5 (Intro Shapers) - True - Shapers & Rotated Shapers
+0x03852 (Ramp Height Control) - 0x034D4 & 0x021D5 - Rotated Shapers
+0x021B3 (Eraser and Shapers 1) - 0x03852 - Shapers & Eraser
+0x021B4 (Eraser and Shapers 2) - 0x021B3 - Shapers & Eraser
+0x021B0 (Eraser and Shapers 3) - 0x021B4 - Shapers & Eraser
+0x021AF (Eraser and Shapers 4) - 0x021B0 - Shapers & Eraser
+0x021AE (Eraser and Shapers 5) - 0x021AF - Shapers & Eraser & Broken Shapers
+0x03858 (Ramp Horizontal Control) - 0x021AE - Shapers & Eraser
+0x38663 (Shortcut Door) - 0x03858 - True
+0x021B5 (Stars and Colored Eraser 1) - 0x03858 - Stars & Stars + Same Colored Symbol & Eraser
+0x021B6 (Stars and Colored Eraser 2) - 0x021B5 - Stars & Stars + Same Colored Symbol & Eraser
+0x021B7 (Stars and Colored Eraser 3) - 0x021B6 - Stars & Stars + Same Colored Symbol & Eraser
+0x021BB (Stars and Colored Eraser 4) - 0x021B7 - Stars & Stars + Same Colored Symbol & Eraser
+0x09DB5 (Stars and Colored Eraser 5) - 0x021BB - Stars & Stars + Same Colored Symbol & Eraser
+0x09DB1 (Stars and Colored Eraser 6) - 0x09DB5 - Stars & Stars + Same Colored Symbol & Eraser
+0x3C124 (Stars and Colored Eraser 7) - 0x09DB1 - Stars & Stars + Same Colored Symbol & Eraser
+0x09DB3 (Stars & Eraser & and Shapers 1) - 0x3C124 - Stars & Eraser & Shapers
+0x09DB4 (Stars & Eraser & and Shapers 2) - 0x09DB3 - Stars & Eraser & Shapers
+0x275FA (Hook Control) - 0x03858 - Shapers & Eraser
+0x17CA6 (Boat Spawn) - True - Boat
+0x0A3CB (Stars & Eraser & and Shapers 3) - 0x09DB4 - Stars & Eraser & Shapers
+0x0A3CC (Stars & Eraser & and Shapers 4) - 0x0A3CB - Stars & Eraser & Shapers
+0x0A3D0 (Stars & Eraser & and Shapers 5) - 0x0A3CC - Stars & Eraser & Shapers
+
+Shadows (Shadows) - Main Island - True - Keep Glass Plates - 0x09E49:
+0x334DB (Door Timer Outside) - True - True
+0x0AC74 (Lower Avoid 6) - 0x0A8DC - Shadows Avoid
+0x0AC7A (Lower Avoid 7) - 0x0AC74 - Shadows Avoid
+0x0A8E0 (Lower Avoid 8) - 0x0AC7A - Shadows Avoid
+0x386FA (Environmental Avoid 1) - 0x0A8E0 - Shadows Avoid & Environment
+0x1C33F (Environmental Avoid 2) - 0x386FA - Shadows Avoid & Environment
+0x196E2 (Environmental Avoid 3) - 0x1C33F - Shadows Avoid & Environment
+0x1972A (Environmental Avoid 4) - 0x196E2 - Shadows Avoid & Environment
+0x19809 (Environmental Avoid 5) - 0x1972A - Shadows Avoid & Environment
+0x19806 (Environmental Avoid 6) - 0x19809 - Shadows Avoid & Environment
+0x196F8 (Environmental Avoid 7) - 0x19806 - Shadows Avoid & Environment
+0x1972F (Environmental Avoid 8) - 0x196F8 - Shadows Avoid & Environment
+0x19797 (Follow 1) - 0x0A8E0 - Shadows Follow
+0x1979A (Follow 2) - 0x19797 - Shadows Follow
+0x197E0 (Follow 3) - 0x1979A - Shadows Follow
+0x197E8 (Follow 4) - 0x197E0 - Shadows Follow
+0x197E5 (Follow 5) - 0x197E8 - Shadows Follow
+0x19650 (Laser) - 0x197E5 & 0x196F8 - Shadows Avoid & Shadows Follow
+
+Shadows Ledge (Shadows) - Shadows - 0x334DB | 0x334DC | 0x0A8DC:
+0x334DC (Door Timer Inside) - True - True
+0x168B5 (Lower Avoid 1) - True - Shadows Avoid
+0x198BD (Lower Avoid 2) - 0x168B5 - Shadows Avoid
+0x198BF (Lower Avoid 3) - 0x198BD & 0x334DC - Shadows Avoid
+0x19771 (Lower Avoid 4) - 0x198BF - Shadows Avoid
+0x0A8DC (Lower Avoid 5) - 0x19771 - Shadows Avoid
+
+Keep (Keep) - Main Island - True:
+
+Keep Hedges (Keep) - Keep - True:
+0x00139 (Hedge Maze 1) - True - Environment
+0x019DC (Hedge Maze 2) - 0x00139 - Environment
+0x019E7 (Hedge Maze 3) - 0x019DC - Environment & Sound
+0x01A0F (Hedge Maze 4) - 0x019E7 - Environment
+
+Keep Glass Plates (Keep) - Keep - True - Keep Tower - 0x0361B:
+0x0A3A8 (Reset Pressure Plates 1) - True - True
+0x033EA (Pressure Plates 1) - 0x0A3A8 - Pressure Plates & Dots
+0x0A3B9 (Reset Pressure Plates 2) - 0x033EA - True
+0x01BE9 (Pressure Plates 2) - 0x033EA & 0x0A3B9 - Pressure Plates & Stars & Stars + Same Colored Symbol & Squares & Black/White Squares
+0x0A3BB (Reset Pressure Plates 3) - 0x0A3A8 - True
+0x01CD3 (Pressure Plates 3) - 0x0A3A8 & 0x0A3BB - Pressure Plates & Shapers & Squares & Black/White Squares & Colored Squares
+0x0A3AD (Reset Pressure Plates 4) - 0x01CD3 - True
+0x01D3F (Pressure Plates 4) - 0x01CD3 & 0x0A3AD - Pressure Plates & Shapers & Dots & Symmetry
+0x17D27 (Discard) - 0x01CD3 - Triangles
+0x09E49 (Shortcut to Shadows) - 0x01CD3 - True
+
+Shipwreck (Shipwreck) - Keep Glass Plates - 0x033EA:
+0x00AFB (Vault) - True - Symmetry & Sound & Sound Dots & Colored Dots
+0x03535 (Vault Box) - 0x00AFB - True
+0x17D28 (Discard) - True - Triangles
+
+Keep Tower (Keep) - Keep Hedges - 0x01A0F - Keep Glass Plates - 0x01D3F:
+0x0361B (Shortcut to Keep Glass Plates) - True - True
+0x0360E (Laser Hedges) - 0x01A0F - Environment & Sound
+0x03317 (Laser Pressure Plates) - 0x01D3F - Shapers & Squares & Black/White Squares & Colored Squares & Stars & Stars + Same Colored Symbol & Dots
+
+Outside Monastery (Monastery) - Main Island - True:
+0x03713 (Shortcut) - True - True
+0x00B10 (Door Open Left) - True - True
+0x00C92 (Door Open Right) - True - True
+0x00290 (Rhombic Avoid 1) - 0x09D9B - Environment
+0x00038 (Rhombic Avoid 2) - 0x09D9B & 0x00290 - Environment
+0x00037 (Rhombic Avoid 3) - 0x09D9B & 0x00038 - Environment
+0x17CA4 (Laser) - 0x193A6 - True
+
+Inside Monastery (Monastery) - Outside Monastery - 0x00B10 & 0x00C92:
+0x09D9B (Overhead Door Control) - True - Dots
+0x193A7 (Branch Avoid 1) - 0x00037 - Environment
+0x193AA (Branch Avoid 2) - 0x193A7 - Environment
+0x193AB (Branch Follow 1) - 0x193AA - Environment
+0x193A6 (Branch Follow 2) - 0x193AB - Environment
+
+Monastery Garden (Monastery) - Outside Monastery - 0x00037 - Outside Jungle River - 0x17CAA:
+
+Town (Town) - Main Island - True - Theater - 0x0A168 | 0x33AB2:
+0x0A054 (Boat Summon) - True - Boat
+0x0A0C8 (Cargo Box) - True - Squares & Black/White Squares & Shapers
+0x17D01 (Cargo Box Discard) - 0x0A0C8 - Triangles
+0x09F98 (Desert Laser Redirect) - True - True
+0x18590 (Tree Outlines) - True - Symmetry & Environment
+0x28AE3 (Vines Shadows Follow) - 0x18590 - Shadows Follow & Environment
+0x28938 (Four-way Apple Tree) - 0x28AE3 - Environment
+0x079DF (Triple Environmental Puzzle) - 0x28938 - Shadows Avoid & Environment & Reflection
+0x28B39 (Hexagonal Reflection) - 0x079DF & 0x2896A - Reflection
+0x28998 (Tinted Door to RGB House) - True - Stars & Rotated Shapers
+0x28A0D (Door to Church) - 0x28998 - Stars & RGB & Environment
+0x28A69 (Square Avoid) - 0x28A0D - Environment
+0x28A79 (Maze Stair Control) - True - Environment
+0x2896A (Maze Rooftop Bridge Control) - 0x28A79 - Shapers
+0x17C71 (Rooftop Discard) - 0x2896A - Triangles
+0x28AC7 (Symmetry Squares 1) - 0x2896A - Symmetry & Squares & Black/White Squares
+0x28AC8 (Symmetry Squares 2) - 0x28AC7 - Symmetry & Squares & Black/White Squares
+0x28ACA (Symmetry Squares 3 + Dots) - 0x28AC8 - Symmetry & Squares & Black/White Squares & Dots
+0x28ACB (Symmetry Squares 4 + Dots) - 0x28ACA - Symmetry & Squares & Black/White Squares & Dots
+0x28ACC (Symmetry Squares 5 + Dots) - 0x28ACB - Symmetry & Squares & Black/White Squares & Dots
+0x2899C (Full Dot Grid Shapers 1) - True - Rotated Shapers & Dots
+0x28A33 (Full Dot Grid Shapers 2) - 0x2899C - Shapers & Dots
+0x28ABF (Full Dot Grid Shapers 3) - 0x28A33 - Shapers & Rotated Shapers & Dots
+0x28AC0 (Full Dot Grid Shapers 4) - 0x28ABF - Rotated Shapers & Dots
+0x28AC1 (Full Dot Grid Shapers 5) - 0x28AC0 - Rotated Shapers & Dots
+0x28AD9 (Shapers & Dots & and Eraser) - 0x28AC1 - Rotated Shapers & Dots & Eraser
+0x17F5F (Windmill Door) - True - Dots
+
+RGB House (Town) - Town - 0x28998:
+0x034E4 (Sound Room Left) - True - Sound & Sound Waves
+0x034E3 (Sound Room Right) - True - Sound & Sound Dots
+0x334D8 (RGB Control) - 0x034E4 & 0x034E3 - Rotated Shapers & RGB & Squares & Colored Squares
+0x03C0C (RGB Squares) - 0x334D8 - RGB & Squares & Colored Squares & Black/White Squares
+0x03C08 (RGB Stars) - 0x334D8 - RGB & Stars
+
+Town Tower Top (Town) - Town - 0x28A69 & 0x28B39 & 0x28ACC & 0x28AD9:
+0x032F5 (Laser) - True - True
+
+Windmill Interior (Windmill) - Town - 0x17F5F:
+0x17D02 (Turn Control) - True - Dots
+0x17F89 (Door to Front of Theater) - True - Squares & Black/White Squares
+
+Theater (Theater) - Windmill Interior - 0x17F89:
+0x00815 (Video Input) - True - True
+0x03553 (Tutorial Video) - 0x00815 & 0x03481 - True
+0x03552 (Desert Video) - 0x00815 & 0x0339E - True
+0x0354E (Jungle Video) - 0x00815 & 0x03702 - True
+0x03549 (Challenge Video) - 0x00815 & 0x2FAF6 - True
+0x0354F (Shipwreck Video) - 0x00815 & 0x03535 - True
+0x03545 (Mountain Video) - 0x00815 & 0x03542 - True
+0x0A168 (Door to Cargo Box Left) - True - Squares & Black/White Squares & Eraser
+0x33AB2 (Door to Cargo Box Right) - True - Squares & Black/White Squares & Shapers
+0x17CF7 (Discard) - True - Triangles
+
+Jungle (Jungle) - Main Island - True:
+0x17CDF (Shore Boat Spawn) - True - Boat
+0x17F9B (Discard) - True - Triangles
+0x002C4 (Waves 1) - True - Sound & Sound Waves
+0x00767 (Waves 2) - 0x002C4 - Sound & Sound Waves
+0x002C6 (Waves 3) - 0x00767 - Sound & Sound Waves
+0x0070E (Waves 4) - 0x002C6 - Sound & Sound Waves
+0x0070F (Waves 5) - 0x0070E - Sound & Sound Waves
+0x0087D (Waves 6) - 0x0070F - Sound & Sound Waves
+0x002C7 (Waves 7) - 0x0087D - Sound & Sound Waves
+0x17CAB (Popup Wall Control) - 0x002C7 - True
+0x0026D (Popup Wall 1) - 0x17CAB - Sound & Sound Dots
+0x0026E (Popup Wall 2) - 0x0026D - Sound & Sound Dots
+0x0026F (Popup Wall 3) - 0x0026E - Sound & Sound Dots
+0x00C3F (Popup Wall 4) - 0x0026F - Sound & Sound Dots
+0x00C41 (Popup Wall 5) - 0x00C3F - Sound & Sound Dots
+0x014B2 (Popup Wall 6) - 0x00C41 - Sound & Sound Dots
+0x03616 (Laser) - 0x014B2 - True
+0x337FA (Shortcut to River) - True - True
+
+Outside Jungle River (River) - Main Island - True - Jungle - 0x337FA:
+0x17CAA (Rhombic Avoid to Monastery Garden) - True - Environment
+0x15ADD (Vault) - True - Environment & Black/White Squares & Dots
+0x03702 (Vault Box) - 0x15ADD - True
+
+Outside Bunker (Bunker) - Main Island - True - Inside Bunker - 0x0A079:
+0x17C2E (Door to Bunker) - True - Squares & Black/White Squares
+0x09DE0 (Laser) - 0x0A079 - True
+
+Inside Bunker (Bunker) - Outside Bunker - 0x17C2E:
+0x09F7D (Drawn Squares 1) - True - Squares & Colored Squares
+0x09FDC (Drawn Squares 2) - 0x09F7D - Squares & Colored Squares & Black/White Squares
+0x09FF7 (Drawn Squares 3) - 0x09FDC - Squares & Colored Squares & Black/White Squares
+0x09F82 (Drawn Squares 4) - 0x09FF7 - Squares & Colored Squares & Black/White Squares
+0x09FF8 (Drawn Squares 5) - 0x09F82 - Squares & Colored Squares & Black/White Squares
+0x09D9F (Drawn Squares 6) - 0x09FF8 - Squares & Colored Squares & Black/White Squares
+0x09DA1 (Drawn Squares 7) - 0x09D9F - Squares & Colored Squares
+0x09DA2 (Drawn Squares 8) - 0x09DA1 - Squares & Colored Squares
+0x09DAF (Drawn Squares 9) - 0x09DA2 - Squares & Colored Squares
+0x0A099 (Door to Bunker Proper) - 0x09DAF - True
+0x0A010 (Drawn Squares through Tinted Glass 1) - 0x0A099 - Squares & Colored Squares & RGB & Environment
+0x0A01B (Drawn Squares through Tinted Glass 2) - 0x0A010 - Squares & Colored Squares & Black/White Squares & RGB & Environment
+0x0A01F (Drawn Squares through Tinted Glass 3) - 0x0A01B - Squares & Colored Squares & Black/White Squares & RGB & Environment
+0x34BC5 (Drop-Down Door Open) - 0x0A01F - True
+0x34BC6 (Drop-Down Door Close) - 0x34BC5 - True
+0x17E63 (Drop-Down Door Squares 1) - 0x0A01F & 0x34BC5 - Squares & Colored Squares & RGB & Environment
+0x17E67 (Drop-Down Door Squares 2) - 0x17E63 & 0x34BC6 - Squares & Colored Squares & Black/White Squares & RGB
+0x0A079 (Elevator Control) - 0x17E67 - Squares & Colored Squares & Black/White Squares & RGB
+
+Outside Swamp (Swamp) - Main Island - True:
+0x0056E (Entry Door) - True - Shapers
+
+Swamp Entry Area (Swamp) - Outside Swamp - 0x0056E:
+0x00469 (Seperatable Shapers 1) - True - Shapers
+0x00472 (Seperatable Shapers 2) - 0x00469 - Shapers
+0x00262 (Seperatable Shapers 3) - 0x00472 - Shapers
+0x00474 (Seperatable Shapers 4) - 0x00262 - Shapers
+0x00553 (Seperatable Shapers 5) - 0x00474 - Shapers
+0x0056F (Seperatable Shapers 6) - 0x00553 - Shapers
+0x00390 (Combinable Shapers 1) - 0x0056F - Shapers
+0x010CA (Combinable Shapers 2) - 0x00390 - Shapers
+0x00983 (Combinable Shapers 3) - 0x010CA - Shapers
+0x00984 (Combinable Shapers 4) - 0x00983 - Shapers
+0x00986 (Combinable Shapers 5) - 0x00984 - Shapers
+0x00985 (Combinable Shapers 6) - 0x00986 - Shapers
+0x00987 (Combinable Shapers 7) - 0x00985 - Shapers
+0x181A9 (Combinable Shapers 8) - 0x00987 - Shapers
+0x00609 (Slide Bridge) - 0x181A9 - Shapers
+
+Swamp Near Platform (Swamp) - Swamp Entry Area - 0x00609 | 0x18488:
+0x00999 (Broken Shapers 1) - 0x00990 - Broken Shapers
+0x0099D (Broken Shapers 2) - 0x00999 - Broken Shapers
+0x009A0 (Broken Shapers 3) - 0x0099D - Broken Shapers
+0x009A1 (Broken Shapers 4) - 0x009A0 - Broken Shapers
+0x00002 (Cyan Underwater Negative Shapers 1) - 0x00006 - Shapers & Negative Shapers
+0x00004 (Cyan Underwater Negative Shapers 2) - 0x00002 - Shapers & Negative Shapers
+0x00005 (Cyan Underwater Negative Shapers 3) - 0x00004 - Shapers & Negative Shapers
+0x013E6 (Cyan Underwater Negative Shapers 4) - 0x00005 - Shapers & Negative Shapers
+0x00596 (Cyan Underwater Negative Shapers 5) - 0x013E6 - Shapers & Negative Shapers
+0x18488 (Cyan Underwater Sliding Bridge Control) - 0x00006 - Shapers
+
+Swamp Platform (Swamp) - Swamp Near Platform - True:
+0x00982 (Platform Shapers 1) - True - Shapers
+0x0097F (Platform Shapers 2) - 0x00982 - Shapers
+0x0098F (Platform Shapers 3) - 0x0097F - Shapers
+0x00990 (Platform Shapers 4) - 0x0098F - Shapers
+0x17C0D (Platform Shortcut Door Left) - True - Shapers
+0x17C0E (Platform Shortcut Door Right) - True - Shapers
+
+Swamp Rotating Bridge Near Side (Swamp) - Swamp Near Platform - 0x009A1:
+0x00007 (Rotated Shapers 1) - 0x009A1 - Rotated Shapers
+0x00008 (Rotated Shapers 2) - 0x00007 - Rotated Shapers & Shapers
+0x00009 (Rotated Shapers 3) - 0x00008 - Rotated Shapers
+0x0000A (Rotated Shapers 4) - 0x00009 - Rotated Shapers
+0x00001 (Red Underwater Negative Shapers 1) - 0x00596 - Shapers & Negative Shapers
+0x014D2 (Red Underwater Negative Shapers 2) - 0x00596 - Shapers & Negative Shapers
+0x014D4 (Red Underwater Negative Shapers 3) - 0x00596 - Shapers & Negative Shapers
+0x014D1 (Red Underwater Negative Shapers 4) - 0x00596 - Shapers & Negative Shapers
+
+Swamp Near Boat (Swamp) - Swamp Rotating Bridge Near Side - 0x009A1 - Swamp Platform - 0x17C0D & 0x17C0E:
+0x181F5 (Rotating Bridge) - True - Rotated Shapers, Shapers
+0x09DB8 (Boat Spawn) - True - Boat
+0x003B2 (More Rotated Shapers 1) - 0x0000A - Rotated Shapers
+0x00A1E (More Rotated Shapers 2) - 0x003B2 - Rotated Shapers
+0x00C2E (More Rotated Shapers 3) - 0x00A1E - Rotated Shapers
+0x00E3A (More Rotated Shapers 4) - 0x00C2E - Rotated Shapers
+0x009A6 (Underwater Back Optional) - 0x00E3A - Shapers
+0x009AB (Blue Underwater Negative Shapers 1) - 0x00E3A - Shapers & Negative Shapers
+0x009AD (Blue Underwater Negative Shapers 2) - 0x009AB - Shapers & Negative Shapers
+0x009AE (Blue Underwater Negetive Shapers 3) - 0x009AD - Shapers & Negative Shapers
+0x009AF (Blue Underwater Negative Shapers 4) - 0x009AE - Shapers & Negative Shapers
+0x00006 (Blue Underwater Negative Shapers 5) - 0x009AF - Shapers & Negative Shapers & Broken Negative Shapers
+0x17E2B (Long Bridge Control) - True - Rotated Shapers
+
+Swamp Maze (Swamp) - Swamp Rotating Bridge Near Side - 0x00001 & 0x014D2 & 0x014D4 & 0x014D1 - Outside Swamp - 0x17C05 & 0x17C02:
+0x17C04 (Maze Control) - True - Shapers & Negative Shapers & Rotated Shapers & Environment
+0x03615 (Laser) - 0x17C04 - True
+0x17C05 (Near Laser Shortcut Door Left) - True - Rotated Shapers
+0x17C02 (Near Laser Shortcut Door Right) - 0x17C05 - Shapers & Negative Shapers & Rotated Shapers
+
+Treehouse Entry Area (Treehouse):
+0x17C95 (Boat Spawn) - True - Boat
+0x0288C (First Door) - True - Stars
+0x02886 (Second Door) - 0x0288C - Stars
+0x17D72 (Yellow Bridge 1) - 0x02886 - Stars
+0x17D8F (Yellow Bridge 2) - 0x17D72 - Stars
+0x17D74 (Yellow Bridge 3) - 0x17D8F - Stars
+0x17DAC (Yellow Bridge 4) - 0x17D74 - Stars
+0x17D9E (Yellow Bridge 5) - 0x17DAC - Stars
+0x17DB9 (Yellow Bridge 6) - 0x17D9E - Stars
+0x17D9C (Yellow Bridge 7) - 0x17DB9 - Stars
+0x17DC2 (Yellow Bridge 8) - 0x17D9C - Stars
+0x17DC4 (Yellow Bridge 9) - 0x17DC2 - Stars
+0x0A182 (Beyond Yellow Bridge Door) - 0x17DC4 - Stars
+
+Treehouse Beyond Yellow Bridge (Treehouse) - Treehouse Entry Area - 0x0A182:
+0x2700B (Laser House Door Timer Outside Control) - True - True
+0x17DC8 (First Purple Bridge 1) - True - Stars & Dots
+0x17DC7 (First Purple Bridge 2) - 0x17DC8 - Stars & Dots
+0x17CE4 (First Purple Bridge 3) - 0x17DC7 - Stars & Dots
+0x17D2D (First Purple Bridge 4) - 0x17CE4 - Stars & Dots
+0x17D6C (First Purple Bridge 5) - 0x17D2D - Stars & Dots
+0x17D9B (Second Purple Bridge 1) - 0x17D6C - Stars & Squares & Black/White Squares
+0x17D99 (Second Purple Bridge 2) - 0x17D9B - Stars & Squares & Black/White Squares
+0x17DAA (Second Purple Bridge 3) - 0x17D99 - Stars & Squares & Black/White Squares
+0x17D97 (Second Purple Bridge 4) - 0x17DAA - Stars & Squares & Black/White Squares & Colored Squares
+0x17BDF (Second Purple Bridge 5) - 0x17D97 - Stars & Squares & Colored Squares
+0x17D91 (Second Purple Bridge 6) - 0x17BDF - Stars & Squares & Colored Squares
+0x17DC6 (Second Purple Bridge 7) - 0x17D91 - Stars & Squares & Colored Squares
+0x17E3C (Green Bridge 1) - True - Stars & Shapers
+0x17E4D (Green Bridge 2) - 0x17E3C - Stars & Shapers
+0x17E4F (Green Bridge 3) - 0x17E4D - Stars & Shapers & Rotated Shapers
+0x17E52 (Green Bridge 4 & Directional) - 0x17E4F - Stars & Rotated Shapers & Environment
+0x17E5B (Green Bridge 5) - 0x17E52 - Stars & Shapers & Colored Shapers & Stars + Same Colored Symbol
+0x17E5F (Green Bridge 6) - 0x17E5B - Stars & Shapers & Colored Shapers & Negative Shapers & Colored Negative Shapers & Stars + Same Colored Symbol
+0x17E61 (Green Bridge 7) - 0x17E5F - Stars & Shapers & Rotated Shapers
+0x17FA9 (Green Bridge Discard) - 0x17E61 - Triangles
+0x17DB3 (Left Orange Bridge 1) - 0x17DC6 - Stars & Squares & Black/White Squares & Stars + Same Colored Symbol
+0x17DB5 (Left Orange Bridge 2) - 0x17DB3 - Stars & Squares & Black/White Squares & Stars + Same Colored Symbol
+0x17DB6 (Left Orange Bridge 3) - 0x17DB5 - Stars & Squares & Black/White Squares & Stars + Same Colored Symbol
+0x17DC0 (Left Orange Bridge 4) - 0x17DB6 - Stars & Squares & Black/White Squares & Stars + Same Colored Symbol
+0x17DD7 (Left Orange Bridge 5) - 0x17DC0 - Stars & Squares & Black/White Squares & Colored Squares & Stars + Same Colored Symbol
+0x17DD9 (Left Orange Bridge 6) - 0x17DD7 - Stars & Squares & Black/White Squares & Colored Squares & Stars + Same Colored Symbol
+0x17DB8 (Left Orange Bridge 7) - 0x17DD9 - Stars & Squares & Black/White Squares & Colored Squares & Stars + Same Colored Symbol
+0x17DDC (Left Orange Bridge 8) - 0x17DB8 - Stars & Squares & Colored Squares & Stars + Same Colored Symbol
+0x17DD1 (Left Orange Bridge 9 & Directional) - 0x17DDC - Stars & Squares & Colored Squares & Stars + Same Colored Symbol & Environment
+0x17DDE (Left Orange Bridge 10) - 0x17DD1 - Stars & Squares & Colored Squares & Stars + Same Colored Symbol
+0x17DE3 (Left Orange Bridge 11) - 0x17DDE - Stars & Squares & Colored Squares & Stars + Same Colored Symbol
+0x17DEC (Left Orange Bridge 12) - 0x17DE3 - Stars & Squares & Black/White Squares & Stars + Same Colored Symbol
+0x17DAE (Left Orange Bridge 13) - 0x17DEC - Stars & Squares & Black/White Squares & Stars + Same Colored Symbol
+0x17DB0 (Left Orange Bridge 14) - 0x17DAE - Stars & Squares & Black/White Squares & Stars + Same Colored Symbol
+0x17DDB (Left Orange Bridge 15) - 0x17DB0 - Stars & Squares & Black/White Squares & Stars + Same Colored Symbol
+0x17FA0 (Burned House Discard) - 0x17DDB - Triangles
+0x17D88 (Right Orange Bridge 1) - True - Stars
+0x17DB4 (Right Orange Bridge 2) - 0x17D88 - Stars
+0x17D8C (Right Orange Bridge 3) - 0x17DB4 - Stars
+0x17CE3 (Right Orange Bridge 4 & Directional) - 0x17D8C - Stars & Environment
+0x17DCD (Right Orange Bridge 5) - 0x17CE3 - Stars
+0x17DB2 (Right Orange Bridge 6) - 0x17DCD - Stars
+0x17DCC (Right Orange Bridge 7) - 0x17DB2 - Stars
+0x17DCA (Right Orange Bridge 8) - 0x17DCC - Stars
+0x17D8E (Right Orange Bridge 9) - 0x17DCA - Stars
+0x17DB7 (Right Orange Bridge 10 & Directional) - 0x17D8E - Stars
+0x17DB1 (Right Orange Bridge 11) - 0x17DB7 - Stars
+0x17DA2 (Right Orange Bridge 12) - 0x17DB1 - Stars
+
+Treehouse Laser Room (Treehouse) - Treehouse Beyond Yellow Bridge - 0x2700B & 0x17DA2 & 0x17DDB:
+0x03613 (Laser) - True - True
+0x17CBC (Laser House Door Timer Inside Control) - True - True
+
+Treehouse Bridge Platform (Treehouse) - Treehouse Beyond Yellow Bridge - 0x17DA2 - Main Island - 0x037FF:
+0x037FF (Bridge Control) - True - Stars
+
+Mountaintop (Mountaintop) - Main Island - True:
+0x0042D (River Shape) - True - True
+0x09F7F (Box Open) - 7 Lasers - True
+0x17C34 (Trap Door Triple Exit) - 0x09F7F - Stars & Squares & Black/White Squares & Stars + Same Colored Symbol
+0x17C42 (Discard) - True - Triangles
+0x002A6 (Vault) - True - Symmetry & Colored Dots & Squares & Black/White Squares & Dots
+0x03542 (Vault Box) - 0x002A6 - True
+
+Inside Mountain Top Layer (Inside Mountain) - Mountaintop - 0x17C34:
+0x09E39 (Light Bridge Controller) - True - Squares & Black/White Squares & Colored Squares & Eraser & Colored Eraser
+
+Inside Mountain Top Layer Bridge (Inside Mountain) - Inside Mountain Top Layer - 0x09E39:
+0x09E7A (Obscured Vision 1) - True - Obscured & Squares & Black/White Squares & Dots
+0x09E71 (Obscured Vision 2) - 0x09E7A - Obscured & Squares & Black/White Squares & Dots
+0x09E72 (Obscured Vision 3) - 0x09E71 - Obscured & Squares & Black/White Squares & Shapers & Dots
+0x09E69 (Obscured Vision 4) - 0x09E72 - Obscured & Squares & Black/White Squares & Dots
+0x09E7B (Obscured Vision 5) - 0x09E69 - Obscured & Squares & Black/White Squares & Dots
+0x09E73 (Moving Background 1) - True - Moving & Stars & Squares & Black/White Squares & Stars + Same Colored Symbol
+0x09E75 (Moving Background 2) - 0x09E73 - Moving & Stars & Squares & Black/White Squares & Stars + Same Colored Symbol
+0x09E78 (Moving Background 3) - 0x09E75 - Moving & Shapers
+0x09E79 (Moving Background 4) - 0x09E78 - Moving & Shapers & Rotated Shapers
+0x09E6C (Moving Background 5) - 0x09E79 - Moving & Stars & Squares & Black/White Squares & Stars + Same Colored Symbol
+0x09E6F (Moving Background 6) - 0x09E6C - Moving & Stars & Rotated Shapers & Shapers
+0x09E6B (Moving Background 7) - 0x09E6F - Moving & Stars & Dots
+0x33AF5 (Physically Obstructed 1) - True - Squares & Black/White Squares & Environment & Symmetry
+0x33AF7 (Physically Obstructed 2) - 0x33AF5 - Squares & Black/White Squares & Stars & Environment
+0x09F6E (Physically Obstructed 3) - 0x33AF7 - Symmetry & Dots & Environment
+0x09EAD (Angled Inside Trash 1) - True - Squares & Black/White Squares & Shapers & Angled
+0x09EAF (Angled Inside Trash 2) - 0x09EAD - Squares & Black/White Squares & Shapers & Angled
+
+Inside Mountain Second Layer (Inside Mountain) - Inside Mountain Top Layer Bridge - 0x09EAF & 0x09F6E & 0x09E6B & 0x09E7B:
+0x09FD3 (Color Cycle 1) - True - Color Cycle & RGB & Stars & Squares & Colored Squares & Stars + Same Colored Symbol
+0x09FD4 (Color Cycle 2) - 0x09FD3 - Color Cycle & RGB & Stars & Squares & Colored Squares & Stars + Same Colored Symbol
+0x09FD6 (Color Cycle 3) - 0x09FD4 - Color Cycle & RGB & Stars & Squares & Colored Squares & Stars + Same Colored Symbol
+0x09FD7 (Color Cycle 4) - 0x09FD6 - Color Cycle & RGB & Stars & Squares & Colored Squares & Stars + Same Colored Symbol & Shapers & Colored Shapers
+0x09FD8 (Color Cycle 5) - 0x09FD7 - Color Cycle & RGB & Squares & Colored Squares & Symmetry & Colored Dots
+0x09E86 (Light Bridge Controller 2) - 0x09FD7 - Stars & Stars + Same Colored Symbol & Colored Rotated Shapers & Eraser & Two Lines
+
+Inside Mountain Second Layer Beyond Bridge (Inside Mountain) - Inside Mountain Second Layer - 0x09E86:
+0x09FCC (Same Solution 1) - True - Dots & Same Solution
+0x09FCE (Same Solution 2) - 0x09FCC - Squares & Black/White Squares & Same Solution
+0x09FCF (Same Solution 3) - 0x09FCE - Stars & Same Solution
+0x09FD0 (Same Solution 4) - 0x09FCF - Rotated Shapers & Same Solution
+0x09FD1 (Same Solution 5) - 0x09FD0 - Stars & Squares & Colored Squares & Stars + Same Colored Symbol & Same Solution
+0x09FD2 (Same Solution 6) - 0x09FD1 - Shapers & Same Solution
+0x09ED8 (Light Bridge Controller 3) - 0x09FD2 - Stars & Stars + Same Colored Symbol & Colored Rotated Shapers & Eraser & Two Lines
+
+Inside Mountain Second Layer Elevator (Inside Mountain) - Inside Mountain Second Layer - 0x09ED8 & 0x09E86:
+0x09EEB (Elevator Control Panel) - True - Dots
+0x17F93 (Elevator Discard) - True - Triangles
+
+Inside Mountain Third Layer (Inside Mountain) - Inside Mountain Second Layer Elevator - 0x09EEB:
+0x09FC1 (Giant Puzzle Bottom Left) - True - Shapers & Eraser
+0x09F8E (Giant Puzzle Bottom Right) - True - Shapers & Eraser
+0x09F01 (Giant Puzzle Top Right) - True - Rotated Shapers
+0x09EFF (Giant Puzzle Top Left) - True - Shapers & Eraser
+0x09FDA (Giant Puzzle) - 0x09FC1 & 0x09F8E & 0x09F01 & 0x09EFF - Shapers & Symmetry
+
+Inside Mountain Bottom Layer (Inside Mountain) - Inside Mountain Third Layer - 0x09FDA - Inside Mountain Path to Secret Area - 0x334E1:
+0x17FA2 (Bottom Layer Discard) - 11 Lasers & 0x09F7F - Triangles & Environment
+0x01983 (Door to Final Room Left) - True - Shapers & Stars
+0x01987 (Door to Final Room Right) - True - Squares & Colored Squares
+
+
+Inside Mountain Path to Secret Area (Inside Mountain) - Inside Mountain Bottom Layer - 0x17FA2:
+0x00FF8 (Door to Secret Area) - True - Triangles & Black/White Squares & Squares
+0x334E1 (Rock Control) - True - True
+
+Inside Mountain Secret Area (Inside Mountain Secret Area) - Inside Mountain Path to Secret Area - 0x00FF8 - Main Island - 0x021D7 - Main Island - 0x17CF2:
+0x021D7 (Shortcut to Mountain) - True - Triangles & Stars & Stars + Same Colored Symbol & Colored Triangles
+0x17CF2 (Shortcut to Swamp) - True - Triangles
+0x335AB (Elevator Inside Control) - True - Dots & Squares & Black/White Squares
+0x335AC (Elevator Upper Outside Control) - 0x335AB - Squares & Black/White Squares
+0x3369D (Elevator Lower Outside Control) - 0x335AB - Squares & Black/White Squares & Dots
+0x00190 (Dot Grid Triangles 1) - True - Dots & Triangles
+0x00558 (Dot Grid Triangles 2) - 0x00190 - Dots & Triangles
+0x00567 (Dot Grid Triangles 3) - 0x00558 - Dots & Triangles
+0x006FE (Dot Grid Triangles 4) - 0x00567 - Dots & Triangles
+0x01A0D (Symmetry Triangles) - True - Symmetry & Triangles
+0x008B8 (Squares and Triangles) - True - Squares & Black/White Squares & Triangles
+0x00973 (Stars and Triangles) - 0x008B8 - Stars & Triangles
+0x0097B (Stars and Triangles of same color) - 0x00973 - Stars & Triangles & Stars and Triangles of same color & Stars + Same Colored Symbol
+0x0097D (Stars & Squares and Triangles) - 0x0097B - Stars & Squares & Black/White Squares & Stars + Same Colored Symbol & Triangles
+0x0097E (Stars & Squares and Triangles 2) - 0x0097D - Stars & Squares & Black/White Squares & Stars + Same Colored Symbol & Stars and Triangles of same color
+0x00994 (Rotated Shapers and Triangles 1) - True - Rotated Shapers & Triangles
+0x334D5 (Rotated Shapers and Triangles 2) - 0x00994 - Rotated Shapers & Triangles
+0x00995 (Rotated Shapers and Triangles 3) - 0x334D5 - Rotated Shapers & Triangles
+0x00996 (Shapers and Triangles 1) - 0x00995 - Shapers & Triangles
+0x00998 (Shapers and Triangles 2) - 0x00996 - Shapers & Triangles
+0x009A4 (Broken Shapers) - True - Shapers & Broken Shapers
+0x018A0 (Symmetry Shapers) - True - Shapers & Symmetry
+0x00A72 (Broken and Negative Shapers) - True - Shapers & Broken Shapers & Negative Shapers
+0x32962 (Rotated Broken Shapers) - True - Rotated Shapers & Broken Rotated Shapers
+0x32966 (Stars and Squares) - True - Stars & Squares & Black/White Squares & Stars + Same Colored Symbol
+0x01A31 (Rainbow Squares) - True - Color Cycle & RGB & Squares & Colored Squares
+0x00B71 (Squares & Stars and Colored Eraser) - True - Colored Eraser & Squares & Colored Squares & Stars & Stars + Same Colored Symbol
+0x09DD5 (Lone Pillar) - True - Pillar & Triangles
+0x0A16E (Door to Challenge) - 0x09DD5 - Stars & Shapers & Colored Shapers & Stars + Same Colored Symbol
+0x288EA (Wooden Beam Shapers) - True - Environment & Shapers
+0x288FC (Wooden Beam Squares and Shapers) - True - Environment & Squares & Black/White Squares & Shapers & Rotated Shapers
+0x289E7 (Wooden Beam Shapers and Squares) - True - Environment & Stars & Squares & Black/White Squares
+0x288AA (Wooden Beam Shapers and Stars) - True - Environment & Stars & Shapers
+0x17FB9 (Upstairs Dot Grid Negative Shapers) - True - Shapers & Dots & Negative Shapers
+0x0A16B (Upstairs Dot Grid Squares) - True - Squares & Black/White Squares & Colored Squares & Dots
+0x0A2CE (Upstairs Dot Grid Stars) - 0x0A16B - Stars & Dots
+0x0A2D7 (Upstairs Dot Grid Triangles) - 0x0A2CE - Triangles & Dots
+0x0A2DD (Upstairs Dot Grid Shapers) - 0x0A2D7 - Shapers & Dots
+0x0A2EA (Upstairs Dot Grid Rotated Shapers) - 0x0A2DD - Rotated Shapers & Dots
+0x0008F (Upstairs Invisible Dots 1) - True - Dots & Invisible Dots
+0x0006B (Upstairs Invisible Dots 2) - 0x0008F - Dots & Invisible Dots
+0x0008B (Upstairs Invisible Dots 3) - 0x0006B - Dots & Invisible Dots
+0x0008C (Upstairs Invisible Dots 4) - 0x0008B - Dots & Invisible Dots
+0x0008A (Upstairs Invisible Dots 5) - 0x0008C - Dots & Invisible Dots
+0x00089 (Upstairs Invisible Dots 6) - 0x0008A - Dots & Invisible Dots
+0x0006A (Upstairs Invisible Dots 7) - 0x00089 - Dots & Invisible Dots
+0x0006C (Upstairs Invisible Dots 8) - 0x0006A - Dots & Invisible Dots
+0x00027 (Upstairs Invisible Dot Symmetry 1) - True - Dots & Invisible Dots & Symmetry
+0x00028 (Upstairs Invisible Dot Symmetry 2) - 0x00027 - Dots & Invisible Dots & Symmetry
+0x00029 (Upstairs Invisible Dot Symmetry 3) - 0x00028 - Dots & Invisible Dots & Symmetry
+
+Challenge (Challenge) - Inside Mountain Secret Area - 0x0A16E:
+0x0A332 (Start Timer) - True - True
+0x0088E (Small Basic) - 0x0A332 - True
+0x00BAF (Big Basic) - 0x0088E - True
+0x00BF3 (Square) - 0x00BAF - Squares & Black/White Squares
+0x00C09 (Maze Map) - 0x00BF3 - Dots
+0x00CDB (Stars and Dots) - 0x00C09 - Stars & Dots
+0x0051F (Symmetry) - 0x00CDB - Symmetry & Colored Dots & Dots
+0x00524 (Stars and Shapers) - 0x0051F - Stars & Shapers
+0x00CD4 (Big Basic 2) - 0x00524 - True
+0x00CB9 (Choice Squares Right) - 0x00CD4 - Squares & Black/White Squares
+0x00CA1 (Choice Squares Middle) - 0x00CD4 - Squares & Black/White Squares
+0x00C80 (Choice Squares Left) - 0x00CD4 - Squares & Black/White Squares
+0x00C68 (Choice Squares 2 Right) - 0x00CB9 | 0x00CA1 | 0x00C80 - Squares & Black/White Squares & Colored Squares
+0x00C59 (Choice Squares 2 Middle) - 0x00CB9 | 0x00CA1 | 0x00C80 - Squares & Black/White Squares & Colored Squares
+0x00C22 (Choice Squares 2 Left) - 0x00CB9 | 0x00CA1 | 0x00C80 - Squares & Black/White Squares & Colored Squares
+0x034F4 (Maze Hidden 1) - 0x00C68 | 0x00C59 | 0x00C22 - Triangles
+0x034EC (Maze Hidden 2) - 0x00C68 | 0x00C59 | 0x00C22 - Triangles
+0x1C31A (Dots Pillar) - 0x034F4 & 0x034EC - Dots & Symmetry & Pillar
+0x1C319 (Squares Pillar) - 0x034F4 & 0x034EC - Squares & Black/White Squares & Symmetry & Pillar
+0x0356B (Vault Box) - 0x1C31A & 0x1C319 - True
+0x039B4 (Door to Theater Walkway) - True - Triangles
+
+Theater Walkway (Theater Walkway) - Challenge - 0x039B4 - Theater - 0x27732 - Desert Elevator Room - 0x2773D & 0x03608 - Town - 0x09E85:
+0x2FAF6 (Vault Box) - True - True
+0x27732 (Door to Back of Theater) - True - True
+0x2773D (Door to Desert Elevator Room) - True - True
+0x09E85 (Door to Town) - True - Triangles
+
+Final Room (Inside Mountain Final Room) - Inside Mountain Bottom Layer - 0x01983 & 0x01987:
+0x0383A (Stars Pillar) - True - Stars & Pillar
+0x09E56 (Stars and Dots Pillar) - 0x0383A - Stars & Dots & Pillar
+0x09E5A (Dot Grid Pillar) - 0x09E56 - Dots & Pillar
+0x33961 (Sparse Dots Pillar) - 0x09E5A - Dots & Pillar
+0x0383D (Dot Maze Pillar) - True - Dots & Pillar
+0x0383F (Squares Pillar) - 0x0383D - Squares & Black/White Squares & Pillar
+0x03859 (Shapers Pillar) - 0x0383F - Shapers & Pillar
+0x339BB (Squares and Stars) - 0x03859 - Squares & Black/White Squares & Stars & Pillar
+
+Elevator (Inside Mountain Final Room) - Final Room - 0x339BB & 0x33961:
+0x3D9A6 (Elevator Door Closer Left) - True - True
+0x3D9A7 (Elevator Door Close Right) - True - True
+0x3C113 (Elevator Door Open Left) - 0x3D9A6 | 0x3D9A7 - True
+0x3C114 (Elevator Door Open Right) - 0x3D9A6 | 0x3D9A7 - True
+0x3D9AA (Back Wall Left) - 0x3D9A6 | 0x3D9A7 - True
+0x3D9A8 (Back Wall Right) - 0x3D9A6 | 0x3D9A7 - True
+0x3D9A9 (Elevator Start) - 0x3D9AA | 0x3D9A8 - True
+
+Boat (Boat) - Main Island - 0x17CDF | 0x17CC8 | 0x17CA6 | 0x09DB8 | 0x17C95 - Inside Glass Factory - 0x17CDF | 0x17CC8 | 0x17CA6 | 0x09DB8 | 0x17C95 - Quarry Boathouse - 0x17CDF | 0x17CC8 | 0x17CA6 | 0x09DB8 | 0x17C95 - Swamp Near Boat - 0x17CDF | 0x17CC8 | 0x17CA6 | 0x09DB8 | 0x17C95 - Treehouse Entry Area - 0x17CDF | 0x17CC8 | 0x17CA6 | 0x09DB8 | 0x17C95:
diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py
new file mode 100644
index 0000000000..76132938ea
--- /dev/null
+++ b/worlds/witness/__init__.py
@@ -0,0 +1,175 @@
+"""
+Archipelago init file for The Witness
+"""
+
+import typing
+
+from BaseClasses import Region, RegionType, Location, MultiWorld, Item, Entrance, Tutorial
+from ..AutoWorld import World, WebWorld
+from .player_logic import StaticWitnessLogic, WitnessPlayerLogic
+from .locations import WitnessPlayerLocations, StaticWitnessLocations
+from .items import WitnessItem, StaticWitnessItems, WitnessPlayerItems
+from .rules import set_rules
+from .regions import WitnessRegions
+from .Options import is_option_enabled, the_witness_options
+from .utils import best_junk_to_add_based_on_weights
+
+
+class WitnessWebWorld(WebWorld):
+ theme = "jungle"
+ tutorials = [Tutorial(
+ "Multiworld Setup Guide",
+ "A guide to playing The Witness with Archipelago.",
+ "English",
+ "setup_en.md",
+ "setup/en",
+ ["NewSoupVi", "Jarno"]
+ )]
+
+
+class WitnessWorld(World):
+ """
+ The Witness is an open-world puzzle game with dozens of locations
+ to explore and over 500 puzzles. Play the popular puzzle randomizer
+ by sigma144, with an added layer of progression randomization!
+ """
+ game = "The Witness"
+ topology_present = False
+ static_logic = StaticWitnessLogic()
+ static_locat = StaticWitnessLocations()
+ static_items = StaticWitnessItems()
+ web = WitnessWebWorld()
+ options = the_witness_options
+
+ item_name_to_id = {
+ name: data.code for name, data in static_items.ALL_ITEM_TABLE.items()
+ }
+ location_name_to_id = StaticWitnessLocations.ALL_LOCATIONS_TO_ID
+
+ def _get_slot_data(self):
+ return {
+ 'seed': self.world.random.randint(0, 1000000),
+ 'victory_location': int(self.player_logic.VICTORY_LOCATION, 16),
+ 'panelhex_to_id': self.locat.CHECK_PANELHEX_TO_ID
+ }
+
+ def generate_early(self):
+ self.player_logic = WitnessPlayerLogic(self.world, self.player)
+ self.locat = WitnessPlayerLocations(self.world, self.player, self.player_logic)
+ self.items = WitnessPlayerItems(self.locat, self.world, self.player, self.player_logic)
+ self.regio = WitnessRegions(self.locat)
+
+ self.junk_items_created = {key: 0 for key in self.items.JUNK_WEIGHTS.keys()}
+
+ def generate_basic(self):
+ # Generate item pool
+ pool = []
+ items_by_name = dict()
+ for item in self.items.ITEM_TABLE:
+ witness_item = self.create_item(item)
+ if item not in self.items.EVENT_ITEM_TABLE:
+ pool.append(witness_item)
+ items_by_name[item] = witness_item
+
+ # Put good item on first check
+ random_good_item = self.world.random.choice(self.items.GOOD_ITEMS)
+ first_check = self.world.get_location(
+ "Tutorial Gate Open", self.player
+ )
+ first_check.place_locked_item(items_by_name[random_good_item])
+ pool.remove(items_by_name[random_good_item])
+
+ # Put in junk items to fill the rest
+ junk_size = len(self.locat.CHECK_LOCATION_TABLE) - len(pool) - len(self.locat.EVENT_LOCATION_TABLE) - 1
+
+ for i in range(0, junk_size):
+ pool.append(self.create_item(self.get_filler_item_name()))
+
+ # Tie Event Items to Event Locations (e.g. Laser Activations)
+ for event_location in self.locat.EVENT_LOCATION_TABLE:
+ item_obj = self.create_item(
+ self.player_logic.EVENT_ITEM_PAIRS[event_location]
+ )
+ location_obj = self.world.get_location(event_location, self.player)
+ location_obj.place_locked_item(item_obj)
+
+ self.world.itempool += pool
+
+ def create_regions(self):
+ self.regio.create_regions(self.world, self.player, self.player_logic)
+
+ def set_rules(self):
+ set_rules(self.world, self.player, self.player_logic, self.locat)
+
+ def fill_slot_data(self) -> dict:
+ slot_data = self._get_slot_data()
+
+ slot_data["hard_mode"] = False
+
+ for option_name in the_witness_options:
+ slot_data[option_name] = is_option_enabled(
+ self.world, self.player, option_name
+ )
+
+ return slot_data
+
+ def create_item(self, name: str) -> Item:
+ # this conditional is purely for unit tests, which need to be able to create an item before generate_early
+ if hasattr(self, 'items'):
+ item = self.items.ITEM_TABLE[name]
+ else:
+ item = StaticWitnessItems.ALL_ITEM_TABLE[name]
+
+ new_item = WitnessItem(
+ name, item.progression, item.code, player=self.player
+ )
+ new_item.trap = item.trap
+ return new_item
+
+ def get_filler_item_name(self) -> str: # Used by itemlinks
+ item = best_junk_to_add_based_on_weights(self.items.JUNK_WEIGHTS, self.junk_items_created)
+
+ self.junk_items_created[item] += 1
+
+ return item
+
+
+class WitnessLocation(Location):
+ """
+ Archipelago Location for The Witness
+ """
+ game: str = "The Witness"
+ check_hex: int = -1
+
+ def __init__(self, player: int, name: str, address: typing.Optional[int], parent, ch_hex: int = -1):
+ super().__init__(player, name, address, parent)
+ self.check_hex = ch_hex
+
+
+def create_region(world: MultiWorld, player: int, name: str,
+ locat: WitnessPlayerLocations, region_locations=None, exits=None):
+ """
+ Create an Archipelago Region for The Witness
+ """
+
+ ret = Region(name, RegionType.Generic, name, player)
+ ret.world = world
+ if region_locations:
+ for location in region_locations:
+ loc_id = locat.CHECK_LOCATION_TABLE[location]
+
+ check_hex = -1
+ if location in StaticWitnessLogic.CHECKS_BY_NAME:
+ check_hex = int(
+ StaticWitnessLogic.CHECKS_BY_NAME[location]["checkHex"], 0
+ )
+ location = WitnessLocation(
+ player, location, loc_id, ret, check_hex
+ )
+
+ ret.locations.append(location)
+ if exits:
+ for single_exit in exits:
+ ret.exits.append(Entrance(player, single_exit, ret))
+
+ return ret
diff --git a/worlds/witness/docs/en_The Witness.md b/worlds/witness/docs/en_The Witness.md
new file mode 100644
index 0000000000..23543285e2
--- /dev/null
+++ b/worlds/witness/docs/en_The Witness.md
@@ -0,0 +1,28 @@
+# The Witness
+
+## Where is the settings page?
+
+The [player settings page for this game](../player-settings) contains all the options you need to configure and export a
+config file.
+
+## What does randomization do to this game?
+
+Puzzles are randomly generated using the popular [Sigma Rando](https://github.com/sigma144/witness-randomizer).
+They are made to be similar to the original game, but with different solutions.
+
+Ontop of that each puzzle symbol (Squares, Stars, Dots, etc.) is now an item.
+Panels with puzzle symbols on them are now locked initially.
+
+## What is a "check" in The Witness?
+
+Solving the last panel in a row of panels or an important standalone panel will count as a check, and send out an item.
+
+## What "items" can you unlock in The Witness?
+
+Every puzzle symbol and many other puzzle mechanics are items.
+This includes symbols such as "Dots", "Black/White Squares", "Colored Squares", "Stars", "Symmetry", "Shapers" (coll. "Tetris Pieces"), "Erasers" and many more.
+
+## The Jungle, Orchard, Forest and Color House aren't randomized. What gives?
+
+There are limitations to what can currently be randomized in The Witness.
+There is an option to turn these non-randomized panels off, called "disable_non_randomized" in your yaml file. This will also slightly change the activation requirement of certain panels, detailed [here](https://github.com/sigma144/witness-randomizer/wiki/Activation-Triggers).
\ No newline at end of file
diff --git a/worlds/witness/docs/setup_en.md b/worlds/witness/docs/setup_en.md
new file mode 100644
index 0000000000..ce07451949
--- /dev/null
+++ b/worlds/witness/docs/setup_en.md
@@ -0,0 +1,41 @@
+# The Witness Randomizer Setup
+
+## Required Software
+
+- [The Witness (Steam)](https://store.steampowered.com/app/210970/The_Witness/)
+- [The Witness Archipelago Randomizer](https://github.com/JarnoWesthof/The-Witness-Randomizer-for-Archipelago/releases)
+
+## Optional Software
+
+- [ArchipelagoTextClient](https://github.com/ArchipelagoMW/Archipelago/releases)
+- [The Witness Map- and Auto-Tracker](https://github.com/NewSoupVi/witness_archipelago_tracker/releases), for use with [PopTracker](https://github.com/black-sliver/PopTracker/releases)
+
+## Joining a MultiWorld Game
+
+This Randomizer can be very "moody" if you don't do everything in the correct order.
+It is recommended to do every single one of these steps when you connect to a world.
+
+1. Launch The Witness
+2. Start a fresh save (unless you have absolutely no other choice)
+3. Do not move
+4. Launch [The Witness Archipelago Randomizer](https://github.com/JarnoWesthof/The-Witness-Randomizer-for-Archipelago)
+5. Enter the Archipelago address, slot name and password
+6. Press "Randomize"
+7. Wait for the randomization to fully finish before moving in-game
+
+That's it! Have fun!
+
+## Archipelago Text Client
+
+It is recommended to have Archipelago's Text Client open on the side to keep track of what items you receive and send, as The Witness has no in-game messages.
+ Or use the Auto-Tracker!
+## Auto-Tracking
+
+The Witness has a fully functional map tracker that supports auto-tracking.
+
+1. Download [The Witness Map- and Auto-Tracker](https://github.com/NewSoupVi/witness_archipelago_tracker/releases) and [PopTracker](https://github.com/black-sliver/PopTracker/releases).
+2. Open PopTracker, and load the Witness pack.
+3. Click on the "AP" symbol at the top.
+4. Enter the AP address, slot name and password.
+
+The rest should take care of itself! Items and checks will be marked automatically, and it even knows your settings - It will hide checks & adjust logic accordingly.
\ No newline at end of file
diff --git a/worlds/witness/items.py b/worlds/witness/items.py
new file mode 100644
index 0000000000..47bbd1fbce
--- /dev/null
+++ b/worlds/witness/items.py
@@ -0,0 +1,126 @@
+"""
+Defines progression, junk and event items for The Witness
+"""
+import copy
+from typing import Dict, NamedTuple, Optional
+
+from BaseClasses import Item, MultiWorld
+from . import StaticWitnessLogic, WitnessPlayerLocations, WitnessPlayerLogic
+from .Options import get_option_value, is_option_enabled
+from fractions import Fraction
+
+
+class ItemData(NamedTuple):
+ """
+ ItemData for an item in The Witness
+ """
+ code: Optional[int]
+ progression: bool
+ event: bool = False
+ trap: bool = False
+
+
+class WitnessItem(Item):
+ """
+ Item from the game The Witness
+ """
+ game: str = "The Witness"
+
+
+class StaticWitnessItems:
+ """
+ Class that handles Witness items independent of world settings
+ """
+
+ ALL_ITEM_TABLE: Dict[str, ItemData] = {}
+
+ # These should always add up to 1!!!
+ BONUS_WEIGHTS = {
+ "Speed Boost": Fraction(1, 1),
+ }
+
+ # These should always add up to 1!!!
+ TRAP_WEIGHTS = {
+ "Slowness": Fraction(8, 10),
+ "Power Surge": Fraction(2, 10),
+ }
+
+ ALL_JUNK_ITEMS = set(BONUS_WEIGHTS.keys()) | set(TRAP_WEIGHTS.keys())
+
+ def __init__(self):
+ item_tab = dict()
+
+ for item in StaticWitnessLogic.ALL_ITEMS:
+ if item[0] == "11 Lasers" or item == "7 Lasers":
+ continue
+
+ item_tab[item[0]] = ItemData(158000 + item[1], True, False)
+
+ for item in StaticWitnessLogic.ALL_TRAPS:
+ item_tab[item[0]] = ItemData(
+ 158000 + item[1], False, False, True
+ )
+
+ for item in StaticWitnessLogic.ALL_BOOSTS:
+ item_tab[item[0]] = ItemData(158000 + item[1], False, False)
+
+ item_tab = dict(sorted(
+ item_tab.items(),
+ key=lambda single_item: single_item[1].code
+ if isinstance(single_item[1].code, int) else 0)
+ )
+
+ for key, item in item_tab.items():
+ self.ALL_ITEM_TABLE[key] = item
+
+
+class WitnessPlayerItems:
+ """
+ Class that defines Items for a single world
+ """
+
+ def __init__(self, locat: WitnessPlayerLocations, world: MultiWorld, player: int, player_logic: WitnessPlayerLogic):
+ """Adds event items after logic changes due to options"""
+ self.EVENT_ITEM_TABLE = dict()
+ self.ITEM_TABLE = copy.copy(StaticWitnessItems.ALL_ITEM_TABLE)
+
+ self.GOOD_ITEMS = [
+ "Dots", "Black/White Squares", "Stars",
+ "Shapers", "Symmetry"
+ ]
+
+ if is_option_enabled(world, player, "shuffle_discarded_panels"):
+ self.GOOD_ITEMS.append("Triangles")
+ if not is_option_enabled(world, player, "disable_non_randomized_puzzles"):
+ self.GOOD_ITEMS.append("Colored Squares")
+
+ for event_location in locat.EVENT_LOCATION_TABLE:
+ location = player_logic.EVENT_ITEM_PAIRS[event_location]
+ self.EVENT_ITEM_TABLE[location] = ItemData(None, True, True)
+ self.ITEM_TABLE[location] = ItemData(None, True, True)
+
+ trap_percentage = get_option_value(world, player, "trap_percentage")
+
+ self.JUNK_WEIGHTS = dict()
+
+ if trap_percentage != 0:
+ # I'm sure there must be some super "pythonic" way of doing this :D
+
+ for trap_name, trap_weight in StaticWitnessItems.TRAP_WEIGHTS.items():
+ self.JUNK_WEIGHTS[trap_name] = (trap_weight * trap_percentage) / 100
+
+ if trap_percentage != 100:
+ for bonus_name, bonus_weight in StaticWitnessItems.BONUS_WEIGHTS.items():
+ self.JUNK_WEIGHTS[bonus_name] = (bonus_weight * (100 - trap_percentage)) / 100
+
+ self.JUNK_WEIGHTS = {
+ key: value for (key, value)
+ in self.JUNK_WEIGHTS.items()
+ if key in self.ITEM_TABLE.keys()
+ }
+
+ # JUNK_WEIGHTS will add up to 1 if the boosts weights and the trap weights each add up to 1 respectively.
+
+ for junk_item in StaticWitnessItems.ALL_JUNK_ITEMS:
+ if junk_item not in self.JUNK_WEIGHTS.keys():
+ del self.ITEM_TABLE[junk_item]
diff --git a/worlds/witness/locations.py b/worlds/witness/locations.py
new file mode 100644
index 0000000000..0bfaf011bc
--- /dev/null
+++ b/worlds/witness/locations.py
@@ -0,0 +1,278 @@
+"""
+Defines constants for different types of locations in the game
+"""
+
+from .Options import is_option_enabled
+from .player_logic import StaticWitnessLogic, WitnessPlayerLogic
+
+
+class StaticWitnessLocations:
+ """
+ Witness Location Constants that stay consistent across worlds
+ """
+ ID_START = 158000
+
+ TYPE_OFFSETS = {
+ "General": 0,
+ "Discard": 600,
+ "Vault": 650,
+ "Laser": 700,
+ }
+
+ GENERAL_LOCATIONS = {
+ "Tutorial Gate Open",
+
+ "Outside Tutorial Vault Box",
+ "Outside Tutorial Discard",
+ "Outside Tutorial Dots Introduction 5",
+ "Outside Tutorial Squares Introduction 9",
+
+ "Glass Factory Discard",
+ "Glass Factory Vertical Symmetry 5",
+ "Glass Factory Rotational Symmetry 3",
+ "Glass Factory Melting 3",
+
+ "Symmetry Island Black Dots 5",
+ "Symmetry Island Colored Dots 6",
+ "Symmetry Island Fading Lines 7",
+ "Symmetry Island Scenery Outlines 5",
+ "Symmetry Island Laser",
+
+ "Orchard Apple Tree 5",
+
+ "Desert Vault Box",
+ "Desert Discard",
+ "Desert Sun Reflection 8",
+ "Desert Artificial Light Reflection 3",
+ "Desert Pond Reflection 5",
+ "Desert Flood Reflection 6",
+ "Desert Laser",
+
+ "Quarry Mill Eraser and Dots 6",
+ "Quarry Mill Eraser and Squares 8",
+ "Quarry Mill Small Squares & Dots & and Eraser",
+ "Quarry Boathouse Intro Shapers",
+ "Quarry Boathouse Eraser and Shapers 5",
+ "Quarry Boathouse Stars & Eraser & and Shapers 2",
+ "Quarry Boathouse Stars & Eraser & and Shapers 5",
+ "Quarry Discard",
+ "Quarry Laser",
+
+ "Shadows Lower Avoid 8",
+ "Shadows Environmental Avoid 8",
+ "Shadows Follow 5",
+ "Shadows Laser",
+
+ "Keep Hedge Maze 4",
+ "Keep Pressure Plates 4",
+ "Keep Discard",
+ "Keep Laser Hedges",
+ "Keep Laser Pressure Plates",
+
+ "Shipwreck Vault Box",
+ "Shipwreck Discard",
+
+ "Monastery Rhombic Avoid 3",
+ "Monastery Branch Follow 2",
+ "Monastery Laser",
+
+ "Town Cargo Box Discard",
+ "Town Hexagonal Reflection",
+ "Town Square Avoid",
+ "Town Rooftop Discard",
+ "Town Symmetry Squares 5 + Dots",
+ "Town Full Dot Grid Shapers 5",
+ "Town Shapers & Dots & and Eraser",
+ "Town Laser",
+
+ "Theater Discard",
+
+ "Jungle Discard",
+ "Jungle Waves 3",
+ "Jungle Waves 7",
+ "Jungle Popup Wall 6",
+ "Jungle Laser",
+
+ "River Vault Box",
+
+ "Bunker Drawn Squares 5",
+ "Bunker Drawn Squares 9",
+ "Bunker Drawn Squares through Tinted Glass 3",
+ "Bunker Drop-Down Door Squares 2",
+ "Bunker Laser",
+
+ "Swamp Seperatable Shapers 6",
+ "Swamp Combinable Shapers 8",
+ "Swamp Broken Shapers 4",
+ "Swamp Cyan Underwater Negative Shapers 5",
+ "Swamp Platform Shapers 4",
+ "Swamp Rotated Shapers 4",
+ "Swamp Red Underwater Negative Shapers 4",
+ "Swamp More Rotated Shapers 4",
+ "Swamp Blue Underwater Negative Shapers 5",
+ "Swamp Laser",
+
+ "Treehouse Yellow Bridge 9",
+ "Treehouse First Purple Bridge 5",
+ "Treehouse Second Purple Bridge 7",
+ "Treehouse Green Bridge 7",
+ "Treehouse Green Bridge Discard",
+ "Treehouse Left Orange Bridge 15",
+ "Treehouse Burned House Discard",
+ "Treehouse Right Orange Bridge 12",
+ "Treehouse Laser",
+
+ "Mountaintop Discard",
+ "Mountaintop Vault Box",
+
+ "Inside Mountain Obscured Vision 5",
+ "Inside Mountain Moving Background 7",
+ "Inside Mountain Physically Obstructed 3",
+ "Inside Mountain Angled Inside Trash 2",
+ "Inside Mountain Color Cycle 5",
+ "Inside Mountain Same Solution 6",
+ "Inside Mountain Elevator Discard",
+ "Inside Mountain Giant Puzzle",
+ }
+
+ UNCOMMON_LOCATIONS = {
+ "Mountaintop River Shape",
+ "Tutorial Patio Floor",
+ "Quarry Mill Big Squares & Dots & and Eraser",
+ "Theater Tutorial Video",
+ "Theater Desert Video",
+ "Theater Jungle Video",
+ "Theater Shipwreck Video",
+ "Theater Mountain Video",
+ "Town RGB Squares",
+ "Town RGB Stars",
+ "Swamp Underwater Back Optional",
+ }
+
+ HARD_LOCATIONS = {
+ "Inside Mountain Secret Area Dot Grid Triangles 4",
+ "Inside Mountain Secret Area Symmetry Triangles",
+ "Inside Mountain Secret Area Stars & Squares and Triangles 2",
+ "Inside Mountain Secret Area Shapers and Triangles 2",
+ "Inside Mountain Secret Area Symmetry Shapers",
+ "Inside Mountain Secret Area Broken and Negative Shapers",
+ "Inside Mountain Secret Area Broken Shapers",
+
+ "Inside Mountain Secret Area Rainbow Squares",
+ "Inside Mountain Secret Area Squares & Stars and Colored Eraser",
+ "Inside Mountain Secret Area Rotated Broken Shapers",
+ "Inside Mountain Secret Area Stars and Squares",
+ "Inside Mountain Secret Area Lone Pillar",
+ "Inside Mountain Secret Area Wooden Beam Shapers",
+ "Inside Mountain Secret Area Wooden Beam Squares and Shapers",
+ "Inside Mountain Secret Area Wooden Beam Shapers and Squares",
+ "Inside Mountain Secret Area Wooden Beam Shapers and Stars",
+ "Inside Mountain Secret Area Upstairs Invisible Dots 8",
+ "Inside Mountain Secret Area Upstairs Invisible Dot Symmetry 3",
+ "Inside Mountain Secret Area Upstairs Dot Grid Shapers",
+ "Inside Mountain Secret Area Upstairs Dot Grid Rotated Shapers",
+
+ "Challenge Vault Box",
+ "Theater Walkway Vault Box",
+ "Inside Mountain Bottom Layer Discard",
+ "Theater Challenge Video",
+ }
+
+ ALL_LOCATIONS_TO_ID = dict()
+
+ @staticmethod
+ def get_id(chex):
+ """
+ Calculates the location ID for any given location
+ """
+
+ panel_offset = StaticWitnessLogic.CHECKS_BY_HEX[chex]["idOffset"]
+ type_offset = StaticWitnessLocations.TYPE_OFFSETS[
+ StaticWitnessLogic.CHECKS_BY_HEX[chex]["panelType"]
+ ]
+
+ return StaticWitnessLocations.ID_START + panel_offset + type_offset
+
+ @staticmethod
+ def get_event_name(panel_hex):
+ """
+ Returns the event name of any given panel.
+ Currently this is always "Panelname Solved"
+ """
+
+ return StaticWitnessLogic.CHECKS_BY_HEX[panel_hex]["checkName"] + " Solved"
+
+ def __init__(self):
+ all_loc_to_id = {
+ panel_obj["checkName"]: self.get_id(chex)
+ for chex, panel_obj in StaticWitnessLogic.CHECKS_BY_HEX.items()
+ }
+
+ all_loc_to_id = dict(
+ sorted(all_loc_to_id.items(), key=lambda loc: loc[1])
+ )
+
+ for key, item in all_loc_to_id.items():
+ self.ALL_LOCATIONS_TO_ID[key] = item
+
+
+class WitnessPlayerLocations:
+ """
+ Class that defines locations for a single player
+ """
+
+ def __init__(self, world, player, player_logic: WitnessPlayerLogic):
+ self.PANEL_TYPES_TO_SHUFFLE = {"General", "Laser"}
+ self.CHECK_LOCATIONS = (
+ StaticWitnessLocations.GENERAL_LOCATIONS
+ )
+
+ """Defines locations AFTER logic changes due to options"""
+
+ if is_option_enabled(world, player, "shuffle_discarded_panels"):
+ self.PANEL_TYPES_TO_SHUFFLE.add("Discard")
+
+ if is_option_enabled(world, player, "shuffle_vault_boxes"):
+ self.PANEL_TYPES_TO_SHUFFLE.add("Vault")
+
+ if is_option_enabled(world, player, "shuffle_uncommon"):
+ self.CHECK_LOCATIONS = self.CHECK_LOCATIONS | StaticWitnessLocations.UNCOMMON_LOCATIONS
+
+ if is_option_enabled(world, player, "shuffle_hard"):
+ self.CHECK_LOCATIONS = self.CHECK_LOCATIONS | StaticWitnessLocations.HARD_LOCATIONS
+
+ self.CHECK_LOCATIONS = self.CHECK_LOCATIONS | player_logic.ADDED_CHECKS
+
+ self.CHECK_LOCATIONS = self.CHECK_LOCATIONS - {
+ StaticWitnessLogic.CHECKS_BY_HEX[check_hex]["checkName"]
+ for check_hex in player_logic.COMPLETELY_DISABLED_CHECKS
+ }
+
+ self.CHECK_PANELHEX_TO_ID = {
+ StaticWitnessLogic.CHECKS_BY_NAME[ch]["checkHex"]: StaticWitnessLocations.ALL_LOCATIONS_TO_ID[ch]
+ for ch in self.CHECK_LOCATIONS
+ }
+
+ self.CHECK_PANELHEX_TO_ID = dict(
+ sorted(self.CHECK_PANELHEX_TO_ID.items(), key=lambda item: item[1])
+ )
+
+ event_locations = {
+ p for p in player_logic.NECESSARY_EVENT_PANELS
+ if StaticWitnessLogic.CHECKS_BY_HEX[p]["checkName"]
+ not in self.CHECK_LOCATIONS
+ or p in player_logic.ALWAYS_EVENT_HEX_CODES
+ }
+
+ self.EVENT_LOCATION_TABLE = {
+ StaticWitnessLocations.get_event_name(panel_hex): None
+ for panel_hex in event_locations
+ }
+
+ check_dict = {
+ location: StaticWitnessLocations.get_id(StaticWitnessLogic.CHECKS_BY_NAME[location]["checkHex"])
+ for location in self.CHECK_LOCATIONS
+ if StaticWitnessLogic.CHECKS_BY_NAME[location]["panelType"] in self.PANEL_TYPES_TO_SHUFFLE
+ }
+
+ self.CHECK_LOCATION_TABLE = {**self.EVENT_LOCATION_TABLE, **check_dict}
diff --git a/worlds/witness/player_logic.py b/worlds/witness/player_logic.py
new file mode 100644
index 0000000000..82a6d07b98
--- /dev/null
+++ b/worlds/witness/player_logic.py
@@ -0,0 +1,287 @@
+"""
+Parses the WitnessLogic.txt logic file into useful data structures.
+This is the heart of the randomization.
+
+In WitnessLogic.txt we have regions defined with their connections:
+
+Region Name (Short name) - Connected Region 1 - Connection Requirement 1 - Connected Region 2...
+
+And then panels in that region with the hex code used in the game
+previous panels that are required to turn them on, as well as the symbols they require:
+
+0x##### (Panel Name) - Required Panels - Required Items
+
+On __init__, the base logic is read and all panels are given Location IDs.
+When the world has parsed its options, a second function is called to finalize the logic.
+"""
+
+import copy
+from BaseClasses import MultiWorld
+from .static_logic import StaticWitnessLogic
+from .utils import define_new_region, get_disable_unrandomized_list, parse_lambda
+from .Options import is_option_enabled
+
+
+class WitnessPlayerLogic:
+ """WITNESS LOGIC CLASS"""
+
+ def reduce_req_within_region(self, panel_hex):
+ """
+ Panels in this game often only turn on when other panels are solved.
+ Those other panels may have different item requirements.
+ It would be slow to recursively check solvability each time.
+ This is why we reduce the item dependencies within the region.
+ Panels outside of the same region will still be checked manually.
+ """
+
+ if self.DEPENDENT_REQUIREMENTS_BY_HEX[panel_hex]["panels"] == frozenset({frozenset()}):
+ return self.DEPENDENT_REQUIREMENTS_BY_HEX[panel_hex]["items"]
+
+ all_options = set()
+
+ these_items = self.DEPENDENT_REQUIREMENTS_BY_HEX[panel_hex]["items"]
+ these_panels = self.DEPENDENT_REQUIREMENTS_BY_HEX[panel_hex]["panels"]
+ check_obj = StaticWitnessLogic.CHECKS_BY_HEX[panel_hex]
+
+ for option in these_panels:
+ dependent_items_for_option = frozenset({frozenset()})
+
+ for option_panel in option:
+ new_items = set()
+ dep_obj = StaticWitnessLogic.CHECKS_BY_HEX.get(option_panel)
+ if option_panel in {"7 Lasers", "11 Lasers"}:
+ new_items = frozenset({frozenset([option_panel])})
+ # If a panel turns on when a panel in a different region turns on,
+ # the latter panel will be an "event panel", unless it ends up being
+ # a location itself. This prevents generation failures.
+ elif dep_obj["region"]["name"] != check_obj["region"]["name"]:
+ new_items = frozenset({frozenset([option_panel])})
+ self.EVENT_PANELS_FROM_PANELS.add(option_panel)
+ else:
+ new_items = self.reduce_req_within_region(option_panel)
+
+ updated_items = set()
+
+ for items_option in dependent_items_for_option:
+ for items_option2 in new_items:
+ updated_items.add(items_option.union(items_option2))
+
+ dependent_items_for_option = updated_items
+
+ for items_option in these_items:
+ for dependentItem in dependent_items_for_option:
+ all_options.add(items_option.union(dependentItem))
+
+ return frozenset(all_options)
+
+ def make_single_adjustment(self, adj_type, line):
+ """Makes a single logic adjustment based on additional logic file"""
+
+ if adj_type == "Event Items":
+ line_split = line.split(" - ")
+ hex_set = line_split[1].split(",")
+
+ for hex_code in hex_set:
+ self.ALWAYS_EVENT_NAMES_BY_HEX[hex_code] = line_split[0]
+
+ """
+ Should probably do this differently...
+ Events right now depend on a panel.
+ That seems bad.
+ """
+
+ to_remove = set()
+
+ for hex_code, event_name in self.ALWAYS_EVENT_NAMES_BY_HEX.items():
+ if hex_code not in hex_set and event_name == line_split[0]:
+ to_remove.add(hex_code)
+
+ for remove in to_remove:
+ del self.ALWAYS_EVENT_NAMES_BY_HEX[remove]
+
+ return
+
+ if adj_type == "Requirement Changes":
+ line_split = line.split(" - ")
+
+ required_items = parse_lambda(line_split[2])
+ items_actually_in_the_game = {item[0] for item in StaticWitnessLogic.ALL_ITEMS}
+ required_items = frozenset(
+ subset.intersection(items_actually_in_the_game)
+ for subset in required_items
+ )
+
+ requirement = {
+ "panels": parse_lambda(line_split[1]),
+ "items": required_items
+ }
+
+ self.DEPENDENT_REQUIREMENTS_BY_HEX[line_split[0]] = requirement
+
+ return
+
+ if adj_type == "Disabled Locations":
+ self.COMPLETELY_DISABLED_CHECKS.add(line[:7])
+
+ return
+
+ if adj_type == "Region Changes":
+ new_region_and_options = define_new_region(line + ":")
+
+ self.CONNECTIONS_BY_REGION_NAME[new_region_and_options[0]["name"]] = new_region_and_options[1]
+
+ return
+
+ if adj_type == "Added Locations":
+ self.ADDED_CHECKS.add(line)
+
+ def make_options_adjustments(self, world, player):
+ """Makes logic adjustments based on options"""
+ adjustment_linesets_in_order = []
+
+ if is_option_enabled(world, player, "challenge_victory"):
+ self.VICTORY_LOCATION = "0x0356B"
+ else:
+ self.VICTORY_LOCATION = "0x3D9A9"
+
+ self.COMPLETELY_DISABLED_CHECKS.add(
+ self.VICTORY_LOCATION
+ )
+
+ if is_option_enabled(world, player, "disable_non_randomized_puzzles"):
+ adjustment_linesets_in_order.append(get_disable_unrandomized_list())
+
+ for adjustment_lineset in adjustment_linesets_in_order:
+ current_adjustment_type = None
+
+ for line in adjustment_lineset:
+ if len(line) == 0:
+ continue
+
+ if line[-1] == ":":
+ current_adjustment_type = line[:-1]
+ continue
+
+ self.make_single_adjustment(current_adjustment_type, line)
+
+ def make_dependency_reduced_checklist(self):
+ """
+ Turns dependent check set into semi-independent check set
+ """
+
+ for check_hex in self.DEPENDENT_REQUIREMENTS_BY_HEX.keys():
+ indep_requirement = self.reduce_req_within_region(check_hex)
+
+ self.REQUIREMENTS_BY_HEX[check_hex] = indep_requirement
+
+ def make_event_item_pair(self, panel):
+ """
+ Makes a pair of an event panel and its event item
+ """
+ name = StaticWitnessLogic.CHECKS_BY_HEX[panel]["checkName"] + " Solved"
+ pair = (name, self.EVENT_ITEM_NAMES[panel])
+ return pair
+
+ def make_event_panel_lists(self):
+ """
+ Special event panel data structures
+ """
+
+ for region_conn in self.CONNECTIONS_BY_REGION_NAME.values():
+ for region_and_option in region_conn:
+ for panelset in region_and_option[1]:
+ for panel in panelset:
+ self.EVENT_PANELS_FROM_REGIONS.add(panel)
+
+ self.ALWAYS_EVENT_NAMES_BY_HEX[self.VICTORY_LOCATION] = "Victory"
+
+ self.ORIGINAL_EVENT_PANELS.update(self.EVENT_PANELS_FROM_PANELS)
+ self.ORIGINAL_EVENT_PANELS.update(self.EVENT_PANELS_FROM_REGIONS)
+ self.NECESSARY_EVENT_PANELS.update(self.EVENT_PANELS_FROM_PANELS)
+
+ for panel in self.EVENT_PANELS_FROM_REGIONS:
+ for region_name, region in StaticWitnessLogic.ALL_REGIONS_BY_NAME.items():
+ for connection in self.CONNECTIONS_BY_REGION_NAME[region_name]:
+ connected_r = connection[0]
+ if connected_r not in StaticWitnessLogic.ALL_REGIONS_BY_NAME:
+ continue
+ if region_name == "Boat" or connected_r == "Boat":
+ continue
+ connected_r = StaticWitnessLogic.ALL_REGIONS_BY_NAME[connected_r]
+ if not any([panel in option for option in connection[1]]):
+ continue
+ if panel not in region["panels"] | connected_r["panels"]:
+ self.NECESSARY_EVENT_PANELS.add(panel)
+
+ for always_hex, always_item in self.ALWAYS_EVENT_NAMES_BY_HEX.items():
+ self.ALWAYS_EVENT_HEX_CODES.add(always_hex)
+ self.NECESSARY_EVENT_PANELS.add(always_hex)
+ self.EVENT_ITEM_NAMES[always_hex] = always_item
+
+ for panel in self.NECESSARY_EVENT_PANELS:
+ pair = self.make_event_item_pair(panel)
+ self.EVENT_ITEM_PAIRS[pair[0]] = pair[1]
+
+ def __init__(self, world: MultiWorld, player: int):
+ self.EVENT_PANELS_FROM_PANELS = set()
+ self.EVENT_PANELS_FROM_REGIONS = set()
+
+ self.CONNECTIONS_BY_REGION_NAME = copy.copy(StaticWitnessLogic.STATIC_CONNECTIONS_BY_REGION_NAME)
+ self.DEPENDENT_REQUIREMENTS_BY_HEX = copy.copy(StaticWitnessLogic.STATIC_DEPENDENT_REQUIREMENTS_BY_HEX)
+ self.REQUIREMENTS_BY_HEX = dict()
+
+ # Determining which panels need to be events is a difficult process.
+ # At the end, we will have EVENT_ITEM_PAIRS for all the necessary ones.
+ self.ORIGINAL_EVENT_PANELS = set()
+ self.NECESSARY_EVENT_PANELS = set()
+ self.EVENT_ITEM_PAIRS = dict()
+ self.ALWAYS_EVENT_HEX_CODES = set()
+ self.COMPLETELY_DISABLED_CHECKS = set()
+ self.ADDED_CHECKS = set()
+ self.VICTORY_LOCATION = "0x0356B"
+ self.EVENT_ITEM_NAMES = {
+ "0x01A0F": "Keep Laser Panel (Hedge Mazes) Activates",
+ "0x09D9B": "Monastery Overhead Doors Open",
+ "0x193A6": "Monastery Laser Panel Activates",
+ "0x00037": "Monastery Branch Panels Activate",
+ "0x0A079": "Access to Bunker Laser",
+ "0x0A3B5": "Door to Tutorial Discard Opens",
+ "0x01D3F": "Keep Laser Panel (Pressure Plates) Activates",
+ "0x09F7F": "Mountain Access",
+ "0x0367C": "Quarry Laser Mill Requirement Met",
+ "0x009A1": "Swamp Rotating Bridge Near Side",
+ "0x00006": "Swamp Cyan Water Drains",
+ "0x00990": "Swamp Broken Shapers 1 Activates",
+ "0x0A8DC": "Lower Avoid 6 Activates",
+ "0x0000A": "Swamp More Rotated Shapers 1 Access",
+ "0x09ED8": "Inside Mountain Second Layer Both Light Bridges Solved",
+ "0x0A3D0": "Quarry Laser Boathouse Requirement Met",
+ "0x00596": "Swamp Red Water Drains",
+ "0x28B39": "Town Tower 4th Door Opens"
+ }
+
+ self.ALWAYS_EVENT_NAMES_BY_HEX = {
+ "0x0360D": "Symmetry Laser Activation",
+ "0x03608": "Desert Laser Activation",
+ "0x09F98": "Desert Laser Redirection",
+ "0x03612": "Quarry Laser Activation",
+ "0x19650": "Shadows Laser Activation",
+ "0x0360E": "Keep Laser Hedges Activation",
+ "0x03317": "Keep Laser Pressure Plates Activation",
+ "0x17CA4": "Monastery Laser Activation",
+ "0x032F5": "Town Laser Activation",
+ "0x03616": "Jungle Laser Activation",
+ "0x09DE0": "Bunker Laser Activation",
+ "0x03615": "Swamp Laser Activation",
+ "0x03613": "Treehouse Laser Activation",
+ "0x03535": "Shipwreck Video Pattern Knowledge",
+ "0x03542": "Mountain Video Pattern Knowledge",
+ "0x0339E": "Desert Video Pattern Knowledge",
+ "0x03481": "Tutorial Video Pattern Knowledge",
+ "0x03702": "Jungle Video Pattern Knowledge",
+ "0x2FAF6": "Theater Walkway Video Pattern Knowledge",
+ }
+
+ self.make_options_adjustments(world, player)
+ self.make_dependency_reduced_checklist()
+ self.make_event_panel_lists()
diff --git a/worlds/witness/regions.py b/worlds/witness/regions.py
new file mode 100644
index 0000000000..a7d549e704
--- /dev/null
+++ b/worlds/witness/regions.py
@@ -0,0 +1,89 @@
+"""
+Defines Region for The Witness, assigns locations to them,
+and connects them with the proper requirements
+"""
+
+from BaseClasses import MultiWorld, Entrance
+from . import StaticWitnessLogic
+from .locations import WitnessPlayerLocations
+from .player_logic import WitnessPlayerLogic
+
+
+class WitnessRegions:
+ """Class that defines Witness Regions"""
+
+ locat = None
+ logic = None
+
+ def make_lambda(self, panel_hex_to_solve_set, world, player, player_logic):
+ """
+ Lambdas are made in a for loop, so the values have to be captured
+ This function is for that purpose
+ """
+
+ return lambda state: state._witness_can_solve_panels(
+ panel_hex_to_solve_set, world, player, player_logic, self.locat
+ )
+
+ def connect(self, world: MultiWorld, player: int, source: str, target: str, player_logic: WitnessPlayerLogic,
+ panel_hex_to_solve_set=None):
+ """
+ connect two regions and set the corresponding requirement
+ """
+ source_region = world.get_region(source, player)
+ target_region = world.get_region(target, player)
+
+ connection = Entrance(
+ player,
+ source + " to " + target + " via " + str(panel_hex_to_solve_set),
+ source_region
+ )
+
+ connection.access_rule = self.make_lambda(panel_hex_to_solve_set, world, player, player_logic)
+
+ source_region.exits.append(connection)
+ connection.connect(target_region)
+
+ def create_regions(self, world, player: int, player_logic: WitnessPlayerLogic):
+ """
+ Creates all the regions for The Witness
+ """
+ from . import create_region
+
+ world.regions += [
+ create_region(world, player, 'Menu', self.locat, None, ["The Splashscreen?"]),
+ ]
+
+ all_locations = set()
+
+ for region_name, region in StaticWitnessLogic.ALL_REGIONS_BY_NAME.items():
+ locations_for_this_region = [
+ StaticWitnessLogic.CHECKS_BY_HEX[panel]["checkName"] for panel in region["panels"]
+ if StaticWitnessLogic.CHECKS_BY_HEX[panel]["checkName"] in self.locat.CHECK_LOCATION_TABLE
+ ]
+ locations_for_this_region += [
+ StaticWitnessLogic.CHECKS_BY_HEX[panel]["checkName"] + " Solved" for panel in region["panels"]
+ if StaticWitnessLogic.CHECKS_BY_HEX[panel]["checkName"] + " Solved" in self.locat.EVENT_LOCATION_TABLE
+ ]
+
+ all_locations = all_locations | set(locations_for_this_region)
+
+ world.regions += [
+ create_region(world, player, region_name, self.locat,locations_for_this_region)
+ ]
+
+ for region_name, region in StaticWitnessLogic.ALL_REGIONS_BY_NAME.items():
+ for connection in player_logic.CONNECTIONS_BY_REGION_NAME[region_name]:
+ if connection[0] == "Entry":
+ continue
+ self.connect(world, player, region_name,
+ connection[0], player_logic, connection[1])
+ self.connect(world, player, connection[0],
+ region_name, player_logic, connection[1])
+
+ world.get_entrance("The Splashscreen?", player).connect(
+ world.get_region('First Hallway', player)
+ )
+
+ def __init__(self, locat: WitnessPlayerLocations):
+ self.locat = locat
diff --git a/worlds/witness/rules.py b/worlds/witness/rules.py
new file mode 100644
index 0000000000..e7ef30aaf0
--- /dev/null
+++ b/worlds/witness/rules.py
@@ -0,0 +1,171 @@
+"""
+Defines the rules by which locations can be accessed,
+depending on the items received
+"""
+
+# pylint: disable=E1101
+
+from BaseClasses import MultiWorld
+from .player_logic import WitnessPlayerLogic
+from .Options import is_option_enabled
+from .locations import WitnessPlayerLocations
+from . import StaticWitnessLogic
+from ..AutoWorld import LogicMixin
+from ..generic.Rules import set_rule
+
+
+class WitnessLogic(LogicMixin):
+ """
+ Logic macros that get reused
+ """
+
+ def _witness_has_lasers(self, world, player: int, amount: int) -> bool:
+ lasers = 0
+
+ lasers += int(self.has("Symmetry Laser Activation", player))
+ lasers += int(self.has("Desert Laser Activation", player)
+ and self.has("Desert Laser Redirection", player))
+ lasers += int(self.has("Town Laser Activation", player))
+ lasers += int(self.has("Monastery Laser Activation", player))
+ lasers += int(self.has("Keep Laser Pressure Plates Activation", player) and (
+ is_option_enabled(world, player, "disable_non_randomized_puzzles")
+ or self.has("Keep Laser Hedges Activation", player)
+ ))
+ lasers += int(self.has("Quarry Laser Activation", player))
+ lasers += int(self.has("Treehouse Laser Activation", player))
+ lasers += int(self.has("Jungle Laser Activation", player))
+ lasers += int(self.has("Bunker Laser Activation", player))
+ lasers += int(self.has("Swamp Laser Activation", player))
+ lasers += int(self.has("Shadows Laser Activation", player))
+
+ return lasers >= amount
+
+ def _witness_can_solve_panel(self, panel, world, player, player_logic: WitnessPlayerLogic, locat):
+ """
+ Determines whether a panel can be solved
+ """
+
+ panel_obj = StaticWitnessLogic.CHECKS_BY_HEX[panel]
+ check_name = panel_obj["checkName"]
+
+ if (check_name + " Solved" in locat.EVENT_LOCATION_TABLE
+ and not self.has(player_logic.EVENT_ITEM_PAIRS[check_name + " Solved"], player)):
+ return False
+ if panel not in player_logic.ORIGINAL_EVENT_PANELS and not self.can_reach(check_name, "Location", player):
+ return False
+ if (panel in player_logic.ORIGINAL_EVENT_PANELS
+ and check_name + " Solved" not in locat.EVENT_LOCATION_TABLE
+ and not self._witness_safe_manual_panel_check(panel, world, player, player_logic, locat)):
+ return False
+
+ return True
+
+ def _witness_meets_item_requirements(self, panel, world, player, player_logic: WitnessPlayerLogic, locat):
+ """
+ Checks whether item and panel requirements are met for
+ a panel
+ """
+
+ panel_req = player_logic.REQUIREMENTS_BY_HEX[panel]
+
+ for option in panel_req:
+ if len(option) == 0:
+ return True
+
+ valid_option = True
+
+ for item in option:
+ if item == "7 Lasers":
+ if not self._witness_has_lasers(world, player, 7):
+ valid_option = False
+ break
+ elif item == "11 Lasers":
+ if not self._witness_has_lasers(world, player, 11):
+ valid_option = False
+ break
+ elif item in player_logic.NECESSARY_EVENT_PANELS:
+ if StaticWitnessLogic.CHECKS_BY_HEX[item]["checkName"] + " Solved" in locat.EVENT_LOCATION_TABLE:
+ valid_option = self.has(player_logic.EVENT_ITEM_NAMES[item], player)
+ else:
+ valid_option = self.can_reach(
+ StaticWitnessLogic.CHECKS_BY_HEX[item]["checkName"], "Location", player
+ )
+ if not valid_option:
+ break
+ elif not self.has(item, player):
+ valid_option = False
+ break
+
+ if valid_option:
+ return True
+
+ return False
+
+ def _witness_safe_manual_panel_check(self, panel, world, player, player_logic: WitnessPlayerLogic, locat):
+ """
+ nested can_reach can cause problems, but only if the region being
+ checked is neither of the two original regions from the first
+ can_reach.
+ A nested can_reach is okay here because the only panels this
+ function is called on are panels that exist on either side of all
+ connections they are required for.
+ The spoiler log looks so much nicer this way,
+ it gets rid of a bunch of event items, only leaving a couple. :)
+ """
+ region = StaticWitnessLogic.CHECKS_BY_HEX[panel]["region"]["name"]
+
+ return (
+ self._witness_meets_item_requirements(panel, world, player, player_logic, locat)
+ and self.can_reach(region, "Region", player)
+ )
+
+ def _witness_can_solve_panels(self, panel_hex_to_solve_set, world, player, player_logic: WitnessPlayerLogic, locat):
+ """
+ Checks whether a set of panels can be solved.
+ """
+
+ for option in panel_hex_to_solve_set:
+ if len(option) == 0:
+ return True
+
+ valid_option = True
+
+ for panel in option:
+ if not self._witness_can_solve_panel(panel, world, player, player_logic, locat):
+ valid_option = False
+ break
+
+ if valid_option:
+ return True
+ return False
+
+
+def make_lambda(check_hex, world, player, player_logic, locat):
+ """
+ Lambdas are created in a for loop so values need to be captured
+ """
+ return lambda state: state._witness_meets_item_requirements(
+ check_hex, world, player, player_logic, locat
+ )
+
+
+def set_rules(world: MultiWorld, player: int, player_logic: WitnessPlayerLogic, locat: WitnessPlayerLocations):
+ """
+ Sets all rules for all locations
+ """
+
+ for location in locat.CHECK_LOCATION_TABLE:
+ real_location = location
+
+ if location in locat.EVENT_LOCATION_TABLE:
+ real_location = location[:-7]
+
+ panel = StaticWitnessLogic.CHECKS_BY_NAME[real_location]
+ check_hex = panel["checkHex"]
+
+ rule = make_lambda(check_hex, world, player, player_logic, locat)
+
+ set_rule(world.get_location(location, player), rule)
+
+ world.completion_condition[player] = \
+ lambda state: state.has('Victory', player)
diff --git a/worlds/witness/static_logic.py b/worlds/witness/static_logic.py
new file mode 100644
index 0000000000..680ca68070
--- /dev/null
+++ b/worlds/witness/static_logic.py
@@ -0,0 +1,138 @@
+import os
+
+from .utils import define_new_region, parse_lambda
+
+
+class StaticWitnessLogic:
+ ALL_ITEMS = set()
+ ALL_TRAPS = set()
+ ALL_BOOSTS = set()
+
+ EVENT_PANELS_FROM_REGIONS = set()
+
+ # All regions with a list of panels in them and the connections to other regions, before logic adjustments
+ ALL_REGIONS_BY_NAME = dict()
+ STATIC_CONNECTIONS_BY_REGION_NAME = dict()
+
+ CHECKS_BY_HEX = dict()
+ CHECKS_BY_NAME = dict()
+ STATIC_DEPENDENT_REQUIREMENTS_BY_HEX = dict()
+
+ def parse_items(self):
+ """
+ Parses currently defined items from WitnessItems.txt
+ """
+
+ path = os.path.join(os.path.dirname(__file__), "WitnessItems.txt")
+ with open(path, "r", encoding="utf-8") as file:
+ current_set = self.ALL_ITEMS
+
+ for line in file.readlines():
+ line = line.strip()
+
+ if line == "Progression:":
+ current_set = self.ALL_ITEMS
+ continue
+ if line == "Boosts:":
+ current_set = self.ALL_BOOSTS
+ continue
+ if line == "Traps:":
+ current_set = self.ALL_TRAPS
+ continue
+ if line == "":
+ continue
+
+ line_split = line.split(" - ")
+
+ current_set.add((line_split[1], int(line_split[0])))
+
+ def read_logic_file(self):
+ """
+ Reads the logic file and does the initial population of data structures
+ """
+ path = os.path.join(os.path.dirname(__file__), "WitnessLogic.txt")
+ with open(path, "r", encoding="utf-8") as file:
+ current_region = ""
+
+ discard_ids = 0
+ normal_panel_ids = 0
+ vault_ids = 0
+ laser_ids = 0
+
+ for line in file.readlines():
+ line = line.strip()
+
+ if line == "":
+ continue
+
+ if line[0] != "0":
+ new_region_and_connections = define_new_region(line)
+ current_region = new_region_and_connections[0]
+ region_name = current_region["name"]
+ self.ALL_REGIONS_BY_NAME[region_name] = current_region
+ self.STATIC_CONNECTIONS_BY_REGION_NAME[region_name] = new_region_and_connections[1]
+ continue
+
+ line_split = line.split(" - ")
+
+ check_name_full = line_split.pop(0)
+
+ check_hex = check_name_full[0:7]
+ check_name = check_name_full[9:-1]
+
+ required_panel_lambda = line_split.pop(0)
+ required_item_lambda = line_split.pop(0)
+
+ laser_names = {
+ "Laser",
+ "Laser Hedges",
+ "Laser Pressure Plates",
+ "Desert Laser Redirect"
+ }
+ is_vault_or_video = "Vault" in check_name or "Video" in check_name
+
+ if "Discard" in check_name:
+ location_type = "Discard"
+ location_id = discard_ids
+ discard_ids += 1
+ elif is_vault_or_video or check_name == "Tutorial Gate Close":
+ location_type = "Vault"
+ location_id = vault_ids
+ vault_ids += 1
+ elif check_name in laser_names:
+ location_type = "Laser"
+ location_id = laser_ids
+ laser_ids += 1
+ else:
+ location_type = "General"
+ location_id = normal_panel_ids
+ normal_panel_ids += 1
+
+ required_items = parse_lambda(required_item_lambda)
+ items_actually_in_the_game = {item[0] for item in self.ALL_ITEMS}
+ required_items = frozenset(
+ subset.intersection(items_actually_in_the_game)
+ for subset in required_items
+ )
+
+ requirement = {
+ "panels": parse_lambda(required_panel_lambda),
+ "items": required_items
+ }
+
+ self.CHECKS_BY_HEX[check_hex] = {
+ "checkName": current_region["shortName"] + " " + check_name,
+ "checkHex": check_hex,
+ "region": current_region,
+ "idOffset": location_id,
+ "panelType": location_type
+ }
+
+ self.CHECKS_BY_NAME[self.CHECKS_BY_HEX[check_hex]["checkName"]] = self.CHECKS_BY_HEX[check_hex]
+ self.STATIC_DEPENDENT_REQUIREMENTS_BY_HEX[check_hex] = requirement
+
+ current_region["panels"].add(check_hex)
+
+ def __init__(self):
+ self.parse_items()
+ self.read_logic_file()
diff --git a/worlds/witness/utils.py b/worlds/witness/utils.py
new file mode 100644
index 0000000000..3ccaf5d19f
--- /dev/null
+++ b/worlds/witness/utils.py
@@ -0,0 +1,98 @@
+import os
+from Utils import cache_argsless
+from itertools import accumulate
+from typing import *
+from fractions import Fraction
+
+
+def best_junk_to_add_based_on_weights(weights: Dict[Any, Fraction], created_junk: Dict[Any, int]):
+ min_error = ("", 2)
+
+ for junk_name, instances in created_junk.items():
+ new_dist = created_junk.copy()
+ new_dist[junk_name] += 1
+ new_dist_length = sum(new_dist.values())
+ new_dist = {key: Fraction(value/1)/new_dist_length for key, value in new_dist.items()}
+
+ errors = {key: abs(new_dist[key] - weights[key]) for key in created_junk.keys()}
+
+ new_min_error = max(errors.values())
+
+ if min_error[1] > new_min_error:
+ min_error = (junk_name, new_min_error)
+
+ return min_error[0]
+
+
+def weighted_list(weights: Dict[Any, Fraction], length):
+ """
+ Example:
+ weights = {A: 0.3, B: 0.3, C: 0.4}
+ length = 10
+
+ returns: [A, A, A, B, B, B, C, C, C, C]
+
+ Makes sure to match length *exactly*, might approximate as a result
+ """
+ vals = accumulate(map(lambda x: x * length, weights.values()), lambda x, y: x + y)
+ output_list = []
+ for k, v in zip(weights.keys(), vals):
+ while len(output_list) < v:
+ output_list.append(k)
+ return output_list
+
+
+def define_new_region(region_string):
+ """
+ Returns a region object by parsing a line in the logic file
+ """
+
+ region_string = region_string[:-1]
+ line_split = region_string.split(" - ")
+
+ region_name_full = line_split.pop(0)
+
+ region_name_split = region_name_full.split(" (")
+
+ region_name = region_name_split[0]
+ region_name_simple = region_name_split[1][:-1]
+
+ options = set()
+
+ for _ in range(len(line_split) // 2):
+ connected_region = line_split.pop(0)
+ corresponding_lambda = line_split.pop(0)
+
+ options.add(
+ (connected_region, parse_lambda(corresponding_lambda))
+ )
+
+ region_obj = {
+ "name": region_name,
+ "shortName": region_name_simple,
+ "panels": set()
+ }
+ return region_obj, options
+
+
+def parse_lambda(lambda_string):
+ """
+ Turns a lambda String literal like this: a | b & c
+ into a set of sets like this: {{a}, {b, c}}
+ The lambda has to be in DNF.
+ """
+ if lambda_string == "True":
+ return frozenset([frozenset()])
+ split_ands = set(lambda_string.split(" | "))
+ lambda_set = frozenset({frozenset(a.split(" & ")) for a in split_ands})
+
+ return lambda_set
+
+
+@cache_argsless
+def get_disable_unrandomized_list():
+ adjustment_file = "Disable_Unrandomized.txt"
+ path = os.path.join(os.path.dirname(__file__), adjustment_file)
+
+ with open(path) as f:
+ return [line.strip() for line in f.readlines()]