From 3f5492b2bb67326be43cd7c5ba02ccf0ba1ae0e3 Mon Sep 17 00:00:00 2001 From: Justin Wernick Date: Tue, 19 Apr 2022 21:27:56 +0200 Subject: Refile for merging repos --- 2019-worms/src/bin/benchmark.rs | 22 + 2019-worms/src/bin/explore-config.rs | 116 + 2019-worms/src/command.rs | 73 + 2019-worms/src/constants.rs | 218 ++ 2019-worms/src/constants/lava.rs | 6225 ++++++++++++++++++++++++++++++++++ 2019-worms/src/game.rs | 779 +++++ 2019-worms/src/game/map.rs | 49 + 2019-worms/src/game/player.rs | 259 ++ 2019-worms/src/game/powerup.rs | 6 + 2019-worms/src/geometry.rs | 6 + 2019-worms/src/geometry/direction.rs | 67 + 2019-worms/src/geometry/point.rs | 37 + 2019-worms/src/geometry/vec.rs | 62 + 2019-worms/src/json.rs | 554 +++ 2019-worms/src/lib.rs | 8 + 2019-worms/src/main.rs | 46 + 2019-worms/src/strategy.rs | 5 + 2019-worms/src/strategy/minimax.rs | 330 ++ 18 files changed, 8862 insertions(+) create mode 100644 2019-worms/src/bin/benchmark.rs create mode 100644 2019-worms/src/bin/explore-config.rs create mode 100644 2019-worms/src/command.rs create mode 100644 2019-worms/src/constants.rs create mode 100644 2019-worms/src/constants/lava.rs create mode 100644 2019-worms/src/game.rs create mode 100644 2019-worms/src/game/map.rs create mode 100644 2019-worms/src/game/player.rs create mode 100644 2019-worms/src/game/powerup.rs create mode 100644 2019-worms/src/geometry.rs create mode 100644 2019-worms/src/geometry/direction.rs create mode 100644 2019-worms/src/geometry/point.rs create mode 100644 2019-worms/src/geometry/vec.rs create mode 100644 2019-worms/src/json.rs create mode 100644 2019-worms/src/lib.rs create mode 100644 2019-worms/src/main.rs create mode 100644 2019-worms/src/strategy.rs create mode 100644 2019-worms/src/strategy/minimax.rs (limited to '2019-worms/src') diff --git a/2019-worms/src/bin/benchmark.rs b/2019-worms/src/bin/benchmark.rs new file mode 100644 index 0000000..84e869e --- /dev/null +++ b/2019-worms/src/bin/benchmark.rs @@ -0,0 +1,22 @@ +use std::path::Path; + +use time::{Duration, PreciseTime}; + +use steam_powered_wyrm::game; +use steam_powered_wyrm::json; +use steam_powered_wyrm::strategy::{choose_move, ScoreConfig}; + +fn main() { + let max_time = Duration::milliseconds(19950); + let start_time = PreciseTime::now(); + + match json::read_state_from_json_file(&Path::new(&format!("./tests/example-state.json"))) { + Ok(json_state) => { + let new_board = game::GameBoard::new(json_state); + let _ = choose_move(&new_board, &ScoreConfig::default(), start_time, max_time); + } + Err(e) => { + eprintln!("WARN: State file could not be parsed: {}", e); + } + }; +} diff --git a/2019-worms/src/bin/explore-config.rs b/2019-worms/src/bin/explore-config.rs new file mode 100644 index 0000000..5fb599a --- /dev/null +++ b/2019-worms/src/bin/explore-config.rs @@ -0,0 +1,116 @@ +use std::path::Path; + +use rayon::prelude::*; + +use steam_powered_wyrm::game; +use steam_powered_wyrm::json; +use steam_powered_wyrm::strategy::{choose_move_with_normalized_perf, ScoreConfig}; + +fn main() { + let initial_state = game::GameBoard::new( + json::read_state_from_json_file(&Path::new(&format!("./tests/example-state.json"))) + .unwrap(), + ); + let depth = 1000; + + let configs = ScoreConfigTrials { + max_health_weight: vec![50., 150.], + total_health_weight: vec![5., 20.], + points_weight: vec![1.], + victory_weight: vec![3000., 3500., 4000., 4500., 5000., 5500., 6000., 7000.], + snowball_weight: vec![10.], + bomb_weight: vec![0.], + explore_exploit_weight: vec![10., 500.], + } + .reify(); + + eprintln!("{} configs being tested", configs.len()); + + let mut victories = vec![0; configs.len()]; + + for i in 0..configs.len() { + eprintln!("Progress: {} of {}", i, configs.len()); + + let outcomes: Vec<(usize, game::SimulationOutcome)> = (i + 1..configs.len()) + .collect::>() + .par_iter() + .map(|j| { + let mut state = initial_state.clone(); + + while state.outcome == game::SimulationOutcome::Continue { + let commands = [ + choose_move_with_normalized_perf(&state, &configs[i], 0, depth), + choose_move_with_normalized_perf(&state, &configs[*j], 1, depth), + ]; + state.simulate(commands); + } + + (*j, state.outcome) + }) + .collect(); + for (j, outcome) in outcomes { + match outcome { + game::SimulationOutcome::PlayerWon(0) => victories[i] += 1, + game::SimulationOutcome::PlayerWon(1) => victories[j] += 1, + _ => {} + }; + } + } + + println!("victories, max_health_weight, total_health_weight, points_weight, victory_weight, snowball_weight, bomb_weight, explore_exploit_weight"); + + for (config, victories) in configs.into_iter().zip(victories.iter()) { + println!( + "{}, {}, {}, {}, {}, {}, {}, {}", + victories, + config.max_health_weight, + config.total_health_weight, + config.points_weight, + config.victory_weight, + config.snowball_weight, + config.bomb_weight, + config.explore_exploit_weight + ); + } +} + +pub struct ScoreConfigTrials { + pub max_health_weight: Vec, + pub total_health_weight: Vec, + pub points_weight: Vec, + pub victory_weight: Vec, + pub snowball_weight: Vec, + pub bomb_weight: Vec, + pub explore_exploit_weight: Vec, +} + +impl ScoreConfigTrials { + fn reify(self) -> Vec { + let mut result = Vec::new(); + for max_health_weight in &self.max_health_weight { + for total_health_weight in &self.total_health_weight { + for points_weight in &self.points_weight { + for victory_weight in &self.victory_weight { + for snowball_weight in &self.snowball_weight { + for bomb_weight in &self.bomb_weight { + for explore_exploit_weight in &self.explore_exploit_weight { + result.push(ScoreConfig { + max_health_weight: *max_health_weight, + total_health_weight: *total_health_weight, + points_weight: *points_weight, + victory_weight: *victory_weight, + snowball_weight: *snowball_weight, + bomb_weight: *bomb_weight, + explore_exploit_weight: *explore_exploit_weight, + }); + } + } + } + } + } + } + } + + result + } +} diff --git a/2019-worms/src/command.rs b/2019-worms/src/command.rs new file mode 100644 index 0000000..c6d6695 --- /dev/null +++ b/2019-worms/src/command.rs @@ -0,0 +1,73 @@ +use crate::geometry::Direction; +use crate::geometry::Point2d; +use std::fmt; + +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub struct Command { + pub worm: Option, + pub action: Action, +} + +impl fmt::Display for Command { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self.worm { + Some(worm) => write!(f, "select {};{}", worm, self.action), + None => write!(f, "{}", self.action), + } + } +} + +impl Command { + pub fn with_select(worm: i32, action: Action) -> Command { + Command { + worm: Some(worm), + action, + } + } + + pub fn new(action: Action) -> Command { + Command { worm: None, action } + } +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub enum Action { + Move(Point2d), + Dig(Point2d), + Shoot(Direction), + Bomb(Point2d), + Snowball(Point2d), + DoNothing, +} + +impl fmt::Display for Action { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + use Action::*; + match self { + Move(p) => write!(f, "move {} {}", p.x, p.y), + Dig(p) => write!(f, "dig {} {}", p.x, p.y), + Shoot(dir) => write!(f, "shoot {}", dir), + Bomb(p) => write!(f, "banana {} {}", p.x, p.y), + Snowball(p) => write!(f, "snowball {} {}", p.x, p.y), + DoNothing => write!(f, "nothing"), + } + } +} + +impl Action { + pub fn is_attack(&self) -> bool { + use Action::*; + match self { + Shoot(_) | Bomb(_) => true, + _ => false, + } + } + + pub fn is_snowball(&self) -> bool { + use Action::*; + match self { + Snowball(_) => true, + _ => false, + } + } +} diff --git a/2019-worms/src/constants.rs b/2019-worms/src/constants.rs new file mode 100644 index 0000000..3f36db4 --- /dev/null +++ b/2019-worms/src/constants.rs @@ -0,0 +1,218 @@ +use crate::geometry::Vec2d; + +pub mod lava; +pub use self::lava::*; + +pub const MAP_SIZE: usize = 33; +pub const MAP_ROW_SIZE: [MapRow; MAP_SIZE] = [ + MapRow { + start_bit: 0, + x_offset: 11, + }, + MapRow { + start_bit: 11, + x_offset: 8, + }, + MapRow { + start_bit: 28, + x_offset: 7, + }, + MapRow { + start_bit: 47, + x_offset: 6, + }, + MapRow { + start_bit: 68, + x_offset: 4, + }, + MapRow { + start_bit: 93, + x_offset: 4, + }, + MapRow { + start_bit: 118, + x_offset: 3, + }, + MapRow { + start_bit: 145, + x_offset: 2, + }, + MapRow { + start_bit: 174, + x_offset: 1, + }, + MapRow { + start_bit: 205, + x_offset: 1, + }, + MapRow { + start_bit: 236, + x_offset: 1, + }, + MapRow { + start_bit: 267, + x_offset: 0, + }, + MapRow { + start_bit: 300, + x_offset: 0, + }, + MapRow { + start_bit: 333, + x_offset: 0, + }, + MapRow { + start_bit: 366, + x_offset: 0, + }, + MapRow { + start_bit: 399, + x_offset: 0, + }, + MapRow { + start_bit: 432, + x_offset: 0, + }, + MapRow { + start_bit: 465, + x_offset: 0, + }, + MapRow { + start_bit: 498, + x_offset: 0, + }, + MapRow { + start_bit: 531, + x_offset: 0, + }, + MapRow { + start_bit: 564, + x_offset: 0, + }, + MapRow { + start_bit: 597, + x_offset: 0, + }, + MapRow { + start_bit: 630, + x_offset: 1, + }, + MapRow { + start_bit: 661, + x_offset: 1, + }, + MapRow { + start_bit: 692, + x_offset: 1, + }, + MapRow { + start_bit: 723, + x_offset: 2, + }, + MapRow { + start_bit: 752, + x_offset: 3, + }, + MapRow { + start_bit: 779, + x_offset: 4, + }, + MapRow { + start_bit: 804, + x_offset: 4, + }, + MapRow { + start_bit: 829, + x_offset: 6, + }, + MapRow { + start_bit: 850, + x_offset: 7, + }, + MapRow { + start_bit: 869, + x_offset: 8, + }, + MapRow { + start_bit: 886, + x_offset: 11, + }, +]; +pub const MAP_BITSIZE: usize = 897; +pub const MAP_U64S: usize = 15; + +pub struct MapRow { + pub start_bit: usize, + pub x_offset: usize, +} + +impl MapRow { + pub fn len(&self) -> usize { + MAP_SIZE - 2 * self.x_offset + } + + pub fn is_empty(&self) -> bool { + self.len() == 0 + } +} + +pub const HEALTH_PACK_VALUE: i32 = 10; + +pub const SHOOT_RANGE: i8 = 4; +pub const SHOOT_RANGE_DIAGONAL: i8 = 3; +pub const SHOOT_DAMAGE: i32 = 8; + +pub const BOMB_RANGE: i8 = 5; +pub const BOMB_DAMAGED_SPACES: usize = 13; +pub const BOMB_DAMAGE_RANGE: i8 = 2; +pub const BOMB_DAMAGES: [(Vec2d, i32); BOMB_DAMAGED_SPACES] = [ + (Vec2d::new(0, -2), 7), + (Vec2d::new(2, 0), 7), + (Vec2d::new(0, 2), 7), + (Vec2d::new(-2, 0), 7), + (Vec2d::new(1, -1), 11), + (Vec2d::new(1, 1), 11), + (Vec2d::new(-1, 1), 11), + (Vec2d::new(-1, -1), 11), + (Vec2d::new(0, -1), 13), + (Vec2d::new(1, 0), 13), + (Vec2d::new(0, 1), 13), + (Vec2d::new(-1, 0), 13), + (Vec2d::new(0, 0), 20), +]; + +pub const SNOWBALL_RANGE: i8 = 5; +pub const SNOWBALL_FREEZES_SPACES: usize = 9; +pub const SNOWBALL_FREEZE_RANGE: i8 = 1; +pub const SNOWBALL_FREEZES: [Vec2d; SNOWBALL_FREEZES_SPACES] = [ + Vec2d::new(-1, -1), + Vec2d::new(0, -1), + Vec2d::new(1, -1), + Vec2d::new(-1, 0), + Vec2d::new(0, 0), + Vec2d::new(1, 0), + Vec2d::new(-1, 1), + Vec2d::new(0, 1), + Vec2d::new(1, 1), +]; + +pub const MISSED_ATTACK_SCORE: i32 = 2; +pub const ATTACK_SCORE_MULTIPLIER: i32 = 2; +pub const KILL_SCORE: i32 = 40; +pub const DIG_SCORE: i32 = 7; +pub const MOVE_SCORE: i32 = 5; +pub const INVALID_COMMAND_SCORE_PENALTY: i32 = 4; + +pub const STARTING_BOMBS: u8 = 3; +pub const STARTING_SNOWBALLS: u8 = 3; + +pub const COLLISION_DAMAGE: i32 = 20; + +pub const LAVA_DAMAGE: i32 = 3; + +pub const LAVA_ROUND_START: usize = 100; +pub const LAVA_ROUND_END: usize = 350; +pub const MAX_ROUNDS: usize = 400; + +pub const FREEZE_DURATION: u8 = 5; +pub const FREEZE_SCORE: i32 = 17; diff --git a/2019-worms/src/constants/lava.rs b/2019-worms/src/constants/lava.rs new file mode 100644 index 0000000..238d668 --- /dev/null +++ b/2019-worms/src/constants/lava.rs @@ -0,0 +1,6225 @@ +use crate::constants::*; +use crate::game::map::Map; + +#[allow(clippy::all)] +pub const LAVA_MAP: [Map; MAX_ROUNDS as usize + 1] = [ + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + ], + }, + Map { + cells: [ + 0xE0003E003FDF, + 0x60000038000038, + 0xE00000030000, + 0x180000003800, + 0x180000000C00, + 0x600000003000, + 0x80000000C000, + 0x6000000020000, + 0x180000000C0000, + 0x60000000300000, + 0x38000000300000, + 0x18000000E0000, + 0x3800003800000C00, + 0xF7F800F8000E0000, + 0x1, + ], + }, + Map { + cells: [ + 0xE0003E003FFF, + 0x60000038000038, + 0xE00000030000, + 0x180000003800, + 0x180000000C00, + 0x600000003000, + 0x180000000C000, + 0x6000000030000, + 0x180000000C0000, + 0x60000000300000, + 0x38000000300000, + 0x18000000E0000, + 0x3800003800000C00, + 0xFFF800F8000E0000, + 0x1, + ], + }, + Map { + cells: [ + 0xE0003E003FFF, + 0x60000038000038, + 0xE00000030000, + 0x180000003800, + 0x180000000C00, + 0x600000003000, + 0x180000000C000, + 0x6000000030000, + 0x180000000C0000, + 0x60000000300000, + 0x38000000300000, + 0x18000000E0000, + 0x3800003800000C00, + 0xFFF800F8000E0000, + 0x1, + ], + }, + Map { + cells: [ + 0x1E0003F007FFF, + 0x6000003800003C, + 0xF00000070000, + 0x180000003800, + 0x1C0000001C00, + 0x600000003000, + 0x180000000C000, + 0x6000000030000, + 0x180000000C0000, + 0x70000000700000, + 0x38000000300000, + 0x1C000001E0000, + 0x7800003800000C00, + 0xFFFC01F8000F0000, + 0x1, + ], + }, + Map { + cells: [ + 0x1E0003F007FFF, + 0x6000003800003C, + 0xF00000070000, + 0x180000003800, + 0x1C0000001C00, + 0x600000003000, + 0x180000000C000, + 0x6000000030000, + 0x180000000C0000, + 0x70000000700000, + 0x38000000300000, + 0x1C000001E0000, + 0x7800003800000C00, + 0xFFFC01F8000F0000, + 0x1, + ], + }, + Map { + cells: [ + 0x1E0003F007FFF, + 0x6000003800003C, + 0xF00000070000, + 0x180000003800, + 0x1C0000001C00, + 0x600000003000, + 0x180000000C000, + 0x6000000030000, + 0x180000000C0000, + 0x70000000700000, + 0x38000000300000, + 0x1C000001E0000, + 0x7800003800000C00, + 0xFFFC01F8000F0000, + 0x1, + ], + }, + Map { + cells: [ + 0x1F0007F007FFF, + 0xE000003C00007C, + 0xF00000078000, + 0x1C0000007800, + 0x1C0000001C00, + 0x600000003000, + 0x180000000C000, + 0x6000000030000, + 0x180000000C0000, + 0x70000000700000, + 0x3C000000700000, + 0x3C000001E0000, + 0x7C00007800000E00, + 0xFFFC01FC001F0000, + 0x1, + ], + }, + Map { + cells: [ + 0x1F0007F007FFF, + 0xF000007C00007C, + 0xF00000078000, + 0x1C0000007800, + 0x1C0000001C00, + 0x600000003000, + 0x180000000C000, + 0x6000000030000, + 0x180000000C0000, + 0x70000000700000, + 0x3C000000700000, + 0x3C000001E0000, + 0x7C00007C00001E00, + 0xFFFC01FC001F0000, + 0x1, + ], + }, + Map { + cells: [ + 0x1F0007F80FFFF, + 0xF000007C00007C, + 0xF00000078000, + 0x1C0000007800, + 0x3C0000001C00, + 0x600000003800, + 0x180000000C000, + 0x6000000030000, + 0x380000000C0000, + 0x70000000780000, + 0x3C000000700000, + 0x3C000001E0000, + 0x7C00007C00001E00, + 0xFFFE03FC001F0000, + 0x1, + ], + }, + Map { + cells: [ + 0x1F0007F80FFFF, + 0xF000007C00007C, + 0xF00000078000, + 0x1C0000007800, + 0x3C0000001C00, + 0x600000003800, + 0x180000000C000, + 0x6000000030000, + 0x380000000C0000, + 0x70000000780000, + 0x3C000000700000, + 0x3C000001E0000, + 0x7C00007C00001E00, + 0xFFFE03FC001F0000, + 0x1, + ], + }, + Map { + cells: [ + 0x1F0007F80FFFF, + 0xF000007C00007C, + 0xF00000078000, + 0x1C0000007800, + 0x3C0000001C00, + 0x600000003800, + 0x180000000C000, + 0x6000000030000, + 0x380000000C0000, + 0x70000000780000, + 0x3C000000700000, + 0x3C000001E0000, + 0x7C00007C00001E00, + 0xFFFE03FC001F0000, + 0x1, + ], + }, + Map { + cells: [ + 0x1F0007FC1FFFF, + 0xF000007C00007C, + 0xF00000078000, + 0x1C0000007800, + 0x3C0000001C00, + 0x700000007800, + 0x180000000C000, + 0x6000000030000, + 0x3C0000001C0000, + 0x70000000780000, + 0x3C000000700000, + 0x3C000001E0000, + 0x7C00007C00001E00, + 0xFFFF07FC001F0000, + 0x1, + ], + }, + Map { + cells: [ + 0x3F0007FC1FFFF, + 0xF000007C00007E, + 0x1F00000078000, + 0x1C0000007C00, + 0x3C0000001C00, + 0x700000007800, + 0x180000000C000, + 0x6000000030000, + 0x3C0000001C0000, + 0x70000000780000, + 0x7C000000700000, + 0x3C000001F0000, + 0xFC00007C00001E00, + 0xFFFF07FC001F8000, + 0x1, + ], + }, + Map { + cells: [ + 0x3F800FFC1FFFF, + 0xF000007C00007E, + 0x1F00000078000, + 0x3C0000007C00, + 0x3C0000001E00, + 0x700000007800, + 0x180000000C000, + 0x6000000030000, + 0x3C0000001C0000, + 0xF0000000780000, + 0x7C000000780000, + 0x3C000001F0000, + 0xFC00007C00001E00, + 0xFFFF07FE003F8000, + 0x1, + ], + }, + Map { + cells: [ + 0x3F800FFE3FFFF, + 0xF000007C00007E, + 0x1F00000078000, + 0x3C0000007C00, + 0x3C0000001E00, + 0xF00000007800, + 0x180000000E000, + 0xE000000030000, + 0x3C0000001E0000, + 0xF0000000780000, + 0x7C000000780000, + 0x3C000001F0000, + 0xFC00007C00001E00, + 0xFFFF8FFE003F8000, + 0x1, + ], + }, + Map { + cells: [ + 0x3F800FFE3FFFF, + 0xF000007C00007E, + 0x1F00000078000, + 0x3C0000007C00, + 0x3C0000001E00, + 0xF00000007800, + 0x180000000E000, + 0xE000000030000, + 0x3C0000001E0000, + 0xF0000000780000, + 0x7C000000780000, + 0x3C000001F0000, + 0xFC00007C00001E00, + 0xFFFF8FFE003F8000, + 0x1, + ], + }, + Map { + cells: [ + 0x3F800FFFFFFFF, + 0xF000007E0000FE, + 0x1F800000F8000, + 0x3C0000007C00, + 0x3C0000001E00, + 0xF00000007800, + 0x3C0000001E000, + 0xF000000078000, + 0x3C0000001E0000, + 0xF0000000780000, + 0x7C000000780000, + 0x3E000003F0000, + 0xFE0000FC00001E00, + 0xFFFFFFFE003F8000, + 0x1, + ], + }, + Map { + cells: [ + 0x3F800FFFFFFFF, + 0xF000007E0000FE, + 0x1F800000F8000, + 0x3C0000007C00, + 0x3C0000001E00, + 0xF00000007800, + 0x3C0000001E000, + 0xF000000078000, + 0x3C0000001E0000, + 0xF0000000780000, + 0x7C000000780000, + 0x3E000003F0000, + 0xFE0000FC00001E00, + 0xFFFFFFFE003F8000, + 0x1, + ], + }, + Map { + cells: [ + 0x3FC01FFFFFFFF, + 0x1F80000FE0000FE, + 0x1F800000FC000, + 0x3C0000007C00, + 0x3E0000003E00, + 0xF00000007800, + 0x3C0000001E000, + 0xF000000078000, + 0x3C0000001E0000, + 0xF8000000F80000, + 0x7C000000780000, + 0x7E000003F0000, + 0xFE0000FE00003F00, + 0xFFFFFFFF007F8000, + 0x1, + ], + }, + Map { + cells: [ + 0x3FC01FFFFFFFF, + 0x1F80000FE0000FE, + 0x1F800000FC000, + 0x3C0000007C00, + 0x3E0000003E00, + 0xF00000007800, + 0x3C0000001E000, + 0xF000000078000, + 0x3C0000001E0000, + 0xF8000000F80000, + 0x7C000000780000, + 0x7E000003F0000, + 0xFE0000FE00003F00, + 0xFFFFFFFF007F8000, + 0x1, + ], + }, + Map { + cells: [ + 0x7FC01FFFFFFFF, + 0x1F80000FE0000FF, + 0x1F800000FC000, + 0x3E000000FC00, + 0x3E0000003E00, + 0xF00000007800, + 0x3C0000001E000, + 0xF000000078000, + 0x3C0000001E0000, + 0xF8000000F80000, + 0x7E000000F80000, + 0x7E000003F0000, + 0xFE0000FE00003F00, + 0xFFFFFFFF007FC001, + 0x1, + ], + }, + Map { + cells: [ + 0x7FC01FFFFFFFF, + 0x1F80000FE0000FF, + 0x1F800000FC000, + 0x3E000000FC00, + 0x3E0000003E00, + 0xF00000007800, + 0x3C0000001E000, + 0xF000000078000, + 0x3C0000001E0000, + 0xF8000000F80000, + 0x7E000000F80000, + 0x7E000003F0000, + 0xFE0000FE00003F00, + 0xFFFFFFFF007FC001, + 0x1, + ], + }, + Map { + cells: [ + 0x7FC01FFFFFFFF, + 0x1F80000FE0000FF, + 0x1F800000FC000, + 0x3E000000FC00, + 0x3E0000003E00, + 0xF00000007800, + 0x3C0000001E000, + 0xF000000078000, + 0x3C0000001E0000, + 0xF8000000F80000, + 0x7E000000F80000, + 0x7E000003F0000, + 0xFE0000FE00003F00, + 0xFFFFFFFF007FC001, + 0x1, + ], + }, + Map { + cells: [ + 0x7FE03FFFFFFFF, + 0x1F80000FE0000FF, + 0x1F800000FC000, + 0x3E000000FC00, + 0x7E0000003E00, + 0xF00000007C00, + 0x3C0000001E000, + 0xF000000078000, + 0x7C0000001E0000, + 0xF8000000FC0000, + 0x7E000000F80000, + 0x7E000003F0000, + 0xFE0000FE00003F00, + 0xFFFFFFFF80FFC001, + 0x1, + ], + }, + Map { + cells: [ + 0x7FE03FFFFFFFF, + 0x1F80000FE0000FF, + 0x1F800000FC000, + 0x3E000000FC00, + 0x7E0000003E00, + 0xF00000007C00, + 0x3C0000001E000, + 0xF000000078000, + 0x7C0000001E0000, + 0xF8000000FC0000, + 0x7E000000F80000, + 0x7E000003F0000, + 0xFE0000FE00003F00, + 0xFFFFFFFF80FFC001, + 0x1, + ], + }, + Map { + cells: [ + 0x7FE03FFFFFFFF, + 0x1F80000FF0001FF, + 0x3F800000FC000, + 0x3E000000FE00, + 0x7E0000003E00, + 0xF00000007C00, + 0x3C0000001E000, + 0xF000000078000, + 0x7C0000001E0000, + 0xF8000000FC0000, + 0xFE000000F80000, + 0x7E000003F8000, + 0xFF0001FE00003F00, + 0xFFFFFFFF80FFC001, + 0x1, + ], + }, + Map { + cells: [ + 0x7FE03FFFFFFFF, + 0x1F80000FF0001FF, + 0x3F800000FC000, + 0x3E000000FE00, + 0x7E0000003E00, + 0xF00000007C00, + 0x3C0000001E000, + 0xF000000078000, + 0x7C0000001E0000, + 0xF8000000FC0000, + 0xFE000000F80000, + 0x7E000003F8000, + 0xFF0001FE00003F00, + 0xFFFFFFFF80FFC001, + 0x1, + ], + }, + Map { + cells: [ + 0x800FFF07FFFFFFFF, + 0x1F80000FF0001FF, + 0x3F800000FC000, + 0x7E000000FE00, + 0x7E0000003F00, + 0xF8000000FC00, + 0x3C0000001E000, + 0xF000000078000, + 0x7E0000003E0000, + 0x1F8000000FC0000, + 0xFE000000FC0000, + 0x7E000003F8000, + 0xFF0001FE00003F00, + 0xFFFFFFFFC1FFE003, + 0x1, + ], + }, + Map { + cells: [ + 0x800FFF07FFFFFFFF, + 0x1FC0001FF0001FF, + 0x3FC00001FC000, + 0x7E000000FE00, + 0x7E0000003F00, + 0xF8000000FC00, + 0x3C0000001E000, + 0xF000000078000, + 0x7E0000003E0000, + 0x1F8000000FC0000, + 0xFE000000FC0000, + 0x7F000007F8000, + 0xFF0001FF00007F00, + 0xFFFFFFFFC1FFE003, + 0x1, + ], + }, + Map { + cells: [ + 0x800FFF07FFFFFFFF, + 0x1FC0001FF0001FF, + 0x3FC00001FC000, + 0x7E000000FE00, + 0x7E0000003F00, + 0xF8000000FC00, + 0x3C0000001E000, + 0xF000000078000, + 0x7E0000003E0000, + 0x1F8000000FC0000, + 0xFE000000FC0000, + 0x7F000007F8000, + 0xFF0001FF00007F00, + 0xFFFFFFFFC1FFE003, + 0x1, + ], + }, + Map { + cells: [ + 0x800FFF8FFFFFFFFF, + 0x3FC0001FF0001FF, + 0x3FC00001FE000, + 0x7E000000FE00, + 0x7E0000003F00, + 0x1F8000000FC00, + 0x3C0000001F000, + 0x1F000000078000, + 0x7E0000003F0000, + 0x1F8000000FC0000, + 0xFE000000FC0000, + 0xFF000007F8000, + 0xFF0001FF00007F80, + 0xFFFFFFFFE3FFE003, + 0x1, + ], + }, + Map { + cells: [ + 0x800FFFDFFFFFFFFF, + 0x3FC0001FF0001FF, + 0x3FC00001FE000, + 0x7E000000FE00, + 0x7E0000003F00, + 0x1F8000000FC00, + 0x3E0000003F000, + 0x1F8000000F8000, + 0x7E0000003F0000, + 0x1F8000000FC0000, + 0xFE000000FC0000, + 0xFF000007F8000, + 0xFF0001FF00007F80, + 0xFFFFFFFFF7FFE003, + 0x1, + ], + }, + Map { + cells: [ + 0x800FFFFFFFFFFFFF, + 0x3FC0001FF0001FF, + 0x3FC00001FE000, + 0x7E000000FE00, + 0x7E0000003F00, + 0x1F8000000FC00, + 0x7E0000003F000, + 0x1F8000000FC000, + 0x7E0000003F0000, + 0x1F8000000FC0000, + 0xFE000000FC0000, + 0xFF000007F8000, + 0xFF0001FF00007F80, + 0xFFFFFFFFFFFFE003, + 0x1, + ], + }, + Map { + cells: [ + 0xC01FFFFFFFFFFFFF, + 0x3FC0001FF8003FF, + 0x3FC00001FE000, + 0x7F000001FE00, + 0x7F0000007F00, + 0x1F8000000FC00, + 0x7E0000003F000, + 0x1F8000000FC000, + 0x7E0000003F0000, + 0x1FC000001FC0000, + 0xFF000001FC0000, + 0xFF000007F8000, + 0xFF8003FF00007F80, + 0xFFFFFFFFFFFFF007, + 0x1, + ], + }, + Map { + cells: [ + 0xC01FFFFFFFFFFFFF, + 0x3FC0001FF8003FF, + 0x3FC00001FE000, + 0x7F000001FE00, + 0x7F0000007F00, + 0x1F8000000FC00, + 0x7E0000003F000, + 0x1F8000000FC000, + 0x7E0000003F0000, + 0x1FC000001FC0000, + 0xFF000001FC0000, + 0xFF000007F8000, + 0xFF8003FF00007F80, + 0xFFFFFFFFFFFFF007, + 0x1, + ], + }, + Map { + cells: [ + 0xC01FFFFFFFFFFFFF, + 0x3FC0001FF8003FF, + 0x3FC00001FE000, + 0x7F000001FE00, + 0x7F0000007F00, + 0x1F8000000FC00, + 0x7E0000003F000, + 0x1F8000000FC000, + 0x7E0000003F0000, + 0x1FC000001FC0000, + 0xFF000001FC0000, + 0xFF000007F8000, + 0xFF8003FF00007F80, + 0xFFFFFFFFFFFFF007, + 0x1, + ], + }, + Map { + cells: [ + 0xC01FFFFFFFFFFFFF, + 0x3FC0001FF8003FF, + 0x3FC00001FE000, + 0x7F000001FE00, + 0x7F0000007F00, + 0x1F8000000FC00, + 0x7E0000003F000, + 0x1F8000000FC000, + 0x7E0000003F0000, + 0x1FC000001FC0000, + 0xFF000001FC0000, + 0xFF000007F8000, + 0xFF8003FF00007F80, + 0xFFFFFFFFFFFFF007, + 0x1, + ], + }, + Map { + cells: [ + 0xC01FFFFFFFFFFFFF, + 0x3FC0001FF8003FF, + 0x3FC00001FE000, + 0x7F000001FE00, + 0x7F0000007F00, + 0x1F8000000FC00, + 0x7E0000003F000, + 0x1F8000000FC000, + 0x7E0000003F0000, + 0x1FC000001FC0000, + 0xFF000001FC0000, + 0xFF000007F8000, + 0xFF8003FF00007F80, + 0xFFFFFFFFFFFFF007, + 0x1, + ], + }, + Map { + cells: [ + 0xE03FFFFFFFFFFFFF, + 0x3FE0003FF8003FF, + 0x7FC00001FE000, + 0x7F000001FF00, + 0xFF0000007F00, + 0x1F8000000FE00, + 0x7E0000003F000, + 0x1F8000000FC000, + 0xFE0000003F0000, + 0x1FC000001FE0000, + 0x1FF000001FC0000, + 0xFF000007FC000, + 0xFF8003FF8000FF80, + 0xFFFFFFFFFFFFF80F, + 0x1, + ], + }, + Map { + cells: [ + 0xE03FFFFFFFFFFFFF, + 0x3FE0003FF8003FF, + 0x7FC00001FE000, + 0x7F000001FF00, + 0xFF0000007F00, + 0x1F8000000FE00, + 0x7E0000003F000, + 0x1F8000000FC000, + 0xFE0000003F0000, + 0x1FC000001FE0000, + 0x1FF000001FC0000, + 0xFF000007FC000, + 0xFF8003FF8000FF80, + 0xFFFFFFFFFFFFF80F, + 0x1, + ], + }, + Map { + cells: [ + 0xE03FFFFFFFFFFFFF, + 0x7FE0003FF8003FF, + 0x7FE00003FF000, + 0x7F000001FF00, + 0xFF0000007F00, + 0x1F8000000FE00, + 0x7E0000003F000, + 0x1F8000000FC000, + 0xFE0000003F0000, + 0x1FC000001FE0000, + 0x1FF000001FC0000, + 0x1FF80000FFC000, + 0xFF8003FF8000FFC0, + 0xFFFFFFFFFFFFF80F, + 0x1, + ], + }, + Map { + cells: [ + 0xE03FFFFFFFFFFFFF, + 0x7FE0003FFC007FF, + 0x7FE00003FF000, + 0xFF000001FF00, + 0xFF0000007F80, + 0x1F8000000FE00, + 0x7E0000003F000, + 0x1F8000000FC000, + 0xFE0000003F0000, + 0x3FC000001FE0000, + 0x1FF000001FE0000, + 0x1FF80000FFC000, + 0xFFC007FF8000FFC0, + 0xFFFFFFFFFFFFF80F, + 0x1, + ], + }, + Map { + cells: [ + 0xF07FFFFFFFFFFFFF, + 0x7FE0003FFC007FF, + 0x7FE00003FF000, + 0xFF000001FF00, + 0xFF0000007F80, + 0x1FC000001FE00, + 0x7E0000003F000, + 0x1F8000000FC000, + 0xFF0000007F0000, + 0x3FC000001FE0000, + 0x1FF000001FE0000, + 0x1FF80000FFC000, + 0xFFC007FF8000FFC0, + 0xFFFFFFFFFFFFFC1F, + 0x1, + ], + }, + Map { + cells: [ + 0xF07FFFFFFFFFFFFF, + 0x7FE0003FFC007FF, + 0x7FE00003FF000, + 0xFF000001FF00, + 0xFF0000007F80, + 0x1FC000001FE00, + 0x7E0000003F000, + 0x1F8000000FC000, + 0xFF0000007F0000, + 0x3FC000001FE0000, + 0x1FF000001FE0000, + 0x1FF80000FFC000, + 0xFFC007FF8000FFC0, + 0xFFFFFFFFFFFFFC1F, + 0x1, + ], + }, + Map { + cells: [ + 0xF07FFFFFFFFFFFFF, + 0x7FE0003FFC007FF, + 0x7FE00003FF000, + 0xFF000001FF00, + 0xFF0000007F80, + 0x1FC000001FE00, + 0x7E0000003F000, + 0x1F8000000FC000, + 0xFF0000007F0000, + 0x3FC000001FE0000, + 0x1FF000001FE0000, + 0x1FF80000FFC000, + 0xFFC007FF8000FFC0, + 0xFFFFFFFFFFFFFC1F, + 0x1, + ], + }, + Map { + cells: [ + 0xF8FFFFFFFFFFFFFF, + 0x7FE0003FFC007FF, + 0x7FE00003FF000, + 0xFF000001FF00, + 0xFF0000007F80, + 0x3FC000001FE00, + 0x7E0000003F800, + 0x3F8000000FC000, + 0xFF0000007F8000, + 0x3FC000001FE0000, + 0x1FF000001FE0000, + 0x1FF80000FFC000, + 0xFFC007FF8000FFC0, + 0xFFFFFFFFFFFFFE3F, + 0x1, + ], + }, + Map { + cells: [ + 0xF8FFFFFFFFFFFFFF, + 0x7FE0003FFC007FF, + 0x7FE00003FF000, + 0xFF000001FF00, + 0xFF0000007F80, + 0x3FC000001FE00, + 0x7E0000003F800, + 0x3F8000000FC000, + 0xFF0000007F8000, + 0x3FC000001FE0000, + 0x1FF000001FE0000, + 0x1FF80000FFC000, + 0xFFC007FF8000FFC0, + 0xFFFFFFFFFFFFFE3F, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x7FF0007FFE00FFF, + 0x7FE00003FF000, + 0xFF800003FF00, + 0xFF800000FF80, + 0x3FC000001FE00, + 0xFF0000007F800, + 0x3FC000001FE000, + 0xFF0000007F8000, + 0x3FE000003FE0000, + 0x1FF800003FE0000, + 0x1FF80000FFC000, + 0xFFE00FFFC001FFC0, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x7FF0007FFE00FFF, + 0x7FE00003FF000, + 0xFF800003FF00, + 0xFF800000FF80, + 0x3FC000001FE00, + 0xFF0000007F800, + 0x3FC000001FE000, + 0xFF0000007F8000, + 0x3FE000003FE0000, + 0x1FF800003FE0000, + 0x1FF80000FFC000, + 0xFFE00FFFC001FFC0, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x7FF0007FFE00FFF, + 0x7FE00003FF000, + 0xFF800003FF00, + 0xFF800000FF80, + 0x3FC000001FE00, + 0xFF0000007F800, + 0x3FC000001FE000, + 0xFF0000007F8000, + 0x3FE000003FE0000, + 0x1FF800003FE0000, + 0x1FF80000FFC000, + 0xFFE00FFFC001FFC0, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFF0007FFE00FFF, + 0xFFE00003FF800, + 0xFF800003FF80, + 0xFF800000FF80, + 0x3FC000001FE00, + 0xFF0000007F800, + 0x3FC000001FE000, + 0xFF0000007F8000, + 0x3FE000003FE0000, + 0x3FF800003FE0000, + 0x3FF80000FFE000, + 0xFFE00FFFC001FFE0, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFF0007FFE00FFF, + 0xFFE00003FF800, + 0xFF800003FF80, + 0xFF800000FF80, + 0x3FC000001FE00, + 0xFF0000007F800, + 0x3FC000001FE000, + 0xFF0000007F8000, + 0x3FE000003FE0000, + 0x3FF800003FE0000, + 0x3FF80000FFE000, + 0xFFE00FFFC001FFE0, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFF0007FFE00FFF, + 0xFFF00007FF800, + 0xFF800003FF80, + 0xFF800000FF80, + 0x3FC000001FE00, + 0xFF0000007F800, + 0x3FC000001FE000, + 0xFF0000007F8000, + 0x3FE000003FE0000, + 0x3FF800003FE0000, + 0x3FFC0001FFE000, + 0xFFE00FFFC001FFE0, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFF0007FFF01FFF, + 0xFFF00007FF800, + 0xFF800003FF80, + 0x1FF800000FF80, + 0x3FC000001FF00, + 0xFF0000007F800, + 0x3FC000001FE000, + 0x1FF0000007F8000, + 0x3FE000003FF0000, + 0x3FF800003FE0000, + 0x3FFC0001FFE000, + 0xFFF01FFFC001FFE0, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFF0007FFF01FFF, + 0xFFF00007FF800, + 0xFF800003FF80, + 0x1FF800000FF80, + 0x3FC000001FF00, + 0xFF0000007F800, + 0x3FC000001FE000, + 0x1FF0000007F8000, + 0x3FE000003FF0000, + 0x3FF800003FE0000, + 0x3FFC0001FFE000, + 0xFFF01FFFC001FFE0, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFF800FFFF01FFF, + 0xFFF00007FF800, + 0x1FF800003FF80, + 0x1FF800000FFC0, + 0x3FC000001FF00, + 0xFF0000007F800, + 0x3FC000001FE000, + 0x1FF0000007F8000, + 0x7FE000003FF0000, + 0x3FF800003FF0000, + 0x3FFC0001FFE000, + 0xFFF01FFFE003FFE0, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFF800FFFF01FFF, + 0xFFF00007FF800, + 0x1FF800003FF80, + 0x1FF800000FFC0, + 0x3FC000001FF00, + 0xFF0000007F800, + 0x3FC000001FE000, + 0x1FF0000007F8000, + 0x7FE000003FF0000, + 0x3FF800003FF0000, + 0x3FFC0001FFE000, + 0xFFF01FFFE003FFE0, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFF800FFFF83FFF, + 0xFFF00007FF800, + 0x1FF800003FF80, + 0x1FF800000FFC0, + 0x3FE000003FF00, + 0xFF0000007F800, + 0x3FC000001FE000, + 0x1FF800000FF8000, + 0x7FE000003FF0000, + 0x3FF800003FF0000, + 0x3FFC0001FFE000, + 0xFFF83FFFE003FFE0, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFF800FFFF83FFF, + 0xFFF00007FF800, + 0x1FF800003FF80, + 0x1FF800000FFC0, + 0x3FE000003FF00, + 0xFF0000007F800, + 0x3FC000001FE000, + 0x1FF800000FF8000, + 0x7FE000003FF0000, + 0x3FF800003FF0000, + 0x3FFC0001FFE000, + 0xFFF83FFFE003FFE0, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFF800FFFF83FFF, + 0xFFF00007FF800, + 0x1FF800003FF80, + 0x1FF800000FFC0, + 0x3FE000003FF00, + 0xFF0000007F800, + 0x3FC000001FE000, + 0x1FF800000FF8000, + 0x7FE000003FF0000, + 0x3FF800003FF0000, + 0x3FFC0001FFE000, + 0xFFF83FFFE003FFE0, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x1FFF800FFFFC7FFF, + 0xFFF00007FFC00, + 0x1FFC00007FF80, + 0x1FF800000FFC0, + 0x7FE000003FF00, + 0xFF0000007FC00, + 0x7FC000001FE000, + 0x1FF800000FFC000, + 0x7FE000003FF0000, + 0x3FFC00007FF0000, + 0x7FFC0001FFE000, + 0xFFFC7FFFE003FFF0, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x1FFF800FFFFC7FFF, + 0xFFF00007FFC00, + 0x1FFC00007FF80, + 0x1FF800000FFC0, + 0x7FE000003FF00, + 0xFF0000007FC00, + 0x7FC000001FE000, + 0x1FF800000FFC000, + 0x7FE000003FF0000, + 0x3FFC00007FF0000, + 0x7FFC0001FFE000, + 0xFFFC7FFFE003FFF0, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x1FFFC01FFFFEFFFF, + 0x1FFF8000FFFC00, + 0x1FFC00007FFC0, + 0x1FFC00001FFC0, + 0x7FE000003FF00, + 0xFF800000FFC00, + 0x7FE000003FE000, + 0x1FF800000FFC000, + 0x7FF000007FF0000, + 0x7FFC00007FF0000, + 0x7FFE0003FFF000, + 0xFFFEFFFFF007FFF0, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x1FFFC01FFFFFFFFF, + 0x1FFF8000FFFC00, + 0x1FFC00007FFC0, + 0x1FFC00001FFC0, + 0x7FE000003FF00, + 0x1FF800000FFC00, + 0x7FE000003FF000, + 0x1FF800000FFC000, + 0x7FF000007FF0000, + 0x7FFC00007FF0000, + 0x7FFE0003FFF000, + 0xFFFFFFFFF007FFF0, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x1FFFC01FFFFFFFFF, + 0x1FFF8000FFFC00, + 0x1FFC00007FFC0, + 0x1FFC00001FFC0, + 0x7FE000003FF00, + 0x1FF800000FFC00, + 0x7FE000003FF000, + 0x1FF800000FFC000, + 0x7FF000007FF0000, + 0x7FFC00007FF0000, + 0x7FFE0003FFF000, + 0xFFFFFFFFF007FFF0, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x1FFFC01FFFFFFFFF, + 0x1FFF8000FFFC00, + 0x1FFC00007FFC0, + 0x1FFC00001FFC0, + 0x7FE000003FF00, + 0x1FF800000FFC00, + 0x7FE000003FF000, + 0x1FF800000FFC000, + 0x7FF000007FF0000, + 0x7FFC00007FF0000, + 0x7FFE0003FFF000, + 0xFFFFFFFFF007FFF0, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x1FFFC01FFFFFFFFF, + 0x1FFF8000FFFC00, + 0x1FFC00007FFC0, + 0x1FFC00001FFC0, + 0x7FE000003FF00, + 0x1FF800000FFC00, + 0x7FE000003FF000, + 0x1FF800000FFC000, + 0x7FF000007FF0000, + 0x7FFC00007FF0000, + 0x7FFE0003FFF000, + 0xFFFFFFFFF007FFF0, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x1FFFC01FFFFFFFFF, + 0x1FFF8000FFFC00, + 0x1FFC00007FFC0, + 0x1FFC00001FFC0, + 0x7FE000003FF00, + 0x1FF800000FFC00, + 0x7FE000003FF000, + 0x1FF800000FFC000, + 0x7FF000007FF0000, + 0x7FFC00007FF0000, + 0x7FFE0003FFF000, + 0xFFFFFFFFF007FFF0, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x3FFFE03FFFFFFFFF, + 0x1FFF8000FFFE00, + 0x3FFC00007FFC0, + 0x3FFC00001FFE0, + 0x7FE000003FF80, + 0x1FF800000FFC00, + 0x7FE000003FF000, + 0x3FF800000FFC000, + 0xFFF000007FF8000, + 0x7FFC00007FF8000, + 0xFFFE0003FFF000, + 0xFFFFFFFFF80FFFF8, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x3FFFE03FFFFFFFFF, + 0x1FFF8000FFFE00, + 0x3FFC00007FFC0, + 0x3FFC00001FFE0, + 0x7FE000003FF80, + 0x1FF800000FFC00, + 0x7FE000003FF000, + 0x3FF800000FFC000, + 0xFFF000007FF8000, + 0x7FFC00007FF8000, + 0xFFFE0003FFF000, + 0xFFFFFFFFF80FFFF8, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x3FFFE03FFFFFFFFF, + 0x1FFF8000FFFE00, + 0x3FFC00007FFC0, + 0x3FFC00001FFE0, + 0x7FE000003FF80, + 0x1FF800000FFC00, + 0x7FE000003FF000, + 0x3FF800000FFC000, + 0xFFF000007FF8000, + 0x7FFC00007FF8000, + 0xFFFE0003FFF000, + 0xFFFFFFFFF80FFFF8, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x3FFFE03FFFFFFFFF, + 0x1FFF8000FFFE00, + 0x3FFC00007FFC0, + 0x3FFC00001FFE0, + 0x7FE000003FF80, + 0x1FF800000FFC00, + 0x7FE000003FF000, + 0x3FF800000FFC000, + 0xFFF000007FF8000, + 0x7FFC00007FF8000, + 0xFFFE0003FFF000, + 0xFFFFFFFFF80FFFF8, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x3FFFF07FFFFFFFFF, + 0x1FFFC001FFFE00, + 0x3FFE0000FFFC0, + 0x3FFC00001FFE0, + 0x7FF000007FF80, + 0x1FF800000FFC00, + 0x7FE000003FF000, + 0x3FFC00001FFC000, + 0xFFF000007FF8000, + 0x7FFE0000FFF8000, + 0xFFFF0007FFF000, + 0xFFFFFFFFFC1FFFF8, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x3FFFF07FFFFFFFFF, + 0x1FFFC001FFFE00, + 0x3FFE0000FFFC0, + 0x3FFC00001FFE0, + 0x7FF000007FF80, + 0x1FF800000FFC00, + 0x7FE000003FF000, + 0x3FFC00001FFC000, + 0xFFF000007FF8000, + 0x7FFE0000FFF8000, + 0xFFFF0007FFF000, + 0xFFFFFFFFFC1FFFF8, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x3FFFF07FFFFFFFFF, + 0x3FFFC001FFFE00, + 0x3FFE0000FFFE0, + 0x3FFC00001FFE0, + 0x7FF000007FF80, + 0x1FF800000FFC00, + 0x7FE000003FF000, + 0x3FFC00001FFC000, + 0xFFF000007FF8000, + 0xFFFE0000FFF8000, + 0xFFFF0007FFF800, + 0xFFFFFFFFFC1FFFF8, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x3FFFF07FFFFFFFFF, + 0x3FFFC001FFFE00, + 0x3FFE0000FFFE0, + 0x3FFC00001FFE0, + 0x7FF000007FF80, + 0x1FF800000FFC00, + 0x7FE000003FF000, + 0x3FFC00001FFC000, + 0xFFF000007FF8000, + 0xFFFE0000FFF8000, + 0xFFFF0007FFF800, + 0xFFFFFFFFFC1FFFF8, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x7FFFF8FFFFFFFFFF, + 0x3FFFC001FFFF00, + 0x3FFE0000FFFE0, + 0x3FFE00003FFE0, + 0xFFF000007FF80, + 0x1FF800000FFE00, + 0xFFE000003FF000, + 0x3FFC00001FFE000, + 0xFFF80000FFF8000, + 0xFFFE0000FFF8000, + 0x1FFFF0007FFF800, + 0xFFFFFFFFFE3FFFFC, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x7FFFF8FFFFFFFFFF, + 0x3FFFC001FFFF00, + 0x3FFE0000FFFE0, + 0x3FFE00003FFE0, + 0xFFF000007FF80, + 0x1FF800000FFE00, + 0xFFE000003FF000, + 0x3FFC00001FFE000, + 0xFFF80000FFF8000, + 0xFFFE0000FFF8000, + 0x1FFFF0007FFF800, + 0xFFFFFFFFFE3FFFFC, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFDFFFFFFFFFF, + 0x3FFFC001FFFF00, + 0x3FFE0000FFFE0, + 0x3FFE00003FFE0, + 0xFFF000007FF80, + 0x1FFC00001FFE00, + 0xFFF000007FF000, + 0x3FFC00001FFE000, + 0xFFF80000FFF8000, + 0xFFFE0000FFF8000, + 0x1FFFF0007FFF800, + 0xFFFFFFFFFF7FFFFC, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFFFFFFFFFFFF, + 0x3FFFC001FFFF00, + 0x3FFE0000FFFE0, + 0x3FFE00003FFE0, + 0xFFF000007FF80, + 0x3FFC00001FFE00, + 0xFFF000007FF800, + 0x3FFC00001FFE000, + 0xFFF80000FFF8000, + 0xFFFE0000FFF8000, + 0x1FFFF0007FFF800, + 0xFFFFFFFFFFFFFFFC, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFFFFFFFFFFFF, + 0x3FFFC001FFFF00, + 0x3FFE0000FFFE0, + 0x3FFE00003FFE0, + 0xFFF000007FF80, + 0x3FFC00001FFE00, + 0xFFF000007FF800, + 0x3FFC00001FFE000, + 0xFFF80000FFF8000, + 0xFFFE0000FFF8000, + 0x1FFFF0007FFF800, + 0xFFFFFFFFFFFFFFFC, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFFFFFFFFFFFF, + 0x3FFFE003FFFF00, + 0x7FFE0000FFFE0, + 0x3FFE00003FFF0, + 0xFFF000007FF80, + 0x3FFC00001FFE00, + 0xFFF000007FF800, + 0x3FFC00001FFE000, + 0x1FFF80000FFF8000, + 0xFFFE0000FFFC000, + 0x1FFFF800FFFF800, + 0xFFFFFFFFFFFFFFFC, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x3FFFE003FFFF80, + 0x7FFE0000FFFE0, + 0x7FFE00003FFF0, + 0xFFF000007FFC0, + 0x3FFC00001FFE00, + 0xFFF000007FF800, + 0x7FFC00001FFE000, + 0x1FFF80000FFFC000, + 0xFFFE0000FFFC000, + 0x3FFFF800FFFF800, + 0xFFFFFFFFFFFFFFFE, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x3FFFE003FFFF80, + 0x7FFE0000FFFE0, + 0x7FFE00003FFF0, + 0xFFF000007FFC0, + 0x3FFC00001FFE00, + 0xFFF000007FF800, + 0x7FFC00001FFE000, + 0x1FFF80000FFFC000, + 0xFFFE0000FFFC000, + 0x3FFFF800FFFF800, + 0xFFFFFFFFFFFFFFFE, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFE003FFFF80, + 0x7FFF0001FFFF0, + 0x7FFE00003FFF0, + 0xFFF000007FFC0, + 0x3FFC00001FFE00, + 0xFFF000007FF800, + 0x7FFC00001FFE000, + 0x1FFF80000FFFC000, + 0x1FFFF0001FFFC000, + 0x3FFFF800FFFFC00, + 0xFFFFFFFFFFFFFFFE, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFE003FFFF80, + 0x7FFF0001FFFF0, + 0x7FFE00003FFF0, + 0xFFF000007FFC0, + 0x3FFC00001FFE00, + 0xFFF000007FF800, + 0x7FFC00001FFE000, + 0x1FFF80000FFFC000, + 0x1FFFF0001FFFC000, + 0x3FFFF800FFFFC00, + 0xFFFFFFFFFFFFFFFE, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFE003FFFF80, + 0x7FFF0001FFFF0, + 0x7FFE00003FFF0, + 0xFFF000007FFC0, + 0x3FFC00001FFE00, + 0xFFF000007FF800, + 0x7FFC00001FFE000, + 0x1FFF80000FFFC000, + 0x1FFFF0001FFFC000, + 0x3FFFF800FFFFC00, + 0xFFFFFFFFFFFFFFFE, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFE003FFFFC1, + 0x7FFF0001FFFF0, + 0x7FFE00003FFF0, + 0xFFF80000FFFC0, + 0x3FFC00001FFE00, + 0xFFF000007FF800, + 0x7FFE00003FFE000, + 0x1FFF80000FFFC000, + 0x1FFFF0001FFFC000, + 0x7FFFF800FFFFC00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFE003FFFFC1, + 0x7FFF0001FFFF0, + 0x7FFE00003FFF0, + 0xFFF80000FFFC0, + 0x3FFC00001FFE00, + 0xFFF000007FF800, + 0x7FFE00003FFE000, + 0x1FFF80000FFFC000, + 0x1FFFF0001FFFC000, + 0x7FFFF800FFFFC00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFE003FFFFC1, + 0x7FFF0001FFFF0, + 0x7FFE00003FFF0, + 0xFFF80000FFFC0, + 0x3FFC00001FFE00, + 0xFFF000007FF800, + 0x7FFE00003FFE000, + 0x1FFF80000FFFC000, + 0x1FFFF0001FFFC000, + 0x7FFFF800FFFFC00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFF007FFFFC1, + 0x7FFF0001FFFF0, + 0x7FFF00007FFF0, + 0xFFF80000FFFC0, + 0x3FFC00001FFE00, + 0xFFF000007FF800, + 0x7FFE00003FFE000, + 0x1FFFC0001FFFC000, + 0x1FFFF0001FFFC000, + 0x7FFFFC01FFFFC00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFF007FFFFE3, + 0x7FFF0001FFFF0, + 0x7FFF00007FFF0, + 0x1FFF80000FFFC0, + 0x3FFC00001FFF00, + 0x1FFF000007FF800, + 0x7FFE00003FFF000, + 0x1FFFC0001FFFC000, + 0x1FFFF0001FFFC000, + 0x8FFFFFC01FFFFC00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFF007FFFFE3, + 0x7FFF0001FFFF0, + 0x7FFF00007FFF0, + 0x1FFF80000FFFC0, + 0x3FFC00001FFF00, + 0x1FFF000007FF800, + 0x7FFE00003FFF000, + 0x1FFFC0001FFFC000, + 0x1FFFF0001FFFC000, + 0x8FFFFFC01FFFFC00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFF007FFFFF7, + 0x7FFF0001FFFF0, + 0x7FFF00007FFF0, + 0x1FFF80000FFFC0, + 0x3FFE00003FFF00, + 0x1FFF80000FFF800, + 0x7FFE00003FFF000, + 0x1FFFC0001FFFC000, + 0x1FFFF0001FFFC000, + 0xDFFFFFC01FFFFC00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFF007FFFFFF, + 0xFFFF0001FFFF8, + 0x7FFF00007FFF8, + 0x1FFF80000FFFC0, + 0x7FFE00003FFF00, + 0x1FFF80000FFFC00, + 0x7FFE00003FFF000, + 0x3FFFC0001FFFC000, + 0x3FFFF0001FFFE000, + 0xFFFFFFC01FFFFE00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFF007FFFFFF, + 0xFFFF0001FFFF8, + 0x7FFF00007FFF8, + 0x1FFF80000FFFC0, + 0x7FFE00003FFF00, + 0x1FFF80000FFFC00, + 0x7FFE00003FFF000, + 0x3FFFC0001FFFC000, + 0x3FFFF0001FFFE000, + 0xFFFFFFC01FFFFE00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFF007FFFFFF, + 0xFFFF8003FFFF8, + 0x7FFF00007FFF8, + 0x1FFF80000FFFC0, + 0x7FFE00003FFF00, + 0x1FFF80000FFFC00, + 0x7FFE00003FFF000, + 0x3FFFC0001FFFC000, + 0x3FFFF8003FFFE000, + 0xFFFFFFC01FFFFE00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFF80FFFFFFF, + 0xFFFF8003FFFF8, + 0xFFFF00007FFF8, + 0x1FFF80000FFFE0, + 0x7FFE00003FFF00, + 0x1FFF80000FFFC00, + 0xFFFE00003FFF000, + 0x3FFFC0001FFFE000, + 0x3FFFF8003FFFE000, + 0xFFFFFFE03FFFFE00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFF80FFFFFFF, + 0xFFFF8003FFFF8, + 0xFFFF00007FFF8, + 0x1FFF80000FFFE0, + 0x7FFE00003FFF00, + 0x1FFF80000FFFC00, + 0xFFFE00003FFF000, + 0x3FFFC0001FFFE000, + 0x3FFFF8003FFFE000, + 0xFFFFFFE03FFFFE00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFF80FFFFFFF, + 0xFFFF8003FFFF8, + 0xFFFF00007FFF8, + 0x1FFF80000FFFE0, + 0x7FFE00003FFF00, + 0x1FFF80000FFFC00, + 0xFFFE00003FFF000, + 0x3FFFC0001FFFE000, + 0x3FFFF8003FFFE000, + 0xFFFFFFE03FFFFE00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFF80FFFFFFF, + 0xFFFF8003FFFF8, + 0xFFFF00007FFF8, + 0x1FFF80000FFFE0, + 0x7FFE00003FFF00, + 0x1FFF80000FFFC00, + 0xFFFE00003FFF000, + 0x3FFFC0001FFFE000, + 0x3FFFF8003FFFE000, + 0xFFFFFFE03FFFFE00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFF80FFFFFFF, + 0xFFFF8003FFFF8, + 0xFFFF00007FFF8, + 0x1FFF80000FFFE0, + 0x7FFE00003FFF00, + 0x1FFF80000FFFC00, + 0xFFFE00003FFF000, + 0x3FFFC0001FFFE000, + 0x3FFFF8003FFFE000, + 0xFFFFFFE03FFFFE00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFC1FFFFFFF, + 0xFFFF8003FFFF8, + 0xFFFF00007FFF8, + 0x1FFFC0001FFFE0, + 0x7FFE00003FFF00, + 0x1FFF80000FFFC00, + 0xFFFF00007FFF000, + 0x3FFFC0001FFFE000, + 0x3FFFF8003FFFE000, + 0xFFFFFFF07FFFFE00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1FFFFFC1FFFFFFF, + 0xFFFF8003FFFFC, + 0xFFFF8000FFFF8, + 0x1FFFC0001FFFE0, + 0x7FFE00003FFF00, + 0x1FFF80000FFFC00, + 0xFFFF00007FFF000, + 0x3FFFE0003FFFE000, + 0x7FFFF8003FFFE000, + 0xFFFFFFF07FFFFF00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1FFFFFC1FFFFFFF, + 0xFFFF8003FFFFC, + 0xFFFF8000FFFF8, + 0x1FFFC0001FFFE0, + 0x7FFE00003FFF00, + 0x1FFF80000FFFC00, + 0xFFFF00007FFF000, + 0x3FFFE0003FFFE000, + 0x7FFFF8003FFFE000, + 0xFFFFFFF07FFFFF00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1FFFFFC1FFFFFFF, + 0xFFFF8003FFFFC, + 0xFFFF8000FFFF8, + 0x1FFFC0001FFFE0, + 0x7FFE00003FFF00, + 0x1FFF80000FFFC00, + 0xFFFF00007FFF000, + 0x3FFFE0003FFFE000, + 0x7FFFF8003FFFE000, + 0xFFFFFFF07FFFFF00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1FFFFFE3FFFFFFF, + 0x1FFFFC007FFFFC, + 0xFFFF8000FFFFC, + 0x3FFFC0001FFFE0, + 0x7FFE00003FFF80, + 0x3FFF80000FFFC00, + 0xFFFF00007FFF800, + 0x7FFFE0003FFFE000, + 0x7FFFFC007FFFF000, + 0xFFFFFFF8FFFFFF00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1FFFFFE3FFFFFFF, + 0x1FFFFC007FFFFC, + 0xFFFF8000FFFFC, + 0x3FFFC0001FFFE0, + 0x7FFE00003FFF80, + 0x3FFF80000FFFC00, + 0xFFFF00007FFF800, + 0x7FFFE0003FFFE000, + 0x7FFFFC007FFFF000, + 0xFFFFFFF8FFFFFF00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1FFFFFE3FFFFFFF, + 0x1FFFFC007FFFFC, + 0xFFFF8000FFFFC, + 0x3FFFC0001FFFE0, + 0x7FFE00003FFF80, + 0x3FFF80000FFFC00, + 0xFFFF00007FFF800, + 0x7FFFE0003FFFE000, + 0x7FFFFC007FFFF000, + 0xFFFFFFF8FFFFFF00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1FFFFFF7FFFFFFF, + 0x1FFFFC007FFFFC, + 0xFFFF8000FFFFC, + 0x3FFFC0001FFFE0, + 0x7FFF00007FFF80, + 0x3FFFC0001FFFC00, + 0xFFFF00007FFF800, + 0x7FFFE0003FFFE000, + 0x7FFFFC007FFFF000, + 0xFFFFFFFDFFFFFF00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1FFFFFFFFFFFFFF, + 0x1FFFFC007FFFFC, + 0xFFFF8000FFFFC, + 0x3FFFC0001FFFE0, + 0xFFFF00007FFF80, + 0x3FFFC0001FFFE00, + 0xFFFF00007FFF800, + 0x7FFFE0003FFFE000, + 0x7FFFFC007FFFF000, + 0xFFFFFFFFFFFFFF00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x3FFFFFFFFFFFFFF, + 0x1FFFFC007FFFFE, + 0x1FFFF8000FFFFC, + 0x3FFFC0001FFFF0, + 0xFFFF00007FFF80, + 0x3FFFC0001FFFE00, + 0x1FFFF00007FFF800, + 0x7FFFE0003FFFF000, + 0xFFFFFC007FFFF000, + 0xFFFFFFFFFFFFFF80, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x3FFFFFFFFFFFFFF, + 0x1FFFFC007FFFFE, + 0x1FFFF8000FFFFC, + 0x3FFFC0001FFFF0, + 0xFFFF00007FFF80, + 0x3FFFC0001FFFE00, + 0x1FFFF00007FFF800, + 0x7FFFE0003FFFF000, + 0xFFFFFC007FFFF000, + 0xFFFFFFFFFFFFFF80, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x3FFFFFFFFFFFFFF, + 0x1FFFFC007FFFFE, + 0x1FFFF8000FFFFC, + 0x3FFFC0001FFFF0, + 0xFFFF00007FFF80, + 0x3FFFC0001FFFE00, + 0x1FFFF00007FFF800, + 0x7FFFE0003FFFF000, + 0xFFFFFC007FFFF000, + 0xFFFFFFFFFFFFFF80, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x3FFFFFFFFFFFFFF, + 0x1FFFFC007FFFFE, + 0x1FFFF8000FFFFC, + 0x3FFFC0001FFFF0, + 0xFFFF00007FFF80, + 0x3FFFC0001FFFE00, + 0x1FFFF00007FFF800, + 0x7FFFE0003FFFF000, + 0xFFFFFC007FFFF000, + 0xFFFFFFFFFFFFFF80, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x3FFFFFFFFFFFFFF, + 0x1FFFFC007FFFFE, + 0x1FFFF8000FFFFC, + 0x3FFFC0001FFFF0, + 0xFFFF00007FFF80, + 0x3FFFC0001FFFE00, + 0x1FFFF00007FFF800, + 0x7FFFE0003FFFF000, + 0xFFFFFC007FFFF000, + 0xFFFFFFFFFFFFFF80, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x3FFFFFFFFFFFFFF, + 0x1FFFFE00FFFFFE, + 0x1FFFFC001FFFFC, + 0x3FFFC0001FFFF0, + 0xFFFF00007FFF80, + 0x3FFFC0001FFFE00, + 0x1FFFF00007FFF800, + 0x7FFFF0007FFFF000, + 0xFFFFFE00FFFFF000, + 0xFFFFFFFFFFFFFF80, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFFFFFFFFFFF, + 0x1FFFFE00FFFFFF, + 0x1FFFFC001FFFFC, + 0x3FFFE0003FFFF0, + 0xFFFF00007FFF80, + 0x3FFFC0001FFFE00, + 0x1FFFF8000FFFF800, + 0x7FFFF0007FFFF000, + 0xFFFFFE00FFFFF000, + 0xFFFFFFFFFFFFFFC1, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFFFFFFFFFFF, + 0x3FFFFE00FFFFFF, + 0x1FFFFC001FFFFE, + 0x3FFFE0003FFFF0, + 0xFFFF00007FFF80, + 0x3FFFC0001FFFE00, + 0x1FFFF8000FFFF800, + 0xFFFFF0007FFFF000, + 0xFFFFFE00FFFFF800, + 0xFFFFFFFFFFFFFFC1, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFFFFFFFFFFF, + 0x3FFFFE00FFFFFF, + 0x1FFFFC001FFFFE, + 0x3FFFE0003FFFF0, + 0xFFFF00007FFF80, + 0x3FFFC0001FFFE00, + 0x1FFFF8000FFFF800, + 0xFFFFF0007FFFF000, + 0xFFFFFE00FFFFF800, + 0xFFFFFFFFFFFFFFC1, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFFFFFFFFFFF, + 0x3FFFFE00FFFFFF, + 0x1FFFFC001FFFFE, + 0x3FFFE0003FFFF0, + 0xFFFF00007FFF80, + 0x3FFFC0001FFFE00, + 0x1FFFF8000FFFF800, + 0xFFFFF0007FFFF000, + 0xFFFFFE00FFFFF800, + 0xFFFFFFFFFFFFFFC1, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFFFFFFFFFFF, + 0x3FFFFE00FFFFFF, + 0x1FFFFC001FFFFE, + 0x3FFFE0003FFFF0, + 0xFFFF00007FFF80, + 0x3FFFC0001FFFE00, + 0x1FFFF8000FFFF800, + 0xFFFFF0007FFFF000, + 0xFFFFFE00FFFFF800, + 0xFFFFFFFFFFFFFFC1, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x8FFFFFFFFFFFFFFF, + 0x3FFFFE00FFFFFF, + 0x1FFFFC001FFFFE, + 0x7FFFE0003FFFF0, + 0xFFFF00007FFFC0, + 0x7FFFC0001FFFE00, + 0x1FFFF8000FFFFC00, + 0xFFFFF0007FFFF000, + 0xFFFFFE00FFFFF800, + 0xFFFFFFFFFFFFFFE3, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x8FFFFFFFFFFFFFFF, + 0x3FFFFE00FFFFFF, + 0x1FFFFC001FFFFE, + 0x7FFFE0003FFFF0, + 0xFFFF00007FFFC0, + 0x7FFFC0001FFFE00, + 0x1FFFF8000FFFFC00, + 0xFFFFF0007FFFF000, + 0xFFFFFE00FFFFF800, + 0xFFFFFFFFFFFFFFE3, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x8FFFFFFFFFFFFFFF, + 0x3FFFFE00FFFFFF, + 0x1FFFFC001FFFFE, + 0x7FFFE0003FFFF0, + 0xFFFF00007FFFC0, + 0x7FFFC0001FFFE00, + 0x1FFFF8000FFFFC00, + 0xFFFFF0007FFFF000, + 0xFFFFFE00FFFFF800, + 0xFFFFFFFFFFFFFFE3, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xDFFFFFFFFFFFFFFF, + 0x3FFFFF01FFFFFF, + 0x3FFFFC001FFFFE, + 0x7FFFE0003FFFF8, + 0xFFFF8000FFFFC0, + 0x7FFFE0003FFFE00, + 0x3FFFF8000FFFFC00, + 0xFFFFF0007FFFF800, + 0xFFFFFF01FFFFF800, + 0xFFFFFFFFFFFFFFF7, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x3FFFFF01FFFFFF, + 0x3FFFFC001FFFFE, + 0x7FFFE0003FFFF8, + 0x1FFFF8000FFFFC0, + 0x7FFFE0003FFFF00, + 0x3FFFF8000FFFFC00, + 0xFFFFF0007FFFF800, + 0xFFFFFF01FFFFF800, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x3FFFFF01FFFFFF, + 0x3FFFFC001FFFFE, + 0x7FFFE0003FFFF8, + 0x1FFFF8000FFFFC0, + 0x7FFFE0003FFFF00, + 0x3FFFF8000FFFFC00, + 0xFFFFF0007FFFF800, + 0xFFFFFF01FFFFF800, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFF01FFFFFF, + 0x3FFFFE003FFFFF, + 0x7FFFE0003FFFF8, + 0x1FFFF8000FFFFC0, + 0x7FFFE0003FFFF00, + 0x3FFFF8000FFFFC00, + 0xFFFFF800FFFFF800, + 0xFFFFFF01FFFFFC01, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFF01FFFFFF, + 0x3FFFFE003FFFFF, + 0x7FFFE0003FFFF8, + 0x1FFFF8000FFFFC0, + 0x7FFFE0003FFFF00, + 0x3FFFF8000FFFFC00, + 0xFFFFF800FFFFF800, + 0xFFFFFF01FFFFFC01, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFF01FFFFFF, + 0x3FFFFE003FFFFF, + 0x7FFFE0003FFFF8, + 0x1FFFF8000FFFFC0, + 0x7FFFE0003FFFF00, + 0x3FFFF8000FFFFC00, + 0xFFFFF800FFFFF800, + 0xFFFFFF01FFFFFC01, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFF01FFFFFF, + 0x3FFFFE003FFFFF, + 0x7FFFE0003FFFF8, + 0x1FFFF8000FFFFC0, + 0x7FFFE0003FFFF00, + 0x3FFFF8000FFFFC00, + 0xFFFFF800FFFFF800, + 0xFFFFFF01FFFFFC01, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFF83FFFFFF, + 0x3FFFFE003FFFFF, + 0x7FFFF0007FFFF8, + 0x1FFFF8000FFFFC0, + 0x7FFFE0003FFFF00, + 0x3FFFFC001FFFFC00, + 0xFFFFF800FFFFF800, + 0xFFFFFF83FFFFFC01, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFF83FFFFFF, + 0x3FFFFE003FFFFF, + 0x7FFFF0007FFFF8, + 0x1FFFF8000FFFFC0, + 0x7FFFE0003FFFF00, + 0x3FFFFC001FFFFC00, + 0xFFFFF800FFFFF800, + 0xFFFFFF83FFFFFC01, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFF83FFFFFF, + 0x3FFFFE003FFFFF, + 0x7FFFF0007FFFF8, + 0x1FFFF8000FFFFC0, + 0x7FFFE0003FFFF00, + 0x3FFFFC001FFFFC00, + 0xFFFFF800FFFFF800, + 0xFFFFFF83FFFFFC01, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFF83FFFFFF, + 0x3FFFFE003FFFFF, + 0x7FFFF0007FFFF8, + 0x1FFFF8000FFFFC0, + 0x7FFFE0003FFFF00, + 0x3FFFFC001FFFFC00, + 0xFFFFF800FFFFF800, + 0xFFFFFF83FFFFFC01, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFF83FFFFFF, + 0x3FFFFE003FFFFF, + 0x7FFFF0007FFFF8, + 0x1FFFF8000FFFFC0, + 0x7FFFE0003FFFF00, + 0x3FFFFC001FFFFC00, + 0xFFFFF800FFFFF800, + 0xFFFFFF83FFFFFC01, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFFC7FFFFFF, + 0x3FFFFE003FFFFF, + 0xFFFFF0007FFFF8, + 0x1FFFF8000FFFFE0, + 0xFFFFE0003FFFF00, + 0x3FFFFC001FFFFE00, + 0xFFFFF800FFFFF800, + 0xFFFFFFC7FFFFFC01, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x80FFFFFFC7FFFFFF, + 0x7FFFFE003FFFFF, + 0xFFFFF0007FFFFC, + 0x1FFFF8000FFFFE0, + 0xFFFFE0003FFFF00, + 0x7FFFFC001FFFFE00, + 0xFFFFF800FFFFFC00, + 0xFFFFFFC7FFFFFE03, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x80FFFFFFC7FFFFFF, + 0x7FFFFE003FFFFF, + 0xFFFFF0007FFFFC, + 0x1FFFF8000FFFFE0, + 0xFFFFE0003FFFF00, + 0x7FFFFC001FFFFE00, + 0xFFFFF800FFFFFC00, + 0xFFFFFFC7FFFFFE03, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x80FFFFFFEFFFFFFF, + 0x7FFFFF007FFFFF, + 0xFFFFF0007FFFFC, + 0x1FFFFC001FFFFE0, + 0xFFFFF0007FFFF00, + 0x7FFFFC001FFFFE00, + 0xFFFFFC01FFFFFC00, + 0xFFFFFFEFFFFFFE03, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x80FFFFFFFFFFFFFF, + 0x7FFFFF007FFFFF, + 0xFFFFF0007FFFFC, + 0x3FFFFC001FFFFE0, + 0xFFFFF0007FFFF80, + 0x7FFFFC001FFFFE00, + 0xFFFFFC01FFFFFC00, + 0xFFFFFFFFFFFFFE03, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x80FFFFFFFFFFFFFF, + 0x7FFFFF007FFFFF, + 0xFFFFF0007FFFFC, + 0x3FFFFC001FFFFE0, + 0xFFFFF0007FFFF80, + 0x7FFFFC001FFFFE00, + 0xFFFFFC01FFFFFC00, + 0xFFFFFFFFFFFFFE03, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x80FFFFFFFFFFFFFF, + 0x7FFFFF007FFFFF, + 0xFFFFF0007FFFFC, + 0x3FFFFC001FFFFE0, + 0xFFFFF0007FFFF80, + 0x7FFFFC001FFFFE00, + 0xFFFFFC01FFFFFC00, + 0xFFFFFFFFFFFFFE03, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x80FFFFFFFFFFFFFF, + 0x7FFFFF007FFFFF, + 0xFFFFF0007FFFFC, + 0x3FFFFC001FFFFE0, + 0xFFFFF0007FFFF80, + 0x7FFFFC001FFFFE00, + 0xFFFFFC01FFFFFC00, + 0xFFFFFFFFFFFFFE03, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x80FFFFFFFFFFFFFF, + 0x7FFFFF007FFFFF, + 0xFFFFF0007FFFFC, + 0x3FFFFC001FFFFE0, + 0xFFFFF0007FFFF80, + 0x7FFFFC001FFFFE00, + 0xFFFFFC01FFFFFC00, + 0xFFFFFFFFFFFFFE03, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xC1FFFFFFFFFFFFFF, + 0x7FFFFF007FFFFF, + 0xFFFFF800FFFFFC, + 0x3FFFFC001FFFFE0, + 0xFFFFF0007FFFF80, + 0x7FFFFE003FFFFE00, + 0xFFFFFC01FFFFFC00, + 0xFFFFFFFFFFFFFF07, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xC1FFFFFFFFFFFFFF, + 0x7FFFFF007FFFFF, + 0xFFFFF800FFFFFC, + 0x3FFFFC001FFFFE0, + 0xFFFFF0007FFFF80, + 0x7FFFFE003FFFFE00, + 0xFFFFFC01FFFFFC00, + 0xFFFFFFFFFFFFFF07, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xC1FFFFFFFFFFFFFF, + 0x7FFFFF007FFFFF, + 0xFFFFF800FFFFFC, + 0x3FFFFC001FFFFE0, + 0xFFFFF0007FFFF80, + 0x7FFFFE003FFFFE00, + 0xFFFFFC01FFFFFC00, + 0xFFFFFFFFFFFFFF07, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xC1FFFFFFFFFFFFFF, + 0x7FFFFF007FFFFF, + 0xFFFFF800FFFFFC, + 0x3FFFFC001FFFFE0, + 0xFFFFF0007FFFF80, + 0x7FFFFE003FFFFE00, + 0xFFFFFC01FFFFFC00, + 0xFFFFFFFFFFFFFF07, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xC1FFFFFFFFFFFFFF, + 0xFFFFFF80FFFFFF, + 0xFFFFF800FFFFFE, + 0x3FFFFC001FFFFE0, + 0xFFFFF0007FFFF80, + 0xFFFFFE003FFFFE00, + 0xFFFFFE03FFFFFE00, + 0xFFFFFFFFFFFFFF07, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xC1FFFFFFFFFFFFFF, + 0xFFFFFF80FFFFFF, + 0xFFFFF800FFFFFE, + 0x3FFFFC001FFFFE0, + 0xFFFFF0007FFFF80, + 0xFFFFFE003FFFFE00, + 0xFFFFFE03FFFFFE00, + 0xFFFFFFFFFFFFFF07, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xE3FFFFFFFFFFFFFF, + 0xFFFFFF80FFFFFF, + 0x1FFFFF800FFFFFE, + 0x3FFFFC001FFFFF0, + 0x1FFFFF0007FFFF80, + 0xFFFFFE003FFFFF00, + 0xFFFFFE03FFFFFE00, + 0xFFFFFFFFFFFFFF8F, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xE3FFFFFFFFFFFFFF, + 0xFFFFFF80FFFFFF, + 0x1FFFFF800FFFFFE, + 0x3FFFFC001FFFFF0, + 0x1FFFFF0007FFFF80, + 0xFFFFFE003FFFFF00, + 0xFFFFFE03FFFFFE00, + 0xFFFFFFFFFFFFFF8F, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xE3FFFFFFFFFFFFFF, + 0xFFFFFF80FFFFFF, + 0x1FFFFF800FFFFFE, + 0x3FFFFC001FFFFF0, + 0x1FFFFF0007FFFF80, + 0xFFFFFE003FFFFF00, + 0xFFFFFE03FFFFFE00, + 0xFFFFFFFFFFFFFF8F, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xF7FFFFFFFFFFFFFF, + 0xFFFFFF80FFFFFF, + 0x1FFFFF800FFFFFE, + 0x3FFFFE003FFFFF0, + 0x1FFFFF800FFFFF80, + 0xFFFFFE003FFFFF00, + 0xFFFFFE03FFFFFE00, + 0xFFFFFFFFFFFFFFDF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xF7FFFFFFFFFFFFFF, + 0xFFFFFF80FFFFFF, + 0x1FFFFF800FFFFFE, + 0x3FFFFE003FFFFF0, + 0x1FFFFF800FFFFF80, + 0xFFFFFE003FFFFF00, + 0xFFFFFE03FFFFFE00, + 0xFFFFFFFFFFFFFFDF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFF80FFFFFF, + 0x1FFFFF800FFFFFE, + 0x7FFFFE003FFFFF0, + 0x1FFFFF800FFFFFC0, + 0xFFFFFE003FFFFF00, + 0xFFFFFE03FFFFFE00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFF80FFFFFF, + 0x1FFFFF800FFFFFE, + 0x7FFFFE003FFFFF0, + 0x1FFFFF800FFFFFC0, + 0xFFFFFE003FFFFF00, + 0xFFFFFE03FFFFFE00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFC1FFFFFF, + 0x1FFFFFC01FFFFFE, + 0x7FFFFE003FFFFF0, + 0x1FFFFF800FFFFFC0, + 0xFFFFFF007FFFFF00, + 0xFFFFFF07FFFFFE00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFC1FFFFFF, + 0x1FFFFFC01FFFFFE, + 0x7FFFFE003FFFFF0, + 0x1FFFFF800FFFFFC0, + 0xFFFFFF007FFFFF00, + 0xFFFFFF07FFFFFE00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFC1FFFFFF, + 0x1FFFFFC01FFFFFE, + 0x7FFFFE003FFFFF0, + 0x1FFFFF800FFFFFC0, + 0xFFFFFF007FFFFF00, + 0xFFFFFF07FFFFFE00, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1FFFFFFC1FFFFFF, + 0x1FFFFFC01FFFFFF, + 0x7FFFFE003FFFFF0, + 0x1FFFFF800FFFFFC0, + 0xFFFFFF007FFFFF00, + 0xFFFFFF07FFFFFF01, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1FFFFFFC1FFFFFF, + 0x1FFFFFC01FFFFFF, + 0x7FFFFE003FFFFF0, + 0x1FFFFF800FFFFFC0, + 0xFFFFFF007FFFFF00, + 0xFFFFFF07FFFFFF01, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1FFFFFFC1FFFFFF, + 0x1FFFFFC01FFFFFF, + 0x7FFFFE003FFFFF0, + 0x1FFFFF800FFFFFC0, + 0xFFFFFF007FFFFF00, + 0xFFFFFF07FFFFFF01, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1FFFFFFC1FFFFFF, + 0x1FFFFFC01FFFFFF, + 0x7FFFFE003FFFFF0, + 0x1FFFFF800FFFFFC0, + 0xFFFFFF007FFFFF00, + 0xFFFFFF07FFFFFF01, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1FFFFFFE3FFFFFF, + 0x3FFFFFC01FFFFFF, + 0x7FFFFE003FFFFF8, + 0x3FFFFF800FFFFFC0, + 0xFFFFFF007FFFFF80, + 0xFFFFFF8FFFFFFF01, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1FFFFFFE3FFFFFF, + 0x3FFFFFC01FFFFFF, + 0x7FFFFE003FFFFF8, + 0x3FFFFF800FFFFFC0, + 0xFFFFFF007FFFFF80, + 0xFFFFFF8FFFFFFF01, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1FFFFFFE3FFFFFF, + 0x3FFFFFC01FFFFFF, + 0x7FFFFE003FFFFF8, + 0x3FFFFF800FFFFFC0, + 0xFFFFFF007FFFFF80, + 0xFFFFFF8FFFFFFF01, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1FFFFFFE3FFFFFF, + 0x3FFFFFC01FFFFFF, + 0x7FFFFE003FFFFF8, + 0x3FFFFF800FFFFFC0, + 0xFFFFFF007FFFFF80, + 0xFFFFFF8FFFFFFF01, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1FFFFFFE3FFFFFF, + 0x3FFFFFC01FFFFFF, + 0x7FFFFE003FFFFF8, + 0x3FFFFF800FFFFFC0, + 0xFFFFFF007FFFFF80, + 0xFFFFFF8FFFFFFF01, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1FFFFFFF7FFFFFF, + 0x3FFFFFC01FFFFFF, + 0x7FFFFF007FFFFF8, + 0x3FFFFFC01FFFFFC0, + 0xFFFFFF007FFFFF80, + 0xFFFFFFDFFFFFFF01, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x83FFFFFFFFFFFFFF, + 0x3FFFFFE03FFFFFF, + 0xFFFFFF007FFFFF8, + 0x3FFFFFC01FFFFFE0, + 0xFFFFFF80FFFFFF80, + 0xFFFFFFFFFFFFFF83, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x83FFFFFFFFFFFFFF, + 0x3FFFFFE03FFFFFF, + 0xFFFFFF007FFFFF8, + 0x3FFFFFC01FFFFFE0, + 0xFFFFFF80FFFFFF80, + 0xFFFFFFFFFFFFFF83, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x83FFFFFFFFFFFFFF, + 0x3FFFFFE03FFFFFF, + 0xFFFFFF007FFFFF8, + 0x3FFFFFC01FFFFFE0, + 0xFFFFFF80FFFFFF80, + 0xFFFFFFFFFFFFFF83, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x83FFFFFFFFFFFFFF, + 0x3FFFFFE03FFFFFF, + 0xFFFFFF007FFFFF8, + 0x3FFFFFC01FFFFFE0, + 0xFFFFFF80FFFFFF80, + 0xFFFFFFFFFFFFFF83, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x83FFFFFFFFFFFFFF, + 0x3FFFFFE03FFFFFF, + 0xFFFFFF007FFFFF8, + 0x3FFFFFC01FFFFFE0, + 0xFFFFFF80FFFFFF80, + 0xFFFFFFFFFFFFFF83, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x83FFFFFFFFFFFFFF, + 0x3FFFFFE03FFFFFF, + 0xFFFFFF007FFFFF8, + 0x3FFFFFC01FFFFFE0, + 0xFFFFFF80FFFFFF80, + 0xFFFFFFFFFFFFFF83, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x83FFFFFFFFFFFFFF, + 0x3FFFFFE03FFFFFF, + 0xFFFFFF007FFFFF8, + 0x3FFFFFC01FFFFFE0, + 0xFFFFFF80FFFFFF80, + 0xFFFFFFFFFFFFFF83, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x83FFFFFFFFFFFFFF, + 0x3FFFFFE03FFFFFF, + 0xFFFFFF007FFFFF8, + 0x3FFFFFC01FFFFFE0, + 0xFFFFFF80FFFFFF80, + 0xFFFFFFFFFFFFFF83, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x83FFFFFFFFFFFFFF, + 0x3FFFFFE03FFFFFF, + 0xFFFFFF007FFFFF8, + 0x3FFFFFC01FFFFFE0, + 0xFFFFFF80FFFFFF80, + 0xFFFFFFFFFFFFFF83, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xC7FFFFFFFFFFFFFF, + 0x7FFFFFE03FFFFFF, + 0xFFFFFF007FFFFFC, + 0x7FFFFFC01FFFFFE0, + 0xFFFFFF80FFFFFFC0, + 0xFFFFFFFFFFFFFFC7, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xC7FFFFFFFFFFFFFF, + 0x7FFFFFE03FFFFFF, + 0xFFFFFF007FFFFFC, + 0x7FFFFFC01FFFFFE0, + 0xFFFFFF80FFFFFFC0, + 0xFFFFFFFFFFFFFFC7, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xC7FFFFFFFFFFFFFF, + 0x7FFFFFE03FFFFFF, + 0xFFFFFF007FFFFFC, + 0x7FFFFFC01FFFFFE0, + 0xFFFFFF80FFFFFFC0, + 0xFFFFFFFFFFFFFFC7, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xC7FFFFFFFFFFFFFF, + 0x7FFFFFF07FFFFFF, + 0xFFFFFF007FFFFFC, + 0x7FFFFFC01FFFFFE0, + 0xFFFFFFC1FFFFFFC0, + 0xFFFFFFFFFFFFFFC7, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xC7FFFFFFFFFFFFFF, + 0x7FFFFFF07FFFFFF, + 0xFFFFFF007FFFFFC, + 0x7FFFFFC01FFFFFE0, + 0xFFFFFFC1FFFFFFC0, + 0xFFFFFFFFFFFFFFC7, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xEFFFFFFFFFFFFFFF, + 0x7FFFFFF07FFFFFF, + 0xFFFFFF80FFFFFFC, + 0x7FFFFFE03FFFFFE0, + 0xFFFFFFC1FFFFFFC0, + 0xFFFFFFFFFFFFFFEF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xEFFFFFFFFFFFFFFF, + 0x7FFFFFF07FFFFFF, + 0xFFFFFF80FFFFFFC, + 0x7FFFFFE03FFFFFE0, + 0xFFFFFFC1FFFFFFC0, + 0xFFFFFFFFFFFFFFEF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFFF07FFFFFF, + 0x1FFFFFF80FFFFFFC, + 0x7FFFFFE03FFFFFF0, + 0xFFFFFFC1FFFFFFC0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFFF07FFFFFF, + 0x1FFFFFF80FFFFFFC, + 0x7FFFFFE03FFFFFF0, + 0xFFFFFFC1FFFFFFC0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFFF07FFFFFF, + 0x1FFFFFF80FFFFFFC, + 0x7FFFFFE03FFFFFF0, + 0xFFFFFFC1FFFFFFC0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFFF07FFFFFF, + 0x1FFFFFF80FFFFFFC, + 0x7FFFFFE03FFFFFF0, + 0xFFFFFFC1FFFFFFC0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFFF07FFFFFF, + 0x1FFFFFF80FFFFFFC, + 0x7FFFFFE03FFFFFF0, + 0xFFFFFFC1FFFFFFC0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x7FFFFFF07FFFFFF, + 0x1FFFFFF80FFFFFFC, + 0x7FFFFFE03FFFFFF0, + 0xFFFFFFC1FFFFFFC0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFF8FFFFFFF, + 0x1FFFFFF80FFFFFFE, + 0xFFFFFFE03FFFFFF0, + 0xFFFFFFE3FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFF8FFFFFFF, + 0x1FFFFFF80FFFFFFE, + 0xFFFFFFE03FFFFFF0, + 0xFFFFFFE3FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFF8FFFFFFF, + 0x1FFFFFF80FFFFFFE, + 0xFFFFFFE03FFFFFF0, + 0xFFFFFFE3FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFF8FFFFFFF, + 0x1FFFFFF80FFFFFFE, + 0xFFFFFFE03FFFFFF0, + 0xFFFFFFE3FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFF8FFFFFFF, + 0x1FFFFFF80FFFFFFE, + 0xFFFFFFE03FFFFFF0, + 0xFFFFFFE3FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFF8FFFFFFF, + 0x1FFFFFF80FFFFFFE, + 0xFFFFFFE03FFFFFF0, + 0xFFFFFFE3FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFF8FFFFFFF, + 0x1FFFFFF80FFFFFFE, + 0xFFFFFFE03FFFFFF0, + 0xFFFFFFE3FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, + Map { + cells: [ + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFDFFFFFFF, + 0x1FFFFFFC1FFFFFFE, + 0xFFFFFFF07FFFFFF0, + 0xFFFFFFF7FFFFFFE0, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, + 0x1, + ], + }, +]; diff --git a/2019-worms/src/game.rs b/2019-worms/src/game.rs new file mode 100644 index 0000000..00289a0 --- /dev/null +++ b/2019-worms/src/game.rs @@ -0,0 +1,779 @@ +use crate::command::{Action, Command}; +use crate::constants::*; +use crate::geometry::*; +use crate::json; + +mod player; +use player::*; + +mod powerup; +use powerup::*; + +pub mod map; +use map::*; + +use arrayvec::ArrayVec; + +#[derive(Debug, PartialEq, Eq, Clone)] +pub struct GameBoard { + pub round: u16, + pub max_rounds: u16, + pub players: [Player; 2], + pub powerups: ArrayVec<[Powerup; 2]>, + pub map: Map, + pub occupied_cells: ArrayVec<[Point2d; 6]>, + pub outcome: SimulationOutcome, +} + +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +pub enum SimulationOutcome { + PlayerWon(usize), + Draw, + Continue, +} + +impl GameBoard { + pub fn new(json: json::State) -> GameBoard { + let player = Player { + active_worm: json.active_worm_index().unwrap(), + moves_score: json.my_player.score - json.my_player.health_score(), + select_moves: json.my_player.remaining_worm_selections, + worms: json + .my_player + .worms + .iter() + .map(|w| Worm { + id: w.id, + health: w.health, + position: Point2d::new(w.position.x, w.position.y), + rounds_until_unfrozen: w.rounds_until_unfrozen, + bombs: w.banana_bombs.as_ref().map(|b| b.count).unwrap_or(0), + snowballs: w.snowballs.as_ref().map(|b| b.count).unwrap_or(0), + }) + .collect(), + }; + + let opponent = Player { + active_worm: 0, + moves_score: json.opponents[0].score - json.opponents[0].health_score(), + select_moves: json.opponents[0].remaining_worm_selections, + worms: json + .opponents + .iter() + .flat_map(|o| &o.worms) + .map(|w| Worm { + id: w.id, + health: w.health, + position: Point2d::new(w.position.x, w.position.y), + rounds_until_unfrozen: w.rounds_until_unfrozen, + bombs: if w.profession == json::WormType::Agent { + STARTING_BOMBS + } else { + 0 + }, + snowballs: if w.profession == json::WormType::Technologist { + STARTING_SNOWBALLS + } else { + 0 + }, + }) + .collect(), + }; + + let mut map = Map::default(); + for cell in json.map.iter().flatten() { + if cell.cell_type == json::CellType::Dirt { + map.set(Point2d::new(cell.x, cell.y)) + } + } + + let players = [player, opponent]; + let occupied_cells = players + .iter() + .flat_map(|p| p.worms.iter()) + .map(|w| w.position) + .collect(); + + GameBoard { + round: json.current_round, + max_rounds: json.max_rounds, + players, + powerups: json + .map + .iter() + .flatten() + .filter_map(|c| { + c.powerup.as_ref().map(|_p| Powerup { + position: Point2d::new(c.x, c.y), + }) + }) + .collect(), + map, + occupied_cells, + outcome: SimulationOutcome::Continue, + } + } + + pub fn update(&mut self, json: json::State) { + for w in &json.my_player.worms { + if let Some(worm) = self.players[0].find_worm_mut(w.id) { + worm.health = w.health; + worm.position = Point2d::new(w.position.x, w.position.y); + worm.bombs = w.banana_bombs.as_ref().map(|b| b.count).unwrap_or(0); + worm.snowballs = w.snowballs.as_ref().map(|b| b.count).unwrap_or(0); + } + } + for w in json.opponents.iter().flat_map(|o| &o.worms) { + if let Some(worm) = self.players[1].find_worm_mut(w.id) { + worm.health = w.health; + worm.position = Point2d::new(w.position.x, w.position.y); + } + } + + if !self.players[1].active_worm_is_frozen() { + if json + .opponents + .iter() + .any(|o| o.previous_command.starts_with("banana")) + { + for worm in &mut self.players[1].worms { + worm.bombs = worm.bombs.saturating_sub(1); + } + } + if json + .opponents + .iter() + .any(|o| o.previous_command.starts_with("snowball")) + { + for worm in &mut self.players[1].worms { + worm.snowballs = worm.snowballs.saturating_sub(1); + } + } + } + + self.players[0].moves_score = json.my_player.score - json.my_player.health_score(); + self.players[1].moves_score = json.opponents[0].score - json.opponents[0].health_score(); + + self.players[0].select_moves = json.my_player.remaining_worm_selections; + self.players[1].select_moves = json.opponents[0].remaining_worm_selections; + + self.powerups = json + .map + .iter() + .flatten() + .filter_map(|c| { + c.powerup.as_ref().map(|_p| Powerup { + position: Point2d::new(c.x, c.y), + }) + }) + .collect(); + + for cell in json.map.iter().flatten() { + let point = Point2d::new(cell.x, cell.y); + + if cfg!(debug_assertions) { + // This checks if my lava map is the same as the game + // engine's lava map. It's off by one because the game + // engine will update its one at the beginning of + // processing the round. + let lava = LAVA_MAP[self.round as usize]; + + let lava_at = lava.at(point); + // NB: Map hasn't been updated yet, so it can be used to tell previous state. + match (&cell.cell_type, self.map.at(point)) { + (json::CellType::Air, Some(false)) => assert!( + lava_at == Some(false), + "Lava at {:?} expected Some(false), but found {:?}", + point, + lava_at + ), + (json::CellType::Air, _) => assert!( + lava_at.is_some(), + "Lava at {:?} expected Some(_), but found {:?}", + point, + lava_at + ), + (json::CellType::Lava, _) => assert!( + lava_at == Some(true), + "Lava at {:?} expected Some(true), but found {:?}", + point, + lava_at + ), + (json::CellType::DeepSpace, _) => assert!( + lava_at == None, + "Lava at {:?} expected None, but found {:?}", + point, + lava_at + ), + (json::CellType::Dirt, _) => assert!( + lava_at.is_some(), + "Lava at {:?} expected Some(_), but found {:?}", + point, + lava_at + ), + }; + } + + if cell.cell_type == json::CellType::Air { + self.map.clear(point) + } + } + + self.clear_dead_worms(); + self.players[0].active_worm = json.active_worm_index().unwrap_or(0); + self.players[1].active_worm = json.opponent_active_worm_index().unwrap_or(0); + + self.round += 1; + debug_assert_eq!(json.current_round, self.round); + } + + pub fn simulate(&mut self, moves: [Command; 2]) { + self.simulate_worms_on_lava(); + self.simulate_tick_frozen_timers(); + + self.simulate_select(moves); + + let actions = self.identify_actions(moves); + + self.simulate_moves(actions); + self.simulate_digs(actions); + self.simulate_bombs(actions); + self.simulate_shoots(actions); + self.simulate_snowballs(actions); + + self.clear_dead_worms(); + + for player in &mut self.players { + player.next_active_worm(); + } + + self.round += 1; + + self.outcome = match ( + self.players[0].worms.len(), + self.players[1].worms.len(), + self.round > self.max_rounds, + ) { + (0, 0, _) => SimulationOutcome::Draw, + (_, 0, _) => SimulationOutcome::PlayerWon(0), + (0, _, _) => SimulationOutcome::PlayerWon(1), + (_, _, true) => SimulationOutcome::Draw, + _ => SimulationOutcome::Continue, + }; + } + + fn simulate_worms_on_lava(&mut self) { + let lava_map = LAVA_MAP[self.round as usize]; + self.players + .iter_mut() + .flat_map(|p| p.worms.iter_mut()) + .filter(|w| lava_map.at(w.position) == Some(true)) + .for_each(|ref mut w| w.health -= LAVA_DAMAGE); + } + + fn simulate_tick_frozen_timers(&mut self) { + self.players + .iter_mut() + .flat_map(|p| p.worms.iter_mut()) + .filter(|w| w.health > 0) + .for_each(|ref mut w| { + w.rounds_until_unfrozen = w.rounds_until_unfrozen.saturating_sub(1) + }); + } + + fn identify_actions(&self, moves: [Command; 2]) -> [Action; 2] { + let mut it = self.players.iter().zip(moves.iter()).map(|(p, m)| { + if p.active_worm_is_frozen() { + Action::DoNothing + } else { + m.action + } + }); + [it.next().unwrap(), it.next().unwrap()] + } + + fn simulate_select(&mut self, moves: [Command; 2]) { + moves + .iter() + .zip(self.players.iter_mut()) + .filter(|(_m, player)| !player.active_worm_is_frozen()) + .for_each(|(m, player)| { + if let Some(worm) = m.worm { + debug_assert!( + player.select_moves > 0, + "Could not make select move, out of select tokens" + ); + player.select_moves = player.select_moves.saturating_sub(1); + player.active_worm = player.find_worm_position(worm).unwrap_or(0); + } + }); + } + + fn simulate_moves(&mut self, actions: [Action; 2]) { + match actions { + [Action::Move(p1), Action::Move(p2)] if p1.x == p2.x && p1.y == p2.y => { + let damage = COLLISION_DAMAGE; + + debug_assert_eq!( + Some(false), + self.map.at(Point2d::new(p1.x, p1.y)), + "Movement target wasn't empty, ({}, {})", + p1.x, + p1.y + ); + // Worms have a 50% chance of swapping places + // here. I'm treating that as an edge case that I + // don't need to handle for now. + for player in &mut self.players { + if let Some(worm) = player.active_worm_mut() { + worm.health -= damage; + } + // You might expect damage score too here, but nope + player.moves_score += MOVE_SCORE; + } + } + _ => { + for player_index in 0..actions.len() { + if let Action::Move(p) = actions[player_index] { + debug_assert_eq!( + Some(false), + self.map.at(p), + "Movement target wasn't empty, ({}, {})", + p.x, + p.y + ); + + self.players[player_index].moves_score += MOVE_SCORE; + + if let Some(worm) = self.players[player_index].active_worm_mut() { + debug_assert!( + (worm.position.x - p.x).abs() <= 1 + && (worm.position.y - p.y).abs() <= 1, + "Tried to move too far away, ({}, {})", + p.x, + p.y + ); + + worm.position = p; + + self.powerups.retain(|power| { + if power.position == worm.position { + worm.health += HEALTH_PACK_VALUE; + false + } else { + true + } + }); + } + } + } + } + } + } + + fn simulate_digs(&mut self, actions: [Action; 2]) { + for player_index in 0..actions.len() { + if let Action::Dig(p) = actions[player_index] { + debug_assert!( + Some(true) == self.map.at(p) + || (player_index == 1 && actions[0] == Action::Dig(p)), + "Tried to dig through air, ({}, {})", + p.x, + p.y + ); + debug_assert! { + (self.players[player_index].active_worm().unwrap().position.x - p.x).abs() <= 1 && + (self.players[player_index].active_worm().unwrap().position.y - p.y).abs() <= 1, + "Tried to dig too far away, ({}, {})", p.x, p.y + }; + + self.players[player_index].moves_score += DIG_SCORE; + + self.map.clear(p); + } + } + } + + fn simulate_bombs(&mut self, actions: [Action; 2]) { + // NB: Damage radius has the cell distance rounded UP, throwing range has the cell distance rounded DOWN + + let map_clone: Map = self.map; + + for player_index in 0..actions.len() { + if let Action::Bomb(p) = actions[player_index] { + if self.map.at(p).is_some() { + if let Some(worm) = self.players[player_index].active_worm_mut() { + debug_assert!(worm.bombs > 0, "Worm is throwing a bomb it doesn't have"); + debug_assert!((worm.position - p).magnitude_squared() < 6 * 6); // max range is 5, but it's 5 after rounding down + + worm.bombs = worm.bombs.saturating_sub(1); + + for &(damage_offset, weapon_damage) in BOMB_DAMAGES.iter() { + let target = p + damage_offset; + + if map_clone.at(target) == Some(true) { + self.map.clear(target); + self.players[player_index].moves_score += DIG_SCORE; + } + self.powerups.retain(|powerup| powerup.position != target); + + let target_own_worm: Option<&mut Worm> = self.players[player_index] + .worms + .iter_mut() + .find(|w| w.position == target); + + if let Some(target_worm) = target_own_worm { + target_worm.health -= weapon_damage; + self.players[player_index].moves_score -= + weapon_damage * ATTACK_SCORE_MULTIPLIER; + if target_worm.health <= 0 { + self.players[player_index].moves_score -= KILL_SCORE; + } + } + + let target_opponent_worm: Option<&mut Worm> = self.players + [GameBoard::opponent(player_index)] + .worms + .iter_mut() + .find(|w| w.position == target); + if let Some(target_worm) = target_opponent_worm { + target_worm.health -= weapon_damage; + self.players[player_index].moves_score += + weapon_damage * ATTACK_SCORE_MULTIPLIER; + if target_worm.health <= 0 { + self.players[player_index].moves_score += KILL_SCORE; + } + } + } + } + } + } + } + } + + pub fn simulate_snowballs(&mut self, actions: [Action; 2]) { + for player_index in 0..actions.len() { + if let Action::Snowball(p) = actions[player_index] { + if self.map.at(p).is_some() { + if let Some(worm) = self.players[player_index].active_worm_mut() { + debug_assert!( + worm.snowballs > 0, + "Worm is throwing a snowball it doesn't have" + ); + debug_assert!((worm.position - p).magnitude_squared() < 6 * 6); // max range is 5, but it's 5 after rounding down + + worm.snowballs = worm.snowballs.saturating_sub(1); + + for &freeze_offset in SNOWBALL_FREEZES.iter() { + let target = p + freeze_offset; + + let target_own_worm: Option<&mut Worm> = self.players[player_index] + .worms + .iter_mut() + .find(|w| w.position == target); + + if let Some(target_worm) = target_own_worm { + target_worm.rounds_until_unfrozen = FREEZE_DURATION; + self.players[player_index].moves_score -= FREEZE_SCORE; + } + + let target_opponent_worm: Option<&mut Worm> = self.players + [GameBoard::opponent(player_index)] + .worms + .iter_mut() + .find(|w| w.position == target); + if let Some(target_worm) = target_opponent_worm { + target_worm.rounds_until_unfrozen = FREEZE_DURATION; + self.players[player_index].moves_score += FREEZE_SCORE; + } + } + } + } + } + } + } + + fn simulate_shoots(&mut self, actions: [Action; 2]) { + 'players_loop: for player_index in 0..actions.len() { + if let Action::Shoot(dir) = actions[player_index] { + if let Some(worm) = self.players[player_index].active_worm() { + let center = worm.position; + let diff = dir.as_vec(); + + let range = if dir.is_diagonal() { + SHOOT_RANGE_DIAGONAL + } else { + SHOOT_RANGE + }; + + for distance in 1..=range { + let target = center + diff * distance; + match self.map.at(target) { + Some(false) => { + let target_own_worm: Option<&mut Worm> = self.players[player_index] + .worms + .iter_mut() + .find(|w| w.position == target); + + if let Some(target_worm) = target_own_worm { + target_worm.health -= SHOOT_DAMAGE; + self.players[player_index].moves_score -= + SHOOT_DAMAGE * ATTACK_SCORE_MULTIPLIER; + if target_worm.health <= 0 { + self.players[player_index].moves_score -= KILL_SCORE; + } + continue 'players_loop; + } + + let target_opponent_worm: Option<&mut Worm> = self.players + [GameBoard::opponent(player_index)] + .worms + .iter_mut() + .find(|w| w.position == target); + + if let Some(target_worm) = target_opponent_worm { + target_worm.health -= SHOOT_DAMAGE; + self.players[player_index].moves_score += + SHOOT_DAMAGE * ATTACK_SCORE_MULTIPLIER; + if target_worm.health <= 0 { + self.players[player_index].moves_score += KILL_SCORE; + } + + continue 'players_loop; + } + } + _ => break, + } + } + + // You get here if the shot missed. Hits are an early return. + self.players[player_index].moves_score += MISSED_ATTACK_SCORE; + } + } + } + } + + fn clear_dead_worms(&mut self) { + for player in &mut self.players { + player.clear_dead_worms(); + } + + self.occupied_cells = self + .players + .iter() + .flat_map(|p| p.worms.iter()) + .map(|w| w.position) + .collect(); + } + + pub fn opponent(player_index: usize) -> usize { + (player_index + 1) % 2 + } + + fn selects_iter(&self, player_index: usize) -> impl Iterator, &Worm)> { + let no_select = self.players[player_index] + .active_worm() + .into_iter() + .map(|w| (None, w)); + + let has_select_moves = self.players[player_index].select_moves > 0; + let active_worm_index = self.players[player_index].active_worm; + let selects = self.players[player_index] + .worms + .iter() + .enumerate() + .filter(move |(p, _w)| has_select_moves && active_worm_index != *p) + .map(|(_p, w)| (Some(w.id), w)); + + no_select.chain(selects) + } + + fn pruned_valid_move_commands(&self, player_index: usize) -> ArrayVec<[Command; 8]> { + self.players[player_index] + .active_worm() + .into_iter() + .flat_map(|worm| { + // TODO: If you aren't on lava, don't step onto the lava + Direction::ALL + .iter() + .map(Direction::as_vec) + .map(move |d| worm.position + d) + .filter(|p| !self.occupied_cells.contains(p)) + .filter_map(|p| match self.map.at(p) { + Some(false) => Some(Action::Move(p)), + Some(true) => Some(Action::Dig(p)), + _ => None, + }) + .map(Command::new) + }) + .collect() + } + + fn pruned_valid_bomb_commands(&self, player_index: usize) -> Vec { + self.selects_iter(player_index) + .filter(|(_, worm)| worm.bombs > 0) + .flat_map(|(select, worm)| { + let mut result = Vec::with_capacity((BOMB_RANGE * 2 + 1).pow(2) as usize - 12); + let own_worm_positions: ArrayVec<[Point2d; 3]> = self.players[player_index] + .worms + .iter() + .map(|w| w.position) + .collect(); + let opponent_worm_positions: ArrayVec<[Point2d; 3]> = self.players + [GameBoard::opponent(player_index)] + .worms + .iter() + .map(|w| w.position) + .collect(); + + for y in worm.position.y - BOMB_RANGE..=worm.position.y + BOMB_RANGE { + for x in worm.position.x - BOMB_RANGE..=worm.position.x + BOMB_RANGE { + let target = Point2d::new(x, y); + if self.map.at(target).is_some() + && (worm.position - target).magnitude_squared() + < (BOMB_RANGE + 1).pow(2) + { + let own_affected_worms = own_worm_positions.iter().any(|p| { + (target - *p).magnitude_squared() + <= BOMB_DAMAGE_RANGE * BOMB_DAMAGE_RANGE + }); + let opponent_affected_worms = opponent_worm_positions.iter().any(|p| { + (target - *p).magnitude_squared() + <= BOMB_DAMAGE_RANGE * BOMB_DAMAGE_RANGE + }); + + if !own_affected_worms && opponent_affected_worms { + result.push(Command { + worm: select, + action: Action::Bomb(target), + }); + } + } + } + } + + result + }) + .collect() + } + + fn pruned_valid_snowball_commands(&self, player_index: usize) -> Vec { + self.selects_iter(player_index) + .filter(|(_, worm)| worm.snowballs > 0) + .flat_map(|(select, worm)| { + let mut result = Vec::with_capacity((SNOWBALL_RANGE * 2 + 1).pow(2) as usize - 12); + let own_worm_positions: ArrayVec<[Point2d; 3]> = self.players[player_index] + .worms + .iter() + .map(|w| w.position) + .collect(); + let opponent_worm_positions: ArrayVec<[Point2d; 3]> = self.players + [GameBoard::opponent(player_index)] + .worms + .iter() + .map(|w| w.position) + .collect(); + + for y in worm.position.y - SNOWBALL_RANGE..=worm.position.y + SNOWBALL_RANGE { + for x in worm.position.x - SNOWBALL_RANGE..=worm.position.x + SNOWBALL_RANGE { + let target = Point2d::new(x, y); + if self.map.at(target).is_some() + && (worm.position - target).magnitude_squared() + < (SNOWBALL_RANGE + 1).pow(2) + { + let own_affected_worms = own_worm_positions.iter().any(|p| { + (target - *p).magnitude_squared() + <= SNOWBALL_FREEZE_RANGE * SNOWBALL_FREEZE_RANGE + }); + let opponent_affected_worms = opponent_worm_positions.iter().any(|p| { + (target - *p).magnitude_squared() + <= SNOWBALL_FREEZE_RANGE * SNOWBALL_FREEZE_RANGE + }); + + if !own_affected_worms && opponent_affected_worms { + result.push(Command { + worm: select, + action: Action::Snowball(target), + }); + } + } + } + } + + result + }) + .collect() + } + + fn pruned_valid_shoot_commands(&self, player_index: usize) -> Vec { + self.selects_iter(player_index) + .flat_map(|(select, worm)| { + self.players[GameBoard::opponent(player_index)] + .worms + .iter() + .filter_map(move |w| { + let diff = w.position - worm.position; + if diff.x == 0 && diff.y.abs() <= SHOOT_RANGE { + if diff.y > 0 { + Some((Direction::South, diff.y)) + } else { + Some((Direction::North, -diff.y)) + } + } else if diff.y == 0 && diff.x.abs() <= SHOOT_RANGE { + if diff.x > 0 { + Some((Direction::East, diff.x)) + } else { + Some((Direction::West, -diff.x)) + } + } else if diff.x.abs() == diff.y.abs() + && diff.x.abs() <= SHOOT_RANGE_DIAGONAL + { + match (diff.x > 0, diff.y > 0) { + (true, true) => Some((Direction::SouthEast, diff.x)), + (false, true) => Some((Direction::SouthWest, -diff.x)), + (true, false) => Some((Direction::NorthEast, diff.x)), + (false, false) => Some((Direction::NorthWest, -diff.x)), + } + } else { + None + } + }) + .filter(move |(dir, range)| { + let diff = dir.as_vec(); + // NB: This is up to range EXCLUSIVE, so if there's + // anything in the way, even another good shot, skip. + !(1..*range).any(|distance| { + self.map.at(worm.position + diff * distance) != Some(false) + && !self + .players + .iter() + .flat_map(|p| p.worms.iter()) + .any(|w| w.position == worm.position + diff * distance) + }) + }) + .map(move |(dir, _range)| Command { + worm: select, + action: Action::Shoot(dir), + }) + }) + .collect() + } + + pub fn pruned_valid_moves(&self, player_index: usize) -> Vec { + if self.players[player_index].active_worm_is_frozen_after_tick() { + vec![Command::new(Action::DoNothing)] + } else { + self.pruned_valid_shoot_commands(player_index) + .iter() + .chain(self.pruned_valid_move_commands(player_index).iter()) + .chain(self.pruned_valid_bomb_commands(player_index).iter()) + .chain(self.pruned_valid_snowball_commands(player_index).iter()) + .chain([Command::new(Action::DoNothing)].iter()) + .cloned() + .collect() + } + } +} + +#[cfg(test)] +mod test {} diff --git a/2019-worms/src/game/map.rs b/2019-worms/src/game/map.rs new file mode 100644 index 0000000..84ec99a --- /dev/null +++ b/2019-worms/src/game/map.rs @@ -0,0 +1,49 @@ +use crate::constants::*; +use crate::geometry::*; + +#[derive(Default, Debug, PartialEq, Eq, Clone, Copy)] +pub struct Map { + pub cells: [u64; MAP_U64S], +} + +impl Map { + fn internal_index(p: Point2d) -> Option<(usize, usize)> { + if p.y < 0 || p.y as usize >= MAP_SIZE { + None + } else { + let row_data = &MAP_ROW_SIZE[p.y as usize]; + if p.x < row_data.x_offset as i8 || p.x as usize >= row_data.x_offset + row_data.len() { + None + } else { + let global_bit = row_data.start_bit + p.x as usize - row_data.x_offset; + let integer = global_bit / 64; + let bit = global_bit % 64; + Some((integer, bit)) + } + } + } + + pub fn at(&self, p: Point2d) -> Option { + Map::internal_index(p).map(|(integer, bit)| { + let mask = 1 << bit; + self.cells[integer] & mask != 0 + }) + } + + pub fn set(&mut self, p: Point2d) { + if let Some((integer, bit)) = Map::internal_index(p) { + let mask = 1 << bit; + self.cells[integer] |= mask; + } else { + panic!("Tried to set an out of bounds bit, {:?}", p); + } + } + pub fn clear(&mut self, p: Point2d) { + if let Some((integer, bit)) = Map::internal_index(p) { + let mask = !(1 << bit); + self.cells[integer] &= mask; + } else { + panic!("Tried to set an out of bounds bit, {:?}", p); + } + } +} diff --git a/2019-worms/src/game/player.rs b/2019-worms/src/game/player.rs new file mode 100644 index 0000000..0874c76 --- /dev/null +++ b/2019-worms/src/game/player.rs @@ -0,0 +1,259 @@ +use crate::geometry::*; +use arrayvec::ArrayVec; + +#[derive(Debug, PartialEq, Eq, Clone)] +pub struct Player { + pub moves_score: i32, + pub active_worm: usize, + pub select_moves: u8, + pub worms: ArrayVec<[Worm; 3]>, +} + +#[derive(Debug, PartialEq, Eq, Clone)] +pub struct Worm { + pub id: i32, + pub health: i32, + pub position: Point2d, + pub bombs: u8, + pub snowballs: u8, + pub rounds_until_unfrozen: u8, +} + +impl Player { + pub fn find_worm_position(&self, id: i32) -> Option { + self.worms.iter().position(|w| w.id == id) + } + + pub fn find_worm(&self, id: i32) -> Option<&Worm> { + self.worms.iter().find(|w| w.id == id) + } + + pub fn find_worm_mut(&mut self, id: i32) -> Option<&mut Worm> { + self.worms.iter_mut().find(|w| w.id == id) + } + + pub fn active_worm(&self) -> Option<&Worm> { + self.worms.get(self.active_worm) + } + + pub fn active_worm_mut(&mut self) -> Option<&mut Worm> { + self.worms.get_mut(self.active_worm) + } + + pub fn health(&self) -> i32 { + self.worms.iter().map(|w| w.health).sum() + } + + pub fn max_worm_health(&self) -> i32 { + self.worms.iter().map(|w| w.health).max().unwrap_or(0) + } + + pub fn clear_dead_worms(&mut self) { + for worm_index in (0..self.worms.len()).rev() { + if self.worms[worm_index].health <= 0 { + self.worms.remove(worm_index); + if self.active_worm >= worm_index { + self.active_worm = if self.active_worm > 0 { + self.active_worm - 1 + } else if self.worms.len() > 0 { + self.worms.len() - 1 + } else { + 0 + }; + } + } + } + } + + pub fn next_active_worm(&mut self) { + self.active_worm = (self.active_worm + 1) + .checked_rem(self.worms.len()) + .unwrap_or(0); + } + + fn health_score(&self) -> i32 { + self.health() / 3 + } + + pub fn score(&self) -> i32 { + self.moves_score + self.health_score() + } + + pub fn active_worm_is_frozen(&self) -> bool { + self.active_worm() + .map(|worm| worm.rounds_until_unfrozen > 0) + .unwrap_or(false) + } + + pub fn active_worm_is_frozen_after_tick(&self) -> bool { + self.active_worm() + .map(|worm| worm.rounds_until_unfrozen > 1) + .unwrap_or(false) + } + + pub fn bombs(&self) -> u8 { + self.worms.iter().map(|w| w.bombs).sum() + } + + pub fn snowballs(&self) -> u8 { + self.worms.iter().map(|w| w.snowballs).sum() + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn clear_dead_worms_after_active_worm() { + let mut worms = ArrayVec::new(); + worms.push(Worm { + id: 1, + health: 50, + position: Point2d::new(0, 0), + rounds_until_unfrozen: 0, + bombs: 0, + snowballs: 0, + }); + worms.push(Worm { + id: 2, + health: 10, + position: Point2d::new(0, 0), + rounds_until_unfrozen: 0, + bombs: 0, + snowballs: 0, + }); + worms.push(Worm { + id: 3, + health: -2, + position: Point2d::new(0, 0), + rounds_until_unfrozen: 0, + bombs: 0, + snowballs: 0, + }); + let mut player = Player { + active_worm: 1, + moves_score: 0, + select_moves: 0, + worms, + }; + + player.clear_dead_worms(); + + assert_eq!(2, player.worms.len()); + assert_eq!(1, player.active_worm); + + assert_eq!(1, player.worms[0].id); + assert_eq!(2, player.worms[1].id); + } + + #[test] + fn clear_dead_worms_before_active_worm() { + let mut worms = ArrayVec::new(); + worms.push(Worm { + id: 1, + health: 0, + position: Point2d::new(0, 0), + rounds_until_unfrozen: 0, + bombs: 0, + snowballs: 0, + }); + worms.push(Worm { + id: 2, + health: 10, + position: Point2d::new(0, 0), + rounds_until_unfrozen: 0, + bombs: 0, + snowballs: 0, + }); + worms.push(Worm { + id: 3, + health: 2, + position: Point2d::new(0, 0), + rounds_until_unfrozen: 0, + bombs: 0, + snowballs: 0, + }); + let mut player = Player { + active_worm: 1, + moves_score: 0, + worms, + select_moves: 0, + }; + + player.clear_dead_worms(); + + assert_eq!(2, player.worms.len()); + assert_eq!(0, player.active_worm); + + assert_eq!(2, player.worms[0].id); + assert_eq!(3, player.worms[1].id); + } + + #[test] + fn clear_dead_worms_before_active_worm_wrapping() { + let mut worms = ArrayVec::new(); + worms.push(Worm { + id: 1, + health: 0, + position: Point2d::new(0, 0), + rounds_until_unfrozen: 0, + bombs: 0, + snowballs: 0, + }); + worms.push(Worm { + id: 2, + health: 10, + position: Point2d::new(0, 0), + rounds_until_unfrozen: 0, + bombs: 0, + snowballs: 0, + }); + worms.push(Worm { + id: 3, + health: 2, + position: Point2d::new(0, 0), + rounds_until_unfrozen: 0, + bombs: 0, + snowballs: 0, + }); + let mut player = Player { + active_worm: 0, + moves_score: 0, + worms, + select_moves: 0, + }; + + player.clear_dead_worms(); + + assert_eq!(2, player.worms.len()); + assert_eq!(1, player.active_worm); + + assert_eq!(2, player.worms[0].id); + assert_eq!(3, player.worms[1].id); + } + + #[test] + fn clear_last_dead_worm() { + let mut worms = ArrayVec::new(); + worms.push(Worm { + id: 1, + health: -10, + position: Point2d::new(0, 0), + rounds_until_unfrozen: 0, + bombs: 0, + snowballs: 0, + }); + let mut player = Player { + active_worm: 0, + moves_score: 0, + worms, + select_moves: 0, + }; + + player.clear_dead_worms(); + + assert_eq!(0, player.worms.len()); + // active worm is undefined in this case, but clearing the worms must not panic. + } +} diff --git a/2019-worms/src/game/powerup.rs b/2019-worms/src/game/powerup.rs new file mode 100644 index 0000000..47e73a1 --- /dev/null +++ b/2019-worms/src/game/powerup.rs @@ -0,0 +1,6 @@ +use crate::geometry::*; + +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +pub struct Powerup { + pub position: Point2d, +} diff --git a/2019-worms/src/geometry.rs b/2019-worms/src/geometry.rs new file mode 100644 index 0000000..1bcdace --- /dev/null +++ b/2019-worms/src/geometry.rs @@ -0,0 +1,6 @@ +mod vec; +pub use self::vec::*; +mod point; +pub use self::point::*; +mod direction; +pub use self::direction::*; diff --git a/2019-worms/src/geometry/direction.rs b/2019-worms/src/geometry/direction.rs new file mode 100644 index 0000000..e37f750 --- /dev/null +++ b/2019-worms/src/geometry/direction.rs @@ -0,0 +1,67 @@ +use crate::geometry::vec::Vec2d; +use std::fmt; + +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub enum Direction { + North, + NorthEast, + East, + SouthEast, + South, + SouthWest, + West, + NorthWest, +} + +impl fmt::Display for Direction { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + use Direction::*; + let s = match self { + North => "N", + NorthEast => "NE", + East => "E", + SouthEast => "SE", + South => "S", + SouthWest => "SW", + West => "W", + NorthWest => "NW", + }; + f.write_str(s) + } +} + +impl Direction { + pub fn is_diagonal(&self) -> bool { + use Direction::*; + + match self { + NorthEast | SouthEast | SouthWest | NorthWest => true, + _ => false, + } + } + + pub fn as_vec(&self) -> Vec2d { + use Direction::*; + match self { + North => Vec2d::new(0, -1), + NorthEast => Vec2d::new(1, -1), + East => Vec2d::new(1, 0), + SouthEast => Vec2d::new(1, 1), + South => Vec2d::new(0, 1), + SouthWest => Vec2d::new(-1, 1), + West => Vec2d::new(-1, 0), + NorthWest => Vec2d::new(-1, -1), + } + } + + pub const ALL: [Direction; 8] = [ + Direction::North, + Direction::NorthEast, + Direction::East, + Direction::SouthEast, + Direction::South, + Direction::SouthWest, + Direction::West, + Direction::NorthWest, + ]; +} diff --git a/2019-worms/src/geometry/point.rs b/2019-worms/src/geometry/point.rs new file mode 100644 index 0000000..1ab9b36 --- /dev/null +++ b/2019-worms/src/geometry/point.rs @@ -0,0 +1,37 @@ +use crate::geometry::vec::*; + +use std::ops::*; + +#[derive(Debug, Default, Clone, Copy, Hash, PartialEq, Eq)] +pub struct Point2d { + pub x: i8, + pub y: i8, +} + +impl Point2d { + pub fn new(x: i8, y: i8) -> Point2d { + Point2d { x, y } + } +} + +impl Add for Point2d { + type Output = Self; + + fn add(self, other: Vec2d) -> Self { + Point2d { + x: self.x.saturating_add(other.x), + y: self.y.saturating_add(other.y), + } + } +} + +impl Sub for Point2d { + type Output = Vec2d; + + fn sub(self, other: Self) -> Vec2d { + Vec2d { + x: self.x.saturating_sub(other.x), + y: self.y.saturating_sub(other.y), + } + } +} diff --git a/2019-worms/src/geometry/vec.rs b/2019-worms/src/geometry/vec.rs new file mode 100644 index 0000000..375a0f9 --- /dev/null +++ b/2019-worms/src/geometry/vec.rs @@ -0,0 +1,62 @@ +use std::ops::*; + +#[derive(Debug, Default, Clone, Copy, Hash, PartialEq, Eq)] +pub struct Vec2d { + pub x: i8, + pub y: i8, +} + +impl Vec2d { + pub const fn new(x: i8, y: i8) -> Vec2d { + Vec2d { x, y } + } + pub fn magnitude_squared(&self) -> i8 { + self.x + .saturating_pow(2) + .saturating_add(self.y.saturating_pow(2)) + } +} + +impl Add for Vec2d { + type Output = Self; + + fn add(self, other: Self) -> Self { + Vec2d { + x: self.x.saturating_add(other.x), + y: self.y.saturating_add(other.y), + } + } +} + +impl Sub for Vec2d { + type Output = Self; + + fn sub(self, other: Self) -> Self { + Vec2d { + x: self.x.saturating_sub(other.x), + y: self.y.saturating_sub(other.y), + } + } +} + +impl Mul for Vec2d { + type Output = Self; + + fn mul(self, other: i8) -> Self { + Vec2d { + x: self.x.saturating_mul(other), + y: self.y.saturating_mul(other), + } + } +} + +impl Neg for Vec2d { + type Output = Self; + + fn neg(self) -> Self { + Vec2d { + x: -self.x, + y: -self.y, + } + } +} diff --git a/2019-worms/src/json.rs b/2019-worms/src/json.rs new file mode 100644 index 0000000..a83f102 --- /dev/null +++ b/2019-worms/src/json.rs @@ -0,0 +1,554 @@ +use std::error::Error; +use std::fs::File; +use std::io::prelude::*; +use std::path::Path; + +use serde::{Deserialize, Serialize}; +use serde_json; + +pub fn read_state_from_json_file(filename: &Path) -> Result> { + let mut file = File::open(filename)?; + let mut content = String::new(); + file.read_to_string(&mut content)?; + let state: State = serde_json::from_str(content.as_ref())?; + + Ok(state) +} + +// TODO: Narrow numeric types +// TODO: comment out stuff I don't want / need + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct State { + pub current_round: u16, + pub max_rounds: u16, + pub pushback_damage: i32, + pub lava_damage: i32, + pub map_size: u8, + pub current_worm_id: i32, + pub consecutive_do_nothing_count: u32, + pub my_player: Player, + pub opponents: Vec, + pub map: Vec>, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct Player { + pub id: i32, + pub score: i32, + pub health: i32, + pub worms: Vec, + pub remaining_worm_selections: u8, +} + +impl Player { + pub fn health_score(&self) -> i32 { + self.health / 3 + } +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct PlayerWorm { + pub id: i32, + pub health: i32, + pub position: Position, + pub digging_range: u32, + pub movement_range: u32, + pub rounds_until_unfrozen: u8, + pub weapon: Weapon, + pub banana_bombs: Option, + pub snowballs: Option, + pub profession: WormType, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct Opponent { + pub id: i32, + pub score: i32, + pub current_worm_id: i32, + pub previous_command: String, + pub worms: Vec, + pub remaining_worm_selections: u8, +} + +impl Opponent { + pub fn health_score(&self) -> i32 { + self.worms.iter().map(|w| w.health).sum::() / 3 + } +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct OpponentWorm { + pub id: i32, + pub health: i32, + pub position: Position, + pub digging_range: u32, + pub movement_range: u32, + pub rounds_until_unfrozen: u8, + pub profession: WormType, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +#[serde(rename_all = "PascalCase")] +pub enum WormType { + Commando, + Agent, + Technologist, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct Cell { + pub x: i8, + pub y: i8, + #[serde(rename = "type")] + pub cell_type: CellType, + pub occupier: Option, + pub powerup: Option, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +pub enum CellType { + Air, + Dirt, + Lava, + DeepSpace, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +#[serde(untagged)] +#[serde(rename_all = "camelCase")] +pub enum CellWorm { + #[serde(rename_all = "camelCase")] + PlayerWorm { + id: i32, + player_id: i32, + health: i32, + position: Position, + digging_range: u32, + movement_range: u32, + weapon: Weapon, + }, + #[serde(rename_all = "camelCase")] + OpponentWorm { + id: i32, + player_id: i32, + health: i32, + position: Position, + digging_range: u32, + movement_range: u32, + }, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct Powerup { + #[serde(rename = "type")] + pub powerup_type: PowerupType, + pub value: i32, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +pub enum PowerupType { + HealthPack, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct Position { + pub x: i8, + pub y: i8, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct Weapon { + pub damage: i32, + pub range: u8, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct Bomb { + pub damage: i32, + pub range: u8, + pub count: u8, + pub damage_radius: u8, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct Snowball { + pub freeze_duration: u8, + pub range: u8, + pub count: u8, + pub freeze_radius: u8, +} + +impl State { + pub fn active_worm_index(&self) -> Option { + self.my_player + .worms + .iter() + .filter(|w| w.health > 0) + .position(|w| w.id == self.current_worm_id) + } + + pub fn opponent_active_worm_index(&self) -> Option { + self.opponents[0] + .worms + .iter() + .filter(|w| w.health > 0) + .position(|w| w.id == self.opponents[0].current_worm_id) + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn example_parses_correctly() { + let example = r#" +{ + "currentRound": 0, + "maxRounds": 200, + "pushbackDamage": 20, + "lavaDamage": 3, + "mapSize": 33, + "currentWormId": 1, + "consecutiveDoNothingCount": 0, + "myPlayer": { + "id": 1, + "score": 100, + "health": 300, + "currentWormId": 1, + "remainingWormSelections": 1, + "worms": [ + { + "id": 1, + "health": 100, + "position": { + "x": 24, + "y": 29 + }, + "weapon": { + "damage": 1, + "range": 3 + }, + "bananaBombs": { + "damage": 20, + "range": 5, + "count": 3, + "damageRadius": 2 + }, + "diggingRange": 1, + "movementRange": 1, + "roundsUntilUnfrozen": 0, + "profession": "Agent" + }, + { + "id": 2, + "health": 150, + "position": { + "x": 1, + "y": 16 + }, + "weapon": { + "damage": 1, + "range": 3 + }, + "diggingRange": 1, + "movementRange": 1, + "roundsUntilUnfrozen": 0, + "profession": "Commando" + }, + { + "id": 3, + "health": 100, + "position": { + "x": 24, + "y": 4 + }, + "weapon": { + "damage": 8, + "range": 4 + }, + "snowballs": { + "freezeDuration": 5, + "range": 5, + "count": 3, + "freezeRadius": 1 + }, + "diggingRange": 1, + "movementRange": 1, + "roundsUntilUnfrozen": 3, + "profession": "Technologist" + } + ] + }, + "opponents": [ + { + "id": 2, + "score": 100, + "currentWormId": 3, + "remainingWormSelections": 2, + "previousCommand": "nothing", + "worms": [ + { + "id": 1, + "health": 100, + "position": { + "x": 31, + "y": 16 + }, + "diggingRange": 1, + "movementRange": 1, + "roundsUntilUnfrozen": 0, + "profession": "Commando" + } + ] + } + ], + "map": [ + [ + { + "x": 0, + "y": 0, + "type": "DEEP_SPACE" + }, + { + "x": 1, + "y": 0, + "type": "AIR" + }, + { + "x": 2, + "y": 0, + "type": "DIRT" + } + ], + [ + { + "x": 0, + "y": 1, + "type": "AIR", + "powerup": { + "type": "HEALTH_PACK", + "value": 5 + } + }, + { + "x": 1, + "y": 1, + "type": "AIR", + "occupier": { + "id": 1, + "playerId": 2, + "health": 100, + "position": { + "x": 1, + "y": 1 + }, + "diggingRange": 1, + "movementRange": 1 + } + }, + { + "x": 2, + "y": 1, + "type": "AIR", + "occupier": { + "id": 1, + "playerId": 1, + "health": 100, + "position": { + "x": 2, + "y": 1 + }, + "weapon": { + "damage": 1, + "range": 3 + }, + "diggingRange": 1, + "movementRange": 1 + } + } + ] + ] +}"#; + + let expected = State { + current_round: 0, + max_rounds: 200, + pushback_damage: 20, + lava_damage: 3, + map_size: 33, + current_worm_id: 1, + consecutive_do_nothing_count: 0, + my_player: Player { + id: 1, + score: 100, + health: 300, + remaining_worm_selections: 1, + worms: vec![ + PlayerWorm { + id: 1, + health: 100, + position: Position { x: 24, y: 29 }, + weapon: Weapon { + damage: 1, + range: 3, + }, + digging_range: 1, + movement_range: 1, + banana_bombs: Some(Bomb { + damage: 20, + range: 5, + count: 3, + damage_radius: 2, + }), + snowballs: None, + rounds_until_unfrozen: 0, + profession: WormType::Agent, + }, + PlayerWorm { + id: 2, + health: 150, + position: Position { x: 1, y: 16 }, + weapon: Weapon { + damage: 1, + range: 3, + }, + digging_range: 1, + movement_range: 1, + banana_bombs: None, + snowballs: None, + rounds_until_unfrozen: 0, + profession: WormType::Commando, + }, + PlayerWorm { + id: 3, + health: 100, + position: Position { x: 24, y: 4 }, + weapon: Weapon { + damage: 8, + range: 4, + }, + digging_range: 1, + movement_range: 1, + banana_bombs: None, + snowballs: Some(Snowball { + freeze_duration: 5, + range: 5, + count: 3, + freeze_radius: 1, + }), + rounds_until_unfrozen: 3, + profession: WormType::Technologist, + }, + ], + }, + opponents: vec![Opponent { + id: 2, + score: 100, + remaining_worm_selections: 2, + current_worm_id: 3, + previous_command: "nothing".into(), + worms: vec![OpponentWorm { + id: 1, + health: 100, + position: Position { x: 31, y: 16 }, + digging_range: 1, + movement_range: 1, + rounds_until_unfrozen: 0, + profession: WormType::Commando, + }], + }], + map: vec![ + vec![ + Cell { + x: 0, + y: 0, + cell_type: CellType::DeepSpace, + occupier: None, + powerup: None, + }, + Cell { + x: 1, + y: 0, + cell_type: CellType::Air, + occupier: None, + powerup: None, + }, + Cell { + x: 2, + y: 0, + cell_type: CellType::Dirt, + occupier: None, + powerup: None, + }, + ], + vec![ + Cell { + x: 0, + y: 1, + cell_type: CellType::Air, + occupier: None, + powerup: Some(Powerup { + powerup_type: PowerupType::HealthPack, + value: 5, + }), + }, + Cell { + x: 1, + y: 1, + cell_type: CellType::Air, + occupier: Some(CellWorm::OpponentWorm { + id: 1, + player_id: 2, + health: 100, + position: Position { x: 1, y: 1 }, + digging_range: 1, + movement_range: 1, + }), + powerup: None, + }, + Cell { + x: 2, + y: 1, + cell_type: CellType::Air, + occupier: Some(CellWorm::PlayerWorm { + id: 1, + player_id: 1, + health: 100, + position: Position { x: 2, y: 1 }, + digging_range: 1, + movement_range: 1, + weapon: Weapon { + damage: 1, + range: 3, + }, + }), + powerup: None, + }, + ], + ], + }; + + let parsed: State = serde_json::from_str(example).unwrap(); + + assert_eq!( + parsed, expected, + "Parsed value did not match the expected value.\nParsed = {:#?}\nExpected = {:#?}", + parsed, expected + ); + } +} diff --git a/2019-worms/src/lib.rs b/2019-worms/src/lib.rs new file mode 100644 index 0000000..9922cce --- /dev/null +++ b/2019-worms/src/lib.rs @@ -0,0 +1,8 @@ +#![warn(clippy::all)] + +pub mod command; +pub mod json; +pub mod geometry; +pub mod game; +pub mod strategy; +pub mod constants; diff --git a/2019-worms/src/main.rs b/2019-worms/src/main.rs new file mode 100644 index 0000000..4f98e75 --- /dev/null +++ b/2019-worms/src/main.rs @@ -0,0 +1,46 @@ +use std::io::prelude::*; +use std::io::stdin; +use std::path::Path; + +use time::{Duration, PreciseTime}; + +use steam_powered_wyrm::command::{Action, Command}; +use steam_powered_wyrm::game; +use steam_powered_wyrm::json; +use steam_powered_wyrm::strategy::{choose_move, ScoreConfig}; + +fn main() { + let max_time = Duration::milliseconds(900); + let config = ScoreConfig::default(); + + let mut game_board = None; + for line in stdin().lock().lines() { + let start_time = PreciseTime::now(); + + let round_number = line.expect("Failed to read line from stdin: {}"); + + let command = match json::read_state_from_json_file(&Path::new(&format!( + "./rounds/{}/state.json", + round_number + ))) { + Ok(json_state) => match &mut game_board { + None => { + let new_board = game::GameBoard::new(json_state); + let command = choose_move(&new_board, &config, start_time, max_time); + game_board = Some(new_board); + command + } + Some(game_board) => { + game_board.update(json_state); + choose_move(&game_board, &config, start_time, max_time) + } + }, + Err(e) => { + #[cfg(feature = "logging")] + eprintln!("WARN: State file could not be parsed: {}", e); + Command::new(Action::DoNothing) + } + }; + println!("C;{};{}", round_number, command); + } +} diff --git a/2019-worms/src/strategy.rs b/2019-worms/src/strategy.rs new file mode 100644 index 0000000..fce842b --- /dev/null +++ b/2019-worms/src/strategy.rs @@ -0,0 +1,5 @@ +//mod mcts; +//pub use mcts::{choose_move, Node}; + +mod minimax; +pub use minimax::{choose_move, choose_move_with_normalized_perf, Node, ScoreConfig}; diff --git a/2019-worms/src/strategy/minimax.rs b/2019-worms/src/strategy/minimax.rs new file mode 100644 index 0000000..656ee36 --- /dev/null +++ b/2019-worms/src/strategy/minimax.rs @@ -0,0 +1,330 @@ +use crate::command::{Action, Command}; +use crate::constants::*; +use crate::game::{GameBoard, SimulationOutcome}; + +use fnv::FnvHashMap; +use std::cmp; +use std::ops::*; +use time::{Duration, PreciseTime}; + +#[derive(Debug, Clone)] +pub struct ScoreConfig { + pub max_health_weight: f32, + pub total_health_weight: f32, + pub points_weight: f32, + pub victory_weight: f32, + pub snowball_weight: f32, + pub bomb_weight: f32, + pub explore_exploit_weight: f32, +} + +impl Default for ScoreConfig { + fn default() -> ScoreConfig { + ScoreConfig { + max_health_weight: 100., + total_health_weight: 10., + points_weight: 1., + victory_weight: 4500., + snowball_weight: 10., + bomb_weight: 10., + explore_exploit_weight: 100., + } + } +} + +pub fn choose_move( + state: &GameBoard, + config: &ScoreConfig, + start_time: PreciseTime, + max_time: Duration, +) -> Command { + let mut root_node = Node { + score_sum: ScoreSum::new(), + player_score_sums: [FnvHashMap::default(), FnvHashMap::default()], + unexplored: move_combos(state), + children: FnvHashMap::default(), + }; + + #[cfg(feature = "logging")] + { + let mut max_expand_time = Duration::milliseconds(0); + while start_time.to(PreciseTime::now()) < max_time { + let expand_start_time = PreciseTime::now(); + let _ = expand_tree(&mut root_node, state.clone(), config); + max_expand_time = max_expand_time.max(expand_start_time.to(PreciseTime::now())); + } + eprintln!( + "Max expand time: {:?} ns", + max_expand_time.num_nanoseconds() + ); + } + #[cfg(not(feature = "logging"))] + { + while start_time.to(PreciseTime::now()) < max_time { + let _ = expand_tree(&mut root_node, state.clone(), config); + } + } + + #[cfg(feature = "logging")] + { + eprintln!("Number of simulations: {}", root_node.score_sum.visit_count); + for (command, score_sum) in &root_node.player_score_sums[0] { + eprintln!( + "{} = {} ({} visits)", + command, + score_sum.avg().val, + score_sum.visit_count + ); + } + } + + best_player_move(&root_node, 0) +} + +pub fn choose_move_with_normalized_perf( + state: &GameBoard, + config: &ScoreConfig, + player_index: usize, + iterations: usize, +) -> Command { + let mut root_node = Node { + score_sum: ScoreSum::new(), + player_score_sums: [FnvHashMap::default(), FnvHashMap::default()], + unexplored: move_combos(state), + children: FnvHashMap::default(), + }; + + for _ in 0..iterations { + let _ = expand_tree(&mut root_node, state.clone(), config); + } + + #[cfg(feature = "logging")] + { + eprintln!("Number of simulations: {}", root_node.score_sum.visit_count); + for (command, score_sum) in &root_node.player_score_sums[player_index] { + eprintln!( + "{} = {} ({} visits)", + command, + score_sum.avg().val, + score_sum.visit_count + ); + } + } + + best_player_move(&root_node, player_index) +} + +pub struct Node { + score_sum: ScoreSum, + player_score_sums: [FnvHashMap; 2], + unexplored: Vec<[Command; 2]>, + children: FnvHashMap<[Command; 2], Node>, +} + +#[derive(Clone, Copy, Debug, PartialEq, PartialOrd)] +struct Score { + val: f32, +} + +impl AddAssign for Score { + fn add_assign(&mut self, other: Self) { + self.val = self.val + other.val; + } +} + +impl Div for Score { + type Output = Self; + fn div(self, other: u32) -> Self { + Score { + val: self.val / other as f32, + } + } +} + +impl Mul for Score { + type Output = Self; + fn mul(self, other: f32) -> Self { + Score { + val: self.val * other, + } + } +} + +impl cmp::Eq for Score {} +impl cmp::Ord for Score { + fn cmp(&self, other: &Score) -> cmp::Ordering { + self.val + .partial_cmp(&other.val) + .unwrap_or(cmp::Ordering::Equal) + } +} + +struct ScoreSum { + sum: Score, + visit_count: u32, +} + +impl ScoreSum { + fn new() -> ScoreSum { + ScoreSum { + sum: Score { val: 0. }, + visit_count: 0, + } + } + fn with_initial(score: Score) -> ScoreSum { + ScoreSum { + sum: score, + visit_count: 1, + } + } + fn avg(&self) -> Score { + self.sum / self.visit_count + } +} + +impl AddAssign for ScoreSum { + fn add_assign(&mut self, other: Score) { + self.sum += other; + self.visit_count = self.visit_count.saturating_add(1); + } +} + +fn expand_tree(node: &mut Node, mut state: GameBoard, config: &ScoreConfig) -> Score { + if state.outcome != SimulationOutcome::Continue { + score(&state, config) + } else if let Some(commands) = node.unexplored.pop() { + state.simulate(commands); + let score = score(&state, config); + let unexplored = if state.outcome == SimulationOutcome::Continue { + move_combos(&state) + } else { + Vec::new() + }; + + let new_node = Node { + score_sum: ScoreSum::with_initial(score), + player_score_sums: [FnvHashMap::default(), FnvHashMap::default()], + unexplored, + children: FnvHashMap::default(), + }; + node.children.insert(commands, new_node); + update(node, commands, score); + + score + } else { + let commands = choose_existing(node, config); + state.simulate(commands); + let score = expand_tree( + node.children + .get_mut(&commands) + .expect("The existing node hasn't been tried yet"), + state, + config, + ); + update(node, commands, score); + score + } +} + +fn move_combos(state: &GameBoard) -> Vec<[Command; 2]> { + let player_moves = state.pruned_valid_moves(0); + let opponent_moves = state.pruned_valid_moves(1); + debug_assert!(!player_moves.is_empty(), "No player moves"); + debug_assert!(!opponent_moves.is_empty(), "No opponent moves"); + + let mut result = Vec::with_capacity(player_moves.len() * opponent_moves.len()); + for p in &player_moves { + for o in &opponent_moves { + result.push([*p, *o]); + } + } + + result +} + +fn best_player_move(node: &Node, player_index: usize) -> Command { + let multiplier = if player_index == 0 { 1. } else { -1. }; + node.player_score_sums[player_index] + .iter() + .max_by_key(|(_command, score_sum)| score_sum.avg() * multiplier) + .map(|(command, _score_sum)| *command) + .unwrap_or_else(|| Command::new(Action::DoNothing)) +} + +fn score(state: &GameBoard, config: &ScoreConfig) -> Score { + let max_health = + (state.players[0].max_worm_health() - state.players[1].max_worm_health()) as f32; + let total_health = (state.players[0].health() - state.players[1].health()) as f32; + let points = (state.players[0].score() - state.players[1].score()) as f32; + let victory = match state.outcome { + SimulationOutcome::PlayerWon(0) => 1., + SimulationOutcome::PlayerWon(1) => -1., + _ => 0., + }; + + let time_to_end = MAX_ROUNDS as f32 - state.round as f32 + 1.; + + let snowballs = state.players[0].snowballs() as f32 - state.players[1].snowballs() as f32; + let bombs = state.players[0].bombs() as f32 - state.players[1].bombs() as f32; + + Score { + val: max_health * config.max_health_weight + + total_health * config.total_health_weight + + points * config.points_weight + + victory * config.victory_weight + + snowballs * config.snowball_weight / time_to_end + + bombs * config.bomb_weight / time_to_end, + } +} + +fn choose_existing(node: &Node, config: &ScoreConfig) -> [Command; 2] { + [ + choose_one_existing(node, 0, config), + choose_one_existing(node, 1, config), + ] +} + +fn choose_one_existing(node: &Node, player_index: usize, config: &ScoreConfig) -> Command { + let ln_n = (node.score_sum.visit_count as f32).ln(); + let multiplier = if player_index == 0 { 1. } else { -1. }; + let mut command_confidences = + node.player_score_sums[player_index] + .iter() + .map(|(command, score_sum)| { + ( + command, + (score_sum.avg() * multiplier).val + + config.explore_exploit_weight + * (ln_n / score_sum.visit_count as f32).sqrt(), + ) + }); + + command_confidences + .next() + .map(|first| { + command_confidences + .fold( + first, + |(acc_command, acc_confidence), (next_command, next_confidence)| { + if acc_confidence > next_confidence { + (acc_command, acc_confidence) + } else { + (next_command, next_confidence) + } + }, + ) + .0 + .clone() + }) + .unwrap_or_else(|| Command::new(Action::DoNothing)) +} + +fn update(node: &mut Node, commands: [Command; 2], score: Score) { + *node.player_score_sums[0] + .entry(commands[0]) + .or_insert_with(ScoreSum::new) += score; + *node.player_score_sums[1] + .entry(commands[1]) + .or_insert_with(ScoreSum::new) += score; + node.score_sum += score; +} -- cgit v1.2.3