From 20fc4662a7f4fe2ef3a8d72dcd7e00c32ce95273 Mon Sep 17 00:00:00 2001 From: Louise P Date: Thu, 11 Apr 2019 19:35:07 +0200 Subject: [PATCH 01/71] Working in progress: base64. Create parsing opts for alg base64 !! --- .gitignore | 2 + Makefile | 3 +- includes/constant.h | 21 ++++++-- includes/define.h | 4 +- includes/enum.h | 4 +- includes/functions.h | 10 ++-- includes/hash/md5.h | 3 +- includes/structure.h | 13 +++-- libft/Makefile | 3 +- libft/include/libft.h | 5 +- libft/srcs/ft_memput.c | 19 ++++++++ srcs/base64/base64_parsing.c | 95 ++++++++++++++++++++++++++++++++++++ srcs/hash/hash.c | 5 +- srcs/hash/hash_parsing.c | 16 +++--- srcs/lst_opt.c | 16 +++--- srcs/main.c | 9 ++-- 16 files changed, 184 insertions(+), 44 deletions(-) create mode 100644 libft/srcs/ft_memput.c create mode 100644 srcs/base64/base64_parsing.c diff --git a/.gitignore b/.gitignore index c6127b3..d583e21 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,5 @@ modules.order Module.symvers Mkfile.old dkms.conf + +ft_ssl diff --git a/Makefile b/Makefile index 162c62e..f96ef2e 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/03/15 11:20:25 by cpieri #+# #+# # -# Updated: 2019/04/11 16:35:38 by cpieri ### ########.fr # +# Updated: 2019/04/11 17:33:18 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -52,6 +52,7 @@ SRC_NAME= main.c \ hash/sha256/sha256_utils.c \ hash/md5/md5_utils.c \ hash/md5/md5.c \ + base64/base64_parsing.c \ OBJ_NAME= $(SRC_NAME:.c=.o) diff --git a/includes/constant.h b/includes/constant.h index 5710249..a739371 100644 --- a/includes/constant.h +++ b/includes/constant.h @@ -6,28 +6,39 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:15:35 by cpieri #+# #+# */ -/* Updated: 2019/04/11 16:34:37 by cpieri ### ########.fr */ +/* Updated: 2019/04/11 18:11:24 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ -#ifndef CONSTANT_H +#ifndef CONSTANT_H # define CONSTANT_H -static const t_parse g_all_cmd[] = +static const t_parse g_all_cmd[] = { {"md5", "MD5", e_hash, md5, hash_opts, printing_hash, NULL}, {"sha256", "SHA256", e_hash, sha256, hash_opts, printing_hash, NULL}, + {"base64", "base64", e_cipher, NULL, base64_opts, NULL, NULL}, {NULL, NULL, 0, NULL, NULL, NULL, NULL}, }; -static const char * g_hash_cmd[] = +static const t_check_flags g_b64_flags[] = +{ + {'e', e_base64_encode}, + {'d', e_base64_decode}, + {'D', e_base64_decode}, + {'i', e_base64_inputf}, + {'o', e_base64_outputf}, + {0, 0}, +}; + +static const char *g_hash_cmd[] = { "md5", "sha256", NULL }; -static const char * g_cipher_cmd[] = +static const char *g_cipher_cmd[] = { "base64", "des", diff --git a/includes/define.h b/includes/define.h index 18b1a9b..add1d2d 100644 --- a/includes/define.h +++ b/includes/define.h @@ -6,11 +6,11 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:43:16 by cpieri #+# #+# */ -/* Updated: 2019/04/11 12:43:43 by cpieri ### ########.fr */ +/* Updated: 2019/04/11 16:47:55 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ -#ifndef DEFINE_H +#ifndef DEFINE_H # define DEFINE_H # define FAILURE -1 diff --git a/includes/enum.h b/includes/enum.h index 688055f..9c8eb72 100644 --- a/includes/enum.h +++ b/includes/enum.h @@ -6,11 +6,11 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 14:34:08 by cpieri #+# #+# */ -/* Updated: 2019/04/11 16:11:35 by cpieri ### ########.fr */ +/* Updated: 2019/04/11 16:48:10 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ -#ifndef ENUM_H +#ifndef ENUM_H # define ENUM_H enum e_algo diff --git a/includes/functions.h b/includes/functions.h index 3a7df2b..9e8c17e 100644 --- a/includes/functions.h +++ b/includes/functions.h @@ -6,11 +6,11 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:44:05 by cpieri #+# #+# */ -/* Updated: 2019/04/11 16:34:44 by cpieri ### ########.fr */ +/* Updated: 2019/04/11 17:33:45 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ -#ifndef FUNCTIONS_H +#ifndef FUNCTIONS_H # define FUNCTIONS_H /* @@ -18,6 +18,7 @@ */ t_parse parsing(const int ac, char **av); t_opt *hash_opts(const int ac, char **av, t_opt *opts, int now); +t_opt *base64_opts(const int ac, char **av, t_opt *opts, int now); int open_fd(const char *file); t_data *get_data(const int fd, const char *fd_name); t_data *get_file(const int fd, const char *fd_name); @@ -34,7 +35,8 @@ void print_lst(t_opt **lst); ** Functions for Hashing msg and display final hash */ void hashing(t_parse *parse); -void printing_hash(t_data *data, const char *hash_type, t_flags flags); +void printing_hash(t_data *data, const char *hash_type, + t_flags flags); /* ** Functions for Exit, Clean, Error @@ -45,4 +47,4 @@ void print_error(const char *msg_1); void print_usage(const int usage_int, const char *command); void clean_prog(t_parse *parse); -#endif \ No newline at end of file +#endif diff --git a/includes/hash/md5.h b/includes/hash/md5.h index a1e17a8..bf8a212 100644 --- a/includes/hash/md5.h +++ b/includes/hash/md5.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/06 12:16:22 by cpieri #+# #+# */ -/* Updated: 2019/04/11 14:11:08 by cpieri ### ########.fr */ +/* Updated: 2019/04/11 16:49:28 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -41,7 +41,6 @@ static const uint32_t g_k_md5[64] = { 4149444226, 3174756917, 718787259, 3951481745 }; - typedef struct s_md5_utils { uint32_t f; diff --git a/includes/structure.h b/includes/structure.h index fb8bc61..df240f2 100644 --- a/includes/structure.h +++ b/includes/structure.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:27:48 by cpieri #+# #+# */ -/* Updated: 2019/04/11 16:34:57 by cpieri ### ########.fr */ +/* Updated: 2019/04/11 18:49:29 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,16 +22,24 @@ typedef struct s_data t_hash *f_hash; } t_data; +typedef struct s_check_flags +{ + const char c; + const int flag; +} t_check_flags; + typedef struct s_flags { int p; int q; int r; int s; + uint32_t b64_flags; } t_flags; typedef struct s_opt { + const char *fd_output; t_data *data; t_flags flags; struct s_opt *next; @@ -48,5 +56,4 @@ typedef struct s_parse t_opt *lst_opts; } t_parse; - -#endif \ No newline at end of file +#endif diff --git a/libft/Makefile b/libft/Makefile index a344063..bc6a3d8 100644 --- a/libft/Makefile +++ b/libft/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2017/11/07 18:38:31 by tmilon #+# #+# # -# Updated: 2019/04/11 11:16:46 by cpieri ### ########.fr # +# Updated: 2019/04/11 19:13:41 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -42,6 +42,7 @@ SRCS = ft_atoi.c \ ft_isdigit.c \ ft_isprint.c \ ft_itoa.c \ + ft_memput.c \ ft_memalloc.c \ ft_memccpy.c \ ft_memchr.c \ diff --git a/libft/include/libft.h b/libft/include/libft.h index 90ca735..b8985c6 100644 --- a/libft/include/libft.h +++ b/libft/include/libft.h @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* libft.h :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: tmilon +#+ +:+ +#+ */ +/* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/09 16:47:24 by tmilon #+# #+# */ -/* Updated: 2019/03/22 15:27:05 by cpieri ### ########.fr */ +/* Updated: 2019/04/11 19:15:01 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -83,6 +83,7 @@ void *ft_memset(void *b, int c, size_t len); void *ft_memdup(const void *s1, size_t len); void *ft_memjoin(const void *s1, const void *s2, size_t len1, size_t len2); +void ft_memput(void *s, size_t len); void *ftb_backwardmemcpy(void *dst, const void *src, size_t len); void ft_bzero(void *s, size_t n); void ft_lstadd(t_list **alst, t_list *new); diff --git a/libft/srcs/ft_memput.c b/libft/srcs/ft_memput.c new file mode 100644 index 0000000..d37930d --- /dev/null +++ b/libft/srcs/ft_memput.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_memput.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/04/11 19:12:05 by cpieri #+# #+# */ +/* Updated: 2019/04/11 19:13:10 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_memput(void *s, size_t len) +{ + write(1, (char*)s, len); + write(1, "\n", 1); +} \ No newline at end of file diff --git a/srcs/base64/base64_parsing.c b/srcs/base64/base64_parsing.c new file mode 100644 index 0000000..a29d058 --- /dev/null +++ b/srcs/base64/base64_parsing.c @@ -0,0 +1,95 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* base64_parsing.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/04/11 16:56:03 by cpieri #+# #+# */ +/* Updated: 2019/04/11 19:30:10 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_ssl.h" +#include + +static t_opt *check_b64_flags(size_t len, t_flags *flags, char **av, int now) +{ + size_t i; + t_data *data; + t_opt *new; + + i = 0; + new = NULL; + while (++i < len) + { + if (new != NULL) + break ; + if (av[now][i] == 'o') + { + flags->b64_flags |= e_base64_outputf; + if (data == NULL) + { + flags->b64_flags |= e_base64_encode; + data = get_data(0, NULL); + } + new = new_opt(*flags, data); + new->fd_output = av[now + 1]; + return (new); + } + else if (av[now][i] == 'i') + { + flags->b64_flags |= e_base64_inputf; + data = get_file(open_fd(av[now + 1]), av[now + 1]); + now += 2; + } + else if (av[now][i] == 'e') + { + flags->b64_flags |= e_base64_encode; + data = get_data(0, NULL); + } + else if (av[now][i] == 'd' || av[now][i] == 'D') + { + flags->b64_flags |= e_base64_decode; + data = get_data(0, NULL); + } + } + new = new_opt(*flags, data); + return (new); +} + +static t_opt *get_b64_args(char **av, int now) +{ + t_flags flags; + t_opt *new; + size_t len; + + new = NULL; + flags.b64_flags |= e_base64_encode; + if (av[now][0] == '-') + { + len = ft_strlen(av[now]); + new = check_b64_flags(len, &flags, av, now); + } + return (new); +} + +t_opt *base64_opts(const int ac, char **av, t_opt *opts, int now) +{ + t_opt *new; + t_flags flags; + + if (ac < 3) + { + flags.b64_flags |= e_base64_encode; + ft_membits(&(flags.b64_flags), 0, sizeof(uint32_t)); + new = new_opt(flags, get_data(0, NULL)); + } + else + new = get_b64_args(av, now); + add_to_end_lst(new, &opts); + now++; + if (now < ac) + opts = base64_opts(ac, av, opts, now); + return (opts); +} diff --git a/srcs/hash/hash.c b/srcs/hash/hash.c index 4ff6f8e..8ae3588 100644 --- a/srcs/hash/hash.c +++ b/srcs/hash/hash.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/12 13:01:28 by cpieri #+# #+# */ -/* Updated: 2019/04/11 15:10:23 by cpieri ### ########.fr */ +/* Updated: 2019/04/11 16:50:25 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,7 +20,8 @@ void hashing(t_parse *parse) while (lst != NULL) { if (parse->is_ciphash == e_hash) - lst->data->f_hash = (t_hash*)parse->func(lst->data->data, lst->data->len_data); + lst->data->f_hash = (t_hash*)parse->func(lst->data->data, + lst->data->len_data); else if (parse->is_ciphash == e_cipher) parse->func(lst, 0); if (parse->fprint != NULL) diff --git a/srcs/hash/hash_parsing.c b/srcs/hash/hash_parsing.c index 7c978e0..675d517 100644 --- a/srcs/hash/hash_parsing.c +++ b/srcs/hash/hash_parsing.c @@ -3,16 +3,16 @@ /* ::: :::::::: */ /* hash_parsing.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: cpieri +#+ +:+ +#+ */ +/* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/22 14:00:59 by cpieri #+# #+# */ -/* Updated: 2019/03/26 15:41:05 by cpieri ### ########.fr */ +/* Updated: 2019/04/11 18:16:17 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" -static t_opt *check_flags(size_t len, t_flags *flags, char **av, int now) +static t_opt *check_ha_flags(size_t len, t_flags *flags, char **av, int now) { t_opt *new; size_t i; @@ -41,7 +41,7 @@ static t_opt *check_flags(size_t len, t_flags *flags, char **av, int now) return (new); } -static t_opt *get_args(char **av, int now) +static t_opt *get_hash_args(char **av, int now) { t_opt *new; t_flags flags; @@ -50,11 +50,11 @@ static t_opt *get_args(char **av, int now) tmp = NULL; new = NULL; - flags = (t_flags){0, 0, 0, 0}; + flags = (t_flags){0, 0, 0, 0, 0}; if (av[now][0] == '-') { len = ft_strlen(av[now]); - new = check_flags(len, &flags, av, now); + new = check_ha_flags(len, &flags, av, now); if (new == NULL && av[now + 1] == NULL) new = new_opt(flags, get_data(0, NULL)); else if (new == NULL && av[now + 1][0] != '-' && av[now][1] != 'p') @@ -73,9 +73,9 @@ t_opt *hash_opts(const int ac, char **av, t_opt *opts, int now) t_opt *new; if (ac < 3) - new = new_opt((t_flags){0, 0, 0, 0}, get_data(0, NULL)); + new = new_opt((t_flags){0, 0, 0, 0, 0}, get_data(0, NULL)); else - new = get_args(av, now); + new = get_hash_args(av, now); add_to_end_lst(new, &opts); now++; if (now < ac) diff --git a/srcs/lst_opt.c b/srcs/lst_opt.c index f35e12f..33a29a7 100644 --- a/srcs/lst_opt.c +++ b/srcs/lst_opt.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* utils.c :+: :+: :+: */ +/* lst_opt.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: cpieri +#+ +:+ +#+ */ +/* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/08 17:29:55 by cpieri #+# #+# */ -/* Updated: 2019/03/26 15:35:59 by cpieri ### ########.fr */ +/* Updated: 2019/04/11 19:23:33 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,11 +19,10 @@ void print_lst(t_opt **lst) tmp = *lst; while (tmp != NULL) { - ft_putendl(tmp->data->data); - if (tmp->next != NULL) - tmp = tmp->next; - else - break ; + ft_memput(tmp->data->data, tmp->data->len_data); + if (tmp->fd_output != NULL) + ft_putendl(tmp->fd_output); + tmp = tmp->next; } } @@ -53,5 +52,6 @@ t_opt *new_opt(t_flags flags, t_data *data) new->next = NULL; new->data = data; new->flags = flags; + new->fd_output = NULL; return (new); } diff --git a/srcs/main.c b/srcs/main.c index 2d167e1..19da47a 100644 --- a/srcs/main.c +++ b/srcs/main.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* main.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: cpieri +#+ +:+ +#+ */ +/* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/24 17:05:16 by cpieri #+# #+# */ -/* Updated: 2019/03/20 19:52:57 by cpieri ### ########.fr */ +/* Updated: 2019/04/11 19:31:12 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,7 +19,8 @@ int main(int ac, char **av) if (ac < 2) print_usage(1, NULL); parse = parsing(ac, av); - hashing(&parse); - clean_prog(&parse); + print_lst(&(parse.lst_opts)); + // hashing(&parse); + // clean_prog(&parse); return (0); } From 1222434f9ff6afc6c7c380046d25f184b2393266 Mon Sep 17 00:00:00 2001 From: Louise P Date: Fri, 12 Apr 2019 10:52:08 +0200 Subject: [PATCH 02/71] Working in progress: base64 Base64 parsing get args in progress. --- includes/enum.h | 10 ++-- includes/functions.h | 3 +- libft/srcs/ft_memput.c | 4 +- srcs/base64/base64_parsing.c | 109 +++++++++++++++-------------------- srcs/clean.c | 19 +++++- srcs/lst_opt.c | 7 ++- 6 files changed, 78 insertions(+), 74 deletions(-) diff --git a/includes/enum.h b/includes/enum.h index 9c8eb72..bc8f30c 100644 --- a/includes/enum.h +++ b/includes/enum.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 14:34:08 by cpieri #+# #+# */ -/* Updated: 2019/04/11 16:48:10 by cpieri ### ########.fr */ +/* Updated: 2019/04/12 10:47:23 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,10 +21,10 @@ enum e_algo enum e_cipher_flags { - e_base64_encode = 1, - e_base64_decode, - e_base64_inputf, - e_base64_outputf, + e_base64_encode = 0x00000000000000000000000000000001, + e_base64_decode = 0x00000000000000000000000000000010, + e_base64_inputf = 0x00000000000000000000000000000100, + e_base64_outputf = 0x00000000000000000000000000001000, }; #endif \ No newline at end of file diff --git a/includes/functions.h b/includes/functions.h index 9e8c17e..ffe4d43 100644 --- a/includes/functions.h +++ b/includes/functions.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:44:05 by cpieri #+# #+# */ -/* Updated: 2019/04/11 17:33:45 by cpieri ### ########.fr */ +/* Updated: 2019/04/12 10:27:19 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -46,5 +46,6 @@ void exit_error_free(void **to_free); void print_error(const char *msg_1); void print_usage(const int usage_int, const char *command); void clean_prog(t_parse *parse); +void clean_data(t_data **data); #endif diff --git a/libft/srcs/ft_memput.c b/libft/srcs/ft_memput.c index d37930d..714fd37 100644 --- a/libft/srcs/ft_memput.c +++ b/libft/srcs/ft_memput.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 19:12:05 by cpieri #+# #+# */ -/* Updated: 2019/04/11 19:13:10 by cpieri ### ########.fr */ +/* Updated: 2019/04/12 09:49:46 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,5 +15,5 @@ void ft_memput(void *s, size_t len) { write(1, (char*)s, len); - write(1, "\n", 1); + // write(1, "\n", 1); } \ No newline at end of file diff --git a/srcs/base64/base64_parsing.c b/srcs/base64/base64_parsing.c index a29d058..b51c69c 100644 --- a/srcs/base64/base64_parsing.c +++ b/srcs/base64/base64_parsing.c @@ -6,90 +6,73 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 16:56:03 by cpieri #+# #+# */ -/* Updated: 2019/04/11 19:30:10 by cpieri ### ########.fr */ +/* Updated: 2019/04/12 10:50:00 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" #include -static t_opt *check_b64_flags(size_t len, t_flags *flags, char **av, int now) +t_opt *get_base64_args(const int ac, char **av, int now) { - size_t i; - t_data *data; t_opt *new; + t_flags flags; + t_data *data; + size_t len_now; + size_t i; - i = 0; - new = NULL; - while (++i < len) + if (ac < 3) { - if (new != NULL) - break ; - if (av[now][i] == 'o') + flags.b64_flags |= e_base64_encode; + data = get_data(0, NULL); + } + while (now < ac) + { + printf("av: %s\n", av[now]); + if (av[now][0] == '-') { - flags->b64_flags |= e_base64_outputf; - if (data == NULL) + i = 0; + len_now = ft_strlen(av[now]); + while (++i < len_now) { - flags->b64_flags |= e_base64_encode; - data = get_data(0, NULL); + if (av[now][i] == 'e') + { + flags.b64_flags |= e_base64_encode; + if (data == NULL) + data = get_data(0, NULL); + } + else if (av[now][i] == 'd' || av[now][i] == 'D') + { + flags.b64_flags |= e_base64_decode; + if (data == NULL) + data = get_data(0, NULL); + } + else if (av[now][i] == 'i') + { + flags.b64_flags |= e_base64_inputf; + if (data != NULL) + clean_data(&data); + data = get_data(open_fd(av[now + 1]), av[now + 1]); + now++; + } + else if (av[now][i] == 'o') + { + flags.b64_flags |= e_base64_inputf; + now++; + } } - new = new_opt(*flags, data); - new->fd_output = av[now + 1]; - return (new); - } - else if (av[now][i] == 'i') - { - flags->b64_flags |= e_base64_inputf; - data = get_file(open_fd(av[now + 1]), av[now + 1]); - now += 2; - } - else if (av[now][i] == 'e') - { - flags->b64_flags |= e_base64_encode; - data = get_data(0, NULL); - } - else if (av[now][i] == 'd' || av[now][i] == 'D') - { - flags->b64_flags |= e_base64_decode; - data = get_data(0, NULL); } + now++; } - new = new_opt(*flags, data); - return (new); -} - -static t_opt *get_b64_args(char **av, int now) -{ - t_flags flags; - t_opt *new; - size_t len; - - new = NULL; - flags.b64_flags |= e_base64_encode; - if (av[now][0] == '-') - { - len = ft_strlen(av[now]); - new = check_b64_flags(len, &flags, av, now); - } + new = new_opt(flags, data); return (new); } t_opt *base64_opts(const int ac, char **av, t_opt *opts, int now) { - t_opt *new; - t_flags flags; + t_opt *new; - if (ac < 3) - { - flags.b64_flags |= e_base64_encode; - ft_membits(&(flags.b64_flags), 0, sizeof(uint32_t)); - new = new_opt(flags, get_data(0, NULL)); - } - else - new = get_b64_args(av, now); + new = get_base64_args(ac, av, now); add_to_end_lst(new, &opts); - now++; - if (now < ac) - opts = base64_opts(ac, av, opts, now); return (opts); } diff --git a/srcs/clean.c b/srcs/clean.c index f88d00a..ce5d163 100644 --- a/srcs/clean.c +++ b/srcs/clean.c @@ -3,15 +3,30 @@ /* ::: :::::::: */ /* clean.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: cpieri +#+ +:+ +#+ */ +/* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/15 12:07:14 by cpieri #+# #+# */ -/* Updated: 2019/03/26 18:23:52 by cpieri ### ########.fr */ +/* Updated: 2019/04/12 10:25:09 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" +void clean_data(t_data **data) +{ + if (*data != NULL) + { + if ((*data)->mall == 1) + ft_memdel((void**)&((*data)->data)); + if ((*data)->f_hash != NULL) + { + ft_memdel((void**)&((*data)->f_hash->h)); + ft_memdel((void**)&((*data)->f_hash)); + } + ft_memdel((void**)data); + } +} + void clean_prog(t_parse *parse) { t_opt *next; diff --git a/srcs/lst_opt.c b/srcs/lst_opt.c index 33a29a7..22020d7 100644 --- a/srcs/lst_opt.c +++ b/srcs/lst_opt.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/08 17:29:55 by cpieri #+# #+# */ -/* Updated: 2019/04/11 19:23:33 by cpieri ### ########.fr */ +/* Updated: 2019/04/12 10:35:49 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,9 +19,14 @@ void print_lst(t_opt **lst) tmp = *lst; while (tmp != NULL) { + ft_putstr("data to crypt: "); ft_memput(tmp->data->data, tmp->data->len_data); + ft_membits(&tmp->flags.b64_flags, 0, sizeof(uint32_t)); if (tmp->fd_output != NULL) + { + ft_putstr("fd to output: "); ft_putendl(tmp->fd_output); + } tmp = tmp->next; } } From 8127d7bef6c09cda695029700e657470a0569dc0 Mon Sep 17 00:00:00 2001 From: Louise P Date: Fri, 12 Apr 2019 11:32:42 +0200 Subject: [PATCH 03/71] Base64 parsing ok norme euh no --- includes/enum.h | 10 +++++----- srcs/base64/base64_parsing.c | 20 +++++++++++++++++++- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/includes/enum.h b/includes/enum.h index bc8f30c..60718dc 100644 --- a/includes/enum.h +++ b/includes/enum.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 14:34:08 by cpieri #+# #+# */ -/* Updated: 2019/04/12 10:47:23 by cpieri ### ########.fr */ +/* Updated: 2019/04/12 11:02:02 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,10 +21,10 @@ enum e_algo enum e_cipher_flags { - e_base64_encode = 0x00000000000000000000000000000001, - e_base64_decode = 0x00000000000000000000000000000010, - e_base64_inputf = 0x00000000000000000000000000000100, - e_base64_outputf = 0x00000000000000000000000000001000, + e_base64_encode = 0x00000001, + e_base64_decode = 0x00000010, + e_base64_inputf = 0x00000100, + e_base64_outputf = 0x00001000, }; #endif \ No newline at end of file diff --git a/srcs/base64/base64_parsing.c b/srcs/base64/base64_parsing.c index b51c69c..06ecc5f 100644 --- a/srcs/base64/base64_parsing.c +++ b/srcs/base64/base64_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 16:56:03 by cpieri #+# #+# */ -/* Updated: 2019/04/12 10:50:00 by cpieri ### ########.fr */ +/* Updated: 2019/04/12 11:31:43 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,6 +18,7 @@ t_opt *get_base64_args(const int ac, char **av, int now) t_opt *new; t_flags flags; t_data *data; + char *fd_output = NULL; size_t len_now; size_t i; @@ -58,13 +59,30 @@ t_opt *get_base64_args(const int ac, char **av, int now) else if (av[now][i] == 'o') { flags.b64_flags |= e_base64_inputf; + if (av[now + 1] != NULL) + fd_output = av[now + 1]; + else + fd_output = NULL; now++; } } } + else + { + flags.b64_flags |= e_base64_encode; + data = get_file(open_fd(av[now]), av[now]); + break ; + } now++; } + if (data == NULL) + { + flags.b64_flags |= e_base64_encode; + data = get_data(0, NULL); + } new = new_opt(flags, data); + if (fd_output != NULL && new != NULL) + new->fd_output = fd_output; return (new); } From 0f0297e856850b02fc6d55f4b8f94c34592d71e7 Mon Sep 17 00:00:00 2001 From: Louise P Date: Fri, 12 Apr 2019 15:33:14 +0200 Subject: [PATCH 04/71] Base64 parsing ok --- Makefile | 32 +++++----- includes/base64/base64.h | 19 ++++++ includes/functions.h | 6 +- srcs/base64/base64_help_parsing.c | 33 +++++++++++ srcs/base64/base64_parsing.c | 99 +++++++++++++------------------ srcs/lst_opt.c | 17 +++++- 6 files changed, 130 insertions(+), 76 deletions(-) create mode 100644 includes/base64/base64.h create mode 100644 srcs/base64/base64_help_parsing.c diff --git a/Makefile b/Makefile index f96ef2e..34119de 100644 --- a/Makefile +++ b/Makefile @@ -6,11 +6,10 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/03/15 11:20:25 by cpieri #+# #+# # -# Updated: 2019/04/11 17:33:18 by cpieri ### ########.fr # +# Updated: 2019/04/12 12:05:02 by cpieri ### ########.fr # # # # **************************************************************************** # - NAME = ft_ssl CC = gcc @@ -39,20 +38,21 @@ DEPS = Makefile \ includes/hash/md5.h \ libft/libft.a -SRC_NAME= main.c \ - clean.c \ - usage.c \ - parsing.c \ - get_data.c \ - lst_opt.c \ - hash/hash.c \ - hash/hash_parsing.c \ - hash/display_hash.c \ - hash/sha256/sha256.c \ - hash/sha256/sha256_utils.c \ - hash/md5/md5_utils.c \ - hash/md5/md5.c \ - base64/base64_parsing.c \ +SRC_NAME= main.c \ + clean.c \ + usage.c \ + parsing.c \ + get_data.c \ + lst_opt.c \ + hash/hash.c \ + hash/hash_parsing.c \ + hash/display_hash.c \ + hash/sha256/sha256.c \ + hash/sha256/sha256_utils.c \ + hash/md5/md5_utils.c \ + hash/md5/md5.c \ + base64/base64_parsing.c \ + base64/base64_help_parsing.c \ OBJ_NAME= $(SRC_NAME:.c=.o) diff --git a/includes/base64/base64.h b/includes/base64/base64.h new file mode 100644 index 0000000..241aee0 --- /dev/null +++ b/includes/base64/base64.h @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* base64.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/04/12 11:59:40 by cpieri #+# #+# */ +/* Updated: 2019/04/12 12:00:28 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef BASE64_H +# define BASE64_H + +void get_b64_e(t_data **data, t_flags *flags); +void get_b64_d(t_data **data, t_flags *flags); + +#endif \ No newline at end of file diff --git a/includes/functions.h b/includes/functions.h index ffe4d43..f0270e9 100644 --- a/includes/functions.h +++ b/includes/functions.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:44:05 by cpieri #+# #+# */ -/* Updated: 2019/04/12 10:27:19 by cpieri ### ########.fr */ +/* Updated: 2019/04/12 14:53:00 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,10 +23,14 @@ int open_fd(const char *file); t_data *get_data(const int fd, const char *fd_name); t_data *get_file(const int fd, const char *fd_name); t_data *get_string(char *s); +void get_b64_ed(t_data **data, t_flags *flags, char *fd, char c); +void get_b64_i(t_data **data, t_flags *flags, char *fd, int *now); + /* ** Functions for Lst_opt */ +t_opt *new_opt_fd(t_flags flags, t_data *data, char *fd); t_opt *new_opt(t_flags flags, t_data *data); void add_to_end_lst(t_opt *new, t_opt **lst); void print_lst(t_opt **lst); diff --git a/srcs/base64/base64_help_parsing.c b/srcs/base64/base64_help_parsing.c new file mode 100644 index 0000000..be7f984 --- /dev/null +++ b/srcs/base64/base64_help_parsing.c @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* base64_help_parsing.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/04/12 11:39:36 by cpieri #+# #+# */ +/* Updated: 2019/04/12 14:52:42 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_ssl.h" + +void get_b64_ed(t_data **data, t_flags *flags, char *fd, char c) +{ + if (*data != NULL) + clean_data(data); + flags->b64_flags |= (c == 'd') ? e_base64_decode : e_base64_encode; + if (fd == NULL) + *data = get_data(0, NULL); + else + *data = get_file(open_fd(fd), fd); +} + +void get_b64_i(t_data **data, t_flags *flags, char *fd, int *now) +{ + flags->b64_flags |= e_base64_inputf; + if (*data != NULL) + clean_data(data); + *data = get_data(open_fd(fd), fd); + (*now)++; +} diff --git a/srcs/base64/base64_parsing.c b/srcs/base64/base64_parsing.c index 06ecc5f..c1e5879 100644 --- a/srcs/base64/base64_parsing.c +++ b/srcs/base64/base64_parsing.c @@ -6,84 +6,67 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 16:56:03 by cpieri #+# #+# */ -/* Updated: 2019/04/12 11:31:43 by cpieri ### ########.fr */ +/* Updated: 2019/04/12 15:28:24 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" #include -t_opt *get_base64_args(const int ac, char **av, int now) +t_data *get_b64_opt(char **av, int *now, t_flags *flags, char **output) { - t_opt *new; - t_flags flags; - t_data *data; - char *fd_output = NULL; - size_t len_now; - size_t i; + t_data *data; + size_t len_now; + size_t i; - if (ac < 3) + i = 0; + data = NULL; + len_now = ft_strlen(av[*now]); + while (++i < len_now) { - flags.b64_flags |= e_base64_encode; - data = get_data(0, NULL); + if (av[*now][i] == 'e' || av[*now][i] == 'd') + get_b64_ed(&data, flags, NULL, av[*now][i]); + else if (av[*now][i] == 'i') + get_b64_i(&data, flags, av[(*now) + 1], now); + else if (av[*now][i] == 'o') + { + flags->b64_flags |= e_base64_outputf; + if (av[(*now) + 1] != NULL) + *output = av[(*now) + 1]; + else + *output = NULL; + (*now)++; + } } + return (data); +} + +t_opt *get_base64_args(const int ac, char **av, int now) +{ + t_opt t_o; + t_data *tmp; + char *fd_output; + + fd_output = NULL; + tmp = NULL; while (now < ac) { - printf("av: %s\n", av[now]); if (av[now][0] == '-') { - i = 0; - len_now = ft_strlen(av[now]); - while (++i < len_now) + tmp = get_b64_opt(av, &now, &(t_o.flags), &fd_output); + if (tmp != NULL) { - if (av[now][i] == 'e') - { - flags.b64_flags |= e_base64_encode; - if (data == NULL) - data = get_data(0, NULL); - } - else if (av[now][i] == 'd' || av[now][i] == 'D') - { - flags.b64_flags |= e_base64_decode; - if (data == NULL) - data = get_data(0, NULL); - } - else if (av[now][i] == 'i') - { - flags.b64_flags |= e_base64_inputf; - if (data != NULL) - clean_data(&data); - data = get_data(open_fd(av[now + 1]), av[now + 1]); - now++; - } - else if (av[now][i] == 'o') - { - flags.b64_flags |= e_base64_inputf; - if (av[now + 1] != NULL) - fd_output = av[now + 1]; - else - fd_output = NULL; - now++; - } + clean_data(&(t_o.data)); + t_o.data = tmp; } } else - { - flags.b64_flags |= e_base64_encode; - data = get_file(open_fd(av[now]), av[now]); - break ; - } + get_b64_ed(&(t_o.data), &(t_o.flags), av[now], 'e'); now++; } - if (data == NULL) - { - flags.b64_flags |= e_base64_encode; - data = get_data(0, NULL); - } - new = new_opt(flags, data); - if (fd_output != NULL && new != NULL) - new->fd_output = fd_output; - return (new); + if (t_o.data == NULL) + get_b64_ed(&(t_o.data), &(t_o.flags), NULL, 'e'); + return (new_opt_fd(t_o.flags, t_o.data, fd_output)); } t_opt *base64_opts(const int ac, char **av, t_opt *opts, int now) diff --git a/srcs/lst_opt.c b/srcs/lst_opt.c index 22020d7..01a7617 100644 --- a/srcs/lst_opt.c +++ b/srcs/lst_opt.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/08 17:29:55 by cpieri #+# #+# */ -/* Updated: 2019/04/12 10:35:49 by cpieri ### ########.fr */ +/* Updated: 2019/04/12 14:21:37 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -60,3 +60,18 @@ t_opt *new_opt(t_flags flags, t_data *data) new->fd_output = NULL; return (new); } + +t_opt *new_opt_fd(t_flags flags, t_data *data, char *fd) +{ + t_opt *new; + + if (data == NULL) + return (NULL); + if (!(new = (t_opt*)malloc(sizeof(t_opt)))) + return (NULL); + new->next = NULL; + new->data = data; + new->flags = flags; + new->fd_output = (fd != NULL) ? fd : NULL; + return (new); +} From 80720a17e2ffae279fb398f62dc36bb41dfc5994 Mon Sep 17 00:00:00 2001 From: Louise P Date: Fri, 12 Apr 2019 15:37:18 +0200 Subject: [PATCH 05/71] Norme <3 --- includes/base64/base64.h | 4 ++-- includes/constant.h | 4 ++-- includes/define.h | 4 ++-- includes/enum.h | 4 ++-- includes/functions.h | 46 +++++++++++++++++++--------------------- 5 files changed, 30 insertions(+), 32 deletions(-) diff --git a/includes/base64/base64.h b/includes/base64/base64.h index 241aee0..13aabbf 100644 --- a/includes/base64/base64.h +++ b/includes/base64/base64.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/12 11:59:40 by cpieri #+# #+# */ -/* Updated: 2019/04/12 12:00:28 by cpieri ### ########.fr */ +/* Updated: 2019/04/12 15:34:30 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,4 +16,4 @@ void get_b64_e(t_data **data, t_flags *flags); void get_b64_d(t_data **data, t_flags *flags); -#endif \ No newline at end of file +#endif diff --git a/includes/constant.h b/includes/constant.h index a739371..117b056 100644 --- a/includes/constant.h +++ b/includes/constant.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:15:35 by cpieri #+# #+# */ -/* Updated: 2019/04/11 18:11:24 by cpieri ### ########.fr */ +/* Updated: 2019/04/12 15:34:32 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -47,4 +47,4 @@ static const char *g_cipher_cmd[] = NULL }; -#endif \ No newline at end of file +#endif diff --git a/includes/define.h b/includes/define.h index add1d2d..89fc3aa 100644 --- a/includes/define.h +++ b/includes/define.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:43:16 by cpieri #+# #+# */ -/* Updated: 2019/04/11 16:47:55 by cpieri ### ########.fr */ +/* Updated: 2019/04/12 15:34:36 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,4 +19,4 @@ # define NO_CMD 1 # define INVALID_CMD 2 -#endif \ No newline at end of file +#endif diff --git a/includes/enum.h b/includes/enum.h index 60718dc..f8f0927 100644 --- a/includes/enum.h +++ b/includes/enum.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 14:34:08 by cpieri #+# #+# */ -/* Updated: 2019/04/12 11:02:02 by cpieri ### ########.fr */ +/* Updated: 2019/04/12 15:34:41 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,4 +27,4 @@ enum e_cipher_flags e_base64_outputf = 0x00001000, }; -#endif \ No newline at end of file +#endif diff --git a/includes/functions.h b/includes/functions.h index f0270e9..c5c5e3d 100644 --- a/includes/functions.h +++ b/includes/functions.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:44:05 by cpieri #+# #+# */ -/* Updated: 2019/04/12 14:53:00 by cpieri ### ########.fr */ +/* Updated: 2019/04/12 15:36:28 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,40 +16,38 @@ /* ** Functions for Parsing */ -t_parse parsing(const int ac, char **av); -t_opt *hash_opts(const int ac, char **av, t_opt *opts, int now); -t_opt *base64_opts(const int ac, char **av, t_opt *opts, int now); -int open_fd(const char *file); -t_data *get_data(const int fd, const char *fd_name); -t_data *get_file(const int fd, const char *fd_name); -t_data *get_string(char *s); -void get_b64_ed(t_data **data, t_flags *flags, char *fd, char c); -void get_b64_i(t_data **data, t_flags *flags, char *fd, int *now); - +t_parse parsing(const int ac, char **av); +t_opt *hash_opts(const int ac, char **av, t_opt *opts, int now); +t_opt *base64_opts(const int ac, char **av, t_opt *opts, int now); +int open_fd(const char *file); +t_data *get_data(const int fd, const char *fd_name); +t_data *get_file(const int fd, const char *fd_name); +t_data *get_string(char *s); +void get_b64_ed(t_data **data, t_flags *flags, char *fd, char c); +void get_b64_i(t_data **data, t_flags *flags, char *fd, int *now); /* ** Functions for Lst_opt */ -t_opt *new_opt_fd(t_flags flags, t_data *data, char *fd); -t_opt *new_opt(t_flags flags, t_data *data); -void add_to_end_lst(t_opt *new, t_opt **lst); -void print_lst(t_opt **lst); +t_opt *new_opt_fd(t_flags flags, t_data *data, char *fd); +t_opt *new_opt(t_flags flags, t_data *data); +void add_to_end_lst(t_opt *new, t_opt **lst); +void print_lst(t_opt **lst); /* ** Functions for Hashing msg and display final hash */ -void hashing(t_parse *parse); -void printing_hash(t_data *data, const char *hash_type, - t_flags flags); +void hashing(t_parse *parse); +void printing_hash(t_data *data, const char *hash_type, t_flags flags); /* ** Functions for Exit, Clean, Error */ -void exit_error(void); -void exit_error_free(void **to_free); -void print_error(const char *msg_1); -void print_usage(const int usage_int, const char *command); -void clean_prog(t_parse *parse); -void clean_data(t_data **data); +void exit_error(void); +void exit_error_free(void **to_free); +void print_error(const char *msg_1); +void print_usage(const int usage_int, const char *command); +void clean_prog(t_parse *parse); +void clean_data(t_data **data); #endif From d2b1878bc8f47ca00069300ae05c15cba02a286f Mon Sep 17 00:00:00 2001 From: Louise P Date: Fri, 12 Apr 2019 15:37:34 +0200 Subject: [PATCH 06/71] norrme 2 --- libft/srcs/ft_memput.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libft/srcs/ft_memput.c b/libft/srcs/ft_memput.c index 714fd37..6f436f9 100644 --- a/libft/srcs/ft_memput.c +++ b/libft/srcs/ft_memput.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 19:12:05 by cpieri #+# #+# */ -/* Updated: 2019/04/12 09:49:46 by cpieri ### ########.fr */ +/* Updated: 2019/04/12 15:34:06 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,5 +15,4 @@ void ft_memput(void *s, size_t len) { write(1, (char*)s, len); - // write(1, "\n", 1); -} \ No newline at end of file +} From 306efc55bd268652045906d1c0bd7d7c349f9b2b Mon Sep 17 00:00:00 2001 From: Louise P Date: Fri, 12 Apr 2019 19:57:28 +0200 Subject: [PATCH 07/71] Base64 algo in progress --- Makefile | 3 +- includes/base64/base64.h | 4 +-- includes/constant.h | 4 +-- includes/enum.h | 14 +++++---- includes/functions.h | 4 ++- srcs/base64/base64.c | 65 ++++++++++++++++++++++++++++++++++++++++ srcs/main.c | 5 ++-- 7 files changed, 84 insertions(+), 15 deletions(-) create mode 100644 srcs/base64/base64.c diff --git a/Makefile b/Makefile index 34119de..cfd702d 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/03/15 11:20:25 by cpieri #+# #+# # -# Updated: 2019/04/12 12:05:02 by cpieri ### ########.fr # +# Updated: 2019/04/12 17:15:44 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -51,6 +51,7 @@ SRC_NAME= main.c \ hash/sha256/sha256_utils.c \ hash/md5/md5_utils.c \ hash/md5/md5.c \ + base64/base64.c \ base64/base64_parsing.c \ base64/base64_help_parsing.c \ diff --git a/includes/base64/base64.h b/includes/base64/base64.h index 13aabbf..880861b 100644 --- a/includes/base64/base64.h +++ b/includes/base64/base64.h @@ -6,14 +6,12 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/12 11:59:40 by cpieri #+# #+# */ -/* Updated: 2019/04/12 15:34:30 by cpieri ### ########.fr */ +/* Updated: 2019/04/12 17:14:04 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef BASE64_H # define BASE64_H -void get_b64_e(t_data **data, t_flags *flags); -void get_b64_d(t_data **data, t_flags *flags); #endif diff --git a/includes/constant.h b/includes/constant.h index 117b056..1c66be1 100644 --- a/includes/constant.h +++ b/includes/constant.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:15:35 by cpieri #+# #+# */ -/* Updated: 2019/04/12 15:34:32 by cpieri ### ########.fr */ +/* Updated: 2019/04/12 17:13:28 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,7 +17,7 @@ static const t_parse g_all_cmd[] = { {"md5", "MD5", e_hash, md5, hash_opts, printing_hash, NULL}, {"sha256", "SHA256", e_hash, sha256, hash_opts, printing_hash, NULL}, - {"base64", "base64", e_cipher, NULL, base64_opts, NULL, NULL}, + {"base64", "base64", e_cipher, base64, base64_opts, NULL, NULL}, {NULL, NULL, 0, NULL, NULL, NULL, NULL}, }; diff --git a/includes/enum.h b/includes/enum.h index f8f0927..cff94dd 100644 --- a/includes/enum.h +++ b/includes/enum.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 14:34:08 by cpieri #+# #+# */ -/* Updated: 2019/04/12 15:34:41 by cpieri ### ########.fr */ +/* Updated: 2019/04/12 17:45:53 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,10 +21,14 @@ enum e_algo enum e_cipher_flags { - e_base64_encode = 0x00000001, - e_base64_decode = 0x00000010, - e_base64_inputf = 0x00000100, - e_base64_outputf = 0x00001000, + e_base64_encode = 1, + e_base64_decode = 2, + e_base64_inputf = 3, + e_base64_outputf = 4, + // e_base64_encode = 0x00000001, + // e_base64_decode = 0x00000010, + // e_base64_inputf = 0x00000100, + // e_base64_outputf = 0x00001000, }; #endif diff --git a/includes/functions.h b/includes/functions.h index c5c5e3d..17edbbd 100644 --- a/includes/functions.h +++ b/includes/functions.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:44:05 by cpieri #+# #+# */ -/* Updated: 2019/04/12 15:36:28 by cpieri ### ########.fr */ +/* Updated: 2019/04/12 17:14:32 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -26,6 +26,8 @@ t_data *get_string(char *s); void get_b64_ed(t_data **data, t_flags *flags, char *fd, char c); void get_b64_i(t_data **data, t_flags *flags, char *fd, int *now); +void *base64(void *opts, size_t len_opts); + /* ** Functions for Lst_opt */ diff --git a/srcs/base64/base64.c b/srcs/base64/base64.c new file mode 100644 index 0000000..bb0936a --- /dev/null +++ b/srcs/base64/base64.c @@ -0,0 +1,65 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* base64.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/04/12 16:53:29 by cpieri #+# #+# */ +/* Updated: 2019/04/12 19:55:55 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_ssl.h" +#include + +const char g_base64_c[] = +{ + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', + 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', + 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', '+', '/' +}; + +static void base64_encode(void *s, size_t len) +{ + size_t i; + // uint32_t n; + // uint8_t n0, n1, n2, n3 = 0; + size_t padding_len; + + i = 0; + padding_len = len % 3; + // n = 0; + ft_membits(s, len, sizeof(uint8_t)); + printf("padding_len: %zu\n", padding_len); + while (i < len) + { + // printf("n0: %2d, c: %c\n", n0, g_base64_c[n0]); + // printf("n1: %2d, c: %c\n", n1, g_base64_c[n1]); + // printf("n2: %2d, c: %c\n", n2, g_base64_c[n2]); + // printf("n3: %2d, c: %c\n", n3, g_base64_c[n3]); + i += 3; + } +} + +static void base64_decode(void *s, size_t len) +{ + (void)s, (void)len; + printf("base64 decode func\n"); +} + +void *base64(void *opts, size_t len_opts) +{ + t_opt *opt; + + (void)len_opts; + opt = (t_opt*)opts; + if ((opt->flags.b64_flags & e_base64_encode) == e_base64_encode) + base64_encode(opt->data->data, opt->data->len_data); + else if ((opt->flags.b64_flags & e_base64_decode) == e_base64_decode) + base64_decode(opt->data->data, opt->data->len_data); + print_lst(&opt); + return (opts); +} diff --git a/srcs/main.c b/srcs/main.c index 19da47a..adf823b 100644 --- a/srcs/main.c +++ b/srcs/main.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/24 17:05:16 by cpieri #+# #+# */ -/* Updated: 2019/04/11 19:31:12 by cpieri ### ########.fr */ +/* Updated: 2019/04/12 17:11:09 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,8 +19,7 @@ int main(int ac, char **av) if (ac < 2) print_usage(1, NULL); parse = parsing(ac, av); - print_lst(&(parse.lst_opts)); - // hashing(&parse); + hashing(&parse); // clean_prog(&parse); return (0); } From 73d264f2ab5d8e7864842cccb68adf81d35feaef Mon Sep 17 00:00:00 2001 From: Louise P Date: Fri, 12 Apr 2019 23:23:43 +0200 Subject: [PATCH 08/71] Base64 algo in progress --- srcs/base64/base64.c | 55 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/srcs/base64/base64.c b/srcs/base64/base64.c index bb0936a..790ceee 100644 --- a/srcs/base64/base64.c +++ b/srcs/base64/base64.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/12 16:53:29 by cpieri #+# #+# */ -/* Updated: 2019/04/12 19:55:55 by cpieri ### ########.fr */ +/* Updated: 2019/04/12 23:22:45 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,21 +25,58 @@ const char g_base64_c[] = static void base64_encode(void *s, size_t len) { size_t i; - // uint32_t n; - // uint8_t n0, n1, n2, n3 = 0; + size_t n = 0; + uint32_t c = 0; + uint32_t t = 0; + // int c1, c2, c3 = 0; + uint8_t n0, n1, n2, n3 = 0; size_t padding_len; i = 0; padding_len = len % 3; - // n = 0; + n = (len / 3) + (len % 3); + n *= 4; ft_membits(s, len, sizeof(uint8_t)); + printf("sizeof 32: %zu\n", sizeof(uint32_t)); printf("padding_len: %zu\n", padding_len); - while (i < len) + while (i < ((len / 3) * 3)) { - // printf("n0: %2d, c: %c\n", n0, g_base64_c[n0]); - // printf("n1: %2d, c: %c\n", n1, g_base64_c[n1]); - // printf("n2: %2d, c: %c\n", n2, g_base64_c[n2]); - // printf("n3: %2d, c: %c\n", n3, g_base64_c[n3]); + ft_memcpy(&c, s + i, 3); + // ft_membits(&c, 0, sizeof(uint32_t)); + // t = (c & 0xf) >> 1; + // ft_membits(&t, 0, sizeof(uint32_t)); + //----------------------------------- + ft_putstr("c for n0: "); + ft_membits(&c, 0, sizeof(uint32_t)); + t = (c >> 2); ft_putstr("t for n0: "); + ft_membits(&t, 0, sizeof(uint32_t)); + n0 = ((uint8_t)(c >> 2)) & 0x3f; + ft_putstr("n0: "); + ft_membits(&n0, 0, sizeof(uint8_t)); + printf("n0: %2d, c: %c\n", n0, g_base64_c[n0]); + //---------------------------------- + ft_putstr("c for n1: "); + ft_membits(&c, 0, sizeof(uint32_t)); + t = (((c & 0x3) << 4) | ((c & 0xf) >> 4)); + ft_putstr("t for n1: "); + ft_membits(&t, 0, sizeof(uint32_t)); + n1 = ((uint8_t)t) & 0x3f; + ft_putstr("n1: "); + ft_membits(&n1, 0, sizeof(uint8_t)); + printf("n1: %2d, c: %c\n", n1, g_base64_c[n1]); + //----------------------------------- + ft_putstr("c for n2: "); + ft_membits(&c, 0, sizeof(uint32_t)); + t = (c >> 6); ft_putstr("t for n2: "); + ft_membits(&t, 0, sizeof(uint32_t)); + n2 = ((uint8_t)(c >> 6)) & 0x3f; + ft_putstr("n2: "); + ft_membits(&n2, 0, sizeof(uint8_t)); + printf("n2: %2d, c: %c\n", n2, g_base64_c[n2]); + //------------------------------------ + n3 = ((uint8_t)(c >> 8)) & 0x3f; + ft_membits(&n3, 0, sizeof(uint8_t)); + printf("n3: %2d, c: %c\n", n3, g_base64_c[n3]); i += 3; } } From b70a07fe6ad13f7dc0432c631c77469856dd26c9 Mon Sep 17 00:00:00 2001 From: Louise P Date: Mon, 15 Apr 2019 13:50:28 +0200 Subject: [PATCH 09/71] Base64 in progress: Encode finish Decode starting Parsing ok for testing --- Makefile | 4 +- includes/base64/base64.h | 23 ++++++++- includes/enum.h | 8 +-- includes/ft_ssl.h | 3 +- srcs/base64/base64.c | 84 ++----------------------------- srcs/base64/base64_decode.c | 19 +++++++ srcs/base64/base64_encode.c | 74 +++++++++++++++++++++++++++ srcs/base64/base64_help_parsing.c | 3 +- srcs/base64/base64_parsing.c | 3 +- srcs/main.c | 4 +- 10 files changed, 133 insertions(+), 92 deletions(-) create mode 100644 srcs/base64/base64_decode.c create mode 100644 srcs/base64/base64_encode.c diff --git a/Makefile b/Makefile index cfd702d..1b55ab2 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/03/15 11:20:25 by cpieri #+# #+# # -# Updated: 2019/04/12 17:15:44 by cpieri ### ########.fr # +# Updated: 2019/04/15 13:47:31 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -52,6 +52,8 @@ SRC_NAME= main.c \ hash/md5/md5_utils.c \ hash/md5/md5.c \ base64/base64.c \ + base64/base64_encode.c \ + base64/base64_decode.c \ base64/base64_parsing.c \ base64/base64_help_parsing.c \ diff --git a/includes/base64/base64.h b/includes/base64/base64.h index 880861b..7c4a2d6 100644 --- a/includes/base64/base64.h +++ b/includes/base64/base64.h @@ -6,12 +6,33 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/12 11:59:40 by cpieri #+# #+# */ -/* Updated: 2019/04/12 17:14:04 by cpieri ### ########.fr */ +/* Updated: 2019/04/15 13:42:03 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef BASE64_H # define BASE64_H +# include "../libft/include/libft.h" + +static const char g_base64_c[] = +{ + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', + 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', + 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', '+', '/' +}; + +typedef struct s_base64_encode +{ + uint8_t n0; + uint8_t n1; + uint8_t n2; + uint8_t n3; +} t_base64_encode; + +uint8_t *base64_encode(uint8_t *msg, size_t len); +uint8_t *base64_decode(uint8_t *msg, size_t len); #endif diff --git a/includes/enum.h b/includes/enum.h index cff94dd..7b0671a 100644 --- a/includes/enum.h +++ b/includes/enum.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 14:34:08 by cpieri #+# #+# */ -/* Updated: 2019/04/12 17:45:53 by cpieri ### ########.fr */ +/* Updated: 2019/04/15 11:34:32 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,16 +19,12 @@ enum e_algo e_cipher, }; -enum e_cipher_flags +enum e_base64_flags { e_base64_encode = 1, e_base64_decode = 2, e_base64_inputf = 3, e_base64_outputf = 4, - // e_base64_encode = 0x00000001, - // e_base64_decode = 0x00000010, - // e_base64_inputf = 0x00000100, - // e_base64_outputf = 0x00001000, }; #endif diff --git a/includes/ft_ssl.h b/includes/ft_ssl.h index 9218dc4..b5ddef5 100644 --- a/includes/ft_ssl.h +++ b/includes/ft_ssl.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/06 12:40:02 by cpieri #+# #+# */ -/* Updated: 2019/04/11 16:36:18 by cpieri ### ########.fr */ +/* Updated: 2019/04/15 11:31:38 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,6 +16,7 @@ # include "../libft/include/libft.h" # include "./hash/md5.h" # include "./hash/sha256.h" +# include "./base64/base64.h" # include "define.h" # include "enum.h" # include "structure.h" diff --git a/srcs/base64/base64.c b/srcs/base64/base64.c index 790ceee..b6df5ba 100644 --- a/srcs/base64/base64.c +++ b/srcs/base64/base64.c @@ -6,97 +6,23 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/12 16:53:29 by cpieri #+# #+# */ -/* Updated: 2019/04/12 23:22:45 by cpieri ### ########.fr */ +/* Updated: 2019/04/15 13:47:46 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" +#include "base64/base64.h" #include -const char g_base64_c[] = -{ - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', - 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', - 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', - 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', - '8', '9', '+', '/' -}; - -static void base64_encode(void *s, size_t len) -{ - size_t i; - size_t n = 0; - uint32_t c = 0; - uint32_t t = 0; - // int c1, c2, c3 = 0; - uint8_t n0, n1, n2, n3 = 0; - size_t padding_len; - - i = 0; - padding_len = len % 3; - n = (len / 3) + (len % 3); - n *= 4; - ft_membits(s, len, sizeof(uint8_t)); - printf("sizeof 32: %zu\n", sizeof(uint32_t)); - printf("padding_len: %zu\n", padding_len); - while (i < ((len / 3) * 3)) - { - ft_memcpy(&c, s + i, 3); - // ft_membits(&c, 0, sizeof(uint32_t)); - // t = (c & 0xf) >> 1; - // ft_membits(&t, 0, sizeof(uint32_t)); - //----------------------------------- - ft_putstr("c for n0: "); - ft_membits(&c, 0, sizeof(uint32_t)); - t = (c >> 2); ft_putstr("t for n0: "); - ft_membits(&t, 0, sizeof(uint32_t)); - n0 = ((uint8_t)(c >> 2)) & 0x3f; - ft_putstr("n0: "); - ft_membits(&n0, 0, sizeof(uint8_t)); - printf("n0: %2d, c: %c\n", n0, g_base64_c[n0]); - //---------------------------------- - ft_putstr("c for n1: "); - ft_membits(&c, 0, sizeof(uint32_t)); - t = (((c & 0x3) << 4) | ((c & 0xf) >> 4)); - ft_putstr("t for n1: "); - ft_membits(&t, 0, sizeof(uint32_t)); - n1 = ((uint8_t)t) & 0x3f; - ft_putstr("n1: "); - ft_membits(&n1, 0, sizeof(uint8_t)); - printf("n1: %2d, c: %c\n", n1, g_base64_c[n1]); - //----------------------------------- - ft_putstr("c for n2: "); - ft_membits(&c, 0, sizeof(uint32_t)); - t = (c >> 6); ft_putstr("t for n2: "); - ft_membits(&t, 0, sizeof(uint32_t)); - n2 = ((uint8_t)(c >> 6)) & 0x3f; - ft_putstr("n2: "); - ft_membits(&n2, 0, sizeof(uint8_t)); - printf("n2: %2d, c: %c\n", n2, g_base64_c[n2]); - //------------------------------------ - n3 = ((uint8_t)(c >> 8)) & 0x3f; - ft_membits(&n3, 0, sizeof(uint8_t)); - printf("n3: %2d, c: %c\n", n3, g_base64_c[n3]); - i += 3; - } -} - -static void base64_decode(void *s, size_t len) -{ - (void)s, (void)len; - printf("base64 decode func\n"); -} - -void *base64(void *opts, size_t len_opts) +void *base64(void *opts, size_t len_opts) { t_opt *opt; (void)len_opts; opt = (t_opt*)opts; if ((opt->flags.b64_flags & e_base64_encode) == e_base64_encode) - base64_encode(opt->data->data, opt->data->len_data); + base64_encode((uint8_t*)opt->data->data, opt->data->len_data); else if ((opt->flags.b64_flags & e_base64_decode) == e_base64_decode) - base64_decode(opt->data->data, opt->data->len_data); - print_lst(&opt); + base64_decode((uint8_t*)opt->data->data, opt->data->len_data); return (opts); } diff --git a/srcs/base64/base64_decode.c b/srcs/base64/base64_decode.c new file mode 100644 index 0000000..67c936b --- /dev/null +++ b/srcs/base64/base64_decode.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* base64_decode.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/04/15 13:41:31 by cpieri #+# #+# */ +/* Updated: 2019/04/15 13:47:58 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "base64/base64.h" + +uint8_t *base64_decode(uint8_t *msg, size_t len) +{ + (void)len; + return (msg); +} diff --git a/srcs/base64/base64_encode.c b/srcs/base64/base64_encode.c new file mode 100644 index 0000000..bb23c01 --- /dev/null +++ b/srcs/base64/base64_encode.c @@ -0,0 +1,74 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* base64_encode.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/04/15 11:29:50 by cpieri #+# #+# */ +/* Updated: 2019/04/15 13:41:51 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "base64/base64.h" + +static size_t b64_len_encode(size_t len) +{ + return (((len + 2) / 3 * 4) + 1); +} + +static void b64_encode_value(t_base64_encode *n, uint8_t *msg, size_t i) +{ + n->n0 = ((msg[i] >> 2) & 0x3f); + n->n1 = ((((msg[i] & 0x3) << 4) | ((msg[i + 1] & 0xf0) >> 4))) & 0x3f; + n->n2 = (((msg[i + 1] & 0xf) << 2) | ((msg[i + 2] & 0xc0) >> 6)) & 0x3f; + n->n3 = ((msg[i + 2]) & 0x3f); +} + +static void b64_encode_padding(uint8_t *new_s, uint8_t *msg, size_t i, + size_t len) +{ + uint8_t n; + + if (i < len) + { + *new_s++ = g_base64_c[((msg[i] >> 2) & 0x3f)]; + if (i == (len - 1)) + { + *new_s++ = g_base64_c[((msg[i] & 0x3) << 4)]; + *new_s++ = '='; + } + else + { + n = ((((msg[i] & 0x3) << 4) | ((msg[i + 1] & 0xf0) >> 4))) & 0x3f; + *new_s++ = g_base64_c[n]; + *new_s++ = g_base64_c[((msg[i + 1] & 0xf) << 2)]; + } + *new_s++ = '='; + } +} + +uint8_t *base64_encode(uint8_t *msg, size_t len) +{ + size_t i; + uint8_t *new_s; + uint8_t *tmp; + t_base64_encode n; + + i = 0; + n = (t_base64_encode){0, 0, 0, 0}; + if (!(new_s = (uint8_t*)ft_memalloc(sizeof(uint8_t) * b64_len_encode(len)))) + return (NULL); + tmp = new_s; + while (i < (len - 2)) + { + b64_encode_value(&n, msg, i); + *tmp++ = g_base64_c[n.n0]; + *tmp++ = g_base64_c[n.n1]; + *tmp++ = g_base64_c[n.n2]; + *tmp++ = g_base64_c[n.n3]; + i += 3; + } + b64_encode_padding(tmp, msg, i, len); + return (new_s); +} diff --git a/srcs/base64/base64_help_parsing.c b/srcs/base64/base64_help_parsing.c index be7f984..112050b 100644 --- a/srcs/base64/base64_help_parsing.c +++ b/srcs/base64/base64_help_parsing.c @@ -6,11 +6,12 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/12 11:39:36 by cpieri #+# #+# */ -/* Updated: 2019/04/12 14:52:42 by cpieri ### ########.fr */ +/* Updated: 2019/04/15 11:24:16 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" +#include "base64/base64.h" void get_b64_ed(t_data **data, t_flags *flags, char *fd, char c) { diff --git a/srcs/base64/base64_parsing.c b/srcs/base64/base64_parsing.c index c1e5879..0c4157a 100644 --- a/srcs/base64/base64_parsing.c +++ b/srcs/base64/base64_parsing.c @@ -6,11 +6,12 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 16:56:03 by cpieri #+# #+# */ -/* Updated: 2019/04/12 15:28:24 by cpieri ### ########.fr */ +/* Updated: 2019/04/15 11:24:31 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" +#include "base64/base64.h" #include t_data *get_b64_opt(char **av, int *now, t_flags *flags, char **output) diff --git a/srcs/main.c b/srcs/main.c index adf823b..f0a511f 100644 --- a/srcs/main.c +++ b/srcs/main.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/24 17:05:16 by cpieri #+# #+# */ -/* Updated: 2019/04/12 17:11:09 by cpieri ### ########.fr */ +/* Updated: 2019/04/15 13:45:01 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,6 +20,6 @@ int main(int ac, char **av) print_usage(1, NULL); parse = parsing(ac, av); hashing(&parse); - // clean_prog(&parse); + clean_prog(&parse); return (0); } From 42dfbb7cc0ed0645aa46ff90e704c926451ce6f5 Mon Sep 17 00:00:00 2001 From: Louise P Date: Mon, 15 Apr 2019 15:18:37 +0200 Subject: [PATCH 10/71] Base64 in progress; Decode in progress --- includes/base64/base64.h | 20 +++++++++++++++++++- includes/enum.h | 10 +++++----- srcs/base64/base64.c | 6 +++--- srcs/base64/base64_decode.c | 16 ++++++++++++++-- 4 files changed, 41 insertions(+), 11 deletions(-) diff --git a/includes/base64/base64.h b/includes/base64/base64.h index 7c4a2d6..a0b97a3 100644 --- a/includes/base64/base64.h +++ b/includes/base64/base64.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/12 11:59:40 by cpieri #+# #+# */ -/* Updated: 2019/04/15 13:42:03 by cpieri ### ########.fr */ +/* Updated: 2019/04/15 14:57:49 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,24 @@ # include "../libft/include/libft.h" +static const unsigned char g_base64_d[] = { + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 64, 64, 64, 65, 64, 64, 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, + 64, 64, 64, 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64 +}; + static const char g_base64_c[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', diff --git a/includes/enum.h b/includes/enum.h index 7b0671a..79e2910 100644 --- a/includes/enum.h +++ b/includes/enum.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 14:34:08 by cpieri #+# #+# */ -/* Updated: 2019/04/15 11:34:32 by cpieri ### ########.fr */ +/* Updated: 2019/04/15 14:19:15 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,10 +21,10 @@ enum e_algo enum e_base64_flags { - e_base64_encode = 1, - e_base64_decode = 2, - e_base64_inputf = 3, - e_base64_outputf = 4, + e_base64_encode = 0x00000001, + e_base64_decode = 0x00000010, + e_base64_inputf = 0x00000100, + e_base64_outputf = 0x00001000, }; #endif diff --git a/srcs/base64/base64.c b/srcs/base64/base64.c index b6df5ba..1d1e180 100644 --- a/srcs/base64/base64.c +++ b/srcs/base64/base64.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/12 16:53:29 by cpieri #+# #+# */ -/* Updated: 2019/04/15 13:47:46 by cpieri ### ########.fr */ +/* Updated: 2019/04/15 15:17:39 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,9 +20,9 @@ void *base64(void *opts, size_t len_opts) (void)len_opts; opt = (t_opt*)opts; - if ((opt->flags.b64_flags & e_base64_encode) == e_base64_encode) + if ((opt->flags.b64_flags & e_base64_encode)) base64_encode((uint8_t*)opt->data->data, opt->data->len_data); - else if ((opt->flags.b64_flags & e_base64_decode) == e_base64_decode) + else if ((opt->flags.b64_flags & e_base64_decode)) base64_decode((uint8_t*)opt->data->data, opt->data->len_data); return (opts); } diff --git a/srcs/base64/base64_decode.c b/srcs/base64/base64_decode.c index 67c936b..7dd0296 100644 --- a/srcs/base64/base64_decode.c +++ b/srcs/base64/base64_decode.c @@ -6,14 +6,26 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/15 13:41:31 by cpieri #+# #+# */ -/* Updated: 2019/04/15 13:47:58 by cpieri ### ########.fr */ +/* Updated: 2019/04/15 15:16:01 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "base64/base64.h" +#include uint8_t *base64_decode(uint8_t *msg, size_t len) { - (void)len; + size_t i; + t_base64_encode n; + + i = 0; + printf("decode func\n"); + y = 0; + while (i < len) + { + if (ft_isspace(msg[i])) + i++; + i++; + } return (msg); } From 7b4174a3f08fd048bd690bc87ca541ac0203d0ca Mon Sep 17 00:00:00 2001 From: Louise P Date: Mon, 22 Apr 2019 10:07:09 +0200 Subject: [PATCH 11/71] Base64 in progress: Base64 decode in progress --- srcs/base64/base64.c | 7 ++++--- srcs/base64/base64_decode.c | 30 ++++++++++++++++++------------ test_b64 | 1 + 3 files changed, 23 insertions(+), 15 deletions(-) create mode 100644 test_b64 diff --git a/srcs/base64/base64.c b/srcs/base64/base64.c index 1d1e180..a59b936 100644 --- a/srcs/base64/base64.c +++ b/srcs/base64/base64.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/12 16:53:29 by cpieri #+# #+# */ -/* Updated: 2019/04/15 15:17:39 by cpieri ### ########.fr */ +/* Updated: 2019/04/22 10:03:25 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,9 +20,10 @@ void *base64(void *opts, size_t len_opts) (void)len_opts; opt = (t_opt*)opts; - if ((opt->flags.b64_flags & e_base64_encode)) + print_lst(&opt); + if ((opt->flags.b64_flags & e_base64_encode) == e_base64_encode) base64_encode((uint8_t*)opt->data->data, opt->data->len_data); - else if ((opt->flags.b64_flags & e_base64_decode)) + else if ((opt->flags.b64_flags & e_base64_decode) == e_base64_decode) base64_decode((uint8_t*)opt->data->data, opt->data->len_data); return (opts); } diff --git a/srcs/base64/base64_decode.c b/srcs/base64/base64_decode.c index 7dd0296..079a47e 100644 --- a/srcs/base64/base64_decode.c +++ b/srcs/base64/base64_decode.c @@ -6,26 +6,32 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/15 13:41:31 by cpieri #+# #+# */ -/* Updated: 2019/04/15 15:16:01 by cpieri ### ########.fr */ +/* Updated: 2019/04/22 09:53:34 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "base64/base64.h" #include -uint8_t *base64_decode(uint8_t *msg, size_t len) +static size_t b64_len_decode(uint8_t *s) { - size_t i; - t_base64_encode n; + size_t new_len; + uint8_t *tmp; - i = 0; + tmp = s; + while (g_base64_d[*(tmp++)] <= 63); + new_len = (tmp - s) - 1; + printf("new_len = %zu\n", new_len); + return (((new_len + 3) / 4) * 3); +} + +uint8_t *base64_decode(uint8_t *msg, size_t len) +{ + size_t len_plain; + + (void)len; printf("decode func\n"); - y = 0; - while (i < len) - { - if (ft_isspace(msg[i])) - i++; - i++; - } + len_plain = b64_len_decode(msg); + printf("len_plain = %zu\n", len_plain); return (msg); } diff --git a/test_b64 b/test_b64 new file mode 100644 index 0000000..03e44fa --- /dev/null +++ b/test_b64 @@ -0,0 +1 @@ +Y3BpZXJpCg== From 48b27a3b2d01b593fa1a703da8965d26bc2ec212 Mon Sep 17 00:00:00 2001 From: Louise P Date: Fri, 26 Apr 2019 17:28:07 +0200 Subject: [PATCH 12/71] base64 in progress Base64 decode func ok change parser for opts starting printing --- test_b64 => encode_auteur | 0 encode_clean_c | 1 + encode_mfile | 1 + includes/base64/base64.h | 38 +++++----------- includes/hash/md5.h | 23 +--------- includes/hash/sha256.h | 16 +------ size_file | 6 +++ srcs/base64/base64.c | 2 +- srcs/base64/base64_decode.c | 73 +++++++++++++++++++++++++------ srcs/base64/base64_encode.c | 11 ++++- srcs/base64/base64_help_parsing.c | 11 ++++- srcs/base64/base64_parsing.c | 5 ++- srcs/hash/md5/md5.c | 23 +++++++++- srcs/hash/sha256/sha256.c | 16 ++++++- 14 files changed, 139 insertions(+), 87 deletions(-) rename test_b64 => encode_auteur (100%) create mode 100644 encode_clean_c create mode 100644 encode_mfile create mode 100644 size_file diff --git a/test_b64 b/encode_auteur similarity index 100% rename from test_b64 rename to encode_auteur diff --git a/encode_clean_c b/encode_clean_c new file mode 100644 index 0000000..0b273df --- /dev/null +++ b/encode_clean_c @@ -0,0 +1 @@ +LyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6OiAgICAgIDo6Ojo6Ojo6ICAgKi8KLyogICBjbGVhbi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6KzogICAgICA6KzogICAgOis6ICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKzorICs6KyAgICAgICAgICs6KyAgICAgKi8KLyogICBCeTogY3BpZXJpIDxjcGllcmlAc3R1ZGVudC40Mi5mcj4gICAgICAgICAgICAgICsjKyAgKzorICAgICAgICsjKyAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIysjKyMrIysjKyAgICsjKyAgICAgICAgICAgKi8KLyogICBDcmVhdGVkOiAyMDE5LzAzLzE1IDEyOjA3OjE0IGJ5IGNwaWVyaSAgICAgICAgICAgICMrIyAgICAjKyMgICAgICAgICAgICAgKi8KLyogICBVcGRhdGVkOiAyMDE5LzA0LzEyIDEwOjI1OjA5IGJ5IGNwaWVyaSAgICAgICAgICAgIyMjICAgIyMjIyMjIyMuZnIgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KCiNpbmNsdWRlICJmdF9zc2wuaCIKCnZvaWQJY2xlYW5fZGF0YSh0X2RhdGEgKipkYXRhKQp7CglpZiAoKmRhdGEgIT0gTlVMTCkKCXsKCQlpZiAoKCpkYXRhKS0+bWFsbCA9PSAxKQoJCQlmdF9tZW1kZWwoKHZvaWQqKikmKCgqZGF0YSktPmRhdGEpKTsKCQlpZiAoKCpkYXRhKS0+Zl9oYXNoICE9IE5VTEwpCgkJewoJCQlmdF9tZW1kZWwoKHZvaWQqKikmKCgqZGF0YSktPmZfaGFzaC0+aCkpOwoJCQlmdF9tZW1kZWwoKHZvaWQqKikmKCgqZGF0YSktPmZfaGFzaCkpOwoJCX0KCQlmdF9tZW1kZWwoKHZvaWQqKilkYXRhKTsKCX0KfQoKdm9pZAljbGVhbl9wcm9nKHRfcGFyc2UgKnBhcnNlKQp7Cgl0X29wdAkqbmV4dDsKCXRfb3B0CSpsc3Q7CgoJbHN0ID0gcGFyc2UtPmxzdF9vcHRzOwoJd2hpbGUgKGxzdCAhPSBOVUxMKQoJewoJCWlmIChsc3QtPmRhdGEtPm1hbGwgPT0gMSkKCQkJZnRfbWVtZGVsKCh2b2lkKiopJihsc3QtPmRhdGEtPmRhdGEpKTsKCQlmdF9tZW1kZWwoKHZvaWQqKikmKGxzdC0+ZGF0YS0+Zl9oYXNoLT5oKSk7CgkJZnRfbWVtZGVsKCh2b2lkKiopJihsc3QtPmRhdGEtPmZfaGFzaCkpOwoJCWZ0X21lbWRlbCgodm9pZCoqKSYobHN0LT5kYXRhKSk7CgkJbmV4dCA9IGxzdC0+bmV4dDsKCQlmdF9tZW1kZWwoKHZvaWQqKikmKGxzdCkpOwoJCWxzdCA9IG5leHQ7Cgl9CglwYXJzZS0+bHN0X29wdHMgPSBOVUxMOwp9Cg== diff --git a/encode_mfile b/encode_mfile new file mode 100644 index 0000000..c486271 --- /dev/null +++ b/encode_mfile @@ -0,0 +1 @@ +IyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICMKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6OiAgICAgIDo6Ojo6Ojo6ICAgICMKIyAgICBNYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6KzogICAgICA6KzogICAgOis6ICAgICMKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKzorICs6KyAgICAgICAgICs6KyAgICAgICMKIyAgICBCeTogY3BpZXJpIDxjcGllcmlAc3R1ZGVudC40Mi5mcj4gICAgICAgICAgICAgICsjKyAgKzorICAgICAgICsjKyAgICAgICAgICMKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIysjKyMrIysjKyAgICsjKyAgICAgICAgICAgICMKIyAgICBDcmVhdGVkOiAyMDE4LzAzLzE1IDExOjIwOjI1IGJ5IGNwaWVyaSAgICAgICAgICAgICMrIyAgICAjKyMgICAgICAgICAgICAgICMKIyAgICBVcGRhdGVkOiAyMDE5LzA0LzE1IDEzOjQ3OjMxIGJ5IGNwaWVyaSAgICAgICAgICAgIyMjICAgIyMjIyMjIyMuZnIgICAgICAgICMKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICMKCk5BTUUJPQlmdF9zc2wKCkNDCQk9CWdjYwoKRVJST1IJPQktZzMgLWZsdG8gLWZzYW5pdGl6ZT1hZGRyZXNzIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyCgpvdmVycmlkZSBDRkxBR1MJKz0JLVdhbGwgLVdleHRyYSAtV2Vycm9yCgpDUFBGTEFHUz0JLUlpbmNsdWRlcwoKRkxBR1NGVAk9CS1MLi9saWJmdCAtbGZ0CgpTUkNfUEFUSD0Jc3JjcwoKT0JKX1BBVEg9CW9iagoKREVQUyA9CQlNYWtlZmlsZQkJCQlcCgkJCWluY2x1ZGVzL2Z0X3NzbC5oCQlcCgkJCWluY2x1ZGVzL2RlZmluZS5oCQlcCgkJCWluY2x1ZGVzL2NvbnN0YW50LmgJCVwKCQkJaW5jbHVkZXMvZW51bS5oCQkJXAoJCQlpbmNsdWRlcy9mdW5jdGlvbnMuaAlcCgkJCWluY2x1ZGVzL3N0cnVjdHVyZS5oCVwKCQkJaW5jbHVkZXMvaGFzaC9zaGEyNTYuaAlcCgkJCWluY2x1ZGVzL2hhc2gvaGFzaC5oCVwKCQkJaW5jbHVkZXMvaGFzaC9tZDUuaAkJXAoJCQlsaWJmdC9saWJmdC5hCgpTUkNfTkFNRT0gCW1haW4uYwkJCQkJCQlcCgkJCWNsZWFuLmMJCQkJCQkJXAoJCQl1c2FnZS5jCQkJCQkJCVwKCQkJcGFyc2luZy5jCQkJCQkJXAoJCQlnZXRfZGF0YS5jCQkJCQkJXAoJCQlsc3Rfb3B0LmMJCQkJCQlcCgkJCWhhc2gvaGFzaC5jCQkJCQkJXAoJCQloYXNoL2hhc2hfcGFyc2luZy5jCQkJCVwKCQkJaGFzaC9kaXNwbGF5X2hhc2guYwkJCQlcCgkJCWhhc2gvc2hhMjU2L3NoYTI1Ni5jCQkJXAoJCQloYXNoL3NoYTI1Ni9zaGEyNTZfdXRpbHMuYwkJXAoJCQloYXNoL21kNS9tZDVfdXRpbHMuYwkJCVwKCQkJaGFzaC9tZDUvbWQ1LmMJCQkJCVwKCQkJYmFzZTY0L2Jhc2U2NC5jCQkJCQlcCgkJCWJhc2U2NC9iYXNlNjRfZW5jb2RlLmMJCQlcCgkJCWJhc2U2NC9iYXNlNjRfZGVjb2RlLmMJCQlcCgkJCWJhc2U2NC9iYXNlNjRfcGFyc2luZy5jCQkJXAoJCQliYXNlNjQvYmFzZTY0X2hlbHBfcGFyc2luZy5jCVwKCk9CSl9OQU1FPQkkKFNSQ19OQU1FOi5jPS5vKQoKU1JDCQk9CSQoYWRkcHJlZml4ICQoU1JDX1BBVEgpLywkKFNSQ19OQU1FKSkKCk9CSgkJPQkkKGFkZHByZWZpeCAkKE9CSl9QQVRIKS8sJChPQkpfTkFNRSkpCgpOT05FID0gXDAzM1swbQpSRUQgPSBcMDMzWzMxbQpHUkVFTiA9IFwwMzNbMzJtCllFTExPVyA9IFwwMzNbMzNtCkJMVUUgPSBcMDMzWzM0bQpNQUdFTlRBID0gXDAzM1szNW0KQ1lBTiA9IFwwMzNbMzZtCgouUEhPTlk6CWFsbCBjbGVhbiBmY2xlYW4gcmUgZWNobyBub3JtCgphbGw6CQlMRlQgJChOQU1FKQoKJChOQU1FKToJbGliZnQgZWNobyAkKE9CSikKCQkJQCQoQ0MpICQoQ0ZMQUdTKSAkKEZMQUdTRlQpIC1vICQoTkFNRSkgJChPQkopICQoQ1BQRkxBR1MpCgkJCUBlY2hvICJcbiQoR1JFRU4pJChOQU1FKSByZWFkeSEkKE5PTkUpIgoKZWNobzoKCQkJQCBlY2hvIC1uIEdldHRpbmcgJChOQU1FKSByZWFkeQoKJChPQkpfUEFUSCkvJS5vOiAkKFNSQ19QQVRIKS8lLmMgJChERVBTKQoJCQlAbWtkaXIgJChkaXIgJEApIDI+IC9kZXYvbnVsbCB8fCB0cnVlCgkJCUAkKENDKSAkKENGTEFHUykgJChDUFBGTEFHUykgLWMgJDwgLW8gJEAKCQkJQGVjaG8gLW4gLgoKY2xlYW46CgkJCUBlY2hvICIkKFlFTExPVylDbGVhbmluZy4uLiQoTk9ORSkiCgkJCUBtYWtlIGNsZWFuIC1DIC4vbGliZnQvCgkJCUAvYmluL3JtIC1mICQoT0JKKQoJCQlAcm0gLXJmICQoT0JKX1BBVEgpIDI+IC9kZXYvbnVsbCB8fCB0cnVlCgpmY2xlYW46CQljbGVhbgoJCQlAbWFrZSBmY2xlYW4gLUMgLi9saWJmdC8KCQkJQGVjaG8gIiQoUkVEKUxpYmZ0LmEgZGVsZXRlZCQoTk9ORSkiCgkJCUAvYmluL3JtIC1mICQoTkFNRSkKCQkJQGVjaG8gIiQoUkVEKSQoTkFNRSkgZGVsZXRlZCAhJChOT05FKSIKCnJlOgkJCWZjbGVhbiBhbGwKCkxGVDoKCQlAbWFrZSAtQyAuL2xpYmZ0LzsKCQlAZWNobyAiXG4kKEdSRUVOKUxpYmZ0IHJlYWR5ISQoTk9ORSkiOwo= diff --git a/includes/base64/base64.h b/includes/base64/base64.h index a0b97a3..f97c9c8 100644 --- a/includes/base64/base64.h +++ b/includes/base64/base64.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/12 11:59:40 by cpieri #+# #+# */ -/* Updated: 2019/04/15 14:57:49 by cpieri ### ########.fr */ +/* Updated: 2019/04/26 16:59:21 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,33 +15,6 @@ # include "../libft/include/libft.h" -static const unsigned char g_base64_d[] = { - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 64, 64, 64, 65, 64, 64, 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, - 64, 64, 64, 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64 -}; - -static const char g_base64_c[] = -{ - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', - 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', - 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', - 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', - '8', '9', '+', '/' -}; - typedef struct s_base64_encode { uint8_t n0; @@ -50,6 +23,15 @@ typedef struct s_base64_encode uint8_t n3; } t_base64_encode; +typedef struct s_base64_decode +{ + uint32_t n0; + uint32_t n1; + uint32_t n2; + uint32_t n3; + uint32_t tmp; +} t_base64_decode; + uint8_t *base64_encode(uint8_t *msg, size_t len); uint8_t *base64_decode(uint8_t *msg, size_t len); diff --git a/includes/hash/md5.h b/includes/hash/md5.h index bf8a212..9c263b8 100644 --- a/includes/hash/md5.h +++ b/includes/hash/md5.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/06 12:16:22 by cpieri #+# #+# */ -/* Updated: 2019/04/11 16:49:28 by cpieri ### ########.fr */ +/* Updated: 2019/04/26 11:34:58 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,27 +20,6 @@ # define MD5_H2 0x98BADCFE # define MD5_H3 0x10325476 -static const uint32_t g_r_md5[64] = { - 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, - 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, - 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, - 10, 15, 21 -}; - -static const uint32_t g_k_md5[64] = { - 3614090360, 3905402710, 606105819, 3250441966, 4118548399, 1200080426, - 2821735955, 4249261313, 1770035416, 2336552879, 4294925233, 2304563134, - 1804603682, 4254626195, 2792965006, 1236535329, 4129170786, 3225465664, - 643717713, 3921069994, 3593408605, 38016083, 3634488961, 3889429448, - 568446438, 3275163606, 4107603335, 1163531501, 2850285829, 4243563512, - 1735328473, 2368359562, 4294588738, 2272392833, 1839030562, 4259657740, - 2763975236, 1272893353, 4139469664, 3200236656, 681279174, 3936430074, - 3572445317, 76029189, 3654602809, 3873151461, 530742520, 3299628645, - 4096336452, 1126891415, 2878612391, 4237533241, 1700485571, 2399980690, - 4293915773, 2240044497, 1873313359, 4264355552, 2734768916, 1309151649, - 4149444226, 3174756917, 718787259, 3951481745 -}; - typedef struct s_md5_utils { uint32_t f; diff --git a/includes/hash/sha256.h b/includes/hash/sha256.h index 3849c9c..9af5dec 100644 --- a/includes/hash/sha256.h +++ b/includes/hash/sha256.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/08 13:15:42 by cpieri #+# #+# */ -/* Updated: 2019/04/11 14:11:18 by cpieri ### ########.fr */ +/* Updated: 2019/04/26 11:34:56 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,20 +24,6 @@ # define SHA256_H6 0x1F83D9AB # define SHA256_H7 0x5BE0CD19 -static const uint32_t g_k_sha256[64] = { - 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, - 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, - 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, - 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, - 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, - 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, - 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, - 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, - 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, - 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, - 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 -}; - typedef struct s_sha256_utils { uint32_t s0; diff --git a/size_file b/size_file new file mode 100644 index 0000000..b70e7d6 --- /dev/null +++ b/size_file @@ -0,0 +1,6 @@ +[ft_ssl] cat auteur | wc -c des ✗ ✭ ✱ + 7 +[ft_ssl] cat Makefile | wc -c des ✗ ✭ ✱ + 2822 +[ft_ssl] cat srcs/clean.c | wc -c des ✗ ✭ ✱ + 1591 diff --git a/srcs/base64/base64.c b/srcs/base64/base64.c index a59b936..a9f94dc 100644 --- a/srcs/base64/base64.c +++ b/srcs/base64/base64.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/12 16:53:29 by cpieri #+# #+# */ -/* Updated: 2019/04/22 10:03:25 by cpieri ### ########.fr */ +/* Updated: 2019/04/26 14:54:52 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/srcs/base64/base64_decode.c b/srcs/base64/base64_decode.c index 079a47e..34fa680 100644 --- a/srcs/base64/base64_decode.c +++ b/srcs/base64/base64_decode.c @@ -6,32 +6,77 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/15 13:41:31 by cpieri #+# #+# */ -/* Updated: 2019/04/22 09:53:34 by cpieri ### ########.fr */ +/* Updated: 2019/04/26 17:26:53 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "base64/base64.h" #include -static size_t b64_len_decode(uint8_t *s) +static const unsigned char g_base64_d[] = { + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 64, 64, 64, 65, 64, 64, 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, + 64, 64, 64, 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64 +}; + +static size_t b64_len_decode(uint8_t *msg, size_t len) { size_t new_len; - uint8_t *tmp; - tmp = s; - while (g_base64_d[*(tmp++)] <= 63); - new_len = (tmp - s) - 1; - printf("new_len = %zu\n", new_len); - return (((new_len + 3) / 4) * 3); + new_len = (len / 4) * 3; + len -= 2; + while (msg[len--] == '=') + new_len--; + return (new_len + 1); +} + +static void b64_decode_val(t_base64_decode *n, uint8_t *msg, size_t *i) +{ + n->n0 = (msg[*i] == '=') ? 0 & *i + 0 : g_base64_d[msg[*i + 0]]; + n->n1 = (msg[*i] == '=') ? 0 & *i + 1 : g_base64_d[msg[*i + 1]]; + n->n2 = (msg[*i] == '=') ? 0 & *i + 2 : g_base64_d[msg[*i + 2]]; + n->n3 = (msg[*i] == '=') ? 0 & *i + 3 : g_base64_d[msg[*i + 3]]; + n->tmp = (n->n0 << 18) + (n->n1 << 12) + (n->n2 << 6) + (n->n3); + *i += 4; } uint8_t *base64_decode(uint8_t *msg, size_t len) { - size_t len_plain; + t_base64_decode n; + size_t len_plain; + uint8_t *plain_msg; + size_t i; + size_t j; - (void)len; - printf("decode func\n"); - len_plain = b64_len_decode(msg); - printf("len_plain = %zu\n", len_plain); - return (msg); + i = 0; + j = 0; + len_plain = b64_len_decode(msg, len); + if (!(plain_msg = (uint8_t*)ft_memalloc(sizeof(uint8_t) * len_plain))) + return (NULL); + while (i < len) + { + if (ft_isspace(msg[i]) == 1) + i++; + else + b64_decode_val(&n, msg, &i); + if (j + 3 < len_plain) + { + plain_msg[j++] = (n.tmp >> 16) & 0xff; + plain_msg[j++] = (n.tmp >> 8) & 0xff; + plain_msg[j++] = (n.tmp) & 0xff; + } + } + return (plain_msg); } diff --git a/srcs/base64/base64_encode.c b/srcs/base64/base64_encode.c index bb23c01..d103db7 100644 --- a/srcs/base64/base64_encode.c +++ b/srcs/base64/base64_encode.c @@ -6,12 +6,21 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/15 11:29:50 by cpieri #+# #+# */ -/* Updated: 2019/04/15 13:41:51 by cpieri ### ########.fr */ +/* Updated: 2019/04/26 11:34:05 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "base64/base64.h" +static const char g_base64_c[] = +{ + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', + 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', + 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', '+', '/' +}; + static size_t b64_len_encode(size_t len) { return (((len + 2) / 3 * 4) + 1); diff --git a/srcs/base64/base64_help_parsing.c b/srcs/base64/base64_help_parsing.c index 112050b..a951e3f 100644 --- a/srcs/base64/base64_help_parsing.c +++ b/srcs/base64/base64_help_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/12 11:39:36 by cpieri #+# #+# */ -/* Updated: 2019/04/15 11:24:16 by cpieri ### ########.fr */ +/* Updated: 2019/04/26 11:58:27 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,7 +17,14 @@ void get_b64_ed(t_data **data, t_flags *flags, char *fd, char c) { if (*data != NULL) clean_data(data); - flags->b64_flags |= (c == 'd') ? e_base64_decode : e_base64_encode; + if (c == 'd') + { + flags->b64_flags |= e_base64_decode; + if ((flags->b64_flags & e_base64_encode) == e_base64_encode) + flags->b64_flags = (flags->b64_flags ^ e_base64_encode); + } + else if (c == 'e' && (flags->b64_flags & e_base64_decode) == 0) + flags->b64_flags |= e_base64_encode; if (fd == NULL) *data = get_data(0, NULL); else diff --git a/srcs/base64/base64_parsing.c b/srcs/base64/base64_parsing.c index 0c4157a..0b50833 100644 --- a/srcs/base64/base64_parsing.c +++ b/srcs/base64/base64_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 16:56:03 by cpieri #+# #+# */ -/* Updated: 2019/04/15 11:24:31 by cpieri ### ########.fr */ +/* Updated: 2019/04/26 11:42:53 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -26,7 +26,8 @@ t_data *get_b64_opt(char **av, int *now, t_flags *flags, char **output) while (++i < len_now) { if (av[*now][i] == 'e' || av[*now][i] == 'd') - get_b64_ed(&data, flags, NULL, av[*now][i]); + get_b64_ed(&data, flags, + (av[*now + 1] != NULL ? av[*now + 1] : NULL), av[*now][i]); else if (av[*now][i] == 'i') get_b64_i(&data, flags, av[(*now) + 1], now); else if (av[*now][i] == 'o') diff --git a/srcs/hash/md5/md5.c b/srcs/hash/md5/md5.c index 8306c52..921cfea 100644 --- a/srcs/hash/md5/md5.c +++ b/srcs/hash/md5/md5.c @@ -6,12 +6,33 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/25 15:18:34 by cpieri #+# #+# */ -/* Updated: 2019/04/11 14:12:25 by cpieri ### ########.fr */ +/* Updated: 2019/04/26 11:34:23 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "hash/md5.h" +static const uint32_t g_r_md5[64] = { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, + 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, + 10, 15, 21 +}; + +static const uint32_t g_k_md5[64] = { + 3614090360, 3905402710, 606105819, 3250441966, 4118548399, 1200080426, + 2821735955, 4249261313, 1770035416, 2336552879, 4294925233, 2304563134, + 1804603682, 4254626195, 2792965006, 1236535329, 4129170786, 3225465664, + 643717713, 3921069994, 3593408605, 38016083, 3634488961, 3889429448, + 568446438, 3275163606, 4107603335, 1163531501, 2850285829, 4243563512, + 1735328473, 2368359562, 4294588738, 2272392833, 1839030562, 4259657740, + 2763975236, 1272893353, 4139469664, 3200236656, 681279174, 3936430074, + 3572445317, 76029189, 3654602809, 3873151461, 530742520, 3299628645, + 4096336452, 1126891415, 2878612391, 4237533241, 1700485571, 2399980690, + 4293915773, 2240044497, 1873313359, 4264355552, 2734768916, 1309151649, + 4149444226, 3174756917, 718787259, 3951481745 +}; + static void padding_md5(t_padding *p, char *data, size_t len) { int i; diff --git a/srcs/hash/sha256/sha256.c b/srcs/hash/sha256/sha256.c index 7ff21b0..7b9d080 100644 --- a/srcs/hash/sha256/sha256.c +++ b/srcs/hash/sha256/sha256.c @@ -6,12 +6,26 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/18 10:47:43 by cpieri #+# #+# */ -/* Updated: 2019/04/11 14:12:18 by cpieri ### ########.fr */ +/* Updated: 2019/04/26 11:34:43 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "hash/sha256.h" +static const uint32_t g_k_sha256[64] = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, + 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, + 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, + 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, + 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, + 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +}; + static void padding_sha256(t_padding *p, void *data, size_t len) { int i; From 4e2c6bd9693af8c2816c988b78bca04b073aa9a4 Mon Sep 17 00:00:00 2001 From: Louise P Date: Mon, 29 Apr 2019 12:29:39 +0200 Subject: [PATCH 13/71] base64 printing okay --- Makefile | 3 ++- includes/constant.h | 4 ++-- includes/functions.h | 3 ++- includes/structure.h | 3 ++- srcs/base64/base64.c | 11 ++++++----- srcs/base64/base64_display.c | 24 ++++++++++++++++++++++++ srcs/hash/display_hash.c | 9 ++++++--- srcs/hash/hash.c | 6 +++--- 8 files changed, 47 insertions(+), 16 deletions(-) create mode 100644 srcs/base64/base64_display.c diff --git a/Makefile b/Makefile index 1b55ab2..0d47925 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/03/15 11:20:25 by cpieri #+# #+# # -# Updated: 2019/04/15 13:47:31 by cpieri ### ########.fr # +# Updated: 2019/04/29 12:21:12 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -56,6 +56,7 @@ SRC_NAME= main.c \ base64/base64_decode.c \ base64/base64_parsing.c \ base64/base64_help_parsing.c \ + base64/base64_display.c \ OBJ_NAME= $(SRC_NAME:.c=.o) diff --git a/includes/constant.h b/includes/constant.h index 1c66be1..8883cc6 100644 --- a/includes/constant.h +++ b/includes/constant.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:15:35 by cpieri #+# #+# */ -/* Updated: 2019/04/12 17:13:28 by cpieri ### ########.fr */ +/* Updated: 2019/04/29 12:20:32 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,7 +17,7 @@ static const t_parse g_all_cmd[] = { {"md5", "MD5", e_hash, md5, hash_opts, printing_hash, NULL}, {"sha256", "SHA256", e_hash, sha256, hash_opts, printing_hash, NULL}, - {"base64", "base64", e_cipher, base64, base64_opts, NULL, NULL}, + {"base64", "base64", e_cipher, base64, base64_opts, printing_base64, NULL}, {NULL, NULL, 0, NULL, NULL, NULL, NULL}, }; diff --git a/includes/functions.h b/includes/functions.h index 17edbbd..a6c043c 100644 --- a/includes/functions.h +++ b/includes/functions.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:44:05 by cpieri #+# #+# */ -/* Updated: 2019/04/12 17:14:32 by cpieri ### ########.fr */ +/* Updated: 2019/04/29 12:14:02 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -41,6 +41,7 @@ void print_lst(t_opt **lst); */ void hashing(t_parse *parse); void printing_hash(t_data *data, const char *hash_type, t_flags flags); +void printing_base64(t_data *data, const char *hash_type, t_flags flags); /* ** Functions for Exit, Clean, Error diff --git a/includes/structure.h b/includes/structure.h index df240f2..7d4293f 100644 --- a/includes/structure.h +++ b/includes/structure.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:27:48 by cpieri #+# #+# */ -/* Updated: 2019/04/11 18:49:29 by cpieri ### ########.fr */ +/* Updated: 2019/04/29 12:10:34 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,6 +20,7 @@ typedef struct s_data size_t len_data; int mall; t_hash *f_hash; + void *data_2_print; } t_data; typedef struct s_check_flags diff --git a/srcs/base64/base64.c b/srcs/base64/base64.c index a9f94dc..1cc0cba 100644 --- a/srcs/base64/base64.c +++ b/srcs/base64/base64.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/12 16:53:29 by cpieri #+# #+# */ -/* Updated: 2019/04/26 14:54:52 by cpieri ### ########.fr */ +/* Updated: 2019/04/29 12:21:37 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,13 +17,14 @@ void *base64(void *opts, size_t len_opts) { t_opt *opt; + uint8_t *ret; (void)len_opts; + ret = NULL; opt = (t_opt*)opts; - print_lst(&opt); if ((opt->flags.b64_flags & e_base64_encode) == e_base64_encode) - base64_encode((uint8_t*)opt->data->data, opt->data->len_data); + ret = base64_encode((uint8_t*)opt->data->data, opt->data->len_data); else if ((opt->flags.b64_flags & e_base64_decode) == e_base64_decode) - base64_decode((uint8_t*)opt->data->data, opt->data->len_data); - return (opts); + ret = base64_decode((uint8_t*)opt->data->data, opt->data->len_data); + return (ret); } diff --git a/srcs/base64/base64_display.c b/srcs/base64/base64_display.c new file mode 100644 index 0000000..2716677 --- /dev/null +++ b/srcs/base64/base64_display.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* base64_display.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/04/29 12:13:14 by cpieri #+# #+# */ +/* Updated: 2019/04/29 12:18:28 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_ssl.h" + +void printing_base64(t_data *data, const char *name, t_flags flags) +{ + const char *msg_print; + + msg_print = (const char *)data->data_2_print; + (void)flags; + ft_putstr(name); + ft_putstr(": "); + ft_putendl(msg_print); +} \ No newline at end of file diff --git a/srcs/hash/display_hash.c b/srcs/hash/display_hash.c index 21f4e4b..b93fa7c 100644 --- a/srcs/hash/display_hash.c +++ b/srcs/hash/display_hash.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* display.c :+: :+: :+: */ +/* display_hash.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/06 12:14:10 by cpieri #+# #+# */ -/* Updated: 2019/04/11 12:30:48 by cpieri ### ########.fr */ +/* Updated: 2019/04/29 12:12:10 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -42,6 +42,9 @@ static void print_hash(t_hash *f_hash) void printing_hash(t_data *data, const char *hash_type, t_flags flags) { + t_hash *f_hash; + + f_hash = (t_hash*)data->data_2_print; if (flags.r == 0 && flags.q == 0 && data->fd_name != NULL) { ft_putstr(hash_type); @@ -51,7 +54,7 @@ void printing_hash(t_data *data, const char *hash_type, t_flags flags) } else if (flags.p == 1) ft_putstr(data->data); - print_hash(data->f_hash); + print_hash(f_hash); if (flags.r == 1) { ft_putchar(' '); diff --git a/srcs/hash/hash.c b/srcs/hash/hash.c index 8ae3588..0d4b1ba 100644 --- a/srcs/hash/hash.c +++ b/srcs/hash/hash.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/12 13:01:28 by cpieri #+# #+# */ -/* Updated: 2019/04/11 16:50:25 by cpieri ### ########.fr */ +/* Updated: 2019/04/29 12:19:58 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,10 +20,10 @@ void hashing(t_parse *parse) while (lst != NULL) { if (parse->is_ciphash == e_hash) - lst->data->f_hash = (t_hash*)parse->func(lst->data->data, + lst->data->data_2_print = (t_hash*)parse->func(lst->data->data, lst->data->len_data); else if (parse->is_ciphash == e_cipher) - parse->func(lst, 0); + lst->data->data_2_print = parse->func(lst, 0); if (parse->fprint != NULL) parse->fprint(lst->data, parse->name, lst->flags); lst = lst->next; From 002dd7a1b6e0c28f63c8fae57a4f82e1298af2d5 Mon Sep 17 00:00:00 2001 From: Louise P Date: Mon, 29 Apr 2019 15:38:20 +0200 Subject: [PATCH 14/71] printing okay but base64 decode don't working --- Makefile | 5 +- includes/functions.h | 40 ++++++++++------ includes/structure.h | 4 +- srcs/base64/base64_decode.c | 18 ++++++-- srcs/base64/base64_display.c | 17 +++++-- srcs/base64/base64_help_parsing.c | 2 +- srcs/{hash/hash.c => dispatch.c} | 6 +-- srcs/get_data.c | 39 +--------------- srcs/hash/display_hash.c | 2 +- srcs/help.c | 77 +++++++++++++++++++++++++++++++ srcs/lst_opt.c | 10 ++-- srcs/main.c | 4 +- toto | 1 + toto_space | 1 + 14 files changed, 150 insertions(+), 76 deletions(-) rename srcs/{hash/hash.c => dispatch.c} (88%) create mode 100644 srcs/help.c create mode 100644 toto create mode 100644 toto_space diff --git a/Makefile b/Makefile index 0d47925..934ea70 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/03/15 11:20:25 by cpieri #+# #+# # -# Updated: 2019/04/29 12:21:12 by cpieri ### ########.fr # +# Updated: 2019/04/29 14:21:49 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -43,8 +43,9 @@ SRC_NAME= main.c \ usage.c \ parsing.c \ get_data.c \ + help.c \ lst_opt.c \ - hash/hash.c \ + dispatch.c \ hash/hash_parsing.c \ hash/display_hash.c \ hash/sha256/sha256.c \ diff --git a/includes/functions.h b/includes/functions.h index a6c043c..563c188 100644 --- a/includes/functions.h +++ b/includes/functions.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:44:05 by cpieri #+# #+# */ -/* Updated: 2019/04/29 12:14:02 by cpieri ### ########.fr */ +/* Updated: 2019/04/29 14:20:43 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,19 +14,40 @@ # define FUNCTIONS_H /* -** Functions for Parsing +** Functions Dispatchers */ t_parse parsing(const int ac, char **av); +void dispatch(t_parse *parse); + +/* +** Functions for Parsing +*/ t_opt *hash_opts(const int ac, char **av, t_opt *opts, int now); t_opt *base64_opts(const int ac, char **av, t_opt *opts, int now); +void get_b64_ed(t_data **data, t_flags *flags, char *fd, char c); +void get_b64_i(t_data **data, t_flags *flags, char *fd, int *now); +void *base64(void *opts, size_t len_opts); + +/* +** Functions for Printing +*/ +void printing_hash(t_data *data, const char *hash_type, t_flags flags); +void printing_base64(t_data *data, const char *hash_type, t_flags flags); + +/* +** Functions for Open and Close +*/ int open_fd(const char *file); +int open_write_fd(const char *file); +int close_fd(const int fd); +int reopen_fd(const int current_fd, const char *file); + +/* +** Functions for get File, Data, or String +*/ t_data *get_data(const int fd, const char *fd_name); t_data *get_file(const int fd, const char *fd_name); t_data *get_string(char *s); -void get_b64_ed(t_data **data, t_flags *flags, char *fd, char c); -void get_b64_i(t_data **data, t_flags *flags, char *fd, int *now); - -void *base64(void *opts, size_t len_opts); /* ** Functions for Lst_opt @@ -36,13 +57,6 @@ t_opt *new_opt(t_flags flags, t_data *data); void add_to_end_lst(t_opt *new, t_opt **lst); void print_lst(t_opt **lst); -/* -** Functions for Hashing msg and display final hash -*/ -void hashing(t_parse *parse); -void printing_hash(t_data *data, const char *hash_type, t_flags flags); -void printing_base64(t_data *data, const char *hash_type, t_flags flags); - /* ** Functions for Exit, Clean, Error */ diff --git a/includes/structure.h b/includes/structure.h index 7d4293f..cd6b424 100644 --- a/includes/structure.h +++ b/includes/structure.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:27:48 by cpieri #+# #+# */ -/* Updated: 2019/04/29 12:10:34 by cpieri ### ########.fr */ +/* Updated: 2019/04/29 14:08:43 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,7 @@ typedef struct s_data { + const char *fd_output; const char *fd_name; char *data; size_t len_data; @@ -40,7 +41,6 @@ typedef struct s_flags typedef struct s_opt { - const char *fd_output; t_data *data; t_flags flags; struct s_opt *next; diff --git a/srcs/base64/base64_decode.c b/srcs/base64/base64_decode.c index 34fa680..44ed7c4 100644 --- a/srcs/base64/base64_decode.c +++ b/srcs/base64/base64_decode.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/15 13:41:31 by cpieri #+# #+# */ -/* Updated: 2019/04/26 17:26:53 by cpieri ### ########.fr */ +/* Updated: 2019/04/29 15:36:35 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -37,12 +37,14 @@ static size_t b64_len_decode(uint8_t *msg, size_t len) new_len = (len / 4) * 3; len -= 2; + printf("msg[len]: %c\n", msg[len]); while (msg[len--] == '=') new_len--; + printf("new_len: %zu\n", new_len); return (new_len + 1); } -static void b64_decode_val(t_base64_decode *n, uint8_t *msg, size_t *i) + void b64_decode_val(t_base64_decode *n, uint8_t *msg, size_t *i) { n->n0 = (msg[*i] == '=') ? 0 & *i + 0 : g_base64_d[msg[*i + 0]]; n->n1 = (msg[*i] == '=') ? 0 & *i + 1 : g_base64_d[msg[*i + 1]]; @@ -59,6 +61,8 @@ uint8_t *base64_decode(uint8_t *msg, size_t len) uint8_t *plain_msg; size_t i; size_t j; + size_t p; + size_t l_shift = 18; i = 0; j = 0; @@ -69,14 +73,18 @@ uint8_t *base64_decode(uint8_t *msg, size_t len) { if (ft_isspace(msg[i]) == 1) i++; - else - b64_decode_val(&n, msg, &i); - if (j + 3 < len_plain) + n.n0 = g_base64_d[msg[i]]; + n.tmp += (n.n0 << l_shift); + p++; + if (p == 4 && j + 3 < len_plain) { plain_msg[j++] = (n.tmp >> 16) & 0xff; plain_msg[j++] = (n.tmp >> 8) & 0xff; plain_msg[j++] = (n.tmp) & 0xff; + p = 0; } + l_shift += (l_shift == 0) ? 18 : -6; + i++; } return (plain_msg); } diff --git a/srcs/base64/base64_display.c b/srcs/base64/base64_display.c index 2716677..4e461b3 100644 --- a/srcs/base64/base64_display.c +++ b/srcs/base64/base64_display.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/29 12:13:14 by cpieri #+# #+# */ -/* Updated: 2019/04/29 12:18:28 by cpieri ### ########.fr */ +/* Updated: 2019/04/29 14:09:21 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,10 +15,17 @@ void printing_base64(t_data *data, const char *name, t_flags flags) { const char *msg_print; + int fd; + fd = 1; + (void)name; msg_print = (const char *)data->data_2_print; - (void)flags; - ft_putstr(name); - ft_putstr(": "); - ft_putendl(msg_print); + if ((flags.b64_flags & e_base64_outputf) == e_base64_outputf + && data->fd_output != NULL) + fd = open_write_fd(data->fd_output); + if (fd == FAILURE) + print_error(data->fd_output); + ft_putendl_fd(msg_print, fd); + if ((flags.b64_flags & e_base64_outputf) == e_base64_outputf) + close_fd(fd); } \ No newline at end of file diff --git a/srcs/base64/base64_help_parsing.c b/srcs/base64/base64_help_parsing.c index a951e3f..f65887c 100644 --- a/srcs/base64/base64_help_parsing.c +++ b/srcs/base64/base64_help_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/12 11:39:36 by cpieri #+# #+# */ -/* Updated: 2019/04/26 11:58:27 by cpieri ### ########.fr */ +/* Updated: 2019/04/29 13:37:02 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/srcs/hash/hash.c b/srcs/dispatch.c similarity index 88% rename from srcs/hash/hash.c rename to srcs/dispatch.c index 0d4b1ba..097ef88 100644 --- a/srcs/hash/hash.c +++ b/srcs/dispatch.c @@ -1,18 +1,18 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* hash.c :+: :+: :+: */ +/* dispatch.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/12 13:01:28 by cpieri #+# #+# */ -/* Updated: 2019/04/29 12:19:58 by cpieri ### ########.fr */ +/* Updated: 2019/04/29 14:21:31 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" -void hashing(t_parse *parse) +void dispatch(t_parse *parse) { t_opt *lst; diff --git a/srcs/get_data.c b/srcs/get_data.c index 9e60290..0325971 100644 --- a/srcs/get_data.c +++ b/srcs/get_data.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* get_data.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: cpieri +#+ +:+ +#+ */ +/* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/08 12:03:54 by cpieri #+# #+# */ -/* Updated: 2019/04/05 13:58:14 by cpieri ### ########.fr */ +/* Updated: 2019/04/29 14:16:13 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,41 +28,6 @@ t_data *get_string(char *s) return (ret); } -int open_fd(const char *file) -{ - int fd; - char *tmp; - - fd = open(file, O_RDONLY); - tmp = NULL; - if (fd == FAILURE) - { - print_error(file); - return (FAILURE); - } - if (read(fd, tmp, 0) == FAILURE) - { - if (close(fd) != 0) - exit_error(); - print_error(file); - return (FAILURE); - } - return (fd); -} - -static int reopen_fd(const int current_fd, const char *file) -{ - int new_fd; - - if (close(current_fd) != 0) - exit_error(); - if ((new_fd = open(file, O_RDONLY)) == FAILURE) - { - print_error(file); - return (FAILURE); - } - return (new_fd); -} t_data *get_file(const int fd, const char *fd_name) { diff --git a/srcs/hash/display_hash.c b/srcs/hash/display_hash.c index b93fa7c..2872ac9 100644 --- a/srcs/hash/display_hash.c +++ b/srcs/hash/display_hash.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/06 12:14:10 by cpieri #+# #+# */ -/* Updated: 2019/04/29 12:12:10 by cpieri ### ########.fr */ +/* Updated: 2019/04/29 14:08:50 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/srcs/help.c b/srcs/help.c new file mode 100644 index 0000000..61fd62b --- /dev/null +++ b/srcs/help.c @@ -0,0 +1,77 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* help.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/04/29 13:37:15 by cpieri #+# #+# */ +/* Updated: 2019/04/29 14:16:56 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include "ft_ssl.h" + +int open_write_fd(const char *file) +{ + int fd; + + fd = open(file, O_WRONLY); + if (fd == FAILURE) + { + fd = open(file, O_CREAT | O_WRONLY); + if (fd == FAILURE) + { + print_error(file); + return (FAILURE); + } + } + return (fd); +} + +int open_fd(const char *file) +{ + int fd; + char *tmp; + + fd = open(file, O_RDONLY); + tmp = NULL; + if (fd == FAILURE) + { + print_error(file); + return (FAILURE); + } + if (read(fd, tmp, 0) == FAILURE) + { + if (close(fd) != 0) + exit_error(); + print_error(file); + return (FAILURE); + } + return (fd); +} + +int reopen_fd(const int current_fd, const char *file) +{ + int new_fd; + + if (close(current_fd) != 0) + exit_error(); + if ((new_fd = open(file, O_RDONLY)) == FAILURE) + { + print_error(file); + return (FAILURE); + } + return (new_fd); +} + +int close_fd(const int fd) +{ + if (close(fd) != 0) + { + print_error("base64 close"); + return (FAILURE); + } + return (SUCCESS); +} \ No newline at end of file diff --git a/srcs/lst_opt.c b/srcs/lst_opt.c index 01a7617..a5a9443 100644 --- a/srcs/lst_opt.c +++ b/srcs/lst_opt.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/08 17:29:55 by cpieri #+# #+# */ -/* Updated: 2019/04/12 14:21:37 by cpieri ### ########.fr */ +/* Updated: 2019/04/29 13:42:50 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,10 +22,10 @@ void print_lst(t_opt **lst) ft_putstr("data to crypt: "); ft_memput(tmp->data->data, tmp->data->len_data); ft_membits(&tmp->flags.b64_flags, 0, sizeof(uint32_t)); - if (tmp->fd_output != NULL) + if (tmp->data->fd_output != NULL) { ft_putstr("fd to output: "); - ft_putendl(tmp->fd_output); + ft_putendl(tmp->data->fd_output); } tmp = tmp->next; } @@ -57,7 +57,7 @@ t_opt *new_opt(t_flags flags, t_data *data) new->next = NULL; new->data = data; new->flags = flags; - new->fd_output = NULL; + new->data->fd_output = NULL; return (new); } @@ -72,6 +72,6 @@ t_opt *new_opt_fd(t_flags flags, t_data *data, char *fd) new->next = NULL; new->data = data; new->flags = flags; - new->fd_output = (fd != NULL) ? fd : NULL; + new->data->fd_output = (fd != NULL) ? fd : NULL; return (new); } diff --git a/srcs/main.c b/srcs/main.c index f0a511f..15e0a75 100644 --- a/srcs/main.c +++ b/srcs/main.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/24 17:05:16 by cpieri #+# #+# */ -/* Updated: 2019/04/15 13:45:01 by cpieri ### ########.fr */ +/* Updated: 2019/04/29 14:20:50 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,7 +19,7 @@ int main(int ac, char **av) if (ac < 2) print_usage(1, NULL); parse = parsing(ac, av); - hashing(&parse); + dispatch(&parse); clean_prog(&parse); return (0); } diff --git a/toto b/toto new file mode 100644 index 0000000..fc59c04 --- /dev/null +++ b/toto @@ -0,0 +1 @@ +dG90bwo= diff --git a/toto_space b/toto_space new file mode 100644 index 0000000..69cc25c --- /dev/null +++ b/toto_space @@ -0,0 +1 @@ +dG 90bw o = From dc6f5be31b391d9592bd11e066e7ad08c3645707 Mon Sep 17 00:00:00 2001 From: Louise P Date: Mon, 29 Apr 2019 19:23:17 +0200 Subject: [PATCH 15/71] debug b64 decode --- srcs/base64/base64_decode.c | 120 +++++++++++++++++++++++++----------- 1 file changed, 84 insertions(+), 36 deletions(-) diff --git a/srcs/base64/base64_decode.c b/srcs/base64/base64_decode.c index 44ed7c4..131f67d 100644 --- a/srcs/base64/base64_decode.c +++ b/srcs/base64/base64_decode.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/15 13:41:31 by cpieri #+# #+# */ -/* Updated: 2019/04/29 15:36:35 by cpieri ### ########.fr */ +/* Updated: 2019/04/29 19:23:03 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,60 +31,108 @@ static const unsigned char g_base64_d[] = { 64 }; -static size_t b64_len_decode(uint8_t *msg, size_t len) +static size_t b64_decode_len(uint8_t *msg, size_t len) { size_t new_len; new_len = (len / 4) * 3; len -= 2; - printf("msg[len]: %c\n", msg[len]); + // printf("msg[len]: %c\n", msg[len]); while (msg[len--] == '=') new_len--; - printf("new_len: %zu\n", new_len); + // printf("new_len: %zu\n", new_len); return (new_len + 1); } - void b64_decode_val(t_base64_decode *n, uint8_t *msg, size_t *i) +uint32_t b64_decode_val(uint8_t *msg, size_t *i, size_t len) { - n->n0 = (msg[*i] == '=') ? 0 & *i + 0 : g_base64_d[msg[*i + 0]]; - n->n1 = (msg[*i] == '=') ? 0 & *i + 1 : g_base64_d[msg[*i + 1]]; - n->n2 = (msg[*i] == '=') ? 0 & *i + 2 : g_base64_d[msg[*i + 2]]; - n->n3 = (msg[*i] == '=') ? 0 & *i + 3 : g_base64_d[msg[*i + 3]]; - n->tmp = (n->n0 << 18) + (n->n1 << 12) + (n->n2 << 6) + (n->n3); - *i += 4; + size_t p; + uint32_t tmp; + int l_shift; + + p = 0; + l_shift = 18; + tmp = 0; + while (p < 4 && *i < len) + { + if (ft_isspace(msg[*i]) == 1) + *i += 1; + else + { + tmp += ((msg[*i] == '=') ? 0 & *i : g_base64_d[msg[*i]]) << l_shift; + l_shift += (l_shift == 0) ? 18 : -6; + } + *i += 1; + p++; + } + return (tmp); } uint8_t *base64_decode(uint8_t *msg, size_t len) { - t_base64_decode n; - size_t len_plain; - uint8_t *plain_msg; - size_t i; - size_t j; - size_t p; - size_t l_shift = 18; + uint8_t *plain_msg; + size_t len_plain; + size_t i; + size_t j = 0; + uint32_t tmp; - i = 0; - j = 0; - len_plain = b64_len_decode(msg, len); + i = -1; + len_plain = b64_decode_len(msg, len); if (!(plain_msg = (uint8_t*)ft_memalloc(sizeof(uint8_t) * len_plain))) return (NULL); - while (i < len) + while (j < len_plain && i < len) { - if (ft_isspace(msg[i]) == 1) - i++; - n.n0 = g_base64_d[msg[i]]; - n.tmp += (n.n0 << l_shift); - p++; - if (p == 4 && j + 3 < len_plain) - { - plain_msg[j++] = (n.tmp >> 16) & 0xff; - plain_msg[j++] = (n.tmp >> 8) & 0xff; - plain_msg[j++] = (n.tmp) & 0xff; - p = 0; - } - l_shift += (l_shift == 0) ? 18 : -6; - i++; + tmp = b64_decode_val(msg, &i, len); } return (plain_msg); } + +// uint8_t *base64_decode(uint8_t *msg, size_t len) +// { +// t_base64_decode n; +// size_t len_plain; +// uint8_t *plain_msg; +// size_t i; +// size_t j; +// size_t p = 0; +// size_t l_shift = 18; +// size_t r_shift = 16; + +// i = 0; +// j = 0; +// n = (t_base64_decode){0,0,0,0,0}; +// len_plain = b64_len_decode(msg, len); +// if (!(plain_msg = (uint8_t*)ft_memalloc(sizeof(uint8_t) * len_plain))) +// return (NULL); +// while (i < len) +// { +// if (ft_isspace(msg[i]) == 1) +// i++; +// else +// { +// n.tmp += g_base64_d[msg[i]] << l_shift; +// printf("l_shift: %zu\n", l_shift); +// ft_membits(&(n.tmp), 0, sizeof(uint32_t)); +// l_shift += (l_shift == 0) ? 18 : -6; +// p++; +// if (p == 4) +// { +// printf("here\n"); +// while (j < (len_plain - 1)) +// { +// printf("r_shift: %zu\n", r_shift); +// plain_msg[j++] = (n.tmp >> r_shift) & 0xff; +// if (r_shift == 0) +// break ; +// else +// r_shift -= 8; +// } +// r_shift = 16; +// p = 0; +// n.tmp = 0; +// } +// i++; +// } +// } +// return (plain_msg); +// } From 2b9418998782e0f6e58d8c686e48cfb7c897494f Mon Sep 17 00:00:00 2001 From: Louise P Date: Tue, 30 Apr 2019 15:53:36 +0200 Subject: [PATCH 16/71] Base64 debug Debug --- libft/include/libft.h | 4 +- libft/srcs/ft_isspace.c | 10 +-- srcs/base64/base64_decode.c | 121 ++++++++++++++--------------------- srcs/base64/base64_display.c | 6 +- srcs/get_data.c | 4 +- srcs/help.c | 4 +- 6 files changed, 60 insertions(+), 89 deletions(-) diff --git a/libft/include/libft.h b/libft/include/libft.h index b8985c6..8051cfe 100644 --- a/libft/include/libft.h +++ b/libft/include/libft.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/09 16:47:24 by tmilon #+# #+# */ -/* Updated: 2019/04/11 19:15:01 by cpieri ### ########.fr */ +/* Updated: 2019/04/30 11:21:18 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -54,7 +54,7 @@ int ft_isalpha(int c); int ft_isascii(int c); int ft_isdigit(int c); int ft_isprint(int c); -int ft_isspace(int c); +int ft_isspace(char c); int ft_memcmp(const void *s1, const void *s2, size_t n); int ft_strcmp(const char *s1, const char *s2); int ft_strequ(char const *s1, char const *s2); diff --git a/libft/srcs/ft_isspace.c b/libft/srcs/ft_isspace.c index bcb1378..4733a14 100644 --- a/libft/srcs/ft_isspace.c +++ b/libft/srcs/ft_isspace.c @@ -3,19 +3,19 @@ /* ::: :::::::: */ /* ft_isspace.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: cpieri +#+ +:+ +#+ */ +/* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/10 16:36:02 by cpieri #+# #+# */ -/* Updated: 2019/03/22 15:33:06 by cpieri ### ########.fr */ +/* Updated: 2019/04/30 11:21:02 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "libft.h" -int ft_isspace(int c) +int ft_isspace(char c) { - if (c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r' - || c == ' ') + if (c == ' ' || c == '\t' || c == '\n' || c == '\v' || + c == '\f' || c == '\r') return (1); return (0); } diff --git a/srcs/base64/base64_decode.c b/srcs/base64/base64_decode.c index 131f67d..511c84b 100644 --- a/srcs/base64/base64_decode.c +++ b/srcs/base64/base64_decode.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/15 13:41:31 by cpieri #+# #+# */ -/* Updated: 2019/04/29 19:23:03 by cpieri ### ########.fr */ +/* Updated: 2019/04/30 15:47:31 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -33,106 +33,79 @@ static const unsigned char g_base64_d[] = { static size_t b64_decode_len(uint8_t *msg, size_t len) { + size_t i; + size_t soft_len; size_t new_len; - new_len = (len / 4) * 3; - len -= 2; - // printf("msg[len]: %c\n", msg[len]); + soft_len = 0; + i = -1; + while (++i < len) + if (!ft_isspace(msg[i])) + soft_len++; + new_len = (soft_len / 4) * 3; + len -= (ft_isspace(msg[len - 1])) ? 2 : 1; while (msg[len--] == '=') new_len--; - // printf("new_len: %zu\n", new_len); - return (new_len + 1); + return (new_len); } -uint32_t b64_decode_val(uint8_t *msg, size_t *i, size_t len) +static uint32_t b64_decode_val(uint8_t *msg, size_t *i) { - size_t p; uint32_t tmp; - int l_shift; + uint16_t l_shift; + size_t j; + size_t p; + j = *i; p = 0; l_shift = 18; tmp = 0; - while (p < 4 && *i < len) + while (p < 4) { - if (ft_isspace(msg[*i]) == 1) - *i += 1; - else + if (!ft_isspace(msg[j])) { - tmp += ((msg[*i] == '=') ? 0 & *i : g_base64_d[msg[*i]]) << l_shift; + tmp += g_base64_d[msg[j]] << l_shift; l_shift += (l_shift == 0) ? 18 : -6; + p++; } - *i += 1; - p++; + j++; } + *i = j; return (tmp); } +static void b64_decode_end(uint8_t *msg_d, uint8_t *msg, int len, int j) +{ + msg_d += j; + if ((j + 1) < len) + *msg_d++ = (g_base64_d[*msg] << 2 | g_base64_d[*(msg + 1)] >> 4); + if ((j + 2) < len) + *msg_d++ = (g_base64_d[*(msg + 1)] << 4 | g_base64_d[*(msg + 2)] >> 2); + if ((j + 3) < len) + *msg_d++ = (g_base64_d[*(msg + 2)] << 6 | g_base64_d[*(msg + 3)]); +} + uint8_t *base64_decode(uint8_t *msg, size_t len) { - uint8_t *plain_msg; + uint8_t *msg_d; + uint32_t tmp; size_t len_plain; size_t i; - size_t j = 0; - uint32_t tmp; + size_t j; - i = -1; + i = 0; + j = 0; + tmp = 0; len_plain = b64_decode_len(msg, len); - if (!(plain_msg = (uint8_t*)ft_memalloc(sizeof(uint8_t) * len_plain))) + if (!(msg_d = (uint8_t*)ft_memalloc(sizeof(uint8_t) * len_plain))) return (NULL); - while (j < len_plain && i < len) + while ((j + 3) <= len_plain) { - tmp = b64_decode_val(msg, &i, len); + tmp = b64_decode_val(msg, &i); + msg_d[j++] = (tmp >> 16) & 0xff; + msg_d[j++] = (tmp >> 8) & 0xff; + msg_d[j++] = tmp & 0xff; } - return (plain_msg); + b64_decode_end(msg_d, msg + i, len_plain, j); + return (msg_d); } - -// uint8_t *base64_decode(uint8_t *msg, size_t len) -// { -// t_base64_decode n; -// size_t len_plain; -// uint8_t *plain_msg; -// size_t i; -// size_t j; -// size_t p = 0; -// size_t l_shift = 18; -// size_t r_shift = 16; - -// i = 0; -// j = 0; -// n = (t_base64_decode){0,0,0,0,0}; -// len_plain = b64_len_decode(msg, len); -// if (!(plain_msg = (uint8_t*)ft_memalloc(sizeof(uint8_t) * len_plain))) -// return (NULL); -// while (i < len) -// { -// if (ft_isspace(msg[i]) == 1) -// i++; -// else -// { -// n.tmp += g_base64_d[msg[i]] << l_shift; -// printf("l_shift: %zu\n", l_shift); -// ft_membits(&(n.tmp), 0, sizeof(uint32_t)); -// l_shift += (l_shift == 0) ? 18 : -6; -// p++; -// if (p == 4) -// { -// printf("here\n"); -// while (j < (len_plain - 1)) -// { -// printf("r_shift: %zu\n", r_shift); -// plain_msg[j++] = (n.tmp >> r_shift) & 0xff; -// if (r_shift == 0) -// break ; -// else -// r_shift -= 8; -// } -// r_shift = 16; -// p = 0; -// n.tmp = 0; -// } -// i++; -// } -// } -// return (plain_msg); -// } diff --git a/srcs/base64/base64_display.c b/srcs/base64/base64_display.c index 4e461b3..5c38c3d 100644 --- a/srcs/base64/base64_display.c +++ b/srcs/base64/base64_display.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/29 12:13:14 by cpieri #+# #+# */ -/* Updated: 2019/04/29 14:09:21 by cpieri ### ########.fr */ +/* Updated: 2019/04/30 14:28:28 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,11 +21,11 @@ void printing_base64(t_data *data, const char *name, t_flags flags) (void)name; msg_print = (const char *)data->data_2_print; if ((flags.b64_flags & e_base64_outputf) == e_base64_outputf - && data->fd_output != NULL) + && data->fd_output != NULL) fd = open_write_fd(data->fd_output); if (fd == FAILURE) print_error(data->fd_output); ft_putendl_fd(msg_print, fd); if ((flags.b64_flags & e_base64_outputf) == e_base64_outputf) close_fd(fd); -} \ No newline at end of file +} diff --git a/srcs/get_data.c b/srcs/get_data.c index 0325971..fa1b127 100644 --- a/srcs/get_data.c +++ b/srcs/get_data.c @@ -6,11 +6,10 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/08 12:03:54 by cpieri #+# #+# */ -/* Updated: 2019/04/29 14:16:13 by cpieri ### ########.fr */ +/* Updated: 2019/04/30 14:28:04 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ -#include #include "ft_ssl.h" t_data *get_string(char *s) @@ -28,7 +27,6 @@ t_data *get_string(char *s) return (ret); } - t_data *get_file(const int fd, const char *fd_name) { char buffer[BUFF_SIZE + 1]; diff --git a/srcs/help.c b/srcs/help.c index 61fd62b..9e8cc9c 100644 --- a/srcs/help.c +++ b/srcs/help.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/29 13:37:15 by cpieri #+# #+# */ -/* Updated: 2019/04/29 14:16:56 by cpieri ### ########.fr */ +/* Updated: 2019/04/30 14:27:02 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -74,4 +74,4 @@ int close_fd(const int fd) return (FAILURE); } return (SUCCESS); -} \ No newline at end of file +} From 7b57e950b11e4569a9de61833a0db8911f899abf Mon Sep 17 00:00:00 2001 From: Louise P Date: Tue, 30 Apr 2019 16:00:46 +0200 Subject: [PATCH 17/71] Base64 end --- srcs/base64/base64_decode.c | 15 ++++++++------- toto_space | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/srcs/base64/base64_decode.c b/srcs/base64/base64_decode.c index 511c84b..c0b7ae1 100644 --- a/srcs/base64/base64_decode.c +++ b/srcs/base64/base64_decode.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/15 13:41:31 by cpieri #+# #+# */ -/* Updated: 2019/04/30 15:47:31 by cpieri ### ########.fr */ +/* Updated: 2019/04/30 15:58:26 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -46,6 +46,7 @@ static size_t b64_decode_len(uint8_t *msg, size_t len) len -= (ft_isspace(msg[len - 1])) ? 2 : 1; while (msg[len--] == '=') new_len--; + printf("new_len: %zu\n", new_len); return (new_len); } @@ -74,15 +75,14 @@ static uint32_t b64_decode_val(uint8_t *msg, size_t *i) return (tmp); } -static void b64_decode_end(uint8_t *msg_d, uint8_t *msg, int len, int j) +static void b64_decode_end(uint8_t *msg_d, uint32_t tmp, int len, int j) { - msg_d += j; if ((j + 1) < len) - *msg_d++ = (g_base64_d[*msg] << 2 | g_base64_d[*(msg + 1)] >> 4); + msg_d[j++] = (tmp >> 16) & 0xff; if ((j + 2) < len) - *msg_d++ = (g_base64_d[*(msg + 1)] << 4 | g_base64_d[*(msg + 2)] >> 2); + msg_d[j++] = (tmp >> 8) & 0xff; if ((j + 3) < len) - *msg_d++ = (g_base64_d[*(msg + 2)] << 6 | g_base64_d[*(msg + 3)]); + msg_d[j++] = tmp & 0xff; } uint8_t *base64_decode(uint8_t *msg, size_t len) @@ -106,6 +106,7 @@ uint8_t *base64_decode(uint8_t *msg, size_t len) msg_d[j++] = (tmp >> 8) & 0xff; msg_d[j++] = tmp & 0xff; } - b64_decode_end(msg_d, msg + i, len_plain, j); + tmp = b64_decode_val(msg, &i); + b64_decode_end(msg_d, tmp, len_plain, j); return (msg_d); } diff --git a/toto_space b/toto_space index 69cc25c..8b6ed35 100644 --- a/toto_space +++ b/toto_space @@ -1 +1 @@ -dG 90bw o = +YWJjZAo= \ No newline at end of file From f18bbeebd42370cddf61b1bb3413e99697e6e765 Mon Sep 17 00:00:00 2001 From: Louise P Date: Tue, 30 Apr 2019 16:32:09 +0200 Subject: [PATCH 18/71] push --- includes/base64/base64.h | 11 +---------- includes/constant.h | 3 ++- test.sh => test_des/test.sh | 0 encode_auteur => test_des/test_base64/encode_auteur | 0 encode_clean_c => test_des/test_base64/encode_clean_c | 0 encode_mfile => test_des/test_base64/encode_mfile | 0 size_file => test_des/test_base64/size_file | 0 toto | 1 - toto_space | 1 - 9 files changed, 3 insertions(+), 13 deletions(-) rename test.sh => test_des/test.sh (100%) rename encode_auteur => test_des/test_base64/encode_auteur (100%) rename encode_clean_c => test_des/test_base64/encode_clean_c (100%) rename encode_mfile => test_des/test_base64/encode_mfile (100%) rename size_file => test_des/test_base64/size_file (100%) delete mode 100644 toto delete mode 100644 toto_space diff --git a/includes/base64/base64.h b/includes/base64/base64.h index f97c9c8..a32a34a 100644 --- a/includes/base64/base64.h +++ b/includes/base64/base64.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/12 11:59:40 by cpieri #+# #+# */ -/* Updated: 2019/04/26 16:59:21 by cpieri ### ########.fr */ +/* Updated: 2019/04/30 16:11:01 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,15 +23,6 @@ typedef struct s_base64_encode uint8_t n3; } t_base64_encode; -typedef struct s_base64_decode -{ - uint32_t n0; - uint32_t n1; - uint32_t n2; - uint32_t n3; - uint32_t tmp; -} t_base64_decode; - uint8_t *base64_encode(uint8_t *msg, size_t len); uint8_t *base64_decode(uint8_t *msg, size_t len); diff --git a/includes/constant.h b/includes/constant.h index 8883cc6..8a2cdb4 100644 --- a/includes/constant.h +++ b/includes/constant.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:15:35 by cpieri #+# #+# */ -/* Updated: 2019/04/29 12:20:32 by cpieri ### ########.fr */ +/* Updated: 2019/04/30 16:31:41 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,6 +19,7 @@ static const t_parse g_all_cmd[] = {"sha256", "SHA256", e_hash, sha256, hash_opts, printing_hash, NULL}, {"base64", "base64", e_cipher, base64, base64_opts, printing_base64, NULL}, {NULL, NULL, 0, NULL, NULL, NULL, NULL}, + // {"des", "des", e_cipher, NULL/*des*/, NULL/*des_opts*/, NULL/*printing_des*/, NULL}, }; static const t_check_flags g_b64_flags[] = diff --git a/test.sh b/test_des/test.sh similarity index 100% rename from test.sh rename to test_des/test.sh diff --git a/encode_auteur b/test_des/test_base64/encode_auteur similarity index 100% rename from encode_auteur rename to test_des/test_base64/encode_auteur diff --git a/encode_clean_c b/test_des/test_base64/encode_clean_c similarity index 100% rename from encode_clean_c rename to test_des/test_base64/encode_clean_c diff --git a/encode_mfile b/test_des/test_base64/encode_mfile similarity index 100% rename from encode_mfile rename to test_des/test_base64/encode_mfile diff --git a/size_file b/test_des/test_base64/size_file similarity index 100% rename from size_file rename to test_des/test_base64/size_file diff --git a/toto b/toto deleted file mode 100644 index fc59c04..0000000 --- a/toto +++ /dev/null @@ -1 +0,0 @@ -dG90bwo= diff --git a/toto_space b/toto_space deleted file mode 100644 index 8b6ed35..0000000 --- a/toto_space +++ /dev/null @@ -1 +0,0 @@ -YWJjZAo= \ No newline at end of file From 1b165793e10a1e78f87eef151a247692330aa255 Mon Sep 17 00:00:00 2001 From: Louise P Date: Tue, 30 Apr 2019 17:42:32 +0200 Subject: [PATCH 19/71] rm segf --- srcs/base64/base64_decode.c | 7 +++---- srcs/main.c | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/srcs/base64/base64_decode.c b/srcs/base64/base64_decode.c index c0b7ae1..f88c7e0 100644 --- a/srcs/base64/base64_decode.c +++ b/srcs/base64/base64_decode.c @@ -6,12 +6,11 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/15 13:41:31 by cpieri #+# #+# */ -/* Updated: 2019/04/30 15:58:26 by cpieri ### ########.fr */ +/* Updated: 2019/04/30 17:42:06 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "base64/base64.h" -#include static const unsigned char g_base64_d[] = { 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, @@ -46,7 +45,6 @@ static size_t b64_decode_len(uint8_t *msg, size_t len) len -= (ft_isspace(msg[len - 1])) ? 2 : 1; while (msg[len--] == '=') new_len--; - printf("new_len: %zu\n", new_len); return (new_len); } @@ -97,7 +95,8 @@ uint8_t *base64_decode(uint8_t *msg, size_t len) j = 0; tmp = 0; len_plain = b64_decode_len(msg, len); - if (!(msg_d = (uint8_t*)ft_memalloc(sizeof(uint8_t) * len_plain))) + if (!(msg_d = (uint8_t*)ft_memalloc(sizeof(uint8_t) * len_plain)) + || (len % 4) != 0) return (NULL); while ((j + 3) <= len_plain) { diff --git a/srcs/main.c b/srcs/main.c index 15e0a75..f6649b2 100644 --- a/srcs/main.c +++ b/srcs/main.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/24 17:05:16 by cpieri #+# #+# */ -/* Updated: 2019/04/29 14:20:50 by cpieri ### ########.fr */ +/* Updated: 2019/04/30 17:36:06 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ From 14f2f40a252585f0b1cea3aab78edad69d5e3a3a Mon Sep 17 00:00:00 2001 From: Louise P Date: Fri, 3 May 2019 11:43:30 +0200 Subject: [PATCH 20/71] Fix bug of parsing b64 --- srcs/base64/base64.c | 3 +-- srcs/base64/base64_decode.c | 5 ++--- srcs/base64/base64_help_parsing.c | 10 +++++----- srcs/base64/base64_parsing.c | 13 ++++++------- 4 files changed, 14 insertions(+), 17 deletions(-) diff --git a/srcs/base64/base64.c b/srcs/base64/base64.c index 1cc0cba..938ff89 100644 --- a/srcs/base64/base64.c +++ b/srcs/base64/base64.c @@ -6,13 +6,12 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/12 16:53:29 by cpieri #+# #+# */ -/* Updated: 2019/04/29 12:21:37 by cpieri ### ########.fr */ +/* Updated: 2019/05/03 11:34:47 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" #include "base64/base64.h" -#include void *base64(void *opts, size_t len_opts) { diff --git a/srcs/base64/base64_decode.c b/srcs/base64/base64_decode.c index f88c7e0..7b83065 100644 --- a/srcs/base64/base64_decode.c +++ b/srcs/base64/base64_decode.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/15 13:41:31 by cpieri #+# #+# */ -/* Updated: 2019/04/30 17:42:06 by cpieri ### ########.fr */ +/* Updated: 2019/05/03 11:31:53 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -95,8 +95,7 @@ uint8_t *base64_decode(uint8_t *msg, size_t len) j = 0; tmp = 0; len_plain = b64_decode_len(msg, len); - if (!(msg_d = (uint8_t*)ft_memalloc(sizeof(uint8_t) * len_plain)) - || (len % 4) != 0) + if (!(msg_d = (uint8_t*)ft_memalloc(sizeof(uint8_t) * len_plain))) return (NULL); while ((j + 3) <= len_plain) { diff --git a/srcs/base64/base64_help_parsing.c b/srcs/base64/base64_help_parsing.c index f65887c..fefa444 100644 --- a/srcs/base64/base64_help_parsing.c +++ b/srcs/base64/base64_help_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/12 11:39:36 by cpieri #+# #+# */ -/* Updated: 2019/04/29 13:37:02 by cpieri ### ########.fr */ +/* Updated: 2019/05/03 11:39:50 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,7 +15,7 @@ void get_b64_ed(t_data **data, t_flags *flags, char *fd, char c) { - if (*data != NULL) + if (*data != NULL && fd != NULL) clean_data(data); if (c == 'd') { @@ -25,16 +25,16 @@ void get_b64_ed(t_data **data, t_flags *flags, char *fd, char c) } else if (c == 'e' && (flags->b64_flags & e_base64_decode) == 0) flags->b64_flags |= e_base64_encode; - if (fd == NULL) + if (fd == NULL && *data == NULL) *data = get_data(0, NULL); - else + else if (*data == NULL && fd != NULL) *data = get_file(open_fd(fd), fd); } void get_b64_i(t_data **data, t_flags *flags, char *fd, int *now) { flags->b64_flags |= e_base64_inputf; - if (*data != NULL) + if (*data != NULL && fd != NULL) clean_data(data); *data = get_data(open_fd(fd), fd); (*now)++; diff --git a/srcs/base64/base64_parsing.c b/srcs/base64/base64_parsing.c index 0b50833..1382774 100644 --- a/srcs/base64/base64_parsing.c +++ b/srcs/base64/base64_parsing.c @@ -6,15 +6,14 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 16:56:03 by cpieri #+# #+# */ -/* Updated: 2019/04/26 11:42:53 by cpieri ### ########.fr */ +/* Updated: 2019/05/03 11:40:01 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" #include "base64/base64.h" -#include -t_data *get_b64_opt(char **av, int *now, t_flags *flags, char **output) +t_data *get_b64_opt(char **av, int *now, t_opt *t_o, char **output) { t_data *data; size_t len_now; @@ -26,13 +25,13 @@ t_data *get_b64_opt(char **av, int *now, t_flags *flags, char **output) while (++i < len_now) { if (av[*now][i] == 'e' || av[*now][i] == 'd') - get_b64_ed(&data, flags, + get_b64_ed(&(t_o->data), &(t_o->flags), (av[*now + 1] != NULL ? av[*now + 1] : NULL), av[*now][i]); else if (av[*now][i] == 'i') - get_b64_i(&data, flags, av[(*now) + 1], now); + get_b64_i(&data, &(t_o->flags), av[(*now) + 1], now); else if (av[*now][i] == 'o') { - flags->b64_flags |= e_base64_outputf; + t_o->flags.b64_flags |= e_base64_outputf; if (av[(*now) + 1] != NULL) *output = av[(*now) + 1]; else @@ -55,7 +54,7 @@ t_opt *get_base64_args(const int ac, char **av, int now) { if (av[now][0] == '-') { - tmp = get_b64_opt(av, &now, &(t_o.flags), &fd_output); + tmp = get_b64_opt(av, &now, &t_o, &fd_output); if (tmp != NULL) { clean_data(&(t_o.data)); From 3371927368af5b727778728f4bd8a3e4b586d869 Mon Sep 17 00:00:00 2001 From: Louise P Date: Fri, 3 May 2019 13:48:47 +0200 Subject: [PATCH 21/71] b64 --- srcs/base64/base64_parsing.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/srcs/base64/base64_parsing.c b/srcs/base64/base64_parsing.c index 1382774..0932133 100644 --- a/srcs/base64/base64_parsing.c +++ b/srcs/base64/base64_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 16:56:03 by cpieri #+# #+# */ -/* Updated: 2019/05/03 11:40:01 by cpieri ### ########.fr */ +/* Updated: 2019/05/03 13:47:46 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -32,10 +32,7 @@ t_data *get_b64_opt(char **av, int *now, t_opt *t_o, char **output) else if (av[*now][i] == 'o') { t_o->flags.b64_flags |= e_base64_outputf; - if (av[(*now) + 1] != NULL) - *output = av[(*now) + 1]; - else - *output = NULL; + *output = (av[(*now) + 1] != NULL) ? av[(*now) + 1] : NULL; (*now)++; } } From 531317e9156be480d9cc70110f02a8772c4679a0 Mon Sep 17 00:00:00 2001 From: Louise P Date: Fri, 3 May 2019 17:07:57 +0200 Subject: [PATCH 22/71] b64 refactor parsing --- srcs/base64/base64_parsing.c | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/srcs/base64/base64_parsing.c b/srcs/base64/base64_parsing.c index 0932133..b14dbbe 100644 --- a/srcs/base64/base64_parsing.c +++ b/srcs/base64/base64_parsing.c @@ -6,21 +6,19 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 16:56:03 by cpieri #+# #+# */ -/* Updated: 2019/05/03 13:47:46 by cpieri ### ########.fr */ +/* Updated: 2019/05/03 15:01:37 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" #include "base64/base64.h" -t_data *get_b64_opt(char **av, int *now, t_opt *t_o, char **output) +static void get_b64_opt(char **av, int *now, t_opt *t_o, char **output) { - t_data *data; size_t len_now; size_t i; i = 0; - data = NULL; len_now = ft_strlen(av[*now]); while (++i < len_now) { @@ -28,7 +26,7 @@ t_data *get_b64_opt(char **av, int *now, t_opt *t_o, char **output) get_b64_ed(&(t_o->data), &(t_o->flags), (av[*now + 1] != NULL ? av[*now + 1] : NULL), av[*now][i]); else if (av[*now][i] == 'i') - get_b64_i(&data, &(t_o->flags), av[(*now) + 1], now); + get_b64_i(&(t_o->data), &(t_o->flags), av[(*now) + 1], now); else if (av[*now][i] == 'o') { t_o->flags.b64_flags |= e_base64_outputf; @@ -36,28 +34,19 @@ t_data *get_b64_opt(char **av, int *now, t_opt *t_o, char **output) (*now)++; } } - return (data); } -t_opt *get_base64_args(const int ac, char **av, int now) +static t_opt *get_base64_args(const int ac, char **av, int now) { t_opt t_o; - t_data *tmp; char *fd_output; fd_output = NULL; - tmp = NULL; + t_o = (t_opt){NULL, {0, 0, 0, 0, 0}, NULL}; while (now < ac) { if (av[now][0] == '-') - { - tmp = get_b64_opt(av, &now, &t_o, &fd_output); - if (tmp != NULL) - { - clean_data(&(t_o.data)); - t_o.data = tmp; - } - } + get_b64_opt(av, &now, &t_o, &fd_output); else get_b64_ed(&(t_o.data), &(t_o.flags), av[now], 'e'); now++; @@ -67,7 +56,7 @@ t_opt *get_base64_args(const int ac, char **av, int now) return (new_opt_fd(t_o.flags, t_o.data, fd_output)); } -t_opt *base64_opts(const int ac, char **av, t_opt *opts, int now) +t_opt *base64_opts(const int ac, char **av, t_opt *opts, int now) { t_opt *new; From 4b0d1f1e04c05fc4e4dc54a0d9bd1560398faa64 Mon Sep 17 00:00:00 2001 From: Louise P Date: Mon, 6 May 2019 12:01:38 +0200 Subject: [PATCH 23/71] Refactor: tools in dir --- Makefile | 12 ++++++------ srcs/{ => tools}/clean.c | 0 srcs/{ => tools}/get_data.c | 0 srcs/{ => tools}/lst_opt.c | 0 srcs/{help.c => tools/open_fd.c} | 0 srcs/{ => tools}/usage.c | 0 6 files changed, 6 insertions(+), 6 deletions(-) rename srcs/{ => tools}/clean.c (100%) rename srcs/{ => tools}/get_data.c (100%) rename srcs/{ => tools}/lst_opt.c (100%) rename srcs/{help.c => tools/open_fd.c} (100%) rename srcs/{ => tools}/usage.c (100%) diff --git a/Makefile b/Makefile index 934ea70..5f14785 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/03/15 11:20:25 by cpieri #+# #+# # -# Updated: 2019/04/29 14:21:49 by cpieri ### ########.fr # +# Updated: 2019/05/06 12:00:00 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -39,13 +39,13 @@ DEPS = Makefile \ libft/libft.a SRC_NAME= main.c \ - clean.c \ - usage.c \ parsing.c \ - get_data.c \ - help.c \ - lst_opt.c \ dispatch.c \ + tools/clean.c \ + tools/usage.c \ + tools/get_data.c \ + tools/open_fd.c \ + tools/lst_opt.c \ hash/hash_parsing.c \ hash/display_hash.c \ hash/sha256/sha256.c \ diff --git a/srcs/clean.c b/srcs/tools/clean.c similarity index 100% rename from srcs/clean.c rename to srcs/tools/clean.c diff --git a/srcs/get_data.c b/srcs/tools/get_data.c similarity index 100% rename from srcs/get_data.c rename to srcs/tools/get_data.c diff --git a/srcs/lst_opt.c b/srcs/tools/lst_opt.c similarity index 100% rename from srcs/lst_opt.c rename to srcs/tools/lst_opt.c diff --git a/srcs/help.c b/srcs/tools/open_fd.c similarity index 100% rename from srcs/help.c rename to srcs/tools/open_fd.c diff --git a/srcs/usage.c b/srcs/tools/usage.c similarity index 100% rename from srcs/usage.c rename to srcs/tools/usage.c From ac756cd41b6e69f1b10333329341bd2eff34ad9a Mon Sep 17 00:00:00 2001 From: Louise P Date: Mon, 6 May 2019 12:03:43 +0200 Subject: [PATCH 24/71] Refactor: add deps in makefile --- Makefile | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index 5f14785..8121f24 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/03/15 11:20:25 by cpieri #+# #+# # -# Updated: 2019/05/06 12:00:00 by cpieri ### ########.fr # +# Updated: 2019/05/06 12:03:00 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -26,16 +26,17 @@ SRC_PATH= srcs OBJ_PATH= obj -DEPS = Makefile \ - includes/ft_ssl.h \ - includes/define.h \ - includes/constant.h \ - includes/enum.h \ - includes/functions.h \ - includes/structure.h \ - includes/hash/sha256.h \ - includes/hash/hash.h \ - includes/hash/md5.h \ +DEPS = Makefile \ + includes/ft_ssl.h \ + includes/define.h \ + includes/constant.h \ + includes/enum.h \ + includes/functions.h \ + includes/structure.h \ + includes/hash/sha256.h \ + includes/hash/hash.h \ + includes/hash/md5.h \ + inlcudes/base64/base64.h \ libft/libft.a SRC_NAME= main.c \ From 4e50b0d1ea83b122f6f59c8ca3475ffb2a622153 Mon Sep 17 00:00:00 2001 From: Louise P Date: Mon, 6 May 2019 15:15:58 +0200 Subject: [PATCH 25/71] Starting des --- Makefile | 30 ++++++++------ includes/constant.h | 4 +- includes/ft_ssl.h | 3 +- includes/functions.h | 7 +++- includes/structure.h | 4 +- includes/symmetric/des/des.h | 18 +++++++++ includes/symmetric/symmetric.h | 37 +++++++++++++++++ libft/srcs/ft_strdup.c | 4 +- srcs/main.c | 2 +- srcs/symmetric/cbc.c | 15 +++++++ srcs/symmetric/des/des.c | 26 ++++++++++++ srcs/symmetric/des/des_key.c | 30 ++++++++++++++ srcs/symmetric/sym_key.c | 65 ++++++++++++++++++++++++++++++ srcs/symmetric/symmetric_parsing.c | 45 +++++++++++++++++++++ srcs/tools/clean.c | 14 +++---- srcs/tools/error.c | 64 +++++++++++++++++++++++++++++ srcs/tools/usage.c | 35 +--------------- 17 files changed, 338 insertions(+), 65 deletions(-) create mode 100644 includes/symmetric/des/des.h create mode 100644 includes/symmetric/symmetric.h create mode 100644 srcs/symmetric/cbc.c create mode 100644 srcs/symmetric/des/des.c create mode 100644 srcs/symmetric/des/des_key.c create mode 100644 srcs/symmetric/sym_key.c create mode 100644 srcs/symmetric/symmetric_parsing.c create mode 100644 srcs/tools/error.c diff --git a/Makefile b/Makefile index 8121f24..70a977d 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/03/15 11:20:25 by cpieri #+# #+# # -# Updated: 2019/05/06 12:03:00 by cpieri ### ########.fr # +# Updated: 2019/05/06 14:41:35 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -26,17 +26,18 @@ SRC_PATH= srcs OBJ_PATH= obj -DEPS = Makefile \ - includes/ft_ssl.h \ - includes/define.h \ - includes/constant.h \ - includes/enum.h \ - includes/functions.h \ - includes/structure.h \ - includes/hash/sha256.h \ - includes/hash/hash.h \ - includes/hash/md5.h \ - inlcudes/base64/base64.h \ +DEPS = Makefile \ + includes/ft_ssl.h \ + includes/define.h \ + includes/constant.h \ + includes/enum.h \ + includes/functions.h \ + includes/structure.h \ + includes/hash/sha256.h \ + includes/hash/hash.h \ + includes/hash/md5.h \ + includes/base64/base64.h \ + includes/symmetric/symmetric.h \ libft/libft.a SRC_NAME= main.c \ @@ -44,6 +45,7 @@ SRC_NAME= main.c \ dispatch.c \ tools/clean.c \ tools/usage.c \ + tools/error.c \ tools/get_data.c \ tools/open_fd.c \ tools/lst_opt.c \ @@ -59,6 +61,8 @@ SRC_NAME= main.c \ base64/base64_parsing.c \ base64/base64_help_parsing.c \ base64/base64_display.c \ + symmetric/sym_key.c \ + symmetric/symmetric_parsing.c \ OBJ_NAME= $(SRC_NAME:.c=.o) @@ -74,7 +78,7 @@ BLUE = \033[34m MAGENTA = \033[35m CYAN = \033[36m -.PHONY: all clean fclean re echo norm +.PHONY: all clean fclean re echo all: LFT $(NAME) diff --git a/includes/constant.h b/includes/constant.h index 8a2cdb4..3150a69 100644 --- a/includes/constant.h +++ b/includes/constant.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:15:35 by cpieri #+# #+# */ -/* Updated: 2019/04/30 16:31:41 by cpieri ### ########.fr */ +/* Updated: 2019/05/06 14:09:04 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,8 +18,8 @@ static const t_parse g_all_cmd[] = {"md5", "MD5", e_hash, md5, hash_opts, printing_hash, NULL}, {"sha256", "SHA256", e_hash, sha256, hash_opts, printing_hash, NULL}, {"base64", "base64", e_cipher, base64, base64_opts, printing_base64, NULL}, + {"des", "des", e_cipher, NULL/*des*/, symmetric_opts, NULL/*printing_des*/, NULL}, {NULL, NULL, 0, NULL, NULL, NULL, NULL}, - // {"des", "des", e_cipher, NULL/*des*/, NULL/*des_opts*/, NULL/*printing_des*/, NULL}, }; static const t_check_flags g_b64_flags[] = diff --git a/includes/ft_ssl.h b/includes/ft_ssl.h index b5ddef5..393f03f 100644 --- a/includes/ft_ssl.h +++ b/includes/ft_ssl.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/06 12:40:02 by cpieri #+# #+# */ -/* Updated: 2019/04/15 11:31:38 by cpieri ### ########.fr */ +/* Updated: 2019/05/06 14:11:01 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,6 +17,7 @@ # include "./hash/md5.h" # include "./hash/sha256.h" # include "./base64/base64.h" +# include "./symmetric/symmetric.h" # include "define.h" # include "enum.h" # include "structure.h" diff --git a/includes/functions.h b/includes/functions.h index 563c188..87fc0aa 100644 --- a/includes/functions.h +++ b/includes/functions.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:44:05 by cpieri #+# #+# */ -/* Updated: 2019/04/29 14:20:43 by cpieri ### ########.fr */ +/* Updated: 2019/05/06 15:01:08 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,6 +24,7 @@ void dispatch(t_parse *parse); */ t_opt *hash_opts(const int ac, char **av, t_opt *opts, int now); t_opt *base64_opts(const int ac, char **av, t_opt *opts, int now); +t_opt *symmetric_opts(const int ac, char **av, t_opt *opts, int now); void get_b64_ed(t_data **data, t_flags *flags, char *fd, char c); void get_b64_i(t_data **data, t_flags *flags, char *fd, int *now); void *base64(void *opts, size_t len_opts); @@ -61,8 +62,10 @@ void print_lst(t_opt **lst); ** Functions for Exit, Clean, Error */ void exit_error(void); +void exit_msg(const char *msg); +void exit_error_msg(const char *msg); void exit_error_free(void **to_free); -void print_error(const char *msg_1); +void print_error(const char *msg); void print_usage(const int usage_int, const char *command); void clean_prog(t_parse *parse); void clean_data(t_data **data); diff --git a/includes/structure.h b/includes/structure.h index cd6b424..f17b9d2 100644 --- a/includes/structure.h +++ b/includes/structure.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:27:48 by cpieri #+# #+# */ -/* Updated: 2019/04/29 14:08:43 by cpieri ### ########.fr */ +/* Updated: 2019/05/06 12:31:32 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,7 +20,7 @@ typedef struct s_data char *data; size_t len_data; int mall; - t_hash *f_hash; + void *pass; void *data_2_print; } t_data; diff --git a/includes/symmetric/des/des.h b/includes/symmetric/des/des.h new file mode 100644 index 0000000..5e5cef8 --- /dev/null +++ b/includes/symmetric/des/des.h @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* des.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/05/06 10:13:19 by cpieri #+# #+# */ +/* Updated: 2019/05/06 10:13:48 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef DES_H +# define DES_H + +void *des(void *msg, size_t len); + +#endif \ No newline at end of file diff --git a/includes/symmetric/symmetric.h b/includes/symmetric/symmetric.h new file mode 100644 index 0000000..2ff17cd --- /dev/null +++ b/includes/symmetric/symmetric.h @@ -0,0 +1,37 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* symmetric.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/05/06 10:11:43 by cpieri #+# #+# */ +/* Updated: 2019/05/06 14:39:29 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef SYMMETRIC_H +# define SYMMETRIC_H + +# include "../libft/include/libft.h" +// # include "./des/des.h" + +typedef struct s_sym_key +{ + uint8_t *pass; + uint64_t salt; + uint64_t key; +} t_sym_key; + +// void *cbc(void *msg, void *key, size_t msg_len, size_t key_len); +// void *ecb(void *msg, void *key, size_t msg_len, size_t key_len); + +/* +** Functions for create and del struct symmetric key +*/ +uint8_t *get_pass(const char *prompt); +t_sym_key *new_key(uint8_t *pass, uint64_t salt, uint64_t key); +void free_sym_key(t_sym_key **to_free); +void free_sym_key(t_sym_key **to_free); + +#endif \ No newline at end of file diff --git a/libft/srcs/ft_strdup.c b/libft/srcs/ft_strdup.c index 0ac8397..49c3418 100644 --- a/libft/srcs/ft_strdup.c +++ b/libft/srcs/ft_strdup.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* ft_strdup.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: cpieri +#+ +:+ +#+ */ +/* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/09 09:31:10 by cpieri #+# #+# */ -/* Updated: 2018/01/12 10:07:58 by cpieri ### ########.fr */ +/* Updated: 2019/05/06 15:09:18 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/srcs/main.c b/srcs/main.c index f6649b2..80e8fe3 100644 --- a/srcs/main.c +++ b/srcs/main.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/24 17:05:16 by cpieri #+# #+# */ -/* Updated: 2019/04/30 17:36:06 by cpieri ### ########.fr */ +/* Updated: 2019/05/06 15:14:27 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/srcs/symmetric/cbc.c b/srcs/symmetric/cbc.c new file mode 100644 index 0000000..888127f --- /dev/null +++ b/srcs/symmetric/cbc.c @@ -0,0 +1,15 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* cbc.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/05/06 10:09:17 by cpieri #+# #+# */ +/* Updated: 2019/05/06 12:15:39 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "symmetric/symmetric.h" + +void *cbc(void *msg, void *key, size_t msg_len, size_t key_len); diff --git a/srcs/symmetric/des/des.c b/srcs/symmetric/des/des.c new file mode 100644 index 0000000..5c4b5c0 --- /dev/null +++ b/srcs/symmetric/des/des.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* des.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/05/06 10:05:42 by cpieri #+# #+# */ +/* Updated: 2019/05/06 11:27:13 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "symmetric/des/des.h" +#include "symmetric/symmetric.h" + +void *des(void *msg, size_t len) +{ + void *key; + size_t len_key; + + (void)len; + len_key = 0; + key = gen_random_key(&len_key); + ecb(msg, key, len, len_key); + return (msg); +} \ No newline at end of file diff --git a/srcs/symmetric/des/des_key.c b/srcs/symmetric/des/des_key.c new file mode 100644 index 0000000..bbba67d --- /dev/null +++ b/srcs/symmetric/des/des_key.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* des_key.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/05/06 11:27:26 by cpieri #+# #+# */ +/* Updated: 2019/05/06 12:05:01 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "symmetric/des/des.h" +#include + +static const int g_parity_bit[64] = +{ + 57, 49, 41, 33, 25, 17, 09, 01, 58, 50, 42, 34, 26, 18, 10, 02, 59, 51, 43, + 35, 27, 19, 11, 03, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 07, 62, 54, + 46, 38, 30, 22, 14, 06, 61, 53, 45, 37, 29, 21, 13, 05, 28, 20, 12, 04 +}; + +uint64_t des_gen_key(void *pass, size_t len_pass) +{ + uint64_t key; + + (void)len_pass; + printf("pass: %s", pass); + return (key); +} \ No newline at end of file diff --git a/srcs/symmetric/sym_key.c b/srcs/symmetric/sym_key.c new file mode 100644 index 0000000..f5b0014 --- /dev/null +++ b/srcs/symmetric/sym_key.c @@ -0,0 +1,65 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* sym_key.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/05/06 13:53:56 by cpieri #+# #+# */ +/* Updated: 2019/05/06 15:07:17 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "symmetric/symmetric.h" +#include "ft_ssl.h" + +uint8_t *get_pass(const char *prompt) +{ + char *pass; + char *conf_prompt; + char *conf_pass; + + conf_prompt = ft_strjoin("Verifying - ", prompt); + pass = ft_strdup(getpass(prompt)); + conf_pass = getpass(conf_prompt); + ft_memdel((void**)&conf_prompt); + if (!pass || !conf_pass) + exit_msg("getpass"); + if (ft_strcmp(conf_pass, pass) != 0) + { + ft_memdel((void**)&pass); + exit_msg("Verifying Failure"); + } + return ((uint8_t*)pass); +} + +t_sym_key *new_key(uint8_t *pass, uint64_t salt, uint64_t key) +{ + t_sym_key *new; + + if (!(new = (t_sym_key*)malloc(sizeof(t_sym_key)))) + return (NULL); + new->pass = pass; + new->salt = salt; + new->key = key; + return (new); +} + +void free_sym_key(t_sym_key **to_free) +{ + ft_memdel((void**)&((*to_free)->pass)); + ft_memdel((void**)&((*to_free)->salt)); + ft_memdel((void**)&((*to_free)->key)); + ft_memdel((void**)(to_free)); +} + +void free_vsym_key(void **to_free) +{ + t_sym_key **to_del; + + to_del = (t_sym_key**)to_free; + ft_memdel((void**)&((*to_del)->pass)); + ft_memdel((void**)&((*to_del)->salt)); + ft_memdel((void**)&((*to_del)->key)); + ft_memdel((void**)(to_del)); +} \ No newline at end of file diff --git a/srcs/symmetric/symmetric_parsing.c b/srcs/symmetric/symmetric_parsing.c new file mode 100644 index 0000000..ab19e2a --- /dev/null +++ b/srcs/symmetric/symmetric_parsing.c @@ -0,0 +1,45 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* symmetric_parsing.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/05/06 12:04:37 by cpieri #+# #+# */ +/* Updated: 2019/05/06 14:40:42 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_ssl.h" +#include "symmetric/symmetric.h" +#include +#include +#include + +static t_opt *get_sym_args(const int ac, char **av, int now) +{ + t_opt opt; + t_sym_key *k; + uint8_t *pass; + + (void)av, (void)now, (void)ac; + opt = (t_opt){NULL, {0, 0, 0, 0, 0}, NULL}; + // while (now < ac) + // { + pass = get_pass("enter your password: "); + printf("pass: %s\n",pass); + k = new_key(pass, 0, 0); + printf("k->pass: %s\n",k->pass); + // now++; + // } + return (new_opt((t_flags){0,0,0,0,0}, NULL)); +} + +t_opt *symmetric_opts(const int ac, char **av, t_opt *opts, int now) +{ + t_opt *new; + + new = get_sym_args(ac, av, now); + add_to_end_lst(new, &opts); + return (opts); +} \ No newline at end of file diff --git a/srcs/tools/clean.c b/srcs/tools/clean.c index ce5d163..4324bbc 100644 --- a/srcs/tools/clean.c +++ b/srcs/tools/clean.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/15 12:07:14 by cpieri #+# #+# */ -/* Updated: 2019/04/12 10:25:09 by cpieri ### ########.fr */ +/* Updated: 2019/05/06 15:15:04 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,11 +18,8 @@ void clean_data(t_data **data) { if ((*data)->mall == 1) ft_memdel((void**)&((*data)->data)); - if ((*data)->f_hash != NULL) - { - ft_memdel((void**)&((*data)->f_hash->h)); - ft_memdel((void**)&((*data)->f_hash)); - } + if ((*data)->data_2_print != NULL) + ft_memdel((void**)&((*data)->data_2_print)); ft_memdel((void**)data); } } @@ -37,8 +34,9 @@ void clean_prog(t_parse *parse) { if (lst->data->mall == 1) ft_memdel((void**)&(lst->data->data)); - ft_memdel((void**)&(lst->data->f_hash->h)); - ft_memdel((void**)&(lst->data->f_hash)); + if (parse->is_ciphash == e_hash) + ft_memdel((void**)&(((t_hash*)(lst->data->data_2_print))->h)); + ft_memdel((void**)&(lst->data->data_2_print)); ft_memdel((void**)&(lst->data)); next = lst->next; ft_memdel((void**)&(lst)); diff --git a/srcs/tools/error.c b/srcs/tools/error.c new file mode 100644 index 0000000..f5e5093 --- /dev/null +++ b/srcs/tools/error.c @@ -0,0 +1,64 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* error.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/05/06 14:35:34 by cpieri #+# #+# */ +/* Updated: 2019/05/06 15:09:07 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_ssl.h" +#include + +void print_error(const char *msg) +{ + char *error; + + ft_putstr_fd("ft_ssl: ", 2); + ft_putstr_fd(msg, 2); + ft_putstr_fd(": ", 2); + error = strerror(errno); + ft_putendl_fd(error, 2); +} + +void exit_error_free(void **to_free) +{ + char *error; + + ft_putstr_fd("ft_ssl: ", 2); + error = strerror(errno); + ft_putendl_fd(error, 2); + ft_memdel(to_free); + exit(FAILURE); +} + +void exit_error(void) +{ + char *error; + + ft_putstr_fd("ft_ssl: ", 2); + error = strerror(errno); + ft_putendl_fd(error, 2); + exit(FAILURE); +} + +void exit_error_msg(const char *msg) +{ + char *error; + + ft_putstr_fd("ft_ssl: ", 2); + ft_putstr_fd(msg, 2); + ft_putstr_fd(": ", 2); + error = strerror(errno); + ft_putendl_fd(error, 2); + exit(FAILURE); +} + +void exit_msg(const char *msg) +{ + ft_putendl_fd(msg, 2); + exit(FAILURE); +} diff --git a/srcs/tools/usage.c b/srcs/tools/usage.c index 73a8cda..4ede8ee 100644 --- a/srcs/tools/usage.c +++ b/srcs/tools/usage.c @@ -6,13 +6,12 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/24 17:06:36 by cpieri #+# #+# */ -/* Updated: 2019/04/11 14:11:59 by cpieri ### ########.fr */ +/* Updated: 2019/05/06 14:42:15 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" #include -#include static void invalid_command(const char *command) { @@ -43,35 +42,3 @@ void print_usage(const int usage_int, const char *command) invalid_command(command); exit(FAILURE); } - -void print_error(const char *msg_1) -{ - char *error; - - ft_putstr_fd("ft_ssl: ", 2); - ft_putstr_fd(msg_1, 2); - ft_putstr_fd(": ", 2); - error = strerror(errno); - ft_putendl_fd(error, 2); -} - -void exit_error_free(void **to_free) -{ - char *error; - - ft_putstr_fd("ft_ssl: ", 2); - error = strerror(errno); - ft_putendl_fd(error, 2); - ft_memdel(to_free); - exit(FAILURE); -} - -void exit_error(void) -{ - char *error; - - ft_putstr_fd("ft_ssl: ", 2); - error = strerror(errno); - ft_putendl_fd(error, 2); - exit(FAILURE); -} From 7b01f77e6af68ef342674220b9724dfb7715c851 Mon Sep 17 00:00:00 2001 From: Louise P Date: Mon, 6 May 2019 15:27:14 +0200 Subject: [PATCH 26/71] ok --- srcs/symmetric/symmetric_parsing.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/srcs/symmetric/symmetric_parsing.c b/srcs/symmetric/symmetric_parsing.c index ab19e2a..f11c61d 100644 --- a/srcs/symmetric/symmetric_parsing.c +++ b/srcs/symmetric/symmetric_parsing.c @@ -6,32 +6,38 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 12:04:37 by cpieri #+# #+# */ -/* Updated: 2019/05/06 14:40:42 by cpieri ### ########.fr */ +/* Updated: 2019/05/06 15:26:59 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" #include "symmetric/symmetric.h" #include -#include #include +static void get_sym_opt(char **av, int *now, t_opt *opt) +{ + (void)av; + (void)now; + (void)opt; +} + static t_opt *get_sym_args(const int ac, char **av, int now) { t_opt opt; t_sym_key *k; - uint8_t *pass; - (void)av, (void)now, (void)ac; + (void)av; + k = NULL; opt = (t_opt){NULL, {0, 0, 0, 0, 0}, NULL}; - // while (now < ac) - // { - pass = get_pass("enter your password: "); - printf("pass: %s\n",pass); - k = new_key(pass, 0, 0); - printf("k->pass: %s\n",k->pass); - // now++; - // } + while (now < ac) + { + if (av[now][0] == '-') + get_sym_opt(av, &now, &opt); + now++; + } + if (k == NULL) + k = new_key(get_pass("enter your password: "), 0, 0); return (new_opt((t_flags){0,0,0,0,0}, NULL)); } From c8d3ed56ca107a90bb7a6c04bf46ec348e42dc3e Mon Sep 17 00:00:00 2001 From: Louise P Date: Mon, 6 May 2019 16:24:26 +0200 Subject: [PATCH 27/71] check flags --- srcs/symmetric/symmetric_parsing.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/srcs/symmetric/symmetric_parsing.c b/srcs/symmetric/symmetric_parsing.c index f11c61d..d6ae4b2 100644 --- a/srcs/symmetric/symmetric_parsing.c +++ b/srcs/symmetric/symmetric_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 12:04:37 by cpieri #+# #+# */ -/* Updated: 2019/05/06 15:26:59 by cpieri ### ########.fr */ +/* Updated: 2019/05/06 16:18:11 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,11 +15,33 @@ #include #include +/* +else if (av[*now][i] == 'o') +{ + t_o->flags.b64_flags |= e_base64_outputf; + *output = (av[(*now) + 1] != NULL) ? av[(*now) + 1] : NULL; + (*now)++; +} +*/ + static void get_sym_opt(char **av, int *now, t_opt *opt) { - (void)av; - (void)now; + size_t len_now; + size_t i; + + i = 0; (void)opt; + len_now = ft_strlen(av[*now]); + while (++i < len_now) + { + while (g_sym_opt[y].opt != 0) + { + if (g_sym_opt[y].opt == av[*now][i]) + printf("opt: %c", av[*now][i]); + // g_sym_opt[y].f(); + y++; + } + } } static t_opt *get_sym_args(const int ac, char **av, int now) From 2be1a9a12897b8c161e0812a04034402f1f3996e Mon Sep 17 00:00:00 2001 From: Louise P Date: Tue, 7 May 2019 16:41:11 +0200 Subject: [PATCH 28/71] [Feature]: App Enc Sym Starting Parsing for opts symmetric --- Makefile | 50 ++++++----- includes/functions.h | 3 +- includes/structure.h | 3 +- includes/symmetric/symmetric.h | 43 ++++++++- libft/include/libft.h | 111 +++++++++++++++--------- srcs/base64/base64_parsing.c | 4 +- srcs/hash/hash_parsing.c | 6 +- srcs/symmetric/sym_key.c | 30 ++++++- srcs/symmetric/symmetric_parsing.c | 42 +++++---- srcs/symmetric/symmetric_parsing_pt_f.c | 108 +++++++++++++++++++++++ srcs/symmetric/symmetric_usage.c | 30 +++++++ srcs/tools/error.c | 8 +- srcs/tools/get_data.c | 17 ++-- 13 files changed, 350 insertions(+), 105 deletions(-) create mode 100644 srcs/symmetric/symmetric_parsing_pt_f.c create mode 100644 srcs/symmetric/symmetric_usage.c diff --git a/Makefile b/Makefile index 70a977d..dfc8729 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/03/15 11:20:25 by cpieri #+# #+# # -# Updated: 2019/05/06 14:41:35 by cpieri ### ########.fr # +# Updated: 2019/05/07 11:27:35 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -40,29 +40,31 @@ DEPS = Makefile \ includes/symmetric/symmetric.h \ libft/libft.a -SRC_NAME= main.c \ - parsing.c \ - dispatch.c \ - tools/clean.c \ - tools/usage.c \ - tools/error.c \ - tools/get_data.c \ - tools/open_fd.c \ - tools/lst_opt.c \ - hash/hash_parsing.c \ - hash/display_hash.c \ - hash/sha256/sha256.c \ - hash/sha256/sha256_utils.c \ - hash/md5/md5_utils.c \ - hash/md5/md5.c \ - base64/base64.c \ - base64/base64_encode.c \ - base64/base64_decode.c \ - base64/base64_parsing.c \ - base64/base64_help_parsing.c \ - base64/base64_display.c \ - symmetric/sym_key.c \ - symmetric/symmetric_parsing.c \ +SRC_NAME= main.c \ + parsing.c \ + dispatch.c \ + tools/clean.c \ + tools/usage.c \ + tools/error.c \ + tools/get_data.c \ + tools/open_fd.c \ + tools/lst_opt.c \ + hash/hash_parsing.c \ + hash/display_hash.c \ + hash/sha256/sha256.c \ + hash/sha256/sha256_utils.c \ + hash/md5/md5_utils.c \ + hash/md5/md5.c \ + base64/base64.c \ + base64/base64_encode.c \ + base64/base64_decode.c \ + base64/base64_parsing.c \ + base64/base64_help_parsing.c \ + base64/base64_display.c \ + symmetric/sym_key.c \ + symmetric/symmetric_usage.c \ + symmetric/symmetric_parsing.c \ + symmetric/symmetric_parsing_pt_f.c \ OBJ_NAME= $(SRC_NAME:.c=.o) diff --git a/includes/functions.h b/includes/functions.h index 87fc0aa..85cd41a 100644 --- a/includes/functions.h +++ b/includes/functions.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:44:05 by cpieri #+# #+# */ -/* Updated: 2019/05/06 15:01:08 by cpieri ### ########.fr */ +/* Updated: 2019/05/07 14:14:10 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -46,6 +46,7 @@ int reopen_fd(const int current_fd, const char *file); /* ** Functions for get File, Data, or String */ +t_data *new_data(void); t_data *get_data(const int fd, const char *fd_name); t_data *get_file(const int fd, const char *fd_name); t_data *get_string(char *s); diff --git a/includes/structure.h b/includes/structure.h index f17b9d2..03870a2 100644 --- a/includes/structure.h +++ b/includes/structure.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:27:48 by cpieri #+# #+# */ -/* Updated: 2019/05/06 12:31:32 by cpieri ### ########.fr */ +/* Updated: 2019/05/07 09:55:58 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -37,6 +37,7 @@ typedef struct s_flags int r; int s; uint32_t b64_flags; + uint64_t sym_flags; } t_flags; typedef struct s_opt diff --git a/includes/symmetric/symmetric.h b/includes/symmetric/symmetric.h index 2ff17cd..cb6c663 100644 --- a/includes/symmetric/symmetric.h +++ b/includes/symmetric/symmetric.h @@ -6,32 +6,69 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 10:11:43 by cpieri #+# #+# */ -/* Updated: 2019/05/06 14:39:29 by cpieri ### ########.fr */ +/* Updated: 2019/05/07 16:07:25 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef SYMMETRIC_H # define SYMMETRIC_H -# include "../libft/include/libft.h" +# include "../../libft/include/libft.h" +# include "../structure.h" // # include "./des/des.h" +enum e_sym_opt +{ + e_sym_opt_a = 1, + e_sym_opt_d, + e_sym_opt_e, + e_sym_opt_i, + e_sym_opt_o, + e_sym_opt_k, + e_sym_opt_p, + e_sym_opt_s, + e_sym_opt_v +}; + typedef struct s_sym_key { uint8_t *pass; uint64_t salt; uint64_t key; + uint64_t vect; } t_sym_key; +typedef struct s_sym_opt +{ + char opt; + int flag; + void (*sym_opt_fun)(char **, int *, t_opt *, t_sym_key **); +} t_sym_opt; + // void *cbc(void *msg, void *key, size_t msg_len, size_t key_len); // void *ecb(void *msg, void *key, size_t msg_len, size_t key_len); +/* +** Functions for get options in parsing +*/ +void get_sym_opt_i(char **av, int *now, t_opt *opt, t_sym_key **k); +void get_sym_opt_o(char **av, int *now, t_opt *opt, t_sym_key **k); +void get_sym_opt_k(char **av, int *now, t_opt *opt, t_sym_key **k); +void get_sym_opt_s(char **av, int *now, t_opt *opt, t_sym_key **k); +void get_sym_opt_p(char **av, int *now, t_opt *opt, t_sym_key **k); + /* ** Functions for create and del struct symmetric key */ uint8_t *get_pass(const char *prompt); -t_sym_key *new_key(uint8_t *pass, uint64_t salt, uint64_t key); +t_sym_key *new_key(uint8_t *pass, uint64_t salt, uint64_t key, uint64_t vect); +void print_t_key(t_sym_key *to_print); void free_sym_key(t_sym_key **to_free); void free_sym_key(t_sym_key **to_free); +/* +** Usage +*/ +void sym_usage(const char *opt); + #endif \ No newline at end of file diff --git a/libft/include/libft.h b/libft/include/libft.h index 8051cfe..bf1b3fd 100644 --- a/libft/include/libft.h +++ b/libft/include/libft.h @@ -5,8 +5,8 @@ /* +:+ +:+ +:+ */ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2017/11/09 16:47:24 by tmilon #+# #+# */ -/* Updated: 2019/04/30 11:21:18 by cpieri ### ########.fr */ +/* Created: 2017/11/09 16:47:24 by cpieri #+# #+# */ +/* Updated: 2019/05/07 10:32:50 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,11 +25,9 @@ typedef struct s_list struct s_list *next; } t_list; -int get_next_line(const int fd, char **line); -int *find_closest_offset(int x, int y, int tx, int ty); -int ftb_abs(int n); -char **ft_strsplit(char const *s, char c); -char *ft_itoa(int n); +/* +** Functions for Strings +*/ char *ft_strcat(char *s1, const char *s2); char *ft_strchr(const char *s, int c); char *ft_strchr(const char *s, int c); @@ -48,32 +46,27 @@ char *ft_strstr(const char *haystack, const char *needle); char *ft_strsub(char const *s, unsigned int start, size_t len); char *ft_strtrim(char const *s); char *ftb_trimtodigit(const char *str); -int ft_atoi(const char *str); -int ft_isalnum(int c); -int ft_isalpha(int c); -int ft_isascii(int c); -int ft_isdigit(int c); -int ft_isprint(int c); -int ft_isspace(char c); -int ft_memcmp(const void *s1, const void *s2, size_t n); +char **ft_strsplit(char const *s, char c); +int get_next_line(const int fd, char **line); int ft_strcmp(const char *s1, const char *s2); int ft_strequ(char const *s1, char const *s2); int ft_strncmp(const char *s1, const char *s2, size_t n); int ft_strnequ(char const *s1, char const *s2, size_t n); +int ft_countstrtab(char **tab); int ft_tolower(int c); int ft_toupper(int c); -int ftb_adjustmagn(unsigned int toadjust, unsigned int goal); -int ftb_intlen(int n); -int ftb_pow(int n, int pow); -int hex2int(char *hex); -int ftb_rand(unsigned int min, - unsigned int max, unsigned int seed); size_t ft_strlcat(char *dst, const char *src, size_t size); size_t ft_strlen(const char *s); -t_list *ft_lstmap(t_list *lst, t_list *(*f)(t_list *elem)); -t_list *ft_lstnew(void const *content, size_t content_size); -void ft_membits(void *s, size_t len, size_t size); -void ft_memdel(void **ap); +void ft_strclr(char *s); +void ft_striter(char *s, void (*f)(char *)); +void ft_strdel(char **as); +void ft_striteri(char *s, void (*f)(unsigned int, char *)); +void ft_strbits(char *s); +void free_multiarray(char **array); + +/* +** Functions for Mem +*/ void *ft_memalloc(size_t size); void *ft_memccpy(void *dst, const void *src, int c, size_t n); void *ft_memchr(const void *s, int c, size_t n); @@ -81,15 +74,42 @@ void *ft_memcpy(void *dst, const void *src, size_t n); void *ft_memmove(void *dst, const void *src, size_t len); void *ft_memset(void *b, int c, size_t len); void *ft_memdup(const void *s1, size_t len); +void *ftb_backwardmemcpy(void *dst, const void *src, size_t len); void *ft_memjoin(const void *s1, const void *s2, size_t len1, size_t len2); -void ft_memput(void *s, size_t len); -void *ftb_backwardmemcpy(void *dst, const void *src, size_t len); void ft_bzero(void *s, size_t n); +void ft_memdel(void **ap); +int ft_memcmp(const void *s1, const void *s2, size_t n); +void ft_membits(void *s, size_t len, size_t size); +void ft_memput(void *s, size_t len); + +/* +** Functions for check is ?... +*/ +int ft_isalnum(int c); +int ft_isalpha(int c); +int ft_isascii(int c); +int ft_isdigit(int c); +int ft_isprint(int c); +int ft_isspace(char c); +int ft_ishexa_color(char *s); + +/* +** Functions for Linked List +*/ +t_list *ft_lstmap(t_list *lst, t_list *(*f)(t_list *elem)); +t_list *ft_lstnew(void const *content, size_t content_size); void ft_lstadd(t_list **alst, t_list *new); void ft_lstdel(t_list **alst, void (*del)(void *, size_t)); void ft_lstdelone(t_list **alst, void (*del)(void *, size_t)); void ft_lstiter(t_list *lst, void (*f)(t_list *elem)); +void ftb_lstpush(t_list **alst, t_list *new); +void ftb_lstlastpop(t_list **alst, void (*del)(void *, size_t)); +void debug_print_list(t_list **alst, char *name); + +/* +** Functions for print +*/ void ft_putchar(char c); void ft_putchar_fd(char c, int fd); void ft_putendl(char const *s); @@ -99,23 +119,34 @@ void ft_putnbr_fd(int n, int fd); void ft_puthexa(int nb); void ft_putstr(char const *s); void ft_putstr_fd(char const *s, int fd); -void ft_strclr(char *s); -void ft_strdel(char **as); -void ft_striter(char *s, void (*f)(char *)); -void ft_striteri(char *s, void (*f)(unsigned int, char *)); -void ftb_lstpush(t_list **alst, t_list *new); -void ftb_lstlastpop(t_list **alst, void (*del)(void *, size_t)); -void free_multiarray(char **array); -void debug_print_list(t_list **alst, char *name); +void ft_putbits(unsigned char octet); void ft_abort(char *msg); + +/* +** Functions for Int +*/ +char *ft_itoa(int n); +long ft_atol(const char *str); +int ft_atoi(const char *str); +int ftb_intlen(int n); int ft_sqrt(int n); -int ft_ishexa_color(char *s); -int ft_countstrtab(char **tab); +int ftb_abs(int n); +int ftb_pow(int n, int pow); +int *find_closest_offset(int x, int y, int tx, int ty); +int hex2int(char *hex); +int ftb_rand(unsigned int min, + unsigned int max, unsigned int seed); +int ftb_adjustmagn(unsigned int toadjust, unsigned int goal); + +/* +** Functions for Double +*/ double ft_atof(const char *str); double ftb_clamp(double toclamp, double min, double max); -long ft_atol(const char *str); -void ft_putbits(unsigned char octet); -void ft_strbits(char *s); + +/* +** Functions for Bitwise +*/ uint32_t left_rotate(uint32_t x, uint32_t nb); uint32_t right_rotate(uint32_t x, uint32_t nb); uint32_t swap_uint32t(uint32_t nb); diff --git a/srcs/base64/base64_parsing.c b/srcs/base64/base64_parsing.c index b14dbbe..692594c 100644 --- a/srcs/base64/base64_parsing.c +++ b/srcs/base64/base64_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 16:56:03 by cpieri #+# #+# */ -/* Updated: 2019/05/03 15:01:37 by cpieri ### ########.fr */ +/* Updated: 2019/05/07 09:58:44 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -42,7 +42,7 @@ static t_opt *get_base64_args(const int ac, char **av, int now) char *fd_output; fd_output = NULL; - t_o = (t_opt){NULL, {0, 0, 0, 0, 0}, NULL}; + t_o = (t_opt){NULL, {0, 0, 0, 0, 0, 0}, NULL}; while (now < ac) { if (av[now][0] == '-') diff --git a/srcs/hash/hash_parsing.c b/srcs/hash/hash_parsing.c index 675d517..dd1bba2 100644 --- a/srcs/hash/hash_parsing.c +++ b/srcs/hash/hash_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/22 14:00:59 by cpieri #+# #+# */ -/* Updated: 2019/04/11 18:16:17 by cpieri ### ########.fr */ +/* Updated: 2019/05/07 09:58:41 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -50,7 +50,7 @@ static t_opt *get_hash_args(char **av, int now) tmp = NULL; new = NULL; - flags = (t_flags){0, 0, 0, 0, 0}; + flags = (t_flags){0, 0, 0, 0, 0, 0}; if (av[now][0] == '-') { len = ft_strlen(av[now]); @@ -73,7 +73,7 @@ t_opt *hash_opts(const int ac, char **av, t_opt *opts, int now) t_opt *new; if (ac < 3) - new = new_opt((t_flags){0, 0, 0, 0, 0}, get_data(0, NULL)); + new = new_opt((t_flags){0, 0, 0, 0, 0, 0}, get_data(0, NULL)); else new = get_hash_args(av, now); add_to_end_lst(new, &opts); diff --git a/srcs/symmetric/sym_key.c b/srcs/symmetric/sym_key.c index f5b0014..4b269b3 100644 --- a/srcs/symmetric/sym_key.c +++ b/srcs/symmetric/sym_key.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 13:53:56 by cpieri #+# #+# */ -/* Updated: 2019/05/06 15:07:17 by cpieri ### ########.fr */ +/* Updated: 2019/05/07 16:15:52 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,7 +24,7 @@ uint8_t *get_pass(const char *prompt) conf_pass = getpass(conf_prompt); ft_memdel((void**)&conf_prompt); if (!pass || !conf_pass) - exit_msg("getpass"); + exit_error_msg("getpass"); if (ft_strcmp(conf_pass, pass) != 0) { ft_memdel((void**)&pass); @@ -33,7 +33,7 @@ uint8_t *get_pass(const char *prompt) return ((uint8_t*)pass); } -t_sym_key *new_key(uint8_t *pass, uint64_t salt, uint64_t key) +t_sym_key *new_key(uint8_t *pass, uint64_t salt, uint64_t key, uint64_t vect) { t_sym_key *new; @@ -42,9 +42,31 @@ t_sym_key *new_key(uint8_t *pass, uint64_t salt, uint64_t key) new->pass = pass; new->salt = salt; new->key = key; + new->vect = vect; return (new); } +void print_t_key(t_sym_key *k) +{ + ft_putstr("pass: "); + ft_putendl((char*)k->pass); + ft_putstr("salt: "); + ft_membits(&(k->salt), 0, sizeof(uint64_t)); + ft_putstr("salt hexa: "); + ft_puthexa(k->salt); + ft_putchar('\n'); + ft_putstr("key: "); + ft_membits(&(k->key), 0, sizeof(uint64_t)); + ft_putstr("key hexa: "); + ft_puthexa(k->key); + ft_putchar('\n'); + ft_putstr("vect: "); + ft_membits(&(k->vect), 0, sizeof(uint64_t)); + ft_putstr("vect hexa: "); + ft_puthexa(k->vect); + ft_putchar('\n'); +} + void free_sym_key(t_sym_key **to_free) { ft_memdel((void**)&((*to_free)->pass)); @@ -62,4 +84,4 @@ void free_vsym_key(void **to_free) ft_memdel((void**)&((*to_del)->salt)); ft_memdel((void**)&((*to_del)->key)); ft_memdel((void**)(to_del)); -} \ No newline at end of file +} diff --git a/srcs/symmetric/symmetric_parsing.c b/srcs/symmetric/symmetric_parsing.c index d6ae4b2..039350c 100644 --- a/srcs/symmetric/symmetric_parsing.c +++ b/srcs/symmetric/symmetric_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 12:04:37 by cpieri #+# #+# */ -/* Updated: 2019/05/06 16:18:11 by cpieri ### ########.fr */ +/* Updated: 2019/05/07 16:17:21 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,30 +15,36 @@ #include #include -/* -else if (av[*now][i] == 'o') +static const t_sym_opt g_sym_opt[] = { - t_o->flags.b64_flags |= e_base64_outputf; - *output = (av[(*now) + 1] != NULL) ? av[(*now) + 1] : NULL; - (*now)++; -} -*/ + {'e', e_sym_opt_e, NULL}, + {'d', e_sym_opt_d, NULL}, + {'a', e_sym_opt_a, NULL}, + {'i', e_sym_opt_i, get_sym_opt_i}, + {'o', e_sym_opt_o, get_sym_opt_o}, + {'k', e_sym_opt_k, get_sym_opt_k}, + {'s', e_sym_opt_s, get_sym_opt_s}, + {'p', e_sym_opt_p, get_sym_opt_p}, + {'v', e_sym_opt_v, NULL}, + {0, 0, NULL} +}; -static void get_sym_opt(char **av, int *now, t_opt *opt) +static void get_sym_opt(char **av, int *now, t_opt *opt, t_sym_key **k) { size_t len_now; size_t i; + size_t y; i = 0; - (void)opt; len_now = ft_strlen(av[*now]); while (++i < len_now) { + y = 0; while (g_sym_opt[y].opt != 0) { if (g_sym_opt[y].opt == av[*now][i]) - printf("opt: %c", av[*now][i]); - // g_sym_opt[y].f(); + if (g_sym_opt[y].sym_opt_fun != NULL) + g_sym_opt[y].sym_opt_fun(av, now, opt, k); y++; } } @@ -51,23 +57,23 @@ static t_opt *get_sym_args(const int ac, char **av, int now) (void)av; k = NULL; - opt = (t_opt){NULL, {0, 0, 0, 0, 0}, NULL}; + opt = (t_opt){NULL, {0, 0, 0, 0, 0, 0}, NULL}; while (now < ac) { if (av[now][0] == '-') - get_sym_opt(av, &now, &opt); + get_sym_opt(av, &now, &opt, &k); now++; } if (k == NULL) - k = new_key(get_pass("enter your password: "), 0, 0); - return (new_opt((t_flags){0,0,0,0,0}, NULL)); + k = new_key(get_pass("enter your password: "), 0, 0, 0); + return (new_opt((t_flags){0, 0, 0, 0, 0, 0}, NULL)); } -t_opt *symmetric_opts(const int ac, char **av, t_opt *opts, int now) +t_opt *symmetric_opts(const int ac, char **av, t_opt *opts, int now) { t_opt *new; new = get_sym_args(ac, av, now); add_to_end_lst(new, &opts); return (opts); -} \ No newline at end of file +} diff --git a/srcs/symmetric/symmetric_parsing_pt_f.c b/srcs/symmetric/symmetric_parsing_pt_f.c new file mode 100644 index 0000000..df797aa --- /dev/null +++ b/srcs/symmetric/symmetric_parsing_pt_f.c @@ -0,0 +1,108 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* symmetric_parsing_pt_f.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/05/07 09:34:06 by cpieri #+# #+# */ +/* Updated: 2019/05/07 16:37:01 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "symmetric/symmetric.h" +#include "ft_ssl.h" +#include + +void get_sym_opt_i(char **av, int *now, t_opt *opt, t_sym_key **k) +{ + char *fd; + const char *fd_output; + + (void)k; + fd_output = NULL; + if ((fd = av[*now + 1]) == NULL || fd[0] == '-') + sym_usage(av[*now]); + opt->flags.sym_flags |= e_sym_opt_i; + if (opt->data != NULL && fd != NULL) + { + if (opt->data->fd_output != NULL) + fd_output = opt->data->fd_output; + clean_data(&(opt->data)); + } + opt->data = get_data(open_fd(fd), fd); + opt->data->fd_output = fd_output; + (*now)++; +} + +void get_sym_opt_o(char **av, int *now, t_opt *opt, t_sym_key **k) +{ + char *fd_output; + + (void)k; + if ((fd_output = av[*now + 1]) == NULL || fd_output[0] == '-') + sym_usage(av[*now]); + opt->flags.sym_flags |= e_sym_opt_o; + if (opt->data == NULL) + opt->data = new_data(); + opt->data->fd_output = fd_output; + (*now)++; +} + +void get_sym_opt_k(char **av, int *now, t_opt *opt, t_sym_key **k) +{ + uint64_t key; + + if (av[*now + 1] == NULL || av[*now + 1][0] == '-') + sym_usage(av[*now]); + key = hex2int(av[*now + 1]); + opt->flags.sym_flags |= e_sym_opt_k; + if ((opt->flags.sym_flags & e_sym_opt_s) == e_sym_opt_s) + opt->flags.sym_flags ^= e_sym_opt_s; + if (*k == NULL) + *k = new_key(NULL, 0, key, 0); + else + (*k)->key = key; + (*now)++; +} + +void get_sym_opt_s(char **av, int *now, t_opt *opt, t_sym_key **k) +{ + uint64_t salt; + + if (av[*now + 1] == NULL || av[*now + 1][0] == '-') + sym_usage(av[*now]); + if ((opt->flags.sym_flags & e_sym_opt_k) != e_sym_opt_k) + { + salt = hex2int(av[*now + 1]); + opt->flags.sym_flags |= e_sym_opt_s; + if (*k == NULL) + *k = new_key(NULL, salt, 0, 0); + else + (*k)->salt = salt; + (*now)++; + } +} + +void get_sym_opt_p(char **av, int *now, t_opt *opt, t_sym_key **k) +{ + char *pass; + + if ((pass = av[*now + 1]) == NULL || pass[0] == '-') + sym_usage(av[*now]); + ft_membits(&(opt->flags.sym_flags), 0, sizeof(uint64_t)); + if ((opt->flags.sym_flags & e_sym_opt_k) != e_sym_opt_k + && ft_strncmp(pass, "pass:", 5) == 0 && ft_strlen(pass) >= 6) + { + opt->flags.sym_flags |= e_sym_opt_p; + if (*k == NULL) + *k = new_key((uint8_t*)(pass + 5), 0, 0, 0); + else + (*k)->pass = (uint8_t*)(pass + 5); + (*now)++; + ft_membits(&(opt->flags.sym_flags), 0, sizeof(uint64_t)); + print_t_key(*k); + } + else + sym_usage(av[*now]); +} diff --git a/srcs/symmetric/symmetric_usage.c b/srcs/symmetric/symmetric_usage.c new file mode 100644 index 0000000..388b2d4 --- /dev/null +++ b/srcs/symmetric/symmetric_usage.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* symmetric_usage.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/05/07 11:15:38 by cpieri #+# #+# */ +/* Updated: 2019/05/07 16:15:07 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_ssl.h" + +void sym_usage(const char *opt) +{ + ft_putstr_fd("ft_ssl: Error options: ", 2); + ft_putendl_fd(opt, 2); + ft_putendl_fd("-e Encrypt (default mode)", 2); + ft_putendl_fd("-d Decrypt", 2); + ft_putstr_fd("-a Base64 encode/decode,", 2); + ft_putendl_fd(" depending on encryption flag", 2); + ft_putendl_fd("-i Input file", 2); + ft_putendl_fd("-o Output file", 2); + ft_putendl_fd("-k Key in hex is the next arg", 2); + ft_putendl_fd("-s Salt in hex is the next arg", 2); + ft_putendl_fd("-p Password in ascii is the next arg", 2); + ft_putendl_fd("-v Init vector in ascii is the next arg", 2); + exit(FAILURE); +} diff --git a/srcs/tools/error.c b/srcs/tools/error.c index f5e5093..0eaec37 100644 --- a/srcs/tools/error.c +++ b/srcs/tools/error.c @@ -6,14 +6,14 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 14:35:34 by cpieri #+# #+# */ -/* Updated: 2019/05/06 15:09:07 by cpieri ### ########.fr */ +/* Updated: 2019/05/07 16:14:37 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" #include -void print_error(const char *msg) +void print_error(const char *msg) { char *error; @@ -24,7 +24,7 @@ void print_error(const char *msg) ft_putendl_fd(error, 2); } -void exit_error_free(void **to_free) +void exit_error_free(void **to_free) { char *error; @@ -35,7 +35,7 @@ void exit_error_free(void **to_free) exit(FAILURE); } -void exit_error(void) +void exit_error(void) { char *error; diff --git a/srcs/tools/get_data.c b/srcs/tools/get_data.c index fa1b127..a6429f8 100644 --- a/srcs/tools/get_data.c +++ b/srcs/tools/get_data.c @@ -6,12 +6,22 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/08 12:03:54 by cpieri #+# #+# */ -/* Updated: 2019/04/30 14:28:04 by cpieri ### ########.fr */ +/* Updated: 2019/05/07 14:10:52 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" +t_data *new_data(void) +{ + t_data *ret; + + if (!(ret = (t_data*)malloc(sizeof(t_data)))) + exit_error(); + *ret = (t_data){NULL, NULL, NULL, 0, 0, NULL, NULL}; + return (ret); +} + t_data *get_string(char *s) { t_data *ret; @@ -19,10 +29,7 @@ t_data *get_string(char *s) ret = NULL; if (!(ret = (t_data*)malloc(sizeof(t_data)))) exit_error(); - ret->fd_name = s; - ret->data = s; - ret->len_data = ft_strlen(s); - ret->mall = 0; + *ret = (t_data){NULL, s, s, ft_strlen(s), 0, NULL, NULL}; s = NULL; return (ret); } From 2657f1f399a01d246cc898a90a8d29474218daed Mon Sep 17 00:00:00 2001 From: Louise P Date: Tue, 7 May 2019 16:46:59 +0200 Subject: [PATCH 29/71] rm logs test --- test/logs/trace_Invalid_command_01 | 9 ---- test/logs/trace_Invalid_command_02 | 9 ---- test/logs/trace_Invalid_command_03 | 9 ---- test/logs/trace_Invalid_command_04 | 9 ---- test/logs/trace_Invalid_command_05 | 9 ---- test/logs/trace_directory | 1 - test/logs/trace_file_not_found | 1 - test/logs/trace_md5_binary_file_arg | 1 - test/logs/trace_md5_binary_file_stdin | 1 - test/logs/trace_md5_empty_file_arg | 1 - test/logs/trace_md5_empty_file_stdin | 1 - test/logs/trace_md5_large_file_arg | 1 - test/logs/trace_md5_large_file_stdin | 1 - test/logs/trace_md5_medium_file_arg | 1 - test/logs/trace_md5_medium_file_stdin | 1 - .../trace_md5_option_s_448_chars_edge_case | 1 - test/logs/trace_md5_option_s_basic_string | 1 - test/logs/trace_md5_option_s_empty_string | 1 - test/logs/trace_md5_option_s_unicode | 1 - test/logs/trace_md5_small_file_arg | 1 - test/logs/trace_md5_small_file_stdin | 1 - test/logs/trace_no_argument_01 | 1 - test/logs/trace_no_argument_02 | 1 - test/logs/trace_option_s_without_arg | 1 - test/logs/trace_original_md5_binary_file_arg | 1 - .../logs/trace_original_md5_binary_file_stdin | 1 - test/logs/trace_original_md5_empty_file_arg | 1 - test/logs/trace_original_md5_empty_file_stdin | 1 - test/logs/trace_original_md5_large_file_arg | 1 - test/logs/trace_original_md5_large_file_stdin | 1 - test/logs/trace_original_md5_medium_file_arg | 1 - .../logs/trace_original_md5_medium_file_stdin | 1 - ..._original_md5_option_s_448_chars_edge_case | 1 - .../trace_original_md5_option_s_basic_string | 1 - .../trace_original_md5_option_s_empty_string | 1 - test/logs/trace_original_md5_option_s_unicode | 1 - test/logs/trace_original_md5_small_file_arg | 1 - test/logs/trace_original_md5_small_file_stdin | 1 - .../trace_original_sha256_binary_file_stdin | 1 - .../trace_original_sha256_empty_file_stdin | 1 - .../trace_original_sha256_large_file_stdin | 1 - .../trace_original_sha256_medium_file_stdin | 1 - ...race_original_sha256_option_s_basic_string | 1 - ...race_original_sha256_option_s_empty_string | 1 - .../trace_original_sha256_option_s_unicode | 1 - .../trace_original_sha256_small_file_stdin | 1 - test/logs/trace_permission_denied | 1 - test/logs/trace_sha256_binary_file_stdin | 1 - test/logs/trace_sha256_empty_file_stdin | 1 - test/logs/trace_sha256_large_file_stdin | 1 - test/logs/trace_sha256_medium_file_stdin | 1 - test/logs/trace_sha256_option_s_basic_string | 1 - test/logs/trace_sha256_option_s_empty_string | 1 - test/logs/trace_sha256_option_s_unicode | 1 - test/logs/trace_sha256_small_file_stdin | 1 - test/logs/trace_subject_test_01 | 1 - test/logs/trace_subject_test_02 | 2 - test/logs/trace_subject_test_03 | 1 - test/logs/trace_subject_test_04 | 1 - test/logs/trace_subject_test_05 | 1 - test/logs/trace_subject_test_06 | 1 - test/logs/trace_subject_test_07 | 3 -- test/logs/trace_subject_test_08 | 3 -- test/logs/trace_subject_test_09 | 4 -- test/logs/trace_subject_test_10 | 5 --- test/logs/trace_subject_test_11 | 4 -- test/logs/trace_valgrind_Invalid_command_01 | 44 ------------------- test/logs/trace_valgrind_Invalid_command_02 | 44 ------------------- test/logs/trace_valgrind_Invalid_command_03 | 44 ------------------- test/logs/trace_valgrind_Invalid_command_04 | 44 ------------------- test/logs/trace_valgrind_Invalid_command_05 | 44 ------------------- test/logs/trace_valgrind_directory | 36 --------------- test/logs/trace_valgrind_file_not_found | 36 --------------- test/logs/trace_valgrind_md5_binary_file_arg | 36 --------------- .../logs/trace_valgrind_md5_binary_file_stdin | 36 --------------- test/logs/trace_valgrind_md5_empty_file_arg | 36 --------------- test/logs/trace_valgrind_md5_empty_file_stdin | 36 --------------- test/logs/trace_valgrind_md5_large_file_arg | 36 --------------- test/logs/trace_valgrind_md5_large_file_stdin | 36 --------------- test/logs/trace_valgrind_md5_medium_file_arg | 36 --------------- .../logs/trace_valgrind_md5_medium_file_stdin | 36 --------------- ..._valgrind_md5_option_s_448_chars_edge_case | 36 --------------- .../trace_valgrind_md5_option_s_basic_string | 36 --------------- .../trace_valgrind_md5_option_s_empty_string | 36 --------------- test/logs/trace_valgrind_md5_option_s_unicode | 36 --------------- test/logs/trace_valgrind_md5_small_file_arg | 36 --------------- test/logs/trace_valgrind_md5_small_file_stdin | 36 --------------- test/logs/trace_valgrind_no_argument_01 | 36 --------------- test/logs/trace_valgrind_no_argument_02 | 36 --------------- test/logs/trace_valgrind_option_s_without_arg | 36 --------------- test/logs/trace_valgrind_permission_denied | 36 --------------- .../trace_valgrind_sha256_binary_file_stdin | 36 --------------- .../trace_valgrind_sha256_empty_file_stdin | 36 --------------- .../trace_valgrind_sha256_large_file_stdin | 36 --------------- .../trace_valgrind_sha256_medium_file_stdin | 36 --------------- ...race_valgrind_sha256_option_s_basic_string | 36 --------------- ...race_valgrind_sha256_option_s_empty_string | 36 --------------- .../trace_valgrind_sha256_option_s_unicode | 36 --------------- .../trace_valgrind_sha256_small_file_stdin | 36 --------------- test/logs/trace_valgrind_subject_test_01 | 36 --------------- test/logs/trace_valgrind_subject_test_02 | 37 ---------------- test/logs/trace_valgrind_subject_test_03 | 36 --------------- test/logs/trace_valgrind_subject_test_04 | 36 --------------- test/logs/trace_valgrind_subject_test_05 | 36 --------------- test/logs/trace_valgrind_subject_test_06 | 36 --------------- test/logs/trace_valgrind_subject_test_07 | 38 ---------------- test/logs/trace_valgrind_subject_test_08 | 38 ---------------- test/logs/trace_valgrind_subject_test_09 | 39 ---------------- test/logs/trace_valgrind_subject_test_10 | 40 ----------------- test/logs/trace_valgrind_subject_test_11 | 39 ---------------- 110 files changed, 1760 deletions(-) delete mode 100644 test/logs/trace_Invalid_command_01 delete mode 100644 test/logs/trace_Invalid_command_02 delete mode 100644 test/logs/trace_Invalid_command_03 delete mode 100644 test/logs/trace_Invalid_command_04 delete mode 100644 test/logs/trace_Invalid_command_05 delete mode 100644 test/logs/trace_directory delete mode 100644 test/logs/trace_file_not_found delete mode 100644 test/logs/trace_md5_binary_file_arg delete mode 100644 test/logs/trace_md5_binary_file_stdin delete mode 100644 test/logs/trace_md5_empty_file_arg delete mode 100644 test/logs/trace_md5_empty_file_stdin delete mode 100644 test/logs/trace_md5_large_file_arg delete mode 100644 test/logs/trace_md5_large_file_stdin delete mode 100644 test/logs/trace_md5_medium_file_arg delete mode 100644 test/logs/trace_md5_medium_file_stdin delete mode 100644 test/logs/trace_md5_option_s_448_chars_edge_case delete mode 100644 test/logs/trace_md5_option_s_basic_string delete mode 100644 test/logs/trace_md5_option_s_empty_string delete mode 100644 test/logs/trace_md5_option_s_unicode delete mode 100644 test/logs/trace_md5_small_file_arg delete mode 100644 test/logs/trace_md5_small_file_stdin delete mode 100644 test/logs/trace_no_argument_01 delete mode 100644 test/logs/trace_no_argument_02 delete mode 100644 test/logs/trace_option_s_without_arg delete mode 100644 test/logs/trace_original_md5_binary_file_arg delete mode 100644 test/logs/trace_original_md5_binary_file_stdin delete mode 100644 test/logs/trace_original_md5_empty_file_arg delete mode 100644 test/logs/trace_original_md5_empty_file_stdin delete mode 100644 test/logs/trace_original_md5_large_file_arg delete mode 100644 test/logs/trace_original_md5_large_file_stdin delete mode 100644 test/logs/trace_original_md5_medium_file_arg delete mode 100644 test/logs/trace_original_md5_medium_file_stdin delete mode 100644 test/logs/trace_original_md5_option_s_448_chars_edge_case delete mode 100644 test/logs/trace_original_md5_option_s_basic_string delete mode 100644 test/logs/trace_original_md5_option_s_empty_string delete mode 100644 test/logs/trace_original_md5_option_s_unicode delete mode 100644 test/logs/trace_original_md5_small_file_arg delete mode 100644 test/logs/trace_original_md5_small_file_stdin delete mode 100644 test/logs/trace_original_sha256_binary_file_stdin delete mode 100644 test/logs/trace_original_sha256_empty_file_stdin delete mode 100644 test/logs/trace_original_sha256_large_file_stdin delete mode 100644 test/logs/trace_original_sha256_medium_file_stdin delete mode 100644 test/logs/trace_original_sha256_option_s_basic_string delete mode 100644 test/logs/trace_original_sha256_option_s_empty_string delete mode 100644 test/logs/trace_original_sha256_option_s_unicode delete mode 100644 test/logs/trace_original_sha256_small_file_stdin delete mode 100644 test/logs/trace_permission_denied delete mode 100644 test/logs/trace_sha256_binary_file_stdin delete mode 100644 test/logs/trace_sha256_empty_file_stdin delete mode 100644 test/logs/trace_sha256_large_file_stdin delete mode 100644 test/logs/trace_sha256_medium_file_stdin delete mode 100644 test/logs/trace_sha256_option_s_basic_string delete mode 100644 test/logs/trace_sha256_option_s_empty_string delete mode 100644 test/logs/trace_sha256_option_s_unicode delete mode 100644 test/logs/trace_sha256_small_file_stdin delete mode 100644 test/logs/trace_subject_test_01 delete mode 100644 test/logs/trace_subject_test_02 delete mode 100644 test/logs/trace_subject_test_03 delete mode 100644 test/logs/trace_subject_test_04 delete mode 100644 test/logs/trace_subject_test_05 delete mode 100644 test/logs/trace_subject_test_06 delete mode 100644 test/logs/trace_subject_test_07 delete mode 100644 test/logs/trace_subject_test_08 delete mode 100644 test/logs/trace_subject_test_09 delete mode 100644 test/logs/trace_subject_test_10 delete mode 100644 test/logs/trace_subject_test_11 delete mode 100644 test/logs/trace_valgrind_Invalid_command_01 delete mode 100644 test/logs/trace_valgrind_Invalid_command_02 delete mode 100644 test/logs/trace_valgrind_Invalid_command_03 delete mode 100644 test/logs/trace_valgrind_Invalid_command_04 delete mode 100644 test/logs/trace_valgrind_Invalid_command_05 delete mode 100644 test/logs/trace_valgrind_directory delete mode 100644 test/logs/trace_valgrind_file_not_found delete mode 100644 test/logs/trace_valgrind_md5_binary_file_arg delete mode 100644 test/logs/trace_valgrind_md5_binary_file_stdin delete mode 100644 test/logs/trace_valgrind_md5_empty_file_arg delete mode 100644 test/logs/trace_valgrind_md5_empty_file_stdin delete mode 100644 test/logs/trace_valgrind_md5_large_file_arg delete mode 100644 test/logs/trace_valgrind_md5_large_file_stdin delete mode 100644 test/logs/trace_valgrind_md5_medium_file_arg delete mode 100644 test/logs/trace_valgrind_md5_medium_file_stdin delete mode 100644 test/logs/trace_valgrind_md5_option_s_448_chars_edge_case delete mode 100644 test/logs/trace_valgrind_md5_option_s_basic_string delete mode 100644 test/logs/trace_valgrind_md5_option_s_empty_string delete mode 100644 test/logs/trace_valgrind_md5_option_s_unicode delete mode 100644 test/logs/trace_valgrind_md5_small_file_arg delete mode 100644 test/logs/trace_valgrind_md5_small_file_stdin delete mode 100644 test/logs/trace_valgrind_no_argument_01 delete mode 100644 test/logs/trace_valgrind_no_argument_02 delete mode 100644 test/logs/trace_valgrind_option_s_without_arg delete mode 100644 test/logs/trace_valgrind_permission_denied delete mode 100644 test/logs/trace_valgrind_sha256_binary_file_stdin delete mode 100644 test/logs/trace_valgrind_sha256_empty_file_stdin delete mode 100644 test/logs/trace_valgrind_sha256_large_file_stdin delete mode 100644 test/logs/trace_valgrind_sha256_medium_file_stdin delete mode 100644 test/logs/trace_valgrind_sha256_option_s_basic_string delete mode 100644 test/logs/trace_valgrind_sha256_option_s_empty_string delete mode 100644 test/logs/trace_valgrind_sha256_option_s_unicode delete mode 100644 test/logs/trace_valgrind_sha256_small_file_stdin delete mode 100644 test/logs/trace_valgrind_subject_test_01 delete mode 100644 test/logs/trace_valgrind_subject_test_02 delete mode 100644 test/logs/trace_valgrind_subject_test_03 delete mode 100644 test/logs/trace_valgrind_subject_test_04 delete mode 100644 test/logs/trace_valgrind_subject_test_05 delete mode 100644 test/logs/trace_valgrind_subject_test_06 delete mode 100644 test/logs/trace_valgrind_subject_test_07 delete mode 100644 test/logs/trace_valgrind_subject_test_08 delete mode 100644 test/logs/trace_valgrind_subject_test_09 delete mode 100644 test/logs/trace_valgrind_subject_test_10 delete mode 100644 test/logs/trace_valgrind_subject_test_11 diff --git a/test/logs/trace_Invalid_command_01 b/test/logs/trace_Invalid_command_01 deleted file mode 100644 index 7f6a1e0..0000000 --- a/test/logs/trace_Invalid_command_01 +++ /dev/null @@ -1,9 +0,0 @@ -ft_ssl: Error: x is an invalid command. - -Standard commands: - -Message Digest commands: -md5 -sha256 - -Cipher commands: diff --git a/test/logs/trace_Invalid_command_02 b/test/logs/trace_Invalid_command_02 deleted file mode 100644 index 7f6a1e0..0000000 --- a/test/logs/trace_Invalid_command_02 +++ /dev/null @@ -1,9 +0,0 @@ -ft_ssl: Error: x is an invalid command. - -Standard commands: - -Message Digest commands: -md5 -sha256 - -Cipher commands: diff --git a/test/logs/trace_Invalid_command_03 b/test/logs/trace_Invalid_command_03 deleted file mode 100644 index 7f6a1e0..0000000 --- a/test/logs/trace_Invalid_command_03 +++ /dev/null @@ -1,9 +0,0 @@ -ft_ssl: Error: x is an invalid command. - -Standard commands: - -Message Digest commands: -md5 -sha256 - -Cipher commands: diff --git a/test/logs/trace_Invalid_command_04 b/test/logs/trace_Invalid_command_04 deleted file mode 100644 index 7f6a1e0..0000000 --- a/test/logs/trace_Invalid_command_04 +++ /dev/null @@ -1,9 +0,0 @@ -ft_ssl: Error: x is an invalid command. - -Standard commands: - -Message Digest commands: -md5 -sha256 - -Cipher commands: diff --git a/test/logs/trace_Invalid_command_05 b/test/logs/trace_Invalid_command_05 deleted file mode 100644 index 7f6a1e0..0000000 --- a/test/logs/trace_Invalid_command_05 +++ /dev/null @@ -1,9 +0,0 @@ -ft_ssl: Error: x is an invalid command. - -Standard commands: - -Message Digest commands: -md5 -sha256 - -Cipher commands: diff --git a/test/logs/trace_directory b/test/logs/trace_directory deleted file mode 100644 index 42ce5e6..0000000 --- a/test/logs/trace_directory +++ /dev/null @@ -1 +0,0 @@ -ft_ssl: resources/folder: No such file or directory diff --git a/test/logs/trace_file_not_found b/test/logs/trace_file_not_found deleted file mode 100644 index 91fd3a6..0000000 --- a/test/logs/trace_file_not_found +++ /dev/null @@ -1 +0,0 @@ -ft_ssl: resources/testing_everything: No such file or directory diff --git a/test/logs/trace_md5_binary_file_arg b/test/logs/trace_md5_binary_file_arg deleted file mode 100644 index 100283b..0000000 --- a/test/logs/trace_md5_binary_file_arg +++ /dev/null @@ -1 +0,0 @@ -MD5 (resources/binary_file) = 46c0e7f4f1cbd004431f176ad87b5d46 diff --git a/test/logs/trace_md5_binary_file_stdin b/test/logs/trace_md5_binary_file_stdin deleted file mode 100644 index 15fb0e7..0000000 --- a/test/logs/trace_md5_binary_file_stdin +++ /dev/null @@ -1 +0,0 @@ -46c0e7f4f1cbd004431f176ad87b5d46 diff --git a/test/logs/trace_md5_empty_file_arg b/test/logs/trace_md5_empty_file_arg deleted file mode 100644 index aaeda2c..0000000 --- a/test/logs/trace_md5_empty_file_arg +++ /dev/null @@ -1 +0,0 @@ -MD5 (resources/empty_file) = d41d8cd98f00b204e9800998ecf8427e diff --git a/test/logs/trace_md5_empty_file_stdin b/test/logs/trace_md5_empty_file_stdin deleted file mode 100644 index df9edc4..0000000 --- a/test/logs/trace_md5_empty_file_stdin +++ /dev/null @@ -1 +0,0 @@ -d41d8cd98f00b204e9800998ecf8427e diff --git a/test/logs/trace_md5_large_file_arg b/test/logs/trace_md5_large_file_arg deleted file mode 100644 index b3087bb..0000000 --- a/test/logs/trace_md5_large_file_arg +++ /dev/null @@ -1 +0,0 @@ -MD5 (resources/text_file_large) = 3347b7ed7e69584b7dfa1ec24cbfff1e diff --git a/test/logs/trace_md5_large_file_stdin b/test/logs/trace_md5_large_file_stdin deleted file mode 100644 index dc8ebde..0000000 --- a/test/logs/trace_md5_large_file_stdin +++ /dev/null @@ -1 +0,0 @@ -3347b7ed7e69584b7dfa1ec24cbfff1e diff --git a/test/logs/trace_md5_medium_file_arg b/test/logs/trace_md5_medium_file_arg deleted file mode 100644 index 87ff323..0000000 --- a/test/logs/trace_md5_medium_file_arg +++ /dev/null @@ -1 +0,0 @@ -MD5 (resources/text_file_medium) = f4cb1efa2c4eebe3589d7405f4174577 diff --git a/test/logs/trace_md5_medium_file_stdin b/test/logs/trace_md5_medium_file_stdin deleted file mode 100644 index 5b4a791..0000000 --- a/test/logs/trace_md5_medium_file_stdin +++ /dev/null @@ -1 +0,0 @@ -f4cb1efa2c4eebe3589d7405f4174577 diff --git a/test/logs/trace_md5_option_s_448_chars_edge_case b/test/logs/trace_md5_option_s_448_chars_edge_case deleted file mode 100644 index 0105571..0000000 --- a/test/logs/trace_md5_option_s_448_chars_edge_case +++ /dev/null @@ -1 +0,0 @@ -MD5 ("A very long text with 448 chars, but i need to add more!") = 68554f041dad94d228b0013872e4ac99 diff --git a/test/logs/trace_md5_option_s_basic_string b/test/logs/trace_md5_option_s_basic_string deleted file mode 100644 index a67120d..0000000 --- a/test/logs/trace_md5_option_s_basic_string +++ /dev/null @@ -1 +0,0 @@ -MD5 ("Foo bar") = d05ebcd9fba6aee3e8411771c083b3db diff --git a/test/logs/trace_md5_option_s_empty_string b/test/logs/trace_md5_option_s_empty_string deleted file mode 100644 index 6cfa5d5..0000000 --- a/test/logs/trace_md5_option_s_empty_string +++ /dev/null @@ -1 +0,0 @@ -MD5 ("") = d41d8cd98f00b204e9800998ecf8427e diff --git a/test/logs/trace_md5_option_s_unicode b/test/logs/trace_md5_option_s_unicode deleted file mode 100644 index 8b49e40..0000000 --- a/test/logs/trace_md5_option_s_unicode +++ /dev/null @@ -1 +0,0 @@ -MD5 ("你吃饭了吗? Nǐ chīfàn le ma? Literally: Have you eaten?") = 052fe420c44f836e2c087d1e6bc8fc35 diff --git a/test/logs/trace_md5_small_file_arg b/test/logs/trace_md5_small_file_arg deleted file mode 100644 index 370cd93..0000000 --- a/test/logs/trace_md5_small_file_arg +++ /dev/null @@ -1 +0,0 @@ -MD5 (resources/text_file_small) = f0ef7081e1539ac00ef5b761b4fb01b3 diff --git a/test/logs/trace_md5_small_file_stdin b/test/logs/trace_md5_small_file_stdin deleted file mode 100644 index 971886c..0000000 --- a/test/logs/trace_md5_small_file_stdin +++ /dev/null @@ -1 +0,0 @@ -f0ef7081e1539ac00ef5b761b4fb01b3 diff --git a/test/logs/trace_no_argument_01 b/test/logs/trace_no_argument_01 deleted file mode 100644 index df6c0fb..0000000 --- a/test/logs/trace_no_argument_01 +++ /dev/null @@ -1 +0,0 @@ -usage: ft_ssl command [command opts] [command args] diff --git a/test/logs/trace_no_argument_02 b/test/logs/trace_no_argument_02 deleted file mode 100644 index df6c0fb..0000000 --- a/test/logs/trace_no_argument_02 +++ /dev/null @@ -1 +0,0 @@ -usage: ft_ssl command [command opts] [command args] diff --git a/test/logs/trace_option_s_without_arg b/test/logs/trace_option_s_without_arg deleted file mode 100644 index df9edc4..0000000 --- a/test/logs/trace_option_s_without_arg +++ /dev/null @@ -1 +0,0 @@ -d41d8cd98f00b204e9800998ecf8427e diff --git a/test/logs/trace_original_md5_binary_file_arg b/test/logs/trace_original_md5_binary_file_arg deleted file mode 100644 index 100283b..0000000 --- a/test/logs/trace_original_md5_binary_file_arg +++ /dev/null @@ -1 +0,0 @@ -MD5 (resources/binary_file) = 46c0e7f4f1cbd004431f176ad87b5d46 diff --git a/test/logs/trace_original_md5_binary_file_stdin b/test/logs/trace_original_md5_binary_file_stdin deleted file mode 100644 index 15fb0e7..0000000 --- a/test/logs/trace_original_md5_binary_file_stdin +++ /dev/null @@ -1 +0,0 @@ -46c0e7f4f1cbd004431f176ad87b5d46 diff --git a/test/logs/trace_original_md5_empty_file_arg b/test/logs/trace_original_md5_empty_file_arg deleted file mode 100644 index aaeda2c..0000000 --- a/test/logs/trace_original_md5_empty_file_arg +++ /dev/null @@ -1 +0,0 @@ -MD5 (resources/empty_file) = d41d8cd98f00b204e9800998ecf8427e diff --git a/test/logs/trace_original_md5_empty_file_stdin b/test/logs/trace_original_md5_empty_file_stdin deleted file mode 100644 index df9edc4..0000000 --- a/test/logs/trace_original_md5_empty_file_stdin +++ /dev/null @@ -1 +0,0 @@ -d41d8cd98f00b204e9800998ecf8427e diff --git a/test/logs/trace_original_md5_large_file_arg b/test/logs/trace_original_md5_large_file_arg deleted file mode 100644 index b3087bb..0000000 --- a/test/logs/trace_original_md5_large_file_arg +++ /dev/null @@ -1 +0,0 @@ -MD5 (resources/text_file_large) = 3347b7ed7e69584b7dfa1ec24cbfff1e diff --git a/test/logs/trace_original_md5_large_file_stdin b/test/logs/trace_original_md5_large_file_stdin deleted file mode 100644 index dc8ebde..0000000 --- a/test/logs/trace_original_md5_large_file_stdin +++ /dev/null @@ -1 +0,0 @@ -3347b7ed7e69584b7dfa1ec24cbfff1e diff --git a/test/logs/trace_original_md5_medium_file_arg b/test/logs/trace_original_md5_medium_file_arg deleted file mode 100644 index 87ff323..0000000 --- a/test/logs/trace_original_md5_medium_file_arg +++ /dev/null @@ -1 +0,0 @@ -MD5 (resources/text_file_medium) = f4cb1efa2c4eebe3589d7405f4174577 diff --git a/test/logs/trace_original_md5_medium_file_stdin b/test/logs/trace_original_md5_medium_file_stdin deleted file mode 100644 index 5b4a791..0000000 --- a/test/logs/trace_original_md5_medium_file_stdin +++ /dev/null @@ -1 +0,0 @@ -f4cb1efa2c4eebe3589d7405f4174577 diff --git a/test/logs/trace_original_md5_option_s_448_chars_edge_case b/test/logs/trace_original_md5_option_s_448_chars_edge_case deleted file mode 100644 index 0105571..0000000 --- a/test/logs/trace_original_md5_option_s_448_chars_edge_case +++ /dev/null @@ -1 +0,0 @@ -MD5 ("A very long text with 448 chars, but i need to add more!") = 68554f041dad94d228b0013872e4ac99 diff --git a/test/logs/trace_original_md5_option_s_basic_string b/test/logs/trace_original_md5_option_s_basic_string deleted file mode 100644 index a67120d..0000000 --- a/test/logs/trace_original_md5_option_s_basic_string +++ /dev/null @@ -1 +0,0 @@ -MD5 ("Foo bar") = d05ebcd9fba6aee3e8411771c083b3db diff --git a/test/logs/trace_original_md5_option_s_empty_string b/test/logs/trace_original_md5_option_s_empty_string deleted file mode 100644 index 6cfa5d5..0000000 --- a/test/logs/trace_original_md5_option_s_empty_string +++ /dev/null @@ -1 +0,0 @@ -MD5 ("") = d41d8cd98f00b204e9800998ecf8427e diff --git a/test/logs/trace_original_md5_option_s_unicode b/test/logs/trace_original_md5_option_s_unicode deleted file mode 100644 index 8b49e40..0000000 --- a/test/logs/trace_original_md5_option_s_unicode +++ /dev/null @@ -1 +0,0 @@ -MD5 ("你吃饭了吗? Nǐ chīfàn le ma? Literally: Have you eaten?") = 052fe420c44f836e2c087d1e6bc8fc35 diff --git a/test/logs/trace_original_md5_small_file_arg b/test/logs/trace_original_md5_small_file_arg deleted file mode 100644 index 370cd93..0000000 --- a/test/logs/trace_original_md5_small_file_arg +++ /dev/null @@ -1 +0,0 @@ -MD5 (resources/text_file_small) = f0ef7081e1539ac00ef5b761b4fb01b3 diff --git a/test/logs/trace_original_md5_small_file_stdin b/test/logs/trace_original_md5_small_file_stdin deleted file mode 100644 index 971886c..0000000 --- a/test/logs/trace_original_md5_small_file_stdin +++ /dev/null @@ -1 +0,0 @@ -f0ef7081e1539ac00ef5b761b4fb01b3 diff --git a/test/logs/trace_original_sha256_binary_file_stdin b/test/logs/trace_original_sha256_binary_file_stdin deleted file mode 100644 index 0907a07..0000000 --- a/test/logs/trace_original_sha256_binary_file_stdin +++ /dev/null @@ -1 +0,0 @@ -0c21850620f7f42e3c4ea6117a901023fef10a835f3b5ee43f6235762c798d8f diff --git a/test/logs/trace_original_sha256_empty_file_stdin b/test/logs/trace_original_sha256_empty_file_stdin deleted file mode 100644 index c306804..0000000 --- a/test/logs/trace_original_sha256_empty_file_stdin +++ /dev/null @@ -1 +0,0 @@ -e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/test/logs/trace_original_sha256_large_file_stdin b/test/logs/trace_original_sha256_large_file_stdin deleted file mode 100644 index 507373f..0000000 --- a/test/logs/trace_original_sha256_large_file_stdin +++ /dev/null @@ -1 +0,0 @@ -bb530fe35cad305dfcba486dbde298a1aee6fa59ad27afd05f7d9181c5e84963 diff --git a/test/logs/trace_original_sha256_medium_file_stdin b/test/logs/trace_original_sha256_medium_file_stdin deleted file mode 100644 index fed68c6..0000000 --- a/test/logs/trace_original_sha256_medium_file_stdin +++ /dev/null @@ -1 +0,0 @@ -56005170a8bb77de9cefa181aff0a7457064ff39c17f269f5a852860109c7f6a diff --git a/test/logs/trace_original_sha256_option_s_basic_string b/test/logs/trace_original_sha256_option_s_basic_string deleted file mode 100644 index b69fb06..0000000 --- a/test/logs/trace_original_sha256_option_s_basic_string +++ /dev/null @@ -1 +0,0 @@ -2fb9f1e447f906641b665b02538a0320efb3e0b667a2655b3f9e041a3b2f815d diff --git a/test/logs/trace_original_sha256_option_s_empty_string b/test/logs/trace_original_sha256_option_s_empty_string deleted file mode 100644 index c306804..0000000 --- a/test/logs/trace_original_sha256_option_s_empty_string +++ /dev/null @@ -1 +0,0 @@ -e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/test/logs/trace_original_sha256_option_s_unicode b/test/logs/trace_original_sha256_option_s_unicode deleted file mode 100644 index bdc5c25..0000000 --- a/test/logs/trace_original_sha256_option_s_unicode +++ /dev/null @@ -1 +0,0 @@ -498951833d0ae08fdbd6138b5ce91db88d5b278c3e60a58929309e87b357f3fa diff --git a/test/logs/trace_original_sha256_small_file_stdin b/test/logs/trace_original_sha256_small_file_stdin deleted file mode 100644 index 2d16219..0000000 --- a/test/logs/trace_original_sha256_small_file_stdin +++ /dev/null @@ -1 +0,0 @@ -1894a19c85ba153acbf743ac4e43fc004c891604b26f8c69e1e83ea2afc7c48f diff --git a/test/logs/trace_permission_denied b/test/logs/trace_permission_denied deleted file mode 100644 index 3256fef..0000000 --- a/test/logs/trace_permission_denied +++ /dev/null @@ -1 +0,0 @@ -ft_ssl: resources/permissions: Permission denied diff --git a/test/logs/trace_sha256_binary_file_stdin b/test/logs/trace_sha256_binary_file_stdin deleted file mode 100644 index 0907a07..0000000 --- a/test/logs/trace_sha256_binary_file_stdin +++ /dev/null @@ -1 +0,0 @@ -0c21850620f7f42e3c4ea6117a901023fef10a835f3b5ee43f6235762c798d8f diff --git a/test/logs/trace_sha256_empty_file_stdin b/test/logs/trace_sha256_empty_file_stdin deleted file mode 100644 index c306804..0000000 --- a/test/logs/trace_sha256_empty_file_stdin +++ /dev/null @@ -1 +0,0 @@ -e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/test/logs/trace_sha256_large_file_stdin b/test/logs/trace_sha256_large_file_stdin deleted file mode 100644 index 507373f..0000000 --- a/test/logs/trace_sha256_large_file_stdin +++ /dev/null @@ -1 +0,0 @@ -bb530fe35cad305dfcba486dbde298a1aee6fa59ad27afd05f7d9181c5e84963 diff --git a/test/logs/trace_sha256_medium_file_stdin b/test/logs/trace_sha256_medium_file_stdin deleted file mode 100644 index fed68c6..0000000 --- a/test/logs/trace_sha256_medium_file_stdin +++ /dev/null @@ -1 +0,0 @@ -56005170a8bb77de9cefa181aff0a7457064ff39c17f269f5a852860109c7f6a diff --git a/test/logs/trace_sha256_option_s_basic_string b/test/logs/trace_sha256_option_s_basic_string deleted file mode 100644 index b69fb06..0000000 --- a/test/logs/trace_sha256_option_s_basic_string +++ /dev/null @@ -1 +0,0 @@ -2fb9f1e447f906641b665b02538a0320efb3e0b667a2655b3f9e041a3b2f815d diff --git a/test/logs/trace_sha256_option_s_empty_string b/test/logs/trace_sha256_option_s_empty_string deleted file mode 100644 index c306804..0000000 --- a/test/logs/trace_sha256_option_s_empty_string +++ /dev/null @@ -1 +0,0 @@ -e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/test/logs/trace_sha256_option_s_unicode b/test/logs/trace_sha256_option_s_unicode deleted file mode 100644 index bdc5c25..0000000 --- a/test/logs/trace_sha256_option_s_unicode +++ /dev/null @@ -1 +0,0 @@ -498951833d0ae08fdbd6138b5ce91db88d5b278c3e60a58929309e87b357f3fa diff --git a/test/logs/trace_sha256_small_file_stdin b/test/logs/trace_sha256_small_file_stdin deleted file mode 100644 index 2d16219..0000000 --- a/test/logs/trace_sha256_small_file_stdin +++ /dev/null @@ -1 +0,0 @@ -1894a19c85ba153acbf743ac4e43fc004c891604b26f8c69e1e83ea2afc7c48f diff --git a/test/logs/trace_subject_test_01 b/test/logs/trace_subject_test_01 deleted file mode 100644 index 31a7dad..0000000 --- a/test/logs/trace_subject_test_01 +++ /dev/null @@ -1 +0,0 @@ -c5e433c1dbd7ba01e3763a9483e74b04 diff --git a/test/logs/trace_subject_test_02 b/test/logs/trace_subject_test_02 deleted file mode 100644 index 2a69d07..0000000 --- a/test/logs/trace_subject_test_02 +++ /dev/null @@ -1,2 +0,0 @@ -Do not pity the dead, Harry. -2d95365bc44bf0a298e09a3ab7b34d2f diff --git a/test/logs/trace_subject_test_03 b/test/logs/trace_subject_test_03 deleted file mode 100644 index 7f6c887..0000000 --- a/test/logs/trace_subject_test_03 +++ /dev/null @@ -1 +0,0 @@ -e20c3b973f63482a778f3fd1869b7f25 diff --git a/test/logs/trace_subject_test_04 b/test/logs/trace_subject_test_04 deleted file mode 100644 index 2353546..0000000 --- a/test/logs/trace_subject_test_04 +++ /dev/null @@ -1 +0,0 @@ -MD5 (file) = 53d53ea94217b259c11a5a2d104ec58a diff --git a/test/logs/trace_subject_test_05 b/test/logs/trace_subject_test_05 deleted file mode 100644 index 8a1a2c5..0000000 --- a/test/logs/trace_subject_test_05 +++ /dev/null @@ -1 +0,0 @@ -53d53ea94217b259c11a5a2d104ec58a file diff --git a/test/logs/trace_subject_test_06 b/test/logs/trace_subject_test_06 deleted file mode 100644 index a6192d7..0000000 --- a/test/logs/trace_subject_test_06 +++ /dev/null @@ -1 +0,0 @@ -MD5 ("pity those that aren't following baerista on spotify.") = a3c990a1964705d9bf0e602f44572f5f diff --git a/test/logs/trace_subject_test_07 b/test/logs/trace_subject_test_07 deleted file mode 100644 index 347f5cf..0000000 --- a/test/logs/trace_subject_test_07 +++ /dev/null @@ -1,3 +0,0 @@ -be sure to handle edge cases carefully -3553dc7dc5963b583c056d1b9fa3349c -MD5 (file) = 53d53ea94217b259c11a5a2d104ec58a diff --git a/test/logs/trace_subject_test_08 b/test/logs/trace_subject_test_08 deleted file mode 100644 index 8a7fc05..0000000 --- a/test/logs/trace_subject_test_08 +++ /dev/null @@ -1,3 +0,0 @@ -but eventually you will understand -dcdd84e0f635694d2a943fa8d3905281 -53d53ea94217b259c11a5a2d104ec58a file diff --git a/test/logs/trace_subject_test_09 b/test/logs/trace_subject_test_09 deleted file mode 100644 index 76c84ab..0000000 --- a/test/logs/trace_subject_test_09 +++ /dev/null @@ -1,4 +0,0 @@ -GL HF let's go -d1e3cc342b6da09480b27ec57ff243e2 -MD5 ("foo") = acbd18db4cc2f85cedef654fccc4a4d8 -MD5 (file) = 53d53ea94217b259c11a5a2d104ec58a diff --git a/test/logs/trace_subject_test_10 b/test/logs/trace_subject_test_10 deleted file mode 100644 index 93893fb..0000000 --- a/test/logs/trace_subject_test_10 +++ /dev/null @@ -1,5 +0,0 @@ -one more thing -a0bd1876c6f011dd50fae52827f445f5 -MD5 ("foo") = acbd18db4cc2f85cedef654fccc4a4d8 -MD5 (file) = 53d53ea94217b259c11a5a2d104ec58a -MD5 ("bar") = 37b51d194a7513e45b56f6524f2d51f2 diff --git a/test/logs/trace_subject_test_11 b/test/logs/trace_subject_test_11 deleted file mode 100644 index dc26290..0000000 --- a/test/logs/trace_subject_test_11 +++ /dev/null @@ -1,4 +0,0 @@ -just to be extra clear -3ba35f1ea0d170cb3b9a752e3360286c -MD5 ("foo") = acbd18db4cc2f85cedef654fccc4a4d8 -MD5 (file) = 53d53ea94217b259c11a5a2d104ec58a diff --git a/test/logs/trace_valgrind_Invalid_command_01 b/test/logs/trace_valgrind_Invalid_command_01 deleted file mode 100644 index 20ebae6..0000000 --- a/test/logs/trace_valgrind_Invalid_command_01 +++ /dev/null @@ -1,44 +0,0 @@ -==23184== Memcheck, a memory error detector -==23184== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23184== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23184== Command: ./../ft_ssl x -==23184== -ft_ssl: Error: x is an invalid command. - -Standard commands: - -Message Digest commands: -md5 -sha256 - -Cipher commands: -==23184== -==23184== HEAP SUMMARY: -==23184== in use at exit: 18,178 bytes in 162 blocks -==23184== total heap usage: 178 allocs, 16 frees, 24,322 bytes allocated -==23184== -==23184== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23184== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23184== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23184== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23184== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23184== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23184== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23184== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23184== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23184== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23184== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23184== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23184== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23184== -==23184== LEAK SUMMARY: -==23184== definitely lost: 0 bytes in 0 blocks -==23184== indirectly lost: 0 bytes in 0 blocks -==23184== possibly lost: 72 bytes in 3 blocks -==23184== still reachable: 200 bytes in 6 blocks -==23184== suppressed: 17,906 bytes in 153 blocks -==23184== Reachable blocks (those to which a pointer was found) are not shown. -==23184== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23184== -==23184== For counts of detected and suppressed errors, rerun with: -v -==23184== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_Invalid_command_02 b/test/logs/trace_valgrind_Invalid_command_02 deleted file mode 100644 index 20f2fce..0000000 --- a/test/logs/trace_valgrind_Invalid_command_02 +++ /dev/null @@ -1,44 +0,0 @@ -==23195== Memcheck, a memory error detector -==23195== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23195== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23195== Command: ./../ft_ssl x -==23195== -ft_ssl: Error: x is an invalid command. - -Standard commands: - -Message Digest commands: -md5 -sha256 - -Cipher commands: -==23195== -==23195== HEAP SUMMARY: -==23195== in use at exit: 18,178 bytes in 162 blocks -==23195== total heap usage: 178 allocs, 16 frees, 24,322 bytes allocated -==23195== -==23195== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23195== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23195== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23195== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23195== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23195== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23195== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23195== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23195== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23195== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23195== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23195== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23195== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23195== -==23195== LEAK SUMMARY: -==23195== definitely lost: 0 bytes in 0 blocks -==23195== indirectly lost: 0 bytes in 0 blocks -==23195== possibly lost: 72 bytes in 3 blocks -==23195== still reachable: 200 bytes in 6 blocks -==23195== suppressed: 17,906 bytes in 153 blocks -==23195== Reachable blocks (those to which a pointer was found) are not shown. -==23195== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23195== -==23195== For counts of detected and suppressed errors, rerun with: -v -==23195== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_Invalid_command_03 b/test/logs/trace_valgrind_Invalid_command_03 deleted file mode 100644 index 9989b95..0000000 --- a/test/logs/trace_valgrind_Invalid_command_03 +++ /dev/null @@ -1,44 +0,0 @@ -==23205== Memcheck, a memory error detector -==23205== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23205== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23205== Command: ./../ft_ssl x Invalid command 03 -==23205== -ft_ssl: Error: x is an invalid command. - -Standard commands: - -Message Digest commands: -md5 -sha256 - -Cipher commands: -==23205== -==23205== HEAP SUMMARY: -==23205== in use at exit: 18,178 bytes in 162 blocks -==23205== total heap usage: 178 allocs, 16 frees, 24,322 bytes allocated -==23205== -==23205== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23205== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23205== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23205== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23205== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23205== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23205== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23205== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23205== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23205== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23205== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23205== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23205== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23205== -==23205== LEAK SUMMARY: -==23205== definitely lost: 0 bytes in 0 blocks -==23205== indirectly lost: 0 bytes in 0 blocks -==23205== possibly lost: 72 bytes in 3 blocks -==23205== still reachable: 200 bytes in 6 blocks -==23205== suppressed: 17,906 bytes in 153 blocks -==23205== Reachable blocks (those to which a pointer was found) are not shown. -==23205== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23205== -==23205== For counts of detected and suppressed errors, rerun with: -v -==23205== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_Invalid_command_04 b/test/logs/trace_valgrind_Invalid_command_04 deleted file mode 100644 index f7fefd2..0000000 --- a/test/logs/trace_valgrind_Invalid_command_04 +++ /dev/null @@ -1,44 +0,0 @@ -==23216== Memcheck, a memory error detector -==23216== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23216== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23216== Command: ./../ft_ssl x Invalid command 04 -==23216== -ft_ssl: Error: x is an invalid command. - -Standard commands: - -Message Digest commands: -md5 -sha256 - -Cipher commands: -==23216== -==23216== HEAP SUMMARY: -==23216== in use at exit: 18,178 bytes in 162 blocks -==23216== total heap usage: 178 allocs, 16 frees, 24,322 bytes allocated -==23216== -==23216== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23216== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23216== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23216== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23216== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23216== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23216== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23216== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23216== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23216== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23216== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23216== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23216== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23216== -==23216== LEAK SUMMARY: -==23216== definitely lost: 0 bytes in 0 blocks -==23216== indirectly lost: 0 bytes in 0 blocks -==23216== possibly lost: 72 bytes in 3 blocks -==23216== still reachable: 200 bytes in 6 blocks -==23216== suppressed: 17,906 bytes in 153 blocks -==23216== Reachable blocks (those to which a pointer was found) are not shown. -==23216== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23216== -==23216== For counts of detected and suppressed errors, rerun with: -v -==23216== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_Invalid_command_05 b/test/logs/trace_valgrind_Invalid_command_05 deleted file mode 100644 index 45ce74c..0000000 --- a/test/logs/trace_valgrind_Invalid_command_05 +++ /dev/null @@ -1,44 +0,0 @@ -==23227== Memcheck, a memory error detector -==23227== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23227== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23227== Command: ./../ft_ssl x -s Invalid command 05 -==23227== -ft_ssl: Error: x is an invalid command. - -Standard commands: - -Message Digest commands: -md5 -sha256 - -Cipher commands: -==23227== -==23227== HEAP SUMMARY: -==23227== in use at exit: 18,178 bytes in 162 blocks -==23227== total heap usage: 178 allocs, 16 frees, 24,322 bytes allocated -==23227== -==23227== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23227== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23227== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23227== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23227== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23227== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23227== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23227== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23227== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23227== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23227== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23227== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23227== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23227== -==23227== LEAK SUMMARY: -==23227== definitely lost: 0 bytes in 0 blocks -==23227== indirectly lost: 0 bytes in 0 blocks -==23227== possibly lost: 72 bytes in 3 blocks -==23227== still reachable: 200 bytes in 6 blocks -==23227== suppressed: 17,906 bytes in 153 blocks -==23227== Reachable blocks (those to which a pointer was found) are not shown. -==23227== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23227== -==23227== For counts of detected and suppressed errors, rerun with: -v -==23227== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_directory b/test/logs/trace_valgrind_directory deleted file mode 100644 index 836aeba..0000000 --- a/test/logs/trace_valgrind_directory +++ /dev/null @@ -1,36 +0,0 @@ -==23285== Memcheck, a memory error detector -==23285== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23285== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23285== Command: ./../ft_ssl md5 resources/folder -==23285== -ft_ssl: resources/folder: No such file or directory -==23285== -==23285== HEAP SUMMARY: -==23285== in use at exit: 20,226 bytes in 163 blocks -==23285== total heap usage: 179 allocs, 16 frees, 26,370 bytes allocated -==23285== -==23285== 72 bytes in 3 blocks are possibly lost in loss record 26 of 43 -==23285== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23285== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23285== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23285== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23285== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23285== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23285== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23285== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23285== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23285== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23285== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23285== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23285== -==23285== LEAK SUMMARY: -==23285== definitely lost: 0 bytes in 0 blocks -==23285== indirectly lost: 0 bytes in 0 blocks -==23285== possibly lost: 72 bytes in 3 blocks -==23285== still reachable: 2,248 bytes in 7 blocks -==23285== suppressed: 17,906 bytes in 153 blocks -==23285== Reachable blocks (those to which a pointer was found) are not shown. -==23285== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23285== -==23285== For counts of detected and suppressed errors, rerun with: -v -==23285== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_file_not_found b/test/logs/trace_valgrind_file_not_found deleted file mode 100644 index 0bf8872..0000000 --- a/test/logs/trace_valgrind_file_not_found +++ /dev/null @@ -1,36 +0,0 @@ -==23263== Memcheck, a memory error detector -==23263== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23263== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23263== Command: ./../ft_ssl md5 resources/testing_everything -==23263== -ft_ssl: resources/testing_everything: No such file or directory -==23263== -==23263== HEAP SUMMARY: -==23263== in use at exit: 20,226 bytes in 163 blocks -==23263== total heap usage: 179 allocs, 16 frees, 26,370 bytes allocated -==23263== -==23263== 72 bytes in 3 blocks are possibly lost in loss record 26 of 43 -==23263== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23263== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23263== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23263== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23263== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23263== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23263== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23263== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23263== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23263== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23263== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23263== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23263== -==23263== LEAK SUMMARY: -==23263== definitely lost: 0 bytes in 0 blocks -==23263== indirectly lost: 0 bytes in 0 blocks -==23263== possibly lost: 72 bytes in 3 blocks -==23263== still reachable: 2,248 bytes in 7 blocks -==23263== suppressed: 17,906 bytes in 153 blocks -==23263== Reachable blocks (those to which a pointer was found) are not shown. -==23263== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23263== -==23263== For counts of detected and suppressed errors, rerun with: -v -==23263== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_md5_binary_file_arg b/test/logs/trace_valgrind_md5_binary_file_arg deleted file mode 100644 index 3759db0..0000000 --- a/test/logs/trace_valgrind_md5_binary_file_arg +++ /dev/null @@ -1,36 +0,0 @@ -==23499== Memcheck, a memory error detector -==23499== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23499== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23499== Command: ./../ft_ssl md5 resources/binary_file -==23499== -MD5 (resources/binary_file) = 46c0e7f4f1cbd004431f176ad87b5d46 -==23499== -==23499== HEAP SUMMARY: -==23499== in use at exit: 18,178 bytes in 162 blocks -==23499== total heap usage: 184 allocs, 22 frees, 185,035 bytes allocated -==23499== -==23499== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23499== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23499== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23499== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23499== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23499== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23499== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23499== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23499== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23499== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23499== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23499== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23499== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23499== -==23499== LEAK SUMMARY: -==23499== definitely lost: 0 bytes in 0 blocks -==23499== indirectly lost: 0 bytes in 0 blocks -==23499== possibly lost: 72 bytes in 3 blocks -==23499== still reachable: 200 bytes in 6 blocks -==23499== suppressed: 17,906 bytes in 153 blocks -==23499== Reachable blocks (those to which a pointer was found) are not shown. -==23499== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23499== -==23499== For counts of detected and suppressed errors, rerun with: -v -==23499== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_md5_binary_file_stdin b/test/logs/trace_valgrind_md5_binary_file_stdin deleted file mode 100644 index 2bda367..0000000 --- a/test/logs/trace_valgrind_md5_binary_file_stdin +++ /dev/null @@ -1,36 +0,0 @@ -==23511== Memcheck, a memory error detector -==23511== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23511== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23511== Command: ./../ft_ssl md5 -==23511== -46c0e7f4f1cbd004431f176ad87b5d46 -==23511== -==23511== HEAP SUMMARY: -==23511== in use at exit: 18,178 bytes in 162 blocks -==23511== total heap usage: 185 allocs, 23 frees, 250,572 bytes allocated -==23511== -==23511== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23511== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23511== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23511== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23511== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23511== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23511== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23511== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23511== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23511== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23511== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23511== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23511== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23511== -==23511== LEAK SUMMARY: -==23511== definitely lost: 0 bytes in 0 blocks -==23511== indirectly lost: 0 bytes in 0 blocks -==23511== possibly lost: 72 bytes in 3 blocks -==23511== still reachable: 200 bytes in 6 blocks -==23511== suppressed: 17,906 bytes in 153 blocks -==23511== Reachable blocks (those to which a pointer was found) are not shown. -==23511== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23511== -==23511== For counts of detected and suppressed errors, rerun with: -v -==23511== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_md5_empty_file_arg b/test/logs/trace_valgrind_md5_empty_file_arg deleted file mode 100644 index 6048a10..0000000 --- a/test/logs/trace_valgrind_md5_empty_file_arg +++ /dev/null @@ -1,36 +0,0 @@ -==23523== Memcheck, a memory error detector -==23523== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23523== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23523== Command: ./../ft_ssl md5 resources/empty_file -==23523== -MD5 (resources/empty_file) = d41d8cd98f00b204e9800998ecf8427e -==23523== -==23523== HEAP SUMMARY: -==23523== in use at exit: 18,178 bytes in 162 blocks -==23523== total heap usage: 184 allocs, 22 frees, 24,491 bytes allocated -==23523== -==23523== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23523== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23523== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23523== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23523== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23523== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23523== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23523== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23523== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23523== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23523== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23523== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23523== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23523== -==23523== LEAK SUMMARY: -==23523== definitely lost: 0 bytes in 0 blocks -==23523== indirectly lost: 0 bytes in 0 blocks -==23523== possibly lost: 72 bytes in 3 blocks -==23523== still reachable: 200 bytes in 6 blocks -==23523== suppressed: 17,906 bytes in 153 blocks -==23523== Reachable blocks (those to which a pointer was found) are not shown. -==23523== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23523== -==23523== For counts of detected and suppressed errors, rerun with: -v -==23523== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_md5_empty_file_stdin b/test/logs/trace_valgrind_md5_empty_file_stdin deleted file mode 100644 index 596cc62..0000000 --- a/test/logs/trace_valgrind_md5_empty_file_stdin +++ /dev/null @@ -1,36 +0,0 @@ -==23535== Memcheck, a memory error detector -==23535== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23535== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23535== Command: ./../ft_ssl md5 -==23535== -d41d8cd98f00b204e9800998ecf8427e -==23535== -==23535== HEAP SUMMARY: -==23535== in use at exit: 18,178 bytes in 162 blocks -==23535== total heap usage: 183 allocs, 21 frees, 24,490 bytes allocated -==23535== -==23535== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23535== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23535== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23535== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23535== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23535== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23535== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23535== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23535== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23535== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23535== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23535== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23535== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23535== -==23535== LEAK SUMMARY: -==23535== definitely lost: 0 bytes in 0 blocks -==23535== indirectly lost: 0 bytes in 0 blocks -==23535== possibly lost: 72 bytes in 3 blocks -==23535== still reachable: 200 bytes in 6 blocks -==23535== suppressed: 17,906 bytes in 153 blocks -==23535== Reachable blocks (those to which a pointer was found) are not shown. -==23535== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23535== -==23535== For counts of detected and suppressed errors, rerun with: -v -==23535== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_md5_large_file_arg b/test/logs/trace_valgrind_md5_large_file_arg deleted file mode 100644 index 2e8f8b6..0000000 --- a/test/logs/trace_valgrind_md5_large_file_arg +++ /dev/null @@ -1,36 +0,0 @@ -==23595== Memcheck, a memory error detector -==23595== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23595== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23595== Command: ./../ft_ssl md5 resources/text_file_large -==23595== -MD5 (resources/text_file_large) = 3347b7ed7e69584b7dfa1ec24cbfff1e -==23595== -==23595== HEAP SUMMARY: -==23595== in use at exit: 18,178 bytes in 162 blocks -==23595== total heap usage: 184 allocs, 22 frees, 1,563,862 bytes allocated -==23595== -==23595== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23595== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23595== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23595== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23595== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23595== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23595== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23595== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23595== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23595== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23595== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23595== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23595== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23595== -==23595== LEAK SUMMARY: -==23595== definitely lost: 0 bytes in 0 blocks -==23595== indirectly lost: 0 bytes in 0 blocks -==23595== possibly lost: 72 bytes in 3 blocks -==23595== still reachable: 200 bytes in 6 blocks -==23595== suppressed: 17,906 bytes in 153 blocks -==23595== Reachable blocks (those to which a pointer was found) are not shown. -==23595== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23595== -==23595== For counts of detected and suppressed errors, rerun with: -v -==23595== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_md5_large_file_stdin b/test/logs/trace_valgrind_md5_large_file_stdin deleted file mode 100644 index 7a9d8ae..0000000 --- a/test/logs/trace_valgrind_md5_large_file_stdin +++ /dev/null @@ -1,36 +0,0 @@ -==23607== Memcheck, a memory error detector -==23607== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23607== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23607== Command: ./../ft_ssl md5 -==23607== -3347b7ed7e69584b7dfa1ec24cbfff1e -==23607== -==23607== HEAP SUMMARY: -==23607== in use at exit: 18,178 bytes in 162 blocks -==23607== total heap usage: 195 allocs, 33 frees, 5,889,249 bytes allocated -==23607== -==23607== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23607== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23607== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23607== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23607== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23607== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23607== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23607== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23607== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23607== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23607== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23607== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23607== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23607== -==23607== LEAK SUMMARY: -==23607== definitely lost: 0 bytes in 0 blocks -==23607== indirectly lost: 0 bytes in 0 blocks -==23607== possibly lost: 72 bytes in 3 blocks -==23607== still reachable: 200 bytes in 6 blocks -==23607== suppressed: 17,906 bytes in 153 blocks -==23607== Reachable blocks (those to which a pointer was found) are not shown. -==23607== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23607== -==23607== For counts of detected and suppressed errors, rerun with: -v -==23607== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_md5_medium_file_arg b/test/logs/trace_valgrind_md5_medium_file_arg deleted file mode 100644 index 7b03899..0000000 --- a/test/logs/trace_valgrind_md5_medium_file_arg +++ /dev/null @@ -1,36 +0,0 @@ -==23571== Memcheck, a memory error detector -==23571== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23571== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23571== Command: ./../ft_ssl md5 resources/text_file_medium -==23571== -MD5 (resources/text_file_medium) = f4cb1efa2c4eebe3589d7405f4174577 -==23571== -==23571== HEAP SUMMARY: -==23571== in use at exit: 18,178 bytes in 162 blocks -==23571== total heap usage: 184 allocs, 22 frees, 57,937 bytes allocated -==23571== -==23571== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23571== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23571== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23571== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23571== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23571== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23571== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23571== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23571== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23571== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23571== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23571== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23571== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23571== -==23571== LEAK SUMMARY: -==23571== definitely lost: 0 bytes in 0 blocks -==23571== indirectly lost: 0 bytes in 0 blocks -==23571== possibly lost: 72 bytes in 3 blocks -==23571== still reachable: 200 bytes in 6 blocks -==23571== suppressed: 17,906 bytes in 153 blocks -==23571== Reachable blocks (those to which a pointer was found) are not shown. -==23571== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23571== -==23571== For counts of detected and suppressed errors, rerun with: -v -==23571== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_md5_medium_file_stdin b/test/logs/trace_valgrind_md5_medium_file_stdin deleted file mode 100644 index a1f1044..0000000 --- a/test/logs/trace_valgrind_md5_medium_file_stdin +++ /dev/null @@ -1,36 +0,0 @@ -==23583== Memcheck, a memory error detector -==23583== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23583== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23583== Command: ./../ft_ssl md5 -==23583== -f4cb1efa2c4eebe3589d7405f4174577 -==23583== -==23583== HEAP SUMMARY: -==23583== in use at exit: 18,178 bytes in 162 blocks -==23583== total heap usage: 184 allocs, 22 frees, 57,937 bytes allocated -==23583== -==23583== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23583== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23583== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23583== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23583== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23583== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23583== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23583== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23583== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23583== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23583== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23583== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23583== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23583== -==23583== LEAK SUMMARY: -==23583== definitely lost: 0 bytes in 0 blocks -==23583== indirectly lost: 0 bytes in 0 blocks -==23583== possibly lost: 72 bytes in 3 blocks -==23583== still reachable: 200 bytes in 6 blocks -==23583== suppressed: 17,906 bytes in 153 blocks -==23583== Reachable blocks (those to which a pointer was found) are not shown. -==23583== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23583== -==23583== For counts of detected and suppressed errors, rerun with: -v -==23583== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_md5_option_s_448_chars_edge_case b/test/logs/trace_valgrind_md5_option_s_448_chars_edge_case deleted file mode 100644 index e71696f..0000000 --- a/test/logs/trace_valgrind_md5_option_s_448_chars_edge_case +++ /dev/null @@ -1,36 +0,0 @@ -==23477== Memcheck, a memory error detector -==23477== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23477== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23477== Command: ./../ft_ssl md5 -s A\ very\ long\ text\ with\ 448\ chars,\ but\ i\ need\ to\ add\ more! -==23477== -MD5 ("A very long text with 448 chars, but i need to add more!") = 68554f041dad94d228b0013872e4ac99 -==23477== -==23477== HEAP SUMMARY: -==23477== in use at exit: 18,178 bytes in 162 blocks -==23477== total heap usage: 183 allocs, 21 frees, 24,554 bytes allocated -==23477== -==23477== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23477== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23477== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23477== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23477== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23477== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23477== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23477== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23477== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23477== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23477== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23477== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23477== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23477== -==23477== LEAK SUMMARY: -==23477== definitely lost: 0 bytes in 0 blocks -==23477== indirectly lost: 0 bytes in 0 blocks -==23477== possibly lost: 72 bytes in 3 blocks -==23477== still reachable: 200 bytes in 6 blocks -==23477== suppressed: 17,906 bytes in 153 blocks -==23477== Reachable blocks (those to which a pointer was found) are not shown. -==23477== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23477== -==23477== For counts of detected and suppressed errors, rerun with: -v -==23477== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_md5_option_s_basic_string b/test/logs/trace_valgrind_md5_option_s_basic_string deleted file mode 100644 index fbf890b..0000000 --- a/test/logs/trace_valgrind_md5_option_s_basic_string +++ /dev/null @@ -1,36 +0,0 @@ -==23466== Memcheck, a memory error detector -==23466== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23466== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23466== Command: ./../ft_ssl md5 -s Foo\ bar -==23466== -MD5 ("Foo bar") = d05ebcd9fba6aee3e8411771c083b3db -==23466== -==23466== HEAP SUMMARY: -==23466== in use at exit: 18,178 bytes in 162 blocks -==23466== total heap usage: 183 allocs, 21 frees, 24,490 bytes allocated -==23466== -==23466== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23466== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23466== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23466== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23466== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23466== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23466== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23466== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23466== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23466== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23466== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23466== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23466== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23466== -==23466== LEAK SUMMARY: -==23466== definitely lost: 0 bytes in 0 blocks -==23466== indirectly lost: 0 bytes in 0 blocks -==23466== possibly lost: 72 bytes in 3 blocks -==23466== still reachable: 200 bytes in 6 blocks -==23466== suppressed: 17,906 bytes in 153 blocks -==23466== Reachable blocks (those to which a pointer was found) are not shown. -==23466== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23466== -==23466== For counts of detected and suppressed errors, rerun with: -v -==23466== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_md5_option_s_empty_string b/test/logs/trace_valgrind_md5_option_s_empty_string deleted file mode 100644 index 665f8aa..0000000 --- a/test/logs/trace_valgrind_md5_option_s_empty_string +++ /dev/null @@ -1,36 +0,0 @@ -==23455== Memcheck, a memory error detector -==23455== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23455== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23455== Command: ./../ft_ssl md5 -s -==23455== -MD5 ("") = d41d8cd98f00b204e9800998ecf8427e -==23455== -==23455== HEAP SUMMARY: -==23455== in use at exit: 18,178 bytes in 162 blocks -==23455== total heap usage: 183 allocs, 21 frees, 24,490 bytes allocated -==23455== -==23455== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23455== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23455== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23455== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23455== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23455== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23455== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23455== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23455== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23455== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23455== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23455== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23455== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23455== -==23455== LEAK SUMMARY: -==23455== definitely lost: 0 bytes in 0 blocks -==23455== indirectly lost: 0 bytes in 0 blocks -==23455== possibly lost: 72 bytes in 3 blocks -==23455== still reachable: 200 bytes in 6 blocks -==23455== suppressed: 17,906 bytes in 153 blocks -==23455== Reachable blocks (those to which a pointer was found) are not shown. -==23455== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23455== -==23455== For counts of detected and suppressed errors, rerun with: -v -==23455== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_md5_option_s_unicode b/test/logs/trace_valgrind_md5_option_s_unicode deleted file mode 100644 index 8dd047e..0000000 --- a/test/logs/trace_valgrind_md5_option_s_unicode +++ /dev/null @@ -1,36 +0,0 @@ -==23488== Memcheck, a memory error detector -==23488== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23488== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23488== Command: ./../ft_ssl md5 -s __________________\ N__\ ch__f__n\ le\ ma?\ Literally:\ Have\ you\ eaten? -==23488== -MD5 ("你吃饭了吗? Nǐ chīfàn le ma? Literally: Have you eaten?") = 052fe420c44f836e2c087d1e6bc8fc35 -==23488== -==23488== HEAP SUMMARY: -==23488== in use at exit: 18,178 bytes in 162 blocks -==23488== total heap usage: 183 allocs, 21 frees, 24,554 bytes allocated -==23488== -==23488== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23488== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23488== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23488== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23488== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23488== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23488== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23488== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23488== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23488== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23488== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23488== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23488== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23488== -==23488== LEAK SUMMARY: -==23488== definitely lost: 0 bytes in 0 blocks -==23488== indirectly lost: 0 bytes in 0 blocks -==23488== possibly lost: 72 bytes in 3 blocks -==23488== still reachable: 200 bytes in 6 blocks -==23488== suppressed: 17,906 bytes in 153 blocks -==23488== Reachable blocks (those to which a pointer was found) are not shown. -==23488== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23488== -==23488== For counts of detected and suppressed errors, rerun with: -v -==23488== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_md5_small_file_arg b/test/logs/trace_valgrind_md5_small_file_arg deleted file mode 100644 index 337a5f4..0000000 --- a/test/logs/trace_valgrind_md5_small_file_arg +++ /dev/null @@ -1,36 +0,0 @@ -==23547== Memcheck, a memory error detector -==23547== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23547== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23547== Command: ./../ft_ssl md5 resources/text_file_small -==23547== -MD5 (resources/text_file_small) = f0ef7081e1539ac00ef5b761b4fb01b3 -==23547== -==23547== HEAP SUMMARY: -==23547== in use at exit: 18,178 bytes in 162 blocks -==23547== total heap usage: 184 allocs, 22 frees, 24,503 bytes allocated -==23547== -==23547== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23547== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23547== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23547== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23547== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23547== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23547== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23547== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23547== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23547== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23547== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23547== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23547== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23547== -==23547== LEAK SUMMARY: -==23547== definitely lost: 0 bytes in 0 blocks -==23547== indirectly lost: 0 bytes in 0 blocks -==23547== possibly lost: 72 bytes in 3 blocks -==23547== still reachable: 200 bytes in 6 blocks -==23547== suppressed: 17,906 bytes in 153 blocks -==23547== Reachable blocks (those to which a pointer was found) are not shown. -==23547== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23547== -==23547== For counts of detected and suppressed errors, rerun with: -v -==23547== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_md5_small_file_stdin b/test/logs/trace_valgrind_md5_small_file_stdin deleted file mode 100644 index 935ef2b..0000000 --- a/test/logs/trace_valgrind_md5_small_file_stdin +++ /dev/null @@ -1,36 +0,0 @@ -==23559== Memcheck, a memory error detector -==23559== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23559== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23559== Command: ./../ft_ssl md5 -==23559== -f0ef7081e1539ac00ef5b761b4fb01b3 -==23559== -==23559== HEAP SUMMARY: -==23559== in use at exit: 18,178 bytes in 162 blocks -==23559== total heap usage: 184 allocs, 22 frees, 24,503 bytes allocated -==23559== -==23559== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23559== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23559== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23559== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23559== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23559== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23559== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23559== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23559== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23559== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23559== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23559== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23559== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23559== -==23559== LEAK SUMMARY: -==23559== definitely lost: 0 bytes in 0 blocks -==23559== indirectly lost: 0 bytes in 0 blocks -==23559== possibly lost: 72 bytes in 3 blocks -==23559== still reachable: 200 bytes in 6 blocks -==23559== suppressed: 17,906 bytes in 153 blocks -==23559== Reachable blocks (those to which a pointer was found) are not shown. -==23559== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23559== -==23559== For counts of detected and suppressed errors, rerun with: -v -==23559== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_no_argument_01 b/test/logs/trace_valgrind_no_argument_01 deleted file mode 100644 index b91789f..0000000 --- a/test/logs/trace_valgrind_no_argument_01 +++ /dev/null @@ -1,36 +0,0 @@ -==23163== Memcheck, a memory error detector -==23163== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23163== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23163== Command: ./../ft_ssl -==23163== -usage: ft_ssl command [command opts] [command args] -==23163== -==23163== HEAP SUMMARY: -==23163== in use at exit: 18,178 bytes in 162 blocks -==23163== total heap usage: 178 allocs, 16 frees, 24,322 bytes allocated -==23163== -==23163== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23163== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23163== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23163== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23163== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23163== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23163== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23163== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23163== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23163== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23163== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23163== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23163== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23163== -==23163== LEAK SUMMARY: -==23163== definitely lost: 0 bytes in 0 blocks -==23163== indirectly lost: 0 bytes in 0 blocks -==23163== possibly lost: 72 bytes in 3 blocks -==23163== still reachable: 200 bytes in 6 blocks -==23163== suppressed: 17,906 bytes in 153 blocks -==23163== Reachable blocks (those to which a pointer was found) are not shown. -==23163== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23163== -==23163== For counts of detected and suppressed errors, rerun with: -v -==23163== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_no_argument_02 b/test/logs/trace_valgrind_no_argument_02 deleted file mode 100644 index 7c6049a..0000000 --- a/test/logs/trace_valgrind_no_argument_02 +++ /dev/null @@ -1,36 +0,0 @@ -==23174== Memcheck, a memory error detector -==23174== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23174== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23174== Command: ./../ft_ssl -==23174== -usage: ft_ssl command [command opts] [command args] -==23174== -==23174== HEAP SUMMARY: -==23174== in use at exit: 18,178 bytes in 162 blocks -==23174== total heap usage: 178 allocs, 16 frees, 24,322 bytes allocated -==23174== -==23174== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23174== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23174== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23174== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23174== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23174== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23174== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23174== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23174== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23174== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23174== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23174== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23174== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23174== -==23174== LEAK SUMMARY: -==23174== definitely lost: 0 bytes in 0 blocks -==23174== indirectly lost: 0 bytes in 0 blocks -==23174== possibly lost: 72 bytes in 3 blocks -==23174== still reachable: 200 bytes in 6 blocks -==23174== suppressed: 17,906 bytes in 153 blocks -==23174== Reachable blocks (those to which a pointer was found) are not shown. -==23174== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23174== -==23174== For counts of detected and suppressed errors, rerun with: -v -==23174== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_option_s_without_arg b/test/logs/trace_valgrind_option_s_without_arg deleted file mode 100644 index 9b93ddd..0000000 --- a/test/logs/trace_valgrind_option_s_without_arg +++ /dev/null @@ -1,36 +0,0 @@ -==23295== Memcheck, a memory error detector -==23295== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23295== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23295== Command: ./../ft_ssl md5 -s -==23295== -d41d8cd98f00b204e9800998ecf8427e -==23295== -==23295== HEAP SUMMARY: -==23295== in use at exit: 18,178 bytes in 162 blocks -==23295== total heap usage: 183 allocs, 21 frees, 24,490 bytes allocated -==23295== -==23295== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23295== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23295== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23295== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23295== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23295== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23295== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23295== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23295== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23295== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23295== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23295== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23295== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23295== -==23295== LEAK SUMMARY: -==23295== definitely lost: 0 bytes in 0 blocks -==23295== indirectly lost: 0 bytes in 0 blocks -==23295== possibly lost: 72 bytes in 3 blocks -==23295== still reachable: 200 bytes in 6 blocks -==23295== suppressed: 17,906 bytes in 153 blocks -==23295== Reachable blocks (those to which a pointer was found) are not shown. -==23295== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23295== -==23295== For counts of detected and suppressed errors, rerun with: -v -==23295== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_permission_denied b/test/logs/trace_valgrind_permission_denied deleted file mode 100644 index 62169c9..0000000 --- a/test/logs/trace_valgrind_permission_denied +++ /dev/null @@ -1,36 +0,0 @@ -==23275== Memcheck, a memory error detector -==23275== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23275== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23275== Command: ./../ft_ssl md5 resources/permissions -==23275== -ft_ssl: resources/permissions: Permission denied -==23275== -==23275== HEAP SUMMARY: -==23275== in use at exit: 20,226 bytes in 163 blocks -==23275== total heap usage: 179 allocs, 16 frees, 26,370 bytes allocated -==23275== -==23275== 72 bytes in 3 blocks are possibly lost in loss record 26 of 43 -==23275== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23275== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23275== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23275== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23275== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23275== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23275== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23275== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23275== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23275== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23275== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23275== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23275== -==23275== LEAK SUMMARY: -==23275== definitely lost: 0 bytes in 0 blocks -==23275== indirectly lost: 0 bytes in 0 blocks -==23275== possibly lost: 72 bytes in 3 blocks -==23275== still reachable: 2,248 bytes in 7 blocks -==23275== suppressed: 17,906 bytes in 153 blocks -==23275== Reachable blocks (those to which a pointer was found) are not shown. -==23275== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23275== -==23275== For counts of detected and suppressed errors, rerun with: -v -==23275== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_sha256_binary_file_stdin b/test/logs/trace_valgrind_sha256_binary_file_stdin deleted file mode 100644 index 01dde32..0000000 --- a/test/logs/trace_valgrind_sha256_binary_file_stdin +++ /dev/null @@ -1,36 +0,0 @@ -==23663== Memcheck, a memory error detector -==23663== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23663== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23663== Command: ./../ft_ssl sha256 -==23663== -0c21850620f7f42e3c4ea6117a901023fef10a835f3b5ee43f6235762c798d8f -==23663== -==23663== HEAP SUMMARY: -==23663== in use at exit: 18,178 bytes in 162 blocks -==23663== total heap usage: 1,440 allocs, 1,278 frees, 571,868 bytes allocated -==23663== -==23663== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23663== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23663== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23663== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23663== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23663== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23663== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23663== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23663== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23663== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23663== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23663== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23663== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23663== -==23663== LEAK SUMMARY: -==23663== definitely lost: 0 bytes in 0 blocks -==23663== indirectly lost: 0 bytes in 0 blocks -==23663== possibly lost: 72 bytes in 3 blocks -==23663== still reachable: 200 bytes in 6 blocks -==23663== suppressed: 17,906 bytes in 153 blocks -==23663== Reachable blocks (those to which a pointer was found) are not shown. -==23663== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23663== -==23663== For counts of detected and suppressed errors, rerun with: -v -==23663== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_sha256_empty_file_stdin b/test/logs/trace_valgrind_sha256_empty_file_stdin deleted file mode 100644 index 0088510..0000000 --- a/test/logs/trace_valgrind_sha256_empty_file_stdin +++ /dev/null @@ -1,36 +0,0 @@ -==23676== Memcheck, a memory error detector -==23676== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23676== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23676== Command: ./../ft_ssl sha256 -==23676== -e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 -==23676== -==23676== HEAP SUMMARY: -==23676== in use at exit: 18,178 bytes in 162 blocks -==23676== total heap usage: 184 allocs, 22 frees, 24,762 bytes allocated -==23676== -==23676== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23676== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23676== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23676== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23676== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23676== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23676== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23676== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23676== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23676== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23676== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23676== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23676== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23676== -==23676== LEAK SUMMARY: -==23676== definitely lost: 0 bytes in 0 blocks -==23676== indirectly lost: 0 bytes in 0 blocks -==23676== possibly lost: 72 bytes in 3 blocks -==23676== still reachable: 200 bytes in 6 blocks -==23676== suppressed: 17,906 bytes in 153 blocks -==23676== Reachable blocks (those to which a pointer was found) are not shown. -==23676== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23676== -==23676== For counts of detected and suppressed errors, rerun with: -v -==23676== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_sha256_large_file_stdin b/test/logs/trace_valgrind_sha256_large_file_stdin deleted file mode 100644 index 0738654..0000000 --- a/test/logs/trace_valgrind_sha256_large_file_stdin +++ /dev/null @@ -1,36 +0,0 @@ -==23715== Memcheck, a memory error detector -==23715== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23715== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23715== Command: ./../ft_ssl sha256 -==23715== -bb530fe35cad305dfcba486dbde298a1aee6fa59ad27afd05f7d9181c5e84963 -==23715== -==23715== HEAP SUMMARY: -==23715== in use at exit: 18,178 bytes in 162 blocks -==23715== total heap usage: 12,222 allocs, 12,060 frees, 8,968,177 bytes allocated -==23715== -==23715== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23715== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23715== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23715== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23715== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23715== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23715== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23715== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23715== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23715== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23715== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23715== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23715== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23715== -==23715== LEAK SUMMARY: -==23715== definitely lost: 0 bytes in 0 blocks -==23715== indirectly lost: 0 bytes in 0 blocks -==23715== possibly lost: 72 bytes in 3 blocks -==23715== still reachable: 200 bytes in 6 blocks -==23715== suppressed: 17,906 bytes in 153 blocks -==23715== Reachable blocks (those to which a pointer was found) are not shown. -==23715== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23715== -==23715== For counts of detected and suppressed errors, rerun with: -v -==23715== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_sha256_medium_file_stdin b/test/logs/trace_valgrind_sha256_medium_file_stdin deleted file mode 100644 index 2113aa2..0000000 --- a/test/logs/trace_valgrind_sha256_medium_file_stdin +++ /dev/null @@ -1,36 +0,0 @@ -==23702== Memcheck, a memory error detector -==23702== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23702== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23702== Command: ./../ft_ssl sha256 -==23702== -56005170a8bb77de9cefa181aff0a7457064ff39c17f269f5a852860109c7f6a -==23702== -==23702== HEAP SUMMARY: -==23702== in use at exit: 18,178 bytes in 162 blocks -==23702== total heap usage: 446 allocs, 284 frees, 125,025 bytes allocated -==23702== -==23702== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23702== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23702== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23702== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23702== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23702== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23702== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23702== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23702== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23702== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23702== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23702== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23702== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23702== -==23702== LEAK SUMMARY: -==23702== definitely lost: 0 bytes in 0 blocks -==23702== indirectly lost: 0 bytes in 0 blocks -==23702== possibly lost: 72 bytes in 3 blocks -==23702== still reachable: 200 bytes in 6 blocks -==23702== suppressed: 17,906 bytes in 153 blocks -==23702== Reachable blocks (those to which a pointer was found) are not shown. -==23702== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23702== -==23702== For counts of detected and suppressed errors, rerun with: -v -==23702== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_sha256_option_s_basic_string b/test/logs/trace_valgrind_sha256_option_s_basic_string deleted file mode 100644 index 9c18b8b..0000000 --- a/test/logs/trace_valgrind_sha256_option_s_basic_string +++ /dev/null @@ -1,36 +0,0 @@ -==23637== Memcheck, a memory error detector -==23637== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23637== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23637== Command: ./../ft_ssl sha256 -==23637== -2fb9f1e447f906641b665b02538a0320efb3e0b667a2655b3f9e041a3b2f815d -==23637== -==23637== HEAP SUMMARY: -==23637== in use at exit: 18,178 bytes in 162 blocks -==23637== total heap usage: 185 allocs, 23 frees, 24,770 bytes allocated -==23637== -==23637== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23637== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23637== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23637== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23637== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23637== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23637== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23637== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23637== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23637== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23637== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23637== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23637== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23637== -==23637== LEAK SUMMARY: -==23637== definitely lost: 0 bytes in 0 blocks -==23637== indirectly lost: 0 bytes in 0 blocks -==23637== possibly lost: 72 bytes in 3 blocks -==23637== still reachable: 200 bytes in 6 blocks -==23637== suppressed: 17,906 bytes in 153 blocks -==23637== Reachable blocks (those to which a pointer was found) are not shown. -==23637== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23637== -==23637== For counts of detected and suppressed errors, rerun with: -v -==23637== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_sha256_option_s_empty_string b/test/logs/trace_valgrind_sha256_option_s_empty_string deleted file mode 100644 index eef7f1e..0000000 --- a/test/logs/trace_valgrind_sha256_option_s_empty_string +++ /dev/null @@ -1,36 +0,0 @@ -==23622== Memcheck, a memory error detector -==23622== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23622== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23622== Command: ./../ft_ssl sha256 -==23622== -e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 -==23622== -==23622== HEAP SUMMARY: -==23622== in use at exit: 18,178 bytes in 162 blocks -==23622== total heap usage: 184 allocs, 22 frees, 24,762 bytes allocated -==23622== -==23622== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23622== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23622== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23622== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23622== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23622== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23622== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23622== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23622== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23622== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23622== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23622== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23622== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23622== -==23622== LEAK SUMMARY: -==23622== definitely lost: 0 bytes in 0 blocks -==23622== indirectly lost: 0 bytes in 0 blocks -==23622== possibly lost: 72 bytes in 3 blocks -==23622== still reachable: 200 bytes in 6 blocks -==23622== suppressed: 17,906 bytes in 153 blocks -==23622== Reachable blocks (those to which a pointer was found) are not shown. -==23622== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23622== -==23622== For counts of detected and suppressed errors, rerun with: -v -==23622== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_sha256_option_s_unicode b/test/logs/trace_valgrind_sha256_option_s_unicode deleted file mode 100644 index 41b4d96..0000000 --- a/test/logs/trace_valgrind_sha256_option_s_unicode +++ /dev/null @@ -1,36 +0,0 @@ -==23650== Memcheck, a memory error detector -==23650== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23650== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23650== Command: ./../ft_ssl sha256 -==23650== -498951833d0ae08fdbd6138b5ce91db88d5b278c3e60a58929309e87b357f3fa -==23650== -==23650== HEAP SUMMARY: -==23650== in use at exit: 18,178 bytes in 162 blocks -==23650== total heap usage: 186 allocs, 24 frees, 25,148 bytes allocated -==23650== -==23650== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23650== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23650== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23650== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23650== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23650== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23650== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23650== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23650== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23650== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23650== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23650== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23650== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23650== -==23650== LEAK SUMMARY: -==23650== definitely lost: 0 bytes in 0 blocks -==23650== indirectly lost: 0 bytes in 0 blocks -==23650== possibly lost: 72 bytes in 3 blocks -==23650== still reachable: 200 bytes in 6 blocks -==23650== suppressed: 17,906 bytes in 153 blocks -==23650== Reachable blocks (those to which a pointer was found) are not shown. -==23650== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23650== -==23650== For counts of detected and suppressed errors, rerun with: -v -==23650== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_sha256_small_file_stdin b/test/logs/trace_valgrind_sha256_small_file_stdin deleted file mode 100644 index 528b5ce..0000000 --- a/test/logs/trace_valgrind_sha256_small_file_stdin +++ /dev/null @@ -1,36 +0,0 @@ -==23689== Memcheck, a memory error detector -==23689== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23689== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23689== Command: ./../ft_ssl sha256 -==23689== -1894a19c85ba153acbf743ac4e43fc004c891604b26f8c69e1e83ea2afc7c48f -==23689== -==23689== HEAP SUMMARY: -==23689== in use at exit: 18,178 bytes in 162 blocks -==23689== total heap usage: 185 allocs, 23 frees, 24,775 bytes allocated -==23689== -==23689== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23689== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23689== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23689== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23689== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23689== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23689== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23689== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23689== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23689== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23689== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23689== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23689== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23689== -==23689== LEAK SUMMARY: -==23689== definitely lost: 0 bytes in 0 blocks -==23689== indirectly lost: 0 bytes in 0 blocks -==23689== possibly lost: 72 bytes in 3 blocks -==23689== still reachable: 200 bytes in 6 blocks -==23689== suppressed: 17,906 bytes in 153 blocks -==23689== Reachable blocks (those to which a pointer was found) are not shown. -==23689== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23689== -==23689== For counts of detected and suppressed errors, rerun with: -v -==23689== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_subject_test_01 b/test/logs/trace_valgrind_subject_test_01 deleted file mode 100644 index ac0e8c0..0000000 --- a/test/logs/trace_valgrind_subject_test_01 +++ /dev/null @@ -1,36 +0,0 @@ -==23307== Memcheck, a memory error detector -==23307== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23307== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23307== Command: ./../ft_ssl md5 -==23307== -c5e433c1dbd7ba01e3763a9483e74b04 -==23307== -==23307== HEAP SUMMARY: -==23307== in use at exit: 18,178 bytes in 162 blocks -==23307== total heap usage: 184 allocs, 22 frees, 24,503 bytes allocated -==23307== -==23307== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23307== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23307== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23307== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23307== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23307== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23307== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23307== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23307== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23307== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23307== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23307== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23307== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23307== -==23307== LEAK SUMMARY: -==23307== definitely lost: 0 bytes in 0 blocks -==23307== indirectly lost: 0 bytes in 0 blocks -==23307== possibly lost: 72 bytes in 3 blocks -==23307== still reachable: 200 bytes in 6 blocks -==23307== suppressed: 17,906 bytes in 153 blocks -==23307== Reachable blocks (those to which a pointer was found) are not shown. -==23307== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23307== -==23307== For counts of detected and suppressed errors, rerun with: -v -==23307== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_subject_test_02 b/test/logs/trace_valgrind_subject_test_02 deleted file mode 100644 index b41febe..0000000 --- a/test/logs/trace_valgrind_subject_test_02 +++ /dev/null @@ -1,37 +0,0 @@ -==23318== Memcheck, a memory error detector -==23318== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23318== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23318== Command: ./../ft_ssl md5 -p -==23318== -Do not pity the dead, Harry. -2d95365bc44bf0a298e09a3ab7b34d2f -==23318== -==23318== HEAP SUMMARY: -==23318== in use at exit: 18,178 bytes in 162 blocks -==23318== total heap usage: 184 allocs, 22 frees, 24,520 bytes allocated -==23318== -==23318== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23318== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23318== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23318== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23318== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23318== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23318== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23318== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23318== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23318== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23318== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23318== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23318== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23318== -==23318== LEAK SUMMARY: -==23318== definitely lost: 0 bytes in 0 blocks -==23318== indirectly lost: 0 bytes in 0 blocks -==23318== possibly lost: 72 bytes in 3 blocks -==23318== still reachable: 200 bytes in 6 blocks -==23318== suppressed: 17,906 bytes in 153 blocks -==23318== Reachable blocks (those to which a pointer was found) are not shown. -==23318== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23318== -==23318== For counts of detected and suppressed errors, rerun with: -v -==23318== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_subject_test_03 b/test/logs/trace_valgrind_subject_test_03 deleted file mode 100644 index 5cc748c..0000000 --- a/test/logs/trace_valgrind_subject_test_03 +++ /dev/null @@ -1,36 +0,0 @@ -==23330== Memcheck, a memory error detector -==23330== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23330== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23330== Command: ./../ft_ssl md5 -q -r -==23330== -e20c3b973f63482a778f3fd1869b7f25 -==23330== -==23330== HEAP SUMMARY: -==23330== in use at exit: 18,178 bytes in 162 blocks -==23330== total heap usage: 184 allocs, 22 frees, 24,508 bytes allocated -==23330== -==23330== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23330== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23330== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23330== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23330== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23330== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23330== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23330== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23330== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23330== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23330== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23330== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23330== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23330== -==23330== LEAK SUMMARY: -==23330== definitely lost: 0 bytes in 0 blocks -==23330== indirectly lost: 0 bytes in 0 blocks -==23330== possibly lost: 72 bytes in 3 blocks -==23330== still reachable: 200 bytes in 6 blocks -==23330== suppressed: 17,906 bytes in 153 blocks -==23330== Reachable blocks (those to which a pointer was found) are not shown. -==23330== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23330== -==23330== For counts of detected and suppressed errors, rerun with: -v -==23330== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_subject_test_04 b/test/logs/trace_valgrind_subject_test_04 deleted file mode 100644 index cc70424..0000000 --- a/test/logs/trace_valgrind_subject_test_04 +++ /dev/null @@ -1,36 +0,0 @@ -==23342== Memcheck, a memory error detector -==23342== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23342== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23342== Command: ./../ft_ssl md5 file -==23342== -MD5 (file) = 53d53ea94217b259c11a5a2d104ec58a -==23342== -==23342== HEAP SUMMARY: -==23342== in use at exit: 18,178 bytes in 162 blocks -==23342== total heap usage: 184 allocs, 22 frees, 24,506 bytes allocated -==23342== -==23342== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23342== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23342== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23342== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23342== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23342== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23342== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23342== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23342== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23342== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23342== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23342== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23342== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23342== -==23342== LEAK SUMMARY: -==23342== definitely lost: 0 bytes in 0 blocks -==23342== indirectly lost: 0 bytes in 0 blocks -==23342== possibly lost: 72 bytes in 3 blocks -==23342== still reachable: 200 bytes in 6 blocks -==23342== suppressed: 17,906 bytes in 153 blocks -==23342== Reachable blocks (those to which a pointer was found) are not shown. -==23342== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23342== -==23342== For counts of detected and suppressed errors, rerun with: -v -==23342== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_subject_test_05 b/test/logs/trace_valgrind_subject_test_05 deleted file mode 100644 index 50e51da..0000000 --- a/test/logs/trace_valgrind_subject_test_05 +++ /dev/null @@ -1,36 +0,0 @@ -==23352== Memcheck, a memory error detector -==23352== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23352== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23352== Command: ./../ft_ssl md5 -r file -==23352== -53d53ea94217b259c11a5a2d104ec58a file -==23352== -==23352== HEAP SUMMARY: -==23352== in use at exit: 18,178 bytes in 162 blocks -==23352== total heap usage: 184 allocs, 22 frees, 24,506 bytes allocated -==23352== -==23352== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23352== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23352== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23352== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23352== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23352== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23352== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23352== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23352== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23352== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23352== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23352== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23352== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23352== -==23352== LEAK SUMMARY: -==23352== definitely lost: 0 bytes in 0 blocks -==23352== indirectly lost: 0 bytes in 0 blocks -==23352== possibly lost: 72 bytes in 3 blocks -==23352== still reachable: 200 bytes in 6 blocks -==23352== suppressed: 17,906 bytes in 153 blocks -==23352== Reachable blocks (those to which a pointer was found) are not shown. -==23352== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23352== -==23352== For counts of detected and suppressed errors, rerun with: -v -==23352== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_subject_test_06 b/test/logs/trace_valgrind_subject_test_06 deleted file mode 100644 index d907f6a..0000000 --- a/test/logs/trace_valgrind_subject_test_06 +++ /dev/null @@ -1,36 +0,0 @@ -==23362== Memcheck, a memory error detector -==23362== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23362== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23362== Command: ./../ft_ssl md5 -s pity\ those\ that\ aren't\ following\ baerista\ on\ spotify. -==23362== -MD5 ("pity those that aren't following baerista on spotify.") = a3c990a1964705d9bf0e602f44572f5f -==23362== -==23362== HEAP SUMMARY: -==23362== in use at exit: 18,178 bytes in 162 blocks -==23362== total heap usage: 183 allocs, 21 frees, 24,490 bytes allocated -==23362== -==23362== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23362== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23362== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23362== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23362== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23362== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23362== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23362== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23362== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23362== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23362== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23362== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23362== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23362== -==23362== LEAK SUMMARY: -==23362== definitely lost: 0 bytes in 0 blocks -==23362== indirectly lost: 0 bytes in 0 blocks -==23362== possibly lost: 72 bytes in 3 blocks -==23362== still reachable: 200 bytes in 6 blocks -==23362== suppressed: 17,906 bytes in 153 blocks -==23362== Reachable blocks (those to which a pointer was found) are not shown. -==23362== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23362== -==23362== For counts of detected and suppressed errors, rerun with: -v -==23362== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_subject_test_07 b/test/logs/trace_valgrind_subject_test_07 deleted file mode 100644 index e681da2..0000000 --- a/test/logs/trace_valgrind_subject_test_07 +++ /dev/null @@ -1,38 +0,0 @@ -==23373== Memcheck, a memory error detector -==23373== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23373== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23373== Command: ./../ft_ssl md5 -p file -==23373== -be sure to handle edge cases carefully -3553dc7dc5963b583c056d1b9fa3349c -MD5 (file) = 53d53ea94217b259c11a5a2d104ec58a -==23373== -==23373== HEAP SUMMARY: -==23373== in use at exit: 18,178 bytes in 162 blocks -==23373== total heap usage: 190 allocs, 28 frees, 24,714 bytes allocated -==23373== -==23373== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23373== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23373== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23373== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23373== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23373== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23373== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23373== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23373== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23373== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23373== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23373== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23373== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23373== -==23373== LEAK SUMMARY: -==23373== definitely lost: 0 bytes in 0 blocks -==23373== indirectly lost: 0 bytes in 0 blocks -==23373== possibly lost: 72 bytes in 3 blocks -==23373== still reachable: 200 bytes in 6 blocks -==23373== suppressed: 17,906 bytes in 153 blocks -==23373== Reachable blocks (those to which a pointer was found) are not shown. -==23373== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23373== -==23373== For counts of detected and suppressed errors, rerun with: -v -==23373== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_subject_test_08 b/test/logs/trace_valgrind_subject_test_08 deleted file mode 100644 index 003e918..0000000 --- a/test/logs/trace_valgrind_subject_test_08 +++ /dev/null @@ -1,38 +0,0 @@ -==23397== Memcheck, a memory error detector -==23397== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23397== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23397== Command: ./../ft_ssl md5 -p -r file -==23397== -but eventually you will understand -dcdd84e0f635694d2a943fa8d3905281 -53d53ea94217b259c11a5a2d104ec58a file -==23397== -==23397== HEAP SUMMARY: -==23397== in use at exit: 18,178 bytes in 162 blocks -==23397== total heap usage: 190 allocs, 28 frees, 24,710 bytes allocated -==23397== -==23397== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23397== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23397== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23397== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23397== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23397== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23397== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23397== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23397== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23397== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23397== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23397== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23397== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23397== -==23397== LEAK SUMMARY: -==23397== definitely lost: 0 bytes in 0 blocks -==23397== indirectly lost: 0 bytes in 0 blocks -==23397== possibly lost: 72 bytes in 3 blocks -==23397== still reachable: 200 bytes in 6 blocks -==23397== suppressed: 17,906 bytes in 153 blocks -==23397== Reachable blocks (those to which a pointer was found) are not shown. -==23397== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23397== -==23397== For counts of detected and suppressed errors, rerun with: -v -==23397== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_subject_test_09 b/test/logs/trace_valgrind_subject_test_09 deleted file mode 100644 index 08cee33..0000000 --- a/test/logs/trace_valgrind_subject_test_09 +++ /dev/null @@ -1,39 +0,0 @@ -==23410== Memcheck, a memory error detector -==23410== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23410== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23410== Command: ./../ft_ssl md5 -p -s foo file -==23410== -GL HF let's go -d1e3cc342b6da09480b27ec57ff243e2 -MD5 ("foo") = acbd18db4cc2f85cedef654fccc4a4d8 -MD5 (file) = 53d53ea94217b259c11a5a2d104ec58a -==23410== -==23410== HEAP SUMMARY: -==23410== in use at exit: 18,178 bytes in 162 blocks -==23410== total heap usage: 195 allocs, 33 frees, 24,858 bytes allocated -==23410== -==23410== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23410== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23410== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23410== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23410== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23410== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23410== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23410== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23410== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23410== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23410== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23410== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23410== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23410== -==23410== LEAK SUMMARY: -==23410== definitely lost: 0 bytes in 0 blocks -==23410== indirectly lost: 0 bytes in 0 blocks -==23410== possibly lost: 72 bytes in 3 blocks -==23410== still reachable: 200 bytes in 6 blocks -==23410== suppressed: 17,906 bytes in 153 blocks -==23410== Reachable blocks (those to which a pointer was found) are not shown. -==23410== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23410== -==23410== For counts of detected and suppressed errors, rerun with: -v -==23410== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_subject_test_10 b/test/logs/trace_valgrind_subject_test_10 deleted file mode 100644 index 1479371..0000000 --- a/test/logs/trace_valgrind_subject_test_10 +++ /dev/null @@ -1,40 +0,0 @@ -==23424== Memcheck, a memory error detector -==23424== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23424== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23424== Command: ./../ft_ssl md5 -r -p -s foo file -s bar -==23424== -one more thing -a0bd1876c6f011dd50fae52827f445f5 -MD5 ("foo") = acbd18db4cc2f85cedef654fccc4a4d8 -MD5 (file) = 53d53ea94217b259c11a5a2d104ec58a -MD5 ("bar") = 37b51d194a7513e45b56f6524f2d51f2 -==23424== -==23424== HEAP SUMMARY: -==23424== in use at exit: 18,178 bytes in 162 blocks -==23424== total heap usage: 200 allocs, 38 frees, 25,026 bytes allocated -==23424== -==23424== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23424== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23424== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23424== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23424== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23424== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23424== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23424== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23424== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23424== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23424== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23424== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23424== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23424== -==23424== LEAK SUMMARY: -==23424== definitely lost: 0 bytes in 0 blocks -==23424== indirectly lost: 0 bytes in 0 blocks -==23424== possibly lost: 72 bytes in 3 blocks -==23424== still reachable: 200 bytes in 6 blocks -==23424== suppressed: 17,906 bytes in 153 blocks -==23424== Reachable blocks (those to which a pointer was found) are not shown. -==23424== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23424== -==23424== For counts of detected and suppressed errors, rerun with: -v -==23424== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) diff --git a/test/logs/trace_valgrind_subject_test_11 b/test/logs/trace_valgrind_subject_test_11 deleted file mode 100644 index 53e2064..0000000 --- a/test/logs/trace_valgrind_subject_test_11 +++ /dev/null @@ -1,39 +0,0 @@ -==23440== Memcheck, a memory error detector -==23440== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. -==23440== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info -==23440== Command: ./../ft_ssl md5 -r -q -p -s foo file -==23440== -just to be extra clear -3ba35f1ea0d170cb3b9a752e3360286c -MD5 ("foo") = acbd18db4cc2f85cedef654fccc4a4d8 -MD5 (file) = 53d53ea94217b259c11a5a2d104ec58a -==23440== -==23440== HEAP SUMMARY: -==23440== in use at exit: 18,178 bytes in 162 blocks -==23440== total heap usage: 195 allocs, 33 frees, 24,866 bytes allocated -==23440== -==23440== 72 bytes in 3 blocks are possibly lost in loss record 26 of 42 -==23440== at 0x10009CC8A: calloc (in /Users/cpieri/.brew/Cellar/valgrind/3.14.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) -==23440== by 0x1005B6832: map_images_nolock (in /usr/lib/libobjc.A.dylib) -==23440== by 0x1005C9D6A: map_images (in /usr/lib/libobjc.A.dylib) -==23440== by 0x10000B03B: dyld::notifyBatchPartial(dyld_image_states, bool, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), bool, bool) (in /usr/lib/dyld) -==23440== by 0x10000B255: dyld::registerObjCNotifiers(void (*)(unsigned int, char const* const*, mach_header const* const*), void (*)(char const*, mach_header const*), void (*)(char const*, mach_header const*)) (in /usr/lib/dyld) -==23440== by 0x10020400A: _dyld_objc_notify_register (in /usr/lib/system/libdyld.dylib) -==23440== by 0x1005B6072: _objc_init (in /usr/lib/libobjc.A.dylib) -==23440== by 0x10019768D: _os_object_init (in /usr/lib/system/libdispatch.dylib) -==23440== by 0x10019763A: libdispatch_init (in /usr/lib/system/libdispatch.dylib) -==23440== by 0x1000AB9D5: libSystem_initializer (in /usr/lib/libSystem.B.dylib) -==23440== by 0x10001BA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23440== by 0x10001BC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld) -==23440== -==23440== LEAK SUMMARY: -==23440== definitely lost: 0 bytes in 0 blocks -==23440== indirectly lost: 0 bytes in 0 blocks -==23440== possibly lost: 72 bytes in 3 blocks -==23440== still reachable: 200 bytes in 6 blocks -==23440== suppressed: 17,906 bytes in 153 blocks -==23440== Reachable blocks (those to which a pointer was found) are not shown. -==23440== To see them, rerun with: --leak-check=full --show-leak-kinds=all -==23440== -==23440== For counts of detected and suppressed errors, rerun with: -v -==23440== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 12) From 4696ba18ab66a92b1d32c28fcffb0abd51ff606e Mon Sep 17 00:00:00 2001 From: Louise P Date: Tue, 7 May 2019 17:02:58 +0200 Subject: [PATCH 30/71] move test in test --- {test_des => test/test_des}/test.sh | 0 {test_des => test/test_des}/test_base64/encode_auteur | 0 {test_des => test/test_des}/test_base64/encode_clean_c | 0 {test_des => test/test_des}/test_base64/encode_mfile | 0 {test_des => test/test_des}/test_base64/size_file | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename {test_des => test/test_des}/test.sh (100%) rename {test_des => test/test_des}/test_base64/encode_auteur (100%) rename {test_des => test/test_des}/test_base64/encode_clean_c (100%) rename {test_des => test/test_des}/test_base64/encode_mfile (100%) rename {test_des => test/test_des}/test_base64/size_file (100%) diff --git a/test_des/test.sh b/test/test_des/test.sh similarity index 100% rename from test_des/test.sh rename to test/test_des/test.sh diff --git a/test_des/test_base64/encode_auteur b/test/test_des/test_base64/encode_auteur similarity index 100% rename from test_des/test_base64/encode_auteur rename to test/test_des/test_base64/encode_auteur diff --git a/test_des/test_base64/encode_clean_c b/test/test_des/test_base64/encode_clean_c similarity index 100% rename from test_des/test_base64/encode_clean_c rename to test/test_des/test_base64/encode_clean_c diff --git a/test_des/test_base64/encode_mfile b/test/test_des/test_base64/encode_mfile similarity index 100% rename from test_des/test_base64/encode_mfile rename to test/test_des/test_base64/encode_mfile diff --git a/test_des/test_base64/size_file b/test/test_des/test_base64/size_file similarity index 100% rename from test_des/test_base64/size_file rename to test/test_des/test_base64/size_file From 5a1aaeb744283f6df8f5966c5e47412b2d1734a4 Mon Sep 17 00:00:00 2001 From: Louise P Date: Wed, 8 May 2019 11:07:05 +0200 Subject: [PATCH 31/71] [Feature]: Symmetric Parsing All functions for opt it's okay Parsing will soon be finish --- Makefile | 53 ++++++++++----------- includes/base64/base64.h | 10 +++- includes/enum.h | 10 +--- includes/symmetric/symmetric.h | 26 ++++++----- srcs/symmetric/symmetric_parsing.c | 15 +++--- srcs/symmetric/symmetric_parsing_pt_f.c | 40 +++++++--------- srcs/symmetric/symmetric_parsing_pt_f_2.c | 56 +++++++++++++++++++++++ 7 files changed, 134 insertions(+), 76 deletions(-) create mode 100644 srcs/symmetric/symmetric_parsing_pt_f_2.c diff --git a/Makefile b/Makefile index dfc8729..552c287 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/03/15 11:20:25 by cpieri #+# #+# # -# Updated: 2019/05/07 11:27:35 by cpieri ### ########.fr # +# Updated: 2019/05/08 10:34:05 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -40,31 +40,32 @@ DEPS = Makefile \ includes/symmetric/symmetric.h \ libft/libft.a -SRC_NAME= main.c \ - parsing.c \ - dispatch.c \ - tools/clean.c \ - tools/usage.c \ - tools/error.c \ - tools/get_data.c \ - tools/open_fd.c \ - tools/lst_opt.c \ - hash/hash_parsing.c \ - hash/display_hash.c \ - hash/sha256/sha256.c \ - hash/sha256/sha256_utils.c \ - hash/md5/md5_utils.c \ - hash/md5/md5.c \ - base64/base64.c \ - base64/base64_encode.c \ - base64/base64_decode.c \ - base64/base64_parsing.c \ - base64/base64_help_parsing.c \ - base64/base64_display.c \ - symmetric/sym_key.c \ - symmetric/symmetric_usage.c \ - symmetric/symmetric_parsing.c \ - symmetric/symmetric_parsing_pt_f.c \ +SRC_NAME= main.c \ + parsing.c \ + dispatch.c \ + tools/clean.c \ + tools/usage.c \ + tools/error.c \ + tools/get_data.c \ + tools/open_fd.c \ + tools/lst_opt.c \ + hash/hash_parsing.c \ + hash/display_hash.c \ + hash/sha256/sha256.c \ + hash/sha256/sha256_utils.c \ + hash/md5/md5_utils.c \ + hash/md5/md5.c \ + base64/base64.c \ + base64/base64_encode.c \ + base64/base64_decode.c \ + base64/base64_parsing.c \ + base64/base64_help_parsing.c \ + base64/base64_display.c \ + symmetric/sym_key.c \ + symmetric/symmetric_usage.c \ + symmetric/symmetric_parsing.c \ + symmetric/symmetric_parsing_pt_f.c \ + symmetric/symmetric_parsing_pt_f_2.c \ OBJ_NAME= $(SRC_NAME:.c=.o) diff --git a/includes/base64/base64.h b/includes/base64/base64.h index a32a34a..594dcdd 100644 --- a/includes/base64/base64.h +++ b/includes/base64/base64.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/12 11:59:40 by cpieri #+# #+# */ -/* Updated: 2019/04/30 16:11:01 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 10:53:06 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,14 @@ # include "../libft/include/libft.h" +enum e_base64_flags +{ + e_base64_encode = 0x00000001, + e_base64_decode = 0x00000010, + e_base64_inputf = 0x00000100, + e_base64_outputf = 0x00001000, +}; + typedef struct s_base64_encode { uint8_t n0; diff --git a/includes/enum.h b/includes/enum.h index 79e2910..db52500 100644 --- a/includes/enum.h +++ b/includes/enum.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 14:34:08 by cpieri #+# #+# */ -/* Updated: 2019/04/15 14:19:15 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 10:53:01 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,12 +19,6 @@ enum e_algo e_cipher, }; -enum e_base64_flags -{ - e_base64_encode = 0x00000001, - e_base64_decode = 0x00000010, - e_base64_inputf = 0x00000100, - e_base64_outputf = 0x00001000, -}; + #endif diff --git a/includes/symmetric/symmetric.h b/includes/symmetric/symmetric.h index cb6c663..1318dae 100644 --- a/includes/symmetric/symmetric.h +++ b/includes/symmetric/symmetric.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 10:11:43 by cpieri #+# #+# */ -/* Updated: 2019/05/07 16:07:25 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 11:00:46 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,15 +19,15 @@ enum e_sym_opt { - e_sym_opt_a = 1, - e_sym_opt_d, - e_sym_opt_e, - e_sym_opt_i, - e_sym_opt_o, - e_sym_opt_k, - e_sym_opt_p, - e_sym_opt_s, - e_sym_opt_v + e_sym_opt_a = 0x000000001, + e_sym_opt_d = 0x000000010, + e_sym_opt_e = 0x000000100, + e_sym_opt_i = 0x000001000, + e_sym_opt_o = 0x000010000, + e_sym_opt_k = 0x000100000, + e_sym_opt_p = 0x001000000, + e_sym_opt_s = 0x010000000, + e_sym_opt_v = 0x100000000 }; typedef struct s_sym_key @@ -41,7 +41,7 @@ typedef struct s_sym_key typedef struct s_sym_opt { char opt; - int flag; + uint64_t flag; void (*sym_opt_fun)(char **, int *, t_opt *, t_sym_key **); } t_sym_opt; @@ -51,11 +51,15 @@ typedef struct s_sym_opt /* ** Functions for get options in parsing */ +void get_sym_opt_a(char **av, int *now, t_opt *opt, t_sym_key **k); +void get_sym_opt_d(char **av, int *now, t_opt *opt, t_sym_key **k); +void get_sym_opt_e(char **av, int *now, t_opt *opt, t_sym_key **k); void get_sym_opt_i(char **av, int *now, t_opt *opt, t_sym_key **k); void get_sym_opt_o(char **av, int *now, t_opt *opt, t_sym_key **k); void get_sym_opt_k(char **av, int *now, t_opt *opt, t_sym_key **k); void get_sym_opt_s(char **av, int *now, t_opt *opt, t_sym_key **k); void get_sym_opt_p(char **av, int *now, t_opt *opt, t_sym_key **k); +void get_sym_opt_v(char **av, int *now, t_opt *opt, t_sym_key **k); /* ** Functions for create and del struct symmetric key diff --git a/srcs/symmetric/symmetric_parsing.c b/srcs/symmetric/symmetric_parsing.c index 039350c..acfebd6 100644 --- a/srcs/symmetric/symmetric_parsing.c +++ b/srcs/symmetric/symmetric_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 12:04:37 by cpieri #+# #+# */ -/* Updated: 2019/05/07 16:17:21 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 11:00:53 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,15 +17,15 @@ static const t_sym_opt g_sym_opt[] = { - {'e', e_sym_opt_e, NULL}, - {'d', e_sym_opt_d, NULL}, - {'a', e_sym_opt_a, NULL}, + {'a', e_sym_opt_a, get_sym_opt_a}, + {'d', e_sym_opt_d, get_sym_opt_d}, + {'e', e_sym_opt_e, get_sym_opt_e}, {'i', e_sym_opt_i, get_sym_opt_i}, {'o', e_sym_opt_o, get_sym_opt_o}, {'k', e_sym_opt_k, get_sym_opt_k}, {'s', e_sym_opt_s, get_sym_opt_s}, {'p', e_sym_opt_p, get_sym_opt_p}, - {'v', e_sym_opt_v, NULL}, + {'v', e_sym_opt_v, get_sym_opt_v}, {0, 0, NULL} }; @@ -64,8 +64,9 @@ static t_opt *get_sym_args(const int ac, char **av, int now) get_sym_opt(av, &now, &opt, &k); now++; } - if (k == NULL) - k = new_key(get_pass("enter your password: "), 0, 0, 0); + ft_membits(&(opt.flags.sym_flags), 0, sizeof(uint64_t)); + // if (k == NULL) + // k = new_key(get_pass("enter your password: "), 0, 0, 0); return (new_opt((t_flags){0, 0, 0, 0, 0, 0}, NULL)); } diff --git a/srcs/symmetric/symmetric_parsing_pt_f.c b/srcs/symmetric/symmetric_parsing_pt_f.c index df797aa..c6de5fe 100644 --- a/srcs/symmetric/symmetric_parsing_pt_f.c +++ b/srcs/symmetric/symmetric_parsing_pt_f.c @@ -6,13 +6,12 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/07 09:34:06 by cpieri #+# #+# */ -/* Updated: 2019/05/07 16:37:01 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 11:03:32 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "symmetric/symmetric.h" #include "ft_ssl.h" -#include void get_sym_opt_i(char **av, int *now, t_opt *opt, t_sym_key **k) { @@ -66,43 +65,38 @@ void get_sym_opt_k(char **av, int *now, t_opt *opt, t_sym_key **k) (*now)++; } -void get_sym_opt_s(char **av, int *now, t_opt *opt, t_sym_key **k) +void get_sym_opt_p(char **av, int *now, t_opt *opt, t_sym_key **k) { - uint64_t salt; + char *pass; - if (av[*now + 1] == NULL || av[*now + 1][0] == '-') + if ((pass = av[*now + 1]) == NULL || pass[0] == '-') sym_usage(av[*now]); - if ((opt->flags.sym_flags & e_sym_opt_k) != e_sym_opt_k) + if ((opt->flags.sym_flags & e_sym_opt_k) != e_sym_opt_k + && ft_strncmp(pass, "pass:", 5) == 0 && ft_strlen(pass) >= 6) { - salt = hex2int(av[*now + 1]); - opt->flags.sym_flags |= e_sym_opt_s; + opt->flags.sym_flags |= e_sym_opt_p; if (*k == NULL) - *k = new_key(NULL, salt, 0, 0); + *k = new_key((uint8_t*)(pass + 5), 0, 0, 0); else - (*k)->salt = salt; + (*k)->pass = (uint8_t*)(pass + 5); (*now)++; } } -void get_sym_opt_p(char **av, int *now, t_opt *opt, t_sym_key **k) +void get_sym_opt_s(char **av, int *now, t_opt *opt, t_sym_key **k) { - char *pass; + uint64_t salt; - if ((pass = av[*now + 1]) == NULL || pass[0] == '-') + if (av[*now + 1] == NULL || av[*now + 1][0] == '-') sym_usage(av[*now]); - ft_membits(&(opt->flags.sym_flags), 0, sizeof(uint64_t)); - if ((opt->flags.sym_flags & e_sym_opt_k) != e_sym_opt_k - && ft_strncmp(pass, "pass:", 5) == 0 && ft_strlen(pass) >= 6) + if ((opt->flags.sym_flags & e_sym_opt_k) != e_sym_opt_k) { - opt->flags.sym_flags |= e_sym_opt_p; + salt = hex2int(av[*now + 1]); + opt->flags.sym_flags |= e_sym_opt_s; if (*k == NULL) - *k = new_key((uint8_t*)(pass + 5), 0, 0, 0); + *k = new_key(NULL, salt, 0, 0); else - (*k)->pass = (uint8_t*)(pass + 5); + (*k)->salt = salt; (*now)++; - ft_membits(&(opt->flags.sym_flags), 0, sizeof(uint64_t)); - print_t_key(*k); } - else - sym_usage(av[*now]); } diff --git a/srcs/symmetric/symmetric_parsing_pt_f_2.c b/srcs/symmetric/symmetric_parsing_pt_f_2.c new file mode 100644 index 0000000..ddef467 --- /dev/null +++ b/srcs/symmetric/symmetric_parsing_pt_f_2.c @@ -0,0 +1,56 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* symmetric_parsing_pt_f_2.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/05/08 10:21:15 by cpieri #+# #+# */ +/* Updated: 2019/05/08 11:03:36 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "symmetric/symmetric.h" +#include "ft_ssl.h" + +void get_sym_opt_a(char **av, int *now, t_opt *opt, t_sym_key **k) +{ + (void)av; + (void)now; + (void)k; + opt->flags.sym_flags |= e_sym_opt_a; +} + +void get_sym_opt_d(char **av, int *now, t_opt *opt, t_sym_key **k) +{ + (void)k; + (void)now; + (void)av; + if ((opt->flags.sym_flags & e_sym_opt_e) == e_sym_opt_e) + opt->flags.sym_flags ^= e_sym_opt_e; + opt->flags.sym_flags |= e_sym_opt_d; +} + +void get_sym_opt_e(char **av, int *now, t_opt *opt, t_sym_key **k) +{ + (void)k; + (void)now; + (void)av; + if ((opt->flags.sym_flags & e_sym_opt_d) != e_sym_opt_d) + opt->flags.sym_flags |= e_sym_opt_e; +} + +void get_sym_opt_v(char **av, int *now, t_opt *opt, t_sym_key **k) +{ + uint64_t vector; + + if (av[*now + 1] == NULL || av[*now + 1][0] == '-') + sym_usage(av[*now]); + vector = hex2int(av[*now + 1]); + opt->flags.sym_flags |= e_sym_opt_v; + if (*k == NULL) + *k = new_key(NULL, 0, 0, vector); + else + (*k)->vect = vector; + (*now)++; +} From 1fdfcf555098c172294d9285001c52e996c1bea2 Mon Sep 17 00:00:00 2001 From: Louise P Date: Wed, 8 May 2019 11:25:00 +0200 Subject: [PATCH 32/71] [Feature]: Symmetric Parsing Added an additional function in my libft to convert from hexadecimal to uint64_t --- libft/Makefile | 3 +- libft/include/libft.h | 3 +- libft/srcs/hex2uint64t.c | 34 +++++++++++++++++++++++ srcs/symmetric/symmetric_parsing_pt_f.c | 6 ++-- srcs/symmetric/symmetric_parsing_pt_f_2.c | 4 +-- 5 files changed, 43 insertions(+), 7 deletions(-) create mode 100644 libft/srcs/hex2uint64t.c diff --git a/libft/Makefile b/libft/Makefile index bc6a3d8..2f2a43e 100644 --- a/libft/Makefile +++ b/libft/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2017/11/07 18:38:31 by tmilon #+# #+# # -# Updated: 2019/04/11 19:13:41 by cpieri ### ########.fr # +# Updated: 2019/05/08 11:19:28 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -110,6 +110,7 @@ SRCS = ft_atoi.c \ get_next_line.c \ ft_abort.c \ ftb_hex2int.c \ + hex2uint64t.c \ ftb_free_multiarray.c \ ftb_find_closest_offset.c \ ftb_abs.c \ diff --git a/libft/include/libft.h b/libft/include/libft.h index bf1b3fd..610bb39 100644 --- a/libft/include/libft.h +++ b/libft/include/libft.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/09 16:47:24 by cpieri #+# #+# */ -/* Updated: 2019/05/07 10:32:50 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 11:17:19 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -133,6 +133,7 @@ int ft_sqrt(int n); int ftb_abs(int n); int ftb_pow(int n, int pow); int *find_closest_offset(int x, int y, int tx, int ty); +uint64_t hex2uint64t(char *hex); int hex2int(char *hex); int ftb_rand(unsigned int min, unsigned int max, unsigned int seed); diff --git a/libft/srcs/hex2uint64t.c b/libft/srcs/hex2uint64t.c new file mode 100644 index 0000000..80bf4cd --- /dev/null +++ b/libft/srcs/hex2uint64t.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* hex2uint64t.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/05/08 11:10:23 by cpieri #+# #+# */ +/* Updated: 2019/05/08 11:20:15 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +uint64_t hex2uint64t(char *hex) +{ + uint64_t val; + int byte; + + val = 0; + while (*hex) + { + byte = *hex; + if (byte >= '0' && byte <= '9') + byte = byte - '0'; + else if (byte >= 'a' && byte <= 'f') + byte = byte - 'a' + 10; + else if (byte >= 'A' && byte <= 'F') + byte = byte - 'A' + 10; + val = (val << 4) | (byte & 0xF); + hex++; + } + return (val); +} \ No newline at end of file diff --git a/srcs/symmetric/symmetric_parsing_pt_f.c b/srcs/symmetric/symmetric_parsing_pt_f.c index c6de5fe..e81368e 100644 --- a/srcs/symmetric/symmetric_parsing_pt_f.c +++ b/srcs/symmetric/symmetric_parsing_pt_f.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/07 09:34:06 by cpieri #+# #+# */ -/* Updated: 2019/05/08 11:03:32 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 11:22:27 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -54,7 +54,7 @@ void get_sym_opt_k(char **av, int *now, t_opt *opt, t_sym_key **k) if (av[*now + 1] == NULL || av[*now + 1][0] == '-') sym_usage(av[*now]); - key = hex2int(av[*now + 1]); + key = hex2uint64t(av[*now + 1]); opt->flags.sym_flags |= e_sym_opt_k; if ((opt->flags.sym_flags & e_sym_opt_s) == e_sym_opt_s) opt->flags.sym_flags ^= e_sym_opt_s; @@ -91,7 +91,7 @@ void get_sym_opt_s(char **av, int *now, t_opt *opt, t_sym_key **k) sym_usage(av[*now]); if ((opt->flags.sym_flags & e_sym_opt_k) != e_sym_opt_k) { - salt = hex2int(av[*now + 1]); + salt = hex2uint64t(av[*now + 1]); opt->flags.sym_flags |= e_sym_opt_s; if (*k == NULL) *k = new_key(NULL, salt, 0, 0); diff --git a/srcs/symmetric/symmetric_parsing_pt_f_2.c b/srcs/symmetric/symmetric_parsing_pt_f_2.c index ddef467..ab39500 100644 --- a/srcs/symmetric/symmetric_parsing_pt_f_2.c +++ b/srcs/symmetric/symmetric_parsing_pt_f_2.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/08 10:21:15 by cpieri #+# #+# */ -/* Updated: 2019/05/08 11:03:36 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 11:17:06 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -46,7 +46,7 @@ void get_sym_opt_v(char **av, int *now, t_opt *opt, t_sym_key **k) if (av[*now + 1] == NULL || av[*now + 1][0] == '-') sym_usage(av[*now]); - vector = hex2int(av[*now + 1]); + vector = hex2uint64t(av[*now + 1]); opt->flags.sym_flags |= e_sym_opt_v; if (*k == NULL) *k = new_key(NULL, 0, 0, vector); From 97bf4d90db818bd70f4c5bf6757b72eb682af9d9 Mon Sep 17 00:00:00 2001 From: Louise P Date: Wed, 8 May 2019 12:39:20 +0200 Subject: [PATCH 33/71] [Feature]: Symmetric Parsing Parsing finish !!! --- includes/symmetric/symmetric.h | 4 +++- srcs/symmetric/symmetric_parsing.c | 9 ++++----- srcs/symmetric/symmetric_parsing_pt_f_2.c | 20 +++++++++++++++++++- srcs/tools/lst_opt.c | 7 ++++--- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/includes/symmetric/symmetric.h b/includes/symmetric/symmetric.h index 1318dae..c2fbb81 100644 --- a/includes/symmetric/symmetric.h +++ b/includes/symmetric/symmetric.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 10:11:43 by cpieri #+# #+# */ -/* Updated: 2019/05/08 11:00:46 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 12:27:35 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -60,6 +60,8 @@ void get_sym_opt_k(char **av, int *now, t_opt *opt, t_sym_key **k); void get_sym_opt_s(char **av, int *now, t_opt *opt, t_sym_key **k); void get_sym_opt_p(char **av, int *now, t_opt *opt, t_sym_key **k); void get_sym_opt_v(char **av, int *now, t_opt *opt, t_sym_key **k); +void get_sym_stdin(t_opt *opt, t_sym_key **k); + /* ** Functions for create and del struct symmetric key diff --git a/srcs/symmetric/symmetric_parsing.c b/srcs/symmetric/symmetric_parsing.c index acfebd6..bfe9af9 100644 --- a/srcs/symmetric/symmetric_parsing.c +++ b/srcs/symmetric/symmetric_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 12:04:37 by cpieri #+# #+# */ -/* Updated: 2019/05/08 11:00:53 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 12:37:11 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -64,10 +64,9 @@ static t_opt *get_sym_args(const int ac, char **av, int now) get_sym_opt(av, &now, &opt, &k); now++; } - ft_membits(&(opt.flags.sym_flags), 0, sizeof(uint64_t)); - // if (k == NULL) - // k = new_key(get_pass("enter your password: "), 0, 0, 0); - return (new_opt((t_flags){0, 0, 0, 0, 0, 0}, NULL)); + if (opt.data->data == NULL || k == NULL) + get_sym_stdin(&opt, &k); + return (new_opt(opt.flags, opt.data)); } t_opt *symmetric_opts(const int ac, char **av, t_opt *opts, int now) diff --git a/srcs/symmetric/symmetric_parsing_pt_f_2.c b/srcs/symmetric/symmetric_parsing_pt_f_2.c index ab39500..29fdb40 100644 --- a/srcs/symmetric/symmetric_parsing_pt_f_2.c +++ b/srcs/symmetric/symmetric_parsing_pt_f_2.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/08 10:21:15 by cpieri #+# #+# */ -/* Updated: 2019/05/08 11:17:06 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 12:32:23 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -54,3 +54,21 @@ void get_sym_opt_v(char **av, int *now, t_opt *opt, t_sym_key **k) (*k)->vect = vector; (*now)++; } + +void get_sym_stdin(t_opt *opt, t_sym_key **k) +{ + const char *fd_output; + + fd_output = NULL; + if (opt->data->fd_output != NULL) + fd_output = opt->data->fd_output; + if (*k == NULL) + *k = new_key(get_pass("enter your password: "), 0, 0, 0); + if (opt->data != NULL && opt->data->data == NULL) + { + clean_data(&(opt->data)); + opt->data = get_data(0, NULL); + } + opt->data->fd_output = fd_output; + opt->data->pass = &k; +} diff --git a/srcs/tools/lst_opt.c b/srcs/tools/lst_opt.c index a5a9443..535e1c1 100644 --- a/srcs/tools/lst_opt.c +++ b/srcs/tools/lst_opt.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/08 17:29:55 by cpieri #+# #+# */ -/* Updated: 2019/04/29 13:42:50 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 12:36:54 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,7 +21,7 @@ void print_lst(t_opt **lst) { ft_putstr("data to crypt: "); ft_memput(tmp->data->data, tmp->data->len_data); - ft_membits(&tmp->flags.b64_flags, 0, sizeof(uint32_t)); + ft_membits(&tmp->flags.sym_flags, 0, sizeof(uint64_t)); if (tmp->data->fd_output != NULL) { ft_putstr("fd to output: "); @@ -57,7 +57,8 @@ t_opt *new_opt(t_flags flags, t_data *data) new->next = NULL; new->data = data; new->flags = flags; - new->data->fd_output = NULL; + if (data->fd_output == NULL) + new->data->fd_output = NULL; return (new); } From fdb853aa414f9630bc05ccf56d65c7e5a1e82b29 Mon Sep 17 00:00:00 2001 From: Louise P Date: Wed, 8 May 2019 12:48:12 +0200 Subject: [PATCH 34/71] [Refactor]: Clean Headers Remove constant.h --- Makefile | 3 +-- includes/constant.h | 51 -------------------------------------------- includes/enum.h | 4 +--- includes/ft_ssl.h | 3 +-- includes/structure.h | 8 +------ srcs/parsing.c | 11 +++++++++- srcs/tools/usage.c | 19 +++++++++++++++-- 7 files changed, 31 insertions(+), 68 deletions(-) delete mode 100644 includes/constant.h diff --git a/Makefile b/Makefile index 552c287..c7aaaf6 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/03/15 11:20:25 by cpieri #+# #+# # -# Updated: 2019/05/08 10:34:05 by cpieri ### ########.fr # +# Updated: 2019/05/08 12:44:51 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -29,7 +29,6 @@ OBJ_PATH= obj DEPS = Makefile \ includes/ft_ssl.h \ includes/define.h \ - includes/constant.h \ includes/enum.h \ includes/functions.h \ includes/structure.h \ diff --git a/includes/constant.h b/includes/constant.h deleted file mode 100644 index 3150a69..0000000 --- a/includes/constant.h +++ /dev/null @@ -1,51 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* constant.h :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: cpieri +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2019/04/11 12:15:35 by cpieri #+# #+# */ -/* Updated: 2019/05/06 14:09:04 by cpieri ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#ifndef CONSTANT_H -# define CONSTANT_H - -static const t_parse g_all_cmd[] = -{ - {"md5", "MD5", e_hash, md5, hash_opts, printing_hash, NULL}, - {"sha256", "SHA256", e_hash, sha256, hash_opts, printing_hash, NULL}, - {"base64", "base64", e_cipher, base64, base64_opts, printing_base64, NULL}, - {"des", "des", e_cipher, NULL/*des*/, symmetric_opts, NULL/*printing_des*/, NULL}, - {NULL, NULL, 0, NULL, NULL, NULL, NULL}, -}; - -static const t_check_flags g_b64_flags[] = -{ - {'e', e_base64_encode}, - {'d', e_base64_decode}, - {'D', e_base64_decode}, - {'i', e_base64_inputf}, - {'o', e_base64_outputf}, - {0, 0}, -}; - -static const char *g_hash_cmd[] = -{ - "md5", - "sha256", - NULL -}; - -static const char *g_cipher_cmd[] = -{ - "base64", - "des", - "des-ecb", - "des-cbc", - NULL -}; - -#endif diff --git a/includes/enum.h b/includes/enum.h index db52500..7cf0ce8 100644 --- a/includes/enum.h +++ b/includes/enum.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 14:34:08 by cpieri #+# #+# */ -/* Updated: 2019/05/08 10:53:01 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 12:45:48 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,6 +19,4 @@ enum e_algo e_cipher, }; - - #endif diff --git a/includes/ft_ssl.h b/includes/ft_ssl.h index 393f03f..54a1eb9 100644 --- a/includes/ft_ssl.h +++ b/includes/ft_ssl.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/06 12:40:02 by cpieri #+# #+# */ -/* Updated: 2019/05/06 14:11:01 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 12:45:25 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,6 +22,5 @@ # include "enum.h" # include "structure.h" # include "functions.h" -# include "constant.h" #endif diff --git a/includes/structure.h b/includes/structure.h index 03870a2..f0fb6e0 100644 --- a/includes/structure.h +++ b/includes/structure.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:27:48 by cpieri #+# #+# */ -/* Updated: 2019/05/07 09:55:58 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 12:46:04 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,12 +24,6 @@ typedef struct s_data void *data_2_print; } t_data; -typedef struct s_check_flags -{ - const char c; - const int flag; -} t_check_flags; - typedef struct s_flags { int p; diff --git a/srcs/parsing.c b/srcs/parsing.c index 509556f..adf2e46 100644 --- a/srcs/parsing.c +++ b/srcs/parsing.c @@ -6,12 +6,21 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/24 17:29:57 by cpieri #+# #+# */ -/* Updated: 2019/04/11 15:10:03 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 12:44:15 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" +static const t_parse g_all_cmd[] = +{ + {"md5", "MD5", e_hash, md5, hash_opts, printing_hash, NULL}, + {"sha256", "SHA256", e_hash, sha256, hash_opts, printing_hash, NULL}, + {"base64", "base64", e_cipher, base64, base64_opts, printing_base64, NULL}, + {"des", "des", e_cipher, NULL/*des*/, symmetric_opts, NULL/*printing_des*/, NULL}, + {NULL, NULL, 0, NULL, NULL, NULL, NULL}, +}; + t_parse parsing(const int ac, char **av) { t_parse parse; diff --git a/srcs/tools/usage.c b/srcs/tools/usage.c index 4ede8ee..39c750e 100644 --- a/srcs/tools/usage.c +++ b/srcs/tools/usage.c @@ -6,12 +6,27 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/24 17:06:36 by cpieri #+# #+# */ -/* Updated: 2019/05/06 14:42:15 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 12:43:48 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" -#include + +static const char *g_hash_cmd[] = +{ + "md5", + "sha256", + NULL +}; + +static const char *g_cipher_cmd[] = +{ + "base64", + "des", + "des-ecb", + "des-cbc", + NULL +}; static void invalid_command(const char *command) { From 43f79d41b3bca3eba90013dd942e26bdfb799104 Mon Sep 17 00:00:00 2001 From: Louise P Date: Wed, 8 May 2019 13:00:48 +0200 Subject: [PATCH 35/71] [Refactor]: Cleaning Headers Move the define of functions in real app --- includes/base64/base64.h | 39 ++++++++++++++++++++++++---------- includes/functions.h | 18 +--------------- includes/hash/hash.h | 8 +++++-- includes/symmetric/symmetric.h | 4 +++- 4 files changed, 38 insertions(+), 31 deletions(-) diff --git a/includes/base64/base64.h b/includes/base64/base64.h index 594dcdd..fe2c311 100644 --- a/includes/base64/base64.h +++ b/includes/base64/base64.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/12 11:59:40 by cpieri #+# #+# */ -/* Updated: 2019/05/08 10:53:06 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 12:56:09 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,8 +14,9 @@ # define BASE64_H # include "../libft/include/libft.h" +# include "../structure.h" -enum e_base64_flags +enum e_base64_flags { e_base64_encode = 0x00000001, e_base64_decode = 0x00000010, @@ -23,15 +24,31 @@ enum e_base64_flags e_base64_outputf = 0x00001000, }; -typedef struct s_base64_encode +typedef struct s_base64_encode { - uint8_t n0; - uint8_t n1; - uint8_t n2; - uint8_t n3; -} t_base64_encode; - -uint8_t *base64_encode(uint8_t *msg, size_t len); -uint8_t *base64_decode(uint8_t *msg, size_t len); + uint8_t n0; + uint8_t n1; + uint8_t n2; + uint8_t n3; +} t_base64_encode; + +/* +** Encode/Decode Base64 +*/ +void *base64(void *opts, size_t len_opts); +uint8_t *base64_encode(uint8_t *msg, size_t len); +uint8_t *base64_decode(uint8_t *msg, size_t len); + +/* +** Functions for Print Base64 +*/ +void printing_base64(t_data *data, const char *hash_type, t_flags flags); + +/* +** Funtions for Parse opts Base64 +*/ +t_opt *base64_opts(const int ac, char **av, t_opt *opts, int now); +void get_b64_ed(t_data **data, t_flags *flags, char *fd, char c); +void get_b64_i(t_data **data, t_flags *flags, char *fd, int *now); #endif diff --git a/includes/functions.h b/includes/functions.h index 85cd41a..f0b5021 100644 --- a/includes/functions.h +++ b/includes/functions.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:44:05 by cpieri #+# #+# */ -/* Updated: 2019/05/07 14:14:10 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 12:56:57 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,22 +19,6 @@ t_parse parsing(const int ac, char **av); void dispatch(t_parse *parse); -/* -** Functions for Parsing -*/ -t_opt *hash_opts(const int ac, char **av, t_opt *opts, int now); -t_opt *base64_opts(const int ac, char **av, t_opt *opts, int now); -t_opt *symmetric_opts(const int ac, char **av, t_opt *opts, int now); -void get_b64_ed(t_data **data, t_flags *flags, char *fd, char c); -void get_b64_i(t_data **data, t_flags *flags, char *fd, int *now); -void *base64(void *opts, size_t len_opts); - -/* -** Functions for Printing -*/ -void printing_hash(t_data *data, const char *hash_type, t_flags flags); -void printing_base64(t_data *data, const char *hash_type, t_flags flags); - /* ** Functions for Open and Close */ diff --git a/includes/hash/hash.h b/includes/hash/hash.h index 367482a..ad1e0e4 100644 --- a/includes/hash/hash.h +++ b/includes/hash/hash.h @@ -6,14 +6,15 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/08 11:41:09 by cpieri #+# #+# */ -/* Updated: 2019/04/11 12:46:06 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 12:58:06 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef HASH_H # define HASH_H -# include "../libft/include/libft.h" +# include "../../libft/include/libft.h" +# include "../structure.h" typedef struct s_hash { @@ -30,4 +31,7 @@ typedef struct s_padding uint8_t *msg8; } t_padding; +t_opt *hash_opts(const int ac, char **av, t_opt *opts, int now); +void printing_hash(t_data *data, const char *hash_type, t_flags flags); + #endif diff --git a/includes/symmetric/symmetric.h b/includes/symmetric/symmetric.h index c2fbb81..4c8069b 100644 --- a/includes/symmetric/symmetric.h +++ b/includes/symmetric/symmetric.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 10:11:43 by cpieri #+# #+# */ -/* Updated: 2019/05/08 12:27:35 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 12:53:49 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -48,9 +48,11 @@ typedef struct s_sym_opt // void *cbc(void *msg, void *key, size_t msg_len, size_t key_len); // void *ecb(void *msg, void *key, size_t msg_len, size_t key_len); + /* ** Functions for get options in parsing */ +t_opt *symmetric_opts(const int ac, char **av, t_opt *opts, int now); void get_sym_opt_a(char **av, int *now, t_opt *opt, t_sym_key **k); void get_sym_opt_d(char **av, int *now, t_opt *opt, t_sym_key **k); void get_sym_opt_e(char **av, int *now, t_opt *opt, t_sym_key **k); From 8650b340edddfcabeb43ff1a6f8bbd00aaa72f76 Mon Sep 17 00:00:00 2001 From: Louise P Date: Wed, 8 May 2019 13:06:06 +0200 Subject: [PATCH 36/71] [Refactor]: Norminette ok --- includes/base64/base64.h | 5 +++-- includes/hash/hash.h | 5 +++-- includes/symmetric/des/des.h | 4 ++-- includes/symmetric/symmetric.h | 13 ++++--------- libft/srcs/hex2uint64t.c | 4 ++-- srcs/parsing.c | 4 ++-- 6 files changed, 16 insertions(+), 19 deletions(-) diff --git a/includes/base64/base64.h b/includes/base64/base64.h index fe2c311..9efca65 100644 --- a/includes/base64/base64.h +++ b/includes/base64/base64.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/12 11:59:40 by cpieri #+# #+# */ -/* Updated: 2019/05/08 12:56:09 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 13:03:15 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -42,7 +42,8 @@ uint8_t *base64_decode(uint8_t *msg, size_t len); /* ** Functions for Print Base64 */ -void printing_base64(t_data *data, const char *hash_type, t_flags flags); +void printing_base64(t_data *data, const char *hash_type, + t_flags flags); /* ** Funtions for Parse opts Base64 diff --git a/includes/hash/hash.h b/includes/hash/hash.h index ad1e0e4..004fd38 100644 --- a/includes/hash/hash.h +++ b/includes/hash/hash.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/08 11:41:09 by cpieri #+# #+# */ -/* Updated: 2019/05/08 12:58:06 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 13:03:30 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -32,6 +32,7 @@ typedef struct s_padding } t_padding; t_opt *hash_opts(const int ac, char **av, t_opt *opts, int now); -void printing_hash(t_data *data, const char *hash_type, t_flags flags); +void printing_hash(t_data *data, const char *hash_type, + t_flags flags); #endif diff --git a/includes/symmetric/des/des.h b/includes/symmetric/des/des.h index 5e5cef8..1f1c6a4 100644 --- a/includes/symmetric/des/des.h +++ b/includes/symmetric/des/des.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 10:13:19 by cpieri #+# #+# */ -/* Updated: 2019/05/06 10:13:48 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 13:04:38 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,4 +15,4 @@ void *des(void *msg, size_t len); -#endif \ No newline at end of file +#endif diff --git a/includes/symmetric/symmetric.h b/includes/symmetric/symmetric.h index 4c8069b..a68e3e6 100644 --- a/includes/symmetric/symmetric.h +++ b/includes/symmetric/symmetric.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 10:11:43 by cpieri #+# #+# */ -/* Updated: 2019/05/08 12:53:49 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 13:04:24 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,7 +15,6 @@ # include "../../libft/include/libft.h" # include "../structure.h" -// # include "./des/des.h" enum e_sym_opt { @@ -45,10 +44,6 @@ typedef struct s_sym_opt void (*sym_opt_fun)(char **, int *, t_opt *, t_sym_key **); } t_sym_opt; -// void *cbc(void *msg, void *key, size_t msg_len, size_t key_len); -// void *ecb(void *msg, void *key, size_t msg_len, size_t key_len); - - /* ** Functions for get options in parsing */ @@ -64,12 +59,12 @@ void get_sym_opt_p(char **av, int *now, t_opt *opt, t_sym_key **k); void get_sym_opt_v(char **av, int *now, t_opt *opt, t_sym_key **k); void get_sym_stdin(t_opt *opt, t_sym_key **k); - /* ** Functions for create and del struct symmetric key */ uint8_t *get_pass(const char *prompt); -t_sym_key *new_key(uint8_t *pass, uint64_t salt, uint64_t key, uint64_t vect); +t_sym_key *new_key(uint8_t *pass, uint64_t salt, uint64_t key, + uint64_t vect); void print_t_key(t_sym_key *to_print); void free_sym_key(t_sym_key **to_free); void free_sym_key(t_sym_key **to_free); @@ -79,4 +74,4 @@ void free_sym_key(t_sym_key **to_free); */ void sym_usage(const char *opt); -#endif \ No newline at end of file +#endif diff --git a/libft/srcs/hex2uint64t.c b/libft/srcs/hex2uint64t.c index 80bf4cd..fb0f394 100644 --- a/libft/srcs/hex2uint64t.c +++ b/libft/srcs/hex2uint64t.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/08 11:10:23 by cpieri #+# #+# */ -/* Updated: 2019/05/08 11:20:15 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 13:05:10 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,4 +31,4 @@ uint64_t hex2uint64t(char *hex) hex++; } return (val); -} \ No newline at end of file +} diff --git a/srcs/parsing.c b/srcs/parsing.c index adf2e46..71b8a19 100644 --- a/srcs/parsing.c +++ b/srcs/parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/24 17:29:57 by cpieri #+# #+# */ -/* Updated: 2019/05/08 12:44:15 by cpieri ### ########.fr */ +/* Updated: 2019/05/08 13:01:53 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,7 +17,7 @@ static const t_parse g_all_cmd[] = {"md5", "MD5", e_hash, md5, hash_opts, printing_hash, NULL}, {"sha256", "SHA256", e_hash, sha256, hash_opts, printing_hash, NULL}, {"base64", "base64", e_cipher, base64, base64_opts, printing_base64, NULL}, - {"des", "des", e_cipher, NULL/*des*/, symmetric_opts, NULL/*printing_des*/, NULL}, + {"des", "des", e_cipher, NULL, symmetric_opts, NULL, NULL}, {NULL, NULL, 0, NULL, NULL, NULL, NULL}, }; From 22577896964e85e76218131617fc0d709447c13a Mon Sep 17 00:00:00 2001 From: Louise P Date: Tue, 14 May 2019 11:52:57 +0200 Subject: [PATCH 37/71] [Debug]: Solve segv in parsing des --- srcs/symmetric/symmetric_parsing.c | 4 ++-- srcs/symmetric/symmetric_parsing_pt_f_2.c | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/srcs/symmetric/symmetric_parsing.c b/srcs/symmetric/symmetric_parsing.c index bfe9af9..43167d2 100644 --- a/srcs/symmetric/symmetric_parsing.c +++ b/srcs/symmetric/symmetric_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 12:04:37 by cpieri #+# #+# */ -/* Updated: 2019/05/08 12:37:11 by cpieri ### ########.fr */ +/* Updated: 2019/05/14 11:52:29 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -64,7 +64,7 @@ static t_opt *get_sym_args(const int ac, char **av, int now) get_sym_opt(av, &now, &opt, &k); now++; } - if (opt.data->data == NULL || k == NULL) + if (opt.data == NULL || k == NULL) get_sym_stdin(&opt, &k); return (new_opt(opt.flags, opt.data)); } diff --git a/srcs/symmetric/symmetric_parsing_pt_f_2.c b/srcs/symmetric/symmetric_parsing_pt_f_2.c index 29fdb40..c1f015c 100644 --- a/srcs/symmetric/symmetric_parsing_pt_f_2.c +++ b/srcs/symmetric/symmetric_parsing_pt_f_2.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/08 10:21:15 by cpieri #+# #+# */ -/* Updated: 2019/05/08 12:32:23 by cpieri ### ########.fr */ +/* Updated: 2019/05/14 11:47:49 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -60,6 +60,8 @@ void get_sym_stdin(t_opt *opt, t_sym_key **k) const char *fd_output; fd_output = NULL; + if (opt->data == NULL) + opt->data = new_data(); if (opt->data->fd_output != NULL) fd_output = opt->data->fd_output; if (*k == NULL) From 3aacccdc32eb1f8d63b6e1b08d4f45a58f36ff73 Mon Sep 17 00:00:00 2001 From: Louise P Date: Mon, 20 May 2019 12:33:12 +0200 Subject: [PATCH 38/71] [Feature]: Create PBKDF2 Status: in progress --- Makefile | 5 +- includes/functions.h | 47 +++++++------- includes/symmetric/des/des.h | 7 ++- includes/symmetric/pbkdf.h | 41 +++++++++++++ includes/symmetric/symmetric.h | 46 +++++--------- libft/Makefile | 4 +- libft/include/libft.h | 4 +- .../des_key.c => libft/srcs/ft_put32hexa.c | 35 +++++------ libft/srcs/ft_put64hexa.c | 31 ++++++++++ srcs/main.c | 6 +- srcs/parsing.c | 4 +- srcs/symmetric/des/des.c | 14 ++--- srcs/symmetric/pbkdf.c | 61 +++++++++++++++++++ srcs/symmetric/sym_key.c | 42 +++++-------- srcs/symmetric/symmetric_parsing.c | 10 +-- srcs/symmetric/symmetric_parsing_pt_f.c | 22 ++++--- srcs/symmetric/symmetric_parsing_pt_f_2.c | 14 ++--- srcs/tools/get_data.c | 16 ++++- srcs/tools/lst_opt.c | 3 +- 19 files changed, 268 insertions(+), 144 deletions(-) create mode 100644 includes/symmetric/pbkdf.h rename srcs/symmetric/des/des_key.c => libft/srcs/ft_put32hexa.c (52%) create mode 100644 libft/srcs/ft_put64hexa.c create mode 100644 srcs/symmetric/pbkdf.c diff --git a/Makefile b/Makefile index c7aaaf6..8880262 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/03/15 11:20:25 by cpieri #+# #+# # -# Updated: 2019/05/08 12:44:51 by cpieri ### ########.fr # +# Updated: 2019/05/20 10:34:50 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -37,6 +37,7 @@ DEPS = Makefile \ includes/hash/md5.h \ includes/base64/base64.h \ includes/symmetric/symmetric.h \ + includes/symmetric/des/des.h \ libft/libft.a SRC_NAME= main.c \ @@ -61,10 +62,12 @@ SRC_NAME= main.c \ base64/base64_help_parsing.c \ base64/base64_display.c \ symmetric/sym_key.c \ + symmetric/pbkdf.c \ symmetric/symmetric_usage.c \ symmetric/symmetric_parsing.c \ symmetric/symmetric_parsing_pt_f.c \ symmetric/symmetric_parsing_pt_f_2.c \ + symmetric/des/des.c \ OBJ_NAME= $(SRC_NAME:.c=.o) diff --git a/includes/functions.h b/includes/functions.h index f0b5021..0e48a54 100644 --- a/includes/functions.h +++ b/includes/functions.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:44:05 by cpieri #+# #+# */ -/* Updated: 2019/05/08 12:56:57 by cpieri ### ########.fr */ +/* Updated: 2019/05/20 10:38:53 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,43 +16,44 @@ /* ** Functions Dispatchers */ -t_parse parsing(const int ac, char **av); -void dispatch(t_parse *parse); +t_parse parsing(const int ac, char **av); +void dispatch(t_parse *parse); /* ** Functions for Open and Close */ -int open_fd(const char *file); -int open_write_fd(const char *file); -int close_fd(const int fd); -int reopen_fd(const int current_fd, const char *file); +int open_fd(const char *file); +int open_write_fd(const char *file); +int close_fd(const int fd); +int reopen_fd(const int current_fd, const char *file); /* ** Functions for get File, Data, or String */ -t_data *new_data(void); -t_data *get_data(const int fd, const char *fd_name); -t_data *get_file(const int fd, const char *fd_name); -t_data *get_string(char *s); +t_data *new_data(void); +t_data *get_data(const int fd, const char *fd_name); +t_data *get_file(const int fd, const char *fd_name); +t_data *get_string(char *s); +uint64_t get_random(void); /* ** Functions for Lst_opt */ -t_opt *new_opt_fd(t_flags flags, t_data *data, char *fd); -t_opt *new_opt(t_flags flags, t_data *data); -void add_to_end_lst(t_opt *new, t_opt **lst); -void print_lst(t_opt **lst); +t_opt *new_opt_fd(t_flags flags, t_data *data, char *fd); +t_opt *new_opt(t_flags flags, t_data *data); +void add_to_end_lst(t_opt *new, t_opt **lst); +void print_lst(t_opt **lst); /* ** Functions for Exit, Clean, Error */ -void exit_error(void); -void exit_msg(const char *msg); -void exit_error_msg(const char *msg); -void exit_error_free(void **to_free); -void print_error(const char *msg); -void print_usage(const int usage_int, const char *command); -void clean_prog(t_parse *parse); -void clean_data(t_data **data); +void exit_error(void); +void exit_msg(const char *msg); +void exit_error_msg(const char *msg); +void exit_error_free(void **to_free); +void print_error(const char *msg); +void print_usage(const int usage_int, const char *command); +void clean_prog(t_parse *parse); +void clean_data(t_data **data); #endif diff --git a/includes/symmetric/des/des.h b/includes/symmetric/des/des.h index 1f1c6a4..11ca4a7 100644 --- a/includes/symmetric/des/des.h +++ b/includes/symmetric/des/des.h @@ -6,13 +6,16 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 10:13:19 by cpieri #+# #+# */ -/* Updated: 2019/05/08 13:04:38 by cpieri ### ########.fr */ +/* Updated: 2019/05/20 08:09:22 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef DES_H # define DES_H -void *des(void *msg, size_t len); +# include "../../../libft/include/libft.h" +# include "../../structure.h" + +void *des(void *opt, size_t len_opt); #endif diff --git a/includes/symmetric/pbkdf.h b/includes/symmetric/pbkdf.h new file mode 100644 index 0000000..c3384cb --- /dev/null +++ b/includes/symmetric/pbkdf.h @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* pbkdf.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/05/20 10:11:40 by cpieri #+# #+# */ +/* Updated: 2019/05/20 12:29:34 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef PBKDF_H +# define PBKDF_H + +# include "../../libft/include/libft.h" +# include "../hash/sha256.h" +# include "../functions.h" +# include "../structure.h" + +typedef struct s_pbkdf +{ + uint8_t *pass; + uint64_t salt; + uint64_t key; + uint64_t vect; +} t_pbkdf; + +/* +** Functions for create and del struct symmetric key +*/ +uint8_t *get_pass(const char *prompt); +t_pbkdf *new_key(uint8_t *pass, uint64_t salt, uint64_t key, + uint64_t vect); +void print_pbkdf(t_pbkdf *to_print); +void free_pbkdf(t_pbkdf **to_free); +void free_vpbkdf(void **to_free); +uint64_t gen_key(uint8_t *pass, uint64_t salt); +void regen_key(t_pbkdf **k); + +#endif diff --git a/includes/symmetric/symmetric.h b/includes/symmetric/symmetric.h index a68e3e6..a274635 100644 --- a/includes/symmetric/symmetric.h +++ b/includes/symmetric/symmetric.h @@ -6,15 +6,15 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 10:11:43 by cpieri #+# #+# */ -/* Updated: 2019/05/08 13:04:24 by cpieri ### ########.fr */ +/* Updated: 2019/05/20 10:33:53 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef SYMMETRIC_H # define SYMMETRIC_H -# include "../../libft/include/libft.h" -# include "../structure.h" +# include "./des/des.h" +# include "./pbkdf.h" enum e_sym_opt { @@ -29,45 +29,27 @@ enum e_sym_opt e_sym_opt_v = 0x100000000 }; -typedef struct s_sym_key -{ - uint8_t *pass; - uint64_t salt; - uint64_t key; - uint64_t vect; -} t_sym_key; - typedef struct s_sym_opt { char opt; uint64_t flag; - void (*sym_opt_fun)(char **, int *, t_opt *, t_sym_key **); + void (*sym_opt_fun)(char **, int *, t_opt *, t_pbkdf **); } t_sym_opt; /* ** Functions for get options in parsing */ t_opt *symmetric_opts(const int ac, char **av, t_opt *opts, int now); -void get_sym_opt_a(char **av, int *now, t_opt *opt, t_sym_key **k); -void get_sym_opt_d(char **av, int *now, t_opt *opt, t_sym_key **k); -void get_sym_opt_e(char **av, int *now, t_opt *opt, t_sym_key **k); -void get_sym_opt_i(char **av, int *now, t_opt *opt, t_sym_key **k); -void get_sym_opt_o(char **av, int *now, t_opt *opt, t_sym_key **k); -void get_sym_opt_k(char **av, int *now, t_opt *opt, t_sym_key **k); -void get_sym_opt_s(char **av, int *now, t_opt *opt, t_sym_key **k); -void get_sym_opt_p(char **av, int *now, t_opt *opt, t_sym_key **k); -void get_sym_opt_v(char **av, int *now, t_opt *opt, t_sym_key **k); -void get_sym_stdin(t_opt *opt, t_sym_key **k); - -/* -** Functions for create and del struct symmetric key -*/ -uint8_t *get_pass(const char *prompt); -t_sym_key *new_key(uint8_t *pass, uint64_t salt, uint64_t key, - uint64_t vect); -void print_t_key(t_sym_key *to_print); -void free_sym_key(t_sym_key **to_free); -void free_sym_key(t_sym_key **to_free); +void get_sym_opt_a(char **av, int *now, t_opt *opt, t_pbkdf **k); +void get_sym_opt_d(char **av, int *now, t_opt *opt, t_pbkdf **k); +void get_sym_opt_e(char **av, int *now, t_opt *opt, t_pbkdf **k); +void get_sym_opt_i(char **av, int *now, t_opt *opt, t_pbkdf **k); +void get_sym_opt_o(char **av, int *now, t_opt *opt, t_pbkdf **k); +void get_sym_opt_k(char **av, int *now, t_opt *opt, t_pbkdf **k); +void get_sym_opt_s(char **av, int *now, t_opt *opt, t_pbkdf **k); +void get_sym_opt_p(char **av, int *now, t_opt *opt, t_pbkdf **k); +void get_sym_opt_v(char **av, int *now, t_opt *opt, t_pbkdf **k); +void get_sym_stdin(t_opt *opt, t_pbkdf **k); /* ** Usage diff --git a/libft/Makefile b/libft/Makefile index 2f2a43e..8bf2c3a 100644 --- a/libft/Makefile +++ b/libft/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2017/11/07 18:38:31 by tmilon #+# #+# # -# Updated: 2019/05/08 11:19:28 by cpieri ### ########.fr # +# Updated: 2019/05/20 11:10:45 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -59,6 +59,8 @@ SRCS = ft_atoi.c \ ft_putendl_fd.c \ ft_putnbr.c \ ft_puthexa.c \ + ft_put64hexa.c \ + ft_put32hexa.c \ ft_putnbr_fd.c \ ft_putstr.c \ ft_putstr_fd.c \ diff --git a/libft/include/libft.h b/libft/include/libft.h index 610bb39..5e3b7e8 100644 --- a/libft/include/libft.h +++ b/libft/include/libft.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/09 16:47:24 by cpieri #+# #+# */ -/* Updated: 2019/05/08 11:17:19 by cpieri ### ########.fr */ +/* Updated: 2019/05/20 11:09:28 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -117,6 +117,8 @@ void ft_putendl_fd(char const *s, int fd); void ft_putnbr(int n); void ft_putnbr_fd(int n, int fd); void ft_puthexa(int nb); +void ft_put64hexa(uint64_t nb); +void ft_put32hexa(uint32_t nb); void ft_putstr(char const *s); void ft_putstr_fd(char const *s, int fd); void ft_putbits(unsigned char octet); diff --git a/srcs/symmetric/des/des_key.c b/libft/srcs/ft_put32hexa.c similarity index 52% rename from srcs/symmetric/des/des_key.c rename to libft/srcs/ft_put32hexa.c index bbba67d..343b521 100644 --- a/srcs/symmetric/des/des_key.c +++ b/libft/srcs/ft_put32hexa.c @@ -1,30 +1,31 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* des_key.c :+: :+: :+: */ +/* ft_put32hexa.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2019/05/06 11:27:26 by cpieri #+# #+# */ -/* Updated: 2019/05/06 12:05:01 by cpieri ### ########.fr */ +/* Created: 2019/05/20 11:09:54 by cpieri #+# #+# */ +/* Updated: 2019/05/20 11:10:33 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ -#include "symmetric/des/des.h" -#include +#include "libft.h" -static const int g_parity_bit[64] = +static void put_32hexa(uint32_t nb) { - 57, 49, 41, 33, 25, 17, 09, 01, 58, 50, 42, 34, 26, 18, 10, 02, 59, 51, 43, - 35, 27, 19, 11, 03, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 07, 62, 54, - 46, 38, 30, 22, 14, 06, 61, 53, 45, 37, 29, 21, 13, 05, 28, 20, 12, 04 -}; + if (nb > 15) + put_32hexa(nb / 16); + nb %= 16; + if (nb < 10) + ft_putnbr(nb); + else + ft_putchar(nb + 'a' - 10); +} -uint64_t des_gen_key(void *pass, size_t len_pass) +void ft_put32hexa(uint32_t nb) { - uint64_t key; - - (void)len_pass; - printf("pass: %s", pass); - return (key); -} \ No newline at end of file + if (nb < 16) + ft_putchar('0'); + put_32hexa(nb); +} diff --git a/libft/srcs/ft_put64hexa.c b/libft/srcs/ft_put64hexa.c new file mode 100644 index 0000000..ab26cbc --- /dev/null +++ b/libft/srcs/ft_put64hexa.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_put64hexa.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/05/20 10:59:05 by cpieri #+# #+# */ +/* Updated: 2019/05/20 11:10:21 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static void put_64hexa(uint64_t nb) +{ + if (nb > 15) + put_64hexa(nb / 16); + nb %= 16; + if (nb < 10) + ft_putnbr(nb); + else + ft_putchar(nb + 'a' - 10); +} + +void ft_put64hexa(uint64_t nb) +{ + if (nb < 16) + ft_putchar('0'); + put_64hexa(nb); +} diff --git a/srcs/main.c b/srcs/main.c index 80e8fe3..c98381b 100644 --- a/srcs/main.c +++ b/srcs/main.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/24 17:05:16 by cpieri #+# #+# */ -/* Updated: 2019/05/06 15:14:27 by cpieri ### ########.fr */ +/* Updated: 2019/05/20 12:22:17 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,7 +19,7 @@ int main(int ac, char **av) if (ac < 2) print_usage(1, NULL); parse = parsing(ac, av); - dispatch(&parse); - clean_prog(&parse); + // dispatch(&parse); + // clean_prog(&parse); return (0); } diff --git a/srcs/parsing.c b/srcs/parsing.c index 71b8a19..c0b5628 100644 --- a/srcs/parsing.c +++ b/srcs/parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/24 17:29:57 by cpieri #+# #+# */ -/* Updated: 2019/05/08 13:01:53 by cpieri ### ########.fr */ +/* Updated: 2019/05/20 08:05:17 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,7 +17,7 @@ static const t_parse g_all_cmd[] = {"md5", "MD5", e_hash, md5, hash_opts, printing_hash, NULL}, {"sha256", "SHA256", e_hash, sha256, hash_opts, printing_hash, NULL}, {"base64", "base64", e_cipher, base64, base64_opts, printing_base64, NULL}, - {"des", "des", e_cipher, NULL, symmetric_opts, NULL, NULL}, + {"des", "des", e_cipher, des, symmetric_opts, NULL, NULL}, {NULL, NULL, 0, NULL, NULL, NULL, NULL}, }; diff --git a/srcs/symmetric/des/des.c b/srcs/symmetric/des/des.c index 5c4b5c0..1627800 100644 --- a/srcs/symmetric/des/des.c +++ b/srcs/symmetric/des/des.c @@ -6,21 +6,15 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 10:05:42 by cpieri #+# #+# */ -/* Updated: 2019/05/06 11:27:13 by cpieri ### ########.fr */ +/* Updated: 2019/05/20 08:09:40 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "symmetric/des/des.h" #include "symmetric/symmetric.h" -void *des(void *msg, size_t len) +void *des(void *opt, size_t len_opt) { - void *key; - size_t len_key; - - (void)len; - len_key = 0; - key = gen_random_key(&len_key); - ecb(msg, key, len, len_key); - return (msg); + (void)len_opt; + return (opt); } \ No newline at end of file diff --git a/srcs/symmetric/pbkdf.c b/srcs/symmetric/pbkdf.c new file mode 100644 index 0000000..1ab4584 --- /dev/null +++ b/srcs/symmetric/pbkdf.c @@ -0,0 +1,61 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* pbkdf.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/05/20 10:10:43 by cpieri #+# #+# */ +/* Updated: 2019/05/20 12:30:28 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "symmetric/pbkdf.h" + +uint64_t gen_key(uint8_t *pass, uint64_t salt) +{ + uint64_t new_key; + uint8_t *tmp_pass; + t_hash *shasum256_pass; + size_t len_pass; + int ismalloc; + + new_key = 0; + len_pass = ft_strlen((char *)pass); + tmp_pass = pass; + ismalloc = 0; + if (salt > 0) + { + tmp_pass = ft_memjoin(pass, &salt, len_pass, sizeof(uint64_t)); + len_pass += sizeof(uint64_t); + ismalloc = 1; + } + shasum256_pass = sha256(tmp_pass, len_pass); + new_key = (shasum256_pass->h[0]); + new_key = new_key << 32 | (shasum256_pass->h[1]); + ft_memdel((void**)&(shasum256_pass->h)); + ft_memdel((void**)&(shasum256_pass)); + if (ismalloc == 1) + ft_memdel((void**)&(tmp_pass)); + return (new_key); +} + +t_pbkdf *new_key(uint8_t *pass, uint64_t salt, uint64_t key, uint64_t vect) +{ + t_pbkdf *new; + + if (!(new = (t_pbkdf*)malloc(sizeof(t_pbkdf)))) + return (NULL); + new->pass = pass; + new->salt = (salt > 0) ? salt : get_random(); + new->key = (key > 0) ? key : gen_key(new->pass, new->salt); + new->vect = vect; + return (new); +} + +void regen_key(t_pbkdf **k) +{ + (*k)->key = 0; + if ((*k)->pass != NULL) + (*k)->key = gen_key((*k)->pass, (*k)->salt); +} diff --git a/srcs/symmetric/sym_key.c b/srcs/symmetric/sym_key.c index 4b269b3..6de7ba4 100644 --- a/srcs/symmetric/sym_key.c +++ b/srcs/symmetric/sym_key.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 13:53:56 by cpieri #+# #+# */ -/* Updated: 2019/05/07 16:15:52 by cpieri ### ########.fr */ +/* Updated: 2019/05/20 11:02:43 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -33,41 +33,27 @@ uint8_t *get_pass(const char *prompt) return ((uint8_t*)pass); } -t_sym_key *new_key(uint8_t *pass, uint64_t salt, uint64_t key, uint64_t vect) -{ - t_sym_key *new; - - if (!(new = (t_sym_key*)malloc(sizeof(t_sym_key)))) - return (NULL); - new->pass = pass; - new->salt = salt; - new->key = key; - new->vect = vect; - return (new); -} - -void print_t_key(t_sym_key *k) +void print_pbkdf(t_pbkdf *k) { + if (k == NULL) + { + ft_putendl("k is null"); + return ; + } ft_putstr("pass: "); ft_putendl((char*)k->pass); ft_putstr("salt: "); - ft_membits(&(k->salt), 0, sizeof(uint64_t)); - ft_putstr("salt hexa: "); - ft_puthexa(k->salt); + ft_put64hexa(k->salt); ft_putchar('\n'); ft_putstr("key: "); - ft_membits(&(k->key), 0, sizeof(uint64_t)); - ft_putstr("key hexa: "); - ft_puthexa(k->key); + ft_put64hexa(k->key); ft_putchar('\n'); ft_putstr("vect: "); - ft_membits(&(k->vect), 0, sizeof(uint64_t)); - ft_putstr("vect hexa: "); - ft_puthexa(k->vect); + ft_put64hexa(k->vect); ft_putchar('\n'); } -void free_sym_key(t_sym_key **to_free) +void free_pbkdf(t_pbkdf **to_free) { ft_memdel((void**)&((*to_free)->pass)); ft_memdel((void**)&((*to_free)->salt)); @@ -75,11 +61,11 @@ void free_sym_key(t_sym_key **to_free) ft_memdel((void**)(to_free)); } -void free_vsym_key(void **to_free) +void free_vpbkdf(void **to_free) { - t_sym_key **to_del; + t_pbkdf **to_del; - to_del = (t_sym_key**)to_free; + to_del = (t_pbkdf**)to_free; ft_memdel((void**)&((*to_del)->pass)); ft_memdel((void**)&((*to_del)->salt)); ft_memdel((void**)&((*to_del)->key)); diff --git a/srcs/symmetric/symmetric_parsing.c b/srcs/symmetric/symmetric_parsing.c index 43167d2..12b694b 100644 --- a/srcs/symmetric/symmetric_parsing.c +++ b/srcs/symmetric/symmetric_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 12:04:37 by cpieri #+# #+# */ -/* Updated: 2019/05/14 11:52:29 by cpieri ### ########.fr */ +/* Updated: 2019/05/20 12:27:44 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,7 +29,7 @@ static const t_sym_opt g_sym_opt[] = {0, 0, NULL} }; -static void get_sym_opt(char **av, int *now, t_opt *opt, t_sym_key **k) +static void get_sym_opt(char **av, int *now, t_opt *opt, t_pbkdf **k) { size_t len_now; size_t i; @@ -53,7 +53,7 @@ static void get_sym_opt(char **av, int *now, t_opt *opt, t_sym_key **k) static t_opt *get_sym_args(const int ac, char **av, int now) { t_opt opt; - t_sym_key *k; + t_pbkdf *k; (void)av; k = NULL; @@ -64,8 +64,7 @@ static t_opt *get_sym_args(const int ac, char **av, int now) get_sym_opt(av, &now, &opt, &k); now++; } - if (opt.data == NULL || k == NULL) - get_sym_stdin(&opt, &k); + get_sym_stdin(&opt, &k); return (new_opt(opt.flags, opt.data)); } @@ -75,5 +74,6 @@ t_opt *symmetric_opts(const int ac, char **av, t_opt *opts, int now) new = get_sym_args(ac, av, now); add_to_end_lst(new, &opts); + print_lst(&opts); return (opts); } diff --git a/srcs/symmetric/symmetric_parsing_pt_f.c b/srcs/symmetric/symmetric_parsing_pt_f.c index e81368e..44fdcd3 100644 --- a/srcs/symmetric/symmetric_parsing_pt_f.c +++ b/srcs/symmetric/symmetric_parsing_pt_f.c @@ -6,14 +6,14 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/07 09:34:06 by cpieri #+# #+# */ -/* Updated: 2019/05/08 11:22:27 by cpieri ### ########.fr */ +/* Updated: 2019/05/20 12:17:43 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "symmetric/symmetric.h" #include "ft_ssl.h" -void get_sym_opt_i(char **av, int *now, t_opt *opt, t_sym_key **k) +void get_sym_opt_i(char **av, int *now, t_opt *opt, t_pbkdf **k) { char *fd; const char *fd_output; @@ -34,7 +34,7 @@ void get_sym_opt_i(char **av, int *now, t_opt *opt, t_sym_key **k) (*now)++; } -void get_sym_opt_o(char **av, int *now, t_opt *opt, t_sym_key **k) +void get_sym_opt_o(char **av, int *now, t_opt *opt, t_pbkdf **k) { char *fd_output; @@ -48,7 +48,7 @@ void get_sym_opt_o(char **av, int *now, t_opt *opt, t_sym_key **k) (*now)++; } -void get_sym_opt_k(char **av, int *now, t_opt *opt, t_sym_key **k) +void get_sym_opt_k(char **av, int *now, t_opt *opt, t_pbkdf **k) { uint64_t key; @@ -65,25 +65,24 @@ void get_sym_opt_k(char **av, int *now, t_opt *opt, t_sym_key **k) (*now)++; } -void get_sym_opt_p(char **av, int *now, t_opt *opt, t_sym_key **k) +void get_sym_opt_p(char **av, int *now, t_opt *opt, t_pbkdf **k) { char *pass; if ((pass = av[*now + 1]) == NULL || pass[0] == '-') sym_usage(av[*now]); - if ((opt->flags.sym_flags & e_sym_opt_k) != e_sym_opt_k - && ft_strncmp(pass, "pass:", 5) == 0 && ft_strlen(pass) >= 6) + if ((opt->flags.sym_flags & e_sym_opt_k) != e_sym_opt_k) { opt->flags.sym_flags |= e_sym_opt_p; if (*k == NULL) - *k = new_key((uint8_t*)(pass + 5), 0, 0, 0); + *k = new_key((uint8_t*)pass, 0, 0, 0); else - (*k)->pass = (uint8_t*)(pass + 5); + (*k)->pass = (uint8_t*)pass; (*now)++; } } -void get_sym_opt_s(char **av, int *now, t_opt *opt, t_sym_key **k) +void get_sym_opt_s(char **av, int *now, t_opt *opt, t_pbkdf **k) { uint64_t salt; @@ -96,7 +95,10 @@ void get_sym_opt_s(char **av, int *now, t_opt *opt, t_sym_key **k) if (*k == NULL) *k = new_key(NULL, salt, 0, 0); else + { (*k)->salt = salt; + regen_key(k); + } (*now)++; } } diff --git a/srcs/symmetric/symmetric_parsing_pt_f_2.c b/srcs/symmetric/symmetric_parsing_pt_f_2.c index c1f015c..5e8d6fe 100644 --- a/srcs/symmetric/symmetric_parsing_pt_f_2.c +++ b/srcs/symmetric/symmetric_parsing_pt_f_2.c @@ -6,14 +6,14 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/08 10:21:15 by cpieri #+# #+# */ -/* Updated: 2019/05/14 11:47:49 by cpieri ### ########.fr */ +/* Updated: 2019/05/20 10:32:56 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "symmetric/symmetric.h" #include "ft_ssl.h" -void get_sym_opt_a(char **av, int *now, t_opt *opt, t_sym_key **k) +void get_sym_opt_a(char **av, int *now, t_opt *opt, t_pbkdf **k) { (void)av; (void)now; @@ -21,7 +21,7 @@ void get_sym_opt_a(char **av, int *now, t_opt *opt, t_sym_key **k) opt->flags.sym_flags |= e_sym_opt_a; } -void get_sym_opt_d(char **av, int *now, t_opt *opt, t_sym_key **k) +void get_sym_opt_d(char **av, int *now, t_opt *opt, t_pbkdf **k) { (void)k; (void)now; @@ -31,7 +31,7 @@ void get_sym_opt_d(char **av, int *now, t_opt *opt, t_sym_key **k) opt->flags.sym_flags |= e_sym_opt_d; } -void get_sym_opt_e(char **av, int *now, t_opt *opt, t_sym_key **k) +void get_sym_opt_e(char **av, int *now, t_opt *opt, t_pbkdf **k) { (void)k; (void)now; @@ -40,7 +40,7 @@ void get_sym_opt_e(char **av, int *now, t_opt *opt, t_sym_key **k) opt->flags.sym_flags |= e_sym_opt_e; } -void get_sym_opt_v(char **av, int *now, t_opt *opt, t_sym_key **k) +void get_sym_opt_v(char **av, int *now, t_opt *opt, t_pbkdf **k) { uint64_t vector; @@ -55,7 +55,7 @@ void get_sym_opt_v(char **av, int *now, t_opt *opt, t_sym_key **k) (*now)++; } -void get_sym_stdin(t_opt *opt, t_sym_key **k) +void get_sym_stdin(t_opt *opt, t_pbkdf **k) { const char *fd_output; @@ -72,5 +72,5 @@ void get_sym_stdin(t_opt *opt, t_sym_key **k) opt->data = get_data(0, NULL); } opt->data->fd_output = fd_output; - opt->data->pass = &k; + opt->data->pass = *k; } diff --git a/srcs/tools/get_data.c b/srcs/tools/get_data.c index a6429f8..61c07b8 100644 --- a/srcs/tools/get_data.c +++ b/srcs/tools/get_data.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/08 12:03:54 by cpieri #+# #+# */ -/* Updated: 2019/05/07 14:10:52 by cpieri ### ########.fr */ +/* Updated: 2019/05/20 12:26:59 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -88,3 +88,17 @@ t_data *get_data(const int fd, const char *fd_name) (ret->data == NULL) ? ft_memdel((void**)&(ret->data)) : NULL; return (ret); } + +uint64_t get_random(void) +{ + uint64_t random_value; + int dev_random_fd; + int nb_read; + + random_value = FAILURE; + dev_random_fd = open_fd("/dev/random"); + nb_read = read(dev_random_fd, &random_value, sizeof(uint64_t)); + if (nb_read == FAILURE) + print_error("get_random"); + return (random_value); +} diff --git a/srcs/tools/lst_opt.c b/srcs/tools/lst_opt.c index 535e1c1..b6955aa 100644 --- a/srcs/tools/lst_opt.c +++ b/srcs/tools/lst_opt.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/08 17:29:55 by cpieri #+# #+# */ -/* Updated: 2019/05/08 12:36:54 by cpieri ### ########.fr */ +/* Updated: 2019/05/20 12:15:32 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,6 +22,7 @@ void print_lst(t_opt **lst) ft_putstr("data to crypt: "); ft_memput(tmp->data->data, tmp->data->len_data); ft_membits(&tmp->flags.sym_flags, 0, sizeof(uint64_t)); + print_pbkdf((t_pbkdf*)(tmp->data->pass)); if (tmp->data->fd_output != NULL) { ft_putstr("fd to output: "); From 74fa6f484d5d243057293af79dd5b9ac604336ca Mon Sep 17 00:00:00 2001 From: Louise P Date: Mon, 20 May 2019 21:45:01 +0200 Subject: [PATCH 39/71] [Feature]: PBKDF2 in progress --- libft/Makefile | 3 ++- libft/include/libft.h | 3 ++- libft/srcs/ft_hex2char.c | 41 +++++++++++++++++++++++++++++++++ srcs/hash/sha256/sha256_utils.c | 4 +++- srcs/main.c | 6 ++--- srcs/symmetric/pbkdf.c | 3 ++- 6 files changed, 53 insertions(+), 7 deletions(-) create mode 100644 libft/srcs/ft_hex2char.c diff --git a/libft/Makefile b/libft/Makefile index 8bf2c3a..87d6554 100644 --- a/libft/Makefile +++ b/libft/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2017/11/07 18:38:31 by tmilon #+# #+# # -# Updated: 2019/05/20 11:10:45 by cpieri ### ########.fr # +# Updated: 2019/05/20 21:33:21 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -64,6 +64,7 @@ SRCS = ft_atoi.c \ ft_putnbr_fd.c \ ft_putstr.c \ ft_putstr_fd.c \ + ft_hex2char.c \ ft_strcat.c \ ft_strchr.c \ ft_strclr.c \ diff --git a/libft/include/libft.h b/libft/include/libft.h index 5e3b7e8..a70bebe 100644 --- a/libft/include/libft.h +++ b/libft/include/libft.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/09 16:47:24 by cpieri #+# #+# */ -/* Updated: 2019/05/20 11:09:28 by cpieri ### ########.fr */ +/* Updated: 2019/05/20 21:35:57 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,6 +28,7 @@ typedef struct s_list /* ** Functions for Strings */ +char *ft_hex2char(uint32_t hex, size_t nb_bytes); char *ft_strcat(char *s1, const char *s2); char *ft_strchr(const char *s, int c); char *ft_strchr(const char *s, int c); diff --git a/libft/srcs/ft_hex2char.c b/libft/srcs/ft_hex2char.c new file mode 100644 index 0000000..f6f728f --- /dev/null +++ b/libft/srcs/ft_hex2char.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_hex2char.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/05/20 21:21:06 by cpieri #+# #+# */ +/* Updated: 2019/05/20 21:43:55 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static void put_32hexa(char **s, size_t now, size_t len_s, uint32_t hex) +{ + if (hex > 15) + put_32hexa(s, (now + 1), len_s, (hex / 16)); + hex %= 16; + if (now < len_s) + { + if (hex < 10) + (*s)[now] = hex % 10 + '0'; + else + (*s)[now] = hex + 'a' - 10; + } +} + +char *ft_hex2char(uint32_t hex, size_t nb_bytes) +{ + char *s; + int now; + + if (!(s = (char*)ft_memalloc(sizeof(char) * (nb_bytes / 8)))) + return (NULL); + now = 0; + if (hex < 16) + s[now] = '0'; + put_32hexa(&s, now, (nb_bytes / 8), hex); + return (s); +} diff --git a/srcs/hash/sha256/sha256_utils.c b/srcs/hash/sha256/sha256_utils.c index a0ecd96..338480f 100644 --- a/srcs/hash/sha256/sha256_utils.c +++ b/srcs/hash/sha256/sha256_utils.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/08 15:40:50 by cpieri #+# #+# */ -/* Updated: 2019/04/11 11:57:33 by cpieri ### ########.fr */ +/* Updated: 2019/05/20 21:40:22 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,6 +23,8 @@ t_hash *set_hash2sha256(t_sha256 *e) ft_abort("Malloc Failed: sha256_utils.c:set_hash2sha256()"); ret->nb_word = 8; ret->h[0] = swap_uint32t(e->h0); + char *s = ft_hex2char(ret->h[0], 32); + ft_putendl(s); ret->h[1] = swap_uint32t(e->h1); ret->h[2] = swap_uint32t(e->h2); ret->h[3] = swap_uint32t(e->h3); diff --git a/srcs/main.c b/srcs/main.c index c98381b..c8e4bf2 100644 --- a/srcs/main.c +++ b/srcs/main.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/24 17:05:16 by cpieri #+# #+# */ -/* Updated: 2019/05/20 12:22:17 by cpieri ### ########.fr */ +/* Updated: 2019/05/20 20:33:16 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,7 +19,7 @@ int main(int ac, char **av) if (ac < 2) print_usage(1, NULL); parse = parsing(ac, av); - // dispatch(&parse); - // clean_prog(&parse); + dispatch(&parse); + clean_prog(&parse); return (0); } diff --git a/srcs/symmetric/pbkdf.c b/srcs/symmetric/pbkdf.c index 1ab4584..c54d70d 100644 --- a/srcs/symmetric/pbkdf.c +++ b/srcs/symmetric/pbkdf.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 10:10:43 by cpieri #+# #+# */ -/* Updated: 2019/05/20 12:30:28 by cpieri ### ########.fr */ +/* Updated: 2019/05/20 21:36:28 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,6 +18,7 @@ uint64_t gen_key(uint8_t *pass, uint64_t salt) uint8_t *tmp_pass; t_hash *shasum256_pass; size_t len_pass; + // int iter = 1000; int ismalloc; new_key = 0; From 59e092065f8aa2c17ae20c2a0e1a6d5f44e84b0f Mon Sep 17 00:00:00 2001 From: Louise P Date: Tue, 21 May 2019 09:34:04 +0200 Subject: [PATCH 40/71] [Debug]: hex2char* swap ifinite :( --- libft/srcs/ft_hex2char.c | 78 ++++++++++++++++++++++++++++++++-------- 1 file changed, 64 insertions(+), 14 deletions(-) diff --git a/libft/srcs/ft_hex2char.c b/libft/srcs/ft_hex2char.c index f6f728f..99b7d9e 100644 --- a/libft/srcs/ft_hex2char.c +++ b/libft/srcs/ft_hex2char.c @@ -6,36 +6,86 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 21:21:06 by cpieri #+# #+# */ -/* Updated: 2019/05/20 21:43:55 by cpieri ### ########.fr */ +/* Updated: 2019/05/21 09:30:45 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "libft.h" -static void put_32hexa(char **s, size_t now, size_t len_s, uint32_t hex) +static long calc_nb_len(uint32_t hex) { - if (hex > 15) - put_32hexa(s, (now + 1), len_s, (hex / 16)); - hex %= 16; - if (now < len_s) + long len; + + len = 0; + if (hex < 16) + ++len; + while (hex /= 16) + ++len; + ++len; + return (len); +} + +// static void put_32hexa(char **s, long len_s, uint32_t hex) +// { +// if (hex > 15) +// put_32hexa(s, (len_s - 1), (hex / 16)); +// hex %= 16; +// if (len_s >= 0) +// { +// if (hex < 10) +// (*s)[len_s] = hex % 10 + '0'; +// else +// (*s)[len_s] = hex + 'a' - 10; +// } +// } + +void swap_s(char **s, long len) +{ + long i; + char tmp; + + i = 0; + while (i < len) + { + tmp = (*s)[i]; + (*s)[i] = (*s)[len]; + (*s)[len] = tmp; + i++; + len--; + } +} + +static void put_32hexa(char **s, long len_s, uint32_t hex) +{ + uint32_t nb; + long i; + + nb = 0; + i = 0; + while (i <= len_s) { - if (hex < 10) - (*s)[now] = hex % 10 + '0'; + nb = hex % 16; + if (nb < 10) + (*s)[i] = (nb) % 10 + '0'; else - (*s)[now] = hex + 'a' - 10; + (*s)[i] = (nb) + 'a' - 10; + hex /= 16; + i++; } } char *ft_hex2char(uint32_t hex, size_t nb_bytes) { char *s; - int now; + long len; - if (!(s = (char*)ft_memalloc(sizeof(char) * (nb_bytes / 8)))) + (void)nb_bytes; + len = calc_nb_len(hex); + if (!(s = (char*)ft_memalloc(sizeof(char) * (len)))) return (NULL); - now = 0; if (hex < 16) - s[now] = '0'; - put_32hexa(&s, now, (nb_bytes / 8), hex); + s[0] = '0'; + put_32hexa(&s, len - 1, hex); + // swap_s(&s, len - 1); return (s); } From c7e93f146d7b93a95272b72a420d70cca0c935dc Mon Sep 17 00:00:00 2001 From: Louise P Date: Tue, 21 May 2019 19:00:57 +0200 Subject: [PATCH 41/71] [Feature]: PBKDF2 hex2char* OUIIIII ca marche :) mais pas PBKDF2 --- libft/srcs/ft_hex2char.c | 40 +++++++-------------------------- srcs/hash/sha256/sha256_utils.c | 4 +--- 2 files changed, 9 insertions(+), 35 deletions(-) diff --git a/libft/srcs/ft_hex2char.c b/libft/srcs/ft_hex2char.c index 99b7d9e..b5cc4d5 100644 --- a/libft/srcs/ft_hex2char.c +++ b/libft/srcs/ft_hex2char.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 21:21:06 by cpieri #+# #+# */ -/* Updated: 2019/05/21 09:30:45 by cpieri ### ########.fr */ +/* Updated: 2019/05/21 18:54:30 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,40 +25,11 @@ static long calc_nb_len(uint32_t hex) return (len); } -// static void put_32hexa(char **s, long len_s, uint32_t hex) -// { -// if (hex > 15) -// put_32hexa(s, (len_s - 1), (hex / 16)); -// hex %= 16; -// if (len_s >= 0) -// { -// if (hex < 10) -// (*s)[len_s] = hex % 10 + '0'; -// else -// (*s)[len_s] = hex + 'a' - 10; -// } -// } - -void swap_s(char **s, long len) -{ - long i; - char tmp; - - i = 0; - while (i < len) - { - tmp = (*s)[i]; - (*s)[i] = (*s)[len]; - (*s)[len] = tmp; - i++; - len--; - } -} - static void put_32hexa(char **s, long len_s, uint32_t hex) { uint32_t nb; long i; + char tmp; nb = 0; i = 0; @@ -69,6 +40,12 @@ static void put_32hexa(char **s, long len_s, uint32_t hex) (*s)[i] = (nb) % 10 + '0'; else (*s)[i] = (nb) + 'a' - 10; + if ((i % 2) != 0) + { + tmp = (*s)[i]; + (*s)[i] = (*s)[i - 1]; + (*s)[i - 1] = tmp; + } hex /= 16; i++; } @@ -86,6 +63,5 @@ char *ft_hex2char(uint32_t hex, size_t nb_bytes) if (hex < 16) s[0] = '0'; put_32hexa(&s, len - 1, hex); - // swap_s(&s, len - 1); return (s); } diff --git a/srcs/hash/sha256/sha256_utils.c b/srcs/hash/sha256/sha256_utils.c index 338480f..b2599d9 100644 --- a/srcs/hash/sha256/sha256_utils.c +++ b/srcs/hash/sha256/sha256_utils.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/08 15:40:50 by cpieri #+# #+# */ -/* Updated: 2019/05/20 21:40:22 by cpieri ### ########.fr */ +/* Updated: 2019/05/21 18:55:16 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,8 +23,6 @@ t_hash *set_hash2sha256(t_sha256 *e) ft_abort("Malloc Failed: sha256_utils.c:set_hash2sha256()"); ret->nb_word = 8; ret->h[0] = swap_uint32t(e->h0); - char *s = ft_hex2char(ret->h[0], 32); - ft_putendl(s); ret->h[1] = swap_uint32t(e->h1); ret->h[2] = swap_uint32t(e->h2); ret->h[3] = swap_uint32t(e->h3); From 83fa65cc9e8835f7dffc5f12618c5cb2a6efa5a7 Mon Sep 17 00:00:00 2001 From: Louise P Date: Wed, 22 May 2019 09:50:20 +0200 Subject: [PATCH 42/71] [Refactor]: Change md5 and sha256 - Create new function for convert t_hash in char* - Md5 and Sha256 return char* --- Makefile | 3 ++- includes/hash/hash.h | 3 ++- includes/hash/md5.h | 4 ++-- includes/hash/sha256.h | 4 ++-- libft/include/libft.h | 4 ++-- libft/srcs/ft_hex2char.c | 11 +++++------ srcs/dispatch.c | 4 ++-- srcs/hash/display_hash.c | 22 ++------------------- srcs/hash/hash_tools.c | 34 +++++++++++++++++++++++++++++++++ srcs/hash/md5/md5.c | 8 ++++---- srcs/hash/md5/md5_utils.c | 10 ++++++---- srcs/hash/sha256/sha256.c | 8 ++++---- srcs/hash/sha256/sha256_utils.c | 9 ++++++--- srcs/tools/clean.c | 4 +--- 14 files changed, 74 insertions(+), 54 deletions(-) create mode 100644 srcs/hash/hash_tools.c diff --git a/Makefile b/Makefile index 8880262..c8a49a9 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/03/15 11:20:25 by cpieri #+# #+# # -# Updated: 2019/05/20 10:34:50 by cpieri ### ########.fr # +# Updated: 2019/05/22 09:27:54 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -51,6 +51,7 @@ SRC_NAME= main.c \ tools/lst_opt.c \ hash/hash_parsing.c \ hash/display_hash.c \ + hash/hash_tools.c \ hash/sha256/sha256.c \ hash/sha256/sha256_utils.c \ hash/md5/md5_utils.c \ diff --git a/includes/hash/hash.h b/includes/hash/hash.h index 004fd38..c985d18 100644 --- a/includes/hash/hash.h +++ b/includes/hash/hash.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/08 11:41:09 by cpieri #+# #+# */ -/* Updated: 2019/05/08 13:03:30 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 09:27:32 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -32,6 +32,7 @@ typedef struct s_padding } t_padding; t_opt *hash_opts(const int ac, char **av, t_opt *opts, int now); +char *hex2sum(uint32_t *h, size_t nb_h); void printing_hash(t_data *data, const char *hash_type, t_flags flags); diff --git a/includes/hash/md5.h b/includes/hash/md5.h index 9c263b8..e40f0a7 100644 --- a/includes/hash/md5.h +++ b/includes/hash/md5.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/06 12:16:22 by cpieri #+# #+# */ -/* Updated: 2019/04/26 11:34:58 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 09:41:05 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -44,7 +44,7 @@ t_md5_utils func_f(uint32_t b, uint32_t c, uint32_t d, int i); t_md5_utils func_g(uint32_t b, uint32_t c, uint32_t d, int i); t_md5_utils func_h(uint32_t b, uint32_t c, uint32_t d, int i); t_md5_utils func_i(uint32_t b, uint32_t c, uint32_t d, int i); -t_hash *set_hash2md5(t_md5 *e); +char *set_hash2md5(t_md5 *e); void *md5(void *data, size_t len_data); #endif diff --git a/includes/hash/sha256.h b/includes/hash/sha256.h index 9af5dec..da8b273 100644 --- a/includes/hash/sha256.h +++ b/includes/hash/sha256.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/08 13:15:42 by cpieri #+# #+# */ -/* Updated: 2019/04/26 11:34:56 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 09:28:57 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -57,6 +57,6 @@ typedef struct s_sha256 } t_sha256; void *sha256(void *data, size_t len_data); -t_hash *set_hash2sha256(t_sha256 *e); +char *set_hash2sha256(t_sha256 *e); #endif diff --git a/libft/include/libft.h b/libft/include/libft.h index a70bebe..41b9531 100644 --- a/libft/include/libft.h +++ b/libft/include/libft.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/09 16:47:24 by cpieri #+# #+# */ -/* Updated: 2019/05/20 21:35:57 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 09:15:09 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,7 +28,7 @@ typedef struct s_list /* ** Functions for Strings */ -char *ft_hex2char(uint32_t hex, size_t nb_bytes); +char *ft_hex2char(uint32_t hex); char *ft_strcat(char *s1, const char *s2); char *ft_strchr(const char *s, int c); char *ft_strchr(const char *s, int c); diff --git a/libft/srcs/ft_hex2char.c b/libft/srcs/ft_hex2char.c index b5cc4d5..797b212 100644 --- a/libft/srcs/ft_hex2char.c +++ b/libft/srcs/ft_hex2char.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 21:21:06 by cpieri #+# #+# */ -/* Updated: 2019/05/21 18:54:30 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 09:46:53 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,7 +25,7 @@ static long calc_nb_len(uint32_t hex) return (len); } -static void put_32hexa(char **s, long len_s, uint32_t hex) +static void conv_32hexa(char **s, long len_s, uint32_t hex) { uint32_t nb; long i; @@ -51,17 +51,16 @@ static void put_32hexa(char **s, long len_s, uint32_t hex) } } -char *ft_hex2char(uint32_t hex, size_t nb_bytes) +char *ft_hex2char(uint32_t hex) { char *s; long len; - (void)nb_bytes; len = calc_nb_len(hex); - if (!(s = (char*)ft_memalloc(sizeof(char) * (len)))) + if (!(s = (char*)ft_memalloc(sizeof(char) * (len + 1)))) return (NULL); if (hex < 16) s[0] = '0'; - put_32hexa(&s, len - 1, hex); + conv_32hexa(&s, len - 1, hex); return (s); } diff --git a/srcs/dispatch.c b/srcs/dispatch.c index 097ef88..38ddb7f 100644 --- a/srcs/dispatch.c +++ b/srcs/dispatch.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/12 13:01:28 by cpieri #+# #+# */ -/* Updated: 2019/04/29 14:21:31 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 09:42:03 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,7 +20,7 @@ void dispatch(t_parse *parse) while (lst != NULL) { if (parse->is_ciphash == e_hash) - lst->data->data_2_print = (t_hash*)parse->func(lst->data->data, + lst->data->data_2_print = parse->func(lst->data->data, lst->data->len_data); else if (parse->is_ciphash == e_cipher) lst->data->data_2_print = parse->func(lst, 0); diff --git a/srcs/hash/display_hash.c b/srcs/hash/display_hash.c index 2872ac9..033f15e 100644 --- a/srcs/hash/display_hash.c +++ b/srcs/hash/display_hash.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/06 12:14:10 by cpieri #+# #+# */ -/* Updated: 2019/04/29 14:08:50 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 09:33:52 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,27 +24,9 @@ static void print_name(const char *fd_name, t_flags flags) ft_putstr(fd_name); } -static void print_hash(t_hash *f_hash) -{ - size_t y; - uint8_t *p; - int i; - - y = -1; - while (++y < f_hash->nb_word) - { - i = -1; - p = (uint8_t*)&f_hash->h[y]; - while (++i < 4) - ft_puthexa(p[i]); - } -} - void printing_hash(t_data *data, const char *hash_type, t_flags flags) { - t_hash *f_hash; - f_hash = (t_hash*)data->data_2_print; if (flags.r == 0 && flags.q == 0 && data->fd_name != NULL) { ft_putstr(hash_type); @@ -54,7 +36,7 @@ void printing_hash(t_data *data, const char *hash_type, t_flags flags) } else if (flags.p == 1) ft_putstr(data->data); - print_hash(f_hash); + ft_putstr((char*)data->data_2_print); if (flags.r == 1) { ft_putchar(' '); diff --git a/srcs/hash/hash_tools.c b/srcs/hash/hash_tools.c new file mode 100644 index 0000000..b95caad --- /dev/null +++ b/srcs/hash/hash_tools.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* hash_tools.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/05/22 09:12:05 by cpieri #+# #+# */ +/* Updated: 2019/05/22 09:45:47 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "hash/hash.h" +#include + +char *hex2sum(uint32_t *h, size_t nb_h) +{ + char *sum; + char *tmp; + size_t i; + + i = -1; + if (!(sum = (char*)ft_memalloc(sizeof(char) * ((nb_h * 8) + 1)))) + return (NULL); + while (++i < nb_h) + { + if ((tmp = ft_hex2char(h[i])) == NULL) + break ; + ft_strncpy((sum + ft_strlen(sum)), tmp, ft_strlen(tmp)); + ft_memdel((void**)&tmp); + } + ft_memdel((void**)&h); + return (sum); +} \ No newline at end of file diff --git a/srcs/hash/md5/md5.c b/srcs/hash/md5/md5.c index 921cfea..d379654 100644 --- a/srcs/hash/md5/md5.c +++ b/srcs/hash/md5/md5.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/25 15:18:34 by cpieri #+# #+# */ -/* Updated: 2019/04/26 11:34:23 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 09:38:34 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -83,7 +83,7 @@ static void calc_sum(t_md5 *e) void *md5(void *data, size_t len_data) { t_md5 e; - t_hash *f_hash; + char *sum; e = (t_md5){.h0 = MD5_H0, .h1 = MD5_H1, .h2 = MD5_H2, .h3 = MD5_H3}; padding_md5(&(e.p), data, len_data); @@ -101,6 +101,6 @@ void *md5(void *data, size_t len_data) e.h3 += e.d; e.p.offest += 64; } - f_hash = set_hash2md5(&e); - return (f_hash); + sum = set_hash2md5(&e); + return (sum); } diff --git a/srcs/hash/md5/md5_utils.c b/srcs/hash/md5/md5_utils.c index 0616ab1..66bc511 100644 --- a/srcs/hash/md5/md5_utils.c +++ b/srcs/hash/md5/md5_utils.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/13 13:34:11 by cpieri #+# #+# */ -/* Updated: 2019/04/11 11:58:15 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 09:40:55 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -48,9 +48,10 @@ t_md5_utils func_i(uint32_t b, uint32_t c, uint32_t d, int i) return (ret); } -t_hash *set_hash2md5(t_md5 *e) +char *set_hash2md5(t_md5 *e) { t_hash *ret; + char *sum; ft_memdel((void**)&e->p.msg8); if (!(ret = (t_hash*)malloc(sizeof(t_hash)))) @@ -62,6 +63,7 @@ t_hash *set_hash2md5(t_md5 *e) ret->h[1] = e->h1; ret->h[2] = e->h2; ret->h[3] = e->h3; - ft_memdel((void**)&(e->p.msg8)); - return (ret); + sum = hex2sum(ret->h, ret->nb_word); + ft_memdel((void**)&ret); + return (sum); } diff --git a/srcs/hash/sha256/sha256.c b/srcs/hash/sha256/sha256.c index 7b9d080..b56f76d 100644 --- a/srcs/hash/sha256/sha256.c +++ b/srcs/hash/sha256/sha256.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/18 10:47:43 by cpieri #+# #+# */ -/* Updated: 2019/04/26 11:34:43 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 09:25:56 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -122,7 +122,7 @@ static void calc_sha256(t_sha256 *t) void *sha256(void *data, size_t len_data) { - t_hash *f_hash; + char *sum; t_sha256 t; t = (t_sha256){.h0 = SHA256_H0, .h1 = SHA256_H1, .h2 = SHA256_H2, @@ -144,6 +144,6 @@ void *sha256(void *data, size_t len_data) ft_memdel((void**)&(t.w)); t.p.offest += 64; } - f_hash = set_hash2sha256(&t); - return (f_hash); + sum = set_hash2sha256(&t); + return (sum); } diff --git a/srcs/hash/sha256/sha256_utils.c b/srcs/hash/sha256/sha256_utils.c index b2599d9..28fb9c1 100644 --- a/srcs/hash/sha256/sha256_utils.c +++ b/srcs/hash/sha256/sha256_utils.c @@ -6,15 +6,16 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/08 15:40:50 by cpieri #+# #+# */ -/* Updated: 2019/05/21 18:55:16 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 09:25:33 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "hash/sha256.h" -t_hash *set_hash2sha256(t_sha256 *e) +char *set_hash2sha256(t_sha256 *e) { t_hash *ret; + char *sum; ft_memdel((void**)&(e->p.msg8)); if (!(ret = (t_hash*)malloc(sizeof(t_hash)))) @@ -30,5 +31,7 @@ t_hash *set_hash2sha256(t_sha256 *e) ret->h[5] = swap_uint32t(e->h5); ret->h[6] = swap_uint32t(e->h6); ret->h[7] = swap_uint32t(e->h7); - return (ret); + sum = hex2sum(ret->h, ret->nb_word); + ft_memdel((void**)&ret); + return (sum); } diff --git a/srcs/tools/clean.c b/srcs/tools/clean.c index 4324bbc..784531e 100644 --- a/srcs/tools/clean.c +++ b/srcs/tools/clean.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/15 12:07:14 by cpieri #+# #+# */ -/* Updated: 2019/05/06 15:15:04 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 09:32:00 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -34,8 +34,6 @@ void clean_prog(t_parse *parse) { if (lst->data->mall == 1) ft_memdel((void**)&(lst->data->data)); - if (parse->is_ciphash == e_hash) - ft_memdel((void**)&(((t_hash*)(lst->data->data_2_print))->h)); ft_memdel((void**)&(lst->data->data_2_print)); ft_memdel((void**)&(lst->data)); next = lst->next; From 9d7eca19ef684b9117cc2141681afaebc71c068b Mon Sep 17 00:00:00 2001 From: Louise P Date: Wed, 22 May 2019 10:39:04 +0200 Subject: [PATCH 43/71] [Debug + Test]: Check hash --- libft/srcs/ft_hex2char.c | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/libft/srcs/ft_hex2char.c b/libft/srcs/ft_hex2char.c index 797b212..1b7d065 100644 --- a/libft/srcs/ft_hex2char.c +++ b/libft/srcs/ft_hex2char.c @@ -6,25 +6,12 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 21:21:06 by cpieri #+# #+# */ -/* Updated: 2019/05/22 09:46:53 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 10:36:33 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "libft.h" -static long calc_nb_len(uint32_t hex) -{ - long len; - - len = 0; - if (hex < 16) - ++len; - while (hex /= 16) - ++len; - ++len; - return (len); -} - static void conv_32hexa(char **s, long len_s, uint32_t hex) { uint32_t nb; @@ -33,7 +20,7 @@ static void conv_32hexa(char **s, long len_s, uint32_t hex) nb = 0; i = 0; - while (i <= len_s) + while (i < len_s) { nb = hex % 16; if (nb < 10) @@ -54,13 +41,11 @@ static void conv_32hexa(char **s, long len_s, uint32_t hex) char *ft_hex2char(uint32_t hex) { char *s; - long len; - len = calc_nb_len(hex); - if (!(s = (char*)ft_memalloc(sizeof(char) * (len + 1)))) + if (!(s = (char*)ft_memalloc(sizeof(char) * (8 + 1)))) return (NULL); if (hex < 16) s[0] = '0'; - conv_32hexa(&s, len - 1, hex); + conv_32hexa(&s, 8, hex); return (s); } From 5420e9014c9fed5cda776fe1b443f4a0f31b2f21 Mon Sep 17 00:00:00 2001 From: Louise P Date: Wed, 22 May 2019 13:53:49 +0200 Subject: [PATCH 44/71] [Feature]: PBKDF2 - hashed password 1000x but it's not the same openssl --- includes/hash/md5.h | 4 ++-- includes/hash/sha256.h | 4 ++-- includes/symmetric/pbkdf.h | 3 ++- srcs/dispatch.c | 4 ++-- srcs/hash/display_hash.c | 6 ++++-- srcs/hash/hash_tools.c | 5 ++--- srcs/hash/md5/md5.c | 8 +++++--- srcs/hash/md5/md5_utils.c | 9 +++------ srcs/hash/sha256/sha256.c | 6 +++--- srcs/hash/sha256/sha256_utils.c | 9 +++------ srcs/symmetric/pbkdf.c | 23 ++++++++++++++++------- srcs/tools/clean.c | 2 +- 12 files changed, 45 insertions(+), 38 deletions(-) diff --git a/includes/hash/md5.h b/includes/hash/md5.h index e40f0a7..a0608f6 100644 --- a/includes/hash/md5.h +++ b/includes/hash/md5.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/06 12:16:22 by cpieri #+# #+# */ -/* Updated: 2019/05/22 09:41:05 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 10:56:42 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -44,7 +44,7 @@ t_md5_utils func_f(uint32_t b, uint32_t c, uint32_t d, int i); t_md5_utils func_g(uint32_t b, uint32_t c, uint32_t d, int i); t_md5_utils func_h(uint32_t b, uint32_t c, uint32_t d, int i); t_md5_utils func_i(uint32_t b, uint32_t c, uint32_t d, int i); -char *set_hash2md5(t_md5 *e); +t_hash *set_hash2md5(t_md5 *e); void *md5(void *data, size_t len_data); #endif diff --git a/includes/hash/sha256.h b/includes/hash/sha256.h index da8b273..e61d15f 100644 --- a/includes/hash/sha256.h +++ b/includes/hash/sha256.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/08 13:15:42 by cpieri #+# #+# */ -/* Updated: 2019/05/22 09:28:57 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 10:56:46 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -57,6 +57,6 @@ typedef struct s_sha256 } t_sha256; void *sha256(void *data, size_t len_data); -char *set_hash2sha256(t_sha256 *e); +t_hash *set_hash2sha256(t_sha256 *e); #endif diff --git a/includes/symmetric/pbkdf.h b/includes/symmetric/pbkdf.h index c3384cb..8ec5565 100644 --- a/includes/symmetric/pbkdf.h +++ b/includes/symmetric/pbkdf.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 10:11:40 by cpieri #+# #+# */ -/* Updated: 2019/05/20 12:29:34 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 10:50:10 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,7 @@ # include "../../libft/include/libft.h" # include "../hash/sha256.h" +# include "../hash/md5.h" # include "../functions.h" # include "../structure.h" diff --git a/srcs/dispatch.c b/srcs/dispatch.c index 38ddb7f..a6a4013 100644 --- a/srcs/dispatch.c +++ b/srcs/dispatch.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/12 13:01:28 by cpieri #+# #+# */ -/* Updated: 2019/05/22 09:42:03 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 10:52:46 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,7 +20,7 @@ void dispatch(t_parse *parse) while (lst != NULL) { if (parse->is_ciphash == e_hash) - lst->data->data_2_print = parse->func(lst->data->data, + lst->data->data_2_print = (t_hash*)parse->func(lst->data->data, lst->data->len_data); else if (parse->is_ciphash == e_cipher) lst->data->data_2_print = parse->func(lst, 0); diff --git a/srcs/hash/display_hash.c b/srcs/hash/display_hash.c index 033f15e..65489fa 100644 --- a/srcs/hash/display_hash.c +++ b/srcs/hash/display_hash.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/06 12:14:10 by cpieri #+# #+# */ -/* Updated: 2019/05/22 09:33:52 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 10:56:17 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -26,7 +26,9 @@ static void print_name(const char *fd_name, t_flags flags) void printing_hash(t_data *data, const char *hash_type, t_flags flags) { + t_hash *f_hash; + f_hash = (t_hash*)data->data_2_print; if (flags.r == 0 && flags.q == 0 && data->fd_name != NULL) { ft_putstr(hash_type); @@ -36,7 +38,7 @@ void printing_hash(t_data *data, const char *hash_type, t_flags flags) } else if (flags.p == 1) ft_putstr(data->data); - ft_putstr((char*)data->data_2_print); + ft_putstr(hex2sum(f_hash->h, f_hash->nb_word)); if (flags.r == 1) { ft_putchar(' '); diff --git a/srcs/hash/hash_tools.c b/srcs/hash/hash_tools.c index b95caad..317e8a4 100644 --- a/srcs/hash/hash_tools.c +++ b/srcs/hash/hash_tools.c @@ -6,12 +6,11 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/22 09:12:05 by cpieri #+# #+# */ -/* Updated: 2019/05/22 09:45:47 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 10:41:33 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "hash/hash.h" -#include char *hex2sum(uint32_t *h, size_t nb_h) { @@ -31,4 +30,4 @@ char *hex2sum(uint32_t *h, size_t nb_h) } ft_memdel((void**)&h); return (sum); -} \ No newline at end of file +} diff --git a/srcs/hash/md5/md5.c b/srcs/hash/md5/md5.c index d379654..55f7d0b 100644 --- a/srcs/hash/md5/md5.c +++ b/srcs/hash/md5/md5.c @@ -6,11 +6,12 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/25 15:18:34 by cpieri #+# #+# */ -/* Updated: 2019/05/22 09:38:34 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 11:37:58 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "hash/md5.h" +#include static const uint32_t g_r_md5[64] = { 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, @@ -43,8 +44,9 @@ static void padding_md5(t_padding *p, char *data, size_t len) p->new_len = (448 - (p->nb_bits + 1)) % 512; p->new_len += p->nb_bits + 64 + 1; p->new_len /= 8; + printf("Debug: md5 new len: %zu\n", p->new_len); if (!(p->msg8 = (uint8_t*)ft_memalloc(sizeof(uint8_t) * p->new_len))) - ft_abort("malloc failed"); + ft_abort("ft_ssl: md5: malloc failed"); ft_memcpy(p->msg8, data, len); p->msg8[len] |= 1 << 7; ft_memcpy(p->msg8 + p->new_len - 8, &p->nb_bits, 8); @@ -83,7 +85,7 @@ static void calc_sum(t_md5 *e) void *md5(void *data, size_t len_data) { t_md5 e; - char *sum; + t_hash *sum; e = (t_md5){.h0 = MD5_H0, .h1 = MD5_H1, .h2 = MD5_H2, .h3 = MD5_H3}; padding_md5(&(e.p), data, len_data); diff --git a/srcs/hash/md5/md5_utils.c b/srcs/hash/md5/md5_utils.c index 66bc511..1e55658 100644 --- a/srcs/hash/md5/md5_utils.c +++ b/srcs/hash/md5/md5_utils.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/13 13:34:11 by cpieri #+# #+# */ -/* Updated: 2019/05/22 09:40:55 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 10:54:58 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -48,10 +48,9 @@ t_md5_utils func_i(uint32_t b, uint32_t c, uint32_t d, int i) return (ret); } -char *set_hash2md5(t_md5 *e) +t_hash *set_hash2md5(t_md5 *e) { t_hash *ret; - char *sum; ft_memdel((void**)&e->p.msg8); if (!(ret = (t_hash*)malloc(sizeof(t_hash)))) @@ -63,7 +62,5 @@ char *set_hash2md5(t_md5 *e) ret->h[1] = e->h1; ret->h[2] = e->h2; ret->h[3] = e->h3; - sum = hex2sum(ret->h, ret->nb_word); - ft_memdel((void**)&ret); - return (sum); + return (ret); } diff --git a/srcs/hash/sha256/sha256.c b/srcs/hash/sha256/sha256.c index b56f76d..7ce363e 100644 --- a/srcs/hash/sha256/sha256.c +++ b/srcs/hash/sha256/sha256.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/18 10:47:43 by cpieri #+# #+# */ -/* Updated: 2019/05/22 09:25:56 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 11:11:53 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -37,7 +37,7 @@ static void padding_sha256(t_padding *p, void *data, size_t len) p->new_len += p->nb_bits + 64 + 1; p->new_len /= 8; if (!(p->msg8 = (uint8_t*)ft_memalloc(sizeof(uint8_t) * p->new_len))) - ft_abort("malloc failed"); + ft_abort("ft_ssl: sha256: malloc failed"); ft_memcpy(p->msg8, data, len); p->msg8[len] |= 1 << 7; while (++i < 8) @@ -122,7 +122,7 @@ static void calc_sha256(t_sha256 *t) void *sha256(void *data, size_t len_data) { - char *sum; + t_hash *sum; t_sha256 t; t = (t_sha256){.h0 = SHA256_H0, .h1 = SHA256_H1, .h2 = SHA256_H2, diff --git a/srcs/hash/sha256/sha256_utils.c b/srcs/hash/sha256/sha256_utils.c index 28fb9c1..897b972 100644 --- a/srcs/hash/sha256/sha256_utils.c +++ b/srcs/hash/sha256/sha256_utils.c @@ -6,16 +6,15 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/08 15:40:50 by cpieri #+# #+# */ -/* Updated: 2019/05/22 09:25:33 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 10:54:22 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "hash/sha256.h" -char *set_hash2sha256(t_sha256 *e) +t_hash *set_hash2sha256(t_sha256 *e) { t_hash *ret; - char *sum; ft_memdel((void**)&(e->p.msg8)); if (!(ret = (t_hash*)malloc(sizeof(t_hash)))) @@ -31,7 +30,5 @@ char *set_hash2sha256(t_sha256 *e) ret->h[5] = swap_uint32t(e->h5); ret->h[6] = swap_uint32t(e->h6); ret->h[7] = swap_uint32t(e->h7); - sum = hex2sum(ret->h, ret->nb_word); - ft_memdel((void**)&ret); - return (sum); + return (ret); } diff --git a/srcs/symmetric/pbkdf.c b/srcs/symmetric/pbkdf.c index c54d70d..1f8f7b4 100644 --- a/srcs/symmetric/pbkdf.c +++ b/srcs/symmetric/pbkdf.c @@ -6,17 +6,18 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 10:10:43 by cpieri #+# #+# */ -/* Updated: 2019/05/20 21:36:28 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 13:51:01 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "symmetric/pbkdf.h" +#include uint64_t gen_key(uint8_t *pass, uint64_t salt) { uint64_t new_key; uint8_t *tmp_pass; - t_hash *shasum256_pass; + t_hash *sum; size_t len_pass; // int iter = 1000; int ismalloc; @@ -31,11 +32,19 @@ uint64_t gen_key(uint8_t *pass, uint64_t salt) len_pass += sizeof(uint64_t); ismalloc = 1; } - shasum256_pass = sha256(tmp_pass, len_pass); - new_key = (shasum256_pass->h[0]); - new_key = new_key << 32 | (shasum256_pass->h[1]); - ft_memdel((void**)&(shasum256_pass->h)); - ft_memdel((void**)&(shasum256_pass)); + printf("Debug: sizeof(): %zu\n", sizeof(uint32_t)); + sum = sha256(tmp_pass, len_pass); + for (int i = 1000; i >= 0; i--) + { + printf("Debug: i: %d\n", i); + sum = sha256(sum->h, 32); + new_key = (sum->h[0]); + new_key = new_key << 32 | (sum->h[1]); + printf("Debug: sum: %s\n", hex2sum(sum->h, sum->nb_word)); + printf("Debug: key: %llx\n", new_key); + } + // ft_memdel((void**)&(shasum256_pass->h)); + // ft_memdel((void**)&(shasum256_pass)); if (ismalloc == 1) ft_memdel((void**)&(tmp_pass)); return (new_key); diff --git a/srcs/tools/clean.c b/srcs/tools/clean.c index 784531e..3853c5a 100644 --- a/srcs/tools/clean.c +++ b/srcs/tools/clean.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/15 12:07:14 by cpieri #+# #+# */ -/* Updated: 2019/05/22 09:32:00 by cpieri ### ########.fr */ +/* Updated: 2019/05/22 11:00:56 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ From 58593af39b98ad675929131898f85d5516a5b1d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20P?= Date: Mon, 9 Dec 2019 14:15:10 +0100 Subject: [PATCH 45/71] [Refactor]: Re-order function for parsing des --- srcs/symmetric/symmetric_parsing_pt_f.c | 66 +++++++---------------- srcs/symmetric/symmetric_parsing_pt_f_2.c | 66 ++++++++++++++++------- 2 files changed, 66 insertions(+), 66 deletions(-) diff --git a/srcs/symmetric/symmetric_parsing_pt_f.c b/srcs/symmetric/symmetric_parsing_pt_f.c index 44fdcd3..24c928a 100644 --- a/srcs/symmetric/symmetric_parsing_pt_f.c +++ b/srcs/symmetric/symmetric_parsing_pt_f.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/07 09:34:06 by cpieri #+# #+# */ -/* Updated: 2019/05/20 12:17:43 by cpieri ### ########.fr */ +/* Updated: 2019/12/09 14:14:01 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -48,57 +48,29 @@ void get_sym_opt_o(char **av, int *now, t_opt *opt, t_pbkdf **k) (*now)++; } -void get_sym_opt_k(char **av, int *now, t_opt *opt, t_pbkdf **k) +void get_sym_opt_a(char **av, int *now, t_opt *opt, t_pbkdf **k) { - uint64_t key; - - if (av[*now + 1] == NULL || av[*now + 1][0] == '-') - sym_usage(av[*now]); - key = hex2uint64t(av[*now + 1]); - opt->flags.sym_flags |= e_sym_opt_k; - if ((opt->flags.sym_flags & e_sym_opt_s) == e_sym_opt_s) - opt->flags.sym_flags ^= e_sym_opt_s; - if (*k == NULL) - *k = new_key(NULL, 0, key, 0); - else - (*k)->key = key; - (*now)++; + (void)av; + (void)now; + (void)k; + opt->flags.sym_flags |= e_sym_opt_a; } -void get_sym_opt_p(char **av, int *now, t_opt *opt, t_pbkdf **k) +void get_sym_opt_d(char **av, int *now, t_opt *opt, t_pbkdf **k) { - char *pass; - - if ((pass = av[*now + 1]) == NULL || pass[0] == '-') - sym_usage(av[*now]); - if ((opt->flags.sym_flags & e_sym_opt_k) != e_sym_opt_k) - { - opt->flags.sym_flags |= e_sym_opt_p; - if (*k == NULL) - *k = new_key((uint8_t*)pass, 0, 0, 0); - else - (*k)->pass = (uint8_t*)pass; - (*now)++; - } + (void)k; + (void)now; + (void)av; + if ((opt->flags.sym_flags & e_sym_opt_e) == e_sym_opt_e) + opt->flags.sym_flags ^= e_sym_opt_e; + opt->flags.sym_flags |= e_sym_opt_d; } -void get_sym_opt_s(char **av, int *now, t_opt *opt, t_pbkdf **k) +void get_sym_opt_e(char **av, int *now, t_opt *opt, t_pbkdf **k) { - uint64_t salt; - - if (av[*now + 1] == NULL || av[*now + 1][0] == '-') - sym_usage(av[*now]); - if ((opt->flags.sym_flags & e_sym_opt_k) != e_sym_opt_k) - { - salt = hex2uint64t(av[*now + 1]); - opt->flags.sym_flags |= e_sym_opt_s; - if (*k == NULL) - *k = new_key(NULL, salt, 0, 0); - else - { - (*k)->salt = salt; - regen_key(k); - } - (*now)++; - } + (void)k; + (void)now; + (void)av; + if ((opt->flags.sym_flags & e_sym_opt_d) != e_sym_opt_d) + opt->flags.sym_flags |= e_sym_opt_e; } diff --git a/srcs/symmetric/symmetric_parsing_pt_f_2.c b/srcs/symmetric/symmetric_parsing_pt_f_2.c index 5e8d6fe..39fd3f2 100644 --- a/srcs/symmetric/symmetric_parsing_pt_f_2.c +++ b/srcs/symmetric/symmetric_parsing_pt_f_2.c @@ -6,38 +6,66 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/08 10:21:15 by cpieri #+# #+# */ -/* Updated: 2019/05/20 10:32:56 by cpieri ### ########.fr */ +/* Updated: 2019/12/09 14:14:15 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "symmetric/symmetric.h" #include "ft_ssl.h" -void get_sym_opt_a(char **av, int *now, t_opt *opt, t_pbkdf **k) +void get_sym_opt_k(char **av, int *now, t_opt *opt, t_pbkdf **k) { - (void)av; - (void)now; - (void)k; - opt->flags.sym_flags |= e_sym_opt_a; + uint64_t key; + + if (av[*now + 1] == NULL || av[*now + 1][0] == '-') + sym_usage(av[*now]); + key = hex2uint64t(av[*now + 1]); + opt->flags.sym_flags |= e_sym_opt_k; + if ((opt->flags.sym_flags & e_sym_opt_s) == e_sym_opt_s) + opt->flags.sym_flags ^= e_sym_opt_s; + if (*k == NULL) + *k = new_key(NULL, 0, key, 0); + else + (*k)->key = key; + (*now)++; } -void get_sym_opt_d(char **av, int *now, t_opt *opt, t_pbkdf **k) +void get_sym_opt_p(char **av, int *now, t_opt *opt, t_pbkdf **k) { - (void)k; - (void)now; - (void)av; - if ((opt->flags.sym_flags & e_sym_opt_e) == e_sym_opt_e) - opt->flags.sym_flags ^= e_sym_opt_e; - opt->flags.sym_flags |= e_sym_opt_d; + char *pass; + + if ((pass = av[*now + 1]) == NULL || pass[0] == '-') + sym_usage(av[*now]); + if ((opt->flags.sym_flags & e_sym_opt_k) != e_sym_opt_k) + { + opt->flags.sym_flags |= e_sym_opt_p; + if (*k == NULL) + *k = new_key((uint8_t*)pass, 0, 0, 0); + else + (*k)->pass = (uint8_t*)pass; + (*now)++; + } } -void get_sym_opt_e(char **av, int *now, t_opt *opt, t_pbkdf **k) +void get_sym_opt_s(char **av, int *now, t_opt *opt, t_pbkdf **k) { - (void)k; - (void)now; - (void)av; - if ((opt->flags.sym_flags & e_sym_opt_d) != e_sym_opt_d) - opt->flags.sym_flags |= e_sym_opt_e; + uint64_t salt; + + if (av[*now + 1] == NULL || av[*now + 1][0] == '-') + sym_usage(av[*now]); + if ((opt->flags.sym_flags & e_sym_opt_k) != e_sym_opt_k) + { + salt = hex2uint64t(av[*now + 1]); + opt->flags.sym_flags |= e_sym_opt_s; + if (*k == NULL) + *k = new_key(NULL, salt, 0, 0); + else + { + (*k)->salt = salt; + regen_key(k); + } + (*now)++; + } } void get_sym_opt_v(char **av, int *now, t_opt *opt, t_pbkdf **k) From ae3cb5e8ac3dff150e93573cb4c4101aea46dd9b Mon Sep 17 00:00:00 2001 From: Louise P Date: Mon, 9 Dec 2019 15:03:06 +0100 Subject: [PATCH 46/71] [Debug]: Add function check_pbkdf2 - This function check if the struct pbkdf2 is not empty before generate the key and iv --- srcs/symmetric/pbkdf.c | 4 ++-- srcs/symmetric/symmetric_parsing.c | 24 +++++++++++++++++++++-- srcs/symmetric/symmetric_parsing_pt_f_2.c | 7 +------ 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/srcs/symmetric/pbkdf.c b/srcs/symmetric/pbkdf.c index 1f8f7b4..b440692 100644 --- a/srcs/symmetric/pbkdf.c +++ b/srcs/symmetric/pbkdf.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 10:10:43 by cpieri #+# #+# */ -/* Updated: 2019/05/22 13:51:01 by cpieri ### ########.fr */ +/* Updated: 2019/12/09 14:29:35 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -58,7 +58,7 @@ t_pbkdf *new_key(uint8_t *pass, uint64_t salt, uint64_t key, uint64_t vect) return (NULL); new->pass = pass; new->salt = (salt > 0) ? salt : get_random(); - new->key = (key > 0) ? key : gen_key(new->pass, new->salt); + new->key = (key > 0) ? key : 0; new->vect = vect; return (new); } diff --git a/srcs/symmetric/symmetric_parsing.c b/srcs/symmetric/symmetric_parsing.c index 12b694b..dbff8ec 100644 --- a/srcs/symmetric/symmetric_parsing.c +++ b/srcs/symmetric/symmetric_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 12:04:37 by cpieri #+# #+# */ -/* Updated: 2019/05/20 12:27:44 by cpieri ### ########.fr */ +/* Updated: 2019/12/09 14:51:25 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,6 +29,26 @@ static const t_sym_opt g_sym_opt[] = {0, 0, NULL} }; +static void check_pbkdf2(t_pbkdf **k) +{ + if (*k != NULL) + { + if ((*k)->key != 0) + { + if ((*k)->vect == 0) + exit_msg("iv undefined"); + } + else if ((*k)->pass == NULL) + { + (*k)->pass = get_pass("enter your password: "); + if ((*k)->salt == 0) + (*k)->salt = get_random(); + } + } + else + *k = new_key(get_pass("enter your password: "), 0, 0, 0); +} + static void get_sym_opt(char **av, int *now, t_opt *opt, t_pbkdf **k) { size_t len_now; @@ -55,7 +75,6 @@ static t_opt *get_sym_args(const int ac, char **av, int now) t_opt opt; t_pbkdf *k; - (void)av; k = NULL; opt = (t_opt){NULL, {0, 0, 0, 0, 0, 0}, NULL}; while (now < ac) @@ -64,6 +83,7 @@ static t_opt *get_sym_args(const int ac, char **av, int now) get_sym_opt(av, &now, &opt, &k); now++; } + check_pbkdf2(&k); get_sym_stdin(&opt, &k); return (new_opt(opt.flags, opt.data)); } diff --git a/srcs/symmetric/symmetric_parsing_pt_f_2.c b/srcs/symmetric/symmetric_parsing_pt_f_2.c index 39fd3f2..1c03d2b 100644 --- a/srcs/symmetric/symmetric_parsing_pt_f_2.c +++ b/srcs/symmetric/symmetric_parsing_pt_f_2.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/08 10:21:15 by cpieri #+# #+# */ -/* Updated: 2019/12/09 14:14:15 by cpieri ### ########.fr */ +/* Updated: 2019/12/09 14:59:28 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -60,10 +60,7 @@ void get_sym_opt_s(char **av, int *now, t_opt *opt, t_pbkdf **k) if (*k == NULL) *k = new_key(NULL, salt, 0, 0); else - { (*k)->salt = salt; - regen_key(k); - } (*now)++; } } @@ -92,8 +89,6 @@ void get_sym_stdin(t_opt *opt, t_pbkdf **k) opt->data = new_data(); if (opt->data->fd_output != NULL) fd_output = opt->data->fd_output; - if (*k == NULL) - *k = new_key(get_pass("enter your password: "), 0, 0, 0); if (opt->data != NULL && opt->data->data == NULL) { clean_data(&(opt->data)); From cfdd6beba2004d269d38d2f567360207b07a2e3d Mon Sep 17 00:00:00 2001 From: Louise P Date: Wed, 11 Dec 2019 14:24:35 +0100 Subject: [PATCH 47/71] wip --- Makefile | 3 ++- includes/hash/sha256.h | 3 ++- includes/symmetric/pbkdf.h | 15 +++++++++++++- srcs/hash/hmac_function.c | 25 ++++++++++++++++++++++++ srcs/symmetric/pbkdf.c | 26 ++++++++++++++++++++++++- srcs/symmetric/symmetric_parsing.c | 5 ++++- srcs/symmetric/symmetric_parsing_pt_f.c | 3 ++- 7 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 srcs/hash/hmac_function.c diff --git a/Makefile b/Makefile index c8a49a9..fb06d60 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/03/15 11:20:25 by cpieri #+# #+# # -# Updated: 2019/05/22 09:27:54 by cpieri ### ########.fr # +# Updated: 2019/12/11 12:37:26 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -52,6 +52,7 @@ SRC_NAME= main.c \ hash/hash_parsing.c \ hash/display_hash.c \ hash/hash_tools.c \ + hash/hmac_function.c \ hash/sha256/sha256.c \ hash/sha256/sha256_utils.c \ hash/md5/md5_utils.c \ diff --git a/includes/hash/sha256.h b/includes/hash/sha256.h index e61d15f..49404e3 100644 --- a/includes/hash/sha256.h +++ b/includes/hash/sha256.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/08 13:15:42 by cpieri #+# #+# */ -/* Updated: 2019/05/22 10:56:46 by cpieri ### ########.fr */ +/* Updated: 2019/12/11 12:41:34 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -57,6 +57,7 @@ typedef struct s_sha256 } t_sha256; void *sha256(void *data, size_t len_data); +void hmac_sha256(uint8_t *pass, uint64_t salt, uint32_t c); t_hash *set_hash2sha256(t_sha256 *e); #endif diff --git a/includes/symmetric/pbkdf.h b/includes/symmetric/pbkdf.h index 8ec5565..525857f 100644 --- a/includes/symmetric/pbkdf.h +++ b/includes/symmetric/pbkdf.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 10:11:40 by cpieri #+# #+# */ -/* Updated: 2019/05/22 10:50:10 by cpieri ### ########.fr */ +/* Updated: 2019/12/11 12:39:32 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,6 +19,18 @@ # include "../functions.h" # include "../structure.h" +enum e_prf +{ + HMAC_MD5 = 0x000000001, + HMAC_SHA256 = 0x000000010 +}; + +typedef struct s_prf +{ + enum e_prf prf; + void (*f)(uint8_t *, uint64_t, uint32_t); +} t_prf; + typedef struct s_pbkdf { uint8_t *pass; @@ -37,6 +49,7 @@ void print_pbkdf(t_pbkdf *to_print); void free_pbkdf(t_pbkdf **to_free); void free_vpbkdf(void **to_free); uint64_t gen_key(uint8_t *pass, uint64_t salt); +uint64_t ft_pbkdf2(enum e_prf prf, uint8_t *pass, uint64_t salt, uint32_t c, uint64_t dk_len); void regen_key(t_pbkdf **k); #endif diff --git a/srcs/hash/hmac_function.c b/srcs/hash/hmac_function.c new file mode 100644 index 0000000..5055a87 --- /dev/null +++ b/srcs/hash/hmac_function.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* hmac_function.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/12/11 12:28:18 by cpieri #+# #+# */ +/* Updated: 2019/12/11 12:41:25 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "symmetric/pbkdf.h" + +void hmac_sha256(uint8_t *pass, uint64_t salt, uint32_t c) +{ + void *data_to_hash; + void *salty_pass; + size_t salty_pass_len; + + salty_pass = ft_memjoin(pass, &salt, ft_strlen((char*)pass), sizeof(uint64_t)); + salty_pass_len = ft_strlen((char*)pass) + sizeof(uint64_t); + data_to_hash = ft_memjoin(salty_pass, &c, salty_pass_len, sizeof(uint32_t)); + ft_memput(data_to_hash, salty_pass_len + sizeof(uint32_t)); +} \ No newline at end of file diff --git a/srcs/symmetric/pbkdf.c b/srcs/symmetric/pbkdf.c index b440692..dafd744 100644 --- a/srcs/symmetric/pbkdf.c +++ b/srcs/symmetric/pbkdf.c @@ -6,13 +6,37 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 10:10:43 by cpieri #+# #+# */ -/* Updated: 2019/12/09 14:29:35 by cpieri ### ########.fr */ +/* Updated: 2019/12/11 12:41:43 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "symmetric/pbkdf.h" #include +static const t_prf g_prf[3] = { + {HMAC_MD5, NULL}, + {HMAC_SHA256, hmac_sha256}, + {0, NULL} +}; + +uint64_t ft_pbkdf2(enum e_prf prf, uint8_t *pass, uint64_t salt, uint32_t c, uint64_t dk_len) +{ + uint64_t dk; + void (*f)(uint8_t *, uint64_t, uint32_t); + + f = NULL; + dk = 0; + (void)dk_len; + while (g_prf->prf != 0) + { + if (g_prf->prf == prf) + f = g_prf->f; + } + if (f != NULL) + f(pass, salt, c); + return (dk); +} + uint64_t gen_key(uint8_t *pass, uint64_t salt) { uint64_t new_key; diff --git a/srcs/symmetric/symmetric_parsing.c b/srcs/symmetric/symmetric_parsing.c index dbff8ec..5566e24 100644 --- a/srcs/symmetric/symmetric_parsing.c +++ b/srcs/symmetric/symmetric_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 12:04:37 by cpieri #+# #+# */ -/* Updated: 2019/12/09 14:51:25 by cpieri ### ########.fr */ +/* Updated: 2019/12/11 12:45:06 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,6 +31,8 @@ static const t_sym_opt g_sym_opt[] = static void check_pbkdf2(t_pbkdf **k) { + uint64_t dk; + if (*k != NULL) { if ((*k)->key != 0) @@ -47,6 +49,7 @@ static void check_pbkdf2(t_pbkdf **k) } else *k = new_key(get_pass("enter your password: "), 0, 0, 0); + dk = ft_pbkdf2(HMAC_SHA256, (*k)->pass, (*k)->salt, 1000, sizeof(uint64_t)); } static void get_sym_opt(char **av, int *now, t_opt *opt, t_pbkdf **k) diff --git a/srcs/symmetric/symmetric_parsing_pt_f.c b/srcs/symmetric/symmetric_parsing_pt_f.c index 24c928a..8e4a002 100644 --- a/srcs/symmetric/symmetric_parsing_pt_f.c +++ b/srcs/symmetric/symmetric_parsing_pt_f.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/07 09:34:06 by cpieri #+# #+# */ -/* Updated: 2019/12/09 14:14:01 by cpieri ### ########.fr */ +/* Updated: 2019/12/11 12:45:22 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -30,6 +30,7 @@ void get_sym_opt_i(char **av, int *now, t_opt *opt, t_pbkdf **k) clean_data(&(opt->data)); } opt->data = get_data(open_fd(fd), fd); + ft_putstr((char*)opt->data); opt->data->fd_output = fd_output; (*now)++; } From e18ccb2b5f95fe093654ee7e0e7d59a3ab708a7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20P?= Date: Fri, 13 Dec 2019 10:42:33 +0100 Subject: [PATCH 48/71] pbkdf2 wip --- includes/hash/hash.h | 3 ++- srcs/hash/hash_tools.c | 19 ++++++++++++++++++- srcs/hash/hmac_function.c | 8 +++++++- srcs/symmetric/pbkdf.c | 11 +++++++---- srcs/symmetric/symmetric_parsing.c | 2 +- 5 files changed, 35 insertions(+), 8 deletions(-) diff --git a/includes/hash/hash.h b/includes/hash/hash.h index c985d18..90bb109 100644 --- a/includes/hash/hash.h +++ b/includes/hash/hash.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/08 11:41:09 by cpieri #+# #+# */ -/* Updated: 2019/05/22 09:27:32 by cpieri ### ########.fr */ +/* Updated: 2019/12/12 14:37:23 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -33,6 +33,7 @@ typedef struct s_padding t_opt *hash_opts(const int ac, char **av, t_opt *opts, int now); char *hex2sum(uint32_t *h, size_t nb_h); +char *one_sum(uint32_t *h, size_t nb_h); void printing_hash(t_data *data, const char *hash_type, t_flags flags); diff --git a/srcs/hash/hash_tools.c b/srcs/hash/hash_tools.c index 317e8a4..0d08c3d 100644 --- a/srcs/hash/hash_tools.c +++ b/srcs/hash/hash_tools.c @@ -6,12 +6,29 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/22 09:12:05 by cpieri #+# #+# */ -/* Updated: 2019/05/22 10:41:33 by cpieri ### ########.fr */ +/* Updated: 2019/12/12 14:46:23 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "hash/hash.h" +char *one_sum(uint32_t *h, size_t nb_h) +{ + char *sum; + size_t i; + + i = 0; + if (!(sum = (char*)ft_memalloc(sizeof(char) * ((nb_h * 8) + 1)))) + return (NULL); + while (++i < nb_h) + { + sum = ft_memcpy(sum, &h[i], sizeof(uint32_t)); + ft_putstr("hash: "), ft_membits(h, nb_h, sizeof(uint32_t)); + ft_membits(sum, ((sizeof(char) * (nb_h * 8)) + 1), sizeof(char)); + } + return (sum); +} + char *hex2sum(uint32_t *h, size_t nb_h) { char *sum; diff --git a/srcs/hash/hmac_function.c b/srcs/hash/hmac_function.c index 5055a87..4823017 100644 --- a/srcs/hash/hmac_function.c +++ b/srcs/hash/hmac_function.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/11 12:28:18 by cpieri #+# #+# */ -/* Updated: 2019/12/11 12:41:25 by cpieri ### ########.fr */ +/* Updated: 2019/12/12 14:58:48 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,9 +17,15 @@ void hmac_sha256(uint8_t *pass, uint64_t salt, uint32_t c) void *data_to_hash; void *salty_pass; size_t salty_pass_len; + size_t hash_len; + t_hash *hash; salty_pass = ft_memjoin(pass, &salt, ft_strlen((char*)pass), sizeof(uint64_t)); salty_pass_len = ft_strlen((char*)pass) + sizeof(uint64_t); data_to_hash = ft_memjoin(salty_pass, &c, salty_pass_len, sizeof(uint32_t)); + hash_len = salty_pass_len + sizeof(uint32_t); + hash = (t_hash*)sha256(data_to_hash, hash_len); + ft_membits(hash->h, hash->nb_word, sizeof(uint32_t)); + one_sum(hash->h, hash->nb_word); ft_memput(data_to_hash, salty_pass_len + sizeof(uint32_t)); } \ No newline at end of file diff --git a/srcs/symmetric/pbkdf.c b/srcs/symmetric/pbkdf.c index dafd744..8c17fea 100644 --- a/srcs/symmetric/pbkdf.c +++ b/srcs/symmetric/pbkdf.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 10:10:43 by cpieri #+# #+# */ -/* Updated: 2019/12/11 12:41:43 by cpieri ### ########.fr */ +/* Updated: 2019/12/12 14:18:48 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,15 +22,18 @@ static const t_prf g_prf[3] = { uint64_t ft_pbkdf2(enum e_prf prf, uint8_t *pass, uint64_t salt, uint32_t c, uint64_t dk_len) { uint64_t dk; + int i; void (*f)(uint8_t *, uint64_t, uint32_t); f = NULL; dk = 0; + i = 0; (void)dk_len; - while (g_prf->prf != 0) + while (g_prf[i].prf != 0) { - if (g_prf->prf == prf) - f = g_prf->f; + if (g_prf[i].prf == prf) + f = g_prf[i].f; + i++; } if (f != NULL) f(pass, salt, c); diff --git a/srcs/symmetric/symmetric_parsing.c b/srcs/symmetric/symmetric_parsing.c index 5566e24..9633379 100644 --- a/srcs/symmetric/symmetric_parsing.c +++ b/srcs/symmetric/symmetric_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 12:04:37 by cpieri #+# #+# */ -/* Updated: 2019/12/11 12:45:06 by cpieri ### ########.fr */ +/* Updated: 2019/12/12 14:13:55 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ From b64cb7e8038624f66a7ac1f8bce62c282ee291d0 Mon Sep 17 00:00:00 2001 From: Louise P Date: Tue, 17 Dec 2019 11:42:39 +0100 Subject: [PATCH 49/71] hmac_sha256 --- hash.1 | 1 + hash.2 | 1 + includes/define.h | 11 ++++++++++- libft/include/libft.h | 2 +- libft/srcs/ft_membits.c | 6 +++--- srcs/hash/hash_tools.c | 14 ++++---------- srcs/hash/hmac_function.c | 24 ++++++++++++++++++++---- srcs/symmetric/pbkdf.c | 4 ++-- 8 files changed, 42 insertions(+), 21 deletions(-) create mode 100644 hash.1 create mode 100644 hash.2 diff --git a/hash.1 b/hash.1 new file mode 100644 index 0000000..153375e --- /dev/null +++ b/hash.1 @@ -0,0 +1 @@ +00010001 00010100 00010101 11000000 10101111 01100001 00000110 00010100 01000101 10111011 10000001 10011011 01010111 10011100 01000010 01111001 00111010 01001110 01000101 11010010 00000010 00111010 00011001 00111101 01010100 10011100 00010011 10100010 11101011 11001000 11111110 11001001 01001100 11110001 10111100 11100011 11100001 01100100 00101100 11111001 01011111 00001101 11011100 11101011 00111010 10111000 11101101 11010011 01000111 01101010 00001010 01101101 10101110 10110100 01000000 01011100 00011110 01011000 10001100 10010010 00001001 11001010 11001011 11001110 00001001 diff --git a/hash.2 b/hash.2 new file mode 100644 index 0000000..85c837b --- /dev/null +++ b/hash.2 @@ -0,0 +1 @@ +00010001 00010100 00010101 11000000 00111011 10101001 11010011 10101010 10101111 01100101 01011111 01000011 10011101 10110011 11101000 01010110 10011110 11011001 00111100 00101000 00011101 01010110 01000000 10101100 10010000 11111001 00000110 10101111 11010011 10011100 10110000 00000110 00110000 11100111 10111110 00011110 01110011 00100110 00001100 11101001 00001010 11111111 10100010 11101010 11111010 00011101 10110101 10011011 00010000 00010111 01000010 00010110 00111111 11110100 11000011 10000011 10110111 11100111 00111110 11101000 01111100 01001101 00101110 01100010 00110000 diff --git a/includes/define.h b/includes/define.h index 89fc3aa..35738b3 100644 --- a/includes/define.h +++ b/includes/define.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:43:16 by cpieri #+# #+# */ -/* Updated: 2019/04/12 15:34:36 by cpieri ### ########.fr */ +/* Updated: 2019/12/17 09:31:11 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,4 +19,13 @@ # define NO_CMD 1 # define INVALID_CMD 2 +# define NONE "\033[0m" +# define RED "\033[31m" +# define GREEN "\033[32m" +# define YELLOW "\033[33m" +# define BLUE "\033[34m" +# define MAGENTA "\033[35m" +# define CYAN "\033[36m" +# define PINK "\033[38;5;206m" + #endif diff --git a/libft/include/libft.h b/libft/include/libft.h index 41b9531..68abd2c 100644 --- a/libft/include/libft.h +++ b/libft/include/libft.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/09 16:47:24 by cpieri #+# #+# */ -/* Updated: 2019/05/22 09:15:09 by cpieri ### ########.fr */ +/* Updated: 2019/12/17 10:08:06 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/libft/srcs/ft_membits.c b/libft/srcs/ft_membits.c index ff52405..7d2bc4c 100644 --- a/libft/srcs/ft_membits.c +++ b/libft/srcs/ft_membits.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* ft_membits.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: cpieri +#+ +:+ +#+ */ +/* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/07 18:08:47 by cpieri #+# #+# */ -/* Updated: 2019/03/13 16:22:23 by cpieri ### ########.fr */ +/* Updated: 2019/12/17 11:12:29 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,7 +21,7 @@ void ft_membits(void *s, size_t len, size_t size) data = (unsigned char*)s; i = 0; - while (i <= len) + while (i < (len * size)) { y = 0; while (y < size) diff --git a/srcs/hash/hash_tools.c b/srcs/hash/hash_tools.c index 0d08c3d..2bc2271 100644 --- a/srcs/hash/hash_tools.c +++ b/srcs/hash/hash_tools.c @@ -6,26 +6,20 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/22 09:12:05 by cpieri #+# #+# */ -/* Updated: 2019/12/12 14:46:23 by cpieri ### ########.fr */ +/* Updated: 2019/12/17 11:16:02 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "hash/hash.h" +#include char *one_sum(uint32_t *h, size_t nb_h) { char *sum; - size_t i; - i = 0; - if (!(sum = (char*)ft_memalloc(sizeof(char) * ((nb_h * 8) + 1)))) + if (!(sum = (char*)ft_memalloc(nb_h * sizeof(uint32_t)))) return (NULL); - while (++i < nb_h) - { - sum = ft_memcpy(sum, &h[i], sizeof(uint32_t)); - ft_putstr("hash: "), ft_membits(h, nb_h, sizeof(uint32_t)); - ft_membits(sum, ((sizeof(char) * (nb_h * 8)) + 1), sizeof(char)); - } + sum = ft_memdup(h, (nb_h * sizeof(uint32_t))); return (sum); } diff --git a/srcs/hash/hmac_function.c b/srcs/hash/hmac_function.c index 4823017..48d1742 100644 --- a/srcs/hash/hmac_function.c +++ b/srcs/hash/hmac_function.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/11 12:28:18 by cpieri #+# #+# */ -/* Updated: 2019/12/12 14:58:48 by cpieri ### ########.fr */ +/* Updated: 2019/12/17 11:40:18 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,14 +18,30 @@ void hmac_sha256(uint8_t *pass, uint64_t salt, uint32_t c) void *salty_pass; size_t salty_pass_len; size_t hash_len; + char *sum[c]; t_hash *hash; + uint32_t i; + // ft_putstr("Pass :"); ft_putstr((char*)pass); ft_putstr("\n"); salty_pass = ft_memjoin(pass, &salt, ft_strlen((char*)pass), sizeof(uint64_t)); salty_pass_len = ft_strlen((char*)pass) + sizeof(uint64_t); + // ft_putstr("Salty Pass :"); ft_memput(salty_pass, salty_pass_len); ft_putstr("\n"); data_to_hash = ft_memjoin(salty_pass, &c, salty_pass_len, sizeof(uint32_t)); hash_len = salty_pass_len + sizeof(uint32_t); + // ft_putstr("Data to hash :"); ft_memput(data_to_hash, hash_len); ft_putstr("\n"); hash = (t_hash*)sha256(data_to_hash, hash_len); - ft_membits(hash->h, hash->nb_word, sizeof(uint32_t)); - one_sum(hash->h, hash->nb_word); - ft_memput(data_to_hash, salty_pass_len + sizeof(uint32_t)); + sum[0] = one_sum(hash->h, hash->nb_word); + ft_memdel((void**)&data_to_hash); + ft_memdel((void**)&salty_pass); + data_to_hash = ft_memjoin(pass, sum[0], ft_strlen((char*)pass), (hash->nb_word * sizeof(uint32_t))); + ft_memdel((void**)&(hash->nb_word)); + ft_memdel((void**)&hash); + i = 0; + while (i <= c) + { + hash = (t_hash*)sha256(data_to_hash, hash_len); + sum[i] = one_sum(hash->h, hash->nb_word); + } + + // ft_memput(data_to_hash, salty_pass_len + sizeof(uint32_t)); } \ No newline at end of file diff --git a/srcs/symmetric/pbkdf.c b/srcs/symmetric/pbkdf.c index 8c17fea..8216121 100644 --- a/srcs/symmetric/pbkdf.c +++ b/srcs/symmetric/pbkdf.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 10:10:43 by cpieri #+# #+# */ -/* Updated: 2019/12/12 14:18:48 by cpieri ### ########.fr */ +/* Updated: 2019/12/17 09:24:03 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,7 +29,7 @@ uint64_t ft_pbkdf2(enum e_prf prf, uint8_t *pass, uint64_t salt, uint32_t c, uin dk = 0; i = 0; (void)dk_len; - while (g_prf[i].prf != 0) + while (i < 3) { if (g_prf[i].prf == prf) f = g_prf[i].f; From 8128a39db7c78adec1b5d4b8ad5ad88867c92f64 Mon Sep 17 00:00:00 2001 From: Louise P Date: Tue, 17 Dec 2019 12:55:33 +0100 Subject: [PATCH 50/71] hmac_256 wip --- srcs/hash/hmac_function.c | 44 ++++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/srcs/hash/hmac_function.c b/srcs/hash/hmac_function.c index 48d1742..c880524 100644 --- a/srcs/hash/hmac_function.c +++ b/srcs/hash/hmac_function.c @@ -6,12 +6,32 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/11 12:28:18 by cpieri #+# #+# */ -/* Updated: 2019/12/17 11:40:18 by cpieri ### ########.fr */ +/* Updated: 2019/12/17 12:54:53 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "symmetric/pbkdf.h" +static void *hmac_xor_u(void const *u1, void const *u2, size_t len, size_t size) +{ + char *u1_cpy; + char *u2_cpy; + char *u; + size_t i; + + u1_cpy = (char*)u1; + u2_cpy = (char*)u2; + i = 0; + if (!(u = (char*)ft_memalloc(len * size))) + return (NULL); + while (i < (len * size)) + { + u[i] = u1_cpy[i] ^ u2_cpy[i]; + i++; + } + return (u); +} + void hmac_sha256(uint8_t *pass, uint64_t salt, uint32_t c) { void *data_to_hash; @@ -19,6 +39,7 @@ void hmac_sha256(uint8_t *pass, uint64_t salt, uint32_t c) size_t salty_pass_len; size_t hash_len; char *sum[c]; + void *f_sum; t_hash *hash; uint32_t i; @@ -31,17 +52,24 @@ void hmac_sha256(uint8_t *pass, uint64_t salt, uint32_t c) // ft_putstr("Data to hash :"); ft_memput(data_to_hash, hash_len); ft_putstr("\n"); hash = (t_hash*)sha256(data_to_hash, hash_len); sum[0] = one_sum(hash->h, hash->nb_word); - ft_memdel((void**)&data_to_hash); - ft_memdel((void**)&salty_pass); + // ft_memdel((void**)&data_to_hash); + // ft_memdel((void**)&salty_pass); data_to_hash = ft_memjoin(pass, sum[0], ft_strlen((char*)pass), (hash->nb_word * sizeof(uint32_t))); - ft_memdel((void**)&(hash->nb_word)); - ft_memdel((void**)&hash); - i = 0; - while (i <= c) + // ft_memdel((void**)&(hash->nb_word)); + // ft_memdel((void**)&hash); + hash = (t_hash*)sha256(data_to_hash, hash_len); + sum[1] = one_sum(hash->h, hash->nb_word); + f_sum = hmac_xor_u(sum[0], sum[1], hash->nb_word, sizeof(uint32_t)); + // ft_putstr("sum: "), ft_membits(sum[0], hash->nb_word, sizeof(uint32_t)); + // ft_putstr("sum: "), ft_membits(sum[1], hash->nb_word, sizeof(uint32_t)); + // ft_putstr("sum: "), ft_membits(f_sum, hash->nb_word, sizeof(uint32_t)); + i = 1; + while (++i <= c) { hash = (t_hash*)sha256(data_to_hash, hash_len); sum[i] = one_sum(hash->h, hash->nb_word); + f_sum = hmac_xor_u(f_sum, sum[i], hash->nb_word, sizeof(uint32_t)); } - + ft_putstr("sum: "), ft_membits(f_sum, hash->nb_word, sizeof(uint32_t)); // ft_memput(data_to_hash, salty_pass_len + sizeof(uint32_t)); } \ No newline at end of file From 6eaa9c3b19410db4142155bdbe8191f14aa693fb Mon Sep 17 00:00:00 2001 From: Louise P Date: Mon, 23 Dec 2019 16:59:00 +0100 Subject: [PATCH 51/71] refactor pbkdf2 and wip hmac_sha256 --- hash.1 | 1002 +++++++++++++++++++++++++++- hash.2 | 1002 +++++++++++++++++++++++++++- hash.3 | 1001 +++++++++++++++++++++++++++ hash.4 | 2 + hash.5 | 1001 +++++++++++++++++++++++++++ includes/hash/sha256.h | 4 +- includes/symmetric/pbkdf.h | 6 +- srcs/hash/hmac_function.c | 65 +- srcs/symmetric/pbkdf.c | 74 +- srcs/symmetric/symmetric_parsing.c | 7 +- 10 files changed, 4066 insertions(+), 98 deletions(-) create mode 100644 hash.3 create mode 100644 hash.4 create mode 100644 hash.5 diff --git a/hash.1 b/hash.1 index 153375e..c554875 100644 --- a/hash.1 +++ b/hash.1 @@ -1 +1,1001 @@ -00010001 00010100 00010101 11000000 10101111 01100001 00000110 00010100 01000101 10111011 10000001 10011011 01010111 10011100 01000010 01111001 00111010 01001110 01000101 11010010 00000010 00111010 00011001 00111101 01010100 10011100 00010011 10100010 11101011 11001000 11111110 11001001 01001100 11110001 10111100 11100011 11100001 01100100 00101100 11111001 01011111 00001101 11011100 11101011 00111010 10111000 11101101 11010011 01000111 01101010 00001010 01101101 10101110 10110100 01000000 01011100 00011110 01011000 10001100 10010010 00001001 11001010 11001011 11001110 00001001 +0: 85dce2ad6ba50a0ec4162ad0598336517ad73f10e8ee16192f5fa0d6111415c0 +1: 967af4d7613e63ae6cd2f05df12e2c8d125f5128ec07521a6b313c24a15310dd +2: 7eea68f7007f367e09493c70edb150fdeddc16ec56123253516696900ed56fe4 +3: 4fe640d5106f16b6ee464b7c21da1e3c3e0223b407d0c6a3639230ef65f8e309 +4: 3632c69123a4a7cc5b4b45ddea2b1572ec877943d058dbaeee0d7fb02a64cf0f +5: b3f14807af541756e10a3cd81e812ee5d51505baf6421dfbf2810facee611c94 +6: 19fb1cbd59d7ac9b370488d9a55c1fdc79c1d8b8e4acb8607b5347b065ccd4d9 +7: 8a23d1395d1eaedf268b56ff978bca521a82c13a471adfeb85376220436f6be0 +8: 5abceb6e6598736cc1b81cb10d644d95707803988559a5d34e97b38c7ba6b61d +9: eb44cd7554093a31e15f13315c88303f9cbcc12c260c1104aaf2f7d322a4cd75 +10: d3296f612c32fc482c190825523af7c53561ab65e53a89a9360146ceef7592f2 +11: be3e464b70ac3060f456aabef84f770cb61c597c34b449588578544a3e319724 +12: f2481bdd304361d3366f8b47d030181ed574be70ffcaf2e46bbbcdd9fca86f88 +13: 9d8806d808ffa4fcb20dd8c6e83d76261579d4d55dbac5fb45c843704fc853d9 +14: d7154bae8ec7256fc5c6e69689642a2be5a4050223418a6fb42a069665c1e8ae +15: 9d508212c183bc60199bc8d452ee1410341269e486d8887e6b873309bc07ae1d +16: a998b3bf8609d89a750522039413c31b67e4d8ad5bde96f8676fb845257c77db +17: 267512254d3df3188031b77dae4378f1b2cefbc136777e7ff450d9249dd7631d +18: d484670f6ded2ba8f3e1a926b25fd9df59f6c57b5a7ef6ae528a82f6fc096f39 +19: 8a9694e39a0f7597a517c9ebc0d29aa47d38ba488289433caa578c31dbad4d87 +20: 8ec179071c95681b40b81cfcb878cf30388917844b8cc0a70106646a2509d54f +21: 5d6d37a33541f7c27460408529d4a2011906d4dfe215fba1ba654a8d0e57d522 +22: 2d493b9694a77fa55453ec259182ab55de0b504d9358047d5d8dae34df779fca +23: cf99972160728ec412d836ca2f9d0af86b74d6bbd46e9998f941d1ed2fe3032d +24: 6a44bd9e825c146850a76356ba47e62c71420a6f7b3108b62d58640290fc27f0 +25: 534294e4cedf8630d14b0ad75bc732f6e02aebae0c4d72de37592deeab493d36 +26: c99fb8948e39addf22fe084fd260e2c7dbacf6dd0ae5631ad9da1b8f2c887774 +27: c55f039a282306e34d74b1d3d4d79432caada63ce94a20e18ce1e3a1047b5c75 +28: 0e1d4f3dcc82aad407948b3bda370dbebb3453be9445ee746c31b6a6e29f834d +29: fe1e351a0405674718d2731949970188891e60a22454162607cc331bf0250925 +30: 49fe281b7e21d1f12cc071368359f07e9022d20d0ccad6da269d5c06e08985b1 +31: b22666b1f8fd1ecf1a73f15132f95492ca95556e2724d7c83d62c61229365534 +32: 42e4a64c2302db6677e55397e081b3b318db7372b648920f8a37780ab1cd3ce6 +33: b16a21a8dcad9d14d1c9f206d8da2f1bed1827b9c27570d8f762a42ea324abe5 +34: 841d5e62b2baf1bec33817a764e76447da91c3ec3bb76c71aa7b843fe742dc56 +35: 63e2031c2ba2de22f57c078f30ee466224aa9e645955c4d7c9f33cffa0b04c5b +36: 57b3d4a9b99c5b30bc07aba0a104dbf6323919c7829316af44de717606674d6a +37: 52cc02a6c375c8661d5ae7640c12d4a99d471a68a8adc24c4b7b775faab15519 +38: b74dd5dacb02d8991de0d890f28e9d9541728458897f185ea2ee461edbc862f1 +39: 00eb716f16f532d8cd216c2381045a03600cfdcddb5cff899327872d1e4c56ec +40: 62d17a5c7852291a20954e947712d9190124962c82c25de397e392d998096f4c +41: 3651989b89c2177d3dafa548696e28f4d158304424395c2f96b5268944f60c38 +42: 97c011124265b78962504cf4c57b701c47e12c5509d42b239496e39613e62e33 +43: b2650e0fe7cafd2f753baa4cb4b9130cbc42b1ee98beed229003ab5e6f6629db +44: b0890007bcf10bd94da7a0b43bd64da4205665e70b3bb9c1f6e7f72199a1f0eb +45: bc342e0606491fe6a11cf901b41e872c2bc532af5cb8bef2a93c80e87b29061f +46: 320f03dac702ecd4f942b33805944e1419f22325a956d61afe35dc224b252cce +47: 14fea152c29f1198c1f60f5e5937dd7c875a3491728043210c784feae9484426 +48: 646f5ca122eb0bf206c1481c170ab7a003b220e66c838dc8d67e71244337f7c6 +49: 9750f6ad64bba9df8824f67d75d37d0c0ee31ae765e7422f226ae9542492d82d +50: 2a41aae9491dc68e12bea51a9662ee0c0b6c485947189e075f2ebeaffeca6c41 +51: 77d710e29edcade288ed971d0de133c54f5846f3f663d22232d684c8d9125652 +52: eaae5db00afaee3de0c3e21655a2cd8368ff7e7dfc0fff64af87312a7eebb0fe +53: 5e9e1c024afe55d81b6ac8557f2867e5f7c378d6b58a757f65ffd81af1aa7925 +54: bcd1508137fb9456e0cd307e405d02ff17be39ec5a8dee6cd0a8219b88c72495 +55: 337bafca56c5dbf80d610b7477a65fcdbaac5b7060b16b5bb295d684c41355d8 +56: 1d3fbeb378a2287bdc5f4a20f1a4328905391f61654797d4710c9247d7e3376c +57: 59721454570ca2b55c09ca70ad99dea88ee5bab0444cc4c957a80b8602e764fb +58: e07829c5b27d55c8ddf75d14ad8d8d25c7dded815d58d67b89f0d682a9e3ac42 +59: 992b6df70082b7fd720529ac7eef352646e6c9f6642e0336080dd5239d6c111d +60: 75fd1ce46bccefcc1cc1680a192dc545c91fb4262f1ac2cd5aeebc9a906e6a84 +61: 4384d8d5cc81a5772d479fa636aae5e750e6006d73dbf06c662e5630cc9f2f73 +62: f2c6049bbd9242d9739f2a408169452a7c7f99e3d44b414ced10361ebbfb9861 +63: a5b666b5b0a2d63415b744a61d78cb7e2a57658e0f5587b75acc75268a7ecc9c +64: 0fd368e2923173329fff18564ecf4e4c3100f9d116bc2e34fc6c43e0f152f789 +65: 6a18f6aef35207192c09a7670854d76313e230450b11c1ae09dcac738ae29a75 +66: d6bca17093abc1619e048ee9c1687161f60db61f5fa45f32e5f413a2211a3ad1 +67: 2b3eed034067549495fb0906972c5d046f53d26fc4f0603ae0fbe216e164d5a3 +68: 287e82c3da770aca0a53f424c4b1392bb1de1178e05dc7a762af59ffb6cb3504 +69: 7dc33c0676c18be0c98f91b45055a39aa4bdb5774d1f3d2b364509117d5199f9 +70: 8ac0505260206de8c3e64a03800aebbe06e20decbb7e1ebb08605fe6e1cd7de5 +71: a5f80ddf555516ef4540fb4882faf398e8113b90dc0436da6ade4e2585c135da +72: ec628bba9ce4d21d7a4e94908bcb93e97b9356322349420f877562f8ab806c7a +73: 8a933684d3b07d9cd9e7a85fa06f2f8fad6585bf00e3749e81a55783a4c33ac4 +74: 61471ee903ac7f8383b5fe4f06d17b3d6776bb86338e6bb4d8d4661d22a0db94 +75: d21c9f3f385090e34b25b021a4f89881c4cab9025c6bd07ea496811d55cab4f5 +76: f35ab97584d028e267ede7aa6810439130e9af020f3fba217b5f5f05f0b3fab6 +77: 1eebd15a4b141e3c57282e69f9ab7c9a26e027e97cb969b30a81cf2aedbc6d5b +78: 0d3601637e980370f233a99fb26df1698db1fa8f6ba08b17fc5981da1a0a9c4b +79: ea5e9db8b0d525e61a8c2f4222f0e234b5d11956968d75fdad29ba729c31c30f +80: f82393ee4a0e993afbbe499096b86fa9e38e9365ce39bf637a66148e563a7562 +81: 877c9e5fe589356a397ad27d41aa6c266575a3fa7b1041f780c9fd71e38a59b9 +82: b594a19913145eb74196b03b790d1166a3ee5483c4056bffecce0851f0fa62c3 +83: f4bd80926351cc2adb02a3987be946398cf90b02a73c30a34142ee9cf4e6d6b7 +84: 6554661e3bab5d0cd67a4aa12f851624fb59a37f76d67dc261f91dcef4e99f56 +85: 9101f3a09b1e2f4164e324c3a9a6550966b19f8f15f35dfaa7e5d5880c97c434 +86: e3a8b17948e7d9a6073d7f7f3dd324fe558115b720a1adf4e5ee5277245cb183 +87: 7285be9c5b90c66c3cb2c7aa23b2614c9acdea964bc8695a1428fc714976f812 +88: 47104b5c6fb4ec27cf85c1a3e22fe631928538b6e39a7c4a8b19fa216a965155 +89: 3e7bf9add688476395fb369d0b51854f13871e6ab911220f4a2c35bfc82fbbce +90: f5384db8e17f02eec498c8688e9ddcb9927d698f969d398ca3777daa53c63d1e +91: 52939a46ed816e22e051aa8cf603b49fe12db3e14fff5577ee5fa709bba0e246 +92: 5984cc844cee6f30e28a7a4569a303aad5fbc647eaef45532ee2a3a4f3e334a6 +93: 60795ea26fa1124808272d8fa41dd10b04dc832aa2a4b29ec2a67d0aee8326e4 +94: 096f2ebb8dd1a655df783e6366a9826e8d2cbb45a863a2150126048c4a3bb422 +95: c02e2508f4ecc02654973ab7bbc697356b244e2064711d32034f41ec6c8010f3 +96: 399bb57ef99b37f9bf110c800857479ff5a4a6d615c28f1ab2e6b135f241f63b +97: 538146e200b04cb7eee283bf11c622f487b164b45aa507997076c1a714bb7037 +98: 634f3e4040a82fdad1c2f9986856ea84a29c11b780832433c72f53c38a9989e8 +99: 857ac7b15eacd88adc2aee1935d2deb1613a4fe6a07ef321b31d6459205efb32 +100: b9c18f78c6c126d024475a4cee31c86823a9b78948913042795324847c2ec260 +101: 4c21bbdc6c098799cc054ef6e4363ac809913ff273528755ce091fe8cea5dcef +102: 3574bf8d1624d866c339e7b58b4e4aa2437ab5792ec3a18c2ee3d6bdc0ba07c0 +103: 3ad028b3670b7e0df2031fabd8816516e19e10bf06babc5eeca48d80800f060c +104: d356b9a32be6600604ffe9e5c80943300625d89cb3834dd8b2cb1518b681991e +105: a330970603e32bea86778320be1fb89c1553c3c0703236a20d9ffb03f39e451b +106: 7d55c46d31de40187a5d9a1b82626c44fdd05dc92b8fe8f932a1cefbf15803db +107: ddd8827353b8b2cdfadf52c65201808e31586795fa5086eb04fabc3be56cfbea +108: 7abdf987458b0916a6ca6585ff616e6b5d385c0cd31dbdc66c6c613d4ec6b444 +109: 7bcf2da4858bf72820343567b4e27363c0f9c4576fca736fc12446637b04056c +110: 5796ddefaab6e59164723c4bc81d4d4044c25e4a5ed3e6982c3068394be6e765 +111: 50ee47bf8ca763c2d71db5251497889abd6bddeef350d774c8561791a42b8d3d +112: 78772ed96cdc0df15f826f62d72e1f0a9bace9921ae6880b157afcf12d2c5c62 +113: 0b3d2afe5cd8da4d61dcf951afa561b368644812a367d72c14062a189ff48b2b +114: c3ee44bcc9467d6eaa38f23bd58cc345cb6027af6c35fe101e72cd7d8f20ca79 +115: d85baa9f673ffb8ee642a26cc2eed5b2f7cabddcc1e3a57da6d25a9ff21a7ba8 +116: 22f6b3d8c00d5f6ab92583848a14e1b7ef3b7c183a26ffdc4d8bff0ea45d40c5 +117: 725b763fc442a935187982ed76d0579dc8dcc03f6d5247b8163e7d4f2d4df8e3 +118: c68d4f34319edc9c6be7fa9c2be8ebf71a3fe18f04e4b0adae0441afb2b04a85 +119: bd380ee1173ca47965d6d1bc350a2890063bb80253beda787d04129d425c561a +120: ab3069c2af2f4fbde79b2bcbbb407a7e7ebba04b9d479a61f12d6d381fb616bc +121: b5bef1a995fa71e6c391e0ebcea3d5b004c09d20b859040045a3ce5bea9538bc +122: 7cdee81258a876cc3396fb581e98fdb336dd1950a201655b45d3e79320162627 +123: 2fcb8b25d17eaac4370ef0a188e6666bbf966176b647b174fa9eecf2abec55e2 +124: 2d5324eeca9047ba17815e13e9e46ceaeeeee6b617725e9c24095356292c7540 +125: db01b4b82ae2f9e2757f66ec878a45174f7c23406b046926cd2586a76ef0949e +126: 410742c1ae1d14142d796f4603531e78b30866fa979a4adad4a49e9fdd3364fe +127: 2912f9acbdb4627c37fb1f643f67bcfa73a9fceb2d848ca7093664256c3f7ceb +128: 640f47f565d46dfe065e24cc266855c8b883dac354f25483c628728f8bc23149 +129: 175bd5ab889991582d8554c8a576293bc14be7226791b5352eba5aa3d6434de7 +130: b7f915cf072ebc03361a60e75483d96383bb67bbef4fd6b7a091255d72ffdba5 +131: c547751a862d00e7c5cebf2886e1b7feaae7c3382e80a7d3a306bf66c035b049 +132: 1e38d4d5fca04af54b42e53a1f80025534b915fcb3929cf08447e31a97f8fb4d +133: b4c3f2baab14feca2c91ec75d115d231d078b5571c8d79bc966d5ac7154beccd +134: c4fec2cd994c7dfd7b8525c27bdd42aa6f4bb263006f2939d94cd20d6008a44d +135: 32e2c07f62db8ebcd805a518e471c021b5940689d62ec56cc031045ee9af9513 +136: 3972cf6ee94c3b4701f3fa7fa9f7be130abf7da6559b6cba5d4037ba61ba4b6e +137: 74ccea30243f54b1e99b1f98b1a565fc5bc12c0cb372c0bb347d66df0f5b6c5c +138: d487a1505e3a398fd212c1df23eb124d7f16baea31ec1a8097fd2548d66c9de8 +139: 2054c1791dd0a033f054831b3e1a04a3114cf3f30b757d55115d0982de043652 +140: a549f0ec73a288b97f256153171dcef571008e1e35a9cd8d711393be473db126 +141: 59df9467e37cb4a346b8e12193c6d88e9dd6aed0e78c42372976db0bd4a24310 +142: 068e7dde0bb916b33c20310b8274aef929f2af47fff613f9fa36be085be4b800 +143: a8f28880fb2887738be1ab65dd98670a6cb0ebd89ab1f1a95a63aee1428efe1e +144: 45b277871b78f4591cc67349da916f07a5c2fccab58b12ea7afe4ab5c96d7fcd +145: 15c6252b88e4cfcc42dfc10638d01c080d8ac7759ca2c6e605ead3488b415e9c +146: 2205890b5e8deffb8a7c8270487a08bdae83ba0a823a3d7e98f7593bd80aec75 +147: 796161b2b7c7668c313ed3a4c96c749787d433288650a30a5e20268c5348f0d0 +148: 6d27d2926b2cc062a5eb332a1dd9084dff917d6014eec2b297e89e2ac0b0fb73 +149: 379c422916ddc464d9038edbed5007932a809547c63611a83b4651741f370ab8 +150: d3c26dd08a7a5587b4e5abd4fa55ff01127bbb715182f535a415555009862355 +151: 4366a1b92bbe908968acb1dd2a4e1461bed095fa6bfee3edbad953c5e9bfb1b7 +152: 62e6790aa528480602f628546cc04f828702b5423a6f6d6e7553ae8e8c34274d +153: 2a34e923990ca42a6534f14c02944e9f13d04fc926d3225c372818df47069c66 +154: 7163bf10bb131a014ab065e5170384af8c80cb09a49874d4d459127f09959997 +155: 039dc2b701808a89fbde295e55dff4abd976a508a817cea65b98caf0375ee8ad +156: c2341af85a957814610ede9b39d110910273f0627749a41e82c8249e841dd684 +157: df5638c7eabc9c0fede2341be6b46f003610768b90d15dc235df662cb3ed01eb +158: 31f31fa4ea63eaff1c1b31982a8874408681970fe211c5a68846cf10043a9347 +159: da2bc98b35182b12fdbf81352666848f1562a0b235293012c28489cb04616b46 +160: 21e6e3278390ec9dd492369dc2d5e04da3b393f630bc9a1e47d8ae1173f046d8 +161: 0b0d1d9a3cdd175998bb4e83436c81c1da079e6347c81a8a5d940fe910c145a6 +162: b557f92e62e8316633fd61fbdd8d726e7fb3c8e413eb5411ebd9263973f1ecc3 +163: 022cd2cf5a5a16f28e2d8a65130f70ce12232efff8ec21b97e935b16d7726a2c +164: 48b2a67cccf18b25a005073f244404099e3803c839b929054c839beea3420cc5 +165: 1078303bed2aead2ec811cfa4fa41c3bd4536290e0d690d3d0378124387bcdce +166: 8c6218f83e12015def099c649216ee489bfcf6a86e8c13e2d2eabfb083d44478 +167: 16399aaf5de31a47300043fcbaeb8ea5abe4b9206bf28f648cb41843670be2c1 +168: f64128bd0c936e4f59d172e61dc99dfd85907d14d3e59f0f0554defb246ceb45 +169: 91ea1c7acefe0f3f9d0ff988fce594a3aa9fe943dc38351f282003056eb3d177 +170: 9d3ed59fdc903ec87c8e4d2b1a7fbcd338298bb5aa6f321e401fd388cc5d3a17 +171: 93896f5a03b4aa3eb26cc34bae3124e42e5f661f8811b92ffc0a66964e4a08a1 +172: 5220ff28bdaa8286f94646feff8b615c38f80fbca37857fc3e81a3d6ef561e52 +173: f3434ecda75e0216226e1e5bf9143ac62852691ca5ccaf8954420f73ff0e3b05 +174: cc2a0b6ae2447b3733762f34657287f4843362c232c99310162fbb6ff0d50123 +175: ceb7be0ae2fc7f06e0ea102aebf343cb37c65deee88e2b3a538dc747979f8ae8 +176: 081f689b66146e7a256b1f645227cb3c9ebfbd04ad7cc52cedf1acbc21d43dfe +177: 116944f76f92bd752c7dede3ae8aaaa3e78c9f4c168ce1e4f8bed4051fb93b0b +178: decd90f07fbe6b0720886d0afb4cbf31e251882d6f7bec8c3482f8ef0cc8eaf7 +179: 8796057000a4cc5092554b1ca6826876f433a260b5369814ef293ba3562f4ce7 +180: 88b6522669a0e6b78af9974bc208499602e4ade0943e8d65c0eaafd854481f48 +181: 8e7428c3c728b8fbace45c64df9b4957592348c81433bcf6b81d3c2e7ae72c90 +182: 9372a0f5b68defaa0676b78320c16502801ddc3255b523e0801505ff5e7f16e0 +183: 6e86012d3547c33aadd438d6efe4ef06822f2a964ba16456054c7d7f1552fa26 +184: f740b3f95a86764d5a8031847becdcd2d259180e3de84bf074f993effde9971e +185: 59bdebc53a196c3018fc6fd4d6e9b6774ffbea7800700c8670df1276aa860bc4 +186: ed215e876c7709f3f456041863072e245600beaa6911aee29d8622de44ed33b1 +187: 4505f43b3569d2013cc3fc17ac31a329c4109611bc90fc610b7a47df00057375 +188: 6ff109260f1b3aa2d7dd09a8041dc194932dea241cb5e31e63612dad5aaddae5 +189: 48682afe897dc03b3d1ca634a183bc85dd51fdf049c8968a6d65c071c6afc514 +190: d3390ec0bdda39a01052620d7b6ae10d3275bf2eeb728b29b8f9a200c2899bc0 +191: 5b861e4da914e584b381f6d37f2c8458cb7a9fdc096220116bd184595d09afee +192: 18e51ddff9f391a89771af8fc5af6a269425fdc0885c1ab23c7b1498647ba951 +193: e379048af309c10fd9a95c37671f1965602a19d72b37765b6880f78e5575d00e +194: 2a03863aa3f1818018a31a289a1f74b43cd3486a6186332ea9d187cf4d778b8a +195: b06b627d0b9988f6246a2c74aa07f2f064a975a9ea72189cf70ef7738a550fc7 +196: 24b49031bb78a51beefec8aa02ee0c3f20a0bc8e23906ecb05a2e713675a283e +197: c91b153c4d07090707d66874074179278c760b59e0bbc488488112abfbe0a00f +198: 880aaeb0896c44b2e857cacb4e86c4430087f1524c25672ab3ffc3ed74f223ce +199: 8f79f1a6cbbf335cf629c9d0f9cd2e1a2e8f75dd911d7cda3d8ac7a0e9b44c03 +200: 22fe080dfbe76d382bcb438d9bb45671084d45f94c330436391e7d820d196598 +201: 836bbd51ce9e65eb7051f2e5e3c60816fdc6076b141df672ef8dd65acada203a +202: e454eb81a9fcd1e29b2313ba44020ef5ef60c2e3fd3b0566c74b87092afde086 +203: 6535ff734a6fdc4d577ea4218c657b65cd1be4ae2374d8564b01327b86da71b2 +204: 2265e8de4d67982ae7101f5dae68ca9f9657d2db3778702d909b79c6a86a5795 +205: 85fe8633bb3ccde13c7b479776aa1c41db83c4b764fce90ed14df15467a4666b +206: cad903e7b72d170c09fb62d3907f9b561af4ec18ddb28743ecd4cb733093de3a +207: 491a3cdbe7c160b955e34a93094302f1c01662e1ec30816e4516bf4e1c61b76c +208: 7ed8eb5cb2d7ee6f9e2488dd8fa835f6f22109f42215b901d5e4c4359ad30ee2 +209: 1cb36c31e915894a6a2533ccfd3859046a1dcf78d8452bc88958dde0ca191e82 +210: 7996ba8fbd81c2eb0becdbad564153c598abfa2b0f69bc3ce6566a78931d0b3b +211: 81289aa5f1dd141efdcdfc5337decd1399a8aeedfdeddeae6276288106bb76df +212: e4b3053295d363cdbb2572e7c374ae879efc9421701310a34db983a4249c74cd +213: 6122b9e38c62b79f5ae2511de6795fb0fc853a0aca3fcef4a182ed52439037e3 +214: 74982ecd365733ffd752f772b3c8859b030f09b7667627bb6dfddaec59c30963 +215: 65ac368432a97208d4b02bb2481e674f31d90f4f18efc9375b92282432cd4398 +216: 0ae0472333635ff53374228f90d5cabaacbc0af29938fb8693b1d6303af5d819 +217: 47335e444a2f868bab1dd2bcbf7d696403e156139545a479710a6e559439a8c3 +218: 836aa3b53750ab893a8d2505787917fc35dca9cdd8e144474f86e2fc62aa2ac2 +219: 902ad618c9cace3b20b7608eced2ed3dfd0fd2dd26d1ea37e87134f114053aaa +220: eeee27753ed8a81edfd6a9f9cf22ea18536e6b7afe16cbfb795c84611f729b7f +221: 78689d14bf6f41cf48c193559ca84a3d9159e4d8b876d8ef4400ff13adc7e546 +222: e95c0cef65e3ec3fd4d13511442b43639025b54441d0f6eff2f3f0fd16112e49 +223: bdb7210e537118706f44ce3faed211cbf168d84bb0e987d4a283c854514a896c +224: 8c5f6f2b232c4ca41560d9a9cf2133b9e9cb18f5879fd4b33ef3eb63e599ce05 +225: 0362c89e151b3c9fee8518298cbffdd7248e55598f2aadca11349c6052634142 +226: f890d22cde86aa1c84b2b176f20fbb12dad5a01a5440b7ea9b95ccfdf3e1c3e5 +227: 07bb7b47c9b210d815f1069a0a41d3a84521e657b7acb287b1cd5cbb49f67ff1 +228: b1a066f1a5123b37a21fcc3f76776d39d9b1900ab322627c624ca36c41ec8c80 +229: ba78c1228e9c14a53840b0abf4c2453000a9f7987a214c25303404f73c631f05 +230: 5cf5cac55ed208adb8093b361dd8b9f5f02fb8a53cef52826924782e1f6a11b1 +231: 96c1b670f199bafe07ddfd47f1621f83358029a70de499e06bbdf703df203266 +232: 1edeb64a7da98efbeb47db24d63ef44715ce037f115cbae5f9352d95250ff191 +233: c35d4468f41c85e5cfc438f1710c8ac81a14208d98f7aab81d9a2af52b557d3e +234: 15bdd6d35bf282cabde4e76053970b0dab3be54b0d82d307a286e465c8cf5977 +235: a1f30cbdae18417c306ced42980242e75e26a46dca692c2a5c66fee091eee6ea +236: 7dfdaa74283d590bed1a93aa83690b94af6da5ab325048562328b12121a1fec3 +237: 505531a199bdac286d600f684a6db9eabe1ebb8484b87d9eaa645697793161e2 +238: dc9b0fa83e94aa6a077b27566bc819d3f6c4cd9de816528ba0a8307ba5a9ce89 +239: 0469c2d7c5238717833258ddca0e7b5e2935f88fc18302530c7d5f4d12b4e6c2 +240: 5444891f96afd31dfb90875ef6361330cc9066732820393af2bc8e7685d73219 +241: 96c7a7d1a89c2a7ff489b4da3dad6040d70678d943e493124ac85611da941ef3 +242: 83ed5df952c9a10321737683dae3f07a674130eb1e63808ff36657786ae90bc6 +243: 8306098da643d0d713485eb46ed5b2e195f5922059dfc4235c56598e63258915 +244: da3dce162705f1440002406c5789b185723547355b9f68e2b79752c69120cbc5 +245: 586b2770deedf675f605e7a0ea1749f4ccee4bd503e979bed27300665376e135 +246: 21e45166c93f32ddb9455bb5bf741b35dd091471e6be0fdb0a3e3989e8e03308 +247: 929f96737caef074135a18be5507aec562cceabf0f782f68819c600c171c6652 +248: 07673d367d2861655fab34786cfb189d1264040aab58f8ea997ae13b6c303e20 +249: b0d774540ae1680d4d5c47002145f86d64aa85739bc61f0fddd24341fc870736 +250: 90be88abc45f798dd28659b543f1740317abc8f5a7edd9cbaa6aeec8168b4eb1 +251: ccccc2ec1d5992b360136f83cda2adc2e4e921407589c633974316084a0a24d2 +252: 7d863f9d4cf437e5f01661a0427f5d84c857a14f0c45117bfd430e1ce1e83d37 +253: 0f1100223e9634fb289da37860841f227e30fc4445e05a89580af9e37df54006 +254: 989bc5068cad5a93f2cef1e4acc0031c3892e0a8336f57b967ed493ade127819 +255: d117be5bf4886475737e229feb3a212067df3b4d20476412148de596327e8629 +256: 7918e370264ffe9a954fe349ffd1b857dc73948de93ecba459dbf57231df395b +257: 9aecf8190d9f3c8aa026de18a609c14017a5cbedea830aa587bfa75741785c87 +258: 4675441cd704567d561a9a244649afad8c0218870d8422b280dca07765478f4b +259: 807d3e8c51d7ea6d1f9178769f2ba3e6ad3eab801a22a341eba696ef656812cf +260: c9327ebdee70d30bc6da82ce176be856e13661ad045195c7ea3cbce1a50eeb6d +261: d2892873d407dcc7ca8d153705b537e9babb6e8ee48d43db752be3d4d5bff8b7 +262: 4042e408eac4bd2d4780366df17273c674ad0975053af97525a585783926eec7 +263: 7ab2537e4623221c87469fac039dab9f948005a1309fe4cace36a165ef8489ac +264: f9be4b7e3dd88242e994c06ba87bf086bd012bc05739c130708678ac148ee2a6 +265: 67f78d0c6e565b0a3b266c7024973632256c7bb1a50f26e615700ac117f12e14 +266: 65860d112fbee85873f4491a062057a044b27b075054207d04b3e1c8e0ecd295 +267: d17dc8cbb6a4121053bc4595c8d472ebc25ec03e6a7a3cea9693f7a08857c19d +268: 8f5526c34c0560b272a783e8f84d8c6068361fc1fd98737f916539c4e5a786ca +269: 622442a15cfd2bb1d19a5bd917eade938c67576a2fd710f355423c7e362379d8 +270: 01aacbb60422586205c3b537bd8e6e3c3647a6a6959d8c572343dcd4c2a3fd03 +271: bfb97cfb6d5ea07d2d2bf8075791ec76e038ecae19738583ed75ed3af92b9dd8 +272: c3bbcf68c733161cacb2185e06bcc08e739e0156bf172b465cad0b286d651863 +273: 9860e97874180ce05482189ea83b9bd46df9c1ff84c063c04b55e5007d71e308 +274: 60f51f62146cda4f15c5f549330bcaf0df4a420aab37ead2e94115b28464ec68 +275: f820c827e5685de1586f0c4366d68434efeada7cc8e4816113f1ab7f854030a8 +276: 439ee42e996b28301a17903413e27bffc561c20127696a1fbd7a9ec1091d15d2 +277: bff9711495f8648195b9d685d74737505158c58dbbedba3af298a12ccabdf72b +278: 8b440ac27c9230c25b1091416c331ef3e7c63fafb4d3fbc5e7e67c9a96eee7c5 +279: 153d0606d52d37fcf1d765026d5db583b0d8ee70cfff0b31fcff893e22197d35 +280: 8f271450f8d016349330115729edd00dac6d4b4ac1b4ae5a34ed03c3895fc6ec +281: 5fd19597f8f2f54a105ce419652b6f31ff5f81b6e9c9fe11adc74d37cbdafffa +282: 83ec2c8abf39cb4ebc7aa584ddab071e0bf709f5dcccfc4032649ee8e934e9bd +283: 87223192712bbde69b66186f916aaa5e034133be0852e736ada9a4f2b6d15371 +284: 51881c2227b7940a388f28f75754a5a606f549abd05799a139913a0e4a7b24f8 +285: 449501d5e3a11f803d3db8047544ba233d33b88d0e338b1cd8a21d274068f399 +286: 86028c7871285d1f8039aefe02e4f8f5cf8611cffcae71633b41cf24ce1eae2d +287: e4a43cc54820d908d2f413ad9a43b8c5a4e635c96bf3080d5a1d2add8a3d6eef +288: 4044246981889dde292330066d8f563a73090f61522316aca1db1fff59c76b19 +289: 7b8fcbec4e16cc0b53159f002d00a4e7fd67c8a1e04792e26e97c2e8ab52d1a2 +290: 164a4ab46b7901283c57d89eba86b54b1398005eb3b9681617934cfa48c0a7cf +291: c234774ec19d702c50ff52ab2a5681aabbd194bb8a16375dc0baceeb4549886e +292: 5dcb231c4448ea274426f1d3b34a4b5b2639d88eff8312bc08c94ee50ef5128d +293: 2b79eb4bc6a5c548bfda75d29f6e987942bc7abe6eb4515edd838913a2edf245 +294: 8c6febc7c3da2fa7155bb9c066677f018c9e6b580b9b14d576d38bb533f66cf4 +295: ebc472cf68e67db6be510b6d4732672c43c74604964eb5b4433b9c779dc7be5a +296: 61e0af62939c09edd3e12e53dd5b304b4b8d787f57adb6027154f81c748bc1bb +297: cde92fb85c4aead4cc97f094f99f52379f5913a4857880f26a337851195c0541 +298: 48d22f360d786faed02cab1f293efa2372d1a81d22e2920f884bc379e87faba7 +299: 12041431911a6e89eae0e2210f2b68efcf666e6da9fc63c33a4efa73a513f45e +300: 0e859b529c474484c1daad4892757411be6c133915c71e11de6675303e8a4c5b +301: 4ea0f68329d2132134987b0a52d2a5f72b799a7888f8e51b538a3390adb18585 +302: 2228eab0ad664fa03107f7867ff9fac8d5314e296bc47cb429b6d59c08f8e38a +303: 9bb3fb3df5a2af73ab0f0957db8633b22ae1b257ccdbf6c01b644345228f71ab +304: 28060f06073a5b7044d979ac6ed092750933fa2a65834d8938ea1ef9b9b30621 +305: 7913cb25af88438f3a4be0a6ac9c136859efb982b51c43cc41f8f3e9880dbc46 +306: 0b58a75e74f595094152e3bee513f4b47f465e974428ec9cccdd71bf0137dcf4 +307: cf774b4ff8cf9a2b2df5478356699550be7a89d26ca7cd988bfd7efa53fd5437 +308: cd7b2510510b1e68c93af020629b2dfd5a4d0b258ec70dd601271cb9c04ff6e5 +309: ca1027e7ba838b52595f0a83fbb8d05e9417241f7a3c8c90799579183a2357a2 +310: 9916cc864cec1e57b549623007220d92320c51cc945bf1cc506deae386193dfd +311: 4f7f9bf00b3975efbc9ed9150c8b38971951bc420c38dcff173357d8594db52d +312: 584a91d99da2b8b99c12c615961f1a8ff5b758ea8780816e1a1767d55b1c197c +313: 2adc133ffcc65a546c198b3bf088be0bf68341f8c5b45edf0a79428cfef5de25 +314: f9488b9fe9b0ee2acaf54bd385dcba101fbbcc801b71d0c3a1d1c820f11acd65 +315: eae10e528082af6bd71edf955c6fc7873b41406f727fac18872ea586dd828302 +316: 8f6ce27e9e18ad70e112aa5daf18bf564284fe985833dd34eaecc6b5e064a771 +317: 6904feec855e513b2f2816ac5818335be61832d92fc5e020dda40bed646df7ff +318: ce212d5906da3e2701313d4111da2f23b0091347aa6107fb0e3fa8f05c8c6b7e +319: ae2aa88187825ee3364586f6b7b8394f1a7167710791447e381285707caa2949 +320: 2ee5e39f89d0420f9781a0fb572557595505b16c4110580f9e2510cdc37a6375 +321: 71b7110857241e261289757765c5505296a4c99d1a5ce1fcb1675f1828bc58c7 +322: 612fa9024db98b84df2aca6419b00879701d649698a5ea3fcdf0c13bc58bb6a7 +323: f00b094cc91f60ba7e0a47c5fd5d3a65edaf8ca278aa4e55a1a859b8e4e610dd +324: ac13597737535d11f1cb7c259f2f4c85eec3e910d71be3359e758ec25896d893 +325: 3b1bd1bcf7b79d5a722e1c731a63d3a98d5efdb5f6ea26207d66780f79645cd2 +326: dc147e3da606176129f7195959841eac83db95e994c60f3dced9bafd67130d33 +327: 8fe245581f1813f11c750b3a5b02c8a6cdf1b59c5535e035551e5d590d3d03a2 +328: a870586448d52da28c66c78096681dac2deec0f07b6ac5f6790d497b7606e0f1 +329: 3718898cc208739481343d4a15bdbabc785c59ebec52837a63904b5f313f0304 +330: c559c358dc83ceb40564b40818a0339c1bfaedc1eb3dbb1fbe9f6d33a5e35581 +331: cca494691816aad621a47fc105b8fde3341105a29c3b706e9455cdbbaea2204a +332: d4cb6e4742eda4523a5d178948f05468d1cea1e1fa2b7e0d99d2dddd1e4fa8b6 +333: 58713a47ee7d464233aa4a925bf8ef6e55b305f2b0819d8745afcaf61e118e71 +334: b48c863bb5cabed5aeb69051a8a52479f5a37c6a43a643bdb37ef006b4db54de +335: 89cb6029342df50b71f16f88d8a495fd53b30889c94b4d7af1eaf8b4a8c1d9e6 +336: 3da1b949bef0364d6fcebfdb11e6d2efca2dc012010268b4c02e4b489a75d59e +337: ef14cd74caf8f47b6eda03885d20849d734897cf89455d83305aae6f1f457893 +338: e46345992433ad8f196a241b184f02a2d2564533cd39e844aa47d9a87f65f8fe +339: 77010eddd786912ed75c3a3b1c885944daf061d58ef653e94eb549143d4d2766 +340: fdb79ff371ba418823ea7443652d37286f2000df06c3880f1cb322f74ff437fe +341: 53f36cca4baee943d61e97bc9a5412670ff7408af16960c5487a93d1568c9e66 +342: 9bbd9eb1d00da5c0b96926357cc38f6f649f4daef2d0d79452365ed7a5679baf +343: 6fb2e192d031cd5070fb63f5e6a23610a008d592e0be5083ac2dc2ee264701d4 +344: f369c877964f6bf3675c2302e0e7273a600e5e2b1d8dd9eb0bc9ae1ebbcfba02 +345: 5fb4511bfd5a89a4c026b227d3edc5a1e0553ceaf56b0559c334253270ab0cff +346: 2105b64db2ed533bc0529de6d4eb90500d26e1b4fc0393a24292c49ef45eae40 +347: f110830985de233ea7ceb040e340d63d933a74237a6da1b6e662b6fbe1629d7e +348: c7a09648ab90c57f8334972cc8b4a13f8f65fc8cb9d7f27450689a8daba72b3b +349: 98b4e3352af24ad6d1ba2e7a1eeae59f701e84c2504f48190c11377f75c6ac85 +350: 395301bd43b6315b7cd19335d054fc18648c41c24e4fe54a87c4629830f1e6b5 +351: b496a8803825e94563c1762af845668689af8264d265fe96628cf5ae90774ef4 +352: bc4ecb58601d15e4e96551409d1ae3479a4b62488c2d961ac29a0f16b18f02ff +353: 93c5010dfef6a15683ec0aa217dc00466bf65125374490fba0c05e2d81c0a22a +354: ed4a34ae546505e877a978f68ad58c78b08ce2e084e1646fe7fa25a264927cc6 +355: 6578751c4580b094eb245261b9e4709d001f228d384ed46c5b9a98b9fcbea42e +356: bb36bef38c0667095696efe5779f0ed5855aa5c80130f3d834cccb3b5ee2fcdc +357: ee401de8e74d5327eff5dc94022aadf9b18f203d1a08d1587fbbda1682d41444 +358: 4ca535c0625c02ffdfbc178b70a5d934c1a66b0c8782195184a02b860f119029 +359: a45b2b54514720695a603bb0fbff2bfc04780c97308212244f57ba7e45e3aa56 +360: 56872cd98fa9000f92148d6ec19c31e59e71766e342031a6972be4a453b2d47b +361: 273937ef97b43b3017f0f38746bf4a2e6f53abe57b8b8494e74976026d42a241 +362: 637a19b146aef1d1084f07f0f9832dee7b9ee4e27d803bbd709467aa2ce303f9 +363: 7340af34abc3a6a30a14d0ac2648bead4cf4dcab4f252874f95b5dc121320998 +364: 11e11820eb3b42a6a97b7eacaddb3fc01d7731a22de37f6f379b2e3c91a3835e +365: 9c9783c63124a6913f338194a0605952ccea0543bb5573bae70f440dbcc80928 +366: bd2e7f67123d49ec4d8e529fc3714f4b7a0b1fb1a8bbcd6026f53b9a087ef946 +367: 89888854c22789bb35942321ea458dae0dcce3aa10db62df538cc8d3f5998206 +368: faaec2e73a456fe3150d2be01dd10bb99437e801b4f4984ddf4d26d33caed5df +369: be3626c4c9ab11b5e038c036874d5d99375491124bdbeb3c4027b29e4af1c5dc +370: 022ac8a6d2f09db3edd2dc5b92bfb8cbe893f83c2a48b16179868b891021ee58 +371: 0ae40bd4ee211d6f9f9322e7811d80aab3bd81c17191ba32454b3c9092854cc4 +372: a3b9af71edf59a632d02f4819f4b73fd32301d36f3ac7934659338a70424c0b4 +373: a2088bc52680e9a605a2919112a655058039dca5db6d3a4ad28f0308f82a7b1f +374: 9b69873872d2a1d90c3cf402b43ace8b5a7a37b02983a208167e865f51feaea8 +375: b022041c3132842a4bb6f1efb8e75fd2c48abc0352a40538fde82572bd8b4c6e +376: 79b15cbf5b8e0dfc79de050e4b307b1dd7d0a4cc6949118b1e7297c326bf4505 +377: 03332d4b5ac755b4918c7f9073f877cc1b9af8e97d800dc45abb4a99311f7bdb +378: 4bdf53be72410131df3d1294b5c3ed9ef166900ffc56474452cab8a16a42f65f +379: ca9801e8fe29a1743c4fe59ee889c266ce276e339956341d94c40ed64e2cde7c +380: 51e0280d03118a04c067353eefba23faed845e2f8aa77c114e8f7ce9cdd76ce8 +381: 92cd4b7886ea31b185290bfdf704bae8154b2035961511e98fdba5d107a270f6 +382: bec0c70454a64f9d37e0b6ab2799577b7f98557a1b64871235a3bfd39d89556f +383: 00162012a6c2f2b07d88e02d9096fbce28672e1a49ba27c9b743c0cf3be84445 +384: 7348acf111fe5513ab119295407bbcdfc6ff24d8810ba258c949154b2e9d1a0f +385: 2bbf687ce7569408c515117fec126ae3ea11af47dd8a5e80c1d45ead997cfb2f +386: a993b3a196f19459dffb4c77a1dbe0f2084c02553fd8b4e8d5540705bd50e1c2 +387: 26f84446687ae90c1813fa49721257e7fd8938bf303dbd72cfb4e32cdbd58701 +388: f467a901838d0f18b1ff23b4b92a8eb47d1087973a942f160f3657ae8c25e82f +389: 67aee2303ae947f1c3cb06e7bd76640be6e007dc21ed674e82c56a2fb6182e37 +390: 36eacf8ab85aea33a2d0cdd5716aefa875da36d05e765fff91bb5c70c7fedfa1 +391: 2efed6f5c3303799203b563781fe7e8dd10e5153ffff7f40c7eb71380a11781d +392: 33fc4ac404c554b242bc6a95c32d4a780ee9244729a5787009d6f776b8e98397 +393: 0e6a680ec399b877f374581475656c2498393025aede5857a3ae508ea8885da7 +394: a5e064a448b5ad1562b05f17e73af343045c89836ca15fa03936f2cd23f7fb8a +395: 5a22f1f5098d4594311fb19e225c848602e7880579356f183ca882aad3eddea3 +396: 1129d0a75803362dbc3b9d3d678fcef29880a5c5673937abe2f0ef71ef83083e +397: b8e2c3aea667c4d139a7adee2e29b0ef4ab85157d97d3a593deef208dfa5850d +398: 77dda75715d6a77138f0b4c95c8f374b6cc9cde0661d111bbd7293dd0add6e45 +399: 4d9199d53858bd285e824099364cd360e55358bab92f6e699032d7597c78127f +400: ce5296b7199d32ea2668de4f0e12b522de695890d491b69a46fbd3b19443a5ef +401: d953f34abc2cf734b1de72bcd5fdb9e34b3790c5539939dbd0c580578cd4993d +402: d11987f38e5d5bbe655f2c1f0693f106bdcf39794bba6b8318ea575f8bf0231f +403: fa1995a87664b4a1335b18f635e132113d802bcf3bfaa983844e4be9aa48302a +404: 94d26f5751646b41f46cf71187773ed3c3fa5a059956c377be54d6e198fe7f55 +405: 73621384cef28085fcf9579dd4b08a9c60c6c6693de75276d77178242b31e9da +406: d18256c03fe2200e7fde200cee7e5e68b31fabb35ea4aa674f1480f0c70f40ad +407: 228cb345ac19bde898f5d1bc0c1606c20a4b378d39c45f048f2ae641765eb3f3 +408: 127b0845056b41d6ab032c78a13878dcd7f54d363918738f107b4449ccd58462 +409: 478b6381cec4715437db2bd003710a92e5e3355cb5e01a92d4eff6095d2fa3bb +410: 2875c4e4a1c27d09af73fce7b0c8e9f0a798ad157b10b92c36f696f2312d52f5 +411: db0a692d081a97a3d3bd3e525109c1bb5e5f43654c538dd155e98a433d8118a4 +412: 5225f5acaadeefb94ef492e502474d900efc6bcea98579d120bc59c7377448aa +413: 27858430af45f95e7dfe8857d9f09e663577b2b858057eb531c8698afbf75209 +414: caf13396952df2bb16c10d62c34df43c4c422be52fe963401bacbcd8b3fd9720 +415: 7c9d95826ee3ce61e664940568a0066e9cf2665025f9d085eff982292ba42fff +416: 0d2f401f6deef04e52f09d18991981dc4e4a410e14bef6e4d0952c14d4bc791d +417: 5fb3672a06e111c544223114a982f4993cd0a0ae2f8f20c736ea622f9a592f3a +418: a143850d422c27cb425db67106caa1546436e843bbf6c7c5ca98c7d8b26500ed +419: 3a7d55b86405bc716dd23033ade4b475b1e16eda03737ed8d54783ae48e33842 +420: 24d02ba759abcf03263bf74b4149e277de035c9970170aee0cca3db4c3af0181 +421: c88f29372fbd0f25ef8f22d73d2c1a011c2108e43bff19231bda4ecb0aa870cc +422: f13f8c6793b9fd9dbaff1f6e7ceb6adcbb29df48412dff67855c37ab4d2ea7cd +423: ac2ebe0fefd24d17b128950992a8447d3d72e96d9991aa28cf949586d4aedcca +424: 51ce61394aeaf246871690a4c3f9e1611efe3db47689add4f6553ac44c50aac8 +425: b51cd46dffcd7a50fd1bed06d63277dbfb49a9dc52d130d2fb48cf763d090eb1 +426: 8cbada55be3ceeb7ff10a3a86cbcdf93cec431bda81cbadb17c35889517f6aae +427: 271ec5f0f337031bf4da8dffe63665d21a1445076eba7fe6347e01130724c2aa +428: 4e6b0226f4537cf206076359b05c5e848c278ebee902d761fba857852a94dcd4 +429: 26b02334cc3f7063cf3c98509be21fb05380a1c5b5415c551374ad541b25b73d +430: 855ec2729210f95045ebc4ec2ffb251aaedc552cb84b2525a111f09110a21957 +431: c492ebc57c483a2e9b696db4b20a7d06246ddf8eea54e374d6692f1557528c06 +432: 82dd34db76d8eac6badba158292cf14249f78c39e27219aa8438ff147d6c3686 +433: f71d583756b28252c751cc4f86b96ac2b24fd3edcd87c89920fb7cabd84babac +434: 0c00bc0ff60cf805bf9f92df1780f5966610f24352cd533a2988dab8d59f4dd6 +435: 52d23dc9cd06ac01737352ddcf5240e911361c21403b997b417476079db87454 +436: ec9c3e840bb9068563e655fc0115b5f2320ac1e26e91bf6af4d92512b1191a99 +437: 796fd5cea33f547b238d9c191248348e034ed06f008cf8b4bafc428a52ba9d04 +438: 400aed2a17301c211f09c92449841d9bc11246db124d6f1f1c584c0589116434 +439: f4c457c53d3ab63c03f3ccc4a18a9e45682a9dbd7dacc809fbfd20a2a7e95bec +440: 3c24b2f357d6ad70a76da8629813ebcf1a82b5dff8e73f4903709fb4214f5ae6 +441: cd1328d67eef562365c873d1cb56eefecfe886e6e6197f98273ec2b2d642168e +442: e36b514415523ce85e7c285edd862b158e60e5eb47b45d4b3c907a9cab4e6015 +443: 0cb9c2d05d74b1acc77eb6c71e8dd69d2b2788ff3e1d40e214694abd1521121e +444: 49d7ad342aa3876e558622dd03938a6aac258784ff02d1c474ee3ddabca6bb46 +445: 15341339c524f870272f562886acb9e8237330a29f89038e61066182d927fce9 +446: 02488037fc6e3b89cf003af6f4ec63ed4203384266c064a7992e0c05a4bdf14a +447: 2dad5437171fa3401711b6fa7b4774ef6c5ad2a8070abeb6229e658ab3bc04b3 +448: 2b93fdb14add3c52d2519a2fecdc906893ae77ca2756ae6290a62af5ba0330ca +449: 08627f60d00e95c42b53bdd5eb8d08b9360fc1795191525cb5f9ca9dacdf4dab +450: 76f89b17a70f96f2fbb35119211f070fc6e5d71bf75c2b60596d6ae277ddde9f +451: 4e2319c28de62374e7e20f639ed19df7dd0208b6fa729385d8a97b7ec0085179 +452: ecf6bb771055ffd58c77062f15611853f496708608065ac61036d7e01f50ba4e +453: 6815c2382af401c3f5b65fdee1270d065bd53c38eda08985fa4699b02c975095 +454: 397db724108990d5a402ddacc938debcaf8b3f9b467dd76110a0dc146b451042 +455: ff534e92474626cfe49c76261d074cbc93c442f9729f6052119bc2c97ec27f0a +456: 78e86805f8b263632bbd8fb30f3ae913fe5b71241ba701665b7fd73a9087d9ed +457: a8badf35f8fd4168f41779aaf5db3b51a01952b731ccf0ab04d65924905ae4a6 +458: 188a69be9bd313c3abf0d2c9f86654cf1e56add4189cc9413456a51947b421a6 +459: 8af25821481a3fa7137e3d957c64a97d0204f9861bf6a8701fafb20dc4baef6e +460: 6a8a04c755de9c6044fe243e31b45a3d5963f22c5323be74eb04965ed419aa54 +461: a817f1b7b748b0236c255df87d31be1dcb5b4499992de7d9b9ae0d259ae91e48 +462: b7290cba8e24e6b9ff81fb5b914dcb248a58bea9b021ac625a7c9f29c8a3ad8b +463: d2e4f2a835d2ea8e382099975ddd354bb129019f61b9d56326386f5ffbe0c2b2 +464: 54db5f0f6e4746652405abed569c91282193261669c7daa31e8e649f3522a79f +465: 50cb4b5862df24e4065c94c71b27606a3f811361ddbaa2664aa7c88dad151173 +466: cadf8e317c0dd6c53d36b99f832a30ae150a32c1d9e2a95e0dbe9219fee60e83 +467: 29196500ec6a1375916b0147c353b8a4921aae592f51fb7b492c3526c2b75139 +468: 7766b257b8e202072cc2d65999388f60f55b30517646b258bb5075845fc7e4c5 +469: 211a46ca3d1280a830bfe997fcd7fa606f56547fdad9a2141e87b67af443495a +470: 18e523ef28da5d53433aac9491ee418c7785e82ba8b84c9bf091ab25a709ed10 +471: ca746cb23c094d3add9a0ac70cc966656563bee80fdb1cd9d729a69da2f1ba34 +472: 87b9a1347f0e33ddfcb4f618a3701d59b57d6394d439474bb7016d427fbe276e +473: 22bc2c81b6f94c84ab0fb79b3a7b2684ab7e8251caa08be6b8701aaab24ca5d8 +474: 5d10fcb4b8ac2461185f5417f5902b4c000cfc73acaff798d8521c77456f51bf +475: 8141b5641ebc92599e3f5a7e14546eb15d2fa8a791946bf0a84657a346525cd1 +476: bc82d29fffb497b8c2a9fbcd2e95b85fba93cf985cdb56461e59b69ffebb7f22 +477: 0a57dbe66466333ec1d7ebdfb6100a903697c45b99e0ac3f4a659ab368ae1a85 +478: 51ce84d63b52a81becf17ed59ae68be2ebd629729d5d4d5a2f1583d744bd2a88 +479: 48aa59c51a05b0a5e61ecd89c2bc8eac6c10d05417ec000cd7580ff52b4e81f6 +480: 16f73e3ade83ed3c9ef33e3c0c01a5686b33a05fe1b18308e823bc2e504136af +481: edb9856e42e585fb13ed96b367364f98abe4de71e2e423d8fe7c6de5be223345 +482: fcc764222c981a04504bbd3c32bc7727600b5c1f9b386e22a226a668dbda0c87 +483: 1981e5927b9fd162ab0bbb5a365b9ed8e247724334fc59ad28e394a6c4be899c +484: 90cbee09dd7935d6837b9a1b67f9405452603ba5b228bf7a8549a2abc78fd255 +485: e504621151f680b6086984a4ee2d15857da704a659974af5ef93be2d1a9c356b +486: 203bc8fa7a5c11b2eef3e268df252033193381dc8258ede81e88143ef23a8b5f +487: afe30eff8e40220ca4e024fa0b94a46fcc42c0cb55df68471665b27732a60a59 +488: 48fee4b0bdb44c09ff517e0bafbc35c7b825379d3ae21924ef0a44433b6a0447 +489: 276c7d526581af81956eb0e247e55925c069a843ff139bc2ec057b5b2293b689 +490: d238303b4abec814253fcef18081a517c4ef3608cbe6a4101edc61c7c70055e5 +491: 84a409eaa8a75a5c91c97b3969d0987dd9034901c960ed9cba49994f0bd8372c +492: 03e947ec08b722db55035664aa0342bbfa6758bc164914365775dab315bc4fd2 +493: c23338219a7fabf5220ee25cd9f033ce9061d7d5bcde28f9b0110a8d43b3ebbb +494: 092bb0db220936de15bd23e6aa1129c52c6b7033e6f801f7dd052bee713456be +495: 5c6f720499c979727710b23ef59996f4cb44e39a95aad30e1e395f05722dd749 +496: e6f72d91a5b12e3740837467c1f577e4893965d0bcb1d5b56dd2488a273ae016 +497: 1d8466d5bc2c57f3d39b4aa8fed21acbdeee64edad2f0b62de769b4e0822edf3 +498: 9f5ded99162815de77cc21dfbbf69a3f96e9a7b6b2c86f50b1c511dba25360ea +499: 3b9fedbcb2d3e8a6a4bcca281e409e1dba4dd05adc2623390f68956711cb9c3a +500: 7d1b86dee381d8053344099d321854dec6d1ac7e7b7d63e587211a3c23f4e72b +501: 4695651d56ec6ffbd43e3b8639f1b417806d9fc8af1ef6ed8d08e644686c817d +502: c48d004fb14c505ce06d9f421ce0d35656c448d631515f8652ce931c1d4f8eb0 +503: ec475e34472eb053e407782d27b173ef82c06d3088270b7da089f7c7e2cf493c +504: e5ba57405abcc5d8e5b79013f8325915fd0cfa08a59f3860b83460080c3e70c7 +505: 94f3e311302ed65044838b6dc97d51b414b5e7949ee23520a9052c21d486688f +506: 33b34f47628081709b85af96e54f4a94c882d06efffd34ff5a5169b5751f1af3 +507: 8c02a790b27b4d6e792db8951dc9b0f1f48c0e1338efbedac92e485a9c6e3df3 +508: 6a52e76d0066a0b76789b0210d26d8812f06f7c8d7d0a968d901cc16800bfcb7 +509: 2fad4c278b249feb6bc654c7f80bf6c7c084457980ea4a95b8479088dc3ee562 +510: da0583e7b44f358b26a83db200c8793f60164347410f108951816718d55b040a +511: de11abe66ba38bc11b0439129fb6ceaf39948b27cafa3275890cb05f2a805f65 +512: d2dcc2993839741afe2de012f94b03681fe5549ded0ee3316e48b7597359dc69 +513: d88520e62209cc1fde3c9b16ec40ddcba1b57f06bf9a5146dc9014ec446e6f29 +514: 242514918e564473ca0d96285b7ec23bb5e106b86977ee72cc5fd49bafc2ae59 +515: cffc937d5057e24f8365f89ae7b2b6afa8c8bf6ded43774342756572f2a8120b +516: 05c1ae4da63b088c7a6446c94506469f83f78dd9fdccf0ffc554a0234bee96a9 +517: 6b837bbe45a0392499efcb1fa9d0a183fa265f259a0913a685fbb6fbabd9cfd0 +518: 0233c64a15db203e102e92b949ff8f5687f122b73a6098d873995d3a69f3afe8 +519: de996204b8668ea35758f4a434a82738d2e4df397d56d5e44edbf75562967d9c +520: 5847a852cde88f947554f4ec2e0f8df4276ea4ce28431dab17b849e820069163 +521: 434b92148bbff5d2286e0e80eaa0c4a3eb53c7a666ba23777e7bc458a3201ac0 +522: da5a927529243cee03f6c1398e41447ef5bdebbf61cc25817c688005d45b0cb3 +523: d838b16255c39410f535eded20ae4a2a14ed4196bbdc272c4ba13de25217329d +524: f46cee99cccb920d7c9567e571c793ac3020adf9502302faeca2c0dddf1f08e4 +525: 1e5c71266cc073d99f10093786d1d141770cfcd510431870662fa857dbaf6a5c +526: 602ea3fcd4d90de7a8b5dfcf65a61d53328f2edadbbbf14c62b2a6f9c3213a5c +527: ff707c27b1d462f2cbd191f8555d2bb197a24480ff61efd0ce99b521878afc6f +528: c47995d2a690c25de33d55754d77ba8da2e841a86abd46197db2f5863524c78e +529: 89b542b5508c1821a670a2745fef3b56b7e9a0f8aeb2f8bb2149e90c75e2139a +530: d5b89eaac746528526cef9f99a3bfbabf9ce9b6ff604c1971974c8d27442981b +531: c9cdfc6cc2de550a33ce68f4848b4c619f0b425b699f2a2b76d2db475f6f7573 +532: 9600f94b77994e18c362504cc144643e90419eae3f468d3ab4e390e429d0d5b2 +533: 7ce9cb9bf84b35a763110b7f66e0be7a271371a78a5376712c19447534451db7 +534: e9a8b50d03e1972741424c2c16b37166fd2d8b6fa17d6de9a0ea6d5b500adcf4 +535: af46270f70661306342e4d96df5f73c51be87a7cc9208e31356129d2d255a9ec +536: 0b84feddb3d62c3515b4e0a082f485313a7583d1e69d28f5b56928b177bde02d +537: b78ab7ef9a782179abb877115e70e9ae8a4df5a2532bc6d70a49137524d18c0f +538: 0eee1d4fe4ba096f194d4bfa30bcaa12cd5c5010b42c81997034a8ad71de5738 +539: 1d750f1fd643cc8cd360ac7ae41292051c7aedfff4ded6b61566739aa90890c3 +540: 38feb94cbbb3637ac27d561b97274ce8340d9f49617cefee8884ed94de6ac579 +541: 67d18d9524de82f3cb9048127d4c429f9d4b33ad3a9aa99ce86e34bbddf81488 +542: 24dba4f062cce959ebcf758e3be0363905a80b191835bf4333e5c572c085ecb5 +543: a0945db8081383cfed2d66fb9f79774a953ffc9dd6990548da55c90b800077c9 +544: fcf77a9d1f6c84048163f9f1ba21eedbef74dc62c12505a23934b8637758fc0b +545: 6768ee1dfc4d9aec0fbcabd35ec91642bab1782d5b5512fd1e41bced92cee73d +546: ca536e3396347e0495b021e2e84003985d9304360c1505e0031f6c1e5b6e74ee +547: 6dde51e539def3bea08bec0d63d740dd61b66fd16f64296609db33103d76b7b1 +548: 28f4238ed0a8e8eeb50b1b49bb0017a5cce0b2f42816caba49464096d602b8a1 +549: 173c9fdeabdf4be0e5b8dbd4784cbc808e093750e2397388cff3c5979d875ff4 +550: 99a27a37ac53b36ddec9cc432b16d44f596d7173184d0bbdf1547a4e04e3a1ce +551: 86413f744576d0260415fac0247dbd61a3867fd329004217a9141f2b0e5bd2e4 +552: f2f8c905ecd61ae2aa8de239c64fbd7b5f0c847ab18e56177d76240a626008c5 +553: 862936291eebe5ecccb4b213d74c9a7f022772fe1add00f7af5ac4ff6223e346 +554: 0c47fb1f36affdec39eedc88fe9bc3afe65f910047fe9677583d109837da43c8 +555: f7cc0f262bdaa131c9b582d8ba3543f4de14e069eb8453b9c6435900b2628b6c +556: b5231f7d4bcecc3cac63cb530c6ae7ea7560f0c27e41557b6ac1146a2c1eb568 +557: e8599934318acdd2ef5e7fc634960d76700c92d313dda306c2cb17515a327c3f +558: dbd646fd923cfc9b10ae498511d6f131ee8c985060590b06ae3678fb8b46b5c8 +559: 6d52ecb66f21882690258d77f9382c35540363077fd6086fbe4682a84eea11bb +560: 07d78a6e3ea3c7f98de73559adb9e489cae8af8607a1fb3d79abc150f553319e +561: 4953e8f819a2add9b23853b06bb97e26c7fc49acd8cc1e0b4684a5d766f35a53 +562: 781b2f97f00f73debc515a175ba66083069d9f1506b4d6232acfab6a0a3ba939 +563: fe3ea15a76ef7006d987d06dca3e0f25ec94f0a25fcf3b0ef7240e3d6c47bd2c +564: 7ee11817f2ca5f9a6b0d7372849ce31baa3269e1b1780c5f1e0d80716c357088 +565: fe2da2c4071d83642a5720718e49aa5a44a5bcba7e8f8935f4021e0955436a5a +566: ae74a9faea147eca57ca27b6e735eb1aa8ece530448730c99871a39075870131 +567: e3464d5fbea3f20e2b73f63be61c455ca0a518f989b9d18ada7b790dbdc63fb7 +568: 6b48f7b2989583e8718603b3a62836a99ea5b37853d7bca7b70d52efedf02d73 +569: d460ef41f4932d9f4b1cd07da8f935b6fdecb23ff8b269c80e86bc7525c6f72f +570: 64ae878a73ff936644eeaef0338138b29e0a3708bf4e99cbbc654b94c4f172ff +571: 1a4965900231ba33d6d2a629c4eea67599342d97f9b0d859ffda8892f51d0fe5 +572: 105af97fddd8f0915dda627d3c122c7866b541d6a39f5ad8a77fa648c222ee68 +573: 79502abc9bd09ad2f2a3e454d348723a6ba623fccf95025ac9feb0f9de4db246 +574: 558fa2ea8d21782f73c50ce20441385feab4e386afa3359fd035921161dab934 +575: d8446ce7590ed28036768d268431115d1c8118bee49c74bf6f1181611acdee49 +576: 9b4a90d2d7654e229dc2035300ea60a901c7bd96649bc8d5aca1a738baed038b +577: 798270bd135c927db2e94714661d36600c8d66ca3060acdc991bf42d918c079f +578: d7120b2db88536e9934d96390ed9ef1eb11ce428d0b2b1bec41c8b1fbe51110e +579: e001c6c8468fc9caa9c0e42a731356aef769913b105945c498efa8c95718b06b +580: 0f62ec1075014e7e869cc697c5670bcd4a669c979a8cc1dcaa38e41ce67e296c +581: e5ac3f8d559a392edbd7d6ac10a89f2f09808f9eb9c720189040dbb0f87a7b60 +582: 64e2b58930dd78a546bc5b7e55f65cf44595435397f5253401d3a31e0c30b317 +583: 263373377014da213a97247cf6506808d90e15e1af57d5c13d8d53566b5a5461 +584: 9aa6715383e79f4a1ee8b8cc86f128dd84a4982d3c5a6f156b31e4472737c83c +585: 1925d844b25759a842c33263f155d29878b36fde630777ae0a97e2fe85cc00fa +586: e9e11491a037153d2fd0853c8eb489a6bf5fdd97c951c2b3bad7807a12f2bbd9 +587: 3d2e8b0160b56435c74603ff172092ff34ec4f82e614cc4c445e162ea9e07ab6 +588: e99ffd1b1a61b6004364dbe66570f205dd74e60843cbd9e43dca8dbfca625fe3 +589: 629630ff8906d7c13cf9ff64a0b427ddf9e8941647d8efa200b38565f80e45f8 +590: ae56197bcc4790e52ad8636450e7a9c6011cc1b1b6571ffb5922662935ad5e8f +591: b4f2c342260a8b77d6a4afaa9fae0421bcfb16256d45ebaa80f658a3270b93c7 +592: 06b84e9eaa313e7381f3a25a3b2ee71a0e058af2dbada33c08efdbeeb6a4fe1b +593: 9d45e4b82e1f0eb022ecc8dda15b45e0e23964671eafcd7786f44de42a53534e +594: 6ca41d669a06431c20f359eb53a00e8e40bff623502c06975a53df2c24ad2740 +595: 09987c84090b121bb669491451fd36981e35059a315bb3510b2910e5cea7b703 +596: dbd7606eaf66ce092f8df17a864e7e58a82950c0aa4f59a2163e2e0b98e05966 +597: f408448625e8639af09d36d1b0b4a8475223dfe23d9b13c344f6efa9b0d79b55 +598: 67fd26f76aa8fde40ea32742e9564f318e4d30393c8c8b3efc1874d361a0c677 +599: ca232d6b3a3cc9555eab03a3023cf6957a95cfa1d7675db8ca191c5b31cae03a +600: ecdc0f7a4ccecee888019378fe1111b23e4906da170fd1e3cd9ea1593f941cd6 +601: a2c19a29adae2d8a541915b310c566d55ea29cc7e3ac91f7fd3a88cce40c39a6 +602: bd042cabea0461654574055fcb4214f45dc5f7cc1d8aa821e259267d86eb8c52 +603: 69e0e38d26d191529a5b11f19ae3c78c8909855b6bb31660b5af80ddba964ef9 +604: 7bf4908e45ca86a3fb79c7e6a09f604ccc9c557974483aeb5b8f473e0c3f0a38 +605: 0ebdfc4dbca222ec3f4209d36e6235a433c2ec5f064592ad2724107ab6d2abb3 +606: f60e345855d5d683c432900a9a233fe853b812f6bd8446601bf8d410c3e67c36 +607: e4d5c7bf1ca47fcd5179833beb7a8489e910fbe93ecbc34a7c912c358b45bb33 +608: f9f127ddb0330d7588f3711a22d9372763b4661c63db217e1561c3b6ae45ad14 +609: f0822a7a0511193fd6f5a29ed39d8e8f737225fe3e7d8d90c704a032290ed1df +610: e07fb2450d06ac2305eb3fefb4b16b6eb3996bf91f98df58ab4af7bf4b24a5c7 +611: e6b0afff326f7f36b65b095072a19b0e104cca0dbf27529a7f39a0acefe8b3a5 +612: 30bbf45da7bd0d24f706803eabbbebbf78fc67f98e0af4d68524025be2de183b +613: 9446910610590058b8b7a5079920d545e633b7b7a98a114303ce332e34e1ea31 +614: 7a11ad209cdfd258c5be5247c594103ace97affeb5adb140b3bf4b9a164ab4ae +615: 561775fa45d789a4912019093df2cea17402a556110038b90fe8901d3ab910f2 +616: c40d48d0551a2fa949c0c19751b3ae0027ee1169ad96e9dec2bcd06c6f43bc0b +617: 675519f03c8208cce08fa91f718484864504085354356790c058ab9aab3009b2 +618: 8dc12b12cd525177c298c4c925748af02ebf14b8dc5feaee4bfb75c1218bdb9d +619: 62cb61ef8ecc400740115f39bbfd492232761effd72f67f2edf7a4943802b7ae +620: 6935a0079903436cefe716a592752a3941c38c6fc81a52b70c0d79213d157583 +621: 42e01b526623a41ec90659f1f3e7566c07254e21e5c3c4d8ec5d63d99a3905a2 +622: 8e0d64ed83799c1081e5eef417e3a8bf0e7b33f7c3458896e568cedca96f4b68 +623: 16854b1163fba8b8d5328637af0d7834b62318e11271f482bf3b31309bf9c89c +624: 8cfe1d643d67031da6ab55fa27e2017915466c5775822ac29bb303bb18f61830 +625: 1dc6034d71d1f5f1459607c478ea4aabd826e50c59d891a8cf36f6304053b478 +626: 2aaac5bcf9d5587a16a51d1ed47ff084105174d6b5f2ddbf2cfeef6664728970 +627: 61508285a773bab75cebfcfe19372867f10f80195fd58f4e4b829f857d769aa0 +628: cd700b9475056cf381f9dd6ef52afcd9868aac09d0c1849255096cd698851b5b +629: 9d74cf92c621a9cd48e4e658f4a01d2c9b245cfb616bca6247e0091e7533a705 +630: 6243a40194637f3bd50e96d703b8f5c7a4f60ed7b71da7051b7abe4d1155b229 +631: 06fa690518c85c3aaecb3ebbf5fb049deeb95354789354e77f0e87f714589f09 +632: 5f359792b9fc023075e078126bafb2630c07c55cac746cec7b24dd52b55e5493 +633: 7ca64000ea0cabc0bc80372a13fc49e3e19372072378561d69ecaa716cc32cac +634: 973cdfc51bee2d6e46eff4ba47f2f8dad5edbd278256a98383f3416ee1ece09a +635: a906682cd85185924191c3873491a18b134f371b3de306946e485cf2e58c04a9 +636: ac11e1fa3e0f28955fac401f434d384a6490c7b4309aab903d6fedde86ff044f +637: e95a1d5e94da3939a9ea1853ca677b7b4524636ba85ba6ddb3889337fb6731f1 +638: f91877dd03a80fafde2c3a39eeda2ecb4a12ad8e308b6a1df6a182580bcdba9a +639: fdcfd665e5ec4e69f48a8cade948e319b79388d3f2ff21d99d4f96b5c07e2459 +640: 3c65738454971b3a3f7df085a917c24243776ccc968e2ef2428f59e9a0519188 +641: 13c90cb776f1531391b36f927bbb760e29dce4384a42f6b071c22df66d06568e +642: 9beea97e1746d96db9347e330df0e92b5e05efe2c72f5b0a0f6e621d39fd450d +643: e3ec99168ea8353837cfea97f45c3cf297805d1cd3cb46ab54bbb35d0e82e828 +644: 1844c799ba1b7f308969f30f2e597974cdac7cb4ab8c027f82c67b7bf09db7ff +645: 40eb7652ace2dd1ba383972f70cfc3eed35bc85260cdbb001cc0e151f7edfff4 +646: ce4167189ca6c39a025e4a749ae0fa726406a71d6a0c4b10f266cfa6a9d34ccb +647: aff90a63a4a5e46e58d9fb16d33f06f8fdc15a73c7c690dd02e7a9f4576dadcc +648: d842bdf7ea299274d3bb91fc362e4dd4f3c28237e9d621e0f97488afa9a02369 +649: 18601f93b8240474442b832cf1aafd541b32fc47cd024bc626fcc850fddeeb55 +650: dacdbf42cb89fceb79d1d8bf8c583bc127c42e22c7fdb7fcc38ddcae39b1f62a +651: 7cb09fd65dea49174aad61b0cdc7c53e2b4d755816e1137c52ef721ec1b19169 +652: 8be09d653c065e39f84ba4312ff40abc6ada795ece77880a45579407c9bfdd01 +653: 41cdbfc8df373987d7a4645cabdb323ef92eb2e149b95b1cb389352686948c5f +654: 54dff6778bb9a8737f1eaea2247731d70620b74d4d2bedcc492a9768cdbc1e06 +655: 1ef22db51009e59fca54a417c071def94551ecaff885ce191179f2bc486565fd +656: 217294d1818c40457dae5f3a19368972c7375dbd4b1208c62f024a31ce3887f9 +657: e0d0f7c5f46849f29808d598cb9b08fb2517fb38d29a4ab1da969d956b1edafa +658: b3604457af6e43b8719e214620a6ce14f8c22c60a608381275e5b376ffeeff84 +659: 21e6ec5256747ee8ed0e1e4f6d461f8e72e5421598460c0923984e310eb5b3a4 +660: ed4acf4aba6c1f3a7dae1f27c14f298a7966c444e8c70b6ce1ce0c0b6daf2a41 +661: 0547af4c292895a4c18d6be5b2ac9f862f363a36bbfd52d46adb490175fb55ec +662: 3f08179b52d97e7372de73ddb39cd16211d212b0bc2c1790094b33781283e1be +663: 37ad8e73e6a01fd8bb930cb3fd00d43692d8c83d37b4ce6602ee531b282c0075 +664: 81b8b053eae44bab64dfc2074c706d52c748d75cd6231029e9f88e08dd670272 +665: 91e1f3207d4b0f56cfe64aa422c06a4245d701529df5d55ab419d5a51e0cf122 +666: 55bba2503739c92878cde322151f1858972c3ad0cf96c0eac0cd7d6c3b9e4077 +667: 1882000b8a909763214eb3116e4246c9ec71207a3c306d7fb6ee3ab82de42ab2 +668: 4c884909e219886a50d8100a12bcfb356091076fd6f144fd35b6854307d465e2 +669: 8c0aa56a953a170a3ff4ce778e7390362516837dc29bdfcb801a13f45463042b +670: 25bddc5907720ab48ae5b6ea70fbb97a387b1cd5d2a3b6786b15270283f2dfa8 +671: 872d1272dffc2f9ab8742a08a8ba2d38e49a5a6fca74ea6e6e60331ecbe39137 +672: 25755f0de23d9e58811332e75584370259973c264b7028e9f68bffb0d073e52c +673: 0b96eb45fb17a8a80aa73a0e7500e038232dce2269f9abf2add880fc4e2dd081 +674: 085954a53c62269bdc9d78c7c45ca58f5c0220f224c7cdd8b7bae4b6d0fd5fe7 +675: 670051db6c0fb0f947f5d7a11d6bcca2f73901b7b05662cb238cf04ba0d9e556 +676: f8f7c37e0beb0b45654e7f2f03e5a36b86144e5bfef8c580e1d12e6116cb62de +677: d657facc720b596aa8b5965df5e38ef9106e0db6bfb6846e4d9a8ed8900bb8a2 +678: f501202de6e6a53bc96325600a0895f830ee20f4b03d81f98af56fcdf7605f96 +679: 558f0c67d147748bdc5472f4be0584dad452cff1ce1822f4f1ae2355020ff9aa +680: 09096d4a259c1c60bbcd25563301520fc5707106fedd30aa757f8790bab07d25 +681: 5ae02477e97e3f282a912fdcfedbedc45b6f48db463bf1a00e6208cf3a8bab6f +682: c2ae4a0b03e6bde0f10f82cb3b74fadd3952ebf9dcf8eabb3f24b2f4e3e2b0c6 +683: 14af46432e8204cb27f1f37d12605f72d483aaa58164e16a9a0318bc6da38abb +684: 9798e1db236fff527fea4b493d38c7f13200a80c20238dbaac17657d1c8331a9 +685: 6db3cb731b30463f68fd3129da52623d09a8c0913cbdf45c0ee680d062b7b014 +686: 7630c889c0ed3cbf196c307a6b13b5314c35f8e08efbfb85680aa8f56d8b4073 +687: 156cb56203ce9103881c2f173ef69dcd31e374dcfa00844d909246e863c9ebcf +688: a2bbcaabfe54517da51cbfc527f0e5768d6aecd5a6f71c4c70d90ae3054f5518 +689: ec7f5af5f68937aa3bb2e29f89a76c110bed1740ed5cddbb31a4bbd4d8658c3d +690: 7b1e011cc68d027165e019b9e8e070616cfc4009d56d366eaaa4cab247b423ea +691: 6cb2221d41e75df3b985d2647836a26d08f78be70b7d8028555b1b82dd17b175 +692: 7027e565c0e317fb988f6954622a47a6c03e5d6ee9b7f38dad7f8a01ba315887 +693: d329fbd15068a51d3daa23ffa59d8e0d5c2be54535eedd0a249443bf3111059f +694: 058e67814877f19a4d38f3578e63ecc63b450763cceb5f93d6baf6708c6165b4 +695: cab5ae80484fc8573e274316d10e2e6b71d64a5495b451817d59d37fc62cc118 +696: b02002fcae0d4643be5940d223d8d22029fdacd277d153f4833c10fdf502cd77 +697: b245a5c7d95ec8c1cf1cb22dc679847b982d55f3dad6add28ee01b67a6f41fb3 +698: 3f388119f98462ea94fb56e55862e083bd3f859a02e3ef23f25c949cb9b7f5cd +699: c381b56202caa27cfa4e42fec6d238310472bb8e871da0cb47082388de7783ef +700: 0193afd46bb14686ad253297bd7f1083ad6a6940557fceb89461a9aeb6c3d47c +701: dcad33f663c6716db58b5a94edd0b758dcae719b37cac7e6a58db609f9b9667b +702: 551004d18fb394492e86ff7b76c1ca7bf4c83dff5c1ab5535428f217a14cd602 +703: 77bd6a37b0aff970095be63545ca1cf02e28e282240d1ade1e5d080a7c92da12 +704: 902fe8b742e49a4e68af91a8b4c0c78978bdf77855f5af1a010538724194fed9 +705: a1c9180fc41e810a19223ac72f897824ac6d2f59c2ea38cef85917562145ed55 +706: 341d0a96981cbd4347eb91fcccd144f35a7b0967dea0d6c64031b8fcb46b610b +707: e1a629e9a39784a0c28e3dbb2abcbeb83b07680fb17d410d1b8954ed6ea290b5 +708: 0d781c220748957cc95d3153d4b247a2e9ee546278f06e4798bb2151797990c6 +709: 63912204722a1754af57ffa997b549db1ebdf5433c1be42e6af6f9ec482ddd90 +710: 0f61dc240b6fd221221b377f0345a2cff7f13da41d4bd1696c81cff5778f1bec +711: 91ea7c1927cdf2cbb1263650afb35ada8da7d34d98e2686c50962b30b1508ce4 +712: 6e7c14bef3922a5c8a11953512011f61f75509193caf284930a585fff49c870d +713: 99b34c9fd41ebebb6076b75ab3b22da39a9488e4538d6fc016e45727fae8572f +714: b4259f3d957f9561144098aa8b3541731155806ef06b403c2dd4ea4314e19fdc +715: 86e328d35205220f7befd72634d61c329f56a55ffecb247ee83832dd1fe36d63 +716: 6d3386b03689e959ee171e2cc6d3ecf9b250604f34da80387fe1c3b139b6c0ec +717: 039f3c02d3ba2e24ca8a6057272b987e2e55acb88bde7dbf92ad36c49bfc9344 +718: 715e95be267ba0eaecbd230f6942a1eda2d4d8ff36c8b72948a7f721ffeff3bb +719: b4ccb610ffe7c154f7f1d588f597294d2c68c2dd725ec98fe03e71cabc37cdd3 +720: 8bcf65644a63c50a37e09e3cbaa8d771ab92a0d71fef5dd94bb56a001035149a +721: 0993cae164b8e0ce36eb6d4bf7dc652106bb97101a8a7c45ee4dbe929c6052cb +722: f4ddfc20a477bb8fc717d7dc31d195aa4dc55d420af8999d5e40de5084c63834 +723: 4ddccb7c7b7628b354264d7dcfeeddafc1bf51241a20bd8b514852662ffa6e9b +724: e2de5267f2e4cb47946435c2ff943e5d66f7aa9d43497e192ed184cad165517b +725: 9d15b89c15b2db62cbab5119fa15ea4dfc49c1523b10916af61b194ab61488bd +726: 87ee80452ccbe78c55b2a7617c8aee128648f22c4456e42719675cbb7b506af3 +727: 4d5fcb9e907346e305ffc20fb57351f3ae2a43211c4af10dbb1e378b6220b9dd +728: 8129ada76295117f5073c4d5a613d08630d91dfaf2777b13ab99ac4509a1f6d6 +729: 5c5c1f33a4c0ae21c072d8790ea0fcef957db8f4033198c0cf5d0086d158611d +730: c4586915ee3ff4e0547d29a546f03d197d33d9f0bc1aabf2e4c0db19b87afe6a +731: 665fa3786202ed507fb2df7cca87dce2c0be5f4fd125dca54e9132d1c0028acd +732: ace821e7584a41471b2e555a1c96384532211f6709d6301eac0622124684bd48 +733: 08633271be3a0ff80987897d45b2592ba11d3c482acf58b4ca3fba1cd2964582 +734: 1cd99f1dcf7cf5263aa8513e11970c77638d936978836e255f7be3dd3bc749cb +735: ce55387875b7f7eed70163b6fe9a4a07f10595fef4d77d0a572e3ee4917b4d5c +736: 9c5e5dd2f19515e894c42dc959ede7f1a0e818cf6a4289c15f54d25ca60b8f12 +737: df6af50b0b22b3d9253a56ae486cd14622268faafa94a25d34a1d1deb23311de +738: 1c45ff7fa7e20297a74256d37f1c518e3d49c960a847c5a9fbf89e400ad1b289 +739: 13322991f05eaf681a68cbb4978dbf26a12c1230ec91654d9e46169bc06bf181 +740: 7913ce5febf072c698215215b7cb4b180a9256e0ed63d754357899b2468f3134 +741: 46e44f2aab1eb83a979dc3dbbec17208dc26fc377899c2f532b5674da794e784 +742: 6af8e641c124bd85b05ec7278aaf1a8b4db3ab804a7a6216f83c399c334f1152 +743: 9392bfec887e2f83109c3b02d2095ec5822917304eaca799e3c9d261d74018d3 +744: fce4ee633e07834f473aa58e0044394aa1105f82931a2ea5f50118f16e18009b +745: ef14133b9e9f2f00b15ba3c9019fbd27755bd60e25dbea93c271e55337de66c4 +746: 13f95c9e923fc103eda110ec9cdee367d01daa39934f4a98e2fa4c8d508a0690 +747: 2b5910bb1e516298aca88c502c033409abc506e4e40adf84c58f737aa02fff9a +748: 010ea00917ac8f13d0e9d1a699a0b4f970d7a92f5f0676bfaf4734ca6fff1f63 +749: ac22984ca1e9bdecf3a8c81c4f5d8476745c6d44cc4ca3dcaeba6275bea17497 +750: 018910488e6cddc4d3a796f5bb981f456a049b46b5e53fe4dd90e55b54796d4b +751: 2f06445407652ac9e9af69570fa28f06179da64b6f9005f2910da20d1747b568 +752: 17c32324ff9ca42bade9d2da7edfee2b5088dc677c5ea0883b515a327b3e675e +753: 640a7770cc32e92ed3e1412c79495a3128b4928659f1bf7d9ff20e53e3dce174 +754: 7f8faa738137234bff364c457cbdab3b9bb2178b5d59d7b67584765b887ddf47 +755: a1564dd109d9dbb882fd221404b402ca046d268f592ef0db21ceeca9490f1d51 +756: 36dac69112b7c69315b52652f5a013bc6b6d4382e0d9f9681a34691a7af5bd21 +757: 1b8753eb292930ead17fba8755a8c6fd2a2cebc0899bfa0feb2edb91f2783feb +758: ae37c74438422742903ef30ae9c0130e4c860a2f11498082848edf6b15996bcf +759: fdaecaea39e2ec984e8c984d85292303de1e2ec12e0b75ab990bfa7e65a48c88 +760: 78867052f7feaf352e97dda57e7792b883ececc33790e47e761aaaa7f847027c +761: 8c73f0f9603bda755f7fe787d4679a2c15a133d6beb2e2cfca4706e992080e6c +762: 8b3ee45fa3a6cf9edca4576c028c9d28ac281f5bc69df1732e2185704537828d +763: 5736c03e2e08901bdeb740fc2a11697366e4b071e6a611c3e1b0be171dfb0c7e +764: efc3d8a8cfa82ad2b91460268ea2181d7043d9ae429f31cc6bf9dad560e01b88 +765: e48a56496817eea0b94249f00d42eb31b1823c700cfd503223430e5377b0debe +766: 0c0a87e714cbaa1b63d56912232130ff3f96cc91e332e40a471a92fcecba5b81 +767: 9bced3b9012155f5281cd83991fd328e15bb791cd2f9101c515633b1069c21cf +768: 929fef1fb81ef39d6f0bee50792bb01bbba750ed95359dd17349603d5c6c9cdd +769: a0298e71a6bb25d843f0a486c84b8af2dd96273939e9878de824dab5c6d41454 +770: 779c19bab13abc41e9398029b1810f0deefde87aabfd55e909ed0931b72f06f0 +771: 88f1b56d0fdc5f50833214e9a7046a980a84726ec281254e75ffa8ee81b24597 +772: 3a7c8ca4b0715d42df6ed02bdca7a6c28831786c3d997485c6be4297152ed0ee +773: 88a0f337b761e71843f41381e9499cf74bf2978a65e5e4481f663c5fa5929e73 +774: 76d365352800adca62fe521af012b686c0b209535bcc4f8b45cc9e728ebc9575 +775: f008acb3ea6cb87a29aaca44df6822d583fbf70d89c20b91f1310ead0d336780 +776: e18850ada303a7610faae0f4419b8b074077d8b382b3519333d0919b56e11134 +777: 95d3f06b9a095e832e32ea5b045de87de1bb3f1dee7aeb90f1a62fe1d8844c85 +778: fa72e0399e52403464714d857bdcc5ae78525e81d31109539ad9548e177878ba +779: 091c9e6519ad79728660cd1411222b96cd9384926c652e3b4fdd99bbe1b29784 +780: 3cd3d2b232a67cc1ef02be591b4fa891d31b2b87127ba63469751afb6bc38bfe +781: 0111a5800571127692423a0b5e64d2de2d8fca7c8a4f893a3a3efbb9ef73d63f +782: d4182bf05526cd1052f743b4d3084f5497e6d752011ae3beb3c884785f0088dd +783: af9f702f77c413a95c767ed22a1a7af5e1951fa09fb921a0c56728a901f88384 +784: 548e7fbc9ee3abef91e8f5d86b9fa2acd18b4e2b5b5f0b06993b020dfde7af2a +785: 76de3a6f51f1ce104ccd0ccfe9cdf2eddf3236bd237ad61d70e16e728f1f8830 +786: c7505bcaf65afd6fd64fc58ba1d0e7888ef4b1bc3c36de89115938850a9ea89d +787: 9de032b9b6d296a31542bb23b5f6451ad14d3c3d27f2f2af88c35a11c9b25beb +788: 9b59e2d98895c363229b3a13175dde2307f5e45e4de48c7e01fe5dd7a66d516c +789: f2290cd7d56562b49a63fa0a6fa75eb43182193e91eafb6de4d5b3a42114f5ef +790: da15453aea57615a06a92759b6906a3b3bfc65a49483f1b97f953d917170c0f9 +791: 7a6cce29f707485231b40c4d0fd2dc3e162dae1ace62e1ddf7227ee77c14bef8 +792: ba476b2558e6fb94308a78b5549e6572d81d7e2b3ebbb42e2f68e595f300aa2b +793: 827e82561dd5149f139a98ae48464c2e61abd7036c3435a388ae437577b98ea8 +794: 42d6226752a305940a4db24e77869c19e6c153a0b7e4409b254baa0e1bb6aa84 +795: 686e8e9fc0e75c0006f3b36cad1f125713d2c2a07162751d79d7b2c0b8d5129d +796: 22c1978979b722f631d051ccf8b22ae0d74c74c4209a013a253f00945360416b +797: 5405d6b8c0a154856278c54d6a3836b372aa166b0deb3185603a1cad0a940341 +798: 400307d1d50fc6132fe113bb8311243c1da0e6b57c78f9e2d5f7554f4e6df07e +799: dec6deb237e7d009ff60996b96e4e92cb197494f0cf5edb5312e1f60575c015c +800: df9fea12bf11f4d9b595455da7c69921f5dc40a427333fa7748fd66eeb017de3 +801: 2042c501563e32a88f4e2d9ef7e66be27571635b6a831ce41b28bc6c6df0eb52 +802: fb700a0f4398225ef5db5dcd6710f7eff80808d3f815801e14a24a61ebc424ef +803: dca2d9f1ba6568ce572ef1ba1fcae08a372b2f485c884860815438c5e3c69b88 +804: 17b3f6f18906ca20ab7f6b011f1cb522aa046c343f5bc04803530cb8537f0927 +805: f888238774bccaef845fdbd2a338831c13090afc7c344b1365e24bf1ed121ac9 +806: ec81d951ac4274fd4eb452baf6c236ccfeb18138429463f8e90d1524da12121c +807: 5cfb0fc4907a831e4c602c82c3f07fe4463bb3456fd6fd24ec78bb483accfd63 +808: 947236880fa0c1bb05b086b2f7412becc344fc3ffdc6f4dd00bfff31639228e3 +809: 259d05d2057d408df0bbede5bf5582baa01339493684d924f17a46b4f5aa4e8d +810: 1ed6143a41a75f6a9f6d42e98a2f29c6cdc935a8a7ff43b8ac59bf20e933f194 +811: 57e739cb621863d956a720b719a76a4be678b0ea731a3b777802b53cf78d3d21 +812: 6db449cca2b58ac27074e003cedac028c77a592d31d5fec2ac90b63108dc2c45 +813: c9ac45e17f6fce5e3aa0a963c5ab2af463422912e5a97e97b969d30aa5e71bfd +814: ae670f4be0ca416bf822562d1c136985473d93fa6c005565219c387459c9d463 +815: 64aa2f792bf77fd23b6d4050076d73c9b2ef972e04de3c4e4b772a75145bfb28 +816: b2b8810ff96b189c18de81253260f1f57d283c3a6d5d9f8d8a3350b7d7b4cbdd +817: 5c7db30147bfd07e81e7230d8d5e559255556dc7889d19f5a1b834ef6de92639 +818: 00617b68f6496cf88cb4728f889534d3b4ff83bc8ef9e214064a4d0511916a7b +819: ebf3905209b6aa1fe732dcf39507258e0faeadaabda8ff2bcbd028c2ee071155 +820: 1ad7cc67a00035019d548ad7d8f01567f30c989f2c02088e9d18c864f7cb8054 +821: 5f12fe6bef45c836311ca3681c08f82796dffbf1e6893272acf26139333a7653 +822: 4c804c8ae2f4187ccc2af13aaca740d2f0ea8ef1593bb2f65640d4d9cdc19d42 +823: 52becac90562e114784b7542dcda300834a4cf3d2289e0203ea9b1751318e94b +824: f318c6a0b5af61b3cbaa5251d849636e68ab6c29bf361e81610d259e5f9a1c9b +825: 1210b493270eb4617cf3398c05281ab67bb2415cc7780d9290761250eab9ef5a +826: 166a3084fc7ddb404d39e4d487881d7e7488024e77c827c86d80698967ef0439 +827: f7e8df8d6c83b694e8e3067582eb9cc4d8aadabde048a3c54894bd40f94b121e +828: 4289388178c1473632da87084d13c09a92a19ee32d085d717ea5f7b15f8733d7 +829: c11fb521a4d1287b82e982531229d811e0cf75b049979c592d48835b3fdc5ab7 +830: 7b25b4347a6cd7f79fe6a2e123e2bcd3c5f7c64e5701474e116677c680c847eb +831: 3bd669ded341ad240b3cca32e2246044e788e92346759c677c25b588d336eb9c +832: 469e448de67d33b679213d1fd4383af4eb663312d2b039aae59a7ea55f47d48f +833: 1e19b3f199afe7bea42e85233dadc186dc7db1c34eb0222c40100443f1c372bf +834: 020b1df2133447fd8d2d1d8caca7a80ba666184c243eab0d52333f026d4c8488 +835: 017f82bb4ef093de828031eccb2e19929839344b00fd424113b9b170081f7d23 +836: e114a5bd110ede150c872c12df640eac7547f2c3b093b4f368ef1b17d5efa42f +837: a36b110e907ed59a4422c82d2107923fdaf8130b4bc216aec7a11ba803a31a1d +838: 01519d8b064806e5da350a1c102d07e94fe5334fe4d23759356703994763c4c1 +839: df4e0927f31ea17664543c2505bfd90f4df67c620d979243ce80e9ce6aff0db1 +840: 28697719928efd0d8502578d1ab317b772ec0e7fce2a64d1a174d7ff6dbbc943 +841: 5aea025c0ecdd11cc6849bd784eb8b591b2d6034dd4c9e11736f623cab205bc8 +842: 21b966650022484ba1bf969edcdb1ec5e71d2e9198721c99df860bfa3320b685 +843: a48629a370e3c8a8ea395c1381d6e7ee38165e29d70fe80074f1553c5ca12086 +844: 8f00714b53a5c63483c1a1ced92f0a7fbebea7e10b27e690b259c58a7e21b255 +845: 4a15be4e2173426025a7f7c2bcc0f9fe2fa070c5ad7d0185b2a7d4a2717b2d73 +846: f6da5b5d72df9883e373e6f7c647febff5929ad666307b3ff838f288fb20021e +847: d0c3a75990e3cd3effd916b8997f8ad39aecd2f40c7c59df5c6ed6ae2bd6ab73 +848: f08583778b92382380ac638e7f86c72549847cf3570ece9f28b02f71e0bc9b15 +849: 3d41f27a82ac10a8295a2cfb6f4422fba8ef5303094a845216e532d0998dd1e0 +850: 2cc2716e1e720a13304be73fe29a4db55a2ccbc95285783744077bef292b913b +851: b67ccae6fcf0d8cd364260c649c2135c606753784fcdab5411915795c6986dee +852: 31542a3723110e69b091960c13f0bb9bde2e7630c17ac9742ed5bd94df12f11e +853: 7b3f0517b1de93725cefe79227f54ed95166e363ed0b373da7274e0f56e6e433 +854: 5a2c88b0d041cb9037cc3bd64022978dcf2d1839b7b98789dca382521f4de7b7 +855: 99fc645dc0fa9183a7cd75ce5e133e3552cd890eeda2d79a6471383965757f5d +856: 8bcf278d8e51f0cdc959ef1f5ac79c411f5b5ff7c658d3cfe4d1312c9ddec0d1 +857: 5b1ce03ec386b8a4530e1c6e9d27c3ef54c0a8da3d2138ac2ff4d7bf89b14df0 +858: 6dd8aec81318cbc0bf2fb60653172af32ff62dd2ff8cb20bc0c1df82ed41edb5 +859: b2b6ab64ea6d8c8602bb063335ec0782c02174dbcc8ecec1d6160e030cac58d5 +860: 26271e73d07a7c45d017b5085c58c42914a74719c8d49979c678c5b4f8e76e28 +861: c6136d39d206890f5e8aa2aada84bec2cf50e405fbfae64b7b231ba880eef72a +862: ee8fd22fa072b9fe159209e4955772e67d225ad2a9d169c30f6e468b5d5b1c91 +863: c73ad82fcd868b622f9b5e136915894739801093cbb84c8849a838d6ebe729a3 +864: bca23c98fc655392ba07e97b3a3cd5746c684f7131be2fc95a7d5b92d80ce755 +865: 5290cac580cd15da39312bc9f35de883590b4d42d481854e488d33794f47ac34 +866: 0af6a1b3b5a923b24b7f6be599c2475e2007165ef088230cabb9ba47f2467f5a +867: 5c3a4ba29214bf3532af5110ff7f1be43e1d828e181653064f08f0ba65556e16 +868: efe62d93c082b86ca8185dd01dcb848c247412aad460b3f98bd7394c333a4499 +869: f917605bc5eb01ec880886992db6dd8dcca845f013eac800d21082098d660f3c +870: d745dbb46f8e55d21378a0c6f070f851b05a5d0d77fabf7182cbe0b75ece39ae +871: 8a254ccb12d77511b4818302a7cf7a4010830554ff0396a105985fc4a7f0adf7 +872: 446af701e2c7dd921c6c157ea68c7ffb2881e489e06bffc555bf2241dba2893b +873: 2602237a6aa03fd4b36df0b938f1c49f610ed92bae6ed1b7b60ec172ff395e82 +874: f375e7a552540bf63d5e69c663e4b2de721435ff57d9f00476d9241c05913039 +875: 26edf4b92a2d80a8904da7d91ddd617fe97a4d741ee74e02f732dc350abced89 +876: edfdfc01d71eae7142c218f5be3867878232d25c0e503be8053851aa4c31b657 +877: 015a35e8fbc9e2355e220b6e07cc21049322031b2940121c71058a8d9c0ad791 +878: 1c241cbf578fc1b5875c13045d01cbb39564d1ac030c38b8a0add52c1c38c608 +879: 0399cc25a5426ae96f2f6cdf71abe0847082c2700076abd073d88862e4d32588 +880: 6dfacc9dcbf13ff79b66c487a678f81766bd2015da32fde451d904997ca5f8d1 +881: d684685ecca96d26094c9c0a391f606b7e874553b033ae90ef96fac18517bf01 +882: e6cfbf978ecc3fb19429203bd2c508a4bb1e1d419c313f554d20dcdbbca6d64d +883: b8df95ca983f4ef3ed0310b244f2f4318d6761564140cec095a16e023976354d +884: 3d09aad047499cb54bc9fdb4f634c09beff93422db01f7b8498d90493c32a21f +885: c4d2a3d1bb94a37768b512a87edcfa56c00cae560b74c48e46ebab9ec67955f0 +886: cd5728a9edb6066bcd9392114a0f18f4c70ccde8d9c24f3b459930c19e95e506 +887: 743b81138452ca16e51747a1662402ee0d9eac3550011931aec68a63727b6894 +888: ec0de7ecff31949c1922903825b76e67cf27c61d8fe100a5d0af52445aceb262 +889: ac98c3e8d99163b7c3f81f263468de61cd19cec791164a1a38ce0ab440aeb324 +890: b4bd0129e6cf5223eaacc456653fc43936d376d90abcc0f08604d0cb7eeb72c9 +891: d3ef730208652e44eb49ecebd0a0e0dd885e9ae13e608c2ea15690be6b0cfabe +892: 0cb39c3968bcb3d4df407cba298c3fdff967e494effcd9f4fb4dcf846d0ef7f3 +893: df067b52d70efe10ee799741354efc807f4cf323c6199ffa3006a89820196fec +894: 49c36112b26485e2c4184371937988ca9edfc53d0055ba438f7ac8f7466f4ae0 +895: 779075e7ba4d73acfeb8b00f20f03ecac57bfc4db7d907c33f65c10a65de890f +896: c9c078d711266ffe91f523384168b90f1bd00efc2da110778b9cba2f0871db49 +897: 4f2d2969f130c86498c3d4452a9769978990feaa3068bb338474e2063fb47364 +898: a84a2762530ef03398c4c7f4c456364848d91201bb0cb122ff5b18e9e39b0e23 +899: 8ec0cf65d1b765c086dde69a3ec04bc425342a4bdff439058440bb8958fae5f5 +900: d30cfe6d61b9fd4b017d6c9d7d9273e8418d0ae9b8fde5ae767ac80a6ea21901 +901: 3fcf48533859c643a0396c0b597dd9b3802d52c823b5fc9b76e6880fcfb840a8 +902: a5896436484d5efd5a74b8f467a15ad21993f411f27a262912940d4d85e2aaaa +903: 70dc9ceb90614f80df7c9c113b13307d71a4cabb766d09623d28383fa000f8de +904: 5acbfa317c6a381e91ac6c4e856cf341d8d017b6c4f378b2f283ae5fc683c9f7 +905: 2269a8c37a0489ce983f89e5610a5c992b010e9663ed854bc85826c5938ea65f +906: 9a759ebb80007327ca50b5d2d0c48a62ffbf75130b942f9ee05f33d69c997361 +907: cd625ce6c86f80cdae5d4256307200055674905dc4d97f93146ce60b4fe7f4d6 +908: d5735fffa3c594d447ae869b6f97df71a8437a7beca74b7c1b7ab7cbee131122 +909: c6997bcd287033749df80813acb98039278ddbf4a56896a3c4c852114b3d4a22 +910: 93cccb0ecb7988e965cc9efc6d7ac1ff834fbc10be6fda4867ad75c51744138f +911: fbf47e7817a7ce0c3bfded8ea030550b6d6f6de53e103878111f101e49f9445f +912: 5c89a1c644d89f7acebb9b1f9ce51a2ccee9ca212dd8adfa0d610baab3186167 +913: dc28c7d675adfe5a1a7c69400c3dbf5b38332050e4317a1cbdb275247262ca53 +914: c1cb82bc179b22b3a5d9f0355da80ac050236bc73248ec93b8dbbd053298aad2 +915: 5e6e7c848d5df0cf67b72e28e216483216fe84e5d4fe37317369c19603cf0bf3 +916: b19c2c5c2b1a45b6bce242c9aa9adff56affb1f88be4a2645cf76c42f46c7847 +917: be55f3c6e3b22eaa9c1865653a8c91ebb7f414f9a12cdbfb62938945dbc36ab9 +918: 1f32898862ab8d7bbd37d472f0c7eaae7fe2f084f8fd45f05dcb764ca5b600be +919: d07488ed1439a7213396a1ae28886ffa5c4d3cbc74c175cf375402f56988e15b +920: f0b8e66863472f11e758bc94d8a98ee308e5a05490e5db4fb66e1dc09f4e52a3 +921: 67d9acd2df48f467b4f7a84f760730a92c635e928df5621f6afdeed3e195d3d8 +922: 848e6416b52a2ff5c7d7a5e6eed3416c1deef9584f60a5f6c3a2854f0a501faf +923: 5f07bf7c71d71b0cfcb5fe04fb2f1f8a950673754dec4e816ca84f82e663a9e3 +924: 154aedec1b966263e4151b44a8c438bc5f81de0170229bcc20c20f80d85254df +925: 91707a58602431d402edc2258eb703be7603528faa3fc6fa0f6b1e6a4db7c234 +926: 8210b096d070cf4b23238373eaa334784226d472bd5a75abc4bcd512cdd51553 +927: bb818b548724ecbfc298a06c732ac64a20846953ed2eb98c452948c764b4e17e +928: b590d8e03bfe80fd84cd64c1ccf606e75ad702eafaf5353e72e38481f7c3d3b9 +929: 571308cd156b690c3b03a9f857c3b14d91124895a73a2fa041d3039c58468b36 +930: 5470e7f92b880ade0fbada76a0c06d5da0c38e5569c59c11689422144cf3e368 +931: 0584120c3727f510f276d173e1fafbcafeb3fed34bb6639d477db27a7e307d86 +932: ff177489756c5c08e42a9257170d31de9f5420056514c5a6c9ac00c5f9aa04fd +933: 826d14a8ec2b8611009cd1507b8df8c8796889cfe9555db9a8fcc930ef5ee609 +934: b11bb13741a897d8d52f29e0720f1245c25cdc78af34d1b66818506989f63df7 +935: f29205e421662f14d8d93573d326f3d7c98df9527f3a011853e309830b24053a +936: 4f8f5839a9c97e8e6b4661232ce36d14727b4ba88cc07e22e58f3d0792156737 +937: f33b892df0aa30fd76a13fd6250efa31568e0c119177ff5ef70ca1382a125990 +938: 3dd1d304670e333bb982b78ef90eef332b7ab56badd527efa371db1d72a0c030 +939: 456f703691bfa76e0267c4ca9000993ff4ac6daf118b852dd6c763354f1dc1a1 +940: 88f1827525c56fa450ec069a75af48a66c60dd82d6936b71bdddc33bd70882ef +941: be043aa1646c1429738dc5c134672819b6696e79be9c7a98de1afa0d907e09ab +942: c58f652f83e42206e0495bb43b7104849dcf0d4e4ea288ceaa8d221929048209 +943: c0a5542106b07172680af9cf134a8dd6c6aff11b334cbe5152a64d14f97ce5d3 +944: 90cf70305c87a86ae7cb3584858b09621896b6b902bd0f835afe776c0ab3575a +945: 623b58198f6f8b60a5291d1564715f6c177ed6a9795f6a22aac34769d4b781aa +946: 2eca286f8e943a0eb575a8aa472ce251c4a06e956031b9061871726319f33a9d +947: a187c87507d00d8e121bf22bd3a5381cff980a33db532fe1931aaac261bfbbcc +948: 2d1802473442182f0d2268ba7c9bcb6d2343db00d1bc7cceefb05789307387ff +949: fbcfc7d9fa122f09082876a7ba52b087553e5e434536ae272900531d9fd7c5a0 +950: 05fae880424e2b6896c06c0868b7516d04a20addee4ae06d7dfa3d2e8528c23d +951: 556a1aa2712f77d0e29e84189b1907c14ff74a242284eb8d8fd81ff4c9a24d33 +952: fd78fbe54ab202e7f63e87950e60969fe6c6ed0b5b5b9f1a6a64f8f6629263e3 +953: a72ac6b1f94bd82fc1db4d0df37b3c328282bf702a2e80bc6b443319c3127446 +954: f43267b1413f6687a0fc6919f4992920d1a74f3ea43fc087c815f6e6066d1887 +955: a8edc9db69f79246cbb57c2b2996c14ae36a4802074f650e93a1fcac77a259bd +956: a59f159a23a1505a09994c298e654afac0c8d6e2f3f783069a49d8f7f3a8aa5d +957: 665c8ccb1d3c8114ce342ca49cfcc967d166739db626413d42d55b8d2714bb31 +958: 5295ce9d52528268bba400d07d3f7bbfd85097c9f69aa1c58fb4c0201a974851 +959: ad837aaefaed57256edebe44e09dba02d6810244b6a765deab4da65906785f5a +960: aae3fb65120676a8756456c8e56846efc89acac7eb2500551446d8bf00e0a75e +961: 0ac1cf7e1bc2d02b05386342d8bdbf58a7c62976df7190f35653aa8daff30ccc +962: 05a4b48144bed7422054a947e7efa5a1c1517478b9ec633e449a8cc192dd2ae6 +963: d495cb49245a64f0c098e355584ab22e496f551c6db141450d4f2d5473abcc44 +964: 8873017ec15e2ab8207cb9e54426dd670a3beaab33db805aa01c1779cac20e72 +965: 0ee4c3502941396bacf4d957519d4ef4a4f692c582c6c2344fdfdbecde8275a1 +966: 2bbc9539dd2ecf542d36dad04808145ab85640a14ef9d5ac272485bd8f4144cc +967: aadb52646899d16bf8149a8838b15a8e4071d3d2499f38c1fd347931d7e99097 +968: 3a36bb3c62181f1906ced66e0aa9090041e1783c85b37008fd91429becfe1c27 +969: d0949593b37749c149f865d0c1feb635a51b6ab2f1534e4b9fb0e93d9650ba71 +970: f7ef0b7a549a0d3949bdf395deafe817e91cd8a1a7a7ab54c0b592933368b773 +971: 09266b160df5ada7a2956d2e3b12d4cd54339688fe13914cb4464c4ce54763c8 +972: 74d5f9b29bad60571c3b13b4374b5d9e2d2c2104e5b8b08a9a46697c4db26cd4 +973: 12523e5f97e8d85e409d8fce5a730c6f32cd05a69d607ef3f0b05c58b52265ab +974: 1a987e6dfb4a4343370a8fd5bfcf192d3374a4e5480108021180e03ef37fc6ed +975: aaaf1ce8d227164a535129c4d6352005520d4f2f5946ceb6ed8972453ad67fa9 +976: d25e2c85bca0ef83a141227ef2c9886d07e86d6b1c40e3f7cdd14f84d1e92fe7 +977: 37471a4ccaf0071fe0f3c31281b44b8197e8ef9e7301c6f53184f08ef63c5d43 +978: b0e16ba5daa317c063e157e75d42de05927a58054e3737542fc258a3cfe4070a +979: d4c184e0d658a3e24a7d25a7100ce03eee215547c335844f2d8cdb8a2b1a9e79 +980: be055df17f2d7082f4647dc4099f5c0585efcd6423a40551ee589255ad984991 +981: 09caa9af48d02c98ff7107153b1fc380af3fb9d3f00a8091cc8336d84f859ed0 +982: 67b2ca10f46e731cc00097205087b5c16d60a29ca1cbdd8f1a375d8b6fa60d78 +983: 0396ba72836444de8f0c354b8a938395b670eac515fb224a6b073bbf10bcff16 +984: f77dd049a4f6d078b810af3e0ecc9f76dcfdbea413dfcd709a1f86c915c392b3 +985: bb76a5acb950ca6fb0115097b948c3b7e928498cca4bc65e1ae7c45023642bf6 +986: 45f58d18384049501fe1cd351e3bc7f612a548ff7ca10be59a9795dc07787dfc +987: 70a5ab10d8b77ba8d578bc4884c50a62a31aa53a07f81688b3658f4eb9827ff8 +988: 12de07ccf3b01d9e39ab693a24b5563635ab0d20b0d25145ebe031b151b3cffd +989: 9d54cf86f8fa928f4b248978121f2a7608e1499a3f55edb16d00e4ce3073887e +990: 523110a7ecc629c613b459c83788c9e66897d5d2e92529c4dcb6d45003c5ea7b +991: 465c58b36171c47156ac95d570671a4f0a68237404b960b0517a94b279434ba4 +992: 6fb4c0905e1cdf34e70a2be73e3ab7e48a687efa5f8dce261bedff93011c639d +993: a316920e76d547f001de8e1e4f4efd0bb4801dd6f453e03f6f9035055ff67de2 +994: 95616eabea52bee828193c8de7e3f442164295a0511bdace71109df206cc51bd +995: f57edb955a21ee7a7c1df5ee6c6b307796ff6bbf702ac489077e847d9f589405 +996: 84f6a4e89e73f8ae45094c8566e93b60c51e02105e2ed07789e761adc269e6ab +997: 2102a6c04cf648d73c7bb78660a8b6654e97e557f6b4faff3361074f4b509824 +998: d7224aa3f93a0f23514e696c3ec982b780f9c4c50bf7b302734e4ac440ed0485 +999: dbd4d0cf3b068945805d85244cacec331f1ef1bce5e679d353e1b95d5559a07e +1000: 1a888206971be51a4535e1a15d4696b6ba4425fc1083911f274d748876549179 diff --git a/hash.2 b/hash.2 index 85c837b..30179f1 100644 --- a/hash.2 +++ b/hash.2 @@ -1 +1,1001 @@ -00010001 00010100 00010101 11000000 00111011 10101001 11010011 10101010 10101111 01100101 01011111 01000011 10011101 10110011 11101000 01010110 10011110 11011001 00111100 00101000 00011101 01010110 01000000 10101100 10010000 11111001 00000110 10101111 11010011 10011100 10110000 00000110 00110000 11100111 10111110 00011110 01110011 00100110 00001100 11101001 00001010 11111111 10100010 11101010 11111010 00011101 10110101 10011011 00010000 00010111 01000010 00010110 00111111 11110100 11000011 10000011 10110111 11100111 00111110 11101000 01111100 01001101 00101110 01100010 00110000 +0: 85dce2ad6ba50a0ec4162ad0598336517ad73f10e8ee16192f5fa0d6111415c0 +1: 967af4d7613e63ae6cd2f05df12e2c8d125f5128ec07521a6b313c24a15310dd +2: 7eea68f7007f367e09493c70edb150fdeddc16ec56123253516696900ed56fe4 +3: 4fe640d5106f16b6ee464b7c21da1e3c3e0223b407d0c6a3639230ef65f8e309 +4: 3632c69123a4a7cc5b4b45ddea2b1572ec877943d058dbaeee0d7fb02a64cf0f +5: b3f14807af541756e10a3cd81e812ee5d51505baf6421dfbf2810facee611c94 +6: 19fb1cbd59d7ac9b370488d9a55c1fdc79c1d8b8e4acb8607b5347b065ccd4d9 +7: 8a23d1395d1eaedf268b56ff978bca521a82c13a471adfeb85376220436f6be0 +8: 5abceb6e6598736cc1b81cb10d644d95707803988559a5d34e97b38c7ba6b61d +9: eb44cd7554093a31e15f13315c88303f9cbcc12c260c1104aaf2f7d322a4cd75 +10: d3296f612c32fc482c190825523af7c53561ab65e53a89a9360146ceef7592f2 +11: be3e464b70ac3060f456aabef84f770cb61c597c34b449588578544a3e319724 +12: f2481bdd304361d3366f8b47d030181ed574be70ffcaf2e46bbbcdd9fca86f88 +13: 9d8806d808ffa4fcb20dd8c6e83d76261579d4d55dbac5fb45c843704fc853d9 +14: d7154bae8ec7256fc5c6e69689642a2be5a4050223418a6fb42a069665c1e8ae +15: 9d508212c183bc60199bc8d452ee1410341269e486d8887e6b873309bc07ae1d +16: a998b3bf8609d89a750522039413c31b67e4d8ad5bde96f8676fb845257c77db +17: 267512254d3df3188031b77dae4378f1b2cefbc136777e7ff450d9249dd7631d +18: d484670f6ded2ba8f3e1a926b25fd9df59f6c57b5a7ef6ae528a82f6fc096f39 +19: 8a9694e39a0f7597a517c9ebc0d29aa47d38ba488289433caa578c31dbad4d87 +20: 8ec179071c95681b40b81cfcb878cf30388917844b8cc0a70106646a2509d54f +21: 5d6d37a33541f7c27460408529d4a2011906d4dfe215fba1ba654a8d0e57d522 +22: 2d493b9694a77fa55453ec259182ab55de0b504d9358047d5d8dae34df779fca +23: cf99972160728ec412d836ca2f9d0af86b74d6bbd46e9998f941d1ed2fe3032d +24: 6a44bd9e825c146850a76356ba47e62c71420a6f7b3108b62d58640290fc27f0 +25: 534294e4cedf8630d14b0ad75bc732f6e02aebae0c4d72de37592deeab493d36 +26: c99fb8948e39addf22fe084fd260e2c7dbacf6dd0ae5631ad9da1b8f2c887774 +27: c55f039a282306e34d74b1d3d4d79432caada63ce94a20e18ce1e3a1047b5c75 +28: 0e1d4f3dcc82aad407948b3bda370dbebb3453be9445ee746c31b6a6e29f834d +29: fe1e351a0405674718d2731949970188891e60a22454162607cc331bf0250925 +30: 49fe281b7e21d1f12cc071368359f07e9022d20d0ccad6da269d5c06e08985b1 +31: b22666b1f8fd1ecf1a73f15132f95492ca95556e2724d7c83d62c61229365534 +32: 42e4a64c2302db6677e55397e081b3b318db7372b648920f8a37780ab1cd3ce6 +33: b16a21a8dcad9d14d1c9f206d8da2f1bed1827b9c27570d8f762a42ea324abe5 +34: 841d5e62b2baf1bec33817a764e76447da91c3ec3bb76c71aa7b843fe742dc56 +35: 63e2031c2ba2de22f57c078f30ee466224aa9e645955c4d7c9f33cffa0b04c5b +36: 57b3d4a9b99c5b30bc07aba0a104dbf6323919c7829316af44de717606674d6a +37: 52cc02a6c375c8661d5ae7640c12d4a99d471a68a8adc24c4b7b775faab15519 +38: b74dd5dacb02d8991de0d890f28e9d9541728458897f185ea2ee461edbc862f1 +39: 00eb716f16f532d8cd216c2381045a03600cfdcddb5cff899327872d1e4c56ec +40: 62d17a5c7852291a20954e947712d9190124962c82c25de397e392d998096f4c +41: 3651989b89c2177d3dafa548696e28f4d158304424395c2f96b5268944f60c38 +42: 97c011124265b78962504cf4c57b701c47e12c5509d42b239496e39613e62e33 +43: b2650e0fe7cafd2f753baa4cb4b9130cbc42b1ee98beed229003ab5e6f6629db +44: b0890007bcf10bd94da7a0b43bd64da4205665e70b3bb9c1f6e7f72199a1f0eb +45: bc342e0606491fe6a11cf901b41e872c2bc532af5cb8bef2a93c80e87b29061f +46: 320f03dac702ecd4f942b33805944e1419f22325a956d61afe35dc224b252cce +47: 14fea152c29f1198c1f60f5e5937dd7c875a3491728043210c784feae9484426 +48: 646f5ca122eb0bf206c1481c170ab7a003b220e66c838dc8d67e71244337f7c6 +49: 9750f6ad64bba9df8824f67d75d37d0c0ee31ae765e7422f226ae9542492d82d +50: 2a41aae9491dc68e12bea51a9662ee0c0b6c485947189e075f2ebeaffeca6c41 +51: 77d710e29edcade288ed971d0de133c54f5846f3f663d22232d684c8d9125652 +52: eaae5db00afaee3de0c3e21655a2cd8368ff7e7dfc0fff64af87312a7eebb0fe +53: 5e9e1c024afe55d81b6ac8557f2867e5f7c378d6b58a757f65ffd81af1aa7925 +54: bcd1508137fb9456e0cd307e405d02ff17be39ec5a8dee6cd0a8219b88c72495 +55: 337bafca56c5dbf80d610b7477a65fcdbaac5b7060b16b5bb295d684c41355d8 +56: 1d3fbeb378a2287bdc5f4a20f1a4328905391f61654797d4710c9247d7e3376c +57: 59721454570ca2b55c09ca70ad99dea88ee5bab0444cc4c957a80b8602e764fb +58: e07829c5b27d55c8ddf75d14ad8d8d25c7dded815d58d67b89f0d682a9e3ac42 +59: 992b6df70082b7fd720529ac7eef352646e6c9f6642e0336080dd5239d6c111d +60: 75fd1ce46bccefcc1cc1680a192dc545c91fb4262f1ac2cd5aeebc9a906e6a84 +61: 4384d8d5cc81a5772d479fa636aae5e750e6006d73dbf06c662e5630cc9f2f73 +62: f2c6049bbd9242d9739f2a408169452a7c7f99e3d44b414ced10361ebbfb9861 +63: a5b666b5b0a2d63415b744a61d78cb7e2a57658e0f5587b75acc75268a7ecc9c +64: 0fd368e2923173329fff18564ecf4e4c3100f9d116bc2e34fc6c43e0f152f789 +65: 6a18f6aef35207192c09a7670854d76313e230450b11c1ae09dcac738ae29a75 +66: d6bca17093abc1619e048ee9c1687161f60db61f5fa45f32e5f413a2211a3ad1 +67: 2b3eed034067549495fb0906972c5d046f53d26fc4f0603ae0fbe216e164d5a3 +68: 287e82c3da770aca0a53f424c4b1392bb1de1178e05dc7a762af59ffb6cb3504 +69: 7dc33c0676c18be0c98f91b45055a39aa4bdb5774d1f3d2b364509117d5199f9 +70: 8ac0505260206de8c3e64a03800aebbe06e20decbb7e1ebb08605fe6e1cd7de5 +71: a5f80ddf555516ef4540fb4882faf398e8113b90dc0436da6ade4e2585c135da +72: ec628bba9ce4d21d7a4e94908bcb93e97b9356322349420f877562f8ab806c7a +73: 8a933684d3b07d9cd9e7a85fa06f2f8fad6585bf00e3749e81a55783a4c33ac4 +74: 61471ee903ac7f8383b5fe4f06d17b3d6776bb86338e6bb4d8d4661d22a0db94 +75: d21c9f3f385090e34b25b021a4f89881c4cab9025c6bd07ea496811d55cab4f5 +76: f35ab97584d028e267ede7aa6810439130e9af020f3fba217b5f5f05f0b3fab6 +77: 1eebd15a4b141e3c57282e69f9ab7c9a26e027e97cb969b30a81cf2aedbc6d5b +78: 0d3601637e980370f233a99fb26df1698db1fa8f6ba08b17fc5981da1a0a9c4b +79: ea5e9db8b0d525e61a8c2f4222f0e234b5d11956968d75fdad29ba729c31c30f +80: f82393ee4a0e993afbbe499096b86fa9e38e9365ce39bf637a66148e563a7562 +81: 877c9e5fe589356a397ad27d41aa6c266575a3fa7b1041f780c9fd71e38a59b9 +82: b594a19913145eb74196b03b790d1166a3ee5483c4056bffecce0851f0fa62c3 +83: f4bd80926351cc2adb02a3987be946398cf90b02a73c30a34142ee9cf4e6d6b7 +84: 6554661e3bab5d0cd67a4aa12f851624fb59a37f76d67dc261f91dcef4e99f56 +85: 9101f3a09b1e2f4164e324c3a9a6550966b19f8f15f35dfaa7e5d5880c97c434 +86: e3a8b17948e7d9a6073d7f7f3dd324fe558115b720a1adf4e5ee5277245cb183 +87: 7285be9c5b90c66c3cb2c7aa23b2614c9acdea964bc8695a1428fc714976f812 +88: 47104b5c6fb4ec27cf85c1a3e22fe631928538b6e39a7c4a8b19fa216a965155 +89: 3e7bf9add688476395fb369d0b51854f13871e6ab911220f4a2c35bfc82fbbce +90: f5384db8e17f02eec498c8688e9ddcb9927d698f969d398ca3777daa53c63d1e +91: 52939a46ed816e22e051aa8cf603b49fe12db3e14fff5577ee5fa709bba0e246 +92: 5984cc844cee6f30e28a7a4569a303aad5fbc647eaef45532ee2a3a4f3e334a6 +93: 60795ea26fa1124808272d8fa41dd10b04dc832aa2a4b29ec2a67d0aee8326e4 +94: 096f2ebb8dd1a655df783e6366a9826e8d2cbb45a863a2150126048c4a3bb422 +95: c02e2508f4ecc02654973ab7bbc697356b244e2064711d32034f41ec6c8010f3 +96: 399bb57ef99b37f9bf110c800857479ff5a4a6d615c28f1ab2e6b135f241f63b +97: 538146e200b04cb7eee283bf11c622f487b164b45aa507997076c1a714bb7037 +98: 634f3e4040a82fdad1c2f9986856ea84a29c11b780832433c72f53c38a9989e8 +99: 857ac7b15eacd88adc2aee1935d2deb1613a4fe6a07ef321b31d6459205efb32 +100: b9c18f78c6c126d024475a4cee31c86823a9b78948913042795324847c2ec260 +101: 4c21bbdc6c098799cc054ef6e4363ac809913ff273528755ce091fe8cea5dcef +102: 3574bf8d1624d866c339e7b58b4e4aa2437ab5792ec3a18c2ee3d6bdc0ba07c0 +103: 3ad028b3670b7e0df2031fabd8816516e19e10bf06babc5eeca48d80800f060c +104: d356b9a32be6600604ffe9e5c80943300625d89cb3834dd8b2cb1518b681991e +105: a330970603e32bea86778320be1fb89c1553c3c0703236a20d9ffb03f39e451b +106: 7d55c46d31de40187a5d9a1b82626c44fdd05dc92b8fe8f932a1cefbf15803db +107: ddd8827353b8b2cdfadf52c65201808e31586795fa5086eb04fabc3be56cfbea +108: 7abdf987458b0916a6ca6585ff616e6b5d385c0cd31dbdc66c6c613d4ec6b444 +109: 7bcf2da4858bf72820343567b4e27363c0f9c4576fca736fc12446637b04056c +110: 5796ddefaab6e59164723c4bc81d4d4044c25e4a5ed3e6982c3068394be6e765 +111: 50ee47bf8ca763c2d71db5251497889abd6bddeef350d774c8561791a42b8d3d +112: 78772ed96cdc0df15f826f62d72e1f0a9bace9921ae6880b157afcf12d2c5c62 +113: 0b3d2afe5cd8da4d61dcf951afa561b368644812a367d72c14062a189ff48b2b +114: c3ee44bcc9467d6eaa38f23bd58cc345cb6027af6c35fe101e72cd7d8f20ca79 +115: d85baa9f673ffb8ee642a26cc2eed5b2f7cabddcc1e3a57da6d25a9ff21a7ba8 +116: 22f6b3d8c00d5f6ab92583848a14e1b7ef3b7c183a26ffdc4d8bff0ea45d40c5 +117: 725b763fc442a935187982ed76d0579dc8dcc03f6d5247b8163e7d4f2d4df8e3 +118: c68d4f34319edc9c6be7fa9c2be8ebf71a3fe18f04e4b0adae0441afb2b04a85 +119: bd380ee1173ca47965d6d1bc350a2890063bb80253beda787d04129d425c561a +120: ab3069c2af2f4fbde79b2bcbbb407a7e7ebba04b9d479a61f12d6d381fb616bc +121: b5bef1a995fa71e6c391e0ebcea3d5b004c09d20b859040045a3ce5bea9538bc +122: 7cdee81258a876cc3396fb581e98fdb336dd1950a201655b45d3e79320162627 +123: 2fcb8b25d17eaac4370ef0a188e6666bbf966176b647b174fa9eecf2abec55e2 +124: 2d5324eeca9047ba17815e13e9e46ceaeeeee6b617725e9c24095356292c7540 +125: db01b4b82ae2f9e2757f66ec878a45174f7c23406b046926cd2586a76ef0949e +126: 410742c1ae1d14142d796f4603531e78b30866fa979a4adad4a49e9fdd3364fe +127: 2912f9acbdb4627c37fb1f643f67bcfa73a9fceb2d848ca7093664256c3f7ceb +128: 640f47f565d46dfe065e24cc266855c8b883dac354f25483c628728f8bc23149 +129: 175bd5ab889991582d8554c8a576293bc14be7226791b5352eba5aa3d6434de7 +130: b7f915cf072ebc03361a60e75483d96383bb67bbef4fd6b7a091255d72ffdba5 +131: c547751a862d00e7c5cebf2886e1b7feaae7c3382e80a7d3a306bf66c035b049 +132: 1e38d4d5fca04af54b42e53a1f80025534b915fcb3929cf08447e31a97f8fb4d +133: b4c3f2baab14feca2c91ec75d115d231d078b5571c8d79bc966d5ac7154beccd +134: c4fec2cd994c7dfd7b8525c27bdd42aa6f4bb263006f2939d94cd20d6008a44d +135: 32e2c07f62db8ebcd805a518e471c021b5940689d62ec56cc031045ee9af9513 +136: 3972cf6ee94c3b4701f3fa7fa9f7be130abf7da6559b6cba5d4037ba61ba4b6e +137: 74ccea30243f54b1e99b1f98b1a565fc5bc12c0cb372c0bb347d66df0f5b6c5c +138: d487a1505e3a398fd212c1df23eb124d7f16baea31ec1a8097fd2548d66c9de8 +139: 2054c1791dd0a033f054831b3e1a04a3114cf3f30b757d55115d0982de043652 +140: a549f0ec73a288b97f256153171dcef571008e1e35a9cd8d711393be473db126 +141: 59df9467e37cb4a346b8e12193c6d88e9dd6aed0e78c42372976db0bd4a24310 +142: 068e7dde0bb916b33c20310b8274aef929f2af47fff613f9fa36be085be4b800 +143: a8f28880fb2887738be1ab65dd98670a6cb0ebd89ab1f1a95a63aee1428efe1e +144: 45b277871b78f4591cc67349da916f07a5c2fccab58b12ea7afe4ab5c96d7fcd +145: 15c6252b88e4cfcc42dfc10638d01c080d8ac7759ca2c6e605ead3488b415e9c +146: 2205890b5e8deffb8a7c8270487a08bdae83ba0a823a3d7e98f7593bd80aec75 +147: 796161b2b7c7668c313ed3a4c96c749787d433288650a30a5e20268c5348f0d0 +148: 6d27d2926b2cc062a5eb332a1dd9084dff917d6014eec2b297e89e2ac0b0fb73 +149: 379c422916ddc464d9038edbed5007932a809547c63611a83b4651741f370ab8 +150: d3c26dd08a7a5587b4e5abd4fa55ff01127bbb715182f535a415555009862355 +151: 4366a1b92bbe908968acb1dd2a4e1461bed095fa6bfee3edbad953c5e9bfb1b7 +152: 62e6790aa528480602f628546cc04f828702b5423a6f6d6e7553ae8e8c34274d +153: 2a34e923990ca42a6534f14c02944e9f13d04fc926d3225c372818df47069c66 +154: 7163bf10bb131a014ab065e5170384af8c80cb09a49874d4d459127f09959997 +155: 039dc2b701808a89fbde295e55dff4abd976a508a817cea65b98caf0375ee8ad +156: c2341af85a957814610ede9b39d110910273f0627749a41e82c8249e841dd684 +157: df5638c7eabc9c0fede2341be6b46f003610768b90d15dc235df662cb3ed01eb +158: 31f31fa4ea63eaff1c1b31982a8874408681970fe211c5a68846cf10043a9347 +159: da2bc98b35182b12fdbf81352666848f1562a0b235293012c28489cb04616b46 +160: 21e6e3278390ec9dd492369dc2d5e04da3b393f630bc9a1e47d8ae1173f046d8 +161: 0b0d1d9a3cdd175998bb4e83436c81c1da079e6347c81a8a5d940fe910c145a6 +162: b557f92e62e8316633fd61fbdd8d726e7fb3c8e413eb5411ebd9263973f1ecc3 +163: 022cd2cf5a5a16f28e2d8a65130f70ce12232efff8ec21b97e935b16d7726a2c +164: 48b2a67cccf18b25a005073f244404099e3803c839b929054c839beea3420cc5 +165: 1078303bed2aead2ec811cfa4fa41c3bd4536290e0d690d3d0378124387bcdce +166: 8c6218f83e12015def099c649216ee489bfcf6a86e8c13e2d2eabfb083d44478 +167: 16399aaf5de31a47300043fcbaeb8ea5abe4b9206bf28f648cb41843670be2c1 +168: f64128bd0c936e4f59d172e61dc99dfd85907d14d3e59f0f0554defb246ceb45 +169: 91ea1c7acefe0f3f9d0ff988fce594a3aa9fe943dc38351f282003056eb3d177 +170: 9d3ed59fdc903ec87c8e4d2b1a7fbcd338298bb5aa6f321e401fd388cc5d3a17 +171: 93896f5a03b4aa3eb26cc34bae3124e42e5f661f8811b92ffc0a66964e4a08a1 +172: 5220ff28bdaa8286f94646feff8b615c38f80fbca37857fc3e81a3d6ef561e52 +173: f3434ecda75e0216226e1e5bf9143ac62852691ca5ccaf8954420f73ff0e3b05 +174: cc2a0b6ae2447b3733762f34657287f4843362c232c99310162fbb6ff0d50123 +175: ceb7be0ae2fc7f06e0ea102aebf343cb37c65deee88e2b3a538dc747979f8ae8 +176: 081f689b66146e7a256b1f645227cb3c9ebfbd04ad7cc52cedf1acbc21d43dfe +177: 116944f76f92bd752c7dede3ae8aaaa3e78c9f4c168ce1e4f8bed4051fb93b0b +178: decd90f07fbe6b0720886d0afb4cbf31e251882d6f7bec8c3482f8ef0cc8eaf7 +179: 8796057000a4cc5092554b1ca6826876f433a260b5369814ef293ba3562f4ce7 +180: 88b6522669a0e6b78af9974bc208499602e4ade0943e8d65c0eaafd854481f48 +181: 8e7428c3c728b8fbace45c64df9b4957592348c81433bcf6b81d3c2e7ae72c90 +182: 9372a0f5b68defaa0676b78320c16502801ddc3255b523e0801505ff5e7f16e0 +183: 6e86012d3547c33aadd438d6efe4ef06822f2a964ba16456054c7d7f1552fa26 +184: f740b3f95a86764d5a8031847becdcd2d259180e3de84bf074f993effde9971e +185: 59bdebc53a196c3018fc6fd4d6e9b6774ffbea7800700c8670df1276aa860bc4 +186: ed215e876c7709f3f456041863072e245600beaa6911aee29d8622de44ed33b1 +187: 4505f43b3569d2013cc3fc17ac31a329c4109611bc90fc610b7a47df00057375 +188: 6ff109260f1b3aa2d7dd09a8041dc194932dea241cb5e31e63612dad5aaddae5 +189: 48682afe897dc03b3d1ca634a183bc85dd51fdf049c8968a6d65c071c6afc514 +190: d3390ec0bdda39a01052620d7b6ae10d3275bf2eeb728b29b8f9a200c2899bc0 +191: 5b861e4da914e584b381f6d37f2c8458cb7a9fdc096220116bd184595d09afee +192: 18e51ddff9f391a89771af8fc5af6a269425fdc0885c1ab23c7b1498647ba951 +193: e379048af309c10fd9a95c37671f1965602a19d72b37765b6880f78e5575d00e +194: 2a03863aa3f1818018a31a289a1f74b43cd3486a6186332ea9d187cf4d778b8a +195: b06b627d0b9988f6246a2c74aa07f2f064a975a9ea72189cf70ef7738a550fc7 +196: 24b49031bb78a51beefec8aa02ee0c3f20a0bc8e23906ecb05a2e713675a283e +197: c91b153c4d07090707d66874074179278c760b59e0bbc488488112abfbe0a00f +198: 880aaeb0896c44b2e857cacb4e86c4430087f1524c25672ab3ffc3ed74f223ce +199: 8f79f1a6cbbf335cf629c9d0f9cd2e1a2e8f75dd911d7cda3d8ac7a0e9b44c03 +200: 22fe080dfbe76d382bcb438d9bb45671084d45f94c330436391e7d820d196598 +201: 836bbd51ce9e65eb7051f2e5e3c60816fdc6076b141df672ef8dd65acada203a +202: e454eb81a9fcd1e29b2313ba44020ef5ef60c2e3fd3b0566c74b87092afde086 +203: 6535ff734a6fdc4d577ea4218c657b65cd1be4ae2374d8564b01327b86da71b2 +204: 2265e8de4d67982ae7101f5dae68ca9f9657d2db3778702d909b79c6a86a5795 +205: 85fe8633bb3ccde13c7b479776aa1c41db83c4b764fce90ed14df15467a4666b +206: cad903e7b72d170c09fb62d3907f9b561af4ec18ddb28743ecd4cb733093de3a +207: 491a3cdbe7c160b955e34a93094302f1c01662e1ec30816e4516bf4e1c61b76c +208: 7ed8eb5cb2d7ee6f9e2488dd8fa835f6f22109f42215b901d5e4c4359ad30ee2 +209: 1cb36c31e915894a6a2533ccfd3859046a1dcf78d8452bc88958dde0ca191e82 +210: 7996ba8fbd81c2eb0becdbad564153c598abfa2b0f69bc3ce6566a78931d0b3b +211: 81289aa5f1dd141efdcdfc5337decd1399a8aeedfdeddeae6276288106bb76df +212: e4b3053295d363cdbb2572e7c374ae879efc9421701310a34db983a4249c74cd +213: 6122b9e38c62b79f5ae2511de6795fb0fc853a0aca3fcef4a182ed52439037e3 +214: 74982ecd365733ffd752f772b3c8859b030f09b7667627bb6dfddaec59c30963 +215: 65ac368432a97208d4b02bb2481e674f31d90f4f18efc9375b92282432cd4398 +216: 0ae0472333635ff53374228f90d5cabaacbc0af29938fb8693b1d6303af5d819 +217: 47335e444a2f868bab1dd2bcbf7d696403e156139545a479710a6e559439a8c3 +218: 836aa3b53750ab893a8d2505787917fc35dca9cdd8e144474f86e2fc62aa2ac2 +219: 902ad618c9cace3b20b7608eced2ed3dfd0fd2dd26d1ea37e87134f114053aaa +220: eeee27753ed8a81edfd6a9f9cf22ea18536e6b7afe16cbfb795c84611f729b7f +221: 78689d14bf6f41cf48c193559ca84a3d9159e4d8b876d8ef4400ff13adc7e546 +222: e95c0cef65e3ec3fd4d13511442b43639025b54441d0f6eff2f3f0fd16112e49 +223: bdb7210e537118706f44ce3faed211cbf168d84bb0e987d4a283c854514a896c +224: 8c5f6f2b232c4ca41560d9a9cf2133b9e9cb18f5879fd4b33ef3eb63e599ce05 +225: 0362c89e151b3c9fee8518298cbffdd7248e55598f2aadca11349c6052634142 +226: f890d22cde86aa1c84b2b176f20fbb12dad5a01a5440b7ea9b95ccfdf3e1c3e5 +227: 07bb7b47c9b210d815f1069a0a41d3a84521e657b7acb287b1cd5cbb49f67ff1 +228: b1a066f1a5123b37a21fcc3f76776d39d9b1900ab322627c624ca36c41ec8c80 +229: ba78c1228e9c14a53840b0abf4c2453000a9f7987a214c25303404f73c631f05 +230: 5cf5cac55ed208adb8093b361dd8b9f5f02fb8a53cef52826924782e1f6a11b1 +231: 96c1b670f199bafe07ddfd47f1621f83358029a70de499e06bbdf703df203266 +232: 1edeb64a7da98efbeb47db24d63ef44715ce037f115cbae5f9352d95250ff191 +233: c35d4468f41c85e5cfc438f1710c8ac81a14208d98f7aab81d9a2af52b557d3e +234: 15bdd6d35bf282cabde4e76053970b0dab3be54b0d82d307a286e465c8cf5977 +235: a1f30cbdae18417c306ced42980242e75e26a46dca692c2a5c66fee091eee6ea +236: 7dfdaa74283d590bed1a93aa83690b94af6da5ab325048562328b12121a1fec3 +237: 505531a199bdac286d600f684a6db9eabe1ebb8484b87d9eaa645697793161e2 +238: dc9b0fa83e94aa6a077b27566bc819d3f6c4cd9de816528ba0a8307ba5a9ce89 +239: 0469c2d7c5238717833258ddca0e7b5e2935f88fc18302530c7d5f4d12b4e6c2 +240: 5444891f96afd31dfb90875ef6361330cc9066732820393af2bc8e7685d73219 +241: 96c7a7d1a89c2a7ff489b4da3dad6040d70678d943e493124ac85611da941ef3 +242: 83ed5df952c9a10321737683dae3f07a674130eb1e63808ff36657786ae90bc6 +243: 8306098da643d0d713485eb46ed5b2e195f5922059dfc4235c56598e63258915 +244: da3dce162705f1440002406c5789b185723547355b9f68e2b79752c69120cbc5 +245: 586b2770deedf675f605e7a0ea1749f4ccee4bd503e979bed27300665376e135 +246: 21e45166c93f32ddb9455bb5bf741b35dd091471e6be0fdb0a3e3989e8e03308 +247: 929f96737caef074135a18be5507aec562cceabf0f782f68819c600c171c6652 +248: 07673d367d2861655fab34786cfb189d1264040aab58f8ea997ae13b6c303e20 +249: b0d774540ae1680d4d5c47002145f86d64aa85739bc61f0fddd24341fc870736 +250: 90be88abc45f798dd28659b543f1740317abc8f5a7edd9cbaa6aeec8168b4eb1 +251: ccccc2ec1d5992b360136f83cda2adc2e4e921407589c633974316084a0a24d2 +252: 7d863f9d4cf437e5f01661a0427f5d84c857a14f0c45117bfd430e1ce1e83d37 +253: 0f1100223e9634fb289da37860841f227e30fc4445e05a89580af9e37df54006 +254: 989bc5068cad5a93f2cef1e4acc0031c3892e0a8336f57b967ed493ade127819 +255: d117be5bf4886475737e229feb3a212067df3b4d20476412148de596327e8629 +256: 7918e370264ffe9a954fe349ffd1b857dc73948de93ecba459dbf57231df395b +257: 9aecf8190d9f3c8aa026de18a609c14017a5cbedea830aa587bfa75741785c87 +258: 4675441cd704567d561a9a244649afad8c0218870d8422b280dca07765478f4b +259: 807d3e8c51d7ea6d1f9178769f2ba3e6ad3eab801a22a341eba696ef656812cf +260: c9327ebdee70d30bc6da82ce176be856e13661ad045195c7ea3cbce1a50eeb6d +261: d2892873d407dcc7ca8d153705b537e9babb6e8ee48d43db752be3d4d5bff8b7 +262: 4042e408eac4bd2d4780366df17273c674ad0975053af97525a585783926eec7 +263: 7ab2537e4623221c87469fac039dab9f948005a1309fe4cace36a165ef8489ac +264: f9be4b7e3dd88242e994c06ba87bf086bd012bc05739c130708678ac148ee2a6 +265: 67f78d0c6e565b0a3b266c7024973632256c7bb1a50f26e615700ac117f12e14 +266: 65860d112fbee85873f4491a062057a044b27b075054207d04b3e1c8e0ecd295 +267: d17dc8cbb6a4121053bc4595c8d472ebc25ec03e6a7a3cea9693f7a08857c19d +268: 8f5526c34c0560b272a783e8f84d8c6068361fc1fd98737f916539c4e5a786ca +269: 622442a15cfd2bb1d19a5bd917eade938c67576a2fd710f355423c7e362379d8 +270: 01aacbb60422586205c3b537bd8e6e3c3647a6a6959d8c572343dcd4c2a3fd03 +271: bfb97cfb6d5ea07d2d2bf8075791ec76e038ecae19738583ed75ed3af92b9dd8 +272: c3bbcf68c733161cacb2185e06bcc08e739e0156bf172b465cad0b286d651863 +273: 9860e97874180ce05482189ea83b9bd46df9c1ff84c063c04b55e5007d71e308 +274: 60f51f62146cda4f15c5f549330bcaf0df4a420aab37ead2e94115b28464ec68 +275: f820c827e5685de1586f0c4366d68434efeada7cc8e4816113f1ab7f854030a8 +276: 439ee42e996b28301a17903413e27bffc561c20127696a1fbd7a9ec1091d15d2 +277: bff9711495f8648195b9d685d74737505158c58dbbedba3af298a12ccabdf72b +278: 8b440ac27c9230c25b1091416c331ef3e7c63fafb4d3fbc5e7e67c9a96eee7c5 +279: 153d0606d52d37fcf1d765026d5db583b0d8ee70cfff0b31fcff893e22197d35 +280: 8f271450f8d016349330115729edd00dac6d4b4ac1b4ae5a34ed03c3895fc6ec +281: 5fd19597f8f2f54a105ce419652b6f31ff5f81b6e9c9fe11adc74d37cbdafffa +282: 83ec2c8abf39cb4ebc7aa584ddab071e0bf709f5dcccfc4032649ee8e934e9bd +283: 87223192712bbde69b66186f916aaa5e034133be0852e736ada9a4f2b6d15371 +284: 51881c2227b7940a388f28f75754a5a606f549abd05799a139913a0e4a7b24f8 +285: 449501d5e3a11f803d3db8047544ba233d33b88d0e338b1cd8a21d274068f399 +286: 86028c7871285d1f8039aefe02e4f8f5cf8611cffcae71633b41cf24ce1eae2d +287: e4a43cc54820d908d2f413ad9a43b8c5a4e635c96bf3080d5a1d2add8a3d6eef +288: 4044246981889dde292330066d8f563a73090f61522316aca1db1fff59c76b19 +289: 7b8fcbec4e16cc0b53159f002d00a4e7fd67c8a1e04792e26e97c2e8ab52d1a2 +290: 164a4ab46b7901283c57d89eba86b54b1398005eb3b9681617934cfa48c0a7cf +291: c234774ec19d702c50ff52ab2a5681aabbd194bb8a16375dc0baceeb4549886e +292: 5dcb231c4448ea274426f1d3b34a4b5b2639d88eff8312bc08c94ee50ef5128d +293: 2b79eb4bc6a5c548bfda75d29f6e987942bc7abe6eb4515edd838913a2edf245 +294: 8c6febc7c3da2fa7155bb9c066677f018c9e6b580b9b14d576d38bb533f66cf4 +295: ebc472cf68e67db6be510b6d4732672c43c74604964eb5b4433b9c779dc7be5a +296: 61e0af62939c09edd3e12e53dd5b304b4b8d787f57adb6027154f81c748bc1bb +297: cde92fb85c4aead4cc97f094f99f52379f5913a4857880f26a337851195c0541 +298: 48d22f360d786faed02cab1f293efa2372d1a81d22e2920f884bc379e87faba7 +299: 12041431911a6e89eae0e2210f2b68efcf666e6da9fc63c33a4efa73a513f45e +300: 0e859b529c474484c1daad4892757411be6c133915c71e11de6675303e8a4c5b +301: 4ea0f68329d2132134987b0a52d2a5f72b799a7888f8e51b538a3390adb18585 +302: 2228eab0ad664fa03107f7867ff9fac8d5314e296bc47cb429b6d59c08f8e38a +303: 9bb3fb3df5a2af73ab0f0957db8633b22ae1b257ccdbf6c01b644345228f71ab +304: 28060f06073a5b7044d979ac6ed092750933fa2a65834d8938ea1ef9b9b30621 +305: 7913cb25af88438f3a4be0a6ac9c136859efb982b51c43cc41f8f3e9880dbc46 +306: 0b58a75e74f595094152e3bee513f4b47f465e974428ec9cccdd71bf0137dcf4 +307: cf774b4ff8cf9a2b2df5478356699550be7a89d26ca7cd988bfd7efa53fd5437 +308: cd7b2510510b1e68c93af020629b2dfd5a4d0b258ec70dd601271cb9c04ff6e5 +309: ca1027e7ba838b52595f0a83fbb8d05e9417241f7a3c8c90799579183a2357a2 +310: 9916cc864cec1e57b549623007220d92320c51cc945bf1cc506deae386193dfd +311: 4f7f9bf00b3975efbc9ed9150c8b38971951bc420c38dcff173357d8594db52d +312: 584a91d99da2b8b99c12c615961f1a8ff5b758ea8780816e1a1767d55b1c197c +313: 2adc133ffcc65a546c198b3bf088be0bf68341f8c5b45edf0a79428cfef5de25 +314: f9488b9fe9b0ee2acaf54bd385dcba101fbbcc801b71d0c3a1d1c820f11acd65 +315: eae10e528082af6bd71edf955c6fc7873b41406f727fac18872ea586dd828302 +316: 8f6ce27e9e18ad70e112aa5daf18bf564284fe985833dd34eaecc6b5e064a771 +317: 6904feec855e513b2f2816ac5818335be61832d92fc5e020dda40bed646df7ff +318: ce212d5906da3e2701313d4111da2f23b0091347aa6107fb0e3fa8f05c8c6b7e +319: ae2aa88187825ee3364586f6b7b8394f1a7167710791447e381285707caa2949 +320: 2ee5e39f89d0420f9781a0fb572557595505b16c4110580f9e2510cdc37a6375 +321: 71b7110857241e261289757765c5505296a4c99d1a5ce1fcb1675f1828bc58c7 +322: 612fa9024db98b84df2aca6419b00879701d649698a5ea3fcdf0c13bc58bb6a7 +323: f00b094cc91f60ba7e0a47c5fd5d3a65edaf8ca278aa4e55a1a859b8e4e610dd +324: ac13597737535d11f1cb7c259f2f4c85eec3e910d71be3359e758ec25896d893 +325: 3b1bd1bcf7b79d5a722e1c731a63d3a98d5efdb5f6ea26207d66780f79645cd2 +326: dc147e3da606176129f7195959841eac83db95e994c60f3dced9bafd67130d33 +327: 8fe245581f1813f11c750b3a5b02c8a6cdf1b59c5535e035551e5d590d3d03a2 +328: a870586448d52da28c66c78096681dac2deec0f07b6ac5f6790d497b7606e0f1 +329: 3718898cc208739481343d4a15bdbabc785c59ebec52837a63904b5f313f0304 +330: c559c358dc83ceb40564b40818a0339c1bfaedc1eb3dbb1fbe9f6d33a5e35581 +331: cca494691816aad621a47fc105b8fde3341105a29c3b706e9455cdbbaea2204a +332: d4cb6e4742eda4523a5d178948f05468d1cea1e1fa2b7e0d99d2dddd1e4fa8b6 +333: 58713a47ee7d464233aa4a925bf8ef6e55b305f2b0819d8745afcaf61e118e71 +334: b48c863bb5cabed5aeb69051a8a52479f5a37c6a43a643bdb37ef006b4db54de +335: 89cb6029342df50b71f16f88d8a495fd53b30889c94b4d7af1eaf8b4a8c1d9e6 +336: 3da1b949bef0364d6fcebfdb11e6d2efca2dc012010268b4c02e4b489a75d59e +337: ef14cd74caf8f47b6eda03885d20849d734897cf89455d83305aae6f1f457893 +338: e46345992433ad8f196a241b184f02a2d2564533cd39e844aa47d9a87f65f8fe +339: 77010eddd786912ed75c3a3b1c885944daf061d58ef653e94eb549143d4d2766 +340: fdb79ff371ba418823ea7443652d37286f2000df06c3880f1cb322f74ff437fe +341: 53f36cca4baee943d61e97bc9a5412670ff7408af16960c5487a93d1568c9e66 +342: 9bbd9eb1d00da5c0b96926357cc38f6f649f4daef2d0d79452365ed7a5679baf +343: 6fb2e192d031cd5070fb63f5e6a23610a008d592e0be5083ac2dc2ee264701d4 +344: f369c877964f6bf3675c2302e0e7273a600e5e2b1d8dd9eb0bc9ae1ebbcfba02 +345: 5fb4511bfd5a89a4c026b227d3edc5a1e0553ceaf56b0559c334253270ab0cff +346: 2105b64db2ed533bc0529de6d4eb90500d26e1b4fc0393a24292c49ef45eae40 +347: f110830985de233ea7ceb040e340d63d933a74237a6da1b6e662b6fbe1629d7e +348: c7a09648ab90c57f8334972cc8b4a13f8f65fc8cb9d7f27450689a8daba72b3b +349: 98b4e3352af24ad6d1ba2e7a1eeae59f701e84c2504f48190c11377f75c6ac85 +350: 395301bd43b6315b7cd19335d054fc18648c41c24e4fe54a87c4629830f1e6b5 +351: b496a8803825e94563c1762af845668689af8264d265fe96628cf5ae90774ef4 +352: bc4ecb58601d15e4e96551409d1ae3479a4b62488c2d961ac29a0f16b18f02ff +353: 93c5010dfef6a15683ec0aa217dc00466bf65125374490fba0c05e2d81c0a22a +354: ed4a34ae546505e877a978f68ad58c78b08ce2e084e1646fe7fa25a264927cc6 +355: 6578751c4580b094eb245261b9e4709d001f228d384ed46c5b9a98b9fcbea42e +356: bb36bef38c0667095696efe5779f0ed5855aa5c80130f3d834cccb3b5ee2fcdc +357: ee401de8e74d5327eff5dc94022aadf9b18f203d1a08d1587fbbda1682d41444 +358: 4ca535c0625c02ffdfbc178b70a5d934c1a66b0c8782195184a02b860f119029 +359: a45b2b54514720695a603bb0fbff2bfc04780c97308212244f57ba7e45e3aa56 +360: 56872cd98fa9000f92148d6ec19c31e59e71766e342031a6972be4a453b2d47b +361: 273937ef97b43b3017f0f38746bf4a2e6f53abe57b8b8494e74976026d42a241 +362: 637a19b146aef1d1084f07f0f9832dee7b9ee4e27d803bbd709467aa2ce303f9 +363: 7340af34abc3a6a30a14d0ac2648bead4cf4dcab4f252874f95b5dc121320998 +364: 11e11820eb3b42a6a97b7eacaddb3fc01d7731a22de37f6f379b2e3c91a3835e +365: 9c9783c63124a6913f338194a0605952ccea0543bb5573bae70f440dbcc80928 +366: bd2e7f67123d49ec4d8e529fc3714f4b7a0b1fb1a8bbcd6026f53b9a087ef946 +367: 89888854c22789bb35942321ea458dae0dcce3aa10db62df538cc8d3f5998206 +368: faaec2e73a456fe3150d2be01dd10bb99437e801b4f4984ddf4d26d33caed5df +369: be3626c4c9ab11b5e038c036874d5d99375491124bdbeb3c4027b29e4af1c5dc +370: 022ac8a6d2f09db3edd2dc5b92bfb8cbe893f83c2a48b16179868b891021ee58 +371: 0ae40bd4ee211d6f9f9322e7811d80aab3bd81c17191ba32454b3c9092854cc4 +372: a3b9af71edf59a632d02f4819f4b73fd32301d36f3ac7934659338a70424c0b4 +373: a2088bc52680e9a605a2919112a655058039dca5db6d3a4ad28f0308f82a7b1f +374: 9b69873872d2a1d90c3cf402b43ace8b5a7a37b02983a208167e865f51feaea8 +375: b022041c3132842a4bb6f1efb8e75fd2c48abc0352a40538fde82572bd8b4c6e +376: 79b15cbf5b8e0dfc79de050e4b307b1dd7d0a4cc6949118b1e7297c326bf4505 +377: 03332d4b5ac755b4918c7f9073f877cc1b9af8e97d800dc45abb4a99311f7bdb +378: 4bdf53be72410131df3d1294b5c3ed9ef166900ffc56474452cab8a16a42f65f +379: ca9801e8fe29a1743c4fe59ee889c266ce276e339956341d94c40ed64e2cde7c +380: 51e0280d03118a04c067353eefba23faed845e2f8aa77c114e8f7ce9cdd76ce8 +381: 92cd4b7886ea31b185290bfdf704bae8154b2035961511e98fdba5d107a270f6 +382: bec0c70454a64f9d37e0b6ab2799577b7f98557a1b64871235a3bfd39d89556f +383: 00162012a6c2f2b07d88e02d9096fbce28672e1a49ba27c9b743c0cf3be84445 +384: 7348acf111fe5513ab119295407bbcdfc6ff24d8810ba258c949154b2e9d1a0f +385: 2bbf687ce7569408c515117fec126ae3ea11af47dd8a5e80c1d45ead997cfb2f +386: a993b3a196f19459dffb4c77a1dbe0f2084c02553fd8b4e8d5540705bd50e1c2 +387: 26f84446687ae90c1813fa49721257e7fd8938bf303dbd72cfb4e32cdbd58701 +388: f467a901838d0f18b1ff23b4b92a8eb47d1087973a942f160f3657ae8c25e82f +389: 67aee2303ae947f1c3cb06e7bd76640be6e007dc21ed674e82c56a2fb6182e37 +390: 36eacf8ab85aea33a2d0cdd5716aefa875da36d05e765fff91bb5c70c7fedfa1 +391: 2efed6f5c3303799203b563781fe7e8dd10e5153ffff7f40c7eb71380a11781d +392: 33fc4ac404c554b242bc6a95c32d4a780ee9244729a5787009d6f776b8e98397 +393: 0e6a680ec399b877f374581475656c2498393025aede5857a3ae508ea8885da7 +394: a5e064a448b5ad1562b05f17e73af343045c89836ca15fa03936f2cd23f7fb8a +395: 5a22f1f5098d4594311fb19e225c848602e7880579356f183ca882aad3eddea3 +396: 1129d0a75803362dbc3b9d3d678fcef29880a5c5673937abe2f0ef71ef83083e +397: b8e2c3aea667c4d139a7adee2e29b0ef4ab85157d97d3a593deef208dfa5850d +398: 77dda75715d6a77138f0b4c95c8f374b6cc9cde0661d111bbd7293dd0add6e45 +399: 4d9199d53858bd285e824099364cd360e55358bab92f6e699032d7597c78127f +400: ce5296b7199d32ea2668de4f0e12b522de695890d491b69a46fbd3b19443a5ef +401: d953f34abc2cf734b1de72bcd5fdb9e34b3790c5539939dbd0c580578cd4993d +402: d11987f38e5d5bbe655f2c1f0693f106bdcf39794bba6b8318ea575f8bf0231f +403: fa1995a87664b4a1335b18f635e132113d802bcf3bfaa983844e4be9aa48302a +404: 94d26f5751646b41f46cf71187773ed3c3fa5a059956c377be54d6e198fe7f55 +405: 73621384cef28085fcf9579dd4b08a9c60c6c6693de75276d77178242b31e9da +406: d18256c03fe2200e7fde200cee7e5e68b31fabb35ea4aa674f1480f0c70f40ad +407: 228cb345ac19bde898f5d1bc0c1606c20a4b378d39c45f048f2ae641765eb3f3 +408: 127b0845056b41d6ab032c78a13878dcd7f54d363918738f107b4449ccd58462 +409: 478b6381cec4715437db2bd003710a92e5e3355cb5e01a92d4eff6095d2fa3bb +410: 2875c4e4a1c27d09af73fce7b0c8e9f0a798ad157b10b92c36f696f2312d52f5 +411: db0a692d081a97a3d3bd3e525109c1bb5e5f43654c538dd155e98a433d8118a4 +412: 5225f5acaadeefb94ef492e502474d900efc6bcea98579d120bc59c7377448aa +413: 27858430af45f95e7dfe8857d9f09e663577b2b858057eb531c8698afbf75209 +414: caf13396952df2bb16c10d62c34df43c4c422be52fe963401bacbcd8b3fd9720 +415: 7c9d95826ee3ce61e664940568a0066e9cf2665025f9d085eff982292ba42fff +416: 0d2f401f6deef04e52f09d18991981dc4e4a410e14bef6e4d0952c14d4bc791d +417: 5fb3672a06e111c544223114a982f4993cd0a0ae2f8f20c736ea622f9a592f3a +418: a143850d422c27cb425db67106caa1546436e843bbf6c7c5ca98c7d8b26500ed +419: 3a7d55b86405bc716dd23033ade4b475b1e16eda03737ed8d54783ae48e33842 +420: 24d02ba759abcf03263bf74b4149e277de035c9970170aee0cca3db4c3af0181 +421: c88f29372fbd0f25ef8f22d73d2c1a011c2108e43bff19231bda4ecb0aa870cc +422: f13f8c6793b9fd9dbaff1f6e7ceb6adcbb29df48412dff67855c37ab4d2ea7cd +423: ac2ebe0fefd24d17b128950992a8447d3d72e96d9991aa28cf949586d4aedcca +424: 51ce61394aeaf246871690a4c3f9e1611efe3db47689add4f6553ac44c50aac8 +425: b51cd46dffcd7a50fd1bed06d63277dbfb49a9dc52d130d2fb48cf763d090eb1 +426: 8cbada55be3ceeb7ff10a3a86cbcdf93cec431bda81cbadb17c35889517f6aae +427: 271ec5f0f337031bf4da8dffe63665d21a1445076eba7fe6347e01130724c2aa +428: 4e6b0226f4537cf206076359b05c5e848c278ebee902d761fba857852a94dcd4 +429: 26b02334cc3f7063cf3c98509be21fb05380a1c5b5415c551374ad541b25b73d +430: 855ec2729210f95045ebc4ec2ffb251aaedc552cb84b2525a111f09110a21957 +431: c492ebc57c483a2e9b696db4b20a7d06246ddf8eea54e374d6692f1557528c06 +432: 82dd34db76d8eac6badba158292cf14249f78c39e27219aa8438ff147d6c3686 +433: f71d583756b28252c751cc4f86b96ac2b24fd3edcd87c89920fb7cabd84babac +434: 0c00bc0ff60cf805bf9f92df1780f5966610f24352cd533a2988dab8d59f4dd6 +435: 52d23dc9cd06ac01737352ddcf5240e911361c21403b997b417476079db87454 +436: ec9c3e840bb9068563e655fc0115b5f2320ac1e26e91bf6af4d92512b1191a99 +437: 796fd5cea33f547b238d9c191248348e034ed06f008cf8b4bafc428a52ba9d04 +438: 400aed2a17301c211f09c92449841d9bc11246db124d6f1f1c584c0589116434 +439: f4c457c53d3ab63c03f3ccc4a18a9e45682a9dbd7dacc809fbfd20a2a7e95bec +440: 3c24b2f357d6ad70a76da8629813ebcf1a82b5dff8e73f4903709fb4214f5ae6 +441: cd1328d67eef562365c873d1cb56eefecfe886e6e6197f98273ec2b2d642168e +442: e36b514415523ce85e7c285edd862b158e60e5eb47b45d4b3c907a9cab4e6015 +443: 0cb9c2d05d74b1acc77eb6c71e8dd69d2b2788ff3e1d40e214694abd1521121e +444: 49d7ad342aa3876e558622dd03938a6aac258784ff02d1c474ee3ddabca6bb46 +445: 15341339c524f870272f562886acb9e8237330a29f89038e61066182d927fce9 +446: 02488037fc6e3b89cf003af6f4ec63ed4203384266c064a7992e0c05a4bdf14a +447: 2dad5437171fa3401711b6fa7b4774ef6c5ad2a8070abeb6229e658ab3bc04b3 +448: 2b93fdb14add3c52d2519a2fecdc906893ae77ca2756ae6290a62af5ba0330ca +449: 08627f60d00e95c42b53bdd5eb8d08b9360fc1795191525cb5f9ca9dacdf4dab +450: 76f89b17a70f96f2fbb35119211f070fc6e5d71bf75c2b60596d6ae277ddde9f +451: 4e2319c28de62374e7e20f639ed19df7dd0208b6fa729385d8a97b7ec0085179 +452: ecf6bb771055ffd58c77062f15611853f496708608065ac61036d7e01f50ba4e +453: 6815c2382af401c3f5b65fdee1270d065bd53c38eda08985fa4699b02c975095 +454: 397db724108990d5a402ddacc938debcaf8b3f9b467dd76110a0dc146b451042 +455: ff534e92474626cfe49c76261d074cbc93c442f9729f6052119bc2c97ec27f0a +456: 78e86805f8b263632bbd8fb30f3ae913fe5b71241ba701665b7fd73a9087d9ed +457: a8badf35f8fd4168f41779aaf5db3b51a01952b731ccf0ab04d65924905ae4a6 +458: 188a69be9bd313c3abf0d2c9f86654cf1e56add4189cc9413456a51947b421a6 +459: 8af25821481a3fa7137e3d957c64a97d0204f9861bf6a8701fafb20dc4baef6e +460: 6a8a04c755de9c6044fe243e31b45a3d5963f22c5323be74eb04965ed419aa54 +461: a817f1b7b748b0236c255df87d31be1dcb5b4499992de7d9b9ae0d259ae91e48 +462: b7290cba8e24e6b9ff81fb5b914dcb248a58bea9b021ac625a7c9f29c8a3ad8b +463: d2e4f2a835d2ea8e382099975ddd354bb129019f61b9d56326386f5ffbe0c2b2 +464: 54db5f0f6e4746652405abed569c91282193261669c7daa31e8e649f3522a79f +465: 50cb4b5862df24e4065c94c71b27606a3f811361ddbaa2664aa7c88dad151173 +466: cadf8e317c0dd6c53d36b99f832a30ae150a32c1d9e2a95e0dbe9219fee60e83 +467: 29196500ec6a1375916b0147c353b8a4921aae592f51fb7b492c3526c2b75139 +468: 7766b257b8e202072cc2d65999388f60f55b30517646b258bb5075845fc7e4c5 +469: 211a46ca3d1280a830bfe997fcd7fa606f56547fdad9a2141e87b67af443495a +470: 18e523ef28da5d53433aac9491ee418c7785e82ba8b84c9bf091ab25a709ed10 +471: ca746cb23c094d3add9a0ac70cc966656563bee80fdb1cd9d729a69da2f1ba34 +472: 87b9a1347f0e33ddfcb4f618a3701d59b57d6394d439474bb7016d427fbe276e +473: 22bc2c81b6f94c84ab0fb79b3a7b2684ab7e8251caa08be6b8701aaab24ca5d8 +474: 5d10fcb4b8ac2461185f5417f5902b4c000cfc73acaff798d8521c77456f51bf +475: 8141b5641ebc92599e3f5a7e14546eb15d2fa8a791946bf0a84657a346525cd1 +476: bc82d29fffb497b8c2a9fbcd2e95b85fba93cf985cdb56461e59b69ffebb7f22 +477: 0a57dbe66466333ec1d7ebdfb6100a903697c45b99e0ac3f4a659ab368ae1a85 +478: 51ce84d63b52a81becf17ed59ae68be2ebd629729d5d4d5a2f1583d744bd2a88 +479: 48aa59c51a05b0a5e61ecd89c2bc8eac6c10d05417ec000cd7580ff52b4e81f6 +480: 16f73e3ade83ed3c9ef33e3c0c01a5686b33a05fe1b18308e823bc2e504136af +481: edb9856e42e585fb13ed96b367364f98abe4de71e2e423d8fe7c6de5be223345 +482: fcc764222c981a04504bbd3c32bc7727600b5c1f9b386e22a226a668dbda0c87 +483: 1981e5927b9fd162ab0bbb5a365b9ed8e247724334fc59ad28e394a6c4be899c +484: 90cbee09dd7935d6837b9a1b67f9405452603ba5b228bf7a8549a2abc78fd255 +485: e504621151f680b6086984a4ee2d15857da704a659974af5ef93be2d1a9c356b +486: 203bc8fa7a5c11b2eef3e268df252033193381dc8258ede81e88143ef23a8b5f +487: afe30eff8e40220ca4e024fa0b94a46fcc42c0cb55df68471665b27732a60a59 +488: 48fee4b0bdb44c09ff517e0bafbc35c7b825379d3ae21924ef0a44433b6a0447 +489: 276c7d526581af81956eb0e247e55925c069a843ff139bc2ec057b5b2293b689 +490: d238303b4abec814253fcef18081a517c4ef3608cbe6a4101edc61c7c70055e5 +491: 84a409eaa8a75a5c91c97b3969d0987dd9034901c960ed9cba49994f0bd8372c +492: 03e947ec08b722db55035664aa0342bbfa6758bc164914365775dab315bc4fd2 +493: c23338219a7fabf5220ee25cd9f033ce9061d7d5bcde28f9b0110a8d43b3ebbb +494: 092bb0db220936de15bd23e6aa1129c52c6b7033e6f801f7dd052bee713456be +495: 5c6f720499c979727710b23ef59996f4cb44e39a95aad30e1e395f05722dd749 +496: e6f72d91a5b12e3740837467c1f577e4893965d0bcb1d5b56dd2488a273ae016 +497: 1d8466d5bc2c57f3d39b4aa8fed21acbdeee64edad2f0b62de769b4e0822edf3 +498: 9f5ded99162815de77cc21dfbbf69a3f96e9a7b6b2c86f50b1c511dba25360ea +499: 3b9fedbcb2d3e8a6a4bcca281e409e1dba4dd05adc2623390f68956711cb9c3a +500: 7d1b86dee381d8053344099d321854dec6d1ac7e7b7d63e587211a3c23f4e72b +501: 4695651d56ec6ffbd43e3b8639f1b417806d9fc8af1ef6ed8d08e644686c817d +502: c48d004fb14c505ce06d9f421ce0d35656c448d631515f8652ce931c1d4f8eb0 +503: ec475e34472eb053e407782d27b173ef82c06d3088270b7da089f7c7e2cf493c +504: e5ba57405abcc5d8e5b79013f8325915fd0cfa08a59f3860b83460080c3e70c7 +505: 94f3e311302ed65044838b6dc97d51b414b5e7949ee23520a9052c21d486688f +506: 33b34f47628081709b85af96e54f4a94c882d06efffd34ff5a5169b5751f1af3 +507: 8c02a790b27b4d6e792db8951dc9b0f1f48c0e1338efbedac92e485a9c6e3df3 +508: 6a52e76d0066a0b76789b0210d26d8812f06f7c8d7d0a968d901cc16800bfcb7 +509: 2fad4c278b249feb6bc654c7f80bf6c7c084457980ea4a95b8479088dc3ee562 +510: da0583e7b44f358b26a83db200c8793f60164347410f108951816718d55b040a +511: de11abe66ba38bc11b0439129fb6ceaf39948b27cafa3275890cb05f2a805f65 +512: d2dcc2993839741afe2de012f94b03681fe5549ded0ee3316e48b7597359dc69 +513: d88520e62209cc1fde3c9b16ec40ddcba1b57f06bf9a5146dc9014ec446e6f29 +514: 242514918e564473ca0d96285b7ec23bb5e106b86977ee72cc5fd49bafc2ae59 +515: cffc937d5057e24f8365f89ae7b2b6afa8c8bf6ded43774342756572f2a8120b +516: 05c1ae4da63b088c7a6446c94506469f83f78dd9fdccf0ffc554a0234bee96a9 +517: 6b837bbe45a0392499efcb1fa9d0a183fa265f259a0913a685fbb6fbabd9cfd0 +518: 0233c64a15db203e102e92b949ff8f5687f122b73a6098d873995d3a69f3afe8 +519: de996204b8668ea35758f4a434a82738d2e4df397d56d5e44edbf75562967d9c +520: 5847a852cde88f947554f4ec2e0f8df4276ea4ce28431dab17b849e820069163 +521: 434b92148bbff5d2286e0e80eaa0c4a3eb53c7a666ba23777e7bc458a3201ac0 +522: da5a927529243cee03f6c1398e41447ef5bdebbf61cc25817c688005d45b0cb3 +523: d838b16255c39410f535eded20ae4a2a14ed4196bbdc272c4ba13de25217329d +524: f46cee99cccb920d7c9567e571c793ac3020adf9502302faeca2c0dddf1f08e4 +525: 1e5c71266cc073d99f10093786d1d141770cfcd510431870662fa857dbaf6a5c +526: 602ea3fcd4d90de7a8b5dfcf65a61d53328f2edadbbbf14c62b2a6f9c3213a5c +527: ff707c27b1d462f2cbd191f8555d2bb197a24480ff61efd0ce99b521878afc6f +528: c47995d2a690c25de33d55754d77ba8da2e841a86abd46197db2f5863524c78e +529: 89b542b5508c1821a670a2745fef3b56b7e9a0f8aeb2f8bb2149e90c75e2139a +530: d5b89eaac746528526cef9f99a3bfbabf9ce9b6ff604c1971974c8d27442981b +531: c9cdfc6cc2de550a33ce68f4848b4c619f0b425b699f2a2b76d2db475f6f7573 +532: 9600f94b77994e18c362504cc144643e90419eae3f468d3ab4e390e429d0d5b2 +533: 7ce9cb9bf84b35a763110b7f66e0be7a271371a78a5376712c19447534451db7 +534: e9a8b50d03e1972741424c2c16b37166fd2d8b6fa17d6de9a0ea6d5b500adcf4 +535: af46270f70661306342e4d96df5f73c51be87a7cc9208e31356129d2d255a9ec +536: 0b84feddb3d62c3515b4e0a082f485313a7583d1e69d28f5b56928b177bde02d +537: b78ab7ef9a782179abb877115e70e9ae8a4df5a2532bc6d70a49137524d18c0f +538: 0eee1d4fe4ba096f194d4bfa30bcaa12cd5c5010b42c81997034a8ad71de5738 +539: 1d750f1fd643cc8cd360ac7ae41292051c7aedfff4ded6b61566739aa90890c3 +540: 38feb94cbbb3637ac27d561b97274ce8340d9f49617cefee8884ed94de6ac579 +541: 67d18d9524de82f3cb9048127d4c429f9d4b33ad3a9aa99ce86e34bbddf81488 +542: 24dba4f062cce959ebcf758e3be0363905a80b191835bf4333e5c572c085ecb5 +543: a0945db8081383cfed2d66fb9f79774a953ffc9dd6990548da55c90b800077c9 +544: fcf77a9d1f6c84048163f9f1ba21eedbef74dc62c12505a23934b8637758fc0b +545: 6768ee1dfc4d9aec0fbcabd35ec91642bab1782d5b5512fd1e41bced92cee73d +546: ca536e3396347e0495b021e2e84003985d9304360c1505e0031f6c1e5b6e74ee +547: 6dde51e539def3bea08bec0d63d740dd61b66fd16f64296609db33103d76b7b1 +548: 28f4238ed0a8e8eeb50b1b49bb0017a5cce0b2f42816caba49464096d602b8a1 +549: 173c9fdeabdf4be0e5b8dbd4784cbc808e093750e2397388cff3c5979d875ff4 +550: 99a27a37ac53b36ddec9cc432b16d44f596d7173184d0bbdf1547a4e04e3a1ce +551: 86413f744576d0260415fac0247dbd61a3867fd329004217a9141f2b0e5bd2e4 +552: f2f8c905ecd61ae2aa8de239c64fbd7b5f0c847ab18e56177d76240a626008c5 +553: 862936291eebe5ecccb4b213d74c9a7f022772fe1add00f7af5ac4ff6223e346 +554: 0c47fb1f36affdec39eedc88fe9bc3afe65f910047fe9677583d109837da43c8 +555: f7cc0f262bdaa131c9b582d8ba3543f4de14e069eb8453b9c6435900b2628b6c +556: b5231f7d4bcecc3cac63cb530c6ae7ea7560f0c27e41557b6ac1146a2c1eb568 +557: e8599934318acdd2ef5e7fc634960d76700c92d313dda306c2cb17515a327c3f +558: dbd646fd923cfc9b10ae498511d6f131ee8c985060590b06ae3678fb8b46b5c8 +559: 6d52ecb66f21882690258d77f9382c35540363077fd6086fbe4682a84eea11bb +560: 07d78a6e3ea3c7f98de73559adb9e489cae8af8607a1fb3d79abc150f553319e +561: 4953e8f819a2add9b23853b06bb97e26c7fc49acd8cc1e0b4684a5d766f35a53 +562: 781b2f97f00f73debc515a175ba66083069d9f1506b4d6232acfab6a0a3ba939 +563: fe3ea15a76ef7006d987d06dca3e0f25ec94f0a25fcf3b0ef7240e3d6c47bd2c +564: 7ee11817f2ca5f9a6b0d7372849ce31baa3269e1b1780c5f1e0d80716c357088 +565: fe2da2c4071d83642a5720718e49aa5a44a5bcba7e8f8935f4021e0955436a5a +566: ae74a9faea147eca57ca27b6e735eb1aa8ece530448730c99871a39075870131 +567: e3464d5fbea3f20e2b73f63be61c455ca0a518f989b9d18ada7b790dbdc63fb7 +568: 6b48f7b2989583e8718603b3a62836a99ea5b37853d7bca7b70d52efedf02d73 +569: d460ef41f4932d9f4b1cd07da8f935b6fdecb23ff8b269c80e86bc7525c6f72f +570: 64ae878a73ff936644eeaef0338138b29e0a3708bf4e99cbbc654b94c4f172ff +571: 1a4965900231ba33d6d2a629c4eea67599342d97f9b0d859ffda8892f51d0fe5 +572: 105af97fddd8f0915dda627d3c122c7866b541d6a39f5ad8a77fa648c222ee68 +573: 79502abc9bd09ad2f2a3e454d348723a6ba623fccf95025ac9feb0f9de4db246 +574: 558fa2ea8d21782f73c50ce20441385feab4e386afa3359fd035921161dab934 +575: d8446ce7590ed28036768d268431115d1c8118bee49c74bf6f1181611acdee49 +576: 9b4a90d2d7654e229dc2035300ea60a901c7bd96649bc8d5aca1a738baed038b +577: 798270bd135c927db2e94714661d36600c8d66ca3060acdc991bf42d918c079f +578: d7120b2db88536e9934d96390ed9ef1eb11ce428d0b2b1bec41c8b1fbe51110e +579: e001c6c8468fc9caa9c0e42a731356aef769913b105945c498efa8c95718b06b +580: 0f62ec1075014e7e869cc697c5670bcd4a669c979a8cc1dcaa38e41ce67e296c +581: e5ac3f8d559a392edbd7d6ac10a89f2f09808f9eb9c720189040dbb0f87a7b60 +582: 64e2b58930dd78a546bc5b7e55f65cf44595435397f5253401d3a31e0c30b317 +583: 263373377014da213a97247cf6506808d90e15e1af57d5c13d8d53566b5a5461 +584: 9aa6715383e79f4a1ee8b8cc86f128dd84a4982d3c5a6f156b31e4472737c83c +585: 1925d844b25759a842c33263f155d29878b36fde630777ae0a97e2fe85cc00fa +586: e9e11491a037153d2fd0853c8eb489a6bf5fdd97c951c2b3bad7807a12f2bbd9 +587: 3d2e8b0160b56435c74603ff172092ff34ec4f82e614cc4c445e162ea9e07ab6 +588: e99ffd1b1a61b6004364dbe66570f205dd74e60843cbd9e43dca8dbfca625fe3 +589: 629630ff8906d7c13cf9ff64a0b427ddf9e8941647d8efa200b38565f80e45f8 +590: ae56197bcc4790e52ad8636450e7a9c6011cc1b1b6571ffb5922662935ad5e8f +591: b4f2c342260a8b77d6a4afaa9fae0421bcfb16256d45ebaa80f658a3270b93c7 +592: 06b84e9eaa313e7381f3a25a3b2ee71a0e058af2dbada33c08efdbeeb6a4fe1b +593: 9d45e4b82e1f0eb022ecc8dda15b45e0e23964671eafcd7786f44de42a53534e +594: 6ca41d669a06431c20f359eb53a00e8e40bff623502c06975a53df2c24ad2740 +595: 09987c84090b121bb669491451fd36981e35059a315bb3510b2910e5cea7b703 +596: dbd7606eaf66ce092f8df17a864e7e58a82950c0aa4f59a2163e2e0b98e05966 +597: f408448625e8639af09d36d1b0b4a8475223dfe23d9b13c344f6efa9b0d79b55 +598: 67fd26f76aa8fde40ea32742e9564f318e4d30393c8c8b3efc1874d361a0c677 +599: ca232d6b3a3cc9555eab03a3023cf6957a95cfa1d7675db8ca191c5b31cae03a +600: ecdc0f7a4ccecee888019378fe1111b23e4906da170fd1e3cd9ea1593f941cd6 +601: a2c19a29adae2d8a541915b310c566d55ea29cc7e3ac91f7fd3a88cce40c39a6 +602: bd042cabea0461654574055fcb4214f45dc5f7cc1d8aa821e259267d86eb8c52 +603: 69e0e38d26d191529a5b11f19ae3c78c8909855b6bb31660b5af80ddba964ef9 +604: 7bf4908e45ca86a3fb79c7e6a09f604ccc9c557974483aeb5b8f473e0c3f0a38 +605: 0ebdfc4dbca222ec3f4209d36e6235a433c2ec5f064592ad2724107ab6d2abb3 +606: f60e345855d5d683c432900a9a233fe853b812f6bd8446601bf8d410c3e67c36 +607: e4d5c7bf1ca47fcd5179833beb7a8489e910fbe93ecbc34a7c912c358b45bb33 +608: f9f127ddb0330d7588f3711a22d9372763b4661c63db217e1561c3b6ae45ad14 +609: f0822a7a0511193fd6f5a29ed39d8e8f737225fe3e7d8d90c704a032290ed1df +610: e07fb2450d06ac2305eb3fefb4b16b6eb3996bf91f98df58ab4af7bf4b24a5c7 +611: e6b0afff326f7f36b65b095072a19b0e104cca0dbf27529a7f39a0acefe8b3a5 +612: 30bbf45da7bd0d24f706803eabbbebbf78fc67f98e0af4d68524025be2de183b +613: 9446910610590058b8b7a5079920d545e633b7b7a98a114303ce332e34e1ea31 +614: 7a11ad209cdfd258c5be5247c594103ace97affeb5adb140b3bf4b9a164ab4ae +615: 561775fa45d789a4912019093df2cea17402a556110038b90fe8901d3ab910f2 +616: c40d48d0551a2fa949c0c19751b3ae0027ee1169ad96e9dec2bcd06c6f43bc0b +617: 675519f03c8208cce08fa91f718484864504085354356790c058ab9aab3009b2 +618: 8dc12b12cd525177c298c4c925748af02ebf14b8dc5feaee4bfb75c1218bdb9d +619: 62cb61ef8ecc400740115f39bbfd492232761effd72f67f2edf7a4943802b7ae +620: 6935a0079903436cefe716a592752a3941c38c6fc81a52b70c0d79213d157583 +621: 42e01b526623a41ec90659f1f3e7566c07254e21e5c3c4d8ec5d63d99a3905a2 +622: 8e0d64ed83799c1081e5eef417e3a8bf0e7b33f7c3458896e568cedca96f4b68 +623: 16854b1163fba8b8d5328637af0d7834b62318e11271f482bf3b31309bf9c89c +624: 8cfe1d643d67031da6ab55fa27e2017915466c5775822ac29bb303bb18f61830 +625: 1dc6034d71d1f5f1459607c478ea4aabd826e50c59d891a8cf36f6304053b478 +626: 2aaac5bcf9d5587a16a51d1ed47ff084105174d6b5f2ddbf2cfeef6664728970 +627: 61508285a773bab75cebfcfe19372867f10f80195fd58f4e4b829f857d769aa0 +628: cd700b9475056cf381f9dd6ef52afcd9868aac09d0c1849255096cd698851b5b +629: 9d74cf92c621a9cd48e4e658f4a01d2c9b245cfb616bca6247e0091e7533a705 +630: 6243a40194637f3bd50e96d703b8f5c7a4f60ed7b71da7051b7abe4d1155b229 +631: 06fa690518c85c3aaecb3ebbf5fb049deeb95354789354e77f0e87f714589f09 +632: 5f359792b9fc023075e078126bafb2630c07c55cac746cec7b24dd52b55e5493 +633: 7ca64000ea0cabc0bc80372a13fc49e3e19372072378561d69ecaa716cc32cac +634: 973cdfc51bee2d6e46eff4ba47f2f8dad5edbd278256a98383f3416ee1ece09a +635: a906682cd85185924191c3873491a18b134f371b3de306946e485cf2e58c04a9 +636: ac11e1fa3e0f28955fac401f434d384a6490c7b4309aab903d6fedde86ff044f +637: e95a1d5e94da3939a9ea1853ca677b7b4524636ba85ba6ddb3889337fb6731f1 +638: f91877dd03a80fafde2c3a39eeda2ecb4a12ad8e308b6a1df6a182580bcdba9a +639: fdcfd665e5ec4e69f48a8cade948e319b79388d3f2ff21d99d4f96b5c07e2459 +640: 3c65738454971b3a3f7df085a917c24243776ccc968e2ef2428f59e9a0519188 +641: 13c90cb776f1531391b36f927bbb760e29dce4384a42f6b071c22df66d06568e +642: 9beea97e1746d96db9347e330df0e92b5e05efe2c72f5b0a0f6e621d39fd450d +643: e3ec99168ea8353837cfea97f45c3cf297805d1cd3cb46ab54bbb35d0e82e828 +644: fba85e8f34b34a08bea61998da0545865a2c21a8784744d4d67dc826fe1f5fd7 +645: 40eb7652ace2dd1ba383972f70cfc3eed35bc85260cdbb001cc0e151f7edfff4 +646: ce4167189ca6c39a0a5e4a749ae0fa7247062a50920b4b50f266cfa6a9d34c7b +647: aff90a63a4a5e46e58d9fb16d33f06f8fdc15a73c7c690dd02e7a9f4576dadcc +648: d842bdf7ea299274d3bb91fc362e4dd4f3c28237e9d621e0f97488afa9a02369 +649: 18601f93b8240474442b832cf1aafd541b32fc47cd024bc626fcc850fddeeb55 +650: dacdbf42cb89fceb79d1d8bf8c583bc127c42e22c7fdb7fcc38ddcae39b1f62a +651: 7cb09fd65dea49174aad61b0cdc7c53e2b4d755816e1137c52ef721ec1b19169 +652: 8be09d653c065e39f84ba4312ff40abc6ada795ece77880a45579407c9bfdd01 +653: 41cdbfc8df373987d7a4645cabdb323ef92eb2e149b95b1cb389352686948c5f +654: 54dff6778bb9a8737f1eaea2247731d70620b74d4d2bedcc492a9768cdbc1e06 +655: 1ef22db51009e59fca54a417c071def94551ecaff885ce191179f2bc486565fd +656: 217294d1818c40457dae5f3a19368972c7375dbd4b1208c62f024a31ce3887f9 +657: e0d0f7c5f46849f29808d598cb9b08fb2517fb38d29a4ab1da969d956b1edafa +658: b3604457af6e43b8719e214620a6ce14f8c22c60a608381275e5b376ffeeff84 +659: 21e6ec5256747ee8ed0e1e4f6d461f8e72e5421598460c0923984e310eb5b3a4 +660: ed4acf4aba6c1f3a7dae1f27c14f298a7966c444e8c70b6ce1ce0c0b6daf2a41 +661: 0547af4c292895a4c18d6be5b2ac9f862f363a36bbfd52d46adb490175fb55ec +662: 3f08179b52d97e7372de73ddb39cd16211d212b0bc2c1790094b33781283e1be +663: 37ad8e73e6a01fd8bb930cb3fd00d43692d8c83d37b4ce6602ee531b282c0075 +664: 81b8b053eae44bab64dfc2074c706d52c748d75cd6231029e9f88e08dd670272 +665: 91e1f3207d4b0f56cfe64aa422c06a4245d701529df5d55ab419d5a51e0cf122 +666: 55bba2503739c92878cde322151f1858972c3ad0cf96c0eac0cd7d6c3b9e4077 +667: 1882000b8a909763214eb3116e4246c9ec71207a3c306d7fb6ee3ab82de42ab2 +668: 4c884909e219886a50d8100a12bcfb356091076fd6f144fd35b6854307d465e2 +669: 8c0aa56a953a170a3ff4ce778e7390362516837dc29bdfcb801a13f45463042b +670: 25bddc5907720ab48ae5b6ea70fbb97a387b1cd5d2a3b6786b15270283f2dfa8 +671: 872d1272dffc2f9ab8742a08a8ba2d38e49a5a6fca74ea6e6e60331ecbe39137 +672: 25755f0de23d9e58811332e75584370259973c264b7028e9f68bffb0d073e52c +673: 0b96eb45fb17a8a80aa73a0e7500e038232dce2269f9abf2add880fc4e2dd081 +674: 085954a53c62269bdc9d78c7c45ca58f5c0220f224c7cdd8b7bae4b6d0fd5fe7 +675: 670051db6c0fb0f947f5d7a11d6bcca2f73901b7b05662cb238cf04ba0d9e556 +676: f8f7c37e0beb0b45654e7f2f03e5a36b86144e5bfef8c580e1d12e6116cb62de +677: d657facc720b596aa8b5965df5e38ef9106e0db6bfb6846e4d9a8ed8900bb8a2 +678: f501202de6e6a53bc96325600a0895f830ee20f4b03d81f98af56fcdf7605f96 +679: 558f0c67d147748bdc5472f4be0584dad452cff1ce1822f4f1ae2355020ff9aa +680: 09096d4a259c1c60bbcd25563301520fc5707106fedd30aa757f8790bab07d25 +681: 5ae02477e97e3f282a912fdcfedbedc45b6f48db463bf1a00e6208cf3a8bab6f +682: c2ae4a0b03e6bde0f10f82cb3b74fadd3952ebf9dcf8eabb3f24b2f4e3e2b0c6 +683: 14af46432e8204cb27f1f37d12605f72d483aaa58164e16a9a0318bc6da38abb +684: 9798e1db236fff527fea4b493d38c7f13200a80c20238dbaac17657d1c8331a9 +685: 6db3cb731b30463f68fd3129da52623d09a8c0913cbdf45c0ee680d062b7b014 +686: 7630c889c0ed3cbf196c307a6b13b5314c35f8e08efbfb85680aa8f56d8b4073 +687: 156cb56203ce9103881c2f173ef69dcd31e374dcfa00844d909246e863c9ebcf +688: a2bbcaabfe54517da51cbfc527f0e5768d6aecd5a6f71c4c70d90ae3054f5518 +689: ec7f5af5f68937aa3bb2e29f89a76c110bed1740ed5cddbb31a4bbd4d8658c3d +690: 7b1e011cc68d027165e019b9e8e070616cfc4009d56d366eaaa4cab247b423ea +691: 6cb2221d41e75df3b985d2647836a26d08f78be70b7d8028555b1b82dd17b175 +692: 7027e565c0e317fb988f6954622a47a6c03e5d6ee9b7f38dad7f8a01ba315887 +693: d329fbd15068a51d3daa23ffa59d8e0d5c2be54535eedd0a249443bf3111059f +694: 058e67814877f19a4d38f3578e63ecc63b450763cceb5f93d6baf6708c6165b4 +695: cab5ae80484fc8573e274316d10e2e6b71d64a5495b451817d59d37fc62cc118 +696: b02002fcae0d4643be5940d223d8d22029fdacd277d153f4833c10fdf502cd77 +697: b245a5c7d95ec8c1cf1cb22dc679847b982d55f3dad6add28ee01b67a6f41fb3 +698: 3f388119f98462ea94fb56e55862e083bd3f859a02e3ef23f25c949cb9b7f5cd +699: c381b56202caa27cfa4e42fec6d238310472bb8e871da0cb47082388de7783ef +700: 0193afd46bb14686ad253297bd7f1083ad6a6940557fceb89461a9aeb6c3d47c +701: dcad33f663c6716db58b5a94edd0b758dcae719b37cac7e6a58db609f9b9667b +702: 551004d18fb394492e86ff7b76c1ca7bf4c83dff5c1ab5535428f217a14cd602 +703: 77bd6a37b0aff970095be63545ca1cf02e28e282240d1ade1e5d080a7c92da12 +704: 902fe8b742e49a4e68af91a8b4c0c78978bdf77855f5af1a010538724194fed9 +705: a1c9180fc41e810a19223ac72f897824ac6d2f59c2ea38cef85917562145ed55 +706: 341d0a96981cbd4347eb91fcccd144f35a7b0967dea0d6c64031b8fcb46b610b +707: e1a629e9a39784a0c28e3dbb2abcbeb83b07680fb17d410d1b8954ed6ea290b5 +708: 0d781c220748957cc95d3153d4b247a2e9ee546278f06e4798bb2151797990c6 +709: 63912204722a1754af57ffa997b549db1ebdf5433c1be42e6af6f9ec482ddd90 +710: 0f61dc240b6fd221221b377f0345a2cff7f13da41d4bd1696c81cff5778f1bec +711: 91ea7c1927cdf2cbb1263650afb35ada8da7d34d98e2686c50962b30b1508ce4 +712: 6e7c14bef3922a5c8a11953512011f61f75509193caf284930a585fff49c870d +713: 99b34c9fd41ebebb6076b75ab3b22da39a9488e4538d6fc016e45727fae8572f +714: b4259f3d957f9561144098aa8b3541731155806ef06b403c2dd4ea4314e19fdc +715: 86e328d35205220f7befd72634d61c329f56a55ffecb247ee83832dd1fe36d63 +716: 6d3386b03689e959ee171e2cc6d3ecf9b250604f34da80387fe1c3b139b6c0ec +717: 039f3c02d3ba2e24ca8a6057272b987e2e55acb88bde7dbf92ad36c49bfc9344 +718: 715e95be267ba0eaecbd230f6942a1eda2d4d8ff36c8b72948a7f721ffeff3bb +719: b4ccb610ffe7c154f7f1d588f597294d2c68c2dd725ec98fe03e71cabc37cdd3 +720: 8bcf65644a63c50a37e09e3cbaa8d771ab92a0d71fef5dd94bb56a001035149a +721: 0993cae164b8e0ce36eb6d4bf7dc652106bb97101a8a7c45ee4dbe929c6052cb +722: f4ddfc20a477bb8fc717d7dc31d195aa4dc55d420af8999d5e40de5084c63834 +723: 4ddccb7c7b7628b354264d7dcfeeddafc1bf51241a20bd8b514852662ffa6e9b +724: e2de5267f2e4cb47946435c2ff943e5d66f7aa9d43497e192ed184cad165517b +725: 9d15b89c15b2db62cbab5119fa15ea4dfc49c1523b10916af61b194ab61488bd +726: 87ee80452ccbe78c55b2a7617c8aee128648f22c4456e42719675cbb7b506af3 +727: 4d5fcb9e907346e305ffc20fb57351f3ae2a43211c4af10dbb1e378b6220b9dd +728: 8129ada76295117f5073c4d5a613d08630d91dfaf2777b13ab99ac4509a1f6d6 +729: 5c5c1f33a4c0ae21c072d8790ea0fcef957db8f4033198c0cf5d0086d158611d +730: c4586915ee3ff4e0547d29a546f03d197d33d9f0bc1aabf2e4c0db19b87afe6a +731: 665fa3786202ed507fb2df7cca87dce2c0be5f4fd125dca54e9132d1c0028acd +732: ace821e7584a41471b2e555a1c96384532211f6709d6301eac0622124684bd48 +733: 08633271be3a0ff80987897d45b2592ba11d3c482acf58b4ca3fba1cd2964582 +734: 1cd99f1dcf7cf5263aa8513e11970c77638d936978836e255f7be3dd3bc749cb +735: ce55387875b7f7eed70163b6fe9a4a07f10595fef4d77d0a572e3ee4917b4d5c +736: 9c5e5dd2f195155894c42dc959ede741a2e88d319e95f4cb087aecb837708d12 +737: df6af50b0b22b3d9253a56ae486cd14622268faafa94a25d34a1d1deb23311de +738: 1c45ff7fa7e20297a74256d37f1c518e3d49c960a847c5a9fbf89e400ad1b289 +739: 13322991f05eaf681a68cbb4978dbf26a12c1230ec91654d9e46169bc06bf181 +740: 7913ce5febf072c698215215b7cb4b180a9256e0ed63d754357899b2468f3134 +741: 46e44f2aab1eb83a979dc3dbbec17208dc26fc377899c2f532b5674da794e784 +742: 6af8e641c124bd85b05ec7278aaf1a8b4db3ab804a7a6216f83c399c334f1152 +743: 9392bfec887e2f83109c3b02d2095ec5822917304eaca799e3c9d261d74018d3 +744: fce4ee633e07834f473aa58e0044394aa1105f82931a2ea5f50118f16e18009b +745: ef14133b9e9f2f00b15ba3c9019fbd27755bd60e25dbea93c271e55337de66c4 +746: 13f95c9e923fc103eda110ec9cdee367d01daa39934f4a98e2fa4c8d508a0690 +747: 2b5910bb1e516298aca88c502c033409abc506e4e40adf84c58f737aa02fff9a +748: 010ea00917ac8f13d0e9d1a699a0b4f970d7a92f5f0676bfaf4734ca6fff1f63 +749: ac22984ca1e9bdecf3a8c81c4f5d8476745c6d44cc4ca3dcaeba6275bea17497 +750: 018910488e6cddc4d3a796f5bb981f456a049b46b5e53fe4dd90e55b54796d4b +751: 2f06445407652ac9e9af69570fa28f06179da64b6f9005f2910da20d1747b568 +752: 17c32324ff9ca42bade9d2da7edfee2b5088dc677c5ea0883b515a327b3e675e +753: 640a7770cc32e92ed3e1412c79495a3128b4928659f1bf7d9ff20e53e3dce174 +754: 7f8faa738137234bff364c457cbdab3b9bb2178b5d59d7b67584765b887ddf47 +755: a1564dd109d9dbb882fd221404b402ca046d268f592ef0db21ceeca9490f1d51 +756: 36dac69112b7c69315b52652f5a013bc6b6d4382e0d9f9681a34691a7af5bd21 +757: 1b8753eb292930ead17fba8755a8c6fd2a2cebc0899bfa0feb2edb91f2783feb +758: ae37c74438422742903ef30ae9c0130e4c860a2f11498082848edf6b15996bcf +759: fdaecaea39e2ec984e8c984d85292303de1e2ec12e0b75ab990bfa7e65a48c88 +760: 78867052f7feaf352e97dda57e7792b883ececc33790e47e761aaaa7f847027c +761: 8c73f0f9603bda755f7fe787d4679a2c15a133d6beb2e2cfca4706e992080e6c +762: 8b3ee45fa3a6cf9edca4576c028c9d28ac281f5bc69df1732e2185704537828d +763: 5736c03e2e08901bdeb740fc2a11697366e4b071e6a611c3e1b0be171dfb0c7e +764: efc3d8a8cfa82ad2b91460268ea2181d7043d9ae429f31cc6bf9dad560e01b88 +765: e48a56496817eea0b94249f00d42eb31b1823c700cfd503223430e5377b0debe +766: 0c0a87e714cbaa1b63d56912232130ff3f96cc91e332e40a471a92fcecba5b81 +767: 9bced3b9012155f5281cd83991fd328e15bb791cd2f9101c515633b1069c21cf +768: 929fef1fb81ef39d6f0bee50792bb01bbba750ed95359dd17349603d5c6c9cdd +769: a0298e71a6bb25d843f0a486c84b8af2dd96273939e9878de824dab5c6d41454 +770: 779c19bab13abc41e9398029b1810f0deefde87aabfd55e909ed0931b72f06f0 +771: 88f1b56d0fdc5f50833214e9a7046a980a84726ec281254e75ffa8ee81b24597 +772: 3a7c8ca4b0715d42df6ed02bdca7a6c28831786c3d997485c6be4297152ed0ee +773: 88a0f337b761e71843f41381e9499cf74bf2978a65e5e4481f663c5fa5929e73 +774: 76d365352800adca62fe521af012b686c0b209535bcc4f8b45cc9e728ebc9575 +775: f008acb3ea6cb87a29aaca44df6822d583fbf70d89c20b91f1310ead0d336780 +776: e18850ada303a7610faae0f4419b8b074077d8b382b3519333d0919b56e11134 +777: 95d3f06b9a095e832e32ea5b045de87de1bb3f1dee7aeb90f1a62fe1d8844c85 +778: fa72e0399e52403464714d857bdcc5ae78525e81d31109539ad9548e177878ba +779: 091c9e6519ad79728660cd1411222b96cd9384926c652e3b4fdd99bbe1b29784 +780: 3cd3d2b232a67cc1ef02be591b4fa891d31b2b87127ba63469751afb6bc38bfe +781: 0111a5800571127692423a0b5e64d2de2d8fca7c8a4f893a3a3efbb9ef73d63f +782: d4182bf05526cd1052f743b4d3084f5497e6d752011ae3beb3c884785f0088dd +783: af9f702f77c413a95c767ed22a1a7af5e1951fa09fb921a0c56728a901f88384 +784: 548e7fbc9ee3abef91e8f5d86b9fa2acd18b4e2b5b5f0b06993b020dfde7af2a +785: 76de3a6f51f1ce104ccd0ccfe9cdf2eddf3236bd237ad61d70e16e728f1f8830 +786: c7505bcaf65afd6fd64fc58ba1d0e7888ef4b1bc3c36de89115938850a9ea89d +787: 9de032b9b6d296a31542bb23b5f6451ad14d3c3d27f2f2af88c35a11c9b25beb +788: 9b59e2d98895c363229b3a13175dde2307f5e45e4de48c7e01fe5dd7a66d516c +789: f2290cd7d56562b49a63fa0a6fa75eb43182193e91eafb6de4d5b3a42114f5ef +790: da15453aea57615a06a92759b6906a3b3bfc65a49483f1b97f953d917170c0f9 +791: 7a6cce29f707485231b40c4d0fd2dc3e162dae1ace62e1ddf7227ee77c14bef8 +792: ba476b2558e6fb94308a78b5549e6572d81d7e2b3ebbb42e2f68e595f300aa2b +793: 827e82561dd5149f139a98ae48464c2e61abd7036c3435a388ae437577b98ea8 +794: 42d6226752a305940a4db24e77869c19e6c153a0b7e4409b254baa0e1bb6aa84 +795: 686e8e9fc0e75c0006f3b36cad1f125713d2c2a07162751d79d7b2c0b8d5129d +796: 22c1978979b722f631d051ccf8b22ae0d74c74c4209a013a253f00945360416b +797: 5405d6b8c0a154856278c54d6a3836b372aa166b0deb3185603a1cad0a940341 +798: 400307d1d50fc6132fe113bb8311243c1da0e6b57c78f9e2d5f7554f4e6df07e +799: dec6deb237e7d009ff60996b96e4e92cb197494f0cf5edb5312e1f60575c015c +800: df9fea12bf11f4d9b595455da7c69921f5dc40a427333fa7748fd66eeb017de3 +801: 2042c501563e32a88f4e2d9ef7e66be27571635b6a831ce41b28bc6c6df0eb52 +802: fb700a0f4398225ef5db5dcd6710f7eff80808d3f815801e14a24a61ebc424ef +803: dca2d9f1ba6568ce572ef1ba1fcae08a372b2f485c884860815438c5e3c69b88 +804: 17b3f6f18906ca20ab7f6b011f1cb522aa046c343f5bc04803530cb8537f0927 +805: f888238774bccaef845fdbd2a338831c13090afc7c344b1365e24bf1ed121ac9 +806: ec81d951ac4274fd4eb452baf6c236ccfeb18138429463f8e90d1524da12121c +807: 5cfb0fc4907a831e4c602c82c3f07fe4463bb3456fd6fd24ec78bb483accfd63 +808: 947236880fa0c1bb05b086b2f7412becc344fc3ffdc6f4dd00bfff31639228e3 +809: 259d05d2057d408df0bbede5bf5582baa01339493684d924f17a46b4f5aa4e8d +810: 1ed6143a41a75f6a9f6d42e98a2f29c6cdc935a8a7ff43b8ac59bf20e933f194 +811: 57e739cb621863d956a720b719a76a4be678b0ea731a3b777802b53cf78d3d21 +812: 6db449cca2b58ac27074e003cedac028c77a592d31d5fec2ac90b63108dc2c45 +813: c9ac45e17f6fce5e3aa0a963c5ab2af463422912e5a97e97b969d30aa5e71bfd +814: ae670f4be0ca416bf822562d1c136985473d93fa6c005565219c387459c9d463 +815: 64aa2f792bf77fd23b6d4050076d73c9b2ef972e04de3c4e4b772a75145bfb28 +816: b2b8810ff96b189c18de81253260f1f57d283c3a6d5d9f8d8a3350b7d7b4cbdd +817: 5c7db30147bfd07e81e7230d8d5e559255556dc7889d19f5a1b834ef6de92639 +818: 00617b68f6496cf88cb4728f889534d3b4ff83bc8ef9e214064a4d0511916a7b +819: ebf3905209b6aa1fe732dcf39507258e0faeadaabda8ff2bcbd028c2ee071155 +820: 1ad7cc67a00035019d548ad7d8f01567f30c989f2c02088e9d18c864f7cb8054 +821: 5f12fe6bef45c836311ca3681c08f82796dffbf1e6893272acf26139333a7653 +822: 4c804c8ae2f4187ccc2af13aaca740d2f0ea8ef1593bb2f65640d4d9cdc19d42 +823: 52becac90562e114784b7542dcda300834a4cf3d2289e0203ea9b1751318e94b +824: f318c6a0b5af61b3cbaa5251d849636e68ab6c29bf361e81610d259e5f9a1c9b +825: 1210b493270eb4617cf3398c05281ab67bb2415cc7780d9290761250eab9ef5a +826: 166a3084fc7ddb404d39e4d487881d7e7488024e77c827c86d80698967ef0439 +827: f7e8df8d6c83b694e8e3067582eb9cc4d8aadabde048a3c54894bd40f94b121e +828: 4289388178c1473632da87084d13c09a92a19ee32d085d717ea5f7b15f8733d7 +829: c11fb521a4d1287b82e982531229d811e0cf75b049979c592d48835b3fdc5ab7 +830: 7b25b4347a6cd7f79fe6a2e123e2bcd3c5f7c64e5701474e116677c680c847eb +831: 3bd669ded341ad240b3cca32e2246044e788e92346759c677c25b588d336eb9c +832: 469e448de67d33b679213d1fd4383af4eb663312d2b039aae59a7ea55f47d48f +833: 1e19b3f199afe7bea42e85233dadc186dc7db1c34eb0222c40100443f1c372bf +834: 020b1df2133447fd8d2d1d8caca7a80ba666184c243eab0d52333f026d4c8488 +835: 017f82bb4ef093de828031eccb2e19929839344b00fd424113b9b170081f7d23 +836: e114a5bd110ede150c872c12df640eac7547f2c3b093b4f368ef1b17d5efa42f +837: a36b110e907ed59a4422c82d2107923fdaf8130b4bc216aec7a11ba803a31a1d +838: 01519d8b064806e5da350a1c102d07e94fe5334fe4d23759356703994763c4c1 +839: df4e0927f31ea17664543c2505bfd90f4df67c620d979243ce80e9ce6aff0db1 +840: 28697719928efd0d8502578d1ab317b772ec0e7fce2a64d1a174d7ff6dbbc943 +841: 5aea025c0ecdd11cc6849bd784eb8b591b2d6034dd4c9e11736f623cab205bc8 +842: 21b966650022484ba1bf969edcdb1ec5e71d2e9198721c99df860bfa3320b685 +843: a48629a370e3c8a8ea395c1381d6e7ee38165e29d70fe80074f1553c5ca12086 +844: 8f00714b53a5c63483c1a1ced92f0a7fbebea7e10b27e690b259c58a7e21b255 +845: 4a15be4e2173426025a7f7c2bcc0f9fe2fa070c5ad7d0185b2a7d4a2717b2d73 +846: f6da5b5d72df9883e373e6f7c647febff5929ad666307b3ff838f288fb20021e +847: d0c3a75990e3cd3effd916b8997f8ad39aecd2f40c7c59df5c6ed6ae2bd6ab73 +848: f08583778b92382380ac638e7f86c72549847cf3570ece9f28b02f71e0bc9b15 +849: 3d41f27a82ac10a8295a2cfb6f4422fba8ef5303094a845216e532d0998dd1e0 +850: 2cc2716e1e720a13304be73fe29a4db55a2ccbc95285783744077bef292b913b +851: b67ccae6fcf0d8cd364260c649c2135c606753784fcdab5411915795c6986dee +852: 31542a3723110e69b091960c13f0bb9bde2e7630c17ac9742ed5bd94df12f11e +853: 7b3f0517b1de93725cefe79227f54ed95166e363ed0b373da7274e0f56e6e433 +854: 5a2c88b0d041cb9037cc3bd64022978dcf2d1839b7b98789dca382521f4de7b7 +855: 99fc645dc0fa9183a7cd75ce5e133e3552cd890eeda2d79a6471383965757f5d +856: 8bcf278d8e51f0cdc959ef1f5ac79c411f5b5ff7c658d3cfe4d1312c9ddec0d1 +857: 5b1ce03ec386b8a4530e1c6e9d27c3ef54c0a8da3d2138ac2ff4d7bf89b14df0 +858: 6dd8aec81318cbc0bf2fb60653172af32ff62dd2ff8cb20bc0c1df82ed41edb5 +859: b2b6ab64ea6d8c8602bb063335ec0782c02174dbcc8ecec1d6160e030cac58d5 +860: 26271e73d07a7c45d017b5085c58c42914a74719c8d49979c678c5b4f8e76e28 +861: c6136d39d206890f5e8aa2aada84bec2cf50e405fbfae64b7b231ba880eef72a +862: ee8fd22fa072b9fe159209e4955772e67d225ad2a9d169c30f6e468b5d5b1c91 +863: c73ad82fcd868b622f9b5e136915894739801093cbb84c8849a838d6ebe729a3 +864: bca23c98fc655392ba07e97b3a3cd5746c684f7131be2fc95a7d5b92d80ce755 +865: 5290cac580cd15da39312bc9f35de883590b4d42d481854e488d33794f47ac34 +866: 0af6a1b3b5a923b24b7f6be599c2475e2007165ef088230cabb9ba47f2467f5a +867: 5c3a4ba29214bf3532af5110ff7f1be43e1d828e181653064f08f0ba65556e16 +868: efe62d93c082b86ca8185dd01dcb848c247412aad460b3f98bd7394c333a4499 +869: f917605bc5eb01ec880886992db6dd8dcca845f013eac800d21082098d660f3c +870: d745dbb46f8e55d21378a0c6f070f851b05a5d0d77fabf7182cbe0b75ece39ae +871: 8a254ccb12d77511b4818302a7cf7a4010830554ff0396a105985fc4a7f0adf7 +872: 446af701e2c7dd921c6c157ea68c7ffb2881e489e06bffc555bf2241dba2893b +873: 2602237a6aa03fd4b36df0b938f1c49f610ed92bae6ed1b7b60ec172ff395e82 +874: f375e7a552540bf63d5e69c663e4b2de721435ff57d9f00476d9241c05913039 +875: 26edf4b92a2d80a8904da7d91ddd617fe97a4d741ee74e02f732dc350abced89 +876: edfdfc01d71eae7142c218f5be3867878232d25c0e503be8053851aa4c31b657 +877: 015a35e8fbc9e2355e220b6e07cc21049322031b2940121c71058a8d9c0ad791 +878: 1c241cbf578fc1b5875c13045d01cbb39564d1ac030c38b8a0add52c1c38c608 +879: 0399cc25a5426ae96f2f6cdf71abe0847082c2700076abd073d88862e4d32588 +880: 6dfacc9dcbf13ff79b66c487a678f81766bd2015da32fde451d904997ca5f8d1 +881: d684685ecca96d26094c9c0a391f606b7e874553b033ae90ef96fac18517bf01 +882: e6cfbf978ecc3fb19429203bd2c508a4bb1e1d419c313f554d20dcdbbca6d64d +883: b8df95ca983f4ef3ed0310b244f2f4318d6761564140cec095a16e023976354d +884: 3d09aad047499cb54bc9fdb4f634c09beff93422db01f7b8498d90493c32a21f +885: c4d2a3d1bb94a37768b512a87edcfa56c00cae560b74c48e46ebab9ec67955f0 +886: cd5728a9edb6066bcd9392114a0f18f4c70ccde8d9c24f3b459930c19e95e506 +887: 743b81138452ca16e51747a1662402ee0d9eac3550011931aec68a63727b6894 +888: ec0de7ecff31949c1922903825b76e67cf27c61d8fe100a5d0af52445aceb262 +889: ac98c3e8d99163b7c3f81f263468de61cd19cec791164a1a38ce0ab440aeb324 +890: b4bd0129e6cf5223eaacc456653fc43936d376d90abcc0f08604d0cb7eeb72c9 +891: d3ef730208652e44eb49ecebd0a0e0dd885e9ae13e608c2ea15690be6b0cfabe +892: 0cb39c3968bcb3d4df407cba298c3fdff967e494effcd9f4fb4dcf846d0ef7f3 +893: df067b52d70efe10ee799741354efc807f4cf323c6199ffa3006a89820196fec +894: 49c36112b26485e2c4184371937988ca9edfc53d0055ba438f7ac8f7466f4ae0 +895: 779075e7ba4d73acfeb8b00f20f03ecac57bfc4db7d907c33f65c10a65de890f +896: c9c078d711266ffe91f523384168b90f1bd00efc2da110778b9cba2f0871db49 +897: 4f2d2969f130c86498c3d4452a9769978990feaa3068bb338474e2063fb47364 +898: a84a2762530ef03398c4c7f4c456364848d91201bb0cb122ff5b18e9e39b0e23 +899: 8ec0cf65d1b765c086dde69a3ec04bc425342a4bdff439058440bb8958fae5f5 +900: d30cfe6d61b9fd4b017d6c9d7d9273e8418d0ae9b8fde5ae767ac80a6ea21901 +901: 3fcf48533859c643a0396c0b597dd9b3802d52c823b5fc9b76e6880fcfb840a8 +902: a5896436484d5efd5a74b8f467a15ad21993f411f27a262912940d4d85e2aaaa +903: 70dc9ceb90614f80df7c9c113b13307d71a4cabb766d09623d28383fa000f8de +904: 5acbfa317c6a381e91ac6c4e856cf341d8d017b6c4f378b2f283ae5fc683c9f7 +905: 2269a8c37a0489ce983f89e5610a5c992b010e9663ed854bc85826c5938ea65f +906: 9a759ebb80007327ca50b5d2d0c48a62ffbf75130b942f9ee05f33d69c997361 +907: cd625ce6c86f80cdae5d4256307200055674905dc4d97f93146ce60b4fe7f4d6 +908: d5735fffa3c594d447ae869b6f97df71a8437a7beca74b7c1b7ab7cbee131122 +909: c6997bcd287033749df80813acb98039278ddbf4a56896a3c4c852114b3d4a22 +910: 93cccb0ecb7988e965cc9efc6d7ac1ff834fbc10be6fda4867ad75c51744138f +911: fbf47e7817a7ce0c3bfded8ea030550b6d6f6de53e103878111f101e49f9445f +912: 5c89a1c644d89f7acebb9b1f9ce51a2ccee9ca212dd8adfa0d610baab3186167 +913: dc28c7d675adfe5a1a7c69400c3dbf5b38332050e4317a1cbdb275247262ca53 +914: c1cb82bc179b22b3a5d9f0355da80ac050236bc73248ec93b8dbbd053298aad2 +915: 5e6e7c848d5df0cf67b72e28e216483216fe84e5d4fe37317369c19603cf0bf3 +916: b19c2c5c2b1a45b6bce242c9aa9adff56affb1f88be4a2645cf76c42f46c7847 +917: be55f3c6e3b22eaa9c1865653a8c91ebb7f414f9a12cdbfb62938945dbc36ab9 +918: 1f32898862ab8d7bbd37d472f0c7eaae7fe2f084f8fd45f05dcb764ca5b600be +919: d07488ed1439a7213396a1ae28886ffa5c4d3cbc74c175cf375402f56988e15b +920: f0b8e66863472f11e758bc94d8a98ee308e5a05490e5db4fb66e1dc09f4e52a3 +921: 67d9acd2df48f467b4f7a84f760730a92c635e928df5621f6afdeed3e195d3d8 +922: 848e6416b52a2ff5c7d7a5e6eed3416c1deef9584f60a5f6c3a2854f0a501faf +923: 5f07bf7c71d71b0cfcb5fe04fb2f1f8a950673754dec4e816ca84f82e663a9e3 +924: 154aedec1b966263e4151b44a8c438bc5f81de0170229bcc20c20f80d85254df +925: 91707a58602431d402edc2258eb703be7603528faa3fc6fa0f6b1e6a4db7c234 +926: 8210b096d070cf4b23238373eaa334784226d472bd5a75abc4bcd512cdd51553 +927: bb818b548724ecbfc298a06c732ac64a20846953ed2eb98c452948c764b4e17e +928: b590d8e03bfe80fd84cd64c1ccf606e75ad702eafaf5353e72e38481f7c3d3b9 +929: 571308cd156b690c3b03a9f857c3b14d91124895a73a2fa041d3039c58468b36 +930: 5470e7f92b880ade0fbada76a0c06d5da0c38e5569c59c11689422144cf3e368 +931: 0584120c3727f510f276d173e1fafbcafeb3fed34bb6639d477db27a7e307d86 +932: ff177489756c5c08e42a9257170d31de9f5420056514c5a6c9ac00c5f9aa04fd +933: 826d14a8ec2b8611009cd1507b8df8c8796889cfe9555db9a8fcc930ef5ee609 +934: b11bb13741a897d8d52f29e0720f1245c25cdc78af34d1b66818506989f63df7 +935: f29205e421662f14d8d93573d326f3d7c98df9527f3a011853e309830b24053a +936: 4f8f5839a9c97e8e6b4661232ce36d14727b4ba88cc07e22e58f3d0792156737 +937: f33b892df0aa30fd76a13fd6250efa31568e0c119177ff5ef70ca1382a125990 +938: 3dd1d304670e333bb982b78ef90eef332b7ab56badd527efa371db1d72a0c030 +939: 456f703691bfa76e0267c4ca9000993ff4ac6daf118b852dd6c763354f1dc1a1 +940: 88f1827525c56fa450ec069a75af48a66c60dd82d6936b71bdddc33bd70882ef +941: be043aa1646c1429738dc5c134672819b6696e79be9c7a98de1afa0d907e09ab +942: c58f652f83e42206e0495bb43b7104849dcf0d4e4ea288ceaa8d221929048209 +943: c0a5542106b07172680af9cf134a8dd6c6aff11b334cbe5152a64d14f97ce5d3 +944: 90cf70305c87a86ae7cb3584858b09621896b6b902bd0f835afe776c0ab3575a +945: 623b58198f6f8b60a5291d1564715f6c177ed6a9795f6a22aac34769d4b781aa +946: 2eca286f8e943a0eb575a8aa472ce251c4a06e956031b9061871726319f33a9d +947: a187c87507d00d8e121bf22bd3a5381cff980a33db532fe1931aaac261bfbbcc +948: 2d1802473442182f0d2268ba7c9bcb6d2343db00d1bc7cceefb05789307387ff +949: fbcfc7d9fa122f09082876a7ba52b087553e5e434536ae272900531d9fd7c5a0 +950: 05fae880424e2b6896c06c0868b7516d04a20addee4ae06d7dfa3d2e8528c23d +951: 556a1aa2712f77d0e29e84189b1907c14ff74a242284eb8d8fd81ff4c9a24d33 +952: fd78fbe54ab202e7f63e87950e60969fe6c6ed0b5b5b9f1a6a64f8f6629263e3 +953: a72ac6b1f94bd82fc1db4d0df37b3c328282bf702a2e80bc6b443319c3127446 +954: f43267b1413f6687a0fc6919f4992920d1a74f3ea43fc087c815f6e6066d1887 +955: a8edc9db69f79246cbb57c2b2996c14ae36a4802074f650e93a1fcac77a259bd +956: a59f159a23a1505a09994c298e654afac0c8d6e2f3f783069a49d8f7f3a8aa5d +957: 665c8ccb1d3c8114ce342ca49cfcc967d166739db626413d42d55b8d2714bb31 +958: 5295ce9d52528268bba400d07d3f7bbfd85097c9f69aa1c58fb4c0201a974851 +959: ad837aaefaed57256edebe44e09dba02d6810244b6a765deab4da65906785f5a +960: aae3fb65120676a8756456c8e56846efc89acac7eb2500551446d8bf00e0a75e +961: 0ac1cf7e1bc2d02b05386342d8bdbf58a7c62976df7190f35653aa8daff30ccc +962: 05a4b48144bed7422054a947e7efa5a1c1517478b9ec633e449a8cc192dd2ae6 +963: d495cb49245a64f0c098e355584ab22e496f551c6db141450d4f2d5473abcc44 +964: 8873017ec15e2ab8207cb9e54426dd670a3beaab33db805aa01c1779cac20e72 +965: 0ee4c3502941396bacf4d957519d4ef4a4f692c582c6c2344fdfdbecde8275a1 +966: 2bbc9539dd2ecf542d36dad04808145ab85640a14ef9d5ac272485bd8f4144cc +967: aadb52646899d16bf8149a8838b15a8e4071d3d2499f38c1fd347931d7e99097 +968: 3a36bb3c62181f1906ced66e0aa9090041e1783c85b37008fd91429becfe1c27 +969: d0949593b37749c149f865d0c1feb635a51b6ab2f1534e4b9fb0e93d9650ba71 +970: f7ef0b7a549a0d3949bdf395deafe817e91cd8a1a7a7ab54c0b592933368b773 +971: 09266b160df5ada7a2956d2e3b12d4cd54339688fe13914cb4464c4ce54763c8 +972: 74d5f9b29bad60571c3b13b4374b5d9e2d2c2104e5b8b08a9a46697c4db26cd4 +973: 12523e5f97e8d85e409d8fce5a730c6f32cd05a69d607ef3f0b05c58b52265ab +974: 1a987e6dfb4a4343370a8fd5bfcf192d3374a4e5480108021180e03ef37fc6ed +975: aaaf1ce8d227164a535129c4d6352005520d4f2f5946ceb6ed8972453ad67fa9 +976: d25e2c85bca0ef83a141227ef2c9886d07e86d6b1c40e3f7cdd14f84d1e92fe7 +977: 37471a4ccaf0071fe0f3c31281b44b8197e8ef9e7301c6f53184f08ef63c5d43 +978: b0e16ba5daa317c063e157e75d42de05927a58054e3737542fc258a3cfe4070a +979: d4c184e0d658a3e24a7d25a7100ce03eee215547c335844f2d8cdb8a2b1a9e79 +980: be055df17f2d7082f4647dc4099f5c0585efcd6423a40551ee589255ad984991 +981: 09caa9af48d02c98ff7107153b1fc380af3fb9d3f00a8091cc8336d84f859ed0 +982: 67b2ca10f46e731cc00097205087b5c16d60a29ca1cbdd8f1a375d8b6fa60d78 +983: 0396ba72836444de8f0c354b8a938395b670eac515fb224a6b073bbf10bcff16 +984: f77dd049a4f6d078b810af3e0ecc9f76dcfdbea413dfcd709a1f86c915c392b3 +985: bb76a5acb950ca6fb0115097b948c3b7e928498cca4bc65e1ae7c45023642bf6 +986: 45f58d18384049e01fe1cd351e3bc74610a50173b6eacdbb8070518c241c7ffc +987: 70a5ab10d8b77ba8d578bc4884c50a62a31aa53a07f81688b3658f4eb9827ff8 +988: 12de07ccf3b01d2e39ab693a24b5568637aba81ab72a47cd5885beffe831cdfd +989: 9d54cf86f8fa928f4b248978121f2a7608e1499a3f55edb16d00e4ce3073887e +990: 523110a7ecc629c613b459c83788c9e66897d5d2e92529c4dcb6d45003c5ea7b +991: 465c58b36171c4c156ac95d570671aff0868f6a6ed9c49748dcc40e27a8649a4 +992: 6fb4c0905e1cdf34e70a2be73e3ab7e48a687efa5f8dce261bedff93011c639d +993: a316920e76d547f001de8e1e4f4efd0bb4801dd6f453e03f6f9035055ff67de2 +994: 95616eabea52bee828193c8de7e3f442164295a0511bdace71109df206cc51bd +995: f57edb955a21ee7a7c1df5ee6c6b307796ff6bbf702ac489077e847d9f589405 +996: 84f6a4e89e73f8ae45094c8566e93b60c51e02105e2ed07789e761adc269e6ab +997: 2102a6c04cf648d73c7bb78660a8b6654e97e557f6b4faff3361074f4b509824 +998: d7224aa3f93a0f23514e696c3ec982b780f9c4c50bf7b302734e4ac440ed0485 +999: 0cf69a6cc23c8666d113ec4872656e849fe73579ee11cad120aff39915b4a4fb +1000: 1a888206971be51a4535e1a15d4696b6ba4425fc1083911f274d748876549179 diff --git a/hash.3 b/hash.3 new file mode 100644 index 0000000..d74f7b7 --- /dev/null +++ b/hash.3 @@ -0,0 +1,1001 @@ +0: 85dce2ad6ba50a0ec4162ad0598336517ad73f10e8ee16192f5fa0d6111415c0 +1: 967af4d7613e63ae6cd2f05df12e2c8d125f5128ec07521a6b313c24a15310dd +2: 7eea68f7007f367e09493c70edb150fdeddc16ec56123253516696900ed56fe4 +3: 4fe640d5106f16b6ee464b7c21da1e3c3e0223b407d0c6a3639230ef65f8e309 +4: 3632c69123a4a7cc5b4b45ddea2b1572ec877943d058dbaeee0d7fb02a64cf0f +5: b3f14807af541756e10a3cd81e812ee5d51505baf6421dfbf2810facee611c94 +6: 19fb1cbd59d7ac9b370488d9a55c1fdc79c1d8b8e4acb8607b5347b065ccd4d9 +7: 8a23d1395d1eaedf268b56ff978bca521a82c13a471adfeb85376220436f6be0 +8: 5abceb6e6598736cc1b81cb10d644d95707803988559a5d34e97b38c7ba6b61d +9: eb44cd7554093a31e15f13315c88303f9cbcc12c260c1104aaf2f7d322a4cd75 +10: d3296f612c32fc482c190825523af7c53561ab65e53a89a9360146ceef7592f2 +11: be3e464b70ac3060f456aabef84f770cb61c597c34b449588578544a3e319724 +12: f2481bdd304361d3366f8b47d030181ed574be70ffcaf2e46bbbcdd9fca86f88 +13: 9d8806d808ffa4fcb20dd8c6e83d76261579d4d55dbac5fb45c843704fc853d9 +14: d7154bae8ec7256fc5c6e69689642a2be5a4050223418a6fb42a069665c1e8ae +15: 9d508212c183bc60199bc8d452ee1410341269e486d8887e6b873309bc07ae1d +16: a998b3bf8609d89a750522039413c31b67e4d8ad5bde96f8676fb845257c77db +17: 267512254d3df3188031b77dae4378f1b2cefbc136777e7ff450d9249dd7631d +18: d484670f6ded2ba8f3e1a926b25fd9df59f6c57b5a7ef6ae528a82f6fc096f39 +19: 8a9694e39a0f7597a517c9ebc0d29aa47d38ba488289433caa578c31dbad4d87 +20: 8ec179071c95681b40b81cfcb878cf30388917844b8cc0a70106646a2509d54f +21: 5d6d37a33541f7c27460408529d4a2011906d4dfe215fba1ba654a8d0e57d522 +22: 2d493b9694a77fa55453ec259182ab55de0b504d9358047d5d8dae34df779fca +23: cf99972160728ec412d836ca2f9d0af86b74d6bbd46e9998f941d1ed2fe3032d +24: 6a44bd9e825c146850a76356ba47e62c71420a6f7b3108b62d58640290fc27f0 +25: 534294e4cedf8630d14b0ad75bc732f6e02aebae0c4d72de37592deeab493d36 +26: c99fb8948e39addf22fe084fd260e2c7dbacf6dd0ae5631ad9da1b8f2c887774 +27: c55f039a282306e34d74b1d3d4d79432caada63ce94a20e18ce1e3a1047b5c75 +28: 0e1d4f3dcc82aad407948b3bda370dbebb3453be9445ee746c31b6a6e29f834d +29: fe1e351a0405674718d2731949970188891e60a22454162607cc331bf0250925 +30: 49fe281b7e21d1f12cc071368359f07e9022d20d0ccad6da269d5c06e08985b1 +31: b22666b1f8fd1ecf1a73f15132f95492ca95556e2724d7c83d62c61229365534 +32: 42e4a64c2302db6677e55397e081b3b318db7372b648920f8a37780ab1cd3ce6 +33: b16a21a8dcad9d14d1c9f206d8da2f1bed1827b9c27570d8f762a42ea324abe5 +34: 841d5e62b2baf1bec33817a764e76447da91c3ec3bb76c71aa7b843fe742dc56 +35: 63e2031c2ba2de22f57c078f30ee466224aa9e645955c4d7c9f33cffa0b04c5b +36: 57b3d4a9b99c5b30bc07aba0a104dbf6323919c7829316af44de717606674d6a +37: 52cc02a6c375c8661d5ae7640c12d4a99d471a68a8adc24c4b7b775faab15519 +38: b74dd5dacb02d8991de0d890f28e9d9541728458897f185ea2ee461edbc862f1 +39: 00eb716f16f532d8cd216c2381045a03600cfdcddb5cff899327872d1e4c56ec +40: 62d17a5c7852291a20954e947712d9190124962c82c25de397e392d998096f4c +41: 3651989b89c2177d3dafa548696e28f4d158304424395c2f96b5268944f60c38 +42: 97c011124265b78962504cf4c57b701c47e12c5509d42b239496e39613e62e33 +43: b2650e0fe7cafd2f753baa4cb4b9130cbc42b1ee98beed229003ab5e6f6629db +44: b0890007bcf10bd94da7a0b43bd64da4205665e70b3bb9c1f6e7f72199a1f0eb +45: bc342e0606491fe6a11cf901b41e872c2bc532af5cb8bef2a93c80e87b29061f +46: 320f03dac702ecd4f942b33805944e1419f22325a956d61afe35dc224b252cce +47: 14fea152c29f1198c1f60f5e5937dd7c875a3491728043210c784feae9484426 +48: 646f5ca122eb0bf206c1481c170ab7a003b220e66c838dc8d67e71244337f7c6 +49: 9750f6ad64bba9df8824f67d75d37d0c0ee31ae765e7422f226ae9542492d82d +50: 2a41aae9491dc68e12bea51a9662ee0c0b6c485947189e075f2ebeaffeca6c41 +51: 77d710e29edcade288ed971d0de133c54f5846f3f663d22232d684c8d9125652 +52: eaae5db00afaee3de0c3e21655a2cd8368ff7e7dfc0fff64af87312a7eebb0fe +53: 5e9e1c024afe55d81b6ac8557f2867e5f7c378d6b58a757f65ffd81af1aa7925 +54: bcd1508137fb9456e0cd307e405d02ff17be39ec5a8dee6cd0a8219b88c72495 +55: 337bafca56c5dbf80d610b7477a65fcdbaac5b7060b16b5bb295d684c41355d8 +56: 1d3fbeb378a2287bdc5f4a20f1a4328905391f61654797d4710c9247d7e3376c +57: 59721454570ca2b55c09ca70ad99dea88ee5bab0444cc4c957a80b8602e764fb +58: e07829c5b27d55c8ddf75d14ad8d8d25c7dded815d58d67b89f0d682a9e3ac42 +59: 992b6df70082b7fd720529ac7eef352646e6c9f6642e0336080dd5239d6c111d +60: 75fd1ce46bccefcc1cc1680a192dc545c91fb4262f1ac2cd5aeebc9a906e6a84 +61: 4384d8d5cc81a5772d479fa636aae5e750e6006d73dbf06c662e5630cc9f2f73 +62: f2c6049bbd9242d9739f2a408169452a7c7f99e3d44b414ced10361ebbfb9861 +63: a5b666b5b0a2d63415b744a61d78cb7e2a57658e0f5587b75acc75268a7ecc9c +64: 0fd368e2923173329fff18564ecf4e4c3100f9d116bc2e34fc6c43e0f152f789 +65: 6a18f6aef35207192c09a7670854d76313e230450b11c1ae09dcac738ae29a75 +66: d6bca17093abc1619e048ee9c1687161f60db61f5fa45f32e5f413a2211a3ad1 +67: 2b3eed034067549495fb0906972c5d046f53d26fc4f0603ae0fbe216e164d5a3 +68: 287e82c3da770aca0a53f424c4b1392bb1de1178e05dc7a762af59ffb6cb3504 +69: 7dc33c0676c18be0c98f91b45055a39aa4bdb5774d1f3d2b364509117d5199f9 +70: 8ac0505260206de8c3e64a03800aebbe06e20decbb7e1ebb08605fe6e1cd7de5 +71: a5f80ddf555516ef4540fb4882faf398e8113b90dc0436da6ade4e2585c135da +72: ec628bba9ce4d21d7a4e94908bcb93e97b9356322349420f877562f8ab806c7a +73: 8a933684d3b07d9cd9e7a85fa06f2f8fad6585bf00e3749e81a55783a4c33ac4 +74: 61471ee903ac7f8383b5fe4f06d17b3d6776bb86338e6bb4d8d4661d22a0db94 +75: d21c9f3f385090e34b25b021a4f89881c4cab9025c6bd07ea496811d55cab4f5 +76: f35ab97584d028e267ede7aa6810439130e9af020f3fba217b5f5f05f0b3fab6 +77: 1eebd15a4b141e3c57282e69f9ab7c9a26e027e97cb969b30a81cf2aedbc6d5b +78: 0d3601637e980370f233a99fb26df1698db1fa8f6ba08b17fc5981da1a0a9c4b +79: ea5e9db8b0d525e61a8c2f4222f0e234b5d11956968d75fdad29ba729c31c30f +80: f82393ee4a0e993afbbe499096b86fa9e38e9365ce39bf637a66148e563a7562 +81: 877c9e5fe589356a397ad27d41aa6c266575a3fa7b1041f780c9fd71e38a59b9 +82: b594a19913145eb74196b03b790d1166a3ee5483c4056bffecce0851f0fa62c3 +83: f4bd80926351cc2adb02a3987be946398cf90b02a73c30a34142ee9cf4e6d6b7 +84: 6554661e3bab5d0cd67a4aa12f851624fb59a37f76d67dc261f91dcef4e99f56 +85: 9101f3a09b1e2f4164e324c3a9a6550966b19f8f15f35dfaa7e5d5880c97c434 +86: e3a8b17948e7d9a6073d7f7f3dd324fe558115b720a1adf4e5ee5277245cb183 +87: 7285be9c5b90c66c3cb2c7aa23b2614c9acdea964bc8695a1428fc714976f812 +88: 47104b5c6fb4ec27cf85c1a3e22fe631928538b6e39a7c4a8b19fa216a965155 +89: 3e7bf9add688476395fb369d0b51854f13871e6ab911220f4a2c35bfc82fbbce +90: f5384db8e17f02eec498c8688e9ddcb9927d698f969d398ca3777daa53c63d1e +91: 52939a46ed816e22e051aa8cf603b49fe12db3e14fff5577ee5fa709bba0e246 +92: 5984cc844cee6f30e28a7a4569a303aad5fbc647eaef45532ee2a3a4f3e334a6 +93: 60795ea26fa1124808272d8fa41dd10b04dc832aa2a4b29ec2a67d0aee8326e4 +94: 096f2ebb8dd1a655df783e6366a9826e8d2cbb45a863a2150126048c4a3bb422 +95: c02e2508f4ecc02654973ab7bbc697356b244e2064711d32034f41ec6c8010f3 +96: 399bb57ef99b37f9bf110c800857479ff5a4a6d615c28f1ab2e6b135f241f63b +97: 538146e200b04cb7eee283bf11c622f487b164b45aa507997076c1a714bb7037 +98: 634f3e4040a82fdad1c2f9986856ea84a29c11b780832433c72f53c38a9989e8 +99: 857ac7b15eacd88adc2aee1935d2deb1613a4fe6a07ef321b31d6459205efb32 +100: b9c18f78c6c126d024475a4cee31c86823a9b78948913042795324847c2ec260 +101: 4c21bbdc6c098799cc054ef6e4363ac809913ff273528755ce091fe8cea5dcef +102: 3574bf8d1624d866c339e7b58b4e4aa2437ab5792ec3a18c2ee3d6bdc0ba07c0 +103: 3ad028b3670b7e0df2031fabd8816516e19e10bf06babc5eeca48d80800f060c +104: d356b9a32be6600604ffe9e5c80943300625d89cb3834dd8b2cb1518b681991e +105: a330970603e32bea86778320be1fb89c1553c3c0703236a20d9ffb03f39e451b +106: 7d55c46d31de40187a5d9a1b82626c44fdd05dc92b8fe8f932a1cefbf15803db +107: ddd8827353b8b2cdfadf52c65201808e31586795fa5086eb04fabc3be56cfbea +108: 7abdf987458b0916a6ca6585ff616e6b5d385c0cd31dbdc66c6c613d4ec6b444 +109: 7bcf2da4858bf72820343567b4e27363c0f9c4576fca736fc12446637b04056c +110: 5796ddefaab6e59164723c4bc81d4d4044c25e4a5ed3e6982c3068394be6e765 +111: 50ee47bf8ca763c2d71db5251497889abd6bddeef350d774c8561791a42b8d3d +112: 78772ed96cdc0df15f826f62d72e1f0a9bace9921ae6880b157afcf12d2c5c62 +113: 0b3d2afe5cd8da4d61dcf951afa561b368644812a367d72c14062a189ff48b2b +114: c3ee44bcc9467d6eaa38f23bd58cc345cb6027af6c35fe101e72cd7d8f20ca79 +115: d85baa9f673ffb8ee642a26cc2eed5b2f7cabddcc1e3a57da6d25a9ff21a7ba8 +116: 22f6b3d8c00d5f6ab92583848a14e1b7ef3b7c183a26ffdc4d8bff0ea45d40c5 +117: 725b763fc442a935187982ed76d0579dc8dcc03f6d5247b8163e7d4f2d4df8e3 +118: c68d4f34319edc9c6be7fa9c2be8ebf71a3fe18f04e4b0adae0441afb2b04a85 +119: bd380ee1173ca47965d6d1bc350a2890063bb80253beda787d04129d425c561a +120: ab3069c2af2f4fbde79b2bcbbb407a7e7ebba04b9d479a61f12d6d381fb616bc +121: b5bef1a995fa71e6c391e0ebcea3d5b004c09d20b859040045a3ce5bea9538bc +122: 7cdee81258a876cc3396fb581e98fdb336dd1950a201655b45d3e79320162627 +123: 2fcb8b25d17eaac4370ef0a188e6666bbf966176b647b174fa9eecf2abec55e2 +124: 2d5324eeca9047ba17815e13e9e46ceaeeeee6b617725e9c24095356292c7540 +125: db01b4b82ae2f9e2757f66ec878a45174f7c23406b046926cd2586a76ef0949e +126: 410742c1ae1d14142d796f4603531e78b30866fa979a4adad4a49e9fdd3364fe +127: 2912f9acbdb4627c37fb1f643f67bcfa73a9fceb2d848ca7093664256c3f7ceb +128: 640f47f565d46dfe065e24cc266855c8b883dac354f25483c628728f8bc23149 +129: 175bd5ab889991582d8554c8a576293bc14be7226791b5352eba5aa3d6434de7 +130: b7f915cf072ebc03361a60e75483d96383bb67bbef4fd6b7a091255d72ffdba5 +131: c547751a862d00e7c5cebf2886e1b7feaae7c3382e80a7d3a306bf66c035b049 +132: 1e38d4d5fca04af54b42e53a1f80025534b915fcb3929cf08447e31a97f8fb4d +133: b4c3f2baab14feca2c91ec75d115d231d078b5571c8d79bc966d5ac7154beccd +134: c4fec2cd994c7dfd7b8525c27bdd42aa6f4bb263006f2939d94cd20d6008a44d +135: 32e2c07f62db8ebcd805a518e471c021b5940689d62ec56cc031045ee9af9513 +136: 3972cf6ee94c3b4701f3fa7fa9f7be130abf7da6559b6cba5d4037ba61ba4b6e +137: 74ccea30243f54b1e99b1f98b1a565fc5bc12c0cb372c0bb347d66df0f5b6c5c +138: d487a1505e3a398fd212c1df23eb124d7f16baea31ec1a8097fd2548d66c9de8 +139: 2054c1791dd0a033f054831b3e1a04a3114cf3f30b757d55115d0982de043652 +140: a549f0ec73a288b97f256153171dcef571008e1e35a9cd8d711393be473db126 +141: 59df9467e37cb4a346b8e12193c6d88e9dd6aed0e78c42372976db0bd4a24310 +142: 068e7dde0bb916b33c20310b8274aef929f2af47fff613f9fa36be085be4b800 +143: a8f28880fb2887738be1ab65dd98670a6cb0ebd89ab1f1a95a63aee1428efe1e +144: 45b277871b78f4591cc67349da916f07a5c2fccab58b12ea7afe4ab5c96d7fcd +145: 15c6252b88e4cfcc42dfc10638d01c080d8ac7759ca2c6e605ead3488b415e9c +146: 2205890b5e8deffb8a7c8270487a08bdae83ba0a823a3d7e98f7593bd80aec75 +147: 796161b2b7c7668c313ed3a4c96c749787d433288650a30a5e20268c5348f0d0 +148: 6d27d2926b2cc062a5eb332a1dd9084dff917d6014eec2b297e89e2ac0b0fb73 +149: 379c422916ddc464d9038edbed5007932a809547c63611a83b4651741f370ab8 +150: d3c26dd08a7a5587b4e5abd4fa55ff01127bbb715182f535a415555009862355 +151: 4366a1b92bbe908968acb1dd2a4e1461bed095fa6bfee3edbad953c5e9bfb1b7 +152: 62e6790aa528480602f628546cc04f828702b5423a6f6d6e7553ae8e8c34274d +153: 2a34e923990ca42a6534f14c02944e9f13d04fc926d3225c372818df47069c66 +154: 7163bf10bb131a014ab065e5170384af8c80cb09a49874d4d459127f09959997 +155: 039dc2b701808a89fbde295e55dff4abd976a508a817cea65b98caf0375ee8ad +156: c2341af85a957814610ede9b39d110910273f0627749a41e82c8249e841dd684 +157: df5638c7eabc9c0fede2341be6b46f003610768b90d15dc235df662cb3ed01eb +158: 31f31fa4ea63eaff1c1b31982a8874408681970fe211c5a68846cf10043a9347 +159: da2bc98b35182b12fdbf81352666848f1562a0b235293012c28489cb04616b46 +160: 21e6e3278390ec9dd492369dc2d5e04da3b393f630bc9a1e47d8ae1173f046d8 +161: 0b0d1d9a3cdd175998bb4e83436c81c1da079e6347c81a8a5d940fe910c145a6 +162: b557f92e62e8316633fd61fbdd8d726e7fb3c8e413eb5411ebd9263973f1ecc3 +163: 022cd2cf5a5a16f28e2d8a65130f70ce12232efff8ec21b97e935b16d7726a2c +164: 48b2a67cccf18b25a005073f244404099e3803c839b929054c839beea3420cc5 +165: 1078303bed2aead2ec811cfa4fa41c3bd4536290e0d690d3d0378124387bcdce +166: 8c6218f83e12015def099c649216ee489bfcf6a86e8c13e2d2eabfb083d44478 +167: 16399aaf5de31a47300043fcbaeb8ea5abe4b9206bf28f648cb41843670be2c1 +168: f64128bd0c936e4f59d172e61dc99dfd85907d14d3e59f0f0554defb246ceb45 +169: 91ea1c7acefe0f3f9d0ff988fce594a3aa9fe943dc38351f282003056eb3d177 +170: 9d3ed59fdc903ec87c8e4d2b1a7fbcd338298bb5aa6f321e401fd388cc5d3a17 +171: 93896f5a03b4aa3eb26cc34bae3124e42e5f661f8811b92ffc0a66964e4a08a1 +172: 5220ff28bdaa8286f94646feff8b615c38f80fbca37857fc3e81a3d6ef561e52 +173: f3434ecda75e0216226e1e5bf9143ac62852691ca5ccaf8954420f73ff0e3b05 +174: cc2a0b6ae2447b3733762f34657287f4843362c232c99310162fbb6ff0d50123 +175: ceb7be0ae2fc7f06e0ea102aebf343cb37c65deee88e2b3a538dc747979f8ae8 +176: 081f689b66146e7a256b1f645227cb3c9ebfbd04ad7cc52cedf1acbc21d43dfe +177: 116944f76f92bd752c7dede3ae8aaaa3e78c9f4c168ce1e4f8bed4051fb93b0b +178: decd90f07fbe6b0720886d0afb4cbf31e251882d6f7bec8c3482f8ef0cc8eaf7 +179: 8796057000a4cc5092554b1ca6826876f433a260b5369814ef293ba3562f4ce7 +180: 88b6522669a0e6b78af9974bc208499602e4ade0943e8d65c0eaafd854481f48 +181: 8e7428c3c728b8fbace45c64df9b4957592348c81433bcf6b81d3c2e7ae72c90 +182: 9372a0f5b68defaa0676b78320c16502801ddc3255b523e0801505ff5e7f16e0 +183: 6e86012d3547c33aadd438d6efe4ef06822f2a964ba16456054c7d7f1552fa26 +184: f740b3f95a86764d5a8031847becdcd2d259180e3de84bf074f993effde9971e +185: 59bdebc53a196c3018fc6fd4d6e9b6774ffbea7800700c8670df1276aa860bc4 +186: ed215e876c7709f3f456041863072e245600beaa6911aee29d8622de44ed33b1 +187: 4505f43b3569d2013cc3fc17ac31a329c4109611bc90fc610b7a47df00057375 +188: 6ff109260f1b3aa2d7dd09a8041dc194932dea241cb5e31e63612dad5aaddae5 +189: 48682afe897dc03b3d1ca634a183bc85dd51fdf049c8968a6d65c071c6afc514 +190: d3390ec0bdda39a01052620d7b6ae10d3275bf2eeb728b29b8f9a200c2899bc0 +191: 5b861e4da914e584b381f6d37f2c8458cb7a9fdc096220116bd184595d09afee +192: 18e51ddff9f391a89771af8fc5af6a269425fdc0885c1ab23c7b1498647ba951 +193: e379048af309c10fd9a95c37671f1965602a19d72b37765b6880f78e5575d00e +194: 2a03863aa3f1818018a31a289a1f74b43cd3486a6186332ea9d187cf4d778b8a +195: b06b627d0b9988f6246a2c74aa07f2f064a975a9ea72189cf70ef7738a550fc7 +196: 24b49031bb78a51beefec8aa02ee0c3f20a0bc8e23906ecb05a2e713675a283e +197: c91b153c4d07090707d66874074179278c760b59e0bbc488488112abfbe0a00f +198: 880aaeb0896c44b2e857cacb4e86c4430087f1524c25672ab3ffc3ed74f223ce +199: 8f79f1a6cbbf335cf629c9d0f9cd2e1a2e8f75dd911d7cda3d8ac7a0e9b44c03 +200: 22fe080dfbe76d382bcb438d9bb45671084d45f94c330436391e7d820d196598 +201: 836bbd51ce9e65eb7051f2e5e3c60816fdc6076b141df672ef8dd65acada203a +202: e454eb81a9fcd1e29b2313ba44020ef5ef60c2e3fd3b0566c74b87092afde086 +203: 6535ff734a6fdc4d577ea4218c657b65cd1be4ae2374d8564b01327b86da71b2 +204: 2265e8de4d67982ae7101f5dae68ca9f9657d2db3778702d909b79c6a86a5795 +205: 85fe8633bb3ccde13c7b479776aa1c41db83c4b764fce90ed14df15467a4666b +206: cad903e7b72d170c09fb62d3907f9b561af4ec18ddb28743ecd4cb733093de3a +207: 491a3cdbe7c160b955e34a93094302f1c01662e1ec30816e4516bf4e1c61b76c +208: 7ed8eb5cb2d7ee6f9e2488dd8fa835f6f22109f42215b901d5e4c4359ad30ee2 +209: 1cb36c31e915894a6a2533ccfd3859046a1dcf78d8452bc88958dde0ca191e82 +210: 7996ba8fbd81c2eb0becdbad564153c598abfa2b0f69bc3ce6566a78931d0b3b +211: 81289aa5f1dd141efdcdfc5337decd1399a8aeedfdeddeae6276288106bb76df +212: e4b3053295d363cdbb2572e7c374ae879efc9421701310a34db983a4249c74cd +213: 6122b9e38c62b79f5ae2511de6795fb0fc853a0aca3fcef4a182ed52439037e3 +214: 74982ecd365733ffd752f772b3c8859b030f09b7667627bb6dfddaec59c30963 +215: 65ac368432a97208d4b02bb2481e674f31d90f4f18efc9375b92282432cd4398 +216: 0ae0472333635ff53374228f90d5cabaacbc0af29938fb8693b1d6303af5d819 +217: 47335e444a2f868bab1dd2bcbf7d696403e156139545a479710a6e559439a8c3 +218: 836aa3b53750ab893a8d2505787917fc35dca9cdd8e144474f86e2fc62aa2ac2 +219: 902ad618c9cace3b20b7608eced2ed3dfd0fd2dd26d1ea37e87134f114053aaa +220: eeee27753ed8a81edfd6a9f9cf22ea18536e6b7afe16cbfb795c84611f729b7f +221: 78689d14bf6f41cf48c193559ca84a3d9159e4d8b876d8ef4400ff13adc7e546 +222: e95c0cef65e3ec3fd4d13511442b43639025b54441d0f6eff2f3f0fd16112e49 +223: bdb7210e537118706f44ce3faed211cbf168d84bb0e987d4a283c854514a896c +224: 8c5f6f2b232c4ca41560d9a9cf2133b9e9cb18f5879fd4b33ef3eb63e599ce05 +225: 0362c89e151b3c9fee8518298cbffdd7248e55598f2aadca11349c6052634142 +226: f890d22cde86aa1c84b2b176f20fbb12dad5a01a5440b7ea9b95ccfdf3e1c3e5 +227: 07bb7b47c9b210d815f1069a0a41d3a84521e657b7acb287b1cd5cbb49f67ff1 +228: b1a066f1a5123b37a21fcc3f76776d39d9b1900ab322627c624ca36c41ec8c80 +229: ba78c1228e9c14a53840b0abf4c2453000a9f7987a214c25303404f73c631f05 +230: 5cf5cac55ed208adb8093b361dd8b9f5f02fb8a53cef52826924782e1f6a11b1 +231: 96c1b670f199bafe07ddfd47f1621f83358029a70de499e06bbdf703df203266 +232: 1edeb64a7da98efbeb47db24d63ef44715ce037f115cbae5f9352d95250ff191 +233: c35d4468f41c85e5cfc438f1710c8ac81a14208d98f7aab81d9a2af52b557d3e +234: 15bdd6d35bf282cabde4e76053970b0dab3be54b0d82d307a286e465c8cf5977 +235: a1f30cbdae18417c306ced42980242e75e26a46dca692c2a5c66fee091eee6ea +236: 7dfdaa74283d590bed1a93aa83690b94af6da5ab325048562328b12121a1fec3 +237: 505531a199bdac286d600f684a6db9eabe1ebb8484b87d9eaa645697793161e2 +238: dc9b0fa83e94aa6a077b27566bc819d3f6c4cd9de816528ba0a8307ba5a9ce89 +239: 0469c2d7c5238717833258ddca0e7b5e2935f88fc18302530c7d5f4d12b4e6c2 +240: 5444891f96afd31dfb90875ef6361330cc9066732820393af2bc8e7685d73219 +241: 96c7a7d1a89c2a7ff489b4da3dad6040d70678d943e493124ac85611da941ef3 +242: 83ed5df952c9a10321737683dae3f07a674130eb1e63808ff36657786ae90bc6 +243: 8306098da643d0d713485eb46ed5b2e195f5922059dfc4235c56598e63258915 +244: da3dce162705f1440002406c5789b185723547355b9f68e2b79752c69120cbc5 +245: 586b2770deedf675f605e7a0ea1749f4ccee4bd503e979bed27300665376e135 +246: 21e45166c93f32ddb9455bb5bf741b35dd091471e6be0fdb0a3e3989e8e03308 +247: 929f96737caef074135a18be5507aec562cceabf0f782f68819c600c171c6652 +248: 07673d367d2861655fab34786cfb189d1264040aab58f8ea997ae13b6c303e20 +249: b0d774540ae1680d4d5c47002145f86d64aa85739bc61f0fddd24341fc870736 +250: 90be88abc45f798dd28659b543f1740317abc8f5a7edd9cbaa6aeec8168b4eb1 +251: ccccc2ec1d5992b360136f83cda2adc2e4e921407589c633974316084a0a24d2 +252: 7d863f9d4cf437e5f01661a0427f5d84c857a14f0c45117bfd430e1ce1e83d37 +253: 0f1100223e9634fb289da37860841f227e30fc4445e05a89580af9e37df54006 +254: 989bc5068cad5a93f2cef1e4acc0031c3892e0a8336f57b967ed493ade127819 +255: d117be5bf4886475737e229feb3a212067df3b4d20476412148de596327e8629 +256: 7918e370264ffe9a954fe349ffd1b857dc73948de93ecba459dbf57231df395b +257: 9aecf8190d9f3c8aa026de18a609c14017a5cbedea830aa587bfa75741785c87 +258: 4675441cd704567d561a9a244649afad8c0218870d8422b280dca07765478f4b +259: 807d3e8c51d7ea6d1f9178769f2ba3e6ad3eab801a22a341eba696ef656812cf +260: c9327ebdee70d30bc6da82ce176be856e13661ad045195c7ea3cbce1a50eeb6d +261: d2892873d407dcc7ca8d153705b537e9babb6e8ee48d43db752be3d4d5bff8b7 +262: 4042e408eac4bd2d4780366df17273c674ad0975053af97525a585783926eec7 +263: 7ab2537e4623221c87469fac039dab9f948005a1309fe4cace36a165ef8489ac +264: f9be4b7e3dd88242e994c06ba87bf086bd012bc05739c130708678ac148ee2a6 +265: 67f78d0c6e565b0a3b266c7024973632256c7bb1a50f26e615700ac117f12e14 +266: 65860d112fbee85873f4491a062057a044b27b075054207d04b3e1c8e0ecd295 +267: d17dc8cbb6a4121053bc4595c8d472ebc25ec03e6a7a3cea9693f7a08857c19d +268: 8f5526c34c0560b272a783e8f84d8c6068361fc1fd98737f916539c4e5a786ca +269: 622442a15cfd2bb1d19a5bd917eade938c67576a2fd710f355423c7e362379d8 +270: 01aacbb60422586205c3b537bd8e6e3c3647a6a6959d8c572343dcd4c2a3fd03 +271: bfb97cfb6d5ea07d2d2bf8075791ec76e038ecae19738583ed75ed3af92b9dd8 +272: c3bbcf68c733161cacb2185e06bcc08e739e0156bf172b465cad0b286d651863 +273: 9860e97874180ce05482189ea83b9bd46df9c1ff84c063c04b55e5007d71e308 +274: 60f51f62146cda4f15c5f549330bcaf0df4a420aab37ead2e94115b28464ec68 +275: f820c827e5685de1586f0c4366d68434efeada7cc8e4816113f1ab7f854030a8 +276: 439ee42e996b28301a17903413e27bffc561c20127696a1fbd7a9ec1091d15d2 +277: bff9711495f8648195b9d685d74737505158c58dbbedba3af298a12ccabdf72b +278: 8b440ac27c9230c25b1091416c331ef3e7c63fafb4d3fbc5e7e67c9a96eee7c5 +279: 153d0606d52d37fcf1d765026d5db583b0d8ee70cfff0b31fcff893e22197d35 +280: 8f271450f8d016349330115729edd00dac6d4b4ac1b4ae5a34ed03c3895fc6ec +281: 5fd19597f8f2f54a105ce419652b6f31ff5f81b6e9c9fe11adc74d37cbdafffa +282: 83ec2c8abf39cb4ebc7aa584ddab071e0bf709f5dcccfc4032649ee8e934e9bd +283: 87223192712bbde69b66186f916aaa5e034133be0852e736ada9a4f2b6d15371 +284: 51881c2227b7940a388f28f75754a5a606f549abd05799a139913a0e4a7b24f8 +285: 449501d5e3a11f803d3db8047544ba233d33b88d0e338b1cd8a21d274068f399 +286: 86028c7871285d1f8039aefe02e4f8f5cf8611cffcae71633b41cf24ce1eae2d +287: e4a43cc54820d908d2f413ad9a43b8c5a4e635c96bf3080d5a1d2add8a3d6eef +288: 4044246981889dde292330066d8f563a73090f61522316aca1db1fff59c76b19 +289: 7b8fcbec4e16cc0b53159f002d00a4e7fd67c8a1e04792e26e97c2e8ab52d1a2 +290: 164a4ab46b7901283c57d89eba86b54b1398005eb3b9681617934cfa48c0a7cf +291: c234774ec19d702c50ff52ab2a5681aabbd194bb8a16375dc0baceeb4549886e +292: 5dcb231c4448ea274426f1d3b34a4b5b2639d88eff8312bc08c94ee50ef5128d +293: 2b79eb4bc6a5c548bfda75d29f6e987942bc7abe6eb4515edd838913a2edf245 +294: 8c6febc7c3da2fa7155bb9c066677f018c9e6b580b9b14d576d38bb533f66cf4 +295: ebc472cf68e67db6be510b6d4732672c43c74604964eb5b4433b9c779dc7be5a +296: 61e0af62939c09edd3e12e53dd5b304b4b8d787f57adb6027154f81c748bc1bb +297: cde92fb85c4aead4cc97f094f99f52379f5913a4857880f26a337851195c0541 +298: 48d22f360d786faed02cab1f293efa2372d1a81d22e2920f884bc379e87faba7 +299: 12041431911a6e89eae0e2210f2b68efcf666e6da9fc63c33a4efa73a513f45e +300: 0e859b529c474484c1daad4892757411be6c133915c71e11de6675303e8a4c5b +301: 4ea0f68329d2132134987b0a52d2a5f72b799a7888f8e51b538a3390adb18585 +302: 2228eab0ad664fa03107f7867ff9fac8d5314e296bc47cb429b6d59c08f8e38a +303: 9bb3fb3df5a2af73ab0f0957db8633b22ae1b257ccdbf6c01b644345228f71ab +304: 28060f06073a5b7044d979ac6ed092750933fa2a65834d8938ea1ef9b9b30621 +305: 7913cb25af88438f3a4be0a6ac9c136859efb982b51c43cc41f8f3e9880dbc46 +306: 0b58a75e74f595094152e3bee513f4b47f465e974428ec9cccdd71bf0137dcf4 +307: cf774b4ff8cf9a2b2df5478356699550be7a89d26ca7cd988bfd7efa53fd5437 +308: cd7b2510510b1e68c93af020629b2dfd5a4d0b258ec70dd601271cb9c04ff6e5 +309: ca1027e7ba838b52595f0a83fbb8d05e9417241f7a3c8c90799579183a2357a2 +310: 9916cc864cec1e57b549623007220d92320c51cc945bf1cc506deae386193dfd +311: 4f7f9bf00b3975efbc9ed9150c8b38971951bc420c38dcff173357d8594db52d +312: 584a91d99da2b8b99c12c615961f1a8ff5b758ea8780816e1a1767d55b1c197c +313: 2adc133ffcc65a546c198b3bf088be0bf68341f8c5b45edf0a79428cfef5de25 +314: f9488b9fe9b0ee2acaf54bd385dcba101fbbcc801b71d0c3a1d1c820f11acd65 +315: eae10e528082af6bd71edf955c6fc7873b41406f727fac18872ea586dd828302 +316: 8f6ce27e9e18ad70e112aa5daf18bf564284fe985833dd34eaecc6b5e064a771 +317: 6904feec855e513b2f2816ac5818335be61832d92fc5e020dda40bed646df7ff +318: ce212d5906da3e2701313d4111da2f23b0091347aa6107fb0e3fa8f05c8c6b7e +319: ae2aa88187825ee3364586f6b7b8394f1a7167710791447e381285707caa2949 +320: 2ee5e39f89d0420f9781a0fb572557595505b16c4110580f9e2510cdc37a6375 +321: 71b7110857241e261289757765c5505296a4c99d1a5ce1fcb1675f1828bc58c7 +322: 612fa9024db98b84df2aca6419b00879701d649698a5ea3fcdf0c13bc58bb6a7 +323: f00b094cc91f60ba7e0a47c5fd5d3a65edaf8ca278aa4e55a1a859b8e4e610dd +324: ac13597737535d11f1cb7c259f2f4c85eec3e910d71be3359e758ec25896d893 +325: 3b1bd1bcf7b79d5a722e1c731a63d3a98d5efdb5f6ea26207d66780f79645cd2 +326: dc147e3da606176129f7195959841eac83db95e994c60f3dced9bafd67130d33 +327: 8fe245581f1813f11c750b3a5b02c8a6cdf1b59c5535e035551e5d590d3d03a2 +328: a870586448d52da28c66c78096681dac2deec0f07b6ac5f6790d497b7606e0f1 +329: 3718898cc208739481343d4a15bdbabc785c59ebec52837a63904b5f313f0304 +330: c559c358dc83ceb40564b40818a0339c1bfaedc1eb3dbb1fbe9f6d33a5e35581 +331: cca494691816aad621a47fc105b8fde3341105a29c3b706e9455cdbbaea2204a +332: d4cb6e4742eda4523a5d178948f05468d1cea1e1fa2b7e0d99d2dddd1e4fa8b6 +333: 58713a47ee7d464233aa4a925bf8ef6e55b305f2b0819d8745afcaf61e118e71 +334: b48c863bb5cabed5aeb69051a8a52479f5a37c6a43a643bdb37ef006b4db54de +335: 89cb6029342df50b71f16f88d8a495fd53b30889c94b4d7af1eaf8b4a8c1d9e6 +336: 3da1b949bef0364d6fcebfdb11e6d2efca2dc012010268b4c02e4b489a75d59e +337: ef14cd74caf8f47b6eda03885d20849d734897cf89455d83305aae6f1f457893 +338: e46345992433ad8f196a241b184f02a2d2564533cd39e844aa47d9a87f65f8fe +339: 77010eddd786912ed75c3a3b1c885944daf061d58ef653e94eb549143d4d2766 +340: fdb79ff371ba418823ea7443652d37286f2000df06c3880f1cb322f74ff437fe +341: 53f36cca4baee943d61e97bc9a5412670ff7408af16960c5487a93d1568c9e66 +342: 9bbd9eb1d00da5c0b96926357cc38f6f649f4daef2d0d79452365ed7a5679baf +343: 6fb2e192d031cd5070fb63f5e6a23610a008d592e0be5083ac2dc2ee264701d4 +344: f369c877964f6bf3675c2302e0e7273a600e5e2b1d8dd9eb0bc9ae1ebbcfba02 +345: 5fb4511bfd5a89a4c026b227d3edc5a1e0553ceaf56b0559c334253270ab0cff +346: 2105b64db2ed533bc0529de6d4eb90500d26e1b4fc0393a24292c49ef45eae40 +347: f110830985de233ea7ceb040e340d63d933a74237a6da1b6e662b6fbe1629d7e +348: c7a09648ab90c57f8334972cc8b4a13f8f65fc8cb9d7f27450689a8daba72b3b +349: 98b4e3352af24ad6d1ba2e7a1eeae59f701e84c2504f48190c11377f75c6ac85 +350: 395301bd43b6315b7cd19335d054fc18648c41c24e4fe54a87c4629830f1e6b5 +351: b496a8803825e94563c1762af845668689af8264d265fe96628cf5ae90774ef4 +352: bc4ecb58601d15e4e96551409d1ae3479a4b62488c2d961ac29a0f16b18f02ff +353: 93c5010dfef6a15683ec0aa217dc00466bf65125374490fba0c05e2d81c0a22a +354: ed4a34ae546505e877a978f68ad58c78b08ce2e084e1646fe7fa25a264927cc6 +355: 6578751c4580b094eb245261b9e4709d001f228d384ed46c5b9a98b9fcbea42e +356: bb36bef38c0667095696efe5779f0ed5855aa5c80130f3d834cccb3b5ee2fcdc +357: ee401de8e74d5327eff5dc94022aadf9b18f203d1a08d1587fbbda1682d41444 +358: 4ca535c0625c02ffdfbc178b70a5d934c1a66b0c8782195184a02b860f119029 +359: a45b2b54514720695a603bb0fbff2bfc04780c97308212244f57ba7e45e3aa56 +360: 56872cd98fa9000f92148d6ec19c31e59e71766e342031a6972be4a453b2d47b +361: 273937ef97b43b3017f0f38746bf4a2e6f53abe57b8b8494e74976026d42a241 +362: 637a19b146aef1d1084f07f0f9832dee7b9ee4e27d803bbd709467aa2ce303f9 +363: 7340af34abc3a6a30a14d0ac2648bead4cf4dcab4f252874f95b5dc121320998 +364: 11e11820eb3b42a6a97b7eacaddb3fc01d7731a22de37f6f379b2e3c91a3835e +365: 9c9783c63124a6913f338194a0605952ccea0543bb5573bae70f440dbcc80928 +366: bd2e7f67123d49ec4d8e529fc3714f4b7a0b1fb1a8bbcd6026f53b9a087ef946 +367: 89888854c22789bb35942321ea458dae0dcce3aa10db62df538cc8d3f5998206 +368: faaec2e73a456fe3150d2be01dd10bb99437e801b4f4984ddf4d26d33caed5df +369: be3626c4c9ab11b5e038c036874d5d99375491124bdbeb3c4027b29e4af1c5dc +370: 022ac8a6d2f09db3edd2dc5b92bfb8cbe893f83c2a48b16179868b891021ee58 +371: 0ae40bd4ee211d6f9f9322e7811d80aab3bd81c17191ba32454b3c9092854cc4 +372: a3b9af71edf59a632d02f4819f4b73fd32301d36f3ac7934659338a70424c0b4 +373: a2088bc52680e9a605a2919112a655058039dca5db6d3a4ad28f0308f82a7b1f +374: 9b69873872d2a1d90c3cf402b43ace8b5a7a37b02983a208167e865f51feaea8 +375: b022041c3132842a4bb6f1efb8e75fd2c48abc0352a40538fde82572bd8b4c6e +376: 79b15cbf5b8e0dfc79de050e4b307b1dd7d0a4cc6949118b1e7297c326bf4505 +377: 03332d4b5ac755b4918c7f9073f877cc1b9af8e97d800dc45abb4a99311f7bdb +378: 4bdf53be72410131df3d1294b5c3ed9ef166900ffc56474452cab8a16a42f65f +379: ca9801e8fe29a1743c4fe59ee889c266ce276e339956341d94c40ed64e2cde7c +380: 51e0280d03118a04c067353eefba23faed845e2f8aa77c114e8f7ce9cdd76ce8 +381: 92cd4b7886ea31b185290bfdf704bae8154b2035961511e98fdba5d107a270f6 +382: bec0c70454a64f9d37e0b6ab2799577b7f98557a1b64871235a3bfd39d89556f +383: 00162012a6c2f2b07d88e02d9096fbce28672e1a49ba27c9b743c0cf3be84445 +384: 7348acf111fe5513ab119295407bbcdfc6ff24d8810ba258c949154b2e9d1a0f +385: 2bbf687ce7569408c515117fec126ae3ea11af47dd8a5e80c1d45ead997cfb2f +386: a993b3a196f19459dffb4c77a1dbe0f2084c02553fd8b4e8d5540705bd50e1c2 +387: 26f84446687ae90c1813fa49721257e7fd8938bf303dbd72cfb4e32cdbd58701 +388: f467a901838d0f18b1ff23b4b92a8eb47d1087973a942f160f3657ae8c25e82f +389: 67aee2303ae947f1c3cb06e7bd76640be6e007dc21ed674e82c56a2fb6182e37 +390: 36eacf8ab85aea33a2d0cdd5716aefa875da36d05e765fff91bb5c70c7fedfa1 +391: 2efed6f5c3303799203b563781fe7e8dd10e5153ffff7f40c7eb71380a11781d +392: 33fc4ac404c554b242bc6a95c32d4a780ee9244729a5787009d6f776b8e98397 +393: 0e6a680ec399b877f374581475656c2498393025aede5857a3ae508ea8885da7 +394: a5e064a448b5ad1562b05f17e73af343045c89836ca15fa03936f2cd23f7fb8a +395: 5a22f1f5098d4594311fb19e225c848602e7880579356f183ca882aad3eddea3 +396: 1129d0a75803362dbc3b9d3d678fcef29880a5c5673937abe2f0ef71ef83083e +397: b8e2c3aea667c4d139a7adee2e29b0ef4ab85157d97d3a593deef208dfa5850d +398: 77dda75715d6a77138f0b4c95c8f374b6cc9cde0661d111bbd7293dd0add6e45 +399: 4d9199d53858bd285e824099364cd360e55358bab92f6e699032d7597c78127f +400: ce5296b7199d32ea2668de4f0e12b522de695890d491b69a46fbd3b19443a5ef +401: d953f34abc2cf734b1de72bcd5fdb9e34b3790c5539939dbd0c580578cd4993d +402: d11987f38e5d5bbe655f2c1f0693f106bdcf39794bba6b8318ea575f8bf0231f +403: fa1995a87664b4a1335b18f635e132113d802bcf3bfaa983844e4be9aa48302a +404: 94d26f5751646b41f46cf71187773ed3c3fa5a059956c377be54d6e198fe7f55 +405: 73621384cef28085fcf9579dd4b08a9c60c6c6693de75276d77178242b31e9da +406: d18256c03fe2200e7fde200cee7e5e68b31fabb35ea4aa674f1480f0c70f40ad +407: 228cb345ac19bde898f5d1bc0c1606c20a4b378d39c45f048f2ae641765eb3f3 +408: 127b0845056b41d6ab032c78a13878dcd7f54d363918738f107b4449ccd58462 +409: 478b6381cec4715437db2bd003710a92e5e3355cb5e01a92d4eff6095d2fa3bb +410: 2875c4e4a1c27d09af73fce7b0c8e9f0a798ad157b10b92c36f696f2312d52f5 +411: db0a692d081a97a3d3bd3e525109c1bb5e5f43654c538dd155e98a433d8118a4 +412: 5225f5acaadeefb94ef492e502474d900efc6bcea98579d120bc59c7377448aa +413: 27858430af45f95e7dfe8857d9f09e663577b2b858057eb531c8698afbf75209 +414: caf13396952df2bb16c10d62c34df43c4c422be52fe963401bacbcd8b3fd9720 +415: 7c9d95826ee3ce61e664940568a0066e9cf2665025f9d085eff982292ba42fff +416: 0d2f401f6deef04e52f09d18991981dc4e4a410e14bef6e4d0952c14d4bc791d +417: 5fb3672a06e111c544223114a982f4993cd0a0ae2f8f20c736ea622f9a592f3a +418: a143850d422c27cb425db67106caa1546436e843bbf6c7c5ca98c7d8b26500ed +419: 3a7d55b86405bc716dd23033ade4b475b1e16eda03737ed8d54783ae48e33842 +420: 24d02ba759abcf03263bf74b4149e277de035c9970170aee0cca3db4c3af0181 +421: c88f29372fbd0f25ef8f22d73d2c1a011c2108e43bff19231bda4ecb0aa870cc +422: f13f8c6793b9fd9dbaff1f6e7ceb6adcbb29df48412dff67855c37ab4d2ea7cd +423: ac2ebe0fefd24d17b128950992a8447d3d72e96d9991aa28cf949586d4aedcca +424: 51ce61394aeaf246871690a4c3f9e1611efe3db47689add4f6553ac44c50aac8 +425: b51cd46dffcd7a50fd1bed06d63277dbfb49a9dc52d130d2fb48cf763d090eb1 +426: 8cbada55be3ceeb7ff10a3a86cbcdf93cec431bda81cbadb17c35889517f6aae +427: 271ec5f0f337031bf4da8dffe63665d21a1445076eba7fe6347e01130724c2aa +428: 4e6b0226f4537cf206076359b05c5e848c278ebee902d761fba857852a94dcd4 +429: 26b02334cc3f7063cf3c98509be21fb05380a1c5b5415c551374ad541b25b73d +430: 855ec2729210f95045ebc4ec2ffb251aaedc552cb84b2525a111f09110a21957 +431: c492ebc57c483a2e9b696db4b20a7d06246ddf8eea54e374d6692f1557528c06 +432: 82dd34db76d8eac6badba158292cf14249f78c39e27219aa8438ff147d6c3686 +433: f71d583756b28252c751cc4f86b96ac2b24fd3edcd87c89920fb7cabd84babac +434: 0c00bc0ff60cf805bf9f92df1780f5966610f24352cd533a2988dab8d59f4dd6 +435: 52d23dc9cd06ac01737352ddcf5240e911361c21403b997b417476079db87454 +436: ec9c3e840bb9068563e655fc0115b5f2320ac1e26e91bf6af4d92512b1191a99 +437: 796fd5cea33f547b238d9c191248348e034ed06f008cf8b4bafc428a52ba9d04 +438: 400aed2a17301c211f09c92449841d9bc11246db124d6f1f1c584c0589116434 +439: f4c457c53d3ab63c03f3ccc4a18a9e45682a9dbd7dacc809fbfd20a2a7e95bec +440: 3c24b2f357d6ad70a76da8629813ebcf1a82b5dff8e73f4903709fb4214f5ae6 +441: cd1328d67eef562365c873d1cb56eefecfe886e6e6197f98273ec2b2d642168e +442: e36b514415523ce85e7c285edd862b158e60e5eb47b45d4b3c907a9cab4e6015 +443: 0cb9c2d05d74b1acc77eb6c71e8dd69d2b2788ff3e1d40e214694abd1521121e +444: 49d7ad342aa3876e558622dd03938a6aac258784ff02d1c474ee3ddabca6bb46 +445: 15341339c524f870272f562886acb9e8237330a29f89038e61066182d927fce9 +446: 02488037fc6e3b89cf003af6f4ec63ed4203384266c064a7992e0c05a4bdf14a +447: 2dad5437171fa3401711b6fa7b4774ef6c5ad2a8070abeb6229e658ab3bc04b3 +448: 2b93fdb14add3c52d2519a2fecdc906893ae77ca2756ae6290a62af5ba0330ca +449: 08627f60d00e95c42b53bdd5eb8d08b9360fc1795191525cb5f9ca9dacdf4dab +450: 76f89b17a70f96f2fbb35119211f070fc6e5d71bf75c2b60596d6ae277ddde9f +451: 4e2319c28de62374e7e20f639ed19df7dd0208b6fa729385d8a97b7ec0085179 +452: ecf6bb771055ffd58c77062f15611853f496708608065ac61036d7e01f50ba4e +453: 6815c2382af401c3f5b65fdee1270d065bd53c38eda08985fa4699b02c975095 +454: 397db724108990d5a402ddacc938debcaf8b3f9b467dd76110a0dc146b451042 +455: ff534e92474626cfe49c76261d074cbc93c442f9729f6052119bc2c97ec27f0a +456: 78e86805f8b263632bbd8fb30f3ae913fe5b71241ba701665b7fd73a9087d9ed +457: a8badf35f8fd4168f41779aaf5db3b51a01952b731ccf0ab04d65924905ae4a6 +458: 188a69be9bd313c3abf0d2c9f86654cf1e56add4189cc9413456a51947b421a6 +459: 8af25821481a3fa7137e3d957c64a97d0204f9861bf6a8701fafb20dc4baef6e +460: 6a8a04c755de9c6044fe243e31b45a3d5963f22c5323be74eb04965ed419aa54 +461: a817f1b7b748b0236c255df87d31be1dcb5b4499992de7d9b9ae0d259ae91e48 +462: b7290cba8e24e6b9ff81fb5b914dcb248a58bea9b021ac625a7c9f29c8a3ad8b +463: d2e4f2a835d2ea8e382099975ddd354bb129019f61b9d56326386f5ffbe0c2b2 +464: 54db5f0f6e4746652405abed569c91282193261669c7daa31e8e649f3522a79f +465: 50cb4b5862df24e4065c94c71b27606a3f811361ddbaa2664aa7c88dad151173 +466: cadf8e317c0dd6c53d36b99f832a30ae150a32c1d9e2a95e0dbe9219fee60e83 +467: 29196500ec6a1375916b0147c353b8a4921aae592f51fb7b492c3526c2b75139 +468: 7766b257b8e202072cc2d65999388f60f55b30517646b258bb5075845fc7e4c5 +469: 211a46ca3d1280a830bfe997fcd7fa606f56547fdad9a2141e87b67af443495a +470: 18e523ef28da5d53433aac9491ee418c7785e82ba8b84c9bf091ab25a709ed10 +471: ca746cb23c094d3add9a0ac70cc966656563bee80fdb1cd9d729a69da2f1ba34 +472: 87b9a1347f0e33ddfcb4f618a3701d59b57d6394d439474bb7016d427fbe276e +473: 22bc2c81b6f94c84ab0fb79b3a7b2684ab7e8251caa08be6b8701aaab24ca5d8 +474: 5d10fcb4b8ac2461185f5417f5902b4c000cfc73acaff798d8521c77456f51bf +475: 8141b5641ebc92599e3f5a7e14546eb15d2fa8a791946bf0a84657a346525cd1 +476: bc82d29fffb497b8c2a9fbcd2e95b85fba93cf985cdb56461e59b69ffebb7f22 +477: 0a57dbe66466333ec1d7ebdfb6100a903697c45b99e0ac3f4a659ab368ae1a85 +478: 51ce84d63b52a81becf17ed59ae68be2ebd629729d5d4d5a2f1583d744bd2a88 +479: 48aa59c51a05b0a5e61ecd89c2bc8eac6c10d05417ec000cd7580ff52b4e81f6 +480: 16f73e3ade83ed3c9ef33e3c0c01a5686b33a05fe1b18308e823bc2e504136af +481: edb9856e42e585fb13ed96b367364f98abe4de71e2e423d8fe7c6de5be223345 +482: fcc764222c981a04504bbd3c32bc7727600b5c1f9b386e22a226a668dbda0c87 +483: 1981e5927b9fd162ab0bbb5a365b9ed8e247724334fc59ad28e394a6c4be899c +484: 90cbee09dd7935d6837b9a1b67f9405452603ba5b228bf7a8549a2abc78fd255 +485: e504621151f680b6086984a4ee2d15857da704a659974af5ef93be2d1a9c356b +486: 203bc8fa7a5c11b2eef3e268df252033193381dc8258ede81e88143ef23a8b5f +487: afe30eff8e40220ca4e024fa0b94a46fcc42c0cb55df68471665b27732a60a59 +488: 48fee4b0bdb44c09ff517e0bafbc35c7b825379d3ae21924ef0a44433b6a0447 +489: 276c7d526581af81956eb0e247e55925c069a843ff139bc2ec057b5b2293b689 +490: d238303b4abec814253fcef18081a517c4ef3608cbe6a4101edc61c7c70055e5 +491: 84a409eaa8a75a5c91c97b3969d0987dd9034901c960ed9cba49994f0bd8372c +492: 03e947ec08b722db55035664aa0342bbfa6758bc164914365775dab315bc4fd2 +493: c23338219a7fabf5220ee25cd9f033ce9061d7d5bcde28f9b0110a8d43b3ebbb +494: 092bb0db220936de15bd23e6aa1129c52c6b7033e6f801f7dd052bee713456be +495: 5c6f720499c979727710b23ef59996f4cb44e39a95aad30e1e395f05722dd749 +496: e6f72d91a5b12e3740837467c1f577e4893965d0bcb1d5b56dd2488a273ae016 +497: 1d8466d5bc2c57f3d39b4aa8fed21acbdeee64edad2f0b62de769b4e0822edf3 +498: 9f5ded99162815de77cc21dfbbf69a3f96e9a7b6b2c86f50b1c511dba25360ea +499: 3b9fedbcb2d3e8a6a4bcca281e409e1dba4dd05adc2623390f68956711cb9c3a +500: 7d1b86dee381d8053344099d321854dec6d1ac7e7b7d63e587211a3c23f4e72b +501: 4695651d56ec6ffbd43e3b8639f1b417806d9fc8af1ef6ed8d08e644686c817d +502: c48d004fb14c505ce06d9f421ce0d35656c448d631515f8652ce931c1d4f8eb0 +503: ec475e34472eb053e407782d27b173ef82c06d3088270b7da089f7c7e2cf493c +504: e5ba57405abcc5d8e5b79013f8325915fd0cfa08a59f3860b83460080c3e70c7 +505: 94f3e311302ed65044838b6dc97d51b414b5e7949ee23520a9052c21d486688f +506: 33b34f47628081709b85af96e54f4a94c882d06efffd34ff5a5169b5751f1af3 +507: 8c02a790b27b4d6e792db8951dc9b0f1f48c0e1338efbedac92e485a9c6e3df3 +508: 6a52e76d0066a0b76789b0210d26d8812f06f7c8d7d0a968d901cc16800bfcb7 +509: 2fad4c278b249feb6bc654c7f80bf6c7c084457980ea4a95b8479088dc3ee562 +510: da0583e7b44f358b26a83db200c8793f60164347410f108951816718d55b040a +511: de11abe66ba38bc11b0439129fb6ceaf39948b27cafa3275890cb05f2a805f65 +512: d2dcc2993839741afe2de012f94b03681fe5549ded0ee3316e48b7597359dc69 +513: d88520e62209cc1fde3c9b16ec40ddcba1b57f06bf9a5146dc9014ec446e6f29 +514: 242514918e564473ca0d96285b7ec23bb5e106b86977ee72cc5fd49bafc2ae59 +515: cffc937d5057e24f8365f89ae7b2b6afa8c8bf6ded43774342756572f2a8120b +516: 05c1ae4da63b088c7a6446c94506469f83f78dd9fdccf0ffc554a0234bee96a9 +517: 6b837bbe45a0392499efcb1fa9d0a183fa265f259a0913a685fbb6fbabd9cfd0 +518: 0233c64a15db203e102e92b949ff8f5687f122b73a6098d873995d3a69f3afe8 +519: de996204b8668ea35758f4a434a82738d2e4df397d56d5e44edbf75562967d9c +520: 5847a852cde88f947554f4ec2e0f8df4276ea4ce28431dab17b849e820069163 +521: 434b92148bbff5d2286e0e80eaa0c4a3eb53c7a666ba23777e7bc458a3201ac0 +522: da5a927529243cee03f6c1398e41447ef5bdebbf61cc25817c688005d45b0cb3 +523: d838b16255c39410f535eded20ae4a2a14ed4196bbdc272c4ba13de25217329d +524: f46cee99cccb920d7c9567e571c793ac3020adf9502302faeca2c0dddf1f08e4 +525: 1e5c71266cc073d99f10093786d1d141770cfcd510431870662fa857dbaf6a5c +526: 602ea3fcd4d90de7a8b5dfcf65a61d53328f2edadbbbf14c62b2a6f9c3213a5c +527: ff707c27b1d462f2cbd191f8555d2bb197a24480ff61efd0ce99b521878afc6f +528: c47995d2a690c25de33d55754d77ba8da2e841a86abd46197db2f5863524c78e +529: 89b542b5508c1821a670a2745fef3b56b7e9a0f8aeb2f8bb2149e90c75e2139a +530: d5b89eaac746528526cef9f99a3bfbabf9ce9b6ff604c1971974c8d27442981b +531: c9cdfc6cc2de550a33ce68f4848b4c619f0b425b699f2a2b76d2db475f6f7573 +532: 9600f94b77994e18c362504cc144643e90419eae3f468d3ab4e390e429d0d5b2 +533: 7ce9cb9bf84b35a763110b7f66e0be7a271371a78a5376712c19447534451db7 +534: e9a8b50d03e1972741424c2c16b37166fd2d8b6fa17d6de9a0ea6d5b500adcf4 +535: af46270f70661306342e4d96df5f73c51be87a7cc9208e31356129d2d255a9ec +536: 0b84feddb3d62c3515b4e0a082f485313a7583d1e69d28f5b56928b177bde02d +537: b78ab7ef9a782179abb877115e70e9ae8a4df5a2532bc6d70a49137524d18c0f +538: 0eee1d4fe4ba096f194d4bfa30bcaa12cd5c5010b42c81997034a8ad71de5738 +539: 1d750f1fd643cc8cd360ac7ae41292051c7aedfff4ded6b61566739aa90890c3 +540: 38feb94cbbb3637ac27d561b97274ce8340d9f49617cefee8884ed94de6ac579 +541: 67d18d9524de82f3cb9048127d4c429f9d4b33ad3a9aa99ce86e34bbddf81488 +542: 24dba4f062cce959ebcf758e3be0363905a80b191835bf4333e5c572c085ecb5 +543: a0945db8081383cfed2d66fb9f79774a953ffc9dd6990548da55c90b800077c9 +544: fcf77a9d1f6c84048163f9f1ba21eedbef74dc62c12505a23934b8637758fc0b +545: 6768ee1dfc4d9aec0fbcabd35ec91642bab1782d5b5512fd1e41bced92cee73d +546: ca536e3396347e0495b021e2e84003985d9304360c1505e0031f6c1e5b6e74ee +547: 6dde51e539def3bea08bec0d63d740dd61b66fd16f64296609db33103d76b7b1 +548: 28f4238ed0a8e8eeb50b1b49bb0017a5cce0b2f42816caba49464096d602b8a1 +549: 173c9fdeabdf4be0e5b8dbd4784cbc808e093750e2397388cff3c5979d875ff4 +550: 99a27a37ac53b36ddec9cc432b16d44f596d7173184d0bbdf1547a4e04e3a1ce +551: 86413f744576d0260415fac0247dbd61a3867fd329004217a9141f2b0e5bd2e4 +552: f2f8c905ecd61ae2aa8de239c64fbd7b5f0c847ab18e56177d76240a626008c5 +553: 862936291eebe5ecccb4b213d74c9a7f022772fe1add00f7af5ac4ff6223e346 +554: 0c47fb1f36affdec39eedc88fe9bc3afe65f910047fe9677583d109837da43c8 +555: f7cc0f262bdaa131c9b582d8ba3543f4de14e069eb8453b9c6435900b2628b6c +556: b5231f7d4bcecc3cac63cb530c6ae7ea7560f0c27e41557b6ac1146a2c1eb568 +557: e8599934318acdd2ef5e7fc634960d76700c92d313dda306c2cb17515a327c3f +558: dbd646fd923cfc9b10ae498511d6f131ee8c985060590b06ae3678fb8b46b5c8 +559: 6d52ecb66f21882690258d77f9382c35540363077fd6086fbe4682a84eea11bb +560: 07d78a6e3ea3c7f98de73559adb9e489cae8af8607a1fb3d79abc150f553319e +561: 4953e8f819a2add9b23853b06bb97e26c7fc49acd8cc1e0b4684a5d766f35a53 +562: 781b2f97f00f73debc515a175ba66083069d9f1506b4d6232acfab6a0a3ba939 +563: fe3ea15a76ef7006d987d06dca3e0f25ec94f0a25fcf3b0ef7240e3d6c47bd2c +564: 7ee11817f2ca5f9a6b0d7372849ce31baa3269e1b1780c5f1e0d80716c357088 +565: fe2da2c4071d83642a5720718e49aa5a44a5bcba7e8f8935f4021e0955436a5a +566: ae74a9faea147eca57ca27b6e735eb1aa8ece530448730c99871a39075870131 +567: e3464d5fbea3f20e2b73f63be61c455ca0a518f989b9d18ada7b790dbdc63fb7 +568: 6b48f7b2989583e8718603b3a62836a99ea5b37853d7bca7b70d52efedf02d73 +569: d460ef41f4932d9f4b1cd07da8f935b6fdecb23ff8b269c80e86bc7525c6f72f +570: 64ae878a73ff936644eeaef0338138b29e0a3708bf4e99cbbc654b94c4f172ff +571: 1a4965900231ba33d6d2a629c4eea67599342d97f9b0d859ffda8892f51d0fe5 +572: 105af97fddd8f0915dda627d3c122c7866b541d6a39f5ad8a77fa648c222ee68 +573: 79502abc9bd09ad2f2a3e454d348723a6ba623fccf95025ac9feb0f9de4db246 +574: 558fa2ea8d21782f73c50ce20441385feab4e386afa3359fd035921161dab934 +575: d8446ce7590ed28036768d268431115d1c8118bee49c74bf6f1181611acdee49 +576: 9b4a90d2d7654e229dc2035300ea60a901c7bd96649bc8d5aca1a738baed038b +577: 798270bd135c927db2e94714661d36600c8d66ca3060acdc991bf42d918c079f +578: d7120b2db88536e9934d96390ed9ef1eb11ce428d0b2b1bec41c8b1fbe51110e +579: e001c6c8468fc9caa9c0e42a731356aef769913b105945c498efa8c95718b06b +580: 0f62ec1075014e7e869cc697c5670bcd4a669c979a8cc1dcaa38e41ce67e296c +581: e5ac3f8d559a392edbd7d6ac10a89f2f09808f9eb9c720189040dbb0f87a7b60 +582: 64e2b58930dd78a546bc5b7e55f65cf44595435397f5253401d3a31e0c30b317 +583: 263373377014da213a97247cf6506808d90e15e1af57d5c13d8d53566b5a5461 +584: 9aa6715383e79f4a1ee8b8cc86f128dd84a4982d3c5a6f156b31e4472737c83c +585: 1925d844b25759a842c33263f155d29878b36fde630777ae0a97e2fe85cc00fa +586: e9e11491a037153d2fd0853c8eb489a6bf5fdd97c951c2b3bad7807a12f2bbd9 +587: 3d2e8b0160b56435c74603ff172092ff34ec4f82e614cc4c445e162ea9e07ab6 +588: e99ffd1b1a61b6004364dbe66570f205dd74e60843cbd9e43dca8dbfca625fe3 +589: 629630ff8906d7c13cf9ff64a0b427ddf9e8941647d8efa200b38565f80e45f8 +590: ae56197bcc4790e52ad8636450e7a9c6011cc1b1b6571ffb5922662935ad5e8f +591: b4f2c342260a8b77d6a4afaa9fae0421bcfb16256d45ebaa80f658a3270b93c7 +592: 06b84e9eaa313e7381f3a25a3b2ee71a0e058af2dbada33c08efdbeeb6a4fe1b +593: 9d45e4b82e1f0eb022ecc8dda15b45e0e23964671eafcd7786f44de42a53534e +594: 6ca41d669a06431c20f359eb53a00e8e40bff623502c06975a53df2c24ad2740 +595: 09987c84090b121bb669491451fd36981e35059a315bb3510b2910e5cea7b703 +596: dbd7606eaf66ce092f8df17a864e7e58a82950c0aa4f59a2163e2e0b98e05966 +597: f408448625e8639af09d36d1b0b4a8475223dfe23d9b13c344f6efa9b0d79b55 +598: 67fd26f76aa8fde40ea32742e9564f318e4d30393c8c8b3efc1874d361a0c677 +599: ca232d6b3a3cc9555eab03a3023cf6957a95cfa1d7675db8ca191c5b31cae03a +600: ecdc0f7a4ccecee888019378fe1111b23e4906da170fd1e3cd9ea1593f941cd6 +601: a2c19a29adae2d8a541915b310c566d55ea29cc7e3ac91f7fd3a88cce40c39a6 +602: bd042cabea0461654574055fcb4214f45dc5f7cc1d8aa821e259267d86eb8c52 +603: 69e0e38d26d191529a5b11f19ae3c78c8909855b6bb31660b5af80ddba964ef9 +604: 7bf4908e45ca86a3fb79c7e6a09f604ccc9c557974483aeb5b8f473e0c3f0a38 +605: 0ebdfc4dbca222ec3f4209d36e6235a433c2ec5f064592ad2724107ab6d2abb3 +606: f60e345855d5d683c432900a9a233fe853b812f6bd8446601bf8d410c3e67c36 +607: e4d5c7bf1ca47fcd5179833beb7a8489e910fbe93ecbc34a7c912c358b45bb33 +608: f9f127ddb0330d7588f3711a22d9372763b4661c63db217e1561c3b6ae45ad14 +609: f0822a7a0511193fd6f5a29ed39d8e8f737225fe3e7d8d90c704a032290ed1df +610: e07fb2450d06ac2305eb3fefb4b16b6eb3996bf91f98df58ab4af7bf4b24a5c7 +611: e6b0afff326f7f36b65b095072a19b0e104cca0dbf27529a7f39a0acefe8b3a5 +612: 30bbf45da7bd0d24f706803eabbbebbf78fc67f98e0af4d68524025be2de183b +613: 9446910610590058b8b7a5079920d545e633b7b7a98a114303ce332e34e1ea31 +614: 7a11ad209cdfd258c5be5247c594103ace97affeb5adb140b3bf4b9a164ab4ae +615: 561775fa45d789a4912019093df2cea17402a556110038b90fe8901d3ab910f2 +616: c40d48d0551a2fa949c0c19751b3ae0027ee1169ad96e9dec2bcd06c6f43bc0b +617: 675519f03c8208cce08fa91f718484864504085354356790c058ab9aab3009b2 +618: 8dc12b12cd525177c298c4c925748af02ebf14b8dc5feaee4bfb75c1218bdb9d +619: 62cb61ef8ecc400740115f39bbfd492232761effd72f67f2edf7a4943802b7ae +620: 6935a0079903436cefe716a592752a3941c38c6fc81a52b70c0d79213d157583 +621: 42e01b526623a41ec90659f1f3e7566c07254e21e5c3c4d8ec5d63d99a3905a2 +622: 8e0d64ed83799c1081e5eef417e3a8bf0e7b33f7c3458896e568cedca96f4b68 +623: 16854b1163fba8b8d5328637af0d7834b62318e11271f482bf3b31309bf9c89c +624: 8cfe1d643d67031da6ab55fa27e2017915466c5775822ac29bb303bb18f61830 +625: 1dc6034d71d1f5f1459607c478ea4aabd826e50c59d891a8cf36f6304053b478 +626: 2aaac5bcf9d5587a16a51d1ed47ff084105174d6b5f2ddbf2cfeef6664728970 +627: 61508285a773bab75cebfcfe19372867f10f80195fd58f4e4b829f857d769aa0 +628: cd700b9475056cf381f9dd6ef52afcd9868aac09d0c1849255096cd698851b5b +629: 9d74cf92c621a9cd48e4e658f4a01d2c9b245cfb616bca6247e0091e7533a705 +630: 6243a40194637f3bd50e96d703b8f5c7a4f60ed7b71da7051b7abe4d1155b229 +631: 06fa690518c85c3aaecb3ebbf5fb049deeb95354789354e77f0e87f714589f09 +632: 5f359792b9fc023075e078126bafb2630c07c55cac746cec7b24dd52b55e5493 +633: 7ca64000ea0cabc0bc80372a13fc49e3e19372072378561d69ecaa716cc32cac +634: 973cdfc51bee2d6e46eff4ba47f2f8dad5edbd278256a98383f3416ee1ece09a +635: a906682cd85185924191c3873491a18b134f371b3de306946e485cf2e58c04a9 +636: ac11e1fa3e0f28955fac401f434d384a6490c7b4309aab903d6fedde86ff044f +637: e95a1d5e94da3939a9ea1853ca677b7b4524636ba85ba6ddb3889337fb6731f1 +638: f91877dd03a80fafde2c3a39eeda2ecb4a12ad8e308b6a1df6a182580bcdba9a +639: fdcfd665e5ec4e69f48a8cade948e319b79388d3f2ff21d99d4f96b5c07e2459 +640: 3c65738454971b3a3f7df085a917c24243776ccc968e2ef2428f59e9a0519188 +641: 13c90cb776f1531391b36f927bbb760e29dce4384a42f6b071c22df66d06568e +642: 9beea97e1746d96db9347e330df0e92b5e05efe2c72f5b0a0f6e621d39fd450d +643: e3ec99168ea8353837cfea97f45c3cf297805d1cd3cb46ab54bbb35d0e82e828 +644: 1844c799ba1b7f308969f30f2e597974cdac7cb4ab8c027f82c67b7bf09db7ff +645: 40eb7652ace2dd1ba383972f70cfc3eed35bc85260cdbb001cc0e151f7edfff4 +646: ce4167189ca6c39a025e4a749ae0fa726406a71d6a0c4b10f266cfa6a9d34ccb +647: aff90a63a4a5e46e58d9fb16d33f06f8fdc15a73c7c690dd02e7a9f4576dadcc +648: d842bdf7ea299274d3bb91fc362e4dd4f3c28237e9d621e0f97488afa9a02369 +649: 18601f93b8240474442b832cf1aafd541b32fc47cd024bc626fcc850fddeeb55 +650: dacdbf42cb89fceb79d1d8bf8c583bc127c42e22c7fdb7fcc38ddcae39b1f62a +651: 7cb09fd65dea49174aad61b0cdc7c53e2b4d755816e1137c52ef721ec1b19169 +652: 8be09d653c065e39f84ba4312ff40abc6ada795ece77880a45579407c9bfdd01 +653: 41cdbfc8df373987d7a4645cabdb323ef92eb2e149b95b1cb389352686948c5f +654: 54dff6778bb9a8737f1eaea2247731d70620b74d4d2bedcc492a9768cdbc1e06 +655: 1ef22db51009e59fca54a417c071def94551ecaff885ce191179f2bc486565fd +656: 217294d1818c40457dae5f3a19368972c7375dbd4b1208c62f024a31ce3887f9 +657: e0d0f7c5f46849f29808d598cb9b08fb2517fb38d29a4ab1da969d956b1edafa +658: b3604457af6e43b8719e214620a6ce14f8c22c60a608381275e5b376ffeeff84 +659: 21e6ec5256747ee8ed0e1e4f6d461f8e72e5421598460c0923984e310eb5b3a4 +660: ed4acf4aba6c1f3a7dae1f27c14f298a7966c444e8c70b6ce1ce0c0b6daf2a41 +661: 0547af4c292895a4c18d6be5b2ac9f862f363a36bbfd52d46adb490175fb55ec +662: 3f08179b52d97e7372de73ddb39cd16211d212b0bc2c1790094b33781283e1be +663: 37ad8e73e6a01fd8bb930cb3fd00d43692d8c83d37b4ce6602ee531b282c0075 +664: 81b8b053eae44bab64dfc2074c706d52c748d75cd6231029e9f88e08dd670272 +665: 91e1f3207d4b0f56cfe64aa422c06a4245d701529df5d55ab419d5a51e0cf122 +666: 55bba2503739c92878cde322151f1858972c3ad0cf96c0eac0cd7d6c3b9e4077 +667: 1882000b8a909763214eb3116e4246c9ec71207a3c306d7fb6ee3ab82de42ab2 +668: 4c884909e219886a50d8100a12bcfb356091076fd6f144fd35b6854307d465e2 +669: 8c0aa56a953a170a3ff4ce778e7390362516837dc29bdfcb801a13f45463042b +670: 25bddc5907720ab48ae5b6ea70fbb97a387b1cd5d2a3b6786b15270283f2dfa8 +671: 872d1272dffc2f9ab8742a08a8ba2d38e49a5a6fca74ea6e6e60331ecbe39137 +672: 25755f0de23d9e58811332e75584370259973c264b7028e9f68bffb0d073e52c +673: 0b96eb45fb17a8a80aa73a0e7500e038232dce2269f9abf2add880fc4e2dd081 +674: 085954a53c62269bdc9d78c7c45ca58f5c0220f224c7cdd8b7bae4b6d0fd5fe7 +675: 670051db6c0fb0f947f5d7a11d6bcca2f73901b7b05662cb238cf04ba0d9e556 +676: f8f7c37e0beb0b45654e7f2f03e5a36b86144e5bfef8c580e1d12e6116cb62de +677: d657facc720b596aa8b5965df5e38ef9106e0db6bfb6846e4d9a8ed8900bb8a2 +678: f501202de6e6a53bc96325600a0895f830ee20f4b03d81f98af56fcdf7605f96 +679: 558f0c67d147748bdc5472f4be0584dad452cff1ce1822f4f1ae2355020ff9aa +680: 09096d4a259c1c60bbcd25563301520fc5707106fedd30aa757f8790bab07d25 +681: 5ae02477e97e3f282a912fdcfedbedc45b6f48db463bf1a00e6208cf3a8bab6f +682: c2ae4a0b03e6bde0f10f82cb3b74fadd3952ebf9dcf8eabb3f24b2f4e3e2b0c6 +683: 14af46432e8204cb27f1f37d12605f72d483aaa58164e16a9a0318bc6da38abb +684: 9798e1db236fff527fea4b493d38c7f13200a80c20238dbaac17657d1c8331a9 +685: 6db3cb731b30463f68fd3129da52623d09a8c0913cbdf45c0ee680d062b7b014 +686: 7630c889c0ed3cbf196c307a6b13b5314c35f8e08efbfb85680aa8f56d8b4073 +687: 156cb56203ce9103881c2f173ef69dcd31e374dcfa00844d909246e863c9ebcf +688: a2bbcaabfe54517da51cbfc527f0e5768d6aecd5a6f71c4c70d90ae3054f5518 +689: ec7f5af5f68937aa3bb2e29f89a76c110bed1740ed5cddbb31a4bbd4d8658c3d +690: 7b1e011cc68d027165e019b9e8e070616cfc4009d56d366eaaa4cab247b423ea +691: 6cb2221d41e75df3b985d2647836a26d08f78be70b7d8028555b1b82dd17b175 +692: 7027e565c0e317fb988f6954622a47a6c03e5d6ee9b7f38dad7f8a01ba315887 +693: d329fbd15068a51d3daa23ffa59d8e0d5c2be54535eedd0a249443bf3111059f +694: 058e67814877f19a4d38f3578e63ecc63b450763cceb5f93d6baf6708c6165b4 +695: cab5ae80484fc8573e274316d10e2e6b71d64a5495b451817d59d37fc62cc118 +696: b02002fcae0d4643be5940d223d8d22029fdacd277d153f4833c10fdf502cd77 +697: b245a5c7d95ec8c1cf1cb22dc679847b982d55f3dad6add28ee01b67a6f41fb3 +698: 3f388119f98462ea94fb56e55862e083bd3f859a02e3ef23f25c949cb9b7f5cd +699: c381b56202caa27cfa4e42fec6d238310472bb8e871da0cb47082388de7783ef +700: 0193afd46bb14686ad253297bd7f1083ad6a6940557fceb89461a9aeb6c3d47c +701: dcad33f663c6716db58b5a94edd0b758dcae719b37cac7e6a58db609f9b9667b +702: 551004d18fb394492e86ff7b76c1ca7bf4c83dff5c1ab5535428f217a14cd602 +703: 77bd6a37b0aff970095be63545ca1cf02e28e282240d1ade1e5d080a7c92da12 +704: 902fe8b742e49a4e68af91a8b4c0c78978bdf77855f5af1a010538724194fed9 +705: a1c9180fc41e810a19223ac72f897824ac6d2f59c2ea38cef85917562145ed55 +706: 341d0a96981cbd4347eb91fcccd144f35a7b0967dea0d6c64031b8fcb46b610b +707: e1a629e9a39784a0c28e3dbb2abcbeb83b07680fb17d410d1b8954ed6ea290b5 +708: 0d781c220748957cc95d3153d4b247a2e9ee546278f06e4798bb2151797990c6 +709: 63912204722a1754af57ffa997b549db1ebdf5433c1be42e6af6f9ec482ddd90 +710: 0f61dc240b6fd221221b377f0345a2cff7f13da41d4bd1696c81cff5778f1bec +711: 91ea7c1927cdf2cbb1263650afb35ada8da7d34d98e2686c50962b30b1508ce4 +712: 6e7c14bef3922a5c8a11953512011f61f75509193caf284930a585fff49c870d +713: 99b34c9fd41ebebb6076b75ab3b22da39a9488e4538d6fc016e45727fae8572f +714: b4259f3d957f9561144098aa8b3541731155806ef06b403c2dd4ea4314e19fdc +715: 86e328d35205220f7befd72634d61c329f56a55ffecb247ee83832dd1fe36d63 +716: 6d3386b03689e959ee171e2cc6d3ecf9b250604f34da80387fe1c3b139b6c0ec +717: 039f3c02d3ba2e24ca8a6057272b987e2e55acb88bde7dbf92ad36c49bfc9344 +718: 715e95be267ba0eaecbd230f6942a1eda2d4d8ff36c8b72948a7f721ffeff3bb +719: b4ccb610ffe7c154f7f1d588f597294d2c68c2dd725ec98fe03e71cabc37cdd3 +720: 8bcf65644a63c50a37e09e3cbaa8d771ab92a0d71fef5dd94bb56a001035149a +721: 0993cae164b8e0ce36eb6d4bf7dc652106bb97101a8a7c45ee4dbe929c6052cb +722: f4ddfc20a477bb8fc717d7dc31d195aa4dc55d420af8999d5e40de5084c63834 +723: 4ddccb7c7b7628b354264d7dcfeeddafc1bf51241a20bd8b514852662ffa6e9b +724: e2de5267f2e4cb47946435c2ff943e5d66f7aa9d43497e192ed184cad165517b +725: 9d15b89c15b2db62cbab5119fa15ea4dfc49c1523b10916af61b194ab61488bd +726: 87ee80452ccbe78c55b2a7617c8aee128648f22c4456e42719675cbb7b506af3 +727: 4d5fcb9e907346e305ffc20fb57351f3ae2a43211c4af10dbb1e378b6220b9dd +728: 8129ada76295117f5073c4d5a613d08630d91dfaf2777b13ab99ac4509a1f6d6 +729: 5c5c1f33a4c0ae21c072d8790ea0fcef957db8f4033198c0cf5d0086d158611d +730: c4586915ee3ff4e0547d29a546f03d197d33d9f0bc1aabf2e4c0db19b87afe6a +731: 665fa3786202ed507fb2df7cca87dce2c0be5f4fd125dca54e9132d1c0028acd +732: ace821e7584a41471b2e555a1c96384532211f6709d6301eac0622124684bd48 +733: 08633271be3a0ff80987897d45b2592ba11d3c482acf58b4ca3fba1cd2964582 +734: 1cd99f1dcf7cf5263aa8513e11970c77638d936978836e255f7be3dd3bc749cb +735: ce55387875b7f7eed70163b6fe9a4a07f10595fef4d77d0a572e3ee4917b4d5c +736: 9c5e5dd2f19515e894c42dc959ede7f1a0e818cf6a4289c15f54d25ca60b8f12 +737: df6af50b0b22b3d9253a56ae486cd14622268faafa94a25d34a1d1deb23311de +738: 1c45ff7fa7e20297a74256d37f1c518e3d49c960a847c5a9fbf89e400ad1b289 +739: 13322991f05eaf681a68cbb4978dbf26a12c1230ec91654d9e46169bc06bf181 +740: 7913ce5febf072c698215215b7cb4b180a9256e0ed63d754357899b2468f3134 +741: 46e44f2aab1eb83a979dc3dbbec17208dc26fc377899c2f532b5674da794e784 +742: 6af8e641c124bd85b05ec7278aaf1a8b4db3ab804a7a6216f83c399c334f1152 +743: 9392bfec887e2f83109c3b02d2095ec5822917304eaca799e3c9d261d74018d3 +744: fce4ee633e07834f473aa58e0044394aa1105f82931a2ea5f50118f16e18009b +745: ef14133b9e9f2f00b15ba3c9019fbd27755bd60e25dbea93c271e55337de66c4 +746: 13f95c9e923fc103eda110ec9cdee367d01daa39934f4a98e2fa4c8d508a0690 +747: 2b5910bb1e516298aca88c502c033409abc506e4e40adf84c58f737aa02fff9a +748: 010ea00917ac8f13d0e9d1a699a0b4f970d7a92f5f0676bfaf4734ca6fff1f63 +749: ac22984ca1e9bdecf3a8c81c4f5d8476745c6d44cc4ca3dcaeba6275bea17497 +750: 018910488e6cddc4d3a796f5bb981f456a049b46b5e53fe4dd90e55b54796d4b +751: 2f06445407652ac9e9af69570fa28f06179da64b6f9005f2910da20d1747b568 +752: 17c32324ff9ca42bade9d2da7edfee2b5088dc677c5ea0883b515a327b3e675e +753: 640a7770cc32e92ed3e1412c79495a3128b4928659f1bf7d9ff20e53e3dce174 +754: 7f8faa738137234bff364c457cbdab3b9bb2178b5d59d7b67584765b887ddf47 +755: a1564dd109d9dbb882fd221404b402ca046d268f592ef0db21ceeca9490f1d51 +756: 36dac69112b7c69315b52652f5a013bc6b6d4382e0d9f9681a34691a7af5bd21 +757: 1b8753eb292930ead17fba8755a8c6fd2a2cebc0899bfa0feb2edb91f2783feb +758: ae37c74438422742903ef30ae9c0130e4c860a2f11498082848edf6b15996bcf +759: fdaecaea39e2ec984e8c984d85292303de1e2ec12e0b75ab990bfa7e65a48c88 +760: 78867052f7feaf352e97dda57e7792b883ececc33790e47e761aaaa7f847027c +761: 8c73f0f9603bda755f7fe787d4679a2c15a133d6beb2e2cfca4706e992080e6c +762: 8b3ee45fa3a6cf9edca4576c028c9d28ac281f5bc69df1732e2185704537828d +763: 5736c03e2e08901bdeb740fc2a11697366e4b071e6a611c3e1b0be171dfb0c7e +764: efc3d8a8cfa82ad2b91460268ea2181d7043d9ae429f31cc6bf9dad560e01b88 +765: e48a56496817eea0b94249f00d42eb31b1823c700cfd503223430e5377b0debe +766: 0c0a87e714cbaa1b63d56912232130ff3f96cc91e332e40a471a92fcecba5b81 +767: 9bced3b9012155f5281cd83991fd328e15bb791cd2f9101c515633b1069c21cf +768: 929fef1fb81ef39d6f0bee50792bb01bbba750ed95359dd17349603d5c6c9cdd +769: a0298e71a6bb25d843f0a486c84b8af2dd96273939e9878de824dab5c6d41454 +770: 779c19bab13abc41e9398029b1810f0deefde87aabfd55e909ed0931b72f06f0 +771: 88f1b56d0fdc5f50833214e9a7046a980a84726ec281254e75ffa8ee81b24597 +772: 3a7c8ca4b0715d42df6ed02bdca7a6c28831786c3d997485c6be4297152ed0ee +773: 88a0f337b761e71843f41381e9499cf74bf2978a65e5e4481f663c5fa5929e73 +774: 76d365352800adca62fe521af012b686c0b209535bcc4f8b45cc9e728ebc9575 +775: f008acb3ea6cb87a29aaca44df6822d583fbf70d89c20b91f1310ead0d336780 +776: e18850ada303a7610faae0f4419b8b074077d8b382b3519333d0919b56e11134 +777: 95d3f06b9a095e832e32ea5b045de87de1bb3f1dee7aeb90f1a62fe1d8844c85 +778: fa72e0399e52403464714d857bdcc5ae78525e81d31109539ad9548e177878ba +779: 091c9e6519ad79728660cd1411222b96cd9384926c652e3b4fdd99bbe1b29784 +780: 3cd3d2b232a67cc1ef02be591b4fa891d31b2b87127ba63469751afb6bc38bfe +781: 0111a5800571127692423a0b5e64d2de2d8fca7c8a4f893a3a3efbb9ef73d63f +782: d4182bf05526cd1052f743b4d3084f5497e6d752011ae3beb3c884785f0088dd +783: af9f702f77c413a95c767ed22a1a7af5e1951fa09fb921a0c56728a901f88384 +784: 548e7fbc9ee3abef91e8f5d86b9fa2acd18b4e2b5b5f0b06993b020dfde7af2a +785: 76de3a6f51f1ce104ccd0ccfe9cdf2eddf3236bd237ad61d70e16e728f1f8830 +786: c7505bcaf65afd6fd64fc58ba1d0e7888ef4b1bc3c36de89115938850a9ea89d +787: 9de032b9b6d296a31542bb23b5f6451ad14d3c3d27f2f2af88c35a11c9b25beb +788: 9b59e2d98895c363229b3a13175dde2307f5e45e4de48c7e01fe5dd7a66d516c +789: f2290cd7d56562b49a63fa0a6fa75eb43182193e91eafb6de4d5b3a42114f5ef +790: da15453aea57615a06a92759b6906a3b3bfc65a49483f1b97f953d917170c0f9 +791: 7a6cce29f707485231b40c4d0fd2dc3e162dae1ace62e1ddf7227ee77c14bef8 +792: ba476b2558e6fb94308a78b5549e6572d81d7e2b3ebbb42e2f68e595f300aa2b +793: 827e82561dd5149f139a98ae48464c2e61abd7036c3435a388ae437577b98ea8 +794: 42d6226752a305940a4db24e77869c19e6c153a0b7e4409b254baa0e1bb6aa84 +795: 686e8e9fc0e75c0006f3b36cad1f125713d2c2a07162751d79d7b2c0b8d5129d +796: 22c1978979b722f631d051ccf8b22ae0d74c74c4209a013a253f00945360416b +797: 5405d6b8c0a154856278c54d6a3836b372aa166b0deb3185603a1cad0a940341 +798: 400307d1d50fc6132fe113bb8311243c1da0e6b57c78f9e2d5f7554f4e6df07e +799: dec6deb237e7d009ff60996b96e4e92cb197494f0cf5edb5312e1f60575c015c +800: df9fea12bf11f4d9b595455da7c69921f5dc40a427333fa7748fd66eeb017de3 +801: 2042c501563e32a88f4e2d9ef7e66be27571635b6a831ce41b28bc6c6df0eb52 +802: fb700a0f4398225ef5db5dcd6710f7eff80808d3f815801e14a24a61ebc424ef +803: dca2d9f1ba6568ce572ef1ba1fcae08a372b2f485c884860815438c5e3c69b88 +804: 17b3f6f18906ca20ab7f6b011f1cb522aa046c343f5bc04803530cb8537f0927 +805: f888238774bccaef845fdbd2a338831c13090afc7c344b1365e24bf1ed121ac9 +806: ec81d951ac4274fd4eb452baf6c236ccfeb18138429463f8e90d1524da12121c +807: 5cfb0fc4907a831e4c602c82c3f07fe4463bb3456fd6fd24ec78bb483accfd63 +808: 947236880fa0c1bb05b086b2f7412becc344fc3ffdc6f4dd00bfff31639228e3 +809: 259d05d2057d408df0bbede5bf5582baa01339493684d924f17a46b4f5aa4e8d +810: 1ed6143a41a75f6a9f6d42e98a2f29c6cdc935a8a7ff43b8ac59bf20e933f194 +811: 57e739cb621863d956a720b719a76a4be678b0ea731a3b777802b53cf78d3d21 +812: 6db449cca2b58ac27074e003cedac028c77a592d31d5fec2ac90b63108dc2c45 +813: c9ac45e17f6fce5e3aa0a963c5ab2af463422912e5a97e97b969d30aa5e71bfd +814: ae670f4be0ca416bf822562d1c136985473d93fa6c005565219c387459c9d463 +815: 64aa2f792bf77fd23b6d4050076d73c9b2ef972e04de3c4e4b772a75145bfb28 +816: b2b8810ff96b189c18de81253260f1f57d283c3a6d5d9f8d8a3350b7d7b4cbdd +817: 5c7db30147bfd07e81e7230d8d5e559255556dc7889d19f5a1b834ef6de92639 +818: 00617b68f6496cf88cb4728f889534d3b4ff83bc8ef9e214064a4d0511916a7b +819: ebf3905209b6aa1fe732dcf39507258e0faeadaabda8ff2bcbd028c2ee071155 +820: 1ad7cc67a00035019d548ad7d8f01567f30c989f2c02088e9d18c864f7cb8054 +821: 5f12fe6bef45c836311ca3681c08f82796dffbf1e6893272acf26139333a7653 +822: 4c804c8ae2f4187ccc2af13aaca740d2f0ea8ef1593bb2f65640d4d9cdc19d42 +823: 52becac90562e114784b7542dcda300834a4cf3d2289e0203ea9b1751318e94b +824: f318c6a0b5af61b3cbaa5251d849636e68ab6c29bf361e81610d259e5f9a1c9b +825: 1210b493270eb4617cf3398c05281ab67bb2415cc7780d9290761250eab9ef5a +826: 166a3084fc7ddb404d39e4d487881d7e7488024e77c827c86d80698967ef0439 +827: f7e8df8d6c83b694e8e3067582eb9cc4d8aadabde048a3c54894bd40f94b121e +828: 4289388178c1473632da87084d13c09a92a19ee32d085d717ea5f7b15f8733d7 +829: c11fb521a4d1287b82e982531229d811e0cf75b049979c592d48835b3fdc5ab7 +830: 7b25b4347a6cd7f79fe6a2e123e2bcd3c5f7c64e5701474e116677c680c847eb +831: 3bd669ded341ad240b3cca32e2246044e788e92346759c677c25b588d336eb9c +832: 469e448de67d33b679213d1fd4383af4eb663312d2b039aae59a7ea55f47d48f +833: 1e19b3f199afe7bea42e85233dadc186dc7db1c34eb0222c40100443f1c372bf +834: 020b1df2133447fd8d2d1d8caca7a80ba666184c243eab0d52333f026d4c8488 +835: 03749f495dc4d4230fad2c606789b1993e5f2c0724c3e94c418a8e726553f9ab +836: e114a5bd110ede150c872c12df640eac7547f2c3b093b4f368ef1b17d5efa42f +837: a36b110e907ed59a4422c82d2107923fdaf8130b4bc216aec7a11ba803a31a1d +838: 01519d8b064806e5da350a1c102d07e94fe5334fe4d23759356703994763c4c1 +839: df4e0927f31ea17664543c2505bfd90f4df67c620d979243ce80e9ce6aff0db1 +840: 28697719928efd0d8502578d1ab317b772ec0e7fce2a64d1a174d7ff6dbbc943 +841: 5aea025c0ecdd11cc6849bd784eb8b591b2d6034dd4c9e11736f623cab205bc8 +842: 21b966650022484ba1bf969edcdb1ec5e71d2e9198721c99df860bfa3320b685 +843: a48629a370e3c8a8ea395c1381d6e7ee38165e29d70fe80074f1553c5ca12086 +844: 8f00714b53a5c63483c1a1ced92f0a7fbebea7e10b27e690b259c58a7e21b255 +845: 4a15be4e2173426025a7f7c2bcc0f9fe2fa070c5ad7d0185b2a7d4a2717b2d73 +846: f6da5b5d72df9883e373e6f7c647febff5929ad666307b3ff838f288fb20021e +847: d0c3a75990e3cd3effd916b8997f8ad39aecd2f40c7c59df5c6ed6ae2bd6ab73 +848: f08583778b92382380ac638e7f86c72549847cf3570ece9f28b02f71e0bc9b15 +849: 3d41f27a82ac10a8295a2cfb6f4422fba8ef5303094a845216e532d0998dd1e0 +850: 2cc2716e1e720a13304be73fe29a4db55a2ccbc95285783744077bef292b913b +851: b67ccae6fcf0d8cd364260c649c2135c606753784fcdab5411915795c6986dee +852: 31542a3723110e69b091960c13f0bb9bde2e7630c17ac9742ed5bd94df12f11e +853: 7b3f0517b1de93725cefe79227f54ed95166e363ed0b373da7274e0f56e6e433 +854: 5a2c88b0d041cb9037cc3bd64022978dcf2d1839b7b98789dca382521f4de7b7 +855: 99fc645dc0fa9183a7cd75ce5e133e3552cd890eeda2d79a6471383965757f5d +856: 8bcf278d8e51f0cdc959ef1f5ac79c411f5b5ff7c658d3cfe4d1312c9ddec0d1 +857: 5b1ce03ec386b8a4530e1c6e9d27c3ef54c0a8da3d2138ac2ff4d7bf89b14df0 +858: 6dd8aec81318cbc0bf2fb60653172af32ff62dd2ff8cb20bc0c1df82ed41edb5 +859: b2b6ab64ea6d8c8602bb063335ec0782c02174dbcc8ecec1d6160e030cac58d5 +860: 26271e73d07a7c45d017b5085c58c42914a74719c8d49979c678c5b4f8e76e28 +861: c6136d39d206890f5e8aa2aada84bec2cf50e405fbfae64b7b231ba880eef72a +862: ee8fd22fa072b9fe159209e4955772e67d225ad2a9d169c30f6e468b5d5b1c91 +863: c73ad82fcd868bf22f9b5e13691589d73b804a416269254b46c67e5db6bc2ba3 +864: bca23c98fc655392ba07e97b3a3cd5746c684f7131be2fc95a7d5b92d80ce755 +865: 5290cac580cd15da39312bc9f35de883590b4d42d481854e488d33794f47ac34 +866: 0af6a1b3b5a923b24b7f6be599c2475e2007165ef088230cabb9ba47f2467f5a +867: 5c3a4ba29214bf3532af5110ff7f1be43e1d828e181653064f08f0ba65556e16 +868: efe62d93c082b86ca8185dd01dcb848c247412aad460b3f98bd7394c333a4499 +869: f917605bc5eb01ec880886992db6dd8dcca845f013eac800d21082098d660f3c +870: d745dbb46f8e55d21378a0c6f070f851b05a5d0d77fabf7182cbe0b75ece39ae +871: 8a254ccb12d77511b4818302a7cf7a4010830554ff0396a105985fc4a7f0adf7 +872: 446af701e2c7dd921c6c157ea68c7ffb2881e489e06bffc555bf2241dba2893b +873: 2602237a6aa03fd4b36df0b938f1c49f610ed92bae6ed1b7b60ec172ff395e82 +874: f375e7a552540bf63d5e69c663e4b2de721435ff57d9f00476d9241c05913039 +875: 26edf4b92a2d80a8904da7d91ddd617fe97a4d741ee74e02f732dc350abced89 +876: edfdfc01d71eae7142c218f5be3867878232d25c0e503be8053851aa4c31b657 +877: 015a35e8fbc9e2355e220b6e07cc21049322031b2940121c71058a8d9c0ad791 +878: 1c241cbf578fc1b5875c13045d01cbb39564d1ac030c38b8a0add52c1c38c608 +879: 0399cc25a5426ae96f2f6cdf71abe0847082c2700076abd073d88862e4d32588 +880: 6dfacc9dcbf13ff79b66c487a678f81766bd2015da32fde451d904997ca5f8d1 +881: d684685ecca96d26094c9c0a391f606b7e874553b033ae90ef96fac18517bf01 +882: e6cfbf978ecc3fb19429203bd2c508a4bb1e1d419c313f554d20dcdbbca6d64d +883: b8df95ca983f4ef3ed0310b244f2f4318d6761564140cec095a16e023976354d +884: 3d09aad047499cb54bc9fdb4f634c09beff93422db01f7b8498d90493c32a21f +885: c4d2a3d1bb94a37768b512a87edcfa56c00cae560b74c48e46ebab9ec67955f0 +886: cd5728a9edb6066bcd9392114a0f18f4c70ccde8d9c24f3b459930c19e95e506 +887: 743b81138452ca16e51747a1662402ee0d9eac3550011931aec68a63727b6894 +888: ec0de7ecff31949c1922903825b76e67cf27c61d8fe100a5d0af52445aceb262 +889: ac98c3e8d99163b7c3f81f263468de61cd19cec791164a1a38ce0ab440aeb324 +890: b4bd0129e6cf5223eaacc456653fc43936d376d90abcc0f08604d0cb7eeb72c9 +891: d3ef730208652e44eb49ecebd0a0e0dd885e9ae13e608c2ea15690be6b0cfabe +892: 0cb39c3968bcb3d4df407cba298c3fdff967e494effcd9f4fb4dcf846d0ef7f3 +893: df067b52d70efe10ee799741354efc807f4cf323c6199ffa3006a89820196fec +894: 49c36112b26485e2c4184371937988ca9edfc53d0055ba438f7ac8f7466f4ae0 +895: 779075e7ba4d73acfeb8b00f20f03ecac57bfc4db7d907c33f65c10a65de890f +896: c9c078d711266ffe91f523384168b90f1bd00efc2da110778b9cba2f0871db49 +897: 4f2d2969f130c86498c3d4452a9769978990feaa3068bb338474e2063fb47364 +898: a84a2762530ef03398c4c7f4c456364848d91201bb0cb122ff5b18e9e39b0e23 +899: 8ec0cf65d1b765c086dde69a3ec04bc425342a4bdff439058440bb8958fae5f5 +900: d30cfe6d61b9fd4b017d6c9d7d9273e8418d0ae9b8fde5ae767ac80a6ea21901 +901: 3fcf48533859c643a0396c0b597dd9b3802d52c823b5fc9b76e6880fcfb840a8 +902: a5896436484d5efd5a74b8f467a15ad21993f411f27a262912940d4d85e2aaaa +903: 70dc9ceb90614f80df7c9c113b13307d71a4cabb766d09623d28383fa000f8de +904: 5acbfa317c6a381e91ac6c4e856cf341d8d017b6c4f378b2f283ae5fc683c9f7 +905: 2269a8c37a0489ce983f89e5610a5c992b010e9663ed854bc85826c5938ea65f +906: 9a759ebb80007327ca50b5d2d0c48a62ffbf75130b942f9ee05f33d69c997361 +907: cd625ce6c86f80cdae5d4256307200055674905dc4d97f93146ce60b4fe7f4d6 +908: d5735fffa3c594d447ae869b6f97df71a8437a7beca74b7c1b7ab7cbee131122 +909: c6997bcd287033749df80813acb98039278ddbf4a56896a3c4c852114b3d4a22 +910: 93cccb0ecb7988e965cc9efc6d7ac1ff834fbc10be6fda4867ad75c51744138f +911: fbf47e7817a7ce0c3bfded8ea030550b6d6f6de53e103878111f101e49f9445f +912: 5c89a1c644d89f7acebb9b1f9ce51a2ccee9ca212dd8adfa0d610baab3186167 +913: dc28c7d675adfe5a1a7c69400c3dbf5b38332050e4317a1cbdb275247262ca53 +914: c1cb82bc179b22b3a5d9f0355da80ac050236bc73248ec93b8dbbd053298aad2 +915: 5e6e7c848d5df0cf67b72e28e216483216fe84e5d4fe37317369c19603cf0bf3 +916: b19c2c5c2b1a45b6bce242c9aa9adff56affb1f88be4a2645cf76c42f46c7847 +917: be55f3c6e3b22eaa9c1865653a8c91ebb7f414f9a12cdbfb62938945dbc36ab9 +918: 1f32898862ab8d7bbd37d472f0c7eaae7fe2f084f8fd45f05dcb764ca5b600be +919: d07488ed1439a7213396a1ae28886ffa5c4d3cbc74c175cf375402f56988e15b +920: f0b8e66863472f11e758bc94d8a98ee308e5a05490e5db4fb66e1dc09f4e52a3 +921: 67d9acd2df48f467b4f7a84f760730a92c635e928df5621f6afdeed3e195d3d8 +922: 848e6416b52a2ff5c7d7a5e6eed3416c1deef9584f60a5f6c3a2854f0a501faf +923: 5f07bf7c71d71b0cfcb5fe04fb2f1f8a950673754dec4e816ca84f82e663a9e3 +924: 154aedec1b966263e4151b44a8c438bc5f81de0170229bcc20c20f80d85254df +925: 91707a58602431d402edc2258eb703be7603528faa3fc6fa0f6b1e6a4db7c234 +926: 8210b096d070cf4b23238373eaa334784226d472bd5a75abc4bcd512cdd51553 +927: bb818b548724ecbfc298a06c732ac64a20846953ed2eb98c452948c764b4e17e +928: b590d8e03bfe80fd84cd64c1ccf606e75ad702eafaf5353e72e38481f7c3d3b9 +929: 571308cd156b690c3b03a9f857c3b14d91124895a73a2fa041d3039c58468b36 +930: 5470e7f92b880ade0fbada76a0c06d5da0c38e5569c59c11689422144cf3e368 +931: 0584120c3727f510f276d173e1fafbcafeb3fed34bb6639d477db27a7e307d86 +932: ff177489756c5c08e42a9257170d31de9f5420056514c5a6c9ac00c5f9aa04fd +933: 826d14a8ec2b8611009cd1507b8df8c8796889cfe9555db9a8fcc930ef5ee609 +934: b11bb13741a897d8d52f29e0720f1245c25cdc78af34d1b66818506989f63df7 +935: f29205e421662f14d8d93573d326f3d7c98df9527f3a011853e309830b24053a +936: 4f8f5839a9c97e8e6b4661232ce36d14727b4ba88cc07e22e58f3d0792156737 +937: f33b892df0aa30fd76a13fd6250efa31568e0c119177ff5ef70ca1382a125990 +938: 3dd1d304670e333bb982b78ef90eef332b7ab56badd527efa371db1d72a0c030 +939: 456f703691bfa76e0267c4ca9000993ff4ac6daf118b852dd6c763354f1dc1a1 +940: 88f1827525c56fa450ec069a75af48a66c60dd82d6936b71bdddc33bd70882ef +941: be043aa1646c1429738dc5c134672819b6696e79be9c7a98de1afa0d907e09ab +942: c58f652f83e42206e0495bb43b7104849dcf0d4e4ea288ceaa8d221929048209 +943: c0a5542106b07172680af9cf134a8dd6c6aff11b334cbe5152a64d14f97ce5d3 +944: 90cf70305c87a86ae7cb3584858b09621896b6b902bd0f835afe776c0ab3575a +945: 623b58198f6f8b60a5291d1564715f6c177ed6a9795f6a22aac34769d4b781aa +946: 2eca286f8e943a0eb575a8aa472ce251c4a06e956031b9061871726319f33a9d +947: a187c87507d00d8e121bf22bd3a5381cff980a33db532fe1931aaac261bfbbcc +948: 2d1802473442182f0d2268ba7c9bcb6d2343db00d1bc7cceefb05789307387ff +949: fbcfc7d9fa122f09082876a7ba52b087553e5e434536ae272900531d9fd7c5a0 +950: 05fae880424e2b6896c06c0868b7516d04a20addee4ae06d7dfa3d2e8528c23d +951: 556a1aa2712f77d0e29e84189b1907c14ff74a242284eb8d8fd81ff4c9a24d33 +952: fd78fbe54ab202e7f63e87950e60969fe6c6ed0b5b5b9f1a6a64f8f6629263e3 +953: a72ac6b1f94bd82fc1db4d0df37b3c328282bf702a2e80bc6b443319c3127446 +954: f43267b1413f6687a0fc6919f4992920d1a74f3ea43fc087c815f6e6066d1887 +955: a8edc9db69f79246cbb57c2b2996c14ae36a4802074f650e93a1fcac77a259bd +956: a59f159a23a1505a09994c298e654afac0c8d6e2f3f783069a49d8f7f3a8aa5d +957: 665c8ccb1d3c8114ce342ca49cfcc967d166739db626413d42d55b8d2714bb31 +958: 5295ce9d52528268bba400d07d3f7bbfd85097c9f69aa1c58fb4c0201a974851 +959: ad837aaefaed57256edebe44e09dba02d6810244b6a765deab4da65906785f5a +960: aae3fb65120676a8756456c8e56846efc89acac7eb2500551446d8bf00e0a75e +961: 0ac1cf7e1bc2d02b05386342d8bdbf58a7c62976df7190f35653aa8daff30ccc +962: 05a4b48144bed7422054a947e7efa5a1c1517478b9ec633e449a8cc192dd2ae6 +963: d495cb49245a64f0c098e355584ab22e496f551c6db141450d4f2d5473abcc44 +964: 8873017ec15e2ab8207cb9e54426dd670a3beaab33db805aa01c1779cac20e72 +965: 0ee4c3502941396bacf4d957519d4ef4a4f692c582c6c2344fdfdbecde8275a1 +966: 2bbc9539dd2ecf542d36dad04808145ab85640a14ef9d5ac272485bd8f4144cc +967: aadb52646899d16bf8149a8838b15a8e4071d3d2499f38c1fd347931d7e99097 +968: 3a36bb3c62181f1906ced66e0aa9090041e1783c85b37008fd91429becfe1c27 +969: d0949593b37749c149f865d0c1feb635a51b6ab2f1534e4b9fb0e93d9650ba71 +970: f7ef0b7a549a0d3949bdf395deafe817e91cd8a1a7a7ab54c0b592933368b773 +971: 09266b160df5ada7a2956d2e3b12d4cd54339688fe13914cb4464c4ce54763c8 +972: 74d5f9b29bad60571c3b13b4374b5d9e2d2c2104e5b8b08a9a46697c4db26cd4 +973: 12523e5f97e8d85e409d8fce5a730c6f32cd05a69d607ef3f0b05c58b52265ab +974: 1a987e6dfb4a4343370a8fd5bfcf192d3374a4e5480108021180e03ef37fc6ed +975: aaaf1ce8d227164a535129c4d6352005520d4f2f5946ceb6ed8972453ad67fa9 +976: d25e2c85bca0ef83a141227ef2c9886d07e86d6b1c40e3f7cdd14f84d1e92fe7 +977: 37471a4ccaf0071fe0f3c31281b44b8197e8ef9e7301c6f53184f08ef63c5d43 +978: b0e16ba5daa317c063e157e75d42de05927a58054e3737542fc258a3cfe4070a +979: d4c184e0d658a3e24a7d25a7100ce03eee215547c335844f2d8cdb8a2b1a9e79 +980: be055df17f2d7082f4647dc4099f5c0585efcd6423a40551ee589255ad984991 +981: 09caa9af48d02c98ff7107153b1fc380af3fb9d3f00a8091cc8336d84f859ed0 +982: 67b2ca10f46e731cc00097205087b5c16d60a29ca1cbdd8f1a375d8b6fa60d78 +983: 0396ba72836444de8f0c354b8a938395b670eac515fb224a6b073bbf10bcff16 +984: f77dd049a4f6d078b810af3e0ecc9f76dcfdbea413dfcd709a1f86c915c392b3 +985: bb76a5acb950ca6fb0115097b948c3b7e928498cca4bc65e1ae7c45023642bf6 +986: 45f58d18384049501fe1cd351e3bc7f612a548ff7ca10be59a9795dc07787dfc +987: 70a5ab10d8b77ba8d578bc4884c50a62a31aa53a07f81688b3658f4eb9827ff8 +988: 12de07ccf3b01d9e39ab693a24b5563635ab0d20b0d25145ebe031b151b3cffd +989: 9d54cf86f8fa928f4b248978121f2a7608e1499a3f55edb16d00e4ce3073887e +990: 523110a7ecc629c613b459c83788c9e66897d5d2e92529c4dcb6d45003c5ea7b +991: 465c58b36171c47156ac95d570671a4f0a68237404b960b0517a94b279434ba4 +992: 6fb4c0905e1cdf34e70a2be73e3ab7e48a687efa5f8dce261bedff93011c639d +993: a316920e76d547f001de8e1e4f4efd0bb4801dd6f453e03f6f9035055ff67de2 +994: 95616eabea52bee828193c8de7e3f442164295a0511bdace71109df206cc51bd +995: f57edb955a21ee7a7c1df5ee6c6b307796ff6bbf702ac489077e847d9f589405 +996: 84f6a4e89e73f8ae45094c8566e93b60c51e02105e2ed07789e761adc269e6ab +997: 2102a6c04cf648d73c7bb78660a8b6654e97e557f6b4faff3361074f4b509824 +998: d7224aa3f93a0f23514e696c3ec982b780f9c4c50bf7b302734e4ac440ed0485 +999: dbd4d0cf3b068945805d85244cacec331f1ef1bce5e679d353e1b95d5559a07e +1000: 1a888206971be51a4535e1a15d4696b6ba4425fc1083911f274d748876549179 diff --git a/hash.4 b/hash.4 new file mode 100644 index 0000000..8c2cc70 --- /dev/null +++ b/hash.4 @@ -0,0 +1,2 @@ +0: 85dce2ad6ba50a0ec4162ad0598336517ad73f10e8ee16192f5fa0d6111415c0 +1: 967af4d7613e63ae6cd2f05df12e2c8d125f5128ec07521a6b313c24a15310dd diff --git a/hash.5 b/hash.5 new file mode 100644 index 0000000..1ee2db3 --- /dev/null +++ b/hash.5 @@ -0,0 +1,1001 @@ +0: 85dce2ad6ba50a0ec4162ad0598336517ad73f10e8ee16192f5fa0d6111415c0 +1: 967af4d7613e63ae6cd2f05df12e2c8d125f5128ec07521a6b313c24a15310dd +2: 7eea68f7007f367e09493c70edb150fdeddc16ec56123253516696900ed56fe4 +3: 4fe640d5106f16b6ee464b7c21da1e3c3e0223b407d0c6a3639230ef65f8e309 +4: 3632c69123a4a7cc5b4b45ddea2b1572ec877943d058dbaeee0d7fb02a64cf0f +5: b3f14807af541756e10a3cd81e812ee5d51505baf6421dfbf2810facee611c94 +6: 19fb1cbd59d7ac9b370488d9a55c1fdc79c1d8b8e4acb8607b5347b065ccd4d9 +7: 8a23d1395d1eaedf268b56ff978bca521a82c13a471adfeb85376220436f6be0 +8: 5abceb6e6598736cc1b81cb10d644d95707803988559a5d34e97b38c7ba6b61d +9: eb44cd7554093a31e15f13315c88303f9cbcc12c260c1104aaf2f7d322a4cd75 +10: d3296f612c32fc482c190825523af7c53561ab65e53a89a9360146ceef7592f2 +11: be3e464b70ac3060f456aabef84f770cb61c597c34b449588578544a3e319724 +12: f2481bdd304361d3366f8b47d030181ed574be70ffcaf2e46bbbcdd9fca86f88 +13: 9d8806d808ffa4fcb20dd8c6e83d76261579d4d55dbac5fb45c843704fc853d9 +14: d7154bae8ec7256fc5c6e69689642a2be5a4050223418a6fb42a069665c1e8ae +15: 9d508212c183bc60199bc8d452ee1410341269e486d8887e6b873309bc07ae1d +16: a998b3bf8609d89a750522039413c31b67e4d8ad5bde96f8676fb845257c77db +17: 267512254d3df3188031b77dae4378f1b2cefbc136777e7ff450d9249dd7631d +18: d484670f6ded2ba8f3e1a926b25fd9df59f6c57b5a7ef6ae528a82f6fc096f39 +19: 8a9694e39a0f7597a517c9ebc0d29aa47d38ba488289433caa578c31dbad4d87 +20: 8ec179071c95681b40b81cfcb878cf30388917844b8cc0a70106646a2509d54f +21: 5d6d37a33541f7c27460408529d4a2011906d4dfe215fba1ba654a8d0e57d522 +22: 2d493b9694a77fa55453ec259182ab55de0b504d9358047d5d8dae34df779fca +23: cf99972160728ec412d836ca2f9d0af86b74d6bbd46e9998f941d1ed2fe3032d +24: 6a44bd9e825c146850a76356ba47e62c71420a6f7b3108b62d58640290fc27f0 +25: 534294e4cedf8630d14b0ad75bc732f6e02aebae0c4d72de37592deeab493d36 +26: c99fb8948e39addf22fe084fd260e2c7dbacf6dd0ae5631ad9da1b8f2c887774 +27: c55f039a282306e34d74b1d3d4d79432caada63ce94a20e18ce1e3a1047b5c75 +28: 0e1d4f3dcc82aad407948b3bda370dbebb3453be9445ee746c31b6a6e29f834d +29: fe1e351a0405674718d2731949970188891e60a22454162607cc331bf0250925 +30: 49fe281b7e21d1f12cc071368359f07e9022d20d0ccad6da269d5c06e08985b1 +31: b22666b1f8fd1ecf1a73f15132f95492ca95556e2724d7c83d62c61229365534 +32: 42e4a64c2302db6677e55397e081b3b318db7372b648920f8a37780ab1cd3ce6 +33: b16a21a8dcad9d14d1c9f206d8da2f1bed1827b9c27570d8f762a42ea324abe5 +34: 841d5e62b2baf1bec33817a764e76447da91c3ec3bb76c71aa7b843fe742dc56 +35: 63e2031c2ba2de22f57c078f30ee466224aa9e645955c4d7c9f33cffa0b04c5b +36: 57b3d4a9b99c5b30bc07aba0a104dbf6323919c7829316af44de717606674d6a +37: 52cc02a6c375c8661d5ae7640c12d4a99d471a68a8adc24c4b7b775faab15519 +38: b74dd5dacb02d8991de0d890f28e9d9541728458897f185ea2ee461edbc862f1 +39: 00eb716f16f532d8cd216c2381045a03600cfdcddb5cff899327872d1e4c56ec +40: 62d17a5c7852291a20954e947712d9190124962c82c25de397e392d998096f4c +41: 3651989b89c2177d3dafa548696e28f4d158304424395c2f96b5268944f60c38 +42: 97c011124265b78962504cf4c57b701c47e12c5509d42b239496e39613e62e33 +43: b2650e0fe7cafd2f753baa4cb4b9130cbc42b1ee98beed229003ab5e6f6629db +44: b0890007bcf10bd94da7a0b43bd64da4205665e70b3bb9c1f6e7f72199a1f0eb +45: bc342e0606491fe6a11cf901b41e872c2bc532af5cb8bef2a93c80e87b29061f +46: 320f03dac702ecd4f942b33805944e1419f22325a956d61afe35dc224b252cce +47: 14fea152c29f1198c1f60f5e5937dd7c875a3491728043210c784feae9484426 +48: 646f5ca122eb0bf206c1481c170ab7a003b220e66c838dc8d67e71244337f7c6 +49: 9750f6ad64bba9df8824f67d75d37d0c0ee31ae765e7422f226ae9542492d82d +50: 2a41aae9491dc68e12bea51a9662ee0c0b6c485947189e075f2ebeaffeca6c41 +51: 77d710e29edcade288ed971d0de133c54f5846f3f663d22232d684c8d9125652 +52: eaae5db00afaee3de0c3e21655a2cd8368ff7e7dfc0fff64af87312a7eebb0fe +53: 5e9e1c024afe55d81b6ac8557f2867e5f7c378d6b58a757f65ffd81af1aa7925 +54: bcd1508137fb9456e0cd307e405d02ff17be39ec5a8dee6cd0a8219b88c72495 +55: 337bafca56c5dbf80d610b7477a65fcdbaac5b7060b16b5bb295d684c41355d8 +56: 1d3fbeb378a2287bdc5f4a20f1a4328905391f61654797d4710c9247d7e3376c +57: 59721454570ca2b55c09ca70ad99dea88ee5bab0444cc4c957a80b8602e764fb +58: e07829c5b27d55c8ddf75d14ad8d8d25c7dded815d58d67b89f0d682a9e3ac42 +59: 992b6df70082b7fd720529ac7eef352646e6c9f6642e0336080dd5239d6c111d +60: 75fd1ce46bccefcc1cc1680a192dc545c91fb4262f1ac2cd5aeebc9a906e6a84 +61: 4384d8d5cc81a5772d479fa636aae5e750e6006d73dbf06c662e5630cc9f2f73 +62: f2c6049bbd9242d9739f2a408169452a7c7f99e3d44b414ced10361ebbfb9861 +63: a5b666b5b0a2d63415b744a61d78cb7e2a57658e0f5587b75acc75268a7ecc9c +64: 0fd368e2923173329fff18564ecf4e4c3100f9d116bc2e34fc6c43e0f152f789 +65: 6a18f6aef35207192c09a7670854d76313e230450b11c1ae09dcac738ae29a75 +66: d6bca17093abc1619e048ee9c1687161f60db61f5fa45f32e5f413a2211a3ad1 +67: 2b3eed034067549495fb0906972c5d046f53d26fc4f0603ae0fbe216e164d5a3 +68: 287e82c3da770aca0a53f424c4b1392bb1de1178e05dc7a762af59ffb6cb3504 +69: 7dc33c0676c18be0c98f91b45055a39aa4bdb5774d1f3d2b364509117d5199f9 +70: 8ac0505260206de8c3e64a03800aebbe06e20decbb7e1ebb08605fe6e1cd7de5 +71: a5f80ddf555516ef4540fb4882faf398e8113b90dc0436da6ade4e2585c135da +72: ec628bba9ce4d21d7a4e94908bcb93e97b9356322349420f877562f8ab806c7a +73: 8a933684d3b07d9cd9e7a85fa06f2f8fad6585bf00e3749e81a55783a4c33ac4 +74: 61471ee903ac7f8383b5fe4f06d17b3d6776bb86338e6bb4d8d4661d22a0db94 +75: d21c9f3f385090e34b25b021a4f89881c4cab9025c6bd07ea496811d55cab4f5 +76: f35ab97584d028e267ede7aa6810439130e9af020f3fba217b5f5f05f0b3fab6 +77: 1eebd15a4b141e3c57282e69f9ab7c9a26e027e97cb969b30a81cf2aedbc6d5b +78: 0d3601637e980370f233a99fb26df1698db1fa8f6ba08b17fc5981da1a0a9c4b +79: ea5e9db8b0d525e61a8c2f4222f0e234b5d11956968d75fdad29ba729c31c30f +80: f82393ee4a0e993afbbe499096b86fa9e38e9365ce39bf637a66148e563a7562 +81: 877c9e5fe589356a397ad27d41aa6c266575a3fa7b1041f780c9fd71e38a59b9 +82: b594a19913145eb74196b03b790d1166a3ee5483c4056bffecce0851f0fa62c3 +83: f4bd80926351cc2adb02a3987be946398cf90b02a73c30a34142ee9cf4e6d6b7 +84: 6554661e3bab5d0cd67a4aa12f851624fb59a37f76d67dc261f91dcef4e99f56 +85: 9101f3a09b1e2f4164e324c3a9a6550966b19f8f15f35dfaa7e5d5880c97c434 +86: e3a8b17948e7d9a6073d7f7f3dd324fe558115b720a1adf4e5ee5277245cb183 +87: 7285be9c5b90c66c3cb2c7aa23b2614c9acdea964bc8695a1428fc714976f812 +88: 47104b5c6fb4ec17cf85c1a3e22fe6019085d220a85215109f31065023e05355 +89: 3e7bf9add688476395fb369d0b51854f13871e6ab911220f4a2c35bfc82fbbce +90: f5384db8e17f02eec498c8688e9ddcb9927d698f969d398ca3777daa53c63d1e +91: 52939a46ed816e22e051aa8cf603b49fe12db3e14fff5577ee5fa709bba0e246 +92: 5984cc844cee6f30e28a7a4569a303aad5fbc647eaef45532ee2a3a4f3e334a6 +93: 60795ea26fa1124808272d8fa41dd10b04dc832aa2a4b29ec2a67d0aee8326e4 +94: 096f2ebb8dd1a655df783e6366a9826e8d2cbb45a863a2150126048c4a3bb422 +95: c02e2508f4ecc02654973ab7bbc697356b244e2064711d32034f41ec6c8010f3 +96: 399bb57ef99b37f9bf110c800857479ff5a4a6d615c28f1ab2e6b135f241f63b +97: 538146e200b04cb7eee283bf11c622f487b164b45aa507997076c1a714bb7037 +98: 634f3e4040a82fdad1c2f9986856ea84a29c11b780832433c72f53c38a9989e8 +99: 857ac7b15eacd88adc2aee1935d2deb1613a4fe6a07ef321b31d6459205efb32 +100: b9c18f78c6c126d024475a4cee31c86823a9b78948913042795324847c2ec260 +101: 4c21bbdc6c098799cc054ef6e4363ac809913ff273528755ce091fe8cea5dcef +102: 3574bf8d1624d866c339e7b58b4e4aa2437ab5792ec3a18c2ee3d6bdc0ba07c0 +103: 3ad028b3670b7e0df2031fabd8816516e19e10bf06babc5eeca48d80800f060c +104: d356b9a32be6600604ffe9e5c80943300625d89cb3834dd8b2cb1518b681991e +105: a330970603e32bea86778320be1fb89c1553c3c0703236a20d9ffb03f39e451b +106: 7d55c46d31de40187a5d9a1b82626c44fdd05dc92b8fe8f932a1cefbf15803db +107: ddd8827353b8b2cdfadf52c65201808e31586795fa5086eb04fabc3be56cfbea +108: 7abdf987458b0916a6ca6585ff616e6b5d385c0cd31dbdc66c6c613d4ec6b444 +109: 7bcf2da4858bf72820343567b4e27363c0f9c4576fca736fc12446637b04056c +110: 5796ddefaab6e59164723c4bc81d4d4044c25e4a5ed3e6982c3068394be6e765 +111: 50ee47bf8ca763c2d71db5251497889abd6bddeef350d774c8561791a42b8d3d +112: 78772ed96cdc0df15f826f62d72e1f0a9bace9921ae6880b157afcf12d2c5c62 +113: 0b3d2afe5cd8da4d61dcf951afa561b368644812a367d72c14062a189ff48b2b +114: c3ee44bcc9467d6eaa38f23bd58cc345cb6027af6c35fe101e72cd7d8f20ca79 +115: d85baa9f673ffb8ee642a26cc2eed5b2f7cabddcc1e3a57da6d25a9ff21a7ba8 +116: 22f6b3d8c00d5f6ab92583848a14e1b7ef3b7c183a26ffdc4d8bff0ea45d40c5 +117: 725b763fc442a935187982ed76d0579dc8dcc03f6d5247b8163e7d4f2d4df8e3 +118: c68d4f34319edc9c6be7fa9c2be8ebf71a3fe18f04e4b0adae0441afb2b04a85 +119: bd380ee1173ca47965d6d1bc350a2890063bb80253beda787d04129d425c561a +120: ab3069c2af2f4fbde79b2bcbbb407a7e7ebba04b9d479a61f12d6d381fb616bc +121: b5bef1a995fa71e6c391e0ebcea3d5b004c09d20b859040045a3ce5bea9538bc +122: 7cdee81258a876cc3396fb581e98fdb336dd1950a201655b45d3e79320162627 +123: 2fcb8b25d17eaac4370ef0a188e6666bbf966176b647b174fa9eecf2abec55e2 +124: 2d5324eeca9047ba17815e13e9e46ceaeeeee6b617725e9c24095356292c7540 +125: db01b4b82ae2f9e2757f66ec878a45174f7c23406b046926cd2586a76ef0949e +126: 410742c1ae1d14142d796f4603531e78b30866fa979a4adad4a49e9fdd3364fe +127: 2912f9acbdb4627c37fb1f643f67bcfa73a9fceb2d848ca7093664256c3f7ceb +128: 640f47f565d46dfe065e24cc266855c8b883dac354f25483c628728f8bc23149 +129: 175bd5ab889991582d8554c8a576293bc14be7226791b5352eba5aa3d6434de7 +130: b7f915cf072ebc03361a60e75483d96383bb67bbef4fd6b7a091255d72ffdba5 +131: c547751a862d00e7c5cebf2886e1b7feaae7c3382e80a7d3a306bf66c035b049 +132: 1e38d4d5fca04af54b42e53a1f80025534b915fcb3929cf08447e31a97f8fb4d +133: b4c3f2baab14feca2c91ec75d115d231d078b5571c8d79bc966d5ac7154beccd +134: c4fec2cd994c7dfd7b8525c27bdd42aa6f4bb263006f2939d94cd20d6008a44d +135: 32e2c07f62db8ebcd805a518e471c021b5940689d62ec56cc031045ee9af9513 +136: 3972cf6ee94c3b4701f3fa7fa9f7be130abf7da6559b6cba5d4037ba61ba4b6e +137: 74ccea30243f54b1e99b1f98b1a565fc5bc12c0cb372c0bb347d66df0f5b6c5c +138: d487a1505e3a398fd212c1df23eb124d7f16baea31ec1a8097fd2548d66c9de8 +139: 2054c1791dd0a033f054831b3e1a04a3114cf3f30b757d55115d0982de043652 +140: a549f0ec73a288b97f256153171dcef571008e1e35a9cd8d711393be473db126 +141: 59df9467e37cb4a346b8e12193c6d88e9dd6aed0e78c42372976db0bd4a24310 +142: 068e7dde0bb916b33c20310b8274aef929f2af47fff613f9fa36be085be4b800 +143: a8f28880fb2887738be1ab65dd98670a6cb0ebd89ab1f1a95a63aee1428efe1e +144: 45b277871b78f4591cc67349da916f07a5c2fccab58b12ea7afe4ab5c96d7fcd +145: 15c6252b88e4cfcc42dfc10638d01c080d8ac7759ca2c6e605ead3488b415e9c +146: 2205890b5e8deffb8a7c8270487a08bdae83ba0a823a3d7e98f7593bd80aec75 +147: 796161b2b7c7668c313ed3a4c96c749787d433288650a30a5e20268c5348f0d0 +148: 6d27d2926b2cc062a5eb332a1dd9084dff917d6014eec2b297e89e2ac0b0fb73 +149: 379c422916ddc464d9038edbed5007932a809547c63611a83b4651741f370ab8 +150: d3c26dd08a7a5587b4e5abd4fa55ff01127bbb715182f535a415555009862355 +151: 4366a1b92bbe908968acb1dd2a4e1461bed095fa6bfee3edbad953c5e9bfb1b7 +152: 62e6790aa528480602f628546cc04f828702b5423a6f6d6e7553ae8e8c34274d +153: 2a34e923990ca42a6534f14c02944e9f13d04fc926d3225c372818df47069c66 +154: 7163bf10bb131a014ab065e5170384af8c80cb09a49874d4d459127f09959997 +155: 039dc2b701808a89fbde295e55dff4abd976a508a817cea65b98caf0375ee8ad +156: c2341af85a957814610ede9b39d110910273f0627749a41e82c8249e841dd684 +157: df5638c7eabc9c0fede2341be6b46f003610768b90d15dc235df662cb3ed01eb +158: 31f31fa4ea63eaff1c1b31982a8874408681970fe211c5a68846cf10043a9347 +159: da2bc98b35182b12fdbf81352666848f1562a0b235293012c28489cb04616b46 +160: 21e6e3278390ec9dd492369dc2d5e04da3b393f630bc9a1e47d8ae1173f046d8 +161: 0b0d1d9a3cdd175998bb4e83436c81c1da079e6347c81a8a5d940fe910c145a6 +162: b557f92e62e8316633fd61fbdd8d726e7fb3c8e413eb5411ebd9263973f1ecc3 +163: 022cd2cf5a5a16f28e2d8a65130f70ce12232efff8ec21b97e935b16d7726a2c +164: 48b2a67cccf18b25a005073f244404099e3803c839b929054c839beea3420cc5 +165: 1078303bed2aead2ec811cfa4fa41c3bd4536290e0d690d3d0378124387bcdce +166: 8c6218f83e12015def099c649216ee489bfcf6a86e8c13e2d2eabfb083d44478 +167: 16399aaf5de31a47300043fcbaeb8ea5abe4b9206bf28f648cb41843670be2c1 +168: f64128bd0c936e4f59d172e61dc99dfd85907d14d3e59f0f0554defb246ceb45 +169: 91ea1c7acefe0f3f9d0ff988fce594a3aa9fe943dc38351f282003056eb3d177 +170: 9d3ed59fdc903ec87c8e4d2b1a7fbcd338298bb5aa6f321e401fd388cc5d3a17 +171: 93896f5a03b4aa3eb26cc34bae3124e42e5f661f8811b92ffc0a66964e4a08a1 +172: 5220ff28bdaa8286f94646feff8b615c38f80fbca37857fc3e81a3d6ef561e52 +173: f3434ecda75e0216226e1e5bf9143ac62852691ca5ccaf8954420f73ff0e3b05 +174: cc2a0b6ae2447b3733762f34657287f4843362c232c99310162fbb6ff0d50123 +175: ceb7be0ae2fc7f06e0ea102aebf343cb37c65deee88e2b3a538dc747979f8ae8 +176: 081f689b66146e7a256b1f645227cb3c9ebfbd04ad7cc52cedf1acbc21d43dfe +177: 116944f76f92bd752c7dede3ae8aaaa3e78c9f4c168ce1e4f8bed4051fb93b0b +178: decd90f07fbe6b0720886d0afb4cbf31e251882d6f7bec8c3482f8ef0cc8eaf7 +179: 8796057000a4cc5092554b1ca6826876f433a260b5369814ef293ba3562f4ce7 +180: 88b6522669a0e6b78af9974bc208499602e4ade0943e8d65c0eaafd854481f48 +181: 8e7428c3c728b8fbace45c64df9b4957592348c81433bcf6b81d3c2e7ae72c90 +182: 9372a0f5b68defaa0676b78320c16502801ddc3255b523e0801505ff5e7f16e0 +183: 6e86012d3547c33aadd438d6efe4ef06822f2a964ba16456054c7d7f1552fa26 +184: f740b3f95a86764d5a8031847becdcd2d259180e3de84bf074f993effde9971e +185: 59bdebc53a196c3018fc6fd4d6e9b6774ffbea7800700c8670df1276aa860bc4 +186: ed215e876c7709f3f456041863072e245600beaa6911aee29d8622de44ed33b1 +187: 4505f43b3569d2013cc3fc17ac31a329c4109611bc90fc610b7a47df00057375 +188: 6ff109260f1b3aa2d7dd09a8041dc194932dea241cb5e31e63612dad5aaddae5 +189: 48682afe897dc03b3d1ca634a183bc85dd51fdf049c8968a6d65c071c6afc514 +190: d3390ec0bdda39a01052620d7b6ae10d3275bf2eeb728b29b8f9a200c2899bc0 +191: 5b861e4da914e584b381f6d37f2c8458cb7a9fdc096220116bd184595d09afee +192: 18e51ddff9f391a89771af8fc5af6a269425fdc0885c1ab23c7b1498647ba951 +193: e379048af309c10fd9a95c37671f1965602a19d72b37765b6880f78e5575d00e +194: 2a03863aa3f1818018a31a289a1f74b43cd3486a6186332ea9d187cf4d778b8a +195: b06b627d0b9988f6246a2c74aa07f2f064a975a9ea72189cf70ef7738a550fc7 +196: 24b49031bb78a51beefec8aa02ee0c3f20a0bc8e23906ecb05a2e713675a283e +197: c91b153c4d07090707d66874074179278c760b59e0bbc488488112abfbe0a00f +198: 880aaeb0896c44b2e857cacb4e86c4430087f1524c25672ab3ffc3ed74f223ce +199: 8f79f1a6cbbf335cf629c9d0f9cd2e1a2e8f75dd911d7cda3d8ac7a0e9b44c03 +200: 22fe080dfbe76d382bcb438d9bb45671084d45f94c330436391e7d820d196598 +201: 836bbd51ce9e65eb7051f2e5e3c60816fdc6076b141df672ef8dd65acada203a +202: e454eb81a9fcd1e29b2313ba44020ef5ef60c2e3fd3b0566c74b87092afde086 +203: 6535ff734a6fdc4d577ea4218c657b65cd1be4ae2374d8564b01327b86da71b2 +204: 2265e8de4d67982ae7101f5dae68ca9f9657d2db3778702d909b79c6a86a5795 +205: 85fe8633bb3ccde13c7b479776aa1c41db83c4b764fce90ed14df15467a4666b +206: cad903e7b72d170c09fb62d3907f9b561af4ec18ddb28743ecd4cb733093de3a +207: 491a3cdbe7c160b955e34a93094302f1c01662e1ec30816e4516bf4e1c61b76c +208: 7ed8eb5cb2d7ee6f9e2488dd8fa835f6f22109f42215b901d5e4c4359ad30ee2 +209: 1cb36c31e915894a6a2533ccfd3859046a1dcf78d8452bc88958dde0ca191e82 +210: 7996ba8fbd81c2eb0becdbad564153c598abfa2b0f69bc3ce6566a78931d0b3b +211: 81289aa5f1dd141efdcdfc5337decd1399a8aeedfdeddeae6276288106bb76df +212: e4b3053295d363cdbb2572e7c374ae879efc9421701310a34db983a4249c74cd +213: 6122b9e38c62b79f5ae2511de6795fb0fc853a0aca3fcef4a182ed52439037e3 +214: 74982ecd365733ffd752f772b3c8859b030f09b7667627bb6dfddaec59c30963 +215: 65ac368432a97208d4b02bb2481e674f31d90f4f18efc9375b92282432cd4398 +216: 0ae0472333635ff53374228f90d5cabaacbc0af29938fb8693b1d6303af5d819 +217: 47335e444a2f868bab1dd2bcbf7d696403e156139545a479710a6e559439a8c3 +218: 836aa3b53750ab893a8d2505787917fc35dca9cdd8e144474f86e2fc62aa2ac2 +219: 902ad618c9cace3b20b7608eced2ed3dfd0fd2dd26d1ea37e87134f114053aaa +220: eeee27753ed8a81edfd6a9f9cf22ea18536e6b7afe16cbfb795c84611f729b7f +221: 78689d14bf6f41cf48c193559ca84a3d9159e4d8b876d8ef4400ff13adc7e546 +222: e95c0cef65e3ec3fd4d13511442b43639025b54441d0f6eff2f3f0fd16112e49 +223: bdb7210e537118706f44ce3faed211cbf168d84bb0e987d4a283c854514a896c +224: 8c5f6f2b232c4ca41560d9a9cf2133b9e9cb18f5879fd4b33ef3eb63e599ce05 +225: 0362c89e151b3c9fee8518298cbffdd7248e55598f2aadca11349c6052634142 +226: f890d22cde86aa1c84b2b176f20fbb12dad5a01a5440b7ea9b95ccfdf3e1c3e5 +227: 07bb7b47c9b210d815f1069a0a41d3a84521e657b7acb287b1cd5cbb49f67ff1 +228: b1a066f1a5123b37a21fcc3f76776d39d9b1900ab322627c624ca36c41ec8c80 +229: ba78c1228e9c14a53840b0abf4c2453000a9f7987a214c25303404f73c631f05 +230: 5cf5cac55ed208adb8093b361dd8b9f5f02fb8a53cef52826924782e1f6a11b1 +231: 96c1b670f199bafe07ddfd47f1621f83358029a70de499e06bbdf703df203266 +232: 1edeb64a7da98efbeb47db24d63ef44715ce037f115cbae5f9352d95250ff191 +233: c35d4468f41c85e5cfc438f1710c8ac81a14208d98f7aab81d9a2af52b557d3e +234: 15bdd6d35bf282cabde4e76053970b0dab3be54b0d82d307a286e465c8cf5977 +235: a1f30cbdae18417c306ced42980242e75e26a46dca692c2a5c66fee091eee6ea +236: 7dfdaa74283d590bed1a93aa83690b94af6da5ab325048562328b12121a1fec3 +237: 505531a199bdac286d600f684a6db9eabe1ebb8484b87d9eaa645697793161e2 +238: dc9b0fa83e94aa6a077b27566bc819d3f6c4cd9de816528ba0a8307ba5a9ce89 +239: 0469c2d7c5238717833258ddca0e7b5e2935f88fc18302530c7d5f4d12b4e6c2 +240: 5444891f96afd31dfb90875ef6361330cc9066732820393af2bc8e7685d73219 +241: 96c7a7d1a89c2a7ff489b4da3dad6040d70678d943e493124ac85611da941ef3 +242: 83ed5df952c9a10321737683dae3f07a674130eb1e63808ff36657786ae90bc6 +243: 8306098da643d0d713485eb46ed5b2e195f5922059dfc4235c56598e63258915 +244: da3dce162705f1440002406c5789b185723547355b9f68e2b79752c69120cbc5 +245: 586b2770deedf675f605e7a0ea1749f4ccee4bd503e979bed27300665376e135 +246: 21e45166c93f32ddb9455bb5bf741b35dd091471e6be0fdb0a3e3989e8e03308 +247: 929f96737caef074135a18be5507aec562cceabf0f782f68819c600c171c6652 +248: 07673d367d2861655fab34786cfb189d1264040aab58f8ea997ae13b6c303e20 +249: b0d774540ae1680d4d5c47002145f86d64aa85739bc61f0fddd24341fc870736 +250: 90be88abc45f798dd28659b543f1740317abc8f5a7edd9cbaa6aeec8168b4eb1 +251: ccccc2ec1d5992b360136f83cda2adc2e4e921407589c633974316084a0a24d2 +252: 7d863f9d4cf437e5f01661a0427f5d84c857a14f0c45117bfd430e1ce1e83d37 +253: 0f1100223e9634fb289da37860841f227e30fc4445e05a89580af9e37df54006 +254: 989bc5068cad5a93f2cef1e4acc0031c3892e0a8336f57b967ed493ade127819 +255: d117be5bf4886475737e229feb3a212067df3b4d20476412148de596327e8629 +256: 7918e370264ffe9a954fe349ffd1b857dc73948de93ecba459dbf57231df395b +257: 9aecf8190d9f3c8aa026de18a609c14017a5cbedea830aa587bfa75741785c87 +258: 4675441cd704567d561a9a244649afad8c0218870d8422b280dca07765478f4b +259: 807d3e8c51d7ea6d1f9178769f2ba3e6ad3eab801a22a341eba696ef656812cf +260: c9327ebdee70d30bc6da82ce176be856e13661ad045195c7ea3cbce1a50eeb6d +261: d2892873d407dcc7ca8d153705b537e9babb6e8ee48d43db752be3d4d5bff8b7 +262: 4042e408eac4bd2d4780366df17273c674ad0975053af97525a585783926eec7 +263: 7ab2537e4623221c87469fac039dab9f948005a1309fe4cace36a165ef8489ac +264: f9be4b7e3dd88242e994c06ba87bf086bd012bc05739c130708678ac148ee2a6 +265: 67f78d0c6e565b0a3b266c7024973632256c7bb1a50f26e615700ac117f12e14 +266: 65860d112fbee85873f4491a062057a044b27b075054207d04b3e1c8e0ecd295 +267: d17dc8cbb6a4121053bc4595c8d472ebc25ec03e6a7a3cea9693f7a08857c19d +268: 8f5526c34c0560b272a783e8f84d8c6068361fc1fd98737f916539c4e5a786ca +269: 622442a15cfd2bb1d19a5bd917eade938c67576a2fd710f355423c7e362379d8 +270: 01aacbb60422586205c3b537bd8e6e3c3647a6a6959d8c572343dcd4c2a3fd03 +271: bfb97cfb6d5ea07d2d2bf8075791ec76e038ecae19738583ed75ed3af92b9dd8 +272: c3bbcf68c733161cacb2185e06bcc08e739e0156bf172b465cad0b286d651863 +273: 9860e97874180ce05482189ea83b9bd46df9c1ff84c063c04b55e5007d71e308 +274: 60f51f62146cda4f15c5f549330bcaf0df4a420aab37ead2e94115b28464ec68 +275: f820c827e5685de1586f0c4366d68434efeada7cc8e4816113f1ab7f854030a8 +276: 439ee42e996b28301a17903413e27bffc561c20127696a1fbd7a9ec1091d15d2 +277: bff9711495f8648195b9d685d74737505158c58dbbedba3af298a12ccabdf72b +278: 8b440ac27c9230c25b1091416c331ef3e7c63fafb4d3fbc5e7e67c9a96eee7c5 +279: 153d0606d52d37fcf1d765026d5db583b0d8ee70cfff0b31fcff893e22197d35 +280: 8f271450f8d016349330115729edd00dac6d4b4ac1b4ae5a34ed03c3895fc6ec +281: 5fd19597f8f2f54a105ce419652b6f31ff5f81b6e9c9fe11adc74d37cbdafffa +282: 83ec2c8abf39cb4ebc7aa584ddab071e0bf709f5dcccfc4032649ee8e934e9bd +283: 87223192712bbde69b66186f916aaa5e034133be0852e736ada9a4f2b6d15371 +284: 51881c2227b7940a388f28f75754a5a606f549abd05799a139913a0e4a7b24f8 +285: 449501d5e3a11f803d3db8047544ba233d33b88d0e338b1cd8a21d274068f399 +286: 86028c7871285d1f8039aefe02e4f8f5cf8611cffcae71633b41cf24ce1eae2d +287: e4a43cc54820d908d2f413ad9a43b8c5a4e635c96bf3080d5a1d2add8a3d6eef +288: 4044246981889dde292330066d8f563a73090f61522316aca1db1fff59c76b19 +289: 7b8fcbec4e16cc0b53159f002d00a4e7fd67c8a1e04792e26e97c2e8ab52d1a2 +290: 164a4ab46b7901283c57d89eba86b54b1398005eb3b9681617934cfa48c0a7cf +291: c234774ec19d702c50ff52ab2a5681aabbd194bb8a16375dc0baceeb4549886e +292: 5dcb231c4448ea274426f1d3b34a4b5b2639d88eff8312bc08c94ee50ef5128d +293: 2b79eb4bc6a5c548bfda75d29f6e987942bc7abe6eb4515edd838913a2edf245 +294: 8c6febc7c3da2fa7155bb9c066677f018c9e6b580b9b14d576d38bb533f66cf4 +295: ebc472cf68e67db6be510b6d4732672c43c74604964eb5b4433b9c779dc7be5a +296: 61e0af62939c09edd3e12e53dd5b304b4b8d787f57adb6027154f81c748bc1bb +297: cde92fb85c4aead4cc97f094f99f52379f5913a4857880f26a337851195c0541 +298: 48d22f360d786faed02cab1f293efa2372d1a81d22e2920f884bc379e87faba7 +299: 12041431911a6e89eae0e2210f2b68efcf666e6da9fc63c33a4efa73a513f45e +300: 0e859b529c474484c1daad4892757411be6c133915c71e11de6675303e8a4c5b +301: 4ea0f68329d2132134987b0a52d2a5f72b799a7888f8e51b538a3390adb18585 +302: 2228eab0ad664fa03107f7867ff9fac8d5314e296bc47cb429b6d59c08f8e38a +303: 9bb3fb3df5a2af73ab0f0957db8633b22ae1b257ccdbf6c01b644345228f71ab +304: 28060f06073a5b7044d979ac6ed092750933fa2a65834d8938ea1ef9b9b30621 +305: 7913cb25af88438f3a4be0a6ac9c136859efb982b51c43cc41f8f3e9880dbc46 +306: 0b58a75e74f595094152e3bee513f4b47f465e974428ec9cccdd71bf0137dcf4 +307: cf774b4ff8cf9a2b2df5478356699550be7a89d26ca7cd988bfd7efa53fd5437 +308: cd7b2510510b1e68c93af020629b2dfd5a4d0b258ec70dd601271cb9c04ff6e5 +309: ca1027e7ba838b52595f0a83fbb8d05e9417241f7a3c8c90799579183a2357a2 +310: 9916cc864cec1e57b549623007220d92320c51cc945bf1cc506deae386193dfd +311: 4f7f9bf00b3975efbc9ed9150c8b38971951bc420c38dcff173357d8594db52d +312: 584a91d99da2b8b99c12c615961f1a8ff5b758ea8780816e1a1767d55b1c197c +313: 2adc133ffcc65a546c198b3bf088be0bf68341f8c5b45edf0a79428cfef5de25 +314: f9488b9fe9b0ee2acaf54bd385dcba101fbbcc801b71d0c3a1d1c820f11acd65 +315: eae10e528082af6bd71edf955c6fc7873b41406f727fac18872ea586dd828302 +316: 8f6ce27e9e18ad70e112aa5daf18bf564284fe985833dd34eaecc6b5e064a771 +317: 6904feec855e513b2f2816ac5818335be61832d92fc5e020dda40bed646df7ff +318: ce212d5906da3e2701313d4111da2f23b0091347aa6107fb0e3fa8f05c8c6b7e +319: ae2aa88187825ee3364586f6b7b8394f1a7167710791447e381285707caa2949 +320: 2ee5e39f89d0420f9781a0fb572557595505b16c4110580f9e2510cdc37a6375 +321: 71b7110857241e261289757765c5505296a4c99d1a5ce1fcb1675f1828bc58c7 +322: 612fa9024db98b84df2aca6419b00879701d649698a5ea3fcdf0c13bc58bb6a7 +323: f00b094cc91f60ba7e0a47c5fd5d3a65edaf8ca278aa4e55a1a859b8e4e610dd +324: ac13597737535d11f1cb7c259f2f4c85eec3e910d71be3359e758ec25896d893 +325: 3b1bd1bcf7b79d5a722e1c731a63d3a98d5efdb5f6ea26207d66780f79645cd2 +326: dc147e3da606176129f7195959841eac83db95e994c60f3dced9bafd67130d33 +327: 8fe245581f1813f11c750b3a5b02c8a6cdf1b59c5535e035551e5d590d3d03a2 +328: a870586448d52da28c66c78096681dac2deec0f07b6ac5f6790d497b7606e0f1 +329: 3718898cc208739481343d4a15bdbabc785c59ebec52837a63904b5f313f0304 +330: c559c358dc83ceb40564b40818a0339c1bfaedc1eb3dbb1fbe9f6d33a5e35581 +331: cca494691816aad621a47fc105b8fde3341105a29c3b706e9455cdbbaea2204a +332: d4cb6e4742eda4523a5d178948f05468d1cea1e1fa2b7e0d99d2dddd1e4fa8b6 +333: 58713a47ee7d464233aa4a925bf8ef6e55b305f2b0819d8745afcaf61e118e71 +334: b48c863bb5cabed5aeb69051a8a52479f5a37c6a43a643bdb37ef006b4db54de +335: 89cb6029342df50b71f16f88d8a495fd53b30889c94b4d7af1eaf8b4a8c1d9e6 +336: 3da1b949bef0364d6fcebfdb11e6d2efca2dc012010268b4c02e4b489a75d59e +337: ef14cd74caf8f47b6eda03885d20849d734897cf89455d83305aae6f1f457893 +338: e46345992433ad8f196a241b184f02a2d2564533cd39e844aa47d9a87f65f8fe +339: 77010eddd786912ed75c3a3b1c885944daf061d58ef653e94eb549143d4d2766 +340: fdb79ff371ba418823ea7443652d37286f2000df06c3880f1cb322f74ff437fe +341: 53f36cca4baee943d61e97bc9a5412670ff7408af16960c5487a93d1568c9e66 +342: 9bbd9eb1d00da5c0b96926357cc38f6f649f4daef2d0d79452365ed7a5679baf +343: 6fb2e192d031cd5070fb63f5e6a23610a008d592e0be5083ac2dc2ee264701d4 +344: f369c877964f6bf3675c2302e0e7273a600e5e2b1d8dd9eb0bc9ae1ebbcfba02 +345: 5fb4511bfd5a89a4c026b227d3edc5a1e0553ceaf56b0559c334253270ab0cff +346: 2105b64db2ed533bc0529de6d4eb90500d26e1b4fc0393a24292c49ef45eae40 +347: f110830985de233ea7ceb040e340d63d933a74237a6da1b6e662b6fbe1629d7e +348: c7a09648ab90c57f8334972cc8b4a13f8f65fc8cb9d7f27450689a8daba72b3b +349: 98b4e3352af24ad6d1ba2e7a1eeae59f701e84c2504f48190c11377f75c6ac85 +350: 395301bd43b6315b7cd19335d054fc18648c41c24e4fe54a87c4629830f1e6b5 +351: b496a8803825e94563c1762af845668689af8264d265fe96628cf5ae90774ef4 +352: bc4ecb58601d15e4e96551409d1ae3479a4b62488c2d961ac29a0f16b18f02ff +353: 93c5010dfef6a15683ec0aa217dc00466bf65125374490fba0c05e2d81c0a22a +354: ed4a34ae546505e877a978f68ad58c78b08ce2e084e1646fe7fa25a264927cc6 +355: 6578751c4580b094eb245261b9e4709d001f228d384ed46c5b9a98b9fcbea42e +356: bb36bef38c0667095696efe5779f0ed5855aa5c80130f3d834cccb3b5ee2fcdc +357: ee401de8e74d5327eff5dc94022aadf9b18f203d1a08d1587fbbda1682d41444 +358: 4ca535c0625c02ffdfbc178b70a5d934c1a66b0c8782195184a02b860f119029 +359: a45b2b54514720695a603bb0fbff2bfc04780c97308212244f57ba7e45e3aa56 +360: 56872cd98fa9000f92148d6ec19c31e59e71766e342031a6972be4a453b2d47b +361: 273937ef97b43b3017f0f38746bf4a2e6f53abe57b8b8494e74976026d42a241 +362: 637a19b146aef1d1084f07f0f9832dee7b9ee4e27d803bbd709467aa2ce303f9 +363: 7340af34abc3a6a30a14d0ac2648bead4cf4dcab4f252874f95b5dc121320998 +364: 11e11820eb3b42a6a97b7eacaddb3fc01d7731a22de37f6f379b2e3c91a3835e +365: 9c9783c63124a6913f338194a0605952ccea0543bb5573bae70f440dbcc80928 +366: bd2e7f67123d49ec4d8e529fc3714f4b7a0b1fb1a8bbcd6026f53b9a087ef946 +367: 89888854c22789bb35942321ea458dae0dcce3aa10db62df538cc8d3f5998206 +368: faaec2e73a456fe3150d2be01dd10bb99437e801b4f4984ddf4d26d33caed5df +369: be3626c4c9ab11b5e038c036874d5d99375491124bdbeb3c4027b29e4af1c5dc +370: 022ac8a6d2f09db3edd2dc5b92bfb8cbe893f83c2a48b16179868b891021ee58 +371: 0ae40bd4ee211d6f9f9322e7811d80aab3bd81c17191ba32454b3c9092854cc4 +372: a3b9af71edf59a632d02f4819f4b73fd32301d36f3ac7934659338a70424c0b4 +373: a2088bc52680e9a605a2919112a655058039dca5db6d3a4ad28f0308f82a7b1f +374: 9b69873872d2a1d90c3cf402b43ace8b5a7a37b02983a208167e865f51feaea8 +375: b022041c3132842a4bb6f1efb8e75fd2c48abc0352a40538fde82572bd8b4c6e +376: 79b15cbf5b8e0dfc79de050e4b307b1dd7d0a4cc6949118b1e7297c326bf4505 +377: 03332d4b5ac755b4918c7f9073f877cc1b9af8e97d800dc45abb4a99311f7bdb +378: 4bdf53be72410131df3d1294b5c3ed9ef166900ffc56474452cab8a16a42f65f +379: ca9801e8fe29a1743c4fe59ee889c266ce276e339956341d94c40ed64e2cde7c +380: 51e0280d03118a04c067353eefba23faed845e2f8aa77c114e8f7ce9cdd76ce8 +381: 92cd4b7886ea31b185290bfdf704bae8154b2035961511e98fdba5d107a270f6 +382: bec0c70454a64f9d37e0b6ab2799577b7f98557a1b64871235a3bfd39d89556f +383: 00162012a6c2f2b07d88e02d9096fbce28672e1a49ba27c9b743c0cf3be84445 +384: 7348acf111fe5513ab119295407bbcdfc6ff24d8810ba258c949154b2e9d1a0f +385: 2bbf687ce7569408c515117fec126ae3ea11af47dd8a5e80c1d45ead997cfb2f +386: a993b3a196f19459dffb4c77a1dbe0f2084c02553fd8b4e8d5540705bd50e1c2 +387: 26f84446687ae90c1813fa49721257e7fd8938bf303dbd72cfb4e32cdbd58701 +388: f467a901838d0f18b1ff23b4b92a8eb47d1087973a942f160f3657ae8c25e82f +389: 67aee2303ae947f1c3cb06e7bd76640be6e007dc21ed674e82c56a2fb6182e37 +390: 36eacf8ab85aea33a2d0cdd5716aefa875da36d05e765fff91bb5c70c7fedfa1 +391: 2efed6f5c3303799203b563781fe7e8dd10e5153ffff7f40c7eb71380a11781d +392: 33fc4ac404c554b242bc6a95c32d4a780ee9244729a5787009d6f776b8e98397 +393: 0e6a680ec399b877f374581475656c2498393025aede5857a3ae508ea8885da7 +394: a5e064a448b5ad1562b05f17e73af343045c89836ca15fa03936f2cd23f7fb8a +395: 5a22f1f5098d4594311fb19e225c848602e7880579356f183ca882aad3eddea3 +396: 1129d0a75803362dbc3b9d3d678fcef29880a5c5673937abe2f0ef71ef83083e +397: b8e2c3aea667c4d139a7adee2e29b0ef4ab85157d97d3a593deef208dfa5850d +398: 77dda75715d6a77138f0b4c95c8f374b6cc9cde0661d111bbd7293dd0add6e45 +399: 4d9199d53858bd285e824099364cd360e55358bab92f6e699032d7597c78127f +400: ce5296b7199d32ea2668de4f0e12b522de695890d491b69a46fbd3b19443a5ef +401: d953f34abc2cf734b1de72bcd5fdb9e34b3790c5539939dbd0c580578cd4993d +402: d11987f38e5d5bbe655f2c1f0693f106bdcf39794bba6b8318ea575f8bf0231f +403: fa1995a87664b4a1335b18f635e132113d802bcf3bfaa983844e4be9aa48302a +404: 94d26f5751646b41f46cf71187773ed3c3fa5a059956c377be54d6e198fe7f55 +405: 73621384cef28085fcf9579dd4b08a9c60c6c6693de75276d77178242b31e9da +406: d18256c03fe2200e7fde200cee7e5e68b31fabb35ea4aa674f1480f0c70f40ad +407: 228cb345ac19bde898f5d1bc0c1606c20a4b378d39c45f048f2ae641765eb3f3 +408: 127b0845056b41d6ab032c78a13878dcd7f54d363918738f107b4449ccd58462 +409: 478b6381cec4715437db2bd003710a92e5e3355cb5e01a92d4eff6095d2fa3bb +410: 2875c4e4a1c27d09af73fce7b0c8e9f0a798ad157b10b92c36f696f2312d52f5 +411: db0a692d081a97a3d3bd3e525109c1bb5e5f43654c538dd155e98a433d8118a4 +412: 5225f5acaadeefb94ef492e502474d900efc6bcea98579d120bc59c7377448aa +413: 27858430af45f95e7dfe8857d9f09e663577b2b858057eb531c8698afbf75209 +414: caf13396952df2bb16c10d62c34df43c4c422be52fe963401bacbcd8b3fd9720 +415: 7c9d95826ee3ce61e664940568a0066e9cf2665025f9d085eff982292ba42fff +416: 0d2f401f6deef04e52f09d18991981dc4e4a410e14bef6e4d0952c14d4bc791d +417: 5fb3672a06e111c544223114a982f4993cd0a0ae2f8f20c736ea622f9a592f3a +418: a143850d422c27cb425db67106caa1546436e843bbf6c7c5ca98c7d8b26500ed +419: 3a7d55b86405bc716dd23033ade4b475b1e16eda03737ed8d54783ae48e33842 +420: 24d02ba759abcf03263bf74b4149e277de035c9970170aee0cca3db4c3af0181 +421: c88f29372fbd0f25ef8f22d73d2c1a011c2108e43bff19231bda4ecb0aa870cc +422: f13f8c6793b9fd9dbaff1f6e7ceb6adcbb29df48412dff67855c37ab4d2ea7cd +423: ac2ebe0fefd24d17b128950992a8447d3d72e96d9991aa28cf949586d4aedcca +424: 51ce61394aeaf246871690a4c3f9e1611efe3db47689add4f6553ac44c50aac8 +425: b51cd46dffcd7a50fd1bed06d63277dbfb49a9dc52d130d2fb48cf763d090eb1 +426: 8cbada55be3ceeb7ff10a3a86cbcdf93cec431bda81cbadb17c35889517f6aae +427: 271ec5f0f337031bf4da8dffe63665d21a1445076eba7fe6347e01130724c2aa +428: 4e6b0226f4537cf206076359b05c5e848c278ebee902d761fba857852a94dcd4 +429: 26b02334cc3f7063cf3c98509be21fb05380a1c5b5415c551374ad541b25b73d +430: 855ec2729210f95045ebc4ec2ffb251aaedc552cb84b2525a111f09110a21957 +431: c492ebc57c483a2e9b696db4b20a7d06246ddf8eea54e374d6692f1557528c06 +432: 82dd34db76d8eac6badba158292cf14249f78c39e27219aa8438ff147d6c3686 +433: f71d583756b28252c751cc4f86b96ac2b24fd3edcd87c89920fb7cabd84babac +434: 0c00bc0ff60cf805bf9f92df1780f5966610f24352cd533a2988dab8d59f4dd6 +435: 52d23dc9cd06ac01737352ddcf5240e911361c21403b997b417476079db87454 +436: ec9c3e840bb9068563e655fc0115b5f2320ac1e26e91bf6af4d92512b1191a99 +437: 796fd5cea33f547b238d9c191248348e034ed06f008cf8b4bafc428a52ba9d04 +438: 400aed2a17301c211f09c92449841d9bc11246db124d6f1f1c584c0589116434 +439: f4c457c53d3ab63c03f3ccc4a18a9e45682a9dbd7dacc809fbfd20a2a7e95bec +440: 3c24b2f357d6ad70a76da8629813ebcf1a82b5dff8e73f4903709fb4214f5ae6 +441: cd1328d67eef562365c873d1cb56eefecfe886e6e6197f98273ec2b2d642168e +442: e36b514415523ce85e7c285edd862b158e60e5eb47b45d4b3c907a9cab4e6015 +443: 0cb9c2d05d74b1acc77eb6c71e8dd69d2b2788ff3e1d40e214694abd1521121e +444: 49d7ad342aa3876e558622dd03938a6aac258784ff02d1c474ee3ddabca6bb46 +445: 15341339c524f870272f562886acb9e8237330a29f89038e61066182d927fce9 +446: 02488037fc6e3b89cf003af6f4ec63ed4203384266c064a7992e0c05a4bdf14a +447: 2dad5437171fa3401711b6fa7b4774ef6c5ad2a8070abeb6229e658ab3bc04b3 +448: 2b93fdb14add3c52d2519a2fecdc906893ae77ca2756ae6290a62af5ba0330ca +449: 08627f60d00e95c42b53bdd5eb8d08b9360fc1795191525cb5f9ca9dacdf4dab +450: 76f89b17a70f96f2fbb35119211f070fc6e5d71bf75c2b60596d6ae277ddde9f +451: 4e2319c28de62374e7e20f639ed19df7dd0208b6fa729385d8a97b7ec0085179 +452: ecf6bb771055ffd58c77062f15611853f496708608065ac61036d7e01f50ba4e +453: 6815c2382af401c3f5b65fdee1270d065bd53c38eda08985fa4699b02c975095 +454: 397db724108990d5a402ddacc938debcaf8b3f9b467dd76110a0dc146b451042 +455: ff534e92474626cfe49c76261d074cbc93c442f9729f6052119bc2c97ec27f0a +456: 78e86805f8b263632bbd8fb30f3ae913fe5b71241ba701665b7fd73a9087d9ed +457: a8badf35f8fd4168f41779aaf5db3b51a01952b731ccf0ab04d65924905ae4a6 +458: 188a69be9bd313c3abf0d2c9f86654cf1e56add4189cc9413456a51947b421a6 +459: 8af25821481a3fa7137e3d957c64a97d0204f9861bf6a8701fafb20dc4baef6e +460: 6a8a04c755de9c6044fe243e31b45a3d5963f22c5323be74eb04965ed419aa54 +461: a817f1b7b748b0236c255df87d31be1dcb5b4499992de7d9b9ae0d259ae91e48 +462: b7290cba8e24e6b9ff81fb5b914dcb248a58bea9b021ac625a7c9f29c8a3ad8b +463: d2e4f2a835d2ea8e382099975ddd354bb129019f61b9d56326386f5ffbe0c2b2 +464: 54db5f0f6e4746652405abed569c91282193261669c7daa31e8e649f3522a79f +465: 50cb4b5862df24e4065c94c71b27606a3f811361ddbaa2664aa7c88dad151173 +466: cadf8e317c0dd6c53d36b99f832a30ae150a32c1d9e2a95e0dbe9219fee60e83 +467: 29196500ec6a1375916b0147c353b8a4921aae592f51fb7b492c3526c2b75139 +468: 7766b257b8e202072cc2d65999388f60f55b30517646b258bb5075845fc7e4c5 +469: 211a46ca3d1280a830bfe997fcd7fa606f56547fdad9a2141e87b67af443495a +470: 18e523ef28da5d53433aac9491ee418c7785e82ba8b84c9bf091ab25a709ed10 +471: ca746cb23c094d3add9a0ac70cc966656563bee80fdb1cd9d729a69da2f1ba34 +472: 87b9a1347f0e33ddfcb4f618a3701d59b57d6394d439474bb7016d427fbe276e +473: 22bc2c81b6f94c84ab0fb79b3a7b2684ab7e8251caa08be6b8701aaab24ca5d8 +474: 5d10fcb4b8ac2461185f5417f5902b4c000cfc73acaff798d8521c77456f51bf +475: 8141b5641ebc92599e3f5a7e14546eb15d2fa8a791946bf0a84657a346525cd1 +476: bc82d29fffb497b8c2a9fbcd2e95b85fba93cf985cdb56461e59b69ffebb7f22 +477: 0a57dbe66466333ec1d7ebdfb6100a903697c45b99e0ac3f4a659ab368ae1a85 +478: 51ce84d63b52a81becf17ed59ae68be2ebd629729d5d4d5a2f1583d744bd2a88 +479: 48aa59c51a05b0a5e61ecd89c2bc8eac6c10d05417ec000cd7580ff52b4e81f6 +480: 16f73e3ade83ed3c9ef33e3c0c01a5686b33a05fe1b18308e823bc2e504136af +481: edb9856e42e585fb13ed96b367364f98abe4de71e2e423d8fe7c6de5be223345 +482: fcc764222c981a04504bbd3c32bc7727600b5c1f9b386e22a226a668dbda0c87 +483: 1981e5927b9fd162ab0bbb5a365b9ed8e247724334fc59ad28e394a6c4be899c +484: 90cbee09dd7935d6837b9a1b67f9405452603ba5b228bf7a8549a2abc78fd255 +485: e504621151f680b6086984a4ee2d15857da704a659974af5ef93be2d1a9c356b +486: 203bc8fa7a5c11b2eef3e268df252033193381dc8258ede81e88143ef23a8b5f +487: afe30eff8e40220ca4e024fa0b94a46fcc42c0cb55df68471665b27732a60a59 +488: 48fee4b0bdb44c09ff517e0bafbc35c7b825379d3ae21924ef0a44433b6a0447 +489: 276c7d526581af81956eb0e247e55925c069a843ff139bc2ec057b5b2293b689 +490: d238303b4abec814253fcef18081a517c4ef3608cbe6a4101edc61c7c70055e5 +491: 84a409eaa8a75a5c91c97b3969d0987dd9034901c960ed9cba49994f0bd8372c +492: 03e947ec08b722db55035664aa0342bbfa6758bc164914365775dab315bc4fd2 +493: c23338219a7fabf5220ee25cd9f033ce9061d7d5bcde28f9b0110a8d43b3ebbb +494: 092bb0db220936de15bd23e6aa1129c52c6b7033e6f801f7dd052bee713456be +495: 5c6f720499c979727710b23ef59996f4cb44e39a95aad30e1e395f05722dd749 +496: e6f72d91a5b12e3740837467c1f577e4893965d0bcb1d5b56dd2488a273ae016 +497: 1d8466d5bc2c57f3d39b4aa8fed21acbdeee64edad2f0b62de769b4e0822edf3 +498: 9f5ded99162815de77cc21dfbbf69a3f96e9a7b6b2c86f50b1c511dba25360ea +499: 3b9fedbcb2d3e8a6a4bcca281e409e1dba4dd05adc2623390f68956711cb9c3a +500: 7d1b86dee381d8053344099d321854dec6d1ac7e7b7d63e587211a3c23f4e72b +501: 4695651d56ec6ffbd43e3b8639f1b417806d9fc8af1ef6ed8d08e644686c817d +502: c48d004fb14c505ce06d9f421ce0d35656c448d631515f8652ce931c1d4f8eb0 +503: ec475e34472eb053e407782d27b173ef82c06d3088270b7da089f7c7e2cf493c +504: e5ba57405abcc5d8e5b79013f8325915fd0cfa08a59f3860b83460080c3e70c7 +505: 94f3e311302ed65044838b6dc97d51b414b5e7949ee23520a9052c21d486688f +506: 33b34f47628081709b85af96e54f4a94c882d06efffd34ff5a5169b5751f1af3 +507: 8c02a790b27b4d6e792db8951dc9b0f1f48c0e1338efbedac92e485a9c6e3df3 +508: 6a52e76d0066a0b76789b0210d26d8812f06f7c8d7d0a968d901cc16800bfcb7 +509: 2fad4c278b249feb6bc654c7f80bf6c7c084457980ea4a95b8479088dc3ee562 +510: da0583e7b44f358b26a83db200c8793f60164347410f108951816718d55b040a +511: de11abe66ba38bc11b0439129fb6ceaf39948b27cafa3275890cb05f2a805f65 +512: d2dcc2993839741afe2de012f94b03681fe5549ded0ee3316e48b7597359dc69 +513: d88520e62209cc1fde3c9b16ec40ddcba1b57f06bf9a5146dc9014ec446e6f29 +514: 242514918e564473ca0d96285b7ec23bb5e106b86977ee72cc5fd49bafc2ae59 +515: cffc937d5057e24f8365f89ae7b2b6afa8c8bf6ded43774342756572f2a8120b +516: 05c1ae4da63b088c7a6446c94506469f83f78dd9fdccf0ffc554a0234bee96a9 +517: 6b837bbe45a0392499efcb1fa9d0a183fa265f259a0913a685fbb6fbabd9cfd0 +518: 0233c64a15db203e102e92b949ff8f5687f122b73a6098d873995d3a69f3afe8 +519: de996204b8668ea35758f4a434a82738d2e4df397d56d5e44edbf75562967d9c +520: 5847a852cde88f947554f4ec2e0f8df4276ea4ce28431dab17b849e820069163 +521: 434b92148bbff5d2286e0e80eaa0c4a3eb53c7a666ba23777e7bc458a3201ac0 +522: da5a927529243cee03f6c1398e41447ef5bdebbf61cc25817c688005d45b0cb3 +523: d838b16255c39410f535eded20ae4a2a14ed4196bbdc272c4ba13de25217329d +524: f46cee99cccb920d7c9567e571c793ac3020adf9502302faeca2c0dddf1f08e4 +525: 1e5c71266cc073d99f10093786d1d141770cfcd510431870662fa857dbaf6a5c +526: 602ea3fcd4d90de7a8b5dfcf65a61d53328f2edadbbbf14c62b2a6f9c3213a5c +527: ff707c27b1d462f2cbd191f8555d2bb197a24480ff61efd0ce99b521878afc6f +528: c47995d2a690c25de33d55754d77ba8da2e841a86abd46197db2f5863524c78e +529: 89b542b5508c1821a670a2745fef3b56b7e9a0f8aeb2f8bb2149e90c75e2139a +530: d5b89eaac746528526cef9f99a3bfbabf9ce9b6ff604c1971974c8d27442981b +531: c9cdfc6cc2de550a33ce68f4848b4c619f0b425b699f2a2b76d2db475f6f7573 +532: 9600f94b77994e18c362504cc144643e90419eae3f468d3ab4e390e429d0d5b2 +533: 7ce9cb9bf84b35a763110b7f66e0be7a271371a78a5376712c19447534451db7 +534: e9a8b50d03e1972741424c2c16b37166fd2d8b6fa17d6de9a0ea6d5b500adcf4 +535: af46270f70661306342e4d96df5f73c51be87a7cc9208e31356129d2d255a9ec +536: 0b84feddb3d62c3515b4e0a082f485313a7583d1e69d28f5b56928b177bde02d +537: b78ab7ef9a782179abb877115e70e9ae8a4df5a2532bc6d70a49137524d18c0f +538: 0eee1d4fe4ba096f194d4bfa30bcaa12cd5c5010b42c81997034a8ad71de5738 +539: 1d750f1fd643cc8cd360ac7ae41292051c7aedfff4ded6b61566739aa90890c3 +540: 38feb94cbbb3637ac27d561b97274ce8340d9f49617cefee8884ed94de6ac579 +541: 67d18d9524de82f3cb9048127d4c429f9d4b33ad3a9aa99ce86e34bbddf81488 +542: 24dba4f062cce959ebcf758e3be0363905a80b191835bf4333e5c572c085ecb5 +543: a0945db8081383cfed2d66fb9f79774a953ffc9dd6990548da55c90b800077c9 +544: fcf77a9d1f6c84048163f9f1ba21eedbef74dc62c12505a23934b8637758fc0b +545: 6768ee1dfc4d9aec0fbcabd35ec91642bab1782d5b5512fd1e41bced92cee73d +546: ca536e3396347e0495b021e2e84003985d9304360c1505e0031f6c1e5b6e74ee +547: 6dde51e539def3bea08bec0d63d740dd61b66fd16f64296609db33103d76b7b1 +548: 28f4238ed0a8e8eeb50b1b49bb0017a5cce0b2f42816caba49464096d602b8a1 +549: 173c9fdeabdf4be0e5b8dbd4784cbc808e093750e2397388cff3c5979d875ff4 +550: 99a27a37ac53b36ddec9cc432b16d44f596d7173184d0bbdf1547a4e04e3a1ce +551: 86413f744576d0260415fac0247dbd61a3867fd329004217a9141f2b0e5bd2e4 +552: f2f8c905ecd61ae2aa8de239c64fbd7b5f0c847ab18e56177d76240a626008c5 +553: 862936291eebe5ecccb4b213d74c9a7f022772fe1add00f7af5ac4ff6223e346 +554: 0c47fb1f36affdec39eedc88fe9bc3afe65f910047fe9677583d109837da43c8 +555: f7cc0f262bdaa131c9b582d8ba3543f4de14e069eb8453b9c6435900b2628b6c +556: b5231f7d4bcecc3cac63cb530c6ae7ea7560f0c27e41557b6ac1146a2c1eb568 +557: e8599934318acdd2ef5e7fc634960d76700c92d313dda306c2cb17515a327c3f +558: dbd646fd923cfc9b10ae498511d6f131ee8c985060590b06ae3678fb8b46b5c8 +559: 6d52ecb66f21882690258d77f9382c35540363077fd6086fbe4682a84eea11bb +560: 07d78a6e3ea3c7f98de73559adb9e489cae8af8607a1fb3d79abc150f553319e +561: 4953e8f819a2add9b23853b06bb97e26c7fc49acd8cc1e0b4684a5d766f35a53 +562: 781b2f97f00f73debc515a175ba66083069d9f1506b4d6232acfab6a0a3ba939 +563: fe3ea15a76ef7006d987d06dca3e0f25ec94f0a25fcf3b0ef7240e3d6c47bd2c +564: 7ee11817f2ca5f9a6b0d7372849ce31baa3269e1b1780c5f1e0d80716c357088 +565: fe2da2c4071d83642a5720718e49aa5a44a5bcba7e8f8935f4021e0955436a5a +566: ae74a9faea147eca57ca27b6e735eb1aa8ece530448730c99871a39075870131 +567: e3464d5fbea3f20e2b73f63be61c455ca0a518f989b9d18ada7b790dbdc63fb7 +568: 6b48f7b2989583e8718603b3a62836a99ea5b37853d7bca7b70d52efedf02d73 +569: d460ef41f4932d9f4b1cd07da8f935b6fdecb23ff8b269c80e86bc7525c6f72f +570: 64ae878a73ff936644eeaef0338138b29e0a3708bf4e99cbbc654b94c4f172ff +571: 1a4965900231ba33d6d2a629c4eea67599342d97f9b0d859ffda8892f51d0fe5 +572: 105af97fddd8f0915dda627d3c122c7866b541d6a39f5ad8a77fa648c222ee68 +573: 79502abc9bd09ad2f2a3e454d348723a6ba623fccf95025ac9feb0f9de4db246 +574: 558fa2ea8d21782f73c50ce20441385feab4e386afa3359fd035921161dab934 +575: d8446ce7590ed28036768d268431115d1c8118bee49c74bf6f1181611acdee49 +576: 9b4a90d2d7654e229dc2035300ea60a901c7bd96649bc8d5aca1a738baed038b +577: 798270bd135c927db2e94714661d36600c8d66ca3060acdc991bf42d918c079f +578: d7120b2db88536e9934d96390ed9ef1eb11ce428d0b2b1bec41c8b1fbe51110e +579: e001c6c8468fc9caa9c0e42a731356aef769913b105945c498efa8c95718b06b +580: 0f62ec1075014e7e869cc697c5670bcd4a669c979a8cc1dcaa38e41ce67e296c +581: e5ac3f8d559a392edbd7d6ac10a89f2f09808f9eb9c720189040dbb0f87a7b60 +582: 64e2b58930dd78a546bc5b7e55f65cf44595435397f5253401d3a31e0c30b317 +583: 263373377014da213a97247cf6506808d90e15e1af57d5c13d8d53566b5a5461 +584: 9aa6715383e79f4a1ee8b8cc86f128dd84a4982d3c5a6f156b31e4472737c83c +585: 1925d844b25759a842c33263f155d29878b36fde630777ae0a97e2fe85cc00fa +586: e9e11491a037153d2fd0853c8eb489a6bf5fdd97c951c2b3bad7807a12f2bbd9 +587: 3d2e8b0160b56435c74603ff172092ff34ec4f82e614cc4c445e162ea9e07ab6 +588: e99ffd1b1a61b6004364dbe66570f205dd74e60843cbd9e43dca8dbfca625fe3 +589: 629630ff8906d7c13cf9ff64a0b427ddf9e8941647d8efa200b38565f80e45f8 +590: ae56197bcc4790e52ad8636450e7a9c6011cc1b1b6571ffb5922662935ad5e8f +591: b4f2c342260a8b77d6a4afaa9fae0421bcfb16256d45ebaa80f658a3270b93c7 +592: 06b84e9eaa313e7381f3a25a3b2ee71a0e058af2dbada33c08efdbeeb6a4fe1b +593: 9d45e4b82e1f0eb022ecc8dda15b45e0e23964671eafcd7786f44de42a53534e +594: 6ca41d669a06431c20f359eb53a00e8e40bff623502c06975a53df2c24ad2740 +595: 09987c84090b121bb669491451fd36981e35059a315bb3510b2910e5cea7b703 +596: dbd7606eaf66ce092f8df17a864e7e58a82950c0aa4f59a2163e2e0b98e05966 +597: f408448625e8639af09d36d1b0b4a8475223dfe23d9b13c344f6efa9b0d79b55 +598: 67fd26f76aa8fde40ea32742e9564f318e4d30393c8c8b3efc1874d361a0c677 +599: ca232d6b3a3cc9555eab03a3023cf6957a95cfa1d7675db8ca191c5b31cae03a +600: ecdc0f7a4ccecee888019378fe1111b23e4906da170fd1e3cd9ea1593f941cd6 +601: a2c19a29adae2d8a541915b310c566d55ea29cc7e3ac91f7fd3a88cce40c39a6 +602: bd042cabea0461654574055fcb4214f45dc5f7cc1d8aa821e259267d86eb8c52 +603: 69e0e38d26d191529a5b11f19ae3c78c8909855b6bb31660b5af80ddba964ef9 +604: 7bf4908e45ca86a3fb79c7e6a09f604ccc9c557974483aeb5b8f473e0c3f0a38 +605: 0ebdfc4dbca222ec3f4209d36e6235a433c2ec5f064592ad2724107ab6d2abb3 +606: f60e345855d5d683c432900a9a233fe853b812f6bd8446601bf8d410c3e67c36 +607: e4d5c7bf1ca47fcd5179833beb7a8489e910fbe93ecbc34a7c912c358b45bb33 +608: f9f127ddb0330d7588f3711a22d9372763b4661c63db217e1561c3b6ae45ad14 +609: f0822a7a0511193fd6f5a29ed39d8e8f737225fe3e7d8d90c704a032290ed1df +610: e07fb2450d06ac2305eb3fefb4b16b6eb3996bf91f98df58ab4af7bf4b24a5c7 +611: e6b0afff326f7f36b65b095072a19b0e104cca0dbf27529a7f39a0acefe8b3a5 +612: 30bbf45da7bd0d24f706803eabbbebbf78fc67f98e0af4d68524025be2de183b +613: 9446910610590058b8b7a5079920d545e633b7b7a98a114303ce332e34e1ea31 +614: 7a11ad209cdfd258c5be5247c594103ace97affeb5adb140b3bf4b9a164ab4ae +615: 561775fa45d789a4912019093df2cea17402a556110038b90fe8901d3ab910f2 +616: c40d48d0551a2fa949c0c19751b3ae0027ee1169ad96e9dec2bcd06c6f43bc0b +617: 675519f03c8208cce08fa91f718484864504085354356790c058ab9aab3009b2 +618: 8dc12b12cd525177c298c4c925748af02ebf14b8dc5feaee4bfb75c1218bdb9d +619: 62cb61ef8ecc400740115f39bbfd492232761effd72f67f2edf7a4943802b7ae +620: 6935a0079903436cefe716a592752a3941c38c6fc81a52b70c0d79213d157583 +621: 42e01b526623a41ec90659f1f3e7566c07254e21e5c3c4d8ec5d63d99a3905a2 +622: 8e0d64ed83799c1081e5eef417e3a8bf0e7b33f7c3458896e568cedca96f4b68 +623: 16854b1163fba8b8d5328637af0d7834b62318e11271f482bf3b31309bf9c89c +624: 8cfe1d643d67031da6ab55fa27e2017915466c5775822ac29bb303bb18f61830 +625: 1dc6034d71d1f5f1459607c478ea4aabd826e50c59d891a8cf36f6304053b478 +626: 2aaac5bcf9d5587a16a51d1ed47ff084105174d6b5f2ddbf2cfeef6664728970 +627: 61508285a773bab75cebfcfe19372867f10f80195fd58f4e4b829f857d769aa0 +628: ac208911d276d644dd122190ec1dd4be77852c108f140bdc1e8bf353e5f381fb +629: 9d74cf92c621a9cd48e4e658f4a01d2c9b245cfb616bca6247e0091e7533a705 +630: 6243a40194637f3bd50e96d703b8f5c7a4f60ed7b71da7051b7abe4d1155b229 +631: 06fa690518c85c3aaecb3ebbf5fb049deeb95354789354e77f0e87f714589f09 +632: 5f359792b9fc023075e078126bafb2630c07c55cac746cec7b24dd52b55e5493 +633: 7ca64000ea0cabc0bc80372a13fc49e3e19372072378561d69ecaa716cc32cac +634: 973cdfc51bee2d6e46eff4ba47f2f8dad5edbd278256a98383f3416ee1ece09a +635: a906682cd85185924191c3873491a18b134f371b3de306946e485cf2e58c04a9 +636: ac11e1fa3e0f28955fac401f434d384a6490c7b4309aab903d6fedde86ff044f +637: e95a1d5e94da3939a9ea1853ca677b7b4524636ba85ba6ddb3889337fb6731f1 +638: f91877dd03a80fafde2c3a39eeda2ecb4a12ad8e308b6a1df6a182580bcdba9a +639: fdcfd665e5ec4e69f48a8cade948e319b79388d3f2ff21d99d4f96b5c07e2459 +640: 3c65738454971b3a3f7df085a917c24243776ccc968e2ef2428f59e9a0519188 +641: 13c90cb776f1531391b36f927bbb760e29dce4384a42f6b071c22df66d06568e +642: 9beea97e1746d96db9347e330df0e92b5e05efe2c72f5b0a0f6e621d39fd450d +643: e3ec99168ea8353837cfea97f45c3cf297805d1cd3cb46ab54bbb35d0e82e828 +644: 1844c799ba1b7f308969f30f2e597974cdac7cb4ab8c027f82c67b7bf09db7ff +645: 40eb7652ace2dd1ba383972f70cfc3eed35bc85260cdbb001cc0e151f7edfff4 +646: ce4167189ca6c39a025e4a749ae0fa726406a71d6a0c4b10f266cfa6a9d34ccb +647: aff90a63a4a5e46e58d9fb16d33f06f8fdc15a73c7c690dd02e7a9f4576dadcc +648: d842bdf7ea299274d3bb91fc362e4dd4f3c28237e9d621e0f97488afa9a02369 +649: 18601f93b8240474442b832cf1aafd541b32fc47cd024bc626fcc850fddeeb55 +650: dacdbf42cb89fceb79d1d8bf8c583bc127c42e22c7fdb7fcc38ddcae39b1f62a +651: 7cb09fd65dea49174aad61b0cdc7c53e2b4d755816e1137c52ef721ec1b19169 +652: 8be09d653c065e39f84ba4312ff40abc6ada795ece77880a45579407c9bfdd01 +653: 41cdbfc8df373987d7a4645cabdb323ef92eb2e149b95b1cb389352686948c5f +654: 54dff6778bb9a8737f1eaea2247731d70620b74d4d2bedcc492a9768cdbc1e06 +655: 1ef22db51009e59fca54a417c071def94551ecaff885ce191179f2bc486565fd +656: 217294d1818c40457dae5f3a19368972c7375dbd4b1208c62f024a31ce3887f9 +657: e0d0f7c5f46849f29808d598cb9b08fb2517fb38d29a4ab1da969d956b1edafa +658: b3604457af6e43b8719e214620a6ce14f8c22c60a608381275e5b376ffeeff84 +659: 21e6ec5256747ee8ed0e1e4f6d461f8e72e5421598460c0923984e310eb5b3a4 +660: ed4acf4aba6c1f3a7dae1f27c14f298a7966c444e8c70b6ce1ce0c0b6daf2a41 +661: 0547af4c292895a4c18d6be5b2ac9f862f363a36bbfd52d46adb490175fb55ec +662: 3f08179b52d97e7372de73ddb39cd16211d212b0bc2c1790094b33781283e1be +663: 37ad8e73e6a01fd8bb930cb3fd00d43692d8c83d37b4ce6602ee531b282c0075 +664: 81b8b053eae44bab64dfc2074c706d52c748d75cd6231029e9f88e08dd670272 +665: 91e1f3207d4b0f56cfe64aa422c06a4245d701529df5d55ab419d5a51e0cf122 +666: 55bba2503739c92878cde322151f1858972c3ad0cf96c0eac0cd7d6c3b9e4077 +667: 1882000b8a909763214eb3116e4246c9ec71207a3c306d7fb6ee3ab82de42ab2 +668: 4c884909e219886a50d8100a12bcfb356091076fd6f144fd35b6854307d465e2 +669: 8c0aa56a953a170a3ff4ce778e7390362516837dc29bdfcb801a13f45463042b +670: 25bddc5907720ab48ae5b6ea70fbb97a387b1cd5d2a3b6786b15270283f2dfa8 +671: 872d1272dffc2f9ab8742a08a8ba2d38e49a5a6fca74ea6e6e60331ecbe39137 +672: 25755f0de23d9e58811332e75584370259973c264b7028e9f68bffb0d073e52c +673: 0b96eb45fb17a8a80aa73a0e7500e038232dce2269f9abf2add880fc4e2dd081 +674: 085954a53c62269bdc9d78c7c45ca58f5c0220f224c7cdd8b7bae4b6d0fd5fe7 +675: 670051db6c0fb0f947f5d7a11d6bcca2f73901b7b05662cb238cf04ba0d9e556 +676: f8f7c37e0beb0b45654e7f2f03e5a36b86144e5bfef8c580e1d12e6116cb62de +677: d657facc720b596aa8b5965df5e38ef9106e0db6bfb6846e4d9a8ed8900bb8a2 +678: f501202de6e6a53bc96325600a0895f830ee20f4b03d81f98af56fcdf7605f96 +679: 558f0c67d147748bdc5472f4be0584dad452cff1ce1822f4f1ae2355020ff9aa +680: 09096d4a259c1c60bbcd25563301520fc5707106fedd30aa757f8790bab07d25 +681: 5ae02477e97e3f282a912fdcfedbedc45b6f48db463bf1a00e6208cf3a8bab6f +682: c2ae4a0b03e6bde0f10f82cb3b74fadd3952ebf9dcf8eabb3f24b2f4e3e2b0c6 +683: 14af46432e8204cb27f1f37d12605f72d483aaa58164e16a9a0318bc6da38abb +684: 9798e1db236fff527fea4b493d38c7f13200a80c20238dbaac17657d1c8331a9 +685: 6db3cb731b30463f68fd3129da52623d09a8c0913cbdf45c0ee680d062b7b014 +686: 7630c889c0ed3cbf196c307a6b13b5314c35f8e08efbfb85680aa8f56d8b4073 +687: 156cb56203ce9103881c2f173ef69dcd31e374dcfa00844d909246e863c9ebcf +688: a2bbcaabfe54517da51cbfc527f0e5768d6aecd5a6f71c4c70d90ae3054f5518 +689: ec7f5af5f68937aa3bb2e29f89a76c110bed1740ed5cddbb31a4bbd4d8658c3d +690: 7b1e011cc68d027165e019b9e8e070616cfc4009d56d366eaaa4cab247b423ea +691: 6cb2221d41e75df3b985d2647836a26d08f78be70b7d8028555b1b82dd17b175 +692: 7027e565c0e317fb988f6954622a47a6c03e5d6ee9b7f38dad7f8a01ba315887 +693: d329fbd15068a51d3daa23ffa59d8e0d5c2be54535eedd0a249443bf3111059f +694: 058e67814877f19a4d38f3578e63ecc63b450763cceb5f93d6baf6708c6165b4 +695: cab5ae80484fc8573e274316d10e2e6b71d64a5495b451817d59d37fc62cc118 +696: b02002fcae0d4643be5940d223d8d22029fdacd277d153f4833c10fdf502cd77 +697: b245a5c7d95ec8c1cf1cb22dc679847b982d55f3dad6add28ee01b67a6f41fb3 +698: 3f388119f98462ea94fb56e55862e083bd3f859a02e3ef23f25c949cb9b7f5cd +699: c381b56202caa27cfa4e42fec6d238310472bb8e871da0cb47082388de7783ef +700: 0193afd46bb14686ad253297bd7f1083ad6a6940557fceb89461a9aeb6c3d47c +701: dcad33f663c6716db58b5a94edd0b758dcae719b37cac7e6a58db609f9b9667b +702: 551004d18fb394492e86ff7b76c1ca7bf4c83dff5c1ab5535428f217a14cd602 +703: 77bd6a37b0aff970095be63545ca1cf02e28e282240d1ade1e5d080a7c92da12 +704: 902fe8b742e49a4e68af91a8b4c0c78978bdf77855f5af1a010538724194fed9 +705: a1c9180fc41e810a19223ac72f897824ac6d2f59c2ea38cef85917562145ed55 +706: 341d0a96981cbd4347eb91fcccd144f35a7b0967dea0d6c64031b8fcb46b610b +707: e1a629e9a39784a0c28e3dbb2abcbeb83b07680fb17d410d1b8954ed6ea290b5 +708: 0d781c220748957cc95d3153d4b247a2e9ee546278f06e4798bb2151797990c6 +709: 63912204722a1754af57ffa997b549db1ebdf5433c1be42e6af6f9ec482ddd90 +710: 0f61dc240b6fd221221b377f0345a2cff7f13da41d4bd1696c81cff5778f1bec +711: 91ea7c1927cdf2cbb1263650afb35ada8da7d34d98e2686c50962b30b1508ce4 +712: 6e7c14bef3922a5c8a11953512011f61f75509193caf284930a585fff49c870d +713: 99b34c9fd41ebebb6076b75ab3b22da39a9488e4538d6fc016e45727fae8572f +714: b4259f3d957f9561144098aa8b3541731155806ef06b403c2dd4ea4314e19fdc +715: 86e328d35205220f7befd72634d61c329f56a55ffecb247ee83832dd1fe36d63 +716: 6d3386b03689e959ee171e2cc6d3ecf9b250604f34da80387fe1c3b139b6c0ec +717: 039f3c02d3ba2e24ca8a6057272b987e2e55acb88bde7dbf92ad36c49bfc9344 +718: 715e95be267ba0eaecbd230f6942a1eda2d4d8ff36c8b72948a7f721ffeff3bb +719: b4ccb610ffe7c154f7f1d588f597294d2c68c2dd725ec98fe03e71cabc37cdd3 +720: 8bcf65644a63c50a37e09e3cbaa8d771ab92a0d71fef5dd94bb56a001035149a +721: 0993cae164b8e0ce36eb6d4bf7dc652106bb97101a8a7c45ee4dbe929c6052cb +722: f4ddfc20a477bb8fc717d7dc31d195aa4dc55d420af8999d5e40de5084c63834 +723: 4ddccb7c7b7628b354264d7dcfeeddafc1bf51241a20bd8b514852662ffa6e9b +724: e2de5267f2e4cb47946435c2ff943e5d66f7aa9d43497e192ed184cad165517b +725: 9d15b89c15b2db62cbab5119fa15ea4dfc49c1523b10916af61b194ab61488bd +726: 87ee80452ccbe78c55b2a7617c8aee128648f22c4456e42719675cbb7b506af3 +727: 4d5fcb9e907346e305ffc20fb57351f3ae2a43211c4af10dbb1e378b6220b9dd +728: 8129ada76295114f5073c4d5a613d0b632d95edbee3d8a1e10879bce6b81f4d6 +729: 5c5c1f33a4c0ae21c872d8790ea0fcef0960c720fb369880cf5d0086d158612d +730: c4586915ee3ff4e0547d29a546f03d197d33d9f0bc1aabf2e4c0db19b87afe6a +731: 665fa3786202ed507fb2df7cca87dce2c0be5f4fd125dca54e9132d1c0028acd +732: ace821e7584a41471b2e555a1c96384532211f6709d6301eac0622124684bd48 +733: 08633271be3a0ff80987897d45b2592ba11d3c482acf58b4ca3fba1cd2964582 +734: 1cd99f1dcf7cf5263aa8513e11970c77638d936978836e255f7be3dd3bc749cb +735: ce55387875b7f7eed70163b6fe9a4a07f10595fef4d77d0a572e3ee4917b4d5c +736: 9c5e5dd2f19515e894c42dc959ede7f1a0e818cf6a4289c15f54d25ca60b8f12 +737: df6af50b0b22b3d9253a56ae486cd14622268faafa94a25d34a1d1deb23311de +738: 1c45ff7fa7e20297a74256d37f1c518e3d49c960a847c5a9fbf89e400ad1b289 +739: 13322991f05eaf681a68cbb4978dbf26a12c1230ec91654d9e46169bc06bf181 +740: 7913ce5febf072c698215215b7cb4b180a9256e0ed63d754357899b2468f3134 +741: 46e44f2aab1eb83a979dc3dbbec17208dc26fc377899c2f532b5674da794e784 +742: 6af8e641c124bd85b05ec7278aaf1a8b4db3ab804a7a6216f83c399c334f1152 +743: 9392bfec887e2f83109c3b02d2095ec5822917304eaca799e3c9d261d74018d3 +744: fce4ee633e07834f473aa58e0044394aa1105f82931a2ea5f50118f16e18009b +745: ef14133b9e9f2f00b15ba3c9019fbd27755bd60e25dbea93c271e55337de66c4 +746: 13f95c9e923fc103eda110ec9cdee367d01daa39934f4a98e2fa4c8d508a0690 +747: 2b5910bb1e516298aca88c502c033409abc506e4e40adf84c58f737aa02fff9a +748: 010ea00917ac8f13d0e9d1a699a0b4f970d7a92f5f0676bfaf4734ca6fff1f63 +749: ac22984ca1e9bdecf3a8c81c4f5d8476745c6d44cc4ca3dcaeba6275bea17497 +750: 018910488e6cddc4d3a796f5bb981f456a049b46b5e53fe4dd90e55b54796d4b +751: 2f06445407652ac9e9af69570fa28f06179da64b6f9005f2910da20d1747b568 +752: 17c32324ff9ca42bade9d2da7edfee2b5088dc677c5ea0883b515a327b3e675e +753: 640a7770cc32e92ed3e1412c79495a3128b4928659f1bf7d9ff20e53e3dce174 +754: 7f8faa738137234bff364c457cbdab3b9bb2178b5d59d7b67584765b887ddf47 +755: a1564dd109d9dbb882fd221404b402ca046d268f592ef0db21ceeca9490f1d51 +756: 36dac69112b7c69315b52652f5a013bc6b6d4382e0d9f9681a34691a7af5bd21 +757: 1b8753eb292930ead17fba8755a8c6fd2a2cebc0899bfa0feb2edb91f2783feb +758: ae37c74438422742903ef30ae9c0130e4c860a2f11498082848edf6b15996bcf +759: fdaecaea39e2ec984e8c984d85292303de1e2ec12e0b75ab990bfa7e65a48c88 +760: 78867052f7feaf352e97dda57e7792b883ececc33790e47e761aaaa7f847027c +761: 8c73f0f9603bda755f7fe787d4679a2c15a133d6beb2e2cfca4706e992080e6c +762: 8b3ee45fa3a6cf9edca4576c028c9d28ac281f5bc69df1732e2185704537828d +763: 5736c03e2e08901bdeb740fc2a11697366e4b071e6a611c3e1b0be171dfb0c7e +764: efc3d8a8cfa82ad2b91460268ea2181d7043d9ae429f31cc6bf9dad560e01b88 +765: e48a56496817eea0b94249f00d42eb31b1823c700cfd503223430e5377b0debe +766: 0c0a87e714cbaa1b63d56912232130ff3f96cc91e332e40a471a92fcecba5b81 +767: 9bced3b9012155f5281cd83991fd328e15bb791cd2f9101c515633b1069c21cf +768: 929fef1fb81ef39d6f0bee50792bb01bbba750ed95359dd17349603d5c6c9cdd +769: a0298e71a6bb25d843f0a486c84b8af2dd96273939e9878de824dab5c6d41454 +770: 779c19bab13abc41e9398029b1810f0deefde87aabfd55e909ed0931b72f06f0 +771: 88f1b56d0fdc5f50833214e9a7046a980a84726ec281254e75ffa8ee81b24597 +772: 3a7c8ca4b0715d42df6ed02bdca7a6c28831786c3d997485c6be4297152ed0ee +773: 88a0f337b761e71843f41381e9499cf74bf2978a65e5e4481f663c5fa5929e73 +774: 76d365352800adca62fe521af012b686c0b209535bcc4f8b45cc9e728ebc9575 +775: f008acb3ea6cb87a29aaca44df6822d583fbf70d89c20b91f1310ead0d336780 +776: e18850ada303a7610faae0f4419b8b074077d8b382b3519333d0919b56e11134 +777: 95d3f06b9a095e832e32ea5b045de87de1bb3f1dee7aeb90f1a62fe1d8844c85 +778: fa72e0399e52403464714d857bdcc5ae78525e81d31109539ad9548e177878ba +779: 091c9e6519ad79728660cd1411222b96cd9384926c652e3b4fdd99bbe1b29784 +780: 3cd3d2b232a67cc1ef02be591b4fa891d31b2b87127ba63469751afb6bc38bfe +781: 0111a5800571127692423a0b5e64d2de2d8fca7c8a4f893a3a3efbb9ef73d63f +782: d4182bf05526cd1052f743b4d3084f5497e6d752011ae3beb3c884785f0088dd +783: af9f702f77c413a95c767ed22a1a7af5e1951fa09fb921a0c56728a901f88384 +784: 548e7fbc9ee3abef91e8f5d86b9fa2acd18b4e2b5b5f0b06993b020dfde7af2a +785: 76de3a6f51f1ce104ccd0ccfe9cdf2eddf3236bd237ad61d70e16e728f1f8830 +786: c7505bcaf65afd6fd64fc58ba1d0e7888ef4b1bc3c36de89115938850a9ea89d +787: 9de032b9b6d296a31542bb23b5f6451ad14d3c3d27f2f2af88c35a11c9b25beb +788: 9b59e2d98895c363229b3a13175dde2307f5e45e4de48c7e01fe5dd7a66d516c +789: f2290cd7d56562b49a63fa0a6fa75eb43182193e91eafb6de4d5b3a42114f5ef +790: da15453aea57615a06a92759b6906a3b3bfc65a49483f1b97f953d917170c0f9 +791: 7a6cce29f707485231b40c4d0fd2dc3e162dae1ace62e1ddf7227ee77c14bef8 +792: ba476b2558e6fb94308a78b5549e6572d81d7e2b3ebbb42e2f68e595f300aa2b +793: 827e82561dd5149f139a98ae48464c2e61abd7036c3435a388ae437577b98ea8 +794: 42d6226752a305940a4db24e77869c19e6c153a0b7e4409b254baa0e1bb6aa84 +795: 686e8e9fc0e75c0006f3b36cad1f125713d2c2a07162751d79d7b2c0b8d5129d +796: 22c1978979b722f631d051ccf8b22ae0d74c74c4209a013a253f00945360416b +797: 5405d6b8c0a154b56278c54d6a38368370aa62af2d7130bf45051c3959f40141 +798: 400307d1d50fc6132fe113bb8311243c1da0e6b57c78f9e2d5f7554f4e6df07e +799: dec6deb237e7d009ff60996b96e4e92cb197494f0cf5edb5312e1f60575c015c +800: df9fea12bf11f4d9b595455da7c69921f5dc40a427333fa7748fd66eeb017de3 +801: 2042c501563e32a88f4e2d9ef7e66be27571635b6a831ce41b28bc6c6df0eb52 +802: fb700a0f4398225ef5db5dcd6710f7eff80808d3f815801e14a24a61ebc424ef +803: dca2d9f1ba6568ce572ef1ba1fcae08a372b2f485c884860815438c5e3c69b88 +804: 17b3f6f18906ca20ab7f6b011f1cb522aa046c343f5bc04803530cb8537f0927 +805: f888238774bccaef845fdbd2a338831c13090afc7c344b1365e24bf1ed121ac9 +806: ec81d951ac4274fd4eb452baf6c236ccfeb18138429463f8e90d1524da12121c +807: 5cfb0fc4907a831e4c602c82c3f07fe4463bb3456fd6fd24ec78bb483accfd63 +808: 947236880fa0c1bb05b086b2f7412becc344fc3ffdc6f4dd00bfff31639228e3 +809: 259d05d2057d408df0bbede5bf5582baa01339493684d924f17a46b4f5aa4e8d +810: 1ed6143a41a75f6a9f6d42e98a2f29c6cdc935a8a7ff43b8ac59bf20e933f194 +811: 57e739cb621863d956a720b719a76a4be678b0ea731a3b777802b53cf78d3d21 +812: 6db449cca2b58ac27074e003cedac028c77a592d31d5fec2ac90b63108dc2c45 +813: c9ac45e17f6fce5e3aa0a963c5ab2af463422912e5a97e97b969d30aa5e71bfd +814: ae670f4be0ca416bf822562d1c136985473d93fa6c005565219c387459c9d463 +815: 64aa2f792bf77fd23b6d4050076d73c9b2ef972e04de3c4e4b772a75145bfb28 +816: b2b8810ff96b189c18de81253260f1f57d283c3a6d5d9f8d8a3350b7d7b4cbdd +817: 5c7db30147bfd07e81e7230d8d5e559255556dc7889d19f5a1b834ef6de92639 +818: 00617b68f6496cf88cb4728f889534d3b4ff83bc8ef9e214064a4d0511916a7b +819: ebf3905209b6aa1fe732dcf39507258e0faeadaabda8ff2bcbd028c2ee071155 +820: 1ad7cc67a00035019d548ad7d8f01567f30c989f2c02088e9d18c864f7cb8054 +821: 5f12fe6bef45c836311ca3681c08f82796dffbf1e6893272acf26139333a7653 +822: 4c804c8ae2f4187ccc2af13aaca740d2f0ea8ef1593bb2f65640d4d9cdc19d42 +823: 52becac90562e114784b7542dcda300834a4cf3d2289e0203ea9b1751318e94b +824: f318c6a0b5af61b3cbaa5251d849636e68ab6c29bf361e81610d259e5f9a1c9b +825: 1210b493270eb4617cf3398c05281ab67bb2415cc7780d9290761250eab9ef5a +826: 166a3084fc7ddb404d39e4d487881d7e7488024e77c827c86d80698967ef0439 +827: f7e8df8d6c83b694e8e3067582eb9cc4d8aadabde048a3c54894bd40f94b121e +828: 4289388178c1473632da87084d13c09a92a19ee32d085d717ea5f7b15f8733d7 +829: c11fb521a4d1287b82e982531229d811e0cf75b049979c592d48835b3fdc5ab7 +830: 7b25b4347a6cd7f79fe6a2e123e2bcd3c5f7c64e5701474e116677c680c847eb +831: 3bd669ded341ad240b3cca32e2246044e788e92346759c677c25b588d336eb9c +832: 469e448de67d33b679213d1fd4383af4eb663312d2b039aae59a7ea55f47d48f +833: 1e19b3f199afe7bea42e85233dadc186dc7db1c34eb0222c40100443f1c372bf +834: 020b1df2133447fd8d2d1d8caca7a80ba666184c243eab0d52333f026d4c8488 +835: 017f82bb4ef093de828031eccb2e19929839344b00fd424113b9b170081f7d23 +836: e114a5bd110ede150c872c12df640eac7547f2c3b093b4f368ef1b17d5efa42f +837: a36b110e907ed59a4422c82d2107923fdaf8130b4bc216aec7a11ba803a31a1d +838: 01519d8b064806e5da350a1c102d07e94fe5334fe4d23759356703994763c4c1 +839: df4e0927f31ea17664543c2505bfd90f4df67c620d979243ce80e9ce6aff0db1 +840: 28697719928efd0d8502578d1ab317b772ec0e7fce2a64d1a174d7ff6dbbc943 +841: 5aea025c0ecdd11cc6849bd784eb8b591b2d6034dd4c9e11736f623cab205bc8 +842: 21b966650022484ba1bf969edcdb1ec5e71d2e9198721c99df860bfa3320b685 +843: a48629a370e3c8a8ea395c1381d6e7ee38165e29d70fe80074f1553c5ca12086 +844: 8f00714b53a5c63483c1a1ced92f0a7fbebea7e10b27e690b259c58a7e21b255 +845: 4a15be4e2173426025a7f7c2bcc0f9fe2fa070c5ad7d0185b2a7d4a2717b2d73 +846: f6da5b5d72df9883e373e6f7c647febff5929ad666307b3ff838f288fb20021e +847: d0c3a75990e3cd3effd916b8997f8ad39aecd2f40c7c59df5c6ed6ae2bd6ab73 +848: f08583778b92382380ac638e7f86c72549847cf3570ece9f28b02f71e0bc9b15 +849: 3d41f27a82ac10a8295a2cfb6f4422fba8ef5303094a845216e532d0998dd1e0 +850: 2cc2716e1e720a13304be73fe29a4db55a2ccbc95285783744077bef292b913b +851: b67ccae6fcf0d8cd364260c649c2135c606753784fcdab5411915795c6986dee +852: 31542a3723110e69b091960c13f0bb9bde2e7630c17ac9742ed5bd94df12f11e +853: 7b3f0517b1de93725cefe79227f54ed95166e363ed0b373da7274e0f56e6e433 +854: 5a2c88b0d041cb9037cc3bd64022978dcf2d1839b7b98789dca382521f4de7b7 +855: 99fc645dc0fa9183a7cd75ce5e133e3552cd890eeda2d79a6471383965757f5d +856: 8bcf278d8e51f0cdc959ef1f5ac79c411f5b5ff7c658d3cfe4d1312c9ddec0d1 +857: 5b1ce03ec386b8a4530e1c6e9d27c3ef54c0a8da3d2138ac2ff4d7bf89b14df0 +858: 6dd8aec81318cbc0bf2fb60653172af32ff62dd2ff8cb20bc0c1df82ed41edb5 +859: b2b6ab64ea6d8c8602bb063335ec0782c02174dbcc8ecec1d6160e030cac58d5 +860: 26271e73d07a7c45d017b5085c58c42914a74719c8d49979c678c5b4f8e76e28 +861: c6136d39d206890f5e8aa2aada84bec2cf50e405fbfae64b7b231ba880eef72a +862: ee8fd22fa072b9fe159209e4955772e67d225ad2a9d169c30f6e468b5d5b1c91 +863: c73ad82fcd868b622f9b5e136915894739801093cbb84c8849a838d6ebe729a3 +864: bca23c98fc655392ba07e97b3a3cd5746c684f7131be2fc95a7d5b92d80ce755 +865: 5290cac580cd15da39312bc9f35de883590b4d42d481854e488d33794f47ac34 +866: 0af6a1b3b5a923b24b7f6be599c2475e2007165ef088230cabb9ba47f2467f5a +867: 5c3a4ba29214bf3532af5110ff7f1be43e1d828e181653064f08f0ba65556e16 +868: efe62d93c082b86ca8185dd01dcb848c247412aad460b3f98bd7394c333a4499 +869: f917605bc5eb01ec880886992db6dd8dcca845f013eac800d21082098d660f3c +870: d745dbb46f8e55d21378a0c6f070f851b05a5d0d77fabf7182cbe0b75ece39ae +871: 8a254ccb12d77511b4818302a7cf7a4010830554ff0396a105985fc4a7f0adf7 +872: 446af701e2c7dd921c6c157ea68c7ffb2881e489e06bffc555bf2241dba2893b +873: 2602237a6aa03fd4b36df0b938f1c49f610ed92bae6ed1b7b60ec172ff395e82 +874: f375e7a552540bf63d5e69c663e4b2de721435ff57d9f00476d9241c05913039 +875: 26edf4b92a2d80a8904da7d91ddd617fe97a4d741ee74e02f732dc350abced89 +876: edfdfc01d71eae7142c218f5be3867878232d25c0e503be8053851aa4c31b657 +877: 015a35e8fbc9e2355e220b6e07cc21049322031b2940121c71058a8d9c0ad791 +878: 1c241cbf578fc1b5875c13045d01cbb39564d1ac030c38b8a0add52c1c38c608 +879: 0399cc25a5426ae96f2f6cdf71abe0847082c2700076abd073d88862e4d32588 +880: 6dfacc9dcbf13ff79b66c487a678f81766bd2015da32fde451d904997ca5f8d1 +881: d684685ecca96d26094c9c0a391f606b7e874553b033ae90ef96fac18517bf01 +882: e6cfbf978ecc3fb19429203bd2c508a4bb1e1d419c313f554d20dcdbbca6d64d +883: b8df95ca983f4ef3ed0310b244f2f4318d6761564140cec095a16e023976354d +884: 3d09aad047499cb54bc9fdb4f634c09beff93422db01f7b8498d90493c32a21f +885: c4d2a3d1bb94a37768b512a87edcfa56c00cae560b74c48e46ebab9ec67955f0 +886: cd5728a9edb6066bcd9392114a0f18f4c70ccde8d9c24f3b459930c19e95e506 +887: 743b81138452ca16e51747a1662402ee0d9eac3550011931aec68a63727b6894 +888: ec0de7ecff31949c1922903825b76e67cf27c61d8fe100a5d0af52445aceb262 +889: ac98c3e8d99163b7c3f81f263468de61cd19cec791164a1a38ce0ab440aeb324 +890: b4bd0129e6cf5223eaacc456653fc43936d376d90abcc0f08604d0cb7eeb72c9 +891: d3ef730208652e44eb49ecebd0a0e0dd885e9ae13e608c2ea15690be6b0cfabe +892: 0cb39c3968bcb3d4df407cba298c3fdff967e494effcd9f4fb4dcf846d0ef7f3 +893: df067b52d70efe10ee799741354efc807f4cf323c6199ffa3006a89820196fec +894: 49c36112b26485e2c4184371937988ca9edfc53d0055ba438f7ac8f7466f4ae0 +895: 779075e7ba4d73acfeb8b00f20f03ecac57bfc4db7d907c33f65c10a65de890f +896: c9c078d711266ffe91f523384168b90f1bd00efc2da110778b9cba2f0871db49 +897: 4f2d2969f130c86498c3d4452a9769978990feaa3068bb338474e2063fb47364 +898: a84a2762530ef03398c4c7f4c456364848d91201bb0cb122ff5b18e9e39b0e23 +899: 8ec0cf65d1b765c086dde69a3ec04bc425342a4bdff439058440bb8958fae5f5 +900: d30cfe6d61b9fd4b017d6c9d7d9273e8418d0ae9b8fde5ae767ac80a6ea21901 +901: 3fcf48533859c643a0396c0b597dd9b3802d52c823b5fc9b76e6880fcfb840a8 +902: a5896436484d5efd5a74b8f467a15ad21993f411f27a262912940d4d85e2aaaa +903: 70dc9ceb90614f80df7c9c113b13307d71a4cabb766d09623d28383fa000f8de +904: 5acbfa317c6a381e91ac6c4e856cf341d8d017b6c4f378b2f283ae5fc683c9f7 +905: 2269a8c37a0489ce983f89e5610a5c992b010e9663ed854bc85826c5938ea65f +906: 9a759ebb80007327ca50b5d2d0c48a62ffbf75130b942f9ee05f33d69c997361 +907: cd625ce6c86f80cdae5d4256307200055674905dc4d97f93146ce60b4fe7f4d6 +908: d5735fffa3c594d447ae869b6f97df71a8437a7beca74b7c1b7ab7cbee131122 +909: c6997bcd287033749df80813acb98039278ddbf4a56896a3c4c852114b3d4a22 +910: 93cccb0ecb7988e965cc9efc6d7ac1ff834fbc10be6fda4867ad75c51744138f +911: fbf47e7817a7ce0c3bfded8ea030550b6d6f6de53e103878111f101e49f9445f +912: 5c89a1c644d89f7acebb9b1f9ce51a2ccee9ca212dd8adfa0d610baab3186167 +913: dc28c7d675adfe5a1a7c69400c3dbf5b38332050e4317a1cbdb275247262ca53 +914: c1cb82bc179b22b3a5d9f0355da80ac050236bc73248ec93b8dbbd053298aad2 +915: 5e6e7c848d5df0cf67b72e28e216483216fe84e5d4fe37317369c19603cf0bf3 +916: b19c2c5c2b1a45b6bce242c9aa9adff56affb1f88be4a2645cf76c42f46c7847 +917: be55f3c6e3b22eaa9c1865653a8c91ebb7f414f9a12cdbfb62938945dbc36ab9 +918: 1f32898862ab8d7bbd37d472f0c7eaae7fe2f084f8fd45f05dcb764ca5b600be +919: d07488ed1439a7213396a1ae28886ffa5c4d3cbc74c175cf375402f56988e15b +920: f0b8e66863472f11e758bc94d8a98ee308e5a05490e5db4fb66e1dc09f4e52a3 +921: 67d9acd2df48f467b4f7a84f760730a92c635e928df5621f6afdeed3e195d3d8 +922: 848e6416b52a2ff5c7d7a5e6eed3416c1deef9584f60a5f6c3a2854f0a501faf +923: 5f07bf7c71d71b0cfcb5fe04fb2f1f8a950673754dec4e816ca84f82e663a9e3 +924: 154aedec1b966263e4151b44a8c438bc5f81de0170229bcc20c20f80d85254df +925: 91707a58602431d402edc2258eb703be7603528faa3fc6fa0f6b1e6a4db7c234 +926: 8210b096d070cf4b23238373eaa334784226d472bd5a75abc4bcd512cdd51553 +927: bb818b548724ecbfc298a06c732ac64a20846953ed2eb98c452948c764b4e17e +928: b590d8e03bfe80fd84cd64c1ccf606e75ad702eafaf5353e72e38481f7c3d3b9 +929: 571308cd156b690c3b03a9f857c3b14d91124895a73a2fa041d3039c58468b36 +930: 5470e7f92b880ade0fbada76a0c06d5da0c38e5569c59c11689422144cf3e368 +931: 0584120c3727f510f276d173e1fafbcafeb3fed34bb6639d477db27a7e307d86 +932: ff177489756c5c08e42a9257170d31de9f5420056514c5a6c9ac00c5f9aa04fd +933: 826d14a8ec2b8611009cd1507b8df8c8796889cfe9555db9a8fcc930ef5ee609 +934: b11bb13741a897d8d52f29e0720f1245c25cdc78af34d1b66818506989f63df7 +935: f29205e421662f14d8d93573d326f3d7c98df9527f3a011853e309830b24053a +936: 4f8f5839a9c97e8e6b4661232ce36d14727b4ba88cc07e22e58f3d0792156737 +937: f33b892df0aa30cd76a13fd6250efa01548e47b91db7817c12839c3fb8075b90 +938: 3dd1d304670e333bb982b78ef90eef332b7ab56badd527efa371db1d72a0c030 +939: 456f703691bfa76e0267c4ca9000993ff4ac6daf118b852dd6c763354f1dc1a1 +940: 88f1827525c56fa450ec069a75af48a66c60dd82d6936b71bdddc33bd70882ef +941: be043aa1646c1429738dc5c134672819b6696e79be9c7a98de1afa0d907e09ab +942: c58f652f83e42206e0495bb43b7104849dcf0d4e4ea288ceaa8d221929048209 +943: c0a5542106b07172680af9cf134a8dd6c6aff11b334cbe5152a64d14f97ce5d3 +944: 90cf70305c87a86ae7cb3584858b09621896b6b902bd0f835afe776c0ab3575a +945: 623b58198f6f8b60a5291d1564715f6c177ed6a9795f6a22aac34769d4b781aa +946: 2eca286f8e943a0eb575a8aa472ce251c4a06e956031b9061871726319f33a9d +947: a187c87507d00d8e121bf22bd3a5381cff980a33db532fe1931aaac261bfbbcc +948: 2d1802473442182f0d2268ba7c9bcb6d2343db00d1bc7cceefb05789307387ff +949: fbcfc7d9fa122f09082876a7ba52b087553e5e434536ae272900531d9fd7c5a0 +950: 05fae880424e2b6896c06c0868b7516d04a20addee4ae06d7dfa3d2e8528c23d +951: 556a1aa2712f77d0e29e84189b1907c14ff74a242284eb8d8fd81ff4c9a24d33 +952: fd78fbe54ab202e7f63e87950e60969fe6c6ed0b5b5b9f1a6a64f8f6629263e3 +953: a72ac6b1f94bd82fc1db4d0df37b3c328282bf702a2e80bc6b443319c3127446 +954: f43267b1413f6687a0fc6919f4992920d1a74f3ea43fc087c815f6e6066d1887 +955: a8edc9db69f79246cbb57c2b2996c14ae36a4802074f650e93a1fcac77a259bd +956: a59f159a23a1505a09994c298e654afac0c8d6e2f3f783069a49d8f7f3a8aa5d +957: 665c8ccb1d3c8114ce342ca49cfcc967d166739db626413d42d55b8d2714bb31 +958: 5295ce9d52528268bba400d07d3f7bbfd85097c9f69aa1c58fb4c0201a974851 +959: ad837aaefaed57256edebe44e09dba02d6810244b6a765deab4da65906785f5a +960: aae3fb65120676a8756456c8e56846efc89acac7eb2500551446d8bf00e0a75e +961: 0ac1cf7e1bc2d02b05386342d8bdbf58a7c62976df7190f35653aa8daff30ccc +962: 05a4b48144bed7422054a947e7efa5a1c1517478b9ec633e449a8cc192dd2ae6 +963: d495cb49245a64f0c098e355584ab22e496f551c6db141450d4f2d5473abcc44 +964: 8873017ec15e2ab8207cb9e54426dd670a3beaab33db805aa01c1779cac20e72 +965: 0ee4c3502941396bacf4d957519d4ef4a4f692c582c6c2344fdfdbecde8275a1 +966: 2bbc9539dd2ecf542d36dad04808145ab85640a14ef9d5ac272485bd8f4144cc +967: aadb52646899d16bf8149a8838b15a8e4071d3d2499f38c1fd347931d7e99097 +968: 3a36bb3c62181f1906ced66e0aa9090041e1783c85b37008fd91429becfe1c27 +969: d0949593b37749c149f865d0c1feb635a51b6ab2f1534e4b9fb0e93d9650ba71 +970: f7ef0b7a549a0d3949bdf395deafe817e91cd8a1a7a7ab54c0b592933368b773 +971: 0000000000000000000000000000000000000000000000000000000000000000 +972: 74d5f9b29bad60571c3b13b4374b5d9e2d2c2104e5b8b08a9a46697c4db26cd4 +973: 12523e5f97e8d85e409d8fce5a730c6f32cd05a69d607ef3f0b05c58b52265ab +974: 1a987e6dfb4a4343370a8fd5bfcf192d3374a4e5480108021180e03ef37fc6ed +975: aaaf1ce8d227164a535129c4d6352005520d4f2f5946ceb6ed8972453ad67fa9 +976: d25e2c85bca0ef83a141227ef2c9886d07e86d6b1c40e3f7cdd14f84d1e92fe7 +977: 37471a4ccaf0071fe0f3c31281b44b8197e8ef9e7301c6f53184f08ef63c5d43 +978: b0e16ba5daa317c063e157e75d42de05927a58054e3737542fc258a3cfe4070a +979: d4c184e0d658a3e24a7d25a7100ce03eee215547c335844f2d8cdb8a2b1a9e79 +980: be055df17f2d7082f4647dc4099f5c0585efcd6423a40551ee589255ad984991 +981: 09caa9af48d02c98ff7107153b1fc380af3fb9d3f00a8091cc8336d84f859ed0 +982: 67b2ca10f46e731cc00097205087b5c16d60a29ca1cbdd8f1a375d8b6fa60d78 +983: 0396ba72836444de8f0c354b8a938395b670eac515fb224a6b073bbf10bcff16 +984: f77dd049a4f6d078b810af3e0ecc9f76dcfdbea413dfcd709a1f86c915c392b3 +985: bb76a5acb950ca6fb0115097b948c3b7e928498cca4bc65e1ae7c45023642bf6 +986: 45f58d18384049501fe1cd351e3bc7f612a548ff7ca10be59a9795dc07787dfc +987: 70a5ab10d8b77ba8d578bc4884c50a62a31aa53a07f81688b3658f4eb9827ff8 +988: 12de07ccf3b01dae39ab693a24b5560637aba81ab72a47cd5885beffe831cdfd +989: 8f8ac84a0b4a8f21728fe04236aa7c703f4ae180887faa7c35855a31d8424583 +990: 523110a7ecc629c613b459c83788c9e66897d5d2e92529c4dcb6d45003c5ea7b +991: 465c58b36171c47156ac95d570671a4f0a68237404b960b0517a94b279434ba4 +992: 6fb4c0905e1cdf34e70a2be73e3ab7e48a687efa5f8dce261bedff93011c639d +993: a316920e76d547f001de8e1e4f4efd0bb4801dd6f453e03f6f9035055ff67de2 +994: 95616eabea52bee828193c8de7e3f442164295a0511bdace71109df206cc51bd +995: f57edb955a21ee7a7c1df5ee6c6b307796ff6bbf702ac489077e847d9f589405 +996: 84f6a4e89e73f8ae45094c8566e93b60c51e02105e2ed07789e761adc269e6ab +997: 2102a6c04cf648e73c7bb78660a8b6554c97e747a89a2a88ba8666e289399a24 +998: d7224aa3f93a0f23514e696c3ec982b780f9c4c50bf7b302734e4ac440ed0485 +999: dbd4d0cf3b068945805d85244cacec331f1ef1bce5e679d353e1b95d5559a07e +1000: 1a888206971be51a4535e1a15d4696b6ba4425fc1083911f274d748876549179 diff --git a/includes/hash/sha256.h b/includes/hash/sha256.h index 49404e3..4faebfc 100644 --- a/includes/hash/sha256.h +++ b/includes/hash/sha256.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/08 13:15:42 by cpieri #+# #+# */ -/* Updated: 2019/12/11 12:41:34 by cpieri ### ########.fr */ +/* Updated: 2019/12/23 15:50:48 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -57,7 +57,7 @@ typedef struct s_sha256 } t_sha256; void *sha256(void *data, size_t len_data); -void hmac_sha256(uint8_t *pass, uint64_t salt, uint32_t c); +void *hmac_sha256(uint8_t *pass, uint64_t salt, uint32_t c); t_hash *set_hash2sha256(t_sha256 *e); #endif diff --git a/includes/symmetric/pbkdf.h b/includes/symmetric/pbkdf.h index 525857f..79a5a2b 100644 --- a/includes/symmetric/pbkdf.h +++ b/includes/symmetric/pbkdf.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 10:11:40 by cpieri #+# #+# */ -/* Updated: 2019/12/11 12:39:32 by cpieri ### ########.fr */ +/* Updated: 2019/12/23 15:51:00 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,7 +28,7 @@ enum e_prf typedef struct s_prf { enum e_prf prf; - void (*f)(uint8_t *, uint64_t, uint32_t); + void *(*f)(uint8_t *, uint64_t, uint32_t); } t_prf; typedef struct s_pbkdf @@ -49,7 +49,7 @@ void print_pbkdf(t_pbkdf *to_print); void free_pbkdf(t_pbkdf **to_free); void free_vpbkdf(void **to_free); uint64_t gen_key(uint8_t *pass, uint64_t salt); -uint64_t ft_pbkdf2(enum e_prf prf, uint8_t *pass, uint64_t salt, uint32_t c, uint64_t dk_len); +uint64_t ft_pbkdf2(uint8_t *pass, uint64_t salt); void regen_key(t_pbkdf **k); #endif diff --git a/srcs/hash/hmac_function.c b/srcs/hash/hmac_function.c index c880524..8f29bd5 100644 --- a/srcs/hash/hmac_function.c +++ b/srcs/hash/hmac_function.c @@ -6,11 +6,12 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/11 12:28:18 by cpieri #+# #+# */ -/* Updated: 2019/12/17 12:54:53 by cpieri ### ########.fr */ +/* Updated: 2019/12/23 16:58:11 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "symmetric/pbkdf.h" +#include static void *hmac_xor_u(void const *u1, void const *u2, size_t len, size_t size) { @@ -27,49 +28,63 @@ static void *hmac_xor_u(void const *u1, void const *u2, size_t len, size_t size while (i < (len * size)) { u[i] = u1_cpy[i] ^ u2_cpy[i]; + // ft_putbits(u1_cpy[i]); ft_putchar(' '); + // ft_putbits(u2_cpy[i]); ft_putchar(' '); ft_putchar('='); ft_putchar(' '); + // ft_putbits(u[i]); ft_putchar('\n'); i++; } return (u); } -void hmac_sha256(uint8_t *pass, uint64_t salt, uint32_t c) +static void *hmac_sha256_i(void *data, size_t data_len) +{ + t_hash *hash; + void *sum; + + hash = (t_hash*)sha256(data, data_len); + sum = one_sum(hash->h, hash->nb_word); + ft_memdel((void**)&(hash->h)); + ft_memdel((void**)&hash); + return (sum); +} + +void *hmac_sha256(uint8_t *pass, uint64_t salt, uint32_t c) { void *data_to_hash; void *salty_pass; size_t salty_pass_len; size_t hash_len; - char *sum[c]; - void *f_sum; - t_hash *hash; + void *sum[c]; + void *f_sum = NULL; + void *tmp; uint32_t i; - // ft_putstr("Pass :"); ft_putstr((char*)pass); ft_putstr("\n"); salty_pass = ft_memjoin(pass, &salt, ft_strlen((char*)pass), sizeof(uint64_t)); salty_pass_len = ft_strlen((char*)pass) + sizeof(uint64_t); - // ft_putstr("Salty Pass :"); ft_memput(salty_pass, salty_pass_len); ft_putstr("\n"); + data_to_hash = ft_memjoin(salty_pass, &c, salty_pass_len, sizeof(uint32_t)); hash_len = salty_pass_len + sizeof(uint32_t); - // ft_putstr("Data to hash :"); ft_memput(data_to_hash, hash_len); ft_putstr("\n"); - hash = (t_hash*)sha256(data_to_hash, hash_len); - sum[0] = one_sum(hash->h, hash->nb_word); - // ft_memdel((void**)&data_to_hash); - // ft_memdel((void**)&salty_pass); - data_to_hash = ft_memjoin(pass, sum[0], ft_strlen((char*)pass), (hash->nb_word * sizeof(uint32_t))); - // ft_memdel((void**)&(hash->nb_word)); - // ft_memdel((void**)&hash); - hash = (t_hash*)sha256(data_to_hash, hash_len); - sum[1] = one_sum(hash->h, hash->nb_word); - f_sum = hmac_xor_u(sum[0], sum[1], hash->nb_word, sizeof(uint32_t)); - // ft_putstr("sum: "), ft_membits(sum[0], hash->nb_word, sizeof(uint32_t)); - // ft_putstr("sum: "), ft_membits(sum[1], hash->nb_word, sizeof(uint32_t)); - // ft_putstr("sum: "), ft_membits(f_sum, hash->nb_word, sizeof(uint32_t)); + sum[0] = hmac_sha256_i(data_to_hash, hash_len); + printf("%d: %s\n", 0, hex2sum(sum[0], 8)); + + data_to_hash = ft_memjoin(pass, sum[0], ft_strlen((char*)pass), (8 * sizeof(uint32_t))); + sum[1] = hmac_sha256_i(data_to_hash, hash_len); + f_sum = hmac_xor_u(sum[0], sum[1], 8, sizeof(uint32_t)); + printf("%d: %s\n", 1, hex2sum(f_sum, 8)); + + data_to_hash = ft_memjoin(pass, sum[1], ft_strlen((char*)pass), (8 * sizeof(uint32_t))); i = 1; while (++i <= c) { - hash = (t_hash*)sha256(data_to_hash, hash_len); - sum[i] = one_sum(hash->h, hash->nb_word); - f_sum = hmac_xor_u(f_sum, sum[i], hash->nb_word, sizeof(uint32_t)); + sum[i] = hmac_sha256_i(data_to_hash, hash_len); + data_to_hash = ft_memjoin(pass, sum[i], ft_strlen((char*)pass), (8 * sizeof(uint32_t))); + tmp = hmac_xor_u(f_sum, sum[i], 8, sizeof(uint32_t)); + ft_memdel((void**)&f_sum); + f_sum = tmp; + printf("%d: %s\n", i, hex2sum(f_sum, 8)); } - ft_putstr("sum: "), ft_membits(f_sum, hash->nb_word, sizeof(uint32_t)); + // while (1); + // ft_putstr("sum: "), ft_membits(f_sum, hash->nb_word, sizeof(uint32_t)); + return (f_sum); // ft_memput(data_to_hash, salty_pass_len + sizeof(uint32_t)); } \ No newline at end of file diff --git a/srcs/symmetric/pbkdf.c b/srcs/symmetric/pbkdf.c index 8216121..3cfbbc9 100644 --- a/srcs/symmetric/pbkdf.c +++ b/srcs/symmetric/pbkdf.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 10:10:43 by cpieri #+# #+# */ -/* Updated: 2019/12/17 09:24:03 by cpieri ### ########.fr */ +/* Updated: 2019/12/23 15:55:01 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,62 +19,17 @@ static const t_prf g_prf[3] = { {0, NULL} }; -uint64_t ft_pbkdf2(enum e_prf prf, uint8_t *pass, uint64_t salt, uint32_t c, uint64_t dk_len) +uint64_t ft_pbkdf2(uint8_t *pass, uint64_t salt) { - uint64_t dk; - int i; - void (*f)(uint8_t *, uint64_t, uint32_t); - - f = NULL; - dk = 0; - i = 0; - (void)dk_len; - while (i < 3) - { - if (g_prf[i].prf == prf) - f = g_prf[i].f; - i++; - } - if (f != NULL) - f(pass, salt, c); - return (dk); -} - -uint64_t gen_key(uint8_t *pass, uint64_t salt) -{ - uint64_t new_key; - uint8_t *tmp_pass; - t_hash *sum; - size_t len_pass; - // int iter = 1000; - int ismalloc; - - new_key = 0; - len_pass = ft_strlen((char *)pass); - tmp_pass = pass; - ismalloc = 0; - if (salt > 0) - { - tmp_pass = ft_memjoin(pass, &salt, len_pass, sizeof(uint64_t)); - len_pass += sizeof(uint64_t); - ismalloc = 1; - } - printf("Debug: sizeof(): %zu\n", sizeof(uint32_t)); - sum = sha256(tmp_pass, len_pass); - for (int i = 1000; i >= 0; i--) - { - printf("Debug: i: %d\n", i); - sum = sha256(sum->h, 32); - new_key = (sum->h[0]); - new_key = new_key << 32 | (sum->h[1]); - printf("Debug: sum: %s\n", hex2sum(sum->h, sum->nb_word)); - printf("Debug: key: %llx\n", new_key); - } - // ft_memdel((void**)&(shasum256_pass->h)); - // ft_memdel((void**)&(shasum256_pass)); - if (ismalloc == 1) - ft_memdel((void**)&(tmp_pass)); - return (new_key); + uint32_t counter; + void *sum; + t_prf prf; + + counter = 1000; + prf = g_prf[1]; + sum = prf.f(pass, salt, counter); + // printf("sum: %s\n", hex2sum(sum, 8)); + return (0); } t_pbkdf *new_key(uint8_t *pass, uint64_t salt, uint64_t key, uint64_t vect) @@ -89,10 +44,3 @@ t_pbkdf *new_key(uint8_t *pass, uint64_t salt, uint64_t key, uint64_t vect) new->vect = vect; return (new); } - -void regen_key(t_pbkdf **k) -{ - (*k)->key = 0; - if ((*k)->pass != NULL) - (*k)->key = gen_key((*k)->pass, (*k)->salt); -} diff --git a/srcs/symmetric/symmetric_parsing.c b/srcs/symmetric/symmetric_parsing.c index 9633379..a8176d1 100644 --- a/srcs/symmetric/symmetric_parsing.c +++ b/srcs/symmetric/symmetric_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 12:04:37 by cpieri #+# #+# */ -/* Updated: 2019/12/12 14:13:55 by cpieri ### ########.fr */ +/* Updated: 2019/12/23 15:56:04 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -49,7 +49,7 @@ static void check_pbkdf2(t_pbkdf **k) } else *k = new_key(get_pass("enter your password: "), 0, 0, 0); - dk = ft_pbkdf2(HMAC_SHA256, (*k)->pass, (*k)->salt, 1000, sizeof(uint64_t)); + dk = ft_pbkdf2((*k)->pass, (*k)->salt); } static void get_sym_opt(char **av, int *now, t_opt *opt, t_pbkdf **k) @@ -87,6 +87,7 @@ static t_opt *get_sym_args(const int ac, char **av, int now) now++; } check_pbkdf2(&k); + // print_pbkdf(k); get_sym_stdin(&opt, &k); return (new_opt(opt.flags, opt.data)); } @@ -97,6 +98,6 @@ t_opt *symmetric_opts(const int ac, char **av, t_opt *opts, int now) new = get_sym_args(ac, av, now); add_to_end_lst(new, &opts); - print_lst(&opts); + // print_lst(&opts); return (opts); } From 4cf165b8912d57a5aa5bd4e30137367bfe24b1dc Mon Sep 17 00:00:00 2001 From: Louise P Date: Mon, 30 Dec 2019 09:09:56 +0100 Subject: [PATCH 52/71] [Function]: Create the function SHA1 --- Makefile | 5 +- hash.1 | 1001 ----------------------------------- hash.2 | 1001 ----------------------------------- hash.3 | 1001 ----------------------------------- hash.4 | 2 - hash.5 | 1001 ----------------------------------- includes/ft_ssl.h | 3 +- includes/hash/md5.h | 10 +- includes/hash/sha1.h | 53 ++ libft/Makefile | 3 +- libft/include/libft.h | 3 +- libft/srcs/ft_left_shift.c | 18 + srcs/hash/md5/md5.c | 11 +- srcs/hash/md5/md5_utils.c | 10 +- srcs/hash/sha1/sha1.c | 110 ++++ srcs/hash/sha1/sha1_utils.c | 72 +++ srcs/parsing.c | 3 +- srcs/tools/usage.c | 3 +- 18 files changed, 282 insertions(+), 4028 deletions(-) delete mode 100644 hash.1 delete mode 100644 hash.2 delete mode 100644 hash.3 delete mode 100644 hash.4 delete mode 100644 hash.5 create mode 100644 includes/hash/sha1.h create mode 100644 libft/srcs/ft_left_shift.c create mode 100644 srcs/hash/sha1/sha1.c create mode 100644 srcs/hash/sha1/sha1_utils.c diff --git a/Makefile b/Makefile index fb06d60..8db8e31 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/03/15 11:20:25 by cpieri #+# #+# # -# Updated: 2019/12/11 12:37:26 by cpieri ### ########.fr # +# Updated: 2019/12/30 08:54:04 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -35,6 +35,7 @@ DEPS = Makefile \ includes/hash/sha256.h \ includes/hash/hash.h \ includes/hash/md5.h \ + includes/hash/sha1.h \ includes/base64/base64.h \ includes/symmetric/symmetric.h \ includes/symmetric/des/des.h \ @@ -57,6 +58,8 @@ SRC_NAME= main.c \ hash/sha256/sha256_utils.c \ hash/md5/md5_utils.c \ hash/md5/md5.c \ + hash/sha1/sha1.c \ + hash/sha1/sha1_utils.c \ base64/base64.c \ base64/base64_encode.c \ base64/base64_decode.c \ diff --git a/hash.1 b/hash.1 deleted file mode 100644 index c554875..0000000 --- a/hash.1 +++ /dev/null @@ -1,1001 +0,0 @@ -0: 85dce2ad6ba50a0ec4162ad0598336517ad73f10e8ee16192f5fa0d6111415c0 -1: 967af4d7613e63ae6cd2f05df12e2c8d125f5128ec07521a6b313c24a15310dd -2: 7eea68f7007f367e09493c70edb150fdeddc16ec56123253516696900ed56fe4 -3: 4fe640d5106f16b6ee464b7c21da1e3c3e0223b407d0c6a3639230ef65f8e309 -4: 3632c69123a4a7cc5b4b45ddea2b1572ec877943d058dbaeee0d7fb02a64cf0f -5: b3f14807af541756e10a3cd81e812ee5d51505baf6421dfbf2810facee611c94 -6: 19fb1cbd59d7ac9b370488d9a55c1fdc79c1d8b8e4acb8607b5347b065ccd4d9 -7: 8a23d1395d1eaedf268b56ff978bca521a82c13a471adfeb85376220436f6be0 -8: 5abceb6e6598736cc1b81cb10d644d95707803988559a5d34e97b38c7ba6b61d -9: eb44cd7554093a31e15f13315c88303f9cbcc12c260c1104aaf2f7d322a4cd75 -10: d3296f612c32fc482c190825523af7c53561ab65e53a89a9360146ceef7592f2 -11: be3e464b70ac3060f456aabef84f770cb61c597c34b449588578544a3e319724 -12: f2481bdd304361d3366f8b47d030181ed574be70ffcaf2e46bbbcdd9fca86f88 -13: 9d8806d808ffa4fcb20dd8c6e83d76261579d4d55dbac5fb45c843704fc853d9 -14: d7154bae8ec7256fc5c6e69689642a2be5a4050223418a6fb42a069665c1e8ae -15: 9d508212c183bc60199bc8d452ee1410341269e486d8887e6b873309bc07ae1d -16: a998b3bf8609d89a750522039413c31b67e4d8ad5bde96f8676fb845257c77db -17: 267512254d3df3188031b77dae4378f1b2cefbc136777e7ff450d9249dd7631d -18: d484670f6ded2ba8f3e1a926b25fd9df59f6c57b5a7ef6ae528a82f6fc096f39 -19: 8a9694e39a0f7597a517c9ebc0d29aa47d38ba488289433caa578c31dbad4d87 -20: 8ec179071c95681b40b81cfcb878cf30388917844b8cc0a70106646a2509d54f -21: 5d6d37a33541f7c27460408529d4a2011906d4dfe215fba1ba654a8d0e57d522 -22: 2d493b9694a77fa55453ec259182ab55de0b504d9358047d5d8dae34df779fca -23: cf99972160728ec412d836ca2f9d0af86b74d6bbd46e9998f941d1ed2fe3032d -24: 6a44bd9e825c146850a76356ba47e62c71420a6f7b3108b62d58640290fc27f0 -25: 534294e4cedf8630d14b0ad75bc732f6e02aebae0c4d72de37592deeab493d36 -26: c99fb8948e39addf22fe084fd260e2c7dbacf6dd0ae5631ad9da1b8f2c887774 -27: c55f039a282306e34d74b1d3d4d79432caada63ce94a20e18ce1e3a1047b5c75 -28: 0e1d4f3dcc82aad407948b3bda370dbebb3453be9445ee746c31b6a6e29f834d -29: fe1e351a0405674718d2731949970188891e60a22454162607cc331bf0250925 -30: 49fe281b7e21d1f12cc071368359f07e9022d20d0ccad6da269d5c06e08985b1 -31: b22666b1f8fd1ecf1a73f15132f95492ca95556e2724d7c83d62c61229365534 -32: 42e4a64c2302db6677e55397e081b3b318db7372b648920f8a37780ab1cd3ce6 -33: b16a21a8dcad9d14d1c9f206d8da2f1bed1827b9c27570d8f762a42ea324abe5 -34: 841d5e62b2baf1bec33817a764e76447da91c3ec3bb76c71aa7b843fe742dc56 -35: 63e2031c2ba2de22f57c078f30ee466224aa9e645955c4d7c9f33cffa0b04c5b -36: 57b3d4a9b99c5b30bc07aba0a104dbf6323919c7829316af44de717606674d6a -37: 52cc02a6c375c8661d5ae7640c12d4a99d471a68a8adc24c4b7b775faab15519 -38: b74dd5dacb02d8991de0d890f28e9d9541728458897f185ea2ee461edbc862f1 -39: 00eb716f16f532d8cd216c2381045a03600cfdcddb5cff899327872d1e4c56ec -40: 62d17a5c7852291a20954e947712d9190124962c82c25de397e392d998096f4c -41: 3651989b89c2177d3dafa548696e28f4d158304424395c2f96b5268944f60c38 -42: 97c011124265b78962504cf4c57b701c47e12c5509d42b239496e39613e62e33 -43: b2650e0fe7cafd2f753baa4cb4b9130cbc42b1ee98beed229003ab5e6f6629db -44: b0890007bcf10bd94da7a0b43bd64da4205665e70b3bb9c1f6e7f72199a1f0eb -45: bc342e0606491fe6a11cf901b41e872c2bc532af5cb8bef2a93c80e87b29061f -46: 320f03dac702ecd4f942b33805944e1419f22325a956d61afe35dc224b252cce -47: 14fea152c29f1198c1f60f5e5937dd7c875a3491728043210c784feae9484426 -48: 646f5ca122eb0bf206c1481c170ab7a003b220e66c838dc8d67e71244337f7c6 -49: 9750f6ad64bba9df8824f67d75d37d0c0ee31ae765e7422f226ae9542492d82d -50: 2a41aae9491dc68e12bea51a9662ee0c0b6c485947189e075f2ebeaffeca6c41 -51: 77d710e29edcade288ed971d0de133c54f5846f3f663d22232d684c8d9125652 -52: eaae5db00afaee3de0c3e21655a2cd8368ff7e7dfc0fff64af87312a7eebb0fe -53: 5e9e1c024afe55d81b6ac8557f2867e5f7c378d6b58a757f65ffd81af1aa7925 -54: bcd1508137fb9456e0cd307e405d02ff17be39ec5a8dee6cd0a8219b88c72495 -55: 337bafca56c5dbf80d610b7477a65fcdbaac5b7060b16b5bb295d684c41355d8 -56: 1d3fbeb378a2287bdc5f4a20f1a4328905391f61654797d4710c9247d7e3376c -57: 59721454570ca2b55c09ca70ad99dea88ee5bab0444cc4c957a80b8602e764fb -58: e07829c5b27d55c8ddf75d14ad8d8d25c7dded815d58d67b89f0d682a9e3ac42 -59: 992b6df70082b7fd720529ac7eef352646e6c9f6642e0336080dd5239d6c111d -60: 75fd1ce46bccefcc1cc1680a192dc545c91fb4262f1ac2cd5aeebc9a906e6a84 -61: 4384d8d5cc81a5772d479fa636aae5e750e6006d73dbf06c662e5630cc9f2f73 -62: f2c6049bbd9242d9739f2a408169452a7c7f99e3d44b414ced10361ebbfb9861 -63: a5b666b5b0a2d63415b744a61d78cb7e2a57658e0f5587b75acc75268a7ecc9c -64: 0fd368e2923173329fff18564ecf4e4c3100f9d116bc2e34fc6c43e0f152f789 -65: 6a18f6aef35207192c09a7670854d76313e230450b11c1ae09dcac738ae29a75 -66: d6bca17093abc1619e048ee9c1687161f60db61f5fa45f32e5f413a2211a3ad1 -67: 2b3eed034067549495fb0906972c5d046f53d26fc4f0603ae0fbe216e164d5a3 -68: 287e82c3da770aca0a53f424c4b1392bb1de1178e05dc7a762af59ffb6cb3504 -69: 7dc33c0676c18be0c98f91b45055a39aa4bdb5774d1f3d2b364509117d5199f9 -70: 8ac0505260206de8c3e64a03800aebbe06e20decbb7e1ebb08605fe6e1cd7de5 -71: a5f80ddf555516ef4540fb4882faf398e8113b90dc0436da6ade4e2585c135da -72: ec628bba9ce4d21d7a4e94908bcb93e97b9356322349420f877562f8ab806c7a -73: 8a933684d3b07d9cd9e7a85fa06f2f8fad6585bf00e3749e81a55783a4c33ac4 -74: 61471ee903ac7f8383b5fe4f06d17b3d6776bb86338e6bb4d8d4661d22a0db94 -75: d21c9f3f385090e34b25b021a4f89881c4cab9025c6bd07ea496811d55cab4f5 -76: f35ab97584d028e267ede7aa6810439130e9af020f3fba217b5f5f05f0b3fab6 -77: 1eebd15a4b141e3c57282e69f9ab7c9a26e027e97cb969b30a81cf2aedbc6d5b -78: 0d3601637e980370f233a99fb26df1698db1fa8f6ba08b17fc5981da1a0a9c4b -79: ea5e9db8b0d525e61a8c2f4222f0e234b5d11956968d75fdad29ba729c31c30f -80: f82393ee4a0e993afbbe499096b86fa9e38e9365ce39bf637a66148e563a7562 -81: 877c9e5fe589356a397ad27d41aa6c266575a3fa7b1041f780c9fd71e38a59b9 -82: b594a19913145eb74196b03b790d1166a3ee5483c4056bffecce0851f0fa62c3 -83: f4bd80926351cc2adb02a3987be946398cf90b02a73c30a34142ee9cf4e6d6b7 -84: 6554661e3bab5d0cd67a4aa12f851624fb59a37f76d67dc261f91dcef4e99f56 -85: 9101f3a09b1e2f4164e324c3a9a6550966b19f8f15f35dfaa7e5d5880c97c434 -86: e3a8b17948e7d9a6073d7f7f3dd324fe558115b720a1adf4e5ee5277245cb183 -87: 7285be9c5b90c66c3cb2c7aa23b2614c9acdea964bc8695a1428fc714976f812 -88: 47104b5c6fb4ec27cf85c1a3e22fe631928538b6e39a7c4a8b19fa216a965155 -89: 3e7bf9add688476395fb369d0b51854f13871e6ab911220f4a2c35bfc82fbbce -90: f5384db8e17f02eec498c8688e9ddcb9927d698f969d398ca3777daa53c63d1e -91: 52939a46ed816e22e051aa8cf603b49fe12db3e14fff5577ee5fa709bba0e246 -92: 5984cc844cee6f30e28a7a4569a303aad5fbc647eaef45532ee2a3a4f3e334a6 -93: 60795ea26fa1124808272d8fa41dd10b04dc832aa2a4b29ec2a67d0aee8326e4 -94: 096f2ebb8dd1a655df783e6366a9826e8d2cbb45a863a2150126048c4a3bb422 -95: c02e2508f4ecc02654973ab7bbc697356b244e2064711d32034f41ec6c8010f3 -96: 399bb57ef99b37f9bf110c800857479ff5a4a6d615c28f1ab2e6b135f241f63b -97: 538146e200b04cb7eee283bf11c622f487b164b45aa507997076c1a714bb7037 -98: 634f3e4040a82fdad1c2f9986856ea84a29c11b780832433c72f53c38a9989e8 -99: 857ac7b15eacd88adc2aee1935d2deb1613a4fe6a07ef321b31d6459205efb32 -100: b9c18f78c6c126d024475a4cee31c86823a9b78948913042795324847c2ec260 -101: 4c21bbdc6c098799cc054ef6e4363ac809913ff273528755ce091fe8cea5dcef -102: 3574bf8d1624d866c339e7b58b4e4aa2437ab5792ec3a18c2ee3d6bdc0ba07c0 -103: 3ad028b3670b7e0df2031fabd8816516e19e10bf06babc5eeca48d80800f060c -104: d356b9a32be6600604ffe9e5c80943300625d89cb3834dd8b2cb1518b681991e -105: a330970603e32bea86778320be1fb89c1553c3c0703236a20d9ffb03f39e451b -106: 7d55c46d31de40187a5d9a1b82626c44fdd05dc92b8fe8f932a1cefbf15803db -107: ddd8827353b8b2cdfadf52c65201808e31586795fa5086eb04fabc3be56cfbea -108: 7abdf987458b0916a6ca6585ff616e6b5d385c0cd31dbdc66c6c613d4ec6b444 -109: 7bcf2da4858bf72820343567b4e27363c0f9c4576fca736fc12446637b04056c -110: 5796ddefaab6e59164723c4bc81d4d4044c25e4a5ed3e6982c3068394be6e765 -111: 50ee47bf8ca763c2d71db5251497889abd6bddeef350d774c8561791a42b8d3d -112: 78772ed96cdc0df15f826f62d72e1f0a9bace9921ae6880b157afcf12d2c5c62 -113: 0b3d2afe5cd8da4d61dcf951afa561b368644812a367d72c14062a189ff48b2b -114: c3ee44bcc9467d6eaa38f23bd58cc345cb6027af6c35fe101e72cd7d8f20ca79 -115: d85baa9f673ffb8ee642a26cc2eed5b2f7cabddcc1e3a57da6d25a9ff21a7ba8 -116: 22f6b3d8c00d5f6ab92583848a14e1b7ef3b7c183a26ffdc4d8bff0ea45d40c5 -117: 725b763fc442a935187982ed76d0579dc8dcc03f6d5247b8163e7d4f2d4df8e3 -118: c68d4f34319edc9c6be7fa9c2be8ebf71a3fe18f04e4b0adae0441afb2b04a85 -119: bd380ee1173ca47965d6d1bc350a2890063bb80253beda787d04129d425c561a -120: ab3069c2af2f4fbde79b2bcbbb407a7e7ebba04b9d479a61f12d6d381fb616bc -121: b5bef1a995fa71e6c391e0ebcea3d5b004c09d20b859040045a3ce5bea9538bc -122: 7cdee81258a876cc3396fb581e98fdb336dd1950a201655b45d3e79320162627 -123: 2fcb8b25d17eaac4370ef0a188e6666bbf966176b647b174fa9eecf2abec55e2 -124: 2d5324eeca9047ba17815e13e9e46ceaeeeee6b617725e9c24095356292c7540 -125: db01b4b82ae2f9e2757f66ec878a45174f7c23406b046926cd2586a76ef0949e -126: 410742c1ae1d14142d796f4603531e78b30866fa979a4adad4a49e9fdd3364fe -127: 2912f9acbdb4627c37fb1f643f67bcfa73a9fceb2d848ca7093664256c3f7ceb -128: 640f47f565d46dfe065e24cc266855c8b883dac354f25483c628728f8bc23149 -129: 175bd5ab889991582d8554c8a576293bc14be7226791b5352eba5aa3d6434de7 -130: b7f915cf072ebc03361a60e75483d96383bb67bbef4fd6b7a091255d72ffdba5 -131: c547751a862d00e7c5cebf2886e1b7feaae7c3382e80a7d3a306bf66c035b049 -132: 1e38d4d5fca04af54b42e53a1f80025534b915fcb3929cf08447e31a97f8fb4d -133: b4c3f2baab14feca2c91ec75d115d231d078b5571c8d79bc966d5ac7154beccd -134: c4fec2cd994c7dfd7b8525c27bdd42aa6f4bb263006f2939d94cd20d6008a44d -135: 32e2c07f62db8ebcd805a518e471c021b5940689d62ec56cc031045ee9af9513 -136: 3972cf6ee94c3b4701f3fa7fa9f7be130abf7da6559b6cba5d4037ba61ba4b6e -137: 74ccea30243f54b1e99b1f98b1a565fc5bc12c0cb372c0bb347d66df0f5b6c5c -138: d487a1505e3a398fd212c1df23eb124d7f16baea31ec1a8097fd2548d66c9de8 -139: 2054c1791dd0a033f054831b3e1a04a3114cf3f30b757d55115d0982de043652 -140: a549f0ec73a288b97f256153171dcef571008e1e35a9cd8d711393be473db126 -141: 59df9467e37cb4a346b8e12193c6d88e9dd6aed0e78c42372976db0bd4a24310 -142: 068e7dde0bb916b33c20310b8274aef929f2af47fff613f9fa36be085be4b800 -143: a8f28880fb2887738be1ab65dd98670a6cb0ebd89ab1f1a95a63aee1428efe1e -144: 45b277871b78f4591cc67349da916f07a5c2fccab58b12ea7afe4ab5c96d7fcd -145: 15c6252b88e4cfcc42dfc10638d01c080d8ac7759ca2c6e605ead3488b415e9c -146: 2205890b5e8deffb8a7c8270487a08bdae83ba0a823a3d7e98f7593bd80aec75 -147: 796161b2b7c7668c313ed3a4c96c749787d433288650a30a5e20268c5348f0d0 -148: 6d27d2926b2cc062a5eb332a1dd9084dff917d6014eec2b297e89e2ac0b0fb73 -149: 379c422916ddc464d9038edbed5007932a809547c63611a83b4651741f370ab8 -150: d3c26dd08a7a5587b4e5abd4fa55ff01127bbb715182f535a415555009862355 -151: 4366a1b92bbe908968acb1dd2a4e1461bed095fa6bfee3edbad953c5e9bfb1b7 -152: 62e6790aa528480602f628546cc04f828702b5423a6f6d6e7553ae8e8c34274d -153: 2a34e923990ca42a6534f14c02944e9f13d04fc926d3225c372818df47069c66 -154: 7163bf10bb131a014ab065e5170384af8c80cb09a49874d4d459127f09959997 -155: 039dc2b701808a89fbde295e55dff4abd976a508a817cea65b98caf0375ee8ad -156: c2341af85a957814610ede9b39d110910273f0627749a41e82c8249e841dd684 -157: df5638c7eabc9c0fede2341be6b46f003610768b90d15dc235df662cb3ed01eb -158: 31f31fa4ea63eaff1c1b31982a8874408681970fe211c5a68846cf10043a9347 -159: da2bc98b35182b12fdbf81352666848f1562a0b235293012c28489cb04616b46 -160: 21e6e3278390ec9dd492369dc2d5e04da3b393f630bc9a1e47d8ae1173f046d8 -161: 0b0d1d9a3cdd175998bb4e83436c81c1da079e6347c81a8a5d940fe910c145a6 -162: b557f92e62e8316633fd61fbdd8d726e7fb3c8e413eb5411ebd9263973f1ecc3 -163: 022cd2cf5a5a16f28e2d8a65130f70ce12232efff8ec21b97e935b16d7726a2c -164: 48b2a67cccf18b25a005073f244404099e3803c839b929054c839beea3420cc5 -165: 1078303bed2aead2ec811cfa4fa41c3bd4536290e0d690d3d0378124387bcdce -166: 8c6218f83e12015def099c649216ee489bfcf6a86e8c13e2d2eabfb083d44478 -167: 16399aaf5de31a47300043fcbaeb8ea5abe4b9206bf28f648cb41843670be2c1 -168: f64128bd0c936e4f59d172e61dc99dfd85907d14d3e59f0f0554defb246ceb45 -169: 91ea1c7acefe0f3f9d0ff988fce594a3aa9fe943dc38351f282003056eb3d177 -170: 9d3ed59fdc903ec87c8e4d2b1a7fbcd338298bb5aa6f321e401fd388cc5d3a17 -171: 93896f5a03b4aa3eb26cc34bae3124e42e5f661f8811b92ffc0a66964e4a08a1 -172: 5220ff28bdaa8286f94646feff8b615c38f80fbca37857fc3e81a3d6ef561e52 -173: f3434ecda75e0216226e1e5bf9143ac62852691ca5ccaf8954420f73ff0e3b05 -174: cc2a0b6ae2447b3733762f34657287f4843362c232c99310162fbb6ff0d50123 -175: ceb7be0ae2fc7f06e0ea102aebf343cb37c65deee88e2b3a538dc747979f8ae8 -176: 081f689b66146e7a256b1f645227cb3c9ebfbd04ad7cc52cedf1acbc21d43dfe -177: 116944f76f92bd752c7dede3ae8aaaa3e78c9f4c168ce1e4f8bed4051fb93b0b -178: decd90f07fbe6b0720886d0afb4cbf31e251882d6f7bec8c3482f8ef0cc8eaf7 -179: 8796057000a4cc5092554b1ca6826876f433a260b5369814ef293ba3562f4ce7 -180: 88b6522669a0e6b78af9974bc208499602e4ade0943e8d65c0eaafd854481f48 -181: 8e7428c3c728b8fbace45c64df9b4957592348c81433bcf6b81d3c2e7ae72c90 -182: 9372a0f5b68defaa0676b78320c16502801ddc3255b523e0801505ff5e7f16e0 -183: 6e86012d3547c33aadd438d6efe4ef06822f2a964ba16456054c7d7f1552fa26 -184: f740b3f95a86764d5a8031847becdcd2d259180e3de84bf074f993effde9971e -185: 59bdebc53a196c3018fc6fd4d6e9b6774ffbea7800700c8670df1276aa860bc4 -186: ed215e876c7709f3f456041863072e245600beaa6911aee29d8622de44ed33b1 -187: 4505f43b3569d2013cc3fc17ac31a329c4109611bc90fc610b7a47df00057375 -188: 6ff109260f1b3aa2d7dd09a8041dc194932dea241cb5e31e63612dad5aaddae5 -189: 48682afe897dc03b3d1ca634a183bc85dd51fdf049c8968a6d65c071c6afc514 -190: d3390ec0bdda39a01052620d7b6ae10d3275bf2eeb728b29b8f9a200c2899bc0 -191: 5b861e4da914e584b381f6d37f2c8458cb7a9fdc096220116bd184595d09afee -192: 18e51ddff9f391a89771af8fc5af6a269425fdc0885c1ab23c7b1498647ba951 -193: e379048af309c10fd9a95c37671f1965602a19d72b37765b6880f78e5575d00e -194: 2a03863aa3f1818018a31a289a1f74b43cd3486a6186332ea9d187cf4d778b8a -195: b06b627d0b9988f6246a2c74aa07f2f064a975a9ea72189cf70ef7738a550fc7 -196: 24b49031bb78a51beefec8aa02ee0c3f20a0bc8e23906ecb05a2e713675a283e -197: c91b153c4d07090707d66874074179278c760b59e0bbc488488112abfbe0a00f -198: 880aaeb0896c44b2e857cacb4e86c4430087f1524c25672ab3ffc3ed74f223ce -199: 8f79f1a6cbbf335cf629c9d0f9cd2e1a2e8f75dd911d7cda3d8ac7a0e9b44c03 -200: 22fe080dfbe76d382bcb438d9bb45671084d45f94c330436391e7d820d196598 -201: 836bbd51ce9e65eb7051f2e5e3c60816fdc6076b141df672ef8dd65acada203a -202: e454eb81a9fcd1e29b2313ba44020ef5ef60c2e3fd3b0566c74b87092afde086 -203: 6535ff734a6fdc4d577ea4218c657b65cd1be4ae2374d8564b01327b86da71b2 -204: 2265e8de4d67982ae7101f5dae68ca9f9657d2db3778702d909b79c6a86a5795 -205: 85fe8633bb3ccde13c7b479776aa1c41db83c4b764fce90ed14df15467a4666b -206: cad903e7b72d170c09fb62d3907f9b561af4ec18ddb28743ecd4cb733093de3a -207: 491a3cdbe7c160b955e34a93094302f1c01662e1ec30816e4516bf4e1c61b76c -208: 7ed8eb5cb2d7ee6f9e2488dd8fa835f6f22109f42215b901d5e4c4359ad30ee2 -209: 1cb36c31e915894a6a2533ccfd3859046a1dcf78d8452bc88958dde0ca191e82 -210: 7996ba8fbd81c2eb0becdbad564153c598abfa2b0f69bc3ce6566a78931d0b3b -211: 81289aa5f1dd141efdcdfc5337decd1399a8aeedfdeddeae6276288106bb76df -212: e4b3053295d363cdbb2572e7c374ae879efc9421701310a34db983a4249c74cd -213: 6122b9e38c62b79f5ae2511de6795fb0fc853a0aca3fcef4a182ed52439037e3 -214: 74982ecd365733ffd752f772b3c8859b030f09b7667627bb6dfddaec59c30963 -215: 65ac368432a97208d4b02bb2481e674f31d90f4f18efc9375b92282432cd4398 -216: 0ae0472333635ff53374228f90d5cabaacbc0af29938fb8693b1d6303af5d819 -217: 47335e444a2f868bab1dd2bcbf7d696403e156139545a479710a6e559439a8c3 -218: 836aa3b53750ab893a8d2505787917fc35dca9cdd8e144474f86e2fc62aa2ac2 -219: 902ad618c9cace3b20b7608eced2ed3dfd0fd2dd26d1ea37e87134f114053aaa -220: eeee27753ed8a81edfd6a9f9cf22ea18536e6b7afe16cbfb795c84611f729b7f -221: 78689d14bf6f41cf48c193559ca84a3d9159e4d8b876d8ef4400ff13adc7e546 -222: e95c0cef65e3ec3fd4d13511442b43639025b54441d0f6eff2f3f0fd16112e49 -223: bdb7210e537118706f44ce3faed211cbf168d84bb0e987d4a283c854514a896c -224: 8c5f6f2b232c4ca41560d9a9cf2133b9e9cb18f5879fd4b33ef3eb63e599ce05 -225: 0362c89e151b3c9fee8518298cbffdd7248e55598f2aadca11349c6052634142 -226: f890d22cde86aa1c84b2b176f20fbb12dad5a01a5440b7ea9b95ccfdf3e1c3e5 -227: 07bb7b47c9b210d815f1069a0a41d3a84521e657b7acb287b1cd5cbb49f67ff1 -228: b1a066f1a5123b37a21fcc3f76776d39d9b1900ab322627c624ca36c41ec8c80 -229: ba78c1228e9c14a53840b0abf4c2453000a9f7987a214c25303404f73c631f05 -230: 5cf5cac55ed208adb8093b361dd8b9f5f02fb8a53cef52826924782e1f6a11b1 -231: 96c1b670f199bafe07ddfd47f1621f83358029a70de499e06bbdf703df203266 -232: 1edeb64a7da98efbeb47db24d63ef44715ce037f115cbae5f9352d95250ff191 -233: c35d4468f41c85e5cfc438f1710c8ac81a14208d98f7aab81d9a2af52b557d3e -234: 15bdd6d35bf282cabde4e76053970b0dab3be54b0d82d307a286e465c8cf5977 -235: a1f30cbdae18417c306ced42980242e75e26a46dca692c2a5c66fee091eee6ea -236: 7dfdaa74283d590bed1a93aa83690b94af6da5ab325048562328b12121a1fec3 -237: 505531a199bdac286d600f684a6db9eabe1ebb8484b87d9eaa645697793161e2 -238: dc9b0fa83e94aa6a077b27566bc819d3f6c4cd9de816528ba0a8307ba5a9ce89 -239: 0469c2d7c5238717833258ddca0e7b5e2935f88fc18302530c7d5f4d12b4e6c2 -240: 5444891f96afd31dfb90875ef6361330cc9066732820393af2bc8e7685d73219 -241: 96c7a7d1a89c2a7ff489b4da3dad6040d70678d943e493124ac85611da941ef3 -242: 83ed5df952c9a10321737683dae3f07a674130eb1e63808ff36657786ae90bc6 -243: 8306098da643d0d713485eb46ed5b2e195f5922059dfc4235c56598e63258915 -244: da3dce162705f1440002406c5789b185723547355b9f68e2b79752c69120cbc5 -245: 586b2770deedf675f605e7a0ea1749f4ccee4bd503e979bed27300665376e135 -246: 21e45166c93f32ddb9455bb5bf741b35dd091471e6be0fdb0a3e3989e8e03308 -247: 929f96737caef074135a18be5507aec562cceabf0f782f68819c600c171c6652 -248: 07673d367d2861655fab34786cfb189d1264040aab58f8ea997ae13b6c303e20 -249: b0d774540ae1680d4d5c47002145f86d64aa85739bc61f0fddd24341fc870736 -250: 90be88abc45f798dd28659b543f1740317abc8f5a7edd9cbaa6aeec8168b4eb1 -251: ccccc2ec1d5992b360136f83cda2adc2e4e921407589c633974316084a0a24d2 -252: 7d863f9d4cf437e5f01661a0427f5d84c857a14f0c45117bfd430e1ce1e83d37 -253: 0f1100223e9634fb289da37860841f227e30fc4445e05a89580af9e37df54006 -254: 989bc5068cad5a93f2cef1e4acc0031c3892e0a8336f57b967ed493ade127819 -255: d117be5bf4886475737e229feb3a212067df3b4d20476412148de596327e8629 -256: 7918e370264ffe9a954fe349ffd1b857dc73948de93ecba459dbf57231df395b -257: 9aecf8190d9f3c8aa026de18a609c14017a5cbedea830aa587bfa75741785c87 -258: 4675441cd704567d561a9a244649afad8c0218870d8422b280dca07765478f4b -259: 807d3e8c51d7ea6d1f9178769f2ba3e6ad3eab801a22a341eba696ef656812cf -260: c9327ebdee70d30bc6da82ce176be856e13661ad045195c7ea3cbce1a50eeb6d -261: d2892873d407dcc7ca8d153705b537e9babb6e8ee48d43db752be3d4d5bff8b7 -262: 4042e408eac4bd2d4780366df17273c674ad0975053af97525a585783926eec7 -263: 7ab2537e4623221c87469fac039dab9f948005a1309fe4cace36a165ef8489ac -264: f9be4b7e3dd88242e994c06ba87bf086bd012bc05739c130708678ac148ee2a6 -265: 67f78d0c6e565b0a3b266c7024973632256c7bb1a50f26e615700ac117f12e14 -266: 65860d112fbee85873f4491a062057a044b27b075054207d04b3e1c8e0ecd295 -267: d17dc8cbb6a4121053bc4595c8d472ebc25ec03e6a7a3cea9693f7a08857c19d -268: 8f5526c34c0560b272a783e8f84d8c6068361fc1fd98737f916539c4e5a786ca -269: 622442a15cfd2bb1d19a5bd917eade938c67576a2fd710f355423c7e362379d8 -270: 01aacbb60422586205c3b537bd8e6e3c3647a6a6959d8c572343dcd4c2a3fd03 -271: bfb97cfb6d5ea07d2d2bf8075791ec76e038ecae19738583ed75ed3af92b9dd8 -272: c3bbcf68c733161cacb2185e06bcc08e739e0156bf172b465cad0b286d651863 -273: 9860e97874180ce05482189ea83b9bd46df9c1ff84c063c04b55e5007d71e308 -274: 60f51f62146cda4f15c5f549330bcaf0df4a420aab37ead2e94115b28464ec68 -275: f820c827e5685de1586f0c4366d68434efeada7cc8e4816113f1ab7f854030a8 -276: 439ee42e996b28301a17903413e27bffc561c20127696a1fbd7a9ec1091d15d2 -277: bff9711495f8648195b9d685d74737505158c58dbbedba3af298a12ccabdf72b -278: 8b440ac27c9230c25b1091416c331ef3e7c63fafb4d3fbc5e7e67c9a96eee7c5 -279: 153d0606d52d37fcf1d765026d5db583b0d8ee70cfff0b31fcff893e22197d35 -280: 8f271450f8d016349330115729edd00dac6d4b4ac1b4ae5a34ed03c3895fc6ec -281: 5fd19597f8f2f54a105ce419652b6f31ff5f81b6e9c9fe11adc74d37cbdafffa -282: 83ec2c8abf39cb4ebc7aa584ddab071e0bf709f5dcccfc4032649ee8e934e9bd -283: 87223192712bbde69b66186f916aaa5e034133be0852e736ada9a4f2b6d15371 -284: 51881c2227b7940a388f28f75754a5a606f549abd05799a139913a0e4a7b24f8 -285: 449501d5e3a11f803d3db8047544ba233d33b88d0e338b1cd8a21d274068f399 -286: 86028c7871285d1f8039aefe02e4f8f5cf8611cffcae71633b41cf24ce1eae2d -287: e4a43cc54820d908d2f413ad9a43b8c5a4e635c96bf3080d5a1d2add8a3d6eef -288: 4044246981889dde292330066d8f563a73090f61522316aca1db1fff59c76b19 -289: 7b8fcbec4e16cc0b53159f002d00a4e7fd67c8a1e04792e26e97c2e8ab52d1a2 -290: 164a4ab46b7901283c57d89eba86b54b1398005eb3b9681617934cfa48c0a7cf -291: c234774ec19d702c50ff52ab2a5681aabbd194bb8a16375dc0baceeb4549886e -292: 5dcb231c4448ea274426f1d3b34a4b5b2639d88eff8312bc08c94ee50ef5128d -293: 2b79eb4bc6a5c548bfda75d29f6e987942bc7abe6eb4515edd838913a2edf245 -294: 8c6febc7c3da2fa7155bb9c066677f018c9e6b580b9b14d576d38bb533f66cf4 -295: ebc472cf68e67db6be510b6d4732672c43c74604964eb5b4433b9c779dc7be5a -296: 61e0af62939c09edd3e12e53dd5b304b4b8d787f57adb6027154f81c748bc1bb -297: cde92fb85c4aead4cc97f094f99f52379f5913a4857880f26a337851195c0541 -298: 48d22f360d786faed02cab1f293efa2372d1a81d22e2920f884bc379e87faba7 -299: 12041431911a6e89eae0e2210f2b68efcf666e6da9fc63c33a4efa73a513f45e -300: 0e859b529c474484c1daad4892757411be6c133915c71e11de6675303e8a4c5b -301: 4ea0f68329d2132134987b0a52d2a5f72b799a7888f8e51b538a3390adb18585 -302: 2228eab0ad664fa03107f7867ff9fac8d5314e296bc47cb429b6d59c08f8e38a -303: 9bb3fb3df5a2af73ab0f0957db8633b22ae1b257ccdbf6c01b644345228f71ab -304: 28060f06073a5b7044d979ac6ed092750933fa2a65834d8938ea1ef9b9b30621 -305: 7913cb25af88438f3a4be0a6ac9c136859efb982b51c43cc41f8f3e9880dbc46 -306: 0b58a75e74f595094152e3bee513f4b47f465e974428ec9cccdd71bf0137dcf4 -307: cf774b4ff8cf9a2b2df5478356699550be7a89d26ca7cd988bfd7efa53fd5437 -308: cd7b2510510b1e68c93af020629b2dfd5a4d0b258ec70dd601271cb9c04ff6e5 -309: ca1027e7ba838b52595f0a83fbb8d05e9417241f7a3c8c90799579183a2357a2 -310: 9916cc864cec1e57b549623007220d92320c51cc945bf1cc506deae386193dfd -311: 4f7f9bf00b3975efbc9ed9150c8b38971951bc420c38dcff173357d8594db52d -312: 584a91d99da2b8b99c12c615961f1a8ff5b758ea8780816e1a1767d55b1c197c -313: 2adc133ffcc65a546c198b3bf088be0bf68341f8c5b45edf0a79428cfef5de25 -314: f9488b9fe9b0ee2acaf54bd385dcba101fbbcc801b71d0c3a1d1c820f11acd65 -315: eae10e528082af6bd71edf955c6fc7873b41406f727fac18872ea586dd828302 -316: 8f6ce27e9e18ad70e112aa5daf18bf564284fe985833dd34eaecc6b5e064a771 -317: 6904feec855e513b2f2816ac5818335be61832d92fc5e020dda40bed646df7ff -318: ce212d5906da3e2701313d4111da2f23b0091347aa6107fb0e3fa8f05c8c6b7e -319: ae2aa88187825ee3364586f6b7b8394f1a7167710791447e381285707caa2949 -320: 2ee5e39f89d0420f9781a0fb572557595505b16c4110580f9e2510cdc37a6375 -321: 71b7110857241e261289757765c5505296a4c99d1a5ce1fcb1675f1828bc58c7 -322: 612fa9024db98b84df2aca6419b00879701d649698a5ea3fcdf0c13bc58bb6a7 -323: f00b094cc91f60ba7e0a47c5fd5d3a65edaf8ca278aa4e55a1a859b8e4e610dd -324: ac13597737535d11f1cb7c259f2f4c85eec3e910d71be3359e758ec25896d893 -325: 3b1bd1bcf7b79d5a722e1c731a63d3a98d5efdb5f6ea26207d66780f79645cd2 -326: dc147e3da606176129f7195959841eac83db95e994c60f3dced9bafd67130d33 -327: 8fe245581f1813f11c750b3a5b02c8a6cdf1b59c5535e035551e5d590d3d03a2 -328: a870586448d52da28c66c78096681dac2deec0f07b6ac5f6790d497b7606e0f1 -329: 3718898cc208739481343d4a15bdbabc785c59ebec52837a63904b5f313f0304 -330: c559c358dc83ceb40564b40818a0339c1bfaedc1eb3dbb1fbe9f6d33a5e35581 -331: cca494691816aad621a47fc105b8fde3341105a29c3b706e9455cdbbaea2204a -332: d4cb6e4742eda4523a5d178948f05468d1cea1e1fa2b7e0d99d2dddd1e4fa8b6 -333: 58713a47ee7d464233aa4a925bf8ef6e55b305f2b0819d8745afcaf61e118e71 -334: b48c863bb5cabed5aeb69051a8a52479f5a37c6a43a643bdb37ef006b4db54de -335: 89cb6029342df50b71f16f88d8a495fd53b30889c94b4d7af1eaf8b4a8c1d9e6 -336: 3da1b949bef0364d6fcebfdb11e6d2efca2dc012010268b4c02e4b489a75d59e -337: ef14cd74caf8f47b6eda03885d20849d734897cf89455d83305aae6f1f457893 -338: e46345992433ad8f196a241b184f02a2d2564533cd39e844aa47d9a87f65f8fe -339: 77010eddd786912ed75c3a3b1c885944daf061d58ef653e94eb549143d4d2766 -340: fdb79ff371ba418823ea7443652d37286f2000df06c3880f1cb322f74ff437fe -341: 53f36cca4baee943d61e97bc9a5412670ff7408af16960c5487a93d1568c9e66 -342: 9bbd9eb1d00da5c0b96926357cc38f6f649f4daef2d0d79452365ed7a5679baf -343: 6fb2e192d031cd5070fb63f5e6a23610a008d592e0be5083ac2dc2ee264701d4 -344: f369c877964f6bf3675c2302e0e7273a600e5e2b1d8dd9eb0bc9ae1ebbcfba02 -345: 5fb4511bfd5a89a4c026b227d3edc5a1e0553ceaf56b0559c334253270ab0cff -346: 2105b64db2ed533bc0529de6d4eb90500d26e1b4fc0393a24292c49ef45eae40 -347: f110830985de233ea7ceb040e340d63d933a74237a6da1b6e662b6fbe1629d7e -348: c7a09648ab90c57f8334972cc8b4a13f8f65fc8cb9d7f27450689a8daba72b3b -349: 98b4e3352af24ad6d1ba2e7a1eeae59f701e84c2504f48190c11377f75c6ac85 -350: 395301bd43b6315b7cd19335d054fc18648c41c24e4fe54a87c4629830f1e6b5 -351: b496a8803825e94563c1762af845668689af8264d265fe96628cf5ae90774ef4 -352: bc4ecb58601d15e4e96551409d1ae3479a4b62488c2d961ac29a0f16b18f02ff -353: 93c5010dfef6a15683ec0aa217dc00466bf65125374490fba0c05e2d81c0a22a -354: ed4a34ae546505e877a978f68ad58c78b08ce2e084e1646fe7fa25a264927cc6 -355: 6578751c4580b094eb245261b9e4709d001f228d384ed46c5b9a98b9fcbea42e -356: bb36bef38c0667095696efe5779f0ed5855aa5c80130f3d834cccb3b5ee2fcdc -357: ee401de8e74d5327eff5dc94022aadf9b18f203d1a08d1587fbbda1682d41444 -358: 4ca535c0625c02ffdfbc178b70a5d934c1a66b0c8782195184a02b860f119029 -359: a45b2b54514720695a603bb0fbff2bfc04780c97308212244f57ba7e45e3aa56 -360: 56872cd98fa9000f92148d6ec19c31e59e71766e342031a6972be4a453b2d47b -361: 273937ef97b43b3017f0f38746bf4a2e6f53abe57b8b8494e74976026d42a241 -362: 637a19b146aef1d1084f07f0f9832dee7b9ee4e27d803bbd709467aa2ce303f9 -363: 7340af34abc3a6a30a14d0ac2648bead4cf4dcab4f252874f95b5dc121320998 -364: 11e11820eb3b42a6a97b7eacaddb3fc01d7731a22de37f6f379b2e3c91a3835e -365: 9c9783c63124a6913f338194a0605952ccea0543bb5573bae70f440dbcc80928 -366: bd2e7f67123d49ec4d8e529fc3714f4b7a0b1fb1a8bbcd6026f53b9a087ef946 -367: 89888854c22789bb35942321ea458dae0dcce3aa10db62df538cc8d3f5998206 -368: faaec2e73a456fe3150d2be01dd10bb99437e801b4f4984ddf4d26d33caed5df -369: be3626c4c9ab11b5e038c036874d5d99375491124bdbeb3c4027b29e4af1c5dc -370: 022ac8a6d2f09db3edd2dc5b92bfb8cbe893f83c2a48b16179868b891021ee58 -371: 0ae40bd4ee211d6f9f9322e7811d80aab3bd81c17191ba32454b3c9092854cc4 -372: a3b9af71edf59a632d02f4819f4b73fd32301d36f3ac7934659338a70424c0b4 -373: a2088bc52680e9a605a2919112a655058039dca5db6d3a4ad28f0308f82a7b1f -374: 9b69873872d2a1d90c3cf402b43ace8b5a7a37b02983a208167e865f51feaea8 -375: b022041c3132842a4bb6f1efb8e75fd2c48abc0352a40538fde82572bd8b4c6e -376: 79b15cbf5b8e0dfc79de050e4b307b1dd7d0a4cc6949118b1e7297c326bf4505 -377: 03332d4b5ac755b4918c7f9073f877cc1b9af8e97d800dc45abb4a99311f7bdb -378: 4bdf53be72410131df3d1294b5c3ed9ef166900ffc56474452cab8a16a42f65f -379: ca9801e8fe29a1743c4fe59ee889c266ce276e339956341d94c40ed64e2cde7c -380: 51e0280d03118a04c067353eefba23faed845e2f8aa77c114e8f7ce9cdd76ce8 -381: 92cd4b7886ea31b185290bfdf704bae8154b2035961511e98fdba5d107a270f6 -382: bec0c70454a64f9d37e0b6ab2799577b7f98557a1b64871235a3bfd39d89556f -383: 00162012a6c2f2b07d88e02d9096fbce28672e1a49ba27c9b743c0cf3be84445 -384: 7348acf111fe5513ab119295407bbcdfc6ff24d8810ba258c949154b2e9d1a0f -385: 2bbf687ce7569408c515117fec126ae3ea11af47dd8a5e80c1d45ead997cfb2f -386: a993b3a196f19459dffb4c77a1dbe0f2084c02553fd8b4e8d5540705bd50e1c2 -387: 26f84446687ae90c1813fa49721257e7fd8938bf303dbd72cfb4e32cdbd58701 -388: f467a901838d0f18b1ff23b4b92a8eb47d1087973a942f160f3657ae8c25e82f -389: 67aee2303ae947f1c3cb06e7bd76640be6e007dc21ed674e82c56a2fb6182e37 -390: 36eacf8ab85aea33a2d0cdd5716aefa875da36d05e765fff91bb5c70c7fedfa1 -391: 2efed6f5c3303799203b563781fe7e8dd10e5153ffff7f40c7eb71380a11781d -392: 33fc4ac404c554b242bc6a95c32d4a780ee9244729a5787009d6f776b8e98397 -393: 0e6a680ec399b877f374581475656c2498393025aede5857a3ae508ea8885da7 -394: a5e064a448b5ad1562b05f17e73af343045c89836ca15fa03936f2cd23f7fb8a -395: 5a22f1f5098d4594311fb19e225c848602e7880579356f183ca882aad3eddea3 -396: 1129d0a75803362dbc3b9d3d678fcef29880a5c5673937abe2f0ef71ef83083e -397: b8e2c3aea667c4d139a7adee2e29b0ef4ab85157d97d3a593deef208dfa5850d -398: 77dda75715d6a77138f0b4c95c8f374b6cc9cde0661d111bbd7293dd0add6e45 -399: 4d9199d53858bd285e824099364cd360e55358bab92f6e699032d7597c78127f -400: ce5296b7199d32ea2668de4f0e12b522de695890d491b69a46fbd3b19443a5ef -401: d953f34abc2cf734b1de72bcd5fdb9e34b3790c5539939dbd0c580578cd4993d -402: d11987f38e5d5bbe655f2c1f0693f106bdcf39794bba6b8318ea575f8bf0231f -403: fa1995a87664b4a1335b18f635e132113d802bcf3bfaa983844e4be9aa48302a -404: 94d26f5751646b41f46cf71187773ed3c3fa5a059956c377be54d6e198fe7f55 -405: 73621384cef28085fcf9579dd4b08a9c60c6c6693de75276d77178242b31e9da -406: d18256c03fe2200e7fde200cee7e5e68b31fabb35ea4aa674f1480f0c70f40ad -407: 228cb345ac19bde898f5d1bc0c1606c20a4b378d39c45f048f2ae641765eb3f3 -408: 127b0845056b41d6ab032c78a13878dcd7f54d363918738f107b4449ccd58462 -409: 478b6381cec4715437db2bd003710a92e5e3355cb5e01a92d4eff6095d2fa3bb -410: 2875c4e4a1c27d09af73fce7b0c8e9f0a798ad157b10b92c36f696f2312d52f5 -411: db0a692d081a97a3d3bd3e525109c1bb5e5f43654c538dd155e98a433d8118a4 -412: 5225f5acaadeefb94ef492e502474d900efc6bcea98579d120bc59c7377448aa -413: 27858430af45f95e7dfe8857d9f09e663577b2b858057eb531c8698afbf75209 -414: caf13396952df2bb16c10d62c34df43c4c422be52fe963401bacbcd8b3fd9720 -415: 7c9d95826ee3ce61e664940568a0066e9cf2665025f9d085eff982292ba42fff -416: 0d2f401f6deef04e52f09d18991981dc4e4a410e14bef6e4d0952c14d4bc791d -417: 5fb3672a06e111c544223114a982f4993cd0a0ae2f8f20c736ea622f9a592f3a -418: a143850d422c27cb425db67106caa1546436e843bbf6c7c5ca98c7d8b26500ed -419: 3a7d55b86405bc716dd23033ade4b475b1e16eda03737ed8d54783ae48e33842 -420: 24d02ba759abcf03263bf74b4149e277de035c9970170aee0cca3db4c3af0181 -421: c88f29372fbd0f25ef8f22d73d2c1a011c2108e43bff19231bda4ecb0aa870cc -422: f13f8c6793b9fd9dbaff1f6e7ceb6adcbb29df48412dff67855c37ab4d2ea7cd -423: ac2ebe0fefd24d17b128950992a8447d3d72e96d9991aa28cf949586d4aedcca -424: 51ce61394aeaf246871690a4c3f9e1611efe3db47689add4f6553ac44c50aac8 -425: b51cd46dffcd7a50fd1bed06d63277dbfb49a9dc52d130d2fb48cf763d090eb1 -426: 8cbada55be3ceeb7ff10a3a86cbcdf93cec431bda81cbadb17c35889517f6aae -427: 271ec5f0f337031bf4da8dffe63665d21a1445076eba7fe6347e01130724c2aa -428: 4e6b0226f4537cf206076359b05c5e848c278ebee902d761fba857852a94dcd4 -429: 26b02334cc3f7063cf3c98509be21fb05380a1c5b5415c551374ad541b25b73d -430: 855ec2729210f95045ebc4ec2ffb251aaedc552cb84b2525a111f09110a21957 -431: c492ebc57c483a2e9b696db4b20a7d06246ddf8eea54e374d6692f1557528c06 -432: 82dd34db76d8eac6badba158292cf14249f78c39e27219aa8438ff147d6c3686 -433: f71d583756b28252c751cc4f86b96ac2b24fd3edcd87c89920fb7cabd84babac -434: 0c00bc0ff60cf805bf9f92df1780f5966610f24352cd533a2988dab8d59f4dd6 -435: 52d23dc9cd06ac01737352ddcf5240e911361c21403b997b417476079db87454 -436: ec9c3e840bb9068563e655fc0115b5f2320ac1e26e91bf6af4d92512b1191a99 -437: 796fd5cea33f547b238d9c191248348e034ed06f008cf8b4bafc428a52ba9d04 -438: 400aed2a17301c211f09c92449841d9bc11246db124d6f1f1c584c0589116434 -439: f4c457c53d3ab63c03f3ccc4a18a9e45682a9dbd7dacc809fbfd20a2a7e95bec -440: 3c24b2f357d6ad70a76da8629813ebcf1a82b5dff8e73f4903709fb4214f5ae6 -441: cd1328d67eef562365c873d1cb56eefecfe886e6e6197f98273ec2b2d642168e -442: e36b514415523ce85e7c285edd862b158e60e5eb47b45d4b3c907a9cab4e6015 -443: 0cb9c2d05d74b1acc77eb6c71e8dd69d2b2788ff3e1d40e214694abd1521121e -444: 49d7ad342aa3876e558622dd03938a6aac258784ff02d1c474ee3ddabca6bb46 -445: 15341339c524f870272f562886acb9e8237330a29f89038e61066182d927fce9 -446: 02488037fc6e3b89cf003af6f4ec63ed4203384266c064a7992e0c05a4bdf14a -447: 2dad5437171fa3401711b6fa7b4774ef6c5ad2a8070abeb6229e658ab3bc04b3 -448: 2b93fdb14add3c52d2519a2fecdc906893ae77ca2756ae6290a62af5ba0330ca -449: 08627f60d00e95c42b53bdd5eb8d08b9360fc1795191525cb5f9ca9dacdf4dab -450: 76f89b17a70f96f2fbb35119211f070fc6e5d71bf75c2b60596d6ae277ddde9f -451: 4e2319c28de62374e7e20f639ed19df7dd0208b6fa729385d8a97b7ec0085179 -452: ecf6bb771055ffd58c77062f15611853f496708608065ac61036d7e01f50ba4e -453: 6815c2382af401c3f5b65fdee1270d065bd53c38eda08985fa4699b02c975095 -454: 397db724108990d5a402ddacc938debcaf8b3f9b467dd76110a0dc146b451042 -455: ff534e92474626cfe49c76261d074cbc93c442f9729f6052119bc2c97ec27f0a -456: 78e86805f8b263632bbd8fb30f3ae913fe5b71241ba701665b7fd73a9087d9ed -457: a8badf35f8fd4168f41779aaf5db3b51a01952b731ccf0ab04d65924905ae4a6 -458: 188a69be9bd313c3abf0d2c9f86654cf1e56add4189cc9413456a51947b421a6 -459: 8af25821481a3fa7137e3d957c64a97d0204f9861bf6a8701fafb20dc4baef6e -460: 6a8a04c755de9c6044fe243e31b45a3d5963f22c5323be74eb04965ed419aa54 -461: a817f1b7b748b0236c255df87d31be1dcb5b4499992de7d9b9ae0d259ae91e48 -462: b7290cba8e24e6b9ff81fb5b914dcb248a58bea9b021ac625a7c9f29c8a3ad8b -463: d2e4f2a835d2ea8e382099975ddd354bb129019f61b9d56326386f5ffbe0c2b2 -464: 54db5f0f6e4746652405abed569c91282193261669c7daa31e8e649f3522a79f -465: 50cb4b5862df24e4065c94c71b27606a3f811361ddbaa2664aa7c88dad151173 -466: cadf8e317c0dd6c53d36b99f832a30ae150a32c1d9e2a95e0dbe9219fee60e83 -467: 29196500ec6a1375916b0147c353b8a4921aae592f51fb7b492c3526c2b75139 -468: 7766b257b8e202072cc2d65999388f60f55b30517646b258bb5075845fc7e4c5 -469: 211a46ca3d1280a830bfe997fcd7fa606f56547fdad9a2141e87b67af443495a -470: 18e523ef28da5d53433aac9491ee418c7785e82ba8b84c9bf091ab25a709ed10 -471: ca746cb23c094d3add9a0ac70cc966656563bee80fdb1cd9d729a69da2f1ba34 -472: 87b9a1347f0e33ddfcb4f618a3701d59b57d6394d439474bb7016d427fbe276e -473: 22bc2c81b6f94c84ab0fb79b3a7b2684ab7e8251caa08be6b8701aaab24ca5d8 -474: 5d10fcb4b8ac2461185f5417f5902b4c000cfc73acaff798d8521c77456f51bf -475: 8141b5641ebc92599e3f5a7e14546eb15d2fa8a791946bf0a84657a346525cd1 -476: bc82d29fffb497b8c2a9fbcd2e95b85fba93cf985cdb56461e59b69ffebb7f22 -477: 0a57dbe66466333ec1d7ebdfb6100a903697c45b99e0ac3f4a659ab368ae1a85 -478: 51ce84d63b52a81becf17ed59ae68be2ebd629729d5d4d5a2f1583d744bd2a88 -479: 48aa59c51a05b0a5e61ecd89c2bc8eac6c10d05417ec000cd7580ff52b4e81f6 -480: 16f73e3ade83ed3c9ef33e3c0c01a5686b33a05fe1b18308e823bc2e504136af -481: edb9856e42e585fb13ed96b367364f98abe4de71e2e423d8fe7c6de5be223345 -482: fcc764222c981a04504bbd3c32bc7727600b5c1f9b386e22a226a668dbda0c87 -483: 1981e5927b9fd162ab0bbb5a365b9ed8e247724334fc59ad28e394a6c4be899c -484: 90cbee09dd7935d6837b9a1b67f9405452603ba5b228bf7a8549a2abc78fd255 -485: e504621151f680b6086984a4ee2d15857da704a659974af5ef93be2d1a9c356b -486: 203bc8fa7a5c11b2eef3e268df252033193381dc8258ede81e88143ef23a8b5f -487: afe30eff8e40220ca4e024fa0b94a46fcc42c0cb55df68471665b27732a60a59 -488: 48fee4b0bdb44c09ff517e0bafbc35c7b825379d3ae21924ef0a44433b6a0447 -489: 276c7d526581af81956eb0e247e55925c069a843ff139bc2ec057b5b2293b689 -490: d238303b4abec814253fcef18081a517c4ef3608cbe6a4101edc61c7c70055e5 -491: 84a409eaa8a75a5c91c97b3969d0987dd9034901c960ed9cba49994f0bd8372c -492: 03e947ec08b722db55035664aa0342bbfa6758bc164914365775dab315bc4fd2 -493: c23338219a7fabf5220ee25cd9f033ce9061d7d5bcde28f9b0110a8d43b3ebbb -494: 092bb0db220936de15bd23e6aa1129c52c6b7033e6f801f7dd052bee713456be -495: 5c6f720499c979727710b23ef59996f4cb44e39a95aad30e1e395f05722dd749 -496: e6f72d91a5b12e3740837467c1f577e4893965d0bcb1d5b56dd2488a273ae016 -497: 1d8466d5bc2c57f3d39b4aa8fed21acbdeee64edad2f0b62de769b4e0822edf3 -498: 9f5ded99162815de77cc21dfbbf69a3f96e9a7b6b2c86f50b1c511dba25360ea -499: 3b9fedbcb2d3e8a6a4bcca281e409e1dba4dd05adc2623390f68956711cb9c3a -500: 7d1b86dee381d8053344099d321854dec6d1ac7e7b7d63e587211a3c23f4e72b -501: 4695651d56ec6ffbd43e3b8639f1b417806d9fc8af1ef6ed8d08e644686c817d -502: c48d004fb14c505ce06d9f421ce0d35656c448d631515f8652ce931c1d4f8eb0 -503: ec475e34472eb053e407782d27b173ef82c06d3088270b7da089f7c7e2cf493c -504: e5ba57405abcc5d8e5b79013f8325915fd0cfa08a59f3860b83460080c3e70c7 -505: 94f3e311302ed65044838b6dc97d51b414b5e7949ee23520a9052c21d486688f -506: 33b34f47628081709b85af96e54f4a94c882d06efffd34ff5a5169b5751f1af3 -507: 8c02a790b27b4d6e792db8951dc9b0f1f48c0e1338efbedac92e485a9c6e3df3 -508: 6a52e76d0066a0b76789b0210d26d8812f06f7c8d7d0a968d901cc16800bfcb7 -509: 2fad4c278b249feb6bc654c7f80bf6c7c084457980ea4a95b8479088dc3ee562 -510: da0583e7b44f358b26a83db200c8793f60164347410f108951816718d55b040a -511: de11abe66ba38bc11b0439129fb6ceaf39948b27cafa3275890cb05f2a805f65 -512: d2dcc2993839741afe2de012f94b03681fe5549ded0ee3316e48b7597359dc69 -513: d88520e62209cc1fde3c9b16ec40ddcba1b57f06bf9a5146dc9014ec446e6f29 -514: 242514918e564473ca0d96285b7ec23bb5e106b86977ee72cc5fd49bafc2ae59 -515: cffc937d5057e24f8365f89ae7b2b6afa8c8bf6ded43774342756572f2a8120b -516: 05c1ae4da63b088c7a6446c94506469f83f78dd9fdccf0ffc554a0234bee96a9 -517: 6b837bbe45a0392499efcb1fa9d0a183fa265f259a0913a685fbb6fbabd9cfd0 -518: 0233c64a15db203e102e92b949ff8f5687f122b73a6098d873995d3a69f3afe8 -519: de996204b8668ea35758f4a434a82738d2e4df397d56d5e44edbf75562967d9c -520: 5847a852cde88f947554f4ec2e0f8df4276ea4ce28431dab17b849e820069163 -521: 434b92148bbff5d2286e0e80eaa0c4a3eb53c7a666ba23777e7bc458a3201ac0 -522: da5a927529243cee03f6c1398e41447ef5bdebbf61cc25817c688005d45b0cb3 -523: d838b16255c39410f535eded20ae4a2a14ed4196bbdc272c4ba13de25217329d -524: f46cee99cccb920d7c9567e571c793ac3020adf9502302faeca2c0dddf1f08e4 -525: 1e5c71266cc073d99f10093786d1d141770cfcd510431870662fa857dbaf6a5c -526: 602ea3fcd4d90de7a8b5dfcf65a61d53328f2edadbbbf14c62b2a6f9c3213a5c -527: ff707c27b1d462f2cbd191f8555d2bb197a24480ff61efd0ce99b521878afc6f -528: c47995d2a690c25de33d55754d77ba8da2e841a86abd46197db2f5863524c78e -529: 89b542b5508c1821a670a2745fef3b56b7e9a0f8aeb2f8bb2149e90c75e2139a -530: d5b89eaac746528526cef9f99a3bfbabf9ce9b6ff604c1971974c8d27442981b -531: c9cdfc6cc2de550a33ce68f4848b4c619f0b425b699f2a2b76d2db475f6f7573 -532: 9600f94b77994e18c362504cc144643e90419eae3f468d3ab4e390e429d0d5b2 -533: 7ce9cb9bf84b35a763110b7f66e0be7a271371a78a5376712c19447534451db7 -534: e9a8b50d03e1972741424c2c16b37166fd2d8b6fa17d6de9a0ea6d5b500adcf4 -535: af46270f70661306342e4d96df5f73c51be87a7cc9208e31356129d2d255a9ec -536: 0b84feddb3d62c3515b4e0a082f485313a7583d1e69d28f5b56928b177bde02d -537: b78ab7ef9a782179abb877115e70e9ae8a4df5a2532bc6d70a49137524d18c0f -538: 0eee1d4fe4ba096f194d4bfa30bcaa12cd5c5010b42c81997034a8ad71de5738 -539: 1d750f1fd643cc8cd360ac7ae41292051c7aedfff4ded6b61566739aa90890c3 -540: 38feb94cbbb3637ac27d561b97274ce8340d9f49617cefee8884ed94de6ac579 -541: 67d18d9524de82f3cb9048127d4c429f9d4b33ad3a9aa99ce86e34bbddf81488 -542: 24dba4f062cce959ebcf758e3be0363905a80b191835bf4333e5c572c085ecb5 -543: a0945db8081383cfed2d66fb9f79774a953ffc9dd6990548da55c90b800077c9 -544: fcf77a9d1f6c84048163f9f1ba21eedbef74dc62c12505a23934b8637758fc0b -545: 6768ee1dfc4d9aec0fbcabd35ec91642bab1782d5b5512fd1e41bced92cee73d -546: ca536e3396347e0495b021e2e84003985d9304360c1505e0031f6c1e5b6e74ee -547: 6dde51e539def3bea08bec0d63d740dd61b66fd16f64296609db33103d76b7b1 -548: 28f4238ed0a8e8eeb50b1b49bb0017a5cce0b2f42816caba49464096d602b8a1 -549: 173c9fdeabdf4be0e5b8dbd4784cbc808e093750e2397388cff3c5979d875ff4 -550: 99a27a37ac53b36ddec9cc432b16d44f596d7173184d0bbdf1547a4e04e3a1ce -551: 86413f744576d0260415fac0247dbd61a3867fd329004217a9141f2b0e5bd2e4 -552: f2f8c905ecd61ae2aa8de239c64fbd7b5f0c847ab18e56177d76240a626008c5 -553: 862936291eebe5ecccb4b213d74c9a7f022772fe1add00f7af5ac4ff6223e346 -554: 0c47fb1f36affdec39eedc88fe9bc3afe65f910047fe9677583d109837da43c8 -555: f7cc0f262bdaa131c9b582d8ba3543f4de14e069eb8453b9c6435900b2628b6c -556: b5231f7d4bcecc3cac63cb530c6ae7ea7560f0c27e41557b6ac1146a2c1eb568 -557: e8599934318acdd2ef5e7fc634960d76700c92d313dda306c2cb17515a327c3f -558: dbd646fd923cfc9b10ae498511d6f131ee8c985060590b06ae3678fb8b46b5c8 -559: 6d52ecb66f21882690258d77f9382c35540363077fd6086fbe4682a84eea11bb -560: 07d78a6e3ea3c7f98de73559adb9e489cae8af8607a1fb3d79abc150f553319e -561: 4953e8f819a2add9b23853b06bb97e26c7fc49acd8cc1e0b4684a5d766f35a53 -562: 781b2f97f00f73debc515a175ba66083069d9f1506b4d6232acfab6a0a3ba939 -563: fe3ea15a76ef7006d987d06dca3e0f25ec94f0a25fcf3b0ef7240e3d6c47bd2c -564: 7ee11817f2ca5f9a6b0d7372849ce31baa3269e1b1780c5f1e0d80716c357088 -565: fe2da2c4071d83642a5720718e49aa5a44a5bcba7e8f8935f4021e0955436a5a -566: ae74a9faea147eca57ca27b6e735eb1aa8ece530448730c99871a39075870131 -567: e3464d5fbea3f20e2b73f63be61c455ca0a518f989b9d18ada7b790dbdc63fb7 -568: 6b48f7b2989583e8718603b3a62836a99ea5b37853d7bca7b70d52efedf02d73 -569: d460ef41f4932d9f4b1cd07da8f935b6fdecb23ff8b269c80e86bc7525c6f72f -570: 64ae878a73ff936644eeaef0338138b29e0a3708bf4e99cbbc654b94c4f172ff -571: 1a4965900231ba33d6d2a629c4eea67599342d97f9b0d859ffda8892f51d0fe5 -572: 105af97fddd8f0915dda627d3c122c7866b541d6a39f5ad8a77fa648c222ee68 -573: 79502abc9bd09ad2f2a3e454d348723a6ba623fccf95025ac9feb0f9de4db246 -574: 558fa2ea8d21782f73c50ce20441385feab4e386afa3359fd035921161dab934 -575: d8446ce7590ed28036768d268431115d1c8118bee49c74bf6f1181611acdee49 -576: 9b4a90d2d7654e229dc2035300ea60a901c7bd96649bc8d5aca1a738baed038b -577: 798270bd135c927db2e94714661d36600c8d66ca3060acdc991bf42d918c079f -578: d7120b2db88536e9934d96390ed9ef1eb11ce428d0b2b1bec41c8b1fbe51110e -579: e001c6c8468fc9caa9c0e42a731356aef769913b105945c498efa8c95718b06b -580: 0f62ec1075014e7e869cc697c5670bcd4a669c979a8cc1dcaa38e41ce67e296c -581: e5ac3f8d559a392edbd7d6ac10a89f2f09808f9eb9c720189040dbb0f87a7b60 -582: 64e2b58930dd78a546bc5b7e55f65cf44595435397f5253401d3a31e0c30b317 -583: 263373377014da213a97247cf6506808d90e15e1af57d5c13d8d53566b5a5461 -584: 9aa6715383e79f4a1ee8b8cc86f128dd84a4982d3c5a6f156b31e4472737c83c -585: 1925d844b25759a842c33263f155d29878b36fde630777ae0a97e2fe85cc00fa -586: e9e11491a037153d2fd0853c8eb489a6bf5fdd97c951c2b3bad7807a12f2bbd9 -587: 3d2e8b0160b56435c74603ff172092ff34ec4f82e614cc4c445e162ea9e07ab6 -588: e99ffd1b1a61b6004364dbe66570f205dd74e60843cbd9e43dca8dbfca625fe3 -589: 629630ff8906d7c13cf9ff64a0b427ddf9e8941647d8efa200b38565f80e45f8 -590: ae56197bcc4790e52ad8636450e7a9c6011cc1b1b6571ffb5922662935ad5e8f -591: b4f2c342260a8b77d6a4afaa9fae0421bcfb16256d45ebaa80f658a3270b93c7 -592: 06b84e9eaa313e7381f3a25a3b2ee71a0e058af2dbada33c08efdbeeb6a4fe1b -593: 9d45e4b82e1f0eb022ecc8dda15b45e0e23964671eafcd7786f44de42a53534e -594: 6ca41d669a06431c20f359eb53a00e8e40bff623502c06975a53df2c24ad2740 -595: 09987c84090b121bb669491451fd36981e35059a315bb3510b2910e5cea7b703 -596: dbd7606eaf66ce092f8df17a864e7e58a82950c0aa4f59a2163e2e0b98e05966 -597: f408448625e8639af09d36d1b0b4a8475223dfe23d9b13c344f6efa9b0d79b55 -598: 67fd26f76aa8fde40ea32742e9564f318e4d30393c8c8b3efc1874d361a0c677 -599: ca232d6b3a3cc9555eab03a3023cf6957a95cfa1d7675db8ca191c5b31cae03a -600: ecdc0f7a4ccecee888019378fe1111b23e4906da170fd1e3cd9ea1593f941cd6 -601: a2c19a29adae2d8a541915b310c566d55ea29cc7e3ac91f7fd3a88cce40c39a6 -602: bd042cabea0461654574055fcb4214f45dc5f7cc1d8aa821e259267d86eb8c52 -603: 69e0e38d26d191529a5b11f19ae3c78c8909855b6bb31660b5af80ddba964ef9 -604: 7bf4908e45ca86a3fb79c7e6a09f604ccc9c557974483aeb5b8f473e0c3f0a38 -605: 0ebdfc4dbca222ec3f4209d36e6235a433c2ec5f064592ad2724107ab6d2abb3 -606: f60e345855d5d683c432900a9a233fe853b812f6bd8446601bf8d410c3e67c36 -607: e4d5c7bf1ca47fcd5179833beb7a8489e910fbe93ecbc34a7c912c358b45bb33 -608: f9f127ddb0330d7588f3711a22d9372763b4661c63db217e1561c3b6ae45ad14 -609: f0822a7a0511193fd6f5a29ed39d8e8f737225fe3e7d8d90c704a032290ed1df -610: e07fb2450d06ac2305eb3fefb4b16b6eb3996bf91f98df58ab4af7bf4b24a5c7 -611: e6b0afff326f7f36b65b095072a19b0e104cca0dbf27529a7f39a0acefe8b3a5 -612: 30bbf45da7bd0d24f706803eabbbebbf78fc67f98e0af4d68524025be2de183b -613: 9446910610590058b8b7a5079920d545e633b7b7a98a114303ce332e34e1ea31 -614: 7a11ad209cdfd258c5be5247c594103ace97affeb5adb140b3bf4b9a164ab4ae -615: 561775fa45d789a4912019093df2cea17402a556110038b90fe8901d3ab910f2 -616: c40d48d0551a2fa949c0c19751b3ae0027ee1169ad96e9dec2bcd06c6f43bc0b -617: 675519f03c8208cce08fa91f718484864504085354356790c058ab9aab3009b2 -618: 8dc12b12cd525177c298c4c925748af02ebf14b8dc5feaee4bfb75c1218bdb9d -619: 62cb61ef8ecc400740115f39bbfd492232761effd72f67f2edf7a4943802b7ae -620: 6935a0079903436cefe716a592752a3941c38c6fc81a52b70c0d79213d157583 -621: 42e01b526623a41ec90659f1f3e7566c07254e21e5c3c4d8ec5d63d99a3905a2 -622: 8e0d64ed83799c1081e5eef417e3a8bf0e7b33f7c3458896e568cedca96f4b68 -623: 16854b1163fba8b8d5328637af0d7834b62318e11271f482bf3b31309bf9c89c -624: 8cfe1d643d67031da6ab55fa27e2017915466c5775822ac29bb303bb18f61830 -625: 1dc6034d71d1f5f1459607c478ea4aabd826e50c59d891a8cf36f6304053b478 -626: 2aaac5bcf9d5587a16a51d1ed47ff084105174d6b5f2ddbf2cfeef6664728970 -627: 61508285a773bab75cebfcfe19372867f10f80195fd58f4e4b829f857d769aa0 -628: cd700b9475056cf381f9dd6ef52afcd9868aac09d0c1849255096cd698851b5b -629: 9d74cf92c621a9cd48e4e658f4a01d2c9b245cfb616bca6247e0091e7533a705 -630: 6243a40194637f3bd50e96d703b8f5c7a4f60ed7b71da7051b7abe4d1155b229 -631: 06fa690518c85c3aaecb3ebbf5fb049deeb95354789354e77f0e87f714589f09 -632: 5f359792b9fc023075e078126bafb2630c07c55cac746cec7b24dd52b55e5493 -633: 7ca64000ea0cabc0bc80372a13fc49e3e19372072378561d69ecaa716cc32cac -634: 973cdfc51bee2d6e46eff4ba47f2f8dad5edbd278256a98383f3416ee1ece09a -635: a906682cd85185924191c3873491a18b134f371b3de306946e485cf2e58c04a9 -636: ac11e1fa3e0f28955fac401f434d384a6490c7b4309aab903d6fedde86ff044f -637: e95a1d5e94da3939a9ea1853ca677b7b4524636ba85ba6ddb3889337fb6731f1 -638: f91877dd03a80fafde2c3a39eeda2ecb4a12ad8e308b6a1df6a182580bcdba9a -639: fdcfd665e5ec4e69f48a8cade948e319b79388d3f2ff21d99d4f96b5c07e2459 -640: 3c65738454971b3a3f7df085a917c24243776ccc968e2ef2428f59e9a0519188 -641: 13c90cb776f1531391b36f927bbb760e29dce4384a42f6b071c22df66d06568e -642: 9beea97e1746d96db9347e330df0e92b5e05efe2c72f5b0a0f6e621d39fd450d -643: e3ec99168ea8353837cfea97f45c3cf297805d1cd3cb46ab54bbb35d0e82e828 -644: 1844c799ba1b7f308969f30f2e597974cdac7cb4ab8c027f82c67b7bf09db7ff -645: 40eb7652ace2dd1ba383972f70cfc3eed35bc85260cdbb001cc0e151f7edfff4 -646: ce4167189ca6c39a025e4a749ae0fa726406a71d6a0c4b10f266cfa6a9d34ccb -647: aff90a63a4a5e46e58d9fb16d33f06f8fdc15a73c7c690dd02e7a9f4576dadcc -648: d842bdf7ea299274d3bb91fc362e4dd4f3c28237e9d621e0f97488afa9a02369 -649: 18601f93b8240474442b832cf1aafd541b32fc47cd024bc626fcc850fddeeb55 -650: dacdbf42cb89fceb79d1d8bf8c583bc127c42e22c7fdb7fcc38ddcae39b1f62a -651: 7cb09fd65dea49174aad61b0cdc7c53e2b4d755816e1137c52ef721ec1b19169 -652: 8be09d653c065e39f84ba4312ff40abc6ada795ece77880a45579407c9bfdd01 -653: 41cdbfc8df373987d7a4645cabdb323ef92eb2e149b95b1cb389352686948c5f -654: 54dff6778bb9a8737f1eaea2247731d70620b74d4d2bedcc492a9768cdbc1e06 -655: 1ef22db51009e59fca54a417c071def94551ecaff885ce191179f2bc486565fd -656: 217294d1818c40457dae5f3a19368972c7375dbd4b1208c62f024a31ce3887f9 -657: e0d0f7c5f46849f29808d598cb9b08fb2517fb38d29a4ab1da969d956b1edafa -658: b3604457af6e43b8719e214620a6ce14f8c22c60a608381275e5b376ffeeff84 -659: 21e6ec5256747ee8ed0e1e4f6d461f8e72e5421598460c0923984e310eb5b3a4 -660: ed4acf4aba6c1f3a7dae1f27c14f298a7966c444e8c70b6ce1ce0c0b6daf2a41 -661: 0547af4c292895a4c18d6be5b2ac9f862f363a36bbfd52d46adb490175fb55ec -662: 3f08179b52d97e7372de73ddb39cd16211d212b0bc2c1790094b33781283e1be -663: 37ad8e73e6a01fd8bb930cb3fd00d43692d8c83d37b4ce6602ee531b282c0075 -664: 81b8b053eae44bab64dfc2074c706d52c748d75cd6231029e9f88e08dd670272 -665: 91e1f3207d4b0f56cfe64aa422c06a4245d701529df5d55ab419d5a51e0cf122 -666: 55bba2503739c92878cde322151f1858972c3ad0cf96c0eac0cd7d6c3b9e4077 -667: 1882000b8a909763214eb3116e4246c9ec71207a3c306d7fb6ee3ab82de42ab2 -668: 4c884909e219886a50d8100a12bcfb356091076fd6f144fd35b6854307d465e2 -669: 8c0aa56a953a170a3ff4ce778e7390362516837dc29bdfcb801a13f45463042b -670: 25bddc5907720ab48ae5b6ea70fbb97a387b1cd5d2a3b6786b15270283f2dfa8 -671: 872d1272dffc2f9ab8742a08a8ba2d38e49a5a6fca74ea6e6e60331ecbe39137 -672: 25755f0de23d9e58811332e75584370259973c264b7028e9f68bffb0d073e52c -673: 0b96eb45fb17a8a80aa73a0e7500e038232dce2269f9abf2add880fc4e2dd081 -674: 085954a53c62269bdc9d78c7c45ca58f5c0220f224c7cdd8b7bae4b6d0fd5fe7 -675: 670051db6c0fb0f947f5d7a11d6bcca2f73901b7b05662cb238cf04ba0d9e556 -676: f8f7c37e0beb0b45654e7f2f03e5a36b86144e5bfef8c580e1d12e6116cb62de -677: d657facc720b596aa8b5965df5e38ef9106e0db6bfb6846e4d9a8ed8900bb8a2 -678: f501202de6e6a53bc96325600a0895f830ee20f4b03d81f98af56fcdf7605f96 -679: 558f0c67d147748bdc5472f4be0584dad452cff1ce1822f4f1ae2355020ff9aa -680: 09096d4a259c1c60bbcd25563301520fc5707106fedd30aa757f8790bab07d25 -681: 5ae02477e97e3f282a912fdcfedbedc45b6f48db463bf1a00e6208cf3a8bab6f -682: c2ae4a0b03e6bde0f10f82cb3b74fadd3952ebf9dcf8eabb3f24b2f4e3e2b0c6 -683: 14af46432e8204cb27f1f37d12605f72d483aaa58164e16a9a0318bc6da38abb -684: 9798e1db236fff527fea4b493d38c7f13200a80c20238dbaac17657d1c8331a9 -685: 6db3cb731b30463f68fd3129da52623d09a8c0913cbdf45c0ee680d062b7b014 -686: 7630c889c0ed3cbf196c307a6b13b5314c35f8e08efbfb85680aa8f56d8b4073 -687: 156cb56203ce9103881c2f173ef69dcd31e374dcfa00844d909246e863c9ebcf -688: a2bbcaabfe54517da51cbfc527f0e5768d6aecd5a6f71c4c70d90ae3054f5518 -689: ec7f5af5f68937aa3bb2e29f89a76c110bed1740ed5cddbb31a4bbd4d8658c3d -690: 7b1e011cc68d027165e019b9e8e070616cfc4009d56d366eaaa4cab247b423ea -691: 6cb2221d41e75df3b985d2647836a26d08f78be70b7d8028555b1b82dd17b175 -692: 7027e565c0e317fb988f6954622a47a6c03e5d6ee9b7f38dad7f8a01ba315887 -693: d329fbd15068a51d3daa23ffa59d8e0d5c2be54535eedd0a249443bf3111059f -694: 058e67814877f19a4d38f3578e63ecc63b450763cceb5f93d6baf6708c6165b4 -695: cab5ae80484fc8573e274316d10e2e6b71d64a5495b451817d59d37fc62cc118 -696: b02002fcae0d4643be5940d223d8d22029fdacd277d153f4833c10fdf502cd77 -697: b245a5c7d95ec8c1cf1cb22dc679847b982d55f3dad6add28ee01b67a6f41fb3 -698: 3f388119f98462ea94fb56e55862e083bd3f859a02e3ef23f25c949cb9b7f5cd -699: c381b56202caa27cfa4e42fec6d238310472bb8e871da0cb47082388de7783ef -700: 0193afd46bb14686ad253297bd7f1083ad6a6940557fceb89461a9aeb6c3d47c -701: dcad33f663c6716db58b5a94edd0b758dcae719b37cac7e6a58db609f9b9667b -702: 551004d18fb394492e86ff7b76c1ca7bf4c83dff5c1ab5535428f217a14cd602 -703: 77bd6a37b0aff970095be63545ca1cf02e28e282240d1ade1e5d080a7c92da12 -704: 902fe8b742e49a4e68af91a8b4c0c78978bdf77855f5af1a010538724194fed9 -705: a1c9180fc41e810a19223ac72f897824ac6d2f59c2ea38cef85917562145ed55 -706: 341d0a96981cbd4347eb91fcccd144f35a7b0967dea0d6c64031b8fcb46b610b -707: e1a629e9a39784a0c28e3dbb2abcbeb83b07680fb17d410d1b8954ed6ea290b5 -708: 0d781c220748957cc95d3153d4b247a2e9ee546278f06e4798bb2151797990c6 -709: 63912204722a1754af57ffa997b549db1ebdf5433c1be42e6af6f9ec482ddd90 -710: 0f61dc240b6fd221221b377f0345a2cff7f13da41d4bd1696c81cff5778f1bec -711: 91ea7c1927cdf2cbb1263650afb35ada8da7d34d98e2686c50962b30b1508ce4 -712: 6e7c14bef3922a5c8a11953512011f61f75509193caf284930a585fff49c870d -713: 99b34c9fd41ebebb6076b75ab3b22da39a9488e4538d6fc016e45727fae8572f -714: b4259f3d957f9561144098aa8b3541731155806ef06b403c2dd4ea4314e19fdc -715: 86e328d35205220f7befd72634d61c329f56a55ffecb247ee83832dd1fe36d63 -716: 6d3386b03689e959ee171e2cc6d3ecf9b250604f34da80387fe1c3b139b6c0ec -717: 039f3c02d3ba2e24ca8a6057272b987e2e55acb88bde7dbf92ad36c49bfc9344 -718: 715e95be267ba0eaecbd230f6942a1eda2d4d8ff36c8b72948a7f721ffeff3bb -719: b4ccb610ffe7c154f7f1d588f597294d2c68c2dd725ec98fe03e71cabc37cdd3 -720: 8bcf65644a63c50a37e09e3cbaa8d771ab92a0d71fef5dd94bb56a001035149a -721: 0993cae164b8e0ce36eb6d4bf7dc652106bb97101a8a7c45ee4dbe929c6052cb -722: f4ddfc20a477bb8fc717d7dc31d195aa4dc55d420af8999d5e40de5084c63834 -723: 4ddccb7c7b7628b354264d7dcfeeddafc1bf51241a20bd8b514852662ffa6e9b -724: e2de5267f2e4cb47946435c2ff943e5d66f7aa9d43497e192ed184cad165517b -725: 9d15b89c15b2db62cbab5119fa15ea4dfc49c1523b10916af61b194ab61488bd -726: 87ee80452ccbe78c55b2a7617c8aee128648f22c4456e42719675cbb7b506af3 -727: 4d5fcb9e907346e305ffc20fb57351f3ae2a43211c4af10dbb1e378b6220b9dd -728: 8129ada76295117f5073c4d5a613d08630d91dfaf2777b13ab99ac4509a1f6d6 -729: 5c5c1f33a4c0ae21c072d8790ea0fcef957db8f4033198c0cf5d0086d158611d -730: c4586915ee3ff4e0547d29a546f03d197d33d9f0bc1aabf2e4c0db19b87afe6a -731: 665fa3786202ed507fb2df7cca87dce2c0be5f4fd125dca54e9132d1c0028acd -732: ace821e7584a41471b2e555a1c96384532211f6709d6301eac0622124684bd48 -733: 08633271be3a0ff80987897d45b2592ba11d3c482acf58b4ca3fba1cd2964582 -734: 1cd99f1dcf7cf5263aa8513e11970c77638d936978836e255f7be3dd3bc749cb -735: ce55387875b7f7eed70163b6fe9a4a07f10595fef4d77d0a572e3ee4917b4d5c -736: 9c5e5dd2f19515e894c42dc959ede7f1a0e818cf6a4289c15f54d25ca60b8f12 -737: df6af50b0b22b3d9253a56ae486cd14622268faafa94a25d34a1d1deb23311de -738: 1c45ff7fa7e20297a74256d37f1c518e3d49c960a847c5a9fbf89e400ad1b289 -739: 13322991f05eaf681a68cbb4978dbf26a12c1230ec91654d9e46169bc06bf181 -740: 7913ce5febf072c698215215b7cb4b180a9256e0ed63d754357899b2468f3134 -741: 46e44f2aab1eb83a979dc3dbbec17208dc26fc377899c2f532b5674da794e784 -742: 6af8e641c124bd85b05ec7278aaf1a8b4db3ab804a7a6216f83c399c334f1152 -743: 9392bfec887e2f83109c3b02d2095ec5822917304eaca799e3c9d261d74018d3 -744: fce4ee633e07834f473aa58e0044394aa1105f82931a2ea5f50118f16e18009b -745: ef14133b9e9f2f00b15ba3c9019fbd27755bd60e25dbea93c271e55337de66c4 -746: 13f95c9e923fc103eda110ec9cdee367d01daa39934f4a98e2fa4c8d508a0690 -747: 2b5910bb1e516298aca88c502c033409abc506e4e40adf84c58f737aa02fff9a -748: 010ea00917ac8f13d0e9d1a699a0b4f970d7a92f5f0676bfaf4734ca6fff1f63 -749: ac22984ca1e9bdecf3a8c81c4f5d8476745c6d44cc4ca3dcaeba6275bea17497 -750: 018910488e6cddc4d3a796f5bb981f456a049b46b5e53fe4dd90e55b54796d4b -751: 2f06445407652ac9e9af69570fa28f06179da64b6f9005f2910da20d1747b568 -752: 17c32324ff9ca42bade9d2da7edfee2b5088dc677c5ea0883b515a327b3e675e -753: 640a7770cc32e92ed3e1412c79495a3128b4928659f1bf7d9ff20e53e3dce174 -754: 7f8faa738137234bff364c457cbdab3b9bb2178b5d59d7b67584765b887ddf47 -755: a1564dd109d9dbb882fd221404b402ca046d268f592ef0db21ceeca9490f1d51 -756: 36dac69112b7c69315b52652f5a013bc6b6d4382e0d9f9681a34691a7af5bd21 -757: 1b8753eb292930ead17fba8755a8c6fd2a2cebc0899bfa0feb2edb91f2783feb -758: ae37c74438422742903ef30ae9c0130e4c860a2f11498082848edf6b15996bcf -759: fdaecaea39e2ec984e8c984d85292303de1e2ec12e0b75ab990bfa7e65a48c88 -760: 78867052f7feaf352e97dda57e7792b883ececc33790e47e761aaaa7f847027c -761: 8c73f0f9603bda755f7fe787d4679a2c15a133d6beb2e2cfca4706e992080e6c -762: 8b3ee45fa3a6cf9edca4576c028c9d28ac281f5bc69df1732e2185704537828d -763: 5736c03e2e08901bdeb740fc2a11697366e4b071e6a611c3e1b0be171dfb0c7e -764: efc3d8a8cfa82ad2b91460268ea2181d7043d9ae429f31cc6bf9dad560e01b88 -765: e48a56496817eea0b94249f00d42eb31b1823c700cfd503223430e5377b0debe -766: 0c0a87e714cbaa1b63d56912232130ff3f96cc91e332e40a471a92fcecba5b81 -767: 9bced3b9012155f5281cd83991fd328e15bb791cd2f9101c515633b1069c21cf -768: 929fef1fb81ef39d6f0bee50792bb01bbba750ed95359dd17349603d5c6c9cdd -769: a0298e71a6bb25d843f0a486c84b8af2dd96273939e9878de824dab5c6d41454 -770: 779c19bab13abc41e9398029b1810f0deefde87aabfd55e909ed0931b72f06f0 -771: 88f1b56d0fdc5f50833214e9a7046a980a84726ec281254e75ffa8ee81b24597 -772: 3a7c8ca4b0715d42df6ed02bdca7a6c28831786c3d997485c6be4297152ed0ee -773: 88a0f337b761e71843f41381e9499cf74bf2978a65e5e4481f663c5fa5929e73 -774: 76d365352800adca62fe521af012b686c0b209535bcc4f8b45cc9e728ebc9575 -775: f008acb3ea6cb87a29aaca44df6822d583fbf70d89c20b91f1310ead0d336780 -776: e18850ada303a7610faae0f4419b8b074077d8b382b3519333d0919b56e11134 -777: 95d3f06b9a095e832e32ea5b045de87de1bb3f1dee7aeb90f1a62fe1d8844c85 -778: fa72e0399e52403464714d857bdcc5ae78525e81d31109539ad9548e177878ba -779: 091c9e6519ad79728660cd1411222b96cd9384926c652e3b4fdd99bbe1b29784 -780: 3cd3d2b232a67cc1ef02be591b4fa891d31b2b87127ba63469751afb6bc38bfe -781: 0111a5800571127692423a0b5e64d2de2d8fca7c8a4f893a3a3efbb9ef73d63f -782: d4182bf05526cd1052f743b4d3084f5497e6d752011ae3beb3c884785f0088dd -783: af9f702f77c413a95c767ed22a1a7af5e1951fa09fb921a0c56728a901f88384 -784: 548e7fbc9ee3abef91e8f5d86b9fa2acd18b4e2b5b5f0b06993b020dfde7af2a -785: 76de3a6f51f1ce104ccd0ccfe9cdf2eddf3236bd237ad61d70e16e728f1f8830 -786: c7505bcaf65afd6fd64fc58ba1d0e7888ef4b1bc3c36de89115938850a9ea89d -787: 9de032b9b6d296a31542bb23b5f6451ad14d3c3d27f2f2af88c35a11c9b25beb -788: 9b59e2d98895c363229b3a13175dde2307f5e45e4de48c7e01fe5dd7a66d516c -789: f2290cd7d56562b49a63fa0a6fa75eb43182193e91eafb6de4d5b3a42114f5ef -790: da15453aea57615a06a92759b6906a3b3bfc65a49483f1b97f953d917170c0f9 -791: 7a6cce29f707485231b40c4d0fd2dc3e162dae1ace62e1ddf7227ee77c14bef8 -792: ba476b2558e6fb94308a78b5549e6572d81d7e2b3ebbb42e2f68e595f300aa2b -793: 827e82561dd5149f139a98ae48464c2e61abd7036c3435a388ae437577b98ea8 -794: 42d6226752a305940a4db24e77869c19e6c153a0b7e4409b254baa0e1bb6aa84 -795: 686e8e9fc0e75c0006f3b36cad1f125713d2c2a07162751d79d7b2c0b8d5129d -796: 22c1978979b722f631d051ccf8b22ae0d74c74c4209a013a253f00945360416b -797: 5405d6b8c0a154856278c54d6a3836b372aa166b0deb3185603a1cad0a940341 -798: 400307d1d50fc6132fe113bb8311243c1da0e6b57c78f9e2d5f7554f4e6df07e -799: dec6deb237e7d009ff60996b96e4e92cb197494f0cf5edb5312e1f60575c015c -800: df9fea12bf11f4d9b595455da7c69921f5dc40a427333fa7748fd66eeb017de3 -801: 2042c501563e32a88f4e2d9ef7e66be27571635b6a831ce41b28bc6c6df0eb52 -802: fb700a0f4398225ef5db5dcd6710f7eff80808d3f815801e14a24a61ebc424ef -803: dca2d9f1ba6568ce572ef1ba1fcae08a372b2f485c884860815438c5e3c69b88 -804: 17b3f6f18906ca20ab7f6b011f1cb522aa046c343f5bc04803530cb8537f0927 -805: f888238774bccaef845fdbd2a338831c13090afc7c344b1365e24bf1ed121ac9 -806: ec81d951ac4274fd4eb452baf6c236ccfeb18138429463f8e90d1524da12121c -807: 5cfb0fc4907a831e4c602c82c3f07fe4463bb3456fd6fd24ec78bb483accfd63 -808: 947236880fa0c1bb05b086b2f7412becc344fc3ffdc6f4dd00bfff31639228e3 -809: 259d05d2057d408df0bbede5bf5582baa01339493684d924f17a46b4f5aa4e8d -810: 1ed6143a41a75f6a9f6d42e98a2f29c6cdc935a8a7ff43b8ac59bf20e933f194 -811: 57e739cb621863d956a720b719a76a4be678b0ea731a3b777802b53cf78d3d21 -812: 6db449cca2b58ac27074e003cedac028c77a592d31d5fec2ac90b63108dc2c45 -813: c9ac45e17f6fce5e3aa0a963c5ab2af463422912e5a97e97b969d30aa5e71bfd -814: ae670f4be0ca416bf822562d1c136985473d93fa6c005565219c387459c9d463 -815: 64aa2f792bf77fd23b6d4050076d73c9b2ef972e04de3c4e4b772a75145bfb28 -816: b2b8810ff96b189c18de81253260f1f57d283c3a6d5d9f8d8a3350b7d7b4cbdd -817: 5c7db30147bfd07e81e7230d8d5e559255556dc7889d19f5a1b834ef6de92639 -818: 00617b68f6496cf88cb4728f889534d3b4ff83bc8ef9e214064a4d0511916a7b -819: ebf3905209b6aa1fe732dcf39507258e0faeadaabda8ff2bcbd028c2ee071155 -820: 1ad7cc67a00035019d548ad7d8f01567f30c989f2c02088e9d18c864f7cb8054 -821: 5f12fe6bef45c836311ca3681c08f82796dffbf1e6893272acf26139333a7653 -822: 4c804c8ae2f4187ccc2af13aaca740d2f0ea8ef1593bb2f65640d4d9cdc19d42 -823: 52becac90562e114784b7542dcda300834a4cf3d2289e0203ea9b1751318e94b -824: f318c6a0b5af61b3cbaa5251d849636e68ab6c29bf361e81610d259e5f9a1c9b -825: 1210b493270eb4617cf3398c05281ab67bb2415cc7780d9290761250eab9ef5a -826: 166a3084fc7ddb404d39e4d487881d7e7488024e77c827c86d80698967ef0439 -827: f7e8df8d6c83b694e8e3067582eb9cc4d8aadabde048a3c54894bd40f94b121e -828: 4289388178c1473632da87084d13c09a92a19ee32d085d717ea5f7b15f8733d7 -829: c11fb521a4d1287b82e982531229d811e0cf75b049979c592d48835b3fdc5ab7 -830: 7b25b4347a6cd7f79fe6a2e123e2bcd3c5f7c64e5701474e116677c680c847eb -831: 3bd669ded341ad240b3cca32e2246044e788e92346759c677c25b588d336eb9c -832: 469e448de67d33b679213d1fd4383af4eb663312d2b039aae59a7ea55f47d48f -833: 1e19b3f199afe7bea42e85233dadc186dc7db1c34eb0222c40100443f1c372bf -834: 020b1df2133447fd8d2d1d8caca7a80ba666184c243eab0d52333f026d4c8488 -835: 017f82bb4ef093de828031eccb2e19929839344b00fd424113b9b170081f7d23 -836: e114a5bd110ede150c872c12df640eac7547f2c3b093b4f368ef1b17d5efa42f -837: a36b110e907ed59a4422c82d2107923fdaf8130b4bc216aec7a11ba803a31a1d -838: 01519d8b064806e5da350a1c102d07e94fe5334fe4d23759356703994763c4c1 -839: df4e0927f31ea17664543c2505bfd90f4df67c620d979243ce80e9ce6aff0db1 -840: 28697719928efd0d8502578d1ab317b772ec0e7fce2a64d1a174d7ff6dbbc943 -841: 5aea025c0ecdd11cc6849bd784eb8b591b2d6034dd4c9e11736f623cab205bc8 -842: 21b966650022484ba1bf969edcdb1ec5e71d2e9198721c99df860bfa3320b685 -843: a48629a370e3c8a8ea395c1381d6e7ee38165e29d70fe80074f1553c5ca12086 -844: 8f00714b53a5c63483c1a1ced92f0a7fbebea7e10b27e690b259c58a7e21b255 -845: 4a15be4e2173426025a7f7c2bcc0f9fe2fa070c5ad7d0185b2a7d4a2717b2d73 -846: f6da5b5d72df9883e373e6f7c647febff5929ad666307b3ff838f288fb20021e -847: d0c3a75990e3cd3effd916b8997f8ad39aecd2f40c7c59df5c6ed6ae2bd6ab73 -848: f08583778b92382380ac638e7f86c72549847cf3570ece9f28b02f71e0bc9b15 -849: 3d41f27a82ac10a8295a2cfb6f4422fba8ef5303094a845216e532d0998dd1e0 -850: 2cc2716e1e720a13304be73fe29a4db55a2ccbc95285783744077bef292b913b -851: b67ccae6fcf0d8cd364260c649c2135c606753784fcdab5411915795c6986dee -852: 31542a3723110e69b091960c13f0bb9bde2e7630c17ac9742ed5bd94df12f11e -853: 7b3f0517b1de93725cefe79227f54ed95166e363ed0b373da7274e0f56e6e433 -854: 5a2c88b0d041cb9037cc3bd64022978dcf2d1839b7b98789dca382521f4de7b7 -855: 99fc645dc0fa9183a7cd75ce5e133e3552cd890eeda2d79a6471383965757f5d -856: 8bcf278d8e51f0cdc959ef1f5ac79c411f5b5ff7c658d3cfe4d1312c9ddec0d1 -857: 5b1ce03ec386b8a4530e1c6e9d27c3ef54c0a8da3d2138ac2ff4d7bf89b14df0 -858: 6dd8aec81318cbc0bf2fb60653172af32ff62dd2ff8cb20bc0c1df82ed41edb5 -859: b2b6ab64ea6d8c8602bb063335ec0782c02174dbcc8ecec1d6160e030cac58d5 -860: 26271e73d07a7c45d017b5085c58c42914a74719c8d49979c678c5b4f8e76e28 -861: c6136d39d206890f5e8aa2aada84bec2cf50e405fbfae64b7b231ba880eef72a -862: ee8fd22fa072b9fe159209e4955772e67d225ad2a9d169c30f6e468b5d5b1c91 -863: c73ad82fcd868b622f9b5e136915894739801093cbb84c8849a838d6ebe729a3 -864: bca23c98fc655392ba07e97b3a3cd5746c684f7131be2fc95a7d5b92d80ce755 -865: 5290cac580cd15da39312bc9f35de883590b4d42d481854e488d33794f47ac34 -866: 0af6a1b3b5a923b24b7f6be599c2475e2007165ef088230cabb9ba47f2467f5a -867: 5c3a4ba29214bf3532af5110ff7f1be43e1d828e181653064f08f0ba65556e16 -868: efe62d93c082b86ca8185dd01dcb848c247412aad460b3f98bd7394c333a4499 -869: f917605bc5eb01ec880886992db6dd8dcca845f013eac800d21082098d660f3c -870: d745dbb46f8e55d21378a0c6f070f851b05a5d0d77fabf7182cbe0b75ece39ae -871: 8a254ccb12d77511b4818302a7cf7a4010830554ff0396a105985fc4a7f0adf7 -872: 446af701e2c7dd921c6c157ea68c7ffb2881e489e06bffc555bf2241dba2893b -873: 2602237a6aa03fd4b36df0b938f1c49f610ed92bae6ed1b7b60ec172ff395e82 -874: f375e7a552540bf63d5e69c663e4b2de721435ff57d9f00476d9241c05913039 -875: 26edf4b92a2d80a8904da7d91ddd617fe97a4d741ee74e02f732dc350abced89 -876: edfdfc01d71eae7142c218f5be3867878232d25c0e503be8053851aa4c31b657 -877: 015a35e8fbc9e2355e220b6e07cc21049322031b2940121c71058a8d9c0ad791 -878: 1c241cbf578fc1b5875c13045d01cbb39564d1ac030c38b8a0add52c1c38c608 -879: 0399cc25a5426ae96f2f6cdf71abe0847082c2700076abd073d88862e4d32588 -880: 6dfacc9dcbf13ff79b66c487a678f81766bd2015da32fde451d904997ca5f8d1 -881: d684685ecca96d26094c9c0a391f606b7e874553b033ae90ef96fac18517bf01 -882: e6cfbf978ecc3fb19429203bd2c508a4bb1e1d419c313f554d20dcdbbca6d64d -883: b8df95ca983f4ef3ed0310b244f2f4318d6761564140cec095a16e023976354d -884: 3d09aad047499cb54bc9fdb4f634c09beff93422db01f7b8498d90493c32a21f -885: c4d2a3d1bb94a37768b512a87edcfa56c00cae560b74c48e46ebab9ec67955f0 -886: cd5728a9edb6066bcd9392114a0f18f4c70ccde8d9c24f3b459930c19e95e506 -887: 743b81138452ca16e51747a1662402ee0d9eac3550011931aec68a63727b6894 -888: ec0de7ecff31949c1922903825b76e67cf27c61d8fe100a5d0af52445aceb262 -889: ac98c3e8d99163b7c3f81f263468de61cd19cec791164a1a38ce0ab440aeb324 -890: b4bd0129e6cf5223eaacc456653fc43936d376d90abcc0f08604d0cb7eeb72c9 -891: d3ef730208652e44eb49ecebd0a0e0dd885e9ae13e608c2ea15690be6b0cfabe -892: 0cb39c3968bcb3d4df407cba298c3fdff967e494effcd9f4fb4dcf846d0ef7f3 -893: df067b52d70efe10ee799741354efc807f4cf323c6199ffa3006a89820196fec -894: 49c36112b26485e2c4184371937988ca9edfc53d0055ba438f7ac8f7466f4ae0 -895: 779075e7ba4d73acfeb8b00f20f03ecac57bfc4db7d907c33f65c10a65de890f -896: c9c078d711266ffe91f523384168b90f1bd00efc2da110778b9cba2f0871db49 -897: 4f2d2969f130c86498c3d4452a9769978990feaa3068bb338474e2063fb47364 -898: a84a2762530ef03398c4c7f4c456364848d91201bb0cb122ff5b18e9e39b0e23 -899: 8ec0cf65d1b765c086dde69a3ec04bc425342a4bdff439058440bb8958fae5f5 -900: d30cfe6d61b9fd4b017d6c9d7d9273e8418d0ae9b8fde5ae767ac80a6ea21901 -901: 3fcf48533859c643a0396c0b597dd9b3802d52c823b5fc9b76e6880fcfb840a8 -902: a5896436484d5efd5a74b8f467a15ad21993f411f27a262912940d4d85e2aaaa -903: 70dc9ceb90614f80df7c9c113b13307d71a4cabb766d09623d28383fa000f8de -904: 5acbfa317c6a381e91ac6c4e856cf341d8d017b6c4f378b2f283ae5fc683c9f7 -905: 2269a8c37a0489ce983f89e5610a5c992b010e9663ed854bc85826c5938ea65f -906: 9a759ebb80007327ca50b5d2d0c48a62ffbf75130b942f9ee05f33d69c997361 -907: cd625ce6c86f80cdae5d4256307200055674905dc4d97f93146ce60b4fe7f4d6 -908: d5735fffa3c594d447ae869b6f97df71a8437a7beca74b7c1b7ab7cbee131122 -909: c6997bcd287033749df80813acb98039278ddbf4a56896a3c4c852114b3d4a22 -910: 93cccb0ecb7988e965cc9efc6d7ac1ff834fbc10be6fda4867ad75c51744138f -911: fbf47e7817a7ce0c3bfded8ea030550b6d6f6de53e103878111f101e49f9445f -912: 5c89a1c644d89f7acebb9b1f9ce51a2ccee9ca212dd8adfa0d610baab3186167 -913: dc28c7d675adfe5a1a7c69400c3dbf5b38332050e4317a1cbdb275247262ca53 -914: c1cb82bc179b22b3a5d9f0355da80ac050236bc73248ec93b8dbbd053298aad2 -915: 5e6e7c848d5df0cf67b72e28e216483216fe84e5d4fe37317369c19603cf0bf3 -916: b19c2c5c2b1a45b6bce242c9aa9adff56affb1f88be4a2645cf76c42f46c7847 -917: be55f3c6e3b22eaa9c1865653a8c91ebb7f414f9a12cdbfb62938945dbc36ab9 -918: 1f32898862ab8d7bbd37d472f0c7eaae7fe2f084f8fd45f05dcb764ca5b600be -919: d07488ed1439a7213396a1ae28886ffa5c4d3cbc74c175cf375402f56988e15b -920: f0b8e66863472f11e758bc94d8a98ee308e5a05490e5db4fb66e1dc09f4e52a3 -921: 67d9acd2df48f467b4f7a84f760730a92c635e928df5621f6afdeed3e195d3d8 -922: 848e6416b52a2ff5c7d7a5e6eed3416c1deef9584f60a5f6c3a2854f0a501faf -923: 5f07bf7c71d71b0cfcb5fe04fb2f1f8a950673754dec4e816ca84f82e663a9e3 -924: 154aedec1b966263e4151b44a8c438bc5f81de0170229bcc20c20f80d85254df -925: 91707a58602431d402edc2258eb703be7603528faa3fc6fa0f6b1e6a4db7c234 -926: 8210b096d070cf4b23238373eaa334784226d472bd5a75abc4bcd512cdd51553 -927: bb818b548724ecbfc298a06c732ac64a20846953ed2eb98c452948c764b4e17e -928: b590d8e03bfe80fd84cd64c1ccf606e75ad702eafaf5353e72e38481f7c3d3b9 -929: 571308cd156b690c3b03a9f857c3b14d91124895a73a2fa041d3039c58468b36 -930: 5470e7f92b880ade0fbada76a0c06d5da0c38e5569c59c11689422144cf3e368 -931: 0584120c3727f510f276d173e1fafbcafeb3fed34bb6639d477db27a7e307d86 -932: ff177489756c5c08e42a9257170d31de9f5420056514c5a6c9ac00c5f9aa04fd -933: 826d14a8ec2b8611009cd1507b8df8c8796889cfe9555db9a8fcc930ef5ee609 -934: b11bb13741a897d8d52f29e0720f1245c25cdc78af34d1b66818506989f63df7 -935: f29205e421662f14d8d93573d326f3d7c98df9527f3a011853e309830b24053a -936: 4f8f5839a9c97e8e6b4661232ce36d14727b4ba88cc07e22e58f3d0792156737 -937: f33b892df0aa30fd76a13fd6250efa31568e0c119177ff5ef70ca1382a125990 -938: 3dd1d304670e333bb982b78ef90eef332b7ab56badd527efa371db1d72a0c030 -939: 456f703691bfa76e0267c4ca9000993ff4ac6daf118b852dd6c763354f1dc1a1 -940: 88f1827525c56fa450ec069a75af48a66c60dd82d6936b71bdddc33bd70882ef -941: be043aa1646c1429738dc5c134672819b6696e79be9c7a98de1afa0d907e09ab -942: c58f652f83e42206e0495bb43b7104849dcf0d4e4ea288ceaa8d221929048209 -943: c0a5542106b07172680af9cf134a8dd6c6aff11b334cbe5152a64d14f97ce5d3 -944: 90cf70305c87a86ae7cb3584858b09621896b6b902bd0f835afe776c0ab3575a -945: 623b58198f6f8b60a5291d1564715f6c177ed6a9795f6a22aac34769d4b781aa -946: 2eca286f8e943a0eb575a8aa472ce251c4a06e956031b9061871726319f33a9d -947: a187c87507d00d8e121bf22bd3a5381cff980a33db532fe1931aaac261bfbbcc -948: 2d1802473442182f0d2268ba7c9bcb6d2343db00d1bc7cceefb05789307387ff -949: fbcfc7d9fa122f09082876a7ba52b087553e5e434536ae272900531d9fd7c5a0 -950: 05fae880424e2b6896c06c0868b7516d04a20addee4ae06d7dfa3d2e8528c23d -951: 556a1aa2712f77d0e29e84189b1907c14ff74a242284eb8d8fd81ff4c9a24d33 -952: fd78fbe54ab202e7f63e87950e60969fe6c6ed0b5b5b9f1a6a64f8f6629263e3 -953: a72ac6b1f94bd82fc1db4d0df37b3c328282bf702a2e80bc6b443319c3127446 -954: f43267b1413f6687a0fc6919f4992920d1a74f3ea43fc087c815f6e6066d1887 -955: a8edc9db69f79246cbb57c2b2996c14ae36a4802074f650e93a1fcac77a259bd -956: a59f159a23a1505a09994c298e654afac0c8d6e2f3f783069a49d8f7f3a8aa5d -957: 665c8ccb1d3c8114ce342ca49cfcc967d166739db626413d42d55b8d2714bb31 -958: 5295ce9d52528268bba400d07d3f7bbfd85097c9f69aa1c58fb4c0201a974851 -959: ad837aaefaed57256edebe44e09dba02d6810244b6a765deab4da65906785f5a -960: aae3fb65120676a8756456c8e56846efc89acac7eb2500551446d8bf00e0a75e -961: 0ac1cf7e1bc2d02b05386342d8bdbf58a7c62976df7190f35653aa8daff30ccc -962: 05a4b48144bed7422054a947e7efa5a1c1517478b9ec633e449a8cc192dd2ae6 -963: d495cb49245a64f0c098e355584ab22e496f551c6db141450d4f2d5473abcc44 -964: 8873017ec15e2ab8207cb9e54426dd670a3beaab33db805aa01c1779cac20e72 -965: 0ee4c3502941396bacf4d957519d4ef4a4f692c582c6c2344fdfdbecde8275a1 -966: 2bbc9539dd2ecf542d36dad04808145ab85640a14ef9d5ac272485bd8f4144cc -967: aadb52646899d16bf8149a8838b15a8e4071d3d2499f38c1fd347931d7e99097 -968: 3a36bb3c62181f1906ced66e0aa9090041e1783c85b37008fd91429becfe1c27 -969: d0949593b37749c149f865d0c1feb635a51b6ab2f1534e4b9fb0e93d9650ba71 -970: f7ef0b7a549a0d3949bdf395deafe817e91cd8a1a7a7ab54c0b592933368b773 -971: 09266b160df5ada7a2956d2e3b12d4cd54339688fe13914cb4464c4ce54763c8 -972: 74d5f9b29bad60571c3b13b4374b5d9e2d2c2104e5b8b08a9a46697c4db26cd4 -973: 12523e5f97e8d85e409d8fce5a730c6f32cd05a69d607ef3f0b05c58b52265ab -974: 1a987e6dfb4a4343370a8fd5bfcf192d3374a4e5480108021180e03ef37fc6ed -975: aaaf1ce8d227164a535129c4d6352005520d4f2f5946ceb6ed8972453ad67fa9 -976: d25e2c85bca0ef83a141227ef2c9886d07e86d6b1c40e3f7cdd14f84d1e92fe7 -977: 37471a4ccaf0071fe0f3c31281b44b8197e8ef9e7301c6f53184f08ef63c5d43 -978: b0e16ba5daa317c063e157e75d42de05927a58054e3737542fc258a3cfe4070a -979: d4c184e0d658a3e24a7d25a7100ce03eee215547c335844f2d8cdb8a2b1a9e79 -980: be055df17f2d7082f4647dc4099f5c0585efcd6423a40551ee589255ad984991 -981: 09caa9af48d02c98ff7107153b1fc380af3fb9d3f00a8091cc8336d84f859ed0 -982: 67b2ca10f46e731cc00097205087b5c16d60a29ca1cbdd8f1a375d8b6fa60d78 -983: 0396ba72836444de8f0c354b8a938395b670eac515fb224a6b073bbf10bcff16 -984: f77dd049a4f6d078b810af3e0ecc9f76dcfdbea413dfcd709a1f86c915c392b3 -985: bb76a5acb950ca6fb0115097b948c3b7e928498cca4bc65e1ae7c45023642bf6 -986: 45f58d18384049501fe1cd351e3bc7f612a548ff7ca10be59a9795dc07787dfc -987: 70a5ab10d8b77ba8d578bc4884c50a62a31aa53a07f81688b3658f4eb9827ff8 -988: 12de07ccf3b01d9e39ab693a24b5563635ab0d20b0d25145ebe031b151b3cffd -989: 9d54cf86f8fa928f4b248978121f2a7608e1499a3f55edb16d00e4ce3073887e -990: 523110a7ecc629c613b459c83788c9e66897d5d2e92529c4dcb6d45003c5ea7b -991: 465c58b36171c47156ac95d570671a4f0a68237404b960b0517a94b279434ba4 -992: 6fb4c0905e1cdf34e70a2be73e3ab7e48a687efa5f8dce261bedff93011c639d -993: a316920e76d547f001de8e1e4f4efd0bb4801dd6f453e03f6f9035055ff67de2 -994: 95616eabea52bee828193c8de7e3f442164295a0511bdace71109df206cc51bd -995: f57edb955a21ee7a7c1df5ee6c6b307796ff6bbf702ac489077e847d9f589405 -996: 84f6a4e89e73f8ae45094c8566e93b60c51e02105e2ed07789e761adc269e6ab -997: 2102a6c04cf648d73c7bb78660a8b6654e97e557f6b4faff3361074f4b509824 -998: d7224aa3f93a0f23514e696c3ec982b780f9c4c50bf7b302734e4ac440ed0485 -999: dbd4d0cf3b068945805d85244cacec331f1ef1bce5e679d353e1b95d5559a07e -1000: 1a888206971be51a4535e1a15d4696b6ba4425fc1083911f274d748876549179 diff --git a/hash.2 b/hash.2 deleted file mode 100644 index 30179f1..0000000 --- a/hash.2 +++ /dev/null @@ -1,1001 +0,0 @@ -0: 85dce2ad6ba50a0ec4162ad0598336517ad73f10e8ee16192f5fa0d6111415c0 -1: 967af4d7613e63ae6cd2f05df12e2c8d125f5128ec07521a6b313c24a15310dd -2: 7eea68f7007f367e09493c70edb150fdeddc16ec56123253516696900ed56fe4 -3: 4fe640d5106f16b6ee464b7c21da1e3c3e0223b407d0c6a3639230ef65f8e309 -4: 3632c69123a4a7cc5b4b45ddea2b1572ec877943d058dbaeee0d7fb02a64cf0f -5: b3f14807af541756e10a3cd81e812ee5d51505baf6421dfbf2810facee611c94 -6: 19fb1cbd59d7ac9b370488d9a55c1fdc79c1d8b8e4acb8607b5347b065ccd4d9 -7: 8a23d1395d1eaedf268b56ff978bca521a82c13a471adfeb85376220436f6be0 -8: 5abceb6e6598736cc1b81cb10d644d95707803988559a5d34e97b38c7ba6b61d -9: eb44cd7554093a31e15f13315c88303f9cbcc12c260c1104aaf2f7d322a4cd75 -10: d3296f612c32fc482c190825523af7c53561ab65e53a89a9360146ceef7592f2 -11: be3e464b70ac3060f456aabef84f770cb61c597c34b449588578544a3e319724 -12: f2481bdd304361d3366f8b47d030181ed574be70ffcaf2e46bbbcdd9fca86f88 -13: 9d8806d808ffa4fcb20dd8c6e83d76261579d4d55dbac5fb45c843704fc853d9 -14: d7154bae8ec7256fc5c6e69689642a2be5a4050223418a6fb42a069665c1e8ae -15: 9d508212c183bc60199bc8d452ee1410341269e486d8887e6b873309bc07ae1d -16: a998b3bf8609d89a750522039413c31b67e4d8ad5bde96f8676fb845257c77db -17: 267512254d3df3188031b77dae4378f1b2cefbc136777e7ff450d9249dd7631d -18: d484670f6ded2ba8f3e1a926b25fd9df59f6c57b5a7ef6ae528a82f6fc096f39 -19: 8a9694e39a0f7597a517c9ebc0d29aa47d38ba488289433caa578c31dbad4d87 -20: 8ec179071c95681b40b81cfcb878cf30388917844b8cc0a70106646a2509d54f -21: 5d6d37a33541f7c27460408529d4a2011906d4dfe215fba1ba654a8d0e57d522 -22: 2d493b9694a77fa55453ec259182ab55de0b504d9358047d5d8dae34df779fca -23: cf99972160728ec412d836ca2f9d0af86b74d6bbd46e9998f941d1ed2fe3032d -24: 6a44bd9e825c146850a76356ba47e62c71420a6f7b3108b62d58640290fc27f0 -25: 534294e4cedf8630d14b0ad75bc732f6e02aebae0c4d72de37592deeab493d36 -26: c99fb8948e39addf22fe084fd260e2c7dbacf6dd0ae5631ad9da1b8f2c887774 -27: c55f039a282306e34d74b1d3d4d79432caada63ce94a20e18ce1e3a1047b5c75 -28: 0e1d4f3dcc82aad407948b3bda370dbebb3453be9445ee746c31b6a6e29f834d -29: fe1e351a0405674718d2731949970188891e60a22454162607cc331bf0250925 -30: 49fe281b7e21d1f12cc071368359f07e9022d20d0ccad6da269d5c06e08985b1 -31: b22666b1f8fd1ecf1a73f15132f95492ca95556e2724d7c83d62c61229365534 -32: 42e4a64c2302db6677e55397e081b3b318db7372b648920f8a37780ab1cd3ce6 -33: b16a21a8dcad9d14d1c9f206d8da2f1bed1827b9c27570d8f762a42ea324abe5 -34: 841d5e62b2baf1bec33817a764e76447da91c3ec3bb76c71aa7b843fe742dc56 -35: 63e2031c2ba2de22f57c078f30ee466224aa9e645955c4d7c9f33cffa0b04c5b -36: 57b3d4a9b99c5b30bc07aba0a104dbf6323919c7829316af44de717606674d6a -37: 52cc02a6c375c8661d5ae7640c12d4a99d471a68a8adc24c4b7b775faab15519 -38: b74dd5dacb02d8991de0d890f28e9d9541728458897f185ea2ee461edbc862f1 -39: 00eb716f16f532d8cd216c2381045a03600cfdcddb5cff899327872d1e4c56ec -40: 62d17a5c7852291a20954e947712d9190124962c82c25de397e392d998096f4c -41: 3651989b89c2177d3dafa548696e28f4d158304424395c2f96b5268944f60c38 -42: 97c011124265b78962504cf4c57b701c47e12c5509d42b239496e39613e62e33 -43: b2650e0fe7cafd2f753baa4cb4b9130cbc42b1ee98beed229003ab5e6f6629db -44: b0890007bcf10bd94da7a0b43bd64da4205665e70b3bb9c1f6e7f72199a1f0eb -45: bc342e0606491fe6a11cf901b41e872c2bc532af5cb8bef2a93c80e87b29061f -46: 320f03dac702ecd4f942b33805944e1419f22325a956d61afe35dc224b252cce -47: 14fea152c29f1198c1f60f5e5937dd7c875a3491728043210c784feae9484426 -48: 646f5ca122eb0bf206c1481c170ab7a003b220e66c838dc8d67e71244337f7c6 -49: 9750f6ad64bba9df8824f67d75d37d0c0ee31ae765e7422f226ae9542492d82d -50: 2a41aae9491dc68e12bea51a9662ee0c0b6c485947189e075f2ebeaffeca6c41 -51: 77d710e29edcade288ed971d0de133c54f5846f3f663d22232d684c8d9125652 -52: eaae5db00afaee3de0c3e21655a2cd8368ff7e7dfc0fff64af87312a7eebb0fe -53: 5e9e1c024afe55d81b6ac8557f2867e5f7c378d6b58a757f65ffd81af1aa7925 -54: bcd1508137fb9456e0cd307e405d02ff17be39ec5a8dee6cd0a8219b88c72495 -55: 337bafca56c5dbf80d610b7477a65fcdbaac5b7060b16b5bb295d684c41355d8 -56: 1d3fbeb378a2287bdc5f4a20f1a4328905391f61654797d4710c9247d7e3376c -57: 59721454570ca2b55c09ca70ad99dea88ee5bab0444cc4c957a80b8602e764fb -58: e07829c5b27d55c8ddf75d14ad8d8d25c7dded815d58d67b89f0d682a9e3ac42 -59: 992b6df70082b7fd720529ac7eef352646e6c9f6642e0336080dd5239d6c111d -60: 75fd1ce46bccefcc1cc1680a192dc545c91fb4262f1ac2cd5aeebc9a906e6a84 -61: 4384d8d5cc81a5772d479fa636aae5e750e6006d73dbf06c662e5630cc9f2f73 -62: f2c6049bbd9242d9739f2a408169452a7c7f99e3d44b414ced10361ebbfb9861 -63: a5b666b5b0a2d63415b744a61d78cb7e2a57658e0f5587b75acc75268a7ecc9c -64: 0fd368e2923173329fff18564ecf4e4c3100f9d116bc2e34fc6c43e0f152f789 -65: 6a18f6aef35207192c09a7670854d76313e230450b11c1ae09dcac738ae29a75 -66: d6bca17093abc1619e048ee9c1687161f60db61f5fa45f32e5f413a2211a3ad1 -67: 2b3eed034067549495fb0906972c5d046f53d26fc4f0603ae0fbe216e164d5a3 -68: 287e82c3da770aca0a53f424c4b1392bb1de1178e05dc7a762af59ffb6cb3504 -69: 7dc33c0676c18be0c98f91b45055a39aa4bdb5774d1f3d2b364509117d5199f9 -70: 8ac0505260206de8c3e64a03800aebbe06e20decbb7e1ebb08605fe6e1cd7de5 -71: a5f80ddf555516ef4540fb4882faf398e8113b90dc0436da6ade4e2585c135da -72: ec628bba9ce4d21d7a4e94908bcb93e97b9356322349420f877562f8ab806c7a -73: 8a933684d3b07d9cd9e7a85fa06f2f8fad6585bf00e3749e81a55783a4c33ac4 -74: 61471ee903ac7f8383b5fe4f06d17b3d6776bb86338e6bb4d8d4661d22a0db94 -75: d21c9f3f385090e34b25b021a4f89881c4cab9025c6bd07ea496811d55cab4f5 -76: f35ab97584d028e267ede7aa6810439130e9af020f3fba217b5f5f05f0b3fab6 -77: 1eebd15a4b141e3c57282e69f9ab7c9a26e027e97cb969b30a81cf2aedbc6d5b -78: 0d3601637e980370f233a99fb26df1698db1fa8f6ba08b17fc5981da1a0a9c4b -79: ea5e9db8b0d525e61a8c2f4222f0e234b5d11956968d75fdad29ba729c31c30f -80: f82393ee4a0e993afbbe499096b86fa9e38e9365ce39bf637a66148e563a7562 -81: 877c9e5fe589356a397ad27d41aa6c266575a3fa7b1041f780c9fd71e38a59b9 -82: b594a19913145eb74196b03b790d1166a3ee5483c4056bffecce0851f0fa62c3 -83: f4bd80926351cc2adb02a3987be946398cf90b02a73c30a34142ee9cf4e6d6b7 -84: 6554661e3bab5d0cd67a4aa12f851624fb59a37f76d67dc261f91dcef4e99f56 -85: 9101f3a09b1e2f4164e324c3a9a6550966b19f8f15f35dfaa7e5d5880c97c434 -86: e3a8b17948e7d9a6073d7f7f3dd324fe558115b720a1adf4e5ee5277245cb183 -87: 7285be9c5b90c66c3cb2c7aa23b2614c9acdea964bc8695a1428fc714976f812 -88: 47104b5c6fb4ec27cf85c1a3e22fe631928538b6e39a7c4a8b19fa216a965155 -89: 3e7bf9add688476395fb369d0b51854f13871e6ab911220f4a2c35bfc82fbbce -90: f5384db8e17f02eec498c8688e9ddcb9927d698f969d398ca3777daa53c63d1e -91: 52939a46ed816e22e051aa8cf603b49fe12db3e14fff5577ee5fa709bba0e246 -92: 5984cc844cee6f30e28a7a4569a303aad5fbc647eaef45532ee2a3a4f3e334a6 -93: 60795ea26fa1124808272d8fa41dd10b04dc832aa2a4b29ec2a67d0aee8326e4 -94: 096f2ebb8dd1a655df783e6366a9826e8d2cbb45a863a2150126048c4a3bb422 -95: c02e2508f4ecc02654973ab7bbc697356b244e2064711d32034f41ec6c8010f3 -96: 399bb57ef99b37f9bf110c800857479ff5a4a6d615c28f1ab2e6b135f241f63b -97: 538146e200b04cb7eee283bf11c622f487b164b45aa507997076c1a714bb7037 -98: 634f3e4040a82fdad1c2f9986856ea84a29c11b780832433c72f53c38a9989e8 -99: 857ac7b15eacd88adc2aee1935d2deb1613a4fe6a07ef321b31d6459205efb32 -100: b9c18f78c6c126d024475a4cee31c86823a9b78948913042795324847c2ec260 -101: 4c21bbdc6c098799cc054ef6e4363ac809913ff273528755ce091fe8cea5dcef -102: 3574bf8d1624d866c339e7b58b4e4aa2437ab5792ec3a18c2ee3d6bdc0ba07c0 -103: 3ad028b3670b7e0df2031fabd8816516e19e10bf06babc5eeca48d80800f060c -104: d356b9a32be6600604ffe9e5c80943300625d89cb3834dd8b2cb1518b681991e -105: a330970603e32bea86778320be1fb89c1553c3c0703236a20d9ffb03f39e451b -106: 7d55c46d31de40187a5d9a1b82626c44fdd05dc92b8fe8f932a1cefbf15803db -107: ddd8827353b8b2cdfadf52c65201808e31586795fa5086eb04fabc3be56cfbea -108: 7abdf987458b0916a6ca6585ff616e6b5d385c0cd31dbdc66c6c613d4ec6b444 -109: 7bcf2da4858bf72820343567b4e27363c0f9c4576fca736fc12446637b04056c -110: 5796ddefaab6e59164723c4bc81d4d4044c25e4a5ed3e6982c3068394be6e765 -111: 50ee47bf8ca763c2d71db5251497889abd6bddeef350d774c8561791a42b8d3d -112: 78772ed96cdc0df15f826f62d72e1f0a9bace9921ae6880b157afcf12d2c5c62 -113: 0b3d2afe5cd8da4d61dcf951afa561b368644812a367d72c14062a189ff48b2b -114: c3ee44bcc9467d6eaa38f23bd58cc345cb6027af6c35fe101e72cd7d8f20ca79 -115: d85baa9f673ffb8ee642a26cc2eed5b2f7cabddcc1e3a57da6d25a9ff21a7ba8 -116: 22f6b3d8c00d5f6ab92583848a14e1b7ef3b7c183a26ffdc4d8bff0ea45d40c5 -117: 725b763fc442a935187982ed76d0579dc8dcc03f6d5247b8163e7d4f2d4df8e3 -118: c68d4f34319edc9c6be7fa9c2be8ebf71a3fe18f04e4b0adae0441afb2b04a85 -119: bd380ee1173ca47965d6d1bc350a2890063bb80253beda787d04129d425c561a -120: ab3069c2af2f4fbde79b2bcbbb407a7e7ebba04b9d479a61f12d6d381fb616bc -121: b5bef1a995fa71e6c391e0ebcea3d5b004c09d20b859040045a3ce5bea9538bc -122: 7cdee81258a876cc3396fb581e98fdb336dd1950a201655b45d3e79320162627 -123: 2fcb8b25d17eaac4370ef0a188e6666bbf966176b647b174fa9eecf2abec55e2 -124: 2d5324eeca9047ba17815e13e9e46ceaeeeee6b617725e9c24095356292c7540 -125: db01b4b82ae2f9e2757f66ec878a45174f7c23406b046926cd2586a76ef0949e -126: 410742c1ae1d14142d796f4603531e78b30866fa979a4adad4a49e9fdd3364fe -127: 2912f9acbdb4627c37fb1f643f67bcfa73a9fceb2d848ca7093664256c3f7ceb -128: 640f47f565d46dfe065e24cc266855c8b883dac354f25483c628728f8bc23149 -129: 175bd5ab889991582d8554c8a576293bc14be7226791b5352eba5aa3d6434de7 -130: b7f915cf072ebc03361a60e75483d96383bb67bbef4fd6b7a091255d72ffdba5 -131: c547751a862d00e7c5cebf2886e1b7feaae7c3382e80a7d3a306bf66c035b049 -132: 1e38d4d5fca04af54b42e53a1f80025534b915fcb3929cf08447e31a97f8fb4d -133: b4c3f2baab14feca2c91ec75d115d231d078b5571c8d79bc966d5ac7154beccd -134: c4fec2cd994c7dfd7b8525c27bdd42aa6f4bb263006f2939d94cd20d6008a44d -135: 32e2c07f62db8ebcd805a518e471c021b5940689d62ec56cc031045ee9af9513 -136: 3972cf6ee94c3b4701f3fa7fa9f7be130abf7da6559b6cba5d4037ba61ba4b6e -137: 74ccea30243f54b1e99b1f98b1a565fc5bc12c0cb372c0bb347d66df0f5b6c5c -138: d487a1505e3a398fd212c1df23eb124d7f16baea31ec1a8097fd2548d66c9de8 -139: 2054c1791dd0a033f054831b3e1a04a3114cf3f30b757d55115d0982de043652 -140: a549f0ec73a288b97f256153171dcef571008e1e35a9cd8d711393be473db126 -141: 59df9467e37cb4a346b8e12193c6d88e9dd6aed0e78c42372976db0bd4a24310 -142: 068e7dde0bb916b33c20310b8274aef929f2af47fff613f9fa36be085be4b800 -143: a8f28880fb2887738be1ab65dd98670a6cb0ebd89ab1f1a95a63aee1428efe1e -144: 45b277871b78f4591cc67349da916f07a5c2fccab58b12ea7afe4ab5c96d7fcd -145: 15c6252b88e4cfcc42dfc10638d01c080d8ac7759ca2c6e605ead3488b415e9c -146: 2205890b5e8deffb8a7c8270487a08bdae83ba0a823a3d7e98f7593bd80aec75 -147: 796161b2b7c7668c313ed3a4c96c749787d433288650a30a5e20268c5348f0d0 -148: 6d27d2926b2cc062a5eb332a1dd9084dff917d6014eec2b297e89e2ac0b0fb73 -149: 379c422916ddc464d9038edbed5007932a809547c63611a83b4651741f370ab8 -150: d3c26dd08a7a5587b4e5abd4fa55ff01127bbb715182f535a415555009862355 -151: 4366a1b92bbe908968acb1dd2a4e1461bed095fa6bfee3edbad953c5e9bfb1b7 -152: 62e6790aa528480602f628546cc04f828702b5423a6f6d6e7553ae8e8c34274d -153: 2a34e923990ca42a6534f14c02944e9f13d04fc926d3225c372818df47069c66 -154: 7163bf10bb131a014ab065e5170384af8c80cb09a49874d4d459127f09959997 -155: 039dc2b701808a89fbde295e55dff4abd976a508a817cea65b98caf0375ee8ad -156: c2341af85a957814610ede9b39d110910273f0627749a41e82c8249e841dd684 -157: df5638c7eabc9c0fede2341be6b46f003610768b90d15dc235df662cb3ed01eb -158: 31f31fa4ea63eaff1c1b31982a8874408681970fe211c5a68846cf10043a9347 -159: da2bc98b35182b12fdbf81352666848f1562a0b235293012c28489cb04616b46 -160: 21e6e3278390ec9dd492369dc2d5e04da3b393f630bc9a1e47d8ae1173f046d8 -161: 0b0d1d9a3cdd175998bb4e83436c81c1da079e6347c81a8a5d940fe910c145a6 -162: b557f92e62e8316633fd61fbdd8d726e7fb3c8e413eb5411ebd9263973f1ecc3 -163: 022cd2cf5a5a16f28e2d8a65130f70ce12232efff8ec21b97e935b16d7726a2c -164: 48b2a67cccf18b25a005073f244404099e3803c839b929054c839beea3420cc5 -165: 1078303bed2aead2ec811cfa4fa41c3bd4536290e0d690d3d0378124387bcdce -166: 8c6218f83e12015def099c649216ee489bfcf6a86e8c13e2d2eabfb083d44478 -167: 16399aaf5de31a47300043fcbaeb8ea5abe4b9206bf28f648cb41843670be2c1 -168: f64128bd0c936e4f59d172e61dc99dfd85907d14d3e59f0f0554defb246ceb45 -169: 91ea1c7acefe0f3f9d0ff988fce594a3aa9fe943dc38351f282003056eb3d177 -170: 9d3ed59fdc903ec87c8e4d2b1a7fbcd338298bb5aa6f321e401fd388cc5d3a17 -171: 93896f5a03b4aa3eb26cc34bae3124e42e5f661f8811b92ffc0a66964e4a08a1 -172: 5220ff28bdaa8286f94646feff8b615c38f80fbca37857fc3e81a3d6ef561e52 -173: f3434ecda75e0216226e1e5bf9143ac62852691ca5ccaf8954420f73ff0e3b05 -174: cc2a0b6ae2447b3733762f34657287f4843362c232c99310162fbb6ff0d50123 -175: ceb7be0ae2fc7f06e0ea102aebf343cb37c65deee88e2b3a538dc747979f8ae8 -176: 081f689b66146e7a256b1f645227cb3c9ebfbd04ad7cc52cedf1acbc21d43dfe -177: 116944f76f92bd752c7dede3ae8aaaa3e78c9f4c168ce1e4f8bed4051fb93b0b -178: decd90f07fbe6b0720886d0afb4cbf31e251882d6f7bec8c3482f8ef0cc8eaf7 -179: 8796057000a4cc5092554b1ca6826876f433a260b5369814ef293ba3562f4ce7 -180: 88b6522669a0e6b78af9974bc208499602e4ade0943e8d65c0eaafd854481f48 -181: 8e7428c3c728b8fbace45c64df9b4957592348c81433bcf6b81d3c2e7ae72c90 -182: 9372a0f5b68defaa0676b78320c16502801ddc3255b523e0801505ff5e7f16e0 -183: 6e86012d3547c33aadd438d6efe4ef06822f2a964ba16456054c7d7f1552fa26 -184: f740b3f95a86764d5a8031847becdcd2d259180e3de84bf074f993effde9971e -185: 59bdebc53a196c3018fc6fd4d6e9b6774ffbea7800700c8670df1276aa860bc4 -186: ed215e876c7709f3f456041863072e245600beaa6911aee29d8622de44ed33b1 -187: 4505f43b3569d2013cc3fc17ac31a329c4109611bc90fc610b7a47df00057375 -188: 6ff109260f1b3aa2d7dd09a8041dc194932dea241cb5e31e63612dad5aaddae5 -189: 48682afe897dc03b3d1ca634a183bc85dd51fdf049c8968a6d65c071c6afc514 -190: d3390ec0bdda39a01052620d7b6ae10d3275bf2eeb728b29b8f9a200c2899bc0 -191: 5b861e4da914e584b381f6d37f2c8458cb7a9fdc096220116bd184595d09afee -192: 18e51ddff9f391a89771af8fc5af6a269425fdc0885c1ab23c7b1498647ba951 -193: e379048af309c10fd9a95c37671f1965602a19d72b37765b6880f78e5575d00e -194: 2a03863aa3f1818018a31a289a1f74b43cd3486a6186332ea9d187cf4d778b8a -195: b06b627d0b9988f6246a2c74aa07f2f064a975a9ea72189cf70ef7738a550fc7 -196: 24b49031bb78a51beefec8aa02ee0c3f20a0bc8e23906ecb05a2e713675a283e -197: c91b153c4d07090707d66874074179278c760b59e0bbc488488112abfbe0a00f -198: 880aaeb0896c44b2e857cacb4e86c4430087f1524c25672ab3ffc3ed74f223ce -199: 8f79f1a6cbbf335cf629c9d0f9cd2e1a2e8f75dd911d7cda3d8ac7a0e9b44c03 -200: 22fe080dfbe76d382bcb438d9bb45671084d45f94c330436391e7d820d196598 -201: 836bbd51ce9e65eb7051f2e5e3c60816fdc6076b141df672ef8dd65acada203a -202: e454eb81a9fcd1e29b2313ba44020ef5ef60c2e3fd3b0566c74b87092afde086 -203: 6535ff734a6fdc4d577ea4218c657b65cd1be4ae2374d8564b01327b86da71b2 -204: 2265e8de4d67982ae7101f5dae68ca9f9657d2db3778702d909b79c6a86a5795 -205: 85fe8633bb3ccde13c7b479776aa1c41db83c4b764fce90ed14df15467a4666b -206: cad903e7b72d170c09fb62d3907f9b561af4ec18ddb28743ecd4cb733093de3a -207: 491a3cdbe7c160b955e34a93094302f1c01662e1ec30816e4516bf4e1c61b76c -208: 7ed8eb5cb2d7ee6f9e2488dd8fa835f6f22109f42215b901d5e4c4359ad30ee2 -209: 1cb36c31e915894a6a2533ccfd3859046a1dcf78d8452bc88958dde0ca191e82 -210: 7996ba8fbd81c2eb0becdbad564153c598abfa2b0f69bc3ce6566a78931d0b3b -211: 81289aa5f1dd141efdcdfc5337decd1399a8aeedfdeddeae6276288106bb76df -212: e4b3053295d363cdbb2572e7c374ae879efc9421701310a34db983a4249c74cd -213: 6122b9e38c62b79f5ae2511de6795fb0fc853a0aca3fcef4a182ed52439037e3 -214: 74982ecd365733ffd752f772b3c8859b030f09b7667627bb6dfddaec59c30963 -215: 65ac368432a97208d4b02bb2481e674f31d90f4f18efc9375b92282432cd4398 -216: 0ae0472333635ff53374228f90d5cabaacbc0af29938fb8693b1d6303af5d819 -217: 47335e444a2f868bab1dd2bcbf7d696403e156139545a479710a6e559439a8c3 -218: 836aa3b53750ab893a8d2505787917fc35dca9cdd8e144474f86e2fc62aa2ac2 -219: 902ad618c9cace3b20b7608eced2ed3dfd0fd2dd26d1ea37e87134f114053aaa -220: eeee27753ed8a81edfd6a9f9cf22ea18536e6b7afe16cbfb795c84611f729b7f -221: 78689d14bf6f41cf48c193559ca84a3d9159e4d8b876d8ef4400ff13adc7e546 -222: e95c0cef65e3ec3fd4d13511442b43639025b54441d0f6eff2f3f0fd16112e49 -223: bdb7210e537118706f44ce3faed211cbf168d84bb0e987d4a283c854514a896c -224: 8c5f6f2b232c4ca41560d9a9cf2133b9e9cb18f5879fd4b33ef3eb63e599ce05 -225: 0362c89e151b3c9fee8518298cbffdd7248e55598f2aadca11349c6052634142 -226: f890d22cde86aa1c84b2b176f20fbb12dad5a01a5440b7ea9b95ccfdf3e1c3e5 -227: 07bb7b47c9b210d815f1069a0a41d3a84521e657b7acb287b1cd5cbb49f67ff1 -228: b1a066f1a5123b37a21fcc3f76776d39d9b1900ab322627c624ca36c41ec8c80 -229: ba78c1228e9c14a53840b0abf4c2453000a9f7987a214c25303404f73c631f05 -230: 5cf5cac55ed208adb8093b361dd8b9f5f02fb8a53cef52826924782e1f6a11b1 -231: 96c1b670f199bafe07ddfd47f1621f83358029a70de499e06bbdf703df203266 -232: 1edeb64a7da98efbeb47db24d63ef44715ce037f115cbae5f9352d95250ff191 -233: c35d4468f41c85e5cfc438f1710c8ac81a14208d98f7aab81d9a2af52b557d3e -234: 15bdd6d35bf282cabde4e76053970b0dab3be54b0d82d307a286e465c8cf5977 -235: a1f30cbdae18417c306ced42980242e75e26a46dca692c2a5c66fee091eee6ea -236: 7dfdaa74283d590bed1a93aa83690b94af6da5ab325048562328b12121a1fec3 -237: 505531a199bdac286d600f684a6db9eabe1ebb8484b87d9eaa645697793161e2 -238: dc9b0fa83e94aa6a077b27566bc819d3f6c4cd9de816528ba0a8307ba5a9ce89 -239: 0469c2d7c5238717833258ddca0e7b5e2935f88fc18302530c7d5f4d12b4e6c2 -240: 5444891f96afd31dfb90875ef6361330cc9066732820393af2bc8e7685d73219 -241: 96c7a7d1a89c2a7ff489b4da3dad6040d70678d943e493124ac85611da941ef3 -242: 83ed5df952c9a10321737683dae3f07a674130eb1e63808ff36657786ae90bc6 -243: 8306098da643d0d713485eb46ed5b2e195f5922059dfc4235c56598e63258915 -244: da3dce162705f1440002406c5789b185723547355b9f68e2b79752c69120cbc5 -245: 586b2770deedf675f605e7a0ea1749f4ccee4bd503e979bed27300665376e135 -246: 21e45166c93f32ddb9455bb5bf741b35dd091471e6be0fdb0a3e3989e8e03308 -247: 929f96737caef074135a18be5507aec562cceabf0f782f68819c600c171c6652 -248: 07673d367d2861655fab34786cfb189d1264040aab58f8ea997ae13b6c303e20 -249: b0d774540ae1680d4d5c47002145f86d64aa85739bc61f0fddd24341fc870736 -250: 90be88abc45f798dd28659b543f1740317abc8f5a7edd9cbaa6aeec8168b4eb1 -251: ccccc2ec1d5992b360136f83cda2adc2e4e921407589c633974316084a0a24d2 -252: 7d863f9d4cf437e5f01661a0427f5d84c857a14f0c45117bfd430e1ce1e83d37 -253: 0f1100223e9634fb289da37860841f227e30fc4445e05a89580af9e37df54006 -254: 989bc5068cad5a93f2cef1e4acc0031c3892e0a8336f57b967ed493ade127819 -255: d117be5bf4886475737e229feb3a212067df3b4d20476412148de596327e8629 -256: 7918e370264ffe9a954fe349ffd1b857dc73948de93ecba459dbf57231df395b -257: 9aecf8190d9f3c8aa026de18a609c14017a5cbedea830aa587bfa75741785c87 -258: 4675441cd704567d561a9a244649afad8c0218870d8422b280dca07765478f4b -259: 807d3e8c51d7ea6d1f9178769f2ba3e6ad3eab801a22a341eba696ef656812cf -260: c9327ebdee70d30bc6da82ce176be856e13661ad045195c7ea3cbce1a50eeb6d -261: d2892873d407dcc7ca8d153705b537e9babb6e8ee48d43db752be3d4d5bff8b7 -262: 4042e408eac4bd2d4780366df17273c674ad0975053af97525a585783926eec7 -263: 7ab2537e4623221c87469fac039dab9f948005a1309fe4cace36a165ef8489ac -264: f9be4b7e3dd88242e994c06ba87bf086bd012bc05739c130708678ac148ee2a6 -265: 67f78d0c6e565b0a3b266c7024973632256c7bb1a50f26e615700ac117f12e14 -266: 65860d112fbee85873f4491a062057a044b27b075054207d04b3e1c8e0ecd295 -267: d17dc8cbb6a4121053bc4595c8d472ebc25ec03e6a7a3cea9693f7a08857c19d -268: 8f5526c34c0560b272a783e8f84d8c6068361fc1fd98737f916539c4e5a786ca -269: 622442a15cfd2bb1d19a5bd917eade938c67576a2fd710f355423c7e362379d8 -270: 01aacbb60422586205c3b537bd8e6e3c3647a6a6959d8c572343dcd4c2a3fd03 -271: bfb97cfb6d5ea07d2d2bf8075791ec76e038ecae19738583ed75ed3af92b9dd8 -272: c3bbcf68c733161cacb2185e06bcc08e739e0156bf172b465cad0b286d651863 -273: 9860e97874180ce05482189ea83b9bd46df9c1ff84c063c04b55e5007d71e308 -274: 60f51f62146cda4f15c5f549330bcaf0df4a420aab37ead2e94115b28464ec68 -275: f820c827e5685de1586f0c4366d68434efeada7cc8e4816113f1ab7f854030a8 -276: 439ee42e996b28301a17903413e27bffc561c20127696a1fbd7a9ec1091d15d2 -277: bff9711495f8648195b9d685d74737505158c58dbbedba3af298a12ccabdf72b -278: 8b440ac27c9230c25b1091416c331ef3e7c63fafb4d3fbc5e7e67c9a96eee7c5 -279: 153d0606d52d37fcf1d765026d5db583b0d8ee70cfff0b31fcff893e22197d35 -280: 8f271450f8d016349330115729edd00dac6d4b4ac1b4ae5a34ed03c3895fc6ec -281: 5fd19597f8f2f54a105ce419652b6f31ff5f81b6e9c9fe11adc74d37cbdafffa -282: 83ec2c8abf39cb4ebc7aa584ddab071e0bf709f5dcccfc4032649ee8e934e9bd -283: 87223192712bbde69b66186f916aaa5e034133be0852e736ada9a4f2b6d15371 -284: 51881c2227b7940a388f28f75754a5a606f549abd05799a139913a0e4a7b24f8 -285: 449501d5e3a11f803d3db8047544ba233d33b88d0e338b1cd8a21d274068f399 -286: 86028c7871285d1f8039aefe02e4f8f5cf8611cffcae71633b41cf24ce1eae2d -287: e4a43cc54820d908d2f413ad9a43b8c5a4e635c96bf3080d5a1d2add8a3d6eef -288: 4044246981889dde292330066d8f563a73090f61522316aca1db1fff59c76b19 -289: 7b8fcbec4e16cc0b53159f002d00a4e7fd67c8a1e04792e26e97c2e8ab52d1a2 -290: 164a4ab46b7901283c57d89eba86b54b1398005eb3b9681617934cfa48c0a7cf -291: c234774ec19d702c50ff52ab2a5681aabbd194bb8a16375dc0baceeb4549886e -292: 5dcb231c4448ea274426f1d3b34a4b5b2639d88eff8312bc08c94ee50ef5128d -293: 2b79eb4bc6a5c548bfda75d29f6e987942bc7abe6eb4515edd838913a2edf245 -294: 8c6febc7c3da2fa7155bb9c066677f018c9e6b580b9b14d576d38bb533f66cf4 -295: ebc472cf68e67db6be510b6d4732672c43c74604964eb5b4433b9c779dc7be5a -296: 61e0af62939c09edd3e12e53dd5b304b4b8d787f57adb6027154f81c748bc1bb -297: cde92fb85c4aead4cc97f094f99f52379f5913a4857880f26a337851195c0541 -298: 48d22f360d786faed02cab1f293efa2372d1a81d22e2920f884bc379e87faba7 -299: 12041431911a6e89eae0e2210f2b68efcf666e6da9fc63c33a4efa73a513f45e -300: 0e859b529c474484c1daad4892757411be6c133915c71e11de6675303e8a4c5b -301: 4ea0f68329d2132134987b0a52d2a5f72b799a7888f8e51b538a3390adb18585 -302: 2228eab0ad664fa03107f7867ff9fac8d5314e296bc47cb429b6d59c08f8e38a -303: 9bb3fb3df5a2af73ab0f0957db8633b22ae1b257ccdbf6c01b644345228f71ab -304: 28060f06073a5b7044d979ac6ed092750933fa2a65834d8938ea1ef9b9b30621 -305: 7913cb25af88438f3a4be0a6ac9c136859efb982b51c43cc41f8f3e9880dbc46 -306: 0b58a75e74f595094152e3bee513f4b47f465e974428ec9cccdd71bf0137dcf4 -307: cf774b4ff8cf9a2b2df5478356699550be7a89d26ca7cd988bfd7efa53fd5437 -308: cd7b2510510b1e68c93af020629b2dfd5a4d0b258ec70dd601271cb9c04ff6e5 -309: ca1027e7ba838b52595f0a83fbb8d05e9417241f7a3c8c90799579183a2357a2 -310: 9916cc864cec1e57b549623007220d92320c51cc945bf1cc506deae386193dfd -311: 4f7f9bf00b3975efbc9ed9150c8b38971951bc420c38dcff173357d8594db52d -312: 584a91d99da2b8b99c12c615961f1a8ff5b758ea8780816e1a1767d55b1c197c -313: 2adc133ffcc65a546c198b3bf088be0bf68341f8c5b45edf0a79428cfef5de25 -314: f9488b9fe9b0ee2acaf54bd385dcba101fbbcc801b71d0c3a1d1c820f11acd65 -315: eae10e528082af6bd71edf955c6fc7873b41406f727fac18872ea586dd828302 -316: 8f6ce27e9e18ad70e112aa5daf18bf564284fe985833dd34eaecc6b5e064a771 -317: 6904feec855e513b2f2816ac5818335be61832d92fc5e020dda40bed646df7ff -318: ce212d5906da3e2701313d4111da2f23b0091347aa6107fb0e3fa8f05c8c6b7e -319: ae2aa88187825ee3364586f6b7b8394f1a7167710791447e381285707caa2949 -320: 2ee5e39f89d0420f9781a0fb572557595505b16c4110580f9e2510cdc37a6375 -321: 71b7110857241e261289757765c5505296a4c99d1a5ce1fcb1675f1828bc58c7 -322: 612fa9024db98b84df2aca6419b00879701d649698a5ea3fcdf0c13bc58bb6a7 -323: f00b094cc91f60ba7e0a47c5fd5d3a65edaf8ca278aa4e55a1a859b8e4e610dd -324: ac13597737535d11f1cb7c259f2f4c85eec3e910d71be3359e758ec25896d893 -325: 3b1bd1bcf7b79d5a722e1c731a63d3a98d5efdb5f6ea26207d66780f79645cd2 -326: dc147e3da606176129f7195959841eac83db95e994c60f3dced9bafd67130d33 -327: 8fe245581f1813f11c750b3a5b02c8a6cdf1b59c5535e035551e5d590d3d03a2 -328: a870586448d52da28c66c78096681dac2deec0f07b6ac5f6790d497b7606e0f1 -329: 3718898cc208739481343d4a15bdbabc785c59ebec52837a63904b5f313f0304 -330: c559c358dc83ceb40564b40818a0339c1bfaedc1eb3dbb1fbe9f6d33a5e35581 -331: cca494691816aad621a47fc105b8fde3341105a29c3b706e9455cdbbaea2204a -332: d4cb6e4742eda4523a5d178948f05468d1cea1e1fa2b7e0d99d2dddd1e4fa8b6 -333: 58713a47ee7d464233aa4a925bf8ef6e55b305f2b0819d8745afcaf61e118e71 -334: b48c863bb5cabed5aeb69051a8a52479f5a37c6a43a643bdb37ef006b4db54de -335: 89cb6029342df50b71f16f88d8a495fd53b30889c94b4d7af1eaf8b4a8c1d9e6 -336: 3da1b949bef0364d6fcebfdb11e6d2efca2dc012010268b4c02e4b489a75d59e -337: ef14cd74caf8f47b6eda03885d20849d734897cf89455d83305aae6f1f457893 -338: e46345992433ad8f196a241b184f02a2d2564533cd39e844aa47d9a87f65f8fe -339: 77010eddd786912ed75c3a3b1c885944daf061d58ef653e94eb549143d4d2766 -340: fdb79ff371ba418823ea7443652d37286f2000df06c3880f1cb322f74ff437fe -341: 53f36cca4baee943d61e97bc9a5412670ff7408af16960c5487a93d1568c9e66 -342: 9bbd9eb1d00da5c0b96926357cc38f6f649f4daef2d0d79452365ed7a5679baf -343: 6fb2e192d031cd5070fb63f5e6a23610a008d592e0be5083ac2dc2ee264701d4 -344: f369c877964f6bf3675c2302e0e7273a600e5e2b1d8dd9eb0bc9ae1ebbcfba02 -345: 5fb4511bfd5a89a4c026b227d3edc5a1e0553ceaf56b0559c334253270ab0cff -346: 2105b64db2ed533bc0529de6d4eb90500d26e1b4fc0393a24292c49ef45eae40 -347: f110830985de233ea7ceb040e340d63d933a74237a6da1b6e662b6fbe1629d7e -348: c7a09648ab90c57f8334972cc8b4a13f8f65fc8cb9d7f27450689a8daba72b3b -349: 98b4e3352af24ad6d1ba2e7a1eeae59f701e84c2504f48190c11377f75c6ac85 -350: 395301bd43b6315b7cd19335d054fc18648c41c24e4fe54a87c4629830f1e6b5 -351: b496a8803825e94563c1762af845668689af8264d265fe96628cf5ae90774ef4 -352: bc4ecb58601d15e4e96551409d1ae3479a4b62488c2d961ac29a0f16b18f02ff -353: 93c5010dfef6a15683ec0aa217dc00466bf65125374490fba0c05e2d81c0a22a -354: ed4a34ae546505e877a978f68ad58c78b08ce2e084e1646fe7fa25a264927cc6 -355: 6578751c4580b094eb245261b9e4709d001f228d384ed46c5b9a98b9fcbea42e -356: bb36bef38c0667095696efe5779f0ed5855aa5c80130f3d834cccb3b5ee2fcdc -357: ee401de8e74d5327eff5dc94022aadf9b18f203d1a08d1587fbbda1682d41444 -358: 4ca535c0625c02ffdfbc178b70a5d934c1a66b0c8782195184a02b860f119029 -359: a45b2b54514720695a603bb0fbff2bfc04780c97308212244f57ba7e45e3aa56 -360: 56872cd98fa9000f92148d6ec19c31e59e71766e342031a6972be4a453b2d47b -361: 273937ef97b43b3017f0f38746bf4a2e6f53abe57b8b8494e74976026d42a241 -362: 637a19b146aef1d1084f07f0f9832dee7b9ee4e27d803bbd709467aa2ce303f9 -363: 7340af34abc3a6a30a14d0ac2648bead4cf4dcab4f252874f95b5dc121320998 -364: 11e11820eb3b42a6a97b7eacaddb3fc01d7731a22de37f6f379b2e3c91a3835e -365: 9c9783c63124a6913f338194a0605952ccea0543bb5573bae70f440dbcc80928 -366: bd2e7f67123d49ec4d8e529fc3714f4b7a0b1fb1a8bbcd6026f53b9a087ef946 -367: 89888854c22789bb35942321ea458dae0dcce3aa10db62df538cc8d3f5998206 -368: faaec2e73a456fe3150d2be01dd10bb99437e801b4f4984ddf4d26d33caed5df -369: be3626c4c9ab11b5e038c036874d5d99375491124bdbeb3c4027b29e4af1c5dc -370: 022ac8a6d2f09db3edd2dc5b92bfb8cbe893f83c2a48b16179868b891021ee58 -371: 0ae40bd4ee211d6f9f9322e7811d80aab3bd81c17191ba32454b3c9092854cc4 -372: a3b9af71edf59a632d02f4819f4b73fd32301d36f3ac7934659338a70424c0b4 -373: a2088bc52680e9a605a2919112a655058039dca5db6d3a4ad28f0308f82a7b1f -374: 9b69873872d2a1d90c3cf402b43ace8b5a7a37b02983a208167e865f51feaea8 -375: b022041c3132842a4bb6f1efb8e75fd2c48abc0352a40538fde82572bd8b4c6e -376: 79b15cbf5b8e0dfc79de050e4b307b1dd7d0a4cc6949118b1e7297c326bf4505 -377: 03332d4b5ac755b4918c7f9073f877cc1b9af8e97d800dc45abb4a99311f7bdb -378: 4bdf53be72410131df3d1294b5c3ed9ef166900ffc56474452cab8a16a42f65f -379: ca9801e8fe29a1743c4fe59ee889c266ce276e339956341d94c40ed64e2cde7c -380: 51e0280d03118a04c067353eefba23faed845e2f8aa77c114e8f7ce9cdd76ce8 -381: 92cd4b7886ea31b185290bfdf704bae8154b2035961511e98fdba5d107a270f6 -382: bec0c70454a64f9d37e0b6ab2799577b7f98557a1b64871235a3bfd39d89556f -383: 00162012a6c2f2b07d88e02d9096fbce28672e1a49ba27c9b743c0cf3be84445 -384: 7348acf111fe5513ab119295407bbcdfc6ff24d8810ba258c949154b2e9d1a0f -385: 2bbf687ce7569408c515117fec126ae3ea11af47dd8a5e80c1d45ead997cfb2f -386: a993b3a196f19459dffb4c77a1dbe0f2084c02553fd8b4e8d5540705bd50e1c2 -387: 26f84446687ae90c1813fa49721257e7fd8938bf303dbd72cfb4e32cdbd58701 -388: f467a901838d0f18b1ff23b4b92a8eb47d1087973a942f160f3657ae8c25e82f -389: 67aee2303ae947f1c3cb06e7bd76640be6e007dc21ed674e82c56a2fb6182e37 -390: 36eacf8ab85aea33a2d0cdd5716aefa875da36d05e765fff91bb5c70c7fedfa1 -391: 2efed6f5c3303799203b563781fe7e8dd10e5153ffff7f40c7eb71380a11781d -392: 33fc4ac404c554b242bc6a95c32d4a780ee9244729a5787009d6f776b8e98397 -393: 0e6a680ec399b877f374581475656c2498393025aede5857a3ae508ea8885da7 -394: a5e064a448b5ad1562b05f17e73af343045c89836ca15fa03936f2cd23f7fb8a -395: 5a22f1f5098d4594311fb19e225c848602e7880579356f183ca882aad3eddea3 -396: 1129d0a75803362dbc3b9d3d678fcef29880a5c5673937abe2f0ef71ef83083e -397: b8e2c3aea667c4d139a7adee2e29b0ef4ab85157d97d3a593deef208dfa5850d -398: 77dda75715d6a77138f0b4c95c8f374b6cc9cde0661d111bbd7293dd0add6e45 -399: 4d9199d53858bd285e824099364cd360e55358bab92f6e699032d7597c78127f -400: ce5296b7199d32ea2668de4f0e12b522de695890d491b69a46fbd3b19443a5ef -401: d953f34abc2cf734b1de72bcd5fdb9e34b3790c5539939dbd0c580578cd4993d -402: d11987f38e5d5bbe655f2c1f0693f106bdcf39794bba6b8318ea575f8bf0231f -403: fa1995a87664b4a1335b18f635e132113d802bcf3bfaa983844e4be9aa48302a -404: 94d26f5751646b41f46cf71187773ed3c3fa5a059956c377be54d6e198fe7f55 -405: 73621384cef28085fcf9579dd4b08a9c60c6c6693de75276d77178242b31e9da -406: d18256c03fe2200e7fde200cee7e5e68b31fabb35ea4aa674f1480f0c70f40ad -407: 228cb345ac19bde898f5d1bc0c1606c20a4b378d39c45f048f2ae641765eb3f3 -408: 127b0845056b41d6ab032c78a13878dcd7f54d363918738f107b4449ccd58462 -409: 478b6381cec4715437db2bd003710a92e5e3355cb5e01a92d4eff6095d2fa3bb -410: 2875c4e4a1c27d09af73fce7b0c8e9f0a798ad157b10b92c36f696f2312d52f5 -411: db0a692d081a97a3d3bd3e525109c1bb5e5f43654c538dd155e98a433d8118a4 -412: 5225f5acaadeefb94ef492e502474d900efc6bcea98579d120bc59c7377448aa -413: 27858430af45f95e7dfe8857d9f09e663577b2b858057eb531c8698afbf75209 -414: caf13396952df2bb16c10d62c34df43c4c422be52fe963401bacbcd8b3fd9720 -415: 7c9d95826ee3ce61e664940568a0066e9cf2665025f9d085eff982292ba42fff -416: 0d2f401f6deef04e52f09d18991981dc4e4a410e14bef6e4d0952c14d4bc791d -417: 5fb3672a06e111c544223114a982f4993cd0a0ae2f8f20c736ea622f9a592f3a -418: a143850d422c27cb425db67106caa1546436e843bbf6c7c5ca98c7d8b26500ed -419: 3a7d55b86405bc716dd23033ade4b475b1e16eda03737ed8d54783ae48e33842 -420: 24d02ba759abcf03263bf74b4149e277de035c9970170aee0cca3db4c3af0181 -421: c88f29372fbd0f25ef8f22d73d2c1a011c2108e43bff19231bda4ecb0aa870cc -422: f13f8c6793b9fd9dbaff1f6e7ceb6adcbb29df48412dff67855c37ab4d2ea7cd -423: ac2ebe0fefd24d17b128950992a8447d3d72e96d9991aa28cf949586d4aedcca -424: 51ce61394aeaf246871690a4c3f9e1611efe3db47689add4f6553ac44c50aac8 -425: b51cd46dffcd7a50fd1bed06d63277dbfb49a9dc52d130d2fb48cf763d090eb1 -426: 8cbada55be3ceeb7ff10a3a86cbcdf93cec431bda81cbadb17c35889517f6aae -427: 271ec5f0f337031bf4da8dffe63665d21a1445076eba7fe6347e01130724c2aa -428: 4e6b0226f4537cf206076359b05c5e848c278ebee902d761fba857852a94dcd4 -429: 26b02334cc3f7063cf3c98509be21fb05380a1c5b5415c551374ad541b25b73d -430: 855ec2729210f95045ebc4ec2ffb251aaedc552cb84b2525a111f09110a21957 -431: c492ebc57c483a2e9b696db4b20a7d06246ddf8eea54e374d6692f1557528c06 -432: 82dd34db76d8eac6badba158292cf14249f78c39e27219aa8438ff147d6c3686 -433: f71d583756b28252c751cc4f86b96ac2b24fd3edcd87c89920fb7cabd84babac -434: 0c00bc0ff60cf805bf9f92df1780f5966610f24352cd533a2988dab8d59f4dd6 -435: 52d23dc9cd06ac01737352ddcf5240e911361c21403b997b417476079db87454 -436: ec9c3e840bb9068563e655fc0115b5f2320ac1e26e91bf6af4d92512b1191a99 -437: 796fd5cea33f547b238d9c191248348e034ed06f008cf8b4bafc428a52ba9d04 -438: 400aed2a17301c211f09c92449841d9bc11246db124d6f1f1c584c0589116434 -439: f4c457c53d3ab63c03f3ccc4a18a9e45682a9dbd7dacc809fbfd20a2a7e95bec -440: 3c24b2f357d6ad70a76da8629813ebcf1a82b5dff8e73f4903709fb4214f5ae6 -441: cd1328d67eef562365c873d1cb56eefecfe886e6e6197f98273ec2b2d642168e -442: e36b514415523ce85e7c285edd862b158e60e5eb47b45d4b3c907a9cab4e6015 -443: 0cb9c2d05d74b1acc77eb6c71e8dd69d2b2788ff3e1d40e214694abd1521121e -444: 49d7ad342aa3876e558622dd03938a6aac258784ff02d1c474ee3ddabca6bb46 -445: 15341339c524f870272f562886acb9e8237330a29f89038e61066182d927fce9 -446: 02488037fc6e3b89cf003af6f4ec63ed4203384266c064a7992e0c05a4bdf14a -447: 2dad5437171fa3401711b6fa7b4774ef6c5ad2a8070abeb6229e658ab3bc04b3 -448: 2b93fdb14add3c52d2519a2fecdc906893ae77ca2756ae6290a62af5ba0330ca -449: 08627f60d00e95c42b53bdd5eb8d08b9360fc1795191525cb5f9ca9dacdf4dab -450: 76f89b17a70f96f2fbb35119211f070fc6e5d71bf75c2b60596d6ae277ddde9f -451: 4e2319c28de62374e7e20f639ed19df7dd0208b6fa729385d8a97b7ec0085179 -452: ecf6bb771055ffd58c77062f15611853f496708608065ac61036d7e01f50ba4e -453: 6815c2382af401c3f5b65fdee1270d065bd53c38eda08985fa4699b02c975095 -454: 397db724108990d5a402ddacc938debcaf8b3f9b467dd76110a0dc146b451042 -455: ff534e92474626cfe49c76261d074cbc93c442f9729f6052119bc2c97ec27f0a -456: 78e86805f8b263632bbd8fb30f3ae913fe5b71241ba701665b7fd73a9087d9ed -457: a8badf35f8fd4168f41779aaf5db3b51a01952b731ccf0ab04d65924905ae4a6 -458: 188a69be9bd313c3abf0d2c9f86654cf1e56add4189cc9413456a51947b421a6 -459: 8af25821481a3fa7137e3d957c64a97d0204f9861bf6a8701fafb20dc4baef6e -460: 6a8a04c755de9c6044fe243e31b45a3d5963f22c5323be74eb04965ed419aa54 -461: a817f1b7b748b0236c255df87d31be1dcb5b4499992de7d9b9ae0d259ae91e48 -462: b7290cba8e24e6b9ff81fb5b914dcb248a58bea9b021ac625a7c9f29c8a3ad8b -463: d2e4f2a835d2ea8e382099975ddd354bb129019f61b9d56326386f5ffbe0c2b2 -464: 54db5f0f6e4746652405abed569c91282193261669c7daa31e8e649f3522a79f -465: 50cb4b5862df24e4065c94c71b27606a3f811361ddbaa2664aa7c88dad151173 -466: cadf8e317c0dd6c53d36b99f832a30ae150a32c1d9e2a95e0dbe9219fee60e83 -467: 29196500ec6a1375916b0147c353b8a4921aae592f51fb7b492c3526c2b75139 -468: 7766b257b8e202072cc2d65999388f60f55b30517646b258bb5075845fc7e4c5 -469: 211a46ca3d1280a830bfe997fcd7fa606f56547fdad9a2141e87b67af443495a -470: 18e523ef28da5d53433aac9491ee418c7785e82ba8b84c9bf091ab25a709ed10 -471: ca746cb23c094d3add9a0ac70cc966656563bee80fdb1cd9d729a69da2f1ba34 -472: 87b9a1347f0e33ddfcb4f618a3701d59b57d6394d439474bb7016d427fbe276e -473: 22bc2c81b6f94c84ab0fb79b3a7b2684ab7e8251caa08be6b8701aaab24ca5d8 -474: 5d10fcb4b8ac2461185f5417f5902b4c000cfc73acaff798d8521c77456f51bf -475: 8141b5641ebc92599e3f5a7e14546eb15d2fa8a791946bf0a84657a346525cd1 -476: bc82d29fffb497b8c2a9fbcd2e95b85fba93cf985cdb56461e59b69ffebb7f22 -477: 0a57dbe66466333ec1d7ebdfb6100a903697c45b99e0ac3f4a659ab368ae1a85 -478: 51ce84d63b52a81becf17ed59ae68be2ebd629729d5d4d5a2f1583d744bd2a88 -479: 48aa59c51a05b0a5e61ecd89c2bc8eac6c10d05417ec000cd7580ff52b4e81f6 -480: 16f73e3ade83ed3c9ef33e3c0c01a5686b33a05fe1b18308e823bc2e504136af -481: edb9856e42e585fb13ed96b367364f98abe4de71e2e423d8fe7c6de5be223345 -482: fcc764222c981a04504bbd3c32bc7727600b5c1f9b386e22a226a668dbda0c87 -483: 1981e5927b9fd162ab0bbb5a365b9ed8e247724334fc59ad28e394a6c4be899c -484: 90cbee09dd7935d6837b9a1b67f9405452603ba5b228bf7a8549a2abc78fd255 -485: e504621151f680b6086984a4ee2d15857da704a659974af5ef93be2d1a9c356b -486: 203bc8fa7a5c11b2eef3e268df252033193381dc8258ede81e88143ef23a8b5f -487: afe30eff8e40220ca4e024fa0b94a46fcc42c0cb55df68471665b27732a60a59 -488: 48fee4b0bdb44c09ff517e0bafbc35c7b825379d3ae21924ef0a44433b6a0447 -489: 276c7d526581af81956eb0e247e55925c069a843ff139bc2ec057b5b2293b689 -490: d238303b4abec814253fcef18081a517c4ef3608cbe6a4101edc61c7c70055e5 -491: 84a409eaa8a75a5c91c97b3969d0987dd9034901c960ed9cba49994f0bd8372c -492: 03e947ec08b722db55035664aa0342bbfa6758bc164914365775dab315bc4fd2 -493: c23338219a7fabf5220ee25cd9f033ce9061d7d5bcde28f9b0110a8d43b3ebbb -494: 092bb0db220936de15bd23e6aa1129c52c6b7033e6f801f7dd052bee713456be -495: 5c6f720499c979727710b23ef59996f4cb44e39a95aad30e1e395f05722dd749 -496: e6f72d91a5b12e3740837467c1f577e4893965d0bcb1d5b56dd2488a273ae016 -497: 1d8466d5bc2c57f3d39b4aa8fed21acbdeee64edad2f0b62de769b4e0822edf3 -498: 9f5ded99162815de77cc21dfbbf69a3f96e9a7b6b2c86f50b1c511dba25360ea -499: 3b9fedbcb2d3e8a6a4bcca281e409e1dba4dd05adc2623390f68956711cb9c3a -500: 7d1b86dee381d8053344099d321854dec6d1ac7e7b7d63e587211a3c23f4e72b -501: 4695651d56ec6ffbd43e3b8639f1b417806d9fc8af1ef6ed8d08e644686c817d -502: c48d004fb14c505ce06d9f421ce0d35656c448d631515f8652ce931c1d4f8eb0 -503: ec475e34472eb053e407782d27b173ef82c06d3088270b7da089f7c7e2cf493c -504: e5ba57405abcc5d8e5b79013f8325915fd0cfa08a59f3860b83460080c3e70c7 -505: 94f3e311302ed65044838b6dc97d51b414b5e7949ee23520a9052c21d486688f -506: 33b34f47628081709b85af96e54f4a94c882d06efffd34ff5a5169b5751f1af3 -507: 8c02a790b27b4d6e792db8951dc9b0f1f48c0e1338efbedac92e485a9c6e3df3 -508: 6a52e76d0066a0b76789b0210d26d8812f06f7c8d7d0a968d901cc16800bfcb7 -509: 2fad4c278b249feb6bc654c7f80bf6c7c084457980ea4a95b8479088dc3ee562 -510: da0583e7b44f358b26a83db200c8793f60164347410f108951816718d55b040a -511: de11abe66ba38bc11b0439129fb6ceaf39948b27cafa3275890cb05f2a805f65 -512: d2dcc2993839741afe2de012f94b03681fe5549ded0ee3316e48b7597359dc69 -513: d88520e62209cc1fde3c9b16ec40ddcba1b57f06bf9a5146dc9014ec446e6f29 -514: 242514918e564473ca0d96285b7ec23bb5e106b86977ee72cc5fd49bafc2ae59 -515: cffc937d5057e24f8365f89ae7b2b6afa8c8bf6ded43774342756572f2a8120b -516: 05c1ae4da63b088c7a6446c94506469f83f78dd9fdccf0ffc554a0234bee96a9 -517: 6b837bbe45a0392499efcb1fa9d0a183fa265f259a0913a685fbb6fbabd9cfd0 -518: 0233c64a15db203e102e92b949ff8f5687f122b73a6098d873995d3a69f3afe8 -519: de996204b8668ea35758f4a434a82738d2e4df397d56d5e44edbf75562967d9c -520: 5847a852cde88f947554f4ec2e0f8df4276ea4ce28431dab17b849e820069163 -521: 434b92148bbff5d2286e0e80eaa0c4a3eb53c7a666ba23777e7bc458a3201ac0 -522: da5a927529243cee03f6c1398e41447ef5bdebbf61cc25817c688005d45b0cb3 -523: d838b16255c39410f535eded20ae4a2a14ed4196bbdc272c4ba13de25217329d -524: f46cee99cccb920d7c9567e571c793ac3020adf9502302faeca2c0dddf1f08e4 -525: 1e5c71266cc073d99f10093786d1d141770cfcd510431870662fa857dbaf6a5c -526: 602ea3fcd4d90de7a8b5dfcf65a61d53328f2edadbbbf14c62b2a6f9c3213a5c -527: ff707c27b1d462f2cbd191f8555d2bb197a24480ff61efd0ce99b521878afc6f -528: c47995d2a690c25de33d55754d77ba8da2e841a86abd46197db2f5863524c78e -529: 89b542b5508c1821a670a2745fef3b56b7e9a0f8aeb2f8bb2149e90c75e2139a -530: d5b89eaac746528526cef9f99a3bfbabf9ce9b6ff604c1971974c8d27442981b -531: c9cdfc6cc2de550a33ce68f4848b4c619f0b425b699f2a2b76d2db475f6f7573 -532: 9600f94b77994e18c362504cc144643e90419eae3f468d3ab4e390e429d0d5b2 -533: 7ce9cb9bf84b35a763110b7f66e0be7a271371a78a5376712c19447534451db7 -534: e9a8b50d03e1972741424c2c16b37166fd2d8b6fa17d6de9a0ea6d5b500adcf4 -535: af46270f70661306342e4d96df5f73c51be87a7cc9208e31356129d2d255a9ec -536: 0b84feddb3d62c3515b4e0a082f485313a7583d1e69d28f5b56928b177bde02d -537: b78ab7ef9a782179abb877115e70e9ae8a4df5a2532bc6d70a49137524d18c0f -538: 0eee1d4fe4ba096f194d4bfa30bcaa12cd5c5010b42c81997034a8ad71de5738 -539: 1d750f1fd643cc8cd360ac7ae41292051c7aedfff4ded6b61566739aa90890c3 -540: 38feb94cbbb3637ac27d561b97274ce8340d9f49617cefee8884ed94de6ac579 -541: 67d18d9524de82f3cb9048127d4c429f9d4b33ad3a9aa99ce86e34bbddf81488 -542: 24dba4f062cce959ebcf758e3be0363905a80b191835bf4333e5c572c085ecb5 -543: a0945db8081383cfed2d66fb9f79774a953ffc9dd6990548da55c90b800077c9 -544: fcf77a9d1f6c84048163f9f1ba21eedbef74dc62c12505a23934b8637758fc0b -545: 6768ee1dfc4d9aec0fbcabd35ec91642bab1782d5b5512fd1e41bced92cee73d -546: ca536e3396347e0495b021e2e84003985d9304360c1505e0031f6c1e5b6e74ee -547: 6dde51e539def3bea08bec0d63d740dd61b66fd16f64296609db33103d76b7b1 -548: 28f4238ed0a8e8eeb50b1b49bb0017a5cce0b2f42816caba49464096d602b8a1 -549: 173c9fdeabdf4be0e5b8dbd4784cbc808e093750e2397388cff3c5979d875ff4 -550: 99a27a37ac53b36ddec9cc432b16d44f596d7173184d0bbdf1547a4e04e3a1ce -551: 86413f744576d0260415fac0247dbd61a3867fd329004217a9141f2b0e5bd2e4 -552: f2f8c905ecd61ae2aa8de239c64fbd7b5f0c847ab18e56177d76240a626008c5 -553: 862936291eebe5ecccb4b213d74c9a7f022772fe1add00f7af5ac4ff6223e346 -554: 0c47fb1f36affdec39eedc88fe9bc3afe65f910047fe9677583d109837da43c8 -555: f7cc0f262bdaa131c9b582d8ba3543f4de14e069eb8453b9c6435900b2628b6c -556: b5231f7d4bcecc3cac63cb530c6ae7ea7560f0c27e41557b6ac1146a2c1eb568 -557: e8599934318acdd2ef5e7fc634960d76700c92d313dda306c2cb17515a327c3f -558: dbd646fd923cfc9b10ae498511d6f131ee8c985060590b06ae3678fb8b46b5c8 -559: 6d52ecb66f21882690258d77f9382c35540363077fd6086fbe4682a84eea11bb -560: 07d78a6e3ea3c7f98de73559adb9e489cae8af8607a1fb3d79abc150f553319e -561: 4953e8f819a2add9b23853b06bb97e26c7fc49acd8cc1e0b4684a5d766f35a53 -562: 781b2f97f00f73debc515a175ba66083069d9f1506b4d6232acfab6a0a3ba939 -563: fe3ea15a76ef7006d987d06dca3e0f25ec94f0a25fcf3b0ef7240e3d6c47bd2c -564: 7ee11817f2ca5f9a6b0d7372849ce31baa3269e1b1780c5f1e0d80716c357088 -565: fe2da2c4071d83642a5720718e49aa5a44a5bcba7e8f8935f4021e0955436a5a -566: ae74a9faea147eca57ca27b6e735eb1aa8ece530448730c99871a39075870131 -567: e3464d5fbea3f20e2b73f63be61c455ca0a518f989b9d18ada7b790dbdc63fb7 -568: 6b48f7b2989583e8718603b3a62836a99ea5b37853d7bca7b70d52efedf02d73 -569: d460ef41f4932d9f4b1cd07da8f935b6fdecb23ff8b269c80e86bc7525c6f72f -570: 64ae878a73ff936644eeaef0338138b29e0a3708bf4e99cbbc654b94c4f172ff -571: 1a4965900231ba33d6d2a629c4eea67599342d97f9b0d859ffda8892f51d0fe5 -572: 105af97fddd8f0915dda627d3c122c7866b541d6a39f5ad8a77fa648c222ee68 -573: 79502abc9bd09ad2f2a3e454d348723a6ba623fccf95025ac9feb0f9de4db246 -574: 558fa2ea8d21782f73c50ce20441385feab4e386afa3359fd035921161dab934 -575: d8446ce7590ed28036768d268431115d1c8118bee49c74bf6f1181611acdee49 -576: 9b4a90d2d7654e229dc2035300ea60a901c7bd96649bc8d5aca1a738baed038b -577: 798270bd135c927db2e94714661d36600c8d66ca3060acdc991bf42d918c079f -578: d7120b2db88536e9934d96390ed9ef1eb11ce428d0b2b1bec41c8b1fbe51110e -579: e001c6c8468fc9caa9c0e42a731356aef769913b105945c498efa8c95718b06b -580: 0f62ec1075014e7e869cc697c5670bcd4a669c979a8cc1dcaa38e41ce67e296c -581: e5ac3f8d559a392edbd7d6ac10a89f2f09808f9eb9c720189040dbb0f87a7b60 -582: 64e2b58930dd78a546bc5b7e55f65cf44595435397f5253401d3a31e0c30b317 -583: 263373377014da213a97247cf6506808d90e15e1af57d5c13d8d53566b5a5461 -584: 9aa6715383e79f4a1ee8b8cc86f128dd84a4982d3c5a6f156b31e4472737c83c -585: 1925d844b25759a842c33263f155d29878b36fde630777ae0a97e2fe85cc00fa -586: e9e11491a037153d2fd0853c8eb489a6bf5fdd97c951c2b3bad7807a12f2bbd9 -587: 3d2e8b0160b56435c74603ff172092ff34ec4f82e614cc4c445e162ea9e07ab6 -588: e99ffd1b1a61b6004364dbe66570f205dd74e60843cbd9e43dca8dbfca625fe3 -589: 629630ff8906d7c13cf9ff64a0b427ddf9e8941647d8efa200b38565f80e45f8 -590: ae56197bcc4790e52ad8636450e7a9c6011cc1b1b6571ffb5922662935ad5e8f -591: b4f2c342260a8b77d6a4afaa9fae0421bcfb16256d45ebaa80f658a3270b93c7 -592: 06b84e9eaa313e7381f3a25a3b2ee71a0e058af2dbada33c08efdbeeb6a4fe1b -593: 9d45e4b82e1f0eb022ecc8dda15b45e0e23964671eafcd7786f44de42a53534e -594: 6ca41d669a06431c20f359eb53a00e8e40bff623502c06975a53df2c24ad2740 -595: 09987c84090b121bb669491451fd36981e35059a315bb3510b2910e5cea7b703 -596: dbd7606eaf66ce092f8df17a864e7e58a82950c0aa4f59a2163e2e0b98e05966 -597: f408448625e8639af09d36d1b0b4a8475223dfe23d9b13c344f6efa9b0d79b55 -598: 67fd26f76aa8fde40ea32742e9564f318e4d30393c8c8b3efc1874d361a0c677 -599: ca232d6b3a3cc9555eab03a3023cf6957a95cfa1d7675db8ca191c5b31cae03a -600: ecdc0f7a4ccecee888019378fe1111b23e4906da170fd1e3cd9ea1593f941cd6 -601: a2c19a29adae2d8a541915b310c566d55ea29cc7e3ac91f7fd3a88cce40c39a6 -602: bd042cabea0461654574055fcb4214f45dc5f7cc1d8aa821e259267d86eb8c52 -603: 69e0e38d26d191529a5b11f19ae3c78c8909855b6bb31660b5af80ddba964ef9 -604: 7bf4908e45ca86a3fb79c7e6a09f604ccc9c557974483aeb5b8f473e0c3f0a38 -605: 0ebdfc4dbca222ec3f4209d36e6235a433c2ec5f064592ad2724107ab6d2abb3 -606: f60e345855d5d683c432900a9a233fe853b812f6bd8446601bf8d410c3e67c36 -607: e4d5c7bf1ca47fcd5179833beb7a8489e910fbe93ecbc34a7c912c358b45bb33 -608: f9f127ddb0330d7588f3711a22d9372763b4661c63db217e1561c3b6ae45ad14 -609: f0822a7a0511193fd6f5a29ed39d8e8f737225fe3e7d8d90c704a032290ed1df -610: e07fb2450d06ac2305eb3fefb4b16b6eb3996bf91f98df58ab4af7bf4b24a5c7 -611: e6b0afff326f7f36b65b095072a19b0e104cca0dbf27529a7f39a0acefe8b3a5 -612: 30bbf45da7bd0d24f706803eabbbebbf78fc67f98e0af4d68524025be2de183b -613: 9446910610590058b8b7a5079920d545e633b7b7a98a114303ce332e34e1ea31 -614: 7a11ad209cdfd258c5be5247c594103ace97affeb5adb140b3bf4b9a164ab4ae -615: 561775fa45d789a4912019093df2cea17402a556110038b90fe8901d3ab910f2 -616: c40d48d0551a2fa949c0c19751b3ae0027ee1169ad96e9dec2bcd06c6f43bc0b -617: 675519f03c8208cce08fa91f718484864504085354356790c058ab9aab3009b2 -618: 8dc12b12cd525177c298c4c925748af02ebf14b8dc5feaee4bfb75c1218bdb9d -619: 62cb61ef8ecc400740115f39bbfd492232761effd72f67f2edf7a4943802b7ae -620: 6935a0079903436cefe716a592752a3941c38c6fc81a52b70c0d79213d157583 -621: 42e01b526623a41ec90659f1f3e7566c07254e21e5c3c4d8ec5d63d99a3905a2 -622: 8e0d64ed83799c1081e5eef417e3a8bf0e7b33f7c3458896e568cedca96f4b68 -623: 16854b1163fba8b8d5328637af0d7834b62318e11271f482bf3b31309bf9c89c -624: 8cfe1d643d67031da6ab55fa27e2017915466c5775822ac29bb303bb18f61830 -625: 1dc6034d71d1f5f1459607c478ea4aabd826e50c59d891a8cf36f6304053b478 -626: 2aaac5bcf9d5587a16a51d1ed47ff084105174d6b5f2ddbf2cfeef6664728970 -627: 61508285a773bab75cebfcfe19372867f10f80195fd58f4e4b829f857d769aa0 -628: cd700b9475056cf381f9dd6ef52afcd9868aac09d0c1849255096cd698851b5b -629: 9d74cf92c621a9cd48e4e658f4a01d2c9b245cfb616bca6247e0091e7533a705 -630: 6243a40194637f3bd50e96d703b8f5c7a4f60ed7b71da7051b7abe4d1155b229 -631: 06fa690518c85c3aaecb3ebbf5fb049deeb95354789354e77f0e87f714589f09 -632: 5f359792b9fc023075e078126bafb2630c07c55cac746cec7b24dd52b55e5493 -633: 7ca64000ea0cabc0bc80372a13fc49e3e19372072378561d69ecaa716cc32cac -634: 973cdfc51bee2d6e46eff4ba47f2f8dad5edbd278256a98383f3416ee1ece09a -635: a906682cd85185924191c3873491a18b134f371b3de306946e485cf2e58c04a9 -636: ac11e1fa3e0f28955fac401f434d384a6490c7b4309aab903d6fedde86ff044f -637: e95a1d5e94da3939a9ea1853ca677b7b4524636ba85ba6ddb3889337fb6731f1 -638: f91877dd03a80fafde2c3a39eeda2ecb4a12ad8e308b6a1df6a182580bcdba9a -639: fdcfd665e5ec4e69f48a8cade948e319b79388d3f2ff21d99d4f96b5c07e2459 -640: 3c65738454971b3a3f7df085a917c24243776ccc968e2ef2428f59e9a0519188 -641: 13c90cb776f1531391b36f927bbb760e29dce4384a42f6b071c22df66d06568e -642: 9beea97e1746d96db9347e330df0e92b5e05efe2c72f5b0a0f6e621d39fd450d -643: e3ec99168ea8353837cfea97f45c3cf297805d1cd3cb46ab54bbb35d0e82e828 -644: fba85e8f34b34a08bea61998da0545865a2c21a8784744d4d67dc826fe1f5fd7 -645: 40eb7652ace2dd1ba383972f70cfc3eed35bc85260cdbb001cc0e151f7edfff4 -646: ce4167189ca6c39a0a5e4a749ae0fa7247062a50920b4b50f266cfa6a9d34c7b -647: aff90a63a4a5e46e58d9fb16d33f06f8fdc15a73c7c690dd02e7a9f4576dadcc -648: d842bdf7ea299274d3bb91fc362e4dd4f3c28237e9d621e0f97488afa9a02369 -649: 18601f93b8240474442b832cf1aafd541b32fc47cd024bc626fcc850fddeeb55 -650: dacdbf42cb89fceb79d1d8bf8c583bc127c42e22c7fdb7fcc38ddcae39b1f62a -651: 7cb09fd65dea49174aad61b0cdc7c53e2b4d755816e1137c52ef721ec1b19169 -652: 8be09d653c065e39f84ba4312ff40abc6ada795ece77880a45579407c9bfdd01 -653: 41cdbfc8df373987d7a4645cabdb323ef92eb2e149b95b1cb389352686948c5f -654: 54dff6778bb9a8737f1eaea2247731d70620b74d4d2bedcc492a9768cdbc1e06 -655: 1ef22db51009e59fca54a417c071def94551ecaff885ce191179f2bc486565fd -656: 217294d1818c40457dae5f3a19368972c7375dbd4b1208c62f024a31ce3887f9 -657: e0d0f7c5f46849f29808d598cb9b08fb2517fb38d29a4ab1da969d956b1edafa -658: b3604457af6e43b8719e214620a6ce14f8c22c60a608381275e5b376ffeeff84 -659: 21e6ec5256747ee8ed0e1e4f6d461f8e72e5421598460c0923984e310eb5b3a4 -660: ed4acf4aba6c1f3a7dae1f27c14f298a7966c444e8c70b6ce1ce0c0b6daf2a41 -661: 0547af4c292895a4c18d6be5b2ac9f862f363a36bbfd52d46adb490175fb55ec -662: 3f08179b52d97e7372de73ddb39cd16211d212b0bc2c1790094b33781283e1be -663: 37ad8e73e6a01fd8bb930cb3fd00d43692d8c83d37b4ce6602ee531b282c0075 -664: 81b8b053eae44bab64dfc2074c706d52c748d75cd6231029e9f88e08dd670272 -665: 91e1f3207d4b0f56cfe64aa422c06a4245d701529df5d55ab419d5a51e0cf122 -666: 55bba2503739c92878cde322151f1858972c3ad0cf96c0eac0cd7d6c3b9e4077 -667: 1882000b8a909763214eb3116e4246c9ec71207a3c306d7fb6ee3ab82de42ab2 -668: 4c884909e219886a50d8100a12bcfb356091076fd6f144fd35b6854307d465e2 -669: 8c0aa56a953a170a3ff4ce778e7390362516837dc29bdfcb801a13f45463042b -670: 25bddc5907720ab48ae5b6ea70fbb97a387b1cd5d2a3b6786b15270283f2dfa8 -671: 872d1272dffc2f9ab8742a08a8ba2d38e49a5a6fca74ea6e6e60331ecbe39137 -672: 25755f0de23d9e58811332e75584370259973c264b7028e9f68bffb0d073e52c -673: 0b96eb45fb17a8a80aa73a0e7500e038232dce2269f9abf2add880fc4e2dd081 -674: 085954a53c62269bdc9d78c7c45ca58f5c0220f224c7cdd8b7bae4b6d0fd5fe7 -675: 670051db6c0fb0f947f5d7a11d6bcca2f73901b7b05662cb238cf04ba0d9e556 -676: f8f7c37e0beb0b45654e7f2f03e5a36b86144e5bfef8c580e1d12e6116cb62de -677: d657facc720b596aa8b5965df5e38ef9106e0db6bfb6846e4d9a8ed8900bb8a2 -678: f501202de6e6a53bc96325600a0895f830ee20f4b03d81f98af56fcdf7605f96 -679: 558f0c67d147748bdc5472f4be0584dad452cff1ce1822f4f1ae2355020ff9aa -680: 09096d4a259c1c60bbcd25563301520fc5707106fedd30aa757f8790bab07d25 -681: 5ae02477e97e3f282a912fdcfedbedc45b6f48db463bf1a00e6208cf3a8bab6f -682: c2ae4a0b03e6bde0f10f82cb3b74fadd3952ebf9dcf8eabb3f24b2f4e3e2b0c6 -683: 14af46432e8204cb27f1f37d12605f72d483aaa58164e16a9a0318bc6da38abb -684: 9798e1db236fff527fea4b493d38c7f13200a80c20238dbaac17657d1c8331a9 -685: 6db3cb731b30463f68fd3129da52623d09a8c0913cbdf45c0ee680d062b7b014 -686: 7630c889c0ed3cbf196c307a6b13b5314c35f8e08efbfb85680aa8f56d8b4073 -687: 156cb56203ce9103881c2f173ef69dcd31e374dcfa00844d909246e863c9ebcf -688: a2bbcaabfe54517da51cbfc527f0e5768d6aecd5a6f71c4c70d90ae3054f5518 -689: ec7f5af5f68937aa3bb2e29f89a76c110bed1740ed5cddbb31a4bbd4d8658c3d -690: 7b1e011cc68d027165e019b9e8e070616cfc4009d56d366eaaa4cab247b423ea -691: 6cb2221d41e75df3b985d2647836a26d08f78be70b7d8028555b1b82dd17b175 -692: 7027e565c0e317fb988f6954622a47a6c03e5d6ee9b7f38dad7f8a01ba315887 -693: d329fbd15068a51d3daa23ffa59d8e0d5c2be54535eedd0a249443bf3111059f -694: 058e67814877f19a4d38f3578e63ecc63b450763cceb5f93d6baf6708c6165b4 -695: cab5ae80484fc8573e274316d10e2e6b71d64a5495b451817d59d37fc62cc118 -696: b02002fcae0d4643be5940d223d8d22029fdacd277d153f4833c10fdf502cd77 -697: b245a5c7d95ec8c1cf1cb22dc679847b982d55f3dad6add28ee01b67a6f41fb3 -698: 3f388119f98462ea94fb56e55862e083bd3f859a02e3ef23f25c949cb9b7f5cd -699: c381b56202caa27cfa4e42fec6d238310472bb8e871da0cb47082388de7783ef -700: 0193afd46bb14686ad253297bd7f1083ad6a6940557fceb89461a9aeb6c3d47c -701: dcad33f663c6716db58b5a94edd0b758dcae719b37cac7e6a58db609f9b9667b -702: 551004d18fb394492e86ff7b76c1ca7bf4c83dff5c1ab5535428f217a14cd602 -703: 77bd6a37b0aff970095be63545ca1cf02e28e282240d1ade1e5d080a7c92da12 -704: 902fe8b742e49a4e68af91a8b4c0c78978bdf77855f5af1a010538724194fed9 -705: a1c9180fc41e810a19223ac72f897824ac6d2f59c2ea38cef85917562145ed55 -706: 341d0a96981cbd4347eb91fcccd144f35a7b0967dea0d6c64031b8fcb46b610b -707: e1a629e9a39784a0c28e3dbb2abcbeb83b07680fb17d410d1b8954ed6ea290b5 -708: 0d781c220748957cc95d3153d4b247a2e9ee546278f06e4798bb2151797990c6 -709: 63912204722a1754af57ffa997b549db1ebdf5433c1be42e6af6f9ec482ddd90 -710: 0f61dc240b6fd221221b377f0345a2cff7f13da41d4bd1696c81cff5778f1bec -711: 91ea7c1927cdf2cbb1263650afb35ada8da7d34d98e2686c50962b30b1508ce4 -712: 6e7c14bef3922a5c8a11953512011f61f75509193caf284930a585fff49c870d -713: 99b34c9fd41ebebb6076b75ab3b22da39a9488e4538d6fc016e45727fae8572f -714: b4259f3d957f9561144098aa8b3541731155806ef06b403c2dd4ea4314e19fdc -715: 86e328d35205220f7befd72634d61c329f56a55ffecb247ee83832dd1fe36d63 -716: 6d3386b03689e959ee171e2cc6d3ecf9b250604f34da80387fe1c3b139b6c0ec -717: 039f3c02d3ba2e24ca8a6057272b987e2e55acb88bde7dbf92ad36c49bfc9344 -718: 715e95be267ba0eaecbd230f6942a1eda2d4d8ff36c8b72948a7f721ffeff3bb -719: b4ccb610ffe7c154f7f1d588f597294d2c68c2dd725ec98fe03e71cabc37cdd3 -720: 8bcf65644a63c50a37e09e3cbaa8d771ab92a0d71fef5dd94bb56a001035149a -721: 0993cae164b8e0ce36eb6d4bf7dc652106bb97101a8a7c45ee4dbe929c6052cb -722: f4ddfc20a477bb8fc717d7dc31d195aa4dc55d420af8999d5e40de5084c63834 -723: 4ddccb7c7b7628b354264d7dcfeeddafc1bf51241a20bd8b514852662ffa6e9b -724: e2de5267f2e4cb47946435c2ff943e5d66f7aa9d43497e192ed184cad165517b -725: 9d15b89c15b2db62cbab5119fa15ea4dfc49c1523b10916af61b194ab61488bd -726: 87ee80452ccbe78c55b2a7617c8aee128648f22c4456e42719675cbb7b506af3 -727: 4d5fcb9e907346e305ffc20fb57351f3ae2a43211c4af10dbb1e378b6220b9dd -728: 8129ada76295117f5073c4d5a613d08630d91dfaf2777b13ab99ac4509a1f6d6 -729: 5c5c1f33a4c0ae21c072d8790ea0fcef957db8f4033198c0cf5d0086d158611d -730: c4586915ee3ff4e0547d29a546f03d197d33d9f0bc1aabf2e4c0db19b87afe6a -731: 665fa3786202ed507fb2df7cca87dce2c0be5f4fd125dca54e9132d1c0028acd -732: ace821e7584a41471b2e555a1c96384532211f6709d6301eac0622124684bd48 -733: 08633271be3a0ff80987897d45b2592ba11d3c482acf58b4ca3fba1cd2964582 -734: 1cd99f1dcf7cf5263aa8513e11970c77638d936978836e255f7be3dd3bc749cb -735: ce55387875b7f7eed70163b6fe9a4a07f10595fef4d77d0a572e3ee4917b4d5c -736: 9c5e5dd2f195155894c42dc959ede741a2e88d319e95f4cb087aecb837708d12 -737: df6af50b0b22b3d9253a56ae486cd14622268faafa94a25d34a1d1deb23311de -738: 1c45ff7fa7e20297a74256d37f1c518e3d49c960a847c5a9fbf89e400ad1b289 -739: 13322991f05eaf681a68cbb4978dbf26a12c1230ec91654d9e46169bc06bf181 -740: 7913ce5febf072c698215215b7cb4b180a9256e0ed63d754357899b2468f3134 -741: 46e44f2aab1eb83a979dc3dbbec17208dc26fc377899c2f532b5674da794e784 -742: 6af8e641c124bd85b05ec7278aaf1a8b4db3ab804a7a6216f83c399c334f1152 -743: 9392bfec887e2f83109c3b02d2095ec5822917304eaca799e3c9d261d74018d3 -744: fce4ee633e07834f473aa58e0044394aa1105f82931a2ea5f50118f16e18009b -745: ef14133b9e9f2f00b15ba3c9019fbd27755bd60e25dbea93c271e55337de66c4 -746: 13f95c9e923fc103eda110ec9cdee367d01daa39934f4a98e2fa4c8d508a0690 -747: 2b5910bb1e516298aca88c502c033409abc506e4e40adf84c58f737aa02fff9a -748: 010ea00917ac8f13d0e9d1a699a0b4f970d7a92f5f0676bfaf4734ca6fff1f63 -749: ac22984ca1e9bdecf3a8c81c4f5d8476745c6d44cc4ca3dcaeba6275bea17497 -750: 018910488e6cddc4d3a796f5bb981f456a049b46b5e53fe4dd90e55b54796d4b -751: 2f06445407652ac9e9af69570fa28f06179da64b6f9005f2910da20d1747b568 -752: 17c32324ff9ca42bade9d2da7edfee2b5088dc677c5ea0883b515a327b3e675e -753: 640a7770cc32e92ed3e1412c79495a3128b4928659f1bf7d9ff20e53e3dce174 -754: 7f8faa738137234bff364c457cbdab3b9bb2178b5d59d7b67584765b887ddf47 -755: a1564dd109d9dbb882fd221404b402ca046d268f592ef0db21ceeca9490f1d51 -756: 36dac69112b7c69315b52652f5a013bc6b6d4382e0d9f9681a34691a7af5bd21 -757: 1b8753eb292930ead17fba8755a8c6fd2a2cebc0899bfa0feb2edb91f2783feb -758: ae37c74438422742903ef30ae9c0130e4c860a2f11498082848edf6b15996bcf -759: fdaecaea39e2ec984e8c984d85292303de1e2ec12e0b75ab990bfa7e65a48c88 -760: 78867052f7feaf352e97dda57e7792b883ececc33790e47e761aaaa7f847027c -761: 8c73f0f9603bda755f7fe787d4679a2c15a133d6beb2e2cfca4706e992080e6c -762: 8b3ee45fa3a6cf9edca4576c028c9d28ac281f5bc69df1732e2185704537828d -763: 5736c03e2e08901bdeb740fc2a11697366e4b071e6a611c3e1b0be171dfb0c7e -764: efc3d8a8cfa82ad2b91460268ea2181d7043d9ae429f31cc6bf9dad560e01b88 -765: e48a56496817eea0b94249f00d42eb31b1823c700cfd503223430e5377b0debe -766: 0c0a87e714cbaa1b63d56912232130ff3f96cc91e332e40a471a92fcecba5b81 -767: 9bced3b9012155f5281cd83991fd328e15bb791cd2f9101c515633b1069c21cf -768: 929fef1fb81ef39d6f0bee50792bb01bbba750ed95359dd17349603d5c6c9cdd -769: a0298e71a6bb25d843f0a486c84b8af2dd96273939e9878de824dab5c6d41454 -770: 779c19bab13abc41e9398029b1810f0deefde87aabfd55e909ed0931b72f06f0 -771: 88f1b56d0fdc5f50833214e9a7046a980a84726ec281254e75ffa8ee81b24597 -772: 3a7c8ca4b0715d42df6ed02bdca7a6c28831786c3d997485c6be4297152ed0ee -773: 88a0f337b761e71843f41381e9499cf74bf2978a65e5e4481f663c5fa5929e73 -774: 76d365352800adca62fe521af012b686c0b209535bcc4f8b45cc9e728ebc9575 -775: f008acb3ea6cb87a29aaca44df6822d583fbf70d89c20b91f1310ead0d336780 -776: e18850ada303a7610faae0f4419b8b074077d8b382b3519333d0919b56e11134 -777: 95d3f06b9a095e832e32ea5b045de87de1bb3f1dee7aeb90f1a62fe1d8844c85 -778: fa72e0399e52403464714d857bdcc5ae78525e81d31109539ad9548e177878ba -779: 091c9e6519ad79728660cd1411222b96cd9384926c652e3b4fdd99bbe1b29784 -780: 3cd3d2b232a67cc1ef02be591b4fa891d31b2b87127ba63469751afb6bc38bfe -781: 0111a5800571127692423a0b5e64d2de2d8fca7c8a4f893a3a3efbb9ef73d63f -782: d4182bf05526cd1052f743b4d3084f5497e6d752011ae3beb3c884785f0088dd -783: af9f702f77c413a95c767ed22a1a7af5e1951fa09fb921a0c56728a901f88384 -784: 548e7fbc9ee3abef91e8f5d86b9fa2acd18b4e2b5b5f0b06993b020dfde7af2a -785: 76de3a6f51f1ce104ccd0ccfe9cdf2eddf3236bd237ad61d70e16e728f1f8830 -786: c7505bcaf65afd6fd64fc58ba1d0e7888ef4b1bc3c36de89115938850a9ea89d -787: 9de032b9b6d296a31542bb23b5f6451ad14d3c3d27f2f2af88c35a11c9b25beb -788: 9b59e2d98895c363229b3a13175dde2307f5e45e4de48c7e01fe5dd7a66d516c -789: f2290cd7d56562b49a63fa0a6fa75eb43182193e91eafb6de4d5b3a42114f5ef -790: da15453aea57615a06a92759b6906a3b3bfc65a49483f1b97f953d917170c0f9 -791: 7a6cce29f707485231b40c4d0fd2dc3e162dae1ace62e1ddf7227ee77c14bef8 -792: ba476b2558e6fb94308a78b5549e6572d81d7e2b3ebbb42e2f68e595f300aa2b -793: 827e82561dd5149f139a98ae48464c2e61abd7036c3435a388ae437577b98ea8 -794: 42d6226752a305940a4db24e77869c19e6c153a0b7e4409b254baa0e1bb6aa84 -795: 686e8e9fc0e75c0006f3b36cad1f125713d2c2a07162751d79d7b2c0b8d5129d -796: 22c1978979b722f631d051ccf8b22ae0d74c74c4209a013a253f00945360416b -797: 5405d6b8c0a154856278c54d6a3836b372aa166b0deb3185603a1cad0a940341 -798: 400307d1d50fc6132fe113bb8311243c1da0e6b57c78f9e2d5f7554f4e6df07e -799: dec6deb237e7d009ff60996b96e4e92cb197494f0cf5edb5312e1f60575c015c -800: df9fea12bf11f4d9b595455da7c69921f5dc40a427333fa7748fd66eeb017de3 -801: 2042c501563e32a88f4e2d9ef7e66be27571635b6a831ce41b28bc6c6df0eb52 -802: fb700a0f4398225ef5db5dcd6710f7eff80808d3f815801e14a24a61ebc424ef -803: dca2d9f1ba6568ce572ef1ba1fcae08a372b2f485c884860815438c5e3c69b88 -804: 17b3f6f18906ca20ab7f6b011f1cb522aa046c343f5bc04803530cb8537f0927 -805: f888238774bccaef845fdbd2a338831c13090afc7c344b1365e24bf1ed121ac9 -806: ec81d951ac4274fd4eb452baf6c236ccfeb18138429463f8e90d1524da12121c -807: 5cfb0fc4907a831e4c602c82c3f07fe4463bb3456fd6fd24ec78bb483accfd63 -808: 947236880fa0c1bb05b086b2f7412becc344fc3ffdc6f4dd00bfff31639228e3 -809: 259d05d2057d408df0bbede5bf5582baa01339493684d924f17a46b4f5aa4e8d -810: 1ed6143a41a75f6a9f6d42e98a2f29c6cdc935a8a7ff43b8ac59bf20e933f194 -811: 57e739cb621863d956a720b719a76a4be678b0ea731a3b777802b53cf78d3d21 -812: 6db449cca2b58ac27074e003cedac028c77a592d31d5fec2ac90b63108dc2c45 -813: c9ac45e17f6fce5e3aa0a963c5ab2af463422912e5a97e97b969d30aa5e71bfd -814: ae670f4be0ca416bf822562d1c136985473d93fa6c005565219c387459c9d463 -815: 64aa2f792bf77fd23b6d4050076d73c9b2ef972e04de3c4e4b772a75145bfb28 -816: b2b8810ff96b189c18de81253260f1f57d283c3a6d5d9f8d8a3350b7d7b4cbdd -817: 5c7db30147bfd07e81e7230d8d5e559255556dc7889d19f5a1b834ef6de92639 -818: 00617b68f6496cf88cb4728f889534d3b4ff83bc8ef9e214064a4d0511916a7b -819: ebf3905209b6aa1fe732dcf39507258e0faeadaabda8ff2bcbd028c2ee071155 -820: 1ad7cc67a00035019d548ad7d8f01567f30c989f2c02088e9d18c864f7cb8054 -821: 5f12fe6bef45c836311ca3681c08f82796dffbf1e6893272acf26139333a7653 -822: 4c804c8ae2f4187ccc2af13aaca740d2f0ea8ef1593bb2f65640d4d9cdc19d42 -823: 52becac90562e114784b7542dcda300834a4cf3d2289e0203ea9b1751318e94b -824: f318c6a0b5af61b3cbaa5251d849636e68ab6c29bf361e81610d259e5f9a1c9b -825: 1210b493270eb4617cf3398c05281ab67bb2415cc7780d9290761250eab9ef5a -826: 166a3084fc7ddb404d39e4d487881d7e7488024e77c827c86d80698967ef0439 -827: f7e8df8d6c83b694e8e3067582eb9cc4d8aadabde048a3c54894bd40f94b121e -828: 4289388178c1473632da87084d13c09a92a19ee32d085d717ea5f7b15f8733d7 -829: c11fb521a4d1287b82e982531229d811e0cf75b049979c592d48835b3fdc5ab7 -830: 7b25b4347a6cd7f79fe6a2e123e2bcd3c5f7c64e5701474e116677c680c847eb -831: 3bd669ded341ad240b3cca32e2246044e788e92346759c677c25b588d336eb9c -832: 469e448de67d33b679213d1fd4383af4eb663312d2b039aae59a7ea55f47d48f -833: 1e19b3f199afe7bea42e85233dadc186dc7db1c34eb0222c40100443f1c372bf -834: 020b1df2133447fd8d2d1d8caca7a80ba666184c243eab0d52333f026d4c8488 -835: 017f82bb4ef093de828031eccb2e19929839344b00fd424113b9b170081f7d23 -836: e114a5bd110ede150c872c12df640eac7547f2c3b093b4f368ef1b17d5efa42f -837: a36b110e907ed59a4422c82d2107923fdaf8130b4bc216aec7a11ba803a31a1d -838: 01519d8b064806e5da350a1c102d07e94fe5334fe4d23759356703994763c4c1 -839: df4e0927f31ea17664543c2505bfd90f4df67c620d979243ce80e9ce6aff0db1 -840: 28697719928efd0d8502578d1ab317b772ec0e7fce2a64d1a174d7ff6dbbc943 -841: 5aea025c0ecdd11cc6849bd784eb8b591b2d6034dd4c9e11736f623cab205bc8 -842: 21b966650022484ba1bf969edcdb1ec5e71d2e9198721c99df860bfa3320b685 -843: a48629a370e3c8a8ea395c1381d6e7ee38165e29d70fe80074f1553c5ca12086 -844: 8f00714b53a5c63483c1a1ced92f0a7fbebea7e10b27e690b259c58a7e21b255 -845: 4a15be4e2173426025a7f7c2bcc0f9fe2fa070c5ad7d0185b2a7d4a2717b2d73 -846: f6da5b5d72df9883e373e6f7c647febff5929ad666307b3ff838f288fb20021e -847: d0c3a75990e3cd3effd916b8997f8ad39aecd2f40c7c59df5c6ed6ae2bd6ab73 -848: f08583778b92382380ac638e7f86c72549847cf3570ece9f28b02f71e0bc9b15 -849: 3d41f27a82ac10a8295a2cfb6f4422fba8ef5303094a845216e532d0998dd1e0 -850: 2cc2716e1e720a13304be73fe29a4db55a2ccbc95285783744077bef292b913b -851: b67ccae6fcf0d8cd364260c649c2135c606753784fcdab5411915795c6986dee -852: 31542a3723110e69b091960c13f0bb9bde2e7630c17ac9742ed5bd94df12f11e -853: 7b3f0517b1de93725cefe79227f54ed95166e363ed0b373da7274e0f56e6e433 -854: 5a2c88b0d041cb9037cc3bd64022978dcf2d1839b7b98789dca382521f4de7b7 -855: 99fc645dc0fa9183a7cd75ce5e133e3552cd890eeda2d79a6471383965757f5d -856: 8bcf278d8e51f0cdc959ef1f5ac79c411f5b5ff7c658d3cfe4d1312c9ddec0d1 -857: 5b1ce03ec386b8a4530e1c6e9d27c3ef54c0a8da3d2138ac2ff4d7bf89b14df0 -858: 6dd8aec81318cbc0bf2fb60653172af32ff62dd2ff8cb20bc0c1df82ed41edb5 -859: b2b6ab64ea6d8c8602bb063335ec0782c02174dbcc8ecec1d6160e030cac58d5 -860: 26271e73d07a7c45d017b5085c58c42914a74719c8d49979c678c5b4f8e76e28 -861: c6136d39d206890f5e8aa2aada84bec2cf50e405fbfae64b7b231ba880eef72a -862: ee8fd22fa072b9fe159209e4955772e67d225ad2a9d169c30f6e468b5d5b1c91 -863: c73ad82fcd868b622f9b5e136915894739801093cbb84c8849a838d6ebe729a3 -864: bca23c98fc655392ba07e97b3a3cd5746c684f7131be2fc95a7d5b92d80ce755 -865: 5290cac580cd15da39312bc9f35de883590b4d42d481854e488d33794f47ac34 -866: 0af6a1b3b5a923b24b7f6be599c2475e2007165ef088230cabb9ba47f2467f5a -867: 5c3a4ba29214bf3532af5110ff7f1be43e1d828e181653064f08f0ba65556e16 -868: efe62d93c082b86ca8185dd01dcb848c247412aad460b3f98bd7394c333a4499 -869: f917605bc5eb01ec880886992db6dd8dcca845f013eac800d21082098d660f3c -870: d745dbb46f8e55d21378a0c6f070f851b05a5d0d77fabf7182cbe0b75ece39ae -871: 8a254ccb12d77511b4818302a7cf7a4010830554ff0396a105985fc4a7f0adf7 -872: 446af701e2c7dd921c6c157ea68c7ffb2881e489e06bffc555bf2241dba2893b -873: 2602237a6aa03fd4b36df0b938f1c49f610ed92bae6ed1b7b60ec172ff395e82 -874: f375e7a552540bf63d5e69c663e4b2de721435ff57d9f00476d9241c05913039 -875: 26edf4b92a2d80a8904da7d91ddd617fe97a4d741ee74e02f732dc350abced89 -876: edfdfc01d71eae7142c218f5be3867878232d25c0e503be8053851aa4c31b657 -877: 015a35e8fbc9e2355e220b6e07cc21049322031b2940121c71058a8d9c0ad791 -878: 1c241cbf578fc1b5875c13045d01cbb39564d1ac030c38b8a0add52c1c38c608 -879: 0399cc25a5426ae96f2f6cdf71abe0847082c2700076abd073d88862e4d32588 -880: 6dfacc9dcbf13ff79b66c487a678f81766bd2015da32fde451d904997ca5f8d1 -881: d684685ecca96d26094c9c0a391f606b7e874553b033ae90ef96fac18517bf01 -882: e6cfbf978ecc3fb19429203bd2c508a4bb1e1d419c313f554d20dcdbbca6d64d -883: b8df95ca983f4ef3ed0310b244f2f4318d6761564140cec095a16e023976354d -884: 3d09aad047499cb54bc9fdb4f634c09beff93422db01f7b8498d90493c32a21f -885: c4d2a3d1bb94a37768b512a87edcfa56c00cae560b74c48e46ebab9ec67955f0 -886: cd5728a9edb6066bcd9392114a0f18f4c70ccde8d9c24f3b459930c19e95e506 -887: 743b81138452ca16e51747a1662402ee0d9eac3550011931aec68a63727b6894 -888: ec0de7ecff31949c1922903825b76e67cf27c61d8fe100a5d0af52445aceb262 -889: ac98c3e8d99163b7c3f81f263468de61cd19cec791164a1a38ce0ab440aeb324 -890: b4bd0129e6cf5223eaacc456653fc43936d376d90abcc0f08604d0cb7eeb72c9 -891: d3ef730208652e44eb49ecebd0a0e0dd885e9ae13e608c2ea15690be6b0cfabe -892: 0cb39c3968bcb3d4df407cba298c3fdff967e494effcd9f4fb4dcf846d0ef7f3 -893: df067b52d70efe10ee799741354efc807f4cf323c6199ffa3006a89820196fec -894: 49c36112b26485e2c4184371937988ca9edfc53d0055ba438f7ac8f7466f4ae0 -895: 779075e7ba4d73acfeb8b00f20f03ecac57bfc4db7d907c33f65c10a65de890f -896: c9c078d711266ffe91f523384168b90f1bd00efc2da110778b9cba2f0871db49 -897: 4f2d2969f130c86498c3d4452a9769978990feaa3068bb338474e2063fb47364 -898: a84a2762530ef03398c4c7f4c456364848d91201bb0cb122ff5b18e9e39b0e23 -899: 8ec0cf65d1b765c086dde69a3ec04bc425342a4bdff439058440bb8958fae5f5 -900: d30cfe6d61b9fd4b017d6c9d7d9273e8418d0ae9b8fde5ae767ac80a6ea21901 -901: 3fcf48533859c643a0396c0b597dd9b3802d52c823b5fc9b76e6880fcfb840a8 -902: a5896436484d5efd5a74b8f467a15ad21993f411f27a262912940d4d85e2aaaa -903: 70dc9ceb90614f80df7c9c113b13307d71a4cabb766d09623d28383fa000f8de -904: 5acbfa317c6a381e91ac6c4e856cf341d8d017b6c4f378b2f283ae5fc683c9f7 -905: 2269a8c37a0489ce983f89e5610a5c992b010e9663ed854bc85826c5938ea65f -906: 9a759ebb80007327ca50b5d2d0c48a62ffbf75130b942f9ee05f33d69c997361 -907: cd625ce6c86f80cdae5d4256307200055674905dc4d97f93146ce60b4fe7f4d6 -908: d5735fffa3c594d447ae869b6f97df71a8437a7beca74b7c1b7ab7cbee131122 -909: c6997bcd287033749df80813acb98039278ddbf4a56896a3c4c852114b3d4a22 -910: 93cccb0ecb7988e965cc9efc6d7ac1ff834fbc10be6fda4867ad75c51744138f -911: fbf47e7817a7ce0c3bfded8ea030550b6d6f6de53e103878111f101e49f9445f -912: 5c89a1c644d89f7acebb9b1f9ce51a2ccee9ca212dd8adfa0d610baab3186167 -913: dc28c7d675adfe5a1a7c69400c3dbf5b38332050e4317a1cbdb275247262ca53 -914: c1cb82bc179b22b3a5d9f0355da80ac050236bc73248ec93b8dbbd053298aad2 -915: 5e6e7c848d5df0cf67b72e28e216483216fe84e5d4fe37317369c19603cf0bf3 -916: b19c2c5c2b1a45b6bce242c9aa9adff56affb1f88be4a2645cf76c42f46c7847 -917: be55f3c6e3b22eaa9c1865653a8c91ebb7f414f9a12cdbfb62938945dbc36ab9 -918: 1f32898862ab8d7bbd37d472f0c7eaae7fe2f084f8fd45f05dcb764ca5b600be -919: d07488ed1439a7213396a1ae28886ffa5c4d3cbc74c175cf375402f56988e15b -920: f0b8e66863472f11e758bc94d8a98ee308e5a05490e5db4fb66e1dc09f4e52a3 -921: 67d9acd2df48f467b4f7a84f760730a92c635e928df5621f6afdeed3e195d3d8 -922: 848e6416b52a2ff5c7d7a5e6eed3416c1deef9584f60a5f6c3a2854f0a501faf -923: 5f07bf7c71d71b0cfcb5fe04fb2f1f8a950673754dec4e816ca84f82e663a9e3 -924: 154aedec1b966263e4151b44a8c438bc5f81de0170229bcc20c20f80d85254df -925: 91707a58602431d402edc2258eb703be7603528faa3fc6fa0f6b1e6a4db7c234 -926: 8210b096d070cf4b23238373eaa334784226d472bd5a75abc4bcd512cdd51553 -927: bb818b548724ecbfc298a06c732ac64a20846953ed2eb98c452948c764b4e17e -928: b590d8e03bfe80fd84cd64c1ccf606e75ad702eafaf5353e72e38481f7c3d3b9 -929: 571308cd156b690c3b03a9f857c3b14d91124895a73a2fa041d3039c58468b36 -930: 5470e7f92b880ade0fbada76a0c06d5da0c38e5569c59c11689422144cf3e368 -931: 0584120c3727f510f276d173e1fafbcafeb3fed34bb6639d477db27a7e307d86 -932: ff177489756c5c08e42a9257170d31de9f5420056514c5a6c9ac00c5f9aa04fd -933: 826d14a8ec2b8611009cd1507b8df8c8796889cfe9555db9a8fcc930ef5ee609 -934: b11bb13741a897d8d52f29e0720f1245c25cdc78af34d1b66818506989f63df7 -935: f29205e421662f14d8d93573d326f3d7c98df9527f3a011853e309830b24053a -936: 4f8f5839a9c97e8e6b4661232ce36d14727b4ba88cc07e22e58f3d0792156737 -937: f33b892df0aa30fd76a13fd6250efa31568e0c119177ff5ef70ca1382a125990 -938: 3dd1d304670e333bb982b78ef90eef332b7ab56badd527efa371db1d72a0c030 -939: 456f703691bfa76e0267c4ca9000993ff4ac6daf118b852dd6c763354f1dc1a1 -940: 88f1827525c56fa450ec069a75af48a66c60dd82d6936b71bdddc33bd70882ef -941: be043aa1646c1429738dc5c134672819b6696e79be9c7a98de1afa0d907e09ab -942: c58f652f83e42206e0495bb43b7104849dcf0d4e4ea288ceaa8d221929048209 -943: c0a5542106b07172680af9cf134a8dd6c6aff11b334cbe5152a64d14f97ce5d3 -944: 90cf70305c87a86ae7cb3584858b09621896b6b902bd0f835afe776c0ab3575a -945: 623b58198f6f8b60a5291d1564715f6c177ed6a9795f6a22aac34769d4b781aa -946: 2eca286f8e943a0eb575a8aa472ce251c4a06e956031b9061871726319f33a9d -947: a187c87507d00d8e121bf22bd3a5381cff980a33db532fe1931aaac261bfbbcc -948: 2d1802473442182f0d2268ba7c9bcb6d2343db00d1bc7cceefb05789307387ff -949: fbcfc7d9fa122f09082876a7ba52b087553e5e434536ae272900531d9fd7c5a0 -950: 05fae880424e2b6896c06c0868b7516d04a20addee4ae06d7dfa3d2e8528c23d -951: 556a1aa2712f77d0e29e84189b1907c14ff74a242284eb8d8fd81ff4c9a24d33 -952: fd78fbe54ab202e7f63e87950e60969fe6c6ed0b5b5b9f1a6a64f8f6629263e3 -953: a72ac6b1f94bd82fc1db4d0df37b3c328282bf702a2e80bc6b443319c3127446 -954: f43267b1413f6687a0fc6919f4992920d1a74f3ea43fc087c815f6e6066d1887 -955: a8edc9db69f79246cbb57c2b2996c14ae36a4802074f650e93a1fcac77a259bd -956: a59f159a23a1505a09994c298e654afac0c8d6e2f3f783069a49d8f7f3a8aa5d -957: 665c8ccb1d3c8114ce342ca49cfcc967d166739db626413d42d55b8d2714bb31 -958: 5295ce9d52528268bba400d07d3f7bbfd85097c9f69aa1c58fb4c0201a974851 -959: ad837aaefaed57256edebe44e09dba02d6810244b6a765deab4da65906785f5a -960: aae3fb65120676a8756456c8e56846efc89acac7eb2500551446d8bf00e0a75e -961: 0ac1cf7e1bc2d02b05386342d8bdbf58a7c62976df7190f35653aa8daff30ccc -962: 05a4b48144bed7422054a947e7efa5a1c1517478b9ec633e449a8cc192dd2ae6 -963: d495cb49245a64f0c098e355584ab22e496f551c6db141450d4f2d5473abcc44 -964: 8873017ec15e2ab8207cb9e54426dd670a3beaab33db805aa01c1779cac20e72 -965: 0ee4c3502941396bacf4d957519d4ef4a4f692c582c6c2344fdfdbecde8275a1 -966: 2bbc9539dd2ecf542d36dad04808145ab85640a14ef9d5ac272485bd8f4144cc -967: aadb52646899d16bf8149a8838b15a8e4071d3d2499f38c1fd347931d7e99097 -968: 3a36bb3c62181f1906ced66e0aa9090041e1783c85b37008fd91429becfe1c27 -969: d0949593b37749c149f865d0c1feb635a51b6ab2f1534e4b9fb0e93d9650ba71 -970: f7ef0b7a549a0d3949bdf395deafe817e91cd8a1a7a7ab54c0b592933368b773 -971: 09266b160df5ada7a2956d2e3b12d4cd54339688fe13914cb4464c4ce54763c8 -972: 74d5f9b29bad60571c3b13b4374b5d9e2d2c2104e5b8b08a9a46697c4db26cd4 -973: 12523e5f97e8d85e409d8fce5a730c6f32cd05a69d607ef3f0b05c58b52265ab -974: 1a987e6dfb4a4343370a8fd5bfcf192d3374a4e5480108021180e03ef37fc6ed -975: aaaf1ce8d227164a535129c4d6352005520d4f2f5946ceb6ed8972453ad67fa9 -976: d25e2c85bca0ef83a141227ef2c9886d07e86d6b1c40e3f7cdd14f84d1e92fe7 -977: 37471a4ccaf0071fe0f3c31281b44b8197e8ef9e7301c6f53184f08ef63c5d43 -978: b0e16ba5daa317c063e157e75d42de05927a58054e3737542fc258a3cfe4070a -979: d4c184e0d658a3e24a7d25a7100ce03eee215547c335844f2d8cdb8a2b1a9e79 -980: be055df17f2d7082f4647dc4099f5c0585efcd6423a40551ee589255ad984991 -981: 09caa9af48d02c98ff7107153b1fc380af3fb9d3f00a8091cc8336d84f859ed0 -982: 67b2ca10f46e731cc00097205087b5c16d60a29ca1cbdd8f1a375d8b6fa60d78 -983: 0396ba72836444de8f0c354b8a938395b670eac515fb224a6b073bbf10bcff16 -984: f77dd049a4f6d078b810af3e0ecc9f76dcfdbea413dfcd709a1f86c915c392b3 -985: bb76a5acb950ca6fb0115097b948c3b7e928498cca4bc65e1ae7c45023642bf6 -986: 45f58d18384049e01fe1cd351e3bc74610a50173b6eacdbb8070518c241c7ffc -987: 70a5ab10d8b77ba8d578bc4884c50a62a31aa53a07f81688b3658f4eb9827ff8 -988: 12de07ccf3b01d2e39ab693a24b5568637aba81ab72a47cd5885beffe831cdfd -989: 9d54cf86f8fa928f4b248978121f2a7608e1499a3f55edb16d00e4ce3073887e -990: 523110a7ecc629c613b459c83788c9e66897d5d2e92529c4dcb6d45003c5ea7b -991: 465c58b36171c4c156ac95d570671aff0868f6a6ed9c49748dcc40e27a8649a4 -992: 6fb4c0905e1cdf34e70a2be73e3ab7e48a687efa5f8dce261bedff93011c639d -993: a316920e76d547f001de8e1e4f4efd0bb4801dd6f453e03f6f9035055ff67de2 -994: 95616eabea52bee828193c8de7e3f442164295a0511bdace71109df206cc51bd -995: f57edb955a21ee7a7c1df5ee6c6b307796ff6bbf702ac489077e847d9f589405 -996: 84f6a4e89e73f8ae45094c8566e93b60c51e02105e2ed07789e761adc269e6ab -997: 2102a6c04cf648d73c7bb78660a8b6654e97e557f6b4faff3361074f4b509824 -998: d7224aa3f93a0f23514e696c3ec982b780f9c4c50bf7b302734e4ac440ed0485 -999: 0cf69a6cc23c8666d113ec4872656e849fe73579ee11cad120aff39915b4a4fb -1000: 1a888206971be51a4535e1a15d4696b6ba4425fc1083911f274d748876549179 diff --git a/hash.3 b/hash.3 deleted file mode 100644 index d74f7b7..0000000 --- a/hash.3 +++ /dev/null @@ -1,1001 +0,0 @@ -0: 85dce2ad6ba50a0ec4162ad0598336517ad73f10e8ee16192f5fa0d6111415c0 -1: 967af4d7613e63ae6cd2f05df12e2c8d125f5128ec07521a6b313c24a15310dd -2: 7eea68f7007f367e09493c70edb150fdeddc16ec56123253516696900ed56fe4 -3: 4fe640d5106f16b6ee464b7c21da1e3c3e0223b407d0c6a3639230ef65f8e309 -4: 3632c69123a4a7cc5b4b45ddea2b1572ec877943d058dbaeee0d7fb02a64cf0f -5: b3f14807af541756e10a3cd81e812ee5d51505baf6421dfbf2810facee611c94 -6: 19fb1cbd59d7ac9b370488d9a55c1fdc79c1d8b8e4acb8607b5347b065ccd4d9 -7: 8a23d1395d1eaedf268b56ff978bca521a82c13a471adfeb85376220436f6be0 -8: 5abceb6e6598736cc1b81cb10d644d95707803988559a5d34e97b38c7ba6b61d -9: eb44cd7554093a31e15f13315c88303f9cbcc12c260c1104aaf2f7d322a4cd75 -10: d3296f612c32fc482c190825523af7c53561ab65e53a89a9360146ceef7592f2 -11: be3e464b70ac3060f456aabef84f770cb61c597c34b449588578544a3e319724 -12: f2481bdd304361d3366f8b47d030181ed574be70ffcaf2e46bbbcdd9fca86f88 -13: 9d8806d808ffa4fcb20dd8c6e83d76261579d4d55dbac5fb45c843704fc853d9 -14: d7154bae8ec7256fc5c6e69689642a2be5a4050223418a6fb42a069665c1e8ae -15: 9d508212c183bc60199bc8d452ee1410341269e486d8887e6b873309bc07ae1d -16: a998b3bf8609d89a750522039413c31b67e4d8ad5bde96f8676fb845257c77db -17: 267512254d3df3188031b77dae4378f1b2cefbc136777e7ff450d9249dd7631d -18: d484670f6ded2ba8f3e1a926b25fd9df59f6c57b5a7ef6ae528a82f6fc096f39 -19: 8a9694e39a0f7597a517c9ebc0d29aa47d38ba488289433caa578c31dbad4d87 -20: 8ec179071c95681b40b81cfcb878cf30388917844b8cc0a70106646a2509d54f -21: 5d6d37a33541f7c27460408529d4a2011906d4dfe215fba1ba654a8d0e57d522 -22: 2d493b9694a77fa55453ec259182ab55de0b504d9358047d5d8dae34df779fca -23: cf99972160728ec412d836ca2f9d0af86b74d6bbd46e9998f941d1ed2fe3032d -24: 6a44bd9e825c146850a76356ba47e62c71420a6f7b3108b62d58640290fc27f0 -25: 534294e4cedf8630d14b0ad75bc732f6e02aebae0c4d72de37592deeab493d36 -26: c99fb8948e39addf22fe084fd260e2c7dbacf6dd0ae5631ad9da1b8f2c887774 -27: c55f039a282306e34d74b1d3d4d79432caada63ce94a20e18ce1e3a1047b5c75 -28: 0e1d4f3dcc82aad407948b3bda370dbebb3453be9445ee746c31b6a6e29f834d -29: fe1e351a0405674718d2731949970188891e60a22454162607cc331bf0250925 -30: 49fe281b7e21d1f12cc071368359f07e9022d20d0ccad6da269d5c06e08985b1 -31: b22666b1f8fd1ecf1a73f15132f95492ca95556e2724d7c83d62c61229365534 -32: 42e4a64c2302db6677e55397e081b3b318db7372b648920f8a37780ab1cd3ce6 -33: b16a21a8dcad9d14d1c9f206d8da2f1bed1827b9c27570d8f762a42ea324abe5 -34: 841d5e62b2baf1bec33817a764e76447da91c3ec3bb76c71aa7b843fe742dc56 -35: 63e2031c2ba2de22f57c078f30ee466224aa9e645955c4d7c9f33cffa0b04c5b -36: 57b3d4a9b99c5b30bc07aba0a104dbf6323919c7829316af44de717606674d6a -37: 52cc02a6c375c8661d5ae7640c12d4a99d471a68a8adc24c4b7b775faab15519 -38: b74dd5dacb02d8991de0d890f28e9d9541728458897f185ea2ee461edbc862f1 -39: 00eb716f16f532d8cd216c2381045a03600cfdcddb5cff899327872d1e4c56ec -40: 62d17a5c7852291a20954e947712d9190124962c82c25de397e392d998096f4c -41: 3651989b89c2177d3dafa548696e28f4d158304424395c2f96b5268944f60c38 -42: 97c011124265b78962504cf4c57b701c47e12c5509d42b239496e39613e62e33 -43: b2650e0fe7cafd2f753baa4cb4b9130cbc42b1ee98beed229003ab5e6f6629db -44: b0890007bcf10bd94da7a0b43bd64da4205665e70b3bb9c1f6e7f72199a1f0eb -45: bc342e0606491fe6a11cf901b41e872c2bc532af5cb8bef2a93c80e87b29061f -46: 320f03dac702ecd4f942b33805944e1419f22325a956d61afe35dc224b252cce -47: 14fea152c29f1198c1f60f5e5937dd7c875a3491728043210c784feae9484426 -48: 646f5ca122eb0bf206c1481c170ab7a003b220e66c838dc8d67e71244337f7c6 -49: 9750f6ad64bba9df8824f67d75d37d0c0ee31ae765e7422f226ae9542492d82d -50: 2a41aae9491dc68e12bea51a9662ee0c0b6c485947189e075f2ebeaffeca6c41 -51: 77d710e29edcade288ed971d0de133c54f5846f3f663d22232d684c8d9125652 -52: eaae5db00afaee3de0c3e21655a2cd8368ff7e7dfc0fff64af87312a7eebb0fe -53: 5e9e1c024afe55d81b6ac8557f2867e5f7c378d6b58a757f65ffd81af1aa7925 -54: bcd1508137fb9456e0cd307e405d02ff17be39ec5a8dee6cd0a8219b88c72495 -55: 337bafca56c5dbf80d610b7477a65fcdbaac5b7060b16b5bb295d684c41355d8 -56: 1d3fbeb378a2287bdc5f4a20f1a4328905391f61654797d4710c9247d7e3376c -57: 59721454570ca2b55c09ca70ad99dea88ee5bab0444cc4c957a80b8602e764fb -58: e07829c5b27d55c8ddf75d14ad8d8d25c7dded815d58d67b89f0d682a9e3ac42 -59: 992b6df70082b7fd720529ac7eef352646e6c9f6642e0336080dd5239d6c111d -60: 75fd1ce46bccefcc1cc1680a192dc545c91fb4262f1ac2cd5aeebc9a906e6a84 -61: 4384d8d5cc81a5772d479fa636aae5e750e6006d73dbf06c662e5630cc9f2f73 -62: f2c6049bbd9242d9739f2a408169452a7c7f99e3d44b414ced10361ebbfb9861 -63: a5b666b5b0a2d63415b744a61d78cb7e2a57658e0f5587b75acc75268a7ecc9c -64: 0fd368e2923173329fff18564ecf4e4c3100f9d116bc2e34fc6c43e0f152f789 -65: 6a18f6aef35207192c09a7670854d76313e230450b11c1ae09dcac738ae29a75 -66: d6bca17093abc1619e048ee9c1687161f60db61f5fa45f32e5f413a2211a3ad1 -67: 2b3eed034067549495fb0906972c5d046f53d26fc4f0603ae0fbe216e164d5a3 -68: 287e82c3da770aca0a53f424c4b1392bb1de1178e05dc7a762af59ffb6cb3504 -69: 7dc33c0676c18be0c98f91b45055a39aa4bdb5774d1f3d2b364509117d5199f9 -70: 8ac0505260206de8c3e64a03800aebbe06e20decbb7e1ebb08605fe6e1cd7de5 -71: a5f80ddf555516ef4540fb4882faf398e8113b90dc0436da6ade4e2585c135da -72: ec628bba9ce4d21d7a4e94908bcb93e97b9356322349420f877562f8ab806c7a -73: 8a933684d3b07d9cd9e7a85fa06f2f8fad6585bf00e3749e81a55783a4c33ac4 -74: 61471ee903ac7f8383b5fe4f06d17b3d6776bb86338e6bb4d8d4661d22a0db94 -75: d21c9f3f385090e34b25b021a4f89881c4cab9025c6bd07ea496811d55cab4f5 -76: f35ab97584d028e267ede7aa6810439130e9af020f3fba217b5f5f05f0b3fab6 -77: 1eebd15a4b141e3c57282e69f9ab7c9a26e027e97cb969b30a81cf2aedbc6d5b -78: 0d3601637e980370f233a99fb26df1698db1fa8f6ba08b17fc5981da1a0a9c4b -79: ea5e9db8b0d525e61a8c2f4222f0e234b5d11956968d75fdad29ba729c31c30f -80: f82393ee4a0e993afbbe499096b86fa9e38e9365ce39bf637a66148e563a7562 -81: 877c9e5fe589356a397ad27d41aa6c266575a3fa7b1041f780c9fd71e38a59b9 -82: b594a19913145eb74196b03b790d1166a3ee5483c4056bffecce0851f0fa62c3 -83: f4bd80926351cc2adb02a3987be946398cf90b02a73c30a34142ee9cf4e6d6b7 -84: 6554661e3bab5d0cd67a4aa12f851624fb59a37f76d67dc261f91dcef4e99f56 -85: 9101f3a09b1e2f4164e324c3a9a6550966b19f8f15f35dfaa7e5d5880c97c434 -86: e3a8b17948e7d9a6073d7f7f3dd324fe558115b720a1adf4e5ee5277245cb183 -87: 7285be9c5b90c66c3cb2c7aa23b2614c9acdea964bc8695a1428fc714976f812 -88: 47104b5c6fb4ec27cf85c1a3e22fe631928538b6e39a7c4a8b19fa216a965155 -89: 3e7bf9add688476395fb369d0b51854f13871e6ab911220f4a2c35bfc82fbbce -90: f5384db8e17f02eec498c8688e9ddcb9927d698f969d398ca3777daa53c63d1e -91: 52939a46ed816e22e051aa8cf603b49fe12db3e14fff5577ee5fa709bba0e246 -92: 5984cc844cee6f30e28a7a4569a303aad5fbc647eaef45532ee2a3a4f3e334a6 -93: 60795ea26fa1124808272d8fa41dd10b04dc832aa2a4b29ec2a67d0aee8326e4 -94: 096f2ebb8dd1a655df783e6366a9826e8d2cbb45a863a2150126048c4a3bb422 -95: c02e2508f4ecc02654973ab7bbc697356b244e2064711d32034f41ec6c8010f3 -96: 399bb57ef99b37f9bf110c800857479ff5a4a6d615c28f1ab2e6b135f241f63b -97: 538146e200b04cb7eee283bf11c622f487b164b45aa507997076c1a714bb7037 -98: 634f3e4040a82fdad1c2f9986856ea84a29c11b780832433c72f53c38a9989e8 -99: 857ac7b15eacd88adc2aee1935d2deb1613a4fe6a07ef321b31d6459205efb32 -100: b9c18f78c6c126d024475a4cee31c86823a9b78948913042795324847c2ec260 -101: 4c21bbdc6c098799cc054ef6e4363ac809913ff273528755ce091fe8cea5dcef -102: 3574bf8d1624d866c339e7b58b4e4aa2437ab5792ec3a18c2ee3d6bdc0ba07c0 -103: 3ad028b3670b7e0df2031fabd8816516e19e10bf06babc5eeca48d80800f060c -104: d356b9a32be6600604ffe9e5c80943300625d89cb3834dd8b2cb1518b681991e -105: a330970603e32bea86778320be1fb89c1553c3c0703236a20d9ffb03f39e451b -106: 7d55c46d31de40187a5d9a1b82626c44fdd05dc92b8fe8f932a1cefbf15803db -107: ddd8827353b8b2cdfadf52c65201808e31586795fa5086eb04fabc3be56cfbea -108: 7abdf987458b0916a6ca6585ff616e6b5d385c0cd31dbdc66c6c613d4ec6b444 -109: 7bcf2da4858bf72820343567b4e27363c0f9c4576fca736fc12446637b04056c -110: 5796ddefaab6e59164723c4bc81d4d4044c25e4a5ed3e6982c3068394be6e765 -111: 50ee47bf8ca763c2d71db5251497889abd6bddeef350d774c8561791a42b8d3d -112: 78772ed96cdc0df15f826f62d72e1f0a9bace9921ae6880b157afcf12d2c5c62 -113: 0b3d2afe5cd8da4d61dcf951afa561b368644812a367d72c14062a189ff48b2b -114: c3ee44bcc9467d6eaa38f23bd58cc345cb6027af6c35fe101e72cd7d8f20ca79 -115: d85baa9f673ffb8ee642a26cc2eed5b2f7cabddcc1e3a57da6d25a9ff21a7ba8 -116: 22f6b3d8c00d5f6ab92583848a14e1b7ef3b7c183a26ffdc4d8bff0ea45d40c5 -117: 725b763fc442a935187982ed76d0579dc8dcc03f6d5247b8163e7d4f2d4df8e3 -118: c68d4f34319edc9c6be7fa9c2be8ebf71a3fe18f04e4b0adae0441afb2b04a85 -119: bd380ee1173ca47965d6d1bc350a2890063bb80253beda787d04129d425c561a -120: ab3069c2af2f4fbde79b2bcbbb407a7e7ebba04b9d479a61f12d6d381fb616bc -121: b5bef1a995fa71e6c391e0ebcea3d5b004c09d20b859040045a3ce5bea9538bc -122: 7cdee81258a876cc3396fb581e98fdb336dd1950a201655b45d3e79320162627 -123: 2fcb8b25d17eaac4370ef0a188e6666bbf966176b647b174fa9eecf2abec55e2 -124: 2d5324eeca9047ba17815e13e9e46ceaeeeee6b617725e9c24095356292c7540 -125: db01b4b82ae2f9e2757f66ec878a45174f7c23406b046926cd2586a76ef0949e -126: 410742c1ae1d14142d796f4603531e78b30866fa979a4adad4a49e9fdd3364fe -127: 2912f9acbdb4627c37fb1f643f67bcfa73a9fceb2d848ca7093664256c3f7ceb -128: 640f47f565d46dfe065e24cc266855c8b883dac354f25483c628728f8bc23149 -129: 175bd5ab889991582d8554c8a576293bc14be7226791b5352eba5aa3d6434de7 -130: b7f915cf072ebc03361a60e75483d96383bb67bbef4fd6b7a091255d72ffdba5 -131: c547751a862d00e7c5cebf2886e1b7feaae7c3382e80a7d3a306bf66c035b049 -132: 1e38d4d5fca04af54b42e53a1f80025534b915fcb3929cf08447e31a97f8fb4d -133: b4c3f2baab14feca2c91ec75d115d231d078b5571c8d79bc966d5ac7154beccd -134: c4fec2cd994c7dfd7b8525c27bdd42aa6f4bb263006f2939d94cd20d6008a44d -135: 32e2c07f62db8ebcd805a518e471c021b5940689d62ec56cc031045ee9af9513 -136: 3972cf6ee94c3b4701f3fa7fa9f7be130abf7da6559b6cba5d4037ba61ba4b6e -137: 74ccea30243f54b1e99b1f98b1a565fc5bc12c0cb372c0bb347d66df0f5b6c5c -138: d487a1505e3a398fd212c1df23eb124d7f16baea31ec1a8097fd2548d66c9de8 -139: 2054c1791dd0a033f054831b3e1a04a3114cf3f30b757d55115d0982de043652 -140: a549f0ec73a288b97f256153171dcef571008e1e35a9cd8d711393be473db126 -141: 59df9467e37cb4a346b8e12193c6d88e9dd6aed0e78c42372976db0bd4a24310 -142: 068e7dde0bb916b33c20310b8274aef929f2af47fff613f9fa36be085be4b800 -143: a8f28880fb2887738be1ab65dd98670a6cb0ebd89ab1f1a95a63aee1428efe1e -144: 45b277871b78f4591cc67349da916f07a5c2fccab58b12ea7afe4ab5c96d7fcd -145: 15c6252b88e4cfcc42dfc10638d01c080d8ac7759ca2c6e605ead3488b415e9c -146: 2205890b5e8deffb8a7c8270487a08bdae83ba0a823a3d7e98f7593bd80aec75 -147: 796161b2b7c7668c313ed3a4c96c749787d433288650a30a5e20268c5348f0d0 -148: 6d27d2926b2cc062a5eb332a1dd9084dff917d6014eec2b297e89e2ac0b0fb73 -149: 379c422916ddc464d9038edbed5007932a809547c63611a83b4651741f370ab8 -150: d3c26dd08a7a5587b4e5abd4fa55ff01127bbb715182f535a415555009862355 -151: 4366a1b92bbe908968acb1dd2a4e1461bed095fa6bfee3edbad953c5e9bfb1b7 -152: 62e6790aa528480602f628546cc04f828702b5423a6f6d6e7553ae8e8c34274d -153: 2a34e923990ca42a6534f14c02944e9f13d04fc926d3225c372818df47069c66 -154: 7163bf10bb131a014ab065e5170384af8c80cb09a49874d4d459127f09959997 -155: 039dc2b701808a89fbde295e55dff4abd976a508a817cea65b98caf0375ee8ad -156: c2341af85a957814610ede9b39d110910273f0627749a41e82c8249e841dd684 -157: df5638c7eabc9c0fede2341be6b46f003610768b90d15dc235df662cb3ed01eb -158: 31f31fa4ea63eaff1c1b31982a8874408681970fe211c5a68846cf10043a9347 -159: da2bc98b35182b12fdbf81352666848f1562a0b235293012c28489cb04616b46 -160: 21e6e3278390ec9dd492369dc2d5e04da3b393f630bc9a1e47d8ae1173f046d8 -161: 0b0d1d9a3cdd175998bb4e83436c81c1da079e6347c81a8a5d940fe910c145a6 -162: b557f92e62e8316633fd61fbdd8d726e7fb3c8e413eb5411ebd9263973f1ecc3 -163: 022cd2cf5a5a16f28e2d8a65130f70ce12232efff8ec21b97e935b16d7726a2c -164: 48b2a67cccf18b25a005073f244404099e3803c839b929054c839beea3420cc5 -165: 1078303bed2aead2ec811cfa4fa41c3bd4536290e0d690d3d0378124387bcdce -166: 8c6218f83e12015def099c649216ee489bfcf6a86e8c13e2d2eabfb083d44478 -167: 16399aaf5de31a47300043fcbaeb8ea5abe4b9206bf28f648cb41843670be2c1 -168: f64128bd0c936e4f59d172e61dc99dfd85907d14d3e59f0f0554defb246ceb45 -169: 91ea1c7acefe0f3f9d0ff988fce594a3aa9fe943dc38351f282003056eb3d177 -170: 9d3ed59fdc903ec87c8e4d2b1a7fbcd338298bb5aa6f321e401fd388cc5d3a17 -171: 93896f5a03b4aa3eb26cc34bae3124e42e5f661f8811b92ffc0a66964e4a08a1 -172: 5220ff28bdaa8286f94646feff8b615c38f80fbca37857fc3e81a3d6ef561e52 -173: f3434ecda75e0216226e1e5bf9143ac62852691ca5ccaf8954420f73ff0e3b05 -174: cc2a0b6ae2447b3733762f34657287f4843362c232c99310162fbb6ff0d50123 -175: ceb7be0ae2fc7f06e0ea102aebf343cb37c65deee88e2b3a538dc747979f8ae8 -176: 081f689b66146e7a256b1f645227cb3c9ebfbd04ad7cc52cedf1acbc21d43dfe -177: 116944f76f92bd752c7dede3ae8aaaa3e78c9f4c168ce1e4f8bed4051fb93b0b -178: decd90f07fbe6b0720886d0afb4cbf31e251882d6f7bec8c3482f8ef0cc8eaf7 -179: 8796057000a4cc5092554b1ca6826876f433a260b5369814ef293ba3562f4ce7 -180: 88b6522669a0e6b78af9974bc208499602e4ade0943e8d65c0eaafd854481f48 -181: 8e7428c3c728b8fbace45c64df9b4957592348c81433bcf6b81d3c2e7ae72c90 -182: 9372a0f5b68defaa0676b78320c16502801ddc3255b523e0801505ff5e7f16e0 -183: 6e86012d3547c33aadd438d6efe4ef06822f2a964ba16456054c7d7f1552fa26 -184: f740b3f95a86764d5a8031847becdcd2d259180e3de84bf074f993effde9971e -185: 59bdebc53a196c3018fc6fd4d6e9b6774ffbea7800700c8670df1276aa860bc4 -186: ed215e876c7709f3f456041863072e245600beaa6911aee29d8622de44ed33b1 -187: 4505f43b3569d2013cc3fc17ac31a329c4109611bc90fc610b7a47df00057375 -188: 6ff109260f1b3aa2d7dd09a8041dc194932dea241cb5e31e63612dad5aaddae5 -189: 48682afe897dc03b3d1ca634a183bc85dd51fdf049c8968a6d65c071c6afc514 -190: d3390ec0bdda39a01052620d7b6ae10d3275bf2eeb728b29b8f9a200c2899bc0 -191: 5b861e4da914e584b381f6d37f2c8458cb7a9fdc096220116bd184595d09afee -192: 18e51ddff9f391a89771af8fc5af6a269425fdc0885c1ab23c7b1498647ba951 -193: e379048af309c10fd9a95c37671f1965602a19d72b37765b6880f78e5575d00e -194: 2a03863aa3f1818018a31a289a1f74b43cd3486a6186332ea9d187cf4d778b8a -195: b06b627d0b9988f6246a2c74aa07f2f064a975a9ea72189cf70ef7738a550fc7 -196: 24b49031bb78a51beefec8aa02ee0c3f20a0bc8e23906ecb05a2e713675a283e -197: c91b153c4d07090707d66874074179278c760b59e0bbc488488112abfbe0a00f -198: 880aaeb0896c44b2e857cacb4e86c4430087f1524c25672ab3ffc3ed74f223ce -199: 8f79f1a6cbbf335cf629c9d0f9cd2e1a2e8f75dd911d7cda3d8ac7a0e9b44c03 -200: 22fe080dfbe76d382bcb438d9bb45671084d45f94c330436391e7d820d196598 -201: 836bbd51ce9e65eb7051f2e5e3c60816fdc6076b141df672ef8dd65acada203a -202: e454eb81a9fcd1e29b2313ba44020ef5ef60c2e3fd3b0566c74b87092afde086 -203: 6535ff734a6fdc4d577ea4218c657b65cd1be4ae2374d8564b01327b86da71b2 -204: 2265e8de4d67982ae7101f5dae68ca9f9657d2db3778702d909b79c6a86a5795 -205: 85fe8633bb3ccde13c7b479776aa1c41db83c4b764fce90ed14df15467a4666b -206: cad903e7b72d170c09fb62d3907f9b561af4ec18ddb28743ecd4cb733093de3a -207: 491a3cdbe7c160b955e34a93094302f1c01662e1ec30816e4516bf4e1c61b76c -208: 7ed8eb5cb2d7ee6f9e2488dd8fa835f6f22109f42215b901d5e4c4359ad30ee2 -209: 1cb36c31e915894a6a2533ccfd3859046a1dcf78d8452bc88958dde0ca191e82 -210: 7996ba8fbd81c2eb0becdbad564153c598abfa2b0f69bc3ce6566a78931d0b3b -211: 81289aa5f1dd141efdcdfc5337decd1399a8aeedfdeddeae6276288106bb76df -212: e4b3053295d363cdbb2572e7c374ae879efc9421701310a34db983a4249c74cd -213: 6122b9e38c62b79f5ae2511de6795fb0fc853a0aca3fcef4a182ed52439037e3 -214: 74982ecd365733ffd752f772b3c8859b030f09b7667627bb6dfddaec59c30963 -215: 65ac368432a97208d4b02bb2481e674f31d90f4f18efc9375b92282432cd4398 -216: 0ae0472333635ff53374228f90d5cabaacbc0af29938fb8693b1d6303af5d819 -217: 47335e444a2f868bab1dd2bcbf7d696403e156139545a479710a6e559439a8c3 -218: 836aa3b53750ab893a8d2505787917fc35dca9cdd8e144474f86e2fc62aa2ac2 -219: 902ad618c9cace3b20b7608eced2ed3dfd0fd2dd26d1ea37e87134f114053aaa -220: eeee27753ed8a81edfd6a9f9cf22ea18536e6b7afe16cbfb795c84611f729b7f -221: 78689d14bf6f41cf48c193559ca84a3d9159e4d8b876d8ef4400ff13adc7e546 -222: e95c0cef65e3ec3fd4d13511442b43639025b54441d0f6eff2f3f0fd16112e49 -223: bdb7210e537118706f44ce3faed211cbf168d84bb0e987d4a283c854514a896c -224: 8c5f6f2b232c4ca41560d9a9cf2133b9e9cb18f5879fd4b33ef3eb63e599ce05 -225: 0362c89e151b3c9fee8518298cbffdd7248e55598f2aadca11349c6052634142 -226: f890d22cde86aa1c84b2b176f20fbb12dad5a01a5440b7ea9b95ccfdf3e1c3e5 -227: 07bb7b47c9b210d815f1069a0a41d3a84521e657b7acb287b1cd5cbb49f67ff1 -228: b1a066f1a5123b37a21fcc3f76776d39d9b1900ab322627c624ca36c41ec8c80 -229: ba78c1228e9c14a53840b0abf4c2453000a9f7987a214c25303404f73c631f05 -230: 5cf5cac55ed208adb8093b361dd8b9f5f02fb8a53cef52826924782e1f6a11b1 -231: 96c1b670f199bafe07ddfd47f1621f83358029a70de499e06bbdf703df203266 -232: 1edeb64a7da98efbeb47db24d63ef44715ce037f115cbae5f9352d95250ff191 -233: c35d4468f41c85e5cfc438f1710c8ac81a14208d98f7aab81d9a2af52b557d3e -234: 15bdd6d35bf282cabde4e76053970b0dab3be54b0d82d307a286e465c8cf5977 -235: a1f30cbdae18417c306ced42980242e75e26a46dca692c2a5c66fee091eee6ea -236: 7dfdaa74283d590bed1a93aa83690b94af6da5ab325048562328b12121a1fec3 -237: 505531a199bdac286d600f684a6db9eabe1ebb8484b87d9eaa645697793161e2 -238: dc9b0fa83e94aa6a077b27566bc819d3f6c4cd9de816528ba0a8307ba5a9ce89 -239: 0469c2d7c5238717833258ddca0e7b5e2935f88fc18302530c7d5f4d12b4e6c2 -240: 5444891f96afd31dfb90875ef6361330cc9066732820393af2bc8e7685d73219 -241: 96c7a7d1a89c2a7ff489b4da3dad6040d70678d943e493124ac85611da941ef3 -242: 83ed5df952c9a10321737683dae3f07a674130eb1e63808ff36657786ae90bc6 -243: 8306098da643d0d713485eb46ed5b2e195f5922059dfc4235c56598e63258915 -244: da3dce162705f1440002406c5789b185723547355b9f68e2b79752c69120cbc5 -245: 586b2770deedf675f605e7a0ea1749f4ccee4bd503e979bed27300665376e135 -246: 21e45166c93f32ddb9455bb5bf741b35dd091471e6be0fdb0a3e3989e8e03308 -247: 929f96737caef074135a18be5507aec562cceabf0f782f68819c600c171c6652 -248: 07673d367d2861655fab34786cfb189d1264040aab58f8ea997ae13b6c303e20 -249: b0d774540ae1680d4d5c47002145f86d64aa85739bc61f0fddd24341fc870736 -250: 90be88abc45f798dd28659b543f1740317abc8f5a7edd9cbaa6aeec8168b4eb1 -251: ccccc2ec1d5992b360136f83cda2adc2e4e921407589c633974316084a0a24d2 -252: 7d863f9d4cf437e5f01661a0427f5d84c857a14f0c45117bfd430e1ce1e83d37 -253: 0f1100223e9634fb289da37860841f227e30fc4445e05a89580af9e37df54006 -254: 989bc5068cad5a93f2cef1e4acc0031c3892e0a8336f57b967ed493ade127819 -255: d117be5bf4886475737e229feb3a212067df3b4d20476412148de596327e8629 -256: 7918e370264ffe9a954fe349ffd1b857dc73948de93ecba459dbf57231df395b -257: 9aecf8190d9f3c8aa026de18a609c14017a5cbedea830aa587bfa75741785c87 -258: 4675441cd704567d561a9a244649afad8c0218870d8422b280dca07765478f4b -259: 807d3e8c51d7ea6d1f9178769f2ba3e6ad3eab801a22a341eba696ef656812cf -260: c9327ebdee70d30bc6da82ce176be856e13661ad045195c7ea3cbce1a50eeb6d -261: d2892873d407dcc7ca8d153705b537e9babb6e8ee48d43db752be3d4d5bff8b7 -262: 4042e408eac4bd2d4780366df17273c674ad0975053af97525a585783926eec7 -263: 7ab2537e4623221c87469fac039dab9f948005a1309fe4cace36a165ef8489ac -264: f9be4b7e3dd88242e994c06ba87bf086bd012bc05739c130708678ac148ee2a6 -265: 67f78d0c6e565b0a3b266c7024973632256c7bb1a50f26e615700ac117f12e14 -266: 65860d112fbee85873f4491a062057a044b27b075054207d04b3e1c8e0ecd295 -267: d17dc8cbb6a4121053bc4595c8d472ebc25ec03e6a7a3cea9693f7a08857c19d -268: 8f5526c34c0560b272a783e8f84d8c6068361fc1fd98737f916539c4e5a786ca -269: 622442a15cfd2bb1d19a5bd917eade938c67576a2fd710f355423c7e362379d8 -270: 01aacbb60422586205c3b537bd8e6e3c3647a6a6959d8c572343dcd4c2a3fd03 -271: bfb97cfb6d5ea07d2d2bf8075791ec76e038ecae19738583ed75ed3af92b9dd8 -272: c3bbcf68c733161cacb2185e06bcc08e739e0156bf172b465cad0b286d651863 -273: 9860e97874180ce05482189ea83b9bd46df9c1ff84c063c04b55e5007d71e308 -274: 60f51f62146cda4f15c5f549330bcaf0df4a420aab37ead2e94115b28464ec68 -275: f820c827e5685de1586f0c4366d68434efeada7cc8e4816113f1ab7f854030a8 -276: 439ee42e996b28301a17903413e27bffc561c20127696a1fbd7a9ec1091d15d2 -277: bff9711495f8648195b9d685d74737505158c58dbbedba3af298a12ccabdf72b -278: 8b440ac27c9230c25b1091416c331ef3e7c63fafb4d3fbc5e7e67c9a96eee7c5 -279: 153d0606d52d37fcf1d765026d5db583b0d8ee70cfff0b31fcff893e22197d35 -280: 8f271450f8d016349330115729edd00dac6d4b4ac1b4ae5a34ed03c3895fc6ec -281: 5fd19597f8f2f54a105ce419652b6f31ff5f81b6e9c9fe11adc74d37cbdafffa -282: 83ec2c8abf39cb4ebc7aa584ddab071e0bf709f5dcccfc4032649ee8e934e9bd -283: 87223192712bbde69b66186f916aaa5e034133be0852e736ada9a4f2b6d15371 -284: 51881c2227b7940a388f28f75754a5a606f549abd05799a139913a0e4a7b24f8 -285: 449501d5e3a11f803d3db8047544ba233d33b88d0e338b1cd8a21d274068f399 -286: 86028c7871285d1f8039aefe02e4f8f5cf8611cffcae71633b41cf24ce1eae2d -287: e4a43cc54820d908d2f413ad9a43b8c5a4e635c96bf3080d5a1d2add8a3d6eef -288: 4044246981889dde292330066d8f563a73090f61522316aca1db1fff59c76b19 -289: 7b8fcbec4e16cc0b53159f002d00a4e7fd67c8a1e04792e26e97c2e8ab52d1a2 -290: 164a4ab46b7901283c57d89eba86b54b1398005eb3b9681617934cfa48c0a7cf -291: c234774ec19d702c50ff52ab2a5681aabbd194bb8a16375dc0baceeb4549886e -292: 5dcb231c4448ea274426f1d3b34a4b5b2639d88eff8312bc08c94ee50ef5128d -293: 2b79eb4bc6a5c548bfda75d29f6e987942bc7abe6eb4515edd838913a2edf245 -294: 8c6febc7c3da2fa7155bb9c066677f018c9e6b580b9b14d576d38bb533f66cf4 -295: ebc472cf68e67db6be510b6d4732672c43c74604964eb5b4433b9c779dc7be5a -296: 61e0af62939c09edd3e12e53dd5b304b4b8d787f57adb6027154f81c748bc1bb -297: cde92fb85c4aead4cc97f094f99f52379f5913a4857880f26a337851195c0541 -298: 48d22f360d786faed02cab1f293efa2372d1a81d22e2920f884bc379e87faba7 -299: 12041431911a6e89eae0e2210f2b68efcf666e6da9fc63c33a4efa73a513f45e -300: 0e859b529c474484c1daad4892757411be6c133915c71e11de6675303e8a4c5b -301: 4ea0f68329d2132134987b0a52d2a5f72b799a7888f8e51b538a3390adb18585 -302: 2228eab0ad664fa03107f7867ff9fac8d5314e296bc47cb429b6d59c08f8e38a -303: 9bb3fb3df5a2af73ab0f0957db8633b22ae1b257ccdbf6c01b644345228f71ab -304: 28060f06073a5b7044d979ac6ed092750933fa2a65834d8938ea1ef9b9b30621 -305: 7913cb25af88438f3a4be0a6ac9c136859efb982b51c43cc41f8f3e9880dbc46 -306: 0b58a75e74f595094152e3bee513f4b47f465e974428ec9cccdd71bf0137dcf4 -307: cf774b4ff8cf9a2b2df5478356699550be7a89d26ca7cd988bfd7efa53fd5437 -308: cd7b2510510b1e68c93af020629b2dfd5a4d0b258ec70dd601271cb9c04ff6e5 -309: ca1027e7ba838b52595f0a83fbb8d05e9417241f7a3c8c90799579183a2357a2 -310: 9916cc864cec1e57b549623007220d92320c51cc945bf1cc506deae386193dfd -311: 4f7f9bf00b3975efbc9ed9150c8b38971951bc420c38dcff173357d8594db52d -312: 584a91d99da2b8b99c12c615961f1a8ff5b758ea8780816e1a1767d55b1c197c -313: 2adc133ffcc65a546c198b3bf088be0bf68341f8c5b45edf0a79428cfef5de25 -314: f9488b9fe9b0ee2acaf54bd385dcba101fbbcc801b71d0c3a1d1c820f11acd65 -315: eae10e528082af6bd71edf955c6fc7873b41406f727fac18872ea586dd828302 -316: 8f6ce27e9e18ad70e112aa5daf18bf564284fe985833dd34eaecc6b5e064a771 -317: 6904feec855e513b2f2816ac5818335be61832d92fc5e020dda40bed646df7ff -318: ce212d5906da3e2701313d4111da2f23b0091347aa6107fb0e3fa8f05c8c6b7e -319: ae2aa88187825ee3364586f6b7b8394f1a7167710791447e381285707caa2949 -320: 2ee5e39f89d0420f9781a0fb572557595505b16c4110580f9e2510cdc37a6375 -321: 71b7110857241e261289757765c5505296a4c99d1a5ce1fcb1675f1828bc58c7 -322: 612fa9024db98b84df2aca6419b00879701d649698a5ea3fcdf0c13bc58bb6a7 -323: f00b094cc91f60ba7e0a47c5fd5d3a65edaf8ca278aa4e55a1a859b8e4e610dd -324: ac13597737535d11f1cb7c259f2f4c85eec3e910d71be3359e758ec25896d893 -325: 3b1bd1bcf7b79d5a722e1c731a63d3a98d5efdb5f6ea26207d66780f79645cd2 -326: dc147e3da606176129f7195959841eac83db95e994c60f3dced9bafd67130d33 -327: 8fe245581f1813f11c750b3a5b02c8a6cdf1b59c5535e035551e5d590d3d03a2 -328: a870586448d52da28c66c78096681dac2deec0f07b6ac5f6790d497b7606e0f1 -329: 3718898cc208739481343d4a15bdbabc785c59ebec52837a63904b5f313f0304 -330: c559c358dc83ceb40564b40818a0339c1bfaedc1eb3dbb1fbe9f6d33a5e35581 -331: cca494691816aad621a47fc105b8fde3341105a29c3b706e9455cdbbaea2204a -332: d4cb6e4742eda4523a5d178948f05468d1cea1e1fa2b7e0d99d2dddd1e4fa8b6 -333: 58713a47ee7d464233aa4a925bf8ef6e55b305f2b0819d8745afcaf61e118e71 -334: b48c863bb5cabed5aeb69051a8a52479f5a37c6a43a643bdb37ef006b4db54de -335: 89cb6029342df50b71f16f88d8a495fd53b30889c94b4d7af1eaf8b4a8c1d9e6 -336: 3da1b949bef0364d6fcebfdb11e6d2efca2dc012010268b4c02e4b489a75d59e -337: ef14cd74caf8f47b6eda03885d20849d734897cf89455d83305aae6f1f457893 -338: e46345992433ad8f196a241b184f02a2d2564533cd39e844aa47d9a87f65f8fe -339: 77010eddd786912ed75c3a3b1c885944daf061d58ef653e94eb549143d4d2766 -340: fdb79ff371ba418823ea7443652d37286f2000df06c3880f1cb322f74ff437fe -341: 53f36cca4baee943d61e97bc9a5412670ff7408af16960c5487a93d1568c9e66 -342: 9bbd9eb1d00da5c0b96926357cc38f6f649f4daef2d0d79452365ed7a5679baf -343: 6fb2e192d031cd5070fb63f5e6a23610a008d592e0be5083ac2dc2ee264701d4 -344: f369c877964f6bf3675c2302e0e7273a600e5e2b1d8dd9eb0bc9ae1ebbcfba02 -345: 5fb4511bfd5a89a4c026b227d3edc5a1e0553ceaf56b0559c334253270ab0cff -346: 2105b64db2ed533bc0529de6d4eb90500d26e1b4fc0393a24292c49ef45eae40 -347: f110830985de233ea7ceb040e340d63d933a74237a6da1b6e662b6fbe1629d7e -348: c7a09648ab90c57f8334972cc8b4a13f8f65fc8cb9d7f27450689a8daba72b3b -349: 98b4e3352af24ad6d1ba2e7a1eeae59f701e84c2504f48190c11377f75c6ac85 -350: 395301bd43b6315b7cd19335d054fc18648c41c24e4fe54a87c4629830f1e6b5 -351: b496a8803825e94563c1762af845668689af8264d265fe96628cf5ae90774ef4 -352: bc4ecb58601d15e4e96551409d1ae3479a4b62488c2d961ac29a0f16b18f02ff -353: 93c5010dfef6a15683ec0aa217dc00466bf65125374490fba0c05e2d81c0a22a -354: ed4a34ae546505e877a978f68ad58c78b08ce2e084e1646fe7fa25a264927cc6 -355: 6578751c4580b094eb245261b9e4709d001f228d384ed46c5b9a98b9fcbea42e -356: bb36bef38c0667095696efe5779f0ed5855aa5c80130f3d834cccb3b5ee2fcdc -357: ee401de8e74d5327eff5dc94022aadf9b18f203d1a08d1587fbbda1682d41444 -358: 4ca535c0625c02ffdfbc178b70a5d934c1a66b0c8782195184a02b860f119029 -359: a45b2b54514720695a603bb0fbff2bfc04780c97308212244f57ba7e45e3aa56 -360: 56872cd98fa9000f92148d6ec19c31e59e71766e342031a6972be4a453b2d47b -361: 273937ef97b43b3017f0f38746bf4a2e6f53abe57b8b8494e74976026d42a241 -362: 637a19b146aef1d1084f07f0f9832dee7b9ee4e27d803bbd709467aa2ce303f9 -363: 7340af34abc3a6a30a14d0ac2648bead4cf4dcab4f252874f95b5dc121320998 -364: 11e11820eb3b42a6a97b7eacaddb3fc01d7731a22de37f6f379b2e3c91a3835e -365: 9c9783c63124a6913f338194a0605952ccea0543bb5573bae70f440dbcc80928 -366: bd2e7f67123d49ec4d8e529fc3714f4b7a0b1fb1a8bbcd6026f53b9a087ef946 -367: 89888854c22789bb35942321ea458dae0dcce3aa10db62df538cc8d3f5998206 -368: faaec2e73a456fe3150d2be01dd10bb99437e801b4f4984ddf4d26d33caed5df -369: be3626c4c9ab11b5e038c036874d5d99375491124bdbeb3c4027b29e4af1c5dc -370: 022ac8a6d2f09db3edd2dc5b92bfb8cbe893f83c2a48b16179868b891021ee58 -371: 0ae40bd4ee211d6f9f9322e7811d80aab3bd81c17191ba32454b3c9092854cc4 -372: a3b9af71edf59a632d02f4819f4b73fd32301d36f3ac7934659338a70424c0b4 -373: a2088bc52680e9a605a2919112a655058039dca5db6d3a4ad28f0308f82a7b1f -374: 9b69873872d2a1d90c3cf402b43ace8b5a7a37b02983a208167e865f51feaea8 -375: b022041c3132842a4bb6f1efb8e75fd2c48abc0352a40538fde82572bd8b4c6e -376: 79b15cbf5b8e0dfc79de050e4b307b1dd7d0a4cc6949118b1e7297c326bf4505 -377: 03332d4b5ac755b4918c7f9073f877cc1b9af8e97d800dc45abb4a99311f7bdb -378: 4bdf53be72410131df3d1294b5c3ed9ef166900ffc56474452cab8a16a42f65f -379: ca9801e8fe29a1743c4fe59ee889c266ce276e339956341d94c40ed64e2cde7c -380: 51e0280d03118a04c067353eefba23faed845e2f8aa77c114e8f7ce9cdd76ce8 -381: 92cd4b7886ea31b185290bfdf704bae8154b2035961511e98fdba5d107a270f6 -382: bec0c70454a64f9d37e0b6ab2799577b7f98557a1b64871235a3bfd39d89556f -383: 00162012a6c2f2b07d88e02d9096fbce28672e1a49ba27c9b743c0cf3be84445 -384: 7348acf111fe5513ab119295407bbcdfc6ff24d8810ba258c949154b2e9d1a0f -385: 2bbf687ce7569408c515117fec126ae3ea11af47dd8a5e80c1d45ead997cfb2f -386: a993b3a196f19459dffb4c77a1dbe0f2084c02553fd8b4e8d5540705bd50e1c2 -387: 26f84446687ae90c1813fa49721257e7fd8938bf303dbd72cfb4e32cdbd58701 -388: f467a901838d0f18b1ff23b4b92a8eb47d1087973a942f160f3657ae8c25e82f -389: 67aee2303ae947f1c3cb06e7bd76640be6e007dc21ed674e82c56a2fb6182e37 -390: 36eacf8ab85aea33a2d0cdd5716aefa875da36d05e765fff91bb5c70c7fedfa1 -391: 2efed6f5c3303799203b563781fe7e8dd10e5153ffff7f40c7eb71380a11781d -392: 33fc4ac404c554b242bc6a95c32d4a780ee9244729a5787009d6f776b8e98397 -393: 0e6a680ec399b877f374581475656c2498393025aede5857a3ae508ea8885da7 -394: a5e064a448b5ad1562b05f17e73af343045c89836ca15fa03936f2cd23f7fb8a -395: 5a22f1f5098d4594311fb19e225c848602e7880579356f183ca882aad3eddea3 -396: 1129d0a75803362dbc3b9d3d678fcef29880a5c5673937abe2f0ef71ef83083e -397: b8e2c3aea667c4d139a7adee2e29b0ef4ab85157d97d3a593deef208dfa5850d -398: 77dda75715d6a77138f0b4c95c8f374b6cc9cde0661d111bbd7293dd0add6e45 -399: 4d9199d53858bd285e824099364cd360e55358bab92f6e699032d7597c78127f -400: ce5296b7199d32ea2668de4f0e12b522de695890d491b69a46fbd3b19443a5ef -401: d953f34abc2cf734b1de72bcd5fdb9e34b3790c5539939dbd0c580578cd4993d -402: d11987f38e5d5bbe655f2c1f0693f106bdcf39794bba6b8318ea575f8bf0231f -403: fa1995a87664b4a1335b18f635e132113d802bcf3bfaa983844e4be9aa48302a -404: 94d26f5751646b41f46cf71187773ed3c3fa5a059956c377be54d6e198fe7f55 -405: 73621384cef28085fcf9579dd4b08a9c60c6c6693de75276d77178242b31e9da -406: d18256c03fe2200e7fde200cee7e5e68b31fabb35ea4aa674f1480f0c70f40ad -407: 228cb345ac19bde898f5d1bc0c1606c20a4b378d39c45f048f2ae641765eb3f3 -408: 127b0845056b41d6ab032c78a13878dcd7f54d363918738f107b4449ccd58462 -409: 478b6381cec4715437db2bd003710a92e5e3355cb5e01a92d4eff6095d2fa3bb -410: 2875c4e4a1c27d09af73fce7b0c8e9f0a798ad157b10b92c36f696f2312d52f5 -411: db0a692d081a97a3d3bd3e525109c1bb5e5f43654c538dd155e98a433d8118a4 -412: 5225f5acaadeefb94ef492e502474d900efc6bcea98579d120bc59c7377448aa -413: 27858430af45f95e7dfe8857d9f09e663577b2b858057eb531c8698afbf75209 -414: caf13396952df2bb16c10d62c34df43c4c422be52fe963401bacbcd8b3fd9720 -415: 7c9d95826ee3ce61e664940568a0066e9cf2665025f9d085eff982292ba42fff -416: 0d2f401f6deef04e52f09d18991981dc4e4a410e14bef6e4d0952c14d4bc791d -417: 5fb3672a06e111c544223114a982f4993cd0a0ae2f8f20c736ea622f9a592f3a -418: a143850d422c27cb425db67106caa1546436e843bbf6c7c5ca98c7d8b26500ed -419: 3a7d55b86405bc716dd23033ade4b475b1e16eda03737ed8d54783ae48e33842 -420: 24d02ba759abcf03263bf74b4149e277de035c9970170aee0cca3db4c3af0181 -421: c88f29372fbd0f25ef8f22d73d2c1a011c2108e43bff19231bda4ecb0aa870cc -422: f13f8c6793b9fd9dbaff1f6e7ceb6adcbb29df48412dff67855c37ab4d2ea7cd -423: ac2ebe0fefd24d17b128950992a8447d3d72e96d9991aa28cf949586d4aedcca -424: 51ce61394aeaf246871690a4c3f9e1611efe3db47689add4f6553ac44c50aac8 -425: b51cd46dffcd7a50fd1bed06d63277dbfb49a9dc52d130d2fb48cf763d090eb1 -426: 8cbada55be3ceeb7ff10a3a86cbcdf93cec431bda81cbadb17c35889517f6aae -427: 271ec5f0f337031bf4da8dffe63665d21a1445076eba7fe6347e01130724c2aa -428: 4e6b0226f4537cf206076359b05c5e848c278ebee902d761fba857852a94dcd4 -429: 26b02334cc3f7063cf3c98509be21fb05380a1c5b5415c551374ad541b25b73d -430: 855ec2729210f95045ebc4ec2ffb251aaedc552cb84b2525a111f09110a21957 -431: c492ebc57c483a2e9b696db4b20a7d06246ddf8eea54e374d6692f1557528c06 -432: 82dd34db76d8eac6badba158292cf14249f78c39e27219aa8438ff147d6c3686 -433: f71d583756b28252c751cc4f86b96ac2b24fd3edcd87c89920fb7cabd84babac -434: 0c00bc0ff60cf805bf9f92df1780f5966610f24352cd533a2988dab8d59f4dd6 -435: 52d23dc9cd06ac01737352ddcf5240e911361c21403b997b417476079db87454 -436: ec9c3e840bb9068563e655fc0115b5f2320ac1e26e91bf6af4d92512b1191a99 -437: 796fd5cea33f547b238d9c191248348e034ed06f008cf8b4bafc428a52ba9d04 -438: 400aed2a17301c211f09c92449841d9bc11246db124d6f1f1c584c0589116434 -439: f4c457c53d3ab63c03f3ccc4a18a9e45682a9dbd7dacc809fbfd20a2a7e95bec -440: 3c24b2f357d6ad70a76da8629813ebcf1a82b5dff8e73f4903709fb4214f5ae6 -441: cd1328d67eef562365c873d1cb56eefecfe886e6e6197f98273ec2b2d642168e -442: e36b514415523ce85e7c285edd862b158e60e5eb47b45d4b3c907a9cab4e6015 -443: 0cb9c2d05d74b1acc77eb6c71e8dd69d2b2788ff3e1d40e214694abd1521121e -444: 49d7ad342aa3876e558622dd03938a6aac258784ff02d1c474ee3ddabca6bb46 -445: 15341339c524f870272f562886acb9e8237330a29f89038e61066182d927fce9 -446: 02488037fc6e3b89cf003af6f4ec63ed4203384266c064a7992e0c05a4bdf14a -447: 2dad5437171fa3401711b6fa7b4774ef6c5ad2a8070abeb6229e658ab3bc04b3 -448: 2b93fdb14add3c52d2519a2fecdc906893ae77ca2756ae6290a62af5ba0330ca -449: 08627f60d00e95c42b53bdd5eb8d08b9360fc1795191525cb5f9ca9dacdf4dab -450: 76f89b17a70f96f2fbb35119211f070fc6e5d71bf75c2b60596d6ae277ddde9f -451: 4e2319c28de62374e7e20f639ed19df7dd0208b6fa729385d8a97b7ec0085179 -452: ecf6bb771055ffd58c77062f15611853f496708608065ac61036d7e01f50ba4e -453: 6815c2382af401c3f5b65fdee1270d065bd53c38eda08985fa4699b02c975095 -454: 397db724108990d5a402ddacc938debcaf8b3f9b467dd76110a0dc146b451042 -455: ff534e92474626cfe49c76261d074cbc93c442f9729f6052119bc2c97ec27f0a -456: 78e86805f8b263632bbd8fb30f3ae913fe5b71241ba701665b7fd73a9087d9ed -457: a8badf35f8fd4168f41779aaf5db3b51a01952b731ccf0ab04d65924905ae4a6 -458: 188a69be9bd313c3abf0d2c9f86654cf1e56add4189cc9413456a51947b421a6 -459: 8af25821481a3fa7137e3d957c64a97d0204f9861bf6a8701fafb20dc4baef6e -460: 6a8a04c755de9c6044fe243e31b45a3d5963f22c5323be74eb04965ed419aa54 -461: a817f1b7b748b0236c255df87d31be1dcb5b4499992de7d9b9ae0d259ae91e48 -462: b7290cba8e24e6b9ff81fb5b914dcb248a58bea9b021ac625a7c9f29c8a3ad8b -463: d2e4f2a835d2ea8e382099975ddd354bb129019f61b9d56326386f5ffbe0c2b2 -464: 54db5f0f6e4746652405abed569c91282193261669c7daa31e8e649f3522a79f -465: 50cb4b5862df24e4065c94c71b27606a3f811361ddbaa2664aa7c88dad151173 -466: cadf8e317c0dd6c53d36b99f832a30ae150a32c1d9e2a95e0dbe9219fee60e83 -467: 29196500ec6a1375916b0147c353b8a4921aae592f51fb7b492c3526c2b75139 -468: 7766b257b8e202072cc2d65999388f60f55b30517646b258bb5075845fc7e4c5 -469: 211a46ca3d1280a830bfe997fcd7fa606f56547fdad9a2141e87b67af443495a -470: 18e523ef28da5d53433aac9491ee418c7785e82ba8b84c9bf091ab25a709ed10 -471: ca746cb23c094d3add9a0ac70cc966656563bee80fdb1cd9d729a69da2f1ba34 -472: 87b9a1347f0e33ddfcb4f618a3701d59b57d6394d439474bb7016d427fbe276e -473: 22bc2c81b6f94c84ab0fb79b3a7b2684ab7e8251caa08be6b8701aaab24ca5d8 -474: 5d10fcb4b8ac2461185f5417f5902b4c000cfc73acaff798d8521c77456f51bf -475: 8141b5641ebc92599e3f5a7e14546eb15d2fa8a791946bf0a84657a346525cd1 -476: bc82d29fffb497b8c2a9fbcd2e95b85fba93cf985cdb56461e59b69ffebb7f22 -477: 0a57dbe66466333ec1d7ebdfb6100a903697c45b99e0ac3f4a659ab368ae1a85 -478: 51ce84d63b52a81becf17ed59ae68be2ebd629729d5d4d5a2f1583d744bd2a88 -479: 48aa59c51a05b0a5e61ecd89c2bc8eac6c10d05417ec000cd7580ff52b4e81f6 -480: 16f73e3ade83ed3c9ef33e3c0c01a5686b33a05fe1b18308e823bc2e504136af -481: edb9856e42e585fb13ed96b367364f98abe4de71e2e423d8fe7c6de5be223345 -482: fcc764222c981a04504bbd3c32bc7727600b5c1f9b386e22a226a668dbda0c87 -483: 1981e5927b9fd162ab0bbb5a365b9ed8e247724334fc59ad28e394a6c4be899c -484: 90cbee09dd7935d6837b9a1b67f9405452603ba5b228bf7a8549a2abc78fd255 -485: e504621151f680b6086984a4ee2d15857da704a659974af5ef93be2d1a9c356b -486: 203bc8fa7a5c11b2eef3e268df252033193381dc8258ede81e88143ef23a8b5f -487: afe30eff8e40220ca4e024fa0b94a46fcc42c0cb55df68471665b27732a60a59 -488: 48fee4b0bdb44c09ff517e0bafbc35c7b825379d3ae21924ef0a44433b6a0447 -489: 276c7d526581af81956eb0e247e55925c069a843ff139bc2ec057b5b2293b689 -490: d238303b4abec814253fcef18081a517c4ef3608cbe6a4101edc61c7c70055e5 -491: 84a409eaa8a75a5c91c97b3969d0987dd9034901c960ed9cba49994f0bd8372c -492: 03e947ec08b722db55035664aa0342bbfa6758bc164914365775dab315bc4fd2 -493: c23338219a7fabf5220ee25cd9f033ce9061d7d5bcde28f9b0110a8d43b3ebbb -494: 092bb0db220936de15bd23e6aa1129c52c6b7033e6f801f7dd052bee713456be -495: 5c6f720499c979727710b23ef59996f4cb44e39a95aad30e1e395f05722dd749 -496: e6f72d91a5b12e3740837467c1f577e4893965d0bcb1d5b56dd2488a273ae016 -497: 1d8466d5bc2c57f3d39b4aa8fed21acbdeee64edad2f0b62de769b4e0822edf3 -498: 9f5ded99162815de77cc21dfbbf69a3f96e9a7b6b2c86f50b1c511dba25360ea -499: 3b9fedbcb2d3e8a6a4bcca281e409e1dba4dd05adc2623390f68956711cb9c3a -500: 7d1b86dee381d8053344099d321854dec6d1ac7e7b7d63e587211a3c23f4e72b -501: 4695651d56ec6ffbd43e3b8639f1b417806d9fc8af1ef6ed8d08e644686c817d -502: c48d004fb14c505ce06d9f421ce0d35656c448d631515f8652ce931c1d4f8eb0 -503: ec475e34472eb053e407782d27b173ef82c06d3088270b7da089f7c7e2cf493c -504: e5ba57405abcc5d8e5b79013f8325915fd0cfa08a59f3860b83460080c3e70c7 -505: 94f3e311302ed65044838b6dc97d51b414b5e7949ee23520a9052c21d486688f -506: 33b34f47628081709b85af96e54f4a94c882d06efffd34ff5a5169b5751f1af3 -507: 8c02a790b27b4d6e792db8951dc9b0f1f48c0e1338efbedac92e485a9c6e3df3 -508: 6a52e76d0066a0b76789b0210d26d8812f06f7c8d7d0a968d901cc16800bfcb7 -509: 2fad4c278b249feb6bc654c7f80bf6c7c084457980ea4a95b8479088dc3ee562 -510: da0583e7b44f358b26a83db200c8793f60164347410f108951816718d55b040a -511: de11abe66ba38bc11b0439129fb6ceaf39948b27cafa3275890cb05f2a805f65 -512: d2dcc2993839741afe2de012f94b03681fe5549ded0ee3316e48b7597359dc69 -513: d88520e62209cc1fde3c9b16ec40ddcba1b57f06bf9a5146dc9014ec446e6f29 -514: 242514918e564473ca0d96285b7ec23bb5e106b86977ee72cc5fd49bafc2ae59 -515: cffc937d5057e24f8365f89ae7b2b6afa8c8bf6ded43774342756572f2a8120b -516: 05c1ae4da63b088c7a6446c94506469f83f78dd9fdccf0ffc554a0234bee96a9 -517: 6b837bbe45a0392499efcb1fa9d0a183fa265f259a0913a685fbb6fbabd9cfd0 -518: 0233c64a15db203e102e92b949ff8f5687f122b73a6098d873995d3a69f3afe8 -519: de996204b8668ea35758f4a434a82738d2e4df397d56d5e44edbf75562967d9c -520: 5847a852cde88f947554f4ec2e0f8df4276ea4ce28431dab17b849e820069163 -521: 434b92148bbff5d2286e0e80eaa0c4a3eb53c7a666ba23777e7bc458a3201ac0 -522: da5a927529243cee03f6c1398e41447ef5bdebbf61cc25817c688005d45b0cb3 -523: d838b16255c39410f535eded20ae4a2a14ed4196bbdc272c4ba13de25217329d -524: f46cee99cccb920d7c9567e571c793ac3020adf9502302faeca2c0dddf1f08e4 -525: 1e5c71266cc073d99f10093786d1d141770cfcd510431870662fa857dbaf6a5c -526: 602ea3fcd4d90de7a8b5dfcf65a61d53328f2edadbbbf14c62b2a6f9c3213a5c -527: ff707c27b1d462f2cbd191f8555d2bb197a24480ff61efd0ce99b521878afc6f -528: c47995d2a690c25de33d55754d77ba8da2e841a86abd46197db2f5863524c78e -529: 89b542b5508c1821a670a2745fef3b56b7e9a0f8aeb2f8bb2149e90c75e2139a -530: d5b89eaac746528526cef9f99a3bfbabf9ce9b6ff604c1971974c8d27442981b -531: c9cdfc6cc2de550a33ce68f4848b4c619f0b425b699f2a2b76d2db475f6f7573 -532: 9600f94b77994e18c362504cc144643e90419eae3f468d3ab4e390e429d0d5b2 -533: 7ce9cb9bf84b35a763110b7f66e0be7a271371a78a5376712c19447534451db7 -534: e9a8b50d03e1972741424c2c16b37166fd2d8b6fa17d6de9a0ea6d5b500adcf4 -535: af46270f70661306342e4d96df5f73c51be87a7cc9208e31356129d2d255a9ec -536: 0b84feddb3d62c3515b4e0a082f485313a7583d1e69d28f5b56928b177bde02d -537: b78ab7ef9a782179abb877115e70e9ae8a4df5a2532bc6d70a49137524d18c0f -538: 0eee1d4fe4ba096f194d4bfa30bcaa12cd5c5010b42c81997034a8ad71de5738 -539: 1d750f1fd643cc8cd360ac7ae41292051c7aedfff4ded6b61566739aa90890c3 -540: 38feb94cbbb3637ac27d561b97274ce8340d9f49617cefee8884ed94de6ac579 -541: 67d18d9524de82f3cb9048127d4c429f9d4b33ad3a9aa99ce86e34bbddf81488 -542: 24dba4f062cce959ebcf758e3be0363905a80b191835bf4333e5c572c085ecb5 -543: a0945db8081383cfed2d66fb9f79774a953ffc9dd6990548da55c90b800077c9 -544: fcf77a9d1f6c84048163f9f1ba21eedbef74dc62c12505a23934b8637758fc0b -545: 6768ee1dfc4d9aec0fbcabd35ec91642bab1782d5b5512fd1e41bced92cee73d -546: ca536e3396347e0495b021e2e84003985d9304360c1505e0031f6c1e5b6e74ee -547: 6dde51e539def3bea08bec0d63d740dd61b66fd16f64296609db33103d76b7b1 -548: 28f4238ed0a8e8eeb50b1b49bb0017a5cce0b2f42816caba49464096d602b8a1 -549: 173c9fdeabdf4be0e5b8dbd4784cbc808e093750e2397388cff3c5979d875ff4 -550: 99a27a37ac53b36ddec9cc432b16d44f596d7173184d0bbdf1547a4e04e3a1ce -551: 86413f744576d0260415fac0247dbd61a3867fd329004217a9141f2b0e5bd2e4 -552: f2f8c905ecd61ae2aa8de239c64fbd7b5f0c847ab18e56177d76240a626008c5 -553: 862936291eebe5ecccb4b213d74c9a7f022772fe1add00f7af5ac4ff6223e346 -554: 0c47fb1f36affdec39eedc88fe9bc3afe65f910047fe9677583d109837da43c8 -555: f7cc0f262bdaa131c9b582d8ba3543f4de14e069eb8453b9c6435900b2628b6c -556: b5231f7d4bcecc3cac63cb530c6ae7ea7560f0c27e41557b6ac1146a2c1eb568 -557: e8599934318acdd2ef5e7fc634960d76700c92d313dda306c2cb17515a327c3f -558: dbd646fd923cfc9b10ae498511d6f131ee8c985060590b06ae3678fb8b46b5c8 -559: 6d52ecb66f21882690258d77f9382c35540363077fd6086fbe4682a84eea11bb -560: 07d78a6e3ea3c7f98de73559adb9e489cae8af8607a1fb3d79abc150f553319e -561: 4953e8f819a2add9b23853b06bb97e26c7fc49acd8cc1e0b4684a5d766f35a53 -562: 781b2f97f00f73debc515a175ba66083069d9f1506b4d6232acfab6a0a3ba939 -563: fe3ea15a76ef7006d987d06dca3e0f25ec94f0a25fcf3b0ef7240e3d6c47bd2c -564: 7ee11817f2ca5f9a6b0d7372849ce31baa3269e1b1780c5f1e0d80716c357088 -565: fe2da2c4071d83642a5720718e49aa5a44a5bcba7e8f8935f4021e0955436a5a -566: ae74a9faea147eca57ca27b6e735eb1aa8ece530448730c99871a39075870131 -567: e3464d5fbea3f20e2b73f63be61c455ca0a518f989b9d18ada7b790dbdc63fb7 -568: 6b48f7b2989583e8718603b3a62836a99ea5b37853d7bca7b70d52efedf02d73 -569: d460ef41f4932d9f4b1cd07da8f935b6fdecb23ff8b269c80e86bc7525c6f72f -570: 64ae878a73ff936644eeaef0338138b29e0a3708bf4e99cbbc654b94c4f172ff -571: 1a4965900231ba33d6d2a629c4eea67599342d97f9b0d859ffda8892f51d0fe5 -572: 105af97fddd8f0915dda627d3c122c7866b541d6a39f5ad8a77fa648c222ee68 -573: 79502abc9bd09ad2f2a3e454d348723a6ba623fccf95025ac9feb0f9de4db246 -574: 558fa2ea8d21782f73c50ce20441385feab4e386afa3359fd035921161dab934 -575: d8446ce7590ed28036768d268431115d1c8118bee49c74bf6f1181611acdee49 -576: 9b4a90d2d7654e229dc2035300ea60a901c7bd96649bc8d5aca1a738baed038b -577: 798270bd135c927db2e94714661d36600c8d66ca3060acdc991bf42d918c079f -578: d7120b2db88536e9934d96390ed9ef1eb11ce428d0b2b1bec41c8b1fbe51110e -579: e001c6c8468fc9caa9c0e42a731356aef769913b105945c498efa8c95718b06b -580: 0f62ec1075014e7e869cc697c5670bcd4a669c979a8cc1dcaa38e41ce67e296c -581: e5ac3f8d559a392edbd7d6ac10a89f2f09808f9eb9c720189040dbb0f87a7b60 -582: 64e2b58930dd78a546bc5b7e55f65cf44595435397f5253401d3a31e0c30b317 -583: 263373377014da213a97247cf6506808d90e15e1af57d5c13d8d53566b5a5461 -584: 9aa6715383e79f4a1ee8b8cc86f128dd84a4982d3c5a6f156b31e4472737c83c -585: 1925d844b25759a842c33263f155d29878b36fde630777ae0a97e2fe85cc00fa -586: e9e11491a037153d2fd0853c8eb489a6bf5fdd97c951c2b3bad7807a12f2bbd9 -587: 3d2e8b0160b56435c74603ff172092ff34ec4f82e614cc4c445e162ea9e07ab6 -588: e99ffd1b1a61b6004364dbe66570f205dd74e60843cbd9e43dca8dbfca625fe3 -589: 629630ff8906d7c13cf9ff64a0b427ddf9e8941647d8efa200b38565f80e45f8 -590: ae56197bcc4790e52ad8636450e7a9c6011cc1b1b6571ffb5922662935ad5e8f -591: b4f2c342260a8b77d6a4afaa9fae0421bcfb16256d45ebaa80f658a3270b93c7 -592: 06b84e9eaa313e7381f3a25a3b2ee71a0e058af2dbada33c08efdbeeb6a4fe1b -593: 9d45e4b82e1f0eb022ecc8dda15b45e0e23964671eafcd7786f44de42a53534e -594: 6ca41d669a06431c20f359eb53a00e8e40bff623502c06975a53df2c24ad2740 -595: 09987c84090b121bb669491451fd36981e35059a315bb3510b2910e5cea7b703 -596: dbd7606eaf66ce092f8df17a864e7e58a82950c0aa4f59a2163e2e0b98e05966 -597: f408448625e8639af09d36d1b0b4a8475223dfe23d9b13c344f6efa9b0d79b55 -598: 67fd26f76aa8fde40ea32742e9564f318e4d30393c8c8b3efc1874d361a0c677 -599: ca232d6b3a3cc9555eab03a3023cf6957a95cfa1d7675db8ca191c5b31cae03a -600: ecdc0f7a4ccecee888019378fe1111b23e4906da170fd1e3cd9ea1593f941cd6 -601: a2c19a29adae2d8a541915b310c566d55ea29cc7e3ac91f7fd3a88cce40c39a6 -602: bd042cabea0461654574055fcb4214f45dc5f7cc1d8aa821e259267d86eb8c52 -603: 69e0e38d26d191529a5b11f19ae3c78c8909855b6bb31660b5af80ddba964ef9 -604: 7bf4908e45ca86a3fb79c7e6a09f604ccc9c557974483aeb5b8f473e0c3f0a38 -605: 0ebdfc4dbca222ec3f4209d36e6235a433c2ec5f064592ad2724107ab6d2abb3 -606: f60e345855d5d683c432900a9a233fe853b812f6bd8446601bf8d410c3e67c36 -607: e4d5c7bf1ca47fcd5179833beb7a8489e910fbe93ecbc34a7c912c358b45bb33 -608: f9f127ddb0330d7588f3711a22d9372763b4661c63db217e1561c3b6ae45ad14 -609: f0822a7a0511193fd6f5a29ed39d8e8f737225fe3e7d8d90c704a032290ed1df -610: e07fb2450d06ac2305eb3fefb4b16b6eb3996bf91f98df58ab4af7bf4b24a5c7 -611: e6b0afff326f7f36b65b095072a19b0e104cca0dbf27529a7f39a0acefe8b3a5 -612: 30bbf45da7bd0d24f706803eabbbebbf78fc67f98e0af4d68524025be2de183b -613: 9446910610590058b8b7a5079920d545e633b7b7a98a114303ce332e34e1ea31 -614: 7a11ad209cdfd258c5be5247c594103ace97affeb5adb140b3bf4b9a164ab4ae -615: 561775fa45d789a4912019093df2cea17402a556110038b90fe8901d3ab910f2 -616: c40d48d0551a2fa949c0c19751b3ae0027ee1169ad96e9dec2bcd06c6f43bc0b -617: 675519f03c8208cce08fa91f718484864504085354356790c058ab9aab3009b2 -618: 8dc12b12cd525177c298c4c925748af02ebf14b8dc5feaee4bfb75c1218bdb9d -619: 62cb61ef8ecc400740115f39bbfd492232761effd72f67f2edf7a4943802b7ae -620: 6935a0079903436cefe716a592752a3941c38c6fc81a52b70c0d79213d157583 -621: 42e01b526623a41ec90659f1f3e7566c07254e21e5c3c4d8ec5d63d99a3905a2 -622: 8e0d64ed83799c1081e5eef417e3a8bf0e7b33f7c3458896e568cedca96f4b68 -623: 16854b1163fba8b8d5328637af0d7834b62318e11271f482bf3b31309bf9c89c -624: 8cfe1d643d67031da6ab55fa27e2017915466c5775822ac29bb303bb18f61830 -625: 1dc6034d71d1f5f1459607c478ea4aabd826e50c59d891a8cf36f6304053b478 -626: 2aaac5bcf9d5587a16a51d1ed47ff084105174d6b5f2ddbf2cfeef6664728970 -627: 61508285a773bab75cebfcfe19372867f10f80195fd58f4e4b829f857d769aa0 -628: cd700b9475056cf381f9dd6ef52afcd9868aac09d0c1849255096cd698851b5b -629: 9d74cf92c621a9cd48e4e658f4a01d2c9b245cfb616bca6247e0091e7533a705 -630: 6243a40194637f3bd50e96d703b8f5c7a4f60ed7b71da7051b7abe4d1155b229 -631: 06fa690518c85c3aaecb3ebbf5fb049deeb95354789354e77f0e87f714589f09 -632: 5f359792b9fc023075e078126bafb2630c07c55cac746cec7b24dd52b55e5493 -633: 7ca64000ea0cabc0bc80372a13fc49e3e19372072378561d69ecaa716cc32cac -634: 973cdfc51bee2d6e46eff4ba47f2f8dad5edbd278256a98383f3416ee1ece09a -635: a906682cd85185924191c3873491a18b134f371b3de306946e485cf2e58c04a9 -636: ac11e1fa3e0f28955fac401f434d384a6490c7b4309aab903d6fedde86ff044f -637: e95a1d5e94da3939a9ea1853ca677b7b4524636ba85ba6ddb3889337fb6731f1 -638: f91877dd03a80fafde2c3a39eeda2ecb4a12ad8e308b6a1df6a182580bcdba9a -639: fdcfd665e5ec4e69f48a8cade948e319b79388d3f2ff21d99d4f96b5c07e2459 -640: 3c65738454971b3a3f7df085a917c24243776ccc968e2ef2428f59e9a0519188 -641: 13c90cb776f1531391b36f927bbb760e29dce4384a42f6b071c22df66d06568e -642: 9beea97e1746d96db9347e330df0e92b5e05efe2c72f5b0a0f6e621d39fd450d -643: e3ec99168ea8353837cfea97f45c3cf297805d1cd3cb46ab54bbb35d0e82e828 -644: 1844c799ba1b7f308969f30f2e597974cdac7cb4ab8c027f82c67b7bf09db7ff -645: 40eb7652ace2dd1ba383972f70cfc3eed35bc85260cdbb001cc0e151f7edfff4 -646: ce4167189ca6c39a025e4a749ae0fa726406a71d6a0c4b10f266cfa6a9d34ccb -647: aff90a63a4a5e46e58d9fb16d33f06f8fdc15a73c7c690dd02e7a9f4576dadcc -648: d842bdf7ea299274d3bb91fc362e4dd4f3c28237e9d621e0f97488afa9a02369 -649: 18601f93b8240474442b832cf1aafd541b32fc47cd024bc626fcc850fddeeb55 -650: dacdbf42cb89fceb79d1d8bf8c583bc127c42e22c7fdb7fcc38ddcae39b1f62a -651: 7cb09fd65dea49174aad61b0cdc7c53e2b4d755816e1137c52ef721ec1b19169 -652: 8be09d653c065e39f84ba4312ff40abc6ada795ece77880a45579407c9bfdd01 -653: 41cdbfc8df373987d7a4645cabdb323ef92eb2e149b95b1cb389352686948c5f -654: 54dff6778bb9a8737f1eaea2247731d70620b74d4d2bedcc492a9768cdbc1e06 -655: 1ef22db51009e59fca54a417c071def94551ecaff885ce191179f2bc486565fd -656: 217294d1818c40457dae5f3a19368972c7375dbd4b1208c62f024a31ce3887f9 -657: e0d0f7c5f46849f29808d598cb9b08fb2517fb38d29a4ab1da969d956b1edafa -658: b3604457af6e43b8719e214620a6ce14f8c22c60a608381275e5b376ffeeff84 -659: 21e6ec5256747ee8ed0e1e4f6d461f8e72e5421598460c0923984e310eb5b3a4 -660: ed4acf4aba6c1f3a7dae1f27c14f298a7966c444e8c70b6ce1ce0c0b6daf2a41 -661: 0547af4c292895a4c18d6be5b2ac9f862f363a36bbfd52d46adb490175fb55ec -662: 3f08179b52d97e7372de73ddb39cd16211d212b0bc2c1790094b33781283e1be -663: 37ad8e73e6a01fd8bb930cb3fd00d43692d8c83d37b4ce6602ee531b282c0075 -664: 81b8b053eae44bab64dfc2074c706d52c748d75cd6231029e9f88e08dd670272 -665: 91e1f3207d4b0f56cfe64aa422c06a4245d701529df5d55ab419d5a51e0cf122 -666: 55bba2503739c92878cde322151f1858972c3ad0cf96c0eac0cd7d6c3b9e4077 -667: 1882000b8a909763214eb3116e4246c9ec71207a3c306d7fb6ee3ab82de42ab2 -668: 4c884909e219886a50d8100a12bcfb356091076fd6f144fd35b6854307d465e2 -669: 8c0aa56a953a170a3ff4ce778e7390362516837dc29bdfcb801a13f45463042b -670: 25bddc5907720ab48ae5b6ea70fbb97a387b1cd5d2a3b6786b15270283f2dfa8 -671: 872d1272dffc2f9ab8742a08a8ba2d38e49a5a6fca74ea6e6e60331ecbe39137 -672: 25755f0de23d9e58811332e75584370259973c264b7028e9f68bffb0d073e52c -673: 0b96eb45fb17a8a80aa73a0e7500e038232dce2269f9abf2add880fc4e2dd081 -674: 085954a53c62269bdc9d78c7c45ca58f5c0220f224c7cdd8b7bae4b6d0fd5fe7 -675: 670051db6c0fb0f947f5d7a11d6bcca2f73901b7b05662cb238cf04ba0d9e556 -676: f8f7c37e0beb0b45654e7f2f03e5a36b86144e5bfef8c580e1d12e6116cb62de -677: d657facc720b596aa8b5965df5e38ef9106e0db6bfb6846e4d9a8ed8900bb8a2 -678: f501202de6e6a53bc96325600a0895f830ee20f4b03d81f98af56fcdf7605f96 -679: 558f0c67d147748bdc5472f4be0584dad452cff1ce1822f4f1ae2355020ff9aa -680: 09096d4a259c1c60bbcd25563301520fc5707106fedd30aa757f8790bab07d25 -681: 5ae02477e97e3f282a912fdcfedbedc45b6f48db463bf1a00e6208cf3a8bab6f -682: c2ae4a0b03e6bde0f10f82cb3b74fadd3952ebf9dcf8eabb3f24b2f4e3e2b0c6 -683: 14af46432e8204cb27f1f37d12605f72d483aaa58164e16a9a0318bc6da38abb -684: 9798e1db236fff527fea4b493d38c7f13200a80c20238dbaac17657d1c8331a9 -685: 6db3cb731b30463f68fd3129da52623d09a8c0913cbdf45c0ee680d062b7b014 -686: 7630c889c0ed3cbf196c307a6b13b5314c35f8e08efbfb85680aa8f56d8b4073 -687: 156cb56203ce9103881c2f173ef69dcd31e374dcfa00844d909246e863c9ebcf -688: a2bbcaabfe54517da51cbfc527f0e5768d6aecd5a6f71c4c70d90ae3054f5518 -689: ec7f5af5f68937aa3bb2e29f89a76c110bed1740ed5cddbb31a4bbd4d8658c3d -690: 7b1e011cc68d027165e019b9e8e070616cfc4009d56d366eaaa4cab247b423ea -691: 6cb2221d41e75df3b985d2647836a26d08f78be70b7d8028555b1b82dd17b175 -692: 7027e565c0e317fb988f6954622a47a6c03e5d6ee9b7f38dad7f8a01ba315887 -693: d329fbd15068a51d3daa23ffa59d8e0d5c2be54535eedd0a249443bf3111059f -694: 058e67814877f19a4d38f3578e63ecc63b450763cceb5f93d6baf6708c6165b4 -695: cab5ae80484fc8573e274316d10e2e6b71d64a5495b451817d59d37fc62cc118 -696: b02002fcae0d4643be5940d223d8d22029fdacd277d153f4833c10fdf502cd77 -697: b245a5c7d95ec8c1cf1cb22dc679847b982d55f3dad6add28ee01b67a6f41fb3 -698: 3f388119f98462ea94fb56e55862e083bd3f859a02e3ef23f25c949cb9b7f5cd -699: c381b56202caa27cfa4e42fec6d238310472bb8e871da0cb47082388de7783ef -700: 0193afd46bb14686ad253297bd7f1083ad6a6940557fceb89461a9aeb6c3d47c -701: dcad33f663c6716db58b5a94edd0b758dcae719b37cac7e6a58db609f9b9667b -702: 551004d18fb394492e86ff7b76c1ca7bf4c83dff5c1ab5535428f217a14cd602 -703: 77bd6a37b0aff970095be63545ca1cf02e28e282240d1ade1e5d080a7c92da12 -704: 902fe8b742e49a4e68af91a8b4c0c78978bdf77855f5af1a010538724194fed9 -705: a1c9180fc41e810a19223ac72f897824ac6d2f59c2ea38cef85917562145ed55 -706: 341d0a96981cbd4347eb91fcccd144f35a7b0967dea0d6c64031b8fcb46b610b -707: e1a629e9a39784a0c28e3dbb2abcbeb83b07680fb17d410d1b8954ed6ea290b5 -708: 0d781c220748957cc95d3153d4b247a2e9ee546278f06e4798bb2151797990c6 -709: 63912204722a1754af57ffa997b549db1ebdf5433c1be42e6af6f9ec482ddd90 -710: 0f61dc240b6fd221221b377f0345a2cff7f13da41d4bd1696c81cff5778f1bec -711: 91ea7c1927cdf2cbb1263650afb35ada8da7d34d98e2686c50962b30b1508ce4 -712: 6e7c14bef3922a5c8a11953512011f61f75509193caf284930a585fff49c870d -713: 99b34c9fd41ebebb6076b75ab3b22da39a9488e4538d6fc016e45727fae8572f -714: b4259f3d957f9561144098aa8b3541731155806ef06b403c2dd4ea4314e19fdc -715: 86e328d35205220f7befd72634d61c329f56a55ffecb247ee83832dd1fe36d63 -716: 6d3386b03689e959ee171e2cc6d3ecf9b250604f34da80387fe1c3b139b6c0ec -717: 039f3c02d3ba2e24ca8a6057272b987e2e55acb88bde7dbf92ad36c49bfc9344 -718: 715e95be267ba0eaecbd230f6942a1eda2d4d8ff36c8b72948a7f721ffeff3bb -719: b4ccb610ffe7c154f7f1d588f597294d2c68c2dd725ec98fe03e71cabc37cdd3 -720: 8bcf65644a63c50a37e09e3cbaa8d771ab92a0d71fef5dd94bb56a001035149a -721: 0993cae164b8e0ce36eb6d4bf7dc652106bb97101a8a7c45ee4dbe929c6052cb -722: f4ddfc20a477bb8fc717d7dc31d195aa4dc55d420af8999d5e40de5084c63834 -723: 4ddccb7c7b7628b354264d7dcfeeddafc1bf51241a20bd8b514852662ffa6e9b -724: e2de5267f2e4cb47946435c2ff943e5d66f7aa9d43497e192ed184cad165517b -725: 9d15b89c15b2db62cbab5119fa15ea4dfc49c1523b10916af61b194ab61488bd -726: 87ee80452ccbe78c55b2a7617c8aee128648f22c4456e42719675cbb7b506af3 -727: 4d5fcb9e907346e305ffc20fb57351f3ae2a43211c4af10dbb1e378b6220b9dd -728: 8129ada76295117f5073c4d5a613d08630d91dfaf2777b13ab99ac4509a1f6d6 -729: 5c5c1f33a4c0ae21c072d8790ea0fcef957db8f4033198c0cf5d0086d158611d -730: c4586915ee3ff4e0547d29a546f03d197d33d9f0bc1aabf2e4c0db19b87afe6a -731: 665fa3786202ed507fb2df7cca87dce2c0be5f4fd125dca54e9132d1c0028acd -732: ace821e7584a41471b2e555a1c96384532211f6709d6301eac0622124684bd48 -733: 08633271be3a0ff80987897d45b2592ba11d3c482acf58b4ca3fba1cd2964582 -734: 1cd99f1dcf7cf5263aa8513e11970c77638d936978836e255f7be3dd3bc749cb -735: ce55387875b7f7eed70163b6fe9a4a07f10595fef4d77d0a572e3ee4917b4d5c -736: 9c5e5dd2f19515e894c42dc959ede7f1a0e818cf6a4289c15f54d25ca60b8f12 -737: df6af50b0b22b3d9253a56ae486cd14622268faafa94a25d34a1d1deb23311de -738: 1c45ff7fa7e20297a74256d37f1c518e3d49c960a847c5a9fbf89e400ad1b289 -739: 13322991f05eaf681a68cbb4978dbf26a12c1230ec91654d9e46169bc06bf181 -740: 7913ce5febf072c698215215b7cb4b180a9256e0ed63d754357899b2468f3134 -741: 46e44f2aab1eb83a979dc3dbbec17208dc26fc377899c2f532b5674da794e784 -742: 6af8e641c124bd85b05ec7278aaf1a8b4db3ab804a7a6216f83c399c334f1152 -743: 9392bfec887e2f83109c3b02d2095ec5822917304eaca799e3c9d261d74018d3 -744: fce4ee633e07834f473aa58e0044394aa1105f82931a2ea5f50118f16e18009b -745: ef14133b9e9f2f00b15ba3c9019fbd27755bd60e25dbea93c271e55337de66c4 -746: 13f95c9e923fc103eda110ec9cdee367d01daa39934f4a98e2fa4c8d508a0690 -747: 2b5910bb1e516298aca88c502c033409abc506e4e40adf84c58f737aa02fff9a -748: 010ea00917ac8f13d0e9d1a699a0b4f970d7a92f5f0676bfaf4734ca6fff1f63 -749: ac22984ca1e9bdecf3a8c81c4f5d8476745c6d44cc4ca3dcaeba6275bea17497 -750: 018910488e6cddc4d3a796f5bb981f456a049b46b5e53fe4dd90e55b54796d4b -751: 2f06445407652ac9e9af69570fa28f06179da64b6f9005f2910da20d1747b568 -752: 17c32324ff9ca42bade9d2da7edfee2b5088dc677c5ea0883b515a327b3e675e -753: 640a7770cc32e92ed3e1412c79495a3128b4928659f1bf7d9ff20e53e3dce174 -754: 7f8faa738137234bff364c457cbdab3b9bb2178b5d59d7b67584765b887ddf47 -755: a1564dd109d9dbb882fd221404b402ca046d268f592ef0db21ceeca9490f1d51 -756: 36dac69112b7c69315b52652f5a013bc6b6d4382e0d9f9681a34691a7af5bd21 -757: 1b8753eb292930ead17fba8755a8c6fd2a2cebc0899bfa0feb2edb91f2783feb -758: ae37c74438422742903ef30ae9c0130e4c860a2f11498082848edf6b15996bcf -759: fdaecaea39e2ec984e8c984d85292303de1e2ec12e0b75ab990bfa7e65a48c88 -760: 78867052f7feaf352e97dda57e7792b883ececc33790e47e761aaaa7f847027c -761: 8c73f0f9603bda755f7fe787d4679a2c15a133d6beb2e2cfca4706e992080e6c -762: 8b3ee45fa3a6cf9edca4576c028c9d28ac281f5bc69df1732e2185704537828d -763: 5736c03e2e08901bdeb740fc2a11697366e4b071e6a611c3e1b0be171dfb0c7e -764: efc3d8a8cfa82ad2b91460268ea2181d7043d9ae429f31cc6bf9dad560e01b88 -765: e48a56496817eea0b94249f00d42eb31b1823c700cfd503223430e5377b0debe -766: 0c0a87e714cbaa1b63d56912232130ff3f96cc91e332e40a471a92fcecba5b81 -767: 9bced3b9012155f5281cd83991fd328e15bb791cd2f9101c515633b1069c21cf -768: 929fef1fb81ef39d6f0bee50792bb01bbba750ed95359dd17349603d5c6c9cdd -769: a0298e71a6bb25d843f0a486c84b8af2dd96273939e9878de824dab5c6d41454 -770: 779c19bab13abc41e9398029b1810f0deefde87aabfd55e909ed0931b72f06f0 -771: 88f1b56d0fdc5f50833214e9a7046a980a84726ec281254e75ffa8ee81b24597 -772: 3a7c8ca4b0715d42df6ed02bdca7a6c28831786c3d997485c6be4297152ed0ee -773: 88a0f337b761e71843f41381e9499cf74bf2978a65e5e4481f663c5fa5929e73 -774: 76d365352800adca62fe521af012b686c0b209535bcc4f8b45cc9e728ebc9575 -775: f008acb3ea6cb87a29aaca44df6822d583fbf70d89c20b91f1310ead0d336780 -776: e18850ada303a7610faae0f4419b8b074077d8b382b3519333d0919b56e11134 -777: 95d3f06b9a095e832e32ea5b045de87de1bb3f1dee7aeb90f1a62fe1d8844c85 -778: fa72e0399e52403464714d857bdcc5ae78525e81d31109539ad9548e177878ba -779: 091c9e6519ad79728660cd1411222b96cd9384926c652e3b4fdd99bbe1b29784 -780: 3cd3d2b232a67cc1ef02be591b4fa891d31b2b87127ba63469751afb6bc38bfe -781: 0111a5800571127692423a0b5e64d2de2d8fca7c8a4f893a3a3efbb9ef73d63f -782: d4182bf05526cd1052f743b4d3084f5497e6d752011ae3beb3c884785f0088dd -783: af9f702f77c413a95c767ed22a1a7af5e1951fa09fb921a0c56728a901f88384 -784: 548e7fbc9ee3abef91e8f5d86b9fa2acd18b4e2b5b5f0b06993b020dfde7af2a -785: 76de3a6f51f1ce104ccd0ccfe9cdf2eddf3236bd237ad61d70e16e728f1f8830 -786: c7505bcaf65afd6fd64fc58ba1d0e7888ef4b1bc3c36de89115938850a9ea89d -787: 9de032b9b6d296a31542bb23b5f6451ad14d3c3d27f2f2af88c35a11c9b25beb -788: 9b59e2d98895c363229b3a13175dde2307f5e45e4de48c7e01fe5dd7a66d516c -789: f2290cd7d56562b49a63fa0a6fa75eb43182193e91eafb6de4d5b3a42114f5ef -790: da15453aea57615a06a92759b6906a3b3bfc65a49483f1b97f953d917170c0f9 -791: 7a6cce29f707485231b40c4d0fd2dc3e162dae1ace62e1ddf7227ee77c14bef8 -792: ba476b2558e6fb94308a78b5549e6572d81d7e2b3ebbb42e2f68e595f300aa2b -793: 827e82561dd5149f139a98ae48464c2e61abd7036c3435a388ae437577b98ea8 -794: 42d6226752a305940a4db24e77869c19e6c153a0b7e4409b254baa0e1bb6aa84 -795: 686e8e9fc0e75c0006f3b36cad1f125713d2c2a07162751d79d7b2c0b8d5129d -796: 22c1978979b722f631d051ccf8b22ae0d74c74c4209a013a253f00945360416b -797: 5405d6b8c0a154856278c54d6a3836b372aa166b0deb3185603a1cad0a940341 -798: 400307d1d50fc6132fe113bb8311243c1da0e6b57c78f9e2d5f7554f4e6df07e -799: dec6deb237e7d009ff60996b96e4e92cb197494f0cf5edb5312e1f60575c015c -800: df9fea12bf11f4d9b595455da7c69921f5dc40a427333fa7748fd66eeb017de3 -801: 2042c501563e32a88f4e2d9ef7e66be27571635b6a831ce41b28bc6c6df0eb52 -802: fb700a0f4398225ef5db5dcd6710f7eff80808d3f815801e14a24a61ebc424ef -803: dca2d9f1ba6568ce572ef1ba1fcae08a372b2f485c884860815438c5e3c69b88 -804: 17b3f6f18906ca20ab7f6b011f1cb522aa046c343f5bc04803530cb8537f0927 -805: f888238774bccaef845fdbd2a338831c13090afc7c344b1365e24bf1ed121ac9 -806: ec81d951ac4274fd4eb452baf6c236ccfeb18138429463f8e90d1524da12121c -807: 5cfb0fc4907a831e4c602c82c3f07fe4463bb3456fd6fd24ec78bb483accfd63 -808: 947236880fa0c1bb05b086b2f7412becc344fc3ffdc6f4dd00bfff31639228e3 -809: 259d05d2057d408df0bbede5bf5582baa01339493684d924f17a46b4f5aa4e8d -810: 1ed6143a41a75f6a9f6d42e98a2f29c6cdc935a8a7ff43b8ac59bf20e933f194 -811: 57e739cb621863d956a720b719a76a4be678b0ea731a3b777802b53cf78d3d21 -812: 6db449cca2b58ac27074e003cedac028c77a592d31d5fec2ac90b63108dc2c45 -813: c9ac45e17f6fce5e3aa0a963c5ab2af463422912e5a97e97b969d30aa5e71bfd -814: ae670f4be0ca416bf822562d1c136985473d93fa6c005565219c387459c9d463 -815: 64aa2f792bf77fd23b6d4050076d73c9b2ef972e04de3c4e4b772a75145bfb28 -816: b2b8810ff96b189c18de81253260f1f57d283c3a6d5d9f8d8a3350b7d7b4cbdd -817: 5c7db30147bfd07e81e7230d8d5e559255556dc7889d19f5a1b834ef6de92639 -818: 00617b68f6496cf88cb4728f889534d3b4ff83bc8ef9e214064a4d0511916a7b -819: ebf3905209b6aa1fe732dcf39507258e0faeadaabda8ff2bcbd028c2ee071155 -820: 1ad7cc67a00035019d548ad7d8f01567f30c989f2c02088e9d18c864f7cb8054 -821: 5f12fe6bef45c836311ca3681c08f82796dffbf1e6893272acf26139333a7653 -822: 4c804c8ae2f4187ccc2af13aaca740d2f0ea8ef1593bb2f65640d4d9cdc19d42 -823: 52becac90562e114784b7542dcda300834a4cf3d2289e0203ea9b1751318e94b -824: f318c6a0b5af61b3cbaa5251d849636e68ab6c29bf361e81610d259e5f9a1c9b -825: 1210b493270eb4617cf3398c05281ab67bb2415cc7780d9290761250eab9ef5a -826: 166a3084fc7ddb404d39e4d487881d7e7488024e77c827c86d80698967ef0439 -827: f7e8df8d6c83b694e8e3067582eb9cc4d8aadabde048a3c54894bd40f94b121e -828: 4289388178c1473632da87084d13c09a92a19ee32d085d717ea5f7b15f8733d7 -829: c11fb521a4d1287b82e982531229d811e0cf75b049979c592d48835b3fdc5ab7 -830: 7b25b4347a6cd7f79fe6a2e123e2bcd3c5f7c64e5701474e116677c680c847eb -831: 3bd669ded341ad240b3cca32e2246044e788e92346759c677c25b588d336eb9c -832: 469e448de67d33b679213d1fd4383af4eb663312d2b039aae59a7ea55f47d48f -833: 1e19b3f199afe7bea42e85233dadc186dc7db1c34eb0222c40100443f1c372bf -834: 020b1df2133447fd8d2d1d8caca7a80ba666184c243eab0d52333f026d4c8488 -835: 03749f495dc4d4230fad2c606789b1993e5f2c0724c3e94c418a8e726553f9ab -836: e114a5bd110ede150c872c12df640eac7547f2c3b093b4f368ef1b17d5efa42f -837: a36b110e907ed59a4422c82d2107923fdaf8130b4bc216aec7a11ba803a31a1d -838: 01519d8b064806e5da350a1c102d07e94fe5334fe4d23759356703994763c4c1 -839: df4e0927f31ea17664543c2505bfd90f4df67c620d979243ce80e9ce6aff0db1 -840: 28697719928efd0d8502578d1ab317b772ec0e7fce2a64d1a174d7ff6dbbc943 -841: 5aea025c0ecdd11cc6849bd784eb8b591b2d6034dd4c9e11736f623cab205bc8 -842: 21b966650022484ba1bf969edcdb1ec5e71d2e9198721c99df860bfa3320b685 -843: a48629a370e3c8a8ea395c1381d6e7ee38165e29d70fe80074f1553c5ca12086 -844: 8f00714b53a5c63483c1a1ced92f0a7fbebea7e10b27e690b259c58a7e21b255 -845: 4a15be4e2173426025a7f7c2bcc0f9fe2fa070c5ad7d0185b2a7d4a2717b2d73 -846: f6da5b5d72df9883e373e6f7c647febff5929ad666307b3ff838f288fb20021e -847: d0c3a75990e3cd3effd916b8997f8ad39aecd2f40c7c59df5c6ed6ae2bd6ab73 -848: f08583778b92382380ac638e7f86c72549847cf3570ece9f28b02f71e0bc9b15 -849: 3d41f27a82ac10a8295a2cfb6f4422fba8ef5303094a845216e532d0998dd1e0 -850: 2cc2716e1e720a13304be73fe29a4db55a2ccbc95285783744077bef292b913b -851: b67ccae6fcf0d8cd364260c649c2135c606753784fcdab5411915795c6986dee -852: 31542a3723110e69b091960c13f0bb9bde2e7630c17ac9742ed5bd94df12f11e -853: 7b3f0517b1de93725cefe79227f54ed95166e363ed0b373da7274e0f56e6e433 -854: 5a2c88b0d041cb9037cc3bd64022978dcf2d1839b7b98789dca382521f4de7b7 -855: 99fc645dc0fa9183a7cd75ce5e133e3552cd890eeda2d79a6471383965757f5d -856: 8bcf278d8e51f0cdc959ef1f5ac79c411f5b5ff7c658d3cfe4d1312c9ddec0d1 -857: 5b1ce03ec386b8a4530e1c6e9d27c3ef54c0a8da3d2138ac2ff4d7bf89b14df0 -858: 6dd8aec81318cbc0bf2fb60653172af32ff62dd2ff8cb20bc0c1df82ed41edb5 -859: b2b6ab64ea6d8c8602bb063335ec0782c02174dbcc8ecec1d6160e030cac58d5 -860: 26271e73d07a7c45d017b5085c58c42914a74719c8d49979c678c5b4f8e76e28 -861: c6136d39d206890f5e8aa2aada84bec2cf50e405fbfae64b7b231ba880eef72a -862: ee8fd22fa072b9fe159209e4955772e67d225ad2a9d169c30f6e468b5d5b1c91 -863: c73ad82fcd868bf22f9b5e13691589d73b804a416269254b46c67e5db6bc2ba3 -864: bca23c98fc655392ba07e97b3a3cd5746c684f7131be2fc95a7d5b92d80ce755 -865: 5290cac580cd15da39312bc9f35de883590b4d42d481854e488d33794f47ac34 -866: 0af6a1b3b5a923b24b7f6be599c2475e2007165ef088230cabb9ba47f2467f5a -867: 5c3a4ba29214bf3532af5110ff7f1be43e1d828e181653064f08f0ba65556e16 -868: efe62d93c082b86ca8185dd01dcb848c247412aad460b3f98bd7394c333a4499 -869: f917605bc5eb01ec880886992db6dd8dcca845f013eac800d21082098d660f3c -870: d745dbb46f8e55d21378a0c6f070f851b05a5d0d77fabf7182cbe0b75ece39ae -871: 8a254ccb12d77511b4818302a7cf7a4010830554ff0396a105985fc4a7f0adf7 -872: 446af701e2c7dd921c6c157ea68c7ffb2881e489e06bffc555bf2241dba2893b -873: 2602237a6aa03fd4b36df0b938f1c49f610ed92bae6ed1b7b60ec172ff395e82 -874: f375e7a552540bf63d5e69c663e4b2de721435ff57d9f00476d9241c05913039 -875: 26edf4b92a2d80a8904da7d91ddd617fe97a4d741ee74e02f732dc350abced89 -876: edfdfc01d71eae7142c218f5be3867878232d25c0e503be8053851aa4c31b657 -877: 015a35e8fbc9e2355e220b6e07cc21049322031b2940121c71058a8d9c0ad791 -878: 1c241cbf578fc1b5875c13045d01cbb39564d1ac030c38b8a0add52c1c38c608 -879: 0399cc25a5426ae96f2f6cdf71abe0847082c2700076abd073d88862e4d32588 -880: 6dfacc9dcbf13ff79b66c487a678f81766bd2015da32fde451d904997ca5f8d1 -881: d684685ecca96d26094c9c0a391f606b7e874553b033ae90ef96fac18517bf01 -882: e6cfbf978ecc3fb19429203bd2c508a4bb1e1d419c313f554d20dcdbbca6d64d -883: b8df95ca983f4ef3ed0310b244f2f4318d6761564140cec095a16e023976354d -884: 3d09aad047499cb54bc9fdb4f634c09beff93422db01f7b8498d90493c32a21f -885: c4d2a3d1bb94a37768b512a87edcfa56c00cae560b74c48e46ebab9ec67955f0 -886: cd5728a9edb6066bcd9392114a0f18f4c70ccde8d9c24f3b459930c19e95e506 -887: 743b81138452ca16e51747a1662402ee0d9eac3550011931aec68a63727b6894 -888: ec0de7ecff31949c1922903825b76e67cf27c61d8fe100a5d0af52445aceb262 -889: ac98c3e8d99163b7c3f81f263468de61cd19cec791164a1a38ce0ab440aeb324 -890: b4bd0129e6cf5223eaacc456653fc43936d376d90abcc0f08604d0cb7eeb72c9 -891: d3ef730208652e44eb49ecebd0a0e0dd885e9ae13e608c2ea15690be6b0cfabe -892: 0cb39c3968bcb3d4df407cba298c3fdff967e494effcd9f4fb4dcf846d0ef7f3 -893: df067b52d70efe10ee799741354efc807f4cf323c6199ffa3006a89820196fec -894: 49c36112b26485e2c4184371937988ca9edfc53d0055ba438f7ac8f7466f4ae0 -895: 779075e7ba4d73acfeb8b00f20f03ecac57bfc4db7d907c33f65c10a65de890f -896: c9c078d711266ffe91f523384168b90f1bd00efc2da110778b9cba2f0871db49 -897: 4f2d2969f130c86498c3d4452a9769978990feaa3068bb338474e2063fb47364 -898: a84a2762530ef03398c4c7f4c456364848d91201bb0cb122ff5b18e9e39b0e23 -899: 8ec0cf65d1b765c086dde69a3ec04bc425342a4bdff439058440bb8958fae5f5 -900: d30cfe6d61b9fd4b017d6c9d7d9273e8418d0ae9b8fde5ae767ac80a6ea21901 -901: 3fcf48533859c643a0396c0b597dd9b3802d52c823b5fc9b76e6880fcfb840a8 -902: a5896436484d5efd5a74b8f467a15ad21993f411f27a262912940d4d85e2aaaa -903: 70dc9ceb90614f80df7c9c113b13307d71a4cabb766d09623d28383fa000f8de -904: 5acbfa317c6a381e91ac6c4e856cf341d8d017b6c4f378b2f283ae5fc683c9f7 -905: 2269a8c37a0489ce983f89e5610a5c992b010e9663ed854bc85826c5938ea65f -906: 9a759ebb80007327ca50b5d2d0c48a62ffbf75130b942f9ee05f33d69c997361 -907: cd625ce6c86f80cdae5d4256307200055674905dc4d97f93146ce60b4fe7f4d6 -908: d5735fffa3c594d447ae869b6f97df71a8437a7beca74b7c1b7ab7cbee131122 -909: c6997bcd287033749df80813acb98039278ddbf4a56896a3c4c852114b3d4a22 -910: 93cccb0ecb7988e965cc9efc6d7ac1ff834fbc10be6fda4867ad75c51744138f -911: fbf47e7817a7ce0c3bfded8ea030550b6d6f6de53e103878111f101e49f9445f -912: 5c89a1c644d89f7acebb9b1f9ce51a2ccee9ca212dd8adfa0d610baab3186167 -913: dc28c7d675adfe5a1a7c69400c3dbf5b38332050e4317a1cbdb275247262ca53 -914: c1cb82bc179b22b3a5d9f0355da80ac050236bc73248ec93b8dbbd053298aad2 -915: 5e6e7c848d5df0cf67b72e28e216483216fe84e5d4fe37317369c19603cf0bf3 -916: b19c2c5c2b1a45b6bce242c9aa9adff56affb1f88be4a2645cf76c42f46c7847 -917: be55f3c6e3b22eaa9c1865653a8c91ebb7f414f9a12cdbfb62938945dbc36ab9 -918: 1f32898862ab8d7bbd37d472f0c7eaae7fe2f084f8fd45f05dcb764ca5b600be -919: d07488ed1439a7213396a1ae28886ffa5c4d3cbc74c175cf375402f56988e15b -920: f0b8e66863472f11e758bc94d8a98ee308e5a05490e5db4fb66e1dc09f4e52a3 -921: 67d9acd2df48f467b4f7a84f760730a92c635e928df5621f6afdeed3e195d3d8 -922: 848e6416b52a2ff5c7d7a5e6eed3416c1deef9584f60a5f6c3a2854f0a501faf -923: 5f07bf7c71d71b0cfcb5fe04fb2f1f8a950673754dec4e816ca84f82e663a9e3 -924: 154aedec1b966263e4151b44a8c438bc5f81de0170229bcc20c20f80d85254df -925: 91707a58602431d402edc2258eb703be7603528faa3fc6fa0f6b1e6a4db7c234 -926: 8210b096d070cf4b23238373eaa334784226d472bd5a75abc4bcd512cdd51553 -927: bb818b548724ecbfc298a06c732ac64a20846953ed2eb98c452948c764b4e17e -928: b590d8e03bfe80fd84cd64c1ccf606e75ad702eafaf5353e72e38481f7c3d3b9 -929: 571308cd156b690c3b03a9f857c3b14d91124895a73a2fa041d3039c58468b36 -930: 5470e7f92b880ade0fbada76a0c06d5da0c38e5569c59c11689422144cf3e368 -931: 0584120c3727f510f276d173e1fafbcafeb3fed34bb6639d477db27a7e307d86 -932: ff177489756c5c08e42a9257170d31de9f5420056514c5a6c9ac00c5f9aa04fd -933: 826d14a8ec2b8611009cd1507b8df8c8796889cfe9555db9a8fcc930ef5ee609 -934: b11bb13741a897d8d52f29e0720f1245c25cdc78af34d1b66818506989f63df7 -935: f29205e421662f14d8d93573d326f3d7c98df9527f3a011853e309830b24053a -936: 4f8f5839a9c97e8e6b4661232ce36d14727b4ba88cc07e22e58f3d0792156737 -937: f33b892df0aa30fd76a13fd6250efa31568e0c119177ff5ef70ca1382a125990 -938: 3dd1d304670e333bb982b78ef90eef332b7ab56badd527efa371db1d72a0c030 -939: 456f703691bfa76e0267c4ca9000993ff4ac6daf118b852dd6c763354f1dc1a1 -940: 88f1827525c56fa450ec069a75af48a66c60dd82d6936b71bdddc33bd70882ef -941: be043aa1646c1429738dc5c134672819b6696e79be9c7a98de1afa0d907e09ab -942: c58f652f83e42206e0495bb43b7104849dcf0d4e4ea288ceaa8d221929048209 -943: c0a5542106b07172680af9cf134a8dd6c6aff11b334cbe5152a64d14f97ce5d3 -944: 90cf70305c87a86ae7cb3584858b09621896b6b902bd0f835afe776c0ab3575a -945: 623b58198f6f8b60a5291d1564715f6c177ed6a9795f6a22aac34769d4b781aa -946: 2eca286f8e943a0eb575a8aa472ce251c4a06e956031b9061871726319f33a9d -947: a187c87507d00d8e121bf22bd3a5381cff980a33db532fe1931aaac261bfbbcc -948: 2d1802473442182f0d2268ba7c9bcb6d2343db00d1bc7cceefb05789307387ff -949: fbcfc7d9fa122f09082876a7ba52b087553e5e434536ae272900531d9fd7c5a0 -950: 05fae880424e2b6896c06c0868b7516d04a20addee4ae06d7dfa3d2e8528c23d -951: 556a1aa2712f77d0e29e84189b1907c14ff74a242284eb8d8fd81ff4c9a24d33 -952: fd78fbe54ab202e7f63e87950e60969fe6c6ed0b5b5b9f1a6a64f8f6629263e3 -953: a72ac6b1f94bd82fc1db4d0df37b3c328282bf702a2e80bc6b443319c3127446 -954: f43267b1413f6687a0fc6919f4992920d1a74f3ea43fc087c815f6e6066d1887 -955: a8edc9db69f79246cbb57c2b2996c14ae36a4802074f650e93a1fcac77a259bd -956: a59f159a23a1505a09994c298e654afac0c8d6e2f3f783069a49d8f7f3a8aa5d -957: 665c8ccb1d3c8114ce342ca49cfcc967d166739db626413d42d55b8d2714bb31 -958: 5295ce9d52528268bba400d07d3f7bbfd85097c9f69aa1c58fb4c0201a974851 -959: ad837aaefaed57256edebe44e09dba02d6810244b6a765deab4da65906785f5a -960: aae3fb65120676a8756456c8e56846efc89acac7eb2500551446d8bf00e0a75e -961: 0ac1cf7e1bc2d02b05386342d8bdbf58a7c62976df7190f35653aa8daff30ccc -962: 05a4b48144bed7422054a947e7efa5a1c1517478b9ec633e449a8cc192dd2ae6 -963: d495cb49245a64f0c098e355584ab22e496f551c6db141450d4f2d5473abcc44 -964: 8873017ec15e2ab8207cb9e54426dd670a3beaab33db805aa01c1779cac20e72 -965: 0ee4c3502941396bacf4d957519d4ef4a4f692c582c6c2344fdfdbecde8275a1 -966: 2bbc9539dd2ecf542d36dad04808145ab85640a14ef9d5ac272485bd8f4144cc -967: aadb52646899d16bf8149a8838b15a8e4071d3d2499f38c1fd347931d7e99097 -968: 3a36bb3c62181f1906ced66e0aa9090041e1783c85b37008fd91429becfe1c27 -969: d0949593b37749c149f865d0c1feb635a51b6ab2f1534e4b9fb0e93d9650ba71 -970: f7ef0b7a549a0d3949bdf395deafe817e91cd8a1a7a7ab54c0b592933368b773 -971: 09266b160df5ada7a2956d2e3b12d4cd54339688fe13914cb4464c4ce54763c8 -972: 74d5f9b29bad60571c3b13b4374b5d9e2d2c2104e5b8b08a9a46697c4db26cd4 -973: 12523e5f97e8d85e409d8fce5a730c6f32cd05a69d607ef3f0b05c58b52265ab -974: 1a987e6dfb4a4343370a8fd5bfcf192d3374a4e5480108021180e03ef37fc6ed -975: aaaf1ce8d227164a535129c4d6352005520d4f2f5946ceb6ed8972453ad67fa9 -976: d25e2c85bca0ef83a141227ef2c9886d07e86d6b1c40e3f7cdd14f84d1e92fe7 -977: 37471a4ccaf0071fe0f3c31281b44b8197e8ef9e7301c6f53184f08ef63c5d43 -978: b0e16ba5daa317c063e157e75d42de05927a58054e3737542fc258a3cfe4070a -979: d4c184e0d658a3e24a7d25a7100ce03eee215547c335844f2d8cdb8a2b1a9e79 -980: be055df17f2d7082f4647dc4099f5c0585efcd6423a40551ee589255ad984991 -981: 09caa9af48d02c98ff7107153b1fc380af3fb9d3f00a8091cc8336d84f859ed0 -982: 67b2ca10f46e731cc00097205087b5c16d60a29ca1cbdd8f1a375d8b6fa60d78 -983: 0396ba72836444de8f0c354b8a938395b670eac515fb224a6b073bbf10bcff16 -984: f77dd049a4f6d078b810af3e0ecc9f76dcfdbea413dfcd709a1f86c915c392b3 -985: bb76a5acb950ca6fb0115097b948c3b7e928498cca4bc65e1ae7c45023642bf6 -986: 45f58d18384049501fe1cd351e3bc7f612a548ff7ca10be59a9795dc07787dfc -987: 70a5ab10d8b77ba8d578bc4884c50a62a31aa53a07f81688b3658f4eb9827ff8 -988: 12de07ccf3b01d9e39ab693a24b5563635ab0d20b0d25145ebe031b151b3cffd -989: 9d54cf86f8fa928f4b248978121f2a7608e1499a3f55edb16d00e4ce3073887e -990: 523110a7ecc629c613b459c83788c9e66897d5d2e92529c4dcb6d45003c5ea7b -991: 465c58b36171c47156ac95d570671a4f0a68237404b960b0517a94b279434ba4 -992: 6fb4c0905e1cdf34e70a2be73e3ab7e48a687efa5f8dce261bedff93011c639d -993: a316920e76d547f001de8e1e4f4efd0bb4801dd6f453e03f6f9035055ff67de2 -994: 95616eabea52bee828193c8de7e3f442164295a0511bdace71109df206cc51bd -995: f57edb955a21ee7a7c1df5ee6c6b307796ff6bbf702ac489077e847d9f589405 -996: 84f6a4e89e73f8ae45094c8566e93b60c51e02105e2ed07789e761adc269e6ab -997: 2102a6c04cf648d73c7bb78660a8b6654e97e557f6b4faff3361074f4b509824 -998: d7224aa3f93a0f23514e696c3ec982b780f9c4c50bf7b302734e4ac440ed0485 -999: dbd4d0cf3b068945805d85244cacec331f1ef1bce5e679d353e1b95d5559a07e -1000: 1a888206971be51a4535e1a15d4696b6ba4425fc1083911f274d748876549179 diff --git a/hash.4 b/hash.4 deleted file mode 100644 index 8c2cc70..0000000 --- a/hash.4 +++ /dev/null @@ -1,2 +0,0 @@ -0: 85dce2ad6ba50a0ec4162ad0598336517ad73f10e8ee16192f5fa0d6111415c0 -1: 967af4d7613e63ae6cd2f05df12e2c8d125f5128ec07521a6b313c24a15310dd diff --git a/hash.5 b/hash.5 deleted file mode 100644 index 1ee2db3..0000000 --- a/hash.5 +++ /dev/null @@ -1,1001 +0,0 @@ -0: 85dce2ad6ba50a0ec4162ad0598336517ad73f10e8ee16192f5fa0d6111415c0 -1: 967af4d7613e63ae6cd2f05df12e2c8d125f5128ec07521a6b313c24a15310dd -2: 7eea68f7007f367e09493c70edb150fdeddc16ec56123253516696900ed56fe4 -3: 4fe640d5106f16b6ee464b7c21da1e3c3e0223b407d0c6a3639230ef65f8e309 -4: 3632c69123a4a7cc5b4b45ddea2b1572ec877943d058dbaeee0d7fb02a64cf0f -5: b3f14807af541756e10a3cd81e812ee5d51505baf6421dfbf2810facee611c94 -6: 19fb1cbd59d7ac9b370488d9a55c1fdc79c1d8b8e4acb8607b5347b065ccd4d9 -7: 8a23d1395d1eaedf268b56ff978bca521a82c13a471adfeb85376220436f6be0 -8: 5abceb6e6598736cc1b81cb10d644d95707803988559a5d34e97b38c7ba6b61d -9: eb44cd7554093a31e15f13315c88303f9cbcc12c260c1104aaf2f7d322a4cd75 -10: d3296f612c32fc482c190825523af7c53561ab65e53a89a9360146ceef7592f2 -11: be3e464b70ac3060f456aabef84f770cb61c597c34b449588578544a3e319724 -12: f2481bdd304361d3366f8b47d030181ed574be70ffcaf2e46bbbcdd9fca86f88 -13: 9d8806d808ffa4fcb20dd8c6e83d76261579d4d55dbac5fb45c843704fc853d9 -14: d7154bae8ec7256fc5c6e69689642a2be5a4050223418a6fb42a069665c1e8ae -15: 9d508212c183bc60199bc8d452ee1410341269e486d8887e6b873309bc07ae1d -16: a998b3bf8609d89a750522039413c31b67e4d8ad5bde96f8676fb845257c77db -17: 267512254d3df3188031b77dae4378f1b2cefbc136777e7ff450d9249dd7631d -18: d484670f6ded2ba8f3e1a926b25fd9df59f6c57b5a7ef6ae528a82f6fc096f39 -19: 8a9694e39a0f7597a517c9ebc0d29aa47d38ba488289433caa578c31dbad4d87 -20: 8ec179071c95681b40b81cfcb878cf30388917844b8cc0a70106646a2509d54f -21: 5d6d37a33541f7c27460408529d4a2011906d4dfe215fba1ba654a8d0e57d522 -22: 2d493b9694a77fa55453ec259182ab55de0b504d9358047d5d8dae34df779fca -23: cf99972160728ec412d836ca2f9d0af86b74d6bbd46e9998f941d1ed2fe3032d -24: 6a44bd9e825c146850a76356ba47e62c71420a6f7b3108b62d58640290fc27f0 -25: 534294e4cedf8630d14b0ad75bc732f6e02aebae0c4d72de37592deeab493d36 -26: c99fb8948e39addf22fe084fd260e2c7dbacf6dd0ae5631ad9da1b8f2c887774 -27: c55f039a282306e34d74b1d3d4d79432caada63ce94a20e18ce1e3a1047b5c75 -28: 0e1d4f3dcc82aad407948b3bda370dbebb3453be9445ee746c31b6a6e29f834d -29: fe1e351a0405674718d2731949970188891e60a22454162607cc331bf0250925 -30: 49fe281b7e21d1f12cc071368359f07e9022d20d0ccad6da269d5c06e08985b1 -31: b22666b1f8fd1ecf1a73f15132f95492ca95556e2724d7c83d62c61229365534 -32: 42e4a64c2302db6677e55397e081b3b318db7372b648920f8a37780ab1cd3ce6 -33: b16a21a8dcad9d14d1c9f206d8da2f1bed1827b9c27570d8f762a42ea324abe5 -34: 841d5e62b2baf1bec33817a764e76447da91c3ec3bb76c71aa7b843fe742dc56 -35: 63e2031c2ba2de22f57c078f30ee466224aa9e645955c4d7c9f33cffa0b04c5b -36: 57b3d4a9b99c5b30bc07aba0a104dbf6323919c7829316af44de717606674d6a -37: 52cc02a6c375c8661d5ae7640c12d4a99d471a68a8adc24c4b7b775faab15519 -38: b74dd5dacb02d8991de0d890f28e9d9541728458897f185ea2ee461edbc862f1 -39: 00eb716f16f532d8cd216c2381045a03600cfdcddb5cff899327872d1e4c56ec -40: 62d17a5c7852291a20954e947712d9190124962c82c25de397e392d998096f4c -41: 3651989b89c2177d3dafa548696e28f4d158304424395c2f96b5268944f60c38 -42: 97c011124265b78962504cf4c57b701c47e12c5509d42b239496e39613e62e33 -43: b2650e0fe7cafd2f753baa4cb4b9130cbc42b1ee98beed229003ab5e6f6629db -44: b0890007bcf10bd94da7a0b43bd64da4205665e70b3bb9c1f6e7f72199a1f0eb -45: bc342e0606491fe6a11cf901b41e872c2bc532af5cb8bef2a93c80e87b29061f -46: 320f03dac702ecd4f942b33805944e1419f22325a956d61afe35dc224b252cce -47: 14fea152c29f1198c1f60f5e5937dd7c875a3491728043210c784feae9484426 -48: 646f5ca122eb0bf206c1481c170ab7a003b220e66c838dc8d67e71244337f7c6 -49: 9750f6ad64bba9df8824f67d75d37d0c0ee31ae765e7422f226ae9542492d82d -50: 2a41aae9491dc68e12bea51a9662ee0c0b6c485947189e075f2ebeaffeca6c41 -51: 77d710e29edcade288ed971d0de133c54f5846f3f663d22232d684c8d9125652 -52: eaae5db00afaee3de0c3e21655a2cd8368ff7e7dfc0fff64af87312a7eebb0fe -53: 5e9e1c024afe55d81b6ac8557f2867e5f7c378d6b58a757f65ffd81af1aa7925 -54: bcd1508137fb9456e0cd307e405d02ff17be39ec5a8dee6cd0a8219b88c72495 -55: 337bafca56c5dbf80d610b7477a65fcdbaac5b7060b16b5bb295d684c41355d8 -56: 1d3fbeb378a2287bdc5f4a20f1a4328905391f61654797d4710c9247d7e3376c -57: 59721454570ca2b55c09ca70ad99dea88ee5bab0444cc4c957a80b8602e764fb -58: e07829c5b27d55c8ddf75d14ad8d8d25c7dded815d58d67b89f0d682a9e3ac42 -59: 992b6df70082b7fd720529ac7eef352646e6c9f6642e0336080dd5239d6c111d -60: 75fd1ce46bccefcc1cc1680a192dc545c91fb4262f1ac2cd5aeebc9a906e6a84 -61: 4384d8d5cc81a5772d479fa636aae5e750e6006d73dbf06c662e5630cc9f2f73 -62: f2c6049bbd9242d9739f2a408169452a7c7f99e3d44b414ced10361ebbfb9861 -63: a5b666b5b0a2d63415b744a61d78cb7e2a57658e0f5587b75acc75268a7ecc9c -64: 0fd368e2923173329fff18564ecf4e4c3100f9d116bc2e34fc6c43e0f152f789 -65: 6a18f6aef35207192c09a7670854d76313e230450b11c1ae09dcac738ae29a75 -66: d6bca17093abc1619e048ee9c1687161f60db61f5fa45f32e5f413a2211a3ad1 -67: 2b3eed034067549495fb0906972c5d046f53d26fc4f0603ae0fbe216e164d5a3 -68: 287e82c3da770aca0a53f424c4b1392bb1de1178e05dc7a762af59ffb6cb3504 -69: 7dc33c0676c18be0c98f91b45055a39aa4bdb5774d1f3d2b364509117d5199f9 -70: 8ac0505260206de8c3e64a03800aebbe06e20decbb7e1ebb08605fe6e1cd7de5 -71: a5f80ddf555516ef4540fb4882faf398e8113b90dc0436da6ade4e2585c135da -72: ec628bba9ce4d21d7a4e94908bcb93e97b9356322349420f877562f8ab806c7a -73: 8a933684d3b07d9cd9e7a85fa06f2f8fad6585bf00e3749e81a55783a4c33ac4 -74: 61471ee903ac7f8383b5fe4f06d17b3d6776bb86338e6bb4d8d4661d22a0db94 -75: d21c9f3f385090e34b25b021a4f89881c4cab9025c6bd07ea496811d55cab4f5 -76: f35ab97584d028e267ede7aa6810439130e9af020f3fba217b5f5f05f0b3fab6 -77: 1eebd15a4b141e3c57282e69f9ab7c9a26e027e97cb969b30a81cf2aedbc6d5b -78: 0d3601637e980370f233a99fb26df1698db1fa8f6ba08b17fc5981da1a0a9c4b -79: ea5e9db8b0d525e61a8c2f4222f0e234b5d11956968d75fdad29ba729c31c30f -80: f82393ee4a0e993afbbe499096b86fa9e38e9365ce39bf637a66148e563a7562 -81: 877c9e5fe589356a397ad27d41aa6c266575a3fa7b1041f780c9fd71e38a59b9 -82: b594a19913145eb74196b03b790d1166a3ee5483c4056bffecce0851f0fa62c3 -83: f4bd80926351cc2adb02a3987be946398cf90b02a73c30a34142ee9cf4e6d6b7 -84: 6554661e3bab5d0cd67a4aa12f851624fb59a37f76d67dc261f91dcef4e99f56 -85: 9101f3a09b1e2f4164e324c3a9a6550966b19f8f15f35dfaa7e5d5880c97c434 -86: e3a8b17948e7d9a6073d7f7f3dd324fe558115b720a1adf4e5ee5277245cb183 -87: 7285be9c5b90c66c3cb2c7aa23b2614c9acdea964bc8695a1428fc714976f812 -88: 47104b5c6fb4ec17cf85c1a3e22fe6019085d220a85215109f31065023e05355 -89: 3e7bf9add688476395fb369d0b51854f13871e6ab911220f4a2c35bfc82fbbce -90: f5384db8e17f02eec498c8688e9ddcb9927d698f969d398ca3777daa53c63d1e -91: 52939a46ed816e22e051aa8cf603b49fe12db3e14fff5577ee5fa709bba0e246 -92: 5984cc844cee6f30e28a7a4569a303aad5fbc647eaef45532ee2a3a4f3e334a6 -93: 60795ea26fa1124808272d8fa41dd10b04dc832aa2a4b29ec2a67d0aee8326e4 -94: 096f2ebb8dd1a655df783e6366a9826e8d2cbb45a863a2150126048c4a3bb422 -95: c02e2508f4ecc02654973ab7bbc697356b244e2064711d32034f41ec6c8010f3 -96: 399bb57ef99b37f9bf110c800857479ff5a4a6d615c28f1ab2e6b135f241f63b -97: 538146e200b04cb7eee283bf11c622f487b164b45aa507997076c1a714bb7037 -98: 634f3e4040a82fdad1c2f9986856ea84a29c11b780832433c72f53c38a9989e8 -99: 857ac7b15eacd88adc2aee1935d2deb1613a4fe6a07ef321b31d6459205efb32 -100: b9c18f78c6c126d024475a4cee31c86823a9b78948913042795324847c2ec260 -101: 4c21bbdc6c098799cc054ef6e4363ac809913ff273528755ce091fe8cea5dcef -102: 3574bf8d1624d866c339e7b58b4e4aa2437ab5792ec3a18c2ee3d6bdc0ba07c0 -103: 3ad028b3670b7e0df2031fabd8816516e19e10bf06babc5eeca48d80800f060c -104: d356b9a32be6600604ffe9e5c80943300625d89cb3834dd8b2cb1518b681991e -105: a330970603e32bea86778320be1fb89c1553c3c0703236a20d9ffb03f39e451b -106: 7d55c46d31de40187a5d9a1b82626c44fdd05dc92b8fe8f932a1cefbf15803db -107: ddd8827353b8b2cdfadf52c65201808e31586795fa5086eb04fabc3be56cfbea -108: 7abdf987458b0916a6ca6585ff616e6b5d385c0cd31dbdc66c6c613d4ec6b444 -109: 7bcf2da4858bf72820343567b4e27363c0f9c4576fca736fc12446637b04056c -110: 5796ddefaab6e59164723c4bc81d4d4044c25e4a5ed3e6982c3068394be6e765 -111: 50ee47bf8ca763c2d71db5251497889abd6bddeef350d774c8561791a42b8d3d -112: 78772ed96cdc0df15f826f62d72e1f0a9bace9921ae6880b157afcf12d2c5c62 -113: 0b3d2afe5cd8da4d61dcf951afa561b368644812a367d72c14062a189ff48b2b -114: c3ee44bcc9467d6eaa38f23bd58cc345cb6027af6c35fe101e72cd7d8f20ca79 -115: d85baa9f673ffb8ee642a26cc2eed5b2f7cabddcc1e3a57da6d25a9ff21a7ba8 -116: 22f6b3d8c00d5f6ab92583848a14e1b7ef3b7c183a26ffdc4d8bff0ea45d40c5 -117: 725b763fc442a935187982ed76d0579dc8dcc03f6d5247b8163e7d4f2d4df8e3 -118: c68d4f34319edc9c6be7fa9c2be8ebf71a3fe18f04e4b0adae0441afb2b04a85 -119: bd380ee1173ca47965d6d1bc350a2890063bb80253beda787d04129d425c561a -120: ab3069c2af2f4fbde79b2bcbbb407a7e7ebba04b9d479a61f12d6d381fb616bc -121: b5bef1a995fa71e6c391e0ebcea3d5b004c09d20b859040045a3ce5bea9538bc -122: 7cdee81258a876cc3396fb581e98fdb336dd1950a201655b45d3e79320162627 -123: 2fcb8b25d17eaac4370ef0a188e6666bbf966176b647b174fa9eecf2abec55e2 -124: 2d5324eeca9047ba17815e13e9e46ceaeeeee6b617725e9c24095356292c7540 -125: db01b4b82ae2f9e2757f66ec878a45174f7c23406b046926cd2586a76ef0949e -126: 410742c1ae1d14142d796f4603531e78b30866fa979a4adad4a49e9fdd3364fe -127: 2912f9acbdb4627c37fb1f643f67bcfa73a9fceb2d848ca7093664256c3f7ceb -128: 640f47f565d46dfe065e24cc266855c8b883dac354f25483c628728f8bc23149 -129: 175bd5ab889991582d8554c8a576293bc14be7226791b5352eba5aa3d6434de7 -130: b7f915cf072ebc03361a60e75483d96383bb67bbef4fd6b7a091255d72ffdba5 -131: c547751a862d00e7c5cebf2886e1b7feaae7c3382e80a7d3a306bf66c035b049 -132: 1e38d4d5fca04af54b42e53a1f80025534b915fcb3929cf08447e31a97f8fb4d -133: b4c3f2baab14feca2c91ec75d115d231d078b5571c8d79bc966d5ac7154beccd -134: c4fec2cd994c7dfd7b8525c27bdd42aa6f4bb263006f2939d94cd20d6008a44d -135: 32e2c07f62db8ebcd805a518e471c021b5940689d62ec56cc031045ee9af9513 -136: 3972cf6ee94c3b4701f3fa7fa9f7be130abf7da6559b6cba5d4037ba61ba4b6e -137: 74ccea30243f54b1e99b1f98b1a565fc5bc12c0cb372c0bb347d66df0f5b6c5c -138: d487a1505e3a398fd212c1df23eb124d7f16baea31ec1a8097fd2548d66c9de8 -139: 2054c1791dd0a033f054831b3e1a04a3114cf3f30b757d55115d0982de043652 -140: a549f0ec73a288b97f256153171dcef571008e1e35a9cd8d711393be473db126 -141: 59df9467e37cb4a346b8e12193c6d88e9dd6aed0e78c42372976db0bd4a24310 -142: 068e7dde0bb916b33c20310b8274aef929f2af47fff613f9fa36be085be4b800 -143: a8f28880fb2887738be1ab65dd98670a6cb0ebd89ab1f1a95a63aee1428efe1e -144: 45b277871b78f4591cc67349da916f07a5c2fccab58b12ea7afe4ab5c96d7fcd -145: 15c6252b88e4cfcc42dfc10638d01c080d8ac7759ca2c6e605ead3488b415e9c -146: 2205890b5e8deffb8a7c8270487a08bdae83ba0a823a3d7e98f7593bd80aec75 -147: 796161b2b7c7668c313ed3a4c96c749787d433288650a30a5e20268c5348f0d0 -148: 6d27d2926b2cc062a5eb332a1dd9084dff917d6014eec2b297e89e2ac0b0fb73 -149: 379c422916ddc464d9038edbed5007932a809547c63611a83b4651741f370ab8 -150: d3c26dd08a7a5587b4e5abd4fa55ff01127bbb715182f535a415555009862355 -151: 4366a1b92bbe908968acb1dd2a4e1461bed095fa6bfee3edbad953c5e9bfb1b7 -152: 62e6790aa528480602f628546cc04f828702b5423a6f6d6e7553ae8e8c34274d -153: 2a34e923990ca42a6534f14c02944e9f13d04fc926d3225c372818df47069c66 -154: 7163bf10bb131a014ab065e5170384af8c80cb09a49874d4d459127f09959997 -155: 039dc2b701808a89fbde295e55dff4abd976a508a817cea65b98caf0375ee8ad -156: c2341af85a957814610ede9b39d110910273f0627749a41e82c8249e841dd684 -157: df5638c7eabc9c0fede2341be6b46f003610768b90d15dc235df662cb3ed01eb -158: 31f31fa4ea63eaff1c1b31982a8874408681970fe211c5a68846cf10043a9347 -159: da2bc98b35182b12fdbf81352666848f1562a0b235293012c28489cb04616b46 -160: 21e6e3278390ec9dd492369dc2d5e04da3b393f630bc9a1e47d8ae1173f046d8 -161: 0b0d1d9a3cdd175998bb4e83436c81c1da079e6347c81a8a5d940fe910c145a6 -162: b557f92e62e8316633fd61fbdd8d726e7fb3c8e413eb5411ebd9263973f1ecc3 -163: 022cd2cf5a5a16f28e2d8a65130f70ce12232efff8ec21b97e935b16d7726a2c -164: 48b2a67cccf18b25a005073f244404099e3803c839b929054c839beea3420cc5 -165: 1078303bed2aead2ec811cfa4fa41c3bd4536290e0d690d3d0378124387bcdce -166: 8c6218f83e12015def099c649216ee489bfcf6a86e8c13e2d2eabfb083d44478 -167: 16399aaf5de31a47300043fcbaeb8ea5abe4b9206bf28f648cb41843670be2c1 -168: f64128bd0c936e4f59d172e61dc99dfd85907d14d3e59f0f0554defb246ceb45 -169: 91ea1c7acefe0f3f9d0ff988fce594a3aa9fe943dc38351f282003056eb3d177 -170: 9d3ed59fdc903ec87c8e4d2b1a7fbcd338298bb5aa6f321e401fd388cc5d3a17 -171: 93896f5a03b4aa3eb26cc34bae3124e42e5f661f8811b92ffc0a66964e4a08a1 -172: 5220ff28bdaa8286f94646feff8b615c38f80fbca37857fc3e81a3d6ef561e52 -173: f3434ecda75e0216226e1e5bf9143ac62852691ca5ccaf8954420f73ff0e3b05 -174: cc2a0b6ae2447b3733762f34657287f4843362c232c99310162fbb6ff0d50123 -175: ceb7be0ae2fc7f06e0ea102aebf343cb37c65deee88e2b3a538dc747979f8ae8 -176: 081f689b66146e7a256b1f645227cb3c9ebfbd04ad7cc52cedf1acbc21d43dfe -177: 116944f76f92bd752c7dede3ae8aaaa3e78c9f4c168ce1e4f8bed4051fb93b0b -178: decd90f07fbe6b0720886d0afb4cbf31e251882d6f7bec8c3482f8ef0cc8eaf7 -179: 8796057000a4cc5092554b1ca6826876f433a260b5369814ef293ba3562f4ce7 -180: 88b6522669a0e6b78af9974bc208499602e4ade0943e8d65c0eaafd854481f48 -181: 8e7428c3c728b8fbace45c64df9b4957592348c81433bcf6b81d3c2e7ae72c90 -182: 9372a0f5b68defaa0676b78320c16502801ddc3255b523e0801505ff5e7f16e0 -183: 6e86012d3547c33aadd438d6efe4ef06822f2a964ba16456054c7d7f1552fa26 -184: f740b3f95a86764d5a8031847becdcd2d259180e3de84bf074f993effde9971e -185: 59bdebc53a196c3018fc6fd4d6e9b6774ffbea7800700c8670df1276aa860bc4 -186: ed215e876c7709f3f456041863072e245600beaa6911aee29d8622de44ed33b1 -187: 4505f43b3569d2013cc3fc17ac31a329c4109611bc90fc610b7a47df00057375 -188: 6ff109260f1b3aa2d7dd09a8041dc194932dea241cb5e31e63612dad5aaddae5 -189: 48682afe897dc03b3d1ca634a183bc85dd51fdf049c8968a6d65c071c6afc514 -190: d3390ec0bdda39a01052620d7b6ae10d3275bf2eeb728b29b8f9a200c2899bc0 -191: 5b861e4da914e584b381f6d37f2c8458cb7a9fdc096220116bd184595d09afee -192: 18e51ddff9f391a89771af8fc5af6a269425fdc0885c1ab23c7b1498647ba951 -193: e379048af309c10fd9a95c37671f1965602a19d72b37765b6880f78e5575d00e -194: 2a03863aa3f1818018a31a289a1f74b43cd3486a6186332ea9d187cf4d778b8a -195: b06b627d0b9988f6246a2c74aa07f2f064a975a9ea72189cf70ef7738a550fc7 -196: 24b49031bb78a51beefec8aa02ee0c3f20a0bc8e23906ecb05a2e713675a283e -197: c91b153c4d07090707d66874074179278c760b59e0bbc488488112abfbe0a00f -198: 880aaeb0896c44b2e857cacb4e86c4430087f1524c25672ab3ffc3ed74f223ce -199: 8f79f1a6cbbf335cf629c9d0f9cd2e1a2e8f75dd911d7cda3d8ac7a0e9b44c03 -200: 22fe080dfbe76d382bcb438d9bb45671084d45f94c330436391e7d820d196598 -201: 836bbd51ce9e65eb7051f2e5e3c60816fdc6076b141df672ef8dd65acada203a -202: e454eb81a9fcd1e29b2313ba44020ef5ef60c2e3fd3b0566c74b87092afde086 -203: 6535ff734a6fdc4d577ea4218c657b65cd1be4ae2374d8564b01327b86da71b2 -204: 2265e8de4d67982ae7101f5dae68ca9f9657d2db3778702d909b79c6a86a5795 -205: 85fe8633bb3ccde13c7b479776aa1c41db83c4b764fce90ed14df15467a4666b -206: cad903e7b72d170c09fb62d3907f9b561af4ec18ddb28743ecd4cb733093de3a -207: 491a3cdbe7c160b955e34a93094302f1c01662e1ec30816e4516bf4e1c61b76c -208: 7ed8eb5cb2d7ee6f9e2488dd8fa835f6f22109f42215b901d5e4c4359ad30ee2 -209: 1cb36c31e915894a6a2533ccfd3859046a1dcf78d8452bc88958dde0ca191e82 -210: 7996ba8fbd81c2eb0becdbad564153c598abfa2b0f69bc3ce6566a78931d0b3b -211: 81289aa5f1dd141efdcdfc5337decd1399a8aeedfdeddeae6276288106bb76df -212: e4b3053295d363cdbb2572e7c374ae879efc9421701310a34db983a4249c74cd -213: 6122b9e38c62b79f5ae2511de6795fb0fc853a0aca3fcef4a182ed52439037e3 -214: 74982ecd365733ffd752f772b3c8859b030f09b7667627bb6dfddaec59c30963 -215: 65ac368432a97208d4b02bb2481e674f31d90f4f18efc9375b92282432cd4398 -216: 0ae0472333635ff53374228f90d5cabaacbc0af29938fb8693b1d6303af5d819 -217: 47335e444a2f868bab1dd2bcbf7d696403e156139545a479710a6e559439a8c3 -218: 836aa3b53750ab893a8d2505787917fc35dca9cdd8e144474f86e2fc62aa2ac2 -219: 902ad618c9cace3b20b7608eced2ed3dfd0fd2dd26d1ea37e87134f114053aaa -220: eeee27753ed8a81edfd6a9f9cf22ea18536e6b7afe16cbfb795c84611f729b7f -221: 78689d14bf6f41cf48c193559ca84a3d9159e4d8b876d8ef4400ff13adc7e546 -222: e95c0cef65e3ec3fd4d13511442b43639025b54441d0f6eff2f3f0fd16112e49 -223: bdb7210e537118706f44ce3faed211cbf168d84bb0e987d4a283c854514a896c -224: 8c5f6f2b232c4ca41560d9a9cf2133b9e9cb18f5879fd4b33ef3eb63e599ce05 -225: 0362c89e151b3c9fee8518298cbffdd7248e55598f2aadca11349c6052634142 -226: f890d22cde86aa1c84b2b176f20fbb12dad5a01a5440b7ea9b95ccfdf3e1c3e5 -227: 07bb7b47c9b210d815f1069a0a41d3a84521e657b7acb287b1cd5cbb49f67ff1 -228: b1a066f1a5123b37a21fcc3f76776d39d9b1900ab322627c624ca36c41ec8c80 -229: ba78c1228e9c14a53840b0abf4c2453000a9f7987a214c25303404f73c631f05 -230: 5cf5cac55ed208adb8093b361dd8b9f5f02fb8a53cef52826924782e1f6a11b1 -231: 96c1b670f199bafe07ddfd47f1621f83358029a70de499e06bbdf703df203266 -232: 1edeb64a7da98efbeb47db24d63ef44715ce037f115cbae5f9352d95250ff191 -233: c35d4468f41c85e5cfc438f1710c8ac81a14208d98f7aab81d9a2af52b557d3e -234: 15bdd6d35bf282cabde4e76053970b0dab3be54b0d82d307a286e465c8cf5977 -235: a1f30cbdae18417c306ced42980242e75e26a46dca692c2a5c66fee091eee6ea -236: 7dfdaa74283d590bed1a93aa83690b94af6da5ab325048562328b12121a1fec3 -237: 505531a199bdac286d600f684a6db9eabe1ebb8484b87d9eaa645697793161e2 -238: dc9b0fa83e94aa6a077b27566bc819d3f6c4cd9de816528ba0a8307ba5a9ce89 -239: 0469c2d7c5238717833258ddca0e7b5e2935f88fc18302530c7d5f4d12b4e6c2 -240: 5444891f96afd31dfb90875ef6361330cc9066732820393af2bc8e7685d73219 -241: 96c7a7d1a89c2a7ff489b4da3dad6040d70678d943e493124ac85611da941ef3 -242: 83ed5df952c9a10321737683dae3f07a674130eb1e63808ff36657786ae90bc6 -243: 8306098da643d0d713485eb46ed5b2e195f5922059dfc4235c56598e63258915 -244: da3dce162705f1440002406c5789b185723547355b9f68e2b79752c69120cbc5 -245: 586b2770deedf675f605e7a0ea1749f4ccee4bd503e979bed27300665376e135 -246: 21e45166c93f32ddb9455bb5bf741b35dd091471e6be0fdb0a3e3989e8e03308 -247: 929f96737caef074135a18be5507aec562cceabf0f782f68819c600c171c6652 -248: 07673d367d2861655fab34786cfb189d1264040aab58f8ea997ae13b6c303e20 -249: b0d774540ae1680d4d5c47002145f86d64aa85739bc61f0fddd24341fc870736 -250: 90be88abc45f798dd28659b543f1740317abc8f5a7edd9cbaa6aeec8168b4eb1 -251: ccccc2ec1d5992b360136f83cda2adc2e4e921407589c633974316084a0a24d2 -252: 7d863f9d4cf437e5f01661a0427f5d84c857a14f0c45117bfd430e1ce1e83d37 -253: 0f1100223e9634fb289da37860841f227e30fc4445e05a89580af9e37df54006 -254: 989bc5068cad5a93f2cef1e4acc0031c3892e0a8336f57b967ed493ade127819 -255: d117be5bf4886475737e229feb3a212067df3b4d20476412148de596327e8629 -256: 7918e370264ffe9a954fe349ffd1b857dc73948de93ecba459dbf57231df395b -257: 9aecf8190d9f3c8aa026de18a609c14017a5cbedea830aa587bfa75741785c87 -258: 4675441cd704567d561a9a244649afad8c0218870d8422b280dca07765478f4b -259: 807d3e8c51d7ea6d1f9178769f2ba3e6ad3eab801a22a341eba696ef656812cf -260: c9327ebdee70d30bc6da82ce176be856e13661ad045195c7ea3cbce1a50eeb6d -261: d2892873d407dcc7ca8d153705b537e9babb6e8ee48d43db752be3d4d5bff8b7 -262: 4042e408eac4bd2d4780366df17273c674ad0975053af97525a585783926eec7 -263: 7ab2537e4623221c87469fac039dab9f948005a1309fe4cace36a165ef8489ac -264: f9be4b7e3dd88242e994c06ba87bf086bd012bc05739c130708678ac148ee2a6 -265: 67f78d0c6e565b0a3b266c7024973632256c7bb1a50f26e615700ac117f12e14 -266: 65860d112fbee85873f4491a062057a044b27b075054207d04b3e1c8e0ecd295 -267: d17dc8cbb6a4121053bc4595c8d472ebc25ec03e6a7a3cea9693f7a08857c19d -268: 8f5526c34c0560b272a783e8f84d8c6068361fc1fd98737f916539c4e5a786ca -269: 622442a15cfd2bb1d19a5bd917eade938c67576a2fd710f355423c7e362379d8 -270: 01aacbb60422586205c3b537bd8e6e3c3647a6a6959d8c572343dcd4c2a3fd03 -271: bfb97cfb6d5ea07d2d2bf8075791ec76e038ecae19738583ed75ed3af92b9dd8 -272: c3bbcf68c733161cacb2185e06bcc08e739e0156bf172b465cad0b286d651863 -273: 9860e97874180ce05482189ea83b9bd46df9c1ff84c063c04b55e5007d71e308 -274: 60f51f62146cda4f15c5f549330bcaf0df4a420aab37ead2e94115b28464ec68 -275: f820c827e5685de1586f0c4366d68434efeada7cc8e4816113f1ab7f854030a8 -276: 439ee42e996b28301a17903413e27bffc561c20127696a1fbd7a9ec1091d15d2 -277: bff9711495f8648195b9d685d74737505158c58dbbedba3af298a12ccabdf72b -278: 8b440ac27c9230c25b1091416c331ef3e7c63fafb4d3fbc5e7e67c9a96eee7c5 -279: 153d0606d52d37fcf1d765026d5db583b0d8ee70cfff0b31fcff893e22197d35 -280: 8f271450f8d016349330115729edd00dac6d4b4ac1b4ae5a34ed03c3895fc6ec -281: 5fd19597f8f2f54a105ce419652b6f31ff5f81b6e9c9fe11adc74d37cbdafffa -282: 83ec2c8abf39cb4ebc7aa584ddab071e0bf709f5dcccfc4032649ee8e934e9bd -283: 87223192712bbde69b66186f916aaa5e034133be0852e736ada9a4f2b6d15371 -284: 51881c2227b7940a388f28f75754a5a606f549abd05799a139913a0e4a7b24f8 -285: 449501d5e3a11f803d3db8047544ba233d33b88d0e338b1cd8a21d274068f399 -286: 86028c7871285d1f8039aefe02e4f8f5cf8611cffcae71633b41cf24ce1eae2d -287: e4a43cc54820d908d2f413ad9a43b8c5a4e635c96bf3080d5a1d2add8a3d6eef -288: 4044246981889dde292330066d8f563a73090f61522316aca1db1fff59c76b19 -289: 7b8fcbec4e16cc0b53159f002d00a4e7fd67c8a1e04792e26e97c2e8ab52d1a2 -290: 164a4ab46b7901283c57d89eba86b54b1398005eb3b9681617934cfa48c0a7cf -291: c234774ec19d702c50ff52ab2a5681aabbd194bb8a16375dc0baceeb4549886e -292: 5dcb231c4448ea274426f1d3b34a4b5b2639d88eff8312bc08c94ee50ef5128d -293: 2b79eb4bc6a5c548bfda75d29f6e987942bc7abe6eb4515edd838913a2edf245 -294: 8c6febc7c3da2fa7155bb9c066677f018c9e6b580b9b14d576d38bb533f66cf4 -295: ebc472cf68e67db6be510b6d4732672c43c74604964eb5b4433b9c779dc7be5a -296: 61e0af62939c09edd3e12e53dd5b304b4b8d787f57adb6027154f81c748bc1bb -297: cde92fb85c4aead4cc97f094f99f52379f5913a4857880f26a337851195c0541 -298: 48d22f360d786faed02cab1f293efa2372d1a81d22e2920f884bc379e87faba7 -299: 12041431911a6e89eae0e2210f2b68efcf666e6da9fc63c33a4efa73a513f45e -300: 0e859b529c474484c1daad4892757411be6c133915c71e11de6675303e8a4c5b -301: 4ea0f68329d2132134987b0a52d2a5f72b799a7888f8e51b538a3390adb18585 -302: 2228eab0ad664fa03107f7867ff9fac8d5314e296bc47cb429b6d59c08f8e38a -303: 9bb3fb3df5a2af73ab0f0957db8633b22ae1b257ccdbf6c01b644345228f71ab -304: 28060f06073a5b7044d979ac6ed092750933fa2a65834d8938ea1ef9b9b30621 -305: 7913cb25af88438f3a4be0a6ac9c136859efb982b51c43cc41f8f3e9880dbc46 -306: 0b58a75e74f595094152e3bee513f4b47f465e974428ec9cccdd71bf0137dcf4 -307: cf774b4ff8cf9a2b2df5478356699550be7a89d26ca7cd988bfd7efa53fd5437 -308: cd7b2510510b1e68c93af020629b2dfd5a4d0b258ec70dd601271cb9c04ff6e5 -309: ca1027e7ba838b52595f0a83fbb8d05e9417241f7a3c8c90799579183a2357a2 -310: 9916cc864cec1e57b549623007220d92320c51cc945bf1cc506deae386193dfd -311: 4f7f9bf00b3975efbc9ed9150c8b38971951bc420c38dcff173357d8594db52d -312: 584a91d99da2b8b99c12c615961f1a8ff5b758ea8780816e1a1767d55b1c197c -313: 2adc133ffcc65a546c198b3bf088be0bf68341f8c5b45edf0a79428cfef5de25 -314: f9488b9fe9b0ee2acaf54bd385dcba101fbbcc801b71d0c3a1d1c820f11acd65 -315: eae10e528082af6bd71edf955c6fc7873b41406f727fac18872ea586dd828302 -316: 8f6ce27e9e18ad70e112aa5daf18bf564284fe985833dd34eaecc6b5e064a771 -317: 6904feec855e513b2f2816ac5818335be61832d92fc5e020dda40bed646df7ff -318: ce212d5906da3e2701313d4111da2f23b0091347aa6107fb0e3fa8f05c8c6b7e -319: ae2aa88187825ee3364586f6b7b8394f1a7167710791447e381285707caa2949 -320: 2ee5e39f89d0420f9781a0fb572557595505b16c4110580f9e2510cdc37a6375 -321: 71b7110857241e261289757765c5505296a4c99d1a5ce1fcb1675f1828bc58c7 -322: 612fa9024db98b84df2aca6419b00879701d649698a5ea3fcdf0c13bc58bb6a7 -323: f00b094cc91f60ba7e0a47c5fd5d3a65edaf8ca278aa4e55a1a859b8e4e610dd -324: ac13597737535d11f1cb7c259f2f4c85eec3e910d71be3359e758ec25896d893 -325: 3b1bd1bcf7b79d5a722e1c731a63d3a98d5efdb5f6ea26207d66780f79645cd2 -326: dc147e3da606176129f7195959841eac83db95e994c60f3dced9bafd67130d33 -327: 8fe245581f1813f11c750b3a5b02c8a6cdf1b59c5535e035551e5d590d3d03a2 -328: a870586448d52da28c66c78096681dac2deec0f07b6ac5f6790d497b7606e0f1 -329: 3718898cc208739481343d4a15bdbabc785c59ebec52837a63904b5f313f0304 -330: c559c358dc83ceb40564b40818a0339c1bfaedc1eb3dbb1fbe9f6d33a5e35581 -331: cca494691816aad621a47fc105b8fde3341105a29c3b706e9455cdbbaea2204a -332: d4cb6e4742eda4523a5d178948f05468d1cea1e1fa2b7e0d99d2dddd1e4fa8b6 -333: 58713a47ee7d464233aa4a925bf8ef6e55b305f2b0819d8745afcaf61e118e71 -334: b48c863bb5cabed5aeb69051a8a52479f5a37c6a43a643bdb37ef006b4db54de -335: 89cb6029342df50b71f16f88d8a495fd53b30889c94b4d7af1eaf8b4a8c1d9e6 -336: 3da1b949bef0364d6fcebfdb11e6d2efca2dc012010268b4c02e4b489a75d59e -337: ef14cd74caf8f47b6eda03885d20849d734897cf89455d83305aae6f1f457893 -338: e46345992433ad8f196a241b184f02a2d2564533cd39e844aa47d9a87f65f8fe -339: 77010eddd786912ed75c3a3b1c885944daf061d58ef653e94eb549143d4d2766 -340: fdb79ff371ba418823ea7443652d37286f2000df06c3880f1cb322f74ff437fe -341: 53f36cca4baee943d61e97bc9a5412670ff7408af16960c5487a93d1568c9e66 -342: 9bbd9eb1d00da5c0b96926357cc38f6f649f4daef2d0d79452365ed7a5679baf -343: 6fb2e192d031cd5070fb63f5e6a23610a008d592e0be5083ac2dc2ee264701d4 -344: f369c877964f6bf3675c2302e0e7273a600e5e2b1d8dd9eb0bc9ae1ebbcfba02 -345: 5fb4511bfd5a89a4c026b227d3edc5a1e0553ceaf56b0559c334253270ab0cff -346: 2105b64db2ed533bc0529de6d4eb90500d26e1b4fc0393a24292c49ef45eae40 -347: f110830985de233ea7ceb040e340d63d933a74237a6da1b6e662b6fbe1629d7e -348: c7a09648ab90c57f8334972cc8b4a13f8f65fc8cb9d7f27450689a8daba72b3b -349: 98b4e3352af24ad6d1ba2e7a1eeae59f701e84c2504f48190c11377f75c6ac85 -350: 395301bd43b6315b7cd19335d054fc18648c41c24e4fe54a87c4629830f1e6b5 -351: b496a8803825e94563c1762af845668689af8264d265fe96628cf5ae90774ef4 -352: bc4ecb58601d15e4e96551409d1ae3479a4b62488c2d961ac29a0f16b18f02ff -353: 93c5010dfef6a15683ec0aa217dc00466bf65125374490fba0c05e2d81c0a22a -354: ed4a34ae546505e877a978f68ad58c78b08ce2e084e1646fe7fa25a264927cc6 -355: 6578751c4580b094eb245261b9e4709d001f228d384ed46c5b9a98b9fcbea42e -356: bb36bef38c0667095696efe5779f0ed5855aa5c80130f3d834cccb3b5ee2fcdc -357: ee401de8e74d5327eff5dc94022aadf9b18f203d1a08d1587fbbda1682d41444 -358: 4ca535c0625c02ffdfbc178b70a5d934c1a66b0c8782195184a02b860f119029 -359: a45b2b54514720695a603bb0fbff2bfc04780c97308212244f57ba7e45e3aa56 -360: 56872cd98fa9000f92148d6ec19c31e59e71766e342031a6972be4a453b2d47b -361: 273937ef97b43b3017f0f38746bf4a2e6f53abe57b8b8494e74976026d42a241 -362: 637a19b146aef1d1084f07f0f9832dee7b9ee4e27d803bbd709467aa2ce303f9 -363: 7340af34abc3a6a30a14d0ac2648bead4cf4dcab4f252874f95b5dc121320998 -364: 11e11820eb3b42a6a97b7eacaddb3fc01d7731a22de37f6f379b2e3c91a3835e -365: 9c9783c63124a6913f338194a0605952ccea0543bb5573bae70f440dbcc80928 -366: bd2e7f67123d49ec4d8e529fc3714f4b7a0b1fb1a8bbcd6026f53b9a087ef946 -367: 89888854c22789bb35942321ea458dae0dcce3aa10db62df538cc8d3f5998206 -368: faaec2e73a456fe3150d2be01dd10bb99437e801b4f4984ddf4d26d33caed5df -369: be3626c4c9ab11b5e038c036874d5d99375491124bdbeb3c4027b29e4af1c5dc -370: 022ac8a6d2f09db3edd2dc5b92bfb8cbe893f83c2a48b16179868b891021ee58 -371: 0ae40bd4ee211d6f9f9322e7811d80aab3bd81c17191ba32454b3c9092854cc4 -372: a3b9af71edf59a632d02f4819f4b73fd32301d36f3ac7934659338a70424c0b4 -373: a2088bc52680e9a605a2919112a655058039dca5db6d3a4ad28f0308f82a7b1f -374: 9b69873872d2a1d90c3cf402b43ace8b5a7a37b02983a208167e865f51feaea8 -375: b022041c3132842a4bb6f1efb8e75fd2c48abc0352a40538fde82572bd8b4c6e -376: 79b15cbf5b8e0dfc79de050e4b307b1dd7d0a4cc6949118b1e7297c326bf4505 -377: 03332d4b5ac755b4918c7f9073f877cc1b9af8e97d800dc45abb4a99311f7bdb -378: 4bdf53be72410131df3d1294b5c3ed9ef166900ffc56474452cab8a16a42f65f -379: ca9801e8fe29a1743c4fe59ee889c266ce276e339956341d94c40ed64e2cde7c -380: 51e0280d03118a04c067353eefba23faed845e2f8aa77c114e8f7ce9cdd76ce8 -381: 92cd4b7886ea31b185290bfdf704bae8154b2035961511e98fdba5d107a270f6 -382: bec0c70454a64f9d37e0b6ab2799577b7f98557a1b64871235a3bfd39d89556f -383: 00162012a6c2f2b07d88e02d9096fbce28672e1a49ba27c9b743c0cf3be84445 -384: 7348acf111fe5513ab119295407bbcdfc6ff24d8810ba258c949154b2e9d1a0f -385: 2bbf687ce7569408c515117fec126ae3ea11af47dd8a5e80c1d45ead997cfb2f -386: a993b3a196f19459dffb4c77a1dbe0f2084c02553fd8b4e8d5540705bd50e1c2 -387: 26f84446687ae90c1813fa49721257e7fd8938bf303dbd72cfb4e32cdbd58701 -388: f467a901838d0f18b1ff23b4b92a8eb47d1087973a942f160f3657ae8c25e82f -389: 67aee2303ae947f1c3cb06e7bd76640be6e007dc21ed674e82c56a2fb6182e37 -390: 36eacf8ab85aea33a2d0cdd5716aefa875da36d05e765fff91bb5c70c7fedfa1 -391: 2efed6f5c3303799203b563781fe7e8dd10e5153ffff7f40c7eb71380a11781d -392: 33fc4ac404c554b242bc6a95c32d4a780ee9244729a5787009d6f776b8e98397 -393: 0e6a680ec399b877f374581475656c2498393025aede5857a3ae508ea8885da7 -394: a5e064a448b5ad1562b05f17e73af343045c89836ca15fa03936f2cd23f7fb8a -395: 5a22f1f5098d4594311fb19e225c848602e7880579356f183ca882aad3eddea3 -396: 1129d0a75803362dbc3b9d3d678fcef29880a5c5673937abe2f0ef71ef83083e -397: b8e2c3aea667c4d139a7adee2e29b0ef4ab85157d97d3a593deef208dfa5850d -398: 77dda75715d6a77138f0b4c95c8f374b6cc9cde0661d111bbd7293dd0add6e45 -399: 4d9199d53858bd285e824099364cd360e55358bab92f6e699032d7597c78127f -400: ce5296b7199d32ea2668de4f0e12b522de695890d491b69a46fbd3b19443a5ef -401: d953f34abc2cf734b1de72bcd5fdb9e34b3790c5539939dbd0c580578cd4993d -402: d11987f38e5d5bbe655f2c1f0693f106bdcf39794bba6b8318ea575f8bf0231f -403: fa1995a87664b4a1335b18f635e132113d802bcf3bfaa983844e4be9aa48302a -404: 94d26f5751646b41f46cf71187773ed3c3fa5a059956c377be54d6e198fe7f55 -405: 73621384cef28085fcf9579dd4b08a9c60c6c6693de75276d77178242b31e9da -406: d18256c03fe2200e7fde200cee7e5e68b31fabb35ea4aa674f1480f0c70f40ad -407: 228cb345ac19bde898f5d1bc0c1606c20a4b378d39c45f048f2ae641765eb3f3 -408: 127b0845056b41d6ab032c78a13878dcd7f54d363918738f107b4449ccd58462 -409: 478b6381cec4715437db2bd003710a92e5e3355cb5e01a92d4eff6095d2fa3bb -410: 2875c4e4a1c27d09af73fce7b0c8e9f0a798ad157b10b92c36f696f2312d52f5 -411: db0a692d081a97a3d3bd3e525109c1bb5e5f43654c538dd155e98a433d8118a4 -412: 5225f5acaadeefb94ef492e502474d900efc6bcea98579d120bc59c7377448aa -413: 27858430af45f95e7dfe8857d9f09e663577b2b858057eb531c8698afbf75209 -414: caf13396952df2bb16c10d62c34df43c4c422be52fe963401bacbcd8b3fd9720 -415: 7c9d95826ee3ce61e664940568a0066e9cf2665025f9d085eff982292ba42fff -416: 0d2f401f6deef04e52f09d18991981dc4e4a410e14bef6e4d0952c14d4bc791d -417: 5fb3672a06e111c544223114a982f4993cd0a0ae2f8f20c736ea622f9a592f3a -418: a143850d422c27cb425db67106caa1546436e843bbf6c7c5ca98c7d8b26500ed -419: 3a7d55b86405bc716dd23033ade4b475b1e16eda03737ed8d54783ae48e33842 -420: 24d02ba759abcf03263bf74b4149e277de035c9970170aee0cca3db4c3af0181 -421: c88f29372fbd0f25ef8f22d73d2c1a011c2108e43bff19231bda4ecb0aa870cc -422: f13f8c6793b9fd9dbaff1f6e7ceb6adcbb29df48412dff67855c37ab4d2ea7cd -423: ac2ebe0fefd24d17b128950992a8447d3d72e96d9991aa28cf949586d4aedcca -424: 51ce61394aeaf246871690a4c3f9e1611efe3db47689add4f6553ac44c50aac8 -425: b51cd46dffcd7a50fd1bed06d63277dbfb49a9dc52d130d2fb48cf763d090eb1 -426: 8cbada55be3ceeb7ff10a3a86cbcdf93cec431bda81cbadb17c35889517f6aae -427: 271ec5f0f337031bf4da8dffe63665d21a1445076eba7fe6347e01130724c2aa -428: 4e6b0226f4537cf206076359b05c5e848c278ebee902d761fba857852a94dcd4 -429: 26b02334cc3f7063cf3c98509be21fb05380a1c5b5415c551374ad541b25b73d -430: 855ec2729210f95045ebc4ec2ffb251aaedc552cb84b2525a111f09110a21957 -431: c492ebc57c483a2e9b696db4b20a7d06246ddf8eea54e374d6692f1557528c06 -432: 82dd34db76d8eac6badba158292cf14249f78c39e27219aa8438ff147d6c3686 -433: f71d583756b28252c751cc4f86b96ac2b24fd3edcd87c89920fb7cabd84babac -434: 0c00bc0ff60cf805bf9f92df1780f5966610f24352cd533a2988dab8d59f4dd6 -435: 52d23dc9cd06ac01737352ddcf5240e911361c21403b997b417476079db87454 -436: ec9c3e840bb9068563e655fc0115b5f2320ac1e26e91bf6af4d92512b1191a99 -437: 796fd5cea33f547b238d9c191248348e034ed06f008cf8b4bafc428a52ba9d04 -438: 400aed2a17301c211f09c92449841d9bc11246db124d6f1f1c584c0589116434 -439: f4c457c53d3ab63c03f3ccc4a18a9e45682a9dbd7dacc809fbfd20a2a7e95bec -440: 3c24b2f357d6ad70a76da8629813ebcf1a82b5dff8e73f4903709fb4214f5ae6 -441: cd1328d67eef562365c873d1cb56eefecfe886e6e6197f98273ec2b2d642168e -442: e36b514415523ce85e7c285edd862b158e60e5eb47b45d4b3c907a9cab4e6015 -443: 0cb9c2d05d74b1acc77eb6c71e8dd69d2b2788ff3e1d40e214694abd1521121e -444: 49d7ad342aa3876e558622dd03938a6aac258784ff02d1c474ee3ddabca6bb46 -445: 15341339c524f870272f562886acb9e8237330a29f89038e61066182d927fce9 -446: 02488037fc6e3b89cf003af6f4ec63ed4203384266c064a7992e0c05a4bdf14a -447: 2dad5437171fa3401711b6fa7b4774ef6c5ad2a8070abeb6229e658ab3bc04b3 -448: 2b93fdb14add3c52d2519a2fecdc906893ae77ca2756ae6290a62af5ba0330ca -449: 08627f60d00e95c42b53bdd5eb8d08b9360fc1795191525cb5f9ca9dacdf4dab -450: 76f89b17a70f96f2fbb35119211f070fc6e5d71bf75c2b60596d6ae277ddde9f -451: 4e2319c28de62374e7e20f639ed19df7dd0208b6fa729385d8a97b7ec0085179 -452: ecf6bb771055ffd58c77062f15611853f496708608065ac61036d7e01f50ba4e -453: 6815c2382af401c3f5b65fdee1270d065bd53c38eda08985fa4699b02c975095 -454: 397db724108990d5a402ddacc938debcaf8b3f9b467dd76110a0dc146b451042 -455: ff534e92474626cfe49c76261d074cbc93c442f9729f6052119bc2c97ec27f0a -456: 78e86805f8b263632bbd8fb30f3ae913fe5b71241ba701665b7fd73a9087d9ed -457: a8badf35f8fd4168f41779aaf5db3b51a01952b731ccf0ab04d65924905ae4a6 -458: 188a69be9bd313c3abf0d2c9f86654cf1e56add4189cc9413456a51947b421a6 -459: 8af25821481a3fa7137e3d957c64a97d0204f9861bf6a8701fafb20dc4baef6e -460: 6a8a04c755de9c6044fe243e31b45a3d5963f22c5323be74eb04965ed419aa54 -461: a817f1b7b748b0236c255df87d31be1dcb5b4499992de7d9b9ae0d259ae91e48 -462: b7290cba8e24e6b9ff81fb5b914dcb248a58bea9b021ac625a7c9f29c8a3ad8b -463: d2e4f2a835d2ea8e382099975ddd354bb129019f61b9d56326386f5ffbe0c2b2 -464: 54db5f0f6e4746652405abed569c91282193261669c7daa31e8e649f3522a79f -465: 50cb4b5862df24e4065c94c71b27606a3f811361ddbaa2664aa7c88dad151173 -466: cadf8e317c0dd6c53d36b99f832a30ae150a32c1d9e2a95e0dbe9219fee60e83 -467: 29196500ec6a1375916b0147c353b8a4921aae592f51fb7b492c3526c2b75139 -468: 7766b257b8e202072cc2d65999388f60f55b30517646b258bb5075845fc7e4c5 -469: 211a46ca3d1280a830bfe997fcd7fa606f56547fdad9a2141e87b67af443495a -470: 18e523ef28da5d53433aac9491ee418c7785e82ba8b84c9bf091ab25a709ed10 -471: ca746cb23c094d3add9a0ac70cc966656563bee80fdb1cd9d729a69da2f1ba34 -472: 87b9a1347f0e33ddfcb4f618a3701d59b57d6394d439474bb7016d427fbe276e -473: 22bc2c81b6f94c84ab0fb79b3a7b2684ab7e8251caa08be6b8701aaab24ca5d8 -474: 5d10fcb4b8ac2461185f5417f5902b4c000cfc73acaff798d8521c77456f51bf -475: 8141b5641ebc92599e3f5a7e14546eb15d2fa8a791946bf0a84657a346525cd1 -476: bc82d29fffb497b8c2a9fbcd2e95b85fba93cf985cdb56461e59b69ffebb7f22 -477: 0a57dbe66466333ec1d7ebdfb6100a903697c45b99e0ac3f4a659ab368ae1a85 -478: 51ce84d63b52a81becf17ed59ae68be2ebd629729d5d4d5a2f1583d744bd2a88 -479: 48aa59c51a05b0a5e61ecd89c2bc8eac6c10d05417ec000cd7580ff52b4e81f6 -480: 16f73e3ade83ed3c9ef33e3c0c01a5686b33a05fe1b18308e823bc2e504136af -481: edb9856e42e585fb13ed96b367364f98abe4de71e2e423d8fe7c6de5be223345 -482: fcc764222c981a04504bbd3c32bc7727600b5c1f9b386e22a226a668dbda0c87 -483: 1981e5927b9fd162ab0bbb5a365b9ed8e247724334fc59ad28e394a6c4be899c -484: 90cbee09dd7935d6837b9a1b67f9405452603ba5b228bf7a8549a2abc78fd255 -485: e504621151f680b6086984a4ee2d15857da704a659974af5ef93be2d1a9c356b -486: 203bc8fa7a5c11b2eef3e268df252033193381dc8258ede81e88143ef23a8b5f -487: afe30eff8e40220ca4e024fa0b94a46fcc42c0cb55df68471665b27732a60a59 -488: 48fee4b0bdb44c09ff517e0bafbc35c7b825379d3ae21924ef0a44433b6a0447 -489: 276c7d526581af81956eb0e247e55925c069a843ff139bc2ec057b5b2293b689 -490: d238303b4abec814253fcef18081a517c4ef3608cbe6a4101edc61c7c70055e5 -491: 84a409eaa8a75a5c91c97b3969d0987dd9034901c960ed9cba49994f0bd8372c -492: 03e947ec08b722db55035664aa0342bbfa6758bc164914365775dab315bc4fd2 -493: c23338219a7fabf5220ee25cd9f033ce9061d7d5bcde28f9b0110a8d43b3ebbb -494: 092bb0db220936de15bd23e6aa1129c52c6b7033e6f801f7dd052bee713456be -495: 5c6f720499c979727710b23ef59996f4cb44e39a95aad30e1e395f05722dd749 -496: e6f72d91a5b12e3740837467c1f577e4893965d0bcb1d5b56dd2488a273ae016 -497: 1d8466d5bc2c57f3d39b4aa8fed21acbdeee64edad2f0b62de769b4e0822edf3 -498: 9f5ded99162815de77cc21dfbbf69a3f96e9a7b6b2c86f50b1c511dba25360ea -499: 3b9fedbcb2d3e8a6a4bcca281e409e1dba4dd05adc2623390f68956711cb9c3a -500: 7d1b86dee381d8053344099d321854dec6d1ac7e7b7d63e587211a3c23f4e72b -501: 4695651d56ec6ffbd43e3b8639f1b417806d9fc8af1ef6ed8d08e644686c817d -502: c48d004fb14c505ce06d9f421ce0d35656c448d631515f8652ce931c1d4f8eb0 -503: ec475e34472eb053e407782d27b173ef82c06d3088270b7da089f7c7e2cf493c -504: e5ba57405abcc5d8e5b79013f8325915fd0cfa08a59f3860b83460080c3e70c7 -505: 94f3e311302ed65044838b6dc97d51b414b5e7949ee23520a9052c21d486688f -506: 33b34f47628081709b85af96e54f4a94c882d06efffd34ff5a5169b5751f1af3 -507: 8c02a790b27b4d6e792db8951dc9b0f1f48c0e1338efbedac92e485a9c6e3df3 -508: 6a52e76d0066a0b76789b0210d26d8812f06f7c8d7d0a968d901cc16800bfcb7 -509: 2fad4c278b249feb6bc654c7f80bf6c7c084457980ea4a95b8479088dc3ee562 -510: da0583e7b44f358b26a83db200c8793f60164347410f108951816718d55b040a -511: de11abe66ba38bc11b0439129fb6ceaf39948b27cafa3275890cb05f2a805f65 -512: d2dcc2993839741afe2de012f94b03681fe5549ded0ee3316e48b7597359dc69 -513: d88520e62209cc1fde3c9b16ec40ddcba1b57f06bf9a5146dc9014ec446e6f29 -514: 242514918e564473ca0d96285b7ec23bb5e106b86977ee72cc5fd49bafc2ae59 -515: cffc937d5057e24f8365f89ae7b2b6afa8c8bf6ded43774342756572f2a8120b -516: 05c1ae4da63b088c7a6446c94506469f83f78dd9fdccf0ffc554a0234bee96a9 -517: 6b837bbe45a0392499efcb1fa9d0a183fa265f259a0913a685fbb6fbabd9cfd0 -518: 0233c64a15db203e102e92b949ff8f5687f122b73a6098d873995d3a69f3afe8 -519: de996204b8668ea35758f4a434a82738d2e4df397d56d5e44edbf75562967d9c -520: 5847a852cde88f947554f4ec2e0f8df4276ea4ce28431dab17b849e820069163 -521: 434b92148bbff5d2286e0e80eaa0c4a3eb53c7a666ba23777e7bc458a3201ac0 -522: da5a927529243cee03f6c1398e41447ef5bdebbf61cc25817c688005d45b0cb3 -523: d838b16255c39410f535eded20ae4a2a14ed4196bbdc272c4ba13de25217329d -524: f46cee99cccb920d7c9567e571c793ac3020adf9502302faeca2c0dddf1f08e4 -525: 1e5c71266cc073d99f10093786d1d141770cfcd510431870662fa857dbaf6a5c -526: 602ea3fcd4d90de7a8b5dfcf65a61d53328f2edadbbbf14c62b2a6f9c3213a5c -527: ff707c27b1d462f2cbd191f8555d2bb197a24480ff61efd0ce99b521878afc6f -528: c47995d2a690c25de33d55754d77ba8da2e841a86abd46197db2f5863524c78e -529: 89b542b5508c1821a670a2745fef3b56b7e9a0f8aeb2f8bb2149e90c75e2139a -530: d5b89eaac746528526cef9f99a3bfbabf9ce9b6ff604c1971974c8d27442981b -531: c9cdfc6cc2de550a33ce68f4848b4c619f0b425b699f2a2b76d2db475f6f7573 -532: 9600f94b77994e18c362504cc144643e90419eae3f468d3ab4e390e429d0d5b2 -533: 7ce9cb9bf84b35a763110b7f66e0be7a271371a78a5376712c19447534451db7 -534: e9a8b50d03e1972741424c2c16b37166fd2d8b6fa17d6de9a0ea6d5b500adcf4 -535: af46270f70661306342e4d96df5f73c51be87a7cc9208e31356129d2d255a9ec -536: 0b84feddb3d62c3515b4e0a082f485313a7583d1e69d28f5b56928b177bde02d -537: b78ab7ef9a782179abb877115e70e9ae8a4df5a2532bc6d70a49137524d18c0f -538: 0eee1d4fe4ba096f194d4bfa30bcaa12cd5c5010b42c81997034a8ad71de5738 -539: 1d750f1fd643cc8cd360ac7ae41292051c7aedfff4ded6b61566739aa90890c3 -540: 38feb94cbbb3637ac27d561b97274ce8340d9f49617cefee8884ed94de6ac579 -541: 67d18d9524de82f3cb9048127d4c429f9d4b33ad3a9aa99ce86e34bbddf81488 -542: 24dba4f062cce959ebcf758e3be0363905a80b191835bf4333e5c572c085ecb5 -543: a0945db8081383cfed2d66fb9f79774a953ffc9dd6990548da55c90b800077c9 -544: fcf77a9d1f6c84048163f9f1ba21eedbef74dc62c12505a23934b8637758fc0b -545: 6768ee1dfc4d9aec0fbcabd35ec91642bab1782d5b5512fd1e41bced92cee73d -546: ca536e3396347e0495b021e2e84003985d9304360c1505e0031f6c1e5b6e74ee -547: 6dde51e539def3bea08bec0d63d740dd61b66fd16f64296609db33103d76b7b1 -548: 28f4238ed0a8e8eeb50b1b49bb0017a5cce0b2f42816caba49464096d602b8a1 -549: 173c9fdeabdf4be0e5b8dbd4784cbc808e093750e2397388cff3c5979d875ff4 -550: 99a27a37ac53b36ddec9cc432b16d44f596d7173184d0bbdf1547a4e04e3a1ce -551: 86413f744576d0260415fac0247dbd61a3867fd329004217a9141f2b0e5bd2e4 -552: f2f8c905ecd61ae2aa8de239c64fbd7b5f0c847ab18e56177d76240a626008c5 -553: 862936291eebe5ecccb4b213d74c9a7f022772fe1add00f7af5ac4ff6223e346 -554: 0c47fb1f36affdec39eedc88fe9bc3afe65f910047fe9677583d109837da43c8 -555: f7cc0f262bdaa131c9b582d8ba3543f4de14e069eb8453b9c6435900b2628b6c -556: b5231f7d4bcecc3cac63cb530c6ae7ea7560f0c27e41557b6ac1146a2c1eb568 -557: e8599934318acdd2ef5e7fc634960d76700c92d313dda306c2cb17515a327c3f -558: dbd646fd923cfc9b10ae498511d6f131ee8c985060590b06ae3678fb8b46b5c8 -559: 6d52ecb66f21882690258d77f9382c35540363077fd6086fbe4682a84eea11bb -560: 07d78a6e3ea3c7f98de73559adb9e489cae8af8607a1fb3d79abc150f553319e -561: 4953e8f819a2add9b23853b06bb97e26c7fc49acd8cc1e0b4684a5d766f35a53 -562: 781b2f97f00f73debc515a175ba66083069d9f1506b4d6232acfab6a0a3ba939 -563: fe3ea15a76ef7006d987d06dca3e0f25ec94f0a25fcf3b0ef7240e3d6c47bd2c -564: 7ee11817f2ca5f9a6b0d7372849ce31baa3269e1b1780c5f1e0d80716c357088 -565: fe2da2c4071d83642a5720718e49aa5a44a5bcba7e8f8935f4021e0955436a5a -566: ae74a9faea147eca57ca27b6e735eb1aa8ece530448730c99871a39075870131 -567: e3464d5fbea3f20e2b73f63be61c455ca0a518f989b9d18ada7b790dbdc63fb7 -568: 6b48f7b2989583e8718603b3a62836a99ea5b37853d7bca7b70d52efedf02d73 -569: d460ef41f4932d9f4b1cd07da8f935b6fdecb23ff8b269c80e86bc7525c6f72f -570: 64ae878a73ff936644eeaef0338138b29e0a3708bf4e99cbbc654b94c4f172ff -571: 1a4965900231ba33d6d2a629c4eea67599342d97f9b0d859ffda8892f51d0fe5 -572: 105af97fddd8f0915dda627d3c122c7866b541d6a39f5ad8a77fa648c222ee68 -573: 79502abc9bd09ad2f2a3e454d348723a6ba623fccf95025ac9feb0f9de4db246 -574: 558fa2ea8d21782f73c50ce20441385feab4e386afa3359fd035921161dab934 -575: d8446ce7590ed28036768d268431115d1c8118bee49c74bf6f1181611acdee49 -576: 9b4a90d2d7654e229dc2035300ea60a901c7bd96649bc8d5aca1a738baed038b -577: 798270bd135c927db2e94714661d36600c8d66ca3060acdc991bf42d918c079f -578: d7120b2db88536e9934d96390ed9ef1eb11ce428d0b2b1bec41c8b1fbe51110e -579: e001c6c8468fc9caa9c0e42a731356aef769913b105945c498efa8c95718b06b -580: 0f62ec1075014e7e869cc697c5670bcd4a669c979a8cc1dcaa38e41ce67e296c -581: e5ac3f8d559a392edbd7d6ac10a89f2f09808f9eb9c720189040dbb0f87a7b60 -582: 64e2b58930dd78a546bc5b7e55f65cf44595435397f5253401d3a31e0c30b317 -583: 263373377014da213a97247cf6506808d90e15e1af57d5c13d8d53566b5a5461 -584: 9aa6715383e79f4a1ee8b8cc86f128dd84a4982d3c5a6f156b31e4472737c83c -585: 1925d844b25759a842c33263f155d29878b36fde630777ae0a97e2fe85cc00fa -586: e9e11491a037153d2fd0853c8eb489a6bf5fdd97c951c2b3bad7807a12f2bbd9 -587: 3d2e8b0160b56435c74603ff172092ff34ec4f82e614cc4c445e162ea9e07ab6 -588: e99ffd1b1a61b6004364dbe66570f205dd74e60843cbd9e43dca8dbfca625fe3 -589: 629630ff8906d7c13cf9ff64a0b427ddf9e8941647d8efa200b38565f80e45f8 -590: ae56197bcc4790e52ad8636450e7a9c6011cc1b1b6571ffb5922662935ad5e8f -591: b4f2c342260a8b77d6a4afaa9fae0421bcfb16256d45ebaa80f658a3270b93c7 -592: 06b84e9eaa313e7381f3a25a3b2ee71a0e058af2dbada33c08efdbeeb6a4fe1b -593: 9d45e4b82e1f0eb022ecc8dda15b45e0e23964671eafcd7786f44de42a53534e -594: 6ca41d669a06431c20f359eb53a00e8e40bff623502c06975a53df2c24ad2740 -595: 09987c84090b121bb669491451fd36981e35059a315bb3510b2910e5cea7b703 -596: dbd7606eaf66ce092f8df17a864e7e58a82950c0aa4f59a2163e2e0b98e05966 -597: f408448625e8639af09d36d1b0b4a8475223dfe23d9b13c344f6efa9b0d79b55 -598: 67fd26f76aa8fde40ea32742e9564f318e4d30393c8c8b3efc1874d361a0c677 -599: ca232d6b3a3cc9555eab03a3023cf6957a95cfa1d7675db8ca191c5b31cae03a -600: ecdc0f7a4ccecee888019378fe1111b23e4906da170fd1e3cd9ea1593f941cd6 -601: a2c19a29adae2d8a541915b310c566d55ea29cc7e3ac91f7fd3a88cce40c39a6 -602: bd042cabea0461654574055fcb4214f45dc5f7cc1d8aa821e259267d86eb8c52 -603: 69e0e38d26d191529a5b11f19ae3c78c8909855b6bb31660b5af80ddba964ef9 -604: 7bf4908e45ca86a3fb79c7e6a09f604ccc9c557974483aeb5b8f473e0c3f0a38 -605: 0ebdfc4dbca222ec3f4209d36e6235a433c2ec5f064592ad2724107ab6d2abb3 -606: f60e345855d5d683c432900a9a233fe853b812f6bd8446601bf8d410c3e67c36 -607: e4d5c7bf1ca47fcd5179833beb7a8489e910fbe93ecbc34a7c912c358b45bb33 -608: f9f127ddb0330d7588f3711a22d9372763b4661c63db217e1561c3b6ae45ad14 -609: f0822a7a0511193fd6f5a29ed39d8e8f737225fe3e7d8d90c704a032290ed1df -610: e07fb2450d06ac2305eb3fefb4b16b6eb3996bf91f98df58ab4af7bf4b24a5c7 -611: e6b0afff326f7f36b65b095072a19b0e104cca0dbf27529a7f39a0acefe8b3a5 -612: 30bbf45da7bd0d24f706803eabbbebbf78fc67f98e0af4d68524025be2de183b -613: 9446910610590058b8b7a5079920d545e633b7b7a98a114303ce332e34e1ea31 -614: 7a11ad209cdfd258c5be5247c594103ace97affeb5adb140b3bf4b9a164ab4ae -615: 561775fa45d789a4912019093df2cea17402a556110038b90fe8901d3ab910f2 -616: c40d48d0551a2fa949c0c19751b3ae0027ee1169ad96e9dec2bcd06c6f43bc0b -617: 675519f03c8208cce08fa91f718484864504085354356790c058ab9aab3009b2 -618: 8dc12b12cd525177c298c4c925748af02ebf14b8dc5feaee4bfb75c1218bdb9d -619: 62cb61ef8ecc400740115f39bbfd492232761effd72f67f2edf7a4943802b7ae -620: 6935a0079903436cefe716a592752a3941c38c6fc81a52b70c0d79213d157583 -621: 42e01b526623a41ec90659f1f3e7566c07254e21e5c3c4d8ec5d63d99a3905a2 -622: 8e0d64ed83799c1081e5eef417e3a8bf0e7b33f7c3458896e568cedca96f4b68 -623: 16854b1163fba8b8d5328637af0d7834b62318e11271f482bf3b31309bf9c89c -624: 8cfe1d643d67031da6ab55fa27e2017915466c5775822ac29bb303bb18f61830 -625: 1dc6034d71d1f5f1459607c478ea4aabd826e50c59d891a8cf36f6304053b478 -626: 2aaac5bcf9d5587a16a51d1ed47ff084105174d6b5f2ddbf2cfeef6664728970 -627: 61508285a773bab75cebfcfe19372867f10f80195fd58f4e4b829f857d769aa0 -628: ac208911d276d644dd122190ec1dd4be77852c108f140bdc1e8bf353e5f381fb -629: 9d74cf92c621a9cd48e4e658f4a01d2c9b245cfb616bca6247e0091e7533a705 -630: 6243a40194637f3bd50e96d703b8f5c7a4f60ed7b71da7051b7abe4d1155b229 -631: 06fa690518c85c3aaecb3ebbf5fb049deeb95354789354e77f0e87f714589f09 -632: 5f359792b9fc023075e078126bafb2630c07c55cac746cec7b24dd52b55e5493 -633: 7ca64000ea0cabc0bc80372a13fc49e3e19372072378561d69ecaa716cc32cac -634: 973cdfc51bee2d6e46eff4ba47f2f8dad5edbd278256a98383f3416ee1ece09a -635: a906682cd85185924191c3873491a18b134f371b3de306946e485cf2e58c04a9 -636: ac11e1fa3e0f28955fac401f434d384a6490c7b4309aab903d6fedde86ff044f -637: e95a1d5e94da3939a9ea1853ca677b7b4524636ba85ba6ddb3889337fb6731f1 -638: f91877dd03a80fafde2c3a39eeda2ecb4a12ad8e308b6a1df6a182580bcdba9a -639: fdcfd665e5ec4e69f48a8cade948e319b79388d3f2ff21d99d4f96b5c07e2459 -640: 3c65738454971b3a3f7df085a917c24243776ccc968e2ef2428f59e9a0519188 -641: 13c90cb776f1531391b36f927bbb760e29dce4384a42f6b071c22df66d06568e -642: 9beea97e1746d96db9347e330df0e92b5e05efe2c72f5b0a0f6e621d39fd450d -643: e3ec99168ea8353837cfea97f45c3cf297805d1cd3cb46ab54bbb35d0e82e828 -644: 1844c799ba1b7f308969f30f2e597974cdac7cb4ab8c027f82c67b7bf09db7ff -645: 40eb7652ace2dd1ba383972f70cfc3eed35bc85260cdbb001cc0e151f7edfff4 -646: ce4167189ca6c39a025e4a749ae0fa726406a71d6a0c4b10f266cfa6a9d34ccb -647: aff90a63a4a5e46e58d9fb16d33f06f8fdc15a73c7c690dd02e7a9f4576dadcc -648: d842bdf7ea299274d3bb91fc362e4dd4f3c28237e9d621e0f97488afa9a02369 -649: 18601f93b8240474442b832cf1aafd541b32fc47cd024bc626fcc850fddeeb55 -650: dacdbf42cb89fceb79d1d8bf8c583bc127c42e22c7fdb7fcc38ddcae39b1f62a -651: 7cb09fd65dea49174aad61b0cdc7c53e2b4d755816e1137c52ef721ec1b19169 -652: 8be09d653c065e39f84ba4312ff40abc6ada795ece77880a45579407c9bfdd01 -653: 41cdbfc8df373987d7a4645cabdb323ef92eb2e149b95b1cb389352686948c5f -654: 54dff6778bb9a8737f1eaea2247731d70620b74d4d2bedcc492a9768cdbc1e06 -655: 1ef22db51009e59fca54a417c071def94551ecaff885ce191179f2bc486565fd -656: 217294d1818c40457dae5f3a19368972c7375dbd4b1208c62f024a31ce3887f9 -657: e0d0f7c5f46849f29808d598cb9b08fb2517fb38d29a4ab1da969d956b1edafa -658: b3604457af6e43b8719e214620a6ce14f8c22c60a608381275e5b376ffeeff84 -659: 21e6ec5256747ee8ed0e1e4f6d461f8e72e5421598460c0923984e310eb5b3a4 -660: ed4acf4aba6c1f3a7dae1f27c14f298a7966c444e8c70b6ce1ce0c0b6daf2a41 -661: 0547af4c292895a4c18d6be5b2ac9f862f363a36bbfd52d46adb490175fb55ec -662: 3f08179b52d97e7372de73ddb39cd16211d212b0bc2c1790094b33781283e1be -663: 37ad8e73e6a01fd8bb930cb3fd00d43692d8c83d37b4ce6602ee531b282c0075 -664: 81b8b053eae44bab64dfc2074c706d52c748d75cd6231029e9f88e08dd670272 -665: 91e1f3207d4b0f56cfe64aa422c06a4245d701529df5d55ab419d5a51e0cf122 -666: 55bba2503739c92878cde322151f1858972c3ad0cf96c0eac0cd7d6c3b9e4077 -667: 1882000b8a909763214eb3116e4246c9ec71207a3c306d7fb6ee3ab82de42ab2 -668: 4c884909e219886a50d8100a12bcfb356091076fd6f144fd35b6854307d465e2 -669: 8c0aa56a953a170a3ff4ce778e7390362516837dc29bdfcb801a13f45463042b -670: 25bddc5907720ab48ae5b6ea70fbb97a387b1cd5d2a3b6786b15270283f2dfa8 -671: 872d1272dffc2f9ab8742a08a8ba2d38e49a5a6fca74ea6e6e60331ecbe39137 -672: 25755f0de23d9e58811332e75584370259973c264b7028e9f68bffb0d073e52c -673: 0b96eb45fb17a8a80aa73a0e7500e038232dce2269f9abf2add880fc4e2dd081 -674: 085954a53c62269bdc9d78c7c45ca58f5c0220f224c7cdd8b7bae4b6d0fd5fe7 -675: 670051db6c0fb0f947f5d7a11d6bcca2f73901b7b05662cb238cf04ba0d9e556 -676: f8f7c37e0beb0b45654e7f2f03e5a36b86144e5bfef8c580e1d12e6116cb62de -677: d657facc720b596aa8b5965df5e38ef9106e0db6bfb6846e4d9a8ed8900bb8a2 -678: f501202de6e6a53bc96325600a0895f830ee20f4b03d81f98af56fcdf7605f96 -679: 558f0c67d147748bdc5472f4be0584dad452cff1ce1822f4f1ae2355020ff9aa -680: 09096d4a259c1c60bbcd25563301520fc5707106fedd30aa757f8790bab07d25 -681: 5ae02477e97e3f282a912fdcfedbedc45b6f48db463bf1a00e6208cf3a8bab6f -682: c2ae4a0b03e6bde0f10f82cb3b74fadd3952ebf9dcf8eabb3f24b2f4e3e2b0c6 -683: 14af46432e8204cb27f1f37d12605f72d483aaa58164e16a9a0318bc6da38abb -684: 9798e1db236fff527fea4b493d38c7f13200a80c20238dbaac17657d1c8331a9 -685: 6db3cb731b30463f68fd3129da52623d09a8c0913cbdf45c0ee680d062b7b014 -686: 7630c889c0ed3cbf196c307a6b13b5314c35f8e08efbfb85680aa8f56d8b4073 -687: 156cb56203ce9103881c2f173ef69dcd31e374dcfa00844d909246e863c9ebcf -688: a2bbcaabfe54517da51cbfc527f0e5768d6aecd5a6f71c4c70d90ae3054f5518 -689: ec7f5af5f68937aa3bb2e29f89a76c110bed1740ed5cddbb31a4bbd4d8658c3d -690: 7b1e011cc68d027165e019b9e8e070616cfc4009d56d366eaaa4cab247b423ea -691: 6cb2221d41e75df3b985d2647836a26d08f78be70b7d8028555b1b82dd17b175 -692: 7027e565c0e317fb988f6954622a47a6c03e5d6ee9b7f38dad7f8a01ba315887 -693: d329fbd15068a51d3daa23ffa59d8e0d5c2be54535eedd0a249443bf3111059f -694: 058e67814877f19a4d38f3578e63ecc63b450763cceb5f93d6baf6708c6165b4 -695: cab5ae80484fc8573e274316d10e2e6b71d64a5495b451817d59d37fc62cc118 -696: b02002fcae0d4643be5940d223d8d22029fdacd277d153f4833c10fdf502cd77 -697: b245a5c7d95ec8c1cf1cb22dc679847b982d55f3dad6add28ee01b67a6f41fb3 -698: 3f388119f98462ea94fb56e55862e083bd3f859a02e3ef23f25c949cb9b7f5cd -699: c381b56202caa27cfa4e42fec6d238310472bb8e871da0cb47082388de7783ef -700: 0193afd46bb14686ad253297bd7f1083ad6a6940557fceb89461a9aeb6c3d47c -701: dcad33f663c6716db58b5a94edd0b758dcae719b37cac7e6a58db609f9b9667b -702: 551004d18fb394492e86ff7b76c1ca7bf4c83dff5c1ab5535428f217a14cd602 -703: 77bd6a37b0aff970095be63545ca1cf02e28e282240d1ade1e5d080a7c92da12 -704: 902fe8b742e49a4e68af91a8b4c0c78978bdf77855f5af1a010538724194fed9 -705: a1c9180fc41e810a19223ac72f897824ac6d2f59c2ea38cef85917562145ed55 -706: 341d0a96981cbd4347eb91fcccd144f35a7b0967dea0d6c64031b8fcb46b610b -707: e1a629e9a39784a0c28e3dbb2abcbeb83b07680fb17d410d1b8954ed6ea290b5 -708: 0d781c220748957cc95d3153d4b247a2e9ee546278f06e4798bb2151797990c6 -709: 63912204722a1754af57ffa997b549db1ebdf5433c1be42e6af6f9ec482ddd90 -710: 0f61dc240b6fd221221b377f0345a2cff7f13da41d4bd1696c81cff5778f1bec -711: 91ea7c1927cdf2cbb1263650afb35ada8da7d34d98e2686c50962b30b1508ce4 -712: 6e7c14bef3922a5c8a11953512011f61f75509193caf284930a585fff49c870d -713: 99b34c9fd41ebebb6076b75ab3b22da39a9488e4538d6fc016e45727fae8572f -714: b4259f3d957f9561144098aa8b3541731155806ef06b403c2dd4ea4314e19fdc -715: 86e328d35205220f7befd72634d61c329f56a55ffecb247ee83832dd1fe36d63 -716: 6d3386b03689e959ee171e2cc6d3ecf9b250604f34da80387fe1c3b139b6c0ec -717: 039f3c02d3ba2e24ca8a6057272b987e2e55acb88bde7dbf92ad36c49bfc9344 -718: 715e95be267ba0eaecbd230f6942a1eda2d4d8ff36c8b72948a7f721ffeff3bb -719: b4ccb610ffe7c154f7f1d588f597294d2c68c2dd725ec98fe03e71cabc37cdd3 -720: 8bcf65644a63c50a37e09e3cbaa8d771ab92a0d71fef5dd94bb56a001035149a -721: 0993cae164b8e0ce36eb6d4bf7dc652106bb97101a8a7c45ee4dbe929c6052cb -722: f4ddfc20a477bb8fc717d7dc31d195aa4dc55d420af8999d5e40de5084c63834 -723: 4ddccb7c7b7628b354264d7dcfeeddafc1bf51241a20bd8b514852662ffa6e9b -724: e2de5267f2e4cb47946435c2ff943e5d66f7aa9d43497e192ed184cad165517b -725: 9d15b89c15b2db62cbab5119fa15ea4dfc49c1523b10916af61b194ab61488bd -726: 87ee80452ccbe78c55b2a7617c8aee128648f22c4456e42719675cbb7b506af3 -727: 4d5fcb9e907346e305ffc20fb57351f3ae2a43211c4af10dbb1e378b6220b9dd -728: 8129ada76295114f5073c4d5a613d0b632d95edbee3d8a1e10879bce6b81f4d6 -729: 5c5c1f33a4c0ae21c872d8790ea0fcef0960c720fb369880cf5d0086d158612d -730: c4586915ee3ff4e0547d29a546f03d197d33d9f0bc1aabf2e4c0db19b87afe6a -731: 665fa3786202ed507fb2df7cca87dce2c0be5f4fd125dca54e9132d1c0028acd -732: ace821e7584a41471b2e555a1c96384532211f6709d6301eac0622124684bd48 -733: 08633271be3a0ff80987897d45b2592ba11d3c482acf58b4ca3fba1cd2964582 -734: 1cd99f1dcf7cf5263aa8513e11970c77638d936978836e255f7be3dd3bc749cb -735: ce55387875b7f7eed70163b6fe9a4a07f10595fef4d77d0a572e3ee4917b4d5c -736: 9c5e5dd2f19515e894c42dc959ede7f1a0e818cf6a4289c15f54d25ca60b8f12 -737: df6af50b0b22b3d9253a56ae486cd14622268faafa94a25d34a1d1deb23311de -738: 1c45ff7fa7e20297a74256d37f1c518e3d49c960a847c5a9fbf89e400ad1b289 -739: 13322991f05eaf681a68cbb4978dbf26a12c1230ec91654d9e46169bc06bf181 -740: 7913ce5febf072c698215215b7cb4b180a9256e0ed63d754357899b2468f3134 -741: 46e44f2aab1eb83a979dc3dbbec17208dc26fc377899c2f532b5674da794e784 -742: 6af8e641c124bd85b05ec7278aaf1a8b4db3ab804a7a6216f83c399c334f1152 -743: 9392bfec887e2f83109c3b02d2095ec5822917304eaca799e3c9d261d74018d3 -744: fce4ee633e07834f473aa58e0044394aa1105f82931a2ea5f50118f16e18009b -745: ef14133b9e9f2f00b15ba3c9019fbd27755bd60e25dbea93c271e55337de66c4 -746: 13f95c9e923fc103eda110ec9cdee367d01daa39934f4a98e2fa4c8d508a0690 -747: 2b5910bb1e516298aca88c502c033409abc506e4e40adf84c58f737aa02fff9a -748: 010ea00917ac8f13d0e9d1a699a0b4f970d7a92f5f0676bfaf4734ca6fff1f63 -749: ac22984ca1e9bdecf3a8c81c4f5d8476745c6d44cc4ca3dcaeba6275bea17497 -750: 018910488e6cddc4d3a796f5bb981f456a049b46b5e53fe4dd90e55b54796d4b -751: 2f06445407652ac9e9af69570fa28f06179da64b6f9005f2910da20d1747b568 -752: 17c32324ff9ca42bade9d2da7edfee2b5088dc677c5ea0883b515a327b3e675e -753: 640a7770cc32e92ed3e1412c79495a3128b4928659f1bf7d9ff20e53e3dce174 -754: 7f8faa738137234bff364c457cbdab3b9bb2178b5d59d7b67584765b887ddf47 -755: a1564dd109d9dbb882fd221404b402ca046d268f592ef0db21ceeca9490f1d51 -756: 36dac69112b7c69315b52652f5a013bc6b6d4382e0d9f9681a34691a7af5bd21 -757: 1b8753eb292930ead17fba8755a8c6fd2a2cebc0899bfa0feb2edb91f2783feb -758: ae37c74438422742903ef30ae9c0130e4c860a2f11498082848edf6b15996bcf -759: fdaecaea39e2ec984e8c984d85292303de1e2ec12e0b75ab990bfa7e65a48c88 -760: 78867052f7feaf352e97dda57e7792b883ececc33790e47e761aaaa7f847027c -761: 8c73f0f9603bda755f7fe787d4679a2c15a133d6beb2e2cfca4706e992080e6c -762: 8b3ee45fa3a6cf9edca4576c028c9d28ac281f5bc69df1732e2185704537828d -763: 5736c03e2e08901bdeb740fc2a11697366e4b071e6a611c3e1b0be171dfb0c7e -764: efc3d8a8cfa82ad2b91460268ea2181d7043d9ae429f31cc6bf9dad560e01b88 -765: e48a56496817eea0b94249f00d42eb31b1823c700cfd503223430e5377b0debe -766: 0c0a87e714cbaa1b63d56912232130ff3f96cc91e332e40a471a92fcecba5b81 -767: 9bced3b9012155f5281cd83991fd328e15bb791cd2f9101c515633b1069c21cf -768: 929fef1fb81ef39d6f0bee50792bb01bbba750ed95359dd17349603d5c6c9cdd -769: a0298e71a6bb25d843f0a486c84b8af2dd96273939e9878de824dab5c6d41454 -770: 779c19bab13abc41e9398029b1810f0deefde87aabfd55e909ed0931b72f06f0 -771: 88f1b56d0fdc5f50833214e9a7046a980a84726ec281254e75ffa8ee81b24597 -772: 3a7c8ca4b0715d42df6ed02bdca7a6c28831786c3d997485c6be4297152ed0ee -773: 88a0f337b761e71843f41381e9499cf74bf2978a65e5e4481f663c5fa5929e73 -774: 76d365352800adca62fe521af012b686c0b209535bcc4f8b45cc9e728ebc9575 -775: f008acb3ea6cb87a29aaca44df6822d583fbf70d89c20b91f1310ead0d336780 -776: e18850ada303a7610faae0f4419b8b074077d8b382b3519333d0919b56e11134 -777: 95d3f06b9a095e832e32ea5b045de87de1bb3f1dee7aeb90f1a62fe1d8844c85 -778: fa72e0399e52403464714d857bdcc5ae78525e81d31109539ad9548e177878ba -779: 091c9e6519ad79728660cd1411222b96cd9384926c652e3b4fdd99bbe1b29784 -780: 3cd3d2b232a67cc1ef02be591b4fa891d31b2b87127ba63469751afb6bc38bfe -781: 0111a5800571127692423a0b5e64d2de2d8fca7c8a4f893a3a3efbb9ef73d63f -782: d4182bf05526cd1052f743b4d3084f5497e6d752011ae3beb3c884785f0088dd -783: af9f702f77c413a95c767ed22a1a7af5e1951fa09fb921a0c56728a901f88384 -784: 548e7fbc9ee3abef91e8f5d86b9fa2acd18b4e2b5b5f0b06993b020dfde7af2a -785: 76de3a6f51f1ce104ccd0ccfe9cdf2eddf3236bd237ad61d70e16e728f1f8830 -786: c7505bcaf65afd6fd64fc58ba1d0e7888ef4b1bc3c36de89115938850a9ea89d -787: 9de032b9b6d296a31542bb23b5f6451ad14d3c3d27f2f2af88c35a11c9b25beb -788: 9b59e2d98895c363229b3a13175dde2307f5e45e4de48c7e01fe5dd7a66d516c -789: f2290cd7d56562b49a63fa0a6fa75eb43182193e91eafb6de4d5b3a42114f5ef -790: da15453aea57615a06a92759b6906a3b3bfc65a49483f1b97f953d917170c0f9 -791: 7a6cce29f707485231b40c4d0fd2dc3e162dae1ace62e1ddf7227ee77c14bef8 -792: ba476b2558e6fb94308a78b5549e6572d81d7e2b3ebbb42e2f68e595f300aa2b -793: 827e82561dd5149f139a98ae48464c2e61abd7036c3435a388ae437577b98ea8 -794: 42d6226752a305940a4db24e77869c19e6c153a0b7e4409b254baa0e1bb6aa84 -795: 686e8e9fc0e75c0006f3b36cad1f125713d2c2a07162751d79d7b2c0b8d5129d -796: 22c1978979b722f631d051ccf8b22ae0d74c74c4209a013a253f00945360416b -797: 5405d6b8c0a154b56278c54d6a38368370aa62af2d7130bf45051c3959f40141 -798: 400307d1d50fc6132fe113bb8311243c1da0e6b57c78f9e2d5f7554f4e6df07e -799: dec6deb237e7d009ff60996b96e4e92cb197494f0cf5edb5312e1f60575c015c -800: df9fea12bf11f4d9b595455da7c69921f5dc40a427333fa7748fd66eeb017de3 -801: 2042c501563e32a88f4e2d9ef7e66be27571635b6a831ce41b28bc6c6df0eb52 -802: fb700a0f4398225ef5db5dcd6710f7eff80808d3f815801e14a24a61ebc424ef -803: dca2d9f1ba6568ce572ef1ba1fcae08a372b2f485c884860815438c5e3c69b88 -804: 17b3f6f18906ca20ab7f6b011f1cb522aa046c343f5bc04803530cb8537f0927 -805: f888238774bccaef845fdbd2a338831c13090afc7c344b1365e24bf1ed121ac9 -806: ec81d951ac4274fd4eb452baf6c236ccfeb18138429463f8e90d1524da12121c -807: 5cfb0fc4907a831e4c602c82c3f07fe4463bb3456fd6fd24ec78bb483accfd63 -808: 947236880fa0c1bb05b086b2f7412becc344fc3ffdc6f4dd00bfff31639228e3 -809: 259d05d2057d408df0bbede5bf5582baa01339493684d924f17a46b4f5aa4e8d -810: 1ed6143a41a75f6a9f6d42e98a2f29c6cdc935a8a7ff43b8ac59bf20e933f194 -811: 57e739cb621863d956a720b719a76a4be678b0ea731a3b777802b53cf78d3d21 -812: 6db449cca2b58ac27074e003cedac028c77a592d31d5fec2ac90b63108dc2c45 -813: c9ac45e17f6fce5e3aa0a963c5ab2af463422912e5a97e97b969d30aa5e71bfd -814: ae670f4be0ca416bf822562d1c136985473d93fa6c005565219c387459c9d463 -815: 64aa2f792bf77fd23b6d4050076d73c9b2ef972e04de3c4e4b772a75145bfb28 -816: b2b8810ff96b189c18de81253260f1f57d283c3a6d5d9f8d8a3350b7d7b4cbdd -817: 5c7db30147bfd07e81e7230d8d5e559255556dc7889d19f5a1b834ef6de92639 -818: 00617b68f6496cf88cb4728f889534d3b4ff83bc8ef9e214064a4d0511916a7b -819: ebf3905209b6aa1fe732dcf39507258e0faeadaabda8ff2bcbd028c2ee071155 -820: 1ad7cc67a00035019d548ad7d8f01567f30c989f2c02088e9d18c864f7cb8054 -821: 5f12fe6bef45c836311ca3681c08f82796dffbf1e6893272acf26139333a7653 -822: 4c804c8ae2f4187ccc2af13aaca740d2f0ea8ef1593bb2f65640d4d9cdc19d42 -823: 52becac90562e114784b7542dcda300834a4cf3d2289e0203ea9b1751318e94b -824: f318c6a0b5af61b3cbaa5251d849636e68ab6c29bf361e81610d259e5f9a1c9b -825: 1210b493270eb4617cf3398c05281ab67bb2415cc7780d9290761250eab9ef5a -826: 166a3084fc7ddb404d39e4d487881d7e7488024e77c827c86d80698967ef0439 -827: f7e8df8d6c83b694e8e3067582eb9cc4d8aadabde048a3c54894bd40f94b121e -828: 4289388178c1473632da87084d13c09a92a19ee32d085d717ea5f7b15f8733d7 -829: c11fb521a4d1287b82e982531229d811e0cf75b049979c592d48835b3fdc5ab7 -830: 7b25b4347a6cd7f79fe6a2e123e2bcd3c5f7c64e5701474e116677c680c847eb -831: 3bd669ded341ad240b3cca32e2246044e788e92346759c677c25b588d336eb9c -832: 469e448de67d33b679213d1fd4383af4eb663312d2b039aae59a7ea55f47d48f -833: 1e19b3f199afe7bea42e85233dadc186dc7db1c34eb0222c40100443f1c372bf -834: 020b1df2133447fd8d2d1d8caca7a80ba666184c243eab0d52333f026d4c8488 -835: 017f82bb4ef093de828031eccb2e19929839344b00fd424113b9b170081f7d23 -836: e114a5bd110ede150c872c12df640eac7547f2c3b093b4f368ef1b17d5efa42f -837: a36b110e907ed59a4422c82d2107923fdaf8130b4bc216aec7a11ba803a31a1d -838: 01519d8b064806e5da350a1c102d07e94fe5334fe4d23759356703994763c4c1 -839: df4e0927f31ea17664543c2505bfd90f4df67c620d979243ce80e9ce6aff0db1 -840: 28697719928efd0d8502578d1ab317b772ec0e7fce2a64d1a174d7ff6dbbc943 -841: 5aea025c0ecdd11cc6849bd784eb8b591b2d6034dd4c9e11736f623cab205bc8 -842: 21b966650022484ba1bf969edcdb1ec5e71d2e9198721c99df860bfa3320b685 -843: a48629a370e3c8a8ea395c1381d6e7ee38165e29d70fe80074f1553c5ca12086 -844: 8f00714b53a5c63483c1a1ced92f0a7fbebea7e10b27e690b259c58a7e21b255 -845: 4a15be4e2173426025a7f7c2bcc0f9fe2fa070c5ad7d0185b2a7d4a2717b2d73 -846: f6da5b5d72df9883e373e6f7c647febff5929ad666307b3ff838f288fb20021e -847: d0c3a75990e3cd3effd916b8997f8ad39aecd2f40c7c59df5c6ed6ae2bd6ab73 -848: f08583778b92382380ac638e7f86c72549847cf3570ece9f28b02f71e0bc9b15 -849: 3d41f27a82ac10a8295a2cfb6f4422fba8ef5303094a845216e532d0998dd1e0 -850: 2cc2716e1e720a13304be73fe29a4db55a2ccbc95285783744077bef292b913b -851: b67ccae6fcf0d8cd364260c649c2135c606753784fcdab5411915795c6986dee -852: 31542a3723110e69b091960c13f0bb9bde2e7630c17ac9742ed5bd94df12f11e -853: 7b3f0517b1de93725cefe79227f54ed95166e363ed0b373da7274e0f56e6e433 -854: 5a2c88b0d041cb9037cc3bd64022978dcf2d1839b7b98789dca382521f4de7b7 -855: 99fc645dc0fa9183a7cd75ce5e133e3552cd890eeda2d79a6471383965757f5d -856: 8bcf278d8e51f0cdc959ef1f5ac79c411f5b5ff7c658d3cfe4d1312c9ddec0d1 -857: 5b1ce03ec386b8a4530e1c6e9d27c3ef54c0a8da3d2138ac2ff4d7bf89b14df0 -858: 6dd8aec81318cbc0bf2fb60653172af32ff62dd2ff8cb20bc0c1df82ed41edb5 -859: b2b6ab64ea6d8c8602bb063335ec0782c02174dbcc8ecec1d6160e030cac58d5 -860: 26271e73d07a7c45d017b5085c58c42914a74719c8d49979c678c5b4f8e76e28 -861: c6136d39d206890f5e8aa2aada84bec2cf50e405fbfae64b7b231ba880eef72a -862: ee8fd22fa072b9fe159209e4955772e67d225ad2a9d169c30f6e468b5d5b1c91 -863: c73ad82fcd868b622f9b5e136915894739801093cbb84c8849a838d6ebe729a3 -864: bca23c98fc655392ba07e97b3a3cd5746c684f7131be2fc95a7d5b92d80ce755 -865: 5290cac580cd15da39312bc9f35de883590b4d42d481854e488d33794f47ac34 -866: 0af6a1b3b5a923b24b7f6be599c2475e2007165ef088230cabb9ba47f2467f5a -867: 5c3a4ba29214bf3532af5110ff7f1be43e1d828e181653064f08f0ba65556e16 -868: efe62d93c082b86ca8185dd01dcb848c247412aad460b3f98bd7394c333a4499 -869: f917605bc5eb01ec880886992db6dd8dcca845f013eac800d21082098d660f3c -870: d745dbb46f8e55d21378a0c6f070f851b05a5d0d77fabf7182cbe0b75ece39ae -871: 8a254ccb12d77511b4818302a7cf7a4010830554ff0396a105985fc4a7f0adf7 -872: 446af701e2c7dd921c6c157ea68c7ffb2881e489e06bffc555bf2241dba2893b -873: 2602237a6aa03fd4b36df0b938f1c49f610ed92bae6ed1b7b60ec172ff395e82 -874: f375e7a552540bf63d5e69c663e4b2de721435ff57d9f00476d9241c05913039 -875: 26edf4b92a2d80a8904da7d91ddd617fe97a4d741ee74e02f732dc350abced89 -876: edfdfc01d71eae7142c218f5be3867878232d25c0e503be8053851aa4c31b657 -877: 015a35e8fbc9e2355e220b6e07cc21049322031b2940121c71058a8d9c0ad791 -878: 1c241cbf578fc1b5875c13045d01cbb39564d1ac030c38b8a0add52c1c38c608 -879: 0399cc25a5426ae96f2f6cdf71abe0847082c2700076abd073d88862e4d32588 -880: 6dfacc9dcbf13ff79b66c487a678f81766bd2015da32fde451d904997ca5f8d1 -881: d684685ecca96d26094c9c0a391f606b7e874553b033ae90ef96fac18517bf01 -882: e6cfbf978ecc3fb19429203bd2c508a4bb1e1d419c313f554d20dcdbbca6d64d -883: b8df95ca983f4ef3ed0310b244f2f4318d6761564140cec095a16e023976354d -884: 3d09aad047499cb54bc9fdb4f634c09beff93422db01f7b8498d90493c32a21f -885: c4d2a3d1bb94a37768b512a87edcfa56c00cae560b74c48e46ebab9ec67955f0 -886: cd5728a9edb6066bcd9392114a0f18f4c70ccde8d9c24f3b459930c19e95e506 -887: 743b81138452ca16e51747a1662402ee0d9eac3550011931aec68a63727b6894 -888: ec0de7ecff31949c1922903825b76e67cf27c61d8fe100a5d0af52445aceb262 -889: ac98c3e8d99163b7c3f81f263468de61cd19cec791164a1a38ce0ab440aeb324 -890: b4bd0129e6cf5223eaacc456653fc43936d376d90abcc0f08604d0cb7eeb72c9 -891: d3ef730208652e44eb49ecebd0a0e0dd885e9ae13e608c2ea15690be6b0cfabe -892: 0cb39c3968bcb3d4df407cba298c3fdff967e494effcd9f4fb4dcf846d0ef7f3 -893: df067b52d70efe10ee799741354efc807f4cf323c6199ffa3006a89820196fec -894: 49c36112b26485e2c4184371937988ca9edfc53d0055ba438f7ac8f7466f4ae0 -895: 779075e7ba4d73acfeb8b00f20f03ecac57bfc4db7d907c33f65c10a65de890f -896: c9c078d711266ffe91f523384168b90f1bd00efc2da110778b9cba2f0871db49 -897: 4f2d2969f130c86498c3d4452a9769978990feaa3068bb338474e2063fb47364 -898: a84a2762530ef03398c4c7f4c456364848d91201bb0cb122ff5b18e9e39b0e23 -899: 8ec0cf65d1b765c086dde69a3ec04bc425342a4bdff439058440bb8958fae5f5 -900: d30cfe6d61b9fd4b017d6c9d7d9273e8418d0ae9b8fde5ae767ac80a6ea21901 -901: 3fcf48533859c643a0396c0b597dd9b3802d52c823b5fc9b76e6880fcfb840a8 -902: a5896436484d5efd5a74b8f467a15ad21993f411f27a262912940d4d85e2aaaa -903: 70dc9ceb90614f80df7c9c113b13307d71a4cabb766d09623d28383fa000f8de -904: 5acbfa317c6a381e91ac6c4e856cf341d8d017b6c4f378b2f283ae5fc683c9f7 -905: 2269a8c37a0489ce983f89e5610a5c992b010e9663ed854bc85826c5938ea65f -906: 9a759ebb80007327ca50b5d2d0c48a62ffbf75130b942f9ee05f33d69c997361 -907: cd625ce6c86f80cdae5d4256307200055674905dc4d97f93146ce60b4fe7f4d6 -908: d5735fffa3c594d447ae869b6f97df71a8437a7beca74b7c1b7ab7cbee131122 -909: c6997bcd287033749df80813acb98039278ddbf4a56896a3c4c852114b3d4a22 -910: 93cccb0ecb7988e965cc9efc6d7ac1ff834fbc10be6fda4867ad75c51744138f -911: fbf47e7817a7ce0c3bfded8ea030550b6d6f6de53e103878111f101e49f9445f -912: 5c89a1c644d89f7acebb9b1f9ce51a2ccee9ca212dd8adfa0d610baab3186167 -913: dc28c7d675adfe5a1a7c69400c3dbf5b38332050e4317a1cbdb275247262ca53 -914: c1cb82bc179b22b3a5d9f0355da80ac050236bc73248ec93b8dbbd053298aad2 -915: 5e6e7c848d5df0cf67b72e28e216483216fe84e5d4fe37317369c19603cf0bf3 -916: b19c2c5c2b1a45b6bce242c9aa9adff56affb1f88be4a2645cf76c42f46c7847 -917: be55f3c6e3b22eaa9c1865653a8c91ebb7f414f9a12cdbfb62938945dbc36ab9 -918: 1f32898862ab8d7bbd37d472f0c7eaae7fe2f084f8fd45f05dcb764ca5b600be -919: d07488ed1439a7213396a1ae28886ffa5c4d3cbc74c175cf375402f56988e15b -920: f0b8e66863472f11e758bc94d8a98ee308e5a05490e5db4fb66e1dc09f4e52a3 -921: 67d9acd2df48f467b4f7a84f760730a92c635e928df5621f6afdeed3e195d3d8 -922: 848e6416b52a2ff5c7d7a5e6eed3416c1deef9584f60a5f6c3a2854f0a501faf -923: 5f07bf7c71d71b0cfcb5fe04fb2f1f8a950673754dec4e816ca84f82e663a9e3 -924: 154aedec1b966263e4151b44a8c438bc5f81de0170229bcc20c20f80d85254df -925: 91707a58602431d402edc2258eb703be7603528faa3fc6fa0f6b1e6a4db7c234 -926: 8210b096d070cf4b23238373eaa334784226d472bd5a75abc4bcd512cdd51553 -927: bb818b548724ecbfc298a06c732ac64a20846953ed2eb98c452948c764b4e17e -928: b590d8e03bfe80fd84cd64c1ccf606e75ad702eafaf5353e72e38481f7c3d3b9 -929: 571308cd156b690c3b03a9f857c3b14d91124895a73a2fa041d3039c58468b36 -930: 5470e7f92b880ade0fbada76a0c06d5da0c38e5569c59c11689422144cf3e368 -931: 0584120c3727f510f276d173e1fafbcafeb3fed34bb6639d477db27a7e307d86 -932: ff177489756c5c08e42a9257170d31de9f5420056514c5a6c9ac00c5f9aa04fd -933: 826d14a8ec2b8611009cd1507b8df8c8796889cfe9555db9a8fcc930ef5ee609 -934: b11bb13741a897d8d52f29e0720f1245c25cdc78af34d1b66818506989f63df7 -935: f29205e421662f14d8d93573d326f3d7c98df9527f3a011853e309830b24053a -936: 4f8f5839a9c97e8e6b4661232ce36d14727b4ba88cc07e22e58f3d0792156737 -937: f33b892df0aa30cd76a13fd6250efa01548e47b91db7817c12839c3fb8075b90 -938: 3dd1d304670e333bb982b78ef90eef332b7ab56badd527efa371db1d72a0c030 -939: 456f703691bfa76e0267c4ca9000993ff4ac6daf118b852dd6c763354f1dc1a1 -940: 88f1827525c56fa450ec069a75af48a66c60dd82d6936b71bdddc33bd70882ef -941: be043aa1646c1429738dc5c134672819b6696e79be9c7a98de1afa0d907e09ab -942: c58f652f83e42206e0495bb43b7104849dcf0d4e4ea288ceaa8d221929048209 -943: c0a5542106b07172680af9cf134a8dd6c6aff11b334cbe5152a64d14f97ce5d3 -944: 90cf70305c87a86ae7cb3584858b09621896b6b902bd0f835afe776c0ab3575a -945: 623b58198f6f8b60a5291d1564715f6c177ed6a9795f6a22aac34769d4b781aa -946: 2eca286f8e943a0eb575a8aa472ce251c4a06e956031b9061871726319f33a9d -947: a187c87507d00d8e121bf22bd3a5381cff980a33db532fe1931aaac261bfbbcc -948: 2d1802473442182f0d2268ba7c9bcb6d2343db00d1bc7cceefb05789307387ff -949: fbcfc7d9fa122f09082876a7ba52b087553e5e434536ae272900531d9fd7c5a0 -950: 05fae880424e2b6896c06c0868b7516d04a20addee4ae06d7dfa3d2e8528c23d -951: 556a1aa2712f77d0e29e84189b1907c14ff74a242284eb8d8fd81ff4c9a24d33 -952: fd78fbe54ab202e7f63e87950e60969fe6c6ed0b5b5b9f1a6a64f8f6629263e3 -953: a72ac6b1f94bd82fc1db4d0df37b3c328282bf702a2e80bc6b443319c3127446 -954: f43267b1413f6687a0fc6919f4992920d1a74f3ea43fc087c815f6e6066d1887 -955: a8edc9db69f79246cbb57c2b2996c14ae36a4802074f650e93a1fcac77a259bd -956: a59f159a23a1505a09994c298e654afac0c8d6e2f3f783069a49d8f7f3a8aa5d -957: 665c8ccb1d3c8114ce342ca49cfcc967d166739db626413d42d55b8d2714bb31 -958: 5295ce9d52528268bba400d07d3f7bbfd85097c9f69aa1c58fb4c0201a974851 -959: ad837aaefaed57256edebe44e09dba02d6810244b6a765deab4da65906785f5a -960: aae3fb65120676a8756456c8e56846efc89acac7eb2500551446d8bf00e0a75e -961: 0ac1cf7e1bc2d02b05386342d8bdbf58a7c62976df7190f35653aa8daff30ccc -962: 05a4b48144bed7422054a947e7efa5a1c1517478b9ec633e449a8cc192dd2ae6 -963: d495cb49245a64f0c098e355584ab22e496f551c6db141450d4f2d5473abcc44 -964: 8873017ec15e2ab8207cb9e54426dd670a3beaab33db805aa01c1779cac20e72 -965: 0ee4c3502941396bacf4d957519d4ef4a4f692c582c6c2344fdfdbecde8275a1 -966: 2bbc9539dd2ecf542d36dad04808145ab85640a14ef9d5ac272485bd8f4144cc -967: aadb52646899d16bf8149a8838b15a8e4071d3d2499f38c1fd347931d7e99097 -968: 3a36bb3c62181f1906ced66e0aa9090041e1783c85b37008fd91429becfe1c27 -969: d0949593b37749c149f865d0c1feb635a51b6ab2f1534e4b9fb0e93d9650ba71 -970: f7ef0b7a549a0d3949bdf395deafe817e91cd8a1a7a7ab54c0b592933368b773 -971: 0000000000000000000000000000000000000000000000000000000000000000 -972: 74d5f9b29bad60571c3b13b4374b5d9e2d2c2104e5b8b08a9a46697c4db26cd4 -973: 12523e5f97e8d85e409d8fce5a730c6f32cd05a69d607ef3f0b05c58b52265ab -974: 1a987e6dfb4a4343370a8fd5bfcf192d3374a4e5480108021180e03ef37fc6ed -975: aaaf1ce8d227164a535129c4d6352005520d4f2f5946ceb6ed8972453ad67fa9 -976: d25e2c85bca0ef83a141227ef2c9886d07e86d6b1c40e3f7cdd14f84d1e92fe7 -977: 37471a4ccaf0071fe0f3c31281b44b8197e8ef9e7301c6f53184f08ef63c5d43 -978: b0e16ba5daa317c063e157e75d42de05927a58054e3737542fc258a3cfe4070a -979: d4c184e0d658a3e24a7d25a7100ce03eee215547c335844f2d8cdb8a2b1a9e79 -980: be055df17f2d7082f4647dc4099f5c0585efcd6423a40551ee589255ad984991 -981: 09caa9af48d02c98ff7107153b1fc380af3fb9d3f00a8091cc8336d84f859ed0 -982: 67b2ca10f46e731cc00097205087b5c16d60a29ca1cbdd8f1a375d8b6fa60d78 -983: 0396ba72836444de8f0c354b8a938395b670eac515fb224a6b073bbf10bcff16 -984: f77dd049a4f6d078b810af3e0ecc9f76dcfdbea413dfcd709a1f86c915c392b3 -985: bb76a5acb950ca6fb0115097b948c3b7e928498cca4bc65e1ae7c45023642bf6 -986: 45f58d18384049501fe1cd351e3bc7f612a548ff7ca10be59a9795dc07787dfc -987: 70a5ab10d8b77ba8d578bc4884c50a62a31aa53a07f81688b3658f4eb9827ff8 -988: 12de07ccf3b01dae39ab693a24b5560637aba81ab72a47cd5885beffe831cdfd -989: 8f8ac84a0b4a8f21728fe04236aa7c703f4ae180887faa7c35855a31d8424583 -990: 523110a7ecc629c613b459c83788c9e66897d5d2e92529c4dcb6d45003c5ea7b -991: 465c58b36171c47156ac95d570671a4f0a68237404b960b0517a94b279434ba4 -992: 6fb4c0905e1cdf34e70a2be73e3ab7e48a687efa5f8dce261bedff93011c639d -993: a316920e76d547f001de8e1e4f4efd0bb4801dd6f453e03f6f9035055ff67de2 -994: 95616eabea52bee828193c8de7e3f442164295a0511bdace71109df206cc51bd -995: f57edb955a21ee7a7c1df5ee6c6b307796ff6bbf702ac489077e847d9f589405 -996: 84f6a4e89e73f8ae45094c8566e93b60c51e02105e2ed07789e761adc269e6ab -997: 2102a6c04cf648e73c7bb78660a8b6554c97e747a89a2a88ba8666e289399a24 -998: d7224aa3f93a0f23514e696c3ec982b780f9c4c50bf7b302734e4ac440ed0485 -999: dbd4d0cf3b068945805d85244cacec331f1ef1bce5e679d353e1b95d5559a07e -1000: 1a888206971be51a4535e1a15d4696b6ba4425fc1083911f274d748876549179 diff --git a/includes/ft_ssl.h b/includes/ft_ssl.h index 54a1eb9..fb24615 100644 --- a/includes/ft_ssl.h +++ b/includes/ft_ssl.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/06 12:40:02 by cpieri #+# #+# */ -/* Updated: 2019/05/08 12:45:25 by cpieri ### ########.fr */ +/* Updated: 2019/12/30 09:01:15 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,7 @@ # include "../libft/include/libft.h" # include "./hash/md5.h" +# include "./hash/sha1.h" # include "./hash/sha256.h" # include "./base64/base64.h" # include "./symmetric/symmetric.h" diff --git a/includes/hash/md5.h b/includes/hash/md5.h index a0608f6..f49e164 100644 --- a/includes/hash/md5.h +++ b/includes/hash/md5.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/06 12:16:22 by cpieri #+# #+# */ -/* Updated: 2019/05/22 10:56:42 by cpieri ### ########.fr */ +/* Updated: 2019/12/30 08:36:13 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -40,10 +40,10 @@ typedef struct s_md5 uint32_t *w; } t_md5; -t_md5_utils func_f(uint32_t b, uint32_t c, uint32_t d, int i); -t_md5_utils func_g(uint32_t b, uint32_t c, uint32_t d, int i); -t_md5_utils func_h(uint32_t b, uint32_t c, uint32_t d, int i); -t_md5_utils func_i(uint32_t b, uint32_t c, uint32_t d, int i); +t_md5_utils func_md5_f(uint32_t b, uint32_t c, uint32_t d, int i); +t_md5_utils func_md5_g(uint32_t b, uint32_t c, uint32_t d, int i); +t_md5_utils func_md5_h(uint32_t b, uint32_t c, uint32_t d, int i); +t_md5_utils func_md5_i(uint32_t b, uint32_t c, uint32_t d, int i); t_hash *set_hash2md5(t_md5 *e); void *md5(void *data, size_t len_data); diff --git a/includes/hash/sha1.h b/includes/hash/sha1.h new file mode 100644 index 0000000..9b192e8 --- /dev/null +++ b/includes/hash/sha1.h @@ -0,0 +1,53 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* sha1.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/12/30 08:05:02 by cpieri #+# #+# */ +/* Updated: 2019/12/30 08:59:37 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef SHA1_H +# define SHA1_H + +# include "hash.h" + +# define SHA1_H0 0x67452301 +# define SHA1_H1 0xEFCDAB89 +# define SHA1_H2 0x98BADCFE +# define SHA1_H3 0x10325476 +# define SHA1_H4 0xC3D2E1F0 + +typedef struct s_sha1_utils +{ + uint32_t f; + uint32_t k; +} t_sha1_utils; + +typedef struct s_sha1 +{ + t_padding p; + uint32_t a; + uint32_t b; + uint32_t c; + uint32_t d; + uint32_t e; + uint32_t h0; + uint32_t h1; + uint32_t h2; + uint32_t h3; + uint32_t h4; + uint32_t *w; +} t_sha1; + +t_sha1_utils func_sha1_f(uint32_t b, uint32_t c, uint32_t d); +t_sha1_utils func_sha1_g(uint32_t b, uint32_t c, uint32_t d); +t_sha1_utils func_sha1_h(uint32_t b, uint32_t c, uint32_t d); +t_sha1_utils func_sha1_i(uint32_t b, uint32_t c, uint32_t d); +void *sha1(void *data, size_t len_data); +t_hash *set_hash2sha1(t_sha1 *e); + +#endif \ No newline at end of file diff --git a/libft/Makefile b/libft/Makefile index 87d6554..89a74fc 100644 --- a/libft/Makefile +++ b/libft/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2017/11/07 18:38:31 by tmilon #+# #+# # -# Updated: 2019/05/20 21:33:21 by cpieri ### ########.fr # +# Updated: 2019/12/30 09:39:19 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -122,6 +122,7 @@ SRCS = ft_atoi.c \ ft_atol.c \ ft_strbits.c \ ft_membits.c \ + ft_left_shift.c \ ft_left_rotate.c \ ft_right_rotate.c \ ft_swap_uint32t.c \ diff --git a/libft/include/libft.h b/libft/include/libft.h index 68abd2c..c3d1e67 100644 --- a/libft/include/libft.h +++ b/libft/include/libft.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/09 16:47:24 by cpieri #+# #+# */ -/* Updated: 2019/12/17 10:08:06 by cpieri ### ########.fr */ +/* Updated: 2019/12/30 09:36:53 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -151,6 +151,7 @@ double ftb_clamp(double toclamp, double min, double max); /* ** Functions for Bitwise */ +uint32_t left_shift(uint32_t x, uint32_t nb); uint32_t left_rotate(uint32_t x, uint32_t nb); uint32_t right_rotate(uint32_t x, uint32_t nb); uint32_t swap_uint32t(uint32_t nb); diff --git a/libft/srcs/ft_left_shift.c b/libft/srcs/ft_left_shift.c new file mode 100644 index 0000000..349e8f0 --- /dev/null +++ b/libft/srcs/ft_left_shift.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_left_shift.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/12/30 09:37:01 by cpieri #+# #+# */ +/* Updated: 2019/12/30 09:38:17 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +uint32_t left_shift(uint32_t x, uint32_t nb) +{ + return (x << nb); +} \ No newline at end of file diff --git a/srcs/hash/md5/md5.c b/srcs/hash/md5/md5.c index 55f7d0b..ec465d9 100644 --- a/srcs/hash/md5/md5.c +++ b/srcs/hash/md5/md5.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/25 15:18:34 by cpieri #+# #+# */ -/* Updated: 2019/05/22 11:37:58 by cpieri ### ########.fr */ +/* Updated: 2019/12/30 08:36:27 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -44,7 +44,6 @@ static void padding_md5(t_padding *p, char *data, size_t len) p->new_len = (448 - (p->nb_bits + 1)) % 512; p->new_len += p->nb_bits + 64 + 1; p->new_len /= 8; - printf("Debug: md5 new len: %zu\n", p->new_len); if (!(p->msg8 = (uint8_t*)ft_memalloc(sizeof(uint8_t) * p->new_len))) ft_abort("ft_ssl: md5: malloc failed"); ft_memcpy(p->msg8, data, len); @@ -64,13 +63,13 @@ static void calc_sum(t_md5 *e) while (i < 64) { if (i >= 0 && i <= 15) - tool = func_f(e->b, e->c, e->d, i); + tool = func_md5_f(e->b, e->c, e->d, i); else if (i >= 16 && i <= 31) - tool = func_g(e->b, e->c, e->d, i); + tool = func_md5_g(e->b, e->c, e->d, i); else if (i >= 32 && i <= 47) - tool = func_h(e->b, e->c, e->d, i); + tool = func_md5_h(e->b, e->c, e->d, i); else if (i >= 48 && i <= 63) - tool = func_i(e->b, e->c, e->d, i); + tool = func_md5_i(e->b, e->c, e->d, i); tmp = e->d; e->d = e->c; e->c = e->b; diff --git a/srcs/hash/md5/md5_utils.c b/srcs/hash/md5/md5_utils.c index 1e55658..201217f 100644 --- a/srcs/hash/md5/md5_utils.c +++ b/srcs/hash/md5/md5_utils.c @@ -6,13 +6,13 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/13 13:34:11 by cpieri #+# #+# */ -/* Updated: 2019/05/22 10:54:58 by cpieri ### ########.fr */ +/* Updated: 2019/12/30 08:36:03 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "hash/md5.h" -t_md5_utils func_f(uint32_t b, uint32_t c, uint32_t d, int i) +t_md5_utils func_md5_f(uint32_t b, uint32_t c, uint32_t d, int i) { t_md5_utils ret; @@ -21,7 +21,7 @@ t_md5_utils func_f(uint32_t b, uint32_t c, uint32_t d, int i) return (ret); } -t_md5_utils func_g(uint32_t b, uint32_t c, uint32_t d, int i) +t_md5_utils func_md5_g(uint32_t b, uint32_t c, uint32_t d, int i) { t_md5_utils ret; @@ -30,7 +30,7 @@ t_md5_utils func_g(uint32_t b, uint32_t c, uint32_t d, int i) return (ret); } -t_md5_utils func_h(uint32_t b, uint32_t c, uint32_t d, int i) +t_md5_utils func_md5_h(uint32_t b, uint32_t c, uint32_t d, int i) { t_md5_utils ret; @@ -39,7 +39,7 @@ t_md5_utils func_h(uint32_t b, uint32_t c, uint32_t d, int i) return (ret); } -t_md5_utils func_i(uint32_t b, uint32_t c, uint32_t d, int i) +t_md5_utils func_md5_i(uint32_t b, uint32_t c, uint32_t d, int i) { t_md5_utils ret; diff --git a/srcs/hash/sha1/sha1.c b/srcs/hash/sha1/sha1.c new file mode 100644 index 0000000..8eb18b5 --- /dev/null +++ b/srcs/hash/sha1/sha1.c @@ -0,0 +1,110 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* sha1.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/12/30 08:04:36 by cpieri #+# #+# */ +/* Updated: 2019/12/31 07:58:25 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "hash/sha1.h" +#include + +static void padding_sha1(t_padding *p, char *data, size_t len) +{ + int i; + + i = -1; + p->init_len = len; + p->nb_bits = len * 8; + p->new_len = (448 - (p->nb_bits + 1)) % 512; + p->new_len += p->nb_bits + 64 + 1; + p->new_len /= 8; + if (!(p->msg8 = (uint8_t*)ft_memalloc(sizeof(uint8_t) * p->new_len))) + ft_abort("ft_ssl: sha1: malloc failed"); + ft_memcpy(p->msg8, data, len); + p->msg8[len] |= 1 << 7; + while (++i < 8) + p->msg8[p->new_len - 8 + i] = ((uint8_t*)&(p->nb_bits))[7 - i]; + p->offest = 0; +} + +static void calc_sha1(t_sha1 *e) +{ + int i; + uint32_t tmp; + t_sha1_utils tool; + + i = 0; + while (i < 80) + { + if (i >= 0 && i <= 19) + tool = func_sha1_f(e->b, e->c, e->d); + else if (i >= 20 && i <= 39) + tool = func_sha1_g(e->b, e->c, e->d); + else if (i >= 40 && i <= 59) + tool = func_sha1_h(e->b, e->c, e->d); + else if (i >= 60 && i <= 79) + tool = func_sha1_i(e->b, e->c, e->d); + tmp = left_rotate(e->a, 5) + tool.f + e->e + tool.k + e->w[i]; + e->e = e->d; + e->d = e->c; + e->c = left_rotate(e->b, 30); + e->b = e->a; + e->a = tmp; + i++; + } +} + +static uint32_t *create_sha1_w(void *msg_8, size_t offest) +{ + int i; + uint32_t *w; + + if (!(w = (uint32_t*)ft_memalloc(sizeof(uint32_t) * 80))) + return (NULL); + i = -1; + while (++i < 16) + { + ft_memcpy(&(w[i]), msg_8 + offest + (i * 4), sizeof(uint32_t)); + w[i] = swap_uint32t(w[i]); + } + while (i < 80) + { + w[i] = left_rotate((w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]), 1); + i++; + } + return (w); +} + +void *sha1(void *data, size_t len_data) +{ + t_sha1 e; + t_hash *sum; + + e = (t_sha1){.h0 = SHA1_H0, .h1 = SHA1_H1, .h2 = SHA1_H2, .h3 = SHA1_H3, + .h4 = SHA1_H4, .w = NULL}; + padding_sha1(&(e.p), data, len_data); + while (e.p.offest < e.p.new_len) + { + e.a = e.h0; + e.b = e.h1; + e.c = e.h2; + e.d = e.h3; + e.e = e.h4; + e.w = create_sha1_w(e.p.msg8, e.p.offest); + calc_sha1(&e); + ft_memdel((void**)&(e.w)); + e.h0 += e.a; + e.h1 += e.b; + e.h2 += e.c; + e.h3 += e.d; + e.h4 += e.e; + e.p.offest += 64; + } + sum = set_hash2sha1(&e); + return (sum); +} diff --git a/srcs/hash/sha1/sha1_utils.c b/srcs/hash/sha1/sha1_utils.c new file mode 100644 index 0000000..0114f59 --- /dev/null +++ b/srcs/hash/sha1/sha1_utils.c @@ -0,0 +1,72 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* sha1_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/12/30 08:42:25 by cpieri #+# #+# */ +/* Updated: 2019/12/31 07:58:34 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "hash/sha1.h" +#include + +t_sha1_utils func_sha1_f(uint32_t b, uint32_t c, uint32_t d) +{ + t_sha1_utils ret; + + ret.f = ((b & c) | ((~b) & d)); + ret.k = 0x5a827999; + return (ret); +} + +t_sha1_utils func_sha1_g(uint32_t b, uint32_t c, uint32_t d) +{ + t_sha1_utils ret; + + ret.f = (b ^ c ^ d); + ret.k = 0x6ed9eba1; + return (ret); +} + +t_sha1_utils func_sha1_h(uint32_t b, uint32_t c, uint32_t d) +{ + t_sha1_utils ret; + + ret.f = ((b & c) | (b & d) | (c & d)); + ret.k = 0x8f1bbcdc; + return (ret); +} + +t_sha1_utils func_sha1_i(uint32_t b, uint32_t c, uint32_t d) +{ + t_sha1_utils ret; + + ret.f = (b ^ c ^ d); + ret.k = 0xca62c1d6; + return (ret); +} + +t_hash *set_hash2sha1(t_sha1 *e) +{ + t_hash *ret; + + ft_memdel((void**)&e->p.msg8); + if (!(ret = (t_hash*)malloc(sizeof(t_hash)))) + return (NULL); + if (!(ret->h = (uint32_t*)malloc(sizeof(uint32_t) * 5))) + return (NULL); + ret->nb_word = 5; + ret->h[0] = swap_uint32t(e->h0); + ret->h[1] = swap_uint32t(e->h1); + ret->h[2] = swap_uint32t(e->h2); + ret->h[3] = swap_uint32t(e->h3); + ret->h[4] = swap_uint32t(e->h4); + // ret->h[1] = left_shift(e->h1, 1); + // ret->h[2] = left_shift(e->h2, 2); + // ret->h[3] = left_shift(e->h3, 3); + // ret->h[4] = left_shift(e->h4, 4); + return (ret); +} diff --git a/srcs/parsing.c b/srcs/parsing.c index c0b5628..21cf755 100644 --- a/srcs/parsing.c +++ b/srcs/parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/24 17:29:57 by cpieri #+# #+# */ -/* Updated: 2019/05/20 08:05:17 by cpieri ### ########.fr */ +/* Updated: 2019/12/30 09:00:08 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,7 @@ static const t_parse g_all_cmd[] = { {"md5", "MD5", e_hash, md5, hash_opts, printing_hash, NULL}, + {"sha1", "SHA1", e_hash, sha1, hash_opts, printing_hash, NULL}, {"sha256", "SHA256", e_hash, sha256, hash_opts, printing_hash, NULL}, {"base64", "base64", e_cipher, base64, base64_opts, printing_base64, NULL}, {"des", "des", e_cipher, des, symmetric_opts, NULL, NULL}, diff --git a/srcs/tools/usage.c b/srcs/tools/usage.c index 39c750e..02db9ea 100644 --- a/srcs/tools/usage.c +++ b/srcs/tools/usage.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/24 17:06:36 by cpieri #+# #+# */ -/* Updated: 2019/05/08 12:43:48 by cpieri ### ########.fr */ +/* Updated: 2019/12/30 09:06:45 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,7 @@ static const char *g_hash_cmd[] = { "md5", + "sha1", "sha256", NULL }; From 8190b9e8071691e71d5879f6d160b4443a5ca217 Mon Sep 17 00:00:00 2001 From: Louise P Date: Tue, 31 Dec 2019 08:08:55 +0100 Subject: [PATCH 53/71] [Norme]: Sha1 --- srcs/hash/sha1/sha1_utils.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/srcs/hash/sha1/sha1_utils.c b/srcs/hash/sha1/sha1_utils.c index 0114f59..de364f5 100644 --- a/srcs/hash/sha1/sha1_utils.c +++ b/srcs/hash/sha1/sha1_utils.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/30 08:42:25 by cpieri #+# #+# */ -/* Updated: 2019/12/31 07:58:34 by cpieri ### ########.fr */ +/* Updated: 2019/12/31 08:08:11 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -64,9 +64,5 @@ t_hash *set_hash2sha1(t_sha1 *e) ret->h[2] = swap_uint32t(e->h2); ret->h[3] = swap_uint32t(e->h3); ret->h[4] = swap_uint32t(e->h4); - // ret->h[1] = left_shift(e->h1, 1); - // ret->h[2] = left_shift(e->h2, 2); - // ret->h[3] = left_shift(e->h3, 3); - // ret->h[4] = left_shift(e->h4, 4); return (ret); } From 783ba761d43349449755263fa10892164e25e76e Mon Sep 17 00:00:00 2001 From: Louise P Date: Tue, 31 Dec 2019 12:36:33 +0100 Subject: [PATCH 54/71] [Fonctions]: Create HMAC Functions (sha1, md5, sha256) --- Makefile | 8 +++- includes/hash/hmac.h | 31 +++++++++++++ includes/hash/sha256.h | 3 +- includes/symmetric/pbkdf.h | 10 ++-- srcs/hash/display_hash.c | 7 ++- srcs/hash/hash_tools.c | 5 +- srcs/hash/hmac/hmac_md5.c | 58 +++++++++++++++++++++++ srcs/hash/hmac/hmac_sha1.c | 58 +++++++++++++++++++++++ srcs/hash/hmac/hmac_sha256.c | 58 +++++++++++++++++++++++ srcs/hash/hmac/hmac_utils.c | 56 ++++++++++++++++++++++ srcs/hash/hmac_function.c | 90 ------------------------------------ srcs/hash/sha1/sha1.c | 3 +- srcs/hash/sha1/sha1_utils.c | 3 +- srcs/symmetric/pbkdf.c | 15 +++--- 14 files changed, 291 insertions(+), 114 deletions(-) create mode 100644 includes/hash/hmac.h create mode 100644 srcs/hash/hmac/hmac_md5.c create mode 100644 srcs/hash/hmac/hmac_sha1.c create mode 100644 srcs/hash/hmac/hmac_sha256.c create mode 100644 srcs/hash/hmac/hmac_utils.c delete mode 100644 srcs/hash/hmac_function.c diff --git a/Makefile b/Makefile index 8db8e31..736afd1 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/03/15 11:20:25 by cpieri #+# #+# # -# Updated: 2019/12/30 08:54:04 by cpieri ### ########.fr # +# Updated: 2019/12/31 12:31:25 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -36,6 +36,7 @@ DEPS = Makefile \ includes/hash/hash.h \ includes/hash/md5.h \ includes/hash/sha1.h \ + includes/hash/hmac.h \ includes/base64/base64.h \ includes/symmetric/symmetric.h \ includes/symmetric/des/des.h \ @@ -53,13 +54,16 @@ SRC_NAME= main.c \ hash/hash_parsing.c \ hash/display_hash.c \ hash/hash_tools.c \ - hash/hmac_function.c \ hash/sha256/sha256.c \ hash/sha256/sha256_utils.c \ hash/md5/md5_utils.c \ hash/md5/md5.c \ hash/sha1/sha1.c \ hash/sha1/sha1_utils.c \ + hash/hmac/hmac_utils.c \ + hash/hmac/hmac_md5.c \ + hash/hmac/hmac_sha1.c \ + hash/hmac/hmac_sha256.c \ base64/base64.c \ base64/base64_encode.c \ base64/base64_decode.c \ diff --git a/includes/hash/hmac.h b/includes/hash/hmac.h new file mode 100644 index 0000000..42a7d5d --- /dev/null +++ b/includes/hash/hmac.h @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* hmac.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/12/31 08:17:41 by cpieri #+# #+# */ +/* Updated: 2019/12/31 12:24:18 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef HMAC_H +# define HMAC_H + +# include "hash.h" + +# define I_PAD 0x36 +# define O_PAD 0x5c +# define HMAC_BLOCK_SIZE_512 64 +# define HMAC_BLOCK_SIZE_1024 128 + +void *hmac_512_padding_key(void *key, size_t *key_len); +void *hmac_512_xor_ipad(void const *key, size_t key_len); +void *hmac_512_xor_opad(void const *key, size_t key_len); + +void *hmac_sha1(void *pwd, size_t pwd_len, void *key, size_t key_len); +void *hmac_sha256(void *pwd, size_t pwd_len, void *key, size_t key_len); +void *hmac_md5(void *pwd, size_t pwd_len, void *key, size_t key_len); + +#endif \ No newline at end of file diff --git a/includes/hash/sha256.h b/includes/hash/sha256.h index 4faebfc..01a1609 100644 --- a/includes/hash/sha256.h +++ b/includes/hash/sha256.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/08 13:15:42 by cpieri #+# #+# */ -/* Updated: 2019/12/23 15:50:48 by cpieri ### ########.fr */ +/* Updated: 2019/12/31 08:47:28 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -57,7 +57,6 @@ typedef struct s_sha256 } t_sha256; void *sha256(void *data, size_t len_data); -void *hmac_sha256(uint8_t *pass, uint64_t salt, uint32_t c); t_hash *set_hash2sha256(t_sha256 *e); #endif diff --git a/includes/symmetric/pbkdf.h b/includes/symmetric/pbkdf.h index 79a5a2b..32fada2 100644 --- a/includes/symmetric/pbkdf.h +++ b/includes/symmetric/pbkdf.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 10:11:40 by cpieri #+# #+# */ -/* Updated: 2019/12/23 15:51:00 by cpieri ### ########.fr */ +/* Updated: 2019/12/31 08:50:05 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,21 +14,21 @@ # define PBKDF_H # include "../../libft/include/libft.h" -# include "../hash/sha256.h" -# include "../hash/md5.h" +# include "../hash/hmac.h" # include "../functions.h" # include "../structure.h" enum e_prf { HMAC_MD5 = 0x000000001, - HMAC_SHA256 = 0x000000010 + HMAC_SHA1 = 0x000000010, + HMAC_SHA256 = 0x000000100 }; typedef struct s_prf { enum e_prf prf; - void *(*f)(uint8_t *, uint64_t, uint32_t); + void *(*f)(void *, size_t, void *, size_t); } t_prf; typedef struct s_pbkdf diff --git a/srcs/hash/display_hash.c b/srcs/hash/display_hash.c index 65489fa..f6ae3c2 100644 --- a/srcs/hash/display_hash.c +++ b/srcs/hash/display_hash.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/06 12:14:10 by cpieri #+# #+# */ -/* Updated: 2019/05/22 10:56:17 by cpieri ### ########.fr */ +/* Updated: 2019/12/31 11:14:52 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,6 +27,7 @@ static void print_name(const char *fd_name, t_flags flags) void printing_hash(t_data *data, const char *hash_type, t_flags flags) { t_hash *f_hash; + char *sum; f_hash = (t_hash*)data->data_2_print; if (flags.r == 0 && flags.q == 0 && data->fd_name != NULL) @@ -38,7 +39,9 @@ void printing_hash(t_data *data, const char *hash_type, t_flags flags) } else if (flags.p == 1) ft_putstr(data->data); - ft_putstr(hex2sum(f_hash->h, f_hash->nb_word)); + sum = hex2sum(f_hash->h, f_hash->nb_word); + ft_putstr(sum); + ft_memdel((void**)&sum); if (flags.r == 1) { ft_putchar(' '); diff --git a/srcs/hash/hash_tools.c b/srcs/hash/hash_tools.c index 2bc2271..06e44ce 100644 --- a/srcs/hash/hash_tools.c +++ b/srcs/hash/hash_tools.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/22 09:12:05 by cpieri #+# #+# */ -/* Updated: 2019/12/17 11:16:02 by cpieri ### ########.fr */ +/* Updated: 2019/12/31 11:29:31 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,9 +17,8 @@ char *one_sum(uint32_t *h, size_t nb_h) { char *sum; - if (!(sum = (char*)ft_memalloc(nb_h * sizeof(uint32_t)))) + if (!(sum = (char*)ft_memdup(h, (nb_h * sizeof(uint32_t))))) return (NULL); - sum = ft_memdup(h, (nb_h * sizeof(uint32_t))); return (sum); } diff --git a/srcs/hash/hmac/hmac_md5.c b/srcs/hash/hmac/hmac_md5.c new file mode 100644 index 0000000..fdea5fa --- /dev/null +++ b/srcs/hash/hmac/hmac_md5.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* hmac_md5.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/12/31 12:29:58 by cpieri #+# #+# */ +/* Updated: 2019/12/31 12:31:13 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "hash/hmac.h" +#include "hash/md5.h" + +static void *hmac_md5_digest(void *c1, void *c2, size_t l_c1, size_t l_c2) +{ + void *data_2_hash; + size_t new_len; + t_hash *digest; + char *char_digest; + + data_2_hash = ft_memjoin(c1, c2, l_c1, l_c2); + new_len = l_c1 + l_c2; + digest = (t_hash*)md5(data_2_hash, new_len); + ft_memdel(&data_2_hash); + char_digest = one_sum(digest->h, digest->nb_word); + ft_memdel((void**)&(digest->h)); + ft_memdel((void**)&digest); + return (char_digest); +} + +void *hmac_md5(void *data, size_t data_len, void *key, size_t key_len) +{ + void *digest; + void *tmp_digest; + void *new_key; + void *i_key_pad; + void *o_key_pad; + + if (key_len > HMAC_BLOCK_SIZE_512) + { + new_key = hmac_md5_digest(key, NULL, key_len, 0); + key_len = 16; + } + else if (key_len < HMAC_BLOCK_SIZE_512) + if (!(new_key = hmac_512_padding_key(key, &key_len))) + return (NULL); + i_key_pad = hmac_512_xor_ipad(new_key, key_len); + o_key_pad = hmac_512_xor_opad(new_key, key_len); + tmp_digest = hmac_md5_digest(i_key_pad, data, key_len, data_len); + ft_memdel(&i_key_pad); + digest = hmac_md5_digest(o_key_pad, tmp_digest, key_len, 16); + ft_memdel(&tmp_digest); + ft_memdel(&o_key_pad); + ft_memdel(&new_key); + return (digest); +} diff --git a/srcs/hash/hmac/hmac_sha1.c b/srcs/hash/hmac/hmac_sha1.c new file mode 100644 index 0000000..df1e8a2 --- /dev/null +++ b/srcs/hash/hmac/hmac_sha1.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* hmac_sha1.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/12/31 08:16:56 by cpieri #+# #+# */ +/* Updated: 2019/12/31 12:23:27 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "hash/hmac.h" +#include "hash/sha1.h" + +static void *hmac_sha1_digest(void *c1, void *c2, size_t len_c1, size_t len_c2) +{ + void *data_2_hash; + size_t new_len; + t_hash *digest; + char *char_digest; + + data_2_hash = ft_memjoin(c1, c2, len_c1, len_c2); + new_len = len_c1 + len_c2; + digest = (t_hash*)sha1(data_2_hash, new_len); + ft_memdel(&data_2_hash); + char_digest = one_sum(digest->h, digest->nb_word); + ft_memdel((void**)&(digest->h)); + ft_memdel((void**)&digest); + return (char_digest); +} + +void *hmac_sha1(void *data, size_t data_len, void *key, size_t key_len) +{ + void *digest; + void *tmp_digest; + void *new_key; + void *i_key_pad; + void *o_key_pad; + + if (key_len > HMAC_BLOCK_SIZE_512) + { + new_key = hmac_sha1_digest(key, NULL, key_len, 0); + key_len = 20; + } + else if (key_len < HMAC_BLOCK_SIZE_512) + if (!(new_key = hmac_512_padding_key(key, &key_len))) + return (NULL); + i_key_pad = hmac_512_xor_ipad(new_key, key_len); + o_key_pad = hmac_512_xor_opad(new_key, key_len); + tmp_digest = hmac_sha1_digest(i_key_pad, data, key_len, data_len); + ft_memdel(&i_key_pad); + digest = hmac_sha1_digest(o_key_pad, tmp_digest, key_len, 20); + ft_memdel(&tmp_digest); + ft_memdel(&o_key_pad); + ft_memdel(&new_key); + return (digest); +} diff --git a/srcs/hash/hmac/hmac_sha256.c b/srcs/hash/hmac/hmac_sha256.c new file mode 100644 index 0000000..e262b7e --- /dev/null +++ b/srcs/hash/hmac/hmac_sha256.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* hmac_sha256.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/12/31 12:21:07 by cpieri #+# #+# */ +/* Updated: 2019/12/31 12:28:08 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "hash/hmac.h" +#include "hash/sha256.h" + +static void *hmac_sha256_digest(void *c1, void *c2, size_t l_c1, size_t l_c2) +{ + void *data_2_hash; + size_t new_len; + t_hash *digest; + char *char_digest; + + data_2_hash = ft_memjoin(c1, c2, l_c1, l_c2); + new_len = l_c1 + l_c2; + digest = (t_hash*)sha256(data_2_hash, new_len); + ft_memdel(&data_2_hash); + char_digest = one_sum(digest->h, digest->nb_word); + ft_memdel((void**)&(digest->h)); + ft_memdel((void**)&digest); + return (char_digest); +} + +void *hmac_sha256(void *data, size_t data_len, void *key, size_t key_len) +{ + void *digest; + void *tmp_digest; + void *new_key; + void *i_key_pad; + void *o_key_pad; + + if (key_len > HMAC_BLOCK_SIZE_512) + { + new_key = hmac_sha256_digest(key, NULL, key_len, 0); + key_len = 32; + } + else if (key_len < HMAC_BLOCK_SIZE_512) + if (!(new_key = hmac_512_padding_key(key, &key_len))) + return (NULL); + i_key_pad = hmac_512_xor_ipad(new_key, key_len); + o_key_pad = hmac_512_xor_opad(new_key, key_len); + tmp_digest = hmac_sha256_digest(i_key_pad, data, key_len, data_len); + ft_memdel(&i_key_pad); + digest = hmac_sha256_digest(o_key_pad, tmp_digest, key_len, 32); + ft_memdel(&tmp_digest); + ft_memdel(&o_key_pad); + ft_memdel(&new_key); + return (digest); +} diff --git a/srcs/hash/hmac/hmac_utils.c b/srcs/hash/hmac/hmac_utils.c new file mode 100644 index 0000000..5759fc4 --- /dev/null +++ b/srcs/hash/hmac/hmac_utils.c @@ -0,0 +1,56 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* hmac_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/12/31 12:22:16 by cpieri #+# #+# */ +/* Updated: 2019/12/31 12:24:41 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "hash/hmac.h" + +void *hmac_512_padding_key(void *key, size_t *key_len) +{ + uint8_t *new_key; + size_t size; + + size = HMAC_BLOCK_SIZE_512 * sizeof(uint8_t); + if (!(new_key = (uint8_t*)ft_memalloc(size))) + return (NULL); + new_key = ft_memcpy(new_key, key, *key_len); + *key_len = HMAC_BLOCK_SIZE_512; + return (new_key); +} + +void *hmac_512_xor_ipad(void const *key, size_t key_len) +{ + char *i_pad; + char *key_cpy; + size_t i; + + key_cpy = (char*)key; + if (!(i_pad = (char*)ft_memalloc(key_len * sizeof(char)))) + return (NULL); + i = -1; + while (++i < HMAC_BLOCK_SIZE_512) + i_pad[i] = key_cpy[i] ^ I_PAD; + return (i_pad); +} + +void *hmac_512_xor_opad(void const *key, size_t key_len) +{ + char *o_pad; + char *key_cpy; + size_t i; + + key_cpy = (char*)key; + if (!(o_pad = (char*)ft_memalloc(key_len * sizeof(char)))) + return (NULL); + i = -1; + while (++i < HMAC_BLOCK_SIZE_512) + o_pad[i] = key_cpy[i] ^ O_PAD; + return (o_pad); +} diff --git a/srcs/hash/hmac_function.c b/srcs/hash/hmac_function.c deleted file mode 100644 index 8f29bd5..0000000 --- a/srcs/hash/hmac_function.c +++ /dev/null @@ -1,90 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* hmac_function.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: cpieri +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2019/12/11 12:28:18 by cpieri #+# #+# */ -/* Updated: 2019/12/23 16:58:11 by cpieri ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "symmetric/pbkdf.h" -#include - -static void *hmac_xor_u(void const *u1, void const *u2, size_t len, size_t size) -{ - char *u1_cpy; - char *u2_cpy; - char *u; - size_t i; - - u1_cpy = (char*)u1; - u2_cpy = (char*)u2; - i = 0; - if (!(u = (char*)ft_memalloc(len * size))) - return (NULL); - while (i < (len * size)) - { - u[i] = u1_cpy[i] ^ u2_cpy[i]; - // ft_putbits(u1_cpy[i]); ft_putchar(' '); - // ft_putbits(u2_cpy[i]); ft_putchar(' '); ft_putchar('='); ft_putchar(' '); - // ft_putbits(u[i]); ft_putchar('\n'); - i++; - } - return (u); -} - -static void *hmac_sha256_i(void *data, size_t data_len) -{ - t_hash *hash; - void *sum; - - hash = (t_hash*)sha256(data, data_len); - sum = one_sum(hash->h, hash->nb_word); - ft_memdel((void**)&(hash->h)); - ft_memdel((void**)&hash); - return (sum); -} - -void *hmac_sha256(uint8_t *pass, uint64_t salt, uint32_t c) -{ - void *data_to_hash; - void *salty_pass; - size_t salty_pass_len; - size_t hash_len; - void *sum[c]; - void *f_sum = NULL; - void *tmp; - uint32_t i; - - salty_pass = ft_memjoin(pass, &salt, ft_strlen((char*)pass), sizeof(uint64_t)); - salty_pass_len = ft_strlen((char*)pass) + sizeof(uint64_t); - - data_to_hash = ft_memjoin(salty_pass, &c, salty_pass_len, sizeof(uint32_t)); - hash_len = salty_pass_len + sizeof(uint32_t); - sum[0] = hmac_sha256_i(data_to_hash, hash_len); - printf("%d: %s\n", 0, hex2sum(sum[0], 8)); - - data_to_hash = ft_memjoin(pass, sum[0], ft_strlen((char*)pass), (8 * sizeof(uint32_t))); - sum[1] = hmac_sha256_i(data_to_hash, hash_len); - f_sum = hmac_xor_u(sum[0], sum[1], 8, sizeof(uint32_t)); - printf("%d: %s\n", 1, hex2sum(f_sum, 8)); - - data_to_hash = ft_memjoin(pass, sum[1], ft_strlen((char*)pass), (8 * sizeof(uint32_t))); - i = 1; - while (++i <= c) - { - sum[i] = hmac_sha256_i(data_to_hash, hash_len); - data_to_hash = ft_memjoin(pass, sum[i], ft_strlen((char*)pass), (8 * sizeof(uint32_t))); - tmp = hmac_xor_u(f_sum, sum[i], 8, sizeof(uint32_t)); - ft_memdel((void**)&f_sum); - f_sum = tmp; - printf("%d: %s\n", i, hex2sum(f_sum, 8)); - } - // while (1); - // ft_putstr("sum: "), ft_membits(f_sum, hash->nb_word, sizeof(uint32_t)); - return (f_sum); - // ft_memput(data_to_hash, salty_pass_len + sizeof(uint32_t)); -} \ No newline at end of file diff --git a/srcs/hash/sha1/sha1.c b/srcs/hash/sha1/sha1.c index 8eb18b5..35e1a35 100644 --- a/srcs/hash/sha1/sha1.c +++ b/srcs/hash/sha1/sha1.c @@ -6,12 +6,11 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/30 08:04:36 by cpieri #+# #+# */ -/* Updated: 2019/12/31 07:58:25 by cpieri ### ########.fr */ +/* Updated: 2019/12/31 08:14:52 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "hash/sha1.h" -#include static void padding_sha1(t_padding *p, char *data, size_t len) { diff --git a/srcs/hash/sha1/sha1_utils.c b/srcs/hash/sha1/sha1_utils.c index de364f5..ec590d5 100644 --- a/srcs/hash/sha1/sha1_utils.c +++ b/srcs/hash/sha1/sha1_utils.c @@ -6,12 +6,11 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/30 08:42:25 by cpieri #+# #+# */ -/* Updated: 2019/12/31 08:08:11 by cpieri ### ########.fr */ +/* Updated: 2019/12/31 08:14:54 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "hash/sha1.h" -#include t_sha1_utils func_sha1_f(uint32_t b, uint32_t c, uint32_t d) { diff --git a/srcs/symmetric/pbkdf.c b/srcs/symmetric/pbkdf.c index 3cfbbc9..8731bb7 100644 --- a/srcs/symmetric/pbkdf.c +++ b/srcs/symmetric/pbkdf.c @@ -6,15 +6,16 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 10:10:43 by cpieri #+# #+# */ -/* Updated: 2019/12/23 15:55:01 by cpieri ### ########.fr */ +/* Updated: 2019/12/31 12:33:19 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "symmetric/pbkdf.h" #include -static const t_prf g_prf[3] = { - {HMAC_MD5, NULL}, +static const t_prf g_prf[4] = { + {HMAC_MD5, hmac_md5}, + {HMAC_SHA1, hmac_sha1}, {HMAC_SHA256, hmac_sha256}, {0, NULL} }; @@ -25,10 +26,12 @@ uint64_t ft_pbkdf2(uint8_t *pass, uint64_t salt) void *sum; t_prf prf; + (void)salt; + (void)pass; counter = 1000; - prf = g_prf[1]; - sum = prf.f(pass, salt, counter); - // printf("sum: %s\n", hex2sum(sum, 8)); + prf = g_prf[0]; + sum = prf.f("The quick brown fox jumps over the lazy dog", 43, "key", 4); + printf("%s\n", hex2sum(sum, 4)); return (0); } From df9190edb1422b703e5ac52ff270e5e5f296419a Mon Sep 17 00:00:00 2001 From: Louise P Date: Tue, 31 Dec 2019 13:37:18 +0100 Subject: [PATCH 55/71] [Function]: Create the function PBKDF2 [Norme]: The function PBKDF2 is normed [Debug]: The salt is the same of OpenSSL --- Makefile | 6 +- includes/functions.h | 4 +- includes/hash/hmac.h | 4 +- includes/hash/sha1.h | 4 +- includes/{symmetric => pbkdf2}/pbkdf.h | 18 ++- includes/symmetric/symmetric.h | 4 +- libft/Makefile | 7 +- libft/include/libft.h | 7 +- .../{ft_hex2char.c => ft_hex32_to_char.c} | 6 +- libft/srcs/ft_hex64_to_char.c | 51 ++++++++ libft/srcs/ft_ishexa.c | 29 +++++ libft/srcs/ft_left_shift.c | 4 +- libft/srcs/ft_swap_uint32t.c | 4 +- libft/srcs/ft_swap_uint64t.c | 21 +++ srcs/hash/hash_tools.c | 4 +- srcs/main.c | 4 +- srcs/pbkdf2/pbkdf2.c | 120 ++++++++++++++++++ .../pbkdf.c => pbkdf2/pbkdf2_utils.c} | 39 ++---- srcs/symmetric/sym_key.c | 10 +- srcs/symmetric/symmetric_parsing.c | 14 +- srcs/symmetric/symmetric_parsing_pt_f_2.c | 23 +++- srcs/tools/get_data.c | 16 ++- 22 files changed, 316 insertions(+), 83 deletions(-) rename includes/{symmetric => pbkdf2}/pbkdf.h (82%) rename libft/srcs/{ft_hex2char.c => ft_hex32_to_char.c} (88%) create mode 100644 libft/srcs/ft_hex64_to_char.c create mode 100644 libft/srcs/ft_ishexa.c create mode 100644 libft/srcs/ft_swap_uint64t.c create mode 100644 srcs/pbkdf2/pbkdf2.c rename srcs/{symmetric/pbkdf.c => pbkdf2/pbkdf2_utils.c} (51%) diff --git a/Makefile b/Makefile index 736afd1..7e8752e 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/03/15 11:20:25 by cpieri #+# #+# # -# Updated: 2019/12/31 12:31:25 by cpieri ### ########.fr # +# Updated: 2019/12/31 14:37:46 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -38,6 +38,7 @@ DEPS = Makefile \ includes/hash/sha1.h \ includes/hash/hmac.h \ includes/base64/base64.h \ + includes/pbkdf2/pbkdf.h \ includes/symmetric/symmetric.h \ includes/symmetric/des/des.h \ libft/libft.a @@ -70,8 +71,9 @@ SRC_NAME= main.c \ base64/base64_parsing.c \ base64/base64_help_parsing.c \ base64/base64_display.c \ + pbkdf2/pbkdf2.c \ + pbkdf2/pbkdf2_utils.c \ symmetric/sym_key.c \ - symmetric/pbkdf.c \ symmetric/symmetric_usage.c \ symmetric/symmetric_parsing.c \ symmetric/symmetric_parsing_pt_f.c \ diff --git a/includes/functions.h b/includes/functions.h index 0e48a54..931c4b2 100644 --- a/includes/functions.h +++ b/includes/functions.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:44:05 by cpieri #+# #+# */ -/* Updated: 2019/05/20 10:38:53 by cpieri ### ########.fr */ +/* Updated: 2020/01/06 09:02:50 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -34,7 +34,7 @@ t_data *new_data(void); t_data *get_data(const int fd, const char *fd_name); t_data *get_file(const int fd, const char *fd_name); t_data *get_string(char *s); -uint64_t get_random(void); +void *get_random(void); /* ** Functions for Lst_opt diff --git a/includes/hash/hmac.h b/includes/hash/hmac.h index 42a7d5d..2601491 100644 --- a/includes/hash/hmac.h +++ b/includes/hash/hmac.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/31 08:17:41 by cpieri #+# #+# */ -/* Updated: 2019/12/31 12:24:18 by cpieri ### ########.fr */ +/* Updated: 2019/12/31 13:33:46 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,4 +28,4 @@ void *hmac_sha1(void *pwd, size_t pwd_len, void *key, size_t key_len); void *hmac_sha256(void *pwd, size_t pwd_len, void *key, size_t key_len); void *hmac_md5(void *pwd, size_t pwd_len, void *key, size_t key_len); -#endif \ No newline at end of file +#endif diff --git a/includes/hash/sha1.h b/includes/hash/sha1.h index 9b192e8..e7d851f 100644 --- a/includes/hash/sha1.h +++ b/includes/hash/sha1.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/30 08:05:02 by cpieri #+# #+# */ -/* Updated: 2019/12/30 08:59:37 by cpieri ### ########.fr */ +/* Updated: 2019/12/31 13:33:56 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -50,4 +50,4 @@ t_sha1_utils func_sha1_i(uint32_t b, uint32_t c, uint32_t d); void *sha1(void *data, size_t len_data); t_hash *set_hash2sha1(t_sha1 *e); -#endif \ No newline at end of file +#endif diff --git a/includes/symmetric/pbkdf.h b/includes/pbkdf2/pbkdf.h similarity index 82% rename from includes/symmetric/pbkdf.h rename to includes/pbkdf2/pbkdf.h index 32fada2..f3c94ce 100644 --- a/includes/symmetric/pbkdf.h +++ b/includes/pbkdf2/pbkdf.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 10:11:40 by cpieri #+# #+# */ -/* Updated: 2019/12/31 08:50:05 by cpieri ### ########.fr */ +/* Updated: 2020/01/06 10:33:25 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,13 +29,17 @@ typedef struct s_prf { enum e_prf prf; void *(*f)(void *, size_t, void *, size_t); + size_t nb_word; } t_prf; typedef struct s_pbkdf { - uint8_t *pass; - uint64_t salt; - uint64_t key; + void *pass; + void *salt; + void *key; + size_t pass_len; + size_t salt_len; + size_t dk_len; uint64_t vect; } t_pbkdf; @@ -43,13 +47,13 @@ typedef struct s_pbkdf ** Functions for create and del struct symmetric key */ uint8_t *get_pass(const char *prompt); -t_pbkdf *new_key(uint8_t *pass, uint64_t salt, uint64_t key, - uint64_t vect); +t_pbkdf *new_key(uint8_t *pass, void *salt, uint64_t key, + uint64_t vect); void print_pbkdf(t_pbkdf *to_print); void free_pbkdf(t_pbkdf **to_free); void free_vpbkdf(void **to_free); uint64_t gen_key(uint8_t *pass, uint64_t salt); -uint64_t ft_pbkdf2(uint8_t *pass, uint64_t salt); +void *pbkdf2(t_pbkdf *k, uint32_t c, size_t dk_len, enum e_prf func); void regen_key(t_pbkdf **k); #endif diff --git a/includes/symmetric/symmetric.h b/includes/symmetric/symmetric.h index a274635..6460735 100644 --- a/includes/symmetric/symmetric.h +++ b/includes/symmetric/symmetric.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 10:11:43 by cpieri #+# #+# */ -/* Updated: 2019/05/20 10:33:53 by cpieri ### ########.fr */ +/* Updated: 2019/12/31 14:36:27 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,7 +14,7 @@ # define SYMMETRIC_H # include "./des/des.h" -# include "./pbkdf.h" +# include "../pbkdf2/pbkdf.h" enum e_sym_opt { diff --git a/libft/Makefile b/libft/Makefile index 89a74fc..49e428d 100644 --- a/libft/Makefile +++ b/libft/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2017/11/07 18:38:31 by tmilon #+# #+# # -# Updated: 2019/12/30 09:39:19 by cpieri ### ########.fr # +# Updated: 2020/01/06 12:49:31 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -35,6 +35,7 @@ DEPS = Makefile \ SRCS = ft_atoi.c \ ft_bzero.c \ ft_ishexa_color.c \ + ft_ishexa.c \ ft_isspace.c \ ft_isalnum.c \ ft_isalpha.c \ @@ -64,7 +65,8 @@ SRCS = ft_atoi.c \ ft_putnbr_fd.c \ ft_putstr.c \ ft_putstr_fd.c \ - ft_hex2char.c \ + ft_hex64_to_char.c \ + ft_hex32_to_char.c \ ft_strcat.c \ ft_strchr.c \ ft_strclr.c \ @@ -126,6 +128,7 @@ SRCS = ft_atoi.c \ ft_left_rotate.c \ ft_right_rotate.c \ ft_swap_uint32t.c \ + ft_swap_uint64t.c \ ft_putbits.c OBJS = $(SRCS:.c=.o) diff --git a/libft/include/libft.h b/libft/include/libft.h index c3d1e67..552dbee 100644 --- a/libft/include/libft.h +++ b/libft/include/libft.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/11/09 16:47:24 by cpieri #+# #+# */ -/* Updated: 2019/12/30 09:36:53 by cpieri ### ########.fr */ +/* Updated: 2020/01/06 12:53:34 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,7 +28,8 @@ typedef struct s_list /* ** Functions for Strings */ -char *ft_hex2char(uint32_t hex); +char *ft_hex32_to_char(uint32_t hex); +char *ft_hex64_to_char(uint64_t hex); char *ft_strcat(char *s1, const char *s2); char *ft_strchr(const char *s, int c); char *ft_strchr(const char *s, int c); @@ -94,6 +95,7 @@ int ft_isdigit(int c); int ft_isprint(int c); int ft_isspace(char c); int ft_ishexa_color(char *s); +int ft_ishexa(char *s); /* ** Functions for Linked List @@ -155,5 +157,6 @@ uint32_t left_shift(uint32_t x, uint32_t nb); uint32_t left_rotate(uint32_t x, uint32_t nb); uint32_t right_rotate(uint32_t x, uint32_t nb); uint32_t swap_uint32t(uint32_t nb); +uint64_t swap_uint64t(uint64_t nb); #endif diff --git a/libft/srcs/ft_hex2char.c b/libft/srcs/ft_hex32_to_char.c similarity index 88% rename from libft/srcs/ft_hex2char.c rename to libft/srcs/ft_hex32_to_char.c index 1b7d065..b8dd5dc 100644 --- a/libft/srcs/ft_hex2char.c +++ b/libft/srcs/ft_hex32_to_char.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* ft_hex2char.c :+: :+: :+: */ +/* ft_hex32_to_char.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 21:21:06 by cpieri #+# #+# */ -/* Updated: 2019/05/22 10:36:33 by cpieri ### ########.fr */ +/* Updated: 2020/01/06 09:14:04 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -38,7 +38,7 @@ static void conv_32hexa(char **s, long len_s, uint32_t hex) } } -char *ft_hex2char(uint32_t hex) +char *ft_hex32_to_char(uint32_t hex) { char *s; diff --git a/libft/srcs/ft_hex64_to_char.c b/libft/srcs/ft_hex64_to_char.c new file mode 100644 index 0000000..368b0f1 --- /dev/null +++ b/libft/srcs/ft_hex64_to_char.c @@ -0,0 +1,51 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_hex64_to_char.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/05/20 21:21:06 by cpieri #+# #+# */ +/* Updated: 2020/01/06 09:14:27 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static void conv_32hexa(char **s, long len_s, uint64_t hex) +{ + uint32_t nb; + long i; + char tmp; + + nb = 0; + i = 0; + while (i < len_s) + { + nb = hex % 16; + if (nb < 10) + (*s)[i] = (nb) % 10 + '0'; + else + (*s)[i] = (nb) + 'a' - 10; + if ((i % 2) != 0) + { + tmp = (*s)[i]; + (*s)[i] = (*s)[i - 1]; + (*s)[i - 1] = tmp; + } + hex /= 16; + i++; + } +} + +char *ft_hex64_to_char(uint64_t hex) +{ + char *s; + + if (!(s = (char*)ft_memalloc(sizeof(char) * (16 + 1)))) + return (NULL); + if (hex < 16) + s[0] = '0'; + conv_32hexa(&s, 16, hex); + return (s); +} diff --git a/libft/srcs/ft_ishexa.c b/libft/srcs/ft_ishexa.c new file mode 100644 index 0000000..0e36902 --- /dev/null +++ b/libft/srcs/ft_ishexa.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_ishexa.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2018/01/22 14:49:31 by cpieri #+# #+# */ +/* Updated: 2020/01/06 12:58:31 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +int ft_ishexa(char *s) +{ + int i; + + i = 0; + // if (s[1] != '0' && s[2] != 'x') + // return (0); + while (i <= 16) + { + if (s[i] < 48 && s[i] > 57 && s[i] < 'A' && s[i] > 'F') + return (0); + i++; + } + return (1); +} diff --git a/libft/srcs/ft_left_shift.c b/libft/srcs/ft_left_shift.c index 349e8f0..b43dd21 100644 --- a/libft/srcs/ft_left_shift.c +++ b/libft/srcs/ft_left_shift.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/30 09:37:01 by cpieri #+# #+# */ -/* Updated: 2019/12/30 09:38:17 by cpieri ### ########.fr */ +/* Updated: 2020/01/06 09:13:47 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,4 +15,4 @@ uint32_t left_shift(uint32_t x, uint32_t nb) { return (x << nb); -} \ No newline at end of file +} diff --git a/libft/srcs/ft_swap_uint32t.c b/libft/srcs/ft_swap_uint32t.c index e9a49fd..2987154 100644 --- a/libft/srcs/ft_swap_uint32t.c +++ b/libft/srcs/ft_swap_uint32t.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* ft_swap_uint32t.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: cpieri +#+ +:+ +#+ */ +/* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/18 15:42:06 by cpieri #+# #+# */ -/* Updated: 2019/03/18 15:45:17 by cpieri ### ########.fr */ +/* Updated: 2020/01/06 08:46:42 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/libft/srcs/ft_swap_uint64t.c b/libft/srcs/ft_swap_uint64t.c new file mode 100644 index 0000000..07e3154 --- /dev/null +++ b/libft/srcs/ft_swap_uint64t.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_swap_uint64t.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/03/18 15:42:06 by cpieri #+# #+# */ +/* Updated: 2020/01/06 08:55:43 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +uint64_t swap_uint64t(uint64_t nb) +{ + nb = (nb & 0x00000000FFFFFFFF) << 32 | (nb & 0xFFFFFFFF00000000) >> 32; + nb = (nb & 0x0000FFFF0000FFFF) << 16 | (nb & 0xFFFF0000FFFF0000) >> 16; + nb = (nb & 0x00FF00FF00FF00FF) << 8 | (nb & 0xFF00FF00FF00FF00) >> 8; + return (nb); +} diff --git a/srcs/hash/hash_tools.c b/srcs/hash/hash_tools.c index 06e44ce..4a11dcc 100644 --- a/srcs/hash/hash_tools.c +++ b/srcs/hash/hash_tools.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/22 09:12:05 by cpieri #+# #+# */ -/* Updated: 2019/12/31 11:29:31 by cpieri ### ########.fr */ +/* Updated: 2020/01/06 08:43:59 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -33,7 +33,7 @@ char *hex2sum(uint32_t *h, size_t nb_h) return (NULL); while (++i < nb_h) { - if ((tmp = ft_hex2char(h[i])) == NULL) + if ((tmp = ft_hex32_to_char(h[i])) == NULL) break ; ft_strncpy((sum + ft_strlen(sum)), tmp, ft_strlen(tmp)); ft_memdel((void**)&tmp); diff --git a/srcs/main.c b/srcs/main.c index c8e4bf2..62011be 100644 --- a/srcs/main.c +++ b/srcs/main.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/24 17:05:16 by cpieri #+# #+# */ -/* Updated: 2019/05/20 20:33:16 by cpieri ### ########.fr */ +/* Updated: 2020/01/02 11:00:17 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,6 +20,6 @@ int main(int ac, char **av) print_usage(1, NULL); parse = parsing(ac, av); dispatch(&parse); - clean_prog(&parse); + // clean_prog(&parse); return (0); } diff --git a/srcs/pbkdf2/pbkdf2.c b/srcs/pbkdf2/pbkdf2.c new file mode 100644 index 0000000..2561a67 --- /dev/null +++ b/srcs/pbkdf2/pbkdf2.c @@ -0,0 +1,120 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* pbkdf2.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/12/31 13:29:35 by cpieri #+# #+# */ +/* Updated: 2020/01/07 15:21:37 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "pbkdf2/pbkdf.h" +#include +#include + +static const t_prf g_prf[4] = { + {HMAC_MD5, hmac_md5, 16}, + {HMAC_SHA1, hmac_sha1, 20}, + {HMAC_SHA256, hmac_sha256, 32}, + {0, NULL, 0} +}; + +static t_prf pbkdf2_get_prf(enum e_prf name) +{ + t_prf ret; + size_t i; + + i = 0; + while (i < 4) + { + if (g_prf[i].prf == name) + ret = g_prf[i]; + i++; + } + return (ret); +} + +static void pbkdf2_xor_dgst(void const *dgst1, void const *dgst2, size_t nb) +{ + char *dgst1_cpy; + char *dgst2_cpy; + size_t i; + + i = 0; + dgst1_cpy = (char*)dgst1; + dgst2_cpy = (char*)dgst2; + while (i < nb) + { + dgst1_cpy[i] ^= dgst2_cpy[i]; + i++; + } +} + +static void *first_i(t_pbkdf *k, size_t y, t_prf prf) +{ + void *buff; + void *ret; + + if (!(buff = ft_memalloc(k->salt_len + 4))) + return (NULL); + ft_memcpy(buff, k->salt, k->salt_len); + *(uint32_t*)(buff + k->salt_len) = swap_uint32t((uint32_t)y); + ret = prf.f(buff, k->salt_len + 4, k->pass, k->pass_len); + ft_memdel(&buff); + return (ret); +} + +static void *pbkdf2_f(t_pbkdf *k, uint32_t c, t_prf prf, size_t y) +{ + size_t i; + char *ret; + char **blocks; + + i = 0; + if (!(blocks = (char**)ft_memalloc(sizeof(char*) * c))) + return (NULL); + while (i < c) + { + if (i == 0) + blocks[0] = first_i(k, y, prf); + else + { + blocks[i] = prf.f(blocks[i - 1], prf.nb_word, k->pass, k->pass_len); + pbkdf2_xor_dgst(blocks[0], blocks[i], prf.nb_word); + } + i++; + } + ret = ft_memdup(blocks[0], prf.nb_word); + while (--i > 0) + ft_memdel((void**)&(blocks[i])); + ft_memdel((void**)blocks); + return (ret); +} + +void *pbkdf2(t_pbkdf *k, uint32_t c, size_t dk_len, enum e_prf func) +{ + size_t i; + size_t l; + void *tmp; + char *ret; + t_prf prf; + + i = 1; + prf = pbkdf2_get_prf(func); + l = ceil((double)(dk_len / prf.nb_word)) + 1; + if (!(ret = (char*)ft_memalloc(sizeof(char) * (dk_len + 1)))) + return (NULL); + while (i <= l) + { + tmp = pbkdf2_f(k, c, prf, i); + ft_memcpy(ret + ((i - 1) * prf.nb_word), tmp, + (i == l) ? dk_len % prf.nb_word : prf.nb_word); + ft_memdel(&tmp); + i++; + } + k->key = ret; + k->dk_len = dk_len; + return (ret); +} diff --git a/srcs/symmetric/pbkdf.c b/srcs/pbkdf2/pbkdf2_utils.c similarity index 51% rename from srcs/symmetric/pbkdf.c rename to srcs/pbkdf2/pbkdf2_utils.c index 8731bb7..9079bdb 100644 --- a/srcs/symmetric/pbkdf.c +++ b/srcs/pbkdf2/pbkdf2_utils.c @@ -1,49 +1,28 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* pbkdf.c :+: :+: :+: */ +/* pbkdf2_utils.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2019/05/20 10:10:43 by cpieri #+# #+# */ -/* Updated: 2019/12/31 12:33:19 by cpieri ### ########.fr */ +/* Created: 2019/12/31 13:31:54 by cpieri #+# #+# */ +/* Updated: 2020/01/06 10:57:10 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ -#include "symmetric/pbkdf.h" -#include +#include "pbkdf2/pbkdf.h" -static const t_prf g_prf[4] = { - {HMAC_MD5, hmac_md5}, - {HMAC_SHA1, hmac_sha1}, - {HMAC_SHA256, hmac_sha256}, - {0, NULL} -}; - -uint64_t ft_pbkdf2(uint8_t *pass, uint64_t salt) -{ - uint32_t counter; - void *sum; - t_prf prf; - - (void)salt; - (void)pass; - counter = 1000; - prf = g_prf[0]; - sum = prf.f("The quick brown fox jumps over the lazy dog", 43, "key", 4); - printf("%s\n", hex2sum(sum, 4)); - return (0); -} - -t_pbkdf *new_key(uint8_t *pass, uint64_t salt, uint64_t key, uint64_t vect) +t_pbkdf *new_key(uint8_t *pass, void *salt, uint64_t key, uint64_t vect) { t_pbkdf *new; if (!(new = (t_pbkdf*)malloc(sizeof(t_pbkdf)))) return (NULL); new->pass = pass; - new->salt = (salt > 0) ? salt : get_random(); - new->key = (key > 0) ? key : 0; + new->pass_len = ft_strlen((char*)new->pass); + new->salt = (salt != NULL) ? salt : get_random(); + new->salt_len = ft_strlen((char*)new->salt); + new->key = (key != 0x00) ? &key : 0x00; new->vect = vect; return (new); } diff --git a/srcs/symmetric/sym_key.c b/srcs/symmetric/sym_key.c index 6de7ba4..597c2ba 100644 --- a/srcs/symmetric/sym_key.c +++ b/srcs/symmetric/sym_key.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 13:53:56 by cpieri #+# #+# */ -/* Updated: 2019/05/20 11:02:43 by cpieri ### ########.fr */ +/* Updated: 2020/01/07 15:31:19 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -35,6 +35,8 @@ uint8_t *get_pass(const char *prompt) void print_pbkdf(t_pbkdf *k) { + char *key; + if (k == NULL) { ft_putendl("k is null"); @@ -43,11 +45,11 @@ void print_pbkdf(t_pbkdf *k) ft_putstr("pass: "); ft_putendl((char*)k->pass); ft_putstr("salt: "); - ft_put64hexa(k->salt); + ft_put64hexa(swap_uint64t(((uint64_t*)k->salt)[0])); ft_putchar('\n'); ft_putstr("key: "); - ft_put64hexa(k->key); - ft_putchar('\n'); + key = hex2sum(k->key, k->dk_len / 4); + ft_putendl(key); ft_putstr("vect: "); ft_put64hexa(k->vect); ft_putchar('\n'); diff --git a/srcs/symmetric/symmetric_parsing.c b/srcs/symmetric/symmetric_parsing.c index a8176d1..f005822 100644 --- a/srcs/symmetric/symmetric_parsing.c +++ b/srcs/symmetric/symmetric_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 12:04:37 by cpieri #+# #+# */ -/* Updated: 2019/12/23 15:56:04 by cpieri ### ########.fr */ +/* Updated: 2020/01/07 15:15:31 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,8 +31,6 @@ static const t_sym_opt g_sym_opt[] = static void check_pbkdf2(t_pbkdf **k) { - uint64_t dk; - if (*k != NULL) { if ((*k)->key != 0) @@ -43,13 +41,17 @@ static void check_pbkdf2(t_pbkdf **k) else if ((*k)->pass == NULL) { (*k)->pass = get_pass("enter your password: "); - if ((*k)->salt == 0) + (*k)->pass_len = ft_strlen((*k)->pass); + if ((*k)->salt == NULL) + { (*k)->salt = get_random(); + (*k)->salt_len = ft_strlen((char*)(*k)->salt); + } } } else *k = new_key(get_pass("enter your password: "), 0, 0, 0); - dk = ft_pbkdf2((*k)->pass, (*k)->salt); + pbkdf2(*k, 10000, 32, HMAC_SHA256); } static void get_sym_opt(char **av, int *now, t_opt *opt, t_pbkdf **k) @@ -87,7 +89,7 @@ static t_opt *get_sym_args(const int ac, char **av, int now) now++; } check_pbkdf2(&k); - // print_pbkdf(k); + print_pbkdf(k); get_sym_stdin(&opt, &k); return (new_opt(opt.flags, opt.data)); } diff --git a/srcs/symmetric/symmetric_parsing_pt_f_2.c b/srcs/symmetric/symmetric_parsing_pt_f_2.c index 1c03d2b..6734579 100644 --- a/srcs/symmetric/symmetric_parsing_pt_f_2.c +++ b/srcs/symmetric/symmetric_parsing_pt_f_2.c @@ -6,12 +6,13 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/08 10:21:15 by cpieri #+# #+# */ -/* Updated: 2019/12/09 14:59:28 by cpieri ### ########.fr */ +/* Updated: 2020/01/07 15:14:04 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "symmetric/symmetric.h" #include "ft_ssl.h" +#include void get_sym_opt_k(char **av, int *now, t_opt *opt, t_pbkdf **k) { @@ -26,7 +27,7 @@ void get_sym_opt_k(char **av, int *now, t_opt *opt, t_pbkdf **k) if (*k == NULL) *k = new_key(NULL, 0, key, 0); else - (*k)->key = key; + (*k)->key = &key; (*now)++; } @@ -43,24 +44,36 @@ void get_sym_opt_p(char **av, int *now, t_opt *opt, t_pbkdf **k) *k = new_key((uint8_t*)pass, 0, 0, 0); else (*k)->pass = (uint8_t*)pass; + (*k)->pass_len = ft_strlen(pass); (*now)++; } } void get_sym_opt_s(char **av, int *now, t_opt *opt, t_pbkdf **k) { - uint64_t salt; + unsigned char *salt; + size_t len; + uint64_t nb; - if (av[*now + 1] == NULL || av[*now + 1][0] == '-') + len = 0; + nb = 0; + if ((salt = (unsigned char*)av[*now + 1]) == NULL || av[*now + 1][0] == '-') sym_usage(av[*now]); if ((opt->flags.sym_flags & e_sym_opt_k) != e_sym_opt_k) { - salt = hex2uint64t(av[*now + 1]); + if (ft_ishexa((char*)salt) == 1) + { + nb = swap_uint64t(hex2uint64t((char*)salt)); + salt = ft_memdup(&nb, sizeof(uint64_t)); + len = sizeof(uint64_t); + } + len = ft_strlen((char*)salt); opt->flags.sym_flags |= e_sym_opt_s; if (*k == NULL) *k = new_key(NULL, salt, 0, 0); else (*k)->salt = salt; + (*k)->salt_len = len; (*now)++; } } diff --git a/srcs/tools/get_data.c b/srcs/tools/get_data.c index 61c07b8..d091de9 100644 --- a/srcs/tools/get_data.c +++ b/srcs/tools/get_data.c @@ -6,11 +6,12 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/08 12:03:54 by cpieri #+# #+# */ -/* Updated: 2019/05/20 12:26:59 by cpieri ### ########.fr */ +/* Updated: 2020/01/07 15:31:42 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" +#include t_data *new_data(void) { @@ -89,16 +90,19 @@ t_data *get_data(const int fd, const char *fd_name) return (ret); } -uint64_t get_random(void) +void *get_random(void) { - uint64_t random_value; - int dev_random_fd; - int nb_read; + unsigned char *ret; + uint64_t random_value; + int dev_random_fd; + int nb_read; random_value = FAILURE; dev_random_fd = open_fd("/dev/random"); nb_read = read(dev_random_fd, &random_value, sizeof(uint64_t)); + random_value = swap_uint64t(random_value); + ret = ft_memdup(&random_value, sizeof(uint64_t)); if (nb_read == FAILURE) print_error("get_random"); - return (random_value); + return (ret); } From 59c9e6099e8963b958011029502228345d3a5693 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20P?= Date: Thu, 9 Jan 2020 13:14:14 +0100 Subject: [PATCH 56/71] [Refactor]: Remove files sym_key, move functions pbkdf2 in dir pbkdf2 and move get_pass in file tools/get_data.c --- Makefile | 4 +- includes/functions.h | 3 +- includes/pbkdf2/pbkdf.h | 10 ++-- srcs/pbkdf2/pbkdf2_utils.c | 45 ++++++++++++++++- srcs/symmetric/symmetric_parsing.c | 4 +- srcs/symmetric/symmetric_parsing_pt_f_2.c | 10 ++-- srcs/tools/get_data.c | 3 +- .../sym_key.c => tools/get_data_1.c} | 49 ++----------------- 8 files changed, 63 insertions(+), 65 deletions(-) rename srcs/{symmetric/sym_key.c => tools/get_data_1.c} (52%) diff --git a/Makefile b/Makefile index 7e8752e..9af309c 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/03/15 11:20:25 by cpieri #+# #+# # -# Updated: 2019/12/31 14:37:46 by cpieri ### ########.fr # +# Updated: 2020/01/09 13:06:49 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -50,6 +50,7 @@ SRC_NAME= main.c \ tools/usage.c \ tools/error.c \ tools/get_data.c \ + tools/get_data_1.c \ tools/open_fd.c \ tools/lst_opt.c \ hash/hash_parsing.c \ @@ -73,7 +74,6 @@ SRC_NAME= main.c \ base64/base64_display.c \ pbkdf2/pbkdf2.c \ pbkdf2/pbkdf2_utils.c \ - symmetric/sym_key.c \ symmetric/symmetric_usage.c \ symmetric/symmetric_parsing.c \ symmetric/symmetric_parsing_pt_f.c \ diff --git a/includes/functions.h b/includes/functions.h index 931c4b2..dd37a3a 100644 --- a/includes/functions.h +++ b/includes/functions.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:44:05 by cpieri #+# #+# */ -/* Updated: 2020/01/06 09:02:50 by cpieri ### ########.fr */ +/* Updated: 2020/01/09 13:07:20 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -35,6 +35,7 @@ t_data *get_data(const int fd, const char *fd_name); t_data *get_file(const int fd, const char *fd_name); t_data *get_string(char *s); void *get_random(void); +uint8_t *get_pass(const char *prompt); /* ** Functions for Lst_opt diff --git a/includes/pbkdf2/pbkdf.h b/includes/pbkdf2/pbkdf.h index f3c94ce..3afb0c8 100644 --- a/includes/pbkdf2/pbkdf.h +++ b/includes/pbkdf2/pbkdf.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 10:11:40 by cpieri #+# #+# */ -/* Updated: 2020/01/06 10:33:25 by cpieri ### ########.fr */ +/* Updated: 2020/01/09 12:54:03 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -46,14 +46,12 @@ typedef struct s_pbkdf /* ** Functions for create and del struct symmetric key */ -uint8_t *get_pass(const char *prompt); -t_pbkdf *new_key(uint8_t *pass, void *salt, uint64_t key, +void *pbkdf2(t_pbkdf *k, uint32_t c, size_t dk_len, enum e_prf func); +t_pbkdf *new_t_pbkdf(uint8_t *pass, void *salt, uint64_t key, uint64_t vect); void print_pbkdf(t_pbkdf *to_print); void free_pbkdf(t_pbkdf **to_free); void free_vpbkdf(void **to_free); -uint64_t gen_key(uint8_t *pass, uint64_t salt); -void *pbkdf2(t_pbkdf *k, uint32_t c, size_t dk_len, enum e_prf func); -void regen_key(t_pbkdf **k); +uint8_t *get_pass(const char *prompt); #endif diff --git a/srcs/pbkdf2/pbkdf2_utils.c b/srcs/pbkdf2/pbkdf2_utils.c index 9079bdb..0c71362 100644 --- a/srcs/pbkdf2/pbkdf2_utils.c +++ b/srcs/pbkdf2/pbkdf2_utils.c @@ -6,13 +6,13 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/31 13:31:54 by cpieri #+# #+# */ -/* Updated: 2020/01/06 10:57:10 by cpieri ### ########.fr */ +/* Updated: 2020/01/09 12:52:23 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "pbkdf2/pbkdf.h" -t_pbkdf *new_key(uint8_t *pass, void *salt, uint64_t key, uint64_t vect) +t_pbkdf *new_t_pbkdf(uint8_t *pass, void *salt, uint64_t key, uint64_t vect) { t_pbkdf *new; @@ -26,3 +26,44 @@ t_pbkdf *new_key(uint8_t *pass, void *salt, uint64_t key, uint64_t vect) new->vect = vect; return (new); } + +void print_pbkdf(t_pbkdf *k) +{ + char *key; + + if (k == NULL) + { + ft_putendl("k is null"); + return ; + } + ft_putstr("pass: "); + ft_putendl((char*)k->pass); + ft_putstr("salt: "); + ft_put64hexa(swap_uint64t(((uint64_t*)k->salt)[0])); + ft_putchar('\n'); + ft_putstr("key: "); + key = hex2sum(k->key, k->dk_len / 4); + ft_putendl(key); + ft_putstr("vect: "); + ft_put64hexa(k->vect); + ft_putchar('\n'); +} + +void free_pbkdf(t_pbkdf **to_free) +{ + ft_memdel((void**)&((*to_free)->pass)); + ft_memdel((void**)&((*to_free)->salt)); + ft_memdel((void**)&((*to_free)->key)); + ft_memdel((void**)(to_free)); +} + +void free_vpbkdf(void **to_free) +{ + t_pbkdf **to_del; + + to_del = (t_pbkdf**)to_free; + ft_memdel((void**)&((*to_del)->pass)); + ft_memdel((void**)&((*to_del)->salt)); + ft_memdel((void**)&((*to_del)->key)); + ft_memdel((void**)(to_del)); +} diff --git a/srcs/symmetric/symmetric_parsing.c b/srcs/symmetric/symmetric_parsing.c index f005822..d830d67 100644 --- a/srcs/symmetric/symmetric_parsing.c +++ b/srcs/symmetric/symmetric_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 12:04:37 by cpieri #+# #+# */ -/* Updated: 2020/01/07 15:15:31 by cpieri ### ########.fr */ +/* Updated: 2020/01/09 13:05:03 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -50,7 +50,7 @@ static void check_pbkdf2(t_pbkdf **k) } } else - *k = new_key(get_pass("enter your password: "), 0, 0, 0); + *k = new_t_pbkdf(get_pass("enter your password: "), 0, 0, 0); pbkdf2(*k, 10000, 32, HMAC_SHA256); } diff --git a/srcs/symmetric/symmetric_parsing_pt_f_2.c b/srcs/symmetric/symmetric_parsing_pt_f_2.c index 6734579..b814b36 100644 --- a/srcs/symmetric/symmetric_parsing_pt_f_2.c +++ b/srcs/symmetric/symmetric_parsing_pt_f_2.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/08 10:21:15 by cpieri #+# #+# */ -/* Updated: 2020/01/07 15:14:04 by cpieri ### ########.fr */ +/* Updated: 2020/01/09 13:05:59 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,7 +25,7 @@ void get_sym_opt_k(char **av, int *now, t_opt *opt, t_pbkdf **k) if ((opt->flags.sym_flags & e_sym_opt_s) == e_sym_opt_s) opt->flags.sym_flags ^= e_sym_opt_s; if (*k == NULL) - *k = new_key(NULL, 0, key, 0); + *k = new_t_pbkdf(NULL, 0, key, 0); else (*k)->key = &key; (*now)++; @@ -41,7 +41,7 @@ void get_sym_opt_p(char **av, int *now, t_opt *opt, t_pbkdf **k) { opt->flags.sym_flags |= e_sym_opt_p; if (*k == NULL) - *k = new_key((uint8_t*)pass, 0, 0, 0); + *k = new_t_pbkdf((uint8_t*)pass, 0, 0, 0); else (*k)->pass = (uint8_t*)pass; (*k)->pass_len = ft_strlen(pass); @@ -70,7 +70,7 @@ void get_sym_opt_s(char **av, int *now, t_opt *opt, t_pbkdf **k) len = ft_strlen((char*)salt); opt->flags.sym_flags |= e_sym_opt_s; if (*k == NULL) - *k = new_key(NULL, salt, 0, 0); + *k = new_t_pbkdf(NULL, salt, 0, 0); else (*k)->salt = salt; (*k)->salt_len = len; @@ -87,7 +87,7 @@ void get_sym_opt_v(char **av, int *now, t_opt *opt, t_pbkdf **k) vector = hex2uint64t(av[*now + 1]); opt->flags.sym_flags |= e_sym_opt_v; if (*k == NULL) - *k = new_key(NULL, 0, 0, vector); + *k = new_t_pbkdf(NULL, 0, 0, vector); else (*k)->vect = vector; (*now)++; diff --git a/srcs/tools/get_data.c b/srcs/tools/get_data.c index d091de9..a383f59 100644 --- a/srcs/tools/get_data.c +++ b/srcs/tools/get_data.c @@ -6,12 +6,11 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/08 12:03:54 by cpieri #+# #+# */ -/* Updated: 2020/01/07 15:31:42 by cpieri ### ########.fr */ +/* Updated: 2020/01/09 12:57:25 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" -#include t_data *new_data(void) { diff --git a/srcs/symmetric/sym_key.c b/srcs/tools/get_data_1.c similarity index 52% rename from srcs/symmetric/sym_key.c rename to srcs/tools/get_data_1.c index 597c2ba..e937f21 100644 --- a/srcs/symmetric/sym_key.c +++ b/srcs/tools/get_data_1.c @@ -1,16 +1,16 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* sym_key.c :+: :+: :+: */ +/* get_data_1.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2019/05/06 13:53:56 by cpieri #+# #+# */ -/* Updated: 2020/01/07 15:31:19 by cpieri ### ########.fr */ +/* Created: 2020/01/09 12:54:47 by cpieri #+# #+# */ +/* Updated: 2020/01/09 12:57:52 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ -#include "symmetric/symmetric.h" +// #include "symmetric/symmetric.h" #include "ft_ssl.h" uint8_t *get_pass(const char *prompt) @@ -32,44 +32,3 @@ uint8_t *get_pass(const char *prompt) } return ((uint8_t*)pass); } - -void print_pbkdf(t_pbkdf *k) -{ - char *key; - - if (k == NULL) - { - ft_putendl("k is null"); - return ; - } - ft_putstr("pass: "); - ft_putendl((char*)k->pass); - ft_putstr("salt: "); - ft_put64hexa(swap_uint64t(((uint64_t*)k->salt)[0])); - ft_putchar('\n'); - ft_putstr("key: "); - key = hex2sum(k->key, k->dk_len / 4); - ft_putendl(key); - ft_putstr("vect: "); - ft_put64hexa(k->vect); - ft_putchar('\n'); -} - -void free_pbkdf(t_pbkdf **to_free) -{ - ft_memdel((void**)&((*to_free)->pass)); - ft_memdel((void**)&((*to_free)->salt)); - ft_memdel((void**)&((*to_free)->key)); - ft_memdel((void**)(to_free)); -} - -void free_vpbkdf(void **to_free) -{ - t_pbkdf **to_del; - - to_del = (t_pbkdf**)to_free; - ft_memdel((void**)&((*to_del)->pass)); - ft_memdel((void**)&((*to_del)->salt)); - ft_memdel((void**)&((*to_del)->key)); - ft_memdel((void**)(to_del)); -} From 504e3a708b2e4c90401b9a7194fbe1220f2befad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20P?= Date: Thu, 9 Jan 2020 14:46:46 +0100 Subject: [PATCH 57/71] start evp functions --- includes/EVP/evp.h | 18 ++++++++++++++++++ srcs/EVP/evp_bytes_to_key.c | 18 ++++++++++++++++++ srcs/pbkdf2/pbkdf2.c | 3 +-- 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 includes/EVP/evp.h create mode 100644 srcs/EVP/evp_bytes_to_key.c diff --git a/includes/EVP/evp.h b/includes/EVP/evp.h new file mode 100644 index 0000000..caceff0 --- /dev/null +++ b/includes/EVP/evp.h @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* evp.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/01/09 13:28:17 by cpieri #+# #+# */ +/* Updated: 2020/01/09 13:44:00 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef EVP_H +# define EVP_H + +void *evp_bytes_to_key(t_pbkdf *k, uint32_t c, size_t dk_len, enum e_prf f); + +#endif \ No newline at end of file diff --git a/srcs/EVP/evp_bytes_to_key.c b/srcs/EVP/evp_bytes_to_key.c new file mode 100644 index 0000000..1ea3bdb --- /dev/null +++ b/srcs/EVP/evp_bytes_to_key.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* evp_bytes_to_key.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/01/09 13:15:54 by cpieri #+# #+# */ +/* Updated: 2020/01/09 14:46:23 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "evp.h" + +void *evp_bytes_to_key(t_pbkdf *k, uint32_t c, size_t dk_len, enum e_prf f) +{ + return (NULL); +} \ No newline at end of file diff --git a/srcs/pbkdf2/pbkdf2.c b/srcs/pbkdf2/pbkdf2.c index 2561a67..8f13baf 100644 --- a/srcs/pbkdf2/pbkdf2.c +++ b/srcs/pbkdf2/pbkdf2.c @@ -6,12 +6,11 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/31 13:29:35 by cpieri #+# #+# */ -/* Updated: 2020/01/07 15:21:37 by cpieri ### ########.fr */ +/* Updated: 2020/01/09 13:16:11 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "pbkdf2/pbkdf.h" -#include #include static const t_prf g_prf[4] = { From 64a18eb714ab30b5ff481f8c00da0bc14579b83e Mon Sep 17 00:00:00 2001 From: Louise Pieri Date: Mon, 3 Feb 2020 12:49:58 +0100 Subject: [PATCH 58/71] evp_bytes2key --- .gitignore | 1 + Makefile | 9 +++-- includes/evp/evp.h | 22 +++++++++++ includes/{pbkdf2 => evp}/pbkdf.h | 10 ++++- includes/symmetric/symmetric.h | 4 +- srcs/evp/evp_bytes2key.c | 58 +++++++++++++++++++++++++++++ srcs/{pbkdf2 => evp}/pbkdf2.c | 29 ++------------- srcs/{pbkdf2 => evp}/pbkdf2_utils.c | 26 ++++++++++++- srcs/hash/hmac/hmac_md5.c | 3 +- srcs/symmetric/symmetric_parsing.c | 4 +- 10 files changed, 128 insertions(+), 38 deletions(-) create mode 100644 includes/evp/evp.h rename includes/{pbkdf2 => evp}/pbkdf.h (89%) create mode 100644 srcs/evp/evp_bytes2key.c rename srcs/{pbkdf2 => evp}/pbkdf2.c (84%) rename srcs/{pbkdf2 => evp}/pbkdf2_utils.c (75%) diff --git a/.gitignore b/.gitignore index d583e21..0ac0f15 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,4 @@ Mkfile.old dkms.conf ft_ssl +.vscode diff --git a/Makefile b/Makefile index 7e8752e..072972d 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/03/15 11:20:25 by cpieri #+# #+# # -# Updated: 2019/12/31 14:37:46 by cpieri ### ########.fr # +# Updated: 2020/02/03 09:17:51 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -38,7 +38,7 @@ DEPS = Makefile \ includes/hash/sha1.h \ includes/hash/hmac.h \ includes/base64/base64.h \ - includes/pbkdf2/pbkdf.h \ + includes/evp/pbkdf.h \ includes/symmetric/symmetric.h \ includes/symmetric/des/des.h \ libft/libft.a @@ -71,8 +71,9 @@ SRC_NAME= main.c \ base64/base64_parsing.c \ base64/base64_help_parsing.c \ base64/base64_display.c \ - pbkdf2/pbkdf2.c \ - pbkdf2/pbkdf2_utils.c \ + evp/pbkdf2.c \ + evp/pbkdf2_utils.c \ + evp/evp_bytes2key.c \ symmetric/sym_key.c \ symmetric/symmetric_usage.c \ symmetric/symmetric_parsing.c \ diff --git a/includes/evp/evp.h b/includes/evp/evp.h new file mode 100644 index 0000000..3705c57 --- /dev/null +++ b/includes/evp/evp.h @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* evp.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/03 09:13:54 by cpieri #+# #+# */ +/* Updated: 2020/02/03 09:18:01 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef EVP_H +# define EVP_H + +# include "../../libft/include/libft.h" +# include "../hash/hmac.h" +# include "../functions.h" +# include "../structure.h" + + +#endif \ No newline at end of file diff --git a/includes/pbkdf2/pbkdf.h b/includes/evp/pbkdf.h similarity index 89% rename from includes/pbkdf2/pbkdf.h rename to includes/evp/pbkdf.h index f3c94ce..6206b65 100644 --- a/includes/pbkdf2/pbkdf.h +++ b/includes/evp/pbkdf.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 10:11:40 by cpieri #+# #+# */ -/* Updated: 2020/01/06 10:33:25 by cpieri ### ########.fr */ +/* Updated: 2020/02/03 09:27:47 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -43,6 +43,12 @@ typedef struct s_pbkdf uint64_t vect; } t_pbkdf; + +/* +** EVP Functions utils +*/ +t_prf evp_get_prf(enum e_prf name); + /* ** Functions for create and del struct symmetric key */ @@ -54,6 +60,8 @@ void free_pbkdf(t_pbkdf **to_free); void free_vpbkdf(void **to_free); uint64_t gen_key(uint8_t *pass, uint64_t salt); void *pbkdf2(t_pbkdf *k, uint32_t c, size_t dk_len, enum e_prf func); +void *evp_bytes2key(t_pbkdf *k, uint32_t c, size_t dk_len, + enum e_prf func); void regen_key(t_pbkdf **k); #endif diff --git a/includes/symmetric/symmetric.h b/includes/symmetric/symmetric.h index 6460735..dc05194 100644 --- a/includes/symmetric/symmetric.h +++ b/includes/symmetric/symmetric.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 10:11:43 by cpieri #+# #+# */ -/* Updated: 2019/12/31 14:36:27 by cpieri ### ########.fr */ +/* Updated: 2020/02/03 09:52:47 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,7 +14,7 @@ # define SYMMETRIC_H # include "./des/des.h" -# include "../pbkdf2/pbkdf.h" +# include "../evp/pbkdf.h" enum e_sym_opt { diff --git a/srcs/evp/evp_bytes2key.c b/srcs/evp/evp_bytes2key.c new file mode 100644 index 0000000..12499e3 --- /dev/null +++ b/srcs/evp/evp_bytes2key.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* evp_bytes2key.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/03 09:10:42 by cpieri #+# #+# */ +/* Updated: 2020/02/03 11:15:55 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "evp/pbkdf.h" +#include + +static void *evp_loop(t_pbkdf *k, uint32_t c, t_prf prf) +{ + size_t i; + size_t data_len; + char *data; + char *ret; + char **blocks; + + i = 1; + data = ft_memjoin(k->pass, k->salt, k->pass_len, k->salt_len); + data_len = k->pass_len + k->salt_len; + if (!(blocks = (char**)ft_memalloc(sizeof(char*) * c))) + return (NULL); + blocks[0] = (char*)ft_memalloc(sizeof(uint8_t) * prf.nb_word + 1); + while (i < c) + { + blocks[i] = prf.f(data, data_len, blocks[i - 1], prf.nb_word); + // blocks[i] = prf.f(blocks[i - 1], prf.nb_word, data, data_len); + i++; + } + ret = ft_memdup(blocks[i - 1], prf.nb_word); + while (--i > 0) + ft_memdel((void**)&(blocks[i])); + ft_memdel((void**)blocks); + ft_memdel((void**)&data); + return (ret); +} + +void *evp_bytes2key(t_pbkdf *k, uint32_t c, size_t dk_len, enum e_prf func) +{ + t_prf prf; + void *tmp; + char *ret; + + if (!(ret = (char*)ft_memalloc(sizeof(char) * (dk_len + 1)))) + return (NULL); + prf = evp_get_prf(func); + tmp = evp_loop(k, c, prf); + ft_memcpy(ret, tmp, dk_len); + k->key = ret; + k->dk_len = dk_len; + return (ret); +} \ No newline at end of file diff --git a/srcs/pbkdf2/pbkdf2.c b/srcs/evp/pbkdf2.c similarity index 84% rename from srcs/pbkdf2/pbkdf2.c rename to srcs/evp/pbkdf2.c index 2561a67..ade5e79 100644 --- a/srcs/pbkdf2/pbkdf2.c +++ b/srcs/evp/pbkdf2.c @@ -6,36 +6,13 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/31 13:29:35 by cpieri #+# #+# */ -/* Updated: 2020/01/07 15:21:37 by cpieri ### ########.fr */ +/* Updated: 2020/02/03 09:27:12 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ -#include "pbkdf2/pbkdf.h" -#include +#include "evp/pbkdf.h" #include -static const t_prf g_prf[4] = { - {HMAC_MD5, hmac_md5, 16}, - {HMAC_SHA1, hmac_sha1, 20}, - {HMAC_SHA256, hmac_sha256, 32}, - {0, NULL, 0} -}; - -static t_prf pbkdf2_get_prf(enum e_prf name) -{ - t_prf ret; - size_t i; - - i = 0; - while (i < 4) - { - if (g_prf[i].prf == name) - ret = g_prf[i]; - i++; - } - return (ret); -} - static void pbkdf2_xor_dgst(void const *dgst1, void const *dgst2, size_t nb) { char *dgst1_cpy; @@ -102,7 +79,7 @@ void *pbkdf2(t_pbkdf *k, uint32_t c, size_t dk_len, enum e_prf func) t_prf prf; i = 1; - prf = pbkdf2_get_prf(func); + prf = evp_get_prf(func); l = ceil((double)(dk_len / prf.nb_word)) + 1; if (!(ret = (char*)ft_memalloc(sizeof(char) * (dk_len + 1)))) return (NULL); diff --git a/srcs/pbkdf2/pbkdf2_utils.c b/srcs/evp/pbkdf2_utils.c similarity index 75% rename from srcs/pbkdf2/pbkdf2_utils.c rename to srcs/evp/pbkdf2_utils.c index 9079bdb..fbe4246 100644 --- a/srcs/pbkdf2/pbkdf2_utils.c +++ b/srcs/evp/pbkdf2_utils.c @@ -6,11 +6,33 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/31 13:31:54 by cpieri #+# #+# */ -/* Updated: 2020/01/06 10:57:10 by cpieri ### ########.fr */ +/* Updated: 2020/02/03 09:28:07 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ -#include "pbkdf2/pbkdf.h" +#include "evp/pbkdf.h" + +static const t_prf g_prf[4] = { + {HMAC_MD5, hmac_md5, 16}, + {HMAC_SHA1, hmac_sha1, 20}, + {HMAC_SHA256, hmac_sha256, 32}, + {0, NULL, 0} +}; + +t_prf evp_get_prf(enum e_prf name) +{ + t_prf ret; + size_t i; + + i = 0; + while (i < 4) + { + if (g_prf[i].prf == name) + ret = g_prf[i]; + i++; + } + return (ret); +} t_pbkdf *new_key(uint8_t *pass, void *salt, uint64_t key, uint64_t vect) { diff --git a/srcs/hash/hmac/hmac_md5.c b/srcs/hash/hmac/hmac_md5.c index fdea5fa..1530d77 100644 --- a/srcs/hash/hmac/hmac_md5.c +++ b/srcs/hash/hmac/hmac_md5.c @@ -6,12 +6,13 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/31 12:29:58 by cpieri #+# #+# */ -/* Updated: 2019/12/31 12:31:13 by cpieri ### ########.fr */ +/* Updated: 2020/02/03 10:46:23 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "hash/hmac.h" #include "hash/md5.h" +#include static void *hmac_md5_digest(void *c1, void *c2, size_t l_c1, size_t l_c2) { diff --git a/srcs/symmetric/symmetric_parsing.c b/srcs/symmetric/symmetric_parsing.c index f005822..c4c6199 100644 --- a/srcs/symmetric/symmetric_parsing.c +++ b/srcs/symmetric/symmetric_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 12:04:37 by cpieri #+# #+# */ -/* Updated: 2020/01/07 15:15:31 by cpieri ### ########.fr */ +/* Updated: 2020/02/03 11:15:43 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -51,7 +51,7 @@ static void check_pbkdf2(t_pbkdf **k) } else *k = new_key(get_pass("enter your password: "), 0, 0, 0); - pbkdf2(*k, 10000, 32, HMAC_SHA256); + evp_bytes2key(*k, 1000, 8, HMAC_SHA256); } static void get_sym_opt(char **av, int *now, t_opt *opt, t_pbkdf **k) From 09ca5c1b7523e22255037ac2d46cf5e04106b979 Mon Sep 17 00:00:00 2001 From: Louise P Date: Mon, 3 Feb 2020 12:57:11 +0100 Subject: [PATCH 59/71] evp_bytes2key --- .gitignore | 1 + Makefile | 10 +-- includes/{EVP => evp}/evp.h | 10 ++- includes/evp/pbkdf.h | 67 +++++++++++++++++++++ includes/symmetric/symmetric.h | 4 +- srcs/evp/evp_bytes2key.c | 58 ++++++++++++++++++ srcs/evp/pbkdf2.c | 97 ++++++++++++++++++++++++++++++ srcs/evp/pbkdf2_utils.c | 50 +++++++++++++++ srcs/hash/hmac/hmac_md5.c | 3 +- srcs/symmetric/symmetric_parsing.c | 6 +- 10 files changed, 293 insertions(+), 13 deletions(-) rename includes/{EVP => evp}/evp.h (76%) create mode 100644 includes/evp/pbkdf.h create mode 100644 srcs/evp/evp_bytes2key.c create mode 100644 srcs/evp/pbkdf2.c create mode 100644 srcs/evp/pbkdf2_utils.c diff --git a/.gitignore b/.gitignore index d583e21..0ac0f15 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,4 @@ Mkfile.old dkms.conf ft_ssl +.vscode diff --git a/Makefile b/Makefile index 9af309c..53f6967 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/03/15 11:20:25 by cpieri #+# #+# # -# Updated: 2020/01/09 13:06:49 by cpieri ### ########.fr # +# Updated: 2020/02/03 09:17:51 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -38,7 +38,7 @@ DEPS = Makefile \ includes/hash/sha1.h \ includes/hash/hmac.h \ includes/base64/base64.h \ - includes/pbkdf2/pbkdf.h \ + includes/evp/pbkdf.h \ includes/symmetric/symmetric.h \ includes/symmetric/des/des.h \ libft/libft.a @@ -72,8 +72,10 @@ SRC_NAME= main.c \ base64/base64_parsing.c \ base64/base64_help_parsing.c \ base64/base64_display.c \ - pbkdf2/pbkdf2.c \ - pbkdf2/pbkdf2_utils.c \ + evp/pbkdf2.c \ + evp/pbkdf2_utils.c \ + evp/evp_bytes2key.c \ + symmetric/sym_key.c \ symmetric/symmetric_usage.c \ symmetric/symmetric_parsing.c \ symmetric/symmetric_parsing_pt_f.c \ diff --git a/includes/EVP/evp.h b/includes/evp/evp.h similarity index 76% rename from includes/EVP/evp.h rename to includes/evp/evp.h index caceff0..3705c57 100644 --- a/includes/EVP/evp.h +++ b/includes/evp/evp.h @@ -5,14 +5,18 @@ /* +:+ +:+ +:+ */ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2020/01/09 13:28:17 by cpieri #+# #+# */ -/* Updated: 2020/01/09 13:44:00 by cpieri ### ########.fr */ +/* Created: 2020/02/03 09:13:54 by cpieri #+# #+# */ +/* Updated: 2020/02/03 09:18:01 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef EVP_H # define EVP_H -void *evp_bytes_to_key(t_pbkdf *k, uint32_t c, size_t dk_len, enum e_prf f); +# include "../../libft/include/libft.h" +# include "../hash/hmac.h" +# include "../functions.h" +# include "../structure.h" + #endif \ No newline at end of file diff --git a/includes/evp/pbkdf.h b/includes/evp/pbkdf.h new file mode 100644 index 0000000..6206b65 --- /dev/null +++ b/includes/evp/pbkdf.h @@ -0,0 +1,67 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* pbkdf.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/05/20 10:11:40 by cpieri #+# #+# */ +/* Updated: 2020/02/03 09:27:47 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef PBKDF_H +# define PBKDF_H + +# include "../../libft/include/libft.h" +# include "../hash/hmac.h" +# include "../functions.h" +# include "../structure.h" + +enum e_prf +{ + HMAC_MD5 = 0x000000001, + HMAC_SHA1 = 0x000000010, + HMAC_SHA256 = 0x000000100 +}; + +typedef struct s_prf +{ + enum e_prf prf; + void *(*f)(void *, size_t, void *, size_t); + size_t nb_word; +} t_prf; + +typedef struct s_pbkdf +{ + void *pass; + void *salt; + void *key; + size_t pass_len; + size_t salt_len; + size_t dk_len; + uint64_t vect; +} t_pbkdf; + + +/* +** EVP Functions utils +*/ +t_prf evp_get_prf(enum e_prf name); + +/* +** Functions for create and del struct symmetric key +*/ +uint8_t *get_pass(const char *prompt); +t_pbkdf *new_key(uint8_t *pass, void *salt, uint64_t key, + uint64_t vect); +void print_pbkdf(t_pbkdf *to_print); +void free_pbkdf(t_pbkdf **to_free); +void free_vpbkdf(void **to_free); +uint64_t gen_key(uint8_t *pass, uint64_t salt); +void *pbkdf2(t_pbkdf *k, uint32_t c, size_t dk_len, enum e_prf func); +void *evp_bytes2key(t_pbkdf *k, uint32_t c, size_t dk_len, + enum e_prf func); +void regen_key(t_pbkdf **k); + +#endif diff --git a/includes/symmetric/symmetric.h b/includes/symmetric/symmetric.h index 6460735..dc05194 100644 --- a/includes/symmetric/symmetric.h +++ b/includes/symmetric/symmetric.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 10:11:43 by cpieri #+# #+# */ -/* Updated: 2019/12/31 14:36:27 by cpieri ### ########.fr */ +/* Updated: 2020/02/03 09:52:47 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,7 +14,7 @@ # define SYMMETRIC_H # include "./des/des.h" -# include "../pbkdf2/pbkdf.h" +# include "../evp/pbkdf.h" enum e_sym_opt { diff --git a/srcs/evp/evp_bytes2key.c b/srcs/evp/evp_bytes2key.c new file mode 100644 index 0000000..12499e3 --- /dev/null +++ b/srcs/evp/evp_bytes2key.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* evp_bytes2key.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/03 09:10:42 by cpieri #+# #+# */ +/* Updated: 2020/02/03 11:15:55 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "evp/pbkdf.h" +#include + +static void *evp_loop(t_pbkdf *k, uint32_t c, t_prf prf) +{ + size_t i; + size_t data_len; + char *data; + char *ret; + char **blocks; + + i = 1; + data = ft_memjoin(k->pass, k->salt, k->pass_len, k->salt_len); + data_len = k->pass_len + k->salt_len; + if (!(blocks = (char**)ft_memalloc(sizeof(char*) * c))) + return (NULL); + blocks[0] = (char*)ft_memalloc(sizeof(uint8_t) * prf.nb_word + 1); + while (i < c) + { + blocks[i] = prf.f(data, data_len, blocks[i - 1], prf.nb_word); + // blocks[i] = prf.f(blocks[i - 1], prf.nb_word, data, data_len); + i++; + } + ret = ft_memdup(blocks[i - 1], prf.nb_word); + while (--i > 0) + ft_memdel((void**)&(blocks[i])); + ft_memdel((void**)blocks); + ft_memdel((void**)&data); + return (ret); +} + +void *evp_bytes2key(t_pbkdf *k, uint32_t c, size_t dk_len, enum e_prf func) +{ + t_prf prf; + void *tmp; + char *ret; + + if (!(ret = (char*)ft_memalloc(sizeof(char) * (dk_len + 1)))) + return (NULL); + prf = evp_get_prf(func); + tmp = evp_loop(k, c, prf); + ft_memcpy(ret, tmp, dk_len); + k->key = ret; + k->dk_len = dk_len; + return (ret); +} \ No newline at end of file diff --git a/srcs/evp/pbkdf2.c b/srcs/evp/pbkdf2.c new file mode 100644 index 0000000..ade5e79 --- /dev/null +++ b/srcs/evp/pbkdf2.c @@ -0,0 +1,97 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* pbkdf2.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/12/31 13:29:35 by cpieri #+# #+# */ +/* Updated: 2020/02/03 09:27:12 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "evp/pbkdf.h" +#include + +static void pbkdf2_xor_dgst(void const *dgst1, void const *dgst2, size_t nb) +{ + char *dgst1_cpy; + char *dgst2_cpy; + size_t i; + + i = 0; + dgst1_cpy = (char*)dgst1; + dgst2_cpy = (char*)dgst2; + while (i < nb) + { + dgst1_cpy[i] ^= dgst2_cpy[i]; + i++; + } +} + +static void *first_i(t_pbkdf *k, size_t y, t_prf prf) +{ + void *buff; + void *ret; + + if (!(buff = ft_memalloc(k->salt_len + 4))) + return (NULL); + ft_memcpy(buff, k->salt, k->salt_len); + *(uint32_t*)(buff + k->salt_len) = swap_uint32t((uint32_t)y); + ret = prf.f(buff, k->salt_len + 4, k->pass, k->pass_len); + ft_memdel(&buff); + return (ret); +} + +static void *pbkdf2_f(t_pbkdf *k, uint32_t c, t_prf prf, size_t y) +{ + size_t i; + char *ret; + char **blocks; + + i = 0; + if (!(blocks = (char**)ft_memalloc(sizeof(char*) * c))) + return (NULL); + while (i < c) + { + if (i == 0) + blocks[0] = first_i(k, y, prf); + else + { + blocks[i] = prf.f(blocks[i - 1], prf.nb_word, k->pass, k->pass_len); + pbkdf2_xor_dgst(blocks[0], blocks[i], prf.nb_word); + } + i++; + } + ret = ft_memdup(blocks[0], prf.nb_word); + while (--i > 0) + ft_memdel((void**)&(blocks[i])); + ft_memdel((void**)blocks); + return (ret); +} + +void *pbkdf2(t_pbkdf *k, uint32_t c, size_t dk_len, enum e_prf func) +{ + size_t i; + size_t l; + void *tmp; + char *ret; + t_prf prf; + + i = 1; + prf = evp_get_prf(func); + l = ceil((double)(dk_len / prf.nb_word)) + 1; + if (!(ret = (char*)ft_memalloc(sizeof(char) * (dk_len + 1)))) + return (NULL); + while (i <= l) + { + tmp = pbkdf2_f(k, c, prf, i); + ft_memcpy(ret + ((i - 1) * prf.nb_word), tmp, + (i == l) ? dk_len % prf.nb_word : prf.nb_word); + ft_memdel(&tmp); + i++; + } + k->key = ret; + k->dk_len = dk_len; + return (ret); +} diff --git a/srcs/evp/pbkdf2_utils.c b/srcs/evp/pbkdf2_utils.c new file mode 100644 index 0000000..fbe4246 --- /dev/null +++ b/srcs/evp/pbkdf2_utils.c @@ -0,0 +1,50 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* pbkdf2_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/12/31 13:31:54 by cpieri #+# #+# */ +/* Updated: 2020/02/03 09:28:07 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "evp/pbkdf.h" + +static const t_prf g_prf[4] = { + {HMAC_MD5, hmac_md5, 16}, + {HMAC_SHA1, hmac_sha1, 20}, + {HMAC_SHA256, hmac_sha256, 32}, + {0, NULL, 0} +}; + +t_prf evp_get_prf(enum e_prf name) +{ + t_prf ret; + size_t i; + + i = 0; + while (i < 4) + { + if (g_prf[i].prf == name) + ret = g_prf[i]; + i++; + } + return (ret); +} + +t_pbkdf *new_key(uint8_t *pass, void *salt, uint64_t key, uint64_t vect) +{ + t_pbkdf *new; + + if (!(new = (t_pbkdf*)malloc(sizeof(t_pbkdf)))) + return (NULL); + new->pass = pass; + new->pass_len = ft_strlen((char*)new->pass); + new->salt = (salt != NULL) ? salt : get_random(); + new->salt_len = ft_strlen((char*)new->salt); + new->key = (key != 0x00) ? &key : 0x00; + new->vect = vect; + return (new); +} diff --git a/srcs/hash/hmac/hmac_md5.c b/srcs/hash/hmac/hmac_md5.c index fdea5fa..1530d77 100644 --- a/srcs/hash/hmac/hmac_md5.c +++ b/srcs/hash/hmac/hmac_md5.c @@ -6,12 +6,13 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/31 12:29:58 by cpieri #+# #+# */ -/* Updated: 2019/12/31 12:31:13 by cpieri ### ########.fr */ +/* Updated: 2020/02/03 10:46:23 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "hash/hmac.h" #include "hash/md5.h" +#include static void *hmac_md5_digest(void *c1, void *c2, size_t l_c1, size_t l_c2) { diff --git a/srcs/symmetric/symmetric_parsing.c b/srcs/symmetric/symmetric_parsing.c index d830d67..c4c6199 100644 --- a/srcs/symmetric/symmetric_parsing.c +++ b/srcs/symmetric/symmetric_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 12:04:37 by cpieri #+# #+# */ -/* Updated: 2020/01/09 13:05:03 by cpieri ### ########.fr */ +/* Updated: 2020/02/03 11:15:43 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -50,8 +50,8 @@ static void check_pbkdf2(t_pbkdf **k) } } else - *k = new_t_pbkdf(get_pass("enter your password: "), 0, 0, 0); - pbkdf2(*k, 10000, 32, HMAC_SHA256); + *k = new_key(get_pass("enter your password: "), 0, 0, 0); + evp_bytes2key(*k, 1000, 8, HMAC_SHA256); } static void get_sym_opt(char **av, int *now, t_opt *opt, t_pbkdf **k) From cbb276538c8de008e093624043b9b7de824d6c75 Mon Sep 17 00:00:00 2001 From: Louise P Date: Tue, 4 Feb 2020 12:03:04 +0100 Subject: [PATCH 60/71] [Function]: EVP_BytesToKey {wip} - Merge branch des and dev/functions/evp_functions - Change struct t_pbkdf2 in t_evp - Add dir includes/evp with evp.h, evp_bytes2key.h pbkdf2.h - Add dir srcs/evp with evp_struct.c (for t_evp) , evp_bytes2key.c (for the function evp_bytes2key), pbkdf2.c (for pbkdf2) and 2 utils (evp_b2k & pbkdf2) - Delete the dir pbkdf in includes and srcs Next Change: - Norme 42 - Add option -pbkdf2 and -iter - Add dispatcher for evp_bytes2key and pbkdf2 --- Makefile | 5 +- includes/evp/evp.h | 22 +++- includes/evp/evp_bytes2key.h | 39 ++++++ includes/evp/pbkdf.h | 40 +----- includes/functions.h | 2 +- includes/pbkdf2/pbkdf.h | 57 --------- includes/symmetric/symmetric.h | 25 ++-- key_aes256cbc_b2k | 1 + openssl_des_cbc_evp_b2k | 3 + .../evp_b2k_utils.c} | 29 ++++- srcs/evp/evp_bytes2key.c | 35 ++++-- .../pbkdf2_utils.c => evp/evp_struct.c} | 24 ++-- srcs/evp/pbkdf2.c | 26 +--- srcs/evp/pbkdf2_utils.c | 27 ++-- srcs/pbkdf2/pbkdf2.c | 119 ------------------ srcs/symmetric/symmetric_parsing.c | 16 +-- srcs/symmetric/symmetric_parsing_pt_f.c | 12 +- srcs/symmetric/symmetric_parsing_pt_f_2.c | 21 ++-- srcs/tools/lst_opt.c | 4 +- 19 files changed, 188 insertions(+), 319 deletions(-) create mode 100644 includes/evp/evp_bytes2key.h delete mode 100644 includes/pbkdf2/pbkdf.h create mode 100644 key_aes256cbc_b2k create mode 100644 openssl_des_cbc_evp_b2k rename srcs/{EVP/evp_bytes_to_key.c => evp/evp_b2k_utils.c} (56%) rename srcs/{pbkdf2/pbkdf2_utils.c => evp/evp_struct.c} (76%) delete mode 100644 srcs/pbkdf2/pbkdf2.c diff --git a/Makefile b/Makefile index 53f6967..7cccece 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: cpieri +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/03/15 11:20:25 by cpieri #+# #+# # -# Updated: 2020/02/03 09:17:51 by cpieri ### ########.fr # +# Updated: 2020/02/04 10:12:31 by cpieri ### ########.fr # # # # **************************************************************************** # @@ -74,8 +74,9 @@ SRC_NAME= main.c \ base64/base64_display.c \ evp/pbkdf2.c \ evp/pbkdf2_utils.c \ + evp/evp_struct.c \ evp/evp_bytes2key.c \ - symmetric/sym_key.c \ + evp/evp_b2k_utils.c \ symmetric/symmetric_usage.c \ symmetric/symmetric_parsing.c \ symmetric/symmetric_parsing_pt_f.c \ diff --git a/includes/evp/evp.h b/includes/evp/evp.h index 3705c57..bdf7edc 100644 --- a/includes/evp/evp.h +++ b/includes/evp/evp.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/03 09:13:54 by cpieri #+# #+# */ -/* Updated: 2020/02/03 09:18:01 by cpieri ### ########.fr */ +/* Updated: 2020/02/04 09:56:20 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,9 +14,25 @@ # define EVP_H # include "../../libft/include/libft.h" -# include "../hash/hmac.h" -# include "../functions.h" # include "../structure.h" +# include "../functions.h" +# include "../hash/hash.h" + +typedef struct s_evp +{ + void *pass; + void *salt; + void *key; + size_t pass_len; + size_t salt_len; + size_t dk_len; + uint64_t vect; +} t_evp; +t_evp *new_t_evp(uint8_t *pass, void *salt, uint64_t key, + uint64_t vect); +void print_evp(t_evp *to_print); +void free_evp(t_evp **to_free); +void free_vevp(void **to_free); #endif \ No newline at end of file diff --git a/includes/evp/evp_bytes2key.h b/includes/evp/evp_bytes2key.h new file mode 100644 index 0000000..fdb0acc --- /dev/null +++ b/includes/evp/evp_bytes2key.h @@ -0,0 +1,39 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* evp_bytes2key.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cpieri +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/04 10:03:30 by cpieri #+# #+# */ +/* Updated: 2020/02/04 10:23:56 by cpieri ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef EVP_BYTES2KEY_H +# define EVP_BYTES2KEY_H + +# include "./evp.h" +# include "../hash/md5.h" +# include "../hash/sha1.h" +# include "../hash/sha256.h" + +enum e_hash_f +{ + EVP_MD5 = 0x000000001, + EVP_SHA1 = 0x000000010, + EVP_SHA256 = 0x000000100 +}; + +typedef struct s_evp_hash +{ + enum e_hash_f hash_f; + void *(*f)(void *, size_t); + size_t nb_word; +} t_evp_hash; + +t_evp_hash evp_get_hashf(enum e_hash_f name); +void *evp_bytes2key(t_evp *k, uint32_t c, size_t dk_len, + enum e_hash_f func); + +#endif \ No newline at end of file diff --git a/includes/evp/pbkdf.h b/includes/evp/pbkdf.h index 6206b65..fdb9e51 100644 --- a/includes/evp/pbkdf.h +++ b/includes/evp/pbkdf.h @@ -6,17 +6,15 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 10:11:40 by cpieri #+# #+# */ -/* Updated: 2020/02/03 09:27:47 by cpieri ### ########.fr */ +/* Updated: 2020/02/04 10:06:24 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef PBKDF_H # define PBKDF_H -# include "../../libft/include/libft.h" +# include "./evp.h" # include "../hash/hmac.h" -# include "../functions.h" -# include "../structure.h" enum e_prf { @@ -32,36 +30,8 @@ typedef struct s_prf size_t nb_word; } t_prf; -typedef struct s_pbkdf -{ - void *pass; - void *salt; - void *key; - size_t pass_len; - size_t salt_len; - size_t dk_len; - uint64_t vect; -} t_pbkdf; - - -/* -** EVP Functions utils -*/ -t_prf evp_get_prf(enum e_prf name); - -/* -** Functions for create and del struct symmetric key -*/ -uint8_t *get_pass(const char *prompt); -t_pbkdf *new_key(uint8_t *pass, void *salt, uint64_t key, - uint64_t vect); -void print_pbkdf(t_pbkdf *to_print); -void free_pbkdf(t_pbkdf **to_free); -void free_vpbkdf(void **to_free); -uint64_t gen_key(uint8_t *pass, uint64_t salt); -void *pbkdf2(t_pbkdf *k, uint32_t c, size_t dk_len, enum e_prf func); -void *evp_bytes2key(t_pbkdf *k, uint32_t c, size_t dk_len, - enum e_prf func); -void regen_key(t_pbkdf **k); +t_prf pbkdf2_get_prf(enum e_prf name); +void pbkdf2_xor_dgst(void const *dgst1, void const *dgst2, size_t nb); +void *pbkdf2(t_evp *k, uint32_t c, size_t dk_len, enum e_prf func); #endif diff --git a/includes/functions.h b/includes/functions.h index dd37a3a..cc89f82 100644 --- a/includes/functions.h +++ b/includes/functions.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/04/11 12:44:05 by cpieri #+# #+# */ -/* Updated: 2020/01/09 13:07:20 by cpieri ### ########.fr */ +/* Updated: 2020/02/04 09:47:01 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/includes/pbkdf2/pbkdf.h b/includes/pbkdf2/pbkdf.h deleted file mode 100644 index 3afb0c8..0000000 --- a/includes/pbkdf2/pbkdf.h +++ /dev/null @@ -1,57 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* pbkdf.h :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: cpieri +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2019/05/20 10:11:40 by cpieri #+# #+# */ -/* Updated: 2020/01/09 12:54:03 by cpieri ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#ifndef PBKDF_H -# define PBKDF_H - -# include "../../libft/include/libft.h" -# include "../hash/hmac.h" -# include "../functions.h" -# include "../structure.h" - -enum e_prf -{ - HMAC_MD5 = 0x000000001, - HMAC_SHA1 = 0x000000010, - HMAC_SHA256 = 0x000000100 -}; - -typedef struct s_prf -{ - enum e_prf prf; - void *(*f)(void *, size_t, void *, size_t); - size_t nb_word; -} t_prf; - -typedef struct s_pbkdf -{ - void *pass; - void *salt; - void *key; - size_t pass_len; - size_t salt_len; - size_t dk_len; - uint64_t vect; -} t_pbkdf; - -/* -** Functions for create and del struct symmetric key -*/ -void *pbkdf2(t_pbkdf *k, uint32_t c, size_t dk_len, enum e_prf func); -t_pbkdf *new_t_pbkdf(uint8_t *pass, void *salt, uint64_t key, - uint64_t vect); -void print_pbkdf(t_pbkdf *to_print); -void free_pbkdf(t_pbkdf **to_free); -void free_vpbkdf(void **to_free); -uint8_t *get_pass(const char *prompt); - -#endif diff --git a/includes/symmetric/symmetric.h b/includes/symmetric/symmetric.h index dc05194..0f399d6 100644 --- a/includes/symmetric/symmetric.h +++ b/includes/symmetric/symmetric.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 10:11:43 by cpieri #+# #+# */ -/* Updated: 2020/02/03 09:52:47 by cpieri ### ########.fr */ +/* Updated: 2020/02/04 10:25:57 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,6 +15,7 @@ # include "./des/des.h" # include "../evp/pbkdf.h" +# include "../evp/evp_bytes2key.h" enum e_sym_opt { @@ -33,23 +34,23 @@ typedef struct s_sym_opt { char opt; uint64_t flag; - void (*sym_opt_fun)(char **, int *, t_opt *, t_pbkdf **); + void (*sym_opt_fun)(char **, int *, t_opt *, t_evp **); } t_sym_opt; /* ** Functions for get options in parsing */ t_opt *symmetric_opts(const int ac, char **av, t_opt *opts, int now); -void get_sym_opt_a(char **av, int *now, t_opt *opt, t_pbkdf **k); -void get_sym_opt_d(char **av, int *now, t_opt *opt, t_pbkdf **k); -void get_sym_opt_e(char **av, int *now, t_opt *opt, t_pbkdf **k); -void get_sym_opt_i(char **av, int *now, t_opt *opt, t_pbkdf **k); -void get_sym_opt_o(char **av, int *now, t_opt *opt, t_pbkdf **k); -void get_sym_opt_k(char **av, int *now, t_opt *opt, t_pbkdf **k); -void get_sym_opt_s(char **av, int *now, t_opt *opt, t_pbkdf **k); -void get_sym_opt_p(char **av, int *now, t_opt *opt, t_pbkdf **k); -void get_sym_opt_v(char **av, int *now, t_opt *opt, t_pbkdf **k); -void get_sym_stdin(t_opt *opt, t_pbkdf **k); +void get_sym_opt_a(char **av, int *now, t_opt *opt, t_evp **k); +void get_sym_opt_d(char **av, int *now, t_opt *opt, t_evp **k); +void get_sym_opt_e(char **av, int *now, t_opt *opt, t_evp **k); +void get_sym_opt_i(char **av, int *now, t_opt *opt, t_evp **k); +void get_sym_opt_o(char **av, int *now, t_opt *opt, t_evp **k); +void get_sym_opt_k(char **av, int *now, t_opt *opt, t_evp **k); +void get_sym_opt_s(char **av, int *now, t_opt *opt, t_evp **k); +void get_sym_opt_p(char **av, int *now, t_opt *opt, t_evp **k); +void get_sym_opt_v(char **av, int *now, t_opt *opt, t_evp **k); +void get_sym_stdin(t_opt *opt, t_evp **k); /* ** Usage diff --git a/key_aes256cbc_b2k b/key_aes256cbc_b2k new file mode 100644 index 0000000..cd7b9de --- /dev/null +++ b/key_aes256cbc_b2k @@ -0,0 +1 @@ +A91E0DEFDEDC3CE178C8C44FCD5CEEC57995306B52B5051BD06A9230B0533A62 diff --git a/openssl_des_cbc_evp_b2k b/openssl_des_cbc_evp_b2k new file mode 100644 index 0000000..24269d6 --- /dev/null +++ b/openssl_des_cbc_evp_b2k @@ -0,0 +1,3 @@ +salt=F4BF8287EAEACB25 +key=A91E0DEFDEDC3CE1 +iv =78C8C44FCD5CEEC5 diff --git a/srcs/EVP/evp_bytes_to_key.c b/srcs/evp/evp_b2k_utils.c similarity index 56% rename from srcs/EVP/evp_bytes_to_key.c rename to srcs/evp/evp_b2k_utils.c index 1ea3bdb..bfacc35 100644 --- a/srcs/EVP/evp_bytes_to_key.c +++ b/srcs/evp/evp_b2k_utils.c @@ -1,18 +1,35 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* evp_bytes_to_key.c :+: :+: :+: */ +/* evp_b2k_utils.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2020/01/09 13:15:54 by cpieri #+# #+# */ -/* Updated: 2020/01/09 14:46:23 by cpieri ### ########.fr */ +/* Created: 2020/02/04 10:11:43 by cpieri #+# #+# */ +/* Updated: 2020/02/04 10:16:34 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ -#include "evp.h" +#include "evp/evp_bytes2key.h" -void *evp_bytes_to_key(t_pbkdf *k, uint32_t c, size_t dk_len, enum e_prf f) +static const t_evp_hash g_evp_hash[4] = { + {EVP_MD5, md5, 16}, + {EVP_SHA1, sha1, 20}, + {EVP_SHA256, sha256, 32}, + {0, NULL, 0} +}; + +t_evp_hash evp_get_hashf(enum e_hash_f name) { - return (NULL); + t_evp_hash ret; + size_t i; + + i = 0; + while (i < 4) + { + if (g_evp_hash[i].hash_f == name) + ret = g_evp_hash[i]; + i++; + } + return (ret); } \ No newline at end of file diff --git a/srcs/evp/evp_bytes2key.c b/srcs/evp/evp_bytes2key.c index 12499e3..ee68c07 100644 --- a/srcs/evp/evp_bytes2key.c +++ b/srcs/evp/evp_bytes2key.c @@ -6,34 +6,45 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/03 09:10:42 by cpieri #+# #+# */ -/* Updated: 2020/02/03 11:15:55 by cpieri ### ########.fr */ +/* Updated: 2020/02/04 11:51:26 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ -#include "evp/pbkdf.h" +#include "evp/evp_bytes2key.h" #include -static void *evp_loop(t_pbkdf *k, uint32_t c, t_prf prf) +static void *evp_loop(t_evp *k, uint32_t c, t_evp_hash hash_f) { size_t i; size_t data_len; + t_hash *digest; + char *tmp; char *data; char *ret; char **blocks; - i = 1; + i = 0; data = ft_memjoin(k->pass, k->salt, k->pass_len, k->salt_len); data_len = k->pass_len + k->salt_len; if (!(blocks = (char**)ft_memalloc(sizeof(char*) * c))) return (NULL); - blocks[0] = (char*)ft_memalloc(sizeof(uint8_t) * prf.nb_word + 1); while (i < c) { - blocks[i] = prf.f(data, data_len, blocks[i - 1], prf.nb_word); - // blocks[i] = prf.f(blocks[i - 1], prf.nb_word, data, data_len); + if (i == 0) { + tmp = data; + digest = hash_f.f(tmp, data_len); + } + else { + tmp = ft_memjoin(blocks[i - 1], data, hash_f.nb_word, data_len); + digest = hash_f.f(tmp, hash_f.nb_word + data_len); + ft_memdel((void**)&tmp); + } + blocks[i] = one_sum(digest->h, digest->nb_word); + ft_memdel((void**)&(digest->h)); + ft_memdel((void**)&digest); i++; } - ret = ft_memdup(blocks[i - 1], prf.nb_word); + ret = ft_memdup(blocks[c - 1], hash_f.nb_word); while (--i > 0) ft_memdel((void**)&(blocks[i])); ft_memdel((void**)blocks); @@ -41,16 +52,16 @@ static void *evp_loop(t_pbkdf *k, uint32_t c, t_prf prf) return (ret); } -void *evp_bytes2key(t_pbkdf *k, uint32_t c, size_t dk_len, enum e_prf func) +void *evp_bytes2key(t_evp *k, uint32_t c, size_t dk_len, enum e_hash_f func) { - t_prf prf; + t_evp_hash hash_f; void *tmp; char *ret; + hash_f = evp_get_hashf(func); if (!(ret = (char*)ft_memalloc(sizeof(char) * (dk_len + 1)))) return (NULL); - prf = evp_get_prf(func); - tmp = evp_loop(k, c, prf); + tmp = evp_loop(k, c, hash_f); ft_memcpy(ret, tmp, dk_len); k->key = ret; k->dk_len = dk_len; diff --git a/srcs/pbkdf2/pbkdf2_utils.c b/srcs/evp/evp_struct.c similarity index 76% rename from srcs/pbkdf2/pbkdf2_utils.c rename to srcs/evp/evp_struct.c index 0c71362..e0f44e5 100644 --- a/srcs/pbkdf2/pbkdf2_utils.c +++ b/srcs/evp/evp_struct.c @@ -1,22 +1,22 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* pbkdf2_utils.c :+: :+: :+: */ +/* evp_utils.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2019/12/31 13:31:54 by cpieri #+# #+# */ -/* Updated: 2020/01/09 12:52:23 by cpieri ### ########.fr */ +/* Created: 2020/02/04 09:23:01 by cpieri #+# #+# */ +/* Updated: 2020/02/04 10:00:15 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ -#include "pbkdf2/pbkdf.h" +#include "evp/evp.h" -t_pbkdf *new_t_pbkdf(uint8_t *pass, void *salt, uint64_t key, uint64_t vect) +t_evp *new_t_evp(uint8_t *pass, void *salt, uint64_t key, uint64_t vect) { - t_pbkdf *new; + t_evp *new; - if (!(new = (t_pbkdf*)malloc(sizeof(t_pbkdf)))) + if (!(new = (t_evp*)malloc(sizeof(t_evp)))) return (NULL); new->pass = pass; new->pass_len = ft_strlen((char*)new->pass); @@ -27,7 +27,7 @@ t_pbkdf *new_t_pbkdf(uint8_t *pass, void *salt, uint64_t key, uint64_t vect) return (new); } -void print_pbkdf(t_pbkdf *k) +void print_evp(t_evp *k) { char *key; @@ -49,7 +49,7 @@ void print_pbkdf(t_pbkdf *k) ft_putchar('\n'); } -void free_pbkdf(t_pbkdf **to_free) +void free_evp(t_evp **to_free) { ft_memdel((void**)&((*to_free)->pass)); ft_memdel((void**)&((*to_free)->salt)); @@ -57,11 +57,11 @@ void free_pbkdf(t_pbkdf **to_free) ft_memdel((void**)(to_free)); } -void free_vpbkdf(void **to_free) +void free_vevp(void **to_free) { - t_pbkdf **to_del; + t_evp **to_del; - to_del = (t_pbkdf**)to_free; + to_del = (t_evp**)to_free; ft_memdel((void**)&((*to_del)->pass)); ft_memdel((void**)&((*to_del)->salt)); ft_memdel((void**)&((*to_del)->key)); diff --git a/srcs/evp/pbkdf2.c b/srcs/evp/pbkdf2.c index ade5e79..c9201ce 100644 --- a/srcs/evp/pbkdf2.c +++ b/srcs/evp/pbkdf2.c @@ -6,30 +6,14 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/31 13:29:35 by cpieri #+# #+# */ -/* Updated: 2020/02/03 09:27:12 by cpieri ### ########.fr */ +/* Updated: 2020/02/04 09:58:21 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "evp/pbkdf.h" #include -static void pbkdf2_xor_dgst(void const *dgst1, void const *dgst2, size_t nb) -{ - char *dgst1_cpy; - char *dgst2_cpy; - size_t i; - - i = 0; - dgst1_cpy = (char*)dgst1; - dgst2_cpy = (char*)dgst2; - while (i < nb) - { - dgst1_cpy[i] ^= dgst2_cpy[i]; - i++; - } -} - -static void *first_i(t_pbkdf *k, size_t y, t_prf prf) +static void *first_i(t_evp *k, size_t y, t_prf prf) { void *buff; void *ret; @@ -43,7 +27,7 @@ static void *first_i(t_pbkdf *k, size_t y, t_prf prf) return (ret); } -static void *pbkdf2_f(t_pbkdf *k, uint32_t c, t_prf prf, size_t y) +static void *pbkdf2_f(t_evp *k, uint32_t c, t_prf prf, size_t y) { size_t i; char *ret; @@ -70,7 +54,7 @@ static void *pbkdf2_f(t_pbkdf *k, uint32_t c, t_prf prf, size_t y) return (ret); } -void *pbkdf2(t_pbkdf *k, uint32_t c, size_t dk_len, enum e_prf func) +void *pbkdf2(t_evp *k, uint32_t c, size_t dk_len, enum e_prf func) { size_t i; size_t l; @@ -79,7 +63,7 @@ void *pbkdf2(t_pbkdf *k, uint32_t c, size_t dk_len, enum e_prf func) t_prf prf; i = 1; - prf = evp_get_prf(func); + prf = pbkdf2_get_prf(func); l = ceil((double)(dk_len / prf.nb_word)) + 1; if (!(ret = (char*)ft_memalloc(sizeof(char) * (dk_len + 1)))) return (NULL); diff --git a/srcs/evp/pbkdf2_utils.c b/srcs/evp/pbkdf2_utils.c index fbe4246..93c9628 100644 --- a/srcs/evp/pbkdf2_utils.c +++ b/srcs/evp/pbkdf2_utils.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/31 13:31:54 by cpieri #+# #+# */ -/* Updated: 2020/02/03 09:28:07 by cpieri ### ########.fr */ +/* Updated: 2020/02/04 09:49:43 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,7 +19,7 @@ static const t_prf g_prf[4] = { {0, NULL, 0} }; -t_prf evp_get_prf(enum e_prf name) +t_prf pbkdf2_get_prf(enum e_prf name) { t_prf ret; size_t i; @@ -34,17 +34,18 @@ t_prf evp_get_prf(enum e_prf name) return (ret); } -t_pbkdf *new_key(uint8_t *pass, void *salt, uint64_t key, uint64_t vect) +void pbkdf2_xor_dgst(void const *dgst1, void const *dgst2, size_t nb) { - t_pbkdf *new; + char *dgst1_cpy; + char *dgst2_cpy; + size_t i; - if (!(new = (t_pbkdf*)malloc(sizeof(t_pbkdf)))) - return (NULL); - new->pass = pass; - new->pass_len = ft_strlen((char*)new->pass); - new->salt = (salt != NULL) ? salt : get_random(); - new->salt_len = ft_strlen((char*)new->salt); - new->key = (key != 0x00) ? &key : 0x00; - new->vect = vect; - return (new); + i = 0; + dgst1_cpy = (char*)dgst1; + dgst2_cpy = (char*)dgst2; + while (i < nb) + { + dgst1_cpy[i] ^= dgst2_cpy[i]; + i++; + } } diff --git a/srcs/pbkdf2/pbkdf2.c b/srcs/pbkdf2/pbkdf2.c deleted file mode 100644 index 8f13baf..0000000 --- a/srcs/pbkdf2/pbkdf2.c +++ /dev/null @@ -1,119 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* pbkdf2.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: cpieri +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2019/12/31 13:29:35 by cpieri #+# #+# */ -/* Updated: 2020/01/09 13:16:11 by cpieri ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "pbkdf2/pbkdf.h" -#include - -static const t_prf g_prf[4] = { - {HMAC_MD5, hmac_md5, 16}, - {HMAC_SHA1, hmac_sha1, 20}, - {HMAC_SHA256, hmac_sha256, 32}, - {0, NULL, 0} -}; - -static t_prf pbkdf2_get_prf(enum e_prf name) -{ - t_prf ret; - size_t i; - - i = 0; - while (i < 4) - { - if (g_prf[i].prf == name) - ret = g_prf[i]; - i++; - } - return (ret); -} - -static void pbkdf2_xor_dgst(void const *dgst1, void const *dgst2, size_t nb) -{ - char *dgst1_cpy; - char *dgst2_cpy; - size_t i; - - i = 0; - dgst1_cpy = (char*)dgst1; - dgst2_cpy = (char*)dgst2; - while (i < nb) - { - dgst1_cpy[i] ^= dgst2_cpy[i]; - i++; - } -} - -static void *first_i(t_pbkdf *k, size_t y, t_prf prf) -{ - void *buff; - void *ret; - - if (!(buff = ft_memalloc(k->salt_len + 4))) - return (NULL); - ft_memcpy(buff, k->salt, k->salt_len); - *(uint32_t*)(buff + k->salt_len) = swap_uint32t((uint32_t)y); - ret = prf.f(buff, k->salt_len + 4, k->pass, k->pass_len); - ft_memdel(&buff); - return (ret); -} - -static void *pbkdf2_f(t_pbkdf *k, uint32_t c, t_prf prf, size_t y) -{ - size_t i; - char *ret; - char **blocks; - - i = 0; - if (!(blocks = (char**)ft_memalloc(sizeof(char*) * c))) - return (NULL); - while (i < c) - { - if (i == 0) - blocks[0] = first_i(k, y, prf); - else - { - blocks[i] = prf.f(blocks[i - 1], prf.nb_word, k->pass, k->pass_len); - pbkdf2_xor_dgst(blocks[0], blocks[i], prf.nb_word); - } - i++; - } - ret = ft_memdup(blocks[0], prf.nb_word); - while (--i > 0) - ft_memdel((void**)&(blocks[i])); - ft_memdel((void**)blocks); - return (ret); -} - -void *pbkdf2(t_pbkdf *k, uint32_t c, size_t dk_len, enum e_prf func) -{ - size_t i; - size_t l; - void *tmp; - char *ret; - t_prf prf; - - i = 1; - prf = pbkdf2_get_prf(func); - l = ceil((double)(dk_len / prf.nb_word)) + 1; - if (!(ret = (char*)ft_memalloc(sizeof(char) * (dk_len + 1)))) - return (NULL); - while (i <= l) - { - tmp = pbkdf2_f(k, c, prf, i); - ft_memcpy(ret + ((i - 1) * prf.nb_word), tmp, - (i == l) ? dk_len % prf.nb_word : prf.nb_word); - ft_memdel(&tmp); - i++; - } - k->key = ret; - k->dk_len = dk_len; - return (ret); -} diff --git a/srcs/symmetric/symmetric_parsing.c b/srcs/symmetric/symmetric_parsing.c index c4c6199..10bfdf5 100644 --- a/srcs/symmetric/symmetric_parsing.c +++ b/srcs/symmetric/symmetric_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 12:04:37 by cpieri #+# #+# */ -/* Updated: 2020/02/03 11:15:43 by cpieri ### ########.fr */ +/* Updated: 2020/02/04 11:51:47 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,7 +29,7 @@ static const t_sym_opt g_sym_opt[] = {0, 0, NULL} }; -static void check_pbkdf2(t_pbkdf **k) +static void check_pbkdf2(t_evp **k) { if (*k != NULL) { @@ -50,11 +50,13 @@ static void check_pbkdf2(t_pbkdf **k) } } else - *k = new_key(get_pass("enter your password: "), 0, 0, 0); - evp_bytes2key(*k, 1000, 8, HMAC_SHA256); + *k = new_t_evp(get_pass("enter your password: "), 0, 0, 0); + // evp_bytes2key(*k, 1, 8, EVP_MD5); + // evp_bytes2key(*k, 9, 8, EVP_MD5); + evp_bytes2key(*k, 10, 8, EVP_MD5); } -static void get_sym_opt(char **av, int *now, t_opt *opt, t_pbkdf **k) +static void get_sym_opt(char **av, int *now, t_opt *opt, t_evp **k) { size_t len_now; size_t i; @@ -78,7 +80,7 @@ static void get_sym_opt(char **av, int *now, t_opt *opt, t_pbkdf **k) static t_opt *get_sym_args(const int ac, char **av, int now) { t_opt opt; - t_pbkdf *k; + t_evp *k; k = NULL; opt = (t_opt){NULL, {0, 0, 0, 0, 0, 0}, NULL}; @@ -89,7 +91,7 @@ static t_opt *get_sym_args(const int ac, char **av, int now) now++; } check_pbkdf2(&k); - print_pbkdf(k); + print_evp(k); get_sym_stdin(&opt, &k); return (new_opt(opt.flags, opt.data)); } diff --git a/srcs/symmetric/symmetric_parsing_pt_f.c b/srcs/symmetric/symmetric_parsing_pt_f.c index 8e4a002..ed12007 100644 --- a/srcs/symmetric/symmetric_parsing_pt_f.c +++ b/srcs/symmetric/symmetric_parsing_pt_f.c @@ -6,14 +6,14 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/07 09:34:06 by cpieri #+# #+# */ -/* Updated: 2019/12/11 12:45:22 by cpieri ### ########.fr */ +/* Updated: 2020/02/04 09:58:35 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "symmetric/symmetric.h" #include "ft_ssl.h" -void get_sym_opt_i(char **av, int *now, t_opt *opt, t_pbkdf **k) +void get_sym_opt_i(char **av, int *now, t_opt *opt, t_evp **k) { char *fd; const char *fd_output; @@ -35,7 +35,7 @@ void get_sym_opt_i(char **av, int *now, t_opt *opt, t_pbkdf **k) (*now)++; } -void get_sym_opt_o(char **av, int *now, t_opt *opt, t_pbkdf **k) +void get_sym_opt_o(char **av, int *now, t_opt *opt, t_evp **k) { char *fd_output; @@ -49,7 +49,7 @@ void get_sym_opt_o(char **av, int *now, t_opt *opt, t_pbkdf **k) (*now)++; } -void get_sym_opt_a(char **av, int *now, t_opt *opt, t_pbkdf **k) +void get_sym_opt_a(char **av, int *now, t_opt *opt, t_evp **k) { (void)av; (void)now; @@ -57,7 +57,7 @@ void get_sym_opt_a(char **av, int *now, t_opt *opt, t_pbkdf **k) opt->flags.sym_flags |= e_sym_opt_a; } -void get_sym_opt_d(char **av, int *now, t_opt *opt, t_pbkdf **k) +void get_sym_opt_d(char **av, int *now, t_opt *opt, t_evp **k) { (void)k; (void)now; @@ -67,7 +67,7 @@ void get_sym_opt_d(char **av, int *now, t_opt *opt, t_pbkdf **k) opt->flags.sym_flags |= e_sym_opt_d; } -void get_sym_opt_e(char **av, int *now, t_opt *opt, t_pbkdf **k) +void get_sym_opt_e(char **av, int *now, t_opt *opt, t_evp **k) { (void)k; (void)now; diff --git a/srcs/symmetric/symmetric_parsing_pt_f_2.c b/srcs/symmetric/symmetric_parsing_pt_f_2.c index b814b36..267eba5 100644 --- a/srcs/symmetric/symmetric_parsing_pt_f_2.c +++ b/srcs/symmetric/symmetric_parsing_pt_f_2.c @@ -6,15 +6,14 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/08 10:21:15 by cpieri #+# #+# */ -/* Updated: 2020/01/09 13:05:59 by cpieri ### ########.fr */ +/* Updated: 2020/02/04 09:58:30 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "symmetric/symmetric.h" #include "ft_ssl.h" -#include -void get_sym_opt_k(char **av, int *now, t_opt *opt, t_pbkdf **k) +void get_sym_opt_k(char **av, int *now, t_opt *opt, t_evp **k) { uint64_t key; @@ -25,13 +24,13 @@ void get_sym_opt_k(char **av, int *now, t_opt *opt, t_pbkdf **k) if ((opt->flags.sym_flags & e_sym_opt_s) == e_sym_opt_s) opt->flags.sym_flags ^= e_sym_opt_s; if (*k == NULL) - *k = new_t_pbkdf(NULL, 0, key, 0); + *k = new_t_evp(NULL, 0, key, 0); else (*k)->key = &key; (*now)++; } -void get_sym_opt_p(char **av, int *now, t_opt *opt, t_pbkdf **k) +void get_sym_opt_p(char **av, int *now, t_opt *opt, t_evp **k) { char *pass; @@ -41,7 +40,7 @@ void get_sym_opt_p(char **av, int *now, t_opt *opt, t_pbkdf **k) { opt->flags.sym_flags |= e_sym_opt_p; if (*k == NULL) - *k = new_t_pbkdf((uint8_t*)pass, 0, 0, 0); + *k = new_t_evp((uint8_t*)pass, 0, 0, 0); else (*k)->pass = (uint8_t*)pass; (*k)->pass_len = ft_strlen(pass); @@ -49,7 +48,7 @@ void get_sym_opt_p(char **av, int *now, t_opt *opt, t_pbkdf **k) } } -void get_sym_opt_s(char **av, int *now, t_opt *opt, t_pbkdf **k) +void get_sym_opt_s(char **av, int *now, t_opt *opt, t_evp **k) { unsigned char *salt; size_t len; @@ -70,7 +69,7 @@ void get_sym_opt_s(char **av, int *now, t_opt *opt, t_pbkdf **k) len = ft_strlen((char*)salt); opt->flags.sym_flags |= e_sym_opt_s; if (*k == NULL) - *k = new_t_pbkdf(NULL, salt, 0, 0); + *k = new_t_evp(NULL, salt, 0, 0); else (*k)->salt = salt; (*k)->salt_len = len; @@ -78,7 +77,7 @@ void get_sym_opt_s(char **av, int *now, t_opt *opt, t_pbkdf **k) } } -void get_sym_opt_v(char **av, int *now, t_opt *opt, t_pbkdf **k) +void get_sym_opt_v(char **av, int *now, t_opt *opt, t_evp **k) { uint64_t vector; @@ -87,13 +86,13 @@ void get_sym_opt_v(char **av, int *now, t_opt *opt, t_pbkdf **k) vector = hex2uint64t(av[*now + 1]); opt->flags.sym_flags |= e_sym_opt_v; if (*k == NULL) - *k = new_t_pbkdf(NULL, 0, 0, vector); + *k = new_t_evp(NULL, 0, 0, vector); else (*k)->vect = vector; (*now)++; } -void get_sym_stdin(t_opt *opt, t_pbkdf **k) +void get_sym_stdin(t_opt *opt, t_evp **k) { const char *fd_output; diff --git a/srcs/tools/lst_opt.c b/srcs/tools/lst_opt.c index b6955aa..2c48230 100644 --- a/srcs/tools/lst_opt.c +++ b/srcs/tools/lst_opt.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/08 17:29:55 by cpieri #+# #+# */ -/* Updated: 2019/05/20 12:15:32 by cpieri ### ########.fr */ +/* Updated: 2020/02/04 09:58:54 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,7 +22,7 @@ void print_lst(t_opt **lst) ft_putstr("data to crypt: "); ft_memput(tmp->data->data, tmp->data->len_data); ft_membits(&tmp->flags.sym_flags, 0, sizeof(uint64_t)); - print_pbkdf((t_pbkdf*)(tmp->data->pass)); + print_evp((t_evp*)(tmp->data->pass)); if (tmp->data->fd_output != NULL) { ft_putstr("fd to output: "); From 59a367b940331c8ee7973ab8eeed4827ba044b3c Mon Sep 17 00:00:00 2001 From: Louise P Date: Tue, 4 Feb 2020 13:09:13 +0100 Subject: [PATCH 61/71] [Functions]: EVP_BytesToKey {wip} - Norme 42 --- includes/evp/evp.h | 3 +- srcs/evp/evp_b2k_utils.c | 4 +- srcs/evp/evp_bytes2key.c | 67 +++++++++++++++--------------- srcs/evp/pbkdf2.c | 3 +- srcs/symmetric/symmetric_parsing.c | 6 +-- test_mine | 1 + 6 files changed, 41 insertions(+), 43 deletions(-) create mode 100644 test_mine diff --git a/includes/evp/evp.h b/includes/evp/evp.h index bdf7edc..976596c 100644 --- a/includes/evp/evp.h +++ b/includes/evp/evp.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/03 09:13:54 by cpieri #+# #+# */ -/* Updated: 2020/02/04 09:56:20 by cpieri ### ########.fr */ +/* Updated: 2020/02/04 12:06:51 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,6 +17,7 @@ # include "../structure.h" # include "../functions.h" # include "../hash/hash.h" +# include typedef struct s_evp { diff --git a/srcs/evp/evp_b2k_utils.c b/srcs/evp/evp_b2k_utils.c index bfacc35..0e54736 100644 --- a/srcs/evp/evp_b2k_utils.c +++ b/srcs/evp/evp_b2k_utils.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/04 10:11:43 by cpieri #+# #+# */ -/* Updated: 2020/02/04 10:16:34 by cpieri ### ########.fr */ +/* Updated: 2020/02/04 13:05:03 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -32,4 +32,4 @@ t_evp_hash evp_get_hashf(enum e_hash_f name) i++; } return (ret); -} \ No newline at end of file +} diff --git a/srcs/evp/evp_bytes2key.c b/srcs/evp/evp_bytes2key.c index ee68c07..6d987a5 100644 --- a/srcs/evp/evp_bytes2key.c +++ b/srcs/evp/evp_bytes2key.c @@ -6,64 +6,63 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/03 09:10:42 by cpieri #+# #+# */ -/* Updated: 2020/02/04 11:51:26 by cpieri ### ########.fr */ +/* Updated: 2020/02/04 13:06:38 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "evp/evp_bytes2key.h" #include -static void *evp_loop(t_evp *k, uint32_t c, t_evp_hash hash_f) +static void *evp_loop(t_evp *k, size_t i, char *key, t_evp_hash hash_f) { - size_t i; - size_t data_len; - t_hash *digest; - char *tmp; char *data; - char *ret; - char **blocks; + char *tmp; + void *ret; + t_hash *digest; + size_t len; - i = 0; data = ft_memjoin(k->pass, k->salt, k->pass_len, k->salt_len); - data_len = k->pass_len + k->salt_len; - if (!(blocks = (char**)ft_memalloc(sizeof(char*) * c))) - return (NULL); - while (i < c) + len = k->pass_len + k->salt_len; + tmp = data; + if (i != 1) { - if (i == 0) { - tmp = data; - digest = hash_f.f(tmp, data_len); - } - else { - tmp = ft_memjoin(blocks[i - 1], data, hash_f.nb_word, data_len); - digest = hash_f.f(tmp, hash_f.nb_word + data_len); - ft_memdel((void**)&tmp); - } - blocks[i] = one_sum(digest->h, digest->nb_word); - ft_memdel((void**)&(digest->h)); - ft_memdel((void**)&digest); - i++; + tmp = ft_memjoin(key, data, (hash_f.nb_word * (i - 1)), len); + len += (hash_f.nb_word * (i - 1)); } - ret = ft_memdup(blocks[c - 1], hash_f.nb_word); - while (--i > 0) - ft_memdel((void**)&(blocks[i])); - ft_memdel((void**)blocks); + digest = hash_f.f(tmp, len); + ret = one_sum(digest->h, digest->nb_word); + if (len > (k->pass_len + k->salt_len)) + ft_memdel((void**)&tmp); ft_memdel((void**)&data); + ft_memdel((void**)&(digest->h)); + ft_memdel((void**)&digest); return (ret); } -void *evp_bytes2key(t_evp *k, uint32_t c, size_t dk_len, enum e_hash_f func) +void *evp_bytes2key(t_evp *k, uint32_t c, size_t dk_len, + enum e_hash_f func) { + size_t i; + size_t l; t_evp_hash hash_f; void *tmp; char *ret; + i = 1; + (void)c; hash_f = evp_get_hashf(func); + l = ceil((double)(dk_len / hash_f.nb_word)) + 1; if (!(ret = (char*)ft_memalloc(sizeof(char) * (dk_len + 1)))) return (NULL); - tmp = evp_loop(k, c, hash_f); - ft_memcpy(ret, tmp, dk_len); + while (i <= l) + { + tmp = evp_loop(k, i, ret, hash_f); + ft_memcpy(ret + ((i - 1) * hash_f.nb_word), tmp, + (i == l) ? dk_len % hash_f.nb_word : hash_f.nb_word); + ft_memdel(&tmp); + i++; + } k->key = ret; k->dk_len = dk_len; return (ret); -} \ No newline at end of file +} diff --git a/srcs/evp/pbkdf2.c b/srcs/evp/pbkdf2.c index c9201ce..2f4559e 100644 --- a/srcs/evp/pbkdf2.c +++ b/srcs/evp/pbkdf2.c @@ -6,12 +6,11 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/31 13:29:35 by cpieri #+# #+# */ -/* Updated: 2020/02/04 09:58:21 by cpieri ### ########.fr */ +/* Updated: 2020/02/04 12:06:45 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "evp/pbkdf.h" -#include static void *first_i(t_evp *k, size_t y, t_prf prf) { diff --git a/srcs/symmetric/symmetric_parsing.c b/srcs/symmetric/symmetric_parsing.c index 10bfdf5..285d508 100644 --- a/srcs/symmetric/symmetric_parsing.c +++ b/srcs/symmetric/symmetric_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 12:04:37 by cpieri #+# #+# */ -/* Updated: 2020/02/04 11:51:47 by cpieri ### ########.fr */ +/* Updated: 2020/02/04 13:08:47 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -51,9 +51,7 @@ static void check_pbkdf2(t_evp **k) } else *k = new_t_evp(get_pass("enter your password: "), 0, 0, 0); - // evp_bytes2key(*k, 1, 8, EVP_MD5); - // evp_bytes2key(*k, 9, 8, EVP_MD5); - evp_bytes2key(*k, 10, 8, EVP_MD5); + pbkdf2(*k, 1, 32, HMAC_SHA256); } static void get_sym_opt(char **av, int *now, t_opt *opt, t_evp **k) diff --git a/test_mine b/test_mine new file mode 100644 index 0000000..d7b05dc --- /dev/null +++ b/test_mine @@ -0,0 +1 @@ +a91e0defdedc3ce178c8c44fcd5ceec57995306b52b5051bd06a9230b0533a62 From 4b4f06c693775e282c49677c0956f5f83254afc3 Mon Sep 17 00:00:00 2001 From: Louise P Date: Tue, 4 Feb 2020 15:39:18 +0100 Subject: [PATCH 62/71] {wip} --- includes/evp/evp.h | 8 ++++---- includes/evp/evp_bytes2key.h | 2 +- includes/evp/pbkdf.h | 2 +- srcs/evp/evp_bytes2key.c | 2 +- srcs/evp/evp_struct.c | 13 ++++++++----- srcs/evp/pbkdf2.c | 2 +- srcs/symmetric/symmetric_parsing.c | 7 +++++-- srcs/symmetric/symmetric_parsing_pt_f_2.c | 22 ++++++++++++++++------ 8 files changed, 37 insertions(+), 21 deletions(-) diff --git a/includes/evp/evp.h b/includes/evp/evp.h index 976596c..6f526c9 100644 --- a/includes/evp/evp.h +++ b/includes/evp/evp.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/03 09:13:54 by cpieri #+# #+# */ -/* Updated: 2020/02/04 12:06:51 by cpieri ### ########.fr */ +/* Updated: 2020/02/04 14:40:55 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,14 +24,14 @@ typedef struct s_evp void *pass; void *salt; void *key; + void *vect; size_t pass_len; size_t salt_len; size_t dk_len; - uint64_t vect; + size_t iv_len; } t_evp; -t_evp *new_t_evp(uint8_t *pass, void *salt, uint64_t key, - uint64_t vect); +t_evp *new_t_evp(uint8_t *pass, void *salt, uint64_t key, void *vect); void print_evp(t_evp *to_print); void free_evp(t_evp **to_free); void free_vevp(void **to_free); diff --git a/includes/evp/evp_bytes2key.h b/includes/evp/evp_bytes2key.h index fdb0acc..6ba137c 100644 --- a/includes/evp/evp_bytes2key.h +++ b/includes/evp/evp_bytes2key.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/04 10:03:30 by cpieri #+# #+# */ -/* Updated: 2020/02/04 10:23:56 by cpieri ### ########.fr */ +/* Updated: 2020/02/04 14:38:46 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/includes/evp/pbkdf.h b/includes/evp/pbkdf.h index fdb9e51..ebd2c58 100644 --- a/includes/evp/pbkdf.h +++ b/includes/evp/pbkdf.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 10:11:40 by cpieri #+# #+# */ -/* Updated: 2020/02/04 10:06:24 by cpieri ### ########.fr */ +/* Updated: 2020/02/04 14:38:20 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/srcs/evp/evp_bytes2key.c b/srcs/evp/evp_bytes2key.c index 6d987a5..7d83a6c 100644 --- a/srcs/evp/evp_bytes2key.c +++ b/srcs/evp/evp_bytes2key.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/03 09:10:42 by cpieri #+# #+# */ -/* Updated: 2020/02/04 13:06:38 by cpieri ### ########.fr */ +/* Updated: 2020/02/04 14:38:40 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/srcs/evp/evp_struct.c b/srcs/evp/evp_struct.c index e0f44e5..c5e9cb3 100644 --- a/srcs/evp/evp_struct.c +++ b/srcs/evp/evp_struct.c @@ -1,18 +1,18 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* evp_utils.c :+: :+: :+: */ +/* evp_struct.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/04 09:23:01 by cpieri #+# #+# */ -/* Updated: 2020/02/04 10:00:15 by cpieri ### ########.fr */ +/* Updated: 2020/02/04 14:44:37 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "evp/evp.h" -t_evp *new_t_evp(uint8_t *pass, void *salt, uint64_t key, uint64_t vect) +t_evp *new_t_evp(uint8_t *pass, void *salt, uint64_t key, void *vect) { t_evp *new; @@ -30,6 +30,7 @@ t_evp *new_t_evp(uint8_t *pass, void *salt, uint64_t key, uint64_t vect) void print_evp(t_evp *k) { char *key; + char *vect; if (k == NULL) { @@ -45,8 +46,10 @@ void print_evp(t_evp *k) key = hex2sum(k->key, k->dk_len / 4); ft_putendl(key); ft_putstr("vect: "); - ft_put64hexa(k->vect); - ft_putchar('\n'); + vect = hex2sum(k->vect, k->iv_len / 4); + ft_putendl(key); + // ft_memdel((void**)&key); + // ft_memdel((void**)&vect); } void free_evp(t_evp **to_free) diff --git a/srcs/evp/pbkdf2.c b/srcs/evp/pbkdf2.c index 2f4559e..39f2bf3 100644 --- a/srcs/evp/pbkdf2.c +++ b/srcs/evp/pbkdf2.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/31 13:29:35 by cpieri #+# #+# */ -/* Updated: 2020/02/04 12:06:45 by cpieri ### ########.fr */ +/* Updated: 2020/02/04 14:38:21 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/srcs/symmetric/symmetric_parsing.c b/srcs/symmetric/symmetric_parsing.c index 285d508..3ec0b7f 100644 --- a/srcs/symmetric/symmetric_parsing.c +++ b/srcs/symmetric/symmetric_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 12:04:37 by cpieri #+# #+# */ -/* Updated: 2020/02/04 13:08:47 by cpieri ### ########.fr */ +/* Updated: 2020/02/04 14:37:21 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -50,8 +50,10 @@ static void check_pbkdf2(t_evp **k) } } else + { *k = new_t_evp(get_pass("enter your password: "), 0, 0, 0); - pbkdf2(*k, 1, 32, HMAC_SHA256); + evp_bytes2key(*k, 1, 8 + sizeof(uint64_t), EVP_MD5); + } } static void get_sym_opt(char **av, int *now, t_opt *opt, t_evp **k) @@ -101,5 +103,6 @@ t_opt *symmetric_opts(const int ac, char **av, t_opt *opts, int now) new = get_sym_args(ac, av, now); add_to_end_lst(new, &opts); // print_lst(&opts); + while (1); return (opts); } diff --git a/srcs/symmetric/symmetric_parsing_pt_f_2.c b/srcs/symmetric/symmetric_parsing_pt_f_2.c index 267eba5..2133eb6 100644 --- a/srcs/symmetric/symmetric_parsing_pt_f_2.c +++ b/srcs/symmetric/symmetric_parsing_pt_f_2.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/08 10:21:15 by cpieri #+# #+# */ -/* Updated: 2020/02/04 09:58:30 by cpieri ### ########.fr */ +/* Updated: 2020/02/04 14:41:55 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -79,16 +79,26 @@ void get_sym_opt_s(char **av, int *now, t_opt *opt, t_evp **k) void get_sym_opt_v(char **av, int *now, t_opt *opt, t_evp **k) { - uint64_t vector; + unsigned char *vect; + size_t len; + uint64_t vector; - if (av[*now + 1] == NULL || av[*now + 1][0] == '-') + len = 0; + vector = 0; + if ((vect = (unsigned char*)av[*now + 1]) == NULL || av[*now + 1][0] == '-') sym_usage(av[*now]); - vector = hex2uint64t(av[*now + 1]); + if (ft_ishexa((char*)vect) == 1) + { + vector = hex2uint64t((char*)vect); + vect = ft_memdup(&vector, sizeof(uint64_t)); + len = sizeof(uint64_t); + } opt->flags.sym_flags |= e_sym_opt_v; if (*k == NULL) - *k = new_t_evp(NULL, 0, 0, vector); + *k = new_t_evp(NULL, 0, 0, vect); else - (*k)->vect = vector; + (*k)->vect = vect; + (*k)->iv_len = len; (*now)++; } From 7b828294e53e90849373f46f806bda09c73538ee Mon Sep 17 00:00:00 2001 From: Louise P Date: Wed, 5 Feb 2020 10:20:08 +0100 Subject: [PATCH 63/71] [Option]: Create option -pbkdf2 - Create struct s_evp_f - Change the enum parameter of functions `evp_b2k` & `pbkdf2` to int Next change: - Norme 42 - Check leaks - Remove --- includes/evp/evp_bytes2key.h | 4 +-- includes/evp/pbkdf.h | 4 +-- includes/symmetric/symmetric.h | 11 +++++++- srcs/evp/evp_bytes2key.c | 5 ++-- srcs/evp/evp_struct.c | 8 +++--- srcs/evp/pbkdf2.c | 4 +-- srcs/symmetric/symmetric_parsing.c | 40 +++++++++++++++++++++--------- 7 files changed, 49 insertions(+), 27 deletions(-) diff --git a/includes/evp/evp_bytes2key.h b/includes/evp/evp_bytes2key.h index 6ba137c..e87d652 100644 --- a/includes/evp/evp_bytes2key.h +++ b/includes/evp/evp_bytes2key.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/04 10:03:30 by cpieri #+# #+# */ -/* Updated: 2020/02/04 14:38:46 by cpieri ### ########.fr */ +/* Updated: 2020/02/05 10:12:19 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -34,6 +34,6 @@ typedef struct s_evp_hash t_evp_hash evp_get_hashf(enum e_hash_f name); void *evp_bytes2key(t_evp *k, uint32_t c, size_t dk_len, - enum e_hash_f func); + int func); #endif \ No newline at end of file diff --git a/includes/evp/pbkdf.h b/includes/evp/pbkdf.h index ebd2c58..8b39024 100644 --- a/includes/evp/pbkdf.h +++ b/includes/evp/pbkdf.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 10:11:40 by cpieri #+# #+# */ -/* Updated: 2020/02/04 14:38:20 by cpieri ### ########.fr */ +/* Updated: 2020/02/05 10:11:59 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -32,6 +32,6 @@ typedef struct s_prf t_prf pbkdf2_get_prf(enum e_prf name); void pbkdf2_xor_dgst(void const *dgst1, void const *dgst2, size_t nb); -void *pbkdf2(t_evp *k, uint32_t c, size_t dk_len, enum e_prf func); +void *pbkdf2(t_evp *k, uint32_t c, size_t dk_len, int func); #endif diff --git a/includes/symmetric/symmetric.h b/includes/symmetric/symmetric.h index 0f399d6..1b69f68 100644 --- a/includes/symmetric/symmetric.h +++ b/includes/symmetric/symmetric.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 10:11:43 by cpieri #+# #+# */ -/* Updated: 2020/02/04 10:25:57 by cpieri ### ########.fr */ +/* Updated: 2020/02/05 10:11:54 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -37,6 +37,15 @@ typedef struct s_sym_opt void (*sym_opt_fun)(char **, int *, t_opt *, t_evp **); } t_sym_opt; +typedef struct s_evp_f +{ + void *(*f)(t_evp*, uint32_t, size_t, int); + uint key_len; + uint iv_len; + uint c; + uint prf; +} t_evp_f; + /* ** Functions for get options in parsing */ diff --git a/srcs/evp/evp_bytes2key.c b/srcs/evp/evp_bytes2key.c index 7d83a6c..10e22b0 100644 --- a/srcs/evp/evp_bytes2key.c +++ b/srcs/evp/evp_bytes2key.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/03 09:10:42 by cpieri #+# #+# */ -/* Updated: 2020/02/04 14:38:40 by cpieri ### ########.fr */ +/* Updated: 2020/02/05 10:12:10 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -39,8 +39,7 @@ static void *evp_loop(t_evp *k, size_t i, char *key, t_evp_hash hash_f) return (ret); } -void *evp_bytes2key(t_evp *k, uint32_t c, size_t dk_len, - enum e_hash_f func) +void *evp_bytes2key(t_evp *k, uint32_t c, size_t dk_len, int func) { size_t i; size_t l; diff --git a/srcs/evp/evp_struct.c b/srcs/evp/evp_struct.c index c5e9cb3..88b2627 100644 --- a/srcs/evp/evp_struct.c +++ b/srcs/evp/evp_struct.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/04 09:23:01 by cpieri #+# #+# */ -/* Updated: 2020/02/04 14:44:37 by cpieri ### ########.fr */ +/* Updated: 2020/02/05 08:56:01 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -30,7 +30,7 @@ t_evp *new_t_evp(uint8_t *pass, void *salt, uint64_t key, void *vect) void print_evp(t_evp *k) { char *key; - char *vect; + // char *vect; if (k == NULL) { @@ -46,10 +46,8 @@ void print_evp(t_evp *k) key = hex2sum(k->key, k->dk_len / 4); ft_putendl(key); ft_putstr("vect: "); - vect = hex2sum(k->vect, k->iv_len / 4); + // vect = hex2sum(k->vect, k->iv_len / 4); ft_putendl(key); - // ft_memdel((void**)&key); - // ft_memdel((void**)&vect); } void free_evp(t_evp **to_free) diff --git a/srcs/evp/pbkdf2.c b/srcs/evp/pbkdf2.c index 39f2bf3..82c008c 100644 --- a/srcs/evp/pbkdf2.c +++ b/srcs/evp/pbkdf2.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/31 13:29:35 by cpieri #+# #+# */ -/* Updated: 2020/02/04 14:38:21 by cpieri ### ########.fr */ +/* Updated: 2020/02/05 10:11:52 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -53,7 +53,7 @@ static void *pbkdf2_f(t_evp *k, uint32_t c, t_prf prf, size_t y) return (ret); } -void *pbkdf2(t_evp *k, uint32_t c, size_t dk_len, enum e_prf func) +void *pbkdf2(t_evp *k, uint32_t c, size_t dk_len, int func) { size_t i; size_t l; diff --git a/srcs/symmetric/symmetric_parsing.c b/srcs/symmetric/symmetric_parsing.c index 3ec0b7f..8581679 100644 --- a/srcs/symmetric/symmetric_parsing.c +++ b/srcs/symmetric/symmetric_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 12:04:37 by cpieri #+# #+# */ -/* Updated: 2020/02/04 14:37:21 by cpieri ### ########.fr */ +/* Updated: 2020/02/05 10:13:58 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -29,16 +29,21 @@ static const t_sym_opt g_sym_opt[] = {0, 0, NULL} }; -static void check_pbkdf2(t_evp **k) +static const t_evp_f g_evp_f[] = { + {evp_bytes2key, 8, 8, 1, EVP_MD5}, + {pbkdf2, 8, 8, 10000, HMAC_SHA256}, + {NULL, 0, 0, 0, 0,} +}; + +static void check_pbkdf2(t_evp **k, uint do_pbkdf2) +{ + t_evp_f evp_f; + + evp_f = (do_pbkdf2 == 1) ? g_evp_f[1] : g_evp_f[0]; if (*k != NULL) { - if ((*k)->key != 0) - { - if ((*k)->vect == 0) - exit_msg("iv undefined"); - } - else if ((*k)->pass == NULL) + if ((*k)->pass == NULL) { (*k)->pass = get_pass("enter your password: "); (*k)->pass_len = ft_strlen((*k)->pass); @@ -48,11 +53,18 @@ static void check_pbkdf2(t_evp **k) (*k)->salt_len = ft_strlen((char*)(*k)->salt); } } + if ((*k)->key != 0) + { + if ((*k)->vect == 0) + exit_msg("iv undefined"); + } + else + evp_f.f(*k, evp_f.c, evp_f.key_len + evp_f.iv_len, evp_f.prf); } else { *k = new_t_evp(get_pass("enter your password: "), 0, 0, 0); - evp_bytes2key(*k, 1, 8 + sizeof(uint64_t), EVP_MD5); + evp_f.f(*k, evp_f.c, evp_f.key_len + evp_f.iv_len, evp_f.prf); } } @@ -80,17 +92,21 @@ static void get_sym_opt(char **av, int *now, t_opt *opt, t_evp **k) static t_opt *get_sym_args(const int ac, char **av, int now) { t_opt opt; + uint do_pbkdf2; t_evp *k; k = NULL; + do_pbkdf2 = 0; opt = (t_opt){NULL, {0, 0, 0, 0, 0, 0}, NULL}; while (now < ac) { - if (av[now][0] == '-') + if (ft_strcmp(av[now], "-pbkdf2") == 0) + do_pbkdf2 = 1; + else if (av[now][0] == '-') get_sym_opt(av, &now, &opt, &k); now++; } - check_pbkdf2(&k); + check_pbkdf2(&k, do_pbkdf2); print_evp(k); get_sym_stdin(&opt, &k); return (new_opt(opt.flags, opt.data)); @@ -103,6 +119,6 @@ t_opt *symmetric_opts(const int ac, char **av, t_opt *opts, int now) new = get_sym_args(ac, av, now); add_to_end_lst(new, &opts); // print_lst(&opts); - while (1); + // while (1); return (opts); } From de751787bd4131faed0b11b3feb6914136b268ab Mon Sep 17 00:00:00 2001 From: Louise P Date: Fri, 17 Apr 2020 14:15:01 +0200 Subject: [PATCH 64/71] [Update]: Change the parsing of evp_function - Create struct t_evp_size with iv, key, dk len - Change the prototype of the function evp_b2k & pbkdf2 Next Change: - Debug evp_b2k for salt 0 - Norm 42 - Check leaks - Remove --- includes/evp/evp.h | 9 ++++++++- includes/evp/evp_bytes2key.h | 5 ++--- includes/evp/pbkdf.h | 4 ++-- includes/symmetric/symmetric.h | 5 ++--- srcs/evp/evp_bytes2key.c | 13 +++++++------ srcs/evp/pbkdf2.c | 13 +++++++------ srcs/symmetric/symmetric_parsing.c | 12 ++++++------ 7 files changed, 34 insertions(+), 27 deletions(-) diff --git a/includes/evp/evp.h b/includes/evp/evp.h index 6f526c9..baad0cc 100644 --- a/includes/evp/evp.h +++ b/includes/evp/evp.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/03 09:13:54 by cpieri #+# #+# */ -/* Updated: 2020/02/04 14:40:55 by cpieri ### ########.fr */ +/* Updated: 2020/04/17 14:07:44 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,6 +31,13 @@ typedef struct s_evp size_t iv_len; } t_evp; +typedef struct s_evp_size +{ + size_t key_len; + size_t iv_len; + size_t dk_len; +} t_evp_size; + t_evp *new_t_evp(uint8_t *pass, void *salt, uint64_t key, void *vect); void print_evp(t_evp *to_print); void free_evp(t_evp **to_free); diff --git a/includes/evp/evp_bytes2key.h b/includes/evp/evp_bytes2key.h index e87d652..206d79c 100644 --- a/includes/evp/evp_bytes2key.h +++ b/includes/evp/evp_bytes2key.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/04 10:03:30 by cpieri #+# #+# */ -/* Updated: 2020/02/05 10:12:19 by cpieri ### ########.fr */ +/* Updated: 2020/04/17 11:56:22 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -33,7 +33,6 @@ typedef struct s_evp_hash } t_evp_hash; t_evp_hash evp_get_hashf(enum e_hash_f name); -void *evp_bytes2key(t_evp *k, uint32_t c, size_t dk_len, - int func); +void *evp_bytes2key(t_evp *k, uint32_t c, t_evp_size full_size, int func); #endif \ No newline at end of file diff --git a/includes/evp/pbkdf.h b/includes/evp/pbkdf.h index 8b39024..8b91c56 100644 --- a/includes/evp/pbkdf.h +++ b/includes/evp/pbkdf.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 10:11:40 by cpieri #+# #+# */ -/* Updated: 2020/02/05 10:11:59 by cpieri ### ########.fr */ +/* Updated: 2020/04/17 11:56:08 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -32,6 +32,6 @@ typedef struct s_prf t_prf pbkdf2_get_prf(enum e_prf name); void pbkdf2_xor_dgst(void const *dgst1, void const *dgst2, size_t nb); -void *pbkdf2(t_evp *k, uint32_t c, size_t dk_len, int func); +void *pbkdf2(t_evp *k, uint32_t c, t_evp_size full_size, int func); #endif diff --git a/includes/symmetric/symmetric.h b/includes/symmetric/symmetric.h index 1b69f68..3c1782f 100644 --- a/includes/symmetric/symmetric.h +++ b/includes/symmetric/symmetric.h @@ -39,9 +39,8 @@ typedef struct s_sym_opt typedef struct s_evp_f { - void *(*f)(t_evp*, uint32_t, size_t, int); - uint key_len; - uint iv_len; + void *(*f)(t_evp*, uint32_t, t_evp_size, int); + t_evp_size full_size; uint c; uint prf; } t_evp_f; diff --git a/srcs/evp/evp_bytes2key.c b/srcs/evp/evp_bytes2key.c index 10e22b0..9f8f23c 100644 --- a/srcs/evp/evp_bytes2key.c +++ b/srcs/evp/evp_bytes2key.c @@ -6,10 +6,11 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/03 09:10:42 by cpieri #+# #+# */ -/* Updated: 2020/02/05 10:12:10 by cpieri ### ########.fr */ +/* Updated: 2020/04/17 14:06:29 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ +#include "symmetric/symmetric.h" #include "evp/evp_bytes2key.h" #include @@ -39,7 +40,7 @@ static void *evp_loop(t_evp *k, size_t i, char *key, t_evp_hash hash_f) return (ret); } -void *evp_bytes2key(t_evp *k, uint32_t c, size_t dk_len, int func) +void *evp_bytes2key(t_evp *k, uint32_t c, t_evp_size full_size, int func) { size_t i; size_t l; @@ -50,18 +51,18 @@ void *evp_bytes2key(t_evp *k, uint32_t c, size_t dk_len, int func) i = 1; (void)c; hash_f = evp_get_hashf(func); - l = ceil((double)(dk_len / hash_f.nb_word)) + 1; - if (!(ret = (char*)ft_memalloc(sizeof(char) * (dk_len + 1)))) + l = ceil((double)(full_size.dk_len / hash_f.nb_word)) + 1; + if (!(ret = (char*)ft_memalloc(sizeof(char) * (full_size.dk_len + 1)))) return (NULL); while (i <= l) { tmp = evp_loop(k, i, ret, hash_f); ft_memcpy(ret + ((i - 1) * hash_f.nb_word), tmp, - (i == l) ? dk_len % hash_f.nb_word : hash_f.nb_word); + (i == l) ? full_size.dk_len % hash_f.nb_word : hash_f.nb_word); ft_memdel(&tmp); i++; } k->key = ret; - k->dk_len = dk_len; + k->dk_len = full_size.key_len; return (ret); } diff --git a/srcs/evp/pbkdf2.c b/srcs/evp/pbkdf2.c index 82c008c..08d15d3 100644 --- a/srcs/evp/pbkdf2.c +++ b/srcs/evp/pbkdf2.c @@ -6,10 +6,11 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/31 13:29:35 by cpieri #+# #+# */ -/* Updated: 2020/02/05 10:11:52 by cpieri ### ########.fr */ +/* Updated: 2020/04/17 13:46:08 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ +#include "symmetric/symmetric.h" #include "evp/pbkdf.h" static void *first_i(t_evp *k, size_t y, t_prf prf) @@ -53,7 +54,7 @@ static void *pbkdf2_f(t_evp *k, uint32_t c, t_prf prf, size_t y) return (ret); } -void *pbkdf2(t_evp *k, uint32_t c, size_t dk_len, int func) +void *pbkdf2(t_evp *k, uint32_t c, t_evp_size full_size, int func) { size_t i; size_t l; @@ -63,18 +64,18 @@ void *pbkdf2(t_evp *k, uint32_t c, size_t dk_len, int func) i = 1; prf = pbkdf2_get_prf(func); - l = ceil((double)(dk_len / prf.nb_word)) + 1; - if (!(ret = (char*)ft_memalloc(sizeof(char) * (dk_len + 1)))) + l = ceil((double)(full_size.dk_len / prf.nb_word)) + 1; + if (!(ret = (char*)ft_memalloc(sizeof(char) * (full_size.dk_len + 1)))) return (NULL); while (i <= l) { tmp = pbkdf2_f(k, c, prf, i); ft_memcpy(ret + ((i - 1) * prf.nb_word), tmp, - (i == l) ? dk_len % prf.nb_word : prf.nb_word); + (i == l) ? full_size.dk_len % prf.nb_word : prf.nb_word); ft_memdel(&tmp); i++; } k->key = ret; - k->dk_len = dk_len; + k->dk_len = full_size.key_len; return (ret); } diff --git a/srcs/symmetric/symmetric_parsing.c b/srcs/symmetric/symmetric_parsing.c index 8581679..0a9ce9f 100644 --- a/srcs/symmetric/symmetric_parsing.c +++ b/srcs/symmetric/symmetric_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 12:04:37 by cpieri #+# #+# */ -/* Updated: 2020/02/05 10:13:58 by cpieri ### ########.fr */ +/* Updated: 2020/04/17 14:06:09 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,9 +31,9 @@ static const t_sym_opt g_sym_opt[] = static const t_evp_f g_evp_f[] = { - {evp_bytes2key, 8, 8, 1, EVP_MD5}, - {pbkdf2, 8, 8, 10000, HMAC_SHA256}, - {NULL, 0, 0, 0, 0,} + {evp_bytes2key, {8, 8, 32}, 1, EVP_MD5}, + {pbkdf2, {8, 8, 16}, 10000, HMAC_SHA256}, + {NULL, {0, 0, 0}, 0, 0} }; static void check_pbkdf2(t_evp **k, uint do_pbkdf2) @@ -59,12 +59,12 @@ static void check_pbkdf2(t_evp **k, uint do_pbkdf2) exit_msg("iv undefined"); } else - evp_f.f(*k, evp_f.c, evp_f.key_len + evp_f.iv_len, evp_f.prf); + evp_f.f(*k, evp_f.c, evp_f.full_size, evp_f.prf); } else { *k = new_t_evp(get_pass("enter your password: "), 0, 0, 0); - evp_f.f(*k, evp_f.c, evp_f.key_len + evp_f.iv_len, evp_f.prf); + evp_f.f(*k, evp_f.c, evp_f.full_size, evp_f.prf); } } From b6c4e8627a8a98a714c351abcb4490a6a0047d7d Mon Sep 17 00:00:00 2001 From: Louise P Date: Fri, 17 Apr 2020 15:16:17 +0200 Subject: [PATCH 65/71] [Libft]: Update ft_ishexa.c Next Change: - Debug evp_b2k for salt 0 - Norm 42 - Check leaks - Remove --- libft/srcs/ft_ishexa.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/libft/srcs/ft_ishexa.c b/libft/srcs/ft_ishexa.c index 0e36902..a3ad2dd 100644 --- a/libft/srcs/ft_ishexa.c +++ b/libft/srcs/ft_ishexa.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2018/01/22 14:49:31 by cpieri #+# #+# */ -/* Updated: 2020/01/06 12:58:31 by cpieri ### ########.fr */ +/* Updated: 2020/04/17 15:06:17 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,16 +14,11 @@ int ft_ishexa(char *s) { - int i; - - i = 0; - // if (s[1] != '0' && s[2] != 'x') - // return (0); - while (i <= 16) + while (*s != 0) { - if (s[i] < 48 && s[i] > 57 && s[i] < 'A' && s[i] > 'F') + if ((*s < 48 || *s > 57) && (*s < 'A' || *s > 'F')) return (0); - i++; + s++; } return (1); } From 05cf89c4ba5568693a0dfa0194944074d8b36d0a Mon Sep 17 00:00:00 2001 From: Louise P Date: Fri, 17 Apr 2020 15:33:46 +0200 Subject: [PATCH 66/71] [Debug]: Function "get_sym_opt_s" - Change lenght of salt at 8 char - Add a exit if the salt is not a hexadecimal number Next Change: - Norm 42 - Check leaks - Remove --- srcs/symmetric/symmetric_parsing_pt_f_2.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/srcs/symmetric/symmetric_parsing_pt_f_2.c b/srcs/symmetric/symmetric_parsing_pt_f_2.c index 2133eb6..7161a53 100644 --- a/srcs/symmetric/symmetric_parsing_pt_f_2.c +++ b/srcs/symmetric/symmetric_parsing_pt_f_2.c @@ -6,12 +6,13 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/08 10:21:15 by cpieri #+# #+# */ -/* Updated: 2020/02/04 14:41:55 by cpieri ### ########.fr */ +/* Updated: 2020/04/17 15:29:19 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "symmetric/symmetric.h" #include "ft_ssl.h" +#include void get_sym_opt_k(char **av, int *now, t_opt *opt, t_evp **k) { @@ -50,29 +51,27 @@ void get_sym_opt_p(char **av, int *now, t_opt *opt, t_evp **k) void get_sym_opt_s(char **av, int *now, t_opt *opt, t_evp **k) { - unsigned char *salt; - size_t len; - uint64_t nb; + char *salt; + uint64_t nb; - len = 0; nb = 0; - if ((salt = (unsigned char*)av[*now + 1]) == NULL || av[*now + 1][0] == '-') + if ((salt = av[*now + 1]) == NULL || av[*now + 1][0] == '-') sym_usage(av[*now]); if ((opt->flags.sym_flags & e_sym_opt_k) != e_sym_opt_k) { - if (ft_ishexa((char*)salt) == 1) + if (ft_ishexa(salt) == 1) { - nb = swap_uint64t(hex2uint64t((char*)salt)); + nb = swap_uint64t(hex2uint64t(salt)); salt = ft_memdup(&nb, sizeof(uint64_t)); - len = sizeof(uint64_t); } - len = ft_strlen((char*)salt); + else + exit_msg("ft_ssl: invalid hex salt value"); opt->flags.sym_flags |= e_sym_opt_s; if (*k == NULL) *k = new_t_evp(NULL, salt, 0, 0); else (*k)->salt = salt; - (*k)->salt_len = len; + (*k)->salt_len = 8; (*now)++; } } From 8b512012a793d6b75f43ff97c420dd352667bba5 Mon Sep 17 00:00:00 2001 From: Louise P Date: Fri, 17 Apr 2020 15:49:45 +0200 Subject: [PATCH 67/71] [Update]: Generate IV - Add memdup of ret + iv_length in pbkdf2 & evp_b2k Next Change: - Norm 42 - Check leaks - Remove --- srcs/evp/evp_bytes2key.c | 4 +++- srcs/evp/evp_struct.c | 8 ++++---- srcs/evp/pbkdf2.c | 4 +++- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/srcs/evp/evp_bytes2key.c b/srcs/evp/evp_bytes2key.c index 9f8f23c..d15c554 100644 --- a/srcs/evp/evp_bytes2key.c +++ b/srcs/evp/evp_bytes2key.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/03 09:10:42 by cpieri #+# #+# */ -/* Updated: 2020/04/17 14:06:29 by cpieri ### ########.fr */ +/* Updated: 2020/04/17 15:45:56 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -63,6 +63,8 @@ void *evp_bytes2key(t_evp *k, uint32_t c, t_evp_size full_size, int func) i++; } k->key = ret; + k->vect = ft_memdup(ret + full_size.key_len, full_size.iv_len); + k->iv_len = full_size.iv_len; k->dk_len = full_size.key_len; return (ret); } diff --git a/srcs/evp/evp_struct.c b/srcs/evp/evp_struct.c index 88b2627..0f9e000 100644 --- a/srcs/evp/evp_struct.c +++ b/srcs/evp/evp_struct.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/04 09:23:01 by cpieri #+# #+# */ -/* Updated: 2020/02/05 08:56:01 by cpieri ### ########.fr */ +/* Updated: 2020/04/17 15:44:16 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -30,7 +30,7 @@ t_evp *new_t_evp(uint8_t *pass, void *salt, uint64_t key, void *vect) void print_evp(t_evp *k) { char *key; - // char *vect; + char *vect; if (k == NULL) { @@ -46,8 +46,8 @@ void print_evp(t_evp *k) key = hex2sum(k->key, k->dk_len / 4); ft_putendl(key); ft_putstr("vect: "); - // vect = hex2sum(k->vect, k->iv_len / 4); - ft_putendl(key); + vect = hex2sum(k->vect, k->iv_len / 4); + ft_putendl(vect); } void free_evp(t_evp **to_free) diff --git a/srcs/evp/pbkdf2.c b/srcs/evp/pbkdf2.c index 08d15d3..e5c1a3c 100644 --- a/srcs/evp/pbkdf2.c +++ b/srcs/evp/pbkdf2.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/31 13:29:35 by cpieri #+# #+# */ -/* Updated: 2020/04/17 13:46:08 by cpieri ### ########.fr */ +/* Updated: 2020/04/17 15:47:51 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -76,6 +76,8 @@ void *pbkdf2(t_evp *k, uint32_t c, t_evp_size full_size, int func) i++; } k->key = ret; + k->vect = ft_memdup(ret + full_size.key_len, full_size.iv_len); + k->iv_len = full_size.iv_len; k->dk_len = full_size.key_len; return (ret); } From 0cbf4d01616d1f77f4b7fe69968837999c66f9ce Mon Sep 17 00:00:00 2001 From: Louise P Date: Mon, 20 Apr 2020 10:52:54 +0200 Subject: [PATCH 68/71] [Norm]: Norm of 42 ok - Files changes: includes/[evp, pbkdf2, b2k]; src/[get_data1, symmetric_parsing, evp_functions] [Debug]: Resolution of the -k and -v option - Files changes: srcs/symmetric_parsing_pt_f_2.c - Function changes: get_sym_opt_v & get_sym_opt_k Next Change: - Cheak Leaks - Remove --- includes/evp/evp.h | 6 +-- includes/evp/evp_bytes2key.h | 7 +-- includes/evp/pbkdf.h | 4 +- srcs/evp/evp_bytes2key.c | 5 +- srcs/evp/evp_struct.c | 6 +-- srcs/evp/pbkdf2_utils.c | 6 +-- srcs/symmetric/symmetric_parsing.c | 12 ++--- srcs/symmetric/symmetric_parsing_pt_f_2.c | 57 ++++++++++++----------- srcs/tools/get_data_1.c | 3 +- 9 files changed, 53 insertions(+), 53 deletions(-) diff --git a/includes/evp/evp.h b/includes/evp/evp.h index baad0cc..d6796d0 100644 --- a/includes/evp/evp.h +++ b/includes/evp/evp.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/03 09:13:54 by cpieri #+# #+# */ -/* Updated: 2020/04/17 14:07:44 by cpieri ### ########.fr */ +/* Updated: 2020/04/20 10:42:41 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -38,9 +38,9 @@ typedef struct s_evp_size size_t dk_len; } t_evp_size; -t_evp *new_t_evp(uint8_t *pass, void *salt, uint64_t key, void *vect); +t_evp *new_t_evp(uint8_t *pass, void *salt, void *key, void *vect); void print_evp(t_evp *to_print); void free_evp(t_evp **to_free); void free_vevp(void **to_free); -#endif \ No newline at end of file +#endif diff --git a/includes/evp/evp_bytes2key.h b/includes/evp/evp_bytes2key.h index 206d79c..328cc03 100644 --- a/includes/evp/evp_bytes2key.h +++ b/includes/evp/evp_bytes2key.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/04 10:03:30 by cpieri #+# #+# */ -/* Updated: 2020/04/17 11:56:22 by cpieri ### ########.fr */ +/* Updated: 2020/04/20 10:26:35 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -33,6 +33,7 @@ typedef struct s_evp_hash } t_evp_hash; t_evp_hash evp_get_hashf(enum e_hash_f name); -void *evp_bytes2key(t_evp *k, uint32_t c, t_evp_size full_size, int func); +void *evp_bytes2key(t_evp *k, uint32_t c, + t_evp_size full_size, int func); -#endif \ No newline at end of file +#endif diff --git a/includes/evp/pbkdf.h b/includes/evp/pbkdf.h index 8b91c56..435c835 100644 --- a/includes/evp/pbkdf.h +++ b/includes/evp/pbkdf.h @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/20 10:11:40 by cpieri #+# #+# */ -/* Updated: 2020/04/17 11:56:08 by cpieri ### ########.fr */ +/* Updated: 2020/04/20 10:26:56 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,7 +31,7 @@ typedef struct s_prf } t_prf; t_prf pbkdf2_get_prf(enum e_prf name); -void pbkdf2_xor_dgst(void const *dgst1, void const *dgst2, size_t nb); +void pbkdf2_xor_dgst(void const *dgst1, void const *dgst2, size_t n); void *pbkdf2(t_evp *k, uint32_t c, t_evp_size full_size, int func); #endif diff --git a/srcs/evp/evp_bytes2key.c b/srcs/evp/evp_bytes2key.c index d15c554..66e75f1 100644 --- a/srcs/evp/evp_bytes2key.c +++ b/srcs/evp/evp_bytes2key.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/03 09:10:42 by cpieri #+# #+# */ -/* Updated: 2020/04/17 15:45:56 by cpieri ### ########.fr */ +/* Updated: 2020/04/20 10:25:47 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -40,7 +40,8 @@ static void *evp_loop(t_evp *k, size_t i, char *key, t_evp_hash hash_f) return (ret); } -void *evp_bytes2key(t_evp *k, uint32_t c, t_evp_size full_size, int func) +void *evp_bytes2key(t_evp *k, uint32_t c, t_evp_size full_size, + int func) { size_t i; size_t l; diff --git a/srcs/evp/evp_struct.c b/srcs/evp/evp_struct.c index 0f9e000..72d0902 100644 --- a/srcs/evp/evp_struct.c +++ b/srcs/evp/evp_struct.c @@ -6,13 +6,13 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/04 09:23:01 by cpieri #+# #+# */ -/* Updated: 2020/04/17 15:44:16 by cpieri ### ########.fr */ +/* Updated: 2020/04/20 10:43:04 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "evp/evp.h" -t_evp *new_t_evp(uint8_t *pass, void *salt, uint64_t key, void *vect) +t_evp *new_t_evp(uint8_t *pass, void *salt, void *key, void *vect) { t_evp *new; @@ -22,7 +22,7 @@ t_evp *new_t_evp(uint8_t *pass, void *salt, uint64_t key, void *vect) new->pass_len = ft_strlen((char*)new->pass); new->salt = (salt != NULL) ? salt : get_random(); new->salt_len = ft_strlen((char*)new->salt); - new->key = (key != 0x00) ? &key : 0x00; + new->key = key; new->vect = vect; return (new); } diff --git a/srcs/evp/pbkdf2_utils.c b/srcs/evp/pbkdf2_utils.c index 93c9628..148c575 100644 --- a/srcs/evp/pbkdf2_utils.c +++ b/srcs/evp/pbkdf2_utils.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/31 13:31:54 by cpieri #+# #+# */ -/* Updated: 2020/02/04 09:49:43 by cpieri ### ########.fr */ +/* Updated: 2020/04/20 10:30:49 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -34,7 +34,7 @@ t_prf pbkdf2_get_prf(enum e_prf name) return (ret); } -void pbkdf2_xor_dgst(void const *dgst1, void const *dgst2, size_t nb) +void pbkdf2_xor_dgst(void const *dgst1, void const *dgst2, size_t n) { char *dgst1_cpy; char *dgst2_cpy; @@ -43,7 +43,7 @@ void pbkdf2_xor_dgst(void const *dgst1, void const *dgst2, size_t nb) i = 0; dgst1_cpy = (char*)dgst1; dgst2_cpy = (char*)dgst2; - while (i < nb) + while (i < n) { dgst1_cpy[i] ^= dgst2_cpy[i]; i++; diff --git a/srcs/symmetric/symmetric_parsing.c b/srcs/symmetric/symmetric_parsing.c index 0a9ce9f..b733f8b 100644 --- a/srcs/symmetric/symmetric_parsing.c +++ b/srcs/symmetric/symmetric_parsing.c @@ -6,13 +6,12 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 12:04:37 by cpieri #+# #+# */ -/* Updated: 2020/04/17 14:06:09 by cpieri ### ########.fr */ +/* Updated: 2020/04/20 10:34:02 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "ft_ssl.h" #include "symmetric/symmetric.h" -#include #include static const t_sym_opt g_sym_opt[] = @@ -53,12 +52,9 @@ static void check_pbkdf2(t_evp **k, uint do_pbkdf2) (*k)->salt_len = ft_strlen((char*)(*k)->salt); } } - if ((*k)->key != 0) - { - if ((*k)->vect == 0) - exit_msg("iv undefined"); - } - else + if ((*k)->key != 0 && (*k)->vect == 0) + exit_msg("iv undefined"); + else if ((*k)->key == 0 && (*k)->vect == 0) evp_f.f(*k, evp_f.c, evp_f.full_size, evp_f.prf); } else diff --git a/srcs/symmetric/symmetric_parsing_pt_f_2.c b/srcs/symmetric/symmetric_parsing_pt_f_2.c index 7161a53..90900f6 100644 --- a/srcs/symmetric/symmetric_parsing_pt_f_2.c +++ b/srcs/symmetric/symmetric_parsing_pt_f_2.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/08 10:21:15 by cpieri #+# #+# */ -/* Updated: 2020/04/17 15:29:19 by cpieri ### ########.fr */ +/* Updated: 2020/04/20 10:44:40 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,23 +14,6 @@ #include "ft_ssl.h" #include -void get_sym_opt_k(char **av, int *now, t_opt *opt, t_evp **k) -{ - uint64_t key; - - if (av[*now + 1] == NULL || av[*now + 1][0] == '-') - sym_usage(av[*now]); - key = hex2uint64t(av[*now + 1]); - opt->flags.sym_flags |= e_sym_opt_k; - if ((opt->flags.sym_flags & e_sym_opt_s) == e_sym_opt_s) - opt->flags.sym_flags ^= e_sym_opt_s; - if (*k == NULL) - *k = new_t_evp(NULL, 0, key, 0); - else - (*k)->key = &key; - (*now)++; -} - void get_sym_opt_p(char **av, int *now, t_opt *opt, t_evp **k) { char *pass; @@ -76,28 +59,48 @@ void get_sym_opt_s(char **av, int *now, t_opt *opt, t_evp **k) } } +void get_sym_opt_k(char **av, int *now, t_opt *opt, t_evp **k) +{ + uint64_t key_uint; + char *key; + + if ((key = av[*now + 1]) == NULL || av[*now + 1][0] == '-') + sym_usage(av[*now]); + if (ft_ishexa(key) == 1) + { + key_uint = swap_uint64t(hex2uint64t(key)); + key = ft_memdup(&key_uint, sizeof(uint64_t)); + } + opt->flags.sym_flags |= e_sym_opt_k; + if ((opt->flags.sym_flags & e_sym_opt_s) == e_sym_opt_s) + opt->flags.sym_flags ^= e_sym_opt_s; + if (*k == NULL) + *k = new_t_evp(NULL, 0, key, 0); + else + (*k)->key = key; + (*k)->dk_len = 8; + (*now)++; +} + void get_sym_opt_v(char **av, int *now, t_opt *opt, t_evp **k) { - unsigned char *vect; - size_t len; - uint64_t vector; + char *vect; + uint64_t vector; - len = 0; vector = 0; - if ((vect = (unsigned char*)av[*now + 1]) == NULL || av[*now + 1][0] == '-') + if ((vect = av[*now + 1]) == NULL || av[*now + 1][0] == '-') sym_usage(av[*now]); - if (ft_ishexa((char*)vect) == 1) + if (ft_ishexa(vect) == 1) { - vector = hex2uint64t((char*)vect); + vector = swap_uint64t(hex2uint64t(vect)); vect = ft_memdup(&vector, sizeof(uint64_t)); - len = sizeof(uint64_t); } opt->flags.sym_flags |= e_sym_opt_v; if (*k == NULL) *k = new_t_evp(NULL, 0, 0, vect); else (*k)->vect = vect; - (*k)->iv_len = len; + (*k)->iv_len = 8; (*now)++; } diff --git a/srcs/tools/get_data_1.c b/srcs/tools/get_data_1.c index e937f21..3ec8995 100644 --- a/srcs/tools/get_data_1.c +++ b/srcs/tools/get_data_1.c @@ -6,11 +6,10 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/01/09 12:54:47 by cpieri #+# #+# */ -/* Updated: 2020/01/09 12:57:52 by cpieri ### ########.fr */ +/* Updated: 2020/04/20 10:24:39 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ -// #include "symmetric/symmetric.h" #include "ft_ssl.h" uint8_t *get_pass(const char *prompt) From f4e3317230e7dbc58ebc478a1381c0b7697f91ff Mon Sep 17 00:00:00 2001 From: Louise P Date: Mon, 20 Apr 2020 11:00:17 +0200 Subject: [PATCH 69/71] [Refactor]: Remove leaks & stdio.h --- srcs/evp/evp_bytes2key.c | 3 +-- srcs/evp/evp_struct.c | 4 +++- srcs/hash/hash_tools.c | 3 +-- srcs/hash/hmac/hmac_md5.c | 3 +-- srcs/hash/md5/md5.c | 3 +-- srcs/symmetric/symmetric_parsing.c | 8 ++++---- srcs/symmetric/symmetric_parsing_pt_f_2.c | 3 +-- 7 files changed, 12 insertions(+), 15 deletions(-) diff --git a/srcs/evp/evp_bytes2key.c b/srcs/evp/evp_bytes2key.c index 66e75f1..1c15062 100644 --- a/srcs/evp/evp_bytes2key.c +++ b/srcs/evp/evp_bytes2key.c @@ -6,13 +6,12 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/03 09:10:42 by cpieri #+# #+# */ -/* Updated: 2020/04/20 10:25:47 by cpieri ### ########.fr */ +/* Updated: 2020/04/20 10:59:11 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "symmetric/symmetric.h" #include "evp/evp_bytes2key.h" -#include static void *evp_loop(t_evp *k, size_t i, char *key, t_evp_hash hash_f) { diff --git a/srcs/evp/evp_struct.c b/srcs/evp/evp_struct.c index 72d0902..618256d 100644 --- a/srcs/evp/evp_struct.c +++ b/srcs/evp/evp_struct.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/04 09:23:01 by cpieri #+# #+# */ -/* Updated: 2020/04/20 10:43:04 by cpieri ### ########.fr */ +/* Updated: 2020/04/20 10:56:22 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -45,9 +45,11 @@ void print_evp(t_evp *k) ft_putstr("key: "); key = hex2sum(k->key, k->dk_len / 4); ft_putendl(key); + ft_memdel((void**)&key); ft_putstr("vect: "); vect = hex2sum(k->vect, k->iv_len / 4); ft_putendl(vect); + ft_memdel((void**)&vect); } void free_evp(t_evp **to_free) diff --git a/srcs/hash/hash_tools.c b/srcs/hash/hash_tools.c index 4a11dcc..0d5541f 100644 --- a/srcs/hash/hash_tools.c +++ b/srcs/hash/hash_tools.c @@ -6,12 +6,11 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/22 09:12:05 by cpieri #+# #+# */ -/* Updated: 2020/01/06 08:43:59 by cpieri ### ########.fr */ +/* Updated: 2020/04/20 10:58:44 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "hash/hash.h" -#include char *one_sum(uint32_t *h, size_t nb_h) { diff --git a/srcs/hash/hmac/hmac_md5.c b/srcs/hash/hmac/hmac_md5.c index 1530d77..ef36900 100644 --- a/srcs/hash/hmac/hmac_md5.c +++ b/srcs/hash/hmac/hmac_md5.c @@ -6,13 +6,12 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/12/31 12:29:58 by cpieri #+# #+# */ -/* Updated: 2020/02/03 10:46:23 by cpieri ### ########.fr */ +/* Updated: 2020/04/20 10:58:36 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "hash/hmac.h" #include "hash/md5.h" -#include static void *hmac_md5_digest(void *c1, void *c2, size_t l_c1, size_t l_c2) { diff --git a/srcs/hash/md5/md5.c b/srcs/hash/md5/md5.c index ec465d9..292ab14 100644 --- a/srcs/hash/md5/md5.c +++ b/srcs/hash/md5/md5.c @@ -6,12 +6,11 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/25 15:18:34 by cpieri #+# #+# */ -/* Updated: 2019/12/30 08:36:27 by cpieri ### ########.fr */ +/* Updated: 2020/04/20 10:58:24 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "hash/md5.h" -#include static const uint32_t g_r_md5[64] = { 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, diff --git a/srcs/symmetric/symmetric_parsing.c b/srcs/symmetric/symmetric_parsing.c index b733f8b..f4ade78 100644 --- a/srcs/symmetric/symmetric_parsing.c +++ b/srcs/symmetric/symmetric_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 12:04:37 by cpieri #+# #+# */ -/* Updated: 2020/04/20 10:34:02 by cpieri ### ########.fr */ +/* Updated: 2020/04/20 10:54:09 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -103,7 +103,7 @@ static t_opt *get_sym_args(const int ac, char **av, int now) now++; } check_pbkdf2(&k, do_pbkdf2); - print_evp(k); + // print_evp(k); get_sym_stdin(&opt, &k); return (new_opt(opt.flags, opt.data)); } @@ -114,7 +114,7 @@ t_opt *symmetric_opts(const int ac, char **av, t_opt *opts, int now) new = get_sym_args(ac, av, now); add_to_end_lst(new, &opts); - // print_lst(&opts); - // while (1); + print_lst(&opts); + while (1); return (opts); } diff --git a/srcs/symmetric/symmetric_parsing_pt_f_2.c b/srcs/symmetric/symmetric_parsing_pt_f_2.c index 90900f6..e0806d0 100644 --- a/srcs/symmetric/symmetric_parsing_pt_f_2.c +++ b/srcs/symmetric/symmetric_parsing_pt_f_2.c @@ -6,13 +6,12 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/08 10:21:15 by cpieri #+# #+# */ -/* Updated: 2020/04/20 10:44:40 by cpieri ### ########.fr */ +/* Updated: 2020/04/20 10:58:16 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ #include "symmetric/symmetric.h" #include "ft_ssl.h" -#include void get_sym_opt_p(char **av, int *now, t_opt *opt, t_evp **k) { From 4c65e3dee0007b68bd6fae8f6cbc3b238a7fc9e1 Mon Sep 17 00:00:00 2001 From: Louise P Date: Mon, 20 Apr 2020 11:02:41 +0200 Subject: [PATCH 70/71] Cleaning of the branch before the merge --- key_aes256cbc_b2k | 1 - openssl_des_cbc_evp_b2k | 3 --- test_mine | 1 - 3 files changed, 5 deletions(-) delete mode 100644 key_aes256cbc_b2k delete mode 100644 openssl_des_cbc_evp_b2k delete mode 100644 test_mine diff --git a/key_aes256cbc_b2k b/key_aes256cbc_b2k deleted file mode 100644 index cd7b9de..0000000 --- a/key_aes256cbc_b2k +++ /dev/null @@ -1 +0,0 @@ -A91E0DEFDEDC3CE178C8C44FCD5CEEC57995306B52B5051BD06A9230B0533A62 diff --git a/openssl_des_cbc_evp_b2k b/openssl_des_cbc_evp_b2k deleted file mode 100644 index 24269d6..0000000 --- a/openssl_des_cbc_evp_b2k +++ /dev/null @@ -1,3 +0,0 @@ -salt=F4BF8287EAEACB25 -key=A91E0DEFDEDC3CE1 -iv =78C8C44FCD5CEEC5 diff --git a/test_mine b/test_mine deleted file mode 100644 index d7b05dc..0000000 --- a/test_mine +++ /dev/null @@ -1 +0,0 @@ -a91e0defdedc3ce178c8c44fcd5ceec57995306b52b5051bd06a9230b0533a62 From 5695d5b7ee276bfb4e019a3c5c08ab4311e79ffb Mon Sep 17 00:00:00 2001 From: Louise P Date: Mon, 20 Apr 2020 11:12:35 +0200 Subject: [PATCH 71/71] Remove while(1) --- srcs/evp/evp_struct.c~HEAD | 72 ------------------------------ srcs/symmetric/symmetric_parsing.c | 6 +-- 2 files changed, 3 insertions(+), 75 deletions(-) delete mode 100644 srcs/evp/evp_struct.c~HEAD diff --git a/srcs/evp/evp_struct.c~HEAD b/srcs/evp/evp_struct.c~HEAD deleted file mode 100644 index 618256d..0000000 --- a/srcs/evp/evp_struct.c~HEAD +++ /dev/null @@ -1,72 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* evp_struct.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: cpieri +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2020/02/04 09:23:01 by cpieri #+# #+# */ -/* Updated: 2020/04/20 10:56:22 by cpieri ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "evp/evp.h" - -t_evp *new_t_evp(uint8_t *pass, void *salt, void *key, void *vect) -{ - t_evp *new; - - if (!(new = (t_evp*)malloc(sizeof(t_evp)))) - return (NULL); - new->pass = pass; - new->pass_len = ft_strlen((char*)new->pass); - new->salt = (salt != NULL) ? salt : get_random(); - new->salt_len = ft_strlen((char*)new->salt); - new->key = key; - new->vect = vect; - return (new); -} - -void print_evp(t_evp *k) -{ - char *key; - char *vect; - - if (k == NULL) - { - ft_putendl("k is null"); - return ; - } - ft_putstr("pass: "); - ft_putendl((char*)k->pass); - ft_putstr("salt: "); - ft_put64hexa(swap_uint64t(((uint64_t*)k->salt)[0])); - ft_putchar('\n'); - ft_putstr("key: "); - key = hex2sum(k->key, k->dk_len / 4); - ft_putendl(key); - ft_memdel((void**)&key); - ft_putstr("vect: "); - vect = hex2sum(k->vect, k->iv_len / 4); - ft_putendl(vect); - ft_memdel((void**)&vect); -} - -void free_evp(t_evp **to_free) -{ - ft_memdel((void**)&((*to_free)->pass)); - ft_memdel((void**)&((*to_free)->salt)); - ft_memdel((void**)&((*to_free)->key)); - ft_memdel((void**)(to_free)); -} - -void free_vevp(void **to_free) -{ - t_evp **to_del; - - to_del = (t_evp**)to_free; - ft_memdel((void**)&((*to_del)->pass)); - ft_memdel((void**)&((*to_del)->salt)); - ft_memdel((void**)&((*to_del)->key)); - ft_memdel((void**)(to_del)); -} diff --git a/srcs/symmetric/symmetric_parsing.c b/srcs/symmetric/symmetric_parsing.c index f4ade78..06073d1 100644 --- a/srcs/symmetric/symmetric_parsing.c +++ b/srcs/symmetric/symmetric_parsing.c @@ -6,7 +6,7 @@ /* By: cpieri +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/05/06 12:04:37 by cpieri #+# #+# */ -/* Updated: 2020/04/20 10:54:09 by cpieri ### ########.fr */ +/* Updated: 2020/04/20 11:12:14 by cpieri ### ########.fr */ /* */ /* ************************************************************************** */ @@ -114,7 +114,7 @@ t_opt *symmetric_opts(const int ac, char **av, t_opt *opts, int now) new = get_sym_args(ac, av, now); add_to_end_lst(new, &opts); - print_lst(&opts); - while (1); + // print_lst(&opts); + // while (1); return (opts); }