@oathompsonjones/mini-games 1.0.2 → 1.0.3

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.
@@ -3,72 +3,60 @@ import { EventEmitter } from "eventemitter3";
3
3
  import type { Position } from "./board.js";
4
4
  export type PlayerType = "easyCPU" | "hardCPU" | "human" | "impossibleCPU" | "mediumCPU";
5
5
  export type Algorithm = "alphabeta" | "minimax";
6
- export interface GameConstructorOptions {
6
+ export type GameConstructorOptions = {
7
7
  id?: string;
8
8
  onEnd?: (winner: number | null) => Promise<void> | void;
9
9
  onInvalidInput?: (position: Position) => Promise<void> | void;
10
10
  renderer?: (controller: Controller) => Promise<void> | void;
11
- }
12
- export interface GameConstructor {
11
+ };
12
+ export type GameConstructor = {
13
13
  new (playerOneType: PlayerType, playerTwoType: PlayerType, options?: GameConstructorOptions): Controller;
14
- }
15
- export declare function Game(constructor: GameConstructor): void;
14
+ };
16
15
  /**
17
- * Represents a game controller.
16
+ * Decorator to check that the constructor type for the given class is correct.
17
+ * @param constructor The class to check.
18
18
  */
19
+ export declare function Game(constructor: GameConstructor): void;
20
+ /** Represents a game controller. */
19
21
  export default abstract class Controller extends EventEmitter<{
20
22
  end: GameConstructorOptions["onEnd"];
21
23
  input: GameConstructorOptions["onInvalidInput"];
22
24
  invalidInput: GameConstructorOptions["onInvalidInput"];
23
25
  }> {
24
- /**
25
- * Contains the ID of the game.
26
- */
26
+ /** Contains the ID of the game. */
27
27
  readonly gameID: string;
28
- /**
29
- * Contains the board.
30
- */
28
+ /** Contains the board. */
31
29
  readonly board: Board;
32
- /**
33
- * Contains the view object.
34
- */
30
+ /** Contains the view object. */
35
31
  readonly render: Required<GameConstructorOptions>["renderer"];
36
- /**
37
- * Contains the player objects.
38
- */
32
+ /** Contains the player objects. */
39
33
  protected readonly players: Array<{
40
34
  id: number;
41
35
  playerType: PlayerType;
42
36
  }>;
43
- /**
44
- * Contains the ID of the current player.
45
- */
37
+ /** Contains the ID of the current player. */
46
38
  private currentPlayerId;
47
39
  /**
48
40
  * Creates an instance of Controller.
49
- *
50
41
  * @param playerTypes The types of player.
51
42
  * @param view The view object.
52
43
  * @param gameID The ID of the game.
53
44
  * @param board The board.
54
45
  */
55
46
  protected constructor(playerTypes: PlayerType[], board: Board, render: Controller["render"], gameID: string | undefined, onEnd?: GameConstructorOptions["onEnd"], onInvalidInput?: GameConstructorOptions["onInvalidInput"]);
56
- /**
57
- * Gets the current player object.
58
- */
47
+ /** Gets the current player object. */
59
48
  get currentPlayer(): {
60
49
  id: number;
61
50
  playerType: PlayerType;
62
51
  };
63
52
  /**
64
53
  * Controls the main game flow.
65
- *
54
+ * @param algorithm The algorithm to use.
66
55
  * @returns The winner or null in the event of a tie.
67
56
  */
68
57
  play(algorithm?: Algorithm): Promise<void>;
69
58
  /**
70
59
  * The bog standard minimax algorithm. Left in for reference.
71
- *
72
60
  * @link https://en.wikipedia.org/wiki/Minimax
73
61
  * @param depth The depth of the algorithm.
74
62
  * @param maximisingPlayer Whether or not the current player is the maximising player.
@@ -80,7 +68,6 @@ export default abstract class Controller extends EventEmitter<{
80
68
  };
81
69
  /**
82
70
  * The minimax algorithm with alpha-beta pruning.
83
- *
84
71
  * @link https://en.wikipedia.org/wiki/Minimax
85
72
  * @param depth The depth of the algorithm.
86
73
  * @param alpha The bounds for the alpha-beta variation of the algorithm.
@@ -92,19 +79,15 @@ export default abstract class Controller extends EventEmitter<{
92
79
  move: Position;
93
80
  score: number;
94
81
  };
95
- /**
96
- * Changes which player's turn it is.
97
- */
82
+ /** Changes which player's turn it is. */
98
83
  private nextTurn;
99
84
  /**
100
85
  * Makes a move.
101
- *
102
86
  * @param input Either the algorithm to use to calculate the move or the move itself.
103
87
  */
104
88
  private makeMove;
105
89
  /**
106
90
  * Determines the CPU move.
107
- *
108
91
  * @param difficulty The difficulty of the AI.
109
92
  * @param algorithm The algorithm to use.
110
93
  * @returns The move.
@@ -112,7 +95,6 @@ export default abstract class Controller extends EventEmitter<{
112
95
  abstract determineCPUMove(difficulty: Omit<PlayerType, "human">, algorithm?: Algorithm): Position;
113
96
  /**
114
97
  * Finds the optimal move.
115
- *
116
98
  * @param options The options.
117
99
  * @returns The optimal move.
118
100
  */
@@ -1,40 +1,31 @@
1
1
  import { EventEmitter } from "eventemitter3";
2
+ /**
3
+ * Decorator to check that the constructor type for the given class is correct.
4
+ * @param constructor The class to check.
5
+ */
2
6
  export function Game(constructor) {
3
7
  void constructor;
4
8
  }
5
- /**
6
- * Represents a game controller.
7
- */
9
+ /** Represents a game controller. */
8
10
  export default class Controller extends EventEmitter {
9
- /**
10
- * Contains the ID of the game.
11
- */
11
+ /** Contains the ID of the game. */
12
12
  gameID;
13
- /**
14
- * Contains the board.
15
- */
13
+ /** Contains the board. */
16
14
  board;
17
- /**
18
- * Contains the view object.
19
- */
15
+ /** Contains the view object. */
20
16
  render;
21
- /**
22
- * Contains the player objects.
23
- */
17
+ /** Contains the player objects. */
24
18
  players;
25
- /**
26
- * Contains the ID of the current player.
27
- */
19
+ /** Contains the ID of the current player. */
28
20
  currentPlayerId = 0;
29
21
  /**
30
22
  * Creates an instance of Controller.
31
- *
32
23
  * @param playerTypes The types of player.
33
24
  * @param view The view object.
34
25
  * @param gameID The ID of the game.
35
26
  * @param board The board.
36
27
  */
37
- // eslint-disable-next-line @typescript-eslint/max-params
28
+ // eslint-disable-next-line @typescript-eslint/max-params, require-jsdoc
38
29
  constructor(playerTypes, board, render, gameID, onEnd, onInvalidInput) {
39
30
  super();
40
31
  this.gameID = gameID ?? Date.now().toString(16);
@@ -47,15 +38,13 @@ export default class Controller extends EventEmitter {
47
38
  if (onInvalidInput !== undefined)
48
39
  this.on("invalidInput", onInvalidInput);
49
40
  }
50
- /**
51
- * Gets the current player object.
52
- */
41
+ /** Gets the current player object. */
53
42
  get currentPlayer() {
54
43
  return this.players[this.currentPlayerId];
55
44
  }
56
45
  /**
57
46
  * Controls the main game flow.
58
- *
47
+ * @param algorithm The algorithm to use.
59
48
  * @returns The winner or null in the event of a tie.
60
49
  */
61
50
  async play(algorithm = "alphabeta") {
@@ -71,7 +60,6 @@ export default class Controller extends EventEmitter {
71
60
  }
72
61
  /**
73
62
  * The bog standard minimax algorithm. Left in for reference.
74
- *
75
63
  * @link https://en.wikipedia.org/wiki/Minimax
76
64
  * @param depth The depth of the algorithm.
77
65
  * @param maximisingPlayer Whether or not the current player is the maximising player.
@@ -82,12 +70,12 @@ export default class Controller extends EventEmitter {
82
70
  if (depth === 0 || this.board.winner !== false) {
83
71
  return {
84
72
  move: { x: NaN, y: NaN },
85
- score: this.board.heuristic * (this.currentPlayerId === 0 ? 1 : -1)
73
+ score: this.board.heuristic * (this.currentPlayerId === 0 ? 1 : -1),
86
74
  };
87
75
  }
88
76
  let bestMove = {
89
77
  move: { x: NaN, y: NaN },
90
- score: maximisingPlayer ? -Infinity : Infinity
78
+ score: maximisingPlayer ? -Infinity : Infinity,
91
79
  };
92
80
  const { emptyCells } = this.board;
93
81
  for (const move of emptyCells) {
@@ -109,7 +97,6 @@ export default class Controller extends EventEmitter {
109
97
  }
110
98
  /**
111
99
  * The minimax algorithm with alpha-beta pruning.
112
- *
113
100
  * @link https://en.wikipedia.org/wiki/Minimax
114
101
  * @param depth The depth of the algorithm.
115
102
  * @param alpha The bounds for the alpha-beta variation of the algorithm.
@@ -122,12 +109,12 @@ export default class Controller extends EventEmitter {
122
109
  if (depth === 0 || this.board.winner !== false) {
123
110
  return {
124
111
  move: { x: NaN, y: NaN },
125
- score: this.board.heuristic * (this.currentPlayerId === 0 ? 1 : -1)
112
+ score: this.board.heuristic * (this.currentPlayerId === 0 ? 1 : -1),
126
113
  };
127
114
  }
128
115
  let bestMove = {
129
116
  move: { x: NaN, y: NaN },
130
- score: maximisingPlayer ? -Infinity : Infinity
117
+ score: maximisingPlayer ? -Infinity : Infinity,
131
118
  };
132
119
  const { emptyCells } = this.board;
133
120
  for (const move of emptyCells) {
@@ -155,15 +142,12 @@ export default class Controller extends EventEmitter {
155
142
  }
156
143
  return bestMove;
157
144
  }
158
- /**
159
- * Changes which player's turn it is.
160
- */
145
+ /** Changes which player's turn it is. */
161
146
  nextTurn() {
162
147
  this.currentPlayerId = (this.currentPlayerId + 1) % this.players.length;
163
148
  }
164
149
  /**
165
150
  * Makes a move.
166
- *
167
151
  * @param input Either the algorithm to use to calculate the move or the move itself.
168
152
  */
169
153
  async makeMove(input) {
@@ -171,15 +155,19 @@ export default class Controller extends EventEmitter {
171
155
  this.board.makeMove(this.determineCPUMove(this.currentPlayer.playerType, input), this.currentPlayer.id);
172
156
  }
173
157
  else {
174
- if (this.currentPlayer.playerType !== "human" || !this.board.moveIsValid(input))
175
- return void this.emit("invalidInput", input);
158
+ if (this.currentPlayer.playerType !== "human" || !this.board.moveIsValid(input)) {
159
+ this.emit("invalidInput", input);
160
+ return;
161
+ }
176
162
  this.board.makeMove(input, this.currentPlayer.id);
177
163
  }
178
164
  await this.render(this);
179
165
  const { winner } = this.board;
180
- if (winner !== false)
181
- return void this.emit("end", winner);
166
+ if (winner !== false) {
167
+ this.emit("end", winner);
168
+ return;
169
+ }
182
170
  this.nextTurn();
183
171
  }
184
172
  }
185
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iYXNlL2NvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQWU3QyxNQUFNLFVBQVUsSUFBSSxDQUFDLFdBQTRCO0lBQzdDLEtBQUssV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFHRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQWdCLFVBQVcsU0FBUSxZQUkvQztJQUNFOztPQUVHO0lBQ2EsTUFBTSxDQUFTO0lBRS9COztPQUVHO0lBQ2EsS0FBSyxDQUFRO0lBRTdCOztPQUVHO0lBQ2EsTUFBTSxDQUErQztJQUVyRTs7T0FFRztJQUNnQixPQUFPLENBQWlEO0lBRTNFOztPQUVHO0lBQ0ssZUFBZSxHQUFXLENBQUMsQ0FBQztJQUVwQzs7Ozs7OztPQU9HO0lBQ0gseURBQXlEO0lBQ3pELFlBQ0ksV0FBeUIsRUFDekIsS0FBWSxFQUNaLE1BQTRCLEVBQzVCLE1BQTBCLEVBQzFCLEtBQXVDLEVBQ3ZDLGNBQXlEO1FBRXpELEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFB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TSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDOUIsSUFBSSxNQUFNLEtBQUssS0FBSztZQUNoQixPQUFPLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BCLENBQUM7Q0FrQkoiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBCb2FyZCBmcm9tIFwiLi9ib2FyZC5qc1wiO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcImV2ZW50ZW1pdHRlcjNcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwiLi9ib2FyZC5qc1wiO1xuXG5leHBvcnQgdHlwZSBQbGF5ZXJUeXBlID0gXCJlYXN5Q1BVXCIgfCBcImhhcmRDUFVcIiB8IFwiaHVtYW5cIiB8IFwiaW1wb3NzaWJsZUNQVVwiIHwgXCJtZWRpdW1DUFVcIjtcbmV4cG9ydCB0eXBlIEFsZ29yaXRobSA9IFwiYWxwaGFiZXRhXCIgfCBcIm1pbmltYXhcIjtcbmV4cG9ydCBpbnRlcmZhY2UgR2FtZUNvbnN0cnVjdG9yT3B0aW9ucyB7XG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgb25FbmQ/OiAod2lubmVyOiBudW1iZXIgfCBudWxsKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbiAgICBvbkludmFsaWRJbnB1dD86IChwb3NpdGlvbjogUG9zaXRpb24pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICAgIHJlbmRlcmVyPzogKGNvbnRyb2xsZXI6IENvbnRyb2xsZXIpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xufVxuZXhwb3J0IGludGVyZmFjZSBHYW1lQ29uc3RydWN0b3Ige1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLWZ1bmN0aW9uLXR5cGVcbiAgICBuZXcgKHBsYXllck9uZVR5cGU6IFBsYXllclR5cGUsIHBsYXllclR3b1R5cGU6IFBsYXllclR5cGUsIG9wdGlvbnM/OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zKTogQ29udHJvbGxlcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHYW1lKGNvbnN0cnVjdG9yOiBHYW1lQ29uc3RydWN0b3IpOiB2b2lkIHtcbiAgICB2b2lkIGNvbnN0cnVjdG9yO1xufVxuXG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGdhbWUgY29udHJvbGxlci5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgQ29udHJvbGxlciBleHRlbmRzIEV2ZW50RW1pdHRlcjx7XG4gICAgZW5kOiBHYW1lQ29uc3RydWN0b3JPcHRpb25zW1wib25FbmRcIl07XG4gICAgaW5wdXQ6IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnNbXCJvbkludmFsaWRJbnB1dFwiXTtcbiAgICBpbnZhbGlkSW5wdXQ6IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnNbXCJvbkludmFsaWRJbnB1dFwiXTtcbn0+IHtcbiAgICAvKipcbiAgICAgKiBDb250YWlucyB0aGUgSUQgb2YgdGhlIGdhbWUuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IGdhbWVJRDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQ29udGFpbnMgdGhlIGJvYXJkLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBib2FyZDogQm9hcmQ7XG5cbiAgICAvKipcbiAgICAgKiBDb250YWlucyB0aGUgdmlldyBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IHJlbmRlcjogUmVxdWlyZWQ8R2FtZUNvbnN0cnVjdG9yT3B0aW9ucz5bXCJyZW5kZXJlclwiXTtcblxuICAgIC8qKlxuICAgICAqIENvbnRhaW5zIHRoZSBwbGF5ZXIgb2JqZWN0cy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGxheWVyczogQXJyYXk8eyBpZDogbnVtYmVyOyBwbGF5ZXJUeXBlOiBQbGF5ZXJUeXBlOyB9PjtcblxuICAgIC8qKlxuICAgICAqIENvbnRhaW5zIHRoZSBJRCBvZiB0aGUgY3VycmVudCBwbGF5ZXIuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjdXJyZW50UGxheWVySWQ6IG51bWJlciA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIENvbnRyb2xsZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGxheWVyVHlwZXMgVGhlIHR5cGVzIG9mIHBsYXllci5cbiAgICAgKiBAcGFyYW0gdmlldyBUaGUgdmlldyBvYmplY3QuXG4gICAgICogQHBhcmFtIGdhbWVJRCBUaGUgSUQgb2YgdGhlIGdhbWUuXG4gICAgICogQHBhcmFtIGJvYXJkIFRoZSBib2FyZC5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21heC1wYXJhbXNcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgICAgIHBsYXllclR5cGVzOiBQbGF5ZXJUeXBlW10sXG4gICAgICAgIGJvYXJkOiBCb2FyZCxcbiAgICAgICAgcmVuZGVyOiBDb250cm9sbGVyW1wicmVuZGVyXCJdLFxuICAgICAgICBnYW1lSUQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgb25FbmQ/OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zW1wib25FbmRcIl0sXG4gICAgICAgIG9uSW52YWxpZElucHV0PzogR2FtZUNvbnN0cnVjdG9yT3B0aW9uc1tcIm9uSW52YWxpZElucHV0XCJdXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZ2FtZUlEID0gZ2FtZUlEID8/IERhdGUubm93KCkudG9TdHJpbmcoMTYpO1xuICAgICAgICB0aGlzLmJvYXJkID0gYm9hcmQ7XG4gICAgICAgIHRoaXMuYm9hcmQuc2V0R2FtZUlEKHRoaXMuZ2FtZUlEKTtcbiAgICAgICAgdGhpcy5wbGF5ZXJzID0gcGxheWVyVHlwZXMubWFwKChwbGF5ZXJUeXBlLCBpZCkgPT4gKHsgaWQsIHBsYXllclR5cGUgfSkpO1xuICAgICAgICB0aGlzLnJlbmRlciA9IHJlbmRlcjtcbiAgICAgICAgaWYgKG9uRW5kICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLm9uKFwiZW5kXCIsIG9uRW5kKTtcbiAgICAgICAgaWYgKG9uSW52YWxpZElucHV0ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLm9uKFwiaW52YWxpZElucHV0XCIsIG9uSW52YWxpZElucHV0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHBsYXllciBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIGdldCBjdXJyZW50UGxheWVyKCk6IHsgaWQ6IG51bWJlcjsgcGxheWVyVHlwZTogUGxheWVyVHlwZTsgfSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllcnNbdGhpcy5jdXJyZW50UGxheWVySWRdITtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9scyB0aGUgbWFpbiBnYW1lIGZsb3cuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgd2lubmVyIG9yIG51bGwgaW4gdGhlIGV2ZW50IG9mIGEgdGllLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwbGF5KGFsZ29yaXRobTogQWxnb3JpdGhtID0gXCJhbHBoYWJldGFcIik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbmRlcih0aGlzKTtcbiAgICAgICAgdGhpcy5vbihcImlucHV0XCIsIGFzeW5jIChtb3ZlOiBQb3NpdGlvbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWtlTW92ZShtb3ZlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRQbGF5ZXIucGxheWVyVHlwZSAhPT0gXCJodW1hblwiKVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWFrZU1vdmUoYWxnb3JpdGhtKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHdoaWxlICh0aGlzLmN1cnJlbnRQbGF5ZXIucGxheWVyVHlwZSAhPT0gXCJodW1hblwiICYmIHRoaXMuYm9hcmQud2lubmVyID09PSBmYWxzZSlcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1ha2VNb3ZlKGFsZ29yaXRobSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJvZyBzdGFuZGFyZCBtaW5pbWF4IGFsZ29yaXRobS4gTGVmdCBpbiBmb3IgcmVmZXJlbmNlLlxuICAgICAqXG4gICAgICogQGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTWluaW1heFxuICAgICAqIEBwYXJhbSBkZXB0aCBUaGUgZGVwdGggb2YgdGhlIGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gbWF4aW1pc2luZ1BsYXllciBXaGV0aGVyIG9yIG5vdCB0aGUgY3VycmVudCBwbGF5ZXIgaXMgdGhlIG1heGltaXNpbmcgcGxheWVyLlxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpbWFsIG1vdmUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG1pbmltYXgoZGVwdGg6IG51bWJlciA9IEluZmluaXR5LCBtYXhpbWlzaW5nUGxheWVyOiBib29sZWFuID0gdHJ1ZSk6IHsgbW92ZTogUG9zaXRpb247IHNjb3JlOiBudW1iZXI7IH0ge1xuICAgICAgICBjb25zdCBwbGF5ZXJJZHMgPSBbKHRoaXMuY3VycmVudFBsYXllcklkICsgMSkgJSAyLCB0aGlzLmN1cnJlbnRQbGF5ZXJJZF0gYXMgY29uc3Q7XG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCB8fCB0aGlzLmJvYXJkLndpbm5lciAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgICAgIHNjb3JlOiB0aGlzLmJvYXJkLmhldXJpc3RpYyAqICh0aGlzLmN1cnJlbnRQbGF5ZXJJZCA9PT0gMCA/IDEgOiAtMSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGJlc3RNb3ZlOiBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLm1pbmltYXg+ID0ge1xuICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgc2NvcmU6IG1heGltaXNpbmdQbGF5ZXIgPyAtSW5maW5pdHkgOiBJbmZpbml0eVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB7IGVtcHR5Q2VsbHMgfSA9IHRoaXMuYm9hcmQ7XG4gICAgICAgIGZvciAoY29uc3QgbW92ZSBvZiBlbXB0eUNlbGxzKSB7XG4gICAgICAgICAgICB0aGlzLmJvYXJkLm1ha2VNb3ZlKG1vdmUsIHBsYXllcklkc1tOdW1iZXIobWF4aW1pc2luZ1BsYXllcildISk7XG4gICAgICAgICAgICBjb25zdCBzY29yZSA9ICg5IC0gZW1wdHlDZWxscy5sZW5ndGgpICogdGhpcy5taW5pbWF4KGRlcHRoIC0gMSwgIW1heGltaXNpbmdQbGF5ZXIpLnNjb3JlO1xuICAgICAgICAgICAgdGhpcy5ib2FyZC51bmRvTGFzdE1vdmUoKTtcbiAgICAgICAgICAgIGlmIChtYXhpbWlzaW5nUGxheWVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVzdFNjb3JlID0gTWF0aC5tYXgoc2NvcmUsIGJlc3RNb3ZlLnNjb3JlKTtcbiAgICAgICAgICAgICAgICBpZiAoYmVzdFNjb3JlICE9PSBiZXN0TW92ZS5zY29yZSlcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1vdmUgPSB7IG1vdmUsIHNjb3JlIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJlc3RTY29yZSA9IE1hdGgubWluKHNjb3JlLCBiZXN0TW92ZS5zY29yZSk7XG4gICAgICAgICAgICAgICAgaWYgKGJlc3RTY29yZSAhPT0gYmVzdE1vdmUuc2NvcmUpXG4gICAgICAgICAgICAgICAgICAgIGJlc3RNb3ZlID0geyBtb3ZlLCBzY29yZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZXN0TW92ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWluaW1heCBhbGdvcml0aG0gd2l0aCBhbHBoYS1iZXRhIHBydW5pbmcuXG4gICAgICpcbiAgICAgKiBAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NaW5pbWF4XG4gICAgICogQHBhcmFtIGRlcHRoIFRoZSBkZXB0aCBvZiB0aGUgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBhbHBoYSBUaGUgYm91bmRzIGZvciB0aGUgYWxwaGEtYmV0YSB2YXJpYXRpb24gb2YgdGhlIGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gYmV0YSBUaGUgYm91bmRzIGZvciB0aGUgYWxwaGEtYmV0YSB2YXJpYXRpb24gb2YgdGhlIGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gbWF4aW1pc2luZ1BsYXllciBXaGV0aGVyIG9yIG5vdCB0aGUgY3VycmVudCBwbGF5ZXIgaXMgdGhlIG1heGltaXNpbmcgcGxheWVyLlxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpbWFsIG1vdmUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFscGhhYmV0YShcbiAgICAgICAgZGVwdGg6IG51bWJlciA9IEluZmluaXR5LFxuICAgICAgICBhbHBoYTogbnVtYmVyID0gLUluZmluaXR5LFxuICAgICAgICBiZXRhOiBudW1iZXIgPSBJbmZpbml0eSxcbiAgICAgICAgbWF4aW1pc2luZ1BsYXllcjogYm9vbGVhbiA9IHRydWVcbiAgICApOiB7IG1vdmU6IFBvc2l0aW9uOyBzY29yZTogbnVtYmVyOyB9IHtcbiAgICAgICAgY29uc3QgcGxheWVySWRzID0gWyh0aGlzLmN1cnJlbnRQbGF5ZXJJZCArIDEpICUgMiwgdGhpcy5jdXJyZW50UGxheWVySWRdIGFzIGNvbnN0O1xuICAgICAgICBpZiAoZGVwdGggPT09IDAgfHwgdGhpcy5ib2FyZC53aW5uZXIgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1vdmU6IHsgeDogTmFOLCB5OiBOYU4gfSxcbiAgICAgICAgICAgICAgICBzY29yZTogdGhpcy5ib2FyZC5oZXVyaXN0aWMgKiAodGhpcy5jdXJyZW50UGxheWVySWQgPT09IDAgPyAxIDogLTEpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGxldCBiZXN0TW92ZTogUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5hbHBoYWJldGE+ID0ge1xuICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgc2NvcmU6IG1heGltaXNpbmdQbGF5ZXIgPyAtSW5maW5pdHkgOiBJbmZpbml0eVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB7IGVtcHR5Q2VsbHMgfSA9IHRoaXMuYm9hcmQ7XG4gICAgICAgIGZvciAoY29uc3QgbW92ZSBvZiBlbXB0eUNlbGxzKSB7XG4gICAgICAgICAgICB0aGlzLmJvYXJkLm1ha2VNb3ZlKG1vdmUsIHBsYXllcklkc1tOdW1iZXIobWF4aW1pc2luZ1BsYXllcildISk7XG4gICAgICAgICAgICBjb25zdCBzY29yZSA9ICg5IC0gZW1wdHlDZWxscy5sZW5ndGgpICogdGhpcy5hbHBoYWJldGEoZGVwdGggLSAxLCBhbHBoYSwgYmV0YSwgIW1heGltaXNpbmdQbGF5ZXIpLnNjb3JlO1xuICAgICAgICAgICAgdGhpcy5ib2FyZC51bmRvTGFzdE1vdmUoKTtcbiAgICAgICAgICAgIGlmIChtYXhpbWlzaW5nUGxheWVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVzdFNjb3JlID0gTWF0aC5tYXgoc2NvcmUsIGJlc3RNb3ZlLnNjb3JlKTtcbiAgICAgICAgICAgICAgICBpZiAoYmVzdFNjb3JlICE9PSBiZXN0TW92ZS5zY29yZSlcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1vdmUgPSB7IG1vdmUsIHNjb3JlIH07XG4gICAgICAgICAgICAgICAgaWYgKGJlc3RNb3ZlLnNjb3JlID4gYmV0YSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgYWxwaGEgPSBNYXRoLm1heChhbHBoYSwgYmVzdFNjb3JlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVzdFNjb3JlID0gTWF0aC5taW4oc2NvcmUsIGJlc3RNb3ZlLnNjb3JlKTtcbiAgICAgICAgICAgICAgICBpZiAoYmVzdFNjb3JlICE9PSBiZXN0TW92ZS5zY29yZSlcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1vdmUgPSB7IG1vdmUsIHNjb3JlIH07XG4gICAgICAgICAgICAgICAgaWYgKGJlc3RNb3ZlLnNjb3JlIDwgYWxwaGEpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIGJldGEgPSBNYXRoLm1pbihiZXRhLCBiZXN0U2NvcmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZXN0TW92ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIHdoaWNoIHBsYXllcidzIHR1cm4gaXQgaXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBuZXh0VHVybigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGxheWVySWQgPSAodGhpcy5jdXJyZW50UGxheWVySWQgKyAxKSAlIHRoaXMucGxheWVycy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZXMgYSBtb3ZlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlucHV0IEVpdGhlciB0aGUgYWxnb3JpdGhtIHRvIHVzZSB0byBjYWxjdWxhdGUgdGhlIG1vdmUgb3IgdGhlIG1vdmUgaXRzZWxmLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgbWFrZU1vdmUoaW5wdXQ6IEFsZ29yaXRobSB8IFBvc2l0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRoaXMuYm9hcmQubWFrZU1vdmUodGhpcy5kZXRlcm1pbmVDUFVNb3ZlKHRoaXMuY3VycmVudFBsYXllci5wbGF5ZXJUeXBlLCBpbnB1dCksIHRoaXMuY3VycmVudFBsYXllci5pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50UGxheWVyLnBsYXllclR5cGUgIT09IFwiaHVtYW5cIiB8fCAhdGhpcy5ib2FyZC5tb3ZlSXNWYWxpZChpbnB1dCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5lbWl0KFwiaW52YWxpZElucHV0XCIsIGlucHV0KTtcbiAgICAgICAgICAgIHRoaXMuYm9hcmQubWFrZU1vdmUoaW5wdXQsIHRoaXMuY3VycmVudFBsYXllci5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXIodGhpcyk7XG4gICAgICAgIGNvbnN0IHsgd2lubmVyIH0gPSB0aGlzLmJvYXJkO1xuICAgICAgICBpZiAod2lubmVyICE9PSBmYWxzZSlcbiAgICAgICAgICAgIHJldHVybiB2b2lkIHRoaXMuZW1pdChcImVuZFwiLCB3aW5uZXIpO1xuICAgICAgICB0aGlzLm5leHRUdXJuKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB0aGUgQ1BVIG1vdmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGlmZmljdWx0eSBUaGUgZGlmZmljdWx0eSBvZiB0aGUgQUkuXG4gICAgICogQHBhcmFtIGFsZ29yaXRobSBUaGUgYWxnb3JpdGhtIHRvIHVzZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgbW92ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZGV0ZXJtaW5lQ1BVTW92ZShkaWZmaWN1bHR5OiBPbWl0PFBsYXllclR5cGUsIFwiaHVtYW5cIj4sIGFsZ29yaXRobT86IEFsZ29yaXRobSk6IFBvc2l0aW9uO1xuXG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIG9wdGltYWwgbW92ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zLlxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpbWFsIG1vdmUuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGZpbmRPcHRpbWFsTW92ZShvcHRpb25zPzogeyBhbGdvcml0aG0/OiBBbGdvcml0aG07IG1heERlcHRoPzogbnVtYmVyOyByYW5kb21Nb3ZlPzogUG9zaXRpb247IH0pOiBQb3NpdGlvbjtcbn1cbiJdfQ==
173
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iYXNlL2NvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQWU3Qzs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsSUFBSSxDQUFDLFdBQTRCO0lBQzdDLEtBQUssV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxvQ0FBb0M7QUFDcEMsTUFBTSxDQUFDLE9BQU8sT0FBZ0IsVUFBVyxTQUFRLFlBSS9DO0lBQ0UsbUNBQW1DO0lBQ25CLE1BQU0sQ0FBUztJQUUvQiwwQkFBMEI7SUFDVixLQUFLLENBQVE7SUFFN0IsZ0NBQWdDO0lBQ2hCLE1BQU0sQ0FBK0M7SUFFckUsbUNBQW1DO0lBQ2hCLE9BQU8sQ0FBaUQ7SUFFM0UsNkNBQTZDO0lBQ3JDLGVBQWUsR0FBVyxDQUFDLENBQUM7SUFFcEM7Ozs7OztPQU1HO0lBQ0gsd0VBQXdFO0lBQ3hFLFlBQ0ksV0FBeUIsRUFDekIsS0FBWSxFQUNaLE1BQTRCLEVBQzVCLE1BQTBCLEVBQzFCLEtBQXVDLEVBQ3ZDLGNBQXlEO1FBRXpELEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLE1BQU0sR0FB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QUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRTlCLElBQUksTUFBTSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRXpCLE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BCLENBQUM7Q0FnQkoiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBCb2FyZCBmcm9tIFwiLi9ib2FyZC5qc1wiO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcImV2ZW50ZW1pdHRlcjNcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwiLi9ib2FyZC5qc1wiO1xuXG5leHBvcnQgdHlwZSBQbGF5ZXJUeXBlID0gXCJlYXN5Q1BVXCIgfCBcImhhcmRDUFVcIiB8IFwiaHVtYW5cIiB8IFwiaW1wb3NzaWJsZUNQVVwiIHwgXCJtZWRpdW1DUFVcIjtcbmV4cG9ydCB0eXBlIEFsZ29yaXRobSA9IFwiYWxwaGFiZXRhXCIgfCBcIm1pbmltYXhcIjtcbmV4cG9ydCB0eXBlIEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnMgPSB7XG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgb25FbmQ/OiAod2lubmVyOiBudW1iZXIgfCBudWxsKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbiAgICBvbkludmFsaWRJbnB1dD86IChwb3NpdGlvbjogUG9zaXRpb24pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICAgIHJlbmRlcmVyPzogKGNvbnRyb2xsZXI6IENvbnRyb2xsZXIpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xufTtcbmV4cG9ydCB0eXBlIEdhbWVDb25zdHJ1Y3RvciA9IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1mdW5jdGlvbi10eXBlXG4gICAgbmV3IChwbGF5ZXJPbmVUeXBlOiBQbGF5ZXJUeXBlLCBwbGF5ZXJUd29UeXBlOiBQbGF5ZXJUeXBlLCBvcHRpb25zPzogR2FtZUNvbnN0cnVjdG9yT3B0aW9ucyk6IENvbnRyb2xsZXI7XG59O1xuLyoqXG4gKiBEZWNvcmF0b3IgdG8gY2hlY2sgdGhhdCB0aGUgY29uc3RydWN0b3IgdHlwZSBmb3IgdGhlIGdpdmVuIGNsYXNzIGlzIGNvcnJlY3QuXG4gKiBAcGFyYW0gY29uc3RydWN0b3IgVGhlIGNsYXNzIHRvIGNoZWNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gR2FtZShjb25zdHJ1Y3RvcjogR2FtZUNvbnN0cnVjdG9yKTogdm9pZCB7XG4gICAgdm9pZCBjb25zdHJ1Y3Rvcjtcbn1cblxuLyoqIFJlcHJlc2VudHMgYSBnYW1lIGNvbnRyb2xsZXIuICovXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBDb250cm9sbGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyPHtcbiAgICBlbmQ6IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnNbXCJvbkVuZFwiXTtcbiAgICBpbnB1dDogR2FtZUNvbnN0cnVjdG9yT3B0aW9uc1tcIm9uSW52YWxpZElucHV0XCJdO1xuICAgIGludmFsaWRJbnB1dDogR2FtZUNvbnN0cnVjdG9yT3B0aW9uc1tcIm9uSW52YWxpZElucHV0XCJdO1xufT4ge1xuICAgIC8qKiBDb250YWlucyB0aGUgSUQgb2YgdGhlIGdhbWUuICovXG4gICAgcHVibGljIHJlYWRvbmx5IGdhbWVJRDogc3RyaW5nO1xuXG4gICAgLyoqIENvbnRhaW5zIHRoZSBib2FyZC4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgYm9hcmQ6IEJvYXJkO1xuXG4gICAgLyoqIENvbnRhaW5zIHRoZSB2aWV3IG9iamVjdC4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgcmVuZGVyOiBSZXF1aXJlZDxHYW1lQ29uc3RydWN0b3JPcHRpb25zPltcInJlbmRlcmVyXCJdO1xuXG4gICAgLyoqIENvbnRhaW5zIHRoZSBwbGF5ZXIgb2JqZWN0cy4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGxheWVyczogQXJyYXk8eyBpZDogbnVtYmVyOyBwbGF5ZXJUeXBlOiBQbGF5ZXJUeXBlOyB9PjtcblxuICAgIC8qKiBDb250YWlucyB0aGUgSUQgb2YgdGhlIGN1cnJlbnQgcGxheWVyLiAqL1xuICAgIHByaXZhdGUgY3VycmVudFBsYXllcklkOiBudW1iZXIgPSAwO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDb250cm9sbGVyLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJUeXBlcyBUaGUgdHlwZXMgb2YgcGxheWVyLlxuICAgICAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IG9iamVjdC5cbiAgICAgKiBAcGFyYW0gZ2FtZUlEIFRoZSBJRCBvZiB0aGUgZ2FtZS5cbiAgICAgKiBAcGFyYW0gYm9hcmQgVGhlIGJvYXJkLlxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbWF4LXBhcmFtcywgcmVxdWlyZS1qc2RvY1xuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICAgICAgcGxheWVyVHlwZXM6IFBsYXllclR5cGVbXSxcbiAgICAgICAgYm9hcmQ6IEJvYXJkLFxuICAgICAgICByZW5kZXI6IENvbnRyb2xsZXJbXCJyZW5kZXJcIl0sXG4gICAgICAgIGdhbWVJRDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICBvbkVuZD86IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnNbXCJvbkVuZFwiXSxcbiAgICAgICAgb25JbnZhbGlkSW5wdXQ/OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zW1wib25JbnZhbGlkSW5wdXRcIl0sXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZ2FtZUlEID0gZ2FtZUlEID8/IERhdGUubm93KCkudG9TdHJpbmcoMTYpO1xuICAgICAgICB0aGlzLmJvYXJkID0gYm9hcmQ7XG4gICAgICAgIHRoaXMuYm9hcmQuc2V0R2FtZUlEKHRoaXMuZ2FtZUlEKTtcbiAgICAgICAgdGhpcy5wbGF5ZXJzID0gcGxheWVyVHlwZXMubWFwKChwbGF5ZXJUeXBlLCBpZCkgPT4gKHsgaWQsIHBsYXllclR5cGUgfSkpO1xuICAgICAgICB0aGlzLnJlbmRlciA9IHJlbmRlcjtcblxuICAgICAgICBpZiAob25FbmQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRoaXMub24oXCJlbmRcIiwgb25FbmQpO1xuXG4gICAgICAgIGlmIChvbkludmFsaWRJbnB1dCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5vbihcImludmFsaWRJbnB1dFwiLCBvbkludmFsaWRJbnB1dCk7XG4gICAgfVxuXG4gICAgLyoqIEdldHMgdGhlIGN1cnJlbnQgcGxheWVyIG9iamVjdC4gKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRQbGF5ZXIoKTogeyBpZDogbnVtYmVyOyBwbGF5ZXJUeXBlOiBQbGF5ZXJUeXBlOyB9IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVyc1t0aGlzLmN1cnJlbnRQbGF5ZXJJZF0hO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHRoZSBtYWluIGdhbWUgZmxvdy5cbiAgICAgKiBAcGFyYW0gYWxnb3JpdGhtIFRoZSBhbGdvcml0aG0gdG8gdXNlLlxuICAgICAqIEByZXR1cm5zIFRoZSB3aW5uZXIgb3IgbnVsbCBpbiB0aGUgZXZlbnQgb2YgYSB0aWUuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXkoYWxnb3JpdGhtOiBBbGdvcml0aG0gPSBcImFscGhhYmV0YVwiKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVuZGVyKHRoaXMpO1xuICAgICAgICB0aGlzLm9uKFwiaW5wdXRcIiwgYXN5bmMgKG1vdmU6IFBvc2l0aW9uKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1ha2VNb3ZlKG1vdmUpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50UGxheWVyLnBsYXllclR5cGUgIT09IFwiaHVtYW5cIilcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1ha2VNb3ZlKGFsZ29yaXRobSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHdoaWxlICh0aGlzLmN1cnJlbnRQbGF5ZXIucGxheWVyVHlwZSAhPT0gXCJodW1hblwiICYmIHRoaXMuYm9hcmQud2lubmVyID09PSBmYWxzZSlcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1ha2VNb3ZlKGFsZ29yaXRobSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJvZyBzdGFuZGFyZCBtaW5pbWF4IGFsZ29yaXRobS4gTGVmdCBpbiBmb3IgcmVmZXJlbmNlLlxuICAgICAqIEBsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01pbmltYXhcbiAgICAgKiBAcGFyYW0gZGVwdGggVGhlIGRlcHRoIG9mIHRoZSBhbGdvcml0aG0uXG4gICAgICogQHBhcmFtIG1heGltaXNpbmdQbGF5ZXIgV2hldGhlciBvciBub3QgdGhlIGN1cnJlbnQgcGxheWVyIGlzIHRoZSBtYXhpbWlzaW5nIHBsYXllci5cbiAgICAgKiBAcmV0dXJucyBUaGUgb3B0aW1hbCBtb3ZlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBtaW5pbWF4KGRlcHRoOiBudW1iZXIgPSBJbmZpbml0eSwgbWF4aW1pc2luZ1BsYXllcjogYm9vbGVhbiA9IHRydWUpOiB7IG1vdmU6IFBvc2l0aW9uOyBzY29yZTogbnVtYmVyOyB9IHtcbiAgICAgICAgY29uc3QgcGxheWVySWRzID0gWyh0aGlzLmN1cnJlbnRQbGF5ZXJJZCArIDEpICUgMiwgdGhpcy5jdXJyZW50UGxheWVySWRdIGFzIGNvbnN0O1xuXG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCB8fCB0aGlzLmJvYXJkLndpbm5lciAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgICAgIHNjb3JlOiB0aGlzLmJvYXJkLmhldXJpc3RpYyAqICh0aGlzLmN1cnJlbnRQbGF5ZXJJZCA9PT0gMCA/IDEgOiAtMSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJlc3RNb3ZlOiBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLm1pbmltYXg+ID0ge1xuICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgc2NvcmU6IG1heGltaXNpbmdQbGF5ZXIgPyAtSW5maW5pdHkgOiBJbmZpbml0eSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgeyBlbXB0eUNlbGxzIH0gPSB0aGlzLmJvYXJkO1xuXG4gICAgICAgIGZvciAoY29uc3QgbW92ZSBvZiBlbXB0eUNlbGxzKSB7XG4gICAgICAgICAgICB0aGlzLmJvYXJkLm1ha2VNb3ZlKG1vdmUsIHBsYXllcklkc1tOdW1iZXIobWF4aW1pc2luZ1BsYXllcildISk7XG4gICAgICAgICAgICBjb25zdCBzY29yZSA9ICg5IC0gZW1wdHlDZWxscy5sZW5ndGgpICogdGhpcy5taW5pbWF4KGRlcHRoIC0gMSwgIW1heGltaXNpbmdQbGF5ZXIpLnNjb3JlO1xuXG4gICAgICAgICAgICB0aGlzLmJvYXJkLnVuZG9MYXN0TW92ZSgpO1xuXG4gICAgICAgICAgICBpZiAobWF4aW1pc2luZ1BsYXllcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJlc3RTY29yZSA9IE1hdGgubWF4KHNjb3JlLCBiZXN0TW92ZS5zY29yZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYmVzdFNjb3JlICE9PSBiZXN0TW92ZS5zY29yZSlcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1vdmUgPSB7IG1vdmUsIHNjb3JlIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJlc3RTY29yZSA9IE1hdGgubWluKHNjb3JlLCBiZXN0TW92ZS5zY29yZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYmVzdFNjb3JlICE9PSBiZXN0TW92ZS5zY29yZSlcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1vdmUgPSB7IG1vdmUsIHNjb3JlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYmVzdE1vdmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG1pbmltYXggYWxnb3JpdGhtIHdpdGggYWxwaGEtYmV0YSBwcnVuaW5nLlxuICAgICAqIEBsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01pbmltYXhcbiAgICAgKiBAcGFyYW0gZGVwdGggVGhlIGRlcHRoIG9mIHRoZSBhbGdvcml0aG0uXG4gICAgICogQHBhcmFtIGFscGhhIFRoZSBib3VuZHMgZm9yIHRoZSBhbHBoYS1iZXRhIHZhcmlhdGlvbiBvZiB0aGUgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBiZXRhIFRoZSBib3VuZHMgZm9yIHRoZSBhbHBoYS1iZXRhIHZhcmlhdGlvbiBvZiB0aGUgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBtYXhpbWlzaW5nUGxheWVyIFdoZXRoZXIgb3Igbm90IHRoZSBjdXJyZW50IHBsYXllciBpcyB0aGUgbWF4aW1pc2luZyBwbGF5ZXIuXG4gICAgICogQHJldHVybnMgVGhlIG9wdGltYWwgbW92ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWxwaGFiZXRhKFxuICAgICAgICBkZXB0aDogbnVtYmVyID0gSW5maW5pdHksXG4gICAgICAgIGFscGhhOiBudW1iZXIgPSAtSW5maW5pdHksXG4gICAgICAgIGJldGE6IG51bWJlciA9IEluZmluaXR5LFxuICAgICAgICBtYXhpbWlzaW5nUGxheWVyOiBib29sZWFuID0gdHJ1ZSxcbiAgICApOiB7IG1vdmU6IFBvc2l0aW9uOyBzY29yZTogbnVtYmVyOyB9IHtcbiAgICAgICAgY29uc3QgcGxheWVySWRzID0gWyh0aGlzLmN1cnJlbnRQbGF5ZXJJZCArIDEpICUgMiwgdGhpcy5jdXJyZW50UGxheWVySWRdIGFzIGNvbnN0O1xuXG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCB8fCB0aGlzLmJvYXJkLndpbm5lciAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgICAgIHNjb3JlOiB0aGlzLmJvYXJkLmhldXJpc3RpYyAqICh0aGlzLmN1cnJlbnRQbGF5ZXJJZCA9PT0gMCA/IDEgOiAtMSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJlc3RNb3ZlOiBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmFscGhhYmV0YT4gPSB7XG4gICAgICAgICAgICBtb3ZlOiB7IHg6IE5hTiwgeTogTmFOIH0sXG4gICAgICAgICAgICBzY29yZTogbWF4aW1pc2luZ1BsYXllciA/IC1JbmZpbml0eSA6IEluZmluaXR5LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB7IGVtcHR5Q2VsbHMgfSA9IHRoaXMuYm9hcmQ7XG5cbiAgICAgICAgZm9yIChjb25zdCBtb3ZlIG9mIGVtcHR5Q2VsbHMpIHtcbiAgICAgICAgICAgIHRoaXMuYm9hcmQubWFrZU1vdmUobW92ZSwgcGxheWVySWRzW051bWJlcihtYXhpbWlzaW5nUGxheWVyKV0hKTtcbiAgICAgICAgICAgIGNvbnN0IHNjb3JlID0gKDkgLSBlbXB0eUNlbGxzLmxlbmd0aCkgKiB0aGlzLmFscGhhYmV0YShkZXB0aCAtIDEsIGFscGhhLCBiZXRhLCAhbWF4aW1pc2luZ1BsYXllcikuc2NvcmU7XG5cbiAgICAgICAgICAgIHRoaXMuYm9hcmQudW5kb0xhc3RNb3ZlKCk7XG5cbiAgICAgICAgICAgIGlmIChtYXhpbWlzaW5nUGxheWVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVzdFNjb3JlID0gTWF0aC5tYXgoc2NvcmUsIGJlc3RNb3ZlLnNjb3JlKTtcblxuICAgICAgICAgICAgICAgIGlmIChiZXN0U2NvcmUgIT09IGJlc3RNb3ZlLnNjb3JlKVxuICAgICAgICAgICAgICAgICAgICBiZXN0TW92ZSA9IHsgbW92ZSwgc2NvcmUgfTtcblxuICAgICAgICAgICAgICAgIGlmIChiZXN0TW92ZS5zY29yZSA+IGJldGEpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgYWxwaGEgPSBNYXRoLm1heChhbHBoYSwgYmVzdFNjb3JlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVzdFNjb3JlID0gTWF0aC5taW4oc2NvcmUsIGJlc3RNb3ZlLnNjb3JlKTtcblxuICAgICAgICAgICAgICAgIGlmIChiZXN0U2NvcmUgIT09IGJlc3RNb3ZlLnNjb3JlKVxuICAgICAgICAgICAgICAgICAgICBiZXN0TW92ZSA9IHsgbW92ZSwgc2NvcmUgfTtcblxuICAgICAgICAgICAgICAgIGlmIChiZXN0TW92ZS5zY29yZSA8IGFscGhhKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIGJldGEgPSBNYXRoLm1pbihiZXRhLCBiZXN0U2NvcmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJlc3RNb3ZlO1xuICAgIH1cblxuICAgIC8qKiBDaGFuZ2VzIHdoaWNoIHBsYXllcidzIHR1cm4gaXQgaXMuICovXG4gICAgcHJpdmF0ZSBuZXh0VHVybigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGxheWVySWQgPSAodGhpcy5jdXJyZW50UGxheWVySWQgKyAxKSAlIHRoaXMucGxheWVycy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZXMgYSBtb3ZlLlxuICAgICAqIEBwYXJhbSBpbnB1dCBFaXRoZXIgdGhlIGFsZ29yaXRobSB0byB1c2UgdG8gY2FsY3VsYXRlIHRoZSBtb3ZlIG9yIHRoZSBtb3ZlIGl0c2VsZi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIG1ha2VNb3ZlKGlucHV0OiBBbGdvcml0aG0gfCBQb3NpdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aGlzLmJvYXJkLm1ha2VNb3ZlKHRoaXMuZGV0ZXJtaW5lQ1BVTW92ZSh0aGlzLmN1cnJlbnRQbGF5ZXIucGxheWVyVHlwZSwgaW5wdXQpLCB0aGlzLmN1cnJlbnRQbGF5ZXIuaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFBsYXllci5wbGF5ZXJUeXBlICE9PSBcImh1bWFuXCIgfHwgIXRoaXMuYm9hcmQubW92ZUlzVmFsaWQoaW5wdXQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiaW52YWxpZElucHV0XCIsIGlucHV0KTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5ib2FyZC5tYWtlTW92ZShpbnB1dCwgdGhpcy5jdXJyZW50UGxheWVyLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMucmVuZGVyKHRoaXMpO1xuICAgICAgICBjb25zdCB7IHdpbm5lciB9ID0gdGhpcy5ib2FyZDtcblxuICAgICAgICBpZiAod2lubmVyICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwiZW5kXCIsIHdpbm5lcik7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubmV4dFR1cm4oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIHRoZSBDUFUgbW92ZS5cbiAgICAgKiBAcGFyYW0gZGlmZmljdWx0eSBUaGUgZGlmZmljdWx0eSBvZiB0aGUgQUkuXG4gICAgICogQHBhcmFtIGFsZ29yaXRobSBUaGUgYWxnb3JpdGhtIHRvIHVzZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgbW92ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZGV0ZXJtaW5lQ1BVTW92ZShkaWZmaWN1bHR5OiBPbWl0PFBsYXllclR5cGUsIFwiaHVtYW5cIj4sIGFsZ29yaXRobT86IEFsZ29yaXRobSk6IFBvc2l0aW9uO1xuXG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIG9wdGltYWwgbW92ZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucy5cbiAgICAgKiBAcmV0dXJucyBUaGUgb3B0aW1hbCBtb3ZlLlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBmaW5kT3B0aW1hbE1vdmUob3B0aW9ucz86IHsgYWxnb3JpdGhtPzogQWxnb3JpdGhtOyBtYXhEZXB0aD86IG51bWJlcjsgcmFuZG9tTW92ZT86IFBvc2l0aW9uOyB9KTogUG9zaXRpb247XG59XG4iXX0=
@@ -2,74 +2,57 @@
2
2
  import type { StringType } from "./longInt.js";
3
3
  /**
4
4
  * Represents a BitBoard.
5
- *
6
5
  * @link https://en.wikipedia.org/wiki/Bitboard
7
6
  */
8
7
  export default abstract class BitBoard<T extends LongInt | number = LongInt | number> {
9
- /**
10
- * The numeric data.
11
- */
8
+ /** The numeric data. */
12
9
  protected _data: T;
13
10
  /**
14
11
  * Creates an instance of BitBoard.
15
- *
16
12
  * @param data The data to assign to the BitBoard.
17
13
  */
18
14
  protected constructor(data: T);
19
- /**
20
- * Gets the numeric data.
21
- */
15
+ /** Gets the numeric data. */
22
16
  get data(): T;
23
17
  /**
24
18
  * Returns a string representation of the BitBoard.
25
- *
26
19
  * @param type The base of the string to print.
27
20
  * @returns The string representation.
28
21
  */
29
22
  toString(type?: StringType): string;
30
23
  /**
31
24
  * Assigns a given bit a given value.
32
- *
33
25
  * @param bit The x coordinate.
34
26
  * @param value The value to assign to the bit.
35
27
  */
36
28
  assignBit(bit: number, value: 0 | 1): void;
37
29
  /**
38
- * Gets a given bit, based on it's x, y coordinates.
39
- *
30
+ * Gets a given bit
40
31
  * @param bit The index of the bit to get, 0 = LSB.
41
32
  * @returns The bit.
42
33
  */
43
34
  abstract getBit(bit: number): 0 | 1;
44
35
  /**
45
- * Sets a given bit (changes the value to 1), based on it's x, y coordinates.
46
- *
36
+ * Sets a given bit (changes the value to 1)
47
37
  * @param bit The index of the bit to get, 0 = LSB.
48
38
  */
49
39
  abstract setBit(bit: number): void;
50
40
  /**
51
- * Clears a given bit (changes the value to 0), based on it's x, y coordinates.
52
- *
41
+ * Clears a given bit (changes the value to 0)
53
42
  * @param bit The index of the bit to get, 0 = LSB.
54
43
  */
55
44
  abstract clearBit(bit: number): void;
56
45
  /**
57
- * Toggles a given bit (changes the value from 0 to 1 or 1 to 0), based on it's x, y coordinates.
58
- *
46
+ * Toggles a given bit (changes the value from 0 to 1 or 1 to 0)
59
47
  * @param bit The index of the bit to get, 0 = LSB.
60
48
  */
61
49
  abstract toggleBit(bit: number): void;
62
- /**
63
- * Clears the whole BitBoard (sets all values to 0).
64
- */
50
+ /** Clears the whole BitBoard (sets all values to 0). */
65
51
  abstract clearAll(): void;
66
- /**
67
- * Set the whole BitBoard (sets all values to 1).
68
- */
52
+ /** Set the whole BitBoard (sets all values to 1). */
69
53
  abstract setAll(): void;
70
54
  /**
71
55
  * Gets a range of bits.
72
- *
73
56
  * @param LSB The least significant bit.
74
57
  * @param numberOfBits The number of bits to get.
75
58
  * @returns The range of bits.
@@ -77,55 +60,47 @@ export default abstract class BitBoard<T extends LongInt | number = LongInt | nu
77
60
  abstract getBits(LSB: number, numberOfBits: number): T;
78
61
  /**
79
62
  * Carries out a bitwise and (&) operation.
80
- *
81
63
  * @param right The right value.
82
64
  * @returns The result.
83
65
  */
84
66
  abstract and(right: BitBoard<T> | T | number): this;
85
67
  /**
86
68
  * Carries out a bitwise or (|) operation.
87
- *
88
69
  * @param right The right value.
89
70
  * @returns The result.
90
71
  */
91
72
  abstract or(right: BitBoard<T> | T | number): this;
92
73
  /**
93
74
  * Carries out a bitwise xor (^) operation.
94
- *
95
75
  * @param right The right value.
96
76
  * @returns The result.
97
77
  */
98
78
  abstract xor(right: BitBoard<T> | T | number): this;
99
79
  /**
100
80
  * Carries out a bitwise not (~) operation.
101
- *
102
81
  * @returns The result.
103
82
  */
104
83
  abstract not(): this;
105
84
  /**
106
85
  * Carries out a bitwise left shift (<<) operation.
107
- *
108
86
  * @param shiftAmount How much to shift it by.
109
87
  * @returns The result.
110
88
  */
111
89
  abstract leftShift(shiftAmount: number): this;
112
90
  /**
113
91
  * Carries out a bitwise logical right shift (>>>) operation.
114
- *
115
92
  * @param shiftAmount How much to shift it by.
116
93
  * @returns The result.
117
94
  */
118
95
  abstract rightShift(shiftAmount: number): this;
119
96
  /**
120
97
  * Carries out a bitwise arithmetic right shift (>>) operation.
121
- *
122
98
  * @param shiftAmount How much to shift it by.
123
99
  * @returns The result.
124
100
  */
125
101
  abstract arithmeticRightShift(shiftAmount: number): this;
126
102
  /**
127
103
  * Checks if two BitBoards have equal data values.
128
- *
129
104
  * @param value The value to compare against.
130
105
  * @returns Whether or not the two BitBoard have the same data value.
131
106
  */
@@ -1,30 +1,23 @@
1
1
  /**
2
2
  * Represents a BitBoard.
3
- *
4
3
  * @link https://en.wikipedia.org/wiki/Bitboard
5
4
  */
6
5
  export default class BitBoard {
7
- /**
8
- * The numeric data.
9
- */
6
+ /** The numeric data. */
10
7
  _data;
11
8
  /**
12
9
  * Creates an instance of BitBoard.
13
- *
14
10
  * @param data The data to assign to the BitBoard.
15
11
  */
16
12
  constructor(data) {
17
13
  this._data = data;
18
14
  }
19
- /**
20
- * Gets the numeric data.
21
- */
15
+ /** Gets the numeric data. */
22
16
  get data() {
23
17
  return this._data;
24
18
  }
25
19
  /**
26
20
  * Returns a string representation of the BitBoard.
27
- *
28
21
  * @param type The base of the string to print.
29
22
  * @returns The string representation.
30
23
  */
@@ -45,12 +38,14 @@ export default class BitBoard {
45
38
  }
46
39
  /**
47
40
  * Assigns a given bit a given value.
48
- *
49
41
  * @param bit The x coordinate.
50
42
  * @param value The value to assign to the bit.
51
43
  */
52
44
  assignBit(bit, value) {
53
- return value === 0 ? this.clearBit(bit) : this.setBit(bit);
45
+ if (value === 0)
46
+ this.clearBit(bit);
47
+ else
48
+ this.setBit(bit);
54
49
  }
55
50
  }
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0Qm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYml0Qm9hcmQvYml0Qm9hcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0E7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQWdCLFFBQVE7SUFDbEM7O09BRUc7SUFDTyxLQUFLLENBQUk7SUFFbkI7Ozs7T0FJRztJQUNILFlBQXNCLElBQU87UUFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7SUFDdEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxJQUFJO1FBQ1gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFFBQVEsQ0FBQyxPQUFtQixFQUFFO1FBQ2pDLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixRQUFRLElBQUksRUFBRSxDQUFDO1lBQ1gsS0FBSyxDQUFDO2dCQUNGLFNBQVMsR0FBRyxFQUFFLENBQUM7Z0JBQ2YsTUFBTTtZQUNWLEtBQUssRUFBRTtnQkFDSCxTQUFTLEdBQUcsRUFBRSxDQUFDO2dCQUNmLE1BQU07WUFDVixLQUFLLEVBQUU7Z0JBQ0gsU0FBUyxHQUFHLENBQUMsQ0FBQztnQkFDZCxNQUFNO1FBQ2QsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxTQUFTLENBQUMsR0FBVyxFQUFFLEtBQVk7UUFDdEMsT0FBTyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9ELENBQUM7Q0FnSEoiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBMb25nSW50IGZyb20gXCIuL2xvbmdJbnQuanNcIjtcbmltcG9ydCB0eXBlIHsgU3RyaW5nVHlwZSB9IGZyb20gXCIuL2xvbmdJbnQuanNcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgQml0Qm9hcmQuXG4gKlxuICogQGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQml0Ym9hcmRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgQml0Qm9hcmQ8VCBleHRlbmRzIExvbmdJbnQgfCBudW1iZXIgPSBMb25nSW50IHwgbnVtYmVyPiB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgZGF0YS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2RhdGE6IFQ7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEJpdEJvYXJkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gYXNzaWduIHRvIHRoZSBCaXRCb2FyZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoZGF0YTogVCkge1xuICAgICAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBudW1lcmljIGRhdGEuXG4gICAgICovXG4gICAgcHVibGljIGdldCBkYXRhKCk6IFQge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBCaXRCb2FyZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0eXBlIFRoZSBiYXNlIG9mIHRoZSBzdHJpbmcgdG8gcHJpbnQuXG4gICAgICogQHJldHVybnMgVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9TdHJpbmcodHlwZTogU3RyaW5nVHlwZSA9IDE2KTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHBhZExlbmd0aCA9IDA7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHBhZExlbmd0aCA9IDMyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICBwYWRMZW5ndGggPSAxMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgcGFkTGVuZ3RoID0gODtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS50b1N0cmluZyh0eXBlKS5wYWRTdGFydChwYWRMZW5ndGgsIFwiMFwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3NpZ25zIGEgZ2l2ZW4gYml0IGEgZ2l2ZW4gdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYml0IFRoZSB4IGNvb3JkaW5hdGUuXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24gdG8gdGhlIGJpdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzaWduQml0KGJpdDogbnVtYmVyLCB2YWx1ZTogMCB8IDEpOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSAwID8gdGhpcy5jbGVhckJpdChiaXQpIDogdGhpcy5zZXRCaXQoYml0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgZ2l2ZW4gYml0LCBiYXNlZCBvbiBpdCdzIHgsIHkgY29vcmRpbmF0ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYml0IFRoZSBpbmRleCBvZiB0aGUgYml0IHRvIGdldCwgMCA9IExTQi5cbiAgICAgKiBAcmV0dXJucyBUaGUgYml0LlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXRCaXQoYml0OiBudW1iZXIpOiAwIHwgMTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgYSBnaXZlbiBiaXQgKGNoYW5nZXMgdGhlIHZhbHVlIHRvIDEpLCBiYXNlZCBvbiBpdCdzIHgsIHkgY29vcmRpbmF0ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYml0IFRoZSBpbmRleCBvZiB0aGUgYml0IHRvIGdldCwgMCA9IExTQi5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3Qgc2V0Qml0KGJpdDogbnVtYmVyKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIENsZWFycyBhIGdpdmVuIGJpdCAoY2hhbmdlcyB0aGUgdmFsdWUgdG8gMCksIGJhc2VkIG9uIGl0J3MgeCwgeSBjb29yZGluYXRlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBiaXQgVGhlIGluZGV4IG9mIHRoZSBiaXQgdG8gZ2V0LCAwID0gTFNCLlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBjbGVhckJpdChiaXQ6IG51bWJlcik6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIGEgZ2l2ZW4gYml0IChjaGFuZ2VzIHRoZSB2YWx1ZSBmcm9tIDAgdG8gMSBvciAxIHRvIDApLCBiYXNlZCBvbiBpdCdzIHgsIHkgY29vcmRpbmF0ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYml0IFRoZSBpbmRleCBvZiB0aGUgYml0IHRvIGdldCwgMCA9IExTQi5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgdG9nZ2xlQml0KGJpdDogbnVtYmVyKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgd2hvbGUgQml0Qm9hcmQgKHNldHMgYWxsIHZhbHVlcyB0byAwKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgY2xlYXJBbGwoKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgd2hvbGUgQml0Qm9hcmQgKHNldHMgYWxsIHZhbHVlcyB0byAxKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3Qgc2V0QWxsKCk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgcmFuZ2Ugb2YgYml0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBMU0IgVGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC5cbiAgICAgKiBAcGFyYW0gbnVtYmVyT2ZCaXRzIFRoZSBudW1iZXIgb2YgYml0cyB0byBnZXQuXG4gICAgICogQHJldHVybnMgVGhlIHJhbmdlIG9mIGJpdHMuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGdldEJpdHMoTFNCOiBudW1iZXIsIG51bWJlck9mQml0czogbnVtYmVyKTogVDtcblxuICAgIC8qKlxuICAgICAqIENhcnJpZXMgb3V0IGEgYml0d2lzZSBhbmQgKCYpIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgdmFsdWUuXG4gICAgICogQHJldHVybnMgVGhlIHJlc3VsdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgYW5kKHJpZ2h0OiBCaXRCb2FyZDxUPiB8IFQgfCBudW1iZXIpOiB0aGlzO1xuXG4gICAgLyoqXG4gICAgICogQ2FycmllcyBvdXQgYSBiaXR3aXNlIG9yICh8KSBvcGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IG9yKHJpZ2h0OiBCaXRCb2FyZDxUPiB8IFQgfCBudW1iZXIpOiB0aGlzO1xuXG4gICAgLyoqXG4gICAgICogQ2FycmllcyBvdXQgYSBiaXR3aXNlIHhvciAoXikgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJpZ2h0IFRoZSByaWdodCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0LlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCB4b3IocmlnaHQ6IEJpdEJvYXJkPFQ+IHwgVCB8IG51bWJlcik6IHRoaXM7XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2Ugbm90ICh+KSBvcGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0LlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBub3QoKTogdGhpcztcblxuICAgIC8qKlxuICAgICAqIENhcnJpZXMgb3V0IGEgYml0d2lzZSBsZWZ0IHNoaWZ0ICg8PCkgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNoaWZ0QW1vdW50IEhvdyBtdWNoIHRvIHNoaWZ0IGl0IGJ5LlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGxlZnRTaGlmdChzaGlmdEFtb3VudDogbnVtYmVyKTogdGhpcztcblxuICAgIC8qKlxuICAgICAqIENhcnJpZXMgb3V0IGEgYml0d2lzZSBsb2dpY2FsIHJpZ2h0IHNoaWZ0ICg+Pj4pIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzaGlmdEFtb3VudCBIb3cgbXVjaCB0byBzaGlmdCBpdCBieS5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0LlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCByaWdodFNoaWZ0KHNoaWZ0QW1vdW50OiBudW1iZXIpOiB0aGlzO1xuXG4gICAgLyoqXG4gICAgICogQ2FycmllcyBvdXQgYSBiaXR3aXNlIGFyaXRobWV0aWMgcmlnaHQgc2hpZnQgKD4+KSBvcGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2hpZnRBbW91bnQgSG93IG11Y2ggdG8gc2hpZnQgaXQgYnkuXG4gICAgICogQHJldHVybnMgVGhlIHJlc3VsdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgYXJpdGhtZXRpY1JpZ2h0U2hpZnQoc2hpZnRBbW91bnQ6IG51bWJlcik6IHRoaXM7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdHdvIEJpdEJvYXJkcyBoYXZlIGVxdWFsIGRhdGEgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlIGFnYWluc3QuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIHR3byBCaXRCb2FyZCBoYXZlIHRoZSBzYW1lIGRhdGEgdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGVxdWFscyh2YWx1ZTogQml0Qm9hcmQ8VD4gfCBUIHwgbnVtYmVyKTogYm9vbGVhbjtcbn1cbiJdfQ==
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0Qm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYml0Qm9hcmQvYml0Qm9hcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0E7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBZ0IsUUFBUTtJQUNsQyx3QkFBd0I7SUFDZCxLQUFLLENBQUk7SUFFbkI7OztPQUdHO0lBQ0gsWUFBc0IsSUFBTztRQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUN0QixDQUFDO0lBRUQsNkJBQTZCO0lBQzdCLElBQVcsSUFBSTtRQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFFBQVEsQ0FBQyxPQUFtQixFQUFFO1FBQ2pDLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUVsQixRQUFRLElBQUksRUFBRSxDQUFDO1lBQ1gsS0FBSyxDQUFDO2dCQUNGLFNBQVMsR0FBRyxFQUFFLENBQUM7Z0JBQ2YsTUFBTTtZQUNWLEtBQUssRUFBRTtnQkFDSCxTQUFTLEdBQUcsRUFBRSxDQUFDO2dCQUNmLE1BQU07WUFDVixLQUFLLEVBQUU7Z0JBQ0gsU0FBUyxHQUFHLENBQUMsQ0FBQztnQkFDZCxNQUFNO1FBQ2QsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFNBQVMsQ0FBQyxHQUFXLEVBQUUsS0FBWTtRQUN0QyxJQUFJLEtBQUssS0FBSyxDQUFDO1lBQ1gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7WUFFbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0NBK0ZKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgTG9uZ0ludCBmcm9tIFwiLi9sb25nSW50LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFN0cmluZ1R5cGUgfSBmcm9tIFwiLi9sb25nSW50LmpzXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIEJpdEJvYXJkLlxuICogQGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQml0Ym9hcmRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgQml0Qm9hcmQ8VCBleHRlbmRzIExvbmdJbnQgfCBudW1iZXIgPSBMb25nSW50IHwgbnVtYmVyPiB7XG4gICAgLyoqIFRoZSBudW1lcmljIGRhdGEuICovXG4gICAgcHJvdGVjdGVkIF9kYXRhOiBUO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBCaXRCb2FyZC5cbiAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBhc3NpZ24gdG8gdGhlIEJpdEJvYXJkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihkYXRhOiBUKSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xuICAgIH1cblxuICAgIC8qKiBHZXRzIHRoZSBudW1lcmljIGRhdGEuICovXG4gICAgcHVibGljIGdldCBkYXRhKCk6IFQge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBCaXRCb2FyZC5cbiAgICAgKiBAcGFyYW0gdHlwZSBUaGUgYmFzZSBvZiB0aGUgc3RyaW5nIHRvIHByaW50LlxuICAgICAqIEByZXR1cm5zIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uXG4gICAgICovXG4gICAgcHVibGljIHRvU3RyaW5nKHR5cGU6IFN0cmluZ1R5cGUgPSAxNik6IHN0cmluZyB7XG4gICAgICAgIGxldCBwYWRMZW5ndGggPSAwO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHBhZExlbmd0aCA9IDMyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICBwYWRMZW5ndGggPSAxMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgcGFkTGVuZ3RoID0gODtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnRvU3RyaW5nKHR5cGUpLnBhZFN0YXJ0KHBhZExlbmd0aCwgXCIwXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzc2lnbnMgYSBnaXZlbiBiaXQgYSBnaXZlbiB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gYml0IFRoZSB4IGNvb3JkaW5hdGUuXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24gdG8gdGhlIGJpdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzaWduQml0KGJpdDogbnVtYmVyLCB2YWx1ZTogMCB8IDEpOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSAwKVxuICAgICAgICAgICAgdGhpcy5jbGVhckJpdChiaXQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnNldEJpdChiaXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBnaXZlbiBiaXRcbiAgICAgKiBAcGFyYW0gYml0IFRoZSBpbmRleCBvZiB0aGUgYml0IHRvIGdldCwgMCA9IExTQi5cbiAgICAgKiBAcmV0dXJucyBUaGUgYml0LlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXRCaXQoYml0OiBudW1iZXIpOiAwIHwgMTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgYSBnaXZlbiBiaXQgKGNoYW5nZXMgdGhlIHZhbHVlIHRvIDEpXG4gICAgICogQHBhcmFtIGJpdCBUaGUgaW5kZXggb2YgdGhlIGJpdCB0byBnZXQsIDAgPSBMU0IuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IHNldEJpdChiaXQ6IG51bWJlcik6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYSBnaXZlbiBiaXQgKGNoYW5nZXMgdGhlIHZhbHVlIHRvIDApXG4gICAgICogQHBhcmFtIGJpdCBUaGUgaW5kZXggb2YgdGhlIGJpdCB0byBnZXQsIDAgPSBMU0IuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGNsZWFyQml0KGJpdDogbnVtYmVyKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgYSBnaXZlbiBiaXQgKGNoYW5nZXMgdGhlIHZhbHVlIGZyb20gMCB0byAxIG9yIDEgdG8gMClcbiAgICAgKiBAcGFyYW0gYml0IFRoZSBpbmRleCBvZiB0aGUgYml0IHRvIGdldCwgMCA9IExTQi5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgdG9nZ2xlQml0KGJpdDogbnVtYmVyKTogdm9pZDtcblxuICAgIC8qKiBDbGVhcnMgdGhlIHdob2xlIEJpdEJvYXJkIChzZXRzIGFsbCB2YWx1ZXMgdG8gMCkuICovXG4gICAgcHVibGljIGFic3RyYWN0IGNsZWFyQWxsKCk6IHZvaWQ7XG5cbiAgICAvKiogU2V0IHRoZSB3aG9sZSBCaXRCb2FyZCAoc2V0cyBhbGwgdmFsdWVzIHRvIDEpLiAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBzZXRBbGwoKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIEdldHMgYSByYW5nZSBvZiBiaXRzLlxuICAgICAqIEBwYXJhbSBMU0IgVGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC5cbiAgICAgKiBAcGFyYW0gbnVtYmVyT2ZCaXRzIFRoZSBudW1iZXIgb2YgYml0cyB0byBnZXQuXG4gICAgICogQHJldHVybnMgVGhlIHJhbmdlIG9mIGJpdHMuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGdldEJpdHMoTFNCOiBudW1iZXIsIG51bWJlck9mQml0czogbnVtYmVyKTogVDtcblxuICAgIC8qKlxuICAgICAqIENhcnJpZXMgb3V0IGEgYml0d2lzZSBhbmQgKCYpIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGFuZChyaWdodDogQml0Qm9hcmQ8VD4gfCBUIHwgbnVtYmVyKTogdGhpcztcblxuICAgIC8qKlxuICAgICAqIENhcnJpZXMgb3V0IGEgYml0d2lzZSBvciAofCkgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgdmFsdWUuXG4gICAgICogQHJldHVybnMgVGhlIHJlc3VsdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3Qgb3IocmlnaHQ6IEJpdEJvYXJkPFQ+IHwgVCB8IG51bWJlcik6IHRoaXM7XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2UgeG9yICheKSBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHJpZ2h0IFRoZSByaWdodCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0LlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCB4b3IocmlnaHQ6IEJpdEJvYXJkPFQ+IHwgVCB8IG51bWJlcik6IHRoaXM7XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2Ugbm90ICh+KSBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgVGhlIHJlc3VsdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3Qgbm90KCk6IHRoaXM7XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2UgbGVmdCBzaGlmdCAoPDwpIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gc2hpZnRBbW91bnQgSG93IG11Y2ggdG8gc2hpZnQgaXQgYnkuXG4gICAgICogQHJldHVybnMgVGhlIHJlc3VsdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgbGVmdFNoaWZ0KHNoaWZ0QW1vdW50OiBudW1iZXIpOiB0aGlzO1xuXG4gICAgLyoqXG4gICAgICogQ2FycmllcyBvdXQgYSBiaXR3aXNlIGxvZ2ljYWwgcmlnaHQgc2hpZnQgKD4+Pikgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSBzaGlmdEFtb3VudCBIb3cgbXVjaCB0byBzaGlmdCBpdCBieS5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0LlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCByaWdodFNoaWZ0KHNoaWZ0QW1vdW50OiBudW1iZXIpOiB0aGlzO1xuXG4gICAgLyoqXG4gICAgICogQ2FycmllcyBvdXQgYSBiaXR3aXNlIGFyaXRobWV0aWMgcmlnaHQgc2hpZnQgKD4+KSBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHNoaWZ0QW1vdW50IEhvdyBtdWNoIHRvIHNoaWZ0IGl0IGJ5LlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGFyaXRobWV0aWNSaWdodFNoaWZ0KHNoaWZ0QW1vdW50OiBudW1iZXIpOiB0aGlzO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHR3byBCaXRCb2FyZHMgaGF2ZSBlcXVhbCBkYXRhIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgdHdvIEJpdEJvYXJkIGhhdmUgdGhlIHNhbWUgZGF0YSB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZXF1YWxzKHZhbHVlOiBCaXRCb2FyZDxUPiB8IFQgfCBudW1iZXIpOiBib29sZWFuO1xufVxuIl19