From: Enlightenment S. <no-...@en...> - 2012-02-22 11:50:43
|
Log: eina: update info in eina_file_stat seems more usefull. Author: cedric Date: 2012-02-22 03:50:29 -0800 (Wed, 22 Feb 2012) New Revision: 68264 Trac: http://trac.enlightenment.org/e/changeset/68264 Modified: trunk/eina/src/lib/eina_file.c Modified: trunk/eina/src/lib/eina_file.c =================================================================== --- trunk/eina/src/lib/eina_file.c 2012-02-22 11:40:09 UTC (rev 68263) +++ trunk/eina/src/lib/eina_file.c 2012-02-22 11:50:29 UTC (rev 68264) @@ -369,27 +369,8 @@ if (it->info.type == EINA_FILE_UNKNOWN) { - if (eina_file_stat(it->dirp, &it->info, &st)) + if (eina_file_stat(it->dirp, &it->info, &st) != 0) it->info.type = EINA_FILE_UNKNOWN; - else - { - if (S_ISREG(st.st_mode)) - it->info.type = EINA_FILE_REG; - else if (S_ISDIR(st.st_mode)) - it->info.type = EINA_FILE_DIR; - else if (S_ISCHR(st.st_mode)) - it->info.type = EINA_FILE_CHR; - else if (S_ISBLK(st.st_mode)) - it->info.type = EINA_FILE_BLK; - else if (S_ISFIFO(st.st_mode)) - it->info.type = EINA_FILE_FIFO; - else if (S_ISLNK(st.st_mode)) - it->info.type = EINA_FILE_LNK; - else if (S_ISSOCK(st.st_mode)) - it->info.type = EINA_FILE_SOCK; - else - it->info.type = EINA_FILE_UNKNOWN; - } } return EINA_TRUE; @@ -1306,8 +1287,35 @@ #ifdef HAVE_FSTATAT fd = dirfd(container); - return fstatat(fd, info->path + info->name_start, buf, 0); + if (fstatat(fd, info->path + info->name_start, buf, 0)) #else - return stat(it->info.path, buf); + if (stat(info->path, buf)) #endif + { + if (info->type != EINA_FILE_LNK) + info->type = EINA_FILE_UNKNOWN; + return -1; + } + + if (info->type == EINA_FILE_UNKNOWN) + { + if (S_ISREG(buf->st_mode)) + info->type = EINA_FILE_REG; + else if (S_ISDIR(buf->st_mode)) + info->type = EINA_FILE_DIR; + else if (S_ISCHR(buf->st_mode)) + info->type = EINA_FILE_CHR; + else if (S_ISBLK(buf->st_mode)) + info->type = EINA_FILE_BLK; + else if (S_ISFIFO(buf->st_mode)) + info->type = EINA_FILE_FIFO; + else if (S_ISLNK(buf->st_mode)) + info->type = EINA_FILE_LNK; + else if (S_ISSOCK(buf->st_mode)) + info->type = EINA_FILE_SOCK; + else + info->type = EINA_FILE_UNKNOWN; + } + + return 0; } |
From: Enlightenment S. <no-...@en...> - 2012-03-02 15:37:02
|
Log: eina: fix warning. Patch by Seo Sanghyeon. Author: cedric Date: 2012-03-02 07:36:54 -0800 (Fri, 02 Mar 2012) New Revision: 68628 Trac: http://trac.enlightenment.org/e/changeset/68628 Modified: trunk/eina/src/lib/eina_rbtree.c Modified: trunk/eina/src/lib/eina_rbtree.c =================================================================== --- trunk/eina/src/lib/eina_rbtree.c 2012-03-02 12:43:02 UTC (rev 68627) +++ trunk/eina/src/lib/eina_rbtree.c 2012-03-02 15:36:54 UTC (rev 68628) @@ -310,7 +310,7 @@ uintptr_t top = stack[--s]; /* Pop link pointer and direction */ Eina_Rbtree_Direction dir = top & 1; - r = (Eina_Rbtree **)(top & ~1ULL); + r = (Eina_Rbtree **)(top & ~(uintptr_t)1); q = *r; a = q->son[dir]; @@ -434,7 +434,7 @@ Eina_Rbtree *q; uintptr_t st = stack[--s]; - rt = (Eina_Rbtree**)(st & ~1ULL); + rt = (Eina_Rbtree**)(st & ~(uintptr_t)1); dir = st & 1; r = *rt; q = r->son[dir ^ 1]; |
From: Enlightenment S. <no-...@en...> - 2012-03-07 10:41:00
|
Log: eina: don't reopen file when file didn't change. NOTE: we were leaking file at very high speed ! Author: cedric Date: 2012-03-07 02:40:49 -0800 (Wed, 07 Mar 2012) New Revision: 68924 Trac: http://trac.enlightenment.org/e/changeset/68924 Modified: trunk/eina/src/lib/eina_file.c Modified: trunk/eina/src/lib/eina_file.c =================================================================== --- trunk/eina/src/lib/eina_file.c 2012-03-07 10:39:30 UTC (rev 68923) +++ trunk/eina/src/lib/eina_file.c 2012-03-07 10:40:49 UTC (rev 68924) @@ -979,7 +979,7 @@ eina_lock_take(&_eina_file_lock_cache); file = eina_hash_find(_eina_file_cache, filename); - if ((file) && _eina_file_timestamp_compare(file, &file_stat)) + if ((file) && !_eina_file_timestamp_compare(file, &file_stat)) { file->delete_me = EINA_TRUE; eina_hash_del(_eina_file_cache, file->filename, file); |
From: Enlightenment S. <no-...@en...> - 2012-03-13 11:26:03
|
Log: eina: build back on FreeBSD. Author: cedric Date: 2012-03-13 04:25:56 -0700 (Tue, 13 Mar 2012) New Revision: 69293 Trac: http://trac.enlightenment.org/e/changeset/69293 Modified: trunk/eina/src/lib/eina_file.c Modified: trunk/eina/src/lib/eina_file.c =================================================================== --- trunk/eina/src/lib/eina_file.c 2012-03-13 10:16:37 UTC (rev 69292) +++ trunk/eina/src/lib/eina_file.c 2012-03-13 11:25:56 UTC (rev 69293) @@ -1287,7 +1287,7 @@ EINA_SAFETY_ON_NULL_RETURN_VAL(st, -1); #ifdef HAVE_FSTATAT - fd = dirfd(container); + fd = dirfd((DIR*) container); if (fstatat(fd, info->path + info->name_start, &buf, 0)) #else (void)container; |
From: Enlightenment S. <no-...@en...> - 2012-03-14 15:35:24
|
Log: eina: fix dead lock issue. This is hidding a bug with eina_hash_pointer_new. Author: cedric Date: 2012-03-14 08:35:12 -0700 (Wed, 14 Mar 2012) New Revision: 69338 Trac: http://trac.enlightenment.org/e/changeset/69338 Modified: trunk/eina/src/lib/eina_file.c Modified: trunk/eina/src/lib/eina_file.c =================================================================== --- trunk/eina/src/lib/eina_file.c 2012-03-14 13:22:20 UTC (rev 69337) +++ trunk/eina/src/lib/eina_file.c 2012-03-14 15:35:12 UTC (rev 69338) @@ -1058,7 +1058,7 @@ eina_hash_del(_eina_file_cache, file->filename, file); _eina_file_real_close(file); - + eina_lock_release(&_eina_file_lock_cache); } @@ -1225,7 +1225,7 @@ unsigned long int key[2]; em = eina_hash_find(file->rmap, &map); - if (!em) return ; + if (!em) goto on_exit; em->refcount--; @@ -1246,17 +1246,25 @@ eina_file_map_faulted(Eina_File *file, void *map) { Eina_File_Map *em; + Eina_Bool r = EINA_FALSE; EINA_SAFETY_ON_NULL_RETURN_VAL(file, EINA_FALSE); eina_lock_take(&file->lock); - if (file->global_map == map) return file->global_faulty; + if (file->global_map == map) + { + r = file->global_faulty; + } + else + { + em = eina_hash_find(file->rmap, &map); + if (em) r = em->faulty; + } - em = eina_hash_find(file->rmap, &map); - if (!em) return EINA_FALSE; + eina_lock_release(&file->lock); - return em->faulty; + return r; } EAPI Eina_Iterator * |
From: Enlightenment S. <no-...@en...> - 2012-04-03 13:28:14
|
Log: eina: improve debugging message. Author: cedric Date: 2012-04-03 06:28:04 -0700 (Tue, 03 Apr 2012) New Revision: 69896 Trac: http://trac.enlightenment.org/e/changeset/69896 Modified: trunk/eina/src/lib/eina_main.c Modified: trunk/eina/src/lib/eina_main.c =================================================================== --- trunk/eina/src/lib/eina_main.c 2012-04-03 12:53:23 UTC (rev 69895) +++ trunk/eina/src/lib/eina_main.c 2012-04-03 13:28:04 UTC (rev 69896) @@ -372,7 +372,10 @@ fprintf(stderr, "* LOCK STILL TAKEN : *\n"); fprintf(stderr, "*************************\n"); EINA_INLIST_FOREACH(_eina_tracking, lk) - eina_lock_debug(lk); + { + fprintf(stderr, "=======\n"); + eina_lock_debug(lk); + } fprintf(stderr, "*************************\n"); abort(); } |
From: Enlightenment S. <no-...@en...> - 2012-04-18 09:21:50
|
Log: eina: add backtrace to Eina_Log. Author: cedric Date: 2012-04-18 02:21:39 -0700 (Wed, 18 Apr 2012) New Revision: 70294 Trac: http://trac.enlightenment.org/e/changeset/70294 Modified: trunk/eina/src/lib/eina_log.c Modified: trunk/eina/src/lib/eina_log.c =================================================================== --- trunk/eina/src/lib/eina_log.c 2012-04-18 09:19:47 UTC (rev 70293) +++ trunk/eina/src/lib/eina_log.c 2012-04-18 09:21:39 UTC (rev 70294) @@ -28,6 +28,10 @@ #include <assert.h> #include <errno.h> +#ifdef HAVE_EXECINFO_H +#include <execinfo.h> +#endif + #ifdef HAVE_UNISTD_H # include <unistd.h> #endif @@ -1827,6 +1831,22 @@ _eina_log_print_prefix(stderr, d, level, file, fnc, line); vfprintf(stderr, fmt, args); putc('\n', stderr); +# if defined HAVE_BACKTRACE && defined HAVE_BACKTRACE_SYMBOLS + if (getenv("EINA_LOG_BACKTRACE")) + { + void *bt[256]; + char **strings; + int btlen; + int i; + + btlen = backtrace((void **)bt, 256); + strings = backtrace_symbols((void **)bt, btlen); + fprintf(stderr, "*** Backtrace ***\n"); + for (i = 0; i < btlen; ++i) + fprintf(stderr, "%s\n", strings[i]); + free(strings); + } +# endif #else (void) d; (void) level; @@ -1853,6 +1873,22 @@ _eina_log_print_prefix(stdout, d, level, file, fnc, line); vprintf(fmt, args); putchar('\n'); +# if defined HAVE_BACKTRACE && defined HAVE_BACKTRACE_SYMBOLS + if (getenv("EINA_LOG_BACKTRACE")) + { + void *bt[256]; + char **strings; + int btlen; + int i; + + btlen = backtrace((void **)bt, 256); + strings = backtrace_symbols((void **)bt, btlen); + fprintf(stdout, "*** Backtrace ***\n"); + for (i = 0; i < btlen; ++i) + fprintf(stdout, "%s\n", strings[i]); + free(strings); + } +# endif #else (void) d; (void) level; @@ -1894,6 +1930,22 @@ #endif fprintf(f, "%s<%u> %s:%d %s() ", d->name, eina_log_pid_get(), file, line, fnc); +# if defined HAVE_BACKTRACE && defined HAVE_BACKTRACE_SYMBOLS + if (getenv("EINA_LOG_BACKTRACE")) + { + void *bt[256]; + char **strings; + int btlen; + int i; + + btlen = backtrace((void **)bt, 256); + strings = backtrace_symbols((void **)bt, btlen); + fprintf(f, "*** Backtrace ***\n"); + for (i = 0; i < btlen; ++i) + fprintf(f, "%s\n", strings[i]); + free(strings); + } +# endif #ifdef EFL_HAVE_THREADS end: #endif @@ -1991,3 +2043,4 @@ (void) args; #endif } + |
From: Enlightenment S. <no-...@en...> - 2012-04-19 12:49:29
|
Log: eina: completly disable backtrace. Author: cedric Date: 2012-04-19 05:49:16 -0700 (Thu, 19 Apr 2012) New Revision: 70333 Trac: http://trac.enlightenment.org/e/changeset/70333 Modified: trunk/eina/src/lib/eina_log.c Modified: trunk/eina/src/lib/eina_log.c =================================================================== --- trunk/eina/src/lib/eina_log.c 2012-04-19 11:30:17 UTC (rev 70332) +++ trunk/eina/src/lib/eina_log.c 2012-04-19 12:49:16 UTC (rev 70333) @@ -109,7 +109,7 @@ #ifdef EINA_LOG_BACKTRACE static int _backtrace_level = -1; -#endif +#endif #ifdef EFL_HAVE_THREADS @@ -1342,8 +1342,10 @@ assert((sizeof(_names) / sizeof(_names[0])) == EINA_LOG_LEVELS); +#ifdef EINA_LOG_BACKTRACE if ((tmp = getenv(EINA_LOG_ENV_BACKTRACE))) _backtrace_level = atoi(tmp); +#endif if ((tmp = getenv(EINA_LOG_ENV_COLOR_DISABLE))) color_disable = atoi(tmp); |
From: Enlightenment S. <no-...@en...> - 2012-05-11 10:51:36
|
Log: eina: that was a useless piece of code ! Author: cedric Date: 2012-05-11 03:51:29 -0700 (Fri, 11 May 2012) New Revision: 70930 Trac: http://trac.enlightenment.org/e/changeset/70930 Modified: trunk/eina/src/lib/eina_file.c Modified: trunk/eina/src/lib/eina_file.c =================================================================== --- trunk/eina/src/lib/eina_file.c 2012-05-11 10:50:47 UTC (rev 70929) +++ trunk/eina/src/lib/eina_file.c 2012-05-11 10:51:29 UTC (rev 70930) @@ -1195,8 +1195,6 @@ if (it->boundary == 0) it->boundary = 4096; it->current.line.start = it->current.line.end; - while (*eol == '\n' || *eol == '\r') - eol--; it->current.line.end = eol; it->current.length = eol - it->current.line.start - 1; |
From: Enlightenment S. <no-...@en...> - 2012-05-16 10:12:17
|
Log: eina: cleanup and merge code for sin and cos. NOTE: this patch is part of the previous attempt to fix rounding error. Hopefully things are better now. Author: cedric Date: 2012-05-16 03:12:06 -0700 (Wed, 16 May 2012) New Revision: 71150 Trac: http://trac.enlightenment.org/e/changeset/71150 Modified: trunk/eina/src/lib/eina_fp.c Modified: trunk/eina/src/lib/eina_fp.c =================================================================== --- trunk/eina/src/lib/eina_fp.c 2012-05-16 09:24:40 UTC (rev 71149) +++ trunk/eina/src/lib/eina_fp.c 2012-05-16 10:12:06 UTC (rev 71150) @@ -465,68 +465,22 @@ (Eina_F32p32)eina_f32p32_fracc_get( interpol))); - if (0 <= remainder_2PI && remainder_2PI < F32P32_PI2) - return result; - else if (F32P32_PI2 <= remainder_2PI && remainder_2PI < EINA_F32P32_PI) - return -result; - else if (EINA_F32P32_PI <= remainder_2PI && remainder_2PI < F32P32_3PI2) - return -result; - else /* if (F32P32_3PI2 <= remainder_2PI) */ - return result; + if (F32P32_PI2 < remainder_2PI && remainder_2PI < F32P32_3PI2) + result *= -1; + + return result; } EAPI Eina_F32p32 eina_f32p32_sin(Eina_F32p32 a) { - Eina_F32p32 F32P32_2PI; Eina_F32p32 F32P32_PI2; - Eina_F32p32 F32P32_3PI2; - Eina_F32p32 remainder_2PI; - Eina_F32p32 remainder_PI; - Eina_F32p32 interpol; - Eina_F32p32 result; - int idx; - int index2; - F32P32_2PI = EINA_F32P32_PI << 1; F32P32_PI2 = EINA_F32P32_PI >> 1; - F32P32_3PI2 = EINA_F32P32_PI + F32P32_PI2; /* We only have a table for cosinus, but sin(a) = cos(pi / 2 - a) */ a = eina_f32p32_sub(F32P32_PI2, a); - /* Take advantage of cosinus symetrie. */ - a = eina_fp32p32_llabs(a); - - /* Find table entry in 0 to PI / 2 */ - remainder_PI = a - (a / EINA_F32P32_PI) * EINA_F32P32_PI; - - /* Find which case from 0 to 2 * PI */ - remainder_2PI = a - (a / F32P32_2PI) * F32P32_2PI; - - interpol = eina_f32p32_div(eina_f32p32_scale(remainder_PI, (MAX_PREC - 1) * 2), - EINA_F32P32_PI); - idx = eina_f32p32_int_to(interpol); - if (idx >= MAX_PREC) - idx = 2 * MAX_PREC - (idx + 1); - - index2 = idx + 1; - if (index2 == MAX_PREC) - index2 = idx - 1; - - result = eina_f32p32_add(eina_trigo[idx], - eina_f32p32_mul(eina_f32p32_sub(eina_trigo[idx], - eina_trigo[index2]), - (Eina_F32p32)eina_f32p32_fracc_get( - interpol))); - - if (0 <= remainder_2PI && remainder_2PI < F32P32_PI2) - return result; - else if (F32P32_PI2 <= remainder_2PI && remainder_2PI < EINA_F32P32_PI) - return -result; - else if (EINA_F32P32_PI <= remainder_2PI && remainder_2PI < F32P32_3PI2) - return -result; - else /* if (F32P32_3PI2 <= remainder_2PI) */ - return result; + return eina_f32p32_cos(a); } |
From: Enlightenment S. <no-...@en...> - 2012-06-12 07:58:18
|
Log: eina: actually check the pid only if we fail with main loop check. NOTE: If we are out of luck this test can work after a fork, but most of the time it will be correct and cost nothing, instead of costing a syscall. Author: cedric Date: 2012-06-12 00:58:11 -0700 (Tue, 12 Jun 2012) New Revision: 71988 Trac: http://trac.enlightenment.org/e/changeset/71988 Modified: trunk/eina/src/lib/eina_main.c Modified: trunk/eina/src/lib/eina_main.c =================================================================== --- trunk/eina/src/lib/eina_main.c 2012-06-12 07:57:40 UTC (rev 71987) +++ trunk/eina/src/lib/eina_main.c 2012-06-12 07:58:11 UTC (rev 71988) @@ -410,18 +410,25 @@ eina_main_loop_is(void) { #ifdef EFL_HAVE_THREADS - pid_t pid = getpid(); + pid_t pid; # ifdef _WIN32 + if (_eina_main_loop == GetCurrentThreadId()) + return EINA_TRUE; +# else + if (pthread_equal(_eina_main_loop, pthread_self())) + return EINA_TRUE; +# endif + + pid = getpid(); +# ifdef _WIN32 if (pid != _eina_pid) { _eina_pid = pid; _eina_main_loop = GetCurrentThreadId(); return EINA_TRUE; } - if (_eina_main_loop == GetCurrentThreadId()) - return EINA_TRUE; -# else +#else if (pid != _eina_pid) { /* This is in case of a fork, but don't like the solution */ @@ -429,11 +436,9 @@ _eina_main_loop = pthread_self(); return EINA_TRUE; } +#endif +#endif - if (pthread_equal(_eina_main_loop, pthread_self())) - return EINA_TRUE; -# endif -#endif return EINA_FALSE; } |
From: Enlightenment S. <no-...@en...> - 2012-09-07 02:33:05
|
Log: eina: bug fixes by Sungho Kwak. Return EINA_FALSE on NULL input as we can't produce valid result. Author: cedric Date: 2012-09-06 19:32:59 -0700 (Thu, 06 Sep 2012) New Revision: 76267 Trac: http://trac.enlightenment.org/e/changeset/76267 Modified: trunk/eina/src/lib/eina_convert.c Modified: trunk/eina/src/lib/eina_convert.c =================================================================== --- trunk/eina/src/lib/eina_convert.c 2012-09-07 02:19:55 UTC (rev 76266) +++ trunk/eina/src/lib/eina_convert.c 2012-09-07 02:32:59 UTC (rev 76267) @@ -465,7 +465,7 @@ return EINA_FALSE; if (!fp) - return EINA_TRUE; + return EINA_FALSE; e += 32; |
From: Enlightenment S. <no-...@en...> - 2012-10-04 01:41:57
|
Log: eina: Fixes bad format strings in *printf() calls. Author: cedric Date: 2012-10-03 18:41:51 -0700 (Wed, 03 Oct 2012) New Revision: 77390 Trac: http://trac.enlightenment.org/e/changeset/77390 Modified: trunk/eina/src/lib/eina_share_common.c Modified: trunk/eina/src/lib/eina_share_common.c =================================================================== --- trunk/eina/src/lib/eina_share_common.c 2012-10-04 01:41:16 UTC (rev 77389) +++ trunk/eina/src/lib/eina_share_common.c 2012-10-04 01:41:51 UTC (rev 77390) @@ -241,7 +241,7 @@ sizeof (share->population_group[0]); ++i) fprintf(stderr, - "DDD: %i strings of length %i, max strings: %i\n", + "DDD: %i strings of length %u, max strings: %i\n", share->population_group[i].count, i, share->population_group[i].max); @@ -935,7 +935,7 @@ sizeof (share->population_group[0]); ++i) fprintf(stderr, - "DDD: %i strings of length %i, max strings: %i\n", + "DDD: %i strings of length %u, max strings: %i\n", share->population_group[i].count, i, share->population_group[i].max); |
From: Enlightenment S. <no-...@en...> - 2012-10-19 01:25:25
|
Log: eina: eina_stringshare_add_lenght better to return NULL when func args are wrong. Patch by Patryk Kaczmarek <pat...@sa...> Author: cedric Date: 2012-10-18 18:25:17 -0700 (Thu, 18 Oct 2012) New Revision: 78209 Trac: http://trac.enlightenment.org/e/changeset/78209 Modified: trunk/eina/src/lib/eina_stringshare.c Modified: trunk/eina/src/lib/eina_stringshare.c =================================================================== --- trunk/eina/src/lib/eina_stringshare.c 2012-10-19 01:16:09 UTC (rev 78208) +++ trunk/eina/src/lib/eina_stringshare.c 2012-10-19 01:25:17 UTC (rev 78209) @@ -612,7 +612,7 @@ eina_stringshare_add_length(const char *str, unsigned int slen) { if ((!str) || (slen <= 0)) - return ""; + return NULL; else if (slen == 1) return (Eina_Stringshare *) _eina_stringshare_single + ((*str) << 1); else if (slen < 4) |
From: Enlightenment S. <no-...@en...> - 2012-10-19 01:45:11
|
Log: eina: check if data is not NULL before assigning FILE. Patch by Patryk Kaczmarek <pat...@sa...>. Author: cedric Date: 2012-10-18 18:45:03 -0700 (Thu, 18 Oct 2012) New Revision: 78213 Trac: http://trac.enlightenment.org/e/changeset/78213 Modified: trunk/eina/src/lib/eina_log.c Modified: trunk/eina/src/lib/eina_log.c =================================================================== --- trunk/eina/src/lib/eina_log.c 2012-10-19 01:32:31 UTC (rev 78212) +++ trunk/eina/src/lib/eina_log.c 2012-10-19 01:45:03 UTC (rev 78213) @@ -1945,6 +1945,7 @@ va_list args) { #ifdef EINA_ENABLE_LOG + EINA_SAFETY_ON_NULL_RETURN(data); FILE *f = data; #ifdef EFL_HAVE_THREADS if (_threads_enabled) |
From: Enlightenment S. <no-...@en...> - 2012-10-19 08:44:35
|
Log: eina: fix undefined. Author: cedric Date: 2012-10-19 01:44:24 -0700 (Fri, 19 Oct 2012) New Revision: 78237 Trac: http://trac.enlightenment.org/e/changeset/78237 Modified: trunk/eina/src/lib/eina_main.c Modified: trunk/eina/src/lib/eina_main.c =================================================================== --- trunk/eina/src/lib/eina_main.c 2012-10-19 08:22:22 UTC (rev 78236) +++ trunk/eina/src/lib/eina_main.c 2012-10-19 08:44:24 UTC (rev 78237) @@ -156,7 +156,6 @@ S(file); S(prefix); S(value); - S(tmpstr); S(thread); /* no model for now S(model); @@ -198,7 +197,6 @@ S(file), S(prefix), S(value), - S(tmpstr), S(thread) /* no model for now S(model) |