@oathompsonjones/mini-games 1.0.14 → 1.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,6 +4,12 @@ import LongIntBitBoard from "../../bitBoard/longIntBitBoard.js";
4
4
  /** Represents a Connect 4 board. */
5
5
  export default class Board extends Base {
6
6
  winningStates = [];
7
+ /**
8
+ * Tracks the next available row index per column (row 5 = bottom, row 0 = top).
9
+ * A value of -1 means the column is full.
10
+ * Maintained incrementally so makeMove and emptyCells are O(1).
11
+ */
12
+ heights = [5, 5, 5, 5, 5, 5, 5];
7
13
  FULL_BOARD = new LongInt([0b1111_1111111_1111111_1111111_1111111, 0b1111111_111]);
8
14
  HORIZONTAL = new LongInt([0b0000_0000000_0000000_0000000_0001111, 0b0000000_000]);
9
15
  VERTICAL = new LongInt([0b0000_0000001_0000001_0000001_0000001, 0b0000000_000]);
@@ -45,59 +51,118 @@ export default class Board extends Base {
45
51
  * Calculates the heuristic score for the current board state.
46
52
  * @returns The heuristic score.
47
53
  */
54
+ // eslint-disable-next-line max-statements
48
55
  get heuristic() {
49
56
  const { winner } = this;
50
57
  if (winner === 0)
51
- return 1000;
58
+ return 10000 - this.moves.length;
52
59
  if (winner === 1)
53
- return -1000;
54
- const p0LineOfThreeNoGaps = this.hasLine(0, 3);
55
- const p1LineOfThreeNoGaps = this.hasLine(1, 3);
56
- const p0LineOfThreeOneGap = this.hasLine(0, 3, 1);
57
- const p1LineOfThreeOneGap = this.hasLine(1, 3, 1);
58
- const p0LineOfThreeTwoGaps = this.hasLine(0, 3, 2);
59
- const p1LineOfThreeTwoGaps = this.hasLine(1, 3, 2);
60
- const p0LineOfTwoNoGaps = this.hasLine(0, 2);
61
- const p1LineOfTwoNoGaps = this.hasLine(1, 2);
62
- const p0LineOfTwoOneGap = this.hasLine(0, 2, 1);
63
- const p1LineOfTwoOneGap = this.hasLine(1, 2, 1);
64
- const p0LineOfTwoTwoGaps = this.hasLine(0, 2, 2);
65
- const p1LineOfTwoTwoGaps = this.hasLine(1, 2, 2);
66
- const p0LineOfThreeScore = 3 * p0LineOfThreeNoGaps + 2 * p0LineOfThreeOneGap + p0LineOfThreeTwoGaps;
67
- const p1LineOfThreeScore = 3 * p1LineOfThreeNoGaps + 2 * p1LineOfThreeOneGap + p1LineOfThreeTwoGaps;
68
- const p0LineOfTwoScore = 3 * p0LineOfTwoNoGaps + 2 * p0LineOfTwoOneGap + p0LineOfTwoTwoGaps;
69
- const p1LineOfTwoScore = 3 * p1LineOfTwoNoGaps + 2 * p1LineOfTwoOneGap + p1LineOfTwoTwoGaps;
70
- const p0Score = 10 * p0LineOfThreeScore + p0LineOfTwoScore;
71
- const p1Score = 10 * p1LineOfThreeScore + p1LineOfTwoScore;
72
- return p0Score - p1Score;
60
+ return -(10000 - this.moves.length);
61
+ let p0Score = 0;
62
+ let p1Score = 0;
63
+ // Horizontal
64
+ for (let y = 0; y < this.height; y++) {
65
+ for (let x = 0; x < this.width - 3; x++) {
66
+ const window = [
67
+ this.cellOccupier({ x, y }),
68
+ this.cellOccupier({ x: x + 1, y }),
69
+ this.cellOccupier({ x: x + 2, y }),
70
+ this.cellOccupier({ x: x + 3, y }),
71
+ ];
72
+ const p0Count = window.filter((occupier) => occupier === 0).length;
73
+ const p1Count = window.filter((occupier) => occupier === 1).length;
74
+ if (p0Count > 0 && p1Count === 0)
75
+ p0Score += [0, 1, 10, 100][p0Count];
76
+ else if (p1Count > 0 && p0Count === 0)
77
+ p1Score += [0, 1, 10, 100][p1Count];
78
+ }
79
+ }
80
+ // Vertical ↓
81
+ for (let x = 0; x < this.width; x++) {
82
+ for (let y = 0; y < this.height - 3; y++) {
83
+ const window = [
84
+ this.cellOccupier({ x, y }),
85
+ this.cellOccupier({ x, y: y + 1 }),
86
+ this.cellOccupier({ x, y: y + 2 }),
87
+ this.cellOccupier({ x, y: y + 3 }),
88
+ ];
89
+ const p0Count = window.filter((occupier) => occupier === 0).length;
90
+ const p1Count = window.filter((occupier) => occupier === 1).length;
91
+ if (p0Count > 0 && p1Count === 0)
92
+ p0Score += [0, 1, 10, 100][p0Count];
93
+ else if (p1Count > 0 && p0Count === 0)
94
+ p1Score += [0, 1, 10, 100][p1Count];
95
+ }
96
+ }
97
+ // Diagonal ↘
98
+ for (let x = 0; x < this.width - 3; x++) {
99
+ for (let y = 0; y < this.height - 3; y++) {
100
+ const window = [
101
+ this.cellOccupier({ x, y }),
102
+ this.cellOccupier({ x: x + 1, y: y + 1 }),
103
+ this.cellOccupier({ x: x + 2, y: y + 2 }),
104
+ this.cellOccupier({ x: x + 3, y: y + 3 }),
105
+ ];
106
+ const p0Count = window.filter((occupier) => occupier === 0).length;
107
+ const p1Count = window.filter((occupier) => occupier === 1).length;
108
+ if (p0Count > 0 && p1Count === 0)
109
+ p0Score += [0, 1, 10, 100][p0Count];
110
+ else if (p1Count > 0 && p0Count === 0)
111
+ p1Score += [0, 1, 10, 100][p1Count];
112
+ }
113
+ }
114
+ // Diagonal ↗
115
+ for (let x = 0; x < this.width - 3; x++) {
116
+ for (let y = 3; y < this.height; y++) {
117
+ const window = [
118
+ this.cellOccupier({ x, y }),
119
+ this.cellOccupier({ x: x + 1, y: y - 1 }),
120
+ this.cellOccupier({ x: x + 2, y: y - 2 }),
121
+ this.cellOccupier({ x: x + 3, y: y - 3 }),
122
+ ];
123
+ const p0Count = window.filter((occupier) => occupier === 0).length;
124
+ const p1Count = window.filter((occupier) => occupier === 1).length;
125
+ if (p0Count > 0 && p1Count === 0)
126
+ p0Score += [0, 1, 10, 100][p0Count];
127
+ else if (p1Count > 0 && p0Count === 0)
128
+ p1Score += [0, 1, 10, 100][p1Count];
129
+ }
130
+ }
131
+ return p1Score - p0Score;
73
132
  }
74
133
  /**
75
- * Generates a list of empty cells.
134
+ * Generates a list of available column moves ordered centre-first so that
135
+ * alpha-beta pruning encounters the strongest moves earliest.
136
+ * Uses the incremental heights array — O(width), no bitboard reads.
76
137
  * @returns The list of empty cells.
77
138
  */
78
139
  get emptyCells() {
79
140
  const emptyCells = [];
80
- for (let x = 0; x < this.width; x++) {
81
- const cell = { x, y: 0 };
82
- if (this.cellOccupier(cell) === null)
83
- emptyCells.push(cell);
141
+ for (const x of [3, 2, 4, 1, 5, 0, 6]) {
142
+ if (this.heights[x] >= 0)
143
+ emptyCells.push({ x, y: 0 });
84
144
  }
85
145
  return emptyCells;
86
146
  }
87
147
  /**
88
148
  * Makes a move on the board.
149
+ * Uses the heights array for O(1) row resolution instead of scanning the column.
89
150
  * @param move - The move to make.
90
151
  * @param playerId - The player making the move.
91
152
  */
92
153
  makeMove(move, playerId) {
93
- const updatedMove = move;
94
- for (let i = 5; i >= 0; i--) {
95
- if (this.cellOccupier({ x: move.x, y: i }) === null) {
96
- move.y = i;
97
- break;
98
- }
99
- }
100
- super.makeMove(updatedMove, playerId);
154
+ move.y = this.heights[move.x];
155
+ this.heights[move.x]--;
156
+ super.makeMove(move, playerId);
157
+ }
158
+ /**
159
+ * Reverses the last move and restores the column height.
160
+ */
161
+ undoLastMove() {
162
+ // X-coordinate is recoverable from the bit index: bit % width = x.
163
+ const x = this.moves[this.moves.length - 1] % this.width;
164
+ super.undoLastMove();
165
+ this.heights[x]++;
101
166
  }
102
167
  }
103
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2FtZXMvY29ubmVjdDQvYm9hcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0scUJBQXFCLENBQUM7QUFDdkMsT0FBTyxPQUFPLE1BQU0sMkJBQTJCLENBQUM7QUFDaEQsT0FBTyxlQUFlLE1BQU0sbUNBQW1DLENBQUM7QUFHaEUsb0NBQW9DO0FBQ3BDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sS0FBTSxTQUFRLElBQWE7SUFDbEMsYUFBYSxHQUFzQixFQUFFLENBQUM7SUFFL0IsVUFBVSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsc0NBQXNDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUVsRixVQUFVLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxzQ0FBc0MsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBRWxGLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLHNDQUFzQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFaEYsZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxzQ0FBc0MsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBRXhGLG9CQUFvQixHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsc0NBQXNDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUU3RyxvQ0FBb0M7SUFDcEM7UUFDSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ1osS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxlQUFl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RCxPQUFPLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQW9CLFVBQVU7UUFDMUIsTUFBTSxVQUFVLEdBQWUsRUFBRSxDQUFDO1FBRWxDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBRW5DLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJO2dCQUNoQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNhLFFBQVEsQ0FBQyxJQUFjLEVBQUUsUUFBZ0I7UUFDckQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBRXpCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMxQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ1gsTUFBTTtZQUNWLENBQUM7UUFDTCxDQUFDO1FBQ0QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDMUMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2UgZnJvbSBcIi4uLy4uL2Jhc2UvYm9hcmQuanNcIjtcbmltcG9ydCBMb25nSW50IGZyb20gXCIuLi8uLi9iaXRCb2FyZC9sb25nSW50LmpzXCI7XG5pbXBvcnQgTG9uZ0ludEJpdEJvYXJkIGZyb20gXCIuLi8uLi9iaXRCb2FyZC9sb25nSW50Qml0Qm9hcmQuanNcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwiLi4vLi4vYmFzZS9ib2FyZC5qc1wiO1xuXG4vKiogUmVwcmVzZW50cyBhIENvbm5lY3QgNCBib2FyZC4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJvYXJkIGV4dGVuZHMgQmFzZTxMb25nSW50PiB7XG4gICAgcHJvdGVjdGVkIHdpbm5pbmdTdGF0ZXM6IExvbmdJbnRCaXRCb2FyZFtdID0gW107XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IEZVTExfQk9BUkQgPSBuZXcgTG9uZ0ludChbMGIxMTExXzExMTExMTFfMTExMTExMV8xMTExMTExXzExMTExMTEsIDBiMTExMTExMV8xMTFdKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgSE9SSVpPTlRBTCA9IG5ldyBMb25nSW50KFswYjAwMDBfMDAwMDAwMF8wMDAwMDAwXzAwMDAwMDBfMDAwMTExMSwgMGIwMDAwMDAwXzAwMF0pO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBWRVJUSUNBTCA9IG5ldyBMb25nSW50KFswYjAwMDBfMDAwMDAwMV8wMDAwMDAxXzAwMDAwMDFfMDAwMDAwMSwgMGIwMDAwMDAwXzAwMF0pO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBMRUFESU5HX0RJQUdPTkFMID0gbmV3IExvbmdJbnQoWzBiMDAwMF8wMDAxMDAwXzAwMDAxMDBfMDAwMDAxMF8wMDAwMDAxLCAwYjAwMDAwMDBfMDAwXSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IE5PTl9MRUFESU5HX0RJQUdPTkFMID0gbmV3IExvbmdJbnQoWzBiMDAwMF8wMDAwMDAxXzAwMDAwMTBfMDAwMDEwMF8wMDAxMDAwLCAwYjAwMDAwMDBfMDAwXSk7XG5cbiAgICAvKiogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBCb2FyZC4gKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKDcsIDYpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA2OyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLndpbm5pbmdTdGF0ZXMucHVzaChuZXcgTG9uZ0ludEJpdEJvYXJkKExvbmdJbnRcbiAgICAgICAgICAgICAgICAgICAgLmxlZnRTaGlmdCh0aGlzLkhPUklaT05UQUwsIGkgKyA3ICogailcbiAgICAgICAgICAgICAgICAgICAgLmFuZCh0aGlzLkZVTExfQk9BUkQpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMzsgaisrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53aW5uaW5nU3RhdGVzLnB1c2gobmV3IExvbmdJbnRCaXRCb2FyZChMb25nSW50XG4gICAgICAgICAgICAgICAgICAgIC5sZWZ0U2hpZnQodGhpcy5WRVJUSUNBTCwgaSArIDcgKiBqKVxuICAgICAgICAgICAgICAgICAgICAuYW5kKHRoaXMuRlVMTF9CT0FSRCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAzOyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLndpbm5pbmdTdGF0ZXMucHVzaChuZXcgTG9uZ0ludEJpdEJvYXJkKExvbmdJbnRcbiAgICAgICAgICAgICAgICAgICAgLmxlZnRTaGlmdCh0aGlzLkxFQURJTkdfRElBR09OQUwsIGkgKyA3ICogailcbiAgICAgICAgICAgICAgICAgICAgLmFuZCh0aGlzLkZVTExfQk9BUkQpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMzsgaisrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53aW5uaW5nU3RhdGVzLnB1c2gobmV3IExvbmdJbnRCaXRCb2FyZChMb25nSW50XG4gICAgICAgICAgICAgICAgICAgIC5sZWZ0U2hpZnQodGhpcy5OT05fTEVBRElOR19ESUFHT05BTCwgaSArIDcgKiBqKVxuICAgICAgICAgICAgICAgICAgICAuYW5kKHRoaXMuRlVMTF9CT0FSRCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgdGhlIGhldXJpc3RpYyBzY29yZSBmb3IgdGhlIGN1cnJlbnQgYm9hcmQgc3RhdGUuXG4gICAgICogQHJldHVybnMgVGhlIGhldXJpc3RpYyBzY29yZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhldXJpc3RpYygpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB7IHdpbm5lciB9ID0gdGhpcztcblxuICAgICAgICBpZiAod2lubmVyID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIDEwMDA7XG5cbiAgICAgICAgaWYgKHdpbm5lciA9PT0gMSlcbiAgICAgICAgICAgIHJldHVybiAtMTAwMDtcblxuICAgICAgICBjb25zdCBwMExpbmVPZlRocmVlTm9HYXBzID0gdGhpcy5oYXNMaW5lKDAsIDMpO1xuICAgICAgICBjb25zdCBwMUxpbmVPZlRocmVlTm9HYXBzID0gdGhpcy5oYXNMaW5lKDEsIDMpO1xuICAgICAgICBjb25zdCBwMExpbmVPZlRocmVlT25lR2FwID0gdGhpcy5oYXNMaW5lKDAsIDMsIDEpO1xuICAgICAgICBjb25zdCBwMUxpbmVPZlRocmVlT25lR2FwID0gdGhpcy5oYXNMaW5lKDEsIDMsIDEpO1xuICAgICAgICBjb25zdCBwMExpbmVPZlRocmVlVHdvR2FwcyA9IHRoaXMuaGFzTGluZSgwLCAzLCAyKTtcbiAgICAgICAgY29uc3QgcDFMaW5lT2ZUaHJlZVR3b0dhcHMgPSB0aGlzLmhhc0xpbmUoMSwgMywgMik7XG4gICAgICAgIGNvbnN0IHAwTGluZU9mVHdvTm9HYXBzID0gdGhpcy5oYXNMaW5lKDAsIDIpO1xuICAgICAgICBjb25zdCBwMUxpbmVPZlR3b05vR2FwcyA9IHRoaXMuaGFzTGluZSgxLCAyKTtcbiAgICAgICAgY29uc3QgcDBMaW5lT2ZUd29PbmVHYXAgPSB0aGlzLmhhc0xpbmUoMCwgMiwgMSk7XG4gICAgICAgIGNvbnN0IHAxTGluZU9mVHdvT25lR2FwID0gdGhpcy5oYXNMaW5lKDEsIDIsIDEpO1xuICAgICAgICBjb25zdCBwMExpbmVPZlR3b1R3b0dhcHMgPSB0aGlzLmhhc0xpbmUoMCwgMiwgMik7XG4gICAgICAgIGNvbnN0IHAxTGluZU9mVHdvVHdvR2FwcyA9IHRoaXMuaGFzTGluZSgxLCAyLCAyKTtcbiAgICAgICAgY29uc3QgcDBMaW5lT2ZUaHJlZVNjb3JlID0gMyAqIHAwTGluZU9mVGhyZWVOb0dhcHMgKyAyICogcDBMaW5lT2ZUaHJlZU9uZUdhcCArIHAwTGluZU9mVGhyZWVUd29HYXBzO1xuICAgICAgICBjb25zdCBwMUxpbmVPZlRocmVlU2NvcmUgPSAzICogcDFMaW5lT2ZUaHJlZU5vR2FwcyArIDIgKiBwMUxpbmVPZlRocmVlT25lR2FwICsgcDFMaW5lT2ZUaHJlZVR3b0dhcHM7XG4gICAgICAgIGNvbnN0IHAwTGluZU9mVHdvU2NvcmUgPSAzICogcDBMaW5lT2ZUd29Ob0dhcHMgKyAyICogcDBMaW5lT2ZUd29PbmVHYXAgKyBwMExpbmVPZlR3b1R3b0dhcHM7XG4gICAgICAgIGNvbnN0IHAxTGluZU9mVHdvU2NvcmUgPSAzICogcDFMaW5lT2ZUd29Ob0dhcHMgKyAyICogcDFMaW5lT2ZUd29PbmVHYXAgKyBwMUxpbmVPZlR3b1R3b0dhcHM7XG4gICAgICAgIGNvbnN0IHAwU2NvcmUgPSAxMCAqIHAwTGluZU9mVGhyZWVTY29yZSArIHAwTGluZU9mVHdvU2NvcmU7XG4gICAgICAgIGNvbnN0IHAxU2NvcmUgPSAxMCAqIHAxTGluZU9mVGhyZWVTY29yZSArIHAxTGluZU9mVHdvU2NvcmU7XG5cbiAgICAgICAgcmV0dXJuIHAwU2NvcmUgLSBwMVNjb3JlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIGxpc3Qgb2YgZW1wdHkgY2VsbHMuXG4gICAgICogQHJldHVybnMgVGhlIGxpc3Qgb2YgZW1wdHkgY2VsbHMuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCBlbXB0eUNlbGxzKCk6IFBvc2l0aW9uW10ge1xuICAgICAgICBjb25zdCBlbXB0eUNlbGxzOiBQb3NpdGlvbltdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLndpZHRoOyB4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNlbGw6IFBvc2l0aW9uID0geyB4LCB5OiAwIH07XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmNlbGxPY2N1cGllcihjZWxsKSA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICBlbXB0eUNlbGxzLnB1c2goY2VsbCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZW1wdHlDZWxscztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYWtlcyBhIG1vdmUgb24gdGhlIGJvYXJkLlxuICAgICAqIEBwYXJhbSBtb3ZlIC0gVGhlIG1vdmUgdG8gbWFrZS5cbiAgICAgKiBAcGFyYW0gcGxheWVySWQgLSBUaGUgcGxheWVyIG1ha2luZyB0aGUgbW92ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgbWFrZU1vdmUobW92ZTogUG9zaXRpb24sIHBsYXllcklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdXBkYXRlZE1vdmUgPSBtb3ZlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSA1OyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2VsbE9jY3VwaWVyKHsgeDogbW92ZS54LCB5OiBpIH0pID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbW92ZS55ID0gaTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdXBlci5tYWtlTW92ZSh1cGRhdGVkTW92ZSwgcGxheWVySWQpO1xuICAgIH1cbn1cbiJdfQ==
168
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2FtZXMvY29ubmVjdDQvYm9hcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0scUJBQXFCLENBQUM7QUFDdkMsT0FBTyxPQUFPLE1BQU0sMkJBQTJCLENBQUM7QUFDaEQsT0FBTyxlQUFlLE1BQU0sbUNBQW1DLENBQUM7QUFHaEUsb0NBQW9DO0FBQ3BDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sS0FBTSxTQUFRLElBQWE7SUFDbEMsYUFBYSxHQUFzQixFQUFFLENBQUM7SUFFaEQ7Ozs7T0FJRztJQUNjLE9BQU8sR0FBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTFDLFVBQVUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLHNDQUFzQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFbEYsVUFBVSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsc0NBQXNDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUVsRixRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxzQ0FBc0MsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBRWhGLGdCQUFnQixHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsc0NBQXNDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUV4RixvQkFBb0IsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLHNDQUFzQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFN0csb0NBQW9DO0lBQ3BDO1FBQ0ksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNaLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksZUFBZSxDQUFDLE9BQU87cUJBQzlDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUNyQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxDQUFDO1FBQ0wsQ0FBQztRQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksZUFBZSxDQUFDLE9BQU87cUJBQzlDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUNuQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxDQUFDO1FBQ0wsQ0FBQztRQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksZUFBZSxDQUFDLE9BQU87cUJBQzlDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQzNDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLENBQUM7UUFDTCxDQUFDO1FBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxlQUFlLENBQUMsT0FBTztxQkFDOUMsU0FBUyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztxQkFDL0MsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsMENBQTBDO0lBQzFDLElBQVcsU0FBUztRQUNoQixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBRXhCLElBQUksTUFBTSxLQUFLLENBQUM7WUFDWixPQUFPLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUVyQyxJQUFJLE1BQU0sS0FBSyxDQUFDO1lBQ1osT0FBTyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFeEMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUVoQixlQUFlO1FBQ2YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNuQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDdEMsTUFBTSxNQUFNLEdBQUc7b0JBQ1gsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQWMsQ0FBQztvQkFDdkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBYyxDQUFDO29CQUM5QyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFjLENBQUM7b0JBQzlDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQWMsQ0FBQztpQkFDakQsQ0FBQztnQkFFRixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO2dCQUNuRSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO2dCQUVuRSxJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksT0FBTyxLQUFLLENBQUM7b0JBQzVCLE9BQU8sSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBRSxDQUFDO3FCQUNwQyxJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksT0FBTyxLQUFLLENBQUM7b0JBQ2pDLE9BQU8sSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBRSxDQUFDO1lBQzdDLENBQUM7UUFDTCxDQUFDO1FBRUQsYUFBYTtRQUNiLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3ZDLE1BQU0sTUFBTSxHQUFHO29CQUNYLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFjLENBQUM7b0JBQ3ZDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQWMsQ0FBQztvQkFDOUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBYyxDQUFDO29CQUM5QyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFjLENBQUM7aUJBQ2pELENBQUM7Z0JBRUYsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFDbkUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFFbkUsSUFBSSxPQUFPLEdBQUcsQ0FBQyxJQUFJLE9BQU8sS0FBSyxDQUFDO29CQUM1QixPQUFPLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUUsQ0FBQztxQkFDcEMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxJQUFJLE9BQU8sS0FBSyxDQUFDO29CQUNqQyxPQUFPLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUUsQ0FBQztZQUM3QyxDQUFDO1FBQ0wsQ0FBQztRQUVELGFBQWE7UUFDYixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN0QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDdkMsTUFBTSxNQUFNLEdBQUc7b0JBQ1gsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQWMsQ0FBQztvQkFDdkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFjLENBQUM7b0JBQ3JELElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBYyxDQUFDO29CQUNyRCxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQWMsQ0FBQztpQkFDeEQsQ0FBQztnQkFFRixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO2dCQUNuRSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO2dCQUVuRSxJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksT0FBTyxLQUFLLENBQUM7b0JBQzVCLE9BQU8sSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBRSxDQUFDO3FCQUNwQyxJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksT0FBTyxLQUFLLENBQUM7b0JBQ2pDLE9BQU8sSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBRSxDQUFDO1lBQzdDLENBQUM7UUFDTCxDQUFDO1FBRUQsYUFBYTtRQUNiLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3RDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sTUFBTSxHQUFHO29CQUNYLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFjLENBQUM7b0JBQ3ZDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBYyxDQUFDO29CQUNyRCxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQWMsQ0FBQztvQkFDckQsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFjLENBQUM7aUJBQ3hELENBQUM7Z0JBRUYsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFDbkUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFFbkUsSUFBSSxPQUFPLEdBQUcsQ0FBQyxJQUFJLE9BQU8sS0FBSyxDQUFDO29CQUM1QixPQUFPLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUUsQ0FBQztxQkFDcEMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxJQUFJLE9BQU8sS0FBSyxDQUFDO29CQUNqQyxPQUFPLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUUsQ0FBQztZQUM3QyxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUFvQixVQUFVO1FBQzFCLE1BQU0sVUFBVSxHQUFlLEVBQUUsQ0FBQztRQUVsQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNwQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFFLElBQUksQ0FBQztnQkFDckIsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBRUQsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ2EsUUFBUSxDQUFDLElBQWMsRUFBRSxRQUFnQjtRQUNyRCxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBRSxFQUFFLENBQUM7UUFDeEIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ2EsWUFBWTtRQUN4QixtRUFBbUU7UUFDbkUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRTFELEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBRSxFQUFFLENBQUM7SUFDdkIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2UgZnJvbSBcIi4uLy4uL2Jhc2UvYm9hcmQuanNcIjtcbmltcG9ydCBMb25nSW50IGZyb20gXCIuLi8uLi9iaXRCb2FyZC9sb25nSW50LmpzXCI7XG5pbXBvcnQgTG9uZ0ludEJpdEJvYXJkIGZyb20gXCIuLi8uLi9iaXRCb2FyZC9sb25nSW50Qml0Qm9hcmQuanNcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwiLi4vLi4vYmFzZS9ib2FyZC5qc1wiO1xuXG4vKiogUmVwcmVzZW50cyBhIENvbm5lY3QgNCBib2FyZC4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJvYXJkIGV4dGVuZHMgQmFzZTxMb25nSW50PiB7XG4gICAgcHJvdGVjdGVkIHdpbm5pbmdTdGF0ZXM6IExvbmdJbnRCaXRCb2FyZFtdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBUcmFja3MgdGhlIG5leHQgYXZhaWxhYmxlIHJvdyBpbmRleCBwZXIgY29sdW1uIChyb3cgNSA9IGJvdHRvbSwgcm93IDAgPSB0b3ApLlxuICAgICAqIEEgdmFsdWUgb2YgLTEgbWVhbnMgdGhlIGNvbHVtbiBpcyBmdWxsLlxuICAgICAqIE1haW50YWluZWQgaW5jcmVtZW50YWxseSBzbyBtYWtlTW92ZSBhbmQgZW1wdHlDZWxscyBhcmUgTygxKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGhlaWdodHM6IG51bWJlcltdID0gWzUsIDUsIDUsIDUsIDUsIDUsIDVdO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBGVUxMX0JPQVJEID0gbmV3IExvbmdJbnQoWzBiMTExMV8xMTExMTExXzExMTExMTFfMTExMTExMV8xMTExMTExLCAwYjExMTExMTFfMTExXSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IEhPUklaT05UQUwgPSBuZXcgTG9uZ0ludChbMGIwMDAwXzAwMDAwMDBfMDAwMDAwMF8wMDAwMDAwXzAwMDExMTEsIDBiMDAwMDAwMF8wMDBdKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgVkVSVElDQUwgPSBuZXcgTG9uZ0ludChbMGIwMDAwXzAwMDAwMDFfMDAwMDAwMV8wMDAwMDAxXzAwMDAwMDEsIDBiMDAwMDAwMF8wMDBdKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgTEVBRElOR19ESUFHT05BTCA9IG5ldyBMb25nSW50KFswYjAwMDBfMDAwMTAwMF8wMDAwMTAwXzAwMDAwMTBfMDAwMDAwMSwgMGIwMDAwMDAwXzAwMF0pO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBOT05fTEVBRElOR19ESUFHT05BTCA9IG5ldyBMb25nSW50KFswYjAwMDBfMDAwMDAwMV8wMDAwMDEwXzAwMDAxMDBfMDAwMTAwMCwgMGIwMDAwMDAwXzAwMF0pO1xuXG4gICAgLyoqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQm9hcmQuICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcig3LCA2KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNjsgaisrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53aW5uaW5nU3RhdGVzLnB1c2gobmV3IExvbmdJbnRCaXRCb2FyZChMb25nSW50XG4gICAgICAgICAgICAgICAgICAgIC5sZWZ0U2hpZnQodGhpcy5IT1JJWk9OVEFMLCBpICsgNyAqIGopXG4gICAgICAgICAgICAgICAgICAgIC5hbmQodGhpcy5GVUxMX0JPQVJEKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMud2lubmluZ1N0YXRlcy5wdXNoKG5ldyBMb25nSW50Qml0Qm9hcmQoTG9uZ0ludFxuICAgICAgICAgICAgICAgICAgICAubGVmdFNoaWZ0KHRoaXMuVkVSVElDQUwsIGkgKyA3ICogailcbiAgICAgICAgICAgICAgICAgICAgLmFuZCh0aGlzLkZVTExfQk9BUkQpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMzsgaisrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53aW5uaW5nU3RhdGVzLnB1c2gobmV3IExvbmdJbnRCaXRCb2FyZChMb25nSW50XG4gICAgICAgICAgICAgICAgICAgIC5sZWZ0U2hpZnQodGhpcy5MRUFESU5HX0RJQUdPTkFMLCBpICsgNyAqIGopXG4gICAgICAgICAgICAgICAgICAgIC5hbmQodGhpcy5GVUxMX0JPQVJEKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMud2lubmluZ1N0YXRlcy5wdXNoKG5ldyBMb25nSW50Qml0Qm9hcmQoTG9uZ0ludFxuICAgICAgICAgICAgICAgICAgICAubGVmdFNoaWZ0KHRoaXMuTk9OX0xFQURJTkdfRElBR09OQUwsIGkgKyA3ICogailcbiAgICAgICAgICAgICAgICAgICAgLmFuZCh0aGlzLkZVTExfQk9BUkQpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBoZXVyaXN0aWMgc2NvcmUgZm9yIHRoZSBjdXJyZW50IGJvYXJkIHN0YXRlLlxuICAgICAqIEByZXR1cm5zIFRoZSBoZXVyaXN0aWMgc2NvcmUuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzXG4gICAgcHVibGljIGdldCBoZXVyaXN0aWMoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgeyB3aW5uZXIgfSA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHdpbm5lciA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiAxMDAwMCAtIHRoaXMubW92ZXMubGVuZ3RoO1xuXG4gICAgICAgIGlmICh3aW5uZXIgPT09IDEpXG4gICAgICAgICAgICByZXR1cm4gLSgxMDAwMCAtIHRoaXMubW92ZXMubGVuZ3RoKTtcblxuICAgICAgICBsZXQgcDBTY29yZSA9IDA7XG4gICAgICAgIGxldCBwMVNjb3JlID0gMDtcblxuICAgICAgICAvLyBIb3Jpem9udGFsIOKGklxuICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy53aWR0aCAtIDM7IHgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdpbmRvdyA9IFtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5IH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHg6IHggKyAxLCB5IH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHg6IHggKyAyLCB5IH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHg6IHggKyAzLCB5IH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwMENvdW50ID0gd2luZG93LmZpbHRlcigob2NjdXBpZXIpID0+IG9jY3VwaWVyID09PSAwKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgcDFDb3VudCA9IHdpbmRvdy5maWx0ZXIoKG9jY3VwaWVyKSA9PiBvY2N1cGllciA9PT0gMSkubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgaWYgKHAwQ291bnQgPiAwICYmIHAxQ291bnQgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHAwU2NvcmUgKz0gWzAsIDEsIDEwLCAxMDBdW3AwQ291bnRdITtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwMUNvdW50ID4gMCAmJiBwMENvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBwMVNjb3JlICs9IFswLCAxLCAxMCwgMTAwXVtwMUNvdW50XSE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWZXJ0aWNhbCDihpNcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLndpZHRoOyB4KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5oZWlnaHQgLSAzOyB5KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3aW5kb3cgPSBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeCwgeSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5OiB5ICsgMSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5OiB5ICsgMiB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5OiB5ICsgMyB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcDBDb3VudCA9IHdpbmRvdy5maWx0ZXIoKG9jY3VwaWVyKSA9PiBvY2N1cGllciA9PT0gMCkubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHAxQ291bnQgPSB3aW5kb3cuZmlsdGVyKChvY2N1cGllcikgPT4gb2NjdXBpZXIgPT09IDEpLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIGlmIChwMENvdW50ID4gMCAmJiBwMUNvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBwMFNjb3JlICs9IFswLCAxLCAxMCwgMTAwXVtwMENvdW50XSE7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocDFDb3VudCA+IDAgJiYgcDBDb3VudCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcDFTY29yZSArPSBbMCwgMSwgMTAsIDEwMF1bcDFDb3VudF0hO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGlhZ29uYWwg4oaYXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy53aWR0aCAtIDM7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCB0aGlzLmhlaWdodCAtIDM7IHkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdpbmRvdyA9IFtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5IH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHg6IHggKyAxLCB5OiB5ICsgMSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4OiB4ICsgMiwgeTogeSArIDIgfSBhcyBQb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeDogeCArIDMsIHk6IHkgKyAzIH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwMENvdW50ID0gd2luZG93LmZpbHRlcigob2NjdXBpZXIpID0+IG9jY3VwaWVyID09PSAwKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgcDFDb3VudCA9IHdpbmRvdy5maWx0ZXIoKG9jY3VwaWVyKSA9PiBvY2N1cGllciA9PT0gMSkubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgaWYgKHAwQ291bnQgPiAwICYmIHAxQ291bnQgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHAwU2NvcmUgKz0gWzAsIDEsIDEwLCAxMDBdW3AwQ291bnRdITtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwMUNvdW50ID4gMCAmJiBwMENvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBwMVNjb3JlICs9IFswLCAxLCAxMCwgMTAwXVtwMUNvdW50XSE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEaWFnb25hbCDihpdcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLndpZHRoIC0gMzsgeCsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5ID0gMzsgeSA8IHRoaXMuaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3aW5kb3cgPSBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeCwgeSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4OiB4ICsgMSwgeTogeSAtIDEgfSBhcyBQb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeDogeCArIDIsIHk6IHkgLSAyIH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHg6IHggKyAzLCB5OiB5IC0gMyB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcDBDb3VudCA9IHdpbmRvdy5maWx0ZXIoKG9jY3VwaWVyKSA9PiBvY2N1cGllciA9PT0gMCkubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHAxQ291bnQgPSB3aW5kb3cuZmlsdGVyKChvY2N1cGllcikgPT4gb2NjdXBpZXIgPT09IDEpLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIGlmIChwMENvdW50ID4gMCAmJiBwMUNvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBwMFNjb3JlICs9IFswLCAxLCAxMCwgMTAwXVtwMENvdW50XSE7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocDFDb3VudCA+IDAgJiYgcDBDb3VudCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcDFTY29yZSArPSBbMCwgMSwgMTAsIDEwMF1bcDFDb3VudF0hO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHAxU2NvcmUgLSBwMFNjb3JlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNvbHVtbiBtb3ZlcyBvcmRlcmVkIGNlbnRyZS1maXJzdCBzbyB0aGF0XG4gICAgICogYWxwaGEtYmV0YSBwcnVuaW5nIGVuY291bnRlcnMgdGhlIHN0cm9uZ2VzdCBtb3ZlcyBlYXJsaWVzdC5cbiAgICAgKiBVc2VzIHRoZSBpbmNyZW1lbnRhbCBoZWlnaHRzIGFycmF5IOKAlCBPKHdpZHRoKSwgbm8gYml0Ym9hcmQgcmVhZHMuXG4gICAgICogQHJldHVybnMgVGhlIGxpc3Qgb2YgZW1wdHkgY2VsbHMuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCBlbXB0eUNlbGxzKCk6IFBvc2l0aW9uW10ge1xuICAgICAgICBjb25zdCBlbXB0eUNlbGxzOiBQb3NpdGlvbltdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCB4IG9mIFszLCAyLCA0LCAxLCA1LCAwLCA2XSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGVpZ2h0c1t4XSEgPj0gMClcbiAgICAgICAgICAgICAgICBlbXB0eUNlbGxzLnB1c2goeyB4LCB5OiAwIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVtcHR5Q2VsbHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZXMgYSBtb3ZlIG9uIHRoZSBib2FyZC5cbiAgICAgKiBVc2VzIHRoZSBoZWlnaHRzIGFycmF5IGZvciBPKDEpIHJvdyByZXNvbHV0aW9uIGluc3RlYWQgb2Ygc2Nhbm5pbmcgdGhlIGNvbHVtbi5cbiAgICAgKiBAcGFyYW0gbW92ZSAtIFRoZSBtb3ZlIHRvIG1ha2UuXG4gICAgICogQHBhcmFtIHBsYXllcklkIC0gVGhlIHBsYXllciBtYWtpbmcgdGhlIG1vdmUuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIG1ha2VNb3ZlKG1vdmU6IFBvc2l0aW9uLCBwbGF5ZXJJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIG1vdmUueSA9IHRoaXMuaGVpZ2h0c1ttb3ZlLnhdITtcbiAgICAgICAgdGhpcy5oZWlnaHRzW21vdmUueF0hLS07XG4gICAgICAgIHN1cGVyLm1ha2VNb3ZlKG1vdmUsIHBsYXllcklkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnNlcyB0aGUgbGFzdCBtb3ZlIGFuZCByZXN0b3JlcyB0aGUgY29sdW1uIGhlaWdodC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgdW5kb0xhc3RNb3ZlKCk6IHZvaWQge1xuICAgICAgICAvLyBYLWNvb3JkaW5hdGUgaXMgcmVjb3ZlcmFibGUgZnJvbSB0aGUgYml0IGluZGV4OiBiaXQgJSB3aWR0aCA9IHguXG4gICAgICAgIGNvbnN0IHggPSB0aGlzLm1vdmVzW3RoaXMubW92ZXMubGVuZ3RoIC0gMV0hICUgdGhpcy53aWR0aDtcblxuICAgICAgICBzdXBlci51bmRvTGFzdE1vdmUoKTtcbiAgICAgICAgdGhpcy5oZWlnaHRzW3hdISsrO1xuICAgIH1cbn1cbiJdfQ==
@@ -1,5 +1,5 @@
1
- import type { Algorithm, GameConstructorOptions, PlayerType } from "../../base/controller.js";
2
- import Base from "../../base/controller.js";
1
+ import Base from "../../base/controller.js";
2
+ import type { GameConstructorOptions, PlayerType } from "../../base/controller.js";
3
3
  import Board from "./board.js";
4
4
  import type { Position } from "../../base/board.js";
5
5
  /** Represents the controller for connect 4. */
@@ -14,21 +14,18 @@ export default class Connect4 extends Base<Board> {
14
14
  /**
15
15
  * Calculates the CPU's move.
16
16
  * @param difficulty - The difficulty of the CPU.
17
- * @param algorithm - The algorithm to use.
18
17
  * @returns The CPU's move.
19
18
  * @throws {Error} An error if the difficulty is invalid.
20
19
  */
21
- determineCPUMove(difficulty: Omit<PlayerType, "human">, algorithm?: Algorithm): Position;
20
+ determineCPUMove(difficulty: Omit<PlayerType, "human">): Position;
22
21
  /**
23
22
  * Finds the optimal move for the current board state.
24
23
  * @param options - The options for the algorithm.
25
- * @param options.algorithm - The algorithm to use.
26
24
  * @param options.maxDepth - The maximum depth to search.
27
25
  * @returns The optimal move for the current board state.
28
26
  * @throws {Error} An error if the algorithm is invalid.
29
27
  */
30
- findOptimalMove(options?: {
31
- algorithm?: Algorithm;
32
- maxDepth?: number;
28
+ findOptimalMove({ maxDepth }?: {
29
+ maxDepth: number;
33
30
  }): Position;
34
31
  }
@@ -13,7 +13,7 @@ import Board from "./board.js";
13
13
  function defaultRender(controller) {
14
14
  /* eslint-disable no-console */
15
15
  console.clear();
16
- console.log(controller.board.toString(true, true, false, ["⬤", "⬤"]));
16
+ console.log(controller.board.toString(true, true, false, ["⬤ ", "⬤ "]));
17
17
  const { winner } = controller.board;
18
18
  if (winner !== false)
19
19
  console.log(winner === null ? "It's a tie!" : `Player ${winner + 1} wins!`);
@@ -33,20 +33,19 @@ let Connect4 = class Connect4 extends Base {
33
33
  /**
34
34
  * Calculates the CPU's move.
35
35
  * @param difficulty - The difficulty of the CPU.
36
- * @param algorithm - The algorithm to use.
37
36
  * @returns The CPU's move.
38
37
  * @throws {Error} An error if the difficulty is invalid.
39
38
  */
40
- determineCPUMove(difficulty, algorithm = "alphabeta") {
39
+ determineCPUMove(difficulty) {
41
40
  const { emptyCells } = this.board;
42
41
  const randomMove = emptyCells[Math.floor(Math.random() * emptyCells.length)];
43
42
  switch (difficulty) {
44
43
  case "impossibleCPU":
45
- return this.findOptimalMove({ algorithm, maxDepth: 7 });
44
+ return this.findOptimalMove({ maxDepth: 10 });
46
45
  case "hardCPU":
47
- return this.findOptimalMove({ algorithm, maxDepth: 5 });
46
+ return this.findOptimalMove({ maxDepth: 7 });
48
47
  case "mediumCPU":
49
- return this.findOptimalMove({ algorithm, maxDepth: 3 });
48
+ return this.findOptimalMove({ maxDepth: 5 });
50
49
  case "easyCPU":
51
50
  return randomMove;
52
51
  default:
@@ -56,21 +55,18 @@ let Connect4 = class Connect4 extends Base {
56
55
  /**
57
56
  * Finds the optimal move for the current board state.
58
57
  * @param options - The options for the algorithm.
59
- * @param options.algorithm - The algorithm to use.
60
58
  * @param options.maxDepth - The maximum depth to search.
61
59
  * @returns The optimal move for the current board state.
62
60
  * @throws {Error} An error if the algorithm is invalid.
63
61
  */
64
- findOptimalMove(options) {
65
- const { maxDepth = Infinity, algorithm = "alphabeta" } = options ?? {};
66
- if (this.board.isEmpty)
67
- return { x: 3, y: 5 };
68
- const minimax = this[algorithm](maxDepth);
69
- return minimax.move;
62
+ findOptimalMove({ maxDepth } = { maxDepth: Infinity }) {
63
+ return this.board.isEmpty
64
+ ? { x: 3, y: 5 }
65
+ : this.alphabeta(maxDepth).move;
70
66
  }
71
67
  };
72
68
  Connect4 = __decorate([
73
69
  Game
74
70
  ], Connect4);
75
71
  export default Connect4;
76
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nYW1lcy9jb25uZWN0NC9jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLE9BQU8sSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBRy9COzs7R0FHRztBQUNILFNBQVMsYUFBYSxDQUFDLFVBQW9CO0lBQ3ZDLCtCQUErQjtJQUMvQixPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFFcEMsSUFBSSxNQUFNLEtBQUssS0FBSztRQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRiw4QkFBOEI7QUFDbEMsQ0FBQztBQUVELCtDQUErQztBQUVoQyxJQUFNLFFBQVEsR0FBZCxNQUFNLFFBQVMsU0FBUSxJQUFXO0lBQzdDOzs7OztPQUtHO0lBQ0gsWUFDSSxhQUF5QixFQUN6QixhQUF5QixFQUN6QixPQUF1QztRQUV2QyxLQUFLLENBQ0QsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLEVBQzlCLElBQUksS0FBSyxFQUFFLEVBQ1gsT0FBTyxFQUFFLFFBQVEsSUFBSSxhQUFhLEVBQ2xDLE9BQU8sRUFBRSxLQUFLLEVBQ2QsT0FBTyxFQUFFLGNBQWMsQ0FDMUIsQ0FBQztJQUNOLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxnQkFBZ0IsQ0FBQyxVQUFxQyxFQUFFLFlBQXVCLFdBQVc7UUFDN0YsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDbEMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBRSxDQUFDO1FBRTlFLFFBQVEsVUFBVSxFQUFFLENBQUM7WUFDakIsS0FBSyxlQUFlO2dCQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDNUQsS0FBSyxTQUFTO2dCQUNWLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM1RCxLQUFLLFdBQVc7Z0JBQ1osT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVELEtBQUssU0FBUztnQkFDVixPQUFPLFVBQVUsQ0FBQztZQUN0QjtnQkFDSSxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksZUFBZSxDQUFDLE9BQXVEO1FBQzFFLE1BQU0sRUFBRSxRQUFRLEdBQUcsUUFBUSxFQUFFLFNBQVMsR0FBRyxXQUFXLEVBQUUsR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO1FBRXZFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPO1lBQ2xCLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUUxQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFMUMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ3hCLENBQUM7Q0FDSixDQUFBO0FBaEVvQixRQUFRO0lBRDVCLElBQUk7R0FDZ0IsUUFBUSxDQWdFNUI7ZUFoRW9CLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFsZ29yaXRobSwgR2FtZUNvbnN0cnVjdG9yT3B0aW9ucywgUGxheWVyVHlwZSB9IGZyb20gXCIuLi8uLi9iYXNlL2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCBCYXNlLCB7IEdhbWUgfSBmcm9tIFwiLi4vLi4vYmFzZS9jb250cm9sbGVyLmpzXCI7XG5pbXBvcnQgQm9hcmQgZnJvbSBcIi4vYm9hcmQuanNcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwiLi4vLi4vYmFzZS9ib2FyZC5qc1wiO1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHJlbmRlcmVyIGZvciBjb25uZWN0IDQuXG4gKiBAcGFyYW0gY29udHJvbGxlciAtIFRoZSBjb250cm9sbGVyIHRvIHJlbmRlci5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdFJlbmRlcihjb250cm9sbGVyOiBDb25uZWN0NCk6IHZvaWQge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgICBjb25zb2xlLmNsZWFyKCk7XG4gICAgY29uc29sZS5sb2coY29udHJvbGxlci5ib2FyZC50b1N0cmluZyh0cnVlLCB0cnVlLCBmYWxzZSwgW1wi4qykXCIsIFwi4qykXCJdKSk7XG4gICAgY29uc3QgeyB3aW5uZXIgfSA9IGNvbnRyb2xsZXIuYm9hcmQ7XG5cbiAgICBpZiAod2lubmVyICE9PSBmYWxzZSlcbiAgICAgICAgY29uc29sZS5sb2cod2lubmVyID09PSBudWxsID8gXCJJdCdzIGEgdGllIVwiIDogYFBsYXllciAke3dpbm5lciArIDF9IHdpbnMhYCk7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1jb25zb2xlICovXG59XG5cbi8qKiBSZXByZXNlbnRzIHRoZSBjb250cm9sbGVyIGZvciBjb25uZWN0IDQuICovXG5AR2FtZVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29ubmVjdDQgZXh0ZW5kcyBCYXNlPEJvYXJkPiB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDb25uZWN0NC5cbiAgICAgKiBAcGFyYW0gcGxheWVyT25lVHlwZSAtIFRoZSB0eXBlIG9mIHBsYXllciBvbmUgKGh1bWFuIG9yIENQVSkuXG4gICAgICogQHBhcmFtIHBsYXllclR3b1R5cGUgLSBUaGUgdHlwZSBvZiBwbGF5ZXIgdHdvIChodW1hbiBvciBDUFUpLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBnYW1lLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcGxheWVyT25lVHlwZTogUGxheWVyVHlwZSxcbiAgICAgICAgcGxheWVyVHdvVHlwZTogUGxheWVyVHlwZSxcbiAgICAgICAgb3B0aW9ucz86IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnM8Qm9hcmQ+LFxuICAgICkge1xuICAgICAgICBzdXBlcihcbiAgICAgICAgICAgIFtwbGF5ZXJPbmVUeXBlLCBwbGF5ZXJUd29UeXBlXSxcbiAgICAgICAgICAgIG5ldyBCb2FyZCgpLFxuICAgICAgICAgICAgb3B0aW9ucz8ucmVuZGVyZXIgPz8gZGVmYXVsdFJlbmRlcixcbiAgICAgICAgICAgIG9wdGlvbnM/Lm9uRW5kLFxuICAgICAgICAgICAgb3B0aW9ucz8ub25JbnZhbGlkSW5wdXQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgQ1BVJ3MgbW92ZS5cbiAgICAgKiBAcGFyYW0gZGlmZmljdWx0eSAtIFRoZSBkaWZmaWN1bHR5IG9mIHRoZSBDUFUuXG4gICAgICogQHBhcmFtIGFsZ29yaXRobSAtIFRoZSBhbGdvcml0aG0gdG8gdXNlLlxuICAgICAqIEByZXR1cm5zIFRoZSBDUFUncyBtb3ZlLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBBbiBlcnJvciBpZiB0aGUgZGlmZmljdWx0eSBpcyBpbnZhbGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZXRlcm1pbmVDUFVNb3ZlKGRpZmZpY3VsdHk6IE9taXQ8UGxheWVyVHlwZSwgXCJodW1hblwiPiwgYWxnb3JpdGhtOiBBbGdvcml0aG0gPSBcImFscGhhYmV0YVwiKTogUG9zaXRpb24ge1xuICAgICAgICBjb25zdCB7IGVtcHR5Q2VsbHMgfSA9IHRoaXMuYm9hcmQ7XG4gICAgICAgIGNvbnN0IHJhbmRvbU1vdmUgPSBlbXB0eUNlbGxzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGVtcHR5Q2VsbHMubGVuZ3RoKV0hO1xuXG4gICAgICAgIHN3aXRjaCAoZGlmZmljdWx0eSkge1xuICAgICAgICAgICAgY2FzZSBcImltcG9zc2libGVDUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kT3B0aW1hbE1vdmUoeyBhbGdvcml0aG0sIG1heERlcHRoOiA3IH0pO1xuICAgICAgICAgICAgY2FzZSBcImhhcmRDUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kT3B0aW1hbE1vdmUoeyBhbGdvcml0aG0sIG1heERlcHRoOiA1IH0pO1xuICAgICAgICAgICAgY2FzZSBcIm1lZGl1bUNQVVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRPcHRpbWFsTW92ZSh7IGFsZ29yaXRobSwgbWF4RGVwdGg6IDMgfSk7XG4gICAgICAgICAgICBjYXNlIFwiZWFzeUNQVVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiByYW5kb21Nb3ZlO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGRpZmZpY3VsdHkuXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIG9wdGltYWwgbW92ZSBmb3IgdGhlIGN1cnJlbnQgYm9hcmQgc3RhdGUuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5hbGdvcml0aG0gLSBUaGUgYWxnb3JpdGhtIHRvIHVzZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5tYXhEZXB0aCAtIFRoZSBtYXhpbXVtIGRlcHRoIHRvIHNlYXJjaC5cbiAgICAgKiBAcmV0dXJucyBUaGUgb3B0aW1hbCBtb3ZlIGZvciB0aGUgY3VycmVudCBib2FyZCBzdGF0ZS5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gQW4gZXJyb3IgaWYgdGhlIGFsZ29yaXRobSBpcyBpbnZhbGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kT3B0aW1hbE1vdmUob3B0aW9ucz86IHsgYWxnb3JpdGhtPzogQWxnb3JpdGhtOyBtYXhEZXB0aD86IG51bWJlcjsgfSk6IFBvc2l0aW9uIHtcbiAgICAgICAgY29uc3QgeyBtYXhEZXB0aCA9IEluZmluaXR5LCBhbGdvcml0aG0gPSBcImFscGhhYmV0YVwiIH0gPSBvcHRpb25zID8/IHt9O1xuXG4gICAgICAgIGlmICh0aGlzLmJvYXJkLmlzRW1wdHkpXG4gICAgICAgICAgICByZXR1cm4geyB4OiAzLCB5OiA1IH07XG5cbiAgICAgICAgY29uc3QgbWluaW1heCA9IHRoaXNbYWxnb3JpdGhtXShtYXhEZXB0aCk7XG5cbiAgICAgICAgcmV0dXJuIG1pbmltYXgubW92ZTtcbiAgICB9XG59XG4iXX0=
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nYW1lcy9jb25uZWN0NC9jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFdEQsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBRy9COzs7R0FHRztBQUNILFNBQVMsYUFBYSxDQUFDLFVBQW9CO0lBQ3ZDLCtCQUErQjtJQUMvQixPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFFcEMsSUFBSSxNQUFNLEtBQUssS0FBSztRQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRiw4QkFBOEI7QUFDbEMsQ0FBQztBQUVELCtDQUErQztBQUVoQyxJQUFNLFFBQVEsR0FBZCxNQUFNLFFBQVMsU0FBUSxJQUFXO0lBQzdDOzs7OztPQUtHO0lBQ0gsWUFDSSxhQUF5QixFQUN6QixhQUF5QixFQUN6QixPQUF1QztRQUV2QyxLQUFLLENBQ0QsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLEVBQzlCLElBQUksS0FBSyxFQUFFLEVBQ1gsT0FBTyxFQUFFLFFBQVEsSUFBSSxhQUFhLEVBQ2xDLE9BQU8sRUFBRSxLQUFLLEVBQ2QsT0FBTyxFQUFFLGNBQWMsQ0FDMUIsQ0FBQztJQUNOLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGdCQUFnQixDQUFDLFVBQXFDO1FBQ3pELE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2xDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUUsQ0FBQztRQUU5RSxRQUFRLFVBQVUsRUFBRSxDQUFDO1lBQ2pCLEtBQUssZUFBZTtnQkFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbEQsS0FBSyxTQUFTO2dCQUNWLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELEtBQUssV0FBVztnQkFDWixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqRCxLQUFLLFNBQVM7Z0JBQ1YsT0FBTyxVQUFVLENBQUM7WUFDdEI7Z0JBQ0ksTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZUFBZSxDQUFDLEVBQUUsUUFBUSxLQUE0QixFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7UUFDL0UsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87WUFDckIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ2hCLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN4QyxDQUFDO0NBQ0osQ0FBQTtBQXpEb0IsUUFBUTtJQUQ1QixJQUFJO0dBQ2dCLFFBQVEsQ0F5RDVCO2VBekRvQixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2UsIHsgR2FtZSB9IGZyb20gXCIuLi8uLi9iYXNlL2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgR2FtZUNvbnN0cnVjdG9yT3B0aW9ucywgUGxheWVyVHlwZSB9IGZyb20gXCIuLi8uLi9iYXNlL2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCBCb2FyZCBmcm9tIFwiLi9ib2FyZC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQb3NpdGlvbiB9IGZyb20gXCIuLi8uLi9iYXNlL2JvYXJkLmpzXCI7XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgcmVuZGVyZXIgZm9yIGNvbm5lY3QgNC5cbiAqIEBwYXJhbSBjb250cm9sbGVyIC0gVGhlIGNvbnRyb2xsZXIgdG8gcmVuZGVyLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0UmVuZGVyKGNvbnRyb2xsZXI6IENvbm5lY3Q0KTogdm9pZCB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICAgIGNvbnNvbGUuY2xlYXIoKTtcbiAgICBjb25zb2xlLmxvZyhjb250cm9sbGVyLmJvYXJkLnRvU3RyaW5nKHRydWUsIHRydWUsIGZhbHNlLCBbXCLirKQgXCIsIFwi4qykIFwiXSkpO1xuICAgIGNvbnN0IHsgd2lubmVyIH0gPSBjb250cm9sbGVyLmJvYXJkO1xuXG4gICAgaWYgKHdpbm5lciAhPT0gZmFsc2UpXG4gICAgICAgIGNvbnNvbGUubG9nKHdpbm5lciA9PT0gbnVsbCA/IFwiSXQncyBhIHRpZSFcIiA6IGBQbGF5ZXIgJHt3aW5uZXIgKyAxfSB3aW5zIWApO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xufVxuXG4vKiogUmVwcmVzZW50cyB0aGUgY29udHJvbGxlciBmb3IgY29ubmVjdCA0LiAqL1xuQEdhbWVcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbm5lY3Q0IGV4dGVuZHMgQmFzZTxCb2FyZD4ge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ29ubmVjdDQuXG4gICAgICogQHBhcmFtIHBsYXllck9uZVR5cGUgLSBUaGUgdHlwZSBvZiBwbGF5ZXIgb25lIChodW1hbiBvciBDUFUpLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJUd29UeXBlIC0gVGhlIHR5cGUgb2YgcGxheWVyIHR3byAoaHVtYW4gb3IgQ1BVKS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZ2FtZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHBsYXllck9uZVR5cGU6IFBsYXllclR5cGUsXG4gICAgICAgIHBsYXllclR3b1R5cGU6IFBsYXllclR5cGUsXG4gICAgICAgIG9wdGlvbnM/OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zPEJvYXJkPixcbiAgICApIHtcbiAgICAgICAgc3VwZXIoXG4gICAgICAgICAgICBbcGxheWVyT25lVHlwZSwgcGxheWVyVHdvVHlwZV0sXG4gICAgICAgICAgICBuZXcgQm9hcmQoKSxcbiAgICAgICAgICAgIG9wdGlvbnM/LnJlbmRlcmVyID8/IGRlZmF1bHRSZW5kZXIsXG4gICAgICAgICAgICBvcHRpb25zPy5vbkVuZCxcbiAgICAgICAgICAgIG9wdGlvbnM/Lm9uSW52YWxpZElucHV0LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgdGhlIENQVSdzIG1vdmUuXG4gICAgICogQHBhcmFtIGRpZmZpY3VsdHkgLSBUaGUgZGlmZmljdWx0eSBvZiB0aGUgQ1BVLlxuICAgICAqIEByZXR1cm5zIFRoZSBDUFUncyBtb3ZlLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBBbiBlcnJvciBpZiB0aGUgZGlmZmljdWx0eSBpcyBpbnZhbGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZXRlcm1pbmVDUFVNb3ZlKGRpZmZpY3VsdHk6IE9taXQ8UGxheWVyVHlwZSwgXCJodW1hblwiPik6IFBvc2l0aW9uIHtcbiAgICAgICAgY29uc3QgeyBlbXB0eUNlbGxzIH0gPSB0aGlzLmJvYXJkO1xuICAgICAgICBjb25zdCByYW5kb21Nb3ZlID0gZW1wdHlDZWxsc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBlbXB0eUNlbGxzLmxlbmd0aCldITtcblxuICAgICAgICBzd2l0Y2ggKGRpZmZpY3VsdHkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJpbXBvc3NpYmxlQ1BVXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZE9wdGltYWxNb3ZlKHsgbWF4RGVwdGg6IDEwIH0pO1xuICAgICAgICAgICAgY2FzZSBcImhhcmRDUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kT3B0aW1hbE1vdmUoeyBtYXhEZXB0aDogNyB9KTtcbiAgICAgICAgICAgIGNhc2UgXCJtZWRpdW1DUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kT3B0aW1hbE1vdmUoeyBtYXhEZXB0aDogNSB9KTtcbiAgICAgICAgICAgIGNhc2UgXCJlYXN5Q1BVXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJhbmRvbU1vdmU7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZGlmZmljdWx0eS5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyB0aGUgb3B0aW1hbCBtb3ZlIGZvciB0aGUgY3VycmVudCBib2FyZCBzdGF0ZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLm1heERlcHRoIC0gVGhlIG1heGltdW0gZGVwdGggdG8gc2VhcmNoLlxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpbWFsIG1vdmUgZm9yIHRoZSBjdXJyZW50IGJvYXJkIHN0YXRlLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBBbiBlcnJvciBpZiB0aGUgYWxnb3JpdGhtIGlzIGludmFsaWQuXG4gICAgICovXG4gICAgcHVibGljIGZpbmRPcHRpbWFsTW92ZSh7IG1heERlcHRoIH06IHsgbWF4RGVwdGg6IG51bWJlcjsgfSA9IHsgbWF4RGVwdGg6IEluZmluaXR5IH0pOiBQb3NpdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmJvYXJkLmlzRW1wdHlcbiAgICAgICAgICAgID8geyB4OiAzLCB5OiA1IH1cbiAgICAgICAgICAgIDogdGhpcy5hbHBoYWJldGEobWF4RGVwdGgpLm1vdmU7XG4gICAgfVxufVxuIl19
@@ -15,10 +15,10 @@ export default class Board extends Base {
15
15
  get heuristic() {
16
16
  const { winner } = this;
17
17
  if (winner === 0)
18
- return 1;
18
+ return 10 - this.moves.length;
19
19
  if (winner === 1)
20
- return -1;
20
+ return -(10 - this.moves.length);
21
21
  return 0;
22
22
  }
23
23
  }
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2FtZXMvdGljdGFjdG9lL2JvYXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZDLE9BQU8sV0FBVyxNQUFNLCtCQUErQixDQUFDO0FBRXhELHNDQUFzQztBQUN0QyxNQUFNLENBQUMsT0FBTyxPQUFPLEtBQU0sU0FBUSxJQUFZO0lBQ2pDLGFBQWEsR0FBa0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO1NBQzVGLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUUxQyxvQ0FBb0M7SUFDcEM7UUFDSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFXLFNBQVM7UUFDaEIsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQztRQUV4QixJQUFJLE1BQU0sS0FBSyxDQUFDO1lBQ1osT0FBTyxDQUFDLENBQUM7UUFFYixJQUFJLE1BQU0sS0FBSyxDQUFDO1lBQ1osT0FBTyxDQUFDLENBQUMsQ0FBQztRQUVkLE9BQU8sQ0FBQyxDQUFDO0lBQ2IsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2UgZnJvbSBcIi4uLy4uL2Jhc2UvYm9hcmQuanNcIjtcbmltcG9ydCBJbnRCaXRCb2FyZCBmcm9tIFwiLi4vLi4vYml0Qm9hcmQvaW50Qml0Qm9hcmQuanNcIjtcblxuLyoqIFJlcHJlc2VudHMgYSBUaWMgVGFjIFRvZSBib2FyZC4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJvYXJkIGV4dGVuZHMgQmFzZTxudW1iZXI+IHtcbiAgICBwcm90ZWN0ZWQgd2lubmluZ1N0YXRlczogSW50Qml0Qm9hcmRbXSA9IFsweDAwNywgMHgwMzgsIDB4MUMwLCAweDA0OSwgMHgwOTIsIDB4MTI0LCAweDExMSwgMHgwNTRdXG4gICAgICAgIC5tYXAoKGRhdGEpID0+IG5ldyBJbnRCaXRCb2FyZChkYXRhKSk7XG5cbiAgICAvKiogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBCb2FyZC4gKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKDMsIDMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgdGhlIGhldXJpc3RpYyBzY29yZSBmb3IgdGhlIGN1cnJlbnQgYm9hcmQgc3RhdGUuXG4gICAgICogQHJldHVybnMgVGhlIGhldXJpc3RpYyBzY29yZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhldXJpc3RpYygpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB7IHdpbm5lciB9ID0gdGhpcztcblxuICAgICAgICBpZiAod2lubmVyID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIDE7XG5cbiAgICAgICAgaWYgKHdpbm5lciA9PT0gMSlcbiAgICAgICAgICAgIHJldHVybiAtMTtcblxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59XG4iXX0=
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2FtZXMvdGljdGFjdG9lL2JvYXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZDLE9BQU8sV0FBVyxNQUFNLCtCQUErQixDQUFDO0FBRXhELHNDQUFzQztBQUN0QyxNQUFNLENBQUMsT0FBTyxPQUFPLEtBQU0sU0FBUSxJQUFZO0lBQ2pDLGFBQWEsR0FBa0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO1NBQzVGLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUUxQyxvQ0FBb0M7SUFDcEM7UUFDSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFXLFNBQVM7UUFDaEIsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQztRQUV4QixJQUFJLE1BQU0sS0FBSyxDQUFDO1lBQ1osT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFFbEMsSUFBSSxNQUFNLEtBQUssQ0FBQztZQUNaLE9BQU8sQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXJDLE9BQU8sQ0FBQyxDQUFDO0lBQ2IsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2UgZnJvbSBcIi4uLy4uL2Jhc2UvYm9hcmQuanNcIjtcbmltcG9ydCBJbnRCaXRCb2FyZCBmcm9tIFwiLi4vLi4vYml0Qm9hcmQvaW50Qml0Qm9hcmQuanNcIjtcblxuLyoqIFJlcHJlc2VudHMgYSBUaWMgVGFjIFRvZSBib2FyZC4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJvYXJkIGV4dGVuZHMgQmFzZTxudW1iZXI+IHtcbiAgICBwcm90ZWN0ZWQgd2lubmluZ1N0YXRlczogSW50Qml0Qm9hcmRbXSA9IFsweDAwNywgMHgwMzgsIDB4MUMwLCAweDA0OSwgMHgwOTIsIDB4MTI0LCAweDExMSwgMHgwNTRdXG4gICAgICAgIC5tYXAoKGRhdGEpID0+IG5ldyBJbnRCaXRCb2FyZChkYXRhKSk7XG5cbiAgICAvKiogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBCb2FyZC4gKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKDMsIDMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgdGhlIGhldXJpc3RpYyBzY29yZSBmb3IgdGhlIGN1cnJlbnQgYm9hcmQgc3RhdGUuXG4gICAgICogQHJldHVybnMgVGhlIGhldXJpc3RpYyBzY29yZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhldXJpc3RpYygpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB7IHdpbm5lciB9ID0gdGhpcztcblxuICAgICAgICBpZiAod2lubmVyID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIDEwIC0gdGhpcy5tb3Zlcy5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHdpbm5lciA9PT0gMSlcbiAgICAgICAgICAgIHJldHVybiAtKDEwIC0gdGhpcy5tb3Zlcy5sZW5ndGgpO1xuXG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbn1cbiJdfQ==
@@ -1,5 +1,5 @@
1
- import type { Algorithm, GameConstructorOptions, PlayerType } from "../../base/controller.js";
2
- import Base from "../../base/controller.js";
1
+ import Base from "../../base/controller.js";
2
+ import type { GameConstructorOptions, PlayerType } from "../../base/controller.js";
3
3
  import Board from "./board.js";
4
4
  import type { Position } from "../../base/board.js";
5
5
  /** A game of TicTacToe. */
@@ -14,21 +14,18 @@ export default class TicTacToe extends Base<Board> {
14
14
  /**
15
15
  * Calculates the CPU's move.
16
16
  * @param difficulty - The difficulty of the CPU.
17
- * @param algorithm - The algorithm to use.
18
17
  * @returns The CPU's move.
19
18
  * @throws {Error} An error if the difficulty is invalid.
20
19
  */
21
- determineCPUMove(difficulty: Omit<PlayerType, "human">, algorithm?: Algorithm): Position;
20
+ determineCPUMove(difficulty: Omit<PlayerType, "human">): Position;
22
21
  /**
23
22
  * Finds the optimal move for the current player.
24
23
  * @param algorithm - The algorithm to use.
25
- * @param algorithm.algorithm - The algorithm to use.
26
24
  * @param algorithm.randomMove - The move to return if the board is empty.
27
25
  * @returns The optimal move for the current player.
28
26
  * @throws {Error} An error if the algorithm is invalid.
29
27
  */
30
- findOptimalMove({ algorithm, randomMove }?: {
31
- algorithm: Algorithm;
28
+ findOptimalMove({ randomMove }?: {
32
29
  randomMove: Position;
33
30
  }): Position;
34
31
  }
@@ -33,14 +33,13 @@ let TicTacToe = class TicTacToe extends Base {
33
33
  /**
34
34
  * Calculates the CPU's move.
35
35
  * @param difficulty - The difficulty of the CPU.
36
- * @param algorithm - The algorithm to use.
37
36
  * @returns The CPU's move.
38
37
  * @throws {Error} An error if the difficulty is invalid.
39
38
  */
40
- determineCPUMove(difficulty, algorithm = "alphabeta") {
39
+ determineCPUMove(difficulty) {
41
40
  const { emptyCells } = this.board;
42
41
  const randomMove = emptyCells[Math.floor(Math.random() * emptyCells.length)];
43
- const optimalMove = this.findOptimalMove({ algorithm, randomMove });
42
+ const optimalMove = this.findOptimalMove({ randomMove });
44
43
  switch (difficulty) {
45
44
  case "impossibleCPU":
46
45
  return optimalMove;
@@ -57,20 +56,18 @@ let TicTacToe = class TicTacToe extends Base {
57
56
  /**
58
57
  * Finds the optimal move for the current player.
59
58
  * @param algorithm - The algorithm to use.
60
- * @param algorithm.algorithm - The algorithm to use.
61
59
  * @param algorithm.randomMove - The move to return if the board is empty.
62
60
  * @returns The optimal move for the current player.
63
61
  * @throws {Error} An error if the algorithm is invalid.
64
62
  */
65
- findOptimalMove({ algorithm, randomMove } = { algorithm: "alphabeta", randomMove: { x: 2, y: 2 } }) {
66
- if (this.board.isEmpty)
67
- return randomMove;
68
- const minimax = this[algorithm]();
69
- return minimax.move;
63
+ findOptimalMove({ randomMove } = { randomMove: { x: 2, y: 2 } }) {
64
+ return this.board.isEmpty
65
+ ? randomMove
66
+ : this.alphabeta().move;
70
67
  }
71
68
  };
72
69
  TicTacToe = __decorate([
73
70
  Game
74
71
  ], TicTacToe);
75
72
  export default TicTacToe;
76
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nYW1lcy90aWN0YWN0b2UvY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxPQUFPLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RELE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQztBQUcvQjs7O0dBR0c7QUFDSCxTQUFTLGFBQWEsQ0FBQyxVQUFxQjtJQUN4QywrQkFBK0I7SUFDL0IsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM5QyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztJQUVwQyxJQUFJLE1BQU0sS0FBSyxLQUFLO1FBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hGLDhCQUE4QjtBQUNsQyxDQUFDO0FBRUQsMkJBQTJCO0FBRVosSUFBTSxTQUFTLEdBQWYsTUFBTSxTQUFVLFNBQVEsSUFBVztJQUM5Qzs7Ozs7T0FLRztJQUNILFlBQ0ksYUFBeUIsRUFDekIsYUFBeUIsRUFDekIsT0FBdUM7UUFFdkMsS0FBSyxDQUNELENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxFQUM5QixJQUFJLEtBQUssRUFBRSxFQUNYLE9BQU8sRUFBRSxRQUFRLElBQUksYUFBYSxFQUNsQyxPQUFPLEVBQUUsS0FBSyxFQUNkLE9BQU8sRUFBRSxjQUFjLENBQzFCLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZ0JBQWdCLENBQUMsVUFBcUMsRUFBRSxZQUF1QixXQUFXO1FBQzdGLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2xDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUUsQ0FBQztRQUM5RSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFFcEUsUUFBUSxVQUFVLEVBQUUsQ0FBQztZQUNqQixLQUFLLGVBQWU7Z0JBQ2hCLE9BQU8sV0FBVyxDQUFDO1lBQ3ZCLEtBQUssU0FBUztnQkFDVixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQzFELEtBQUssV0FBVztnQkFDWixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQzFELEtBQUssU0FBUztnQkFDVixPQUFPLFVBQVUsQ0FBQztZQUN0QjtnQkFDSSxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksZUFBZSxDQUFDLEVBQUUsU0FBUyxFQUFFLFVBQVUsS0FHMUMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3RELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPO1lBQ2xCLE9BQU8sVUFBVSxDQUFDO1FBRXRCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBRWxDLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQztJQUN4QixDQUFDO0NBQ0osQ0FBQTtBQWxFb0IsU0FBUztJQUQ3QixJQUFJO0dBQ2dCLFNBQVMsQ0FrRTdCO2VBbEVvQixTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbGdvcml0aG0sIEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnMsIFBsYXllclR5cGUgfSBmcm9tIFwiLi4vLi4vYmFzZS9jb250cm9sbGVyLmpzXCI7XG5pbXBvcnQgQmFzZSwgeyBHYW1lIH0gZnJvbSBcIi4uLy4uL2Jhc2UvY29udHJvbGxlci5qc1wiO1xuaW1wb3J0IEJvYXJkIGZyb20gXCIuL2JvYXJkLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4uLy4uL2Jhc2UvYm9hcmQuanNcIjtcblxuLyoqXG4gKiBUaGUgZGVmYXVsdCByZW5kZXJpbmcgZnVuY3Rpb24gZm9yIFRpY1RhY1RvZS5cbiAqIEBwYXJhbSBjb250cm9sbGVyIC0gVGhlIGNvbnRyb2xsZXIgdG8gcmVuZGVyLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0UmVuZGVyKGNvbnRyb2xsZXI6IFRpY1RhY1RvZSk6IHZvaWQge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgICBjb25zb2xlLmNsZWFyKCk7XG4gICAgY29uc29sZS5sb2coY29udHJvbGxlci5ib2FyZC50b1N0cmluZyhmYWxzZSkpO1xuICAgIGNvbnN0IHsgd2lubmVyIH0gPSBjb250cm9sbGVyLmJvYXJkO1xuXG4gICAgaWYgKHdpbm5lciAhPT0gZmFsc2UpXG4gICAgICAgIGNvbnNvbGUubG9nKHdpbm5lciA9PT0gbnVsbCA/IFwiSXQncyBhIHRpZSFcIiA6IGBQbGF5ZXIgJHt3aW5uZXIgKyAxfSB3aW5zIWApO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xufVxuXG4vKiogQSBnYW1lIG9mIFRpY1RhY1RvZS4gKi9cbkBHYW1lXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaWNUYWNUb2UgZXh0ZW5kcyBCYXNlPEJvYXJkPiB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBUaWNUYWNUb2UgZ2FtZS5cbiAgICAgKiBAcGFyYW0gcGxheWVyT25lVHlwZSAtIFRoZSB0eXBlIG9mIHBsYXllciBvbmUgKGh1bWFuIG9yIENQVSkuXG4gICAgICogQHBhcmFtIHBsYXllclR3b1R5cGUgLSBUaGUgdHlwZSBvZiBwbGF5ZXIgdHdvIChodW1hbiBvciBDUFUpLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBnYW1lLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcGxheWVyT25lVHlwZTogUGxheWVyVHlwZSxcbiAgICAgICAgcGxheWVyVHdvVHlwZTogUGxheWVyVHlwZSxcbiAgICAgICAgb3B0aW9ucz86IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnM8Qm9hcmQ+LFxuICAgICkge1xuICAgICAgICBzdXBlcihcbiAgICAgICAgICAgIFtwbGF5ZXJPbmVUeXBlLCBwbGF5ZXJUd29UeXBlXSxcbiAgICAgICAgICAgIG5ldyBCb2FyZCgpLFxuICAgICAgICAgICAgb3B0aW9ucz8ucmVuZGVyZXIgPz8gZGVmYXVsdFJlbmRlcixcbiAgICAgICAgICAgIG9wdGlvbnM/Lm9uRW5kLFxuICAgICAgICAgICAgb3B0aW9ucz8ub25JbnZhbGlkSW5wdXQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgQ1BVJ3MgbW92ZS5cbiAgICAgKiBAcGFyYW0gZGlmZmljdWx0eSAtIFRoZSBkaWZmaWN1bHR5IG9mIHRoZSBDUFUuXG4gICAgICogQHBhcmFtIGFsZ29yaXRobSAtIFRoZSBhbGdvcml0aG0gdG8gdXNlLlxuICAgICAqIEByZXR1cm5zIFRoZSBDUFUncyBtb3ZlLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBBbiBlcnJvciBpZiB0aGUgZGlmZmljdWx0eSBpcyBpbnZhbGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZXRlcm1pbmVDUFVNb3ZlKGRpZmZpY3VsdHk6IE9taXQ8UGxheWVyVHlwZSwgXCJodW1hblwiPiwgYWxnb3JpdGhtOiBBbGdvcml0aG0gPSBcImFscGhhYmV0YVwiKTogUG9zaXRpb24ge1xuICAgICAgICBjb25zdCB7IGVtcHR5Q2VsbHMgfSA9IHRoaXMuYm9hcmQ7XG4gICAgICAgIGNvbnN0IHJhbmRvbU1vdmUgPSBlbXB0eUNlbGxzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGVtcHR5Q2VsbHMubGVuZ3RoKV0hO1xuICAgICAgICBjb25zdCBvcHRpbWFsTW92ZSA9IHRoaXMuZmluZE9wdGltYWxNb3ZlKHsgYWxnb3JpdGhtLCByYW5kb21Nb3ZlIH0pO1xuXG4gICAgICAgIHN3aXRjaCAoZGlmZmljdWx0eSkge1xuICAgICAgICAgICAgY2FzZSBcImltcG9zc2libGVDUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW1hbE1vdmU7XG4gICAgICAgICAgICBjYXNlIFwiaGFyZENQVVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnJhbmRvbSgpIDwgMC44ID8gb3B0aW1hbE1vdmUgOiByYW5kb21Nb3ZlO1xuICAgICAgICAgICAgY2FzZSBcIm1lZGl1bUNQVVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnJhbmRvbSgpIDwgMC41ID8gb3B0aW1hbE1vdmUgOiByYW5kb21Nb3ZlO1xuICAgICAgICAgICAgY2FzZSBcImVhc3lDUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZG9tTW92ZTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkaWZmaWN1bHR5LlwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBvcHRpbWFsIG1vdmUgZm9yIHRoZSBjdXJyZW50IHBsYXllci5cbiAgICAgKiBAcGFyYW0gYWxnb3JpdGhtIC0gVGhlIGFsZ29yaXRobSB0byB1c2UuXG4gICAgICogQHBhcmFtIGFsZ29yaXRobS5hbGdvcml0aG0gLSBUaGUgYWxnb3JpdGhtIHRvIHVzZS5cbiAgICAgKiBAcGFyYW0gYWxnb3JpdGhtLnJhbmRvbU1vdmUgLSBUaGUgbW92ZSB0byByZXR1cm4gaWYgdGhlIGJvYXJkIGlzIGVtcHR5LlxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpbWFsIG1vdmUgZm9yIHRoZSBjdXJyZW50IHBsYXllci5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gQW4gZXJyb3IgaWYgdGhlIGFsZ29yaXRobSBpcyBpbnZhbGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kT3B0aW1hbE1vdmUoeyBhbGdvcml0aG0sIHJhbmRvbU1vdmUgfToge1xuICAgICAgICBhbGdvcml0aG06IEFsZ29yaXRobTtcbiAgICAgICAgcmFuZG9tTW92ZTogUG9zaXRpb247XG4gICAgfSA9IHsgYWxnb3JpdGhtOiBcImFscGhhYmV0YVwiLCByYW5kb21Nb3ZlOiB7IHg6IDIsIHk6IDIgfSB9KTogUG9zaXRpb24ge1xuICAgICAgICBpZiAodGhpcy5ib2FyZC5pc0VtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIHJhbmRvbU1vdmU7XG5cbiAgICAgICAgY29uc3QgbWluaW1heCA9IHRoaXNbYWxnb3JpdGhtXSgpO1xuXG4gICAgICAgIHJldHVybiBtaW5pbWF4Lm1vdmU7XG4gICAgfVxufVxuIl19
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nYW1lcy90aWN0YWN0b2UvY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXRELE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQztBQUcvQjs7O0dBR0c7QUFDSCxTQUFTLGFBQWEsQ0FBQyxVQUFxQjtJQUN4QywrQkFBK0I7SUFDL0IsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM5QyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztJQUVwQyxJQUFJLE1BQU0sS0FBSyxLQUFLO1FBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hGLDhCQUE4QjtBQUNsQyxDQUFDO0FBRUQsMkJBQTJCO0FBRVosSUFBTSxTQUFTLEdBQWYsTUFBTSxTQUFVLFNBQVEsSUFBVztJQUM5Qzs7Ozs7T0FLRztJQUNILFlBQ0ksYUFBeUIsRUFDekIsYUFBeUIsRUFDekIsT0FBdUM7UUFFdkMsS0FBSyxDQUNELENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxFQUM5QixJQUFJLEtBQUssRUFBRSxFQUNYLE9BQU8sRUFBRSxRQUFRLElBQUksYUFBYSxFQUNsQyxPQUFPLEVBQUUsS0FBSyxFQUNkLE9BQU8sRUFBRSxjQUFjLENBQzFCLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxnQkFBZ0IsQ0FBQyxVQUFxQztRQUN6RCxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNsQyxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFFLENBQUM7UUFDOUUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFFekQsUUFBUSxVQUFVLEVBQUUsQ0FBQztZQUNqQixLQUFLLGVBQWU7Z0JBQ2hCLE9BQU8sV0FBVyxDQUFDO1lBQ3ZCLEtBQUssU0FBUztnQkFDVixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQzFELEtBQUssV0FBVztnQkFDWixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQzFELEtBQUssU0FBUztnQkFDVixPQUFPLFVBQVUsQ0FBQztZQUN0QjtnQkFDSSxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxlQUFlLENBQUMsRUFBRSxVQUFVLEtBRS9CLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDOUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87WUFDckIsQ0FBQyxDQUFDLFVBQVU7WUFDWixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNoQyxDQUFDO0NBQ0osQ0FBQTtBQTVEb0IsU0FBUztJQUQ3QixJQUFJO0dBQ2dCLFNBQVMsQ0E0RDdCO2VBNURvQixTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2UsIHsgR2FtZSB9IGZyb20gXCIuLi8uLi9iYXNlL2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgR2FtZUNvbnN0cnVjdG9yT3B0aW9ucywgUGxheWVyVHlwZSB9IGZyb20gXCIuLi8uLi9iYXNlL2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCBCb2FyZCBmcm9tIFwiLi9ib2FyZC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQb3NpdGlvbiB9IGZyb20gXCIuLi8uLi9iYXNlL2JvYXJkLmpzXCI7XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgcmVuZGVyaW5nIGZ1bmN0aW9uIGZvciBUaWNUYWNUb2UuXG4gKiBAcGFyYW0gY29udHJvbGxlciAtIFRoZSBjb250cm9sbGVyIHRvIHJlbmRlci5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdFJlbmRlcihjb250cm9sbGVyOiBUaWNUYWNUb2UpOiB2b2lkIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gICAgY29uc29sZS5jbGVhcigpO1xuICAgIGNvbnNvbGUubG9nKGNvbnRyb2xsZXIuYm9hcmQudG9TdHJpbmcoZmFsc2UpKTtcbiAgICBjb25zdCB7IHdpbm5lciB9ID0gY29udHJvbGxlci5ib2FyZDtcblxuICAgIGlmICh3aW5uZXIgIT09IGZhbHNlKVxuICAgICAgICBjb25zb2xlLmxvZyh3aW5uZXIgPT09IG51bGwgPyBcIkl0J3MgYSB0aWUhXCIgOiBgUGxheWVyICR7d2lubmVyICsgMX0gd2lucyFgKTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnNvbGUgKi9cbn1cblxuLyoqIEEgZ2FtZSBvZiBUaWNUYWNUb2UuICovXG5AR2FtZVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGljVGFjVG9lIGV4dGVuZHMgQmFzZTxCb2FyZD4ge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVGljVGFjVG9lIGdhbWUuXG4gICAgICogQHBhcmFtIHBsYXllck9uZVR5cGUgLSBUaGUgdHlwZSBvZiBwbGF5ZXIgb25lIChodW1hbiBvciBDUFUpLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJUd29UeXBlIC0gVGhlIHR5cGUgb2YgcGxheWVyIHR3byAoaHVtYW4gb3IgQ1BVKS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZ2FtZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHBsYXllck9uZVR5cGU6IFBsYXllclR5cGUsXG4gICAgICAgIHBsYXllclR3b1R5cGU6IFBsYXllclR5cGUsXG4gICAgICAgIG9wdGlvbnM/OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zPEJvYXJkPixcbiAgICApIHtcbiAgICAgICAgc3VwZXIoXG4gICAgICAgICAgICBbcGxheWVyT25lVHlwZSwgcGxheWVyVHdvVHlwZV0sXG4gICAgICAgICAgICBuZXcgQm9hcmQoKSxcbiAgICAgICAgICAgIG9wdGlvbnM/LnJlbmRlcmVyID8/IGRlZmF1bHRSZW5kZXIsXG4gICAgICAgICAgICBvcHRpb25zPy5vbkVuZCxcbiAgICAgICAgICAgIG9wdGlvbnM/Lm9uSW52YWxpZElucHV0LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgdGhlIENQVSdzIG1vdmUuXG4gICAgICogQHBhcmFtIGRpZmZpY3VsdHkgLSBUaGUgZGlmZmljdWx0eSBvZiB0aGUgQ1BVLlxuICAgICAqIEByZXR1cm5zIFRoZSBDUFUncyBtb3ZlLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBBbiBlcnJvciBpZiB0aGUgZGlmZmljdWx0eSBpcyBpbnZhbGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZXRlcm1pbmVDUFVNb3ZlKGRpZmZpY3VsdHk6IE9taXQ8UGxheWVyVHlwZSwgXCJodW1hblwiPik6IFBvc2l0aW9uIHtcbiAgICAgICAgY29uc3QgeyBlbXB0eUNlbGxzIH0gPSB0aGlzLmJvYXJkO1xuICAgICAgICBjb25zdCByYW5kb21Nb3ZlID0gZW1wdHlDZWxsc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBlbXB0eUNlbGxzLmxlbmd0aCldITtcbiAgICAgICAgY29uc3Qgb3B0aW1hbE1vdmUgPSB0aGlzLmZpbmRPcHRpbWFsTW92ZSh7IHJhbmRvbU1vdmUgfSk7XG5cbiAgICAgICAgc3dpdGNoIChkaWZmaWN1bHR5KSB7XG4gICAgICAgICAgICBjYXNlIFwiaW1wb3NzaWJsZUNQVVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBvcHRpbWFsTW92ZTtcbiAgICAgICAgICAgIGNhc2UgXCJoYXJkQ1BVXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgPCAwLjggPyBvcHRpbWFsTW92ZSA6IHJhbmRvbU1vdmU7XG4gICAgICAgICAgICBjYXNlIFwibWVkaXVtQ1BVXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgPCAwLjUgPyBvcHRpbWFsTW92ZSA6IHJhbmRvbU1vdmU7XG4gICAgICAgICAgICBjYXNlIFwiZWFzeUNQVVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiByYW5kb21Nb3ZlO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGRpZmZpY3VsdHkuXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIG9wdGltYWwgbW92ZSBmb3IgdGhlIGN1cnJlbnQgcGxheWVyLlxuICAgICAqIEBwYXJhbSBhbGdvcml0aG0gLSBUaGUgYWxnb3JpdGhtIHRvIHVzZS5cbiAgICAgKiBAcGFyYW0gYWxnb3JpdGhtLnJhbmRvbU1vdmUgLSBUaGUgbW92ZSB0byByZXR1cm4gaWYgdGhlIGJvYXJkIGlzIGVtcHR5LlxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpbWFsIG1vdmUgZm9yIHRoZSBjdXJyZW50IHBsYXllci5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gQW4gZXJyb3IgaWYgdGhlIGFsZ29yaXRobSBpcyBpbnZhbGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kT3B0aW1hbE1vdmUoeyByYW5kb21Nb3ZlIH06IHtcbiAgICAgICAgcmFuZG9tTW92ZTogUG9zaXRpb247XG4gICAgfSA9IHsgcmFuZG9tTW92ZTogeyB4OiAyLCB5OiAyIH0gfSk6IFBvc2l0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm9hcmQuaXNFbXB0eVxuICAgICAgICAgICAgPyByYW5kb21Nb3ZlXG4gICAgICAgICAgICA6IHRoaXMuYWxwaGFiZXRhKCkubW92ZTtcbiAgICB9XG59XG4iXX0=
package/build/index.d.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  export type { default as TicTacToeBoard } from "./games/tictactoe/board.js";
3
3
  export { default as Connect4Controller } from "./games/connect4/controller.js";
4
4
  export type { default as Connect4Board } from "./games/connect4/board.js";
5
- export type { default as Controller, PlayerType, Algorithm, GameConstructorOptions, GameConstructor, } from "./base/controller.js";
5
+ export type { default as Controller, PlayerType, GameConstructorOptions, GameConstructor, } from "./base/controller.js";
6
6
  export type { default as Board, Position, GridLines, } from "./base/board.js";
7
7
  export type { default as BitBoard } from "./bitBoard/bitBoard.js";
8
8
  export type { default as IntBitBoard } from "./bitBoard/intBitBoard.js";
package/build/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  export { default as TicTacToeController } from "./games/tictactoe/controller.js";
2
2
  export { default as Connect4Controller } from "./games/connect4/controller.js";
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sSUFBSSxtQkFBbUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR2pGLE9BQU8sRUFBRSxPQUFPLElBQUksa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGRlZmF1bHQgYXMgVGljVGFjVG9lQ29udHJvbGxlciB9IGZyb20gXCIuL2dhbWVzL3RpY3RhY3RvZS9jb250cm9sbGVyLmpzXCI7XG5leHBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgVGljVGFjVG9lQm9hcmQgfSBmcm9tIFwiLi9nYW1lcy90aWN0YWN0b2UvYm9hcmQuanNcIjtcblxuZXhwb3J0IHsgZGVmYXVsdCBhcyBDb25uZWN0NENvbnRyb2xsZXIgfSBmcm9tIFwiLi9nYW1lcy9jb25uZWN0NC9jb250cm9sbGVyLmpzXCI7XG5leHBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgQ29ubmVjdDRCb2FyZCB9IGZyb20gXCIuL2dhbWVzL2Nvbm5lY3Q0L2JvYXJkLmpzXCI7XG5cbmV4cG9ydCB0eXBlIHtcbiAgICBkZWZhdWx0IGFzIENvbnRyb2xsZXIsXG4gICAgUGxheWVyVHlwZSxcbiAgICBBbGdvcml0aG0sXG4gICAgR2FtZUNvbnN0cnVjdG9yT3B0aW9ucyxcbiAgICBHYW1lQ29uc3RydWN0b3IsXG59IGZyb20gXCIuL2Jhc2UvY29udHJvbGxlci5qc1wiO1xuZXhwb3J0IHR5cGUge1xuICAgIGRlZmF1bHQgYXMgQm9hcmQsXG4gICAgUG9zaXRpb24sXG4gICAgR3JpZExpbmVzLFxufSBmcm9tIFwiLi9iYXNlL2JvYXJkLmpzXCI7XG5cbmV4cG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBCaXRCb2FyZCB9IGZyb20gXCIuL2JpdEJvYXJkL2JpdEJvYXJkLmpzXCI7XG5leHBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgSW50Qml0Qm9hcmQgfSBmcm9tIFwiLi9iaXRCb2FyZC9pbnRCaXRCb2FyZC5qc1wiO1xuZXhwb3J0IHR5cGUgeyBkZWZhdWx0IGFzIExvbmdJbnQgfSBmcm9tIFwiLi9iaXRCb2FyZC9sb25nSW50LmpzXCI7XG5leHBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgTG9uZ0ludEJpdEJvYXJkIH0gZnJvbSBcIi4vYml0Qm9hcmQvbG9uZ0ludEJpdEJvYXJkLmpzXCI7XG4iXX0=
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sSUFBSSxtQkFBbUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR2pGLE9BQU8sRUFBRSxPQUFPLElBQUksa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGRlZmF1bHQgYXMgVGljVGFjVG9lQ29udHJvbGxlciB9IGZyb20gXCIuL2dhbWVzL3RpY3RhY3RvZS9jb250cm9sbGVyLmpzXCI7XG5leHBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgVGljVGFjVG9lQm9hcmQgfSBmcm9tIFwiLi9nYW1lcy90aWN0YWN0b2UvYm9hcmQuanNcIjtcblxuZXhwb3J0IHsgZGVmYXVsdCBhcyBDb25uZWN0NENvbnRyb2xsZXIgfSBmcm9tIFwiLi9nYW1lcy9jb25uZWN0NC9jb250cm9sbGVyLmpzXCI7XG5leHBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgQ29ubmVjdDRCb2FyZCB9IGZyb20gXCIuL2dhbWVzL2Nvbm5lY3Q0L2JvYXJkLmpzXCI7XG5cbmV4cG9ydCB0eXBlIHtcbiAgICBkZWZhdWx0IGFzIENvbnRyb2xsZXIsXG4gICAgUGxheWVyVHlwZSxcbiAgICBHYW1lQ29uc3RydWN0b3JPcHRpb25zLFxuICAgIEdhbWVDb25zdHJ1Y3Rvcixcbn0gZnJvbSBcIi4vYmFzZS9jb250cm9sbGVyLmpzXCI7XG5leHBvcnQgdHlwZSB7XG4gICAgZGVmYXVsdCBhcyBCb2FyZCxcbiAgICBQb3NpdGlvbixcbiAgICBHcmlkTGluZXMsXG59IGZyb20gXCIuL2Jhc2UvYm9hcmQuanNcIjtcblxuZXhwb3J0IHR5cGUgeyBkZWZhdWx0IGFzIEJpdEJvYXJkIH0gZnJvbSBcIi4vYml0Qm9hcmQvYml0Qm9hcmQuanNcIjtcbmV4cG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBJbnRCaXRCb2FyZCB9IGZyb20gXCIuL2JpdEJvYXJkL2ludEJpdEJvYXJkLmpzXCI7XG5leHBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgTG9uZ0ludCB9IGZyb20gXCIuL2JpdEJvYXJkL2xvbmdJbnQuanNcIjtcbmV4cG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBMb25nSW50Qml0Qm9hcmQgfSBmcm9tIFwiLi9iaXRCb2FyZC9sb25nSW50Qml0Qm9hcmQuanNcIjtcbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oathompsonjones/mini-games",
3
- "version": "1.0.14",
3
+ "version": "1.0.16",
4
4
  "description": "A selection of MiniGames. You will soon be able to play these games on [my website](https://oathompsonjones.co.uk/arcade).",
5
5
  "repository": {
6
6
  "url": "https://github.com/oathompsonjones/MiniGames.git"