From b4f33eacf2b5b4f0a0a4fe8aeb62deb0c7a4b3cb Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Wed, 13 Mar 2024 10:10:20 +0800 Subject: [PATCH 01/45] feat:add paras for schemaless interface --- include/client/taos.h | 5 ++++- source/client/inc/clientSml.h | 1 + source/client/src/clientSml.c | 19 +++++++++++++++---- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/include/client/taos.h b/include/client/taos.h index 45dc85f6d9..4afae85415 100644 --- a/include/client/taos.h +++ b/include/client/taos.h @@ -263,7 +263,10 @@ DLL_EXPORT TAOS_RES *taos_schemaless_insert_raw_ttl(TAOS *taos, char *lines, int int precision, int32_t ttl); DLL_EXPORT TAOS_RES *taos_schemaless_insert_raw_ttl_with_reqid(TAOS *taos, char *lines, int len, int32_t *totalRows, int protocol, int precision, int32_t ttl, int64_t reqid); - +DLL_EXPORT TAOS_RES *taos_schemaless_insert_raw_ttl_with_reqid_tbname_key(TAOS *taos, char *lines, int len, int32_t *totalRows, + int protocol, int precision, int32_t ttl, int64_t reqid, char *tbnameKey); +DLL_EXPORT TAOS_RES *taos_schemaless_insert_ttl_with_reqid_tbname_key(TAOS *taos, char *lines[], int numLines, int protocol, + int precision, int32_t ttl, int64_t reqid, char *tbnameKey); /* --------------------------TMQ INTERFACE------------------------------- */ typedef struct tmq_t tmq_t; diff --git a/source/client/inc/clientSml.h b/source/client/inc/clientSml.h index 122914fd34..85c180da5a 100644 --- a/source/client/inc/clientSml.h +++ b/source/client/inc/clientSml.h @@ -204,6 +204,7 @@ typedef struct { STableMeta *currSTableMeta; STableDataCxt *currTableDataCtx; bool needModifySchema; + char *tbnameKey; } SSmlHandle; extern int64_t smlFactorNS[]; diff --git a/source/client/src/clientSml.c b/source/client/src/clientSml.c index 6bcdb4e973..950f9d13d0 100644 --- a/source/client/src/clientSml.c +++ b/source/client/src/clientSml.c @@ -1827,7 +1827,7 @@ void smlSetReqSQL(SRequestObj *request, char *lines[], char *rawLine, char *rawL } TAOS_RES *taos_schemaless_insert_inner(TAOS *taos, char *lines[], char *rawLine, char *rawLineEnd, int numLines, - int protocol, int precision, int32_t ttl, int64_t reqid) { + int protocol, int precision, int32_t ttl, int64_t reqid, char *tbnameKey) { int32_t code = TSDB_CODE_SUCCESS; if (NULL == taos) { terrno = TSDB_CODE_TSC_DISCONNECTED; @@ -1856,6 +1856,7 @@ TAOS_RES *taos_schemaless_insert_inner(TAOS *taos, char *lines[], char *rawLine, info->msgBuf.buf = info->pRequest->msgBuf; info->msgBuf.len = ERROR_MSG_BUF_DEFAULT_SIZE; info->lineNum = numLines; + info->tbnameKey = tbnameKey; smlSetReqSQL(request, lines, rawLine, rawLineEnd); @@ -1935,9 +1936,14 @@ end: * @return TAOS_RES */ +TAOS_RES *taos_schemaless_insert_ttl_with_reqid_tbname_key(TAOS *taos, char *lines[], int numLines, int protocol, + int precision, int32_t ttl, int64_t reqid, char *tbnameKey){ + return taos_schemaless_insert_inner(taos, lines, NULL, NULL, numLines, protocol, precision, ttl, reqid, tbnameKey); +} + TAOS_RES *taos_schemaless_insert_ttl_with_reqid(TAOS *taos, char *lines[], int numLines, int protocol, int precision, int32_t ttl, int64_t reqid) { - return taos_schemaless_insert_inner(taos, lines, NULL, NULL, numLines, protocol, precision, ttl, reqid); + return taos_schemaless_insert_ttl_with_reqid_tbname_key(taos, lines, numLines, protocol, precision, ttl, reqid, NULL); } TAOS_RES *taos_schemaless_insert(TAOS *taos, char *lines[], int numLines, int protocol, int precision) { @@ -1970,10 +1976,15 @@ static void getRawLineLen(char *lines, int len, int32_t *totalRows, int protocol } } +TAOS_RES *taos_schemaless_insert_raw_ttl_with_reqid_tbname_key(TAOS *taos, char *lines, int len, int32_t *totalRows, + int protocol, int precision, int32_t ttl, int64_t reqid, char *tbnameKey){ + getRawLineLen(lines, len, totalRows, protocol); + return taos_schemaless_insert_inner(taos, NULL, lines, lines + len, *totalRows, protocol, precision, ttl, reqid, tbnameKey); +} + TAOS_RES *taos_schemaless_insert_raw_ttl_with_reqid(TAOS *taos, char *lines, int len, int32_t *totalRows, int protocol, int precision, int32_t ttl, int64_t reqid) { - getRawLineLen(lines, len, totalRows, protocol); - return taos_schemaless_insert_inner(taos, NULL, lines, lines + len, *totalRows, protocol, precision, ttl, reqid); + taos_schemaless_insert_raw_ttl_with_reqid_tbname_key(taos, lines, len, totalRows, protocol, precision, ttl, reqid, NULL); } TAOS_RES *taos_schemaless_insert_raw_with_reqid(TAOS *taos, char *lines, int len, int32_t *totalRows, int protocol, From c63a7e39797be965843efb56faa5234bf952603d Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Wed, 13 Mar 2024 10:52:54 +0800 Subject: [PATCH 02/45] feat:add paras for schemaless interface --- source/client/inc/clientSml.h | 2 +- source/client/src/clientSml.c | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/source/client/inc/clientSml.h b/source/client/inc/clientSml.h index 85c180da5a..5a2fbd45b4 100644 --- a/source/client/inc/clientSml.h +++ b/source/client/inc/clientSml.h @@ -222,7 +222,7 @@ bool smlParseNumber(SSmlKv *kvVal, SSmlMsgBuf *msg); int64_t smlGetTimeValue(const char *value, int32_t len, uint8_t fromPrecision, uint8_t toPrecision); SSmlTableInfo* smlBuildTableInfo(int numRows, const char* measure, int32_t measureLen); SSmlSTableMeta* smlBuildSTableMeta(bool isDataFormat); -int32_t smlSetCTableName(SSmlTableInfo *oneTable); +int32_t smlSetCTableName(SSmlTableInfo *oneTable, char *tbnameKey); void getTableUid(SSmlHandle *info, SSmlLineInfo *currElement, SSmlTableInfo *tinfo); STableMeta* smlGetMeta(SSmlHandle *info, const void* measure, int32_t measureLen); int32_t is_same_child_table_telnet(const void *a, const void *b); diff --git a/source/client/src/clientSml.c b/source/client/src/clientSml.c index 950f9d13d0..e1ca9e5d3e 100644 --- a/source/client/src/clientSml.c +++ b/source/client/src/clientSml.c @@ -349,7 +349,7 @@ int32_t smlProcessChildTable(SSmlHandle *info, SSmlLineInfo *elements){ if (kv->valueEscaped) kv->value = NULL; } - smlSetCTableName(tinfo); + smlSetCTableName(tinfo, info->tbnameKey); getTableUid(info, elements, tinfo); if (info->dataFormat) { info->currSTableMeta->uid = tinfo->uid; @@ -418,10 +418,10 @@ int32_t smlParseEndLine(SSmlHandle *info, SSmlLineInfo *elements, SSmlKv *kvTs){ return TSDB_CODE_SUCCESS; } -static int32_t smlParseTableName(SArray *tags, char *childTableName) { +static int32_t smlParseTableName(SArray *tags, char *childTableName, char *tbnameKey) { bool autoChildName = false; size_t delimiter = strlen(tsSmlAutoChildTableNameDelimiter); - if(delimiter > 0){ + if(delimiter > 0 && tbnameKey == NULL){ size_t totalNameLen = delimiter * (taosArrayGetSize(tags) - 1); for (int i = 0; i < taosArrayGetSize(tags); i++) { SSmlKv *tag = (SSmlKv *)taosArrayGet(tags, i); @@ -444,13 +444,16 @@ static int32_t smlParseTableName(SArray *tags, char *childTableName) { smlStrReplace(childTableName, strlen(childTableName)); } }else{ - size_t childTableNameLen = strlen(tsSmlChildTableName); + if (tbnameKey == NULL){ + tbnameKey = tsSmlChildTableName; + } + size_t childTableNameLen = strlen(tbnameKey); if (childTableNameLen <= 0) return TSDB_CODE_SUCCESS; for (int i = 0; i < taosArrayGetSize(tags); i++) { SSmlKv *tag = (SSmlKv *)taosArrayGet(tags, i); // handle child table name - if (childTableNameLen == tag->keyLen && strncmp(tag->key, tsSmlChildTableName, tag->keyLen) == 0) { + if (childTableNameLen == tag->keyLen && strncmp(tag->key, tbnameKey, tag->keyLen) == 0) { memset(childTableName, 0, TSDB_TABLE_NAME_LEN); strncpy(childTableName, tag->value, (tag->length < TSDB_TABLE_NAME_LEN ? tag->length : TSDB_TABLE_NAME_LEN)); if(tsSmlDot2Underline){ @@ -465,8 +468,8 @@ static int32_t smlParseTableName(SArray *tags, char *childTableName) { return TSDB_CODE_SUCCESS; } -int32_t smlSetCTableName(SSmlTableInfo *oneTable) { - smlParseTableName(oneTable->tags, oneTable->childTableName); +int32_t smlSetCTableName(SSmlTableInfo *oneTable, char *tbnameKey) { + smlParseTableName(oneTable->tags, oneTable->childTableName, tbnameKey); if (strlen(oneTable->childTableName) == 0) { SArray *dst = taosArrayDup(oneTable->tags, NULL); From 8fcf57c0771c05799767112cfb46908e3b117276 Mon Sep 17 00:00:00 2001 From: xsren <285808407@qq.com> Date: Mon, 5 Aug 2024 12:28:49 +0800 Subject: [PATCH 03/45] l2 cache --- include/util/tcompare.h | 1 + source/util/src/tcompare.c | 51 +++++++++++++++++++++++++++------ source/util/src/tworker.c | 2 ++ source/util/test/CMakeLists.txt | 7 +++++ 4 files changed, 53 insertions(+), 8 deletions(-) diff --git a/include/util/tcompare.h b/include/util/tcompare.h index 80f992f646..c7a29cad57 100644 --- a/include/util/tcompare.h +++ b/include/util/tcompare.h @@ -49,6 +49,7 @@ int32_t InitRegexCache(); void DestroyRegexCache(); int32_t patternMatch(const char *pattern, size_t psize, const char *str, size_t ssize, const SPatternCompareInfo *pInfo); int32_t checkRegexPattern(const char *pPattern); +void DestoryThreadLocalRegComp(); int32_t wcsPatternMatch(const TdUcs4 *pattern, size_t psize, const TdUcs4 *str, size_t ssize, const SPatternCompareInfo *pInfo); diff --git a/source/util/src/tcompare.c b/source/util/src/tcompare.c index 4cb48bffe5..90c1441af5 100644 --- a/source/util/src/tcompare.c +++ b/source/util/src/tcompare.c @@ -1290,13 +1290,12 @@ int32_t checkRegexPattern(const char *pPattern) { return TSDB_CODE_SUCCESS; } -static UsingRegex **getRegComp(const char *pPattern) { +UsingRegex **getRegComp(const char *pPattern) { UsingRegex **ppUsingRegex = (UsingRegex **)taosHashAcquire(sRegexCache.regexHash, pPattern, strlen(pPattern)); if (ppUsingRegex != NULL) { (*ppUsingRegex)->lastUsedTime = taosGetTimestampSec(); return ppUsingRegex; } - UsingRegex *pUsingRegex = taosMemoryMalloc(sizeof(UsingRegex)); if (pUsingRegex == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; @@ -1341,20 +1340,56 @@ void releaseRegComp(UsingRegex **regex){ taosHashRelease(sRegexCache.regexHash, regex); } -static int32_t doExecRegexMatch(const char *pString, const char *pPattern) { - int32_t ret = 0; - char msgbuf[256] = {0}; +static threadlocal UsingRegex ** ppRegex; +static threadlocal char *pOldPattern = NULL; +void DestoryThreadLocalRegComp() { + if (NULL != pOldPattern) { + releaseRegComp(ppRegex); + taosMemoryFree(pOldPattern); + pOldPattern = NULL; + } +} + +int32_t threadGetRegComp(regex_t **regex, const char *pPattern) { + if (NULL != pOldPattern) { + if (strcmp(pOldPattern, pPattern) == 0) { + *regex = &(*ppRegex)->pRegex; + return 0; + } else { + DestoryThreadLocalRegComp(); + } + } + UsingRegex **pUsingRegex = getRegComp(pPattern); if (pUsingRegex == NULL) { return 1; } + pOldPattern = (char *)taosMemoryMalloc(strlen(pPattern) + 1); + if (NULL == pOldPattern) { + uError("Failed to Malloc when compile regex pattern %s.", pPattern); + return TSDB_CODE_OUT_OF_MEMORY; + } + strcpy(pOldPattern, pPattern); + ppRegex = pUsingRegex; + *regex = &(*pUsingRegex)->pRegex; + return 0; +} + +static int32_t doExecRegexMatch(const char *pString, const char *pPattern) { + int32_t ret = 0; + char msgbuf[256] = {0}; + + regex_t *regex = NULL; + ret = threadGetRegComp(®ex, pPattern); + if (ret != 0) { + return ret; + } regmatch_t pmatch[1]; - ret = regexec(&(*pUsingRegex)->pRegex, pString, 1, pmatch, 0); - releaseRegComp(pUsingRegex); + ret = regexec(regex, pString, 1, pmatch, 0); if (ret != 0 && ret != REG_NOMATCH) { terrno = TSDB_CODE_PAR_REGULAR_EXPRESSION_ERROR; - (void)regerror(ret, &(*pUsingRegex)->pRegex, msgbuf, sizeof(msgbuf)); + (void)regerror(ret, regex, msgbuf, sizeof(msgbuf)); uDebug("Failed to match %s with pattern %s, reason %s", pString, pPattern, msgbuf) } diff --git a/source/util/src/tworker.c b/source/util/src/tworker.c index d66628d46d..1eab9365f5 100644 --- a/source/util/src/tworker.c +++ b/source/util/src/tworker.c @@ -106,6 +106,7 @@ static void *tQWorkerThreadFp(SQueueWorker *worker) { } destroyThreadLocalGeosCtx(); + DestoryThreadLocalRegComp(); return NULL; } @@ -237,6 +238,7 @@ static void *tAutoQWorkerThreadFp(SQueueWorker *worker) { taosUpdateItemSize(qinfo.queue, 1); } + DestoryThreadLocalRegComp(); return NULL; } diff --git a/source/util/test/CMakeLists.txt b/source/util/test/CMakeLists.txt index e8aabfe338..0d8774ba41 100644 --- a/source/util/test/CMakeLists.txt +++ b/source/util/test/CMakeLists.txt @@ -119,6 +119,13 @@ add_test( COMMAND bufferTest ) +add_executable(regexTest "regexTest.cpp") +target_link_libraries(regexTest os util gtest_main ) +add_test( + NAME regexTest + COMMAND regexTest +) + #add_executable(decompressTest "decompressTest.cpp") #target_link_libraries(decompressTest os util common gtest_main) #add_test( From 7d44466603ac26dd8cd532cf4bf1c751f65b2f4f Mon Sep 17 00:00:00 2001 From: xsren <285808407@qq.com> Date: Mon, 5 Aug 2024 12:30:05 +0800 Subject: [PATCH 04/45] utest --- source/util/test/regexTest.cpp | 257 +++++++++++++++++++++++++++++++++ 1 file changed, 257 insertions(+) create mode 100644 source/util/test/regexTest.cpp diff --git a/source/util/test/regexTest.cpp b/source/util/test/regexTest.cpp new file mode 100644 index 0000000000..26857bce88 --- /dev/null +++ b/source/util/test/regexTest.cpp @@ -0,0 +1,257 @@ + +#include +#include +#include +#include +#include +#include "os.h" +#include "tutil.h" +#include "regex.h" +#include "osDef.h" +#include "tcompare.h" + +extern "C" { + typedef struct UsingRegex UsingRegex; + UsingRegex** getRegComp(const char *pPattern); + int32_t threadGetRegComp(regex_t **regex, const char *pPattern); +} + +class regexTest { + public: + regexTest() { (void)InitRegexCache(); } + ~regexTest() { (void)DestroyRegexCache(); } +}; +static regexTest test; + +static threadlocal regex_t pRegex; +static threadlocal char *pOldPattern = NULL; + +void DestoryThreadLocalRegComp1() { + if (NULL != pOldPattern) { + regfree(&pRegex); + taosMemoryFree(pOldPattern); + pOldPattern = NULL; + } +} + +static regex_t *threadGetRegComp1(const char *pPattern) { + if (NULL != pOldPattern) { + if( strcmp(pOldPattern, pPattern) == 0) { + return &pRegex; + } else { + DestoryThreadLocalRegComp1(); + } + } + pOldPattern = (char*)taosMemoryMalloc(strlen(pPattern) + 1); + if (NULL == pOldPattern) { + uError("Failed to Malloc when compile regex pattern %s.", pPattern); + return NULL; + } + strcpy(pOldPattern, pPattern); + int32_t cflags = REG_EXTENDED; + int32_t ret = regcomp(&pRegex, pPattern, cflags); + if (ret != 0) { + char msgbuf[256] = {0}; + regerror(ret, &pRegex, msgbuf, tListLen(msgbuf)); + uError("Failed to compile regex pattern %s. reason %s", pPattern, msgbuf); + DestoryThreadLocalRegComp1(); + return NULL; + } + return &pRegex; +} + +TEST(testCase, regexCacheTest1) { + int times = 100000; + char s1[] = "abc"; + auto start = std::chrono::high_resolution_clock::now(); + + uint64_t t0 = taosGetTimestampUs(); + for(int i = 0; i < times; i++) { + UsingRegex** rex = getRegComp(s1); + } + uint64_t t1 = taosGetTimestampUs(); + + printf("%s regex(current) %d times:%" PRIu64 " us.\n", s1, times, t1 - t0); + + uint64_t t2 = taosGetTimestampUs(); + for(int i = 0; i < times; i++) { + regex_t* rex = threadGetRegComp1(s1); + } + uint64_t t3 = taosGetTimestampUs(); + + printf("%s regex(before) %d times:%" PRIu64 " us.\n", s1, times, t3 - t2); + + t2 = taosGetTimestampUs(); + for(int i = 0; i < times; i++) { + regex_t* rex = NULL; + (void)threadGetRegComp(&rex, s1); + } + t3 = taosGetTimestampUs(); + + printf("%s regex(new) %d times:%" PRIu64 " us.\n", s1, times, t3 - t2); +} + +TEST(testCase, regexCacheTest2) { + int times = 100000; + char s1[] = "abc%*"; + auto start = std::chrono::high_resolution_clock::now(); + + uint64_t t0 = taosGetTimestampUs(); + for(int i = 0; i < times; i++) { + UsingRegex** rex = getRegComp(s1); + } + uint64_t t1 = taosGetTimestampUs(); + + printf("%s regex(current) %d times:%" PRIu64 " us.\n", s1, times, t1 - t0); + + uint64_t t2 = taosGetTimestampUs(); + for(int i = 0; i < times; i++) { + regex_t* rex = threadGetRegComp1(s1); + } + uint64_t t3 = taosGetTimestampUs(); + + printf("%s regex(before) %d times:%" PRIu64 " us.\n", s1, times, t3 - t2); + + t2 = taosGetTimestampUs(); + for(int i = 0; i < times; i++) { + regex_t* rex = NULL; + (void)threadGetRegComp(&rex, s1); + } + t3 = taosGetTimestampUs(); + + printf("%s regex(new) %d times:%" PRIu64 " us.\n", s1, times, t3 - t2); +} + +TEST(testCase, regexCacheTest3) { + int times = 100000; + char s1[] = "abc%*"; + char s2[] = "abc"; + auto start = std::chrono::high_resolution_clock::now(); + + uint64_t t0 = taosGetTimestampUs(); + for(int i = 0; i < times; i++) { + UsingRegex** rex = getRegComp(s1); + rex = getRegComp(s2); + } + uint64_t t1 = taosGetTimestampUs(); + + printf("'%s' and '%s' take place by turn regex(current) %d times:%" PRIu64 " us.\n", s1, s2, times, t1 - t0); + + uint64_t t2 = taosGetTimestampUs(); + for(int i = 0; i < times; i++) { + regex_t* rex = threadGetRegComp1(s1); + rex = threadGetRegComp1(s2); + } + uint64_t t3 = taosGetTimestampUs(); + + printf("'%s' and '%s' take place by turn regex(before) %d times:%" PRIu64 " us.\n", s1, s2, times, t3 - t2); + + t2 = taosGetTimestampUs(); + for(int i = 0; i < times; i++) { + regex_t* rex = NULL; + (void)threadGetRegComp(&rex, s1); + (void)threadGetRegComp(&rex, s2); + } + t3 = taosGetTimestampUs(); + + printf("'%s' and '%s' take place by turn regex(new) %d times:%" PRIu64 " us.\n", s1, s2, times, t3 - t2); +} + +TEST(testCase, regexCacheTest4) { + int times = 100; + int count = 1000; + char s1[] = "abc%*"; + char s2[] = "abc"; + auto start = std::chrono::high_resolution_clock::now(); + + uint64_t t0 = taosGetTimestampUs(); + for (int i = 0; i < times; i++) { + for (int j = 0; j < count; ++j) { + UsingRegex** rex = getRegComp(s1); + } + for (int j = 0; j < count; ++j) { + UsingRegex** rex = getRegComp(s2); + } + } + uint64_t t1 = taosGetTimestampUs(); + + printf("'%s' and '%s' take place by turn(per %d count) regex(current) %d times:%" PRIu64 " us.\n", s1, s2, count, times, t1 - t0); + + uint64_t t2 = taosGetTimestampUs(); + for (int i = 0; i < times; i++) { + for (int j = 0; j < count; ++j) { + regex_t* rex = threadGetRegComp1(s1); + } + for (int j = 0; j < count; ++j) { + regex_t* rex = threadGetRegComp1(s2); + } + } + uint64_t t3 = taosGetTimestampUs(); + + printf("'%s' and '%s' take place by turn(per %d count) regex(before) %d times:%" PRIu64 " us.\n", s1, s2, count, times, t3 - t2); + + t2 = taosGetTimestampUs(); + for (int i = 0; i < times; i++) { + for (int j = 0; j < count; ++j) { + regex_t* rex = NULL; + (void)threadGetRegComp(&rex, s1); + } + for (int j = 0; j < count; ++j) { + regex_t* rex = NULL; + (void)threadGetRegComp(&rex, s2); + } + } + t3 = taosGetTimestampUs(); + + printf("'%s' and '%s' take place by turn(per %d count) regex(new) %d times:%" PRIu64 " us.\n", s1, s2, count, times, t3 - t2); +} +/* +TEST(testCase, regexCacheTest5) { + int times = 10000; + int count = 10000; + char s1[] = "abc%*"; + char s2[] = "abc"; + auto start = std::chrono::high_resolution_clock::now(); + + uint64_t t0 = taosGetTimestampUs(); + for (int i = 0; i < times; i++) { + for (int j = 0; j < count; ++j) { + UsingRegex** rex = getRegComp(s1); + } + for (int j = 0; j < count; ++j) { + UsingRegex** rex = getRegComp(s2); + } + } + uint64_t t1 = taosGetTimestampUs(); + + printf("'%s' and '%s' take place by turn(per %d count) regex(current) %d times:%" PRIu64 " us.\n", s1, s2, count, times, t1 - t0); + + uint64_t t2 = taosGetTimestampUs(); + for (int i = 0; i < times; i++) { + for (int j = 0; j < count; ++j) { + regex_t* rex = threadGetRegComp1(s1); + } + for (int j = 0; j < count; ++j) { + regex_t* rex = threadGetRegComp1(s2); + } + } + uint64_t t3 = taosGetTimestampUs(); + + printf("'%s' and '%s' take place by turn(per %d count) regex(before) %d times:%" PRIu64 " us.\n", s1, s2, count, times, t3 - t2); + + t2 = taosGetTimestampUs(); + for (int i = 0; i < times; i++) { + for (int j = 0; j < count; ++j) { + regex_t* rex = NULL; + (void)threadGetRegComp(&rex, s1); + } + for (int j = 0; j < count; ++j) { + regex_t* rex = NULL; + (void)threadGetRegComp(&rex, s2); + } + } + t3 = taosGetTimestampUs(); + + printf("'%s' and '%s' take place by turn(per %d count) regex(new) %d times:%" PRIu64 " us.\n", s1, s2, count, times, t3 - t2); +} +*/ From cc4dccfd914d903ccfa8f251648dcc703af3f9f7 Mon Sep 17 00:00:00 2001 From: xsren <285808407@qq.com> Date: Mon, 5 Aug 2024 13:42:04 +0800 Subject: [PATCH 05/45] mem leak --- source/util/src/tworker.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/util/src/tworker.c b/source/util/src/tworker.c index 1eab9365f5..27e5ea290f 100644 --- a/source/util/src/tworker.c +++ b/source/util/src/tworker.c @@ -666,6 +666,7 @@ static void *tQueryAutoQWorkerThreadFp(SQueryAutoQWorker *worker) { } destroyThreadLocalGeosCtx(); + DestoryThreadLocalRegComp(); return NULL; } From a61149047f9fc0a8ddc665817a14eb3fdc635dcc Mon Sep 17 00:00:00 2001 From: xsren <285808407@qq.com> Date: Mon, 5 Aug 2024 14:42:30 +0800 Subject: [PATCH 06/45] use direct pointer --- source/util/src/tcompare.c | 19 ++++++++----- source/util/test/regexTest.cpp | 52 +++++++++++++++++++++++++++++++++- 2 files changed, 63 insertions(+), 8 deletions(-) diff --git a/source/util/src/tcompare.c b/source/util/src/tcompare.c index 90c1441af5..af2205c590 100644 --- a/source/util/src/tcompare.c +++ b/source/util/src/tcompare.c @@ -1296,6 +1296,7 @@ UsingRegex **getRegComp(const char *pPattern) { (*ppUsingRegex)->lastUsedTime = taosGetTimestampSec(); return ppUsingRegex; } + printf("getRegComp , ..."); UsingRegex *pUsingRegex = taosMemoryMalloc(sizeof(UsingRegex)); if (pUsingRegex == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; @@ -1340,12 +1341,15 @@ void releaseRegComp(UsingRegex **regex){ taosHashRelease(sRegexCache.regexHash, regex); } -static threadlocal UsingRegex ** ppRegex; +static threadlocal UsingRegex ** ppUsingRegex; +static threadlocal regex_t * pRegex; static threadlocal char *pOldPattern = NULL; void DestoryThreadLocalRegComp() { if (NULL != pOldPattern) { - releaseRegComp(ppRegex); + releaseRegComp(ppUsingRegex); taosMemoryFree(pOldPattern); + ppUsingRegex = NULL; + pRegex = NULL; pOldPattern = NULL; } } @@ -1353,15 +1357,15 @@ void DestoryThreadLocalRegComp() { int32_t threadGetRegComp(regex_t **regex, const char *pPattern) { if (NULL != pOldPattern) { if (strcmp(pOldPattern, pPattern) == 0) { - *regex = &(*ppRegex)->pRegex; + *regex = pRegex; return 0; } else { DestoryThreadLocalRegComp(); } } - UsingRegex **pUsingRegex = getRegComp(pPattern); - if (pUsingRegex == NULL) { + UsingRegex **ppRegex = getRegComp(pPattern); + if (ppRegex == NULL) { return 1; } pOldPattern = (char *)taosMemoryMalloc(strlen(pPattern) + 1); @@ -1370,8 +1374,9 @@ int32_t threadGetRegComp(regex_t **regex, const char *pPattern) { return TSDB_CODE_OUT_OF_MEMORY; } strcpy(pOldPattern, pPattern); - ppRegex = pUsingRegex; - *regex = &(*pUsingRegex)->pRegex; + ppUsingRegex = ppRegex; + pRegex = &((*ppUsingRegex)->pRegex); + *regex = &(*ppRegex)->pRegex; return 0; } diff --git a/source/util/test/regexTest.cpp b/source/util/test/regexTest.cpp index 26857bce88..3cd8f5c88c 100644 --- a/source/util/test/regexTest.cpp +++ b/source/util/test/regexTest.cpp @@ -205,7 +205,8 @@ TEST(testCase, regexCacheTest4) { printf("'%s' and '%s' take place by turn(per %d count) regex(new) %d times:%" PRIu64 " us.\n", s1, s2, count, times, t3 - t2); } -/* + +/* It is not a good idea to test this case, because it will take a long time. TEST(testCase, regexCacheTest5) { int times = 10000; int count = 10000; @@ -254,4 +255,53 @@ TEST(testCase, regexCacheTest5) { printf("'%s' and '%s' take place by turn(per %d count) regex(new) %d times:%" PRIu64 " us.\n", s1, s2, count, times, t3 - t2); } + +TEST(testCase, regexCacheTest6) { + int times = 10000; + int count = 1000; + char s1[] = "abc%*"; + char s2[] = "abc"; + auto start = std::chrono::high_resolution_clock::now(); + + uint64_t t0 = taosGetTimestampUs(); + for (int i = 0; i < times; i++) { + for (int j = 0; j < count; ++j) { + UsingRegex** rex = getRegComp(s1); + } + for (int j = 0; j < count; ++j) { + UsingRegex** rex = getRegComp(s2); + } + } + uint64_t t1 = taosGetTimestampUs(); + + printf("'%s' and '%s' take place by turn(per %d count) regex(current) %d times:%" PRIu64 " us.\n", s1, s2, count, times, t1 - t0); + + uint64_t t2 = taosGetTimestampUs(); + for (int i = 0; i < times; i++) { + for (int j = 0; j < count; ++j) { + regex_t* rex = threadGetRegComp1(s1); + } + for (int j = 0; j < count; ++j) { + regex_t* rex = threadGetRegComp1(s2); + } + } + uint64_t t3 = taosGetTimestampUs(); + + printf("'%s' and '%s' take place by turn(per %d count) regex(before) %d times:%" PRIu64 " us.\n", s1, s2, count, times, t3 - t2); + + t2 = taosGetTimestampUs(); + for (int i = 0; i < times; i++) { + for (int j = 0; j < count; ++j) { + regex_t* rex = NULL; + (void)threadGetRegComp(&rex, s1); + } + for (int j = 0; j < count; ++j) { + regex_t* rex = NULL; + (void)threadGetRegComp(&rex, s2); + } + } + t3 = taosGetTimestampUs(); + + printf("'%s' and '%s' take place by turn(per %d count) regex(new) %d times:%" PRIu64 " us.\n", s1, s2, count, times, t3 - t2); +} */ From 53d115f74adad6ee71560a3633042369f91bf83c Mon Sep 17 00:00:00 2001 From: xsren <285808407@qq.com> Date: Mon, 5 Aug 2024 19:30:22 +0800 Subject: [PATCH 07/45] fix: skip dub key error --- source/util/src/tcompare.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/util/src/tcompare.c b/source/util/src/tcompare.c index af2205c590..d949bdcc07 100644 --- a/source/util/src/tcompare.c +++ b/source/util/src/tcompare.c @@ -1321,6 +1321,8 @@ UsingRegex **getRegComp(const char *pPattern) { uError("Failed to put regex pattern %s into cache, exception internal error.", pPattern); terrno = code; return NULL; + } else if (code == TSDB_CODE_DUP_KEY) { + terrno = 0; } ppUsingRegex = (UsingRegex **)taosHashAcquire(sRegexCache.regexHash, pPattern, strlen(pPattern)); if (ppUsingRegex) { From 3f25f121873eb3efefbdafd44dab972f1e6fea49 Mon Sep 17 00:00:00 2001 From: xsren <285808407@qq.com> Date: Tue, 6 Aug 2024 13:35:39 +0800 Subject: [PATCH 08/45] fix: cache free --- source/util/src/tcompare.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/source/util/src/tcompare.c b/source/util/src/tcompare.c index d949bdcc07..a870aa1e29 100644 --- a/source/util/src/tcompare.c +++ b/source/util/src/tcompare.c @@ -1213,14 +1213,30 @@ typedef struct RegexCache { SHashObj *regexHash; void *regexCacheTmr; void *timer; + TdThreadMutex mutex; + bool exit; } RegexCache; static RegexCache sRegexCache; #define MAX_REGEX_CACHE_SIZE 20 #define REGEX_CACHE_CLEAR_TIME 30 static void checkRegexCache(void* param, void* tmrId) { + int32_t code = 0; + code = taosThreadMutexLock(&sRegexCache.mutex); + if (code != 0) { + uError("[regex cache] checkRegexCache, Failed to lock mutex"); + return; + } + if(sRegexCache.exit) { + code = taosThreadMutexUnlock(&sRegexCache.mutex); + if(code != 0) { + uError("[regex cache] checkRegexCache, Failed to unlock mutex"); + } + return; + } (void)taosTmrReset(checkRegexCache, REGEX_CACHE_CLEAR_TIME * 1000, param, sRegexCache.regexCacheTmr, &tmrId); if (taosHashGetSize(sRegexCache.regexHash) < MAX_REGEX_CACHE_SIZE) { + taosThreadMutexUnlock(&sRegexCache.mutex); return; } @@ -1235,6 +1251,10 @@ static void checkRegexCache(void* param, void* tmrId) { ppUsingRegex = taosHashIterate(sRegexCache.regexHash, ppUsingRegex); } } + code = taosThreadMutexUnlock(&sRegexCache.mutex); + if(code != 0) { + uError("[regex cache] checkRegexCache, Failed to unlock mutex"); + } } void regexCacheFree(void *ppUsingRegex) { @@ -1262,14 +1282,31 @@ int32_t InitRegexCache() { return -1; } + if (taosThreadMutexInit(&sRegexCache.mutex, NULL) != 0) { + uError("failed to init mutex"); + return -1; + } + sRegexCache.exit = false; + return 0; } void DestroyRegexCache(){ + int32_t code = 0; uInfo("[regex cache] destory regex cache"); + code = taosThreadMutexLock(&sRegexCache.mutex); + if (code != 0) { + uError("[regex cache] Failed to lock mutex"); + return; + } (void)taosTmrStopA(&sRegexCache.timer); + sRegexCache.exit = true; taosHashCleanup(sRegexCache.regexHash); taosTmrCleanUp(sRegexCache.regexCacheTmr); + code = taosThreadMutexUnlock(&sRegexCache.mutex); + if (code != 0) { + uError("[regex cache] Failed to unlock mutex"); + } } int32_t checkRegexPattern(const char *pPattern) { @@ -1296,7 +1333,6 @@ UsingRegex **getRegComp(const char *pPattern) { (*ppUsingRegex)->lastUsedTime = taosGetTimestampSec(); return ppUsingRegex; } - printf("getRegComp , ..."); UsingRegex *pUsingRegex = taosMemoryMalloc(sizeof(UsingRegex)); if (pUsingRegex == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; From 8989a3986504d847ba18569027d5046d56a14bfb Mon Sep 17 00:00:00 2001 From: xsren <285808407@qq.com> Date: Tue, 6 Aug 2024 13:44:42 +0800 Subject: [PATCH 09/45] fix: free cache --- source/util/src/tcompare.c | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/source/util/src/tcompare.c b/source/util/src/tcompare.c index a870aa1e29..f6878ee7c2 100644 --- a/source/util/src/tcompare.c +++ b/source/util/src/tcompare.c @@ -1228,16 +1228,11 @@ static void checkRegexCache(void* param, void* tmrId) { return; } if(sRegexCache.exit) { - code = taosThreadMutexUnlock(&sRegexCache.mutex); - if(code != 0) { - uError("[regex cache] checkRegexCache, Failed to unlock mutex"); - } - return; + goto _exit; } (void)taosTmrReset(checkRegexCache, REGEX_CACHE_CLEAR_TIME * 1000, param, sRegexCache.regexCacheTmr, &tmrId); if (taosHashGetSize(sRegexCache.regexHash) < MAX_REGEX_CACHE_SIZE) { - taosThreadMutexUnlock(&sRegexCache.mutex); - return; + goto _exit; } if (taosHashGetSize(sRegexCache.regexHash) >= MAX_REGEX_CACHE_SIZE) { @@ -1251,6 +1246,7 @@ static void checkRegexCache(void* param, void* tmrId) { ppUsingRegex = taosHashIterate(sRegexCache.regexHash, ppUsingRegex); } } +_exit: code = taosThreadMutexUnlock(&sRegexCache.mutex); if(code != 0) { uError("[regex cache] checkRegexCache, Failed to unlock mutex"); @@ -1276,30 +1272,29 @@ int32_t InitRegexCache() { return -1; } + sRegexCache.exit = false; + if (taosThreadMutexInit(&sRegexCache.mutex, NULL) != 0) { + uError("failed to init mutex"); + return -1; + } sRegexCache.timer = taosTmrStart(checkRegexCache, REGEX_CACHE_CLEAR_TIME * 1000, NULL, sRegexCache.regexCacheTmr); if (sRegexCache.timer == NULL) { uError("failed to start regex cache timer"); return -1; } - if (taosThreadMutexInit(&sRegexCache.mutex, NULL) != 0) { - uError("failed to init mutex"); - return -1; - } - sRegexCache.exit = false; - return 0; } void DestroyRegexCache(){ int32_t code = 0; uInfo("[regex cache] destory regex cache"); + (void)taosTmrStopA(&sRegexCache.timer); code = taosThreadMutexLock(&sRegexCache.mutex); if (code != 0) { uError("[regex cache] Failed to lock mutex"); return; } - (void)taosTmrStopA(&sRegexCache.timer); sRegexCache.exit = true; taosHashCleanup(sRegexCache.regexHash); taosTmrCleanUp(sRegexCache.regexCacheTmr); From 3adaebd2a07209c9507e93568ef05dc6528c7cc9 Mon Sep 17 00:00:00 2001 From: xsren <285808407@qq.com> Date: Tue, 6 Aug 2024 16:20:29 +0800 Subject: [PATCH 10/45] return value --- source/libs/scalar/src/scalar.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/libs/scalar/src/scalar.c b/source/libs/scalar/src/scalar.c index d08f358ce0..9428f051aa 100644 --- a/source/libs/scalar/src/scalar.c +++ b/source/libs/scalar/src/scalar.c @@ -904,9 +904,8 @@ int32_t sclExecOperator(SOperatorNode *node, SScalarCtx *ctx, SScalarParam *outp terrno = TSDB_CODE_SUCCESS; SCL_ERR_JRET(OperatorFn(pLeft, pRight, output, TSDB_ORDER_ASC)); - SCL_ERR_JRET(terrno); -_return: +_return: sclFreeParamList(params, paramNum); SCL_RET(code); } From 152758b72d40dbeaabeb7b39f3e85137f0c89bdb Mon Sep 17 00:00:00 2001 From: xsren <285808407@qq.com> Date: Tue, 6 Aug 2024 16:28:18 +0800 Subject: [PATCH 11/45] use taosStrdup --- source/util/src/tcompare.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/util/src/tcompare.c b/source/util/src/tcompare.c index f6878ee7c2..f9bea3b947 100644 --- a/source/util/src/tcompare.c +++ b/source/util/src/tcompare.c @@ -1401,12 +1401,11 @@ int32_t threadGetRegComp(regex_t **regex, const char *pPattern) { if (ppRegex == NULL) { return 1; } - pOldPattern = (char *)taosMemoryMalloc(strlen(pPattern) + 1); + pOldPattern = taosStrdup(pPattern); if (NULL == pOldPattern) { uError("Failed to Malloc when compile regex pattern %s.", pPattern); return TSDB_CODE_OUT_OF_MEMORY; } - strcpy(pOldPattern, pPattern); ppUsingRegex = ppRegex; pRegex = &((*ppUsingRegex)->pRegex); *regex = &(*ppRegex)->pRegex; From 66753111c92bdb526557641f66c5385dbf3aa4f3 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Tue, 6 Aug 2024 16:52:28 +0800 Subject: [PATCH 12/45] fix return error --- source/client/src/clientEnv.c | 2 +- source/client/src/clientImpl.c | 1 + source/dnode/mgmt/node_mgmt/src/dmTransport.c | 6 +++--- source/libs/function/src/udfd.c | 2 +- source/libs/sync/test/sync_test_lib/src/syncIO.c | 4 ++-- source/libs/transport/test/cliBench.c | 2 +- 6 files changed, 9 insertions(+), 8 deletions(-) diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c index 35e6651c41..530d52026f 100644 --- a/source/client/src/clientEnv.c +++ b/source/client/src/clientEnv.c @@ -375,7 +375,7 @@ int32_t openTransporter(const char *user, const char *auth, int32_t numOfThread, *pDnodeConn = rpcOpen(&rpcInit); if (*pDnodeConn == NULL) { tscError("failed to init connection to server."); - code = TSDB_CODE_FAILED; + code = terrno; } return code; diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index 4aa78caa15..61579aee77 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -2467,6 +2467,7 @@ TSDB_SERVER_STATUS taos_check_server_status(const char* fqdn, int port, char* de clientRpc = rpcOpen(&rpcInit); if (clientRpc == NULL) { + code = terrno; tscError("failed to init server status client"); goto _OVER; } diff --git a/source/dnode/mgmt/node_mgmt/src/dmTransport.c b/source/dnode/mgmt/node_mgmt/src/dmTransport.c index 3d758e1fd3..30f1038a11 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmTransport.c +++ b/source/dnode/mgmt/node_mgmt/src/dmTransport.c @@ -393,7 +393,7 @@ int32_t dmInitClient(SDnode *pDnode) { pTrans->clientRpc = rpcOpen(&rpcInit); if (pTrans->clientRpc == NULL) { dError("failed to init dnode rpc client"); - return -1; + return terrno; } dDebug("dnode rpc client is initialized"); @@ -437,7 +437,7 @@ int32_t dmInitStatusClient(SDnode *pDnode) { pTrans->statusRpc = rpcOpen(&rpcInit); if (pTrans->statusRpc == NULL) { dError("failed to init dnode rpc status client"); - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } dDebug("dnode rpc status client is initialized"); @@ -482,7 +482,7 @@ int32_t dmInitSyncClient(SDnode *pDnode) { pTrans->syncRpc = rpcOpen(&rpcInit); if (pTrans->syncRpc == NULL) { dError("failed to init dnode rpc sync client"); - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } dDebug("dnode rpc sync client is initialized"); diff --git a/source/libs/function/src/udfd.c b/source/libs/function/src/udfd.c index 7339f115a3..f65ff79553 100644 --- a/source/libs/function/src/udfd.c +++ b/source/libs/function/src/udfd.c @@ -1173,7 +1173,7 @@ int32_t udfdOpenClientRpc() { global.clientRpc = rpcOpen(&rpcInit); if (global.clientRpc == NULL) { fnError("failed to init dnode rpc client"); - return -1; + return terrno; } return 0; } diff --git a/source/libs/sync/test/sync_test_lib/src/syncIO.c b/source/libs/sync/test/sync_test_lib/src/syncIO.c index 11894f7853..f5a32b98d9 100644 --- a/source/libs/sync/test/sync_test_lib/src/syncIO.c +++ b/source/libs/sync/test/sync_test_lib/src/syncIO.c @@ -193,7 +193,7 @@ static int32_t syncIOStartInternal(SSyncIO *io) { io->clientRpc = rpcOpen(&rpcInit); if (io->clientRpc == NULL) { sError("failed to initialize RPC"); - return -1; + return terrno; } } @@ -214,7 +214,7 @@ static int32_t syncIOStartInternal(SSyncIO *io) { void *pRpc = rpcOpen(&rpcInit); if (pRpc == NULL) { sError("failed to start RPC server"); - return -1; + return terrno; } } diff --git a/source/libs/transport/test/cliBench.c b/source/libs/transport/test/cliBench.c index 8a5276b814..ec08f1baf0 100644 --- a/source/libs/transport/test/cliBench.c +++ b/source/libs/transport/test/cliBench.c @@ -160,7 +160,7 @@ int main(int argc, char *argv[]) { void *pRpc = rpcOpen(&rpcInit); if (pRpc == NULL) { tError("failed to initialize RPC"); - return -1; + return terrno; } tInfo("client is initialized"); From 07cbdee93c6b7d79e9bb8accc976fa6724cadfff Mon Sep 17 00:00:00 2001 From: xsren <285808407@qq.com> Date: Wed, 7 Aug 2024 10:43:04 +0800 Subject: [PATCH 13/45] fix: mutex and return value --- source/util/src/tcompare.c | 58 ++++++++++---------------- source/util/test/regexTest.cpp | 75 +++++++++++++++++++++++++--------- 2 files changed, 77 insertions(+), 56 deletions(-) diff --git a/source/util/src/tcompare.c b/source/util/src/tcompare.c index f9bea3b947..6971b91ff1 100644 --- a/source/util/src/tcompare.c +++ b/source/util/src/tcompare.c @@ -1208,12 +1208,13 @@ typedef struct UsingRegex { regex_t pRegex; int32_t lastUsedTime; } UsingRegex; +typedef UsingRegex* HashRegexPtr; typedef struct RegexCache { SHashObj *regexHash; void *regexCacheTmr; void *timer; - TdThreadMutex mutex; + SRWLatch mutex; bool exit; } RegexCache; static RegexCache sRegexCache; @@ -1222,11 +1223,7 @@ static RegexCache sRegexCache; static void checkRegexCache(void* param, void* tmrId) { int32_t code = 0; - code = taosThreadMutexLock(&sRegexCache.mutex); - if (code != 0) { - uError("[regex cache] checkRegexCache, Failed to lock mutex"); - return; - } + taosRLockLatch(&sRegexCache.mutex); if(sRegexCache.exit) { goto _exit; } @@ -1247,10 +1244,7 @@ static void checkRegexCache(void* param, void* tmrId) { } } _exit: - code = taosThreadMutexUnlock(&sRegexCache.mutex); - if(code != 0) { - uError("[regex cache] checkRegexCache, Failed to unlock mutex"); - } + taosRUnLockLatch(&sRegexCache.mutex); } void regexCacheFree(void *ppUsingRegex) { @@ -1273,10 +1267,7 @@ int32_t InitRegexCache() { } sRegexCache.exit = false; - if (taosThreadMutexInit(&sRegexCache.mutex, NULL) != 0) { - uError("failed to init mutex"); - return -1; - } + taosInitRWLatch(&sRegexCache.mutex); sRegexCache.timer = taosTmrStart(checkRegexCache, REGEX_CACHE_CLEAR_TIME * 1000, NULL, sRegexCache.regexCacheTmr); if (sRegexCache.timer == NULL) { uError("failed to start regex cache timer"); @@ -1290,18 +1281,11 @@ void DestroyRegexCache(){ int32_t code = 0; uInfo("[regex cache] destory regex cache"); (void)taosTmrStopA(&sRegexCache.timer); - code = taosThreadMutexLock(&sRegexCache.mutex); - if (code != 0) { - uError("[regex cache] Failed to lock mutex"); - return; - } + taosWLockLatch(&sRegexCache.mutex); sRegexCache.exit = true; taosHashCleanup(sRegexCache.regexHash); taosTmrCleanUp(sRegexCache.regexCacheTmr); - code = taosThreadMutexUnlock(&sRegexCache.mutex); - if (code != 0) { - uError("[regex cache] Failed to unlock mutex"); - } + taosWUnLockLatch(&sRegexCache.mutex); } int32_t checkRegexPattern(const char *pPattern) { @@ -1322,17 +1306,17 @@ int32_t checkRegexPattern(const char *pPattern) { return TSDB_CODE_SUCCESS; } -UsingRegex **getRegComp(const char *pPattern) { - UsingRegex **ppUsingRegex = (UsingRegex **)taosHashAcquire(sRegexCache.regexHash, pPattern, strlen(pPattern)); +int32_t getRegComp(const char *pPattern, HashRegexPtr **regexRet) { + HashRegexPtr* ppUsingRegex = (HashRegexPtr*)taosHashAcquire(sRegexCache.regexHash, pPattern, strlen(pPattern)); if (ppUsingRegex != NULL) { (*ppUsingRegex)->lastUsedTime = taosGetTimestampSec(); - return ppUsingRegex; + *regexRet = ppUsingRegex; + return TSDB_CODE_SUCCESS; } UsingRegex *pUsingRegex = taosMemoryMalloc(sizeof(UsingRegex)); if (pUsingRegex == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; uError("Failed to Malloc when compile regex pattern %s.", pPattern); - return NULL; + return TSDB_CODE_OUT_OF_MEMORY; } int32_t cflags = REG_EXTENDED; int32_t ret = regcomp(&pUsingRegex->pRegex, pPattern, cflags); @@ -1341,8 +1325,7 @@ UsingRegex **getRegComp(const char *pPattern) { (void)regerror(ret, &pUsingRegex->pRegex, msgbuf, tListLen(msgbuf)); uError("Failed to compile regex pattern %s. reason %s", pPattern, msgbuf); taosMemoryFree(pUsingRegex); - terrno = TSDB_CODE_PAR_REGULAR_EXPRESSION_ERROR; - return NULL; + return TSDB_CODE_PAR_REGULAR_EXPRESSION_ERROR; } while (true) { @@ -1350,8 +1333,7 @@ UsingRegex **getRegComp(const char *pPattern) { if (code != 0 && code != TSDB_CODE_DUP_KEY) { regexCacheFree(&pUsingRegex); uError("Failed to put regex pattern %s into cache, exception internal error.", pPattern); - terrno = code; - return NULL; + return code; } else if (code == TSDB_CODE_DUP_KEY) { terrno = 0; } @@ -1367,7 +1349,8 @@ UsingRegex **getRegComp(const char *pPattern) { } } pUsingRegex->lastUsedTime = taosGetTimestampSec(); - return ppUsingRegex; + *regexRet = ppUsingRegex; + return TSDB_CODE_SUCCESS; } void releaseRegComp(UsingRegex **regex){ @@ -1397,14 +1380,15 @@ int32_t threadGetRegComp(regex_t **regex, const char *pPattern) { } } - UsingRegex **ppRegex = getRegComp(pPattern); - if (ppRegex == NULL) { - return 1; + HashRegexPtr *ppRegex = NULL; + int32_t code = getRegComp(pPattern, &ppRegex); + if (code != TSDB_CODE_SUCCESS) { + return code; } pOldPattern = taosStrdup(pPattern); if (NULL == pOldPattern) { uError("Failed to Malloc when compile regex pattern %s.", pPattern); - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } ppUsingRegex = ppRegex; pRegex = &((*ppUsingRegex)->pRegex); diff --git a/source/util/test/regexTest.cpp b/source/util/test/regexTest.cpp index 3cd8f5c88c..5fe3701700 100644 --- a/source/util/test/regexTest.cpp +++ b/source/util/test/regexTest.cpp @@ -12,7 +12,8 @@ extern "C" { typedef struct UsingRegex UsingRegex; - UsingRegex** getRegComp(const char *pPattern); + typedef struct HashRegexPtr HashRegexPtr; + int32_t getRegComp(const char *pPattern, HashRegexPtr **regexRet); int32_t threadGetRegComp(regex_t **regex, const char *pPattern); } @@ -66,8 +67,12 @@ TEST(testCase, regexCacheTest1) { auto start = std::chrono::high_resolution_clock::now(); uint64_t t0 = taosGetTimestampUs(); - for(int i = 0; i < times; i++) { - UsingRegex** rex = getRegComp(s1); + for (int i = 0; i < times; i++) { + HashRegexPtr* ret = NULL; + int32_t code = getRegComp(s1, &ret); + if (code != 0) { + FAIL() << "Failed to compile regex pattern " << s1; + } } uint64_t t1 = taosGetTimestampUs(); @@ -97,8 +102,12 @@ TEST(testCase, regexCacheTest2) { auto start = std::chrono::high_resolution_clock::now(); uint64_t t0 = taosGetTimestampUs(); - for(int i = 0; i < times; i++) { - UsingRegex** rex = getRegComp(s1); + for (int i = 0; i < times; i++) { + HashRegexPtr* ret = NULL; + int32_t code = getRegComp(s1, &ret); + if (code != 0) { + FAIL() << "Failed to compile regex pattern " << s1; + } } uint64_t t1 = taosGetTimestampUs(); @@ -129,9 +138,12 @@ TEST(testCase, regexCacheTest3) { auto start = std::chrono::high_resolution_clock::now(); uint64_t t0 = taosGetTimestampUs(); - for(int i = 0; i < times; i++) { - UsingRegex** rex = getRegComp(s1); - rex = getRegComp(s2); + for (int i = 0; i < times; i++) { + HashRegexPtr* ret = NULL; + int32_t code = getRegComp(s1, &ret); + if (code != 0) { + FAIL() << "Failed to compile regex pattern " << s1; + } } uint64_t t1 = taosGetTimestampUs(); @@ -167,10 +179,18 @@ TEST(testCase, regexCacheTest4) { uint64_t t0 = taosGetTimestampUs(); for (int i = 0; i < times; i++) { for (int j = 0; j < count; ++j) { - UsingRegex** rex = getRegComp(s1); + HashRegexPtr* ret = NULL; + int32_t code = getRegComp(s1, &ret); + if (code != 0) { + FAIL() << "Failed to compile regex pattern " << s1; + } } for (int j = 0; j < count; ++j) { - UsingRegex** rex = getRegComp(s2); + HashRegexPtr* ret = NULL; + int32_t code = getRegComp(s2, &ret); + if (code != 0) { + FAIL() << "Failed to compile regex pattern " << s2; + } } } uint64_t t1 = taosGetTimestampUs(); @@ -206,7 +226,8 @@ TEST(testCase, regexCacheTest4) { printf("'%s' and '%s' take place by turn(per %d count) regex(new) %d times:%" PRIu64 " us.\n", s1, s2, count, times, t3 - t2); } -/* It is not a good idea to test this case, because it will take a long time. +// It is not a good idea to test this case, because it will take a long time. +/* TEST(testCase, regexCacheTest5) { int times = 10000; int count = 10000; @@ -217,10 +238,18 @@ TEST(testCase, regexCacheTest5) { uint64_t t0 = taosGetTimestampUs(); for (int i = 0; i < times; i++) { for (int j = 0; j < count; ++j) { - UsingRegex** rex = getRegComp(s1); + HashRegexPtr* ret = NULL; + int32_t code = getRegComp(s1, &ret); + if (code != 0) { + FAIL() << "Failed to compile regex pattern " << s1; + } } for (int j = 0; j < count; ++j) { - UsingRegex** rex = getRegComp(s2); + HashRegexPtr* ret = NULL; + int32_t code = getRegComp(s2, &ret); + if (code != 0) { + FAIL() << "Failed to compile regex pattern " << s2; + } } } uint64_t t1 = taosGetTimestampUs(); @@ -257,19 +286,27 @@ TEST(testCase, regexCacheTest5) { } TEST(testCase, regexCacheTest6) { - int times = 10000; - int count = 1000; - char s1[] = "abc%*"; - char s2[] = "abc"; + int times = 10000; + int count = 1000; + char s1[] = "abc%*"; + char s2[] = "abc"; auto start = std::chrono::high_resolution_clock::now(); uint64_t t0 = taosGetTimestampUs(); for (int i = 0; i < times; i++) { for (int j = 0; j < count; ++j) { - UsingRegex** rex = getRegComp(s1); + HashRegexPtr* ret = NULL; + int32_t code = getRegComp(s1, &ret); + if (code != 0) { + FAIL() << "Failed to compile regex pattern " << s1; + } } for (int j = 0; j < count; ++j) { - UsingRegex** rex = getRegComp(s2); + HashRegexPtr* ret = NULL; + int32_t code = getRegComp(s2, &ret); + if (code != 0) { + FAIL() << "Failed to compile regex pattern " << s2; + } } } uint64_t t1 = taosGetTimestampUs(); From 3b71401e9698efb77199a1f0c52d34326cc410d3 Mon Sep 17 00:00:00 2001 From: 54liuyao <54liuyao> Date: Wed, 7 Aug 2024 15:09:21 +0800 Subject: [PATCH 14/45] fix issue --- source/libs/executor/src/tsort.c | 36 +++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/source/libs/executor/src/tsort.c b/source/libs/executor/src/tsort.c index 9e902140f4..7d13566e0f 100644 --- a/source/libs/executor/src/tsort.c +++ b/source/libs/executor/src/tsort.c @@ -152,8 +152,10 @@ static void destoryAllocatedTuple(void* t) { taosMemoryFree(t); } * @param colIndex the columnIndex, for setting null bitmap * @return the next offset to add field * */ -static inline size_t tupleAddField(char** t, uint32_t colNum, uint32_t offset, uint32_t colIdx, void* data, - size_t length, bool isNull, uint32_t tupleLen) { +static inline int32_t tupleAddField(char** t, uint32_t colNum, uint32_t offset, uint32_t colIdx, void* data, + size_t length, bool isNull, uint32_t tupleLen, uint32_t* pOffset) { + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; tupleSetOffset(*t, colIdx, offset); if (isNull) { @@ -161,16 +163,20 @@ static inline size_t tupleAddField(char** t, uint32_t colNum, uint32_t offset, u } else { if (offset + length > tupleLen + tupleGetDataStartOffset(colNum)) { void* px = taosMemoryRealloc(*t, offset + length); - if (px == NULL) { - return terrno; - } + QUERY_CHECK_NULL(px, code, lino, _end, terrno); *t = px; } tupleSetData(*t, offset, data, length); } - return offset + length; + (*pOffset) = offset + length; + +_end: + if (code != TSDB_CODE_SUCCESS) { + qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + } + return code; } static void* tupleGetField(char* t, uint32_t colIdx, uint32_t colNum) { @@ -200,6 +206,7 @@ typedef struct ReferencedTuple { } ReferencedTuple; static int32_t createAllocatedTuple(SSDataBlock* pBlock, size_t colNum, uint32_t tupleLen, size_t rowIdx, TupleDesc** pDesc) { + int32_t code = TSDB_CODE_SUCCESS; TupleDesc* t = taosMemoryCalloc(1, sizeof(TupleDesc)); if (t == NULL) { return terrno; @@ -216,15 +223,20 @@ static int32_t createAllocatedTuple(SSDataBlock* pBlock, size_t colNum, uint32_t for (size_t colIdx = 0; colIdx < colNum; ++colIdx) { SColumnInfoData* pCol = taosArrayGet(pBlock->pDataBlock, colIdx); if (pCol == NULL) { + qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(terrno)); return terrno; } if (colDataIsNull_s(pCol, rowIdx)) { - offset = tupleAddField((char**)&pTuple, colNum, offset, colIdx, 0, 0, true, tupleLen); + code = tupleAddField((char**)&pTuple, colNum, offset, colIdx, 0, 0, true, tupleLen, &offset); } else { colLen = colDataGetRowLength(pCol, rowIdx); - offset = - tupleAddField((char**)&pTuple, colNum, offset, colIdx, colDataGetData(pCol, rowIdx), colLen, false, tupleLen); + code = + tupleAddField((char**)&pTuple, colNum, offset, colIdx, colDataGetData(pCol, rowIdx), colLen, false, tupleLen, &offset); + } + if (code != TSDB_CODE_SUCCESS) { + qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); + return code; } } @@ -232,7 +244,7 @@ static int32_t createAllocatedTuple(SSDataBlock* pBlock, size_t colNum, uint32_t t->data = pTuple; *pDesc = t; - return 0; + return code; } int32_t tupleDescGetField(const TupleDesc* pDesc, int32_t colIdx, uint32_t colNum, void** pResult) { @@ -259,7 +271,7 @@ int32_t tupleDescGetField(const TupleDesc* pDesc, int32_t colIdx, uint32_t colNu void destroyTuple(void* t) { TupleDesc* pDesc = t; - if (pDesc->type == AllocatedTupleType) { + if (pDesc != NULL && pDesc->type == AllocatedTupleType) { destoryAllocatedTuple(pDesc->data); taosMemoryFree(pDesc); } @@ -2713,7 +2725,7 @@ static int32_t tsortOpenForPQSort(SSortHandle* pHandle) { pqNode.data = &refTuple; PriorityQueueNode* pPushedNode = taosBQPush(pHandle->pBoundedQueue, &pqNode); if (!pPushedNode) { - // do nothing if push failed + return terrno; } else { pPushedNode->data = NULL; int32_t code = createAllocatedTuple(pBlock, colNum, tupleLen, rowIdx, (TupleDesc**)&pPushedNode->data); From bec6dfe16b11c5ddfaf3065ecd732de2fa3070bc Mon Sep 17 00:00:00 2001 From: xsren <285808407@qq.com> Date: Wed, 7 Aug 2024 16:51:39 +0800 Subject: [PATCH 15/45] return value --- source/libs/command/src/command.c | 6 +- source/libs/command/src/explain.c | 6 +- source/libs/function/src/tudf.c | 27 +++++---- source/libs/function/src/udfd.c | 94 +++++++++++++++++++++++++------ source/libs/qcom/src/querymsg.c | 8 +-- source/util/src/tcompare.c | 27 ++++----- 6 files changed, 112 insertions(+), 56 deletions(-) diff --git a/source/libs/command/src/command.c b/source/libs/command/src/command.c index 2811402ea1..11ddc89d4c 100644 --- a/source/libs/command/src/command.c +++ b/source/libs/command/src/command.c @@ -38,7 +38,7 @@ static int32_t buildRetrieveTableRsp(SSDataBlock* pBlock, int32_t numOfCols, SRe size_t rspSize = sizeof(SRetrieveTableRsp) + blockGetEncodeSize(pBlock) + PAYLOAD_PREFIX_LEN; *pRsp = taosMemoryCalloc(1, rspSize); if (NULL == *pRsp) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } (*pRsp)->useconds = 0; @@ -289,7 +289,7 @@ static int32_t buildRetension(SArray* pRetension, char **ppRetentions ) { char* p1 = taosMemoryCalloc(1, 100); if(NULL == p1) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } int32_t len = 0; @@ -849,7 +849,7 @@ _return: static int32_t buildLocalVariablesResultDataBlock(SSDataBlock** pOutput) { SSDataBlock* pBlock = taosMemoryCalloc(1, sizeof(SSDataBlock)); if (NULL == pBlock) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } pBlock->info.hasVarCol = true; diff --git a/source/libs/command/src/explain.c b/source/libs/command/src/explain.c index 8d9f1fb9cc..2bfed58dc8 100644 --- a/source/libs/command/src/explain.c +++ b/source/libs/command/src/explain.c @@ -123,7 +123,7 @@ int32_t qExplainInitCtx(SExplainCtx **pCtx, SHashObj *groupHash, bool verbose, d SExplainCtx *ctx = taosMemoryCalloc(1, sizeof(SExplainCtx)); if (NULL == ctx) { qError("calloc SExplainCtx failed"); - QRY_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY); + goto _return; } SArray *rows = taosArrayInit(10, sizeof(SQueryExplainRowInfo)); @@ -227,7 +227,7 @@ int32_t qExplainGenerateResNode(SPhysiNode *pNode, SExplainGroup *group, SExplai SExplainResNode *resNode = taosMemoryCalloc(1, sizeof(SExplainResNode)); if (NULL == resNode) { qError("calloc SPhysiNodeExplainRes failed"); - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } int32_t code = 0; @@ -1971,7 +1971,7 @@ int32_t qExplainGetRspFromCtx(void *ctx, SRetrieveTableRsp **pRsp) { SRetrieveTableRsp *rsp = (SRetrieveTableRsp *)taosMemoryCalloc(1, rspSize); if (NULL == rsp) { qError("malloc SRetrieveTableRsp failed, size:%d", rspSize); - QRY_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY); + goto _return; } rsp->completed = 1; diff --git a/source/libs/function/src/tudf.c b/source/libs/function/src/tudf.c index ad9e5ce7d4..9a751db801 100644 --- a/source/libs/function/src/tudf.c +++ b/source/libs/function/src/tudf.c @@ -162,7 +162,7 @@ static int32_t udfSpawnUdfd(SUdfdData *pData) { fnInfo("[UDFD]Succsess to set TAOS_FQDN:%s", taosFqdn); } else { fnError("[UDFD]Failed to allocate memory for TAOS_FQDN"); - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } } @@ -837,10 +837,13 @@ int32_t convertDataBlockToUdfDataBlock(SSDataBlock *block, SUdfDataBlock *udfBlo udfBlock->numOfRows = block->info.rows; udfBlock->numOfCols = taosArrayGetSize(block->pDataBlock); udfBlock->udfCols = taosMemoryCalloc(taosArrayGetSize(block->pDataBlock), sizeof(SUdfColumn *)); + if((udfBlock->udfCols) == NULL) { + return terrno; + } for (int32_t i = 0; i < udfBlock->numOfCols; ++i) { udfBlock->udfCols[i] = taosMemoryCalloc(1, sizeof(SUdfColumn)); if(udfBlock->udfCols[i] == NULL) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } SColumnInfoData *col = (SColumnInfoData *)taosArrayGet(block->pDataBlock, i); SUdfColumn *udfCol = udfBlock->udfCols[i]; @@ -854,13 +857,13 @@ int32_t convertDataBlockToUdfDataBlock(SSDataBlock *block, SUdfDataBlock *udfBlo udfCol->colData.varLenCol.varOffsetsLen = sizeof(int32_t) * udfBlock->numOfRows; udfCol->colData.varLenCol.varOffsets = taosMemoryMalloc(udfCol->colData.varLenCol.varOffsetsLen); if(udfCol->colData.varLenCol.varOffsets == NULL) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } memcpy(udfCol->colData.varLenCol.varOffsets, col->varmeta.offset, udfCol->colData.varLenCol.varOffsetsLen); udfCol->colData.varLenCol.payloadLen = colDataGetLength(col, udfBlock->numOfRows); udfCol->colData.varLenCol.payload = taosMemoryMalloc(udfCol->colData.varLenCol.payloadLen); if(udfCol->colData.varLenCol.payload == NULL) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } if (col->reassigned) { for (int32_t row = 0; row < udfCol->colData.numOfRows; ++row) { @@ -882,7 +885,7 @@ int32_t convertDataBlockToUdfDataBlock(SSDataBlock *block, SUdfDataBlock *udfBlo int32_t bitmapLen = udfCol->colData.fixLenCol.nullBitmapLen; udfCol->colData.fixLenCol.nullBitmap = taosMemoryMalloc(udfCol->colData.fixLenCol.nullBitmapLen); if(udfCol->colData.fixLenCol.nullBitmap == NULL) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } char *bitmap = udfCol->colData.fixLenCol.nullBitmap; memcpy(bitmap, col->nullbitmap, bitmapLen); @@ -985,7 +988,7 @@ int32_t convertDataBlockToScalarParm(SSDataBlock *input, SScalarParam *output) { output->columnData = taosMemoryMalloc(sizeof(SColumnInfoData)); if(output->columnData == NULL) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } memcpy(output->columnData, taosArrayGet(input->pDataBlock, 0), sizeof(SColumnInfoData)); output->colAlloced = true; @@ -1724,7 +1727,7 @@ int32_t udfcStartUvTask(SClientUvTaskNode *uvTask) { if(conn == NULL) { fnError("udfc event loop start connect task malloc conn failed."); taosMemoryFree(pipe); - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } conn->pipe = pipe; conn->readBuf.len = 0; @@ -1954,7 +1957,7 @@ int32_t udfcRunUdfUvTask(SClientUdfTask *task, int8_t uvTaskType) { SClientUvTaskNode *uvTask = taosMemoryCalloc(1, sizeof(SClientUvTaskNode)); if(uvTask == NULL) { fnError("udfc client task: %p failed to allocate memory for uvTask", task); - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } fnDebug("udfc client task: %p created uvTask: %p. pipe: %p", task, uvTask, task->session->udfUvPipe); @@ -1986,13 +1989,13 @@ int32_t doSetupUdf(char udfName[], UdfcFuncHandle *funcHandle) { SClientUdfTask *task = taosMemoryCalloc(1, sizeof(SClientUdfTask)); if(task == NULL) { fnError("doSetupUdf, failed to allocate memory for task"); - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } task->session = taosMemoryCalloc(1, sizeof(SUdfcUvSession)); if(task->session == NULL) { fnError("doSetupUdf, failed to allocate memory for session"); taosMemoryFree(task); - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } task->session->udfc = &gUdfcProxy; task->type = UDF_TASK_SETUP; @@ -2037,7 +2040,7 @@ int32_t callUdf(UdfcFuncHandle handle, int8_t callType, SSDataBlock *input, SUdf SClientUdfTask *task = taosMemoryCalloc(1, sizeof(SClientUdfTask)); if(task == NULL) { fnError("udfc call udf. failed to allocate memory for task"); - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } task->session = (SUdfcUvSession *)handle; task->type = UDF_TASK_CALL; @@ -2169,7 +2172,7 @@ int32_t doTeardownUdf(UdfcFuncHandle handle) { if(task == NULL) { fnError("doTeardownUdf, failed to allocate memory for task"); taosMemoryFree(session); - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } task->session = session; task->type = UDF_TASK_TEARDOWN; diff --git a/source/libs/function/src/udfd.c b/source/libs/function/src/udfd.c index 7339f115a3..25adfd11d8 100644 --- a/source/libs/function/src/udfd.c +++ b/source/libs/function/src/udfd.c @@ -409,6 +409,10 @@ int32_t udfdInitializePythonPlugin(SUdfScriptPlugin *plugin) { int16_t lenPythonPath = strlen(tsUdfdLdLibPath) + strlen(global.udfDataDir) + 1 + 1; // global.udfDataDir:tsUdfdLdLibPath char *pythonPath = taosMemoryMalloc(lenPythonPath); + if(pythonPath == NULL) { + uv_dlclose(&plugin->lib); + return terrno; + } #ifdef WINDOWS snprintf(pythonPath, lenPythonPath, "%s;%s", global.udfDataDir, tsUdfdLdLibPath); #else @@ -705,6 +709,10 @@ void udfdProcessSetupRequest(SUvUdfWork *uvUdf, SUdfRequest *request) { uv_mutex_unlock(&udf->lock); } SUdfcFuncHandle *handle = taosMemoryMalloc(sizeof(SUdfcFuncHandle)); + if(handle == NULL) { + fnError("udfdProcessSetupRequest: malloc failed."); + code = terrno; + } handle->udf = udf; _send: @@ -775,7 +783,7 @@ void udfdProcessCallRequest(SUvUdfWork *uvUdf, SUdfRequest *request) { if (outBuf.buf != NULL) { code = udf->scriptPlugin->udfAggStartFunc(&outBuf, udf->scriptUdfCtx); } else { - code = TSDB_CODE_OUT_OF_MEMORY; + code = terrno; } subRsp->resultBuf = outBuf; break; @@ -784,9 +792,13 @@ void udfdProcessCallRequest(SUvUdfWork *uvUdf, SUdfRequest *request) { SUdfDataBlock input = {0}; if (convertDataBlockToUdfDataBlock(&call->block, &input) == TSDB_CODE_SUCCESS) { SUdfInterBuf outBuf = {.buf = taosMemoryMalloc(udf->bufSize), .bufLen = udf->bufSize, .numOfResult = 0}; - code = udf->scriptPlugin->udfAggProcFunc(&input, &call->interBuf, &outBuf, udf->scriptUdfCtx); - freeUdfInterBuf(&call->interBuf); - subRsp->resultBuf = outBuf; + if (outBuf.buf != NULL) { + code = udf->scriptPlugin->udfAggProcFunc(&input, &call->interBuf, &outBuf, udf->scriptUdfCtx); + freeUdfInterBuf(&call->interBuf); + subRsp->resultBuf = outBuf; + } else { + code = terrno; + } } freeUdfDataDataBlock(&input); @@ -794,18 +806,27 @@ void udfdProcessCallRequest(SUvUdfWork *uvUdf, SUdfRequest *request) { } case TSDB_UDF_CALL_AGG_MERGE: { SUdfInterBuf outBuf = {.buf = taosMemoryMalloc(udf->bufSize), .bufLen = udf->bufSize, .numOfResult = 0}; - code = udf->scriptPlugin->udfAggMergeFunc(&call->interBuf, &call->interBuf2, &outBuf, udf->scriptUdfCtx); - freeUdfInterBuf(&call->interBuf); - freeUdfInterBuf(&call->interBuf2); - subRsp->resultBuf = outBuf; + if (outBuf.buf != NULL) { + code = udf->scriptPlugin->udfAggMergeFunc(&call->interBuf, &call->interBuf2, &outBuf, udf->scriptUdfCtx); + freeUdfInterBuf(&call->interBuf); + freeUdfInterBuf(&call->interBuf2); + subRsp->resultBuf = outBuf; + } else { + code = terrno; + } break; } case TSDB_UDF_CALL_AGG_FIN: { SUdfInterBuf outBuf = {.buf = taosMemoryMalloc(udf->bufSize), .bufLen = udf->bufSize, .numOfResult = 0}; - code = udf->scriptPlugin->udfAggFinishFunc(&call->interBuf, &outBuf, udf->scriptUdfCtx); - freeUdfInterBuf(&call->interBuf); - subRsp->resultBuf = outBuf; + if (outBuf.buf != NULL) { + code = udf->scriptPlugin->udfAggFinishFunc(&call->interBuf, &outBuf, udf->scriptUdfCtx); + freeUdfInterBuf(&call->interBuf); + subRsp->resultBuf = outBuf; + } else { + code = terrno; + } + break; } default: @@ -820,19 +841,24 @@ void udfdProcessCallRequest(SUvUdfWork *uvUdf, SUdfRequest *request) { int32_t len = encodeUdfResponse(NULL, rsp); if(len < 0) { fnError("udfdProcessCallRequest: encode udf response failed. len %d", len); - return; + goto _exit; } rsp->msgLen = len; void *bufBegin = taosMemoryMalloc(len); + if (bufBegin == NULL) { + fnError("udfdProcessCallRequest: malloc failed. len %d", len); + goto _exit; + } void *buf = bufBegin; if(encodeUdfResponse(&buf, rsp) < 0) { fnError("udfdProcessCallRequest: encode udf response failed. len %d", len); taosMemoryFree(bufBegin); - return; + goto _exit; } uvUdf->output = uv_buf_init(bufBegin, len); +_exit: switch (call->callType) { case TSDB_UDF_CALL_SCALA_PROC: { blockDataFreeRes(&call->block); @@ -906,6 +932,10 @@ _send: } rsp->msgLen = len; void *bufBegin = taosMemoryMalloc(len); + if(bufBegin == NULL) { + fnError("udfdProcessTeardownRequest: malloc failed. len %d", len); + return; + } void *buf = bufBegin; if (encodeUdfResponse(&buf, rsp) < 0) { fnError("udfdProcessTeardownRequest: encode udf response failed. len %d", len); @@ -1210,6 +1240,11 @@ void udfdSendResponse(uv_work_t *work, int status) { if (udfWork->conn != NULL) { uv_write_t *write_req = taosMemoryMalloc(sizeof(uv_write_t)); + if(write_req == NULL) { + fnError("udfd send response error, malloc failed"); + taosMemoryFree(work); + return; + } write_req->data = udfWork; int32_t code = uv_write(write_req, udfWork->conn->client, &udfWork->output, 1, udfdOnWrite); if (code != 0) { @@ -1269,7 +1304,16 @@ void udfdHandleRequest(SUdfdUvConn *conn) { int32_t inputLen = conn->inputLen; uv_work_t *work = taosMemoryMalloc(sizeof(uv_work_t)); + if(work == NULL) { + fnError("udfd malloc work failed"); + return; + } SUvUdfWork *udfWork = taosMemoryMalloc(sizeof(SUvUdfWork)); + if(udfWork == NULL) { + fnError("udfd malloc udf work failed"); + taosMemoryFree(work); + return; + } udfWork->conn = conn; udfWork->pWorkNext = conn->pWorkList; conn->pWorkList = udfWork; @@ -1334,6 +1378,10 @@ void udfdOnNewConnection(uv_stream_t *server, int status) { int32_t code = 0; uv_pipe_t *client = (uv_pipe_t *)taosMemoryMalloc(sizeof(uv_pipe_t)); + if(client == NULL) { + fnError("udfd pipe malloc failed"); + return; + } code = uv_pipe_init(global.loop, client, 0); if (code) { fnError("udfd pipe init error %s", uv_strerror(code)); @@ -1342,6 +1390,10 @@ void udfdOnNewConnection(uv_stream_t *server, int status) { } if (uv_accept(server, (uv_stream_t *)client) == 0) { SUdfdUvConn *ctx = taosMemoryMalloc(sizeof(SUdfdUvConn)); + if(ctx == NULL) { + fnError("udfd conn malloc failed"); + goto _exit; + } ctx->pWorkList = NULL; ctx->client = (uv_stream_t *)client; ctx->inputBuf = 0; @@ -1356,9 +1408,11 @@ void udfdOnNewConnection(uv_stream_t *server, int status) { taosMemoryFree(ctx); taosMemoryFree(client); } - } else { - uv_close((uv_handle_t *)client, NULL); + return; } +_exit: + uv_close((uv_handle_t *)client, NULL); + taosMemoryFree(client); } void udfdIntrSignalHandler(uv_signal_t *handle, int signum) { @@ -1411,6 +1465,10 @@ static int32_t udfdInitLog() { void udfdCtrlAllocBufCb(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf) { buf->base = taosMemoryMalloc(suggested_size); + if (buf->base == NULL) { + fnError("udfd ctrl pipe alloc buffer failed"); + return; + } buf->len = suggested_size; } @@ -1477,13 +1535,13 @@ static int32_t udfdGlobalDataInit() { uv_loop_t *loop = taosMemoryMalloc(sizeof(uv_loop_t)); if (loop == NULL) { fnError("udfd init uv loop failed, mem overflow"); - return -1; + return terrno; } global.loop = loop; if (uv_mutex_init(&global.scriptPluginsMutex) != 0) { fnError("udfd init script plugins mutex failed"); - return -1; + return TSDB_CODE_UDF_UV_EXEC_FAILURE; } global.udfsHash = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK); @@ -1494,7 +1552,7 @@ static int32_t udfdGlobalDataInit() { if (uv_mutex_init(&global.udfsMutex) != 0) { fnError("udfd init udfs mutex failed"); - return -2; + return TSDB_CODE_UDF_UV_EXEC_FAILURE; } return 0; diff --git a/source/libs/qcom/src/querymsg.c b/source/libs/qcom/src/querymsg.c index e8deed1df9..207bd91bd9 100644 --- a/source/libs/qcom/src/querymsg.c +++ b/source/libs/qcom/src/querymsg.c @@ -34,7 +34,7 @@ int32_t queryBuildUseDbOutput(SUseDbOutput *pOut, SUseDbRsp *usedbRsp) { pOut->dbVgroup = taosMemoryCalloc(1, sizeof(SDBVgInfo)); if (NULL == pOut->dbVgroup) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } pOut->dbVgroup->vgVersion = usedbRsp->vgVersion; @@ -509,7 +509,7 @@ int32_t queryCreateTableMetaFromMsg(STableMetaRsp *msg, bool isStb, STableMeta * STableMeta *pTableMeta = taosMemoryCalloc(1, metaSize + schemaExtSize); if (NULL == pTableMeta) { qError("calloc size[%d] failed", metaSize); - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } SSchemaExt *pSchemaExt = (SSchemaExt *)((char *)pTableMeta + metaSize); @@ -764,7 +764,7 @@ int32_t queryProcessGetTbCfgRsp(void *output, char *msg, int32_t msgSize) { STableCfgRsp *out = taosMemoryCalloc(1, sizeof(STableCfgRsp)); if(out == NULL) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } if (tDeserializeSTableCfgRsp(msg, msgSize, out) != 0) { qError("tDeserializeSTableCfgRsp failed, msgSize:%d", msgSize); @@ -785,7 +785,7 @@ int32_t queryProcessGetViewMetaRsp(void *output, char *msg, int32_t msgSize) { SViewMetaRsp *out = taosMemoryCalloc(1, sizeof(SViewMetaRsp)); if (out == NULL) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } if (tDeserializeSViewMetaRsp(msg, msgSize, out) != 0) { qError("tDeserializeSViewMetaRsp failed, msgSize:%d", msgSize); diff --git a/source/util/src/tcompare.c b/source/util/src/tcompare.c index 6971b91ff1..670a70a309 100644 --- a/source/util/src/tcompare.c +++ b/source/util/src/tcompare.c @@ -1256,14 +1256,13 @@ int32_t InitRegexCache() { sRegexCache.regexHash = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_ENTRY_LOCK); if (sRegexCache.regexHash == NULL) { uError("failed to create RegexCache"); - return -1; + return terrno; } taosHashSetFreeFp(sRegexCache.regexHash, regexCacheFree); sRegexCache.regexCacheTmr = taosTmrInit(0, 0, 0, "REGEXCACHE"); if (sRegexCache.regexCacheTmr == NULL) { uError("failed to create regex cache check timer"); - terrno = TSDB_CODE_OUT_OF_MEMORY; - return -1; + return terrno; } sRegexCache.exit = false; @@ -1271,10 +1270,10 @@ int32_t InitRegexCache() { sRegexCache.timer = taosTmrStart(checkRegexCache, REGEX_CACHE_CLEAR_TIME * 1000, NULL, sRegexCache.regexCacheTmr); if (sRegexCache.timer == NULL) { uError("failed to start regex cache timer"); - return -1; + return terrno; } - return 0; + return TSDB_CODE_SUCCESS; } void DestroyRegexCache(){ @@ -1316,7 +1315,7 @@ int32_t getRegComp(const char *pPattern, HashRegexPtr **regexRet) { UsingRegex *pUsingRegex = taosMemoryMalloc(sizeof(UsingRegex)); if (pUsingRegex == NULL) { uError("Failed to Malloc when compile regex pattern %s.", pPattern); - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } int32_t cflags = REG_EXTENDED; int32_t ret = regcomp(&pUsingRegex->pRegex, pPattern, cflags); @@ -1421,8 +1420,7 @@ int32_t comparestrRegexMatch(const void *pLeft, const void *pRight) { size_t sz = varDataLen(pRight); char *pattern = taosMemoryMalloc(sz + 1); if (NULL == pattern) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return 1; + return 1; // terrno has been set } (void)memcpy(pattern, varDataVal(pRight), varDataLen(pRight)); @@ -1432,8 +1430,7 @@ int32_t comparestrRegexMatch(const void *pLeft, const void *pRight) { char *str = taosMemoryMalloc(sz + 1); if (NULL == str) { taosMemoryFree(pattern); - terrno = TSDB_CODE_OUT_OF_MEMORY; - return 1; + return 1; // terrno has been set } (void)memcpy(str, varDataVal(pLeft), sz); @@ -1451,14 +1448,13 @@ int32_t comparewcsRegexMatch(const void *pString, const void *pPattern) { size_t len = varDataLen(pPattern); char *pattern = taosMemoryMalloc(len + 1); if (NULL == pattern) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return 1; + return 1; // terrno has been set } int convertLen = taosUcs4ToMbs((TdUcs4 *)varDataVal(pPattern), len, pattern); if (convertLen < 0) { taosMemoryFree(pattern); - return (terrno = TSDB_CODE_APP_ERROR); + return 1; // terrno has been set } pattern[convertLen] = 0; @@ -1467,15 +1463,14 @@ int32_t comparewcsRegexMatch(const void *pString, const void *pPattern) { char *str = taosMemoryMalloc(len + 1); if (NULL == str) { taosMemoryFree(pattern); - terrno = TSDB_CODE_OUT_OF_MEMORY; - return 1; + return 1; // terrno has been set } convertLen = taosUcs4ToMbs((TdUcs4 *)varDataVal(pString), len, str); if (convertLen < 0) { taosMemoryFree(str); taosMemoryFree(pattern); - return (terrno = TSDB_CODE_APP_ERROR); + return 1; // terrno has been set } str[convertLen] = 0; From 8ab78009a9e0621ee1aa11001c2216b3a9f03b43 Mon Sep 17 00:00:00 2001 From: 54liuyao <54liuyao> Date: Wed, 7 Aug 2024 16:59:19 +0800 Subject: [PATCH 16/45] fix issue --- source/libs/executor/src/aggregateoperator.c | 3 ++- source/libs/executor/src/countwindowoperator.c | 3 ++- source/libs/executor/src/eventwindowoperator.c | 2 +- source/libs/executor/src/exchangeoperator.c | 4 +++- source/libs/executor/src/executil.c | 6 +++--- source/libs/executor/src/scanoperator.c | 3 ++- source/libs/executor/src/streamtimewindowoperator.c | 3 ++- source/libs/executor/src/tsort.c | 2 ++ 8 files changed, 17 insertions(+), 9 deletions(-) diff --git a/source/libs/executor/src/aggregateoperator.c b/source/libs/executor/src/aggregateoperator.c index af10bf8e49..3f67ac0395 100644 --- a/source/libs/executor/src/aggregateoperator.c +++ b/source/libs/executor/src/aggregateoperator.c @@ -340,6 +340,7 @@ int32_t doAggregateImpl(SOperatorInfo* pOperator, SqlFunctionCtx* pCtx) { static int32_t createDataBlockForEmptyInput(SOperatorInfo* pOperator, SSDataBlock** ppBlock) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; + SSDataBlock* pBlock = NULL; if (!tsCountAlwaysReturnValue) { return TSDB_CODE_SUCCESS; } @@ -363,7 +364,6 @@ static int32_t createDataBlockForEmptyInput(SOperatorInfo* pOperator, SSDataBloc return TSDB_CODE_SUCCESS; } - SSDataBlock* pBlock = NULL; code = createDataBlock(&pBlock); if (code) { return code; @@ -411,6 +411,7 @@ static int32_t createDataBlockForEmptyInput(SOperatorInfo* pOperator, SSDataBloc _end: if (code != TSDB_CODE_SUCCESS) { + blockDataDestroy(pBlock); qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); } return code; diff --git a/source/libs/executor/src/countwindowoperator.c b/source/libs/executor/src/countwindowoperator.c index 63c0c5fe87..1dcb141c62 100644 --- a/source/libs/executor/src/countwindowoperator.c +++ b/source/libs/executor/src/countwindowoperator.c @@ -294,10 +294,11 @@ int32_t createCountwindowOperatorInfo(SOperatorInfo* downstream, SPhysiNode* phy SSDataBlock* pResBlock = createDataBlockFromDescNode(pCountWindowNode->window.node.pOutputDataBlockDesc); QUERY_CHECK_NULL(pResBlock, code, lino, _error, terrno); + initBasicInfo(&pInfo->binfo, pResBlock); + code = blockDataEnsureCapacity(pResBlock, pOperator->resultInfo.capacity); QUERY_CHECK_CODE(code, lino, _error); - initBasicInfo(&pInfo->binfo, pResBlock); initResultRowInfo(&pInfo->binfo.resultRowInfo); pInfo->binfo.inputTsOrder = physiNode->inputTsOrder; pInfo->binfo.outputTsOrder = physiNode->outputTsOrder; diff --git a/source/libs/executor/src/eventwindowoperator.c b/source/libs/executor/src/eventwindowoperator.c index f9ae8be84f..acee61b44d 100644 --- a/source/libs/executor/src/eventwindowoperator.c +++ b/source/libs/executor/src/eventwindowoperator.c @@ -110,11 +110,11 @@ int32_t createEventwindowOperatorInfo(SOperatorInfo* downstream, SPhysiNode* phy SSDataBlock* pResBlock = createDataBlockFromDescNode(pEventWindowNode->window.node.pOutputDataBlockDesc); QUERY_CHECK_NULL(pResBlock, code, lino, _error, terrno); + initBasicInfo(&pInfo->binfo, pResBlock); code = blockDataEnsureCapacity(pResBlock, pOperator->resultInfo.capacity); QUERY_CHECK_CODE(code, lino, _error); - initBasicInfo(&pInfo->binfo, pResBlock); initResultRowInfo(&pInfo->binfo.resultRowInfo); pInfo->binfo.inputTsOrder = physiNode->inputTsOrder; pInfo->binfo.outputTsOrder = physiNode->outputTsOrder; diff --git a/source/libs/executor/src/exchangeoperator.c b/source/libs/executor/src/exchangeoperator.c index 21b1c2838b..8f87a955ba 100644 --- a/source/libs/executor/src/exchangeoperator.c +++ b/source/libs/executor/src/exchangeoperator.c @@ -688,6 +688,7 @@ void updateLoadRemoteInfo(SLoadRemoteDataInfo* pInfo, int64_t numOfRows, int32_t int32_t extractDataBlockFromFetchRsp(SSDataBlock* pRes, char* pData, SArray* pColList, char** pNextStart) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; + SSDataBlock* pBlock = NULL; if (pColList == NULL) { // data from other sources blockDataCleanup(pRes); code = blockDecode(pRes, pData, (const char**) pNextStart); @@ -710,7 +711,7 @@ int32_t extractDataBlockFromFetchRsp(SSDataBlock* pRes, char* pData, SArray* pCo pStart += sizeof(SSysTableSchema); } - SSDataBlock* pBlock = NULL; + pBlock = NULL; code = createDataBlock(&pBlock); QUERY_CHECK_CODE(code, lino, _end); @@ -739,6 +740,7 @@ int32_t extractDataBlockFromFetchRsp(SSDataBlock* pRes, char* pData, SArray* pCo _end: if (code != TSDB_CODE_SUCCESS) { + blockDataDestroy(pBlock); qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); } return code; diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c index c2297d9fba..127e0f18f1 100644 --- a/source/libs/executor/src/executil.c +++ b/source/libs/executor/src/executil.c @@ -278,7 +278,7 @@ SSDataBlock* createDataBlockFromDescNode(SDataBlockDescNode* pNode) { qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); blockDataDestroy(pBlock); pBlock = NULL; - terrno = code; + terrno = TSDB_CODE_INVALID_PARA; break; } SColumnInfoData idata = @@ -1094,7 +1094,7 @@ SSDataBlock* createTagValBlockForFilter(SArray* pColList, int32_t numOfTables, S code = blockDataEnsureCapacity(pResBlock, numOfTables); if (code != TSDB_CODE_SUCCESS) { terrno = code; - taosMemoryFree(pResBlock); + blockDataDestroy(pResBlock); return NULL; } @@ -1166,7 +1166,7 @@ SSDataBlock* createTagValBlockForFilter(SArray* pColList, int32_t numOfTables, S _end: if (code != TSDB_CODE_SUCCESS) { - taosMemoryFree(pResBlock); + blockDataDestroy(pResBlock); qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); terrno = code; return NULL; diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index da0df786fb..7d88cc3948 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -4279,11 +4279,12 @@ static int32_t tagScanFilterByTagCond(SArray* aUidTags, SNode* pTagCond, SArray* int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; int32_t numOfTables = taosArrayGetSize(aUidTags); + SArray* pBlockList = NULL; SSDataBlock* pResBlock = createTagValBlockForFilter(pInfo->filterCtx.cInfoList, numOfTables, aUidTags, pVnode, pAPI); QUERY_CHECK_NULL(pResBlock, code, lino, _end, terrno); - SArray* pBlockList = taosArrayInit(1, POINTER_BYTES); + pBlockList = taosArrayInit(1, POINTER_BYTES); QUERY_CHECK_NULL(pBlockList, code, lino, _end, terrno); void* tmp = taosArrayPush(pBlockList, &pResBlock); diff --git a/source/libs/executor/src/streamtimewindowoperator.c b/source/libs/executor/src/streamtimewindowoperator.c index 08b644b6ec..d719bbf9af 100644 --- a/source/libs/executor/src/streamtimewindowoperator.c +++ b/source/libs/executor/src/streamtimewindowoperator.c @@ -5191,6 +5191,8 @@ int32_t createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SPhysiNode* SSDataBlock* pResBlock = createDataBlockFromDescNode(pPhyNode->pOutputDataBlockDesc); QUERY_CHECK_NULL(pResBlock, code, lino, _error, terrno); + initBasicInfo(&pInfo->binfo, pResBlock); + pInfo->interval = (SInterval){ .interval = pIntervalPhyNode->interval, .sliding = pIntervalPhyNode->sliding, @@ -5218,7 +5220,6 @@ int32_t createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SPhysiNode* SExprSupp* pSup = &pOperator->exprSupp; pSup->hasWindowOrGroup = true; - initBasicInfo(&pInfo->binfo, pResBlock); code = initExecTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &pTaskInfo->window); QUERY_CHECK_CODE(code, lino, _error); diff --git a/source/libs/executor/src/tsort.c b/source/libs/executor/src/tsort.c index 7d13566e0f..c39979d8a9 100644 --- a/source/libs/executor/src/tsort.c +++ b/source/libs/executor/src/tsort.c @@ -1698,6 +1698,7 @@ static int32_t initRowIdSort(SSortHandle* pHandle) { biTs.compFn = getKeyComparFunc(TSDB_DATA_TYPE_TIMESTAMP, biTs.order); void* p = taosArrayPush(pOrderInfoList, &biTs); if (p == NULL) { + taosArrayDestroy(pOrderInfoList); return terrno; } @@ -1710,6 +1711,7 @@ static int32_t initRowIdSort(SSortHandle* pHandle) { void* px = taosArrayPush(pOrderInfoList, &biPk); if (px == NULL) { + taosArrayDestroy(pOrderInfoList); return terrno; } } From 531dfbb135cfce103b40179a0eb4a8af62f82d59 Mon Sep 17 00:00:00 2001 From: 54liuyao <54liuyao> Date: Wed, 7 Aug 2024 17:08:50 +0800 Subject: [PATCH 17/45] fix issue --- source/libs/executor/src/tsort.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libs/executor/src/tsort.c b/source/libs/executor/src/tsort.c index c39979d8a9..bc9cc920a4 100644 --- a/source/libs/executor/src/tsort.c +++ b/source/libs/executor/src/tsort.c @@ -2727,7 +2727,7 @@ static int32_t tsortOpenForPQSort(SSortHandle* pHandle) { pqNode.data = &refTuple; PriorityQueueNode* pPushedNode = taosBQPush(pHandle->pBoundedQueue, &pqNode); if (!pPushedNode) { - return terrno; + if (terrno != TSDB_CODE_SUCCESS) return terrno; } else { pPushedNode->data = NULL; int32_t code = createAllocatedTuple(pBlock, colNum, tupleLen, rowIdx, (TupleDesc**)&pPushedNode->data); From ad523425b7f7e0530cf8edddda6b29ab13319314 Mon Sep 17 00:00:00 2001 From: sima Date: Wed, 7 Aug 2024 08:06:51 +0800 Subject: [PATCH 18/45] fix:[TD-31279] free memory when error occurred. --- source/libs/scalar/src/filter.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/source/libs/scalar/src/filter.c b/source/libs/scalar/src/filter.c index 5226668f82..1a056ccc54 100644 --- a/source/libs/scalar/src/filter.c +++ b/source/libs/scalar/src/filter.c @@ -3660,15 +3660,25 @@ int32_t fltInitFromNode(SNode *tree, SFilterInfo *info, uint32_t options) { FLT_ERR_JRET(terrno); } - FLT_ERR_JRET(filterInitUnitsFields(info)); + code = filterInitUnitsFields(info); + if(TSDB_CODE_SUCCESS != code) { + taosArrayDestroy(group); + goto _return; + } SFltBuildGroupCtx tctx = {.info = info, .group = group}; nodesWalkExpr(tree, fltTreeToGroup, (void *)&tctx); - FLT_ERR_JRET(tctx.code); - - FLT_ERR_JRET(filterConvertGroupFromArray(info, group)); + if (TSDB_CODE_SUCCESS != tctx.code) { + taosArrayDestroy(group); + code = tctx.code; + goto _return; + } + code = filterConvertGroupFromArray(info, group); + if (TSDB_CODE_SUCCESS != code) { + taosArrayDestroy(group); + goto _return; + } taosArrayDestroy(group); - FLT_ERR_JRET(fltInitValFieldData(info)); if (!FILTER_GET_FLAG(info->options, FLT_OPTION_NO_REWRITE)) { From 2039bb593481503422be09f6e8a3c3638f88fd83 Mon Sep 17 00:00:00 2001 From: 54liuyao <54liuyao> Date: Thu, 8 Aug 2024 08:53:43 +0800 Subject: [PATCH 19/45] fix issue --- source/libs/executor/src/tsort.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libs/executor/src/tsort.c b/source/libs/executor/src/tsort.c index bc9cc920a4..cedc23ed2d 100644 --- a/source/libs/executor/src/tsort.c +++ b/source/libs/executor/src/tsort.c @@ -2727,7 +2727,7 @@ static int32_t tsortOpenForPQSort(SSortHandle* pHandle) { pqNode.data = &refTuple; PriorityQueueNode* pPushedNode = taosBQPush(pHandle->pBoundedQueue, &pqNode); if (!pPushedNode) { - if (terrno != TSDB_CODE_SUCCESS) return terrno; + // do nothing if push failed } else { pPushedNode->data = NULL; int32_t code = createAllocatedTuple(pBlock, colNum, tupleLen, rowIdx, (TupleDesc**)&pPushedNode->data); From 6905cc47ed2f6b7031aee5b187cf0b86bf38f486 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Thu, 8 Aug 2024 09:23:34 +0800 Subject: [PATCH 20/45] refactor transport code --- source/client/src/clientEnv.c | 2 +- source/client/src/clientImpl.c | 2 +- source/dnode/mgmt/node_mgmt/src/dmTransport.c | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c index 530d52026f..5eebe691ea 100644 --- a/source/client/src/clientEnv.c +++ b/source/client/src/clientEnv.c @@ -374,7 +374,7 @@ int32_t openTransporter(const char *user, const char *auth, int32_t numOfThread, *pDnodeConn = rpcOpen(&rpcInit); if (*pDnodeConn == NULL) { - tscError("failed to init connection to server."); + tscError("failed to init connection to server since %s", tstrerror(terrno)); code = terrno; } diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index 61579aee77..664de5619f 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -2468,7 +2468,7 @@ TSDB_SERVER_STATUS taos_check_server_status(const char* fqdn, int port, char* de clientRpc = rpcOpen(&rpcInit); if (clientRpc == NULL) { code = terrno; - tscError("failed to init server status client"); + tscError("failed to init server status client since %s", tstrerror(code)); goto _OVER; } diff --git a/source/dnode/mgmt/node_mgmt/src/dmTransport.c b/source/dnode/mgmt/node_mgmt/src/dmTransport.c index 30f1038a11..b43a92f028 100644 --- a/source/dnode/mgmt/node_mgmt/src/dmTransport.c +++ b/source/dnode/mgmt/node_mgmt/src/dmTransport.c @@ -392,7 +392,7 @@ int32_t dmInitClient(SDnode *pDnode) { pTrans->clientRpc = rpcOpen(&rpcInit); if (pTrans->clientRpc == NULL) { - dError("failed to init dnode rpc client"); + dError("failed to init dnode rpc client since:%s", tstrerror(terrno)); return terrno; } @@ -436,7 +436,7 @@ int32_t dmInitStatusClient(SDnode *pDnode) { pTrans->statusRpc = rpcOpen(&rpcInit); if (pTrans->statusRpc == NULL) { - dError("failed to init dnode rpc status client"); + dError("failed to init dnode rpc status client since %s", tstrerror(terrno)); return terrno; } @@ -481,7 +481,7 @@ int32_t dmInitSyncClient(SDnode *pDnode) { pTrans->syncRpc = rpcOpen(&rpcInit); if (pTrans->syncRpc == NULL) { - dError("failed to init dnode rpc sync client"); + dError("failed to init dnode rpc sync client since %s", tstrerror(terrno)); return terrno; } @@ -531,7 +531,7 @@ int32_t dmInitServer(SDnode *pDnode) { (void)taosVersionStrToInt(version, &(rpcInit.compatibilityVer)); pTrans->serverRpc = rpcOpen(&rpcInit); if (pTrans->serverRpc == NULL) { - dError("failed to init dnode rpc server"); + dError("failed to init dnode rpc server since:%s", tstrerror(terrno)); return terrno; } From 9ee22b17a19527d70cb0d9160c597f76d9aaaddf Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Thu, 8 Aug 2024 09:46:00 +0800 Subject: [PATCH 21/45] fix:[TD-TD-31308] error code if topic not exist --- source/client/src/clientTmq.c | 2 +- source/dnode/mnode/impl/inc/mndConsumer.h | 2 +- source/dnode/mnode/impl/src/mndSubscribe.c | 6 +++--- source/dnode/mnode/impl/src/mndTopic.c | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/source/client/src/clientTmq.c b/source/client/src/clientTmq.c index 8cf39a51b9..197a65add8 100644 --- a/source/client/src/clientTmq.c +++ b/source/client/src/clientTmq.c @@ -1275,7 +1275,7 @@ tmq_t* tmq_consumer_new(tmq_conf_t* conf, char* errstr, int32_t errstrLen) { // init semaphore if (tsem2_init(&pTmq->rspSem, 0, 0) != 0) { - tscError("consumer:0x %" PRIx64 " setup failed since %s, consumer group %s", pTmq->consumerId, terrstr(), + tscError("consumer:0x %" PRIx64 " setup failed since %s, consumer group %s", pTmq->consumerId, tstrerror(TAOS_SYSTEM_ERROR(errno)), pTmq->groupId); SET_ERROR_MSG_TMQ("init t_sem failed") goto _failed; diff --git a/source/dnode/mnode/impl/inc/mndConsumer.h b/source/dnode/mnode/impl/inc/mndConsumer.h index a773c61986..175730b91e 100644 --- a/source/dnode/mnode/impl/inc/mndConsumer.h +++ b/source/dnode/mnode/impl/inc/mndConsumer.h @@ -46,7 +46,7 @@ const char *mndConsumerStatusName(int status); #define MND_TMQ_NULL_CHECK(c) \ do { \ if (c == NULL) { \ - code = TSDB_CODE_OUT_OF_MEMORY; \ + code = TAOS_GET_TERRNO(TSDB_CODE_OUT_OF_MEMORY); \ goto END; \ } \ } while (0) diff --git a/source/dnode/mnode/impl/src/mndSubscribe.c b/source/dnode/mnode/impl/src/mndSubscribe.c index 1131f2f2d5..dad27b1c0b 100644 --- a/source/dnode/mnode/impl/src/mndSubscribe.c +++ b/source/dnode/mnode/impl/src/mndSubscribe.c @@ -882,7 +882,7 @@ static int32_t buildRebOutput(SMnode *pMnode, SMqRebInputObj *rebInput, SMqRebOu rebInput->oldConsumerNum = 0; code = mndCreateSubscription(pMnode, pTopic, key, &rebOutput->pSub); if (code != 0) { - mError("[rebalance] mq rebalance %s failed create sub since %s, ignore", key, terrstr()); + mError("[rebalance] mq rebalance %s failed create sub since %s, ignore", key, tstrerror(code)); taosRUnLockLatch(&pTopic->lock); mndReleaseTopic(pMnode, pTopic); return code; @@ -1067,7 +1067,7 @@ static int32_t mndProcessDropCgroupReq(SRpcMsg *pMsg) { return 0; } else { code = TSDB_CODE_MND_SUBSCRIBE_NOT_EXIST; - mError("topic:%s, cgroup:%s, failed to drop since %s", dropReq.topic, dropReq.cgroup, terrstr()); + mError("topic:%s, cgroup:%s, failed to drop since %s", dropReq.topic, dropReq.cgroup, tstrerror(code)); return code; } } @@ -1075,7 +1075,7 @@ static int32_t mndProcessDropCgroupReq(SRpcMsg *pMsg) { taosWLockLatch(&pSub->lock); if (taosHashGetSize(pSub->consumerHash) != 0) { code = TSDB_CODE_MND_CGROUP_USED; - mError("cgroup:%s on topic:%s, failed to drop since %s", dropReq.cgroup, dropReq.topic, terrstr()); + mError("cgroup:%s on topic:%s, failed to drop since %s", dropReq.cgroup, dropReq.topic, tstrerror(code)); goto END; } diff --git a/source/dnode/mnode/impl/src/mndTopic.c b/source/dnode/mnode/impl/src/mndTopic.c index 4bca13508e..c27cc04ae8 100644 --- a/source/dnode/mnode/impl/src/mndTopic.c +++ b/source/dnode/mnode/impl/src/mndTopic.c @@ -574,7 +574,7 @@ static int32_t mndProcessCreateTopicReq(SRpcMsg *pReq) { END: if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) { - mError("failed to create topic:%s since %s", createTopicReq.name, terrstr()); + mError("failed to create topic:%s since %s", createTopicReq.name, tstrerror(code)); } mndReleaseTopic(pMnode, pTopic); @@ -699,7 +699,7 @@ static int32_t mndProcessDropTopicReq(SRpcMsg *pReq) { tFreeSMDropTopicReq(&dropReq); return 0; } else { - mError("topic:%s, failed to drop since %s", dropReq.name, terrstr()); + mError("topic:%s, failed to drop since %s", dropReq.name, tstrerror(code)); tFreeSMDropTopicReq(&dropReq); return code; } @@ -727,7 +727,7 @@ END: mndReleaseTopic(pMnode, pTopic); mndTransDrop(pTrans); if (code != 0) { - mError("topic:%s, failed to drop since %s", dropReq.name, terrstr()); + mError("topic:%s, failed to drop since %s", dropReq.name, tstrerror(code)); tFreeSMDropTopicReq(&dropReq); return code; } From ab5d37eca3cca4abdd52cf0e2997ccbc8c88a818 Mon Sep 17 00:00:00 2001 From: kailixu Date: Thu, 8 Aug 2024 09:48:35 +0800 Subject: [PATCH 22/45] enh: update dmodule for windows --- deps/win/x64/dm_static/dmodule.lib | Bin 56614 -> 89324 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/deps/win/x64/dm_static/dmodule.lib b/deps/win/x64/dm_static/dmodule.lib index 36ce1d81d367155a69aa9da932973e4071bcf70f..55afb81e3f13541dc52cb3b431818177f1d619ea 100644 GIT binary patch literal 89324 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 EzZ$$pl>h($ From 5dbf50c555b2785b7dee4a3ef6fbab575b68c8c3 Mon Sep 17 00:00:00 2001 From: xsren <285808407@qq.com> Date: Thu, 8 Aug 2024 09:49:22 +0800 Subject: [PATCH 23/45] fix: return code --- source/libs/command/src/explain.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/libs/command/src/explain.c b/source/libs/command/src/explain.c index 2bfed58dc8..6a3df7be72 100644 --- a/source/libs/command/src/explain.c +++ b/source/libs/command/src/explain.c @@ -123,6 +123,7 @@ int32_t qExplainInitCtx(SExplainCtx **pCtx, SHashObj *groupHash, bool verbose, d SExplainCtx *ctx = taosMemoryCalloc(1, sizeof(SExplainCtx)); if (NULL == ctx) { qError("calloc SExplainCtx failed"); + QRY_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY); goto _return; } @@ -1971,6 +1972,7 @@ int32_t qExplainGetRspFromCtx(void *ctx, SRetrieveTableRsp **pRsp) { SRetrieveTableRsp *rsp = (SRetrieveTableRsp *)taosMemoryCalloc(1, rspSize); if (NULL == rsp) { qError("malloc SRetrieveTableRsp failed, size:%d", rspSize); + QRY_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY); goto _return; } From 0326bb7010f1409c6b4d8f2149aeae2391cf8545 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 8 Aug 2024 09:50:41 +0800 Subject: [PATCH 24/45] fix: handle error code --- source/dnode/vnode/src/meta/metaQuery.c | 8 ++++++-- source/libs/tdb/src/db/tdbBtree.c | 18 +++++++++++++++--- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/source/dnode/vnode/src/meta/metaQuery.c b/source/dnode/vnode/src/meta/metaQuery.c index e5dc34f4ab..af484b0b3e 100644 --- a/source/dnode/vnode/src/meta/metaQuery.c +++ b/source/dnode/vnode/src/meta/metaQuery.c @@ -355,7 +355,9 @@ _query: version = ((SUidIdxVal *)pData)[0].version; - (void)tdbTbGet(pMeta->pTbDb, &(STbDbKey){.uid = uid, .version = version}, sizeof(STbDbKey), &pData, &nData); + if (tdbTbGet(pMeta->pTbDb, &(STbDbKey){.uid = uid, .version = version}, sizeof(STbDbKey), &pData, &nData) != 0) { + goto _err; + } SMetaEntry me = {0}; tDecoderInit(&dc, pData, nData); @@ -385,7 +387,9 @@ _query: } tDecoderInit(&dc, pData, nData); - (void)tDecodeSSchemaWrapperEx(&dc, &schema); + if (tDecodeSSchemaWrapperEx(&dc, &schema) != 0) { + goto _err; + } pSchema = tCloneSSchemaWrapper(&schema); tDecoderClear(&dc); diff --git a/source/libs/tdb/src/db/tdbBtree.c b/source/libs/tdb/src/db/tdbBtree.c index 87ea12dd81..59b7f4af2e 100644 --- a/source/libs/tdb/src/db/tdbBtree.c +++ b/source/libs/tdb/src/db/tdbBtree.c @@ -194,7 +194,11 @@ int tdbBtreeInsert(SBTree *pBt, const void *pKey, int kLen, const void *pVal, in int idx; int c; - (void)tdbBtcOpen(&btc, pBt, pTxn); + ret = tdbBtcOpen(&btc, pBt, pTxn); + if (ret) { + tdbError("tdb/btree-insert: btc open failed with ret: %d.", ret); + return ret; + } tdbTrace("tdb insert, btc: %p, pTxn: %p", &btc, pTxn); @@ -235,7 +239,11 @@ int tdbBtreeDelete(SBTree *pBt, const void *pKey, int kLen, TXN *pTxn) { int c; int ret; - (void)tdbBtcOpen(&btc, pBt, pTxn); + ret = tdbBtcOpen(&btc, pBt, pTxn); + if (ret) { + tdbError("tdb/btree-delete: btc open failed with ret: %d.", ret); + return ret; + } /* btc.coder.ofps = taosArrayInit(8, sizeof(SPage *)); // btc.coder.ofps = taosArrayInit(8, sizeof(SPgno)); @@ -337,7 +345,11 @@ int tdbBtreePGet(SBTree *pBt, const void *pKey, int kLen, void **ppKey, int *pkL void *pTVal = NULL; SCellDecoder cd = {0}; - (void)tdbBtcOpen(&btc, pBt, NULL); + ret = tdbBtcOpen(&btc, pBt, NULL); + if (ret) { + tdbError("tdb/btree-pget: btc open failed with ret: %d.", ret); + return ret; + } tdbTrace("tdb pget, btc: %p", &btc); From dfc004ac370687c81a6bab12e58145f1f9d0ea1f Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 8 Aug 2024 10:22:06 +0800 Subject: [PATCH 25/45] fix: handle error code --- include/libs/executor/storageapi.h | 12 ++--- source/dnode/vnode/src/inc/vnodeInt.h | 2 +- source/dnode/vnode/src/meta/metaQuery.c | 35 ++++++++++---- source/dnode/vnode/src/meta/metaTable.c | 62 ++++++++++++++----------- 4 files changed, 70 insertions(+), 41 deletions(-) diff --git a/include/libs/executor/storageapi.h b/include/libs/executor/storageapi.h index a0ff3353bc..61ae034450 100644 --- a/include/libs/executor/storageapi.h +++ b/include/libs/executor/storageapi.h @@ -245,12 +245,12 @@ typedef struct SStoreSnapshotFn { } SStoreSnapshotFn; typedef struct SStoreMeta { - SMTbCursor* (*openTableMetaCursor)(void* pVnode); // metaOpenTbCursor - void (*closeTableMetaCursor)(SMTbCursor* pTbCur); // metaCloseTbCursor - void (*pauseTableMetaCursor)(SMTbCursor* pTbCur); // metaPauseTbCursor - void (*resumeTableMetaCursor)(SMTbCursor* pTbCur, int8_t first, int8_t move); // metaResumeTbCursor - int32_t (*cursorNext)(SMTbCursor* pTbCur, ETableType jumpTableType); // metaTbCursorNext - int32_t (*cursorPrev)(SMTbCursor* pTbCur, ETableType jumpTableType); // metaTbCursorPrev + SMTbCursor* (*openTableMetaCursor)(void* pVnode); // metaOpenTbCursor + void (*closeTableMetaCursor)(SMTbCursor* pTbCur); // metaCloseTbCursor + void (*pauseTableMetaCursor)(SMTbCursor* pTbCur); // metaPauseTbCursor + int32_t (*resumeTableMetaCursor)(SMTbCursor* pTbCur, int8_t first, int8_t move); // metaResumeTbCursor + int32_t (*cursorNext)(SMTbCursor* pTbCur, ETableType jumpTableType); // metaTbCursorNext + int32_t (*cursorPrev)(SMTbCursor* pTbCur, ETableType jumpTableType); // metaTbCursorPrev int32_t (*getTableTags)(void* pVnode, uint64_t suid, SArray* uidList); int32_t (*getTableTagsByUid)(void* pVnode, int64_t suid, SArray* uidList); diff --git a/source/dnode/vnode/src/inc/vnodeInt.h b/source/dnode/vnode/src/inc/vnodeInt.h index c45d6e6edf..416438b2ec 100644 --- a/source/dnode/vnode/src/inc/vnodeInt.h +++ b/source/dnode/vnode/src/inc/vnodeInt.h @@ -131,7 +131,7 @@ typedef SVCreateTSmaReq SSmaCfg; SMTbCursor* metaOpenTbCursor(void* pVnode); void metaCloseTbCursor(SMTbCursor* pTbCur); void metaPauseTbCursor(SMTbCursor* pTbCur); -void metaResumeTbCursor(SMTbCursor* pTbCur, int8_t first, int8_t move); +int32_t metaResumeTbCursor(SMTbCursor* pTbCur, int8_t first, int8_t move); int32_t metaTbCursorNext(SMTbCursor* pTbCur, ETableType jumpTableType); int32_t metaTbCursorPrev(SMTbCursor* pTbCur, ETableType jumpTableType); diff --git a/source/dnode/vnode/src/meta/metaQuery.c b/source/dnode/vnode/src/meta/metaQuery.c index e5dc34f4ab..d1c3d85c83 100644 --- a/source/dnode/vnode/src/meta/metaQuery.c +++ b/source/dnode/vnode/src/meta/metaQuery.c @@ -231,6 +231,7 @@ _exit: #if 1 // =================================================== SMTbCursor *metaOpenTbCursor(void *pVnode) { SMTbCursor *pTbCur = NULL; + int32_t code; pTbCur = (SMTbCursor *)taosMemoryCalloc(1, sizeof(*pTbCur)); if (pTbCur == NULL) { @@ -241,7 +242,12 @@ SMTbCursor *metaOpenTbCursor(void *pVnode) { // tdbTbcMoveToFirst((TBC *)pTbCur->pDbc); pTbCur->pMeta = pVnodeObj->pMeta; pTbCur->paused = 1; - metaResumeTbCursor(pTbCur, 1, 0); + code = metaResumeTbCursor(pTbCur, 1, 0); + if (code) { + terrno = code; + taosMemoryFree(pTbCur); + return NULL; + } return pTbCur; } @@ -266,28 +272,39 @@ void metaPauseTbCursor(SMTbCursor *pTbCur) { pTbCur->paused = 1; } } -void metaResumeTbCursor(SMTbCursor *pTbCur, int8_t first, int8_t move) { +int32_t metaResumeTbCursor(SMTbCursor *pTbCur, int8_t first, int8_t move) { + int32_t code = 0; + int32_t lino; + if (pTbCur->paused) { metaReaderDoInit(&pTbCur->mr, pTbCur->pMeta, META_READER_LOCK); - (void)tdbTbcOpen(((SMeta *)pTbCur->pMeta)->pUidIdx, (TBC **)&pTbCur->pDbc, NULL); + code = tdbTbcOpen(((SMeta *)pTbCur->pMeta)->pUidIdx, (TBC **)&pTbCur->pDbc, NULL); + TSDB_CHECK_CODE(code, lino, _exit); if (first) { - (void)tdbTbcMoveToFirst((TBC *)pTbCur->pDbc); + code = tdbTbcMoveToFirst((TBC *)pTbCur->pDbc); + TSDB_CHECK_CODE(code, lino, _exit); } else { int c = 1; - (void)tdbTbcMoveTo(pTbCur->pDbc, pTbCur->pKey, pTbCur->kLen, &c); + code = tdbTbcMoveTo(pTbCur->pDbc, pTbCur->pKey, pTbCur->kLen, &c); + TSDB_CHECK_CODE(code, lino, _exit); if (c == 0) { if (move) tdbTbcMoveToNext(pTbCur->pDbc); } else if (c < 0) { - (void)tdbTbcMoveToPrev(pTbCur->pDbc); + code = tdbTbcMoveToPrev(pTbCur->pDbc); + TSDB_CHECK_CODE(code, lino, _exit); } else { - (void)tdbTbcMoveToNext(pTbCur->pDbc); + code = tdbTbcMoveToNext(pTbCur->pDbc); + TSDB_CHECK_CODE(code, lino, _exit); } } pTbCur->paused = 0; } + +_exit: + return code; } int32_t metaTbCursorNext(SMTbCursor *pTbCur, ETableType jumpTableType) { @@ -588,6 +605,7 @@ STSchema *metaGetTbTSchema(SMeta *pMeta, tb_uid_t uid, int32_t sver, int lock) { int32_t metaGetTbTSchemaEx(SMeta *pMeta, tb_uid_t suid, tb_uid_t uid, int32_t sver, STSchema **ppTSchema) { int32_t code = 0; + int32_t lino; void *pData = NULL; int nData = 0; @@ -603,7 +621,8 @@ int32_t metaGetTbTSchemaEx(SMeta *pMeta, tb_uid_t suid, tb_uid_t uid, int32_t sv skmDbKey.uid = suid ? suid : uid; skmDbKey.sver = INT32_MAX; - (void)tdbTbcOpen(pMeta->pSkmDb, &pSkmDbC, NULL); + code = tdbTbcOpen(pMeta->pSkmDb, &pSkmDbC, NULL); + TSDB_CHECK_CODE(code, lino, _exit); metaRLock(pMeta); if (tdbTbcMoveTo(pSkmDbC, &skmDbKey, sizeof(skmDbKey), &c) < 0) { diff --git a/source/dnode/vnode/src/meta/metaTable.c b/source/dnode/vnode/src/meta/metaTable.c index 2badeec2c9..596fbf70b0 100644 --- a/source/dnode/vnode/src/meta/metaTable.c +++ b/source/dnode/vnode/src/meta/metaTable.c @@ -306,12 +306,13 @@ _err: } int metaDropSTable(SMeta *pMeta, int64_t verison, SVDropStbReq *pReq, SArray *tbUidList) { - void *pKey = NULL; - int nKey = 0; - void *pData = NULL; - int nData = 0; - int c = 0; - int rc = 0; + void *pKey = NULL; + int nKey = 0; + void *pData = NULL; + int nData = 0; + int c = 0; + int rc = 0; + int32_t lino; // check if super table exists rc = tdbTbGet(pMeta->pNameIdx, pReq->name, strlen(pReq->name) + 1, &pData, &nData); @@ -323,7 +324,11 @@ int metaDropSTable(SMeta *pMeta, int64_t verison, SVDropStbReq *pReq, SArray *tb // drop all child tables TBC *pCtbIdxc = NULL; - (void)(void)tdbTbcOpen(pMeta->pCtbIdx, &pCtbIdxc, NULL); + rc = tdbTbcOpen(pMeta->pCtbIdx, &pCtbIdxc, NULL); + if (rc) { + return (terrno = rc); + } + rc = tdbTbcMoveTo(pCtbIdxc, &(SCtbIdxKey){.suid = pReq->suid, .uid = INT64_MIN}, sizeof(SCtbIdxKey), &c); if (rc < 0) { (void)tdbTbcClose(pCtbIdxc); @@ -379,20 +384,20 @@ _exit: return 0; } -static void metaGetSubtables(SMeta *pMeta, int64_t suid, SArray *uids) { - if (!uids) return; +static int32_t metaGetSubtables(SMeta *pMeta, int64_t suid, SArray *uids) { + if (!uids) return TSDB_CODE_INVALID_PARA; int c = 0; void *pKey = NULL; int nKey = 0; TBC *pCtbIdxc = NULL; - (void)tdbTbcOpen(pMeta->pCtbIdx, &pCtbIdxc, NULL); + TAOS_CHECK_RETURN(tdbTbcOpen(pMeta->pCtbIdx, &pCtbIdxc, NULL)); int rc = tdbTbcMoveTo(pCtbIdxc, &(SCtbIdxKey){.suid = suid, .uid = INT64_MIN}, sizeof(SCtbIdxKey), &c); if (rc < 0) { (void)tdbTbcClose(pCtbIdxc); metaWLock(pMeta); - return; + return 0; } for (;;) { @@ -405,12 +410,17 @@ static void metaGetSubtables(SMeta *pMeta, int64_t suid, SArray *uids) { break; } - (void)taosArrayPush(uids, &(((SCtbIdxKey *)pKey)->uid)); + if (taosArrayPush(uids, &(((SCtbIdxKey *)pKey)->uid)) == NULL) { + tdbFree(pKey); + (void)tdbTbcClose(pCtbIdxc); + return terrno; + } } tdbFree(pKey); (void)tdbTbcClose(pCtbIdxc); + return 0; } int metaAlterSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) { @@ -425,7 +435,7 @@ int metaAlterSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) { int32_t ret; int32_t c = -2; - (void)tdbTbcOpen(pMeta->pUidIdx, &pUidIdxc, NULL); + TAOS_CHECK_RETURN(tdbTbcOpen(pMeta->pUidIdx, &pUidIdxc, NULL)); ret = tdbTbcMoveTo(pUidIdxc, &pReq->suid, sizeof(tb_uid_t), &c); if (ret < 0 || c) { (void)tdbTbcClose(pUidIdxc); @@ -442,7 +452,7 @@ int metaAlterSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) { oversion = ((SUidIdxVal *)pData)[0].version; - (void)tdbTbcOpen(pMeta->pTbDb, &pTbDbc, NULL); + TAOS_CHECK_RETURN(tdbTbcOpen(pMeta->pTbDb, &pTbDbc, NULL)); ret = tdbTbcMoveTo(pTbDbc, &((STbDbKey){.uid = pReq->suid, .version = oversion}), sizeof(STbDbKey), &c); if (!(ret == 0 && c == 0)) { (void)tdbTbcClose(pUidIdxc); @@ -486,7 +496,7 @@ int metaAlterSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) { int16_t cid = pReq->schemaRow.pSchema[nCols - 1].colId; int8_t col_type = pReq->schemaRow.pSchema[nCols - 1].type; - metaGetSubtables(pMeta, pReq->suid, uids); + TAOS_CHECK_RETURN(metaGetSubtables(pMeta, pReq->suid, uids)); (void)tsdbCacheNewSTableColumn(pTsdb, uids, cid, col_type); } else if (deltaCol == -1) { int16_t cid = -1; @@ -502,7 +512,7 @@ int metaAlterSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) { } if (cid != -1) { - metaGetSubtables(pMeta, pReq->suid, uids); + TAOS_CHECK_RETURN(metaGetSubtables(pMeta, pReq->suid, uids)); (void)tsdbCacheDropSTableColumn(pTsdb, uids, cid, hasPrimaryKey); } } @@ -619,7 +629,7 @@ int metaAddIndexToSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) { * iterator all pTdDbc by uid and version */ TBC *pCtbIdxc = NULL; - (void)tdbTbcOpen(pMeta->pCtbIdx, &pCtbIdxc, NULL); + TAOS_CHECK_RETURN(tdbTbcOpen(pMeta->pCtbIdx, &pCtbIdxc, NULL)); int rc = tdbTbcMoveTo(pCtbIdxc, &(SCtbIdxKey){.suid = suid, .uid = INT64_MIN}, sizeof(SCtbIdxKey), &c); if (rc < 0) { (void)tdbTbcClose(pCtbIdxc); @@ -756,7 +766,7 @@ int metaDropIndexFromSTable(SMeta *pMeta, int64_t version, SDropIndexReq *pReq) * iterator all pTdDbc by uid and version */ TBC *pCtbIdxc = NULL; - (void)tdbTbcOpen(pMeta->pCtbIdx, &pCtbIdxc, NULL); + TAOS_CHECK_RETURN(tdbTbcOpen(pMeta->pCtbIdx, &pCtbIdxc, NULL)); int rc = tdbTbcMoveTo(pCtbIdxc, &(SCtbIdxKey){.suid = suid, .uid = INT64_MIN}, sizeof(SCtbIdxKey), &c); if (rc < 0) { (void)tdbTbcClose(pCtbIdxc); @@ -1424,7 +1434,7 @@ static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAl // search uid index TBC *pUidIdxc = NULL; - (void)tdbTbcOpen(pMeta->pUidIdx, &pUidIdxc, NULL); + TAOS_CHECK_RETURN(tdbTbcOpen(pMeta->pUidIdx, &pUidIdxc, NULL)); (void)tdbTbcMoveTo(pUidIdxc, &uid, sizeof(uid), &c); if (c != 0) { (void)tdbTbcClose(pUidIdxc); @@ -1438,7 +1448,7 @@ static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAl // search table.db TBC *pTbDbc = NULL; - (void)tdbTbcOpen(pMeta->pTbDb, &pTbDbc, NULL); + TAOS_CHECK_RETURN(tdbTbcOpen(pMeta->pTbDb, &pTbDbc, NULL)); (void)tdbTbcMoveTo(pTbDbc, &((STbDbKey){.uid = uid, .version = oversion}), sizeof(STbDbKey), &c); if (c != 0) { (void)tdbTbcClose(pUidIdxc); @@ -1689,7 +1699,7 @@ static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pA // search uid index TBC *pUidIdxc = NULL; - (void)tdbTbcOpen(pMeta->pUidIdx, &pUidIdxc, NULL); + TAOS_CHECK_RETURN(tdbTbcOpen(pMeta->pUidIdx, &pUidIdxc, NULL)); (void)tdbTbcMoveTo(pUidIdxc, &uid, sizeof(uid), &c); if (c != 0) { (void)tdbTbcClose(pUidIdxc); @@ -1706,7 +1716,7 @@ static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pA SDecoder dc2 = {0}; /* get ctbEntry */ - (void)tdbTbcOpen(pMeta->pTbDb, &pTbDbc, NULL); + TAOS_CHECK_RETURN(tdbTbcOpen(pMeta->pTbDb, &pTbDbc, NULL)); (void)tdbTbcMoveTo(pTbDbc, &((STbDbKey){.uid = uid, .version = oversion}), sizeof(STbDbKey), &c); if (c != 0) { (void)tdbTbcClose(pUidIdxc); @@ -1869,7 +1879,7 @@ static int metaUpdateTableOptions(SMeta *pMeta, int64_t version, SVAlterTbReq *p // search uid index TBC *pUidIdxc = NULL; - (void)tdbTbcOpen(pMeta->pUidIdx, &pUidIdxc, NULL); + TAOS_CHECK_RETURN(tdbTbcOpen(pMeta->pUidIdx, &pUidIdxc, NULL)); (void)tdbTbcMoveTo(pUidIdxc, &uid, sizeof(uid), &c); if (c != 0) { (void)tdbTbcClose(pUidIdxc); @@ -1883,7 +1893,7 @@ static int metaUpdateTableOptions(SMeta *pMeta, int64_t version, SVAlterTbReq *p // search table.db TBC *pTbDbc = NULL; - (void)tdbTbcOpen(pMeta->pTbDb, &pTbDbc, NULL); + TAOS_CHECK_RETURN(tdbTbcOpen(pMeta->pTbDb, &pTbDbc, NULL)); (void)tdbTbcMoveTo(pTbDbc, &((STbDbKey){.uid = uid, .version = oversion}), sizeof(STbDbKey), &c); if (c != 0) { (void)tdbTbcClose(pUidIdxc); @@ -2018,7 +2028,7 @@ static int metaAddTagIndex(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterTb * iterator all pTdDbc by uid and version */ TBC *pCtbIdxc = NULL; - (void)tdbTbcOpen(pMeta->pCtbIdx, &pCtbIdxc, NULL); + TAOS_CHECK_RETURN(tdbTbcOpen(pMeta->pCtbIdx, &pCtbIdxc, NULL)); int rc = tdbTbcMoveTo(pCtbIdxc, &(SCtbIdxKey){.suid = suid, .uid = INT64_MIN}, sizeof(SCtbIdxKey), &c); if (rc < 0) { (void)tdbTbcClose(pCtbIdxc); @@ -2157,7 +2167,7 @@ static int metaDropTagIndex(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterT SArray *tagIdxList = taosArrayInit(512, sizeof(SMetaPair)); TBC *pTagIdxc = NULL; - (void)tdbTbcOpen(pMeta->pTagIdx, &pTagIdxc, NULL); + TAOS_CHECK_RETURN(tdbTbcOpen(pMeta->pTagIdx, &pTagIdxc, NULL)); int rc = tdbTbcMoveTo(pTagIdxc, &(STagIdxKey){.suid = suid, .cid = INT32_MIN, .type = pCol->type}, sizeof(STagIdxKey), &c); for (;;) { From 1124741163db9e7725258c3264fbed006070de1e Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Thu, 8 Aug 2024 10:27:39 +0800 Subject: [PATCH 26/45] fix more --- source/libs/executor/src/sysscanoperator.c | 34 +++++++++++----------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/source/libs/executor/src/sysscanoperator.c b/source/libs/executor/src/sysscanoperator.c index 1ca8999e79..1efe9c1078 100644 --- a/source/libs/executor/src/sysscanoperator.c +++ b/source/libs/executor/src/sysscanoperator.c @@ -568,7 +568,7 @@ static SSDataBlock* sysTableScanUserCols(SOperatorInfo* pOperator) { if (pInfo->pCur == NULL) { pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode); } else { - pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 0); + (void)pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 0); } if (pInfo->pSchema == NULL) { @@ -781,7 +781,7 @@ static SSDataBlock* sysTableScanUserTags(SOperatorInfo* pOperator) { if (pInfo->pCur == NULL) { pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode); } else { - pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 0); + (void)pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 0); } while ((ret = pAPI->metaFn.cursorNext(pInfo->pCur, TSDB_SUPER_TABLE)) == 0) { @@ -1201,7 +1201,7 @@ static SSDataBlock* buildInfoSchemaTableMetaBlock(char* tableName) { } SSDataBlock* pBlock = NULL; - int32_t code = createDataBlock(&pBlock); + int32_t code = createDataBlock(&pBlock); if (code) { terrno = code; return NULL; @@ -1374,7 +1374,7 @@ static SSDataBlock* sysTableBuildUserTablesByUids(SOperatorInfo* pOperator) { // table name SColumnInfoData* pColInfoData = taosArrayGet(p->pDataBlock, 0); QUERY_CHECK_NULL(pColInfoData, code, lino, _end, terrno); - + code = colDataSetVal(pColInfoData, numOfRows, n, false); QUERY_CHECK_CODE(code, lino, _end); @@ -1581,7 +1581,7 @@ static SSDataBlock* sysTableBuildUserTables(SOperatorInfo* pOperator) { firstMetaCursor = 1; } if (!firstMetaCursor) { - pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 1); + (void)pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 1); } blockDataCleanup(pInfo->pRes); @@ -2034,7 +2034,7 @@ static void sysTableScanFillTbName(SOperatorInfo* pOperator, const SSysTableScan if (pInfo->tbnameSlotId != -1) { SColumnInfoData* pColumnInfoData = (SColumnInfoData*)taosArrayGet(pBlock->pDataBlock, pInfo->tbnameSlotId); QUERY_CHECK_NULL(pColumnInfoData, code, lino, _end, terrno); - char varTbName[TSDB_TABLE_FNAME_LEN - 1 + VARSTR_HEADER_SIZE] = {0}; + char varTbName[TSDB_TABLE_FNAME_LEN - 1 + VARSTR_HEADER_SIZE] = {0}; STR_TO_VARSTR(varTbName, name); code = colDataSetNItems(pColumnInfoData, 0, varTbName, pBlock->info.rows, true); @@ -2151,8 +2151,8 @@ static SSDataBlock* sysTableScanFromMNode(SOperatorInfo* pOperator, SSysTableSca } } -int32_t createSysTableScanOperatorInfo(void* readHandle, SSystemTableScanPhysiNode* pScanPhyNode, - const char* pUser, SExecTaskInfo* pTaskInfo, SOperatorInfo** pOptrInfo) { +int32_t createSysTableScanOperatorInfo(void* readHandle, SSystemTableScanPhysiNode* pScanPhyNode, const char* pUser, + SExecTaskInfo* pTaskInfo, SOperatorInfo** pOptrInfo) { QRY_OPTR_CHECK(pOptrInfo); int32_t code = TSDB_CODE_SUCCESS; @@ -2161,7 +2161,7 @@ int32_t createSysTableScanOperatorInfo(void* readHandle, SSystemTableScanPhysiNo SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo)); if (pInfo == NULL || pOperator == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; - lino = __LINE__; + lino = __LINE__; goto _error; } @@ -2453,10 +2453,10 @@ static FORCE_INLINE int optSysBinarySearch(SArray* arr, int s, int e, uint64_t k } int32_t optSysIntersection(SArray* in, SArray* out) { - int32_t code = TSDB_CODE_SUCCESS; - int32_t lino = 0; + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; MergeIndex* mi = NULL; - int32_t sz = (int32_t)taosArrayGetSize(in); + int32_t sz = (int32_t)taosArrayGetSize(in); if (sz <= 0) { goto _end; } @@ -2694,7 +2694,6 @@ static int32_t doBlockInfoScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes int32_t slotId = pOperator->exprSupp.pExprInfo->base.resSchema.slotId; SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, slotId); QUERY_CHECK_NULL(pColInfo, code, lino, _end, terrno); - int32_t len = tSerializeBlockDistInfo(NULL, 0, &blockDistInfo); char* p = taosMemoryCalloc(1, len + VARSTR_HEADER_SIZE); @@ -2716,7 +2715,7 @@ static int32_t doBlockInfoScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes if (slotId != 0) { SColumnInfoData* p1 = taosArrayGet(pBlock->pDataBlock, 0); QUERY_CHECK_NULL(p1, code, lino, _end, terrno); - int64_t v = 0; + int64_t v = 0; colDataSetInt64(p1, 0, &v); } @@ -2778,11 +2777,12 @@ static int32_t initTableblockDistQueryCond(uint64_t uid, SQueryTableDataCond* pC } int32_t createDataBlockInfoScanOperator(SReadHandle* readHandle, SBlockDistScanPhysiNode* pBlockScanNode, - STableListInfo* pTableListInfo, SExecTaskInfo* pTaskInfo, SOperatorInfo** pOptrInfo) { + STableListInfo* pTableListInfo, SExecTaskInfo* pTaskInfo, + SOperatorInfo** pOptrInfo) { QRY_OPTR_CHECK(pOptrInfo); - int32_t code = 0; - int32_t lino = 0; + int32_t code = 0; + int32_t lino = 0; SBlockDistInfo* pInfo = taosMemoryCalloc(1, sizeof(SBlockDistInfo)); SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo)); if (pInfo == NULL || pOperator == NULL) { From ea1e2bc68eeb0cf846bdda2208b0e6ab8130bd5b Mon Sep 17 00:00:00 2001 From: sima Date: Thu, 8 Aug 2024 10:32:44 +0800 Subject: [PATCH 27/45] fix:[TD-31313] fix error handling. --- source/libs/scalar/src/filter.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/libs/scalar/src/filter.c b/source/libs/scalar/src/filter.c index 5226668f82..4bb2e65ab2 100644 --- a/source/libs/scalar/src/filter.c +++ b/source/libs/scalar/src/filter.c @@ -3601,12 +3601,12 @@ int32_t filterPreprocess(SFilterInfo *info) { if (FILTER_GET_FLAG(info->status, FI_STATUS_ALL)) { fltInfo("Final - FilterInfo: [ALL]"); - goto _return; + goto _return1; } if (FILTER_GET_FLAG(info->status, FI_STATUS_EMPTY)) { fltInfo("Final - FilterInfo: [EMPTY]"); - goto _return; + goto _return1; } FLT_ERR_JRET(filterGenerateColRange(info, gRes, gResNum)); @@ -3619,10 +3619,10 @@ int32_t filterPreprocess(SFilterInfo *info) { FLT_ERR_JRET(filterGenerateComInfo(info)); +_return1: + FLT_ERR_JRET(filterSetExecFunc(info)); + _return: - - FLT_ERR_RET(filterSetExecFunc(info)); - for (int32_t i = 0; i < gResNum; ++i) { filterFreeGroupCtx(gRes[i]); } From 4bebadd0002f387f62101a80bae9832180a3071f Mon Sep 17 00:00:00 2001 From: 54liuyao <54liuyao> Date: Thu, 8 Aug 2024 11:23:50 +0800 Subject: [PATCH 28/45] fix issue --- source/libs/executor/src/scanoperator.c | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index 76ba88ef34..647909cc13 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -5837,7 +5837,8 @@ int32_t createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanNode, SR SOperatorInfo** pOptrInfo) { QRY_OPTR_CHECK(pOptrInfo); - int32_t code = 0; + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; STableMergeScanInfo* pInfo = taosMemoryCalloc(1, sizeof(STableMergeScanInfo)); SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo)); if (pInfo == NULL || pOperator == NULL) { @@ -5850,16 +5851,10 @@ int32_t createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanNode, SR int32_t numOfCols = 0; code = extractColMatchInfo(pTableScanNode->scan.pScanCols, pDescNode, &numOfCols, COL_MATCH_FROM_COL_ID, &pInfo->base.matchInfo); - int32_t lino = 0; - if (code != TSDB_CODE_SUCCESS) { - goto _error; - } + QUERY_CHECK_CODE(code, lino, _error); code = initQueryTableDataCond(&pInfo->base.cond, pTableScanNode, readHandle); - if (code != TSDB_CODE_SUCCESS) { - taosArrayDestroy(pInfo->base.matchInfo.pList); - goto _error; - } + QUERY_CHECK_CODE(code, lino, _error); if (pTableScanNode->scan.pScanPseudoCols != NULL) { SExprSupp* pSup = &pInfo->base.pseudoSup; @@ -5874,10 +5869,7 @@ int32_t createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanNode, SR pInfo->scanInfo = (SScanInfo){.numOfAsc = pTableScanNode->scanSeq[0], .numOfDesc = pTableScanNode->scanSeq[1]}; pInfo->base.metaCache.pTableMetaEntryCache = taosLRUCacheInit(1024 * 128, -1, .5); - if (pInfo->base.metaCache.pTableMetaEntryCache == NULL) { - code = terrno; - goto _error; - } + QUERY_CHECK_NULL(pInfo->base.metaCache.pTableMetaEntryCache, code, lino, _error, terrno); pInfo->base.readerAPI = pTaskInfo->storageAPI.tsdReader; pInfo->base.dataBlockLoadFlag = FUNC_DATA_REQUIRED_DATA_LOAD; @@ -5894,9 +5886,7 @@ int32_t createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanNode, SR pInfo->sample.seed = taosGetTimestampSec(); code = filterInitFromNode((SNode*)pTableScanNode->scan.node.pConditions, &pOperator->exprSupp.pFilterInfo, 0); - if (code != TSDB_CODE_SUCCESS) { - goto _error; - } + QUERY_CHECK_CODE(code, lino, _error); initLimitInfo(pTableScanNode->scan.node.pLimit, pTableScanNode->scan.node.pSlimit, &pInfo->limitInfo); @@ -5958,6 +5948,9 @@ int32_t createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanNode, SR return code; _error: + if (code != TSDB_CODE_SUCCESS) { + qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + } pTaskInfo->code = code; pInfo->base.pTableListInfo = NULL; if (pInfo != NULL) destroyTableMergeScanOperatorInfo(pInfo); From da1fb7205699e930474095bfbe38a74e27007be3 Mon Sep 17 00:00:00 2001 From: gccgdb1234 Date: Thu, 8 Aug 2024 11:28:35 +0800 Subject: [PATCH 29/45] doc: add subpage list for components and connector group --- docs/zh/14-reference/01-components/index.md | 11 ++++++++++- docs/zh/14-reference/05-connector/index.md | 6 ++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/docs/zh/14-reference/01-components/index.md b/docs/zh/14-reference/01-components/index.md index 4f26d202cc..8493aa0591 100644 --- a/docs/zh/14-reference/01-components/index.md +++ b/docs/zh/14-reference/01-components/index.md @@ -3,4 +3,13 @@ sidebar_label: 产品组件 title: 产品组件 toc_max_heading_level: 4 description: TDengine 产品组件参考手册 ---- \ No newline at end of file +--- + +本节详细说明 TDengine 中的主要产品组件的功能、命令行参数、配置参数等。 + +```mdx-code-block +import DocCardList from '@theme/DocCardList'; +import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; + + +``` \ No newline at end of file diff --git a/docs/zh/14-reference/05-connector/index.md b/docs/zh/14-reference/05-connector/index.md index 6c73b14309..8356e89c56 100644 --- a/docs/zh/14-reference/05-connector/index.md +++ b/docs/zh/14-reference/05-connector/index.md @@ -117,3 +117,9 @@ import VerifyMacOS from "./_verify_macos.mdx"; +```mdx-code-block +import DocCardList from '@theme/DocCardList'; +import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; + + +``` \ No newline at end of file From 3515af8099bcde60ae5fdc68418ebeb793f28184 Mon Sep 17 00:00:00 2001 From: 54liuyao <54liuyao> Date: Thu, 8 Aug 2024 11:36:36 +0800 Subject: [PATCH 30/45] check function res --- source/libs/executor/src/sysscanoperator.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/libs/executor/src/sysscanoperator.c b/source/libs/executor/src/sysscanoperator.c index 1ca8999e79..0de0575746 100644 --- a/source/libs/executor/src/sysscanoperator.c +++ b/source/libs/executor/src/sysscanoperator.c @@ -780,6 +780,7 @@ static SSDataBlock* sysTableScanUserTags(SOperatorInfo* pOperator) { int32_t ret = 0; if (pInfo->pCur == NULL) { pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode); + QUERY_CHECK_NULL(pInfo->pCur, code, lino, _end, terrno); } else { pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0, 0); } @@ -1578,6 +1579,7 @@ static SSDataBlock* sysTableBuildUserTables(SOperatorInfo* pOperator) { SSysTableScanInfo* pInfo = pOperator->info; if (pInfo->pCur == NULL) { pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode); + QUERY_CHECK_NULL(pInfo->pCur, code, lino, _end, terrno); firstMetaCursor = 1; } if (!firstMetaCursor) { From f532885305dfe7622a7c08426711de166a832cff Mon Sep 17 00:00:00 2001 From: gccgdb1234 Date: Thu, 8 Aug 2024 11:39:28 +0800 Subject: [PATCH 31/45] doc: add subpage list for components and connector group --- docs/zh/14-reference/01-components/index.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/zh/14-reference/01-components/index.md b/docs/zh/14-reference/01-components/index.md index 8493aa0591..16da2882a9 100644 --- a/docs/zh/14-reference/01-components/index.md +++ b/docs/zh/14-reference/01-components/index.md @@ -1,7 +1,5 @@ --- -sidebar_label: 产品组件 title: 产品组件 -toc_max_heading_level: 4 description: TDengine 产品组件参考手册 --- From a4ebe75b4c520c746d84112f041baaaf897b2533 Mon Sep 17 00:00:00 2001 From: wangmm0220 Date: Thu, 8 Aug 2024 11:45:08 +0800 Subject: [PATCH 32/45] feat:[TD-30883]send data if scan wal too log --- source/dnode/vnode/src/tq/tqScan.c | 3 ++- tests/system-test/7-tmq/tmqParamsTest.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/source/dnode/vnode/src/tq/tqScan.c b/source/dnode/vnode/src/tq/tqScan.c index d072d7199c..4357456790 100644 --- a/source/dnode/vnode/src/tq/tqScan.c +++ b/source/dnode/vnode/src/tq/tqScan.c @@ -101,6 +101,7 @@ int32_t tqScanData(STQ* pTq, STqHandle* pHandle, SMqDataRsp* pRsp, STqOffsetVal* TSDB_CHECK_CODE(code, line, END); qStreamSetSourceExcluded(task, pRequest->sourceExcluded); + uint64_t st = taosGetTimestampMs(); while (1) { SSDataBlock* pDataBlock = NULL; code = getDataBlock(task, pHandle, vgId, &pDataBlock); @@ -160,7 +161,7 @@ int32_t tqScanData(STQ* pTq, STqHandle* pHandle, SMqDataRsp* pRsp, STqOffsetVal* pRsp->common.blockNum++; totalRows += pDataBlock->info.rows; - if (totalRows >= tmqRowSize) { + if (totalRows >= tmqRowSize || (taosGetTimestampMs() - st > 1000)) { break; } } diff --git a/tests/system-test/7-tmq/tmqParamsTest.py b/tests/system-test/7-tmq/tmqParamsTest.py index a323dff19e..c14c3fc7d1 100644 --- a/tests/system-test/7-tmq/tmqParamsTest.py +++ b/tests/system-test/7-tmq/tmqParamsTest.py @@ -104,7 +104,7 @@ class TDTestCase: stop_flag = 0 try: while True: - res = consumer.poll(1) + res = consumer.poll(3) tdSql.query('show consumers;') consumer_info = tdSql.queryResult[0][-1] if offset_value == "latest": From bec5d570c9d179450c146ed840c8ca3ad8db47d0 Mon Sep 17 00:00:00 2001 From: gccgdb1234 Date: Thu, 8 Aug 2024 11:48:20 +0800 Subject: [PATCH 33/45] doc: add subpage list for components and connector group --- docs/zh/14-reference/01-components/index.md | 24 ++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/zh/14-reference/01-components/index.md b/docs/zh/14-reference/01-components/index.md index 16da2882a9..65f3a10eca 100644 --- a/docs/zh/14-reference/01-components/index.md +++ b/docs/zh/14-reference/01-components/index.md @@ -1,13 +1,13 @@ ---- -title: 产品组件 -description: TDengine 产品组件参考手册 ---- - -本节详细说明 TDengine 中的主要产品组件的功能、命令行参数、配置参数等。 - -```mdx-code-block -import DocCardList from '@theme/DocCardList'; -import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; - - +--- +title: 产品组件 +description: TDengine 产品组件参考手册 +--- + +本节详细说明 TDengine 中的主要产品组件的功能、命令行参数、配置参数等。 + +```mdx-code-block +import DocCardList from '@theme/DocCardList'; +import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; + + ``` \ No newline at end of file From 6e820d28ab66507e4b0a01b03346714698438f90 Mon Sep 17 00:00:00 2001 From: xsren <285808407@qq.com> Date: Thu, 8 Aug 2024 13:41:47 +0800 Subject: [PATCH 34/45] unused code --- source/libs/command/src/explain.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/libs/command/src/explain.c b/source/libs/command/src/explain.c index 6a3df7be72..3a73c05de2 100644 --- a/source/libs/command/src/explain.c +++ b/source/libs/command/src/explain.c @@ -124,7 +124,6 @@ int32_t qExplainInitCtx(SExplainCtx **pCtx, SHashObj *groupHash, bool verbose, d if (NULL == ctx) { qError("calloc SExplainCtx failed"); QRY_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY); - goto _return; } SArray *rows = taosArrayInit(10, sizeof(SQueryExplainRowInfo)); @@ -1973,7 +1972,6 @@ int32_t qExplainGetRspFromCtx(void *ctx, SRetrieveTableRsp **pRsp) { if (NULL == rsp) { qError("malloc SRetrieveTableRsp failed, size:%d", rspSize); QRY_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY); - goto _return; } rsp->completed = 1; From cb4cc327d95acd24044189ca133bd6ba2479e46e Mon Sep 17 00:00:00 2001 From: sima Date: Thu, 8 Aug 2024 14:19:17 +0800 Subject: [PATCH 35/45] fix:[TD-31326] Return correct error code in _return. --- source/client/src/clientEnv.c | 2 +- source/client/src/clientHb.c | 2 +- source/libs/scalar/src/filter.c | 10 +++++----- source/libs/scalar/src/sclfunc.c | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c index 44abf71bd2..26e13688a7 100644 --- a/source/client/src/clientEnv.c +++ b/source/client/src/clientEnv.c @@ -871,7 +871,7 @@ _return: TSC_ERR_RET(terrno); } - return TSDB_CODE_SUCCESS; + return code; } void tscStopCrashReport() { diff --git a/source/client/src/clientHb.c b/source/client/src/clientHb.c index a174ae4b13..415c2d6685 100644 --- a/source/client/src/clientHb.c +++ b/source/client/src/clientHb.c @@ -1405,7 +1405,7 @@ _return: TSC_ERR_RET(terrno); } - return TSDB_CODE_SUCCESS; + return code; } static void hbStopThread() { diff --git a/source/libs/scalar/src/filter.c b/source/libs/scalar/src/filter.c index 9f79432398..e5d0fe594a 100644 --- a/source/libs/scalar/src/filter.c +++ b/source/libs/scalar/src/filter.c @@ -2343,7 +2343,7 @@ _return: (void)filterFreeRangeCtx(ctx); // No need to handle the return value. - return TSDB_CODE_SUCCESS; + return code; } int32_t filterMergeGroupUnits(SFilterInfo *info, SFilterGroupCtx **gRes, int32_t *gResNum) { @@ -2671,7 +2671,7 @@ _return: (void)filterFreeRangeCtx(ctx); // No need to handle the return value. - return TSDB_CODE_SUCCESS; + return code; } int32_t filterMergeGroups(SFilterInfo *info, SFilterGroupCtx **gRes, int32_t *gResNum) { @@ -2758,7 +2758,7 @@ _return: FILTER_SET_FLAG(info->status, FI_STATUS_ALL); - return TSDB_CODE_SUCCESS; + return code; } int32_t filterConvertGroupFromArray(SFilterInfo *info, SArray *group) { @@ -2958,7 +2958,7 @@ _return: taosMemoryFreeClear(idxNum); taosMemoryFreeClear(idxs); - return TSDB_CODE_SUCCESS; + return code; } int32_t filterPostProcessRange(SFilterInfo *info) { @@ -5003,7 +5003,7 @@ int32_t fltOptimizeNodes(SFilterInfo *pInfo, SNode **pNode, SFltTreeStat *pStat) } _return: taosArrayDestroy(sclOpList); - return TSDB_CODE_SUCCESS; + return code; } int32_t fltGetDataFromColId(void *param, int32_t id, void **data) { diff --git a/source/libs/scalar/src/sclfunc.c b/source/libs/scalar/src/sclfunc.c index cd67b89208..5db7aebeee 100644 --- a/source/libs/scalar/src/sclfunc.c +++ b/source/libs/scalar/src/sclfunc.c @@ -2913,7 +2913,7 @@ int32_t histogramScalarFunction(SScalarParam *pInput, int32_t inputNum, SScalarP _return: taosMemoryFree(bins); - return TSDB_CODE_SUCCESS; + return code; } int32_t selectScalarFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) { From 4423bd31f94863f40ed74b52ac30c7c9a506c563 Mon Sep 17 00:00:00 2001 From: gccgdb1234 Date: Thu, 8 Aug 2024 14:22:30 +0800 Subject: [PATCH 36/45] =?UTF-8?q?doc:=20remove=20=E6=9C=AC=E4=B9=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh/26-tdinternal/01-arch.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/26-tdinternal/01-arch.md b/docs/zh/26-tdinternal/01-arch.md index fdec606239..04e47797a8 100644 --- a/docs/zh/26-tdinternal/01-arch.md +++ b/docs/zh/26-tdinternal/01-arch.md @@ -301,7 +301,7 @@ TDengine 采用了一种数据驱动的策略来实现缓存数据的持久化 对于采集的数据,通常会有一定的保留期限,该期限由数据库参数 keep 指定。超出设定天数的数据文件将被集群自动移除,并释放相应的存储空间。 -当设置 duration 和 keep 两个参数后,一个处于典型工作状态的 vnode 中,总的数据文件数量应为向上取整 (keep/duration)+1 个。数据文件的总个数应保持在一个合理的范围内,不宜过多也不宜过少,通常介于 10 到 100 之间较为适宜。基于这一原则,可以合理设置 duration 参数。在本书编写时的版本中,可以调整参数 keep,但参数 duration 一旦设定,则无法更改。 +当设置 duration 和 keep 两个参数后,一个处于典型工作状态的 vnode 中,总的数据文件数量应为向上取整 (keep/duration)+1 个。数据文件的总个数应保持在一个合理的范围内,不宜过多也不宜过少,通常介于 10 到 100 之间较为适宜。基于这一原则,可以合理设置 duration 参数。可以调整参数 keep,但参数 duration 一旦设定,则无法更改。 在每个数据文件中,表的数据是以块的形式存储的。一张表可能包含一到多个数据文件块。在一个文件块内,数据采用列式存储,占据连续的存储空间,这有助于显著提高读取度。文件块的大小由数据库参数 maxRows(每块最大记录条数)控制,默认值为 4096。这个值应适中,过大可能导致定位特定时间段数据的搜索时间变长,影响读取速度;过小则可能导致数据文件块的索引过大,压缩效率降低,同样影响读取速度。 From 5cc9652813a50a33b0372e8416c93230dce18847 Mon Sep 17 00:00:00 2001 From: sheyanjie-qq <249478495@qq.com> Date: Thu, 8 Aug 2024 15:00:00 +0800 Subject: [PATCH 37/45] update monitor doc --- docs/zh/07-operation/05-monitor.md | 539 ++++++++---------- .../TDinsight-1-cluster-status.webp | Bin 0 -> 106524 bytes docs/zh/07-operation/tdinsight.png | Bin 274242 -> 0 bytes 3 files changed, 223 insertions(+), 316 deletions(-) create mode 100644 docs/zh/07-operation/TDinsight-1-cluster-status.webp delete mode 100644 docs/zh/07-operation/tdinsight.png diff --git a/docs/zh/07-operation/05-monitor.md b/docs/zh/07-operation/05-monitor.md index c5b4cbac06..e5aa3c7430 100644 --- a/docs/zh/07-operation/05-monitor.md +++ b/docs/zh/07-operation/05-monitor.md @@ -8,57 +8,13 @@ toc_max_heading_level: 4 至于如何获取和使用这些监控数据,用户可以使用第三方的监测工具比如 Zabbix 来获取这些保存的系统监测数据,进而将 TDengine 的运行状况无缝集成到现有的 IT 监控系统中。也可以使用 TDengine 提供的 TDinsight 插件,使用该插件用户可以通过 Grafana 平台直观地展示和管理这些监控信息,如下图所示。这为用户提供了灵活的监控选项,以满足不同场景下的运维需求。 -~[通过监控组件管理监控信息](./grafana.png) +![通过监控组件管理监控信息](./grafana.png) ## 配置 taosKeeper 因为 TDengine 的监控数据都通过 taosKeeper 上报并存储,所以本节先介绍 taosKeeper 的配置。 -taosKeeper 的配置文件默认位于 `/etc/taos/taoskeeper.toml`。 下面为一个示例配置文件,更多详细信息见参考手册。其中最为关键的一个配置项是 `database`,它决定了收集到的监控数据存储在目标系统的哪个数据库中。 - -```toml -# gin 框架是否启用 debug -debug = false - -# 服务监听端口, 默认为 6043 -port = 6043 - -# 日志级别,包含 panic、error、info、debug、trace等 -loglevel = "info" - -# 程序中使用协程池的大小 -gopoolsize = 50000 - -# 查询 TDengine 监控数据轮询间隔 -RotationInterval = "15s" - -[tdengine] -host = "127.0.0.1" -port = 6041 -username = "root" -password = "taosdata" - -# 需要被监控的 taosAdapter -[taosAdapter] -address = ["127.0.0.1:6041"] - -[metrics] -# 监控指标前缀 -prefix = "taos" - -# 集群数据的标识符 -cluster = "production" - -# 存放监控数据的数据库 -database = "log" - -# 指定需要监控的普通表 -tables = [] - -# database options for db storing metrics data -[metrics.databaseoptions] -cachemodel = "none" -``` +taosKeeper 的配置文件默认位于 `/etc/taos/taoskeeper.toml`。 详细配置见 [参考手册](../../reference/components/taoskeeper/#配置文件)。其中最为关键的一个配置项是 `database`,它决定了收集到的监控数据存储在目标系统的哪个数据库中。 ## 监控 taosd @@ -66,9 +22,9 @@ cachemodel = "none" 为了简化用户在 TDengine 监控方面的配置工作,TDengine 提供了一个名为 TDinsight 的 Grafana 插件。该插件与 taosKeeper 协同工作,能够实时监控 TDengine 的各项性能指标。 -通过集成 Grafana 和 TDengine 数据源插件,TDinsight 能够读取 taosKeeper 收集并存储的监控数据。这使得用户可以在 Grafana 平台上直观地查看 TDengine 集群的状态、节点信息、读写请求以及资源使用情况等关键指标,实现数据的可视化展示。 +通过集成 Grafana 和 TDengine 数据源插件,TDinsight 能够读取 taosKeeper 收集的监控数据。这使得用户可以在 Grafana 平台上直观地查看 TDengine 集群的状态、节点信息、读写请求以及资源使用情况等关键指标,实现数据的可视化展示。 -此外,TDinsight 还具备针对 vnode、dnode 和 mnode 节点的异常状态告警功能,为开发者提供实时的集群运行状态监控,确保 TDengine 集群的稳定性和可靠性。以下是TDinsight 的详细使用说明,以帮助你充分利用这一强大工具。 +以下是TDinsight 的详细使用说明,以帮助你充分利用这一强大工具。 #### 前置条件 @@ -76,10 +32,10 @@ cachemodel = "none" - TDengine 已安装并正常运行。 - taosAdapter 已经安装并正常运行。 - taosKeeper 已经安装并正常运行。 -- Grafana 已安装并正常运行,以下介绍以 Grafna 10.4.0 为例。 +- Grafana 已安装并正常运行,以下介绍以 Grafna 11.0.0 为例。 同时记录以下信息。 -- taosAdapter 的 RESTful 接口地址,如 http://www.example.com:6041。 +- taosAdapter 的 RESTful 接口地址,如 `http://www.example.com:6041`。 - TDengine 集群的认证信息,包括用户名及密码。 #### 导入仪表盘 @@ -90,300 +46,253 @@ TDengine 数据源插件已被提交至 Grafana 官网,完成插件的安装 - Dashboard ID:18180。 - Dashboard URL:https://grafana.com/grafana/dashboards/18180-tdinsight-for-3-x/ -填写以上 Dashboard ID 或 Dashboard URL 以后,点击 Load 按钮,按照向导操作,即可完成导入。导入成功后,Dashboards 列表页面会出现 TDinsight for 3.x 仪盘,点击进入后,就可以看到 TDinsight 中已创建的各个指标的面板,如下图所示: +填写以上 Dashboard ID 或 Dashboard URL 以后,点击 Load 按钮,按照向导操作,即可完成导入。导入成功后,Dashboards 列表页面会出现 ”TDinsight for 3.x“ 仪表盘,点击进入后,就可以看到 TDinsight 中已创建的各个指标的面板,如下图所示: -![TDinsight 界面示例](./tdinsight.png) +![TDinsight 界面示例](./TDinsight-1-cluster-status.webp) **注意** 在 TDinsight 界面左上角的 Log from 下拉列表中可以选择 log 数据库。 ### taosd 监控数据 -TDinsight dashboard 数据来源于 log 库(存放监控数据的默认 db,可以在 taoskeeper 配置文件中修改。以下是由 taosd 上报由 taosKeeper 存储在 log 库中的数据。 +TDinsight dashboard 数据来源于 `log` 库(存放监控数据的默认 db,可以在 taoskeeper 配置文件中修改)。以下是由 taosd 上报由 taosKeeper 存储在 log 库中的数据。 -1. taosd\_cluster\_basic 表 +#### taosd\_cluster\_basic 表 `taosd_cluster_basic` 表记录集群基础信息。 -|field|type|is\_tag|comment| -|:----|:---|:-----|:------| -|ts|TIMESTAMP||timestamp| -|first\_ep|VARCHAR||集群 first ep| -|first\_ep\_dnode\_id|INT||集群 first ep 的 dnode id| -|cluster_version|VARCHAR||tdengine version。例如:3.0.4.0| -|cluster\_id|VARCHAR|TAG|cluster id| +| field | type | is\_tag | comment | +| :------------------- | :-------- | :------ | :------------------------------ | +| ts | TIMESTAMP | | timestamp | +| first\_ep | VARCHAR | | 集群 first ep | +| first\_ep\_dnode\_id | INT | | 集群 first ep 的 dnode id | +| cluster_version | VARCHAR | | tdengine version。例如:3.0.4.0 | +| cluster\_id | VARCHAR | TAG | cluster id | -2. taosd\_cluster\_info 表 +#### taosd\_cluster\_info 表 `taosd_cluster_info` 表记录集群信息。 -|field|type|is\_tag|comment| -|:----|:---|:-----|:------| -|ts|TIMESTAMP||timestamp| -|cluster_uptime|DOUBLE||当前 master 节点的uptime。单位:秒| -|dbs\_total|DOUBLE||database 总数| -|tbs\_total|DOUBLE||当前集群 table 总数| -|stbs\_total|DOUBLE||当前集群 stable 总数| -|dnodes\_total|DOUBLE||当前集群 dnode 总数| -|dnodes\_alive|DOUBLE||当前集群 dnode 存活总数| -|mnodes\_total|DOUBLE||当前集群 mnode 总数| -|mnodes\_alive|DOUBLE||当前集群 mnode 存活总数| -|vgroups\_total|DOUBLE||当前集群 vgroup 总数| -|vgroups\_alive|DOUBLE||当前集群 vgroup 存活总数| -|vnodes\_total|DOUBLE||当前集群 vnode 总数| -|vnodes\_alive|DOUBLE||当前集群 vnode 存活总数| -|connections\_total|DOUBLE||当前集群连接总数| -|topics\_total|DOUBLE||当前集群 topic 总数| -|streams\_total|DOUBLE||当前集群 stream 总数| -|grants_expire\_time|DOUBLE||认证过期时间,企业版有效,社区版为 DOUBLE 最大值| -|grants_timeseries\_used|DOUBLE||已用测点数| -|grants_timeseries\_total|DOUBLE||总测点数,开源版本为 DOUBLE 最大值| -|cluster\_id|VARCHAR|TAG|cluster id| +| field | type | is\_tag | comment | +| :----------------------- | :-------- | :------ | :----------------------------------------------- | +| \_ts | TIMESTAMP | | timestamp | +| cluster_uptime | DOUBLE | | 当前 master 节点的uptime。单位:秒 | +| dbs\_total | DOUBLE | | database 总数 | +| tbs\_total | DOUBLE | | 当前集群 table 总数 | +| stbs\_total | DOUBLE | | 当前集群 stable 总数 | +| dnodes\_total | DOUBLE | | 当前集群 dnode 总数 | +| dnodes\_alive | DOUBLE | | 当前集群 dnode 存活总数 | +| mnodes\_total | DOUBLE | | 当前集群 mnode 总数 | +| mnodes\_alive | DOUBLE | | 当前集群 mnode 存活总数 | +| vgroups\_total | DOUBLE | | 当前集群 vgroup 总数 | +| vgroups\_alive | DOUBLE | | 当前集群 vgroup 存活总数 | +| vnodes\_total | DOUBLE | | 当前集群 vnode 总数 | +| vnodes\_alive | DOUBLE | | 当前集群 vnode 存活总数 | +| connections\_total | DOUBLE | | 当前集群连接总数 | +| topics\_total | DOUBLE | | 当前集群 topic 总数 | +| streams\_total | DOUBLE | | 当前集群 stream 总数 | +| grants_expire\_time | DOUBLE | | 认证过期时间,企业版有效,社区版为 DOUBLE 最大值 | +| grants_timeseries\_used | DOUBLE | | 已用测点数 | +| grants_timeseries\_total | DOUBLE | | 总测点数,开源版本为 DOUBLE 最大值 | +| cluster\_id | VARCHAR | TAG | cluster id | -3. taosd\_vgroups\_info 表 +#### taosd\_vgroups\_info 表 `taosd_vgroups_info` 表记录虚拟节点组信息。 -|field|type|is\_tag|comment| -|:----|:---|:-----|:------| -|ts|TIMESTAMP||timestamp| -|tables\_num|DOUBLE||vgroup 中 table 数量| -|status|DOUBLE||vgroup 状态, 取值范围:unsynced = 0, ready = 1| -|vgroup\_id|VARCHAR|TAG|vgroup id| -|database\_name|VARCHAR|TAG|vgroup 所属的 database 名字| -|cluster\_id|VARCHAR|TAG|cluster id| +| field | type | is\_tag | comment | +| :------------- | :-------- | :------ | :--------------------------------------------- | +| \_ts | TIMESTAMP | | timestamp | +| tables\_num | DOUBLE | | vgroup 中 table 数量 | +| status | DOUBLE | | vgroup 状态, 取值范围:unsynced = 0, ready = 1 | +| vgroup\_id | VARCHAR | TAG | vgroup id | +| database\_name | VARCHAR | TAG | vgroup 所属的 database 名字 | +| cluster\_id | VARCHAR | TAG | cluster id | -4. taosd\_dnodes\_info 表 +#### taosd\_dnodes\_info 表 `taosd_dnodes_info` 记录 dnode 信息。 -|field|type|is\_tag|comment| -|:----|:---|:-----|:------| -|ts|TIMESTAMP||timestamp| -|uptime|DOUBLE||dnode uptime,单位:秒| -|cpu\_engine|DOUBLE||taosd cpu 使用率,从 `/proc//stat` 读取| -|cpu\_system|DOUBLE||服务器 cpu 使用率,从 `/proc/stat` 读取| -|cpu\_cores|DOUBLE||服务器 cpu 核数| -|mem\_engine|DOUBLE||taosd 内存使用率,从 `/proc//status` 读取| -|mem\_free|DOUBLE||服务器可用内存,单位 KB| -|mem\_total|DOUBLE||服务器内存总量,单位 KB| -|disk\_used|DOUBLE||data dir 挂载的磁盘使用量,单位 bytes| -|disk\_total|DOUBLE||data dir 挂载的磁盘总容量,单位 bytes| -|system\_net\_in|DOUBLE||网络吞吐率,从 `/proc/net/dev` 中读取的 received bytes。单位 byte/s| -|system\_net\_out|DOUBLE||网络吞吐率,从 `/proc/net/dev` 中读取的 transmit bytes。单位 byte/s| -|io\_read|DOUBLE||io 吞吐率,从 `/proc//io` 中读取的 rchar 与上次数值计算之后,计算得到速度。单位 byte/s| -|io\_write|DOUBLE||io 吞吐率,从 `/proc//io` 中读取的 wchar 与上次数值计算之后,计算得到速度。单位 byte/s| -|io\_read\_disk|DOUBLE||磁盘 io 吞吐率,从 `/proc//io` 中读取的 read_bytes。单位 byte/s| -|io\_write\_disk|DOUBLE||磁盘 io 吞吐率,从 `/proc//io` 中读取的 write_bytes。单位 byte/s| -|vnodes\_num|DOUBLE||dnode 上 vnodes 数量| -|masters|DOUBLE||dnode 上 master node 数量| -|has\_mnode|DOUBLE||dnode 是否包含 mnode,取值范围:包含=1,不包含=0| -|has\_qnode|DOUBLE||dnode 是否包含 qnode,取值范围:包含=1,不包含=0| -|has\_snode|DOUBLE||dnode 是否包含 snode,取值范围:包含=1,不包含=0| -|has\_bnode|DOUBLE||dnode 是否包含 bnode,取值范围:包含=1,不包含=0| -|error\_log\_count|DOUBLE||error 总数| -|info\_log\_count|DOUBLE||info 总数| -|debug\_log\_count|DOUBLE||debug 总数| -|trace\_log\_count|DOUBLE||trace 总数| -|dnode\_id|VARCHAR|TAG|dnode id| -|dnode\_ep|VARCHAR|TAG|dnode endpoint| -|cluster\_id|VARCHAR|TAG|cluster id| +| field | type | is\_tag | comment | +| :---------------- | :-------- | :------ | :------------------------------------------------------------------------------------------------ | +| \_ts | TIMESTAMP | | timestamp | +| uptime | DOUBLE | | dnode uptime,单位:秒 | +| cpu\_engine | DOUBLE | | taosd cpu 使用率,从 `/proc//stat` 读取 | +| cpu\_system | DOUBLE | | 服务器 cpu 使用率,从 `/proc/stat` 读取 | +| cpu\_cores | DOUBLE | | 服务器 cpu 核数 | +| mem\_engine | DOUBLE | | taosd 内存使用率,从 `/proc//status` 读取 | +| mem\_free | DOUBLE | | 服务器可用内存,单位 KB | +| mem\_total | DOUBLE | | 服务器内存总量,单位 KB | +| disk\_used | DOUBLE | | data dir 挂载的磁盘使用量,单位 bytes | +| disk\_total | DOUBLE | | data dir 挂载的磁盘总容量,单位 bytes | +| system\_net\_in | DOUBLE | | 网络吞吐率,从 `/proc/net/dev` 中读取的 received bytes。单位 byte/s | +| system\_net\_out | DOUBLE | | 网络吞吐率,从 `/proc/net/dev` 中读取的 transmit bytes。单位 byte/s | +| io\_read | DOUBLE | | io 吞吐率,从 `/proc//io` 中读取的 rchar 与上次数值计算之后,计算得到速度。单位 byte/s | +| io\_write | DOUBLE | | io 吞吐率,从 `/proc//io` 中读取的 wchar 与上次数值计算之后,计算得到速度。单位 byte/s | +| io\_read\_disk | DOUBLE | | 磁盘 io 吞吐率,从 `/proc//io` 中读取的 read_bytes。单位 byte/s | +| io\_write\_disk | DOUBLE | | 磁盘 io 吞吐率,从 `/proc//io` 中读取的 write_bytes。单位 byte/s | +| vnodes\_num | DOUBLE | | dnode 上 vnodes 数量 | +| masters | DOUBLE | | dnode 上 master node 数量 | +| has\_mnode | DOUBLE | | dnode 是否包含 mnode,取值范围:包含=1,不包含=0 | +| has\_qnode | DOUBLE | | dnode 是否包含 qnode,取值范围:包含=1,不包含=0 | +| has\_snode | DOUBLE | | dnode 是否包含 snode,取值范围:包含=1,不包含=0 | +| has\_bnode | DOUBLE | | dnode 是否包含 bnode,取值范围:包含=1,不包含=0 | +| error\_log\_count | DOUBLE | | error 总数 | +| info\_log\_count | DOUBLE | | info 总数 | +| debug\_log\_count | DOUBLE | | debug 总数 | +| trace\_log\_count | DOUBLE | | trace 总数 | +| dnode\_id | VARCHAR | TAG | dnode id | +| dnode\_ep | VARCHAR | TAG | dnode endpoint | +| cluster\_id | VARCHAR | TAG | cluster id | -5. taosd\_dnodes\_status 表 +#### taosd\_dnodes\_status 表 `taosd_dnodes_status` 表记录 dnode 状态信息。 -|field|type|is\_tag|comment| -|:----|:---|:-----|:------| -|ts|TIMESTAMP||timestamp| -|status|DOUBLE||dnode 状态,取值范围:ready=1,offline =0| -|dnode\_id|VARCHAR|TAG|dnode id| -|dnode\_ep|VARCHAR|TAG|dnode endpoint| -|cluster\_id|VARCHAR|TAG|cluster id| +| field | type | is\_tag | comment | +| :---------- | :-------- | :------ | :--------------------------------------- | +| \_ts | TIMESTAMP | | timestamp | +| status | DOUBLE | | dnode 状态,取值范围:ready=1,offline =0 | +| dnode\_id | VARCHAR | TAG | dnode id | +| dnode\_ep | VARCHAR | TAG | dnode endpoint | +| cluster\_id | VARCHAR | TAG | cluster id | -6. taosd\_dnodes\_log\_dir 表 +#### taosd\_dnodes\_log\_dir 表 `taosd_dnodes_log_dir` 表记录 log 目录信息。 -|field|type|is\_tag|comment| -|:----|:---|:-----|:------| -|ts|TIMESTAMP||timestamp| -|avail|DOUBLE||log 目录可用空间。单位 byte| -|used|DOUBLE||log 目录已使用空间。单位 byte| -|total|DOUBLE||log 目录空间。单位 byte| -|name|VARCHAR|TAG|log 目录名,一般为 `/var/log/taos/`| -|dnode\_id|VARCHAR|TAG|dnode id| -|dnode\_ep|VARCHAR|TAG|dnode endpoint| -|cluster\_id|VARCHAR|TAG|cluster id| +| field | type | is\_tag | comment | +| :---------- | :-------- | :------ | :---------------------------------- | +| \_ts | TIMESTAMP | | timestamp | +| avail | DOUBLE | | log 目录可用空间。单位 byte | +| used | DOUBLE | | log 目录已使用空间。单位 byte | +| total | DOUBLE | | log 目录空间。单位 byte | +| name | VARCHAR | TAG | log 目录名,一般为 `/var/log/taos/` | +| dnode\_id | VARCHAR | TAG | dnode id | +| dnode\_ep | VARCHAR | TAG | dnode endpoint | +| cluster\_id | VARCHAR | TAG | cluster id | -7. taosd\_dnodes\_data\_dir 表 +#### taosd\_dnodes\_data\_dir 表 `taosd_dnodes_data_dir` 表记录 data 目录信息。 -|field|type|is\_tag|comment| -|:----|:---|:-----|:------| -|ts|TIMESTAMP||timestamp| -|avail|DOUBLE||data 目录可用空间。单位 byte| -|used|DOUBLE||data 目录已使用空间。单位 byte| -|total|DOUBLE||data 目录空间。单位 byte| -|level|VARCHAR|TAG|0、1、2 多级存储级别| -|name|VARCHAR|TAG|data 目录,一般为 `/var/lib/taos`| -|dnode\_id|VARCHAR|TAG|dnode id| -|dnode\_ep|VARCHAR|TAG|dnode endpoint| -|cluster\_id|VARCHAR|TAG|cluster id| +| field | type | is\_tag | comment | +| :---------- | :-------- | :------ | :-------------------------------- | +| \_ts | TIMESTAMP | | timestamp | +| avail | DOUBLE | | data 目录可用空间。单位 byte | +| used | DOUBLE | | data 目录已使用空间。单位 byte | +| total | DOUBLE | | data 目录空间。单位 byte | +| level | VARCHAR | TAG | 0、1、2 多级存储级别 | +| name | VARCHAR | TAG | data 目录,一般为 `/var/lib/taos` | +| dnode\_id | VARCHAR | TAG | dnode id | +| dnode\_ep | VARCHAR | TAG | dnode endpoint | +| cluster\_id | VARCHAR | TAG | cluster id | -8. taosd\_mnodes\_info 表 +#### taosd\_mnodes\_info 表 `taosd_mnodes_info` 表记录 mnode 角色信息。 -|field|type|is\_tag|comment| -|:----|:---|:-----|:------| -|ts|TIMESTAMP||timestamp| -|role|DOUBLE||mnode 角色, 取值范围:offline = 0,follower = 100,candidate = 101,leader = 102,error = 103,learner = 104| -|mnode\_id|VARCHAR|TAG|master node id| -|mnode\_ep|VARCHAR|TAG|master node endpoint| -|cluster\_id|VARCHAR|TAG|cluster id| +| field | type | is\_tag | comment | +| :---------- | :-------- | :------ | :------------------------------------------------------------------------------------------------------- | +| \_ts | TIMESTAMP | | timestamp | +| role | DOUBLE | | mnode 角色, 取值范围:offline = 0,follower = 100,candidate = 101,leader = 102,error = 103,learner = 104 | +| mnode\_id | VARCHAR | TAG | master node id | +| mnode\_ep | VARCHAR | TAG | master node endpoint | +| cluster\_id | VARCHAR | TAG | cluster id | -9. taosd\_vnodes\_role 表 +#### taosd\_vnodes\_role 表 `taosd_vnodes_role` 表记录虚拟节点角色信息。 -|field|type|is\_tag|comment| -|:----|:---|:-----|:------| -|ts|TIMESTAMP||timestamp| -|vnode\_role|DOUBLE||vnode 角色,取值范围:offline = 0,follower = 100,candidate = 101,leader = 102,error = 103,learner = 104| -|vgroup\_id|VARCHAR|TAG|dnode id| -|dnode\_id|VARCHAR|TAG|dnode id| -|database\_name|VARCHAR|TAG|vgroup 所属的 database 名字| -|cluster\_id|VARCHAR|TAG|cluster id| +| field | type | is\_tag | comment | +| :------------- | :-------- | :------ | :------------------------------------------------------------------------------------------------------ | +| \_ts | TIMESTAMP | | timestamp | +| vnode\_role | DOUBLE | | vnode 角色,取值范围:offline = 0,follower = 100,candidate = 101,leader = 102,error = 103,learner = 104 | +| vgroup\_id | VARCHAR | TAG | dnode id | +| dnode\_id | VARCHAR | TAG | dnode id | +| database\_name | VARCHAR | TAG | vgroup 所属的 database 名字 | +| cluster\_id | VARCHAR | TAG | cluster id | -10. taosd\_sql\_req 表 +#### taosd\_sql\_req 表 `taosd_sql_req` 记录授权信息。 -|field|type|is\_tag|comment| -|:----|:---|:-----|:------| -|ts|TIMESTAMP||timestamp| -|count|DOUBLE||sql 数量| -|result|VARCHAR|TAG|sql的执行结果,取值范围:Success, Failed| -|username|VARCHAR|TAG|执行sql的user name| -|sql\_type|VARCHAR|TAG|sql类型,取值范围:inserted_rows| -|dnode\_id|VARCHAR|TAG|dnode id| -|dnode\_ep|VARCHAR|TAG|dnode endpoint| -|vgroup\_id|VARCHAR|TAG|dnode id| -|cluster\_id|VARCHAR|TAG|cluster id| +| field | type | is\_tag | comment | +| :---------- | :-------- | :------ | :--------------------------------------- | +| \_ts | TIMESTAMP | | timestamp | +| count | DOUBLE | | sql 数量 | +| result | VARCHAR | TAG | sql的执行结果,取值范围:Success, Failed | +| username | VARCHAR | TAG | 执行sql的user name | +| sql\_type | VARCHAR | TAG | sql类型,取值范围:inserted_rows | +| dnode\_id | VARCHAR | TAG | dnode id | +| dnode\_ep | VARCHAR | TAG | dnode endpoint | +| vgroup\_id | VARCHAR | TAG | dnode id | +| cluster\_id | VARCHAR | TAG | cluster id | -11. taos\_sql\_req 表 +#### taos\_sql\_req 表 `taos_sql_req` 记录授权信息。 -|field|type|is\_tag|comment| -|:----|:---|:-----|:------| -|ts|TIMESTAMP||timestamp| -|count|DOUBLE||sql 数量| -|result|VARCHAR|TAG|sql的执行结果,取值范围:Success, Failed| -|username|VARCHAR|TAG|执行sql的user name| -|sql\_type|VARCHAR|TAG|sql类型,取值范围:select, insert,delete| -|cluster\_id|VARCHAR|TAG|cluster id| +| field | type | is\_tag | comment | +| :---------- | :-------- | :------ | :---------------------------------------- | +| \_ts | TIMESTAMP | | timestamp | +| count | DOUBLE | | sql 数量 | +| result | VARCHAR | TAG | sql的执行结果,取值范围:Success, Failed | +| username | VARCHAR | TAG | 执行sql的user name | +| sql\_type | VARCHAR | TAG | sql类型,取值范围:select, insert,delete | +| cluster\_id | VARCHAR | TAG | cluster id | -12. taos\_slow\_sql 表 +#### taos\_slow\_sql 表 `taos_slow_sql` 记录授权信息。 -|field|type|is\_tag|comment| -|:----|:---|:-----|:------| -|ts|TIMESTAMP||timestamp| -|count|DOUBLE||sql 数量| -|result|VARCHAR|TAG|sql的执行结果,取值范围:Success, Failed| -|username|VARCHAR|TAG|执行sql的user name| -|duration|VARCHAR|TAG|sql执行耗时,取值范围:3-10s,10-100s,100-1000s,1000s-| -|cluster\_id|VARCHAR|TAG|cluster id| +| field | type | is\_tag | comment | +| :---------- | :-------- | :------ | :---------------------------------------------------- | +| \_ts | TIMESTAMP | | timestamp | +| count | DOUBLE | | sql 数量 | +| result | VARCHAR | TAG | sql的执行结果,取值范围:Success, Failed | +| username | VARCHAR | TAG | 执行sql的user name | +| duration | VARCHAR | TAG | sql执行耗时,取值范围:3-10s,10-100s,100-1000s,1000s- | +| cluster\_id | VARCHAR | TAG | cluster id | -13. keeper\_monitor 表 + + +#### adapter\_requests 表 + +`adapter_requests` 记录 taosadapter 监控数据。 + +| field | type | is\_tag | comment | +| :----------------- | :----------- | :------ | :---------------------------------- | +| ts | TIMESTAMP | | timestamp | +| total | INT UNSIGNED | | 总请求数 | +| query | INT UNSIGNED | | 查询请求数 | +| write | INT UNSIGNED | | 写入请求数 | +| other | INT UNSIGNED | | 其他请求数 | +| in\_process | INT UNSIGNED | | 正在处理请求数 | +| success | INT UNSIGNED | | 成功请求数 | +| fail | INT UNSIGNED | | 失败请求数 | +| query\_success | INT UNSIGNED | | 查询成功请求数 | +| query\_fail | INT UNSIGNED | | 查询失败请求数 | +| write\_success | INT UNSIGNED | | 写入成功请求数 | +| write\_fail | INT UNSIGNED | | 写入失败请求数 | +| other\_success | INT UNSIGNED | | 其他成功请求数 | +| other\_fail | INT UNSIGNED | | 其他失败请求数 | +| query\_in\_process | INT UNSIGNED | | 正在处理查询请求数 | +| write\_in\_process | INT UNSIGNED | | 正在处理写入请求数 | +| endpoint | VARCHAR | | 请求端点 | +| req\_type | NCHAR | TAG | 请求类型:0 为 REST,1 为 Websocket | + + +#### keeper\_monitor 表 `keeper_monitor` 记录 taoskeeper 监控数据。 -|field|type|is\_tag|comment| -|:----|:---|:-----|:------| -|ts|TIMESTAMP||timestamp| -|cpu|DOUBLE||cpu 使用率| -|mem|DOUBLE||内存使用率| -|identify|NCHAR|TAG|| +| field | type | is\_tag | comment | +| :------- | :-------- | :------ | :----------- | +| ts | TIMESTAMP | | timestamp | +| cpu | DOUBLE | | cpu 使用率 | +| mem | DOUBLE | | 内存使用率 | +| identify | NCHAR | TAG | 身份标识信息 | -14. taosadapter\_restful\_http\_request\_total 表 - -`taosadapter_restful_http_request_total` 记录 taosadapter rest 请求信息,该表为 schemaless 方式创建的表,时间戳字段名为 `_ts`。 - -|field|type|is\_tag|comment| -|:----|:---|:-----|:------| -|\_ts|TIMESTAMP||timestamp| -|gauge|DOUBLE||监控指标值| -|client\_ip|NCHAR|TAG|client ip| -|endpoint|NCHAR|TAG|taosadpater endpoint| -|request\_method|NCHAR|TAG|request method| -|request\_uri|NCHAR|TAG|request uri| -|status\_code|NCHAR|TAG|status code| - -15. taosadapter\_restful\_http\_request\_fail 表 - -`taosadapter_restful_http_request_fail` 记录 taosadapter rest 请求失败信息,该表为 schemaless 方式创建的表,时间戳字段名为 `_ts`。 - -|field|type|is\_tag|comment| -|:----|:---|:-----|:------| -|\_ts|TIMESTAMP||timestamp| -|gauge|DOUBLE||监控指标值| -|client\_ip|NCHAR|TAG|client ip| -|endpoint|NCHAR|TAG|taosadpater endpoint| -|request\_method|NCHAR|TAG|request method| -|request\_uri|NCHAR|TAG|request uri| -|status\_code|NCHAR|TAG|status code| - -16. taosadapter\_restful\_http\_request\_in\_flight 表 - -`taosadapter_restful_http_request_in_flight` 记录 taosadapter rest 实时请求信息,该表为 schemaless 方式创建的表,时间戳字段名为 `_ts`。 - -|field|type|is\_tag|comment| -|:----|:---|:-----|:------| -|\_ts|TIMESTAMP||timestamp| -|gauge|DOUBLE||监控指标值| -|endpoint|NCHAR|TAG|taosadpater endpoint| - -17. taosadapter\_restful\_http\_request\_summary\_milliseconds 表 - -`taosadapter_restful_http_request_summary_milliseconds` 记录 taosadapter rest 请求汇总信息,该表为 schemaless 方式创建的表,时间戳字段名为 `_ts`。 - -|field|type|is\_tag|comment| -|:----|:---|:-----|:------| -|\_ts|TIMESTAMP||timestamp| -|count|DOUBLE||| -|sum|DOUBLE||| -|0.5|DOUBLE||| -|0.9|DOUBLE||| -|0.99|DOUBLE||| -|0.1|DOUBLE||| -|0.2|DOUBLE||| -|endpoint|NCHAR|TAG|taosadpater endpoint| -|request\_method|NCHAR|TAG|request method| -|request\_uri|NCHAR|TAG|request uri| - -18. taosadapter\_system\_mem\_percent 表 - -`taosadapter_system_mem_percent` 表记录 taosadapter 内存使用情况,该表为 schemaless 方式创建的表,时间戳字段名为 `_ts`。 - -|field|type|is\_tag|comment| -|:----|:---|:-----|:------| -|\_ts|TIMESTAMP||timestamp| -|gauge|DOUBLE||监控指标值| -|endpoint|NCHAR|TAG|taosadpater endpoint| - -19. taosadapter\_system\_cpu\_percent 表 - -`taosadapter_system_cpu_percent` 表记录 taosadapter cpu 使用情况,该表为 schemaless 方式创建的表,时间戳字段名为 `_ts`。 - -|field|type|is\_tag|comment| -|:----|:---|:-----|:------| -|\_ts|TIMESTAMP||timestamp| -|gauge|DOUBLE||监控指标值| -|endpoint|NCHAR|TAG|taosadpater endpoint| ## 监控 taosX @@ -396,13 +305,13 @@ taosX 是 TDengine 中提供零代码数据接入能力的核心组件,对它 ### 版本支持 1. TDengine 企业版本 3.2.3.0 或以上版本包含的 taosX 才包含此功能。如果单独安装 taosX,需要 taosX 1.5.0 或以上版本。 -1. 需要安装 Grafana 插件 [TDengie Datasource v3.5.0](https://grafana.com/grafana/plugins/tdengine-datasource/) 或以上版本。 +2. 需要安装 Grafana 插件 [TDengie Datasource v3.5.0](https://grafana.com/grafana/plugins/tdengine-datasource/) 或以上版本。 ### 准备工作 -假设你已经部署好了 taosd,taosAdapter 和 taosAdapter。 那么还需要: -2. 启动 taosX 服务。 -3. 部署 Grafana ,安装 TDengine Datasource 插件,配置好数据源。 +假设你已经部署好了 taosd,taosAdapter 和 taosAdapter。 那么还需要: +1. 启动 taosX 服务。 +2. 部署 Grafana ,安装 TDengine Datasource 插件,配置好数据源。 ### 配置 taosX @@ -426,52 +335,50 @@ toasX 的配置文件(默认 /etc/taos/taosx.toml) 中与 monitor 相关的配 | port | --monitor-port | MONITOR_PORT | taosKeeper 服务的端口 | | 6043 | | interval | --monitor-interval | MONITTOR_INTERVAL | taosX 发送 metrics 数据到 taosKeeper 的时间间隔,单位秒 | 1-10 | 10 | -TDinsight for taosX - -"TDinsight for taosX" 专门为 taosX 监控创建的 Grafana 面板。使用前需要先导入这个面板。 - ### 基于 TDinsight 监控 tasoX +"TDinsight for taosX" 是专门为 taosX 监控创建的 Grafana 面板。使用前需要先导入这个面板。 + #### 进入面板 -1. 选择 TDengine Datasource - ![TDengine Datasource](./pic/monitor-01.jpg) -2. 点击 “Dashboard”, 选择 TDinsight for taosX 面板。(第一次使用需要先导入)。 - ![Dashboard](./pic/monitor-02.jpg) +1. 在 Grafana 界面菜单中点击 ”Data sources“, 然后选择已经配置好的 TDengine 数据源。 +2. 在数据源配置界面选择 “Dashboard” Tab, 然后导入 ”TDinsight for taosX“ 面板(第一次使用需要先导入)。 下面是一个示例图: + ![monitor rows](./pic/monitor-04.jpg) - 该面板每一行代表一个或一类监控对象。最上面是 taosX 监控行,然后是 Agent 监控行, 最后是各类数据写入任务的监控。 - :::note - 1. 如果打开这个面板后看不到任何数据,你很可能需要点击左上角的数据库列表(即 “Log from” 下拉菜单),切换到监控数据所在的数据库。 - 2. 数据库包含多少个 Agent 的数据就会自动创建多少个 Agent 行。(如上图) - - ::: + + 该面板每一行代表一个或一类监控对象。最上面是 taosX 监控行,然后是 Agent 监控行, 最后是各类数据写入任务的监控。 + :::note + - 如果打开这个面板后看不到任何数据,你很可能需要点击左上角的数据库列表(即 “Log from” 下拉菜单),切换到监控数据所在的数据库。 + - 数据库包含多少个 Agent 的数据就会自动创建多少个 Agent 行。(如上图) + ::: #### 监控示例 -1. taosX 监控示例 +1. taosX 监控示例图 -![monitor taosx](./pic/monitor-03.png) + ![monitor taosx](./pic/monitor-03.png) -2. Agent 监控示例 +2. Agent 监控示例图 -![monitor agent](./pic/monitor-09.jpg) + ![monitor agent](./pic/monitor-09.jpg) -3. TDengine2 数据源监控示例 +3. TDengine2 数据源监控示例图 -![monitor tdengine2](./pic/monitor-05.png) + ![monitor tdengine2](./pic/monitor-05.png) -:::info -监控面板只展示了数据写入任务的部分监控指标,在 Explorer 页面上有更全面的监控指标,且有每个指标的具体说明。 + :::info + 监控面板只展示了数据写入任务的部分监控指标,在 Explorer 页面上有更全面的监控指标,且有每个指标的具体说明。 -::: + ::: -3. TDengine3 数据源监控示例 -![monitor tdengine3](./pic/monitor-06.jpg) +4. TDengine3 数据源监控示例图 + + ![monitor tdengine3](./pic/monitor-06.jpg) -4. 其它数据源监控示例 -![monitor task](./pic/monitor-10.jpg) +5. 其它数据源监控示例图 + ![monitor task](./pic/monitor-10.jpg) #### 限制 diff --git a/docs/zh/07-operation/TDinsight-1-cluster-status.webp b/docs/zh/07-operation/TDinsight-1-cluster-status.webp new file mode 100644 index 0000000000000000000000000000000000000000..7f7792b2e918574b72985b6af77364e467bdfcf8 GIT binary patch literal 106524 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

Dt+MjRr=s zp{y!G4bnFr6=eB^S;}q%u?mZ9l)OgO?Lu^rv zz8)odn#}8hig`v_2MjdEhjH5LbLSezY(jtlO`2t;NT<`AE#zQob>9~$%5+hY<$PKP zSF)5FT`N?wBqJB6Dr~ZR_KE>9wn5_CI)Kxt$*v9X0@*l{Vby`VE7HcRxP)N`bCoVx zP7RT?^y!(Be?B`L(agrUtx+MI^NB>3S7?54UOp_SAepGC?v_G&2Yw)($Sq!<*Y~ZE zo}I>qB+*0kx4E%US4GZlY77Pe5)`?ZF<;JdhS~{`C}79P>k0Fi)o~1($XL|*JbTG< zQK2CI-CF@WbMWrQ%cZ8^ItEvDo*-c^FN8M^Mrq7;%NGpg{&c?s@+E^h&u3*6qjgpP zHa3XFgDO0uLc)l!9Zlk$j^S5|QM_SfXM$G=0> zgaZ~$b<9Y3BlNOR_=VGFAQYdTWX3yc-8rzItmEF5AE~9*hl&zev$&e#>7*u7+3XOZ|SaJrS-qMPrHg8!;e8>-Q0#PRWqY7vnqi-hU=%+C})=~7^H#G+Dm@X z!r8Re!6#lDqQKHENg;tir<#8@@lP~Au|~76JU>zqJZB98uv_-4DK=n6n28smJLz$a zx_6~aa(9BH3qaY^JP_@yCtP0{Diz!JSi1P_4bycbqj&8dG~g^|DSw0|iIocl)P(4k zNcYrQMcfN%ybkNZWXwH5%8#Z^pO`Im&5r9U7(QGr%+$eDp0|&Rt5s0!DDl);M=@|P z@GDgt&-7|Xkz{mDo=SgSg`hHYasc=0Zqxr{w0*c0!`3vwT zaVA)3hIVRFYTB?<_eMJ9qxUOUC`d<-K)NN5%`xPy(KnG z6SwG+rsLfFPfx|1TSKjJpXRHn$7R*Ue`j})*d6E;@B652r2Z}+vO1k7+>b8^Q2Qi8SK^{G}V!p zY>pNaTpVo6i+essI}bROEgcj)6lGfovaQu^&WRbmBElH-a|+!TDUs7%Vr=qL`t&Uv z3=3}Qn@!n}tp{@{q1RV^=M77N=?x#wJJPg%nM0gAO1I`f`qw|0UD=qLb{Qd?E*nWW zU3RtcN-a^oy&I11e10+K;;X)=p3P>XLO(GoGK9B_S+tRGZ zizKX0wJMRt+dFN+AnEMgm-f7qUCtJZ72r9xfWitf1sx7u0u`900yRJm!oXax0q8&tveQIQgDw9r-PcxbET`lN-~r>=Mri^1?5dhj7LC za7&@c?%CkKW^7)gE4^As2E;_HrPy%B09+P!~mP4>>FmH|%C?Y;^BjezY3VUNo+MzFdH+ zrdpJwV9H<0x1}MM6@I15Vtv)L0QctN>!ZcVOVRHRR?<^6D9XWZ{ z97cxrDY@UT@$^k9rL)Lhivo*IV60mYb9!~h9*5Ws#-@toWnBky-W;O5>!jU{tYnlK zKkc4g{J(apS=1o;O#{2Dw`2PJ> zp7Rm0`=9O^F^NVb;JyJXeF5-xZ<|~^sB%cvoInA(Cu*=98Q4C77E_=A7g|f$k;*QV zxy%*DR9{=Vp+mWe2>>qg!U|mS=o3}9YbY36XgyRFnHn7H8AS0IiV94;RisNkraFQD z>X2PoI82m?eiKU=8|xAwf~?kYR3d7|PBC8Vp@18q^}N*-T3zL{SJ0SL{}K*xbP@%v zk)*z>&&>JLQQJzhm?zY+qoFce4qn0qX&N%C$$?xv4^nT~Z>QWRA&~nv^?9VX5|A9S zVhE=p99;zuLxX@|15>Zrx2w%RT~A_Dm`{oK4O3(NCe3~dg`t}%jAB0qCAy|9@mghj z2=S@UsQx5?Yx)*QsOFe3Ek0u!7u@KA+%8~8%S?PWsV(hKKa{+{1lT3KvYI8>%a+Tk z$8A(flG_N5S z`zB%!Z@Gc4E3<_TY)0h2aBm)>r&{K44{0sOcS6LCPBj8@PF0NY6jtzl;@pQUNRee> zD0PnqnK?k89R2HwnzD9ikjCT!|KN5vngW)M7bE1rU?wv>{_>EYvSOBn2JX`H`%*KV zD*oma_F3wEpD@>xPu`OD)_xH~(7cxS(5eV+1YbvDmIq5ywfGk3dgSw3yJ( z_ExoDF)>?d@RbP+0f33!!aSk)~F3MDK; z3ujOvX+z-4M+`8ikQbj=M3NXXnG&4wx5==u3h4@c(ko6{T1^N3r(6!!r(NynuFOXS zX8UEOvnQfda13<=&I1L(MZ+9QJGj_k(v(mM``Y+lnmtL*7emS`w$A?;?ZZVIHLb|I zR7-B8?Q)8(qr#0`RTbnW-5k{=dNri589?&qy$cALuUQwN*KFIBn)@OkBn{Euji)tI zrJ(yph}9NJ4b#fvrs)tq{o?Q&GHnaB=3YA#Ylz%2UU%f*qUNnq;ILhW18Q;WhF z6v@ZnfT*o#87EC9)}G~KKK24JZz=xTMdP?JztEU11H(axe71OB(%rK;YY^Bno{w%+ z{+HRQIs+NhG%$zm8WcWv;2~whTVU)yS?Z*W&(o=BGO+VLBVM&G3yv+>J^-b4BaFQ;}>`*R75!&pmE>Oot_hNf5 zx$+qPkpRnl?yTva%nX+%D+(Tyy=!9N0)fha)mAvW@)K<@R%$?uKL0jATe8mf5OV<+ zilR@}+!VT)MZMI{T)6{h=E=~HjAHP0c`x^Xb$q)Ax6lIdjLU}cDJzb{y}!iFUEO=@ zlEk;DaHfe{#b{IJoqPJNf!z4Q$P^POf5p?iD#h(C^bdE6iN;X)3`j6M((3V-m&PZi`2rJ3Hh-i44p&F2To>31ls6rpdYPrl zwpx?Rd;t1&LX=*=T81T;zuuy#e%Fz)a(aK$* z!L1Trqw0=WI^S!u^^7x9%tJl;X0YHDqsCDX4)#T4OcGk-skjVYXiaZ`t-mjH@sOK| zC1utI4G%3EFbQ04lkQ6i7BYdjYk{#N?M?6CO4=jh6=$_t5Op!a>KD}b1Eg;s2Y*rU zhR|5-S;dVtJ3p2g2yS5=^7Z+Hybw3f>p#+B(m0e%I)UyS9>yVgDoG~T;p67J^*EiFq0zlyo z(1jeEnFESH@Y9Hovw~p9>#n40_~nw7@tys=_}0b)C1E%4pBQ+C8hanD?){Wp#0+;6 z+7g}HL#H%#V~r%mi%+h;F&g3|f-V4i|F$y{pHeNV1HzQr2;!jM882OuR5rMx54kQ} zURX>)Dz*aqXzS4qvjRhfrm7}_gpYl~`M%yDA5u4PEN~hUnz@7BpP0+*QRHV6{XZS{ z!kfNMS~?$EE(Ih{qAJ;tw4^hdt!38D>&!RDqGs5k1m+e{c)f~5!!%ZpPlX$k+kTgFcUw+&J0B$NfueKgswu=E34G}h&Lt=$ z2^txfiyjNxc0DYU6zk&$e4SH_XhFBF+qP}nw(aiSwr$(CZQHhO+t_XU?El={FX;{c{q?OI5nw zbD>+)0)@VA#j$jQ_7o;lA*^-=iSgAe$)=_QXUV2Iw z9#Z52+x=nu+&TRCkZ_NwF0GzOA7gSoY&fSISpKOKc#RX{+iuAD_tTQgOdLZU*x6UPr2RDNYzoW>7>=AW@JV^k2>|=UuCGib~QfuI_!vTdfbMx5Jo4Y ze%YhTw8EY*N6E|hI|DI9g{Jn+{LKLCs!80i3kKp=5bgEwcnetnc%5R_qhV1@7@M7q^}BD ziWKL13V(-LXBCxDFi<-zt`RpJCugLlGCMkhcMvlH2(W%ib%x=l+tCS zh~CMrW)u}ATx_uK7DCkyAm&4Z=P#+^5ZTjB9_ysiOdV$k%Tg40-r`26~C(w=5ESnqQgKTF<=Y$t(zgPGqYF$X4-|x zK$pqbo3Nko@K<{rpH9unv8Et*1U+-&Z%Q8v)8?0(My}my{1&7HJWf2Pa<-e)V>fm7 zC{wz4leRNZLS)O>dkb6#c%pl~1v z=T1>SZ=Q}E5L@d>8RNeJOdrqo?;Amv-x>yvVWQ2MkM?t4*T>Ky}mAZ^$8d2u? zS6Arq=Ee9+W>9Mq0w|vduMQ6-FJFqXNU%kM!TRp+u ziD19bt9a0D6v=w%e)(pTg@7e)b6#+!%e5%_$UG^+Y$6G}7IQXBd8;bg(-$|TE8jGg z1f0JuMM8Q{*JY^fqBp!EpmD1uBj`|3tp!c{Z1%ew_AKa{e%k-~K>OY&DK-(aL^j?Y zV2NDK+^JhaBsRpthB)Hr)(Ojdtai&L6hQ*U#w?~5Lodx|Er`>fkOUmUXb@Vz8)AP{Ebruv$@)SkaHuI*G<(2p@yJj~dcR~!VGn-^IG6|~;k=<&#XG6C#%kFw zqFm2;;y0mYymZ>S@0`Z@pm|xr?HGl!G=MrM8{v4CyqiDNmp)0*S$Bm=dLK|D>1WjQ zQ|gcBHAkQk0=(QNMZlAtMn%`6I$O!IQ}4SwqtC7zp0* zi6vevrTrH|pXI=JW2*pvUT2E1;;35+mU7xBi0a|A(8SL(m@*9sB9Ra} zHHenZ#qW zTJG?l3dF>VeX;0xF++##sQeu|izu1C;u2DWl_8u#tSzD;2o&T6XB5lU&^5Pztv`42 zmKrf^J7p-dmM?gyLvs}TfM@KGvfPGNg@b*s!G*U9cUh8R|4-<>pw|oijJX{n51+KB zAj_P?A{Zs)o?$)ypI@##%WiyNGPLy$jl9swIJnC;Cw^$V_R=Eqze&;5JTm7x zT$wD_tnmq`0M;Ohr@3Igow!EiLsE9#FmO_b5o}Nl?)M=v@u!0IniK4HinN{%C6~XP zG!Z0HNZ+J@q)r)MFyEZ?;Iv}a#@SSu8*JQAUzC{TS4#C4f3hEUpjYjJy<{s6zj{`^ zec!D!;f*!E5DEUUu-_HTE2TPgDNv2;K=?IHM}(2OMZs^kE#=4KIeuc-AP8;ITte?A zh`3vSRK&D`mW5{Izdjs1T4-|H9X}7G{6*M;!trnYDNB5=Iq^Y;_rj%`An7X`Z(IdD z!-~jGHdr9V$ybK3UTIVEsNFoYi;jot0qo1ug$$P1TM>230I6h*D!E`F&W%@|*{}#L zXT)wW_KP0a409W(nVVR>)$k?fd4omUXqties=y3UJK18BBEs^v1x+L_qh$EB5 ziJ{g>c=`;(vH|wH_32f$YzKM{H#}Dq z^`LMDt9uiU2OG31d&$}|=LKk3P@9Lm&@r@pGu_v2;-Iw%^pg{C#NS2)tly%?!z~y( zu%?ktu?4-=9{@0Y72Gljv7|4iHWj-3d=Xb1vDLGHo1zA^N^-)SxOJsLy115P00-$& z>vFFdV;^hUqJBxi-Rhzf7QPS$4yfjn)`TAoZP{ssH0`$_&E`iKzsq9p@u?ER>*A?} z=WD}A-Y&Ab3V~U{lJ6)sE=zF*dE?goeHGd%tIXPZ16N~T6F2%}R;PeqvoTL%+A8u- zNibNnzZ$o{q$AvP`O-9(rw@L#8EJ#EUwhsozRk^Go_=SkaOaASgc4e(F@AucD6C^2 zJ>6H`=#ff~PR+v(2UbSuxTG*M_52ETh8Yf(1d%B&lVFrgl9kBP)6p9B(6m2G9*UH= z>n%OC8s!-JA5q{N-m$*P_B`oaGnRPY5RYd*x%3{l=3i&WmSV{5MA1cSAV12#$El~5 zT?EbE{B=S_I#j{0siBFHw@#_eN0uqVI0n}RgpSlxZs3WX6DR5hFquqJ3Fm-wDA4#- zG)~?$WFFlez!;-F3^Kjz2b-rbbTvC`Rd<{KPccrh-j!FNu2kyYok93N*dkxJ5>W+7 zxFzMEQ|N&?cC>DL$C1p<6HYi+kuGRA7FawfV9i-w2XReHzsAa2V{SN8jr1%-Jab8+=qx>XEKZ0$BDt_C3Vcux zW9PhNY0dt+S-2lNVMT}54)Qga+YiX5CCSOxfV$Btlc{Ngk-?KeEP#LX&CRMA%y~`K zU6JgAAMq~T<`ezAPY=4*GPe6sohq)>IPGHN>tr@!(RN27I1gs#P@@^R7$Jy@Eql5_ z!A<8QQJk5KLbjILO1@Ms@3<-`3gP|}{eih=A|}8V+|G;-6J(an$uBJ7WhZYJrIaSi zSp!%c=&g|eZWlLNK@(JjDSc&`1P~kSEQOM7f&BA7XgOL$Pc2TtB=ES2zi$F6f1Ui z`b+Pzfo(-~_Htmg_aJY1*X1z?{hFY`4V)qLWKle5_JchmC7q%ARHLgceEtVKI)~5y zb8Z}H=FRd{@Pd9l+JTOm39sO>HOduq<6q^yQN{RI(EOLx50dRfgIP~-!pZMDs3Yh7 zlF|1pYUft4^xfY0Z=*ftnw8k1SGH3!cGv^gPb-Q8n7zXWd>;?~g)7-t-##S(%)`P! z9{MEh7RnR2?S`#vBw>n3t+T&!w!$k#Hx?F7AxKbL2r~I2DZ&FM{6=P={%8S=ijV*Z z4BD%(30$7tIGy~Mf2EpZq&g+v|eB~H3Um6QI(|#Ue3gPjL{EJe+K`fDs{kvFm>p`xg-Dpa2DWY zf=D|jF|N3Oj``L(L;J(DPZWgNykDS1hv{9NKDvvtKMD$$3Pj~cE~rD@muhDVGqD2o zoq&VD>1>uG8L{J)!&s1D5(E^ew`nkoI-A@1k~v;vNx_z-3YT<(Mw@2AbEj&?U-b_T zQ!`wl6`n~J=&}hf(ZgQZIyofLr4@L%tLm^><TI=RV}|nb)f(1IIStW^7w_o~uMU z6Nn2pCf0i%HPv{iwOL5*a(#uHy@CiER4H8;K?#cz!LFJEQ=6oH8GIQ1m~hq`e*gf`MTLJ)0J2^v<-p7C4B8@8mLC9# zB%UGGHN@1=QMA{vmQ9JEHUR6l*YG8a40->APpw?tVKne^)B~ML#}8ne?#lBC+Fhjt z>5mGT*t|(`d5|EuPTQj|YD0R~Ii9wf$V_j&Pk58`aB(dFoB;z|ybqLM7>LobRyAVz-Spm!Z()K0C`UN11nfl=&c zWGrMC`fhK`tOa+Fk0&s8Pjn8d9I zbg+`&C1d%U)ZTFW7E!T%Tn7YYTEd}iQ8w&?85WG%+!6HxQ|44DJa|h4LZBe9fNheM znaxsL3<(c#=xBw=-5^&f44NOtP2xO&6s_INmrk4>KtdU4$d2y*U` zSt*P{WKfsc!M^X5Slm8gGzxU^!?JC zZ+P?2mHn*`Bz6mY(s~Ytmn)Yh6f~nU3WkoQH_brYrY+I5dF&0Xw8iQL^qh(^M8B2sZsO=sy4?W+H!!x1Y6$iqfv0fv|_Q_`m@5zU(dLR+!|+Ax97iB(gt>c!cn z71)rS5#}5VYU%+1z}P<2z~pY25is*=cm&IN>J>j!UhxX7$8(2zuv}v(P9t%0E(TRc zm(4BVBVA`1BU;?hDvK06?izwFA_3+>xaCbdrxkNanSlwi)^Te(G3Y{!g88%EQO@>H zp5}8K`Z^6`d>+B= zi98A(gOi~xN5h<6*6swpFttZ*R)-EO?Uo_aC6UGlKm#6uZfx-y2)%FMW%&N4vmw8e zDtAH;j+4W9_`nFOpN+U6N-^aDY^PnTi}I-$_}RmA3uHjINiz}1+yekuURqr;Wh6GN zj1Mo#h9YK=^5o@*|N9~VF&jd-YXHv+$3V7a^?oKb05>KDKs3Utm@2}PI_>@kO62*7Oh=kDbvu>}hs?0P82olBX`Qu5+Yliwufs-PGTP3zdUA4h!9 z?$!C5mIT*02U!x2&@*x;M)L1=`cnu+JSvpu=K%t#yn2@9#wF~0PlzPp2D+krJUutzzS7LYpU`1< z-hY4>3rgXFys1=Mx~>Rib1r{;*FZtkZji3Hr~Y;_EFl!`MTDsxypB*Sr}|kdd7`Oq zWPtRsNo%6DEBTDYwlzTVE8vY<;nr;VTN}}avP24QnWysg*$`V_!u&0R{(CJ716|~~ z4hrWh%M6KWE zx2WY;wpFh*EFBD#vZ^tOw&F+OQEXg?juB?pXJEWQeWBKW-8!RWWh%S~2(a{f0#%u; zTf90QRtyAK_B)BHO3@=(lL0RQ0xbWVOjW7qnWV*p7Y_lJ_v3epDiq-NOQEV#_)OMn z%u9d(%m1TLSs{8UYd!8MK!D}ouyfB7o{7-rh~{T=%-s9_L?l%IW_I75&m>$Y?0wRft67o@mBP-aPoO zki-Gh7e51<(n(h^NgwG_hM1J&(~E=kr8eY+Lyfiy;j8c#6iTyFo$ljGfmJ3ooE1 z3%O$ZYIml`xjdYFlfEF2rG}msA(Xr#$$Neyr1Q0St?%;x=#S0q+0vx%G#2C?Wdn) z!?FOb+JaY6ALw;9`DGH`j30*;DUEzl0l9Op9!$na29b>fuQdS>%WZ97@i1MO6^-K8 z1*jr)gZw#pZqb~>*m^*vpp!C^n^)>89spJr&S}@w`o!LfIvV5Xu2* zw>rF+Brbe}`Ca15v8Cd+cpf_$8|Gv=ksd?si#$ag?v5|A8pzqN+yhxkjDI;Uwe)=y zLFOc9yH3Kdz6ZYq}Iq=fVkr_RzAVj(ycNvwxcJ0B#cg zbnZ<~5v9)`)XXKefFVN+Od{sHnV(nx_AN!g?B^Ve;$u-Nft=b@4?ZmZ=>xsa+;!JE zPvBNfbYX4edkLx&+|WLLoIr`Kr1V>7{~g_8+4%>;qR@znAw5eEDi@eK+583?Rr8&^ zq+{;txSl;w8Dz|H`8nuM3X+;8O-bvSK`=yZtHSnXma^S@bntbwvz2YM*Y6y-RnK4 z1Vz=a^M%tnW4s@MKF!eB{KP3!nWFcwNx~VT1M@}po1M3tg4pCpis$}N-TJ{ikUr#) zQ`%@FS@SU%*so8G4hq-=RI5!hMEf91wY&+Aaa|CHmPe;EC{0ZGz4Wz+i^V~j7-))D zf*1rxcT-`fW_&t_Iv+0STE0$#u1>2h6PF^QoUO&SAlZ`rKlg()0d(uy+R)_qHIv$B75my@38tR?`57Z?$gp+>PA`f!jIXXgrl7_La!21F z3Lr|&yg|{Hcg}x45y=Hot=8{T{*iWX3!Ag%o=-pzhcHAn%-5L2@S69^1~N7-F`wMtxXbeUvS>$zUad+Yg64a6QzbI3@oQJSpZB*?+l- z$e(75TNO|aM59MHF~6Cl1}`HM!x>W{M)0A!(riTh3t|4#05d+OA5V2LG&gF|hnXLV z%t|OBwug^vZ;k!Z_x{TE5DMOGO@A5)xD3oM-=kYxM!Jmqcr4CKP-@3`T$x+S{ejvN z;9y9g<9-1WEP&7?y@+fcFA-lslwd$}tDc-!afsMMd+ORZxP+$|xu^&ehX^F1!0EXa zOB3+DXtcd02jd(@zXWE}V~3M*9{+Nwh?a2LdILpr4x_bAjmX5fUS}sjJ(rejOPXPR zn_dv%l<9c70(>9o;RD8stDyr&T}-09WOfr#t)y> zO7N>~MtQ_vBG*3W&{1C6%~vmuh#fbnZflt@h8|7Gp-sfd6x&~-VVyGA;02uFq=GZut{B5cy zB(~loiZWe+I_*UM_+tzB4u`Q;{c6G)nq2C-VZl8((&7FWRbEKJ7gi8zf-TP&w{!jL z_3VvWDQ z1r8z;B@7_f?^o3oa_SK|dOefsanAH#W}3mBaH9aJW;M*slpwMi&c>Q?R#8Q|?s}&8 zKFtK}hBSRPgY|4~Y2_sB^^)^X>w!!tQR~z%F+>PB<%d zs6A&9KWX|@qB-G5C=q*R7ULMGWDx9PZ9sOp_zL&Hn$2gL04u^+l`d zpi@YlwN&FyQ}1p3RB@R&HUBhG@s)-jcd`#YyQcOfaP;kqPyTgTCl3dSn4ww&F-}o` z6tW;{0c4}oJ?{r8#>4kEeHfwtcJjgpj4)6PSpKVo$G=S8}o{`QqjA(0luptxaV65-5Oq+RKj7- zNx0A+3I1&z$*>ahq0gW?05jS=dWZr=#4avBR{Rq~^C>pz?y1XO)aGJM8xn=)dw*^RuR7 zS{8>b_w9-bHcR5OAYbo8s%R~A`C-NK57cLLS5{Fvkq|Z}gUBvuwJ}5>m#)ivMalZ; zwYX^bm1b4U0{a<9QC}Sgf32ffsyw?4^%{`CXl6OFQ|$ zj@C8=JhiFEphcu0ur#v*k|K6N&P^o9QIWIeZ+l&qqS5TjMJqCqWeQdBm^wCMQ_0g_ z0IK=(t$h6%YK(cUU~d>`Uv4~z?7G=t>%9A=#4S`SWbd(p!UJZB*+8p0mR6_wf=2%O zgf6IT=M!@$Bu`^De~DF=G|T}9d2Q%kqb0~y6r?Ak7t~($DBsEWGm8A z)Ga!#T#@`OPEwfDu+hu0<)GK1x+5`oNm^$mu-1g$l@^E*t0s3h1zAE69)eOo6eYc6 zOI%GzD5X%~6(iyyKa^gHKWX*uZJ%SowS$UVccX%@fgRg@)&Vx`1)hU@gef+JAC3Gp zBQTZ?nc7U0DHWs!t?$pUwjH^hX&V{%q~@}aj4Tn^@`P#%hF-aLKS-MU#%meZ5&F6F z9w$&WMd5BB*QZqT{6QW3SJXfwIMZDNAcwolw_>HTHYZ0?Ysnl8-uy$^WU+Coo>av? z7DBr#wc+sh)J1)lllAIufl^T3RhgVqqdt2aBDa>S(V^F<7rM3cwV~NVIFV&ral5#o ztX$7GP0pWx?i=U2Q9V2N%MdKpDE_Fy2%$yp%|xHqp`4Ob_vsVO9@5FqiJC!~*e0*L`Y! zZuEcoHUKZOOziy~=nB79BDQkCNaum3h%;CTeZ(n>6#y!46#U(jXo6fWi~sRSzruzn z274^+hk(@EUHPQIbCF)CyDl$p5{Xr>mv9vu*uah#_IsJk0}&{lA}v4A1mqCa<8 zPEBt_E@{u@3hhAZ3CAr)5#zYzMee`rKS`rTziFd*znyI;4r*8JoErEVd_&xE)1LEW<&bJ=Quh#w%2DE+Y=$1fr?CdF%w!YI-)Z({vX zl(SB3RRFs(lZ$9_888v1N2)9!tBzJ{g-)|Q=~e-TwVU>l8{RU7P`+E#Xzf6o(T-kY z!|0w%H<+0kB}Qwb0#c2r(!Dny?(Hyj4repaYC4xx^By&9-LHo8_UpZEDDU}66VA0V z5I~quKZ~K})<2W|5+Qt-gkdC_Le0fK@r}?|D%h8UC%?|$crVIy-7B9|S56H+_*RVP za$NED2n$S~x%`pEK*m0n%Vs$Um**38>RXqY+t3rKv{Tt`%9|&=UlPKqq3PH+!*aEn z-`Mc;xhd?9(=V@fv%+0WeT71V~C#QI9Of_weuVG_2cSTwW}G;?)s z4&`=nf+!^B@y08xKQAU}kK6E>MuP?2MMMCKOdq_acH!2!Vz^kNEnfDiUb{dezQlrp z_!r|7xn*1*vP!KbiykKkK(Z|yEXGRT6HBUkH%Ab<0ZL#<`0+da)*TRM=1`+15F+j6 zLLeW$MJwa9pT`1BZ%cyd4lFngZjhX4wLfHE7h)NqFED2U6kw*&A=(%y4c#T)%$`2) zTuZa(L( z5dkPH2{bEEU1rzR*=+3M#Y=H`xgR1!t$#}X7B)^f&!`kgN=_BBd$>G zm5qZ8N`nf37TL!aUN?dOK%`p(^qc~40pKu?AD2k8O9xTQR6`~`?Vu74iRBc(MrMGc zsDJ_tO<}A&eg~Dm*$N5~AiIQ&T0*ohSYRBQOZ=W(Jt#WnI>xgSZ6FE619L>)nmzsc zYp<&RPD_&dSJE=ZVNk62Wa8=5gt=>;a6o|>_F{)zh1q1M)J$QsIrIv4qpA_NP?Ra6Kl>Qz#6xwd z(m}TXUWf2e*7pFsN7Nkos-?(oeB)k@1D1waNT4~)&ENd|{dVx^=IRo3x1Ul@NG&(I*;@Mc zPgP9iDAl#FEI|>~r*T)-zSAHMf)|5uuIs~rg(oE3`APPd9eJi|pKTw+KSRE0@cBpElXspAtH2v9$OPvPEe0A+O`^%_-7KeE58YdGV$0$??k7{(O8jWh zhchgj5T8615i6@*Aa#BkuQ*NN4^@ap&^bbiggz6}RG*DdUaGH`MIioF5CzN~yzIFg z{@P?BOTt}(=IA24Yq&?U)U57#lX%IzZQ4PzNXKiM^^E8|phn_t9+ftpCr7d;Oi%^_ zfD$Z$QUv$GubMYozS91#7tpci3&KULLejG6jpiqR%$J3=m4*sp$F=?K4e%B|;PGZ6 zfx49_XNK7oO(l;GoH(%UN_WU2b+Xy!hjJ|Jp&#U9)wRE?wm@(5Yb?U6GKI|L50Ql1 z3J+3Cjmvxu!$Azl==HZDolo+n`eJ@NG1cx)zDOVm2<~>D8OfPWTz{-97l*sm!rAl9N(S4y zyE`yOj{u>@>WZJdhXLM7qqd32iA46Q{NQ8#r)h#*rEqqwRzwXFxE9z!dQ#WhXNUdU zQx{&`4AtYVWh@~_MToBq)a__n{IN5NVG#c0q{~h8>_W9g-$(70gJlbhMh}F-B$OsC zPS^AUvELCxf9Ts0ZW8|T7X0&N0ly2Z-?gSII8E?GdU2myr}sK}ekBQW6AZdrO6kNG z_chZB31`WT7hF@>&c}@f(G~hfA%GO!`tZG=(YFEjpD)qiy;eOCXqXiI@)qCf!YR<) zNeJ_+A#w6r>cNmJdRMtvkI3)D3)Q%OdldTfXww|pP6A>3N}k1MY%r;l0q1_^UNj8n z2Q3UnEqZQUjENqTuC@WdGU0*^?=`Hr6^Fyy%G0IxTH3|0zb)=K<(s$04T?sj>}6NX zcZJ?kTehuyEs+l)RSi7ERd%j+RBDduL&h_m*C+8m%@_0(`}H}x@m`h{06Vh;20w@x5qh5jEEfaOR%f(gz%ii_gnc9QNUg5e!n+zh=uF@et;rWhHhV>n5yS=8 z&+o-U4#vwdYe<1{sG<6;DYowuM?W)SgM~Mt3v=sOl|B<#Y!$}Yd;==(PI~b z(4Fp1+67R7i)4>TD>+b)d~dXDp~!&$pL-{89BvaqjjSIZ@l!*xnhGVr>rNj`xpW`5_vd(w{F|ONGbtr7qdhIxlua%+@JA)Y?h7)PUi+4jIk) znuE&+&KX43c4Kys3_~b(;44ifQl))GVw&VxHMtyOsG7+Nw zPzzE-JAG8YyrGY$KJ#BFkZS|Mk0G`FWn`H!qu|F1rh3kjvm+^d5pHsjS8BmDXk)&C z5wp=OE?aUsH7HZE@x_vZ4|kznG#6e+x^2q>8*lgtJ7VoS)rHADI!$vf$|t82OvpaF zmm=qhYjy3clL(HPQm-jcpMsxKI$T+?znE=-7czh#c5H``?IB)cGn@UDZCrXe1CtAc z0Ylrg?H&E8D64UV!d)@SA^aet$yMG6ACEEP8}YOzRlpUh^No(w&|_JpN_77u9G@J3 z1sIAK^2haKkj*^=s%_tmmc1b>()9$W9ufocx7~GqcVU?OVytnWUvse+Y0Q!+e7-dr z5Ar@^|A1jrekJ>9ogv@J>m*P6+mx-LmvPU9j^5&^g=XV-sOt~I5+*qQ2MzwZ-;4zv z5qVPgqB&2l+x;v*XQg6g+QNeNBFiN#|Na~@ zk(INbke~$}K%xzfnM(ZB0*SCy&QrW1fQ4qG3Pm?oR+Ci2=q}**aLeg0?{h`KV-xSD zeJST+upp`bbtE=he@~K-pri8<1$7e|ARKih!0;R0q(lK7q5Aw8<5HMRXTh%9AYqsv zsMat0ieIyW>+U0udtS}+z_2#rNlivO>F4xF5BbX3RnF$76exkw-6^e!DHOxs%Yl)c z1FPBZoU6I*d#2bv_?ret@vlZI0=~5ot1(#iaGJ7vruOrPDtk|gLtJEA!TMzTuWH03 zzwlz8pnNcl@~!#BpuRZcIrh7c&jjJlyk(K#rmODCnF4Pv(0jGhM{ihL-N%J^Ud7%v zS9Fo$@S6~$uI9l|uZYu5+P-;Maj{-X%4jgyTNn1%bgdPmCzC!er(MEwY1DX>T4j7@ zJ+1-=xmmcauie9IPC{#!T=b?96x~Ib(qqtzG<`W)?0qu`$r1Oh^||i)2;oFHDZOOz zqKi3ea1blhz5~4hA&HXISz*XTGE3ta)!CybTDEf+q!2%NRcn3>A1 zu0FuFXGjNKxPZrw=-Si8CGYr#et+;L>-1(RZaKr3J1qQ1QDeH0m-OTugd+Y9^Ip>I z-JWBMC(#SHcMk?7)n;N;KV9y_q|2Zs3pY(14KWK-sWwF)aDH>>t?5{c1}v)@o^P!l zN938Qf+A{GfAaX(GG=-?PXDBF)el&@6tL!M-W)%dpRP&sY5m3P1;_?zyh2!hF3Y ztl$u40ZB-)u@&c}Xur@%Y1kyOFzd&!a0itB^7AoOfLbRUTGml2XAo7F4DXY(fHUFR zhj`)&US|81odQf)ng_Rl#QzhVgSlGu@O3RCW8F~m)7Th6>*agg&SUSiK5Rv!#bY%M z9*q4vbR9AS=~y(yI5Ls=-#x#Qwac=LVI^8c;zZ8Lm$!YP>-yY&t)G!IXrcX0v!2$3HuLa;DgMh3&;9u^oeF`_Jt z-&LlY_1FA?VA9IJEX9P&C7xXE6swV_SkY8l!O7MMhtOOFrTxceh(!%e=W@0bL-DX{ zI-_@`KqGMs;N@@Lz-5epZ5<~R4oOvTfat%(%^kG}ByvLA95B&PK%QVqKAtGm zN#LM_**+F2>eBvvl?-Qb2{rU_P7S$|YvZscS&GynrnH;@=@gb%3>F%b)h^*7JrUjt z0XZh%;KYG6zxus7jB+zWiepq@bB^QJ^3MtdTBLceYJB8V*&_%PtlV?6s#eC=|q zUruAHy3p)y4`+*!ju029TQ<;8d03gqbX#edLS;qe@)!!{(@}#HY)8t?v}jn8BM@53_d(;G1itphI%4p2cLQ_b`g)&7j= zxgeV%ftHo7>OA|MQEL*cGP668koZP>iPyI!9DyybWfB1DG0BfExX-*&aZMJC7MYF7 zDS;sK-i2k4+bCWon7kz?#BR8M(tL@Yci(491Gd%*ft}Z5I^kYP0>fT8^7uc-B}62e zcQ!i%FChIlBv#*bsryxL3|kRJ%BiJZF4xaCnm;<(*?=n1mCwuHg^R zB>p1!FKUXGngzT@lt&4JtQ2zc6y?GLa4D7a=igJzbe&{?X8!@1PPAH%`pie~sy=dUNS&2KbZjk!>(w-81jFk*$ zVLBX8Sxvf*sdy-TELbRr2^O%ZRw|stNw??QLDqtsRAx=Nj(TdbrPJUot1Ew&Vz1Mz`D_#lP0WZh zmd*X)Y z+Per5G>Dr;!`xHmXzjrPBODTQ+d^!*{Fwl3t^fFxJ*N8JYSc2^9#QNd%x!oLwhHQV zEfq~JB(^U+=INYQ7aPVR$#McT)n(XThejVPZYe_laU4dfhUJvH+oN3MYU26;=lCg> zSSfUZU?-7XA1Xqk4Ja+H_-~m7Hn3#s5E4MphxNm7UKcn|vfurgooMr);e1d?=|>DU z^yeU-E%C7Ri-G+L^#nu8<7Mi*gu_3!h!g#6 zzx@af&uy$uQa(~gUqsVfQ*wH**ogA9cTDOO zK+dh+Rv@>$fuFR*0%aboqiwi!T{GMME4!DlTnfiv%&>y&Va4=3`MmB=^I}ygnarj$ zUK)-iDic!4kONLlvHaBbH9QVxnH}Nphx%Om`0S6rM8KT^&MHj*`Y44q$N&}pDNV|)=Qe;XI8C6X?nz?b#+w0K$2 zpH>xsxND|J0F4{DuVpt>n?G)5{_0)9z>+MgqczGp)=$50(Z|@{*z&WkSN8_gUyN<( zrCzbO+`89r?Ak}|1U{}9?+y=2q{N;a z`Y&_U3R<~iw7NEB6Oy4|Gb;gPaVs>TebPhw!TyG zFbjb>#YCuQP7JGSzeNq^?bL_HUp@uCdY<^fSpFVbm_hB3Ki58E25;+0>W5j#Gqp>8 z{P6x_3KgYIf9{&GH~b9qEzu$<1;X~5gm(*{T1&A{dPPdy9{NaqxW zhBmn%QNhaDw<~ivKS5Yrx z{GAN$gjiV$Oua}kIZ-)nQq@qTl~UND-$@Q>`Av@K5ypxgwMV;E1n-&f6vcoSjf($! z+W4AMGO6EJd4$q^ehOWkG*uSZAAyPa=xvI2?ncSlHput609W}lqCBwlhXn`cs(C{^ zcYS~PNG$0s1aV%xF<@limXUNly_vQg)0KdhQ(c~kp-zf>wz94u_zU35Vv-pq>?u9*%MXB zL#2SrGuWtvqUE-FuUB~cXO>oS^%A?Qx=>Zx$wct2at2R38PDjFn46$Tu?OJE`hqwn^T zt(Ty7DG3GJv9`$$vv;c>6S_GB;RaqjAe7mnY))~Bm*T{Pr;PWEfY!{{K=dg)W|==P z1WFO*)f02DcL=`~M#Bo> z`$MnEF)n0Ld_}bp01t?~0!ABUj|G#keRzap4q}#Ga{fUZBShKu^+kY8As9TOvFL!- zd?&4w=1Wl`0l|sdGSdXG5`Be}i5jdykbx89Rk*AkZ>x`7dozrp%v~zEfe4#^l&WyHxXS%v={LepVFMO5(fd?JxR^eZ ztL7`5seC}pS4}Y%k=ecFG>7`6HKPABC+^pYt__L8OWKTT51G`3a)%Q;GM35pz)Ho? zl9aj*WwwW#=EgQ}K(>~(LryY1e{Y=oZimQ;Cfel=pWH>V^O?MxGtYI#A(p6Z_$Y@b zn#6P;956XCio)zJ^-zg;iFV$)%t$^45Oq-gdCG~Ys2(0O^d_AfMJWmM} zd`09vufq2<^+Jz^Tu){C;Mjit-kS-EIDJwIY~vUwE{E3=Xk*SZ51(95X~k_Dnw0X4 zoE?-&SpAP`gS?15nQcSw1zjDCCOqsmq!NmFW{Ok%w7KQ1nX-LeUK5ogLh7;)Vv~W;B1eyg;xd9&;J?ssz4k6imOHk(pb22XQoPo-;?2*+4Q(~CKS|UnTl|l;bx1Nx!aUGG zL~(j2VDrbM^5U1H7(7u)!-`(1y(^_oduiA=5nfB!mTiV0z#;kp|BXq5-?)k z5eXG%otQ#(T0ZRp?6Uw4^JJp`4$7CrII!!;Sb_8vntj0>Z79rVi35kHkrg>EU}LqC zOJ=L?*PVdTYiDfrVf2EGog`g@t}dD>;d9i=OL^7!UmY+AjZFbV-CnJb6RA0$V|htV zxbw@StYL_;6dZ!;YpFj?*{D@S+unbay`*L>DAdk!>gXa1Fc|A1dIumflZj+4T@q90 zS7dxGusbz2+cq^SMvDMk#)5lOMytU~Mu_8KD17h$*0*2HkiBVNVH$9Jm?ii@pwZ~R z;LwD|zO4fUOf!q6ppSvrj0ndI4wFDOkAe#-x1WEJ9Y!PRuB~80!v5Le;$*j6`ZihC#h~r- zqH1=1EY6oZ5R+7WNfoPRRxthanU8P%YyCj*dQxcw6)eVom2%Ue!6;8VZ4n_b3I4r= zn-(7}bdGjJT}%oQN8}_GWwzjSnUKD*2Uo}49!VX^1MvXfx}mU$wtk+ix}&^)s-wNC zGYI7x>daPDToL^Bg5G2A>tc{6<4PTb5HB+&XiWC1!#>@3wPS2H+ok{_zpKY;LT0ip zW9}PQimM7}8tQu_ipvPMg|)R+YS58?`Sd#GcXZB*0*=LNXv1@f*Ln6^SB$&aNNI%@ zd{L~|V!M~Cf-k5TR&60)mbe>gY8b)zT~FY%_+iTHU}ekOt!T1#2y3(nh~=O-s#aJ3 zXRE@ESJgU_#XmLBHy4^t?nC4I7mYULG8FSSK<=(h{K${o)_J>s0rW8frDG4z!EMVg z+RbDO`@-njexvty4r)aJSTIS!beM)Z}nIya=3 z@8BT7EMK39!PYHteIw^ zoveywT23z`7wg-qMYeGn{}C?R^uZN-RJrZ0P?QRCV*F`(V#RT%#`;C(bBWw-b&ARV z=TWv7n}J-wexrP22Qvyg4r5o~4Bx|{Hp0yG;uU#PWpJohc?gvn8Mvn#^A*B#Uh+hBfqJ;0^0uU)*h{qciHQbG|Ym*X|``jM7cCxG2nJ0t& z3x^#(+Z}kczCax_ejnC1Bs6*|6kgIdh1=t`b(LSe=$QaFaTLJ9$1gYxiQA9+t4J2t zQG+W$rw0e({VTejHs$a5pSozQafMoVdc2!|0R916B0No;4qNaCL_zsX59ZxsW<*oodJajiC48)+`pCX8Q+qT2-74 zni_m{&Ts?Uz_D`@N}p)X=p)y{mC3X0NV9?BO1{`ch{yo{s5u$SolRi{f|%E!<>V=n zORV`HI&Ls>0SKm*FxT=j0|%||FaoZkd(HY^7YPCFmtAb}Z06l0!uqf;fb4iwpG`)s zceo6@T{%obt*nA26yOU>HZp-S_FN`A zRuLH2l!Ql9lH7*C^c*{u;OK~-j*w|mMs>0qa}vvq`DQW+nY$*)e4qD@(wmn)G-xKJ z=31_^B?$?j*0HPH&9D7MGo795${x2r1k7#@bl&*?i*>OK<|?cW%#K={#Df{D*BE8C zlxVgFJ+FusU53KztKy-tV+_&MvUz(osSNm&j6e+cRerlNsX^+#3u{nfQEW8Z+`Gb4 zjkj=`+>x~`M|i!&=oE*rI}muhGB8zibC{$l5u-r5J8z4>73|X=F=BKLF#1nUU5TA% zNG_iT4i$~j5^*aiy1U@cu`qGI4UTM70F0X#!9gYYXxeF}K?7Bpf`l$c%jC4~u(m4d zR9GiT4)U)kXw$)yRvf1?4g^}b#JO$j-m_xPrl)W&J+DZh<3;Ub6c)B#w+#yV9p5@+ z=-&f}MO+S+n`7bnSf!kMhd4duh@G~;Df>men{G4Psp@-&LDKs2pK4;i7?mEjco7m4 zG|KKdCrAX4?cr?RireaxVcV6(zo?`D`AlIGWmrNobP|TDczS_e>xC_9rwzm^8e>x z><*jfhp}+0i(0Ay%ITv^4`In)Y}sh#$jo2HUYd@=x+4AOudL)KYNTDK>yfuba$G&A zO6x`coxr5{taL-;IJ*!(!r4Da8EaX5j}lGffCRvjANZR&`?5HiJC$04m=ISzO;_{_ ze(=_^r!&frX_||BTJe2lIbEAlf~(~{cLAEu25(THIq5t}yR^6`z#cQqe zlXV!Jqp=jG8RO%gk`O`_kh^eAG-WBQ_&1405nwBB0e6-Frp(DpBF<% z8>mm;9-W=-qWxHCZV0M1^Yo3xT3&Q%6fWiyK*NwWqojsx~rYNyh4+Axu*r&f{uC5rEu_(kUeMgDL#eX)mmNn#%`| z*6plXPxj_NOq91C#gjer*|moH45mEM{?sK17JM_aaWijsH9^ft1q-wfk~N$mO)l)= z^0vwoh-@KUFxgQWnwIoA4#rZtZP&pq!8XW4^Y+$2qpjhtR}8O`m_&j|PB9ar^>EJ@ zjw5c5qMTdg!28Hdi*stG-bsm7O-l)FEF>x3^f^2zaa|jG!C$l-GwZO#!$XALTGypjdH8ZPaVTnmVz1wor$`v! zj-nlEl;#tj;N$@~^5{?gluLy>SW@V_9F?yRS*r%bHF(FS%Q?YGvMH@%Z6y2>-o{%h zBO_5tENd()w%)zSlB8>9?w|h3xRY7sMzp*EI(5Hi-}EiVIZk8yOxHcguo_n<@zV7z z?#IT{5Ao6du$s&4xuv4lUaV3B+b$&024GzA>_aI_>qfcjYt=j&{enu0Y4hH5f`{Tc zsJ(XSR|VsVLoOr_L}-OV96g$f?b_QR`?N1c0iZCoeYi-aP<0MQ^5=J*INh}`z&NYVxGBpkMEomkcIX@hbVjcm9dmD@YO^f z|86o3@5^Bwx@6iudY_+Sj`}Q2FYnC|ix;iNZ-||#$2;_L>?h6JhJFw7Yn=Xjk2ja7xYs@bi0 zM*K#x_00nBA{)vO8_&tAR}RxdJ9OW5_vvPGPg_H=R)Z*T)yD^pvNOD?+Bnw;0G=hoGGB|nl zS4(-0>zs*ry)!!S0$5miyTz1u@XB{XQ$G|ZRo#1%ml|WgC^y`-Dzm3q2w-x)Idl~L zz8k{2%zYOs3S)SBUZ$=LY|sHOQ|lLLh=(fjEbzci{TB~s5km-}q=)D1UCqXH7{8?J zp9Yv*9h3wp6*ojN0aUyU7a99eSE3Xb2=ECzgV&4uB!m2ZP#jNFqodj{h9WjYAEbYC zUJQ~nP}cj@&m`g8IQbOK?&oX8Mq=*ec~2vKp0LYN7eSDp$@Ctfdpe7Sjb7}rEVk5! zs`Ru4-Ms$o(=6vV$3<8YuAjn2V0b-Q{G3`=_T%irQ5s&tX1P|-AOId^spzCJ`C+G!2~2fwH`&t3Gj-MjSX?E# zNBHv?h0wZgVwE1*Pq_^E1CDYm;=~nv8}-&tZhE)fJcYKZ_7#Fdyhz)|@X(#SYi0otm`=GP7lv>@VYPxqCIg@$ipFpY zP+Z-_xeeduBQXd~M0;S>@ zEez}fZKNF_m4dhslr%ESDpw7nM*JR6z>gtGlvN2oc(zO}>@tZVHhw$cC0V}94fN=G zFxX#L<|z2UC_i&p9BE8XZ9T1DnU~#1}J-$$MOnk1f z(BqbUHgrJANl%f)Q)#m(w`W@2MB$|QdgIh|L6*Hurp%(y~A%& z)x|4hFat9H5&JSb-`_Q3m)>B=a&=VLCYD3e-}+9FORO!d8wL;gJ3Hv$PTdlX#sGku zn03f;2y}oW+5nIBDG&A609+A;b^3M$16Udd#|yg~PVU(n1$=}Vvj6}+KoV9uwqZN~ z0A%L3J^%noRDRE>4~_62044xi0=acy00BfOk8&~q0fHy(o?rj~0000zom*TQNv`JX z;hN%onnr%$Z~_nbjViyUl-*uk_cu+hNCY0B00qx?F{sH^&YPH8FLW6mXU@V_9=ZSo z5BYh5g=C<;vK*hbf$NUzP^hdiPEB2PdVEeVG`k6lYzT4)U*R@L?{HFI?Joi~ly6Rm zvn|r`tko)LV2m1_==nzQ)*Cd2Cu$PQ!p8~26Ncd(JFju%6V>UrNGvM+DEI2O?mH5G zTYoav?3}%}@mcW)cH{pAGnGE<4uQhbu}_*=6X(^jV%Ar1Kri9kKv_FRP5c(vm3p4P zW|sYw;Yk^S0B+f!X_qIWp1Qhptjs6dSHarbxCvVYRvwU^tc0bC5;jTbYMBn-wqA1> z?6-E5BdGU@o?d9WbXZ1V4CuJDyG;U;6Q65PD*(~KJf zo&KfI&dPBvpA|GL!}*N+fg|npzJrH-UHrHJjUJ;9fZU0WGXggY0#h|6%A=gPt7LZ+ z%UIXRAC>?HkN`A*06In~KY$5F?)y?-vKt&bAOjGRd@ve|QEb!q^liz3G&xfyd|2EU zGL;YmPM|$znI`?Mh~y!FbVS{9maSF$+bn09)MC$rN;O7wopX*!IwLR2PIBZ%L@r1> zn7>hjR-&{8qXko4Kw&d4NNMpb_2-|PHFogY)^tyM^mWdOMsDyBZ}erav`W9XD=vW! z42|J4`D91^YZ_P=nO#@tF8aAgmh0}LWN1a}=&SUnT5A)g(ySE;cCMD7*DCYeO0g)9vHt9CN6a{1ouBII9jNc zTjOh?@9Rh3>2A<9!2UMo(+;nozpH6eBJEKrMH~mUTVWix4IPa24w4Gq8)}zdmu(JN z$QPxV((RzNhY0rS`?jXOL<$honCv#qT15xOacxyS{0OZ4&h}m1njn1w7SLVs^aMBq z4npKELcjr{01-j}gkd@i1B?#5%gkQ~!pv9^?$=z!zR$pq-@)=az~K1|JVa(Q)j{ zYNt($ML86~RYuav)$}FUlO$_z@eA8AaZF3%gF)xH6Cc4cg?3=K+B}n<7%`1dr7gkp z`UX*p(i%=V<2G~B~q z%DT)F7k467F1%juo3VZ!lQ{{rJK8*5v7&^$#pk;B)0$O_YV zplx=Xlb3KY?f}Yqy_(K&rd!I2_*(qq8<2zZ6X2)}uiSuCRiL2EDq8_;-@uB>(@!(} zF`rIGR(WjRGi590oNnjU>h%^*MiCy8roq9vid1`LKIAjt4mrrPix5@tZ`aM7S*DPj z?H;%RiD$1%NVEW-mN_paZxIhHjyC zv*b_M+LBNoZ4Bc(qj5w% zNYtYN>*<8z-uGcMgB4@Z~`<4K2kf z3zsO^jITzX;FSC1BAo@CC{WzK3aN>T{NR2vJJ6Bs`uV#>;<#_cs;J&t0(U^m^5M{f zTBFIA@X1Bjt(^%NV)&it?V9~nbiLe(RK_OQ!PVK)g`IR5rP}$@MHB)wN>gl?tRG`$ zgZ@Fs&oMPRL^SU!*Wp9wZ@#=ecvPZ6zSjl_4iRPT3MZs6Vf1TvN1 z)JM(wowqXygK+$mdv>Tq)p#_SYRD7uZRzkAUr;0ujsJba9~5|~v<$ehx|MNwAF4tV z#MZiBIDNL3wjS;Yzakh1VPoXZN7M7lUl7!I5kvBkWp?H1IO2A$)78z6emhiwuq~QY zGB|7JIITiiOO4QQ5>Zt5Mh8^H#2*Gv1LNj#@NxY z?>^{02Fkgc8cI*>{NN*3hl0S|FcF1cIS1`W7TP6w*gFB%E&oEOi!dEMijP~RFx;V6 zu3w!$06`}}d`urJ+3GNB3OAjVPw?`TJU9v+RPNbIQm%{p|vVxr`09S zl=pQ0la>xDTFy_=kcrKG;y?nB`U2gSsT{ZSFElg9<&t-j7o5#{nfpWoGc^lFYj?3a zf(%`wszF_43>5Dp-X6x9A=Y(4=EDAVuOI99su$%fzg6e}$0s0`iXzvj)-FQ6X3g>g z*V%(u@6wy=zLqAgq3(P|P$(%14?An{89QVKPq8KDZ1{=8hJ6^43zHjCViBOE6WS3) zcfPlB%bCsUV;{0WTxLjr+xwP~K=o7&VOvEL)63|xWr};Uela~f zDx`vbRX$|s;40Is>=s{GH%LkPieDu9`p&ooyW zIDsJ(!_{d^0PtHQ`Fau)LzbiSGR}q;YHWw*P(PW@2!7_7+}g7 z&fGS$fki7sn>U z{1@+W-79J+_xPrs&qQ?UakQY$IYNi@CH<+%Mc;D=WV~M%(xr}W!VdeGlWmXVf}gRS%$95O6C6K5Hq*x+a0`=x-0N>LdS{lD{kc zV_9F*ViK)#t^g9m9YP4GRJ;-ORy~I9oh<;zxEh(flKpy48=h@o#)fu1wkGWe@GG_j zK%yLXtwOD059O!83`^nandNqoC?sHffE5q0BdwRTolERBt;}`;11fneB>;NG@^saM z1mh;wj}+JZYOL+u61uijUQG!;8y#A;J~5q)76`CePdJfS{3|ByaW8Zvn%Pm&c1uqf zcMHxf{NyrJOFMwTyX)}$Y<6x&5wB1hOAlK^)5ii-%D=krt_maiJYM3Bb6&1d_7lz(Cx->%;o~XFHu4GVic7eIFx;&!FC6B zJ9k>Bc=UdRy~i}p{Lq4m!^3JU7n*!GlJ-4#<~3+XV*kcSo;50hI@HeH=w8>NJ|{KAK55~f`$3p;E@Y| z!^6XnAdQS%W@w`t`(gW3+b*M;+H&ECx{RA2a~aSc_vx~<~BZhRQGUoOqfkb&& zd54MR199wZ^~)d0a#~_=^Y{yq1EadgvNa+&Mk5!Kcl-L8?8LqaGZN!3trvN@uJ41R zT3CBxPNCba`>{YdTVr;~hbLIY zBc%x~El|OM!{Wq@ASc_T(!rS3q+kQyQkQ$<3$}O=!X{p&BOc*9E?C*?ieBERzvp$9 z#L>qx@ndZ=$)N<`G07$3zw%@z|CRDctv^Do!QC#1^zedLyd95!KdO2|h}S*$_>vxc zn_byx$iM8WU=eoA>n)7Z9PEluEfTynBEDK}oK^_6!zg+WjQ&dX9|pY0UprVa*N1!D z+=V=7y-Ash#%EPne;kA^GqRvGMSVXF=Y+T^V&du3hBKpZ+~`G0=j?<#C8}E9 zJHYb*-XJZdj+n7VcVM^!!eL@LmtrhrY;I$WL&dm0xJ9CrR-DDhVz2FsO;@kQhI`i?2iD7<709V_v85c~&zbD_p9JX}Ey`~w>N0&po&tgu| zG%5J1DHQZ>H&xzd=OG<*?Ev@beB~H7AN<m|(UO*u_zo&yHd&wBcfKx`&!^LG&H-4I<7%>a|D4orc>$~l-TdoVR^xTk}a2)4wTcjRhQ`g_;OoPF%>rMZoZz2yj*P1P!i<3_W2 zcpbHs0^v*WugPGJQ8Oy+_jsVJb#fNJ5X)`irCuf={bwaia{#Op7or71d$oi82Er@Y zcRSjhrE&SwBu$X4plX_mh;i1ymcs5|4no`haaVn3|ff zTH^WZDV9Xw0CRTBec|4hOg53c3qy@1X#!D@u0-HXh zvp=Gu_HLcIr`_a(M5AAJgDqbX+|fUOnVf?jvA;~CiOdvT>l_gmFY}vK5N11Z{Ja-# zJ&*gdCCZALXj2@~|BSPCA)&;(25cWmt0ZSY6*ZyAcFokC#B6)@9SFO9QTdf4u;;%j z%@%zhbE3?NgE$NBHpSCN{3y49XEI6H8Cbe|1Ee6JTV0D z`9ZJf0+lx=G^Z^-rz|+x5&6w>(y8oIYCp(uc~O)MGan4py4H#xBcCLQ<)PKy)@pt;L`cV&IUmrzqPk1jP`?;{wI# zj|d*5CDrey!?XQdPi=??S_DiJ%VX7@Gm3H0NYs`zQ?}H!;GL1yL^wh4(>mVH$AS;cZ`#X$h#N&uVnWEy} zpZvQ-7*~Dm&R5e61Yigd-Q$GK z@bbFmJ>XH3@94ZSI;PU^l<~Cf6@Zo?y z?6{l8rgUH1~mW)IkX04IDB(E7(GPr z1mv;HCsZLGybLECZDiDb`gVU@C;r)il z-4uasTb@j`@@Eq3lvt@Qzc-6<7CHl^o8V>5qpbrn77pJox}2E%!ZzC;kKoMDiWkGK z3=`tX{wr{iRUt{ue>u`Ly$L9Nb?G0u1@Co>9jvDjlP`wVG$Dt<`60F;yG&q*Ab!<6XW zUZUYX8!rN@I~W)}Kav8Y`!!o29T-QDu_+1d$?#sFV|NaCDAV8#)-*9LFoV3)N{W*~ zF_ACm&#rTj&_a^{5Q`uaiQ&ZjOD}zn-Bg$wn}y-Wb!29Rpsz|Zl_MP#K?u3mJl<#L zTFzbh`=>m(S0q)x#QGljm9m!PnLndEFy>n+ucK&_!LK)uQ9q^#@^S>9IsS98X_&!a9q%1q2Q0&SSy>}@g5-+xLK`eEXq~*==eC4s|koIKyH$Cnd9jr*_f9UjkZ! ztBj^`O{?VE`)R3`|7Tn*&mwPs>Aexe3uSOIyt8Adh7NrBQkxq%yJmHk#%T_AMJJYt zUK){KEjG?81X|&gJqK~AjFbK0$PnrGR95by8x`#OxuY0uQ!wX4pK*U&X_Q{mEWwop z#Rj~!iR3&mooIguH>9#i+c5* z=9UTWUx*B~-3GP(sL*aHo*Y~)mey~q3nYL3&OpbDh_799-=}Y%zCCTm^!r%% z@u{)pB)y(=?~+Z-EU@y_`M_GFp_If2D2IwW>&-aTiJf(4JhV6}`Bx0`In0OT-9lu< zQ)=5rgrfHrAPJWdQMcj0Na4eizFu-4z@e)z|7}>SG=Q^YEPVlxtHrRY_xTa|L$sqGwLgd z_#dr*3tb<@E@<5cxlrojaMFCeeQre+-j=G=!3Ztb8I#`|u$ohjE3Krnn5~oxrr%zrE@Xkz=yVlPM@iu%ON~@mko|{r z@E1!f$QHgup`!-&4S=w(Wi4xy zr@3YT2phy-Q#Sc87yH6f2OM_CZ)gFmuE;QB$}FIW^`o&*9Mgx6U(So+i;(qu!2W#n z{LGyjcz`ai;n@2YOLA^R52W>m*@Q?G0Ou8voga@eH$HfA-Xv=E7dXv`w0XOyWh*2; zEZI^P-v_~L#WO`nOKo(Sypq!m<`Ns%jjms;)P#fQF}z zU;vw?O*kv8PrK7z(nzpqzmM^S12(3eQ_}eEbx;&$eym?2hD&wz=8@X<1zmKn(x+eH z|F*fFASWVnTqx3cfpGHl2q#QP=66BTBhND;*@!UVCN^i?HyRwpRg+d*6f(%q!3VP_ zoMk2MB8!>E#MaJdR6fvO{LB;!Xfq*o~o7$GgwF)3RPn>KcX9HV8|i~a*bQs z3YYP~0IK8iXIuFyj+&@54_`t;@6majX9ge^KkxKDi}|ah10$z%FaO~zDBKamtE4zz z?joALv978EVEQ zRfpuBq4M#bMw$-i%rYU2bi~4FpClh!hPL>)vFESYjC1>E2hp36RxPyRPiQ>#aj+=j zf_(Rm0u5HlNh%gN59|ravaabkQ05Rr9Ag$E3&SP9z7PXl{YiPXCMi{;=(&1hz*8ay zj~U=o;Y{F8uS9h?JAudCh zDg5p|3%7Oc>)SG1PbjV1`N6#CCRSz`Bg__gq=S)t0U>W7oEkzaC{LQB5Cto@)Y+N#Xm9rpO7@`n;>OxBv@K#6VrU|wqP$OrcjPuj8 zW6}o6>vChyG)4!+NY^t5{@XWP145F4J0y7Y>mjv*mBg)14w)P5BKrKmr32(xUUMy2 zw|)9FkMw>JO3-LHt=wQcuMXo`c3a_8>_`Is|7t*RO9~K3&8uI}%)Px$1GE+BQ1A5) zfbiMo z-iYuQMb*JHfA&kLN%j2yq!Rx%8Si^#`%UWVXj}0he6{H{=>a^7ZF8!74#8Cn5VAWP zGwz+!4q~dwt1U?z9AnE5??V~a3iO#=Xtp#i>gIaXhsd`osYe1Cft{5`3p!&&5IuJmtb^ zc{2h|?!^;D4uK7%#r5ZBcH_+Te>K;Se0?2*uGscN`=9>67AvPG+L>)cwKU~4yvO{; zzjFgjS_AhL9#F`sGO}UR@($uj6~E5E0s;|*MHu+tey!=H69hvy*fR#AR9ZkOX=wam zz2xi9GKQE*x{hcSP-F>NNG7Cv1~0i!9M`T7`LNsgNHMy_iZ?tY3U9xMCycu#39`LR zVKZ;T0U#Fzr$z~C5Ngy#0lzpwDcVvNFNfQXhY$42i|inHLVY>7U0R@kMu#H?-5Gq_ z&>Z!S8;LVc;JsLJ`TC-0$e?AIzv-&D^IlrlN@Ux_49u)3lEw5W|_v|WZju( z9=Or)@qr6;Xc}X=!6Hco6+EPTaja%tv$#PKS{nxJYztj|ba4Di4GFZul;3gllqk(s zQ;}kg6D6q?u3`?L1YN_RW}LL3neH zIa50uLZk=*50b3q{1=1mn11c6o;2V;8vyZ zRxXKMHY%LtN~e_`L@*#2+Z`@Qn(FbB#EVG47WE*or1Olnf7?s6{kp{)-B*2T54tCx z23^FA8LN4U$o-&dd}ZvWlHIVu-XX8SH(5%o3g(oo%(Ifx|7c*8tHlK<4r^+Fm(ASX zqY<9LrP|2H7{${Mbk(dxjl;zPf1dCN4w4MHg6TXHrkXboMM1ba6kOS zqcwj%ys~i)Y5~|KE}Du-VC{K44NX?qD>t4CF(oNHAEc!hx)PeEHZZC;oe6}|xOtRh z<&)-_6&1bF_jCw24nJM7>Pg}nObPj7hi?IP#( z^2+F?D8d=V<2cuLCbsxbat_Fim%6-te6lE>^S+fm57M(zkxG&mP5WAKPV!;hdpoaWsLF;Yy~;90{s1z!9K!pm zlMoy5@6zr=x)>eCf?K((m9=kbix*vdv}#I#%d%#abe}Ma!8|hVAYe) zG8vjBBm;Gj18Laro~wNuzs_)qmkZ|!8jC9*PuQ^|OQ^9uG40;WD@?;|54m(LBksyXJAr0J-<2@uyqj!t3ZPDNE2YSJz&aRtR>&KSCcMWacgM6KO(SC+ItDvislvNcdC7NaacD=Gw@ z%-{-dGVt^tkDuo;aAp1Ud0p#oIW8bWhZyg3_*Py_;B~5$92)9BGHJUFjJ0k-b7C^+5pgGz>>sL8*~N}+k}#B)u`GD z8T!t_h;0Ug@=tf53Apf$Pb5m$w6$j&D+aJUgZz;Dpv?e+QOmPP=pq`XHAP8nw{U{f z69!}~_h32tS9{~v$dvpSjp~C!_S)Rp(~pB^3da?)ttm|*@X*F`Q>+zo*cI92xxDx` z@lY3V2%zVrITFg3vwJyg9Djt>g3Q(y)im+d*(iWwcd6vIQEamQR?<3cBF((09xqHh zO$Sc8Fb#A(mAbK)bUhD&i9+y7hDag2*%VKOA|ztogh1I|%{*09&!WW%n0UI7lL>@I zsx_CW&f$8x+1W=%9AWX0ZqAb5)=6d(TaMtz?KjA%BUh}Xh`F#r`Wa0RO12|KpmPYt z=wq~(UEuajW_6eqp7w5K_1H}bbw-ZU^bJuYhyUJR2EKiW*|d7`&@$kg3K9XQD*9k} zfIZqK+y8cVx?qOUf!aXha|SX{ItD6p97A(@_!G4-SOaDCm6~#n5d{Ol++m8x82AYZ zGtojO(tl(uEvWcthn0smudQ;zV68Xt97mld?6DepRy^2)+q(D~*XVO)t9|Nbobc7f7dB0>7NTRI0O&TLhX7z-;W@9M~3bMyn@d2#_n0K8C{o8f=Am}u zxf*DQ6RddVkbqG3)iw_|8Oys#)llX3agG@ZUZw~9lKToOQ&I3mT*qPGH+u97^y3?Y zAGGGy5dKmK1&c|wJk&Hdj&K#A)BYiMp(iYhk8=kPHpZW_ttahh(4xO9M1?#M>hJj) z73l%4iYr;eCBm&%#gn(kH+DAs8WwL))yW4yZVHgS%IFVdq;#EAj3~gmrQ5b`?zU~) zwr$(CZQHiZ-L`GJ?>;9tGnt2}mrClPQmJGme_?%V=2P7@IVxQhfyUcM%_fDO%YX%O z&=ilhm}JlZu`&vkP^l$s#P@XE3b-&%2j%u3h@GPYhgfr-3SB zgl@lGh<b?EG1OW9eNuUq*GqG9qsipjI~zF(@8k@pI_YcEDh zQsOv}$Zxz1sKW|YMk6}%Oar4wbJ{%62Z6`VC?NzIU*via-OmHA3iT=RoW?})-}AdL zbe2nU09+Brn^JkAq!*Cz7UIKKbb{YVG%Sy8iB%mBH&hGkXFS40 zoR=)0`qfciT)X-bmK|S{=VowFp8aDnM2?V~f^VwC=%08Sh2zU6HPBOc2eJ4U_vp!@ zop^S%wWy}vQcj1Hl|T6b!%FV(XBCHu<;ZWa3!kX?b1!#jA)1Z9%%)TAsB<&Gm=VRA zZLa+KRe5+FUA9vJzs{=-g?SSfI2U-|#A-Zvw=v<7UP7E1CYCiRK(>;%SD>(qv!JH* zZ6*%xW2g;5&o6}CI6Yk`4WNcc5%AZ55koHKiZ6T#HhtJ2EYHL1M+^R&r`-~vc=Ad1 zw2oSYk|hBmwLekQ>yj3RoI|;An6dANpVNrD@tf@Emwu?Ly^?NP2|T1irr5 zw|ow4;}yZ2Pv;)Y+t}=EH(zjSW#fm-Ypreq#o!`DBYNOMM+)JKRlM1> zo+o(|?~IK3RR}2OsY^D^&MMT_Gp^~T%(}|yKlwaPmwI>lzzdl(QbAstW+{$yO#KcJYq=2h7()`zks!=v>q zKyWlLLHe;`lgjQGhNL}Z{l4B{x_k--GHRSDBdz%?&orNt42X(3p!=JD$%hJJu@u9r zC8sQxJv)bvwSsgT`u>8~a$4K-A5ManjHlgt$c?Ekp=o*YC8@9 z7rcS^1#sUpf@e z%apESZ`RhxPc673R5AbcnS{&a4PuCjh-s5G);SFERikCh`Djd7IbSX|nOfd1E(|?3 zr@%ZP{x8@AmXZH&R8rvWN10DiX$`_aYF5!P>)j%B-Lt@P%c_2j-E&FuR*aUCwMZrN zg_EMEM(FY>b&2$6d>C7{kL08p^jr+dUOEH&T12j2EP zfQ`=LUs(-Jr}vunYC`cDO7=&K%#N_~Gu}%O9i(~fK_vw56Gb1iuo27X4C6u^Cu3Ur zp~>b-$4d7U?Jx>OmB7Gp(!J3kXTO-%2rC$Wn6047)R9LHl_a#!kS4Zuak6vjui$nY z=T9<6Qmy_0^uKGB)$tM{1p^&CXO`Uw$HW<`?Pa+E5~3{(1ze8&;!i9`!-4jY`q}tQ zobl}R=+LTuSFzCxw-x%QG|%0<^B5GsDYPWIpfgUY?bq{``A4j71!MQau&2)Pq|o^s zAK318?}i&KWz^@)vg^?eZyC>ksm^6TB9tyorI$*hQ7?lK1v|<_P4soGg&saWD8>#K zHI=f2yOBhK;NSg9oCi%WZ_6-Zb}U4Sj|||1cV*-5{noL$6$LEpUqA_OnE0K2A@*ig z^aVm*Cn@5fyQYN!fLHuZ2=zvQ>|~W5J7w5mGE!4(=fUEDT>54x7V8{|cYPrAz3Knr z(yhhX!xrA|&IUUV4feLl2g3o1hBkoE%c=IffK#8&p2f_pzDavY0RuM2Ns%f~vImom zwxFdt`g0lg{>>F-- zj&f&Lmy&jv;~iQv0mJxcn!kYAy&vJqy|&GUKOUR+ogFi@YZ1T&@*YqD#*5U0UHvO| zEj8a}Hy$uA2XlJO9weJbzcQY}^^+FVKn7l%Jc}8`jC+7TY3rk3Y;@7{H$4l06_mdy zxST^OJ7_3Nvp?Cfblk$|MX#@00}Ao_D<>m$kgrCwgm88{g z?h(wbd?kO;ovQn)3(0)r7xBK9-DB0g>lTL&n}HV2i2o89i9$z_ZlAD-pV&b3kB081 z;V+XR=pi?dz~I}9y)b%6S_tC!mPJx`H_f3#2*pXS;Ss7JN|5QC=5rdl`pf-^yRyh0 zq)Dy+Mu)X@EQEcu`3u!y-+ol=c@dzedxirvscyV+K^wK$IEg1&(FoP})4w|dg{fg5 zl3N3H(l`I!TfO z{r5<2;hv&_4BCu!H_)dmYi;32uklT~FP6DRyLJWyxz4_zk}%=MWJ4jZmRNjHN7n&` zQ&_hZ0$^_r7(PGo76F{`F)n+B;{~ktpth>y_A*}tfj8~6cJep=@({~B;p{a+Cu~Gf~2PCZ?)WOf<)804;C+Tahf3p?V%6kdvwvbdnI$fv>-&XrL z!cJeFF+=_Dqs}bx+UKcK*HF+yG)tp>)vfcMigWjQrbJLpe#+<=?cnCNzM!wJyN5fI zM)@<0Wp{Ygs<(LvAhhYic*2#tDO5ZzyYBvtc?pAJ5p^umatA}VRAf$Tra-BO-58dE z#}<+LUSq164@EK+++JlBZXt>H-e?d+rTDU}UG~%CtpG_Bs&=irLEsnU#9137H4nbaV5!9_Mh=z7l&;(tx}R{kPa(sUyAP zmbm#GZWrpxix)ST;F?LY;=<9mfJWO%cs7@~sf7kUY731m#29V8?kKjd6y{Ne!;@^6p2Gp|&+%aaNy)Xv zpOWz7pkz*E4mF)g_2!*OB%v(OCFzJdo8p+SczF($pBMKwpy%LhFR;i~CA3lnWeZ81 z3f$tOQsaS0IQ+%mk4Nd;zr6Zn<7SII+Q(X?7Ym2=R`FA3I66Q7c1dvE-nF0e)X`(U}vCN1Cz=ztd>I{BRO$G-hSRJ zO{tKdz9#^rsd}@{UW}xx)SkPBn=L_0w0Cwc0m99-_YMIuGV0YN;+#l76Y$#_m+GG@ zuEqmyyh_Vda$w@;w^R<#wI(G=g#qTZz+EdZt^_B$7djF=Qt~%8sRiH`RGadC=$lK) z*NL&TkT_G^<`Lrw^8ZDQic8iukTtrI!HxAo_7!04zf!QS4?N_ngk@_;`$S}~6vqcn zy=8*=;oJ&5h;^ix!j{sN3n#f_7}HytH4d~eu^9)!ijL%R|*@B`TYDnanL z|Ll~<;Hmh^VOd?tMX@i5TPtzMBjYVwm=i9}iq50g>vYdM{lk2w)$yzp@HFr1U6M0cH%oSQob~ zBQ}^UsJT2R>5s|`R~ey|nD``O*!=2Nhu`1tkqt%wTy!8BQB9^Xr_#$EEtzF_XfmoK z&08k&_e>wP$G$OI(%e|LlNY}Sh<{MLq=gXsqD_g{RDQM}&BigN0mflKe^pE;`*y>} zes`B!mjV(oMC3jiH}u~NKKn^5Wg+6rVA~ zwK?wDdz#bI57?^Il;kIBcBrb%mrPRLHU4+D0BCIWBwnBh47i87H zfDFrLo8qN6MlQo{r{;;-%8gle7#5d~^oUwChK>y!XWhx+i>0eT$dA$+HckWoJ*SKZ zYac48ea-aHY|PNEshW2Rv8|wZ5e8u{&|L4U=*z0%m6s8UE&ZU^mIu;n{JLw~o~ zlp%AB52rLOD#Xo1fF2w5KWSWJ920wIfBG}4z;lNis0bqOe8?aO>S-JTait}_%xq@{l4~7N2)ucSBH#%h-=9(?Uh+dr1v@q_v zL1S$r*mmJc9eX2x;sxn5pvQDkMz6IiT)j>APZ3$w4}2yE&ipVxSmuGl9JeQTBS1fwReAuhWS0~0fpECM(&KgR90VcZ2qc3HhiSR>i=bTx1% zSy%c>h=ntew`2G~0&31BJlYkEjFSaoud+MDR&{!j3;9SqtiW@G6qj+WSCoj z2-qZMB7pb{#}YiZDob2P{DyY@H5^$@vydYL7$Kv;4MW|jJ!V&@737>97#LX{-n)J{ z!aMrJ13JCZxUxj}9z$gIz{Z-Ngq}=8cBgcfB{q_wAYjfU@99f+69~YzZQZDC@Hu2W zqmzcRwj8CdLTRv@4oFyMH1HB35Sl0DvgS<1Xziltz!A|vP|hYW#fKnrEHL!;+q~}Z z)*23DR+9VBXmQ`qa>BOsc zRL|!h+e^`bR4!0G{;q-HSeQVp>(J@vqHH>X)TKnb1!*bK=Ezo$dLv~oU1U*fO-h{B zv;p7?EQD7y@th;0BRnCzL<^gR(rsZc4{&!)0iG|u&fO!^dO_^NX$qtm*AhVi5CC}( zV{!@)zY!0vWJ~!-mYvIAHfOzQC1XLHmIXu9b$`$#T>HaX+{Ku64}^a1Ko;lZHKIG{ zTgqh11wTs_DYi=9hU4)$8xd^Vb9jyPY;Aa{K30^>k^w(dT}T6fjJ!|qK(b}on&tWK zZ5kPWBjB`iu)nUjUdhG%Xr|CBAt5aKa*v>1#J7WC1kf_=oWodR8Wh~rQ!wlxqdr`% zZ%1>_hGMN34Pwu+4@VVEi0h`$wGPWbLiw!GJ#7Z=*rt$J2YbsbKi!7o{D4(n3=J-m`NihHc58sG{a9} z-y@(AUmF-4=cF@1%eum+0F8KGd1Mn9WkW&Z#)$80FA&>Zc#(}h!L|zI=V=MYSVPGI zjp<>mS>Z3w;Ky6?oVKKYQJ{Ozi!P;G`%F&vegkKol0&dV0f|Ex$+ZzWMLt#qs@pe_ z+4cz91UIMp(7xiA{GG9I^Ri*v9n$|5$k0|C|8dveT4k4L zIrZb~wlLr_D|l)5b}$Yc%@av2r98s&JOpV7sS{b#6Q`NR^wmxN?qsSLAl9xD65$u@ zHCndaZzBkF31Jz!G?Q7e(JaQlpv2ZAX_fwT!q6Ff)DqbX0;gL-?j@zUry@92R5c8v zhMFXp;vJmB^^)c@qAd`-_B_??FmUM<$1wS1cQJJ#yI>J*E;Sc9f!6EkGleul37^GN z*GYiFW>gC-iMnfU-tRZEO}>@DdVzCTTfgVsQx4K4(`BTOF3Hj^=L7QjrovtECOGDw zvdGx?J)iZ4V-=j8hC@WTs$w_?;*WNWVf3s@Dyb5l!i--(Q7pXs0wDXX4JIxdxpwJN zVd))5?3Gjh!^d3H{uOjJhOKXe$r1Ock_mJHGfqBoZEFe1(tE=z5Zix4fiT@@CubIc zn_oy3+CWAuuMXeO}0Hah=g zei&IV3uOLK!5rm8D*0qB8H4dg)Eu-$Lp&F|l%G+%g|Y2Xbsu5iW*sG(Gv3#0&a(FK zr{uXtG#@3nPgGmE4u(uw@jgzOrmy>7f2{Vu5xnK+PF;H+Nym5RV>u(-T@p?nJ0Ot_ z*zZCZNTTnx>@g&kX;`eGuNrC-&}X%qEoxqW8(kg5y<~k%uNPb$4g=nU9HWujks)MR ztm-fPK!%K(+ycxML)84YaPR0Rmfw?!6nZ3=NK7(prL2(n-z?XLK14HR`CedjL12316cRTMXD+Y5OzXwIyI(Ss4SF{P|5oWF;@#yKJCRCu5D4 z_w7!`x$yS0X?FkMU+&>t0!n}W`)CAIU2Kk~>Yf}^Gsmv{e%{HleZF)1RkXotC55}gIfmo$i5N2PINA-d z!PFvug!oDxi{PKHE;0pw<|}bG1?b$bQyCCqzF%&f;^_SVxy8WLB1iF!^nyALo$BBtF zHL#%&&nsAINBE-d3F*FyVzqyLuLT?QT0Uu-Uy#!q9l#d!W!awG0=Hu?e862Zs{@(iy^vc`v!*f z6DXY`CHKFT`jHE`Sws@y;;7&Wb<-R${IsRe3-aMYn|ZK(Zp@7y!YW_GRdy}df7%oxW?gfQ4t z!^eq;Eq`_1o`#KKi>`#UyI(V3ShzyvX|nX($So%@;fHf1C1u4}OQI;93rUg5Y0uu) zIK0GPZn&Ri&H_nOb?sXiKoquJnMZ8EX4TFU?SACzF+?YsFvNE%!X-;{X90X+@{__= zDNHi#-PVkoVp?LPprJv-(3~|p3k>#!jK~6IrK#Z1Zj@AMd zn{1XdeO@JJ|CPdr9@|dZS#EnidRv7+H_%(iZ=Ij*a9L;=)x;baOo*8i34e<01d@EW z3)33iLA6gUf6*am%i}hV5p#!KPT<={7guT64^8-$Q)A2A8XNq+F301h&I^dRVT4!%d&A&c6> zez&*`&5&C2>)vSYj?zkwJ-jSMUSBID2i+VC5`l6l?2@s<@ysOMhVa8-RS{<&l`@X^ zUC1TMH3otvQW+udKr&O%+JNn@$FJF@K6ZgF(+;wgN?^RH1H`4}y$rDn6jOEb_ZMLj59g z*cuEGJ=$ea*k} zA3vT^6gp3jCIpQ!O7J{dRHmE<+6uiP8Q=T2WRl1vRoimhArQh1(K8}1frwZk&jN32 z2OpYp&kMj4m`IclAGrX+AA33=5e*SMc5uBzkj< zTN!Cic40(B{^MIu=1$;OnItz4c7|DkK6%W>_jWf=Cng70(6p+_n8llS)e#;rd(wwd2#v zA8QC!Q#^&buVe&;`2I#sL^6YB@^Qa;$;W`oenx8X3)omd>k_wi1HJ2esbz~%ya+qK zpTy2UzsBJX77GRAXsu~&s_Mttmo2t3j?UN@0zE7Bj`77=3?KJASX-D%!X$%=~!dg#iv*Nj~bga>SUZ`+f_NK^&!-T;=d_HgMnEcV<_ zUmS)+i+(@l%2ktWh-p+OPOV)x?^ek!_)yKvGb&})1q7f=Se^jmNP?;w#bRQu}EF03QpU#&;eF}rWHm3bSnU8#o%ho(4bX360 z2NvXmmR{zilrjfy65goh*!oZd1_LZKU8d+B0xkw_15Oq!jN=fz_6_Wpg(0l%3=Na9 zn=_g2G5be0{r_BJDwx4`F@5RQI{s%CqWNx8>v*5!4_-0FCxKF$3lw^ zEen>9o4ZIK-nb*$-gd2Nob@c+NQ0&V9^ApTc3guM-XTFXY}#?jjOnTcmhWH162%<( zJ2+{WE#)SA+j}#*Q+a>+HGBu~9iT_d1kcK)DJIOb5^)Cq3F%)8rn0I8MJNb52jKXb zBJKjN;IAX#s$5z7Y%fD_?gcC0xHf242yG8MAqF)IJrtBr_29N^xIcb*y8UY6mCvZo*#AfDi)V2!NRYZ)T8^GqFG0S*h#_y5&N5t_*~OY2poL#p zU6QCS$MhV|5=8-@{|BENSM@;j zR<4EzO0whz+`#iN+2R#?=-;m2tR9G>{cR*}yx9|WM!pxPR87JTg*TvG{xLYkv@=?W zj4zTV%J(3#ym?I|ilN1z1U?3ynL$*irA1ERK}})jowp?bh5WI$)R~>)`FF+5hImHF zA2-|h){s0gHFm6p@+ACV1}Sl32>)p$?Wx4eQ!>q#(@|?f%RDGryQd>-MUQUj-M7Nf zZO$>OiO69kGx`&sDZ`X(WK3+1|EJRlXl=pnt7d{$p+dO$kLIdUz&=;bZj%bsYzc-N z4*UxZ%48)?#-JYcZFLt9bFHTn6}V*#y^G`t)=2m!30R z!eA*_+9gi7KC^dhL4Doc9+yO*Q8~e0d+Ro`z5kwY(dpTBQ%gkwh>v$0XD!@C(;}7d z;l^z9R$0s}=C;_|68f{wiY6yuuOky$D~DKd(DAPc=)M}!M@4hAPX9@ocEkE8*KK&d6;6-t z*;An{@f*Ozl}dX{`9OxbzUV!Dw~tls6%?2iF{wYAcSLNpQc)Jt1ui8Cnh6TT-?QFO z_gQOGokWr<_SL}%wJL<2{msC=-)v)Q7zNWMbHl54u(u<}`S@Nb@ zO+?!#VDmSE#ww40CZ;6=7U1gA>I40Q?N=dac0ZHc-;+WW*`N+DP&cm{vn$UYdlUm< z<}%G9|ESMNPcd#S1Ft$&`~QdqW)`pQcs6>(Zw)|r=SggliO4&`kTYQ0q2)TGwjQx< z%AX2#7wa92$vTwFR$&8IEJnNIftf0dv{aEZUeV^zo6`|_8CO2}qw5@^;kxy8)>AxzK`vpG zfBVbsYbjpl%QCQ7`^GF^GLIklf-_n%37NpZ#zGZRPQvsG#K%4HkhntS04UPTh(`6# z{dShyGg=?&;sT=Mnj25xo~IxY7x#ZssQa~vDDCJBQR7r5RTzv`eDs0lXAX8x|3;0K z(Y+l-$0L_P$|!6wM-NAJHS|5q#%N)%((Qwx9DG+H@(9LQmTol=9BjyDGF^NG#@?$% zB0}ZvqP&l)t$%jr@6`BqWr?2I!DVUHfEcDqP#tktZ5PXZY_sSmmGKK+9k>fc#6m+; zPBFtdOsYrYZu3K#NnAvUq~%bx@)S!Y6YW>z%&=-eI88E^PZHdvB|)ynqcioOuv2^D z9$^!XEm(2nmPenM>RCa`A>w~CeQhhrh^|aF47hzLb_P9fhEmK3SQ{L{LvVz zTy5F9^uv++7c*IFNjN2qlX$fwJu&+(Ju#wGCbLo@uXBWq(6NhhP)v_>8L*Ou$D4yn zn4N5V0z56QaW3q-Lc4NK;(kQPJPA8pJzdP>=I0szONVkK6Sg@^9(W1>fF+sUXiN1D z3?ss#Zuo_N6lHVT@Fb2dH|$o$61$(W@QfL$T!{vaB>k!F)J@8ud4|ABlHwgGzOzK?POxwFw#8xA|5p#DyEq&gUsS606#b zL;WwHk2HVjqGyxSkM0htOACB9Svm9bY`<^g-~IBZwpjM`OZw zV)8LWqI_2AZ9)bBNN3@qfV%oTwNO5>xzpZL4AwpWZMj)0#B@@2q`RM9fz0Sn+?aAM zJx~V{O1ZyKrmRXsX4xqY?=e&9w(#Sc%)#+iG(d+Xa3Nfju2}#Or zCQ)UraVNC-)00<0Q^6i^7g5^ah&2@q1$b8?`ITPFOz8mFGqu_YQDcG{gr@bvzgEw` z+&sc>%~NC_cMGMW%Dal!K$=j5SpJp8Y$>aDwN!%l62=MTO5T0l9>$g;21bI;2r+i8 z=A?B+vr@bv@`b3vz%cgSrPg*PLg@=X{fr?hF2tbDhb~*U!6|8wu-B7QcbG=H= z|6<$5-chmj=#i9CA@yDZ;!jx3R{vj&{llotoFvM7^gZ=ODs_;Y1SFSTI04ggC57*N zKR1j}^esu$$13c=MFIHN{@SG~;3R~tU3(9*2Xv+qT^KkuWG6k1$Z&<ELX>DQ1Sf@vE;gVXdWQ9Vt4+~F4RZ;WOb)!OMD1`ML#y+~#tt)wMo`RI7x#qk zye3Ucyv!fQ*h*gtL$X7M1~4Xg*{1EbpO&9|cOFXSK&VusH0ED2RuxhIoqS(&FR~95 zW2om*&PuW`vn{A~A|TptQS~w@zc<1Y?tjLtJA@^9%v9w|Tind0b3S2FN+i9*>XPof zUQVa-O8@{MbuT5MW9mgcPBq5jj01k(!oY8Aj_&cNzef_97I0GX!vR(vqVWnGCt~ot zmFIR0+fE5|=%r@508-HKZ0?P*KbW#-mSzXR7hTU)SN7(tO6g^LzAhn_cDw0kbogz3 zSOMvgo07p^iq&D)Qxyn%KCHlL&zYDeJrc8XNYd3w-%_EBBj$*KK0?j;?PC5CTX@}i z>m>Mx5B>+9Ik_UE_YLPnFP93yfv3G>=3o0;a|69=29xbAJ89)4SznyiSa4HaMkBKxS~*wkNBy^1 zA&ffY=#Q}f{z@q6XKKJp`JJc5htqX6?@Zop>SZq`eFepvsndgD-cd`o{bfw*L}tJY ze>Qn4Op&NIlvaJGEjgCM)d~Ve318VwM?+NAC(>%>Q0e-x-^PN~RSsW9&NF5YuGa=` zz#*ZE5oV0r;rJV=`_BO-8W6S-D?WxpK$@h1RmBOmx%{R`RbGP5U=3&vRfxz~_o|nN z8!zMq{EYE$y!iZg*h1y&DnIlE{2u@FD-tZjcm;HXj>IIzD3_6ZV5x9#tfI`JYo&w1 zH_gEVLtnScX&PVxww~_ab2P^mX%FZp20=17%9gHkq=B~EdRw~;$W%zrJU7Q_|N1kd zOiR*qTd;P$)n8QN(WIin@zfR{j;k&lUw~+HMFkI;+@xS<9aOYdC1M50Tx(y7m^2Y_(HkY<6*-4Jk}D}0#|ni!Cccl%(qu4@reTAIzR-_D%jA<0bd&5M0zW*q20FMd^g_FYW*YydAl zH4QnVKyt2r-xjN`<1DQ3;a2cAT%$^fg@(+>^GYvoc2JiL$Fzvaapezv;cQAkKuiwl-LLeK+`&?!;_kC8MCg7*gZ06`Q7rCY@L0sVfT!ZfvX zp-Ct6@kkUx3a)}Qy>;mU6o3S%9D!fxD{kni`@s(tcc_tRjqVOSCg2hz<*Hykn>8Ni zLf4>X@cyTX+t!C8ox9>v#Qof z*Guo(R5jzCduYQ2ER9jBEC7g^fwhx)(A|MU%&O)A1NyOH5M+SN{*Z*M{MMDmVGHNA z(5->@gBP&+3dYkN_Li15q)Oy{R;fN+Gp!6FS`sarpDu$W9sb(HU=D5-<~I~w zt+*Ejxmv9;hH`@R0>DWs;D+G+lJ{~=)6UCL(oQg_mYY*n7Fep#s-#7a%QmI+*kp|) zs7O3tRt!+YL5{q2fJN}scF#0F&*eW;ByWD*XhikYUq(`|rqNyFwoH-0=w%YGUBaxTEg| zcr90rU}60T2aC({`8|90;uRT9J>fW^U+_9{&p<@19kdkZ`><`6c02@+h)q{oOFY5a z`XxKv29EdA_}$kcgZnSd0GyTd=MVXckUgRGh&JYG2N&MRk^(Cps^E=%Akn(})2Q+D14;VB zwG~$;El;E&Y~^JgmHiZ9n-lLBDRyV@Kfh#HCwa2F!Oz+xEIBgltd`g>tMs}B6kL_+ zxkfy4evlgvOFrf!BuPKmPO!B-03odW7$n(hmmwKB?9r{ABXBcP&V+8B*LOi67dKk; zlbL?#yzq1MWwLp83p89hBhrERwf%Jf4AW<0$m2J~ zx9^ziN>MlG!Y zOry8KjKxx9iWw3_M{R(nQFR@PXynTx?iT9Qn37a`lruCE1M!PlQFd8IliJ(RNR!M5 z`}b^BkAm7+Gb8E6J(N&U2@d+KBDoFPX1#t~?DTGSZXsE3+=!S?Iq$-8ll7=rEp(CK z%Now-_Aid?Qm?n&&;o*9SWi6jjfn0p3ldb380*%k*Gt9c?}MNu&Sv$+e+7&W9?3R46@hYX`s39=AU{lM6m3x1(f(2RM zDIOUkK&7}s7e+y%BX`Ry;pti?WcY+{cczK3uL$E+Gu8^e9Luam>my7&NE-}hjbX5h zm%5y(l4{dk63}n#Ut}S+c)q+o57C<@?ST1D{n=DIu*(c>VcKy%V~xTvkduy6J$LGA`ylyPfRRL8+ZBJQ$R227*Lh~GEXOlelh8w`#j-BAmH z6-#;TJ5=yU|FU&Rb0vF@09c?`Mx($j%B#K$KVr{%E$M|FkXf(ihc0pN1h{-btc%cveZ z)jdyLzZ@?z*Gp~`Uu;gDIrwzZD00}H=$f0wO_AJ^&~b32U=;jymm;)i_-)pBb9xsC zlT^h2JC1oyoTToUgFUsRO+I9cRq0Rs&8ifYE?CP%^niwN4<~HJ`vxOkD)er)yILZ) z4WC)CPcqiZdp*t#?LtgtyjE!r9l?E;JY8o z>Ub0=u0@*7bVIqHHn-S|@%ZP?VJYDPwkIFBnxvCHds&o}LbX1gc2Z|~KgUBmvu1#C zc?!JVAb^#Nmi{EGMWIb~gVdf>xi$=P46p^~A;gZoT=kUZ`!{E5$(Z5APh%y{b z0UpI|HPfLAxjQfq&P&RGd64}@fXM?HL!UZag}71pa9|B`xCHVEX>0G?FwfU?yKdu6 zUh0KD@jk$%PtFY`PkjwGUreNUvogVPg&6*oucYJ@nI?Kh;#>JZ4zMZ8XTDvaU{PW& zENyBF7$f!#vR*-f5L>wiOCf)J_lUH%OGperNnZp1jIM&X31g#`eij}c6vIiO3uiY|Cf9fiFva&;$G~dZ}m1y><*_eprGm(@#npHAcqe zd%M*S*2BuCZkh(`Y0yaR!L8WROXlwPVVKKqy{v&y^OX?7nxn@w;p6H>GH}f+kKTa% zMyPQ%)D21JsVdm?j^<{efa)Tp9Z7)FRE`M0AYsKBMtTP2k%|W;CumE^up&$7js~)N zI!W)#Bobtj5)L)r9D{?i%-lHiK1<@FFk&bGJ_Y+WE^$7}sz9F(ngJS@J3>{axQ_=1 zf^)m`Iv6C=A9iYz&dC2xtnlM4(@Fe6f5lnJFv@Or0IX*7t%qsYK-L6tohEEdEQRA@h zz77izcoqH?)MhCk?mlh{|8>PN+#@o*Q$E>b_~X&xlf=a@Yo0J_izG~>th=A(X2*ao z@m05}y8y5sc&n@P?sAPjWSc>B>4X-wk+04t+EAV6y1PRdOd*afxj}k66)j-V>IIct zd`7!~>|)aiGnmgvcQ; zKj}+~p4%5xGsqLLkLW7Ztx0!}Lx1W}UG@j!|DQTttoRj6{RBH_xHm34$T5j_ddxaX z0=L-l>sihJup2haPIR&CA^zbs^gj74x0EDVjWaY8;Lu-)l7zwu=ti zou@Q0xx6pqUm-!-S7}>&Pqb1+T)OkksP!0^M|AW7^nRSeU#qdFgNUmFeiY6X!#R%O zjm(pWnuqEIvxQeq>hW|Y|K3Au9cI75D0eg`lAM5)sIq#_0~)Vs0Rw?Pt38pxjdXuD z0vHJK^2A_wc>nF}4g)oQTYh?zigV$hO1XK;dFuD6%?Nz0F)tqUz&-Sh)cy z5EeAj_t#3yPai)bF2|~FdQAprWQ743OhQE?UWhb2IzdFsLHp%7t%lP+^>Wu|*Bo_$ zQ1}7*;n*Q$5E*B`hQ99*8R_f2_!SPFN2S$npi>YlOOE0vAXr`)M=OW7%U`yvO-hUq zBsj=zb4W4;g$t#V(U5Rzz1@HTVW_qel3$WEBbhKD%hM@}klbk=Ya^=`dq9Am!q6;$ zAf`%aIJW9K7$WOqK0Cm;xF$cT@sE@Sawkr=hzWA8M_2a*=)4$7+dz&+bat&%*bQx^ z8>P+rTIx#6eRE<;dxk%hpcal4UP-NEpJYb_R2?!?1?=pSX*&$L6F9M;X2R9J)%oC> znT$T-RlZkhrk`E^lnvuWnV^T1%}@C#wMJGMDt${Uy7+9j;{Vu*81&~TPN`Z`vR?L` z&_VKZ9aW{CJf@tgwu+2U4ZpHCu;Qvy__Q}2kRM&5^bP$b4iPZi!qa=f8JUZan#csU zX=y4RDoSHhwYmDyi(gSQ0O~avfxVBQ?DRey07R{xVn9NyZOQ~EwH=Gw@;HB^iM(#* zcVO{N8mSC5QS;KC?jr;cs=Y`3HEbFjy0BrkWtK#;P=0c~0Dlw(A4(zf)K;C^(a2ku zi#cYCJ|^;t5)*D+Hw(k zO!5fODMYDdS?_F`C%obry9bFw=#_sGpAwofG8X!`&p8_4S=b}I;}tZt5NpHwPz6%2 zr-Fi&N1sC^K+BSIbl_IN83|dD<_9KP@rZYLqjJhZ z5q{ETu{M3MlmN0*OZD03T1h+j;MNLo&6%gf%-<3#oLq^M95iZFhjaMwcPsY5IHjs= zD?^=c>cvsJkgvY)gOKK>R7C!q4nEttFKhbiQe&!b8_EQh%pNxLJ1HT&x(Ekq+Q4@5 z;69ehBwT0~u0+BE_|v}XtUTpw2i^=zckF?t?NC3cK&~T0bAiA*z&=Mqv$za3gA1@L z@em_F#{Q!|eVGWxA1jX0>%>HBH%a@0b|#phq$^lAF_ozUV~TmG71kJ03ct=-em8un zLfg+qc;_7AXx!;gb*e_f60mO$fo>$NBOgqhbq*=eWw0*9Gv!yelpz&zZi{fq0@jCp zR*}5D*;xuXMxWeTJ~ADPqFq)RbC{QaUT(rZAYBW`0N0^_6Qz93aoxo{cf9ScnylAA zVeFyZce~+S%ra1URnrJ1H$mXHvX&p>++3F+Sd1saIH@Zyd@T$1Xi1X{d003a)DVUi zTZue;S5orr>*_aD&g~DceCL_B=Mrfr} zg7@w;(9ntRdZ|M@ChPiLdTCPeULh-QGw@`)S;DL_AK3*m8Bvz%1~Vyodjo)Udt^)> z?1vZ}PR_$)u8lJd`4x)8AC!d#S}9MwG(v}%CCN{+eYTZCi0NUQXVJwsTArEfk0;Y@ z!wPws8>E_I&c2XTQ>>YHR}cm`^^r-?M-tdS8@<(QwDw#QIAy+b`agm1ElfDAWmLw2 zF*v{EVdkOB!S?K>L0&L20lVihP=K9D{END8I-dIv%auI^qrf&*2E43InJs;d{61~- zxF#jL?*OC)SLI+atv+q%<f6@CO@3dZBZ}_DekI3-bC; z39+5JBc*xB*znniR*3>?&s`Fe9HMwAg$c#*R)uPYAGpuM7FhI=b6L2ngv?2AdnYyS z0-_bKX)&b%GgdXYfj-#Nr`8}vx`DjXYolNlzWVOfAiGhBZMTX9oSi`lNGTW@lH-O- z0Df=BPRmFng6S~0XSMZM%8Xlz{&629wMSXIV}JZdbqgi2YS(>2adTt|Hvv6MBy?pc zzINGY&=cYVcZWH4Wm|gj)Vg|Ms@Es5_6f_|%@0o$i6QTsbnXblsStSGr`n$FAl`E$ zJMF85^ku7MjG2p=?!}m~Nky4_hLm_1yQ*0sj_7QF!=*FM@O#pxR3W)CL^?CEgX!zI znDMh5LEk_>oef*D)Pi&Fj*6v=?jxs8<;j6|nW#E-D*#knYL?q?TF!~#_|=aL8E5 z^Epp0rN844urIrX&PxHaz2Y{P=i?eteb0H~Hw0>=dnmH6Dc#+rs-eK1Bgsp<&U67$ zLKqb84A<*E=_5+rhE}+gD5%)=q7Hpa_=Qi zfBO)RV!vLOlqA$RrmM%)^p&YO|6sL0;*qN>SyVE20yle&#t~rVn%A%firrxtdOGA` zN)_NpEH?28$npRFy)(C+G%5*tNf)nYe=-VnTo-THXK^&8V3D95WCmY3*{X_DUH)O)H#Ao31{Kg#U}2$0^50bafq zG8+BIDUA+Wf9r0XAhXtD=^*+b9Ao+s&iXo*|F=>;WpLO*;_O3Fz_RUJG&@8$Y0A|s zYKQtq{z-wft9?Loal4AS)61a*h~TI(9G@RKVsG=9jXb;Alk#G#dPPb0TO#)&kf6=C zq*9XWG)G*|R?wrf=#z=tXu1A8)f7-#WqnaGGfE<<(ja3rk)O=d)l)Alxrdq?wLh75 zPRV%%`caV!YRbh_La=Jm-8C%uk)XnNVQ;gto{s$}#GQ2QO=XP(p|34%IFc_$)wJU~ z3aWvGJ#vM|+aAqn;gfmBsBz+Q!tcjS!I2tT!X8Y9MG9)=8fC_;BcB@iiG*7KcmBCc z&OI#0k2IXj_TL4`N*moNkGRuWzCoNc!VrKU_o%*M_rDPGsBOAk4>kmr6o1u^cb}D| zF=s8$I?2acP2T9~p z*y?y18fhzRUBAe+?V7F;Rs{xKSf5DuNPR=&5#uq!6atQr6d7dtqn+;W9XE^XH>9HY z@*uPqn$~A-&O6p(It=1l-oFLbU}EW$G0B5Mz;}++0!sY8x?i-^z{(1wl-Y$$prbNt zzgQCRL=|c3Jz~!`HP>VDrj%5)>g@k=Xnn2!BSZt|@YxjT#2_)LMT zCrajR*^2i$R8I^^4v> ztf1!a`MEcmpXnis7FuDqe#&(S&i={1_{#R<@8!q0&vwYSG1=pDJ%JfwEq>bz?>sSk z7NA-?=Pb>r0Q+ab#2{^#GhFYL5J{Dc)xo}ng=lsX*QG3!ZXIR*dR`LSEVx~fbdyK; zH$0RJ8SAn3=aV3p-)v+UBz2WDW+&IW!~Kx1^0IF@6G?|!4oVoBkh`Jai>D!?&JqMt z<=$zGd7Yd}d#)(@*p9!MN-ulIUh6E$DYv02RA3^t3^H(1ROlALP2Ek{G2!rY;QGEk zf?Rvl#dm_X@#sTNlU{W-&e<_hVRW4092C^eFX~Hjiq!WCJ#BCAQkx zrn0>_rU|pf;yqu9WGJci^4$K>KgRWzlqG&vS7tFo9>GI*>ZC)M{^q*V5BE|2!SEc- zV71lWj8i~GkNkCNBe-H8fy<%M_?4mw=uO;7Z))N;;yP5Sky_4MX%{BIAxS~XuP9xF zhL)9*cddP;KlryQ;jFs4t8J2!fh0Q;NfM=GfDP=RsEckcW;$AaiDYJZn=Y}de{|Yg zJXo@$qLGVv9m~~q-S_-KZIdz>Hbe67*(K0~_eL?}H8Iktkt2o!e{gj!8IejY zz0tAxV46tvPZ>+k`c}d+Al32yHTG_RG3s+_6dHa<=zI4bzst5OqgbRg<5St{!_$uP z=UGbln`p9qWO8r*Kl_5nhHZWS_L$v&YwqK7dZ*>8U_9d*hLcD)aYt)3PSFt#=|2?p z2N#R+ZZ8)X@-6aeBQf2lrB%7jIL}dOC7XxGm>P&!Kc-!+UU)9;dt@a?hhE@p)GAkW z!1_OD;xnf(FVG{v01viVnI)+=po)@j~O&(8InnJ_rf<8 z*bqPv!c=4psys|UnTdqW`szE)w_v|5x1=ktOSoF zaMlhMi;AjeBJnqp*o}EmoV9j^Jo;vYFGw+XPB?L>q3zKR0#AIbt8Oj_^Pd1{5pi=< znsT_av^^;X9b`xCK9n1~1WqyU{VG)+%#r65-jaVVVyEcdI=O<7F)g+CEH!Pdb zJ!eIOiodvZaw{#i$`9DVTzYm?ff-?52Mykfu`)g}T_M z7m`EFC-@TXP)@r^g*?wV-2vUtgMQy6xX{&O$QUUY=^m}j-FSW#mLXg-v}=>yMU@@% zk_qz39v<~B0di%q=qvy)lG+K@DvYvldiXMI_)fIjBD^9rI19_%VgB@kDt>dhOf&jh z9oJ=!I>>Vq)JtNBV8^acfWg9_sG-Y?Ot=41ItTaGX4_&|T}Ot^df4wal}l&w^0QGK zVlALcFilO8EVsnvoueRs2Ga-Ra^`gGbKX|7Yw8Is>;+PaTFB?kt|%W1+5&*lN%@~; z6~e++s!=*wtVL%*q>!8o?aZf2Qgr+oD?PpK+qBevNJDUs)aLPNB^}T2R8fAi8+mu5 zcEWG&XjoGKbDXv{FOI_BH>68TYIsxVd%L&zw22&9rToD`i)}(S;qH-PNZqf@|Owp)2YVCy>^Vrucz52J)_-- zQ=qHEREBy%ii`Kltr=?nTIo`2{M*LQ!}=&#*H2EoDpuWeJmW<;QliMbCd~lN!Effzn{`XYGG~9{ex)CSE#49pkcaoihGlpG*?@2hha;&<-<=NK`3 zYTy_)p)sd6(^}>+#(I-Sw5) zA=@+jqB*q6wj*(=?0x8nw(--4(RGxmV44)7+diS^Xu|1HK8V`O4c(p&;RhJH6Lm z6a1lY^?;)MZ?{2315F;Z&b`^V-eU-E`>yqY^)8tYJ8nI<^F63$ zREl0%5-B;yI?U>u-7EDxArxpEBWRaGpnQ*NhWD4PaA*CJT!11b<~75$=i(5ioq55c ze5zQqyiyYl_5C~v8k!VK8iH{WIBgtBTGO~eztWr)W^8uc`Ljk!fpTob5UQK#pKE* zMZJv&MqeH;{hVsU(Mh|r-YCpQS^29ZDtb)nE1+P*_>40fIE~HhG0+gOFkiQ;otHR0 zCXN3Et3lD6z8S>lQuoj*nRn=IpwSeqW8+BHkY~UTj*4F{jjyZ#_xr9y5=K0=g5HTD zN%s~zIXSacuRABc*h~AL&A6E2tg#|}ais@fUVb-HcrQc;9|#ugq>uc{ZEQLV`Xxw!nrShUH7xYGnnNr(5Uq->7OO5 zFO1S2!!+A*&oBulye6xxRd+GaL zKS@n(k$Idwl$|Tv?Alm6-CMM@Z|(|wLDqj!kan@}GsTQq+?(GJwL-@w?HUi5Xmc~j zC5FsX@dp}%ef{u%8K!hIT=*2ZgYPAl?i1JcaT)rM06$U)?u6x|-is;>pT-JI)f

RkI4ZrBfj)5LV4e`o$kBlNK5=046y za}ohy93dDc6C13Cz2V6dHygzoQQ#qX5*kKf8WLut9G+YEirRCsE6$gDJY&fuIgHsn z0yh&P+@;(A;HH5*(A0SJ{1=1LMr&77i&=Y#2|?Ono?^-0Be0LtwkFHVE&123JL5Gh z$~_o5G@OqMVKG!mWl(#7arh)#_9>Pb4Jl>&dHssjcrUxX--G>Oq-X|U7(Lpt3{oZ1tQlr z^8@2C?AVCV$%_Kjn<~<&&cp~U%hW8D%?Y$!nzXOU#oveJPhM_PN7Jt8V93x8`ro=|Hg{HRLU_RQJe~6h~eVvr*Q9k>4b#>K}H4KW~ zttmObB4E{XotB zQBrK!onx|*rmuCIh6LfG{2#UeIGzwI5->QKqal?QWq>mwj@VEn3dcL{0m+J&DAk0h zc`P^MTm>o$mU-2AytZ=l9wJtz9BB~Pf5=V{or!8+lU8g#Q{;bBsMfNT&- zN841KOSx$SNbJX+r1j&`8BcP~MT68%Kp!Qo(ug?pU@$;#{NYIDa^ZAm#)Qt}bxcNo z7@F!)>GDl$>$^7AttCgq!-sy)${h?xi;M@jBVJVRO%4o;@f=_F*;meG-B#3a9oYR> zEAx$T%=qop!%7H#HDaQwiP||7fPO4F$k{nW~nY=`>^+)T^ z41_YdBqu#LGdJ^*Kh}}qvMMIl;s>O2z~6z)c9D1_h<9RbC}j4PVd*NlGa>2M{`Zj2z-G=uJf<23#}5lntV-jDGupi zc*KuH<96pPl(UzLqw_M05gcq$2{y1_K`5bYl_j~Q zbB%Lpflp*D)<&d|js+W+@s`v}{PO|?eDdnab>|QbFoQtT1zjZJuSk)eX74@ir{^jm z7E#NZ%F9`TrRBvx!;5{1oH1w$R{5NM?gz<47Q^tjiMm7rT4El;@?}cWe(ZpsNBFO& zUBx`lM*mt>DHAgC7b`Mdt-JOhd8%M@;B`6eUsCq&c(Un}1L^JFqxBF|<_pBGcXfw2 zOhPzL%{cH+0VJ{Yuj|Xih!u+84=dm}5Z7ItQ|f+&VPR7jiOv2rOB4Sr3ix*EWgenR z8#l}!nIIEj9Bnm?-bPQl#YB7#8}cfI>iM;FD0v;_bbI^MQA#Y zib`xAYYzql%PKXfY}&YL>FXRYhY(LO-_@%6i8Iz~1P7XhzklejH0ZpobUB1YS}ff3 z+AU=~uv_Hnjf;?s2{t)=G%h`{T`+CW`S%qao;A&=zzRj$G4VSf{Rr_`f0=A_n?7e% z(jQpaNN{gL#E=k8NzdB0gS=*1(pxG13E(RJNBO9Zj1#%ZV&9%={i&(RAh+od;aYt? z~ApU=)?!RC9%MmP9Mpl_BF_eE)iL_3Ca^G^w1uYM zFV(hw`24wOy0L?Um%o6N{{745yzt4K&>Xyo=V*W3Hv5`t@Xrm>Hc5tfUN^&geop%z5A%cdK=}KP^Kgkp{WQ&TXKU*ulEZZcNID88PFV;ZWxBf1TQOm)+2#8kGsoBin+FbUD^Rr zP6+0#%Sw%}E@;{_Eh!E#+=$T;m@Q^V+6!B$t(ogPpDX zRB^5mI6)xsvphh)!p;26@mE<@0xUFD3Ehf?dH?2pbOr&w(--HH2A_b`BJej6`VZ^7 zj;%0LVI1*l4$}L@W5PwtK8z{!EJU?OpxXI{I*RBC`O{$t1c6yjOA0mUDa~Cv5^~vE zpQ4MF{*q$YA2M!n>q#KXvH|E4j8<)ss+VJHeAl`B1B*UAdWq?X^ULEPPc*G(UFcDZ z=j@sRV91QTN-S78hM`WX%8YyV%V(i_YtE$G@W`$>&dxaNF#O80ijOZ&EGjd+z9ZY6 z+lMYCeg^^AfW}3YQesZl-7J9=8`UI04rn`afJC>4c@r2u$yEVJMEyu!^4 zmSWZ^gN~`ewXoSrAcaztbsM4b$JOdtv93oPV$H=Q-$G!zUwWy~|0ab?BRL8|#-Bs` z-rjP%I^Omsp9_H$+y3GF!|AW+*TfgF`0nkfhkyT&4M;jYGNBg5ma7`>G z?-U3H;fDdd*F+Xza)bM9?}T9$T#C>0@sVE2it(h1wsv!WvPer+DT-{Z!5-BLCqhJZ zY&@gV)e9u92;l!*(Hp90_~*Qc zCLDfH7*2~B$ods7d$~*5rn~SlR|^U#nGyM?;<%WgT`;+PyBI z7arN*Z_YK8?2rL7{%$su(LdiG#P$|uNXbD82Sa3p`s zmz&{T?HPKl?d1t>rbK^sS{NgIqwg(MQ4=H~5m5-p>pQVS)qz?CM(hH@o13DH#Ad9a z_Y#K4h9I8cD}S`ZItkNW_5xM`t=N7N$Ee}<8Dd#`CSD$1=knq6{64f7f`E1RuB>E^5NbDAbi6SoOzj|bujxN;{a-XxEu0XET}3W= zye35-sOfeGVfav&uDv-%; zVT=P`k$Sgk)bQyZnQIRKpQQ=8@u6i2eOONY3@$Ax5fLHX`K!LkUKMaij0Y&6qq=2+wnR+0_5ed zo;vp!1FZO6LxFmY7*p(7)O*B-y}Js{`fkax;ty}Gnt%BKaHhR3>cSRJ%Lwz4fQT{m z+7;AHoZ09v*~=#49|HLUT2ozru7;H>z_=}n+g<(zZyN5N_L0J(?&oAT1j`mla4naM zI0Xw_sokpgaX6P)F(0I2&uo_rk-`m5OIfeVeuIj`s;|ys0oFq?_rrUS556}=UBc6F zK;rNKW3t#_IF62&VB2+0uI0KIR<~k$tXAyEnlpd{~~ll1`|(}C}Jo8`Vt=} zON^lwu;@Br&8%`-;}TqQ7l#sPrnlci+SFy4tAVeLrNA-`8b$AXmp}-Xzei z{U#nalJHn?Gq?RUR@k0RLC=9HV(#W?$xbg}1x)w$SUWB5c6$R#tm?VRMd~KIyVq>ZyDHvb^aQ zki5VU5$CKa$i8PpnXZ_#?8*6l^EU|x#CDM{R?eItnfvw7RZ0Y`<#Szd#R0p@>%NO? z_Ul|!gVlyM_3|d5w=GiW>td@Sa=F5blf#~6S7IZMd>kO6t>2(}Gp*%FXrP0F!A6Q3 zyRa&CUQ&y&by2%KYA$vzd}1;Z3Jiw3+j|$Y@ayQ#4;F`~;_R(TNtsN~WOk9}+1EIbf7hEG<1&3!td3wzpy@Nfqa<;0H*d>Of0l|>_h zEtEk*ntW3))?#AL*v|4e99b#Gk+bd^@T}#Qd0tfl_zyBRMk(ZP;}O+O$q2lfA;6hu z>i042XU~Gpv1Vb|mGT6F9>6|c%m$NUu|Xb2j|HNb-|Lo^FG9)6argZP;WKj58F(TmVI1BNl{;bm-+jdb zW@Sw>Xf{v4%BHgGY2f~!rh}k;X^gywe+EJH?&MQPEmM!1%R@5)w+L6+`*$0WAr|(= z#e8&klC`kD?m;|2xRRxbnNiaz3(8#9J~bo=W=;ZTJHkF9yeP}i1;9A)aM9^-6jYX} zl5oI?vg^xWJH?0Ht5)wCq2OuMl6hCaX&gylyJ_qIKNFYC2K&*1X z=HT`z&|tq;3>VbH3OC7uq`-G>#W`~`DZWy(9}_r4O2r*76b0iSK*91Fp!KUY(@ym6 zM1~fK9ZqOsghK*ZiDt<~-Q|T9-oML5OTB5fXxRK2kZPOglViK6v6bN>kjoMSK zBRLR1fZSX_@<>YAD4uf+Ad`?EF8B@0*Lcj^CkiFuxWp&pv2MP#l{Q{0^t_0 zH?CiNtoEE8D-J6e^PJ~XH@DiY*Oe*TFeP1PIgK5Rl>N4GSYs@Q%Ql%bKjdA1t|7SN z#9Qy41rnh7?4leO7;)%rl|Rk!(e*KoFi(zd#o^-PBUWu?GENIJuRM3@POI40=$1^K zramKaSug@T>(&GGire_Z{numCMmM*v@Yjs3+8st591aIZQE1tX*fiMrh@l%r4Nk9r z51}|!9h`LYYuj|~z|*2?X{4X+PGL%vfhiO98!NB6GfcewMjD$Ss_V1{72T)gCYD#z z#D_I6xDSF>f_%s45qbmcRh_D3`{pU*OPA_bOdnG1u9t)N!I4uOgmqdD=8KtJZA22` z;Thj~PDsHISlS&5Lx-ayQRTQB>~u;^n=|@0wVAF|8gU*i`Dzd5l|$4)YZ{E)rsDJ@ z)g)*%RA}tBZehdBUuclWq9_zWJ@_vfr5H(r{E|kv*R&VFfm>VF+k{6^-c) zh;tdJU$37I^Cz0PoAjpUnM-IABhA}Jb!D)(C$nQb(1r&pvWNOJd|2P_ z6U%k*xH#;nE*%jG`g6BSa>5Dq?yo0bDTaHbz6crIDK>}1H7tZX3BjM6_*2#*C)CwT zx>9oH5OnT_wn;mqsr`cQvWS+MvDA!V9;qtBr9FK4Hn{W z%2FKQi%*BcJlzQIL?}8v!z4M4szw2=D608!`=#gDp8@Ki0zXsBWr=~OQs>cGzqL*> z2)8QM71lUvo;6f>x2<7fR=h>Wx=BveJBlhpiSRyT@8Q zI}@m;4RZZUV@T{A+QaEG`GN1f@ij4=PBiKKcjW>UVzO*^wb*_S$s?l<(v-?>-B1hy zFIPMgE8~4xIEG3Z=(b?bHnYenT43EazWJ-x7PDM&QY^Muf#5Nz;POjd8UtID*ZDjz z{n>s;JM@mbHMU~OVW?(D{XI%F9zJutXE`ZH_gk@Ib{eK$GOssaShO_goqdEB1`r}C z6F=WhojMGywwxJn^_(j0Z%{U$o1KCuWuX@Q?&QA-xwaZwf%K3J9t z=KjeImGtcFr!*U2hh!1)DMV-UUfSKE-5NbUJ-AIMD9}S@tX1l(^B7ZxaYoTSf>@ra zoIsF*z%dPfIo{_KBV26QoU!%$aSRIQRvS;KB+n`dLC3V6MGGY74;9MQnXaLsP}N+S zPiA|t(xbKy*Pn*^wl%lP5#0Qdpk+VB@Qi(_`ngkNa#-BSq<=lKl4vS2wdNpRm)hme z!hjw?WJwsBAM)Y|%+bImfLi&Y7*#R1H zM6(}j5K7EsMTc9$F@>Fh0t;0K^G5+3bWF~ah!2GMDO?M$&o@PfoxCb z)0WY!WbeW(QX1#4#F{kY7O^`lsp=oS&R#a&(!?h@MOS6Dv9Lb1hT7=Z2c(iV5~2b? zO5{TUm(@#4pFRp(e!&=11%P5;hpITdy1d__9baxD>pSD!(d=g!^jT^bv`6ms3wbQv z3&0FjEd^kf%jRc0dfa_mkIQyZqk=yuOj!zlh!EjYIBq!J&yAhftV06iBCzx9L++8n zK0ziXjuUcR@O8Pr#{-XLq%Vq^HnzN7@3!mQMRjp0zthPu?h_ooc^K>uB}e_Hj1h64 z(T5o1-ZLz9{1fqVXeX6+CVS6G)bhIT&Y#glxumeDFN!DaZhrMc5(({=QQXFgy|&=% z?{@msJ7p-%OB(yHt9!AjYDR`MK>|}29R;Yv3(o>F@k)Kv4jwVmweOsScb6fk%y@iW{a+&2)lUeBBDSvjyk^#m%A zCO4oWX22`KvLe598eE(U>U;gIdeF10V{#=bJx)Sbwf8J<&1&YL;TkFLrNBN%>@W~{ z*+`rm!KlUbkG)LEnlczYY|BAdOiaY! z-MG9is}~;TcR&cR+HLV;jo~0V>*NI!UI5k zDT-;8Ej35Wcg^NIyUS1#swsggAwOB7hLl^_1HZ6>esBR%gl?AO^i$^aM#$sXl`>hHoRvc@Y7}! z(^>^qhQ55TDw&B|F2q$#8t#F>HBjP0&OSe(!nUQESPafJj!tk#NdIN=(Fd}xa-zK` ze`W{(AT1KS#XOuLvGjPfzcmsxh0q{ie+Pb>&Pp_(-*RjUMoqW|%K(M3_=6O>v|4m4 z<0ilHr~9hBHv@HwrPF`?WRp|G6BXr)BztD_p+W!ph&ZruXwRmRrRn}^WZE50Ni|Q* z#d24LVzI{4PWx%i{w2k?iq>Ut4!o;vQ3iS0W~AjWnFvWP!7B?mH1@Ufs#CVRy!#SH zjzj?;BGpQAA%#(^FQ5Di44Fn3M^2?MG^#YH#X9ZS(9U(|-N8YS5eFoCo?fp1G*5J) zSvC=2M1j5rpYq?myKaAn!BC?62TvH-bWMD3K%jN7l+s-WP}&?_F>QS6Cj6T}LJfz9 zV~8B|X?3bY?8VH4EBCYZ{48>^N+{#`)5eCqPfN=j=Bh4kpbP*=iqkHTtJSU5ZD(_7 zinrvu?AQJF=J}$=w2smQpo$3obRV>^L15Jo$83Hu=o%9sHABB)@GAI9P6$RM4VLVS zf0VrXvp68t^KSe2Qj|O!K1_Xu)Mf2ey1I7qi(3NGAEb<=?JAec~UtX)QG^}pM_kLYTx8Yb~s$;ZXZ9dCD@jK=Ui?Qz+ zpo*f}qrd@CXSMF?78|{DhVOY5P2An@R>zzVvl7n_@T*WL!_U@Yw)E)#+fa9JNXlW0 zKmou?R_j!QTUwqobFM)O>SLy}GK?ko8ge|&_QJ7m&i!BZLSWy@9^0F{1**OXG8TV5 z(51FGgb6oUL1c5&b7&;F_hkwkJre7s1mvra<@{bC`=Oi1SbHQV7@QGZQrawX!%Zs6 z_tHZo?Ha+GImb#|V4h$&=n>jONE01AT0v$MTbr;=A56OTdE)d=>lY60kC2P zY1cuxDg~IH;))wR4_YhbgAXhryL5@QOt98@lSRMBi<6tGHOMTbQ~=nb`Q!XhfR69H zm%dkm%WcgL2!|XVw`##*F)T*gqJyMan$j4MG$?-NdGa6*UXgkcwZ;VzTQk$B%eAcf z)^@zR(RoYa(LERZtGF-tgrQC{)c_t|B$GsM-MWQRJ1(*>!L-(>p8?dUDA*HbhtSda zobD0UeusO{Kmhwk6kc4g4)!f6C;$z3A=a^4WnFTpT_fchEzza$ckOp;wl}*L)>I8k zY|-UND~m~DyHuH7=7t!Lu^72dqnl0bXz;;xT9&@UL_p40WFR@3J4uKBaeA{D{l-6M zyn}thvx8&Xy=8jTp%qaO|MAfG6YY1Y!i^s*nipT}FvW3pqCnS`lh9I@t{q~OAmZ>* zu~0@r#5Wicb|M@M7*W)s1oP+#XWxT|^^H!ov}lvjfR?c8!@Li2VR8m*%JSPelt^Kg2Flx zMq_Y%E1ws%$N)S5sWE`VgKYzKa+iVMAnIOo?2M@2K|lKPrrLe?hZZsV0^}$yj#AMW z+zdkO{Lg6O-0Txz&6mR!e0>`15m(v+OP?Bv1nxtr)@Ou!;@~C)Ot#ujk!3) zul%*q2c{wfVvE-aR6+GO1)I5gQq-g%bc&ucH@ItRBY=NG9>|K)rOWZ{aH2XmXEq!) z*!41caS23`hv`Wzw1i==?p`UdY5wy*UPerl#~O>j>mhH4Ft&IF0IW9zVtN|=#Kok7 zz=mTw$=N@tKS6ZCeXyBXw*L~?KWaU^UXDMX?xp^ux*1AGkh5ab`o*OaxDA3IU1kcA zDZrMK+L0S9HH25rLWQj_*K@Y8hiqQ{snH;No=ugM1Hvsn^6Q%@DK2sF&tS*PF5Y$w zSOR~uLR3PdwJj&8EUwfq)e>%Na(KtTwC#Vq)wdP#Tlv8j9U2u9BKlXe2*0UlAGTF8 zf-T|rI|pa+MHY%Ao{G#tf;UW>`8KZO;L^_asHzN=SO1f>t>XKHaw*53L>2|1pBuwL zZt4z;9Z-N||CYUdmwnYz7*}~vkrScfbetn3RLsHc2q75}nFuS7Ht;qke2ay?I0U@O z$ow5Y5)!Q~Rm6*i91PfBe|5fG1s_17h9AH6K;UslsYL~B?_Vz!+}F5Bb$GDp0KtN! z@B`#$A%d`|GDUbYRI;aI&~R#UWv!t+5@wj3hX{5a-bA>C6ZvJ~0RkPBn|w)TWQV7V z%Q}rKHL?LWR}z3YK6-)v$Q3IQ3Pl`9PMk{iP0oD>4oYAghk~%ry{G zhO~_cL=i6rB}IoLb~;3mVCKsMf>5UaGMPuSef-$XA*~PXvH({U4tSC{|$cj zQP2SM@jxKoACC$ZC__ao-=o$3ax9!Y%gj4w*%{Kh>xBEOK zl7_p7r@%Yq_-ECUM=)M)9ZO4Rne{uMTM3 zyi(S4sKPt1kX9aiVl62$WLdd7O558?Kjgdnh=0Wq&7Tcf+-{sdqc zk6(zu=~b4r9}8e*q>^(VfAsZ!t4vCn5hbbp$m^QSwx_;vyvUVQjkz40qmdM}##zF9pN2jBUDp z0Q3$vr>TDgP{kV;yh_*pqhCvqK}m>yesvOI*$;sE(rJ*#jrvlB_>&+e9$q4j4nlhK zt$u_JRv@tK%nf$OrGL-u2P{H7ypjw(A~{@IxHE5LRGo!T?lMcTBb!kk(eG_RztG(Z z?4K`(iC_KP4EC_J>d0IR@Q>lc0r0W?iEsKn0`@&B&IQVn(J{>+6y)hNw#2H}yWuH^ z$;~km57<4eTp#4P0zJH90pESUx829u4jXK2QJC=kV6Hc*fy%3n;{r)kXItfHQhmUagN+Q8at*+$ZHjY)~@5eS7S_DP`RnTLLMEAp5Y zu5WXkF>Kt?oxV1pU|!5PNNA@!g#_6&)Anh}W2#>X&2|f?r?x z2~}|^Tcs#6M~MxsoB`-SQPz1b%G3$142~6)pB%dBmg+bzxh(%QTP8|%enR6rR#L}) zY5)%X7+ohzd@lkFJ&F=qm5RA}vFqMu|IzK(7n1Wry)5?C9G?0Y@bKuy=PgX~QQKm_ zvg(IIeJTlA05)H;zf%?#05FDvTtE&zb9r2@R{zeP`fRWt9f-KPLbDJ7uP$>`qn6^% zuajAQpR?pqe{b8O*T97Y2%X70bECjdpY0ZQxdk886bcLnJbw989wbV4%b-#iAH8zegtyp~Z*79m?(5v$Hg5^%Hz*5X&;Y z5+APvi2p;5ormyaj)QO|*J-T%R}`^*uD4-U!d7kL=I?E6?lv?+5`g3x@MjgdBzTHo zA)jP588+|-LHo=BX?m7ms`_f8-H&b#UfNHs(WD)YIS1_oM~`wSAOxj|tnE$M z*RBpwXkXpN1#%w(Dk>+p_0KM0mZvS*;g%5j^QU93EbXZ`2Lup6Gc>u8bi~!QLVdS~ zCm1M*qXNPPQ9A+)+brYuT0R;Ydv_A-fSpBt{2!g}osEFj3J0AZN}68~_0Q1NvebF1Y)Z*VoB(ftI672+g7Gu2P;g@UdiY#kE7f zbk2q{Io&p;fTnoxhw@O)+WSaNi8233v1DPp)T6voDxFQ%ueHyc{=8G!3U^g%t$OSU zp6oXGJQ=mx1Li#E=xrn9rs5zN?An)z2I-earmHCqw^fR~Y)vee4pRPiWmwXa?96xgWa z*oUJDl3`uOEkVvBrxvw4ZIxoTD}qk@@nV~(r{bb`?wP@ejKN_G4VP53CHFNqksBmq z0HDOk{QlM1w>XV%xA6`EnX0@rm1D`)b=K3ot6QDS_ED1sD4ZDmm01}?4j-=Iny4wu zq~-cG`TTYAcXr#IxSZl;$n!=IEz|{`o}(*HM}MNq%7=en0#L_j!!6`j-I-9Yk_cWK zD|?d7(EVMN)}A~&YZH^&lLb-O<#o>RUT?JG+w%HqmS< z)#tJZXyN_8fbiL(z$cp%7P1-gXX((`pR&x$8;A;_#tozt3k(-^EfAO=%V<;iAUY@Yp#3b>IH+RoT-vdL<`v`XgC`l_FV(10pxYRgtJdAB+-e_V zqQY==rbx0L)rSFqpO$RcPqE!#k4WUXg`NS|j9hwOu(8tj0U&=|QTR#GxdQdY2?)(m z%2yus-%BoFXe%;Sr6Md%rwwhsD4F~^-KHTURo1!Zg737$osAoj!1qz!MQLg-Kj^*D zcV)400B{p-aASL-3*81xZ9DU1n2ZV518KvAKgm$ggGld8VnjZ+2#tj?iQIf4bGUk{ z%<+Y|ue@LPXdveYsj+{hr;N$_Mu>{yf9lD-2-(Lb_J_W1hs0Q;qA z%}O{6D!so&^1xzq&8t#*Fu4omQ#W{m3+wgC&cOrfpjXkq@;5(t8H=gHiB%#qBEYM1 zrPcCK`AVf-Uv}zfa@SPz-;d%GQ=3mLg~9CYo}Vi%D!Z~vwn*!I>EM{#l5l{-sdeGm zoGJ(whuVKuRsK91`}P5DCm^I6ADp8h?ggdQNu(ZASBv~=vFkIWBhIp&bUz%lWqvO^ z=NS^#v58f zU*TpwU^%Ku=tM&;U6fIhKInKM37KTUOFeQ1RCaYK8?0TZcjyb4Vw)HV9@Su1 zScQI>6mM68Kp+GJ7Pv058M8Fj&N5j7p)Nj$p`V`HYkF#GvGeE!nlv@rgxp(>A*2M{ zNr5SO^t7p?r8i4Q4pr*84xBvD8W&b#c*Zyt9F%r@{`O4g+1s|ZgIPH~HCd~bu8e5k zrG1-k{`*;sGc{ORBK6s2ZWVwyMLhN2ExwJ8BC@Kg3_+p*nN^v!P@zO7mZsFDvs(S7 z#Wj5k!aF!@XL@9EntJ(-&+Tn1x@K*SDsn08+BtxHQN_y%Jg79#rw=xti#iEe8M@!l zIJl?SC6+JwFjd3$!(UAK2N>+4m5 zoBuP4jJx^p3K8~1(CzI>($~t|jIBjic0y%(m=YD`hB3$jzMxRw+2Y=;A&tSe=jlzs ztK;fX90KUg%P?uZ4GFOsI^&V!`BwKhRZByHiDMxwn-(E(DF zP?ETB1nt?B*lF-^gOuFgP6DbtsfjFAU3nJ%c^WEx^HAu{SYLUoRrL>qU6e$_rs_Go zfJ1u(r$ko*3dqYTu;R%~8&|K;w`+KMb~7<)>Eb|s7RDk(3n7%XlHkxA7;9~N+U@tY z@6KXg+a@$5BgR%t#ldl#XNYLCrRZSyyHL9igRR(#v<9fg6GGC`ZrCN?Z0;$VfQycfb4P z3s&~^^hgWq-fl0+u#S^A64aRB8>M8|W-20t&xCOo9k7c;Tb!g47#C_pIQ%zS4*37I z054i`ZjCb|a|`HcBc1+U`o~`0gp$64nxmAW0pa{J7?Z4=b2GYYj`G$z^PmJJDpk8c zab&U9k*@Bo3r{_RA9S+)a;E3Dvob2vCI2Z6UY?{%3YhX{A@%eo`~_7m;=)w&l4hql zvrj|KwKL34!Ts_XgVSQUr`!zExE5J(SAQ?`moJ{lk_L;+e=AU5K<%o^xrnx?Q797f zr-ES4uqau=y;%rD1#x;&3dAr}d6+ibTt{Z~bQ;{ISz~JiW?8Yk@CSvYd5&FQA3&#Y z{)KJy0*Un;{Kq33DG`|iK9^Vn?;z42(5DjXg=K~(A1n$j&#cL*a~o&V4btS#fQL98 z6QGr|q7Sf=B6z_901!TkjCL{lt_lh|{3$P%*>_dp8r66ZAuDs+NNA8Ft0|nwoj87| zprmAAdwF__{c`&maZNEF&CHgklpesM7YS;2_3-9M=&0x)UHZvx@)sAa5%sr540h`G zn^J!u1-b+T`nIHx=vdR7wazft3bRNSCdcHlVHTC7xLI~2#OSKKViU24uHqo#Q1j&s zvy&Q|*5*UPd61|AzVQgTe;E5+8xQ)k{yx%rREM~ns}2w8hFepxT`S)4TK2zRl);A4 zPu+@*KKaB`BbuSI^wcr{F*%~&c_glahiup=6ycyk#xaY(3^eZ@ya%Oz0%I$_8zXOB zf#+AH{`gJ09O=_IbYn6raUkVT!RP|fvY9=EP>Kc4$-I~Px5Qbe}ED8oXo|03dV9^`|$Z@jjt` zmU*$@iP;=$K^PSo#r%+7WThHPH*=|pCZMIDt!#%Ft>Xz1cjx3KEORP5Zv^$BlD~BT zL9wC-X#|l<#2MB*O2}!%JwCA*DeT$qxiV&u@%Nu5L68A9~ z+<#NA&F5G;<^8R1Z|GhHzXVk-SaE9Wi)!u*R4BdRVAG2nawxJ(BptlX;-p;#8Y$yW zxhJ%oPVy-UaWC=s>VV?HFBT&?fU9TJc$I3w9m` z9+MU;Din!%7KT;Zpc~`j{NuHD52&xC48-NQGRFcFg9V`>fhavFM_$pno)c5Fy}9Lj zxwk9)k!wtf_L5zN5$^fDd|meUuSItMT5cxKYd?>~tqu&Z<_FH1?-eh_XfnNJwsM3o zURH`ebk#ByZsAxTZf&7a_Lz~)$kdR66nP1Ae{hd{+u91F`m)+8qFQoN{i=LrPMK5m z%=>J*RTg&fQsl&(>RL7#Wk%-y17z_Pg<~S@egFNBCa<&<{bTQ*=h+|0J_-0l%{(&R zW~k_;9!iI-Q8&h)O5#DAi^No6;gA@n;y14u#&kdx{`MhM0nw_#g?;m5=W6A$EU= zW9CbKCHgVR4aB=8fAN=&HMrF9k;^ynPYZNws$N(KI);QrYPeI7K<~W2LB1>+E0wX= z`fiPNZs0{Eh%6>hb)4E8?hX=A1s&wfBaG6X525XRd+n*L6P0CS&XjGQFdVDNEF&AK z5i;ax{e?F$;WKb9>!x?Kp-V>Tt_#T>XP^q$;N2T~S*dNGU1rJs(rAH0(jq^`WPsn? z%d2H!UyGG!yxwg8@Lwe-*7Bie<(zS@iHnifDKq>!hJ*v~j**!7Z$RQP82?7`RMdUW zG9Maxe~=^z`sVXxKPB|TD@=ZgE-dE+RIugZ5x>c?Lkah2V_H7(5ADK#)65-Jo4TtD zSZ5`Ah)+EmGaSl`Tsu-7h?jPL4wUg*SPVGC0-JCA)(He$d(Q<`Iu2%%3B1f7gJ(MT z(VO{(Mt=9AK-xrlYA~t19->G)ijy_4^SiD4)BK!UT78F~4WW1D(F+)VQqIsn?#uiv zWvocCejz{6D5XXp7RgiRLKSXmv&@H>z`UaYvkiC}W#Il55d+hSfoCg#id>Pqx82mw zL;Kc8Q;z5M8ZGrm_=;|{D1F`FB2#`h=S!73HAg|0fXOXf>TYkZ08Wynx3adjZ~FNM z_^Hfz+^-2tnzV`-Fl|^WNi9>a$a1Y)aytA$CT8}*t@@x@r@-78MWAA0>pPuuK;M9Q z!8mte=|3Aq+fwH>tJTooI>kLaoMUP*LR4%ux9I~cgH-ipcea&Z{69Ab$2h|`N$D{_ z-p9>>mMvP$?6^7}xn-@{iZMf9Rby2hC1Flj5t3_Hc(!y&e>){QR@l?zQJi&a7DT3A z|BjCQyx%xu!<&8B_g*zCZ*0}X(2-C6 z@hvp6SOA|e+6yhjFg=nB0PE=*V8EoY@gx(e$&f3fSXsqEd{*_>OkL6DO1pYFzNbj# zZ@pP-y(y$8FcrAygM|j?B=Kz?R~CMi+kEB@Ux!sd-oa06;R{SxzY!1516#+Kq+!oj zJ>LwuuPWQI=y@$I{jBCAdm;aAY-~)q=?3U?LEyy}P=fy*PS1EobXS%{%Yp(uK8JDV z;;&zXPzNWc^zrSq{qe`Mi(~SObW_sGnjgP3)p^`~)Rz1Dd;=oWULNNZdk}-fS(F%4 zc(z?z7CJokwVU)EoAigwW;_+wu7ZH#=PR8)XFr?vyN{>Rtd$g~-TfA-jr>kFBdn+L zjZE~=QHVR1j;udu$t=H~sQ7u>hdeTR$uoKvu&^?IQN$w3=gb^}-8?+tdg{QG)Bf}H zP4&YbzR)t&X-x)=@D8xyjCz1vHYOfI*@L$N`gV|^(99R#rHr}@-rrp8b7CP72m-ls?MjiLW(*Ke zST03wy#AwckABt9=1Bo-Kq2FRP?vMxE{aLRwpA-52{TaMdip)e;v(S)2HKa`NxraK zZdT@n9LF(af^S=hjdX!DfK=G>QG{s*T5@sY7mbkvHsF;dhU1_ z?J$ZV_*X|IB1nwLdPiJ{mZ>|z+Oc#FIJf4ZW+~PW-#qj_OLub>3L2=)WwsTY)DEzc zgUuwVBV*8JA#No|0dqhaPkOW6i7)5v=V7GV{2rsq%P!iPCI{LYgLdlcCf~WnmGGf9 zA+ICCdI1IgOUEFR>E{r;0khoA9dn&sB>{bFWO3Xi+#*}DQeG@c76w&1TvS{nsRY_c z=tt8V$pr_xsm*i7C#W>fFAV%Gx%m+Cg++REyk~AKljPKdn(U-UhDyI4sE`yLwyv zs8q16Rc~|>qWaK`F%%As3j7b)NIZk*qDAc6KUIp18Z`@kUHPf5o@H#1M*XU$rY6qw zl+ltcNV?@D91gfpXuzZddCKK0PKf$@<#O}o%RxD@)#GdW8QwUzhs_~OXk;llfTiZ_ zVZ@JRZe_)or+nMJX4ll*+)Ne+6#vc3%G$_9lK?T7q(YgM8v(Ox2&3qQ+iVo!HlZsB3dz!^`9dIo&qA7;^SIixC8Lt@{7+?<6 z8nW+yoIk#*oVV*(QKrW~YZ%{lz22^zzi~R-j+uuRCXR2ML;2r!-Y2HYms)TyIkoU)#g^GNJHE>mhzABE z2`-f4$C6y|0DabE%~Ot0&z7Z6X5mj6m1R+yle!oLFw~$Y+OhYJNK*90A!{{Ff3Pym zm#eqstF5N0vFp%1IDS0CphZoI<)TGJ+;t*?SxO^6+h&&$EV})oy7g5+4@=}}cYWP) zXen7y@$@cJ)l+R)n>T{kFUe?v$-dOy!WI??Gj%#AqN5|mY%}1mNf4vkw7xo8dz|SS zBq$S%Yf%?=+p{gO7 zncx1*kY%=~c-2s7^$S1_ti%vWh{-Au%?S|d;>HVqEjD5K&lGwp+97YfKob7&dCBpI z(1j-Jb~d|obTYH^@@sT+w!ct?7I_{9g$Bl+ez)3XI#8izu?*l{NUqQ~_kx@&E<;Kx z@+seDxs0mXDii&u?Oe2s*K_BzZmX~#U9WDVW&=6M-bKurSG%xgj*~k8%$}K@2$|`Q z^W9t+Gaa7C$HU7{l+m2qWezLImW^HK2m9W2qIiDVZj2}#ift8bryol7z!s-#bxeNN zbL7Z0xEd`xV`nV<+c+rj>xVtHSnWkw*FUAHJ6`~jeCj}Js^a9`Up2cTh>&%V%-E9l z6RjSHpY&r#^@iO3TKlGsE!5zRCgK~nq3 z=I|mX&lDh5<&r3=R4HlFp1Xs6Ec4Ptt`Mx~Yr1DQRx-<1*1nQ7gfg#V~zs!O;KgD?s0X^31ady~X%b!6#w4(UsY`<))UP^)wD^aj9Ox0jI9HPl7PT zk!dVYkzi6KMuIL~QZ29jSIXh38x%1Zs+sznM{;Z(glCnUGLVL?S_=2?aJj0#`}bEG zhIHSv-wiQHM^^5gmA3vo@XPo%W70QdsY$+SzE;>?7&F=^J9zB+Z%9TK7ax@PDGbGF zE92xs(~xVE(fd43Jx&9*B!P})L3llB+%@NzCeN_oB6~0|E0d*=HhxGHihlI-Xtlg` zKOFL*AFV0^RZ14()H4%dp8ZlD7fQ2oi+wec@0p4iO+$9g7%f9%`VZ?4eqQ6&fn#z4?NxFwLJnB2?YM3% z8TbN~aD-^4Ib(4Q^31ug2%aG)R%l71pOe~;N(33OnAaH5{hKL@j*0sH!A(>^2d6GT z0z8}vLjMw^Wk_!(H~36Uu!W{HwkXmqUh^V5I%Y_AR$dMqf*!?+m$@!M7&zDtL_$Yd zA28(&nkSKuIK@D=)NzaGtDq;aNFhQR=96F@AYDD0j(z?Vd+3>@EbZX;C3{+_ug@w@ z$~K|2rG!v$A}ThST(FIlm!erty0jrHSQdni93l$>g@8Uab4*@FnqMlgREUR?`6XO! zF~mSYG|%6P2Q$76alLVtph>34gF+6R#|22B%yoWQ!0D}kErP669(6spL4=^ww=5d7 zUrN?nSa^ws0YD=Hlv3CRE;rv#e5edhyPuqGIIijEgXU<=kD2VY<`6`#TPZ0sAvNac zGdg_ea1AXjeZIYEY>4Y8HACL8SZgvy^21$nT5r-X*wV0>OkTSe49Eq#hcw_*ztqn)>QlJ{^8hIsTqn zR=|rrQp`^`e%FuOB4kZrI6pz1VJ=Cn z4lP5$vYmPzW_E0_iw#k;-DixUXB)c?)U>RHZJXSMf`mgu)?Z47>O8QJ!lYuo25H|# z{p^liK52-1q+)fO5!PVAhkk2ZLq7eNZC8xn+Vfi@YJGfs5w%R!kT||smm!>x1dTzH zh$Ox4f$!cxN`T9e1EfmzO|NF~D?mU?35m5W?>zXUF~5DIzI(L*E%a8{>_tnVNN*%S zFJkmyZ3<{>W?EY20EyEHtVUcILL>=|@X2i$qVJ29E9sH8x!eV^zAVRiu}-SM_7c^H z%TS+MjL@*Gz;BL@8MPRXZGx5_JTdysDuI%}p97^}6>2YZVR#TH8lT1hyUkCIUfdU) z6z4m==#_u_?m6oUD3*dw`I11j*0xmds05blUSZz69H)NlV7K=PISo5aiCZ`OVUnh^ zosdovYx4OfxAbl_GOAO&t_A8)D0(tuT^3i&r zOD&*3l4wo6eH{<@%JG9G1*EP(gRPXImUas4tP7d3Ol4?Mld{azQgGS0tp|F(xHUz^yPzZ_Xm6v=5?#Lfl z(=PLn#P$fT$8aW9n0?9Gx*wBauqDD6B268MMwSw`KnZBzDJZx1WD`rkm@jTdJ`_i1 z-;^3io%J?;u|4CBi%9yYTgs=+OsMmM7B%Aomki#hF$l)O0FDBsCbo?Iq3RHb)Q|@j zaHw3up>8`DB_7q{YX>Gfm^O8mp#S*b`fV;-^pwuKymM**V>~)W?(5v}5!k$i1D&Q- zTwPu~Y-;yfc1!z)bR zWd**W2VoHy5V%76EKCG^N|WptDoOY5z@%VOoa$nIQtR{}YWx0PX_}+Ja88hXVqiD7 z9;1RR97{fiDuCD))f>it?Bb|-YGz0i7cZ6dX)blpOQnF3;6SUiZvhlgNtXNhn!vR2 z?M+($;+cQIl>yS*i<%%K*0jy!3*Y;vI`a@j&&_;|eCezY&ZSD!47s(K^#=tOwWD_! zD2XtPNJwtnlgB#@7b1Ecnu=Tkl(iS=Lvx(%g}o;SrA`B6mJ!jQ5;~NejtK(A#s8*2 z2&adns>9o)A}t-*6p(^@Yd{hx|3T;uiQg9D4XEJa2)2e#FywF(CefWkF`xqcjZ+ReA8p6Je{{0RmxNe&v;K&*+c`dOi zK#KG|Hw&2CelV@4mls;7M5#I#mLzy)|3Y{Q^Fy#(wXFVgA^QCbL>M!Ae=G2ROV4X^Q7FaCP@bBM9gyL`~JIT@&0LC`*TlQQ!LVM z{-yl0eGloO#b;fw);{FAgw#;^T3`Y9# zKG0;2caHbX@^c1rfXiy3C3OdO?Og}1zjI4Feb4FLblE<)XQBUc1eP!2xAU&>q?P{WBfrii&7YmQgR zXh8r`*VkXGI9`vXBnG!s1g5zfq<)&0m)Eqg4>j{?9wfaz8odJHegvGP2N%y{V$On2 zg6@3E7gl~PI<+kCxo6w({)MhxDJ|EsDZJ7I<9##^f-J7C9$omV%a7NCY4Z{2!*9l; z(^d-)aaqM>+6S429@&=#F7JF!6cG+!~D|9%G)U&|1%j5<*rlf-Dl(%oajcc2_C{g=Tm{h2Qy;UnT@uLRcb1ts_ zD$-ObPuX_O;`-s#0{pxgAG2!M9%G~ZE&OZjNgjQ`txT=bwl4>ExmbqM!k>-=YO%7^ zX8kwt>)}i7Hp3t8hkJA7=@ka)Nm2EaK(@{iL|HJ4%zNO*Nn_!{j5cGeggowf>Gvke zIbMS*Z9?fR#j+VYPeIDz%>DLj2lj%gmgPgMhNV4s?ly-))o&%UBSY0sBK0+hwq)L} zs@vN(E8cP0Pzu15r5@j|$K70Num-%YPHWu(2zZ`$2jIeLYHRa3elQx=HE&tkzfj+E z?@pX7nZ4imwB(>&Ie*a<_wdPn`SR}0pHNyzNGKM7$J1e-q+t+h(l4Hw24`hujas|4 zSHGTH%MIB3-&laECte9Ke8_GeU}^sK3cB*LUh)aFnG<%z@m|M=Mz`Hv>@Nh}q=*?9 zW(WQKd-C(=&pQW(JZ0;KYn>W?Z9ZTsxs^2L8hyJS0Jrkt;bCBp3i$d@Wet9m6yS*3 zqJD%>+#tpLscJ^t0=;^?E_i%d8|eloy&W=nkS07`3%Ca&7gFR}GRK21<_i9_w;_`5 z3Y|VanY~z>%7bPB}=}vzP0hYUDLzW<3mvL=-SK#%jWzX7GgaqB*-Db^W zyLM$&O$~pJ(l{S6G4U^peh(wbISJ|afVj~iVKMdbSvtF)pP#?IIv#mI6?^zoKL6+F z$mx&-5F!8;3+nFOF9*79ncRTe^%?#(|Kj}{9g~2I#;dO@PW(BJ9Oq7Joq>lxo90P4 z@+^wDHQH)x7DmSiqRkWq=b-dbi z{EG`Kl$GU41~7-&08T46H#d%j1uH8n#ksHZe_EW^lo(e4x=`=#9oPlnVjN4=0sp1? z&%GCX1)_fE>jvZXyh=G)S=U1xfhUJ8I0d2sf5Q9r7jn`q{b7#{hgE>vF!1y@Ivw#i zPmJ4H`hKVXwQE3tNWti8D@@XmWZU&6!)G5ZK<5Z-1CN&g%;6bG>bu7Z@1(n6T(q&iIqIiGoZ>Rz;tMfnC<N^D?%G)OO#d)?77xc8nZ%G!1E~f zwW`M1sf0jIO0iVE+MZ_^0Ivhn=H%o+!Na6{#A^p*Zq&VPB2#&6_tDzFo@YDek`(k&si7Bnnk?QAi|w z$OY!32ZXNjT%IAD$8znU&3rnB!M9u*Q)eCc?zb}vZXaAcE_}-8&hA|x=gX7u+1Xh{ zK~Q&X?X**iN!O}PBfxbr3xXc550_gUm$3(GSDcQI_^<}XtmewfM(PGmv%XsDMUtAt zW1@e)>jnhPygA$ZE9n|sx|C7EXlcfwIRpnE-_tIe-D@nfRWHKj)L>ri@R~a71kRzV zs@@DsIbiD=>t7!P26upP(va}*P>;x+Eg4hBEVz+3Zb>SEg;nI%`nHoC9}^iu z-DI#5H#rH&CV<%MmuwYS5IZ|Zzq-2`TX%i(ZGVbgpT+>PZoj>|qvJIl<4c@@>8pTY zT{dZ>1*6Xs0T){ZnpR`X7M1h$jzU?AWFPUSreJWf)q8-DqTQqiS%zl!+$%IUh4l^m zx|-{<#x0ZObmn;BKBemUIXTiwkEV_RZq_-Wu>&)yLaThpyB-srZ~lc=qR7I z#M$FnYwo%W)}=T!=_@fL!`NKp_W-uNKmT)U1Q29_cO+tuZcG^|>U=qqeeY{KIx20m z_uIn~S5{UyvHT=!){aqvE%nkZOVy*Um!eC_0p6BfMytL?E&6DB0SF?1IaKd68j`br zG^hs{bM9*>*r+_qJ$uJB=w_~fV&wX%3b$_;oD>B#oN1fAZMN5Nd-eDPMTL_J$tC8~d;tsB2AKsx9*gHCx?tT6Hu(t}ZTidflUS;M`7gEI0q) znO|nDpf4@4usR(MFo8wfibB92XukcPq`AKT`W2Oi5(%e#D|Cc}imIJT%UwxJYovu< z4nKwgQ0lhLE__#Doi@D0sH+y-0>Z)+aWePH3)V=q7Tj5j%`0|IzFqmc+dnvC)6&w6 zYp%o|&TBx4Q;4(cPWmm3Sa2beg4Vngotok3WBa{Ya>?UG&~?I|yZ+bv7a)L%mNuON z7K)fa{Mp5V$$q;i1-4KztYw)nKVQy$LExj%8qB^ao1Q>R3#qrBam6XaRoCFnaBQTj@aLhDH_%<%tZ)O? z4^>h`1DxFXBLu>E$~b;T(hEO+Xe(S3X=zzz?YL%HaNCj&>(rRczkWC2rg5SxnAgl^ z@9bQ&d}x<_dAkW-@bEQfpC-ERK* zvt+r_hP~Lb&p1Cw!L;ty5Y@~Tk0e~=L^%E9pGy9;f%`Ovo1qvIUn!$yW}*Bpz`)p> zV*<&R;@31ATQn@mmqJgJCsrt#>~?F`IuG0h zyN`SPueqrbmYegY5OGq%`SMoD70!4egC!zqE~`)Q9h)cr-gA;-JukBztM9C@S7*=Q$(o>k_#07N{A!s?n)`zr6;Mrn zTz)XlU$j8E-16ls4(P64qNPB=6!}M5IpBHoST%XKy@?!tXE1G&?C;4O{u6IQH9{Dr z9vd+L6h4Unc+91*2oO_Kx7e~4m@{eR*Ja$Y>_Nelr%Vzf4SOreOLl*E%>x=VZMoXl=0%~EN@`#7g+EsCO zzI>@v=Uc3;aMLI8WXK)^V;eC@p$*HY;I30ViR6-jFh|pkpE@YAXm6bgCm@xJ57sxE z$w}2oWqhlS?yUOqB`gs*+cu|rMl;S091|cIw1YCcASQ}xgmn_bnXR^=%%O6qVbfbf z0#^ZRt`72hY@fM@y?Zsah`eU<(g-Eg2SxCVh@|mIQlmUNr2Y{-lA(ss%bDd=??k(3yGh?i$y#N=E$PKD2HzNg)0nwA#bc43pjArXl zAb?X_z5<-%LQy?L)^zqt3y+Vbbdy+cvxKZvQ_2}ne~6edU9U=ettY5v|0d{R>QRqQ z6DxCwT-uu?r~d@lHb8prj}t?@=hjInXo|`7MhhF~vg%lGhalR6rg-VnV4|xAyihH@ z^q1xmy)VzC{}CmfeP2wI7cZAI1Z6(kSSs3}Tg8W#?U`fMfeXzCHaL@Hh27sM8>&*{ z*>?3_1r(^?jEFs)^xS7W-egce_Cp@~bARX+T^@)%ng4rpkNUK>vzpziVFw$QrRAX zCGGB#mYEmw^ z)Xb6nc`wyhY%uLP*3)Zb3Nba@t<#Cc!G+~!gM ztaYr(2Mgao!9bp3J2i=lQfn37aethz6KouK5A!e1UDF9EaA9SYv)}%bmf`|k*fcjH zUsDob-fko~631r2zA0~C;zF5!!!aHCv3zxWZwasgcwA0!9Dx>9%1j zE@wX#Vn&5mgslE>$%SWy`van}{jqNB@JsV|FJ55>2c?W>UHp!y216CrGl@lBklLz! z6DfL69wqgGrj~7=N_782i6bs5z+QcGy5JN>?miR%N_0raL>j#uQh2||j|TDG_(*oL z#9p+5=Te3BsDC7NFbXS8ab4CaT5&`{HlOf>Uq?Yh-LS)AWXXfyML{9oq!=Mo;t4og zy%c{*tueId6KlzfRX2J`k)Dg93=7zN+VlpA2yX69Fo|v{BFiB?>)^s5XK!cb1SPhy zg$n`sBkJ_{b!;(QR;0rsL4xKJyh_8mykuRgo6W&K%R)mmE}3%_{A6A2TT9oPrXpPx z3W8-$YOU~0ILoa);|1SUAD0yEEey3_ zFsFV4ol$0OFfi^)xb!1~eXUwVzcdO~`P(%mj#(G!VW8exM6TDYhLgG==fZ;4vEy&v z-S@3~oOrM%$1~$8GJi^32O**IL2l<)qU?w1PU0ro3rQEHXI{}IH;Z&Elj;~${jhqF z=IZ*QK?w{H3Bc(}m3SW-uqb>Gzg(gFC6T%G!X4bP>oAH8Z!2OB!v#XY1`3Oqql;AK zS-J)Ud4>l+H0LAak}XJwl|-@6n!O@mRIy(rnl$eH&uuMUtU6s^d#e?bQIUT_V=5vw zpTPL4-*VH|z4E8Iv%dVbuV8XoKZz%vezY4ls?5&kpOt~ai_QKGsRk>oU5Qz-NyOo( zh+i0AeQPc&PWEbj|5>ffYrP?#6m{>yZAV6?2kitK9BKzubRWA5j@rVmwKBHriSE>*_meSoJ%KJQ&#UFWLP~P16-{3ST6nUKd-vhhrpk z?*E2uaV(_m*P(uu$~;b*r-!{GPa#8!Z!&V&8xNt%W^bBtS7E9v;i;>D<>q74a5VXf z%s-XPW6$5=okuVZ~?OOK=c6oN`6_cF=OkLy!-^K>h?@UD%m?J~#@I(j`d_vWF zcy_UvBqygyP2;W6dg)u?0qD5CG_fIKCrs3=)K~f)xWSYVB!DTr4l5gE8wy!ju6}G@ zSV9W6;D+yXFq1rb6~D3$t3I}n@`a1x_ag~|8T-6@y3X2emfVaY+K{eZ)(+{tC2@LD zXuwOtQxVxn5OiL539ISi$;CP|W(OV9?t4j_)gRsm9lZ$h<#hIoU{2$%_)3^Et9+BO zawWbfxd1LCKn+&^Qkj%N&T*0SlhU1~F!;(+A|WEv0TWaqbrXI%OP`YPj(U-I)~r+7 zl$Jo?3;BMj2LmnTj|BQC7ciL0p>RZ!qWofV)!1*UT$#;OR`q(`(LU!|@#g|Rl zT_1~Hhc9B3dQV?i@>A28(zJTaB_SatijNMu!DO-XR^b~6o))L~XWMw~B!r+~m2zrU z&8Sf>k;+i4%fYR_yTO+S1pz-dtZX!Nyf; z&*O$$?L=F77q-#s=;SrL0@N}Twp6WJ&syDFA#2TiJ9??lq$=#ZRidqy5(rtcj3>3tXuD>Syh~nVPSk@{kh z*7lXmk$xY(q|Z~z7`J>MM(|vdqSbWuxk#|>PBaMjeXpTQW!E3ITbF=J~%Hd1no();IR(`16vd$&wOvMr*Mui_&n^nJnw@Y6s zTVQ}ypD(~3RLNa$*-&Y`B6op41t zvkp3KYb?ZRd2R<*`dtfvtFhn zwPTmtU6ho&K5x#(=K=Pr$Ma@M7Tg(y4f|iqL&32vyXl6l+NTHL7?iU%jYDm_E<5XA z?2FRNd>twI&ex@y0+f@3+yDA!7DGAu?^4s9`#TTw2m->nJaN3fO76y3o!I{%Nr=F_ zYmG@RC)}Doa}iGa=mrOYn9DH-P~ifecIUxh+#Kp;bK7fLcMv`}Q(~K(LR&IjPHfZ!2nY znQi{zQi%D_lo<;%ee>r?JC4(#=Di|QDNz*jSZf!IDWf*LVBuPaWz0L=%jxpeX|Tz@ zsOK4)Nka-j7|IrATP>Q{V{m@C9+U9$6$G&f%>}wm#iE#Jg0dklV0m!9ojB5fUn@|9 z*0I?{+46IAf($NT?KTj+)jX8doDpJlf~5ATa!5)ufG0<{29 z{9GmUJhe}WB%H%{jy8$=g=db0iocP{^IY_!&iP;Eh+z$*WH-petj5^3eplY`J6nBFKYee>lVK-7U!%nI+DD=H_fPbKt+GIXYVjt zo^@=#nf;s|%c!Xp_YLoZqo4GmA&x9EO930>Ru;`)|IwHsvyZ8ZtX;ZtRo^rjTOki` z`ji7jP(L%;@7c)fyiE`iJ(&x2_e;H`=*fH|^EPzr1%;~aWY8W_(N}tm6WLko{C6wx zk~eLqREY1`cKh9NSDnu>_37Iu*uFjp8%mXDxj*UoxF+y(V4BBq-c_yNI zhrp|;^UdWk$1BXK&x#h3@m*s*QBrj6B~!}vrW!?wpTxK9>T~rFxlHG%BG{PT`Oih@ zQpeg$oGnanvGJ3bW#_Q{{Y3;<*9ljId~eX_OTYO#rKkf&9s0-;&n^rXlb1Xi4+$k0 zw(cq~mtx46#N{seJS%alI^Kv(1UKqiyP}7lbuTiwh(3L$zI#eNDOUb1G9en$)pHzb zc)Ow-E)*my6)jZ)24MzE+h`hTXq-5xtH_@v5f^qexR)LNns0Cay8nqg(rsN|F#AWt z1Y*xd<`tQ-h-bM=UYHOQp1>CwldA6LAdJ+l&q(1|NZHc_Tp}{kjUwGfmy*!)NEW~9-frQD0qJYL=Rsj*TRf|)g;6Bqp0D*hL zIS`H{bjNpVr<)_?tmj|HH9+fOZ&;=>(s2y#sq639>|Ee1r6d*vWeIgbtF3o;izLfu z-1lytpWf~l=qNEqo?`Z;40kj;^QiqN@;??oY_M_|3mjuDO~`o- z{d0+W@DY9vf=2Gv=5qEU1t-m2jrCo2-g%2Bm)Pgh3JH~oT+}Q+WUx&A%i?A_As)fW z;Fv;TS8pj--^e9^TABa!S|sezS)Wm~ih8G}yivk1@S1 zu+7A5Zb+PKv!lkIdRTSynTcSa>#HvzjYmu08Xt38&qZONN zJq&;we-IZQdhjvW2F88;ARx(-W_j(qggSKwr}|=gYhs#9%c%_R0}3miZW7JJk?{2k z;C$%4x?j3RpI8p86Mhxz3i{Oh&)oJgznaAY4xNV>1mO^jvKcY7&4R0!K80;>o#eUU;V_kx+GAIM1*{i6;B&Ch6BVNR zSEN_c^&XwZ;W2y!GfvDefY`a_rj2%O?Use39*rhcF+)m!cyTtx!sM%@&DGV%?Tqe> zv%Q~`xgbtnqT=Mrm_|Kmfp=js^Zjdtd2FHYlNh@L-0He=8-I7>5QCVn=%`EIu&Cg|bL%Z-f z*ybPtfb}T(^ArT`+(k@cq?+@l#r$}e&>{opp(S7(5 z!0m7ml;}OK@`elcELZUnO@XAkRXZSG>w0PK+S_mbP`K#6tK&2b_kHeP1~0sIRMK3( z-yZKS(0#5;kBxK#ciasbGDthv;SZhu0r{Rjb*DG8DL~e!vEeS+|1;|W!~fZTt@-~N z`-JTO*Z%&`V}&k#o&V#0_^&4*9CODJ@4x>)J;7|q=^XRFZi1%^8z271=KtSTFi0kr z>7JYb|Gl8v`hJ!8e{Vir{r{>9r5UGg{~HVN|I>_|Zg;+6x>9`sIIDhe&K4#1R!9DK zNoZ+f9&xe5P(Uc}&mJexQQn6E71RYlAiv>v?k%&(xo%Kp#}Byu0zES_1(?r!A+jJ& zdkN)Wyy3kwyWZ)`ENdzTFk*yOvwfCaz%&;vS9IZHN4uVi5V_h+6XiRiVRV6`(K9Bm zgja_=4$jI*An>hvn-CY~KcE==l}uyri=e+zq{sP3!=!RfBcXvBRL|hoFt8;^DwbF( zfpLyz0aFwmZ;|M>iEU*_3^_jC#e%cgM&ih zfx5mlGcc3GlBV=93sWqLIB3cn~Ke}c@vF1i7l@?(ViW3t^6iTR}pU9FCLC>``6k|Mv3>Bq`2up&+C-TF;5_}gzP zLU5?sf5pr zkp!Q)3DS=rFy9>77CD=D80A1D$kpi7BFB=2*V@^yDAve?Qi5-Bw0k0?NZ@t_h)(CD zrG=^Czx(Yr2PfyaP z-m`FsfI{1^zvq`EYYz^Rb*%PydI_U-K#+OUKqHzPa;{(pp3S1?TjWvUsm_?ZMK-iu4RmB3S9y zsPfs|6m<~t*h^EXyYui*aQ>hP78Fo_dMa(0%ZWzNR`*~CGAJwDL778?9|H?Sn)~x% zc1p16e!B7SP?R_bGwWNH?#*$}jU->T7E7K&ac+hdo|~f$$p3fz+VPzxr8d)1Ccbi% zKYl$r=76YZ^#~m!K_Ud90DoTau&gG}wHiGVi#k|bGgf2#+oT%7N1vGBM@zm`EPuOx z51+zrfoyM7oJor05B2Wt(}7&!=pfUER*`@tH~Bq>376AS;`jpgmkJY@ligzL=I}@< zSwn?~$>kn{@oKeCzmw7Jv2!^S{KSs$-M@=u{$m8;LZS60v_TUu1#Dl>Frd}xh<(DAhPo`4kLFF19SdwM1i@%Ovf?*suvE;mb}4nbv) z-!1j*jHXl;HYtQNLZBlqFLcM)ei0R&-RaT#gp~b8R9zYA{X>WU>6`9fmo-Zfi16~N z>XU!x2}1|y2qXl3hM`ZA-?fgxn(BL0W{`k0>u{R}5s)6?BCS?*q8m+L^l664e+VAX zwr-Y-smz^w<0Q>M-T}rM z3}$tIaD9Q0p;)ssOtHNFvStVui0I{vCA4T1f2NGSJ>}!?@l$S1lw%QYjIe+~QUwMCZrsklpLlRv=mp~~DwCeh0y1s=j9N3Qb* z-<14e5Lzp#iK>T7DLQmS?sML1M)0fO4nOxhyXeIQ3Juv2eCj8SQzA1R1!w>MaCbL$ z&Ssr1=9|!+Hs?zIAF{qXp6c(9|0+c#ZW7{Jb&XI)(j_~T9oc*Dy*Ek8ULm{4UfJ7C zHgS`Wd2w+=T-VK>m*4Sy{CQ{XM#|TXWUjd42zoS%lx9R)eGf z%EwT;_~t2^2EzXXi1gElZ-%?hm%Lj|OK+c=ZqR2?qsKCg-*=alXbvXfdU>6TM_!^- zR_RUGfcgBs0>|wtIv2hiZQt>#e;&ru-n5r{9yo953WX_ZK99Y{+DDhbl*nA7vFw5-6usJv368lTV#X$H!q?z#C!VV z9Wuzd`m`Lfnsw<5jLXO{TwcdhPW^ZFZk^?)^$?zAl*8>U(aWmj&6X^gxi>tzP)0M7 zX`7QqjcW9RU7r58l0!B8>-T6$LS0LhGBUV7Jjv)nBB>Z%_{JJn=PXYaU2+W`p@3(- z3_C(Zf)xTQuKZgHFUqrfByYG_e(p6CA`oZfPT`u4H~g0=LGbr#wI{Mz_?c3Ka%nan zTRts)#ZEW$HHP$+`xfS&*h#>PWz>m^iLV$z5F0+to4q=bqvKD(&onV8%TdIatI7Vv z>TA;IpSr1cxr`0OcKf5&Bcm0_cRBlo8$kgK9jhiLhsHkxg0W1#{Ydug-fDyNu7;`tBjJb`?f?E|t^u%v)LgXh1gVo`qpH-(k&1M6M`scrG$N ze9g|J#L2qli9~)0P!9dR#s187)JGN0cDhiJgg?AUjBW$Cg9${_NX7N zI=0A4!Zs#wTBblG>$n6ED;!$Sa?(%Kl zzR8lav0fGlI;AZ<#?+mr_raP_cbBEe6CtwQtv^=%*lkW1cG*kdyx-&5o}c0}U(7Wdw;u!P zsM~3>0=;m>2VW-7X64kX#L`2&-Mzl*@_rhL4N$B1@LdlHShlI&yiQ2%zoMm|b|pKW=FK9oDDsS~6VqkQh?Rx&N3fY$pe z?#KTW`Fu9jQgl||*5lGxI+qz5)5;q%9UQ#ry<+_jy72w-LYBw1k-HXwB@${Cr#%)| zM`P8Hs?ztq9p2~2**fB!EK{2r#7tl_125KL6LUx77XB~Lb@=KFmcP*0OYc0X+&o8eaRFRmc6!%jUjc{G@Pp?4C>~mZHqHgewvfstkOOt zg?fkqH1XC2Y#CjrSddhxLY3@dRrF)xtnutXziI8%%7wvi?pSPOn*zZpdkHeq{PLD> z4qdE#!5F6>381TY5F9c%hHBv16fFpgu%(Y9r{(x>yVB*LVPuG z)g`RH4su16Zqv;>Mun&TG}a^6tw&L^VS7U``b|t979XGcY%Um@RZiq&K)DfB8$*0G z@%vX#59LOSb5_S0E6!I<&M?|#_1`)U@#E(YKIZOQTyhO`-kKFW(8xXE4Vmz@Jlj2+ zL_G`0cFs*su0B0Y+dCAv^0{{MMg9Pl9g1Mz0?v_M*o{iZtzJ^0@{w%&M$k{lU zd3Dw;YmV41UnUY{RXJxk>0GZruAe`K&-JGZ#Wv$r2`J3D)%m}L>(yTA-|A6DyQ@2} zr*nQ5@6lDLpj4CNTAmep-tKX%&ZDRV-q1mHd~3*gFoHf>={9XJ5owr_Sg{DY6ad6 zW_4w`YJK+5b%ZR!DTGfehws#9ZE7#CkIvE8?(S6*NltCP(?8?u!y!aMh^S~eGn2L? zVPiVZXI#{fmj)m5b{is__0_DFUUBNQ;)%_WnMqXz2q-?Ub1sPte9tJoC73YXH zwtY(ZYi&QCyZ+4d&++`};Tr+%l8Hvi;IqS{k%zkO!qrFn9pB^2gGStp zA7`D5u6dq3Ydw)fo_jf}BEC(J01pb9}Kny?bx^jt)d7j7Jw|mou9QLPcmIP&O~!jLC1AtxPvD~ ze#CveFaH?;SW0dNo~>lMoOKa`F@R)~T?nWfvx;9dJp-$r{SC-@igYvdhdo@#GDxj& z^!epjZ$I4I+1c3`vR7Y;tMIlEO!tku;6BW?Dhn^S&I4?s3pgC=@ZSK{09<)D(zZ4o3lvNAE10!- z;;`MZQ|Ly5BN|}ra#r0Sy}CeZM^QF)8PL!wv|r?_muRkgx8l89$L-R91c+U|F0X_m zV_u)L5Cfh-INt&2-xAGBz4@cI?bEixnHhP`PN3;^)`uhlHIX~fJr`Vrau`#ce)g87 zhW^8^Nq4ur(GotP(K#YAAFT8M*`_Okio_-=uRE{TSL~`HKf1MYwg9K9Sd{$!mY+nUfJgub#T-znx_~`zq9g@Z7)QC- z+Au84OiVzU2ypIDz!wX1-adx65ljy`%sme_Pan4*&zdUG5J?^Y!2Jvko0uK;o#&&E z`$RZl48tpC%eH_NQToDgQXEKHZ#CT;K%>!>gp$$>MR+Zb2)e;Xg1~+|5@-i07f28S z>mEL}rUwASl`J)m+Yl(-FBl9)zXfPOCjk+>c2}%Qzd{)OP-RTJra3nD zrqQI0x|C!%eEjQ2W@oZz=~Rc@=(#F zAT!@5*O9nESB{i`)8J6OtEZzz$L^V_HkGTbl$;B`&aHC*Ld*}_k7&2fcgo->5Xxh$ z#LYB_GgBB1?Tb}S;=E?sM{PCBgwHZw#)N))M5z?;r`Gw%uc-0>*^N_+#kI5>6UJ6i zsa7gK6#)0L!5GA^>})0gJG|UiomBD>i)gUW#yz=!juP8yp9(l>X@Plh)FH_n54I~? zvCX}ch=_=;MORDJCKlN|0h#{JPU$K%5Ur`C((p;@ibsg`d-fQsolZCf)wyP)k7fsDat?y}{`&VC z`j~w;!Z1=sNG~+!OxjMgWOuCky+KFj3t%NS6?nJ?9b2z>g7(J^&PxJ72Z0A$3|@R05yzmAYxB) zLk{+y!ak2W?w-RJ@kIh8mog4)Z!{Ma+{_CP=zK)bv zF9R~`kf@m0pDd~=TOnp#B6tk+u^g#ZB5~l8TIZPK`?|o8AXdf5FHv@;RQ?Lmh%-ns z`Gt8zQN`)fW_vq6$4YNlyUz{A3fKX;5}V~NPLu&eK+Tc)VyZvlikR55tv3d1@;+;9 zZ=qFdwXeI64|3X3KXn}M&8`sHhaI-|06}O24;Df-_zl3eBWyBlY;JN~v~|+AX4i_S zS*67I=+$`Lc!e3_ISZZW!R_TR>J~niayL5o`T zI-vss0>Hz2#bv7x*qVU8cD|2x2~TiuZmX`|0>sb*0)_(XuuXC!TOk1lURYpY4w6AXmb&9?_MHaC~Z-S-#D7_b~%-kx9VJUi>aB9zi}I}@UlHvS1tGn>qT;CIybC1Or#mRT zcYu}EGN6Ms8>%{jApu`}Cfxd|d$=kj2poXREZ?g2C=I*SR9ZU5_yht0ZI}zhM2}^) zTCT*Nzc^}#oUOs>z+YUzCC|7DaOgG5#(_JUW1~dyDc3|0SUo^eF-37%&ub&o1R1kZ zQmW6LV%#x1Gdrscw*XO)7<>*M1fT*Cyj#Kh<)V;)DGYc8K*NzCw$Ni5u=w!al7WW{ zEswnMg%wglINyfMt{AO>je6{W@22(X|Pe%44SCYW+K5@V@ zZ}jhve(nFjOo3BJq5@h|{GH4!d4{%K5vQj|9`*WoK%jB<0s5h%w!X%%cxipSy}=}8 zO`Qvw(w2*-De$zivcio|0K$c*5x{DKyDzKii0Z?d{|8hwJC4`Od)x-j_ zx?>z3m z{w@rzkjk#8ztvRT(407EO(Cwqonl|FU$4y=CqMlYToE;d#55+hccm!)SyW}r!(?tj zK%o?5nj%m3{7p>_tB-K(2KnW;ekVbySQZ(OGOBcCfO7vv#{b_SJsrOWm8e=Pgi5arsM zS`RD#0Bs0B-SHKh$6$OOqJ_Y&5!5$qrSZ=3QMz(4;H82R;{5L`Fky)9&Af@p(Tspd zHZr1mFMC^;RY4I-n&mzF0fmlG#DafJ&m5K)Q;Nz z#{;I?b&}g=M`3$aqir^~4Q&de308v5fb(^FjH`M(3RchQCe8&+*<+&Fmsd$}nFoNZ z$SE5oS4YQ~xu#hj&VJ$cK+Z%)4F2-!SKS&@7QF>FvAMOj3fE$#7nR4~Oa8L<+vk4w65TqdlZAza zK9&%W&M&+B2{EJ>K2V^(|E;A(pO<>hZQx(<5wz#$*70d^0|GgG>6Octk z#s3AJ@2sN020xssv(?lo76RzPx`SjtpCJ;+-ja|!NFM={*iqOa!@Chp6~>ybY`w!% zP+v2%@!__99QKurCVS4nA0ZVU+GtQ4DhAJ;@iV6_UKw81?p}2tIUxpDXg?DZqw#s1 zxo03RmBdx>AAd}hF%o=o{wUluL777w#YiDvXori=r>OaVSb&y}j*gsx!rc$Y3Bx|f zxHNN4NHpEbb-F5-=tu9MG7nPVg6T1uS}Jhrx1CZycWDpAb+pFavOu-auU|VI)0dnC z7w8SdtY$qAO@@xr_1Bc+S_miY#whpfPSXWH<^s(&P|JE5`M_Qz!MpfDmQ``JhIgn2 za1TL+)Nbt3h&CsAAp`V%#+2@esg2dy3YC^+5Kd}%$#WGn7RB6O188I?ec)kp_WiZ1rI%8H6B(yT4*7k$YKE*kYp|1XsflvF^o zRhi?q${2VLO>VquCX_lJu(0SnT>aaPTjz3=Ir4I&?+PI17>!~CFzT}2gkC}_81$yZrbRL~zVCb*L%0G{m@4nL-Q?2(qRiKbdUo`n6+)jw$W&{yX zT|t$zcM?=Kd1uW1c4T-Zj%qHI?ci(NpmR1ooWIu*v$<$E)*m7E@-LN>iyK?a{Z0B(P*jwj`M0e_|uyDC+2 zDflY11L6)s%)2K+0JDrDc6Poge|71%uNY-ms0MwkJkY*?F8SqvF%ylQ2f1U8u_N;x zM!NfG{fbo7s!d`lB;BN8grCA~-6tU6gev5)>-gCJ;^F}9-!I38Uj80)k!BXLhcdo0 z<}%>s-3t`F8yOx-I01za8t;G6oMh?~;B5F%2POdm7DYjDR33WNLgbKvK<=6LVz2*WuGKEPdG#_R^<}pxlTo<^pssUb6@*F|-;+RA zEU8JQ;ic@<0&a#J3Lu%yRt3C5)FWxIv&-iPBPC&!$pe;9(lI@9kGJ7K3v}4}eA(oz zVAQsvl2&eBm?0K4|1IxrGe+f!x!#bVS9~Oi+2^kG_g<<_%MIZnli|9eSNPrxq<|ow zt8UgVVU8kAM`V7%Wmt(4=M$)>cf@3x@?J*W8xYhg{%V&2Pi(HO2j>IdQY2A+2IL0B zs#;{?heTx#rasUXTKEXcJi@Sn9++acbp}6_d;sB}A@&UHjev3sex{9gb}V0OIm5XS z#8KERwfC2`@|q1-0O|YV@9#Ic3T|oLzQGxJ=%APCgvKVWiFUkX|KM;JQmo9L{>m*_ zchnMuJUwl#6ljtvyS95eq2okV{bTH24X!1EOoWy+ctPWurrs#c-hZXPRxA0K8}_Nt z)05xupwF1g=du0iQlga}U=;Qnfg~XAxB@BEn>+w=mWfGiE4_J4qv7Omg{3T|QWA}k z`V+ldCeX-NHB$#az9AR6L+rgycmfWOO{&C56yJPU;J8;>SgIMWt(A0#dnEkUy?d;& zvh~Ws<8}uf=Vt*!HPi!B;Emx5_QErg9p@r<)MEQARJ3Z-V{o8KH28WM9tr)yiLJH+ z>Ftc&1XEwN6Z)V#<>}9ZplWEXadlm{n*O1y>?nSxpd&^$kdF)}IU_SlH*Hxu_sgk>w?~s>6##s5o z(o%w3$Vp1VD1y({_!_X076GFr@O0>poA+zLS8c5YTA1w*UZ)BW!*PdT1@hDP*T9-` zNN3&J6bnGHfxJ6fyxJnrMc#zj6e`Js>eVpWm}f+lj%+sZR9?FbQNR68@uP;yYil;0 z)MZW4#Nh(Tpn2^lenFrQ@i90Au<9>Og3U_(E4CuLJoy?Oas0>r!Ew#b{>xdV?A+Q8 zykCxXNQa%@br5-9DGqPx?t+X1qzO;mB9a`1mB_0rz$#YP8uv1CYvSx>yQfF{4QsN$ z%v1N?A%svQ$(L>ykZvma(BsG=d5B!jPqF0I_|u6Y(D9IlmZx2OU-AtRofuC^37lxa zTUP*T@yV#|M`gINqZ3$vKs{!RDr6di(Yfz0xa0mL8NWY6b^;`0-1KMxb*g5eS~uo7 zzrYJ@n$BEErawsVlQULD98i0%wH#w?*sy{ zMa!4L8Ba9?WL4^@z~BLBTC?XJxGzAyU&Dq!+_e#`{<#+MSRV27k#zfDQFw*XX7yYV z#zPpK=J04?EJ`^*ld!AndA0KIiHTIiz_%SgwXfqq21NJo>!h#a<62r;fEc#Yt1p-? z=Dhz6?=m%LqBXT1l1;pcsO81|{We1YZLO=J+v^|~!0nwJ1sZFC8fU4c@~?$?B7@@E zvAjsSvS2UBP5SO93&=mXg#*{W#gAZJw>w> z3n;ok8QieStvNF_m2gKiU0Guw#tEG&K0Q18=M9EHbwEWmG00e8p5tL$F#)b{3T7pk z{zI|j71#HIM@m!%Cnm^{sN~gDi`R-a(kTMHmkUcv>Aj4C%D|3vG6Zn8l>|JVX)5kM zhnvr{Y~!k;VxW+2FPwZYe1iqnTxq~n37WS9Q`B^)QFq1h-p{fXX`*{ttIn~HLTY*L zvUHqHK625UFhzg^lI42p)i!@k^wgAVP|>ubb*&!gNsRe{8oe86CEORFau5^jDTpr7 zwD+(8+BKWIl$4a+W+}H~L615;b=*-nfC!|m^#)d=dd$nlf#3nLlQmnFr}PhEWKr5m zj5%8UP1Bi9%x%z<29L-twx`1Dq9@D+3jIC(S_}c5y0?!vP#FV--u&6wl;9IRy@zx_ z6u?Zj`#6?rDyI>giRV1n{B#yvUKfYaW5J%AKl-w~ zS%5j7F&5~jgRHi~&>dDZy}s+;9w-4~$FuA>L^d?Kr=}VBA(WO^RHmlxbzIDc-ZIV{ z0CWh)Hj|N&rLO&L>8NfNrl(-2x317;jO_!bm>8C`qVruArLrqSHHz=<71W^_f#Tex z*Zsu)m5CNJ`Zzr3{kBvpk%JzYvc%!hYA&Y3?=>$icI$9`y_Bx$B5d zZV2H@QA}5sH?-v7SOu9+Bw8H|`J@*U+StUzC#Yy_4b;Yf;BVfs;5XlCRxsy`ZZP7d zy>VnHoSBWOD#~uWbHTRmrDv}>3|h?cSW!xXSMD@TdwH2T3cMJ8}*K-d6>uLdDumo)HBR+rPv(0$#hmJM`ROHsZ zYf64@KH>Hiw<2ZdgZKQ!nB(8yp7a9uzjed-Q5vTOkTVC>d>226OQ0q-4&lnng)3C+ z@@A_R{f-3I3}wP%sG*hLM}hMndU1RH`J>+qIWtu+eP5LB5mLc;a24>Gv?sz9$}8X; zC~)tno$hOo-C%U_eW02bN>^4a(BRG{5Bof~4y5*2$uH*3N}(Bj)IE}{KeLbK6wU0; z%cv74Kt_4+px{D|>l__&R26cx#TT<TA5TXtLC!Mbm5iczNNUFjl zgJ&C@6rfmyv2NC7$iELtMZA3;0==c>{WU*#+A1GJ<;94tSI!(6*B{#~m+qa5tqw_l z9UPq9@EjDzA_~X6{BkC}w36WDU$|VabpkO4x|LPyHrC4!ph_0T+KtdNG~9*JStwt2 z7l|8tBKPr-D+(?xbn_-_|BaW_emSdG6n2AH5@ZwQAfXqI2sZ9|eQrw#Z8%ui{cJ-u zvc@kxpRhG>MJ0TgE-$uY$fluyaM8H8RQ|6WxfTWO8WWK?#62-Y4OK}t=Q{lU6rSw6 zvwE_Q%ipph^~>R-z2OGC3=vX!eP^ISMIq^Lxq?jphO$7Mg`B#q@n^T_uE_NoI4r~Y zIr*ESn9AI$a~B_CwAEw39ipU9kV2B$b5WyqQmuF&4FhL@ zYu}s<5@ab@^Z3Rgp~)R%Jf1|gijc%-J8dT&DwC^%>%g8g4C3}J0X35e_GWfvHtcEjd6OebKo(nPy_#PkFPlDs~rQI>?BRbpn^IL z!@l%8aGc&zROZ#;vJspktISC~Tjt$y8&|;!kbuX>YQ$?vtmZN7(se3IuQlb=X%r?j zMXWM`+Q<7xFU>ie%A&rmMG1w05~ci?sqop%vZc~}w$tuMt#Lt_JCQF@ zDYDTjhV1esli+fuhmYygdfX1Css$7wP${VImNOOk8>qRIt@7V*E5S{FU$#-V=DrYN zyT0+N?O~x}z!zVGt8cfC5pD@<)Su11$cTjpSqaV+Lb@VJ?T zZx%rgo1~LJOQ_u&y^A%O>022hyZ*hKQoVX25zHM?5{9lnV>-cw95&hb@LIT2%6(Jq z7%E9g7x>437fQ%Od=P370t>Y^EM@AbLCo{C%u_r*B)S* zOoiSpP2rQjdw$yLH4FRsDLmiYtMFOGoV5-Kt;@-ZnOaaUyL%#ft(dFUs_CxFEoG&< zgsXiOGJf_eS=V{{@OGM4?V@s;rZmaYtY5Z@4PY43jAb|`_6T?>WoV#@7zT#-R=PovdgLvpATy!B2$e?#tvDUl!f;6si=?#+$6+$&Kf8|NT*Dx=ysT(zaf%Uat1<&zaLHrXabBEqX@a z>u4sFvBTpml1#&)Zy+$*L z&}+T)@lF2k;R;J95)i(n@0Blet4#gQ&6!&o?z0#r2G@XJTi^b-!b04M+Qr9yycHS_ zr6BJ;)J5WdO}&Gf$J`DTV1Av_3Dyi}C{;numtX_Z7md>7BoRsQH;^QFa66MFSWZ5% zK{(n@I(0Y{Ldqul2`WWS3WdAWM1UP&i!$^YbF$=3X_=QXw;{ThF3h%5g~^or?4Fv&@R~29NQ|)v~g9`E?KIrcI%UiWXbA zjpEf1uaUHIn>{^Zt^4@yd8v__caUz7_Ic~;^K$+m-`YL3l_ga)*vnl`h^Y12W4e-% z@h1Dp)mX#x#si!M_)wm~Kb5)-VVrL-h67yM#W&0oj@_#ps|r$NxTI|COV2>3ZE>W- z9%@hvCs}rGjYHxM>v2cGRLx>NUjCk8w+;x77gvECy7-;3^D=L7zTlwukG-j!Br&jg z@bTpmW#^B;-6%_99EoZBOdPk7Z3}Pz|LgjVV;TP~aO6Za{Cm#CH|^qLR>ldiW|y@r8nwxI64zA|-(;jfHnRhh}f@IHD@E=?Z0g{JgM zg-8^%)|X?v~AR!u>keT%utc85x$*Vwu}zdQ+J3n$a} zZ#a8?3Ft9&zFvo6R;yRZA*>J*2f>ev!plftRe|$}W1~>DW(5UKfGLyd>*p z^<6BJgWUV@*M)@|vLK!LNs2t4`3A|$$>gsmIWvtqnuY$){DNi{zpMqPTEx!uCQnX> z$Y<5(LN=--LT)_^q|wd=<8C5HB%0tlY3)1AW3I8%V@KTtlT0Cy2xx`3{YhO6iO9%A zhHe1oXr;jNZT$Bx{N-+SssXldvGtl! zOFNsWmt41q5%~ZP@NPAl?EJA{Dn2R^eSAIryD(@N1sgz$kI3R?YN}qNsIsxqqRB^2 zB*6Z2QbHWFbD00aZ0}-_#>XYE?{Rdy0qsnLGhz;Ok%1gzH(U6lvrYfC<<~*C|32AU zl?g`QJ{B2l!ml=V{olXS`cLwhr|`Y4%)c*nk9XDLuAX^CxH!M@_ic;Bi>s^SbqA;O6OHmJ5Yv zznmB3B%)8V1G9$kUt0 zxY56O{^gD3ISb!ESf3l&+3fR&u(JWACeD%-5(+()(HME){`b?ip2$&&!13B29;Y0` zou$%X_M97FX3Ow*(=WlJO7cFd7svq_z<;JKT_OxD>e%S2tAR<(%m>~hslt~QTj8HPfm$pBM_?7l)}cT+ikXHSr3D} z#6Q_=PSR)Y_dE$a!Y@SS2)^y4cdv780ax9h!%q7jwlo@V8)t?@DI`pZ;@uVN;fE z=6WvG`io!Cr)_NCR>x$s%WCaThVQ?Sz~O=1EA;R`FLS4}u3p9BtvpNKkK%2j>cpMi z?J7K3*JTPmdP}!vyLgraCOR9H2{QzC+VI#fm;Q8?I$u|G;SdV-AWC8udfI{qW7y;3}3|;EO-( zY%WLIbHvKa==k&TGy3*cwV$viir&^vk^kQJ+*A4S*TQzYOlVi_whV+M6dr0yKERms zs~6nxGnc_Pz7zb_KFbfJhV_+o?wikpx2(YSlUAi!n`a9jdyV9`NzZeq|KK}kBuIor zk3@8u#%yckgs0tWlW&N>gX&5;{vF6A6ui^_W`sZafLuuP`fuqIH@wAu3Im7jQ^H z3VEg6GUOH;EtNp1ii-hS0ScSN$^pv z*i}FNH^|EtFu6o5LY;;!C)rBx&lQCv4#LlHsFZ6M*gSz}dD+cpFJ&b6{oD2L%5X70 zc#=ZW=AQTm2c}i5hhg}oD;BW#W>8WHqzlw63Q4l+G^8XlFSWe-+*si?ydJPLxB|@; z2t@s3$!4rmy70@redT5*&`#>&SD-H4r%&LgNamuI8$Eaq2{p4#&h@2#|F)A=fts8R zwNqNEI+goadM_0k1{GDp3S4jqHiQ}9+bL>m3pq)B!hsqh6Ok47KA}s*gq4IWIE<wq_Wst5NR0Y!X~c8;bgJL-q?3 zS?>w1KbIXvbrlhrRf(~qJT|(YGQJ_C>G|(^OCMNjR4+nKW+l%KLcX%wuerlsq=az< zUkhuR#AA@>ra?i#PmjzD+!LH97`nN!pI>k2ynX&3F%*l?OYKw|Jd+{nXYY?}R2t@3gY02+xF_c@^e{-Lp-|Fkf8F#JZRzxJ?u&PxC+-a;~ zVkj49M@eG?GV4P53!D(qf{Hrgdz^3`2lcu4bv|WgT@(Y3S*9z7)mwc~5up{w<77?5nnp^?ag#AIznCDem+cOF}5Ag+0byCb#wR|HA@& z$o%ONP4bS9e6$Ym8OvTQ<6WuD^B2~N(US%K?*fa>wiWZ9u4LBFY6tr2YMTKY3dtR{+BQ;Rk}_Ln-deuw^TQxO6>% zKB2gI&++6etyOKat2<3rUGO!;?PtJu(>5=t41XuR1^FUS^WPayLsn^*onv#)))FwZ z6vPHk3#26Q*f^WhK@zC0zAtofb_NrGpF%|SaHAFzyw$TB#`?EqlyNthh*Nu_^4L=) zbr}HXaC<-a|M=y|M*#JC>oTCN?Ln9qAFC5g_k{J;G02F?z}UKXX8qeY{g}fOu)dxP zCA)zx4i12jApam)V8-1`y}Tct0b=;A>yvQDe5|d%1rJVPGbG$ciI3d z&A$FGHathO3WJ`R0YEXyn^)t$4pOm*{kx<#DWsPQ=6Tup^{xbYGvM+`PXR;S1io^A zMV<3UKVa!)`rTk`U(tAAc!4=s%YEA!x+zFcfrxYPnxSGA3qJh&hH$jz>AzbV_fFJF z8bFg{#gQpa|Ui$X>r)lXeIDe#ELL=Y5>Kf{9!COw`$Z3JEhf&Rd)rRN>HUZN;| z#07bH3Oot`gXZ149uwjTGRWgxx@a={(MVk@9xTUfXPrrK$^{VQRg>TZCe;dJO4HMB zTs3Z2B_0IW83&H&389-(x>e&q#)K3&*$4pGwszS?4(une7@9zeUBv+z@?n>bphGFz zg6ZjWQY=t;7Yo_vmDKuYD5*fLGMf8!24K4H*<=z{{bCdV%Fer0 zNH%Q32UawRYpxvH32a0MbyS~C+vKuQ+LdxdEtOy>KHP^QVuy>Q8#`+F8IPT*Er$3L zSV`h+%)yG6i#c}c1k${hkq^n(jM{;)BoMsUsr;A>7r0qF?JVxUTdYw6s!0EeqdlUF zI4U~qA6OC)=&`D5tSII{a2Zm(3>;7GLVR=L^NP`U z;Qh=X^CSx{T@*sxk46FF%uq!(e(AruFAnX&=kef>!*l`2U7vmKbIbY;luud10YT2Y zb+--H_ho;T-;%^)7Jp%Z?MaxQ{GaAH(Cg26o&U&on ztB{UOE4PkQ!{weTe~(lzz7J^`i)&%l3RlL6~HIC*Pbn+U%a`$i?H+bzq!y`i~T?}A#P&56CAmprJr99I5X1#WiV|Xf9l_s}e4kypj(o$Y&X&lzE z+{LRE48?`FaZTGS;aP!u^PDrMLZ02s>8TjWz{vi*DSrYx*nNMhqWWu;$6EGJRGT#% z8e2OEHm}#d$A@uk>|YHCSUx(ETj!6(Hck3$d@QlkFVNfszC}t(06scuODg^9)1V6Y zS_aNw_EL=ja{zyhvP8BY)Wa3t1qzU3!SU>xCnC;3SN9c7fqn(ph@_!FPf=X4bxxb6 zK$myLy;-&BHGr~ZQ=)b}b{^O85}XO|%;fG7cd-jbZHNVreL2+1G+Ev!@w;ipu zwfT1X9LaV*{s4o%uuCefYi#)2YtD@b;Mtv~tcs^gOZQ}o(Q7(o+J2lI!xR<935L;w(9o?SO$pgM{MCUmAg(ElsCYbU6KBL!NtnV%&wforP#O6+XIY* zocc$V0(6CQ;}`~wj>aMYs_)K@7%EK(Toi~tKX*MJrHy)JuaNeI0w-*Mb$_$E>Fh+e zbHz*AMF8}Q)hVBh8km}1LCS0D;T*<-KlwE>w&yU}Ney-R42<@RJgQ zF?((91>4akXGjQy8lVvXt>FBrq^snKNv=bNHG{lFt{VD*=s6waRoNuEeUpqO@RzO7 z>~{dsCxv$*$T2>^u7F0a(2n-{JM(Ja^Rq5|b~Zu*>;_HE%?}lltnN0>hw$YNt3Oyp z0H?kS2Y~Z4;17g(L9WG}QeO{TLgt-)nEH-J|hVyQVjEgL*V@urw$+!kQK!HvN|(K z3kR;<>us8LY^kg=u)?Y{j5IkR z_;k@GH)sM!30K$(IshTlZT$s68+dw$ndt({l-IA1f{{pr%8!b7j7(05X(qx3OnLx& z?qk z0&iVPcjQhUq%A5682Jps6546fOReKSsFW1H_sKIHN=W+8O*fA!`%GHGNhT_HcJPke zoOzkFAU%QNdHxNVZ*6U2u0WoI1p|mUV{4l0^_h(r%=B!@IK%lrDoJ2k4_%m^wlk*5 zdUNo1kq9y~!=&)s(?6WC{_W$=jrtFt{&SgY^1{yyCKtskk7eZ={9JYiNv&-oIyZ28 zpelH;4BtKnP%_SCLBwM(1+6nACV0ZR&Mzkoz8HWxF&4E_NFrt16?5_Mc%2GDG#DF6 zdJ56(xbhF4*JXfrO4^VcY)sN+zOCf{5cS^iRQ_=v@FC+6IiwtAM@F)fl|7HWBQsk@ zcD9gYXJ&`&Q1(t_ha~xNtjG@8+0V!Q-1qbJ>W{q2adnOF_5HjjTi=BZc(TE*yLSEj zWaymc_ODaW3YQn}?BZD&a8VN1IZegitHG`VrUQ4ZP)s&-ARY&BrF5X7KcuYe!3>N> z>qO4g*JJYE=x9#tX#D;6|a`mjD8XzT!nP@3Nb z1qEr*8;gt9E}rt5iH2oc!wU3|?ABm!4DXAG+@Z6vCAcLOkg!MHJb**pAJq^1;Xx~{ z#d$pt0FU#%v6+CK^*Y|qqN2WG<|+%@V5Zh9^#{k7;;dW4rmnX{wg0zYVo zgs#}95nP!IE=>|)#RQ&?1!~_(;YjL(EmCx^YCLSO#spMDzqR-teEGBlm5s2IY^<&h z#S3tDj#cAhaM`|S)*GuZRxXqS-AA)i>V2n44Hj<;i}`*DKiwySuuFzx@{${4R{DNz z@1l+(q&xNu1jq{=ST8-mtyGUY=+A<9YaM-ke0(l?>6%T?wo@Q?0)V@|Oi?dE!POGPgNA25=8(saMm@pfRepT@3akn-j(>%Z}}kf7tJ|g-==gs8U8;;`NQ(LOj6ay zCoAo$N_wO{AL9UJH8y)clU!b~7f&RI#6j%f<|_A@MagMqr1e3!+RsM=g+tlH8i6#w zFbyYLWC0Al(k+IidaGC|BAKTL8^#^q2(pf0^6}2n=Sl(piN3zRm7EiJ?@Y*~+4?yU ziYPhJBxx~)u_Ok>pJe5stg=VRzl8jydth0yE-Va7yLL5-@u8t1nAu~;vTA*eaV5D@ zuv2$E2xHhHKxD?V4DDT^W_Sk)*Z%zZ141^#hVN^nditQcfk7Y}PwE5bEu~z5^BI}( zrdv;?K0bVtmgaNv&xP0Y-@lCm*iex?AZceE`iX$~(jsc5L=^9B`u&+Y$B`YeF%L%O zJ9m_W+XjZ9vBqUWj7Mb-+1O%I${61MXYz5G5jmyYsD~Tsi&{lho!wA5Zj4RA-H%P=LI`56`+`I-uq&iwS|R+yj=^1qogNBfyPNyRr$RBsE-((lzT-GBV5>q2EvZs& z`lM~24v zlpZ=*&?15u{~I6gKu*$jV$h z3{5v!SYc5u6scfKgCZ!YC>?ZIrV|)jo5pU!3JU){NKgn+R5g$`qp>j1yK7uU3U05x zjlo-C+(}?XC&Yb%0HU*QME?YuGcW>|71<7U5t&epe67gbcW+l9 zKjNEYcy{`uf4%AfbH``!Ow>FXv$lcmG|r38RM_8znrHOg5E~ltCX0Is_b60o&VV2l z)+lnkkz{{I?*(5k@gD0cu%3QX5_TiH(zK`MsIDh)D^u5_Y4l*gf#CJO-aO~aQ^^hm z&mU9p_#pwos!P(|W(F9LQIqnp6`-O8`(6)Yk#;i1A0DTt2Q%kj!GJ4Oth4P;k8JZW z?%;8k@i+=GY#HAaZDzJli&rbu%q}E)63p*2&I z2Vf+=h1 z@{7lxW>`?qoW5-ysE(-RJ7`jdSp#B}nU%GAa17TydS1vTEv;a7?&n@R$;PPil)ci>b>SWvDa&$rQA~y0j#erhaiOWGsJIhR+1Plr zJbX(;nL#PnT?EcN_+}iP9rQR@u(cs=k-3UvHs4nSLXE*l-mOXbB1XT)*LdPR5ZFsA zjpeNW&Wp`%41NrNWFwmfD~XQFNJiBWlyqp2k>CRf3FxCrF+HJ^F6xaa z2XEAsC3_mLd>pk56W?!6ZyF08*~yJWXXQ=UNh?m1PMV~r$d30Ra4L)7?9hS{7h9{V z>%Y59j$laXhiDBnLAOg1MsB1!;FBpwQc=!j2*_B6IFdojb{-u{mh2(ucWmS`j$$O~ zFsWcg;tr5qM!fBpgFFnSc!ChAi=NfX!9O++0L@bkQB0VIU07Ket*&ly0Tdy3@GLGa z@^s;mH`bOF*ue%!Wezmno}x9)Jh8kRV^2a+7Xex;P5vhT)e+gPJ_;uyle(Q<=jiL= z;$mad?KP=#+oC89UNFpzp#rJ~58w1#@%rPIeWWQ1L>=aj1*PFx%^oeQ* zGh;ZUXwrKx7O0EJn0K<8larG_JX#)d8YY8Wo2Famxv(bq8Nes*3K>81LdllGDg9t9 zhb#o2=WF;hgqL3gTN%X6e~Wq{g<^|<3=)(y4Rc8exFbQ7tIbu7HMV~(5>wUMx&dvb zpQ}wOAXj8%O^lQsr0xO(&>V@$pF3`4!X#Un1D@&QE_jLXEn9@ls}8h96b|E$x)04C z9#)K{*WB*S9ffJe_$@H%)s$Dq_@5}R%;sdOQXv#coNu(8#yQd#UVL{svfA;q+_KA&Fa!Co25yz$fa^!+*QXJt>mNTA| z%hi>v{8TqX`b2*#I+0$>;15$qJ0-W3DZ=?fpSE22OyET-Bs>#Olee>+UTD z9@L47K0O&OYO@No0BINh2rq!0L)0}uY1-f9h!HD{^6(st!W=+n9>jlF}g|uBoaZ^ICL|_I+*6x&!jEqF&GJLs&VhnZY zI9cx4^xr)tbHs+C#0`8)*6dY+%+ZG@iMfg)pWlwG4Ce=+2r1=Y0d9H(*~3;<22n0t znSA#~E4847b)F7caE7aCX9QJ?ud&z6Ip^|g0F>7dv zR7N>pONWTJD!Fipm})B?iDxjR+DSBSB zc`toUWsv8;HqT2Pv3q*_j3`D~R>i5~4*g3*>V?pqTa68<8ZR4L3wa)ia!wPuhp#+} zDK>m^a3qi=iDE`b3Z~y9k-2^d26ZAqXRMJ|1G3f8!TYjPLn8AvIK z(oQ(C;O~PrT38D!~D=_{PaB6zKuD^%bOHdadEO4Y?O)g)F$WSY+V!s#;(dnHo z8CKL@n*rw&+Ze%=>)yW@5lNWnEISd4LjGE-o9mvBem_Izybq7(sPSEg=4=* zus+KTf3Jb?gpYSSc$#_MPMafhdbSuogWNwxG*fL>J;Wt)jwT3%S*`P4X;~x2%`TDr z4sk&$Syy#PWzQzt!C6CG!s2F6Ao<1hF3=OA|0^w!M&bqe(3x5?h6A#eC1L7Zmj)A| z1=NW89q&8J>G`%~u|>eXa!lvNRiSPdiL-xs4XFnGm9XQ(X6ER5JFH>O*#MPsT{4~>i*1a6EQ`PkX@)@lQ%hgV_TBzRxK z0{gRTC)zOoM)wwEw>UR@sm6C=iYM*sL^8|EOX>Z0HMufhGZ*WX4%dI^>;$O0^vhlC z&HvK^jIK^h+)#^$CwkL=Q$}WNo*8lkqUGJp&3`FK91TxSX0S!jbf*?jhvnpA+;*y3 zsch3~o15{FF?mIsyMZS*5=Mqb0wf(5^Y-fAjqZ*M9%zAF+9kfe9P3mwmC0oJK-{s1C-i)?d%m2>~f5B^k2#x^&?Q>Uv6 zIQy4qyr=A`uW}Y87ojy!54Cs*=2vCr3lRtuBZx8HaCPm7y{u137AFis^z8Vx7-pts zoh@%1tS9Cdrmog`<;dnl`X&!+`Y;p2Ts zO@bf_xTm9kK{@%jgC{h6{j>!~r%=S=(h`7hkg5Vi9VB_0qc>X)ruzUX?_XCdgj-x? zWBPP?kZ^NoaNr+wQRZ41WG#)?X7(>YQ8i2ze&Sbdk$~kW`()NhF!Psi&dBmI832zgB*v=A!j(S7F|$!bH?xIHd@059+PAafcH4Q39k3}7=qZj?4J6#RL5 z+N8$t1&Zt9k>Mitt1$wKTWpA%YoMvT-^GtBWyGB&f@y{f27jqB^(qx@U0qe}*kcol zz}Z@kfo-nfw(q+ATcaye=Pi?{VbH(!axpqT>&xr>k4Wio zH4XG41tG#r1=y+pb?rp@^MBoNM-jK{7-RgKE6lz|Jl9Mx`L(^yp%f-*8O zY4ljTp84(X@0Ag!QY+gDK!e}~#;KfyX_#3j63ZT1g54$d4x~-JH2+Xv|LnBOUL-RN z0cs7<7ynD6AW zeP`+6>4K`^;vWH=j(M7~?aw^CS<;o*D{&bqr<$D% zl9?lbNYyI_yi}(zD=X`#K-q|$XpBtZXPA<&Fl8{q1_OA&n5z1EMb%09Jaeq)?aUh< z{mp+mScGDl_98|mm4hYu-wQ>xn2fC)#P_gj2F1TMES5$8-q8-aisRKs^MoM8MUElV zESR?o)ecD!i>2IwKpUQSLuEMoCvyXe2<=0OgH6v^$iFcfxc^@Bz@hz4zf+l zDg#xpN?#K)NnTL7?Z31S)C==#3GXv1skjtbx#TG+Q4*QpdbS7vkmtN*gQZfIUb97n z+gMnUbcu#DhgXg8k5|W{Dmf!%5R8^LCXVZ-Lr|+}+n+Pxh5TCXm3BRLbLOkH)(h#+ zwd+DLG7@j^{N=iPmpZxlBHcujlAJ`CZg7B-Tso{6=sGD}Nat_}p+c!eh!K)Yk30OV z-!CvwEPVxxf!DBn0;*Liw9;=>ZN725!+A39us^u|D6RbK(7?ljEau+z z182d)?X0ELg4BM?6`rKFt#S87Li#`fV@?uQKRZ}lt0kXKu92do`A4+HhF+R0B0s8v zO)-7bc=DzY8mQo&vND7tqhQ6x`@$sbto}J+-4=l`)JSvyGjyfGlwt^W9{VY zOTbVCIHXyNr(gA!`tZ!jMf@{lPpQR2FyV_%VO?D!MU=FA>nh;sOhniEXT1ZgtqX*V z+la#F-vn?dQ5e5^&6U+EAW_JH`S?&}e9`?Q!(X;6%~{)Tce-V;wJfhq4UE5&UbApm4P!u7xs7DY(hHyB4DF;E>5T}a)oW-b zzBn9r@8cth7XAAiCh5>Prbu^Jr@qP*suUz+fgMM@QO|-z{Z2rG5dm@e@?%!_ISs^sI?t_ybO%XV#r()d1!EygW7B_bA+Sno_ zgKtS8XozJ@uggj$GQLD4T!87boy(D&L_2Q$y{z;Knu$YJmP(4_iwZO6JfI-dN-k%o z_doCWY}U4OqQl7gO6+Bu8P5ktUwivLf$D{PeAOi7BtF8|=I9^Gs)d}IvpiiZ?u~K% zmxFmkwSS`!2o-g8^@YniM=B%DZpT0W{BgLQ02Xn|`b0;dsnRaPpLJiuepztoCHhtm?JavV(vd zW0;8&^Wk;RfION4VQ}YT-b}Se$=9Y&Ax$xu;kT>sh=6u&YNe`bQX#Q0p0m|=SV|fT zAiM_4r#3(b@A+V{@Vt%b>$8yIq!j;*hLzz;9A2<&vQ?1K?GNzOA>5l!^XquK;$UO6 z{F`0motxj&GxOUO-aq@CGxVn);UZp5>g87*){hn8nIp-5s^=Ln2wf@GvpzZ^jDL+& z*}k|AJ579do!-kQ!`}>}c$Ge|MSy%cQFOsi0S^)Nh;Ffdn}ufUnYWmM@XR-D#HIKk zA%_j8YOgFZpS$4-?eaXIgTgD*QnQA*r|>Gfl7lUI%Ebk)z27`WAViu;iQ3StN_u z-TqpBk6V$;Wui84TQRT}6_^+`mtRXkuzvKL1A%uKha>6*dfptx#u&={W^s>zTQ9_q zf66ygft66<1>v3ln(cj$k)Y|`CoC(gS>4|e+FeO-s?Q)}l&#_~UdjJD$0tcFsbWSQ zRfj04)}-imi9#JM1)eQI(D6TsPiKoyRC+$n|JFIat>4CPx4{0nu#kQ8PWMmiVIl9VAv*pWJF^9uLc?^JvY#bL3u+G{x} z6qnr8?H@ZtO+HS?`zMB^IM0!NUAwE9mRmOzDezD^O5;}y!^FCkIV5p$!pCdDA<$if z@4NB(OzD}N-onSh=OKB){k3(mbX(|iZrpI0$}9uFp^Pj-C0v9gDn4iaI^v76Mm&NQ zr~SPF*aVgamPCX(mX~$|Ox{G&%+>p|I$o7-Q&OZtw9!Zs-dUX`FP1+}>nDNdQ?!ex z=vVYtyEh+-FVnfy9~%_E_=7>>KokLh{Aa+pH2u>AhUGw~!*dlNd3`4~sP_73AoyUS!S z3J2k|5fZQyAY!qXXonwOL0m!5A!PThE^Nko8NX7*eir*ITOF%pybVeb(w_^Zrna$P zs*lbqwp5!ssGfiBANcv~!1eDs3U4<3D>ZmVO(ZNv_oUDIs%VhSoKA(SL&a`axOmSF zwhd*ti#HTCknNUhDd-mu&`G?+KQzyCiixiKVUm zaUI&I|EZR_;E8_;w7gx+MrVzdHc25ns-#Vm;xuFJqpxdAN3Oyi(n?s5?JRJAdPg*d z`N4r-$2;!LSyG%v>-$ZGQ?}Oc#!HQ9GfM-#4*sM(Xl(Me@wm4*SfnsD5|hP%)MiUO zNTnt}W-N)vSGaV&FKBaf*_OEX&-?JcaMtN(?JJ{Nn;-Gp&@8r5*xBau9qvZzI%P@J z?+2-me+%wc&<$Nu$dU@rq6@pp&D2BKH{QC>`DF3th;Y54+6@2xdi!8t+S%Hu_hKGB zIbOq+sF^ys3xCA_{k}~iQj2sQkeu;cUCv{i5t^5rdyj`F73Z>(OdJJ`kWu71#_;8R z{z;S+E`nNf(9QZsyuMd%7gNu@Oa9p6kdg@aSO5FF$2a6A3q#Kyu0Pgb&Vx8|p9?0d z|D^2x_a|DDyM8_yA6{dN#4(h^}&iRm&2}ARR3tCHUrGtsF`Wdl#BIq9Rf2NwGQllCT~I zLxec0RkXXe6u4=bQv!aeCC9ZOt0UuKwFna*{_)pnU ztU^nMcKM05j-oLg!c@{Qng@I$LwtPrRX|l*5mLhUd_v=%iK!upIzB+OP;FWCl%17L zgz0_ra<2{Rf<-hOqmpHz82GJ9o2AJaI*rmnH|7)Fbr~^`vM*mJ(V&&92 zgnY+=YHGYznSFh~5&jtw6jcbr4_Aed(kBz+(s6fw%V-e%J{?}Yaaf|&$3p@rnMOSC zb+;AhZ<9pT6q8{${hMv~*t^8jJehiynB6_m3z?4!())0G0rLG{pk7G-x=5S#9^Bg6qCekV zQY)PA%m8sw>_z|$-e({wP5!iewd8~Jdk8=}I8>|AYYjYa?S9~s#T~PWC$*S)e{}8+ zHBOePYAnUwe3IbVrEGff|Ix3X?ALu7SmGn27xz1K{WP@#am5$%l~jk4QTx-C*uZif z4uJPAB7_|wK)54Tf+|w3zY^pS+Sp3_nu(D@h`HSzk!HL<(9GC_mugBL{w9yJnX%aB zwnRoV&w@W>XP;Hshz6dnnLdvLR0|pvj+-`H;YgpPgT2g`9n@m!*y9Emz~7{?U{QD(YJ#cQs#AOS(g-I z`5AE%(sqvtX7tEXR+LOYtO)2r`T#^SFYX*V)j=;VWQNZ3){U=LW7i!R)vt;9?AqG7 z$RRbwxM*o4G8ef zHZv@Fmq;8eiTrgOuvM>9JeH^xOZT96(KTiba-1O_$zc?`?g`oioxa+2(A;;5aiTE*_} z?mA*36w(gP&h#{t2L}f!*QuZsV$xOsctlk0sQm-)?cWod*IvCN zScv+|pVhHK8AIE0^O;D}Lqn7QrY@?M_>dsM`*b{7VKj91>o^QEg&Y^};A-IG*1m z{~8C0E?Z(yj$p73;_U^T6NO@W^-S048cQe&pMny_p8qaXo56mzjX0kYNAOu%ZpF`z z@1OUiuJ1Y^r-Rb}A$r<2pb<40o%C5O@rLD8KRE#j(AYE*(CvW%Xo7{&qqHU4W*fsCT)+XqWBv2BzsM+h~rv zvI$2oIYgE>6ZG{7TKJWcv>Ib8rY^OR{bMK?wN;lqI8w;Een^60r{!N;QgHcWTfnA4 z@YReaXtlW5rYdlyIeSieMlX=?qBICJoq(@4d4W#k1!|IywqFnp0&$4G8?ff5i{<8A zq#av5fJF?71NcJ46)Cv2T+IE!ousWH7qNox=fpVdy3q4lk~y4e$KBiOywbCVsW z-N^m3nxdlQDaPIk(>q_Md=0PJVMl?9=%PAxB+-isX7db`nItnChb|kw1_9oiTB4vH zo;WQ`KMz4mV339qI}48dc&Va(i3UcA{a#T{VjNzgmKGu>q(tf(e%#}?orzi+?r)nj z{;F`!PtaL(6%*VRq5Jh?lfRt)B`>7w({z(#0uD}NTQ~X5K0a*cAsO1)KJ@$e5EfHR zaoNqAz3v!xh~sy6_dTEP1}Dk7JVcwj4nk`EybyvRpJqzQC|h4J`G-l`6AgAV*}O%O zTVuDVcpUz5iEO%ap*Nc}@QzNMs>U2V(|l0MreiN#c)HL$N|x>~v@k)WRCUCR`KWfY z#aULCBepM}$xSK}^)SWlifEz_ioUm4sSx2>((K;~Z*$-yD1va5yW?HBaTwIC4oCHk zs3G&x%?Z07IrX6BCG=Hz8IJ*^_TmMYh9DHNCCd>DDndcp4gn$@=^jWM7ffHjpkhLJ zfp2m6>*iTIDlwL14fAbyu?x}Q73;Q)CqMRV_huU{f1kR#JQgftnmumuDV*M@so7;m z!Qw$_YfQ^)SrZ!L8IX6&l5kCfu)7xmU_PfBM+7HEa4_P*PE`EFX(dwQ{H6UA2_#oY^Whl3I z4I#wx>4<45g9C#k$0%J}wY=&6G@UtwVf-zDhRE`hY_38 z&xUq=I>d=6ktk`^ejXAvHdac6`!QYz6~9pQeWau&J0mhwtIzYREaxEGpVmnUAtBg= z!TZB`CXhb1`~H3CX+J^l{LL!*W%uXmGLI2^BWWa4koQ+*%Dy(g)|g?um*z->bCr?5 z;P9q2@-zBo%JQ<}>zg{{O6EL9`Gw6|#BW8rBT!06mP8!t#K*Xjh@wOU3DQdEc~+Vv z8vmaA)o|trRBsSUeovNA9*MjbZ%(4h&W0b#Q;?{I8-yyckyS*zmAU8J|M_G~jd44toq$$6KkMZOrR!JbbRQ0-trHalKrL&W`a?P%s~X{K`g&-cgX z-rnAx?8P&Q~8B*>I8gK}E@mTwU_sA5VMpSg8|a?k5%#wgwnp4}VxxS_naLp9(7 z+IfCFAbl`V$c!WXE-{p1(7QFx!=cLEsCd*KQ*2Uk&@m*jz&{SUNk8$S!}ni|Umxd{ z?sGD)tW&Rt#@=`|qB?r~)|4<`=l<4++MpF$*Rbm$!>uK7zA2=I3MnXYN|uJTN-P#_ zlc`zaHHbrThVQT>GKFd}y<$Q{Xc2@4X(g(R91Rzgi8JW;Yofz2NWp5O8s(xUKMVy6 zk!GUyt#oC#5a==Ndqu4KX(n)c*L$VDvb7fUP1dV4ic^+fofXvi?L$;V?{0P#^%oBa zl~rr2eD`&Iz**eW>-`C7Srp-ugUQ=kdMuC#C&ipMFm# zTx|r`sUSmMabp)R&Y0eS63Oqb0mOx+vc8aY3OeZixvfF+D0tJNKV0H zeSEgH^*?FR-w#ghYwXi*-(P1yvgOx;ux#9coIPLgmPqCxY$H;VlhH3078Zu1RO$re z=at-SSTdOGqtrX=-3sf*<~`ab)$ne02{|iFyncxq2U$1E5bA8;oAaK?4DSK5mzCcOg`$!POwlxfy!;z4`;*%?=~7UfJg(&3EoH${utmBze;9@TI*_ zE)4u@xpwNTREA<)BFTT8jLHGGV`$sogve7ydfVRcXnffEcZa=s$`h zh2P)h$o!ucz_>k?Zt3QGXSDa?+amVPB6I!(6kq36t6k?ov@$aVBB*A_VcM$nN(nF2T~1+bz)*;Ek3@navj={2l$08RMQ~s#TTPA zVbWZ)cQ!7Vw~LY5>n~b`VyTCt*r^%~HRYHu7@966p(qQFlj7Y8Tr(f@@*5kGLjTb_ zxGUU{BgFn#{w{vP|J_9H)%26s7)8L%WtB;N=_9ouPyg_^4w z{{ve7f9s<6J0v;s{bt6NR@=hmzqYp_shx;O z>nF|!Itl!}xoEuSPat~t6bfpp^^dVLXMzc;Fc_Zy>o=trfA**ADq^;=+=|*9eKB;K zJPFtu=LVXo#Uw=wz>Nw*&4WNE=h`czH{}F$5sEwIL%TP>UJyG<*GAI80>?1y8xEzyLzyE!1v6Q zgl*||;Ydc_I~yrbU&i&HE7TqA43U{OKWnI~JMK3yMNw zc+^fjp%dwRI8Wiiw0|SID^}vHNIm|~o)6D=c@^WyM6E`XwK;* zjN4`M784EW?@P2xmlOwA*23S179IL->bD^^@l-l^2t>cGa_4sVThGWz3@QDUJGf)T z7pc`JtdF-lQRC*3j+3A0)<>E1)Ff2QDO(xK#HvTPEX6knn(Woc%*>^s?E5#@J38_} zIt#yC8&05l?!xLr8qAQ;JNci{eUhK+p0P18o>?sr_%LKN1md{iWT!eT?UaGbD&}%W zy^nj&R~p^*VcvP$JIrsew=aeDe_qmgD{y4o_Vu4diu}@Jnq$B?$u}ls7EKXxcmJnL5V7 zYrHME<;wEq+SjKaP+9&y&kp0@kh*fEpHY&sd5gd8FxzzM($eHD!d#Wzue>cY?N71~ z`#@tKc`FoR;VW8??7?~DQZ{pPT46sb|7m7sV#3hWG?uj)#4MZm>z?UuAm7v1Pj>$S z%EUM|D+sfgnaIgu+t_Y2*vLn0_sc@z^Q& zW+-0C@}-_^_j3a_@IMW76B84C3zf-Mr z_yQmzJnyu$c&uR9;C$z1Xk3DdsBp^CWSH}YtNR0!Zd+g8WFrko%PWz-C-zF7LXJ5f zQ^Eg?>eNrw&v)=asC|pB1|Hd&gBZ&tL)2>n0I2{Akz!e<4LjjM zOTH-He$W}&3)~2^0+Kx8W+)0CiHWr708I=L#*#k--&Q~K4xUs&UpgtJ((PRX@;E#s zwFn{Aq(r?pW^FRhBN57L=6$_j3Aamg;r4u{1KLGub?9Ij5qQwOK>yLYDL>KB(6Evu z0o9H)HhhSO7^+c?#Kzc-%jal>`xaFrx6OG=Ol|ho|LpMwBrj24>hM*|pyS^YWn; zi8``-e%w9mqxZTgBXYae)|;i`XM&uMC{q~T?W;3cuk5Y~7gyc-Mzo&rRAk#G$~&vB zwvjX6o#u&~+k*tP;2F1RQvA$RXyH|oZ)%qM;aG+3<=2l~k|%n4he^Fk4AWmxQ< zeX^Sg8|9*x`*o?f1KIeh_+y`z{Ek`e-q*{!6h1dk$ChSff+)~erj5%cTG#y^VQcqz zs1Tt1X=ot2)qz`J2Y?>D-+P|gk^#Vf_cKD0{VpZ(pZ)I%ttM67cKhg(E|rux z&0y*JD(ShnUZU3U*U-B0JU@<%^>fqa$L>1M)i<$&vq|5xjsYz!C+iqJM^O3Hqqa)oZUhiRGA68q&ThFI3!k3Vo(@H(6-4Igm8ee%N9(**ZmEFKA0wM|<;M&qmh8eqx)8~uyDs{($ees{x-$o5G1y!~ct z;x}5vJw&m;?%mJZhhuCeEer*S)kW=sDU)k%a#mJ5$`J?~oEPt)>({WuO zYv>o6`_P+t+RyFVGEFvfu2Za|H_Ry*p&jSZ*5(KBd{bljN5xdNAMDRny8_RrHX-g~$@@@xKTp)F<=G$Zz_S9V7t=1T_;l7dwg!X% zlwpFI9P9;lHu%7@UVkP1jR8sbz^A&Y$x8>M?NbhdO&=S~r6?h@pQL(YGu-NH3 z>g(&Pn+bTtnXHmG< zl6yC$!wp*ko<0Rqlp{g#y?%nDO9lx%QAR>bk&%(f3(WB=^Z{qjQB0N^<%ttzTsDi_ z+uL(0Ul*y>iOc^{~j@ zie4;6Wy9vR76&^Kqw{~%k~jcycsqSgKe-ZCz6O;jW$(*Cvu~Z3smNUI)rMBSo$x}M zF`@TO!ODS52af}`Ad!xq9*U|P%9|Q1ov;! zOz!8OSRJsFS7Tp)=*mk$tWw^$7S;BlrJm;&F(N2VA0sOAPT-fKO5iZu-tBXho5#nU zGVBZO?d_3N+z1$8es3RIa#&pyCuO){Ya671%l-reCzRI6`#-w-LEDQ=@_;+6!eV;u zh2Dhl0DhD_!_JJ!^3cv1mzkeIoJ<*Q)~5%Ixx{B(QOlHBzSw7-`3X`G^6wc#)+z#vt7q(^7e-7;xV|>yz{o{M9M_iSvbq-s(^C_jH z7M^2@H3+1`m5yt37(x-gQ#gD&$F(}VT}bnz$2yeM7EvF2sd~U?$(51~_T`HVl|!R) ztum1q52FW8fg_et{#%DjH`CKi{rBXWrl6zQBVEKS=Qz&@kpgQP!}9(l?=<|y33n6Ss0a7AECxR9@a91qFVoUZ&%ly zYQc(X8Koqxepnka(xK3gX0a)a6@Q``yP^I@t?*H)&RWvyz|BXnzi$%dMzeNzcLyFS z--Q{oxyAz`^J1N542%u0OG8aEXtJr+i5b;MiPVfimjD_`>n8#JkBqr@Ta$OntMeX< znqqG9u0ngm;vFhYUvjys`5ng&$xsXtuhh(SL@-16NpU1!u7#nzJK2Hkmus2!qTVjB zY6Cd)KLvQ)+}vXvqlPt_#X4u(W1oI|y4BS>O||%XJ@Mtg?nUYZGUgg=zWT;Ym2n~c zzrsO>Z?FFg9SJ0E(XS}K;#OEK^4az2MDveAnjvE@CijlQp_+70LoW5-&jvjdlthJj z1b$9`YSEB|&Ll-%^BF;8@ba_2mq!XH^K}%aUi%_sES1De&t{_0Eg5)K!nCNX_9-g%6;1T-t8!=Q&$dNC} z_MmLT3`BKx(tx?M+7>!_pJG)~-P z3F9L2t(sbM!u!B6uUESf%fJ5HhzU)HB%g8CPbt43{QzkI?&2<`OK29 z5<^vf){W}Qj75(9t4-9BuQx~A9581@*p((i!6qPG#!RmtJ~H`8;^yKqyf+7m1}LzC z*36BK=~jQy>>+-rFuURb-G|r7_9Khk=N5l@Lj2Ptmbdmziaa5s2=$IGEfYcc$OqX0 zeJ*)j#e;{`7TVm`;0)CYjM3(Qy!nIz55cB%`ww;%78oBX_Ip8YgX#^0Pw@%bMG0l3 zd(|qAm$&9M!t*<&#THk?COxJea{hD>EXIA{CR^c!U~=sKUC{FBlj$9Ok#!TkEcBjZ zp$S)>RDZ*j60;)H9jyP0wFPWUm+p>Ywddk{36B-H{FJY&{$O3ZhK_2rr7Gn9^Zz*J zQ0+W58PRRj!GpGdsFf%W(yIvEUzc=a7HDW`@ulL_3T0SIN4KY^rHbCIziIF@(a$l^ zn0PXewU54`-}2_V$eRl>n(Y6>)^|r!{m1`bBV9t*h?}e{36WX$x`~nz*)yXg*?X^> z%t-bONeJ01BSI)MWG6dW+57jrpWpX)&i9YsJ)Mra*S+t1@B96FJ)e)~V-)ak<;-xa zTU0N1>89_*e|imyqYs)aQg?H8d6=1*eUCQUYm~JckznlGHI0L~Yu%n2`)6frEs)&V zVWD5xJw0t&p-macy4o7Efny_LvH0`*U0w0wST|*Ded6+Ug>r<)p9eMooH!0U>_5;5 zWMjRe++Q^~uld9HQ(x6ws@gP9(k3-Hk3!`4K-z-eX@Ln`=|l*a^D@>C=wy#R5w<47 zS=C0AKs^G6&mYUm25el;JvWq2DYF?9{(eziA04)`Z1N={+k8}P+eR@|o9LU17nRiy zL$}yA+YfhH`NtY~8=I<_B-RY8b7CVEW*{>66R2uHQzo`hsBLX&xo~>ocj5(dA)kM` zJde=|brUB5T>kF(0wy`GyOdkpCy=^5d@UUcVGd{vAm;{eqVru%dY_#x9Aq=FhxnZy zvk=JIF@ZCx`G>I;X|ST0_;b=CbJU`Co`p92c8+H8@aA!7Q4B=JCtc1ufoxDXDM5$l z;{%t0OWn%x@o@(8k+)&ql~3pe$v7nf*@8h}UBPmHx)*h-%M+h2?eig_X*s8Kb8G@i ztt7+&Imv}Eyr$3MEjg?L>5@La&dy)(c=o-n@YGF(YzKFD-RlY9Y-2Naa&pM>90(I{ zc5Q;hQkNrHSy;`dR4p5J7GOL-QgwyQtY~*|*aWnP?=-lS@@7P@UAqQ0Kz?B2XIg3@ zSQE{Mj=0wXjqzAZ-Kea zjT9BzUgi0jxSU6-dUqD*4-`0WOHNPx)Gbr-{b(}&^QZ1tdj5~_X2cTSFW8~mc6K7; z;&NbQ$yH|K1~yQEopD{nfXFrXn*}^*BX9UvzSwG>^sG~u{EAGmb{CY1P@XtReLgD} zt@pSnsuSJnGEp%&CqHgr_*ICEdJ$ae79?K*(GOgb`uk&S^x2SQOW(jKfvxdAE6#gA zyax(*=_nl*DzREqafWK7U`j;2ZFd5-ao>7>-C-rJx(H(0!3qK&u9f&M>HA}u{V!k= z6x`uhllmwT@i2KFz$eqBN*jat+gvNIb%6I&q?K3_K^ZHaS(Q98I{MqtPK^XW&w(X_ zD%ibw&t%=_{P`|t_r9^dKB1EG0BDP#gPPd@;8dRHq|FW}qx;bq9JuwBmS$OEP)aI~ zAsFs97&C<4pWEC|Tv*f<$>_0OYnlbOl){p>OGCpWQ6DWs*4ySkQ_#oWSyI0=4rD0BuAk&4m&Fff}j) zV&qKfx-oB8r-8O~LTC|Z4o{b71x2Lkb-wG<{Up#;RZSb_%%v_kC8_5Ox{X#+uoA@D z=(}Dw`8szsMHlX`!3oTJOpYuAc$d)e()ePUQjFeHta8!u|^oOfT%@V<4BD>(8=+-qn!*kcQDX1uNDOIYvb+ z*Vg*idadT0RVn<;(X$^I$`;1@)rDRB&c2jKu~bdgewii3$UWV1agoKpY)CEW+i+Uyszc=D^=d2xI%Z`VPt(#0nF5fnXwvs%Ihlb-wNPEKg0 z4D9=@a_k~rn5=!vI`qf?2L5S;X2<@AhWk}(Q&sgEa{+)Af&%tu@Bj~2(NL9^64#Y= z93y;)_xKZ^gqJ;mw^)Ru5wf{l_AA!fezd&aoq~9j0-mmTVOu<}z2p8pc!WX?_Y{ao zfrd+h{))#s;=|=Nrb+AIVKkV3mL@WF+5xpscqnq`;Lg-X!e4#rRgInJ#o$F>koygv zz8PD)k@6jsp2Pt*{{fbaIhr}z;4m6*3QmY)mCsS&bF5wPv*@*Iu8J+VSNb*rgFtK{ zqNLy}IXp?KBR6(s7pOO7`qs_|QbDEIOjJ}&M9GX}#o$u{+06U)hUXB;-ycJlgqz>= z=u85OQGKZ-Wqr70R&juJIAY{DAxJU14{Ud1@96)e=p?YNd8zQlarKeI00N@X0)<3`bEQ#kNm<3GO*9>^B^>rE0l7Y-@k(MeTg^+ zSdI`*oTDk824Mo^Ew*(~L$Fg1bQ8m2 zN)Fx?g+)aN4Sx3by-Vs+y4guF4t(0&aic4MUOXAaf6xGAZa!P^*!cKkY1gppCV7w$ zTaNd^mKC_!Mx2rRSgrXm0*X@TGm^$X+N7iaT}N_U266#}zgt-nLg((PuC(89dbGa@ z4vA~K6fJLJYb$Ajr=bZ7Yt4!kByY)?dtOZs0{~8Drv2uHcS|G2braWhlpvb*uoAxB zuQi-G?C-%RbAsLrd?71W02X-00b@2$qZ|MIWDx=D0Dr^02RPV`PE1g=taqnLfC^c^ z&~=Py*rg8`>a#=(X+C59>id1KEt}5+L$D~?#ay+%&l7mIZd1OEpFWMRY_Z7fpPno? z9+jbfFPuFO8&}-~U6@5oo>|G_+4}E=mxM&GO^>FE1{|sb3q2`J`p5G3wT5G92r!Nb zH58`_Z)NxngW!|w_Vc0(0(={}U?xW2xYr7flhrt^}>hyVeJJw7)D2h?6`%#;BgliH+?)|7FvXkMjI^7_Thj z*N#;@Nr!?K5hY8VqBb{{MKjc6l#Ieq$8-C%Qx|B#iPmZ zRayuLEeD%iR*Q%$F#>J6Fwwr50{anEo3IT)uJ)Kscg>6_*!R$br!+pzlQ{}J*puIh z1>JKiR&nyR5e#H4Yq7{5#j=Iq+Hq&Ibysi5gmVnLayV>*g~9=QZ|*Z1l*&XhdbVkpdE< zp)|D%KB2H-#VG+04=J`eN{WxV_Z3-ufSm~Wwk5h?Oc`%Wg*M;zH2T`K_5!5P;O8pA z0_Wv}`Lu;G{mNH&zBK#7rwabET9*c&-arNpR?JmwgYfzBSfw#>Noi^S@-|W=P!`+JjqJGFMp$?!n+zoWg0C@nx0}Y`?2(`{|2r4ir0Y6YvBgGr(2Y zJ#mIeIWDHI@ZK9n2^x224`tSQUulqCAw_w9cGCbY0s#_3NZiDA)NQr+|F{5S(}Sd> zI{K_?Qsev)&f+%ubVwNMGejyB4naiw^71nDx@0)hQhsu-oUUu(xO`te@UW~eva`RI z9&s0Cie?C=V(OB}FMlA{cwAHT1Mw!78Y^!m0j*2A+--K^`O4{mj`&;iBJ|?N{0%!; zO24=g$rYPM=e95x^Uu22JR~MFU1zTgkYWHMIr~M;^=zj0op1 z_qdo=KB`rzE-_cpy|;c-zNuSxxk%AVAeX@_>}x24PQg{Vh%fszH&By5T?Ql1)w7PW z-D-<_>$Yh_+62Q`o>%uXVO5e67e9c^@aHIim%8O3v}C~$Iqfmob`S~m5;)4wex6Z$ zj?ElcI@%ggdyX}A@wi>gLxjlDL=j_CX+Eow7`1GNn?`*9W%#QKhsyH1oAcvno-nu~ z4JCNJ&R#IJp934RcKATK=TJy@WcE-!V(;XC-^nJRt^a;&+)Rm#sNpBi?z~ZA7?Cxwo=h)5zlfG1zm-F~;O%=jjYsTl zx99IzDfY?06=Jv8(0!B06yzm8e~uHQut*c-a*BQ@9j=_1Ug&Y(5a}spe|yGM`oG`yCyhetdR${tALMpI)3LR->@I!gCX>>4Hp4oyCu5qGYb~@!1vG z!3dXgMBnOa{PVKK>SR>brSSbi`r4Jp5#P7-(4G|4u^Qnk(C=qA@R~nsaC8`|V$wOt zAt$2ZzVe0G#{kiL;b@zJMJp&#TZxoEr22>bL=({a<4Ry{7W z8UymZ_(dEyE49CdlHJ6l@szI3%~5<)UT+K|c-U7S6>8V*_A!BAe^Fi0?DgH#+l$v@ zP9%qwE{UZ(C7(mDYRj~VKIN8YxXqO&krNr>J?2p18TJ(jU0l#|lgPapdpUdvegBzS z>XHY;E(oC;03HF)zEI=tmHwAD67j$_9Z$T)HQ~{aqVzcVyKCXluW!yq3Dhoz(oZWG zII>eW|1-<(Y}aZpy*zc3Y#?`$Lq2lK@UW8qS=9Dth5^;CE1~lw3Pvxjau)@kJnyHm z&&r!~QWUmq=O>pMI>w(r0rzpyq=%K{kf{4J#m6A%;=(~C|45=T7xb~Pxokeajqe#^ zxMx#=2Hw|4wJ=`#;c>Q#tazmrS|Lvpt|?C@JqXm+%=eWc&MO^x7W+JJ+2BWeFYgE* z#giv8Pu(o}5pIOZlOEv&cI_it8B`aql3yYd1KuVVdsgvqn1s}e}B$Iwm?Gdfbh14iI0?L z^2?4%nM-ReH#Th+st(D9yQ-KX3+7)vA$K)A`SCDQ`qk@QyfmURb)&3dMYC7w8vE9v zQJbzLa}}=$G7#E%dH{^slrFISkh}4*enzuL1^VuR4*q zxw1P2)+x^oeII$)m5!Ls0cp@o?Glli558qAl6sZl4~um%%WIPMfs=bKOEu{L#9i;A3tC-`A3E1>Y>c$W=)vj(NH=3fx?DZ zIbwf+ifi(#wW+D;BbScS$VQ*t7D(|iN4Ei;2DmqQbBTZs^*!aF4sFJEJEUg!HxFDj zQp!swcD?xknf3Xf|2Li)?o^mh0hg-IZSDGXo@+Ub!{E~sY)VV^91P!%%p0c`Qm@jG z_H3ffiFI%kGb4)k20u8c zU9JVLMlyX+7Bur09F}a@a<40SUTEIgac%hca~Yz82E77-SK8z2;Ad_ggo;t-m?2f; z;~QwhN;2ohPB!}aEw`z3d)#~tHq)N-KZIPqSCcd@q^^>L8+w6$w4uyyS+~-BWdE7% zR@St=-GtQflL1bi>*Uf-4b|162gSp(tN`v6A@S^@&c~(vlIXJt^0r~^1ht8~V#5++ zg#OFAMdrM;s*9Uv%&sX?PT+BxU%l6EIn@}h;w%WwpLtjjJT%?Pdc@zwk9kFm;BTr( zd+t5`m#Fw=E0n~W!IK}aq z3}+sJ(XxO&ewJznMH&pf{_mgJphx2kyrbkWn3VJs85>Sb-6Y^IKKmAs1?BTT93+3P z;z0)JPB8pic#6jV`jf=lCN)I|{pS4sM@xL;%9=owD}nz-!V85nTGd&A|D5-!=OKB6 ze}ez@r|eAk|5h>2D!C80bajYjz+1Q9e`q=S)V_iDe?1(2_3JZ%n^W2pFZ$r+AJg5I zHR9J*{Hh%FJM!t@kshT?#APHQ|E9*xp!cs%FV+8}RFgfU&`orXBrvrnKxMyA&pi_|I*-3_(&IRf@>Irxo0To&|$SZ)rfqQuf!l z*v;7x7-&jg;U$$oz$zgw{?BKs^n)@-b}ZN=nxe(QUWoGHb1Zy^yx^xb^j@c6@R>L~ z_P6ne5nJfbl?u6Y;FoKZha6JDLi^cGsUE;3Qa4@eC=kJ>?&%^cjHyK2G63MrKzshU zz{%Zx?`T8_xXEer!H*1vHXP;-8;{>}hKkv8yuSO6CQWsrW5yCXIp93<+cZvrogX$t zm!}Oq5QQzdg|Z;LLx>}%qmK@!h|Ei2dd1G215qKMEp;zKp(vc_+D!*DMdRi%}I^@{R63GPYvc+l~ zH~G~xxp1&ix(Pq%YLIMzzb+MTXV8o}dy0 z@@uE{h=E2m1=G=>p8f}D2hu|UO_ZO zC*EP&f_q?X7wpcM+VAFQfHnHB_iuBj{2pP1uH6qtaiK#0*wTR|@57aPiL9mw6U>JKjCCekVW<_Z2@Zpw4xw;bcYQ&yN`3WtjFXp z?Y&3XJAjq4AsUG5n>*|}Q zj%TmJ%9!%qVs*U1Mxq;Jx=~$zB>fAEU5{rlSTt?xKMdD5`p6 zQULLL1pM!}Jx_)g4L_Fn(LpD~nFBrnKY##z2KqN_4z1YC^#>qT)X`z>iQfUmF-)1| z1&w&Fhs&hvAi84z?Y=Vz#+s724=B%3c=Y{+uSwL$<9BuE98$k3n8>|0jD?D+%DhiI|y1G-LDgqU3`eR+C{z3!etG7>blBWz8x1vfqXt-&y zoET#x0{?461~sw{hF4++w#wum@XK4mL`b_y9 z{mnzMt>3QDDAs(6c&Mk%opuM-B4BNqe-r*bF;Ra%1g`b(kBx?<;zsizSueZ%o9b-) zCu)V|*7AXW#u1hDPWkHmJcAmYoLPykVb_DMtMfN}H3aefLPGzwegkkT7~l&6t54nrI6ZRVN>HimE;wVM&RKA7miC@GI+*|O>UXXK%O8!isW<78OWM^R zV8U3ku8&Cyj@n1%v|p9mVE{}bfI@r(HroILu7(RAnD&Ec9}4Ht@d(g;tB%@Fa9YG%=AVZnjYd%4$+7=4PbYZlj-aOH$B zs7yZjT`Wv1dbkdvbZA+OW!?`yeP{K@h}Ni`%R)$_6Wo+}=!|+^w$DH(0e%HsrHy`f zxOC$$;J3xpSA8m0s`c$13ExT*-skb_7cYp=+y8R`%~FCzc}L2W_6+x**4t`z8ue0K zWmg-#g_*9#?PvvNpQl-M){A!m0laFRo4Y$Yywz~H!bXBFeEZO6Y8R?X{XB`6uT?Cy zb#!JnL>G>#4Z)h>bqBE=*wdN+)l`<4a1VN|rX!tZ*u8ra6E z;=!jKn&aW^3G{Sv8tDr#iF`9{Nbs_r+9|f9gFSXxZZm+z&rao>_=ui>IUWI{tOI)_A%!oh>0!WnD2U64yCV=eAiB zv0Q8ZjmXg^(c~5Odi!GHpq97vwo#u<{r6*<`PgcqHi!k<{|p|<5Z$D-$SsSO%d)u#_ zbA52gb!>HENu)>GQhHyFDXOYuq581KXrdyI{nc;PK=u%y9w{L+Y2s)?9d&BbXsvw- z7fse^Sp^IE@#eA{!)}1i*)r`_(+OSC^0c{YWoFBEqVWQ1U0@=JCYt=q$Z#3 z?}oNb8b=B4b^DG%z+RQf5qwB+(f0o%Y~*_tsA#y@Fq zAe}foW^LK4p!qD%@-GO0XtXS=mUH_XuYH;G7>nMq7bJx|xP<(*3k4^aWzJwgWdnN| zz_Q3p*bh5PKcwiF_3^9Fltg54;!p{z-9fPGG-~8c*14$-gA(S$?m>>mT~tk8bF9f7 z{awbebCf~6R-rZ(78PwTYM7@< zB3`&Km_G+n9A#!jgIy4Lj!S6+llIRi6EAbP6bzZanarM z&iD81CfQ8SVctr7UOMvX1&u}BNavx($|S~ z&pR+SIsJl$`V}fKU>RMZ-hQSyAdD!Psfl}ex;#61FMVq61TI@PwE3fiCB35`$c`%iOxP|uLAwh4YAqc{F%{!Prz(_tZ` zJQ5WVb!E2J7K#3phvIsem7sN$; z*KQY92`tIt+ajfa^As$wkXh9oHCkLo`J^DJJtiCv|8qZB?wniYYk~xi{jEK^r{T zk~p+k8#hwQp?NvOkJ^yr>ni08D_TBT^*bqCu4TN2)6$D!C&|(be03{^6)D-StTvbZ z>f>_lt2^xLVy&ed|%i+T|a;NYb~AfMN1YZA>!nq_@v+Q8SXwiHR*FKj~N8( zXhzB+sR##zo0!rWb%cQvoDvayh#bPlTS}mnEV_TeMcXj@Iiuq>#`=s|8k6HYVb56wC z9gzGn>m0#;j zCjH!{Y+ZuvzJWOW{r+X9tXRq9q$K9Jcp{3M?BMzrfWi_Yh#yu{2O|)$@{~&M{KJ2C z}HgBvLy15F%MsqG?0M@h=@N%16QX_97P$8*?&qk%fC_n}mNX6OsOy!QcJg?b<@E zU@P%SApRd4_UUD;_H1zIM`i(tmM%|oDg-jxlrnjSm<*mhw)iX6~NeKuVi67bnMrse;=gV^8+M*8v+5QanTL8o)_|Y_0W969})}UQ7dPU1rp(Jny7wvxyu+E!iV#z z7eV3g)%nt6l6XH8nB^$85Cp=4(+7h?V)!*Z^PW%;Kf}Mv_=0b*A40B;-qpzxo0OAK zh~w_r{KP7W!GEF0O=vJjTNc-{;EI1F_VShq4fg$8rh2#w?)>MT?uPBx7_ru)^Jz~g z&z>UlCc__4!V4w+0pYVsJj7`8b_eBwt(*b~|5;Wojm6(9;_nt!m7}VIY~n9%+WdqM zEN&QC-bM$9wwi_C+x*WQys?q*c`P`}tLDNP2o~{B&ds8XWX~Z*U$dIcEl^-)=~1`r zx2y3+*UJ@=+6A|fV0#X?QXT-pw7D-Jn#RWs*{S6iW|b!-2h#aiecxaQ0RwTxHAK;B14k zyJRo$`N++w`eh#(hFoLt(^>e%g29y)n->1P=$}uj+|zq31c3nw{Q(k|Qj6rr(DP^) zz!4_!r$UVUfJky}J5mc{oX#gE{J~DqOlI#ItXIFsMo*5%Q0I-S4dL z}4%?800t9ZWG&h(kv=<>CetPi!2+tvwyXYS)m3(m`7j~h^a)KgDG1X zgZF+9qkmT!M_~}ZzHg(=14(h~dryCcju)d*vSke@!RWf|-0yqlPXm4WODR+a08GYL z(Q+~D5d!{rN)_NOFo*VEu9f8Dps~WCr1Bzshv_S`;~0ptvlDl&oJwYF(89*C(Ocwd zs7#!kJdm+xYsGD0(r*@FG+ck1a(qB4%r&jDrqq`E*VZlR`Idp^wn)7w(_gE1)Mmv4U@o$H87tc+qPhyb-pNXz? zwx9`dD2lyi)SGDzGkF9F;vq8nEJl**?HNV)+^hCCBEGy!ddC%_A)ZF}D0IQ2-Gu<* zY<~ShnR7-F``xSK+1W3)R8gmrJJ26Bg%mExOpggZO6|>7jaW4ZE0)>Y8MT=uW3tv% zXaBPKQRJU8KU|;6bL;Edq-mRJv%J!Wb>Ah6*kG=c~>&5nWaa9w6L%(O0l^51F8$@|dI~Mq7KkXJj z7rM3>)gfdp_x?smPtioRD|KJc+a8yZi1=yT&-#n$Plyrz#57ohxOQS$_zPAN;>grw zDQ`leK9BuNuQ5n|lq@oO?e22~RR{rs{9(73O7SCv({E4Wi{zjBmN76*La`#&WuKI4 zDqcl3Ws(QsWRXdxylCQ!p8mXTh-ULb62u$n-j16rm@h4qU8RsBL?TOPhSiNvOYROY z)h+%3JRU3p0~~Z0BQ*}{JWaE5GG9A(++P1P@>XUaIfZJ1mT5NCkl4Pk)OG2p_qD0< zxZE*@7!kjN83u%`;+Dhm*0Z(&zwVencAXyjwUh_ww`Xo$PXA15;D(E)vLb4_GkEk; z_+TwGta14-327iPYZJ6!vgE`p*X=O4Xjvpm7Kd^?s6!CMKZ5O9RyK!!;=IIOo=EXo zYSK>~2{YFMUfX9h!@wDcEpqmZ=+O4nXh3DR~tl3P)q7gH{;&Ir}@ zR)1n#^Ec@p$p355CH6RS_tV&`X`ITbEIz^7qLfzdQ zwT(5eT158K6)i3oVubANi@}In$oJ=Ci*DENCw%G?o6?)4bkRo;F#ahZVj&DiBhbWX z5R2+SbxepwGK2{QlFEjlkgTkilUH04YuD1Jc4)yHiF{xQT{$QIGJ9DZ8xkD!{oA+l zWT0!8mRAGHFg!Gb!kYN(=j7*yFikagx2i>6kL}A-WRz zu@gxU)NgN>WQcoEhxHHAR1QNQERhD>61q z*cL#RfuV&7c%|v--b@rkpg=!0?01}ypT8@85OQGCE>>s4`bD`o(Lr^5_H}7<3_xpEe}Mx*{jF>GkIf1UAx^<~C$J&HY(SX3<)KQ`@dvC8^bG z7dpo7HIQf)5y~3rT5N5HW?xaQ`!$uxl>u5Ro3++OsFiibb>uzm*4l`T3 zS|xLYrtAtY6UqSM>e9v2+KWE-uhPbZpCiH$wD78kbjI0d(UqS!c`>&ckgAtx9!7!r z(ZG%a(oC#>-f#MWPMeS#?m?5|D@p5D5tf~mlizw_m<2Cd0p@rigR__Jv zCvU9r+L2!TdnmQ(c?a>ZW|~*^%kKz7A{6`O=>`#M94vV6tQ;k0&fen=1BZC4WE6JT zg{ggHd>n_m&c{1m=N5HfQykRwHK|YC>D^nYu@?8&Bw*@BBvUA7bi~=l6WNnGuPT(E zl(EFw7*J@ROw-nSyX%hmhwdbfwxng_t=2Q*`-k7@%M<#)`a7N5U;P)~dG|mXLrgIL zWn1{j`h9cyiW<5op>b?{W74}iD|9CGN!f^ZP3^zjwT7#>EoT)its7aQ@hStO-QC>^ z*?my=GEuyoK?x$O&RBMYThD)AVU-X17$p*wNKlTMRxy0Bfgw&qS*%G@cYFPvdGfMK zTuRMBkl9qj`caEk@ii}{?1K&TeDm~xbluTH#Tj`7`EZirR6An-TF+WR-DQOL>*?m< zb~5Lk8z?hE1YryLXs+uE0t6C^@R!R^7O9Z?)odxlmF-aO_5P`FMo*(>N&nM|=KR09 z5GDyBdWg!KH}m5TUu9!aq)J3b6~E57a$8L)IAwtDmoB1p?8^E^jF8AXwrusPH5Sud)s5iGMjKLdycl9R zIJHU2no^d}Ub7H>kLo{WTvRzTox&ovb3o!XdgZRZvGMgdCB+<>qAMcgEnnw^0$JVD zb-3fS!4w#u0SqpSs2=bX6IQGnsvs$4O5kp%bw~E;EswT)j;=3nU0vTZm*i`2qGQX= z`e8>&-^xh!^f2wHQ_p;eh09KmA<||@blEuf#T*6mdwR!rk%*oH=RL-Ce$Qnx55MCb zcRMj(DdP6F8*jDHcZiVFcNl-xtSDAgxE1yc5@L90$rN({(OmEg!%RA)dSAb~{t2A* z^^aS_>1zz(xEYz5`z7zx7DXvks`6Ou^~?IbSRBjxT$DoNTlFAZIl(95D&4uyybi&W zvPZdY9!9HeoF&rqEBy`1B6WZES10CHMpXSph9A_?k&kvo-9dXko4!Apu1Ec6tp4d; zuQLRMVObV}NlV@YvVkZe8JP^Fs~}ErmFn4Kdv!;W`Ftq&0k2pyv^z}OyF34kQv91f zEXGP~`7N0k;a+lS;jut}fi1<=p%%W~oLBJ-dt}As$_f5q-`r}~3XvB)x^jsTh{OjO zO`mnHZ+8uUUa~w#P_4VkL3Do2g>Lx|`a)b-)~sWVehvh~&WOU21SSS3VnRuTKl|Oy z%}wDrV~!*;E=OSosSSzYWYK=RaJMCrtDi{Mb}tWi}S2bL>Yo*QRugQmq3_6PK2({stT$`?Nd!-f+i=fKg@} zGX#~-fmDO?h0T~N<5>*Q+}zX8(v#Pxe0~xu{@sA!7X>f(-b0%0wxMNVkGvr{jfCiZt3Jbg?=I{vZo!Y~n zVvRD?7aX6xl=QmROK}lN|Eu74RdUypFp*+jesob?>eUx^#z|@d?pq1k0o{E(R}Ffc z=$qS3Vy$IqtG%zcIKChG#*i#6CB+op`lS4}c$&7>4Z3gw;+Fhxo1gOYlbmB_s;f>{ zy&Tj-$ixl{ouPw>$io6dQmVy&0;Io#Fd0kwY07>h>dq5R;me+|a;I zn(h7Znv=z-g2-ce@{4&)k!QXA8pq<|m$}8t+(j~*vYkXkYl7X5k{=k3es|wCEUlTU zz`eG4HN9H$s=T{hlEhAQ{%PY6K9il!-CuCFHk75BkA&nSe=|a|HwA3wE%#UA+n52a zyukqK3(MkrpQWPCiI3lAVLIL9Am6(uxPLn$gHLBq^Xh6rZGKKj%FxIpPgQE?wAWuj z#|K%1*Ml;ib2CJCmPQaz5eM8R2Y3jrrDbK!Mx6aB1Rw6_U~a-($1Y-)dE=L8Le$cw zs|$9q9xPSOD*mbTr!E8{#g0{r0gWuEW?deRF2RkDtVrQB`mWMao)=h5{3BB0QXW2D zUIFsU>-2MmbuUW^Mpx_}_Eg`r{m0+_qtg*;9`g0uZo&pyxx8_VF z_Li*lv%AlpO{{gU35s_qKePF}$LLnl{%d|c(}S87hoHf+V#hl|h>(jfNe*BoA&4-~ z{40z`1q!hH!(VOg(ebYXLQE4y*Gctlk_j>lRTx6`puFGqulVZxz!ck!MSgzPtzDUlfKu;+&+`D`+ z1c4()wLARc&p5twD?;jo5Ub4Zz=X_HM6{tFVy!>(ljCwrN6eIwnRGBTDR)62kOaY| ztdbri-9OibjQiL;h;Jbk+yA~PK?0?K|0$~(IvBBN+T*~OzVJei)%JbyK!%Qcy5D7; z7c`Ua|IT^DFDMcpq7$ARPv3?2`Hq61SGNCPg222GYElI495#_=;LKx1$p(*JjNf8#&j(dAG3q{M+NZt777X9ZAaS#6z zB9H;scNSB~B}eFJ^;N`|_iYqe-^?tgm8Kc47|Mt@y|_ipN_?a`=Qmq>o#abG`BvS_ znU63q3th|abhfeQX)j4NQ5|K=KA&Mqm23a-najmjvs;*;fTz=@5v1~(xlFw5%wd;n z=g(qn7$j4xr)ngO#C&fD-@bi0hVDRt2}4xak#YEhWizhm5`V1#0znigz`+c*t0b&A z^d1Lax=bPbKypyAE*Yi$dDlSYBN+k_5m20TzCsR(VT`2OjPn@vGX$fpgawcJdb8ak zGX4C%noBe=myS;L@V;Wh2f4$jpa6n9NK>kr^AuB0E?N%sHV^2Ln=ALw-SW>2x|AuW zZ_#r}dCJ*;z!l|-7l=T_Y;a! z&PJCIO|o5!Y|)s9oX?-|lF(gq`YXt-b4-`HhDcUPltami`YMiv z%x<(lFP@^b6cH8Qi0r0(DB9TTu*K~8(@p4Urm;GE+O~QQ#(|qvWdnwC9$j+3sJYrQ?YNd{fAyX@))gn z?|3^+^J>0*;dTvK2}l8Vx#u4ZkxxabdsU3Bd8D@s@MxVV53r-a#>w7Wm|;%$B_dGj zgB6U3Ds8TXad!#!I8E5*8exW~U{4}Cn( z%7NT(2(B|3=IQz^rmjw_{tJPCK_)tQW@Or4m-<$=Z-&5dvkN$9s=3JN>yO*8;?6x#b{p!&~gd7R?zk)<@1{{;l)_V@&fj|6oI#Aw6FH z(I*_a;DPg>5eY≤&*Mpg7GkUd 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⁣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 E+Kbkmwo%7hAzu)}MA&ufi6lwgJgnd_6e(K13 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 From b20b00c73a65968c595c8a1fc0346e3e28c9603c Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 8 Aug 2024 15:05:19 +0800 Subject: [PATCH 38/45] doc: fix typo issue --- docs/zh/08-develop/09-udf.md | 48 ++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/docs/zh/08-develop/09-udf.md b/docs/zh/08-develop/09-udf.md index 28457cb24d..700bbb2ae0 100644 --- a/docs/zh/08-develop/09-udf.md +++ b/docs/zh/08-develop/09-udf.md @@ -6,7 +6,7 @@ toc_max_heading_level: 4 ## UDF 简介 -在某些应用场景中,应用逻辑需要的查询功能无法直接使用 TDengine 内置的函数来实现。TDengine 允许编写用户自定义函数(UDF),以便解决特殊应用场景中的使用需求。UDF 在集群中注册成功后,可以像系统内置函数一样在 SQ L中调用,就使用角度而言没有任何区别。UDF 分为标量函数和聚合函数。标量函数对每行数据输出一个值,如求绝对值(abs)、正弦函数(sin)、字符串拼接函数(concat)等。聚合函数对多行数据输出一个值,如求平均数(avg)、取最大值(max)等。 +在某些应用场景中,应用逻辑需要的查询功能无法直接使用内置函数来实现,TDengine 允许编写用户自定义函数(UDF),以便解决特殊应用场景中的使用需求。UDF 在集群中注册成功后,可以像系统内置函数一样在 SQL 中调用,就使用角度而言没有任何区别。UDF 分为标量函数和聚合函数。标量函数对每行数据输出一个值,如求绝对值(abs)、正弦函数(sin)、字符串拼接函数(concat)等。聚合函数对多行数据输出一个值,如求平均数(avg)、取最大值(max)等。 TDengine 支持用 C 和 Python 两种编程语言编写 UDF。C 语言编写的 UDF 与内置函数的性能几乎相同,Python 语言编写的 UDF 可以利用丰富的 Python 运算库。为了避免 UDF 执行中发生异常影响数据库服务,TDengine 使用了进程分离技术,把 UDF 的执行放到另一个进程中完成,即使用户编写的 UDF 崩溃,也不会影响 TDengine 的正常运行。 @@ -15,20 +15,19 @@ TDengine 支持用 C 和 Python 两种编程语言编写 UDF。C 语言编写的 使用 C 语言实现 UDF 时,需要实现规定的接口函数 - 标量函数需要实现标量接口函数 scalarfn 。 - 聚合函数需要实现聚合接口函数 aggfn_start、aggfn、aggfn_finish。 -- 如果需要初始化,实现 udf_init;如果需要清理工作,实现 udf_destroy。 - -接口函数的名称是 UDF 名称,或者是 UDF 名称和特定后缀(`_start`、`_finish`、`_init`、`_destroy`)的连接。 +- 如果需要初始化,实现 udf_init。 +- 如果需要清理工作,实现 udf_destroy。 ### 接口定义 -在 TDengine 中,UDF 的接口函数名称可以是 UDF 名称,也可以是 UDF 名称和特定后缀(如_start、_finish、_init、_destroy)的连接。后面内容中描述的函数名称,例如 scalarfn、aggfn,需要替换成 UDF 名称。 +接口函数的名称是 UDF 名称,或者是 UDF 名称和特定后缀(_start、_finish、_init、_destroy)的连接。后面内容中描述的函数名称,例如 scalarfn、aggfn,需要替换成 UDF 名称。 #### 标量函数接口 标量函数是一种将输入数据转换为输出数据的函数,通常用于对单个数据值进行计算和转换。标量函数的接口函数原型如下。 ```c -int32_t scalarfn(SUdfDataBlock* inputDataBlock, SUdfColumn *resultColumn) +int32_t scalarfn(SUdfDataBlock* inputDataBlock, SUdfColumn *resultColumn); ``` 主要参数说明如下。 - inputDataBlock:输入的数据块。 @@ -47,9 +46,9 @@ int32_t scalarfn(SUdfDataBlock* inputDataBlock, SUdfColumn *resultColumn) 聚合函数的接口函数原型如下。 ```c -int32_t aggfn_start(SUdfInterBuf *interBuf) -int32_t aggfn(SUdfDataBlock* inputBlock, SUdfInterBuf *interBuf, SUdfInterBuf *newInterBuf) -int32_t aggfn_finish(SUdfInterBuf* interBuf, SUdfInterBuf *result) +int32_t aggfn_start(SUdfInterBuf *interBuf); +int32_t aggfn(SUdfDataBlock* inputBlock, SUdfInterBuf *interBuf, SUdfInterBuf *newInterBuf); +int32_t aggfn_finish(SUdfInterBuf* interBuf, SUdfInterBuf *result); ``` 其中 aggfn 是函数名的占位符。首先调用 aggfn_start 生成结果 buffer,然后相关的数据会被分为多个行数据块,对每个数据块调用 aggfn 用数据块更新中间结果,最后再调用 aggfn_finish 从中间结果产生最终结果,最终结果只能含 0 或 1 条结果数据。 @@ -79,15 +78,16 @@ int32_t udf_destroy() #include "taoserror.h" #include "taosudf.h" -// Initialization function. If no initialization, we can skip definition of it. -// The initialization function shall be concatenation of the udf name and _init suffix +// Initialization function. +// If no initialization, we can skip definition of it. +// The initialization function shall be concatenation of the udf name and _init suffix. // @return error number defined in taoserror.h int32_t scalarfn_init() { // initialization. return TSDB_CODE_SUCCESS; } -// Scalar function main computation function +// Scalar function main computation function. // @param inputDataBlock, input data block composed of multiple columns with each column defined by SUdfColumn // @param resultColumn, output column // @return error number defined in taoserror.h @@ -96,7 +96,8 @@ int32_t scalarfn(SUdfDataBlock* inputDataBlock, SUdfColumn* resultColumn) { return TSDB_CODE_SUCCESS; } -// Cleanup function. If no cleanup related processing, we can skip definition of it. +// Cleanup function. +// If no cleanup related processing, we can skip definition of it. // The destroy function shall be concatenation of the udf name and _destroy suffix. // @return error number defined in taoserror.h int32_t scalarfn_destroy() { @@ -112,16 +113,18 @@ int32_t scalarfn_destroy() { #include "taoserror.h" #include "taosudf.h" -// Initialization function. If no initialization, we can skip definition of it. -// The initialization function shall be concatenation of the udf name and _init suffix +// Initialization function. +// If no initialization, we can skip definition of it. +// The initialization function shall be concatenation of the udf name and _init suffix. // @return error number defined in taoserror.h int32_t aggfn_init() { // initialization. return TSDB_CODE_SUCCESS; } -// Aggregate start function. The intermediate value or the state(@interBuf) is initialized in this function. -// The function name shall be concatenation of udf name and _start suffix +// Aggregate start function. +// The intermediate value or the state(@interBuf) is initialized in this function. +// The function name shall be concatenation of udf name and _start suffix. // @param interbuf intermediate value to initialize // @return error number defined in taoserror.h int32_t aggfn_start(SUdfInterBuf* interBuf) { @@ -129,7 +132,8 @@ int32_t aggfn_start(SUdfInterBuf* interBuf) { return TSDB_CODE_SUCCESS; } -// Aggregate reduce function. This function aggregate old state(@interbuf) and one data bock(inputBlock) and output a new state(@newInterBuf). +// Aggregate reduce function. +// This function aggregate old state(@interbuf) and one data bock(inputBlock) and output a new state(@newInterBuf). // @param inputBlock input data block // @param interBuf old state // @param newInterBuf new state @@ -139,7 +143,8 @@ int32_t aggfn(SUdfDataBlock* inputBlock, SUdfInterBuf *interBuf, SUdfInterBuf *n return TSDB_CODE_SUCCESS; } -// Aggregate function finish function. This function transforms the intermediate value(@interBuf) into the final output(@result). +// Aggregate function finish function. +// This function transforms the intermediate value(@interBuf) into the final output(@result). // The function name must be concatenation of aggfn and _finish suffix. // @interBuf : intermediate value // @result: final result @@ -149,7 +154,8 @@ int32_t int32_t aggfn_finish(SUdfInterBuf* interBuf, SUdfInterBuf *result) { return TSDB_CODE_SUCCESS; } -// Cleanup function. If no cleanup related processing, we can skip definition of it. +// Cleanup function. +// If no cleanup related processing, we can skip definition of it. // The destroy function shall be concatenation of the udf name and _destroy suffix. // @return error number defined in taoserror.h int32_t aggfn_destroy() { @@ -432,7 +438,7 @@ create function myfun as '/root/udf/myfun.py' outputtype double language 'Python 其输出如下 ```shell - taos> create function myfun as '/root/udf/myfun.py' outputtype double language 'Python'; +taos> create function myfun as '/root/udf/myfun.py' outputtype double language 'Python'; Create OK, 0 row(s) affected (0.005202s) ``` From d55a0c7100323b04887afc2f8ca70c649144885d Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 8 Aug 2024 16:18:18 +0800 Subject: [PATCH 39/45] enh: enable log in udf --- include/libs/function/taosudf.h | 24 ++++++++++++++++++++++++ include/util/tlog.h | 4 ++-- source/util/src/tlog.c | 4 ++-- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/include/libs/function/taosudf.h b/include/libs/function/taosudf.h index 04b92a897a..0b59d7c2f5 100644 --- a/include/libs/function/taosudf.h +++ b/include/libs/function/taosudf.h @@ -320,6 +320,30 @@ typedef int32_t (*TScriptUdfDestoryFunc)(void *udfCtx); typedef int32_t (*TScriptOpenFunc)(SScriptUdfEnvItem *items, int numItems); typedef int32_t (*TScriptCloseFunc)(); +// clang-format off +#ifdef WINDOWS + #define fnFatal(...) {} + #define fnError(...) {} + #define fnWarn(...) {} + #define fnInfo(...) {} + #define fnDebug(...) {} + #define fnTrace(...) {} +#else + DLL_EXPORT void taosPrintLog(const char *flags, int32_t level, int32_t dflag, const char *format, ...) +#ifdef __GNUC__ + __attribute__((format(printf, 4, 5))) +#endif + ; + extern int32_t udfDebugFlag; + #define udfFatal(...) { if (udfDebugFlag & 1) { taosPrintLog("UDF FATAL ", 1, 255, __VA_ARGS__); }} + #define udfError(...) { if (udfDebugFlag & 1) { taosPrintLog("UDF ERROR ", 1, 255, __VA_ARGS__); }} + #define udfWarn(...) { if (udfDebugFlag & 2) { taosPrintLog("UDF WARN ", 2, 255, __VA_ARGS__); }} + #define udfInfo(...) { if (udfDebugFlag & 2) { taosPrintLog("UDF ", 2, 255, __VA_ARGS__); }} + #define udfDebug(...) { if (udfDebugFlag & 4) { taosPrintLog("UDF ", 4, udfDebugFlag, __VA_ARGS__); }} + #define udfTrace(...) { if (udfDebugFlag & 8) { taosPrintLog("UDF ", 8, udfDebugFlag, __VA_ARGS__); }} +#endif +// clang-format on + #ifdef __cplusplus } #endif diff --git a/include/util/tlog.h b/include/util/tlog.h index 67aafbfe44..b4dbbef532 100644 --- a/include/util/tlog.h +++ b/include/util/tlog.h @@ -74,13 +74,13 @@ void taosCloseLog(); void taosResetLog(); void taosDumpData(uint8_t *msg, int32_t len); -void taosPrintLog(const char *flags, ELogLevel level, int32_t dflag, const char *format, ...) +void taosPrintLog(const char *flags, int32_t level, int32_t dflag, const char *format, ...) #ifdef __GNUC__ __attribute__((format(printf, 4, 5))) #endif ; -void taosPrintLongString(const char *flags, ELogLevel level, int32_t dflag, const char *format, ...) +void taosPrintLongString(const char *flags, int32_t level, int32_t dflag, const char *format, ...) #ifdef __GNUC__ __attribute__((format(printf, 4, 5))) #endif diff --git a/source/util/src/tlog.c b/source/util/src/tlog.c index 1946a0a274..86dc767adc 100644 --- a/source/util/src/tlog.c +++ b/source/util/src/tlog.c @@ -567,7 +567,7 @@ static inline void taosPrintLogImp(ELogLevel level, int32_t dflag, const char *b } } -void taosPrintLog(const char *flags, ELogLevel level, int32_t dflag, const char *format, ...) { +void taosPrintLog(const char *flags, int32_t level, int32_t dflag, const char *format, ...) { if (!(dflag & DEBUG_FILE) && !(dflag & DEBUG_SCREEN)) return; char buffer[LOG_MAX_LINE_BUFFER_SIZE]; @@ -590,7 +590,7 @@ void taosPrintLog(const char *flags, ELogLevel level, int32_t dflag, const char } } -void taosPrintLongString(const char *flags, ELogLevel level, int32_t dflag, const char *format, ...) { +void taosPrintLongString(const char *flags, int32_t level, int32_t dflag, const char *format, ...) { if (!osLogSpaceAvailable()) return; if (!(dflag & DEBUG_FILE) && !(dflag & DEBUG_SCREEN)) return; From 05be9963420662612e8578ca4b3be4292ae5094f Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 8 Aug 2024 16:18:45 +0800 Subject: [PATCH 40/45] enh: adjust bit_add example codes --- tests/script/sh/bit_and.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/tests/script/sh/bit_and.c b/tests/script/sh/bit_and.c index f3bf71ce94..2cf2157e1c 100644 --- a/tests/script/sh/bit_and.c +++ b/tests/script/sh/bit_and.c @@ -8,13 +8,17 @@ DLL_EXPORT int32_t bit_and_init() { return 0; } DLL_EXPORT int32_t bit_and_destroy() { return 0; } DLL_EXPORT int32_t bit_and(SUdfDataBlock* block, SUdfColumn* resultCol) { + udfTrace("block:%p, processing begins, rows:%d cols:%d", block, block->numOfRows, block->numOfCols); + if (block->numOfCols < 2) { + udfError("block:%p, cols:%d needs to be greater than 2", block, block->numOfCols); return TSDB_CODE_UDF_INVALID_INPUT; } for (int32_t i = 0; i < block->numOfCols; ++i) { SUdfColumn* col = block->udfCols[i]; - if (!(col->colMeta.type == TSDB_DATA_TYPE_INT)) { + if (col->colMeta.type != TSDB_DATA_TYPE_INT) { + udfError("block:%p, col:%d type:%d should be int(%d)", block, i, col->colMeta.type, TSDB_DATA_TYPE_INT); return TSDB_CODE_UDF_INVALID_INPUT; } } @@ -23,25 +27,35 @@ DLL_EXPORT int32_t bit_and(SUdfDataBlock* block, SUdfColumn* resultCol) { for (int32_t i = 0; i < block->numOfRows; ++i) { if (udfColDataIsNull(block->udfCols[0], i)) { + udfTrace("block:%p, row:%d result is null since col:0 is null", block, i); udfColDataSetNull(resultCol, i); continue; } + int32_t result = *(int32_t*)udfColDataGetData(block->udfCols[0], i); - int j = 1; + udfTrace("block:%p, row:%d col:0 data:%d", block, i, result); + + int32_t j = 1; for (; j < block->numOfCols; ++j) { if (udfColDataIsNull(block->udfCols[j], i)) { + udfTrace("block:%p, row:%d result is null since col:%d is null", block, i, j); udfColDataSetNull(resultCol, i); break; } char* colData = udfColDataGetData(block->udfCols[j], i); result &= *(int32_t*)colData; + udfTrace("block:%p, row:%d col:%d data:%d", block, i, j, *(int32_t*)colData); } + if (j == block->numOfCols) { udfColDataSet(resultCol, i, (char*)&result, false); + udfTrace("block:%p, row:%d result is %d", block, i, result); } } + resultData->numOfRows = block->numOfRows; + udfTrace("block:%p, processing completed, rows:%d, cols:%d,", block, block->numOfRows, block->numOfCols); return TSDB_CODE_SUCCESS; } From be8e32c0d4f3b2b49093bee1672f457c5600e920 Mon Sep 17 00:00:00 2001 From: sheyanjie-qq <249478495@qq.com> Date: Thu, 8 Aug 2024 16:21:58 +0800 Subject: [PATCH 41/45] mod monitor doc --- docs/zh/07-operation/05-monitor.md | 244 +----------- .../zh/14-reference/01-components/01-taosd.md | 364 ++++++++++++++---- .../01-components/03-taosadapter.md | 59 +-- .../zh/14-reference/01-components/04-taosx.md | 139 ++++++- .../01-components/06-taoskeeper.md | 16 + 5 files changed, 467 insertions(+), 355 deletions(-) diff --git a/docs/zh/07-operation/05-monitor.md b/docs/zh/07-operation/05-monitor.md index e5aa3c7430..e39eaea1f5 100644 --- a/docs/zh/07-operation/05-monitor.md +++ b/docs/zh/07-operation/05-monitor.md @@ -52,247 +52,11 @@ TDengine 数据源插件已被提交至 Grafana 官网,完成插件的安装 **注意** 在 TDinsight 界面左上角的 Log from 下拉列表中可以选择 log 数据库。 -### taosd 监控数据 - -TDinsight dashboard 数据来源于 `log` 库(存放监控数据的默认 db,可以在 taoskeeper 配置文件中修改)。以下是由 taosd 上报由 taosKeeper 存储在 log 库中的数据。 - -#### taosd\_cluster\_basic 表 - -`taosd_cluster_basic` 表记录集群基础信息。 - -| field | type | is\_tag | comment | -| :------------------- | :-------- | :------ | :------------------------------ | -| ts | TIMESTAMP | | timestamp | -| first\_ep | VARCHAR | | 集群 first ep | -| first\_ep\_dnode\_id | INT | | 集群 first ep 的 dnode id | -| cluster_version | VARCHAR | | tdengine version。例如:3.0.4.0 | -| cluster\_id | VARCHAR | TAG | cluster id | - -#### taosd\_cluster\_info 表 - -`taosd_cluster_info` 表记录集群信息。 - -| field | type | is\_tag | comment | -| :----------------------- | :-------- | :------ | :----------------------------------------------- | -| \_ts | TIMESTAMP | | timestamp | -| cluster_uptime | DOUBLE | | 当前 master 节点的uptime。单位:秒 | -| dbs\_total | DOUBLE | | database 总数 | -| tbs\_total | DOUBLE | | 当前集群 table 总数 | -| stbs\_total | DOUBLE | | 当前集群 stable 总数 | -| dnodes\_total | DOUBLE | | 当前集群 dnode 总数 | -| dnodes\_alive | DOUBLE | | 当前集群 dnode 存活总数 | -| mnodes\_total | DOUBLE | | 当前集群 mnode 总数 | -| mnodes\_alive | DOUBLE | | 当前集群 mnode 存活总数 | -| vgroups\_total | DOUBLE | | 当前集群 vgroup 总数 | -| vgroups\_alive | DOUBLE | | 当前集群 vgroup 存活总数 | -| vnodes\_total | DOUBLE | | 当前集群 vnode 总数 | -| vnodes\_alive | DOUBLE | | 当前集群 vnode 存活总数 | -| connections\_total | DOUBLE | | 当前集群连接总数 | -| topics\_total | DOUBLE | | 当前集群 topic 总数 | -| streams\_total | DOUBLE | | 当前集群 stream 总数 | -| grants_expire\_time | DOUBLE | | 认证过期时间,企业版有效,社区版为 DOUBLE 最大值 | -| grants_timeseries\_used | DOUBLE | | 已用测点数 | -| grants_timeseries\_total | DOUBLE | | 总测点数,开源版本为 DOUBLE 最大值 | -| cluster\_id | VARCHAR | TAG | cluster id | - -#### taosd\_vgroups\_info 表 - -`taosd_vgroups_info` 表记录虚拟节点组信息。 - -| field | type | is\_tag | comment | -| :------------- | :-------- | :------ | :--------------------------------------------- | -| \_ts | TIMESTAMP | | timestamp | -| tables\_num | DOUBLE | | vgroup 中 table 数量 | -| status | DOUBLE | | vgroup 状态, 取值范围:unsynced = 0, ready = 1 | -| vgroup\_id | VARCHAR | TAG | vgroup id | -| database\_name | VARCHAR | TAG | vgroup 所属的 database 名字 | -| cluster\_id | VARCHAR | TAG | cluster id | - -#### taosd\_dnodes\_info 表 - -`taosd_dnodes_info` 记录 dnode 信息。 - -| field | type | is\_tag | comment | -| :---------------- | :-------- | :------ | :------------------------------------------------------------------------------------------------ | -| \_ts | TIMESTAMP | | timestamp | -| uptime | DOUBLE | | dnode uptime,单位:秒 | -| cpu\_engine | DOUBLE | | taosd cpu 使用率,从 `/proc//stat` 读取 | -| cpu\_system | DOUBLE | | 服务器 cpu 使用率,从 `/proc/stat` 读取 | -| cpu\_cores | DOUBLE | | 服务器 cpu 核数 | -| mem\_engine | DOUBLE | | taosd 内存使用率,从 `/proc//status` 读取 | -| mem\_free | DOUBLE | | 服务器可用内存,单位 KB | -| mem\_total | DOUBLE | | 服务器内存总量,单位 KB | -| disk\_used | DOUBLE | | data dir 挂载的磁盘使用量,单位 bytes | -| disk\_total | DOUBLE | | data dir 挂载的磁盘总容量,单位 bytes | -| system\_net\_in | DOUBLE | | 网络吞吐率,从 `/proc/net/dev` 中读取的 received bytes。单位 byte/s | -| system\_net\_out | DOUBLE | | 网络吞吐率,从 `/proc/net/dev` 中读取的 transmit bytes。单位 byte/s | -| io\_read | DOUBLE | | io 吞吐率,从 `/proc//io` 中读取的 rchar 与上次数值计算之后,计算得到速度。单位 byte/s | -| io\_write | DOUBLE | | io 吞吐率,从 `/proc//io` 中读取的 wchar 与上次数值计算之后,计算得到速度。单位 byte/s | -| io\_read\_disk | DOUBLE | | 磁盘 io 吞吐率,从 `/proc//io` 中读取的 read_bytes。单位 byte/s | -| io\_write\_disk | DOUBLE | | 磁盘 io 吞吐率,从 `/proc//io` 中读取的 write_bytes。单位 byte/s | -| vnodes\_num | DOUBLE | | dnode 上 vnodes 数量 | -| masters | DOUBLE | | dnode 上 master node 数量 | -| has\_mnode | DOUBLE | | dnode 是否包含 mnode,取值范围:包含=1,不包含=0 | -| has\_qnode | DOUBLE | | dnode 是否包含 qnode,取值范围:包含=1,不包含=0 | -| has\_snode | DOUBLE | | dnode 是否包含 snode,取值范围:包含=1,不包含=0 | -| has\_bnode | DOUBLE | | dnode 是否包含 bnode,取值范围:包含=1,不包含=0 | -| error\_log\_count | DOUBLE | | error 总数 | -| info\_log\_count | DOUBLE | | info 总数 | -| debug\_log\_count | DOUBLE | | debug 总数 | -| trace\_log\_count | DOUBLE | | trace 总数 | -| dnode\_id | VARCHAR | TAG | dnode id | -| dnode\_ep | VARCHAR | TAG | dnode endpoint | -| cluster\_id | VARCHAR | TAG | cluster id | - -#### taosd\_dnodes\_status 表 - -`taosd_dnodes_status` 表记录 dnode 状态信息。 - -| field | type | is\_tag | comment | -| :---------- | :-------- | :------ | :--------------------------------------- | -| \_ts | TIMESTAMP | | timestamp | -| status | DOUBLE | | dnode 状态,取值范围:ready=1,offline =0 | -| dnode\_id | VARCHAR | TAG | dnode id | -| dnode\_ep | VARCHAR | TAG | dnode endpoint | -| cluster\_id | VARCHAR | TAG | cluster id | - -#### taosd\_dnodes\_log\_dir 表 - -`taosd_dnodes_log_dir` 表记录 log 目录信息。 - -| field | type | is\_tag | comment | -| :---------- | :-------- | :------ | :---------------------------------- | -| \_ts | TIMESTAMP | | timestamp | -| avail | DOUBLE | | log 目录可用空间。单位 byte | -| used | DOUBLE | | log 目录已使用空间。单位 byte | -| total | DOUBLE | | log 目录空间。单位 byte | -| name | VARCHAR | TAG | log 目录名,一般为 `/var/log/taos/` | -| dnode\_id | VARCHAR | TAG | dnode id | -| dnode\_ep | VARCHAR | TAG | dnode endpoint | -| cluster\_id | VARCHAR | TAG | cluster id | - -#### taosd\_dnodes\_data\_dir 表 - -`taosd_dnodes_data_dir` 表记录 data 目录信息。 - -| field | type | is\_tag | comment | -| :---------- | :-------- | :------ | :-------------------------------- | -| \_ts | TIMESTAMP | | timestamp | -| avail | DOUBLE | | data 目录可用空间。单位 byte | -| used | DOUBLE | | data 目录已使用空间。单位 byte | -| total | DOUBLE | | data 目录空间。单位 byte | -| level | VARCHAR | TAG | 0、1、2 多级存储级别 | -| name | VARCHAR | TAG | data 目录,一般为 `/var/lib/taos` | -| dnode\_id | VARCHAR | TAG | dnode id | -| dnode\_ep | VARCHAR | TAG | dnode endpoint | -| cluster\_id | VARCHAR | TAG | cluster id | - -#### taosd\_mnodes\_info 表 - -`taosd_mnodes_info` 表记录 mnode 角色信息。 - -| field | type | is\_tag | comment | -| :---------- | :-------- | :------ | :------------------------------------------------------------------------------------------------------- | -| \_ts | TIMESTAMP | | timestamp | -| role | DOUBLE | | mnode 角色, 取值范围:offline = 0,follower = 100,candidate = 101,leader = 102,error = 103,learner = 104 | -| mnode\_id | VARCHAR | TAG | master node id | -| mnode\_ep | VARCHAR | TAG | master node endpoint | -| cluster\_id | VARCHAR | TAG | cluster id | - -#### taosd\_vnodes\_role 表 - -`taosd_vnodes_role` 表记录虚拟节点角色信息。 - -| field | type | is\_tag | comment | -| :------------- | :-------- | :------ | :------------------------------------------------------------------------------------------------------ | -| \_ts | TIMESTAMP | | timestamp | -| vnode\_role | DOUBLE | | vnode 角色,取值范围:offline = 0,follower = 100,candidate = 101,leader = 102,error = 103,learner = 104 | -| vgroup\_id | VARCHAR | TAG | dnode id | -| dnode\_id | VARCHAR | TAG | dnode id | -| database\_name | VARCHAR | TAG | vgroup 所属的 database 名字 | -| cluster\_id | VARCHAR | TAG | cluster id | - -#### taosd\_sql\_req 表 - -`taosd_sql_req` 记录授权信息。 - -| field | type | is\_tag | comment | -| :---------- | :-------- | :------ | :--------------------------------------- | -| \_ts | TIMESTAMP | | timestamp | -| count | DOUBLE | | sql 数量 | -| result | VARCHAR | TAG | sql的执行结果,取值范围:Success, Failed | -| username | VARCHAR | TAG | 执行sql的user name | -| sql\_type | VARCHAR | TAG | sql类型,取值范围:inserted_rows | -| dnode\_id | VARCHAR | TAG | dnode id | -| dnode\_ep | VARCHAR | TAG | dnode endpoint | -| vgroup\_id | VARCHAR | TAG | dnode id | -| cluster\_id | VARCHAR | TAG | cluster id | - -#### taos\_sql\_req 表 - -`taos_sql_req` 记录授权信息。 - -| field | type | is\_tag | comment | -| :---------- | :-------- | :------ | :---------------------------------------- | -| \_ts | TIMESTAMP | | timestamp | -| count | DOUBLE | | sql 数量 | -| result | VARCHAR | TAG | sql的执行结果,取值范围:Success, Failed | -| username | VARCHAR | TAG | 执行sql的user name | -| sql\_type | VARCHAR | TAG | sql类型,取值范围:select, insert,delete | -| cluster\_id | VARCHAR | TAG | cluster id | - -#### taos\_slow\_sql 表 - -`taos_slow_sql` 记录授权信息。 - -| field | type | is\_tag | comment | -| :---------- | :-------- | :------ | :---------------------------------------------------- | -| \_ts | TIMESTAMP | | timestamp | -| count | DOUBLE | | sql 数量 | -| result | VARCHAR | TAG | sql的执行结果,取值范围:Success, Failed | -| username | VARCHAR | TAG | 执行sql的user name | -| duration | VARCHAR | TAG | sql执行耗时,取值范围:3-10s,10-100s,100-1000s,1000s- | -| cluster\_id | VARCHAR | TAG | cluster id | - - - -#### adapter\_requests 表 - -`adapter_requests` 记录 taosadapter 监控数据。 - -| field | type | is\_tag | comment | -| :----------------- | :----------- | :------ | :---------------------------------- | -| ts | TIMESTAMP | | timestamp | -| total | INT UNSIGNED | | 总请求数 | -| query | INT UNSIGNED | | 查询请求数 | -| write | INT UNSIGNED | | 写入请求数 | -| other | INT UNSIGNED | | 其他请求数 | -| in\_process | INT UNSIGNED | | 正在处理请求数 | -| success | INT UNSIGNED | | 成功请求数 | -| fail | INT UNSIGNED | | 失败请求数 | -| query\_success | INT UNSIGNED | | 查询成功请求数 | -| query\_fail | INT UNSIGNED | | 查询失败请求数 | -| write\_success | INT UNSIGNED | | 写入成功请求数 | -| write\_fail | INT UNSIGNED | | 写入失败请求数 | -| other\_success | INT UNSIGNED | | 其他成功请求数 | -| other\_fail | INT UNSIGNED | | 其他失败请求数 | -| query\_in\_process | INT UNSIGNED | | 正在处理查询请求数 | -| write\_in\_process | INT UNSIGNED | | 正在处理写入请求数 | -| endpoint | VARCHAR | | 请求端点 | -| req\_type | NCHAR | TAG | 请求类型:0 为 REST,1 为 Websocket | - - -#### keeper\_monitor 表 - -`keeper_monitor` 记录 taoskeeper 监控数据。 - -| field | type | is\_tag | comment | -| :------- | :-------- | :------ | :----------- | -| ts | TIMESTAMP | | timestamp | -| cpu | DOUBLE | | cpu 使用率 | -| mem | DOUBLE | | 内存使用率 | -| identify | NCHAR | TAG | 身份标识信息 | +### TDengine V3 监控数据 +TDinsight dashboard 数据来源于 `log` 库(存放监控数据的默认 db,可以在 taoskeeper 配置文件中修改)。”TDinsight for 3.x“ 仪表盘查询了 taosd 和 TaosAdapter 的监控指标。 +- taosd 的监控指标请参考 [taosd 监控指标](../../reference/components/taosd/#taosd-监控指标) +- taosAdapter 的监控指标请参考 [taosAdapter 监控指标](../../reference/components/taosadapter/#taosadapter-监控指标) ## 监控 taosX diff --git a/docs/zh/14-reference/01-components/01-taosd.md b/docs/zh/14-reference/01-components/01-taosd.md index 0e9c4eb926..02cf2155a0 100644 --- a/docs/zh/14-reference/01-components/01-taosd.md +++ b/docs/zh/14-reference/01-components/01-taosd.md @@ -27,42 +27,42 @@ taosd 命令行参数如下 ### 连接相关 -| 参数名称 | 参数说明 | -|:-------------:|:----------------------------------------------------------------:| -|firstEp | taosd 启动时,主动连接的集群中首个 dnode 的 end point,缺省值:localhost:6030 | -|secondEp | taosd 启动时,如果 firstEp 连接不上,尝试连接集群中第二个 dnode 的 endpoint,缺省值:无| -|fqdn | 启动 taosd 后所监听的服务地址,缺省值:所在服务器上配置的第一个 hostname | -|serverPort | 启动 taosd 后所监听的端口,缺省值:6030 | -|maxShellConns | 一个 dnode 容许的连接数,取值范围为 10-5000000,缺省值:5000 | -|numOfRpcSessions | 允许一个客户端能创建的最大连接数,取值范围 100-100000,缺省值:30000 | -|timeToGetAvailableConn | 获得可用连接的最长等待时间,取值范围 10-50000000,单位为毫秒,缺省值:500000 | +| 参数名称 | 参数说明 | +| :--------------------: | :-------------------------------------------------------------------------------------: | +| firstEp | taosd 启动时,主动连接的集群中首个 dnode 的 end point,缺省值:localhost:6030 | +| secondEp | taosd 启动时,如果 firstEp 连接不上,尝试连接集群中第二个 dnode 的 endpoint,缺省值:无 | +| fqdn | 启动 taosd 后所监听的服务地址,缺省值:所在服务器上配置的第一个 hostname | +| serverPort | 启动 taosd 后所监听的端口,缺省值:6030 | +| maxShellConns | 一个 dnode 容许的连接数,取值范围为 10-5000000,缺省值:5000 | +| numOfRpcSessions | 允许一个客户端能创建的最大连接数,取值范围 100-100000,缺省值:30000 | +| timeToGetAvailableConn | 获得可用连接的最长等待时间,取值范围 10-50000000,单位为毫秒,缺省值:500000 | ### 监控相关 -| 参数名称 | 参数说明 | -|:-------------:|:----------------------------------------------------------------:| -|monitor | 是否收集监控数据并上报,0: 关闭;1:打开;缺省值:0 | -|monitorFqdn | taosKeeper 服务所在服务器的 FQDN,缺省值:无 | -|monitorPort | taosKeeper 服务所监听的端口号,缺省值:6043 | -|monitorInternal | 监控数据库记录系统参数(CPU/内存)的时间间隔,单位是秒,取值范围 1-200000 ,缺省值:30| -|telemetryReporting | 是否上传 telemetry,0: 不上传,1:上传,缺省值:1 | -|crashReporting | 是否上传 crash 信息;0: 不上传,1: 上传;缺省值: 1| +| 参数名称 | 参数说明 | +| :----------------: | :------------------------------------------------------------------------------------: | +| monitor | 是否收集监控数据并上报,0: 关闭;1:打开;缺省值:0 | +| monitorFqdn | taosKeeper 服务所在服务器的 FQDN,缺省值:无 | +| monitorPort | taosKeeper 服务所监听的端口号,缺省值:6043 | +| monitorInternal | 监控数据库记录系统参数(CPU/内存)的时间间隔,单位是秒,取值范围 1-200000 ,缺省值:30 | +| telemetryReporting | 是否上传 telemetry,0: 不上传,1:上传,缺省值:1 | +| crashReporting | 是否上传 crash 信息;0: 不上传,1: 上传;缺省值: 1 | ### 查询相关 -| 参数名称 | 参数说明 | -|:-------------:|:----------------------------------------------------------------:| -|queryPolicy | 查询策略,1: 只使用 vnode,不使用 qnode; 2: 没有扫描算子的子任务在 qnode 执行,带扫描算子的子任务在 vnode 执行; 3: vnode 只运行扫描算子,其余算子均在 qnode 执行 ;缺省值:1 | -|maxNumOfDistinctRes | 允许返回的 distinct 结果最大行数,默认值 10 万,最大允许值 1 亿 | -|countAlwaysReturnValue | ount/hyperloglog函数在输入数据为空或者NULL的情况下是否返回值,0: 返回空行,1: 返回;该参数设置为 1 时,如果查询中含有 INTERVAL 子句或者该查询使用了TSMA时, 且相应的组或窗口内数据为空或者NULL, 对应的组或窗口将不返回查询结果. 注意此参数客户端和服务端值应保持一致.| +| 参数名称 | 参数说明 | +| :--------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| queryPolicy | 查询策略,1: 只使用 vnode,不使用 qnode; 2: 没有扫描算子的子任务在 qnode 执行,带扫描算子的子任务在 vnode 执行; 3: vnode 只运行扫描算子,其余算子均在 qnode 执行 ;缺省值:1 | +| maxNumOfDistinctRes | 允许返回的 distinct 结果最大行数,默认值 10 万,最大允许值 1 亿 | +| countAlwaysReturnValue | ount/hyperloglog函数在输入数据为空或者NULL的情况下是否返回值,0: 返回空行,1: 返回;该参数设置为 1 时,如果查询中含有 INTERVAL 子句或者该查询使用了TSMA时, 且相应的组或窗口内数据为空或者NULL, 对应的组或窗口将不返回查询结果. 注意此参数客户端和服务端值应保持一致. | ### 区域相关 -| 参数名称 | 参数说明 | -|:-------------:|:----------------------------------------------------------------:| -|timezone | 时区,缺省值:当前服务器所配置的时区 | -|locale | 系统区位信息及编码格式 ,缺省值:系统中动态获取,如果自动获取失败,需要用户在配置文件设置或通过 API 设置 | -|charset | 字符集编码,缺省值:系统自动获取 | +| 参数名称 | 参数说明 | +| :------: | :------------------------------------------------------------------------------------------------------: | +| timezone | 时区,缺省值:当前服务器所配置的时区 | +| locale | 系统区位信息及编码格式 ,缺省值:系统中动态获取,如果自动获取失败,需要用户在配置文件设置或通过 API 设置 | +| charset | 字符集编码,缺省值:系统自动获取 | :::info 1. 为应对多时区的数据写入和查询问题,TDengine 采用 Unix 时间戳(Unix Timestamp)来记录和存储时间戳。Unix 时间戳的特点决定了任一时刻不论在任何时区,产生的时间戳均一致。需要注意的是,Unix 时间戳是在客户端完成转换和记录。为了确保客户端其他形式的时间转换为正确的 Unix 时间戳,需要设置正确的时区。 @@ -141,64 +141,64 @@ charset 的有效值是 UTF-8。 ### 存储相关 -| 参数名称 | 参数说明 | -|:-------------:|:----------------------------------------------------------------:| -|dataDir | 数据文件目录,所有的数据文件都将写入该目录,缺省值:/var/lib | -|tempDir | 指定所有系统运行过程中的临时文件生成的目录,缺省值:/tmp | -|minimalTmpDirGB | tempDir 所指定的临时文件目录所需要保留的最小空间,单位 GB,缺省值: 1| -|minimalDataDirGB | dataDir 指定的时序数据存储目录所需要保留的最小空间,单位 GB,缺省值: 2 | +| 参数名称 | 参数说明 | +| :--------------: | :--------------------------------------------------------------------: | +| dataDir | 数据文件目录,所有的数据文件都将写入该目录,缺省值:/var/lib | +| tempDir | 指定所有系统运行过程中的临时文件生成的目录,缺省值:/tmp | +| minimalTmpDirGB | tempDir 所指定的临时文件目录所需要保留的最小空间,单位 GB,缺省值: 1 | +| minimalDataDirGB | dataDir 指定的时序数据存储目录所需要保留的最小空间,单位 GB,缺省值: 2 | ### 集群相关 -| 参数名称 | 参数说明 | -|:-------------:|:----------------------------------------------------------------:| -|supportVnodes | dnode 支持的最大 vnode 数目,取值范围:0-4096,缺省值: CPU 核数的 2 倍 + 5 | +| 参数名称 | 参数说明 | +| :-----------: | :-------------------------------------------------------------------------: | +| supportVnodes | dnode 支持的最大 vnode 数目,取值范围:0-4096,缺省值: CPU 核数的 2 倍 + 5 | ### 性能调优 -| 参数名称 | 参数说明 | -|:-------------:|:----------------------------------------------------------------:| -|numOfCommitThreads | 写入线程的最大数量,取值范围 0-1024,缺省值为 4 | +| 参数名称 | 参数说明 | +| :----------------: | :---------------------------------------------: | +| numOfCommitThreads | 写入线程的最大数量,取值范围 0-1024,缺省值为 4 | ### 日志相关 -| 参数名称 | 参数说明 | -|:-------------:|:----------------------------------------------------------------:| -|logDir | 日志文件目录,运行日志将写入该目录,缺省值:/var/log/taos | -|minimalLogDirGB | 当日志文件夹所在磁盘可用空间大小小于该值时,停止写日志,单位GB,缺省值:1| -|numOfLogLines | 单个日志文件允许的最大行数,缺省值:10,000,000 | -|asyncLog | 日志写入模式,0: 同步,1: 异步,缺省值: 1 | -|logKeepDays | 日志文件的最长保存时间 ,单位:天,缺省值:0,意味着无限保存;当设置为大于0 的值时,日志文件会被重命名为 taosdlog.xxx,其中 xxx 为日志文件最后修改的时间戳。 | -|slowLogThreshold | 慢查询门限值,大于等于门限值认为是慢查询,单位秒,默认值: 3 | -|slowLogScope | 定启动记录哪些类型的慢查询,可选值:ALL, QUERY, INSERT, OHTERS, NONE; 默认值:ALL | -|debugFlag | 运行日志开关,131(输出错误和警告日志),135(输出错误、警告和调试日志),143(输出错误、警告、调试和跟踪日志); 默认值:131 或 135 (取决于不同模块)| -|tmrDebugFlag | 定时器模块的日志开关,取值范围同上 | -|uDebugFlag | 共用功能模块的日志开关,取值范围同上 | -|rpcDebugFlag | rpc 模块的日志开关,取值范围同上 | -|jniDebugFlag | jni 模块的日志开关,取值范围同上 | -|qDebugFlag | query 模块的日志开关,取值范围同上 | -|dDebugFlag | dnode 模块的日志开关,取值范围同上,缺省值 135 | -|vDebugFlag | vnode 模块的日志开关,取值范围同上 | -|mDebugFlag | mnode 模块的日志开关,取值范围同上 | -|wDebugFlag | wal 模块的日志开关,取值范围同上 | -|sDebugFlag | sync 模块的日志开关,取值范围同上 | -|tsdbDebugFlag | tsdb 模块的日志开关,取值范围同上 | -|tqDebugFlag | tq 模块的日志开关,取值范围同上 | -|fsDebugFlag | fs 模块的日志开关,取值范围同上 | -|udfDebugFlag | udf 模块的日志开关,取值范围同上 | -|smaDebugFlag | sma 模块的日志开关,取值范围同上 | -|idxDebugFlag | index 模块的日志开关,取值范围同上 | -|tdbDebugFlag | tdb 模块的日志开关,取值范围同上 | +| 参数名称 | 参数说明 | +| :--------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------: | +| logDir | 日志文件目录,运行日志将写入该目录,缺省值:/var/log/taos | +| minimalLogDirGB | 当日志文件夹所在磁盘可用空间大小小于该值时,停止写日志,单位GB,缺省值:1 | +| numOfLogLines | 单个日志文件允许的最大行数,缺省值:10,000,000 | +| asyncLog | 日志写入模式,0: 同步,1: 异步,缺省值: 1 | +| logKeepDays | 日志文件的最长保存时间 ,单位:天,缺省值:0,意味着无限保存;当设置为大于0 的值时,日志文件会被重命名为 taosdlog.xxx,其中 xxx 为日志文件最后修改的时间戳。 | +| slowLogThreshold | 慢查询门限值,大于等于门限值认为是慢查询,单位秒,默认值: 3 | +| slowLogScope | 定启动记录哪些类型的慢查询,可选值:ALL, QUERY, INSERT, OHTERS, NONE; 默认值:ALL | +| debugFlag | 运行日志开关,131(输出错误和警告日志),135(输出错误、警告和调试日志),143(输出错误、警告、调试和跟踪日志); 默认值:131 或 135 (取决于不同模块) | +| tmrDebugFlag | 定时器模块的日志开关,取值范围同上 | +| uDebugFlag | 共用功能模块的日志开关,取值范围同上 | +| rpcDebugFlag | rpc 模块的日志开关,取值范围同上 | +| jniDebugFlag | jni 模块的日志开关,取值范围同上 | +| qDebugFlag | query 模块的日志开关,取值范围同上 | +| dDebugFlag | dnode 模块的日志开关,取值范围同上,缺省值 135 | +| vDebugFlag | vnode 模块的日志开关,取值范围同上 | +| mDebugFlag | mnode 模块的日志开关,取值范围同上 | +| wDebugFlag | wal 模块的日志开关,取值范围同上 | +| sDebugFlag | sync 模块的日志开关,取值范围同上 | +| tsdbDebugFlag | tsdb 模块的日志开关,取值范围同上 | +| tqDebugFlag | tq 模块的日志开关,取值范围同上 | +| fsDebugFlag | fs 模块的日志开关,取值范围同上 | +| udfDebugFlag | udf 模块的日志开关,取值范围同上 | +| smaDebugFlag | sma 模块的日志开关,取值范围同上 | +| idxDebugFlag | index 模块的日志开关,取值范围同上 | +| tdbDebugFlag | tdb 模块的日志开关,取值范围同上 | ### 压缩参数 -| 参数名称 | 参数说明 | -|:-------------:|:----------------------------------------------------------------:| -| compressMsgSize | 是否对 RPC 消息进行压缩;-1: 所有消息都不压缩; 0: 所有消息都压缩; N (N>0): 只有大于 N 个字节的消息才压缩;缺省值 -1 | -| fPrecision | 设置 float 类型浮点数压缩精度 ,取值范围:0.1 ~ 0.00000001 ,默认值 0.00000001 , 小于此值的浮点数尾数部分将被截断 | -|dPrecision | 设置 double 类型浮点数压缩精度 , 取值范围:0.1 ~ 0.0000000000000001 , 缺省值 0.0000000000000001 , 小于此值的浮点数尾数部分将被截取 | -|lossyColumn | 对 float 和/或 double 类型启用 TSZ 有损压缩;取值范围: float, double, none;缺省值: none,表示关闭无损压缩 | -|ifAdtFse | 在启用 TSZ 有损压缩时,使用 FSE 算法替换 HUFFMAN 算法, FSE 算法压缩速度更快,但解压稍慢,追求压缩速度可选用此算法; 0: 关闭,1:打开;默认值为 0 | +| 参数名称 | 参数说明 | +| :-------------: | :----------------------------------------------------------------------------------------------------------------------------------------------: | +| compressMsgSize | 是否对 RPC 消息进行压缩;-1: 所有消息都不压缩; 0: 所有消息都压缩; N (N>0): 只有大于 N 个字节的消息才压缩;缺省值 -1 | +| fPrecision | 设置 float 类型浮点数压缩精度 ,取值范围:0.1 ~ 0.00000001 ,默认值 0.00000001 , 小于此值的浮点数尾数部分将被截断 | +| dPrecision | 设置 double 类型浮点数压缩精度 , 取值范围:0.1 ~ 0.0000000000000001 , 缺省值 0.0000000000000001 , 小于此值的浮点数尾数部分将被截取 | +| lossyColumn | 对 float 和/或 double 类型启用 TSZ 有损压缩;取值范围: float, double, none;缺省值: none,表示关闭无损压缩 | +| ifAdtFse | 在启用 TSZ 有损压缩时,使用 FSE 算法替换 HUFFMAN 算法, FSE 算法压缩速度更快,但解压稍慢,追求压缩速度可选用此算法; 0: 关闭,1:打开;默认值为 0 | **补充说明** @@ -216,10 +216,214 @@ lossyColumns float|double ### 其他参数 -| 参数名称 | 参数说明 | -|:-------------:|:----------------------------------------------------------------:| -|enableCoreFile | crash 时是否生成 core 文件;0: 不生成,1:生成;默认值 为 1; 不同的启动方式,生成 core 文件的目录如下:1、systemctl start taosd 启动:生成的 core 在根目录下
2、手动启动,就在 taosd 执行目录下。| -|udf | 是否启动 UDF 服务;0: 不启动,1:启动;默认值 为 0 | -|ttlChangeOnWrite | ttl 到期时间是否伴随表的修改操作改变; 0: 不改变,1:改变 ;默认值 为 | -| tmqMaxTopicNum| 订阅最多可建立的 topic 数量; 取值范围 1-10000;缺省值 为20 | -|maxTsmaNum | 集群内可创建的TSMA个数;取值范围:0-3;缺省值: 3| \ No newline at end of file +| 参数名称 | 参数说明 | +| :--------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| enableCoreFile | crash 时是否生成 core 文件;0: 不生成,1:生成;默认值 为 1; 不同的启动方式,生成 core 文件的目录如下:1、systemctl start taosd 启动:生成的 core 在根目录下
2、手动启动,就在 taosd 执行目录下。 | +| udf | 是否启动 UDF 服务;0: 不启动,1:启动;默认值 为 0 | +| ttlChangeOnWrite | ttl 到期时间是否伴随表的修改操作改变; 0: 不改变,1:改变 ;默认值 为 | +| tmqMaxTopicNum | 订阅最多可建立的 topic 数量; 取值范围 1-10000;缺省值 为20 | +| maxTsmaNum | 集群内可创建的TSMA个数;取值范围:0-3;缺省值: 3 | + + +## taosd 监控指标 + +taosd 会将监控指标上报给 taosKeeper,这些监控指标会被 taosKeeper 写入监控数据库,默认是 `log` 库,可以在 taoskeeper 配置文件中修改。以下是这些监控指标的详细介绍。 + +### taosd\_cluster\_basic 表 + +`taosd_cluster_basic` 表记录集群基础信息。 + +| field | type | is\_tag | comment | +| :------------------- | :-------- | :------ | :------------------------------ | +| ts | TIMESTAMP | | timestamp | +| first\_ep | VARCHAR | | 集群 first ep | +| first\_ep\_dnode\_id | INT | | 集群 first ep 的 dnode id | +| cluster_version | VARCHAR | | tdengine version。例如:3.0.4.0 | +| cluster\_id | VARCHAR | TAG | cluster id | + +### taosd\_cluster\_info 表 + +`taosd_cluster_info` 表记录集群信息。 + +| field | type | is\_tag | comment | +| :----------------------- | :-------- | :------ | :----------------------------------------------- | +| \_ts | TIMESTAMP | | timestamp | +| cluster_uptime | DOUBLE | | 当前 master 节点的uptime。单位:秒 | +| dbs\_total | DOUBLE | | database 总数 | +| tbs\_total | DOUBLE | | 当前集群 table 总数 | +| stbs\_total | DOUBLE | | 当前集群 stable 总数 | +| dnodes\_total | DOUBLE | | 当前集群 dnode 总数 | +| dnodes\_alive | DOUBLE | | 当前集群 dnode 存活总数 | +| mnodes\_total | DOUBLE | | 当前集群 mnode 总数 | +| mnodes\_alive | DOUBLE | | 当前集群 mnode 存活总数 | +| vgroups\_total | DOUBLE | | 当前集群 vgroup 总数 | +| vgroups\_alive | DOUBLE | | 当前集群 vgroup 存活总数 | +| vnodes\_total | DOUBLE | | 当前集群 vnode 总数 | +| vnodes\_alive | DOUBLE | | 当前集群 vnode 存活总数 | +| connections\_total | DOUBLE | | 当前集群连接总数 | +| topics\_total | DOUBLE | | 当前集群 topic 总数 | +| streams\_total | DOUBLE | | 当前集群 stream 总数 | +| grants_expire\_time | DOUBLE | | 认证过期时间,企业版有效,社区版为 DOUBLE 最大值 | +| grants_timeseries\_used | DOUBLE | | 已用测点数 | +| grants_timeseries\_total | DOUBLE | | 总测点数,开源版本为 DOUBLE 最大值 | +| cluster\_id | VARCHAR | TAG | cluster id | + +### taosd\_vgroups\_info 表 + +`taosd_vgroups_info` 表记录虚拟节点组信息。 + +| field | type | is\_tag | comment | +| :------------- | :-------- | :------ | :--------------------------------------------- | +| \_ts | TIMESTAMP | | timestamp | +| tables\_num | DOUBLE | | vgroup 中 table 数量 | +| status | DOUBLE | | vgroup 状态, 取值范围:unsynced = 0, ready = 1 | +| vgroup\_id | VARCHAR | TAG | vgroup id | +| database\_name | VARCHAR | TAG | vgroup 所属的 database 名字 | +| cluster\_id | VARCHAR | TAG | cluster id | + +### taosd\_dnodes\_info 表 + +`taosd_dnodes_info` 记录 dnode 信息。 + +| field | type | is\_tag | comment | +| :---------------- | :-------- | :------ | :------------------------------------------------------------------------------------------------ | +| \_ts | TIMESTAMP | | timestamp | +| uptime | DOUBLE | | dnode uptime,单位:秒 | +| cpu\_engine | DOUBLE | | taosd cpu 使用率,从 `/proc//stat` 读取 | +| cpu\_system | DOUBLE | | 服务器 cpu 使用率,从 `/proc/stat` 读取 | +| cpu\_cores | DOUBLE | | 服务器 cpu 核数 | +| mem\_engine | DOUBLE | | taosd 内存使用率,从 `/proc//status` 读取 | +| mem\_free | DOUBLE | | 服务器可用内存,单位 KB | +| mem\_total | DOUBLE | | 服务器内存总量,单位 KB | +| disk\_used | DOUBLE | | data dir 挂载的磁盘使用量,单位 bytes | +| disk\_total | DOUBLE | | data dir 挂载的磁盘总容量,单位 bytes | +| system\_net\_in | DOUBLE | | 网络吞吐率,从 `/proc/net/dev` 中读取的 received bytes。单位 byte/s | +| system\_net\_out | DOUBLE | | 网络吞吐率,从 `/proc/net/dev` 中读取的 transmit bytes。单位 byte/s | +| io\_read | DOUBLE | | io 吞吐率,从 `/proc//io` 中读取的 rchar 与上次数值计算之后,计算得到速度。单位 byte/s | +| io\_write | DOUBLE | | io 吞吐率,从 `/proc//io` 中读取的 wchar 与上次数值计算之后,计算得到速度。单位 byte/s | +| io\_read\_disk | DOUBLE | | 磁盘 io 吞吐率,从 `/proc//io` 中读取的 read_bytes。单位 byte/s | +| io\_write\_disk | DOUBLE | | 磁盘 io 吞吐率,从 `/proc//io` 中读取的 write_bytes。单位 byte/s | +| vnodes\_num | DOUBLE | | dnode 上 vnodes 数量 | +| masters | DOUBLE | | dnode 上 master node 数量 | +| has\_mnode | DOUBLE | | dnode 是否包含 mnode,取值范围:包含=1,不包含=0 | +| has\_qnode | DOUBLE | | dnode 是否包含 qnode,取值范围:包含=1,不包含=0 | +| has\_snode | DOUBLE | | dnode 是否包含 snode,取值范围:包含=1,不包含=0 | +| has\_bnode | DOUBLE | | dnode 是否包含 bnode,取值范围:包含=1,不包含=0 | +| error\_log\_count | DOUBLE | | error 总数 | +| info\_log\_count | DOUBLE | | info 总数 | +| debug\_log\_count | DOUBLE | | debug 总数 | +| trace\_log\_count | DOUBLE | | trace 总数 | +| dnode\_id | VARCHAR | TAG | dnode id | +| dnode\_ep | VARCHAR | TAG | dnode endpoint | +| cluster\_id | VARCHAR | TAG | cluster id | + +### taosd\_dnodes\_status 表 + +`taosd_dnodes_status` 表记录 dnode 状态信息。 + +| field | type | is\_tag | comment | +| :---------- | :-------- | :------ | :--------------------------------------- | +| \_ts | TIMESTAMP | | timestamp | +| status | DOUBLE | | dnode 状态,取值范围:ready=1,offline =0 | +| dnode\_id | VARCHAR | TAG | dnode id | +| dnode\_ep | VARCHAR | TAG | dnode endpoint | +| cluster\_id | VARCHAR | TAG | cluster id | + +### taosd\_dnodes\_log\_dir 表 + +`taosd_dnodes_log_dir` 表记录 log 目录信息。 + +| field | type | is\_tag | comment | +| :---------- | :-------- | :------ | :---------------------------------- | +| \_ts | TIMESTAMP | | timestamp | +| avail | DOUBLE | | log 目录可用空间。单位 byte | +| used | DOUBLE | | log 目录已使用空间。单位 byte | +| total | DOUBLE | | log 目录空间。单位 byte | +| name | VARCHAR | TAG | log 目录名,一般为 `/var/log/taos/` | +| dnode\_id | VARCHAR | TAG | dnode id | +| dnode\_ep | VARCHAR | TAG | dnode endpoint | +| cluster\_id | VARCHAR | TAG | cluster id | + +### taosd\_dnodes\_data\_dir 表 + +`taosd_dnodes_data_dir` 表记录 data 目录信息。 + +| field | type | is\_tag | comment | +| :---------- | :-------- | :------ | :-------------------------------- | +| \_ts | TIMESTAMP | | timestamp | +| avail | DOUBLE | | data 目录可用空间。单位 byte | +| used | DOUBLE | | data 目录已使用空间。单位 byte | +| total | DOUBLE | | data 目录空间。单位 byte | +| level | VARCHAR | TAG | 0、1、2 多级存储级别 | +| name | VARCHAR | TAG | data 目录,一般为 `/var/lib/taos` | +| dnode\_id | VARCHAR | TAG | dnode id | +| dnode\_ep | VARCHAR | TAG | dnode endpoint | +| cluster\_id | VARCHAR | TAG | cluster id | + +### taosd\_mnodes\_info 表 + +`taosd_mnodes_info` 表记录 mnode 角色信息。 + +| field | type | is\_tag | comment | +| :---------- | :-------- | :------ | :------------------------------------------------------------------------------------------------------- | +| \_ts | TIMESTAMP | | timestamp | +| role | DOUBLE | | mnode 角色, 取值范围:offline = 0,follower = 100,candidate = 101,leader = 102,error = 103,learner = 104 | +| mnode\_id | VARCHAR | TAG | master node id | +| mnode\_ep | VARCHAR | TAG | master node endpoint | +| cluster\_id | VARCHAR | TAG | cluster id | + +### taosd\_vnodes\_role 表 + +`taosd_vnodes_role` 表记录虚拟节点角色信息。 + +| field | type | is\_tag | comment | +| :------------- | :-------- | :------ | :------------------------------------------------------------------------------------------------------ | +| \_ts | TIMESTAMP | | timestamp | +| vnode\_role | DOUBLE | | vnode 角色,取值范围:offline = 0,follower = 100,candidate = 101,leader = 102,error = 103,learner = 104 | +| vgroup\_id | VARCHAR | TAG | dnode id | +| dnode\_id | VARCHAR | TAG | dnode id | +| database\_name | VARCHAR | TAG | vgroup 所属的 database 名字 | +| cluster\_id | VARCHAR | TAG | cluster id | + +### taosd\_sql\_req 表 + +`taosd_sql_req` 记录服务端 sql 请求信息。 + +| field | type | is\_tag | comment | +| :---------- | :-------- | :------ | :--------------------------------------- | +| \_ts | TIMESTAMP | | timestamp | +| count | DOUBLE | | sql 数量 | +| result | VARCHAR | TAG | sql的执行结果,取值范围:Success, Failed | +| username | VARCHAR | TAG | 执行sql的user name | +| sql\_type | VARCHAR | TAG | sql类型,取值范围:inserted_rows | +| dnode\_id | VARCHAR | TAG | dnode id | +| dnode\_ep | VARCHAR | TAG | dnode endpoint | +| vgroup\_id | VARCHAR | TAG | dnode id | +| cluster\_id | VARCHAR | TAG | cluster id | + +### taos\_sql\_req 表 + +`taos_sql_req` 记录客户端 sql 请求信息。 + +| field | type | is\_tag | comment | +| :---------- | :-------- | :------ | :---------------------------------------- | +| \_ts | TIMESTAMP | | timestamp | +| count | DOUBLE | | sql 数量 | +| result | VARCHAR | TAG | sql的执行结果,取值范围:Success, Failed | +| username | VARCHAR | TAG | 执行sql的user name | +| sql\_type | VARCHAR | TAG | sql类型,取值范围:select, insert,delete | +| cluster\_id | VARCHAR | TAG | cluster id | + +### taos\_slow\_sql 表 + +`taos_slow_sql` 记录客户端慢查询信息。 + +| field | type | is\_tag | comment | +| :---------- | :-------- | :------ | :---------------------------------------------------- | +| \_ts | TIMESTAMP | | timestamp | +| count | DOUBLE | | sql 数量 | +| result | VARCHAR | TAG | sql的执行结果,取值范围:Success, Failed | +| username | VARCHAR | TAG | 执行sql的user name | +| duration | VARCHAR | TAG | sql执行耗时,取值范围:3-10s,10-100s,100-1000s,1000s- | +| cluster\_id | VARCHAR | TAG | cluster id | + diff --git a/docs/zh/14-reference/01-components/03-taosadapter.md b/docs/zh/14-reference/01-components/03-taosadapter.md index 06ba4a9a07..84facad093 100644 --- a/docs/zh/14-reference/01-components/03-taosadapter.md +++ b/docs/zh/14-reference/01-components/03-taosadapter.md @@ -289,31 +289,32 @@ http 返回内容: ## taosAdapter 监控指标 -taosAdapter 采集 http 相关指标、CPU 百分比和内存百分比。 +taosAdapter 采集 REST/Websocket 相关请求的监控指标。将监控指标上报给 taosKeeper,这些监控指标会被 taosKeeper 写入监控数据库,默认是 `log` 库,可以在 taoskeeper 配置文件中修改。以下是这些监控指标的详细介绍。 -### http 接口 +#### adapter\_requests 表 -提供符合 [OpenMetrics](https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md) 接口: +`adapter_requests` 记录 taosadapter 监控数据。 -```text -http://:6041/metrics -``` - -### 写入 TDengine - -taosAdapter 支持将 http 监控、CPU 百分比和内存百分比写入 TDengine。 - -有关配置参数 - -| **配置项** | **描述** | **默认值** | -|-------------------------|--------------------------------------------|----------| -| monitor.collectDuration | CPU 和内存采集间隔 | 3s | -| monitor.identity | 当前taosadapter 的标识符如果不设置将使用 'hostname:port' | | -| monitor.incgroup | 是否是 cgroup 中运行(容器中运行设置为 true) | false | -| monitor.writeToTD | 是否写入到 TDengine | false | -| monitor.user | TDengine 连接用户名 | root | -| monitor.password | TDengine 连接密码 | taosdata | -| monitor.writeInterval | 写入TDengine 间隔 | 30s | +| field | type | is\_tag | comment | +| :----------------- | :----------- | :------ | :---------------------------------- | +| ts | TIMESTAMP | | timestamp | +| total | INT UNSIGNED | | 总请求数 | +| query | INT UNSIGNED | | 查询请求数 | +| write | INT UNSIGNED | | 写入请求数 | +| other | INT UNSIGNED | | 其他请求数 | +| in\_process | INT UNSIGNED | | 正在处理请求数 | +| success | INT UNSIGNED | | 成功请求数 | +| fail | INT UNSIGNED | | 失败请求数 | +| query\_success | INT UNSIGNED | | 查询成功请求数 | +| query\_fail | INT UNSIGNED | | 查询失败请求数 | +| write\_success | INT UNSIGNED | | 写入成功请求数 | +| write\_fail | INT UNSIGNED | | 写入失败请求数 | +| other\_success | INT UNSIGNED | | 其他成功请求数 | +| other\_fail | INT UNSIGNED | | 其他失败请求数 | +| query\_in\_process | INT UNSIGNED | | 正在处理查询请求数 | +| write\_in\_process | INT UNSIGNED | | 正在处理写入请求数 | +| endpoint | VARCHAR | | 请求端点 | +| req\_type | NCHAR | TAG | 请求类型:0 为 REST,1 为 Websocket | ## 结果返回条数限制 @@ -342,11 +343,11 @@ taosAdapter 从 3.0.4.0 版本开始,提供参数 `smlAutoCreateDB` 来控制 在 TDengine server 2.2.x.x 或更早期版本中,taosd 进程包含一个内嵌的 http 服务。如前面所述,taosAdapter 是一个使用 systemd 管理的独立软件,拥有自己的进程。并且两者有一些配置参数和行为是不同的,请见下表: -| **#** | **embedded httpd** | **taosAdapter** | **comment** | -|-------|---------------------|-------------------------------|------------------------------------------------------------------------------------------------| -| 1 | httpEnableRecordSql | --logLevel=debug | | -| 2 | httpMaxThreads | n/a | taosAdapter 自动管理线程池,无需此参数 | +| **#** | **embedded httpd** | **taosAdapter** | **comment** | +| ----- | ------------------- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------ | +| 1 | httpEnableRecordSql | --logLevel=debug | | +| 2 | httpMaxThreads | n/a | taosAdapter 自动管理线程池,无需此参数 | | 3 | telegrafUseFieldNum | 请参考 taosAdapter telegraf 配置方法 | -| 4 | restfulRowLimit | restfulRowLimit | 内嵌 httpd 默认输出 10240 行数据,最大允许值为 102400。taosAdapter 也提供 restfulRowLimit 但是默认不做限制。您可以根据实际场景需求进行配置 | -| 5 | httpDebugFlag | 不适用 | httpdDebugFlag 对 taosAdapter 不起作用 | -| 6 | httpDBNameMandatory | 不适用 | taosAdapter 要求 URL 中必须指定数据库名 | +| 4 | restfulRowLimit | restfulRowLimit | 内嵌 httpd 默认输出 10240 行数据,最大允许值为 102400。taosAdapter 也提供 restfulRowLimit 但是默认不做限制。您可以根据实际场景需求进行配置 | +| 5 | httpDebugFlag | 不适用 | httpdDebugFlag 对 taosAdapter 不起作用 | +| 6 | httpDBNameMandatory | 不适用 | taosAdapter 要求 URL 中必须指定数据库名 | diff --git a/docs/zh/14-reference/01-components/04-taosx.md b/docs/zh/14-reference/01-components/04-taosx.md index 032bd58a37..7426369f62 100644 --- a/docs/zh/14-reference/01-components/04-taosx.md +++ b/docs/zh/14-reference/01-components/04-taosx.md @@ -90,11 +90,11 @@ taosx privileges -i ./user-pass-privileges-backup.json -t "taos:///" 可用参数列表: -| 参数 | 说明 | -| ---- | ---- | -| -u | 包含用户基本信息(密码、是否启用等) | -| -p | 包含权限信息 | -| -w | 包含白名单信息 | +| 参数 | 说明 | +| ---- | ------------------------------------ | +| -u | 包含用户基本信息(密码、是否启用等) | +| -p | 包含权限信息 | +| -w | 包含白名单信息 | 当 `-u`/`-p` 参数应用时,将仅包含指定的信息,不带参数时,表示所有信息(用户名、密码、权限和白名单)。 @@ -324,4 +324,131 @@ Linux 下 `journalctl` 查看日志的命令如下: ```bash journalctl -u taosx [-f] -``` \ No newline at end of file +``` + +## taosX 监控指标 + +taosX 会将监控指标上报给 taosKeeper,这些监控指标会被 taosKeeper 写入监控数据库,默认是 `log` 库,可以在 taoskeeper 配置文件中修改。以下是这些监控指标的详细介绍。 + +### taosX 服务监控指标 + +| 字段 | 描述 | +| -------------------------- | ----------------------------------------------------------------------------- | +| sys_cpu_cores | 系统 CPU 核数 | +| sys_total_memory | 系统总内存,单位:字节 | +| sys_used_memory | 系统已用内存, 单位:字节 | +| sys_available_memory | 系统可用内存, 单位:字节 | +| process_uptime | taosX 运行时长,单位:秒 | +| process_id | taosX 进程 ID | +| running_tasks | taosX 当前执行任务数 | +| completed_tasks | taosX 进程在一个监控周期(比如10s)内完成的任务数 | +| failed_tasks | taosX 进程在一个监控周期(比如10s)内失败的任务数 | +| process_cpu_percent | taosX 进程占用 CPU 百分比, 单位 % | +| process_memory_percent | taosX 进程占用内存百分比, 单位 % | +| process_disk_read_bytes | taosX 进程在一个监控周期(比如10s)内从硬盘读取的字节数的平均值,单位 bytes/s | +| process_disk_written_bytes | taosX 进程在一个监控周期(比如10s)内写到硬盘的字节数的平均值,单位 bytres/s | + + +### Agent 监控指标 + +| 字段 | 描述 | +| -------------------------- | ----------------------------------------------------------------------------- | +| sys_cpu_cores | 系统 CPU 核数 | +| sys_total_memory | 系统总内存,单位:字节 | +| sys_used_memory | 系统已用内存, 单位:字节 | +| sys_available_memory | 系统可用内存, 单位:字节 | +| process_uptime | agent 运行时长,单位:秒 | +| process_id | agent 进程 id | +| process_cpu_percent | agent 进程占用 CPU 百分比 | +| process_memory_percent | agent 进程占用内存百分比 | +| process_uptime | 进程启动时间,单位秒 | +| process_disk_read_bytes | agent 进程在一个监控周期(比如10s)内从硬盘读取的字节数的平均值,单位 bytes/s | +| process_disk_written_bytes | agent 进程在一个监控周期(比如10s)内写到硬盘的字节数的平均值,单位 bytes/s | + +### Connector 监控指标 + +| 字段 | 描述 | +| -------------------------- | --------------------------------------------------------------------------------- | +| process_id | connector 进程 id | +| process_uptime | 进程启动时间,单位秒 | +| process_cpu_percent | 进程占用 CPU 百分比, 单位 % | +| process_memory_percent | 进程占用内存百分比, 单位 % | +| process_disk_read_bytes | connector 进程在一个监控周期(比如10s)内从硬盘读取的字节数的平均值,单位 bytes/s | +| process_disk_written_bytes | connector 进程在一个监控周期(比如10s)内写到硬盘的字节数的平均值,单位 bytes/s | + +### taosX 通用数据源任务监控指标 + +| 字段 | 描述 | +| -------------------- | --------------------------------------------------------------- | +| total_execute_time | 任务累计运行时间,单位毫秒 | +| total_written_rowsls | 成功写入 TDengine 的总行数(包括重复记录) | +| total_written_points | 累计写入成功点数 (等于数据块包含的行数乘以数据块包含的列数) | +| start_time | 任务启动时间 (每次重启任务会被重置) | +| written_rows | 本次运行此任务成功写入 TDengine 的总行数(包括重复记录) | +| written_points | 本次运行写入成功点数 (等于数据块包含的行数乘以数据块包含的列数) | +| execute_time | 任务本次运行时间,单位秒 | + +### taosX TDengine V2 任务监控指标 + +| 字段 | 描述 | +| --------------------- | -------------------------------------------------------------------- | +| read_concurrency | 并发读取数据源的数据 worker 数, 也等于并发写入 TDengine 的 worker 数 | +| total_stables | 需要迁移的超级表数据数量 | +| total_updated_tags | 累计更新 tag 数 | +| total_created_tables | 累计创建子表数 | +| total_tables | 需要迁移的子表数量 | +| total_finished_tables | 完成数据迁移的子表数 (任务中断重启可能大于实际值) | +| total_success_blocks | 累计写入成功的数据块数 | +| finished_tables | 本次运行完成迁移子表数 | +| success_blocks | 本次写入成功的数据块数 | +| created_tables | 本次运行创建子表数 | +| updated_tags | 本次运行更新 tag 数 | + +### taosX TDengine V3 任务监控指标 + +| 字段 | 描述 | +| ---------------------- | ------------------------------------------------------- | +| total_messages | 通过 TMQ 累计收到的消息总数 | +| total_messages_of_meta | 通过 TMQ 累计收到的 Meta 类型的消息总数 | +| total_messages_of_data | 通过 TMQ 累计收到的 Data 和 MetaData 类型的消息总数 | +| total_write_raw_fails | 累计写入 raw meta 失败的次数 | +| total_success_blocks | 累计写入成功的数据块数 | +| topics | 通过 TMQ 订阅的主题数 | +| consumers | TMQ 消费者数 | +| messages | 本次运行通过 TMQ 收到的消息总数 | +| messages_of_meta | 本次运行通过 TMQ 收到的 Meta 类型的消息总数 | +| messages_of_data | 本次运行通过 TMQ 收到的 Data 和 MetaData 类型的消息总数 | +| write_raw_fails | 本次运行写入 raw meta 失败的次数 | +| success_blocks | 本次写入成功的数据块数 | + + +### taosX 其他数据源 任务监控指标 + +这些数据源包括: InfluxDB,OpenTSDB,OPC UA,OPC DA,PI,CSV,MQTT,AVEVA Historian 和 Kafka。 + +| 字段 | 描述 | +| ----------------------- | ----------------------------------------------------------- | +| total_received_batches | 通过 IPC Stream 收到的数据总批数 | +| total_processed_batches | 已经处理的批数 | +| total_processed_rows | 已经处理的总行数(等于每批包含数据行数之和) | +| total_inserted_sqls | 执行的 INSERT SQL 总条数 | +| total_failed_sqls | 执行失败的 INSERT SQL 总条数 | +| total_created_stables | 创建的超级表总数(可能大于实际值) | +| total_created_tables | 尝试创建子表总数(可能大于实际值) | +| total_failed_rows | 写入失败的总行数 | +| total_failed_point | 写入失败的总点数 | +| total_written_blocks | 写入成功的 raw block 总数 | +| total_failed_blocks | 写入失败的 raw block 总数 | +| received_batches | 本次运行此任务通过 IPC Stream 收到的数据总批数 | +| processed_batches | 本次运行已处理批数 | +| processed_rows | 本次处理的总行数(等于包含数据的 batch 包含的数据行数之和) | +| received_records | 本次运行此任务通过 IPC Stream 收到的数据总行数 | +| inserted_sqls | 本次运行此任务执行的 INSERT SQL 总条数 | +| failed_sqls | 本次运行此任务执行失败的 INSERT SQL 总条数 | +| created_stables | 本次运行此任务尝试创建超级表数(可能大于实际值) | +| created_tables | 本次运行此任务尝试创建子表数(可能大于实际值) | +| failed_rows | 本次运行此任务写入失败的行数 | +| failed_points | 本次运行此任务写入失败的点数 | +| written_blocks | 本次运行此任务写人成功的 raw block 数 | +| failed_blocks | 本次运行此任务写入失败的 raw block 数 | + diff --git a/docs/zh/14-reference/01-components/06-taoskeeper.md b/docs/zh/14-reference/01-components/06-taoskeeper.md index a1297230c4..2877728077 100644 --- a/docs/zh/14-reference/01-components/06-taoskeeper.md +++ b/docs/zh/14-reference/01-components/06-taoskeeper.md @@ -317,3 +317,19 @@ scrape_configs: 在 Grafana Dashboard 菜单点击 `import`,dashboard ID 填写 `18587`,点击 `Load` 按钮即可导入 `TaosKeeper Prometheus Dashboard for 3.x` dashboard。 + + +## taosKeeper 监控指标 + +taosKeeper 也会将自己采集的监控数据写入监控数据库,默认是 `log` 库,可以在 taoskeeper 配置文件中修改。 + +### keeper\_monitor 表 + +`keeper_monitor` 记录 taoskeeper 监控数据。 + +| field | type | is\_tag | comment | +| :------- | :-------- | :------ | :----------- | +| ts | TIMESTAMP | | timestamp | +| cpu | DOUBLE | | cpu 使用率 | +| mem | DOUBLE | | 内存使用率 | +| identify | NCHAR | TAG | 身份标识信息 | From 889f2677ff20cf328063e6a5596a5f39793b3735 Mon Sep 17 00:00:00 2001 From: gccgdb1234 Date: Thu, 8 Aug 2024 16:23:19 +0800 Subject: [PATCH 42/45] doc: change sidebar_label and title for data in --- docs/zh/06-advanced/05-data-in/index.md | 550 ++++++++++++------------ 1 file changed, 275 insertions(+), 275 deletions(-) diff --git a/docs/zh/06-advanced/05-data-in/index.md b/docs/zh/06-advanced/05-data-in/index.md index 99dfbf098b..32d530acb5 100644 --- a/docs/zh/06-advanced/05-data-in/index.md +++ b/docs/zh/06-advanced/05-data-in/index.md @@ -1,276 +1,276 @@ ---- -sidebar_label: 数据写入 -title: 零代码数据源接入 -toc_max_heading_level: 4 ---- - -## 概述 - -TDengine Enterprise 配备了一个强大的可视化数据管理工具—taosExplorer。借助 taosExplorer,用户只须在浏览器中简单配置,就能轻松地向 TDengine 提交任务,实现以零代码方式将来自不同数据源的数据无缝导入 TDengine。在导入过程中,TDengine 会对数据进行自动提取、过滤和转换,以保证导入的数据质量。通过这种零代码数据源接入方式,TDengine 成功转型为一个卓越的时序大数据汇聚平台。用户无须部署额外的 ETL 工具,从而大大简化整体架构的设计,提高了数据处理效率。 - -下图展示了零代码接入平台的系统架构。 - -![零代码数据接入架构图](./data-in.png) - -## 支持的数据源 - -目前 TDengine 支持的数据源如下: - -1. Aveva PI System:一个工业数据管理和分析平台,前身为 OSIsoft PI System,它能够实时采集、整合、分析和可视化工业数据,助力企业实现智能化决策和精细化管理 -2. Aveva Historian:一个工业大数据分析软件,前身为 Wonderware Historian,专为工业环境设计,用于存储、管理和分析来自各种工业设备、传感器的实时和历史数据。 -3. OPC DA/UA:OPC 是 Open Platform Communications 的缩写,是一种开放式、标准化的通信协议,用于不同厂商的自动化设备之间进行数据交换。它最初由微软公司开发,旨在解决工业控制领域中不同设备之间互操作性差的问题。OPC 协议最初于 1996 年发布,当时称为 OPC DA (Data Access),主要用于实时数据采集和控制;2006 年,OPC 基金会发布了 OPC UA (Unified Architecture) 标准,它是一种基于服务的面向对象的协议,具有更高的灵活性和可扩展性,已成为 OPC 协议的主流版本。 -4. MQTT:Message Queuing Telemetry Transport 的缩写,一种基于发布/订阅模式的轻量级通讯协议,专为低开销、低带宽占用的即时通讯设计,广泛适用于物联网、小型设备、移动应用等领域。 -5. Kafka:由 Apache 软件基金会开发的一个开源流处理平台,主要用于处理实时数据,并提供一个统一、高通量、低延迟的消息系统。它具备高速度、可伸缩性、持久性和分布式设计等特点,使得它能够在每秒处理数十万次的读写操作,支持上千个客户端,同时保持数据的可靠性和可用性。 -6. OpenTSDB:基于 HBase 的分布式、可伸缩的时序数据库。它主要用于存储、索引和提供从大规模集群(包括网络设备、操作系统、应用程序等)中收集的指标数据,使这些数据更易于访问和图形化展示。 -7. CSV:Comma Separated Values 的缩写,是一种以逗号分隔的纯文本文件格式,通常用于电子表格或数据库软件。 -8. TDengine 2:泛指运行 TDengine 2.x 版本的 TDengine 实例。 -9. TDengine 3:泛指运行 TDengine 3.x 版本的 TDengine 实例。 -10. MySQL, PostgreSQL, Oracle 等关系型数据库。 - -## 数据提取、过滤和转换 - -因为数据源可以有多个,每个数据源的物理单位可能不一样,命名规则也不一样,时区也可能不同。为解决这个问题,TDengine 内置 ETL 功能,可以从数据源的数据包中解析、提取需要的数据,并进行过滤和转换,以保证写入数据的质量,提供统一的命名空间。具体的功能如下: - -1. 解析:使用 JSON Path 或正则表达式,从原始消息中解析字段 -2. 从列中提取或拆分:使用 split 或正则表达式,从一个原始字段中提取多个字段 -3. 过滤:只有表达式的值为 true 时,消息才会被写入 TDengine -4. 转换:建立解析后的字段和 TDengine 超级表字段之间的转换与映射关系。 - -下面详细讲解数据转换规则 - - -### 解析 - -仅非结构化的数据源需要这个步骤,目前 MQTT 和 Kafka 数据源会使用这个步骤提供的规则来解析非结构化数据,以初步获取结构化数据,即可以以字段描述的行列数据。在 explorer 中您需要提供示例数据和解析规则,来预览解析出以表格呈现的结构化数据。 - -#### 示例数据 - -![示例数据](./pic/transform-01.png) - -如图,textarea 输入框中就是示例数据,可以通过三种方式来获取示例数据: - -1. 直接在 textarea 中输入示例数据; -2. 点击右侧按钮 “从服务器检索” 则从配置的服务器获取示例数据,并追加到示例数据 textarea 中; -3. 上传文件,将文件内容追加到示例数据 textarea 中。 - -#### 解析
- -解析就是通过解析规则,将非结构化字符串解析为结构化数据。消息体的解析规则目前支持 JSON、Regex 和 UDT。 - -##### JSON 解析 - -如下 JSON 示例数据,可自动解析出字段:`groupid`、`voltage`、`current`、`ts`、`inuse`、`location`。 - -``` json -{"groupid": 170001, "voltage": "221V", "current": 12.3, "ts": "2023-12-18T22:12:00", "inuse": true, "location": "beijing.chaoyang.datun"} -{"groupid": 170001, "voltage": "220V", "current": 12.2, "ts": "2023-12-18T22:12:02", "inuse": true, "location": "beijing.chaoyang.datun"} -{"groupid": 170001, "voltage": "216V", "current": 12.5, "ts": "2023-12-18T22:12:04", "inuse": false, "location": "beijing.chaoyang.datun"} -``` - -如下嵌套结构的 JSON 数据,可自动解析出字段`groupid`、`data_voltage`、`data_current`、`ts`、`inuse`、`location_0_province`、`location_0_city`、`location_0_datun`,也可以选择要解析的字段,并设置解析的别名。 - -``` json -{"groupid": 170001, "data": { "voltage": "221V", "current": 12.3 }, "ts": "2023-12-18T22:12:00", "inuse": true, "location": [{"province": "beijing", "city":"chaoyang", "street": "datun"}]} -``` - -![JSON 解析](./pic/transform-02.png) - -##### Regex 正则表达式 - -可以使用正则表达式的**命名捕获组**从任何字符串(文本)字段中提取多个字段。如图所示,从 nginx 日志中提取访问ip、时间戳、访问的url等字段。 - -``` re -(?\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b)\s-\s-\s\[(?\d{2}/\w{3}/\d{4}:\d{2}:\d{2}:\d{2}\s\+\d{4})\]\s"(?[A-Z]+)\s(?[^\s"]+).*(?\d{3})\s(?\d+) -``` - -![Regex 解析](./pic/transform-03.png) - -##### UDT 自定义解析脚本 - -自定义 rhai 语法脚本解析输入数据(参考 `https://rhai.rs/book/` ),脚本目前仅支持 json 格式原始数据。 - -**输入**:脚本中可以使用参数 data, data 是原始数据 json 解析后的 Object Map; - -**输出**:输出的数据必须是数组。 - -例如对于数据,一次上报三相电压值,分别入到三个子表中。则需要对这类数据做解析 - -``` json -{ - "ts": "2024-06-27 18:00:00", - "voltage": "220.1,220.3,221.1", - "dev_id": "8208891" -} -``` - -那么可以使用如下脚本来提取三个电压数据。 - -``` -let v3 = data["voltage"].split(","); - -[ -#{"ts": data["ts"], "val": v3[0], "dev_id": data["dev_id"]}, -#{"ts": data["ts"], "val": v3[1], "dev_id": data["dev_id"]}, -#{"ts": data["ts"], "val": v3[2], "dev_id": data["dev_id"]} -] -``` - -最终解析结果如下所示: - -![UDT](./pic/transform-udf.png) - -### 提取或拆分 - -解析后的数据,可能还无法满足目标表的数据要求。比如智能表原始采集数据如下( json 格式): - -``` json -{"groupid": 170001, "voltage": "221V", "current": 12.3, "ts": "2023-12-18T22:12:00", "inuse": true, "location": "beijing.chaoyang.datun"} -{"groupid": 170001, "voltage": "220V", "current": 12.2, "ts": "2023-12-18T22:12:02", "inuse": true, "location": "beijing.chaoyang.datun"} -{"groupid": 170001, "voltage": "216V", "current": 12.5, "ts": "2023-12-18T22:12:04", "inuse": false, "location": "beijing.chaoyang.datun"} -``` - -使用 json 规则解析出的电压是字符串表达的带单位形式,最终入库希望能使用 int 类型记录电压值和电流值,便于统计分析,此时就需要对电压进一步拆分;另外日期期望拆分为日期和时间入库。 - -如下图所示可以对源字段`ts`使用 split 规则拆分成日期和时间,对字段`voltage`使用 regex 提取出电压值和电压单位。split 规则需要设置**分隔符**和**拆分数量**,拆分后的字段命名规则为`{原字段名}_{顺序号}`,Regex 规则同解析过程中的一样,使用**命名捕获组**命名提取字段。 - -![拆分和提取](./pic/transform-04.png) - -### 过滤 - -过滤功能可以设置过滤条件,满足条件的数据行 才会被写入目标表。过滤条件表达式的结果必须是 boolean 类型。在编写过滤条件前,必须确定 解析字段的类型,根据解析字段的类型,可以使用判断函数、比较操作符(`>`、`>=`、`<=`、`<`、`==`、`!=`)来判断。 - -#### 字段类型及转换 - -只有明确解析出的每个字段的类型,才能使用正确的语法做数据过滤。 - -使用 json 规则解析出的字段,按照属性值来自动设置类型: - -1. bool 类型:"inuse": true -2. int 类型:"voltage": 220 -3. float 类型:"current" : 12.2 -4. String 类型:"location": "MX001" - -使用 regex 规则解析的数据都是 string 类型。 -使用 split 和 regex 提取或拆分的数据是 string 类型。 - -如果提取出的数据类型不是预期中的类型,可以做数据类型转换。常用的数据类型转换就是把字符串转换成为数值类型。支持的转换函数如下: - -|Function|From type|To type|e.g.| -|:----|:----|:----|:----| -| parse_int | string | int | parse_int("56") // 结果为整数 56 | -| parse_float | string | float | parse_float("12.3") // 结果为浮点数 12.3 | - -#### 判断表达式 - -不同的数据类型有各自判断表达式的写法。 - -##### BOOL 类型 - -可以使用变量或者使用操作符`!`,比如对于字段 "inuse": true,可以编写以下表达式: - -> 1. inuse -> 2. !inuse - -##### 数值类型(int/float) - -数值类型支持使用比较操作符`==`、`!=`、`>`、`>=`、`<`、`<=`。 - -##### 字符串类型 - -使用比较操作符,比较字符串。 - -字符串函数 - -|Function|Description|e.g.| -|:----|:----|:----| -| is_empty | returns true if the string is empty | s.is_empty() | -| contains | checks if a certain character or sub-string occurs in the string | s.contains("substring") | -| starts_with | returns true if the string starts with a certain string | s.starts_with("prefix") | -| ends_with | returns true if the string ends with a certain string | s.ends_with("suffix") | -| len | returns the number of characters (not number of bytes) in the string,must be used with comparison operator | s.len == 5 判断字符串长度是否为5;len作为属性返回 int ,和前四个函数有区别,前四个直接返回 bool。 | - -##### 复合表达式 - -多个判断表达式,可以使用逻辑操作符(&&、||、!)来组合。 -比如下面的表达式表示获取北京市安装的并且电压值大于 200 的智能表数据。 - -> location.starts_with("beijing") && voltage > 200 - -### 映射 - -映射是将解析、提取、拆分的**源字段**对应到**目标表字段**,可以直接对应,也可以通过一些规则计算后再映射到目标表。 - -#### 选择目标超级表 - -选择目标超级表后,会加载出超级表所有的 tags 和 columns。 -源字段根据名称自动使用 mapping 规则映射到目标超级表的 tag 和 column。 -例如有如下解析、提取、拆分后的预览数据: - -#### 映射规则 - -支持的映射规则如下表所示: - -|rule|description| -|:----|:----| -| mapping | 直接映射,需要选择映射源字段。| -| value | 常量,可以输入字符串常量,也可以是数值常量,输入的常量值直接入库。| -| generator | 生成器,目前仅支持时间戳生成器 now,入库时会将当前时间入库。| -| join | 字符串连接器,可指定连接字符拼接选择的多个源字段。| -| format | **字符串格式化工具**,填写格式化字符串,比如有三个源字段 year, month, day 分别表示年月日,入库希望以yyyy-MM-dd的日期格式入库,则可以提供格式化字符串为 `${year}-${month}-${day}`。其中`${}`作为占位符,占位符中可以是一个源字段,也可以是 string 类型字段的函数处理| -| sum | 选择多个数值型字段做加法计算。| -| expr | **数值运算表达式**,可以对数值型字段做更加复杂的函数处理和数学运算。| - -##### format 中支持的字符串处理函数 - -|Function|description|e.g.| -|:----|:----|:----| -| pad(len, pad_chars) | pads the string with a character or a string to at least a specified length | "1.2".pad(5, '0') // 结果为"1.200" | -|trim|trims the string of whitespace at the beginning and end|" abc ee ".trim() // 结果为"abc ee"| -|sub_string(start_pos, len)|extracts a sub-string,两个参数:
1. start position, counting from end if < 0
2. (optional) number of characters to extract, none if ≤ 0, to end if omitted|"012345678".sub_string(5) // "5678"
"012345678".sub_string(5, 2) // "56"
"012345678".sub_string(-2) // "78"| -|replace(substring, replacement)|replaces a sub-string with another|"012345678".replace("012", "abc") // "abc345678"| - -##### expr 数学计算表达式 - -基本数学运算支持加`+`、减`-`、乘`*`、除`/`。 - -比如数据源采集数值以设置度为单位,目标库存储华氏度温度值。那么就需要对采集的温度数据做转换。 - -解析的源字段为`temperature`,则需要使用表达式 `temperature * 1.8 + 32`。 - -数值表达式中也支持使用数学函数,可用的数学函数如下表所示: - -|Function|description|e.g.| -|:----|:----|:----| -|sin、cos、tan、sinh、cosh|Trigonometry|a.sin() | -|asin、acos、atan、 asinh、acosh|arc-trigonometry|a.asin()| -|sqrt|Square root|a.sqrt() // 4.sqrt() == 2| -|exp|Exponential|a.exp()| -|ln、log|Logarithmic|a.ln() // e.ln() == 1
a.log() // 10.log() == 1| -|floor、ceiling、round、int、fraction|rounding|a.floor() // (4.2).floor() == 4
a.ceiling() // (4.2).ceiling() == 5
a.round() // (4.2).round() == 4
a.int() // (4.2).int() == 4
a.fraction() // (4.2).fraction() == 0.2| - -#### 子表名映射 - -子表名类型为字符串,可以使用映射规则中的字符串格式化 format 表达式定义子表名。 - -## 任务的创建 - -下面以 MQTT 数据源为例,介绍如何创建一个 MQTT 类型的任务,从 MQTT Broker 消费数据,并写入 TDengine。 - -1. 登录至 taosExplorer 以后,点击左侧导航栏上的“数据写入”,即可进入任务列表页面 -2. 在任务列表页面,点击“+ 新增数据源”,即可进入任务创建页面 -3. 输入任务名称后,选择类型为 MQTT, 然后可以创建一个新的代理,或者选择已创建的代理 -4. 输入 MQTT broker 的 IP 地址和端口号,例如:192.168.1.100:1883 -5. 配置认证和 SSL 加密: - - 如果 MQTT broker 开启了用户认证,则在认证部分,输入 MQTT broker 的用户名和密码; - - 如果 MQTT broker 开启了 SSL 加密,则可以打开页面上的 SSL 证书开关,并上传 CA 的证书,以及客户端的证书和私钥文件; -6. 在“采集配置“部分,可选择 MQTT 协议的版本,目前支持 3.1, 3.1.1, 5.0 三个版本;配置 Client ID 时要注意,如果对同一个 MQTT broker 创建了多个任务,Client ID 应不同,否则会造成 Client ID 冲突,导致任务无法正常运行;在对主题和 QoS 进行配置时,需要使用 `::` 的形式,即订阅的主题与 QoS 之间要使用两个冒号分隔,其中 QoS 的取值范围为 0, 1, 2, 分别代表 at most once, at lease once, exactly once;配置完成以上信息后,可以点击“检查连通性”按钮,对以上配置进行检查,如果连通性检查失败,请按照页面上返回的具体错误提示进行修改; -7. 在从 MQTT broker 同步数据的过程中,taosX 还支持对消息体中的字段进行提取,过滤、映射等操作。在位于 “Payload 转换”下方的文本框中,可以直接输入输入消息体样例,或是以上传文件的方式导入,以后还会支持直接从所配置的服务器中检索样例消息; -8. 对消息体字段的提取,目前支持 2 种方式:JSON 和正则表达式。对于简单的 key/value 格式的 JSON 数据,可以直接点击提取按钮,即可展示解析出的字段名;对于复杂的 JSON 数据,可以使用 JSON Path 提取感兴趣的字段;当使用正则表达式提取字段时,要保证正则表达式的正确性; -9. 消息体中的字段被解析后,可以基于解析出的字段名设置过滤规则,只有满足过滤规则的数据,才会写入 TDengine,否则会忽略该消息;例如:可以配置过滤规则为 voltage > 200,即只有当电压大于 200V 的数据才会被同步至 TDengine; -10. 最后,在配置完消息体中的字段和超级表中的字段的映射规则后,就可以提交任务了;除了基本的映射以外,在这里还可以对消息中字段的值进行转换,例如:可以通过表达式 (expr) 将原消息体中的电压和电流,计算为功率后再写入 TDengine; -11. 任务提交后,会自动返回任务列表页面,如果提交成功,任务的状态会切换至“运行中”,如果提交失败,可通过查看该任务的活动日志,查找错误原因; -12. 对于运行中的任务,点击指标的查看按钮,可以查看该任务的详细运行指标,弹出窗口划分为 2 个标签页,分别展示该任务多次运行的累计指标和本次运行的指标,这些指标每 2 秒钟会自动刷新一次。 - -## 任务管理 - +--- +sidebar_label: 数据接入 +title: 零代码第三方数据接入 +toc_max_heading_level: 4 +--- + +## 概述 + +TDengine Enterprise 配备了一个强大的可视化数据管理工具—taosExplorer。借助 taosExplorer,用户只须在浏览器中简单配置,就能轻松地向 TDengine 提交任务,实现以零代码方式将来自不同数据源的数据无缝导入 TDengine。在导入过程中,TDengine 会对数据进行自动提取、过滤和转换,以保证导入的数据质量。通过这种零代码数据源接入方式,TDengine 成功转型为一个卓越的时序大数据汇聚平台。用户无须部署额外的 ETL 工具,从而大大简化整体架构的设计,提高了数据处理效率。 + +下图展示了零代码接入平台的系统架构。 + +![零代码数据接入架构图](./data-in.png) + +## 支持的数据源 + +目前 TDengine 支持的数据源如下: + +1. Aveva PI System:一个工业数据管理和分析平台,前身为 OSIsoft PI System,它能够实时采集、整合、分析和可视化工业数据,助力企业实现智能化决策和精细化管理 +2. Aveva Historian:一个工业大数据分析软件,前身为 Wonderware Historian,专为工业环境设计,用于存储、管理和分析来自各种工业设备、传感器的实时和历史数据。 +3. OPC DA/UA:OPC 是 Open Platform Communications 的缩写,是一种开放式、标准化的通信协议,用于不同厂商的自动化设备之间进行数据交换。它最初由微软公司开发,旨在解决工业控制领域中不同设备之间互操作性差的问题。OPC 协议最初于 1996 年发布,当时称为 OPC DA (Data Access),主要用于实时数据采集和控制;2006 年,OPC 基金会发布了 OPC UA (Unified Architecture) 标准,它是一种基于服务的面向对象的协议,具有更高的灵活性和可扩展性,已成为 OPC 协议的主流版本。 +4. MQTT:Message Queuing Telemetry Transport 的缩写,一种基于发布/订阅模式的轻量级通讯协议,专为低开销、低带宽占用的即时通讯设计,广泛适用于物联网、小型设备、移动应用等领域。 +5. Kafka:由 Apache 软件基金会开发的一个开源流处理平台,主要用于处理实时数据,并提供一个统一、高通量、低延迟的消息系统。它具备高速度、可伸缩性、持久性和分布式设计等特点,使得它能够在每秒处理数十万次的读写操作,支持上千个客户端,同时保持数据的可靠性和可用性。 +6. OpenTSDB:基于 HBase 的分布式、可伸缩的时序数据库。它主要用于存储、索引和提供从大规模集群(包括网络设备、操作系统、应用程序等)中收集的指标数据,使这些数据更易于访问和图形化展示。 +7. CSV:Comma Separated Values 的缩写,是一种以逗号分隔的纯文本文件格式,通常用于电子表格或数据库软件。 +8. TDengine 2:泛指运行 TDengine 2.x 版本的 TDengine 实例。 +9. TDengine 3:泛指运行 TDengine 3.x 版本的 TDengine 实例。 +10. MySQL, PostgreSQL, Oracle 等关系型数据库。 + +## 数据提取、过滤和转换 + +因为数据源可以有多个,每个数据源的物理单位可能不一样,命名规则也不一样,时区也可能不同。为解决这个问题,TDengine 内置 ETL 功能,可以从数据源的数据包中解析、提取需要的数据,并进行过滤和转换,以保证写入数据的质量,提供统一的命名空间。具体的功能如下: + +1. 解析:使用 JSON Path 或正则表达式,从原始消息中解析字段 +2. 从列中提取或拆分:使用 split 或正则表达式,从一个原始字段中提取多个字段 +3. 过滤:只有表达式的值为 true 时,消息才会被写入 TDengine +4. 转换:建立解析后的字段和 TDengine 超级表字段之间的转换与映射关系。 + +下面详细讲解数据转换规则 + + +### 解析 + +仅非结构化的数据源需要这个步骤,目前 MQTT 和 Kafka 数据源会使用这个步骤提供的规则来解析非结构化数据,以初步获取结构化数据,即可以以字段描述的行列数据。在 explorer 中您需要提供示例数据和解析规则,来预览解析出以表格呈现的结构化数据。 + +#### 示例数据 + +![示例数据](./pic/transform-01.png) + +如图,textarea 输入框中就是示例数据,可以通过三种方式来获取示例数据: + +1. 直接在 textarea 中输入示例数据; +2. 点击右侧按钮 “从服务器检索” 则从配置的服务器获取示例数据,并追加到示例数据 textarea 中; +3. 上传文件,将文件内容追加到示例数据 textarea 中。 + +#### 解析 + +解析就是通过解析规则,将非结构化字符串解析为结构化数据。消息体的解析规则目前支持 JSON、Regex 和 UDT。 + +##### JSON 解析 + +如下 JSON 示例数据,可自动解析出字段:`groupid`、`voltage`、`current`、`ts`、`inuse`、`location`。 + +``` json +{"groupid": 170001, "voltage": "221V", "current": 12.3, "ts": "2023-12-18T22:12:00", "inuse": true, "location": "beijing.chaoyang.datun"} +{"groupid": 170001, "voltage": "220V", "current": 12.2, "ts": "2023-12-18T22:12:02", "inuse": true, "location": "beijing.chaoyang.datun"} +{"groupid": 170001, "voltage": "216V", "current": 12.5, "ts": "2023-12-18T22:12:04", "inuse": false, "location": "beijing.chaoyang.datun"} +``` + +如下嵌套结构的 JSON 数据,可自动解析出字段`groupid`、`data_voltage`、`data_current`、`ts`、`inuse`、`location_0_province`、`location_0_city`、`location_0_datun`,也可以选择要解析的字段,并设置解析的别名。 + +``` json +{"groupid": 170001, "data": { "voltage": "221V", "current": 12.3 }, "ts": "2023-12-18T22:12:00", "inuse": true, "location": [{"province": "beijing", "city":"chaoyang", "street": "datun"}]} +``` + +![JSON 解析](./pic/transform-02.png) + +##### Regex 正则表达式 + +可以使用正则表达式的**命名捕获组**从任何字符串(文本)字段中提取多个字段。如图所示,从 nginx 日志中提取访问ip、时间戳、访问的url等字段。 + +``` re +(?\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b)\s-\s-\s\[(?\d{2}/\w{3}/\d{4}:\d{2}:\d{2}:\d{2}\s\+\d{4})\]\s"(?[A-Z]+)\s(?[^\s"]+).*(?\d{3})\s(?\d+) +``` + +![Regex 解析](./pic/transform-03.png) + +##### UDT 自定义解析脚本 + +自定义 rhai 语法脚本解析输入数据(参考 `https://rhai.rs/book/` ),脚本目前仅支持 json 格式原始数据。 + +**输入**:脚本中可以使用参数 data, data 是原始数据 json 解析后的 Object Map; + +**输出**:输出的数据必须是数组。 + +例如对于数据,一次上报三相电压值,分别入到三个子表中。则需要对这类数据做解析 + +``` json +{ + "ts": "2024-06-27 18:00:00", + "voltage": "220.1,220.3,221.1", + "dev_id": "8208891" +} +``` + +那么可以使用如下脚本来提取三个电压数据。 + +``` +let v3 = data["voltage"].split(","); + +[ +#{"ts": data["ts"], "val": v3[0], "dev_id": data["dev_id"]}, +#{"ts": data["ts"], "val": v3[1], "dev_id": data["dev_id"]}, +#{"ts": data["ts"], "val": v3[2], "dev_id": data["dev_id"]} +] +``` + +最终解析结果如下所示: + +![UDT](./pic/transform-udf.png) + +### 提取或拆分 + +解析后的数据,可能还无法满足目标表的数据要求。比如智能表原始采集数据如下( json 格式): + +``` json +{"groupid": 170001, "voltage": "221V", "current": 12.3, "ts": "2023-12-18T22:12:00", "inuse": true, "location": "beijing.chaoyang.datun"} +{"groupid": 170001, "voltage": "220V", "current": 12.2, "ts": "2023-12-18T22:12:02", "inuse": true, "location": "beijing.chaoyang.datun"} +{"groupid": 170001, "voltage": "216V", "current": 12.5, "ts": "2023-12-18T22:12:04", "inuse": false, "location": "beijing.chaoyang.datun"} +``` + +使用 json 规则解析出的电压是字符串表达的带单位形式,最终入库希望能使用 int 类型记录电压值和电流值,便于统计分析,此时就需要对电压进一步拆分;另外日期期望拆分为日期和时间入库。 + +如下图所示可以对源字段`ts`使用 split 规则拆分成日期和时间,对字段`voltage`使用 regex 提取出电压值和电压单位。split 规则需要设置**分隔符**和**拆分数量**,拆分后的字段命名规则为`{原字段名}_{顺序号}`,Regex 规则同解析过程中的一样,使用**命名捕获组**命名提取字段。 + +![拆分和提取](./pic/transform-04.png) + +### 过滤 + +过滤功能可以设置过滤条件,满足条件的数据行 才会被写入目标表。过滤条件表达式的结果必须是 boolean 类型。在编写过滤条件前,必须确定 解析字段的类型,根据解析字段的类型,可以使用判断函数、比较操作符(`>`、`>=`、`<=`、`<`、`==`、`!=`)来判断。 + +#### 字段类型及转换 + +只有明确解析出的每个字段的类型,才能使用正确的语法做数据过滤。 + +使用 json 规则解析出的字段,按照属性值来自动设置类型: + +1. bool 类型:"inuse": true +2. int 类型:"voltage": 220 +3. float 类型:"current" : 12.2 +4. String 类型:"location": "MX001" + +使用 regex 规则解析的数据都是 string 类型。 +使用 split 和 regex 提取或拆分的数据是 string 类型。 + +如果提取出的数据类型不是预期中的类型,可以做数据类型转换。常用的数据类型转换就是把字符串转换成为数值类型。支持的转换函数如下: + +|Function|From type|To type|e.g.| +|:----|:----|:----|:----| +| parse_int | string | int | parse_int("56") // 结果为整数 56 | +| parse_float | string | float | parse_float("12.3") // 结果为浮点数 12.3 | + +#### 判断表达式 + +不同的数据类型有各自判断表达式的写法。 + +##### BOOL 类型 + +可以使用变量或者使用操作符`!`,比如对于字段 "inuse": true,可以编写以下表达式: + +> 1. inuse +> 2. !inuse + +##### 数值类型(int/float) + +数值类型支持使用比较操作符`==`、`!=`、`>`、`>=`、`<`、`<=`。 + +##### 字符串类型 + +使用比较操作符,比较字符串。 + +字符串函数 + +|Function|Description|e.g.| +|:----|:----|:----| +| is_empty | returns true if the string is empty | s.is_empty() | +| contains | checks if a certain character or sub-string occurs in the string | s.contains("substring") | +| starts_with | returns true if the string starts with a certain string | s.starts_with("prefix") | +| ends_with | returns true if the string ends with a certain string | s.ends_with("suffix") | +| len | returns the number of characters (not number of bytes) in the string,must be used with comparison operator | s.len == 5 判断字符串长度是否为5;len作为属性返回 int ,和前四个函数有区别,前四个直接返回 bool。 | + +##### 复合表达式 + +多个判断表达式,可以使用逻辑操作符(&&、||、!)来组合。 +比如下面的表达式表示获取北京市安装的并且电压值大于 200 的智能表数据。 + +> location.starts_with("beijing") && voltage > 200 + +### 映射 + +映射是将解析、提取、拆分的**源字段**对应到**目标表字段**,可以直接对应,也可以通过一些规则计算后再映射到目标表。 + +#### 选择目标超级表 + +选择目标超级表后,会加载出超级表所有的 tags 和 columns。 +源字段根据名称自动使用 mapping 规则映射到目标超级表的 tag 和 column。 +例如有如下解析、提取、拆分后的预览数据: + +#### 映射规则 + +支持的映射规则如下表所示: + +|rule|description| +|:----|:----| +| mapping | 直接映射,需要选择映射源字段。| +| value | 常量,可以输入字符串常量,也可以是数值常量,输入的常量值直接入库。| +| generator | 生成器,目前仅支持时间戳生成器 now,入库时会将当前时间入库。| +| join | 字符串连接器,可指定连接字符拼接选择的多个源字段。| +| format | **字符串格式化工具**,填写格式化字符串,比如有三个源字段 year, month, day 分别表示年月日,入库希望以yyyy-MM-dd的日期格式入库,则可以提供格式化字符串为 `${year}-${month}-${day}`。其中`${}`作为占位符,占位符中可以是一个源字段,也可以是 string 类型字段的函数处理| +| sum | 选择多个数值型字段做加法计算。| +| expr | **数值运算表达式**,可以对数值型字段做更加复杂的函数处理和数学运算。| + +##### format 中支持的字符串处理函数 + +|Function|description|e.g.| +|:----|:----|:----| +| pad(len, pad_chars) | pads the string with a character or a string to at least a specified length | "1.2".pad(5, '0') // 结果为"1.200" | +|trim|trims the string of whitespace at the beginning and end|" abc ee ".trim() // 结果为"abc ee"| +|sub_string(start_pos, len)|extracts a sub-string,两个参数:
1. start position, counting from end if < 0
2. (optional) number of characters to extract, none if ≤ 0, to end if omitted|"012345678".sub_string(5) // "5678"
"012345678".sub_string(5, 2) // "56"
"012345678".sub_string(-2) // "78"| +|replace(substring, replacement)|replaces a sub-string with another|"012345678".replace("012", "abc") // "abc345678"| + +##### expr 数学计算表达式 + +基本数学运算支持加`+`、减`-`、乘`*`、除`/`。 + +比如数据源采集数值以设置度为单位,目标库存储华氏度温度值。那么就需要对采集的温度数据做转换。 + +解析的源字段为`temperature`,则需要使用表达式 `temperature * 1.8 + 32`。 + +数值表达式中也支持使用数学函数,可用的数学函数如下表所示: + +|Function|description|e.g.| +|:----|:----|:----| +|sin、cos、tan、sinh、cosh|Trigonometry|a.sin() | +|asin、acos、atan、 asinh、acosh|arc-trigonometry|a.asin()| +|sqrt|Square root|a.sqrt() // 4.sqrt() == 2| +|exp|Exponential|a.exp()| +|ln、log|Logarithmic|a.ln() // e.ln() == 1
a.log() // 10.log() == 1| +|floor、ceiling、round、int、fraction|rounding|a.floor() // (4.2).floor() == 4
a.ceiling() // (4.2).ceiling() == 5
a.round() // (4.2).round() == 4
a.int() // (4.2).int() == 4
a.fraction() // (4.2).fraction() == 0.2| + +#### 子表名映射 + +子表名类型为字符串,可以使用映射规则中的字符串格式化 format 表达式定义子表名。 + +## 任务的创建 + +下面以 MQTT 数据源为例,介绍如何创建一个 MQTT 类型的任务,从 MQTT Broker 消费数据,并写入 TDengine。 + +1. 登录至 taosExplorer 以后,点击左侧导航栏上的“数据写入”,即可进入任务列表页面 +2. 在任务列表页面,点击“+ 新增数据源”,即可进入任务创建页面 +3. 输入任务名称后,选择类型为 MQTT, 然后可以创建一个新的代理,或者选择已创建的代理 +4. 输入 MQTT broker 的 IP 地址和端口号,例如:192.168.1.100:1883 +5. 配置认证和 SSL 加密: + - 如果 MQTT broker 开启了用户认证,则在认证部分,输入 MQTT broker 的用户名和密码; + - 如果 MQTT broker 开启了 SSL 加密,则可以打开页面上的 SSL 证书开关,并上传 CA 的证书,以及客户端的证书和私钥文件; +6. 在“采集配置“部分,可选择 MQTT 协议的版本,目前支持 3.1, 3.1.1, 5.0 三个版本;配置 Client ID 时要注意,如果对同一个 MQTT broker 创建了多个任务,Client ID 应不同,否则会造成 Client ID 冲突,导致任务无法正常运行;在对主题和 QoS 进行配置时,需要使用 `::` 的形式,即订阅的主题与 QoS 之间要使用两个冒号分隔,其中 QoS 的取值范围为 0, 1, 2, 分别代表 at most once, at lease once, exactly once;配置完成以上信息后,可以点击“检查连通性”按钮,对以上配置进行检查,如果连通性检查失败,请按照页面上返回的具体错误提示进行修改; +7. 在从 MQTT broker 同步数据的过程中,taosX 还支持对消息体中的字段进行提取,过滤、映射等操作。在位于 “Payload 转换”下方的文本框中,可以直接输入输入消息体样例,或是以上传文件的方式导入,以后还会支持直接从所配置的服务器中检索样例消息; +8. 对消息体字段的提取,目前支持 2 种方式:JSON 和正则表达式。对于简单的 key/value 格式的 JSON 数据,可以直接点击提取按钮,即可展示解析出的字段名;对于复杂的 JSON 数据,可以使用 JSON Path 提取感兴趣的字段;当使用正则表达式提取字段时,要保证正则表达式的正确性; +9. 消息体中的字段被解析后,可以基于解析出的字段名设置过滤规则,只有满足过滤规则的数据,才会写入 TDengine,否则会忽略该消息;例如:可以配置过滤规则为 voltage > 200,即只有当电压大于 200V 的数据才会被同步至 TDengine; +10. 最后,在配置完消息体中的字段和超级表中的字段的映射规则后,就可以提交任务了;除了基本的映射以外,在这里还可以对消息中字段的值进行转换,例如:可以通过表达式 (expr) 将原消息体中的电压和电流,计算为功率后再写入 TDengine; +11. 任务提交后,会自动返回任务列表页面,如果提交成功,任务的状态会切换至“运行中”,如果提交失败,可通过查看该任务的活动日志,查找错误原因; +12. 对于运行中的任务,点击指标的查看按钮,可以查看该任务的详细运行指标,弹出窗口划分为 2 个标签页,分别展示该任务多次运行的累计指标和本次运行的指标,这些指标每 2 秒钟会自动刷新一次。 + +## 任务管理 + 在任务列表页面,还可以对任务进行启动、停止、查看、删除、复制等操作,也可以查看各个任务的运行情况,包括写入的记录条数、流量等。 \ No newline at end of file From 0bcb1a6b640b45ed7e7952ac58f99279bbc85b76 Mon Sep 17 00:00:00 2001 From: sheyanjie-qq <249478495@qq.com> Date: Thu, 8 Aug 2024 16:26:46 +0800 Subject: [PATCH 43/45] update taox doc --- docs/zh/14-reference/01-components/04-taosx.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/zh/14-reference/01-components/04-taosx.md b/docs/zh/14-reference/01-components/04-taosx.md index 7426369f62..e0313d79cb 100644 --- a/docs/zh/14-reference/01-components/04-taosx.md +++ b/docs/zh/14-reference/01-components/04-taosx.md @@ -330,7 +330,7 @@ journalctl -u taosx [-f] taosX 会将监控指标上报给 taosKeeper,这些监控指标会被 taosKeeper 写入监控数据库,默认是 `log` 库,可以在 taoskeeper 配置文件中修改。以下是这些监控指标的详细介绍。 -### taosX 服务监控指标 +### taosX 服务 | 字段 | 描述 | | -------------------------- | ----------------------------------------------------------------------------- | @@ -349,7 +349,7 @@ taosX 会将监控指标上报给 taosKeeper,这些监控指标会被 taosKeep | process_disk_written_bytes | taosX 进程在一个监控周期(比如10s)内写到硬盘的字节数的平均值,单位 bytres/s | -### Agent 监控指标 +### Agent | 字段 | 描述 | | -------------------------- | ----------------------------------------------------------------------------- | @@ -365,7 +365,7 @@ taosX 会将监控指标上报给 taosKeeper,这些监控指标会被 taosKeep | process_disk_read_bytes | agent 进程在一个监控周期(比如10s)内从硬盘读取的字节数的平均值,单位 bytes/s | | process_disk_written_bytes | agent 进程在一个监控周期(比如10s)内写到硬盘的字节数的平均值,单位 bytes/s | -### Connector 监控指标 +### Connector | 字段 | 描述 | | -------------------------- | --------------------------------------------------------------------------------- | @@ -376,7 +376,7 @@ taosX 会将监控指标上报给 taosKeeper,这些监控指标会被 taosKeep | process_disk_read_bytes | connector 进程在一个监控周期(比如10s)内从硬盘读取的字节数的平均值,单位 bytes/s | | process_disk_written_bytes | connector 进程在一个监控周期(比如10s)内写到硬盘的字节数的平均值,单位 bytes/s | -### taosX 通用数据源任务监控指标 +### taosX 通用数据源任务 | 字段 | 描述 | | -------------------- | --------------------------------------------------------------- | @@ -388,7 +388,7 @@ taosX 会将监控指标上报给 taosKeeper,这些监控指标会被 taosKeep | written_points | 本次运行写入成功点数 (等于数据块包含的行数乘以数据块包含的列数) | | execute_time | 任务本次运行时间,单位秒 | -### taosX TDengine V2 任务监控指标 +### taosX TDengine V2 任务 | 字段 | 描述 | | --------------------- | -------------------------------------------------------------------- | @@ -404,7 +404,7 @@ taosX 会将监控指标上报给 taosKeeper,这些监控指标会被 taosKeep | created_tables | 本次运行创建子表数 | | updated_tags | 本次运行更新 tag 数 | -### taosX TDengine V3 任务监控指标 +### taosX TDengine V3 任务 | 字段 | 描述 | | ---------------------- | ------------------------------------------------------- | @@ -422,7 +422,7 @@ taosX 会将监控指标上报给 taosKeeper,这些监控指标会被 taosKeep | success_blocks | 本次写入成功的数据块数 | -### taosX 其他数据源 任务监控指标 +### taosX 其他数据源 任务 这些数据源包括: InfluxDB,OpenTSDB,OPC UA,OPC DA,PI,CSV,MQTT,AVEVA Historian 和 Kafka。 From 3b32413a359fbb996300c7eb411dd79b07d5fd76 Mon Sep 17 00:00:00 2001 From: sheyanjie-qq <249478495@qq.com> Date: Thu, 8 Aug 2024 16:32:15 +0800 Subject: [PATCH 44/45] fix typo --- docs/zh/14-reference/01-components/12-tdinsight/index.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/zh/14-reference/01-components/12-tdinsight/index.mdx b/docs/zh/14-reference/01-components/12-tdinsight/index.mdx index 4058e579de..224fd5908d 100644 --- a/docs/zh/14-reference/01-components/12-tdinsight/index.mdx +++ b/docs/zh/14-reference/01-components/12-tdinsight/index.mdx @@ -15,8 +15,8 @@ TDengine 通过 taosKeeper 将服务器的 CPU、内存、硬盘空间、带宽 首先检查下面服务: - TDengine 已经安装并正常运行,此仪表盘需要 TDengine 3.0.0.0 及以上,并开启监控上报配置,具体配置请参考:[TDengine 监控配置](../taosd/#监控相关)。 -- taosAdapter 已经安装并正常运行。具体细节请参考:[taosAdapter 使用手册](../taosadapter) -- taosKeeper 已安装并正常运行。具体细节请参考:[taosKeeper 使用手册](../taoskeeper) +- taosAdapter 已经安装并正常运行。具体细节请参考:[taosAdapter 参考手册](../taosadapter) +- taosKeeper 已安装并正常运行。具体细节请参考:[taosKeeper 参考手册](../taoskeeper) 然后记录以下信息: From 617b95353abd9cdccbc96f363d62963fadae914c Mon Sep 17 00:00:00 2001 From: sheyanjie-qq <249478495@qq.com> Date: Thu, 8 Aug 2024 16:43:53 +0800 Subject: [PATCH 45/45] fix typo --- docs/zh/07-operation/05-monitor.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/zh/07-operation/05-monitor.md b/docs/zh/07-operation/05-monitor.md index e39eaea1f5..cd8a9772cd 100644 --- a/docs/zh/07-operation/05-monitor.md +++ b/docs/zh/07-operation/05-monitor.md @@ -42,19 +42,19 @@ taosKeeper 的配置文件默认位于 `/etc/taos/taoskeeper.toml`。 详细配 TDengine 数据源插件已被提交至 Grafana 官网,完成插件的安装和数据源的创建后,可以进行 TDinsight 仪表盘的导入。 -在 Grafana 的 Home-Dashboards 页面,点击位于右上角的 New → mport 按钮,即可进入 Dashboard 的导入页面,它支持以下两种导入方式。 +在 Grafana 的 ”Home“ -> ”Dashboards“ 页面,点击位于右上角的 ”New“ -> ”import“ 按钮,即可进入 Dashboard 的导入页面,它支持以下两种导入方式。 - Dashboard ID:18180。 - Dashboard URL:https://grafana.com/grafana/dashboards/18180-tdinsight-for-3-x/ -填写以上 Dashboard ID 或 Dashboard URL 以后,点击 Load 按钮,按照向导操作,即可完成导入。导入成功后,Dashboards 列表页面会出现 ”TDinsight for 3.x“ 仪表盘,点击进入后,就可以看到 TDinsight 中已创建的各个指标的面板,如下图所示: +填写以上 Dashboard ID 或 Dashboard URL 以后,点击 ”Load“ 按钮,按照向导操作,即可完成导入。导入成功后,Dashboards 列表页面会出现 ”TDinsight for 3.x“ 仪表盘,点击进入后,就可以看到 TDinsight 中已创建的各个指标的面板,如下图所示: ![TDinsight 界面示例](./TDinsight-1-cluster-status.webp) -**注意** 在 TDinsight 界面左上角的 Log from 下拉列表中可以选择 log 数据库。 +**注意** 在 TDinsight 界面左上角的 ”Log from“ 下拉列表中可以选择 `log` 数据库。 ### TDengine V3 监控数据 -TDinsight dashboard 数据来源于 `log` 库(存放监控数据的默认 db,可以在 taoskeeper 配置文件中修改)。”TDinsight for 3.x“ 仪表盘查询了 taosd 和 TaosAdapter 的监控指标。 +TDinsight dashboard 数据来源于 `log` 库(存放监控数据的默认数据库,可以在 taoskeeper 配置文件中修改)。”TDinsight for 3.x“ 仪表盘查询了 taosd 和 TaosAdapter 的监控指标。 - taosd 的监控指标请参考 [taosd 监控指标](../../reference/components/taosd/#taosd-监控指标) - taosAdapter 的监控指标请参考 [taosAdapter 监控指标](../../reference/components/taosadapter/#taosadapter-监控指标)

z#3}DTXEdZR_PQdwY?&F}bM$YH(Pgq$F?))EVZ_^A#V==7Zt~i@NKJ$<7 zlX^$aJM(bPkO)1c_>!143RRUjei5ODq9)qBAsZ^fM}3~o>`*_`PFN@3f*mpAzM8>y z*GqN?3dm&|I&_?!SVx)rFoV5O=Q;|uQ!-7p{Rrwk91pvi_EG(3o)U}G0bN$#%6Y{m zk4^_8N_Lt-RpM^IYfZy3CeAVPZ;fGo>H0oZ1g`j-$I&_nT+|-7C7WEj>gRBx!>MfM z5)qItXPQp)P25ReC$ICQWtIK-!0bi{LAp}4Ec=f$)a$Ke`)52t^w=H)5ZH@dmB))u z!)_lNgU))leVS2}AOCfZ@%ZQ^8v+M3Im7(?R5k2z$cDV|`*pFBMpbcQDUD6x zKOyy{d7TG9!r?<4x{WYcofDE5n#o!KLDbV{1>6Olfa!U&VHze;;+2W@DJJ;~n8#=l zq9mE??HdwQaEjSul(T*ZyyVl!Ve$%cc<$EjpKrWzjv;)n`V=glExvv=ix>#dz82|q z8Ct}RP&e5iNL!L!Dx}qOkHnkr`A+#a`-hR8^*-(arwPKxLQ$l6Hy6BRj2E{au2@DI z^DZdxW)suQtP*}%mc}X1^b}z)(%e?VQ{2}Tg3^CEvplB47j=$oiW(R${#7YU1ONa* zt|z~_+_hCS*cLP_p(gzO+z^dnU=R_f8`}+_B(I@E5UUl(0op zzjvpy*1Qq$k;r3LhZnarcCvmHr$+GL7}9{5f9__{8ea zO3h7RwwF+}>Y$&C^FS|dii%@^Mn-k%d3{*k;;Y71oia~ibS@2pe>t6&_GjZnB-0DE z^VN5zHvZZ>i8t`W>$T{lK6zsPdJVz-SnEVwU8x*5bScr9NqogUrm7NKfAN;6B;M+B2q8N|ejAM~WDsP< zcKErS3umwzX-8dlrqH67W-2h83I}^P>R8M6BfDsqX>JU9IyOV!H~TZvx%O{Vcsx2^ z#*9@(eY~zni|FB56mPX(b4=mhms}OcCQJ^-mf~B@Lbs<|u@YV(`XAk~Y?1eK`m#vk zY>?eTq)-HdAjHhV-zN`4-e}ow`9_hk62~1OXu9S7ol=-|dzI{|oi_wsTZX%wIB8`QrL2||J}9P(?FEHWbXbv_*eWFz2E0x literal 0 HcmV?d00001 diff --git a/docs/zh/07-operation/tdinsight.png b/docs/zh/07-operation/tdinsight.png deleted file mode 100644 index 0d909503186cd6ba1f0212c7e9d2b46cb71ee07e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 274242 zcmZ5{cQ~8v`*&zds%W%Ev}(5Y3R;^sR;j(I9kWIod#{EPiq_smQM-0gd(|##rZGzp zqekrU-p}uSf8XzOy!j^%hs1qf*Lj`iXWfyS>Pi%3_sBpX5QXw{d2JAgR2l>#o&pmC zze(}y{|mekxoIoGLFK~?>mU#_NLl`wu6M>}vvTyqKA)YF)YP5rN~J$7zb0=bZ|e&r za8h)KD6-n2d^9>tyrEJSE)v?r?hhP-sa8LCF6XIBfEScWv8N&+F5=gWB=?@}ARTC< z^suHcY;A08trdG18C%k374h;?sNzYy$){j7N47O}7a@8#> z3^_*TW-R0&&|dubk+h+ag7GSXHd45(J8|*z|sw9Vr6N zDH{01v7hQ24Pgc6u`HSN1S7$S2rj|vZKQ~uft0#c9CM2vO*vNtIqB(AqZkf)izr0Z zn^_w>Q9BU!vQschhbQ8RKG}rlPjgwByd>ss&7a z{xB>pqLi!HAq_>Yt3?TMeRECB;VlydL4guXbmOW0LgmV}3FvCiu+$AV5a`J=T97o_ zd+wRh{i@R<#%}0xhTHH6pM$d5UAL_EDCw;Itu6CUxB%{4zs?)-n6T7bOqK@+ZAJg{ zeu2p|I@()@uD2@ISZ{+!-T8F%?P$&v@OS>Fdj9W)HpsMavdIsNGgDuGR*zlGU<<{4 zc@mM$vJmqpy1@RM8@N-D%u1!fhCZ!;2y{)%Wmjn=JzHuk;{eKhqae1WP|`k3D5~(6 zW%+UvlIDijRO#*3nu9rMHBPnYNowBmJoQh@_>879jMw-*ZRa3C4)nz(D{=j z733b^eOi1GWw(__Ntz3ieGstUZfpNm1ByT(_Khy*PXv3&H;<%)YCoQBXx7tY_aeVP z?~LJlU>glv$Z$*K6pUs^3g7E^^x~uz_6631T8)9I{Qixz;U$OPk+{b4@HC4PuEk$< zGU;q@H`+<`bTG|?lub>Tyf{>hGzJP{jv*>w%4>HU1pSpq=Sc_Br&{=L2VIk*TIM<4DSS7R8?c=s1OW`fnDcfl^a5!9x9Mx#DYU0EQ#@qqn{Ti zWh)Z1EcO``%!`7s>bMtL@<;ViMYW6JKw=N3L)>H%UQM$$Nk0;G*Ootp$3+w)2c#)NV=XMO^j6rriCpe2U0VtjgjFY*>uj0^ln z>OM!p7&91k}?oJ^J}Wb9c(yv9D^4 zo3Ia25u-Nz$uEtKxswNy2Ytj|tzHDSVx1p6c<^|m%%#4muF;rx^;Q_1KUs2I;+>*i zmNLo&1d2x(suV##bFewepfaXBevlf7m`M;nfM^c}xQ^rlJ!+N0mCyyf1G*vnUb*WcQrBV#kU3Hek4g;>b zqv!~}!f001w*rS5r^C5szdGkz?Hk{-mL4LZ;br>xl@e(ME&HxUEdL4&#F^schLfnA{t_q zVl0y_u=*lKm~Tvltly|)0$6`XN5?t`7L-_j_ccC7Wkq$Yp&34F+5BEh=UPi&$r!4Xt&^a(M`XPmDk)OFayR8*BO zzAvS5bln}qHZG!uP02^2k1Sf}U)LJvYdZ)zDb?dip2ZE==z9F54w%nND3({2A)?Gw zFC4X(7vZOS5pD^}`W`(_&xg{4h69x_<3#dI9?V7U8nX;-gf-uA5juYV-)aB6oQNg< z!PF~1Kfg?MrEw8U@mbj~b&}F3P5$Kc1OzPuC40YI-i(xtO!*YP*-RiN)e<_SUxI5S zC_1{iRqGC>7x>uf_3|35CoYh_QvzOT1!WZ#$>5>^)~?{RbRR>hKcV_V6b4=tgLQyWSX#)Vim zLn`E*;N@AQbPPg4$9Y^^?=f~3^mEJ8FTh}m5WNKrhm{nKX{wxE$bh~S7nj`YND=M{ zo_ba5Sx6V2L|e8wYBwI7zHUU@)wVi)G8WcE40Ie*hC^ccME%xwsG1Yq-g-UYaGBq_mc!aL>RLKkWlmB(r&y4(dt92+O+g$|qhn7cbm2R0my$#D}*mm9!A>9YFrPid988T#4G35uQ7F8x>&_Ls_P*(DNE8fKyAmP zqoZ~jvR(|mB15dyor2WjQFxk&bRP6ysS5oPX}`lk4{1HUsVRf{x;k)JZvNklt*4}t6jw9dF(Y>dXM7gkr*@QM_)e>4|?65M*?+xHsElUbNS zZC0IaJdbckGA2CMAP|&<5N}pJdb(Aie|VT~T|slu1QQjrcxuuOW+MZ^6v!<@#oB|# zyBMGdFoH&y1fm^=gg*-jiRW=ECpaW?&3D{ltn6ux%jZDjX6bXk!6_U+qL@R(&? z6`LC@J%;kjI04V2qa&{T;^MjHYQiDrHPeF!&Hg8QUyWBXUb~ddw+5M)@LEa<%229M z)kp4H6S+gK1D#lx)3(~Ea?R-Ay}YAJ@pVw9I_~(hEmV;u892NN+FJX6RKlLU{N*3W z^gJ4~p7_)4^lyqtpE%uP;6yB5oE_EI*C!_>L1TfJ`F4x%;U@huQYKp|#Y9Z-2JZLK zMRT)sFLHan^=d^RXr|9FVeC|Se>6|Y@(;eTrKK^6wh7nOD<&@PbAF6$owth?r^h>* zpWQ1gH7*N0of#J-uTC9o_B(p=WD?AhOVNE9a{WDz1LD1B2)+@tw9T<(rybvyn|MI| zp}?WrYB%=kI5z0&C@5&KcNk(JbIh|Rq&8kTWL=J+Oc*n(Nba-dv}0Hl%r%n*bxDn2 z{5<~tU6dQ19vd5bD>@gk?0sdivoeq@vO425DHv^BmNbGBeez^m_M4x(d(Dw+(CgO~ zy4=n#E_1D3N>Y65M}DpIw>wkZvPSF*Rojun;=RRtO|55=i7NRRFWHkncL)4!B!~O@ z`r6x{)nkTit6vALtMwu&4@=I@&Xy7@o13xt!|dkie1;X*26)cjiHg96iFGNz!_xVk z^n!+(nuB43)>6E0-b~=Z+6SCZgUR-L(H%OnFypernL>@1W%`wdCi8}-FJJl{9&}$` zwiFk8?ab*>uk^(O3$uQF{B7smMBeP&oLR|4|B7q+eMdYV-&me)c8wTh|0Erjm#=*j zp~`N13*fAnS$;a6?4V1ZiunLsrk87~Q}qlvTace$lP)(`id4X1uBS=8>bq;~D3s;# zN&APLvn7hE+J@92TS=@-tuY~BzHW;^@Srr5FIacS8kbGJ@_Ny?J=bLGZ1g z($T9mr;Ir?vQU=O>jzacy!nMCo9Shg zEY=Q1ciiS2z3_z7(^<4lW;sn(&{kd*wFh}XZH5td+hR#ib#m{?o^8ccrTf>%-aF40 z-w(m_>QACZV${>hbK*sJUMC25#V++~+x^gt`6NtT{4&;OtUXPFoh2`!3tS zE7lha;*9<#PdZAgSR8J77{0cI5csRG{MrS0mAMVa9>vfjcCIFyUN@h7^40abbSg{{ z_^fo1`%{p-IdCC8NAvkJ&YarQxj9Cb&)P-5o2wPLq{}CO<^$`=*H#{{F_-aW2nR;v z$=_?^NCwMT9%{EFXY0*PfuNHC+olPpdb7<P_5k7ef zygChlvcPUk;t7(N^t1w>z~dQQc6uGv=<&)n&&WQx&Py}1@`Qf)Je`InLvI%DrdL6M zLl#a;g>L|!JpJC8%4EtWI<+7*1}s4+?p?-&TLQemv3B-c>}JNkRpqxTlRn#OyE(z( zBHRrD^A_~-H_bt5ze>!Or|8sVY)njU+-XZi(W@pbfF*Q#D=CY61H}WG&;3p4?ZW4naw>M^I zja%n~_WnfTe3rH#;g=#g(TK%5#If3F`% zjVv>CBY(fD&64)B#dtQ2JBr*3w>knEN|tW%@71$$LIwyv{BHE3iHXYg+ut)y^*sksRqYQ(jG2mnN*4krA?VH&u}; z?WvvzrVc?%6Q!Ud>Kl*@vz@K;CZR0p)uQ&0crfK54(*66dB9y6-cxpUXMsAq@`oY;sPqg(&4Fb5xT81&~&N z_s!A#8_+tw9uWZC>fGXD4z3Ac5aa6!FY^Cn<~kU&$5RbqUe$uN)cu6ppFtQl4Q{d| z+1LoBo@8qNi-p!F^-1gU4$RKZ_S;ss?69Hs!khq@U#nQAU;UukguC<0LKCwVHLzuV zS%rAtN<)7D1MQqOmN%6SsRu; z>5MZcwB_`XaxIG;e*d&%=Z@w5vj>V+3XDc%29xEK-BmL<|0HTthw#K(s-@vZh#gih17)O`yg;n zFQDf&+8Cu3Bo3@(;ekF55coYo&-_RwJ^wojAD#o)FORc|k1b|-L#xcV4A_tyt4HhO z9~A%^2Y^po9x!oKDr*M3!Nlz4%YCT|jNhC~eRm{0p9bk2)xC6iDbq7uxAm&FAFA_s zsgb|EIG0mWQZmT~7zwVfx%UC34_K}f|16=hQTr~cyPjH$#4boH5`W+vNl9egCT03(0FFamT?Wh_!Sw6u>dadFeOz7lBwP0-0YJNcd3o8_ zhsBL#*QYff%?DkzULFX_Ob1oZ{8VEr!;po1$KW3@FuYL*D1f2|CgdhPf;{*pOSt8q z>X26(SHUV7_0AOaX8_P@Zr}E<5P}xy*0ss}oHhG0vpDeuh16rM|M3H2} z=IkEY(q7U}Qj5AF)1}$W+}zxY;T_uo7#gLJsj(v}S7ux2>G~Ppn6s{PHvZ>@$-%Wz zl{#m?EL@{YJ*FE>BnL2J506@1e(x3lQ0<%%d`T6Y?^o147o z-vc0$=^&320QEjT4LgLThzYz$ry%b@zg?BpAt>0UTD>yvKX6JpH^>&yO&-s3^b&@)DD>Etu&+{M3OqH`)ul#W8kx?v zR2LPWTC@EZ@I?N(MT$@@T^$rlGSrEp>4J{yF5AhTrOqFHT-<)@^->HcNdC{X06LwH z9-!ac58pjKUERlN5Lvjn`F$cBT%+pzYcjE#arW%sU?xh;7T{U`;2rzc-xvek057j( z*x_00)m$~52GJ*`tPp0*Ty-_c{+06tQf7zy>BB z*++?w99>*o1kmb?|G4eB1|tV_9VM#w9zVxVu}=f!K;Fz$N+Kk|Cj3+OA^=|9-MtAq z@V(&7?eH%yF4lYGy93?kYE9U2uD;`X%`gwJDFv7n(rpKH0M=nYnrX1+#v=MT7cJBR_F& z@v9=kK5HS?-S+m7ue)2Do7UAvn7UZUT9y1FE&yf*c$o zvwI)&>pGYUH$9lz|L#(MD+1^MPV543e)7(Eb_KNG8_(g~;d1=p*@ZuU{J;wDz&-13 zarpD+hpDQHKb8d5eyIe(!AOR8kUdwsig6bM5uDg(sNs z7naj}em9 zp~lf`bxT#ik?$ND+DhpKT`Tj1*XL*CnebOPni&1z3x|xkue84fDg--_jQ(dpiHlQ( z2zOmKZi#!J%SkS$;?PqyF*KB){|J^}_x(H2Y5;;$G391z@Xg9VU%$#o2^@-uEwO~A zs`dy*=jG*T7bVQSfv{ZfTw_G%Lg1l4@dV$POq*z6IU(?_O9N2c2(I;H=ry3L0FuqC z+O)oDtJI#oy{d9NJW>e^aIT>tHPi8!n3%((qg+mI+Jm8?A%MeBDc50LNOO+%RtB^y zJH(YDx?p!-=laWxh;sx#dGe%gQWVry#oLSI?*14tK8hzKB_|sg7*MD&MN#Q+QUj$_ zm@T~xOxs=eMu*b=S!6d_z%gX%wy+HLGq3t$PCikjAAivn%EtJ?^mfGYT*8IJo^5#pA^p2od0zS zKRUw69boz$g5~-pBUu4+Ta74){3q=qYvGeyC?B=F;#Yv~T~vE|(emah%+kEHhy(Qt z?*aHhrsFlY5<0|>q;>!Vi7mecYT5D28h`?|fX)?*`5zUj0T5wxIq&rJoE`1d1Hg1- z%iWmuZsjVW^S11uZS~cjz?C*9^)|K%z=1pBhchqp)j}a~auEdU zopKhrhh&KA1~6u1S;|;({<2sHWd?BQFos4(KD++OkdN|C%&0%E;yG$JD{3^+cM3V$ z<(*a^UguwIz5&wH11j3J!2}Sd`VCru?&w%+42Z;uWT~pQ`XlZPb~ZMT(7BzRa-idd zx3^szemAT#GV}uIXW|tB0M9&$D$%f~l)kFYDY!caDH@AlOq}j5fRu z68!pt?FU^{fwP@AD6k)FC{ObiCy{&bXtKA4TC6O>#z~1owsIpoo=xz( z8rxw{^(M57sKZ&5-uV0bUtM05mGLQPm2-7D=Z#L!%>2)I1;&0$9U$XpN%@T733EX^ z^&-xv@}tjRMi^zPvde`Cv%6!sy5D?itK3S-O>CGZb$ZzMbn6C)5-LcH5=tH1+jFf< zcrA*5Hjjvo{K7DjC0)%6$h9kO;-*tvE8O{H3#XDl|2GT3QXEPXs(a(syHaON%(C~z zkA11Z)S~qQ7YJ&6fE9{p*?ITu6L){VtBupvckjkr&JDsTFz21?(=R^l+-TSC7E-I$ zs=(B}|9VG3ivifLlPpq@7PUzFP+)y8LWTPCIy#pVis%xf$kVSsa+O#w(@`Q)xA-5K{UpA#95_!?QD0D5D3^ykm# zQV<|{$!wQ%LX00O%d+Z-qn+)5RQOw z|Jgs#4MD~*FLlM< zwCJLGLjEXQn8LIjio6~S?zyKVV*T^>rxis49Y|8b-4Cw%`C-GR!V2W zY~fCn4Smcq10#cnM5Z>ZRks}cniswXT=%Fw7^iPM`r;Rc6CFcI>7(k0ZP`j0veo&) z1&3S*v9z+HP$i<|a^oTZK?RhuP`&67?QNgA;cc_l`FhpyqW}yNCGgV&+Z!uOGv-{R zdq-l&V*hgj8V;sfQnku?ah)E?lHrDGD5g@Ix?Q42c>svl4OO}KN!WjG)CuV;PKZ#& zFax`#6;a?CEq^{Jh?W|;6>1T)W!&CXxk;FKjHv;$9_8y+Is1Jzm}A{lW@miS`ITA$BP+(4n7nsls6|cr^QbxR6#(cgY3QQ5 zOKk*LDc)In`@2`Qwr2NP&t|GK^g@?adq^yRvqYCp50J1IqJm7v5f_{h>F?$B=q#f3 z)OeC!pbJ*_PZIN2#3!d-bc6uJ+^hnC_MSU)%_enUzkmPU)P(oT`MEYc=`4;zG61u{ z_yVPkhGgera-Z?W!gV2w7OMugh%BQ2fim$h3N?ery~rwYQld)U0S_#lfEfhtgqfS0 z8@8=}2K8msrgnmcuR$8i?W$)0DWs((CRmWxF^%2&@<8<#xmUrpU{!WE;GZkg+`gu* zH=&sbpnrQ2s1+c@0h3LLeq6-Ev=`{gzz;-i9;T+_LP=X^ExDZGmJz9BYU56rC*++- zhWwdn4CY2Z??7YFPL_=k;GQPOGBz}4IivwbLxaiimQP2X3#P7^GrY(s>5&Z{vwdcw0ODvgN|$_8t<7tRA6cEIjOIw=Tti8Qa?2{bt}w7;^Fer^=FXl&j7r81PE@x z*h&cxHq4tF6Df-uV#xdzNGLJ)Xxds?S%K$RygCJ}qVW-#D9%SulahHjAGJe5laqM{ z1`;b-X-5af=G|l<7Brn^ru7gHR)LL!#cvNpBrPjRu}|^6B8n;{x2Z^JdAgP@uY-33 zK?KGfKXk=2(GI@b(mtazhCQOjmy=$E#CL^BI4WQA=D-2~j%ibEH0;xa1^ig6 z!U|?^BX)anQLAE#D|w(GpU3)lB-g=j{gNBNY)I_CL1its8HRv{TSB8@!$rk+Fm;dB z?iL=m?3@5A*jP@6tekPGGv*r*3FB(gFMRP87A4J**2JXn%3hyI{+j9(Xtpr<=eN{T=rDib+{AdFOzK6 z(P;55B(E#Y6dWP(A`!t*{|y{0R9=!W)!{m9%$gy3JhN~+ZNA9J~7Al zSy#{C1k8XgfDz&y=pb`=k`4$T*#U>CHurBcN*Qt)(2lB7!7l=@*4CaM-wQJa1Q?)j zjs~hq2?WAomfoNsdEy7lwO>dljHi>Gv&WXPY8?pF_HNP*uyC+V2K>p+14gE%H-eeL zwp%VY5RJ|Zz2*4JO*>gXK%s+%gIQvFHwHn_C8?NY0EB+Ox;z8cLvY5K#D>B;U_emT z`$~FTBrN=!iBbPFB?wSy&H{TXm&ArwT<_n%UpRWl)u>a*U}{Q4F6hnGcF*Z6nE7#; z*F0u=`ip)^gNciS1J|xDM+F}$ZdvST=Osw6;R_K9ahvF*!PPt2sj^pBRV_`gPTLT-O|D8HRDTpzpQ3UX2!shvZbvj32#9B3 zy;@k^oySGo8ZtDU>g%7NMrMTo36nz2+|*22$U)>@oedzg>+vUxg zp$2~l1h`&^cM7VG>*`I^lyP!H)3(oAoayC^=&wD^*RFhLEtG0pMgmH*iTnzMXQ)}* zU;h?2a6c`};}u*2@UA+7d9C{Y2+icXDohbLfsxWQJyQIyP=m|u>y|pAf=lIiPYD3Z zO*z%6jY~;LP@g>pgz@!L@2=qP3EB^?McR8(uf4nsHr;@01fVOm0wBMl8xEGRMiN{a zeF^^1=83A(p)x{H@>O?47~Z-U$&9`{uhZ?{QH2EQxZ7lkK=j0vVY>*0Kfns z`64DJNZ$GLK$RU~@5}A7bC7G-^F#pz7Q+QYtm67fEpw+NEdQQ7Yf9&{br1anXy37o z&!E}fKmi^Ggd=r#w8%v$-%hN2RMdo?G|Ld=XuG4=Hoq{spRHY;tt=WpG8kL~b2X7} z<<-T0^(;t;F6gd*Ao)V423~%gUq3&G#a>igZ50j-3;=ZbIwK*V)sVMke^@fcIX7|~ za5zQO?n;KQH)ai4-)iuOTnEG`H-s80@0UmO6yAZGN{cqCn-wRuZ1@cFrI;*OPY)33 z%`f_sXSeF`jjX)Z{K*5ho7zP`?L{DPR@Jhf&K{{@8O6mr{)7SeV>2UTpl!hu@2K$iO#h-_`DIuzx8=!|9|nJReNo}| zHXsv%e&F^``~yEgiRnlXoQY(u7qt~zJ3HAK84LlwoN$U#UIEEEES>;>_Ps=bfEi@Q zpGj94$vZt=y#)?QD*0Pm&Qu@WeSBuBco*47f&pnfbNjq`%3{q1m?&q%w*1)+^%zuK zX*^e=3OYC8MVN`q-QG%@6kx%Mi+!`auG&pU_TBaFmPsVthuc?LFeVctK?^`=1#lfZ zKD`e{M9+D@iFM=GKh%&${t1lo=3xprXwQ`Nl7GR1f?B04kGHnT-v>x}Vq&83Lr==! zr&8>NUG6K7#T>Ty!Mk}35E ze<8vRj*h@vq_ySvj!R`Oz#HYECbMFc1E+;st~Cw^bLfaz@hg1OQFuBH&w+%q;7kT< zm{C=nP0h^@dOmzzxdTUc=a%EIX=zWmn~L)4{PKjPBtj~Uvb>8aIw8UjJCMB5<%ndq zdv9XwdF}yZpi&@5%*Me%xl5aBUwz4qstoRJdy|Frp@NX9BA7}?uaEEU4wxkoEjV}L zFN2WmIMD!WJwrqn$x~Gu0;rrxwhtHv(!^aSY75I>s;$_|&k;v1DS6Ca1m|E!hpK zyTahm+STtsh5L`^3$*MgN+ zi6(OHy1HVJ<)q`c^5cL+&ayp z5xLL1xIGx`{*h9-ZG`AU3p4mxJ8gyNa{|FWA={DomjK4&aKqnvB|)fljPcXEN08QNnkL7Qb$UhCI(9jf3Vw=6+s zm=y8V`D{2-GF7!;3V$=c>1WseiIk#A%|>b>H7RT5vKSO0cfad1pbUF>Bx)DmQTXAW zWW)C%pA+515&6S2CVoMpra>{x>+vdg8%M4zTyGP%Y4)A#ZpFIu|UxU99+t1IUFn z&%LSz!V$oIMx=dX2D~VJStDcPDstfumFjZ7LX^uqDHU0Ptvfzu)CxeVp^6toOB{G` z=W^%D>xe_+?eg4HTKN>W;Sg;~Y9b;~3~Bl}n2in>?ba6g6a@vfSrqzqq3CW=)O~>W zxhSF{uJxp#Pcb&Bm;n(ei=(V;Dqg2rkS)ah0&5i=HAxmQF zMY>hIc#|_nQ*k@AxVd|+9qm#h%60lxt;rN$qDr;rPh*DpBLJ4>jY3LF6rA*^njR-N zStNX%g164owZ8-)_|sZDk94N<1=6c^*}$E6bN>!8SxjyO`=wd*%ZW(3D6reitonz( z3Y>Urah>Tyro~D=YBJW!Hx%YA_W$Cw&#!kR+F}m>7#K(%^U+3y!9!q*KNLJ!({L!s zSbM+JXU$*aPTf1`!$IGo=sQ%efz-u2zz`rLYz2CnK}6aCd&4rw&RzCH_x#<>p%~D$ z${qUNYmQ}NVHB@|#W}ufq!j;zv_CyF6I59@WCNUL7Zq32`u0bjL^sy;BQ5CI18z2$ zsH0rI`PVg;N8Qi-z4G~!fPS87Rb5m@pxcXq*K*^9Y>UGhZyseBwmI1^gzj+C?b_hJ;8u{C~+?fYi7(-$9RU%eYb)7wkOg| zT~Gvx(ERk*NpvBLuQ-mCnzaXt^j{rPbvacdBToLs#ICT9GQV%Mtomq+*ksW(u$gR( zVvxt*5+2Gvw>j`T_Ws{#GMAo_Cgy4~342I3lD7qQ7Q+|7M zo%EUDv~nazQ213l_}Jq9BOuExbIcK1wB8V>DV}}qKMCtG)Y7eVi#;YGvUWb0%>15f zUnXM{OayWx2a#7+F1Kf?3LXO)d{}mT;3gEXB#A*wCY`&!eTIDa$m{%8t?W_m0zVf- znfv&%t{UnhUuIyKLKc%=h(s9xt|up&Gv8|DGtV8$OH(RXx4R6HINIH9aC>>>s3dEA**TrsyNAgW#r5#>i{G{g)ot!L9H5 zxOKv#7X4N8)ko6bacRy?cS>sib!iWA=(Jt>^OSFRgK5`~g()YOpe-ZLuHg zu3$=+GtP>;%O?!mz2ABg`0aTloqD|g$IHXha;>#OtJtRW$i!$McU)5358am<0mNUC z!uzk^3Ddi!6k~?JN8|0g6gE@q(Ju}2@e7APR;C_IKmRYEeAv2Z!YjY-e7_)O!cNNw z0tJ1#$!Bj*Y7Gkhd0Y>UEbAX@N?qhigqHOs)=v}Gbq%ui!;&A&hxWbYl2~M|H8$C8 zDsZG$fBBEOmT`XAcmo*?s7zTnpDYem4)XpRAP~x;#h!=VG{L8dN#*}Ohx5NjrN#U6 zqa2_9+e}VwPqJ*G??i9b3tnCvjO71#*zow^EFgMUca+ve1tO{zuRXhS^q`k2`!kz~ zh7I&j+O^=N8P4bKCX-(-~h*2@M~$ z7ZJmu3p$8p<~h+H5i4Z%TK_t@|1_iDR>LL4d})DSrV7Sx)1qQ=ZxWkKlpl^;M2A^& zdb0RoJ%|7xsCKIp!qcgF)9o$O*95vF-y_Zc|7$=|>p6Glvlr3bZhMRa4x zez!}5WAmA7mSk7z%d6lP0KTds>dA&w_`);A6<{KJH>{fttMC5D`Ka;jAOgQyj8 zS!tyRx2%jPNN$D(-$f6knQ!!rRLhoMGUyEnF3l`OuCcE3^39CsrE`S441u2+70d!! zxLci;+~m0ayQji$k{3U85I+!iP+63@b&8kG;9vDN76~8+c`KG)P6x zmyZgUOm|{0j(i&^t_*li)T}>b9Ras(u9a|G_B;-jM9x6V*byD8`H#EbdIsbMhrL?d zu$^%_SXv}=1{Z_nFbJ`5P2m7Ov$xpL*RAoufn$D5_tfYSyAP!f5){2q6Y!2Sx7kHg z>OIIR8b<87Oe8cGky}yGq`Ea!EuTB}I8Y|BjHDGS4Qt%Wc#C;F)_tI*XCd0*B--l;)+d>rq3!Xat5Q#LCB(d+vK`syA-Xime|M zkJmPTAEyP4xvaUtuG9zbrH*Kee#GC?xn$3*%gZhtE6A|1^Lc?Y-7PiJmsw&Dx_HPZ zr6hRo^I|UUx9(6OjmTO_l>1@d_;^&QU!<}@-e6*~n#81tSDm=*OSA^wvw->+kVCMv_ z_-*YqUku`yu7NBlZxu4dJ{6RrV;{dJxT`Uk`0(PZ%hEnz@O|^wP+D;MR0vwm;6ZhH zvhNQk6a2hb@PciiRNH4~|2=(` z0Bg$nu7hOgYjZD!mK0`^s&)P@!wNZY{?t?D|1?Tv-(Voz-+G4Kk?}v)Jl|)!+GT3J zy4V4-VB&8h?lYQm0;YFc8&Y;bvT5k*+`MK3w%$PgNKp#ZW!Qh^5!Rd6xaFPp@CiS0 z50zk-pd?M2290(ol^hrevatWOZ#GdGhrC;s#PXCJsSaC8c^mp>>X#NZeO;M^zC4N5 zk+od*%Cj^k8!tu&fw2t1PX^u7pSv0+p9!>0oW+b_sD+R2WoUIhS6y@%=%j*sE2gV9 z%|<$E_z9BM?c8Kq0&?dj>0Wf@b&hJzuwkD@$DvKFrAl17@J1JHm}z^{QU_ zGHgFgWoO^W&Q_!@o4)cX`@6Z=qp*>ia>z%#dz4IbLyPG*S+X`-b;|Kpm679Fr`@h8 z8GEU<&iKUmORW^WN{nFPe+S{6mZRn!Y5(KD8kc`GS}wL;U#%(0o*pm9wgSJum@vPf z0jbiDypL}CyKdmWhvAWiNogdd)h|q=!$zRTHKaYc;>$fHHoMQ$gn5K*7y>Un(@eiC z>>2Ta=?~l1iS8D}{OLBhWgP=D{HUEk?BDJ-GIDGRA)`W&m$wg#r{-uDe5@#Vt(3H} zbys|FL&3jizJYw|+2D&2x*_L3GU{9_LeWz!4$|MaYQe}hD2L)`<=Mv=KR zrjD28&*5A1$qIWWycgaZ4kKbrFC_SmA}_8{p_jc!UzyxM#huvd4U5B5+_=r^^X4A~ zsq1uh+1bU*;LpW1Rm_ve^}lxs%48~iK$rb**K)mevUoe_TWu|2D(GSgc$&8&=mLnr z%-jw-?#yxVn1}0XeIa9?QSQ~I#N(l#&11wSn6mJVqvR{d=Ykbk-~A$ zg}0-;;a!#-{#6bmn?H8HiwHXDfgq0|h%>PmF6qQr+-gt@g8aD&6^`MWHnqa&FPP{! zwP|c-%!bmwbsXv_>xDM$beXbKRn^iZxGRxA?_6LM0E#_vqZqaq-Q>=|7&k$ye zT@fF1sUBFd|AgFsmQAJh0Y($`rX@wRXO?>{KVaNP&Kq+s;Z;ai) z>Ot4;<~f}VqlrL|p)OkcUN0<4XJ0uv@b;jDeq?SjchAEHr8rhT3ySScR9xbAXQ8Cp zUg}CrmZW#~=h+kgfIwS6%3|RwaS4z1!kuME(r5bS9ad?X=HE59(uGkFW}tYVb_z21 zRmM(OPU5Pw)KVtuzz%8b?76n+I`W(5Qqi(X;~1jd^{kajJ8RzN6p06`!uTVrKVm-S z$l*LrE7(d#R6g0%D6X(&90Er{fF}_3GG~4NL#O{73StmQZcmDY`U9hgOqY7MOi!vu zdhDQ;Xjtj}*;#J?EjdhOu!((8S%|71Mbup?;$iW8cd;z;PQil!xltGqzmzXI%b>JoLM(lo5+(8FkaWQ>e>|_3R9ocg(6UK-onwJ zrGm^G2R(+?uW&&my=QIqSay$>QitMg5vL>KxP)$G=@%4?7S&=e0e`-H~!38R%f%iwRtOD42WCflDprE>XTgk+(URgX7&ps^sL$VhZu z?rO(gCgb)y6)5DB*uw;Em76ROlG1sD%-@`7ROah*vPMXgbTZYH+;*64&My&9w-nB?Q5Zlo$i zpGI%Irl`g04f<3yq5LJ?WBDRu-kq8UP)?(ofp+Wxy?R5cJ zoks_m>r+{4^6U3S=_7(!Xe*z8d7j~RkHQT6=CY9aLB;-{ArO0wJ+Y*wzf190Uk?@c z(U&J?H7Eu=Wk4UMA=)ZLu&2?As#?@) zlC^KLe02B~g{U4Mhh;K9XughsgWHAKlj(doKI2?T$||SRtvC0=jEl7&maZ%nY672` z=uxd$<`~|k9&uhgaf2eEEHcLwp*(B(|2^==$NREZ`#>f&=p3kqpmP}L``LC=&@NpN zOUshUb+fyaSx5+JW%qzbo@$^xRWA4`i|V*w&$7^BevGC1y-_lMdA@G@8f2F&T+<3f z77ROt910>;Z;9A^AbI&!iz9w_{8|kB(HkuI?hOs)RL1ql?vI6e=2?x=^a>eX%>3x6 znWxR&P<*4y%R`U#1UVGFaCDw<$vY}mRD^xxzVP?Y$}f zTY^e2?(~$@m=nJHS*y9K&Atbm$whFu4smh8J;0ajc}zpv>A4?}tzKHpSb_NpBi$#` znRFj<9C386kE~LkC)njv-+iiMHt_ZDS%`L;szpQ*n_AOh;nM^K@u*xdZQLBn!F@Jd zYk8z2)aw=cdE*+N%>1}lO#OlUSSn8a%*s_pbzEfpmq7JF;D;xR8A>9wV_T`~q$3N@ zCq_oIGWI`YA4lfW2C37(85Vyb{*4}yR*)L*(`Rv`dLypIp$~>*fLLX8TZ%aDDgOrv z{bsD1*_1u+ls!N0{XbN_RajeH)V2#03GNO>3Pp<-FRm%>4k=LF-6`%AcPB`(0>vF# zv}lmx?(PnIz5l+xfA22`>q-uCkd-yZ9CM84xrgY={Ctbc?ikg}I#q6Uy0Tqr9L@$D zE{4YEkhRt4$JcGZcG3Ec3=0Y2H=Zdg+5DR=y&@h3_*jZ@$MZAwB&-bzr#R$u8i$}E zz1Wmby#3_&yGwdwyf+H3f}e5~knj0659JL!>+xbVY-_*W-u=6i;Nq3-o?Kg+&uy-d zDkFDXNu_FOy<}?KS1$#jmDiN=LKc2_u^l^WWzSa-itX~fQy!x89d_~fK|0#yPPgK6 zNp|Y%M#O%;wInW10S7N(R#~PCjo{#@U$_i2{sYTc7Bd}NjVAi;P4rux_2J;}7Ze3S zM&c_CrPOo+?q#n}^y`&^vAf*d&pdV>fHo3FRFi!QZ@>Y)3+>obqzK5$aes+quupv( z^?M;Ll7r0Uv$U;@@b>4r!OL_CZ2Mn4bN}~1ZA`(@zxpuSv_psUnnwly3*m136?zZl zL%TigetkN9z3W9E9{=NNN(={QVM!O(EsdB-&e0GXJMQpCeG^$h9vLnT_T{~_zK)5R zKdR}%Uo?YUo5a_hn7o>wztPbU(-^bgM2ojopRN1Ut5 zZ`=qI(JfAwZ*Wo?E)RVn<1P%#%kXqnBOnT3F;b3J!jyB~xf)8hxZiQOok{atVK{N# zHom=xI~@D}Oc3ovy&O-AUC)ch$H%W{R4>}+k&X-Q2zR0{HLttG@g9n?uX(SJuQxr5 zaGxNvVVp7WR9N$XrVKeQvx01wE^MIII$m?rfYfNM zlKWEFuxsd>OFjh-auEN9t@V=jm;hcYfrz29pysim!J$A0kBClj=8L-#YuD$cO8E}< z<(i2JtpO991Q!!*K?53V;U zP}BH=A|JW*HPwjm5TT+tkQR|xlc4V@y94nkVtkQb7$abh@X z)|Zh)VA)pCka=^xPIHp833uQ9+J=pZkD=TGS$dxYr{G7QcRb7TpJwU>4zMYc<0d^T z?b2=kMhn2yzu8zI-KIOw*{h{X^ik5@6WCnQ68mk-OvA3a!xmL&pc+FpIMc`*C^M?iq8yR=y=iJb3RWW_}IdqOi>DT;j5{Ap&wM?^S_5LA&5mSuCf?r31FJZ=YZDI{4xf=tjo- zIz9eSCfureTnl{S_Hks7zF;elE@aishjbIsh*4uK>Wy%~qfSgUnt>bLbatvgq=#Tc z&{Ct9(CdaFikHBD&Nqwxd9%jZCM49x?dP#9`*k~q)T4b@w2+ylqV-2>YpI2Y-Bx&y ztCrbsA9nxKh$p}Ej#c)%q}TO4Ixz$cwWsaZ6Ta1F6A#GtaqMwl-mA^)7R&2(*Y%Ac zVha!d(P3{24YfFw)=8$2pj`0%!`IFZA_APx6qu85A^Zu>{l~szq(1jMo6Xs~&#l6P zn-!=uqG*_>klIlQkCF38~&LPv1ZZgv6i7rrO3@p+8u z`4{fvcK50J%TX1&1iG>BjEp!)c;*q@g<_5gA03a+-I2bQ?j8N(w+JuyGh$)OwM6?a zRw(y90TQDcBSn*S&)dbDC#4#tLz_w>y%$b003uZTezYAU3I9WkOJW1VDGXy!DQsyb zo!)NTE^6E^{WT*X_vID3v&N#VLs4%!7>GzBO(K1!o)}1%7)mNnr#knJ(nZ}&EFF?< zLei@oM=YjLC3P`QH--Za!Am0OBMAm|(s9y|mLY1UckK9n7!Mdc91Y}`#4+ViO1x4S zJpHWq^rgtq@}KX=baw+0_7d27sJZ`DJ~P!5X{6e3(k)I+?|q$7yL9IEtzv$c`>WoO zTm&?gd?y*ajPXvGmZEXe-!PBwQNNk`{qYdzZ3$tod1F1=WUsKek=MUt8-!@>ZyCRL zo#zB?eT`I0yq)He>B=Ns(Oz1wG%v|xr?wMUlfGmatX!_XpVk7?%i|%6Qw+d@byK%x z*^Yv=BSW|?oOjbr;{O%Qe;WB$c6_-ov)>%XZhZ$BRA2 z9ckx9^y%|WoAOF~+s$^@Lk9Z`N`M(fiRf$EOHUD{FO{%`l8fNZm)9UdqyL`k^ zNaQ7ON|-NrD{H?TiWo`bWB^4>D-EE!VIVohMyU#RuQfpH1r!q34TOChMonW^LC8!& z@)0ZiR&M?1qiRKg3L8Ul>?wNszcAsQ8mE1WbK;r|kmU2HZMC|%IX`X9+kawUw)Kd6 zE8?remI`P}JB+AeWs-*I0LYI7XrvB6GRz-As1Tx*%!4gT2IU80-cVfCc8Fr&Sy{H5 zB{fL5?NP{b46zRe_T?VjyoV;jDCr&zMU!Ii_}}YRk~HACxSrKBFIS+3Y0!deTd0CA zpk!3>Ukr<&w7Yl=w2j0j3)e|Q#mfSKvD0Rj9MA!0bICg!bH(Z!iL~Xyy|jj0T6(BR{`=jaQMDE))MIm5T4BE=#c7gF}YI zymgE#^c->7=ygY}h5Fyj?+;!|{ru$HUe?(zBkiY;C@3h){^NC(O(z}Y$$|&&fXRx8 zY?MwuY;$s9A=Az%d-Ny;v6Hcl7}$+cLi7H=B?!Fh#P(buudnz0k9>2)ufutd?G_vH&opwc*e}WfudffouXi(D*K;D+?PC!Les&`{u ztAQ(d393>zDF&rgloYLezLO<_1T_Y(g$iD>1d|+sT)H4DW=ytyoo~U1AZh^d(K9ub zSnUM1B9PWiRRt@;%wpu3f~n=qbGIl<>=jy;4VtAu1<6Lo@J9H%!hB4eG3PI^v1f+G z(J1|D%}>})aMImO{J{k@DIiHHH0-8uWnL`NB0_vrNeWmpS-4$Lo~?jifd#)Ez;OZA zwef4!DyvuMpFe*Jwf9^Fsf3#YE_X(inifxQvtl!?GQGaFxU$4+f2V3;ynJN&2G>oO zEEL{%OJ%3Ju7OTFbY@n854D2&zLPHqWBdfL$|8h zfAPyc?%`1c{yqOqKL5@Bg@;9lF2jl$s&n4X|#iX1NB%zpE<1aayhWWQ6w4N*ah>A|5!lt-2@If$TDpe6nMU{YTZL0#C` z;k4D#pCvO-G{JVdi+*3@-}QR7-sj+Vs4sdEsXTk=Hd1?ga|5WS%yr}6enR-!-prGu zI38c2ZJNxsR-cSO;}rHhyT!M<9G9##rLmh)u$&%)l5?_l^C5@RQ0)#M2cZW-GI;GS zK`kG*Ny7mIrHEP=68}>x2a7HnG(A^Og7oVH=X7etgkoxfOt`>-td5w>2AO^R)#Xg7 z4ExM%xp6Za#Q}G+0)&L0m}aC?7#Rqra$F&}A%XeSh~kKF+2XL;8L(hS!Y-gJdJwN` z60Ou8?iIt409%srVD;e8gTBZG!jpxY?$EdyZP3s_vlZS``JVOk&wd4b#%_m1G{yfJ z*#K6{QK=|CV$bZDdxuez;-SF+B|3Jg!YutaUE@Ycs6;XZ?+4Gj(Lu8PHKBAxp$i^`syT=H5fT@v)@B3@@6@a$qfh%b2hn#AV!?(Vd3!#r-ya>5M^U1T&6d?5$c`Ehtv;;vPb!CZ(t^gOre*o5Q1 zrNq~H9y{)L;xYps`p>}zl-Ncx+yTev054#Za=H)^2*Aqy%`SKX)As9@Hz6C@NFRHv zG&R~WxguVn!pa=PAEbsu5h4yB-}qSMbVp>&v}i)$k4PUMfWa6_CrJ>js)CG=j*v{7 z5<$C%fOponIn~^4FJwt|UC+ZxB9fut-sI8w_;L%^T)jw+@#FeoXJ-fC zl`x3s*V$TGl^ay0m!MK#0fLqit1yU)#AV)>`sjb*jq4OHe>n&K=W;IjjXy5nWY?dK z!LI9Rn;o5oY;>pQKBWViMN6q_1hE~*s$un%YVp_}LYahudJ4E~QV&yUOYb57aH{ufD5 zX9!n@@1y?ezI$5;4vc5j`*O6+!(lg#L7po^0b^t=;pk`;%?>fmI?MjJ=ySiWqH9Q~SzEn4YXC|&mGtBERk2l zTBisvqvf7p$!waG>$bM&5g?p)HZ4-g=8lT^HL0>VEpE}Jt>o$iBOD~&H5N^pO;8PC zRJmIe@O@Wt$_!EE%0&b-;q1`M`+rR}hmhb)G~-A(uHK^3#BH`OE$_7VBW+A<#&%bY zc{Y9I`P-}SP?=(Q6}J$w`7@k>To&cnDcdZrXt}dv>TMZBjsX{w*3sVg0mdg6)))NZ z@m82ki#P}|{_XK~n0W14yH}BF#oEu{aOK-D(=M$Gt*qRF$dd^MsSd9>pI=VXnFzPZYal-t|(PvL#%Cu9DpKh`as9se19yyCzZcqbZJKg7@9 zVTi=E{X0(uthk646v)UFvS!dGCW5{9$!0t?po5oNK|KJ#=_be?39l{&QIyVVfyF^nzs$4==g^St0)%yk5U>TW}!^?R0N zwPEbSj%UdLyfE>l!)x2Q*u=_3sxVcq^S*P(WcvN9EoxAmLQ6GyKP1(hj5yn6m~BPy z9F0Yi#I!37h!!`Kj2|&JO`FoJHOZvz#%^y=I+spkZm^yf;b&U;1^Jggk)ii!XPqoB zZZE$PUipV9neo->4{YV-ZrI~3CY8vty<1#F2T$DODe|~`9Lc*1%+s3>4qc%G%8kL) zI)<#vhA!lU!MSDL@nN2I_)7tGHjDiW&d;N6cBVdc0R(QyN&GRhsWu*S=znNWM5Eu@ zQDXWvG|iQ#{gn^8efzNN&mN24Unf*C!*@!=*aI6K3NAgarK+l#P9y#dmo$BqVc0^m=@I(@0N`DXl`S z9Kh$;3j00OHmz7U394Mhza)rW+?{XwJKS9j$&_o5VTIqGt~S~E*!gV(3J z*a&zrzI`2fyn7ri$`WSB%gQ*A+H$H4}R zef#`}PKT{*KYshBpsRsTrFZ7zdCw*tEj`$ zbG9n}Egtv6>fdFpC@_!#8?||iK-?zq;NG~mE#LTw#+fR@Hdy^`j&!T^axNOhafJP! z(ow6E$*>t%SXdhL6zBfjKNyvB6Tlb!w3~DHV}M+LErO9_FmS>~RB0Ld?#kw1%bB9` zdL6|oRw}t+@&sS^t~O?SJPTB*;so`>i)88>HE0+92&L!M5K;rkEPgV|U;3k8VbfQo z%6V*TA5+vwHIP5f;3ztIdIHB4g+;PhnN&!1O^rI(V);?~y`4*)8lG7c_z%}l1EKQn zFXiuPa&0M2t|QI8X)48~3b9uF903ny!EBSrKlu!O*ZIEKcYSp%e}e4El80e(lyjCd zK=$e>3_u&G;-9G_T66s0A~?T)ICk>VO;voK1U%28Al8vYT{Y$uqs%5hT;cKZ@A90O`QX5 zimjB=zb15D?{v%@_pSAOZCXpg^GuSu-85?=REg4W>Ig29uOQx|4*lMmo1)2;Y!48vLy#)+Xs1SX9{pjdu*gB6Ui}GLBiJ@{d@a zTXG!5Gw8vK4~ObDQp%*`{@#l#91W(HuN$MT%dr;KSnce3oy`gDm^E|h>iX$hAxb*n z6P$t+pGMNf^Y(9yrZPun3}BK>HQ#ogud57?&+9zzr_A0%VK>0R!UnW_m;-P6I8K&Y z6+vExzElJo7^?m6w&N1Zs2GI>^sa2w5=Mg)w13zjQ-&QgO0se)#U@7=8FkHxGENVZ zho2`cLmKpupuvIdul!{6$>j8k<9MMRSR!{OdDdEFvd=5ICtiz>>#z>hhAj|mHY6cS z3S8VB%n*+4kwop*dMqCVPv4+rGxheXI7lg0OH^yTb;jFk(`1Q?rDp2;u8~Fs<2i)0?6KAFj{!@O4 zGjEIw3bxm=Pff;XEh<n89N0Yf6n3XzSS?D@=StD-T0M1p=se{f z`>4p`8E3AW*3tL>tGWTf)Zf#QW)gScJny+)^cE0U9HSfGooD|V<#v(ke!WqC2sovB zj&`oSOMBg*();m^<#%_@^JUNK{Y-$h{*Lhrx~QAWx^(fuVRvX&;l9Aou$8Tf2}c4- zRqbhbgEMrJ@#Jlzhu(|UVnE{}8$tBQD4OI(xGD}5jwdRrPy5H1gl-LC3&e!yt#_Q| ztgxt5Dc=^e_hoffv2)EQ!J`7cILz1&>;w`4g~`lbB?X+KgRO5~L%qI^nZGYc1~UQa zR9|>J<$$iSF*^Yo;QYtV6ZUUyfh^u!TwHu9639?^pEM~?$~97V?%Cea@VK|0G+I>^ zdCGDfH8eUF3>Sz~rfpeN%=dZc3+3jz$%IW+pDLT2C-Q0s^qa9sT^2u)XpSX2wE-WQh`L!f%CKl4}fBiKwGs!c&xg`x}$)tJsiq z`!?dnM<~VL@Q8DQw=J$|nb? zTe9;;%_MSSJ;{e?(3EO}XdpitvHRnB+p3Iys?^X!e);f=9QA9|tI0Rs2<5;7Wng3` zh>Q%6XkrnlLzN4oF2-bUphK17GmeC7Y^otoly`k0U&X{76730k1}>7EwD+@r(;{WO zUyTM6bgCbQqw44Twz7>4g`opf0kWo2qsQ%0USzt zaW98DJ=Jmm2dR={-D8$2n28}o@r@UXxZ^+TPo8&c56d}tqtnrzpd z_D_G$*8YlR7dc(IL1haIW?DI`ItZUGinN6Mw`U`8$m1t7FOqLo;Y>ToorsOikt{Up zIN-6at}fv2?i+o_q5h4^eV_wZFxZnHE0eHIm&*YCXlvB6^31cX-fv>&NP^bOf#mqD zVr!99`CqqRUyG8>hw7Jm`i(e97+Tp@nrXmnNM`RR$;0xu`s?(W50b=IR`-PG58|IH zE$g#vw)r>X8wGR3xz4u#jraR!N=4dPd)RySH1knl*^#Fd&XG8I@Ba#HGRyY2=bHoAR3f$wdP74iL31E52+E_R zffK4Sxe$e3-O%dSuj1OECvR;3Wz7P}XTIeHk*hNE-nJfhQb{rGI+ynlSz{5~x&&M} zTC@l75M`p$s-cd#I-24n#&&d4vGnpox%<9Tup4NH>!-#; z{Q&$FLIO_c>w6wkjdyY;y?5U1$5e#*?`EB{va{FJRD0##l1aKTB8m3|azx@s%F)Q- z(BtLD#R_@YpLdva!KmWR1sKUo@PWhWXXd-!3$+3hH2B3vV)8$sf^&%fwv#rqcPj~s z)c{N!m9Q^h0uJkVapX6PS!(xkalcVIEadJ9$BZWkUz-cs`uZ-vIyHu9sVdG4Q=N$p^%p%;Q9eai=>V;cjO+Am|}CdZN!J! zD;BhCT^H1%!X}w+l)d!N;kuA9BHFul%RGd;5GsbIPMZR!I>E?F88>97u0xdj+0l)# zI2i!j0p(>OA)%PsNz3BHFB~ModA%ZhOr}T2O{)M8@;o>kd)0F@c4nJ!q>k+~m8;v# zR^snKCk(|RJ_la=r9b^|PelKDowoUW=cHEv(=j!FWn+g$p8okQ==Z8E{NojV_Dd}RH6cYWHj^rS%yVOANj2=X>I zZLIT?Jw#4aIZxWK6{=jx6saORLOhWy+$h0pw#T>eg26lq(88HYK5ea^PHVq?j`@d@ z5#i}W2tGAwxN8%gQ^w+&W%uGZVvO>L@5}f0ju7su*OywgHg$CYzrU-CJ!H>yp%DTw z!06=Jd>J|VGe^HtlmgH%RREsrdN?~e@2OC;R4_op5Bj=V0=S4Py;!36uG%48X|kA& zJUa_=>ia0Qh~^T_sk&zvJ!Mw?)tc2r`7ULZ7nT;>w#owS5Q9lGlswRer5=`U|99LT?WJ*Z62rnPT3_)fdDdx@kDl2c^CNlJMZ8_#J^SmEaz`zK5)R8##j5J-GyAh-|3BlW@t1!Cr()kLfAiun}bTGBGBa>6Nk0{)yWc^QuG(M+7bbKCn`UX@p6J{Y@Mib6R3`iF` z=!i_CUOa@{bY!y7Zr*%%tcTS*_vf<3dW?>(1W7!#yC5PG+OP=RoOhuJbY0(b+Wrm! zB0(l5Xjp+)Zc@1H-nDn5T@BlZaLApji;bxd!$=)~p%$`*gBvEPWj!2Q)`yS~bp+XE z)x_2aD}BZUi+#uaO%{4c($W2T?C|LS9a9EhTE4&%3e*5?*x#}E_@Lm6h9D%MO42bR zjxr`N3th)v`s!+HWSwe?3R@1SKA`xop6crAqCV{bNn8g&ON=!vw{6Ad@vwI@bl}a( zd;DubIpAb?d;I_n>E=>l{U@srupwfr``^l!PskHLA%6fp~&rPUi*T>5E}I0ouU701ZJ zaFm|gw;{nj`7@-;fAguK3WQ?jN0$3l=2{%q0PAr+$*)G`+#otZssvZHcY;83kT#@X zoFsbFl}kQN+dBVC*T=g9A!upao46PzxfGmX%x`p&f_|;_@eP6@?kj}^D&v>MU~{Yg zs5Jaz%1^&ffg9o_SO@ed!~+l|iq&A^DI?rW&{Xrvs;XwBQVr&oM#+8p=Ua&)k+d{c z+3zNYCU;dRvPN!x92heAT?S=8q)K!PRS762Be#TBbEL#cO6BXd46I2Wt0p~{j13G~ z7QXO+o)dUNO0qnk%KUh~bP|N@`QwncmT7lP^7Greb-j%B!j?NtEfH0i-*LUc>322_ z2yq}HNqK&^+VD4&tCi5_Hvcl#LuUDfI%T*HqmWLM35rU8Ch0XzrHh0fIE+VcYA8uo zVWIzsj*c$>1@h#oELG3CqkbSjGIOR)wtfHeV@YKaOe`H zp#w0{d%EW1Xq#or0@jtR)&^d@;RoI1KOLI&2NN}7c_WX2#1qS(XV=JAoga=3!L{uwv;5?7 zvZtaHzaFEDdVX$YH1^;bmvGTA(?=i;VPKVfDPgqu&U}c8(uT65m*j*7<&t32ciz8> zHO!XD(jPaNd+`%}F^y&!0k-g9dk53YeaGqXrmU@WBYDtz_S~Un-$WwowXkvoH%*|? zI>h4%d3#HuFrTa3>_=TP^(Gw=M$mf_nY!tD5#T|5^A*gNQT1%%%cNq==vgxe`fbx-EXnHJ8~f; zNkdY6QVm)wOVe%3C#UU~RRBvL&Y|O4EBjC1kctW(VviXYY9U9HnSEcV42<^!lXe_80Bf`>y-_#R2eQjX!a~ zcEDYD45H{OH1GcJKz`n`$P*b~xoA8PH-q|WrFsgjh#K`}zlD0w+oT=`2iqTce81Sv z>{vKUm$5c);-kRmAM)g{_Ck`0UzX0n9j9$5)Z$2?AC#DP#(=s^N0$-DGQMrVcDMbc zUq&{HhD_LD!WmnrI~&DY`;mZB0#u9H%U0KI{u_R`-GB|4c`)E)ztqf078}+F$tUj?u6w*LX zn=DQy+l5Ao?GrDs?Oo418wFEFwA)hS1`bNmLux*8xa#9St#}{r6eiH8U;Q$fCdWYL ziY-`6pAKBlEF=D?uVdrJBm8*Av9cu0*n&9+^-PhIqGpPtKDHWFsVv8uG*Pn^v zzmVcj=qU12SC<}P1isj8$2l%lW%frcuD|cshT&^tvRd{fz}$%Mcy=#P0XRDV;|h>i z2_*p49-`=U`NmxJx4=LHgK{`(_S*W_%wu?{iY`TrPt-xVL<6H1Q8tgn9*Q)2d%@xK z(e;881+l^AtX{n?GMArUPkW1H8ml0On|?jHx&5JuT>oazL|TcJHiZ_m#wWuew`R3~%MG(pr=I2QEZNu8Jrvn+tIYY5Nk*$&>9S%C zuHe2&&3XJ1Mb}~Z63tK6`#flMRkiV~t{AmCoU>%JzvG3DO(vF`FrH7W%T*CSlP2{R zGm>zfrQ6gVvV*|obn>nRA6Qv^Ph9fq?Sxi2a$(B%M{p`tTE@-PzJmi(M+a4$%|t9M z*<2-7!VUZ2Q4@@+oWE3*^iHiBP0YOC3$<|Q(G4yVPnrc06{qM9+!x3`8)ns1@l@na zQqjjH2q09;oK&SXBgg&awCs`UklU8x3yGoSMXej+|0~7_Yw0ICkRCp!j^fv(C;y18 z`pvo8_R~is_J1mxE)C+6d12v6MY9F;8h^Omu*B!U| zS1vL9phjiHErXUMmxc7Wu)+@lDjyCq-wRVl6Xqn^a*>(Ma3O+d4!|1@WNoQ9b?xoG z0C^QaPJT#f^56w9VT!Oi);^Bm?K<;3Y@Z|kF`oF@kMDGi@uhm!7zOAU50J=HO>pN} z!|H;6R{9`k(&sR8lVCCDnsbZ;Y&&o?FB7p;YPk;a_wq3lX9Ctr9tFeVYlI4ZIfgR@ zwGU_|+&OAv@}o2ws%8>xU;6&&Mk}69-#%+qZ1cxiWzOie=&y&yoiqhB9StUbU+AmvK%rz#by8x$=DTGno?}^gP{~wRrdc%5^Pjr!Egj;taY7x zABW?ta0`0wrWNOA?BKs_xKQcqQI+Hv)u>t#p)Y-0_xqx|`S;gZ+ltWyk0PIn+c2DK zEGpMwt|8$ycHky|-pe!tu--9Dt!i6pTRy#ww;RzhGD45eI8(nbGmiUENRe-b+Na6i1)qNGz~~BDK}ZFtJLdA zq>D5+5eohRiPuQ>b(b{b^TwQr>-&R!oSzjo#%iwo8>Z_p@ijBD+fK9DtC zt?>+1Llq3a%pjK@cfH!g{G)F00ggao`p34~B+M;GHN6B-8|f8n?YEABMr*dSZ8CXh zi1RGJUw$!W%HQ4ZhoF9+cghN%>}b(r)I?wOF(QGcTJhSH*w7^C{8&1OON^!b;!Hwk zP;PBr1If@iJFv>svgII-HnM7=Ln8z;X+`l3B&p2(`|`)tmOx>7X1GZHpw+#emI4K- zucOU6%!yTJp4W0xdZ-#zd>HGcLAf%fFBz99f_9Gl3K%u_`@eh8TAemRFEKdv1;Fj! zLB0oUd#wzJybuNM{#jrkY;S}sANYeuK+*2jrdOUE=iNzrX5doWV{UNs{LiVoLzP?UQs*P<$JSi!4bCn!0sUcQZ zWP1x%c@02UFxcdf_9^;+EGn;!6Kje`@k7oW_-jw73CFBX{nU~W1==VFCWJIZm4m*( zcJ4QMMWt4=%XAKob!+NL%My;9ddESJGp4#JANgk}!noQb<0?kbgv(!VMHr*C{YPuT zT;$qr;wbb~Ce~;AN_nOZk5i-6@-GEq5kE9XL~l0p#_4yPPM5BPl}qNQdJ7K~h(qR< z)ES=Lg#DN%D$z#pW)Mc{cogen!Q~*F=^P;lP$qXXE!Tpl>(VvG?hTpBG-Yd{7hY5_ zP+!(%(KOWhU_F9PR+JvIT<8U3>YjG=Fn|8}@jV)$c1^M>N6g~rH8{a7?tOgY0=a&; ze7}M^kIhQXBA57YjwI$>H z)LMTQ-)E#E751!HG?0p0MYJ0WMv?XWhcx~a&`62~v*M_L8uGE&M#-rx~!}OAry0{RsltK8#Qa(14T3^}9Ti zAmgVuw54RCzUk-)(s5aG-|9+H3#vY{!Zx^OiZ2Yl`Hb}InHT7Z?Z-Y?8jzttikLyf z4HsWXepmmo{-{nb#~nOaY$66{j^4E^OVsmGO zRG8!*{q1ZEE+Z6Z%9hxD%xoCqXG|N3M#q$d0ZN=$=${=xCkAZC+BVy2Jv=TKs68BHNIhcYr zT6WKLw?L+JvMoB$_va6;;mW)Uvd@0d?EyQm%@J8^os8@wWOFT=#C*fCBn;-FWdy1G zEU;-mNcj-EPsS+y2Sx&qZ$dB5#27jSa6e&bz}U)Ns9NNuX_}jp6Q`nj4>0x$LSfDY zsE~j$dQ5JoqirK2>{xmat%x5(aFkSCBh(Zuz9SN%JVfbIbnlc)GgQYVqLx|}lY+j< z6j*)7Q&HHRP_QNg##tJ1*^3vb49+C9xQ^Aaj!x9Gnuc)oyP9vU`rnbaV}bG`ro@}! zjpj1xF{K3FyQZo;Oi%o6E+i-W=*od`(mioS2MOzU!wkvS<>gTl=!<^728>OV13fVa z(>$Y@Ysphg4q3n`+x`>b{VVL6w$8hcZ{T^t3Q=qK&h%6d2uwuLqdtWCt-o79 zA$H5OQf)2w1L&LodFpDko)QT7T&@BpHTAN^>`#Yew1i#?q|3_Py_}H^oEN#VYU&I% z5`JSVV}e80=NJ|T+xs@FbhkZ;K9_P!vxy|*@396$(B9Lj8Kf6bTUNv zddU7Sy~4=T5>$#0RbH7kfokc531+nFQR-i;Cj>y<{2_0Wgp$>Ix=G~Tx(1=iSb?IfH9Q*if#r# zFMM<2iKa8UuxD@6Ov^;ZK$GcawM54v#34xR{(^;s0pCMy>ls#pK3M3NwYYsysFv)q zky%DWLxPt1IbzDS5I@-fS(*`vWi31-$*(lURC84i9{Ok||M z#3~HPpK|*{g}HnJ1#x-;s0wls0htP$Wwu(s>g9JmvTvSD%RHvQATloZY)!6!b+gR( zaQ!5vl?H6aM0F2Edtk7MBZ$0KTp(OcgNcTu`OWyWD|~PdUg43GBnr*i$4@B+j$aM} zk)aXE!gJ%+7@FGVQ8*Gvp=M>R93iq|{J|#o3N!=?1{4zeU$#C2lVv8{J}DMgAC?s0 zN?`Pv#GnGOozV$b3AwjROO1v!A=S}y>7fq)J1r7lC;rdKcs%F-Awt3+S^kb2IJLNB1CF{Is+Z?h-jTwwR$40hT_?4734y{zodUC^Vlb5{ zCG%o01Uw}O`M~0IN>Gm~JE-i}5w2ncdGyzrPf9bRj3j@OvG9&~ilJ=z=*>h~tx^W1 zUhWPf{HB4X7e~qb`EZ)d{pG(eVtRRQ^-AZ6g)JTgQZmeSQ=D}j$4GSb^#RcO?sWMs zMs+f6z15dNjW93qaf9O(z=Hg(U>ovI9KKq7E}t`fnsLu)GLXq6T0Pg{y&*42s9+7} zr^bHUW_f|4sbO*}lF~MF7wg1vj7FOzH}?LILzHNVvX3A1?sIlpa^SkBO)S$Dhh?qC z7%qH`m=GWrNrFaSoU_RZ;X-g2$W7R1WX_QX+ zYU0&(1T9OlrW+}>>h^0(67w2^)S4N#GRJ5}H}_h$Je_k;>3R@j>OXzLTf=tH{SrTAfPXmFg_CpkJ9si9kQvGnnozDqEUQFKyqs8X^3K1uE6B4b3^LJVGX~mp)BjxxJ-2Yt-^PbLEMH!3Nceh|#51BnlUu3D*o*FY7U4LawLPcWVuWl`q4AnG@xYK=AKyD6)HJ zlr1nz>pw|@bnIQ!h3wzZZD4p1e_-}3f&+IeT^)qUU|{0emYgbscLoCfy&uo>Fc`7e z%xK8Lxp*3jq`2P+I{91LK^RiYO_W48RF|p3*~)}7!wS?;p&YGmyJM6<%P5H z>-}g(?YL9f#iplRvc%lQwFp%$4o0i{(&^xveZ24G<`;ZR?0+rNMKM1vPmI~t4JqxDp&5t6#zjq}_yeb`xY(eD-?VV}iau<-q*b;&hK*vMTS zi{Rc}+}9Jq-D^}8mML&;NOa}Z)4%i_@Z4!wyxLem?1Jd8sLOjirT%f~yRD^6m;E4@ z$qbDA?$~VvCGa@=c$VYy%#pQ0_*rM`*6DcASzR;j*F*F8;G}n@9YbF`TWc*%Ci4$G zI~B(14w7#>C(?t0)JZn(m_G_(8cz?xxR@}a_#CLlCw7Ug-5a-wQ{DGR5|iFOi8}?P zjgIabfy-UaiK;D6T556+Gr1dE@3xYV4#P8Wax(YAUC74%Pv7!?E@|RS(x~^)ny1KT zUO1fmy|ppHU);2UYpiJ(2^Y)^?Nx=;7!0ifO!RCQd~B{;gYr0?x{-S>qa9*AR|T9E z%;s~fue3r&?&~qwUIHktC1+_Pwf=hV1u823NawL%y;`(M=9){0qDhgbSpSa}K%t`T z#qNhNi(mD8NTJ1vJOX!SIn3JeB)k4VGW)FncIGZ$fS2+8A6}nOQcti8ix~WY0MpA+ z-ngbCY0a~@cF5=97L(r2t+P&}W9~P1dZD}A=Ucy{nW{ETukIAM9#2UP#uImUm(A<1 z_2{$9xw_JJ2W}cx<$WUx9IK*pSzgtEn~b!6kL!dq*m#%aBS&*s zRkg{Cs9Mk?%43kt{|fn@q!jpB>>{UktGWq=aQ1VxMsH{a5^*1Bon~YY7!8iz<4TCJ zJ9g)l9>*7RQ-)NsXF#@5s_Q3%p-V4oZ$P&>X1*?i-2o z#p;NpQq$Yrq0nT(S*0#8WUeptYu=xh*unw9llXs!Id)SsqmL2HIb2!nqtwD459JFd zD8C7X*-4Ys{EPn%9;vi^9q73G6<^W;oA>T;A2Um9{V6m~C6E_;0Ohdh*hjk`h8n^G z>p!2*SnMc|v4k{PjDPZ)Fyg{g!s?<{-?r(O{~VVw8oi?KKj`FPPc<~%c+Vam?@DI$ z3VC?eH8CcwdBr{B(t4%g8~gva%%5J#*;(8LhyxSeAb(TJ-_)^se3R^${W(|yp0=Pk zSw)Je(0PA@=jYy#1yso_1Qv)Um2&~}x)P8m?nQd2$Z)QH5cVmcr3NFYeBVm%4lM+~ z6>737u`FTCLREL9Op_n&f7|}|IBi#iCB>zY*t1a`x|_U^rY2#ohL8{Q5%ej#5bSS0 zdrDfk%uQ^ej%6Iw7~-+OW@pXoRO_%1VS!T55K65GJW?cKG4u=Tm$b`tIG2oG)m^3x z$8~Ju&q{(b%;zhXHwp7B68;;Drv7aBcIk$~rvgNfzr}ee0ZQP;N9Ui}XQE9}Bfwx_ zXa0H!r3N!aZmP@^H|`4JpWI)v^D_j%bKqBdSdY6LcUjgMsq7H$X1~=2o3mp*6ws+& zq%$Ui@g&#|Yjg)ckF^}#g)_Lr5#^v7TtmW-?V6SKs#<%LoYF}&m zmAN&rQYC699H-3XMs8Be1j60h`~-bW-_xA&#ZYm3kDn zEfrU#Z!N!ERoz)}D5A?sq}zUYn?3C2(0+RJ^oC4)Q7F~6bL~4UFQOK;POdMadogYG@*nwv4C7ZlcI9%r z#aJ)S1$W$kty5fC#E3ymv_ukRGraPB&!gHqhPg#ylJ9&(h!^86UW~)Z8^5B4%(4Nw{b}SYfLDi$t@yjVxcIkit8#TynX1iUOE%{ z5;F1C0V2U4;u*t9OTtaS?ak?6vZRCM`<)?7K&6TZszEI!Blr8CK=Y20qrdP7M>5_> z9jKP0KLRo-!YwZ0F;w9GRV-O83(q1DJp^~8F0+I*3`TV))?)W;dOY@cxXV-m;!MX0 z0!afSpqebS)xns3VzaaOt`Q2~zD)Bwn~#`-XhMMLj@joTI;p^f=ho_Xzc_th;x`R5 zgl${7N}~T7KgbnwqpOVIcfLpf!ohb^|B62Ce0#81>})*k+IDGmxli3)?ssqOdIv`KY52@o3KbL!31q*%-729=dWRBNa!J0A03K4;cQyC^jcl{x~orNK=n{` zd}v8EZ?jnGF4|((;c_NJtSWKP5yCmkGdfHb8$SDM_~oIL^Ru0Z48y+5PKl(?vv^_h zL2Df6%3nc`o5e;y%AYx9qr4u5{)?Xc;Y-B8aBT8p@7RUiWA8M-)B@qM{6nw6xNVbSM(i(hbrfLwAY}prmv&7Z4B- zkQ%zAgaJkzdMJTm=o&)$+uZwp&*L*|-F4SOm~+lPJO1$tNyAJx72qt1uF4F$vhk#5 z%EfVWJg~}VuQeS=0ecvi+3j7eJDBuDZHld`foS$E9gp(7AN#+rxwT!6U>qeg>EYM) zAxt%x2##?K5Y3^Y?fhz&V}Hl0vf~Fu==h`O)0O21kns&`i=n5X&j_{=B?cpb_J*F< zf2gXEsk7w?;%e^R7idSPziBy7RqhI7h|E}keq9bT@;VK7>6eigq`nyAwum)tqM)-s!J5^)MUE-ZMUU78F-io1u8CJZ4IfV$kmN zGVSp68Z?je*QV-wr zdvN!9b&Jkdj`;-ZP2Afzg4{-*e(@jco~X;M8AUZnDchktLpGC?F;Kzh5kyrHJ5QKKYyYsEXE<9Y3*#$ zggFJ#mzsKYS9{)oL>)$&v}WFRnCOmodRX5VDMbVrYl$Qr5#p?+gLp;~=j9aSLgZnv$_KO6Pc5R@P;TNVT5r=ERh6U->v80aFuhP&+xhoA^Pk4nqaDx72D*Gs z?(S#Vz5ezzk|NaSmBh&JdfPp=Fyedv4zu^QuN=TLjU~K+TPNtM8f)k8;6`{ikm1>Y zY28rq5N3uwA}A+UzdoKo3G89COiT@`WbIbFQ@kxwo<*{B5@;%`7sGE0PHgi_+w4BG zPKGlI2G~!QN1`dI7`0-I4o*H;%sW*cphG2`7-6jDtn{6H$vwnqnW4hVlSOqHB}|8> z#qkXh*?qiS?RN517-k~(<&%yf`99$n0lOPCyQ4(uYFM4~_44j6Q~S-6z3uFk6{3VO z$MvN)tMRZYzC3rEh)hWzTb#{&e1#Hsb(xlUUtvQTP5U({s^o5YZhpzS9%qbBH;FwS7fDNJG z9A=w+JS>dCfGv@yE9_X7u14gX4`KCzDW^9+CO%QyppZUk{3MvQ4O*l$5qVjc_C=Ci zmILnCCUT@m|H$0sNHH?_Xh{Hn>19$I7$X&)?U!AUFS_c@@m?pQ~QF z^lFAgwh(wXYV^$Si^HbYsV#yv4A_!^+Xe~N88b=#HI6~%TCf_^(Ur?u!ym1t3^l1L zN86(!C*&F`#xjutTyjFiP@>E)8A;G4rmK z9LG)xonn8!-0t6s^Gd@U6U!&=}QP? zLf$dLa0)$l7EqIIwYb_B*TEy$KEaXmdA&pU&nt!fZF1C$7jNgOHh^*_CtB&>lZl?^ zLC*GHb|MluTgj?n&4EFX74F8P0(UHcKXN?TD1ZCakT9w`&SwN>GA!Sy!^TT`6bw{< z$fjBQx@^c3PEccCncfe0=zeJIBqZ8uX?M_Y=cUu_|6a6}`E&U$xKc9GDlOkiUsk0c zVMCG`A6U`ti5xxHNH`klu7WDw_KN=eV?fRk>EKxFqGsu)HId){y*-l|GnNNn#+5)l(KL{Li}Tr)sg0y zVXuv#+UupwAMzi5yy_TjMh=5KOMuLsp!Jc5xaU7=yTjt)(u#lHajsqRS~Q&ut5qfk zF@4qOq)`J3JIp86bg=NT*eS>EM%3|Rs+gZiP`B%jpNH)U+qW`+N3iv0D6r-J3efyt z?k@}4g=bJXZSs3KPQC>kTr<7LzkEy}fRsg9Q&;}1k@MNK?*+ZO6V$(XBM@#QQzPP` z8j72%4zK@skT+qlXSQx1F#%XV<#Y@Y$>>IK{thPdofIeo(sLl~(~|nFlSwt-(p|d} z>@7ZEjxgdXEh#xX4U|=vQFkyZwi=t{lAJCqe_Gq@SgvQJQijF*w9L#54iXa_t!URI z{Or=lcy166l8Tkk25P=GyY}ZOw!YIrLDN^|)2~-Szq3<-2$V$KUSCHrJz#S#OjA=c z!MvSEOM87oH6v)J5I8sq&G;PmrSi8wzY4q)q%$txUwKX;+)nwbg8|0#Tq*CTy)V?) zx1OI;B=AI-{?i%DH<*Tj>0eJGVQ+YW*(5LwDQh|OEZ1A~Y1U$kBz!31yKDQIQ9w-W zHP!wyf9^mB6u2GqI%rL4So_$SSqE~>?#YTVw!QjjZmIr_PMLLz9G`6#LqK0}XYWUn ziyX3($c}{IkFjjEk;nLAf)BVg zl9G}h9UtqWUjs|wA~uD4^i1(RwNsAzNq5@6V_mC@26&X2?y)A`_S%RvZT7EgX=%yL zZO6J^z##<7R_nW0caBesihxZW@U%+HXHqaJ6Cx+%Bh=(d#^Fe9Y;XX6XKFgL!)Jl< z6inyTR?;ms;75f^nfAu`v(ig6sw)i9AKGQTx3Sx zX+CH-d~^gV!=Sj8!{Q5c17G$L8037;ioJJe~N zF7@@bHF#V0z|L zJb&IUj?yjGZjmCt>jjLQyrzA)m+*e#Sy@@70|NuLHq?xsfq~_@jA`%F09h+hv7E!O zP^&c1A1cx$3f$iD94I^>ctT)dJB@!%5Xpv#MTEE84krd-vq%b&4vY~>?^lc?Avgj! zE2O3(6g~7;Qml7yC%GGSoE7MW;#Cv5-j$o_VO@tSI22j)Y7K@#KZ3jq>k5ogUF#Z~ zn`w5AnG|k?NP`IvA*h|&Sgt#C7v&7kv5IxA3wJ5eVgrh;;pV_rn;~|~w@LNp*Dvq4 zy?4ve1wdP%x~Lz;J%M-_(|vmOiVni_gnyc1SfE4)U9Fgy+yP8|RSWL4JMWW6be;rC zb-Pp>^b4rKAoMb5fl!=YXfo3WvlQv+F2GZ%z7)XAkQK`4zS0tIZf-9xFTug$&6dbT8bRMuR#}P0YRIUQ$i~js`b(O!B|@aJuBkX5brL9M z(MOWx79kOlECaDZ96@!4oMHu!sHj2lu#S$-jPGj6>rp%y?6)#{q0^ z6yiXP1H~k0WZ|^6b+q+KWRt9jr4i8dd^_?`*$?l_BrZ#L@(e9LSxz$^s`qJviQ9mto))9)d50(}$L`?$svD%ZC+MFDjDF zc-0xz8EtF~Er9jZvd4XvXQe+Nd|e#1BQDnP^|K+u%r;fIzUcMiat~v*$MKS;uguNo zy4J-y6@6a4Y8BWssI#`W{(#{5@F;siPmlIi zi^r?I#c8740aj`Fi}COs*hjmxL`C317^4=ghElOmzHvP+90T^z3=2z^c+_I?FJQxi zb@eebdj^34az&42`>(I1s|4Aldj34)=Zoo11E{_McR2}@WR`I9#m86wGXR%nV|C%p ztMOAInh*W{?pjlKih#JvWdrA{WGfL8Fh%K~K{%vY^1^d6#CY69>{f@^;9#qa)Eg0g_v?xr0yXAa}!5 zG);{%XlZCn^iq&mS3DknaUuiHhDHt5hj(uPfnt(JG%=|D{tKr!?f9N)gAz}`5`}%t zVF`W{17etu@h7g-xP#-<%iPF{J>V($-w%xyxdk&nv=R3=@k&<17%q;meND<>QmiH~ z!IgRxJnZl=_5_W9Ubm1bq*DkuJxx*o*WXl~!um8b54x=k6-Mg~G400&pE=VlxzCW*zp}9HUDaOFdl}9guR0z&O?)d$So9|voy*d@_2X%s5tnYbe5f2#YJ-m^ zvZM@5`Vsi)G#qWL-j^JS8BO2EPQ>dzqC+p_aXsg7)yQ?BLi~;<8cnC_3b3 zKX$}7F2J#-p*E|A1NlgaIhqE4d};zuCmWkQqO|_ZvR$ASqpGTktE_v;LJ|eD*j9bE zK%y=E{!5w7{SRZUtxp+ZA=fUu{<+}?ste@#3`o)Lpq4W;X;^eS5)Jksey-+rHjZ58 z_s{}QG~3BH z@D1kmyk6xI+JOZ@-L>fXj9)Im%aJ^Py0SwqL8D*5-M9e3>L5*!ns1ldfq<%#K&0hV z+;lp~Z!_RJFaUF9rJsenDGd~6B1Ab|CSK_$WgCW?Ia4zeT;cu-Vwk%?qVqqWtrvD* za!QiNMZF|pm+$ZA7XGg30pfM0XHw_OsIJl|V#R~f8fedWeY|PK73A$NFs6b<;CaJJ zEG)NRWy8z7JE>@J^BIANon2E)#v?2J(wg*nVRaHJGKehk`ujWzQhJziQ7(Sf^6Z5e!=JnN`UtPac9wu>DY@@SKL;Qr!w;XgS9yNM6FYi_}D9Rc0+>doa_? z7Kssa5~gfl_PvYI!Zjk<#6~C1OaILJVuUe>;$b%F7XXE;E)w0&@lHLW!jSp6y&i=)_*b zF@OG9D>tNI=O+)L^n1*@q|vjL)3>}p9U?&kEil+tEKOhY#~okt_Z>r&yx>F8xLTJT zzn>S@PjEnscGQ3TpD&b@aKMntx=1NW!eZ5B)!jpDLwqrhuhH)))cpAdw?4j96mc}| zL=c(L{RP%a2Wi*;UMs(x<5)q+tXH-i#$kmHmP-{Pez{ZnV#>x8-Na4?@sW+LB*2ro#&?-qxpM7kI5~PtTJT} z+Il|t;AoFGNJjKiAQeqdI9EI|4~eATo5LXAFrMFEMY2|>CrzGL{yB!fL%J%{Q*Dlk zt!~nnHSXN%@^*1?ad2<|aRXA78ogb?(MD*#pyW!6XK8vYG z-c#kti<6|9Fy6<|6}NO(!$@9_4SPK7sqde8YQc2i<3|nd%RhH^DvF8{6|vt!ZW9UA zV1-MkKjpvw*`vy7zWLc1nuu|wuG#d(JluA);HrnpuXnXhdAx3z^xInhV-Z}E+}qcT zKk8*Kqk~;IQ=GQZp0vF#YucaM4AhNds>&ts7`^Oz;9XTNv7WYIS$l0T^Xe>uKm(K5 zy|GMFte;K(Z^`K2uXGMtSAK{;JXtMkp^52k+0El_`aKr`h(LRzrd~9n?gGBt>vn~* zjt!$}mX+QJiY{`qs=bzVu?gyqOY{>0x)gcuUk(}FoE(t68%ZZa_t*75?sQH0VbD%I zJSG2d-6<&DEX64hpH7f{n~bZ<#B0=bVhT{9{S2n-P}`7=chKW5=*Enh%}G7VyT*?9 zy~`i7;J30J#Z3)G)4)S3S@jEAEj=tWG&Gt<;%HEww&cqf@!ji=ueH$zYm(ee!7x&hOayHRk77eF|a+P;-3A;w_%_if3utTcePK zc}o(mwjhE*AcqYk;bcB-4EqL;Z7_(|$_fs72I6*}pUaVEX&?&>*my~&2Ts L#o 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