From 6f277bb5e17ccd0693e5b7db9de80170350d78f4 Mon Sep 17 00:00:00 2001
From: kg0816 <211191696+kg0816@users.noreply.github.com>
Date: Wed, 29 Oct 2025 14:06:41 +0900
Subject: [PATCH 3/9] separate place_temprate button
---
src/lib/index.ts | 1 -
src/life-game/life-game.js | 481 +-----------------
src/life-game/life-game_temprate.js | 439 ++++++++++++++++
src/life-game/patterns_img/BHeptomino.png | Bin 0 -> 5695 bytes
src/life-game/patterns_img/DieHard.png | Bin 0 -> 6934 bytes
src/life-game/patterns_img/Herschel.png | Bin 0 -> 5717 bytes
src/life-game/patterns_img/Max.png | Bin 0 -> 44436 bytes
src/life-game/patterns_img/Pufferfish.png | Bin 0 -> 18186 bytes
src/life-game/patterns_img/Thunderbird.png | Bin 0 -> 5541 bytes
src/life-game/patterns_img/barberPole.png | Bin 0 -> 11943 bytes
src/life-game/patterns_img/clock.png | Bin 0 -> 9603 bytes
src/life-game/patterns_img/figureEight.png | Bin 0 -> 6081 bytes
src/life-game/patterns_img/galaxy.png | Bin 0 -> 6812 bytes
src/life-game/patterns_img/glider.png | Bin 0 -> 5585 bytes
.../patterns_img/gosperGliderGun.png | Bin 0 -> 35019 bytes
.../patterns_img/heavyweightSpaceship.png | Bin 0 -> 6834 bytes
src/life-game/patterns_img/index.js | 20 +
.../patterns_img/lightweightSpaceship.png | Bin 0 -> 5913 bytes
.../patterns_img/middleweightSpaceship.png | Bin 0 -> 6625 bytes
src/life-game/patterns_img/octagon.png | Bin 0 -> 7553 bytes
src/life-game/patterns_img/pentadecathlon.png | Bin 0 -> 5823 bytes
src/life-game/patterns_img/pulsar.png | Bin 0 -> 10463 bytes
src/life-game/patterns_img/shuttle.png | Bin 0 -> 20228 bytes
src/life-game/patterns_img/tumbler.png | Bin 0 -> 5669 bytes
src/life-game/place_template.js | 37 ++
src/routes/+page.svelte | 41 +-
26 files changed, 537 insertions(+), 482 deletions(-)
delete mode 100644 src/lib/index.ts
create mode 100644 src/life-game/life-game_temprate.js
create mode 100644 src/life-game/patterns_img/BHeptomino.png
create mode 100644 src/life-game/patterns_img/DieHard.png
create mode 100644 src/life-game/patterns_img/Herschel.png
create mode 100644 src/life-game/patterns_img/Max.png
create mode 100644 src/life-game/patterns_img/Pufferfish.png
create mode 100644 src/life-game/patterns_img/Thunderbird.png
create mode 100644 src/life-game/patterns_img/barberPole.png
create mode 100644 src/life-game/patterns_img/clock.png
create mode 100644 src/life-game/patterns_img/figureEight.png
create mode 100644 src/life-game/patterns_img/galaxy.png
create mode 100644 src/life-game/patterns_img/glider.png
create mode 100644 src/life-game/patterns_img/gosperGliderGun.png
create mode 100644 src/life-game/patterns_img/heavyweightSpaceship.png
create mode 100644 src/life-game/patterns_img/index.js
create mode 100644 src/life-game/patterns_img/lightweightSpaceship.png
create mode 100644 src/life-game/patterns_img/middleweightSpaceship.png
create mode 100644 src/life-game/patterns_img/octagon.png
create mode 100644 src/life-game/patterns_img/pentadecathlon.png
create mode 100644 src/life-game/patterns_img/pulsar.png
create mode 100644 src/life-game/patterns_img/shuttle.png
create mode 100644 src/life-game/patterns_img/tumbler.png
create mode 100644 src/life-game/place_template.js
diff --git a/src/lib/index.ts b/src/lib/index.ts
deleted file mode 100644
index 856f2b6..0000000
--- a/src/lib/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-// place files you want to import through the `$lib` alias in this folder.
diff --git a/src/life-game/life-game.js b/src/life-game/life-game.js
index 0254ebd..a0802f0 100644
--- a/src/life-game/life-game.js
+++ b/src/life-game/life-game.js
@@ -58,16 +58,19 @@ sizeLabel.textContent = `(${boardSizeMin}〜${boardSizeMax})`;
//Boardの初期化
let board = Array.from({ length: boardSize }, () => Array.from({ length: boardSize }, () => false));
const table = document.getElementById("game-board");
+table.style.borderCollapse = "collapse";
function renderBoard() {
//盤面をBoardに従って変更する関数(Boardを変更したら必ず実行する)
table.innerHTML = "";
for (let i = 0; i < boardSize; i++) {
const tr = document.createElement("tr");
+ tr.style.padding = "0";
for (let j = 0; j < boardSize; j++) {
const td = document.createElement("td");
+ td.style.padding = "0";
const button = document.createElement("button");
button.style.backgroundColor = board[i][j] ? "black" : "white"; //Boardの対応する値によって色を変更
- button.style.border = "1px solid black";
+ button.style.border = "0.5px solid black";
button.style.width = `${cellSize}px`;
button.style.height = `${cellSize}px`;
button.style.padding = "0"; //cellSizeが小さいとき、セルが横長になることを防ぐ
@@ -159,482 +162,6 @@ function progressBoard() {
renderBoard();
}
-//以下パターンデータ
-//(注)minBoardSizeは、パターンが余裕をもって変形できるために必要なボードのサイズを表し、パターン自体より大きい。
-
-const patterns = {
- //振動子, Oscillators
- pulsar: {
- //周期3
- names: {
- en: "Pulsar",
- ja: "パルサー",
- },
- minBoardSize: 20,
- shape: [
- [0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
- [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
- [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
- [0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0],
- [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
- [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
- [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0],
- ],
- },
- pentadecathlon: {
- //周期15
- names: {
- en: "Pentadecathlon",
- ja: "ペンタデカスロン",
- },
- minBoardSize: 20,
- shape: [
- [0, 0, 1, 0, 0, 0, 0, 1, 0, 0],
- [1, 1, 0, 1, 1, 1, 1, 0, 1, 1],
- [0, 0, 1, 0, 0, 0, 0, 1, 0, 0],
- ],
- },
- galaxy: {
- //周期8
- names: {
- en: "Galaxy",
- ja: "銀河",
- },
- minBoardSize: 20,
- shape: [
- [1, 1, 1, 1, 1, 1, 0, 1, 1],
- [1, 1, 1, 1, 1, 1, 0, 1, 1],
- [0, 0, 0, 0, 0, 0, 0, 1, 1],
- [1, 1, 0, 0, 0, 0, 0, 1, 1],
- [1, 1, 0, 0, 0, 0, 0, 1, 1],
- [1, 1, 0, 0, 0, 0, 0, 1, 1],
- [1, 1, 0, 0, 0, 0, 0, 0, 0],
- [1, 1, 0, 1, 1, 1, 1, 1, 1],
- [1, 1, 0, 1, 1, 1, 1, 1, 1],
- ],
- },
- octagon: {
- //周期5
- names: {
- en: "Octagon",
- ja: "八角形",
- },
- minBoardSize: 20,
- shape: [
- [0, 0, 0, 1, 1, 0, 0, 0],
- [0, 0, 1, 0, 0, 1, 0, 0],
- [0, 1, 0, 0, 0, 0, 1, 0],
- [1, 0, 0, 0, 0, 0, 0, 1],
- [1, 0, 0, 0, 0, 0, 0, 1],
- [0, 1, 0, 0, 0, 0, 1, 0],
- [0, 0, 1, 0, 0, 1, 0, 0],
- [0, 0, 0, 1, 1, 0, 0, 0],
- ],
- },
- figureEight: {
- //周期8
- names: {
- en: "Figure eight",
- ja: "8の字",
- },
- minBoardSize: 20,
- shape: [
- [1, 1, 1, 0, 0, 0],
- [1, 1, 1, 0, 0, 0],
- [1, 1, 1, 0, 0, 0],
- [0, 0, 0, 1, 1, 1],
- [0, 0, 0, 1, 1, 1],
- [0, 0, 0, 1, 1, 1],
- ],
- },
- tumbler: {
- //周期14
- names: {
- en: "Tumbler",
- ja: "タンブラー",
- },
- minBoardSize: 20,
- shape: [
- [0, 1, 1, 0, 1, 1, 0],
- [0, 1, 1, 0, 1, 1, 0],
- [0, 0, 1, 0, 1, 0, 0],
- [1, 0, 1, 0, 1, 0, 1],
- [1, 0, 1, 0, 1, 0, 1],
- [1, 1, 0, 0, 0, 1, 1],
- ],
- },
- barberPole: {
- //周期2
- names: {
- en: "Barber's pole",
- ja: "床屋の看板",
- },
- minBoardSize: 20,
- shape: [
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- ],
- },
- clock: {
- //周期4
- names: {
- en: "Clock",
- ja: "時計",
- },
- minBoardSize: 20,
- shape: [
- [0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0],
- [0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1],
- [0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1],
- [1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0],
- [1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0],
- [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0],
- ],
- },
-
- //移動物体, Spaceships
- glider: {
- names: {
- en: "Glider",
- ja: "グライダー",
- },
- minBoardSize: 20,
- shape: [
- [0, 1, 0],
- [0, 0, 1],
- [1, 1, 1],
- ],
- },
- lightweightSpaceship: {
- names: {
- en: "Lightweight Spaceship",
- ja: "軽量級宇宙船",
- },
- minBoardSize: 20,
- shape: [
- [0, 1, 0, 0, 1],
- [1, 0, 0, 0, 0],
- [1, 0, 0, 0, 1],
- [1, 1, 1, 1, 0],
- ],
- },
- middleweightSpaceship: {
- names: {
- en: "Middleweight Spaceship",
- ja: "中量級宇宙船",
- },
- minBoardSize: 20,
- shape: [
- [0, 0, 0, 1, 0, 0],
- [0, 1, 0, 0, 0, 1],
- [1, 0, 0, 0, 0, 0],
- [1, 0, 0, 0, 0, 1],
- [1, 1, 1, 1, 1, 0],
- ],
- },
- heavyweightSpaceship: {
- names: {
- en: "Heavyweight Spaceship",
- ja: "重量級宇宙船",
- },
- minBoardSize: 20,
- shape: [
- [0, 0, 0, 1, 1, 0, 0],
- [0, 1, 0, 0, 0, 0, 1],
- [1, 0, 0, 0, 0, 0, 0],
- [1, 0, 0, 0, 0, 0, 1],
- [1, 1, 1, 1, 1, 1, 0],
- ],
- },
- shuttle: {
- names: {
- en: "Shuttle",
- ja: "シャトル",
- },
- minBoardSize: 30,
- shape: [
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
- [1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
- [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- ],
- },
- Pufferfish: {
- names: {
- en: "Pufferfish",
- ja: "パファーフィッシュ",
- },
- minBoardSize: 40,
- shape: [
- [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
- [0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
- [0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0],
- [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
- [0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0],
- [1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1],
- [1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1],
- [0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0],
- [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
- ],
- },
-
- //繁殖型, Breeders
- gosperGliderGun: {
- names: {
- en: "Gosper Glider Gun",
- ja: "グライダー銃",
- },
- minBoardSize: 40,
- shape: [
- [
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,
- ],
- [
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,
- ],
- [
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 1,
- ],
- [
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 1,
- ],
- [
- 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,
- ],
- [
- 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,
- ],
- [
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,
- ],
- [
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,
- ],
- [
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,
- ],
- ],
- },
- Max: {
- names: {
- en: "Max",
- ja: "マックス",
- },
- minBoardSize: 60,
- shape: [
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0],
- [1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0],
- [1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0],
- [1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1],
- [0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1],
- [1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1],
- [1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0],
- [1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1],
- [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1],
- [0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1],
- [0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- ],
- },
-
- //長寿型, Methuselah
- Thunderbird: {
- //寿命243
- names: {
- en: "Thunderbird",
- ja: "サンダーバード",
- },
- minBoardSize: 60,
- shape: [
- [1, 1, 1],
- [0, 0, 0],
- [0, 1, 0],
- [0, 1, 0],
- [0, 1, 0],
- ],
- },
- //寿命128
- Herschel: {
- names: {
- en: "Herschel",
- ja: "ハーシェル",
- },
- minBoardSize: 60,
- shape: [
- [1, 0, 0],
- [1, 1, 1],
- [1, 0, 1],
- [0, 0, 1],
- ],
- },
- //寿命148
- BHeptomino: {
- names: {
- en: "B-Heptomino",
- ja: "Bヘプトミノ",
- },
- minBoardSize: 60,
- shape: [
- [1, 0, 1, 1],
- [1, 1, 1, 0],
- [0, 1, 0, 0],
- ],
- },
- //寿命130
- DieHard: {
- names: {
- en: "Die Hard",
- ja: "ダイハード",
- },
- minBoardSize: 60,
- shape: [
- [0, 0, 0, 0, 0, 0, 1, 0],
- [1, 1, 0, 0, 0, 0, 0, 0],
- [0, 1, 0, 0, 0, 1, 1, 1],
- ],
- },
- /*↓minBoardSizeが大きすぎるので保留
- //寿命1103
- RPentomino: {
- names: {
- en: "R-Pentomino",
- ja: "Rペントミノ"
- },
- minBoardSize: 150,
- shape: [
- [0, 1, 1],
- [1, 1, 0],
- [0, 1, 0]
- ]
- },
- Acorn: {
- //寿命5206
- names: {
- en: "Acorn",
- ja: "どんぐり"
- },
- minBoardSize: 300,
- shape: [
- [0, 1, 0, 0, 0, 0, 0],
- [0, 0, 0, 1, 0, 0, 0],
- [1, 1, 0, 0, 1, 1, 1]
- ]
- }
- */
-};
-
-function placePattern(patternKey) {
- const newBoard = Array.from({ length: boardSize }, () =>
- Array.from({ length: boardSize }, () => false),
- );
- const patternData = patterns[patternKey];
- const patternShape = patternData.shape;
- const patternHeight = patternShape.length;
- const patternWidth = patternShape[0].length;
- //↓パターンがボードの中央に来るよう、パターンの右上のセルの位置(startrow,startCol)を調整
- const startRow = Math.floor((boardSize - patternHeight) / 2);
- const startCol = Math.floor((boardSize - patternWidth) / 2);
- for (let r = 0; r < patternHeight; r++) {
- for (let c = 0; c < patternWidth; c++) {
- const boardRow = startRow + r;
- const boardCol = startCol + c;
- newBoard[boardRow][boardCol] = patternShape[r][c] === 1;
- }
- }
- board = newBoard;
- renderBoard();
- generationChange(0);
- stop();
-}
-
-function createPatternButtons() {
- patternButtonContainer.innerHTML = "";
- for (const patternKey in patterns) {
- const patternData = patterns[patternKey];
- const button = document.createElement("button");
- button.textContent = patternData.names["ja"];
- button.dataset.patternKey = patternKey; // data-pattern-key属性にキーを保存
- button.onclick = () => {
- placePattern(patternKey);
- };
- patternButtonContainer.appendChild(button);
- }
-}
-createPatternButtons();
-
-function updatePatternButtons() {
- const buttons = patternButtonContainer.getElementsByTagName("button");
- //↓ボードに収まるパターンのみクリック可能にする
- for (const button of buttons) {
- const patternKey = button.dataset.patternKey; // data-pattern-key 属性からキーを取得
- const patternData = patterns[patternKey];
- const requiredSize = patternData.minBoardSize || 0;
- if (boardSize < requiredSize) {
- button.disabled = true;
- button.title = `このパターンには ${requiredSize}x${requiredSize} 以上の盤面が必要です`;
- } else {
- button.disabled = false;
- button.title = "";
- }
- }
-}
-updatePatternButtons();
-
sizeChangeButton.onclick = () => {
const newSize = parseInt(sizeInput.value, 10);
if (isNaN(newSize) || newSize < boardSizeMin || boardSizeMax < newSize) {
diff --git a/src/life-game/life-game_temprate.js b/src/life-game/life-game_temprate.js
new file mode 100644
index 0000000..9bb858f
--- /dev/null
+++ b/src/life-game/life-game_temprate.js
@@ -0,0 +1,439 @@
+import * as patternImages from "./patterns_img";
+
+const patterns = {
+ //振動子, Oscillators
+ pulsar: {
+ //周期3
+ names: {
+ en: "Pulsar",
+ ja: "パルサー",
+ },
+ minBoardSize: 20,
+ shape: [
+ [0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0],
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
+ [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
+ [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
+ [0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0],
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0],
+ [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
+ [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
+ [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0],
+ ],
+ image: patternImages.pulsar,
+ },
+ pentadecathlon: {
+ //周期15
+ names: {
+ en: "Pentadecathlon",
+ ja: "ペンタデカスロン",
+ },
+ minBoardSize: 20,
+ shape: [
+ [0, 0, 1, 0, 0, 0, 0, 1, 0, 0],
+ [1, 1, 0, 1, 1, 1, 1, 0, 1, 1],
+ [0, 0, 1, 0, 0, 0, 0, 1, 0, 0],
+ ],
+ image: patternImages.pentadecathlon,
+ },
+ galaxy: {
+ //周期8
+ names: {
+ en: "Galaxy",
+ ja: "銀河",
+ },
+ minBoardSize: 20,
+ shape: [
+ [1, 1, 1, 1, 1, 1, 0, 1, 1],
+ [1, 1, 1, 1, 1, 1, 0, 1, 1],
+ [0, 0, 0, 0, 0, 0, 0, 1, 1],
+ [1, 1, 0, 0, 0, 0, 0, 1, 1],
+ [1, 1, 0, 0, 0, 0, 0, 1, 1],
+ [1, 1, 0, 0, 0, 0, 0, 1, 1],
+ [1, 1, 0, 0, 0, 0, 0, 0, 0],
+ [1, 1, 0, 1, 1, 1, 1, 1, 1],
+ [1, 1, 0, 1, 1, 1, 1, 1, 1],
+ ],
+ image: patternImages.galaxy,
+ },
+ octagon: {
+ //周期5
+ names: {
+ en: "Octagon",
+ ja: "八角形",
+ },
+ minBoardSize: 20,
+ shape: [
+ [0, 0, 0, 1, 1, 0, 0, 0],
+ [0, 0, 1, 0, 0, 1, 0, 0],
+ [0, 1, 0, 0, 0, 0, 1, 0],
+ [1, 0, 0, 0, 0, 0, 0, 1],
+ [1, 0, 0, 0, 0, 0, 0, 1],
+ [0, 1, 0, 0, 0, 0, 1, 0],
+ [0, 0, 1, 0, 0, 1, 0, 0],
+ [0, 0, 0, 1, 1, 0, 0, 0],
+ ],
+ image: patternImages.octagon,
+ },
+ figureEight: {
+ //周期8
+ names: {
+ en: "Figure eight",
+ ja: "8の字",
+ },
+ minBoardSize: 20,
+ shape: [
+ [1, 1, 1, 0, 0, 0],
+ [1, 1, 1, 0, 0, 0],
+ [1, 1, 1, 0, 0, 0],
+ [0, 0, 0, 1, 1, 1],
+ [0, 0, 0, 1, 1, 1],
+ [0, 0, 0, 1, 1, 1],
+ ],
+ image: patternImages.figureEight,
+ },
+ tumbler: {
+ //周期14
+ names: {
+ en: "Tumbler",
+ ja: "タンブラー",
+ },
+ minBoardSize: 20,
+ shape: [
+ [0, 1, 1, 0, 1, 1, 0],
+ [0, 1, 1, 0, 1, 1, 0],
+ [0, 0, 1, 0, 1, 0, 0],
+ [1, 0, 1, 0, 1, 0, 1],
+ [1, 0, 1, 0, 1, 0, 1],
+ [1, 1, 0, 0, 0, 1, 1],
+ ],
+ image: patternImages.tumbler,
+ },
+ barberPole: {
+ //周期2
+ names: {
+ en: "Barber's pole",
+ ja: "床屋の看板",
+ },
+ minBoardSize: 20,
+ shape: [
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0],
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0],
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ ],
+ image: patternImages.barberPole,
+ },
+ clock: {
+ //周期4
+ names: {
+ en: "Clock",
+ ja: "時計",
+ },
+ minBoardSize: 20,
+ shape: [
+ [0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0],
+ [0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1],
+ [0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1],
+ [1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0],
+ [1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0],
+ [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0],
+ ],
+ image: patternImages.clock,
+ },
+
+ //移動物体, Spaceships
+ glider: {
+ names: {
+ en: "Glider",
+ ja: "グライダー",
+ },
+ minBoardSize: 20,
+ shape: [
+ [0, 1, 0],
+ [0, 0, 1],
+ [1, 1, 1],
+ ],
+ image: patternImages.glider,
+ },
+ lightweightSpaceship: {
+ names: {
+ en: "Lightweight Spaceship",
+ ja: "軽量級宇宙船",
+ },
+ minBoardSize: 20,
+ shape: [
+ [0, 1, 0, 0, 1],
+ [1, 0, 0, 0, 0],
+ [1, 0, 0, 0, 1],
+ [1, 1, 1, 1, 0],
+ ],
+ image: patternImages.lightweightSpaceship,
+ },
+ middleweightSpaceship: {
+ names: {
+ en: "Middleweight Spaceship",
+ ja: "中量級宇宙船",
+ },
+ minBoardSize: 20,
+ shape: [
+ [0, 0, 0, 1, 0, 0],
+ [0, 1, 0, 0, 0, 1],
+ [1, 0, 0, 0, 0, 0],
+ [1, 0, 0, 0, 0, 1],
+ [1, 1, 1, 1, 1, 0],
+ ],
+ image: patternImages.middleweightSpaceship,
+ },
+ heavyweightSpaceship: {
+ names: {
+ en: "Heavyweight Spaceship",
+ ja: "重量級宇宙船",
+ },
+ minBoardSize: 20,
+ shape: [
+ [0, 0, 0, 1, 1, 0, 0],
+ [0, 1, 0, 0, 0, 0, 1],
+ [1, 0, 0, 0, 0, 0, 0],
+ [1, 0, 0, 0, 0, 0, 1],
+ [1, 1, 1, 1, 1, 1, 0],
+ ],
+ image: patternImages.heavyweightSpaceship,
+ },
+ shuttle: {
+ names: {
+ en: "Shuttle",
+ ja: "シャトル",
+ },
+ minBoardSize: 30,
+ shape: [
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
+ [1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
+ [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ ],
+ image: patternImages.shuttle,
+ },
+ Pufferfish: {
+ names: {
+ en: "Pufferfish",
+ ja: "パファーフィッシュ",
+ },
+ minBoardSize: 40,
+ shape: [
+ [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
+ [0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
+ [0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0],
+ [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0],
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
+ [0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0],
+ [1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1],
+ [1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1],
+ [0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0],
+ [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
+ ],
+ image: patternImages.Pufferfish,
+ },
+
+ //繁殖型, Breeders
+ gosperGliderGun: {
+ names: {
+ en: "Gosper Glider Gun",
+ ja: "グライダー銃",
+ },
+ minBoardSize: 40,
+ shape: [
+ [
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ ],
+ [
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ ],
+ [
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 1,
+ ],
+ [
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 1,
+ ],
+ [
+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ ],
+ [
+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ ],
+ [
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ ],
+ [
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ ],
+ [
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ ],
+ ],
+ image: patternImages.gosperGliderGun,
+ },
+ Max: {
+ names: {
+ en: "Max",
+ ja: "マックス",
+ },
+ minBoardSize: 60,
+ shape: [
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0],
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0],
+ [1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0],
+ [1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0],
+ [1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1],
+ [0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1],
+ [1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1],
+ [1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0],
+ [1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0],
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1],
+ [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1],
+ [0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1],
+ [0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ ],
+ image: patternImages.Max,
+ },
+
+ //長寿型, Methuselah
+ Thunderbird: {
+ //寿命243
+ names: {
+ en: "Thunderbird",
+ ja: "サンダーバード",
+ },
+ minBoardSize: 60,
+ shape: [
+ [1, 1, 1],
+ [0, 0, 0],
+ [0, 1, 0],
+ [0, 1, 0],
+ [0, 1, 0],
+ ],
+ image: patternImages.Thunderbird,
+ },
+ //寿命128
+ Herschel: {
+ names: {
+ en: "Herschel",
+ ja: "ハーシェル",
+ },
+ minBoardSize: 60,
+ shape: [
+ [1, 0, 0],
+ [1, 1, 1],
+ [1, 0, 1],
+ [0, 0, 1],
+ ],
+ image: patternImages.Herschel,
+ },
+ //寿命148
+ BHeptomino: {
+ names: {
+ en: "B-Heptomino",
+ ja: "Bヘプトミノ",
+ },
+ minBoardSize: 60,
+ shape: [
+ [1, 0, 1, 1],
+ [1, 1, 1, 0],
+ [0, 1, 0, 0],
+ ],
+ image: patternImages.BHeptomino,
+ },
+ //寿命130
+ DieHard: {
+ names: {
+ en: "Die Hard",
+ ja: "ダイハード",
+ },
+ minBoardSize: 60,
+ shape: [
+ [0, 0, 0, 0, 0, 0, 1, 0],
+ [1, 1, 0, 0, 0, 0, 0, 0],
+ [0, 1, 0, 0, 0, 1, 1, 1],
+ ],
+ image: patternImages.DieHard,
+ },
+ /*↓minBoardSizeが大きすぎるので保留
+ //寿命1103
+ RPentomino: {
+ names: {
+ en: "R-Pentomino",
+ ja: "Rペントミノ"
+ },
+ minBoardSize: 150,
+ shape: [
+ [0, 1, 1],
+ [1, 1, 0],
+ [0, 1, 0]
+ ]
+ },
+ Acorn: {
+ //寿命5206
+ names: {
+ en: "Acorn",
+ ja: "どんぐり"
+ },
+ minBoardSize: 300,
+ shape: [
+ [0, 1, 0, 0, 0, 0, 0],
+ [0, 0, 0, 1, 0, 0, 0],
+ [1, 1, 0, 0, 1, 1, 1]
+ ]
+ }
+ */
+};
+
+export default patterns;
diff --git a/src/life-game/patterns_img/BHeptomino.png b/src/life-game/patterns_img/BHeptomino.png
new file mode 100644
index 0000000000000000000000000000000000000000..866f875154f991bd537d4b0be21be591fd95abd6
GIT binary patch
literal 5695
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
literal 0
HcmV?d00001
diff --git a/src/life-game/patterns_img/Herschel.png b/src/life-game/patterns_img/Herschel.png
new file mode 100644
index 0000000000000000000000000000000000000000..da776adf20456e5082acec643f097f64f39d1ebb
GIT binary patch
literal 5717
zcmd6rcTCh@y2ihZ^xl+?^o|T5y>}1+#i5Dx&fw6SBQUfb+Lf@Q-JhaWc0f4;o&%)_-|7d^HB=FJE(;(O+X1OKIIAG}74FI>fbktQK0dqUq
z=HAS`zP+QHyR%GpPML_zzp_w%fI7>i2_|V+3^+mr@S#X!>(J)Iiktsz61?yTiok0c@$
z<`>Z_2B-3uOnk{BOd(Q4k;ScOwP#bUr`9;I>s|*x9FCC9++7^h*{F#jEOIF%=s9f<
z`q+?HOE6u-APDTT+j
zyj2}r3ui?nS#}5m%8N6%&Kia6?I)rV#Ri`*1+re3r
zgqc|=+Hk87no=UqIh$cj|8t6R|B&DuLrbl(cas}XWz?WjCg*5L=wI-%9OdT2pT_KD
z3^AlJ^D<53W2j$V!`x+Y>e!A(@^MU+vzXp3#;d|1$Fs#r%`m&8WfUGmWf1Z
zN`SYBYIEZfa`h`|$N*?tQd0I&Mmk2{>_`1{{S!Gw6N$@c@s_5~YJRSMT^>>I>#Alu
z6KA9I_y>cej$B`2ozVK*S}k@(7Aq<-R9Ab1oR32zio6dO
z?NE-pBwCt8KaxjtA{v%nbhh<dznp(O(}HLz3EA0c3%
z=#h>4z_Wf1gs`T})5k(j0iO*HINU6bvh5BrPXW^{EYg-jIc2}z*Haastv+OZ_@#pC
zJKr~=w(qVH284*0LkoR?auzj$Vu5I}(&$dmH{pL5Dsu_0#+m5P?dWH%W{YcltsP0
z8i~Jt-@-_RLi*z4#11CfAbZkVw*CF$id2AFdPv)3&4ZZ$hbY7xRB%mUN&DT44_cJ&
zlfBW|4_u+c^n5VO(7dm|ViKJz>g3NBFJzTc@4Nn0hw}w0=uIW!3O*E^CwlB3bUP^l
z@@3DVu7l@zgS@~b_(lFuOmuhl1~MvJYR$}g!H_c813FZzK#n+|wF
zaEr3_i9bVD^|Q2F{2rR}9Z@s`1u!{$p;Tr#Uy^>W8bknBI1gWOpD^LDT!fH+k2n%Y
zxZMD^;AC@>LQ2qv;#DREE%Ne*`lbb%1CJQR?2xtK>g^gbHa+<7f3a*0EgW@lJm
zC-iHzwzip<*nGX1M7wu&ce}F)R8jauXQ16CgEq15OQV(!!q*yuEi|x-_9usYh)m1oOjIp+(=9^U
zYtTYmMT^zJpkl^qHE=X1D6p8;Vdcq56*!s~#F4utot6S146(>%IEd};NsjBI6BIAN
zv4nK1xV;@8{E>gCMj&{ZtnV?9hmL(Oe>!c+*>QuW?bFOqgF3;B3k!My_5W~5J$x0T
zy|uvJ2S^wEg=@^fR&cicFO*}C9X;_LkS!9(B-m@eb
zLLDhQ;5EvPGdn;#)GWn^+7DrN1B5;9xLiKEURK1H8z+f71TelHIE0&$?%+ahXGx0EzO2o{gv)~
z7s=YAl!&J*dZ~=zP)rJ(+?!&IX2{Ha{f?y__F;)p^N=nLgL$w37hin3_+V$f)iZcZ
zh-di1$V>d_!vdSboQ3(Gjqfsqor{=^V5mYpB8B%8Wx&BV23%G_a069ilW0u-KG2S*
zh+$}tPc6#lUfakyNBTOg(-TLGRryfdSchx5)Dz}x1}Dc499_f5BYMdwZ9gx^i0rGS
zIp-c}F>$KM1%_RenaOi6?D_Kc+${rE#ubHrQc0_jm7pajys$!ooCfh#-`)#dbUgc4g-fwsz_evubZeHdeZ2p@zY8(Ga!&Ni^NpmC3=1!`ex%6>k
z@prWml*jD&WMuU%Ws|=ur5rfBGdIgg?+9@Fg$PiAW(?cci45Zufb$4Ce{z8GND{1?
ze;>n2i#xWQjn8`Lpto>?ej-z+_t6E7={Ls=6BzM-37~Jjflt)Wl93~lVZ<63#o;4g
zE#5%INrLF9;%pix6Z~y~>&($P3|4cZ1T0K(>NCvVo1iq6vybQ0_h^(DsP!5mA+$7lAVa;+1sF1B!-N{HWfzV;jo#bX(vBH#TQWWphf
zgX$2Ub111DABe;{P&t~58ypuxOB{)LAM8eA@$E66SwZyO5sSoPs;jD6n^NXeDKitj
zIce{b8x$@Yu6Ivze7={p$cUt3wrKWFVJLP_Ivt%l8}FQc+z{kBRZwgyc0JDo3!X0W?
zlkYnqC}T*0_ukuk@yOc+F_N|+Q!?UN#{WpmxJb#SAt958FZh8+3u}z+y9r|8&?Hy~
zOU!+Y!%lE5m5YcYulXr8XkUk#mK_tEWYod4XA#%#&iv++sE9X}lmQvH7nSqrwyt;A
z;4`1>`Y9w0E3*}L@@YyXvSa-G4a@uTwZf8wA&pBfjL}@lb1p}>Ye*N9QN+@Va)}re
zjqcGA_ioE(W}UEQ+0Q7Cnj^a*dfNzSDO7=ZQOSsq9}%v~p}=mF!%2?3)Aa7UD7aR$
z((W$K1w%-_UHW;nm}u^QD+aGWq{rE(#2UmmF0`d_VQ_~XF5Er!M|$SSg69cDw>~lmT2A0UcpO#
zzmxOQrg8Z4f&wC-uz$u9SFh-S{W4e~G2B5D#iN>Lw##I;>@LeYipF!?UEv%`aqp_z
z9hZ$+I7$s)aA8ioC$;>^=D4+(jiV(M+kyN(?LdB`{JZbn%%IFzJV>H1ge
zeRXX=AK!dx_B_G(8#YcR;k2oyqw8=#rH~@{jY$>=5(ho|x(M1jv=g%v6%3UD^LrWc
zDg#vnY`Od46KfFwpZ$iyy8^555Qu?TStk`=>^bU_G&f?blLOmO%iNN`a2rY0Bj4;`
zy!#*&@4qPC{+*ufTfx=JxWEuyYYuPW$pwrwyjhLvY1?DJ=sr-Mr;18O`t2+Yz(-Q+
zknR|23ghEPu(+PcNsY`h;DYa!AXBP
z)olWuI(pypVM-G&P4sKC?gIO<_rjUIe6K*gWtc1z*QfIeiZSI9bZSbl48;07EO{_4
z1fo`Kemlz&EU>H81g;8w<;_iNs1t*d!;+&rxFAYCM`wKSw)gpc_WggkUCl*sqJ(s=ozAj$Y
zHp~xvps<9XQU-+J*CUD{+d}^Kn=)EsauPWnx?B|=l6LBvD)j$+*|+1bx1Y-%u(Qxu
zD*a+Q+sKhD`RmBkT1Us1=8c>rMA2`ooWv^_3XVJ{6|D{2RV68=b1#XADf}H(X54W0
z%ez#;e@i?*R+Pd=6sokia6n^qd128dzm6Xpc-=c(Dt-QA`b7LDw9Zv1)-%whwFZ5p
zPddz&$r_&$R5Cp-Bxv?=ruujvb1hdfMQzzVD`8R*RCV5p41K19VTTgEd`yfBWFZ
zuty7MACtJCzL`vowl5tm;tQK$#=XKb{U|!`tntbt>`kOKlkJn|1Ch2GE0-<#jXoSp
z)S8_TJh|>xsB*I60I?a!_|3ybvFh6s5NZls<)wAG^rGuyzSEz;8j>$
z72_B&MI%Ln&Tomc^MiGw3%how3Qie)x_PL&Y3L2}J?UrnRL>y4^W5Q)|8A1;|JMJP
zkqIgPh1B*aK4E(wz$QD0#kNq|2jc)9_Pu
zETY?`;^<17^Hl5@i~Z$mN3VX0c^vh|l%Q)!YJZQ2U;W0Q)|1rZ{KM=#cSHB
zX9NyXry1kk^6y;!-6)b%OA@|m$!7(o`Wa8rh_{CH9Ehz@zSt5(K{Dp0I!3Nlf0Rv`
zn=aK?bdeUREkAQ9f*p#lrLhP&tq!LOd)1J9K$_fIc^Xs~^?_ufI|24B?|hPm8uLbg
z3z21ZwvNMZK*j;G){?}w;vd@GJ#E6tw{s!5X28hZ3p>;>JcX`XxvYSVb!4DpynNqw
z2e)zS7)_p(>BpMc>dCx1nA9X7PEO{w!~xWQJeNd0%E}M|pd+fkM^!sVED2Z>=1#@+I%4o~Y@pHnFO
zS)}NVg&5vg$n{HPJy>}<@OR;cpXX+OH|R7UwlES+_cs4mo1MS3C7IUS;PV#~Lh{&R
z8unsX1A63V^iEc@2lLQEr&dqE<2C&0Bs*VvnSga`XT_gdjG-RqKcg9q_uv@u=1dwr
z|HEw*<)YV_F862331*of|9+qN9p{%%~
zF9rOWq9pk#{&5)pJ_9s@7Z}~c0}4cO65`KYhCCm@zu(8*?=|t3;fRQ$D#%i5e}^0=
zWPD%_BKg0}PnROnZv->=U71gAMyT9A8m2z>Ha-rrc3uuQ8z2T2lMogK3yaA>z~Zv^
zC1gdV1i@fgFt{JI90f&|QVyHBqEw9A_qIze!h35$>7`B&FQKE#mMt(;^)czQv**z
zY46w8zAOIqrs&lqCySh@-BdMUc){z-^~RTQG|`}GDbZ@83V$?Fc+0z@bsNcsXY!}g
z?-$IDmt1Ep3~smRAA;KWxZfOfiR$VYQCfM(d_sp4x^~($A>oL=I6nrHsa8MgHA{ff
zw9vd<^+19cMXd@PD~=lH5-oc0r1$$ae)O&bz5X}rCF8%Zs5U6E+oJX@{U;s66mtRzYk1qjkjfDy%kO0e7^O5APu4sIZ4LYcmy#9N2^v!`p
zN1cMK%i4+ta;c~vmWxmA5nOUJ}U^!CR
zYPQ*nrPzKWyPw)l4qZO%HU<6vHPq}Rn-4W#00w{W*M}OG&n4WWJ#XRAS%8N8)sdS5
z3n2W6y4`k|f5r^});I@!%|a7Gol`U2mpbR_As!>P9_{QiY6`X;kD(=tMMxy5{0&1b|r
zmmsHG-pvKa#_Zlex9xN%Xh1k`MMi*A{<5am{ccT;vR!apYsn897k?-FjuRee7spY0
zF8&Mrj#hkH>$=20LL0MlfFBnc{e4=74nQgmh&aa^OKF}l=J`}Im=+Y%~s$CtwK-NA&V(wGD#_iAC#b~pGoI>3lXEj%PG2|5b<<1)=+yiR<>RX&B&xU9oRSgBg_I;q-KEpExRiUcEJk8O(TE0-xkWT&(P((Rj
z^nl{_V|5D8(|ceLD^z2r7GL3Jr8%_064qo|EsyPzH>^#Z1_dFBiZR|42}GWoh22~o
zdT^^NmicOe2R00ARGWgi$?)G9;9-Ly}S{jzTGSid(v@)d2!Z
z1@t$Z@ISCL3UIi#G&-ShRDZ@nCutQ>ZK?bN26lhkVSg(jZyygI_Wiu`3>obp-_=Ik
z7k7R#Tj8N30JJRjgb#Z0c?B!T>)Z$hPDfj7*B6`)y1Q%LwibHc{f7%1Ax=g6ZfA-%
z2ReRvD*~yR$khkk^S9e6)uK><*5<-QkrUm%+Z>Z+k99J)lV@Ysr%(Ic{kPZ8pZ$EN
z3m3HLB24?7OlIf~hmTKNqn%UTdgp
zp})F~z0U|n+r5?Aa|}BGBp}
z;sGigGzo>>j=yhq+8pG@yn1|l@EoPqMy<7+UDg`~L68m0r$PR3DEZ7U@GZ?ThNtDP
z?b@R6Ih{(oEWI+t0pO^Ksc~P8y=wDR>~`nu^M3EsveAjuY_#K&4%y!F7YYF4V(`h(
z0|Pm>{)D9YnDEbO_SheGFE1F5mWS`hzBVJ20EaoQ&NMUtG|;i{F=ol|5_VVRnqSuG
zN0d|sucDgw;M(iFPc=!hNW+E{aI*5Sm0sFW&AmkuoHpp7&K|91v-px40zX7dBN_;n
zTo-hK2&WXsNT*h_xMEE(8xm9OxX1gL7g|iYA}-u
z*AB*DeI#Yj)q#4SCn<3a_|pL=+*yXahz$9Fyk$2u`gqwL(f34JMc`4}KoJ*
z{`KaSdNK45^5-Qzj{d6#8C{0lMOu#HF}{GVh_yo^jb4z$E`
zV81qFz&dLd3Tz~6D-1+K)gOQ>tU&T}9e|N4iaw#cUa*-5A$VEXNErA&69trkyapYv
zSgIxpq=`XH0Ly2plG_G70H~V%6GRj_B)ttL@QBFbXT`-C*i9h^wAebG?EZZ;A{Yq{
z_S^Zmj^vP^ufSBKrKC#n7ef!InD_4|WOUuWs3nLX$f7J4U^r%i!nKn@7h(@Z1US*L
zl4j9BybP?XCD?)4orkt+Re2KEMua#JTM8;RDS!TO{aRce(QOlt6y1|*>Dk$mM1HLS
zP$Y7>XOgxSGl1pw6W_4*AB23v*_{j>fX^oY>{wsk0ls>vIS4}=CXW(3i7G$bLx
zoK4=DBDQ9C6_x&JXz|?1Wm+FG->ZsRnnEyS>qK!2N)l3r?qroqU#!Cm2I8623GTl(
zB??6JOXQm}RD2O2t;}v%l*l_T21B}1O-}WSdhH|ps>@^?C
zkB;XB=>C67feEzQ)Zx5gS0ls_*2g%)>Ti0+AYkbE{Im*HZ@=GlC6oEOtf4S45hC=G
z(sJSQ(F(=eYV7%MvMpdVa3-L96XmpBVs+Z!?)DOPNO-xl23zJ$nZR-5wefvwEJPG+Qd!A9M&I(_RtmOY}odp4=*YTE?J{}E}pa>rh_W`MGg&tL*`tnV`y%{L#_3mDb@%(QzL39F)BAQVC?_YSq4!+koe?fs+?Rr2?n
zjNUWpl`W)Fmcf7?Z(AOWSjO$wZDw2|SS&MBvM5fsJAr{hk|a
z=LP@q#(`p)d);%FtT+EAL68sP<4xIerx2N_{1Qk|yJh$K3BG>Tec3SPX=#pC^ee=R
zQ1K7%gV6Bp;hxeL`1WR>d|Bs^lNUo>MdW@&t+WJl>NuQ~lb(Yz?0}Adh1H~Cf~@wl
zEi!)^uh)7kEEAWjy^gKw7B!dQYCU$XR)_Q|z#RCaxPSYDN=#Y9Coof+2|rne+?wN{
z_vi350}dklNi{t?k`jW9nl+FI?1ON@!ludCNK--EllURLid#sbCAI>MTPsnO5RcVRfYSe7uww&&32j9n
zU2rzx2HC2@P{=!Sw(M+2iu4U72q1|@Z|ER{`ol{$D*^dq$n%mmf*fr4xb(HZzRP1SuaT60;(q3CmX$Gb{K4SH
z6G-jv6CHEu4glPS$B$E)6L4ILJ9h+#)3&$jyPeXRf4|>08p&0k9JaR6o#+|lwmuK;
z&O!`QMf1GH-D9LqGr1gydX&o{)x1p_jh3@O&o~>nj=u68?7oD!Z%Do5g7X3Gs1Sma`F=M
z^O$qIepbn}NBS^>09VFzQcEzmICnGhsDa!`9@m|QK^9U&W7=Ta59|~=YRwL9z>CdN
zqyM*Jx0+U=n~BZj2lavn_9%#Ba#(xt?y#(TddSy6bsAy&XeHE&Y>f<2C^v>KIzJ*3
zJrSp3X^Kj+5+LSBh3M)$e=-MMoV)uERm=ohVg4OZNdaL=tb)xUV3vhX5}!6AZIszBeg!$H-+H%1b?e=UrawSBEtoYf-t!R_H_`~?)*2T?PW-9#NY12rZ
zf%xa~^S2s~pE)AQyss9XBT|}ZV?XwNsJL4Fs3e}w?tZT}L;){C2L`vKRxdN
zHd)xW&kPQ)GwiPoZ7;?9EtbU%$9>@ZpB2$yK=Jh%q6#-(-6n77h-H=XvK4cS1l!&G
z{O|fw@x@+lMoL3PVdM>i=V+w|3YZ^%t6_eHAIYkCaJ?NekZ{tw)Z{x7Y>Wk-eDL|s
z?2G|m_AVxEhnUO+|Mf=d;xHi!`Rg@~=O>|}ypdko86}o}nrR`qzo^
zlHY9c=GyUbE1o*%|IieD6~E5Y)oO{w4!6-%8=;5(@1DtF0?qwSDqV`e+`FsXdm^yB9&+)j+HDp1FijFYYH7mDb_3l)&t?t^t|srptK)M
zp~3hHBWLKW6G1Ajo1K*SS^i;D{IoPmbN*;VSDuE)w5$ifD{06uCCkF(hCg?mJEN63
z5(xLBnwNp=siMC_LyA+-NaSH(&2@=xxL!i2-pF2jp+YkcPQE$!s^-65Cwr+9OnF%H
zwzsL}odFwaD0xxNgVs}XIFH0rnsi*oisF+PrYqki*Y~8DUY{mgBC%4*aNbZ8_J+&}
zLvxcC)L|M*Fyi(DGHxw2R7jcRwo`co6FB~{07#!8#+z00kVrDqPIyTz70x_oZkR}b
zoB||*!J5;bNCFmPL`n=s`x2{=2+B?tg=MP?Ajv3f^+LiRDNyuBVxf5YB?0Tk=+Ezq
zl=z`Q$H>?jWQ^Png+I0Z%B`rvtlj2F8YuZSgty&Srw=o!U60T==(@_1wChNQ9D=4y
zsJ87QfGYy+mox^YC@y~4AOiv-3D+CM1}h3UD0^#TCIY5M9X<21{V9P8q$4rtG=&lXFtYhuB5IG$h2v4bX?h;EblR)T;tDvhHe@RT
zfMlP9$2XmSkz0OCGie?|btv>g)3-UeYXYDE|e?qPWhhkj5O3kb9X;&3&*y%Z+=BR{9
ziXS#`gHUu$jNt5{hHDiu%Oks^rUcEH%2jI3Mv@NA2VHCG5aT0{SS)n1a_Mt^SFCV;
z)KV!e@zAOICl|M(?25{y{zI&gyz&xj(!QUU7h5OuIFL-r@kXxSUfTJl(tOaKW+A#j
zkLe`Pu{7!&!CafmyW3t*{)bqzQ@d7~TZWrck%zVxFJ-NytOm_i^@N5cr@MCMiXeN8
zRoIAbMv8SrIIJekP~$+n-im6Kr%iASFTg!dg&p~XrBk|<87Dg%j9n~(FJW9osq!x+
zg}Jhg5IZ^mdN*7ivs4+iU8`8Yb3)!eNo}W1>pO~qzYF8VlRQL?3KWLZ
z%NfKX!kZ$5B*V3kL&LmW0N5I8iY0v7TLDtU5oWNwx0B^o-*$EM%fnCeZ$f{IzBT3g
z%pmVv*8SWoUx;I-9_ekZ{dUSRsl$AgEk(Cl9S;0%W2?Gt{1|;w?t|3)DgllAD0}65
zl&i0L`J^=4{Kk%7^I{lQ@>cKo_`G7bQOrapyvBGEDnvO_VzRcNbGMNTJ%4l4k7PlZ
za#I-qJ^xs`4RfZVnErMpyudd`p{@H3Pw!{T_Pu0V>m2PDwHeR3@sQ_n&0fW}cgoI6
z`(B2vdNbmA-23A1ex9t?-N7PiSw`NS*U!z82-zKvZwFeUhmfnW^maMJ;#;xSf7!3u
zgL2M&Tw8l>ea-Mjmt0yuPT3aD?yA=h{z@kwek@rM|MAU>*p!|tiYc$n@
zz()`y8&Y{;;vscKILxg8dMwtOdAJNneWk}vE!Fb*JZxbozp}$W0A<6JhmpFY^)vIj
zGwh8>jw_N8kNc35?+5Kl{U2{iu$z6nKBMUukpMtdYp-KU;TS5>BV@EDtQw6$NW%~2+>XgwTggB-AZS$dxIEf
z|E^(H^LMAgLXB5Ak`_^YOSL7~3ac0evv-=tjBw*|ls6vuecRLS=&u{&yo3cku4l}M
zRtpDIFwE2-qVbfoR+Qq|r+5Ou+}NBW{|-TEz%i>}tADQ9$cJ_9x?3wg*eZhhotr?%
zr5)b(D(HEgK6rheK8^I{Kq;DZUX^?yWzxVfxGWw4IwuaLj1kk(iF|rw6`#P*kC2
z7N+esf8qOIHs&o7=k$ZjjV~v~nUFEB1Q-LYM&RbY)*90wS9mGGzVOU1aM!Ft%&=lpo+d5a#qvnWojM&rbm-1u+8c
zDHY=OS)xRJ{%8aB>=UL@1l%f0JW+VeJAjemd}JtQ%<%`(Xa{G{Nj0WHQjCr|P);4P
zMhY`6%u_>lrqdo>+Gf&yN?1)e_V2rng&Kpv?b)azL<+IUr4<$DRR*X(wlbq@!g5^R
z=OjzQHp+kO2#W;_*`OCvS19-B1I@n5c}!^6uxvjihlL?xDOH+hZRj=F4ju2)^BF!6
z-F{OTGvcqfgpzQ(wyle&?_;)c^}Oeohzu8qN%RcgHo?&Sji`8(yGQHm>?UX35t#AC
za;RPvF5^YJa+lqMteVe5ZmgWVy?u6g^9H1udeu)QORxfyU!K!P*77ss*-JwG#%_p_
zk1!PQ?}@_oFy>=wLgj~J$RMIw@`W_rrDHI)Z=TlvCN^5wpQUhwq9xg71w5wWQPGT6
z9nR3_sCnN0sv3jpcaj(&J^AX2+n3mAI=KZLC%s%)Y0mD1+4Or_WiYHlu+
z-<>HasuSS`8ye~w9+=QU7cm|QUtNsGfw+EapZP^RQ{J7F0`CS3nm$vj7Axj2IKmn7
zH&(m|q&R3J_~vCRy0LIW`eHn}D8h8G#^yA8-BrUdW+wb!EM76SwyB?X4W_mMz{2OP
zd@>?MA!dEz47K!$CEy<8?m3`k2f^d_pXdE^Uz?1plZH#j@mo=3b?ae
zwY{x)J(*w2;@)peP^KrouWsa?O>9o66|=E#-@b1)-zf(PJ(b@DuDX(@?mvjkg+$Eo
z0qs;iwQ4>NxPMngq6i#)ybA8cK7AO!@HJWzVT;d*b`-mE!>=R#B?)Lt
zHiR7Wi$k$DPlnnvxsEv0FEsRm-^fAM-dIUbA5A=+;1b<;bD{U&)I3K*DH;+R)8q7{
zW9gY6%$;Acu9wYSE88FCcI+q`z55QC5*$cO?(SQC=R1cESO;y5Gm#Tirb^p7k{B2}
zKQU7Xca=+7wtZPGAosbct2map#?2+NfPsa!F_7QR60q+a#F-#ZZ;p6Ru*`+}M%TI?
zLIwa64}2OvJW-)Pg#6SKCe+Yh;OLv&U_j@Z2b2kajUfP3a?OqnfM2u2C=ZRDk-%#T
zSOgWZ3P8HhkQT9a-fy~5W)3~Z<(WOpKAGg2rLFuSN4=%Be=Rbv~}K5dpN
zBLcHd1(l6`St*$a+il!e5R_Aa2Zc!Qn+{6ONil_}Dnj$Sw6iJW8t=4axU`r86)fae
zJil*M8uk$A2}s8V+AbAo^39nrHSqC@bYV9_G2C-K49=P8@+qD`p{9P=P1?WL*CnB#Z%0B@T$Ve1Ph1gvc)B?bflG(<=ej)
z&rXD^!Xl?(l3_&Eky1Ien+|?uV-n{iD+OnBYQ>nL?dL$}keeOix-=09cf**G?UqML
zG^JFwjch;xrGET3V<;h@dA<$jRUN8ql8_UWwUlhMkSIaRZD!7O28^jLuL(r17m=f=KK^UNs^s!emMiuj{EB}T5eMqE@6
zbc;8Q!TutCW_;g`85mxH`s;3=>NKZSqH@a#OO|0fPFjD2ur{BXLaBHryRM|uUv
zdM<^)9?ZvRDHV()8C=L|c{#c#-7xF#bYDk`0_j~3ntJj?ScP9AsGK1YZXUvG)9zJf1?Gua>j%=<_)IE
zsQ+YOE^=&TY=%%=S|<-cz7A@4es2)O;D~MD4#K5&ZVL160Tq
z93`Tw$*SIZQjqfyrFqaaZp&-8xQQn0>*WoYNTDbXztj1V;zW)QNK{XQ?|F6AMmGYH
z;vtHw93Y9TkQ^UjQOX*4rFqH9Or%shc%GMfvFGF>v!V2wXNZqyQ|5L+}G(8>bk$0kuv1rs~iP4
z$~VP(k!*H%Iht*WZU|46sT&Du7MKK$HsYU!i`?zNFEf{8IjgypnyTB}$4xel14Fs2
zPul`3k3kjHoD)rKSL>j);2q|;a{qpPaJ7LLA5+C0>0S!r7vG2{T{?r$5wSLHeE$v+
z8h)`k-km>dM)8!)-@vE%pn#(9{>?N8*2b*ww;Z@6_}cNkFe8?&*euoB@m-+)ws`q$
zIaKAOem)}>{+#+?QNM4A_po%($nN%|+HR?KgnA7t<*tA-LRS|XZjHTnhxmXwaM1fN
zrSQ^22jU{ZJBr}zuF=#K!ukC3Iv+LG`c&p&+sAf6ulUVWru7uLc=C){0
zdDMcOX|t6F65TB@1un(L#CzI6Mv&S7LTGlH_z-xKj18!95(xR!z<`i#;OPfE*F|t5
zKExdWVszF6(-%n?dSYjxhH&>C0zCSfAkV|TflE*Y70hZuGI^ad+dj9^>y5na$l|CF
zqD59T8J;pQ0XU#h^30e;r}f+LwL0zMy~cT`~_A)f7sPdqn&y!2xb!
zVBP6shs$faFraBF!Apo)Vtn+^NsgkO4Yu|eWPE%xdN@PwzsM^w)xS23*?mx_3is@}
zSQ_P`obkb4*64(4L$nB;eeExwPOb8PmCA%g6ny;rm$+s1JSiHx5gTz#KFG&$NKw5}@b$&FJ!
zg~(C%a3%#S*r>(vogTOBM2?o&B$vrnNvg{YOr7M7D=ZLnJvkmW4l_Zhb~T|7ccBcEFf2v
zXZRgE%o?5e6FP_bVC7E=^sh9RW{kzAqOu9}*2*Z)6DkFzIrt|VU)t4~SQ+T7U$54Z
z-deKS!t(fD*PhJW1ZA7ySZlbuxh1rIW2pKk*63>V2m3$FtGj|t!e1%f1(
zOb<@fGf1_@)XYKt6CG#aSIiZqJ&iPTZ|v_TZUq-za@+J9pH6Z$4TUx92o%feMS6H2
zP6TfU=cb0aCb@X`Os^>2pLRw=Tx~P*ZVCHK8ltH9pKyLdmA6KxNI&xR?HPX7wFrIH
z`*zc$MBP5xGJC*PWIG{b&E(OAHSK(-a*_)9N1UMxsy(h8YgKWaOMJPVh~_esPav=h
zW^QYh1%OY)MAP}SSItLXYWK?@o?K`02cdy=>9e3Qt((q>BEl}_9}j>{u474?Q^~rd
z%!ub)q~p?^&e6Bn>+f?D`xrz
z-*;s+gL{tyuK!T`X-(!-Nz9SW7C!4!O5l`
znC*N6*p7yeh$bYE9fiTHa)huzn88cloUz;vcZ6{(lOB_-wNhDjOIqz}5eBQGcZFrh
z$2b0CD$XH|`?eL?zuT+6Hk%54#W;nw6XvfNI|`Sw=KkCYB1*GF80u6k=$$5U=fj0!
z1?q)UCY1Jbe%#h3<{0FbRsy;;38(knRT6wWrw@gE;lL1FB!@ZSx;^5L?r
z<b4m
zt;!Tci0v>;eO2Do+5{`s=Gg7pUqv0?t2U?-+@F29S7b3uw5)cB9vf*TqLGY$q&+8p
zrD8;e!Yrp@PRFd90VRnKpWC$(K0jI}#dR$1QJh(+KVXw7E-`=QA+Mdk$7NNp&6>k|
zZP9x(L*)(TyDRoWj2VqerwwgAQ9MQ0S=qRUOugw=@me`heOr@()Ydzl?@jC9DpFqo
zj0f`-r#SRvKB-cWc#5?*IW~;p6BpIHe;7ta!w1jmNqV&p*r@CLcXEx4j!!Ss(-Vf$
zrh~x-LJ9w_60Q?1|Gq$W(}$E#O~EjhgskpMKd?RsZ4f+5paBqMWIlnmJb&DZ6?7#;
z59iI3(R;&PwDs?k3s-VTP>_*{9PZ`ttygh-#DqTRz6*Jm0N8PFY-nIUC5hV!a9kTX
z2D?>C5W*pw$|}&{Lo)S-uM{Sv$-e8s=dlQXZ6R|h#qgiw1U({w#Oz91Z^GfoGJ2X?o^f?@)_KvwG
zV_nwLs<;ZEk@f2o%Dn$2SEadiy3KfSn6IqzozW#%oeC;D#L142|L}airk{zu+5h}&
zu0&03*3K_D?dg7Qa;{WWZFWsEp(Q-8gfC*YE!gpXJ(I6`&mc3e
zxPx*KedP@@rbIuVs4!r+_o
z4BDgG%)GfKwb_@=5X9+N7fYKJ_0!m!yWxg}zr;|9^D8Q@9PS&pLYkLF3fJNG-p(ci
za9^x-U%3r#Ep`H$TJkpt+0IS#oO}+B`cagQe{#1zi_sx{dn{bvDJN}j{|t6orCiaN
zV*E|NCe7pcP>q_W;iDX|5oV9rc5Hqfe(LRL_UcL7z1BK=$W@+&vonR->v9rmSh)Nn
zLJ(j3`h8d=afu%fy_|qM{=8OhaM&{T0Bd#tN3*+m%haM2R{ft%3N^MZP5$=Y36)yY
zTbXX|&DpTyQ}bofKZ>JTxT#_xl2pN_Gy?TQi2gO2-o3&5YuB~xG7ibiQWMvVy0vMe
zL~=l)_`JuVkrJY!jiIxHmb08h+A|y-lyKWSKN{h-i*7%Sb;0Ms2_wZ96Eq`fB`Ur<
zm>|DYM0<-C0HdHkZW4*VM1ZCL0HU1TRWCcIy38`Ozm}Ib+!y9FllU$VNUfIaY?$z{=?1_*~{&LF&s5)
zGp&fXt5Z&5!YMnaEp4DiOj}!H4$_~M*$jB{J^A+nN5}g<;*~T0uS)y!_ptN`MzhhN
z3$-K@J`r`0ypt#g+W3o~mEPYC2Xk1l?+@bfQcR86b{^D7d6n+N3OMwJRDp_ygF?;+
zc^`kD-bHP^GqzU?(k(PQm$r>wCQrI7En5L0N<3WM>9aBYH5oy$SM-`|0
z0f-dZA?^g-{C4#nKqZEPM;mUEbW1mc;!ZVs#r9Xm`alYO*E;7v#|}|ug#7Rtbp1GG
z7RNyfr~gH{FW1q7R6CzXF^*RUQ9jTRUG~klM-2raxP-vW7+<1hx>n{B_^$5~wv&Oq
zHaoE40Ft@G9Ij#-zZ2F~SFT*IfS)L950yzBY)R?W^gc51h~R62uM
zko^e_*->GV-68;ULd%lsDTg1HZKc1^V
z9S@$9yKb5Qp6rAL`78GqxW$@+5ew+WIf??x80ZD18Ed!FykD4cl)M=1*=fjs4Oi%^
z$^ooAzy1wMx8n~49`5M$Md#fZ3_EUA#CaSlcNC`YRmYn-zGG4F%WX-zrz8$e0u;9*+HbQViKM=
z5EsAhd%DX~*`E7SP)|w(St@hvoMZ^P37=>(fEu0y<<+6arE89WfD-|`Os6lLrx&G_
zq9fSfDWOtaIo}Cmzuybm+i624OT9K+@p40rsRBKFv`uxHb_Xy=SVlh8fz(Zy2DW
z`!=fR>Z`RyD&NgHa@Mw9T$rbut_jtaibq;1o$BT*YLC*jT6F3IMafI7
z!(DAcJybQi=^LZecCDeZoc!c6S4Q2w8(-u8i~O^M}}ATa1Tc`ESd;;C#f=yeVihdRwO$w#3XeVj)cEhmJT~m
z7~H~jjQ{qVt=J{*bEaGTHiA36-wlHD30&eob?AbTJKMxo@Gx(#Ug5-wvGLbF4#(a}e|AbDN#A=Ikv
zBer28jAxw5MEVS$b&mj+IuglViOmHEQh;Tu&*_O)nt0Tfa+}`7O|DRUDRtT2J-&Gi
zj=E?2_FXe?VxpCEJC8~9?OPzKU9L;o%vSy@Rqd=3C`d&prthgvmF3lzc#N=sM0*Lt
z#8xg2En_+p8|8kB*5VG9_Rz>l_K%<%6Ew-EG_(s#I9g!M`0cl&1+z-0?V3DW0z_IU
zAvf>N{9!$w3cD_Qaj)?j5Gk4IH6{CMrxS34Mu~d^M*?dllohhNlh*yu~?Gyh?g>95G
z(x{8lWBA-iwr<>ASR$hOX1tkHo=K(`funxqyN)Y{dvfP!eO*+k!8Z5Ww9{59t6t_o
zHQe<{gDmqu@9Y7&F+$uqS*~8qR8cDP$`7^F!YYZw4T6IJo>&U4GmrLQrY3JDEB7qI
zH=oS)8lktVFv2Hj1C&GoTv~1NLZSSB%oUB{M49`bwG?v(O`h;6I4Ze0*%-+tbC!A?
zN{VFeNV<9Zon#Xf;48-yvHt@77r~oadz3zA+fg>C^X!0QxXLd@;2^QzCl7L%pWJiS
z)a);X8|~w+|0xltFzAZ?!AIicL&TZ-{FM+7skDq#cw4yEICt16mLIKHD?8=tN#__U
z3+ivnGA7Wz3HMRGIF8R_3|*@c0zE=RL~kH=OpHQYwa3WO2F2nq6y6)bEDAu5BhKi4
zHnEA@wk+V3vz!;v%T!M=pCq}K5~NM&8Y@f6V;mAvJ!
zxjf&bTe6Y#_C`#(irwb>Ftd|XOB1du`7pY_!eOn$-Nm7tTK0C+n-O;T3uj=Yr9n+PEEi^C?ug&I7ta%ks7R-1qqc;I@x#a(7I|M(pIi
zeTfgf^EPb04r8xW@^-Q5l1iXa>nrabdy91E6wX1AQ%snkIN{U!j+JySs#5u_yi3aq
zMZmBNOUt8|Y#|Jpq29yqBZ(eMF+zN4I=NKE>=^0nw=WA>#3>V&NSyW*=EqHlqhLzQ
z0^5mfs!>5rN*EiX4t3dCW%OBFnjuZNjJe^Fl>%GOBkg{5MgNLZg27(>Ky%B{%r3hC
z87Yl6mDbsJ{p)54FBE~9$u9(79_@ghBbrNUdD!o_k_mbg`8s_=3$fo$Pk4tBLc!F+
z;hv+lqm{>9SUd@1SiB)8wHB9Nkof0@@5=g&;A(LDitU7++UQ4F3S)=$!S27fm
znG4Z7-dZ5dN!_7A@(EWK5$Zdk(L$%4h!%m~k@pgId;SnMqtPL&c3u{`uP&&Z^))yMhACOZBA*s9Q;pigZ+*s3rJ7?3omju%_ky#m};wr{_|2Y^~(7h-Ks`nefVCieTxd
z`C|8IU-=$)c6soj6Q89Z;rNW)!008&K*4<={o-Dg2ABf1$|h-mp`d(u;Cq#Iw7UMi
zPs*v7qxUTOESrWG=L6`MFT{f(%gT6g0Jai>Wo(wzMn9_{$f?U11+ZoNc9Musq9$cy
zLB&MIBYcs<7BJ#iV$4?h%YkWAj84~C^j)snpaM4u);=v#lU-UvN4YR=m^7}$bQ=s?
zj3l7J0onr{$@mD!+P7H+=VHL`CBgi6MYBMp-;F9k`#}V>rWE8QQRtM#;yjbvm9Qko!lsoTrc_6
zG^jmIfAn(ZnnkzCGh|fdqF=H$e^2HUo4jqrv~3Q0censHCXMX`UNmpgGOKpmuj8r;
zJJgcQ92ABYrwUtBj#OMX&N^pgSdc$CrWiB9hUE1$5{(%vznFL;c01v@1rcctT197d
z)Yz5UkF8*Y(|zDh1$(``pMxAnan+3mB0SE36UB3POe&GwgyKsZAwC6
zUa}DNWi}!OHU%EO9HcCM7eEywOMEALH-B-F15^vAJgGxn6!*Fc^jT_`UW-qUGZ7{1ZCUK09OCvBAI9t!Clk^>r
zQ$n4@^Wu=xZ>}YeW~nvaZyVv-TnzcxX)gxPn|JTDU|Y+Wlv-I+UNRW?^!A$8kZw(8
z)6OU)-*TTi`1qn35o_p)z2j*AIy?Rtq1li3>IsLl!jcXsJySeg7OPLsrQ4OYdZ$)R
zzunIB5Hn!`M%O+~E(bT&AI{Imjy2m<%tK!a@B3Y;u}$F*8B9
zd;7S0j_>hF>Dg%RSc#Fc{q~H~@LKWeBV<6R@)D6^C(%7NU^L5%HS5+=uq?8)6>=I<
zxmG=hNa>f-nvP|sypS~{+iPhkxy0C@Kdk2oTEPOhG2!alj#3UfI?#Vs(u9;5Rwaj0
z3MAKu#iiswPrK9byqWCGzt*1>qZ~2C%|2lGnC##%P-$*CLl_rxo~Mb;j5QkuKhC-(
zdHG8DjL|VCE7cwQTXE>W`_8(uocfjYF|n$75~9){%e8KLx^EZ3d0HOEk&@?UCHHze
z`JB$B1`XBL7v$?6-b
z3G#+Q5HgCvoLO_ex%7R&ILZ4V;y?gb)k^?)G>aSj01Hs0KF^{Q8BE5RI{Ks&G|AA9
zeB)gs)ZKqw5|pAnf!cTi=amm=+87JD@TTwO8?-wxk16T5N$$b97<#U_7`PVRb>DKF
z&{AJxU)xT21$rMsIn#O#zT7=eBhEZDKTlhd^j>RX>5Xl)k&2U6ZN#QOzU5zvPCAqc
z?FX~#RovS%vyvMb*X
zhd{o)*pdkcprWzx?;w@JC=kL!H_NBLBdFJ^k_WZtlZqzqGZ^rgjjX=4&7ZNUy>{ktrZ
zfJ~@Ju^-=WOrx(^rnZeKr?x%y)OMTNo!Yj|ncB8(PHlgAzjM}E
z=dUC?$+MHJwRfI<-`DSY$k7Mr3O!QhSin3hDKEq3zlKv5tf^x3v}B7D__j^^RSAf(
ziX=--nP%5A*2J?DqsVZ~K2;ggLlk^0bdcL)o$3APMHPion=T`uYVkTBb5z^rEo@_1
ztcB$ADp;_;{9v}8(aR*?BsjubX!UelU##HY|06+7hsxLKCkkEl&?fUr)&zi`0
z+ORMXLNTgXJ@y%7p@I3D9XqhUGR_C}x%M2AM#a`#MO(I>N4c(9Zg}*nAG72F50
z2OZM}F_`9bV*{LlOo}{avo4yA7tZk<=qAxeKMsD4)j9@xmJyr$oLPYi(=fhHql06{
z?Or)zj^#mT)&B#}wIw3qE`{YzyD$Ua+b-aGkU7U{>B1wIGg*uu$vZN0EoUF_+n5$#T-c+1)`*=zY
z*zPJtY2)sACfrZMefeG-i;60T#|4w?3yx
zA&x6OxrkGVHwFm=^rRWVt=oI3E9pFiuxb!i?#XYy?1KbxILbR|yB}Dykl^~~;cw(4
zrfSE-u&*cnv`BzKVfB3&nPD^1UQ%9KxdBan8tbA=mY<^aUEts%ODg7yKVZNq0uB|Q
zoIG>{W0@Q^-en#uyyxflQxh0aXDC%rDnZHnR$XIl$SHwF+Y?GB9`o(G#fetZtm1{D
z#uZ|cmZ76Y{SKn`mFSugv4T>YKBZ|R(p|`+3O_5s*7>df9D;gH%Js10>)ZA4VHK$;
z&*rRIwaWGI&%aIh0GTP}>*0{>F$T>l!~>+~cs#>CTviA3!?pkqZqj!Bl@4*&BD|^C
zd8uD+g+B$Zu`Atb8cd+I7PVeq`p(q&>+3d7c+O0AC;KnLPuY_4bRT^?GyiQex46~1
z3&gQmKehdPTR=lu!>kZcsf){k9Vn-O8vaMfs8=JRg(PUsz-#jd#m^RlpTRo&Nd24D
zjrc!fqTFq1J;GeELbfP@8q9UAj>yuSz#lg+^U>#1Ixt8^v}C-eng
zL|fFh*+LMH4cxkPwG7N)@FX}JTgYNd{K5tE&4*`~&93i8dj%qbrAx>&4oX-sSHv_D
zt3YWhd>2OQeWkBc3zcr;ZkC*7>kF4oW5ydEV7H*XTmlJ$x4=Q6ZN64dyJl8~*jSz3
zo(f}0A%$TTSKf0aKS8v;e(;S5XHRIA?KL5i5ZKMyBB=cE@ihhjVAt;At35PMa>oDI
zQ~39lDXAr!<>p=Vwnk?g4v_q^fSyDw7zhaM{rvx(VkN^$-~NO-#DATY=Xn%
zrRIGRYlg#{ez6<&q+fV_LDj^3OoKMA1pgUdh=J)7YW(tH`A73)Nr+XY}mb>EEpT}9X#w5vsHF}e+UXERDUGP
z56vPHt@LD>>5E&_S`m-naS=Hwrjr$Y2AgsKfk5iN7LzE7&vM*wAX?gH*)b|$*l>3P
zg%cqIK?tL;1%s^C6Sb9Da#z06B<3^VekYUo3STcJ=?!b1(ai`PjDsR$K0M*kvx9T(
z-OF=9G}l%jbC=_b@)YInZIZ%HU%}=U$xbk5CubXKcy(-5%yF6}l2tg)Un;B~RhS(R
z0A04`7K;mZ>#QE-a4P}a0R}O+)j3Dn=lLKcHtJqX8G9C+BBt29br$to?uH6|=9Fga
zL8^-_BQFKTRu${Z&tk`4!t(Ww@f6M;f(OCO`0UF(*X(UKlD)7_i`U*#12sxO&2&!9I$O9LDsl
zG!!ll5MNfx-~N{fn&(<$;h&v
zLR3g!o4MbVW>e+vxJA1vjvzp$NW9lwm!!gvg--kC;vxW&D;xQX9n=U7Zo%!l&tmYQ
zlx%y=qWCsFWwCSq?=A~vqpN%$0wuxMK&SKa$Z;q7fyhseu!}^&hWH3>^1>jM1b|Xv
z68WL^1r}fo?)1Ou5uVgC?frWSHgVECtVRE8jGc8H!5ivFgar{B{fgLY#!0f#Rauzy
zB9EV)?-fF^npGz>Rg9&rJei$C4tbM7mV5P@_-8HvWwU_3vEl}xpG>WflZ$PqVm|uC
zxsDB@wf>Or=#)%O2YsoSrstjENuJtG<=U=Y{4V=Wd-{)lcDExSyG{$Ws;q&BUbzNH
zH8DZv;<88#F-xs1bVkwx&9+
zj_hLnsNiGLonzwap)Vt_Mo90R;;l`gVC$?}U9f(_PbSNSf@eYd(e65W^@eLSQF&%f
z8^1>V8u+lK#JmZ~cYaR+j-mD&toi7X;*iuAR6U%U&LXs!
zYg{K`qkB0$<%JIrE4GE$2&t@IH3!21Vg>({{ByxT`+eEbm8-@u>2YKY1^7Y8zkN2S
zMy#sex;GW1{{rv$^3Pj!ZLs&0D@($8>hQJxOfdH*6!A$`Vx{*{4G0i6k@RAq=z=-g
zd4-2bF_bZ-wPv|-4)tAM&YhJh(RskaLD3+rrMu|6-IN?m41W)$tI?LMw|zHPg&g-o
z4t{Free8q2r0CwSUQBP9_D#Kg@@ZoeG7LGuszW8)M4X0GipPKie4X{BHKr=T!w2HZ
zp-k5O;DR1L^s9s^g*E|6XmXslU^5?kxFG@%X|_Jw7gO(+QA0|QmIv#^Apj^6oj;6B
zH?(o0DCL^4M1?t^isbS^(An-OP}m^>PN-U#JNh6=bax*b-3u
zpv#1|q&`idPkK&%@ea~Dd-h|*6~9qe#?%Z2QHRa)+Xa8R={r#=gmrz!)13I_=i^=#
zlnf7iR{ftS)HBkL%^;tfjQ9^K+8b4rp}+gB_iV9BQsDn~q86AB>lsg)ScVsz917?M
zB`{UF0q}k{(6U8%k@gu4CI0hyypsQ$6iuEfe(m4&!gbNiV7uz_%e}U;1sI7^P=|t2
zQH-!in+`w#d`}jV1;8O~5_git0(v0{B6m<3NiMmUz>RY&s3bR34m&s~5)$BZw
z`FGNCnxNYaKKVj1&yH0TV|=kB6pHp-NGefxP|0su@+uQdfJkZ!M8>~^z0c(X0N@ab
zrz|w25K97#1ihdKcLkWg&u<-{JDGs0)U#W=BCSb(55f!8i~3pF13(n3?}!Fxmm~R8
zD@P{83Mf+3LgjiCl$Y@pUM8=~lRHAw(gJS71}alIbl|RexW1t85xB8TE1MNIDJ0G5
zxPFOy^6y;$cdSqw;cGa~pQ`NPz!C=YrOOdk_RXGxMgk33;
zT8$YB>rJ618ySvBZ$#J-+{S6bRk~$iKLQrY=hNGi{%RgLhLlb{5(hS6DA|%3&Hq6?
z7=*`r{8=g=-{`&G;yj3!q^%-5SSt~n+c3z!r;j*4+l!!5(5~8s67j|F=7{-V*LjfD
zpBM9knn(MJbBHWL%l!AVyGLbdA-I@vU#3z4*WS;qTAJ!2|IKusCYx5E+5x}X8E_4!
zs$SYdtdQYiE7r!MuO3VaFhX$KI@Vmt4;+nG*0dco-?29kG36o(tz}Skpa&hnGn`CE
zx505@>w8)vXbN{Sh%rt*%tP*{#g{Y3y83!rQpB599BY78XYfGpre6S~SV#U6oeZ
z1yD~A*D`mEM)?ZX`Z)Lk;i*{?wI@iv5lM34j*d3p9
zUg>=aod{#~_%Z$`gQg|=y&%w^tKC07;NCd~%kU)Xo=e3R|7>kyz|Moh#=ogap7D8{
zo)LV`b?I!a9~@-DkP&{UsOr3%rL!x?gg}uD^?8*%gwFXAXL^jiHn!Ojp19`3+;MoD
z1ePB8UD|&i+9-d_ky(@EdoZ19ZHs~=IXexbf1Bs`&|U8w>wGIP@xtrqta<1&SGMEt
zkZfQvlM$Tz0TTL$#^fbL0UfE!wtRIx2X}RRaSWZqat4e-fjZqE&t&*skbXlRsqF{P
zQ>hroodw=nxaK0og2#cu8nTp*Vq4gq-^OZ^lsJaV`kh)e0$+6-q})x5`G*a!Uop_S
z=KxJAA|57*xuoAfrL|7^l<0<-Nv*-t51DucC)>X@qGu;&={-k
zWm+-p2d#-*Xy&x&+u3vF$;c~wSbIG;i7z^+?Clq&VDX}rH6<0sm5$MpgUWh*u2o5XNt@|_WmJTQP*7h%o2c&8hK0nUyTF?rDNAr7b)j}c_v
zQ173~5L6_H8FRhrT;Iq%3Jwf-2HsWz;wDICZr~y-s+dOD}^+C02IKnGFjUQ89Wk<*PnH1|`e4a~zHV(B7hZCR?b@Str
z*|7dqBdU)^xvH$U&C10N4EStuzRV9|8S?mbC;2-!1+-kIU4kc1)V4;OrU9WCG{gLo
z=`e1uPHD4%$vM}T2S_L!eEZcd@&uPc?=c~J*UfyygXZV22Ql6
z=E6UBaGNIaosfJBG}FtRF^J+uwgih8Jy6XrmkxTFXV0AdeiH;b_{9iilQGiy4C8(l
zX-m1Dj%QnZ#zd$*WPU}K+*eBG-$neCt@`$x^1Q0WkO%aGZ&d!f2?I5)q1geO{=A-qtwS&Q$1CA4XHiDZtjcFsEzfJ*
zEE+A3^aco5Elzp6l;9BClp<>a;X=Z%u_404jliI*H?LOVmdhI+doJN56p`g>OkxXw
zk!7(dS(W&kF)4?`{=xao3~%=XVtJ}0wJ9_cbK-T^){n%
z1Lx8n=+|i5OCWjo63d9?uU(#@G1uOvffN*ojkO^lDZ$&9+T)xI{4ExR*-JMYhBi+Q
z0g;U^;s+(Fn!mynsuMaEnzMrp?^(|H3dfU#CjiIA+u{t_pAOVzikFUeF?pgU;
zmwxTt(Gg!S74KGigs7&xzIrgPJ@TKkVd}UvjSI3oA7O#Lo8X_smOAvnPDdQdZ-{ts
zsl7~fQrPb*4LO6!lLmLR=yF+YSh4!VCc=N!GxTDhWgi11?((obIRPWrYAkf6|{-X#(8G)AzZ@BA$8%+#`e<`tfL
zq$mFS^4K`brN#hkG(3U)D`OzR<2caycMv`b)^HEsG^}ghHfP-WWFdn0#HSvm`9_V-
zvfBNH_yp5VodtWX`RT>tL+4wW!1Me}`jT=fl>RL;aiIQ9{Oyl6(MMVOc5P)UaYW3Mi9*>>6Zln*gwR?iJMqN?S
z=>n~u_?}RG#g?@?U>OD{QH_#7m_EOeIe)q9M~{6lJc9**E^ZZ8wm;tyTao#Y3QzBp**BhcI2Oe`m~X#H*vg>C5|A=?`EyY8+Jw{C$7G**_~6tPC(N=d
z=Sm@6aadH#$Q+NLC%&i-18G=vPr8u`;MAxGSD^~})sRRuN4|yT&&oMm#EC!CltO_a
zZ7MBDTIPW1RZ3)qm|@)_f@JeRb*WB@I@OmcG@XHD76u9R1ZjXg#N($|j2+{`;g!
z_C@lnt{rNue5iGzV*~X9E=3=m^O5c`z)1^Sue^9p#Eu&CBnokK&!men`22KZJX5_+
zQGs-fPr_bCcznhi707Y?X?+62U4tsO5_zP7&z2A9xuWa}p`mLUF
zVP<$Fec$&BWvm8)apayTH`L#a%u8?Ud4w}*W7I4Bc
z?|vq6$bD(fnoL1zrMR(D9{qwGOKh!!DlillS2YhDLhDt>K19vymHHcf0;rX89e3Q;
z%5gl@>!yTx+V7Jj0CZbtBzW*jAzZq4fz3;itj0J6ef&4wy10dP2_@O8N-)1My0Ik6tZ$)e(V)=nHg}OUdGT98FEk#NR^{Oh*GI!?nzy
z#gC)RQz3+jx-}pU#0&=C)h$UeT@4DAgR_|mL7Ek7ZKd5pw8H7A~YY0Xn)Yp*`EkS5WKa+=?%E2Zk
z2PM^jA^_Q$;c~%;2xC_oLn||FBbj8Mp52k-@nV0&It6wEQiyIf^PZ=tf9=~oLtD51
z73`tp9LKaM*ob&|@pyk7v
zRk_)E`oC2TCg{)_ef|?C#nIrjaa&-gqEj^X=#|Y0L#M7vtJpz^z3U6wzuiiNqCDNx
zGGD!K&2RLlWL}|D>exq81%gpR=WK~=>REZs-OVl-cFL9+A)Hj$+4za4{5PzIJ&(vKK=>Ak`<>lX>(SX@V4#WC>1nR*;EWVc
zrcn=7w?hCoQlj8`=MftJLUu5J#)3WB+w=KLjq>=?<6r^!AzsFlb?HBBhjPo$ww_z0
zVJy!r6y3YhUppTjJuOHmhHnXiwxg}B6sVCB#^Kd;KB_9)K7CL)?_tP>osD`BtBjAp
z0Al=T@&CpWyt5_dGVT1M1Ch@4oG%7zheIX&sS|KZtXeNv&-_%}>CTQ9P4Sq8&i_e5
z`1`Yx{qFe-#9cdQ>;4z$Ry+BttU$Edv#9MNNwgdHe_lJ&8dL|DVnbsAbS;H&_L4rw
z1$|~bVK)FA)0-X^kzwiKkd%}|@rLa0J%&7T-7CyLSp?Ga*P$BP;ef(nB(=((m08L#
zJ@DxYY##eRbK7x%!ilgq+KM&x!h&tw0sxVsehEAe1}IFDDH3MgN`gQaEg2jrI%z$Z
zQ479tS`kF-5zFt~Kw^MsyzahfNIVjWMv$VaSo8S-ka<)@ne=ba_tGf;Z*z?+y(y9p
zVv+VLcnAUpl^K#)KG9#Q+TNDpcaciC6J>A5sNBDUQY{gx?{DvT0gulJUJN8lGzyHm
zz4LCmZtYpKy@|ndQRkuXF+WJ3oMDu9HRWQg4jYA?Ln^aW8fheC}BF
zAip3xYPpXKZS;MbHa`j}DUo8rb9?0c^!nsVQh~gINXG6JyoV-6x%3#%upe+UYzi8szq5-<&R|$&e_zR0Yu>K~YQvZbf8DP50bS8!zd6+6
zrAH*pa9&ba>`FKZ@sS>j31~$!Cxz5Y;Uo{EMMDm`x1IrCLyWU&u?B>h2zLjJQxJ8t
z&)5L_LYCTb#h4LqjSSJr`5#od-~i*U*Z&&!^`p+O(K}DvKl?D!Hh6ZIy()^vFpe?$j;!aAKcSYjQRp{w4;AdLsGj&d><31pLE2t6kz>gU4B4zXT<$_)VJ9
z=t3vcgclLg7eN0eHL;IsI*?T8SooG4LyVcXe^23F8G)~%eUFqMpLq$B;a7Yk|%Z<@?zCUqwuz)eNFVad2e
zj*%c7^%S9K@eS`JpZukzTg|#35)2MrLsD}0bp_#Wjg?!2fk*exDaYU&FPdF89
zc(%$X-zoXdL)xfT_ew_nTDQjlY_NmUiz6LKB}H7d#owcsJ5@LEl5R>1Ff|x+@dcZN
zlsl_swavL6VV7vgJBK%A_bkP9!d)8h4{RZq&=J)
z=fJJ0q&+W$0TRPo^-}LshRzMxN*z&}-$+qO)fI{{J+NTf)SaQo{3p8C+@Z5a3e6059J5ikfi188Ref;Bb
zWArwuc$|h==U!YOx{rt@Qo%q8nddr0{Us9GUSgQ5H7-?WOCNV52r}fS>QbN_>kz
z+Q*8`{1!0#*ulkteGG5BM|I3b@+j2uTrXbpR4EI~dOZ*hwu6&BsTeFiBG&!eFrTYQ
z&Ujh!mgm*~?PIHalr|x=Daw>J-x7kL)xy{wXRC89oZ<7lMvZ89LsuYpw%8yE(T0^$Szz6Q60DdwHhf|N1;UI+G*Wx;!P4BX`|X
zgzQetYAtX0>9NgK53XD3w-Ej4nT`UmEwK%IS^)B1K6%zNpAv=80y=jNgo8?=7_v9~
z;=|5EM_0&L~xYH!Fq+zPyFcdeF2U9WI
zTrtWESvap{=;hess$6H1gn-{l+*}Pp$$keNU
zFRl!Wc0eUe_ReJ4`7KO^=EJJv>?dF7MJUZAz}Vj(W-=BvlQ{f!G5!a6bJ+c!44?sa
z5Da;D{%*O0R$oFFWo;8ub4$;c=l#74&$`?@{t;f^G&??QNd#9_rZzwFA=^j0J1yn~
ztHU9wL;FQ>BiZifm$DQ&{qy;G9*Sd^URE5xY?Suv!rpPv^EYVSzQL
zrWk4a>bsCjy~GSZ`s>_%iPQ_LPq#uAy|#!-nolcV7XjU<9bnGNsx0#x;y-9uB@dWr@UKc2wwX>0Lu3Ye@LPxuO22_FZZ
zywn>du&{Ix)*~8ze5<_ABx+~PLTW?4oK&izEbjtM#vnKIda
ztakr7tJvogTYu2;9!mnJBcAYIu{Rs1Q33SNLZ9V-4(XE=pRLHv^+Xe(!6*vErF$8o
zzWJR`mFczlAuj}I!0$?RgXTR9qu=
zL<*U;Xx<
z=sU!uWWx<;=LDUV3S&a{PppL6dl8&T3
zxvw?oc@wBLdiqAmut^@d5i*31dl(1s(HF3
z;#*qkXTOe}Y7?lRbBD(wEQVHb{x{Ki{=zI10
z%yf)ZrVej1F?6N7_3KdZs{mH}2EId7eIoM#MSNAUjdM&Nj`4D@#)Z`Cw6ZMW
zzIQmV{mMrV_XU&+*A0=LoBeR%wQiW6`%ydt=^pK0c0W4b?{EXEMoK;QG5c};wF7!f
zSYC)Iy|SFk*@dK=U*I)Y<;^N<}R1Ui^7KxeW=t^g-;8^FlqD
z2i*{4{<2E4KW#3xF@P*3!4KI2$k_{qXKUTyuF;!Lsu5bUwKJ+1iJa;kK;a|~@Ij~D
zoNa}^@YTar0hGv>i9xQQ<_KVhArGdCyK~y#>v<>|*gjMS0wnAb6>QT)=jV+wTI?v9
z)(OxFc+uX04Cb=Iu9Iz_`m`Z{)!*&|?gq+%KOj
z>#6u_Tma&IPk^T)XW;ej0PB~!IRRTvB_x@s7M)Q=B=JuY#!5A-kN=`gy0N@^=>7xy
zIYas9t`pwc6;~gm&9xF$1#5FA5h3d4?2VcY6cu{gc%#p|6-MIdxT7xpeUUQ5+6=Qh
z?6hEJF1yy0i+S;nB4cBjU7{PRB7}_!fPxo$bO|+Sffcd1&HH31o#TZEl!CjyApJRZh94mH
zBx*$ahEt5F;b7an;F@bl{)IOHQ*n@rq9s7#+cd>O(ydIW2@5agHVrH&1+cG88KE(n
zv1mz*NU!ne^3T55tSz0$>rJZeKEuMa32*n%dP8|&*~P7)X!IxR0s)-?g*o2Yv4usE
zCk*+7dY^Jr{J(!}$u#&KCQj{+MeVRvz7C
zT{d;oTWo64wt_zBU%e4Y{n*=v6`HlexT8%m!Rl(Qqn7pgV8>zCSMc%I*G3+fuQrQ}1D2?J`s@W);u25_>tvfHK-`d8UT%$Y^j*sAr50inFuw}^~
zlvF_-F4pW{=Mg!A&{BvYlcM6dD~-sY4w@mU(9dhPKbuMIN=-+?Fg}Ukg#v_W7+U-%
zPwEH`yf9iBm4*T+>9~$3rNEYQ%keI#C%*h%Vj{<)Ra2`ip2ch!MsTa{!B0jZ(elru
zkZvR0kii*Kk6qBSMM7^#j>WdEBeuf8WIG6CJao+nOl^QP`2zlu}sHA)WLtQ*MS{6PmW+3zkVXHY48gs>-o`D`}t8
zJE|3(Dw1!M0^P$
zB~5$ic+?2cBiw+wtf_0Viilfhr@OqdzcISnK(;8dpUFNUDRvsh~XLY)A6CL6gQCv~EVkGb+tJBn-{)g5(>
zMTTvD%uk;`feA)V6leXs@2G9!sHhMY6RqWDxvl}&edql{1Nmf2`sFubr<6Ek4ndhG
z{Uo7zu0P4iS>kM{Iuq`fe^z1|0An|Vv^{yBaX25L7TW|vyp->)EM3TXV=!K*!9p}S
zBNK&Uhv+k7_r$DX`m=a1Dmn!!;=aJZ9kwtlBl6dJC;0;N-z}~Aw?9K
zXu-Axii(%eky$$DnCS&^oF#fFJ{r~iLJ*by#>
zxv&ydwm~Ku)z&YW--zfb3(u971>S8>2x@S01zmZL|r+a8w7vOG6lC1K$y33
zD4^Igc`OFi#b0qmo72>3l=hxf6TuNLk#1UQw}qy9#dI$DOuqCP#NRd~UX9cR(wcNS
z>T)Y|8#9(BIlCaN!3-sy(CRlRu#NQAer0X47|8RI<*!CuaumLGPt|@yVS>zg^Zw3;
zN__{GY(6#kUp8BSP9JN?Rv!G^ZpM)lW4-orF5&fDNUtwDwk($bF2vf>AU&ZlJ9p$@
z-{JR*kN6hbTuoHMtqYxx@Ly>}@30?sgYYw)@Dkzphyb@4=op7A<~L
zfS-2CgE5qGE!|UKg6rUt>pGtbDZf;uTAf@3(mj^%eWnw>Sj711ECrulYEU6nebwh-
z^o!|OCw97q$*3OjUB<>>z8a)1bJDUm4lO@^D4(7{dYA8@YqgK$t*fGWdMJEb@#*;j
zE5u%dqmKEWPyOa2-$h=7R4te*&%ccGM{r2E7=n~&0xR2%?r2*JS8JVo9x7+$-Jh|$
zYlb{=q+$=0qCC3j$ac+7tHKi7oP9Ndwf)gU*rk_@T-oV*BM-;g5KpP?U7o#dKQ+DN
z0ATO_f{mRx=QWE;6m01PTsPV_X#OHVLh@AAvCgqBd!lL}_wwaD)EugW{HD^m7#Wi0
zjjAy$Y$!oejSjn4aesIeHRvR4*-F)}e4{>Azm$TyV
z3~Dv~KVx!BTEVBiH!4^Y358}9Dnt*#iT6)hHmr+OiJwy{2e<++7l{-xz%(s6D$1=)5iF0zE
z%2!l`A9>SZ#~i6Soh#>GO}O9TCY{An7rp)ndPrxmfP%itlZ5~PS~6FvQD`#Xc$U9l
zdQy>#amo`vNqI@IhB-&A3!uH2SE7{RP$d6wsNJQ-l|~ZdtxkXN(Yi6wE#EF|9UgGR
z>rPq#(vh}RifwW^F-jmhQ`$*x<}adga*yEfBo;#N?~0{TFl<*>N+Bf|GKl|_P-pn)
ztVL&Op(4dEv6WjEJRrel>w-$Pb_oGTaOHP@>-=|f%Y{kNJZARjLWh-SERmq`P_1s-
ze{`D?{dPz?U?%~7$+mUFT+1bSckAS7_)N}}vbW>9$3umQtfgH;g5OG>#i&t8Ttt)SWD-$bGUeuG!man+}CSuItjj{yP#x7p2E
zFXXOSWQY$Zzbvj2%L=%`Ug@81tFXG(8DS)B`7>8B*Itnmf381f!WZ|3+sXJi;Yvuu7Gd|R~o
zZUMNs4>6`GIK@4y!N$t0rV1V)J+@j!1iNjpN%|YwP0UdayYJPj38vD(y18jDMB8-ny*uvO^DVymSjk*!-cJ
z=W>KDe#xI8fA9s}A
z`hDwqX#GG#Id}ffAiK)_5+0s$=H_gqVN{k9R6h8IaT$PWFAaK3>4g7jpU_CRqxmC>BvDgl8cr%k+
zt}!Z*JpNH7p3=6Ge~FXv7{ZFTFypt&Q&Y5N^{ |