@oathompsonjones/mini-games 1.0.13 → 1.0.14
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.
- package/build/base/controller.d.ts +13 -19
- package/build/base/controller.js +4 -11
- package/build/games/connect4/controller.d.ts +4 -7
- package/build/games/connect4/controller.js +5 -9
- package/build/games/tictactoe/controller.d.ts +4 -6
- package/build/games/tictactoe/controller.js +3 -7
- package/package.json +1 -1
|
@@ -4,36 +4,31 @@ import type LongInt from "../bitBoard/longInt.js";
|
|
|
4
4
|
import type { Position } from "./board.js";
|
|
5
5
|
export type PlayerType = "easyCPU" | "hardCPU" | "human" | "impossibleCPU" | "mediumCPU";
|
|
6
6
|
export type Algorithm = "alphabeta" | "minimax";
|
|
7
|
-
export type GameConstructorOptions<T
|
|
8
|
-
id: T;
|
|
7
|
+
export type GameConstructorOptions<T extends Board<LongInt | number>> = {
|
|
9
8
|
onEnd?: (winner: number | null) => Promise<void> | void;
|
|
10
9
|
onInvalidInput?: (position: Position) => Promise<void> | void;
|
|
11
|
-
renderer?: (controller: Controller<T
|
|
10
|
+
renderer?: (controller: Controller<T>) => Promise<void> | void;
|
|
12
11
|
};
|
|
13
|
-
export type GameConstructor<T
|
|
14
|
-
new (playerOneType: PlayerType, playerTwoType: PlayerType, options
|
|
12
|
+
export type GameConstructor<T extends Board<LongInt | number>> = {
|
|
13
|
+
new (playerOneType: PlayerType, playerTwoType: PlayerType, options?: GameConstructorOptions<T>): Controller<T>;
|
|
15
14
|
};
|
|
16
15
|
/**
|
|
17
16
|
* Decorator to check that the constructor type for the given class is correct.
|
|
18
|
-
* @template T - The type of
|
|
19
|
-
* @template U - The type of the board values.
|
|
17
|
+
* @template T - The type of board.
|
|
20
18
|
* @param constructor - The class to check.
|
|
21
19
|
*/
|
|
22
|
-
export declare function Game<T
|
|
20
|
+
export declare function Game<T extends Board<LongInt | number>>(constructor: GameConstructor<T>): void;
|
|
23
21
|
/**
|
|
24
22
|
* Represents a game controller.
|
|
25
|
-
* @template T - The type of
|
|
26
|
-
* @template U - The type of the board values.
|
|
23
|
+
* @template T - The type of board.
|
|
27
24
|
*/
|
|
28
|
-
export default abstract class Controller<T
|
|
29
|
-
end: GameConstructorOptions<T
|
|
30
|
-
input: GameConstructorOptions<T
|
|
31
|
-
invalidInput: GameConstructorOptions<T
|
|
25
|
+
export default abstract class Controller<T extends Board<LongInt | number>> extends EventEmitter<{
|
|
26
|
+
end: GameConstructorOptions<T>["onEnd"];
|
|
27
|
+
input: GameConstructorOptions<T>["onInvalidInput"];
|
|
28
|
+
invalidInput: GameConstructorOptions<T>["onInvalidInput"];
|
|
32
29
|
}> {
|
|
33
|
-
/** Contains the ID of the game. */
|
|
34
|
-
readonly gameID: T;
|
|
35
30
|
/** Contains the board. */
|
|
36
|
-
readonly board:
|
|
31
|
+
readonly board: T;
|
|
37
32
|
/** Contains the view object. */
|
|
38
33
|
readonly render: () => Promise<void> | void;
|
|
39
34
|
/** Contains the player objects. */
|
|
@@ -48,11 +43,10 @@ export default abstract class Controller<T, U extends LongInt | number> extends
|
|
|
48
43
|
* @param playerTypes - The types of player for the game.
|
|
49
44
|
* @param board - The board object.
|
|
50
45
|
* @param render - The render function.
|
|
51
|
-
* @param gameID - The ID of the game instance.
|
|
52
46
|
* @param onEnd - The function to call when the game ends.
|
|
53
47
|
* @param onInvalidInput - The function to call when the input is invalid.
|
|
54
48
|
*/
|
|
55
|
-
protected constructor(playerTypes: PlayerType[], board:
|
|
49
|
+
protected constructor(playerTypes: PlayerType[], board: T, render: Required<GameConstructorOptions<T>>["renderer"], onEnd?: GameConstructorOptions<T>["onEnd"], onInvalidInput?: GameConstructorOptions<T>["onInvalidInput"]);
|
|
56
50
|
/**
|
|
57
51
|
* Gets the current player object.
|
|
58
52
|
* @returns The current player object.
|
package/build/base/controller.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { EventEmitter } from "eventemitter3";
|
|
2
2
|
/**
|
|
3
3
|
* Decorator to check that the constructor type for the given class is correct.
|
|
4
|
-
* @template T - The type of
|
|
5
|
-
* @template U - The type of the board values.
|
|
4
|
+
* @template T - The type of board.
|
|
6
5
|
* @param constructor - The class to check.
|
|
7
6
|
*/
|
|
8
7
|
export function Game(constructor) {
|
|
@@ -10,12 +9,9 @@ export function Game(constructor) {
|
|
|
10
9
|
}
|
|
11
10
|
/**
|
|
12
11
|
* Represents a game controller.
|
|
13
|
-
* @template T - The type of
|
|
14
|
-
* @template U - The type of the board values.
|
|
12
|
+
* @template T - The type of board.
|
|
15
13
|
*/
|
|
16
14
|
export default class Controller extends EventEmitter {
|
|
17
|
-
/** Contains the ID of the game. */
|
|
18
|
-
gameID;
|
|
19
15
|
/** Contains the board. */
|
|
20
16
|
board;
|
|
21
17
|
/** Contains the view object. */
|
|
@@ -29,14 +25,11 @@ export default class Controller extends EventEmitter {
|
|
|
29
25
|
* @param playerTypes - The types of player for the game.
|
|
30
26
|
* @param board - The board object.
|
|
31
27
|
* @param render - The render function.
|
|
32
|
-
* @param gameID - The ID of the game instance.
|
|
33
28
|
* @param onEnd - The function to call when the game ends.
|
|
34
29
|
* @param onInvalidInput - The function to call when the input is invalid.
|
|
35
30
|
*/
|
|
36
|
-
|
|
37
|
-
constructor(playerTypes, board, render, gameID, onEnd, onInvalidInput) {
|
|
31
|
+
constructor(playerTypes, board, render, onEnd, onInvalidInput) {
|
|
38
32
|
super();
|
|
39
|
-
this.gameID = gameID;
|
|
40
33
|
this.board = board;
|
|
41
34
|
this.players = playerTypes.map((playerType, id) => ({ id, playerType }));
|
|
42
35
|
this.render = render.bind(null, this);
|
|
@@ -178,4 +171,4 @@ export default class Controller extends EventEmitter {
|
|
|
178
171
|
this.nextTurn();
|
|
179
172
|
}
|
|
180
173
|
}
|
|
181
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iYXNlL2NvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQWdCN0M7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsSUFBSSxDQUFnQyxXQUFrQztJQUNsRixLQUFLLFdBQVcsQ0FBQztBQUNyQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQWdCLFVBQTBDLFNBQVEsWUFJOUU7SUFDRSxtQ0FBbUM7SUFDbkIsTUFBTSxDQUFJO0lBRTFCLDBCQUEwQjtJQUNWLEtBQUssQ0FBVztJQUVoQyxnQ0FBZ0M7SUFDaEIsTUFBTSxDQUE2QjtJQUVuRCxtQ0FBbUM7SUFDaEIsT0FBTyxDQUFpRDtJQUUzRSw2Q0FBNkM7SUFDckMsZUFBZSxHQUFXLENBQUMsQ0FBQztJQUVwQzs7Ozs7Ozs7T0FRRztJQUNILHlEQUF5RDtJQUN6RCxZQUNJLFdBQXlCLEVBQ3pCLEtBQWUsRUFDZixNQUEwRCxFQUMxRCxNQUFTLEVBQ1QsS0FBNkMsRUFDN0MsY0FBK0Q7UUFFL0QsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXRDLElBQUksS0FBSyxLQUFLLFNBQVM7WUFDbkIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVB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Q0FBQztRQUU5QixJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV6QixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNwQixDQUFDO0NBdUJKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgQm9hcmQgZnJvbSBcIi4vYm9hcmQuanNcIjtcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJldmVudGVtaXR0ZXIzXCI7XG5pbXBvcnQgdHlwZSBMb25nSW50IGZyb20gXCIuLi9iaXRCb2FyZC9sb25nSW50LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4vYm9hcmQuanNcIjtcblxuZXhwb3J0IHR5cGUgUGxheWVyVHlwZSA9IFwiZWFzeUNQVVwiIHwgXCJoYXJkQ1BVXCIgfCBcImh1bWFuXCIgfCBcImltcG9zc2libGVDUFVcIiB8IFwibWVkaXVtQ1BVXCI7XG5leHBvcnQgdHlwZSBBbGdvcml0aG0gPSBcImFscGhhYmV0YVwiIHwgXCJtaW5pbWF4XCI7XG5leHBvcnQgdHlwZSBHYW1lQ29uc3RydWN0b3JPcHRpb25zPFQsIFUgZXh0ZW5kcyBMb25nSW50IHwgbnVtYmVyPiA9IHtcbiAgICBpZDogVDtcbiAgICBvbkVuZD86ICh3aW5uZXI6IG51bWJlciB8IG51bGwpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICAgIG9uSW52YWxpZElucHV0PzogKHBvc2l0aW9uOiBQb3NpdGlvbikgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG4gICAgcmVuZGVyZXI/OiAoY29udHJvbGxlcjogQ29udHJvbGxlcjxULCBVPikgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG59O1xuZXhwb3J0IHR5cGUgR2FtZUNvbnN0cnVjdG9yPFQsIFUgZXh0ZW5kcyBMb25nSW50IHwgbnVtYmVyPiA9IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1mdW5jdGlvbi10eXBlXG4gICAgbmV3KHBsYXllck9uZVR5cGU6IFBsYXllclR5cGUsIHBsYXllclR3b1R5cGU6IFBsYXllclR5cGUsIG9wdGlvbnM6IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnM8VCwgVT4pOiBDb250cm9sbGVyPFQsIFU+O1xufTtcbi8qKlxuICogRGVjb3JhdG9yIHRvIGNoZWNrIHRoYXQgdGhlIGNvbnN0cnVjdG9yIHR5cGUgZm9yIHRoZSBnaXZlbiBjbGFzcyBpcyBjb3JyZWN0LlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgZ2FtZSBJRC5cbiAqIEB0ZW1wbGF0ZSBVIC0gVGhlIHR5cGUgb2YgdGhlIGJvYXJkIHZhbHVlcy5cbiAqIEBwYXJhbSBjb25zdHJ1Y3RvciAtIFRoZSBjbGFzcyB0byBjaGVjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEdhbWU8VCwgVSBleHRlbmRzIExvbmdJbnQgfCBudW1iZXI+KGNvbnN0cnVjdG9yOiBHYW1lQ29uc3RydWN0b3I8VCwgVT4pOiB2b2lkIHtcbiAgICB2b2lkIGNvbnN0cnVjdG9yO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBnYW1lIGNvbnRyb2xsZXIuXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIHRoZSBnYW1lIElELlxuICogQHRlbXBsYXRlIFUgLSBUaGUgdHlwZSBvZiB0aGUgYm9hcmQgdmFsdWVzLlxuICovXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBDb250cm9sbGVyPFQsIFUgZXh0ZW5kcyBMb25nSW50IHwgbnVtYmVyPiBleHRlbmRzIEV2ZW50RW1pdHRlcjx7XG4gICAgZW5kOiBHYW1lQ29uc3RydWN0b3JPcHRpb25zPFQsIFU+W1wib25FbmRcIl07XG4gICAgaW5wdXQ6IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnM8VCwgVT5bXCJvbkludmFsaWRJbnB1dFwiXTtcbiAgICBpbnZhbGlkSW5wdXQ6IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnM8VCwgVT5bXCJvbkludmFsaWRJbnB1dFwiXTtcbn0+IHtcbiAgICAvKiogQ29udGFpbnMgdGhlIElEIG9mIHRoZSBnYW1lLiAqL1xuICAgIHB1YmxpYyByZWFkb25seSBnYW1lSUQ6IFQ7XG5cbiAgICAvKiogQ29udGFpbnMgdGhlIGJvYXJkLiAqL1xuICAgIHB1YmxpYyByZWFkb25seSBib2FyZDogQm9hcmQ8VT47XG5cbiAgICAvKiogQ29udGFpbnMgdGhlIHZpZXcgb2JqZWN0LiAqL1xuICAgIHB1YmxpYyByZWFkb25seSByZW5kZXI6ICgpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG4gICAgLyoqIENvbnRhaW5zIHRoZSBwbGF5ZXIgb2JqZWN0cy4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGxheWVyczogQXJyYXk8eyBpZDogbnVtYmVyOyBwbGF5ZXJUeXBlOiBQbGF5ZXJUeXBlOyB9PjtcblxuICAgIC8qKiBDb250YWlucyB0aGUgSUQgb2YgdGhlIGN1cnJlbnQgcGxheWVyLiAqL1xuICAgIHByaXZhdGUgY3VycmVudFBsYXllcklkOiBudW1iZXIgPSAwO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDb250cm9sbGVyLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJUeXBlcyAtIFRoZSB0eXBlcyBvZiBwbGF5ZXIgZm9yIHRoZSBnYW1lLlxuICAgICAqIEBwYXJhbSBib2FyZCAtIFRoZSBib2FyZCBvYmplY3QuXG4gICAgICogQHBhcmFtIHJlbmRlciAtIFRoZSByZW5kZXIgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIGdhbWVJRCAtIFRoZSBJRCBvZiB0aGUgZ2FtZSBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gb25FbmQgLSBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBnYW1lIGVuZHMuXG4gICAgICogQHBhcmFtIG9uSW52YWxpZElucHV0IC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgaW5wdXQgaXMgaW52YWxpZC5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21heC1wYXJhbXNcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgICAgIHBsYXllclR5cGVzOiBQbGF5ZXJUeXBlW10sXG4gICAgICAgIGJvYXJkOiBCb2FyZDxVPixcbiAgICAgICAgcmVuZGVyOiBSZXF1aXJlZDxHYW1lQ29uc3RydWN0b3JPcHRpb25zPFQsIFU+PltcInJlbmRlcmVyXCJdLFxuICAgICAgICBnYW1lSUQ6IFQsXG4gICAgICAgIG9uRW5kPzogR2FtZUNvbnN0cnVjdG9yT3B0aW9uczxULCBVPltcIm9uRW5kXCJdLFxuICAgICAgICBvbkludmFsaWRJbnB1dD86IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnM8VCwgVT5bXCJvbkludmFsaWRJbnB1dFwiXSxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5nYW1lSUQgPSBnYW1lSUQ7XG4gICAgICAgIHRoaXMuYm9hcmQgPSBib2FyZDtcbiAgICAgICAgdGhpcy5wbGF5ZXJzID0gcGxheWVyVHlwZXMubWFwKChwbGF5ZXJUeXBlLCBpZCkgPT4gKHsgaWQsIHBsYXllclR5cGUgfSkpO1xuICAgICAgICB0aGlzLnJlbmRlciA9IHJlbmRlci5iaW5kKG51bGwsIHRoaXMpO1xuXG4gICAgICAgIGlmIChvbkVuZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5vbihcImVuZFwiLCBvbkVuZCBhcyAoKSA9PiB2b2lkKTtcblxuICAgICAgICBpZiAob25JbnZhbGlkSW5wdXQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRoaXMub24oXCJpbnZhbGlkSW5wdXRcIiwgb25JbnZhbGlkSW5wdXQgYXMgKCkgPT4gdm9pZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY3VycmVudCBwbGF5ZXIgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHBsYXllciBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIGdldCBjdXJyZW50UGxheWVyKCk6IHsgaWQ6IG51bWJlcjsgcGxheWVyVHlwZTogUGxheWVyVHlwZTsgfSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllcnNbdGhpcy5jdXJyZW50UGxheWVySWRdITtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9scyB0aGUgbWFpbiBnYW1lIGZsb3cuXG4gICAgICogQHBhcmFtIGFsZ29yaXRobSAtIFRoZSBhbGdvcml0aG0gdG8gdXNlLlxuICAgICAqIEByZXR1cm5zIFRoZSB3aW5uZXIgb3IgbnVsbCBpbiB0aGUgZXZlbnQgb2YgYSB0aWUuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXkoYWxnb3JpdGhtOiBBbGdvcml0aG0gPSBcImFscGhhYmV0YVwiKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVuZGVyKCk7XG4gICAgICAgIHRoaXMub24oXCJpbnB1dFwiLCAoYXN5bmMgKG1vdmU6IFBvc2l0aW9uKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1ha2VNb3ZlKG1vdmUpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50UGxheWVyLnBsYXllclR5cGUgIT09IFwiaHVtYW5cIilcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1ha2VNb3ZlKGFsZ29yaXRobSk7XG4gICAgICAgIH0pIGFzIChtb3ZlOiBQb3NpdGlvbikgPT4gdm9pZCk7XG5cbiAgICAgICAgd2hpbGUgKHRoaXMuY3VycmVudFBsYXllci5wbGF5ZXJUeXBlICE9PSBcImh1bWFuXCIgJiYgdGhpcy5ib2FyZC53aW5uZXIgPT09IGZhbHNlKVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWFrZU1vdmUoYWxnb3JpdGhtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYm9nIHN0YW5kYXJkIG1pbmltYXggYWxnb3JpdGhtLiBMZWZ0IGluIGZvciByZWZlcmVuY2UgKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01pbmltYXgpLlxuICAgICAqIEBwYXJhbSBkZXB0aCAtIFRoZSBkZXB0aCBvZiB0aGUgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBtYXhpbWlzaW5nUGxheWVyIC0gV2hldGhlciBvciBub3QgdGhlIGN1cnJlbnQgcGxheWVyIGlzIHRoZSBtYXhpbWlzaW5nIHBsYXllci5cbiAgICAgKiBAcmV0dXJucyBUaGUgb3B0aW1hbCBtb3ZlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBtaW5pbWF4KGRlcHRoOiBudW1iZXIgPSBJbmZpbml0eSwgbWF4aW1pc2luZ1BsYXllcjogYm9vbGVhbiA9IHRydWUpOiB7IG1vdmU6IFBvc2l0aW9uOyBzY29yZTogbnVtYmVyOyB9IHtcbiAgICAgICAgY29uc3QgcGxheWVySWRzID0gWyh0aGlzLmN1cnJlbnRQbGF5ZXJJZCArIDEpICUgMiwgdGhpcy5jdXJyZW50UGxheWVySWRdIGFzIGNvbnN0O1xuXG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCB8fCB0aGlzLmJvYXJkLndpbm5lciAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgICAgIHNjb3JlOiB0aGlzLmJvYXJkLmhldXJpc3RpYyAqICh0aGlzLmN1cnJlbnRQbGF5ZXJJZCA9PT0gMCA/IDEgOiAtMSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJlc3RNb3ZlOiBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLm1pbmltYXg+ID0ge1xuICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgc2NvcmU6IG1heGltaXNpbmdQbGF5ZXIgPyAtSW5maW5pdHkgOiBJbmZpbml0eSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgeyBlbXB0eUNlbGxzIH0gPSB0aGlzLmJvYXJkO1xuXG4gICAgICAgIGZvciAoY29uc3QgbW92ZSBvZiBlbXB0eUNlbGxzKSB7XG4gICAgICAgICAgICB0aGlzLmJvYXJkLm1ha2VNb3ZlKG1vdmUsIHBsYXllcklkc1tOdW1iZXIobWF4aW1pc2luZ1BsYXllcildISk7XG4gICAgICAgICAgICBjb25zdCBzY29yZSA9ICg5IC0gZW1wdHlDZWxscy5sZW5ndGgpICogdGhpcy5taW5pbWF4KGRlcHRoIC0gMSwgIW1heGltaXNpbmdQbGF5ZXIpLnNjb3JlO1xuXG4gICAgICAgICAgICB0aGlzLmJvYXJkLnVuZG9MYXN0TW92ZSgpO1xuXG4gICAgICAgICAgICBpZiAobWF4aW1pc2luZ1BsYXllcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJlc3RTY29yZSA9IE1hdGgubWF4KHNjb3JlLCBiZXN0TW92ZS5zY29yZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYmVzdFNjb3JlICE9PSBiZXN0TW92ZS5zY29yZSlcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1vdmUgPSB7IG1vdmUsIHNjb3JlIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJlc3RTY29yZSA9IE1hdGgubWluKHNjb3JlLCBiZXN0TW92ZS5zY29yZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYmVzdFNjb3JlICE9PSBiZXN0TW92ZS5zY29yZSlcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1vdmUgPSB7IG1vdmUsIHNjb3JlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYmVzdE1vdmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG1pbmltYXggYWxnb3JpdGhtIHdpdGggYWxwaGEtYmV0YSBwcnVuaW5nIChodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NaW5pbWF4KS5cbiAgICAgKiBAcGFyYW0gZGVwdGggLSBUaGUgZGVwdGggb2YgdGhlIGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gYWxwaGEgLSBUaGUgYm91bmRzIGZvciB0aGUgYWxwaGEtYmV0YSB2YXJpYXRpb24gb2YgdGhlIGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gYmV0YSAtIFRoZSBib3VuZHMgZm9yIHRoZSBhbHBoYS1iZXRhIHZhcmlhdGlvbiBvZiB0aGUgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBtYXhpbWlzaW5nUGxheWVyIC0gV2hldGhlciBvciBub3QgdGhlIGN1cnJlbnQgcGxheWVyIGlzIHRoZSBtYXhpbWlzaW5nIHBsYXllci5cbiAgICAgKiBAcmV0dXJucyBUaGUgb3B0aW1hbCBtb3ZlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhbHBoYWJldGEoXG4gICAgICAgIGRlcHRoOiBudW1iZXIgPSBJbmZpbml0eSxcbiAgICAgICAgYWxwaGE6IG51bWJlciA9IC1JbmZpbml0eSxcbiAgICAgICAgYmV0YTogbnVtYmVyID0gSW5maW5pdHksXG4gICAgICAgIG1heGltaXNpbmdQbGF5ZXI6IGJvb2xlYW4gPSB0cnVlLFxuICAgICk6IHsgbW92ZTogUG9zaXRpb247IHNjb3JlOiBudW1iZXI7IH0ge1xuICAgICAgICBjb25zdCBwbGF5ZXJJZHMgPSBbKHRoaXMuY3VycmVudFBsYXllcklkICsgMSkgJSAyLCB0aGlzLmN1cnJlbnRQbGF5ZXJJZF0gYXMgY29uc3Q7XG5cbiAgICAgICAgaWYgKGRlcHRoID09PSAwIHx8IHRoaXMuYm9hcmQud2lubmVyICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBtb3ZlOiB7IHg6IE5hTiwgeTogTmFOIH0sXG4gICAgICAgICAgICAgICAgc2NvcmU6IHRoaXMuYm9hcmQuaGV1cmlzdGljICogKHRoaXMuY3VycmVudFBsYXllcklkID09PSAwID8gMSA6IC0xKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYmVzdE1vdmU6IFJldHVyblR5cGU8dHlwZW9mIHRoaXMuYWxwaGFiZXRhPiA9IHtcbiAgICAgICAgICAgIG1vdmU6IHsgeDogTmFOLCB5OiBOYU4gfSxcbiAgICAgICAgICAgIHNjb3JlOiBtYXhpbWlzaW5nUGxheWVyID8gLUluZmluaXR5IDogSW5maW5pdHksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHsgZW1wdHlDZWxscyB9ID0gdGhpcy5ib2FyZDtcblxuICAgICAgICBmb3IgKGNvbnN0IG1vdmUgb2YgZW1wdHlDZWxscykge1xuICAgICAgICAgICAgdGhpcy5ib2FyZC5tYWtlTW92ZShtb3ZlLCBwbGF5ZXJJZHNbTnVtYmVyKG1heGltaXNpbmdQbGF5ZXIpXSEpO1xuICAgICAgICAgICAgY29uc3Qgc2NvcmUgPSAoOSAtIGVtcHR5Q2VsbHMubGVuZ3RoKSAqIHRoaXMuYWxwaGFiZXRhKGRlcHRoIC0gMSwgYWxwaGEsIGJldGEsICFtYXhpbWlzaW5nUGxheWVyKS5zY29yZTtcblxuICAgICAgICAgICAgdGhpcy5ib2FyZC51bmRvTGFzdE1vdmUoKTtcblxuICAgICAgICAgICAgaWYgKG1heGltaXNpbmdQbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiZXN0U2NvcmUgPSBNYXRoLm1heChzY29yZSwgYmVzdE1vdmUuc2NvcmUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJlc3RTY29yZSAhPT0gYmVzdE1vdmUuc2NvcmUpXG4gICAgICAgICAgICAgICAgICAgIGJlc3RNb3ZlID0geyBtb3ZlLCBzY29yZSB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKGJlc3RNb3ZlLnNjb3JlID4gYmV0YSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBhbHBoYSA9IE1hdGgubWF4KGFscGhhLCBiZXN0U2NvcmUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiZXN0U2NvcmUgPSBNYXRoLm1pbihzY29yZSwgYmVzdE1vdmUuc2NvcmUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJlc3RTY29yZSAhPT0gYmVzdE1vdmUuc2NvcmUpXG4gICAgICAgICAgICAgICAgICAgIGJlc3RNb3ZlID0geyBtb3ZlLCBzY29yZSB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKGJlc3RNb3ZlLnNjb3JlIDwgYWxwaGEpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgYmV0YSA9IE1hdGgubWluKGJldGEsIGJlc3RTY29yZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYmVzdE1vdmU7XG4gICAgfVxuXG4gICAgLyoqIENoYW5nZXMgd2hpY2ggcGxheWVyJ3MgdHVybiBpdCBpcy4gKi9cbiAgICBwcml2YXRlIG5leHRUdXJuKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmN1cnJlbnRQbGF5ZXJJZCA9ICh0aGlzLmN1cnJlbnRQbGF5ZXJJZCArIDEpICUgdGhpcy5wbGF5ZXJzLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYWtlcyBhIG1vdmUuXG4gICAgICogQHBhcmFtIGlucHV0IC0gRWl0aGVyIHRoZSBhbGdvcml0aG0gdG8gdXNlIHRvIGNhbGN1bGF0ZSB0aGUgbW92ZSBvciB0aGUgbW92ZSBpdHNlbGYuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBtYWtlTW92ZShpbnB1dDogQWxnb3JpdGhtIHwgUG9zaXRpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhpcy5ib2FyZC5tYWtlTW92ZSh0aGlzLmRldGVybWluZUNQVU1vdmUodGhpcy5jdXJyZW50UGxheWVyLnBsYXllclR5cGUsIGlucHV0KSwgdGhpcy5jdXJyZW50UGxheWVyLmlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRQbGF5ZXIucGxheWVyVHlwZSAhPT0gXCJodW1hblwiIHx8ICF0aGlzLmJvYXJkLm1vdmVJc1ZhbGlkKGlucHV0KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcImludmFsaWRJbnB1dFwiLCBpbnB1dCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYm9hcmQubWFrZU1vdmUoaW5wdXQsIHRoaXMuY3VycmVudFBsYXllci5pZCk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLnJlbmRlcigpO1xuICAgICAgICBjb25zdCB7IHdpbm5lciB9ID0gdGhpcy5ib2FyZDtcblxuICAgICAgICBpZiAod2lubmVyICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwiZW5kXCIsIHdpbm5lcik7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubmV4dFR1cm4oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIHRoZSBDUFUgbW92ZS5cbiAgICAgKiBAcGFyYW0gZGlmZmljdWx0eSAtIFRoZSBkaWZmaWN1bHR5IG9mIHRoZSBBSS5cbiAgICAgKiBAcGFyYW0gYWxnb3JpdGhtIC0gVGhlIGFsZ29yaXRobSB0byB1c2UuXG4gICAgICogQHJldHVybnMgVGhlIG1vdmUuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGRldGVybWluZUNQVU1vdmUoZGlmZmljdWx0eTogT21pdDxQbGF5ZXJUeXBlLCBcImh1bWFuXCI+LCBhbGdvcml0aG0/OiBBbGdvcml0aG0pOiBQb3NpdGlvbjtcblxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBvcHRpbWFsIG1vdmUuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyB0byB1c2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMuYWxnb3JpdGhtIC0gVGhlIGFsZ29yaXRobSB0byB1c2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMubWF4RGVwdGggLSBUaGUgbWF4aW11bSBkZXB0aCB0byBzZWFyY2guXG4gICAgICogQHBhcmFtIG9wdGlvbnMucmFuZG9tTW92ZSAtIEEgcmFuZG9tIG1vdmUgdG8gbWFrZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgb3B0aW1hbCBtb3ZlIHRvIG1ha2UuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGZpbmRPcHRpbWFsTW92ZShvcHRpb25zPzoge1xuICAgICAgICBhbGdvcml0aG0/OiBBbGdvcml0aG07XG4gICAgICAgIG1heERlcHRoPzogbnVtYmVyO1xuICAgICAgICByYW5kb21Nb3ZlPzogUG9zaXRpb247XG4gICAgfSk6IFBvc2l0aW9uO1xufVxuIl19
|
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iYXNlL2NvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQWU3Qzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLElBQUksQ0FBb0MsV0FBK0I7SUFDbkYsS0FBSyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQWdCLFVBQThDLFNBQVEsWUFJbEY7SUFDRSwwQkFBMEI7SUFDVixLQUFLLENBQUk7SUFFekIsZ0NBQWdDO0lBQ2hCLE1BQU0sQ0FBNkI7SUFFbkQsbUNBQW1DO0lBQ2hCLE9BQU8sQ0FBaUQ7SUFFM0UsNkNBQTZDO0lBQ3JDLGVBQWUsR0FBVyxDQUFDLENBQUM7SUFFcEM7Ozs7Ozs7T0FPRztJQUVILFlBQ0ksV0FBeUIsRUFDekIsS0FBUSxFQUNSLE1BQXVELEVBQ3ZELEtBQTBDLEVBQzFDLGNBQTREO1FBRTVELEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV0QyxJQUFJLEtBQUssS0FBSyxTQUFTO1lBQ25CLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQW1CLENBQUMsQ0FBQztRQUV4QyxJQUFJLGNBQWMsS0FBSyxTQUFTO1lBQzVCLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLGNBQTRCLENBQUMs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WUFFekIsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEIsQ0FBQztDQXVCSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIEJvYXJkIGZyb20gXCIuL2JvYXJkLmpzXCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRlbWl0dGVyM1wiO1xuaW1wb3J0IHR5cGUgTG9uZ0ludCBmcm9tIFwiLi4vYml0Qm9hcmQvbG9uZ0ludC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQb3NpdGlvbiB9IGZyb20gXCIuL2JvYXJkLmpzXCI7XG5cbmV4cG9ydCB0eXBlIFBsYXllclR5cGUgPSBcImVhc3lDUFVcIiB8IFwiaGFyZENQVVwiIHwgXCJodW1hblwiIHwgXCJpbXBvc3NpYmxlQ1BVXCIgfCBcIm1lZGl1bUNQVVwiO1xuZXhwb3J0IHR5cGUgQWxnb3JpdGhtID0gXCJhbHBoYWJldGFcIiB8IFwibWluaW1heFwiO1xuZXhwb3J0IHR5cGUgR2FtZUNvbnN0cnVjdG9yT3B0aW9uczxUIGV4dGVuZHMgQm9hcmQ8TG9uZ0ludCB8IG51bWJlcj4+ID0ge1xuICAgIG9uRW5kPzogKHdpbm5lcjogbnVtYmVyIHwgbnVsbCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG4gICAgb25JbnZhbGlkSW5wdXQ/OiAocG9zaXRpb246IFBvc2l0aW9uKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbiAgICByZW5kZXJlcj86IChjb250cm9sbGVyOiBDb250cm9sbGVyPFQ+KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbn07XG5leHBvcnQgdHlwZSBHYW1lQ29uc3RydWN0b3I8VCBleHRlbmRzIEJvYXJkPExvbmdJbnQgfCBudW1iZXI+PiA9IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1mdW5jdGlvbi10eXBlXG4gICAgbmV3KHBsYXllck9uZVR5cGU6IFBsYXllclR5cGUsIHBsYXllclR3b1R5cGU6IFBsYXllclR5cGUsIG9wdGlvbnM/OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zPFQ+KTogQ29udHJvbGxlcjxUPjtcbn07XG4vKipcbiAqIERlY29yYXRvciB0byBjaGVjayB0aGF0IHRoZSBjb25zdHJ1Y3RvciB0eXBlIGZvciB0aGUgZ2l2ZW4gY2xhc3MgaXMgY29ycmVjdC5cbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgYm9hcmQuXG4gKiBAcGFyYW0gY29uc3RydWN0b3IgLSBUaGUgY2xhc3MgdG8gY2hlY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHYW1lPFQgZXh0ZW5kcyBCb2FyZDxMb25nSW50IHwgbnVtYmVyPj4oY29uc3RydWN0b3I6IEdhbWVDb25zdHJ1Y3RvcjxUPik6IHZvaWQge1xuICAgIHZvaWQgY29uc3RydWN0b3I7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGdhbWUgY29udHJvbGxlci5cbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgYm9hcmQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGFic3RyYWN0IGNsYXNzIENvbnRyb2xsZXI8VCBleHRlbmRzIEJvYXJkPExvbmdJbnQgfCBudW1iZXI+PiBleHRlbmRzIEV2ZW50RW1pdHRlcjx7XG4gICAgZW5kOiBHYW1lQ29uc3RydWN0b3JPcHRpb25zPFQ+W1wib25FbmRcIl07XG4gICAgaW5wdXQ6IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnM8VD5bXCJvbkludmFsaWRJbnB1dFwiXTtcbiAgICBpbnZhbGlkSW5wdXQ6IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnM8VD5bXCJvbkludmFsaWRJbnB1dFwiXTtcbn0+IHtcbiAgICAvKiogQ29udGFpbnMgdGhlIGJvYXJkLiAqL1xuICAgIHB1YmxpYyByZWFkb25seSBib2FyZDogVDtcblxuICAgIC8qKiBDb250YWlucyB0aGUgdmlldyBvYmplY3QuICovXG4gICAgcHVibGljIHJlYWRvbmx5IHJlbmRlcjogKCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbiAgICAvKiogQ29udGFpbnMgdGhlIHBsYXllciBvYmplY3RzLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBwbGF5ZXJzOiBBcnJheTx7IGlkOiBudW1iZXI7IHBsYXllclR5cGU6IFBsYXllclR5cGU7IH0+O1xuXG4gICAgLyoqIENvbnRhaW5zIHRoZSBJRCBvZiB0aGUgY3VycmVudCBwbGF5ZXIuICovXG4gICAgcHJpdmF0ZSBjdXJyZW50UGxheWVySWQ6IG51bWJlciA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIENvbnRyb2xsZXIuXG4gICAgICogQHBhcmFtIHBsYXllclR5cGVzIC0gVGhlIHR5cGVzIG9mIHBsYXllciBmb3IgdGhlIGdhbWUuXG4gICAgICogQHBhcmFtIGJvYXJkIC0gVGhlIGJvYXJkIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gcmVuZGVyIC0gVGhlIHJlbmRlciBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0gb25FbmQgLSBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBnYW1lIGVuZHMuXG4gICAgICogQHBhcmFtIG9uSW52YWxpZElucHV0IC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgaW5wdXQgaXMgaW52YWxpZC5cbiAgICAgKi9cblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICAgICAgcGxheWVyVHlwZXM6IFBsYXllclR5cGVbXSxcbiAgICAgICAgYm9hcmQ6IFQsXG4gICAgICAgIHJlbmRlcjogUmVxdWlyZWQ8R2FtZUNvbnN0cnVjdG9yT3B0aW9uczxUPj5bXCJyZW5kZXJlclwiXSxcbiAgICAgICAgb25FbmQ/OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zPFQ+W1wib25FbmRcIl0sXG4gICAgICAgIG9uSW52YWxpZElucHV0PzogR2FtZUNvbnN0cnVjdG9yT3B0aW9uczxUPltcIm9uSW52YWxpZElucHV0XCJdLFxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmJvYXJkID0gYm9hcmQ7XG4gICAgICAgIHRoaXMucGxheWVycyA9IHBsYXllclR5cGVzLm1hcCgocGxheWVyVHlwZSwgaWQpID0+ICh7IGlkLCBwbGF5ZXJUeXBlIH0pKTtcbiAgICAgICAgdGhpcy5yZW5kZXIgPSByZW5kZXIuYmluZChudWxsLCB0aGlzKTtcblxuICAgICAgICBpZiAob25FbmQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRoaXMub24oXCJlbmRcIiwgb25FbmQgYXMgKCkgPT4gdm9pZCk7XG5cbiAgICAgICAgaWYgKG9uSW52YWxpZElucHV0ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLm9uKFwiaW52YWxpZElucHV0XCIsIG9uSW52YWxpZElucHV0IGFzICgpID0+IHZvaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnJlbnQgcGxheWVyIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBwbGF5ZXIgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3VycmVudFBsYXllcigpOiB7IGlkOiBudW1iZXI7IHBsYXllclR5cGU6IFBsYXllclR5cGU7IH0ge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5ZXJzW3RoaXMuY3VycmVudFBsYXllcklkXSE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgdGhlIG1haW4gZ2FtZSBmbG93LlxuICAgICAqIEBwYXJhbSBhbGdvcml0aG0gLSBUaGUgYWxnb3JpdGhtIHRvIHVzZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgd2lubmVyIG9yIG51bGwgaW4gdGhlIGV2ZW50IG9mIGEgdGllLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwbGF5KGFsZ29yaXRobTogQWxnb3JpdGhtID0gXCJhbHBoYWJldGFcIik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbmRlcigpO1xuICAgICAgICB0aGlzLm9uKFwiaW5wdXRcIiwgKGFzeW5jIChtb3ZlOiBQb3NpdGlvbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWtlTW92ZShtb3ZlKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFBsYXllci5wbGF5ZXJUeXBlICE9PSBcImh1bWFuXCIpXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWtlTW92ZShhbGdvcml0aG0pO1xuICAgICAgICB9KSBhcyAobW92ZTogUG9zaXRpb24pID0+IHZvaWQpO1xuXG4gICAgICAgIHdoaWxlICh0aGlzLmN1cnJlbnRQbGF5ZXIucGxheWVyVHlwZSAhPT0gXCJodW1hblwiICYmIHRoaXMuYm9hcmQud2lubmVyID09PSBmYWxzZSlcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1ha2VNb3ZlKGFsZ29yaXRobSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJvZyBzdGFuZGFyZCBtaW5pbWF4IGFsZ29yaXRobS4gTGVmdCBpbiBmb3IgcmVmZXJlbmNlIChodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NaW5pbWF4KS5cbiAgICAgKiBAcGFyYW0gZGVwdGggLSBUaGUgZGVwdGggb2YgdGhlIGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gbWF4aW1pc2luZ1BsYXllciAtIFdoZXRoZXIgb3Igbm90IHRoZSBjdXJyZW50IHBsYXllciBpcyB0aGUgbWF4aW1pc2luZyBwbGF5ZXIuXG4gICAgICogQHJldHVybnMgVGhlIG9wdGltYWwgbW92ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbWluaW1heChkZXB0aDogbnVtYmVyID0gSW5maW5pdHksIG1heGltaXNpbmdQbGF5ZXI6IGJvb2xlYW4gPSB0cnVlKTogeyBtb3ZlOiBQb3NpdGlvbjsgc2NvcmU6IG51bWJlcjsgfSB7XG4gICAgICAgIGNvbnN0IHBsYXllcklkcyA9IFsodGhpcy5jdXJyZW50UGxheWVySWQgKyAxKSAlIDIsIHRoaXMuY3VycmVudFBsYXllcklkXSBhcyBjb25zdDtcblxuICAgICAgICBpZiAoZGVwdGggPT09IDAgfHwgdGhpcy5ib2FyZC53aW5uZXIgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1vdmU6IHsgeDogTmFOLCB5OiBOYU4gfSxcbiAgICAgICAgICAgICAgICBzY29yZTogdGhpcy5ib2FyZC5oZXVyaXN0aWMgKiAodGhpcy5jdXJyZW50UGxheWVySWQgPT09IDAgPyAxIDogLTEpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBiZXN0TW92ZTogUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5taW5pbWF4PiA9IHtcbiAgICAgICAgICAgIG1vdmU6IHsgeDogTmFOLCB5OiBOYU4gfSxcbiAgICAgICAgICAgIHNjb3JlOiBtYXhpbWlzaW5nUGxheWVyID8gLUluZmluaXR5IDogSW5maW5pdHksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHsgZW1wdHlDZWxscyB9ID0gdGhpcy5ib2FyZDtcblxuICAgICAgICBmb3IgKGNvbnN0IG1vdmUgb2YgZW1wdHlDZWxscykge1xuICAgICAgICAgICAgdGhpcy5ib2FyZC5tYWtlTW92ZShtb3ZlLCBwbGF5ZXJJZHNbTnVtYmVyKG1heGltaXNpbmdQbGF5ZXIpXSEpO1xuICAgICAgICAgICAgY29uc3Qgc2NvcmUgPSAoOSAtIGVtcHR5Q2VsbHMubGVuZ3RoKSAqIHRoaXMubWluaW1heChkZXB0aCAtIDEsICFtYXhpbWlzaW5nUGxheWVyKS5zY29yZTtcblxuICAgICAgICAgICAgdGhpcy5ib2FyZC51bmRvTGFzdE1vdmUoKTtcblxuICAgICAgICAgICAgaWYgKG1heGltaXNpbmdQbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiZXN0U2NvcmUgPSBNYXRoLm1heChzY29yZSwgYmVzdE1vdmUuc2NvcmUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJlc3RTY29yZSAhPT0gYmVzdE1vdmUuc2NvcmUpXG4gICAgICAgICAgICAgICAgICAgIGJlc3RNb3ZlID0geyBtb3ZlLCBzY29yZSB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiZXN0U2NvcmUgPSBNYXRoLm1pbihzY29yZSwgYmVzdE1vdmUuc2NvcmUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJlc3RTY29yZSAhPT0gYmVzdE1vdmUuc2NvcmUpXG4gICAgICAgICAgICAgICAgICAgIGJlc3RNb3ZlID0geyBtb3ZlLCBzY29yZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJlc3RNb3ZlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbWF4IGFsZ29yaXRobSB3aXRoIGFscGhhLWJldGEgcHJ1bmluZyAoaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTWluaW1heCkuXG4gICAgICogQHBhcmFtIGRlcHRoIC0gVGhlIGRlcHRoIG9mIHRoZSBhbGdvcml0aG0uXG4gICAgICogQHBhcmFtIGFscGhhIC0gVGhlIGJvdW5kcyBmb3IgdGhlIGFscGhhLWJldGEgdmFyaWF0aW9uIG9mIHRoZSBhbGdvcml0aG0uXG4gICAgICogQHBhcmFtIGJldGEgLSBUaGUgYm91bmRzIGZvciB0aGUgYWxwaGEtYmV0YSB2YXJpYXRpb24gb2YgdGhlIGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gbWF4aW1pc2luZ1BsYXllciAtIFdoZXRoZXIgb3Igbm90IHRoZSBjdXJyZW50IHBsYXllciBpcyB0aGUgbWF4aW1pc2luZyBwbGF5ZXIuXG4gICAgICogQHJldHVybnMgVGhlIG9wdGltYWwgbW92ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWxwaGFiZXRhKFxuICAgICAgICBkZXB0aDogbnVtYmVyID0gSW5maW5pdHksXG4gICAgICAgIGFscGhhOiBudW1iZXIgPSAtSW5maW5pdHksXG4gICAgICAgIGJldGE6IG51bWJlciA9IEluZmluaXR5LFxuICAgICAgICBtYXhpbWlzaW5nUGxheWVyOiBib29sZWFuID0gdHJ1ZSxcbiAgICApOiB7IG1vdmU6IFBvc2l0aW9uOyBzY29yZTogbnVtYmVyOyB9IHtcbiAgICAgICAgY29uc3QgcGxheWVySWRzID0gWyh0aGlzLmN1cnJlbnRQbGF5ZXJJZCArIDEpICUgMiwgdGhpcy5jdXJyZW50UGxheWVySWRdIGFzIGNvbnN0O1xuXG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCB8fCB0aGlzLmJvYXJkLndpbm5lciAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgICAgIHNjb3JlOiB0aGlzLmJvYXJkLmhldXJpc3RpYyAqICh0aGlzLmN1cnJlbnRQbGF5ZXJJZCA9PT0gMCA/IDEgOiAtMSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJlc3RNb3ZlOiBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmFscGhhYmV0YT4gPSB7XG4gICAgICAgICAgICBtb3ZlOiB7IHg6IE5hTiwgeTogTmFOIH0sXG4gICAgICAgICAgICBzY29yZTogbWF4aW1pc2luZ1BsYXllciA/IC1JbmZpbml0eSA6IEluZmluaXR5LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB7IGVtcHR5Q2VsbHMgfSA9IHRoaXMuYm9hcmQ7XG5cbiAgICAgICAgZm9yIChjb25zdCBtb3ZlIG9mIGVtcHR5Q2VsbHMpIHtcbiAgICAgICAgICAgIHRoaXMuYm9hcmQubWFrZU1vdmUobW92ZSwgcGxheWVySWRzW051bWJlcihtYXhpbWlzaW5nUGxheWVyKV0hKTtcbiAgICAgICAgICAgIGNvbnN0IHNjb3JlID0gKDkgLSBlbXB0eUNlbGxzLmxlbmd0aCkgKiB0aGlzLmFscGhhYmV0YShkZXB0aCAtIDEsIGFscGhhLCBiZXRhLCAhbWF4aW1pc2luZ1BsYXllcikuc2NvcmU7XG5cbiAgICAgICAgICAgIHRoaXMuYm9hcmQudW5kb0xhc3RNb3ZlKCk7XG5cbiAgICAgICAgICAgIGlmIChtYXhpbWlzaW5nUGxheWVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVzdFNjb3JlID0gTWF0aC5tYXgoc2NvcmUsIGJlc3RNb3ZlLnNjb3JlKTtcblxuICAgICAgICAgICAgICAgIGlmIChiZXN0U2NvcmUgIT09IGJlc3RNb3ZlLnNjb3JlKVxuICAgICAgICAgICAgICAgICAgICBiZXN0TW92ZSA9IHsgbW92ZSwgc2NvcmUgfTtcblxuICAgICAgICAgICAgICAgIGlmIChiZXN0TW92ZS5zY29yZSA+IGJldGEpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgYWxwaGEgPSBNYXRoLm1heChhbHBoYSwgYmVzdFNjb3JlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVzdFNjb3JlID0gTWF0aC5taW4oc2NvcmUsIGJlc3RNb3ZlLnNjb3JlKTtcblxuICAgICAgICAgICAgICAgIGlmIChiZXN0U2NvcmUgIT09IGJlc3RNb3ZlLnNjb3JlKVxuICAgICAgICAgICAgICAgICAgICBiZXN0TW92ZSA9IHsgbW92ZSwgc2NvcmUgfTtcblxuICAgICAgICAgICAgICAgIGlmIChiZXN0TW92ZS5zY29yZSA8IGFscGhhKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIGJldGEgPSBNYXRoLm1pbihiZXRhLCBiZXN0U2NvcmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJlc3RNb3ZlO1xuICAgIH1cblxuICAgIC8qKiBDaGFuZ2VzIHdoaWNoIHBsYXllcidzIHR1cm4gaXQgaXMuICovXG4gICAgcHJpdmF0ZSBuZXh0VHVybigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGxheWVySWQgPSAodGhpcy5jdXJyZW50UGxheWVySWQgKyAxKSAlIHRoaXMucGxheWVycy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZXMgYSBtb3ZlLlxuICAgICAqIEBwYXJhbSBpbnB1dCAtIEVpdGhlciB0aGUgYWxnb3JpdGhtIHRvIHVzZSB0byBjYWxjdWxhdGUgdGhlIG1vdmUgb3IgdGhlIG1vdmUgaXRzZWxmLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgbWFrZU1vdmUoaW5wdXQ6IEFsZ29yaXRobSB8IFBvc2l0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRoaXMuYm9hcmQubWFrZU1vdmUodGhpcy5kZXRlcm1pbmVDUFVNb3ZlKHRoaXMuY3VycmVudFBsYXllci5wbGF5ZXJUeXBlLCBpbnB1dCksIHRoaXMuY3VycmVudFBsYXllci5pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50UGxheWVyLnBsYXllclR5cGUgIT09IFwiaHVtYW5cIiB8fCAhdGhpcy5ib2FyZC5tb3ZlSXNWYWxpZChpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJpbnZhbGlkSW5wdXRcIiwgaW5wdXQpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmJvYXJkLm1ha2VNb3ZlKGlucHV0LCB0aGlzLmN1cnJlbnRQbGF5ZXIuaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgY29uc3QgeyB3aW5uZXIgfSA9IHRoaXMuYm9hcmQ7XG5cbiAgICAgICAgaWYgKHdpbm5lciAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcImVuZFwiLCB3aW5uZXIpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5leHRUdXJuKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB0aGUgQ1BVIG1vdmUuXG4gICAgICogQHBhcmFtIGRpZmZpY3VsdHkgLSBUaGUgZGlmZmljdWx0eSBvZiB0aGUgQUkuXG4gICAgICogQHBhcmFtIGFsZ29yaXRobSAtIFRoZSBhbGdvcml0aG0gdG8gdXNlLlxuICAgICAqIEByZXR1cm5zIFRoZSBtb3ZlLlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBkZXRlcm1pbmVDUFVNb3ZlKGRpZmZpY3VsdHk6IE9taXQ8UGxheWVyVHlwZSwgXCJodW1hblwiPiwgYWxnb3JpdGhtPzogQWxnb3JpdGhtKTogUG9zaXRpb247XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyB0aGUgb3B0aW1hbCBtb3ZlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgdG8gdXNlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLmFsZ29yaXRobSAtIFRoZSBhbGdvcml0aG0gdG8gdXNlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLm1heERlcHRoIC0gVGhlIG1heGltdW0gZGVwdGggdG8gc2VhcmNoLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLnJhbmRvbU1vdmUgLSBBIHJhbmRvbSBtb3ZlIHRvIG1ha2UuXG4gICAgICogQHJldHVybnMgVGhlIG9wdGltYWwgbW92ZSB0byBtYWtlLlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBmaW5kT3B0aW1hbE1vdmUob3B0aW9ucz86IHtcbiAgICAgICAgYWxnb3JpdGhtPzogQWxnb3JpdGhtO1xuICAgICAgICBtYXhEZXB0aD86IG51bWJlcjtcbiAgICAgICAgcmFuZG9tTW92ZT86IFBvc2l0aW9uO1xuICAgIH0pOiBQb3NpdGlvbjtcbn1cbiJdfQ==
|
|
@@ -1,19 +1,16 @@
|
|
|
1
1
|
import type { Algorithm, GameConstructorOptions, PlayerType } from "../../base/controller.js";
|
|
2
2
|
import Base from "../../base/controller.js";
|
|
3
|
-
import
|
|
3
|
+
import Board from "./board.js";
|
|
4
4
|
import type { Position } from "../../base/board.js";
|
|
5
|
-
/**
|
|
6
|
-
|
|
7
|
-
* @template T - The type of the game ID.
|
|
8
|
-
*/
|
|
9
|
-
export default class Connect4<T> extends Base<T, LongInt> {
|
|
5
|
+
/** Represents the controller for connect 4. */
|
|
6
|
+
export default class Connect4 extends Base<Board> {
|
|
10
7
|
/**
|
|
11
8
|
* Creates an instance of Connect4.
|
|
12
9
|
* @param playerOneType - The type of player one (human or CPU).
|
|
13
10
|
* @param playerTwoType - The type of player two (human or CPU).
|
|
14
11
|
* @param options - The options for the game.
|
|
15
12
|
*/
|
|
16
|
-
constructor(playerOneType: PlayerType, playerTwoType: PlayerType, options
|
|
13
|
+
constructor(playerOneType: PlayerType, playerTwoType: PlayerType, options?: GameConstructorOptions<Board>);
|
|
17
14
|
/**
|
|
18
15
|
* Calculates the CPU's move.
|
|
19
16
|
* @param difficulty - The difficulty of the CPU.
|
|
@@ -8,22 +8,18 @@ import Base, { Game } from "../../base/controller.js";
|
|
|
8
8
|
import Board from "./board.js";
|
|
9
9
|
/**
|
|
10
10
|
* The default renderer for connect 4.
|
|
11
|
-
* @template T - The type of the game ID.
|
|
12
11
|
* @param controller - The controller to render.
|
|
13
12
|
*/
|
|
14
13
|
function defaultRender(controller) {
|
|
15
14
|
/* eslint-disable no-console */
|
|
16
15
|
console.clear();
|
|
17
|
-
console.log(controller.board.toString(true, true, false, ["⬤
|
|
16
|
+
console.log(controller.board.toString(true, true, false, ["⬤", "⬤"]));
|
|
18
17
|
const { winner } = controller.board;
|
|
19
18
|
if (winner !== false)
|
|
20
19
|
console.log(winner === null ? "It's a tie!" : `Player ${winner + 1} wins!`);
|
|
21
20
|
/* eslint-enable no-console */
|
|
22
21
|
}
|
|
23
|
-
/**
|
|
24
|
-
* Represents the controller for connect 4.
|
|
25
|
-
* @template T - The type of the game ID.
|
|
26
|
-
*/
|
|
22
|
+
/** Represents the controller for connect 4. */
|
|
27
23
|
let Connect4 = class Connect4 extends Base {
|
|
28
24
|
/**
|
|
29
25
|
* Creates an instance of Connect4.
|
|
@@ -32,7 +28,7 @@ let Connect4 = class Connect4 extends Base {
|
|
|
32
28
|
* @param options - The options for the game.
|
|
33
29
|
*/
|
|
34
30
|
constructor(playerOneType, playerTwoType, options) {
|
|
35
|
-
super([playerOneType, playerTwoType], new Board(), options
|
|
31
|
+
super([playerOneType, playerTwoType], new Board(), options?.renderer ?? defaultRender, options?.onEnd, options?.onInvalidInput);
|
|
36
32
|
}
|
|
37
33
|
/**
|
|
38
34
|
* Calculates the CPU's move.
|
|
@@ -46,7 +42,7 @@ let Connect4 = class Connect4 extends Base {
|
|
|
46
42
|
const randomMove = emptyCells[Math.floor(Math.random() * emptyCells.length)];
|
|
47
43
|
switch (difficulty) {
|
|
48
44
|
case "impossibleCPU":
|
|
49
|
-
return this.findOptimalMove({ algorithm, maxDepth:
|
|
45
|
+
return this.findOptimalMove({ algorithm, maxDepth: 7 });
|
|
50
46
|
case "hardCPU":
|
|
51
47
|
return this.findOptimalMove({ algorithm, maxDepth: 5 });
|
|
52
48
|
case "mediumCPU":
|
|
@@ -77,4 +73,4 @@ Connect4 = __decorate([
|
|
|
77
73
|
Game
|
|
78
74
|
], Connect4);
|
|
79
75
|
export default Connect4;
|
|
80
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nYW1lcy9jb25uZWN0NC9jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLE9BQU8sSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBRy9COzs7R0FHRztBQUNILFNBQVMsYUFBYSxDQUFDLFVBQW9CO0lBQ3ZDLCtCQUErQjtJQUMvQixPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFFcEMsSUFBSSxNQUFNLEtBQUssS0FBSztRQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRiw4QkFBOEI7QUFDbEMsQ0FBQztBQUVELCtDQUErQztBQUVoQyxJQUFNLFFBQVEsR0FBZCxNQUFNLFFBQVMsU0FBUSxJQUFXO0lBQzdDOzs7OztPQUtHO0lBQ0gsWUFDSSxhQUF5QixFQUN6QixhQUF5QixFQUN6QixPQUF1QztRQUV2QyxLQUFLLENBQ0QsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLEVBQzlCLElBQUksS0FBSyxFQUFFLEVBQ1gsT0FBTyxFQUFFLFFBQVEsSUFBSSxhQUFhLEVBQ2xDLE9BQU8sRUFBRSxLQUFLLEVBQ2QsT0FBTyxFQUFFLGNBQWMsQ0FDMUIsQ0FBQztJQUNOLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxnQkFBZ0IsQ0FBQyxVQUFxQyxFQUFFLFlBQXVCLFdBQVc7UUFDN0YsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDbEMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBRSxDQUFDO1FBRTlFLFFBQVEsVUFBVSxFQUFFLENBQUM7WUFDakIsS0FBSyxlQUFlO2dCQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDNUQsS0FBSyxTQUFTO2dCQUNWLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM1RCxLQUFLLFdBQVc7Z0JBQ1osT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVELEtBQUssU0FBUztnQkFDVixPQUFPLFVBQVUsQ0FBQztZQUN0QjtnQkFDSSxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksZUFBZSxDQUFDLE9BQXVEO1FBQzFFLE1BQU0sRUFBRSxRQUFRLEdBQUcsUUFBUSxFQUFFLFNBQVMsR0FBRyxXQUFXLEVBQUUsR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO1FBRXZFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPO1lBQ2xCLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUUxQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFMUMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ3hCLENBQUM7Q0FDSixDQUFBO0FBaEVvQixRQUFRO0lBRDVCLElBQUk7R0FDZ0IsUUFBUSxDQWdFNUI7ZUFoRW9CLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFsZ29yaXRobSwgR2FtZUNvbnN0cnVjdG9yT3B0aW9ucywgUGxheWVyVHlwZSB9IGZyb20gXCIuLi8uLi9iYXNlL2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCBCYXNlLCB7IEdhbWUgfSBmcm9tIFwiLi4vLi4vYmFzZS9jb250cm9sbGVyLmpzXCI7XG5pbXBvcnQgQm9hcmQgZnJvbSBcIi4vYm9hcmQuanNcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwiLi4vLi4vYmFzZS9ib2FyZC5qc1wiO1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHJlbmRlcmVyIGZvciBjb25uZWN0IDQuXG4gKiBAcGFyYW0gY29udHJvbGxlciAtIFRoZSBjb250cm9sbGVyIHRvIHJlbmRlci5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdFJlbmRlcihjb250cm9sbGVyOiBDb25uZWN0NCk6IHZvaWQge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgICBjb25zb2xlLmNsZWFyKCk7XG4gICAgY29uc29sZS5sb2coY29udHJvbGxlci5ib2FyZC50b1N0cmluZyh0cnVlLCB0cnVlLCBmYWxzZSwgW1wi4qykXCIsIFwi4qykXCJdKSk7XG4gICAgY29uc3QgeyB3aW5uZXIgfSA9IGNvbnRyb2xsZXIuYm9hcmQ7XG5cbiAgICBpZiAod2lubmVyICE9PSBmYWxzZSlcbiAgICAgICAgY29uc29sZS5sb2cod2lubmVyID09PSBudWxsID8gXCJJdCdzIGEgdGllIVwiIDogYFBsYXllciAke3dpbm5lciArIDF9IHdpbnMhYCk7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1jb25zb2xlICovXG59XG5cbi8qKiBSZXByZXNlbnRzIHRoZSBjb250cm9sbGVyIGZvciBjb25uZWN0IDQuICovXG5AR2FtZVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29ubmVjdDQgZXh0ZW5kcyBCYXNlPEJvYXJkPiB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDb25uZWN0NC5cbiAgICAgKiBAcGFyYW0gcGxheWVyT25lVHlwZSAtIFRoZSB0eXBlIG9mIHBsYXllciBvbmUgKGh1bWFuIG9yIENQVSkuXG4gICAgICogQHBhcmFtIHBsYXllclR3b1R5cGUgLSBUaGUgdHlwZSBvZiBwbGF5ZXIgdHdvIChodW1hbiBvciBDUFUpLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBnYW1lLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcGxheWVyT25lVHlwZTogUGxheWVyVHlwZSxcbiAgICAgICAgcGxheWVyVHdvVHlwZTogUGxheWVyVHlwZSxcbiAgICAgICAgb3B0aW9ucz86IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnM8Qm9hcmQ+LFxuICAgICkge1xuICAgICAgICBzdXBlcihcbiAgICAgICAgICAgIFtwbGF5ZXJPbmVUeXBlLCBwbGF5ZXJUd29UeXBlXSxcbiAgICAgICAgICAgIG5ldyBCb2FyZCgpLFxuICAgICAgICAgICAgb3B0aW9ucz8ucmVuZGVyZXIgPz8gZGVmYXVsdFJlbmRlcixcbiAgICAgICAgICAgIG9wdGlvbnM/Lm9uRW5kLFxuICAgICAgICAgICAgb3B0aW9ucz8ub25JbnZhbGlkSW5wdXQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgQ1BVJ3MgbW92ZS5cbiAgICAgKiBAcGFyYW0gZGlmZmljdWx0eSAtIFRoZSBkaWZmaWN1bHR5IG9mIHRoZSBDUFUuXG4gICAgICogQHBhcmFtIGFsZ29yaXRobSAtIFRoZSBhbGdvcml0aG0gdG8gdXNlLlxuICAgICAqIEByZXR1cm5zIFRoZSBDUFUncyBtb3ZlLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBBbiBlcnJvciBpZiB0aGUgZGlmZmljdWx0eSBpcyBpbnZhbGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZXRlcm1pbmVDUFVNb3ZlKGRpZmZpY3VsdHk6IE9taXQ8UGxheWVyVHlwZSwgXCJodW1hblwiPiwgYWxnb3JpdGhtOiBBbGdvcml0aG0gPSBcImFscGhhYmV0YVwiKTogUG9zaXRpb24ge1xuICAgICAgICBjb25zdCB7IGVtcHR5Q2VsbHMgfSA9IHRoaXMuYm9hcmQ7XG4gICAgICAgIGNvbnN0IHJhbmRvbU1vdmUgPSBlbXB0eUNlbGxzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGVtcHR5Q2VsbHMubGVuZ3RoKV0hO1xuXG4gICAgICAgIHN3aXRjaCAoZGlmZmljdWx0eSkge1xuICAgICAgICAgICAgY2FzZSBcImltcG9zc2libGVDUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kT3B0aW1hbE1vdmUoeyBhbGdvcml0aG0sIG1heERlcHRoOiA3IH0pO1xuICAgICAgICAgICAgY2FzZSBcImhhcmRDUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kT3B0aW1hbE1vdmUoeyBhbGdvcml0aG0sIG1heERlcHRoOiA1IH0pO1xuICAgICAgICAgICAgY2FzZSBcIm1lZGl1bUNQVVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRPcHRpbWFsTW92ZSh7IGFsZ29yaXRobSwgbWF4RGVwdGg6IDMgfSk7XG4gICAgICAgICAgICBjYXNlIFwiZWFzeUNQVVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiByYW5kb21Nb3ZlO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGRpZmZpY3VsdHkuXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIG9wdGltYWwgbW92ZSBmb3IgdGhlIGN1cnJlbnQgYm9hcmQgc3RhdGUuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5hbGdvcml0aG0gLSBUaGUgYWxnb3JpdGhtIHRvIHVzZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5tYXhEZXB0aCAtIFRoZSBtYXhpbXVtIGRlcHRoIHRvIHNlYXJjaC5cbiAgICAgKiBAcmV0dXJucyBUaGUgb3B0aW1hbCBtb3ZlIGZvciB0aGUgY3VycmVudCBib2FyZCBzdGF0ZS5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gQW4gZXJyb3IgaWYgdGhlIGFsZ29yaXRobSBpcyBpbnZhbGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kT3B0aW1hbE1vdmUob3B0aW9ucz86IHsgYWxnb3JpdGhtPzogQWxnb3JpdGhtOyBtYXhEZXB0aD86IG51bWJlcjsgfSk6IFBvc2l0aW9uIHtcbiAgICAgICAgY29uc3QgeyBtYXhEZXB0aCA9IEluZmluaXR5LCBhbGdvcml0aG0gPSBcImFscGhhYmV0YVwiIH0gPSBvcHRpb25zID8/IHt9O1xuXG4gICAgICAgIGlmICh0aGlzLmJvYXJkLmlzRW1wdHkpXG4gICAgICAgICAgICByZXR1cm4geyB4OiAzLCB5OiA1IH07XG5cbiAgICAgICAgY29uc3QgbWluaW1heCA9IHRoaXNbYWxnb3JpdGhtXShtYXhEZXB0aCk7XG5cbiAgICAgICAgcmV0dXJuIG1pbmltYXgubW92ZTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
import type { Algorithm, GameConstructorOptions, PlayerType } from "../../base/controller.js";
|
|
2
2
|
import Base from "../../base/controller.js";
|
|
3
|
+
import Board from "./board.js";
|
|
3
4
|
import type { Position } from "../../base/board.js";
|
|
4
|
-
/**
|
|
5
|
-
|
|
6
|
-
* @template T - The type of the game ID.
|
|
7
|
-
*/
|
|
8
|
-
export default class TicTacToe<T> extends Base<T, number> {
|
|
5
|
+
/** A game of TicTacToe. */
|
|
6
|
+
export default class TicTacToe extends Base<Board> {
|
|
9
7
|
/**
|
|
10
8
|
* Creates a new TicTacToe game.
|
|
11
9
|
* @param playerOneType - The type of player one (human or CPU).
|
|
12
10
|
* @param playerTwoType - The type of player two (human or CPU).
|
|
13
11
|
* @param options - The options for the game.
|
|
14
12
|
*/
|
|
15
|
-
constructor(playerOneType: PlayerType, playerTwoType: PlayerType, options
|
|
13
|
+
constructor(playerOneType: PlayerType, playerTwoType: PlayerType, options?: GameConstructorOptions<Board>);
|
|
16
14
|
/**
|
|
17
15
|
* Calculates the CPU's move.
|
|
18
16
|
* @param difficulty - The difficulty of the CPU.
|
|
@@ -8,7 +8,6 @@ import Base, { Game } from "../../base/controller.js";
|
|
|
8
8
|
import Board from "./board.js";
|
|
9
9
|
/**
|
|
10
10
|
* The default rendering function for TicTacToe.
|
|
11
|
-
* @template T - The type of the game ID.
|
|
12
11
|
* @param controller - The controller to render.
|
|
13
12
|
*/
|
|
14
13
|
function defaultRender(controller) {
|
|
@@ -20,10 +19,7 @@ function defaultRender(controller) {
|
|
|
20
19
|
console.log(winner === null ? "It's a tie!" : `Player ${winner + 1} wins!`);
|
|
21
20
|
/* eslint-enable no-console */
|
|
22
21
|
}
|
|
23
|
-
/**
|
|
24
|
-
* A game of TicTacToe.
|
|
25
|
-
* @template T - The type of the game ID.
|
|
26
|
-
*/
|
|
22
|
+
/** A game of TicTacToe. */
|
|
27
23
|
let TicTacToe = class TicTacToe extends Base {
|
|
28
24
|
/**
|
|
29
25
|
* Creates a new TicTacToe game.
|
|
@@ -32,7 +28,7 @@ let TicTacToe = class TicTacToe extends Base {
|
|
|
32
28
|
* @param options - The options for the game.
|
|
33
29
|
*/
|
|
34
30
|
constructor(playerOneType, playerTwoType, options) {
|
|
35
|
-
super([playerOneType, playerTwoType], new Board(), options
|
|
31
|
+
super([playerOneType, playerTwoType], new Board(), options?.renderer ?? defaultRender, options?.onEnd, options?.onInvalidInput);
|
|
36
32
|
}
|
|
37
33
|
/**
|
|
38
34
|
* Calculates the CPU's move.
|
|
@@ -77,4 +73,4 @@ TicTacToe = __decorate([
|
|
|
77
73
|
Game
|
|
78
74
|
], TicTacToe);
|
|
79
75
|
export default TicTacToe;
|
|
80
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nYW1lcy90aWN0YWN0b2UvY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxPQUFPLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RELE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQztBQUcvQjs7O0dBR0c7QUFDSCxTQUFTLGFBQWEsQ0FBQyxVQUFxQjtJQUN4QywrQkFBK0I7SUFDL0IsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM5QyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztJQUVwQyxJQUFJLE1BQU0sS0FBSyxLQUFLO1FBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hGLDhCQUE4QjtBQUNsQyxDQUFDO0FBRUQsMkJBQTJCO0FBRVosSUFBTSxTQUFTLEdBQWYsTUFBTSxTQUFVLFNBQVEsSUFBVztJQUM5Qzs7Ozs7T0FLRztJQUNILFlBQ0ksYUFBeUIsRUFDekIsYUFBeUIsRUFDekIsT0FBdUM7UUFFdkMsS0FBSyxDQUNELENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxFQUM5QixJQUFJLEtBQUssRUFBRSxFQUNYLE9BQU8sRUFBRSxRQUFRLElBQUksYUFBYSxFQUNsQyxPQUFPLEVBQUUsS0FBSyxFQUNkLE9BQU8sRUFBRSxjQUFjLENBQzFCLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZ0JBQWdCLENBQUMsVUFBcUMsRUFBRSxZQUF1QixXQUFXO1FBQzdGLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2xDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUUsQ0FBQztRQUM5RSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFFcEUsUUFBUSxVQUFVLEVBQUUsQ0FBQztZQUNqQixLQUFLLGVBQWU7Z0JBQ2hCLE9BQU8sV0FBVyxDQUFDO1lBQ3ZCLEtBQUssU0FBUztnQkFDVixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQzFELEtBQUssV0FBVztnQkFDWixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQzFELEtBQUssU0FBUztnQkFDVixPQUFPLFVBQVUsQ0FBQztZQUN0QjtnQkFDSSxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksZUFBZSxDQUFDLEVBQUUsU0FBUyxFQUFFLFVBQVUsS0FHMUMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3RELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPO1lBQ2xCLE9BQU8sVUFBVSxDQUFDO1FBRXRCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBRWxDLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQztJQUN4QixDQUFDO0NBQ0osQ0FBQTtBQWxFb0IsU0FBUztJQUQ3QixJQUFJO0dBQ2dCLFNBQVMsQ0FrRTdCO2VBbEVvQixTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbGdvcml0aG0sIEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnMsIFBsYXllclR5cGUgfSBmcm9tIFwiLi4vLi4vYmFzZS9jb250cm9sbGVyLmpzXCI7XG5pbXBvcnQgQmFzZSwgeyBHYW1lIH0gZnJvbSBcIi4uLy4uL2Jhc2UvY29udHJvbGxlci5qc1wiO1xuaW1wb3J0IEJvYXJkIGZyb20gXCIuL2JvYXJkLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4uLy4uL2Jhc2UvYm9hcmQuanNcIjtcblxuLyoqXG4gKiBUaGUgZGVmYXVsdCByZW5kZXJpbmcgZnVuY3Rpb24gZm9yIFRpY1RhY1RvZS5cbiAqIEBwYXJhbSBjb250cm9sbGVyIC0gVGhlIGNvbnRyb2xsZXIgdG8gcmVuZGVyLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0UmVuZGVyKGNvbnRyb2xsZXI6IFRpY1RhY1RvZSk6IHZvaWQge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgICBjb25zb2xlLmNsZWFyKCk7XG4gICAgY29uc29sZS5sb2coY29udHJvbGxlci5ib2FyZC50b1N0cmluZyhmYWxzZSkpO1xuICAgIGNvbnN0IHsgd2lubmVyIH0gPSBjb250cm9sbGVyLmJvYXJkO1xuXG4gICAgaWYgKHdpbm5lciAhPT0gZmFsc2UpXG4gICAgICAgIGNvbnNvbGUubG9nKHdpbm5lciA9PT0gbnVsbCA/IFwiSXQncyBhIHRpZSFcIiA6IGBQbGF5ZXIgJHt3aW5uZXIgKyAxfSB3aW5zIWApO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xufVxuXG4vKiogQSBnYW1lIG9mIFRpY1RhY1RvZS4gKi9cbkBHYW1lXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaWNUYWNUb2UgZXh0ZW5kcyBCYXNlPEJvYXJkPiB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBUaWNUYWNUb2UgZ2FtZS5cbiAgICAgKiBAcGFyYW0gcGxheWVyT25lVHlwZSAtIFRoZSB0eXBlIG9mIHBsYXllciBvbmUgKGh1bWFuIG9yIENQVSkuXG4gICAgICogQHBhcmFtIHBsYXllclR3b1R5cGUgLSBUaGUgdHlwZSBvZiBwbGF5ZXIgdHdvIChodW1hbiBvciBDUFUpLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBnYW1lLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcGxheWVyT25lVHlwZTogUGxheWVyVHlwZSxcbiAgICAgICAgcGxheWVyVHdvVHlwZTogUGxheWVyVHlwZSxcbiAgICAgICAgb3B0aW9ucz86IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnM8Qm9hcmQ+LFxuICAgICkge1xuICAgICAgICBzdXBlcihcbiAgICAgICAgICAgIFtwbGF5ZXJPbmVUeXBlLCBwbGF5ZXJUd29UeXBlXSxcbiAgICAgICAgICAgIG5ldyBCb2FyZCgpLFxuICAgICAgICAgICAgb3B0aW9ucz8ucmVuZGVyZXIgPz8gZGVmYXVsdFJlbmRlcixcbiAgICAgICAgICAgIG9wdGlvbnM/Lm9uRW5kLFxuICAgICAgICAgICAgb3B0aW9ucz8ub25JbnZhbGlkSW5wdXQsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgQ1BVJ3MgbW92ZS5cbiAgICAgKiBAcGFyYW0gZGlmZmljdWx0eSAtIFRoZSBkaWZmaWN1bHR5IG9mIHRoZSBDUFUuXG4gICAgICogQHBhcmFtIGFsZ29yaXRobSAtIFRoZSBhbGdvcml0aG0gdG8gdXNlLlxuICAgICAqIEByZXR1cm5zIFRoZSBDUFUncyBtb3ZlLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBBbiBlcnJvciBpZiB0aGUgZGlmZmljdWx0eSBpcyBpbnZhbGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZXRlcm1pbmVDUFVNb3ZlKGRpZmZpY3VsdHk6IE9taXQ8UGxheWVyVHlwZSwgXCJodW1hblwiPiwgYWxnb3JpdGhtOiBBbGdvcml0aG0gPSBcImFscGhhYmV0YVwiKTogUG9zaXRpb24ge1xuICAgICAgICBjb25zdCB7IGVtcHR5Q2VsbHMgfSA9IHRoaXMuYm9hcmQ7XG4gICAgICAgIGNvbnN0IHJhbmRvbU1vdmUgPSBlbXB0eUNlbGxzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGVtcHR5Q2VsbHMubGVuZ3RoKV0hO1xuICAgICAgICBjb25zdCBvcHRpbWFsTW92ZSA9IHRoaXMuZmluZE9wdGltYWxNb3ZlKHsgYWxnb3JpdGhtLCByYW5kb21Nb3ZlIH0pO1xuXG4gICAgICAgIHN3aXRjaCAoZGlmZmljdWx0eSkge1xuICAgICAgICAgICAgY2FzZSBcImltcG9zc2libGVDUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW1hbE1vdmU7XG4gICAgICAgICAgICBjYXNlIFwiaGFyZENQVVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnJhbmRvbSgpIDwgMC44ID8gb3B0aW1hbE1vdmUgOiByYW5kb21Nb3ZlO1xuICAgICAgICAgICAgY2FzZSBcIm1lZGl1bUNQVVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnJhbmRvbSgpIDwgMC41ID8gb3B0aW1hbE1vdmUgOiByYW5kb21Nb3ZlO1xuICAgICAgICAgICAgY2FzZSBcImVhc3lDUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZG9tTW92ZTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkaWZmaWN1bHR5LlwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBvcHRpbWFsIG1vdmUgZm9yIHRoZSBjdXJyZW50IHBsYXllci5cbiAgICAgKiBAcGFyYW0gYWxnb3JpdGhtIC0gVGhlIGFsZ29yaXRobSB0byB1c2UuXG4gICAgICogQHBhcmFtIGFsZ29yaXRobS5hbGdvcml0aG0gLSBUaGUgYWxnb3JpdGhtIHRvIHVzZS5cbiAgICAgKiBAcGFyYW0gYWxnb3JpdGhtLnJhbmRvbU1vdmUgLSBUaGUgbW92ZSB0byByZXR1cm4gaWYgdGhlIGJvYXJkIGlzIGVtcHR5LlxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpbWFsIG1vdmUgZm9yIHRoZSBjdXJyZW50IHBsYXllci5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gQW4gZXJyb3IgaWYgdGhlIGFsZ29yaXRobSBpcyBpbnZhbGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kT3B0aW1hbE1vdmUoeyBhbGdvcml0aG0sIHJhbmRvbU1vdmUgfToge1xuICAgICAgICBhbGdvcml0aG06IEFsZ29yaXRobTtcbiAgICAgICAgcmFuZG9tTW92ZTogUG9zaXRpb247XG4gICAgfSA9IHsgYWxnb3JpdGhtOiBcImFscGhhYmV0YVwiLCByYW5kb21Nb3ZlOiB7IHg6IDIsIHk6IDIgfSB9KTogUG9zaXRpb24ge1xuICAgICAgICBpZiAodGhpcy5ib2FyZC5pc0VtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIHJhbmRvbU1vdmU7XG5cbiAgICAgICAgY29uc3QgbWluaW1heCA9IHRoaXNbYWxnb3JpdGhtXSgpO1xuXG4gICAgICAgIHJldHVybiBtaW5pbWF4Lm1vdmU7XG4gICAgfVxufVxuIl19
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oathompsonjones/mini-games",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.14",
|
|
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"
|