From 7222278bdfb37627fa362fc7f6ae305a9887250d Mon Sep 17 00:00:00 2001 From: Ko-HyeJi Date: Wed, 21 Dec 2022 14:01:56 +0900 Subject: [PATCH 1/5] hyko: parse map --- parse_map/.DS_Store | Bin 0 -> 6148 bytes parse_map/get_next_line/README.md | 1 + parse_map/get_next_line/get_next_line.c | 116 + parse_map/get_next_line/get_next_line.h | 33 + parse_map/get_next_line/get_next_line_utils.c | 102 + parse_map/libft/Makefile | 59 + parse_map/libft/README.md | 1 + parse_map/libft/ft_atoi.c | 42 + parse_map/libft/ft_bzero.c | 18 + parse_map/libft/ft_calloc.c | 24 + parse_map/libft/ft_isalnum.c | 21 + parse_map/libft/ft_isalpha.c | 21 + parse_map/libft/ft_isascii.c | 21 + parse_map/libft/ft_isdigit.c | 21 + parse_map/libft/ft_isprint.c | 21 + parse_map/libft/ft_itoa.c | 58 + parse_map/libft/ft_lstadd_back.c | 28 + parse_map/libft/ft_lstadd_front.c | 21 + parse_map/libft/ft_lstclear.c | 27 + parse_map/libft/ft_lstdelone.c | 21 + parse_map/libft/ft_lstiter.c | 27 + parse_map/libft/ft_lstlast.c | 22 + parse_map/libft/ft_lstmap.c | 33 + parse_map/libft/ft_lstnew.c | 25 + parse_map/libft/ft_lstsize.c | 26 + parse_map/libft/ft_memchr.c | 29 + parse_map/libft/ft_memcmp.c | 31 + parse_map/libft/ft_memcpy.c | 34 + parse_map/libft/ft_memmove.c | 41 + parse_map/libft/ft_memset.c | 28 + parse_map/libft/ft_putchar_fd.c | 20 + parse_map/libft/ft_putendl_fd.c | 28 + parse_map/libft/ft_putnbr_fd.c | 40 + parse_map/libft/ft_putstr_fd.c | 27 + parse_map/libft/ft_split.c | 90 + parse_map/libft/ft_strchr.c | 29 + parse_map/libft/ft_strdup.c | 33 + parse_map/libft/ft_striteri.c | 27 + parse_map/libft/ft_strjoin.c | 42 + parse_map/libft/ft_strlcat.c | 36 + parse_map/libft/ft_strlcpy.c | 32 + parse_map/libft/ft_strlen.c | 23 + parse_map/libft/ft_strmapi.c | 35 + parse_map/libft/ft_strncmp.c | 33 + parse_map/libft/ft_strnstr.c | 39 + parse_map/libft/ft_strrchr.c | 27 + parse_map/libft/ft_strtrim.c | 36 + parse_map/libft/ft_substr.c | 41 + parse_map/libft/ft_tolower.c | 21 + parse_map/libft/ft_toupper.c | 21 + parse_map/libft/libft.h | 80 + parse_map/map/Makefile | 32 + parse_map/map/cub3d.h | 163 + parse_map/map/error.c | 2 + parse_map/map/map.c | 133 + parse_map/map/map.h | 25 + parse_map/map/parse_map.c | 152 + parse_map/map/test_map.cub | 31 + parse_map/mlx/Makefile | 24 + parse_map/mlx/font.c | 3525 +++++++++++++++++ parse_map/mlx/font.xcf | Bin 0 -> 52570 bytes parse_map/mlx/mlx.h | 149 + parse_map/mlx/mlx_init_loop.m | 192 + parse_map/mlx/mlx_int.h | 102 + parse_map/mlx/mlx_int_str_to_wordtab.c | 107 + parse_map/mlx/mlx_mouse.m | 52 + parse_map/mlx/mlx_new_image.m | 198 + parse_map/mlx/mlx_new_window.h | 57 + parse_map/mlx/mlx_new_window.m | 766 ++++ parse_map/mlx/mlx_opengl.h | 21 + parse_map/mlx/mlx_opengl.m | 57 + parse_map/mlx/mlx_png.c | 418 ++ parse_map/mlx/mlx_png.h | 4 + parse_map/mlx/mlx_rgb.c | 763 ++++ parse_map/mlx/mlx_shaders.c | 240 ++ parse_map/mlx/mlx_xpm.c | 338 ++ parse_map/textures/barrel.xpm | 97 + parse_map/textures/bluestone.xpm | 90 + parse_map/textures/colorstone.xpm | 96 + parse_map/textures/eagle.xpm | 126 + parse_map/textures/greenlight.xpm | 96 + parse_map/textures/greystone.xpm | 92 + parse_map/textures/mossy.xpm | 95 + parse_map/textures/pillar.xpm | 91 + parse_map/textures/purplestone.xpm | 90 + parse_map/textures/redbrick.xpm | 96 + parse_map/textures/wood.xpm | 79 + 87 files changed, 10311 insertions(+) create mode 100644 parse_map/.DS_Store create mode 100644 parse_map/get_next_line/README.md create mode 100644 parse_map/get_next_line/get_next_line.c create mode 100644 parse_map/get_next_line/get_next_line.h create mode 100644 parse_map/get_next_line/get_next_line_utils.c create mode 100644 parse_map/libft/Makefile create mode 100644 parse_map/libft/README.md create mode 100644 parse_map/libft/ft_atoi.c create mode 100644 parse_map/libft/ft_bzero.c create mode 100644 parse_map/libft/ft_calloc.c create mode 100644 parse_map/libft/ft_isalnum.c create mode 100644 parse_map/libft/ft_isalpha.c create mode 100644 parse_map/libft/ft_isascii.c create mode 100644 parse_map/libft/ft_isdigit.c create mode 100644 parse_map/libft/ft_isprint.c create mode 100644 parse_map/libft/ft_itoa.c create mode 100644 parse_map/libft/ft_lstadd_back.c create mode 100644 parse_map/libft/ft_lstadd_front.c create mode 100644 parse_map/libft/ft_lstclear.c create mode 100644 parse_map/libft/ft_lstdelone.c create mode 100644 parse_map/libft/ft_lstiter.c create mode 100644 parse_map/libft/ft_lstlast.c create mode 100644 parse_map/libft/ft_lstmap.c create mode 100644 parse_map/libft/ft_lstnew.c create mode 100644 parse_map/libft/ft_lstsize.c create mode 100644 parse_map/libft/ft_memchr.c create mode 100644 parse_map/libft/ft_memcmp.c create mode 100644 parse_map/libft/ft_memcpy.c create mode 100644 parse_map/libft/ft_memmove.c create mode 100644 parse_map/libft/ft_memset.c create mode 100644 parse_map/libft/ft_putchar_fd.c create mode 100644 parse_map/libft/ft_putendl_fd.c create mode 100644 parse_map/libft/ft_putnbr_fd.c create mode 100644 parse_map/libft/ft_putstr_fd.c create mode 100644 parse_map/libft/ft_split.c create mode 100644 parse_map/libft/ft_strchr.c create mode 100644 parse_map/libft/ft_strdup.c create mode 100644 parse_map/libft/ft_striteri.c create mode 100644 parse_map/libft/ft_strjoin.c create mode 100644 parse_map/libft/ft_strlcat.c create mode 100644 parse_map/libft/ft_strlcpy.c create mode 100644 parse_map/libft/ft_strlen.c create mode 100644 parse_map/libft/ft_strmapi.c create mode 100644 parse_map/libft/ft_strncmp.c create mode 100644 parse_map/libft/ft_strnstr.c create mode 100644 parse_map/libft/ft_strrchr.c create mode 100644 parse_map/libft/ft_strtrim.c create mode 100644 parse_map/libft/ft_substr.c create mode 100644 parse_map/libft/ft_tolower.c create mode 100644 parse_map/libft/ft_toupper.c create mode 100644 parse_map/libft/libft.h create mode 100644 parse_map/map/Makefile create mode 100644 parse_map/map/cub3d.h create mode 100644 parse_map/map/error.c create mode 100644 parse_map/map/map.c create mode 100644 parse_map/map/map.h create mode 100644 parse_map/map/parse_map.c create mode 100644 parse_map/map/test_map.cub create mode 100644 parse_map/mlx/Makefile create mode 100644 parse_map/mlx/font.c create mode 100644 parse_map/mlx/font.xcf create mode 100644 parse_map/mlx/mlx.h create mode 100644 parse_map/mlx/mlx_init_loop.m create mode 100644 parse_map/mlx/mlx_int.h create mode 100644 parse_map/mlx/mlx_int_str_to_wordtab.c create mode 100644 parse_map/mlx/mlx_mouse.m create mode 100644 parse_map/mlx/mlx_new_image.m create mode 100644 parse_map/mlx/mlx_new_window.h create mode 100644 parse_map/mlx/mlx_new_window.m create mode 100644 parse_map/mlx/mlx_opengl.h create mode 100644 parse_map/mlx/mlx_opengl.m create mode 100644 parse_map/mlx/mlx_png.c create mode 100644 parse_map/mlx/mlx_png.h create mode 100644 parse_map/mlx/mlx_rgb.c create mode 100644 parse_map/mlx/mlx_shaders.c create mode 100644 parse_map/mlx/mlx_xpm.c create mode 100755 parse_map/textures/barrel.xpm create mode 100755 parse_map/textures/bluestone.xpm create mode 100755 parse_map/textures/colorstone.xpm create mode 100755 parse_map/textures/eagle.xpm create mode 100755 parse_map/textures/greenlight.xpm create mode 100755 parse_map/textures/greystone.xpm create mode 100755 parse_map/textures/mossy.xpm create mode 100755 parse_map/textures/pillar.xpm create mode 100755 parse_map/textures/purplestone.xpm create mode 100755 parse_map/textures/redbrick.xpm create mode 100644 parse_map/textures/wood.xpm diff --git a/parse_map/.DS_Store b/parse_map/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..1c72608f5a7dba59b19bdf8ef50503d0fd024973 GIT binary patch literal 6148 zcmeHK!D`z;5Z$%iR*Img&_e?`EcDQe4>l1txe3?qDUcF{`p~4dghVV*BqPi5!5Bn7 zARo|Nlk`K9{zJc{=g#b|OO4Z82z8l(**7~oGt0geyIRH=?@YrcV>V;V07a~r&^#bG zj=Cll?Lp*NV=@ksEP&q6V7wMhj(?E>+`B3}V?G-Pvp@GQi6=#)@q<^YwP(*?80MB` zS}!g0#2aNZukefMq~qrUd&i5zDDd-s92TRaDD5TDd6XXH`+gDSpE39-%Mu7swjX?o zquIcI{XRAc(`*9j(vraZm!-7LSldzAO<#{0e!L=*5)sTRzM681CPuAo(}>P(bZTglt%|N`1^?CHAED! z@hyQUG`bo~g)jobRVtuL<@$-iRXX^Ej&n7Z3RODea%QNbXXg5a!sYDX7c!i2S0S~; z05P!2Kvi{Zy#ITDfB&y0QI8lP2L3Asc&+PoJFp~ux2`P??^*#m1VzEPQsM6uFyvJX gv3M1~0hI!Nfd-(fu~Y~i5c(02G*CkfJShXe0NKP~Hvj+t literal 0 HcmV?d00001 diff --git a/parse_map/get_next_line/README.md b/parse_map/get_next_line/README.md new file mode 100644 index 0000000..d9a9a94 --- /dev/null +++ b/parse_map/get_next_line/README.md @@ -0,0 +1 @@ +# 42seoul_Get-Next-Line diff --git a/parse_map/get_next_line/get_next_line.c b/parse_map/get_next_line/get_next_line.c new file mode 100644 index 0000000..a182f41 --- /dev/null +++ b/parse_map/get_next_line/get_next_line.c @@ -0,0 +1,116 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/27 20:59:49 by hyko #+# #+# */ +/* Updated: 2022/02/21 15:03:04 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "get_next_line.h" + +char *get_next_line(int fd) +{ + static char *backup; + char *return_line; + int nl_idx; + int pre_len; + + if (fd < 0 || BUFFER_SIZE <= 0) + return (NULL); + nl_idx = gnl_find_newline(backup); + if (nl_idx == -1) + { + pre_len = ft_strlen(backup); + backup = gnl_expand_backup(backup, fd); + if ((int)ft_strlen(backup) == pre_len) + nl_idx = ft_strlen(backup); + } + if (nl_idx != -1) + { + return_line = ft_substr(backup, 0, nl_idx + 1); + backup = gnl_cut_backup(backup, return_line); + return (return_line); + } + return (get_next_line(fd)); +} + +int gnl_find_newline(char *backup) +{ + int idx; + int len; + + if (backup == NULL) + return (-1); + idx = 0; + len = ft_strlen(backup); + while (idx < len) + { + if (backup[idx] == '\n') + return (idx); + idx++; + } + return (-1); +} + +char *gnl_read_line(int fd) +{ + char *read_line; + int read_size; + + read_line = (char *)malloc(BUFFER_SIZE + 1); + if (read_line == NULL) + return (NULL); + read_size = read(fd, read_line, BUFFER_SIZE); + if (read_size == -1) + { + free(read_line); + return (NULL); + } + read_line[read_size] = '\0'; + return (read_line); +} + +char *gnl_expand_backup(char *backup, int fd) +{ + char *new_backup; + char *read_line; + + read_line = gnl_read_line(fd); + if (read_line == NULL) + return (NULL); + if (read_line[0] == 0) + { + free(read_line); + return (backup); + } + if (backup == NULL) + return (read_line); + new_backup = ft_strjoin(backup, read_line); + free(backup); + free(read_line); + return (new_backup); +} + +char *gnl_cut_backup(char *backup, char *return_line) +{ + char *new_backup; + int backup_len; + int return_len; + + if (backup == NULL || return_line == NULL) + return (NULL); + backup_len = ft_strlen(backup); + return_len = ft_strlen(return_line); + if (backup_len == return_len) + { + free(backup); + return (NULL); + } + new_backup = ft_substr(backup, return_len, backup_len - return_len); + free(backup); + return (new_backup); +} diff --git a/parse_map/get_next_line/get_next_line.h b/parse_map/get_next_line/get_next_line.h new file mode 100644 index 0000000..e85f60d --- /dev/null +++ b/parse_map/get_next_line/get_next_line.h @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/27 21:00:30 by hyko #+# #+# */ +/* Updated: 2022/12/20 15:10:57 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef GET_NEXT_LINE_H + +# define GET_NEXT_LINE_H + +# include +# include + +#define BUFFER_SIZE 42 + +char *get_next_line(int fd); +char *gnl_expand_backup(char *backup, int fd); +char *gnl_cut_backup(char *backup, char *return_line); +char *gnl_read_line(int fd); +int gnl_find_newline(char *read_line); + +size_t ft_strlen(const char *s); +char *ft_strdup(const char *s1); +char *ft_substr(char const *s, unsigned int start, size_t len); +char *ft_strjoin(char const *s1, char const *s2); + +#endif diff --git a/parse_map/get_next_line/get_next_line_utils.c b/parse_map/get_next_line/get_next_line_utils.c new file mode 100644 index 0000000..faabaf3 --- /dev/null +++ b/parse_map/get_next_line/get_next_line_utils.c @@ -0,0 +1,102 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_next_line_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/27 21:00:08 by hyko #+# #+# */ +/* Updated: 2022/02/20 18:47:46 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "get_next_line.h" + +size_t ft_strlen(const char *s) +{ + size_t i; + + i = 0; + if (s == NULL) + return (0); + while (s[i] != '\0') + i++; + return (i); +} + +char *ft_strdup(const char *s1) +{ + int i; + int len; + char *s2; + + len = ft_strlen(s1); + s2 = (char *)malloc(sizeof(char) * (len + 1)); + if (s2 == NULL) + return (NULL); + i = 0; + while (s1[i] != '\0') + { + s2[i] = s1[i]; + i++; + } + s2[i] = '\0'; + return (s2); +} + +char *ft_substr(char const *s, unsigned int start, size_t len) +{ + size_t i; + size_t j; + char *substr; + + i = 0; + j = 0; + if (s == 0) + return (NULL); + if (start >= ft_strlen(s)) + return (ft_strdup("")); + substr = (char *)malloc(sizeof(char) * (len + 1)); + if (substr == NULL) + return (NULL); + while (s[i] != '\0') + { + if (i >= start && j < len) + { + substr[j] = s[i]; + j++; + } + i++; + } + substr[j] = '\0'; + return (substr); +} + +char *ft_strjoin(char const *s1, char const *s2) +{ + char *new_str; + size_t s1_len; + size_t s2_len; + size_t i; + size_t j; + + if (s1 == NULL && s2 == NULL) + return (NULL); + if (s1 == NULL) + return ((char *)s2); + if (s2 == NULL) + return ((char *)s1); + s1_len = ft_strlen(s1); + s2_len = ft_strlen(s2); + i = -1; + j = 0; + new_str = (char *)malloc(sizeof(char) * (s1_len + s2_len + 1)); + if (new_str == NULL) + return (NULL); + while (++i < s1_len) + new_str[i] = s1[i]; + while (j < s2_len) + new_str[i++] = s2[j++]; + new_str[i] = '\0'; + return (new_str); +} diff --git a/parse_map/libft/Makefile b/parse_map/libft/Makefile new file mode 100644 index 0000000..2a3b77b --- /dev/null +++ b/parse_map/libft/Makefile @@ -0,0 +1,59 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: hyko +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2022/01/03 18:58:22 by hyko #+# #+# # +# Updated: 2022/01/18 00:16:54 by hyko ### ########.fr # +# # +# **************************************************************************** # + +NAME = libft.a + +CC = gcc +CFLAG = -Wall -Wextra -Werror + +RM = rm -rf + +INCLUDE = ./libft.h + +SRC = ft_isalpha.c ft_isdigit.c ft_isalnum.c ft_isascii.c ft_isprint.c \ + ft_toupper.c ft_tolower.c \ + ft_strlen.c ft_strncmp.c ft_strlcpy.c \ + ft_strlcat.c ft_strnstr.c ft_strchr.c ft_strrchr.c \ + ft_bzero.c ft_atoi.c ft_memchr.c ft_memcmp.c ft_memset.c \ + ft_memcpy.c ft_memmove.c ft_calloc.c ft_strdup.c \ + ft_substr.c ft_strjoin.c ft_strtrim.c ft_strmapi.c \ + ft_striteri.c ft_split.c ft_itoa.c \ + ft_putchar_fd.c ft_putstr_fd.c ft_putendl_fd.c ft_putnbr_fd.c \ + +SRC_BN = ft_lstnew.c ft_lstadd_front.c ft_lstsize.c ft_lstlast.c \ + ft_lstadd_back.c ft_lstdelone.c ft_lstclear.c \ + ft_lstiter.c ft_lstmap.c + +%.o : %.c + $(CC) $(CFLAG) -c $^ -o $@ + +OBJ = $(SRC:.c=.o) + +OBJ_BONUS = $(SRC_BN:.c=.o) + +all : $(NAME) + +$(NAME) : $(OBJ) + ar rc $@ $^ + +clean : + $(RM) $(OBJ) $(OBJ_BONUS) + +fclean : clean + $(RM) $(NAME) + +re : fclean all + +bonus : $(OBJ) $(OBJ_BONUS) + ar rc $(NAME) $^ + +.PHONY : all clean fclean re bonus diff --git a/parse_map/libft/README.md b/parse_map/libft/README.md new file mode 100644 index 0000000..7eeea52 --- /dev/null +++ b/parse_map/libft/README.md @@ -0,0 +1 @@ +# 42seoul_Libft diff --git a/parse_map/libft/ft_atoi.c b/parse_map/libft/ft_atoi.c new file mode 100644 index 0000000..e5e5e30 --- /dev/null +++ b/parse_map/libft/ft_atoi.c @@ -0,0 +1,42 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_atoi.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:07:53 by hyko #+# #+# */ +/* Updated: 2022/01/17 02:15:36 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_atoi(const char *str) +{ + long long i; + long long sign; + long long result; + + i = 0; + sign = 1; + result = 0; + while ((9 <= str[i] && str[i] <= 13) || str[i] == 32) + i++; + if (str[i] == '-' || str[i] == '+') + { + if (str[i] == '-') + sign = sign * -1; + i++; + } + while ('0' <= str[i] && str[i] <= '9') + { + result = result * 10 + (str[i] - 48); + if (result * sign > 2147483647) + return (-1); + else if (result * sign < -2147483648) + return (0); + i++; + } + return (result * sign); +} diff --git a/parse_map/libft/ft_bzero.c b/parse_map/libft/ft_bzero.c new file mode 100644 index 0000000..25e29be --- /dev/null +++ b/parse_map/libft/ft_bzero.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_bzero.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:08:08 by hyko #+# #+# */ +/* Updated: 2022/01/16 00:46:19 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_bzero(void *s, size_t n) +{ + ft_memset(s, 0, n); +} diff --git a/parse_map/libft/ft_calloc.c b/parse_map/libft/ft_calloc.c new file mode 100644 index 0000000..14b88fe --- /dev/null +++ b/parse_map/libft/ft_calloc.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_calloc.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:08:32 by hyko #+# #+# */ +/* Updated: 2022/01/16 20:37:34 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_calloc(size_t count, size_t size) +{ + void *tmp; + + tmp = malloc(count * size); + if (tmp == NULL) + return (NULL); + ft_bzero(tmp, (count * size)); + return (tmp); +} diff --git a/parse_map/libft/ft_isalnum.c b/parse_map/libft/ft_isalnum.c new file mode 100644 index 0000000..ca0b3f2 --- /dev/null +++ b/parse_map/libft/ft_isalnum.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isalnum.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:08:55 by hyko #+# #+# */ +/* Updated: 2022/01/03 19:37:41 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_isalnum(int c) +{ + if ((ft_isalpha(c) == 1) || (ft_isdigit(c) == 1)) + return (1); + else + return (0); +} diff --git a/parse_map/libft/ft_isalpha.c b/parse_map/libft/ft_isalpha.c new file mode 100644 index 0000000..5e57d4a --- /dev/null +++ b/parse_map/libft/ft_isalpha.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isalpha.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:09:05 by hyko #+# #+# */ +/* Updated: 2022/01/03 19:15:29 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_isalpha(int c) +{ + if (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z'))) + return (1); + else + return (0); +} diff --git a/parse_map/libft/ft_isascii.c b/parse_map/libft/ft_isascii.c new file mode 100644 index 0000000..e5c4a5a --- /dev/null +++ b/parse_map/libft/ft_isascii.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isascii.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:09:21 by hyko #+# #+# */ +/* Updated: 2022/01/03 19:13:35 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_isascii(int c) +{ + if ((c >= 0) && (c <= 127)) + return (1); + else + return (0); +} diff --git a/parse_map/libft/ft_isdigit.c b/parse_map/libft/ft_isdigit.c new file mode 100644 index 0000000..48f80cf --- /dev/null +++ b/parse_map/libft/ft_isdigit.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isdigit.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:09:30 by hyko #+# #+# */ +/* Updated: 2022/01/03 19:31:44 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_isdigit(int c) +{ + if ((c >= '0') && (c <= '9')) + return (1); + else + return (0); +} diff --git a/parse_map/libft/ft_isprint.c b/parse_map/libft/ft_isprint.c new file mode 100644 index 0000000..933020f --- /dev/null +++ b/parse_map/libft/ft_isprint.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_isprint.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:09:37 by hyko #+# #+# */ +/* Updated: 2022/01/15 21:57:03 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_isprint(int c) +{ + if (c >= 32 && c <= 126) + return (1); + else + return (0); +} diff --git a/parse_map/libft/ft_itoa.c b/parse_map/libft/ft_itoa.c new file mode 100644 index 0000000..8af12db --- /dev/null +++ b/parse_map/libft/ft_itoa.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_itoa.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:09:45 by hyko #+# #+# */ +/* Updated: 2022/01/17 02:34:28 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int nb_len(long nb) +{ + int len; + + len = 0; + if (nb == 0) + return (1); + if (nb < 0) + len++; + while (nb != 0) + { + nb = nb / 10; + len++; + } + return (len); +} + +char *ft_itoa(int n) +{ + char *str; + int len; + int i; + long nb; + + nb = n; + i = 0; + len = nb_len(nb); + str = (char *)malloc(sizeof(char) * len + 1); + if (str == NULL) + return (NULL); + str[len] = '\0'; + if (nb < 0) + { + str[0] = '-'; + nb = nb * -1; + i = 1; + } + while (--len >= i) + { + str[len] = nb % 10 + 48; + nb = nb / 10; + } + return (str); +} diff --git a/parse_map/libft/ft_lstadd_back.c b/parse_map/libft/ft_lstadd_back.c new file mode 100644 index 0000000..3cc3140 --- /dev/null +++ b/parse_map/libft/ft_lstadd_back.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstadd_back.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/12 14:17:31 by hyko #+# #+# */ +/* Updated: 2022/01/17 00:19:55 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_lstadd_back(t_list **lst, t_list *new) +{ + t_list *last; + + if (lst == NULL || new == NULL) + return ; + if (*lst == NULL) + { + *lst = new; + return ; + } + last = ft_lstlast(*lst); + last->next = new; +} diff --git a/parse_map/libft/ft_lstadd_front.c b/parse_map/libft/ft_lstadd_front.c new file mode 100644 index 0000000..611f8c5 --- /dev/null +++ b/parse_map/libft/ft_lstadd_front.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstadd_front.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/12 14:14:16 by hyko #+# #+# */ +/* Updated: 2022/01/17 00:33:10 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_lstadd_front(t_list **lst, t_list *new) +{ + if (lst == NULL || new == NULL) + return ; + new->next = *lst; + *lst = new; +} diff --git a/parse_map/libft/ft_lstclear.c b/parse_map/libft/ft_lstclear.c new file mode 100644 index 0000000..a781b11 --- /dev/null +++ b/parse_map/libft/ft_lstclear.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstclear.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/12 14:18:36 by hyko #+# #+# */ +/* Updated: 2022/01/17 00:50:15 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_lstclear(t_list **lst, void (del)(void*)) +{ + t_list *curr; + + if (lst == NULL || del == NULL) + return ; + while (*lst != NULL) + { + curr = (*lst)->next; + ft_lstdelone(*lst, del); + *lst = curr; + } +} diff --git a/parse_map/libft/ft_lstdelone.c b/parse_map/libft/ft_lstdelone.c new file mode 100644 index 0000000..226c65a --- /dev/null +++ b/parse_map/libft/ft_lstdelone.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstdelone.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/12 14:18:06 by hyko #+# #+# */ +/* Updated: 2022/01/17 00:37:48 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_lstdelone(t_list *lst, void (*del)(void*)) +{ + if (lst == NULL || del == NULL) + return ; + del(lst->content); + free(lst); +} diff --git a/parse_map/libft/ft_lstiter.c b/parse_map/libft/ft_lstiter.c new file mode 100644 index 0000000..23cefb4 --- /dev/null +++ b/parse_map/libft/ft_lstiter.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstiter.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/12 14:19:07 by hyko #+# #+# */ +/* Updated: 2022/01/17 00:57:54 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_lstiter(t_list *lst, void (*f)(void *)) +{ + t_list *curr; + + if (lst == NULL || f == NULL) + return ; + curr = lst; + while (curr != NULL) + { + f(curr->content); + curr = curr->next; + } +} diff --git a/parse_map/libft/ft_lstlast.c b/parse_map/libft/ft_lstlast.c new file mode 100644 index 0000000..f99cbba --- /dev/null +++ b/parse_map/libft/ft_lstlast.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstlast.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/12 14:15:27 by hyko #+# #+# */ +/* Updated: 2022/01/16 23:53:40 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +t_list *ft_lstlast(t_list *lst) +{ + if (lst == NULL) + return (lst); + while (lst->next != NULL) + lst = lst->next; + return (lst); +} diff --git a/parse_map/libft/ft_lstmap.c b/parse_map/libft/ft_lstmap.c new file mode 100644 index 0000000..38c0d58 --- /dev/null +++ b/parse_map/libft/ft_lstmap.c @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstmap.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/12 14:19:32 by hyko #+# #+# */ +/* Updated: 2022/01/17 01:53:57 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *)) +{ + t_list *new_lst; + t_list *curr; + + new_lst = NULL; + while (lst != NULL) + { + curr = ft_lstnew(f(lst->content)); + if (curr == NULL) + { + ft_lstclear(&new_lst, del); + return (NULL); + } + ft_lstadd_back(&new_lst, curr); + lst = lst->next; + } + return (new_lst); +} diff --git a/parse_map/libft/ft_lstnew.c b/parse_map/libft/ft_lstnew.c new file mode 100644 index 0000000..7de8d1d --- /dev/null +++ b/parse_map/libft/ft_lstnew.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstnew.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/12 14:13:20 by hyko #+# #+# */ +/* Updated: 2022/01/17 00:59:00 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +t_list *ft_lstnew(void *content) +{ + t_list *new; + + new = (t_list *)malloc(sizeof(t_list)); + if (new == NULL) + return (NULL); + new->content = content; + new->next = NULL; + return (new); +} diff --git a/parse_map/libft/ft_lstsize.c b/parse_map/libft/ft_lstsize.c new file mode 100644 index 0000000..1cceade --- /dev/null +++ b/parse_map/libft/ft_lstsize.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstsize.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/12 14:14:50 by hyko #+# #+# */ +/* Updated: 2022/01/16 23:52:27 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_lstsize(t_list *lst) +{ + int i; + + i = 0; + while (lst != NULL) + { + lst = lst->next; + i++; + } + return (i); +} diff --git a/parse_map/libft/ft_memchr.c b/parse_map/libft/ft_memchr.c new file mode 100644 index 0000000..2426e8d --- /dev/null +++ b/parse_map/libft/ft_memchr.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memchr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:09:52 by hyko #+# #+# */ +/* Updated: 2022/01/16 20:27:33 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memchr(const void *s, int c, size_t n) +{ + unsigned char *tmp; + size_t i; + + i = 0; + tmp = (unsigned char *)s; + while (i < n) + { + if (tmp[i] == (unsigned char)c) + return ((void *)tmp + i); + i++; + } + return (NULL); +} diff --git a/parse_map/libft/ft_memcmp.c b/parse_map/libft/ft_memcmp.c new file mode 100644 index 0000000..957f0b0 --- /dev/null +++ b/parse_map/libft/ft_memcmp.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memcmp.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:10:00 by hyko #+# #+# */ +/* Updated: 2022/01/16 01:53:05 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_memcmp(const void *s1, const void *s2, size_t n) +{ + unsigned char *tmp1; + unsigned char *tmp2; + size_t i; + + i = 0; + tmp1 = (unsigned char *)s1; + tmp2 = (unsigned char *)s2; + while (i < n) + { + if (!(tmp1[i] == tmp2[i])) + return (tmp1[i] - tmp2[i]); + i++; + } + return (0); +} diff --git a/parse_map/libft/ft_memcpy.c b/parse_map/libft/ft_memcpy.c new file mode 100644 index 0000000..fa99e2c --- /dev/null +++ b/parse_map/libft/ft_memcpy.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memcpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:10:08 by hyko #+# #+# */ +/* Updated: 2022/01/16 20:23:48 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memcpy(void *dst, const void *src, size_t n) +{ + unsigned char *d; + unsigned char *s; + size_t i; + + if (dst == 0 && src == 0 && n > 0) + return (dst); + d = (unsigned char *)dst; + s = (unsigned char *)src; + i = 0; + if (dst == 0 && src == 0 && n > 0) + return (dst); + while (i < n) + { + d[i] = s[i]; + i++; + } + return (dst); +} diff --git a/parse_map/libft/ft_memmove.c b/parse_map/libft/ft_memmove.c new file mode 100644 index 0000000..b0227de --- /dev/null +++ b/parse_map/libft/ft_memmove.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memmove.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:10:19 by hyko #+# #+# */ +/* Updated: 2022/01/16 01:42:39 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memmove(void *dst, const void *src, size_t len) +{ + unsigned char *d; + unsigned char *s; + size_t i; + + d = (unsigned char *)dst; + s = (unsigned char *)src; + i = 0; + if (d < s) + { + while (i < len) + { + d[i] = s[i]; + i++; + } + } + else if (d > s) + { + while (i < len) + { + d[len - 1 - i] = s[len - 1 - i]; + i++; + } + } + return (dst); +} diff --git a/parse_map/libft/ft_memset.c b/parse_map/libft/ft_memset.c new file mode 100644 index 0000000..63348de --- /dev/null +++ b/parse_map/libft/ft_memset.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memset.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:10:27 by hyko #+# #+# */ +/* Updated: 2022/01/16 01:47:44 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void *ft_memset(void *b, int c, size_t len) +{ + size_t i; + unsigned char *tmp; + + tmp = (unsigned char *)b; + i = 0; + while (i < len) + { + tmp[i] = (unsigned char)c; + i++; + } + return (b); +} diff --git a/parse_map/libft/ft_putchar_fd.c b/parse_map/libft/ft_putchar_fd.c new file mode 100644 index 0000000..68c25bf --- /dev/null +++ b/parse_map/libft/ft_putchar_fd.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putchar_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:10:33 by hyko #+# #+# */ +/* Updated: 2022/01/16 21:49:24 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putchar_fd(char c, int fd) +{ + if (fd < 0) + return ; + write(fd, &c, 1); +} diff --git a/parse_map/libft/ft_putendl_fd.c b/parse_map/libft/ft_putendl_fd.c new file mode 100644 index 0000000..e118900 --- /dev/null +++ b/parse_map/libft/ft_putendl_fd.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putendl_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:10:45 by hyko #+# #+# */ +/* Updated: 2022/01/16 21:49:25 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putendl_fd(char *s, int fd) +{ + int i; + + i = 0; + if (s == 0 || fd < 0) + return ; + while (s[i] != '\0') + { + write(fd, &s[i], 1); + i++; + } + write(fd, "\n", 1); +} diff --git a/parse_map/libft/ft_putnbr_fd.c b/parse_map/libft/ft_putnbr_fd.c new file mode 100644 index 0000000..47ac9e8 --- /dev/null +++ b/parse_map/libft/ft_putnbr_fd.c @@ -0,0 +1,40 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putnbr_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:10:52 by hyko #+# #+# */ +/* Updated: 2022/01/16 21:49:23 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putnbr_fd(int n, int fd) +{ + if (n >= 0) + { + if (n < 10) + ft_putchar_fd(n + '0', fd); + else + { + ft_putnbr_fd(n / 10, fd); + ft_putnbr_fd(n % 10, fd); + } + } + else if (n == -2147483648) + write(fd, "-2147483648", 11); + else + { + write(fd, "-", 1); + if (n > -10) + ft_putchar_fd(n * -1 + '0', fd); + else + { + ft_putnbr_fd(n * -1 / 10, fd); + ft_putnbr_fd(n * -1 % 10, fd); + } + } +} diff --git a/parse_map/libft/ft_putstr_fd.c b/parse_map/libft/ft_putstr_fd.c new file mode 100644 index 0000000..f3e12f2 --- /dev/null +++ b/parse_map/libft/ft_putstr_fd.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putstr_fd.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:10:58 by hyko #+# #+# */ +/* Updated: 2022/01/16 21:49:26 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_putstr_fd(char *s, int fd) +{ + int i; + + i = 0; + if (s == 0 || fd < 0) + return ; + while (s[i] != '\0') + { + write(fd, &s[i], 1); + i++; + } +} diff --git a/parse_map/libft/ft_split.c b/parse_map/libft/ft_split.c new file mode 100644 index 0000000..9536cc4 --- /dev/null +++ b/parse_map/libft/ft_split.c @@ -0,0 +1,90 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_split.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:11:04 by hyko #+# #+# */ +/* Updated: 2022/01/17 22:15:49 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include "libft.h" + +static char **ft_malloc_error(char **str) +{ + int i; + + i = 0; + while (str[i]) + { + free(str[i]); + i++; + } + free(str); + return (NULL); +} + +int word_count(char const *s, char c) +{ + int i; + int count; + + if (s[0] == '\0') + return (0); + i = 0; + count = 0; + if (s[0] != c) + count++; + while (s[i + 1] != '\0') + { + if (s[i] == c && s[i + 1] != c) + count++; + i++; + } + return (count); +} + +int word_len(char const *s, char c) +{ + int len; + + len = 0; + while (*s != c && *s != '\0') + { + len++; + s++; + } + return (len); +} + +char **ft_split(char const *s, char c) +{ + char **str; + int total_word; + int next_word_len; + int i; + + if (s == NULL) + return (NULL); + total_word = word_count(s, c); + str = (char **)malloc(sizeof(char *) * (total_word + 1)); + if (str == NULL) + return (NULL); + i = -1; + while (++i < total_word) + { + while (*s == c) + s++; + next_word_len = word_len(s, c); + str[i] = (char *)malloc(sizeof(char) * (next_word_len + 1)); + if (str[i] == NULL) + return (ft_malloc_error(str)); + ft_strlcpy(str[i], s, next_word_len + 1); + s += next_word_len; + } + str[i] = NULL; + return (str); +} diff --git a/parse_map/libft/ft_strchr.c b/parse_map/libft/ft_strchr.c new file mode 100644 index 0000000..4bb7f09 --- /dev/null +++ b/parse_map/libft/ft_strchr.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strchr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:11:11 by hyko #+# #+# */ +/* Updated: 2022/01/16 01:46:39 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strchr(const char *s, int c) +{ + int i; + + i = 0; + while (s[i] != '\0') + { + if (s[i] == (unsigned char)c) + return ((char *)s + i); + i++; + } + if ((unsigned char)c == '\0') + return ((char *)s + i); + return (NULL); +} diff --git a/parse_map/libft/ft_strdup.c b/parse_map/libft/ft_strdup.c new file mode 100644 index 0000000..46a283b --- /dev/null +++ b/parse_map/libft/ft_strdup.c @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strdup.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:11:18 by hyko #+# #+# */ +/* Updated: 2022/01/15 23:50:34 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strdup(const char *s1) +{ + int i; + int len; + char *s2; + + len = ft_strlen(s1); + s2 = (char *)malloc(sizeof(char) * (len + 1)); + if (s2 == NULL) + return (NULL); + i = 0; + while (s1[i] != '\0') + { + s2[i] = s1[i]; + i++; + } + s2[i] = '\0'; + return (s2); +} diff --git a/parse_map/libft/ft_striteri.c b/parse_map/libft/ft_striteri.c new file mode 100644 index 0000000..47cdab5 --- /dev/null +++ b/parse_map/libft/ft_striteri.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_striteri.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:11:26 by hyko #+# #+# */ +/* Updated: 2022/01/16 21:17:28 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_striteri(char *s, void (*f)(unsigned int, char*)) +{ + unsigned int i; + + if (s == 0 || f == 0) + return ; + i = 0; + while (s[i] != '\0') + { + f(i, &s[i]); + i++; + } +} diff --git a/parse_map/libft/ft_strjoin.c b/parse_map/libft/ft_strjoin.c new file mode 100644 index 0000000..c808791 --- /dev/null +++ b/parse_map/libft/ft_strjoin.c @@ -0,0 +1,42 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strjoin.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:11:33 by hyko #+# #+# */ +/* Updated: 2022/01/17 02:07:47 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strjoin(char const *s1, char const *s2) +{ + char *new_str; + size_t s1_len; + size_t s2_len; + size_t i; + size_t j; + + if (s1 == NULL && s2 == NULL) + return (NULL); + if (s1 == NULL) + return ((char *)s2); + if (s2 == NULL) + return ((char *)s1); + s1_len = ft_strlen(s1); + s2_len = ft_strlen(s2); + i = -1; + j = 0; + new_str = (char *)malloc(sizeof(char) * (s1_len + s2_len + 1)); + if (new_str == NULL) + return (NULL); + while (++i < s1_len) + new_str[i] = s1[i]; + while (j < s2_len) + new_str[i++] = s2[j++]; + new_str[i] = '\0'; + return (new_str); +} diff --git a/parse_map/libft/ft_strlcat.c b/parse_map/libft/ft_strlcat.c new file mode 100644 index 0000000..5e95c11 --- /dev/null +++ b/parse_map/libft/ft_strlcat.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlcat.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:11:38 by hyko #+# #+# */ +/* Updated: 2022/01/15 22:23:15 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +size_t ft_strlcat(char *dst, const char *src, size_t size) +{ + size_t i; + size_t j; + size_t dst_len; + size_t src_len; + + dst_len = ft_strlen(dst); + src_len = ft_strlen(src); + i = dst_len; + j = 0; + if (size < dst_len) + return (src_len + size); + while (src[j] != '\0' && i < size - 1 && size != 0) + { + dst[i] = src[j]; + i++; + j++; + } + dst[i] = '\0'; + return (dst_len + src_len); +} diff --git a/parse_map/libft/ft_strlcpy.c b/parse_map/libft/ft_strlcpy.c new file mode 100644 index 0000000..f6f5a8d --- /dev/null +++ b/parse_map/libft/ft_strlcpy.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlcpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:11:45 by hyko #+# #+# */ +/* Updated: 2022/01/15 22:12:40 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +size_t ft_strlcpy(char *dst, const char *src, size_t dstsize) +{ + size_t i; + size_t src_len; + + i = 0; + src_len = ft_strlen(src); + if (dstsize != 0) + { + while (i < (dstsize - 1) && src[i] != '\0') + { + dst[i] = src[i]; + i++; + } + dst[i] = '\0'; + } + return (src_len); +} diff --git a/parse_map/libft/ft_strlen.c b/parse_map/libft/ft_strlen.c new file mode 100644 index 0000000..d245917 --- /dev/null +++ b/parse_map/libft/ft_strlen.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlen.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:11:51 by hyko #+# #+# */ +/* Updated: 2022/01/15 22:06:23 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +size_t ft_strlen(const char *s) +{ + size_t i; + + i = 0; + while (s[i] != '\0') + i++; + return (i); +} diff --git a/parse_map/libft/ft_strmapi.c b/parse_map/libft/ft_strmapi.c new file mode 100644 index 0000000..1c07088 --- /dev/null +++ b/parse_map/libft/ft_strmapi.c @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strmapi.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:11:58 by hyko #+# #+# */ +/* Updated: 2022/01/16 21:08:48 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strmapi(char const *s, char (*f)(unsigned int, char)) +{ + unsigned int len; + unsigned int i; + char *new_s; + + if (s == 0 || f == 0) + return (0); + i = 0; + len = (ft_strlen(s)); + new_s = (char *)malloc(sizeof(char) * (len + 1)); + if (new_s == NULL) + return (NULL); + while (i < len) + { + new_s[i] = f(i, s[i]); + i++; + } + new_s[i] = '\0'; + return (new_s); +} diff --git a/parse_map/libft/ft_strncmp.c b/parse_map/libft/ft_strncmp.c new file mode 100644 index 0000000..3d3455d --- /dev/null +++ b/parse_map/libft/ft_strncmp.c @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strncmp.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:12:05 by hyko #+# #+# */ +/* Updated: 2022/01/15 23:33:25 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_strncmp(const char *s1, const char *s2, size_t n) +{ + size_t i; + unsigned char *cp_s1; + unsigned char *cp_s2; + + i = 0; + cp_s1 = (unsigned char *)s1; + cp_s2 = (unsigned char *)s2; + while (i < n && cp_s1[i] != '\0') + { + if (cp_s1[i] != cp_s2[i]) + return (cp_s1[i] - cp_s2[i]); + i++; + } + if (cp_s1[i] == '\0' && i < n) + return (cp_s1[i] - cp_s2[i]); + return (0); +} diff --git a/parse_map/libft/ft_strnstr.c b/parse_map/libft/ft_strnstr.c new file mode 100644 index 0000000..3ebea1f --- /dev/null +++ b/parse_map/libft/ft_strnstr.c @@ -0,0 +1,39 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strnstr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:12:29 by hyko #+# #+# */ +/* Updated: 2022/01/15 23:43:24 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strnstr(const char *big, const char *little, size_t len) +{ + size_t i; + size_t j; + + if (little[0] == '\0') + return ((char *)big); + i = 0; + while (big[i] != '\0' && i < len) + { + j = 0; + if (big[i] == little[j]) + { + while (big[i + j] == little[j] + && big[i + j] != '\0' && i + j < len) + { + j++; + if (little[j] == '\0') + return ((char *)big + i); + } + } + i++; + } + return (NULL); +} diff --git a/parse_map/libft/ft_strrchr.c b/parse_map/libft/ft_strrchr.c new file mode 100644 index 0000000..00443bb --- /dev/null +++ b/parse_map/libft/ft_strrchr.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strrchr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:12:36 by hyko #+# #+# */ +/* Updated: 2022/01/16 01:46:58 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strrchr(const char *s, int c) +{ + int i; + + i = ft_strlen(s); + while (i >= 0) + { + if (s[i] == (unsigned char)c) + return ((char *)s + i); + i--; + } + return (NULL); +} diff --git a/parse_map/libft/ft_strtrim.c b/parse_map/libft/ft_strtrim.c new file mode 100644 index 0000000..a70200a --- /dev/null +++ b/parse_map/libft/ft_strtrim.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strtrim.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:12:43 by hyko #+# #+# */ +/* Updated: 2022/01/16 20:58:44 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_strtrim(char const *s1, char const *set) +{ + int i; + int j; + char *s2; + + s2 = ""; + if (s1 != 0 && set != 0) + { + i = 0; + j = ft_strlen(s1) - 1; + while (s1[i] != 0 && ft_strchr(set, s1[i]) != 0) + i++; + while (s1[j] != 0 && ft_strchr(set, s1[j]) != 0 && j > i) + j--; + s2 = (char *)malloc(sizeof(char) * (j - i + 2)); + if (s2 == NULL) + return (NULL); + ft_strlcpy(s2, &s1[i], j - i + 2); + } + return (s2); +} diff --git a/parse_map/libft/ft_substr.c b/parse_map/libft/ft_substr.c new file mode 100644 index 0000000..5cdef33 --- /dev/null +++ b/parse_map/libft/ft_substr.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_substr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:12:50 by hyko #+# #+# */ +/* Updated: 2022/01/16 20:16:45 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +char *ft_substr(char const *s, unsigned int start, size_t len) +{ + size_t i; + size_t j; + char *substr; + + i = 0; + j = 0; + if (s == 0) + return (NULL); + if (start >= ft_strlen(s)) + return (ft_strdup("")); + substr = (char *)malloc(sizeof(char) * (len + 1)); + if (substr == NULL) + return (NULL); + while (s[i] != '\0') + { + if (i >= start && j < len) + { + substr[j] = s[i]; + j++; + } + i++; + } + substr[j] = '\0'; + return (substr); +} diff --git a/parse_map/libft/ft_tolower.c b/parse_map/libft/ft_tolower.c new file mode 100644 index 0000000..e0f33d3 --- /dev/null +++ b/parse_map/libft/ft_tolower.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_tolower.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:12:56 by hyko #+# #+# */ +/* Updated: 2022/01/03 20:08:19 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_tolower(int c) +{ + if (c >= 'A' && c <= 'Z') + return (c + 32); + else + return (c); +} diff --git a/parse_map/libft/ft_toupper.c b/parse_map/libft/ft_toupper.c new file mode 100644 index 0000000..de4655c --- /dev/null +++ b/parse_map/libft/ft_toupper.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_toupper.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 19:13:03 by hyko #+# #+# */ +/* Updated: 2022/01/03 19:36:04 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_toupper(int c) +{ + if (c >= 'a' && c <= 'z') + return (c - 32); + else + return (c); +} diff --git a/parse_map/libft/libft.h b/parse_map/libft/libft.h new file mode 100644 index 0000000..3592d23 --- /dev/null +++ b/parse_map/libft/libft.h @@ -0,0 +1,80 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* libft.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: hyko +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/01/03 18:52:12 by hyko #+# #+# */ +/* Updated: 2022/01/15 22:31:28 by hyko ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef LIBFT_H +# define LIBFT_H + +# include +# include + +/* ctype.h */ +int ft_isalpha(int c); +int ft_isdigit(int c); +int ft_isalnum(int c); +int ft_isascii(int c); +int ft_isprint(int c); +int ft_toupper(int c); +int ft_tolower(int c); + +/* string.h */ +size_t ft_strlen(const char *s); +size_t ft_strlcpy(char *dst, const char *src, size_t dstsize); +size_t ft_strlcat(char *dst, const char *src, size_t size); +char *ft_strchr(const char *s, int c); +char *ft_strrchr(const char *s, int c); +int ft_strncmp(const char *s1, const char *s2, size_t n); +char *ft_strnstr(const char *big, const char *little, size_t len); +char *ft_strdup(const char *s1); + +void *ft_memset(void *b, int c, size_t len); +void ft_bzero(void *s, size_t n); +void *ft_memcpy(void *dst, const void *src, size_t n); +void *ft_memmove(void *dst, const void *src, size_t len); +void *ft_memchr(const void *s, int c, size_t n); +int ft_memcmp(const void *s1, const void *s2, size_t n); + +/* stdlib.h */ +int ft_atoi(const char *str); +void *ft_calloc(size_t count, size_t size); + +/* Additional Functions */ +char *ft_substr(char const *s, unsigned int start, size_t len); +char *ft_strjoin(char const *s1, char const *s2); +char *ft_strtrim(char const *s1, char const *set); +char **ft_split(char const *s, char c); +char *ft_itoa(int n); +char *ft_strmapi(char const *s, char (*f)(unsigned int, char)); +void ft_striteri(char *s, void (*f) (unsigned int, char*)); + +void ft_putchar_fd(char c, int fd); +void ft_putstr_fd(char *s, int fd); +void ft_putendl_fd(char *s, int fd); +void ft_putnbr_fd(int n, int fd); + +/* Bouns Part */ +typedef struct s_list +{ + void *content; + struct s_list *next; +} t_list; + +t_list *ft_lstnew(void *content); +void ft_lstadd_front(t_list **lst, t_list *new); +int ft_lstsize(t_list *lst); +t_list *ft_lstlast(t_list *lst); +void ft_lstadd_back(t_list **lst, t_list *new); +void ft_lstdelone(t_list *lst, void (*del)(void*)); +void ft_lstclear(t_list **lst, void (*del)(void*)); +void ft_lstiter(t_list *lst, void (*f)(void *)); +t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *)); + +#endif diff --git a/parse_map/map/Makefile b/parse_map/map/Makefile new file mode 100644 index 0000000..0feb40f --- /dev/null +++ b/parse_map/map/Makefile @@ -0,0 +1,32 @@ +NAME = parsing_test + +SRC = map.c parse_map.c ../get_next_line/get_next_line.c ../get_next_line/get_next_line_utils.c +OBJ = $(SRC:.c=.o) +CFLAGS = -Wall -Wextra -Werror +MLX = -L../mlx -lmlx -framework OpenGL -framework Appkit + +CC = cc +RM = rm -rf + +# LFT = ../libft/libft.a +# # INC = -Ilibft +LIB = -L../libft -lft + +all : $(LFT) $(NAME) + +# $(LFT): +# # $(MAKE) -s -C libft bonus + + +$(NAME) : $(OBJ) + make -C ../mlx/ + $(CC) $(CFLAGS) $(MLX) -o $(NAME) $(OBJ) $(LIB) + +clean : + $(RM) $(OBJ) + +fclean : clean + make -C ../mlx/ clean + $(RM) $(NAME) + +re : fclean all diff --git a/parse_map/map/cub3d.h b/parse_map/map/cub3d.h new file mode 100644 index 0000000..435bbec --- /dev/null +++ b/parse_map/map/cub3d.h @@ -0,0 +1,163 @@ +#ifndef CUB3D_H +#define CUB3D_H + +#include "../mlx/mlx.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef struct s_mlx +{ + void *mlx; + void *win; +} t_mlx; + +typedef struct s_img +{ + void *img; + int bpp; + int size_line; + int endian; + int *data; +} t_img; + +typedef struct s_player +{ + double x; + double y; + double rotation_angle;//바라보는각도. 시야각도 + double walk_speed;//움직이는 속도 + double turn_speed;//바라보는 각도의 조정속도 +} t_player; + +typedef struct s_key +{ + bool up; + bool down; + bool left; + bool right; +} t_key; + +typedef struct s_temp_ray +{ + double xintercept; + double yintercept; + double xstep; + double ystep; + int found_wallHit; + double xhit_wall; + double yhit_wall; + double distance; +} t_temp_ray;//변수명 다시 + +typedef struct s_ray +{ + double ray_angle; + double xhit_wall; + double yhit_wall; + double distance; + bool vert_hit; + bool ray_faces_down; + bool ray_faces_up; + bool ray_faces_right; + bool ray_faces_left; +} t_ray;//변수명 다시 +//광선이 벽과 만나는 좌표와 +//광선의 방향적인 요소를 가지고있다 + +typedef struct s_map +{ + unsigned long long row;//ull..? + unsigned long long col; + char **dp_map; + unsigned long long row_tile_size; + unsigned long long col_tile_size; +} t_map;//필요시 minimap으로 + +typedef struct s_map_info +{ + void* no; + void* so; + void* we; + void* ea; + int f; + int c; + char** tile; + int info_cnt; + int tile_cnt; +} t_map_info; + +typedef struct s_all +{ + t_mlx mlx; + t_img img; + t_player player; + t_key key; + t_ray ray; + t_map map; + t_map_info map_info; //구조체 이름 수정 필요 +} t_all; + +#define MINI_SCALE 0.5 +#define TILE_SIZE 80 + +#define WINDOW_WID 640 +#define WINDOW_HEI 480 + +# define X_EVENT_KEY_PRESS 2 +# define X_EVENT_KEY_RELEASE 3 +// # define X_EVENT_WINDOW_DESTROY 17 + +#define PI (3.14159265358979323846264338327950288) +#define TWO_PI (6.28318530717958647692528676655900576) + +#define RAY_RANGE (PI / 3.0) // player 시야범위. 무난하게 60도 +#define RAY_COUNT 121 // 광선의 갯수. 2보다 커야하고 홀수 추천 + +// #define BUFFER_SIZE 333 + +int key_press(int keycode, t_all *p_all); +void init_player(t_all *p_all); +bool hit_wall(double x, double y, t_all *p_all); +void update_player(t_all *p_all); +void fill_square(t_all *p_all, int x, int y, int color); +void render_map(t_all *p_all); +void draw_player(t_all *p_all); +int ft_loop(t_all *p_all);//이름 수정할거임 +void render_player(t_all *p_all); +int key_release(int keycode, t_all *p_all); + +void ray_init(t_ray *p_ray, double ang); +void calc_distance(t_all *p_all, t_temp_ray *hv); +double distance_btw_points(double xa, double ya, double xb, double yb); +void calc_ray(t_all *p_all, t_temp_ray *hv); +void calc_horz_ray(t_all *p_all, t_temp_ray *p_horz); +void calc_vert_ray(t_all *p_all, t_temp_ray *p_vert); +void draw_line(t_all *p_all, double xa, double ya, double xb, double yb); +void draw_one_ray(t_all *p_all, double ang); +void draw_ray(t_all *p_all); +double normalize_angle(double ang); + +void get_row_col(char *argv, t_all *p_all); +void get_map(char *argv, t_all *p_all); + +size_t ft_strlen(const char *str); +char *ft_strchr(const char *s, int c); +size_t ft_strlcpy(char *dst, const char *src, size_t dstsize); +size_t ft_strlcat(char *dst, const char *src, size_t dstsize); +char *ft_strjoin(const char *s1, const char *s2); +char *for_next(char *save); +char *rtg(char *save); +char *read_and_save(int fd, char *save); +char *get_next_line(int fd); + +void locate_for_mini(int *xp, int *yp, int x, int y, t_all *p_all); +void init_map(char *argv, t_all *p_all); + +#endif diff --git a/parse_map/map/error.c b/parse_map/map/error.c new file mode 100644 index 0000000..72736fc --- /dev/null +++ b/parse_map/map/error.c @@ -0,0 +1,2 @@ +#include "cub3d.h" + diff --git a/parse_map/map/map.c b/parse_map/map/map.c new file mode 100644 index 0000000..0ba6e20 --- /dev/null +++ b/parse_map/map/map.c @@ -0,0 +1,133 @@ +#include "map.h" + +static void display_map_elements(t_all* all) +{ + printf("texture NO: %p\n", all->map_info.no); + printf("texture SO: %p\n", all->map_info.so); + printf("texture WE: %p\n", all->map_info.we); + printf("texture EA: %p\n", all->map_info.ea); + printf("\n"); + printf("color F: %x\n", all->map_info.f); + printf("color C: %x\n", all->map_info.c); + printf("\n"); + printf("map\n row:%llu col:%llu\n", all->map.row, all->map.col); + for (int i = 0; i < (int)all->map.row; i++) + printf("%s", all->map_info.tile[i]); +} + +void display_err_msg_and_exit(const char* err_msg) +{ + // free + printf("ERROR\n"); + printf("%s\n", err_msg); + exit (1); +} + +void get_row(char* filename, t_all* all) +{ + char *tmp; + int fd; + int i; + + all->map.row = 0; + all->map.col = 0; + + fd = open(filename, O_RDONLY); + if (!fd) + display_err_msg_and_exit("Invalid File"); + tmp = " "; + while (tmp) + { + i = 0; + tmp = get_next_line(fd); + if (tmp) + { + while (tmp[i] == ' ') + i++; + if (tmp[i] == '1') + all->map.row++; + } + free(tmp); + } + close(fd); +} + +static void init_map_info(t_all* all) +{ + all->map_info.no = 0; + all->map_info.so = 0; + all->map_info.we = 0; + all->map_info.ea = 0; + all->map_info.f = 0; + all->map_info.c = 0; + all->map_info.tile = (char**)malloc(sizeof(char*) * all->map.row); + all->map_info.info_cnt = 0; + all->map_info.tile_cnt = 0; +} + +static void is_vaild_map(char** map, int row) +{ + int i; + int j; + int player; + + i = 0; + j = 0; + player = 0; + while (i < row) + { + j = 0; + while (map[i][j]) + { + if (ft_strchr("NSEW", map[i][j])) + player++; + if (!ft_strchr(" \t\n1", map[i][j])) + { + if (ft_strchr(" \t\n", map[i - 1][j]) + || ft_strchr(" \t\n", map[i + 1][j]) + || ft_strchr(" \t\n", map[i][j - 1]) + || ft_strchr(" \t\n", map[i][j + 1])) + { + printf("[%d][%d]\n", i, j); + display_err_msg_and_exit("Invalid Map"); + } + } + j++; + } + i++; + } + if (player != 1) + display_err_msg_and_exit("Invalid Player"); +} + +int main(int argc, char** argv) +{ + int fd; + char* line; + t_all all; + + if (argc != 2) + display_err_msg_and_exit("Invalid argument"); + is_cub_file(argv[1]); + + all.mlx.mlx = mlx_init(); //지우기!! + + get_row(argv[1], &all); + init_map_info(&all); + + fd = open(argv[1], O_RDONLY); + line = " "; + while (line) + { + line = get_next_line(fd); + if (line) + check_type(line, &all); + } + free(line); + close(fd); + + is_vaild_map(all.map_info.tile, all.map.row); + + /* debug */ + display_map_elements(&all); +} diff --git a/parse_map/map/map.h b/parse_map/map/map.h new file mode 100644 index 0000000..a09690a --- /dev/null +++ b/parse_map/map/map.h @@ -0,0 +1,25 @@ +#ifndef MAP_H +# define MAP_H + +#include "../get_next_line/get_next_line.h" +#include "cub3d.h" +#include "../libft/libft.h" +#include +#include + +typedef enum e_type +{ + NO, + SO, + WE, + EA, + F, + C, + TILE, +} t_type; + +void is_cub_file(const char* filename); +void check_type(char* line, t_all *all); +void display_err_msg_and_exit(const char* err_msg); + +#endif diff --git a/parse_map/map/parse_map.c b/parse_map/map/parse_map.c new file mode 100644 index 0000000..d62e392 --- /dev/null +++ b/parse_map/map/parse_map.c @@ -0,0 +1,152 @@ +#include "map.h" + +void is_cub_file(const char* filename) +{ + size_t len = ft_strlen(filename); + if (len < 5) + display_err_msg_and_exit("Invalid file extension"); + if (ft_strncmp(&filename[len - 4], ".cub", 4)) + display_err_msg_and_exit("Invalid file extension"); +} + +static void is_valid_texture(char* path, int type, t_all* all) +{ + int img_width = 50; //나중에 헤더에 정의 + int img_height = 50; + + int e_flag; + void* tmp; + + while(*path == ' ') //이거 메모리 누수 안나나? + path++; + if (path[ft_strlen(path) - 1] == '\n') //개행 지우기 + path[ft_strlen(path) - 1] = '\0'; + tmp = mlx_xpm_file_to_image(all->mlx.mlx, path, &img_width, &img_height); + if (!tmp) + display_err_msg_and_exit("Invalid image file"); + + e_flag = 1; + if (type == NO && !all->map_info.no && e_flag--) + all->map_info.no = tmp; + else if (type == SO && !all->map_info.so && e_flag--) + all->map_info.so = tmp; + else if (type == WE && !all->map_info.we && e_flag--) + all->map_info.we = tmp; + else if (type == EA && !all->map_info.ea && e_flag--) + all->map_info.ea = tmp; + + if (e_flag) + display_err_msg_and_exit("Duplicate Elements"); +} + +static int is_digit_or_space(char* str) +{ + int i; + + i = 0; + while (str[i] && ft_strchr(" \n0123456789", str[i])) + i++; + if (i != (int)ft_strlen(str)) + return (1); + return (0); +} + +static void free_double_pointer(char** arr) +{ + int i; + + i = 0; + while (arr[i]) + { + free(arr[i]); + i++; + } + free(arr); +} + +static void is_valid_color(char* color, int type, t_all* all) +{ + char** tmp; + int rgb[3]; + int result; + int i; + + tmp = ft_split(color, ','); + i = 0; + while (tmp[i]) + i++; + if (i != 3) + { + free_double_pointer(tmp); + display_err_msg_and_exit("Invalid color information"); + } + result = 0; + i = 0; + while (i < 3) + { + if (is_digit_or_space(tmp[i])) + { + free_double_pointer(tmp); + display_err_msg_and_exit("Invalid color information"); + } + rgb[i] = ft_atoi(tmp[i]); + if (rgb[i] < 0 || rgb[i] > 255) + display_err_msg_and_exit("Invalid color information"); + result <<= 8; + result += rgb[i]; + i++; + } + if (type == F) + all->map_info.f = result; + else if (type == C) + all->map_info.c = result; + free_double_pointer(tmp); +} + +static void is_valid_tile(char* line, t_all* all) +{ + int i; + + i = 0; + while (line[i]) + { + if (!ft_strchr(" \n01NSEW", line[i])) + display_err_msg_and_exit("Invalid map"); + i++; + } + all->map_info.tile[all->map_info.tile_cnt] = line; + if (all->map.col < (ft_strlen(line) - 1)) + all->map.col = ft_strlen(line) - 1; + all->map_info.tile_cnt++; +} + +void check_type(char* line, t_all *all) +{ + int i; + + i = 0; + while (line[i] == ' ') + i++; + if (line[i] == '\n' && (all->map_info.tile_cnt == 0 || all->map_info.tile_cnt == (int)all->map.row)) + return ; + else if (all->map_info.info_cnt < 6) + { + if (line[i] == 'N' && line[i + 1] == 'O') + is_valid_texture(line += 2, NO, all); + else if (line[i] == 'S' && line[i + 1] == 'O') + is_valid_texture(line += 2, SO, all); + else if (line[i] == 'W' && line[i + 1] == 'E') + is_valid_texture(line += 2, WE, all); + else if (line[i] == 'E' && line[i + 1] == 'A') + is_valid_texture(line += 2, EA, all); + else if (line[i] == 'F') + is_valid_color(line += 1, F, all); + else if (line[i] == 'C') + is_valid_color(line += 1, C, all); + all->map_info.info_cnt++; + } + else if (line[i] == '1') + is_valid_tile(line, all); + else + display_err_msg_and_exit("Invalid element in map file"); +} diff --git a/parse_map/map/test_map.cub b/parse_map/map/test_map.cub new file mode 100644 index 0000000..55d5792 --- /dev/null +++ b/parse_map/map/test_map.cub @@ -0,0 +1,31 @@ +WE ../textures/barrel.xpm +EA ../textures/barrel.xpm + + +F 220 ,100 , 0 +C 225 ,30 , 0 + +NO ../textures/barrel.xpm +SO ../textures/barrel.xpm + + + 11111111111111111111111111 + 100000000011000000000000001 + 10110000011100000000000011 + 1001000000000000000000001 +111111111011000001110000000000001 +100000000011000001110111111111111 +11110111111111011100000010001 +11110111111111011101010010001 +11000000110101011100000010001 +10000000000000001100000010001 +10000000000000001101010010001 +11000001110101011111011110N0111 +11110111 1110101 101111010001 +11110111 1111111 111111111111 +1000001 +1000001 +1000001 +1111111 + + diff --git a/parse_map/mlx/Makefile b/parse_map/mlx/Makefile new file mode 100644 index 0000000..2e44836 --- /dev/null +++ b/parse_map/mlx/Makefile @@ -0,0 +1,24 @@ +# +# + +NOM=libmlx.a +SRC= mlx_shaders.c mlx_new_window.m mlx_init_loop.m mlx_new_image.m mlx_xpm.c mlx_int_str_to_wordtab.c +SRC+= mlx_png.c mlx_mouse.m +OBJ1=$(SRC:.c=.o) +OBJ=$(OBJ1:.m=.o) +CFLAGS+=-O2 + +# add to match string put with X11 in size and position +CFLAGS+= -DSTRINGPUTX11 + +all: $(NOM) + +$(NOM): $(OBJ) + ar -r $(NOM) $(OBJ) + ranlib $(NOM) + +clean: + rm -f $(NOM) $(OBJ) *~ + rm -f mlx_app + +re: clean all diff --git a/parse_map/mlx/font.c b/parse_map/mlx/font.c new file mode 100644 index 0000000..656d248 --- /dev/null +++ b/parse_map/mlx/font.c @@ -0,0 +1,3525 @@ +/* GIMP RGBA C-Source image dump (font.c) */ + +static const struct { + unsigned int width; + unsigned int height; + unsigned int bytes_per_pixel; /* 2:RGB16, 3:RGB, 4:RGBA */ + unsigned char pixel_data[1140 * 20 * 4 + 1]; +} font_atlas = { + 1140, 20, 4, + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\214\377\377\377\224\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377I\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377" + ")\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\216\377\377\377\263\377\377\377\13\0" + "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\0\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377b\377\377\377V\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\215\377\377\377\270\377\377" + "\377u\377\377\377\13\377\377\377\252\377\377\377\255\377\377\377\13\0\0\0" + "\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\317\377\377\377\374\377\377" + "\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377" + "\377e\377\377\3775\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\234\377\377\377\267" + "\377\377\377B\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\343\377\377" + "\377\375\377\377\377M\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\13\377\377\377\355\377\377\377\367\377\377\3778\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377j\377\377\377\373\377\377\377\243\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377b\377\377\377\237\377\377\377\233\377\377\377Z\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "b\377\377\377c\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377)\377\377\377e\377\377\377I\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377U\377\377\377" + "c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377b\377\377\377c\377\377\377\13\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377S\377\377\377c\377\377\3775\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\213\377" + "\377\377\363\377\377\377\364\377\377\377\364\377\377\377\372\377\377\377" + "\225\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377u\377\377" + "\377\371\377\377\377\233\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\215\377\377\377\372" + "\377\377\377\364\377\377\377\364\377\377\377\363\377\377\377\224\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377U\377\377\377e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\377\377\377\13\377\377\377\351\377\377\377\376\377\377\377s\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\214\377\377\377\372\377" + "\377\377\\\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\367\377\377\377" + "\315\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\3775\377\377\377\340" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\304\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\214\377\377\377\372\377\377\377\\\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377s\377\377\377\366\377\377\377\342\377\377\377%" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377s\377\377\377\366\377\377\377\342\377\377\377%\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377" + "\372\377\377\377\225\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\306\377\377\377\374\377" + "\377\377\370\377\377\377\370\377\377\377\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377E\377\377" + "\377\317\377\377\377\357\377\377\377\373\377\377\377\225\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\320" + "\377\377\377\374\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\215\377\377\377\372\377\377\377\363\377" + "\377\377\333\377\377\377m\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\1\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\13\377\377\377\364\377\377\377\366\377\377\377%\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377" + "\377\361\377\377\377\377\377\377\377\254\377\377\377=\377\377\377\375\377" + "\377\377\372\377\377\377)\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\215\377\377\377\363\377\377\377%\377\377\377" + "\224\377\377\377\363\377\377\377%\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\3772\377\377\377\336\377\377\377\375\377" + "\377\377x\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\262\377\377\377\372\377\377\377\370\377\377\377\246\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377=\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\377\377\377~\377\377\377\374\377\377\377\377\377\377" + "\377\376\377\377\377\224\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377V\377\377\377\375\377\377\377" + "\376\377\377\377l\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\325\377\377\377\377" + "\377\377\377\271\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\355\377\377\377\33\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377v\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" + "\315\377\377\377\367\377\377\377\373\377\377\377\334\377\377\377B\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377`\377\377\377\300\377\377\377\342\377\377\377Z\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\224\377\377" + "\377\347\377\377\377\373\377\377\377\364\377\377\377\312\377\377\377)\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377" + "\226\377\377\377\346\377\377\377\370\377\377\377\360\377\377\377\327\377" + "\377\377b\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\214\377\377\377\343\377\377\377\273" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377" + "\377\377\315\377\377\377\337\377\377\377\333\377\377\377\333\377\377\377" + "\333\377\377\377\343\377\377\377\223\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\215\377\377\377\346\377\377\377" + "\370\377\377\377\364\377\377\377\320\377\377\377O\0\0\0\0\377\377\377\377" + "\377\377\377\377\377\377\377\13\377\377\377\315\377\377\377\337\377\377\377" + "\333\377\377\377\333\377\377\377\333\377\377\377\333\377\377\377\333\377" + "\377\377\323\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0" + "\0\377\377\3772\377\377\377\316\377\377\377\366\377\377\377\373\377\377\377" + "\344\377\377\377\200\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\377\377\377u\377\377\377\342\377\377\377\370\377\377\377\364" + "\377\377\377\305\377\377\377%\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377)\377\377\3775\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\371\371\377.\377\377\377V\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\13\377\377\377\321\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\271\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377Q\377\377\377" + "\273\377\377\377\332\377\377\377\322\377\377\377\206\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\3778\377\377" + "\377\367\377\377\377\376\377\377\377s\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\374\377\377\377\360\377\377\377\253\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377" + "\13\377\377\377\304\377\377\377\375\377\377\377\377\377\377\377\377\377\377" + "\377\373\377\377\377\247\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\307\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\374\377\377\377\324\377\377\377B\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\346" + "\377\377\377\13\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377" + "\377\377\352\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\376\377\377\377l\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\377\377\3775\377\377\377\333\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\361\377\377\377\202\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\307\377\377\377\376\377" + "\377\377i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\352\377\377\377\364" + "\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\373\377\377\377" + "\377\377\377\377\377\377\377\377\303\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\13\377\377\377\361\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\225\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377" + "\377\377\377\225\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\356\377\377\377" + "\376\377\377\377v\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13" + "\377\377\377\352\377\377\377\364\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\307\377" + "\377\377\377\377\377\377\243\0\0\0\0\0\0\0\0\377\377\377u\377\377\377\375" + "\377\377\377\321\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377\307\377\377\377\377\377\377\377\251\0\0\0\0\0\0\0\0\377\377\377\13\377" + "\377\377\355\377\377\377\330\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\377\377\377\206\377\377\377\366\377\377\377\377\377\377\377" + "\377\377\377\377\373\377\377\377\246\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\370\377\377\377\324\377\377\377" + "B\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\206" + "\377\377\377\370\377\377\377\377\377\377\377\377\377\377\377\373\377\377" + "\377\240\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377\224\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\364\377\377\377\312\377\377\377\33\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\377\377\377\204\377\377\377\365\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\342\377\377\377V\0\0\0\0" + "\377\377\377\377\377\377\377\377\377\377\377\224\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\373\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\252\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\307\377\377\377\376\377\377\377i\0\0\0\0\0\0" + "\0\0\377\377\377\13\377\377\377\352\377\377\377\364\377\377\377%\377\377" + "\377\377\377\377\377\377\377\377\377}\377\377\377\376\377\377\377\332\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\262\377\377\377\377\377\377\377" + "\216\377\377\377\377\377\377\377\377\377\377\377\345\377\377\377\372\377" + "\377\377=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355" + "\377\377\377\356\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377" + "\345\377\377\377\376\377\377\377~\0\0\0\0\0\0\0\0\377\377\3778\377\377\377" + "\367\377\377\377\360\377\377\377\33\377\377\377\377\377\377\377\377\377\377" + "\377\206\377\377\377\377\377\377\377\332\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\266\377\377\377\377\377\377\377\234\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\361" + "\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\224\377\377\377\377\377\377\377\312\377\377\377\255\377\377\377" + "\266\377\377\377u\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377;\377\377\377\373\377\377\377\347\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377`\377\377" + "\377\266\377\377\377\263\377\377\377\256\377\377\377\373\377\377\377\254" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\33\377\377\377\371\377\377\377\376\377\377\377_\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377b\377\377\377\374" + "\377\377\377\355\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\224\377\377\377\376\377\377\377l\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377" + "\377\377\374\377\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\334\377\377\377\377\377\377\377\346\377\377\377\272\377\377\377" + "\342\377\377\377\276\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377" + "l\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\215\377\377\377\377" + "\377\377\377\377\377\377\377l\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\215\377\377\377\377\377" + "\377\377\377\377\377\377l\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377K\377\377\377\375\377\377\377\254\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\247\377\377\377\343\377\377\377\340\377\377\377\377\377\377\377" + "\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377`\377\377\377\262\377\377\377=\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\342\377\377\377\377\377\377\377" + "\325\377\377\377\266\377\377\377u\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377" + "\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377`\377\377\377\263\377\377\377\307\377\377\377\376\377\377\377\363" + "\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\0\377\377\377\0\377\377\377\0\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377" + "\377\351\377\377\377\366\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\356\377\377\377\377" + "\377\377\377\243\377\377\377;\377\377\377\374\377\377\377\364\377\377\377" + "%\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\313\377\377\377\355\0\0\0\0\377\377\377\320\377\377\377\346\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\247" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\352\377\377\377S\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377" + "}\377\377\377\377\377\377\377\326\377\377\377\334\377\377\377\376\377\377" + "\377l\0\0\0\0\377\377\377}\377\377\377\377\377\377\377\323\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\354\377\377\377\364\377" + "\377\377\226\377\377\377\373\377\377\377\337\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\33\377\377" + "\377\362\377\377\377\376\377\377\377l\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\232\377" + "\377\377\377\377\377\377\336\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\302\377\377\377\377\377" + "\377\377\277\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377|\377\377\377\205\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377_\377\377\377\232\377\377\377\13\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "!\377\377\377\371\377\377\377\352\377\377\377\13\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\345\377\377\377\377\377" + "\377\377\365\377\377\377\353\377\377\377\377\377\377\377\367\377\377\377" + "2\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\313" + "\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377l\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\314\377" + "\377\377\377\377\377\377\376\377\377\377\335\377\377\377\371\377\377\377" + "\377\377\377\377\352\377\377\377\33\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377\302\377\377\377\377\377\377\377\377\377\377\377\342" + "\377\377\377\362\377\377\377\377\377\377\377\375\377\377\377\\\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "U\377\377\377\374\377\377\377\377\377\377\377\333\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\361\377\377\377" + "\377\377\377\377\373\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\251\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377" + "\377\377\247\377\377\377\377\377\377\377\377\377\377\377\360\377\377\377" + "\373\377\377\377\377\377\377\377\360\377\377\377\33\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\332\377\377\377\377\377\377\377\376\377\377" + "\377\374\377\377\377\374\377\377\377\376\377\377\377\377\377\377\377\367" + "\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\25\377" + "\377\377\356\377\377\377\377\377\377\377\351\377\377\377\350\377\377\377" + "\376\377\377\377\376\377\377\377s\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377|\377\377\377\376\377\377\377\377\377\377\377\345\377" + "\377\377\356\377\377\377\377\377\377\377\355\377\377\377%\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377}\377\377\377\374\377\377\377\254\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377V\377\377\377\375\377\377\377\241\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\3778\377" + "\377\377\372\377\377\377\343\377\377\377u\377\377\377\217\377\377\377\374" + "\377\377\377\375\377\377\377M\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\377\377\377\233\377\377\377\376\377\377\377\377\377\377\377" + "\354\377\377\377\375\377\377\377\377\377\377\377\257\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\232\377\377\377" + "\377\377\377\377\377\377\377\377\277\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377" + "\342\377\377\377\304\377\377\377\332\377\377\377\376\377\377\377\377\377" + "\377\377\227\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377" + "\377\377\331\377\377\377\377\377\377\377\373\377\377\377\306\377\377\377" + "\307\377\377\377\375\377\377\377\376\377\377\377Q\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\313\377\377\377\377\377\377\377\330\377\377" + "\377\310\377\377\377\370\377\377\377\377\377\377\377\375\377\377\377f\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\374" + "\377\377\377\376\377\377\377\323\377\377\377\327\377\377\377\327\377\377" + "\377\327\377\377\377\316\377\377\377\33\377\377\377\377\377\377\377\377\0" + "\0\0\0\377\377\377\13\377\377\377\356\377\377\377\376\377\377\377\324\377" + "\377\377\327\377\377\377\327\377\377\377\327\377\377\377\312\377\377\377" + "%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\33\377\377\377\362" + "\377\377\377\377\377\377\377\365\377\377\377\277\377\377\377\321\377\377" + "\377\377\377\377\377\366\377\377\377\33\377\377\377\377\377\377\377\377\0" + "\0\0\0\377\377\377\313\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377" + "\377\13\377\377\377\356\377\377\377\366\377\377\377%\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377}\377\377\377\332\377\377\377\323\377\377" + "\377\371\377\377\377\377\377\377\377\331\377\377\377\327\377\377\377\266" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377" + "\302\377\377\377\323\377\377\377\322\377\377\377\322\377\377\377\342\377" + "\377\377\377\377\377\377\252\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\224\377\377\377\377\377\377\377\252\0\0\0\0\0\0\0\0\377" + "\377\377\335\377\377\377\377\377\377\377\315\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\13\377\377\377\356\377\377\377\366\377\377" + "\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\313\377\377\377\377\377\377\377\336\0\0\0\0\0\0" + "\0\0\377\377\377\275\377\377\377\377\377\377\377\330\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\312\377\377\377\377\377\377\377" + "\364\377\377\377%\0\0\0\0\377\377\377\13\377\377\377\361\377\377\377\333" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377j\377\377\377" + "\375\377\377\377\377\377\377\377\325\377\377\377\313\377\377\377\376\377" + "\377\377\377\377\377\377\225\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\224\377\377\377\377\377\377\377\342\377\377\377\310\377" + "\377\377\322\377\377\377\366\377\377\377\377\377\377\377\355\377\377\377" + "\33\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377j\377\377\377\375" + "\377\377\377\377\377\377\377\321\377\377\377\307\377\377\377\376\377\377" + "\377\377\377\377\377\216\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\224\377\377\377\377\377\377\377\342\377\377\377\310\377\377" + "\377\322\377\377\377\371\377\377\377\377\377\377\377\336\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\374\377\377\377" + "\377\377\377\377\330\377\377\377\271\377\377\377\351\377\377\377\377\377" + "\377\377\334\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377}\377\377" + "\377\332\377\377\377\327\377\377\377\323\377\377\377\371\377\377\377\377" + "\377\377\377\331\377\377\377\326\377\377\377\332\377\377\377p\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377" + "i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\356\377\377\377\366\377\377" + "\377%\377\377\377\377\377\377\377\377\377\377\377\33\377\377\377\365\377" + "\377\377\375\377\377\3778\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\345" + "\377\377\377\375\377\377\377Q\377\377\377\377\377\377\377\377\377\377\377" + "\313\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\13\377\377\377\361\377\377\377\347\377\377\377\377\377\377\377\377\0" + "\0\0\0\377\377\377\214\377\377\377\377\377\377\377\343\0\0\0\0\0\0\0\0\377" + "\377\377\261\377\377\377\377\377\377\377\272\0\0\0\0\377\377\377\377\377" + "\377\377\377\377\377\377\13\377\377\377\351\377\377\377\376\377\377\377i" + "\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\366\377\377\377\372\377\377\377" + "8\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377v\377\377\377\327\377" + "\377\377\322\377\377\377\322\377\377\377\316\377\377\377\351\377\377\377" + "\377\377\377\377\360\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377U\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377" + "\377\377\320\377\377\377\376\377\377\377_\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\13\377\377\377\364\377\377\377\254\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377" + "\377\377\377\377\377\377\377\377\377\377\272\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\233\377\377\377\371\377\377\377" + "i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\376\377\377" + "\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377I\377\377\377\373\377\377\377" + "\356\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377" + "\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "S\377\377\377\314\377\377\377\271\377\377\377\13\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377S\377" + "\377\377\314\377\377\377\271\377\377\377\13\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\375\377\377\377\252\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\360\377\377\377\334\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\247\377\377\377\377\377\377\377l\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\361\377\377\377\337\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\313\377\377\377\372\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\0\377\377\377\0\377\377\377\3\0" + "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\331" + "\377\377\377\376\377\377\377i\377\377\377K\377\377\377\374\377\377\377\366" + "\377\377\377)\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\316\377\377\377\333\0\0\0\0\377\377\377\316\377\377\377" + "\333\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "8\377\377\377\372\377\377\377\377\377\377\377\307\377\377\377\237\377\377" + "\377\364\377\377\377\377\377\377\377\244\0\0\0\0\377\377\377\377\377\377" + "\377\377\377\377\377\232\377\377\377\375\377\377\3772\377\377\377=\377\377" + "\377\375\377\377\377\254\377\377\377!\377\377\377\371\377\377\377\367\377" + "\377\3778\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377;\377\377\377" + "\372\377\377\377\346\377\377\377\13\377\377\377\371\377\377\377\333\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\13\377\377\377\355\377\377\377\375\377\377\377\\\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\13\377\377\377\355\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377!\377\377\377\372\377\377\377\375\377\377\3778\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\327\377\377\377\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\320\377\377" + "\377\374\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\252\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\204\377" + "\377\377\377\377\377\377\353\377\377\377\13\0\0\0\0\377\377\377\320\377\377" + "\377\377\377\377\377\260\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\377\377\377\205\377\377\377\322\377\377\377\353\377\377\377\376" + "\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\325\377\377\377\375\377\377\377M\0\0\0\0\377\377\377\33" + "\377\377\377\356\377\377\377\376\377\377\377l\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\215\377\377\377\375\377\377\377Z\0\0\0\0" + "\0\0\0\0\377\377\377\325\377\377\377\377\377\377\377\257\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\25\377\377\377" + "\356\377\377\377\377\377\377\377\377\377\377\377\326\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\374\377\377" + "\377\330\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377!\377\377\377\371\377\377\377\377\377" + "\377\377\216\0\0\0\0\0\0\0\0\377\377\377\302\377\377\377\224\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\302\377\377\377\377\377\377\377\252\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377V\377\377\377\375\377\377\377\333" + "\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\260\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\330\377\377\377\377" + "\377\377\377\251\0\0\0\0\377\377\377\13\377\377\377\336\377\377\377\377\377" + "\377\377\227\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\250\377\377\377\276\377\377\377\33\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\250\377\377\377\276\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\276\377\377\377\377\377\377\377\377\377\377\377\225\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377I\377\377\377\373\377\377\377\377\377\377\377\325\377" + "\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\306\377" + "\377\377\376\377\377\377l\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377K\377\377\377\374\377\377\377\375\377\377\377q\0\0\0\0\377\377" + "\377\33\377\377\377\362\377\377\377\366\377\377\377%\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\334\377\377\377\377\377" + "\377\377\376\377\377\377\360\377\377\377\33\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\243" + "\0\0\0\0\0\0\0\0\377\377\377\223\377\377\377\377\377\377\377\327\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377s\377\377\377\376\377" + "\377\377\375\377\377\377_\0\0\0\0\0\0\0\0\377\377\377z\377\377\377\257\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377" + "\376\377\377\377U\0\0\0\0\377\377\377\33\377\377\377\353\377\377\377\377" + "\377\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377K\377\377\377\374\377\377\377\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377" + "\377\355\377\377\377\366\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\247\377\377\377" + "\377\377\377\377\364\377\377\377)\0\0\0\0\0\0\0\0\377\377\377\246\377\377" + "\377\213\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313" + "\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" + "\355\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\355\377\377\377\363\377\377\377\13\0" + "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\213\377\377\377\377\377\377\377" + "\252\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377" + "\377\377\377\377\377\377\252\0\0\0\0\377\377\377\270\377\377\377\377\377" + "\377\377\355\377\377\377\33\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0" + "\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\307\377\377\377\377\377\377\377\375\377\377\3778\377\377\377\13" + "\377\377\377\352\377\377\377\377\377\377\377\327\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\307\377\377\377\377\377\377\377\377" + "\377\377\377\251\0\0\0\0\377\377\377\13\377\377\377\361\377\377\377\333\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377" + "\377\377\377\377\315\0\0\0\0\0\0\0\0\377\377\377\253\377\377\377\377\377" + "\377\377\346\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\224\377\377\377\377\377\377\377\243\0\0\0\0\0\0\0\0\377\377\377\25\377\377" + "\377\356\377\377\377\376\377\377\377l\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\313\377\377\377\377\377\377\377\310\0\0\0\0\0\0\0\0\377" + "\377\377\253\377\377\377\377\377\377\377\342\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\243\0\0" + "\0\0\0\0\0\0\377\377\377!\377\377\377\371\377\377\377\367\377\377\377)\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\232\377\377\377\377\377" + "\377\377\315\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\302\377\377\377z\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\355\377\377\377\363\377\377\377\13\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377" + "i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377" + "\377%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\312\377\377\377" + "\377\377\377\377\215\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377" + "\377\347\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\247\377\377" + "\377\377\377\377\377\206\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377" + "\377\377\374\377\377\377\333\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\377\377\377\342\377\377\377\376\377\377\377v\377\377\377\33\377\377" + "\377\366\377\377\377\367\377\377\377)\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\214\377\377\377\377\377\377\377\316\0\0\0\0\0\0" + "\0\0\377\377\377\232\377\377\377\377\377\377\377\264\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\25\377\377\377\356\377\377\377\376\377\377\377v\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\376" + "\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\377\377\377\377\277\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\364\377\377\377\254\0" + "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\335\377\377\377\370\377\377\377\353\377\377\377\363\377" + "\377\377%\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377)\377\377\377V\377\377\377\33\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224" + "\377\377\377\376\377\377\377b\0\0\0\0\377\377\377S\377\377\3775\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377S\377\377\377I\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377S\377" + "\377\3775\377\377\377;\377\377\377\374\377\377\377\333\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377)\377\377" + "\377V\377\377\377\13\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377;\377\377\377\374\377\377\377\326" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377E\377\377\377E\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377" + "\377\376\377\377\377b\0\0\0\0\377\377\377E\377\377\377S\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377" + "\377\375\377\377\377\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377" + "\377\377\361\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377)\377\377\377X\0" + "\0\0\0\0\0\0\0\377\377\377V\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377E\377\377\377S\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377E\377\377\377K\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377S\377\377\3775\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377S\377\377\3775\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377)\377\377\377U\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377E\377\377\377U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\376\377\377" + "\377b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\361" + "\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371" + "\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377" + "%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\0\377" + "\377\377\0\377\377\377\6\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371" + "\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377l\377\377\377\33" + "\377\377\377\364\377\377\377\352\377\377\377\13\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\3772\377\377\377\274\377\377\377\361\377\377" + "\377\375\377\377\377\265\377\377\377\367\377\377\377\372\377\377\377\221" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377V\377\377\377" + "\374\377\377\377\336\0\0\0\0\0\0\0\0\377\377\3775\377\377\377\261\377\377" + "\377\13\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\232\377\377\377" + "\371\377\377\377\33\377\377\377;\377\377\377\374\377\377\377\217\377\377" + "\377\335\377\377\377\375\377\377\377\\\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\33\377\377\377\371\377\377\377\333\377\377\377e" + "\377\377\377\374\377\377\377\326\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\361\377" + "\377\377\364\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377b\377\377\377\375\377\377\377" + "\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\266\377\377\377\377\377\377\377" + "\227\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\316\377\377\377\334\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\335\377\377" + "\377\375\377\377\377=\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\306\377\377\377\377\377\377\377\225\0\0\0\0\0\0\0\0\377" + "\377\377`\377\377\377\375\377\377\377\346\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\213\377\377\377\376" + "\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\3772\377\377\377f\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\253\377" + "\377\377\376\377\377\377i\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\231\377\377\377\377" + "\377\377\377\257\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\313\377\377\377\377\377\377\377\356\377\377\377\374" + "\377\377\377\332\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377K\377\377\377\374\377\377\377\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\224\377\377\377\377\377\377\377\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377b\377\377\377\375\377\377\377\347\377\377\377\13" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377U\377\377\377" + "\375\377\377\377\266\0\0\0\0\0\0\0\0\377\377\377;\377\377\377\374\377\377" + "\377\236\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\25\377\377\377" + "\361\377\377\377\367\377\377\377)\0\0\0\0\0\0\0\0\377\377\377j\377\377\377" + "\376\377\377\377\322\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\214\377\377\377\377\377\377\377\377\377\377\377" + "\260\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\214\377\377\377\377\377\377\377\377\377\377\377" + "\260\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377G\377\377\377\350\377\377\377\377\377\377\377\367" + "\377\377\377y\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\207\377\377\377\307\377\377\377\304\377\377\377\304\377\377\377" + "\304\377\377\377\304\377\377\377\304\377\377\377\243\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377S\377\377\377\351\377\377" + "\377\377\377\377\377\365\377\377\377n\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\13\377\377\377\345\377\377\377\376\377\377\377_\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\273\377\377\377\377\377\377\377\234" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\232\377\377\377\376\377\377\377i\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377;\377\377\377\373" + "\377\377\377\344\377\377\377\317\377\377\377\376\377\377\377v\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377" + "\377\377\377\377\252\0\0\0\0\0\0\0\0\377\377\377X\377\377\377\375\377\377" + "\377\327\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\300" + "\377\377\377\377\377\377\377\277\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377" + "\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377" + "\377\375\377\377\377Q\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "K\377\377\377\374\377\377\377\332\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377" + "\355\377\377\377\366\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\342\377\377\377\377" + "\377\377\377\225\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377" + "\377b\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377" + "\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\13\377\377\377\355\377\377\377\366\377\377\377)\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\252\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377" + "\377\377\237\377\377\377\203\377\377\377\377\377\377\377\375\377\377\377" + "Q\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13" + "\377\377\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\312\377" + "\377\377\377\377\377\377\377\377\377\377\217\377\377\377X\377\377\377\375" + "\377\377\377\373\377\377\377\332\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377\313\377\377\377\373\377\377\377\371\377\377\377\366" + "\377\377\377%\377\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\377" + "\377\377\377\377\377\377\377\377\377\377\33\377\377\377\362\377\377\377\375" + "\377\377\377\\\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\366\377\377\377" + "\375\377\377\377Q\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224" + "\377\377\377\377\377\377\377\252\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\306" + "\377\377\377\375\377\377\377\\\377\377\377\377\377\377\377\377\377\377\377" + "\33\377\377\377\362\377\377\377\375\377\377\377Q\0\0\0\0\0\0\0\0\377\377" + "\377!\377\377\377\371\377\377\377\375\377\377\377M\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\252\0\0\0\0" + "\0\0\0\0\377\377\377\25\377\377\377\370\377\377\377\364\377\377\377%\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\232\377\377\377\377\377" + "\377\377\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355" + "\377\377\377\366\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377i\0\0\0\0" + "\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\204\377\377\377\377\377" + "\377\377\311\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377" + "\260\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\222\377\377\377" + "\377\377\377\377\252\0\0\0\0\377\377\377\307\377\377\377\355\377\377\377" + "%\377\377\377K\377\377\377\374\377\377\377\260\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\377\377\377l\377\377\377\376\377\377\377\333\377\377" + "\377\243\377\377\377\377\377\377\377\244\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\345\377\377\377\375\377" + "\377\377M\377\377\377\13\377\377\377\351\377\377\377\372\377\377\377)\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\317\377\377\377\377\377\377\377\277\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377" + "\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\25\377\377\377\362\377\377\377" + "\363\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\364\377" + "\377\377\254\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\377\377\377U\377\377\377\374\377\377\377\316\377\377\377\247" + "\377\377\377\377\377\377\377\206\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\216\377\377\377\345\377\377" + "\377\377\377\377\377\377\377\377\377\376\377\377\377\275\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\376" + "\377\377\377\271\377\377\377\364\377\377\377\377\377\377\377\377\377\377" + "\377\313\377\377\377\13\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0" + "\0\0\0\377\377\377\13\377\377\377\272\377\377\377\371\377\377\377\377\377" + "\377\377\377\377\377\377\355\377\377\377\200\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\361\377\377\377\377" + "\377\377\377\377\377\377\377\325\377\377\377\377\377\377\377\332\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\3775\377\377\377" + "\327\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\267\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\205\377" + "\377\377\361\377\377\377\363\377\377\377\377\377\377\377\374\377\377\377" + "\364\377\377\377\367\377\377\377\354\377\377\377%\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\377\377\377b\377\377\377\350\377\377\377\377\377" + "\377\377\377\377\377\377\360\377\377\377\360\377\377\377\375\377\377\377" + "\243\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377" + "\376\377\377\377\215\377\377\377\350\377\377\377\377\377\377\377\377\377" + "\377\377\346\377\377\3772\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\301\377\377\377\370\377\377\377\364\377\377\377\364\377\377" + "\377\360\377\377\377\350\377\377\377%\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\301\377\377\377\370\377\377\377\364\377" + "\377\377\364\377\377\377\360\377\377\377\350\377\377\377%\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\375\377" + "\377\377\252\0\0\0\0\0\0\0\0\377\377\377S\377\377\377\354\377\377\377\363" + "\377\377\377I\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\342\377\377" + "\377\332\377\377\377\374\377\377\377\377\377\377\377\276\377\377\377\353" + "\377\377\377\377\377\377\377\352\377\377\377)\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\214\377\377\377\371\377\377\377\212\377\377\377" + "\350\377\377\377\377\377\377\377\377\377\377\377\346\377\377\3772\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377u\377\377\377" + "\351\377\377\377\377\377\377\377\377\377\377\377\364\377\377\377\222\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\213\377" + "\377\377\371\377\377\377\262\377\377\377\365\377\377\377\377\377\377\377" + "\377\377\377\377\313\377\377\377\13\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\361\377\377\377\377\377\377\377" + "\377\377\377\377\310\377\377\377\347\377\377\377\315\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\301\377\377\377\351\377" + "\377\377)\377\377\377\326\377\377\377\377\377\377\377\377\377\377\377\372" + "\377\377\377M\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377" + "\224\377\377\377\365\377\377\377\377\377\377\377\377\377\377\377\373\377" + "\377\377\300\377\377\377=\0\0\0\0\377\377\377\377\377\377\377\377\377\377" + "\377\13\377\377\377\332\377\377\377\360\377\377\377\373\377\377\377\377\377" + "\377\377\376\377\377\377\364\377\377\377\367\377\377\377\354\377\377\377" + "%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\301\377\377\377\354" + "\377\377\3772\0\0\0\0\0\0\0\0\377\377\377I\377\377\377\364\377\377\377\275" + "\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377I\377\377\377\364\377" + "\377\377\330\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\267\377\377\377" + "\367\377\377\377\\\377\377\377\377\377\377\377\377\377\377\377\335\377\377" + "\377\360\377\377\3778\0\0\0\0\377\377\377~\377\377\377\224\0\0\0\0\377\377" + "\377\13\377\377\377\332\377\377\377\342\377\377\377\377\377\377\377\377\0" + "\0\0\0\377\377\377\275\377\377\377\373\377\377\377\255\0\0\0\0\0\0\0\0\377" + "\377\377r\377\377\377\370\377\377\377\315\0\0\0\0\377\377\377\377\377\377" + "\377\377\377\377\377I\377\377\377\364\377\377\377\330\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\254\377\377\377\367\377\377\377\\\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\365\377\377\377\364\377" + "\377\377\364\377\377\377\364\377\377\377\360\377\377\377\360\377\377\377" + "\354\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313" + "\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\0\377\377\377\0\377\377\377\7\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\313\377\377\377\372\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\306\377\377\377\375" + "\377\377\3778\377\377\377\13\377\377\377\364\377\377\377\334\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\364" + "\377\377\377\376\377\377\377\370\377\377\377\364\377\377\377\376\377\377" + "\377\374\377\377\377\320\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\3778\377\377\377\372\377\377\377\376\377\377\377\307\377\377\377" + "O\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377" + "\377\223\377\377\377\377\377\377\377\234\377\377\377\243\377\377\377\376" + "\377\377\377\217\377\377\377\373\377\377\377v\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\331\377\377\377\377\377" + "\377\377\377\377\377\377\367\377\377\3778\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\323" + "\377\377\377\374\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\245\377\377\377\377\377" + "\377\377\215\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377V\377\377\377\375\377\377" + "\377\322\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\260\377\377\377\354\377\377\377\236\377\377\377\326\377\377" + "\377\361\377\377\377\224\377\377\377\341\377\377\377\314\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313" + "\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\325" + "\377\377\377\374\377\377\3772\377\377\377\215\377\377\377\241\377\377\377" + "\13\377\377\377\361\377\377\377\367\377\377\377)\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\376" + "\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\307\377\377\377" + "\376\377\377\377l\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\200\377\377\377\363\377\377\377\376" + "\377\377\377s\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377" + "\377\377\240\377\377\377\377\377\377\377\363\377\377\377V\377\377\377\374" + "\377\377\377\333\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377K\377\377\377\374\377\377\377\333\377\377\377\274\377\377\377" + "\310\377\377\377\251\377\377\377=\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\314\377\377\377\376\377\377\377l\377\377\377" + "j\377\377\377\237\377\377\377\223\377\377\377%\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\342\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\3778\377\377\377\372\377\377\377\376\377\377\377" + "\237\0\0\0\0\377\377\377\254\377\377\377\377\377\377\377\243\0\0\0\0\377" + "\377\377\377\377\377\377\377\377\377\377\25\377\377\377\361\377\377\377\366" + "\377\377\377\33\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\366\377\377\377" + "\355\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\232\377\377\377\377\377\377\377\377\377\377\377\323\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\232\377\377\377\377\377\377\377\377\377\377\377\323\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377" + "\377\224\377\377\377\374\377\377\377\377\377\377\377\314\377\377\377\33\0" + "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\274\377\377\377\377\377\377\377\370\377\377\377\370\377\377\377\370\377" + "\377\377\370\377\377\377\373\377\377\377\321\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\264\377\377\377" + "\377\377\377\377\377\377\377\377\262\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\337" + "\377\377\377\377\377\377\377\271\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\377\377\377\25\377\377\377\361\377\377\377\352\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377U\377\377\377\237\377\377\377\376\377\377\377l\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\232\377\377\377\377" + "\377\377\377\266\377\377\377\213\377\377\377\377\377\377\377\304\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377" + "\377\377\377\377\377\265\377\377\377E\377\377\377y\377\377\377\337\377\377" + "\377\377\377\377\377\227\0\0\0\0\377\377\377\377\377\377\377\377\377\377" + "\377\13\377\377\377\352\377\377\377\375\377\377\377Q\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\313\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\324\377\377\377\376\377\377\377l\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377K\377\377\377\374\377\377\377\337\377\377\377Z\377\377\377" + "p\377\377\377p\377\377\377f\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377)\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377" + "\377\3775\377\377\377\371\377\377\377\367\377\377\377)\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\313\377\377\377\376\377\377\377\224\377\377\377m\377\377\377v\377" + "\377\377h\377\377\377\362\377\377\377\366\377\377\377%\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377" + "\377\366\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377" + "\377\377\377\377\377\377\252\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\224\377\377\377\377\377\377\377\300\377\377\377\372\377" + "\377\377\377\377\377\377\236\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377" + "\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\313\377\377\377\370\377\377\377\366\377\377\377" + "\317\377\377\377\243\377\377\377\376\377\377\377\372\377\377\377\333\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377" + "\367\377\377\377\304\377\377\377\377\377\377\377\251\377\377\377\13\377\377" + "\377\361\377\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\377\377" + "\377U\377\377\377\374\377\377\377\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\314\377\377\377\376\377\377\377i\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\243\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\335\377\377\377\376\377\377\377l\377\377\377\377\377" + "\377\377\377\377\377\377U\377\377\377\374\377\377\377\336\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\317\377\377\377\376\377\377\377l\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377" + "\243\0\0\0\0\0\0\0\0\377\377\377`\377\377\377\373\377\377\377\366\377\377" + "\377%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377`\377\377\377\374" + "\377\377\377\377\377\377\377\336\377\377\377\205\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\13\377\377\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377" + "\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377" + "\377\366\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\33\377\377\377\371\377\377\377\360\377\377\377\33\0\0\0\0\377\377\377\320" + "\377\377\377\376\377\377\377_\0\0\0\0\377\377\377\377\377\377\377\377\377" + "\377\377U\377\377\377\375\377\377\377\277\377\377\377\33\377\377\377\366" + "\377\377\377\376\377\377\377m\377\377\377\213\377\377\377\377\377\377\377" + "\243\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\324\377\377\377\377\377\377\377\377\377\377\377\355\377\377\377\33\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\204" + "\377\377\377\377\377\377\377\304\377\377\377\204\377\377\377\377\377\377" + "\377\260\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\214\377\377\377\377\377\377\377\355\377\377" + "\377\33\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\224\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\266\377\377\377\377\377\377\377\206\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\13\377\377\377\364\377\377\377\254\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\266\377\377\377\377\377" + "\377\377\207\377\377\377K\377\377\377\374\377\377\377\327\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377}\377\377\377" + "\377\377\377\377\373\377\377\377\313\377\377\377\303\377\377\377\374\377" + "\377\377\377\377\377\377\252\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\224\377\377\377\377\377\377\377\377\377\377\377\351\377" + "\377\377\300\377\377\377\365\377\377\377\377\377\377\377\316\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\346\377\377" + "\377\377\377\377\377\365\377\377\377\305\377\377\377\315\377\377\377\376" + "\377\377\377\366\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377}\377\377\377\376\377\377\377\377\377\377\377\325\377\377\377\321" + "\377\377\377\376\377\377\377\377\377\377\377\332\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\3778\377\377\377\371\377\377\377\377\377" + "\377\377\335\377\377\377\263\377\377\377\351\377\377\377\377\377\377\377" + "\304\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377S\377\377" + "\377\330\377\377\377\343\377\377\377\377\377\377\377\364\377\377\377\327" + "\377\377\377\333\377\377\377\322\377\377\377\33\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\3778\377\377\377\372\377\377\377\376\377\377\377\275" + "\377\377\377\307\377\377\377\376\377\377\377\377\377\377\377\324\377\377" + "\377y\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377" + "\377\377\377\377\377\377\377\377\370\377\377\377\306\377\377\377\356\377" + "\377\377\377\377\377\377\322\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\224\377\377\377\336\377\377\377\333\377\377\377\327\377" + "\377\377\377\377\377\377\366\377\377\377)\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\336\377\377\377\333" + "\377\377\377\327\377\377\377\377\377\377\377\366\377\377\377)\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\375" + "\377\377\377\252\0\0\0\0\377\377\377`\377\377\377\373\377\377\377\377\377" + "\377\377\242\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\355" + "\377\377\377\377\377\377\377\346\377\377\377\362\377\377\377\377\377\377" + "\377\362\377\377\377\347\377\377\377\377\377\377\377\215\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\377" + "\377\377\377\370\377\377\377\306\377\377\377\356\377\377\377\377\377\377" + "\377\322\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377u\377" + "\377\377\376\377\377\377\377\377\377\377\321\377\377\377\307\377\377\377" + "\375\377\377\377\377\377\377\377\243\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\377\377\377\377" + "\352\377\377\377\300\377\377\377\365\377\377\377\377\377\377\377\316\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377}\377\377\377\376" + "\377\377\377\377\377\377\377\325\377\377\377\321\377\377\377\376\377\377" + "\377\377\377\377\377\332\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377\366\377\377\377\377" + "\377\377\377\335\377\377\377\322\377\377\377\343\377\377\377%\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377u\377\377\377\377\377\377\377\370" + "\377\377\377\277\377\377\377\262\377\377\377\346\377\377\377\377\377\377" + "\377\231\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377" + "\315\377\377\377\330\377\377\377\370\377\377\377\377\377\377\377\335\377" + "\377\377\327\377\377\377\333\377\377\377\322\377\377\377\33\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377l\0\0" + "\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\341\377\377\377\376\377\377" + "\377v\0\0\0\0\0\0\0\0\377\377\377!\377\377\377\371\377\377\377\366\377\377" + "\377)\377\377\377\377\377\377\377\377\377\377\377\313\377\377\377\377\377" + "\377\377\205\377\377\377\13\377\377\377\364\377\377\377\376\377\377\377Q" + "\377\377\377!\377\377\377\371\377\377\377\352\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377I\377\377\377\372\377\377\377\376\377\377\377v\377" + "\377\377\33\377\377\377\362\377\377\377\376\377\377\377}\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\335\377\377\377\376\377\377" + "\377v\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\364\377\377\377\372\377" + "\377\3772\377\377\377\377\377\377\377\377\0\0\0\0\377\377\3775\377\377\377" + "\323\377\377\377\333\377\377\377\333\377\377\377\327\377\377\377\377\377" + "\377\377\377\377\377\377\326\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\320\377\377\377\355\377\377\377" + "\13\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\313\377\377\377\371\377\377\377\33\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377}\377\377" + "\377\313\377\377\377\257\377\377\377\13\0\0\0\0\377\377\377\223\377\377\377" + "\252\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\0\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\316" + "\377\377\377\352\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\377\377\377z\377\377\377\325\377\377\377\33\377" + "\377\377\13\377\377\377\314\377\377\377\267\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377!\377\377\377\373\377\377\377" + "\211\377\377\377!\377\377\377\374\377\377\377\200\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\205\377\377\377\370" + "\377\377\377\377\377\377\377\377\377\377\377\345\377\377\377\200\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\333\377" + "\377\377\377\377\377\377\377\377\377\377\321\0\0\0\0\377\377\377r\377\377" + "\377z\377\377\377%\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377\25\377\377\377\337\377\377\377\377\377\377\377\375\377\377\3778\0\0" + "\0\0\377\377\377U\377\377\377\365\377\377\377\256\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\255\377\377\377\275" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\314\377\377\377\376\377\377\377b\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\33\377\377\377\371\377\377\377\333\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377~\377\377\377" + "\347\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\361\377\377\377\227\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\312\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\322\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\312\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\322\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\261\377\377\377\377\377\377\377" + "\215\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377" + "\25\377\377\377\361\377\377\377\363\377\377\377E\377\377\377\375\377\377" + "\377\377\377\377\377V\377\377\377\324\377\377\377\366\377\377\377%\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224" + "\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377j\377\377" + "\377\375\377\377\377\361\377\377\377%\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\215\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377b\377\377\377\374\377\377\377\375\377\377" + "\377Q\377\377\377K\377\377\377\374\377\377\377\332\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\375\377\377\377" + "\377\377\377\377\374\377\377\377\376\377\377\377\377\377\377\377\375\377" + "\377\377s\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\312" + "\377\377\377\377\377\377\377\360\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\376\377\377\377\213\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\377\377" + "\377\377\315\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\377\377\377\215\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\333\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\321\377\377\377\377\377\377\377\315\377" + "\377\377q\377\377\377\221\377\377\377\363\377\377\377\377\377\377\377\364" + "\377\377\377)\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377G\377\377\377\330\377\377\377\343\377\377\377c\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "G\377\377\377\330\377\377\377\343\377\377\377c\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377V\377\377\377\375\377\377" + "\377\376\377\377\377\214\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377U\377\377\377\374\377\377\377" + "\377\377\377\377m\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\330\377\377\377\377\377\377\377\271\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377U\377\377\377" + "\375\377\377\377\252\0\0\0\0\377\377\377\233\377\377\377\366\377\377\377" + "\377\377\377\377\377\377\377\377\376\377\377\377i\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\377\377\377\334\377\377\377\376\377\377\377U\377" + "\377\377!\377\377\377\371\377\377\377\363\377\377\377%\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\371\377" + "\377\377)\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377" + "\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377" + "\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377" + "\377\376\377\377\377i\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "K\377\377\377\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\375\377\377\377)\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377l\0\0\0\0\377" + "\377\377\377\377\377\377\377\377\377\377K\377\377\377\374\377\377\377\333" + "\0\0\0\0\0\0\0\0\377\377\377\247\377\377\377\327\377\377\377\322\377\377" + "\377\300\377\377\377\13\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\312\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\364\377\377\377%\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377" + "\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224" + "\377\377\377\377\377\377\377\252\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\332\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377" + "\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\313\377\377\377\363\377\377\377\301\377\377" + "\377\373\377\377\377\356\377\377\377\333\377\377\377\352\377\377\377\333" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377" + "\377\376\377\377\377w\377\377\377\371\377\377\377\366\377\377\377!\377\377" + "\377\360\377\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\377\377" + "\377K\377\377\377\374\377\377\377\327\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\312\377\377\377\377\377\377\377\251\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\326\377\377\377" + "\247\377\377\377\262\377\377\377\351\377\377\377\377\377\377\377\355\377" + "\377\377\33\377\377\377\377\377\377\377\377\377\377\377K\377\377\377\374" + "\377\377\377\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377" + "\377\376\377\377\377i\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\224\377\377\377\377\377\377\377\356\377\377\377\340\377\377\377\343\377" + "\377\377\376\377\377\377\377\377\377\377\304\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\365\377\377\377\377" + "\377\377\377\377\377\377\377\364\377\377\377\247\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" + "\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377i\0\0" + "\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\321\377\377" + "\377\376\377\377\377i\377\377\377\33\377\377\377\365\377\377\377\355\377" + "\377\377\13\0\0\0\0\377\377\377\377\377\377\377\377\377\377\3778\377\377" + "\377\372\377\377\377\327\377\377\377c\377\377\377\377\377\377\377\377\377" + "\377\377\271\377\377\377\205\377\377\377\376\377\377\377i\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377l\377\377\377\377\377" + "\377\377\377\377\377\377\226\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\344\377\377\377\376\377" + "\377\377\372\377\377\377\367\377\377\377)\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377!\377\377\377\371\377" + "\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\376\377\377" + "\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377V\377\377\377\375\377\377\377\326\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\364\377\377\377\254\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\33\377" + "\377\377\364\377\377\377\363\377\377\377%\0\0\0\0\377\377\377\335\377\377" + "\377\375\377\377\377M\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\377\377\377\177\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\205\377" + "\377\377\376\377\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\224\377\377\377\377\377\377\377\257\0\0\0\0\0\0\0\0\377" + "\377\377;\377\377\377\373\377\377\377\372\377\377\3778\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\247\377\377\377\377\377\377\377\345\377" + "\377\377\33\0\0\0\0\0\0\0\0\377\377\377O\377\377\377X\0\0\0\0\377\377\377" + "\377\377\377\377\377\377\377\377\13\377\377\377\351\377\377\377\377\377\377" + "\377\252\0\0\0\0\0\0\0\0\377\377\377b\377\377\377\375\377\377\377\332\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\306\377\377\377" + "\377\377\377\377\252\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\344\377\377\377" + "\372\377\377\377)\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377%\377\377\377\374\377\377\377\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\232\377\377\377" + "\377\377\377\377\264\0\0\0\0\0\0\0\0\377\377\377\335\377\377\377\376\377" + "\377\377Q\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224" + "\377\377\377\377\377\377\377\325\377\377\377\13\0\0\0\0\377\377\377;\377" + "\377\377\373\377\377\377\363\377\377\377%\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\354\377\377\377\366" + "\377\377\377%\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\354\377\377\377\366\377\377\377" + "%\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377" + "\377\377\375\377\377\377\237\377\377\377j\377\377\377\374\377\377\377\376" + "\377\377\377\214\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377" + "\377\377\361\377\377\377\352\0\0\0\0\377\377\377\306\377\377\377\375\377" + "\377\377=\377\377\377\211\377\377\377\377\377\377\377\252\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\325" + "\377\377\377\13\0\0\0\0\377\377\377;\377\377\377\373\377\377\377\363\377" + "\377\377%\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\351" + "\377\377\377\377\377\377\377\243\0\0\0\0\0\0\0\0\377\377\377r\377\377\377" + "\375\377\377\377\363\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\224\377\377\377\377\377\377\377\257\0\0\0\0\0\0\0\0\377\377" + "\377;\377\377\377\373\377\377\377\372\377\377\3778\377\377\377\377\377\377" + "\377\377\377\377\377\13\377\377\377\351\377\377\377\377\377\377\377\252\0" + "\0\0\0\0\0\0\0\377\377\377b\377\377\377\375\377\377\377\332\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\312\377\377\377\377" + "\377\377\377\372\377\377\377f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377" + "\333\377\377\377\13\0\0\0\0\0\0\0\0\377\377\377S\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\306\377\377" + "\377\376\377\377\377U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377i\0\0\0\0" + "\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\204\377\377\377\377\377\377\377" + "\322\0\0\0\0\0\0\0\0\377\377\377\241\377\377\377\377\377\377\377\264\0\0" + "\0\0\377\377\377\377\377\377\377\377\377\377\377\224\377\377\377\377\377" + "\377\377\266\377\377\377;\377\377\377\374\377\377\377\377\377\377\377\226" + "\377\377\377l\377\377\377\377\377\377\377\300\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\377\377\377u\377\377\377\376\377\377\377\361\377\377" + "\377\325\377\377\377\377\377\377\377\252\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377s\377\377\377\377\377\377\377\333\0\0" + "\0\0\0\0\0\0\377\377\377\215\377\377\377\377\377\377\377\277\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\314\377\377\377\377\377\377\377\333\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377E\377\377\377\217\377\377" + "\377\373\377\377\377\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377" + "\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\376\377" + "\377\377\247\377\377\377I\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377\214\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\364\377\377\377\245\377\377\377\372\377\377\377\355\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\0\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\324\377\377\377" + "\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\205\377\377\377" + "\271\377\377\377\376\377\377\377\303\377\377\377\262\377\377\377\377\377" + "\377\377\315\377\377\377l\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\220\377\377\377\341\377\377\377\377" + "\377\377\377\377\377\377\377\233\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\257\377\377\377)\377\377\377" + "\313\377\377\377\377\377\377\377\377\377\377\377\375\377\377\377\\\377\377" + "\377\377\377\377\377\377\377\377\377\13\377\377\377\342\377\377\377\377\377" + "\377\377\373\377\377\377\377\377\377\377\265\0\0\0\0\377\377\377\266\377" + "\377\377\377\377\377\377\215\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377" + "\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" + "\360\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\261\377\377\377\377\377\377\377" + "\377\377\377\377\332\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377`\377\377\377\262\377\377\377\251\377\377\377\354" + "\377\377\377\373\377\377\377\261\377\377\377\262\377\377\377\224\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377v\377\377\377\263\377\377\377\255\377\377\377\255\377" + "\377\377\255\377\377\377\255\377\377\377\263\377\377\377\224\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\356\377\377\377\366\377\377" + "\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377" + "\13\377\377\377\356\377\377\377\363\371\371\377.\377\377\377\362\377\377" + "\377\375\377\377\377B\377\377\377\335\377\377\377\366\377\377\377%\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224" + "\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377U\377\377\377\373" + "\377\377\377\376\377\377\377s\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\205\377\377\377\271\377\377\377" + "\332\377\377\377\377\377\377\377\373\377\377\377r\0\0\0\0\377\377\377\377" + "\377\377\377\377\377\377\377\33\377\377\377\362\377\377\377\377\377\377\377" + "\242\377\377\377E\377\377\377x\377\377\377\374\377\377\377\336\377\377\377" + "K\377\377\377\13\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377" + "\377\216\377\377\377]\0\0\0\0\0\0\0\0\377\377\377\251\377\377\377\377\377" + "\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\312\377\377\377\377\377\377\377\356\377\377\377v\0\0\0\0\377\377\377\220" + "\377\377\377\374\377\377\377\363\377\377\377\33\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\324\377\377\377\376\377" + "\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377j\377\377\377\374\377\377\377\367\377\377\377\260\377\377\377" + "\342\377\377\377\377\377\377\377\376\377\377\377\224\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\3775\377\377\377\347\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\343\377\377\377\374\377\377" + "\377\360\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\25\377\377\377\337\377\377\377\377\377\377\377\361\377\377\377\200" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377b\377\377\377\232\377\377\377\232\377\377\377\232\377\377\377" + "\232\377\377\377\232\377\377\377\232\377\377\377}\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377_\377\377\377" + "\345\377\377\377\377\377\377\377\361\377\377\3778\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377V\377\377\377\376\377" + "\377\377\344\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\377\377\377K\377\377\377\374\377\377\377\245\377\377\377l\377\377\377" + "\377\377\377\377\344\377\377\377v\377\377\377;\377\377\377\375\377\377\377" + "l\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377;\377\377\377\373\377" + "\377\377\376\377\377\377\301\377\377\377\271\377\377\377\374\377\377\377" + "\376\377\377\377v\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377\224\377\377\377\377\377\377\377\304\377\377\377e\377\377\377x\377\377" + "\377\300\377\377\377\376\377\377\377\367\377\377\377)\377\377\377\377\377" + "\377\377\377\377\377\377\13\377\377\377\361\377\377\377\367\377\377\377)" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377i\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\307\377\377\377\376\377\377\377i\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\343\377" + "\377\377|\377\377\377\202\377\377\377\211\377\377\377\202\377\377\377\13" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377" + "\355\377\377\377\373\377\377\377\300\377\377\377\276\377\377\377\276\377" + "\377\377\302\377\377\377G\0\0\0\0\377\377\377\377\377\377\377\377\377\377" + "\377U\377\377\377\374\377\377\377\352\377\377\377\13\0\0\0\0\377\377\377" + "\307\377\377\377\374\377\377\377\377\377\377\377\372\377\377\377)\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377" + "\377\240\377\377\377\200\377\377\377\210\377\377\377\202\377\377\377\371" + "\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\377\377\377" + "\377\252\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224" + "\377\377\377\377\377\377\377\377\377\377\377\311\377\377\377\343\377\377" + "\377\377\377\377\377\225\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\313\377\377\377\366\377\377\377]\377\377\377\375\377\377" + "\377\377\377\377\377\211\377\377\377\354\377\377\377\333\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377" + "\377V\377\377\377\252\377\377\377\377\377\377\377\244\377\377\377\354\377" + "\377\377\334\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377U\377\377" + "\377\374\377\377\377\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\307" + "\377\377\377\376\377\377\377\177\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\224\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\374\377\377\377\324\377\377\377)\0\0\0\0\377\377\377" + "\377\377\377\377\377\377\377\377U\377\377\377\374\377\377\377\327\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\307\377\377\377\376\377\377\377l\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377" + "\377\377\365\377\377\377\357\377\377\377\377\377\377\377\377\377\377\377" + "\224\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\210\377\377\377\335\377\377\377\377\377\377\377" + "\377\377\377\377\315\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377\313\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377\13\377" + "\377\377\355\377\377\377\366\377\377\377)\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\377\377\377\215\377\377\377\377\377\377\377\254\377\377" + "\377c\377\377\377\377\377\377\377\273\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\377\377\377\13\377\377\377\361\377\377\377\340\377\377\377\277" + "\377\377\377\367\377\377\377\351\377\377\377\352\377\377\377\300\377\377" + "\377\375\377\377\377I\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\307\377\377\377\377\377\377\377\377\377\377\377\335\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377}\377\377\377\376\377\377\377\377\377\377\377\252\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\325\377\377\377\377\377\377\377\264\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\224\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\342\377\377\377\375\377\377\3778\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" + "\364\377\377\377\254\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377I\377\377\377\340\377\377\377\240\0\0\0\0\0\0\0\0" + "\377\377\377}\377\377\377\341\377\377\377Z\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377Q\377\377\377\306\377\377\377" + "\366\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\332\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377" + "\376\377\377\377b\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\320\377\377\377\376" + "\377\377\377l\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\317\377" + "\377\377\376\377\377\377l\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\356\377\377\377" + "\372\377\377\377)\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377" + "\333\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\351" + "\377\377\377\377\377\377\377\361\377\377\377\354\377\377\377\354\377\377" + "\377\354\377\377\377\376\377\377\377\376\377\377\377l\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377" + "\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377\215\377\377\377\377\377\377\377\311\0\0\0\0\0\0\0\0" + "\377\377\377\335\377\377\377\376\377\377\377i\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377_\0\0\0\0" + "\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377)\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\13\377\377\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377" + "\377\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333\377" + "\377\377\374\377\377\377\377\377\377\377\311\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377" + "\377\361\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\377\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\377" + "\377\377\313\377\377\377\371\377\377\377%\377\377\377\224\377\377\377\377" + "\377\377\377\252\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224" + "\377\377\377\376\377\377\377_\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" + "\355\377\377\377\366\377\377\377)\377\377\377\377\377\377\377\377\377\377" + "\377\13\377\377\377\356\377\377\377\372\377\377\377)\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\345\377\377\377\376\377\377\377i\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377b\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\321\377\377\377\376\377\377\377l\377\377\377\377" + "\377\377\377\377\377\377\377\13\377\377\377\356\377\377\377\372\377\377\377" + ")\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377" + "\377\377\377\377\205\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\333\377\377\377\377" + "\377\377\377\377\377\377\377\354\377\377\377\300\377\377\377\\\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\313\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377" + "\377i\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333\0\0\0" + "\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\355" + "\377\377\377\375\377\377\377M\377\377\377\13\377\377\377\355\377\377\377" + "\375\377\377\377=\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377U\377" + "\377\377\374\377\377\377\333\377\377\377\217\377\377\377\373\377\377\377" + "\361\377\377\377\312\377\377\377\241\377\377\377\377\377\377\377\215\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\253\377" + "\377\377\377\377\377\377\377\377\377\377\315\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\335\377\377\377" + "\376\377\377\377i\0\0\0\0\377\377\377\342\377\377\377\375\377\377\377Q\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\315\377\377\377\377\377\377\377\342\377\377\377\13\0\0\0\0\0\0\0" + "\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377V\377\377\377\375\377" + "\377\377\377\377\377\377\377\377\377\377\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377c\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377l\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\360\377\377" + "\377\33\377\377\377\205\377\377\377\365\377\377\377\377\377\377\377\364\377" + "\377\377\\\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\0\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "|\377\377\377\206\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\307" + "\377\377\377\377\377\377\377\377\377\377\377\370\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\244\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\205" + "\377\377\377\376\377\377\377\336\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\377\377\377\302\377\377\377\377\377\377\377\242\377\377" + "\377\374\377\377\377\264\377\377\377\33\377\377\377\371\377\377\377\316\377" + "\377\377\377\377\377\377\377\377\377\377b\377\377\377\376\377\377\377\326" + "\377\377\377\25\377\377\377\362\377\377\377\377\377\377\377\304\377\377\377" + "\372\377\377\377\360\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\317" + "\377\377\377\376\377\377\377_\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377" + "\377\361\377\377\377\334\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\377\377\377`\377\377\377\374\377\377\377\343\377" + "\377\377\313\377\377\377\377\377\377\377\215\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\306\377" + "\377\377\371\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377s\377\377\377\377\377\377\377\304\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\320\377" + "\377\377\375\377\377\377=\0\0\0\0\0\0\0\0\377\377\377\25\377\377\377\362" + "\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377i\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377l\377\377\377\373\377\377\377\376\377\377\377\214\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\204\377\377\377\377\377\377\377\333\0\0" + "\0\0\377\377\377\377\377\377\377\377\377\377\377\224\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377m\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\33\377" + "\377\377\366\377\377\377\367\377\377\377)\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377\317\377\377\377\376\377\377\377e\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\330\377\377\377\371\377\377\377)\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\365\377\377\377" + "\363\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\377\377\377\13\377\377\377\351\377\377\377\375\377\377\377=\0\0\0\0\0\0" + "\0\0\377\377\377}\377\377\377\374\377\377\377\366\377\377\377%\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377U\377\377\377p\377" + "\377\377M\377\377\377!\377\377\377\373\377\377\377\333\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\234\377" + "\377\377\374\377\377\377\377\377\377\377\320\377\377\377%\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\320\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\337\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\271\377\377\377\377\377\377\377\377\377\377" + "\377\267\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\251\377\377\377V\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377K\377\377" + "\377\374\377\377\377\245\377\377\377|\377\377\377\377\377\377\377y\0\0\0" + "\0\377\377\377\247\377\377\377\376\377\377\377l\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\240\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\373\377\377\377\377\377\377\377\304\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377" + "\377\377\377\377\244\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377" + "\376\377\377\377l\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\334" + "\377\377\377\377\377\377\377\205\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377" + "\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377" + "\377\377\376\377\377\377i\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377K\377\377\377\374\377\377\377\327\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377" + "\377\355\377\377\377\366\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\377\377\377\25\377\377\377\362\377" + "\377\377\375\377\377\377=\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377" + "\377\371\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\313\377\377\377\376\377\377\377b\0\0\0\0\0\0\0\0\377\377\377\13\377\377" + "\377\355\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377" + "\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\377\377" + "\377\377\257\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\224\377\377\377\377\377\377\377\331\0\0\0\0\377\377\377j\377\377\377\376" + "\377\377\377\366\377\377\377)\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\313\377\377\377\371\377\377\377\33\377\377\377\351\377\377\377" + "\371\377\377\377!\377\377\377\360\377\377\377\333\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377i\377" + "\377\377\33\377\377\377\365\377\377\377\365\377\377\377\361\377\377\377\333" + "\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377K\377\377\377\374\377" + "\377\377\364\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\340\377\377" + "\377\376\377\377\377l\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\224\377\377\377\377\377\377\377\257\0\0\0\0\377\377\377\13\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377I\377\377\377" + "\373\377\377\377\363\377\377\377%\0\0\0\0\0\0\0\0\377\377\377\13\377\377" + "\377\345\377\377\377\376\377\377\377i\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\224\377\377\377\377\377\377\377\243\0\0\0\0\377\377\377" + "\330\377\377\377\377\377\377\377\257\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "l\377\377\377\373\377\377\377\375\377\377\377M\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366" + "\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\313\377\377\377\376\377\377\377b\0\0\0\0\0\0\0\0\377\377" + "\377\13\377\377\377\361\377\377\377\355\377\377\377\33\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\377\377\377!\377\377\377\372\377\377\377\337" + "\377\377\377\257\377\377\377\376\377\377\377l\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\324\377\377\377\370\377\377\377" + "\360\377\377\377\323\377\377\377\255\377\377\377\375\377\377\377\333\377" + "\377\377\371\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\377\377\377l\377\377\377\376\377\377\377\337\377\377\377\326\377\377\377" + "\377\377\377\377\234\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\356\377\377\377\372\377\377" + "\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\377\377\377\232\377\377\377\377\377\377\377\346\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\224\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\232\377\377\377\377\377\377\377\244\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\13\377\377\377\364\377\377\377\254\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\215\377\377\377\376\377\377\377\376\377\377\377\313\377" + "\377\377\224\377\377\377\202\377\377\377\374\377\377\377\332\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\376\377" + "\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\324\377\377\377\376\377\377" + "\377i\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\314\377\377\377" + "\376\377\377\377b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\377\377\377\13\377\377\377\355\377\377\377\374\377" + "\377\377)\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333\0" + "\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\352\377" + "\377\377\377\377\377\377\321\377\377\377\321\377\377\377\316\377\377\377" + "\322\377\377\377\316\377\377\377\315\377\377\377G\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377" + "\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\13\377\377\377\361\377\377\377\377\377\377\377\362\377\377" + "\377\366\377\377\377\377\377\377\377\326\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377i\0\0" + "\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\13\377\377\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\13\377\377\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\374\377\377\377" + "\377\377\377\377\370\377\377\377\366\377\377\377\376\377\377\377\214\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\361\377\377" + "\377\333\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377%\377\377\377" + "\223\377\377\377\377\377\377\377\252\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\224\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377" + "\377\13\377\377\377\355\377\377\377\366\377\377\377%\377\377\377\377\377" + "\377\377\377\377\377\377\13\377\377\377\355\377\377\377\374\377\377\377)" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\317\377\377\377\376\377\377\377l\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\376\377" + "\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\324\377\377\377\376\377\377" + "\377i\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\355\377" + "\377\377\374\377\377\377)\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377" + "\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377" + "\377\377\313\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377u\377\377\377\302\377\377\377\357\377\377\377\377\377\377\377\377\377" + "\377\377\276\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\313\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377" + "\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377;\377\377\377\374\377\377" + "\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377" + "\377\240\377\377\377\377\377\377\377\266\377\377\377s\377\377\377\377\377" + "\377\377\315\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377" + "\25\377\377\377\361\377\377\377\361\377\377\377\320\377\377\377\344\377\377" + "\377\303\377\377\377\356\377\377\377\316\377\377\377\375\377\377\377M\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\275\377" + "\377\377\377\377\377\377\377\377\377\377\314\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377v\377\377\377\377" + "\377\377\377\321\377\377\377M\377\377\377\375\377\377\377\327\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\307\377\377\377\377\377\377\377\346\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377b\377\377\377" + "\237\377\377\377\374\377\377\377\336\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377" + "\377\376\377\377\377\263\377\377\377f\377\377\377\13\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\371\371\377.\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377B\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\25\377\377\377\304\377\377\377\322\377\377\377S\0" + "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\214\377\377\377\374\377" + "\377\377\33\377\377\377\222\377\377\377\374\377\377\377%\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\247\377\377\377\377" + "\377\377\377\302\377\377\377\\\377\377\3772\377\377\377\264\377\377\377\377" + "\377\377\377\326\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377\315\377\377\377\377\377\377\377\257\377\377\377;\377\377\377\375\377" + "\377\377b\377\377\377\13\377\377\377\360\377\377\377\337\377\377\377\377" + "\377\377\377\377\377\377\377\204\377\377\377\377\377\377\377\322\0\0\0\0" + "\377\377\377\33\377\377\377\356\377\377\377\377\377\377\377\377\377\377\377" + "\217\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\247\377\377\377\377\377" + "\377\377\210\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377V\377\377\377\374\377\377" + "\377\326\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\377\377\377\317\377\377\377\374\377\377\3778\377\377\377\13\377" + "\377\377\351\377\377\377\366\377\377\377\33\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\324\377\377\377\374" + "\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\3775\377\377\377\347\377\377\377\367\377\377" + "\377\232\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377_\377" + "\377\377\355\377\377\377\367\377\377\377}\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377" + "\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\261\377\377\377\377\377\377\377\257\0\0" + "\0\0\0\0\0\0\377\377\377\204\377\377\377\377\377\377\377\322\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\213\377\377\377\376\377\377\377U\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\375\377\377" + "\377\373\377\377\377s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\214\377\377\377}\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377j\377\377\377\376\377\377\377\333\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377~\377\377\377\202\377\377\377\202\377\377" + "\377\201\377\377\377\231\377\377\377\377\377\377\377\343\377\377\377z\377" + "\377\377\33\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\205\377\377" + "\377j\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\376\377\377\377\343" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\255\377\377" + "\377\377\377\377\377\264\0\0\0\0\0\0\0\0\377\377\377\25\377\377\377\356\377" + "\377\377\372\377\377\377)\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\327\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\356" + "\377\377\377\375\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\355\377" + "\377\377\367\377\377\377)\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\377\377\3775\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\377\377" + "\377\377\257\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377_\377\377\377\355\377\377\377\367\377\377\377}\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\3775\377\377\377\347\377\377\377\367\377\377\377\232\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\3772\377\377\377\327\377\377\377\377\377\377\377\375\377\377\377" + "z\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\3775\377\377\377\362\377\377\377\377\377\377\377" + "\346\377\377\377V\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377S\377\377\377\320\377\377\377" + "\305\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\377\377\377K\377\377\377\374\377\377\377\252\377\377\377K\377\377\377\374" + "\377\377\377\376\377\377\377\363\377\377\377\377\377\377\377\377\377\377" + "\377l\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\335\377\377\377" + "\376\377\377\377l\0\0\0\0\0\0\0\0\377\377\377;\377\377\377\373\377\377\377" + "\363\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224" + "\377\377\377\377\377\377\377\243\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" + "\343\377\377\377\376\377\377\377l\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\232\377\377\377\377\377\377\377\356\377\377\377)\0\0\0\0\0\0" + "\0\0\377\377\3775\377\377\377\260\377\377\377\13\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377U\0\0\0\0\0\0" + "\0\0\377\377\377\276\377\377\377\377\377\377\377\346\377\377\377\13\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\374\377\377\377" + "\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377" + "\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\312\377\377\377\377\377\377\377\321\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377%\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377i\0\0" + "\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\355\377\377\377\366\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377j\377\377\377\330\377\377\377%\0" + "\0\0\0\0\0\0\0\377\377\377\312\377\377\377\377\377\377\377\206\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377" + "\377\377\244\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\377\377\377\377" + "\277\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377" + "\377\355\377\377\377\366\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377" + "\371\377\377\377%\377\377\377]\377\377\377f\377\377\377\13\377\377\377\361" + "\377\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377\313\377\377\377\376\377\377\377i\0\0\0\0\377\377\377\232\377\377\377" + "\377\377\377\377\377\377\377\377\327\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\334\377\377\377\377\377\377\377\252\0\0\0\0\0\0" + "\0\0\377\377\377}\377\377\377\376\377\377\377\363\377\377\377%\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377" + "\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\332\377\377\377\377\377\377\377\251\0\0" + "\0\0\0\0\0\0\377\377\377\214\377\377\377\377\377\377\377\355\377\377\377" + "\13\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377" + "\377\377\377\252\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\375\377" + "\377\377Q\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\205" + "\377\377\377\304\377\377\377\13\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" + "\362\377\377\377\375\377\377\377Q\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377" + "%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377\312\377\377\377\377\377\377\377\264\0\0\0\0\0\0\0\0\377\377\377}\377" + "\377\377\376\377\377\377\332\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\330\377\377\377\376\377\377\377\372\377" + "\377\377\360\377\377\377\33\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377\305\377\377\377\377\377\377\377\377\377\377\377\237" + "\377\377\377l\377\377\377\376\377\377\377\377\377\377\377\336\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\351\377\377" + "\377\376\377\377\377l\377\377\377K\377\377\377\374\377\377\377\372\377\377" + "\3772\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\13\377\377\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377;\377\377\377" + "\373\377\377\377\372\377\377\377=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224" + "\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377!\377\377" + "\377\372\377\377\377\347\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\364\377" + "\377\377\254\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377" + "\377\377\376\377\377\377b\0\0\0\0\0\0\0\0\377\377\377b\377\377\377\375\377" + "\377\377\332\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\224\377\377\377\377\377\377\377~\0\0\0\0\0\0\0\0\377\377\377U\377\377\377" + "\374\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\266\377\377\377\377\377\377\377\326\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\13\377\377\377e\0\0\0\0\377\377\377\377\377\377\377\377\377" + "\377\377\13\377\377\377\355\377\377\377\376\377\377\377v\0\0\0\0\0\0\0\0" + "\377\377\377s\377\377\377\376\377\377\377\332\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\317\377\377\377\377\377\377\377\251\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377j\377\377\377\375\377\377\377\326\377\377\377\302\377\377\377" + "\304\377\377\377\206\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0" + "\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377" + "\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355" + "\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\361\377\377\377=\377" + "\377\377V\377\377\377\374\377\377\377\375\377\377\377M\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\361" + "\377\377\377\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\377\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\377\377\377" + "\313\377\377\377\371\377\377\377%\377\377\377\223\377\377\377\377\377\377" + "\377\252\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377" + "\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377" + "\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\377\377\377\13" + "\377\377\377\355\377\377\377\376\377\377\377\215\0\0\0\0\0\0\0\0\377\377" + "\377V\377\377\377\374\377\377\377\367\377\377\377)\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377~\0\0\0\0\0\0" + "\0\0\377\377\377K\377\377\377\374\377\377\377\366\377\377\377)\377\377\377" + "\377\377\377\377\377\377\377\377\13\377\377\377\355\377\377\377\376\377\377" + "\377v\0\0\0\0\0\0\0\0\377\377\377s\377\377\377\375\377\377\377\332\0\0\0" + "\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\313\377\377" + "\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\3772\377\377\377n\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377`\377\377\377\373\377\377\377\366\377\377\377)\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\317\377\377" + "\377\376\377\377\377v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\314\377\377\377\376\377\377\377b\0\0\0\0" + "\0\0\0\0\377\377\377\254\377\377\377\377\377\377\377\332\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\366\377" + "\377\377\361\377\377\377\331\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\320\377\377\377\377" + "\377\377\377\377\377\377\377\273\377\377\377\205\377\377\377\377\377\377" + "\377\376\377\377\377\355\377\377\377\33\377\377\377\377\377\377\377\377\0" + "\0\0\0\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\336\377\377\377" + "\330\377\377\377\377\377\377\377\256\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\342\377\377\377\375\377" + "\377\377\326\377\377\377\376\377\377\377~\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\275\377\377\377\377\377\377" + "\377\345\377\377\377\13\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\323\377\377\377" + "\360\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377" + "\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377\33\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\0\377" + "\377\377\0\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\206\377\377\377\377\377\377" + "\377\377\377\377\377\260\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377" + "\377\313\377\377\377\360\377\377\377\13\377\377\377\316\377\377\377\352\377" + "\377\377\13\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377\205\377\377\377\365\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\356\377\377\3778\0\0\0\0\377\377\377\377\377" + "\377\377\377\377\377\377\224\377\377\377\377\377\377\377\311\0\0\0\0\377" + "\377\377K\377\377\377\374\377\377\377\316\377\377\377y\377\377\377\374\377" + "\377\377\273\377\377\377\377\377\377\377\377\377\377\377!\377\377\377\371" + "\377\377\377\377\377\377\377\315\377\377\377\242\377\377\377\360\377\377" + "\377\377\377\377\377\377\377\377\377\370\377\377\377\237\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377`\377\377\377\375\377\377\377\327\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\266\377\377\377\377\377\377\377\217\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\371\371\377.\377\377" + "\377M\0\0\0\0\0\0\0\0\371\371\377.\377\377\377M\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377|\377\377" + "\377s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\232\377\377\377\377\377\377\377\377\377" + "\377\377\343\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\232\377\377\377\377\377\377\377\377\377\377\377\326\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377!\377\377" + "\377\371\377\377\377\352\377\377\377\13\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\3778\377\377\377\372\377\377" + "\377\377\377\377\377\275\377\377\377\253\377\377\377\374\377\377\377\376" + "\377\377\377s\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "r\377\377\377\314\377\377\377\304\377\377\377\332\377\377\377\377\377\377" + "\377\321\377\377\377\307\377\377\377\271\377\377\377\13\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\263\377\377\377\377\377\377\377\377\377" + "\377\377\350\377\377\377\307\377\377\377\322\377\377\377\321\377\377\377" + "\310\377\377\377\33\377\377\377\377\377\377\377\377\377\377\3778\377\377" + "\377\373\377\377\377\377\377\377\377\325\377\377\377\242\377\377\377\275" + "\377\377\377\371\377\377\377\377\377\377\377\272\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377" + "\377\377\374\377\377\377\333\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\377\377\3778\377\377\377\373\377\377\377\377\377\377\377\321\377\377" + "\377\250\377\377\377\307\377\377\377\375\377\377\377\377\377\377\377\234" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\33\377\377\377" + "\362\377\377\377\377\377\377\377\313\377\377\377\214\377\377\377\345\377" + "\377\377\377\377\377\377\322\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\376\377\377\377\326\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377\302\377\377\377\377\377\377\377\346\377\377\377\226\377\377\377\201" + "\377\377\377\320\377\377\377\377\377\377\377\347\377\377\377\13\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\266\377\377\377\377\377\377\377" + "\307\377\377\377\250\377\377\377\335\377\377\377\377\377\377\377\356\377" + "\377\377\33\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\232\377\377\377\377\377\377\377\377\377\377\377\326\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\232\377\377\377\377\377\377\377\377\377\377\377\343\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\207\377\377\377\374\377\377\377\266" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377V\377\377\377\375\377\377\377\247\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\306\377\377\377\377\377\377\377\376\377" + "\377\377l\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377" + "\377\13\377\377\377\355\377\377\377\352\0\0\0\0\377\377\377s\377\377\377" + "\314\377\377\377\315\377\377\377v\377\377\377\245\377\377\377%\377\377\377" + "\377\377\377\377\377\377\377\377K\377\377\377\373\377\377\377\360\377\377" + "\377\33\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\335\377\377\377\376\377\377\377" + "~\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377" + "\377\377\377\335\377\377\377\275\377\377\377\310\377\377\377\366\377\377" + "\377\377\377\377\377\346\377\377\377\33\377\377\377\377\377\377\377\377\0" + "\0\0\0\377\377\377\13\377\377\377\342\377\377\377\377\377\377\377\370\377" + "\377\377\300\377\377\377\276\377\377\377\371\377\377\377\377\377\377\377" + "\227\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\312\377\377\377" + "\377\377\377\377\325\377\377\377\303\377\377\377\361\377\377\377\377\377" + "\377\377\375\377\377\377f\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377K\377\377\377\374\377\377\377\362\377\377\377\316\377\377\377" + "\316\377\377\377\316\377\377\377\322\377\377\377\273\377\377\377\13\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\356\377\377\377" + "\366\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\3778\377\377\377\371\377\377\377\377\377" + "\377\377\352\377\377\377\271\377\377\377\321\377\377\377\375\377\377\377" + "\372\377\377\377)\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313" + "\377\377\377\376\377\377\377l\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" + "\355\377\377\377\366\377\377\377)\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377u\377\377\377\325\377\377\377\316\377\377\377\371\377\377\377" + "\373\377\377\377\320\377\377\377\322\377\377\377\207\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\302\377\377\377\377\377\377\377" + "\365\377\377\377\266\377\377\377\324\377\377\377\377\377\377\377\375\377" + "\377\377=\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224" + "\377\377\377\377\377\377\377\252\0\0\0\0\0\0\0\0\377\377\3778\377\377\377" + "\372\377\377\377\376\377\377\377i\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\13\377\377\377\356\377\377\377\376\377\377\377\320\377\377\377" + "\316\377\377\377\316\377\377\377\316\377\377\377\322\377\377\377V\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\371\377\377" + "\377%\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\361\377\377\377\333\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377" + "\376\377\377\377l\0\0\0\0\377\377\377\13\377\377\377\352\377\377\377\377" + "\377\377\377\332\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377j\377\377\377\375\377\377\377\377\377\377\377\321\377\377\377\302\377" + "\377\377\375\377\377\377\377\377\377\377\234\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\252\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377j\377\377\377\375\377\377\377\377\377\377\377\320" + "\377\377\377\307\377\377\377\375\377\377\377\377\377\377\377\216\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377" + "\377\377\377\252\0\0\0\0\0\0\0\0\377\377\377\266\377\377\377\377\377\377" + "\377\336\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377" + "\351\377\377\377\377\377\377\377\370\377\377\377\306\377\377\377\264\377" + "\377\377\351\377\377\377\377\377\377\377\343\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\356\377\377" + "\377\366\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377b\377\377\377\375\377\377\377\377\377\377\377\325" + "\377\377\377\307\377\377\377\374\377\377\377\377\377\377\377\227\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\232" + "\377\377\377\377\377\377\377\377\377\377\377\304\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377" + "\377\377\377\375\377\377\377_\377\377\377\33\377\377\377\365\377\377\377" + "\377\377\377\377\322\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\253\377\377\377\377\377\377\377\322\0\0\0\0\0\0\0\0\377\377\377" + "\275\377\377\377\377\377\377\377\315\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\356\377\377\377\366" + "\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\334\377\377\377\377\377\377\377\372\377\377\377\310\377" + "\377\377\316\377\377\377\316\377\377\377\321\377\377\377\310\377\377\377" + "%\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224" + "\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\317\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\364\377" + "\377\377\254\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\307\377" + "\377\377\377\377\377\377\336\377\377\377\233\377\377\377\305\377\377\377" + "\376\377\377\377\377\377\377\377\332\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\376\377\377\377" + "\307\377\377\377\255\377\377\377\370\377\377\377\377\377\377\377\272\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377!\377\377\377\366" + "\377\377\377\377\377\377\377\346\377\377\377\271\377\377\377\270\377\377" + "\377\365\377\377\377\375\377\377\377M\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\255\377\377\377\377\377\377\377\373\377\377\377\257\377" + "\377\377\302\377\377\377\376\377\377\377\377\377\377\377\332\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377`\377\377\377\374\377\377" + "\377\377\377\377\377\332\377\377\377\233\377\377\377\260\377\377\377\367" + "\377\377\377\316\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377U\377\377\377\374\377\377\377\333\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\215\377" + "\377\377\377\377\377\377\342\377\377\377\242\377\377\377\237\377\377\377" + "\246\377\377\377\247\377\377\377X\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\377" + "\377\377\13\377\377\377\356\377\377\377\366\377\377\377)\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" + "\356\377\377\377\366\377\377\377)\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377" + "\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377K\377\377\377\375\377\377\377\245\0\0\0\0\0\0\0\0\377" + "\377\377\233\377\377\377\377\377\377\377\356\377\377\377%\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377" + "\377\377\376\377\377\377\302\377\377\377\262\377\377\377\322\377\377\377" + "\33\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\361\377\377" + "\377\333\0\0\0\0\377\377\377\320\377\377\377\371\377\377\377%\377\377\377" + "\223\377\377\377\377\377\377\377\252\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\224\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377" + "\377\13\377\377\377\356\377\377\377\366\377\377\377)\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377\214\377\377\377\377\377\377\377\376\377" + "\377\377\274\377\377\377\255\377\377\377\370\377\377\377\377\377\377\377" + "\265\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377" + "\377\377\377\377\377\377\376\377\377\377\307\377\377\377\255\377\377\377" + "\370\377\377\377\377\377\377\377\272\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\255\377\377\377\377\377\377\377\373\377\377\377" + "\257\377\377\377\302\377\377\377\376\377\377\377\377\377\377\377\332\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\313\377" + "\377\377\376\377\377\377l\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\341\377\377\377\377\377\377" + "\377\335\377\377\377\233\377\377\377\213\377\377\377\306\377\377\377\377" + "\377\377\377\352\377\377\377\13\377\377\377\377\377\377\377\377\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\241\377\377\377\377\377\377\377\365\377\377\377" + "\245\377\377\377\255\377\377\377\325\377\377\3772\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\275\377\377\377\377\377\377\377\361\377\377" + "\377\252\377\377\377\331\377\377\377\377\377\377\377\377\377\377\377\332" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\266\377\377\377\377\377\377\377\377\377\377\377\336\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\240\377\377" + "\377\377\377\377\377\377\377\377\377\207\377\377\377K\377\377\377\374\377" + "\377\377\377\377\377\377\315\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377U\377\377\377\374\377\377\377\372\377\377\3778\377\377\377" + "!\377\377\377\366\377\377\377\376\377\377\377\177\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\377\377" + "\377\377\377\377\377\377\352\377\377\377\13\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\267\377\377\377\377\377\377\377\377" + "\377\377\377\311\377\377\377\302\377\377\377\304\377\377\377\304\377\377" + "\377\271\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\13\377\377\377\361\377\377\377\327\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377b\377\377\377\374\377\377\377\377\377\377\377\225\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\316\377\377\377\333\0\0\0\0" + "\377\377\377\316\377\377\377\334\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377w\377\377\377\343\377" + "\377\377\375\377\377\377\201\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\377\377\377\13\377\377\377\244\377\377\377\13\0\0\0\0\0\0\0" + "\0\377\377\377\302\377\377\377\377\377\377\377\377\377\377\377\364\377\377" + "\377Z\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377~\377\377\377\370" + "\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\275\377\377" + "\377\266\377\377\377\376\377\377\377\323\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\335\377\377\377\376\377\377\377~\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377\377" + "\377\373\377\377\377\363\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377I\377\377" + "\377\357\377\377\377\377\377\377\377\364\377\377\377)\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\376\377\377\377\377\377\377" + "\377\244\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\377\377\377\232\377\377\377\377\377\377\377\251\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\377\377\377l\377\377\377\367\377\377\377\377\377\377\377\377\377\377\377" + "\376\377\377\377\223\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\232\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\372\377\377\377" + ")\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\355\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\360\377\377\377\33\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377j\377\377\377\350\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\376\377\377\377\302\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377;\377\377\377\372\377\377\377\316\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377u\377\377\377\351\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\373\377\377\377\254\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377S\377\377\377" + "\354\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\325\377" + "\377\377\33\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\214\377\377\377\377\377\377\377\244\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377" + "\377\315\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\342\377\377\3772\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\177\377\377\377\365\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\342\377\377\3772\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\376\377" + "\377\377\377\377\377\377\244\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377I\377\377\377\357\377\377" + "\377\377\377\377\377\364\377\377\377)\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\13\377\377\377M\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\232\377\377\377\377\377\377\377\375" + "\377\377\377\\\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0" + "\0\0\0\377\377\377\255\377\377\377\377\377\377\377\234\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377" + "\224\377\377\377\377\377\377\377\276\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\240\377\377\377\377\377\377\377\266\377\377\377\377\377\377\377" + "\377\0\0\0\0\377\377\377\215\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\370\377\377\377\312\377\377\377%\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" + "\316\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\376\377" + "\377\377\255\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\305\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\373\377" + "\377\377\330\377\377\377V\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\372\377\377\377" + ")\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\351" + "\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377I\377\377\377\345" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\370\377\377" + "\377\241\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313" + "\377\377\377\375\377\377\377\\\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" + "\355\377\377\377\355\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0" + "\0\377\377\377\224\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\336\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\316\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\373\377\377\377\213\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377" + "\377\377\377\377\377\377\252\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\247\377" + "\377\377\377\377\377\377\326\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\13\377\377\377\351\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377_\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\366\377\377\377" + "%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\344\377\377\377\333\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\307\377\377\377\375\377\377" + "\377Q\0\0\0\0\0\0\0\0\377\377\377\204\377\377\377\377\377\377\377\327\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\206\377" + "\377\377\371\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377" + "\240\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "\215\377\377\377\377\377\377\377\244\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377" + "\206\377\377\377\370\377\377\377\377\377\377\377\377\377\377\377\376\377" + "\377\377\241\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\214\377\377\377\377\377\377\377\252\0\0\0\0\0\0\0\0\377\377\377" + "\33\377\377\377\356\377\377\377\376\377\377\377v\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377\25\377\377\377\316\377\377\377\376\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\335\377\377\377)\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377" + "\377\377\351\377\377\377\364\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\233\377\377\377\375" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\276\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377;\377\377\377\372\377\377\377\376\377\377\377|\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377u\377\377\377\375\377" + "\377\377\355\377\377\377\33\0\0\0\0\377\377\377\320\377\377\377\377\377\377" + "\377\244\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\33\377\377\377" + "\366\377\377\377\372\377\377\377=\0\0\0\0\0\0\0\0\377\377\377\33\377\377" + "\377\362\377\377\377\376\377\377\377_\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\351\377\377\377\364\377\377" + "\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377" + "\13\377\377\377\356\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377l\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377" + "\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377}\377" + "\377\377\377\377\377\377\277\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\364\377\377" + "\377\254\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\3775\377\377\377" + "\347\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\303\377" + "\377\377\362\377\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\377\377\377\224\377\377\377\377\377\377\377\345\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\307\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377I\377\377\377\345\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\373\377\377\377\260" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\310" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\326\377\377" + "\377\367\377\377\377\315\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\377\377\377l\377\377\377\356\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\370\377\377\377\231\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377;\377\377\377\373\377\377" + "\377\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377I\377\377\377\373\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\216\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377" + "\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\351\377\377" + "\377\355\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\13\377\377\377\351\377\377\377\355\377\377\377" + "\33\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377)\0" + "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377" + "\377\374\377\377\377\252\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\307\377\377" + "\377\377\377\377\377\304\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\223\377\377\377\375\377\377\377\377\377\377" + "\377\377\377\377\377\372\377\377\377M\377\377\377\377\377\377\377\377\377" + "\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\377\377\377\275\377\377" + "\377\371\377\377\377%\377\377\377\223\377\377\377\377\377\377\377\252\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\376\377" + "\377\377i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\351\377\377\377\355" + "\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377" + "\240\377\377\377\374\377\377\377\377\377\377\377\377\377\377\377\376\377" + "\377\377\275\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\224\377\377\377\377\377\377\377\352\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\307\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\377\377\377\310\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\337\377\377\377\377\377\377\377\332\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\307\377" + "\377\377\375\377\377\377_\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377c\377\377\377\330\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\354\377" + "\377\377Z\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\13\377\377\377\333\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\375\377\377\377_\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\33\377\377\377\350\377\377\377\377\377\377\377\377\377\377\377" + "\376\377\377\377\255\377\377\377\362\377\377\377\323\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377;\377\377\377\372" + "\377\377\377\376\377\377\377\206\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377b\377\377\377\374\377\377\377\372\377" + "\377\377I\377\377\377\13\377\377\377\355\377\377\377\377\377\377\377\243" + "\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\345\377" + "\377\377\376\377\377\377\214\0\0\0\0\0\0\0\0\377\377\377j\377\377\377\374" + "\377\377\377\363\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\335\377\377\377\377\377\377\377\236\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377" + "\377\355\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\372\377\377\377)\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\360" + "\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371" + "\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377" + "%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\0\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377E\377\377\377S\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377Q\377\377\377n\377\377\377\13\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377b\377\377" + "\377e\377\377\377\33\0\0\0\0\0\0\0\0\371\371\377.\377\377\3775\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377V\377\377\377\374\377\377\377\364\377\377" + "\3772\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377" + "\377\377\13\377\377\377\343\377\377\377\377\377\377\377\215\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\371\377\377\377\334\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377E\377\377\377X\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0" + "\0\0\0\377\377\377\341\377\377\377\375\377\377\377=\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377e\377\377\377l\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377E\377\377\377X\377\377\377S\377\377\377\13\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377@\377\377\377e\377\377\377c\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377S\377\377\377K\377\377\377I\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377)\377\377\377e\377\377\377n\377\377\377" + "8\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377_\377\377\377p\377\377\377I\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377E\377\377\377X\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\371" + "\377\377\377\334\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377`\377\377\377I\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377\33\377\377\377\362\377\377\377" + "\376\377\377\377\255\377\377\3775\377\377\377V\377\377\377\322\377\377\377" + "\255\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377)\377\377\377X\377\377\377V\377\377\377\13\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377E\377\377\377" + "m\377\377\377c\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\371\371\377.\377\377\377m\377\377\377c\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377b\377\377\377c\377\377\377\13" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\320" + "\377\377\377\377\377\377\377\333\377\377\377\33\377\377\377E\377\377\377" + "\13\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377e\377\377\377e\377\377" + "\3778\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "e\377\377\377n\377\377\3775\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377U\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\25\377\377\377\361\377\377\377\366\377\377" + "\377%\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\13\377\377\377\364\377\377\377\254\0\0\0\0\0\0\0\0\0\0\0" + "\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\377\377\377\216\377\377\377\233\377\377\377\232\377\377\377\232" + "\377\377\377\232\377\377\377\232\377\377\377\232\377\377\377\237\377\377" + "\377=\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377U\377\377\377n\377\377\3775\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377E\377\377\377n\377\377\3778\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377@\377\377\377m\377\377\377c\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377@\377\377\377p\377" + "\377\377I\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377Q\377\377\377p\377\377\377X\0" + "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\377\377\377\324\377\377\377\376\377\377\377" + "|\377\377\377S\377\377\377V\377\377\377K\377\377\377\263\377\377\377\377" + "\377\377\377\252\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\25\377\377\377\362\377\377\377\360\377\377\377" + "\33\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377)\377" + "\377\377p\377\377\377c\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377b\377\377\377f\377\377\377" + "\13\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377\224\377\377\377\376\377\377\377U\377\377\377@\377\377\377e\377\377\377" + "8\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377@\377\377\377p\377\377\377I\377\377\377;\377\377\377" + "\374\377\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377" + "\377e\377\377\377e\377\377\377I\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377O\377\377" + "\377X\377\377\377U\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377j\377\377\377n\377\377\377\33\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377" + "\362\377\377\377\367\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\13\377\377\377\361\377\377\377\356\377\377\377%\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\335\377\377\377\372\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\267\377\377\377" + "\345\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\237\377\377\377\377\377\377\377\361\377\377" + "\3772\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377" + "\331\377\377\377\377\377\377\377\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\3772\377\377\377\337\377\377\377\377\377\377\377\236\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377b\377" + "\377\377\376\377\377\377\330\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\3772\377\377\377\337\377\377\377\377\377\377\377\236\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\377\377\3775\377\377\377\344\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\270\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\3775\377\377\377\362\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\210\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\232\377\377\377\377\377\377" + "\377\370\377\377\377\364\377\377\377\372\377\377\377\243\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\266\377\377\377\377\377\377\377\225\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\205\377\377\377\371\377\377\377\364" + "\377\377\377\364\377\377\377\377\377\377\377\260\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\377\377\377\13\377\377\377\370\377\377\377\377\377\377\377\377\377\377\377" + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\377m\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\345\377\377\377" + "\375\377\377\377f\0\0\0\0\0\0\0\0\377\377\3772\377\377\377\326\377\377\377" + "\377\377\377\377\245\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\234\377\377\377\205\377\377\377I\377\377\377\272\377\377\377\377" + "\377\377\377\326\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377\224\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\377\377\377i\377\377\377\203\377\377\377" + "\337\377\377\377\377\377\377\377\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\275\377\377\377\377\377\377\377" + "\377\377\377\377\373\377\377\377\243\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377" + "\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377\177\377\377\377\372\377\377\377\376\377\377\377\377\377\377" + "\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\253\377\377" + "\377\340\377\377\377%\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\377\377\377\310\377\377\377\307\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377" + "\377\377\13\377\377\377\351\377\377\377\377\377\377\377\276\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" + "\377u\377\377\377\325\377\377\377w\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377" + "\377\13\377\377\377\351\377\377\377\377\377\377\377\276\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377`\377\377\377\213\377\377\377\203\377\377" + "\3778\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\13\377\377\377\251\377\377\377\322\377\377\377\316" + "\377\377\377m\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377`\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\266" + "\377\377\377u\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377G\377\377\377\317\377\377\377w\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377i\377\377\377\266" + "\377\377\377\263\377\377\377\263\377\377\377\262\377\377\377_\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\377\377\377`\377\377\377y\377\377\377y\377\377\377y" + "\377\377\377y\377\377\377y\377\377\377y\377\377\377x\377\377\377\33\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\377\377\377\237\377\377\377\377\377\377\377\377" + "\377\377\377\370\377\377\377\370\377\377\377\377\377\377\377\377\377\377" + "\377\325\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377" + ";\377\377\377\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377" + "\377\376\377\377\377z\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" + "\377\377\233\377\377\377\377\377\377\377l\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377V\377\377\377\376\377\377\377\327\0\0" + "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\377\377\377\13\377\377\377\361\377\377\377\377" + "\377\377\377\377\377\377\377\325\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377v\377\377\377\246\377" + "\377\377\266\377\377\377u\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\372\377\377\377)\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" + "i\377\377\377\266\377\377\377\255\377\377\377\214\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377s\377\377\377|\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377s\377\377\377" + "|\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\0\0\0\0\377\377\377_\377\377\377\266\377\377\377\321\377\377\377\316\377" + "\377\377\271\377\377\377q\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\377\377\377`\377\377\377\245\377\377\377\267\377\377\377" + "\247\377\377\377=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" + "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" + "\377\377\377E\377\377\377\212\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\211\377\377\377=\0" + "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" + "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" + "\377\377\377\377\377\377\377\0\0\0\0\377\377\377v\377\377\377\232\377\377" + "\377q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" + "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" + "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377" + "\377\377\363\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" + "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" + "\377\377\377\377", +}; + diff --git a/parse_map/mlx/font.xcf b/parse_map/mlx/font.xcf new file mode 100644 index 0000000000000000000000000000000000000000..b9c8c82dec50244b31f1ae2b6f84be1668688d7b GIT binary patch literal 52570 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 D(ji>k literal 0 HcmV?d00001 diff --git a/parse_map/mlx/mlx.h b/parse_map/mlx/mlx.h new file mode 100644 index 0000000..e75b4af --- /dev/null +++ b/parse_map/mlx/mlx.h @@ -0,0 +1,149 @@ +/* +** mlx.h for MinilibX in +** +** Made by Charlie Root +** Login +** +** Started on Mon Jul 31 16:37:50 2000 Charlie Root +** Last update Tue Oct 01 16:23:28 2014 Olivier Crouzet +*/ + +/* +** MinilibX - Please report bugs +*/ + + +/* +** FR msg - FR msg - FR msg +** +** MacOSX +** La MinilibX utilise 2 frameworks Mac : OpenGL et AppKit +** qu'il faut ajouter a la compilation : +** -framework OpenGL -framework AppKit +** +** UNIX / Linux +** La MinilibX utilise 2 librairies supplementaires qu'il +** est necessaire de rajouter a la compilation : +** -lmlx -lXext -lX11 +** +** La MinilibX permet le chargement des images de type Xpm. +** Notez que cette implementation est incomplete. +** +** Il y a des differences entre X11 et MacOS. +** les numeros des touches ne sont pas les memes, +** les numeros des boutons souris ne sont pas les memes. +** Egalement l'expose est gere differemment, et sous MacOS +** il est preferable d'entrer le plus tot possible dans mlx_loop, +** il est normal que les fenetres n'apparaissent pas avant mlx_loop +** (ou bien forcez avec mlx_do_sync mais c'est pas genial). +** Sous MacOS, l'octet Alpha est pris en compte dans toutes les +** images, et represente la transparence et non l'opacite comme +** c'est normalement le cas. +*/ + + +#ifndef MLX_H + +#define MLX_H + + +void *mlx_init(); +/* +** needed before everything else. +** return (void *)0 if failed +*/ + + +/* +** Basic actions +*/ + +void *mlx_new_window(void *mlx_ptr, int size_x, int size_y, char *title); +/* +** return void *0 if failed +*/ +int mlx_clear_window(void *mlx_ptr, void *win_ptr); +int mlx_pixel_put(void *mlx_ptr, void *win_ptr, int x, int y, int color); +/* +** origin for x & y is top left corner of the window +** y down is positive +** color is 0x00RRGGBB +*/ + + +/* +** Image stuff +*/ + +void *mlx_new_image(void *mlx_ptr,int width,int height); +/* +** return void *0 if failed +*/ +char *mlx_get_data_addr(void *img_ptr, int *bits_per_pixel, + int *size_line, int *endian); +/* +** endian : 0 = sever X is little endian, 1 = big endian +** endian : useless on macos, client and graphical framework have the same endian +*/ +int mlx_put_image_to_window(void *mlx_ptr, void *win_ptr, void *img_ptr, + int x, int y); +unsigned int mlx_get_color_value(void *mlx_ptr, int color); + + +/* +** dealing with Events +*/ + +int mlx_mouse_hook (void *win_ptr, int (*funct_ptr)(), void *param); +int mlx_key_hook (void *win_ptr, int (*funct_ptr)(), void *param); +int mlx_expose_hook (void *win_ptr, int (*funct_ptr)(), void *param); + +int mlx_loop_hook (void *mlx_ptr, int (*funct_ptr)(), void *param); +int mlx_loop (void *mlx_ptr); + + +/* +** hook funct are called as follow : +** +** expose_hook(void *param); +** key_hook(int keycode, void *param); +** mouse_hook(int button, int x,int y, void *param); +** loop_hook(void *param); +** +*/ + + +/* +** Usually asked... +*/ + +int mlx_string_put(void *mlx_ptr, void *win_ptr, int x, int y, int color, + char *string); +void *mlx_xpm_to_image(void *mlx_ptr, char **xpm_data, + int *width, int *height); +void *mlx_xpm_file_to_image(void *mlx_ptr, char *filename, + int *width, int *height); +void *mlx_png_file_to_image(void *mlx_ptr, char *file, int *width, int *height); + +int mlx_destroy_window(void *mlx_ptr, void *win_ptr); + +int mlx_destroy_image(void *mlx_ptr, void *img_ptr); + +/* +** generic hook system for all events, and minilibX functions that +** can be hooked. Some macro and defines from X11/X.h are needed here. +*/ + +int mlx_hook(void *win_ptr, int x_event, int x_mask, + int (*funct)(), void *param); + +int mlx_mouse_hide(); +int mlx_mouse_show(); +int mlx_mouse_move(void *win_ptr, int x, int y); +int mlx_mouse_get_pos(void *win_ptr, int *x, int *y); + +int mlx_do_key_autorepeatoff(void *mlx_ptr); +int mlx_do_key_autorepeaton(void *mlx_ptr); +int mlx_do_sync(void *mlx_ptr); + +#endif /* MLX_H */ diff --git a/parse_map/mlx/mlx_init_loop.m b/parse_map/mlx/mlx_init_loop.m new file mode 100644 index 0000000..0377771 --- /dev/null +++ b/parse_map/mlx/mlx_init_loop.m @@ -0,0 +1,192 @@ +// mlx_init_loop.m +// By Ol + +#import +#import +#import + +#include "mlx_int.h" +#include "mlx_new_window.h" + +#include "font.c" + + +void do_loop_hook2(CFRunLoopTimerRef observer, void * info) +{ + ((mlx_ptr_t *)info)->loop_hook(((mlx_ptr_t *)info)->loop_hook_data); +} + + +void do_loop_flush(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void * info) +{ + mlx_ptr_t *mlx_ptr; + mlx_win_list_t *win; + + mlx_ptr = (mlx_ptr_t *)info; + win = mlx_ptr->win_list; + while (win) + { + if (win->nb_flush > 0 && win->pixmgt) + { + [(id)win->winid selectGLContext]; + [(id)win->winid mlx_gl_draw]; + glFlush(); + win->nb_flush = 0; + } + win = win->next; + } +} + + + + +void *mlx_init() +{ + mlx_ptr_t *new_mlx; + int bidon; + int i; + + if ((new_mlx = malloc(sizeof(*new_mlx))) == NULL) + return ((void *)0); + new_mlx->win_list = NULL; + new_mlx->img_list = NULL; + new_mlx->loop_hook = NULL; + new_mlx->loop_hook_data = NULL; + new_mlx->main_loop_active = 0; + + new_mlx->appid = [NSApplication sharedApplication]; + + // super magic trick to detach app from terminal, get menubar & key input events + for (NSRunningApplication * app in [NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.apple.finder"]) + { + [app activateWithOptions:NSApplicationActivateIgnoringOtherApps]; + break; + } + usleep(100000); + ProcessSerialNumber psn = { 0, kCurrentProcess }; + (void) TransformProcessType(&psn, kProcessTransformToForegroundApplication); + usleep(100000); + [[NSRunningApplication currentApplication] activateWithOptions:NSApplicationActivateIgnoringOtherApps]; + + // load font + new_mlx->font = mlx_new_image(new_mlx, (FONT_WIDTH+2)*95, FONT_HEIGHT); + i = 0; + while (i < 4*(FONT_WIDTH+2)*95*FONT_HEIGHT) + { + new_mlx->font->buffer[i+0] = font_atlas.pixel_data[i+2]; + new_mlx->font->buffer[i+1] = font_atlas.pixel_data[i+1]; + new_mlx->font->buffer[i+2] = font_atlas.pixel_data[i+0]; + ((unsigned char *)new_mlx->font->buffer)[i+3] = 0xFF-font_atlas.pixel_data[i+3]; + i += 4; + } + + +#ifdef STRINGPUTX11 + new_mlx->font->vertexes[2] = FONT_WIDTH/1.4; + new_mlx->font->vertexes[4] = FONT_WIDTH/1.4; + new_mlx->font->vertexes[5] = (-FONT_HEIGHT-1)/1.4; + new_mlx->font->vertexes[7] = (-FONT_HEIGHT-1)/1.4; +#else + new_mlx->font->vertexes[2] = FONT_WIDTH; + new_mlx->font->vertexes[4] = FONT_WIDTH; + new_mlx->font->vertexes[5] = -FONT_HEIGHT-1; + new_mlx->font->vertexes[7] = -FONT_HEIGHT-1; +#endif + + return ((void *)new_mlx); +} + + +void mlx_loop(mlx_ptr_t *mlx_ptr) +{ + CFRunLoopObserverRef observer; + CFRunLoopObserverContext ocontext = {.version = 0, .info = mlx_ptr, .retain = NULL, .release = NULL, .copyDescription = NULL}; + + mlx_ptr->main_loop_active = 1; + + observer = CFRunLoopObserverCreate(NULL, kCFRunLoopBeforeTimers, true, 0, do_loop_flush, &ocontext); + CFRunLoopAddObserver(CFRunLoopGetMain(), observer, kCFRunLoopCommonModes); + + // [[[MlxLoopHookObj alloc] initWithPtr:mlx_ptr] performSelector:@selector(do_loop_hook) withObject:nil afterDelay:0.0]; + + [NSApp run]; +} + + +void mlx_pixel_put(mlx_ptr_t *mlx_ptr, mlx_win_list_t *win_ptr, int x, int y, int color) +{ + if (!win_ptr->pixmgt) + return ; + [(id)(win_ptr->winid) selectGLContext]; + [(id)(win_ptr->winid) pixelPutColor:color X:x Y:y]; + win_ptr->nb_flush ++; +} + + +void mlx_int_loop_once() +{ + NSEvent *event; + NSDate *thedate; + + thedate = [NSDate dateWithTimeIntervalSinceNow:0.1]; + while (42) + { + event = [NSApp nextEventMatchingMask:NSEventMaskAny + untilDate:thedate + inMode:NSDefaultRunLoopMode + dequeue:YES]; + if (event == nil) + { + [thedate release]; + return ; + } + [NSApp sendEvent:event]; + [NSApp updateWindows]; + } +} + + +int mlx_do_sync(mlx_ptr_t *mlx_ptr) +{ + mlx_win_list_t *win; + + win = mlx_ptr->win_list; + while (win) + { + if (win->pixmgt) + { + [(id)(win->winid) selectGLContext]; + [(id)(win->winid) mlx_gl_draw]; + glFlush(); + if (!mlx_ptr->main_loop_active) + mlx_int_loop_once(); + } + win = win->next; + } + return (0); +} + + +int mlx_loop_hook(mlx_ptr_t *mlx_ptr, void (*fct)(void *), void *param) +{ + CFRunLoopTimerContext tcontext = {0, mlx_ptr, NULL, NULL, NULL}; + CFRunLoopTimerRef timer; + + if (mlx_ptr->loop_hook != NULL) + { + CFRunLoopTimerInvalidate(mlx_ptr->loop_timer); + [(id)(mlx_ptr->loop_timer) release]; + } + + mlx_ptr->loop_hook = fct; + mlx_ptr->loop_hook_data = param; + + if (fct) + { + timer = CFRunLoopTimerCreate(kCFAllocatorDefault, 0.0, 0.0001, 0, 0, &do_loop_hook2, &tcontext); + mlx_ptr->loop_timer = timer; + CFRunLoopAddTimer(CFRunLoopGetMain(), timer, kCFRunLoopCommonModes); + } + + return (0); +} diff --git a/parse_map/mlx/mlx_int.h b/parse_map/mlx/mlx_int.h new file mode 100644 index 0000000..a93c1c9 --- /dev/null +++ b/parse_map/mlx/mlx_int.h @@ -0,0 +1,102 @@ +// +// mlx_int.h for minilibx +// +// ol@staff.42.fr +// +// include opengl needed before mlx_int.h +// + + +#define MAX_EVENT 32 +#define MAX_PIXEL_NB 200000 +#define UNIQ_BPP 4 + +#define FONT_WIDTH 10 +#define FONT_HEIGHT 20 + + +typedef int (*func_t)(); + +/* structs */ + +typedef struct glsl_info_s +{ + GLuint pixel_vshader; + GLuint pixel_fshader; + GLuint pixel_program; + GLint loc_pixel_position; + GLint loc_pixel_texture; + GLint loc_pixel_winhalfsize; + + GLuint image_vshader; + GLuint image_fshader; + GLuint image_program; + GLint loc_image_position; + GLint loc_image_winhalfsize; + GLint loc_image_texture; + GLint loc_image_pos; + GLint loc_image_size; + + GLuint font_vshader; + GLuint font_fshader; + GLuint font_program; + GLint loc_font_position; + GLint loc_font_winhalfsize; + GLint loc_font_texture; + GLint loc_font_color; + GLint loc_font_posinwin; + GLint loc_font_posinatlas; + GLint loc_font_atlassize; +} glsl_info_t; + + +typedef struct mlx_img_list_s +{ + int width; + int height; + char *buffer; + GLfloat vertexes[8]; + struct mlx_img_list_s *next; +} mlx_img_list_t; + + +typedef struct mlx_img_ctx_s +{ + GLuint texture; + GLuint vbuffer; + mlx_img_list_t *img; + struct mlx_img_ctx_s *next; +} mlx_img_ctx_t; + +typedef struct mlx_win_list_s +{ + void *winid; + mlx_img_ctx_t *img_list; + int nb_flush; + int pixmgt; + struct mlx_win_list_s *next; +} mlx_win_list_t; + + +typedef struct mlx_ptr_s +{ + void *appid; + mlx_win_list_t *win_list; + mlx_img_list_t *img_list; + void (*loop_hook)(void *); + void *loop_hook_data; + void *loop_timer; + mlx_img_list_t *font; + int main_loop_active; +} mlx_ptr_t; + +// proto + +int mlx_shaders(glsl_info_t *glsl); +char **mlx_int_str_to_wordtab(char *str); +int mlx_int_str_str(char *str,char *find,int len); +int mlx_int_str_str_cote(char *str,char *find,int len); +int mlx_destroy_image(mlx_ptr_t *mlx_ptr, mlx_img_list_t *img_ptr); +void *mlx_new_image(); +void *mlx_xpm_to_image(mlx_ptr_t *xvar,char **xpm_data,int *width,int *height); +int mlx_do_sync(mlx_ptr_t *mlx_ptr); diff --git a/parse_map/mlx/mlx_int_str_to_wordtab.c b/parse_map/mlx/mlx_int_str_to_wordtab.c new file mode 100644 index 0000000..3b2ef2e --- /dev/null +++ b/parse_map/mlx/mlx_int_str_to_wordtab.c @@ -0,0 +1,107 @@ +// +// str 2 wordtab & co +// by ol + + +#include +#include + +int mlx_int_str_str(char *str,char *find,int len) +{ + int len_f; + int pos; + char *s; + char *f; + + len_f = strlen(find); + if (len_f>len) + return (-1); + pos = 0; + while (*(str+len_f-1)) + { + s = str; + f = find; + while (*(f++) == *(s++)) + if (!*f) + return (pos); + str ++; + pos ++; + } + return (-1); +} + + + +int mlx_int_str_str_cote(char *str,char *find,int len) +{ + int len_f; + int pos; + char *s; + char *f; + int cote; + + len_f = strlen(find); + if (len_f>len) + return (-1); + cote = 0; + pos = 0; + while (*(str+len_f-1)) + { + if (*str=='"') + cote = 1-cote; + if (!cote) + { + s = str; + f = find; + while (*(f++) == *(s++)) + if (!*f) + return (pos); + } + str ++; + pos ++; + } + return (-1); +} + + +char **mlx_int_str_to_wordtab(char *str) +{ + char **tab; + int pos; + int nb_word; + int len; + + len = strlen(str); + nb_word = 0; + pos = 0; + while (pos + +#import +#import + +#include "mlx_int.h" +#include "mlx_new_window.h" + +int mlx_mouse_hide() +{ + // CGDisplayHideCursor(kCGDirectMainDisplay); + [NSCursor hide]; + return (0); +} + +int mlx_mouse_show() +{ + // CGDisplayShowCursor(kCGDirectMainDisplay); + [NSCursor unhide]; + return (0); +} + +int mlx_mouse_move(mlx_win_list_t *win, int x, int y) +{ + CGPoint point; + NSRect pos; + id thewin; + + thewin = [(id)(win->winid) win]; + pos = [thewin frame]; + // printf("got win pos %f %f\n", pos.origin.x, pos.origin.y); + point.x = pos.origin.x + x; + point.y = NSHeight([[thewin screen] frame]) - NSHeight([(id)(win->winid) frame]) - pos.origin.y + 1 + y; + CGWarpMouseCursorPosition(point); + CGAssociateMouseAndMouseCursorPosition(true); + return (0); +} + + +int mlx_mouse_get_pos(mlx_win_list_t *win, int *x, int *y) +{ + CGPoint point; + id thewin; + NSRect pos; + + thewin = [(id)(win->winid) win]; + pos = [(id)(win->winid) frame]; + point = [thewin mouseLocationOutsideOfEventStream]; + *x = point.x; + *y = NSHeight(pos) - 1 - point.y; + return (0); +} diff --git a/parse_map/mlx/mlx_new_image.m b/parse_map/mlx/mlx_new_image.m new file mode 100644 index 0000000..46e1df1 --- /dev/null +++ b/parse_map/mlx/mlx_new_image.m @@ -0,0 +1,198 @@ +// mlx_new_image +// +// by Ol +// + + +#import +#import + +#include "mlx_int.h" +#include "mlx_new_window.h" + + + +void *mlx_new_image(mlx_ptr_t *mlx_ptr, int width, int height) +{ + mlx_img_list_t *newimg; + + // if (mlx_ptr->win_list == NULL) + // return (NULL); // need at leat one window created to have openGL context and create texture + if ((newimg = malloc(sizeof(*newimg))) == NULL) + return ((void *)0); + newimg->next = mlx_ptr->img_list; + mlx_ptr->img_list = newimg; + newimg->width = width; + newimg->height = height; + newimg->vertexes[0] = 0.0; newimg->vertexes[1] = 0.0; + newimg->vertexes[2] = width; newimg->vertexes[3] = 0.0; + newimg->vertexes[4] = width; newimg->vertexes[5] = -height; + newimg->vertexes[6] = 0.0; newimg->vertexes[7] = -height; + newimg->buffer = malloc(UNIQ_BPP*width*height); + bzero(newimg->buffer, UNIQ_BPP*width*height); + + return (newimg); +} + +mlx_img_ctx_t *add_img_to_ctx(mlx_img_list_t *img, mlx_win_list_t *win) +{ + mlx_img_ctx_t *imgctx; + + imgctx = win->img_list; + while (imgctx) + { + if (imgctx->img == img) + return (imgctx); + imgctx = imgctx->next; + } + + imgctx = malloc(sizeof(*imgctx)); + imgctx->img = img; + imgctx->next = win->img_list; + win->img_list = imgctx; + + glGenTextures(1, &(imgctx->texture)); + glBindTexture(GL_TEXTURE_2D, imgctx->texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexImage2D( + GL_TEXTURE_2D, 0, /* target, level of detail */ + GL_RGBA8, /* internal format */ + img->width, img->height, 0, /* width, height, border */ + GL_BGRA, GL_UNSIGNED_BYTE, /* external format, type */ + img->buffer /* pixels */ + ); + + glGenBuffers(1, &(imgctx->vbuffer)); + glBindBuffer(GL_ARRAY_BUFFER, imgctx->vbuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(img->vertexes), img->vertexes, GL_DYNAMIC_DRAW); // 4 points buff + + return (imgctx); +} + + +void mlx_put_image_to_window(mlx_ptr_t *mlx_ptr, mlx_win_list_t *win_ptr, mlx_img_list_t *img_ptr, int x, int y) +{ + mlx_img_ctx_t *imgctx; + + if (!win_ptr->pixmgt) + return ; + + [(id)(win_ptr->winid) selectGLContext]; + imgctx = add_img_to_ctx(img_ptr, win_ptr); + + // update texture + glBindTexture(GL_TEXTURE_2D, imgctx->texture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, img_ptr->width, img_ptr->height, 0, + GL_BGRA, GL_UNSIGNED_BYTE, img_ptr->buffer); + + [(id)(win_ptr->winid) mlx_gl_draw_img:img_ptr andCtx:imgctx andX:x andY:y]; + + win_ptr->nb_flush ++; +} + +// assume here 32bpp little endian + +char *mlx_get_data_addr(mlx_img_list_t *img_ptr, int *bits_per_pixel, int *size_line, int *endian) +{ + *bits_per_pixel = UNIQ_BPP*8; + *size_line = img_ptr->width*UNIQ_BPP; + *endian = 0; // little endian for now on mac-intel + return (img_ptr->buffer); +} + +unsigned int mlx_get_color_value(mlx_ptr_t *mlx_ptr, int color) +{ + return (color); +} + +int mlx_string_put(mlx_ptr_t *mlx_ptr, mlx_win_list_t *win_ptr, int x, int y, int color, unsigned char *string) +{ + mlx_img_ctx_t *imgctx; + int gX; + int gY; + + if (!win_ptr->pixmgt) + return(0); + +#ifdef STRINGPUTX11 + y -= (FONT_HEIGHT * 2)/3; +#endif + + [(id)(win_ptr->winid) selectGLContext]; + + imgctx = add_img_to_ctx(mlx_ptr->font, win_ptr); + + while (*string) + { + if (*string >= 32 && *string <= 127) + { + gX = (FONT_WIDTH+2)*(*string-32); + gY = 0; + // printf("put char %c pos %d %d\n", *string, gX, gY); + [(id)(win_ptr->winid) mlx_gl_draw_font:mlx_ptr->font andCtx:imgctx andX:x andY:y andColor:color glyphX:gX glyphY:gY]; +#ifdef STRINGPUTX11 + x += FONT_WIDTH/1.4; +#else + x += FONT_WIDTH; +#endif + } + string ++; + } + + win_ptr->nb_flush ++; + + return (0); +} + +int mlx_destroy_image(mlx_ptr_t *mlx_ptr, mlx_img_list_t *img_todel) +{ + mlx_img_ctx_t ctx_first; + mlx_img_ctx_t *ctx; + mlx_img_ctx_t *ctx_to_del; + mlx_img_list_t img_first; + mlx_img_list_t *img; + mlx_win_list_t *win; + + img_first.next = mlx_ptr->img_list; + img = &img_first; + while (img && img->next) + { + if (img->next == img_todel) + img->next = img->next->next; + img = img->next; + } + mlx_ptr->img_list = img_first.next; + + + win = mlx_ptr->win_list; + while (win) + { + ctx_first.next = win->img_list; + ctx = &ctx_first; + while (ctx && ctx->next) + { + if (ctx->next->img == img_todel) + { + [(id)(win->winid) selectGLContext]; + glDeleteBuffers(1, &(ctx->next->vbuffer)); + glDeleteTextures(1, &(ctx->next->texture)); + ctx_to_del = ctx->next; + ctx->next = ctx->next->next; + free(ctx_to_del); + } + ctx = ctx->next; + } + win->img_list = ctx_first.next; + win = win->next; + } + + + free(img_todel->buffer); + free(img_todel); + + // printf("destroy image done.\n"); + return (0); +} diff --git a/parse_map/mlx/mlx_new_window.h b/parse_map/mlx/mlx_new_window.h new file mode 100644 index 0000000..d173e61 --- /dev/null +++ b/parse_map/mlx/mlx_new_window.h @@ -0,0 +1,57 @@ +// +// mlx_int.h for minilibx +// +// ol@staff.42.fr +// +// include opengl needed before mlx_int.h +// + +#import +#import "mlx_int.h" + +@interface NSWindowEvent : NSWindow +{ + func_t event_funct[MAX_EVENT]; + void *(event_param[MAX_EVENT]); + int keyrepeat; + int keyflag; + int size_x; + int size_y; +} +- (NSWindowEvent *) initWithContentRect:(NSRect)rect styleMask:(NSUInteger)winstyle backing:(NSBackingStoreType)bck defer:(BOOL) dfr; +- (void) setEvent:(int)event andFunc:(func_t)func andParam:(void *)param; +- (void) setKeyRepeat:(int)mode; +- (void) exposeNotification:(NSNotification *)note; +- (void) closeNotification:(NSNotification *)note; +@end + + +@interface MlxWin : NSOpenGLView +{ + NSWindowEvent *win; + NSOpenGLContext *ctx; + glsl_info_t glsl; + int openglwin; + + int size_x; + int size_y; + + int pixel_nb; + GLuint pixel_vbuffer; + GLuint pixel_texture; + unsigned int *pixtexbuff; +} + +- (id) initWithRect: (NSRect)rect andTitle: (NSString *)title pfaAttrs: (NSOpenGLPixelFormatAttribute *)attrs; +- (void) selectGLContext; +- (void) flushGLContext; +- (void) pixelPutColor: (int)color X:(int)x Y:(int)y; +- (void) mlx_gl_draw; +- (void) mlx_gl_draw_img:(mlx_img_list_t *)img andCtx:(mlx_img_ctx_t *)imgctx andX:(int)x andY:(int)y; +- (void) mlx_gl_draw_font:(mlx_img_list_t *)img andCtx:(mlx_img_ctx_t *)imgctx andX:(int)x andY:(int)y andColor:(int)color glyphX:(int)gx glyphY:(int)gy; +- (NSOpenGLContext *) ctx; +- (NSWindowEvent *) win; +- (void) setEvent:(int)event andFunc:(func_t)func andParam:(void *)param; +- (void) setKeyRepeat:(int)mode; +- (void) ctxNeedsUpdate; +@end diff --git a/parse_map/mlx/mlx_new_window.m b/parse_map/mlx/mlx_new_window.m new file mode 100644 index 0000000..6d4fea4 --- /dev/null +++ b/parse_map/mlx/mlx_new_window.m @@ -0,0 +1,766 @@ +// mlx_new_window.m + +#import +#import +#import + +#include +#include + +#include "mlx_int.h" +#include "mlx_new_window.h" + + +NSOpenGLPixelFormatAttribute pfa_attrs[] = + { + NSOpenGLPFADepthSize, 32, + NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersionLegacy, + 0 + }; + +static const GLfloat pixel_vertexes[8] = + { + -1.0 , -1.0, + 1.0, -1.0, + 1.0, 1.0, + -1.0, 1.0 + }; + + + +int get_mouse_button(NSEventType eventtype) +{ + switch (eventtype) { + case NSEventTypeLeftMouseDown: + case NSEventTypeLeftMouseUp: + case NSEventTypeLeftMouseDragged: + return 1; + case NSEventTypeRightMouseDown: + case NSEventTypeRightMouseUp: + case NSEventTypeRightMouseDragged: + return 2; + case NSEventTypeOtherMouseDown: + case NSEventTypeOtherMouseUp: + case NSEventTypeOtherMouseDragged: + return 3; + default: + return 0; + } +} + + +// classes for window & events + + + + +@implementation NSWindowEvent + +- (NSWindowEvent *) initWithContentRect:(NSRect)rect styleMask:(NSUInteger)winstyle backing:(NSBackingStoreType)bck defer:(BOOL) dfr +{ + int i; + + if ((self = [super initWithContentRect:rect + styleMask:winstyle + backing:bck + defer:dfr])) + { + i = MAX_EVENT; + while (i--) + { + event_funct[i] = NULL; + event_param[i] = NULL; + } + keyrepeat = 0; + keyflag = 0; + size_x = rect.size.width; + size_y = rect.size.height; + } + return (self); +} + + +- (void) setEvent:(int)event andFunc:(func_t)func andParam:(void *)param +{ + event_funct[event] = func; + event_param[event] = param; + if (event == 6 || event == 32) // motion notify && high precision motion notify + { + if (func == NULL) + [self setAcceptsMouseMovedEvents:NO]; + else + [self setAcceptsMouseMovedEvents:YES]; + } +} + + +- (void) setKeyRepeat:(int)mode +{ + keyrepeat = mode; +} + +- (BOOL) acceptsFirstResponder +{ + return (YES); +} + +- (void) flagsChanged:(NSEvent *)theEvent +{ + unsigned int flag; + int the_key; + unsigned int val; + + flag = [theEvent modifierFlags]; + // printf("Key flag changed: %x => %x\n", keyflag, flag); + // printf("**mlx flag low part : %d - %x\n", flag&0xFFFF, flag&0xFFFF); + + if (!(val = (keyflag|flag)&(~(keyflag&flag)))) + return ; // no change - can happen when loosing focus on special key pressed, then re-pressed later + the_key = 1; + while (((val >> (the_key-1)) & 0x01)==0) + the_key ++; + if (flag > keyflag && event_funct[2] != NULL) + event_funct[2](0xFF+the_key, event_param[2]); + if (flag < keyflag && event_funct[3] != NULL) + event_funct[3](0xFF+the_key, event_param[3]); + /* + if (event_funct[2] != NULL) + { + if (!(keyflag & NSAlphaShiftKeyMask) && (flag&NSAlphaShiftKeyMask)) event_funct[2](0xFF+1, event_param[2]); + if (!(keyflag & NSShiftKeyMask) && (flag&NSShiftKeyMask)) event_funct[2](0xFF+2, event_param[2]); + if (!(keyflag & NSControlKeyMask) && (flag&NSControlKeyMask)) event_funct[2](0xFF+3, event_param[2]); + if (!(keyflag & NSAlternateKeyMask) && (flag&NSAlternateKeyMask)) event_funct[2](0xFF+4, event_param[2]); + if (!(keyflag & NSCommandKeyMask) && (flag&NSCommandKeyMask)) event_funct[2](0xFF+5, event_param[2]); + if (!(keyflag & NSNumericPadKeyMask) && (flag&NSNumericPadKeyMask)) event_funct[2](0xFF+6, event_param[2]); + if (!(keyflag & NSHelpKeyMask) && (flag&NSHelpKeyMask)) event_funct[2](0xFF+7, event_param[2]); + if (!(keyflag & NSFunctionKeyMask) && (flag&NSFunctionKeyMask)) event_funct[2](0xFF+8, event_param[2]); + } + if (event_funct[3] != NULL) + { + if ((keyflag & NSShiftKeyMask) && !(flag&NSShiftKeyMask)) event_funct[3](NSShiftKeyMask, event_param[3]); + + if ((keyflag & NSAlphaShiftKeyMask) && !(flag&NSAlphaShiftKeyMask)) event_funct[3](0xFF+1, event_param[3]); + if ((keyflag & NSShiftKeyMask) && !(flag&NSShiftKeyMask)) event_funct[3](0xFF+2, event_param[3]); + if ((keyflag & NSControlKeyMask) && !(flag&NSControlKeyMask)) event_funct[3](0xFF+3, event_param[3]); + if ((keyflag & NSAlternateKeyMask) && !(flag&NSAlternateKeyMask)) event_funct[3](0xFF+4, event_param[3]); + if ((keyflag & NSCommandKeyMask) && !(flag&NSCommandKeyMask)) event_funct[3](0xFF+5, event_param[3]); + if ((keyflag & NSNumericPadKeyMask) && !(flag&NSNumericPadKeyMask)) event_funct[3](0xFF+6, event_param[3]); + if ((keyflag & NSHelpKeyMask) && !(flag&NSHelpKeyMask)) event_funct[3](0xFF+7, event_param[3]); + if ((keyflag & NSFunctionKeyMask) && !(flag&NSFunctionKeyMask)) event_funct[3](0xFF+8, event_param[3]); + } + */ + keyflag = flag; +} + +- (void) keyDown:(NSEvent *)theEvent +{ + if (keyrepeat==0 && [theEvent isARepeat]) + return ; + // printf("Key Down: %d\n", [theEvent keyCode]); + if (event_funct[2] != NULL) + event_funct[2]([theEvent keyCode], event_param[2]); + // else [super keyDown: theEvent]; +} + +- (void) keyUp:(NSEvent *)theEvent +{ + // printf("Key Up: %d\n", [theEvent keyCode]); + if (event_funct[3] != NULL) + event_funct[3]([theEvent keyCode], event_param[3]); + // else [super keyUp: theEvent]; + +} + +- (void) mouseDown:(NSEvent *)theEvent +{ + NSPoint thepoint; + int button; + + thepoint = [theEvent locationInWindow]; + button = get_mouse_button([theEvent type]); + // printf("Mouse pressed bt %d pos: %f, %f\n", button, thepoint.x, thepoint.y); + if (event_funct[4] != NULL) + event_funct[4](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[4]); +} + +- (void) rightMouseDown:(NSEvent *)theEvent +{ + NSPoint thepoint; + int button; + + thepoint = [theEvent locationInWindow]; + button = get_mouse_button([theEvent type]); + // printf("Mouse pressed bt %d pos: %f, %f\n", button, thepoint.x, thepoint.y); + if (event_funct[4] != NULL) + event_funct[4](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[4]); +} + +- (void) otherMouseDown:(NSEvent *)theEvent +{ + NSPoint thepoint; + int button; + + thepoint = [theEvent locationInWindow]; + button = get_mouse_button([theEvent type]); + // printf("Mouse pressed bt %d pos: %f, %f\n", button, thepoint.x, thepoint.y); + if (event_funct[4] != NULL) + event_funct[4](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[4]); +} + +- (void) mouseUp:(NSEvent *)theEvent +{ + NSPoint thepoint; + int button; + + thepoint = [theEvent locationInWindow]; + button = get_mouse_button([theEvent type]); + // printf("Mouse release bt %d pos: %f, %f\n", button, thepoint.x, thepoint.y); + if (event_funct[5] != NULL) + event_funct[5](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[5]); +} + +- (void) rightMouseUp:(NSEvent *)theEvent +{ + NSPoint thepoint; + int button; + + thepoint = [theEvent locationInWindow]; + button = get_mouse_button([theEvent type]); + // printf("Mouse release bt %d pos: %f, %f\n", button, thepoint.x, thepoint.y); + if (event_funct[5] != NULL) + event_funct[5](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[5]); +} + +- (void) otherMouseUp:(NSEvent *)theEvent +{ + NSPoint thepoint; + int button; + + thepoint = [theEvent locationInWindow]; + button = get_mouse_button([theEvent type]); + // printf("Mouse release bt %d pos: %f, %f\n", button, thepoint.x, thepoint.y); + if (event_funct[5] != NULL) + event_funct[5](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[5]); +} + +- (void) mouseMoved:(NSEvent *)theEvent +{ + NSPoint thepoint; + + thepoint = [theEvent locationInWindow]; + // printf("Mouse moved pos: %f, %f\n", thepoint.x, thepoint.y); + if (event_funct[6] != NULL) + event_funct[6]((int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[6]); +} + + +- (void) mouseDragged:(NSEvent *)theEvent +{ + NSPoint thepoint; + + thepoint = [theEvent locationInWindow]; + // printf("Mouse moved pos: %f, %f\n", thepoint.x, thepoint.y); + if (event_funct[6] != NULL) + event_funct[6]((int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[6]); +} + + +- (void) rightMouseDragged:(NSEvent *)theEvent +{ + NSPoint thepoint; + + thepoint = [theEvent locationInWindow]; + // printf("Mouse moved pos: %f, %f\n", thepoint.x, thepoint.y); + if (event_funct[6] != NULL) + event_funct[6]((int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[6]); +} + + +- (void) otherMouseDragged:(NSEvent *)theEvent +{ + NSPoint thepoint; + + thepoint = [theEvent locationInWindow]; + // printf("Mouse moved pos: %f, %f\n", thepoint.x, thepoint.y); + if (event_funct[6] != NULL) + event_funct[6]((int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[6]); +} + + +- (void) scrollWheel:(NSEvent *)theEvent +{ + NSPoint thepoint; + int button; + float sens; + + if (event_funct[4] == NULL) + return ; + + button = 0; + thepoint = [theEvent locationInWindow]; + sens = [theEvent deltaY]; + if (sens > 0.2) + button = 4; + if (sens < -0.2) + button = 5; + sens = [theEvent deltaX]; + if (sens > 0.2) + button = 6; + if (sens < -0.2) + button = 7; + if (button != 0) + event_funct[4](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[4]); +} + + +- (void) exposeNotification:(NSNotification *)note +{ + // printf("Expose...\n"); + if (event_funct[12] != NULL) + event_funct[12](event_param[12]); + // printf("Expose done.\n"); +} + +- (void) closeNotification:(NSNotification *)note +{ + if (event_funct[17] != NULL) + event_funct[17](event_param[17]); +} + +- (void) deminiaturizeNotification:(NSNotification *)note +{ + // if (event_funct[??] != NULL) + // event_funct[??](event_param[??]); + [self exposeNotification:note]; +} +@end + + +@implementation MlxWin + +- (id) initWithRect: (NSRect)rect andTitle: (NSString *)title pfaAttrs: (NSOpenGLPixelFormatAttribute *)attrs +{ + NSOpenGLPixelFormat* pixFmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; + + if ((self = [super initWithFrame:rect pixelFormat:pixFmt]) != nil) + { + NSUInteger windowStyle = NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable; + + win = [[NSWindowEvent alloc] initWithContentRect:rect + styleMask:windowStyle + backing:NSBackingStoreBuffered // NSBackingStoreNonretained + defer:NO]; + [win setContentView:self]; + [win setTitle:title]; + [win setKeyRepeat:1]; + [win makeKeyAndOrderFront:self]; + + // printf("init ctx: current %p ", [NSOpenGLContext currentContext]); + + // ctx = [[NSOpenGLContext alloc] initWithFormat:pixFmt shareContext:[NSOpenGLContext currentContext]]; //other_context]; + // [ctx setView:self]; + // [ctx makeCurrentContext]; + + [[self openGLContext] makeCurrentContext]; + [[self openGLContext] setView:self]; + [self prepareOpenGL]; + + [self setNextKeyView:self]; + + // [[NSNotificationCenter defaultCenter] addObserver:win selector:@selector(exposeNotification:) name:@"NSWindowDidExposeNotification" object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:win selector:@selector(exposeNotification:) name:@"NSWindowDidBecomeKeyNotification" object:win]; + [[NSNotificationCenter defaultCenter] addObserver:win selector:@selector(deminiaturizeNotification:) name:@"NSWindowDidDeminiaturizeNotification" object:win]; + [[NSNotificationCenter defaultCenter] addObserver:win selector:@selector(closeNotification:) name:@"NSWindowWillCloseNotification" object:win]; + // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ctxNeedsUpdate:) + // name:NSViewGlobalFrameDidChangeNotification + // object:nil]; + + size_x = rect.size.width; + size_y = rect.size.height; + + glClearColor(0, 0, 0, 0); + glClear(GL_COLOR_BUFFER_BIT); + glFlush(); + + //[win makeKeyAndOrderFront:nil]; + // BOOL r = [win isKeyWindow]; + // if (r==YES) printf("keywindow ok\n"); else printf("keywindow KO\n"); + + // Window controller subclass to set title + // NSWindowController* windowController = [[NSWindowController alloc] initWithWindow:win]; + // [windowController windowTitleForDocumentDisplayName:title]; + // [windowController showWindow:nil]; + // MlxWinController *mlxWinCont = [[MlxWinController alloc] initWin:win andTitle:title]; + + // after nswindowcontroller who will retake first responder + // BOOL r = [win makeFirstResponder:nil]; + // if (r==YES) printf("responder ok\n"); else printf("responder KO\n"); + + [pixFmt release]; + } + return (self); +} + +- (int) pixel_management +{ + bzero(&glsl, sizeof(glsl)); // so gldelete[shader/program] go silent on error. + + glDisable(GL_DEPTH_TEST); + glGenBuffers(1, &pixel_vbuffer); + glBindBuffer(GL_ARRAY_BUFFER, pixel_vbuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(pixel_vertexes), pixel_vertexes, GL_DYNAMIC_DRAW); // 4 points buff + // pixel_ptr = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); + + glGenTextures(1, &pixel_texture); + glBindTexture(GL_TEXTURE_2D, pixel_texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + pixtexbuff = malloc(sizeof(unsigned int)*size_x*size_y); + pixel_nb = size_x*size_y; + while (pixel_nb--) pixtexbuff[pixel_nb] = 0xFF000000; + pixel_nb = 0; + glTexImage2D( + GL_TEXTURE_2D, 0, /* target, level of detail */ + GL_RGBA8, /* internal format */ + size_x, size_y, 0, /* width, height, border */ + GL_BGRA, GL_UNSIGNED_BYTE, /* external format, type */ + pixtexbuff /* pixels */ + ); + // printf("pix tex err? 0x%x\n", glGetError()); + + if (mlx_shaders(&glsl)) + return (0); + + glUseProgram(glsl.pixel_program); + glsl.loc_pixel_texture = glGetUniformLocation(glsl.pixel_program, "texture"); + //glsl.loc_pixel_winhalfsize = glGetUniformLocation(glsl.pixel_program, "winhalfsize"); + glsl.loc_pixel_position = glGetAttribLocation(glsl.pixel_program, "position"); + // printf("err? 0x%x\n", glGetError()); + + glUseProgram(glsl.image_program); + glsl.loc_image_texture = glGetUniformLocation(glsl.image_program, "texture"); + glsl.loc_image_pos = glGetUniformLocation(glsl.image_program, "imagepos"); + glsl.loc_image_size = glGetUniformLocation(glsl.image_program, "imagesize"); + glsl.loc_image_winhalfsize = glGetUniformLocation(glsl.image_program, "winhalfsize"); + glsl.loc_image_position = glGetAttribLocation(glsl.image_program, "position"); + // printf("err? 0x%x\n", glGetError()); + + glUseProgram(glsl.font_program); + glsl.loc_font_texture = glGetUniformLocation(glsl.font_program, "texture"); + glsl.loc_font_color = glGetUniformLocation(glsl.font_program, "color"); + glsl.loc_font_posinwin = glGetUniformLocation(glsl.font_program, "fontposinwin"); + glsl.loc_font_posinatlas = glGetUniformLocation(glsl.font_program, "fontposinatlas"); + glsl.loc_font_atlassize = glGetUniformLocation(glsl.font_program, "fontatlassize"); + glsl.loc_font_winhalfsize = glGetUniformLocation(glsl.font_program, "winhalfsize"); + glsl.loc_font_position = glGetAttribLocation(glsl.font_program, "position"); + // printf("err? 0x%x\n", glGetError()); + + glFlush(); + return (1); +} + +- (void) ctxNeedsUpdate +{ + // printf("Context update\n"); + [ctx update]; +} + +- (void) selectGLContext +{ + if ([NSOpenGLContext currentContext] != [self openGLContext]) + { + // printf("ctx: %p => %p\n", [NSOpenGLContext currentContext], [self openGLContext]); + [[self openGLContext] makeCurrentContext]; + } +} + +- (void) flushGLContext +{ + [[self openGLContext] flushBuffer]; +} + +- (NSOpenGLContext *) ctx +{ + return (ctx); +} + +- (NSWindowEvent *) win +{ + return (win); +} + + +- (void) pixelPutColor: (int)color X:(int)x Y:(int)y +{ + pixel_nb ++; + + glBindTexture(GL_TEXTURE_2D, pixel_vbuffer); + glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, 1, 1, GL_BGRA, GL_UNSIGNED_BYTE, (GLvoid *)(&color)); + + if (pixel_nb >= MAX_PIXEL_NB) + [self mlx_gl_draw]; +} + +- (void) destroyPixelManagement +{ + free(pixtexbuff); + [self selectGLContext]; + glDeleteBuffers(1, &pixel_vbuffer); + glDeleteTextures(1, &pixel_texture); + glDeleteProgram(glsl.pixel_program); + glDeleteProgram(glsl.image_program); + glDeleteShader(glsl.pixel_vshader); + glDeleteShader(glsl.pixel_fshader); + glDeleteShader(glsl.image_vshader); + glDeleteShader(glsl.image_fshader); +} + + +- (void) destroyMe +{ + [[NSNotificationCenter defaultCenter] removeObserver:win]; + [[NSNotificationCenter defaultCenter] removeObserver:self]; + // [ctx release]; + [win close]; + [self release]; +} + +- (void) setEvent:(int)event andFunc:(func_t)func andParam:(void *)param +{ + [win setEvent:event andFunc:func andParam:param]; +} + +- (void) setKeyRepeat:(int)mode +{ + [win setKeyRepeat:mode]; +} + +- (void) clearWin +{ + glClearColor(0, 0, 0, 0); + glClear(GL_COLOR_BUFFER_BIT); +} + +- (void) mlx_gl_draw_img:(mlx_img_list_t *)img andCtx:(mlx_img_ctx_t *)imgctx andX:(int)x andY:(int)y +{ + + if (pixel_nb >0) + [self mlx_gl_draw]; + + glUseProgram(glsl.image_program); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, imgctx->texture); + glUniform1i(glsl.loc_image_texture, 0); + + glUniform2f(glsl.loc_image_winhalfsize, size_x/2, size_y/2); + glUniform2f(glsl.loc_image_pos, x, size_y - y); + glUniform2f(glsl.loc_image_size, img->width, -img->height); + + glBindBuffer(GL_ARRAY_BUFFER, imgctx->vbuffer); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2*sizeof(GLfloat), (void*)0); + glEnableVertexAttribArray(0); + + glEnable(GL_BLEND); + glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); // src alpha 0xFF : keep dst + glBlendEquation(GL_FUNC_ADD); + + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + glDisableVertexAttribArray(0); + +} + + +- (void) mlx_gl_draw_font:(mlx_img_list_t *)img andCtx:(mlx_img_ctx_t *)imgctx andX:(int)x andY:(int)y andColor:(int)color glyphX:(int)gx glyphY:(int)gy +{ + GLfloat color_tab[4]; + + if (pixel_nb >0) + [self mlx_gl_draw]; + + color_tab[0] = ((float)((color&0xFF0000)>>16))/255.0; + color_tab[1] = ((float)((color&0xFF00)>>8))/255.0; + color_tab[2] = ((float)((color&0xFF)>>0))/255.0; + color_tab[3] = 1.0; + glUseProgram(glsl.font_program); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, imgctx->texture); + glUniform1i(glsl.loc_font_texture, 0); + glUniform4fv(glsl.loc_font_color, 1, color_tab); + + glUniform2f(glsl.loc_font_winhalfsize, size_x/2, size_y/2); + glUniform2f(glsl.loc_font_posinwin, x, size_y - 1 - y); + glUniform2f(glsl.loc_font_posinatlas, gx, gy); + glUniform2f(glsl.loc_font_atlassize, img->width, img->height); + + glBindBuffer(GL_ARRAY_BUFFER, imgctx->vbuffer); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2*sizeof(GLfloat), (void*)0); + glEnableVertexAttribArray(0); + + glEnable(GL_BLEND); + glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); // src alpha 0xFF : keep dst + glBlendEquation(GL_FUNC_ADD); + + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + glDisableVertexAttribArray(0); + +} + + +- (void) mlx_gl_draw +{ + if (pixel_nb <= 0) + return ; + + glUseProgram(glsl.pixel_program); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, pixel_vbuffer); + glUniform1i(glsl.loc_pixel_texture, 0); + + glBindBuffer(GL_ARRAY_BUFFER, pixel_vbuffer); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2*sizeof(GLfloat), (void*)0); + glEnableVertexAttribArray(0); + + glEnable(GL_BLEND); + glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); // src alpha 0xFF : keep dst + glBlendEquation(GL_FUNC_ADD); + + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + glDisableVertexAttribArray(0); + + pixel_nb = size_x*size_y; + while (pixel_nb--) pixtexbuff[pixel_nb] = 0xFF000000; + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, size_x, size_y, 0, GL_BGRA, GL_UNSIGNED_BYTE, pixtexbuff); + pixel_nb = 0; + +} + +@end + + +// mlx API + + +void *mlx_new_window(mlx_ptr_t *mlx_ptr, int size_x, int size_y, char *title) +{ + mlx_win_list_t *newwin; + NSString *str; + + if ((newwin = malloc(sizeof(*newwin))) == NULL) + return ((void *)0); + newwin->img_list = NULL; + newwin->next = mlx_ptr->win_list; + newwin->nb_flush = 0; + newwin->pixmgt = 1; + mlx_ptr->win_list = newwin; + + NSRect windowRect = NSMakeRect(100, 100, size_x, size_y); + str = [NSString stringWithCString:title encoding:NSASCIIStringEncoding]; + newwin->winid = [[MlxWin alloc] initWithRect:windowRect andTitle:str pfaAttrs:pfa_attrs]; + if (newwin->winid) + if (![(id)(newwin->winid) pixel_management]) + { + [(id)(newwin->winid) destroyPixelManagement]; + [(id)(newwin->winid) destroyMe]; + } + return ((void *)newwin); +} + + +void mlx_clear_window(mlx_ptr_t *mlx_ptr, mlx_win_list_t *win_ptr) +{ + [(id)(win_ptr->winid) selectGLContext]; + [(id)(win_ptr->winid) clearWin]; + win_ptr->nb_flush ++; +} + + +void mlx_expose_hook(mlx_win_list_t *win_ptr, int (*funct_ptr)(), void *param) +{ + [(id)(win_ptr->winid) setEvent:12 andFunc:funct_ptr andParam:param]; +} + +void mlx_key_hook(mlx_win_list_t *win_ptr, int (*funct_ptr)(), void *param) +{ + [(id)(win_ptr->winid) setEvent:3 andFunc:funct_ptr andParam:param]; +} + +void mlx_mouse_hook(mlx_win_list_t *win_ptr, int (*funct_ptr)(), void *param) +{ + [(id)(win_ptr->winid) setEvent:4 andFunc:funct_ptr andParam:param]; +} + +void mlx_hook(mlx_win_list_t *win_ptr, int x_event, int x_mask, int (*funct_ptr)(), void *param) +{ + [(id)(win_ptr->winid) setEvent:x_event andFunc:funct_ptr andParam:param]; +} + +int mlx_do_key_autorepeatoff(mlx_ptr_t *mlx_ptr) +{ + mlx_win_list_t *win; + + win = mlx_ptr->win_list; + while (win) + { + [(id)(win->winid) setKeyRepeat:0]; + win = win->next; + } + return (0); +} + +int mlx_do_key_autorepeaton(mlx_ptr_t *mlx_ptr) +{ + mlx_win_list_t *win; + + win = mlx_ptr->win_list; + while (win) + { + [(id)(win->winid) setKeyRepeat:1]; + win = win->next; + } + return (0); +} + + +int mlx_destroy_window(mlx_ptr_t *mlx_ptr, mlx_win_list_t *win_to_del) +{ + mlx_win_list_t first; + mlx_win_list_t *win; + mlx_img_ctx_t *ctx; + mlx_img_ctx_t *ctx2; + + first.next = mlx_ptr->win_list; + win = &first; + while (win && win->next) + { + if (win->next == win_to_del) + win->next = win->next->next; + win = win->next; + } + mlx_ptr->win_list = first.next; + + if (win_to_del->pixmgt) + { + [(id)(win_to_del->winid) selectGLContext]; + ctx = win_to_del->img_list; // should be null anyway if no pixel management + while (ctx) + { + glDeleteBuffers(1, &(ctx->vbuffer)); + glDeleteTextures(1, &(ctx->texture)); + ctx2 = ctx; + ctx = ctx->next; + free(ctx2); + } + [(id)(win_to_del->winid) destroyPixelManagement]; + } + [(id)(win_to_del->winid) destroyMe]; + free(win_to_del); + + // printf("destroy window done.\n"); + mlx_do_sync(mlx_ptr); + return (0); +} diff --git a/parse_map/mlx/mlx_opengl.h b/parse_map/mlx/mlx_opengl.h new file mode 100644 index 0000000..bb39267 --- /dev/null +++ b/parse_map/mlx/mlx_opengl.h @@ -0,0 +1,21 @@ +/* +** +** mlx_opengl.h +** +** public include, use it after mlx.h +** designed only for minilibx_macos +** +*/ + +void *mlx_new_opengl_window(void *mlx_ptr, int size_x, int size_y, char *title); + +/* create an opengl window. put_image & pixel_put & string_put do not work there. */ + +int mlx_opengl_swap_buffers(void *win_ptr); + +/* the created window is double buffered. Use this funct to swap buffers */ +/* this funct will call glFlush(). Don't call it. */ + +int mlx_opengl_window_set_context(void *win_ptr); + +/* in case multiple opengl windows are present, change opengl active context */ diff --git a/parse_map/mlx/mlx_opengl.m b/parse_map/mlx/mlx_opengl.m new file mode 100644 index 0000000..554d79b --- /dev/null +++ b/parse_map/mlx/mlx_opengl.m @@ -0,0 +1,57 @@ +// mlx_opengl.m + +#import +#import +#import + +#include + +#include "mlx_int.h" +#include "mlx_new_window.h" + + + + + +NSOpenGLPixelFormatAttribute pfa_attrs_opengl[] = + { + NSOpenGLPFADepthSize, 32, + NSOpenGLPFADoubleBuffer, + NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion4_1Core, + 0 + }; + + + +void *mlx_new_opengl_window(mlx_ptr_t *mlx_ptr, int size_x, int size_y, char *title) +{ + mlx_win_list_t *newwin; + NSString *str; + + if ((newwin = malloc(sizeof(*newwin))) == NULL) + return ((void *)0); + newwin->img_list = NULL; + newwin->next = mlx_ptr->win_list; + newwin->nb_flush = 0; + newwin->pixmgt = 0; + mlx_ptr->win_list = newwin; + + NSRect windowRect = NSMakeRect(100, 100, size_x, size_y); + str = [NSString stringWithCString:title encoding:NSASCIIStringEncoding]; + newwin->winid = [[MlxWin alloc] initWithRect:windowRect andTitle:str pfaAttrs:pfa_attrs_opengl]; + + return ((void *)newwin); +} + + +int mlx_opengl_swap_buffers(mlx_win_list_t *win_ptr) +{ + [(id)(win_ptr->winid) flushGLContext]; + return (0); +} + +int mlx_opengl_window_set_context(mlx_win_list_t *win_ptr) +{ + [(id)(win_ptr->winid) selectGLContext]; + return (0); +} diff --git a/parse_map/mlx/mlx_png.c b/parse_map/mlx/mlx_png.c new file mode 100644 index 0000000..ca8024d --- /dev/null +++ b/parse_map/mlx/mlx_png.c @@ -0,0 +1,418 @@ + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "zlib.h" + +#include +#include "mlx_int.h" + + +#define PNG_MAGIC_SIZE 8 +unsigned char magic[PNG_MAGIC_SIZE] = {137, 80, 78, 71, 13, 10, 26, 10}; +#define PNG_HDR_SIZE 13 + +#define Z_CHUNK 32768 + +#define ERR_MAGIC_SIZE 1 +#define ERR_MAGIC_WRONG 2 +#define ERR_STRUCT_INCOMPLETE 3 +#define ERR_STRUCT_HDR 4 +#define ERR_STRUCT_END 5 +#define ERR_STRUCT_CRC 6 +#define ERR_STRUCT_INCIMPL 7 +#define ERR_STRUCT_DAT 8 +#define ERR_STRUCT_MISSCHK 9 +#define ERR_ZLIB 10 +#define ERR_DATA_MISMATCH 11 +#define ERR_DATA_FILTER 12 +char *(mipng_err[]) = +{ + "No error", + "Not enough size for magic", + "Wrong magic", + "Incomplete chunk structure", + "Duplicate or incorrect header", + "Duplicate or incorrect end", + "Invalid CRC in chunk", + "Incorrect header or configuration not implemented", + "Non consecutive dat chunks", + "Missing header/dat/end chunk(s)", + "Zlib inflate error", + "Inflated data size mismatch", + "Unknown scanline filter" +}; + +typedef struct png_info_s +{ + unsigned int width; + unsigned int height; + int depth; + int color; + int interlace; + int bpp; +} png_info_t; + + +int mipng_is_type(unsigned char *ptr, char *type) +{ + if (ptr[4] == type[0] && ptr[5] == type[1] && ptr[6] == type[2] && ptr[7] == type[3]) + return (1); + return (0); +} + + +unsigned char mipng_defilter_none(unsigned char *buff, int pos, int a, int b, int c) +{ return (buff[pos]); } +unsigned char mipng_defilter_sub(unsigned char *buff, int pos, int a, int b, int c) +{ return (buff[pos]+(unsigned int)a); } +unsigned char mipng_defilter_up(unsigned char *buff, int pos, int a, int b, int c) +{ return (buff[pos]+(unsigned int)b); } +unsigned char mipng_defilter_average(unsigned char *buff, int pos, int a, int b, int c) +{ return (buff[pos]+((unsigned int)a+(unsigned int)b)/2); } +unsigned char mipng_defilter_paeth(unsigned char *buff, int pos, int a, int b, int c) +{ + int p; + int result; + + p = a + b - c; + if (abs(b - c) <= abs(a - c) && abs(b - c) <= abs(a + b - c - c)) + result = a; + else + if (abs(a - c) <= abs(a + b - c - c)) + result = b; + else + result = c; + return (buff[pos]+result); +} + + + +unsigned char (*(mipng_defilter[]))(unsigned char *buff, int pos, int a, int b, int c) = +{ + mipng_defilter_none, + mipng_defilter_sub, + mipng_defilter_up, + mipng_defilter_average, + mipng_defilter_paeth +}; + +// only work for mlx mac or img 32bpp +int mipng_fill_img(mlx_img_list_t *img, unsigned char *buf, png_info_t *pi) +{ + unsigned int current_filter; + int ipos; + int bpos; + int ilen; + int iline; + int blen; + unsigned char tmp; + unsigned char *ibuf; + + ibuf = (unsigned char *)img->buffer; + iline = img->width * UNIQ_BPP; + ilen = img->width * img->height * UNIQ_BPP; + blen = img->width * img->height * pi->bpp + img->height; + ipos = 0; + bpos = 0; + while (ipos < ilen && bpos < blen) + { + if ((ipos % iline) == 0) + { + if ((current_filter = buf[bpos++]) > 4) + return (ERR_DATA_FILTER); + } + ibuf[ipos] = mipng_defilter[current_filter](buf, bpos, + ipos%iline>3?ibuf[ipos-UNIQ_BPP]:0, + (ipos>=iline)?ibuf[ipos-iline]:0, + (ipos>=iline && ipos%iline>3)?ibuf[ipos-iline-UNIQ_BPP]:0); + ipos ++; + bpos ++; + if (pi->depth == 16) + bpos ++; + if (ipos % 4 == 3 && pi->color == 2) // no alpha + img->buffer[ipos++] = 0xFF; + } + if (ipos != ilen || bpos != blen) + { + // printf("fill err ipos %d vs %d, bpos %d vs %d\n", ipos, ilen, bpos, blen); + return (ERR_DATA_MISMATCH); + } + ipos = 0; + while (ipos < ilen) + { + tmp = ibuf[ipos]; + ibuf[ipos] = ibuf[ipos+2]; + ibuf[ipos+2] = tmp; + ibuf[ipos+3] = 0xFF - ibuf[ipos+3]; + ipos += UNIQ_BPP; + } + return (0); +} + + +int mipng_data(mlx_img_list_t *img, unsigned char *dat, png_info_t *pi) +{ + unsigned int len; + int b_pos; + unsigned char *buffer; + int ret; + int z_ret; + unsigned z_have; + z_stream z_strm; + unsigned char z_out[Z_CHUNK]; + + b_pos = 0; + if (!(buffer = malloc((long long)img->width*(long long)img->height*(long long)pi->bpp + img->height))) + err(1, "Can't malloc"); + z_strm.zalloc = Z_NULL; + z_strm.zfree = Z_NULL; + z_strm.opaque = Z_NULL; + z_strm.avail_in = 0; + z_strm.next_in = Z_NULL; + z_ret = inflateInit(&z_strm); + if (z_ret != Z_OK) + return (ERR_ZLIB); + + while (mipng_is_type(dat, "IDAT")) + { + len = *((unsigned int *)dat); + len = ntohl(len); + z_strm.avail_in = len; + z_strm.next_in = dat + 8; + z_strm.avail_out = 0; + while (z_strm.avail_out == 0) + { + z_strm.avail_out = Z_CHUNK; + z_strm.next_out = z_out; + z_ret = inflate(&z_strm, Z_NO_FLUSH); + // printf("inflate ret %d avail_out %d\n", z_ret, z_strm.avail_out); + if (z_ret != Z_OK && z_ret != Z_STREAM_END) + { + inflateEnd(&z_strm); + return (ERR_ZLIB); + } + if (b_pos + Z_CHUNK - z_strm.avail_out > img->width*img->height*pi->bpp+img->height) + { + inflateEnd(&z_strm); + return (ERR_DATA_MISMATCH); + } + bcopy(z_out, buffer+b_pos, Z_CHUNK - z_strm.avail_out); + b_pos += Z_CHUNK - z_strm.avail_out; + } + dat += len + 4 + 4 + 4; + } + inflateEnd(&z_strm); + if (b_pos != img->width*img->height*pi->bpp+img->height) + { + // printf("pb : bpos %d vs expected %d\n", b_pos, img->width*img->height*pi->bpp+img->height); + return (ERR_DATA_MISMATCH); + } + if ((ret = mipng_fill_img(img, buffer, pi))) + return (ret); + return (0); +} + + + +int mipng_magic(unsigned char *ptr, int size) +{ + int i; + + if (size < PNG_MAGIC_SIZE) + return (ERR_MAGIC_SIZE); + i = 0; + while (i < PNG_MAGIC_SIZE) + if (*(ptr++) != magic[i++]) + return (ERR_MAGIC_WRONG); + return (0); +} + + +unsigned long crc_table[256] = { 0, 0x77073096, 0xee0e612c, 0x990951ba, 0x76dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0xedb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x9b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x1db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x6b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0xf00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x86d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x3b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x4db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0xd6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0xa00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x26d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x5005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0xcb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0xbdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; + +// From http://www.w3.org/TR/PNG/#D-CRCAppendix +int mipng_crc(unsigned char *ptr, int len) +{ + unsigned int file_crc; + unsigned long crc; + int i; + + file_crc = *((unsigned int *)(ptr+4+4+len)); + file_crc = ntohl(file_crc); + + crc = 0xffffffffL; + i = 0; + while (i < len+4) + crc = crc_table[(crc ^ ptr[(i++)+4]) & 0xff] ^ (crc >> 8); + crc ^= 0xffffffffL; + + if (file_crc != crc) + return (1); + return (0); +} + + +int mipng_structure(unsigned char *ptr, int size, unsigned char **hdr, unsigned char **dat) +{ + unsigned int len; + int dat_state; + int end; + + dat_state = 0; + *hdr = NULL; + *dat = NULL; + end = 0; + while (size) + { + if (size >= 4) // length present + { + len = *((unsigned int *)ptr); + len = ntohl(len); + if (size < 4 + 4 + 4 + len) + return (ERR_STRUCT_INCOMPLETE); + if (mipng_crc(ptr, len)) + return (ERR_STRUCT_CRC); + // printf("found chunk len %d type %c%c%c%c\n", len, *(ptr+4), *(ptr+5), *(ptr+6), *(ptr+7)); + if (mipng_is_type(ptr, "IHDR")) + { + if (*hdr || len != PNG_HDR_SIZE) + return (ERR_STRUCT_HDR); + *hdr = ptr; + } + if (mipng_is_type(ptr, "IEND")) + { + if (len != 0 || size != 4+4+4) + return (ERR_STRUCT_END); + end = 1; + } + if (mipng_is_type(ptr, "IDAT")) + { + if (dat_state == 0) + { + dat_state = 1; + *dat = ptr; + } + if (dat_state == 2) + return (ERR_STRUCT_DAT); + } + else + if (dat_state == 1) + dat_state = 2; + size -= 4+4+4+len; + ptr += 4+4+4+len; + } + else + return (ERR_STRUCT_INCOMPLETE); + } + if (*hdr == 0 || *dat == 0 || end == 0) + return (ERR_STRUCT_MISSCHK); + return (0); +} + + +int mipng_verif_hdr(unsigned char *hdr, png_info_t *pi) +{ + unsigned int compress; + unsigned int filter; + + hdr += 8; + pi->width = ntohl(*((unsigned long *)hdr)); + pi->height = ntohl(*((unsigned long *)(hdr+4))); + pi->depth = *(hdr+8); + pi->color = *(hdr+9); + compress = *(hdr+10); + filter = *(hdr+11); + pi->interlace = *(hdr+12); + if (pi->width <= 0 || pi->height <= 0 || (pi->depth != 8 && pi->depth != 16) + || (pi->color != 2 && pi->color != 6) || compress != 0 || filter != 0 || pi->interlace != 0) + return (ERR_STRUCT_INCIMPL); + pi->bpp = pi->depth / 8; + if (pi->color == 2) + pi->bpp *= 3; + if (pi->color == 6) + pi->bpp *= 4; + // printf("hdr info : %d x %d, depth %d, col type %d, comp %d, filter %d, interlace %d\nbpp is %d\n", + // pi->width, pi->height, pi->depth, pi->color, compress, filter, pi->interlace, pi->bpp); + return (0); +} + + +mlx_img_list_t *mlx_int_parse_png(mlx_ptr_t *xvar, unsigned char *fptr, int size) +{ + int err; + unsigned char *hdr; + unsigned char *dat; + png_info_t pi; + mlx_img_list_t *img; + + if ((err = mipng_magic(fptr, size))) + { + warnx("mlx PNG error : %s", mipng_err[err]); + return ((mlx_img_list_t *)0); + } + fptr += PNG_MAGIC_SIZE; + size -= PNG_MAGIC_SIZE; + if ((err = mipng_structure(fptr, size, &hdr, &dat))) + { + warnx("mlx PNG error : %s", mipng_err[err]); + return ((mlx_img_list_t *)0); + } + if ((err = mipng_verif_hdr(hdr, &pi))) + { + warnx("mlx PNG error : %s", mipng_err[err]); + return ((mlx_img_list_t *)0); + } + if (!(img = mlx_new_image(xvar, pi.width, pi.height))) + { + warnx("mlx PNG error : Can't create mlx image"); + return ((mlx_img_list_t *)0); + } + if ((err = mipng_data(img, dat, &pi))) + { + mlx_destroy_image(xvar, img); + warnx("mlx PNG error : %s", mipng_err[err]); + return ((mlx_img_list_t *)0); + } + return (img); +} + + + + +void *mlx_png_file_to_image(mlx_ptr_t *xvar, char *file, int *width, int *height) +{ + int fd; + int size; + unsigned char *ptr; + mlx_img_list_t *img; + + if ((fd = open(file, O_RDONLY)) == -1 || (size = lseek(fd, 0, SEEK_END)) == -1 || + (ptr = mmap(0, size, PROT_READ, MAP_PRIVATE, fd, 0)) == (void *)MAP_FAILED) + { + if (fd >= 0) + close(fd); + warnx("Can't map png file '%s'", file); + return ((void *)0); + } + if ((img = mlx_int_parse_png(xvar, ptr, size))) + { + *width = img->width; + *height = img->height; + } + else + { + *width = 0; + *height = 0; + } + munmap(ptr,size); + close(fd); + return (img); +} diff --git a/parse_map/mlx/mlx_png.h b/parse_map/mlx/mlx_png.h new file mode 100644 index 0000000..83ef145 --- /dev/null +++ b/parse_map/mlx/mlx_png.h @@ -0,0 +1,4 @@ + + + +void *mlx_png_file_to_image(void *xvar, char *file, int *width, int *height); diff --git a/parse_map/mlx/mlx_rgb.c b/parse_map/mlx/mlx_rgb.c new file mode 100644 index 0000000..3f98717 --- /dev/null +++ b/parse_map/mlx/mlx_rgb.c @@ -0,0 +1,763 @@ +/* +** This is a generated file with rgb2c.pl and rgb.txt from +** the XFree86 distribution. +*/ + + +struct s_col_name mlx_col_name[] = +{ + { "snow" , 0xfffafa }, + { "ghost white" , 0xf8f8ff }, + { "ghostwhite" , 0xf8f8ff }, + { "white smoke" , 0xf5f5f5 }, + { "whitesmoke" , 0xf5f5f5 }, + { "gainsboro" , 0xdcdcdc }, + { "floral white" , 0xfffaf0 }, + { "floralwhite" , 0xfffaf0 }, + { "old lace" , 0xfdf5e6 }, + { "oldlace" , 0xfdf5e6 }, + { "linen" , 0xfaf0e6 }, + { "antique white" , 0xfaebd7 }, + { "antiquewhite" , 0xfaebd7 }, + { "papaya whip" , 0xffefd5 }, + { "papayawhip" , 0xffefd5 }, + { "blanched almond" , 0xffebcd }, + { "blanchedalmond" , 0xffebcd }, + { "bisque" , 0xffe4c4 }, + { "peach puff" , 0xffdab9 }, + { "peachpuff" , 0xffdab9 }, + { "navajo white" , 0xffdead }, + { "navajowhite" , 0xffdead }, + { "moccasin" , 0xffe4b5 }, + { "cornsilk" , 0xfff8dc }, + { "ivory" , 0xfffff0 }, + { "lemon chiffon" , 0xfffacd }, + { "lemonchiffon" , 0xfffacd }, + { "seashell" , 0xfff5ee }, + { "honeydew" , 0xf0fff0 }, + { "mint cream" , 0xf5fffa }, + { "mintcream" , 0xf5fffa }, + { "azure" , 0xf0ffff }, + { "alice blue" , 0xf0f8ff }, + { "aliceblue" , 0xf0f8ff }, + { "lavender" , 0xe6e6fa }, + { "lavender blush" , 0xfff0f5 }, + { "lavenderblush" , 0xfff0f5 }, + { "misty rose" , 0xffe4e1 }, + { "mistyrose" , 0xffe4e1 }, + { "white" , 0xffffff }, + { "black" , 0x0 }, + { "dark slate" , 0x2f4f4f }, + { "darkslategray" , 0x2f4f4f }, + { "dark slate" , 0x2f4f4f }, + { "darkslategrey" , 0x2f4f4f }, + { "dim gray" , 0x696969 }, + { "dimgray" , 0x696969 }, + { "dim grey" , 0x696969 }, + { "dimgrey" , 0x696969 }, + { "slate gray" , 0x708090 }, + { "slategray" , 0x708090 }, + { "slate grey" , 0x708090 }, + { "slategrey" , 0x708090 }, + { "light slate" , 0x778899 }, + { "lightslategray" , 0x778899 }, + { "light slate" , 0x778899 }, + { "lightslategrey" , 0x778899 }, + { "gray" , 0xbebebe }, + { "grey" , 0xbebebe }, + { "light grey" , 0xd3d3d3 }, + { "lightgrey" , 0xd3d3d3 }, + { "light gray" , 0xd3d3d3 }, + { "lightgray" , 0xd3d3d3 }, + { "midnight blue" , 0x191970 }, + { "midnightblue" , 0x191970 }, + { "navy" , 0x80 }, + { "navy blue" , 0x80 }, + { "navyblue" , 0x80 }, + { "cornflower blue" , 0x6495ed }, + { "cornflowerblue" , 0x6495ed }, + { "dark slate" , 0x483d8b }, + { "darkslateblue" , 0x483d8b }, + { "slate blue" , 0x6a5acd }, + { "slateblue" , 0x6a5acd }, + { "medium slate" , 0x7b68ee }, + { "mediumslateblue" , 0x7b68ee }, + { "light slate" , 0x8470ff }, + { "lightslateblue" , 0x8470ff }, + { "medium blue" , 0xcd }, + { "mediumblue" , 0xcd }, + { "royal blue" , 0x4169e1 }, + { "royalblue" , 0x4169e1 }, + { "blue" , 0xff }, + { "dodger blue" , 0x1e90ff }, + { "dodgerblue" , 0x1e90ff }, + { "deep sky" , 0xbfff }, + { "deepskyblue" , 0xbfff }, + { "sky blue" , 0x87ceeb }, + { "skyblue" , 0x87ceeb }, + { "light sky" , 0x87cefa }, + { "lightskyblue" , 0x87cefa }, + { "steel blue" , 0x4682b4 }, + { "steelblue" , 0x4682b4 }, + { "light steel" , 0xb0c4de }, + { "lightsteelblue" , 0xb0c4de }, + { "light blue" , 0xadd8e6 }, + { "lightblue" , 0xadd8e6 }, + { "powder blue" , 0xb0e0e6 }, + { "powderblue" , 0xb0e0e6 }, + { "pale turquoise" , 0xafeeee }, + { "paleturquoise" , 0xafeeee }, + { "dark turquoise" , 0xced1 }, + { "darkturquoise" , 0xced1 }, + { "medium turquoise" , 0x48d1cc }, + { "mediumturquoise" , 0x48d1cc }, + { "turquoise" , 0x40e0d0 }, + { "cyan" , 0xffff }, + { "light cyan" , 0xe0ffff }, + { "lightcyan" , 0xe0ffff }, + { "cadet blue" , 0x5f9ea0 }, + { "cadetblue" , 0x5f9ea0 }, + { "medium aquamarine" , 0x66cdaa }, + { "mediumaquamarine" , 0x66cdaa }, + { "aquamarine" , 0x7fffd4 }, + { "dark green" , 0x6400 }, + { "darkgreen" , 0x6400 }, + { "dark olive" , 0x556b2f }, + { "darkolivegreen" , 0x556b2f }, + { "dark sea" , 0x8fbc8f }, + { "darkseagreen" , 0x8fbc8f }, + { "sea green" , 0x2e8b57 }, + { "seagreen" , 0x2e8b57 }, + { "medium sea" , 0x3cb371 }, + { "mediumseagreen" , 0x3cb371 }, + { "light sea" , 0x20b2aa }, + { "lightseagreen" , 0x20b2aa }, + { "pale green" , 0x98fb98 }, + { "palegreen" , 0x98fb98 }, + { "spring green" , 0xff7f }, + { "springgreen" , 0xff7f }, + { "lawn green" , 0x7cfc00 }, + { "lawngreen" , 0x7cfc00 }, + { "green" , 0xff00 }, + { "chartreuse" , 0x7fff00 }, + { "medium spring" , 0xfa9a }, + { "mediumspringgreen" , 0xfa9a }, + { "green yellow" , 0xadff2f }, + { "greenyellow" , 0xadff2f }, + { "lime green" , 0x32cd32 }, + { "limegreen" , 0x32cd32 }, + { "yellow green" , 0x9acd32 }, + { "yellowgreen" , 0x9acd32 }, + { "forest green" , 0x228b22 }, + { "forestgreen" , 0x228b22 }, + { "olive drab" , 0x6b8e23 }, + { "olivedrab" , 0x6b8e23 }, + { "dark khaki" , 0xbdb76b }, + { "darkkhaki" , 0xbdb76b }, + { "khaki" , 0xf0e68c }, + { "pale goldenrod" , 0xeee8aa }, + { "palegoldenrod" , 0xeee8aa }, + { "light goldenrod" , 0xfafad2 }, + { "lightgoldenrodyellow" , 0xfafad2 }, + { "light yellow" , 0xffffe0 }, + { "lightyellow" , 0xffffe0 }, + { "yellow" , 0xffff00 }, + { "gold" , 0xffd700 }, + { "light goldenrod" , 0xeedd82 }, + { "lightgoldenrod" , 0xeedd82 }, + { "goldenrod" , 0xdaa520 }, + { "dark goldenrod" , 0xb8860b }, + { "darkgoldenrod" , 0xb8860b }, + { "rosy brown" , 0xbc8f8f }, + { "rosybrown" , 0xbc8f8f }, + { "indian red" , 0xcd5c5c }, + { "indianred" , 0xcd5c5c }, + { "saddle brown" , 0x8b4513 }, + { "saddlebrown" , 0x8b4513 }, + { "sienna" , 0xa0522d }, + { "peru" , 0xcd853f }, + { "burlywood" , 0xdeb887 }, + { "beige" , 0xf5f5dc }, + { "wheat" , 0xf5deb3 }, + { "sandy brown" , 0xf4a460 }, + { "sandybrown" , 0xf4a460 }, + { "tan" , 0xd2b48c }, + { "chocolate" , 0xd2691e }, + { "firebrick" , 0xb22222 }, + { "brown" , 0xa52a2a }, + { "dark salmon" , 0xe9967a }, + { "darksalmon" , 0xe9967a }, + { "salmon" , 0xfa8072 }, + { "light salmon" , 0xffa07a }, + { "lightsalmon" , 0xffa07a }, + { "orange" , 0xffa500 }, + { "dark orange" , 0xff8c00 }, + { "darkorange" , 0xff8c00 }, + { "coral" , 0xff7f50 }, + { "light coral" , 0xf08080 }, + { "lightcoral" , 0xf08080 }, + { "tomato" , 0xff6347 }, + { "orange red" , 0xff4500 }, + { "orangered" , 0xff4500 }, + { "red" , 0xff0000 }, + { "hot pink" , 0xff69b4 }, + { "hotpink" , 0xff69b4 }, + { "deep pink" , 0xff1493 }, + { "deeppink" , 0xff1493 }, + { "pink" , 0xffc0cb }, + { "light pink" , 0xffb6c1 }, + { "lightpink" , 0xffb6c1 }, + { "pale violet" , 0xdb7093 }, + { "palevioletred" , 0xdb7093 }, + { "maroon" , 0xb03060 }, + { "medium violet" , 0xc71585 }, + { "mediumvioletred" , 0xc71585 }, + { "violet red" , 0xd02090 }, + { "violetred" , 0xd02090 }, + { "magenta" , 0xff00ff }, + { "violet" , 0xee82ee }, + { "plum" , 0xdda0dd }, + { "orchid" , 0xda70d6 }, + { "medium orchid" , 0xba55d3 }, + { "mediumorchid" , 0xba55d3 }, + { "dark orchid" , 0x9932cc }, + { "darkorchid" , 0x9932cc }, + { "dark violet" , 0x9400d3 }, + { "darkviolet" , 0x9400d3 }, + { "blue violet" , 0x8a2be2 }, + { "blueviolet" , 0x8a2be2 }, + { "purple" , 0xa020f0 }, + { "medium purple" , 0x9370db }, + { "mediumpurple" , 0x9370db }, + { "thistle" , 0xd8bfd8 }, + { "snow1" , 0xfffafa }, + { "snow2" , 0xeee9e9 }, + { "snow3" , 0xcdc9c9 }, + { "snow4" , 0x8b8989 }, + { "seashell1" , 0xfff5ee }, + { "seashell2" , 0xeee5de }, + { "seashell3" , 0xcdc5bf }, + { "seashell4" , 0x8b8682 }, + { "antiquewhite1" , 0xffefdb }, + { "antiquewhite2" , 0xeedfcc }, + { "antiquewhite3" , 0xcdc0b0 }, + { "antiquewhite4" , 0x8b8378 }, + { "bisque1" , 0xffe4c4 }, + { "bisque2" , 0xeed5b7 }, + { "bisque3" , 0xcdb79e }, + { "bisque4" , 0x8b7d6b }, + { "peachpuff1" , 0xffdab9 }, + { "peachpuff2" , 0xeecbad }, + { "peachpuff3" , 0xcdaf95 }, + { "peachpuff4" , 0x8b7765 }, + { "navajowhite1" , 0xffdead }, + { "navajowhite2" , 0xeecfa1 }, + { "navajowhite3" , 0xcdb38b }, + { "navajowhite4" , 0x8b795e }, + { "lemonchiffon1" , 0xfffacd }, + { "lemonchiffon2" , 0xeee9bf }, + { "lemonchiffon3" , 0xcdc9a5 }, + { "lemonchiffon4" , 0x8b8970 }, + { "cornsilk1" , 0xfff8dc }, + { "cornsilk2" , 0xeee8cd }, + { "cornsilk3" , 0xcdc8b1 }, + { "cornsilk4" , 0x8b8878 }, + { "ivory1" , 0xfffff0 }, + { "ivory2" , 0xeeeee0 }, + { "ivory3" , 0xcdcdc1 }, + { "ivory4" , 0x8b8b83 }, + { "honeydew1" , 0xf0fff0 }, + { "honeydew2" , 0xe0eee0 }, + { "honeydew3" , 0xc1cdc1 }, + { "honeydew4" , 0x838b83 }, + { "lavenderblush1" , 0xfff0f5 }, + { "lavenderblush2" , 0xeee0e5 }, + { "lavenderblush3" , 0xcdc1c5 }, + { "lavenderblush4" , 0x8b8386 }, + { "mistyrose1" , 0xffe4e1 }, + { "mistyrose2" , 0xeed5d2 }, + { "mistyrose3" , 0xcdb7b5 }, + { "mistyrose4" , 0x8b7d7b }, + { "azure1" , 0xf0ffff }, + { "azure2" , 0xe0eeee }, + { "azure3" , 0xc1cdcd }, + { "azure4" , 0x838b8b }, + { "slateblue1" , 0x836fff }, + { "slateblue2" , 0x7a67ee }, + { "slateblue3" , 0x6959cd }, + { "slateblue4" , 0x473c8b }, + { "royalblue1" , 0x4876ff }, + { "royalblue2" , 0x436eee }, + { "royalblue3" , 0x3a5fcd }, + { "royalblue4" , 0x27408b }, + { "blue1" , 0xff }, + { "blue2" , 0xee }, + { "blue3" , 0xcd }, + { "blue4" , 0x8b }, + { "dodgerblue1" , 0x1e90ff }, + { "dodgerblue2" , 0x1c86ee }, + { "dodgerblue3" , 0x1874cd }, + { "dodgerblue4" , 0x104e8b }, + { "steelblue1" , 0x63b8ff }, + { "steelblue2" , 0x5cacee }, + { "steelblue3" , 0x4f94cd }, + { "steelblue4" , 0x36648b }, + { "deepskyblue1" , 0xbfff }, + { "deepskyblue2" , 0xb2ee }, + { "deepskyblue3" , 0x9acd }, + { "deepskyblue4" , 0x688b }, + { "skyblue1" , 0x87ceff }, + { "skyblue2" , 0x7ec0ee }, + { "skyblue3" , 0x6ca6cd }, + { "skyblue4" , 0x4a708b }, + { "lightskyblue1" , 0xb0e2ff }, + { "lightskyblue2" , 0xa4d3ee }, + { "lightskyblue3" , 0x8db6cd }, + { "lightskyblue4" , 0x607b8b }, + { "slategray1" , 0xc6e2ff }, + { "slategray2" , 0xb9d3ee }, + { "slategray3" , 0x9fb6cd }, + { "slategray4" , 0x6c7b8b }, + { "lightsteelblue1" , 0xcae1ff }, + { "lightsteelblue2" , 0xbcd2ee }, + { "lightsteelblue3" , 0xa2b5cd }, + { "lightsteelblue4" , 0x6e7b8b }, + { "lightblue1" , 0xbfefff }, + { "lightblue2" , 0xb2dfee }, + { "lightblue3" , 0x9ac0cd }, + { "lightblue4" , 0x68838b }, + { "lightcyan1" , 0xe0ffff }, + { "lightcyan2" , 0xd1eeee }, + { "lightcyan3" , 0xb4cdcd }, + { "lightcyan4" , 0x7a8b8b }, + { "paleturquoise1" , 0xbbffff }, + { "paleturquoise2" , 0xaeeeee }, + { "paleturquoise3" , 0x96cdcd }, + { "paleturquoise4" , 0x668b8b }, + { "cadetblue1" , 0x98f5ff }, + { "cadetblue2" , 0x8ee5ee }, + { "cadetblue3" , 0x7ac5cd }, + { "cadetblue4" , 0x53868b }, + { "turquoise1" , 0xf5ff }, + { "turquoise2" , 0xe5ee }, + { "turquoise3" , 0xc5cd }, + { "turquoise4" , 0x868b }, + { "cyan1" , 0xffff }, + { "cyan2" , 0xeeee }, + { "cyan3" , 0xcdcd }, + { "cyan4" , 0x8b8b }, + { "darkslategray1" , 0x97ffff }, + { "darkslategray2" , 0x8deeee }, + { "darkslategray3" , 0x79cdcd }, + { "darkslategray4" , 0x528b8b }, + { "aquamarine1" , 0x7fffd4 }, + { "aquamarine2" , 0x76eec6 }, + { "aquamarine3" , 0x66cdaa }, + { "aquamarine4" , 0x458b74 }, + { "darkseagreen1" , 0xc1ffc1 }, + { "darkseagreen2" , 0xb4eeb4 }, + { "darkseagreen3" , 0x9bcd9b }, + { "darkseagreen4" , 0x698b69 }, + { "seagreen1" , 0x54ff9f }, + { "seagreen2" , 0x4eee94 }, + { "seagreen3" , 0x43cd80 }, + { "seagreen4" , 0x2e8b57 }, + { "palegreen1" , 0x9aff9a }, + { "palegreen2" , 0x90ee90 }, + { "palegreen3" , 0x7ccd7c }, + { "palegreen4" , 0x548b54 }, + { "springgreen1" , 0xff7f }, + { "springgreen2" , 0xee76 }, + { "springgreen3" , 0xcd66 }, + { "springgreen4" , 0x8b45 }, + { "green1" , 0xff00 }, + { "green2" , 0xee00 }, + { "green3" , 0xcd00 }, + { "green4" , 0x8b00 }, + { "chartreuse1" , 0x7fff00 }, + { "chartreuse2" , 0x76ee00 }, + { "chartreuse3" , 0x66cd00 }, + { "chartreuse4" , 0x458b00 }, + { "olivedrab1" , 0xc0ff3e }, + { "olivedrab2" , 0xb3ee3a }, + { "olivedrab3" , 0x9acd32 }, + { "olivedrab4" , 0x698b22 }, + { "darkolivegreen1" , 0xcaff70 }, + { "darkolivegreen2" , 0xbcee68 }, + { "darkolivegreen3" , 0xa2cd5a }, + { "darkolivegreen4" , 0x6e8b3d }, + { "khaki1" , 0xfff68f }, + { "khaki2" , 0xeee685 }, + { "khaki3" , 0xcdc673 }, + { "khaki4" , 0x8b864e }, + { "lightgoldenrod1" , 0xffec8b }, + { "lightgoldenrod2" , 0xeedc82 }, + { "lightgoldenrod3" , 0xcdbe70 }, + { "lightgoldenrod4" , 0x8b814c }, + { "lightyellow1" , 0xffffe0 }, + { "lightyellow2" , 0xeeeed1 }, + { "lightyellow3" , 0xcdcdb4 }, + { "lightyellow4" , 0x8b8b7a }, + { "yellow1" , 0xffff00 }, + { "yellow2" , 0xeeee00 }, + { "yellow3" , 0xcdcd00 }, + { "yellow4" , 0x8b8b00 }, + { "gold1" , 0xffd700 }, + { "gold2" , 0xeec900 }, + { "gold3" , 0xcdad00 }, + { "gold4" , 0x8b7500 }, + { "goldenrod1" , 0xffc125 }, + { "goldenrod2" , 0xeeb422 }, + { "goldenrod3" , 0xcd9b1d }, + { "goldenrod4" , 0x8b6914 }, + { "darkgoldenrod1" , 0xffb90f }, + { "darkgoldenrod2" , 0xeead0e }, + { "darkgoldenrod3" , 0xcd950c }, + { "darkgoldenrod4" , 0x8b6508 }, + { "rosybrown1" , 0xffc1c1 }, + { "rosybrown2" , 0xeeb4b4 }, + { "rosybrown3" , 0xcd9b9b }, + { "rosybrown4" , 0x8b6969 }, + { "indianred1" , 0xff6a6a }, + { "indianred2" , 0xee6363 }, + { "indianred3" , 0xcd5555 }, + { "indianred4" , 0x8b3a3a }, + { "sienna1" , 0xff8247 }, + { "sienna2" , 0xee7942 }, + { "sienna3" , 0xcd6839 }, + { "sienna4" , 0x8b4726 }, + { "burlywood1" , 0xffd39b }, + { "burlywood2" , 0xeec591 }, + { "burlywood3" , 0xcdaa7d }, + { "burlywood4" , 0x8b7355 }, + { "wheat1" , 0xffe7ba }, + { "wheat2" , 0xeed8ae }, + { "wheat3" , 0xcdba96 }, + { "wheat4" , 0x8b7e66 }, + { "tan1" , 0xffa54f }, + { "tan2" , 0xee9a49 }, + { "tan3" , 0xcd853f }, + { "tan4" , 0x8b5a2b }, + { "chocolate1" , 0xff7f24 }, + { "chocolate2" , 0xee7621 }, + { "chocolate3" , 0xcd661d }, + { "chocolate4" , 0x8b4513 }, + { "firebrick1" , 0xff3030 }, + { "firebrick2" , 0xee2c2c }, + { "firebrick3" , 0xcd2626 }, + { "firebrick4" , 0x8b1a1a }, + { "brown1" , 0xff4040 }, + { "brown2" , 0xee3b3b }, + { "brown3" , 0xcd3333 }, + { "brown4" , 0x8b2323 }, + { "salmon1" , 0xff8c69 }, + { "salmon2" , 0xee8262 }, + { "salmon3" , 0xcd7054 }, + { "salmon4" , 0x8b4c39 }, + { "lightsalmon1" , 0xffa07a }, + { "lightsalmon2" , 0xee9572 }, + { "lightsalmon3" , 0xcd8162 }, + { "lightsalmon4" , 0x8b5742 }, + { "orange1" , 0xffa500 }, + { "orange2" , 0xee9a00 }, + { "orange3" , 0xcd8500 }, + { "orange4" , 0x8b5a00 }, + { "darkorange1" , 0xff7f00 }, + { "darkorange2" , 0xee7600 }, + { "darkorange3" , 0xcd6600 }, + { "darkorange4" , 0x8b4500 }, + { "coral1" , 0xff7256 }, + { "coral2" , 0xee6a50 }, + { "coral3" , 0xcd5b45 }, + { "coral4" , 0x8b3e2f }, + { "tomato1" , 0xff6347 }, + { "tomato2" , 0xee5c42 }, + { "tomato3" , 0xcd4f39 }, + { "tomato4" , 0x8b3626 }, + { "orangered1" , 0xff4500 }, + { "orangered2" , 0xee4000 }, + { "orangered3" , 0xcd3700 }, + { "orangered4" , 0x8b2500 }, + { "red1" , 0xff0000 }, + { "red2" , 0xee0000 }, + { "red3" , 0xcd0000 }, + { "red4" , 0x8b0000 }, + { "deeppink1" , 0xff1493 }, + { "deeppink2" , 0xee1289 }, + { "deeppink3" , 0xcd1076 }, + { "deeppink4" , 0x8b0a50 }, + { "hotpink1" , 0xff6eb4 }, + { "hotpink2" , 0xee6aa7 }, + { "hotpink3" , 0xcd6090 }, + { "hotpink4" , 0x8b3a62 }, + { "pink1" , 0xffb5c5 }, + { "pink2" , 0xeea9b8 }, + { "pink3" , 0xcd919e }, + { "pink4" , 0x8b636c }, + { "lightpink1" , 0xffaeb9 }, + { "lightpink2" , 0xeea2ad }, + { "lightpink3" , 0xcd8c95 }, + { "lightpink4" , 0x8b5f65 }, + { "palevioletred1" , 0xff82ab }, + { "palevioletred2" , 0xee799f }, + { "palevioletred3" , 0xcd6889 }, + { "palevioletred4" , 0x8b475d }, + { "maroon1" , 0xff34b3 }, + { "maroon2" , 0xee30a7 }, + { "maroon3" , 0xcd2990 }, + { "maroon4" , 0x8b1c62 }, + { "violetred1" , 0xff3e96 }, + { "violetred2" , 0xee3a8c }, + { "violetred3" , 0xcd3278 }, + { "violetred4" , 0x8b2252 }, + { "magenta1" , 0xff00ff }, + { "magenta2" , 0xee00ee }, + { "magenta3" , 0xcd00cd }, + { "magenta4" , 0x8b008b }, + { "orchid1" , 0xff83fa }, + { "orchid2" , 0xee7ae9 }, + { "orchid3" , 0xcd69c9 }, + { "orchid4" , 0x8b4789 }, + { "plum1" , 0xffbbff }, + { "plum2" , 0xeeaeee }, + { "plum3" , 0xcd96cd }, + { "plum4" , 0x8b668b }, + { "mediumorchid1" , 0xe066ff }, + { "mediumorchid2" , 0xd15fee }, + { "mediumorchid3" , 0xb452cd }, + { "mediumorchid4" , 0x7a378b }, + { "darkorchid1" , 0xbf3eff }, + { "darkorchid2" , 0xb23aee }, + { "darkorchid3" , 0x9a32cd }, + { "darkorchid4" , 0x68228b }, + { "purple1" , 0x9b30ff }, + { "purple2" , 0x912cee }, + { "purple3" , 0x7d26cd }, + { "purple4" , 0x551a8b }, + { "mediumpurple1" , 0xab82ff }, + { "mediumpurple2" , 0x9f79ee }, + { "mediumpurple3" , 0x8968cd }, + { "mediumpurple4" , 0x5d478b }, + { "thistle1" , 0xffe1ff }, + { "thistle2" , 0xeed2ee }, + { "thistle3" , 0xcdb5cd }, + { "thistle4" , 0x8b7b8b }, + { "gray0" , 0x0 }, + { "grey0" , 0x0 }, + { "gray1" , 0x30303 }, + { "grey1" , 0x30303 }, + { "gray2" , 0x50505 }, + { "grey2" , 0x50505 }, + { "gray3" , 0x80808 }, + { "grey3" , 0x80808 }, + { "gray4" , 0xa0a0a }, + { "grey4" , 0xa0a0a }, + { "gray5" , 0xd0d0d }, + { "grey5" , 0xd0d0d }, + { "gray6" , 0xf0f0f }, + { "grey6" , 0xf0f0f }, + { "gray7" , 0x121212 }, + { "grey7" , 0x121212 }, + { "gray8" , 0x141414 }, + { "grey8" , 0x141414 }, + { "gray9" , 0x171717 }, + { "grey9" , 0x171717 }, + { "gray10" , 0x1a1a1a }, + { "grey10" , 0x1a1a1a }, + { "gray11" , 0x1c1c1c }, + { "grey11" , 0x1c1c1c }, + { "gray12" , 0x1f1f1f }, + { "grey12" , 0x1f1f1f }, + { "gray13" , 0x212121 }, + { "grey13" , 0x212121 }, + { "gray14" , 0x242424 }, + { "grey14" , 0x242424 }, + { "gray15" , 0x262626 }, + { "grey15" , 0x262626 }, + { "gray16" , 0x292929 }, + { "grey16" , 0x292929 }, + { "gray17" , 0x2b2b2b }, + { "grey17" , 0x2b2b2b }, + { "gray18" , 0x2e2e2e }, + { "grey18" , 0x2e2e2e }, + { "gray19" , 0x303030 }, + { "grey19" , 0x303030 }, + { "gray20" , 0x333333 }, + { "grey20" , 0x333333 }, + { "gray21" , 0x363636 }, + { "grey21" , 0x363636 }, + { "gray22" , 0x383838 }, + { "grey22" , 0x383838 }, + { "gray23" , 0x3b3b3b }, + { "grey23" , 0x3b3b3b }, + { "gray24" , 0x3d3d3d }, + { "grey24" , 0x3d3d3d }, + { "gray25" , 0x404040 }, + { "grey25" , 0x404040 }, + { "gray26" , 0x424242 }, + { "grey26" , 0x424242 }, + { "gray27" , 0x454545 }, + { "grey27" , 0x454545 }, + { "gray28" , 0x474747 }, + { "grey28" , 0x474747 }, + { "gray29" , 0x4a4a4a }, + { "grey29" , 0x4a4a4a }, + { "gray30" , 0x4d4d4d }, + { "grey30" , 0x4d4d4d }, + { "gray31" , 0x4f4f4f }, + { "grey31" , 0x4f4f4f }, + { "gray32" , 0x525252 }, + { "grey32" , 0x525252 }, + { "gray33" , 0x545454 }, + { "grey33" , 0x545454 }, + { "gray34" , 0x575757 }, + { "grey34" , 0x575757 }, + { "gray35" , 0x595959 }, + { "grey35" , 0x595959 }, + { "gray36" , 0x5c5c5c }, + { "grey36" , 0x5c5c5c }, + { "gray37" , 0x5e5e5e }, + { "grey37" , 0x5e5e5e }, + { "gray38" , 0x616161 }, + { "grey38" , 0x616161 }, + { "gray39" , 0x636363 }, + { "grey39" , 0x636363 }, + { "gray40" , 0x666666 }, + { "grey40" , 0x666666 }, + { "gray41" , 0x696969 }, + { "grey41" , 0x696969 }, + { "gray42" , 0x6b6b6b }, + { "grey42" , 0x6b6b6b }, + { "gray43" , 0x6e6e6e }, + { "grey43" , 0x6e6e6e }, + { "gray44" , 0x707070 }, + { "grey44" , 0x707070 }, + { "gray45" , 0x737373 }, + { "grey45" , 0x737373 }, + { "gray46" , 0x757575 }, + { "grey46" , 0x757575 }, + { "gray47" , 0x787878 }, + { "grey47" , 0x787878 }, + { "gray48" , 0x7a7a7a }, + { "grey48" , 0x7a7a7a }, + { "gray49" , 0x7d7d7d }, + { "grey49" , 0x7d7d7d }, + { "gray50" , 0x7f7f7f }, + { "grey50" , 0x7f7f7f }, + { "gray51" , 0x828282 }, + { "grey51" , 0x828282 }, + { "gray52" , 0x858585 }, + { "grey52" , 0x858585 }, + { "gray53" , 0x878787 }, + { "grey53" , 0x878787 }, + { "gray54" , 0x8a8a8a }, + { "grey54" , 0x8a8a8a }, + { "gray55" , 0x8c8c8c }, + { "grey55" , 0x8c8c8c }, + { "gray56" , 0x8f8f8f }, + { "grey56" , 0x8f8f8f }, + { "gray57" , 0x919191 }, + { "grey57" , 0x919191 }, + { "gray58" , 0x949494 }, + { "grey58" , 0x949494 }, + { "gray59" , 0x969696 }, + { "grey59" , 0x969696 }, + { "gray60" , 0x999999 }, + { "grey60" , 0x999999 }, + { "gray61" , 0x9c9c9c }, + { "grey61" , 0x9c9c9c }, + { "gray62" , 0x9e9e9e }, + { "grey62" , 0x9e9e9e }, + { "gray63" , 0xa1a1a1 }, + { "grey63" , 0xa1a1a1 }, + { "gray64" , 0xa3a3a3 }, + { "grey64" , 0xa3a3a3 }, + { "gray65" , 0xa6a6a6 }, + { "grey65" , 0xa6a6a6 }, + { "gray66" , 0xa8a8a8 }, + { "grey66" , 0xa8a8a8 }, + { "gray67" , 0xababab }, + { "grey67" , 0xababab }, + { "gray68" , 0xadadad }, + { "grey68" , 0xadadad }, + { "gray69" , 0xb0b0b0 }, + { "grey69" , 0xb0b0b0 }, + { "gray70" , 0xb3b3b3 }, + { "grey70" , 0xb3b3b3 }, + { "gray71" , 0xb5b5b5 }, + { "grey71" , 0xb5b5b5 }, + { "gray72" , 0xb8b8b8 }, + { "grey72" , 0xb8b8b8 }, + { "gray73" , 0xbababa }, + { "grey73" , 0xbababa }, + { "gray74" , 0xbdbdbd }, + { "grey74" , 0xbdbdbd }, + { "gray75" , 0xbfbfbf }, + { "grey75" , 0xbfbfbf }, + { "gray76" , 0xc2c2c2 }, + { "grey76" , 0xc2c2c2 }, + { "gray77" , 0xc4c4c4 }, + { "grey77" , 0xc4c4c4 }, + { "gray78" , 0xc7c7c7 }, + { "grey78" , 0xc7c7c7 }, + { "gray79" , 0xc9c9c9 }, + { "grey79" , 0xc9c9c9 }, + { "gray80" , 0xcccccc }, + { "grey80" , 0xcccccc }, + { "gray81" , 0xcfcfcf }, + { "grey81" , 0xcfcfcf }, + { "gray82" , 0xd1d1d1 }, + { "grey82" , 0xd1d1d1 }, + { "gray83" , 0xd4d4d4 }, + { "grey83" , 0xd4d4d4 }, + { "gray84" , 0xd6d6d6 }, + { "grey84" , 0xd6d6d6 }, + { "gray85" , 0xd9d9d9 }, + { "grey85" , 0xd9d9d9 }, + { "gray86" , 0xdbdbdb }, + { "grey86" , 0xdbdbdb }, + { "gray87" , 0xdedede }, + { "grey87" , 0xdedede }, + { "gray88" , 0xe0e0e0 }, + { "grey88" , 0xe0e0e0 }, + { "gray89" , 0xe3e3e3 }, + { "grey89" , 0xe3e3e3 }, + { "gray90" , 0xe5e5e5 }, + { "grey90" , 0xe5e5e5 }, + { "gray91" , 0xe8e8e8 }, + { "grey91" , 0xe8e8e8 }, + { "gray92" , 0xebebeb }, + { "grey92" , 0xebebeb }, + { "gray93" , 0xededed }, + { "grey93" , 0xededed }, + { "gray94" , 0xf0f0f0 }, + { "grey94" , 0xf0f0f0 }, + { "gray95" , 0xf2f2f2 }, + { "grey95" , 0xf2f2f2 }, + { "gray96" , 0xf5f5f5 }, + { "grey96" , 0xf5f5f5 }, + { "gray97" , 0xf7f7f7 }, + { "grey97" , 0xf7f7f7 }, + { "gray98" , 0xfafafa }, + { "grey98" , 0xfafafa }, + { "gray99" , 0xfcfcfc }, + { "grey99" , 0xfcfcfc }, + { "gray100" , 0xffffff }, + { "grey100" , 0xffffff }, + { "dark grey" , 0xa9a9a9 }, + { "darkgrey" , 0xa9a9a9 }, + { "dark gray" , 0xa9a9a9 }, + { "darkgray" , 0xa9a9a9 }, + { "dark blue" , 0x8b }, + { "darkblue" , 0x8b }, + { "dark cyan" , 0x8b8b }, + { "darkcyan" , 0x8b8b }, + { "dark magenta" , 0x8b008b }, + { "darkmagenta" , 0x8b008b }, + { "dark red" , 0x8b0000 }, + { "darkred" , 0x8b0000 }, + { "light green" , 0x90ee90 }, + { "lightgreen" , 0x90ee90 }, + { "none", -1 }, + { 0, 0 } +}; diff --git a/parse_map/mlx/mlx_shaders.c b/parse_map/mlx/mlx_shaders.c new file mode 100644 index 0000000..4a58955 --- /dev/null +++ b/parse_map/mlx/mlx_shaders.c @@ -0,0 +1,240 @@ +// mlx_shaders.c + +#include +#include +#include +#include +#include "mlx_int.h" + + +void display_log(GLuint object, void (*param_func)(), void (*getlog_func)()) +{ + GLint log_length; + char *log; + + param_func(object, GL_INFO_LOG_LENGTH, &log_length); + log = malloc(log_length); + getlog_func(object, log_length, NULL, log); + fprintf(stderr, "%s", log); + free(log); +} + + +int mlx_shaders_pixel(glsl_info_t *glsl) +{ + char *source; + int length; + GLint action_ok; + + glsl->pixel_vshader = glCreateShader(GL_VERTEX_SHADER); + source = strdup("#version 110 \n" + "attribute vec2 position;" + "varying vec2 texcoord;" + "void main()" + "{" + " gl_Position = vec4( position, 0.0, 1.0);" + " texcoord = vec2(position[0]+1.0, 1.0 - position[1]) / 2.0;" + "}"); + length = strlen(source); + glShaderSource(glsl->pixel_vshader, 1, (const GLchar**)&source, &length); + glCompileShader(glsl->pixel_vshader); + free(source); + + glGetShaderiv(glsl->pixel_vshader, GL_COMPILE_STATUS, &action_ok); + if (!action_ok) { + fprintf(stderr, "Failed to compile pixel vshader :\n"); + display_log(glsl->pixel_vshader, glGetShaderiv, glGetShaderInfoLog); + return (1); + } + + glsl->pixel_fshader = glCreateShader(GL_FRAGMENT_SHADER); + source = strdup("#version 110 \n" + "uniform sampler2D texture;" + "varying vec2 texcoord;" + "void main()" + "{" + " gl_FragColor = texture2D(texture, texcoord);" + "}"); + length = strlen(source); + glShaderSource(glsl->pixel_fshader, 1, (const GLchar**)&source, &length); + glCompileShader(glsl->pixel_fshader); + free(source); + + glGetShaderiv(glsl->pixel_fshader, GL_COMPILE_STATUS, &action_ok); + if (!action_ok) { + fprintf(stderr, "Failed to compile pixel fshader :\n"); + display_log(glsl->pixel_fshader, glGetShaderiv, glGetShaderInfoLog); + return (1); + } + + glsl->pixel_program = glCreateProgram(); + glAttachShader(glsl->pixel_program, glsl->pixel_vshader); + glAttachShader(glsl->pixel_program, glsl->pixel_fshader); + glLinkProgram(glsl->pixel_program); + + glGetProgramiv(glsl->pixel_program, GL_LINK_STATUS, &action_ok); + if (!action_ok) { + fprintf(stderr, "Failed to link pixel shader program:\n"); + display_log(glsl->pixel_program, glGetProgramiv, glGetProgramInfoLog); + return (1); + } + + glFlush(); + + return (0); +} + + +int mlx_shaders_image(glsl_info_t *glsl) +{ + char *source; + int length; + GLint action_ok; + + glsl->image_vshader = glCreateShader(GL_VERTEX_SHADER); + source = strdup("#version 110 \n" + "attribute vec2 position;" + "uniform vec2 winhalfsize;" + "uniform vec2 imagepos;" + "uniform vec2 imagesize;" + "varying vec2 texcoord;" + "void main()" + "{" + " texcoord = position / imagesize;" + " vec2 pos = position - winhalfsize + imagepos;" + " pos = pos / winhalfsize;" + " gl_Position = vec4( pos, 0.0, 1.0);" + "}"); + length = strlen(source); + glShaderSource(glsl->image_vshader, 1, (const GLchar**)&source, &length); + glCompileShader(glsl->image_vshader); + free(source); + + glGetShaderiv(glsl->image_vshader, GL_COMPILE_STATUS, &action_ok); + if (!action_ok) { + fprintf(stderr, "Failed to compile image vshader :\n"); + display_log(glsl->image_vshader, glGetShaderiv, glGetShaderInfoLog); + return (1); + } + + glsl->image_fshader = glCreateShader(GL_FRAGMENT_SHADER); + source = strdup("#version 110 \n" + "uniform sampler2D texture;" + "varying vec2 texcoord;" + "void main()" + "{" + " gl_FragColor = texture2D(texture, texcoord);" + "}"); + length = strlen(source); + glShaderSource(glsl->image_fshader, 1, (const GLchar**)&source, &length); + glCompileShader(glsl->image_fshader); + free(source); + + glGetShaderiv(glsl->image_fshader, GL_COMPILE_STATUS, &action_ok); + if (!action_ok) { + fprintf(stderr, "Failed to compile image fshader :\n"); + display_log(glsl->image_fshader, glGetShaderiv, glGetShaderInfoLog); + return (1); + } + + glsl->image_program = glCreateProgram(); + glAttachShader(glsl->image_program, glsl->image_vshader); + glAttachShader(glsl->image_program, glsl->image_fshader); + glLinkProgram(glsl->image_program); + + glGetProgramiv(glsl->image_program, GL_LINK_STATUS, &action_ok); + if (!action_ok) { + fprintf(stderr, "Failed to link image shader program:\n"); + display_log(glsl->image_program, glGetProgramiv, glGetProgramInfoLog); + return (1); + } + + glFlush(); + + return (0); +} + + + + +int mlx_shaders_font(glsl_info_t *glsl) +{ + char *source; + int length; + GLint action_ok; + + glsl->font_vshader = glCreateShader(GL_VERTEX_SHADER); + source = strdup("#version 110 \n" + "attribute vec2 position;" + "uniform vec2 winhalfsize;" + "uniform vec2 fontposinwin;" + "uniform vec2 fontposinatlas;" + "uniform vec2 fontatlassize;" + "varying vec2 texcoord;" + "void main()" + "{" +#ifdef STRINGPUTX11 + " texcoord = (position * vec2(1.4, -1.4) + fontposinatlas ) / fontatlassize;" +#else + " texcoord = (position * vec2(1.0, -1.0) + fontposinatlas ) / fontatlassize;" +#endif + " vec2 pos = position - winhalfsize + fontposinwin;" + " pos = pos / winhalfsize;" + " gl_Position = vec4( pos, 0.0, 1.0);" + "}"); + length = strlen(source); + glShaderSource(glsl->font_vshader, 1, (const GLchar**)&source, &length); + glCompileShader(glsl->font_vshader); + free(source); + + glGetShaderiv(glsl->font_vshader, GL_COMPILE_STATUS, &action_ok); + if (!action_ok) { + fprintf(stderr, "Failed to compile font vshader :\n"); + display_log(glsl->font_vshader, glGetShaderiv, glGetShaderInfoLog); + return (1); + } + + glsl->font_fshader = glCreateShader(GL_FRAGMENT_SHADER); + source = strdup("#version 110 \n" + "uniform sampler2D texture;" + "uniform vec4 color;" + "varying vec2 texcoord;" + "void main()" + "{" + " gl_FragColor = color * texture2D(texture, texcoord);" + "}"); + length = strlen(source); + glShaderSource(glsl->font_fshader, 1, (const GLchar**)&source, &length); + glCompileShader(glsl->font_fshader); + free(source); + + glGetShaderiv(glsl->font_fshader, GL_COMPILE_STATUS, &action_ok); + if (!action_ok) { + fprintf(stderr, "Failed to compile font fshader :\n"); + display_log(glsl->font_fshader, glGetShaderiv, glGetShaderInfoLog); + return (1); + } + + glsl->font_program = glCreateProgram(); + glAttachShader(glsl->font_program, glsl->font_vshader); + glAttachShader(glsl->font_program, glsl->font_fshader); + glLinkProgram(glsl->font_program); + + glGetProgramiv(glsl->font_program, GL_LINK_STATUS, &action_ok); + if (!action_ok) { + fprintf(stderr, "Failed to link font shader program:\n"); + display_log(glsl->font_program, glGetProgramiv, glGetProgramInfoLog); + return (1); + } + + glFlush(); + + return (0); +} + + + +int mlx_shaders(glsl_info_t *glsl) +{ + return (mlx_shaders_pixel(glsl) + mlx_shaders_image(glsl) + mlx_shaders_font(glsl)); +} diff --git a/parse_map/mlx/mlx_xpm.c b/parse_map/mlx/mlx_xpm.c new file mode 100644 index 0000000..78d8c9b --- /dev/null +++ b/parse_map/mlx/mlx_xpm.c @@ -0,0 +1,338 @@ +// mlx xpm +// by ol + +#include +#include +#include +#include +#include +#include +#include +#include "mlx_int.h" + +typedef struct s_xpm_col +{ + int name; + int col; +} t_xpm_col; + + +struct s_col_name +{ + char *name; + int color; +}; + +//extern struct s_col_name mlx_col_name[]; +#include "mlx_rgb.c" + + +#define RETURN { if (colors) free(colors); if (tab) free(tab); \ + if (colors_direct) free(colors_direct); \ + if (img) mlx_destroy_image(xvar, img); \ + return ((void *)0); } + + + + +char *mlx_int_get_line(char *ptr,int *pos,int size) +{ + int pos2; + int pos3; + int pos4; + + if ((pos2 = mlx_int_str_str(ptr+*pos,"\"",size-*pos))==-1) + return ((char *)0); + if ((pos3 = mlx_int_str_str(ptr+*pos+pos2+1,"\"",size-*pos-pos2-1))==-1) + return ((char *)0); + *(ptr+*pos+pos2) = 0; + *(ptr+*pos+pos2+1+pos3) = 0; + pos4 = *pos+pos2+1; + *pos += pos2+pos3+2; + return (ptr+pos4); +} + + + +char *mlx_int_static_line(char **xpm_data,int *pos,int size) +{ + static char *copy = 0; + static int len = 0; + int len2; + char *str; + + str = xpm_data[(*pos)++]; + if ((len2 = strlen(str))>len) + { + if (copy) + free(copy); + if (!(copy = malloc(len2+1))) + return ((char *)0); + len = len2; + } + /* strcpy(copy,str); */ + strlcpy(copy, str, len2+1); + return (copy); +} + + +int mlx_int_get_col_name(char *str,int size) +{ + int result; + + result = 0; + while (size--) + result = (result<<8)+*(str++); + return (result); +} + +int mlx_int_get_text_rgb(char *name, char *end) +{ + int i; + char buff[64]; + + if (*name == '#') + return (strtol(name+1,0,16)); + if (end) + { + snprintf(buff, 64, "%s %s", name, end); + name = buff; + } + i = 0; + while (mlx_col_name[i].name) + { + if (!strcasecmp(mlx_col_name[i].name, name)) + return (mlx_col_name[i].color); + i ++; + } + return (0); +} + + +void mlx_int_xpm_set_pixel(mlx_img_list_t *img, char *data, int opp, int col, int x) +{ + /* + int dec; + + dec = opp; + while (dec--) + { + if (img->image->byte_order) + *(data+x*opp+dec) = col&0xFF; + else + *(data+x*opp+opp-dec-1) = col&0xFF; + col >>= 8; + } + */ + // opp is 4, do it the simple way + *((unsigned int *)(data+4*x)) = col; +} + + +void *mlx_int_parse_xpm(mlx_ptr_t *xvar,void *info,int info_size,char *(*f)()) +{ + int pos; + char *line; + char **tab; + char *data; + char *clip_data; + int nc; + int opp; + int cpp; + int col; + int rgb_col; + int col_name; + int method; + int x; + int i; + int j; + mlx_img_list_t *img; + t_xpm_col *colors; + int *colors_direct; + int width; + int height; + + colors = 0; + colors_direct = 0; + img = 0; + tab = 0; + pos = 0; + if (!(line = f(info,&pos,info_size)) || + !(tab = mlx_int_str_to_wordtab(line)) || !(width = atoi(tab[0])) || + !(height = atoi(tab[1])) || !(nc = atoi(tab[2])) || + !(cpp = atoi(tab[3])) ) + RETURN; + free(tab); + tab = 0; + + method = 0; + if (cpp<=2) + { + method = 1; + if (!(colors_direct = malloc((cpp==2?65536:256)*sizeof(int)))) + RETURN; + } + else + if (!(colors = malloc(nc*sizeof(*colors)))) + RETURN; + + clip_data = 0; + + i = nc; + while (i--) + { + if (!(line = f(info,&pos,info_size)) || + !(tab = mlx_int_str_to_wordtab(line+cpp)) ) + RETURN; + j = 0; + while (tab[j] && strcmp(tab[j++],"c")); + + if (!tab[j]) + RETURN; + + rgb_col = mlx_int_get_text_rgb(tab[j], tab[j+1]); + /* + if ((rgb_col = mlx_int_get_text_rgb(tab[j], tab[j+1]))==-1) + { + if (!(clip_data = malloc(4*width*height)) || // ok, nice size .. + !(clip_img = XCreateImage(xvar->display, xvar->visual, + 1, XYPixmap, 0, clip_data, + width, height, 8, (width+7)/8)) ) + RETURN; + memset(clip_data, 0xFF, 4*width*height); + } + */ + if (method) + colors_direct[mlx_int_get_col_name(line,cpp)] = rgb_col; + // rgb_col>=0?mlx_get_color_value(xvar, rgb_col):rgb_col; + else + { + colors[i].name = mlx_int_get_col_name(line,cpp); + colors[i].col = rgb_col; // rgb_col>=0?mlx_get_color_value(xvar,rgb_col):rgb_col; + } + free(tab); + tab = 0; + } + + if (!(img = mlx_new_image(xvar,width,height))) + RETURN; + //opp = img->bpp/8; + opp = 4; + + + i = height; + data = img->buffer; + while (i--) + { + if (!(line = f(info,&pos,info_size))) + RETURN; + x = 0; + while (xsize_line; + data += img->width*4; + } + /* + if (clip_data) + { + if (!(clip_pix = XCreatePixmap(xvar->display, xvar->root, + width, height, 1)) ) + RETURN; + img->gc = XCreateGC(xvar->display, clip_pix, 0, &xgcv); + XPutImage(xvar->display, clip_pix, img->gc, clip_img, + 0, 0, 0, 0, width, height); + XFreeGC(xvar->display, img->gc); + xgcv.clip_mask = clip_pix; + xgcv.function = GXcopy; + xgcv.plane_mask = AllPlanes; + img->gc = XCreateGC(xvar->display, xvar->root, GCClipMask|GCFunction| + GCPlaneMask, &xgcv); + XSync(xvar->display, False); + XDestroyImage(clip_img); + } + */ + if (colors) + free(colors); + if (colors_direct) + free(colors_direct); + return (img); +} + + +void mlx_int_file_get_rid_comment(char *ptr, int size) +{ + int com_begin; + int com_end; + + while ((com_begin = mlx_int_str_str_cote(ptr,"/*",size))!=-1) + { + com_end = mlx_int_str_str(ptr+com_begin+2,"*/",size-com_begin-2); + memset(ptr+com_begin,' ',com_end+4); + } + while ((com_begin = mlx_int_str_str_cote(ptr,"//",size))!=-1) + { + com_end = mlx_int_str_str(ptr+com_begin+2,"\n",size-com_begin-2); + memset(ptr+com_begin,' ',com_end+3); + } +} + + +void *mlx_xpm_file_to_image(mlx_ptr_t *xvar,char *file,int *width,int *height) +{ + int fd; + int size; + char *ptr; + mlx_img_list_t *img; + + if ((fd = open(file,O_RDONLY))==-1 || (size = lseek(fd,0,SEEK_END))==-1 || + (ptr = mmap(0,size,PROT_WRITE|PROT_READ,MAP_PRIVATE,fd,0))== + (void *)MAP_FAILED) + { + if (fd>=0) + close(fd); + return ((void *)0); + } + mlx_int_file_get_rid_comment(ptr, size); + if ((img = mlx_int_parse_xpm(xvar,ptr,size,mlx_int_get_line))) + { + *width = img->width; + *height = img->height; + } + munmap(ptr,size); + close(fd); + return (img); +} + +void *mlx_xpm_to_image(mlx_ptr_t *xvar,char **xpm_data,int *width,int *height) +{ + mlx_img_list_t *img; + + if ((img = mlx_int_parse_xpm(xvar,xpm_data,0,mlx_int_static_line))) + { + *width = img->width; + *height = img->height; + } + return (img); +} diff --git a/parse_map/textures/barrel.xpm b/parse_map/textures/barrel.xpm new file mode 100755 index 0000000..7d45baf --- /dev/null +++ b/parse_map/textures/barrel.xpm @@ -0,0 +1,97 @@ +/* XPM */ +static char *barrel[] = { +/* columns rows colors chars-per-pixel */ +"64 64 27 1 ", +" c black", +". c gray11", +"X c #231C0A", +"o c #312611", +"O c #382A15", +"+ c #3F3115", +"@ c gray15", +"# c #313131", +"$ c #3F3F3F", +"% c #493418", +"& c #50381C", +"* c #5E3F1F", +"= c #654223", +"- c #704626", +"; c #774D2A", +": c #7E502D", +"> c #494949", +", c gray34", +"< c #626262", +"1 c #6C6C6C", +"2 c gray48", +"3 c #885431", +"4 c #8C5734", +"5 c #935B38", +"6 c #9D623B", +"7 c #A4693F", +"8 c gray52", +/* pixels */ +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" <<<<<<<<<1111112222 ", +" 1<>>>>>>>>>>>,,,,,<<<21 ", +" 12>#....@@@@@@@##$$$$><>< ", +" 112882211111<<<<,,,,>>$## ", +" 33112211<<<,,,,>>>$$$####++ ", +" ;4:33;---====***&&&++++++&+ ", +" 3;446737664:5543:=*-==%=*++&+ ", +" ;4;6745766:;5543:=*--=*&=*+&+ ", +" ;4;6737666::5543:-&---=%=*+&$ ", +" >,12<737665:5543:;-&---=%$$$$# ", +" ><1122821111<<<<<,,,,,>>>>####+ ", +" >111112<<<<,,,,>>>>>>$$$$#####+ ", +" ;=>,<11<<<<,,,,>>>>>>$$$$$###&+ ", +" ;4;644&3:;-+===****X&++++%&&+&+ ", +" ;4;67747666:5433:;-&---=*%&&+&+ ", +" ;4;67747666:5433:;-&---=*%&&+&+ ", +" ;4;67747666;5433:;-&---=*%&&+&+ ", +" ;4;67747666;5433:;-&---=*%&&+&+ ", +" ;4;67747666;5433:;-&---=*%&&+&+ ", +" ;4;67747666;5433:;-&---=*%&&+&+ ", +" 14;67737666-5433:;-&---=*%&&+$$ ", +" <2221737666-5433:;-&---=*%$$$$# ", +" ,11128211111<<<<<,,,,,>>>>$### ", +" >,<1121<<<<,,,,>>>>>>$$$$$####O ", +" =>,,,<<<<<,,,,>>>>>>$$$$$OOO%& ", +" ;;------**o**&&&&&X&&&&OO&+&+& ", +" ;4;5737553=3::::;-&--=*+&&+&+ ", +" ;446;5553=;::::;*&--=*+&&+&+ ", +" <4;44;553=-:::;-&&--=&+&+&+ ", +" <2824;333-=;;;;-&*-=*+&+++# ", +" 1112222111<<,,,>>>$$$##@. ", +" 1<11<<<,,,,>>>>$$$###@@ ", +" >>>>>$$$$$####@@@@@ " +}; diff --git a/parse_map/textures/bluestone.xpm b/parse_map/textures/bluestone.xpm new file mode 100755 index 0000000..9776c32 --- /dev/null +++ b/parse_map/textures/bluestone.xpm @@ -0,0 +1,90 @@ +/* XPM */ +static char *bluestone[] = { +/* columns rows colors chars-per-pixel */ +"64 64 20 1 ", +" c black", +". c #202020", +"X c #2C2C2C", +"o c gray22", +"O c #000040", +"+ c #00004C", +"@ c #000058", +"# c #000064", +"$ c #000070", +"% c #00007C", +"& c gray33", +"* c #000088", +"= c #000098", +"- c #0000A4", +"; c #0000B0", +": c #0000BC", +"> c #0000C8", +", c #0000D4", +"< c #0000E0", +"1 c #4040FC", +/* pixels */ +"o$%%%%%%%%%%%%%%%%%%%$oo****************************oo$%%%%%%%$X", +".---------------------..::::::::::::::::::::::::::::..;;;;;;;;;.", +" ---*-%--=%==%==%-%$$@ .:-:;%-:=$$=*--*$*-:-*=-::-=$ .;:-=-;;=% ", +" -=%*===%%-=-#==%$%%$# .::-===$=@$@@%--#$$#$$@$**$#$ .;;--%=--@ ", +" -*-$>>=%%%=**%#@%$@@# . .;-;::;-%% ", +" -*%->>#%%%-===*$$%@@O .-------------------...........;:-;-%%#@ ", +" -==;;---=---==$$#@#$# .-:::;-==:==;==;::-- .----==#..;==-%**## ", +" --=-;;-=%#--=**%##@OO .-;:<>;-:-===;;---=- .-==*=%# .;==-$***# ", +" -=%=--*=%=$$***$%%#@O .-;>:>=;--:==-%-%=-% .-===%%# .;:-=--**O ", +" -***-%%%--$@##$#%%%@O .-;;;===;----=*#%%%# .--=%%@@ .:%%=--=@O ", +" =%*-**$=--$$#@###%%@O .-:;;;==;::--##*%%#@ .--=%-%@ .:%:-%==@O ", +" =*=%%-*#%@%#@#%O@OO#O .-:--;;;;:;;-##$-##O .-%*=%@@ .::%%##%%O ", +" =%=%#**%#%#%#O$$OOO#O .-;--=:==-;;-==%%@@# .-***$$# .:%$#%#%%O ", +" ==%%%$#@@#%#$#OO$O#@O .-;<>**==*%%%*=*%##O .--**$$# .:%%$@@@@O ", +" =%=##$#%#OOOOOOOOOOOO .-:>>***--%**%*$%#@O .-%=-@@@ . ", +" .-:--=**---**=##%#@O .---=-@# ...........", +"-:;-;-----;---- ;;;--== -;=-*=----%==%%@@OO .=-=-=$# .---- :::::", +":;-=-:;-*--%-=% ;;=::%: ----:-=---*#$%OO#@O .==%$%$@ .-;*% ::-;:", +":;==*--*%==%%== ;::;=%% -;=-:-*%**#%%$OO#OO .==@@@#O .-;;% :-;;;", +";-=;;==%%%=%%%% ;:;;==# -;---*-%%#$$@@@##@O .=%@#@@O .-*%@ :::;;", +"-*=;:;%%==%=@%% ;:=%==# ---====%#@##@##@OOO .=%#@@OO .-@#@ ::;;;", +"--*=;,%=%%##$%% ;=:%%%# . .::--=", +";*%*=-=%%=#$%@@ ;==#%%@ .........................;;;;;;;;..:--==", +";-*=%=%==%$%#%@ ;:=*#@# .;;;;;;;;;;;;;;;;;;;;=-..;>;>---= .:;===", +";;=*;====%%$@@@ -:%**#@ .;:;-:::;:-;-:;%-:::%-@ .;>;>>-=* .::===", +";-*%*;;#%=**$@# -%#$$@# .;:-;><<:,<-:--::----%@ .;>>>>-*% .:;:--", +"-=%*-;;-=%**$@# =%@@@@# .;;-:,,<:<,,;%-%%-%%-@@ .;;->-*-# .:::--", +";=;==-;-#%$$$@@ .;::;;>>--,,--%%%$-%%@@ .;>----*# .:::;;", +"-**--=--#$@#@OO .........;;:;;;---:---%**%%@@@# .;>>--*%$ .:--:;", +"-=*---=%$#@##@@ .;;;;--..;--:;**-:;%--%***$$$@@ .;>>==--@ .:--;;", +"=*=*--%##@@@#O# .;;*-=* .;:;:;**---%---$**@$$$O .;;>===-@ .::==%", +"=**%**%##$%%#OO .;--=*= .;::-;;;=-%%%--$@#@#$$O .;;-*;--# .:**==", +"=*-=$%%$#$%%#@O .;-=*$# .;:-%-;;--%$%#$$$@OO@OO .;;>*;;=# .:**%%", +"=-=**%##@++$#@O .;;*;*@ .;--:%--=%$%%##$$#OO##O .;->-*==@ .::%%%", +"%==*%%%%@++@@#O .;;;$$# .;%:%--%%$#%%%##@@###+O .;>--=@$# .:--==", +"%**%$%%%@@#@@@@ .;;;-@@ .;-:%--$##@%%%#@@@@+++O .;>-=%=$@ .:--=*", +"%*#$%#%%@#@O@#@ .;==@*# .;-%--%@@@@####@OOOOOOO .;>-%==%# .:=--%", +"%=%#%#$@#OO@OOO .;==;@# . .-;-%#%%# .:=**%", +"%*=*$%$@@@O#O@O .;;*;*@ .........................-;;-%@#O .::**%", +"%=*%#$%$OOOOOOO .;;**@# .----------------------..-;-:-%#O .:==%*", +" .;;%%@@ .-::::::;-------=*%:=-% .->--:*@O . ", +".....@@$$***%$#..-;%%%@ .;:>>:--;;>:==--=%*%*=% .----**@O .*=** ", +".=-;:::::::::::..--*%%# .;:>>>;;;;::%%%%---==%# .->-%$@@O .==%% ", +".-:::::;-;:---: .--=@## .;::::,,;;;%%%%%%=%%$=# .-;*$#@$O .=%$$ ", +".-:;;,,;:::=-:: .-=*@@@ .;::;:,,,%-=%%$$$*%%%%# .--$#$@@O .=$%@ ", +".:::;,,:==-::=; . .-;:;::,,:--=%$$##@%%%# .*%%@@@#O .*%$@ ", +".:-;-;;;===:-** .........--;>==:-:----%%##%#@++ . .*$@# ", +".::;=*;;-==-::- .::;--=..-->>===;---%%=*$##@@OO ............... ", +".::=-:;*-;;;%-- .:%:*=* .-:::;==:::-%%%%###@@OO .;;;;:::::::::: ", +".::::-*:*;%%-*- .:-;;=% .-;--;;;::::-%*$@###$@+ .;;--;;;;-*:--% ", +".:-:=--:;=%+%-- .::%-%$ .-:---=-::::---@@@@#$$# .;-;,,;;;=---=% ", +".:;==:<:-*-%%-- .:;--%- .-::--:**:::---$@@#@+++ .;::,>>;;**-=%# ", +".:-:-<1<==-=*%* .:;-%-$ .--:==%%%*---%%%##@@@OO .;=:=>>;;--%%%@ ", +".:;:;:<:-%--++# .:-;;%# .--:-**%%%*%*@@==$$@+OO .;:;===--%%%%@# ", +".:-:;;;***%$++# .::;=*# .-=::=:%%*%%*%@==*$$#@# .;;-===-%$#%@@# ", +".-:;;-%%=-==%## .:;-**% .-:=-:-*%$$**@@%==%$@@O .;;=-==-%$#$%@@ ", +".:-:;**;%--=$%@ .:-:%%% .-:---=*--$$@$@@%%%#@@O .;;:;*;;=%#==@O ", +".:-:-=*%#*--=$# .::-### .---==%*---$#$$@+++#OOO .::;*-;;;=%==%O ", +".;-***-#+#*==$$ .:;-%$@ .-;-==:-%--@@$$#@OO@OOO .:;-*--;;=%%%%O ", +".;-$#*#-%%=@#@@ .;-###@ .-;:%::-@###@@+++OO+@OO .:;-:--%*$$%%@O ", +".--**#*@#@#$#$# .;-*$## .--;:-%=@###@@OO$$#O+O@ .:::=-%%$%%$#O# ", +".-=%%%%%$$$$%%%..-*%%%%..--=-=%%%%%%$#@@%%%%@@$..:--%=-%%%%%$$% ", +"o***%%%%%%%%%%%oo**%%%%oo->*****%%%%%%%%%%%%%%%oo:**%%%%%%%%%%%.", +"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&o" +}; diff --git a/parse_map/textures/colorstone.xpm b/parse_map/textures/colorstone.xpm new file mode 100755 index 0000000..3029319 --- /dev/null +++ b/parse_map/textures/colorstone.xpm @@ -0,0 +1,96 @@ +/* XPM */ +static char *colorstone[] = { +/* columns rows colors chars-per-pixel */ +"64 64 26 1 ", +" c gray11", +". c #382C14", +"X c #202020", +"o c #282828", +"O c #2C2C2C", +"+ c gray19", +"@ c #343434", +"# c gray22", +"$ c #403018", +"% c #483818", +"& c #543C1C", +"* c #5C4020", +"= c #6C4824", +"- c #744C28", +"; c gray25", +": c #484848", +"> c #4C4C4C", +", c gray33", +"< c gray36", +"1 c #646464", +"2 c gray44", +"3 c #7C7C7C", +"4 c #80502C", +"5 c gray55", +"6 c #989898", +"7 c gray66", +/* pixels */ +"333%&**-**************&$%****&&%,1332222OOOOOOO:12,1,,>>>>,<<123", +"322,%&*-*******&******&$%***&%%,13323233:OOOOO:12,1,>>,,<1111112", +"2221,%&=********&&****&$%*&&%:,11:****:11:OOO:12,1,>,<1111111111", +",2321,%=********&&****%$%&%%,13:**%%$%$%11:::12,111111<,,>>>>>>>", +">,2231%=*************&%$%%,133:*%%%%$%$%:31112,1<<<<<<<<<<<<<<<<", +">>,222%&*****&******&$$%,1331**%%%%%$%$$.1572,1,>>>>>>>>>>>>>>>>", +">>>,23,%&**********&$$:,133:*%%%%%%%$$%..173,1,>>>>>:>>>>>>>>>>>", +">>>>,23,%&*******&&$%,1131**%%%%%%%%$$%..1631,>>>>>>>>>>>>>>>>>>", +">>>>:,31,%&****&&$$,1133:*&%%%%%%$%%$.%..161,>>>>:>>>>>>>>>:>>>>", +">>>>::331,%&&&&$$,13331**&%%%%%%%$%%$.$..151,>>>:>>>>>>>>>>>>>>>", +">>>>::3231,$$$$:,1331:*&&%%%%%%%%%%%%.$.;151<>:>>>:>>>>>>>>>>>>>", +">>>>::22331,,,,,1331**&%%%&%%%%%%.%%%...>231<>>>:>>>>>>::>>>>>>:", +">>>>:#221,,,1266521*&&%&&%%%%%%%%.%%%...,251,>>>>>>>>>>::>::::>>", +">>>:#131,,,,:16551*%&&%&&%%%%%%%%.%%%...1231,>>>>>>>>>>>>>::::>>", +">>:#132,,,,,::253*&%*%%%%%%%%%%%%.%%%..;1331,>>>>>>>>>>>>>::::>>", +">:#1331,,,,,:::1,*%*&%%%%%%%%%%%$.%%%..>2331,>>>>>>>>>>>>>::::>:", +":#13321,,,,,;>,:1*%*%%&%%%%%%%%%$.%%$..,333,>>>>>>>>>>>>>>>>>>:#", +"#11::12,,,,>;,,11*%&%%%%%%%%%%%%..%%$..1=*1,>>>>>>>>:>>>>>>>>:#;", +"11:&&:11,,,;;,,,2*&&%%%%%%%%%%%%.$%$.$<=**,1;>>>>>>>>>>>>>>:;#;;", +"1:&*%&:3:,;;;,,,11&&%%%%%%%%%%%$.$..$1=***%11;:>>>>>>>>>:;#@@#;1", +":&*%%%$12:;,;,,,:3:&%%%%%%%%%%$....>13%%%%%221;;;:::::;;#@#;#,11", +"&*%%%%$:31:,;,,,:21$%%%%%%%%%%....>133311115511;#@@@@@@@#;;#,13:", +"*%%%%%$$12:,;,,,#13:%%%%%%%%%...;<1,,,,,,,356621,#;;;;;;;;#,13:&", +"%%%&%%$%131:;,,>#131$%%%%%%%..;,11,:;#;;;;,366531,#;;;;;##,13:&*", +"%%%%%%$%:331;,>:#133:.$%%%$..,131,:;;##;;;;,355231,######,131&*%", +"%%%%%%$%$132#:::#2231.......;131,:;;;#;#;;#;232,,31,####,131:*%%", +"%&&%%%.%$,231###23333:....;><3,,:;::;#;#;;#:121::,31,,,,131:&%%%", +"%&&%%%.%$:3521123,==,1::><<33,,:;;::;#;;#;@,12,:::,3335532:&%%%%", +"%%%&%%.%$:325221==****111232,,:;;;;;;@;;##+,11:::::1355321&%%%%%", +"%%%%%$.%$:32222=******&3322,,:;;;:;;;@;;##:12,,::::,1221<,&%%&&&", +"%%%%%$$%$,252221******%323,,,;;;;;;;;@;;#@,233111111132<,<&%%&&&", +"%%%%%.$$$,331,133***&%%33,,:,;;;;;;;;@;;#+1,---------%*-<1&%%&&&", +"%%%%$.%$:131,<,133&&%%13,,::,:;;;;;;;+;;@,2===*******%***3&%%%%%", +"%%%%$.$:111,<,,,1331,,31,:;:,:;;;;;;#+;#+,1=*=*******%**&1&%%&%%", +"%%%%.$:113,<,,,,,135353,:;;:,:;;;;;;#+;#+1,4*=**&****%**&1&%%%%%", +"%%%$.:1121,<,,,,,,13555,;;;:,>;;;;;;@+;+12:4*=*******%**&1$%%%%%", +"%%%.:1133,<,,,,,,,,1566,;;;:,>;;;;;;@+#:22=4*=*******%**&1:$%%%%", +"%%$:11231,<,,,,,,,,,1661;;;:,>:;;;;;++@,31=4*=*******&**&11:$%%%", +"%$:11231,<,,<,,,,,:,,152#;;:,>:;;;;;+++13,=4********&&**&131:$%%", +"$:113321,,,,,,,,,,,:,,55,##:,:>;;;;;++:22=*4*=******&***%1331:$$", +":115531,,,,,<,,,,,,;,,122+##,;>;;;;;++,31=*4=*******&***%13331::", +"116651,,,,,,<,,,,,,;:,,11:+@+;>;;;;;++,3,=*4-******&****%1OO#,11", +"13662,,,,<<,,,,<,,,:;,,,1,:++#::;;;#+:12=**-4******&****%1OOOO#,", +"O:551,,,<<<,,,,,,,,:;,,,,:,1,@@:;;;#+,23=**=4*****&*****%1OOOOXO", +"OX:3,,,,<<<,,,,,,:,:;:,,,:11,+@@#;;#+133&***-********&**%1OOOOXO", +"OX:2,,,,<<,,,,,,,,,:;:,,:#155,+@@;;@:2221&**==**********%1OOOOXO", +"X:11,,,,,,,<,,,,,:,:;:,:#:3553,+@##+,32231&**=*****&&**&%1OOOXOO", +":111:,,<<,,,,,,,,:,:@::#:,3:%:3,++++231##11&&*=****&&*&%:1OOOXOO", +"12221:,<<,,,,,,,,:,:@;#:,1:&%$:31,,131#OO#121&*******&%:11XXXXXX", +"332231::,,,,,,,,,:,;@#:,1:&%%$%$:3331#OOOO#121&&****&%:1233:::::", +"3235551::,,,,,,,::,;@:,1:&%%%$%$%:33:#OOOOO#122,&&&%%:1,,,,,,133", +"3,==,551:#,,,,,,:::@:,1:&%%%%$%$%$31#oOOOooO#132,&%::11,,,,,,:13", +"==**==,31:#:,,,:::#:,1:&%%%%%$%$%$3#OOoOOooOO#132,::13,,,>,,,:13", +"******==,1:#:,::##:1::&%%%%$%$%$$:1#OOOXoOOOOO#1321151>>,,,,>:13", +"*&******=%1:#::#:,1:&*&%%%%%%$$$:1#OOOOOXXOoOOO#13255,>>,,,,>:1=", +"*******&*%**:##:,1:&*&%%%%%$%$$$,##OOOOOoXXoOOOO#1351,,,,,,>::1=", +"**&&***&*%**&::,1:&&*&%%%%%$%$$:1#OOooOOOoXXoOOOO#13,,,,,,,::,=*", +"**&&***&*%&%%,,1:&%&*%%%%%%$%$:1:#OOoooOOoXXXoOOOO#13,,,,,:>:1=*", +"******&%&$%%,11:&%%&*%&%%%%$$$,1##OOooOoOOXXXXoOOOO#11,,,>::,=**", +"******&%%$%,333:%%%&*%%%%%%$$:1#O#OOOOOOOOoXXoXoOOOO#1>>>:>:,=**", +"******&%$$,3333,%%%&*%%%%%%$:1:#O#OOOOOOOOoXXXoXoOOOOX1>:,,:=***", +"******%$$,3,;,31:%%&*%%%%%%$,1#OO#OOOOooOOOoX ooXoOOOX,1,,>1=***", +"*****&%$,3,;;;,3,%%&*%%%%%$:1#OOO#OOOOooOOOoX XOXXoOOX,3>>1=****", +"****&$$,33;;;;;,1%%&%%%%%$:,1OOOO#OOoOOOOOOoX XOoXXoOX,3311=****" +}; diff --git a/parse_map/textures/eagle.xpm b/parse_map/textures/eagle.xpm new file mode 100755 index 0000000..5879a57 --- /dev/null +++ b/parse_map/textures/eagle.xpm @@ -0,0 +1,126 @@ +/* XPM */ +static char *eagle[] = { +/* columns rows colors chars-per-pixel */ +"64 64 56 1 ", +" c #202020", +". c #2C2C2C", +"X c gray19", +"o c gray22", +"O c #400000", +"+ c #4C0000", +"@ c #580000", +"# c #640000", +"$ c #700000", +"% c #7C0000", +"& c #543C1C", +"* c #585400", +"= c #706C00", +"- c #744C28", +"; c #400040", +": c #480048", +"> c #500050", +", c #580058", +"< c #600064", +"1 c #6C0070", +"2 c gray25", +"3 c #484848", +"4 c gray33", +"5 c #646464", +"6 c gray44", +"7 c #7C7C7C", +"8 c #880000", +"9 c #980000", +"0 c #A40000", +"q c #B00000", +"w c #BC0000", +"e c #C80000", +"r c #D40000", +"t c #E00000", +"y c #EC0000", +"u c #FC0000", +"i c #FC2020", +"p c #B45400", +"a c #CC6000", +"s c #FC7800", +"d c #A86840", +"f c #848400", +"g c #9C9C00", +"h c #FC8820", +"j c #CCC400", +"k c #E4D800", +"l c #FCF400", +"z c #E88C58", +"x c #840084", +"c c #9C009C", +"v c gray55", +"b c #989898", +"n c gray66", +"m c #B4B4B4", +"M c #C0C0C0", +"N c #D0D0D0", +/* pixels */ +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"4o433333433333343o333333344444433333333344444443333ooo334433333o", +"oyyrrrrrrrrr0334yyrrrrrrrrrrrrrrrrrr03o4yyyyttttttrrrrreeeewww03", +"3leqqr80r8e0#.34yw8w8w8w%w9w9w%w%we0$.3or0eqeqqe$e%eqe8q0%e9e0l.", +"kjfmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmjj=", +"dg*6677777777777777777777777777777777777777777777777777777666=z*", +"3&07777bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb7677@d.", +"3w%b7i0OO4$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$0qut7OOO7M6@O.", +"3w0n70Mb6O7nMNMMmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmMMMMM7O76bi76@O.", +"3%#mbObMb7vbnnv7nNMmmmmmmmmmmmmmmmmmmmmmmmmmmmmv15Mmnnn6nN067OO.", +"33.NnObnMb77bb4,6nNNMMmmmmmmmmmmmmmmmmmmmmmmMMv5<>bnnbbnN7O7b .", +"4ooNm46bmMb77v>,,,7nNMMMMMmm>64>>>>pasmmmmMMv5<,>>bbbbnNM54vn ..", +"yrrmNO7bnmMb653:>>,,7nmmmmmm>>>>>7>ppahmmmv5<,>>>3bbbnMMn7Obn@@r", +"q88mN$bvbnm5,653::>>,,,7vmmm6>>>>>>pvmmv5<<,,>>>366>5nMnv7Onm@@q", +"808mNqnbvb51<3653::::x,,,6vmm>>>>>>vmv5<<,x>>>:3641<<5nb7v$nm@@9", +"$00mm9mbvv:<1<,353o::1:,,,,mm>>>>>>mm,<<,>1::o353><<11bv7v$nm@@%", +"088mm8Mnbv::<1<<,34o;;:::,4mm>>>>>>mm4::::::o33:>,<111v7vv$nm@@%", +"$0#mm$Nmnb3::<11<,:;;;;::vmm6>>>>>>6mmv:::;;;::>,<1114v7vb$mm@@8", +"$q#mm$NMmb53:,<<1<,1;;;:v>6m>>>>>>>>m6:v:;;:,::,<111477vvn$mm@@$", +"O++mm$NN5>6443,<<1,x>;;:>:>mm>>>>>>mm::::::,1>,<<1475335bn$mmO@O", +"...mm$mN,>:34443<<1,x>>>:>:75>>>>>>57::::::1,,<<4v753;;:bn$mm .", +"443mm$mN<,>::;o3345,,,,:::>>>>>>>>>>::::::>>,45v74>:;;;:nn$mm ..", +"4yyMM%Mm<<>>:;;;::,c,,,::>>>>>>>>>>>:::::>,,c,,,>>:;;;;,nn$mm@@.", +"4y8NN9NM,<,>::;;;::x,,,>>>>>>>>>>>>>>::>>,,,c,,,>::;;;:,bn%mm@O.", +"oyqMM8Mb6,<>>:;;:;:1,,>>>>>>44566544>>>,,,,,x,,>::;;;;:6bn%mm@O.", +"3w#mm%mbb63,>:::>:>,1>>>>>>>51c11c15>>,,,,,x,,>:::;;;36bbm8mm@O.", +"3wqmm$m>,356655432X:>,x,>>>>7c1111c7>,>,,x,,,4432o23453<1M9MM@O.", +"4w$nn$n>>,,,,>:>:>:>:>,x1>>>41111114>>,1x,,,,>::::;::>,<1N9NN@O.", +"3e0nn#n>>>,,,>>:>:>:>>>>>>>>7c1111c7>,>,>,,,>:::::::>,,<>,>,>,>>>>>>>>>>>>>>41c31c14>>,>,,,>>:::::::>><1>>,>,>>>>>>4>>>>4>>>74131147>,>4,>>>4:::::::>><<>m%mm .", +"444nn#n5>>>>>>>>36>>>>>4>>>>47744774>>>,4>>:>:63:::>>,<,5m$mm ..", +"wwwmm$mb5>>>>366>>>>>>6>>>>>>>4774>>>>,>>6>>:::>663>>,,5bm$mm@@w", +"0q0mm$mmmbbbb6>>>>>>>6>>>>>>>>>>>>>>>>>>>>6:>::::>6bbbbmnn#nn@@0", +"0%8mm$mmbb6>>>>>>>>>6>>>>>>>>>>>>>>>>>>>>>>6:>:>:>,,,6bbbb@bb@@$", +"8%0mm$mm>>>>>>>>>>>6>>>>6>6>>>>>>>>>>6>6>>>>6:>:>,,,,,>>vv+vv@@$", +"08%mm$mm>>>>>>>>>>6>>>>5b6>>>>>>>>>>>>6b5>>>>6>>>>,,,,>>bb@bb@@8", +"08%mm%mm6>>>>>>>>6>>>>>b>>>>>>>>>>>>>>>>b>>>>>6>>,,,,,>6bb#bb@@$", +"$$8mm%mmb>>>>>>>6>>>>>b>>>>>>>>>>>>>>>>>>b>>>>>6>>,>,>>bnn#nn@@$", +"OO+mm8mmm6>>>>>6>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>6>>>,>6mmm#mm@@O", +"...MM8MMMm6>>>6>>>>>>b>>>>>>>>>>>>>>>>>>>>b>>>>>>6>>>6mmmm$mm .", +"434NN0NNNmmbbbb>>>>>bmc>>>>>>6>>>>6>>>>>>cmb>>>>>bbbbmmmmm$mm ..", +"oyrMM9MMMmmmmmbb>>>bmmm6>>>>>>>>>>>>>>>>6mmmb>>>bbmmmmmmMM8MM@@.", +"4r0mm9mmmmmmm7pp7mmmm7p>>>>>>>>>>>>>>>>>>p7mmmm7pp7mmMMMMM8MM@O.", +"3r0mm8mmmmmmmpppppppppp-->>6m>>>>>>m6>>--ppppppppppMMMMNNN9NN@O.", +"3r8mm8mmmmmmmm75-pppp--7mmmm>>>>>>>>mmmm7--pppp-57mmmMMMMM9MM@O.", +"or0mm%mmmmmmmvppppppppppmmm>>>>>>>>>>mmmppppppppppvmmmmmMM8MM@O.", +"4r0nn$nnnnmmmp--vpp-mv-pm7>>>>>>>>>>>>7mp-vm-ppv--pmmmmmmm$mm@O.", +"oe0nn$nnnnnnm-7vmp-mmmm74>>>>>>>>>>>>>>47mmmm-pmv7-mmmmmmm$mm@O.", +"40#mm$mmmmmmmmmmmp-mm74>>>>>>>>>>>>>>>>>>47mm-pmmmmmmmmmmm$mmOO.", +"o3.mm$bmmmmmmmmmmvpm>>>>>>>>>7>>>>7>>>>>>>>>mpvmmmmmmmmmmb$mm .", +"4o4mm$7mmmmmmmmmmmmm74>>>>>5m>>>>>>m5>>>>>47mmmmmmmmmmmmm7$mm ..", +"rrrmm7$7bmmmmmmmmmmmmm74>>5m7>>>>>>7m5>>47mmmmmmmmmmmmmb7$7mm@@w", +"%0@7mm7$$$7bmmmmmmmmmmmmmmmm>>>>>>>>mmmmmmmmmmmmmmmmbv$$$7bm7@@$", +"0%%@7mmmb7$$$$7bmmmmmmmmmmmm5>>>>>>5mmmmmmmmmmmmb7$$$$vbmmm7@@@+", +"0%@@@47mmmmmb7$$$7bmmmmmmmmmm5>>>>5mmmmmmmmmmb7$$$7bmmmmm74@@@$8", +"%9@@@@@47mmmmmmb7$$$7bmmmmmmmm5>>5mmmmmmmmb7$$$7bmmmmm74@@@@@#$0", +"#0%0#@#@@@@47mmmmmb7$$$7bmmmmmm55mmmmmmb7$$$7bmmmmm74@@@@@@$@0$0", +"#0%%#99#@@@@@@47mmmmmb7$$$$7bmmmmmmb7$$$$7bmmmmm74@@@@@@@$0$@#0+", +"%9@0##8#%%0@@@@@@O47mmmmmb7$$$7bb7$$$7bmmmmm74O...@@@@0@0$0$0#0$", +"++++++++++++++++OO .47mmmmmb7$$$$7bmmmm74+++OO ..@OO+++++++++++", +"................... .47mmmmmmmmmm74 . ......... ..", +"o4o4ooo333334oooo....... 47mm74. ........oo33433332o2333", +"44444444444444444443ooo.. .ooo334444444444444444" +}; diff --git a/parse_map/textures/greenlight.xpm b/parse_map/textures/greenlight.xpm new file mode 100755 index 0000000..274e3c3 --- /dev/null +++ b/parse_map/textures/greenlight.xpm @@ -0,0 +1,96 @@ +/* XPM */ +static char *greenlight[] = { +/* columns rows colors chars-per-pixel */ +"64 64 26 1 ", +" c black", +". c #044C00", +"X c #045800", +"o c #046400", +"O c #047000", +"+ c #047C00", +"@ c #646464", +"# c #7C7C7C", +"$ c #048800", +"% c #049800", +"& c #04A400", +"* c #00A800", +"= c #04B000", +"- c #04BC00", +"; c #04C800", +": c #00E000", +"> c #00EC00", +", c #00FC00", +"< c #80FC7C", +"1 c #FCFC54", +"2 c gray55", +"3 c #BCFCB8", +"4 c #FCFC9C", +"5 c #FCFCB8", +"6 c #D8FCD8", +"7 c gray99", +/* pixels */ +" @ @ ", +" #2# ", +" .o. ", +" oO+++OOoX ", +" o$%=;;=%%$+oX ", +" o&->>>>:;*%$+oX ", +" o=;:,,,,::;=&$+oX ", +" o&:,<365714563<,:%o ", +" +%><<<3655563<<<>%+ ", +" %;:,<<<<<<<,:;% ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" " +}; diff --git a/parse_map/textures/greystone.xpm b/parse_map/textures/greystone.xpm new file mode 100755 index 0000000..ff8a3d4 --- /dev/null +++ b/parse_map/textures/greystone.xpm @@ -0,0 +1,92 @@ +/* XPM */ +static char *greystone[] = { +/* columns rows colors chars-per-pixel */ +"64 64 22 1 ", +" c gray12", +". c gray23", +"X c #3F3F3F", +"o c gray28", +"O c #4B4B4B", +"+ c gray31", +"@ c #535353", +"# c gray34", +"$ c #5F5F5F", +"% c #676767", +"& c gray42", +"* c gray45", +"= c #7B7B7B", +"- c #838383", +"; c gray56", +": c #9B9B9B", +"> c gray67", +", c #B7B7B7", +"< c gray78", +"1 c LightGray", +"2 c #DFDFDF", +"3 c #EFEFEF", +/* pixels */ +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .", +"#@#+#+#+#+O1222121222121222 .->,1<11<1,<>-# oooooooooo@+#+#+#+#+", +"@#@@#@@@#@o21<1,111<11,11<; .-<,;>-;;;;->+. .&;;-;;;=&%oooOoooOo", +";;-;;;-; @O2<<,1,<<,<<,,1;$ .>1>;>;>->;>-#. .;122212,,>;-;;;-;;;", +"1111,>;- #o21>>:>;>>>>:>>=@ .;,;;->>>>-;*+. .-22,<,1222121<111<1", +">>>>:>=* @o3,:>>>>:>;>->>&@ .o>;>>-;:;>&#@. .;1,>;>;>>:;;>;>->;:", +",:::>;=& Oo31>->;>;:::;;>;+ .o=;->;>>->*... .-2,;>-:-;;>-;:;>:;:", +",>-,-:$# .o3<;:;>>:;=;;>;$# .oo;>>:;;;>&... .;2>>-:=>:=;>->>;=>:", +":>>;:*oO O<,>:>->;:-:;;>&@ O@o=........ ..*22;>--:*:;>;;=>>*;", +";;-;*@oo .o>3>:>;;;;;;->-#= .o....... . ooo<<;;;;:::-;>;>>->;", +"*&**+O.. O;1;>;;=;;>->;>&#. .o. . . O@o<>;>->;-;*&%$$%$%$", +"@#ooo .X*2>-:===>:;-=;&%. .ooOO*=;>:>>:*.+O,;&*%$%#@@@oOoOooO", +" . . .@o2<;;;::-;>=;>;+. .X*>>123111:&@ @o;&%$@Ooo..... . . ", +" . . . ..+o>1;>-=;>;-:;-*+. .>,21,->;>-*. ........... ", +"..........OO;<>->:-=;=;>;+#. .X>2,>;;;-;;+. . . . . XX.......", +"@O...... .@o*<->:;>:>->->+*o O>3>;->;>->@. .o#@## oOooOoooooooX", +"::;:;:;:: #o<,:;-::*;;;;&#@ O>3-;>>->;;+. .&>21#o@=::;:::;::::", +"1<11<1,>*X #o;,;>;=;;->;&;&O O><>>;->;>-#. .>1<> o=<12221222121", +">:;>;>>&*. @o*:>->>->*;&@*@O O><>;&**&@#@. .1<>- O:11,,>,,,>,,,", +">;:;>-;&*. o@o:;**&*@@*+*@o .:;*;&....... $2>;; o:2>>:>;>;:-::", +">;;>->>&#. o@o%@#@#ooo. ;*... $2>>- O:1>;:-:;:*-;-", +">;>;>-;*+. o@o . . ..+. . . ;2>>; o;<->:>;>;:-::", +";>*=;;>&#. .+#O. +OO+OOo;;;>>;;;=# X%,2>-= O-<>-:;:-:==;;", +";--=;>-%o. .-2221<>>;$.O%=>>,<<2221222<:% .=2<:>* o-,>:;>->;==;;", +";;>>-;;$O. .1<>;::>;:.+O=1322<,,<,<,<,<&# .;2>:;& O&<->;;:;->;>;", +":>-;>-*@.. .2:;:>>;:> @O:2<;>->:->:>:;-%o .;3>-># Oo;*$#@@%%&=;-", +"%$%$%@o... .1>>>->;>$ Oo:3>:>;=>>;-;>->#o .-3>>;# @ ..ooooOoo@#@", +"@Oo... .2->;>>;=$ Oo:3->;:>-;=;>;;;+O .;3->;+ #. ..o", +" . OOo2>:->;>=$ .o:3;;>-;=;=;-;>;+O .-3>>-# #....... . ", +"o%%&;:;-;;o 2>*:;>--%. o;3>;-;=;=;>=;->@o .;3;>>+ #oXo+@+#@@#...", +"%;,21211<>* 2>>-=;>-%. o;2,:;>;>*=;=;>-#. .;1;;>+ O>21,;$#ooOoo@", +"%>1<<,>>:>X 3;:>=;>:&o O=1<>-;*;==>;>--+. .;2>;;@ O2-;,221222;.@", +"%2,>>->;>-* 3:>;>>->&O .+<2>>:;>->==;>&#. X;1;>;+ O2;->>-;>;--.+", +"%1,:->;>->* 3:-:>;>-%@ #>3>>:;;=;==>-*o. O;1>>-# o2>>-;>>->;$.o", +"%2>;>;>>=>+ 2>>>;;;>%+ .+;3,>;>-;:->;>$o .X;1:;>+ O<>;>>-;>;>$.o", +"%2>>;;::>-# 2,=:=>>:$# O&1,>;=:-;:;;;$. O;1;>+# O<>:>;>-;>:#.o", +"%1,;>>;>->@ <2-:>;;;$# O@,2>->;>;>-;%@. .o=>=+...X>>;>:;>;->#..", +"%2,>:;>;>;+ ,2=>-;;>&# .+;,>;=%$@oO.... .X#....Xo *+o@#@#@@#@..", +"%2>;>>->=>@ :1:=>>-;&# .@o;;$#o. .o+oo+@#@# .", +"%1,;-:>;>-# =2>:>-;>%+ +o. . . . . .o@#ooOoooOoo..........", +"%2,>>-:>;>@ #3;:;;>-%@ .ooo.....OoOX+OoOoo#@================*.+", +"%2>;;>->;&# o3>;-=;>&# X%=============;;;:>,><,<,<,,<,<,<,<=.+", +"%<,>>;>;>+ +3:;>;;-%#. .=<,<,<,<<,<,<,<,122333333333331211;% O", +"%1,;>;>>-# .X3;>=:->%+. =<<3333322332333332211,,,<,>,<,,<,=# +", +"%,,>;>-;;+ .o2>>->;;$#. =<<,<,<,<>,<>,<,,>>::;;>;>-;;>->;>&#..", +"O<-;>-*&*@ .o1-;>->;&#. %,2,;;-;;;>->>;;:>>>;=:->>:->;>>:;&@ .", +"o,>>:;#@@ Xo,>-;>;-*@. o<2,;;;>;:;:>-;:>>-:;:;;=-::;>->;>&#..", +"o===#@#@@ ..X::>-;;&%@. ,21>>-;;;=;->;:->:=-;>-;>;=*;=:;;*@ .", +"o. #@@# .XO=%$%%$%@@. .>11;->;>-;>;==::->;>;;>-;=;;->;*-&# .", +"@#@o. ..X........... ;1,>;;>->=;-:=:;:=>-;=;;;->;=;;-=&# .", +"oOoooOo. .O.. .-:&**&**&>;>>-;=-;;=;;>->;;>-;;;:&# .", +"o=>>>>;;%OO@.. . . . . .@o.. . . #*&=;===================%+ .", +"o><12122,>>;&$#O..........X#oo...... O@@#@#@#@#@@@#@#@@#@#@@@ ..", +"o>1>>;,1222,>>>>>>>:;;-==&%%+#oooXo.. . . . . . . .X", +"o>2>>>,>;>,222121212222<1<,>>>>>-O@o......... . . . . . . ...oO", +"o>2>->==>:;=>->;>;>>->;>>><1211,-.o+Ooo... .................XoO@", +"o><>>>;>;;;:>-;>=*;>=;-;>->;>>>=% .+O>12:=OOo@@@ooXoooXooXoo+#@@", +"o><>->==:>->>:-=>=;=:->;>;>->>:%@ .oo2>>2221,@@O,22122211<>:=Oo@", +"o>-%$%$%$%%$%$%%$%$%$%%$%$%$%$%#@. .o1,>,>,,,$#=2:>>;>->:>;>1: @", +"o;%............................... O,>,,:$:-%o,>;>->>>->;>->@ #", +"o. +.o.+%$%%$O2:::>>;:>::>;;+ #", +"@O... . . . . . . . . . . . X+#.. .@#@@@@@#+@#@#+# @", +"@#+@oooOOoOO.........................+#+@......+@ #", +"................................................................" +}; diff --git a/parse_map/textures/mossy.xpm b/parse_map/textures/mossy.xpm new file mode 100755 index 0000000..49c7742 --- /dev/null +++ b/parse_map/textures/mossy.xpm @@ -0,0 +1,95 @@ +/* XPM */ +static char *mossy[] = { +/* columns rows colors chars-per-pixel */ +"64 64 25 1 ", +" c #202020", +". c #2C2C2C", +"X c gray22", +"o c #404000", +"O c #585400", +"+ c #706C00", +"@ c #484848", +"# c gray33", +"$ c #646464", +"% c gray44", +"& c #7C7C7C", +"* c #848400", +"= c #9C9C00", +"- c #B4AC00", +"; c #CCC400", +": c #E4D800", +"> c #FCF420", +", c gray55", +"< c #989898", +"1 c gray66", +"2 c #B4B4B4", +"3 c #C0C0C0", +"4 c #D0D0D0", +"5 c gainsboro", +"6 c #ECECEC", +/* pixels */ +"................................................................", +"##########@5;;;;;555555---5 X,155555;;;%,,# @@@@@@@@@@##########", +"##########@54----<1;;433;;, X,32,;&;===+##X X%====&&&%$@@@@@@@@@", +",,,,,,,, #@54---+<;;=333*-$ X151,&;&+*+#&#X X=;:=+,23;;;$$;;,,,,", +"42-221,, #@54==*+<;=11<,,=# X,3,,,11$*+#%#X X=:-+$&25;::@$;;*&44", +"11--#%&% #@53=*+%&<1<=,%,*# X@1;=1,,&O#%##X X=:+$,2:;&==@$=*+@,<", +"2<+#,,,% @@54=++&1<<<=,<%,# X@&=*-,11%$%XXX X*=+$&;;;&+=@%$@@$-&", +"22&,1,%# X@54,&&<1<4&*<1,,# X@%,1,1,,,1%XXX.X*+$,,&;&&++@%&,%&*$", +"<11%%,@@ .@531<&<;<<,<,,1,# @#%%##XXXXXXX XX&$,&11&,1&@%,<,,1&$", +",,,,%#@@ .@561&<&;-%,,,1,,#. @@XXXXXXXXX XXX&22,=&<&&<$%<,<,,1,", +"%%%%#@XX .@55,&<<;=%1,1,1,#. X@X.. ..XXXX&2&=@,1:&,%,%<$%,$$", +"##@@@ .@151<&;-=%<,,&,%$X X@@@@%111155+XXX%2,&$$&=X##$@@@@@@@", +" ....X#,54,&,=%,,1&,=,#X X@%1>>555445;+XX#,%$$#@OXXXXXX.....", +".........X#%14,1,,,1,,<,$$#X .X1>;=,,1,1=%O XXXXXXXXXXX.. ", +"XXXXXXXXXX#@,41,1<%<,&,1*##X .@1;*&1,::,=#+XX..........XXXXXXXXX", +"#@XXXXXXXX#@%3,1<;=%1,1,+#%@ .@1:*&,;:&,*#OX@@#### @@@@@@@@@@@@@", +"<<<<<<<<<. #@33*,=*1%,,,%$## @::&&1::%,+#XX@:--$#@#&<<<<<<<<<<<", +"4;-55;=%%X #@,3+$<$,%%1,%,%@ @:&,&,=+$1,#XXX--*$.@&3;;;5-11;;;5", +";-*--=+#%X #@%<$$,,%,#,%#%#@ @&,&,:$$$###X X=*#$ @<;;;&:=&1;=*%", +"-*1-=*+#%X @#@<<%,$%%%%#%#@. .1,%,%#XXXXXX $=*%# @<;;&<==&<;=*%", +"*1,-=++##X @#@$##XXXXXX. .,%XXX $,*,# @<1&,<=&&1;=*<", +"1,1-+##,#X @#@.... .X#X ......,1,1# @,1<1<1&1&1=+%", +",1&&#%,%#X X##@X @@@@@@@,,<=====&#.X$3513$ @,,1:<,1<11&&<", +",;=&,,,$@X X,;;-=,222$X@$=;;;-4666;;;;-=* X&5351% @&<1<,1<:<&1<1", +",=*1,,,$@X X;--=&&&&&X#@=;-%<11<1<=&=*=*+ X,5113: @:1<1<::&1<<1<", +"<*,,,,%#XX X-=*$$$$$$ #@<6<<=<;1<<&1*&=+O X,:,,1= @=O%$:-*+O%%#%", +"$$$$$#@XXX X-*$$<*=+$ @@<6:1<;*<;;1<*1*$O X,-%,1+ @OXX@OOOO@@###", +"#@@XXX .X-*$<<&*+$ @@<6;1;=&<;*<1<<&$o X,%,15O @.. XX@", +" ...@@@6$<1*,*+$ X@<6-<;+&1<1<&-*&$o X:6151# @XXXX... ", +"@$$%,<,,,,@ 6<<1*,$&$o @<6-1=+&<&<1<-*&#o X-6331# @XXXXXXXXXXXXX", +"$,2--,1111$ 614,+1,&$o @<61;=+&<11<1-*,#o +=511-# @+===--**@@@@#", +"$2--*$1111@ 61<1&,&,$o @&<;=+%&1<<&<-*$#o X=55-=# @%=+===---* c #C0C0C0", +", c #D0D0D0", +"< c gainsboro", +"1 c #ECECEC", +"2 c gray99", +/* pixels */ +" ;;;;=======&&&&% ", +" ;;<<,,,>>>::;;--==*&&%#+## ", +" >22111<<<,,,>>::;-&>=*&%#+OooX ", +" 12222111222<<,>>::;--=**+#+Ooo.X ", +" <112222221<,>>::;;-=**&%%%%oOoX.XX ", +" <<1122211,,,>>;,;;-=**&%%#O+XX..XX ", +" ><<2122111<<,,>>::;-=*&%#+OXo..XXX ", +" >>211221122<<,>>;;-=*&%#OoX...XX ", +" :1122221<,>;:-=*&%#+OXoX.... ", +" :>>2221<,>:;-=*&%#+OoXX..X ", +" ->1221<,>:;-=*&#%+OoX..X ", +" ->1221<,>:;-=*&%#+OoX..X ", +" ->2221<,>:;=;*&%#+OXo..X ", +" ->2221<,>:=-;*&%#+OoX..X ", +" ->2221<,>:;-=*&%O%OoX..X ", +" ->2221<,>:;-=*&%#%OoX..X ", +" ->11<,>:;-=*&%#+O+X....X ", +" -=;:;;==*&&%%#+OoX...... ", +" <2<1221<,>:;-=*&#%+o.X ", +" ><2222<,>:;-=*&%#+#oXX.o ", +" ><2221<,,:;-*=&%#+OoX..X ", +" ->2221<:1:;-=&*%#+OoX..X ", +" ->2221<>1:;-=*&%#+OXo..X ", +" ->2221<,,:;-=*&#%+OoX .X ", +" ->2221<,>:;-=*&%#+X+X..X ", +" -;2221:2>:;-=*&%#+OoX..X ", +" -<2221<,>:;-*-&%#+oOX..X ", +" ->2221<:<:;-=*&%+#OoX..X ", +" ->2221<,>:;=-*&%#+OXo..X ", +" *-<1<,>:;-=*&%#+OoX..... ", +" *-;-==**&&%%#+OoX.. ", +" ;,22222><,>:;-=*&%#+oXXo ", +" ->2221<1>:;-=*&%#+OoX..X ", +" ->2221<,>:;=-*%*#+OXO .X ", +" ->2221<:1:;-=*&%#O+oX..X ", +" ->22<2<,>:;-=*&%+#Oo.X.X ", +" ->2121<:>;:-*=&%##OoX... ", +" ->2221:2>:;-=*&%#+oOX..X ", +" ->22212,>:;-=&*%#+OoX..X ", +" ->22<2<,>:;=-*&%#O+Xo..X ", +" ->2221<,:<;-=*&#%+OoX..X ", +" ->2221,1>:;-=&*%#+OXo..X ", +" *>1211<,>:--=*&%+#OoX..o ", +" ;,<>>>:;-&-&%#+OoX.... ", +" ;1:>,>-=*&#%%#+OoX...... ", +" -,212221<,>:=-=*&%#+o.XX ", +" ->2221<,>:;-*-&%#+OXO..X ", +" ->222,2,>-<-=*&%#+OoX..X ", +" ->2221<,>:;-*-&%+#OoX..X ", +" ->2221<,>:;-=*&#%+OoX..X ", +" ->2221<,>->-=*%&#+OoX..X ", +" ->2221<,;<;-=*&%#O#oX..X ", +" ->122,2,>:;-=*&%#+OoX..X ", +" ->122,2,>:;-=*&%+#OoX..X ", +" :<>2221<,>:-:=*&%#+OoXo..X ", +" :1122221<,>:;-=*&%#+OXoX...XX ", +" >>212221122<<,>>;;-=*&%#OoX...XXXO+@##$$%% ", +" ><<2122111<<,,>>::;-=*&%#+OXo..XXXooO++@##$%% ", +" <<1122211,,,>>::;;=;**&%%#O+XX..XXooooO++@#$$% ", +" <112222221<,>>::;;-=**&%%&%@@oX.XXooooO++@#$$% ", +" 12222111222<<,>>::;--=**&$O$oo.XoooOO+@@#$$% ", +" >22111<<<,,,>:,:;--=*=&%$+OooXOOO+++@#$$% ", +" ;;<<,,,>>>::;;--==*&&%#+OO+#$$$%%%%%% ", +" ;;;;=======&&&&%#OO+#$%% " +}; diff --git a/parse_map/textures/purplestone.xpm b/parse_map/textures/purplestone.xpm new file mode 100755 index 0000000..097cb9a --- /dev/null +++ b/parse_map/textures/purplestone.xpm @@ -0,0 +1,90 @@ +/* XPM */ +static char *purplestone[] = { +/* columns rows colors chars-per-pixel */ +"64 64 20 1 ", +" c #382C14", +". c gray22", +"X c #403018", +"o c #483818", +"O c #543C1C", +"+ c #5C4020", +"@ c #6C4824", +"# c #744C28", +"$ c #400040", +"% c #480048", +"& c #500050", +"* c #580058", +"= c #6C0070", +"- c #484848", +"; c gray33", +": c #646464", +"> c #80502C", +", c #840084", +"< c #9C009C", +"1 c #B400B4", +/* pixels */ +"===$$$$$*=,*=$$$$$$$======*$$$$$$$$$*=,,=**$$$$$$$$$$$$$********", +"+,,=$$$*=,==**$$$$$=,<@@@+=*$$$$$$&*=,,,,=,=$$$$$$$$$***=,,@@@@@", +"@+,,,=$*==*===*$$&*,<@@++++**&$$&&*&=,,,=,==*$$$$$$$***=,,@@@@@@", +"+++,=*****==**$%&&*,<@+,==+=*&&&**&*=,=,==***&&%&&%&&**=,@@@@OO*", +",+o=,=******&%%&&**=,,=*=,@=&*+++,=**=,=**++@+++OOoo&&&=,@@@X*O=", +",+o,,==*==,,,,,==***=,=,,=O&*+@@@+,=**=oo+@@@@@+++o+o&&=,=@+X=O,", +"=,+=,=,=,,,,@==,,==**=*,==X*+@@OO+,=*Xo@@#@@@+OOXOXX+o&*=,@+X,O=", +",,+,===,+#,@+=*===,=****=*o*@+O**O=*XO@#####@oOo$O**+Xo&*,@+X,O*", +"=,+=*=,+##@+O=****==*=**==+=++*,=o,=X@##>>##@o$o*O==O*o&&=+OX=O&", +"*=+*=,,##@++O=**=*****====O*++=,,X=X@Oo>>##@+X*X*O,,O=o*&*+OX,O&", +"**X==,<#@++Oo=*==+++Oo***=o&o*,==X&XO@=>#@@+OX***,,OO=oX*&*OX=*&", +"**X=,,<#++ooo=*=+@@@@+=****&o=,*=X%XOo=>@@+OOOX,*,OOOOoX=*&OX&*&", +"**X=,<<=+oX=X*=*@@+=+@,=*&%%X&&&&%%*Oo,@@+O*=OOX,,OooOoX==*OX&&%", +"**X=<,@@@+X&X&&+@+==,+,=&$$%&&*&&&*&Oo,@+O*=,=OX+@oXX,oX=,*&&&%%", +"***=,@@+==== %&+@+*,=+,=&%%&**=,,=&&oo,@*O=,,,@+@OX===oX=,=*&&%%", +"***=,@+=,<<, $&+@+*,*O=*%*ooo*====&%o*,@,O*oO@@@OX=,=*=oX==&%%%%", +"***=,@=,<,== $&@,O*=*o&&&+@@++o*=*%%o*,@,Oo@@@@@@OX==*,ooX=&%%%%", +"***==@=<,**$ $&@,o*=*X&*@>>>>@+**=%%X=,*,O@@@@OOOOX=,===oXX&%%&*", +"***==@=<*=,* %&,,=,=*&&,>@++++@O**&%X==**O@@OO O OX==**,=X&$&&&*", +"****==,=*,=* &*=,,=*&&*,+=1<,<+OoX*&X=,*OO@Oo *O*O =*=*,=X&%&**=", +"===**=,**==,=*=,==*&&*,@11<,,O,OOo**X==**O@O *=*=O =*=*==o&&====", +"@,,=*==*=**=,=***&&&=,@#,<,@OOXOXXX*o=***O,O ==** **=*&=*o*=,##@", +"@@+,=****=,**$$&**==,@#@@@@+X*=X*XXoOo**=O,o ***==*=*&&&oO,,##@@", +"++@o=**=,,,=*$$++X*=,@#=,@OO*=,*XXO+@+**==,X=****,=**&%$o+@@##@@", +"+OOo=,==,,,=&$O+Oo*=,@#=,@OX*,*XXoooOOO===,X,==,,=,=%$&&+@##,,,+", +"**oXX==,,,=*$&@=*o*=,@#@@OXX=,OooXXOOoOOX,===,,==*=$$%*=@##<,===", +"***oo=*===*o@@@*=XX=,@@=**==,,OoXo**=OOoXX=,==,=*&%$$%=,##<<,*=*", +",,,OO*,=**oOO+***X&=,,@=*=@@@OXXoOO,#@+@,1<@o=,,=,=*=,@@,o=*$**o+<,===,= $", +"%&*o=,,=,,=*,*&=,##@@@=<,+@o,=,==*=@@@,o=**oo+@#,=,===**", +"&%&X===*=,=**&==<=X=***@#@@+@@@,<,++=,=,==@@@@@@*oo++@#+==,==,=X", +"&%&X&****=***=*==X=,=*@@+O@O+@@@,<,+o====,@@++++@,,###+o**===,=X", +"%$% %&&&**==&*&%$X*=**,@O++oO+++=,,+o&**=@@++%&&*==+o*+o*=,,=,=X", +"$$$ %$%%&&***==%%X&*o@@@@+o+OOoo+@,+o%&**@+=O&**=,,+o=+o=,,=*=**", +"%$$$$%&&*******&&X o@OOo+o++ooooo++++o%&*O,=o*o++oX+,,=o,,O+o**X", +"&$$ %&**==,,,,,=*Xo@OOX oo+oo%**==OO++oX*o=,o=+OOoX+,==o=O+++o*X", +"%$%%&*=,,,@@@@@,=*o+OX% X%ooX*,==*ooooOo%X*=o,=o%oX+=**X,==OOo&&", +"%%%%&=,<<+@OOOO@,*o+X%% X%ooX=,,,,XX Oo&X%*X,=o%XX**=*X=*=ooo&&", +"%%%%*=,<<@*===OO=*o+X%%%X%%*X*=,,, X %oX**&%X==X%oo**,*X***ooo&&", +"&%%&*=,<*O=,=,=O=* ,,**,X*,*X*=,== %&X &*&%X&&X&OOX***X*=**+OO*", +"&%%&*=,OOXOO,=,o== *,,**X***X=*=*%% &=X %=%&X*&&*+=+X**X=**+>@@O", +"&%%&O@@@=,=====o=, *****XXXXX==***% =*X %&&*X==*,O,=XX*X**+>@++,", +"X&&=@@++@==,,XXXXXX**,*XooooooXXXXX X*X %=*=,,,=*XXXXXXXXX@>+=XX", +"XXX,@&=,O,*=XooooooooXXX+,++++OOOoooXXX =,==,,,oooOOOO+++@>+o,=X", +"XXXX+=,*oXXXo++@@+++ooooo+@#>#@@+++++OOooooXXXXoooO+@@@@@@+oXXXX", +":-.XXXXXXXXXXXXXXX.-::;.XXXXXXXXXXXXXXXXXXX.-;;-.XXXXXXXXXXXX.-:" +}; diff --git a/parse_map/textures/redbrick.xpm b/parse_map/textures/redbrick.xpm new file mode 100755 index 0000000..ec489b1 --- /dev/null +++ b/parse_map/textures/redbrick.xpm @@ -0,0 +1,96 @@ +/* XPM */ +static char *redbrick[] = { +/* columns rows colors chars-per-pixel */ +"64 64 26 1 ", +" c #202020", +". c #2C2C2C", +"X c gray19", +"o c #343434", +"O c gray22", +"+ c #400000", +"@ c #4C0000", +"# c #580000", +"$ c #640000", +"% c #700000", +"& c #7C0000", +"* c gray25", +"= c #484848", +"- c #4C4C4C", +"; c gray33", +": c gray36", +"> c #646464", +", c #880000", +"< c #980000", +"1 c #A40000", +"2 c #B00000", +"3 c #BC0000", +"4 c #C80000", +"5 c #D40000", +"6 c #E00000", +"7 c #EC0000", +/* pixels */ +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", +";O;=====;======;=O=======;;;;;;=========;;;;;;;====OOO==;;=====O", +"O775555555551==;775555555555555555551=O;77776666665555544443331=", +"=74225,15,41$.=;73,3,3,3&3<3<3&3&341%.=O51424224%4&424,21&4<41&.", +"=51&1,1<%1,%$.=;53,,1,%11%<11%<1%1<%#.=;511&$1,%,1&,11,1&,1#1%$.", +"=5&11%<11%1#+.=;5,31,1%1,1%1%,&1%<&%#.==5%1$,1$1%1&1,1$1<&1&1%@.", +"=41&,<&1%,1%+.=;33,1,,<1%,%1,%<&,%1%+.O=3%1&1,$1%%11%1,11&1#1,@.", +"=3&11%1<%<%#+.==34,1%1%1%1%<,%&1%<&%#.O=3<1$,1&,%,&1,1$1&,1&1%+.", +"=31%,#%&#%,%+.O;<<%%@,%%,%@%,%,%@,%%+.O=3%%#%%@,@%#,@%@,$@%,%,+.", +"=&$$$++++++++.O=&$$#########+++++++++.O=,$$$$$$$$$$#########+++.", +"==........ .O;=..... .. .....=;O........... .......", +";OOOO====OOOOO=O=======OOO;===OO======;O=;;;;:>>:;;==*O*;O;===;O", +"7555333333333331=;=7755555544444443333333333333333331=*;77555555", +"2,,2<&2&<,2$2,1+O=;7%24&3$,3,,4<1,&,1,1,1&4$4,<34<41+O=O74&2,2,2", +",1,1&,,$1,$,11%+.==52%1&11,1$1%$,1&1&1$11,$1,1%,1%1%+O=;42&1,&1<", +"%11,<$1&,,<$1,%+.O=5%1,<,,$,,%1,$1,&$&,,1#,&1%1%11%%+.*=4&111&1&", +"1,,1,&&,&1<$1$%+.O=5%11&1$,1$%1$,1&,&1$1,#1$1%,%1%1%+.O=42&1&1<&", +"%1$1%,&<$1$,11%+.=;52#1&1,$,#,%$1,&#&1$,#,1$,1%,1%1%+ O=2&11#1&,", +"%2$%@&%<%<%#<%%+.=;21%,#%<%,$%,#%<%<$,%,,#<%%,@%<%,%+ *;21&%#%<%", +"+@@@@@@@@@@@@+++O=;1$$$$$$$$$$$$$##################++ =O1$+$++$+", +"... ... ... .O=O=Oo......ooOOo... ... .....O=;=.......", +";;=OO=;O;O==OOOO==;===*O*O*O*===;O;=*OOO**==;*OO*===;=;O;*O*;===", +";775555555333333333333333331=;;77555555555533333333333333333331=", +";7,23&3&3&2,2,24,2,2,32$24%+O=;73%512,12,2<2&$1,%,1&,1<,1&,1#1+.", +"O72,1<1&%,11,<,1,$1%1,$,1%2+.=:53<1$1$,%<,$1$,1$1%1&1,1$1<&1&%+.", +"=3$11%,#1$1%1,<1$,1%,1,$&1%+.;>53&1&1$1%<1&1&1,$1%%1<%<,11&1#%+.", +"=32,1@1#%,1,%&1&,$&1$1,$1%#+.;:5%1%<,$,<%1$,$,1&,%,&1,1$1&,1&%+.", +";3%$1@,&1$1#1$1,$,1,$1$,&&2+.=;54%1%1,1,%1$1#%%@1@1#1@11,$@%,%+.", +"=41$%%%#%@%%,$,%%,%%$%<%<%%+.O;41%<%,#%%%%$,%,@1#%1@%,@1#1@1%%+.", +"=1<$$$$$$$$$$$$$$@@@@@@@@@++.O;1$$$$$$$$$$$$$$############+#&#+.", +"==O.................OOO......===........ .OOO. ...........", +";;;;;==O=OOO=;>>;;;===**OO*OO*;===;O;=;=*O*O*=;;==*O*===;O;===;O", +"33333333331=O;55555555333333333333333331=;;475555555553333333333", +"1212<42241+O=O51$1%11$1,11%1,$11$11%1&1+O=;51&1%11$1&,&1%1,1&1%1", +"1&,1<1&1,%+.=;5$1&,1&1<%1,,%,,1,$1%,1$1+O;;51#1%1,$1,1&,,<%<&<,%", +",&1<&1&<1%+.=O5$11&<1%1%1,1#1@,,1,%<1&1+O;>51&1%1,1,11&1%<,1<&1%", +"1,&1<1<&,%+O=;5<$1&1&#<,,,%,1$1,$,<%,1&+O;>5&11%1$11&&1&1,<<,&%,", +"1,&1&1&<1%+O==5$1&#<1%,,1,1%,@$<$1<%1&1+O=;41&11%1,,&1&1%<,1&,1%", +"%%,<%%<%%%+O==<$11#1&%1%1$1#,$1,$<%<1$&+.=;41#1%11,1,1&1%<%<&11%", +"++@@@@@@@++.==1$$$$$$$$$##############++.==1$$$$$$$$$$$$$$$####+", +"............=;=. ..OOO. .........O===....OO=O.. .......", +";=;O=OO==OOOO==OOO=====;;==OOO;===;O=O=O==;=;O;=;:>;-==O;=;=;O;O", +"O7555555533333333333333333333331O;O7755555555333333333333333331=", +";51,,1$11&<1&1%,1$1&1,1$1$11&%1+O=;711$1$1#1%1#1,#<,%1,&1&<%,1+.", +"=51$1,$1,<&1$,#1<$1#,<,$1&1&1%<+.==5,1$,$&#,#<&1#1$1%,%1,&<1$,+.", +"=5,$1$,%$1$1,&,1$<,,#&1@<#,$,,%+.O=5,1$$,1&#<1#1%%1%1&1%,$1+.", +"O51,1,$1,&<1&1#,1$1#,1#<1&111%&+.O=51$1,$1#1%<&&#,$1&,<,<&%1,1+.", +";51$,1$1$1$1$1%1$$1#,&1&,$<$,%1+ O;51$$1$#1#<#1$,%1%&1&<,$%+.", +"O41$1$,%,<&1,,,1<$,&#$1@1%<&1%1+ O;4%1$,$1#&1&#<%,$1%1%1&<%1$1+.", +";1$$$$$$$$$@@@@@@@@@@@@@@@@@@@@+.=;1$$$$$$$$$#####@@@@@@@@@@@++.", +"O=..........OOO. ... .. ..=O=...... .oOo. .... ......", +";O;O;=;====;>>;=;O;=;=*OOO*=;==O==;O;========-;;;-====OX XO==;=", +"555553333333333331=;=77555555553333333333333331=O;75555533333333", +"&1#11$<$1&4&1$1&1+.==51111$1@1&1$1$1<1$1$1#1%$+O=;51$,1#1%1%1$1%", +"1&&1&1$<&$1#&$,$,+.==5&1%1$%@&<&1,$,<$&,%,#1$1+o=;5$1#1%1%,1%1,@", +"1&#&1$<$&1,$<&+.=*5&&%1$&&1#1@11$1$1$,#,,$%+.=;5$1%%11,%,%$%,", +"&<#<$$1$1&1#&%$1$+.=*51@%1$1@1&<$1$,&$1$1,#%<$+.=;51$#1,%%1%1$%1", +"$1&1$1$,1$1&#,1&,+.=*5@11$1&%,#&@1$1$&&$,%#,%$+.==5$1,1%1,%%#1%1", +"$1&&$<<$<$$1$<+.==5@1%1$&&,@<$,@1&$1,$1#1#,+.O=5$1#%#1%1%#$1@", +"&<#1$$,$&&1#1$%,&+.=;41@%1$1@,$1$1%$1$&1$,%,$,+.O=4$$#1#1%1%1$1%", +"@@@@@@@@@@@@@@@@++.==1+++++@@@@@@@@@@@@@@@@@@++ =;1++@@@@@@@@@@@", +"...................=;=Ooo.............. . O==...... ..", +"O;O;OOO=====;;O====;;;;;===;===;==O===*OO*OO*=*O*;==O;====*O*===", +";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" +}; diff --git a/parse_map/textures/wood.xpm b/parse_map/textures/wood.xpm new file mode 100644 index 0000000..34bc923 --- /dev/null +++ b/parse_map/textures/wood.xpm @@ -0,0 +1,79 @@ +/* XPM */ +static char *_14002b063464ef8f2562fe527901c8e08YouUzmnCeigh4Y[] = { +/* columns rows colors chars-per-pixel */ +"64 64 9 1 ", +" c #28200C", +". c #382C14", +"X c #403018", +"o c #483818", +"O c #543C1C", +"+ c #5C4020", +"@ c #6C4824", +"# c #744C28", +"$ c #905C34", +/* pixels */ +"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", +"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@", +"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", +"OOOOOOO.O .OOOOOOOOOOOOOO.O .OOOO.O .OOOOOO.O .OOOOOOOOOOO.O .OO", +"oo@####O$ O$+oooo##o@o@ooO$ O$#o#O$ O$+ooo+O$ O$o#oo#o#o##O$ O$@", +"oo@###+O$ O$@oooO##o@o@ooO$ O$#o#O$ O$#+o+#O$ O$o#oo#o#o##O$ O$@", +"oo+###OO$ O$#OooO##o@o@ooO$ O$@o#O$ O$##+##O$ O$o#oo#o#o##O$ O$@", +"OoO@##OO$ O$#Ooo+#@o@o@ooO$ O$@o#O$ O$#####O$ O$o#oo#o#o##O$ O$@", +"@oo+#+oO$ O$#+oO@#@o@o@ooO$ O$@o#O$ O$#####O$ O$o#oo#o#o@#O$ O$O", +"@oOo+OoO$ O$#@o+##+o@o@ooO$ O$+o#O$ O$#####O$ O$o#oo#o#o@#O$ O$O", +"#OooOooO$ O$##+@##+o@o@ooO$ O$+o#O$ O$#####O$ O$o#oo#o#o+#O$ O$O", +"#OooooOO$ O$##@###Oo@o@ooO$ O$oo#O$ O$#####O$ O$o#oo#o#o+#O$ O$o", +"@#oooO#O$ O$##@###Oo@o@ooO$ O$o+#O$ O$@####O$ O$o#oo#o#Oo#O$ O$o", +"@#OooO#O$ O$#####@oo@o@ooO$ O$o+#O$ O$@###@O$ O$o#oo#o#Oo#O$ O$o", +"+##oO##O$ O$#####@oo@o@ooO$ O$o##O$ O$+###@O$ O$o#oo#o#Oo#O$ O$o", +"O###O#+O$ O$@####@oo@o@ooO$ O$+##O$ O$o@#@+O$ O$o#oo#o#Oo#O$ O$O", +"o@##+#OO$ O$@####+oo@o@ooO$ O$+#@O$ O$o+@+oO$ O$o#oo#o#+o#O$ O$O", +"o@####OO$ O$+####+oo@o@ooO$ O$##@O$ O$oo+ooO$ O$o#oo#o#+o@O$ O$O", +"o+@###oO$ O$+####Ooo@o@ooO$ O$##+O$ O$oooooO$ O$o#oo#o#@o@O$ O$@", +"oO@##+oO$ O$O@###OoO@o@ooO$ O$#@+O$ O$oooooO$ O$o#oo#o#@o@O$ O$@", +"oo+##OoO$ O$O@##@ooO@o@ooO$ O$#@oO$ O$oooooO$ O$o#oo#o#@o+O$ O$@", +"ooO##OoO$ O$o+##@ooO@o@ooO$ O$#+oO$ O$+ooo+O$ O$o#oo#o##o+O$ O$@", +"OoO+OooO$ O$o+##+oo+@o@ooO$ O$@ooO$ O$@+o+@O$ O$o#oo#o@#ooO$ O$@", +"OooOooOO$ O$oO@@+oo+@o@ooO$ O$+ooO$ O$#@+@#O$ O$o#oo#o@#OoO$ O$@", +"OoooooOO$ O$oO++Ooo++o@ooO$ O$oooO$ O$##@##O$ O$o#oo#o+#OoO$ O$+", +"@ooooo@O$ O$ooOOooo@Oo@ooO$ O$oooO$ O$#####O$ O$o#oo#o+#+oO$ O$O", +"@ooooo@O$ O$ooooooo@Oo@ooO$ O$ooOO$ O$#####O$ O$o#oo#oO#+oO$ O$O", +"@OoooO+O$ O$ooooooO#oo@ooO$ O$ooOO$ O$#####O$ O$o#oo#oO#@OO$ O$o", +"+OoooOOO$ O$oooooo+#oo@ooO$ O$oo+O$ O$@####O$ O$o#oo#oO#@OO$ O$o", +"O@ooo@OO$ O$oooooo+#oo@ooO$ O$oo@O$ O$@####O$ O$o#oo#oo##+o$ O$o", +"O@Ooo@oO$ O$oooooo@#oo@ooO$ O$oO@O$ O$+###@O$ O$o#oo#oo##+O$ O$o", +"o+Oo@+oO$ O$Oooooo@#oo@ooO$ O$o+#O$ O$+@##@O$ O$o#oo#oo@#@O$ O$o", +"oO@O@OoO$ O$+ooooO#@oO@ooO$ O$O@#O$ O$o@##+O$ O$o#oo#oo@#@O$ O$o", +"oO@O@OoO$ O$@Oooo+#@oO@ooO$ O$+##O$ O$o+#@oO$ O$o#oo#Oo+##O$ O$o", +"oo+@+ooO$ O$#+ooO+#+o+@ooO$ O$@##O$ O$oo@+oO$ O$o#oo#Oo+##O$ O$O", +"ooO+OooO$ O$#@OoO##Oo+@ooO$ O$###O$ O$oo+ooO$ O$o#oo#OoO##O$ O$O", +"oooOoooO$ O$##+o+##Oo+@ooO$ O$##@O$ O$oooooO$ O$o#oo#OoO##O$ O$+", +"oooooooO$ O$###+###oo@@ooO$ O$##@O$ O$oooooO$ O$o#oo#+oO##O$ O$@", +"ooooooOO$ O$######@oo@@ooO$ O$##+O$ O$oooooO$ O$o#oo#+oo@#O$ O$@", +"OoooooOO$ O$@#####@oo#@ooO$ O$#@+O$ O$+ooooO$ O$o#oo#@oo@#O$ O$@", +"Oooooo+O$ O$@#####+oo#@ooO$ O$#@oO$ O$+ooooO$ O$o#oo@@oo+#O$ O$O", +"@OoooO+O$ O$+#####Ooo#+ooO$ O$#+oO$ O$@+oo+O$ O$o#oo@#oo+#O$ O$O", +"@OoooO@O$ O$O#####ooo#+ooO$ O$@+oO$ O$#+o++O$ O$o#oo+#OoO@O$ O$o", +"@+OoO+@O$ O$o@###@ooO#oooO$ O$@ooO$ O$#@++@O$ O$o#oo+#OoO@O$ O$o", +"@@OOO@+O$ O$o+###+oo+#oooO$ O$+ooO$ O$##+@#O$ O$o#ooO#OoO+O$ O$o", +"+@+O+@OO$ O$oO@#@Ooo@#oooO$ O$oooO$ O$##@##O$ O$o#ooO#+oo+O$ O$o", +"O@@+@@OO$ O$ooO@+ooo@#oooO$ O$ooOO$ O$#####O$ O$o#ooO#+OoOO$ O$o", +"O@@+@@oO$ O$oooOOooo#@oooO$ O$ooOO$ O$#####O$ O$o#ooO#@OoOO$ O$o", +"o@###@oO$ O$OooooooO#@oooO$ O$oo+O$ O$####@O$ O$o#ooo#@OoOO$ O$o", +"o+###@oO$ O$Ooooooo+#+oooO$ O$oO@O$ O$@###@O$ O$o#ooo@#+ooO$ O$o", +"oO@##@oO$ O$+oooooo@#+oooO$ O$o+#O$ O$@###+O$ O$o#ooo@#+OoO$ O$o", +"oO@##+oO$ O$@Oooooo@#ooooO$ O$O@#O$ O$+###+O$ O$o#ooo+#@OoO$ O$O", +"oo+#@+oO$ O$#OooooO#@ooooO$ O$@##O$ O$+##@OO$ O$o#ooo+#@+oO$ O$O", +"ooO@@OoO$ O$#+oooo+#@oo+oO$ O$###O$ O$O@#@OO$ O$o#OooO@#+OO$ O$+", +"ooO@+OoO$ O$@@Oooo@#+oo+oO$ O$###O$ O$O@#+oO$ O$o#OooO+#@OO$ O$+", +"ooo++ooO$ O$@#OooO@#ooo@oO$ O$###O$ O$o+@OoO$ O$o#Oooo+#@OO$ O$@", +"oooOOooO$ O$+#@OoO##ooo@oO$ O$###O$ O$oO+ooO$ O$o#OoooO@#OO$ O$@", +"OoooooOO$ O$o@#@O##@ooo@oO$ O$###O$ O$ooOooO$ O$o@+oooO+#@O$ O$#", +"OoooooOO$ O$o+#####+ooo#oO$ O$##@O$ O$oooooO$ O$o@@oooo+#@O$ O$#", +"+ooooo@O$ O$oo####@ooo+#oO$ O$##@O$ O$oooooO$ O$o+@OoooO@@O$ O$#", +"+OoooO@O$ O$oo+@#@+ooo@#oO$ O$#@+O$ O$oooooO$ O$o+#Ooooo++O$ O$#", +"@OoooO@O$ O$ooo+@+oooo@#oO$ O$#@+O$ O$oooooO$ O$oo#OoooooOO$ O$#", +"@+oooO@O$ O$oooo+oooo@##+O$ O$@+oO$ O$oooooO$ O$+o#+ooooooO$ O$#", +"+++++++O$ O$+ooooooo+++++O$ O$+ooO$ O$+ooo+O$ O$+o++ooooooO$ O$+" +}; From 0e923ec04ec608faea3643485f7aed4743cfe6c9 Mon Sep 17 00:00:00 2001 From: Ko-HyeJi Date: Wed, 21 Dec 2022 20:11:38 +0900 Subject: [PATCH 2/5] parse map --- parse_map/libft/ft_atoi.c | 11 +++++++++-- parse_map/map/parse_map.c | 21 ++------------------- parse_map/map/parsing_test | Bin 0 -> 169952 bytes parse_map/map/test_map.cub | 2 +- 4 files changed, 12 insertions(+), 22 deletions(-) create mode 100755 parse_map/map/parsing_test diff --git a/parse_map/libft/ft_atoi.c b/parse_map/libft/ft_atoi.c index e5e5e30..80f429b 100644 --- a/parse_map/libft/ft_atoi.c +++ b/parse_map/libft/ft_atoi.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* ft_atoi.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: hyko +#+ +:+ +#+ */ +/* By: hyko +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/01/03 19:07:53 by hyko #+# #+# */ -/* Updated: 2022/01/17 02:15:36 by hyko ### ########.fr */ +/* Updated: 2022/12/21 18:17:47 by hyko ### ########.fr */ /* */ /* ************************************************************************** */ @@ -38,5 +38,12 @@ int ft_atoi(const char *str) return (0); i++; } + while (str[i]) + { + if (!((9 <= str[i] && str[i] <= 13) || str[i] == 32 || str[i] == 0)) { + return (-1); + } + i++; + } return (result * sign); } diff --git a/parse_map/map/parse_map.c b/parse_map/map/parse_map.c index d62e392..1ac7974 100644 --- a/parse_map/map/parse_map.c +++ b/parse_map/map/parse_map.c @@ -11,8 +11,8 @@ void is_cub_file(const char* filename) static void is_valid_texture(char* path, int type, t_all* all) { - int img_width = 50; //나중에 헤더에 정의 - int img_height = 50; + int img_width = 64; //나중에 헤더에 정의 + int img_height = 64; int e_flag; void* tmp; @@ -39,18 +39,6 @@ static void is_valid_texture(char* path, int type, t_all* all) display_err_msg_and_exit("Duplicate Elements"); } -static int is_digit_or_space(char* str) -{ - int i; - - i = 0; - while (str[i] && ft_strchr(" \n0123456789", str[i])) - i++; - if (i != (int)ft_strlen(str)) - return (1); - return (0); -} - static void free_double_pointer(char** arr) { int i; @@ -84,11 +72,6 @@ static void is_valid_color(char* color, int type, t_all* all) i = 0; while (i < 3) { - if (is_digit_or_space(tmp[i])) - { - free_double_pointer(tmp); - display_err_msg_and_exit("Invalid color information"); - } rgb[i] = ft_atoi(tmp[i]); if (rgb[i] < 0 || rgb[i] > 255) display_err_msg_and_exit("Invalid color information"); diff --git a/parse_map/map/parsing_test b/parse_map/map/parsing_test new file mode 100755 index 0000000000000000000000000000000000000000..24dbbd83f23de26b366a310d35a916ce6efc03ed GIT binary patch literal 169952 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 literal 0 HcmV?d00001 diff --git a/parse_map/map/test_map.cub b/parse_map/map/test_map.cub index 55d5792..02cb9cd 100644 --- a/parse_map/map/test_map.cub +++ b/parse_map/map/test_map.cub @@ -2,7 +2,7 @@ WE ../textures/barrel.xpm EA ../textures/barrel.xpm -F 220 ,100 , 0 +F 220 ,100 , 0 C 225 ,30 , 0 NO ../textures/barrel.xpm From 9ee30d6b2cf6adc30c4965ba043a0c9744e6d4dc Mon Sep 17 00:00:00 2001 From: Ko-HyeJi Date: Wed, 21 Dec 2022 21:55:19 +0900 Subject: [PATCH 3/5] [Add] Map Parsing --- parse_map/.DS_Store => .DS_Store | Bin 6148 -> 6148 bytes .../get_next_line.c | 0 .../get_next_line.h | 0 .../get_next_line_utils.c | 0 jk/Makefile | 12 +- jk/cub3D | Bin 0 -> 194672 bytes jk/cub3d.h | 36 +- jk/main.c | 13 +- parse_map/map/parse_map.c => jk/map_info.c | 12 +- jk/map_parse.c | 63 - parse_map/map/map.c => jk/parse_map.c | 48 +- {parse_map/libft => libft}/Makefile | 0 {parse_map/libft => libft}/ft_atoi.c | 0 {parse_map/libft => libft}/ft_bzero.c | 0 {parse_map/libft => libft}/ft_calloc.c | 0 {parse_map/libft => libft}/ft_isalnum.c | 0 {parse_map/libft => libft}/ft_isalpha.c | 0 {parse_map/libft => libft}/ft_isascii.c | 0 {parse_map/libft => libft}/ft_isdigit.c | 0 {parse_map/libft => libft}/ft_isprint.c | 0 {parse_map/libft => libft}/ft_itoa.c | 0 {parse_map/libft => libft}/ft_lstadd_back.c | 0 {parse_map/libft => libft}/ft_lstadd_front.c | 0 {parse_map/libft => libft}/ft_lstclear.c | 0 {parse_map/libft => libft}/ft_lstdelone.c | 0 {parse_map/libft => libft}/ft_lstiter.c | 0 {parse_map/libft => libft}/ft_lstlast.c | 0 {parse_map/libft => libft}/ft_lstmap.c | 0 {parse_map/libft => libft}/ft_lstnew.c | 0 {parse_map/libft => libft}/ft_lstsize.c | 0 {parse_map/libft => libft}/ft_memchr.c | 0 {parse_map/libft => libft}/ft_memcmp.c | 0 {parse_map/libft => libft}/ft_memcpy.c | 0 {parse_map/libft => libft}/ft_memmove.c | 0 {parse_map/libft => libft}/ft_memset.c | 0 {parse_map/libft => libft}/ft_putchar_fd.c | 0 {parse_map/libft => libft}/ft_putendl_fd.c | 0 {parse_map/libft => libft}/ft_putnbr_fd.c | 0 {parse_map/libft => libft}/ft_putstr_fd.c | 0 {parse_map/libft => libft}/ft_split.c | 0 {parse_map/libft => libft}/ft_strchr.c | 0 {parse_map/libft => libft}/ft_strdup.c | 0 {parse_map/libft => libft}/ft_striteri.c | 0 {parse_map/libft => libft}/ft_strjoin.c | 0 {parse_map/libft => libft}/ft_strlcat.c | 0 {parse_map/libft => libft}/ft_strlcpy.c | 0 {parse_map/libft => libft}/ft_strlen.c | 0 {parse_map/libft => libft}/ft_strmapi.c | 0 {parse_map/libft => libft}/ft_strncmp.c | 0 {parse_map/libft => libft}/ft_strnstr.c | 0 {parse_map/libft => libft}/ft_strrchr.c | 0 {parse_map/libft => libft}/ft_strtrim.c | 0 {parse_map/libft => libft}/ft_substr.c | 0 {parse_map/libft => libft}/ft_tolower.c | 0 {parse_map/libft => libft}/ft_toupper.c | 0 {parse_map/libft => libft}/libft.h | 0 {jk => map}/map.cub | 2 +- {jk => map}/map2.cub | 0 {parse_map/map => map}/test_map.cub | 0 parse_map/get_next_line/README.md | 1 - parse_map/libft/README.md | 1 - parse_map/map/Makefile | 32 - parse_map/map/cub3d.h | 163 - parse_map/map/error.c | 2 - parse_map/map/map.h | 25 - parse_map/map/parsing_test | Bin 169952 -> 0 bytes parse_map/mlx/Makefile | 24 - parse_map/mlx/font.c | 3525 ----------------- parse_map/mlx/font.xcf | Bin 52570 -> 0 bytes parse_map/mlx/mlx.h | 149 - parse_map/mlx/mlx_init_loop.m | 192 - parse_map/mlx/mlx_int.h | 102 - parse_map/mlx/mlx_int_str_to_wordtab.c | 107 - parse_map/mlx/mlx_mouse.m | 52 - parse_map/mlx/mlx_new_image.m | 198 - parse_map/mlx/mlx_new_window.h | 57 - parse_map/mlx/mlx_new_window.m | 766 ---- parse_map/mlx/mlx_opengl.h | 21 - parse_map/mlx/mlx_opengl.m | 57 - parse_map/mlx/mlx_png.c | 418 -- parse_map/mlx/mlx_png.h | 4 - parse_map/mlx/mlx_rgb.c | 763 ---- parse_map/mlx/mlx_shaders.c | 240 -- parse_map/mlx/mlx_xpm.c | 338 -- {parse_map/textures => textures}/barrel.xpm | 0 .../textures => textures}/bluestone.xpm | 0 .../textures => textures}/colorstone.xpm | 0 {parse_map/textures => textures}/eagle.xpm | 0 .../textures => textures}/greenlight.xpm | 0 .../textures => textures}/greystone.xpm | 0 {parse_map/textures => textures}/mossy.xpm | 0 {parse_map/textures => textures}/pillar.xpm | 0 .../textures => textures}/purplestone.xpm | 0 {parse_map/textures => textures}/redbrick.xpm | 0 {parse_map/textures => textures}/wood.xpm | 0 95 files changed, 78 insertions(+), 7345 deletions(-) rename parse_map/.DS_Store => .DS_Store (82%) rename {parse_map/get_next_line => get_next_line}/get_next_line.c (100%) rename {parse_map/get_next_line => get_next_line}/get_next_line.h (100%) rename {parse_map/get_next_line => get_next_line}/get_next_line_utils.c (100%) create mode 100755 jk/cub3D rename parse_map/map/parse_map.c => jk/map_info.c (91%) delete mode 100644 jk/map_parse.c rename parse_map/map/map.c => jk/parse_map.c (66%) rename {parse_map/libft => libft}/Makefile (100%) rename {parse_map/libft => libft}/ft_atoi.c (100%) rename {parse_map/libft => libft}/ft_bzero.c (100%) rename {parse_map/libft => libft}/ft_calloc.c (100%) rename {parse_map/libft => libft}/ft_isalnum.c (100%) rename {parse_map/libft => libft}/ft_isalpha.c (100%) rename {parse_map/libft => libft}/ft_isascii.c (100%) rename {parse_map/libft => libft}/ft_isdigit.c (100%) rename {parse_map/libft => libft}/ft_isprint.c (100%) rename {parse_map/libft => libft}/ft_itoa.c (100%) rename {parse_map/libft => libft}/ft_lstadd_back.c (100%) rename {parse_map/libft => libft}/ft_lstadd_front.c (100%) rename {parse_map/libft => libft}/ft_lstclear.c (100%) rename {parse_map/libft => libft}/ft_lstdelone.c (100%) rename {parse_map/libft => libft}/ft_lstiter.c (100%) rename {parse_map/libft => libft}/ft_lstlast.c (100%) rename {parse_map/libft => libft}/ft_lstmap.c (100%) rename {parse_map/libft => libft}/ft_lstnew.c (100%) rename {parse_map/libft => libft}/ft_lstsize.c (100%) rename {parse_map/libft => libft}/ft_memchr.c (100%) rename {parse_map/libft => libft}/ft_memcmp.c (100%) rename {parse_map/libft => libft}/ft_memcpy.c (100%) rename {parse_map/libft => libft}/ft_memmove.c (100%) rename {parse_map/libft => libft}/ft_memset.c (100%) rename {parse_map/libft => libft}/ft_putchar_fd.c (100%) rename {parse_map/libft => libft}/ft_putendl_fd.c (100%) rename {parse_map/libft => libft}/ft_putnbr_fd.c (100%) rename {parse_map/libft => libft}/ft_putstr_fd.c (100%) rename {parse_map/libft => libft}/ft_split.c (100%) rename {parse_map/libft => libft}/ft_strchr.c (100%) rename {parse_map/libft => libft}/ft_strdup.c (100%) rename {parse_map/libft => libft}/ft_striteri.c (100%) rename {parse_map/libft => libft}/ft_strjoin.c (100%) rename {parse_map/libft => libft}/ft_strlcat.c (100%) rename {parse_map/libft => libft}/ft_strlcpy.c (100%) rename {parse_map/libft => libft}/ft_strlen.c (100%) rename {parse_map/libft => libft}/ft_strmapi.c (100%) rename {parse_map/libft => libft}/ft_strncmp.c (100%) rename {parse_map/libft => libft}/ft_strnstr.c (100%) rename {parse_map/libft => libft}/ft_strrchr.c (100%) rename {parse_map/libft => libft}/ft_strtrim.c (100%) rename {parse_map/libft => libft}/ft_substr.c (100%) rename {parse_map/libft => libft}/ft_tolower.c (100%) rename {parse_map/libft => libft}/ft_toupper.c (100%) rename {parse_map/libft => libft}/libft.h (100%) rename {jk => map}/map.cub (80%) rename {jk => map}/map2.cub (100%) rename {parse_map/map => map}/test_map.cub (100%) delete mode 100644 parse_map/get_next_line/README.md delete mode 100644 parse_map/libft/README.md delete mode 100644 parse_map/map/Makefile delete mode 100644 parse_map/map/cub3d.h delete mode 100644 parse_map/map/error.c delete mode 100644 parse_map/map/map.h delete mode 100755 parse_map/map/parsing_test delete mode 100644 parse_map/mlx/Makefile delete mode 100644 parse_map/mlx/font.c delete mode 100644 parse_map/mlx/font.xcf delete mode 100644 parse_map/mlx/mlx.h delete mode 100644 parse_map/mlx/mlx_init_loop.m delete mode 100644 parse_map/mlx/mlx_int.h delete mode 100644 parse_map/mlx/mlx_int_str_to_wordtab.c delete mode 100644 parse_map/mlx/mlx_mouse.m delete mode 100644 parse_map/mlx/mlx_new_image.m delete mode 100644 parse_map/mlx/mlx_new_window.h delete mode 100644 parse_map/mlx/mlx_new_window.m delete mode 100644 parse_map/mlx/mlx_opengl.h delete mode 100644 parse_map/mlx/mlx_opengl.m delete mode 100644 parse_map/mlx/mlx_png.c delete mode 100644 parse_map/mlx/mlx_png.h delete mode 100644 parse_map/mlx/mlx_rgb.c delete mode 100644 parse_map/mlx/mlx_shaders.c delete mode 100644 parse_map/mlx/mlx_xpm.c rename {parse_map/textures => textures}/barrel.xpm (100%) rename {parse_map/textures => textures}/bluestone.xpm (100%) rename {parse_map/textures => textures}/colorstone.xpm (100%) rename {parse_map/textures => textures}/eagle.xpm (100%) rename {parse_map/textures => textures}/greenlight.xpm (100%) rename {parse_map/textures => textures}/greystone.xpm (100%) rename {parse_map/textures => textures}/mossy.xpm (100%) rename {parse_map/textures => textures}/pillar.xpm (100%) rename {parse_map/textures => textures}/purplestone.xpm (100%) rename {parse_map/textures => textures}/redbrick.xpm (100%) rename {parse_map/textures => textures}/wood.xpm (100%) diff --git a/parse_map/.DS_Store b/.DS_Store similarity index 82% rename from parse_map/.DS_Store rename to .DS_Store index 1c72608f5a7dba59b19bdf8ef50503d0fd024973..02702df71eaeb3322ee1205c5cabd0932912bfdd 100644 GIT binary patch delta 161 zcmZoMXfc=&!NZWpkjhZOP{I(;kh9s4c{$@`0}&Q=UWRm_Fh~$dnjsU!ODZoeNXp4i zVqjqSI$4Qnu6R-ckjcQn$-x;fAW>ayVq&SIU}R}A`8tz4)1kwYe=x~w9|6kaF|sVU XC@&{JFCD0g5$J|ZESuRm{_+C=jrb^X delta 113 zcmZoMXfc=&!Bbq2l#`#tz`*b=sbF&=^K!5*mOi z85lS@IO7E*tE&x7Oe}R2%uEa?zhaVSI(%d@H?utVQJ?~-{>`4u`&cG6sBdQH_{$Ff DFryz< diff --git a/parse_map/get_next_line/get_next_line.c b/get_next_line/get_next_line.c similarity index 100% rename from parse_map/get_next_line/get_next_line.c rename to get_next_line/get_next_line.c diff --git a/parse_map/get_next_line/get_next_line.h b/get_next_line/get_next_line.h similarity index 100% rename from parse_map/get_next_line/get_next_line.h rename to get_next_line/get_next_line.h diff --git a/parse_map/get_next_line/get_next_line_utils.c b/get_next_line/get_next_line_utils.c similarity index 100% rename from parse_map/get_next_line/get_next_line_utils.c rename to get_next_line/get_next_line_utils.c diff --git a/jk/Makefile b/jk/Makefile index 109be19..04fa4a1 100644 --- a/jk/Makefile +++ b/jk/Makefile @@ -9,14 +9,18 @@ SRC = main.c \ playeronmap.c \ draw_ray.c \ key.c \ - map_parse.c \ get_next_line.c \ get_next_line_util.c \ - 3d_render.c + 3d_render.c \ + parse_map.c \ + map_info.c + OBJ = $(SRC:.c=.o) MLX_FLAGS = -I. -L../mlx -lmlx -framework OpenGL -framework Appkit +LIB = -L../libft -lft + all : $(NAME) .c.o : @@ -25,7 +29,7 @@ all : $(NAME) # $(CC) $(CCFLAGS) $(MLX_FLAGS) -c $< -o $@ $(NAME) : $(OBJ) - $(CC) $(CCFLAGS) $(MLX_FLAGS) $(OBJ) -o $(NAME) + $(CC) $(CCFLAGS) $(MLX_FLAGS) $(OBJ) -o $(NAME) $(LIB) # $(CC_M1) $(CCFLAGS) $(MLX_FLAGS) $(OBJ) -o $(NAME) clean : @@ -38,4 +42,4 @@ re : make fclean make all -.PHONY : all clean fclean re \ No newline at end of file +.PHONY : all clean fclean re diff --git a/jk/cub3D b/jk/cub3D new file mode 100755 index 0000000000000000000000000000000000000000..9aac2510ae9756464e72b260e51901473b6ef118 GIT binary patch literal 194672 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 #include #include @@ -93,6 +95,30 @@ typedef struct s_point double y; } t_point; +typedef struct s_map_info //map 구조체에 합칠지 고민중...(hyko) +{ + void* no; + void* so; + void* we; + void* ea; + int f; + int c; + char** tile; + int info_cnt; + int tile_cnt; +} t_map_info; + +typedef enum e_type +{ + NO, + SO, + WE, + EA, + F, + C, + TILE, +} t_type; + typedef struct s_all { t_mlx mlx; @@ -101,6 +127,7 @@ typedef struct s_all t_key key; t_ray ray; t_map map; + t_map_info map_info; } t_all; #define MINI_SCALE 0.25 @@ -119,7 +146,7 @@ typedef struct s_all #define RAY_RANGE (PI / 3.0) // player 시야범위. 무난하게 60도 #define RAY_COUNT 121 // 광선의 갯수. 2보다 커야하고 홀수 추천 -#define BUFFER_SIZE 333 +// #define BUFFER_SIZE 333 #define FOV_ANGLE 60 * (PI / 180.0) #define WALL_STRIP_WIDTH WINDOW_WID / RAY_COUNT @@ -179,4 +206,9 @@ void render_3d(t_all *p_all); void draw_ceiling(t_all *p_all, int ray_num, int wall_top_pixel, int color); void draw_floor(t_all *p_all, int ray_num, int wall_bottom_pixel, int color); -#endif \ No newline at end of file +void parse_map(int argc, char** argv, t_all* all); +void is_cub_file(const char* filename); +void check_type(char* line, t_all *all); +void display_err_msg_and_exit(const char* err_msg); + +#endif diff --git a/jk/main.c b/jk/main.c index 2bb6c04..72bf0a6 100644 --- a/jk/main.c +++ b/jk/main.c @@ -2,6 +2,7 @@ int ft_loop(t_all *p_all)//이름 수정할거임 { + printf("[debug: stop here]\n"); update_player(p_all); render_map(p_all); render_player(p_all); @@ -12,20 +13,16 @@ int ft_loop(t_all *p_all)//이름 수정할거임 int main(int argc, char **argv) { - if (argc != 2) - { - printf("'2' arguments needed.\n"); - return (0); - }//메시지, 반환값 수정! t_all s_all; - init_map(argv[1], &s_all); + init_player(&s_all); s_all.mlx.mlx = mlx_init(); - s_all.mlx.win = mlx_new_window(s_all.mlx.mlx, WINDOW_WID, WINDOW_HEI, "title"); + s_all.mlx.win = mlx_new_window(s_all.mlx.mlx, WINDOW_WID, WINDOW_HEI, "jeeko's cub3d"); s_all.img.img = mlx_new_image(s_all.mlx.mlx, WINDOW_WID, WINDOW_HEI); s_all.img.data = (int *)mlx_get_data_addr(s_all.img.img, &(s_all.img.bpp), &(s_all.img.size_line), &(s_all.img.endian)); + parse_map(argc, argv, &s_all); mlx_hook(s_all.mlx.win, X_EVENT_KEY_PRESS, 0, &key_press, &s_all); mlx_hook(s_all.mlx.win, X_EVENT_KEY_RELEASE, 0, &key_release, &s_all); @@ -33,4 +30,4 @@ int main(int argc, char **argv) mlx_loop(s_all.mlx.mlx); return (0); -} \ No newline at end of file +} diff --git a/parse_map/map/parse_map.c b/jk/map_info.c similarity index 91% rename from parse_map/map/parse_map.c rename to jk/map_info.c index 1ac7974..ccc6ac7 100644 --- a/parse_map/map/parse_map.c +++ b/jk/map_info.c @@ -1,4 +1,4 @@ -#include "map.h" +#include "cub3d.h" void is_cub_file(const char* filename) { @@ -97,7 +97,8 @@ static void is_valid_tile(char* line, t_all* all) display_err_msg_and_exit("Invalid map"); i++; } - all->map_info.tile[all->map_info.tile_cnt] = line; + // all->map_info.tile[all->map_info.tile_cnt] = line; + all->map.dp_map[all->map_info.tile_cnt] = line; if (all->map.col < (ft_strlen(line) - 1)) all->map.col = ft_strlen(line) - 1; all->map_info.tile_cnt++; @@ -112,7 +113,7 @@ void check_type(char* line, t_all *all) i++; if (line[i] == '\n' && (all->map_info.tile_cnt == 0 || all->map_info.tile_cnt == (int)all->map.row)) return ; - else if (all->map_info.info_cnt < 6) + if (all->map_info.info_cnt < 6) { if (line[i] == 'N' && line[i + 1] == 'O') is_valid_texture(line += 2, NO, all); @@ -126,9 +127,12 @@ void check_type(char* line, t_all *all) is_valid_color(line += 1, F, all); else if (line[i] == 'C') is_valid_color(line += 1, C, all); + else + display_err_msg_and_exit("Invalid element in map file"); all->map_info.info_cnt++; + return ; } - else if (line[i] == '1') + if (all->map_info.info_cnt == 6 && line[i] == '1') is_valid_tile(line, all); else display_err_msg_and_exit("Invalid element in map file"); diff --git a/jk/map_parse.c b/jk/map_parse.c deleted file mode 100644 index 58becb8..0000000 --- a/jk/map_parse.c +++ /dev/null @@ -1,63 +0,0 @@ -#include "cub3d.h" - -void get_row_col(char *argv, t_all *p_all) -{ - char *str; - - p_all->map.row = 0; - p_all->map.col = 0; - int fd; - fd = open(argv, O_RDONLY); - if (fd == -1) - { - printf("%s\n", strerror(errno)); - exit (0);//값 수정 - } - str = "temp"; - while (str) - { - str = get_next_line(fd); - free(str); - if (str) - p_all->map.col = ft_strlen(str); - p_all->map.row++; - } - p_all->map.row--; - free(str); - close(fd); -} - -void get_map(char *argv, t_all *p_all) -{ - get_row_col(argv, p_all); - int fd; - fd = open(argv, O_RDONLY); - if (fd == -1) - { - printf("%s\n", strerror(errno)); - exit (0);//값 수정 - } - p_all->map.dp_map = malloc((p_all->map.row + 1) * sizeof(char *)); - if (p_all->map.dp_map == NULL) - { - printf("%s\n", strerror(errno)); - exit (0);//값 수정 - } - unsigned long long ull; - - ull = 0; - while (ull < p_all->map.row) - { - p_all->map.dp_map[ull] = get_next_line(fd); - ull++; - } - p_all->map.dp_map[ull] = NULL; - close(fd); -} - -void init_map(char *argv, t_all *p_all) -{ - get_map(argv, p_all); - p_all->map.row_tile_size = WINDOW_HEI / p_all->map.row; - p_all->map.col_tile_size = WINDOW_WID / p_all->map.col; -} diff --git a/parse_map/map/map.c b/jk/parse_map.c similarity index 66% rename from parse_map/map/map.c rename to jk/parse_map.c index 0ba6e20..e415c82 100644 --- a/parse_map/map/map.c +++ b/jk/parse_map.c @@ -1,19 +1,19 @@ -#include "map.h" +#include "cub3d.h" -static void display_map_elements(t_all* all) -{ - printf("texture NO: %p\n", all->map_info.no); - printf("texture SO: %p\n", all->map_info.so); - printf("texture WE: %p\n", all->map_info.we); - printf("texture EA: %p\n", all->map_info.ea); - printf("\n"); - printf("color F: %x\n", all->map_info.f); - printf("color C: %x\n", all->map_info.c); - printf("\n"); - printf("map\n row:%llu col:%llu\n", all->map.row, all->map.col); - for (int i = 0; i < (int)all->map.row; i++) - printf("%s", all->map_info.tile[i]); -} +// static void display_map_elements(t_all* all) +// { +// printf("texture NO: %p\n", all->map_info.no); +// printf("texture SO: %p\n", all->map_info.so); +// printf("texture WE: %p\n", all->map_info.we); +// printf("texture EA: %p\n", all->map_info.ea); +// printf("\n"); +// printf("color F: %x\n", all->map_info.f); +// printf("color C: %x\n", all->map_info.c); +// printf("\n"); +// printf("map\n row:%llu col:%llu\n", all->map.row, all->map.col); +// for (int i = 0; i < (int)all->map.row; i++) +// printf("%s", all->map.dp_map[i]); +// } void display_err_msg_and_exit(const char* err_msg) { @@ -60,7 +60,7 @@ static void init_map_info(t_all* all) all->map_info.ea = 0; all->map_info.f = 0; all->map_info.c = 0; - all->map_info.tile = (char**)malloc(sizeof(char*) * all->map.row); + all->map.dp_map = (char**)malloc(sizeof(char*) * all->map.row); all->map_info.info_cnt = 0; all->map_info.tile_cnt = 0; } @@ -100,20 +100,16 @@ static void is_vaild_map(char** map, int row) display_err_msg_and_exit("Invalid Player"); } -int main(int argc, char** argv) +void parse_map(int argc, char** argv, t_all* all) { int fd; char* line; - t_all all; if (argc != 2) display_err_msg_and_exit("Invalid argument"); is_cub_file(argv[1]); - - all.mlx.mlx = mlx_init(); //지우기!! - - get_row(argv[1], &all); - init_map_info(&all); + get_row(argv[1], all); + init_map_info(all); fd = open(argv[1], O_RDONLY); line = " "; @@ -121,13 +117,13 @@ int main(int argc, char** argv) { line = get_next_line(fd); if (line) - check_type(line, &all); + check_type(line, all); } free(line); close(fd); - is_vaild_map(all.map_info.tile, all.map.row); + is_vaild_map(all->map.dp_map, all->map.row); /* debug */ - display_map_elements(&all); + // display_map_elements(all); } diff --git a/parse_map/libft/Makefile b/libft/Makefile similarity index 100% rename from parse_map/libft/Makefile rename to libft/Makefile diff --git a/parse_map/libft/ft_atoi.c b/libft/ft_atoi.c similarity index 100% rename from parse_map/libft/ft_atoi.c rename to libft/ft_atoi.c diff --git a/parse_map/libft/ft_bzero.c b/libft/ft_bzero.c similarity index 100% rename from parse_map/libft/ft_bzero.c rename to libft/ft_bzero.c diff --git a/parse_map/libft/ft_calloc.c b/libft/ft_calloc.c similarity index 100% rename from parse_map/libft/ft_calloc.c rename to libft/ft_calloc.c diff --git a/parse_map/libft/ft_isalnum.c b/libft/ft_isalnum.c similarity index 100% rename from parse_map/libft/ft_isalnum.c rename to libft/ft_isalnum.c diff --git a/parse_map/libft/ft_isalpha.c b/libft/ft_isalpha.c similarity index 100% rename from parse_map/libft/ft_isalpha.c rename to libft/ft_isalpha.c diff --git a/parse_map/libft/ft_isascii.c b/libft/ft_isascii.c similarity index 100% rename from parse_map/libft/ft_isascii.c rename to libft/ft_isascii.c diff --git a/parse_map/libft/ft_isdigit.c b/libft/ft_isdigit.c similarity index 100% rename from parse_map/libft/ft_isdigit.c rename to libft/ft_isdigit.c diff --git a/parse_map/libft/ft_isprint.c b/libft/ft_isprint.c similarity index 100% rename from parse_map/libft/ft_isprint.c rename to libft/ft_isprint.c diff --git a/parse_map/libft/ft_itoa.c b/libft/ft_itoa.c similarity index 100% rename from parse_map/libft/ft_itoa.c rename to libft/ft_itoa.c diff --git a/parse_map/libft/ft_lstadd_back.c b/libft/ft_lstadd_back.c similarity index 100% rename from parse_map/libft/ft_lstadd_back.c rename to libft/ft_lstadd_back.c diff --git a/parse_map/libft/ft_lstadd_front.c b/libft/ft_lstadd_front.c similarity index 100% rename from parse_map/libft/ft_lstadd_front.c rename to libft/ft_lstadd_front.c diff --git a/parse_map/libft/ft_lstclear.c b/libft/ft_lstclear.c similarity index 100% rename from parse_map/libft/ft_lstclear.c rename to libft/ft_lstclear.c diff --git a/parse_map/libft/ft_lstdelone.c b/libft/ft_lstdelone.c similarity index 100% rename from parse_map/libft/ft_lstdelone.c rename to libft/ft_lstdelone.c diff --git a/parse_map/libft/ft_lstiter.c b/libft/ft_lstiter.c similarity index 100% rename from parse_map/libft/ft_lstiter.c rename to libft/ft_lstiter.c diff --git a/parse_map/libft/ft_lstlast.c b/libft/ft_lstlast.c similarity index 100% rename from parse_map/libft/ft_lstlast.c rename to libft/ft_lstlast.c diff --git a/parse_map/libft/ft_lstmap.c b/libft/ft_lstmap.c similarity index 100% rename from parse_map/libft/ft_lstmap.c rename to libft/ft_lstmap.c diff --git a/parse_map/libft/ft_lstnew.c b/libft/ft_lstnew.c similarity index 100% rename from parse_map/libft/ft_lstnew.c rename to libft/ft_lstnew.c diff --git a/parse_map/libft/ft_lstsize.c b/libft/ft_lstsize.c similarity index 100% rename from parse_map/libft/ft_lstsize.c rename to libft/ft_lstsize.c diff --git a/parse_map/libft/ft_memchr.c b/libft/ft_memchr.c similarity index 100% rename from parse_map/libft/ft_memchr.c rename to libft/ft_memchr.c diff --git a/parse_map/libft/ft_memcmp.c b/libft/ft_memcmp.c similarity index 100% rename from parse_map/libft/ft_memcmp.c rename to libft/ft_memcmp.c diff --git a/parse_map/libft/ft_memcpy.c b/libft/ft_memcpy.c similarity index 100% rename from parse_map/libft/ft_memcpy.c rename to libft/ft_memcpy.c diff --git a/parse_map/libft/ft_memmove.c b/libft/ft_memmove.c similarity index 100% rename from parse_map/libft/ft_memmove.c rename to libft/ft_memmove.c diff --git a/parse_map/libft/ft_memset.c b/libft/ft_memset.c similarity index 100% rename from parse_map/libft/ft_memset.c rename to libft/ft_memset.c diff --git a/parse_map/libft/ft_putchar_fd.c b/libft/ft_putchar_fd.c similarity index 100% rename from parse_map/libft/ft_putchar_fd.c rename to libft/ft_putchar_fd.c diff --git a/parse_map/libft/ft_putendl_fd.c b/libft/ft_putendl_fd.c similarity index 100% rename from parse_map/libft/ft_putendl_fd.c rename to libft/ft_putendl_fd.c diff --git a/parse_map/libft/ft_putnbr_fd.c b/libft/ft_putnbr_fd.c similarity index 100% rename from parse_map/libft/ft_putnbr_fd.c rename to libft/ft_putnbr_fd.c diff --git a/parse_map/libft/ft_putstr_fd.c b/libft/ft_putstr_fd.c similarity index 100% rename from parse_map/libft/ft_putstr_fd.c rename to libft/ft_putstr_fd.c diff --git a/parse_map/libft/ft_split.c b/libft/ft_split.c similarity index 100% rename from parse_map/libft/ft_split.c rename to libft/ft_split.c diff --git a/parse_map/libft/ft_strchr.c b/libft/ft_strchr.c similarity index 100% rename from parse_map/libft/ft_strchr.c rename to libft/ft_strchr.c diff --git a/parse_map/libft/ft_strdup.c b/libft/ft_strdup.c similarity index 100% rename from parse_map/libft/ft_strdup.c rename to libft/ft_strdup.c diff --git a/parse_map/libft/ft_striteri.c b/libft/ft_striteri.c similarity index 100% rename from parse_map/libft/ft_striteri.c rename to libft/ft_striteri.c diff --git a/parse_map/libft/ft_strjoin.c b/libft/ft_strjoin.c similarity index 100% rename from parse_map/libft/ft_strjoin.c rename to libft/ft_strjoin.c diff --git a/parse_map/libft/ft_strlcat.c b/libft/ft_strlcat.c similarity index 100% rename from parse_map/libft/ft_strlcat.c rename to libft/ft_strlcat.c diff --git a/parse_map/libft/ft_strlcpy.c b/libft/ft_strlcpy.c similarity index 100% rename from parse_map/libft/ft_strlcpy.c rename to libft/ft_strlcpy.c diff --git a/parse_map/libft/ft_strlen.c b/libft/ft_strlen.c similarity index 100% rename from parse_map/libft/ft_strlen.c rename to libft/ft_strlen.c diff --git a/parse_map/libft/ft_strmapi.c b/libft/ft_strmapi.c similarity index 100% rename from parse_map/libft/ft_strmapi.c rename to libft/ft_strmapi.c diff --git a/parse_map/libft/ft_strncmp.c b/libft/ft_strncmp.c similarity index 100% rename from parse_map/libft/ft_strncmp.c rename to libft/ft_strncmp.c diff --git a/parse_map/libft/ft_strnstr.c b/libft/ft_strnstr.c similarity index 100% rename from parse_map/libft/ft_strnstr.c rename to libft/ft_strnstr.c diff --git a/parse_map/libft/ft_strrchr.c b/libft/ft_strrchr.c similarity index 100% rename from parse_map/libft/ft_strrchr.c rename to libft/ft_strrchr.c diff --git a/parse_map/libft/ft_strtrim.c b/libft/ft_strtrim.c similarity index 100% rename from parse_map/libft/ft_strtrim.c rename to libft/ft_strtrim.c diff --git a/parse_map/libft/ft_substr.c b/libft/ft_substr.c similarity index 100% rename from parse_map/libft/ft_substr.c rename to libft/ft_substr.c diff --git a/parse_map/libft/ft_tolower.c b/libft/ft_tolower.c similarity index 100% rename from parse_map/libft/ft_tolower.c rename to libft/ft_tolower.c diff --git a/parse_map/libft/ft_toupper.c b/libft/ft_toupper.c similarity index 100% rename from parse_map/libft/ft_toupper.c rename to libft/ft_toupper.c diff --git a/parse_map/libft/libft.h b/libft/libft.h similarity index 100% rename from parse_map/libft/libft.h rename to libft/libft.h diff --git a/jk/map.cub b/map/map.cub similarity index 80% rename from jk/map.cub rename to map/map.cub index 128d193..9201d9e 100644 --- a/jk/map.cub +++ b/map/map.cub @@ -2,4 +2,4 @@ 100001 100001 100001 -111111 \ No newline at end of file +111111 diff --git a/jk/map2.cub b/map/map2.cub similarity index 100% rename from jk/map2.cub rename to map/map2.cub diff --git a/parse_map/map/test_map.cub b/map/test_map.cub similarity index 100% rename from parse_map/map/test_map.cub rename to map/test_map.cub diff --git a/parse_map/get_next_line/README.md b/parse_map/get_next_line/README.md deleted file mode 100644 index d9a9a94..0000000 --- a/parse_map/get_next_line/README.md +++ /dev/null @@ -1 +0,0 @@ -# 42seoul_Get-Next-Line diff --git a/parse_map/libft/README.md b/parse_map/libft/README.md deleted file mode 100644 index 7eeea52..0000000 --- a/parse_map/libft/README.md +++ /dev/null @@ -1 +0,0 @@ -# 42seoul_Libft diff --git a/parse_map/map/Makefile b/parse_map/map/Makefile deleted file mode 100644 index 0feb40f..0000000 --- a/parse_map/map/Makefile +++ /dev/null @@ -1,32 +0,0 @@ -NAME = parsing_test - -SRC = map.c parse_map.c ../get_next_line/get_next_line.c ../get_next_line/get_next_line_utils.c -OBJ = $(SRC:.c=.o) -CFLAGS = -Wall -Wextra -Werror -MLX = -L../mlx -lmlx -framework OpenGL -framework Appkit - -CC = cc -RM = rm -rf - -# LFT = ../libft/libft.a -# # INC = -Ilibft -LIB = -L../libft -lft - -all : $(LFT) $(NAME) - -# $(LFT): -# # $(MAKE) -s -C libft bonus - - -$(NAME) : $(OBJ) - make -C ../mlx/ - $(CC) $(CFLAGS) $(MLX) -o $(NAME) $(OBJ) $(LIB) - -clean : - $(RM) $(OBJ) - -fclean : clean - make -C ../mlx/ clean - $(RM) $(NAME) - -re : fclean all diff --git a/parse_map/map/cub3d.h b/parse_map/map/cub3d.h deleted file mode 100644 index 435bbec..0000000 --- a/parse_map/map/cub3d.h +++ /dev/null @@ -1,163 +0,0 @@ -#ifndef CUB3D_H -#define CUB3D_H - -#include "../mlx/mlx.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct s_mlx -{ - void *mlx; - void *win; -} t_mlx; - -typedef struct s_img -{ - void *img; - int bpp; - int size_line; - int endian; - int *data; -} t_img; - -typedef struct s_player -{ - double x; - double y; - double rotation_angle;//바라보는각도. 시야각도 - double walk_speed;//움직이는 속도 - double turn_speed;//바라보는 각도의 조정속도 -} t_player; - -typedef struct s_key -{ - bool up; - bool down; - bool left; - bool right; -} t_key; - -typedef struct s_temp_ray -{ - double xintercept; - double yintercept; - double xstep; - double ystep; - int found_wallHit; - double xhit_wall; - double yhit_wall; - double distance; -} t_temp_ray;//변수명 다시 - -typedef struct s_ray -{ - double ray_angle; - double xhit_wall; - double yhit_wall; - double distance; - bool vert_hit; - bool ray_faces_down; - bool ray_faces_up; - bool ray_faces_right; - bool ray_faces_left; -} t_ray;//변수명 다시 -//광선이 벽과 만나는 좌표와 -//광선의 방향적인 요소를 가지고있다 - -typedef struct s_map -{ - unsigned long long row;//ull..? - unsigned long long col; - char **dp_map; - unsigned long long row_tile_size; - unsigned long long col_tile_size; -} t_map;//필요시 minimap으로 - -typedef struct s_map_info -{ - void* no; - void* so; - void* we; - void* ea; - int f; - int c; - char** tile; - int info_cnt; - int tile_cnt; -} t_map_info; - -typedef struct s_all -{ - t_mlx mlx; - t_img img; - t_player player; - t_key key; - t_ray ray; - t_map map; - t_map_info map_info; //구조체 이름 수정 필요 -} t_all; - -#define MINI_SCALE 0.5 -#define TILE_SIZE 80 - -#define WINDOW_WID 640 -#define WINDOW_HEI 480 - -# define X_EVENT_KEY_PRESS 2 -# define X_EVENT_KEY_RELEASE 3 -// # define X_EVENT_WINDOW_DESTROY 17 - -#define PI (3.14159265358979323846264338327950288) -#define TWO_PI (6.28318530717958647692528676655900576) - -#define RAY_RANGE (PI / 3.0) // player 시야범위. 무난하게 60도 -#define RAY_COUNT 121 // 광선의 갯수. 2보다 커야하고 홀수 추천 - -// #define BUFFER_SIZE 333 - -int key_press(int keycode, t_all *p_all); -void init_player(t_all *p_all); -bool hit_wall(double x, double y, t_all *p_all); -void update_player(t_all *p_all); -void fill_square(t_all *p_all, int x, int y, int color); -void render_map(t_all *p_all); -void draw_player(t_all *p_all); -int ft_loop(t_all *p_all);//이름 수정할거임 -void render_player(t_all *p_all); -int key_release(int keycode, t_all *p_all); - -void ray_init(t_ray *p_ray, double ang); -void calc_distance(t_all *p_all, t_temp_ray *hv); -double distance_btw_points(double xa, double ya, double xb, double yb); -void calc_ray(t_all *p_all, t_temp_ray *hv); -void calc_horz_ray(t_all *p_all, t_temp_ray *p_horz); -void calc_vert_ray(t_all *p_all, t_temp_ray *p_vert); -void draw_line(t_all *p_all, double xa, double ya, double xb, double yb); -void draw_one_ray(t_all *p_all, double ang); -void draw_ray(t_all *p_all); -double normalize_angle(double ang); - -void get_row_col(char *argv, t_all *p_all); -void get_map(char *argv, t_all *p_all); - -size_t ft_strlen(const char *str); -char *ft_strchr(const char *s, int c); -size_t ft_strlcpy(char *dst, const char *src, size_t dstsize); -size_t ft_strlcat(char *dst, const char *src, size_t dstsize); -char *ft_strjoin(const char *s1, const char *s2); -char *for_next(char *save); -char *rtg(char *save); -char *read_and_save(int fd, char *save); -char *get_next_line(int fd); - -void locate_for_mini(int *xp, int *yp, int x, int y, t_all *p_all); -void init_map(char *argv, t_all *p_all); - -#endif diff --git a/parse_map/map/error.c b/parse_map/map/error.c deleted file mode 100644 index 72736fc..0000000 --- a/parse_map/map/error.c +++ /dev/null @@ -1,2 +0,0 @@ -#include "cub3d.h" - diff --git a/parse_map/map/map.h b/parse_map/map/map.h deleted file mode 100644 index a09690a..0000000 --- a/parse_map/map/map.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef MAP_H -# define MAP_H - -#include "../get_next_line/get_next_line.h" -#include "cub3d.h" -#include "../libft/libft.h" -#include -#include - -typedef enum e_type -{ - NO, - SO, - WE, - EA, - F, - C, - TILE, -} t_type; - -void is_cub_file(const char* filename); -void check_type(char* line, t_all *all); -void display_err_msg_and_exit(const char* err_msg); - -#endif diff --git a/parse_map/map/parsing_test b/parse_map/map/parsing_test deleted file mode 100755 index 24dbbd83f23de26b366a310d35a916ce6efc03ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169952 zcmeEv34GMmwf}_0#&zhw^6D$?YuYET(pDub??I84l#EWAq-qiBb7>4ANHi>FL9s@m zA(e3&YZu#BZL8hwVzpMOT7iI+ptztSqM}5Lbs|_15pb#bf4}G6bLakkznKJU`<8y@ zd_HIHIp>~x?z!ilyZnBW<-ylqeCu7YSkd5EEH(%@9GE;f7VC(WfQrTb8JGmt)SOaw zQsRun=T4?H2t`3QCr3LMp@W*5(-Nnj7F03q*}D&h9|{o>J_^*-wA5eJVi^=+d#6mr zU?6{EywM>)B&$wlvCr1jG`FZid|>1e|LU4sni}Sv>+A>Pch?t#9MqU04){f<6UEINahGl%E2!%m>$hbx=%Q_jQf{Qvy5;czkPf z)A5ZBGmoFOsBso}!U!P!IQy&HzdYj9$)o@4m7k1>U;dqT_EiFuA;b@f9RwsTu`I3~ z^ik0ML?45Z)6Rmk@!bTh|IetccQ*#4$>Ep|69jt`y&N^W>md3ID*)3bJpt7MQm))tyn>uTE z0!sC_XjT!H2>jL9A%4d7<34>H;@B_~$^iPa0I2O^v2oz~9Vhy1Y^bYk!O*7FH!Wm3We(O9eNOYOItDp|-b6kErVzKRJTwXkQ z;vHA!N5kyx%#UM`-}G}7kUaCf0EGw?B2b7xAp(U66e3WFKp_H!2oxevh(I9%g$NWP zP>4Vw0)+?^B2b7xAp(U66e3WFKp_H!2oxevh(I9%g$NWPP>4Vw0)+?^B2b7xAp(U6 z6e3WFKp_H!2oxevh(I9%g$NWPP>4Vw0)+?^B2b7xAp(U66e3WFKp_JEa}k)HOg)!O zUs`f@-|VB}ADj{+U-tR38D*zUOQz2#PIf%ma%xq2{B8I%2vzCH%cU53-Caeo9Y@4J zSdQP#PM>)cl|J77#bL2aUvB^6k+GH?$@HYE)ZVhbO+vf{BJ(ExzD4&``Hkcq8_p~{ ztLzJ9HD}*F`zpV`B|A4F5Xtn=kHCI19ZRMXTUJehDDx~@SESY^JG$aa@5Zk=mvxsP z&EI;BRe&f~LabB5U-Ffz5)#Survu4UH*CYxmJcP<9Y=|g z35eje(7%(vTZ_o_4L=)pcDxJXr4X;W{>w$NOclnMyqykHE1BvzMNF??v68>qomqfi zSvI;Q)J;#mjy|NvCsCkJv5xK~^pBN3S(SQzWea|l{mvuNxU?&?8gxaf{OHli&cny! zchP13;>%Av^oV47O7XHIkBToZKlCsP4zEbJKrOwnc-d+HQdE&Xjm+nYmzBS75Ov~v zH~O-{$t7=0!k^!`@X%!Y-9swU=wZhVQglx_s^aV0rzG#-Cw~8WbuyJK>7Md&A=5*r z+-atHQesQ%d#X}B$t7!<04_T+>9Mic?Bn7eTnef6m-#X+*}n6bWOstf2vpk^&^a5<#NeI!$NXWqbX)F;!2-*pFl zdN;zDOg)`>LWDyv7vThi`nlJOVtvD}Bj3LEm^075+vV?cte8{UFGc!KOdthP50s@g zB~z~?)1O4Mg=kilKK5L+E9-j{s{*ngLROx7y*%|yBDD+BzNy1tvzVhl+pLbjdKCMZ z^WUNwS~rTt$-`lBcYN5;>7T=*U`ns6N{`%fdr_<+eZtXLNsof8N*{v;Q`xS24U(y^ zD)n-8DpQ80(ulcQkxYM}6dG5VcH=)l?bI5Yq@mQ)N~OoY{#rkVT31!2_63L0H}WDl zp_3Sh7v^yS=I{Ed^tr{=9oyqeE8!BnK8anV5;uS>H{{JA7a6h(MmL|YRi}DdMR@P8O3K_FEnR){Y zs0(4h2;0`Xh1H$dA~IcE?Ux-DYk5yH{l#N4J@{)NB>IMbcR2!|YCfte^~I9vj=e3P z!DK9eESa8wZRY#0_4Oenhp)t6VXEp(bYZ(K-CO!_<{Gp|t|n7ckI8&VY#lyT8gb!a z|H_;Tp?H7HnPx3qWx?goY17J5kCmnNR;1os#iJmzl6F#eGn+5q?lTP5M^~iII(k@n zYHWGxi$jw3{CTA;{?T=>#NR#jsP3un=LkucB;q&iE8DjX9wx zm+nS4I7x@$ByD|h6_2mXOJeozs?>tws?<5dDpDsEui}DDrq*SCkGk~ORnOoLkYv)J zg<4qzXYVY+AMMHf%*kR-_6;W+MA`96pm&**4R*5gAuCHCkw~971k1BnOqcGx^Yq2B zSfccvvc84IbBb`F%y|Za%mgSS#Y&Q$%|pby%=;iogZcV0RQDc>X>MOPY-I@?7g1Ge z_Z=BlJ%K7eXgT)>*-zt3Q)rz?tt(4CSmEudAAXfv@sYPO|DNY&{k6CH`YKX?NRKvw zX+jTW>BEjrAQy5ErR8XUERFPtW0BqYLg|S=!a|pC^`moq!u^#1ZHSrHF zhELi2x8pq>s{p~l;!NDmrHac)^|I`WxvFa7{?_7(^hu+Wsj|^jh-1S{rcVLCG1>8O z>o#oQwjuC5evWA-b>?4+fbcMbFrcV_MXNu@%(Ot zva`NR*55_Nty5)V#f9}zUVLy2ud~_wiH{+HDKg1jD(ofDzzBGi8kUKPh`SAJe~EY0 zbP|JGpX|7&^+&z)unA+niZhSn@A2R$$~=TpLUpD+M$=6Zi$%NZ4Q@v6F>eH)9mj9On+^m0Y#C5IJ3X(g0WYcgNAYGbKZ z^m5s{A&12bSyl8*vTozL@j7 zv{RCG2X!WkQb$y!$6?FfmsyOVasN$EPJU=mY~lw#gU`0(lO266Lo-j{&&za9Evl;9 z&mbHrnnOPX1x9To_R-V_Mu6LKkSbxHeLZsw_0mIMD?trhLJHz`WS$$`rI7K$vGbnJ z6Z^_=jcV^1+`fNsb8%_cj(T8~TVNV@~)XbcW(BLTCF{>iAD~XYmRCTsqk0*`SPmIM@PGN4R z_F+ll{{Aj#R&(`C?%q{|&3G?kdu+1v1M9)+{!*2CE3^F={5{037F_Em;YN}$>J z7*d{Y-j8T*__gt7Qlh8zh;sDVzBXy2ni+wH{&4JkSJZW-4*N3qFz@+L*7K5`>)~NV z>OSmPxa?M>{(>GFY!6s)-5nQU1waMv;xXwqa>>-T(yqRTF!S-HH=_o#pE>AYloW6= zV^d3}zQ>2L^3-h$*dje4^W~2qsXJQ0VPrVpv8I|ubcqpt0it1rz${3MBDM`A$1X#Sq(NG)V4UsDq_1YQOS|~sPK|5u z$HZhu6aOkYPZ*Lp`&}}W_|i+IjuR!%$(>W-lRUAOKIvx=pF_4WPv3)62z%23f?T9gw;VkWQbiIrBLlnBZ$@M@^0Llx>`PB7DeaWtEy5j zVVyiYl_Po_>*M*6oQNG&X$cB$&C9SXy_rdw@O+nMAGq<84EWf`Z z-G=MRA7sJcVZoU}0>sPGiT%Fl$@UeTs=Z!5viQm) zk1l#*^|PeTI=ZOn5hFb9=s{WO;EMLOLy8`0Up=JtzV;QI`B=-5rT1KA+aFf+2sfMu zTVGndf@u?rcf@ggC+jvOI}f|kPO+W!-gmPm-G&V2-us24<>={s6cI+q(%<7ENFJKsCr zTT%C}>dvE=mZ!c)iwT~|xT@sIt-h<7s?y(?P%2MLqq4pY?JMXPPV(u?F1@iL)m5<% zKCHo&b4NvX#%5oYtb4GcbKDi_BidiCSPTTxeyf!^Tzg;kM8@8m1~n ztxp!+TQ#YZ6BA!L1D|%znm<~VdLS9U={Bk*i`JE*LL%OJ_KpSF&gA}t$CbXUX!cdB zpU1gz*qEZ%qg=}zuX(*MLu-;6Ik0$krcu(=<%iWf`o>Fo>5@FgE+wA+?pzT+L! z-{|Y>3h-S!+|EFvQ6Sk4?$Jty^!?ANWJlo=B{#PqVv+Xsyau09P(^9asNvGS4HPpLu0tR3>}2G zA*0ry@gY#kJc8_K?;3)O3cQpDh|II-7#WPqFHMgzrdwB_#gm_s8j45Q9{Noj9L4KWa{jVyxOO_vG2kESY}5F*Wx-HQGG27E9#!cv6FiGPVBj{J6NAcWw0_b zk3lQRtKc*_GrP<2D7pD$QCx?`!j=&}3?7Q9lcG@X;e77$jaCw}{k)&4N&O|St_}XR3WZlb)FBywX z@RNxv4k~@P6o=w!#`hD4O==xc7GGZV$)aRm_tJY>|GeXU*%_F9Ro|M$Cyd3L+B1t< zH|!XMXNK&hQPz{@YpDObKN#%)3srTiKfU;p!Ej(2-&pK8(mv1ht@-rg69!8MEfZ7w zt~gX)&5n9&@oOKBC-!yhZGF0I!V#^H%ku*Lg{y~sa_K!Shr;n>=Ve7Lf8KFdz^knD z0sr`Pn0ljPRSbZ{i)B6p4>5%mcNHN4C@IBOyZ6#_{mUuWQ{6+!&T;Qau70*;$Dw?_ zDSAEGx2|t>eEC5q9NhBq2_-Er;$d)5Uw3l#>m|w5Lp$E>J1_-Lj!+$fH@W*uE_|gT z{-d?cFP2Yy`H~xwb=|nn{Gphxoc1qF2ppochnaNX!iu6_&7?A|ftswDLedrz|c zHPion?0@$qH&oQ&#ncequ;f|5J)Uqran(law*AS@$&XIr^VPD%zRdj}z>KC_DeQ*u zit2r-#I9xQGq*u5vy)2f%$xuwIDWOqYZ@%3T6bZI>`HboS;npbmc7bw+;{h<*4-S- zd>*D!iS6xe+i^DYuX3W}&!OYY8A$15=g?`Oar4V0+uJg+_|nUvVPCAJ+qP#~4-eFy ziP~QFfI~NvtgG(96{5KP^^$nU5fG*mJ?&jZc%0~cinaqPrST5=ley^x9A8GKlS@`J zU6Lu`tkt$m=EV1-4?du>|6{>msgwjCXK-1Qcr4jD3?{l0Z^BN@hNZo2|DgC%JJ5?h zfq`BihZ6g}s5tXY+=>yE5Bv!ZraJa}Rk&=D&3s)psueIK#!S_qL9#XA) zx)Zyo)}7dCiVO>cc~W9eyz^3-RH+f?>yYT_A?uNEI~Si&j9{M(g>X%L<+x&`_O~Zs z#&3EL>f8526VGojn~}84Ky9BsQxcb{R>tdgONd{r|)ck0nP5U{y*~{P=D$FS^qomMmI20s;}|XZ=rgZ zsxSRlsHacJ(d97vCtKHL>c&dl zPSo9)tz(YD;76n`gSxM=u5fv^FscrhsvcC;yDFwLs`~z&0oaPF z&loe?M6d;diB=cBO0tXFU%Se*+azk6p!WZu)}7b`F>-2;8C;4DCa#Znx|vEZ-ol1; z)zBEX9v%M@2GDxbd!?B~c~9@}xd*hb9gVApfZgBidT!gFIrC5$!O?*IW!KPnJGK=L zVkT^5uE)0*lFK{+mh@svi6x8hRSZtT@ux%KPD(OQU`v)YV4Hq~P3zfI7N&o^l-vDO z&nuiRc4gWngWM17^O`w!pWn}=X;co0cZ{V!%%|JAl&}bK0*N5Ki~?5KU1j3xcnAJU zcC2?i_BYd{2kb%d&gZi$+#3FDyaOi{wXiaGw#!n(6VI^r*G`UidE zM8iB@mi1?n7xD~OdGCc0lPCHO(W@V8}OZX=32fUYF|5rR}A#$=081j$$y!*pxgseZ9S>ht;h!0ZtGe3 zaahhggYG!R`rR_Vc}M(VbX}Dx_H#3sLS|0t%C3?50mxpIO1(9G#@fJ9n~7x1j8td?<|IXt?9urndc( z&YiLNS7ZUyCAyYe(y_A-mf~01fv*{jK7aTMPwTb#ejt@tE4E;BaAGaEbVB`Z6~DI* zF{=scNRy4JB^zO_7gt!gxpio~1DAW`m9673DX~VR)@R<2d`zZ?j{mlaB~L`0avcXj z$wWQ#Pa`7*b`#|*kF!#0-*xD_3xvw40A@vv>>Snlw3U*ArvsUf(h$-#1!bRw&`Co_Bq>U0(NByr%h;|2>SaKgTZt;N;h zs90iJa+jh>*`>sG-scZ{|F(AmJF-1Ck=#xpHv#0pT;yGP`X1chQq%YJKA_{l5jBk& zDW|fz4A}46cwbJn?U7xflXHb1f!L2C)_WJ3^yJGA8WhW{0c{@e@RsefreYo|{u$%r zlSq1U4cK(+p3HkWsi~o-fQ7VzN_&va_{s&ZZB5H@6mEkMChf}Gju%3oLM;#2$w$%@ z9w)nS3Ei04%nM7@O0ar%)fEaayDZk?bf{%rUUsS zS00-Sc(y~6zTVTI;;tlZyE2o-!wk}6QX&)YJPy?|{qEqzR*fYGS9hioZ}xKWW>aY$ zELy{Ss1iTy{=xg~u2kzzKFU?dKoVQ9XK#T!feC0Z9d3~m1(p9KeA|}HGN_3s9QIU7 zaevd+X&9sYV@4Z!+`1*R#>B7(Ik_uSAOLta?Bv{ zBp>v5mhCZv^9fVC6`f@=%q9FNBTg3lq?;SVuFP6&H!juiT_*yW52Z~tx3)+~{4m!TX9hh4rb$;B4==kTa%ZW|m@6*AY%dTQcMr<+ZeePB zefpD?y`PjYzhtJr2z?CSJe(%+7HRb}h{uDOuVM-jmmbVwPk0sss{k&!Y==una}eAC zA-v+qVvs!~mmOK0Zr$0wt_Vrp+iiT53LB#yZ`SyhCA6PUvFiaRXb(cgU6-k`QA#hf zHDo(b!8M03J21{vbywyae4UcU@ru3oOLB;IPCgcsnt6d0Tn)dYO}c9?m8*L&{_f1> zhd_!`8gam}9L$dnwD2be%aD&Jh{ETMtu1&&NZp&9xH0}ET(M|+!x6Q=Obt-Lovw z9dE}oIERAj>Mil*k~CA|SFfA0thM`!ME4E2Im`3t^pF~waPHA$T=B%+@ueT`r+(D# z)buxdYmA1UL>HLx`F+PbaM7Vd@Q~>_uw6WD;2?YxpIB#aW<%ng2e|d(?JypIkPbam zl*BodFL0PR<~{GFkjunLfO_z-oJlTuL1t>=L(3A6xlnP|?Q7nc4b@{;Bp!328YLY_ za`c$w;1#XMtSDX6$hzKdnBhyUonAPjZ$NZDu}$fYY&Ns(raM`Csxvz=_O&VTFqAe{Oymc@=^s!#p&*E4JC*U!!+yO!4LG+h46?c0qEQ?frBTs<$$`>yPn zf%rllHXFUVk}2_TG8+RS&T-m& z%>>hHd8|I7_+5Q0u5S|NLfM1PxK{LK``b!fZ(zoBdtm|!_rjUsK>oc61RXPB>vf?XSU&1!mp#uxF zkjj@s#UDI8HI zjq3<5#<=6kvkmWK_{QVGOdn6=Jg4UK@TNPl3Eg7Io5ZP2lM-9woy$?-5->X<`r>Jq zTWh;|pFm@7(Bi~qaRL|ZEzSva{$S=}I)PmkUqj%RH{?;5m$*&lQB&WT^<-u;uHFga3f3Ym+b=c6NcN_~ zXAu8BKMe8Rf1uC5@F~ypFKSBf!4IdJXW+h(zg~x*EFO8YeBL6Tx60>o`Mg~|@08EG z*RC2eBLXc_sQo2^0`qyAC}Ke^0`?)x5(!c^0`$$pO()a`FvJB zx69|Br|4E8>yg3(;T1n~(Qn!-2hSV=e;YT`Sz1Nfa1F3J3dVP}KO(C3>;fr$0~loU_g-tUr<2RMG8JBRC`cNwWhQkRliMydr=-Tb-7)#86; z)*m+;|1lZ=Zn}Bi{0n2}&Y9obQgY#(hL(Cm8&WUjk8J`YwPM`Af#+;m{&h9Ry(hy;eytB+rV*{Ko8|KC8<~Pl2ZfHC|*06AX)1p{oJ-R5Vo6|6R_WXHMATwi*AQyD>Ir{=E7{ zv+6I5&25<1Qc~AcUprSwL)Bi~+EgE_#eX8LFPYg0$AlEBv36m-1Y8L!G|!1CYq+@$ z%`J;cn&vmx!zxIjjMo@>-TARuwN2-jG&j~_qDTsLZd2_dpQ{JgFt@~r8|G>WfvJ&F zS{j|K5fwtu3PCkCoI9t*_9=8$-)EsIJ&ASGCQD{1)1}ml`rL+D^P~fbl5)ae&KAY^ zVPZ*2lc(XpO3i#fl`DhjSUr;z){V(p?WR#^|m+sOW^uOX>4`LTkTL) zR!gV_^Do4TH~ksfh-(|`OIli+E@++KfV^7(Hp@xA1=%cT!x$E1`7Bkps1{2~COS(B zRaZN!zQs-?N%6^AuDzhOc5W^Hl|7b&OqnO}NO2M=h8>1vmMWRw*s##76rsEttZ1`l z>T8V@0 znblM~6T3OWDU^i#{5iGfH%Jr>Wj;*|u<_T=Ynnex^66a1nZSj3$2!Nk-^I{|og_E$Mc3w$S{j8WFNj2BbnuWJFjPs#e)7BrnVOM4O8G;F~VsGBptZoX{avm2V~XErrp zPdByVcC(yoCNT|ZB{t!V%;cP*aRARl$I{xPEs3qM)@}|Z9&N~$`EzSq=EsbxjNXtO zJ#o(bmXZYx^UfzBC3h|(AtfUDFwSL3Q^TdOuwg!S6UhNX(k@o?d>pVgudRyVvPy;$ zud>3qwddB)YpIRdHVYbC=fZs)(lBaPNr1DAjg6?0_Qlo`#g^p$qkfatzFM1bYtn8O z_?%^0=HSGJ3U5@U@;OF6$I9n8ZYy$!K%J#fZzaAN}8*Z?;!HdF3G zrM4Vn%dxf`m%SO4X2~&Ga%`3y$5R(~C+mX8jPYy6`pme%g{d^ajR|mL1Kc=w3oCWh z7)OnD)HriVD>cO!Q;apmICm{8b<`L~jdc`!w6`!!Z1WsA>9g?CXW^#Lj>}%iO0(pc zEIBqyVh(u`#N@HStg*m!u|OVh`7^VS2udOoltd~hISzXiZW%_`kz=ybu~`!HFDChk zxyL7F9-rf4**i$7N00I7u^tWo^cDgCl!Sju!apTpJA0Rb@hk)DSqA2_4D6db4Xhgi zwhaNxhQK`Wrr;EP4zuLdVUj$~#+LU=8(We#wj^zANopTD79@jMQeOK}UVBpBwl_hS zrY7=^v<=K0h?LhI+YL$E14*k(66@5zfMKorEY_>fV$J$2){@?!u$Yv@YElx*Ny%|B zcR4G~l4G*u*enUV;=1wLIBb07zA5QyVjf_T1AZ;Cz-O^W+~p1n#nD(Tj>eL4G;)p2 z?L`a8=5e+sTW3469CE_7Q3@I1bd@r3mm80XxsWE_LYi0$37gsb7cwo&z;c#Bwq==d z=4w`IiZP}bYYN2IUH33?j>gP68dK-!aoLMlX_g$5CC6q-6SwT`*F-MMo7iP}6TK`y zE+)6SQd5jE#aL6=HQ=sZHn|;dGu-hu%^h#sn_Hc2Y#7_pFt(Xt#>G@!HC0LLX&zz5 zC!&l`1R0-*KR)G3YAS^^8bTU1Ax+FYeI}b@O~f2)0_Irm+4f#pnkBhsTPgQ!OX5tE znaCNr_C85=kZ{_J6&L;tHT7P68!y94I-?+*3o&5~oXKGZKOqBO$Q&i5+8upV;j1X=7|EC8$Qjkv6(U zmq(GgEQ_}R*6gFM*6gK@#obCC32?EJ61OTTaix-SoW1aiUDs+%RysCI(w00V(3lXk zCIrn1!PxU@fO)`@QD@1JvqU`bWPxJt2Y4XSP zo2Bi(tNqLK1w4=vK1c~Kq*Ol)hk;68s_S#=hqklNC`d~4u!5{K1k%zFJf~_Gjpo55 zpS((u<|pq`r1{Cq6ls3)HbvUB9WOLLYZv{y(EO}j^dCa=vv$!0q4`<6Xrj>kL|>+3 zDZtsTP2Z)ab16_~x|af+aX<=i#sw+B87HIwXWWnioN+`7aK;rWFjnJ>6yS_6Qh>98 zFp(Hze31fm#uq8T8DFFTXMB+Yobg2paK;xYz!_hpK&*`~Qh+nQNCD3HA_X`*EoNTE z8egP9o$*BqaK;xYz!_hp0B3xW0-W(h3e2_fMGA1n7b(CQU!(wMe31g2@kI)7#uq8T z8DFFTXMB+Yobg2paK;xYY8Q<+zDNPi_#y>33`5n5pDw`}DngcWjhaAWMpe=< z4{=>kLRDASz~~xLdFujv^M{u^B?;3YYu&ikFb^-;@y?YUjGT2ytmKfihO^-~Gz6~s4&jbZ9Xs{?JD&ab_kD_gP?SH^h2nq#UqcHVXoG@&|B))hrw|`M z0)>3=qYw|={Afh!LVThz@g;@$_|b^ch4@5c;!6tg@uLx? z3-O7@#FrG}<3}S(7vd9*i7zR{$B#yoF2pAq6JJt@j~|UFU5HOKCcdN)A3qvVx)7ge zOngZpK7KT!bRj;`nD~-HeEeuc=|X&>G4UmZ`1sL?(uMd$W8zB+@$sV(r3>+i#>AHt z;^RjnN*Cf2jfpQQ#K(_DlrF?48WUeqh>stQC|!t8G$y{J5FbApQMwSHXiR)bAwGUI zqI4lX(U|y>LVWyaMCp9-ft-IX^_$@q`Sinj%KvZBhYuC`{6XC)Apg97PWa#8zwcPV zA3qvVx)7geOngZpK7KT!bRj;`nD~-HeEeuc=|X&>G4UmZ`1sL?(uMd$W8zB+@$sV( zr3>+i#>AHt;^RjnN*Cf2jfpQQ#K(_Dl>S@A2X?Lm{uYRT2APGwmHn*6AeGNPTCGz8^6b|LEfl&v#+G;fMtJf5iA;Ox&BV16~U}!yhqt0bkZ1 z{XeOXzB!IM-@pG!e|$fb&gT#0eDBUP!@Zkln|%6eFI*P%!x0Jc`QiilbYLKN*fO7f z&}x>;rw_U0Cd$9d{S9`f0qcN)I|q1ytcU$m1^u@lAH*yTd-gyg=9(gv{sq9P*s{VLjzV86O_cJ7q5r|0S`n zS>;+nCZPO4rLPZ~-?4JMXXR_>>*v$)!K8SMy$ae}a0r~tG+5de{P`?q#wJ<6qhsdoL-T%4oKM9=c z>yoA}AuP|w8||Pzn|p|V>YIf;`aA=8CUHM;dkI_l`k<-zvX%V`CI6#4-&JtWka43F z$o42UIBt%4B=DO`hwW<{)bk$>KMkbqi&P%gN8K$z_Ran0ry)J|L;nP{4$P%M&J%%W z-hk&XbY=kQ3-$Tmg&lwwZ~~7&#iO?R4i#J8%`bTRN#J{($j|9W4L-E}K;=KWKE}5J z$az@EScJz5o;i9ykaqyC+pR$N4i2<{A4dqz0d@g-miGI+jC#)3^FZ3(1H2dL);wqd zwGW2>pqu~nn>o4*_!w}eR}VJ#{6ft80pADyK9@e^I@WEVxt}Pq%{SNvrGU1#GOkDU ziDTg2b+WGyKA&yv;}PhL01BvmFkHJ20J)dE0o)E;?A3$Kju#~F(2P6dLtp*?bbAnJ z0c}4}`S;L=O+L%ZbJ#nv|JrMP$Dw`Xow+|I-#%#0!9yzZ%DnptZ9(r;;O~J?03QZ^ zS^EGjpuE+e03p{4*Hz#dK$P)e^_crUa35t(|5EK~rN?s&yeD)2RA65G%-R&0rMp$Z zmbAYKm~;I?UJ2B_9Ap5P-|Sn!+9&^l6@?4g+g0fK&wKxqDz_!iz%S+TpLQC&_Sz?N zo9CZ^Z5xg!a4vHkpJ1XS%^}=)&+c}EDRxioiBN} zPF>VRW#p&jZRg=(SnhC)77BA?H1c!0#j#o&&+V)nwJv5;C1L=8*zrY(sx8^>lS_;Xc9K zQ()W)x%^pfs^mK~A!!dpt{7QWSr>uz<@uoPI8QeMX}{Ill=haM1cotxUfYICQO1YW zKL;dj{TBFZAlv@RZv$Q+Bx4---iWcP3DrgP{rWI1%J}f*U}plkFLGT4?v&sKeEt4t zUmrB%NS_0DV86Yu@5}Si1L>o_63DSUNgD&{hx^H=5BXMG$8+LNAlKwdD+|OkY}4m` zeb9e(e9)G6G6ff375IIUhI~MM=rDHNivv07+d`dywfQqJygT+7sfl?$eP5oBws!ui zc;>U|%l{GWV@%vvxF_e@du7Oe4Em!*86W-W_;vrN`WP42H{nrW&iy|WhYir<9_^k* zSPx#n(wrym{dx}b9mn5nzg2%=ll>|l==&VL)87kp&!##2=b5c%_>VyI{NrA`2Por4 zDWJYs8;s41mgckLpS0d+XY&m__mnX34nEDc*E-%$2%CZ2o837BTI=}CDPY^u|D8bk z`z;{P-)-uPZ$BjC`MVqF`p|mF1eDhj!fR~R(<){awC)4Ev!x`V&xopt3)G)O`rZHO731{5%+CK;9_{yhHC0$~>!%Vc(W_@dwY` zROokpp>&^Bq~23N`a+;Tk^4MkIe!?6g@Qju3xP-$;I4%%P2Xbu@i)p}Bm<;AQQi}v z6tMQ0!)lN7rfqo-&AXrISaOwO93Q#ra>)kLM?Lovj$7_T1L=qR@by8@0CMhs5Y|&Z zq|axe*MYoawF18iq%X7)`FTIufc#pZ#*}*Aj{pkTwp=gFG4{O)sJblqtQXE_w%0Yw{bUvJAs~TgW!OIbr|t0j9QH~5u>Cg3 z7(@E5dkN!3f0pMMFa779Lj8v=axMtJ$f2+EC3Uv`DWe|!z8i9lkN8UcFxa-54;(MS zopGR7h$P4R8ORx90?%Jv-|UlnSmb#Pvh#p{0TLbsvOmqY{@!0PCd?nkh+`qhv#lXr zKKu4LuX-<|+Lau8NMGaW+t+!M7=-jI!81Pz%;`IT+!qO3ef!`w7dZFfeAo;b^JD=~ zz_!(R447|d#9U<#GoJ2efk89=+k)LsHv1%?j%_$+&jSUloZmkX{wRt@_cun= zcc;~{tk_^I!s~^8a?V}{a{m*sZ5M)Jd^GpD#x(Lw+rgx#@C)?epp9vK`h(Ta9DD zrr-9R*!S%y4SSV9uA#{OpgR4Px%`2w0{8}y`?B2I)CPC~3sT-(-v{?0qP%+ z|FHKsP|jeKy4Ujjm2sdH2=&QxSNCH_Q^%_7{gCH3V?yBF>N+6LNWzbOeel-+xmS$= zPPX)~Q0g=PKG5O&z$D0MpYP-k1#-T`FZCC^fbzCa>heCw{sKR1D$4lCqaV1dSXuJfSluXYYMc^StS0b<1-H7=hhFdv!_MU*O&ACfak{z&|3*Sp!*o~-j=@g zhxQdB&yVU$f2B6I_VgY}G4mkcyVa2iGK2U}%&6)Oh_}3_gA()S%e zg5;DToj*EWw?4EFEkpW;g6BTYShz8&F3XU<-m7>9xp@HnQ(!uWzWU#wHlgSDnKS;@ z4*hzC`r0;Z->rv-R>uxuy+3)Qwuk#!5Rr~PEkUr070_T@!E!)2UB;?8m z)n~oG=J{?Q*ZgjvBH(`Y0rW3LV!sozwEC~(_48BrQdu)0eYL+nhy72${yrU4D|JEk=(2K+N$t$3KzJ?q-~DV~ zjy6xKvRB7BA0lcLp%9FZ%XD zYaD0NFYwcV<9#1}eP8bBSNQUL`f3~HBp~xMvOk3EsQ&}*pPtRgxq&(X-?sHVfr>;9 zxzh&`jt|?&_t4r-l<}ebK;=8pM_aCK?#=GL9PTfdeaM*0Zcp~xM0X(jww_~m?}_vI13Aa)^wi&6`jBk^a=(&w zrn(2>kFQ(MH_<>G-&Q``xN#2N?)#hr)(_8<^5|1Qc`YGit`iSZ8B0-SMF=1|Apfl% zbFC4`^O|QE?{Kn@q7<-w@m+I4J9Z>?^RRgBS3_1A*oP$Lh}Bu>aZyIx~Uv zLCzqR=hL_H<2KPTX|`=#H`*H<0CME!THPULx3^-#~b zBJiCKbMy(Xj&gl|sRS9xVbx_R%2|EhHwb~8&!_Lptu4*#=V2qT9&P<}$QkS9+7`5~ z&F@;oknwMk+Osl^ z|K;Gjf&5vOFv>HfuWx_>; zQgT~r@uBq~IX`azw*&e6#nfBq)q{2UrupOUhp0Lo$T`pT{N4pQVU^kom!{g;XWomS zss~dA$`VA-{*`{9ls3e^VyW(_7h*1w5g8x@9tr!_xl{_>#MDh zPQb5R`r6L+AD9zgAGFq82fE$XNgUONm1#Z)d{rI44C(9p0g8F{YA!IJWKLK?u)b~p z$vU3Fe9mV)*eCaa!1EgT5kS6&q`&Sv6f0-jT=}5mb@^%g<+&hsP%8NLPt`G^Qs2)| zzgm^8orrzZb06cg`5s_ke!=UziOAof@cM(AiH|4q=OJ%Cpc&&CUN3&zus`~J$30$O zI;Oz;cG&$okf84ZxzBO!&}Jo&=g!SQ0nZ-qh4kr3Ab*CNAm7DN$FMFR=<9PpjWv1h zjl3VqxKRqIeZNEn_bYdU9O(Cb z4(g`^89UzJeg-7CcV>nS`mcTDD&MI-+FuFe94IhOE3_{ak_WAEyaP1Hs;~h>;y8m1-$mW^XOfGb^N}A$eh*u*8NT6(}_C2&7Z(Wem)$s)j-`l=m+hxoy$AW z0@nYxt6z!6^waH!pn3n`SQ&!~pn#6o_QN@Idvd7Gwvc@1`S=8oaU`q+?hwj66Y^b$ zfVIne8}r}_;DGV5ZCatL_a%@rUtd?BC?HtfG)UUN1^6mZVFQSK`5Df)_0WADDDU9a zfY%@Afc|i7o3$P#_pHEqVSQpw_`dM`>jKI%3`zyYoUvpMP=~-=&YPd8qc5CG$t~Mo zg>55i7_@@QBj5c(;del;fwNQ@hOiHt*J{n~c)x8HnLf3<}E1|W0Etwn1KqUin%(c9A3 ze!`^~&uyQ3Bk^5+n|}1^4|6i_{lSh$??w}#%Q!Kv?!5wN0jpaHhV{%#-M2_{{cp57 zAl-VTP5M9`-XBi(efRZI_YEN7yFl)%Y{NSx^C{=^h;9Ek>J^wXlCRp2Rw%C}Y^cBD#qEg_r%<8$!mB zIn?0Si84NXnNOpNdCGQ?pU?62NJD2akmo4%Bfo!Sb*@JpfqKk|z?fM@F;`<4nzGv);DZ9Z}jiv0bM zke|1*p@mztP6f(q2|4q4o2`%h{T#?Oo-b${mXJ>eUI)~92bs-hkQ&S7pwp}axaUv9 zy7^^n2)6+fz(v4qK!Uu7Hl%#g-xq+~)7hm zY8&tj-~x;8ohx_&t52VpSIoJ-$s{f4BT;M|B93Y<$ z*=K+E4fV^dMQanyvhx-80986C`rPgGy}B;YJXZv^sSwUedwJ7q@V80 z0v%`zUclPre#)HY{a5xilpBGxQDb#L3NSugyQ_d~$MI2*d7TCl0?)HL2FN!_t@&VH zyFFCpp02)QVooS6@0NUjR9{Qze#P4A*S@vEc?-nJvm<7dxBAPiZTFr<>#aO6U$zb7 zz6Uta`y91>Idm(5%nx}NZtZ{#=7aW~s}$wGQXkFQYaG%U!pLdUe^0N&(YJb3dvwd)# zunp&l@Dz}_!<-77@8Ib_fw`~>cneV1!*{Gbhy)l zr8&N^KWxLkXlD#i!0L|&^9YdZ#a}bj*&Mb{UIFzy=a{eZUeA+56wH6tLB#PhE`fUx zcmZv%C4{Q)&N^!+pbw_a>fVG>-!bwTOxGyLoc_=!?aq~=oTCCFeqZo{Q?x`_AN<8Y z=04-jdFI_J=lgJ)Kpp4)4PeUB%(cbVJnIEKp82Es%(~}*5q-$mH|JDApP!l_ppP;S zT1oq$hXc1+*uGovCnuie`Foz z(nsB;K;0`rI^fMC5$YKKm=x%zuY{-w*Wr8{2o_9hv%rl5@*AyaG%B zIlqJ%z)e8zS0jM}zHK`eo;BQC+}+s9bL!i=^H9lt*l#4?v=7vAt^44{ph9bp-vx1f z(B`SYO3S;SKL9Ua^;xguWIOs#pe*vf2r|tF-sgQ_yR@|_a`jzH2-|D}dC%_21NvY( zt)5@FoK~Uj>mkeY9J>JcH6Z7Yz&(AGQ25aPY`c>n;`xzc+;=!{gt@e3$e{mL&hZl5yBuF1a@wNrdM;cGnmMl^xvdP_62NZ- zvX1TboaP)v@)uZ_!WHx4v+lh@ZYDWKJH^XZ~yaw2CF; z5b(#^SD$=c((E(vJ{G*%_H*}Vkn?`^Ft7_qdji(Jt}hk)CG$Dw{sX!C6^WG^@Z;gr zsMk5sd6y>EAFWd}EZtsWb$tE2erTU+$hO@8p1HCb$TObLEObZ&U~OPq563h;BdnGoa5sM4k}_vTyBh&N#Pu-{+u?@urTyzdi+?eO2f4 z$L~K(qn$ulo{tafgTKtz1+Q}(SdY{}9pgxlpDnhsN#NfAa_*Qj0=AB8knkLE1Z4!! zCj(EnG)Mu)PuHsKWwxGoBE~1z`y9S6Avk^8hWSK)MzNAWxdK@3!`xf?onO>n10=}r z{;@r1&KGk@zN0`XVCytKk3y*HN#i4PZq)<+cz*3fec%juC;Dhx31sZ91D*%unCZK_ z+kh5OAM7|d7cT=P2SRnGf!U*|^MY-|xnN(Dfhi#27p8Fg)d9x`?fiUj@8==s^Bwz% z#1k^LKVW`B*SGKT2lBl6X2+>#5A(}?Z=^ATOu*`@KTkp^`C#SlckrxwARi!OEICj8 z{(ctfH&{LQ%mTg=$a&7Se)WC1`@=urB|yq!fxOa076u9QkQU)dU z`11t>&Mo0KYm+%k&|HcJPCE>hrdcr1kmbw;+m|#6nc=wTpS#y;y(r^Dd28c0Do5Gh z{rnu%Gv+@B@~q&v*_JZ>**TCw`+i?xT9mCmiiN=60&ff8_!Lmuq7+cuT0+SEi+SqyM%IZkK2%Rjh^7M>PqvYFC;9YIuj}9m z&;+(?^7X-w0Mci|4}si=E&_5NeHvH^WE=!MKdyw}Y>($$6LRh6dKNL33vK^gXY7OL zBYhB1ds;%s{h{CZpkD6`yp!Jy)b+-8k$iw`Jn(s-4}3CS+VG2HIUNsF@iV16)e zKLP4_%X=-?=p-Q5g38r@%HIIe_G%#aYT6*L`2o`8KMJl9!dhTGkonmKq`o|dp;Tb5 za$JGuvwZ&Bv21`oZH3ohx5`lpSbZHcbLJA@mw>!Wvef%DNasI&dJ)Jm)9;lQ*PuMf z+5{=U_03qk090G_gEGSFK%O}QA^)$3a4~QhkiPIw_YIg+XnKJeV|_NIKKj22PFJn`!}q7(hk>e4{#Nb z>$n%l_0R?6d{+Pkw7u+J7 z_LY40t^8TE;TR9}=eHTJJ;46n=P+K3=k=by96Rs1XY}Wf>W53T69~)m@nL=Nrvmx> z$aU;PuJsq--bx`>f(B+cRcKfHsr^eH#pFDFI-%-B4>e#+~J$J`_C;DjX zVh38!EjJe1uXK^a7sga#9;y?4e9&K~19}5co_|p?4g}rf{qu;i8!$f5q5VicSf6=s zk~u&rVC5SBaDF}nr9eJ_&uJg>N?;`4GzO^SI0+pp^Gj3Z@_~IksWOzzPwt)m?+;6L z$OijxITosO`XC~DkW~V6`VTq%VJ>oCs}Av#*$-q2dOp&BeILU4z89$PfOLI?_uF5p z5tMSy=@?Y*@!|EP`)=fYskUKByVe%<{dZ*|wmQ6LaI6Y}v&HI29cdpRWNam$L-Kt3 zdX`E(J|gcoAfrt_*Ngym0C|rf>;Xzn2!{{9Ptp|S5WD%xp??YV5BTRx!|j!a4FU2X z{BwQ3t$e94ZlPs$IaZ9pNke{e5ek{HCFaRl+5E>fs7aD;sKz-Oc1oQ88{rM z&(3@{;TfWF2AQ?5{p2e}IiwF(&oQ@eY5QFItb?3ujqAnz?wXZL6R-U_5OAEln=?NM zonE~Nl-CkMp4p7a2$iuEWqkOu{^HB>_e<_dedb2a`v&B+$-Rf~eB52b+Js1e`OEuNIR0&rF<A9d4#3xGUhJ_KZJ z1M%_w?TocIEa@!Y7axFzPHI@=@XTkdqbDzjN@OI$cKP-N0oV-VKpO(BvDUicH_cXS1vCn1S z%Em+Qc_7~jT;tmUFW}4iqjTv)Rs-Z2NBi<~3~B?sfbuLM(6!>u0j;;{`h5Kx%lr51 z@VrOt+dk5$;65Gr8Aof+?I+-QW-!m*0J@*c$>R@mKRiBtriz>w(7hD+C5uZ?eg{b4 zySs~l%vk~Ja|f97v~MeGgN);lpS2TZeAv1hEq|-F0nfG1b?`cH6i`6xZM#YcnLBQu z)q0~XpUg$tVQk!e%(mCLj@XCpc(rA9IoE{9^Qr2gt_G+!!|_E`aK8fkw(}Wnxc58; zByda@TmM9$z6?}~GCpiu`mx)}coyY-KjYhl-ZUW3)IR`ou3yM?j(CSsntAXFP$7K( zc?uQOY1IBeb01}Hvt8i*19;{>L7r#rm^kmuPqD*Ff~~v8aFQ1;Cm>@SZU(ZgfYsjs zhIZT<1iexe%q*)w%4)}}PKG}|+8xL*e1sBJ_UA6EZf%ggWbdOGw|@2;X^ z^(m+SZl3}j=u?#Op|-SyNd3xtKYh|3`*VsbM0@`ckuzO`2o`GEhGrmpRI<={>%pWHXv>Em!FaE z;qv(Zgth;3ubz80f%Cz52v~nKo?;&rl|ben_lL;$iI8!B=Do_jS0WAM9w2Q{3TXef zAL?j6xVg4|mdhXBg$Zu`YCA1Wb#T9htP)6{Wsg!_mcBk{?zfD^W+0zQxRwLod4m_Q zZ6kSxN{-d7WuqPR$F>dVQAT(t`e>`;^!*P-WZK0mldJXrFQ8-22~G>lkusvp zDYBQ?dQ`ddi+9NI|GPK`GTyKD0-Zlzh&kuX>%cnDddLNAU-yBbp1*#7Wi+De#kLuN zdiKrveH<7V3wQym%R8sS??Lc9Bd`tUhPDJe|8x$XMg`9q!mqu05h!o_c@{!lXSD6_ zF9CfpD@0(vb8+XY+Ou`J?pKeXE^yY_zNLw_*Aha`v*feN4p85nrTyvqHho&0!AD3| zM3G{sPMU;dUlyVHaDR)AIx6?|`=i79;29Ujk?V)=^k-{+B@J1osFTJ4ykz2hjxNp2&0h2_WGiAm9Jq0c6e! zSpDBBk1_+K-orq)Sr2sk8)*9S29WS5koiWRGzagrHX+K+FJ%f4Yfig+hbWs5-#+`l z0Z4zCcLe!P)R4wLX!^%z3Bm^8SAfrv0qA>9Vblkf5VQdq!@ykGI;RhUcOC-YReTG$ z1gK{M-w%f4sX0%->Hkwe0@u6ji^Aa}-&_CMmqu9 zb_N*EkNf)>;dVwlGTwDo&N*=JUaU=R!r1bReZk6k4`yz2uUiQG32-D(fw{%}%yq_b z9^_nAWouLST-L7uGUxYN9nQJSf2&WQcvcg*zjgsv0(A|18?=Dczt^%{FZ?cucMbw$ zCcmpL96qc*$H2K^PIKQ^~oE&uiSsQCvdINAMP`O z`xy8Qz`z`Vrw^PL_8Hc1g^XjR-|UC;!SzD_FVEqRuCG^7zZ|#;NT5IRd@CG2Y+Ic# z_kIIa920$~pAA3(t507UAJ)+ijVDX`Gy^DL^*LVp?P3X;{&++>E=ap86>Z%{Hk1EasA@F_!Jjd3{ z3IKDTYxq{6$|CRE)lcZKE$4wb<6@h`pP8uFcrcIXKi31{+hKjrzP}&J&*6D>(%81u z@v@H^AlEl@j}SR8Ap51%*g9)tg_YfJd119bD?8BfZnd_UzubE?Kbafk-ToG`&v8h; z`*Pbis?7Z6sMF^v_v|LhIrJgo81?}FFTKxUz7U=UUJLvKkZ~g9T929!)M48jfy`|} zV8}W+h0*`6pgG#)!cECEt2c+l)Qu;1(eF{}Dh1>iGLS_fI(sP`=&w zIl9*c;sZOppAzWDT|nlC=G$#{j1al;zTNzMTlr@D+ko!qPv9Qr#h31A{GSoV+-n*4 zG?3>2f#)7$D4^|aA3v~Su9Ket>F1-sF+c&Ur+X{s;TOQiO|5)J*01(~T0OIxD5Nm!qfz>UxXp=cvb(ysZGPvJ@Z4;sSkhtXW=XajoJ)oJJ ze0C#pZ*lpl?QNfoGh_62p2s&pU-CI*3*w;vwvV@^@7wfgF&?r{*2e?Tp9y`Pr>h6j z_v^zn>+mY_~_lejJIu`=@oiF#IC2GsoK_tLA`Z3UdH^li>;MsbHGPdod z;B`M>74wX1g85CF@9+ftKKrBd=|lb$kT%`BM&EzmCUh!+ZvbBb=Dol9ZSv7*FOaW3 zEYGD6Sq1PVTgNz#(souR`<2T2D|6{X#`VkC5Zrgiv|~is^#cAHEBkq_esbtHLdNr4 zf&F|#+p5s^rM6Y_SCgKLO9@g-oac{aKUCAC+kdy-7g&A$Jq& zGguQJ6s^Es@*Xgc+?`V8p3P~H?Nqrfc~z{vNrkX;6R z73hQ04cqs|aKQOvZM>s=hI1U3yhBw-)t7hv6U=RWHo@ATR$$^GJ^lUM9-1mLp8o1Hg6uG7OJmCX#c?)oc zXHV*_ekB+^w?yuJ1lF(Br!QPDfjh9;wmM=$Wnh>)&xtVm!7=|JtPj}+U|^2Gvrq0D z#1TLN+g9g5#eNxhKVbD~D;!J4DDC+xHbVB@`y4Ch^9W(HDcpXd@lml~a?Wa0VC`_c zkyt{u9jIr%G_m@824sBXXIZRlsVL<5`5asSWz_Rtr9eNfXB|O>me%}?>{Fr~(zk7B zKYS;UxwZAug{5^Lbn!$b=k(7&`n3=!VD*QC;e4^qho`{EnW{qSD?q06z_YjC`vB^% z1u~{SxHYXpwapT;NkFa-`gKXD4kDKiJYQ&Aa@V%ya~nZoY)JWJ9GDBV>wb0yH08U2 z?5hSS5bATl@uCrR80UOI`#k#vLiV}NSnuA;XuZ+S-Zxav5_N61ewE7e=|fKcIA8AU zwKk-QwjZbzWqb^zr}ghdA8p42pH~~U0^SFZJ|`&D>9?9S&8?Bv=%-+)}cH%2Mo zwdZ>|AGk;HJ{Ng@WE;pi=i$8IdJg>mAhmDXF#qX;yps&oLG1FMzEdwBT&We-ZY0l8 zuelxB|3m!-^t8^muQJ;g^=Xr9F6aFm@=74jN4HN%g(@9*c$^t}LexfV3%KnDN6n62Z!K$~CD@qp$t5a&;xZBYtny_OI@Wvjlg zGL}}x!tdJ?JCZ(*QZ8hJZTWmAds?VYn)ou(5N-heuXvwh{h?1`H(h+f70^upr{$1C zoWoF9@&C7X9`I2Y>HnWi0lS=M#fGTdSx))E*YUs z3n}t=gYI~!OhT4&?n_^aeKKXL{nO?f)xqm3_lNJpR{x$P>G&zeDK_a#Oa38U@o8q? zThagjI-lKsSf+kTu-sbOoIaHgrP!i>NX}!ldnbOb^LobX&?^)-IX`KwFDxfJ2|q-) zC4H)d=foKlxj*T9fbtT4YW>aGZ?5{O9-eQd6r0>*o2&jG(|dkc z)=z%sXEwhdr{~V*><`sz&nZ?@p6?^R-u!Hq(2`FwW!dzpjO*d`kYlUsVP<`9p6n%L zDd)O*y>)+oHLJdBZ&{S-!*XlsZ$Y2>X!nun-{Z97YN`Ju+leCYS$WT#^}ITx9=^u> zuD99FbEqypFPKU3hAeS5l^sh_g6&6ZX*PW-8$xlDxx;m3(?>bqA3x~%4t;({*<{Vi zRzH=o?vH&R;P-yEY4T133YpOZXvmvrbF;B;#i``!xN`Ye_#_o106Y>f!ajm}0Z*KgrVfIpui{ z{h;+0x-#D=e>6qjx5?h0QVH3{maQzCK9yyz|4rWEvgzA;N!FhtzcZ!Rt!(;K#%Csc zFQ(@~Mjc{exwTZ3>7zA0E8iUYR0ltAc`oz0?E$uKPKhOCmbH}6rcY(;e_qGyD7N_X z5nDIuy+HBDoagX)l$l@;9OLbha@-_H*A~U8vo)Xglk9X|}#*EBh(^CtF^_`FXl3TismtQ|fQ7&dhSJ z{!DLdn*S~Mhx+)dn9rMfZ_|>W>QA!gGaUYYgc}xdYqoIHma~_5`q}+rOFjQsPh?Mj zEB>K=@_obal$qf&3)x4vX{o2bsZTOXehL3jn|vO^fxoxGXDPU zA*jgr){&R@G0I;`k>B~bPL3Ql%ik-YdUy}Q{cS1m`G|zfKDU(j^jq>y<9r}LvHyAh z!9Pos-}Pln%JaL#>l8WMuF21{|E0EOQRF$-hvFj?IW+klcrE&Q`qQ!}Rr+)GhuX5| zIpOB|)>?l^-k0KLJ(6(noWJjv{yv~P zZjwoG%bVk$s!#U(99xfi(%;**?fumHZ9UDUne|h?jN)q)NB?zMbzaRh5wdA$p zZi=r^e2JpBUvByG{wCH3x{kaS@^>n1C!1Fq%l_B>L*w^T z1WpcL+bbR)uZqgpRe3NF?~P%TKq$O;`5v@C^q>W zHev~GKbzy9qQ8HitM}`3^&W-EP$U#g^**^rESd_Hr%Y+2+&?_xFG>VPn`B8K5i05y zk4M76Kq?%InnYPN8jcRnC`z6lPL*^oixx#feTqWSRJb@CN)(u2tSp-9KBiZ+tTdD$ z+vsrC8pb6zGxB`{ zdKlA_$~m4qMin@pOK}_XM{@?O+L8IZ9Ft#|YjW%Jjc;BXlT)>Y$t~Q{nD~|^w`yyX z(|H@?tKP<#0oxj1hwY5%ydBARHhJ-#jjw7KlT*E`G5eStpU=?$n<+fkRx5h!0wd$5 zex^fVI_G6P4|pE%Jm7i2^ML08&jX$ZJP&vt@I2so!1I9T0nY=T2RsjW9`HQidBF34 z=K;?Ho(DV+cpmUP;CaCFfad|v1D*#w4|pE%Jm7i2^ML08&jX$ZJP&vt@I2so!1I9T z0nY=T2RsjW9`HQidBF34=K;?Ho(DV+cpmUP;CaCFfaig19;m?Y>tBv^8q%AP-i7o5 zq@$4DMt>2Q|9HTCNEab}66uRbUq@Pq^dzK%k)DUN1Ze{4g-9nNtwMSO(psb+BmENT z_ei%uKX*X72hvVRJ0mSX+7sz1NY6kz3~2=Es_*EpCeXM)Li#1rHs5Rcp-9g{8bdlB z=|rU0BYha@he$t1Y8te@j!3gzyKH4O=;y|b`p@&e0&e*FYf)e0@Otou4I4zh!C^yx z(UZsf_SfgoTeZe1W_)hc>cKENB>oT5pc~X zD!jQ_s z0M~6${cqFu^%Wb3oT4xbHv z7vn8*gSg)7W-wphaf9OARw3oyCf>*9wDg8Ud;UgXH;c!22 ze7D`i{%nU!z!f4jrqtol4p)Fbon9msRSw(hRe9`*BA*Sp<+q=;$ zq42W9)}IaWzlnS;^*)c@~>yNO0Shued7wi>gy<*L0z{~(7Cx4c9f zJl^5H;7?wfBnpEaJ_o!J@?wXR;DzH)5c`WAz6`wP>3Jfb=J2iH4_3_;`F##AvRte7 zPdofFxUTMgv0vlxzrZVA60!Nl;VmoF-!HDv`Ox0s1HsE{3k`?AR;WIf3v*POYe`Cf z|ER*sYl)0Gr9yemO@84s9S(x;snLH9v&`X%;8z={;}os}8=c-}mcw^|4;?v#w2hhX za5Z@9V^djdmO1=7`1Hy{SZrz?UJpKh!7(g0Upkz7iH`T42Rg9WZ0qpu;OoA*PUM{& z?hGE+AYyZ@!+pSpA2bvOJA9sH*cYW){TBn@ppR>Fk;7BLhc@VZoaOLc;4U>?r2PdB zKc40rME<Jb81BXw!3%j|5Ly_=?Dn0q+%7J^|dZ;{zfe06y@*+l5a9 zkDakzc$mYb;6#O9-;|Zl!S!5InT=JdyVXU%He2bCp9J4uPvWEEj!#P2m1n9t&>3c*le5#_Rnv8T`(icf|fm z@au8Cf2M<14tYf6w>mrz{9>2uMgEw>&su#mP2?*bUITvbpvy)6vBMj{^&RGj{9Ewq z_%*^?U8>`?ybE~Ml2sz#8*KM~`-9i7*YO_&Ubal{$NvLQo~-xt5n#I?=>}f2PVM`G zmn>ELA>i>7)!q+Yjs03F_{Ftqe*t)2wc1YxmrqdpYr%HEHXHo#YifTd_@;-|{(kVt zi`4#Mu-)H137-3c+Sh=m->>$oz@gD<|Gw47{;wW<^UG@g9k_CV+HW;cug7^~)P5JR z-S6!WUIPDj1>X+;cLT@a|NdaRpF9&>gXd2WJpVauzZ6`4nYKR~Z1N~ zt$j@SBx^r>tk@5+_GjvTbf~pIrnksPf*VHZ`|v1mU9^YDF9Fy13xubDD+~W5d@Wd4 zQ)6xftM`n#6|CMf=5DZFJ!9^-_SnxnYV9ZPA@x6N?Nhr7ueA23v=d%y?H2`wKeqON zKSy|jwV&2s*j%R9r?Tj9;jO_9OH{loxK1CxW`A(a4Jz+q?Msx82RC59bRxK}nl^eA zP6gN85fMHMTp2$}IB4zP)91U(xri53T)!w}||!w0%^#?PT?5!)NNi9l&*K)q#70YpT_O ze+E}hC=vUv*1n-u_&94{w?ep&wXazyJlNV->iqVn?H?6+G;M#M@I`6+8NyT2_Qk?8 zt^J1UgzvES>#h`@Z|#?AdyiTBiGxJ`Y}#JXyppz8ekX0O{88Fo`3q~08|c5*9yd^f zwZ{#VPmf_yUk(7*)aW1SJu+=SQ1p9)?S69*_?fyF z!W;p{>zg^wGVEE8>o>4J*)pXZ23f{_-)|ZIA88rq1^n2T`rvo%do%JGVEtt#{Tzq%geO?_gbE-{hx2SO#A;Zc>gDK{7-^A zE>!y(@SZc(eieAfu-d;5-hQ##e-7SmuG;&qP=9YTUG3X}w+N~I-ry(D{(<0yX#X(q zOtfDJ4x|0P;1MIV{nNm~ptc_X4;fM;*DC@pDA4vtgL{ux`*GmzW7K{U_^6T^v7ZX= z)LZSZ1F;6SPMvCm3&HK%Yx{k{g@tNA5PbB}b)tVJxNBFn9}3=gU$q|&4&%Ha z1|Ej}>uB)cxY~~cAH@qHg-PJCbF}?w;KcMgk>3m+c8S{G2kw5l+CK`m=NC^|hW}r% zjPsn8mf`=^mf`;oEyMp`Scd-_EaL&NH65$+^*k-1{oesRU__nte>ZTiv$g*nz=!gK zg2JD`_I%_}aQAc6{s{0<{nh?>aHqr7zBkyOrwp`QsP^YtK0@tFEbp)ONy~VEm8V(l zFG{o8k59AOPXgQXmaD*%cToG8;8E?={&w(yt;k?Q>sKf6Y^-00fhS}A>Ips<>(?Ogg1>6}XM^wTtnCNERR?JMBf-P=(Dswy8ON#p z#o#FgYCjoV-bL-Ffd_U}``KW7{&W|(&Zzx-a1CBy9sySxwSNk{ae}u00(kvcwO@b=)Xw%SVM zJ2|{Nc-w8a75P36{|UVP_S=j6FAjGF@36xTB0tLEIoub#%PzZ!{8Wce z2e)tEUgYOF90KpL#~vb&IGhCUz4zWCAM5ZX;C=SlN930|JQcj(e*1}hhQl|4J9X+L z^4lD~7kt102Z;OuhZlnnI_MygS3CSH_>e;m5&26FzXtByxwFXMcKCg8*REYf{;|XV z1|NR7p4WWsa0B?rBaamOHgxRF>$T-=!ABo`w8(dKcz5uz#~v&4jt(CHE-Wk*d1r@@ z0C(@+UF63(+zZ^Rm+qHOc6boDckkX}f0n}m@JT0~B=Qo6W8i-M`iXp$!xw@3_wO(A zzd2k99yoBI$gg(zdhp=Ex?i5-@SWh(Pd{Dk?{oM;@R?_xDe}i0ehPffIp>J{d52ek z&pYotk*{)iEjSPei2MVGKLrPadOrB2!{305i}gGxXPV9*%Ugo&_j%emybE~b$dS_i zUJmaMjz*&*KiJ`};CMVP@&bpufs@Ik$WL^*Ke(){Oys9Id@i`WyjFTVJq z$h$av6!_(rUlw_x!@a>PR;&>DDGm<-zxwK{B0tCBAo%syUl;iZhtCJU`R1D6Oq5=@VnqoKmAnXA36LPxW2w#A|ow4;qWrB{dvS|4%dSD-_S%Cy~Oi?=K;?H zo(DV+cpmUP;CaCFfad|v1D*#w5B$%2;13-KoVu?WdRVWD`ur_UHD-rG|0#pI(c$^2 z2~$<*@8A8T9{wIDcN;Xwzn=;s;b0&YjzvxKuG~!(29`ym;plLxAgx#R$3nl~pG*aU zBmKdWk^bRjfkcr>w5uvC8WSlZLD?|>uyC{}lrR+?s&?Y`dxnYwWswwBc5*Bh?-wfy znTqFlN6*2xX{$X0sgOx7;{N#kJx=Hmi&AsZ)Sy&?`qCp3NG1n{ibIJ|G#E08Led)9 ztH%BIqwo4j&YX7O{(j6QM{b zkPMlsq@fX{ZMzi}^&gfDB}UQUs!VbVM>aTIs)BZzg5IH2zd$(32D@gK+nRbLLOfm) zcgPe=WsR~wZzAgx9TkX#i(uP%$3p+$L?D_hjwMP5Bx1o(GC6omT|Kmy$w(-~b!qVVO}^REUs^&}HWVyN zh5RMd9lC}?i%e0exyu(QD)NU*hx=18e=t>UmgWvOOY*}>e~|9);&3EnKFtr7glG{+ z@htlyzc}SLE82{XC5k9*o5QW-#QYJu;r-@vUpN_$1jhJ7i3Hzk{y?-yXVl_+lT#9l zjqGA(`HJPr-r~zM%P0Cwo~flzlM^ZTn}>XS1ARyxrsR7cS8A$q;^wBDB6EFiG&Gue zO4rpa$sHczZsd~lXsPhW%TngQx#jUvzj-$=7>oF$be+u?ZA}hM=F4+P^_d)MZ4$Ru zF~#Teb63pbT#}cEB4S>hQha%Zm>ZTYO$ z{7kaRjfA5ib6cZpp2|znUF%N_A7++OhiY%+is|_f^o!=>c?r6h`Q)tGTwm23{+x3& zf7ai^pB1-C`TcAr!z7>SrTIQDo&6hCFlW9fE?`9(rkS13-lfTt3Jfy~NTGTGU5;Rk z7RI?u3t7GPK`~myMtq%X@}m*IX`m^Tpo{Wuew6zz9sMua)RG?c>k;Jdsp}2?tY5{SbKa6+ zm^E!=`Fx?R$)zEE*`{n54{dH+dU&SHr)^Ds#7t{jMD^d4VEO# zQks=?_ukx=Z|Nm%>DsQAy5Hu{_hG8=+c0 zB>Uz6V%eNJ{;c|pKbKF~5_dn}VeR7c@~V78m-{Mmt9|o)^K$0-I<%{&bdIlz{#)*A zSG7%5PQ9;lg>Md(4yekhAeH60%X2Dx)%g{96}k1kq4mBBwk7>IS5co+l~YaX^?A#E z@mgL4+8DDP^)60dPoTtX5ANVs-Vt#4;xW9HGl-XT89cOy^4Z`4;1S?j`Z@#a^S2tdr%csoW&V}{b0OrHfjiLGCs_X) zu!$?r23I7M?*-2*RelH@KVSJt@N(2w10Fyfk(7QJ!W-rV1^&;l3;A;B1 z4|7j&;aSROfos7Da2)kb1{<_@jkWKi_P1C$=Hq;D74)mYwS86pO>i~*vmQL>43(Q) z9Zwbdy90Q@D3$L8?tuCEXJQ%`-EkU@bNEz;gAQNl@YN3gU732RVSyuG=E&DM@{Nvs z&phcbeQM~cobLY+WwO$6p2Km6CpbLW;VOq`I6O<4r-p=k9A513vktFv_+y8^aM(v9 zrN+|jwR3nchYwYzPYpdCK3h5MuVD_4a5&*`xx*F8ZESm2Iy}qKzs2Eu9G>U!BMv{~ z@JkNA;qY3A=^d4wnI8XV4j)egDWuqqVt0x?DE6dCx2rrGXjwC~R2W)b4BhgEzjZi> z;$VtHD4s@m6rkH$$&GQrYVuAiC5>;c{>-f#ZD{HB(_cz^tMsl& zhz>B7d%hZKdQ>>jS4cD%A(++@R(mZDDGn>8twck?DC>D@`X zv~dHLE^6FsrHknND7}fvC`|A!yRn}HT%g;ICTba*lXQ90EuIw1#x$MN-K1dS7FAGo zg|fX=%(BH40d>Z1V}-fNrrWA?ae8+pyC@n0Zw55a8-na-SWQax^s2F_H_ojZOPmv{ zMnUFTl~bB=N`;fi><5A^9ZkA2IzkE=w=m05W%dKH*3T44Ll4WE9CXStS(6ey`oyZB zr)7Gop(kWb&&EJFmZEz)qQ_Qp9!AvkAS_(~{UjUc(HCVh&b*W|wJ2{-xkyNqalDoF zq?8M@9FF1)%pQLEOZC*tU&`lO{!%^XYI=Oy^zc*Ws_w2&i3hfYrYDV$I? zmdM(cslf+bay98`P&SOtZQ`_Xr;|ci!u42?54B=k5Tm6okfP&hdL~In=|pdoOjWxO gW-LR81Y@+%m)n<@$V`b0oL9y4qu>ynOBnP207o{toB#j- diff --git a/parse_map/mlx/Makefile b/parse_map/mlx/Makefile deleted file mode 100644 index 2e44836..0000000 --- a/parse_map/mlx/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -# -# - -NOM=libmlx.a -SRC= mlx_shaders.c mlx_new_window.m mlx_init_loop.m mlx_new_image.m mlx_xpm.c mlx_int_str_to_wordtab.c -SRC+= mlx_png.c mlx_mouse.m -OBJ1=$(SRC:.c=.o) -OBJ=$(OBJ1:.m=.o) -CFLAGS+=-O2 - -# add to match string put with X11 in size and position -CFLAGS+= -DSTRINGPUTX11 - -all: $(NOM) - -$(NOM): $(OBJ) - ar -r $(NOM) $(OBJ) - ranlib $(NOM) - -clean: - rm -f $(NOM) $(OBJ) *~ - rm -f mlx_app - -re: clean all diff --git a/parse_map/mlx/font.c b/parse_map/mlx/font.c deleted file mode 100644 index 656d248..0000000 --- a/parse_map/mlx/font.c +++ /dev/null @@ -1,3525 +0,0 @@ -/* GIMP RGBA C-Source image dump (font.c) */ - -static const struct { - unsigned int width; - unsigned int height; - unsigned int bytes_per_pixel; /* 2:RGB16, 3:RGB, 4:RGBA */ - unsigned char pixel_data[1140 * 20 * 4 + 1]; -} font_atlas = { - 1140, 20, 4, - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\214\377\377\377\224\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377I\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377" - ")\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\216\377\377\377\263\377\377\377\13\0" - "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\0\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377b\377\377\377V\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\215\377\377\377\270\377\377" - "\377u\377\377\377\13\377\377\377\252\377\377\377\255\377\377\377\13\0\0\0" - "\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\317\377\377\377\374\377\377" - "\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377" - "\377e\377\377\3775\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\234\377\377\377\267" - "\377\377\377B\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\343\377\377" - "\377\375\377\377\377M\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" - "\377\377\13\377\377\377\355\377\377\377\367\377\377\3778\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377j\377\377\377\373\377\377\377\243\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377b\377\377\377\237\377\377\377\233\377\377\377Z\0\0\0\0\0" - "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "b\377\377\377c\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377)\377\377\377e\377\377\377I\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377U\377\377\377" - "c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377b\377\377\377c\377\377\377\13\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377S\377\377\377c\377\377\3775\0\0\0\0\0\0\0\0\0" - "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\213\377" - "\377\377\363\377\377\377\364\377\377\377\364\377\377\377\372\377\377\377" - "\225\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377u\377\377" - "\377\371\377\377\377\233\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\215\377\377\377\372" - "\377\377\377\364\377\377\377\364\377\377\377\363\377\377\377\224\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377U\377\377\377e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\377\377\377\13\377\377\377\351\377\377\377\376\377\377\377s\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\214\377\377\377\372\377" - "\377\377\\\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\367\377\377\377" - "\315\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\3775\377\377\377\340" - "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\304\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\377\377\377\214\377\377\377\372\377\377\377\\\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\377\377\377s\377\377\377\366\377\377\377\342\377\377\377%" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377s\377\377\377\366\377\377\377\342\377\377\377%\0\0\0" - "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377" - "\372\377\377\377\225\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\306\377\377\377\374\377" - "\377\377\370\377\377\377\370\377\377\377\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377E\377\377" - "\377\317\377\377\377\357\377\377\377\373\377\377\377\225\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\320" - "\377\377\377\374\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377\215\377\377\377\372\377\377\377\363\377" - "\377\377\333\377\377\377m\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\1\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\13\377\377\377\364\377\377\377\366\377\377\377%\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377" - "\377\361\377\377\377\377\377\377\377\254\377\377\377=\377\377\377\375\377" - "\377\377\372\377\377\377)\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\215\377\377\377\363\377\377\377%\377\377\377" - "\224\377\377\377\363\377\377\377%\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\3772\377\377\377\336\377\377\377\375\377" - "\377\377x\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\377\377\377\262\377\377\377\372\377\377\377\370\377\377\377\246\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377=\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\377\377\377~\377\377\377\374\377\377\377\377\377\377" - "\377\376\377\377\377\224\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377V\377\377\377\375\377\377\377" - "\376\377\377\377l\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\325\377\377\377\377" - "\377\377\377\271\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\355\377\377\377\33\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377v\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" - "\315\377\377\377\367\377\377\377\373\377\377\377\334\377\377\377B\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377`\377\377\377\300\377\377\377\342\377\377\377Z\0\0\0\0\0\0\0\0\0\0\0" - "\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\224\377\377" - "\377\347\377\377\377\373\377\377\377\364\377\377\377\312\377\377\377)\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377" - "\226\377\377\377\346\377\377\377\370\377\377\377\360\377\377\377\327\377" - "\377\377b\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\214\377\377\377\343\377\377\377\273" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377" - "\377\377\315\377\377\377\337\377\377\377\333\377\377\377\333\377\377\377" - "\333\377\377\377\343\377\377\377\223\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\215\377\377\377\346\377\377\377" - "\370\377\377\377\364\377\377\377\320\377\377\377O\0\0\0\0\377\377\377\377" - "\377\377\377\377\377\377\377\13\377\377\377\315\377\377\377\337\377\377\377" - "\333\377\377\377\333\377\377\377\333\377\377\377\333\377\377\377\333\377" - "\377\377\323\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0" - "\0\377\377\3772\377\377\377\316\377\377\377\366\377\377\377\373\377\377\377" - "\344\377\377\377\200\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\377\377\377u\377\377\377\342\377\377\377\370\377\377\377\364" - "\377\377\377\305\377\377\377%\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377)\377\377\3775\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\371\371\377.\377\377\377V\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\377\13\377\377\377\321\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\271\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377Q\377\377\377" - "\273\377\377\377\332\377\377\377\322\377\377\377\206\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\3778\377\377" - "\377\367\377\377\377\376\377\377\377s\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\374\377\377\377\360\377\377\377\253\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377" - "\13\377\377\377\304\377\377\377\375\377\377\377\377\377\377\377\377\377\377" - "\377\373\377\377\377\247\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\377\377\377\307\377\377\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\374\377\377\377\324\377\377\377B\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\346" - "\377\377\377\13\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377" - "\377\377\352\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\376\377\377\377l\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\377\377\3775\377\377\377\333\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\361\377\377\377\202\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\307\377\377\377\376\377" - "\377\377i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\352\377\377\377\364" - "\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377" - "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\373\377\377\377" - "\377\377\377\377\377\377\377\377\303\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\377\13\377\377\377\361\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\225\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377" - "\377\377\377\225\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\356\377\377\377" - "\376\377\377\377v\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13" - "\377\377\377\352\377\377\377\364\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\307\377" - "\377\377\377\377\377\377\243\0\0\0\0\0\0\0\0\377\377\377u\377\377\377\375" - "\377\377\377\321\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" - "\377\307\377\377\377\377\377\377\377\251\0\0\0\0\0\0\0\0\377\377\377\13\377" - "\377\377\355\377\377\377\330\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\377\377\377\206\377\377\377\366\377\377\377\377\377\377\377" - "\377\377\377\377\373\377\377\377\246\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\370\377\377\377\324\377\377\377" - "B\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\206" - "\377\377\377\370\377\377\377\377\377\377\377\377\377\377\377\373\377\377" - "\377\240\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" - "\377\224\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\364\377\377\377\312\377\377\377\33\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\377\377\377\204\377\377\377\365\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\377\342\377\377\377V\0\0\0\0" - "\377\377\377\377\377\377\377\377\377\377\377\224\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\377\377\373\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\252\377\377\377\377\377\377" - "\377\377\0\0\0\0\377\377\377\307\377\377\377\376\377\377\377i\0\0\0\0\0\0" - "\0\0\377\377\377\13\377\377\377\352\377\377\377\364\377\377\377%\377\377" - "\377\377\377\377\377\377\377\377\377}\377\377\377\376\377\377\377\332\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\262\377\377\377\377\377\377\377" - "\216\377\377\377\377\377\377\377\377\377\377\377\345\377\377\377\372\377" - "\377\377=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355" - "\377\377\377\356\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377" - "\345\377\377\377\376\377\377\377~\0\0\0\0\0\0\0\0\377\377\3778\377\377\377" - "\367\377\377\377\360\377\377\377\33\377\377\377\377\377\377\377\377\377\377" - "\377\206\377\377\377\377\377\377\377\332\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\266\377\377\377\377\377\377\377\234\377\377\377\377\377\377" - "\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\361" - "\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\224\377\377\377\377\377\377\377\312\377\377\377\255\377\377\377" - "\266\377\377\377u\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" - "\377;\377\377\377\373\377\377\377\347\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377`\377\377" - "\377\266\377\377\377\263\377\377\377\256\377\377\377\373\377\377\377\254" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\33\377\377\377\371\377\377\377\376\377\377\377_\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377b\377\377\377\374" - "\377\377\377\355\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" - "\224\377\377\377\376\377\377\377l\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377" - "\377\377\374\377\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\334\377\377\377\377\377\377\377\346\377\377\377\272\377\377\377" - "\342\377\377\377\276\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377" - "l\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\215\377\377\377\377" - "\377\377\377\377\377\377\377l\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\215\377\377\377\377\377" - "\377\377\377\377\377\377l\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\377\377\377K\377\377\377\375\377\377\377\254\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" - "\377\377\247\377\377\377\343\377\377\377\340\377\377\377\377\377\377\377" - "\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377`\377\377\377\262\377\377\377=\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\342\377\377\377\377\377\377\377" - "\325\377\377\377\266\377\377\377u\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377" - "\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" - "\377\377`\377\377\377\263\377\377\377\307\377\377\377\376\377\377\377\363" - "\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\0\377\377\377\0\377\377\377\0\377\377\377\1\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377" - "\377\351\377\377\377\366\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\356\377\377\377\377" - "\377\377\377\243\377\377\377;\377\377\377\374\377\377\377\364\377\377\377" - "%\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\313\377\377\377\355\0\0\0\0\377\377\377\320\377\377\377\346\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\247" - "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\352\377\377\377S\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377" - "}\377\377\377\377\377\377\377\326\377\377\377\334\377\377\377\376\377\377" - "\377l\0\0\0\0\377\377\377}\377\377\377\377\377\377\377\323\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\354\377\377\377\364\377" - "\377\377\226\377\377\377\373\377\377\377\337\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\33\377\377" - "\377\362\377\377\377\376\377\377\377l\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\232\377" - "\377\377\377\377\377\377\336\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\302\377\377\377\377\377" - "\377\377\277\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377|\377\377\377\205\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377_\377\377\377\232\377\377\377\13\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "!\377\377\377\371\377\377\377\352\377\377\377\13\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\345\377\377\377\377\377" - "\377\377\365\377\377\377\353\377\377\377\377\377\377\377\367\377\377\377" - "2\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\313" - "\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377l\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\314\377" - "\377\377\377\377\377\377\376\377\377\377\335\377\377\377\371\377\377\377" - "\377\377\377\377\352\377\377\377\33\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\377\377\377\302\377\377\377\377\377\377\377\377\377\377\377\342" - "\377\377\377\362\377\377\377\377\377\377\377\375\377\377\377\\\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "U\377\377\377\374\377\377\377\377\377\377\377\333\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\361\377\377\377" - "\377\377\377\377\373\377\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\251\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377" - "\377\377\247\377\377\377\377\377\377\377\377\377\377\377\360\377\377\377" - "\373\377\377\377\377\377\377\377\360\377\377\377\33\377\377\377\377\377\377" - "\377\377\0\0\0\0\377\377\377\332\377\377\377\377\377\377\377\376\377\377" - "\377\374\377\377\377\374\377\377\377\376\377\377\377\377\377\377\377\367" - "\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\25\377" - "\377\377\356\377\377\377\377\377\377\377\351\377\377\377\350\377\377\377" - "\376\377\377\377\376\377\377\377s\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\377\377\377|\377\377\377\376\377\377\377\377\377\377\377\345\377" - "\377\377\356\377\377\377\377\377\377\377\355\377\377\377%\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377}\377\377\377\374\377\377\377\254\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" - "\377\377V\377\377\377\375\377\377\377\241\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\3778\377" - "\377\377\372\377\377\377\343\377\377\377u\377\377\377\217\377\377\377\374" - "\377\377\377\375\377\377\377M\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\377\377\377\233\377\377\377\376\377\377\377\377\377\377\377" - "\354\377\377\377\375\377\377\377\377\377\377\377\257\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\232\377\377\377" - "\377\377\377\377\377\377\377\377\277\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377" - "\342\377\377\377\304\377\377\377\332\377\377\377\376\377\377\377\377\377" - "\377\377\227\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377" - "\377\377\331\377\377\377\377\377\377\377\373\377\377\377\306\377\377\377" - "\307\377\377\377\375\377\377\377\376\377\377\377Q\377\377\377\377\377\377" - "\377\377\0\0\0\0\377\377\377\313\377\377\377\377\377\377\377\330\377\377" - "\377\310\377\377\377\370\377\377\377\377\377\377\377\375\377\377\377f\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\374" - "\377\377\377\376\377\377\377\323\377\377\377\327\377\377\377\327\377\377" - "\377\327\377\377\377\316\377\377\377\33\377\377\377\377\377\377\377\377\0" - "\0\0\0\377\377\377\13\377\377\377\356\377\377\377\376\377\377\377\324\377" - "\377\377\327\377\377\377\327\377\377\377\327\377\377\377\312\377\377\377" - "%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\33\377\377\377\362" - "\377\377\377\377\377\377\377\365\377\377\377\277\377\377\377\321\377\377" - "\377\377\377\377\377\366\377\377\377\33\377\377\377\377\377\377\377\377\0" - "\0\0\0\377\377\377\313\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377" - "\377\13\377\377\377\356\377\377\377\366\377\377\377%\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377}\377\377\377\332\377\377\377\323\377\377" - "\377\371\377\377\377\377\377\377\377\331\377\377\377\327\377\377\377\266" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377" - "\302\377\377\377\323\377\377\377\322\377\377\377\322\377\377\377\342\377" - "\377\377\377\377\377\377\252\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377\224\377\377\377\377\377\377\377\252\0\0\0\0\0\0\0\0\377" - "\377\377\335\377\377\377\377\377\377\377\315\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377\13\377\377\377\356\377\377\377\366\377\377" - "\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\377\313\377\377\377\377\377\377\377\336\0\0\0\0\0\0" - "\0\0\377\377\377\275\377\377\377\377\377\377\377\330\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\377\377\377\312\377\377\377\377\377\377\377" - "\364\377\377\377%\0\0\0\0\377\377\377\13\377\377\377\361\377\377\377\333" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377j\377\377\377" - "\375\377\377\377\377\377\377\377\325\377\377\377\313\377\377\377\376\377" - "\377\377\377\377\377\377\225\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377\224\377\377\377\377\377\377\377\342\377\377\377\310\377" - "\377\377\322\377\377\377\366\377\377\377\377\377\377\377\355\377\377\377" - "\33\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377j\377\377\377\375" - "\377\377\377\377\377\377\377\321\377\377\377\307\377\377\377\376\377\377" - "\377\377\377\377\377\216\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\377\377\377\224\377\377\377\377\377\377\377\342\377\377\377\310\377\377" - "\377\322\377\377\377\371\377\377\377\377\377\377\377\336\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\374\377\377\377" - "\377\377\377\377\330\377\377\377\271\377\377\377\351\377\377\377\377\377" - "\377\377\334\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377}\377\377" - "\377\332\377\377\377\327\377\377\377\323\377\377\377\371\377\377\377\377" - "\377\377\377\331\377\377\377\326\377\377\377\332\377\377\377p\377\377\377" - "\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377" - "i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\356\377\377\377\366\377\377" - "\377%\377\377\377\377\377\377\377\377\377\377\377\33\377\377\377\365\377" - "\377\377\375\377\377\3778\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\345" - "\377\377\377\375\377\377\377Q\377\377\377\377\377\377\377\377\377\377\377" - "\313\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\13\377\377\377\361\377\377\377\347\377\377\377\377\377\377\377\377\0" - "\0\0\0\377\377\377\214\377\377\377\377\377\377\377\343\0\0\0\0\0\0\0\0\377" - "\377\377\261\377\377\377\377\377\377\377\272\0\0\0\0\377\377\377\377\377" - "\377\377\377\377\377\377\13\377\377\377\351\377\377\377\376\377\377\377i" - "\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\366\377\377\377\372\377\377\377" - "8\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377v\377\377\377\327\377" - "\377\377\322\377\377\377\322\377\377\377\316\377\377\377\351\377\377\377" - "\377\377\377\377\360\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0" - "\0\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377U\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377" - "\377\377\320\377\377\377\376\377\377\377_\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\13\377\377\377\364\377\377\377\254\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377" - "\377\377\377\377\377\377\377\377\377\377\272\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\233\377\377\377\371\377\377\377" - "i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\376\377\377" - "\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377I\377\377\377\373\377\377\377" - "\356\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377" - "\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "S\377\377\377\314\377\377\377\271\377\377\377\13\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377S\377" - "\377\377\314\377\377\377\271\377\377\377\13\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\375\377\377\377\252\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\360\377\377\377\334\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\247\377\377\377\377\377\377\377l\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\361\377\377\377\337\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0" - "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\377\377\377\313\377\377\377\372\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\0\377\377\377\0\377\377\377\3\0" - "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0" - "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\331" - "\377\377\377\376\377\377\377i\377\377\377K\377\377\377\374\377\377\377\366" - "\377\377\377)\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\316\377\377\377\333\0\0\0\0\377\377\377\316\377\377\377" - "\333\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" - "8\377\377\377\372\377\377\377\377\377\377\377\307\377\377\377\237\377\377" - "\377\364\377\377\377\377\377\377\377\244\0\0\0\0\377\377\377\377\377\377" - "\377\377\377\377\377\232\377\377\377\375\377\377\3772\377\377\377=\377\377" - "\377\375\377\377\377\254\377\377\377!\377\377\377\371\377\377\377\367\377" - "\377\3778\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377;\377\377\377" - "\372\377\377\377\346\377\377\377\13\377\377\377\371\377\377\377\333\0\0\0" - "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\377\377\377\13\377\377\377\355\377\377\377\375\377\377\377\\\0\0\0\0\0" - "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\13\377\377\377\355\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377!\377\377\377\372\377\377\377\375\377\377\3778\0\0\0\0\0\0\0\0\0\0\0" - "\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\327\377\377\377\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\320\377\377" - "\377\374\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\252\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\204\377" - "\377\377\377\377\377\377\353\377\377\377\13\0\0\0\0\377\377\377\320\377\377" - "\377\377\377\377\377\260\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\377\377\377\205\377\377\377\322\377\377\377\353\377\377\377\376" - "\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377\325\377\377\377\375\377\377\377M\0\0\0\0\377\377\377\33" - "\377\377\377\356\377\377\377\376\377\377\377l\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377\215\377\377\377\375\377\377\377Z\0\0\0\0" - "\0\0\0\0\377\377\377\325\377\377\377\377\377\377\377\257\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\25\377\377\377" - "\356\377\377\377\377\377\377\377\377\377\377\377\326\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\374\377\377" - "\377\330\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377!\377\377\377\371\377\377\377\377\377" - "\377\377\216\0\0\0\0\0\0\0\0\377\377\377\302\377\377\377\224\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\302\377\377\377\377\377\377\377\252\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\377\377\377V\377\377\377\375\377\377\377\333" - "\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\260\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\330\377\377\377\377" - "\377\377\377\251\0\0\0\0\377\377\377\13\377\377\377\336\377\377\377\377\377" - "\377\377\227\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\250\377\377\377\276\377\377\377\33\0\0\0\0\0\0\0" - "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\377\377\377\250\377\377\377\276\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\276\377\377\377\377\377\377\377\377\377\377\377\225\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\377\377\377I\377\377\377\373\377\377\377\377\377\377\377\325\377" - "\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\306\377" - "\377\377\376\377\377\377l\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\377\377\377K\377\377\377\374\377\377\377\375\377\377\377q\0\0\0\0\377\377" - "\377\33\377\377\377\362\377\377\377\366\377\377\377%\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\334\377\377\377\377\377" - "\377\377\376\377\377\377\360\377\377\377\33\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\243" - "\0\0\0\0\0\0\0\0\377\377\377\223\377\377\377\377\377\377\377\327\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377s\377\377\377\376\377" - "\377\377\375\377\377\377_\0\0\0\0\0\0\0\0\377\377\377z\377\377\377\257\0" - "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377" - "\376\377\377\377U\0\0\0\0\377\377\377\33\377\377\377\353\377\377\377\377" - "\377\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" - "\377K\377\377\377\374\377\377\377\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377" - "\377\355\377\377\377\366\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\247\377\377\377" - "\377\377\377\377\364\377\377\377)\0\0\0\0\0\0\0\0\377\377\377\246\377\377" - "\377\213\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313" - "\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" - "\355\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\355\377\377\377\363\377\377\377\13\0" - "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\213\377\377\377\377\377\377\377" - "\252\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377" - "\377\377\377\377\377\377\252\0\0\0\0\377\377\377\270\377\377\377\377\377" - "\377\377\355\377\377\377\33\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0" - "\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" - "\377\377\307\377\377\377\377\377\377\377\375\377\377\3778\377\377\377\13" - "\377\377\377\352\377\377\377\377\377\377\377\327\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377\307\377\377\377\377\377\377\377\377" - "\377\377\377\251\0\0\0\0\377\377\377\13\377\377\377\361\377\377\377\333\0" - "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377" - "\377\377\377\377\315\0\0\0\0\0\0\0\0\377\377\377\253\377\377\377\377\377" - "\377\377\346\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" - "\224\377\377\377\377\377\377\377\243\0\0\0\0\0\0\0\0\377\377\377\25\377\377" - "\377\356\377\377\377\376\377\377\377l\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377\313\377\377\377\377\377\377\377\310\0\0\0\0\0\0\0\0\377" - "\377\377\253\377\377\377\377\377\377\377\342\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\243\0\0" - "\0\0\0\0\0\0\377\377\377!\377\377\377\371\377\377\377\367\377\377\377)\377" - "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\232\377\377\377\377\377" - "\377\377\315\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\302\377\377\377z\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\355\377\377\377\363\377\377\377\13\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377" - "i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377" - "\377%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\312\377\377\377" - "\377\377\377\377\215\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377" - "\377\347\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\247\377\377" - "\377\377\377\377\377\206\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377" - "\377\377\374\377\377\377\333\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\377\377\377\342\377\377\377\376\377\377\377v\377\377\377\33\377\377" - "\377\366\377\377\377\367\377\377\377)\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\377\214\377\377\377\377\377\377\377\316\0\0\0\0\0\0" - "\0\0\377\377\377\232\377\377\377\377\377\377\377\264\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\25\377\377\377\356\377\377\377\376\377\377\377v\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\376" - "\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\377\377\377\377\277\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\364\377\377\377\254\0" - "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" - "\0\0\0\377\377\377\335\377\377\377\370\377\377\377\353\377\377\377\363\377" - "\377\377%\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377)\377\377\377V\377\377\377\33\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224" - "\377\377\377\376\377\377\377b\0\0\0\0\377\377\377S\377\377\3775\0\0\0\0\0" - "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\377\377\377S\377\377\377I\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377S\377" - "\377\3775\377\377\377;\377\377\377\374\377\377\377\333\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377)\377\377" - "\377V\377\377\377\13\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377;\377\377\377\374\377\377\377\326" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377E\377\377\377E\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377" - "\377\376\377\377\377b\0\0\0\0\377\377\377E\377\377\377S\0\0\0\0\0\0\0\0\0" - "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377" - "\377\375\377\377\377\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377" - "\377\377\361\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377)\377\377\377X\0" - "\0\0\0\0\0\0\0\377\377\377V\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377E\377\377\377S\0\0\0" - "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\377\377\377E\377\377\377K\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377S\377\377\3775\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377S\377\377\3775\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377)\377\377\377U\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377E\377\377\377U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\376\377\377" - "\377b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\361" - "\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371" - "\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377" - "%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\0\377" - "\377\377\0\377\377\377\6\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371" - "\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377l\377\377\377\33" - "\377\377\377\364\377\377\377\352\377\377\377\13\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\3772\377\377\377\274\377\377\377\361\377\377" - "\377\375\377\377\377\265\377\377\377\367\377\377\377\372\377\377\377\221" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377V\377\377\377" - "\374\377\377\377\336\0\0\0\0\0\0\0\0\377\377\3775\377\377\377\261\377\377" - "\377\13\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\232\377\377\377" - "\371\377\377\377\33\377\377\377;\377\377\377\374\377\377\377\217\377\377" - "\377\335\377\377\377\375\377\377\377\\\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\377\33\377\377\377\371\377\377\377\333\377\377\377e" - "\377\377\377\374\377\377\377\326\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\361\377" - "\377\377\364\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377b\377\377\377\375\377\377\377" - "\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\266\377\377\377\377\377\377\377" - "\227\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\316\377\377\377\334\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\335\377\377" - "\377\375\377\377\377=\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377\306\377\377\377\377\377\377\377\225\0\0\0\0\0\0\0\0\377" - "\377\377`\377\377\377\375\377\377\377\346\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\213\377\377\377\376" - "\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\3772\377\377\377f\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\253\377" - "\377\377\376\377\377\377i\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\231\377\377\377\377" - "\377\377\377\257\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\313\377\377\377\377\377\377\377\356\377\377\377\374" - "\377\377\377\332\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\377\377\377K\377\377\377\374\377\377\377\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" - "\224\377\377\377\377\377\377\377\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377b\377\377\377\375\377\377\377\347\377\377\377\13" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377U\377\377\377" - "\375\377\377\377\266\0\0\0\0\0\0\0\0\377\377\377;\377\377\377\374\377\377" - "\377\236\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\25\377\377\377" - "\361\377\377\377\367\377\377\377)\0\0\0\0\0\0\0\0\377\377\377j\377\377\377" - "\376\377\377\377\322\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\214\377\377\377\377\377\377\377\377\377\377\377" - "\260\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\214\377\377\377\377\377\377\377\377\377\377\377" - "\260\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377G\377\377\377\350\377\377\377\377\377\377\377\367" - "\377\377\377y\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" - "\377\377\207\377\377\377\307\377\377\377\304\377\377\377\304\377\377\377" - "\304\377\377\377\304\377\377\377\304\377\377\377\243\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377S\377\377\377\351\377\377" - "\377\377\377\377\377\365\377\377\377n\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\13\377\377\377\345\377\377\377\376\377\377\377_\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377\273\377\377\377\377\377\377\377\234" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\232\377\377\377\376\377\377\377i\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377;\377\377\377\373" - "\377\377\377\344\377\377\377\317\377\377\377\376\377\377\377v\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377" - "\377\377\377\377\252\0\0\0\0\0\0\0\0\377\377\377X\377\377\377\375\377\377" - "\377\327\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\300" - "\377\377\377\377\377\377\377\277\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377" - "\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377" - "\377\375\377\377\377Q\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" - "K\377\377\377\374\377\377\377\332\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377" - "\355\377\377\377\366\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\342\377\377\377\377" - "\377\377\377\225\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377" - "\377b\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377" - "\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\13\377\377\377\355\377\377\377\366\377\377\377)\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\252\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377" - "\377\377\237\377\377\377\203\377\377\377\377\377\377\377\375\377\377\377" - "Q\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13" - "\377\377\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\312\377" - "\377\377\377\377\377\377\377\377\377\377\217\377\377\377X\377\377\377\375" - "\377\377\377\373\377\377\377\332\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\377\377\377\313\377\377\377\373\377\377\377\371\377\377\377\366" - "\377\377\377%\377\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\377" - "\377\377\377\377\377\377\377\377\377\377\33\377\377\377\362\377\377\377\375" - "\377\377\377\\\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\366\377\377\377" - "\375\377\377\377Q\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224" - "\377\377\377\377\377\377\377\252\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\306" - "\377\377\377\375\377\377\377\\\377\377\377\377\377\377\377\377\377\377\377" - "\33\377\377\377\362\377\377\377\375\377\377\377Q\0\0\0\0\0\0\0\0\377\377" - "\377!\377\377\377\371\377\377\377\375\377\377\377M\377\377\377\377\377\377" - "\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\252\0\0\0\0" - "\0\0\0\0\377\377\377\25\377\377\377\370\377\377\377\364\377\377\377%\377" - "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\232\377\377\377\377\377" - "\377\377\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355" - "\377\377\377\366\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377i\0\0\0\0" - "\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%\377" - "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\204\377\377\377\377\377" - "\377\377\311\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377" - "\260\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\222\377\377\377" - "\377\377\377\377\252\0\0\0\0\377\377\377\307\377\377\377\355\377\377\377" - "%\377\377\377K\377\377\377\374\377\377\377\260\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\377\377\377l\377\377\377\376\377\377\377\333\377\377" - "\377\243\377\377\377\377\377\377\377\244\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\345\377\377\377\375\377" - "\377\377M\377\377\377\13\377\377\377\351\377\377\377\372\377\377\377)\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\317\377\377\377\377\377\377\377\277\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377" - "\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\25\377\377\377\362\377\377\377" - "\363\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\364\377" - "\377\377\254\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\377\377\377U\377\377\377\374\377\377\377\316\377\377\377\247" - "\377\377\377\377\377\377\377\206\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\216\377\377\377\345\377\377" - "\377\377\377\377\377\377\377\377\377\376\377\377\377\275\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\376" - "\377\377\377\271\377\377\377\364\377\377\377\377\377\377\377\377\377\377" - "\377\313\377\377\377\13\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0" - "\0\0\0\377\377\377\13\377\377\377\272\377\377\377\371\377\377\377\377\377" - "\377\377\377\377\377\377\355\377\377\377\200\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\361\377\377\377\377" - "\377\377\377\377\377\377\377\325\377\377\377\377\377\377\377\332\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\3775\377\377\377" - "\327\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\267\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\205\377" - "\377\377\361\377\377\377\363\377\377\377\377\377\377\377\374\377\377\377" - "\364\377\377\377\367\377\377\377\354\377\377\377%\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\377\377\377b\377\377\377\350\377\377\377\377\377" - "\377\377\377\377\377\377\360\377\377\377\360\377\377\377\375\377\377\377" - "\243\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377" - "\376\377\377\377\215\377\377\377\350\377\377\377\377\377\377\377\377\377" - "\377\377\346\377\377\3772\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\377\377\377\301\377\377\377\370\377\377\377\364\377\377\377\364\377\377" - "\377\360\377\377\377\350\377\377\377%\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377\301\377\377\377\370\377\377\377\364\377" - "\377\377\364\377\377\377\360\377\377\377\350\377\377\377%\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\375\377" - "\377\377\252\0\0\0\0\0\0\0\0\377\377\377S\377\377\377\354\377\377\377\363" - "\377\377\377I\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\342\377\377" - "\377\332\377\377\377\374\377\377\377\377\377\377\377\276\377\377\377\353" - "\377\377\377\377\377\377\377\352\377\377\377)\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\377\214\377\377\377\371\377\377\377\212\377\377\377" - "\350\377\377\377\377\377\377\377\377\377\377\377\346\377\377\3772\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377u\377\377\377" - "\351\377\377\377\377\377\377\377\377\377\377\377\364\377\377\377\222\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\213\377" - "\377\377\371\377\377\377\262\377\377\377\365\377\377\377\377\377\377\377" - "\377\377\377\377\313\377\377\377\13\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\361\377\377\377\377\377\377\377" - "\377\377\377\377\310\377\377\377\347\377\377\377\315\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\301\377\377\377\351\377" - "\377\377)\377\377\377\326\377\377\377\377\377\377\377\377\377\377\377\372" - "\377\377\377M\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377" - "\224\377\377\377\365\377\377\377\377\377\377\377\377\377\377\377\373\377" - "\377\377\300\377\377\377=\0\0\0\0\377\377\377\377\377\377\377\377\377\377" - "\377\13\377\377\377\332\377\377\377\360\377\377\377\373\377\377\377\377\377" - "\377\377\376\377\377\377\364\377\377\377\367\377\377\377\354\377\377\377" - "%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\301\377\377\377\354" - "\377\377\3772\0\0\0\0\0\0\0\0\377\377\377I\377\377\377\364\377\377\377\275" - "\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377I\377\377\377\364\377" - "\377\377\330\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\267\377\377\377" - "\367\377\377\377\\\377\377\377\377\377\377\377\377\377\377\377\335\377\377" - "\377\360\377\377\3778\0\0\0\0\377\377\377~\377\377\377\224\0\0\0\0\377\377" - "\377\13\377\377\377\332\377\377\377\342\377\377\377\377\377\377\377\377\0" - "\0\0\0\377\377\377\275\377\377\377\373\377\377\377\255\0\0\0\0\0\0\0\0\377" - "\377\377r\377\377\377\370\377\377\377\315\0\0\0\0\377\377\377\377\377\377" - "\377\377\377\377\377I\377\377\377\364\377\377\377\330\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\254\377\377\377\367\377\377\377\\\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\365\377\377\377\364\377" - "\377\377\364\377\377\377\364\377\377\377\360\377\377\377\360\377\377\377" - "\354\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313" - "\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\0\377\377\377\0\377\377\377\7\0\0\0\0\0\0\0\0\0" - "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\313\377\377\377\372\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\306\377\377\377\375" - "\377\377\3778\377\377\377\13\377\377\377\364\377\377\377\334\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\364" - "\377\377\377\376\377\377\377\370\377\377\377\364\377\377\377\376\377\377" - "\377\374\377\377\377\320\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\377\377\3778\377\377\377\372\377\377\377\376\377\377\377\307\377\377\377" - "O\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377" - "\377\223\377\377\377\377\377\377\377\234\377\377\377\243\377\377\377\376" - "\377\377\377\217\377\377\377\373\377\377\377v\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\331\377\377\377\377\377" - "\377\377\377\377\377\377\367\377\377\3778\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\323" - "\377\377\377\374\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\245\377\377\377\377\377" - "\377\377\215\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377V\377\377\377\375\377\377" - "\377\322\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\377\377\377\260\377\377\377\354\377\377\377\236\377\377\377\326\377\377" - "\377\361\377\377\377\224\377\377\377\341\377\377\377\314\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313" - "\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\325" - "\377\377\377\374\377\377\3772\377\377\377\215\377\377\377\241\377\377\377" - "\13\377\377\377\361\377\377\377\367\377\377\377)\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\376" - "\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\307\377\377\377" - "\376\377\377\377l\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\200\377\377\377\363\377\377\377\376" - "\377\377\377s\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377" - "\377\377\240\377\377\377\377\377\377\377\363\377\377\377V\377\377\377\374" - "\377\377\377\333\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\377\377\377K\377\377\377\374\377\377\377\333\377\377\377\274\377\377\377" - "\310\377\377\377\251\377\377\377=\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\377\377\377\314\377\377\377\376\377\377\377l\377\377\377" - "j\377\377\377\237\377\377\377\223\377\377\377%\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\342\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\377\377\3778\377\377\377\372\377\377\377\376\377\377\377" - "\237\0\0\0\0\377\377\377\254\377\377\377\377\377\377\377\243\0\0\0\0\377" - "\377\377\377\377\377\377\377\377\377\377\25\377\377\377\361\377\377\377\366" - "\377\377\377\33\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\366\377\377\377" - "\355\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\377\377\377\232\377\377\377\377\377\377\377\377\377\377\377\323\0\0\0" - "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\377\377\377\232\377\377\377\377\377\377\377\377\377\377\377\323\0\0\0" - "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377" - "\377\224\377\377\377\374\377\377\377\377\377\377\377\314\377\377\377\33\0" - "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" - "\274\377\377\377\377\377\377\377\370\377\377\377\370\377\377\377\370\377" - "\377\377\370\377\377\377\373\377\377\377\321\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\264\377\377\377" - "\377\377\377\377\377\377\377\377\262\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\337" - "\377\377\377\377\377\377\377\271\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\377\377\377\25\377\377\377\361\377\377\377\352\0\0\0\0\0\0\0\0\0" - "\0\0\0\377\377\377U\377\377\377\237\377\377\377\376\377\377\377l\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\232\377\377\377\377" - "\377\377\377\266\377\377\377\213\377\377\377\377\377\377\377\304\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377" - "\377\377\377\377\377\265\377\377\377E\377\377\377y\377\377\377\337\377\377" - "\377\377\377\377\377\227\0\0\0\0\377\377\377\377\377\377\377\377\377\377" - "\377\13\377\377\377\352\377\377\377\375\377\377\377Q\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" - "\377\377\313\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\324\377\377\377\376\377\377\377l\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377K\377\377\377\374\377\377\377\337\377\377\377Z\377\377\377" - "p\377\377\377p\377\377\377f\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377)\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377" - "\377\3775\377\377\377\371\377\377\377\367\377\377\377)\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" - "\377\377\313\377\377\377\376\377\377\377\224\377\377\377m\377\377\377v\377" - "\377\377h\377\377\377\362\377\377\377\366\377\377\377%\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377" - "\377\366\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377" - "\377\377\377\377\377\377\252\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377\224\377\377\377\377\377\377\377\300\377\377\377\372\377" - "\377\377\377\377\377\377\236\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377" - "\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\377\313\377\377\377\370\377\377\377\366\377\377\377" - "\317\377\377\377\243\377\377\377\376\377\377\377\372\377\377\377\333\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377" - "\367\377\377\377\304\377\377\377\377\377\377\377\251\377\377\377\13\377\377" - "\377\361\377\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\377\377" - "\377U\377\377\377\374\377\377\377\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\314\377\377\377\376\377\377\377i\377\377\377\377\377\377\377\377" - "\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\243\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\335\377\377\377\376\377\377\377l\377\377\377\377\377" - "\377\377\377\377\377\377U\377\377\377\374\377\377\377\336\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\317\377\377\377\376\377\377\377l\377\377\377" - "\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377" - "\243\0\0\0\0\0\0\0\0\377\377\377`\377\377\377\373\377\377\377\366\377\377" - "\377%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377`\377\377\377\374" - "\377\377\377\377\377\377\377\336\377\377\377\205\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\13\377\377\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377" - "\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377" - "\377\366\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" - "\33\377\377\377\371\377\377\377\360\377\377\377\33\0\0\0\0\377\377\377\320" - "\377\377\377\376\377\377\377_\0\0\0\0\377\377\377\377\377\377\377\377\377" - "\377\377U\377\377\377\375\377\377\377\277\377\377\377\33\377\377\377\366" - "\377\377\377\376\377\377\377m\377\377\377\213\377\377\377\377\377\377\377" - "\243\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\324\377\377\377\377\377\377\377\377\377\377\377\355\377\377\377\33\0\0\0" - "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\204" - "\377\377\377\377\377\377\377\304\377\377\377\204\377\377\377\377\377\377" - "\377\260\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\214\377\377\377\377\377\377\377\355\377\377" - "\377\33\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" - "\0\0\0\377\377\377\224\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\266\377\377\377\377\377\377\377\206\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\13\377\377\377\364\377\377\377\254\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\266\377\377\377\377\377" - "\377\377\207\377\377\377K\377\377\377\374\377\377\377\327\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377}\377\377\377" - "\377\377\377\377\373\377\377\377\313\377\377\377\303\377\377\377\374\377" - "\377\377\377\377\377\377\252\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377\224\377\377\377\377\377\377\377\377\377\377\377\351\377" - "\377\377\300\377\377\377\365\377\377\377\377\377\377\377\316\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\346\377\377" - "\377\377\377\377\377\365\377\377\377\305\377\377\377\315\377\377\377\376" - "\377\377\377\366\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0\0\377" - "\377\377}\377\377\377\376\377\377\377\377\377\377\377\325\377\377\377\321" - "\377\377\377\376\377\377\377\377\377\377\377\332\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\3778\377\377\377\371\377\377\377\377\377" - "\377\377\335\377\377\377\263\377\377\377\351\377\377\377\377\377\377\377" - "\304\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377S\377\377" - "\377\330\377\377\377\343\377\377\377\377\377\377\377\364\377\377\377\327" - "\377\377\377\333\377\377\377\322\377\377\377\33\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\3778\377\377\377\372\377\377\377\376\377\377\377\275" - "\377\377\377\307\377\377\377\376\377\377\377\377\377\377\377\324\377\377" - "\377y\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377" - "\377\377\377\377\377\377\377\377\370\377\377\377\306\377\377\377\356\377" - "\377\377\377\377\377\377\322\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377\224\377\377\377\336\377\377\377\333\377\377\377\327\377" - "\377\377\377\377\377\377\366\377\377\377)\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\336\377\377\377\333" - "\377\377\377\327\377\377\377\377\377\377\377\366\377\377\377)\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\375" - "\377\377\377\252\0\0\0\0\377\377\377`\377\377\377\373\377\377\377\377\377" - "\377\377\242\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\355" - "\377\377\377\377\377\377\377\346\377\377\377\362\377\377\377\377\377\377" - "\377\362\377\377\377\347\377\377\377\377\377\377\377\215\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\377" - "\377\377\377\370\377\377\377\306\377\377\377\356\377\377\377\377\377\377" - "\377\322\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377u\377" - "\377\377\376\377\377\377\377\377\377\377\321\377\377\377\307\377\377\377" - "\375\377\377\377\377\377\377\377\243\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\377\377\377\377" - "\352\377\377\377\300\377\377\377\365\377\377\377\377\377\377\377\316\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377}\377\377\377\376" - "\377\377\377\377\377\377\377\325\377\377\377\321\377\377\377\376\377\377" - "\377\377\377\377\377\332\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377\366\377\377\377\377" - "\377\377\377\335\377\377\377\322\377\377\377\343\377\377\377%\377\377\377" - "\377\377\377\377\377\0\0\0\0\377\377\377u\377\377\377\377\377\377\377\370" - "\377\377\377\277\377\377\377\262\377\377\377\346\377\377\377\377\377\377" - "\377\231\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377" - "\315\377\377\377\330\377\377\377\370\377\377\377\377\377\377\377\335\377" - "\377\377\327\377\377\377\333\377\377\377\322\377\377\377\33\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377l\0\0" - "\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\377\377\377\341\377\377\377\376\377\377" - "\377v\0\0\0\0\0\0\0\0\377\377\377!\377\377\377\371\377\377\377\366\377\377" - "\377)\377\377\377\377\377\377\377\377\377\377\377\313\377\377\377\377\377" - "\377\377\205\377\377\377\13\377\377\377\364\377\377\377\376\377\377\377Q" - "\377\377\377!\377\377\377\371\377\377\377\352\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\377I\377\377\377\372\377\377\377\376\377\377\377v\377" - "\377\377\33\377\377\377\362\377\377\377\376\377\377\377}\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\377\377\377\335\377\377\377\376\377\377" - "\377v\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\364\377\377\377\372\377" - "\377\3772\377\377\377\377\377\377\377\377\0\0\0\0\377\377\3775\377\377\377" - "\323\377\377\377\333\377\377\377\333\377\377\377\327\377\377\377\377\377" - "\377\377\377\377\377\377\326\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\320\377\377\377\355\377\377\377" - "\13\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0" - "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\377\377\377\313\377\377\377\371\377\377\377\33\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377}\377\377" - "\377\313\377\377\377\257\377\377\377\13\0\0\0\0\377\377\377\223\377\377\377" - "\252\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\0\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\316" - "\377\377\377\352\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\377\377\377z\377\377\377\325\377\377\377\33\377" - "\377\377\13\377\377\377\314\377\377\377\267\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377!\377\377\377\373\377\377\377" - "\211\377\377\377!\377\377\377\374\377\377\377\200\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\205\377\377\377\370" - "\377\377\377\377\377\377\377\377\377\377\377\345\377\377\377\200\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\333\377" - "\377\377\377\377\377\377\377\377\377\377\321\0\0\0\0\377\377\377r\377\377" - "\377z\377\377\377%\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" - "\377\25\377\377\377\337\377\377\377\377\377\377\377\375\377\377\3778\0\0" - "\0\0\377\377\377U\377\377\377\365\377\377\377\256\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\255\377\377\377\275" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\314\377\377\377\376\377\377\377b\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\33\377\377\377\371\377\377\377\333\0\0\0\0\0\0\0" - "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377~\377\377\377" - "\347\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\361\377\377\377\227\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377\312\377\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\322\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377\312\377\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\322\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\261\377\377\377\377\377\377\377" - "\215\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377" - "\25\377\377\377\361\377\377\377\363\377\377\377E\377\377\377\375\377\377" - "\377\377\377\377\377V\377\377\377\324\377\377\377\366\377\377\377%\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224" - "\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377j\377\377" - "\377\375\377\377\377\361\377\377\377%\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\215\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377b\377\377\377\374\377\377\377\375\377\377" - "\377Q\377\377\377K\377\377\377\374\377\377\377\332\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\375\377\377\377" - "\377\377\377\377\374\377\377\377\376\377\377\377\377\377\377\377\375\377" - "\377\377s\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\312" - "\377\377\377\377\377\377\377\360\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\376\377\377\377\213\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\377\377" - "\377\377\315\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\377\377\377\215\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\333\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377\321\377\377\377\377\377\377\377\315\377" - "\377\377q\377\377\377\221\377\377\377\363\377\377\377\377\377\377\377\364" - "\377\377\377)\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377G\377\377\377\330\377\377\377\343\377\377\377c\0\0\0\0\0\0\0\0\0" - "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "G\377\377\377\330\377\377\377\343\377\377\377c\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\377\377\377V\377\377\377\375\377\377" - "\377\376\377\377\377\214\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377U\377\377\377\374\377\377\377" - "\377\377\377\377m\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\330\377\377\377\377\377\377\377\271\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377U\377\377\377" - "\375\377\377\377\252\0\0\0\0\377\377\377\233\377\377\377\366\377\377\377" - "\377\377\377\377\377\377\377\377\376\377\377\377i\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\377\377\377\334\377\377\377\376\377\377\377U\377" - "\377\377!\377\377\377\371\377\377\377\363\377\377\377%\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\371\377" - "\377\377)\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377" - "\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377" - "\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377" - "\377\376\377\377\377i\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" - "K\377\377\377\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\375\377\377\377)\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377l\0\0\0\0\377" - "\377\377\377\377\377\377\377\377\377\377K\377\377\377\374\377\377\377\333" - "\0\0\0\0\0\0\0\0\377\377\377\247\377\377\377\327\377\377\377\322\377\377" - "\377\300\377\377\377\13\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" - "\312\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\364\377\377\377%\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377" - "\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224" - "\377\377\377\377\377\377\377\252\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\332\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377" - "\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\377\377\377\313\377\377\377\363\377\377\377\301\377\377" - "\377\373\377\377\377\356\377\377\377\333\377\377\377\352\377\377\377\333" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377" - "\377\376\377\377\377w\377\377\377\371\377\377\377\366\377\377\377!\377\377" - "\377\360\377\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\377\377" - "\377K\377\377\377\374\377\377\377\327\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\312\377\377\377\377\377\377\377\251\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\326\377\377\377" - "\247\377\377\377\262\377\377\377\351\377\377\377\377\377\377\377\355\377" - "\377\377\33\377\377\377\377\377\377\377\377\377\377\377K\377\377\377\374" - "\377\377\377\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377" - "\377\376\377\377\377i\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" - "\224\377\377\377\377\377\377\377\356\377\377\377\340\377\377\377\343\377" - "\377\377\376\377\377\377\377\377\377\377\304\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\365\377\377\377\377" - "\377\377\377\377\377\377\377\364\377\377\377\247\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" - "\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377i\0\0" - "\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\321\377\377" - "\377\376\377\377\377i\377\377\377\33\377\377\377\365\377\377\377\355\377" - "\377\377\13\0\0\0\0\377\377\377\377\377\377\377\377\377\377\3778\377\377" - "\377\372\377\377\377\327\377\377\377c\377\377\377\377\377\377\377\377\377" - "\377\377\271\377\377\377\205\377\377\377\376\377\377\377i\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377l\377\377\377\377\377" - "\377\377\377\377\377\377\226\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\344\377\377\377\376\377" - "\377\377\372\377\377\377\367\377\377\377)\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377!\377\377\377\371\377" - "\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\376\377\377" - "\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377V\377\377\377\375\377\377\377\326\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\364\377\377\377\254\0\0\0\0\0" - "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\33\377" - "\377\377\364\377\377\377\363\377\377\377%\0\0\0\0\377\377\377\335\377\377" - "\377\375\377\377\377M\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\377\377\377\177\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\205\377" - "\377\377\376\377\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377\224\377\377\377\377\377\377\377\257\0\0\0\0\0\0\0\0\377" - "\377\377;\377\377\377\373\377\377\377\372\377\377\3778\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377\247\377\377\377\377\377\377\377\345\377" - "\377\377\33\0\0\0\0\0\0\0\0\377\377\377O\377\377\377X\0\0\0\0\377\377\377" - "\377\377\377\377\377\377\377\377\13\377\377\377\351\377\377\377\377\377\377" - "\377\252\0\0\0\0\0\0\0\0\377\377\377b\377\377\377\375\377\377\377\332\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\306\377\377\377" - "\377\377\377\377\252\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\344\377\377\377" - "\372\377\377\377)\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377%\377\377\377\374\377\377\377\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\232\377\377\377" - "\377\377\377\377\264\0\0\0\0\0\0\0\0\377\377\377\335\377\377\377\376\377" - "\377\377Q\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224" - "\377\377\377\377\377\377\377\325\377\377\377\13\0\0\0\0\377\377\377;\377" - "\377\377\373\377\377\377\363\377\377\377%\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\354\377\377\377\366" - "\377\377\377%\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\354\377\377\377\366\377\377\377" - "%\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377" - "\377\377\375\377\377\377\237\377\377\377j\377\377\377\374\377\377\377\376" - "\377\377\377\214\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377" - "\377\377\361\377\377\377\352\0\0\0\0\377\377\377\306\377\377\377\375\377" - "\377\377=\377\377\377\211\377\377\377\377\377\377\377\252\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\325" - "\377\377\377\13\0\0\0\0\377\377\377;\377\377\377\373\377\377\377\363\377" - "\377\377%\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\351" - "\377\377\377\377\377\377\377\243\0\0\0\0\0\0\0\0\377\377\377r\377\377\377" - "\375\377\377\377\363\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0" - "\377\377\377\224\377\377\377\377\377\377\377\257\0\0\0\0\0\0\0\0\377\377" - "\377;\377\377\377\373\377\377\377\372\377\377\3778\377\377\377\377\377\377" - "\377\377\377\377\377\13\377\377\377\351\377\377\377\377\377\377\377\252\0" - "\0\0\0\0\0\0\0\377\377\377b\377\377\377\375\377\377\377\332\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\312\377\377\377\377" - "\377\377\377\372\377\377\377f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377" - "\333\377\377\377\13\0\0\0\0\0\0\0\0\377\377\377S\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\306\377\377" - "\377\376\377\377\377U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377i\0\0\0\0" - "\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\377\377\377\204\377\377\377\377\377\377\377" - "\322\0\0\0\0\0\0\0\0\377\377\377\241\377\377\377\377\377\377\377\264\0\0" - "\0\0\377\377\377\377\377\377\377\377\377\377\377\224\377\377\377\377\377" - "\377\377\266\377\377\377;\377\377\377\374\377\377\377\377\377\377\377\226" - "\377\377\377l\377\377\377\377\377\377\377\300\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\377\377\377u\377\377\377\376\377\377\377\361\377\377" - "\377\325\377\377\377\377\377\377\377\252\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377s\377\377\377\377\377\377\377\333\0\0" - "\0\0\0\0\0\0\377\377\377\215\377\377\377\377\377\377\377\277\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\314\377\377\377\377\377\377\377\333\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377E\377\377\377\217\377\377" - "\377\373\377\377\377\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377" - "\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\376\377" - "\377\377\247\377\377\377I\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\377\377\377\214\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\364\377\377\377\245\377\377\377\372\377\377\377\355\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\0\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\324\377\377\377" - "\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\205\377\377\377" - "\271\377\377\377\376\377\377\377\303\377\377\377\262\377\377\377\377\377" - "\377\377\315\377\377\377l\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\220\377\377\377\341\377\377\377\377" - "\377\377\377\377\377\377\377\233\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\257\377\377\377)\377\377\377" - "\313\377\377\377\377\377\377\377\377\377\377\377\375\377\377\377\\\377\377" - "\377\377\377\377\377\377\377\377\377\13\377\377\377\342\377\377\377\377\377" - "\377\377\373\377\377\377\377\377\377\377\265\0\0\0\0\377\377\377\266\377" - "\377\377\377\377\377\377\215\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377" - "\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" - "\360\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\261\377\377\377\377\377\377\377" - "\377\377\377\377\332\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\377`\377\377\377\262\377\377\377\251\377\377\377\354" - "\377\377\377\373\377\377\377\261\377\377\377\262\377\377\377\224\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\377\377\377v\377\377\377\263\377\377\377\255\377\377\377\255\377" - "\377\377\255\377\377\377\255\377\377\377\263\377\377\377\224\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\356\377\377\377\366\377\377" - "\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377" - "\13\377\377\377\356\377\377\377\363\371\371\377.\377\377\377\362\377\377" - "\377\375\377\377\377B\377\377\377\335\377\377\377\366\377\377\377%\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224" - "\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377U\377\377\377\373" - "\377\377\377\376\377\377\377s\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\205\377\377\377\271\377\377\377" - "\332\377\377\377\377\377\377\377\373\377\377\377r\0\0\0\0\377\377\377\377" - "\377\377\377\377\377\377\377\33\377\377\377\362\377\377\377\377\377\377\377" - "\242\377\377\377E\377\377\377x\377\377\377\374\377\377\377\336\377\377\377" - "K\377\377\377\13\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377" - "\377\216\377\377\377]\0\0\0\0\0\0\0\0\377\377\377\251\377\377\377\377\377" - "\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" - "\312\377\377\377\377\377\377\377\356\377\377\377v\0\0\0\0\377\377\377\220" - "\377\377\377\374\377\377\377\363\377\377\377\33\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\324\377\377\377\376\377" - "\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\377\377\377j\377\377\377\374\377\377\377\367\377\377\377\260\377\377\377" - "\342\377\377\377\377\377\377\377\376\377\377\377\224\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\377\377\3775\377\377\377\347\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\343\377\377\377\374\377\377" - "\377\360\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" - "\377\377\25\377\377\377\337\377\377\377\377\377\377\377\361\377\377\377\200" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\377\377\377b\377\377\377\232\377\377\377\232\377\377\377\232\377\377\377" - "\232\377\377\377\232\377\377\377\232\377\377\377}\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377_\377\377\377" - "\345\377\377\377\377\377\377\377\361\377\377\3778\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377V\377\377\377\376\377" - "\377\377\344\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\377\377\377K\377\377\377\374\377\377\377\245\377\377\377l\377\377\377" - "\377\377\377\377\344\377\377\377v\377\377\377;\377\377\377\375\377\377\377" - "l\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377;\377\377\377\373\377" - "\377\377\376\377\377\377\301\377\377\377\271\377\377\377\374\377\377\377" - "\376\377\377\377v\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" - "\377\224\377\377\377\377\377\377\377\304\377\377\377e\377\377\377x\377\377" - "\377\300\377\377\377\376\377\377\377\367\377\377\377)\377\377\377\377\377" - "\377\377\377\377\377\377\13\377\377\377\361\377\377\377\367\377\377\377)" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377i\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\307\377\377\377\376\377\377\377i\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\343\377" - "\377\377|\377\377\377\202\377\377\377\211\377\377\377\202\377\377\377\13" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377" - "\355\377\377\377\373\377\377\377\300\377\377\377\276\377\377\377\276\377" - "\377\377\302\377\377\377G\0\0\0\0\377\377\377\377\377\377\377\377\377\377" - "\377U\377\377\377\374\377\377\377\352\377\377\377\13\0\0\0\0\377\377\377" - "\307\377\377\377\374\377\377\377\377\377\377\377\372\377\377\377)\377\377" - "\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377" - "\377\240\377\377\377\200\377\377\377\210\377\377\377\202\377\377\377\371" - "\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\377\377\377" - "\377\252\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224" - "\377\377\377\377\377\377\377\377\377\377\377\311\377\377\377\343\377\377" - "\377\377\377\377\377\225\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377\313\377\377\377\366\377\377\377]\377\377\377\375\377\377" - "\377\377\377\377\377\211\377\377\377\354\377\377\377\333\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377" - "\377V\377\377\377\252\377\377\377\377\377\377\377\244\377\377\377\354\377" - "\377\377\334\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377U\377\377" - "\377\374\377\377\377\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\307" - "\377\377\377\376\377\377\377\177\377\377\377\377\377\377\377\377\0\0\0\0" - "\377\377\377\224\377\377\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\374\377\377\377\324\377\377\377)\0\0\0\0\377\377\377" - "\377\377\377\377\377\377\377\377U\377\377\377\374\377\377\377\327\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\307\377\377\377\376\377\377\377l\377" - "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377" - "\377\377\365\377\377\377\357\377\377\377\377\377\377\377\377\377\377\377" - "\224\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\210\377\377\377\335\377\377\377\377\377\377\377" - "\377\377\377\377\315\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" - "\377\313\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377\13\377" - "\377\377\355\377\377\377\366\377\377\377)\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\377\377\377\215\377\377\377\377\377\377\377\254\377\377" - "\377c\377\377\377\377\377\377\377\273\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\377\377\377\13\377\377\377\361\377\377\377\340\377\377\377\277" - "\377\377\377\367\377\377\377\351\377\377\377\352\377\377\377\300\377\377" - "\377\375\377\377\377I\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\307\377\377\377\377\377\377\377\377\377\377\377\335\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377}\377\377\377\376\377\377\377\377\377\377\377\252\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\325\377\377\377\377\377\377\377\264\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\224\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\342\377\377\377\375\377\377\3778\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" - "\364\377\377\377\254\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\377I\377\377\377\340\377\377\377\240\0\0\0\0\0\0\0\0" - "\377\377\377}\377\377\377\341\377\377\377Z\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377Q\377\377\377\306\377\377\377" - "\366\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\332\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377" - "\376\377\377\377b\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\320\377\377\377\376" - "\377\377\377l\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\317\377" - "\377\377\376\377\377\377l\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\356\377\377\377" - "\372\377\377\377)\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377" - "\333\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\351" - "\377\377\377\377\377\377\377\361\377\377\377\354\377\377\377\354\377\377" - "\377\354\377\377\377\376\377\377\377\376\377\377\377l\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377" - "\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\377\377\377\215\377\377\377\377\377\377\377\311\0\0\0\0\0\0\0\0" - "\377\377\377\335\377\377\377\376\377\377\377i\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377_\0\0\0\0" - "\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377)\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\13\377\377\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377" - "\377\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333\377" - "\377\377\374\377\377\377\377\377\377\377\311\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377" - "\377\361\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\377\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\377" - "\377\377\313\377\377\377\371\377\377\377%\377\377\377\224\377\377\377\377" - "\377\377\377\252\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224" - "\377\377\377\376\377\377\377_\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" - "\355\377\377\377\366\377\377\377)\377\377\377\377\377\377\377\377\377\377" - "\377\13\377\377\377\356\377\377\377\372\377\377\377)\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\345\377\377\377\376\377\377\377i\377\377\377\377\377\377" - "\377\377\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377b\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\321\377\377\377\376\377\377\377l\377\377\377\377" - "\377\377\377\377\377\377\377\13\377\377\377\356\377\377\377\372\377\377\377" - ")\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377" - "\377\377\377\377\205\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\333\377\377\377\377" - "\377\377\377\377\377\377\377\354\377\377\377\300\377\377\377\\\0\0\0\0\0" - "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\313\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377" - "\377i\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333\0\0\0" - "\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\355" - "\377\377\377\375\377\377\377M\377\377\377\13\377\377\377\355\377\377\377" - "\375\377\377\377=\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377U\377" - "\377\377\374\377\377\377\333\377\377\377\217\377\377\377\373\377\377\377" - "\361\377\377\377\312\377\377\377\241\377\377\377\377\377\377\377\215\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\253\377" - "\377\377\377\377\377\377\377\377\377\377\315\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\335\377\377\377" - "\376\377\377\377i\0\0\0\0\377\377\377\342\377\377\377\375\377\377\377Q\0" - "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\315\377\377\377\377\377\377\377\342\377\377\377\13\0\0\0\0\0\0\0" - "\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377V\377\377\377\375\377" - "\377\377\377\377\377\377\377\377\377\377\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377c\377" - "\377\377\377\377\377\377\377\377\377\377\377\377\377\377l\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\360\377\377" - "\377\33\377\377\377\205\377\377\377\365\377\377\377\377\377\377\377\364\377" - "\377\377\\\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\377\377\377\0\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "|\377\377\377\206\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\307" - "\377\377\377\377\377\377\377\377\377\377\377\370\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\244\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\205" - "\377\377\377\376\377\377\377\336\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\377\377\377\302\377\377\377\377\377\377\377\242\377\377" - "\377\374\377\377\377\264\377\377\377\33\377\377\377\371\377\377\377\316\377" - "\377\377\377\377\377\377\377\377\377\377b\377\377\377\376\377\377\377\326" - "\377\377\377\25\377\377\377\362\377\377\377\377\377\377\377\304\377\377\377" - "\372\377\377\377\360\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\317" - "\377\377\377\376\377\377\377_\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377" - "\377\361\377\377\377\334\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\377\377\377`\377\377\377\374\377\377\377\343\377" - "\377\377\313\377\377\377\377\377\377\377\215\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\306\377" - "\377\377\371\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377s\377\377\377\377\377\377\377\304\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\320\377" - "\377\377\375\377\377\377=\0\0\0\0\0\0\0\0\377\377\377\25\377\377\377\362" - "\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377i\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377l\377\377\377\373\377\377\377\376\377\377\377\214\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\204\377\377\377\377\377\377\377\333\0\0" - "\0\0\377\377\377\377\377\377\377\377\377\377\377\224\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\377m\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\33\377" - "\377\377\366\377\377\377\367\377\377\377)\377\377\377\377\377\377\377\377" - "\0\0\0\0\377\377\377\317\377\377\377\376\377\377\377e\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\330\377\377\377\371\377\377\377)\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\365\377\377\377" - "\363\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\377\377\377\13\377\377\377\351\377\377\377\375\377\377\377=\0\0\0\0\0\0" - "\0\0\377\377\377}\377\377\377\374\377\377\377\366\377\377\377%\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377U\377\377\377p\377" - "\377\377M\377\377\377!\377\377\377\373\377\377\377\333\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\234\377" - "\377\377\374\377\377\377\377\377\377\377\320\377\377\377%\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\320\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\337\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\271\377\377\377\377\377\377\377\377\377\377" - "\377\267\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\251\377\377\377V\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377K\377\377" - "\377\374\377\377\377\245\377\377\377|\377\377\377\377\377\377\377y\0\0\0" - "\0\377\377\377\247\377\377\377\376\377\377\377l\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\377\240\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\373\377\377\377\377\377\377\377\304\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377" - "\377\377\377\377\244\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377" - "\376\377\377\377l\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\334" - "\377\377\377\377\377\377\377\205\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377" - "\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377" - "\377\377\376\377\377\377i\377\377\377\377\377\377\377\377\0\0\0\0\377\377" - "\377K\377\377\377\374\377\377\377\327\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377" - "\377\355\377\377\377\366\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\377\377\377\377\377\377\377\377\377\377\377\25\377\377\377\362\377" - "\377\377\375\377\377\377=\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377" - "\377\371\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" - "\313\377\377\377\376\377\377\377b\0\0\0\0\0\0\0\0\377\377\377\13\377\377" - "\377\355\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377" - "\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\377\377" - "\377\377\257\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" - "\224\377\377\377\377\377\377\377\331\0\0\0\0\377\377\377j\377\377\377\376" - "\377\377\377\366\377\377\377)\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\377\377\377\313\377\377\377\371\377\377\377\33\377\377\377\351\377\377\377" - "\371\377\377\377!\377\377\377\360\377\377\377\333\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377i\377" - "\377\377\33\377\377\377\365\377\377\377\365\377\377\377\361\377\377\377\333" - "\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377K\377\377\377\374\377" - "\377\377\364\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\340\377\377" - "\377\376\377\377\377l\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" - "\224\377\377\377\377\377\377\377\257\0\0\0\0\377\377\377\13\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377I\377\377\377" - "\373\377\377\377\363\377\377\377%\0\0\0\0\0\0\0\0\377\377\377\13\377\377" - "\377\345\377\377\377\376\377\377\377i\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377\224\377\377\377\377\377\377\377\243\0\0\0\0\377\377\377" - "\330\377\377\377\377\377\377\377\257\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "l\377\377\377\373\377\377\377\375\377\377\377M\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366" - "\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377\313\377\377\377\376\377\377\377b\0\0\0\0\0\0\0\0\377\377" - "\377\13\377\377\377\361\377\377\377\355\377\377\377\33\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\377\377\377!\377\377\377\372\377\377\377\337" - "\377\377\377\257\377\377\377\376\377\377\377l\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\377\377\377\324\377\377\377\370\377\377\377" - "\360\377\377\377\323\377\377\377\255\377\377\377\375\377\377\377\333\377" - "\377\377\371\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\377\377\377l\377\377\377\376\377\377\377\337\377\377\377\326\377\377\377" - "\377\377\377\377\234\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\356\377\377\377\372\377\377" - "\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\377\377\377\232\377\377\377\377\377\377\377\346\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\224\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\232\377\377\377\377\377\377\377\244\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\13\377\377\377\364\377\377\377\254\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377\215\377\377\377\376\377\377\377\376\377\377\377\313\377" - "\377\377\224\377\377\377\202\377\377\377\374\377\377\377\332\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\376\377" - "\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\324\377\377\377\376\377\377" - "\377i\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\314\377\377\377" - "\376\377\377\377b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\377\377\377\13\377\377\377\355\377\377\377\374\377" - "\377\377)\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333\0" - "\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\352\377" - "\377\377\377\377\377\377\321\377\377\377\321\377\377\377\316\377\377\377" - "\322\377\377\377\316\377\377\377\315\377\377\377G\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377" - "\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377\13\377\377\377\361\377\377\377\377\377\377\377\362\377\377" - "\377\366\377\377\377\377\377\377\377\326\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377i\0\0" - "\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\13\377\377\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\13\377\377\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\374\377\377\377" - "\377\377\377\377\370\377\377\377\366\377\377\377\376\377\377\377\214\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\361\377\377" - "\377\333\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377%\377\377\377" - "\223\377\377\377\377\377\377\377\252\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377\224\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377" - "\377\13\377\377\377\355\377\377\377\366\377\377\377%\377\377\377\377\377" - "\377\377\377\377\377\377\13\377\377\377\355\377\377\377\374\377\377\377)" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\317\377\377\377\376\377\377\377l\377" - "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\376\377" - "\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\324\377\377\377\376\377\377" - "\377i\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\355\377" - "\377\377\374\377\377\377)\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377" - "\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377" - "\377\377\313\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377u\377\377\377\302\377\377\377\357\377\377\377\377\377\377\377\377\377" - "\377\377\276\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\313\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377" - "\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377;\377\377\377\374\377\377" - "\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377" - "\377\240\377\377\377\377\377\377\377\266\377\377\377s\377\377\377\377\377" - "\377\377\315\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377" - "\25\377\377\377\361\377\377\377\361\377\377\377\320\377\377\377\344\377\377" - "\377\303\377\377\377\356\377\377\377\316\377\377\377\375\377\377\377M\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\275\377" - "\377\377\377\377\377\377\377\377\377\377\314\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377v\377\377\377\377" - "\377\377\377\321\377\377\377M\377\377\377\375\377\377\377\327\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\307\377\377\377\377\377\377\377\346\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0" - "\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377b\377\377\377" - "\237\377\377\377\374\377\377\377\336\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377" - "\377\376\377\377\377\263\377\377\377f\377\377\377\13\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\371\371\377.\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377B\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0" - "\0\0\0\0\0\377\377\377\25\377\377\377\304\377\377\377\322\377\377\377S\0" - "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\214\377\377\377\374\377" - "\377\377\33\377\377\377\222\377\377\377\374\377\377\377%\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\247\377\377\377\377" - "\377\377\377\302\377\377\377\\\377\377\3772\377\377\377\264\377\377\377\377" - "\377\377\377\326\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" - "\377\315\377\377\377\377\377\377\377\257\377\377\377;\377\377\377\375\377" - "\377\377b\377\377\377\13\377\377\377\360\377\377\377\337\377\377\377\377" - "\377\377\377\377\377\377\377\204\377\377\377\377\377\377\377\322\0\0\0\0" - "\377\377\377\33\377\377\377\356\377\377\377\377\377\377\377\377\377\377\377" - "\217\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\247\377\377\377\377\377" - "\377\377\210\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377V\377\377\377\374\377\377" - "\377\326\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\377\377\377\317\377\377\377\374\377\377\3778\377\377\377\13\377" - "\377\377\351\377\377\377\366\377\377\377\33\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\324\377\377\377\374" - "\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\3775\377\377\377\347\377\377\377\367\377\377" - "\377\232\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377_\377" - "\377\377\355\377\377\377\367\377\377\377}\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377" - "\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377\261\377\377\377\377\377\377\377\257\0\0" - "\0\0\0\0\0\0\377\377\377\204\377\377\377\377\377\377\377\322\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\213\377\377\377\376\377\377\377U\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\375\377\377" - "\377\373\377\377\377s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377\214\377\377\377}\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377j\377\377\377\376\377\377\377\333\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377~\377\377\377\202\377\377\377\202\377\377" - "\377\201\377\377\377\231\377\377\377\377\377\377\377\343\377\377\377z\377" - "\377\377\33\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\205\377\377" - "\377j\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\376\377\377\377\343" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\255\377\377" - "\377\377\377\377\377\264\0\0\0\0\0\0\0\0\377\377\377\25\377\377\377\356\377" - "\377\377\372\377\377\377)\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\327\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\356" - "\377\377\377\375\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\355\377" - "\377\377\367\377\377\377)\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\377\377\3775\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\377\377" - "\377\377\257\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377_\377\377\377\355\377\377\377\367\377\377\377}\0\0\0\0\0" - "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\3775\377\377\377\347\377\377\377\367\377\377\377\232\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\3772\377\377\377\327\377\377\377\377\377\377\377\375\377\377\377" - "z\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\377\377\3775\377\377\377\362\377\377\377\377\377\377\377" - "\346\377\377\377V\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377S\377\377\377\320\377\377\377" - "\305\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\377\377\377K\377\377\377\374\377\377\377\252\377\377\377K\377\377\377\374" - "\377\377\377\376\377\377\377\363\377\377\377\377\377\377\377\377\377\377" - "\377l\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\335\377\377\377" - "\376\377\377\377l\0\0\0\0\0\0\0\0\377\377\377;\377\377\377\373\377\377\377" - "\363\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224" - "\377\377\377\377\377\377\377\243\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" - "\343\377\377\377\376\377\377\377l\377\377\377\377\377\377\377\377\0\0\0\0" - "\377\377\377\232\377\377\377\377\377\377\377\356\377\377\377)\0\0\0\0\0\0" - "\0\0\377\377\3775\377\377\377\260\377\377\377\13\377\377\377\377\377\377" - "\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377U\0\0\0\0\0\0" - "\0\0\377\377\377\276\377\377\377\377\377\377\377\346\377\377\377\13\377\377" - "\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377\377\374\377\377\377" - "\326\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377" - "\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\377\312\377\377\377\377\377\377\377\321\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377%\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\376\377\377\377i\0\0" - "\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\355\377\377\377\366\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\377\377\377j\377\377\377\330\377\377\377%\0" - "\0\0\0\0\0\0\0\377\377\377\312\377\377\377\377\377\377\377\206\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377" - "\377\377\244\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\377\377\377\377" - "\277\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377" - "\377\355\377\377\377\366\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377" - "\371\377\377\377%\377\377\377]\377\377\377f\377\377\377\13\377\377\377\361" - "\377\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" - "\377\313\377\377\377\376\377\377\377i\0\0\0\0\377\377\377\232\377\377\377" - "\377\377\377\377\377\377\377\377\327\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\377\334\377\377\377\377\377\377\377\252\0\0\0\0\0\0" - "\0\0\377\377\377}\377\377\377\376\377\377\377\363\377\377\377%\377\377\377" - "\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377" - "\252\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377\332\377\377\377\377\377\377\377\251\0\0" - "\0\0\0\0\0\0\377\377\377\214\377\377\377\377\377\377\377\355\377\377\377" - "\13\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377" - "\377\377\377\252\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\375\377" - "\377\377Q\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\205" - "\377\377\377\304\377\377\377\13\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" - "\362\377\377\377\375\377\377\377Q\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377" - "%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" - "\377\312\377\377\377\377\377\377\377\264\0\0\0\0\0\0\0\0\377\377\377}\377" - "\377\377\376\377\377\377\332\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\330\377\377\377\376\377\377\377\372\377" - "\377\377\360\377\377\377\33\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\377\377\377\305\377\377\377\377\377\377\377\377\377\377\377\237" - "\377\377\377l\377\377\377\376\377\377\377\377\377\377\377\336\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\351\377\377" - "\377\376\377\377\377l\377\377\377K\377\377\377\374\377\377\377\372\377\377" - "\3772\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\13\377\377\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377;\377\377\377" - "\373\377\377\377\372\377\377\377=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224" - "\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377!\377\377" - "\377\372\377\377\377\347\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\364\377" - "\377\377\254\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377" - "\377\377\376\377\377\377b\0\0\0\0\0\0\0\0\377\377\377b\377\377\377\375\377" - "\377\377\332\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" - "\224\377\377\377\377\377\377\377~\0\0\0\0\0\0\0\0\377\377\377U\377\377\377" - "\374\377\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0" - "\377\377\377\266\377\377\377\377\377\377\377\326\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\13\377\377\377e\0\0\0\0\377\377\377\377\377\377\377\377\377" - "\377\377\13\377\377\377\355\377\377\377\376\377\377\377v\0\0\0\0\0\0\0\0" - "\377\377\377s\377\377\377\376\377\377\377\332\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377\317\377\377\377\377\377\377\377\251\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\377\377\377j\377\377\377\375\377\377\377\326\377\377\377\302\377\377\377" - "\304\377\377\377\206\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0" - "\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377%\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377" - "\377\355\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355" - "\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\361\377\377\377=\377" - "\377\377V\377\377\377\374\377\377\377\375\377\377\377M\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\361" - "\377\377\377\355\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\377\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\377\377\377" - "\313\377\377\377\371\377\377\377%\377\377\377\223\377\377\377\377\377\377" - "\377\252\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377" - "\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377" - "\377\377\366\377\377\377%\377\377\377\377\377\377\377\377\377\377\377\13" - "\377\377\377\355\377\377\377\376\377\377\377\215\0\0\0\0\0\0\0\0\377\377" - "\377V\377\377\377\374\377\377\377\367\377\377\377)\377\377\377\377\377\377" - "\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377~\0\0\0\0\0\0" - "\0\0\377\377\377K\377\377\377\374\377\377\377\366\377\377\377)\377\377\377" - "\377\377\377\377\377\377\377\377\13\377\377\377\355\377\377\377\376\377\377" - "\377v\0\0\0\0\0\0\0\0\377\377\377s\377\377\377\375\377\377\377\332\0\0\0" - "\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\313\377\377" - "\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\377\377\3772\377\377\377n\0\0\0\0\0\0\0\0\0" - "\0\0\0\377\377\377`\377\377\377\373\377\377\377\366\377\377\377)\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\317\377\377" - "\377\376\377\377\377v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377\314\377\377\377\376\377\377\377b\0\0\0\0" - "\0\0\0\0\377\377\377\254\377\377\377\377\377\377\377\332\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\366\377" - "\377\377\361\377\377\377\331\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\320\377\377\377\377" - "\377\377\377\377\377\377\377\273\377\377\377\205\377\377\377\377\377\377" - "\377\376\377\377\377\355\377\377\377\33\377\377\377\377\377\377\377\377\0" - "\0\0\0\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\336\377\377\377" - "\330\377\377\377\377\377\377\377\256\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\342\377\377\377\375\377" - "\377\377\326\377\377\377\376\377\377\377~\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\275\377\377\377\377\377\377" - "\377\345\377\377\377\13\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\323\377\377\377" - "\360\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377" - "\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377\33\0\0\0" - "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\1\377\377\377\0\377" - "\377\377\0\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\206\377\377\377\377\377\377" - "\377\377\377\377\377\260\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377" - "\377\313\377\377\377\360\377\377\377\13\377\377\377\316\377\377\377\352\377" - "\377\377\13\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" - "\377\205\377\377\377\365\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\356\377\377\3778\0\0\0\0\377\377\377\377\377" - "\377\377\377\377\377\377\224\377\377\377\377\377\377\377\311\0\0\0\0\377" - "\377\377K\377\377\377\374\377\377\377\316\377\377\377y\377\377\377\374\377" - "\377\377\273\377\377\377\377\377\377\377\377\377\377\377!\377\377\377\371" - "\377\377\377\377\377\377\377\315\377\377\377\242\377\377\377\360\377\377" - "\377\377\377\377\377\377\377\377\377\370\377\377\377\237\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377`\377\377\377\375\377\377\377\327\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\266\377\377\377\377\377\377\377\217\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\371\371\377.\377\377" - "\377M\0\0\0\0\0\0\0\0\371\371\377.\377\377\377M\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377|\377\377" - "\377s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\232\377\377\377\377\377\377\377\377\377" - "\377\377\343\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\232\377\377\377\377\377\377\377\377\377\377\377\326\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377!\377\377" - "\377\371\377\377\377\352\377\377\377\13\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\377\377\3778\377\377\377\372\377\377" - "\377\377\377\377\377\275\377\377\377\253\377\377\377\374\377\377\377\376" - "\377\377\377s\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" - "r\377\377\377\314\377\377\377\304\377\377\377\332\377\377\377\377\377\377" - "\377\321\377\377\377\307\377\377\377\271\377\377\377\13\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377\263\377\377\377\377\377\377\377\377\377" - "\377\377\350\377\377\377\307\377\377\377\322\377\377\377\321\377\377\377" - "\310\377\377\377\33\377\377\377\377\377\377\377\377\377\377\3778\377\377" - "\377\373\377\377\377\377\377\377\377\325\377\377\377\242\377\377\377\275" - "\377\377\377\371\377\377\377\377\377\377\377\272\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377" - "\377\377\374\377\377\377\333\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\377\377\3778\377\377\377\373\377\377\377\377\377\377\377\321\377\377" - "\377\250\377\377\377\307\377\377\377\375\377\377\377\377\377\377\377\234" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\33\377\377\377" - "\362\377\377\377\377\377\377\377\313\377\377\377\214\377\377\377\345\377" - "\377\377\377\377\377\377\322\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\376\377\377\377\326\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" - "\377\302\377\377\377\377\377\377\377\346\377\377\377\226\377\377\377\201" - "\377\377\377\320\377\377\377\377\377\377\377\347\377\377\377\13\377\377\377" - "\377\377\377\377\377\0\0\0\0\377\377\377\266\377\377\377\377\377\377\377" - "\307\377\377\377\250\377\377\377\335\377\377\377\377\377\377\377\356\377" - "\377\377\33\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\377\377\377\232\377\377\377\377\377\377\377\377\377\377\377\326\0\0\0" - "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\377\377\377\232\377\377\377\377\377\377\377\377\377\377\377\343\0\0\0" - "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\207\377\377\377\374\377\377\377\266" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\377\377\377V\377\377\377\375\377\377\377\247\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\306\377\377\377\377\377\377\377\376\377" - "\377\377l\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377" - "\377\13\377\377\377\355\377\377\377\352\0\0\0\0\377\377\377s\377\377\377" - "\314\377\377\377\315\377\377\377v\377\377\377\245\377\377\377%\377\377\377" - "\377\377\377\377\377\377\377\377K\377\377\377\373\377\377\377\360\377\377" - "\377\33\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\335\377\377\377\376\377\377\377" - "~\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377" - "\377\377\377\335\377\377\377\275\377\377\377\310\377\377\377\366\377\377" - "\377\377\377\377\377\346\377\377\377\33\377\377\377\377\377\377\377\377\0" - "\0\0\0\377\377\377\13\377\377\377\342\377\377\377\377\377\377\377\370\377" - "\377\377\300\377\377\377\276\377\377\377\371\377\377\377\377\377\377\377" - "\227\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\312\377\377\377" - "\377\377\377\377\325\377\377\377\303\377\377\377\361\377\377\377\377\377" - "\377\377\375\377\377\377f\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\377\377\377K\377\377\377\374\377\377\377\362\377\377\377\316\377\377\377" - "\316\377\377\377\316\377\377\377\322\377\377\377\273\377\377\377\13\377\377" - "\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\356\377\377\377" - "\366\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\3778\377\377\377\371\377\377\377\377\377" - "\377\377\352\377\377\377\271\377\377\377\321\377\377\377\375\377\377\377" - "\372\377\377\377)\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313" - "\377\377\377\376\377\377\377l\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" - "\355\377\377\377\366\377\377\377)\377\377\377\377\377\377\377\377\0\0\0\0" - "\377\377\377u\377\377\377\325\377\377\377\316\377\377\377\371\377\377\377" - "\373\377\377\377\320\377\377\377\322\377\377\377\207\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\377\377\377\302\377\377\377\377\377\377\377" - "\365\377\377\377\266\377\377\377\324\377\377\377\377\377\377\377\375\377" - "\377\377=\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224" - "\377\377\377\377\377\377\377\252\0\0\0\0\0\0\0\0\377\377\3778\377\377\377" - "\372\377\377\377\376\377\377\377i\377\377\377\377\377\377\377\377\0\0\0\0" - "\377\377\377\13\377\377\377\356\377\377\377\376\377\377\377\320\377\377\377" - "\316\377\377\377\316\377\377\377\316\377\377\377\322\377\377\377V\377\377" - "\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\371\377\377" - "\377%\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\361\377\377\377\333\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377" - "\376\377\377\377l\0\0\0\0\377\377\377\13\377\377\377\352\377\377\377\377" - "\377\377\377\332\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" - "\377j\377\377\377\375\377\377\377\377\377\377\377\321\377\377\377\302\377" - "\377\377\375\377\377\377\377\377\377\377\234\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\252\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\377j\377\377\377\375\377\377\377\377\377\377\377\320" - "\377\377\377\307\377\377\377\375\377\377\377\377\377\377\377\216\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377" - "\377\377\377\252\0\0\0\0\0\0\0\0\377\377\377\266\377\377\377\377\377\377" - "\377\336\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377" - "\351\377\377\377\377\377\377\377\370\377\377\377\306\377\377\377\264\377" - "\377\377\351\377\377\377\377\377\377\377\343\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\356\377\377" - "\377\366\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\377b\377\377\377\375\377\377\377\377\377\377\377\325" - "\377\377\377\307\377\377\377\374\377\377\377\377\377\377\377\227\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\232" - "\377\377\377\377\377\377\377\377\377\377\377\304\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\377" - "\377\377\377\375\377\377\377_\377\377\377\33\377\377\377\365\377\377\377" - "\377\377\377\377\322\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" - "\377\377\253\377\377\377\377\377\377\377\322\0\0\0\0\0\0\0\0\377\377\377" - "\275\377\377\377\377\377\377\377\315\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\356\377\377\377\366" - "\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377\334\377\377\377\377\377\377\377\372\377\377\377\310\377" - "\377\377\316\377\377\377\316\377\377\377\321\377\377\377\310\377\377\377" - "%\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224" - "\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\317\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\364\377" - "\377\377\254\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\307\377" - "\377\377\377\377\377\377\336\377\377\377\233\377\377\377\305\377\377\377" - "\376\377\377\377\377\377\377\377\332\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\377\224\377\377\377\377\377\377\377\376\377\377\377" - "\307\377\377\377\255\377\377\377\370\377\377\377\377\377\377\377\272\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377!\377\377\377\366" - "\377\377\377\377\377\377\377\346\377\377\377\271\377\377\377\270\377\377" - "\377\365\377\377\377\375\377\377\377M\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377\255\377\377\377\377\377\377\377\373\377\377\377\257\377" - "\377\377\302\377\377\377\376\377\377\377\377\377\377\377\332\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\377\377\377`\377\377\377\374\377\377" - "\377\377\377\377\377\332\377\377\377\233\377\377\377\260\377\377\377\367" - "\377\377\377\316\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377U\377\377\377\374\377\377\377\333\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\215\377" - "\377\377\377\377\377\377\342\377\377\377\242\377\377\377\237\377\377\377" - "\246\377\377\377\247\377\377\377X\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\377" - "\377\377\13\377\377\377\356\377\377\377\366\377\377\377)\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" - "\356\377\377\377\366\377\377\377)\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377" - "\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\377\377\377K\377\377\377\375\377\377\377\245\0\0\0\0\0\0\0\0\377" - "\377\377\233\377\377\377\377\377\377\377\356\377\377\377%\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\355\377" - "\377\377\376\377\377\377\302\377\377\377\262\377\377\377\322\377\377\377" - "\33\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\361\377\377" - "\377\333\0\0\0\0\377\377\377\320\377\377\377\371\377\377\377%\377\377\377" - "\223\377\377\377\377\377\377\377\252\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377\224\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\377\377" - "\377\13\377\377\377\356\377\377\377\366\377\377\377)\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377\214\377\377\377\377\377\377\377\376\377" - "\377\377\274\377\377\377\255\377\377\377\370\377\377\377\377\377\377\377" - "\265\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377" - "\377\377\377\377\377\377\376\377\377\377\307\377\377\377\255\377\377\377" - "\370\377\377\377\377\377\377\377\272\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\377\255\377\377\377\377\377\377\377\373\377\377\377" - "\257\377\377\377\302\377\377\377\376\377\377\377\377\377\377\377\332\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\313\377" - "\377\377\376\377\377\377l\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\377\377\377\341\377\377\377\377\377\377" - "\377\335\377\377\377\233\377\377\377\213\377\377\377\306\377\377\377\377" - "\377\377\377\352\377\377\377\13\377\377\377\377\377\377\377\377\0\0\0\0\0" - "\0\0\0\0\0\0\0\377\377\377\241\377\377\377\377\377\377\377\365\377\377\377" - "\245\377\377\377\255\377\377\377\325\377\377\3772\377\377\377\377\377\377" - "\377\377\0\0\0\0\377\377\377\275\377\377\377\377\377\377\377\361\377\377" - "\377\252\377\377\377\331\377\377\377\377\377\377\377\377\377\377\377\332" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\266\377\377\377\377\377\377\377\377\377\377\377\336\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\240\377\377" - "\377\377\377\377\377\377\377\377\377\207\377\377\377K\377\377\377\374\377" - "\377\377\377\377\377\377\315\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377U\377\377\377\374\377\377\377\372\377\377\3778\377\377\377" - "!\377\377\377\366\377\377\377\376\377\377\377\177\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\377\377" - "\377\377\377\377\377\377\352\377\377\377\13\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377\267\377\377\377\377\377\377\377\377" - "\377\377\377\311\377\377\377\302\377\377\377\304\377\377\377\304\377\377" - "\377\271\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" - "\0\0\0\377\377\377\13\377\377\377\361\377\377\377\327\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\0\377\377\377\0\377\377\377\0\377\377\377\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377b\377\377\377\374\377\377\377\377\377\377\377\225\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\316\377\377\377\333\0\0\0\0" - "\377\377\377\316\377\377\377\334\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377w\377\377\377\343\377" - "\377\377\375\377\377\377\201\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\377\377\377\13\377\377\377\244\377\377\377\13\0\0\0\0\0\0\0" - "\0\377\377\377\302\377\377\377\377\377\377\377\377\377\377\377\364\377\377" - "\377Z\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377~\377\377\377\370" - "\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\275\377\377" - "\377\266\377\377\377\376\377\377\377\323\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\335\377\377\377\376\377\377\377~\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377K\377\377" - "\377\373\377\377\377\363\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377I\377\377" - "\377\357\377\377\377\377\377\377\377\364\377\377\377)\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\376\377\377\377\377\377\377" - "\377\244\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\377\377\377\232\377\377\377\377\377\377\377\251\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\377\377\377l\377\377\377\367\377\377\377\377\377\377\377\377\377\377\377" - "\376\377\377\377\223\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377\232\377\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\372\377\377\377" - ")\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\355\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\360\377\377\377\33\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\377j\377\377\377\350\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\376\377\377\377\302\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377;\377\377\377\372\377\377\377\316\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377u\377\377\377\351\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\373\377\377\377\254\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377S\377\377\377" - "\354\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\325\377" - "\377\377\33\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\377\377\377\214\377\377\377\377\377\377\377\244\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377" - "\377\315\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\342\377\377\3772\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377\177\377\377\377\365\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\342\377\377\3772\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377}\377\377\377\376\377" - "\377\377\377\377\377\377\244\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377I\377\377\377\357\377\377" - "\377\377\377\377\377\364\377\377\377)\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\13\377\377\377M\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\232\377\377\377\377\377\377\377\375" - "\377\377\377\\\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0" - "\0\0\0\377\377\377\255\377\377\377\377\377\377\377\234\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377" - "\224\377\377\377\377\377\377\377\276\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\240\377\377\377\377\377\377\377\266\377\377\377\377\377\377\377" - "\377\0\0\0\0\377\377\377\215\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\370\377\377\377\312\377\377\377%\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" - "\316\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\376\377" - "\377\377\255\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" - "\305\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\373\377" - "\377\377\330\377\377\377V\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\372\377\377\377" - ")\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\351" - "\377\377\377\366\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377I\377\377\377\345" - "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\370\377\377" - "\377\241\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\313" - "\377\377\377\375\377\377\377\\\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377" - "\355\377\377\377\355\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0" - "\0\377\377\377\224\377\377\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\377\377\336\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\377\377\377\13\377\377\377\316\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\377\373\377\377\377\213\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377" - "\377\377\377\377\377\377\252\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\247\377" - "\377\377\377\377\377\377\326\377\377\377\377\377\377\377\377\0\0\0\0\377" - "\377\377\13\377\377\377\351\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377_\377\377\377" - "\377\377\377\377\377\0\0\0\0\377\377\377\313\377\377\377\366\377\377\377" - "%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\344\377\377\377\333\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\377\377\377\307\377\377\377\375\377\377" - "\377Q\0\0\0\0\0\0\0\0\377\377\377\204\377\377\377\377\377\377\377\327\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\206\377" - "\377\377\371\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377" - "\240\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" - "\215\377\377\377\377\377\377\377\244\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377" - "\206\377\377\377\370\377\377\377\377\377\377\377\377\377\377\377\376\377" - "\377\377\241\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" - "\377\377\214\377\377\377\377\377\377\377\252\0\0\0\0\0\0\0\0\377\377\377" - "\33\377\377\377\356\377\377\377\376\377\377\377v\377\377\377\377\377\377" - "\377\377\0\0\0\0\377\377\377\25\377\377\377\316\377\377\377\376\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\377\335\377\377\377)\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377" - "\377\377\351\377\377\377\364\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\233\377\377\377\375" - "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\276\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377;\377\377\377\372\377\377\377\376\377\377\377|\0\0\0\0\0\0\0\0\0\0\0" - "\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377u\377\377\377\375\377" - "\377\377\355\377\377\377\33\0\0\0\0\377\377\377\320\377\377\377\377\377\377" - "\377\244\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\33\377\377\377" - "\366\377\377\377\372\377\377\377=\0\0\0\0\0\0\0\0\377\377\377\33\377\377" - "\377\362\377\377\377\376\377\377\377_\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\351\377\377\377\364\377\377" - "\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377" - "\13\377\377\377\356\377\377\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377l\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\224\377" - "\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377}\377" - "\377\377\377\377\377\377\277\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\364\377\377" - "\377\254\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\3775\377\377\377" - "\347\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\303\377" - "\377\377\362\377\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\377\377\377\224\377\377\377\377\377\377\377\345\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\307\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377I\377\377\377\345\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\377\377\373\377\377\377\260" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\310" - "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\326\377\377" - "\377\367\377\377\377\315\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\377\377\377l\377\377\377\356\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\370\377\377\377\231\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377;\377\377\377\373\377\377" - "\377\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\377\377\377I\377\377\377\373\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" - "\216\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377" - "\376\377\377\377i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\351\377\377" - "\377\355\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\377\377\377\13\377\377\377\351\377\377\377\355\377\377\377" - "\33\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\377\377\377\13\377\377\377\355\377\377\377\366\377\377\377)\0" - "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377K\377\377" - "\377\374\377\377\377\252\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\307\377\377" - "\377\377\377\377\377\304\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\223\377\377\377\375\377\377\377\377\377\377" - "\377\377\377\377\377\372\377\377\377M\377\377\377\377\377\377\377\377\377" - "\377\377\13\377\377\377\361\377\377\377\333\0\0\0\0\377\377\377\275\377\377" - "\377\371\377\377\377%\377\377\377\223\377\377\377\377\377\377\377\252\377" - "\377\377\377\377\377\377\377\0\0\0\0\377\377\377\224\377\377\377\376\377" - "\377\377i\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\351\377\377\377\355" - "\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377" - "\240\377\377\377\374\377\377\377\377\377\377\377\377\377\377\377\376\377" - "\377\377\275\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" - "\377\377\224\377\377\377\377\377\377\377\352\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\307\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\377\377\377\310\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\337\377\377\377\377\377\377\377\332\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377\307\377" - "\377\377\375\377\377\377_\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\377\377\377c\377\377\377\330\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\354\377" - "\377\377Z\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\13\377\377\377\333\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\375\377\377\377_\377\377\377\377\377\377\377\377\0\0\0\0" - "\377\377\377\33\377\377\377\350\377\377\377\377\377\377\377\377\377\377\377" - "\376\377\377\377\255\377\377\377\362\377\377\377\323\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377;\377\377\377\372" - "\377\377\377\376\377\377\377\206\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377b\377\377\377\374\377\377\377\372\377" - "\377\377I\377\377\377\13\377\377\377\355\377\377\377\377\377\377\377\243" - "\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\345\377" - "\377\377\376\377\377\377\214\0\0\0\0\0\0\0\0\377\377\377j\377\377\377\374" - "\377\377\377\363\377\377\377%\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\335\377\377\377\377\377\377\377\236\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\13\377\377" - "\377\355\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\372\377\377\377)\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\360" - "\377\377\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371" - "\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377" - "%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\0\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377E\377\377\377S\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377Q\377\377\377n\377\377\377\13\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377b\377\377" - "\377e\377\377\377\33\0\0\0\0\0\0\0\0\371\371\377.\377\377\3775\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377V\377\377\377\374\377\377\377\364\377\377" - "\3772\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377" - "\377\377\13\377\377\377\343\377\377\377\377\377\377\377\215\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\371\377\377\377\334\0\0\0\0\0" - "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377E\377\377\377X\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0" - "\0\0\0\377\377\377\341\377\377\377\375\377\377\377=\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\377\377\377e\377\377\377l\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0" - "\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377E\377\377\377X\377\377\377S\377\377\377\13\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377@\377\377\377e\377\377\377c\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\377\377\377S\377\377\377K\377\377\377I\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377)\377\377\377e\377\377\377n\377\377\377" - "8\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377_\377\377\377p\377\377\377I\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377E\377\377\377X\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377\371" - "\377\377\377\334\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377`\377\377\377I\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\377\377\377\33\377\377\377\362\377\377\377" - "\376\377\377\377\255\377\377\3775\377\377\377V\377\377\377\322\377\377\377" - "\255\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377)\377\377\377X\377\377\377V\377\377\377\13\0\0\0" - "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377E\377\377\377" - "m\377\377\377c\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\371\371\377.\377\377\377m\377\377\377c\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377b\377\377\377c\377\377\377\13" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\320" - "\377\377\377\377\377\377\377\333\377\377\377\33\377\377\377E\377\377\377" - "\13\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377e\377\377\377e\377\377" - "\3778\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "e\377\377\377n\377\377\3775\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\224\377\377\377\376\377\377\377U\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\25\377\377\377\361\377\377\377\366\377\377" - "\377%\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\13\377\377\377\364\377\377\377\254\0\0\0\0\0\0\0\0\0\0\0" - "\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\377\377\377\216\377\377\377\233\377\377\377\232\377\377\377\232" - "\377\377\377\232\377\377\377\232\377\377\377\232\377\377\377\237\377\377" - "\377=\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377U\377\377\377n\377\377\3775\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\377\377\377E\377\377\377n\377\377\3778\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377@\377\377\377m\377\377\377c\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377@\377\377\377p\377" - "\377\377I\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377Q\377\377\377p\377\377\377X\0" - "\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\377\377\377\324\377\377\377\376\377\377\377" - "|\377\377\377S\377\377\377V\377\377\377K\377\377\377\263\377\377\377\377" - "\377\377\377\252\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\25\377\377\377\362\377\377\377\360\377\377\377" - "\33\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377)\377" - "\377\377p\377\377\377c\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377b\377\377\377f\377\377\377" - "\13\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" - "\377\224\377\377\377\376\377\377\377U\377\377\377@\377\377\377e\377\377\377" - "8\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377@\377\377\377p\377\377\377I\377\377\377;\377\377\377" - "\374\377\377\377\333\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377" - "\377e\377\377\377e\377\377\377I\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377O\377\377" - "\377X\377\377\377U\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0" - "\0\0\0\0\0\0\0\0\0\377\377\377j\377\377\377n\377\377\377\33\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\33\377\377\377" - "\362\377\377\377\367\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\13\377\377\377\361\377\377\377\356\377\377\377%\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377\377\377%\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\335\377\377\377\372\377\377\377)\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\267\377\377\377" - "\345\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\237\377\377\377\377\377\377\377\361\377\377" - "\3772\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377\377" - "\331\377\377\377\377\377\377\377\304\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\3772\377\377\377\337\377\377\377\377\377\377\377\236\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377b\377" - "\377\377\376\377\377\377\330\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\3772\377\377\377\337\377\377\377\377\377\377\377\236\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\377\377\3775\377\377\377\344\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\270\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\3775\377\377\377\362\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\210\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\232\377\377\377\377\377\377" - "\377\370\377\377\377\364\377\377\377\372\377\377\377\243\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\266\377\377\377\377\377\377\377\225\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377\205\377\377\377\371\377\377\377\364" - "\377\377\377\364\377\377\377\377\377\377\377\260\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\377\377\377\13\377\377\377\370\377\377\377\377\377\377\377\377\377\377\377" - "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\377m\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\377\377\377\13\377\377\377\345\377\377\377" - "\375\377\377\377f\0\0\0\0\0\0\0\0\377\377\3772\377\377\377\326\377\377\377" - "\377\377\377\377\245\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" - "\377\377\234\377\377\377\205\377\377\377I\377\377\377\272\377\377\377\377" - "\377\377\377\326\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" - "\377\224\377\377\377\376\377\377\377i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377K\377\377\377\374\377\377\377\333\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\377\377\377i\377\377\377\203\377\377\377" - "\337\377\377\377\377\377\377\377\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\275\377\377\377\377\377\377\377" - "\377\377\377\377\373\377\377\377\243\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\371\377" - "\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\377\377\377\177\377\377\377\372\377\377\377\376\377\377\377\377\377\377" - "\377\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\253\377\377" - "\377\340\377\377\377%\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\377\377\377\310\377\377\377\307\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377" - "\377\377\13\377\377\377\351\377\377\377\377\377\377\377\276\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377" - "\377u\377\377\377\325\377\377\377w\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\377\377" - "\377\13\377\377\377\351\377\377\377\377\377\377\377\276\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377`\377\377\377\213\377\377\377\203\377\377" - "\3778\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\13\377\377\377\251\377\377\377\322\377\377\377\316" - "\377\377\377m\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377`\377\377\377\263\377\377\377\263\377\377\377\263\377\377\377\266" - "\377\377\377u\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377G\377\377\377\317\377\377\377w\0" - "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377i\377\377\377\266" - "\377\377\377\263\377\377\377\263\377\377\377\262\377\377\377_\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\377\377\377`\377\377\377y\377\377\377y\377\377\377y" - "\377\377\377y\377\377\377y\377\377\377y\377\377\377x\377\377\377\33\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\377\377\377\237\377\377\377\377\377\377\377\377" - "\377\377\377\370\377\377\377\370\377\377\377\377\377\377\377\377\377\377" - "\377\325\377\377\377\33\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377" - ";\377\377\377\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377" - "\377\376\377\377\377z\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377" - "\377\377\233\377\377\377\377\377\377\377l\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377V\377\377\377\376\377\377\377\327\0\0" - "\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\377\377\377\13\377\377\377\361\377\377\377\377" - "\377\377\377\377\377\377\377\325\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377v\377\377\377\246\377" - "\377\377\266\377\377\377u\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377\377\377\372\377\377\377)\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\377\377\377" - "i\377\377\377\266\377\377\377\255\377\377\377\214\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377s\377\377\377|\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377s\377\377\377" - "|\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\0\0\0\0\377\377\377_\377\377\377\266\377\377\377\321\377\377\377\316\377" - "\377\377\271\377\377\377q\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\377\377\377`\377\377\377\245\377\377\377\267\377\377\377" - "\247\377\377\377=\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377" - "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0" - "\377\377\377E\377\377\377\212\377\377\377%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\13\377\377\377\211\377\377\377=\0" - "\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377" - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" - "\377\377\377\377\377\377\377\0\0\0\0\377\377\377v\377\377\377\232\377\377" - "\377q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" - "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" - "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\313\377" - "\377\377\363\377\377\377\33\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377" - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" - "\377\377\377\377", -}; - diff --git a/parse_map/mlx/font.xcf b/parse_map/mlx/font.xcf deleted file mode 100644 index b9c8c82dec50244b31f1ae2b6f84be1668688d7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52570 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 D(ji>k diff --git a/parse_map/mlx/mlx.h b/parse_map/mlx/mlx.h deleted file mode 100644 index e75b4af..0000000 --- a/parse_map/mlx/mlx.h +++ /dev/null @@ -1,149 +0,0 @@ -/* -** mlx.h for MinilibX in -** -** Made by Charlie Root -** Login -** -** Started on Mon Jul 31 16:37:50 2000 Charlie Root -** Last update Tue Oct 01 16:23:28 2014 Olivier Crouzet -*/ - -/* -** MinilibX - Please report bugs -*/ - - -/* -** FR msg - FR msg - FR msg -** -** MacOSX -** La MinilibX utilise 2 frameworks Mac : OpenGL et AppKit -** qu'il faut ajouter a la compilation : -** -framework OpenGL -framework AppKit -** -** UNIX / Linux -** La MinilibX utilise 2 librairies supplementaires qu'il -** est necessaire de rajouter a la compilation : -** -lmlx -lXext -lX11 -** -** La MinilibX permet le chargement des images de type Xpm. -** Notez que cette implementation est incomplete. -** -** Il y a des differences entre X11 et MacOS. -** les numeros des touches ne sont pas les memes, -** les numeros des boutons souris ne sont pas les memes. -** Egalement l'expose est gere differemment, et sous MacOS -** il est preferable d'entrer le plus tot possible dans mlx_loop, -** il est normal que les fenetres n'apparaissent pas avant mlx_loop -** (ou bien forcez avec mlx_do_sync mais c'est pas genial). -** Sous MacOS, l'octet Alpha est pris en compte dans toutes les -** images, et represente la transparence et non l'opacite comme -** c'est normalement le cas. -*/ - - -#ifndef MLX_H - -#define MLX_H - - -void *mlx_init(); -/* -** needed before everything else. -** return (void *)0 if failed -*/ - - -/* -** Basic actions -*/ - -void *mlx_new_window(void *mlx_ptr, int size_x, int size_y, char *title); -/* -** return void *0 if failed -*/ -int mlx_clear_window(void *mlx_ptr, void *win_ptr); -int mlx_pixel_put(void *mlx_ptr, void *win_ptr, int x, int y, int color); -/* -** origin for x & y is top left corner of the window -** y down is positive -** color is 0x00RRGGBB -*/ - - -/* -** Image stuff -*/ - -void *mlx_new_image(void *mlx_ptr,int width,int height); -/* -** return void *0 if failed -*/ -char *mlx_get_data_addr(void *img_ptr, int *bits_per_pixel, - int *size_line, int *endian); -/* -** endian : 0 = sever X is little endian, 1 = big endian -** endian : useless on macos, client and graphical framework have the same endian -*/ -int mlx_put_image_to_window(void *mlx_ptr, void *win_ptr, void *img_ptr, - int x, int y); -unsigned int mlx_get_color_value(void *mlx_ptr, int color); - - -/* -** dealing with Events -*/ - -int mlx_mouse_hook (void *win_ptr, int (*funct_ptr)(), void *param); -int mlx_key_hook (void *win_ptr, int (*funct_ptr)(), void *param); -int mlx_expose_hook (void *win_ptr, int (*funct_ptr)(), void *param); - -int mlx_loop_hook (void *mlx_ptr, int (*funct_ptr)(), void *param); -int mlx_loop (void *mlx_ptr); - - -/* -** hook funct are called as follow : -** -** expose_hook(void *param); -** key_hook(int keycode, void *param); -** mouse_hook(int button, int x,int y, void *param); -** loop_hook(void *param); -** -*/ - - -/* -** Usually asked... -*/ - -int mlx_string_put(void *mlx_ptr, void *win_ptr, int x, int y, int color, - char *string); -void *mlx_xpm_to_image(void *mlx_ptr, char **xpm_data, - int *width, int *height); -void *mlx_xpm_file_to_image(void *mlx_ptr, char *filename, - int *width, int *height); -void *mlx_png_file_to_image(void *mlx_ptr, char *file, int *width, int *height); - -int mlx_destroy_window(void *mlx_ptr, void *win_ptr); - -int mlx_destroy_image(void *mlx_ptr, void *img_ptr); - -/* -** generic hook system for all events, and minilibX functions that -** can be hooked. Some macro and defines from X11/X.h are needed here. -*/ - -int mlx_hook(void *win_ptr, int x_event, int x_mask, - int (*funct)(), void *param); - -int mlx_mouse_hide(); -int mlx_mouse_show(); -int mlx_mouse_move(void *win_ptr, int x, int y); -int mlx_mouse_get_pos(void *win_ptr, int *x, int *y); - -int mlx_do_key_autorepeatoff(void *mlx_ptr); -int mlx_do_key_autorepeaton(void *mlx_ptr); -int mlx_do_sync(void *mlx_ptr); - -#endif /* MLX_H */ diff --git a/parse_map/mlx/mlx_init_loop.m b/parse_map/mlx/mlx_init_loop.m deleted file mode 100644 index 0377771..0000000 --- a/parse_map/mlx/mlx_init_loop.m +++ /dev/null @@ -1,192 +0,0 @@ -// mlx_init_loop.m -// By Ol - -#import -#import -#import - -#include "mlx_int.h" -#include "mlx_new_window.h" - -#include "font.c" - - -void do_loop_hook2(CFRunLoopTimerRef observer, void * info) -{ - ((mlx_ptr_t *)info)->loop_hook(((mlx_ptr_t *)info)->loop_hook_data); -} - - -void do_loop_flush(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void * info) -{ - mlx_ptr_t *mlx_ptr; - mlx_win_list_t *win; - - mlx_ptr = (mlx_ptr_t *)info; - win = mlx_ptr->win_list; - while (win) - { - if (win->nb_flush > 0 && win->pixmgt) - { - [(id)win->winid selectGLContext]; - [(id)win->winid mlx_gl_draw]; - glFlush(); - win->nb_flush = 0; - } - win = win->next; - } -} - - - - -void *mlx_init() -{ - mlx_ptr_t *new_mlx; - int bidon; - int i; - - if ((new_mlx = malloc(sizeof(*new_mlx))) == NULL) - return ((void *)0); - new_mlx->win_list = NULL; - new_mlx->img_list = NULL; - new_mlx->loop_hook = NULL; - new_mlx->loop_hook_data = NULL; - new_mlx->main_loop_active = 0; - - new_mlx->appid = [NSApplication sharedApplication]; - - // super magic trick to detach app from terminal, get menubar & key input events - for (NSRunningApplication * app in [NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.apple.finder"]) - { - [app activateWithOptions:NSApplicationActivateIgnoringOtherApps]; - break; - } - usleep(100000); - ProcessSerialNumber psn = { 0, kCurrentProcess }; - (void) TransformProcessType(&psn, kProcessTransformToForegroundApplication); - usleep(100000); - [[NSRunningApplication currentApplication] activateWithOptions:NSApplicationActivateIgnoringOtherApps]; - - // load font - new_mlx->font = mlx_new_image(new_mlx, (FONT_WIDTH+2)*95, FONT_HEIGHT); - i = 0; - while (i < 4*(FONT_WIDTH+2)*95*FONT_HEIGHT) - { - new_mlx->font->buffer[i+0] = font_atlas.pixel_data[i+2]; - new_mlx->font->buffer[i+1] = font_atlas.pixel_data[i+1]; - new_mlx->font->buffer[i+2] = font_atlas.pixel_data[i+0]; - ((unsigned char *)new_mlx->font->buffer)[i+3] = 0xFF-font_atlas.pixel_data[i+3]; - i += 4; - } - - -#ifdef STRINGPUTX11 - new_mlx->font->vertexes[2] = FONT_WIDTH/1.4; - new_mlx->font->vertexes[4] = FONT_WIDTH/1.4; - new_mlx->font->vertexes[5] = (-FONT_HEIGHT-1)/1.4; - new_mlx->font->vertexes[7] = (-FONT_HEIGHT-1)/1.4; -#else - new_mlx->font->vertexes[2] = FONT_WIDTH; - new_mlx->font->vertexes[4] = FONT_WIDTH; - new_mlx->font->vertexes[5] = -FONT_HEIGHT-1; - new_mlx->font->vertexes[7] = -FONT_HEIGHT-1; -#endif - - return ((void *)new_mlx); -} - - -void mlx_loop(mlx_ptr_t *mlx_ptr) -{ - CFRunLoopObserverRef observer; - CFRunLoopObserverContext ocontext = {.version = 0, .info = mlx_ptr, .retain = NULL, .release = NULL, .copyDescription = NULL}; - - mlx_ptr->main_loop_active = 1; - - observer = CFRunLoopObserverCreate(NULL, kCFRunLoopBeforeTimers, true, 0, do_loop_flush, &ocontext); - CFRunLoopAddObserver(CFRunLoopGetMain(), observer, kCFRunLoopCommonModes); - - // [[[MlxLoopHookObj alloc] initWithPtr:mlx_ptr] performSelector:@selector(do_loop_hook) withObject:nil afterDelay:0.0]; - - [NSApp run]; -} - - -void mlx_pixel_put(mlx_ptr_t *mlx_ptr, mlx_win_list_t *win_ptr, int x, int y, int color) -{ - if (!win_ptr->pixmgt) - return ; - [(id)(win_ptr->winid) selectGLContext]; - [(id)(win_ptr->winid) pixelPutColor:color X:x Y:y]; - win_ptr->nb_flush ++; -} - - -void mlx_int_loop_once() -{ - NSEvent *event; - NSDate *thedate; - - thedate = [NSDate dateWithTimeIntervalSinceNow:0.1]; - while (42) - { - event = [NSApp nextEventMatchingMask:NSEventMaskAny - untilDate:thedate - inMode:NSDefaultRunLoopMode - dequeue:YES]; - if (event == nil) - { - [thedate release]; - return ; - } - [NSApp sendEvent:event]; - [NSApp updateWindows]; - } -} - - -int mlx_do_sync(mlx_ptr_t *mlx_ptr) -{ - mlx_win_list_t *win; - - win = mlx_ptr->win_list; - while (win) - { - if (win->pixmgt) - { - [(id)(win->winid) selectGLContext]; - [(id)(win->winid) mlx_gl_draw]; - glFlush(); - if (!mlx_ptr->main_loop_active) - mlx_int_loop_once(); - } - win = win->next; - } - return (0); -} - - -int mlx_loop_hook(mlx_ptr_t *mlx_ptr, void (*fct)(void *), void *param) -{ - CFRunLoopTimerContext tcontext = {0, mlx_ptr, NULL, NULL, NULL}; - CFRunLoopTimerRef timer; - - if (mlx_ptr->loop_hook != NULL) - { - CFRunLoopTimerInvalidate(mlx_ptr->loop_timer); - [(id)(mlx_ptr->loop_timer) release]; - } - - mlx_ptr->loop_hook = fct; - mlx_ptr->loop_hook_data = param; - - if (fct) - { - timer = CFRunLoopTimerCreate(kCFAllocatorDefault, 0.0, 0.0001, 0, 0, &do_loop_hook2, &tcontext); - mlx_ptr->loop_timer = timer; - CFRunLoopAddTimer(CFRunLoopGetMain(), timer, kCFRunLoopCommonModes); - } - - return (0); -} diff --git a/parse_map/mlx/mlx_int.h b/parse_map/mlx/mlx_int.h deleted file mode 100644 index a93c1c9..0000000 --- a/parse_map/mlx/mlx_int.h +++ /dev/null @@ -1,102 +0,0 @@ -// -// mlx_int.h for minilibx -// -// ol@staff.42.fr -// -// include opengl needed before mlx_int.h -// - - -#define MAX_EVENT 32 -#define MAX_PIXEL_NB 200000 -#define UNIQ_BPP 4 - -#define FONT_WIDTH 10 -#define FONT_HEIGHT 20 - - -typedef int (*func_t)(); - -/* structs */ - -typedef struct glsl_info_s -{ - GLuint pixel_vshader; - GLuint pixel_fshader; - GLuint pixel_program; - GLint loc_pixel_position; - GLint loc_pixel_texture; - GLint loc_pixel_winhalfsize; - - GLuint image_vshader; - GLuint image_fshader; - GLuint image_program; - GLint loc_image_position; - GLint loc_image_winhalfsize; - GLint loc_image_texture; - GLint loc_image_pos; - GLint loc_image_size; - - GLuint font_vshader; - GLuint font_fshader; - GLuint font_program; - GLint loc_font_position; - GLint loc_font_winhalfsize; - GLint loc_font_texture; - GLint loc_font_color; - GLint loc_font_posinwin; - GLint loc_font_posinatlas; - GLint loc_font_atlassize; -} glsl_info_t; - - -typedef struct mlx_img_list_s -{ - int width; - int height; - char *buffer; - GLfloat vertexes[8]; - struct mlx_img_list_s *next; -} mlx_img_list_t; - - -typedef struct mlx_img_ctx_s -{ - GLuint texture; - GLuint vbuffer; - mlx_img_list_t *img; - struct mlx_img_ctx_s *next; -} mlx_img_ctx_t; - -typedef struct mlx_win_list_s -{ - void *winid; - mlx_img_ctx_t *img_list; - int nb_flush; - int pixmgt; - struct mlx_win_list_s *next; -} mlx_win_list_t; - - -typedef struct mlx_ptr_s -{ - void *appid; - mlx_win_list_t *win_list; - mlx_img_list_t *img_list; - void (*loop_hook)(void *); - void *loop_hook_data; - void *loop_timer; - mlx_img_list_t *font; - int main_loop_active; -} mlx_ptr_t; - -// proto - -int mlx_shaders(glsl_info_t *glsl); -char **mlx_int_str_to_wordtab(char *str); -int mlx_int_str_str(char *str,char *find,int len); -int mlx_int_str_str_cote(char *str,char *find,int len); -int mlx_destroy_image(mlx_ptr_t *mlx_ptr, mlx_img_list_t *img_ptr); -void *mlx_new_image(); -void *mlx_xpm_to_image(mlx_ptr_t *xvar,char **xpm_data,int *width,int *height); -int mlx_do_sync(mlx_ptr_t *mlx_ptr); diff --git a/parse_map/mlx/mlx_int_str_to_wordtab.c b/parse_map/mlx/mlx_int_str_to_wordtab.c deleted file mode 100644 index 3b2ef2e..0000000 --- a/parse_map/mlx/mlx_int_str_to_wordtab.c +++ /dev/null @@ -1,107 +0,0 @@ -// -// str 2 wordtab & co -// by ol - - -#include -#include - -int mlx_int_str_str(char *str,char *find,int len) -{ - int len_f; - int pos; - char *s; - char *f; - - len_f = strlen(find); - if (len_f>len) - return (-1); - pos = 0; - while (*(str+len_f-1)) - { - s = str; - f = find; - while (*(f++) == *(s++)) - if (!*f) - return (pos); - str ++; - pos ++; - } - return (-1); -} - - - -int mlx_int_str_str_cote(char *str,char *find,int len) -{ - int len_f; - int pos; - char *s; - char *f; - int cote; - - len_f = strlen(find); - if (len_f>len) - return (-1); - cote = 0; - pos = 0; - while (*(str+len_f-1)) - { - if (*str=='"') - cote = 1-cote; - if (!cote) - { - s = str; - f = find; - while (*(f++) == *(s++)) - if (!*f) - return (pos); - } - str ++; - pos ++; - } - return (-1); -} - - -char **mlx_int_str_to_wordtab(char *str) -{ - char **tab; - int pos; - int nb_word; - int len; - - len = strlen(str); - nb_word = 0; - pos = 0; - while (pos - -#import -#import - -#include "mlx_int.h" -#include "mlx_new_window.h" - -int mlx_mouse_hide() -{ - // CGDisplayHideCursor(kCGDirectMainDisplay); - [NSCursor hide]; - return (0); -} - -int mlx_mouse_show() -{ - // CGDisplayShowCursor(kCGDirectMainDisplay); - [NSCursor unhide]; - return (0); -} - -int mlx_mouse_move(mlx_win_list_t *win, int x, int y) -{ - CGPoint point; - NSRect pos; - id thewin; - - thewin = [(id)(win->winid) win]; - pos = [thewin frame]; - // printf("got win pos %f %f\n", pos.origin.x, pos.origin.y); - point.x = pos.origin.x + x; - point.y = NSHeight([[thewin screen] frame]) - NSHeight([(id)(win->winid) frame]) - pos.origin.y + 1 + y; - CGWarpMouseCursorPosition(point); - CGAssociateMouseAndMouseCursorPosition(true); - return (0); -} - - -int mlx_mouse_get_pos(mlx_win_list_t *win, int *x, int *y) -{ - CGPoint point; - id thewin; - NSRect pos; - - thewin = [(id)(win->winid) win]; - pos = [(id)(win->winid) frame]; - point = [thewin mouseLocationOutsideOfEventStream]; - *x = point.x; - *y = NSHeight(pos) - 1 - point.y; - return (0); -} diff --git a/parse_map/mlx/mlx_new_image.m b/parse_map/mlx/mlx_new_image.m deleted file mode 100644 index 46e1df1..0000000 --- a/parse_map/mlx/mlx_new_image.m +++ /dev/null @@ -1,198 +0,0 @@ -// mlx_new_image -// -// by Ol -// - - -#import -#import - -#include "mlx_int.h" -#include "mlx_new_window.h" - - - -void *mlx_new_image(mlx_ptr_t *mlx_ptr, int width, int height) -{ - mlx_img_list_t *newimg; - - // if (mlx_ptr->win_list == NULL) - // return (NULL); // need at leat one window created to have openGL context and create texture - if ((newimg = malloc(sizeof(*newimg))) == NULL) - return ((void *)0); - newimg->next = mlx_ptr->img_list; - mlx_ptr->img_list = newimg; - newimg->width = width; - newimg->height = height; - newimg->vertexes[0] = 0.0; newimg->vertexes[1] = 0.0; - newimg->vertexes[2] = width; newimg->vertexes[3] = 0.0; - newimg->vertexes[4] = width; newimg->vertexes[5] = -height; - newimg->vertexes[6] = 0.0; newimg->vertexes[7] = -height; - newimg->buffer = malloc(UNIQ_BPP*width*height); - bzero(newimg->buffer, UNIQ_BPP*width*height); - - return (newimg); -} - -mlx_img_ctx_t *add_img_to_ctx(mlx_img_list_t *img, mlx_win_list_t *win) -{ - mlx_img_ctx_t *imgctx; - - imgctx = win->img_list; - while (imgctx) - { - if (imgctx->img == img) - return (imgctx); - imgctx = imgctx->next; - } - - imgctx = malloc(sizeof(*imgctx)); - imgctx->img = img; - imgctx->next = win->img_list; - win->img_list = imgctx; - - glGenTextures(1, &(imgctx->texture)); - glBindTexture(GL_TEXTURE_2D, imgctx->texture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexImage2D( - GL_TEXTURE_2D, 0, /* target, level of detail */ - GL_RGBA8, /* internal format */ - img->width, img->height, 0, /* width, height, border */ - GL_BGRA, GL_UNSIGNED_BYTE, /* external format, type */ - img->buffer /* pixels */ - ); - - glGenBuffers(1, &(imgctx->vbuffer)); - glBindBuffer(GL_ARRAY_BUFFER, imgctx->vbuffer); - glBufferData(GL_ARRAY_BUFFER, sizeof(img->vertexes), img->vertexes, GL_DYNAMIC_DRAW); // 4 points buff - - return (imgctx); -} - - -void mlx_put_image_to_window(mlx_ptr_t *mlx_ptr, mlx_win_list_t *win_ptr, mlx_img_list_t *img_ptr, int x, int y) -{ - mlx_img_ctx_t *imgctx; - - if (!win_ptr->pixmgt) - return ; - - [(id)(win_ptr->winid) selectGLContext]; - imgctx = add_img_to_ctx(img_ptr, win_ptr); - - // update texture - glBindTexture(GL_TEXTURE_2D, imgctx->texture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, img_ptr->width, img_ptr->height, 0, - GL_BGRA, GL_UNSIGNED_BYTE, img_ptr->buffer); - - [(id)(win_ptr->winid) mlx_gl_draw_img:img_ptr andCtx:imgctx andX:x andY:y]; - - win_ptr->nb_flush ++; -} - -// assume here 32bpp little endian - -char *mlx_get_data_addr(mlx_img_list_t *img_ptr, int *bits_per_pixel, int *size_line, int *endian) -{ - *bits_per_pixel = UNIQ_BPP*8; - *size_line = img_ptr->width*UNIQ_BPP; - *endian = 0; // little endian for now on mac-intel - return (img_ptr->buffer); -} - -unsigned int mlx_get_color_value(mlx_ptr_t *mlx_ptr, int color) -{ - return (color); -} - -int mlx_string_put(mlx_ptr_t *mlx_ptr, mlx_win_list_t *win_ptr, int x, int y, int color, unsigned char *string) -{ - mlx_img_ctx_t *imgctx; - int gX; - int gY; - - if (!win_ptr->pixmgt) - return(0); - -#ifdef STRINGPUTX11 - y -= (FONT_HEIGHT * 2)/3; -#endif - - [(id)(win_ptr->winid) selectGLContext]; - - imgctx = add_img_to_ctx(mlx_ptr->font, win_ptr); - - while (*string) - { - if (*string >= 32 && *string <= 127) - { - gX = (FONT_WIDTH+2)*(*string-32); - gY = 0; - // printf("put char %c pos %d %d\n", *string, gX, gY); - [(id)(win_ptr->winid) mlx_gl_draw_font:mlx_ptr->font andCtx:imgctx andX:x andY:y andColor:color glyphX:gX glyphY:gY]; -#ifdef STRINGPUTX11 - x += FONT_WIDTH/1.4; -#else - x += FONT_WIDTH; -#endif - } - string ++; - } - - win_ptr->nb_flush ++; - - return (0); -} - -int mlx_destroy_image(mlx_ptr_t *mlx_ptr, mlx_img_list_t *img_todel) -{ - mlx_img_ctx_t ctx_first; - mlx_img_ctx_t *ctx; - mlx_img_ctx_t *ctx_to_del; - mlx_img_list_t img_first; - mlx_img_list_t *img; - mlx_win_list_t *win; - - img_first.next = mlx_ptr->img_list; - img = &img_first; - while (img && img->next) - { - if (img->next == img_todel) - img->next = img->next->next; - img = img->next; - } - mlx_ptr->img_list = img_first.next; - - - win = mlx_ptr->win_list; - while (win) - { - ctx_first.next = win->img_list; - ctx = &ctx_first; - while (ctx && ctx->next) - { - if (ctx->next->img == img_todel) - { - [(id)(win->winid) selectGLContext]; - glDeleteBuffers(1, &(ctx->next->vbuffer)); - glDeleteTextures(1, &(ctx->next->texture)); - ctx_to_del = ctx->next; - ctx->next = ctx->next->next; - free(ctx_to_del); - } - ctx = ctx->next; - } - win->img_list = ctx_first.next; - win = win->next; - } - - - free(img_todel->buffer); - free(img_todel); - - // printf("destroy image done.\n"); - return (0); -} diff --git a/parse_map/mlx/mlx_new_window.h b/parse_map/mlx/mlx_new_window.h deleted file mode 100644 index d173e61..0000000 --- a/parse_map/mlx/mlx_new_window.h +++ /dev/null @@ -1,57 +0,0 @@ -// -// mlx_int.h for minilibx -// -// ol@staff.42.fr -// -// include opengl needed before mlx_int.h -// - -#import -#import "mlx_int.h" - -@interface NSWindowEvent : NSWindow -{ - func_t event_funct[MAX_EVENT]; - void *(event_param[MAX_EVENT]); - int keyrepeat; - int keyflag; - int size_x; - int size_y; -} -- (NSWindowEvent *) initWithContentRect:(NSRect)rect styleMask:(NSUInteger)winstyle backing:(NSBackingStoreType)bck defer:(BOOL) dfr; -- (void) setEvent:(int)event andFunc:(func_t)func andParam:(void *)param; -- (void) setKeyRepeat:(int)mode; -- (void) exposeNotification:(NSNotification *)note; -- (void) closeNotification:(NSNotification *)note; -@end - - -@interface MlxWin : NSOpenGLView -{ - NSWindowEvent *win; - NSOpenGLContext *ctx; - glsl_info_t glsl; - int openglwin; - - int size_x; - int size_y; - - int pixel_nb; - GLuint pixel_vbuffer; - GLuint pixel_texture; - unsigned int *pixtexbuff; -} - -- (id) initWithRect: (NSRect)rect andTitle: (NSString *)title pfaAttrs: (NSOpenGLPixelFormatAttribute *)attrs; -- (void) selectGLContext; -- (void) flushGLContext; -- (void) pixelPutColor: (int)color X:(int)x Y:(int)y; -- (void) mlx_gl_draw; -- (void) mlx_gl_draw_img:(mlx_img_list_t *)img andCtx:(mlx_img_ctx_t *)imgctx andX:(int)x andY:(int)y; -- (void) mlx_gl_draw_font:(mlx_img_list_t *)img andCtx:(mlx_img_ctx_t *)imgctx andX:(int)x andY:(int)y andColor:(int)color glyphX:(int)gx glyphY:(int)gy; -- (NSOpenGLContext *) ctx; -- (NSWindowEvent *) win; -- (void) setEvent:(int)event andFunc:(func_t)func andParam:(void *)param; -- (void) setKeyRepeat:(int)mode; -- (void) ctxNeedsUpdate; -@end diff --git a/parse_map/mlx/mlx_new_window.m b/parse_map/mlx/mlx_new_window.m deleted file mode 100644 index 6d4fea4..0000000 --- a/parse_map/mlx/mlx_new_window.m +++ /dev/null @@ -1,766 +0,0 @@ -// mlx_new_window.m - -#import -#import -#import - -#include -#include - -#include "mlx_int.h" -#include "mlx_new_window.h" - - -NSOpenGLPixelFormatAttribute pfa_attrs[] = - { - NSOpenGLPFADepthSize, 32, - NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersionLegacy, - 0 - }; - -static const GLfloat pixel_vertexes[8] = - { - -1.0 , -1.0, - 1.0, -1.0, - 1.0, 1.0, - -1.0, 1.0 - }; - - - -int get_mouse_button(NSEventType eventtype) -{ - switch (eventtype) { - case NSEventTypeLeftMouseDown: - case NSEventTypeLeftMouseUp: - case NSEventTypeLeftMouseDragged: - return 1; - case NSEventTypeRightMouseDown: - case NSEventTypeRightMouseUp: - case NSEventTypeRightMouseDragged: - return 2; - case NSEventTypeOtherMouseDown: - case NSEventTypeOtherMouseUp: - case NSEventTypeOtherMouseDragged: - return 3; - default: - return 0; - } -} - - -// classes for window & events - - - - -@implementation NSWindowEvent - -- (NSWindowEvent *) initWithContentRect:(NSRect)rect styleMask:(NSUInteger)winstyle backing:(NSBackingStoreType)bck defer:(BOOL) dfr -{ - int i; - - if ((self = [super initWithContentRect:rect - styleMask:winstyle - backing:bck - defer:dfr])) - { - i = MAX_EVENT; - while (i--) - { - event_funct[i] = NULL; - event_param[i] = NULL; - } - keyrepeat = 0; - keyflag = 0; - size_x = rect.size.width; - size_y = rect.size.height; - } - return (self); -} - - -- (void) setEvent:(int)event andFunc:(func_t)func andParam:(void *)param -{ - event_funct[event] = func; - event_param[event] = param; - if (event == 6 || event == 32) // motion notify && high precision motion notify - { - if (func == NULL) - [self setAcceptsMouseMovedEvents:NO]; - else - [self setAcceptsMouseMovedEvents:YES]; - } -} - - -- (void) setKeyRepeat:(int)mode -{ - keyrepeat = mode; -} - -- (BOOL) acceptsFirstResponder -{ - return (YES); -} - -- (void) flagsChanged:(NSEvent *)theEvent -{ - unsigned int flag; - int the_key; - unsigned int val; - - flag = [theEvent modifierFlags]; - // printf("Key flag changed: %x => %x\n", keyflag, flag); - // printf("**mlx flag low part : %d - %x\n", flag&0xFFFF, flag&0xFFFF); - - if (!(val = (keyflag|flag)&(~(keyflag&flag)))) - return ; // no change - can happen when loosing focus on special key pressed, then re-pressed later - the_key = 1; - while (((val >> (the_key-1)) & 0x01)==0) - the_key ++; - if (flag > keyflag && event_funct[2] != NULL) - event_funct[2](0xFF+the_key, event_param[2]); - if (flag < keyflag && event_funct[3] != NULL) - event_funct[3](0xFF+the_key, event_param[3]); - /* - if (event_funct[2] != NULL) - { - if (!(keyflag & NSAlphaShiftKeyMask) && (flag&NSAlphaShiftKeyMask)) event_funct[2](0xFF+1, event_param[2]); - if (!(keyflag & NSShiftKeyMask) && (flag&NSShiftKeyMask)) event_funct[2](0xFF+2, event_param[2]); - if (!(keyflag & NSControlKeyMask) && (flag&NSControlKeyMask)) event_funct[2](0xFF+3, event_param[2]); - if (!(keyflag & NSAlternateKeyMask) && (flag&NSAlternateKeyMask)) event_funct[2](0xFF+4, event_param[2]); - if (!(keyflag & NSCommandKeyMask) && (flag&NSCommandKeyMask)) event_funct[2](0xFF+5, event_param[2]); - if (!(keyflag & NSNumericPadKeyMask) && (flag&NSNumericPadKeyMask)) event_funct[2](0xFF+6, event_param[2]); - if (!(keyflag & NSHelpKeyMask) && (flag&NSHelpKeyMask)) event_funct[2](0xFF+7, event_param[2]); - if (!(keyflag & NSFunctionKeyMask) && (flag&NSFunctionKeyMask)) event_funct[2](0xFF+8, event_param[2]); - } - if (event_funct[3] != NULL) - { - if ((keyflag & NSShiftKeyMask) && !(flag&NSShiftKeyMask)) event_funct[3](NSShiftKeyMask, event_param[3]); - - if ((keyflag & NSAlphaShiftKeyMask) && !(flag&NSAlphaShiftKeyMask)) event_funct[3](0xFF+1, event_param[3]); - if ((keyflag & NSShiftKeyMask) && !(flag&NSShiftKeyMask)) event_funct[3](0xFF+2, event_param[3]); - if ((keyflag & NSControlKeyMask) && !(flag&NSControlKeyMask)) event_funct[3](0xFF+3, event_param[3]); - if ((keyflag & NSAlternateKeyMask) && !(flag&NSAlternateKeyMask)) event_funct[3](0xFF+4, event_param[3]); - if ((keyflag & NSCommandKeyMask) && !(flag&NSCommandKeyMask)) event_funct[3](0xFF+5, event_param[3]); - if ((keyflag & NSNumericPadKeyMask) && !(flag&NSNumericPadKeyMask)) event_funct[3](0xFF+6, event_param[3]); - if ((keyflag & NSHelpKeyMask) && !(flag&NSHelpKeyMask)) event_funct[3](0xFF+7, event_param[3]); - if ((keyflag & NSFunctionKeyMask) && !(flag&NSFunctionKeyMask)) event_funct[3](0xFF+8, event_param[3]); - } - */ - keyflag = flag; -} - -- (void) keyDown:(NSEvent *)theEvent -{ - if (keyrepeat==0 && [theEvent isARepeat]) - return ; - // printf("Key Down: %d\n", [theEvent keyCode]); - if (event_funct[2] != NULL) - event_funct[2]([theEvent keyCode], event_param[2]); - // else [super keyDown: theEvent]; -} - -- (void) keyUp:(NSEvent *)theEvent -{ - // printf("Key Up: %d\n", [theEvent keyCode]); - if (event_funct[3] != NULL) - event_funct[3]([theEvent keyCode], event_param[3]); - // else [super keyUp: theEvent]; - -} - -- (void) mouseDown:(NSEvent *)theEvent -{ - NSPoint thepoint; - int button; - - thepoint = [theEvent locationInWindow]; - button = get_mouse_button([theEvent type]); - // printf("Mouse pressed bt %d pos: %f, %f\n", button, thepoint.x, thepoint.y); - if (event_funct[4] != NULL) - event_funct[4](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[4]); -} - -- (void) rightMouseDown:(NSEvent *)theEvent -{ - NSPoint thepoint; - int button; - - thepoint = [theEvent locationInWindow]; - button = get_mouse_button([theEvent type]); - // printf("Mouse pressed bt %d pos: %f, %f\n", button, thepoint.x, thepoint.y); - if (event_funct[4] != NULL) - event_funct[4](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[4]); -} - -- (void) otherMouseDown:(NSEvent *)theEvent -{ - NSPoint thepoint; - int button; - - thepoint = [theEvent locationInWindow]; - button = get_mouse_button([theEvent type]); - // printf("Mouse pressed bt %d pos: %f, %f\n", button, thepoint.x, thepoint.y); - if (event_funct[4] != NULL) - event_funct[4](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[4]); -} - -- (void) mouseUp:(NSEvent *)theEvent -{ - NSPoint thepoint; - int button; - - thepoint = [theEvent locationInWindow]; - button = get_mouse_button([theEvent type]); - // printf("Mouse release bt %d pos: %f, %f\n", button, thepoint.x, thepoint.y); - if (event_funct[5] != NULL) - event_funct[5](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[5]); -} - -- (void) rightMouseUp:(NSEvent *)theEvent -{ - NSPoint thepoint; - int button; - - thepoint = [theEvent locationInWindow]; - button = get_mouse_button([theEvent type]); - // printf("Mouse release bt %d pos: %f, %f\n", button, thepoint.x, thepoint.y); - if (event_funct[5] != NULL) - event_funct[5](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[5]); -} - -- (void) otherMouseUp:(NSEvent *)theEvent -{ - NSPoint thepoint; - int button; - - thepoint = [theEvent locationInWindow]; - button = get_mouse_button([theEvent type]); - // printf("Mouse release bt %d pos: %f, %f\n", button, thepoint.x, thepoint.y); - if (event_funct[5] != NULL) - event_funct[5](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[5]); -} - -- (void) mouseMoved:(NSEvent *)theEvent -{ - NSPoint thepoint; - - thepoint = [theEvent locationInWindow]; - // printf("Mouse moved pos: %f, %f\n", thepoint.x, thepoint.y); - if (event_funct[6] != NULL) - event_funct[6]((int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[6]); -} - - -- (void) mouseDragged:(NSEvent *)theEvent -{ - NSPoint thepoint; - - thepoint = [theEvent locationInWindow]; - // printf("Mouse moved pos: %f, %f\n", thepoint.x, thepoint.y); - if (event_funct[6] != NULL) - event_funct[6]((int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[6]); -} - - -- (void) rightMouseDragged:(NSEvent *)theEvent -{ - NSPoint thepoint; - - thepoint = [theEvent locationInWindow]; - // printf("Mouse moved pos: %f, %f\n", thepoint.x, thepoint.y); - if (event_funct[6] != NULL) - event_funct[6]((int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[6]); -} - - -- (void) otherMouseDragged:(NSEvent *)theEvent -{ - NSPoint thepoint; - - thepoint = [theEvent locationInWindow]; - // printf("Mouse moved pos: %f, %f\n", thepoint.x, thepoint.y); - if (event_funct[6] != NULL) - event_funct[6]((int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[6]); -} - - -- (void) scrollWheel:(NSEvent *)theEvent -{ - NSPoint thepoint; - int button; - float sens; - - if (event_funct[4] == NULL) - return ; - - button = 0; - thepoint = [theEvent locationInWindow]; - sens = [theEvent deltaY]; - if (sens > 0.2) - button = 4; - if (sens < -0.2) - button = 5; - sens = [theEvent deltaX]; - if (sens > 0.2) - button = 6; - if (sens < -0.2) - button = 7; - if (button != 0) - event_funct[4](button, (int)(thepoint.x), size_y - 1 - (int)(thepoint.y), event_param[4]); -} - - -- (void) exposeNotification:(NSNotification *)note -{ - // printf("Expose...\n"); - if (event_funct[12] != NULL) - event_funct[12](event_param[12]); - // printf("Expose done.\n"); -} - -- (void) closeNotification:(NSNotification *)note -{ - if (event_funct[17] != NULL) - event_funct[17](event_param[17]); -} - -- (void) deminiaturizeNotification:(NSNotification *)note -{ - // if (event_funct[??] != NULL) - // event_funct[??](event_param[??]); - [self exposeNotification:note]; -} -@end - - -@implementation MlxWin - -- (id) initWithRect: (NSRect)rect andTitle: (NSString *)title pfaAttrs: (NSOpenGLPixelFormatAttribute *)attrs -{ - NSOpenGLPixelFormat* pixFmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; - - if ((self = [super initWithFrame:rect pixelFormat:pixFmt]) != nil) - { - NSUInteger windowStyle = NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable; - - win = [[NSWindowEvent alloc] initWithContentRect:rect - styleMask:windowStyle - backing:NSBackingStoreBuffered // NSBackingStoreNonretained - defer:NO]; - [win setContentView:self]; - [win setTitle:title]; - [win setKeyRepeat:1]; - [win makeKeyAndOrderFront:self]; - - // printf("init ctx: current %p ", [NSOpenGLContext currentContext]); - - // ctx = [[NSOpenGLContext alloc] initWithFormat:pixFmt shareContext:[NSOpenGLContext currentContext]]; //other_context]; - // [ctx setView:self]; - // [ctx makeCurrentContext]; - - [[self openGLContext] makeCurrentContext]; - [[self openGLContext] setView:self]; - [self prepareOpenGL]; - - [self setNextKeyView:self]; - - // [[NSNotificationCenter defaultCenter] addObserver:win selector:@selector(exposeNotification:) name:@"NSWindowDidExposeNotification" object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:win selector:@selector(exposeNotification:) name:@"NSWindowDidBecomeKeyNotification" object:win]; - [[NSNotificationCenter defaultCenter] addObserver:win selector:@selector(deminiaturizeNotification:) name:@"NSWindowDidDeminiaturizeNotification" object:win]; - [[NSNotificationCenter defaultCenter] addObserver:win selector:@selector(closeNotification:) name:@"NSWindowWillCloseNotification" object:win]; - // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ctxNeedsUpdate:) - // name:NSViewGlobalFrameDidChangeNotification - // object:nil]; - - size_x = rect.size.width; - size_y = rect.size.height; - - glClearColor(0, 0, 0, 0); - glClear(GL_COLOR_BUFFER_BIT); - glFlush(); - - //[win makeKeyAndOrderFront:nil]; - // BOOL r = [win isKeyWindow]; - // if (r==YES) printf("keywindow ok\n"); else printf("keywindow KO\n"); - - // Window controller subclass to set title - // NSWindowController* windowController = [[NSWindowController alloc] initWithWindow:win]; - // [windowController windowTitleForDocumentDisplayName:title]; - // [windowController showWindow:nil]; - // MlxWinController *mlxWinCont = [[MlxWinController alloc] initWin:win andTitle:title]; - - // after nswindowcontroller who will retake first responder - // BOOL r = [win makeFirstResponder:nil]; - // if (r==YES) printf("responder ok\n"); else printf("responder KO\n"); - - [pixFmt release]; - } - return (self); -} - -- (int) pixel_management -{ - bzero(&glsl, sizeof(glsl)); // so gldelete[shader/program] go silent on error. - - glDisable(GL_DEPTH_TEST); - glGenBuffers(1, &pixel_vbuffer); - glBindBuffer(GL_ARRAY_BUFFER, pixel_vbuffer); - glBufferData(GL_ARRAY_BUFFER, sizeof(pixel_vertexes), pixel_vertexes, GL_DYNAMIC_DRAW); // 4 points buff - // pixel_ptr = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); - - glGenTextures(1, &pixel_texture); - glBindTexture(GL_TEXTURE_2D, pixel_texture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - pixtexbuff = malloc(sizeof(unsigned int)*size_x*size_y); - pixel_nb = size_x*size_y; - while (pixel_nb--) pixtexbuff[pixel_nb] = 0xFF000000; - pixel_nb = 0; - glTexImage2D( - GL_TEXTURE_2D, 0, /* target, level of detail */ - GL_RGBA8, /* internal format */ - size_x, size_y, 0, /* width, height, border */ - GL_BGRA, GL_UNSIGNED_BYTE, /* external format, type */ - pixtexbuff /* pixels */ - ); - // printf("pix tex err? 0x%x\n", glGetError()); - - if (mlx_shaders(&glsl)) - return (0); - - glUseProgram(glsl.pixel_program); - glsl.loc_pixel_texture = glGetUniformLocation(glsl.pixel_program, "texture"); - //glsl.loc_pixel_winhalfsize = glGetUniformLocation(glsl.pixel_program, "winhalfsize"); - glsl.loc_pixel_position = glGetAttribLocation(glsl.pixel_program, "position"); - // printf("err? 0x%x\n", glGetError()); - - glUseProgram(glsl.image_program); - glsl.loc_image_texture = glGetUniformLocation(glsl.image_program, "texture"); - glsl.loc_image_pos = glGetUniformLocation(glsl.image_program, "imagepos"); - glsl.loc_image_size = glGetUniformLocation(glsl.image_program, "imagesize"); - glsl.loc_image_winhalfsize = glGetUniformLocation(glsl.image_program, "winhalfsize"); - glsl.loc_image_position = glGetAttribLocation(glsl.image_program, "position"); - // printf("err? 0x%x\n", glGetError()); - - glUseProgram(glsl.font_program); - glsl.loc_font_texture = glGetUniformLocation(glsl.font_program, "texture"); - glsl.loc_font_color = glGetUniformLocation(glsl.font_program, "color"); - glsl.loc_font_posinwin = glGetUniformLocation(glsl.font_program, "fontposinwin"); - glsl.loc_font_posinatlas = glGetUniformLocation(glsl.font_program, "fontposinatlas"); - glsl.loc_font_atlassize = glGetUniformLocation(glsl.font_program, "fontatlassize"); - glsl.loc_font_winhalfsize = glGetUniformLocation(glsl.font_program, "winhalfsize"); - glsl.loc_font_position = glGetAttribLocation(glsl.font_program, "position"); - // printf("err? 0x%x\n", glGetError()); - - glFlush(); - return (1); -} - -- (void) ctxNeedsUpdate -{ - // printf("Context update\n"); - [ctx update]; -} - -- (void) selectGLContext -{ - if ([NSOpenGLContext currentContext] != [self openGLContext]) - { - // printf("ctx: %p => %p\n", [NSOpenGLContext currentContext], [self openGLContext]); - [[self openGLContext] makeCurrentContext]; - } -} - -- (void) flushGLContext -{ - [[self openGLContext] flushBuffer]; -} - -- (NSOpenGLContext *) ctx -{ - return (ctx); -} - -- (NSWindowEvent *) win -{ - return (win); -} - - -- (void) pixelPutColor: (int)color X:(int)x Y:(int)y -{ - pixel_nb ++; - - glBindTexture(GL_TEXTURE_2D, pixel_vbuffer); - glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, 1, 1, GL_BGRA, GL_UNSIGNED_BYTE, (GLvoid *)(&color)); - - if (pixel_nb >= MAX_PIXEL_NB) - [self mlx_gl_draw]; -} - -- (void) destroyPixelManagement -{ - free(pixtexbuff); - [self selectGLContext]; - glDeleteBuffers(1, &pixel_vbuffer); - glDeleteTextures(1, &pixel_texture); - glDeleteProgram(glsl.pixel_program); - glDeleteProgram(glsl.image_program); - glDeleteShader(glsl.pixel_vshader); - glDeleteShader(glsl.pixel_fshader); - glDeleteShader(glsl.image_vshader); - glDeleteShader(glsl.image_fshader); -} - - -- (void) destroyMe -{ - [[NSNotificationCenter defaultCenter] removeObserver:win]; - [[NSNotificationCenter defaultCenter] removeObserver:self]; - // [ctx release]; - [win close]; - [self release]; -} - -- (void) setEvent:(int)event andFunc:(func_t)func andParam:(void *)param -{ - [win setEvent:event andFunc:func andParam:param]; -} - -- (void) setKeyRepeat:(int)mode -{ - [win setKeyRepeat:mode]; -} - -- (void) clearWin -{ - glClearColor(0, 0, 0, 0); - glClear(GL_COLOR_BUFFER_BIT); -} - -- (void) mlx_gl_draw_img:(mlx_img_list_t *)img andCtx:(mlx_img_ctx_t *)imgctx andX:(int)x andY:(int)y -{ - - if (pixel_nb >0) - [self mlx_gl_draw]; - - glUseProgram(glsl.image_program); - - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, imgctx->texture); - glUniform1i(glsl.loc_image_texture, 0); - - glUniform2f(glsl.loc_image_winhalfsize, size_x/2, size_y/2); - glUniform2f(glsl.loc_image_pos, x, size_y - y); - glUniform2f(glsl.loc_image_size, img->width, -img->height); - - glBindBuffer(GL_ARRAY_BUFFER, imgctx->vbuffer); - glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2*sizeof(GLfloat), (void*)0); - glEnableVertexAttribArray(0); - - glEnable(GL_BLEND); - glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); // src alpha 0xFF : keep dst - glBlendEquation(GL_FUNC_ADD); - - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - glDisableVertexAttribArray(0); - -} - - -- (void) mlx_gl_draw_font:(mlx_img_list_t *)img andCtx:(mlx_img_ctx_t *)imgctx andX:(int)x andY:(int)y andColor:(int)color glyphX:(int)gx glyphY:(int)gy -{ - GLfloat color_tab[4]; - - if (pixel_nb >0) - [self mlx_gl_draw]; - - color_tab[0] = ((float)((color&0xFF0000)>>16))/255.0; - color_tab[1] = ((float)((color&0xFF00)>>8))/255.0; - color_tab[2] = ((float)((color&0xFF)>>0))/255.0; - color_tab[3] = 1.0; - glUseProgram(glsl.font_program); - - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, imgctx->texture); - glUniform1i(glsl.loc_font_texture, 0); - glUniform4fv(glsl.loc_font_color, 1, color_tab); - - glUniform2f(glsl.loc_font_winhalfsize, size_x/2, size_y/2); - glUniform2f(glsl.loc_font_posinwin, x, size_y - 1 - y); - glUniform2f(glsl.loc_font_posinatlas, gx, gy); - glUniform2f(glsl.loc_font_atlassize, img->width, img->height); - - glBindBuffer(GL_ARRAY_BUFFER, imgctx->vbuffer); - glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2*sizeof(GLfloat), (void*)0); - glEnableVertexAttribArray(0); - - glEnable(GL_BLEND); - glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); // src alpha 0xFF : keep dst - glBlendEquation(GL_FUNC_ADD); - - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - glDisableVertexAttribArray(0); - -} - - -- (void) mlx_gl_draw -{ - if (pixel_nb <= 0) - return ; - - glUseProgram(glsl.pixel_program); - - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, pixel_vbuffer); - glUniform1i(glsl.loc_pixel_texture, 0); - - glBindBuffer(GL_ARRAY_BUFFER, pixel_vbuffer); - glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2*sizeof(GLfloat), (void*)0); - glEnableVertexAttribArray(0); - - glEnable(GL_BLEND); - glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); // src alpha 0xFF : keep dst - glBlendEquation(GL_FUNC_ADD); - - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - glDisableVertexAttribArray(0); - - pixel_nb = size_x*size_y; - while (pixel_nb--) pixtexbuff[pixel_nb] = 0xFF000000; - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, size_x, size_y, 0, GL_BGRA, GL_UNSIGNED_BYTE, pixtexbuff); - pixel_nb = 0; - -} - -@end - - -// mlx API - - -void *mlx_new_window(mlx_ptr_t *mlx_ptr, int size_x, int size_y, char *title) -{ - mlx_win_list_t *newwin; - NSString *str; - - if ((newwin = malloc(sizeof(*newwin))) == NULL) - return ((void *)0); - newwin->img_list = NULL; - newwin->next = mlx_ptr->win_list; - newwin->nb_flush = 0; - newwin->pixmgt = 1; - mlx_ptr->win_list = newwin; - - NSRect windowRect = NSMakeRect(100, 100, size_x, size_y); - str = [NSString stringWithCString:title encoding:NSASCIIStringEncoding]; - newwin->winid = [[MlxWin alloc] initWithRect:windowRect andTitle:str pfaAttrs:pfa_attrs]; - if (newwin->winid) - if (![(id)(newwin->winid) pixel_management]) - { - [(id)(newwin->winid) destroyPixelManagement]; - [(id)(newwin->winid) destroyMe]; - } - return ((void *)newwin); -} - - -void mlx_clear_window(mlx_ptr_t *mlx_ptr, mlx_win_list_t *win_ptr) -{ - [(id)(win_ptr->winid) selectGLContext]; - [(id)(win_ptr->winid) clearWin]; - win_ptr->nb_flush ++; -} - - -void mlx_expose_hook(mlx_win_list_t *win_ptr, int (*funct_ptr)(), void *param) -{ - [(id)(win_ptr->winid) setEvent:12 andFunc:funct_ptr andParam:param]; -} - -void mlx_key_hook(mlx_win_list_t *win_ptr, int (*funct_ptr)(), void *param) -{ - [(id)(win_ptr->winid) setEvent:3 andFunc:funct_ptr andParam:param]; -} - -void mlx_mouse_hook(mlx_win_list_t *win_ptr, int (*funct_ptr)(), void *param) -{ - [(id)(win_ptr->winid) setEvent:4 andFunc:funct_ptr andParam:param]; -} - -void mlx_hook(mlx_win_list_t *win_ptr, int x_event, int x_mask, int (*funct_ptr)(), void *param) -{ - [(id)(win_ptr->winid) setEvent:x_event andFunc:funct_ptr andParam:param]; -} - -int mlx_do_key_autorepeatoff(mlx_ptr_t *mlx_ptr) -{ - mlx_win_list_t *win; - - win = mlx_ptr->win_list; - while (win) - { - [(id)(win->winid) setKeyRepeat:0]; - win = win->next; - } - return (0); -} - -int mlx_do_key_autorepeaton(mlx_ptr_t *mlx_ptr) -{ - mlx_win_list_t *win; - - win = mlx_ptr->win_list; - while (win) - { - [(id)(win->winid) setKeyRepeat:1]; - win = win->next; - } - return (0); -} - - -int mlx_destroy_window(mlx_ptr_t *mlx_ptr, mlx_win_list_t *win_to_del) -{ - mlx_win_list_t first; - mlx_win_list_t *win; - mlx_img_ctx_t *ctx; - mlx_img_ctx_t *ctx2; - - first.next = mlx_ptr->win_list; - win = &first; - while (win && win->next) - { - if (win->next == win_to_del) - win->next = win->next->next; - win = win->next; - } - mlx_ptr->win_list = first.next; - - if (win_to_del->pixmgt) - { - [(id)(win_to_del->winid) selectGLContext]; - ctx = win_to_del->img_list; // should be null anyway if no pixel management - while (ctx) - { - glDeleteBuffers(1, &(ctx->vbuffer)); - glDeleteTextures(1, &(ctx->texture)); - ctx2 = ctx; - ctx = ctx->next; - free(ctx2); - } - [(id)(win_to_del->winid) destroyPixelManagement]; - } - [(id)(win_to_del->winid) destroyMe]; - free(win_to_del); - - // printf("destroy window done.\n"); - mlx_do_sync(mlx_ptr); - return (0); -} diff --git a/parse_map/mlx/mlx_opengl.h b/parse_map/mlx/mlx_opengl.h deleted file mode 100644 index bb39267..0000000 --- a/parse_map/mlx/mlx_opengl.h +++ /dev/null @@ -1,21 +0,0 @@ -/* -** -** mlx_opengl.h -** -** public include, use it after mlx.h -** designed only for minilibx_macos -** -*/ - -void *mlx_new_opengl_window(void *mlx_ptr, int size_x, int size_y, char *title); - -/* create an opengl window. put_image & pixel_put & string_put do not work there. */ - -int mlx_opengl_swap_buffers(void *win_ptr); - -/* the created window is double buffered. Use this funct to swap buffers */ -/* this funct will call glFlush(). Don't call it. */ - -int mlx_opengl_window_set_context(void *win_ptr); - -/* in case multiple opengl windows are present, change opengl active context */ diff --git a/parse_map/mlx/mlx_opengl.m b/parse_map/mlx/mlx_opengl.m deleted file mode 100644 index 554d79b..0000000 --- a/parse_map/mlx/mlx_opengl.m +++ /dev/null @@ -1,57 +0,0 @@ -// mlx_opengl.m - -#import -#import -#import - -#include - -#include "mlx_int.h" -#include "mlx_new_window.h" - - - - - -NSOpenGLPixelFormatAttribute pfa_attrs_opengl[] = - { - NSOpenGLPFADepthSize, 32, - NSOpenGLPFADoubleBuffer, - NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion4_1Core, - 0 - }; - - - -void *mlx_new_opengl_window(mlx_ptr_t *mlx_ptr, int size_x, int size_y, char *title) -{ - mlx_win_list_t *newwin; - NSString *str; - - if ((newwin = malloc(sizeof(*newwin))) == NULL) - return ((void *)0); - newwin->img_list = NULL; - newwin->next = mlx_ptr->win_list; - newwin->nb_flush = 0; - newwin->pixmgt = 0; - mlx_ptr->win_list = newwin; - - NSRect windowRect = NSMakeRect(100, 100, size_x, size_y); - str = [NSString stringWithCString:title encoding:NSASCIIStringEncoding]; - newwin->winid = [[MlxWin alloc] initWithRect:windowRect andTitle:str pfaAttrs:pfa_attrs_opengl]; - - return ((void *)newwin); -} - - -int mlx_opengl_swap_buffers(mlx_win_list_t *win_ptr) -{ - [(id)(win_ptr->winid) flushGLContext]; - return (0); -} - -int mlx_opengl_window_set_context(mlx_win_list_t *win_ptr) -{ - [(id)(win_ptr->winid) selectGLContext]; - return (0); -} diff --git a/parse_map/mlx/mlx_png.c b/parse_map/mlx/mlx_png.c deleted file mode 100644 index ca8024d..0000000 --- a/parse_map/mlx/mlx_png.c +++ /dev/null @@ -1,418 +0,0 @@ - - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "zlib.h" - -#include -#include "mlx_int.h" - - -#define PNG_MAGIC_SIZE 8 -unsigned char magic[PNG_MAGIC_SIZE] = {137, 80, 78, 71, 13, 10, 26, 10}; -#define PNG_HDR_SIZE 13 - -#define Z_CHUNK 32768 - -#define ERR_MAGIC_SIZE 1 -#define ERR_MAGIC_WRONG 2 -#define ERR_STRUCT_INCOMPLETE 3 -#define ERR_STRUCT_HDR 4 -#define ERR_STRUCT_END 5 -#define ERR_STRUCT_CRC 6 -#define ERR_STRUCT_INCIMPL 7 -#define ERR_STRUCT_DAT 8 -#define ERR_STRUCT_MISSCHK 9 -#define ERR_ZLIB 10 -#define ERR_DATA_MISMATCH 11 -#define ERR_DATA_FILTER 12 -char *(mipng_err[]) = -{ - "No error", - "Not enough size for magic", - "Wrong magic", - "Incomplete chunk structure", - "Duplicate or incorrect header", - "Duplicate or incorrect end", - "Invalid CRC in chunk", - "Incorrect header or configuration not implemented", - "Non consecutive dat chunks", - "Missing header/dat/end chunk(s)", - "Zlib inflate error", - "Inflated data size mismatch", - "Unknown scanline filter" -}; - -typedef struct png_info_s -{ - unsigned int width; - unsigned int height; - int depth; - int color; - int interlace; - int bpp; -} png_info_t; - - -int mipng_is_type(unsigned char *ptr, char *type) -{ - if (ptr[4] == type[0] && ptr[5] == type[1] && ptr[6] == type[2] && ptr[7] == type[3]) - return (1); - return (0); -} - - -unsigned char mipng_defilter_none(unsigned char *buff, int pos, int a, int b, int c) -{ return (buff[pos]); } -unsigned char mipng_defilter_sub(unsigned char *buff, int pos, int a, int b, int c) -{ return (buff[pos]+(unsigned int)a); } -unsigned char mipng_defilter_up(unsigned char *buff, int pos, int a, int b, int c) -{ return (buff[pos]+(unsigned int)b); } -unsigned char mipng_defilter_average(unsigned char *buff, int pos, int a, int b, int c) -{ return (buff[pos]+((unsigned int)a+(unsigned int)b)/2); } -unsigned char mipng_defilter_paeth(unsigned char *buff, int pos, int a, int b, int c) -{ - int p; - int result; - - p = a + b - c; - if (abs(b - c) <= abs(a - c) && abs(b - c) <= abs(a + b - c - c)) - result = a; - else - if (abs(a - c) <= abs(a + b - c - c)) - result = b; - else - result = c; - return (buff[pos]+result); -} - - - -unsigned char (*(mipng_defilter[]))(unsigned char *buff, int pos, int a, int b, int c) = -{ - mipng_defilter_none, - mipng_defilter_sub, - mipng_defilter_up, - mipng_defilter_average, - mipng_defilter_paeth -}; - -// only work for mlx mac or img 32bpp -int mipng_fill_img(mlx_img_list_t *img, unsigned char *buf, png_info_t *pi) -{ - unsigned int current_filter; - int ipos; - int bpos; - int ilen; - int iline; - int blen; - unsigned char tmp; - unsigned char *ibuf; - - ibuf = (unsigned char *)img->buffer; - iline = img->width * UNIQ_BPP; - ilen = img->width * img->height * UNIQ_BPP; - blen = img->width * img->height * pi->bpp + img->height; - ipos = 0; - bpos = 0; - while (ipos < ilen && bpos < blen) - { - if ((ipos % iline) == 0) - { - if ((current_filter = buf[bpos++]) > 4) - return (ERR_DATA_FILTER); - } - ibuf[ipos] = mipng_defilter[current_filter](buf, bpos, - ipos%iline>3?ibuf[ipos-UNIQ_BPP]:0, - (ipos>=iline)?ibuf[ipos-iline]:0, - (ipos>=iline && ipos%iline>3)?ibuf[ipos-iline-UNIQ_BPP]:0); - ipos ++; - bpos ++; - if (pi->depth == 16) - bpos ++; - if (ipos % 4 == 3 && pi->color == 2) // no alpha - img->buffer[ipos++] = 0xFF; - } - if (ipos != ilen || bpos != blen) - { - // printf("fill err ipos %d vs %d, bpos %d vs %d\n", ipos, ilen, bpos, blen); - return (ERR_DATA_MISMATCH); - } - ipos = 0; - while (ipos < ilen) - { - tmp = ibuf[ipos]; - ibuf[ipos] = ibuf[ipos+2]; - ibuf[ipos+2] = tmp; - ibuf[ipos+3] = 0xFF - ibuf[ipos+3]; - ipos += UNIQ_BPP; - } - return (0); -} - - -int mipng_data(mlx_img_list_t *img, unsigned char *dat, png_info_t *pi) -{ - unsigned int len; - int b_pos; - unsigned char *buffer; - int ret; - int z_ret; - unsigned z_have; - z_stream z_strm; - unsigned char z_out[Z_CHUNK]; - - b_pos = 0; - if (!(buffer = malloc((long long)img->width*(long long)img->height*(long long)pi->bpp + img->height))) - err(1, "Can't malloc"); - z_strm.zalloc = Z_NULL; - z_strm.zfree = Z_NULL; - z_strm.opaque = Z_NULL; - z_strm.avail_in = 0; - z_strm.next_in = Z_NULL; - z_ret = inflateInit(&z_strm); - if (z_ret != Z_OK) - return (ERR_ZLIB); - - while (mipng_is_type(dat, "IDAT")) - { - len = *((unsigned int *)dat); - len = ntohl(len); - z_strm.avail_in = len; - z_strm.next_in = dat + 8; - z_strm.avail_out = 0; - while (z_strm.avail_out == 0) - { - z_strm.avail_out = Z_CHUNK; - z_strm.next_out = z_out; - z_ret = inflate(&z_strm, Z_NO_FLUSH); - // printf("inflate ret %d avail_out %d\n", z_ret, z_strm.avail_out); - if (z_ret != Z_OK && z_ret != Z_STREAM_END) - { - inflateEnd(&z_strm); - return (ERR_ZLIB); - } - if (b_pos + Z_CHUNK - z_strm.avail_out > img->width*img->height*pi->bpp+img->height) - { - inflateEnd(&z_strm); - return (ERR_DATA_MISMATCH); - } - bcopy(z_out, buffer+b_pos, Z_CHUNK - z_strm.avail_out); - b_pos += Z_CHUNK - z_strm.avail_out; - } - dat += len + 4 + 4 + 4; - } - inflateEnd(&z_strm); - if (b_pos != img->width*img->height*pi->bpp+img->height) - { - // printf("pb : bpos %d vs expected %d\n", b_pos, img->width*img->height*pi->bpp+img->height); - return (ERR_DATA_MISMATCH); - } - if ((ret = mipng_fill_img(img, buffer, pi))) - return (ret); - return (0); -} - - - -int mipng_magic(unsigned char *ptr, int size) -{ - int i; - - if (size < PNG_MAGIC_SIZE) - return (ERR_MAGIC_SIZE); - i = 0; - while (i < PNG_MAGIC_SIZE) - if (*(ptr++) != magic[i++]) - return (ERR_MAGIC_WRONG); - return (0); -} - - -unsigned long crc_table[256] = { 0, 0x77073096, 0xee0e612c, 0x990951ba, 0x76dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0xedb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x9b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x1db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x6b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0xf00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x86d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x3b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x4db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0xd6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0xa00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x26d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x5005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0xcb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0xbdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; - -// From http://www.w3.org/TR/PNG/#D-CRCAppendix -int mipng_crc(unsigned char *ptr, int len) -{ - unsigned int file_crc; - unsigned long crc; - int i; - - file_crc = *((unsigned int *)(ptr+4+4+len)); - file_crc = ntohl(file_crc); - - crc = 0xffffffffL; - i = 0; - while (i < len+4) - crc = crc_table[(crc ^ ptr[(i++)+4]) & 0xff] ^ (crc >> 8); - crc ^= 0xffffffffL; - - if (file_crc != crc) - return (1); - return (0); -} - - -int mipng_structure(unsigned char *ptr, int size, unsigned char **hdr, unsigned char **dat) -{ - unsigned int len; - int dat_state; - int end; - - dat_state = 0; - *hdr = NULL; - *dat = NULL; - end = 0; - while (size) - { - if (size >= 4) // length present - { - len = *((unsigned int *)ptr); - len = ntohl(len); - if (size < 4 + 4 + 4 + len) - return (ERR_STRUCT_INCOMPLETE); - if (mipng_crc(ptr, len)) - return (ERR_STRUCT_CRC); - // printf("found chunk len %d type %c%c%c%c\n", len, *(ptr+4), *(ptr+5), *(ptr+6), *(ptr+7)); - if (mipng_is_type(ptr, "IHDR")) - { - if (*hdr || len != PNG_HDR_SIZE) - return (ERR_STRUCT_HDR); - *hdr = ptr; - } - if (mipng_is_type(ptr, "IEND")) - { - if (len != 0 || size != 4+4+4) - return (ERR_STRUCT_END); - end = 1; - } - if (mipng_is_type(ptr, "IDAT")) - { - if (dat_state == 0) - { - dat_state = 1; - *dat = ptr; - } - if (dat_state == 2) - return (ERR_STRUCT_DAT); - } - else - if (dat_state == 1) - dat_state = 2; - size -= 4+4+4+len; - ptr += 4+4+4+len; - } - else - return (ERR_STRUCT_INCOMPLETE); - } - if (*hdr == 0 || *dat == 0 || end == 0) - return (ERR_STRUCT_MISSCHK); - return (0); -} - - -int mipng_verif_hdr(unsigned char *hdr, png_info_t *pi) -{ - unsigned int compress; - unsigned int filter; - - hdr += 8; - pi->width = ntohl(*((unsigned long *)hdr)); - pi->height = ntohl(*((unsigned long *)(hdr+4))); - pi->depth = *(hdr+8); - pi->color = *(hdr+9); - compress = *(hdr+10); - filter = *(hdr+11); - pi->interlace = *(hdr+12); - if (pi->width <= 0 || pi->height <= 0 || (pi->depth != 8 && pi->depth != 16) - || (pi->color != 2 && pi->color != 6) || compress != 0 || filter != 0 || pi->interlace != 0) - return (ERR_STRUCT_INCIMPL); - pi->bpp = pi->depth / 8; - if (pi->color == 2) - pi->bpp *= 3; - if (pi->color == 6) - pi->bpp *= 4; - // printf("hdr info : %d x %d, depth %d, col type %d, comp %d, filter %d, interlace %d\nbpp is %d\n", - // pi->width, pi->height, pi->depth, pi->color, compress, filter, pi->interlace, pi->bpp); - return (0); -} - - -mlx_img_list_t *mlx_int_parse_png(mlx_ptr_t *xvar, unsigned char *fptr, int size) -{ - int err; - unsigned char *hdr; - unsigned char *dat; - png_info_t pi; - mlx_img_list_t *img; - - if ((err = mipng_magic(fptr, size))) - { - warnx("mlx PNG error : %s", mipng_err[err]); - return ((mlx_img_list_t *)0); - } - fptr += PNG_MAGIC_SIZE; - size -= PNG_MAGIC_SIZE; - if ((err = mipng_structure(fptr, size, &hdr, &dat))) - { - warnx("mlx PNG error : %s", mipng_err[err]); - return ((mlx_img_list_t *)0); - } - if ((err = mipng_verif_hdr(hdr, &pi))) - { - warnx("mlx PNG error : %s", mipng_err[err]); - return ((mlx_img_list_t *)0); - } - if (!(img = mlx_new_image(xvar, pi.width, pi.height))) - { - warnx("mlx PNG error : Can't create mlx image"); - return ((mlx_img_list_t *)0); - } - if ((err = mipng_data(img, dat, &pi))) - { - mlx_destroy_image(xvar, img); - warnx("mlx PNG error : %s", mipng_err[err]); - return ((mlx_img_list_t *)0); - } - return (img); -} - - - - -void *mlx_png_file_to_image(mlx_ptr_t *xvar, char *file, int *width, int *height) -{ - int fd; - int size; - unsigned char *ptr; - mlx_img_list_t *img; - - if ((fd = open(file, O_RDONLY)) == -1 || (size = lseek(fd, 0, SEEK_END)) == -1 || - (ptr = mmap(0, size, PROT_READ, MAP_PRIVATE, fd, 0)) == (void *)MAP_FAILED) - { - if (fd >= 0) - close(fd); - warnx("Can't map png file '%s'", file); - return ((void *)0); - } - if ((img = mlx_int_parse_png(xvar, ptr, size))) - { - *width = img->width; - *height = img->height; - } - else - { - *width = 0; - *height = 0; - } - munmap(ptr,size); - close(fd); - return (img); -} diff --git a/parse_map/mlx/mlx_png.h b/parse_map/mlx/mlx_png.h deleted file mode 100644 index 83ef145..0000000 --- a/parse_map/mlx/mlx_png.h +++ /dev/null @@ -1,4 +0,0 @@ - - - -void *mlx_png_file_to_image(void *xvar, char *file, int *width, int *height); diff --git a/parse_map/mlx/mlx_rgb.c b/parse_map/mlx/mlx_rgb.c deleted file mode 100644 index 3f98717..0000000 --- a/parse_map/mlx/mlx_rgb.c +++ /dev/null @@ -1,763 +0,0 @@ -/* -** This is a generated file with rgb2c.pl and rgb.txt from -** the XFree86 distribution. -*/ - - -struct s_col_name mlx_col_name[] = -{ - { "snow" , 0xfffafa }, - { "ghost white" , 0xf8f8ff }, - { "ghostwhite" , 0xf8f8ff }, - { "white smoke" , 0xf5f5f5 }, - { "whitesmoke" , 0xf5f5f5 }, - { "gainsboro" , 0xdcdcdc }, - { "floral white" , 0xfffaf0 }, - { "floralwhite" , 0xfffaf0 }, - { "old lace" , 0xfdf5e6 }, - { "oldlace" , 0xfdf5e6 }, - { "linen" , 0xfaf0e6 }, - { "antique white" , 0xfaebd7 }, - { "antiquewhite" , 0xfaebd7 }, - { "papaya whip" , 0xffefd5 }, - { "papayawhip" , 0xffefd5 }, - { "blanched almond" , 0xffebcd }, - { "blanchedalmond" , 0xffebcd }, - { "bisque" , 0xffe4c4 }, - { "peach puff" , 0xffdab9 }, - { "peachpuff" , 0xffdab9 }, - { "navajo white" , 0xffdead }, - { "navajowhite" , 0xffdead }, - { "moccasin" , 0xffe4b5 }, - { "cornsilk" , 0xfff8dc }, - { "ivory" , 0xfffff0 }, - { "lemon chiffon" , 0xfffacd }, - { "lemonchiffon" , 0xfffacd }, - { "seashell" , 0xfff5ee }, - { "honeydew" , 0xf0fff0 }, - { "mint cream" , 0xf5fffa }, - { "mintcream" , 0xf5fffa }, - { "azure" , 0xf0ffff }, - { "alice blue" , 0xf0f8ff }, - { "aliceblue" , 0xf0f8ff }, - { "lavender" , 0xe6e6fa }, - { "lavender blush" , 0xfff0f5 }, - { "lavenderblush" , 0xfff0f5 }, - { "misty rose" , 0xffe4e1 }, - { "mistyrose" , 0xffe4e1 }, - { "white" , 0xffffff }, - { "black" , 0x0 }, - { "dark slate" , 0x2f4f4f }, - { "darkslategray" , 0x2f4f4f }, - { "dark slate" , 0x2f4f4f }, - { "darkslategrey" , 0x2f4f4f }, - { "dim gray" , 0x696969 }, - { "dimgray" , 0x696969 }, - { "dim grey" , 0x696969 }, - { "dimgrey" , 0x696969 }, - { "slate gray" , 0x708090 }, - { "slategray" , 0x708090 }, - { "slate grey" , 0x708090 }, - { "slategrey" , 0x708090 }, - { "light slate" , 0x778899 }, - { "lightslategray" , 0x778899 }, - { "light slate" , 0x778899 }, - { "lightslategrey" , 0x778899 }, - { "gray" , 0xbebebe }, - { "grey" , 0xbebebe }, - { "light grey" , 0xd3d3d3 }, - { "lightgrey" , 0xd3d3d3 }, - { "light gray" , 0xd3d3d3 }, - { "lightgray" , 0xd3d3d3 }, - { "midnight blue" , 0x191970 }, - { "midnightblue" , 0x191970 }, - { "navy" , 0x80 }, - { "navy blue" , 0x80 }, - { "navyblue" , 0x80 }, - { "cornflower blue" , 0x6495ed }, - { "cornflowerblue" , 0x6495ed }, - { "dark slate" , 0x483d8b }, - { "darkslateblue" , 0x483d8b }, - { "slate blue" , 0x6a5acd }, - { "slateblue" , 0x6a5acd }, - { "medium slate" , 0x7b68ee }, - { "mediumslateblue" , 0x7b68ee }, - { "light slate" , 0x8470ff }, - { "lightslateblue" , 0x8470ff }, - { "medium blue" , 0xcd }, - { "mediumblue" , 0xcd }, - { "royal blue" , 0x4169e1 }, - { "royalblue" , 0x4169e1 }, - { "blue" , 0xff }, - { "dodger blue" , 0x1e90ff }, - { "dodgerblue" , 0x1e90ff }, - { "deep sky" , 0xbfff }, - { "deepskyblue" , 0xbfff }, - { "sky blue" , 0x87ceeb }, - { "skyblue" , 0x87ceeb }, - { "light sky" , 0x87cefa }, - { "lightskyblue" , 0x87cefa }, - { "steel blue" , 0x4682b4 }, - { "steelblue" , 0x4682b4 }, - { "light steel" , 0xb0c4de }, - { "lightsteelblue" , 0xb0c4de }, - { "light blue" , 0xadd8e6 }, - { "lightblue" , 0xadd8e6 }, - { "powder blue" , 0xb0e0e6 }, - { "powderblue" , 0xb0e0e6 }, - { "pale turquoise" , 0xafeeee }, - { "paleturquoise" , 0xafeeee }, - { "dark turquoise" , 0xced1 }, - { "darkturquoise" , 0xced1 }, - { "medium turquoise" , 0x48d1cc }, - { "mediumturquoise" , 0x48d1cc }, - { "turquoise" , 0x40e0d0 }, - { "cyan" , 0xffff }, - { "light cyan" , 0xe0ffff }, - { "lightcyan" , 0xe0ffff }, - { "cadet blue" , 0x5f9ea0 }, - { "cadetblue" , 0x5f9ea0 }, - { "medium aquamarine" , 0x66cdaa }, - { "mediumaquamarine" , 0x66cdaa }, - { "aquamarine" , 0x7fffd4 }, - { "dark green" , 0x6400 }, - { "darkgreen" , 0x6400 }, - { "dark olive" , 0x556b2f }, - { "darkolivegreen" , 0x556b2f }, - { "dark sea" , 0x8fbc8f }, - { "darkseagreen" , 0x8fbc8f }, - { "sea green" , 0x2e8b57 }, - { "seagreen" , 0x2e8b57 }, - { "medium sea" , 0x3cb371 }, - { "mediumseagreen" , 0x3cb371 }, - { "light sea" , 0x20b2aa }, - { "lightseagreen" , 0x20b2aa }, - { "pale green" , 0x98fb98 }, - { "palegreen" , 0x98fb98 }, - { "spring green" , 0xff7f }, - { "springgreen" , 0xff7f }, - { "lawn green" , 0x7cfc00 }, - { "lawngreen" , 0x7cfc00 }, - { "green" , 0xff00 }, - { "chartreuse" , 0x7fff00 }, - { "medium spring" , 0xfa9a }, - { "mediumspringgreen" , 0xfa9a }, - { "green yellow" , 0xadff2f }, - { "greenyellow" , 0xadff2f }, - { "lime green" , 0x32cd32 }, - { "limegreen" , 0x32cd32 }, - { "yellow green" , 0x9acd32 }, - { "yellowgreen" , 0x9acd32 }, - { "forest green" , 0x228b22 }, - { "forestgreen" , 0x228b22 }, - { "olive drab" , 0x6b8e23 }, - { "olivedrab" , 0x6b8e23 }, - { "dark khaki" , 0xbdb76b }, - { "darkkhaki" , 0xbdb76b }, - { "khaki" , 0xf0e68c }, - { "pale goldenrod" , 0xeee8aa }, - { "palegoldenrod" , 0xeee8aa }, - { "light goldenrod" , 0xfafad2 }, - { "lightgoldenrodyellow" , 0xfafad2 }, - { "light yellow" , 0xffffe0 }, - { "lightyellow" , 0xffffe0 }, - { "yellow" , 0xffff00 }, - { "gold" , 0xffd700 }, - { "light goldenrod" , 0xeedd82 }, - { "lightgoldenrod" , 0xeedd82 }, - { "goldenrod" , 0xdaa520 }, - { "dark goldenrod" , 0xb8860b }, - { "darkgoldenrod" , 0xb8860b }, - { "rosy brown" , 0xbc8f8f }, - { "rosybrown" , 0xbc8f8f }, - { "indian red" , 0xcd5c5c }, - { "indianred" , 0xcd5c5c }, - { "saddle brown" , 0x8b4513 }, - { "saddlebrown" , 0x8b4513 }, - { "sienna" , 0xa0522d }, - { "peru" , 0xcd853f }, - { "burlywood" , 0xdeb887 }, - { "beige" , 0xf5f5dc }, - { "wheat" , 0xf5deb3 }, - { "sandy brown" , 0xf4a460 }, - { "sandybrown" , 0xf4a460 }, - { "tan" , 0xd2b48c }, - { "chocolate" , 0xd2691e }, - { "firebrick" , 0xb22222 }, - { "brown" , 0xa52a2a }, - { "dark salmon" , 0xe9967a }, - { "darksalmon" , 0xe9967a }, - { "salmon" , 0xfa8072 }, - { "light salmon" , 0xffa07a }, - { "lightsalmon" , 0xffa07a }, - { "orange" , 0xffa500 }, - { "dark orange" , 0xff8c00 }, - { "darkorange" , 0xff8c00 }, - { "coral" , 0xff7f50 }, - { "light coral" , 0xf08080 }, - { "lightcoral" , 0xf08080 }, - { "tomato" , 0xff6347 }, - { "orange red" , 0xff4500 }, - { "orangered" , 0xff4500 }, - { "red" , 0xff0000 }, - { "hot pink" , 0xff69b4 }, - { "hotpink" , 0xff69b4 }, - { "deep pink" , 0xff1493 }, - { "deeppink" , 0xff1493 }, - { "pink" , 0xffc0cb }, - { "light pink" , 0xffb6c1 }, - { "lightpink" , 0xffb6c1 }, - { "pale violet" , 0xdb7093 }, - { "palevioletred" , 0xdb7093 }, - { "maroon" , 0xb03060 }, - { "medium violet" , 0xc71585 }, - { "mediumvioletred" , 0xc71585 }, - { "violet red" , 0xd02090 }, - { "violetred" , 0xd02090 }, - { "magenta" , 0xff00ff }, - { "violet" , 0xee82ee }, - { "plum" , 0xdda0dd }, - { "orchid" , 0xda70d6 }, - { "medium orchid" , 0xba55d3 }, - { "mediumorchid" , 0xba55d3 }, - { "dark orchid" , 0x9932cc }, - { "darkorchid" , 0x9932cc }, - { "dark violet" , 0x9400d3 }, - { "darkviolet" , 0x9400d3 }, - { "blue violet" , 0x8a2be2 }, - { "blueviolet" , 0x8a2be2 }, - { "purple" , 0xa020f0 }, - { "medium purple" , 0x9370db }, - { "mediumpurple" , 0x9370db }, - { "thistle" , 0xd8bfd8 }, - { "snow1" , 0xfffafa }, - { "snow2" , 0xeee9e9 }, - { "snow3" , 0xcdc9c9 }, - { "snow4" , 0x8b8989 }, - { "seashell1" , 0xfff5ee }, - { "seashell2" , 0xeee5de }, - { "seashell3" , 0xcdc5bf }, - { "seashell4" , 0x8b8682 }, - { "antiquewhite1" , 0xffefdb }, - { "antiquewhite2" , 0xeedfcc }, - { "antiquewhite3" , 0xcdc0b0 }, - { "antiquewhite4" , 0x8b8378 }, - { "bisque1" , 0xffe4c4 }, - { "bisque2" , 0xeed5b7 }, - { "bisque3" , 0xcdb79e }, - { "bisque4" , 0x8b7d6b }, - { "peachpuff1" , 0xffdab9 }, - { "peachpuff2" , 0xeecbad }, - { "peachpuff3" , 0xcdaf95 }, - { "peachpuff4" , 0x8b7765 }, - { "navajowhite1" , 0xffdead }, - { "navajowhite2" , 0xeecfa1 }, - { "navajowhite3" , 0xcdb38b }, - { "navajowhite4" , 0x8b795e }, - { "lemonchiffon1" , 0xfffacd }, - { "lemonchiffon2" , 0xeee9bf }, - { "lemonchiffon3" , 0xcdc9a5 }, - { "lemonchiffon4" , 0x8b8970 }, - { "cornsilk1" , 0xfff8dc }, - { "cornsilk2" , 0xeee8cd }, - { "cornsilk3" , 0xcdc8b1 }, - { "cornsilk4" , 0x8b8878 }, - { "ivory1" , 0xfffff0 }, - { "ivory2" , 0xeeeee0 }, - { "ivory3" , 0xcdcdc1 }, - { "ivory4" , 0x8b8b83 }, - { "honeydew1" , 0xf0fff0 }, - { "honeydew2" , 0xe0eee0 }, - { "honeydew3" , 0xc1cdc1 }, - { "honeydew4" , 0x838b83 }, - { "lavenderblush1" , 0xfff0f5 }, - { "lavenderblush2" , 0xeee0e5 }, - { "lavenderblush3" , 0xcdc1c5 }, - { "lavenderblush4" , 0x8b8386 }, - { "mistyrose1" , 0xffe4e1 }, - { "mistyrose2" , 0xeed5d2 }, - { "mistyrose3" , 0xcdb7b5 }, - { "mistyrose4" , 0x8b7d7b }, - { "azure1" , 0xf0ffff }, - { "azure2" , 0xe0eeee }, - { "azure3" , 0xc1cdcd }, - { "azure4" , 0x838b8b }, - { "slateblue1" , 0x836fff }, - { "slateblue2" , 0x7a67ee }, - { "slateblue3" , 0x6959cd }, - { "slateblue4" , 0x473c8b }, - { "royalblue1" , 0x4876ff }, - { "royalblue2" , 0x436eee }, - { "royalblue3" , 0x3a5fcd }, - { "royalblue4" , 0x27408b }, - { "blue1" , 0xff }, - { "blue2" , 0xee }, - { "blue3" , 0xcd }, - { "blue4" , 0x8b }, - { "dodgerblue1" , 0x1e90ff }, - { "dodgerblue2" , 0x1c86ee }, - { "dodgerblue3" , 0x1874cd }, - { "dodgerblue4" , 0x104e8b }, - { "steelblue1" , 0x63b8ff }, - { "steelblue2" , 0x5cacee }, - { "steelblue3" , 0x4f94cd }, - { "steelblue4" , 0x36648b }, - { "deepskyblue1" , 0xbfff }, - { "deepskyblue2" , 0xb2ee }, - { "deepskyblue3" , 0x9acd }, - { "deepskyblue4" , 0x688b }, - { "skyblue1" , 0x87ceff }, - { "skyblue2" , 0x7ec0ee }, - { "skyblue3" , 0x6ca6cd }, - { "skyblue4" , 0x4a708b }, - { "lightskyblue1" , 0xb0e2ff }, - { "lightskyblue2" , 0xa4d3ee }, - { "lightskyblue3" , 0x8db6cd }, - { "lightskyblue4" , 0x607b8b }, - { "slategray1" , 0xc6e2ff }, - { "slategray2" , 0xb9d3ee }, - { "slategray3" , 0x9fb6cd }, - { "slategray4" , 0x6c7b8b }, - { "lightsteelblue1" , 0xcae1ff }, - { "lightsteelblue2" , 0xbcd2ee }, - { "lightsteelblue3" , 0xa2b5cd }, - { "lightsteelblue4" , 0x6e7b8b }, - { "lightblue1" , 0xbfefff }, - { "lightblue2" , 0xb2dfee }, - { "lightblue3" , 0x9ac0cd }, - { "lightblue4" , 0x68838b }, - { "lightcyan1" , 0xe0ffff }, - { "lightcyan2" , 0xd1eeee }, - { "lightcyan3" , 0xb4cdcd }, - { "lightcyan4" , 0x7a8b8b }, - { "paleturquoise1" , 0xbbffff }, - { "paleturquoise2" , 0xaeeeee }, - { "paleturquoise3" , 0x96cdcd }, - { "paleturquoise4" , 0x668b8b }, - { "cadetblue1" , 0x98f5ff }, - { "cadetblue2" , 0x8ee5ee }, - { "cadetblue3" , 0x7ac5cd }, - { "cadetblue4" , 0x53868b }, - { "turquoise1" , 0xf5ff }, - { "turquoise2" , 0xe5ee }, - { "turquoise3" , 0xc5cd }, - { "turquoise4" , 0x868b }, - { "cyan1" , 0xffff }, - { "cyan2" , 0xeeee }, - { "cyan3" , 0xcdcd }, - { "cyan4" , 0x8b8b }, - { "darkslategray1" , 0x97ffff }, - { "darkslategray2" , 0x8deeee }, - { "darkslategray3" , 0x79cdcd }, - { "darkslategray4" , 0x528b8b }, - { "aquamarine1" , 0x7fffd4 }, - { "aquamarine2" , 0x76eec6 }, - { "aquamarine3" , 0x66cdaa }, - { "aquamarine4" , 0x458b74 }, - { "darkseagreen1" , 0xc1ffc1 }, - { "darkseagreen2" , 0xb4eeb4 }, - { "darkseagreen3" , 0x9bcd9b }, - { "darkseagreen4" , 0x698b69 }, - { "seagreen1" , 0x54ff9f }, - { "seagreen2" , 0x4eee94 }, - { "seagreen3" , 0x43cd80 }, - { "seagreen4" , 0x2e8b57 }, - { "palegreen1" , 0x9aff9a }, - { "palegreen2" , 0x90ee90 }, - { "palegreen3" , 0x7ccd7c }, - { "palegreen4" , 0x548b54 }, - { "springgreen1" , 0xff7f }, - { "springgreen2" , 0xee76 }, - { "springgreen3" , 0xcd66 }, - { "springgreen4" , 0x8b45 }, - { "green1" , 0xff00 }, - { "green2" , 0xee00 }, - { "green3" , 0xcd00 }, - { "green4" , 0x8b00 }, - { "chartreuse1" , 0x7fff00 }, - { "chartreuse2" , 0x76ee00 }, - { "chartreuse3" , 0x66cd00 }, - { "chartreuse4" , 0x458b00 }, - { "olivedrab1" , 0xc0ff3e }, - { "olivedrab2" , 0xb3ee3a }, - { "olivedrab3" , 0x9acd32 }, - { "olivedrab4" , 0x698b22 }, - { "darkolivegreen1" , 0xcaff70 }, - { "darkolivegreen2" , 0xbcee68 }, - { "darkolivegreen3" , 0xa2cd5a }, - { "darkolivegreen4" , 0x6e8b3d }, - { "khaki1" , 0xfff68f }, - { "khaki2" , 0xeee685 }, - { "khaki3" , 0xcdc673 }, - { "khaki4" , 0x8b864e }, - { "lightgoldenrod1" , 0xffec8b }, - { "lightgoldenrod2" , 0xeedc82 }, - { "lightgoldenrod3" , 0xcdbe70 }, - { "lightgoldenrod4" , 0x8b814c }, - { "lightyellow1" , 0xffffe0 }, - { "lightyellow2" , 0xeeeed1 }, - { "lightyellow3" , 0xcdcdb4 }, - { "lightyellow4" , 0x8b8b7a }, - { "yellow1" , 0xffff00 }, - { "yellow2" , 0xeeee00 }, - { "yellow3" , 0xcdcd00 }, - { "yellow4" , 0x8b8b00 }, - { "gold1" , 0xffd700 }, - { "gold2" , 0xeec900 }, - { "gold3" , 0xcdad00 }, - { "gold4" , 0x8b7500 }, - { "goldenrod1" , 0xffc125 }, - { "goldenrod2" , 0xeeb422 }, - { "goldenrod3" , 0xcd9b1d }, - { "goldenrod4" , 0x8b6914 }, - { "darkgoldenrod1" , 0xffb90f }, - { "darkgoldenrod2" , 0xeead0e }, - { "darkgoldenrod3" , 0xcd950c }, - { "darkgoldenrod4" , 0x8b6508 }, - { "rosybrown1" , 0xffc1c1 }, - { "rosybrown2" , 0xeeb4b4 }, - { "rosybrown3" , 0xcd9b9b }, - { "rosybrown4" , 0x8b6969 }, - { "indianred1" , 0xff6a6a }, - { "indianred2" , 0xee6363 }, - { "indianred3" , 0xcd5555 }, - { "indianred4" , 0x8b3a3a }, - { "sienna1" , 0xff8247 }, - { "sienna2" , 0xee7942 }, - { "sienna3" , 0xcd6839 }, - { "sienna4" , 0x8b4726 }, - { "burlywood1" , 0xffd39b }, - { "burlywood2" , 0xeec591 }, - { "burlywood3" , 0xcdaa7d }, - { "burlywood4" , 0x8b7355 }, - { "wheat1" , 0xffe7ba }, - { "wheat2" , 0xeed8ae }, - { "wheat3" , 0xcdba96 }, - { "wheat4" , 0x8b7e66 }, - { "tan1" , 0xffa54f }, - { "tan2" , 0xee9a49 }, - { "tan3" , 0xcd853f }, - { "tan4" , 0x8b5a2b }, - { "chocolate1" , 0xff7f24 }, - { "chocolate2" , 0xee7621 }, - { "chocolate3" , 0xcd661d }, - { "chocolate4" , 0x8b4513 }, - { "firebrick1" , 0xff3030 }, - { "firebrick2" , 0xee2c2c }, - { "firebrick3" , 0xcd2626 }, - { "firebrick4" , 0x8b1a1a }, - { "brown1" , 0xff4040 }, - { "brown2" , 0xee3b3b }, - { "brown3" , 0xcd3333 }, - { "brown4" , 0x8b2323 }, - { "salmon1" , 0xff8c69 }, - { "salmon2" , 0xee8262 }, - { "salmon3" , 0xcd7054 }, - { "salmon4" , 0x8b4c39 }, - { "lightsalmon1" , 0xffa07a }, - { "lightsalmon2" , 0xee9572 }, - { "lightsalmon3" , 0xcd8162 }, - { "lightsalmon4" , 0x8b5742 }, - { "orange1" , 0xffa500 }, - { "orange2" , 0xee9a00 }, - { "orange3" , 0xcd8500 }, - { "orange4" , 0x8b5a00 }, - { "darkorange1" , 0xff7f00 }, - { "darkorange2" , 0xee7600 }, - { "darkorange3" , 0xcd6600 }, - { "darkorange4" , 0x8b4500 }, - { "coral1" , 0xff7256 }, - { "coral2" , 0xee6a50 }, - { "coral3" , 0xcd5b45 }, - { "coral4" , 0x8b3e2f }, - { "tomato1" , 0xff6347 }, - { "tomato2" , 0xee5c42 }, - { "tomato3" , 0xcd4f39 }, - { "tomato4" , 0x8b3626 }, - { "orangered1" , 0xff4500 }, - { "orangered2" , 0xee4000 }, - { "orangered3" , 0xcd3700 }, - { "orangered4" , 0x8b2500 }, - { "red1" , 0xff0000 }, - { "red2" , 0xee0000 }, - { "red3" , 0xcd0000 }, - { "red4" , 0x8b0000 }, - { "deeppink1" , 0xff1493 }, - { "deeppink2" , 0xee1289 }, - { "deeppink3" , 0xcd1076 }, - { "deeppink4" , 0x8b0a50 }, - { "hotpink1" , 0xff6eb4 }, - { "hotpink2" , 0xee6aa7 }, - { "hotpink3" , 0xcd6090 }, - { "hotpink4" , 0x8b3a62 }, - { "pink1" , 0xffb5c5 }, - { "pink2" , 0xeea9b8 }, - { "pink3" , 0xcd919e }, - { "pink4" , 0x8b636c }, - { "lightpink1" , 0xffaeb9 }, - { "lightpink2" , 0xeea2ad }, - { "lightpink3" , 0xcd8c95 }, - { "lightpink4" , 0x8b5f65 }, - { "palevioletred1" , 0xff82ab }, - { "palevioletred2" , 0xee799f }, - { "palevioletred3" , 0xcd6889 }, - { "palevioletred4" , 0x8b475d }, - { "maroon1" , 0xff34b3 }, - { "maroon2" , 0xee30a7 }, - { "maroon3" , 0xcd2990 }, - { "maroon4" , 0x8b1c62 }, - { "violetred1" , 0xff3e96 }, - { "violetred2" , 0xee3a8c }, - { "violetred3" , 0xcd3278 }, - { "violetred4" , 0x8b2252 }, - { "magenta1" , 0xff00ff }, - { "magenta2" , 0xee00ee }, - { "magenta3" , 0xcd00cd }, - { "magenta4" , 0x8b008b }, - { "orchid1" , 0xff83fa }, - { "orchid2" , 0xee7ae9 }, - { "orchid3" , 0xcd69c9 }, - { "orchid4" , 0x8b4789 }, - { "plum1" , 0xffbbff }, - { "plum2" , 0xeeaeee }, - { "plum3" , 0xcd96cd }, - { "plum4" , 0x8b668b }, - { "mediumorchid1" , 0xe066ff }, - { "mediumorchid2" , 0xd15fee }, - { "mediumorchid3" , 0xb452cd }, - { "mediumorchid4" , 0x7a378b }, - { "darkorchid1" , 0xbf3eff }, - { "darkorchid2" , 0xb23aee }, - { "darkorchid3" , 0x9a32cd }, - { "darkorchid4" , 0x68228b }, - { "purple1" , 0x9b30ff }, - { "purple2" , 0x912cee }, - { "purple3" , 0x7d26cd }, - { "purple4" , 0x551a8b }, - { "mediumpurple1" , 0xab82ff }, - { "mediumpurple2" , 0x9f79ee }, - { "mediumpurple3" , 0x8968cd }, - { "mediumpurple4" , 0x5d478b }, - { "thistle1" , 0xffe1ff }, - { "thistle2" , 0xeed2ee }, - { "thistle3" , 0xcdb5cd }, - { "thistle4" , 0x8b7b8b }, - { "gray0" , 0x0 }, - { "grey0" , 0x0 }, - { "gray1" , 0x30303 }, - { "grey1" , 0x30303 }, - { "gray2" , 0x50505 }, - { "grey2" , 0x50505 }, - { "gray3" , 0x80808 }, - { "grey3" , 0x80808 }, - { "gray4" , 0xa0a0a }, - { "grey4" , 0xa0a0a }, - { "gray5" , 0xd0d0d }, - { "grey5" , 0xd0d0d }, - { "gray6" , 0xf0f0f }, - { "grey6" , 0xf0f0f }, - { "gray7" , 0x121212 }, - { "grey7" , 0x121212 }, - { "gray8" , 0x141414 }, - { "grey8" , 0x141414 }, - { "gray9" , 0x171717 }, - { "grey9" , 0x171717 }, - { "gray10" , 0x1a1a1a }, - { "grey10" , 0x1a1a1a }, - { "gray11" , 0x1c1c1c }, - { "grey11" , 0x1c1c1c }, - { "gray12" , 0x1f1f1f }, - { "grey12" , 0x1f1f1f }, - { "gray13" , 0x212121 }, - { "grey13" , 0x212121 }, - { "gray14" , 0x242424 }, - { "grey14" , 0x242424 }, - { "gray15" , 0x262626 }, - { "grey15" , 0x262626 }, - { "gray16" , 0x292929 }, - { "grey16" , 0x292929 }, - { "gray17" , 0x2b2b2b }, - { "grey17" , 0x2b2b2b }, - { "gray18" , 0x2e2e2e }, - { "grey18" , 0x2e2e2e }, - { "gray19" , 0x303030 }, - { "grey19" , 0x303030 }, - { "gray20" , 0x333333 }, - { "grey20" , 0x333333 }, - { "gray21" , 0x363636 }, - { "grey21" , 0x363636 }, - { "gray22" , 0x383838 }, - { "grey22" , 0x383838 }, - { "gray23" , 0x3b3b3b }, - { "grey23" , 0x3b3b3b }, - { "gray24" , 0x3d3d3d }, - { "grey24" , 0x3d3d3d }, - { "gray25" , 0x404040 }, - { "grey25" , 0x404040 }, - { "gray26" , 0x424242 }, - { "grey26" , 0x424242 }, - { "gray27" , 0x454545 }, - { "grey27" , 0x454545 }, - { "gray28" , 0x474747 }, - { "grey28" , 0x474747 }, - { "gray29" , 0x4a4a4a }, - { "grey29" , 0x4a4a4a }, - { "gray30" , 0x4d4d4d }, - { "grey30" , 0x4d4d4d }, - { "gray31" , 0x4f4f4f }, - { "grey31" , 0x4f4f4f }, - { "gray32" , 0x525252 }, - { "grey32" , 0x525252 }, - { "gray33" , 0x545454 }, - { "grey33" , 0x545454 }, - { "gray34" , 0x575757 }, - { "grey34" , 0x575757 }, - { "gray35" , 0x595959 }, - { "grey35" , 0x595959 }, - { "gray36" , 0x5c5c5c }, - { "grey36" , 0x5c5c5c }, - { "gray37" , 0x5e5e5e }, - { "grey37" , 0x5e5e5e }, - { "gray38" , 0x616161 }, - { "grey38" , 0x616161 }, - { "gray39" , 0x636363 }, - { "grey39" , 0x636363 }, - { "gray40" , 0x666666 }, - { "grey40" , 0x666666 }, - { "gray41" , 0x696969 }, - { "grey41" , 0x696969 }, - { "gray42" , 0x6b6b6b }, - { "grey42" , 0x6b6b6b }, - { "gray43" , 0x6e6e6e }, - { "grey43" , 0x6e6e6e }, - { "gray44" , 0x707070 }, - { "grey44" , 0x707070 }, - { "gray45" , 0x737373 }, - { "grey45" , 0x737373 }, - { "gray46" , 0x757575 }, - { "grey46" , 0x757575 }, - { "gray47" , 0x787878 }, - { "grey47" , 0x787878 }, - { "gray48" , 0x7a7a7a }, - { "grey48" , 0x7a7a7a }, - { "gray49" , 0x7d7d7d }, - { "grey49" , 0x7d7d7d }, - { "gray50" , 0x7f7f7f }, - { "grey50" , 0x7f7f7f }, - { "gray51" , 0x828282 }, - { "grey51" , 0x828282 }, - { "gray52" , 0x858585 }, - { "grey52" , 0x858585 }, - { "gray53" , 0x878787 }, - { "grey53" , 0x878787 }, - { "gray54" , 0x8a8a8a }, - { "grey54" , 0x8a8a8a }, - { "gray55" , 0x8c8c8c }, - { "grey55" , 0x8c8c8c }, - { "gray56" , 0x8f8f8f }, - { "grey56" , 0x8f8f8f }, - { "gray57" , 0x919191 }, - { "grey57" , 0x919191 }, - { "gray58" , 0x949494 }, - { "grey58" , 0x949494 }, - { "gray59" , 0x969696 }, - { "grey59" , 0x969696 }, - { "gray60" , 0x999999 }, - { "grey60" , 0x999999 }, - { "gray61" , 0x9c9c9c }, - { "grey61" , 0x9c9c9c }, - { "gray62" , 0x9e9e9e }, - { "grey62" , 0x9e9e9e }, - { "gray63" , 0xa1a1a1 }, - { "grey63" , 0xa1a1a1 }, - { "gray64" , 0xa3a3a3 }, - { "grey64" , 0xa3a3a3 }, - { "gray65" , 0xa6a6a6 }, - { "grey65" , 0xa6a6a6 }, - { "gray66" , 0xa8a8a8 }, - { "grey66" , 0xa8a8a8 }, - { "gray67" , 0xababab }, - { "grey67" , 0xababab }, - { "gray68" , 0xadadad }, - { "grey68" , 0xadadad }, - { "gray69" , 0xb0b0b0 }, - { "grey69" , 0xb0b0b0 }, - { "gray70" , 0xb3b3b3 }, - { "grey70" , 0xb3b3b3 }, - { "gray71" , 0xb5b5b5 }, - { "grey71" , 0xb5b5b5 }, - { "gray72" , 0xb8b8b8 }, - { "grey72" , 0xb8b8b8 }, - { "gray73" , 0xbababa }, - { "grey73" , 0xbababa }, - { "gray74" , 0xbdbdbd }, - { "grey74" , 0xbdbdbd }, - { "gray75" , 0xbfbfbf }, - { "grey75" , 0xbfbfbf }, - { "gray76" , 0xc2c2c2 }, - { "grey76" , 0xc2c2c2 }, - { "gray77" , 0xc4c4c4 }, - { "grey77" , 0xc4c4c4 }, - { "gray78" , 0xc7c7c7 }, - { "grey78" , 0xc7c7c7 }, - { "gray79" , 0xc9c9c9 }, - { "grey79" , 0xc9c9c9 }, - { "gray80" , 0xcccccc }, - { "grey80" , 0xcccccc }, - { "gray81" , 0xcfcfcf }, - { "grey81" , 0xcfcfcf }, - { "gray82" , 0xd1d1d1 }, - { "grey82" , 0xd1d1d1 }, - { "gray83" , 0xd4d4d4 }, - { "grey83" , 0xd4d4d4 }, - { "gray84" , 0xd6d6d6 }, - { "grey84" , 0xd6d6d6 }, - { "gray85" , 0xd9d9d9 }, - { "grey85" , 0xd9d9d9 }, - { "gray86" , 0xdbdbdb }, - { "grey86" , 0xdbdbdb }, - { "gray87" , 0xdedede }, - { "grey87" , 0xdedede }, - { "gray88" , 0xe0e0e0 }, - { "grey88" , 0xe0e0e0 }, - { "gray89" , 0xe3e3e3 }, - { "grey89" , 0xe3e3e3 }, - { "gray90" , 0xe5e5e5 }, - { "grey90" , 0xe5e5e5 }, - { "gray91" , 0xe8e8e8 }, - { "grey91" , 0xe8e8e8 }, - { "gray92" , 0xebebeb }, - { "grey92" , 0xebebeb }, - { "gray93" , 0xededed }, - { "grey93" , 0xededed }, - { "gray94" , 0xf0f0f0 }, - { "grey94" , 0xf0f0f0 }, - { "gray95" , 0xf2f2f2 }, - { "grey95" , 0xf2f2f2 }, - { "gray96" , 0xf5f5f5 }, - { "grey96" , 0xf5f5f5 }, - { "gray97" , 0xf7f7f7 }, - { "grey97" , 0xf7f7f7 }, - { "gray98" , 0xfafafa }, - { "grey98" , 0xfafafa }, - { "gray99" , 0xfcfcfc }, - { "grey99" , 0xfcfcfc }, - { "gray100" , 0xffffff }, - { "grey100" , 0xffffff }, - { "dark grey" , 0xa9a9a9 }, - { "darkgrey" , 0xa9a9a9 }, - { "dark gray" , 0xa9a9a9 }, - { "darkgray" , 0xa9a9a9 }, - { "dark blue" , 0x8b }, - { "darkblue" , 0x8b }, - { "dark cyan" , 0x8b8b }, - { "darkcyan" , 0x8b8b }, - { "dark magenta" , 0x8b008b }, - { "darkmagenta" , 0x8b008b }, - { "dark red" , 0x8b0000 }, - { "darkred" , 0x8b0000 }, - { "light green" , 0x90ee90 }, - { "lightgreen" , 0x90ee90 }, - { "none", -1 }, - { 0, 0 } -}; diff --git a/parse_map/mlx/mlx_shaders.c b/parse_map/mlx/mlx_shaders.c deleted file mode 100644 index 4a58955..0000000 --- a/parse_map/mlx/mlx_shaders.c +++ /dev/null @@ -1,240 +0,0 @@ -// mlx_shaders.c - -#include -#include -#include -#include -#include "mlx_int.h" - - -void display_log(GLuint object, void (*param_func)(), void (*getlog_func)()) -{ - GLint log_length; - char *log; - - param_func(object, GL_INFO_LOG_LENGTH, &log_length); - log = malloc(log_length); - getlog_func(object, log_length, NULL, log); - fprintf(stderr, "%s", log); - free(log); -} - - -int mlx_shaders_pixel(glsl_info_t *glsl) -{ - char *source; - int length; - GLint action_ok; - - glsl->pixel_vshader = glCreateShader(GL_VERTEX_SHADER); - source = strdup("#version 110 \n" - "attribute vec2 position;" - "varying vec2 texcoord;" - "void main()" - "{" - " gl_Position = vec4( position, 0.0, 1.0);" - " texcoord = vec2(position[0]+1.0, 1.0 - position[1]) / 2.0;" - "}"); - length = strlen(source); - glShaderSource(glsl->pixel_vshader, 1, (const GLchar**)&source, &length); - glCompileShader(glsl->pixel_vshader); - free(source); - - glGetShaderiv(glsl->pixel_vshader, GL_COMPILE_STATUS, &action_ok); - if (!action_ok) { - fprintf(stderr, "Failed to compile pixel vshader :\n"); - display_log(glsl->pixel_vshader, glGetShaderiv, glGetShaderInfoLog); - return (1); - } - - glsl->pixel_fshader = glCreateShader(GL_FRAGMENT_SHADER); - source = strdup("#version 110 \n" - "uniform sampler2D texture;" - "varying vec2 texcoord;" - "void main()" - "{" - " gl_FragColor = texture2D(texture, texcoord);" - "}"); - length = strlen(source); - glShaderSource(glsl->pixel_fshader, 1, (const GLchar**)&source, &length); - glCompileShader(glsl->pixel_fshader); - free(source); - - glGetShaderiv(glsl->pixel_fshader, GL_COMPILE_STATUS, &action_ok); - if (!action_ok) { - fprintf(stderr, "Failed to compile pixel fshader :\n"); - display_log(glsl->pixel_fshader, glGetShaderiv, glGetShaderInfoLog); - return (1); - } - - glsl->pixel_program = glCreateProgram(); - glAttachShader(glsl->pixel_program, glsl->pixel_vshader); - glAttachShader(glsl->pixel_program, glsl->pixel_fshader); - glLinkProgram(glsl->pixel_program); - - glGetProgramiv(glsl->pixel_program, GL_LINK_STATUS, &action_ok); - if (!action_ok) { - fprintf(stderr, "Failed to link pixel shader program:\n"); - display_log(glsl->pixel_program, glGetProgramiv, glGetProgramInfoLog); - return (1); - } - - glFlush(); - - return (0); -} - - -int mlx_shaders_image(glsl_info_t *glsl) -{ - char *source; - int length; - GLint action_ok; - - glsl->image_vshader = glCreateShader(GL_VERTEX_SHADER); - source = strdup("#version 110 \n" - "attribute vec2 position;" - "uniform vec2 winhalfsize;" - "uniform vec2 imagepos;" - "uniform vec2 imagesize;" - "varying vec2 texcoord;" - "void main()" - "{" - " texcoord = position / imagesize;" - " vec2 pos = position - winhalfsize + imagepos;" - " pos = pos / winhalfsize;" - " gl_Position = vec4( pos, 0.0, 1.0);" - "}"); - length = strlen(source); - glShaderSource(glsl->image_vshader, 1, (const GLchar**)&source, &length); - glCompileShader(glsl->image_vshader); - free(source); - - glGetShaderiv(glsl->image_vshader, GL_COMPILE_STATUS, &action_ok); - if (!action_ok) { - fprintf(stderr, "Failed to compile image vshader :\n"); - display_log(glsl->image_vshader, glGetShaderiv, glGetShaderInfoLog); - return (1); - } - - glsl->image_fshader = glCreateShader(GL_FRAGMENT_SHADER); - source = strdup("#version 110 \n" - "uniform sampler2D texture;" - "varying vec2 texcoord;" - "void main()" - "{" - " gl_FragColor = texture2D(texture, texcoord);" - "}"); - length = strlen(source); - glShaderSource(glsl->image_fshader, 1, (const GLchar**)&source, &length); - glCompileShader(glsl->image_fshader); - free(source); - - glGetShaderiv(glsl->image_fshader, GL_COMPILE_STATUS, &action_ok); - if (!action_ok) { - fprintf(stderr, "Failed to compile image fshader :\n"); - display_log(glsl->image_fshader, glGetShaderiv, glGetShaderInfoLog); - return (1); - } - - glsl->image_program = glCreateProgram(); - glAttachShader(glsl->image_program, glsl->image_vshader); - glAttachShader(glsl->image_program, glsl->image_fshader); - glLinkProgram(glsl->image_program); - - glGetProgramiv(glsl->image_program, GL_LINK_STATUS, &action_ok); - if (!action_ok) { - fprintf(stderr, "Failed to link image shader program:\n"); - display_log(glsl->image_program, glGetProgramiv, glGetProgramInfoLog); - return (1); - } - - glFlush(); - - return (0); -} - - - - -int mlx_shaders_font(glsl_info_t *glsl) -{ - char *source; - int length; - GLint action_ok; - - glsl->font_vshader = glCreateShader(GL_VERTEX_SHADER); - source = strdup("#version 110 \n" - "attribute vec2 position;" - "uniform vec2 winhalfsize;" - "uniform vec2 fontposinwin;" - "uniform vec2 fontposinatlas;" - "uniform vec2 fontatlassize;" - "varying vec2 texcoord;" - "void main()" - "{" -#ifdef STRINGPUTX11 - " texcoord = (position * vec2(1.4, -1.4) + fontposinatlas ) / fontatlassize;" -#else - " texcoord = (position * vec2(1.0, -1.0) + fontposinatlas ) / fontatlassize;" -#endif - " vec2 pos = position - winhalfsize + fontposinwin;" - " pos = pos / winhalfsize;" - " gl_Position = vec4( pos, 0.0, 1.0);" - "}"); - length = strlen(source); - glShaderSource(glsl->font_vshader, 1, (const GLchar**)&source, &length); - glCompileShader(glsl->font_vshader); - free(source); - - glGetShaderiv(glsl->font_vshader, GL_COMPILE_STATUS, &action_ok); - if (!action_ok) { - fprintf(stderr, "Failed to compile font vshader :\n"); - display_log(glsl->font_vshader, glGetShaderiv, glGetShaderInfoLog); - return (1); - } - - glsl->font_fshader = glCreateShader(GL_FRAGMENT_SHADER); - source = strdup("#version 110 \n" - "uniform sampler2D texture;" - "uniform vec4 color;" - "varying vec2 texcoord;" - "void main()" - "{" - " gl_FragColor = color * texture2D(texture, texcoord);" - "}"); - length = strlen(source); - glShaderSource(glsl->font_fshader, 1, (const GLchar**)&source, &length); - glCompileShader(glsl->font_fshader); - free(source); - - glGetShaderiv(glsl->font_fshader, GL_COMPILE_STATUS, &action_ok); - if (!action_ok) { - fprintf(stderr, "Failed to compile font fshader :\n"); - display_log(glsl->font_fshader, glGetShaderiv, glGetShaderInfoLog); - return (1); - } - - glsl->font_program = glCreateProgram(); - glAttachShader(glsl->font_program, glsl->font_vshader); - glAttachShader(glsl->font_program, glsl->font_fshader); - glLinkProgram(glsl->font_program); - - glGetProgramiv(glsl->font_program, GL_LINK_STATUS, &action_ok); - if (!action_ok) { - fprintf(stderr, "Failed to link font shader program:\n"); - display_log(glsl->font_program, glGetProgramiv, glGetProgramInfoLog); - return (1); - } - - glFlush(); - - return (0); -} - - - -int mlx_shaders(glsl_info_t *glsl) -{ - return (mlx_shaders_pixel(glsl) + mlx_shaders_image(glsl) + mlx_shaders_font(glsl)); -} diff --git a/parse_map/mlx/mlx_xpm.c b/parse_map/mlx/mlx_xpm.c deleted file mode 100644 index 78d8c9b..0000000 --- a/parse_map/mlx/mlx_xpm.c +++ /dev/null @@ -1,338 +0,0 @@ -// mlx xpm -// by ol - -#include -#include -#include -#include -#include -#include -#include -#include "mlx_int.h" - -typedef struct s_xpm_col -{ - int name; - int col; -} t_xpm_col; - - -struct s_col_name -{ - char *name; - int color; -}; - -//extern struct s_col_name mlx_col_name[]; -#include "mlx_rgb.c" - - -#define RETURN { if (colors) free(colors); if (tab) free(tab); \ - if (colors_direct) free(colors_direct); \ - if (img) mlx_destroy_image(xvar, img); \ - return ((void *)0); } - - - - -char *mlx_int_get_line(char *ptr,int *pos,int size) -{ - int pos2; - int pos3; - int pos4; - - if ((pos2 = mlx_int_str_str(ptr+*pos,"\"",size-*pos))==-1) - return ((char *)0); - if ((pos3 = mlx_int_str_str(ptr+*pos+pos2+1,"\"",size-*pos-pos2-1))==-1) - return ((char *)0); - *(ptr+*pos+pos2) = 0; - *(ptr+*pos+pos2+1+pos3) = 0; - pos4 = *pos+pos2+1; - *pos += pos2+pos3+2; - return (ptr+pos4); -} - - - -char *mlx_int_static_line(char **xpm_data,int *pos,int size) -{ - static char *copy = 0; - static int len = 0; - int len2; - char *str; - - str = xpm_data[(*pos)++]; - if ((len2 = strlen(str))>len) - { - if (copy) - free(copy); - if (!(copy = malloc(len2+1))) - return ((char *)0); - len = len2; - } - /* strcpy(copy,str); */ - strlcpy(copy, str, len2+1); - return (copy); -} - - -int mlx_int_get_col_name(char *str,int size) -{ - int result; - - result = 0; - while (size--) - result = (result<<8)+*(str++); - return (result); -} - -int mlx_int_get_text_rgb(char *name, char *end) -{ - int i; - char buff[64]; - - if (*name == '#') - return (strtol(name+1,0,16)); - if (end) - { - snprintf(buff, 64, "%s %s", name, end); - name = buff; - } - i = 0; - while (mlx_col_name[i].name) - { - if (!strcasecmp(mlx_col_name[i].name, name)) - return (mlx_col_name[i].color); - i ++; - } - return (0); -} - - -void mlx_int_xpm_set_pixel(mlx_img_list_t *img, char *data, int opp, int col, int x) -{ - /* - int dec; - - dec = opp; - while (dec--) - { - if (img->image->byte_order) - *(data+x*opp+dec) = col&0xFF; - else - *(data+x*opp+opp-dec-1) = col&0xFF; - col >>= 8; - } - */ - // opp is 4, do it the simple way - *((unsigned int *)(data+4*x)) = col; -} - - -void *mlx_int_parse_xpm(mlx_ptr_t *xvar,void *info,int info_size,char *(*f)()) -{ - int pos; - char *line; - char **tab; - char *data; - char *clip_data; - int nc; - int opp; - int cpp; - int col; - int rgb_col; - int col_name; - int method; - int x; - int i; - int j; - mlx_img_list_t *img; - t_xpm_col *colors; - int *colors_direct; - int width; - int height; - - colors = 0; - colors_direct = 0; - img = 0; - tab = 0; - pos = 0; - if (!(line = f(info,&pos,info_size)) || - !(tab = mlx_int_str_to_wordtab(line)) || !(width = atoi(tab[0])) || - !(height = atoi(tab[1])) || !(nc = atoi(tab[2])) || - !(cpp = atoi(tab[3])) ) - RETURN; - free(tab); - tab = 0; - - method = 0; - if (cpp<=2) - { - method = 1; - if (!(colors_direct = malloc((cpp==2?65536:256)*sizeof(int)))) - RETURN; - } - else - if (!(colors = malloc(nc*sizeof(*colors)))) - RETURN; - - clip_data = 0; - - i = nc; - while (i--) - { - if (!(line = f(info,&pos,info_size)) || - !(tab = mlx_int_str_to_wordtab(line+cpp)) ) - RETURN; - j = 0; - while (tab[j] && strcmp(tab[j++],"c")); - - if (!tab[j]) - RETURN; - - rgb_col = mlx_int_get_text_rgb(tab[j], tab[j+1]); - /* - if ((rgb_col = mlx_int_get_text_rgb(tab[j], tab[j+1]))==-1) - { - if (!(clip_data = malloc(4*width*height)) || // ok, nice size .. - !(clip_img = XCreateImage(xvar->display, xvar->visual, - 1, XYPixmap, 0, clip_data, - width, height, 8, (width+7)/8)) ) - RETURN; - memset(clip_data, 0xFF, 4*width*height); - } - */ - if (method) - colors_direct[mlx_int_get_col_name(line,cpp)] = rgb_col; - // rgb_col>=0?mlx_get_color_value(xvar, rgb_col):rgb_col; - else - { - colors[i].name = mlx_int_get_col_name(line,cpp); - colors[i].col = rgb_col; // rgb_col>=0?mlx_get_color_value(xvar,rgb_col):rgb_col; - } - free(tab); - tab = 0; - } - - if (!(img = mlx_new_image(xvar,width,height))) - RETURN; - //opp = img->bpp/8; - opp = 4; - - - i = height; - data = img->buffer; - while (i--) - { - if (!(line = f(info,&pos,info_size))) - RETURN; - x = 0; - while (xsize_line; - data += img->width*4; - } - /* - if (clip_data) - { - if (!(clip_pix = XCreatePixmap(xvar->display, xvar->root, - width, height, 1)) ) - RETURN; - img->gc = XCreateGC(xvar->display, clip_pix, 0, &xgcv); - XPutImage(xvar->display, clip_pix, img->gc, clip_img, - 0, 0, 0, 0, width, height); - XFreeGC(xvar->display, img->gc); - xgcv.clip_mask = clip_pix; - xgcv.function = GXcopy; - xgcv.plane_mask = AllPlanes; - img->gc = XCreateGC(xvar->display, xvar->root, GCClipMask|GCFunction| - GCPlaneMask, &xgcv); - XSync(xvar->display, False); - XDestroyImage(clip_img); - } - */ - if (colors) - free(colors); - if (colors_direct) - free(colors_direct); - return (img); -} - - -void mlx_int_file_get_rid_comment(char *ptr, int size) -{ - int com_begin; - int com_end; - - while ((com_begin = mlx_int_str_str_cote(ptr,"/*",size))!=-1) - { - com_end = mlx_int_str_str(ptr+com_begin+2,"*/",size-com_begin-2); - memset(ptr+com_begin,' ',com_end+4); - } - while ((com_begin = mlx_int_str_str_cote(ptr,"//",size))!=-1) - { - com_end = mlx_int_str_str(ptr+com_begin+2,"\n",size-com_begin-2); - memset(ptr+com_begin,' ',com_end+3); - } -} - - -void *mlx_xpm_file_to_image(mlx_ptr_t *xvar,char *file,int *width,int *height) -{ - int fd; - int size; - char *ptr; - mlx_img_list_t *img; - - if ((fd = open(file,O_RDONLY))==-1 || (size = lseek(fd,0,SEEK_END))==-1 || - (ptr = mmap(0,size,PROT_WRITE|PROT_READ,MAP_PRIVATE,fd,0))== - (void *)MAP_FAILED) - { - if (fd>=0) - close(fd); - return ((void *)0); - } - mlx_int_file_get_rid_comment(ptr, size); - if ((img = mlx_int_parse_xpm(xvar,ptr,size,mlx_int_get_line))) - { - *width = img->width; - *height = img->height; - } - munmap(ptr,size); - close(fd); - return (img); -} - -void *mlx_xpm_to_image(mlx_ptr_t *xvar,char **xpm_data,int *width,int *height) -{ - mlx_img_list_t *img; - - if ((img = mlx_int_parse_xpm(xvar,xpm_data,0,mlx_int_static_line))) - { - *width = img->width; - *height = img->height; - } - return (img); -} diff --git a/parse_map/textures/barrel.xpm b/textures/barrel.xpm similarity index 100% rename from parse_map/textures/barrel.xpm rename to textures/barrel.xpm diff --git a/parse_map/textures/bluestone.xpm b/textures/bluestone.xpm similarity index 100% rename from parse_map/textures/bluestone.xpm rename to textures/bluestone.xpm diff --git a/parse_map/textures/colorstone.xpm b/textures/colorstone.xpm similarity index 100% rename from parse_map/textures/colorstone.xpm rename to textures/colorstone.xpm diff --git a/parse_map/textures/eagle.xpm b/textures/eagle.xpm similarity index 100% rename from parse_map/textures/eagle.xpm rename to textures/eagle.xpm diff --git a/parse_map/textures/greenlight.xpm b/textures/greenlight.xpm similarity index 100% rename from parse_map/textures/greenlight.xpm rename to textures/greenlight.xpm diff --git a/parse_map/textures/greystone.xpm b/textures/greystone.xpm similarity index 100% rename from parse_map/textures/greystone.xpm rename to textures/greystone.xpm diff --git a/parse_map/textures/mossy.xpm b/textures/mossy.xpm similarity index 100% rename from parse_map/textures/mossy.xpm rename to textures/mossy.xpm diff --git a/parse_map/textures/pillar.xpm b/textures/pillar.xpm similarity index 100% rename from parse_map/textures/pillar.xpm rename to textures/pillar.xpm diff --git a/parse_map/textures/purplestone.xpm b/textures/purplestone.xpm similarity index 100% rename from parse_map/textures/purplestone.xpm rename to textures/purplestone.xpm diff --git a/parse_map/textures/redbrick.xpm b/textures/redbrick.xpm similarity index 100% rename from parse_map/textures/redbrick.xpm rename to textures/redbrick.xpm diff --git a/parse_map/textures/wood.xpm b/textures/wood.xpm similarity index 100% rename from parse_map/textures/wood.xpm rename to textures/wood.xpm From 4e9fba7c26e11761cd24e9a5c6757cde201270e1 Mon Sep 17 00:00:00 2001 From: Ko-HyeJi Date: Wed, 21 Dec 2022 21:56:23 +0900 Subject: [PATCH 4/5] [delete] gnl file --- jk/cub3D | Bin 194672 -> 0 bytes jk/get_next_line.c | 97 ---------------------------------------- jk/get_next_line_util.c | 83 ---------------------------------- 3 files changed, 180 deletions(-) delete mode 100755 jk/cub3D delete mode 100644 jk/get_next_line.c delete mode 100644 jk/get_next_line_util.c diff --git a/jk/cub3D b/jk/cub3D deleted file mode 100755 index 9aac2510ae9756464e72b260e51901473b6ef118..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194672 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 0) - dst[i] = 0; - return (ft_strlen(src)); -} - -size_t ft_strlcat(char *dst, const char *src, size_t dstsize) -{ - size_t len; - size_t i; - - len = ft_strlen(dst); - if (dstsize >= len + 1) - { - i = 0; - while (src[i] && i < dstsize - 1 - len) - { - dst[len + i] = src[i]; - i++; - } - dst[len + i] = 0; - return (ft_strlen(src) + len); - } - return (ft_strlen(src) + dstsize); -} - -char *ft_strjoin(const char *s1, const char *s2) -{ - char *newstr; - int s1_len; - int s2_len; - - s1_len = ft_strlen(s1); - s2_len = ft_strlen(s2); - newstr = (char *)malloc(sizeof(char) * (s1_len + s2_len + 1)); - if (newstr == NULL) - return (NULL); - ft_strlcpy(newstr, s1, s1_len + 1); - ft_strlcat(newstr + (s1_len), s2, s2_len + 1); - free ((char *)s1); - return (newstr); -} From 34f642e17a926dcd1882b4680bb48d4a8145439d Mon Sep 17 00:00:00 2001 From: Ko-HyeJi Date: Wed, 21 Dec 2022 22:11:03 +0900 Subject: [PATCH 5/5] reset --- .DS_Store | Bin 6148 -> 6148 bytes jk/3d_render.c | 27 +++++++++++++++++--- jk/cub3d.h | 51 +++++++++++++++++++------------------- jk/draw_ray.c | 42 ++++++++++++++----------------- jk/main.c | 57 +++++++++++++++++++++++++++++++++++++++--- jk/map3.cub | 4 +++ jk/map_parse.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++ jk/minimap.c | 29 +++++++--------------- jk/playeronmap.c | 20 ++++++--------- map/map2.cub | 4 +-- 10 files changed, 207 insertions(+), 90 deletions(-) create mode 100644 jk/map3.cub create mode 100644 jk/map_parse.c diff --git a/.DS_Store b/.DS_Store index 02702df71eaeb3322ee1205c5cabd0932912bfdd..282b13ffd2d877bd2ee128bb4681740099e765c8 100644 GIT binary patch delta 333 zcmZoMXfc=|#>B!ku~2NHo+2ar#(>?7iwl^U7}+=TF!?a5GcjZ_WS0dO<>ln(r86)v zFaj|%LoP!iLqSq`aY0f}eiBgR+hjAQxe^HtKqdnNCkJP|fMj*Gp^1s5j)Iwq;pA6L z@=S-1Oy*{m&pZlL0M(CXDknn$(9|M^VunD(M4vW6J| DI;l%d delta 73 zcmZoMXfc=|#>B)qu~2NHo+2aD#(>?7lMO^zHuJN1GESb&p0injgPmn!gUx1k4t@@x b!p(vl-img.data[WINDOW_WID * y + x] = 0; + x++; + } + y++; + } +} + void draw_ceiling(t_all *p_all, int ray_num, int wall_top_pixel, int color) { int x; @@ -11,7 +30,7 @@ void draw_ceiling(t_all *p_all, int ray_num, int wall_top_pixel, int color) x = 0; while (x < WALL_STRIP_WIDTH) { - if (p_all->img.data[WINDOW_WID * y + (x + ray_num * WALL_STRIP_WIDTH)] == PINK) + if (!p_all->img.data[WINDOW_WID * y + (x + ray_num * WALL_STRIP_WIDTH)]) p_all->img.data[WINDOW_WID * y + (x + ray_num * WALL_STRIP_WIDTH)] = color; x++; } @@ -30,7 +49,7 @@ void draw_floor(t_all *p_all, int ray_num, int wall_bottom_pixel, int color) x = 0; while (x < WALL_STRIP_WIDTH) { - if (p_all->img.data[WINDOW_WID * y + (x + ray_num * WALL_STRIP_WIDTH)] == PINK) + if (!p_all->img.data[WINDOW_WID * y + (x + ray_num * WALL_STRIP_WIDTH)]) p_all->img.data[WINDOW_WID * y + (x + ray_num * WALL_STRIP_WIDTH)] = color; x++; } @@ -78,7 +97,7 @@ void render_3d_wall(t_all *p_all, int ray_num) x = 0; while (x < WALL_STRIP_WIDTH) { - if (p_all->img.data[WINDOW_WID * y + (x + ray_num * WALL_STRIP_WIDTH)] == PINK) + if (!p_all->img.data[WINDOW_WID * y + (x + ray_num * WALL_STRIP_WIDTH)]) p_all->img.data[WINDOW_WID * y + (x + ray_num * WALL_STRIP_WIDTH)] = color; //현재위치픽셀 색이 초기설정색이면 색을 덧입히기 x++; @@ -89,4 +108,4 @@ void render_3d_wall(t_all *p_all, int ray_num) draw_floor(p_all, ray_num, wall_bottom_pixel, GROUND); }//ray_num의 순번을 잘 넘겨주기 위해 draw_ray() 수정함 //화면~player 거리 -//y축 기준으로 wall_top_pixel~wall_bottom_pixel 그려줌. \ No newline at end of file +//y축 기준으로 wall_top_pixel~wall_bottom_pixel 그려줌. diff --git a/jk/cub3d.h b/jk/cub3d.h index 4ed1aef..d3c72ae 100644 --- a/jk/cub3d.h +++ b/jk/cub3d.h @@ -15,12 +15,6 @@ #include #include -typedef struct s_mlx -{ - void *mlx; - void *win; -} t_mlx; - typedef struct s_img { void *img; @@ -34,10 +28,10 @@ typedef struct s_player { double x; double y; - double rotation_angle;//바라보는각도. 시야각도 - double walk_speed;//움직이는 속도 - double turn_speed;//바라보는 각도의 조정속도 - double updown_sight;//변수명 변경 + double rotation_angle; + double walk_speed; + double turn_speed; + double updown_sight; } t_player; typedef struct s_key @@ -48,7 +42,7 @@ typedef struct s_key bool right; bool right_rotation; bool left_rotation; - int updown_sight;//변수명 변경 + int updown_sight; } t_key; typedef struct s_temp_ray @@ -61,9 +55,7 @@ typedef struct s_temp_ray double xhit_wall; double yhit_wall; double distance; -} t_temp_ray;//변수명 다시 -//일회용. -//변수들은 광선 한개 그릴때만 유효함 +} t_temp_ray; typedef struct s_ray { @@ -76,9 +68,7 @@ typedef struct s_ray bool ray_faces_up; bool ray_faces_right; bool ray_faces_left; -} t_ray;//변수명 다시 -//광선이 벽과 만나는 좌표와 -//광선의 방향적인 요소를 가지고있다 +} t_ray; typedef struct s_map { @@ -121,17 +111,20 @@ typedef enum e_type typedef struct s_all { - t_mlx mlx; t_img img; t_player player; t_key key; t_ray ray; t_map map; +<<<<<<< HEAD t_map_info map_info; +======= + void *mlx; + void *win; +>>>>>>> f993e28f07096fbc40e69ec85ebc737183d1b81e } t_all; #define MINI_SCALE 0.25 -#define TILE_SIZE 80 #define WINDOW_WID 640 #define WINDOW_HEI 480 @@ -143,17 +136,18 @@ typedef struct s_all #define PI (3.14159265358979323846264338327950288) #define TWO_PI (6.28318530717958647692528676655900576) #define HALF_PI (1.57079632679489661923132169163975144) -#define RAY_RANGE (PI / 3.0) // player 시야범위. 무난하게 60도 -#define RAY_COUNT 121 // 광선의 갯수. 2보다 커야하고 홀수 추천 +// #define RAY_COUNT 121 +#define RAY_COUNT WINDOW_WID // #define BUFFER_SIZE 333 #define FOV_ANGLE 60 * (PI / 180.0) -#define WALL_STRIP_WIDTH WINDOW_WID / RAY_COUNT +// #define WALL_STRIP_WIDTH (WINDOW_WID / RAY_COUNT) +#define WALL_STRIP_WIDTH 1 #define BLUE 0x0000FF #define WHITE 0xFFFFFF #define GREY 0xAAAAAA -#define BLACK 0x000000 +#define BLACK 0x000001 //초기화 값과 구분하기 위해 블루 한방울...(hyko) #define PINK 0xFF00FF #define RED 0xFF0000 @@ -168,8 +162,7 @@ void update_player(t_all *p_all); void fill_square(t_all *p_all, int x, int y, int color); void render_map(t_all *p_all); void draw_player(t_all *p_all); -int ft_loop(t_all *p_all);//이름 수정할거임 -void render_player(t_all *p_all); +int ft_loop(t_all *p_all); int key_release(int keycode, t_all *p_all); void ray_init(t_ray *p_ray, double ang); @@ -206,9 +199,17 @@ void render_3d(t_all *p_all); void draw_ceiling(t_all *p_all, int ray_num, int wall_top_pixel, int color); void draw_floor(t_all *p_all, int ray_num, int wall_bottom_pixel, int color); +<<<<<<< HEAD void parse_map(int argc, char** argv, t_all* all); void is_cub_file(const char* filename); void check_type(char* line, t_all *all); void display_err_msg_and_exit(const char* err_msg); +======= +void init_mlx(t_all *p_all); +void init_key(t_all *p_all); +void ft_init(t_all *p_all); +void loop_hook(t_all *p_all); +void init_img_data(t_all* p_all); +>>>>>>> f993e28f07096fbc40e69ec85ebc737183d1b81e #endif diff --git a/jk/draw_ray.c b/jk/draw_ray.c index f74139e..69049dd 100644 --- a/jk/draw_ray.c +++ b/jk/draw_ray.c @@ -28,7 +28,7 @@ void ray_init(t_ray *p_ray, double ang) p_ray->ray_faces_up = !(p_ray->ray_faces_down); p_ray->ray_faces_right = p_ray->ray_angle < 0.5 * PI || p_ray->ray_angle > 1.5 * PI; p_ray->ray_faces_left = !(p_ray->ray_faces_right); -}//t_ray 구조체 초기화 +} void calc_distance(t_all *p_all, t_temp_ray *hv) { @@ -36,10 +36,8 @@ void calc_distance(t_all *p_all, t_temp_ray *hv) hv->distance = distance_btw_points(p_all->player.x, p_all->player.y , hv->xhit_wall, hv->yhit_wall); else - hv->distance = __DBL_MAX__;//써두되나... + hv->distance = __DBL_MAX__; } -//벽 찾았으면 거리 계산함 -//못찾았으면 double 자료형 최대값 지정.(수평경계좌표와 수직경계좌표를 비교할때 항상 선택받지 못하도록 하기 위해) double distance_btw_points(double xa, double ya, double xb, double yb) { @@ -71,21 +69,19 @@ void calc_ray(t_all *p_all, t_temp_ray *hv) } } calc_distance(p_all, hv); -}//실질적으로 벽 위치 찾는다 -//calc_horz_ray(), calc_vert_ray()에서 intercept, step이 정해지고, -//여기선 그 값들을 이용해서 계산한다 -//calc_distance()는 거리를 계산해준다 +} + void calc_horz_ray(t_all *p_all, t_temp_ray *p_horz) { p_horz->found_wallHit = false; p_horz->xhit_wall = 0; p_horz->yhit_wall = 0; - p_horz->yintercept = floor(p_all->player.y / p_all->map.row_tile_size) * p_all->map.row_tile_size;// + p_horz->yintercept = floor(p_all->player.y / p_all->map.row_tile_size) * p_all->map.row_tile_size; if (p_all->ray.ray_faces_down) p_horz->yintercept += p_all->map.row_tile_size; else - p_horz->yintercept += 0; + ; p_horz->xintercept = p_all->player.x + (p_horz->yintercept - p_all->player.y) / tan(p_all->ray.ray_angle); @@ -96,7 +92,7 @@ void calc_horz_ray(t_all *p_all, t_temp_ray *p_horz) else p_horz->ystep *= 1; - p_horz->xstep = p_all->map.col_tile_size / tan(p_all->ray.ray_angle); + p_horz->xstep = p_all->map.row_tile_size / tan(p_all->ray.ray_angle); if (p_all->ray.ray_faces_left && p_horz->xstep > 0) p_horz->xstep *= -1; else @@ -107,7 +103,7 @@ void calc_horz_ray(t_all *p_all, t_temp_ray *p_horz) p_horz->xstep *= 1; calc_ray(p_all, p_horz); -}//수평 계산 +} void calc_vert_ray(t_all *p_all, t_temp_ray *p_vert) { @@ -119,7 +115,7 @@ void calc_vert_ray(t_all *p_all, t_temp_ray *p_vert) if (p_all->ray.ray_faces_right) p_vert->xintercept += p_all->map.col_tile_size; else - p_vert->xintercept += 0; + ; p_vert->yintercept = p_all->player.y + (p_vert->xintercept - p_all->player.x) * tan(p_all->ray.ray_angle); @@ -130,7 +126,7 @@ void calc_vert_ray(t_all *p_all, t_temp_ray *p_vert) else p_vert->xstep *= 1; - p_vert->ystep = p_all->map.row_tile_size * tan(p_all->ray.ray_angle); + p_vert->ystep = p_all->map.col_tile_size * tan(p_all->ray.ray_angle); if (p_all->ray.ray_faces_up && p_vert->ystep > 0) p_vert->ystep *= -1; else @@ -172,17 +168,17 @@ void draw_line(t_all *p_all, double dx, double dy) { set_point(&p1, ray_x, ray_y); set_point(&p2, ray_x + dx, ray_y + dy); - if (!hit_wall(ray_x + dx, ray_y + dy, p_all)) + if (!hit_wall(p2.x, p2.y, p_all)) { locate_for_mini(&x, &y, p1, p_all); p_all->img.data[WINDOW_WID * y + x] = RED; } else break; - ray_y += dy; ray_x += dx; + ray_y += dy; } -} +}//여기랑 calc_ray 겹치는부분이 있는것같아서, 되면 합치는거어떨까? void draw_one_ray(t_all *p_all, double ang, int i) { @@ -210,7 +206,6 @@ void draw_one_ray(t_all *p_all, double ang, int i) draw_line(p_all, p_all->ray.xhit_wall - p_all->player.x, p_all->ray.yhit_wall - p_all->player.y); render_3d_wall(p_all, i); } -//각각 광선에 대한 정보는 이 함수에 와서야 결정된다. void draw_ray(t_all *p_all) { @@ -218,15 +213,14 @@ void draw_ray(t_all *p_all) double max_angle; int i; - angle = p_all->player.rotation_angle - (RAY_RANGE / 2.0); - max_angle = p_all->player.rotation_angle + (RAY_RANGE / 2.0); - i = 0; + angle = p_all->player.rotation_angle - (FOV_ANGLE / 2.0); + max_angle = p_all->player.rotation_angle + (FOV_ANGLE / 2.0); + i = 0; while (i < RAY_COUNT) { draw_one_ray(p_all, angle, i); - angle += RAY_RANGE / RAY_COUNT; + angle += FOV_ANGLE / RAY_COUNT; i++; } -} -//원래 광선 동시에 2개 그렸는데, 왼쪽부터 하나씩 그려주는걸로 수정 \ No newline at end of file +} \ No newline at end of file diff --git a/jk/main.c b/jk/main.c index 72bf0a6..cd9b3fb 100644 --- a/jk/main.c +++ b/jk/main.c @@ -2,19 +2,65 @@ int ft_loop(t_all *p_all)//이름 수정할거임 { +<<<<<<< HEAD printf("[debug: stop here]\n"); update_player(p_all); +======= + update_player(p_all);//later +>>>>>>> f993e28f07096fbc40e69ec85ebc737183d1b81e render_map(p_all); - render_player(p_all); - draw_ray(p_all); - mlx_put_image_to_window(p_all->mlx.mlx, p_all->mlx.win, p_all->img.img, 0, 0); + // render_player(p_all); + draw_player(p_all); + // draw_ray(p_all);여기에 없어도 될것같은딩..? + mlx_put_image_to_window(p_all->mlx, p_all->win, p_all->img.img, 0, 0); return (0); } +void init_mlx(t_all *p_all) +{ + p_all->mlx = mlx_init();//디스플레이와 내 프로그램을 연결 시켜주고, + p_all->win = mlx_new_window(p_all->mlx, WINDOW_WID, WINDOW_HEI, "title");//새로운 창 화면에 만들고 + p_all->img.img = mlx_new_image(p_all->mlx, WINDOW_WID, WINDOW_HEI);//지정한 가로 세로로 만들어진 직사각형을 보이지 않는 공간에 그려두고(메모리에 새 이미지 만들고), + p_all->img.data = (int *)mlx_get_data_addr(p_all->img.img, &(p_all->img.bpp), + &(p_all->img.size_line), &(p_all->img.endian)); + //생성된 이미지에 대한 정보 반환해서, 나중에 user가 이 정보 수정할수있음 +} + +void init_key(t_all *p_all) +{ + p_all->key.up = false; + p_all->key.down = false; + p_all->key.left = false; + p_all->key.right = false; + p_all->key.left_rotation = false; + p_all->key.right_rotation = false; + p_all->key.updown_sight = false; +} + +void ft_init(t_all *p_all) +{ + init_player(p_all);//player 구조체 초기화시키고, + init_key(p_all);//key " + init_mlx(p_all);//mlx 사용하기 위한 초기 세팅해주고 +} + +void loop_hook(t_all *p_all) +{ + mlx_hook(p_all->win, X_EVENT_KEY_PRESS, 0, &key_press, p_all);//키 누를때 + //mlx상 모든 이벤트가 발생할때 hook 한다. + //키보드입력이나 마우스클릭을 프로그램에 도달하기전 가로채서 다른 역할하게끔한다. + mlx_hook(p_all->win, X_EVENT_KEY_RELEASE, 0, &key_release, p_all);//키 떼고있을때 + mlx_loop_hook(p_all->mlx, &ft_loop, p_all);//ft_loop()를 계속 돌린다 + //등록된 이벤트가 발생하지 않을 경우, 두번째 함수 호출함 + mlx_loop(p_all->mlx);//이벤트를 받고, 이벤트를 관리함. + //무한 루프를 돈다. +} + int main(int argc, char **argv) { t_all s_all; +<<<<<<< HEAD init_player(&s_all); s_all.mlx.mlx = mlx_init(); @@ -28,6 +74,11 @@ int main(int argc, char **argv) mlx_hook(s_all.mlx.win, X_EVENT_KEY_RELEASE, 0, &key_release, &s_all); mlx_loop_hook(s_all.mlx.mlx, &ft_loop, &s_all); mlx_loop(s_all.mlx.mlx); +======= + init_map(argv[1], &s_all);//필요시 argv[1] t_all에 넣기 + ft_init(&s_all); + loop_hook(&s_all); +>>>>>>> f993e28f07096fbc40e69ec85ebc737183d1b81e return (0); } diff --git a/jk/map3.cub b/jk/map3.cub new file mode 100644 index 0000000..cfed194 --- /dev/null +++ b/jk/map3.cub @@ -0,0 +1,4 @@ +1111 +1001 +1001 +1111 \ No newline at end of file diff --git a/jk/map_parse.c b/jk/map_parse.c new file mode 100644 index 0000000..06ff79e --- /dev/null +++ b/jk/map_parse.c @@ -0,0 +1,63 @@ +#include "cub3d.h" + +void get_row_col(char *argv, t_all *p_all) +{ + char *str; + + p_all->map.row = 0; + p_all->map.col = 0; + int fd; + fd = open(argv, O_RDONLY); + if (fd == -1) + { + printf("%s\n", strerror(errno)); + exit (0);//값 수정 + } + str = "temp"; + while (str) + { + str = get_next_line(fd); + free(str); + if (str) + p_all->map.col = ft_strlen(str); + p_all->map.row++; + } + p_all->map.row--; + free(str); + close(fd); +} + +void get_map(char *argv, t_all *p_all) +{ + get_row_col(argv, p_all);//맵의 행렬 크기 가져오고, + int fd; + fd = open(argv, O_RDONLY); + if (fd == -1) + { + printf("%s\n", strerror(errno)); + exit (0);//값 수정 + } + p_all->map.dp_map = malloc((p_all->map.row + 1) * sizeof(char *)); + if (p_all->map.dp_map == NULL) + { + printf("%s\n", strerror(errno)); + exit (0);//값 수정 + } + unsigned long long ull; + + ull = 0; + while (ull < p_all->map.row) + { + p_all->map.dp_map[ull] = get_next_line(fd); + ull++; + } + p_all->map.dp_map[ull] = NULL; + close(fd); +} + +void init_map(char *argv, t_all *p_all) +{ + get_map(argv, p_all);//맵 이중포인터에 넣어주고, + p_all->map.row_tile_size = WINDOW_HEI / p_all->map.row;//타일 사이즈 설정해주고 + p_all->map.col_tile_size = WINDOW_WID / p_all->map.col; +} diff --git a/jk/minimap.c b/jk/minimap.c index 57ad851..b284821 100644 --- a/jk/minimap.c +++ b/jk/minimap.c @@ -1,11 +1,11 @@ #include "cub3d.h" -// void locate_for_mini(int *xp, int *yp, int x, int y, t_all *p_all) void locate_for_mini(int *xp, int *yp, t_point p, t_all *p_all) { *xp = (int)((1 - MINI_SCALE) * p_all->map.col_tile_size * p_all->map.col + MINI_SCALE * p.x); *yp = (int)((1 - MINI_SCALE) * p_all->map.row_tile_size * p_all->map.row + MINI_SCALE * p.y); -} +}//화면 맨 아래, 맨 오른쪽에 위치할수있게설정. + void fill_square(t_all *p_all, int x, int y, int color) { int j; @@ -24,39 +24,28 @@ void fill_square(t_all *p_all, int x, int y, int color) j++; } k++; - } + }//타일 하나 그림 } void render_map(t_all *p_all) { unsigned long long j; unsigned long long k; - int x; - int y; + //미니맵과, 3d 동시에 그려주기. - y = 0; - while (y < WINDOW_HEI) - { - x = 0; - while (x < WINDOW_WID) - { - p_all->img.data[WINDOW_WID * y + x] = PINK; - x++; - } - y++; - } + init_img_data(p_all); k = 0; - while (k < p_all->map.row) + while (k < p_all->map.row)//미니맵 그리기 { j = 0; while (j < p_all->map.col) { if (p_all->map.dp_map[k][j] == '1') - fill_square(p_all, (int)(p_all->map.col_tile_size * j), (int)(p_all->map.row_tile_size * k), 0x000000); + fill_square(p_all, (int)(p_all->map.col_tile_size * j), (int)(p_all->map.row_tile_size * k), BLACK); else - fill_square(p_all, (int)(p_all->map.col_tile_size * j), (int)(p_all->map.row_tile_size * k), 0xffffff); + fill_square(p_all, (int)(p_all->map.col_tile_size * j), (int)(p_all->map.row_tile_size * k), WHITE); j++; } k++; } -} \ No newline at end of file +} diff --git a/jk/playeronmap.c b/jk/playeronmap.c index 81ca24a..2d8a869 100644 --- a/jk/playeronmap.c +++ b/jk/playeronmap.c @@ -4,7 +4,8 @@ void init_player(t_all *p_all) { p_all->player.x = WINDOW_WID / 2; p_all->player.y = WINDOW_HEI / 2; - p_all->player.rotation_angle = PI / 2;//? + p_all->player.rotation_angle = 0;// 오른쪽을 봄 + // p_all->player.rotation_angle = PI / 2 + PI;// 삐딱한거 보정해야함. 어안보정 문제일수도..? p_all->player.walk_speed = 1; p_all->player.turn_speed = 2 * (PI / 180);//? p_all->player.updown_sight = 0; @@ -15,7 +16,7 @@ bool hit_wall(double x, double y, t_all *p_all) int ix; int iy; - if (x < 0 || x > WINDOW_WID || y < 0 || y > WINDOW_HEI) + if (x < 0 || x > WINDOW_WID || y < 0 || y > WINDOW_HEI)//포함시키는게 맞지않나..? { return (true); } @@ -80,9 +81,9 @@ void draw_player(t_all *p_all) int y; t_point p; - set_point(&p, p_all->player.x, p_all->player.y); - locate_for_mini(&x, &y, p, p_all); - update_player(p_all); + set_point(&p, p_all->player.x, p_all->player.y);//t_point구조체 값 대입 + locate_for_mini(&x, &y, p, p_all);//화면 맨 오른쪽 맨 아래에 위치하게, + update_player(p_all);//있어야 더 스무스하게 움직임 int row; row = (-(MINI_SCALE * p_all->map.row_tile_size) / 10); while (row <= (MINI_SCALE * p_all->map.row_tile_size / 10)) @@ -95,11 +96,6 @@ void draw_player(t_all *p_all) col++; } row++; - } - draw_ray(p_all); -} - -void render_player(t_all *p_all) -{ - draw_player(p_all); + }//플레이어그려주고 + draw_ray(p_all);//있어야 광선 좀 풍부함 } \ No newline at end of file diff --git a/map/map2.cub b/map/map2.cub index b3b9005..5d09701 100644 --- a/map/map2.cub +++ b/map/map2.cub @@ -2,8 +2,8 @@ 10001000000000001001 10001000000000001001 10011011101010111001 -10000000100000000001 -10000000100000001001 +10P00000100000000001 +1000000100000001001 10000000100000001001 10001000100000001001 10001000000001111001