UNPKG

tsshogi

Version:

TypeScript library for Shogi (Japanese chess)

401 lines 27.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.HDirection = exports.VDirection = exports.directionToDeltaMap = exports.MoveType = exports.directions = exports.Direction = void 0; exports.reverseDirection = reverseDirection; exports.movableDirections = movableDirections; exports.resolveMoveType = resolveMoveType; exports.vectorToDirectionAndDistance = vectorToDirectionAndDistance; exports.directionToVDirection = directionToVDirection; exports.directionToHDirection = directionToHDirection; var Direction; (function (Direction) { Direction["UP"] = "up"; Direction["DOWN"] = "down"; Direction["LEFT"] = "left"; Direction["RIGHT"] = "right"; Direction["LEFT_UP"] = "left_up"; Direction["RIGHT_UP"] = "right_up"; Direction["LEFT_DOWN"] = "left_down"; Direction["RIGHT_DOWN"] = "right_down"; Direction["LEFT_UP_KNIGHT"] = "left_up_knight"; Direction["RIGHT_UP_KNIGHT"] = "right_up_knight"; Direction["LEFT_DOWN_KNIGHT"] = "left_down_knight"; Direction["RIGHT_DOWN_KNIGHT"] = "right_down_knight"; })(Direction || (exports.Direction = Direction = {})); const reverseMap = { up: Direction.DOWN, down: Direction.UP, left: Direction.RIGHT, right: Direction.LEFT, left_up: Direction.RIGHT_DOWN, right_up: Direction.LEFT_DOWN, left_down: Direction.RIGHT_UP, right_down: Direction.LEFT_UP, left_up_knight: Direction.RIGHT_DOWN_KNIGHT, right_up_knight: Direction.LEFT_DOWN_KNIGHT, left_down_knight: Direction.RIGHT_UP_KNIGHT, right_down_knight: Direction.LEFT_UP_KNIGHT, }; /** * 反転した方向を返します。 * @param dir */ function reverseDirection(dir) { return reverseMap[dir]; } exports.directions = [ Direction.UP, Direction.DOWN, Direction.LEFT, Direction.RIGHT, Direction.LEFT_UP, Direction.RIGHT_UP, Direction.LEFT_DOWN, Direction.RIGHT_DOWN, Direction.LEFT_UP_KNIGHT, Direction.RIGHT_UP_KNIGHT, Direction.LEFT_DOWN_KNIGHT, Direction.RIGHT_DOWN_KNIGHT, ]; var MoveType; (function (MoveType) { MoveType["SHORT"] = "short"; MoveType["LONG"] = "long"; })(MoveType || (exports.MoveType = MoveType = {})); const movableDirectionMap = { black: { pawn: { up: MoveType.SHORT }, lance: { up: MoveType.LONG }, knight: { left_up_knight: MoveType.SHORT, right_up_knight: MoveType.SHORT }, silver: { left_up: MoveType.SHORT, up: MoveType.SHORT, right_up: MoveType.SHORT, left_down: MoveType.SHORT, right_down: MoveType.SHORT, }, gold: { left_up: MoveType.SHORT, up: MoveType.SHORT, right_up: MoveType.SHORT, left: MoveType.SHORT, right: MoveType.SHORT, down: MoveType.SHORT, }, bishop: { left_up: MoveType.LONG, right_up: MoveType.LONG, left_down: MoveType.LONG, right_down: MoveType.LONG, }, rook: { up: MoveType.LONG, left: MoveType.LONG, right: MoveType.LONG, down: MoveType.LONG, }, king: { left_down: MoveType.SHORT, right_down: MoveType.SHORT, left_up: MoveType.SHORT, right_up: MoveType.SHORT, down: MoveType.SHORT, left: MoveType.SHORT, right: MoveType.SHORT, up: MoveType.SHORT, }, promPawn: { left_up: MoveType.SHORT, up: MoveType.SHORT, right_up: MoveType.SHORT, left: MoveType.SHORT, right: MoveType.SHORT, down: MoveType.SHORT, }, promLance: { left_up: MoveType.SHORT, up: MoveType.SHORT, right_up: MoveType.SHORT, left: MoveType.SHORT, right: MoveType.SHORT, down: MoveType.SHORT, }, promKnight: { left_up: MoveType.SHORT, up: MoveType.SHORT, right_up: MoveType.SHORT, left: MoveType.SHORT, right: MoveType.SHORT, down: MoveType.SHORT, }, promSilver: { left_up: MoveType.SHORT, up: MoveType.SHORT, right_up: MoveType.SHORT, left: MoveType.SHORT, right: MoveType.SHORT, down: MoveType.SHORT, }, horse: { left_up: MoveType.LONG, right_up: MoveType.LONG, left_down: MoveType.LONG, right_down: MoveType.LONG, up: MoveType.SHORT, left: MoveType.SHORT, right: MoveType.SHORT, down: MoveType.SHORT, }, dragon: { up: MoveType.LONG, left: MoveType.LONG, right: MoveType.LONG, down: MoveType.LONG, left_up: MoveType.SHORT, right_up: MoveType.SHORT, left_down: MoveType.SHORT, right_down: MoveType.SHORT, }, }, white: { pawn: { down: MoveType.SHORT }, lance: { down: MoveType.LONG }, knight: { left_down_knight: MoveType.SHORT, right_down_knight: MoveType.SHORT, }, silver: { left_down: MoveType.SHORT, down: MoveType.SHORT, right_down: MoveType.SHORT, left_up: MoveType.SHORT, right_up: MoveType.SHORT, }, gold: { left_down: MoveType.SHORT, down: MoveType.SHORT, right_down: MoveType.SHORT, left: MoveType.SHORT, right: MoveType.SHORT, up: MoveType.SHORT, }, bishop: { left_down: MoveType.LONG, right_down: MoveType.LONG, left_up: MoveType.LONG, right_up: MoveType.LONG, }, rook: { down: MoveType.LONG, left: MoveType.LONG, right: MoveType.LONG, up: MoveType.LONG, }, king: { left_down: MoveType.SHORT, right_down: MoveType.SHORT, left_up: MoveType.SHORT, right_up: MoveType.SHORT, down: MoveType.SHORT, left: MoveType.SHORT, right: MoveType.SHORT, up: MoveType.SHORT, }, promPawn: { left_down: MoveType.SHORT, down: MoveType.SHORT, right_down: MoveType.SHORT, left: MoveType.SHORT, right: MoveType.SHORT, up: MoveType.SHORT, }, promLance: { left_down: MoveType.SHORT, down: MoveType.SHORT, right_down: MoveType.SHORT, left: MoveType.SHORT, right: MoveType.SHORT, up: MoveType.SHORT, }, promKnight: { left_down: MoveType.SHORT, down: MoveType.SHORT, right_down: MoveType.SHORT, left: MoveType.SHORT, right: MoveType.SHORT, up: MoveType.SHORT, }, promSilver: { left_down: MoveType.SHORT, down: MoveType.SHORT, right_down: MoveType.SHORT, left: MoveType.SHORT, right: MoveType.SHORT, up: MoveType.SHORT, }, horse: { left_down: MoveType.LONG, right_down: MoveType.LONG, left_up: MoveType.LONG, right_up: MoveType.LONG, down: MoveType.SHORT, left: MoveType.SHORT, right: MoveType.SHORT, up: MoveType.SHORT, }, dragon: { down: MoveType.LONG, left: MoveType.LONG, right: MoveType.LONG, up: MoveType.LONG, left_down: MoveType.SHORT, right_down: MoveType.SHORT, left_up: MoveType.SHORT, right_up: MoveType.SHORT, }, }, }; /** * 指定した駒の移動可能な方向を返します。 * @param piece */ function movableDirections(piece) { return Object.keys(movableDirectionMap[piece.color][piece.type]); } /** * 指定した駒と方向に対して、1マスのみ移動可能か遠距離移動可能かを返します。 * @param piece * @param direction */ function resolveMoveType(piece, direction) { return movableDirectionMap[piece.color][piece.type][direction]; } exports.directionToDeltaMap = { up: { x: 0, y: -1 }, down: { x: 0, y: 1 }, left: { x: -1, y: 0 }, right: { x: 1, y: 0 }, left_up: { x: -1, y: -1 }, right_up: { x: 1, y: -1 }, left_down: { x: -1, y: 1 }, right_down: { x: 1, y: 1 }, left_up_knight: { x: -1, y: -2 }, right_up_knight: { x: 1, y: -2 }, left_down_knight: { x: -1, y: 2 }, right_down_knight: { x: 1, y: 2 }, }; /** * ベクトルを方向と距離に変換します。 * @param x * @param y */ function vectorToDirectionAndDistance(x, y) { if (x === 1 && y === -2) { return { direction: Direction.RIGHT_UP_KNIGHT, distance: 1, ok: true }; } if (x === -1 && y === -2) { return { direction: Direction.LEFT_UP_KNIGHT, distance: 1, ok: true }; } if (x === 1 && y === 2) { return { direction: Direction.RIGHT_DOWN_KNIGHT, distance: 1, ok: true }; } if (x === -1 && y === 2) { return { direction: Direction.LEFT_DOWN_KNIGHT, distance: 1, ok: true }; } if (x !== 0 && y !== 0 && Math.abs(x) !== Math.abs(y)) { return { direction: "", distance: 0, ok: false }; } let dx = x; let dy = y; let distance = 0; if (dx !== 0) { distance = Math.abs(dx); dx /= distance; } if (dy !== 0) { distance = Math.abs(dy); dy /= distance; } if (dx === -1 && dy === -1) { return { direction: Direction.LEFT_UP, distance, ok: true }; } if (dx === 0 && dy === -1) { return { direction: Direction.UP, distance, ok: true }; } if (dx === 1 && dy === -1) { return { direction: Direction.RIGHT_UP, distance, ok: true }; } if (dx === -1 && dy === 0) { return { direction: Direction.LEFT, distance, ok: true }; } if (dx === 1 && dy === 0) { return { direction: Direction.RIGHT, distance, ok: true }; } if (dx === -1 && dy === 1) { return { direction: Direction.LEFT_DOWN, distance, ok: true }; } if (dx === 0 && dy === 1) { return { direction: Direction.DOWN, distance, ok: true }; } if (dx === 1 && dy === 1) { return { direction: Direction.RIGHT_DOWN, distance, ok: true }; } return { direction: "", distance: 0, ok: false }; } var VDirection; (function (VDirection) { VDirection["UP"] = "up"; VDirection["NONE"] = "none"; VDirection["DOWN"] = "down"; })(VDirection || (exports.VDirection = VDirection = {})); /** * 垂直方向の動きを取り出します。 * @param direction */ function directionToVDirection(direction) { switch (direction) { case Direction.UP: case Direction.LEFT_UP: case Direction.RIGHT_UP: case Direction.LEFT_UP_KNIGHT: case Direction.RIGHT_UP_KNIGHT: return VDirection.UP; case Direction.DOWN: case Direction.LEFT_DOWN: case Direction.RIGHT_DOWN: case Direction.LEFT_DOWN_KNIGHT: case Direction.RIGHT_DOWN_KNIGHT: return VDirection.DOWN; default: return VDirection.NONE; } } var HDirection; (function (HDirection) { HDirection["LEFT"] = "left"; HDirection["NONE"] = "none"; HDirection["RIGHT"] = "right"; })(HDirection || (exports.HDirection = HDirection = {})); /** * 水平方向の動きを取り出します。 * @param direction */ function directionToHDirection(direction) { switch (direction) { case Direction.LEFT: case Direction.LEFT_UP: case Direction.LEFT_DOWN: case Direction.LEFT_UP_KNIGHT: case Direction.LEFT_DOWN_KNIGHT: return HDirection.LEFT; case Direction.RIGHT: case Direction.RIGHT_UP: case Direction.RIGHT_DOWN: case Direction.RIGHT_UP_KNIGHT: case Direction.RIGHT_DOWN_KNIGHT: return HDirection.RIGHT; default: return HDirection.NONE; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RpcmVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFzQ0EsNENBRUM7QUFnT0QsOENBRUM7QUFPRCwwQ0FFQztBQXdCRCxvRUEyREM7QUFZRCxzREFpQkM7QUFZRCxzREFpQkM7QUE5WkQsSUFBWSxTQWFYO0FBYkQsV0FBWSxTQUFTO0lBQ25CLHNCQUFTLENBQUE7SUFDVCwwQkFBYSxDQUFBO0lBQ2IsMEJBQWEsQ0FBQTtJQUNiLDRCQUFlLENBQUE7SUFDZixnQ0FBbUIsQ0FBQTtJQUNuQixrQ0FBcUIsQ0FBQTtJQUNyQixvQ0FBdUIsQ0FBQTtJQUN2QixzQ0FBeUIsQ0FBQTtJQUN6Qiw4Q0FBaUMsQ0FBQTtJQUNqQyxnREFBbUMsQ0FBQTtJQUNuQyxrREFBcUMsQ0FBQTtJQUNyQyxvREFBdUMsQ0FBQTtBQUN6QyxDQUFDLEVBYlcsU0FBUyx5QkFBVCxTQUFTLFFBYXBCO0FBRUQsTUFBTSxVQUFVLEdBRVo7SUFDRixFQUFFLEVBQUUsU0FBUyxDQUFDLElBQUk7SUFDbEIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxFQUFFO0lBQ2xCLElBQUksRUFBRSxTQUFTLENBQUMsS0FBSztJQUNyQixLQUFLLEVBQUUsU0FBUyxDQUFDLElBQUk7SUFDckIsT0FBTyxFQUFFLFNBQVMsQ0FBQyxVQUFVO0lBQzdCLFFBQVEsRUFBRSxTQUFTLENBQUMsU0FBUztJQUM3QixTQUFTLEVBQUUsU0FBUyxDQUFDLFFBQVE7SUFDN0IsVUFBVSxFQUFFLFNBQVMsQ0FBQyxPQUFPO0lBQzdCLGNBQWMsRUFBRSxTQUFTLENBQUMsaUJBQWlCO0lBQzNDLGVBQWUsRUFBRSxTQUFTLENBQUMsZ0JBQWdCO0lBQzNDLGdCQUFnQixFQUFFLFNBQVMsQ0FBQyxlQUFlO0lBQzNDLGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxjQUFjO0NBQzVDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxHQUFjO0lBQzdDLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFFWSxRQUFBLFVBQVUsR0FBZ0I7SUFDckMsU0FBUyxDQUFDLEVBQUU7SUFDWixTQUFTLENBQUMsSUFBSTtJQUNkLFNBQVMsQ0FBQyxJQUFJO0lBQ2QsU0FBUyxDQUFDLEtBQUs7SUFDZixTQUFTLENBQUMsT0FBTztJQUNqQixTQUFTLENBQUMsUUFBUTtJQUNsQixTQUFTLENBQUMsU0FBUztJQUNuQixTQUFTLENBQUMsVUFBVTtJQUNwQixTQUFTLENBQUMsY0FBYztJQUN4QixTQUFTLENBQUMsZUFBZTtJQUN6QixTQUFTLENBQUMsZ0JBQWdCO0lBQzFCLFNBQVMsQ0FBQyxpQkFBaUI7Q0FDbkIsQ0FBQztBQUVYLElBQVksUUFHWDtBQUhELFdBQVksUUFBUTtJQUNsQiwyQkFBZSxDQUFBO0lBQ2YseUJBQWEsQ0FBQTtBQUNmLENBQUMsRUFIVyxRQUFRLHdCQUFSLFFBQVEsUUFHbkI7QUFFRCxNQUFNLG1CQUFtQixHQUlyQjtJQUNGLEtBQUssRUFBRTtRQUNMLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFO1FBQzVCLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFO1FBQzVCLE1BQU0sRUFBRSxFQUFFLGNBQWMsRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLGVBQWUsRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFO1FBQzNFLE1BQU0sRUFBRTtZQUNOLE9BQU8sRUFBRSxRQUFRLENBQUMsS0FBSztZQUN2QixFQUFFLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDbEIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3hCLFNBQVMsRUFBRSxRQUFRLENBQUMsS0FBSztZQUN6QixVQUFVLEVBQUUsUUFBUSxDQUFDLEtBQUs7U0FDM0I7UUFDRCxJQUFJLEVBQUU7WUFDSixPQUFPLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDdkIsRUFBRSxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ2xCLFFBQVEsRUFBRSxRQUFRLENBQUMsS0FBSztZQUN4QixJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDcEIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3JCLElBQUksRUFBRSxRQUFRLENBQUMsS0FBSztTQUNyQjtRQUNELE1BQU0sRUFBRTtZQUNOLE9BQU8sRUFBRSxRQUFRLENBQUMsSUFBSTtZQUN0QixRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDdkIsU0FBUyxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ3hCLFVBQVUsRUFBRSxRQUFRLENBQUMsSUFBSTtTQUMxQjtRQUNELElBQUksRUFBRTtZQUNKLEVBQUUsRUFBRSxRQUFRLENBQUMsSUFBSTtZQUNqQixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDbkIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ3BCLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtTQUNwQjtRQUNELElBQUksRUFBRTtZQUNKLFNBQVMsRUFBRSxRQUFRLENBQUMsS0FBSztZQUN6QixVQUFVLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDMUIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3ZCLFFBQVEsRUFBRSxRQUFRLENBQUMsS0FBSztZQUN4QixJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDcEIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3BCLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSztZQUNyQixFQUFFLEVBQUUsUUFBUSxDQUFDLEtBQUs7U0FDbkI7UUFDRCxRQUFRLEVBQUU7WUFDUixPQUFPLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDdkIsRUFBRSxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ2xCLFFBQVEsRUFBRSxRQUFRLENBQUMsS0FBSztZQUN4QixJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDcEIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3JCLElBQUksRUFBRSxRQUFRLENBQUMsS0FBSztTQUNyQjtRQUNELFNBQVMsRUFBRTtZQUNULE9BQU8sRUFBRSxRQUFRLENBQUMsS0FBSztZQUN2QixFQUFFLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDbEIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3hCLElBQUksRUFBRSxRQUFRLENBQUMsS0FBSztZQUNwQixLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDckIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLO1NBQ3JCO1FBQ0QsVUFBVSxFQUFFO1lBQ1YsT0FBTyxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3ZCLEVBQUUsRUFBRSxRQUFRLENBQUMsS0FBSztZQUNsQixRQUFRLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDeEIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3BCLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSztZQUNyQixJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUs7U0FDckI7UUFDRCxVQUFVLEVBQUU7WUFDVixPQUFPLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDdkIsRUFBRSxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ2xCLFFBQVEsRUFBRSxRQUFRLENBQUMsS0FBSztZQUN4QixJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDcEIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3JCLElBQUksRUFBRSxRQUFRLENBQUMsS0FBSztTQUNyQjtRQUNELEtBQUssRUFBRTtZQUNMLE9BQU8sRUFBRSxRQUFRLENBQUMsSUFBSTtZQUN0QixRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDdkIsU0FBUyxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ3hCLFVBQVUsRUFBRSxRQUFRLENBQUMsSUFBSTtZQUN6QixFQUFFLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDbEIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3BCLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSztZQUNyQixJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUs7U0FDckI7UUFDRCxNQUFNLEVBQUU7WUFDTixFQUFFLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDakIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ25CLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSTtZQUNwQixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDbkIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3ZCLFFBQVEsRUFBRSxRQUFRLENBQUMsS0FBSztZQUN4QixTQUFTLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDekIsVUFBVSxFQUFFLFFBQVEsQ0FBQyxLQUFLO1NBQzNCO0tBQ0Y7SUFDRCxLQUFLLEVBQUU7UUFDTCxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRTtRQUM5QixLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRTtRQUM5QixNQUFNLEVBQUU7WUFDTixnQkFBZ0IsRUFBRSxRQUFRLENBQUMsS0FBSztZQUNoQyxpQkFBaUIsRUFBRSxRQUFRLENBQUMsS0FBSztTQUNsQztRQUNELE1BQU0sRUFBRTtZQUNOLFNBQVMsRUFBRSxRQUFRLENBQUMsS0FBSztZQUN6QixJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDcEIsVUFBVSxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQzFCLE9BQU8sRUFBRSxRQUFRLENBQUMsS0FBSztZQUN2QixRQUFRLEVBQUUsUUFBUSxDQUFDLEtBQUs7U0FDekI7UUFDRCxJQUFJLEVBQUU7WUFDSixTQUFTLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDekIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3BCLFVBQVUsRUFBRSxRQUFRLENBQUMsS0FBSztZQUMxQixJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDcEIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3JCLEVBQUUsRUFBRSxRQUFRLENBQUMsS0FBSztTQUNuQjtRQUNELE1BQU0sRUFBRTtZQUNOLFNBQVMsRUFBRSxRQUFRLENBQUMsSUFBSTtZQUN4QixVQUFVLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDekIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ3RCLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSTtTQUN4QjtRQUNELElBQUksRUFBRTtZQUNKLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtZQUNuQixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDbkIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ3BCLEVBQUUsRUFBRSxRQUFRLENBQUMsSUFBSTtTQUNsQjtRQUNELElBQUksRUFBRTtZQUNKLFNBQVMsRUFBRSxRQUFRLENBQUMsS0FBSztZQUN6QixVQUFVLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDMUIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3ZCLFFBQVEsRUFBRSxRQUFRLENBQUMsS0FBSztZQUN4QixJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDcEIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3BCLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSztZQUNyQixFQUFFLEVBQUUsUUFBUSxDQUFDLEtBQUs7U0FDbkI7UUFDRCxRQUFRLEVBQUU7WUFDUixTQUFTLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDekIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3BCLFVBQVUsRUFBRSxRQUFRLENBQUMsS0FBSztZQUMxQixJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDcEIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3JCLEVBQUUsRUFBRSxRQUFRLENBQUMsS0FBSztTQUNuQjtRQUNELFNBQVMsRUFBRTtZQUNULFNBQVMsRUFBRSxRQUFRLENBQUMsS0FBSztZQUN6QixJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDcEIsVUFBVSxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQzFCLElBQUksRUFBRSxRQUFRLENBQUMsS0FBSztZQUNwQixLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDckIsRUFBRSxFQUFFLFFBQVEsQ0FBQyxLQUFLO1NBQ25CO1FBQ0QsVUFBVSxFQUFFO1lBQ1YsU0FBUyxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3pCLElBQUksRUFBRSxRQUFRLENBQUMsS0FBSztZQUNwQixVQUFVLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDMUIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3BCLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSztZQUNyQixFQUFFLEVBQUUsUUFBUSxDQUFDLEtBQUs7U0FDbkI7UUFDRCxVQUFVLEVBQUU7WUFDVixTQUFTLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDekIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3BCLFVBQVUsRUFBRSxRQUFRLENBQUMsS0FBSztZQUMxQixJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDcEIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3JCLEVBQUUsRUFBRSxRQUFRLENBQUMsS0FBSztTQUNuQjtRQUNELEtBQUssRUFBRTtZQUNMLFNBQVMsRUFBRSxRQUFRLENBQUMsSUFBSTtZQUN4QixVQUFVLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDekIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ3RCLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSTtZQUN2QixJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDcEIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3BCLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSztZQUNyQixFQUFFLEVBQUUsUUFBUSxDQUFDLEtBQUs7U0FDbkI7UUFDRCxNQUFNLEVBQUU7WUFDTixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDbkIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ25CLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSTtZQUNwQixFQUFFLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDakIsU0FBUyxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3pCLFVBQVUsRUFBRSxRQUFRLENBQUMsS0FBSztZQUMxQixPQUFPLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDdkIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxLQUFLO1NBQ3pCO0tBQ0Y7Q0FDRixDQUFDO0FBRUY7OztHQUdHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsS0FBWTtJQUM1QyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEtBQWUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBZ0IsQ0FBQztBQUM1RixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGVBQWUsQ0FBQyxLQUFZLEVBQUUsU0FBb0I7SUFDaEUsT0FBTyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsS0FBZSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFWSxRQUFBLG1CQUFtQixHQUU1QjtJQUNGLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQ25CLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUNwQixJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUNyQixLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDckIsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUN6QixRQUFRLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUN6QixTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUMxQixVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDMUIsY0FBYyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUNoQyxlQUFlLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUNoQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2pDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0NBQ2xDLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gsU0FBZ0IsNEJBQTRCLENBQzFDLENBQVMsRUFDVCxDQUFTO0lBTVQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLGVBQWUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsY0FBYyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3hFLENBQUM7SUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzNFLENBQUM7SUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDeEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDMUUsQ0FBQztJQUNELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsRUFBZSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ2hFLENBQUM7SUFDRCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDWCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDWCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDakIsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDYixRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QixFQUFFLElBQUksUUFBUSxDQUFDO0lBQ2pCLENBQUM7SUFDRCxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNiLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLEVBQUUsSUFBSSxRQUFRLENBQUM7SUFDakIsQ0FBQztJQUNELElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzNCLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzlELENBQUM7SUFDRCxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDekQsQ0FBQztJQUNELElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxQixPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0lBQ0QsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzNELENBQUM7SUFDRCxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzVELENBQUM7SUFDRCxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDaEUsQ0FBQztJQUNELElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDM0QsQ0FBQztJQUNELElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDakUsQ0FBQztJQUNELE9BQU8sRUFBRSxTQUFTLEVBQUUsRUFBZSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ2hFLENBQUM7QUFFRCxJQUFZLFVBSVg7QUFKRCxXQUFZLFVBQVU7SUFDcEIsdUJBQVMsQ0FBQTtJQUNULDJCQUFhLENBQUE7SUFDYiwyQkFBYSxDQUFBO0FBQ2YsQ0FBQyxFQUpXLFVBQVUsMEJBQVYsVUFBVSxRQUlyQjtBQUVEOzs7R0FHRztBQUNILFNBQWdCLHFCQUFxQixDQUFDLFNBQW9CO0lBQ3hELFFBQVEsU0FBUyxFQUFFLENBQUM7UUFDbEIsS0FBSyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQ2xCLEtBQUssU0FBUyxDQUFDLE9BQU8sQ0FBQztRQUN2QixLQUFLLFNBQVMsQ0FBQyxRQUFRLENBQUM7UUFDeEIsS0FBSyxTQUFTLENBQUMsY0FBYyxDQUFDO1FBQzlCLEtBQUssU0FBUyxDQUFDLGVBQWU7WUFDNUIsT0FBTyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssU0FBUyxDQUFDLElBQUksQ0FBQztRQUNwQixLQUFLLFNBQVMsQ0FBQyxTQUFTLENBQUM7UUFDekIsS0FBSyxTQUFTLENBQUMsVUFBVSxDQUFDO1FBQzFCLEtBQUssU0FBUyxDQUFDLGdCQUFnQixDQUFDO1FBQ2hDLEtBQUssU0FBUyxDQUFDLGlCQUFpQjtZQUM5QixPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDekI7WUFDRSxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUM7SUFDM0IsQ0FBQztBQUNILENBQUM7QUFFRCxJQUFZLFVBSVg7QUFKRCxXQUFZLFVBQVU7SUFDcEIsMkJBQWEsQ0FBQTtJQUNiLDJCQUFhLENBQUE7SUFDYiw2QkFBZSxDQUFBO0FBQ2pCLENBQUMsRUFKVyxVQUFVLDBCQUFWLFVBQVUsUUFJckI7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixxQkFBcUIsQ0FBQyxTQUFvQjtJQUN4RCxRQUFRLFNBQVMsRUFBRSxDQUFDO1FBQ2xCLEtBQUssU0FBUyxDQUFDLElBQUksQ0FBQztRQUNwQixLQUFLLFNBQVMsQ0FBQyxPQUFPLENBQUM7UUFDdkIsS0FBSyxTQUFTLENBQUMsU0FBUyxDQUFDO1FBQ3pCLEtBQUssU0FBUyxDQUFDLGNBQWMsQ0FBQztRQUM5QixLQUFLLFNBQVMsQ0FBQyxnQkFBZ0I7WUFDN0IsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQ3pCLEtBQUssU0FBUyxDQUFDLEtBQUssQ0FBQztRQUNyQixLQUFLLFNBQVMsQ0FBQyxRQUFRLENBQUM7UUFDeEIsS0FBSyxTQUFTLENBQUMsVUFBVSxDQUFDO1FBQzFCLEtBQUssU0FBUyxDQUFDLGVBQWUsQ0FBQztRQUMvQixLQUFLLFNBQVMsQ0FBQyxpQkFBaUI7WUFDOUIsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQzFCO1lBQ0UsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDO0lBQzNCLENBQUM7QUFDSCxDQUFDIn0=