summaryrefslogtreecommitdiff
path: root/2019-worms/src
diff options
context:
space:
mode:
Diffstat (limited to '2019-worms/src')
-rw-r--r--2019-worms/src/bin/benchmark.rs22
-rw-r--r--2019-worms/src/bin/explore-config.rs116
-rw-r--r--2019-worms/src/command.rs73
-rw-r--r--2019-worms/src/constants.rs218
-rw-r--r--2019-worms/src/constants/lava.rs6225
-rw-r--r--2019-worms/src/game.rs779
-rw-r--r--2019-worms/src/game/map.rs49
-rw-r--r--2019-worms/src/game/player.rs259
-rw-r--r--2019-worms/src/game/powerup.rs6
-rw-r--r--2019-worms/src/geometry.rs6
-rw-r--r--2019-worms/src/geometry/direction.rs67
-rw-r--r--2019-worms/src/geometry/point.rs37
-rw-r--r--2019-worms/src/geometry/vec.rs62
-rw-r--r--2019-worms/src/json.rs554
-rw-r--r--2019-worms/src/lib.rs8
-rw-r--r--2019-worms/src/main.rs46
-rw-r--r--2019-worms/src/strategy.rs5
-rw-r--r--2019-worms/src/strategy/minimax.rs330
18 files changed, 8862 insertions, 0 deletions
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::<Vec<usize>>()
+ .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<f32>,
+ pub total_health_weight: Vec<f32>,
+ pub points_weight: Vec<f32>,
+ pub victory_weight: Vec<f32>,
+ pub snowball_weight: Vec<f32>,
+ pub bomb_weight: Vec<f32>,
+ pub explore_exploit_weight: Vec<f32>,
+}
+
+impl ScoreConfigTrials {
+ fn reify(self) -> Vec<ScoreConfig> {
+ 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<i32>,
+ 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<Item = (Option<i32>, &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<Command> {
+ 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<Command> {
+ 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<Command> {
+ 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<Command> {
+ 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<bool> {
+ 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<usize> {
+ 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<Vec2d> 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<i8> 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<State, Box<dyn Error>> {
+ 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<Opponent>,
+ pub map: Vec<Vec<Cell>>,
+}
+
+#[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<PlayerWorm>,
+ 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<Bomb>,
+ pub snowballs: Option<Snowball>,
+ 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<OpponentWorm>,
+ pub remaining_worm_selections: u8,
+}
+
+impl Opponent {
+ pub fn health_score(&self) -> i32 {
+ self.worms.iter().map(|w| w.health).sum::<i32>() / 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<CellWorm>,
+ pub powerup: Option<Powerup>,
+}
+
+#[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<usize> {
+ 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<usize> {
+ 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<Command, ScoreSum>; 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<u32> for Score {
+ type Output = Self;
+ fn div(self, other: u32) -> Self {
+ Score {
+ val: self.val / other as f32,
+ }
+ }
+}
+
+impl Mul<f32> 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<Score> 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;
+}