diff --git a/worlds/sm/Options.py b/worlds/sm/Options.py index c67d4ea7..22317952 100644 --- a/worlds/sm/Options.py +++ b/worlds/sm/Options.py @@ -1,5 +1,5 @@ import typing -from Options import Choice, Range, OptionDict, OptionList, Option, Toggle, DefaultOnToggle +from Options import Choice, Range, OptionDict, OptionList, OptionSet, Option, Toggle, DefaultOnToggle from .variaRandomizer.utils.objectives import _goals class StartItemsRemovesFromPool(Toggle): @@ -136,7 +136,7 @@ class AreaLayout(Toggle): class DoorsColorsRando(Toggle): """Randomize the color of Red/Green/Yellow doors. Add four new type of doors which require Ice/Wave/Spazer/Plasma - beams to open them. When enabled, will force those beams as local items.""" + beams to open them.""" display_name = "Doors Colors Rando" class AllowGreyDoors(Toggle): @@ -215,7 +215,11 @@ class Hud(Toggle): display_name = "Hud" class Animals(Toggle): - """Replace saving the animals in the escape sequence by a random surprise.""" + """ + Replace saving the animals in the escape sequence by a random surprise. + Note: This setting is not available when Escape Randomization is enabled, as it is replaced by Animals Challenges + (see Escape Randomization help for more information). + """ display_name = "Animals" class NoMusic(Toggle): @@ -286,17 +290,52 @@ class Tourian(Choice): option_Disabled = 2 default = 0 -class Objective(OptionList): +class CustomObjective(Toggle): """ - Choose which objectives are required to sink the Golden Four statue and to open access to Tourian. - You can choose from 0 to 5 objectives. + Use randomized custom objectives. You can choose which objectives are available for the randomizer to choose from. If enabled, the randomizer + will choose "Custom objective count" objectives from "Custom objective list". Otherwise, only objective is used. Default is disabled. + """ + display_name = "Custom objectives" + +class CustomObjectiveCount(Range): + """ + By default you need to complete 4 objectives from the list to access Tourian. You can choose between 1 and 5. This setting is ignored if + ""Custom objectives"" is set to false. + """ + display_name = "Custom objective count" + range_start = 1 + range_end = 5 + default = 4 + +class CustomObjectiveList(OptionSet): + """ + If ""Custom objectives"" is enabled, "Custom Objective count" will be used to pick an amount of objective from the list. + This setting is ignored if ""Custom objectives"" is set to false. Note: If you leave the list empty no objective is required to access Tourian, ie. it's open. Note: See the Tourian parameter to enable fast Tourian or trigger the escape when all objectives are completed. Note: Current percentage of collected items is displayed in the inventory pause menu. - Note: Collect 100% items is excluded by default when randomizing the objectives list as it requires you to complete all the objectives. + Note: Collect 100% items is excluded by default as it requires you to complete all the objectives. Note: In AP, Items% and areas objectives are counted toward location checks, not items collected or received, except for "collect all upgrades" + + Format as a comma-separated list of objective names: ["kill three G4", "collect 75% items"] or ["random"] to specify the whole list except + "collect 100% items" and "nothing". The default is ["random"]. A full list of supported objectives can be found at: + https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/sm/variaRandomizer/utils/objectives.py + """ + display_name = "Custom objective list" + default = ["random"] + valid_keys = frozenset([name for name in _goals.keys()] + ["random"]) + #valid_keys_casefold = True - Format as a comma-separated list of objective names: ["kill three G4", "collect 75% items"]. +class Objective(OptionSet): + """ + If ""Custom objectives"" is disabled, choose which objectives are required to sink the Golden Four statue and to open access to Tourian. + You can choose from 0 to 5 objectives. Up to the first 5 objectives from the list will be selected. + Note: If you leave the list empty no objective is required to access Tourian, ie. it's open. + Note: See the Tourian parameter to enable fast Tourian or trigger the escape when all objectives are completed. + Note: Current percentage of collected items is displayed in the inventory pause menu. + Note: In AP, Items% and areas objectives are counted toward location checks, not items collected or received, except for "collect all upgrades" + + Format as a comma-separated list of objective names: ["kill three G4", "collect 75% items"]. The default is ["kill all G4"]. A full list of supported objectives can be found at: https://github.com/ArchipelagoMW/Archipelago/blob/main/worlds/sm/variaRandomizer/utils/objectives.py """ @@ -386,6 +425,9 @@ sm_options: typing.Dict[str, type(Option)] = { "custom_preset": CustomPreset, "varia_custom_preset": VariaCustomPreset, "tourian": Tourian, + "custom_objective": CustomObjective, + "custom_objective_list": CustomObjectiveList, + "custom_objective_count": CustomObjectiveCount, "objective": Objective, "relaxed_round_robin_cf": RelaxedRoundRobinCF, } diff --git a/worlds/sm/__init__.py b/worlds/sm/__init__.py index 05190211..60e557aa 100644 --- a/worlds/sm/__init__.py +++ b/worlds/sm/__init__.py @@ -40,7 +40,7 @@ class SMCollectionState(metaclass=AutoLogicRegister): # for unit tests where MultiWorld is instantiated before worlds if hasattr(parent, "state"): self.smbm = {player: SMBoolManager(player, parent.state.smbm[player].maxDiff, - parent.state.smbm[player].onlyBossLeft, parent.state.smbm[player].lastAP) for player in + parent.state.smbm[player].onlyBossLeft) for player in parent.get_game_players("Super Metroid")} for player, group in parent.groups.items(): if (group["game"] == "Super Metroid"): @@ -99,13 +99,15 @@ class SMWorld(World): required_client_version = (0, 2, 6) itemManager: ItemManager + spheres = None Logic.factory('vanilla') def __init__(self, world: MultiWorld, player: int): self.rom_name_available_event = threading.Event() self.locations = {} - self.need_comeback_check = True + if SMWorld.spheres != None: + SMWorld.spheres = None super().__init__(world, player) @classmethod @@ -118,7 +120,7 @@ class SMWorld(World): Logic.factory('vanilla') self.variaRando = VariaRandomizer(self.multiworld, get_base_rom_path(), self.player) - self.multiworld.state.smbm[self.player] = SMBoolManager(self.player, self.variaRando.maxDifficulty, lastAP = self.variaRando.args.startLocation) + self.multiworld.state.smbm[self.player] = SMBoolManager(self.player, self.variaRando.maxDifficulty) # keeps Nothing items local so no player will ever pickup Nothing # doing so reduces contribution of this world to the Multiworld the more Nothing there is though @@ -177,12 +179,7 @@ class SMWorld(World): item.Type, None if itemClass == 'Boss' else self.item_name_to_id[item.Name], player=self.player) - - beamItems = ['Spazer', 'Ice', 'Wave' ,'Plasma'] - if self.multiworld.doors_colors_rando[self.player].value != 0: - if item.Type in beamItems: - self.multiworld.local_items[self.player].value.add(item.Name) - + if itemClass == 'Boss': self.locked_items[item.Name] = smitem elif item.Category == 'Nothing': @@ -217,7 +214,6 @@ class SMWorld(World): self.multiworld.completion_condition[self.player] = lambda state: state.has('Mother Brain', self.player) - ammoItems = ['Missile', 'Super', 'PowerBomb'] for key, value in locationsDict.items(): location = self.multiworld.get_location(key, self.player) set_available_rule(location, self.player, value.Available) @@ -225,11 +221,6 @@ class SMWorld(World): add_accessFrom_rule(location, self.player, value.AccessFrom) if value.PostAvailable is not None: add_postAvailable_rule(location, self.player, value.PostAvailable) - - if self.multiworld.doors_colors_rando[self.player].value != 0: - add_item_rule(location, lambda item: item.game != self.game or item.type not in ammoItems or - (item.type in ammoItems and \ - (not item.advancement or (item.advancement and item.player == self.player)))) for accessPoint in Logic.accessPoints: if not accessPoint.Escape: @@ -304,11 +295,6 @@ class SMWorld(World): def collect(self, state: CollectionState, item: Item) -> bool: state.smbm[self.player].addItem(item.type) - if item.location != None and item.location.game == self.game: - for entrance in self.multiworld.get_region(item.location.parent_region.name, item.location.player).entrances: - if (entrance.parent_region.can_reach(state)): - state.smbm[item.location.player].lastAP = entrance.parent_region.name - break return super(SMWorld, self).collect(state, item) def remove(self, state: CollectionState, item: Item) -> bool: @@ -359,42 +345,57 @@ class SMWorld(World): loc.address = loc.item.code = None def post_fill(self): + # Having a sorted itemLocs from collection order is required for escapeTrigger when Tourian is Disabled. + # We cant use stage_post_fill for this as its called after worlds' post_fill. + # get_spheres could be cached in multiworld? + # Another possible solution would be to have a globally accessible list of items in the order in which the get placed in push_item + # and use the inversed starting from the first progression item. + if (SMWorld.spheres == None): + SMWorld.spheres = [itemLoc for sphere in self.multiworld.get_spheres() for itemLoc in sorted(sphere, key=lambda location: location.name)] + self.itemLocs = [ - ItemLocation(ItemManager.Items[itemLoc.item.type + ItemLocation(copy.copy(ItemManager.Items[itemLoc.item.type if isinstance(itemLoc.item, SMItem) and itemLoc.item.type in ItemManager.Items else - 'ArchipelagoItem'], - locationsDict[itemLoc.name], itemLoc.item.player, True) + 'ArchipelagoItem']), + copy.copy(locationsDict[itemLoc.name]), itemLoc.item.player, True) for itemLoc in self.multiworld.get_locations(self.player) ] - self.progItemLocs = [ - ItemLocation(ItemManager.Items[itemLoc.item.type - if isinstance(itemLoc.item, SMItem) and itemLoc.item.type in ItemManager.Items else - 'ArchipelagoItem'], - locationsDict[itemLoc.name], itemLoc.item.player, True) - for itemLoc in self.multiworld.get_locations(self.player) if itemLoc.item.advancement - ] - for itemLoc in self.itemLocs: - if itemLoc.Item.Class == "Boss": - itemLoc.Item.Class = "Minor" - for itemLoc in self.progItemLocs: - if itemLoc.Item.Class == "Boss": - itemLoc.Item.Class = "Minor" - localItemLocs = [il for il in self.itemLocs if il.player == self.player] - localprogItemLocs = [il for il in self.progItemLocs if il.player == self.player] + escapeTrigger = None + if self.variaRando.randoExec.randoSettings.restrictions["EscapeTrigger"]: + #used to simulate received items + first_local_collected_loc = next(itemLoc for itemLoc in SMWorld.spheres if itemLoc.player == self.player) + + playerItemsItemLocs = [ + ItemLocation(copy.copy(ItemManager.Items[ + itemLoc.item.type if isinstance(itemLoc.item, SMItem) and itemLoc.item.type in ItemManager.Items else + 'ArchipelagoItem']), + copy.copy(locationsDict[itemLoc.name] if itemLoc.game == self.game else + locationsDict[first_local_collected_loc.name]), + itemLoc.item.player, + True) + for itemLoc in SMWorld.spheres if itemLoc.item.player == self.player + ] + for itemLoc in playerItemsItemLocs: + if itemLoc.Item.Class == "Boss": + itemLoc.Item.Class = "Minor" + + playerProgItemsItemLocs = [itemLoc for itemLoc in playerItemsItemLocs if itemLoc.item.advancement] + + escapeTrigger = (playerItemsItemLocs, playerProgItemsItemLocs, 'Full') - escapeTrigger = (localItemLocs, localprogItemLocs, 'Full') if self.variaRando.randoExec.randoSettings.restrictions["EscapeTrigger"] else None escapeOk = self.variaRando.randoExec.graphBuilder.escapeGraph(self.variaRando.container, self.variaRando.randoExec.areaGraph, self.variaRando.randoExec.randoSettings.maxDiff, escapeTrigger) - assert escapeOk, "Could not find a solution for escape" - + if (not escapeOk): + logger.warning(f"Escape Rando forced to 'Off' for player {self.multiworld.get_player_name(self.player)} because could not find a solution for escape") + + # if we couldn't find an area layout then the escape graph is not created either + # and getDoorConnections will crash if random escape is activated. self.variaRando.doors = GraphUtils.getDoorConnections(self.variaRando.randoExec.areaGraph, self.variaRando.args.area, self.variaRando.args.bosses, - self.variaRando.args.escapeRando) + self.variaRando.args.escapeRando if escapeOk else False) self.variaRando.randoExec.postProcessItemLocs(self.itemLocs, self.variaRando.args.hideItems) - self.need_comeback_check = False - @classmethod def stage_post_fill(cls, world): new_state = CollectionState(world) @@ -872,29 +873,6 @@ class SMLocation(Location): def __init__(self, player: int, name: str, address=None, parent=None): super(SMLocation, self).__init__(player, name, address, parent) - def can_reach(self, state: CollectionState) -> bool: - # self.access_rule computes faster on average, so placing it first for faster abort - assert self.parent_region, "Can't reach location without region" - return super(SMLocation, self).can_reach(state) and \ - (not state.multiworld.worlds[self.player].need_comeback_check or \ - self.can_comeback(state, self.item)) - - def can_comeback(self, state: CollectionState, item): - randoExec = state.multiworld.worlds[self.player].variaRando.randoExec - randoService = randoExec.setup.services - - comebackCheck = ComebackCheckType.JustComeback - n = 2 if GraphUtils.isStandardStart(randoExec.graphSettings.startAP) else 3 - # is early game - if (len([loc for loc in state.locations_checked if loc.player == self.player]) <= n or randoExec.graphSettings.startAP == state.smbm[self.player].lastAP): - comebackCheck = ComebackCheckType.NoCheck - container = ItemLocContainer(state.smbm[self.player], [], []) - return randoService.fullComebackCheck( container, - state.smbm[self.player].lastAP, - ItemManager.Items[item.type] if item is not None and item.player == self.player else None, - locationsDict[self.name], - comebackCheck) - class SMItem(Item): game = "Super Metroid" type: str diff --git a/worlds/sm/data/SMBasepatch_prebuilt/multiworld-basepatch.ips b/worlds/sm/data/SMBasepatch_prebuilt/multiworld-basepatch.ips index 88a4a308..e7b7c546 100644 Binary files a/worlds/sm/data/SMBasepatch_prebuilt/multiworld-basepatch.ips and b/worlds/sm/data/SMBasepatch_prebuilt/multiworld-basepatch.ips differ diff --git a/worlds/sm/data/SMBasepatch_prebuilt/multiworld.sym b/worlds/sm/data/SMBasepatch_prebuilt/multiworld.sym index f537a73b..6d73322f 100644 --- a/worlds/sm/data/SMBasepatch_prebuilt/multiworld.sym +++ b/worlds/sm/data/SMBasepatch_prebuilt/multiworld.sym @@ -2,16 +2,17 @@ ; generated by asar [labels] -B8:83C1 :neg_1_1 -B8:85C6 :neg_1_2 -B8:85E5 :neg_1_3 -85:BAB4 :neg_1_4 -85:BACF :neg_1_5 -B8:C81F :neg_1_6 -B8:C831 :neg_1_7 -B8:C843 :neg_1_8 +82:FA1A :neg_1_1 +B8:83C1 :neg_1_2 +B8:85DA :neg_1_3 +B8:85F9 :neg_1_4 +85:BAB4 :neg_1_5 +85:BACF :neg_1_6 +B8:C81F :neg_1_7 +B8:C831 :neg_1_8 +B8:C843 :neg_1_9 B8:830C :pos_1_0 -B8:8693 :pos_1_1 +B8:86B4 :pos_1_1 84:FE1B :pos_1_2 84:FE25 :pos_1_3 B8:C862 :pos_1_4 @@ -22,7 +23,7 @@ B8:C87C :pos_1_6 85:990F CLIPLEN_end 85:990C CLIPLEN_no_multi 85:FF1D CLIPSET -B8:8503 COLLECTTANK +B8:8517 COLLECTTANK 85:FF45 MISCFX 84:8BF2 NORMAL 85:FF4E SETFX @@ -30,15 +31,17 @@ B8:8503 COLLECTTANK 84:FD90 SOUNDFX_84 85:FF3C SPECIALFX 84:FC46 ammo_loop_table -B8:85BA ap_playerid_to_rom_other_player_index -B8:85DD ap_playerid_to_rom_other_player_index_checklastrow -B8:85F8 ap_playerid_to_rom_other_player_index_correctindex -B8:85C0 ap_playerid_to_rom_other_player_index_do_search_stage_1 -B8:85F5 ap_playerid_to_rom_other_player_index_notfound +B8:85CE ap_playerid_to_rom_other_player_index +B8:85F1 ap_playerid_to_rom_other_player_index_checklastrow +B8:860C ap_playerid_to_rom_other_player_index_correctindex +B8:85D4 ap_playerid_to_rom_other_player_index_do_search_stage_1 +B8:8609 ap_playerid_to_rom_other_player_index_notfound 84:FC24 archipelago_chozo_item_plm 84:FC28 archipelago_hidden_item_plm 84:FC20 archipelago_visible_item_plm 84:FC42 c_item +82:F990 check_reload +82:F9C0 check_reload_end CE:FF04 config_deathlink CE:FF00 config_flags CE:FF00 config_multiworld @@ -50,6 +53,8 @@ B8:83FD copy_memory B8:8417 copy_memory_done B8:8409 copy_memory_even B8:840F copy_memory_loop +82:F9C3 deathhook +82:F9D8 deathhook_zebes 84:FC44 h_item 84:FC5D i_chozo_item 84:FC64 i_hidden_item @@ -58,13 +63,13 @@ B8:885C i_item_setup_shared B8:8878 i_item_setup_shared_all_items B8:8883 i_item_setup_shared_alwaysloaded 84:FE29 i_live_pickup -B8:85FD i_live_pickup_multiworld -B8:8679 i_live_pickup_multiworld_end -B8:8659 i_live_pickup_multiworld_item_link_item -B8:8649 i_live_pickup_multiworld_otherplayers_item -B8:8635 i_live_pickup_multiworld_own_item -B8:8641 i_live_pickup_multiworld_own_item1 -B8:8620 i_live_pickup_multiworld_send_network +B8:8611 i_live_pickup_multiworld +B8:868D i_live_pickup_multiworld_end +B8:866D i_live_pickup_multiworld_item_link_item +B8:865D i_live_pickup_multiworld_otherplayers_item +B8:8649 i_live_pickup_multiworld_own_item +B8:8655 i_live_pickup_multiworld_own_item1 +B8:8634 i_live_pickup_multiworld_send_network 84:FDCE i_load_custom_graphics 84:FDE9 i_load_custom_graphics_all_items 84:FDF9 i_load_custom_graphics_alwaysloaded @@ -100,30 +105,30 @@ B8:8620 i_live_pickup_multiworld_send_network 85:BAA3 message_write_placeholders 85:BAA5 message_write_placeholders_adjust 85:BAED message_write_placeholders_end -B8:84BB mw_cleanup_item_link_messagebox -B8:848B mw_display_item_sent -B8:8513 mw_handle_queue -B8:8562 mw_handle_queue_collect_item_if_present -B8:85B3 mw_handle_queue_end -B8:859B mw_handle_queue_found -B8:8522 mw_handle_queue_lookup_player -B8:8515 mw_handle_queue_loop -B8:857C mw_handle_queue_new_remote_item -B8:85A7 mw_handle_queue_next -B8:858E mw_handle_queue_perform_receive -B8:867D mw_hook_main_game +B8:84CF mw_cleanup_item_link_messagebox +B8:849F mw_display_item_sent +B8:8527 mw_handle_queue +B8:8576 mw_handle_queue_collect_item_if_present +B8:85C7 mw_handle_queue_end +B8:85AF mw_handle_queue_found +B8:8536 mw_handle_queue_lookup_player +B8:8529 mw_handle_queue_loop +B8:8590 mw_handle_queue_new_remote_item +B8:85BB mw_handle_queue_next +B8:85A2 mw_handle_queue_perform_receive +B8:8691 mw_hook_main_game B8:8311 mw_init B8:8366 mw_init_continuereset B8:83EA mw_init_end B8:8300 mw_init_memory B8:833B mw_init_reset_sram B8:8351 mw_init_smstringdata -B8:8474 mw_load_sram -B8:8482 mw_load_sram_done -B8:8485 mw_load_sram_setnewgame -B8:84A9 mw_prep_item_link_messagebox -B8:84C4 mw_receive_item -B8:84FC mw_receive_item_end +B8:8488 mw_load_sram +B8:8496 mw_load_sram_done +B8:8499 mw_load_sram_setnewgame +B8:84BD mw_prep_item_link_messagebox +B8:84D8 mw_receive_item +B8:8510 mw_receive_item_end B8:8469 mw_save_sram B8:8442 mw_write_message 84:FC38 nonprog_item_eight_palette_indices @@ -150,7 +155,7 @@ B8:8442 mw_write_message 84:FD1E p_visible_item_end 84:FD0B p_visible_item_loop 84:FD17 p_visible_item_trigger -B8:8694 patch_load_multiworld +B8:86B5 patch_load_multiworld 84:FE2E perform_item_pickup 84:FC36 plm_graphics_entry_offworld_item 84:FC2C plm_graphics_entry_offworld_progression_item @@ -161,8 +166,21 @@ B8:DCA0 rando_player_id_table B8:DE34 rando_player_id_table_end B8:D000 rando_player_name_table B8:CF00 rando_seed_data +A0:FE0C setup_game_1 +A0:FE1F setup_game_1_quick +A0:FE2F setup_game_2 +A0:FE40 setup_game_2_quick +A0:FE44 setup_game_3 +A0:FE73 setup_game_3_loadmusic +A0:FE57 setup_game_3_quick +A0:FE00 setup_music +A0:FE0B setup_music_quick +A0:FE94 setup_samus +A0:FEA5 setup_samus_normal +82:FA0C sm_fix_checksum B8:8800 sm_item_graphics B8:882E sm_item_plm_pickup_sequence_pointers +B8:847B sm_save_done_hook B8:C81C start_item B8:C800 start_item_data_major B8:C808 start_item_data_minor @@ -173,732 +191,898 @@ B8:83EF write_repeated_memory B8:83F4 write_repeated_memory_loop [source files] -0000 bf919aa9 main.asm -0001 06780555 ../common/nofanfare.asm -0002 ae952bc9 ../common/multiworld.asm -0003 f7e9db95 ../common/itemextras.asm -0004 b0dd378a ../common/items.asm -0005 dbfcb38d ../common/startitem.asm +0000 fe019f55 main.asm +0001 5d628289 ../common/fast_reload.asm +0002 06780555 ../common/nofanfare.asm +0003 7a8904b6 ../common/multiworld.asm +0004 f7e9db95 ../common/itemextras.asm +0005 b0dd378a ../common/items.asm +0006 dbfcb38d ../common/startitem.asm [rom checksum] -e8b10748 +72f7eb3b [addr-to-line mapping] ff:ffff 0000:00000001 -85:ff00 0001:0000010b -85:ff03 0001:0000010c -85:ff06 0001:0000010d -85:ff08 0001:0000010e -85:ff0b 0001:0000010f -85:ff0f 0001:00000110 -85:ff12 0001:00000111 -85:ff16 0001:00000112 -85:ff19 0001:00000113 -85:ff1c 0001:00000114 -85:ff1d 0001:00000117 -85:ff20 0001:00000118 -85:ff24 0001:00000119 -85:ff28 0001:0000011a -85:ff2b 0001:0000011c -85:ff2f 0001:0000011d -85:ff30 0001:00000120 -85:ff34 0001:00000121 -85:ff37 0001:00000122 -85:ff3b 0001:00000123 -85:ff3c 0001:00000126 -85:ff40 0001:00000127 -85:ff44 0001:00000128 -85:ff45 0001:0000012b -85:ff49 0001:0000012c -85:ff4d 0001:0000012d -85:ff4e 0001:00000131 -85:ff51 0001:00000132 -85:ff54 0001:00000134 -85:ff57 0001:00000135 -85:ff58 0001:00000136 -85:8490 0001:0000013a -85:9900 0001:0000013e -85:9901 0001:0000013f -85:9905 0001:00000140 -85:9907 0001:00000141 -85:990a 0001:00000142 -85:990c 0001:00000144 -85:990f 0001:00000146 -85:9910 0001:00000147 -82:e126 0001:0000014a -82:e12a 0001:0000014b -85:8089 0001:0000014e -84:8bf2 0001:00000152 -84:8bf6 0001:00000153 -84:8bf7 0001:00000153 -b8:8300 0002:0000005a -b8:8302 0002:0000005b -b8:8306 0002:0000005c -b8:8308 0002:0000005d -b8:830c 0002:00000061 -b8:830e 0002:00000062 -b8:8310 0002:00000063 -b8:8311 0002:00000066 -b8:8312 0002:00000066 -b8:8313 0002:00000066 -b8:8314 0002:00000066 +ce:ff0a 0001:00000012 +82:f990 0001:00000016 +82:f991 0001:00000017 +82:f993 0001:00000018 +82:f994 0001:00000019 +82:f996 0001:0000001a +82:f999 0001:0000001b +82:f99c 0001:0000001c +82:f99e 0001:0000001d +82:f9a2 0001:0000001e +82:f9a4 0001:0000001f +82:f9a7 0001:00000020 +82:f9a9 0001:00000021 +82:f9ac 0001:00000022 +82:f9af 0001:00000023 +82:f9b1 0001:00000024 +82:f9b5 0001:00000025 +82:f9b8 0001:00000026 +82:f9ba 0001:00000027 +82:f9bb 0001:00000028 +82:f9bc 0001:00000029 +82:f9bf 0001:0000002a +82:f9c0 0001:0000002c +82:f9c1 0001:0000002d +82:f9c2 0001:0000002e +82:f9c3 0001:00000031 +82:f9c4 0001:00000032 +82:f9c6 0001:00000033 +82:f9c9 0001:00000034 +82:f9cc 0001:00000036 +82:f9d0 0001:00000037 +82:f9d3 0001:00000037 +82:f9d5 0001:00000038 +82:f9d8 0001:0000003a +82:f9d9 0001:0000003b +82:f9dc 0001:0000003b +82:f9dd 0001:0000003b +82:f9e0 0001:0000003c +82:f9e1 0001:0000003c +82:f9e2 0001:0000003d +82:f9e5 0001:0000003d +82:f9e8 0001:0000003e +82:f9e9 0001:0000003f +82:f9ed 0001:00000040 +82:f9f1 0001:00000041 +82:f9f5 0001:00000043 +82:f9f9 0001:00000044 +82:f9fc 0001:00000045 +82:fa00 0001:00000046 +82:fa04 0001:00000047 +82:fa07 0001:00000048 +82:fa0a 0001:00000049 +82:fa0b 0001:0000004a +82:fa0c 0001:0000004d +82:fa0d 0001:0000004e +82:fa0e 0001:0000004f +82:fa0f 0001:00000050 +82:fa10 0000:00000013 +82:fa12 0001:00000054 +82:fa14 0001:00000055 +82:fa15 0001:00000056 +82:fa17 0001:00000057 +82:fa1a 0001:00000059 +82:fa1e 0001:0000005a +82:fa1f 0001:0000005b +82:fa21 0001:0000005c +82:fa23 0001:0000005d +82:fa24 0001:0000005e +82:fa25 0001:0000005f +82:fa28 0001:00000060 +82:fa2a 0001:00000062 +82:fa2d 0001:00000063 +82:fa2f 0001:00000064 +82:fa33 0001:00000065 +82:fa37 0001:00000066 +82:fa3a 0001:00000067 +82:fa3e 0001:00000068 +82:fa42 0001:00000069 +82:fa43 0001:0000006a +82:fa45 0001:0000006c +82:fa46 0001:0000006d +82:fa47 0001:0000006e +82:fa48 0001:0000006f +82:fa49 0001:00000070 +80:a088 0001:00000076 +80:a08c 0001:00000076 +80:a08d 0001:00000076 +80:a095 0001:00000079 +80:a0ce 0001:0000007c +80:a113 0001:0000007f +91:e164 0001:00000082 +91:e168 0001:00000082 +91:e169 0001:00000082 +a0:fe00 0001:00000087 +a0:fe03 0001:00000088 +a0:fe05 0001:00000089 +a0:fe08 0001:0000008a +a0:fe0b 0001:0000008c +a0:fe0c 0001:0000008f +a0:fe10 0001:00000090 +a0:fe13 0001:00000091 +a0:fe15 0001:00000092 +a0:fe18 0001:00000093 +a0:fe1b 0001:00000094 +a0:fe1f 0001:00000096 +a0:fe23 0001:00000097 +a0:fe27 0001:00000098 +a0:fe2b 0001:00000099 +a0:fe2f 0001:0000009c +a0:fe33 0001:0000009d +a0:fe36 0001:0000009e +a0:fe38 0001:0000009f +a0:fe3c 0001:000000a0 +a0:fe40 0001:000000a2 +a0:fe44 0001:000000a5 +a0:fe48 0001:000000a6 +a0:fe49 0001:000000a7 +a0:fe4c 0001:000000a8 +a0:fe4e 0001:000000a9 +a0:fe4f 0001:000000aa +a0:fe53 0001:000000ab +a0:fe57 0001:000000ad +a0:fe58 0001:000000ae +a0:fe5c 0001:000000af +a0:fe5f 0001:000000b0 +a0:fe62 0001:000000b1 +a0:fe65 0001:000000b2 +a0:fe67 0001:000000b3 +a0:fe6a 0001:000000b4 +a0:fe6d 0001:000000b5 +a0:fe6f 0001:000000b6 +a0:fe73 0001:000000b9 +a0:fe76 0001:000000ba +a0:fe79 0001:000000bb +a0:fe7c 0001:000000bc +a0:fe7f 0001:000000be +a0:fe82 0001:000000bf +a0:fe85 0001:000000c0 +a0:fe89 0001:000000c1 +a0:fe8c 0001:000000c2 +a0:fe90 0001:000000c4 +a0:fe94 0001:000000c7 +a0:fe97 0001:000000c8 +a0:fe99 0001:000000c9 +a0:fe9c 0001:000000ca +a0:fe9f 0001:000000cb +a0:fea2 0001:000000cc +a0:fea5 0001:000000ce +a0:fea8 0001:000000cf +a0:feab 0001:000000d0 +85:ff00 0002:0000010b +85:ff03 0002:0000010c +85:ff06 0002:0000010d +85:ff08 0002:0000010e +85:ff0b 0002:0000010f +85:ff0f 0002:00000110 +85:ff12 0002:00000111 +85:ff16 0002:00000112 +85:ff19 0002:00000113 +85:ff1c 0002:00000114 +85:ff1d 0002:00000117 +85:ff20 0002:00000118 +85:ff24 0002:00000119 +85:ff28 0002:0000011a +85:ff2b 0002:0000011c +85:ff2f 0002:0000011d +85:ff30 0002:00000120 +85:ff34 0002:00000121 +85:ff37 0002:00000122 +85:ff3b 0002:00000123 +85:ff3c 0002:00000126 +85:ff40 0002:00000127 +85:ff44 0002:00000128 +85:ff45 0002:0000012b +85:ff49 0002:0000012c +85:ff4d 0002:0000012d +85:ff4e 0002:00000131 +85:ff51 0002:00000132 +85:ff54 0002:00000134 +85:ff57 0002:00000135 +85:ff58 0002:00000136 +85:8490 0002:0000013a +85:9900 0002:0000013e +85:9901 0002:0000013f +85:9905 0002:00000140 +85:9907 0002:00000141 +85:990a 0002:00000142 +85:990c 0002:00000144 +85:990f 0002:00000146 +85:9910 0002:00000147 +82:e126 0002:0000014a +82:e12a 0002:0000014b +85:8089 0002:0000014e +84:8bf2 0002:00000152 +84:8bf6 0002:00000153 +84:8bf7 0002:00000153 +b8:8300 0003:00000060 +b8:8302 0003:00000061 +b8:8306 0003:00000062 +b8:8308 0003:00000063 +b8:830c 0003:00000067 +b8:830e 0003:00000068 +b8:8310 0003:00000069 +b8:8311 0003:0000006c +b8:8312 0003:0000006c +b8:8313 0003:0000006c +b8:8314 0003:0000006c b8:8315 0000:00000013 -b8:8317 0002:0000006a -b8:831b 0002:0000006b -b8:831e 0002:0000006c -b8:8320 0002:0000006d -b8:8324 0002:0000006e -b8:8328 0002:0000006f -b8:832a 0002:00000070 -b8:832e 0002:00000071 -b8:8332 0002:00000072 -b8:8334 0002:00000074 -b8:8338 0002:00000075 -b8:833b 0002:00000078 -b8:833c 0002:00000079 -b8:833f 0002:0000007a -b8:8342 0002:0000007b -b8:8345 0002:0000007c -b8:8348 0002:0000007d -b8:8349 0002:0000007e -b8:834a 0002:0000007f -b8:834e 0002:00000080 -b8:834f 0002:00000082 -b8:8366 0002:00000086 -b8:8368 0002:00000087 -b8:8369 0002:00000088 -b8:836a 0002:00000089 -b8:836c 0002:0000008a -b8:836e 0002:0000008b -b8:8370 0002:0000008c -b8:8372 0002:0000008d -b8:8375 0002:0000008e -b8:8377 0002:0000008f -b8:837a 0002:00000090 -b8:837d 0002:00000091 -b8:837f 0002:00000092 -b8:8383 0002:00000094 -b8:8385 0002:00000095 -b8:8387 0002:00000096 -b8:8389 0002:00000097 -b8:838b 0002:00000098 -b8:838d 0002:00000099 -b8:838f 0002:0000009a -b8:8392 0002:0000009b -b8:8394 0002:0000009c -b8:8397 0002:0000009d -b8:839a 0002:0000009e -b8:839c 0002:0000009f -b8:83a0 0002:000000a1 -b8:83a3 0002:000000a2 -b8:83a7 0002:000000a3 -b8:83ab 0002:000000a4 -b8:83af 0002:000000a5 -b8:83b3 0002:000000a6 -b8:83b7 0002:000000a8 -b8:83bb 0002:000000b0 -b8:83be 0002:000000b1 -b8:83c1 0002:000000b3 -b8:83c2 0002:000000b4 -b8:83c3 0002:000000b5 -b8:83c7 0002:000000b6 -b8:83cb 0002:000000b7 -b8:83cd 0002:000000c4 -b8:83d1 0002:000000c5 -b8:83d4 0002:000000c6 -b8:83d6 0002:000000c7 -b8:83da 0002:000000c8 -b8:83dd 0002:000000c9 -b8:83df 0002:000000ce -b8:83e2 0002:000000cf -b8:83e6 0002:000000d0 -b8:83ea 0002:000000d3 -b8:83eb 0002:000000d3 -b8:83ec 0002:000000d3 -b8:83ed 0002:000000d3 -b8:83ee 0002:000000d4 -b8:83ef 0002:000000db -b8:83f0 0002:000000dc -b8:83f1 0002:000000dd -b8:83f2 0002:000000de -b8:83f3 0002:000000df -b8:83f4 0002:000000e1 -b8:83f7 0002:000000e2 -b8:83f8 0002:000000e3 -b8:83f9 0002:000000e4 -b8:83fa 0002:000000e5 -b8:83fc 0002:000000e7 -b8:83fd 0002:000000ee -b8:83fe 0002:000000ef -b8:83ff 0002:000000f0 -b8:8400 0002:000000f1 -b8:8402 0002:000000f3 -b8:8404 0002:000000f4 -b8:8405 0002:000000f5 -b8:8407 0002:000000f6 -b8:8409 0002:000000f8 -b8:840b 0002:000000f9 -b8:840c 0002:000000fa -b8:840d 0002:000000fb -b8:840f 0002:000000fd -b8:8411 0002:000000fe -b8:8413 0002:000000ff -b8:8414 0002:00000100 -b8:8415 0002:00000101 -b8:8417 0002:00000103 -b8:8418 0002:00000104 -b8:8419 0002:00000108 -b8:841d 0002:00000109 -b8:8421 0002:0000010a -b8:8425 0002:0000010b -b8:8429 0002:0000010c -b8:842d 0002:0000010d -b8:8431 0002:0000010e -b8:8435 0002:0000010f -b8:8439 0002:00000110 -b8:843d 0002:00000111 -b8:8441 0002:00000112 -b8:8442 0002:0000011b -b8:8443 0002:0000011b -b8:8444 0002:0000011c -b8:8445 0002:0000011c -b8:8446 0002:0000011d -b8:844a 0002:0000011e -b8:844d 0002:0000011e -b8:844e 0002:0000011f -b8:844f 0002:00000120 -b8:8453 0002:00000121 -b8:8454 0002:00000122 -b8:8458 0002:00000123 -b8:8459 0002:00000124 -b8:845d 0002:00000126 -b8:8461 0002:00000127 -b8:8462 0002:00000128 -b8:8466 0002:00000129 -b8:8467 0002:00000129 -b8:8468 0002:0000012a -b8:8469 0002:0000012f -b8:846a 0002:0000012f +b8:8317 0003:00000070 +b8:831b 0003:00000071 +b8:831e 0003:00000072 +b8:8320 0003:00000073 +b8:8324 0003:00000074 +b8:8328 0003:00000075 +b8:832a 0003:00000076 +b8:832e 0003:00000077 +b8:8332 0003:00000078 +b8:8334 0003:0000007a +b8:8338 0003:0000007b +b8:833b 0003:0000007e +b8:833c 0003:0000007f +b8:833f 0003:00000080 +b8:8342 0003:00000081 +b8:8345 0003:00000082 +b8:8348 0003:00000083 +b8:8349 0003:00000084 +b8:834a 0003:00000085 +b8:834e 0003:00000086 +b8:834f 0003:00000088 +b8:8366 0003:0000008c +b8:8368 0003:0000008d +b8:8369 0003:0000008e +b8:836a 0003:0000008f +b8:836c 0003:00000090 +b8:836e 0003:00000091 +b8:8370 0003:00000092 +b8:8372 0003:00000093 +b8:8375 0003:00000094 +b8:8377 0003:00000095 +b8:837a 0003:00000096 +b8:837d 0003:00000097 +b8:837f 0003:00000098 +b8:8383 0003:0000009a +b8:8385 0003:0000009b +b8:8387 0003:0000009c +b8:8389 0003:0000009d +b8:838b 0003:0000009e +b8:838d 0003:0000009f +b8:838f 0003:000000a0 +b8:8392 0003:000000a1 +b8:8394 0003:000000a2 +b8:8397 0003:000000a3 +b8:839a 0003:000000a4 +b8:839c 0003:000000a5 +b8:83a0 0003:000000a7 +b8:83a3 0003:000000a8 +b8:83a7 0003:000000a9 +b8:83ab 0003:000000aa +b8:83af 0003:000000ab +b8:83b3 0003:000000ac +b8:83b7 0003:000000ae +b8:83bb 0003:000000b6 +b8:83be 0003:000000b7 +b8:83c1 0003:000000b9 +b8:83c2 0003:000000ba +b8:83c3 0003:000000bb +b8:83c7 0003:000000bc +b8:83cb 0003:000000bd +b8:83cd 0003:000000ca +b8:83d1 0003:000000cb +b8:83d4 0003:000000cc +b8:83d6 0003:000000cd +b8:83da 0003:000000ce +b8:83dd 0003:000000cf +b8:83df 0003:000000d4 +b8:83e2 0003:000000d5 +b8:83e6 0003:000000d6 +b8:83ea 0003:000000d9 +b8:83eb 0003:000000d9 +b8:83ec 0003:000000d9 +b8:83ed 0003:000000d9 +b8:83ee 0003:000000da +b8:83ef 0003:000000e1 +b8:83f0 0003:000000e2 +b8:83f1 0003:000000e3 +b8:83f2 0003:000000e4 +b8:83f3 0003:000000e5 +b8:83f4 0003:000000e7 +b8:83f7 0003:000000e8 +b8:83f8 0003:000000e9 +b8:83f9 0003:000000ea +b8:83fa 0003:000000eb +b8:83fc 0003:000000ed +b8:83fd 0003:000000f4 +b8:83fe 0003:000000f5 +b8:83ff 0003:000000f6 +b8:8400 0003:000000f7 +b8:8402 0003:000000f9 +b8:8404 0003:000000fa +b8:8405 0003:000000fb +b8:8407 0003:000000fc +b8:8409 0003:000000fe +b8:840b 0003:000000ff +b8:840c 0003:00000100 +b8:840d 0003:00000101 +b8:840f 0003:00000103 +b8:8411 0003:00000104 +b8:8413 0003:00000105 +b8:8414 0003:00000106 +b8:8415 0003:00000107 +b8:8417 0003:00000109 +b8:8418 0003:0000010a +b8:8419 0003:0000010e +b8:841d 0003:0000010f +b8:8421 0003:00000110 +b8:8425 0003:00000111 +b8:8429 0003:00000112 +b8:842d 0003:00000113 +b8:8431 0003:00000114 +b8:8435 0003:00000115 +b8:8439 0003:00000116 +b8:843d 0003:00000117 +b8:8441 0003:00000118 +b8:8442 0003:00000121 +b8:8443 0003:00000121 +b8:8444 0003:00000122 +b8:8445 0003:00000122 +b8:8446 0003:00000123 +b8:844a 0003:00000124 +b8:844d 0003:00000124 +b8:844e 0003:00000125 +b8:844f 0003:00000126 +b8:8453 0003:00000127 +b8:8454 0003:00000128 +b8:8458 0003:00000129 +b8:8459 0003:0000012a +b8:845d 0003:0000012c +b8:8461 0003:0000012d +b8:8462 0003:0000012e +b8:8466 0003:0000012f +b8:8467 0003:0000012f +b8:8468 0003:00000130 +b8:8469 0003:00000135 +b8:846a 0003:00000135 b8:846b 0000:00000013 -b8:846d 0002:00000132 -b8:846e 0002:00000132 -b8:846f 0002:00000134 -b8:8470 0002:00000135 -b8:8473 0002:00000136 -b8:8474 0002:0000013b -b8:8475 0002:0000013b -b8:8476 0000:00000013 -b8:8478 0002:0000013d -b8:847c 0002:0000013e -b8:8480 0002:0000013f -b8:8482 0002:00000141 -b8:8483 0002:00000141 -b8:8484 0002:00000142 -b8:8485 0002:0000014a -b8:8489 0002:0000014b -b8:848b 0002:00000151 -b8:848d 0002:00000152 -b8:848f 0002:00000155 -b8:8492 0002:00000156 -b8:8494 0002:00000157 -b8:8497 0002:00000158 -b8:8499 0002:00000159 -b8:849c 0002:0000015a -b8:84a0 0002:0000015b -b8:84a2 0002:0000015c -b8:84a4 0002:0000015d -b8:84a6 0002:0000015e -b8:84a8 0002:0000015f -b8:84a9 0002:00000164 -b8:84ab 0002:00000165 -b8:84ad 0002:00000166 -b8:84b0 0002:00000167 -b8:84b2 0002:00000168 -b8:84b5 0002:00000169 -b8:84b7 0002:0000016a -b8:84ba 0002:0000016b -b8:84bb 0002:0000016e -b8:84bd 0002:0000016f -b8:84bf 0002:00000170 -b8:84c1 0002:00000171 -b8:84c3 0002:00000172 -b8:84c4 0002:00000176 -b8:84c5 0002:00000176 -b8:84c6 0002:00000177 -b8:84c9 0002:00000178 -b8:84cb 0002:00000179 -b8:84ce 0002:0000017a -b8:84d0 0002:0000017b -b8:84d1 0002:0000017c -b8:84d2 0002:0000017e -b8:84d5 0002:0000017f -b8:84d7 0002:00000180 -b8:84da 0002:00000181 -b8:84db 0002:00000182 -b8:84de 0002:00000183 -b8:84df 0002:00000183 -b8:84e0 0002:00000184 -b8:84e4 0002:00000185 -b8:84e5 0002:00000186 -b8:84e8 0002:00000187 -b8:84ec 0002:00000188 -b8:84ee 0002:0000018a -b8:84f1 0002:0000018b -b8:84f3 0002:0000018c -b8:84f6 0002:0000018d -b8:84f8 0002:0000018f -b8:84fc 0002:00000191 -b8:84fe 0002:00000192 -b8:8500 0002:00000193 -b8:8501 0002:00000193 -b8:8502 0002:00000194 -b8:8503 0002:0000019f -b8:8504 0002:000001a0 -b8:8508 0002:000001a1 -b8:8509 0002:000001a2 -b8:850d 0002:000001a3 -b8:850e 0002:000001a5 -b8:8512 0002:000001a6 -b8:8513 0002:000001db -b8:8514 0002:000001db -b8:8515 0002:000001de -b8:8519 0002:000001df -b8:851d 0002:000001e0 -b8:851f 0002:000001e1 -b8:8522 0002:000001e4 -b8:8524 0002:000001e4 -b8:8525 0002:000001e7 -b8:8529 0002:000001e8 -b8:852b 0002:000001e9 -b8:852f 0002:000001ea -b8:8533 0002:000001eb -b8:8535 0002:000001ef -b8:8537 0002:000001f0 -b8:8538 0002:000001f1 -b8:853b 0002:000001f2 -b8:853e 0002:000001f3 -b8:8540 0002:000001fc -b8:8544 0002:000001fd -b8:8547 0002:000001fe -b8:8549 0002:00000200 -b8:854b 0002:00000201 -b8:854c 0002:00000202 -b8:854f 0002:00000203 -b8:8551 0002:00000204 -b8:8552 0002:00000205 -b8:8555 0002:00000206 -b8:8556 0002:00000207 -b8:855a 0002:00000208 -b8:855b 0002:00000209 -b8:855e 0002:0000020a -b8:8560 0002:0000020d -b8:8562 0002:00000210 -b8:8564 0002:00000211 -b8:8565 0002:00000212 -b8:8568 0002:00000213 -b8:8569 0002:00000214 -b8:856a 0002:00000215 -b8:856e 0002:00000218 -b8:8572 0002:00000219 -b8:8576 0002:0000021a -b8:8578 0002:0000021c -b8:8579 0002:0000021d -b8:857a 0002:0000021e -b8:857c 0002:00000223 -b8:857d 0002:00000224 -b8:8581 0002:00000227 -b8:8585 0002:00000228 -b8:8589 0002:00000229 -b8:858d 0002:0000022a -b8:858e 0002:0000022e -b8:8592 0002:0000022f -b8:8596 0002:00000230 -b8:8598 0002:00000231 -b8:859b 0002:00000233 -b8:859d 0002:00000234 -b8:859f 0002:00000235 -b8:85a2 0002:00000236 -b8:85a4 0002:00000237 -b8:85a7 0002:0000023a -b8:85ab 0002:0000023b -b8:85ac 0002:0000023c -b8:85b0 0002:0000023e -b8:85b3 0002:00000241 -b8:85b5 0002:00000242 -b8:85b7 0002:00000243 -b8:85b8 0002:00000243 -b8:85b9 0002:00000244 -b8:85ba 0002:0000024c -b8:85bd 0002:0000024d -b8:85bf 0002:0000024e -b8:85c0 0002:00000255 -b8:85c2 0002:00000256 -b8:85c3 0002:0000025a -b8:85c6 0002:0000025d -b8:85ca 0002:0000025e -b8:85cc 0002:0000025f -b8:85ce 0002:00000260 -b8:85d0 0002:00000261 -b8:85d2 0002:00000263 -b8:85d3 0002:00000264 -b8:85d4 0002:00000265 -b8:85d7 0002:00000266 -b8:85d8 0002:00000267 -b8:85db 0002:00000268 -b8:85dd 0002:0000026b -b8:85df 0002:0000026c -b8:85e0 0002:0000026d -b8:85e1 0002:0000026e -b8:85e4 0002:0000026f -b8:85e5 0002:00000271 -b8:85e9 0002:00000272 -b8:85eb 0002:00000273 -b8:85ed 0002:00000274 -b8:85ef 0002:00000275 -b8:85f0 0002:00000276 -b8:85f1 0002:00000277 -b8:85f3 0002:00000278 -b8:85f5 0002:0000027b -b8:85f6 0002:0000027c -b8:85f7 0002:0000027d -b8:85f8 0002:0000027f -b8:85f9 0002:00000280 -b8:85fa 0002:00000281 -b8:85fb 0002:00000282 -b8:85fc 0002:00000283 -b8:85fd 0002:00000287 -b8:85fe 0002:00000287 -b8:85ff 0002:00000287 -b8:8600 0002:00000288 -b8:8604 0002:00000289 -b8:8607 0002:00000289 -b8:8608 0002:0000028b -b8:860c 0002:0000028c -b8:860d 0002:0000028d -b8:8611 0002:0000028e -b8:8613 0002:00000290 -b8:8617 0002:00000291 -b8:8618 0002:00000292 -b8:8619 0002:00000293 -b8:861a 0002:00000294 -b8:861e 0002:00000295 -b8:861f 0002:00000296 -b8:8620 0002:00000299 -b8:8624 0002:0000029a -b8:8628 0002:0000029c -b8:862c 0002:0000029d -b8:862e 0002:0000029e -b8:8631 0002:0000029f -b8:8633 0002:000002a1 -b8:8635 0002:000002a4 -b8:8639 0002:000002a5 -b8:863c 0002:000002a6 -b8:863e 0002:000002a7 -b8:8641 0002:000002aa -b8:8642 0002:000002ab -b8:8643 0002:000002ac -b8:8647 0002:000002ad -b8:8649 0002:000002b1 -b8:864d 0002:000002b2 -b8:864e 0002:000002b3 -b8:8652 0002:000002b4 -b8:8653 0002:000002b6 -b8:8657 0002:000002b7 -b8:8659 0002:000002bc -b8:865d 0002:000002bd -b8:865e 0002:000002be -b8:8662 0002:000002bf -b8:8663 0002:000002c0 -b8:8666 0002:000002c1 -b8:8668 0002:000002c3 -b8:866c 0002:000002c5 -b8:866d 0002:000002c6 -b8:866e 0002:000002c7 -b8:866f 0002:000002c8 -b8:8673 0002:000002c9 -b8:8677 0002:000002ca -b8:8679 0002:000002cd -b8:867a 0002:000002cd -b8:867b 0002:000002cd -b8:867c 0002:000002ce -b8:867d 0002:000002d2 -b8:8681 0002:000002d3 -b8:8685 0002:000002d4 -b8:8687 0002:000002d5 -b8:868b 0002:000002d6 -b8:868e 0002:000002d7 -b8:8690 0002:000002d8 -b8:8693 0002:000002da -b8:8694 0002:000002dd -b8:8698 0002:000002df -b8:8699 0002:000002e0 -b8:869a 0002:000002e1 -b8:869b 0002:000002e2 -b8:869c 0002:000002e3 -8b:914a 0002:000002e8 -81:80f7 0002:000002eb -81:8027 0002:000002ee -82:8bb3 0002:000002f1 -85:baa3 0002:00000392 -85:baa4 0002:00000392 -85:baa5 0002:00000395 -85:baa7 0002:00000396 -85:baad 0002:00000396 -85:baae 0002:00000397 -85:bab1 0002:00000398 -85:bab2 0002:00000399 -85:bab3 0002:00000399 -85:bab4 0002:0000039d -85:bab7 0002:0000039e -85:babb 0002:0000039f -85:babd 0002:0000039f -85:babf 0002:000003a0 -85:bac2 0002:000003a1 -85:bac4 0002:000003a3 -85:bac5 0002:000003a4 -85:bac7 0002:000003a5 -85:bacb 0002:000003a5 -85:bacc 0002:000003a6 -85:bacf 0002:000003a8 -85:bad3 0002:000003a9 -85:bad6 0002:000003aa -85:bad7 0002:000003ab -85:bad8 0002:000003ab -85:bad9 0002:000003ac -85:badd 0002:000003ad -85:bade 0002:000003ae -85:bae2 0002:000003af -85:bae4 0002:000003b0 -85:bae5 0002:000003b1 -85:bae6 0002:000003b2 -85:bae9 0002:000003b3 -85:baeb 0002:000003b4 -85:baed 0002:000003b7 -85:baee 0002:000003b7 -85:baef 0002:000003b8 -85:baf2 0002:000003b9 -85:bb73 0002:000003c7 -85:bb75 0002:000003c8 -85:bb78 0002:000003c9 -85:bb7b 0002:000003ca -85:bb7e 0002:000003d2 -85:bb7f 0002:000003d3 -85:bb81 0002:000003d4 -85:bb84 0002:000003d5 -85:bb86 0002:000003d6 -85:bb88 0002:000003d7 -85:bb8b 0002:000003d8 -85:bb8d 0002:000003d9 -85:bb90 0002:000003da -85:bb92 0002:000003db -85:bb95 0002:000003dc -85:bb97 0002:000003df -85:bb98 0002:000003e0 -85:bb99 0002:000003e1 -85:bb9a 0002:000003e2 -85:bb9c 0002:000003e3 -85:bb9d 0002:000003e4 -85:bb9e 0002:000003e5 -85:bb9f 0002:000003ec -85:bba2 0002:000003ed -85:bba3 0002:000003ee -85:bba6 0002:000003ef -85:bba7 0002:000003f0 -85:bba8 0002:000003f1 -85:bba9 0002:000003f2 -85:bbaa 0002:000003fd -85:bbab 0002:000003fe -85:bbad 0002:000003ff -85:bbb0 0002:00000400 -85:bbb2 0002:00000401 -85:bbb5 0002:00000402 -85:bbb7 0002:00000403 -85:bbba 0002:00000404 -85:bbbc 0002:00000407 -85:bbbd 0002:00000408 -85:bbbe 0002:00000409 -85:bbc0 0002:0000040a -85:bbc1 0002:0000040c -85:bbc2 0002:0000040d -85:bbc4 0002:0000040e -85:bbc7 0002:0000040f -85:bbc9 0002:00000410 -85:bbcc 0002:00000411 -85:bbce 0002:00000412 -85:bbcf 0002:00000414 -85:bbd0 0002:00000415 -85:bbd2 0002:00000416 -85:bbd5 0002:00000417 -85:bbd7 0002:00000418 -85:bbda 0002:00000419 -85:bbdc 0002:0000041a -85:bbdd 0002:0000041c -85:bbde 0002:0000041d -85:bbe0 0002:0000041e -85:bbe3 0002:0000041f -85:bbe5 0002:00000420 -85:bbe8 0002:00000421 -85:bbea 0002:00000422 -85:8246 0002:00000427 -85:8249 0002:00000428 -85:824b 0002:00000429 -85:82f9 0002:0000042d -b8:885c 0003:00000045 -b8:885d 0003:00000045 -b8:885e 0003:00000046 -b8:885f 0003:00000047 -b8:8863 0003:00000048 -b8:8866 0003:00000049 -b8:8867 0003:0000004a -b8:886b 0003:0000004b -b8:886e 0003:0000004c -b8:8870 0003:0000004e -b8:8873 0003:0000004f -b8:8874 0003:0000004f -b8:8878 0003:00000051 -b8:8879 0003:00000052 -b8:887a 0003:00000053 -b8:887e 0003:00000054 -b8:8880 0003:00000056 -b8:8881 0003:00000056 -b8:8882 0003:00000057 -b8:8883 0003:0000005a -b8:8884 0003:0000005a -b8:8885 0003:0000005b -b8:8886 0003:0000005c -b8:888a 0003:0000005d -84:fc56 0004:00000051 -84:fc59 0004:00000052 -84:fc5c 0004:00000053 -84:fc5d 0004:00000056 -84:fc60 0004:00000057 -84:fc63 0004:00000058 -84:fc64 0004:0000005b -84:fc67 0004:0000005c -84:fc6a 0004:0000005d -84:fd90 0004:000000d4 -84:fd94 0004:000000d5 -84:fd95 0004:000000d8 -84:fd98 0004:000000d9 -84:fd9a 0004:000000da -84:fd9c 0004:000000dd -84:fd9f 0004:000000de -84:fda1 0004:000000e5 -84:fda2 0004:000000e6 -84:fda5 0004:000000e7 -84:fda8 0004:000000e7 -84:fda9 0004:000000e8 -84:fdad 0004:000000e9 -84:fdb0 0004:000000ea -84:fdb2 0004:000000ee -84:fdb5 0004:000000ef -84:fdb6 0004:000000f0 -84:fdba 0004:000000f3 -84:fdbd 0004:000000f4 -84:fdbf 0004:000000f6 -84:fdc1 0004:000000f7 -84:fdc2 0004:000000f8 -84:fdc4 0004:000000f9 -84:fdc5 0004:000000fa -84:fdc9 0004:000000fb -84:fdca 0004:000000fc -84:fdcb 0004:000000fd -84:fdcc 0004:00000100 -84:fdcd 0004:00000101 -84:fdce 0004:00000105 -84:fdcf 0004:00000105 -84:fdd0 0004:00000105 -84:fdd1 0004:00000106 -84:fdd4 0004:00000107 -84:fdd7 0004:00000108 -84:fdd8 0004:00000109 -84:fddc 0004:0000010a -84:fddf 0004:0000010b -84:fde1 0004:0000010d -84:fde4 0004:0000010e -84:fde5 0004:0000010e -84:fde9 0004:00000110 -84:fdea 0004:00000112 -84:fdeb 0004:00000113 -84:fdec 0004:00000114 -84:fdf0 0004:00000115 -84:fdf2 0004:00000116 -84:fdf3 0004:00000117 -84:fdf4 0004:00000118 -84:fdf7 0004:00000119 -84:fdf8 0004:0000011a -84:fdf9 0004:0000011d -84:fdfa 0004:0000011e -84:fdfc 0004:0000011f -84:fdfd 0004:00000120 -84:fe01 0004:00000121 -84:fe02 0004:00000122 -84:fe03 0004:00000125 -84:fe07 0004:00000126 -84:fe0a 0004:00000129 -84:fe0e 0004:0000012a -84:fe11 0004:0000012e -84:fe14 0004:0000012e -84:fe16 0004:0000012f -84:fe19 0004:00000130 -84:fe1b 0004:00000131 -84:fe1e 0004:00000131 -84:fe20 0004:00000132 -84:fe23 0004:00000133 -84:fe25 0004:00000134 -84:fe28 0004:00000137 -84:fe29 0004:0000013b -84:fe2d 0004:0000013c -84:fe2e 0004:00000141 -84:fe2f 0004:00000142 -84:fe30 0004:00000143 -84:fe31 0004:00000143 -84:fe32 0004:00000147 -84:fe36 0004:00000148 -84:fe37 0004:00000149 -84:fe38 0004:0000014a -84:fe39 0004:0000014a -84:fe3a 0004:0000014b -84:fe3d 0004:0000014c -84:fe3e 0004:0000014d -84:fe3f 0004:0000014e -81:b303 0005:00000003 -81:b307 0005:00000004 -81:b308 0005:00000005 -b8:c81c 0005:00000016 -b8:c81f 0005:00000018 -b8:c823 0005:00000019 -b8:c827 0005:0000001a -b8:c828 0005:0000001b -b8:c829 0005:0000001c -b8:c82c 0005:0000001d -b8:c82e 0005:0000001e -b8:c831 0005:00000020 -b8:c835 0005:00000021 -b8:c839 0005:00000022 -b8:c83a 0005:00000023 -b8:c83b 0005:00000024 -b8:c83e 0005:00000025 -b8:c840 0005:00000026 -b8:c843 0005:00000028 -b8:c847 0005:00000029 -b8:c84b 0005:0000002a -b8:c84c 0005:0000002b -b8:c84d 0005:0000002c -b8:c850 0005:0000002d -b8:c852 0005:0000002e -b8:c855 0005:00000031 -b8:c856 0005:00000034 -b8:c859 0005:00000035 -b8:c85b 0005:00000036 -b8:c85e 0005:00000037 -b8:c862 0005:00000039 -b8:c866 0005:0000003a -b8:c869 0005:0000003b -b8:c86b 0005:0000003c -b8:c86f 0005:0000003e -b8:c873 0005:0000003f -b8:c876 0005:00000040 -b8:c878 0005:00000041 -b8:c87c 0005:00000043 -b8:c880 0005:00000044 +b8:846d 0003:00000137 +b8:8470 0003:00000138 +b8:8474 0003:00000139 +b8:8475 0003:00000139 +b8:8476 0003:0000013b +b8:8477 0003:0000013c +b8:847a 0003:0000013d +b8:847b 0003:00000140 +b8:847e 0003:00000141 +b8:8482 0003:00000142 +b8:8483 0003:00000142 +b8:8484 0003:00000142 +b8:8485 0003:00000142 +b8:8486 0003:00000142 +b8:8487 0003:00000143 +b8:8488 0003:00000147 +b8:8489 0003:00000147 +b8:848a 0000:00000013 +b8:848c 0003:00000149 +b8:8490 0003:0000014a +b8:8494 0003:0000014b +b8:8496 0003:0000014d +b8:8497 0003:0000014d +b8:8498 0003:0000014e +b8:8499 0003:00000156 +b8:849d 0003:00000157 +b8:849f 0003:0000015d +b8:84a1 0003:0000015e +b8:84a3 0003:00000161 +b8:84a6 0003:00000162 +b8:84a8 0003:00000163 +b8:84ab 0003:00000164 +b8:84ad 0003:00000165 +b8:84b0 0003:00000166 +b8:84b4 0003:00000167 +b8:84b6 0003:00000168 +b8:84b8 0003:00000169 +b8:84ba 0003:0000016a +b8:84bc 0003:0000016b +b8:84bd 0003:00000170 +b8:84bf 0003:00000171 +b8:84c1 0003:00000172 +b8:84c4 0003:00000173 +b8:84c6 0003:00000174 +b8:84c9 0003:00000175 +b8:84cb 0003:00000176 +b8:84ce 0003:00000177 +b8:84cf 0003:0000017a +b8:84d1 0003:0000017b +b8:84d3 0003:0000017c +b8:84d5 0003:0000017d +b8:84d7 0003:0000017e +b8:84d8 0003:00000182 +b8:84d9 0003:00000182 +b8:84da 0003:00000183 +b8:84dd 0003:00000184 +b8:84df 0003:00000185 +b8:84e2 0003:00000186 +b8:84e4 0003:00000187 +b8:84e5 0003:00000188 +b8:84e6 0003:0000018a +b8:84e9 0003:0000018b +b8:84eb 0003:0000018c +b8:84ee 0003:0000018d +b8:84ef 0003:0000018e +b8:84f2 0003:0000018f +b8:84f3 0003:0000018f +b8:84f4 0003:00000190 +b8:84f8 0003:00000191 +b8:84f9 0003:00000192 +b8:84fc 0003:00000193 +b8:8500 0003:00000194 +b8:8502 0003:00000196 +b8:8505 0003:00000197 +b8:8507 0003:00000198 +b8:850a 0003:00000199 +b8:850c 0003:0000019b +b8:8510 0003:0000019d +b8:8512 0003:0000019e +b8:8514 0003:0000019f +b8:8515 0003:0000019f +b8:8516 0003:000001a0 +b8:8517 0003:000001ab +b8:8518 0003:000001ac +b8:851c 0003:000001ad +b8:851d 0003:000001ae +b8:8521 0003:000001af +b8:8522 0003:000001b1 +b8:8526 0003:000001b2 +b8:8527 0003:000001e7 +b8:8528 0003:000001e7 +b8:8529 0003:000001ea +b8:852d 0003:000001eb +b8:8531 0003:000001ec +b8:8533 0003:000001ed +b8:8536 0003:000001f0 +b8:8538 0003:000001f0 +b8:8539 0003:000001f3 +b8:853d 0003:000001f4 +b8:853f 0003:000001f5 +b8:8543 0003:000001f6 +b8:8547 0003:000001f7 +b8:8549 0003:000001fb +b8:854b 0003:000001fc +b8:854c 0003:000001fd +b8:854f 0003:000001fe +b8:8552 0003:000001ff +b8:8554 0003:00000208 +b8:8558 0003:00000209 +b8:855b 0003:0000020a +b8:855d 0003:0000020c +b8:855f 0003:0000020d +b8:8560 0003:0000020e +b8:8563 0003:0000020f +b8:8565 0003:00000210 +b8:8566 0003:00000211 +b8:8569 0003:00000212 +b8:856a 0003:00000213 +b8:856e 0003:00000214 +b8:856f 0003:00000215 +b8:8572 0003:00000216 +b8:8574 0003:00000219 +b8:8576 0003:0000021c +b8:8578 0003:0000021d +b8:8579 0003:0000021e +b8:857c 0003:0000021f +b8:857d 0003:00000220 +b8:857e 0003:00000221 +b8:8582 0003:00000224 +b8:8586 0003:00000225 +b8:858a 0003:00000226 +b8:858c 0003:00000228 +b8:858d 0003:00000229 +b8:858e 0003:0000022a +b8:8590 0003:0000022f +b8:8591 0003:00000230 +b8:8595 0003:00000233 +b8:8599 0003:00000234 +b8:859d 0003:00000235 +b8:85a1 0003:00000236 +b8:85a2 0003:0000023a +b8:85a6 0003:0000023b +b8:85aa 0003:0000023c +b8:85ac 0003:0000023d +b8:85af 0003:0000023f +b8:85b1 0003:00000240 +b8:85b3 0003:00000241 +b8:85b6 0003:00000242 +b8:85b8 0003:00000243 +b8:85bb 0003:00000246 +b8:85bf 0003:00000247 +b8:85c0 0003:00000248 +b8:85c4 0003:0000024a +b8:85c7 0003:0000024d +b8:85c9 0003:0000024e +b8:85cb 0003:0000024f +b8:85cc 0003:0000024f +b8:85cd 0003:00000250 +b8:85ce 0003:00000258 +b8:85d1 0003:00000259 +b8:85d3 0003:0000025a +b8:85d4 0003:00000261 +b8:85d6 0003:00000262 +b8:85d7 0003:00000266 +b8:85da 0003:00000269 +b8:85de 0003:0000026a +b8:85e0 0003:0000026b +b8:85e2 0003:0000026c +b8:85e4 0003:0000026d +b8:85e6 0003:0000026f +b8:85e7 0003:00000270 +b8:85e8 0003:00000271 +b8:85eb 0003:00000272 +b8:85ec 0003:00000273 +b8:85ef 0003:00000274 +b8:85f1 0003:00000277 +b8:85f3 0003:00000278 +b8:85f4 0003:00000279 +b8:85f5 0003:0000027a +b8:85f8 0003:0000027b +b8:85f9 0003:0000027d +b8:85fd 0003:0000027e +b8:85ff 0003:0000027f +b8:8601 0003:00000280 +b8:8603 0003:00000281 +b8:8604 0003:00000282 +b8:8605 0003:00000283 +b8:8607 0003:00000284 +b8:8609 0003:00000287 +b8:860a 0003:00000288 +b8:860b 0003:00000289 +b8:860c 0003:0000028b +b8:860d 0003:0000028c +b8:860e 0003:0000028d +b8:860f 0003:0000028e +b8:8610 0003:0000028f +b8:8611 0003:00000293 +b8:8612 0003:00000293 +b8:8613 0003:00000293 +b8:8614 0003:00000294 +b8:8618 0003:00000295 +b8:861b 0003:00000295 +b8:861c 0003:00000297 +b8:8620 0003:00000298 +b8:8621 0003:00000299 +b8:8625 0003:0000029a +b8:8627 0003:0000029c +b8:862b 0003:0000029d +b8:862c 0003:0000029e +b8:862d 0003:0000029f +b8:862e 0003:000002a0 +b8:8632 0003:000002a1 +b8:8633 0003:000002a2 +b8:8634 0003:000002a5 +b8:8638 0003:000002a6 +b8:863c 0003:000002a8 +b8:8640 0003:000002a9 +b8:8642 0003:000002aa +b8:8645 0003:000002ab +b8:8647 0003:000002ad +b8:8649 0003:000002b0 +b8:864d 0003:000002b1 +b8:8650 0003:000002b2 +b8:8652 0003:000002b3 +b8:8655 0003:000002b6 +b8:8656 0003:000002b7 +b8:8657 0003:000002b8 +b8:865b 0003:000002b9 +b8:865d 0003:000002bd +b8:8661 0003:000002be +b8:8662 0003:000002bf +b8:8666 0003:000002c0 +b8:8667 0003:000002c2 +b8:866b 0003:000002c3 +b8:866d 0003:000002c8 +b8:8671 0003:000002c9 +b8:8672 0003:000002ca +b8:8676 0003:000002cb +b8:8677 0003:000002cc +b8:867a 0003:000002cd +b8:867c 0003:000002cf +b8:8680 0003:000002d1 +b8:8681 0003:000002d2 +b8:8682 0003:000002d3 +b8:8683 0003:000002d4 +b8:8687 0003:000002d5 +b8:868b 0003:000002d6 +b8:868d 0003:000002d9 +b8:868e 0003:000002d9 +b8:868f 0003:000002d9 +b8:8690 0003:000002da +b8:8691 0003:000002de +b8:8695 0003:000002df +b8:8699 0003:000002e0 +b8:869d 0003:000002e1 +b8:869f 0003:000002e2 +b8:86a3 0003:000002e3 +b8:86a6 0003:000002e4 +b8:86a8 0003:000002e5 +b8:86ac 0003:000002e6 +b8:86af 0003:000002e7 +b8:86b1 0003:000002e8 +b8:86b4 0003:000002ea +b8:86b5 0003:000002ed +b8:86b9 0003:000002ef +b8:86ba 0003:000002f0 +b8:86bb 0003:000002f1 +b8:86bc 0003:000002f2 +b8:86bd 0003:000002f3 +8b:914a 0003:000002f8 +81:80f7 0003:000002fb +81:8027 0003:000002fe +81:807f 0003:00000301 +82:8bb3 0003:00000304 +85:baa3 0003:000003a5 +85:baa4 0003:000003a5 +85:baa5 0003:000003a8 +85:baa7 0003:000003a9 +85:baad 0003:000003a9 +85:baae 0003:000003aa +85:bab1 0003:000003ab +85:bab2 0003:000003ac +85:bab3 0003:000003ac +85:bab4 0003:000003b0 +85:bab7 0003:000003b1 +85:babb 0003:000003b2 +85:babd 0003:000003b2 +85:babf 0003:000003b3 +85:bac2 0003:000003b4 +85:bac4 0003:000003b6 +85:bac5 0003:000003b7 +85:bac7 0003:000003b8 +85:bacb 0003:000003b8 +85:bacc 0003:000003b9 +85:bacf 0003:000003bb +85:bad3 0003:000003bc +85:bad6 0003:000003bd +85:bad7 0003:000003be +85:bad8 0003:000003be +85:bad9 0003:000003bf +85:badd 0003:000003c0 +85:bade 0003:000003c1 +85:bae2 0003:000003c2 +85:bae4 0003:000003c3 +85:bae5 0003:000003c4 +85:bae6 0003:000003c5 +85:bae9 0003:000003c6 +85:baeb 0003:000003c7 +85:baed 0003:000003ca +85:baee 0003:000003ca +85:baef 0003:000003cb +85:baf2 0003:000003cc +85:bb73 0003:000003da +85:bb75 0003:000003db +85:bb78 0003:000003dc +85:bb7b 0003:000003dd +85:bb7e 0003:000003e5 +85:bb7f 0003:000003e6 +85:bb81 0003:000003e7 +85:bb84 0003:000003e8 +85:bb86 0003:000003e9 +85:bb88 0003:000003ea +85:bb8b 0003:000003eb +85:bb8d 0003:000003ec +85:bb90 0003:000003ed +85:bb92 0003:000003ee +85:bb95 0003:000003ef +85:bb97 0003:000003f2 +85:bb98 0003:000003f3 +85:bb99 0003:000003f4 +85:bb9a 0003:000003f5 +85:bb9c 0003:000003f6 +85:bb9d 0003:000003f7 +85:bb9e 0003:000003f8 +85:bb9f 0003:000003ff +85:bba2 0003:00000400 +85:bba3 0003:00000401 +85:bba6 0003:00000402 +85:bba7 0003:00000403 +85:bba8 0003:00000404 +85:bba9 0003:00000405 +85:bbaa 0003:00000410 +85:bbab 0003:00000411 +85:bbad 0003:00000412 +85:bbb0 0003:00000413 +85:bbb2 0003:00000414 +85:bbb5 0003:00000415 +85:bbb7 0003:00000416 +85:bbba 0003:00000417 +85:bbbc 0003:0000041a +85:bbbd 0003:0000041b +85:bbbe 0003:0000041c +85:bbc0 0003:0000041d +85:bbc1 0003:0000041f +85:bbc2 0003:00000420 +85:bbc4 0003:00000421 +85:bbc7 0003:00000422 +85:bbc9 0003:00000423 +85:bbcc 0003:00000424 +85:bbce 0003:00000425 +85:bbcf 0003:00000427 +85:bbd0 0003:00000428 +85:bbd2 0003:00000429 +85:bbd5 0003:0000042a +85:bbd7 0003:0000042b +85:bbda 0003:0000042c +85:bbdc 0003:0000042d +85:bbdd 0003:0000042f +85:bbde 0003:00000430 +85:bbe0 0003:00000431 +85:bbe3 0003:00000432 +85:bbe5 0003:00000433 +85:bbe8 0003:00000434 +85:bbea 0003:00000435 +85:8246 0003:0000043a +85:8249 0003:0000043b +85:824b 0003:0000043c +85:82f9 0003:00000440 +b8:885c 0004:00000045 +b8:885d 0004:00000045 +b8:885e 0004:00000046 +b8:885f 0004:00000047 +b8:8863 0004:00000048 +b8:8866 0004:00000049 +b8:8867 0004:0000004a +b8:886b 0004:0000004b +b8:886e 0004:0000004c +b8:8870 0004:0000004e +b8:8873 0004:0000004f +b8:8874 0004:0000004f +b8:8878 0004:00000051 +b8:8879 0004:00000052 +b8:887a 0004:00000053 +b8:887e 0004:00000054 +b8:8880 0004:00000056 +b8:8881 0004:00000056 +b8:8882 0004:00000057 +b8:8883 0004:0000005a +b8:8884 0004:0000005a +b8:8885 0004:0000005b +b8:8886 0004:0000005c +b8:888a 0004:0000005d +84:fc56 0005:00000051 +84:fc59 0005:00000052 +84:fc5c 0005:00000053 +84:fc5d 0005:00000056 +84:fc60 0005:00000057 +84:fc63 0005:00000058 +84:fc64 0005:0000005b +84:fc67 0005:0000005c +84:fc6a 0005:0000005d +84:fd90 0005:000000d4 +84:fd94 0005:000000d5 +84:fd95 0005:000000d8 +84:fd98 0005:000000d9 +84:fd9a 0005:000000da +84:fd9c 0005:000000dd +84:fd9f 0005:000000de +84:fda1 0005:000000e5 +84:fda2 0005:000000e6 +84:fda5 0005:000000e7 +84:fda8 0005:000000e7 +84:fda9 0005:000000e8 +84:fdad 0005:000000e9 +84:fdb0 0005:000000ea +84:fdb2 0005:000000ee +84:fdb5 0005:000000ef +84:fdb6 0005:000000f0 +84:fdba 0005:000000f3 +84:fdbd 0005:000000f4 +84:fdbf 0005:000000f6 +84:fdc1 0005:000000f7 +84:fdc2 0005:000000f8 +84:fdc4 0005:000000f9 +84:fdc5 0005:000000fa +84:fdc9 0005:000000fb +84:fdca 0005:000000fc +84:fdcb 0005:000000fd +84:fdcc 0005:00000100 +84:fdcd 0005:00000101 +84:fdce 0005:00000105 +84:fdcf 0005:00000105 +84:fdd0 0005:00000105 +84:fdd1 0005:00000106 +84:fdd4 0005:00000107 +84:fdd7 0005:00000108 +84:fdd8 0005:00000109 +84:fddc 0005:0000010a +84:fddf 0005:0000010b +84:fde1 0005:0000010d +84:fde4 0005:0000010e +84:fde5 0005:0000010e +84:fde9 0005:00000110 +84:fdea 0005:00000112 +84:fdeb 0005:00000113 +84:fdec 0005:00000114 +84:fdf0 0005:00000115 +84:fdf2 0005:00000116 +84:fdf3 0005:00000117 +84:fdf4 0005:00000118 +84:fdf7 0005:00000119 +84:fdf8 0005:0000011a +84:fdf9 0005:0000011d +84:fdfa 0005:0000011e +84:fdfc 0005:0000011f +84:fdfd 0005:00000120 +84:fe01 0005:00000121 +84:fe02 0005:00000122 +84:fe03 0005:00000125 +84:fe07 0005:00000126 +84:fe0a 0005:00000129 +84:fe0e 0005:0000012a +84:fe11 0005:0000012e +84:fe14 0005:0000012e +84:fe16 0005:0000012f +84:fe19 0005:00000130 +84:fe1b 0005:00000131 +84:fe1e 0005:00000131 +84:fe20 0005:00000132 +84:fe23 0005:00000133 +84:fe25 0005:00000134 +84:fe28 0005:00000137 +84:fe29 0005:0000013b +84:fe2d 0005:0000013c +84:fe2e 0005:00000141 +84:fe2f 0005:00000142 +84:fe30 0005:00000143 +84:fe31 0005:00000143 +84:fe32 0005:00000147 +84:fe36 0005:00000148 +84:fe37 0005:00000149 +84:fe38 0005:0000014a +84:fe39 0005:0000014a +84:fe3a 0005:0000014b +84:fe3d 0005:0000014c +84:fe3e 0005:0000014d +84:fe3f 0005:0000014e +81:b303 0006:00000003 +81:b307 0006:00000004 +81:b308 0006:00000005 +b8:c81c 0006:00000016 +b8:c81f 0006:00000018 +b8:c823 0006:00000019 +b8:c827 0006:0000001a +b8:c828 0006:0000001b +b8:c829 0006:0000001c +b8:c82c 0006:0000001d +b8:c82e 0006:0000001e +b8:c831 0006:00000020 +b8:c835 0006:00000021 +b8:c839 0006:00000022 +b8:c83a 0006:00000023 +b8:c83b 0006:00000024 +b8:c83e 0006:00000025 +b8:c840 0006:00000026 +b8:c843 0006:00000028 +b8:c847 0006:00000029 +b8:c84b 0006:0000002a +b8:c84c 0006:0000002b +b8:c84d 0006:0000002c +b8:c850 0006:0000002d +b8:c852 0006:0000002e +b8:c855 0006:00000031 +b8:c856 0006:00000034 +b8:c859 0006:00000035 +b8:c85b 0006:00000036 +b8:c85e 0006:00000037 +b8:c862 0006:00000039 +b8:c866 0006:0000003a +b8:c869 0006:0000003b +b8:c86b 0006:0000003c +b8:c86f 0006:0000003e +b8:c873 0006:0000003f +b8:c876 0006:00000040 +b8:c878 0006:00000041 +b8:c87c 0006:00000043 +b8:c880 0006:00000044 diff --git a/worlds/sm/data/SMBasepatch_prebuilt/sm-basepatch-symbols.json b/worlds/sm/data/SMBasepatch_prebuilt/sm-basepatch-symbols.json index c5d7c1b4..351a5485 100644 --- a/worlds/sm/data/SMBasepatch_prebuilt/sm-basepatch-symbols.json +++ b/worlds/sm/data/SMBasepatch_prebuilt/sm-basepatch-symbols.json @@ -4,7 +4,7 @@ "CLIPLEN_end": "85:990F", "CLIPLEN_no_multi": "85:990C", "CLIPSET": "85:FF1D", - "COLLECTTANK": "B8:8503", + "COLLECTTANK": "B8:8517", "MISCFX": "85:FF45", "NORMAL": "84:8BF2", "SETFX": "85:FF4E", @@ -12,15 +12,17 @@ "SOUNDFX_84": "84:FD90", "SPECIALFX": "85:FF3C", "ammo_loop_table": "84:FC46", - "ap_playerid_to_rom_other_player_index": "B8:85BA", - "ap_playerid_to_rom_other_player_index_checklastrow": "B8:85DD", - "ap_playerid_to_rom_other_player_index_correctindex": "B8:85F8", - "ap_playerid_to_rom_other_player_index_do_search_stage_1": "B8:85C0", - "ap_playerid_to_rom_other_player_index_notfound": "B8:85F5", + "ap_playerid_to_rom_other_player_index": "B8:85CE", + "ap_playerid_to_rom_other_player_index_checklastrow": "B8:85F1", + "ap_playerid_to_rom_other_player_index_correctindex": "B8:860C", + "ap_playerid_to_rom_other_player_index_do_search_stage_1": "B8:85D4", + "ap_playerid_to_rom_other_player_index_notfound": "B8:8609", "archipelago_chozo_item_plm": "84:FC24", "archipelago_hidden_item_plm": "84:FC28", "archipelago_visible_item_plm": "84:FC20", "c_item": "84:FC42", + "check_reload": "82:F990", + "check_reload_end": "82:F9C0", "config_deathlink": "CE:FF04", "config_flags": "CE:FF00", "config_multiworld": "CE:FF00", @@ -32,6 +34,8 @@ "copy_memory_done": "B8:8417", "copy_memory_even": "B8:8409", "copy_memory_loop": "B8:840F", + "deathhook": "82:F9C3", + "deathhook_zebes": "82:F9D8", "h_item": "84:FC44", "i_chozo_item": "84:FC5D", "i_hidden_item": "84:FC64", @@ -40,13 +44,13 @@ "i_item_setup_shared_all_items": "B8:8878", "i_item_setup_shared_alwaysloaded": "B8:8883", "i_live_pickup": "84:FE29", - "i_live_pickup_multiworld": "B8:85FD", - "i_live_pickup_multiworld_end": "B8:8679", - "i_live_pickup_multiworld_item_link_item": "B8:8659", - "i_live_pickup_multiworld_otherplayers_item": "B8:8649", - "i_live_pickup_multiworld_own_item": "B8:8635", - "i_live_pickup_multiworld_own_item1": "B8:8641", - "i_live_pickup_multiworld_send_network": "B8:8620", + "i_live_pickup_multiworld": "B8:8611", + "i_live_pickup_multiworld_end": "B8:868D", + "i_live_pickup_multiworld_item_link_item": "B8:866D", + "i_live_pickup_multiworld_otherplayers_item": "B8:865D", + "i_live_pickup_multiworld_own_item": "B8:8649", + "i_live_pickup_multiworld_own_item1": "B8:8655", + "i_live_pickup_multiworld_send_network": "B8:8634", "i_load_custom_graphics": "84:FDCE", "i_load_custom_graphics_all_items": "84:FDE9", "i_load_custom_graphics_alwaysloaded": "84:FDF9", @@ -82,30 +86,30 @@ "message_write_placeholders": "85:BAA3", "message_write_placeholders_adjust": "85:BAA5", "message_write_placeholders_end": "85:BAED", - "mw_cleanup_item_link_messagebox": "B8:84BB", - "mw_display_item_sent": "B8:848B", - "mw_handle_queue": "B8:8513", - "mw_handle_queue_collect_item_if_present": "B8:8562", - "mw_handle_queue_end": "B8:85B3", - "mw_handle_queue_found": "B8:859B", - "mw_handle_queue_lookup_player": "B8:8522", - "mw_handle_queue_loop": "B8:8515", - "mw_handle_queue_new_remote_item": "B8:857C", - "mw_handle_queue_next": "B8:85A7", - "mw_handle_queue_perform_receive": "B8:858E", - "mw_hook_main_game": "B8:867D", + "mw_cleanup_item_link_messagebox": "B8:84CF", + "mw_display_item_sent": "B8:849F", + "mw_handle_queue": "B8:8527", + "mw_handle_queue_collect_item_if_present": "B8:8576", + "mw_handle_queue_end": "B8:85C7", + "mw_handle_queue_found": "B8:85AF", + "mw_handle_queue_lookup_player": "B8:8536", + "mw_handle_queue_loop": "B8:8529", + "mw_handle_queue_new_remote_item": "B8:8590", + "mw_handle_queue_next": "B8:85BB", + "mw_handle_queue_perform_receive": "B8:85A2", + "mw_hook_main_game": "B8:8691", "mw_init": "B8:8311", "mw_init_continuereset": "B8:8366", "mw_init_end": "B8:83EA", "mw_init_memory": "B8:8300", "mw_init_reset_sram": "B8:833B", "mw_init_smstringdata": "B8:8351", - "mw_load_sram": "B8:8474", - "mw_load_sram_done": "B8:8482", - "mw_load_sram_setnewgame": "B8:8485", - "mw_prep_item_link_messagebox": "B8:84A9", - "mw_receive_item": "B8:84C4", - "mw_receive_item_end": "B8:84FC", + "mw_load_sram": "B8:8488", + "mw_load_sram_done": "B8:8496", + "mw_load_sram_setnewgame": "B8:8499", + "mw_prep_item_link_messagebox": "B8:84BD", + "mw_receive_item": "B8:84D8", + "mw_receive_item_end": "B8:8510", "mw_save_sram": "B8:8469", "mw_write_message": "B8:8442", "nonprog_item_eight_palette_indices": "84:FC38", @@ -132,7 +136,7 @@ "p_visible_item_end": "84:FD1E", "p_visible_item_loop": "84:FD0B", "p_visible_item_trigger": "84:FD17", - "patch_load_multiworld": "B8:8694", + "patch_load_multiworld": "B8:86B5", "perform_item_pickup": "84:FE2E", "plm_graphics_entry_offworld_item": "84:FC36", "plm_graphics_entry_offworld_progression_item": "84:FC2C", @@ -143,8 +147,21 @@ "rando_player_id_table_end": "B8:DE34", "rando_player_name_table": "B8:D000", "rando_seed_data": "B8:CF00", + "setup_game_1": "A0:FE0C", + "setup_game_1_quick": "A0:FE1F", + "setup_game_2": "A0:FE2F", + "setup_game_2_quick": "A0:FE40", + "setup_game_3": "A0:FE44", + "setup_game_3_loadmusic": "A0:FE73", + "setup_game_3_quick": "A0:FE57", + "setup_music": "A0:FE00", + "setup_music_quick": "A0:FE0B", + "setup_samus": "A0:FE94", + "setup_samus_normal": "A0:FEA5", + "sm_fix_checksum": "82:FA0C", "sm_item_graphics": "B8:8800", "sm_item_plm_pickup_sequence_pointers": "B8:882E", + "sm_save_done_hook": "B8:847B", "start_item": "B8:C81C", "start_item_data_major": "B8:C800", "start_item_data_minor": "B8:C808", @@ -153,6 +170,12 @@ "v_item": "84:FC40", "write_repeated_memory": "B8:83EF", "write_repeated_memory_loop": "B8:83F4", + "deathhook82": "82:DDC7", + "freespace82_start": "82:F990", + "freespace82_end": "82:FA4A", + "freespacea0": "a0:fe00", + "SRAM_SAVING": "70:2604", + "current_save_slot": "7e:0952", "ITEM_RAM": "7E:09A2", "SRAM_MW_ITEMS_RECV": "70:2000", "SRAM_MW_ITEMS_RECV_WCOUNT": "70:2602", diff --git a/worlds/sm/docs/en_Super Metroid.md b/worlds/sm/docs/en_Super Metroid.md index 941cbf48..c177582e 100644 --- a/worlds/sm/docs/en_Super Metroid.md +++ b/worlds/sm/docs/en_Super Metroid.md @@ -30,3 +30,9 @@ a small up arrow on the sprite and non-progression don't. When the player receives an item, a text box will appear to show which item was received, and from whom. +## I can't get back to my starting position with a required item (softlocked), what can I do? + +It can happen that a required item is in a place where you cant get back from. While in normal gameplay state, by holding +Start+Select+L+R at the same time, the game will save your progress and put you back at your original starting position. +This can be required by the logic. + diff --git a/worlds/sm/variaRandomizer/logic/smboolmanager.py b/worlds/sm/variaRandomizer/logic/smboolmanager.py index 351e2835..16f90307 100644 --- a/worlds/sm/variaRandomizer/logic/smboolmanager.py +++ b/worlds/sm/variaRandomizer/logic/smboolmanager.py @@ -15,7 +15,7 @@ class SMBoolManager(object): countItems = ['Missile', 'Super', 'PowerBomb', 'ETank', 'Reserve'] percentItems = ['Bomb', 'Charge', 'Ice', 'HiJump', 'SpeedBooster', 'Wave', 'Spazer', 'SpringBall', 'Varia', 'Plasma', 'Grapple', 'Morph', 'Gravity', 'XRayScope', 'SpaceJump', 'ScrewAttack'] - def __init__(self, player=0, maxDiff=sys.maxsize, onlyBossLeft = False, lastAP = 'Landing Site'): + def __init__(self, player=0, maxDiff=sys.maxsize, onlyBossLeft = False): self._items = { } self._counts = { } @@ -23,8 +23,6 @@ class SMBoolManager(object): self.maxDiff = maxDiff self.onlyBossLeft = onlyBossLeft - self.lastAP = lastAP - # cache related #self.cacheKey = 0 #self.computeItemsPositions() @@ -32,7 +30,7 @@ class SMBoolManager(object): Logic.factory('vanilla') self.helpers = Logic.HelpersGraph(self) self.doorsManager = DoorsManager() - self.objectives = Objectives.objDict[player] + self.objectives = Objectives.objDict[player] if player in Objectives.objDict.keys() else Objectives(player) self.createFacadeFunctions() self.createKnowsFunctions(player) self.resetItems() diff --git a/worlds/sm/variaRandomizer/patches/common/ips/draygonimals.ips b/worlds/sm/variaRandomizer/patches/common/ips/draygonimals.ips index aefedb69..5758c274 100644 Binary files a/worlds/sm/variaRandomizer/patches/common/ips/draygonimals.ips and b/worlds/sm/variaRandomizer/patches/common/ips/draygonimals.ips differ diff --git a/worlds/sm/variaRandomizer/patches/common/ips/metalimals.ips b/worlds/sm/variaRandomizer/patches/common/ips/metalimals.ips index 6e2a181e..10fc440f 100644 Binary files a/worlds/sm/variaRandomizer/patches/common/ips/metalimals.ips and b/worlds/sm/variaRandomizer/patches/common/ips/metalimals.ips differ diff --git a/worlds/sm/variaRandomizer/patches/common/ips/phantoonimals.ips b/worlds/sm/variaRandomizer/patches/common/ips/phantoonimals.ips index b20bdf0f..518fcb9c 100644 Binary files a/worlds/sm/variaRandomizer/patches/common/ips/phantoonimals.ips and b/worlds/sm/variaRandomizer/patches/common/ips/phantoonimals.ips differ diff --git a/worlds/sm/variaRandomizer/patches/common/ips/ridleyimals.ips b/worlds/sm/variaRandomizer/patches/common/ips/ridleyimals.ips index db2cfe6e..ef78b81f 100644 Binary files a/worlds/sm/variaRandomizer/patches/common/ips/ridleyimals.ips and b/worlds/sm/variaRandomizer/patches/common/ips/ridleyimals.ips differ diff --git a/worlds/sm/variaRandomizer/rando/RandoExec.py b/worlds/sm/variaRandomizer/rando/RandoExec.py index 8dbb5ae4..f799252f 100644 --- a/worlds/sm/variaRandomizer/rando/RandoExec.py +++ b/worlds/sm/variaRandomizer/rando/RandoExec.py @@ -46,7 +46,7 @@ class RandoExec(object): DoorsManager.randomize(self.graphSettings.allowGreyDoors, self.player) self.areaGraph = self.graphBuilder.createGraph(self.randoSettings.maxDiff) services = RandoServices(self.areaGraph, self.restrictions) - setup = RandoSetup(self.graphSettings, Logic.locations, services, self.player) + setup = RandoSetup(self.graphSettings, Logic.locations[:], services, self.player) self.setup = setup container = setup.createItemLocContainer(endDate, vcr) if container is None: @@ -66,6 +66,7 @@ class RandoExec(object): self.errorMsg += '; '.join(setup.errorMsgs) if self.errorMsg == "": self.errorMsg += "Unable to process settings; " + raise Exception(self.errorMsg) self.areaGraph.printGraph() return container diff --git a/worlds/sm/variaRandomizer/randomizer.py b/worlds/sm/variaRandomizer/randomizer.py index 924b4c5d..dab07859 100644 --- a/worlds/sm/variaRandomizer/randomizer.py +++ b/worlds/sm/variaRandomizer/randomizer.py @@ -620,16 +620,13 @@ class VariaRandomizer: self.objectivesManager.setScavengerHunt() addedObjectives = 1 + if not args.objective: + args.objective = ["nothing"] + if args.objective: - try: - nbObjectives = int(args.objective[0]) - except: - nbObjectives = 0 if "random" in args.objective else None - if nbObjectives is not None: - availableObjectives = args.objectiveList.split(',') if args.objectiveList is not None else objectives - if nbObjectives == 0: - nbObjectives = random.randint(1, min(Objectives.maxActiveGoals, len(availableObjectives))) - self.objectivesManager.setRandom(nbObjectives, availableObjectives) + if (args.objectiveRandom): + availableObjectives = [goal for goal in objectives if goal != "collect 100% items"] if "random" in args.objectiveList else args.objectiveList + self.objectivesManager.setRandom(args.nbObjective, availableObjectives) else: maxActiveGoals = Objectives.maxActiveGoals - addedObjectives if len(args.objective) > maxActiveGoals: diff --git a/worlds/sm/variaRandomizer/rom/rompatcher.py b/worlds/sm/variaRandomizer/rom/rompatcher.py index 5e821da1..913d0d8d 100644 --- a/worlds/sm/variaRandomizer/rom/rompatcher.py +++ b/worlds/sm/variaRandomizer/rom/rompatcher.py @@ -1065,7 +1065,7 @@ class RomPatcher: objectives.writeIntroObjectives(self.romFile, tourian) self.writeItemsMasks(itemLocs) # hack bomb_torizo.ips to wake BT in all cases if necessary, ie chozo bots objective is on, and nothing at bombs - if objectives.isGoalActive("activate chozo robots") and RomPatches.has(RomPatches.BombTorizoWake): + if objectives.isGoalActive("activate chozo robots") and RomPatches.has(self.player, RomPatches.BombTorizoWake): bomb = next((il for il in itemLocs if il.Location.Name == "Bomb"), None) if bomb is not None and bomb.Item.Category == "Nothing": for addrName in ["BTtweaksHack1", "BTtweaksHack2"]: diff --git a/worlds/sm/variaRandomizer/utils/utils.py b/worlds/sm/variaRandomizer/utils/utils.py index 094a3a9c..01029f2f 100644 --- a/worlds/sm/variaRandomizer/utils/utils.py +++ b/worlds/sm/variaRandomizer/utils/utils.py @@ -417,7 +417,10 @@ def loadRandoPreset(world, player, args): args.powerBombQty = world.power_bomb_qty[player].value / float(10) args.minorQty = world.minor_qty[player].value args.energyQty = defaultMultiValues["energyQty"][world.energy_qty[player].value] - args.objective = world.objective[player].value + args.objectiveRandom = world.custom_objective[player].value + args.objectiveList = list(world.custom_objective_list[player].value) + args.nbObjective = world.custom_objective_count[player].value + args.objective = list(world.objective[player].value) args.tourian = defaultMultiValues["tourian"][world.tourian[player].value] #args.minimizerN #args.minimizerTourian