From 26805338f82f052c45a3bbb5bf342cb6e221f438 Mon Sep 17 00:00:00 2001 From: gitlost Date: Fri, 11 Apr 2025 13:02:59 +0100 Subject: [PATCH] RAW_TEXT: expand UPC-A, UPC-E to EAN-13, and EAN-8 if has add-on, and place any add-on data directly after (no separator) EAN-8 + add-on: warn as non-compliant (see ZXing-C++ issue #883, https://github.com/zxing-cpp/zxing-cpp/issues/883) test suite: BWIPP: use new EAN-8 + add-on option "permitaddon"; fix dumps of RAW_TEXT `memcmp()`s fails; various re-formatting bwipp_dump.ps: update to latest BWIPP --- ChangeLog | 4 +- backend/composite.c | 9 +- backend/tests/test_2of5.c | 5 +- backend/tests/test_auspost.c | 5 +- backend/tests/test_bc412.c | 5 +- backend/tests/test_bmp.c | 63 ++- backend/tests/test_channel.c | 4 +- backend/tests/test_codabar.c | 5 +- backend/tests/test_code11.c | 4 +- backend/tests/test_code128.c | 6 +- backend/tests/test_composite.c | 53 +- backend/tests/test_dxfilmedge.c | 5 +- backend/tests/test_emf.c | 69 ++- backend/tests/test_filemem.c | 10 +- backend/tests/test_gif.c | 71 ++- backend/tests/test_gs1.c | 59 +- backend/tests/test_imail.c | 5 +- backend/tests/test_library.c | 117 ++-- backend/tests/test_mailmark.c | 5 +- backend/tests/test_medical.c | 5 +- backend/tests/test_pcx.c | 59 +- backend/tests/test_plessey.c | 5 +- backend/tests/test_png.c | 93 +-- backend/tests/test_postal.c | 5 +- backend/tests/test_raster.c | 690 ++++++++++++----------- backend/tests/test_rss.c | 5 +- backend/tests/test_svg.c | 70 ++- backend/tests/test_tif.c | 74 ++- backend/tests/test_upcean.c | 216 ++++--- backend/tests/test_vector.c | 369 ++++++------ backend/tests/testcommon.c | 8 + backend/tests/tools/bwipp_dump.ps.tar.xz | Bin 140192 -> 140336 bytes backend/upcean.c | 51 +- docs/manual.html | 10 +- docs/manual.pmd | 9 +- docs/manual.txt | 8 +- 36 files changed, 1273 insertions(+), 908 deletions(-) diff --git a/ChangeLog b/ChangeLog index e50d38da..15c088f1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,4 @@ -Version 2.15.0.9 (dev) not released yet (2025-04-09) +Version 2.15.0.9 (dev) not released yet (2025-04-11) ==================================================== **Incompatible changes** @@ -11,6 +11,7 @@ Version 2.15.0.9 (dev) not released yet (2025-04-09) - New Qt Backend method `isBindable()` for new flag `ZINT_CAP_BINDABLE` - GS1 Composites now return warning if CC type upped from requested due to size of composite data +- EAN-8 with add-on now returns warning that it's non-standard Changes ------- @@ -30,6 +31,7 @@ Changes `ZINT_CAP_STACKABLE`, and new Qt Backend method `isBindable()` - DOTCODE: now pads rows if given number of columns instead of failing if rows below min (5) +- EAN-8 + add-on: warn as non-compliant Bugs ---- diff --git a/backend/composite.c b/backend/composite.c index cd231207..1d33ac50 100644 --- a/backend/composite.c +++ b/backend/composite.c @@ -1456,8 +1456,13 @@ INTERNAL int composite(struct zint_symbol *symbol, unsigned char source[], int l } } else { /* If symbol->height given then min row height was returned, else default height */ - error_number = set_height(symbol, symbol->height ? linear->height : 0.0f, - symbol->height ? 0.0f : linear->height, 0.0f, 0 /*no_errtxt*/); + if (error_number == 0) { /* Avoid overwriting any previous warning (e.g. EAN-8 with add-on) */ + error_number = set_height(symbol, symbol->height ? linear->height : 0.0f, + symbol->height ? 0.0f : linear->height, 0.0f, 0 /*no_errtxt*/); + } else { + (void) set_height(symbol, symbol->height ? linear->height : 0.0f, + symbol->height ? 0.0f : linear->height, 0.0f, 1 /*no_errtxt*/); + } } } else { if (symbol->symbology == BARCODE_DBAR_STK_CC) { diff --git a/backend/tests/test_2of5.c b/backend/tests/test_2of5.c index e451007f..8d3445a1 100644 --- a/backend/tests/test_2of5.c +++ b/backend/tests/test_2of5.c @@ -213,8 +213,9 @@ static void test_hrt(const testCtx *const p_ctx) { "i:%d raw_segs[0].length %d != expected_raw_length %d\n", i, symbol->raw_segs[0].length, expected_raw_length); assert_zero(memcmp(symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length), - "i:%d memcmp(%s, %s, %d) != 0\n", - i, symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length); + "i:%d memcmp(%.*s, %s, %d) != 0\n", + i, symbol->raw_segs[0].length, symbol->raw_segs[0].source, data[i].expected_raw, + expected_raw_length); } else { assert_null(symbol->raw_segs, "i:%d raw_segs not NULL\n", i); } diff --git a/backend/tests/test_auspost.c b/backend/tests/test_auspost.c index a5b5e7ad..e02e9fb6 100644 --- a/backend/tests/test_auspost.c +++ b/backend/tests/test_auspost.c @@ -167,8 +167,9 @@ static void test_hrt(const testCtx *const p_ctx) { "i:%d raw_segs[0].length %d != expected_raw_length %d\n", i, symbol->raw_segs[0].length, expected_raw_length); assert_zero(memcmp(symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length), - "i:%d memcmp(%s, %s, %d) != 0\n", - i, symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length); + "i:%d memcmp(%.*s, %s, %d) != 0\n", + i, symbol->raw_segs[0].length, symbol->raw_segs[0].source, data[i].expected_raw, + expected_raw_length); } else { assert_null(symbol->raw_segs, "i:%d raw_segs not NULL\n", i); } diff --git a/backend/tests/test_bc412.c b/backend/tests/test_bc412.c index 26b6627c..02f244c3 100644 --- a/backend/tests/test_bc412.c +++ b/backend/tests/test_bc412.c @@ -125,8 +125,9 @@ static void test_input(const testCtx *const p_ctx) { "i:%d raw_segs[0].length %d != expected_raw_length %d\n", i, symbol->raw_segs[0].length, expected_raw_length); assert_zero(memcmp(symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length), - "i:%d memcmp(%s, %s, %d) != 0\n", - i, symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length); + "i:%d memcmp(%.*s, %s, %d) != 0\n", + i, symbol->raw_segs[0].length, symbol->raw_segs[0].source, data[i].expected_raw, + expected_raw_length); } else { assert_null(symbol->raw_segs, "i:%d raw_segs not NULL\n", i); } diff --git a/backend/tests/test_bmp.c b/backend/tests/test_bmp.c index 394a5d4b..914c2df5 100644 --- a/backend/tests/test_bmp.c +++ b/backend/tests/test_bmp.c @@ -84,14 +84,16 @@ static void test_pixel_plot(const testCtx *const p_ctx) { symbol->debug |= debug; size = data[i].width * data[i].height; - assert_nonzero(size < (int) sizeof(data_buf), "i:%d bmp_pixel_plot size %d < sizeof(data_buf) %d\n", i, size, (int) sizeof(data_buf)); + assert_nonzero(size < (int) sizeof(data_buf), "i:%d bmp_pixel_plot size %d < sizeof(data_buf) %d\n", + i, size, (int) sizeof(data_buf)); if (data[i].repeat) { testUtilStrCpyRepeat(data_buf, data[i].pattern, size); } else { strcpy(data_buf, data[i].pattern); } - assert_equal(size, (int) strlen(data_buf), "i:%d bmp_pixel_plot size %d != strlen(data_buf) %d\n", i, size, (int) strlen(data_buf)); + assert_equal(size, (int) strlen(data_buf), "i:%d bmp_pixel_plot size %d != strlen(data_buf) %d\n", + i, size, (int) strlen(data_buf)); if (*data_buf > '9') { symbol->symbology = BARCODE_ULTRA; @@ -100,7 +102,8 @@ static void test_pixel_plot(const testCtx *const p_ctx) { symbol->bitmap = (unsigned char *) data_buf; ret = bmp_pixel_plot(symbol, TCU(data_buf)); - assert_equal(ret, data[i].ret, "i:%d bmp_pixel_plot ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); + assert_equal(ret, data[i].ret, "i:%d bmp_pixel_plot ret %d != %d (%s)\n", + i, ret, data[i].ret, symbol->errtxt); if (ret < ZINT_ERROR) { if (have_identify) { @@ -164,7 +167,8 @@ static void test_print(const testCtx *const p_ctx) { if (p_ctx->generate) { char data_dir_path[1024]; - assert_nonzero(testUtilDataPath(data_dir_path, sizeof(data_dir_path), data_dir, NULL), "testUtilDataPath(%s) == 0\n", data_dir); + assert_nonzero(testUtilDataPath(data_dir_path, sizeof(data_dir_path), data_dir, NULL), + "testUtilDataPath(%s) == 0\n", data_dir); if (!testUtilDirExists(data_dir_path)) { ret = testUtilMkDir(data_dir_path); assert_zero(ret, "testUtilMkDir(%s) ret %d != 0 (%d: %s)\n", data_dir_path, ret, errno, strerror(errno)); @@ -178,7 +182,9 @@ static void test_print(const testCtx *const p_ctx) { symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, data[i].option_1, data[i].option_2, -1, data[i].output_options, data[i].data, -1, debug); + length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, + data[i].option_1, data[i].option_2, -1 /*option_3*/, data[i].output_options, + data[i].data, -1, debug); if (data[i].border_width != -1) { symbol->border_width = data[i].border_width; } @@ -196,35 +202,44 @@ static void test_print(const testCtx *const p_ctx) { } ret = ZBarcode_Encode(symbol, TCU(data[i].data), length); - assert_zero(ret, "i:%d %s ZBarcode_Encode ret %d != 0 %s\n", i, testUtilBarcodeName(data[i].symbology), ret, symbol->errtxt); + assert_zero(ret, "i:%d %s ZBarcode_Encode ret %d != 0 %s\n", + i, testUtilBarcodeName(data[i].symbology), ret, symbol->errtxt); strcpy(symbol->outfile, bmp); ret = ZBarcode_Print(symbol, 0); - assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); + assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); - assert_nonzero(testUtilDataPath(expected_file, sizeof(expected_file), data_dir, data[i].expected_file), "i:%d testUtilDataPath == 0\n", i); + assert_nonzero(testUtilDataPath(expected_file, sizeof(expected_file), data_dir, data[i].expected_file), + "i:%d testUtilDataPath == 0\n", i); if (p_ctx->generate) { printf(" /*%3d*/ { %s, %d, %s, %d, %d, %d, %d, \"%s\", \"%s\", \"%s\", \"%s\"},\n", - i, testUtilBarcodeName(data[i].symbology), data[i].border_width, testUtilOutputOptionsName(data[i].output_options), + i, testUtilBarcodeName(data[i].symbology), data[i].border_width, + testUtilOutputOptionsName(data[i].output_options), data[i].whitespace_width, data[i].whitespace_height, data[i].option_1, data[i].option_2, data[i].fgcolour, data[i].bgcolour, testUtilEscape(data[i].data, length, escaped, escaped_size), data[i].expected_file); ret = testUtilRename(symbol->outfile, expected_file); - assert_zero(ret, "i:%d testUtilRename(%s, %s) ret %d != 0 (%d: %s)\n", i, symbol->outfile, expected_file, ret, errno, strerror(errno)); + assert_zero(ret, "i:%d testUtilRename(%s, %s) ret %d != 0 (%d: %s)\n", + i, symbol->outfile, expected_file, ret, errno, strerror(errno)); if (have_identify) { ret = testUtilVerifyIdentify(have_identify, expected_file, debug); - assert_zero(ret, "i:%d %s identify %s ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), expected_file, ret); + assert_zero(ret, "i:%d %s identify %s ret %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), expected_file, ret); } } else { assert_nonzero(testUtilExists(symbol->outfile), "i:%d testUtilExists(%s) == 0\n", i, symbol->outfile); assert_nonzero(testUtilExists(expected_file), "i:%d testUtilExists(%s) == 0\n", i, expected_file); ret = testUtilCmpBins(symbol->outfile, expected_file); - assert_zero(ret, "i:%d %s testUtilCmpBins(%s, %s) %d != 0\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, expected_file, ret); + assert_zero(ret, "i:%d %s testUtilCmpBins(%s, %s) %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, expected_file, ret); - ret = testUtilReadFile(symbol->outfile, filebuf, sizeof(filebuf), &filebuf_size); /* For BARCODE_MEMORY_FILE */ - assert_zero(ret, "i:%d %s testUtilReadFile(%s) %d != 0\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); + /* For BARCODE_MEMORY_FILE */ + ret = testUtilReadFile(symbol->outfile, filebuf, sizeof(filebuf), &filebuf_size); + assert_zero(ret, "i:%d %s testUtilReadFile(%s) %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); if (!(debug & ZINT_DEBUG_TEST_KEEP_OUTFILE)) { assert_zero(testUtilRemove(symbol->outfile), "i:%d testUtilRemove(%s) != 0\n", i, symbol->outfile); @@ -237,8 +252,8 @@ static void test_print(const testCtx *const p_ctx) { assert_nonnull(symbol->memfile, "i:%d %s memfile NULL\n", i, testUtilBarcodeName(data[i].symbology)); assert_equal(symbol->memfile_size, filebuf_size, "i:%d %s memfile_size %d != %d\n", i, testUtilBarcodeName(data[i].symbology), symbol->memfile_size, filebuf_size); - assert_zero(memcmp(symbol->memfile, filebuf, symbol->memfile_size), "i:%d %s memcmp(memfile, filebuf) != 0\n", - i, testUtilBarcodeName(data[i].symbology)); + assert_zero(memcmp(symbol->memfile, filebuf, symbol->memfile_size), + "i:%d %s memcmp(memfile, filebuf) != 0\n", i, testUtilBarcodeName(data[i].symbology)); } ZBarcode_Delete(symbol); @@ -266,15 +281,21 @@ static void test_outfile(const testCtx *const p_ctx) { skip_readonly_test = getuid() == 0; /* Skip if running as root on Unix as can't create read-only file */ #endif if (!skip_readonly_test) { - static char expected_errtxt[] = "601: Could not open BMP output file ("; /* Excluding OS-dependent `errno` stuff */ + /* Excluding OS-dependent `errno` stuff */ + static char expected_errtxt[] = "601: Could not open BMP output file ("; (void) testUtilRmROFile(symbol.outfile); /* In case lying around from previous fail */ - assert_nonzero(testUtilCreateROFile(symbol.outfile), "bmp_pixel_plot testUtilCreateROFile(%s) fail (%d: %s)\n", symbol.outfile, errno, strerror(errno)); + assert_nonzero(testUtilCreateROFile(symbol.outfile), + "bmp_pixel_plot testUtilCreateROFile(%s) fail (%d: %s)\n", + symbol.outfile, errno, strerror(errno)); ret = bmp_pixel_plot(&symbol, data); - assert_equal(ret, ZINT_ERROR_FILE_ACCESS, "bmp_pixel_plot ret %d != ZINT_ERROR_FILE_ACCESS (%d) (%s)\n", ret, ZINT_ERROR_FILE_ACCESS, symbol.errtxt); - assert_zero(testUtilRmROFile(symbol.outfile), "bmp_pixel_plot testUtilRmROFile(%s) != 0 (%d: %s)\n", symbol.outfile, errno, strerror(errno)); - assert_zero(strncmp(symbol.errtxt, expected_errtxt, sizeof(expected_errtxt) - 1), "strncmp(%s, %s) != 0\n", symbol.errtxt, expected_errtxt); + assert_equal(ret, ZINT_ERROR_FILE_ACCESS, "bmp_pixel_plot ret %d != ZINT_ERROR_FILE_ACCESS (%d) (%s)\n", + ret, ZINT_ERROR_FILE_ACCESS, symbol.errtxt); + assert_zero(testUtilRmROFile(symbol.outfile), "bmp_pixel_plot testUtilRmROFile(%s) != 0 (%d: %s)\n", + symbol.outfile, errno, strerror(errno)); + assert_zero(strncmp(symbol.errtxt, expected_errtxt, sizeof(expected_errtxt) - 1), "strncmp(%s, %s) != 0\n", + symbol.errtxt, expected_errtxt); } symbol.output_options |= BARCODE_STDOUT; diff --git a/backend/tests/test_channel.c b/backend/tests/test_channel.c index bca18493..3bcff2f3 100644 --- a/backend/tests/test_channel.c +++ b/backend/tests/test_channel.c @@ -120,8 +120,8 @@ static void test_hrt(const testCtx *const p_ctx) { "i:%d raw_segs[0].length %d != expected_length %d\n", i, symbol->raw_segs[0].length, expected_length); assert_zero(memcmp(symbol->raw_segs[0].source, data[i].expected, expected_length), - "i:%d memcmp(%s, %s, %d) != 0\n", - i, symbol->raw_segs[0].source, data[i].expected, expected_length); + "i:%d memcmp(%.*s, %s, %d) != 0\n", + i, symbol->raw_segs[0].length, symbol->raw_segs[0].source, data[i].expected, expected_length); } else { assert_null(symbol->raw_segs, "i:%d raw_segs not NULL\n", i); } diff --git a/backend/tests/test_codabar.c b/backend/tests/test_codabar.c index 0575afd4..a0122d6f 100644 --- a/backend/tests/test_codabar.c +++ b/backend/tests/test_codabar.c @@ -147,8 +147,9 @@ static void test_hrt(const testCtx *const p_ctx) { "i:%d raw_segs[0].length %d != expected_raw_length %d\n", i, symbol->raw_segs[0].length, expected_raw_length); assert_zero(memcmp(symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length), - "i:%d memcmp(%s, %s, %d) != 0\n", - i, symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length); + "i:%d memcmp(%.*s, %s, %d) != 0\n", + i, symbol->raw_segs[0].length, symbol->raw_segs[0].source, data[i].expected_raw, + expected_raw_length); } else { assert_null(symbol->raw_segs, "i:%d raw_segs not NULL\n", i); } diff --git a/backend/tests/test_code11.c b/backend/tests/test_code11.c index da6c3733..1ba0c474 100644 --- a/backend/tests/test_code11.c +++ b/backend/tests/test_code11.c @@ -143,8 +143,8 @@ static void test_hrt(const testCtx *const p_ctx) { "i:%d raw_segs[0].length %d != expected_length %d\n", i, symbol->raw_segs[0].length, expected_length); assert_zero(memcmp(symbol->raw_segs[0].source, data[i].expected, expected_length), - "i:%d memcmp(%s, %s, %d) != 0\n", - i, symbol->raw_segs[0].source, data[i].expected, expected_length); + "i:%d memcmp(%.*s, %s, %d) != 0\n", + i, expected_length, symbol->raw_segs[0].source, data[i].expected, expected_length); } else { assert_null(symbol->raw_segs, "i:%d raw_segs not NULL\n", i); } diff --git a/backend/tests/test_code128.c b/backend/tests/test_code128.c index 275e3d72..a6b0c03a 100644 --- a/backend/tests/test_code128.c +++ b/backend/tests/test_code128.c @@ -332,9 +332,9 @@ static void test_hrt(const testCtx *const p_ctx) { "i:%d raw_segs[0].length %d != expected_raw_length %d\n", i, symbol->raw_segs[0].length, expected_raw_length); assert_zero(memcmp(symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length), - "i:%d memcmp(%.*s, %.*s, %d) != 0\n", - i, symbol->raw_segs[0].length, symbol->raw_segs[0].source, expected_raw_length, - data[i].expected_raw, expected_raw_length); + "i:%d memcmp(%.*s, %s, %d) != 0\n", + i, symbol->raw_segs[0].length, symbol->raw_segs[0].source, data[i].expected_raw, + expected_raw_length); } else { assert_null(symbol->raw_segs, "i:%d raw_segs not NULL\n", i); } diff --git a/backend/tests/test_composite.c b/backend/tests/test_composite.c index deb3b491..9dd2f24c 100644 --- a/backend/tests/test_composite.c +++ b/backend/tests/test_composite.c @@ -53,21 +53,21 @@ static void test_eanx_leading_zeroes(const testCtx *const p_ctx) { /* 5*/ { BARCODE_EANX_CC, "123456", "[21]A12345678", 0, 8, 72 }, /* 6*/ { BARCODE_EANX_CC, "1234567", "[21]A12345678", 0, 8, 72 }, /* 7*/ { BARCODE_EANX_CC, "12345678", "[21]A12345678", 0, 7, 99 }, /* EAN-13 */ - /* 8*/ { BARCODE_EANX_CC, "1+12", "[21]A12345678", 0, 8, 98 }, /* EAN-8 + EAN-2 */ - /* 9*/ { BARCODE_EANX_CC, "12+12", "[21]A12345678", 0, 8, 98 }, - /*10*/ { BARCODE_EANX_CC, "123+12", "[21]A12345678", 0, 8, 98 }, - /*11*/ { BARCODE_EANX_CC, "1234+12", "[21]A12345678", 0, 8, 98 }, - /*12*/ { BARCODE_EANX_CC, "12345+12", "[21]A12345678", 0, 8, 98 }, - /*13*/ { BARCODE_EANX_CC, "123456+12", "[21]A12345678", 0, 8, 98 }, - /*14*/ { BARCODE_EANX_CC, "1234567+12", "[21]A12345678", 0, 8, 98 }, + /* 8*/ { BARCODE_EANX_CC, "1+12", "[21]A12345678", ZINT_WARN_NONCOMPLIANT, 8, 98 }, /* EAN-8 + EAN-2 */ + /* 9*/ { BARCODE_EANX_CC, "12+12", "[21]A12345678", ZINT_WARN_NONCOMPLIANT, 8, 98 }, + /*10*/ { BARCODE_EANX_CC, "123+12", "[21]A12345678", ZINT_WARN_NONCOMPLIANT, 8, 98 }, + /*11*/ { BARCODE_EANX_CC, "1234+12", "[21]A12345678", ZINT_WARN_NONCOMPLIANT, 8, 98 }, + /*12*/ { BARCODE_EANX_CC, "12345+12", "[21]A12345678", ZINT_WARN_NONCOMPLIANT, 8, 98 }, + /*13*/ { BARCODE_EANX_CC, "123456+12", "[21]A12345678", ZINT_WARN_NONCOMPLIANT, 8, 98 }, + /*14*/ { BARCODE_EANX_CC, "1234567+12", "[21]A12345678", ZINT_WARN_NONCOMPLIANT, 8, 98 }, /*15*/ { BARCODE_EANX_CC, "12345678+12", "[21]A12345678", 0, 7, 125 }, /* EAN-13 + EAN-2 */ - /*16*/ { BARCODE_EANX_CC, "1+123", "[21]A12345678", 0, 8, 125 }, /* EAN-8 + EAN-5 */ - /*17*/ { BARCODE_EANX_CC, "12+123", "[21]A12345678", 0, 8, 125 }, - /*18*/ { BARCODE_EANX_CC, "123+123", "[21]A12345678", 0, 8, 125 }, - /*19*/ { BARCODE_EANX_CC, "1234+123", "[21]A12345678", 0, 8, 125 }, - /*20*/ { BARCODE_EANX_CC, "12345+123", "[21]A12345678", 0, 8, 125 }, - /*21*/ { BARCODE_EANX_CC, "123456+123", "[21]A12345678", 0, 8, 125 }, - /*22*/ { BARCODE_EANX_CC, "1234567+123", "[21]A12345678", 0, 8, 125 }, + /*16*/ { BARCODE_EANX_CC, "1+123", "[21]A12345678", ZINT_WARN_NONCOMPLIANT, 8, 125 }, /* EAN-8 + EAN-5 */ + /*17*/ { BARCODE_EANX_CC, "12+123", "[21]A12345678", ZINT_WARN_NONCOMPLIANT, 8, 125 }, + /*18*/ { BARCODE_EANX_CC, "123+123", "[21]A12345678", ZINT_WARN_NONCOMPLIANT, 8, 125 }, + /*19*/ { BARCODE_EANX_CC, "1234+123", "[21]A12345678", ZINT_WARN_NONCOMPLIANT, 8, 125 }, + /*20*/ { BARCODE_EANX_CC, "12345+123", "[21]A12345678", ZINT_WARN_NONCOMPLIANT, 8, 125 }, + /*21*/ { BARCODE_EANX_CC, "123456+123", "[21]A12345678", ZINT_WARN_NONCOMPLIANT, 8, 125 }, + /*22*/ { BARCODE_EANX_CC, "1234567+123", "[21]A12345678", ZINT_WARN_NONCOMPLIANT, 8, 125 }, /*23*/ { BARCODE_EANX_CC, "12345678+123", "[21]A12345678", 0, 7, 152 }, /* EAN-13 + EAN-5 */ /*24*/ { BARCODE_EANX_CC, "1234567890128", "[21]A12345678", 0, 7, 99 }, /* EAN-13 + CHK */ /*25*/ { BARCODE_EANX_CC, "1234567890128+12", "[21]A12345678", 0, 7, 125 }, /* EAN-13 + CHK + EAN-2 */ @@ -1493,7 +1493,7 @@ static void test_examples(const testCtx *const p_ctx) { "000100000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000" "000101011011100100010000101011000101000110100001010101000000010110110001010101111010010001010110111010010111" }, - /* 77*/ { BARCODE_EANX_CC, -1, 1, "9876543+65", "[91]1234567", 0, 8, 98, 1, "Example of EAN-8 with 2-digit addon, CC-A 3 cols, 4 rows", + /* 77*/ { BARCODE_EANX_CC, -1, 1, "9876543+65", "[91]1234567", ZINT_WARN_NONCOMPLIANT, 8, 98, 1, "Example of EAN-8 with 2-digit addon, CC-A 3 cols, 4 rows", "10010001111100110101001100011100010111001100110001011101000001110100110100000000000000000000000000" "11011111100110100101011100011011110010110000111100010011110101110101110100000000000000000000000000" "10000101100000110101011000010101111101111100111010010000111001110101100100000000000000000000000000" @@ -1503,7 +1503,7 @@ static void test_examples(const testCtx *const p_ctx) { "00001000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000" "00001010001011011011101110110101111010101001110101110010000101110010101000000010110101111010111001" }, - /* 78*/ { BARCODE_EANX_CC, -1, 2, "9876543+74083", "[91]123456789012345678", 0, 12, 135, 1, "Example of EAN-8 with 5-digit addon, CC-B 3 cols, 8 rows", + /* 78*/ { BARCODE_EANX_CC, -1, 2, "9876543+74083", "[91]123456789012345678", ZINT_WARN_NONCOMPLIANT, 12, 135, 1, "Example of EAN-8 with 5-digit addon, CC-B 3 cols, 8 rows", "110011101011101111101110100100001011010000010000100010111110110100111101100111010100000000000000000000000000000000000000000000000000000" "111011101011001011100001000100001001011100101100100000111000110111010001110111010100000000000000000000000000000000000000000000000000000" "111001101011011111100110100100001101010100010111100000110010011011111101110011010100000000000000000000000000000000000000000000000000000" @@ -3006,7 +3006,7 @@ static void test_addongap(const testCtx *const p_ctx) { }; /* Verified via bwipp_dump.ps against BWIPP */ static const struct item data[] = { - /* 0*/ { BARCODE_EANX_CC, 1, -1, "1234567+12", 0, 8, 98, "EAN-8 default 7 gap", + /* 0*/ { BARCODE_EANX_CC, 1, -1, "1234567+12", ZINT_WARN_NONCOMPLIANT, 8, 98, "EAN-8 default 7 gap", "10010001111100110101001100011110001011001100110110011110000101110100110100000000000000000000000000" "10000011100101100101011100010111100010001000100000100101111001110101110100000000000000000000000000" "11001101001000000101011000011010011100011110110001100110011001110101100100000000000000000000000000" @@ -3016,7 +3016,7 @@ static void test_addongap(const testCtx *const p_ctx) { "00001000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000" "00001010011001001001101111010100011010101001110101000010001001110010101000000010110011001010010011" }, - /* 1*/ { BARCODE_EANX_CC, 1, 8, "1234567+12", 0, 8, 99, "EAN-8 8 gap", + /* 1*/ { BARCODE_EANX_CC, 1, 8, "1234567+12", ZINT_WARN_NONCOMPLIANT, 8, 99, "EAN-8 8 gap", "100100011111001101010011000111100010110011001101100111100001011101001101000000000000000000000000000" "100000111001011001010111000101111000100010001000001001011110011101011101000000000000000000000000000" "110011010010000001010110000110100111000111101100011001100110011101011001000000000000000000000000000" @@ -3242,7 +3242,7 @@ static void test_hrt(const testCtx *const p_ctx) { /* 9*/ { BARCODE_EANX_CC, -1, -1, "1234567890128", "[20]1A", ZINT_WARN_NONCOMPLIANT, "1234567890128", "" }, /* AI (20) should be 2 nos. */ /* 10*/ { BARCODE_EANX_CC, GS1NOCHECK_MODE, -1, "1234567890128", "[20]1A", 0, "1234567890128", "" }, /* 11*/ { BARCODE_EANX_CC, -1, -1, "1234567890128+12", "[20]12", 0, "1234567890128+12", "" }, - /* 12*/ { BARCODE_EANX_CC, -1, BARCODE_RAW_TEXT, "1234567890128+12", "[20]12", 0, "1234567890128+12", "1234567890128+12|2012" }, + /* 12*/ { BARCODE_EANX_CC, -1, BARCODE_RAW_TEXT, "1234567890128+12", "[20]12", 0, "1234567890128+12", "123456789012812|2012" }, /* 13*/ { BARCODE_DBAR_OMN_CC, -1, -1, "1234567890123", "[20]12", 0, "(01)12345678901231", "" }, /* 14*/ { BARCODE_DBAR_OMN_CC, -1, BARCODE_RAW_TEXT, "1234567890123", "[20]12", 0, "(01)12345678901231", "0112345678901231|2012" }, /* 15*/ { BARCODE_DBAR_OMN_CC, -1, -1, "12345678901231", "[20]12", 0, "(01)12345678901231", "" }, @@ -3258,16 +3258,16 @@ static void test_hrt(const testCtx *const p_ctx) { /* 25*/ { BARCODE_DBAR_LTD_CC, -1, -1, "12345678901231", "[20]1A", ZINT_WARN_NONCOMPLIANT, "(01)12345678901231", "" }, /* AI (20) should be 2 nos. */ /* 26*/ { BARCODE_DBAR_LTD_CC, GS1NOCHECK_MODE, -1, "12345678901231", "[20]1A", 0, "(01)12345678901231", "" }, /* 27*/ { BARCODE_UPCA_CC, -1, -1, "12345678901", "[20]12", 0, "123456789012", "" }, - /* 28*/ { BARCODE_UPCA_CC, -1, BARCODE_RAW_TEXT, "12345678901", "[20]12", 0, "123456789012", "123456789012|2012" }, + /* 28*/ { BARCODE_UPCA_CC, -1, BARCODE_RAW_TEXT, "12345678901", "[20]12", 0, "123456789012", "0123456789012|2012" }, /* 29*/ { BARCODE_UPCA_CC, -1, -1, "123456789012", "[20]12", 0, "123456789012", "" }, /* 30*/ { BARCODE_UPCA_CC, -1, -1, "123456789013", "[20]12", ZINT_ERROR_INVALID_CHECK, "", "" }, /* 31*/ { BARCODE_UPCA_CC, GS1NOCHECK_MODE, -1, "123456789013", "[20]12", ZINT_ERROR_INVALID_CHECK, "", "" }, /* Still checked */ /* 32*/ { BARCODE_UPCA_CC, -1, -1, "123456789012", "[20]1A", ZINT_WARN_NONCOMPLIANT, "123456789012", "" }, /* AI (20) should be 2 nos. */ /* 33*/ { BARCODE_UPCA_CC, GS1NOCHECK_MODE, -1, "123456789012", "[20]1A", 0, "123456789012", "" }, /* 34*/ { BARCODE_UPCA_CC, -1, -1, "123456789012+123", "[20]12", 0, "123456789012+00123", "" }, - /* 35*/ { BARCODE_UPCA_CC, -1, BARCODE_RAW_TEXT, "123456789012+123", "[20]12", 0, "123456789012+00123", "123456789012+00123|2012" }, + /* 35*/ { BARCODE_UPCA_CC, -1, BARCODE_RAW_TEXT, "123456789012+123", "[20]12", 0, "123456789012+00123", "012345678901200123|2012" }, /* 36*/ { BARCODE_UPCE_CC, -1, -1, "123456", "[20]12", 0, "01234565", "" }, - /* 37*/ { BARCODE_UPCE_CC, -1, BARCODE_RAW_TEXT, "123456", "[20]12", 0, "01234565", "01234565|2012" }, + /* 37*/ { BARCODE_UPCE_CC, -1, BARCODE_RAW_TEXT, "123456", "[20]12", 0, "01234565", "0012345000065|2012" }, /* 38*/ { BARCODE_UPCE_CC, -1, -1, "1234567", "[20]12", 0, "12345670", "" }, /* 39*/ { BARCODE_UPCE_CC, -1, -1, "12345670", "[20]12", 0, "12345670", "" }, /* 40*/ { BARCODE_UPCE_CC, -1, -1, "12345671", "[20]12", ZINT_ERROR_INVALID_CHECK, "", "" }, @@ -3276,7 +3276,7 @@ static void test_hrt(const testCtx *const p_ctx) { /* 43*/ { BARCODE_UPCE_CC, -1, -1, "1234567", "[20]1A", ZINT_WARN_NONCOMPLIANT, "12345670", "" }, /* AI (20) should be 2 nos. */ /* 44*/ { BARCODE_UPCE_CC, GS1NOCHECK_MODE, -1, "1234567", "[20]1A", 0, "12345670", "" }, /* 45*/ { BARCODE_UPCE_CC, -1, -1, "1234567+2", "[20]12", 0, "12345670+02", "" }, - /* 46*/ { BARCODE_UPCE_CC, -1, BARCODE_RAW_TEXT, "1234567+2", "[20]12", 0, "12345670+02", "12345670+02|2012" }, + /* 46*/ { BARCODE_UPCE_CC, -1, BARCODE_RAW_TEXT, "1234567+2", "[20]12", 0, "12345670+02", "012345600007002|2012" }, /* 47*/ { BARCODE_DBAR_STK_CC, -1, -1, "12345678901231", "[20]12", 0, "", "" }, /* No HRT for stacked symbologies */ /* 48*/ { BARCODE_DBAR_STK_CC, -1, BARCODE_RAW_TEXT, "12345678901231", "[20]12", 0, "", "0112345678901231|2012" }, /* But have RAW_TEXT */ /* 49*/ { BARCODE_DBAR_OMNSTK_CC, -1, -1, "12345678901231", "[20]12", 0, "", "" }, @@ -3321,8 +3321,9 @@ static void test_hrt(const testCtx *const p_ctx) { "i:%d raw_segs[0].length %d != expected_raw_length %d\n", i, symbol->raw_segs[0].length, expected_raw_length); assert_zero(memcmp(symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length), - "i:%d memcmp(%s, %s, %d) != 0\n", - i, symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length); + "i:%d memcmp(%.*s, %s, %d) != 0\n", + i, symbol->raw_segs[0].length, symbol->raw_segs[0].source, data[i].expected_raw, + expected_raw_length); } else { assert_null(symbol->raw_segs, "i:%d raw_segs not NULL\n", i); } @@ -3538,7 +3539,7 @@ static void test_fuzz(const testCtx *const p_ctx) { /* 0*/ { BARCODE_EANX_CC, -1, -1, "+123456789012345678", -1, "[21]A12345678", ZINT_ERROR_TOO_LONG, 1, "Error 297: Input add-on length 18 too long (maximum 5) (linear component)", "" }, /* 1*/ { BARCODE_UPCA_CC, -1, -1, "+123456789012345678", -1, "[21]A12345678", ZINT_ERROR_TOO_LONG, 1, "Error 297: Input add-on length 18 too long (maximum 5) (linear component)", "" }, /* 2*/ { BARCODE_UPCE_CC, -1, -1, "+123456789012345678", -1, "[21]A12345678", ZINT_ERROR_TOO_LONG, 1, "Error 297: Input add-on length 18 too long (maximum 5) (linear component)", "" }, - /* 3*/ { BARCODE_EANX_CC, -1, -1, "+12345", -1, "[21]A12345678", 0 , 0, "", "BWIPP checks for proper EAN data" }, + /* 3*/ { BARCODE_EANX_CC, -1, -1, "+12345", -1, "[21]A12345678", ZINT_WARN_NONCOMPLIANT , 0, "Warning 292: EAN-8 with add-on is non-standard (linear component)", "BWIPP checks for proper EAN data" }, /* 4*/ { BARCODE_EANX_CC, -1, -1, "+123456", -1, "[21]A12345678", ZINT_ERROR_TOO_LONG, 1, "Error 297: Input add-on length 6 too long (maximum 5) (linear component)", "" }, /* 5*/ { BARCODE_EANX_CC, GS1PARENS_MODE | GS1NOCHECK_MODE, -1, "kks", -1, "()111%", ZINT_ERROR_INVALID_DATA, 1, "Error 284: Invalid character at position 1 in input (digits and \"+\" only) (linear component)", "" }, /* #300 (#5), Andre Maute (`dbar_date()` not checking length + other non-checks) */ /* 6*/ { BARCODE_UPCA_CC, GS1PARENS_MODE | GS1NOCHECK_MODE, -1, "\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\153\225\215\153\153\153\153\153\153\263\153\153\153\153\153\153\153\153\153\153\163", -1, "()90", ZINT_ERROR_TOO_LONG, 1, "Error 283: Input length 46 too long (maximum 19) (linear component)", "" }, /* #300 (#6), Andre Maute (`dbar_date()` not checking length + other non-checks) */ diff --git a/backend/tests/test_dxfilmedge.c b/backend/tests/test_dxfilmedge.c index 933442f4..4a08cd4a 100644 --- a/backend/tests/test_dxfilmedge.c +++ b/backend/tests/test_dxfilmedge.c @@ -92,8 +92,9 @@ static void test_hrt(const testCtx *const p_ctx) { "i:%d raw_segs[0].length %d != expected_raw_length %d\n", i, symbol->raw_segs[0].length, expected_raw_length); assert_zero(memcmp(symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length), - "i:%d memcmp(%s, %s, %d) != 0\n", - i, symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length); + "i:%d memcmp(%.*s, %s, %d) != 0\n", + i, symbol->raw_segs[0].length, symbol->raw_segs[0].source, data[i].expected_raw, + expected_raw_length); } else { assert_null(symbol->raw_segs, "i:%d raw_segs not NULL\n", i); } diff --git a/backend/tests/test_emf.c b/backend/tests/test_emf.c index e12815d6..6cd6cfce 100644 --- a/backend/tests/test_emf.c +++ b/backend/tests/test_emf.c @@ -116,7 +116,8 @@ static void test_print(const testCtx *const p_ctx) { if (p_ctx->generate) { char data_dir_path[1024]; - assert_nonzero(testUtilDataPath(data_dir_path, sizeof(data_dir_path), data_dir, NULL), "testUtilDataPath(%s) == 0\n", data_dir); + assert_nonzero(testUtilDataPath(data_dir_path, sizeof(data_dir_path), data_dir, NULL), + "testUtilDataPath(%s) == 0\n", data_dir); if (!testUtilDirExists(data_dir_path)) { ret = testUtilMkDir(data_dir_path); assert_zero(ret, "testUtilMkDir(%s) ret %d != 0 (%d: %s)\n", data_dir_path, ret, errno, strerror(errno)); @@ -130,7 +131,9 @@ static void test_print(const testCtx *const p_ctx) { symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, -1 /*eci*/, data[i].option_1, data[i].option_2, -1, data[i].output_options, data[i].data, -1, debug); + length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, -1 /*eci*/, + data[i].option_1, data[i].option_2, -1 /*option_3*/, data[i].output_options, + data[i].data, -1, debug); if (data[i].border_width != -1) { symbol->border_width = data[i].border_width; } @@ -145,7 +148,8 @@ static void test_print(const testCtx *const p_ctx) { } if (data[i].dpmm) { symbol->dpmm = data[i].dpmm; - symbol->scale = ZBarcode_Scale_From_XdimDp(symbol->symbology, ZBarcode_Default_Xdim(symbol->symbology), symbol->dpmm, "EMF"); + symbol->scale = ZBarcode_Scale_From_XdimDp(symbol->symbology, ZBarcode_Default_Xdim(symbol->symbology), + symbol->dpmm, "EMF"); } if (*data[i].fgcolour) { strcpy(symbol->fgcolour, data[i].fgcolour); @@ -155,24 +159,31 @@ static void test_print(const testCtx *const p_ctx) { } ret = ZBarcode_Encode(symbol, TCU(data[i].data), length); - assert_zero(ret, "i:%d %s ZBarcode_Encode ret %d != 0 %s\n", i, testUtilBarcodeName(data[i].symbology), ret, symbol->errtxt); + assert_zero(ret, "i:%d %s ZBarcode_Encode ret %d != 0 %s\n", + i, testUtilBarcodeName(data[i].symbology), ret, symbol->errtxt); strcpy(symbol->outfile, emf); ret = ZBarcode_Print(symbol, data[i].rotate_angle); - assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); + assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); - assert_nonzero(testUtilDataPath(expected_file, sizeof(expected_file), data_dir, data[i].expected_file), "i:%d testUtilDataPath == 0\n", i); + assert_nonzero(testUtilDataPath(expected_file, sizeof(expected_file), data_dir, data[i].expected_file), + "i:%d testUtilDataPath == 0\n", i); if (p_ctx->generate) { printf(" /*%3d*/ { %s, %s, %d, %s, %d, %d, %d, %d, %g, \"%s\", \"%s\", %d, \"%s\", \"%s\", \"%s\" },\n", - i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), data[i].border_width, - testUtilOutputOptionsName(data[i].output_options), data[i].whitespace_width, data[i].whitespace_height, - data[i].option_1, data[i].option_2, data[i].dpmm, data[i].fgcolour, data[i].bgcolour, data[i].rotate_angle, - testUtilEscape(data[i].data, length, escaped, escaped_size), data[i].expected_file, data[i].comment); + i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), + data[i].border_width, testUtilOutputOptionsName(data[i].output_options), + data[i].whitespace_width, data[i].whitespace_height, + data[i].option_1, data[i].option_2, data[i].dpmm, + data[i].fgcolour, data[i].bgcolour, data[i].rotate_angle, + testUtilEscape(data[i].data, length, escaped, escaped_size), + data[i].expected_file, data[i].comment); ret = testUtilRename(symbol->outfile, expected_file); assert_zero(ret, "i:%d testUtilRename(%s, %s) ret %d != 0\n", i, symbol->outfile, expected_file, ret); if (have_libreoffice) { - /* Note this will fail (on Ubuntu anyway) if LibreOffice Base/Calc/Impress/Writer running (i.e. anything but LibreOffice Draw) + /* Note this will fail (on Ubuntu anyway) if LibreOffice Base/Calc/Impress/Writer running + (i.e. anything but LibreOffice Draw) Doesn't seem to be a way to force Draw invocation through the command line */ ret = testUtilVerifyLibreOffice(expected_file, debug); assert_zero(ret, "i:%d %s libreoffice %s ret %d != 0 - check that LibreOffice is not running!\n", @@ -183,10 +194,13 @@ static void test_print(const testCtx *const p_ctx) { assert_nonzero(testUtilExists(expected_file), "i:%d testUtilExists(%s) == 0\n", i, expected_file); ret = testUtilCmpBins(symbol->outfile, expected_file); - assert_zero(ret, "i:%d %s testUtilCmpBins(%s, %s) %d != 0\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, expected_file, ret); + assert_zero(ret, "i:%d %s testUtilCmpBins(%s, %s) %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, expected_file, ret); - ret = testUtilReadFile(symbol->outfile, filebuf, sizeof(filebuf), &filebuf_size); /* For BARCODE_MEMORY_FILE */ - assert_zero(ret, "i:%d %s testUtilReadFile(%s) %d != 0\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); + /* For BARCODE_MEMORY_FILE */ + ret = testUtilReadFile(symbol->outfile, filebuf, sizeof(filebuf), &filebuf_size); + assert_zero(ret, "i:%d %s testUtilReadFile(%s) %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); if (!(debug & ZINT_DEBUG_TEST_KEEP_OUTFILE)) { assert_zero(testUtilRemove(symbol->outfile), "i:%d testUtilRemove(%s) != 0\n", i, symbol->outfile); @@ -195,12 +209,13 @@ static void test_print(const testCtx *const p_ctx) { symbol->output_options |= BARCODE_MEMORY_FILE; ret = ZBarcode_Print(symbol, data[i].rotate_angle); assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0 (%s)\n", - i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret, symbol->errtxt); + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret, symbol->errtxt); assert_nonnull(symbol->memfile, "i:%d %s memfile NULL\n", i, testUtilBarcodeName(data[i].symbology)); assert_equal(symbol->memfile_size, filebuf_size, "i:%d %s memfile_size %d != %d\n", - i, testUtilBarcodeName(data[i].symbology), symbol->memfile_size, filebuf_size); - assert_zero(memcmp(symbol->memfile, filebuf, symbol->memfile_size), "i:%d %s memcmp(memfile, filebuf) != 0\n", - i, testUtilBarcodeName(data[i].symbology)); + i, testUtilBarcodeName(data[i].symbology), symbol->memfile_size, filebuf_size); + assert_zero(memcmp(symbol->memfile, filebuf, symbol->memfile_size), + "i:%d %s memcmp(memfile, filebuf) != 0\n", + i, testUtilBarcodeName(data[i].symbology)); } ZBarcode_Delete(symbol); @@ -229,15 +244,20 @@ static void test_outfile(const testCtx *const p_ctx) { skip_readonly_test = getuid() == 0; /* Skip if running as root on Unix as can't create read-only file */ #endif if (!skip_readonly_test) { - static char expected_errtxt[] = "640: Could not open EMF output file ("; /* Excluding OS-dependent `errno` stuff */ + /* Excluding OS-dependent `errno` stuff */ + static char expected_errtxt[] = "640: Could not open EMF output file ("; (void) testUtilRmROFile(symbol.outfile); /* In case lying around from previous fail */ - assert_nonzero(testUtilCreateROFile(symbol.outfile), "emf_plot testUtilCreateROFile(%s) fail (%d: %s)\n", symbol.outfile, errno, strerror(errno)); + assert_nonzero(testUtilCreateROFile(symbol.outfile), "emf_plot testUtilCreateROFile(%s) fail (%d: %s)\n", + symbol.outfile, errno, strerror(errno)); ret = emf_plot(&symbol, 0); - assert_equal(ret, ZINT_ERROR_FILE_ACCESS, "emf_plot ret %d != ZINT_ERROR_FILE_ACCESS (%d) (%s)\n", ret, ZINT_ERROR_FILE_ACCESS, symbol.errtxt); - assert_zero(testUtilRmROFile(symbol.outfile), "emf_plot testUtilRmROFile(%s) != 0 (%d: %s)\n", symbol.outfile, errno, strerror(errno)); - assert_zero(strncmp(symbol.errtxt, expected_errtxt, sizeof(expected_errtxt) - 1), "strncmp(%s, %s) != 0\n", symbol.errtxt, expected_errtxt); + assert_equal(ret, ZINT_ERROR_FILE_ACCESS, "emf_plot ret %d != ZINT_ERROR_FILE_ACCESS (%d) (%s)\n", + ret, ZINT_ERROR_FILE_ACCESS, symbol.errtxt); + assert_zero(testUtilRmROFile(symbol.outfile), "emf_plot testUtilRmROFile(%s) != 0 (%d: %s)\n", + symbol.outfile, errno, strerror(errno)); + assert_zero(strncmp(symbol.errtxt, expected_errtxt, sizeof(expected_errtxt) - 1), "strncmp(%s, %s) != 0\n", + symbol.errtxt, expected_errtxt); } symbol.output_options |= BARCODE_STDOUT; @@ -249,7 +269,8 @@ static void test_outfile(const testCtx *const p_ctx) { symbol.vector = NULL; ret = emf_plot(&symbol, 0); - assert_equal(ret, ZINT_ERROR_INVALID_DATA, "emf_plot ret %d != ZINT_ERROR_INVALID_DATA (%d) (%s)\n", ret, ZINT_ERROR_INVALID_DATA, symbol.errtxt); + assert_equal(ret, ZINT_ERROR_INVALID_DATA, "emf_plot ret %d != ZINT_ERROR_INVALID_DATA (%d) (%s)\n", + ret, ZINT_ERROR_INVALID_DATA, symbol.errtxt); testFinish(); } diff --git a/backend/tests/test_filemem.c b/backend/tests/test_filemem.c index 1cbdddbe..42882d6e 100644 --- a/backend/tests/test_filemem.c +++ b/backend/tests/test_filemem.c @@ -82,7 +82,9 @@ static void test_svg(const testCtx *const p_ctx) { symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, -1 /*option_1*/, -1, -1, data[i].output_options, data[i].data, data[i].length, debug); + length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, + -1 /*option_1*/, -1 /*option_2*/, -1 /*option_3*/, data[i].output_options, + data[i].data, data[i].length, debug); strcpy(symbol->outfile, data[i].outfile); ret = ZBarcode_Encode_and_Print(symbol, TCU(data[i].data), length, 0); @@ -176,7 +178,8 @@ static void test_putsf(const testCtx *const p_ctx) { } else { symbol->output_options |= BARCODE_MEMORY_FILE; } - assert_nonzero(fm_open(fmp, symbol, "w"), "i:%d: fm_open fail (%d, %s)\n", i, fmp->err, strerror(fmp->err)); + assert_nonzero(fm_open(fmp, symbol, "w"), "i:%d: fm_open fail (%d, %s)\n", + i, fmp->err, strerror(fmp->err)); if (j == 1) { #ifndef ZINT_TEST_NO_FMEMOPEN /* Hack in `fmemopen()` fp */ @@ -212,7 +215,8 @@ static void test_putsf(const testCtx *const p_ctx) { assert_equal(symbol->memfile_size, expected_size, "i:%d: memfile_size %d != expected_size %d\n", i, symbol->memfile_size, expected_size); assert_nonnull(symbol->memfile, "i:%d memfile NULL\n", i); - assert_zero(memcmp(symbol->memfile, data[i].expected, expected_size), "i:%d: memcmp(%.*s, %.*s) != 0\n", + assert_zero(memcmp(symbol->memfile, data[i].expected, expected_size), + "i:%d: memcmp(%.*s, %.*s) != 0\n", i, symbol->memfile_size, symbol->memfile, expected_size, data[i].expected); } diff --git a/backend/tests/test_gif.c b/backend/tests/test_gif.c index 207d305d..a56ce67f 100644 --- a/backend/tests/test_gif.c +++ b/backend/tests/test_gif.c @@ -93,12 +93,14 @@ static void test_pixel_plot(const testCtx *const p_ctx) { } else { strcpy(data_buf, data[i].pattern); } - assert_equal(size, (int) strlen(data_buf), "i:%d gif_pixel_plot size %d != strlen(data_buf) %d\n", i, size, (int) strlen(data_buf)); + assert_equal(size, (int) strlen(data_buf), "i:%d gif_pixel_plot size %d != strlen(data_buf) %d\n", + i, size, (int) strlen(data_buf)); symbol->bitmap = (unsigned char *) data_buf; ret = gif_pixel_plot(symbol, (unsigned char *) data_buf); - assert_equal(ret, data[i].ret, "i:%d gif_pixel_plot ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); + assert_equal(ret, data[i].ret, "i:%d gif_pixel_plot ret %d != %d (%s)\n", + i, ret, data[i].ret, symbol->errtxt); if (ret < ZINT_ERROR) { if (have_identify) { @@ -200,7 +202,8 @@ static void test_print(const testCtx *const p_ctx) { if (p_ctx->generate) { char data_dir_path[1024]; - assert_nonzero(testUtilDataPath(data_dir_path, sizeof(data_dir_path), data_dir, NULL), "testUtilDataPath(%s) == 0\n", data_dir); + assert_nonzero(testUtilDataPath(data_dir_path, sizeof(data_dir_path), data_dir, NULL), + "testUtilDataPath(%s) == 0\n", data_dir); if (!testUtilDirExists(data_dir_path)) { ret = testUtilMkDir(data_dir_path); assert_zero(ret, "testUtilMkDir(%s) ret %d != 0 (%d: %s)\n", data_dir_path, ret, errno, strerror(errno)); @@ -214,7 +217,9 @@ static void test_print(const testCtx *const p_ctx) { symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, data[i].option_1, data[i].option_2, -1, data[i].output_options, data[i].data, -1, debug); + length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, + data[i].option_1, data[i].option_2, -1 /*option_3*/, data[i].output_options, + data[i].data, -1, debug); if (data[i].border_width != -1) { symbol->border_width = data[i].border_width; } @@ -244,35 +249,45 @@ static void test_print(const testCtx *const p_ctx) { } ret = ZBarcode_Encode(symbol, TCU(data[i].data), length); - assert_zero(ret, "i:%d %s ZBarcode_Encode ret %d != 0 %s\n", i, testUtilBarcodeName(data[i].symbology), ret, symbol->errtxt); + assert_zero(ret, "i:%d %s ZBarcode_Encode ret %d != 0 %s\n", + i, testUtilBarcodeName(data[i].symbology), ret, symbol->errtxt); strcpy(symbol->outfile, gif); ret = ZBarcode_Print(symbol, 0); - assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); + assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); - assert_nonzero(testUtilDataPath(expected_file, sizeof(expected_file), data_dir, data[i].expected_file), "i:%d testUtilDataPath == 0\n", i); + assert_nonzero(testUtilDataPath(expected_file, sizeof(expected_file), data_dir, data[i].expected_file), + "i:%d testUtilDataPath == 0\n", i); if (p_ctx->generate) { printf(" /*%3d*/ { %s, %d, %s, %d, %d, %d, %d, %.5g, %.5g, %.5g, \"%s\", \"%s\", \"%s\", \"%s\", \"%s\" },\n", - i, testUtilBarcodeName(data[i].symbology), data[i].border_width, testUtilOutputOptionsName(data[i].output_options), + i, testUtilBarcodeName(data[i].symbology), data[i].border_width, + testUtilOutputOptionsName(data[i].output_options), data[i].whitespace_width, data[i].whitespace_height, - data[i].option_1, data[i].option_2, data[i].height, data[i].scale, data[i].dot_size, data[i].fgcolour, data[i].bgcolour, - testUtilEscape(data[i].data, length, escaped, escaped_size), data[i].expected_file, data[i].comment); + data[i].option_1, data[i].option_2, data[i].height, data[i].scale, data[i].dot_size, + data[i].fgcolour, data[i].bgcolour, + testUtilEscape(data[i].data, length, escaped, escaped_size), data[i].expected_file, + data[i].comment); ret = testUtilRename(symbol->outfile, expected_file); assert_zero(ret, "i:%d testUtilRename(%s, %s) ret %d != 0\n", i, symbol->outfile, expected_file, ret); if (have_identify) { ret = testUtilVerifyIdentify(have_identify, expected_file, debug); - assert_zero(ret, "i:%d %s identify %s ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), expected_file, ret); + assert_zero(ret, "i:%d %s identify %s ret %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), expected_file, ret); } } else { assert_nonzero(testUtilExists(symbol->outfile), "i:%d testUtilExists(%s) == 0\n", i, symbol->outfile); assert_nonzero(testUtilExists(expected_file), "i:%d testUtilExists(%s) == 0\n", i, expected_file); ret = testUtilCmpBins(symbol->outfile, expected_file); - assert_zero(ret, "i:%d %s testUtilCmpBins(%s, %s) %d != 0\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, expected_file, ret); + assert_zero(ret, "i:%d %s testUtilCmpBins(%s, %s) %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, expected_file, ret); - ret = testUtilReadFile(symbol->outfile, filebuf, sizeof(filebuf), &filebuf_size); /* For BARCODE_MEMORY_FILE */ - assert_zero(ret, "i:%d %s testUtilReadFile(%s) %d != 0\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); + /* For BARCODE_MEMORY_FILE */ + ret = testUtilReadFile(symbol->outfile, filebuf, sizeof(filebuf), &filebuf_size); + assert_zero(ret, "i:%d %s testUtilReadFile(%s) %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); if (!(debug & ZINT_DEBUG_TEST_KEEP_OUTFILE)) { assert_zero(testUtilRemove(symbol->outfile), "i:%d testUtilRemove(%s) != 0\n", i, symbol->outfile); @@ -281,12 +296,13 @@ static void test_print(const testCtx *const p_ctx) { symbol->output_options |= BARCODE_MEMORY_FILE; ret = ZBarcode_Print(symbol, 0); assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0 (%s)\n", - i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret, symbol->errtxt); + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret, symbol->errtxt); assert_nonnull(symbol->memfile, "i:%d %s memfile NULL\n", i, testUtilBarcodeName(data[i].symbology)); assert_equal(symbol->memfile_size, filebuf_size, "i:%d %s memfile_size %d != %d\n", - i, testUtilBarcodeName(data[i].symbology), symbol->memfile_size, filebuf_size); - assert_zero(memcmp(symbol->memfile, filebuf, symbol->memfile_size), "i:%d %s memcmp(memfile, filebuf) != 0\n", - i, testUtilBarcodeName(data[i].symbology)); + i, testUtilBarcodeName(data[i].symbology), symbol->memfile_size, filebuf_size); + assert_zero(memcmp(symbol->memfile, filebuf, symbol->memfile_size), + "i:%d %s memcmp(memfile, filebuf) != 0\n", + i, testUtilBarcodeName(data[i].symbology)); } ZBarcode_Delete(symbol); @@ -314,15 +330,21 @@ static void test_outfile(const testCtx *const p_ctx) { skip_readonly_test = getuid() == 0; /* Skip if running as root on Unix as can't create read-only file */ #endif if (!skip_readonly_test) { - static char expected_errtxt[] = "611: Could not open GIF output file ("; /* Excluding OS-dependent `errno` stuff */ + /* Excluding OS-dependent `errno` stuff */ + static char expected_errtxt[] = "611: Could not open GIF output file ("; (void) testUtilRmROFile(symbol.outfile); /* In case lying around from previous fail */ - assert_nonzero(testUtilCreateROFile(symbol.outfile), "gif_pixel_plot testUtilCreateROFile(%s) fail (%d: %s)\n", symbol.outfile, errno, strerror(errno)); + assert_nonzero(testUtilCreateROFile(symbol.outfile), + "gif_pixel_plot testUtilCreateROFile(%s) fail (%d: %s)\n", + symbol.outfile, errno, strerror(errno)); ret = gif_pixel_plot(&symbol, data); - assert_equal(ret, ZINT_ERROR_FILE_ACCESS, "gif_pixel_plot ret %d != ZINT_ERROR_FILE_ACCESS (%d) (%s)\n", ret, ZINT_ERROR_FILE_ACCESS, symbol.errtxt); - assert_zero(testUtilRmROFile(symbol.outfile), "gif_pixel_plot testUtilRmROFile(%s) != 0 (%d: %s)\n", symbol.outfile, errno, strerror(errno)); - assert_zero(strncmp(symbol.errtxt, expected_errtxt, sizeof(expected_errtxt) - 1), "strncmp(%s, %s) != 0\n", symbol.errtxt, expected_errtxt); + assert_equal(ret, ZINT_ERROR_FILE_ACCESS, "gif_pixel_plot ret %d != ZINT_ERROR_FILE_ACCESS (%d) (%s)\n", + ret, ZINT_ERROR_FILE_ACCESS, symbol.errtxt); + assert_zero(testUtilRmROFile(symbol.outfile), "gif_pixel_plot testUtilRmROFile(%s) != 0 (%d: %s)\n", + symbol.outfile, errno, strerror(errno)); + assert_zero(strncmp(symbol.errtxt, expected_errtxt, sizeof(expected_errtxt) - 1), "strncmp(%s, %s) != 0\n", + symbol.errtxt, expected_errtxt); } symbol.output_options |= BARCODE_STDOUT; @@ -352,7 +374,8 @@ static void test_large_scale(const testCtx *const p_ctx) { symbol.scale = 12.5f; /* 70.0f would cause paging as LZW > 1MB but very slow */ ret = ZBarcode_Encode_and_Print(&symbol, (unsigned char *) data, length, 0 /*rotate_angle*/); - assert_zero(ret, "%s ZBarcode_Encode_and_Print ret %d != 0 %s\n", testUtilBarcodeName(symbol.symbology), ret, symbol.errtxt); + assert_zero(ret, "%s ZBarcode_Encode_and_Print ret %d != 0 %s\n", + testUtilBarcodeName(symbol.symbology), ret, symbol.errtxt); if (!(debug & ZINT_DEBUG_TEST_KEEP_OUTFILE)) { /* -d 64 */ /* 129.1 kB file manually inspected and checked (1.1 MB file for scale 70.0f also checked) */ diff --git a/backend/tests/test_gs1.c b/backend/tests/test_gs1.c index cd131580..feb82e8e 100644 --- a/backend/tests/test_gs1.c +++ b/backend/tests/test_gs1.c @@ -199,7 +199,8 @@ static void test_gs1_reduce(const testCtx *const p_ctx) { char bwipp_buf[8196]; char bwipp_msg[1024]; - int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); /* Only do BWIPP test if asked, too slow otherwise */ + /* Only do BWIPP test if asked, too slow otherwise */ + int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); testStartSymbol(p_ctx->func_name, &symbol); @@ -216,35 +217,44 @@ static void test_gs1_reduce(const testCtx *const p_ctx) { } else { text = data[i].data; } - length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, -1 /*eci*/, -1 /*option_1*/, -1, -1, -1 /*output_options*/, text, -1, debug); + length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, -1 /*eci*/, + -1 /*option_1*/, -1 /*option_2*/, -1 /*option_3*/, -1 /*output_options*/, + text, -1, debug); ret = ZBarcode_Encode(symbol, TCU(text), length); if (p_ctx->generate) { if (data[i].ret == 0) { printf(" /*%2d*/ { %s, %s, \"%s\", \"%s\", %d, \"%s\",\n", - i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), data[i].data, data[i].composite, data[i].ret, data[i].comment); + i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), + data[i].data, data[i].composite, data[i].ret, data[i].comment); testUtilModulesPrint(symbol, " ", "\n"); printf(" },\n"); } else { printf(" /*%2d*/ { %s, %s, \"%s\", \"%s\", %s, \"%s\", \"\" },\n", - i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), data[i].data, data[i].composite, testUtilErrorName(data[i].ret), data[i].comment); + i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), + data[i].data, data[i].composite, testUtilErrorName(data[i].ret), data[i].comment); } } else { - assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); + assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", + i, ret, data[i].ret, symbol->errtxt); if (ret < ZINT_ERROR) { int width, row; ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); - assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data); + assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", + i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data); if (do_bwipp && testUtilCanBwipp(i, symbol, -1, -1, -1, debug)) { - ret = testUtilBwipp(i, symbol, -1, -1, -1, text, length, symbol->primary, bwipp_buf, sizeof(bwipp_buf), NULL); - assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); + ret = testUtilBwipp(i, symbol, -1, -1, -1, text, length, symbol->primary, bwipp_buf, + sizeof(bwipp_buf), NULL); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", + i, testUtilBarcodeName(symbol->symbology), ret); ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, data[i].expected); assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", - i, testUtilBarcodeName(symbol->symbology), ret, bwipp_msg, bwipp_buf, data[i].expected); + i, testUtilBarcodeName(symbol->symbology), ret, bwipp_msg, bwipp_buf, + data[i].expected); } } } @@ -394,7 +404,8 @@ static void test_hrt(const testCtx *const p_ctx) { expected_raw_length = (int) strlen(data[i].expected_raw); ret = ZBarcode_Encode(symbol, TCU(text), length); - assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, data[i].ret, ret, symbol->errtxt); + assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", + i, data[i].ret, ret, symbol->errtxt); assert_equal(symbol->text_length, expected_length, "i:%d text_length %d != expected_length %d\n", i, symbol->text_length, expected_length); @@ -403,10 +414,13 @@ static void test_hrt(const testCtx *const p_ctx) { if (symbol->output_options & BARCODE_RAW_TEXT) { assert_nonnull(symbol->raw_segs, "i:%d raw_segs NULL\n", i); assert_nonnull(symbol->raw_segs[0].source, "i:%d raw_segs[0].source NULL\n", i); - assert_equal(symbol->raw_segs[0].length, expected_raw_length, "i:%d raw_segs[0].length %d != expected_raw_length %d\n", + assert_equal(symbol->raw_segs[0].length, expected_raw_length, + "i:%d raw_segs[0].length %d != expected_raw_length %d\n", i, symbol->raw_segs[0].length, expected_raw_length); - assert_zero(memcmp(symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length), "i:%d memcmp(%s, %s, %d) != 0\n", - i, symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length); + assert_zero(memcmp(symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length), + "i:%d memcmp(%.*s, %s, %d) != 0\n", + i, symbol->raw_segs[0].length, symbol->raw_segs[0].source, data[i].expected_raw, + expected_raw_length); } else { assert_null(symbol->raw_segs, "i:%d raw_segs not NULL\n", i); } @@ -2189,16 +2203,19 @@ static void test_gs1_lint(const testCtx *const p_ctx) { length = (int) strlen(data[i].data); ret = gs1_verify(symbol, (unsigned char *) data[i].data, length, (unsigned char *) reduced, &reduced_length); - assert_equal(ret, data[i].ret, "i:%d ret %d != %d (length %d \"%s\") (%s)\n", i, ret, data[i].ret, length, data[i].data, symbol->errtxt); + assert_equal(ret, data[i].ret, "i:%d ret %d != %d (length %d \"%s\") (%s)\n", + i, ret, data[i].ret, length, data[i].data, symbol->errtxt); if (ret < ZINT_ERROR) { assert_zero(strcmp(reduced, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, testUtilEscape(reduced, reduced_length, escaped, ARRAY_SIZE(escaped)), - testUtilEscape(data[i].expected, (int) strlen(data[i].expected), escaped2, ARRAY_SIZE(escaped2))); + testUtilEscape(data[i].expected, (int) strlen(data[i].expected), escaped2, + ARRAY_SIZE(escaped2))); assert_equal(reduced_length, (int) strlen(reduced), "i:%d reduced_length %d != strlen %d\n", i, reduced_length, (int) strlen(reduced)); } - assert_zero(strcmp(symbol->errtxt, data[i].expected_errtxt), "i:%d strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected_errtxt); + assert_zero(strcmp(symbol->errtxt, data[i].expected_errtxt), "i:%d strcmp(%s, %s) != 0\n", + i, symbol->errtxt, data[i].expected_errtxt); ZBarcode_Delete(symbol); } @@ -2596,11 +2613,15 @@ static void test_gs1nocheck_mode(const testCtx *const p_ctx) { } else { text = data[i].data; } - length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, -1 /*eci*/, -1 /*option_1*/, -1, -1, -1 /*output_options*/, text, -1, debug); + length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, -1 /*eci*/, + -1 /*option_1*/, -1 /*option_2*/, -1 /*option_3*/, -1 /*output_options*/, + text, -1, debug); ret = ZBarcode_Encode(symbol, TCU(text), length); - assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); - assert_zero(strcmp(symbol->errtxt, data[i].expected_errtxt), "i:%d strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected_errtxt); + assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", + i, ret, data[i].ret, symbol->errtxt); + assert_zero(strcmp(symbol->errtxt, data[i].expected_errtxt), "i:%d strcmp(%s, %s) != 0\n", + i, symbol->errtxt, data[i].expected_errtxt); ZBarcode_Delete(symbol); } diff --git a/backend/tests/test_imail.c b/backend/tests/test_imail.c index 20887866..38a4a79a 100644 --- a/backend/tests/test_imail.c +++ b/backend/tests/test_imail.c @@ -211,8 +211,9 @@ static void test_hrt(const testCtx *const p_ctx) { "i:%d raw_segs[0].length %d != expected_raw_length %d\n", i, symbol->raw_segs[0].length, expected_raw_length); assert_zero(memcmp(symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length), - "i:%d memcmp(%s, %s, %d) != 0\n", - i, symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length); + "i:%d memcmp(%.*s, %s, %d) != 0\n", + i, symbol->raw_segs[0].length, symbol->raw_segs[0].source, data[i].expected_raw, + expected_raw_length); } else { assert_null(symbol->raw_segs, "i:%d raw_segs not NULL\n", i); } diff --git a/backend/tests/test_library.c b/backend/tests/test_library.c index b306ebe1..65b5f678 100644 --- a/backend/tests/test_library.c +++ b/backend/tests/test_library.c @@ -230,7 +230,7 @@ static void test_checks(const testCtx *const p_ctx) { assert_nonnull(symbol, "Symbol not created\n"); length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, data[i].eci, - data[i].option_1, -1, -1, -1 /*output_options*/, + data[i].option_1, -1 /*option_2*/, -1 /*option_3*/, -1 /*output_options*/, data[i].data, data[i].length, debug); if (data[i].height) { symbol->height = data[i].height; @@ -329,7 +329,7 @@ static void test_checks_segs(const testCtx *const p_ctx) { assert_nonnull(symbol, "Symbol not created\n"); testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, data[i].eci, - data[i].option_1, -1, -1, -1 /*output_options*/, + data[i].option_1, -1 /*option_2*/, -1 /*option_3*/, -1 /*output_options*/, NULL, 0, debug); if (data[i].warn_level != -1) { symbol->warn_level = data[i].warn_level; @@ -394,7 +394,7 @@ static void test_input_data(const testCtx *const p_ctx) { text = data[i].data; } length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, -1 /*eci*/, - -1 /*option_1*/, -1, -1, -1 /*output_options*/, + -1 /*option_1*/, -1 /*option_2*/, -1 /*option_3*/, -1 /*output_options*/, text, -1, debug); ret = ZBarcode_Encode(symbol, TCU(text), length); @@ -411,7 +411,9 @@ static void test_input_data(const testCtx *const p_ctx) { if (p_ctx->index == -1 && p_ctx->exclude[0] == -1) { char data_buf[ZINT_MAX_DATA_LEN + 10]; int expected_ret = ZINT_ERROR_TOO_LONG; - const char *expected_errtxt[] = { "Error 797: Input too long", "Error 340: Input length 17399 too long (maximum 256)" }; + const char *expected_errtxt[] = { + "Error 797: Input too long", "Error 340: Input length 17399 too long (maximum 256)" + }; symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); @@ -603,8 +605,8 @@ static void test_input_mode(const testCtx *const p_ctx) { symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - length = testUtilSetSymbol(symbol, BARCODE_CODE49 /*Supports GS1*/, data[i].input_mode, - -1 /*eci*/, -1 /*option_1*/, -1, -1, -1 /*output_options*/, + length = testUtilSetSymbol(symbol, BARCODE_CODE49 /*Supports GS1*/, data[i].input_mode, -1 /*eci*/, + -1 /*option_1*/, -1 /*option_2*/, -1 /*option_3*/, -1 /*output_options*/, data[i].data, -1, debug); ret = ZBarcode_Encode(symbol, TCU(data[i].data), length); @@ -753,7 +755,7 @@ static void test_escape_char_process(const testCtx *const p_ctx) { debug |= ZINT_DEBUG_TEST; /* Needed to get codeword dump in errtxt */ length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode | ESCAPE_MODE, data[i].eci, - -1 /*option_1*/, -1, -1, -1 /*output_options*/, + -1 /*option_1*/, -1 /*option_2*/, -1 /*option_3*/, -1 /*output_options*/, text, -1, debug); ret = ZBarcode_Encode(symbol, TCU(text), length); @@ -798,7 +800,7 @@ static void test_escape_char_process(const testCtx *const p_ctx) { symbol2->debug = ZINT_DEBUG_TEST; /* Needed to get codeword dump in errtxt */ (void) testUtilSetSymbol(symbol2, data[i].symbology, data[i].input_mode | ESCAPE_MODE, data[i].eci, - -1 /*option_1*/, -1, -1, -1 /*output_options*/, + -1 /*option_1*/, -1 /*option_2*/, -1 /*option_3*/, -1 /*output_options*/, data[i].data, -1, debug); ret = ZBarcode_Encode_File(symbol2, input_filename); @@ -2047,7 +2049,8 @@ static void test_barcode_name(const testCtx *const p_ctx) { } prev_ret = test_prev_ZBarcode_BarcodeName(symbol_id, prev_name); assert_equal(ret, prev_ret, "ZBarcode_BarcodeName(%d) ret %d != prev_ret %d\n", symbol_id, ret, prev_ret); - assert_zero(strcmp(name, prev_name), "ZBarcode_BarcodeName(%d) strcmp(%s, %s) != 0\n", symbol_id, name, prev_name); + assert_zero(strcmp(name, prev_name), "ZBarcode_BarcodeName(%d) strcmp(%s, %s) != 0\n", + symbol_id, name, prev_name); } testFinish(); @@ -2104,13 +2107,15 @@ static void test_error_tag(const testCtx *const p_ctx) { ret = error_tag_test(data[i].error_number, symbol, -1, data[i].data); assert_equal(ret, data[i].ret, "i:%d ret %d != %d\n", i, ret, data[i].ret); - assert_zero(strcmp(symbol->errtxt, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected); + assert_zero(strcmp(symbol->errtxt, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", + i, symbol->errtxt, data[i].expected); if ((int) strlen(data[i].data) < 100) { strcpy(symbol->errtxt, data[i].data); ret = error_tag_test(data[i].error_number, symbol, -1, NULL); assert_equal(ret, data[i].ret, "i:%d ret %d != %d\n", i, ret, data[i].ret); - assert_zero(strcmp(symbol->errtxt, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected); + assert_zero(strcmp(symbol->errtxt, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", + i, symbol->errtxt, data[i].expected); } } @@ -2169,7 +2174,8 @@ static void test_zero_outfile(const testCtx *const p_ctx) { assert_zero(symbol->outfile[0], "ZBarcode_Encode() outfile non-zero\n"); ret = ZBarcode_Print(symbol, 0); - assert_equal(ret, ZINT_ERROR_INVALID_OPTION, "ZBarcode_Print() ret %d != ZINT_ERROR_INVALID_OPTION (%s)\n", ret, symbol->errtxt); + assert_equal(ret, ZINT_ERROR_INVALID_OPTION, "ZBarcode_Print() ret %d != ZINT_ERROR_INVALID_OPTION (%s)\n", + ret, symbol->errtxt); assert_zero(symbol->outfile[0], "ZBarcode_Print() outfile non-zero\n"); ret = ZBarcode_Buffer(symbol, 0); @@ -2344,10 +2350,13 @@ static void test_reset(const testCtx *const p_ctx) { assert_nonzero(symbol->symbology == symbol_def->symbology, "ZBarcodeBuffer symbology != symbol_def\n"); assert_nonzero(symbol->height == symbol_def->height, "ZBarcodeBuffer height != symbol_def\n"); assert_nonzero(symbol->scale == symbol_def->scale, "ZBarcodeBuffer scale != symbol_def\n"); - assert_nonzero(symbol->whitespace_width == symbol_def->whitespace_width, "ZBarcodeBuffer whitespace_width != symbol_def\n"); - assert_nonzero(symbol->whitespace_height == symbol_def->whitespace_height, "ZBarcodeBuffer whitespace_height != symbol_def\n"); + assert_nonzero(symbol->whitespace_width == symbol_def->whitespace_width, + "ZBarcodeBuffer whitespace_width != symbol_def\n"); + assert_nonzero(symbol->whitespace_height == symbol_def->whitespace_height, + "ZBarcodeBuffer whitespace_height != symbol_def\n"); assert_nonzero(symbol->border_width == symbol_def->border_width, "ZBarcodeBuffer border_width != symbol_def\n"); - assert_nonzero(symbol->output_options == symbol_def->output_options, "ZBarcodeBuffer output_options != symbol_def\n"); + assert_nonzero(symbol->output_options == symbol_def->output_options, + "ZBarcodeBuffer output_options != symbol_def\n"); assert_zero(strcmp(symbol->fgcolour, symbol_def->fgcolour), "ZBarcodeBuffer fgcolour != symbol_def\n"); assert_zero(strcmp(symbol->bgcolour, symbol_def->bgcolour), "ZBarcodeBuffer bgcolour != symbol_def\n"); assert_zero(strcmp(symbol->fgcolor, symbol_def->fgcolor), "ZBarcodeBuffer fgcolor != symbol_def\n"); @@ -2363,9 +2372,12 @@ static void test_reset(const testCtx *const p_ctx) { assert_nonzero(symbol->dpmm == symbol_def->dpmm, "ZBarcodeBuffer dpmm != symbol_def\n"); assert_nonzero(symbol->dot_size == symbol_def->dot_size, "ZBarcodeBuffer dot_size != symbol_def\n"); assert_nonzero(symbol->text_gap == symbol_def->text_gap, "ZBarcodeBuffer text_gap != symbol_def\n"); - assert_nonzero(symbol->guard_descent == symbol_def->guard_descent, "ZBarcodeBuffer guard_descent != symbol_def\n"); - assert_nonzero(symbol->structapp.index == symbol_def->structapp.index, "ZBarcodeBuffer structapp.index != symbol_def\n"); - assert_nonzero(symbol->structapp.count == symbol_def->structapp.count, "ZBarcodeBuffer structapp.count != symbol_def\n"); + assert_nonzero(symbol->guard_descent == symbol_def->guard_descent, + "ZBarcodeBuffer guard_descent != symbol_def\n"); + assert_nonzero(symbol->structapp.index == symbol_def->structapp.index, + "ZBarcodeBuffer structapp.index != symbol_def\n"); + assert_nonzero(symbol->structapp.count == symbol_def->structapp.count, + "ZBarcodeBuffer structapp.count != symbol_def\n"); assert_nonzero(symbol->warn_level == symbol_def->warn_level, "ZBarcodeBuffer warn_level != symbol_def\n"); /* Vector */ @@ -2397,10 +2409,13 @@ static void test_reset(const testCtx *const p_ctx) { assert_nonzero(symbol->symbology == symbol_def->symbology, "ZBarcodeBuffer symbology != symbol_def\n"); assert_nonzero(symbol->height == symbol_def->height, "ZBarcodeBuffer height != symbol_def\n"); assert_nonzero(symbol->scale == symbol_def->scale, "ZBarcodeBuffer scale != symbol_def\n"); - assert_nonzero(symbol->whitespace_width == symbol_def->whitespace_width, "ZBarcodeBuffer whitespace_width != symbol_def\n"); - assert_nonzero(symbol->whitespace_height == symbol_def->whitespace_height, "ZBarcodeBuffer whitespace_height != symbol_def\n"); + assert_nonzero(symbol->whitespace_width == symbol_def->whitespace_width, + "ZBarcodeBuffer whitespace_width != symbol_def\n"); + assert_nonzero(symbol->whitespace_height == symbol_def->whitespace_height, + "ZBarcodeBuffer whitespace_height != symbol_def\n"); assert_nonzero(symbol->border_width == symbol_def->border_width, "ZBarcodeBuffer border_width != symbol_def\n"); - assert_nonzero(symbol->output_options == symbol_def->output_options, "ZBarcodeBuffer output_options != symbol_def\n"); + assert_nonzero(symbol->output_options == symbol_def->output_options, + "ZBarcodeBuffer output_options != symbol_def\n"); assert_zero(strcmp(symbol->fgcolour, symbol_def->fgcolour), "ZBarcodeBuffer fgcolour != symbol_def\n"); assert_zero(strcmp(symbol->bgcolour, symbol_def->bgcolour), "ZBarcodeBuffer bgcolour != symbol_def\n"); assert_zero(strcmp(symbol->fgcolor, symbol_def->fgcolor), "ZBarcodeBuffer fgcolor != symbol_def\n"); @@ -2416,9 +2431,12 @@ static void test_reset(const testCtx *const p_ctx) { assert_nonzero(symbol->dpmm == symbol_def->dpmm, "ZBarcodeBuffer dpmm != symbol_def\n"); assert_nonzero(symbol->dot_size == symbol_def->dot_size, "ZBarcodeBuffer dot_size != symbol_def\n"); assert_nonzero(symbol->text_gap == symbol_def->text_gap, "ZBarcodeBuffer text_gap != symbol_def\n"); - assert_nonzero(symbol->guard_descent == symbol_def->guard_descent, "ZBarcodeBuffer guard_descent != symbol_def\n"); - assert_nonzero(symbol->structapp.index == symbol_def->structapp.index, "ZBarcodeBuffer structapp.index != symbol_def\n"); - assert_nonzero(symbol->structapp.count == symbol_def->structapp.count, "ZBarcodeBuffer structapp.count != symbol_def\n"); + assert_nonzero(symbol->guard_descent == symbol_def->guard_descent, + "ZBarcodeBuffer guard_descent != symbol_def\n"); + assert_nonzero(symbol->structapp.index == symbol_def->structapp.index, + "ZBarcodeBuffer structapp.index != symbol_def\n"); + assert_nonzero(symbol->structapp.count == symbol_def->structapp.count, + "ZBarcodeBuffer structapp.count != symbol_def\n"); assert_nonzero(symbol->warn_level == symbol_def->warn_level, "ZBarcodeBuffer warn_level != symbol_def\n"); ZBarcode_Delete(symbol); @@ -2538,20 +2556,26 @@ static void test_scale_from_xdimdp(const testCtx *const p_ctx) { ret = ZBarcode_Scale_From_XdimDp(data[i].symbology, data[i].x_dim, data[i].dpmm, data[i].filetype); assert_equal(ret, data[i].expected, "i:%d ZBarcode_Scale_From_XdimDp(%s, %g, %g, %s) %.8g != %.8g\n", - i, testUtilBarcodeName(data[i].symbology), data[i].dpmm, data[i].x_dim, data[i].filetype, ret, data[i].expected); + i, testUtilBarcodeName(data[i].symbology), data[i].dpmm, data[i].x_dim, data[i].filetype, ret, + data[i].expected); if (ret) { dpmm_from_dpi = stripf(roundf(data[i].dpi / 25.4f)); ret = ZBarcode_Scale_From_XdimDp(data[i].symbology, data[i].x_dim, dpmm_from_dpi, data[i].filetype); - assert_equal(ret, data[i].expected, "i:%d ZBarcode_Scale_From_XdimDp(%s, %g (dpi %d), %g, %s) %.8g != %.8g\n", - i, testUtilBarcodeName(data[i].symbology), dpmm_from_dpi, data[i].dpi, data[i].x_dim, data[i].filetype, ret, data[i].expected); + assert_equal(ret, data[i].expected, + "i:%d ZBarcode_Scale_From_XdimDp(%s, %g (dpi %d), %g, %s) %.8g != %.8g\n", + i, testUtilBarcodeName(data[i].symbology), dpmm_from_dpi, data[i].dpi, data[i].x_dim, + data[i].filetype, ret, data[i].expected); if (data[i].expected > 0.1f && data[i].expected < 200.0f /* Can't round trip scales <= 0.1 or >= 200.0 */ - && (data[i].symbology == BARCODE_MAXICODE || strcmp(data[i].filetype, "gif") != 0)) { /* Non-MAXICODE raster rounds to half-increments */ + /* Non-MAXICODE raster rounds to half-increments */ + && (data[i].symbology == BARCODE_MAXICODE || strcmp(data[i].filetype, "gif") != 0)) { x_dim_from_scale = ZBarcode_XdimDp_From_Scale(data[i].symbology, ret, data[i].dpmm, data[i].filetype); x_dim_from_scale = stripf(stripf(roundf(x_dim_from_scale * 100.0f)) / 100.0f); - assert_equal(x_dim_from_scale, data[i].x_dim, "i:%d ZBarcode_XdimDp_From_Scale(%s, %g, %g, %s) %.8g != x_dim %.8g\n", - i, testUtilBarcodeName(data[i].symbology), ret, data[i].x_dim, data[i].filetype, x_dim_from_scale, data[i].x_dim); + assert_equal(x_dim_from_scale, data[i].x_dim, + "i:%d ZBarcode_XdimDp_From_Scale(%s, %g, %g, %s) %.8g != x_dim %.8g\n", + i, testUtilBarcodeName(data[i].symbology), ret, data[i].x_dim, data[i].filetype, + x_dim_from_scale, data[i].x_dim); } } } @@ -2612,13 +2636,16 @@ static void test_xdimdp_from_scale(const testCtx *const p_ctx) { ret = ZBarcode_XdimDp_From_Scale(data[i].symbology, data[i].scale, data[i].dpmm, data[i].filetype); assert_equal(ret, data[i].expected, "i:%d ZBarcode_XdimDp_From_Scale(%s, %g, %g, %s) %.8g != %.8g\n", - i, testUtilBarcodeName(data[i].symbology), data[i].dpmm, data[i].scale, data[i].filetype, ret, data[i].expected); + i, testUtilBarcodeName(data[i].symbology), data[i].dpmm, data[i].scale, data[i].filetype, ret, + data[i].expected); if (ret) { dpmm_from_dpi = stripf(roundf(data[i].dpi / 25.4f)); ret = ZBarcode_XdimDp_From_Scale(data[i].symbology, data[i].scale, dpmm_from_dpi, data[i].filetype); - assert_equal(ret, data[i].expected, "i:%d ZBarcode_XdimDp_From_Scale(%s, %g (dpi %d), %g, %s) %.8g != %.8g\n", - i, testUtilBarcodeName(data[i].symbology), dpmm_from_dpi, data[i].dpi, data[i].scale, data[i].filetype, ret, data[i].expected); + assert_equal(ret, data[i].expected, + "i:%d ZBarcode_XdimDp_From_Scale(%s, %g (dpi %d), %g, %s) %.8g != %.8g\n", + i, testUtilBarcodeName(data[i].symbology), dpmm_from_dpi, data[i].dpi, data[i].scale, + data[i].filetype, ret, data[i].expected); } } @@ -2724,10 +2751,12 @@ static void test_utf8_to_eci(const testCtx *const p_ctx) { "i:%d ZBarcode_UTF8_To_ECI dest_length %d != expected_length %d\n", i, dest_length, expected_length); #if 0 - printf("dest_length %d\n", dest_length); debug_print_escape(TCU(dest), dest_length, NULL); printf("\n"); + printf("dest_length %d\n", dest_length); debug_print_escape(TCU(dest), dest_length, NULL); + printf("\n"); #endif - assert_zero(memcmp(dest, data[i].expected, expected_length), "i:%d memcmp(\"%s\", \"%s\", %d) != 0\n", - i, dest, data[i].expected, expected_length); + assert_zero(memcmp(dest, data[i].expected, expected_length), + "i:%d memcmp(\"%.*s\", \"%s\", %d) != 0\n", + i, dest_length, dest, data[i].expected, expected_length); } } } @@ -2771,10 +2800,10 @@ static void test_raw_text(const testCtx *const p_ctx) { /* 22*/ { BARCODE_DBAR_LTD, -1, "1234567890123", "0112345678901231" }, /* 23*/ { BARCODE_DBAR_EXP, -1, "[01]12345678901231", "0112345678901231" }, /* 24*/ { BARCODE_TELEPEN, -1, "1234567890", "1234567890n" }, - /* 25*/ { BARCODE_UPCA, -1, "12345678901", "123456789012" }, - /* 26*/ { BARCODE_UPCA_CHK, -1, "123456789012", "123456789012" }, - /* 27*/ { BARCODE_UPCE, -1, "1234567", "12345670" }, - /* 28*/ { BARCODE_UPCE_CHK, -1, "12345670", "" }, + /* 25*/ { BARCODE_UPCA, -1, "12345678901", "0123456789012" }, + /* 26*/ { BARCODE_UPCA_CHK, -1, "123456789012", "0123456789012" }, + /* 27*/ { BARCODE_UPCE, -1, "1234567", "0123456000070" }, + /* 28*/ { BARCODE_UPCE_CHK, -1, "12345670", "0123456000070" }, /* 29*/ { BARCODE_POSTNET, -1, "12345678901", "123456789014" }, /* 30*/ { BARCODE_MSI_PLESSEY, -1, "1234567890", "" }, /* 31*/ { BARCODE_FIM, -1, "A", "" }, @@ -2840,8 +2869,8 @@ static void test_raw_text(const testCtx *const p_ctx) { /* 91*/ { BARCODE_DBAR_OMN_CC, -1, "1234567890123", "0112345678901231|2001" }, /* 92*/ { BARCODE_DBAR_LTD_CC, -1, "1234567890123", "0112345678901231|2001" }, /* 93*/ { BARCODE_DBAR_EXP_CC, -1, "[01]12345678901231", "0112345678901231|2001" }, - /* 94*/ { BARCODE_UPCA_CC, -1, "12345678901", "123456789012|2001" }, - /* 95*/ { BARCODE_UPCE_CC, -1, "1234567", "12345670|2001" }, + /* 94*/ { BARCODE_UPCA_CC, -1, "12345678901", "0123456789012|2001" }, + /* 95*/ { BARCODE_UPCE_CC, -1, "1234567", "0123456000070|2001" }, /* 96*/ { BARCODE_DBAR_STK_CC, -1, "1234567890123", "0112345678901231|2001" }, /* 97*/ { BARCODE_DBAR_OMNSTK_CC, -1, "1234567890123", "0112345678901231|2001" }, /* 98*/ { BARCODE_DBAR_EXPSTK_CC, -1, "[01]12345678901231", "0112345678901231|2001" }, @@ -2882,8 +2911,8 @@ static void test_raw_text(const testCtx *const p_ctx) { text = data[i].data; } length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, -1 /*eci*/, - -1 /*option_1*/, -1 /*option_2*/, -1 /*option_3*/, BARCODE_RAW_TEXT, - text, -1, debug); + -1 /*option_1*/, -1 /*option_2*/, -1 /*option_3*/, BARCODE_RAW_TEXT, + text, -1, debug); expected = data[i].expected[0] ? data[i].expected : data[i].data; expected_length = (int) strlen(expected); diff --git a/backend/tests/test_mailmark.c b/backend/tests/test_mailmark.c index 84716196..7bb83a3b 100644 --- a/backend/tests/test_mailmark.c +++ b/backend/tests/test_mailmark.c @@ -88,8 +88,9 @@ static void test_4s_hrt(const testCtx *const p_ctx) { "i:%d raw_segs[0].length %d != expected_raw_length %d\n", i, symbol->raw_segs[0].length, expected_raw_length); assert_zero(memcmp(symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length), - "i:%d memcmp(%s, %s, %d) != 0\n", - i, symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length); + "i:%d memcmp(%.*s, %s, %d) != 0\n", + i, symbol->raw_segs[0].length, symbol->raw_segs[0].source, data[i].expected_raw, + expected_raw_length); } else { assert_null(symbol->raw_segs, "i:%d raw_segs not NULL\n", i); } diff --git a/backend/tests/test_medical.c b/backend/tests/test_medical.c index 485467ff..107ef843 100644 --- a/backend/tests/test_medical.c +++ b/backend/tests/test_medical.c @@ -172,8 +172,9 @@ static void test_hrt(const testCtx *const p_ctx) { "i:%d raw_segs[0].length %d != expected_raw_length %d\n", i, symbol->raw_segs[0].length, expected_raw_length); assert_zero(memcmp(symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length), - "i:%d memcmp(%s, %s, %d) != 0\n", - i, symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length); + "i:%d memcmp(%.*s, %s, %d) != 0\n", + i, symbol->raw_segs[0].length, symbol->raw_segs[0].source, data[i].expected_raw, + expected_raw_length); } else { assert_null(symbol->raw_segs, "i:%d raw_segs not NULL\n", i); } diff --git a/backend/tests/test_pcx.c b/backend/tests/test_pcx.c index c01a2743..ed889c79 100644 --- a/backend/tests/test_pcx.c +++ b/backend/tests/test_pcx.c @@ -74,7 +74,8 @@ static void test_print(const testCtx *const p_ctx) { if (p_ctx->generate) { char data_dir_path[1024]; - assert_nonzero(testUtilDataPath(data_dir_path, sizeof(data_dir_path), data_dir, NULL), "testUtilDataPath(%s) == 0\n", data_dir); + assert_nonzero(testUtilDataPath(data_dir_path, sizeof(data_dir_path), data_dir, NULL), + "testUtilDataPath(%s) == 0\n", data_dir); if (!testUtilDirExists(data_dir_path)) { ret = testUtilMkDir(data_dir_path); assert_zero(ret, "testUtilMkDir(%s) ret %d != 0 (%d: %s)\n", data_dir_path, ret, errno, strerror(errno)); @@ -88,7 +89,9 @@ static void test_print(const testCtx *const p_ctx) { symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, data[i].option_1, data[i].option_2, -1, data[i].output_options, data[i].data, -1, debug); + length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, + data[i].option_1, data[i].option_2, -1 /*option_3*/, data[i].output_options, + data[i].data, -1, debug); if (data[i].border_width != -1) { symbol->border_width = data[i].border_width; } @@ -110,35 +113,44 @@ static void test_print(const testCtx *const p_ctx) { symbol->debug |= debug; ret = ZBarcode_Encode(symbol, TCU(data[i].data), length); - assert_zero(ret, "i:%d %s ZBarcode_Encode ret %d != 0 %s\n", i, testUtilBarcodeName(data[i].symbology), ret, symbol->errtxt); + assert_zero(ret, "i:%d %s ZBarcode_Encode ret %d != 0 %s\n", + i, testUtilBarcodeName(data[i].symbology), ret, symbol->errtxt); strcpy(symbol->outfile, pcx); ret = ZBarcode_Print(symbol, 0); - assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); + assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); - assert_nonzero(testUtilDataPath(expected_file, sizeof(expected_file), data_dir, data[i].expected_file), "i:%d testUtilDataPath == 0\n", i); + assert_nonzero(testUtilDataPath(expected_file, sizeof(expected_file), data_dir, data[i].expected_file), + "i:%d testUtilDataPath == 0\n", i); if (p_ctx->generate) { printf(" /*%3d*/ { %s, %d, %s, %d, %d, %d, %d, \"%s\", \"%s\", %.5g, \"%s\", \"%s\"},\n", - i, testUtilBarcodeName(data[i].symbology), data[i].border_width, testUtilOutputOptionsName(data[i].output_options), + i, testUtilBarcodeName(data[i].symbology), data[i].border_width, + testUtilOutputOptionsName(data[i].output_options), data[i].whitespace_width, data[i].whitespace_height, data[i].option_1, data[i].option_2, data[i].fgcolour, data[i].bgcolour, data[i].scale, testUtilEscape(data[i].data, length, escaped, escaped_size), data[i].expected_file); ret = testUtilRename(symbol->outfile, expected_file); - assert_zero(ret, "i:%d testUtilRename(%s, %s) ret %d != 0 (%d: %s)\n", i, symbol->outfile, expected_file, ret, errno, strerror(errno)); + assert_zero(ret, "i:%d testUtilRename(%s, %s) ret %d != 0 (%d: %s)\n", + i, symbol->outfile, expected_file, ret, errno, strerror(errno)); if (have_identify) { ret = testUtilVerifyIdentify(have_identify, expected_file, debug); - assert_zero(ret, "i:%d %s identify %s ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), expected_file, ret); + assert_zero(ret, "i:%d %s identify %s ret %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), expected_file, ret); } } else { assert_nonzero(testUtilExists(symbol->outfile), "i:%d testUtilExists(%s) == 0\n", i, symbol->outfile); assert_nonzero(testUtilExists(expected_file), "i:%d testUtilExists(%s) == 0\n", i, expected_file); ret = testUtilCmpBins(symbol->outfile, expected_file); - assert_zero(ret, "i:%d %s testUtilCmpBins(%s, %s) %d != 0\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, expected_file, ret); + assert_zero(ret, "i:%d %s testUtilCmpBins(%s, %s) %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, expected_file, ret); - ret = testUtilReadFile(symbol->outfile, filebuf, sizeof(filebuf), &filebuf_size); /* For BARCODE_MEMORY_FILE */ - assert_zero(ret, "i:%d %s testUtilReadFile(%s) %d != 0\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); + /* For BARCODE_MEMORY_FILE */ + ret = testUtilReadFile(symbol->outfile, filebuf, sizeof(filebuf), &filebuf_size); + assert_zero(ret, "i:%d %s testUtilReadFile(%s) %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); if (!(debug & ZINT_DEBUG_TEST_KEEP_OUTFILE)) { assert_zero(testUtilRemove(symbol->outfile), "i:%d testUtilRemove(%s) != 0\n", i, symbol->outfile); @@ -147,12 +159,13 @@ static void test_print(const testCtx *const p_ctx) { symbol->output_options |= BARCODE_MEMORY_FILE; ret = ZBarcode_Print(symbol, 0); assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0 (%s)\n", - i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret, symbol->errtxt); + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret, symbol->errtxt); assert_nonnull(symbol->memfile, "i:%d %s memfile NULL\n", i, testUtilBarcodeName(data[i].symbology)); assert_equal(symbol->memfile_size, filebuf_size, "i:%d %s memfile_size %d != %d\n", - i, testUtilBarcodeName(data[i].symbology), symbol->memfile_size, filebuf_size); - assert_zero(memcmp(symbol->memfile, filebuf, symbol->memfile_size), "i:%d %s memcmp(memfile, filebuf) != 0\n", - i, testUtilBarcodeName(data[i].symbology)); + i, testUtilBarcodeName(data[i].symbology), symbol->memfile_size, filebuf_size); + assert_zero(memcmp(symbol->memfile, filebuf, symbol->memfile_size), + "i:%d %s memcmp(memfile, filebuf) != 0\n", + i, testUtilBarcodeName(data[i].symbology)); } ZBarcode_Delete(symbol); @@ -182,15 +195,21 @@ static void test_outfile(const testCtx *const p_ctx) { skip_readonly_test = getuid() == 0; /* Skip if running as root on Unix as can't create read-only file */ #endif if (!skip_readonly_test) { - static char expected_errtxt[] = "621: Could not open PCX output file ("; /* Excluding OS-dependent `errno` stuff */ + /* Excluding OS-dependent `errno` stuff */ + static char expected_errtxt[] = "621: Could not open PCX output file ("; (void) testUtilRmROFile(symbol.outfile); /* In case lying around from previous fail */ - assert_nonzero(testUtilCreateROFile(symbol.outfile), "pcx_pixel_plot testUtilCreateROFile(%s) fail (%d: %s)\n", symbol.outfile, errno, strerror(errno)); + assert_nonzero(testUtilCreateROFile(symbol.outfile), + "pcx_pixel_plot testUtilCreateROFile(%s) fail (%d: %s)\n", + symbol.outfile, errno, strerror(errno)); ret = pcx_pixel_plot(&symbol, data); - assert_equal(ret, ZINT_ERROR_FILE_ACCESS, "pcx_pixel_plot ret %d != ZINT_ERROR_FILE_ACCESS (%d) (%s)\n", ret, ZINT_ERROR_FILE_ACCESS, symbol.errtxt); - assert_zero(testUtilRmROFile(symbol.outfile), "pcx_pixel_plot testUtilRmROFile(%s) != 0 (%d: %s)\n", symbol.outfile, errno, strerror(errno)); - assert_zero(strncmp(symbol.errtxt, expected_errtxt, sizeof(expected_errtxt) - 1), "strncmp(%s, %s) != 0\n", symbol.errtxt, expected_errtxt); + assert_equal(ret, ZINT_ERROR_FILE_ACCESS, "pcx_pixel_plot ret %d != ZINT_ERROR_FILE_ACCESS (%d) (%s)\n", + ret, ZINT_ERROR_FILE_ACCESS, symbol.errtxt); + assert_zero(testUtilRmROFile(symbol.outfile), "pcx_pixel_plot testUtilRmROFile(%s) != 0 (%d: %s)\n", + symbol.outfile, errno, strerror(errno)); + assert_zero(strncmp(symbol.errtxt, expected_errtxt, sizeof(expected_errtxt) - 1), "strncmp(%s, %s) != 0\n", + symbol.errtxt, expected_errtxt); } symbol.output_options |= BARCODE_STDOUT; diff --git a/backend/tests/test_plessey.c b/backend/tests/test_plessey.c index 723beb03..ab75857d 100644 --- a/backend/tests/test_plessey.c +++ b/backend/tests/test_plessey.c @@ -228,8 +228,9 @@ static void test_hrt(const testCtx *const p_ctx) { "i:%d raw_segs[0].length %d != expected_raw_length %d\n", i, symbol->raw_segs[0].length, expected_raw_length); assert_zero(memcmp(symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length), - "i:%d memcmp(%s, %s, %d) != 0\n", - i, symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length); + "i:%d memcmp(%.*s, %s, %d) != 0\n", + i, symbol->raw_segs[0].length, symbol->raw_segs[0].source, data[i].expected_raw, + expected_raw_length); } else { assert_null(symbol->raw_segs, "i:%d raw_segs not NULL\n", i); } diff --git a/backend/tests/test_png.c b/backend/tests/test_png.c index 1187820e..3d5c776f 100644 --- a/backend/tests/test_png.c +++ b/backend/tests/test_png.c @@ -83,19 +83,22 @@ static void test_pixel_plot(const testCtx *const p_ctx) { symbol->debug |= debug; size = data[i].width * data[i].height; - assert_nonzero(size < (int) sizeof(data_buf), "i:%d png_pixel_plot size %d < sizeof(data_buf) %d\n", i, size, (int) sizeof(data_buf)); + assert_nonzero(size < (int) sizeof(data_buf), "i:%d png_pixel_plot size %d < sizeof(data_buf) %d\n", + i, size, (int) sizeof(data_buf)); if (data[i].repeat) { testUtilStrCpyRepeat(data_buf, data[i].pattern, size); } else { strcpy(data_buf, data[i].pattern); } - assert_equal(size, (int) strlen(data_buf), "i:%d png_pixel_plot size %d != strlen(data_buf) %d\n", i, size, (int) strlen(data_buf)); + assert_equal(size, (int) strlen(data_buf), "i:%d png_pixel_plot size %d != strlen(data_buf) %d\n", + i, size, (int) strlen(data_buf)); symbol->bitmap = (unsigned char *) data_buf; ret = png_pixel_plot(symbol, (unsigned char *) data_buf); - assert_equal(ret, data[i].ret, "i:%d png_pixel_plot ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); + assert_equal(ret, data[i].ret, "i:%d png_pixel_plot ret %d != %d (%s)\n", + i, ret, data[i].ret, symbol->errtxt); if (ret < ZINT_ERROR) { if (have_identify) { @@ -195,14 +198,14 @@ static void test_print(const testCtx *const p_ctx) { /* 47*/ { BARCODE_UPCE_CC, -1, -1, -1, -1, -1, 0, 2, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1876543+56789", "[91]12345", 0, "upce_cc_5addon_ccb_8x2_notext.png", "" }, /* 48*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1234567", "", 0, "ean8_gss_5.2.2.2-1.png", "" }, /* 49*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1234567", "", 0, "ean8_gss_5.2.2.2-1_gws.png", "" }, - /* 50*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1234567+12", "", 0, "ean8_2addon.png", "" }, - /* 51*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1234567+12", "", 0, "ean8_2addon_gws.png", "" }, - /* 52*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1234567+12345", "", 0, "ean8_5addon.png", "" }, - /* 53*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1234567+12345", "", 0, "ean8_5addon_gws.png", "" }, - /* 54*/ { BARCODE_EANX_CC, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "9876543+65", "[91]1234567", 0, "ean8_cc_2addon_cca_4x3.png", "" }, - /* 55*/ { BARCODE_EANX_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "9876543+65", "[91]1234567", 0, "ean8_cc_2addon_cca_4x3_gws.png", "" }, - /* 56*/ { BARCODE_EANX_CC, -1, -1, -1, -1, -1, -1, 2, -1, 0, 0, { 0, 0, "" }, "", "", 1, "9876543+74083", "[91]123456789012345678", 0, "ean8_cc_5addon_ccb_8x3.png", "" }, - /* 57*/ { BARCODE_EANX_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, 2, -1, 0, 0, { 0, 0, "" }, "", "", 1, "9876543+74083", "[91]123456789012345678", 0, "ean8_cc_5addon_ccb_8x3_gws.png", "" }, + /* 50*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1234567+12", "", ZINT_WARN_NONCOMPLIANT, "ean8_2addon.png", "" }, + /* 51*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1234567+12", "", ZINT_WARN_NONCOMPLIANT, "ean8_2addon_gws.png", "" }, + /* 52*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1234567+12345", "", ZINT_WARN_NONCOMPLIANT, "ean8_5addon.png", "" }, + /* 53*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1234567+12345", "", ZINT_WARN_NONCOMPLIANT, "ean8_5addon_gws.png", "" }, + /* 54*/ { BARCODE_EANX_CC, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "9876543+65", "[91]1234567", ZINT_WARN_NONCOMPLIANT, "ean8_cc_2addon_cca_4x3.png", "" }, + /* 55*/ { BARCODE_EANX_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "9876543+65", "[91]1234567", ZINT_WARN_NONCOMPLIANT, "ean8_cc_2addon_cca_4x3_gws.png", "" }, + /* 56*/ { BARCODE_EANX_CC, -1, -1, -1, -1, -1, -1, 2, -1, 0, 0, { 0, 0, "" }, "", "", 1, "9876543+74083", "[91]123456789012345678", ZINT_WARN_NONCOMPLIANT, "ean8_cc_5addon_ccb_8x3.png", "" }, + /* 57*/ { BARCODE_EANX_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, 2, -1, 0, 0, { 0, 0, "" }, "", "", 1, "9876543+74083", "[91]123456789012345678", ZINT_WARN_NONCOMPLIANT, "ean8_cc_5addon_ccb_8x3_gws.png", "" }, /* 58*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "12345", "", 0, "ean5.png", "" }, /* 59*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "12345", "", 0, "ean5_gws.png", "" }, /* 60*/ { BARCODE_EANX, -1, 2, BARCODE_BIND, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "12345", "", 0, "ean5_bind2.png", "" }, @@ -257,7 +260,8 @@ static void test_print(const testCtx *const p_ctx) { if (p_ctx->generate) { char data_dir_path[1024]; - assert_nonzero(testUtilDataPath(data_dir_path, sizeof(data_dir_path), data_dir, NULL), "testUtilDataPath(%s) == 0\n", data_dir); + assert_nonzero(testUtilDataPath(data_dir_path, sizeof(data_dir_path), data_dir, NULL), + "testUtilDataPath(%s) == 0\n", data_dir); if (!testUtilDirExists(data_dir_path)) { ret = testUtilMkDir(data_dir_path); assert_zero(ret, "testUtilMkDir(%s) ret %d != 0 (%d: %s)\n", data_dir_path, ret, errno, strerror(errno)); @@ -272,7 +276,9 @@ static void test_print(const testCtx *const p_ctx) { symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, -1 /*eci*/, data[i].option_1, data[i].option_2, -1, data[i].output_options, data[i].data, -1, debug); + length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, -1 /*eci*/, + data[i].option_1, data[i].option_2, -1 /*option_3*/, data[i].output_options, + data[i].data, -1, debug); if (data[i].show_hrt != -1) { symbol->show_hrt = data[i].show_hrt; } @@ -311,40 +317,51 @@ static void test_print(const testCtx *const p_ctx) { text_length = (int) strlen(text); ret = ZBarcode_Encode(symbol, TCU(text), text_length); - assert_equal(ret, data[i].ret, "i:%d %s ZBarcode_Encode ret %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, data[i].ret, symbol->errtxt); + assert_equal(ret, data[i].ret, "i:%d %s ZBarcode_Encode ret %d != %d (%s)\n", + i, testUtilBarcodeName(data[i].symbology), ret, data[i].ret, symbol->errtxt); strcpy(symbol->outfile, png); ret = ZBarcode_Print(symbol, 0); - assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0 (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret, symbol->errtxt); + assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0 (%s)\n", + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret, symbol->errtxt); - assert_nonzero(testUtilDataPath(expected_file, sizeof(expected_file), data_dir, data[i].expected_file), "i:%d testUtilDataPath == 0\n", i); + assert_nonzero(testUtilDataPath(expected_file, sizeof(expected_file), data_dir, data[i].expected_file), + "i:%d testUtilDataPath == 0\n", i); if (p_ctx->generate) { printf(" /*%3d*/ { %s, %s, %d, %s, %d, %d, %d, %d, %d, %.5g, %.5g, { %d, %d, \"%s\" }, \"%s\", \"%s\", %.5g, \"%s\", \"%s\", %s, \"%s\", \"%s\" },\n", - i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), data[i].border_width, testUtilOutputOptionsName(data[i].output_options), - data[i].whitespace_width, data[i].whitespace_height, data[i].show_hrt, data[i].option_1, data[i].option_2, data[i].height, data[i].scale, + i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), + data[i].border_width, testUtilOutputOptionsName(data[i].output_options), + data[i].whitespace_width, data[i].whitespace_height, data[i].show_hrt, + data[i].option_1, data[i].option_2, data[i].height, data[i].scale, data[i].structapp.index, data[i].structapp.count, data[i].structapp.id, data[i].fgcolour, data[i].bgcolour, data[i].text_gap, - testUtilEscape(data[i].data, length, escaped, escaped_size), data[i].composite, testUtilErrorName(data[i].ret), data[i].expected_file, data[i].comment); + testUtilEscape(data[i].data, length, escaped, escaped_size), data[i].composite, + testUtilErrorName(data[i].ret), data[i].expected_file, data[i].comment); ret = testUtilRename(symbol->outfile, expected_file); assert_zero(ret, "i:%d testUtilRename(%s, %s) ret %d != 0\n", i, symbol->outfile, expected_file, ret); if (have_identify) { ret = testUtilVerifyIdentify(have_identify, expected_file, debug); - assert_zero(ret, "i:%d %s identify %s ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), expected_file, ret); + assert_zero(ret, "i:%d %s identify %s ret %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), expected_file, ret); } } else { assert_nonzero(testUtilExists(symbol->outfile), "i:%d testUtilExists(%s) == 0\n", i, symbol->outfile); assert_nonzero(testUtilExists(expected_file), "i:%d testUtilExists(%s) == 0\n", i, expected_file); ret = testUtilCmpPngs(symbol->outfile, expected_file); - assert_zero(ret, "i:%d %s testUtilCmpPngs(%s, %s) %d != 0\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, expected_file, ret); + assert_zero(ret, "i:%d %s testUtilCmpPngs(%s, %s) %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, expected_file, ret); #ifndef ZLIBNG_VERSION /* zlib-ng (used by e.g. Fedora 40) may produce non-binary compat output */ ret = testUtilCmpBins(symbol->outfile, expected_file); - assert_zero(ret, "i:%d %s testUtilCmpBins(%s, %s) %d != 0\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, expected_file, ret); + assert_zero(ret, "i:%d %s testUtilCmpBins(%s, %s) %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, expected_file, ret); #endif - ret = testUtilReadFile(symbol->outfile, filebuf, sizeof(filebuf), &filebuf_size); /* For BARCODE_MEMORY_FILE */ - assert_zero(ret, "i:%d %s testUtilReadFile(%s) %d != 0\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); + /* For BARCODE_MEMORY_FILE */ + ret = testUtilReadFile(symbol->outfile, filebuf, sizeof(filebuf), &filebuf_size); + assert_zero(ret, "i:%d %s testUtilReadFile(%s) %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); if (!(debug & ZINT_DEBUG_TEST_KEEP_OUTFILE)) { assert_zero(testUtilRemove(symbol->outfile), "i:%d testUtilRemove(%s) != 0\n", i, symbol->outfile); @@ -353,12 +370,13 @@ static void test_print(const testCtx *const p_ctx) { symbol->output_options |= BARCODE_MEMORY_FILE; ret = ZBarcode_Print(symbol, 0); assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0 (%s)\n", - i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret, symbol->errtxt); + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret, symbol->errtxt); assert_nonnull(symbol->memfile, "i:%d %s memfile NULL\n", i, testUtilBarcodeName(data[i].symbology)); assert_equal(symbol->memfile_size, filebuf_size, "i:%d %s memfile_size %d != %d\n", - i, testUtilBarcodeName(data[i].symbology), symbol->memfile_size, filebuf_size); - assert_zero(memcmp(symbol->memfile, filebuf, symbol->memfile_size), "i:%d %s memcmp(memfile, filebuf) != 0\n", - i, testUtilBarcodeName(data[i].symbology)); + i, testUtilBarcodeName(data[i].symbology), symbol->memfile_size, filebuf_size); + assert_zero(memcmp(symbol->memfile, filebuf, symbol->memfile_size), + "i:%d %s memcmp(memfile, filebuf) != 0\n", + i, testUtilBarcodeName(data[i].symbology)); } ZBarcode_Delete(symbol); @@ -386,15 +404,21 @@ static void test_outfile(const testCtx *const p_ctx) { skip_readonly_test = getuid() == 0; /* Skip if running as root on Unix as can't create read-only file */ #endif if (!skip_readonly_test) { - static char expected_errtxt[] = "632: Could not open PNG output file ("; /* Excluding OS-dependent `errno` stuff */ + /* Excluding OS-dependent `errno` stuff */ + static char expected_errtxt[] = "632: Could not open PNG output file ("; (void) testUtilRmROFile(symbol.outfile); /* In case lying around from previous fail */ - assert_nonzero(testUtilCreateROFile(symbol.outfile), "png_pixel_plot testUtilCreateROFile(%s) fail (%d: %s)\n", symbol.outfile, errno, strerror(errno)); + assert_nonzero(testUtilCreateROFile(symbol.outfile), + "png_pixel_plot testUtilCreateROFile(%s) fail (%d: %s)\n", + symbol.outfile, errno, strerror(errno)); ret = png_pixel_plot(&symbol, data); - assert_equal(ret, ZINT_ERROR_FILE_ACCESS, "png_pixel_plot ret %d != ZINT_ERROR_FILE_ACCESS (%d) (%s)\n", ret, ZINT_ERROR_FILE_ACCESS, symbol.errtxt); - assert_zero(testUtilRmROFile(symbol.outfile), "png_pixel_plot testUtilRmROFile(%s) != 0 (%d: %s)\n", symbol.outfile, errno, strerror(errno)); - assert_zero(strncmp(symbol.errtxt, expected_errtxt, sizeof(expected_errtxt) - 1), "strncmp(%s, %s) != 0\n", symbol.errtxt, expected_errtxt); + assert_equal(ret, ZINT_ERROR_FILE_ACCESS, "png_pixel_plot ret %d != ZINT_ERROR_FILE_ACCESS (%d) (%s)\n", + ret, ZINT_ERROR_FILE_ACCESS, symbol.errtxt); + assert_zero(testUtilRmROFile(symbol.outfile), "png_pixel_plot testUtilRmROFile(%s) != 0 (%d: %s)\n", + symbol.outfile, errno, strerror(errno)); + assert_zero(strncmp(symbol.errtxt, expected_errtxt, sizeof(expected_errtxt) - 1), "strncmp(%s, %s) != 0\n", + symbol.errtxt, expected_errtxt); } symbol.output_options |= BARCODE_STDOUT; @@ -484,7 +508,8 @@ static void test_large_compliant_height(const testCtx *const p_ctx) { symbol->symbology = BARCODE_CODABLOCKF; symbol->output_options |= COMPLIANT_HEIGHT; testUtilStrCpyRepeat(data_buf, pattern, codablockf_max); - assert_equal(codablockf_max, (int) strlen(data_buf), "length %d != strlen(data_buf) %d\n", codablockf_max, (int) strlen(data_buf)); + assert_equal(codablockf_max, (int) strlen(data_buf), "length %d != strlen(data_buf) %d\n", + codablockf_max, (int) strlen(data_buf)); ret = ZBarcode_Encode_and_Print(symbol, (const unsigned char *) data_buf, codablockf_max, 0); assert_zero(ret, "ZBarcode_Encode_and_Print ret %d != 0 (%s)\n", ret, symbol->errtxt); diff --git a/backend/tests/test_postal.c b/backend/tests/test_postal.c index 5b8d4f24..e625d423 100644 --- a/backend/tests/test_postal.c +++ b/backend/tests/test_postal.c @@ -284,8 +284,9 @@ static void test_hrt(const testCtx *const p_ctx) { "i:%d raw_segs[0].length %d != expected_raw_length %d\n", i, symbol->raw_segs[0].length, expected_raw_length); assert_zero(memcmp(symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length), - "i:%d memcmp(%s, %s, %d) != 0\n", - i, symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length); + "i:%d memcmp(%.*s, %s, %d) != 0\n", + i, symbol->raw_segs[0].length, symbol->raw_segs[0].source, data[i].expected_raw, + expected_raw_length); } else { assert_null(symbol->raw_segs, "i:%d raw_segs not NULL\n", i); } diff --git a/backend/tests/test_raster.c b/backend/tests/test_raster.c index 5eb4f8bf..7009bf49 100644 --- a/backend/tests/test_raster.c +++ b/backend/tests/test_raster.c @@ -114,7 +114,7 @@ static void test_buffer(const testCtx *const p_ctx) { int output_options; const char *data; const char *composite; - + int ret; float expected_height; int expected_rows; int expected_width; @@ -122,276 +122,277 @@ static void test_buffer(const testCtx *const p_ctx) { int expected_bitmap_height; }; static const struct item data[] = { - /* 0*/ { BARCODE_CODE11, -1, "1234567890", "", 50, 1, 108, 216, 116 }, - /* 1*/ { BARCODE_CODE11, COMPLIANT_HEIGHT, "1234567890", "", 50, 1, 108, 216, 116 }, - /* 2*/ { BARCODE_C25STANDARD, -1, "1234567890", "", 50, 1, 117, 234, 116 }, - /* 3*/ { BARCODE_C25STANDARD, COMPLIANT_HEIGHT, "1234567890", "", 50, 1, 117, 234, 116 }, - /* 4*/ { BARCODE_C25INTER, -1, "1234567890", "", 50, 1, 99, 198, 116 }, - /* 5*/ { BARCODE_C25INTER, COMPLIANT_HEIGHT, "1234567890", "", 50, 1, 99, 198, 116 }, - /* 6*/ { BARCODE_C25IATA, -1, "1234567890", "", 50, 1, 149, 298, 116 }, - /* 7*/ { BARCODE_C25IATA, COMPLIANT_HEIGHT, "1234567890", "", 50, 1, 149, 298, 116 }, - /* 8*/ { BARCODE_C25LOGIC, -1, "1234567890", "", 50, 1, 109, 218, 116 }, - /* 9*/ { BARCODE_C25LOGIC, COMPLIANT_HEIGHT, "1234567890", "", 50, 1, 109, 218, 116 }, - /* 10*/ { BARCODE_C25IND, -1, "1234567890", "", 50, 1, 159, 318, 116 }, - /* 11*/ { BARCODE_C25IND, COMPLIANT_HEIGHT, "1234567890", "", 50, 1, 159, 318, 116 }, - /* 12*/ { BARCODE_CODE39, -1, "1234567890", "", 50, 1, 155, 310, 116 }, - /* 13*/ { BARCODE_CODE39, COMPLIANT_HEIGHT, "1234567890", "", 50, 1, 155, 310, 116 }, - /* 14*/ { BARCODE_EXCODE39, -1, "1234567890", "", 50, 1, 155, 310, 116 }, - /* 15*/ { BARCODE_EXCODE39, COMPLIANT_HEIGHT, "1234567890", "", 50, 1, 155, 310, 116 }, - /* 16*/ { BARCODE_EANX, -1, "123456789012", "", 50, 1, 95, 226, 116 }, - /* 17*/ { BARCODE_EANX, COMPLIANT_HEIGHT, "123456789012", "", 69, 1, 95, 226, 154 }, - /* 18*/ { BARCODE_EANX_CHK, -1, "1234567890128", "", 50, 1, 95, 226, 116 }, - /* 19*/ { BARCODE_EANX_CHK, COMPLIANT_HEIGHT, "1234567890128", "", 69, 1, 95, 226, 154 }, - /* 20*/ { BARCODE_EANX, -1, "123456789012+12", "", 50, 1, 122, 276, 116 }, - /* 21*/ { BARCODE_EANX, COMPLIANT_HEIGHT, "123456789012+12", "", 69, 1, 122, 276, 154 }, - /* 22*/ { BARCODE_EANX_CHK, -1, "1234567890128+12", "", 50, 1, 122, 276, 116 }, - /* 23*/ { BARCODE_EANX_CHK, COMPLIANT_HEIGHT, "1234567890128+12", "", 69, 1, 122, 276, 154 }, - /* 24*/ { BARCODE_EANX, -1, "123456789012+12345", "", 50, 1, 149, 330, 116 }, - /* 25*/ { BARCODE_EANX, COMPLIANT_HEIGHT, "123456789012+12345", "", 69, 1, 149, 330, 154 }, - /* 26*/ { BARCODE_EANX_CHK, -1, "1234567890128+12345", "", 50, 1, 149, 330, 116 }, - /* 27*/ { BARCODE_EANX_CHK, COMPLIANT_HEIGHT, "1234567890128+12345", "", 69, 1, 149, 330, 154 }, - /* 28*/ { BARCODE_EANX, -1, "1234567", "", 50, 1, 67, 162, 116 }, - /* 29*/ { BARCODE_EANX, COMPLIANT_HEIGHT, "1234567", "", 55, 1, 67, 162, 126 }, - /* 30*/ { BARCODE_EANX_CHK, -1, "12345670", "", 50, 1, 67, 162, 116 }, - /* 31*/ { BARCODE_EANX_CHK, COMPLIANT_HEIGHT, "12345670", "", 55, 1, 67, 162, 126 }, - /* 32*/ { BARCODE_EANX, -1, "1234567+12", "", 50, 1, 94, 212, 116 }, - /* 33*/ { BARCODE_EANX, COMPLIANT_HEIGHT, "1234567+12", "", 55, 1, 94, 212, 126 }, - /* 34*/ { BARCODE_EANX_CHK, -1, "12345670+12", "", 50, 1, 94, 212, 116 }, - /* 35*/ { BARCODE_EANX_CHK, COMPLIANT_HEIGHT, "12345670+12", "", 55, 1, 94, 212, 126 }, - /* 36*/ { BARCODE_EANX, -1, "1234567+12345", "", 50, 1, 121, 266, 116 }, - /* 37*/ { BARCODE_EANX, COMPLIANT_HEIGHT, "1234567+12345", "", 55, 1, 121, 266, 126 }, - /* 38*/ { BARCODE_EANX_CHK, -1, "12345670+12345", "", 50, 1, 121, 266, 116 }, - /* 39*/ { BARCODE_EANX_CHK, COMPLIANT_HEIGHT, "12345670+12345", "", 55, 1, 121, 266, 126 }, - /* 40*/ { BARCODE_EANX, -1, "1234", "", 50, 1, 47, 104, 116 }, - /* 41*/ { BARCODE_EANX, COMPLIANT_HEIGHT, "1234", "", 66.5, 1, 47, 104, 149 }, - /* 42*/ { BARCODE_EANX_CHK, -1, "1234", "", 50, 1, 47, 104, 116 }, - /* 43*/ { BARCODE_EANX_CHK, COMPLIANT_HEIGHT, "1234", "", 66.5, 1, 47, 104, 149 }, - /* 44*/ { BARCODE_EANX, -1, "12", "", 50, 1, 20, 50, 116 }, - /* 45*/ { BARCODE_EANX, COMPLIANT_HEIGHT, "12", "", 66.5, 1, 20, 50, 149 }, - /* 46*/ { BARCODE_EANX_CHK, -1, "12", "", 50, 1, 20, 50, 116 }, - /* 47*/ { BARCODE_EANX_CHK, COMPLIANT_HEIGHT, "12", "", 66.5, 1, 20, 50, 149 }, - /* 48*/ { BARCODE_GS1_128, -1, "[01]12345678901231", "", 50, 1, 134, 268, 116 }, - /* 49*/ { BARCODE_GS1_128, COMPLIANT_HEIGHT, "[01]12345678901231", "", 64, 1, 134, 268, 144 }, - /* 50*/ { BARCODE_CODABAR, -1, "A00000000B", "", 50, 1, 102, 204, 116 }, - /* 51*/ { BARCODE_CODABAR, COMPLIANT_HEIGHT, "A00000000B", "", 50, 1, 102, 204, 116 }, - /* 52*/ { BARCODE_CODE128, -1, "1234567890", "", 50, 1, 90, 180, 116 }, - /* 53*/ { BARCODE_CODE128, COMPLIANT_HEIGHT, "1234567890", "", 50, 1, 90, 180, 116 }, - /* 54*/ { BARCODE_DPLEIT, -1, "1234567890123", "", 72, 1, 135, 270, 160 }, - /* 55*/ { BARCODE_DPLEIT, COMPLIANT_HEIGHT, "1234567890123", "", 72, 1, 135, 270, 160 }, - /* 56*/ { BARCODE_DPIDENT, -1, "12345678901", "", 72, 1, 117, 234, 160 }, - /* 57*/ { BARCODE_DPIDENT, COMPLIANT_HEIGHT, "12345678901", "", 72, 1, 117, 234, 160 }, - /* 58*/ { BARCODE_CODE16K, -1, "1234567890", "", 20, 2, 70, 162, 44 }, - /* 59*/ { BARCODE_CODE16K, COMPLIANT_HEIGHT, "1234567890", "", 21, 2, 70, 162, 46 }, - /* 60*/ { BARCODE_CODE49, -1, "1234567890", "", 20, 2, 70, 162, 44 }, - /* 61*/ { BARCODE_CODE49, COMPLIANT_HEIGHT, "1234567890", "", 21, 2, 70, 162, 46 }, - /* 62*/ { BARCODE_CODE93, -1, "1234567890", "", 50, 1, 127, 254, 116 }, - /* 63*/ { BARCODE_CODE93, COMPLIANT_HEIGHT, "1234567890", "", 40, 1, 127, 254, 96 }, - /* 64*/ { BARCODE_FLAT, -1, "1234567890", "", 50, 1, 90, 180, 100 }, - /* 65*/ { BARCODE_FLAT, COMPLIANT_HEIGHT, "1234567890", "", 50, 1, 90, 180, 100 }, - /* 66*/ { BARCODE_DBAR_OMN, -1, "1234567890123", "", 50, 1, 96, 192, 116 }, - /* 67*/ { BARCODE_DBAR_OMN, COMPLIANT_HEIGHT, "1234567890123", "", 33, 1, 96, 192, 82 }, - /* 68*/ { BARCODE_DBAR_LTD, -1, "1234567890123", "", 50, 1, 79, 158, 116 }, - /* 69*/ { BARCODE_DBAR_LTD, COMPLIANT_HEIGHT, "1234567890123", "", 10, 1, 79, 158, 36 }, - /* 70*/ { BARCODE_DBAR_EXP, -1, "[01]12345678901231", "", 34, 1, 134, 268, 84 }, - /* 71*/ { BARCODE_DBAR_EXP, COMPLIANT_HEIGHT, "[01]12345678901231", "", 34, 1, 134, 268, 84 }, - /* 72*/ { BARCODE_TELEPEN, -1, "1234567890", "", 50, 1, 208, 416, 116 }, - /* 73*/ { BARCODE_TELEPEN, COMPLIANT_HEIGHT, "1234567890", "", 32, 1, 208, 416, 80 }, - /* 74*/ { BARCODE_UPCA, -1, "12345678901", "", 50, 1, 95, 226, 116 }, - /* 75*/ { BARCODE_UPCA, COMPLIANT_HEIGHT, "12345678901", "", 69, 1, 95, 226, 154 }, - /* 76*/ { BARCODE_UPCA_CHK, -1, "123456789012", "", 50, 1, 95, 226, 116 }, - /* 77*/ { BARCODE_UPCA_CHK, COMPLIANT_HEIGHT, "123456789012", "", 69, 1, 95, 226, 154 }, - /* 78*/ { BARCODE_UPCA, -1, "12345678901+12", "", 50, 1, 124, 276, 116 }, - /* 79*/ { BARCODE_UPCA, COMPLIANT_HEIGHT, "12345678901+12", "", 69, 1, 124, 276, 154 }, - /* 80*/ { BARCODE_UPCA_CHK, -1, "123456789012+12", "", 50, 1, 124, 276, 116 }, - /* 81*/ { BARCODE_UPCA_CHK, COMPLIANT_HEIGHT, "123456789012+12", "", 69, 1, 124, 276, 154 }, - /* 82*/ { BARCODE_UPCA, -1, "12345678901+12345", "", 50, 1, 151, 330, 116 }, - /* 83*/ { BARCODE_UPCA, COMPLIANT_HEIGHT, "12345678901+12345", "", 69, 1, 151, 330, 154 }, - /* 84*/ { BARCODE_UPCA_CHK, -1, "123456789012+12345", "", 50, 1, 151, 330, 116 }, - /* 85*/ { BARCODE_UPCA_CHK, COMPLIANT_HEIGHT, "123456789012+12345", "", 69, 1, 151, 330, 154 }, - /* 86*/ { BARCODE_UPCE, -1, "1234567", "", 50, 1, 51, 134, 116 }, - /* 87*/ { BARCODE_UPCE, COMPLIANT_HEIGHT, "1234567", "", 69, 1, 51, 134, 154 }, - /* 88*/ { BARCODE_UPCE_CHK, -1, "12345670", "", 50, 1, 51, 134, 116 }, - /* 89*/ { BARCODE_UPCE_CHK, COMPLIANT_HEIGHT, "12345670", "", 69, 1, 51, 134, 154 }, - /* 90*/ { BARCODE_UPCE, -1, "1234567+12", "", 50, 1, 78, 184, 116 }, - /* 91*/ { BARCODE_UPCE, COMPLIANT_HEIGHT, "1234567+12", "", 69, 1, 78, 184, 154 }, - /* 92*/ { BARCODE_UPCE_CHK, -1, "12345670+12", "", 50, 1, 78, 184, 116 }, - /* 93*/ { BARCODE_UPCE_CHK, COMPLIANT_HEIGHT, "12345670+12", "", 69, 1, 78, 184, 154 }, - /* 94*/ { BARCODE_UPCE, -1, "1234567+12345", "", 50, 1, 105, 238, 116 }, - /* 95*/ { BARCODE_UPCE, COMPLIANT_HEIGHT, "1234567+12345", "", 69, 1, 105, 238, 154 }, - /* 96*/ { BARCODE_UPCE_CHK, -1, "12345670+12345", "", 50, 1, 105, 238, 116 }, - /* 97*/ { BARCODE_UPCE_CHK, COMPLIANT_HEIGHT, "12345670+12345", "", 69, 1, 105, 238, 154 }, - /* 98*/ { BARCODE_POSTNET, -1, "12345678901", "", 12, 2, 123, 246, 24 }, - /* 99*/ { BARCODE_POSTNET, COMPLIANT_HEIGHT, "12345678901", "", 5, 2, 123, 246, 10 }, - /*100*/ { BARCODE_MSI_PLESSEY, -1, "1234567890", "", 50, 1, 127, 254, 116 }, - /*101*/ { BARCODE_MSI_PLESSEY, COMPLIANT_HEIGHT, "1234567890", "", 50, 1, 127, 254, 116 }, - /*102*/ { BARCODE_FIM, -1, "A", "", 50, 1, 17, 34, 100 }, - /*103*/ { BARCODE_FIM, COMPLIANT_HEIGHT, "A", "", 20, 1, 17, 34, 40 }, - /*104*/ { BARCODE_LOGMARS, -1, "1234567890", "", 50, 1, 191, 382, 116 }, - /*105*/ { BARCODE_LOGMARS, COMPLIANT_HEIGHT, "1234567890", "", 45.5, 1, 191, 382, 107 }, - /*106*/ { BARCODE_PHARMA, -1, "123456", "", 50, 1, 58, 116, 100 }, - /*107*/ { BARCODE_PHARMA, COMPLIANT_HEIGHT, "123456", "", 16, 1, 58, 116, 32 }, - /*108*/ { BARCODE_PZN, -1, "123456", "", 50, 1, 142, 284, 116 }, - /*109*/ { BARCODE_PZN, COMPLIANT_HEIGHT, "123456", "", 40, 1, 142, 284, 96 }, - /*110*/ { BARCODE_PHARMA_TWO, -1, "12345678", "", 10, 2, 29, 58, 20 }, - /*111*/ { BARCODE_PHARMA_TWO, COMPLIANT_HEIGHT, "12345678", "", 8, 2, 29, 58, 16 }, - /*112*/ { BARCODE_CEPNET, -1, "12345678", "", 5, 2, 93, 186, 10 }, - /*113*/ { BARCODE_CEPNET, COMPLIANT_HEIGHT, "12345678", "", 5, 2, 93, 186, 10 }, - /*114*/ { BARCODE_PDF417, -1, "1234567890", "", 21, 7, 103, 206, 42 }, - /*115*/ { BARCODE_PDF417, COMPLIANT_HEIGHT, "1234567890", "", 21, 7, 103, 206, 42 }, - /*116*/ { BARCODE_PDF417COMP, -1, "1234567890", "", 21, 7, 69, 138, 42 }, - /*117*/ { BARCODE_PDF417COMP, COMPLIANT_HEIGHT, "1234567890", "", 21, 7, 69, 138, 42 }, - /*118*/ { BARCODE_MAXICODE, -1, "1234567890", "", 165, 33, 30, 299, 298 }, - /*119*/ { BARCODE_MAXICODE, COMPLIANT_HEIGHT, "1234567890", "", 165, 33, 30, 299, 298 }, - /*120*/ { BARCODE_QRCODE, -1, "1234567890AB", "", 21, 21, 21, 42, 42 }, - /*121*/ { BARCODE_QRCODE, COMPLIANT_HEIGHT, "1234567890AB", "", 21, 21, 21, 42, 42 }, - /*122*/ { BARCODE_CODE128AB, -1, "1234567890", "", 50, 1, 145, 290, 116 }, - /*123*/ { BARCODE_CODE128AB, COMPLIANT_HEIGHT, "1234567890", "", 50, 1, 145, 290, 116 }, - /*124*/ { BARCODE_AUSPOST, -1, "12345678901234567890123", "", 8, 3, 133, 266, 16 }, - /*125*/ { BARCODE_AUSPOST, COMPLIANT_HEIGHT, "12345678901234567890123", "", 9.5, 3, 133, 266, 19 }, - /*126*/ { BARCODE_AUSREPLY, -1, "12345678", "", 8, 3, 73, 146, 16 }, - /*127*/ { BARCODE_AUSREPLY, COMPLIANT_HEIGHT, "12345678", "", 9.5, 3, 73, 146, 19 }, - /*128*/ { BARCODE_AUSROUTE, -1, "12345678", "", 8, 3, 73, 146, 16 }, - /*129*/ { BARCODE_AUSROUTE, COMPLIANT_HEIGHT, "12345678", "", 9.5, 3, 73, 146, 19 }, - /*130*/ { BARCODE_AUSREDIRECT, -1, "12345678", "", 8, 3, 73, 146, 16 }, - /*131*/ { BARCODE_AUSREDIRECT, COMPLIANT_HEIGHT, "12345678", "", 9.5, 3, 73, 146, 19 }, - /*132*/ { BARCODE_ISBNX, -1, "123456789", "", 50, 1, 95, 226, 116 }, - /*133*/ { BARCODE_ISBNX, COMPLIANT_HEIGHT, "123456789", "", 69, 1, 95, 226, 154 }, - /*134*/ { BARCODE_ISBNX, -1, "123456789+12", "", 50, 1, 122, 276, 116 }, - /*135*/ { BARCODE_ISBNX, COMPLIANT_HEIGHT, "123456789+12", "", 69, 1, 122, 276, 154 }, - /*136*/ { BARCODE_ISBNX, -1, "123456789+12345", "", 50, 1, 149, 330, 116 }, - /*137*/ { BARCODE_ISBNX, COMPLIANT_HEIGHT, "123456789+12345", "", 69, 1, 149, 330, 154 }, - /*138*/ { BARCODE_RM4SCC, -1, "1234567890", "", 8, 3, 91, 182, 16 }, - /*139*/ { BARCODE_RM4SCC, COMPLIANT_HEIGHT, "1234567890", "", 8, 3, 91, 182, 16 }, - /*140*/ { BARCODE_DATAMATRIX, -1, "ABC", "", 10, 10, 10, 20, 20 }, - /*141*/ { BARCODE_DATAMATRIX, COMPLIANT_HEIGHT, "ABC", "", 10, 10, 10, 20, 20 }, - /*142*/ { BARCODE_EAN14, -1, "1234567890123", "", 50, 1, 134, 268, 116 }, - /*143*/ { BARCODE_EAN14, COMPLIANT_HEIGHT, "1234567890123", "", 64, 1, 134, 268, 144 }, - /*144*/ { BARCODE_VIN, -1, "12345678701234567", "", 50, 1, 246, 492, 116 }, - /*145*/ { BARCODE_VIN, COMPLIANT_HEIGHT, "12345678701234567", "", 50, 1, 246, 492, 116 }, - /*146*/ { BARCODE_CODABLOCKF, -1, "1234567890", "", 20, 2, 101, 242, 44 }, - /*147*/ { BARCODE_CODABLOCKF, COMPLIANT_HEIGHT, "1234567890", "", 20, 2, 101, 242, 44 }, - /*148*/ { BARCODE_NVE18, -1, "12345678901234567", "", 50, 1, 156, 312, 116 }, - /*149*/ { BARCODE_NVE18, COMPLIANT_HEIGHT, "12345678901234567", "", 64, 1, 156, 312, 144 }, - /*150*/ { BARCODE_JAPANPOST, -1, "1234567890", "", 8, 3, 133, 266, 16 }, - /*151*/ { BARCODE_JAPANPOST, COMPLIANT_HEIGHT, "1234567890", "", 6, 3, 133, 266, 12 }, - /*152*/ { BARCODE_KOREAPOST, -1, "123456", "", 50, 1, 167, 334, 116 }, - /*153*/ { BARCODE_KOREAPOST, COMPLIANT_HEIGHT, "123456", "", 50, 1, 167, 334, 116 }, - /*154*/ { BARCODE_DBAR_STK, -1, "1234567890123", "", 13, 3, 50, 100, 26 }, - /*155*/ { BARCODE_DBAR_STK, COMPLIANT_HEIGHT, "1234567890123", "", 13, 3, 50, 100, 26 }, - /*156*/ { BARCODE_DBAR_OMNSTK, -1, "1234567890123", "", 69, 5, 50, 100, 138 }, - /*157*/ { BARCODE_DBAR_OMNSTK, COMPLIANT_HEIGHT, "1234567890123", "", 69, 5, 50, 100, 138 }, - /*158*/ { BARCODE_DBAR_EXPSTK, -1, "[01]12345678901231", "", 71, 5, 102, 204, 142 }, - /*159*/ { BARCODE_DBAR_EXPSTK, COMPLIANT_HEIGHT, "[01]12345678901231", "", 71, 5, 102, 204, 142 }, - /*160*/ { BARCODE_PLANET, -1, "12345678901", "", 12, 2, 123, 246, 24 }, - /*161*/ { BARCODE_PLANET, COMPLIANT_HEIGHT, "12345678901", "", 5, 2, 123, 246, 10 }, - /*162*/ { BARCODE_MICROPDF417, -1, "1234567890", "", 12, 6, 82, 164, 24 }, - /*163*/ { BARCODE_MICROPDF417, COMPLIANT_HEIGHT, "1234567890", "", 12, 6, 82, 164, 24 }, - /*164*/ { BARCODE_USPS_IMAIL, -1, "12345678901234567890", "", 8, 3, 129, 258, 16 }, - /*165*/ { BARCODE_USPS_IMAIL, COMPLIANT_HEIGHT, "12345678901234567890", "", 6, 3, 129, 258, 12 }, - /*166*/ { BARCODE_PLESSEY, -1, "1234567890", "", 50, 1, 227, 454, 116 }, - /*167*/ { BARCODE_PLESSEY, COMPLIANT_HEIGHT, "1234567890", "", 50, 1, 227, 454, 116 }, - /*168*/ { BARCODE_TELEPEN_NUM, -1, "1234567890", "", 50, 1, 128, 256, 116 }, - /*169*/ { BARCODE_TELEPEN_NUM, COMPLIANT_HEIGHT, "1234567890", "", 32, 1, 128, 256, 80 }, - /*170*/ { BARCODE_ITF14, -1, "1234567890", "", 50, 1, 135, 330, 136 }, - /*171*/ { BARCODE_ITF14, COMPLIANT_HEIGHT, "1234567890", "", 64, 1, 135, 330, 164 }, - /*172*/ { BARCODE_KIX, -1, "123456ABCDE", "", 8, 3, 87, 174, 16 }, - /*173*/ { BARCODE_KIX, COMPLIANT_HEIGHT, "123456ABCDE", "", 8, 3, 87, 174, 16 }, - /*174*/ { BARCODE_AZTEC, -1, "1234567890AB", "", 15, 15, 15, 30, 30 }, - /*175*/ { BARCODE_AZTEC, COMPLIANT_HEIGHT, "1234567890AB", "", 15, 15, 15, 30, 30 }, - /*176*/ { BARCODE_DAFT, -1, "DAFTDAFTDAFTDAFT", "", 8, 3, 31, 62, 16 }, - /*177*/ { BARCODE_DAFT, COMPLIANT_HEIGHT, "DAFTDAFTDAFTDAFT", "", 8, 3, 31, 62, 16 }, - /*178*/ { BARCODE_DPD, -1, "0123456789012345678901234567", "", 50, 1, 189, 378, 122 }, - /*179*/ { BARCODE_DPD, COMPLIANT_HEIGHT, "0123456789012345678901234567", "", 66.5, 1, 189, 378, 155 }, - /*180*/ { BARCODE_MICROQR, -1, "12345", "", 11, 11, 11, 22, 22 }, - /*181*/ { BARCODE_MICROQR, COMPLIANT_HEIGHT, "12345", "", 11, 11, 11, 22, 22 }, - /*182*/ { BARCODE_HIBC_128, -1, "1234567890", "", 50, 1, 123, 246, 116 }, - /*183*/ { BARCODE_HIBC_128, COMPLIANT_HEIGHT, "1234567890", "", 50, 1, 123, 246, 116 }, - /*184*/ { BARCODE_HIBC_39, -1, "1234567890", "", 50, 1, 223, 446, 116 }, - /*185*/ { BARCODE_HIBC_39, COMPLIANT_HEIGHT, "1234567890", "", 50, 1, 223, 446, 116 }, - /*186*/ { BARCODE_HIBC_DM, -1, "ABC", "", 12, 12, 12, 24, 24 }, - /*187*/ { BARCODE_HIBC_DM, COMPLIANT_HEIGHT, "ABC", "", 12, 12, 12, 24, 24 }, - /*188*/ { BARCODE_HIBC_QR, -1, "1234567890AB", "", 21, 21, 21, 42, 42 }, - /*189*/ { BARCODE_HIBC_QR, COMPLIANT_HEIGHT, "1234567890AB", "", 21, 21, 21, 42, 42 }, - /*190*/ { BARCODE_HIBC_PDF, -1, "1234567890", "", 24, 8, 103, 206, 48 }, - /*191*/ { BARCODE_HIBC_PDF, COMPLIANT_HEIGHT, "1234567890", "", 24, 8, 103, 206, 48 }, - /*192*/ { BARCODE_HIBC_MICPDF, -1, "1234567890", "", 28, 14, 38, 76, 56 }, - /*193*/ { BARCODE_HIBC_MICPDF, COMPLIANT_HEIGHT, "1234567890", "", 28, 14, 38, 76, 56 }, - /*194*/ { BARCODE_HIBC_BLOCKF, -1, "1234567890", "", 30, 3, 101, 242, 64 }, - /*195*/ { BARCODE_HIBC_BLOCKF, COMPLIANT_HEIGHT, "1234567890", "", 30, 3, 101, 242, 64 }, - /*196*/ { BARCODE_HIBC_AZTEC, -1, "1234567890AB", "", 19, 19, 19, 38, 38 }, - /*197*/ { BARCODE_HIBC_AZTEC, COMPLIANT_HEIGHT, "1234567890AB", "", 19, 19, 19, 38, 38 }, - /*198*/ { BARCODE_DOTCODE, -1, "ABC", "", 11, 11, 16, 33, 23 }, - /*199*/ { BARCODE_DOTCODE, COMPLIANT_HEIGHT, "ABC", "", 11, 11, 16, 33, 23 }, - /*200*/ { BARCODE_HANXIN, -1, "1234567890AB", "", 23, 23, 23, 46, 46 }, - /*201*/ { BARCODE_HANXIN, COMPLIANT_HEIGHT, "1234567890AB", "", 23, 23, 23, 46, 46 }, - /*202*/ { BARCODE_MAILMARK_2D, -1, "012100123412345678AB19XY1A 0", "", 24, 24, 24, 48, 48 }, - /*203*/ { BARCODE_MAILMARK_2D, COMPLIANT_HEIGHT, "012100123412345678AB19XY1A 0", "", 24, 24, 24, 48, 48 }, - /*204*/ { BARCODE_UPU_S10, -1, "EE876543216CA", "", 50, 1, 156, 312, 116 }, - /*205*/ { BARCODE_UPU_S10, COMPLIANT_HEIGHT, "EE876543216CA", "", 50, 1, 156, 312, 116 }, - /*206*/ { BARCODE_MAILMARK_4S, -1, "01000000000000000AA00AA0A", "", 10, 3, 155, 310, 20 }, - /*207*/ { BARCODE_MAILMARK_4S, COMPLIANT_HEIGHT, "01000000000000000AA00AA0A", "", 8, 3, 155, 310, 16 }, - /*208*/ { BARCODE_AZRUNE, -1, "255", "", 11, 11, 11, 22, 22 }, - /*209*/ { BARCODE_AZRUNE, COMPLIANT_HEIGHT, "255", "", 11, 11, 11, 22, 22 }, - /*210*/ { BARCODE_CODE32, -1, "12345678", "", 50, 1, 103, 206, 116 }, - /*211*/ { BARCODE_CODE32, COMPLIANT_HEIGHT, "12345678", "", 20, 1, 103, 206, 56 }, - /*212*/ { BARCODE_EANX_CC, -1, "123456789012", "[20]01", 50, 7, 99, 226, 116 }, - /*213*/ { BARCODE_EANX_CC, COMPLIANT_HEIGHT, "123456789012", "[20]01", 81, 7, 99, 226, 178 }, - /*214*/ { BARCODE_EANX_CC, -1, "123456789012+12", "[20]01", 50, 7, 125, 276, 116 }, - /*215*/ { BARCODE_EANX_CC, COMPLIANT_HEIGHT, "123456789012+12", "[20]01", 81, 7, 125, 276, 178 }, - /*216*/ { BARCODE_EANX_CC, -1, "123456789012+12345", "[20]01", 50, 7, 152, 330, 116 }, - /*217*/ { BARCODE_EANX_CC, COMPLIANT_HEIGHT, "123456789012+12345", "[20]01", 81, 7, 152, 330, 178 }, - /*218*/ { BARCODE_EANX_CC, -1, "1234567", "[20]01", 50, 8, 72, 162, 116 }, - /*219*/ { BARCODE_EANX_CC, COMPLIANT_HEIGHT, "1234567", "[20]01", 69, 8, 72, 162, 154 }, - /*220*/ { BARCODE_EANX_CC, -1, "1234567+12", "[20]01", 50, 8, 98, 212, 116 }, - /*221*/ { BARCODE_EANX_CC, COMPLIANT_HEIGHT, "1234567+12", "[20]01", 69, 8, 98, 212, 154 }, - /*222*/ { BARCODE_EANX_CC, -1, "1234567+12345", "[20]01", 50, 8, 125, 266, 116 }, - /*223*/ { BARCODE_EANX_CC, COMPLIANT_HEIGHT, "1234567+12345", "[20]01", 69, 8, 125, 266, 154 }, - /*224*/ { BARCODE_GS1_128_CC, -1, "[01]12345678901231", "[20]01", 50, 5, 145, 290, 116 }, - /*225*/ { BARCODE_GS1_128_CC, COMPLIANT_HEIGHT, "[01]12345678901231", "[20]01", 71, 5, 145, 290, 158 }, - /*226*/ { BARCODE_DBAR_OMN_CC, -1, "1234567890123", "[20]01", 21, 5, 100, 200, 58 }, - /*227*/ { BARCODE_DBAR_OMN_CC, COMPLIANT_HEIGHT, "1234567890123", "[20]01", 40, 5, 100, 200, 96 }, - /*228*/ { BARCODE_DBAR_LTD_CC, -1, "1234567890123", "[20]01", 19, 6, 79, 158, 54 }, - /*229*/ { BARCODE_DBAR_LTD_CC, COMPLIANT_HEIGHT, "1234567890123", "[20]01", 19, 6, 79, 158, 54 }, - /*230*/ { BARCODE_DBAR_EXP_CC, -1, "[01]12345678901231", "[20]01", 41, 5, 134, 268, 98 }, - /*231*/ { BARCODE_DBAR_EXP_CC, COMPLIANT_HEIGHT, "[01]12345678901231", "[20]01", 41, 5, 134, 268, 98 }, - /*232*/ { BARCODE_UPCA_CC, -1, "12345678901", "[20]01", 50, 7, 99, 226, 116 }, - /*233*/ { BARCODE_UPCA_CC, COMPLIANT_HEIGHT, "12345678901", "[20]01", 81, 7, 99, 226, 178 }, - /*234*/ { BARCODE_UPCA_CC, -1, "12345678901+12", "[20]01", 50, 7, 127, 276, 116 }, - /*235*/ { BARCODE_UPCA_CC, COMPLIANT_HEIGHT, "12345678901+12", "[20]01", 81, 7, 127, 276, 178 }, - /*236*/ { BARCODE_UPCA_CC, -1, "12345678901+12345", "[20]01", 50, 7, 154, 330, 116 }, - /*237*/ { BARCODE_UPCA_CC, COMPLIANT_HEIGHT, "12345678901+12345", "[20]01", 81, 7, 154, 330, 178 }, - /*238*/ { BARCODE_UPCE_CC, -1, "1234567", "[20]01", 50, 9, 55, 134, 116 }, - /*239*/ { BARCODE_UPCE_CC, COMPLIANT_HEIGHT, "1234567", "[20]01", 85, 9, 55, 134, 186 }, - /*240*/ { BARCODE_UPCE_CC, -1, "1234567+12", "[20]01", 50, 9, 81, 184, 116 }, - /*241*/ { BARCODE_UPCE_CC, COMPLIANT_HEIGHT, "1234567+12", "[20]01", 85, 9, 81, 184, 186 }, - /*242*/ { BARCODE_UPCE_CC, -1, "1234567+12345", "[20]01", 50, 9, 108, 238, 116 }, - /*243*/ { BARCODE_UPCE_CC, COMPLIANT_HEIGHT, "1234567+12345", "[20]01", 85, 9, 108, 238, 186 }, - /*244*/ { BARCODE_DBAR_STK_CC, -1, "1234567890123", "[20]01", 24, 9, 56, 112, 48 }, - /*245*/ { BARCODE_DBAR_STK_CC, COMPLIANT_HEIGHT, "1234567890123", "[20]01", 24, 9, 56, 112, 48 }, - /*246*/ { BARCODE_DBAR_OMNSTK_CC, -1, "1234567890123", "[20]01", 80, 11, 56, 112, 160 }, - /*247*/ { BARCODE_DBAR_OMNSTK_CC, COMPLIANT_HEIGHT, "1234567890123", "[20]01", 80, 11, 56, 112, 160 }, - /*248*/ { BARCODE_DBAR_EXPSTK_CC, -1, "[01]12345678901231", "[20]01", 78, 9, 102, 204, 156 }, - /*249*/ { BARCODE_DBAR_EXPSTK_CC, COMPLIANT_HEIGHT, "[01]12345678901231", "[20]01", 78, 9, 102, 204, 156 }, - /*250*/ { BARCODE_CHANNEL, -1, "01", "", 50, 1, 19, 38, 116 }, - /*251*/ { BARCODE_CHANNEL, COMPLIANT_HEIGHT, "01", "", 20, 1, 19, 38, 56 }, - /*252*/ { BARCODE_CODEONE, -1, "12345678901234567890", "", 16, 16, 18, 36, 32 }, - /*253*/ { BARCODE_CODEONE, COMPLIANT_HEIGHT, "12345678901234567890", "", 16, 16, 18, 36, 32 }, - /*254*/ { BARCODE_GRIDMATRIX, -1, "ABC", "", 18, 18, 18, 36, 36 }, - /*255*/ { BARCODE_GRIDMATRIX, COMPLIANT_HEIGHT, "ABC", "", 18, 18, 18, 36, 36 }, - /*256*/ { BARCODE_UPNQR, -1, "1234567890AB", "", 77, 77, 77, 154, 154 }, - /*257*/ { BARCODE_UPNQR, COMPLIANT_HEIGHT, "1234567890AB", "", 77, 77, 77, 154, 154 }, - /*258*/ { BARCODE_ULTRA, -1, "1234567890", "", 13, 13, 18, 36, 26 }, - /*259*/ { BARCODE_ULTRA, COMPLIANT_HEIGHT, "1234567890", "", 13, 13, 18, 36, 26 }, - /*260*/ { BARCODE_RMQR, -1, "12345", "", 11, 11, 27, 54, 22 }, - /*261*/ { BARCODE_RMQR, COMPLIANT_HEIGHT, "12345", "", 11, 11, 27, 54, 22 }, - /*262*/ { BARCODE_BC412, -1, "1234567", "", 16.5, 1, 102, 204, 49 }, - /*263*/ { BARCODE_BC412, COMPLIANT_HEIGHT, "1234567", "", 16.5, 1, 102, 204, 49 }, + /* 0*/ { BARCODE_CODE11, -1, "1234567890", "", 0, 50, 1, 108, 216, 116 }, + /* 1*/ { BARCODE_CODE11, COMPLIANT_HEIGHT, "1234567890", "", 0, 50, 1, 108, 216, 116 }, + /* 2*/ { BARCODE_C25STANDARD, -1, "1234567890", "", 0, 50, 1, 117, 234, 116 }, + /* 3*/ { BARCODE_C25STANDARD, COMPLIANT_HEIGHT, "1234567890", "", 0, 50, 1, 117, 234, 116 }, + /* 4*/ { BARCODE_C25INTER, -1, "1234567890", "", 0, 50, 1, 99, 198, 116 }, + /* 5*/ { BARCODE_C25INTER, COMPLIANT_HEIGHT, "1234567890", "", 0, 50, 1, 99, 198, 116 }, + /* 6*/ { BARCODE_C25IATA, -1, "1234567890", "", 0, 50, 1, 149, 298, 116 }, + /* 7*/ { BARCODE_C25IATA, COMPLIANT_HEIGHT, "1234567890", "", 0, 50, 1, 149, 298, 116 }, + /* 8*/ { BARCODE_C25LOGIC, -1, "1234567890", "", 0, 50, 1, 109, 218, 116 }, + /* 9*/ { BARCODE_C25LOGIC, COMPLIANT_HEIGHT, "1234567890", "", 0, 50, 1, 109, 218, 116 }, + /* 10*/ { BARCODE_C25IND, -1, "1234567890", "", 0, 50, 1, 159, 318, 116 }, + /* 11*/ { BARCODE_C25IND, COMPLIANT_HEIGHT, "1234567890", "", 0, 50, 1, 159, 318, 116 }, + /* 12*/ { BARCODE_CODE39, -1, "1234567890", "", 0, 50, 1, 155, 310, 116 }, + /* 13*/ { BARCODE_CODE39, COMPLIANT_HEIGHT, "1234567890", "", 0, 50, 1, 155, 310, 116 }, + /* 14*/ { BARCODE_EXCODE39, -1, "1234567890", "", 0, 50, 1, 155, 310, 116 }, + /* 15*/ { BARCODE_EXCODE39, COMPLIANT_HEIGHT, "1234567890", "", 0, 50, 1, 155, 310, 116 }, + /* 16*/ { BARCODE_EANX, -1, "123456789012", "", 0, 50, 1, 95, 226, 116 }, + /* 17*/ { BARCODE_EANX, COMPLIANT_HEIGHT, "123456789012", "", 0, 69, 1, 95, 226, 154 }, + /* 18*/ { BARCODE_EANX_CHK, -1, "1234567890128", "", 0, 50, 1, 95, 226, 116 }, + /* 19*/ { BARCODE_EANX_CHK, COMPLIANT_HEIGHT, "1234567890128", "", 0, 69, 1, 95, 226, 154 }, + /* 20*/ { BARCODE_EANX, -1, "123456789012+12", "", 0, 50, 1, 122, 276, 116 }, + /* 21*/ { BARCODE_EANX, COMPLIANT_HEIGHT, "123456789012+12", "", 0, 69, 1, 122, 276, 154 }, + /* 22*/ { BARCODE_EANX_CHK, -1, "1234567890128+12", "", 0, 50, 1, 122, 276, 116 }, + /* 23*/ { BARCODE_EANX_CHK, COMPLIANT_HEIGHT, "1234567890128+12", "", 0, 69, 1, 122, 276, 154 }, + /* 24*/ { BARCODE_EANX, -1, "123456789012+12345", "", 0, 50, 1, 149, 330, 116 }, + /* 25*/ { BARCODE_EANX, COMPLIANT_HEIGHT, "123456789012+12345", "", 0, 69, 1, 149, 330, 154 }, + /* 26*/ { BARCODE_EANX_CHK, -1, "1234567890128+12345", "", 0, 50, 1, 149, 330, 116 }, + /* 27*/ { BARCODE_EANX_CHK, COMPLIANT_HEIGHT, "1234567890128+12345", "", 0, 69, 1, 149, 330, 154 }, + /* 28*/ { BARCODE_EANX, -1, "1234567", "", 0, 50, 1, 67, 162, 116 }, + /* 29*/ { BARCODE_EANX, COMPLIANT_HEIGHT, "1234567", "", 0, 55, 1, 67, 162, 126 }, + /* 30*/ { BARCODE_EANX_CHK, -1, "12345670", "", 0, 50, 1, 67, 162, 116 }, + /* 31*/ { BARCODE_EANX_CHK, COMPLIANT_HEIGHT, "12345670", "", 0, 55, 1, 67, 162, 126 }, + /* 32*/ { BARCODE_EANX, -1, "1234567+12", "", ZINT_WARN_NONCOMPLIANT, 50, 1, 94, 212, 116 }, + /* 33*/ { BARCODE_EANX, COMPLIANT_HEIGHT, "1234567+12", "", ZINT_WARN_NONCOMPLIANT, 55, 1, 94, 212, 126 }, + /* 34*/ { BARCODE_EANX_CHK, -1, "12345670+12", "", ZINT_WARN_NONCOMPLIANT, 50, 1, 94, 212, 116 }, + /* 35*/ { BARCODE_EANX_CHK, COMPLIANT_HEIGHT, "12345670+12", "", ZINT_WARN_NONCOMPLIANT, 55, 1, 94, 212, 126 }, + /* 36*/ { BARCODE_EANX, -1, "1234567+12345", "", ZINT_WARN_NONCOMPLIANT, 50, 1, 121, 266, 116 }, + /* 37*/ { BARCODE_EANX, COMPLIANT_HEIGHT, "1234567+12345", "", ZINT_WARN_NONCOMPLIANT, 55, 1, 121, 266, 126 }, + /* 38*/ { BARCODE_EANX_CHK, -1, "12345670+12345", "", ZINT_WARN_NONCOMPLIANT, 50, 1, 121, 266, 116 }, + /* 39*/ { BARCODE_EANX_CHK, COMPLIANT_HEIGHT, "12345670+12345", "", ZINT_WARN_NONCOMPLIANT, 55, 1, 121, 266, 126 }, + /* 40*/ { BARCODE_EANX, -1, "1234", "", 0, 50, 1, 47, 104, 116 }, + /* 41*/ { BARCODE_EANX, COMPLIANT_HEIGHT, "1234", "", 0, 66.5, 1, 47, 104, 149 }, + /* 42*/ { BARCODE_EANX_CHK, -1, "1234", "", 0, 50, 1, 47, 104, 116 }, + /* 43*/ { BARCODE_EANX_CHK, COMPLIANT_HEIGHT, "1234", "", 0, 66.5, 1, 47, 104, 149 }, + /* 44*/ { BARCODE_EANX, -1, "12", "", 0, 50, 1, 20, 50, 116 }, + /* 45*/ { BARCODE_EANX, COMPLIANT_HEIGHT, "12", "", 0, 66.5, 1, 20, 50, 149 }, + /* 46*/ { BARCODE_EANX_CHK, -1, "12", "", 0, 50, 1, 20, 50, 116 }, + /* 47*/ { BARCODE_EANX_CHK, COMPLIANT_HEIGHT, "12", "", 0, 66.5, 1, 20, 50, 149 }, + /* 48*/ { BARCODE_GS1_128, -1, "[01]12345678901231", "", 0, 50, 1, 134, 268, 116 }, + /* 49*/ { BARCODE_GS1_128, COMPLIANT_HEIGHT, "[01]12345678901231", "", 0, 64, 1, 134, 268, 144 }, + /* 50*/ { BARCODE_CODABAR, -1, "A00000000B", "", 0, 50, 1, 102, 204, 116 }, + /* 51*/ { BARCODE_CODABAR, COMPLIANT_HEIGHT, "A00000000B", "", 0, 50, 1, 102, 204, 116 }, + /* 52*/ { BARCODE_CODE128, -1, "1234567890", "", 0, 50, 1, 90, 180, 116 }, + /* 53*/ { BARCODE_CODE128, COMPLIANT_HEIGHT, "1234567890", "", 0, 50, 1, 90, 180, 116 }, + /* 54*/ { BARCODE_DPLEIT, -1, "1234567890123", "", 0, 72, 1, 135, 270, 160 }, + /* 55*/ { BARCODE_DPLEIT, COMPLIANT_HEIGHT, "1234567890123", "", 0, 72, 1, 135, 270, 160 }, + /* 56*/ { BARCODE_DPIDENT, -1, "12345678901", "", 0, 72, 1, 117, 234, 160 }, + /* 57*/ { BARCODE_DPIDENT, COMPLIANT_HEIGHT, "12345678901", "", 0, 72, 1, 117, 234, 160 }, + /* 58*/ { BARCODE_CODE16K, -1, "1234567890", "", 0, 20, 2, 70, 162, 44 }, + /* 59*/ { BARCODE_CODE16K, COMPLIANT_HEIGHT, "1234567890", "", 0, 21, 2, 70, 162, 46 }, + /* 60*/ { BARCODE_CODE49, -1, "1234567890", "", 0, 20, 2, 70, 162, 44 }, + /* 61*/ { BARCODE_CODE49, COMPLIANT_HEIGHT, "1234567890", "", 0, 21, 2, 70, 162, 46 }, + /* 62*/ { BARCODE_CODE93, -1, "1234567890", "", 0, 50, 1, 127, 254, 116 }, + /* 63*/ { BARCODE_CODE93, COMPLIANT_HEIGHT, "1234567890", "", 0, 40, 1, 127, 254, 96 }, + /* 64*/ { BARCODE_FLAT, -1, "1234567890", "", 0, 50, 1, 90, 180, 100 }, + /* 65*/ { BARCODE_FLAT, COMPLIANT_HEIGHT, "1234567890", "", 0, 50, 1, 90, 180, 100 }, + /* 66*/ { BARCODE_DBAR_OMN, -1, "1234567890123", "", 0, 50, 1, 96, 192, 116 }, + /* 67*/ { BARCODE_DBAR_OMN, COMPLIANT_HEIGHT, "1234567890123", "", 0, 33, 1, 96, 192, 82 }, + /* 68*/ { BARCODE_DBAR_LTD, -1, "1234567890123", "", 0, 50, 1, 79, 158, 116 }, + /* 69*/ { BARCODE_DBAR_LTD, COMPLIANT_HEIGHT, "1234567890123", "", 0, 10, 1, 79, 158, 36 }, + /* 70*/ { BARCODE_DBAR_EXP, -1, "[01]12345678901231", "", 0, 34, 1, 134, 268, 84 }, + /* 71*/ { BARCODE_DBAR_EXP, COMPLIANT_HEIGHT, "[01]12345678901231", "", 0, 34, 1, 134, 268, 84 }, + /* 72*/ { BARCODE_TELEPEN, -1, "1234567890", "", 0, 50, 1, 208, 416, 116 }, + /* 73*/ { BARCODE_TELEPEN, COMPLIANT_HEIGHT, "1234567890", "", 0, 32, 1, 208, 416, 80 }, + /* 74*/ { BARCODE_UPCA, -1, "12345678901", "", 0, 50, 1, 95, 226, 116 }, + /* 75*/ { BARCODE_UPCA, COMPLIANT_HEIGHT, "12345678901", "", 0, 69, 1, 95, 226, 154 }, + /* 76*/ { BARCODE_UPCA_CHK, -1, "123456789012", "", 0, 50, 1, 95, 226, 116 }, + /* 77*/ { BARCODE_UPCA_CHK, COMPLIANT_HEIGHT, "123456789012", "", 0, 69, 1, 95, 226, 154 }, + /* 78*/ { BARCODE_UPCA, -1, "12345678901+12", "", 0, 50, 1, 124, 276, 116 }, + /* 79*/ { BARCODE_UPCA, COMPLIANT_HEIGHT, "12345678901+12", "", 0, 69, 1, 124, 276, 154 }, + /* 80*/ { BARCODE_UPCA_CHK, -1, "123456789012+12", "", 0, 50, 1, 124, 276, 116 }, + /* 81*/ { BARCODE_UPCA_CHK, COMPLIANT_HEIGHT, "123456789012+12", "", 0, 69, 1, 124, 276, 154 }, + /* 82*/ { BARCODE_UPCA, -1, "12345678901+12345", "", 0, 50, 1, 151, 330, 116 }, + /* 83*/ { BARCODE_UPCA, COMPLIANT_HEIGHT, "12345678901+12345", "", 0, 69, 1, 151, 330, 154 }, + /* 84*/ { BARCODE_UPCA_CHK, -1, "123456789012+12345", "", 0, 50, 1, 151, 330, 116 }, + /* 85*/ { BARCODE_UPCA_CHK, COMPLIANT_HEIGHT, "123456789012+12345", "", 0, 69, 1, 151, 330, 154 }, + /* 86*/ { BARCODE_UPCE, -1, "1234567", "", 0, 50, 1, 51, 134, 116 }, + /* 87*/ { BARCODE_UPCE, COMPLIANT_HEIGHT, "1234567", "", 0, 69, 1, 51, 134, 154 }, + /* 88*/ { BARCODE_UPCE_CHK, -1, "12345670", "", 0, 50, 1, 51, 134, 116 }, + /* 89*/ { BARCODE_UPCE_CHK, COMPLIANT_HEIGHT, "12345670", "", 0, 69, 1, 51, 134, 154 }, + /* 90*/ { BARCODE_UPCE, -1, "1234567+12", "", 0, 50, 1, 78, 184, 116 }, + /* 91*/ { BARCODE_UPCE, COMPLIANT_HEIGHT, "1234567+12", "", 0, 69, 1, 78, 184, 154 }, + /* 92*/ { BARCODE_UPCE_CHK, -1, "12345670+12", "", 0, 50, 1, 78, 184, 116 }, + /* 93*/ { BARCODE_UPCE_CHK, COMPLIANT_HEIGHT, "12345670+12", "", 0, 69, 1, 78, 184, 154 }, + /* 94*/ { BARCODE_UPCE, -1, "1234567+12345", "", 0, 50, 1, 105, 238, 116 }, + /* 95*/ { BARCODE_UPCE, COMPLIANT_HEIGHT, "1234567+12345", "", 0, 69, 1, 105, 238, 154 }, + /* 96*/ { BARCODE_UPCE_CHK, -1, "12345670+12345", "", 0, 50, 1, 105, 238, 116 }, + /* 97*/ { BARCODE_UPCE_CHK, COMPLIANT_HEIGHT, "12345670+12345", "", 0, 69, 1, 105, 238, 154 }, + /* 98*/ { BARCODE_POSTNET, -1, "12345678901", "", 0, 12, 2, 123, 246, 24 }, + /* 99*/ { BARCODE_POSTNET, COMPLIANT_HEIGHT, "12345678901", "", 0, 5, 2, 123, 246, 10 }, + /*100*/ { BARCODE_MSI_PLESSEY, -1, "1234567890", "", 0, 50, 1, 127, 254, 116 }, + /*101*/ { BARCODE_MSI_PLESSEY, COMPLIANT_HEIGHT, "1234567890", "", 0, 50, 1, 127, 254, 116 }, + /*102*/ { BARCODE_FIM, -1, "A", "", 0, 50, 1, 17, 34, 100 }, + /*103*/ { BARCODE_FIM, COMPLIANT_HEIGHT, "A", "", 0, 20, 1, 17, 34, 40 }, + /*104*/ { BARCODE_LOGMARS, -1, "1234567890", "", 0, 50, 1, 191, 382, 116 }, + /*105*/ { BARCODE_LOGMARS, COMPLIANT_HEIGHT, "1234567890", "", 0, 45.5, 1, 191, 382, 107 }, + /*106*/ { BARCODE_PHARMA, -1, "123456", "", 0, 50, 1, 58, 116, 100 }, + /*107*/ { BARCODE_PHARMA, COMPLIANT_HEIGHT, "123456", "", 0, 16, 1, 58, 116, 32 }, + /*108*/ { BARCODE_PZN, -1, "123456", "", 0, 50, 1, 142, 284, 116 }, + /*109*/ { BARCODE_PZN, COMPLIANT_HEIGHT, "123456", "", 0, 40, 1, 142, 284, 96 }, + /*110*/ { BARCODE_PHARMA_TWO, -1, "12345678", "", 0, 10, 2, 29, 58, 20 }, + /*111*/ { BARCODE_PHARMA_TWO, COMPLIANT_HEIGHT, "12345678", "", 0, 8, 2, 29, 58, 16 }, + /*112*/ { BARCODE_CEPNET, -1, "12345678", "", 0, 5, 2, 93, 186, 10 }, + /*113*/ { BARCODE_CEPNET, COMPLIANT_HEIGHT, "12345678", "", 0, 5, 2, 93, 186, 10 }, + /*114*/ { BARCODE_PDF417, -1, "1234567890", "", 0, 21, 7, 103, 206, 42 }, + /*115*/ { BARCODE_PDF417, COMPLIANT_HEIGHT, "1234567890", "", 0, 21, 7, 103, 206, 42 }, + /*116*/ { BARCODE_PDF417COMP, -1, "1234567890", "", 0, 21, 7, 69, 138, 42 }, + /*117*/ { BARCODE_PDF417COMP, COMPLIANT_HEIGHT, "1234567890", "", 0, 21, 7, 69, 138, 42 }, + /*118*/ { BARCODE_MAXICODE, -1, "1234567890", "", 0, 165, 33, 30, 299, 298 }, + /*119*/ { BARCODE_MAXICODE, COMPLIANT_HEIGHT, "1234567890", "", 0, 165, 33, 30, 299, 298 }, + /*120*/ { BARCODE_QRCODE, -1, "1234567890AB", "", 0, 21, 21, 21, 42, 42 }, + /*121*/ { BARCODE_QRCODE, COMPLIANT_HEIGHT, "1234567890AB", "", 0, 21, 21, 21, 42, 42 }, + /*122*/ { BARCODE_CODE128AB, -1, "1234567890", "", 0, 50, 1, 145, 290, 116 }, + /*123*/ { BARCODE_CODE128AB, COMPLIANT_HEIGHT, "1234567890", "", 0, 50, 1, 145, 290, 116 }, + /*124*/ { BARCODE_AUSPOST, -1, "12345678901234567890123", "", 0, 8, 3, 133, 266, 16 }, + /*125*/ { BARCODE_AUSPOST, COMPLIANT_HEIGHT, "12345678901234567890123", "", 0, 9.5, 3, 133, 266, 19 }, + /*126*/ { BARCODE_AUSREPLY, -1, "12345678", "", 0, 8, 3, 73, 146, 16 }, + /*127*/ { BARCODE_AUSREPLY, COMPLIANT_HEIGHT, "12345678", "", 0, 9.5, 3, 73, 146, 19 }, + /*128*/ { BARCODE_AUSROUTE, -1, "12345678", "", 0, 8, 3, 73, 146, 16 }, + /*129*/ { BARCODE_AUSROUTE, COMPLIANT_HEIGHT, "12345678", "", 0, 9.5, 3, 73, 146, 19 }, + /*130*/ { BARCODE_AUSREDIRECT, -1, "12345678", "", 0, 8, 3, 73, 146, 16 }, + /*131*/ { BARCODE_AUSREDIRECT, COMPLIANT_HEIGHT, "12345678", "", 0, 9.5, 3, 73, 146, 19 }, + /*132*/ { BARCODE_ISBNX, -1, "123456789", "", 0, 50, 1, 95, 226, 116 }, + /*133*/ { BARCODE_ISBNX, COMPLIANT_HEIGHT, "123456789", "", 0, 69, 1, 95, 226, 154 }, + /*134*/ { BARCODE_ISBNX, -1, "123456789+12", "", 0, 50, 1, 122, 276, 116 }, + /*135*/ { BARCODE_ISBNX, COMPLIANT_HEIGHT, "123456789+12", "", 0, 69, 1, 122, 276, 154 }, + /*136*/ { BARCODE_ISBNX, -1, "123456789+12345", "", 0, 50, 1, 149, 330, 116 }, + /*137*/ { BARCODE_ISBNX, COMPLIANT_HEIGHT, "123456789+12345", "", 0, 69, 1, 149, 330, 154 }, + /*138*/ { BARCODE_RM4SCC, -1, "1234567890", "", 0, 8, 3, 91, 182, 16 }, + /*139*/ { BARCODE_RM4SCC, COMPLIANT_HEIGHT, "1234567890", "", 0, 8, 3, 91, 182, 16 }, + /*140*/ { BARCODE_DATAMATRIX, -1, "ABC", "", 0, 10, 10, 10, 20, 20 }, + /*141*/ { BARCODE_DATAMATRIX, COMPLIANT_HEIGHT, "ABC", "", 0, 10, 10, 10, 20, 20 }, + /*142*/ { BARCODE_EAN14, -1, "1234567890123", "", 0, 50, 1, 134, 268, 116 }, + /*143*/ { BARCODE_EAN14, COMPLIANT_HEIGHT, "1234567890123", "", 0, 64, 1, 134, 268, 144 }, + /*144*/ { BARCODE_VIN, -1, "12345678701234567", "", 0, 50, 1, 246, 492, 116 }, + /*145*/ { BARCODE_VIN, COMPLIANT_HEIGHT, "12345678701234567", "", 0, 50, 1, 246, 492, 116 }, + /*146*/ { BARCODE_CODABLOCKF, -1, "1234567890", "", 0, 20, 2, 101, 242, 44 }, + /*147*/ { BARCODE_CODABLOCKF, COMPLIANT_HEIGHT, "1234567890", "", 0, 20, 2, 101, 242, 44 }, + /*148*/ { BARCODE_NVE18, -1, "12345678901234567", "", 0, 50, 1, 156, 312, 116 }, + /*149*/ { BARCODE_NVE18, COMPLIANT_HEIGHT, "12345678901234567", "", 0, 64, 1, 156, 312, 144 }, + /*150*/ { BARCODE_JAPANPOST, -1, "1234567890", "", 0, 8, 3, 133, 266, 16 }, + /*151*/ { BARCODE_JAPANPOST, COMPLIANT_HEIGHT, "1234567890", "", 0, 6, 3, 133, 266, 12 }, + /*152*/ { BARCODE_KOREAPOST, -1, "123456", "", 0, 50, 1, 167, 334, 116 }, + /*153*/ { BARCODE_KOREAPOST, COMPLIANT_HEIGHT, "123456", "", 0, 50, 1, 167, 334, 116 }, + /*154*/ { BARCODE_DBAR_STK, -1, "1234567890123", "", 0, 13, 3, 50, 100, 26 }, + /*155*/ { BARCODE_DBAR_STK, COMPLIANT_HEIGHT, "1234567890123", "", 0, 13, 3, 50, 100, 26 }, + /*156*/ { BARCODE_DBAR_OMNSTK, -1, "1234567890123", "", 0, 69, 5, 50, 100, 138 }, + /*157*/ { BARCODE_DBAR_OMNSTK, COMPLIANT_HEIGHT, "1234567890123", "", 0, 69, 5, 50, 100, 138 }, + /*158*/ { BARCODE_DBAR_EXPSTK, -1, "[01]12345678901231", "", 0, 71, 5, 102, 204, 142 }, + /*159*/ { BARCODE_DBAR_EXPSTK, COMPLIANT_HEIGHT, "[01]12345678901231", "", 0, 71, 5, 102, 204, 142 }, + /*160*/ { BARCODE_PLANET, -1, "12345678901", "", 0, 12, 2, 123, 246, 24 }, + /*161*/ { BARCODE_PLANET, COMPLIANT_HEIGHT, "12345678901", "", 0, 5, 2, 123, 246, 10 }, + /*162*/ { BARCODE_MICROPDF417, -1, "1234567890", "", 0, 12, 6, 82, 164, 24 }, + /*163*/ { BARCODE_MICROPDF417, COMPLIANT_HEIGHT, "1234567890", "", 0, 12, 6, 82, 164, 24 }, + /*164*/ { BARCODE_USPS_IMAIL, -1, "12345678901234567890", "", 0, 8, 3, 129, 258, 16 }, + /*165*/ { BARCODE_USPS_IMAIL, COMPLIANT_HEIGHT, "12345678901234567890", "", 0, 6, 3, 129, 258, 12 }, + /*166*/ { BARCODE_PLESSEY, -1, "1234567890", "", 0, 50, 1, 227, 454, 116 }, + /*167*/ { BARCODE_PLESSEY, COMPLIANT_HEIGHT, "1234567890", "", 0, 50, 1, 227, 454, 116 }, + /*168*/ { BARCODE_TELEPEN_NUM, -1, "1234567890", "", 0, 50, 1, 128, 256, 116 }, + /*169*/ { BARCODE_TELEPEN_NUM, COMPLIANT_HEIGHT, "1234567890", "", 0, 32, 1, 128, 256, 80 }, + /*170*/ { BARCODE_ITF14, -1, "1234567890", "", 0, 50, 1, 135, 330, 136 }, + /*171*/ { BARCODE_ITF14, COMPLIANT_HEIGHT, "1234567890", "", 0, 64, 1, 135, 330, 164 }, + /*172*/ { BARCODE_KIX, -1, "123456ABCDE", "", 0, 8, 3, 87, 174, 16 }, + /*173*/ { BARCODE_KIX, COMPLIANT_HEIGHT, "123456ABCDE", "", 0, 8, 3, 87, 174, 16 }, + /*174*/ { BARCODE_AZTEC, -1, "1234567890AB", "", 0, 15, 15, 15, 30, 30 }, + /*175*/ { BARCODE_AZTEC, COMPLIANT_HEIGHT, "1234567890AB", "", 0, 15, 15, 15, 30, 30 }, + /*176*/ { BARCODE_DAFT, -1, "DAFTDAFTDAFTDAFT", "", 0, 8, 3, 31, 62, 16 }, + /*177*/ { BARCODE_DAFT, COMPLIANT_HEIGHT, "DAFTDAFTDAFTDAFT", "", 0, 8, 3, 31, 62, 16 }, + /*178*/ { BARCODE_DPD, -1, "0123456789012345678901234567", "", 0, 50, 1, 189, 378, 122 }, + /*179*/ { BARCODE_DPD, COMPLIANT_HEIGHT, "0123456789012345678901234567", "", 0, 66.5, 1, 189, 378, 155 }, + /*180*/ { BARCODE_MICROQR, -1, "12345", "", 0, 11, 11, 11, 22, 22 }, + /*181*/ { BARCODE_MICROQR, COMPLIANT_HEIGHT, "12345", "", 0, 11, 11, 11, 22, 22 }, + /*182*/ { BARCODE_HIBC_128, -1, "1234567890", "", 0, 50, 1, 123, 246, 116 }, + /*183*/ { BARCODE_HIBC_128, COMPLIANT_HEIGHT, "1234567890", "", 0, 50, 1, 123, 246, 116 }, + /*184*/ { BARCODE_HIBC_39, -1, "1234567890", "", 0, 50, 1, 223, 446, 116 }, + /*185*/ { BARCODE_HIBC_39, COMPLIANT_HEIGHT, "1234567890", "", 0, 50, 1, 223, 446, 116 }, + /*186*/ { BARCODE_HIBC_DM, -1, "ABC", "", 0, 12, 12, 12, 24, 24 }, + /*187*/ { BARCODE_HIBC_DM, COMPLIANT_HEIGHT, "ABC", "", 0, 12, 12, 12, 24, 24 }, + /*188*/ { BARCODE_HIBC_QR, -1, "1234567890AB", "", 0, 21, 21, 21, 42, 42 }, + /*189*/ { BARCODE_HIBC_QR, COMPLIANT_HEIGHT, "1234567890AB", "", 0, 21, 21, 21, 42, 42 }, + /*190*/ { BARCODE_HIBC_PDF, -1, "1234567890", "", 0, 24, 8, 103, 206, 48 }, + /*191*/ { BARCODE_HIBC_PDF, COMPLIANT_HEIGHT, "1234567890", "", 0, 24, 8, 103, 206, 48 }, + /*192*/ { BARCODE_HIBC_MICPDF, -1, "1234567890", "", 0, 28, 14, 38, 76, 56 }, + /*193*/ { BARCODE_HIBC_MICPDF, COMPLIANT_HEIGHT, "1234567890", "", 0, 28, 14, 38, 76, 56 }, + /*194*/ { BARCODE_HIBC_BLOCKF, -1, "1234567890", "", 0, 30, 3, 101, 242, 64 }, + /*195*/ { BARCODE_HIBC_BLOCKF, COMPLIANT_HEIGHT, "1234567890", "", 0, 30, 3, 101, 242, 64 }, + /*196*/ { BARCODE_HIBC_AZTEC, -1, "1234567890AB", "", 0, 19, 19, 19, 38, 38 }, + /*197*/ { BARCODE_HIBC_AZTEC, COMPLIANT_HEIGHT, "1234567890AB", "", 0, 19, 19, 19, 38, 38 }, + /*198*/ { BARCODE_DOTCODE, -1, "ABC", "", 0, 11, 11, 16, 33, 23 }, + /*199*/ { BARCODE_DOTCODE, COMPLIANT_HEIGHT, "ABC", "", 0, 11, 11, 16, 33, 23 }, + /*200*/ { BARCODE_HANXIN, -1, "1234567890AB", "", 0, 23, 23, 23, 46, 46 }, + /*201*/ { BARCODE_HANXIN, COMPLIANT_HEIGHT, "1234567890AB", "", 0, 23, 23, 23, 46, 46 }, + /*202*/ { BARCODE_MAILMARK_2D, -1, "012100123412345678AB19XY1A 0", "", 0, 24, 24, 24, 48, 48 }, + /*203*/ { BARCODE_MAILMARK_2D, COMPLIANT_HEIGHT, "012100123412345678AB19XY1A 0", "", 0, 24, 24, 24, 48, 48 }, + /*204*/ { BARCODE_UPU_S10, -1, "EE876543216CA", "", 0, 50, 1, 156, 312, 116 }, + /*205*/ { BARCODE_UPU_S10, COMPLIANT_HEIGHT, "EE876543216CA", "", 0, 50, 1, 156, 312, 116 }, + /*206*/ { BARCODE_MAILMARK_4S, -1, "01000000000000000AA00AA0A", "", 0, 10, 3, 155, 310, 20 }, + /*207*/ { BARCODE_MAILMARK_4S, COMPLIANT_HEIGHT, "01000000000000000AA00AA0A", "", 0, 8, 3, 155, 310, 16 }, + /*208*/ { BARCODE_AZRUNE, -1, "255", "", 0, 11, 11, 11, 22, 22 }, + /*209*/ { BARCODE_AZRUNE, COMPLIANT_HEIGHT, "255", "", 0, 11, 11, 11, 22, 22 }, + /*210*/ { BARCODE_CODE32, -1, "12345678", "", 0, 50, 1, 103, 206, 116 }, + /*211*/ { BARCODE_CODE32, COMPLIANT_HEIGHT, "12345678", "", 0, 20, 1, 103, 206, 56 }, + /*212*/ { BARCODE_EANX_CC, -1, "123456789012", "[20]01", 0, 50, 7, 99, 226, 116 }, + /*213*/ { BARCODE_EANX_CC, COMPLIANT_HEIGHT, "123456789012", "[20]01", 0, 81, 7, 99, 226, 178 }, + /*214*/ { BARCODE_EANX_CC, -1, "123456789012+12", "[20]01", 0, 50, 7, 125, 276, 116 }, + /*215*/ { BARCODE_EANX_CC, COMPLIANT_HEIGHT, "123456789012+12", "[20]01", 0, 81, 7, 125, 276, 178 }, + /*216*/ { BARCODE_EANX_CC, -1, "123456789012+12345", "[20]01", 0, 50, 7, 152, 330, 116 }, + /*217*/ { BARCODE_EANX_CC, COMPLIANT_HEIGHT, "123456789012+12345", "[20]01", 0, 81, 7, 152, 330, 178 }, + /*218*/ { BARCODE_EANX_CC, -1, "1234567", "[20]01", 0, 50, 8, 72, 162, 116 }, + /*219*/ { BARCODE_EANX_CC, COMPLIANT_HEIGHT, "1234567", "[20]01", 0, 69, 8, 72, 162, 154 }, + /*220*/ { BARCODE_EANX_CC, -1, "1234567+12", "[20]01", ZINT_WARN_NONCOMPLIANT, 50, 8, 98, 212, 116 }, + /*221*/ { BARCODE_EANX_CC, COMPLIANT_HEIGHT, "1234567+12", "[20]01", ZINT_WARN_NONCOMPLIANT, 69, 8, 98, 212, 154 }, + /*222*/ { BARCODE_EANX_CC, -1, "1234567+12345", "[20]01", ZINT_WARN_NONCOMPLIANT, 50, 8, 125, 266, 116 }, + /*223*/ { BARCODE_EANX_CC, COMPLIANT_HEIGHT, "1234567+12345", "[20]01", ZINT_WARN_NONCOMPLIANT, 69, 8, 125, 266, 154 }, + /*224*/ { BARCODE_GS1_128_CC, -1, "[01]12345678901231", "[20]01", 0, 50, 5, 145, 290, 116 }, + /*225*/ { BARCODE_GS1_128_CC, COMPLIANT_HEIGHT, "[01]12345678901231", "[20]01", 0, 71, 5, 145, 290, 158 }, + /*226*/ { BARCODE_DBAR_OMN_CC, -1, "1234567890123", "[20]01", 0, 21, 5, 100, 200, 58 }, + /*227*/ { BARCODE_DBAR_OMN_CC, COMPLIANT_HEIGHT, "1234567890123", "[20]01", 0, 40, 5, 100, 200, 96 }, + /*228*/ { BARCODE_DBAR_LTD_CC, -1, "1234567890123", "[20]01", 0, 19, 6, 79, 158, 54 }, + /*229*/ { BARCODE_DBAR_LTD_CC, COMPLIANT_HEIGHT, "1234567890123", "[20]01", 0, 19, 6, 79, 158, 54 }, + /*230*/ { BARCODE_DBAR_EXP_CC, -1, "[01]12345678901231", "[20]01", 0, 41, 5, 134, 268, 98 }, + /*231*/ { BARCODE_DBAR_EXP_CC, COMPLIANT_HEIGHT, "[01]12345678901231", "[20]01", 0, 41, 5, 134, 268, 98 }, + /*232*/ { BARCODE_UPCA_CC, -1, "12345678901", "[20]01", 0, 50, 7, 99, 226, 116 }, + /*233*/ { BARCODE_UPCA_CC, COMPLIANT_HEIGHT, "12345678901", "[20]01", 0, 81, 7, 99, 226, 178 }, + /*234*/ { BARCODE_UPCA_CC, -1, "12345678901+12", "[20]01", 0, 50, 7, 127, 276, 116 }, + /*235*/ { BARCODE_UPCA_CC, COMPLIANT_HEIGHT, "12345678901+12", "[20]01", 0, 81, 7, 127, 276, 178 }, + /*236*/ { BARCODE_UPCA_CC, -1, "12345678901+12345", "[20]01", 0, 50, 7, 154, 330, 116 }, + /*237*/ { BARCODE_UPCA_CC, COMPLIANT_HEIGHT, "12345678901+12345", "[20]01", 0, 81, 7, 154, 330, 178 }, + /*238*/ { BARCODE_UPCE_CC, -1, "1234567", "[20]01", 0, 50, 9, 55, 134, 116 }, + /*239*/ { BARCODE_UPCE_CC, COMPLIANT_HEIGHT, "1234567", "[20]01", 0, 85, 9, 55, 134, 186 }, + /*240*/ { BARCODE_UPCE_CC, -1, "1234567+12", "[20]01", 0, 50, 9, 81, 184, 116 }, + /*241*/ { BARCODE_UPCE_CC, COMPLIANT_HEIGHT, "1234567+12", "[20]01", 0, 85, 9, 81, 184, 186 }, + /*242*/ { BARCODE_UPCE_CC, -1, "1234567+12345", "[20]01", 0, 50, 9, 108, 238, 116 }, + /*243*/ { BARCODE_UPCE_CC, COMPLIANT_HEIGHT, "1234567+12345", "[20]01", 0, 85, 9, 108, 238, 186 }, + /*244*/ { BARCODE_DBAR_STK_CC, -1, "1234567890123", "[20]01", 0, 24, 9, 56, 112, 48 }, + /*245*/ { BARCODE_DBAR_STK_CC, COMPLIANT_HEIGHT, "1234567890123", "[20]01", 0, 24, 9, 56, 112, 48 }, + /*246*/ { BARCODE_DBAR_OMNSTK_CC, -1, "1234567890123", "[20]01", 0, 80, 11, 56, 112, 160 }, + /*247*/ { BARCODE_DBAR_OMNSTK_CC, COMPLIANT_HEIGHT, "1234567890123", "[20]01", 0, 80, 11, 56, 112, 160 }, + /*248*/ { BARCODE_DBAR_EXPSTK_CC, -1, "[01]12345678901231", "[20]01", 0, 78, 9, 102, 204, 156 }, + /*249*/ { BARCODE_DBAR_EXPSTK_CC, COMPLIANT_HEIGHT, "[01]12345678901231", "[20]01", 0, 78, 9, 102, 204, 156 }, + /*250*/ { BARCODE_CHANNEL, -1, "01", "", 0, 50, 1, 19, 38, 116 }, + /*251*/ { BARCODE_CHANNEL, COMPLIANT_HEIGHT, "01", "", 0, 20, 1, 19, 38, 56 }, + /*252*/ { BARCODE_CODEONE, -1, "12345678901234567890", "", 0, 16, 16, 18, 36, 32 }, + /*253*/ { BARCODE_CODEONE, COMPLIANT_HEIGHT, "12345678901234567890", "", 0, 16, 16, 18, 36, 32 }, + /*254*/ { BARCODE_GRIDMATRIX, -1, "ABC", "", 0, 18, 18, 18, 36, 36 }, + /*255*/ { BARCODE_GRIDMATRIX, COMPLIANT_HEIGHT, "ABC", "", 0, 18, 18, 18, 36, 36 }, + /*256*/ { BARCODE_UPNQR, -1, "1234567890AB", "", 0, 77, 77, 77, 154, 154 }, + /*257*/ { BARCODE_UPNQR, COMPLIANT_HEIGHT, "1234567890AB", "", 0, 77, 77, 77, 154, 154 }, + /*258*/ { BARCODE_ULTRA, -1, "1234567890", "", 0, 13, 13, 18, 36, 26 }, + /*259*/ { BARCODE_ULTRA, COMPLIANT_HEIGHT, "1234567890", "", 0, 13, 13, 18, 36, 26 }, + /*260*/ { BARCODE_RMQR, -1, "12345", "", 0, 11, 11, 27, 54, 22 }, + /*261*/ { BARCODE_RMQR, COMPLIANT_HEIGHT, "12345", "", 0, 11, 11, 27, 54, 22 }, + /*262*/ { BARCODE_BC412, -1, "1234567", "", 0, 16.5, 1, 102, 204, 49 }, + /*263*/ { BARCODE_BC412, COMPLIANT_HEIGHT, "1234567", "", 0, 16.5, 1, 102, 204, 49 }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; struct zint_symbol *symbol = NULL; const char *text; + int ret_buf; testStartSymbol(p_ctx->func_name, &symbol); @@ -408,30 +409,44 @@ static void test_buffer(const testCtx *const p_ctx) { } else { text = data[i].data; } - length = testUtilSetSymbol(symbol, data[i].symbology, UNICODE_MODE, -1 /*eci*/, -1 /*option_1*/, -1, -1, data[i].output_options, text, -1, debug); + length = testUtilSetSymbol(symbol, data[i].symbology, UNICODE_MODE, -1 /*eci*/, + -1 /*option_1*/, -1 /*option_2*/, -1 /*option_3*/, data[i].output_options, + text, -1, debug); ret = ZBarcode_Encode(symbol, TCU(text), length); - assert_zero(ret, "i:%d ZBarcode_Encode(%s) ret %d != 0 (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, symbol->errtxt); + assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode(%s) ret %d != %d (%s)\n", + i, testUtilBarcodeName(data[i].symbology), ret, data[i].ret, symbol->errtxt); - ret = ZBarcode_Buffer(symbol, 0); - assert_zero(ret, "i:%d ZBarcode_Buffer(%s) ret %d != 0 (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, symbol->errtxt); - assert_nonnull(symbol->bitmap, "i:%d ZBarcode_Buffer(%s) bitmap NULL\n", i, testUtilBarcodeName(data[i].symbology)); + ret_buf = ZBarcode_Buffer(symbol, 0); + assert_zero(ret_buf, "i:%d ZBarcode_Buffer(%s) ret_buf %d != 0 (%s)\n", + i, testUtilBarcodeName(data[i].symbology), ret_buf, symbol->errtxt); + assert_nonnull(symbol->bitmap, "i:%d ZBarcode_Buffer(%s) bitmap NULL\n", + i, testUtilBarcodeName(data[i].symbology)); - if (p_ctx->index != -1 && (debug & ZINT_DEBUG_TEST_PRINT)) testUtilBitmapPrint(symbol, NULL, NULL); /* ZINT_DEBUG_TEST_PRINT 16 */ + if (p_ctx->index != -1 && (debug & ZINT_DEBUG_TEST_PRINT)) { /* ZINT_DEBUG_TEST_PRINT 16 */ + testUtilBitmapPrint(symbol, NULL, NULL); + } if (p_ctx->generate) { - printf(" /*%3d*/ { %s, %s, \"%s\", \"%s\", %.8g, %d, %d, %d, %d },\n", + printf(" /*%3d*/ { %s, %s, \"%s\", \"%s\", %s, %.8g, %d, %d, %d, %d },\n", i, testUtilBarcodeName(data[i].symbology), testUtilOutputOptionsName(data[i].output_options), - data[i].data, data[i].composite, + data[i].data, data[i].composite, testUtilErrorName(ret), symbol->height, symbol->rows, symbol->width, symbol->bitmap_width, symbol->bitmap_height); } else { - assert_equal(symbol->height, data[i].expected_height, "i:%d (%s) symbol->height %.8g != %.8g\n", i, testUtilBarcodeName(data[i].symbology), symbol->height, data[i].expected_height); - assert_equal(symbol->rows, data[i].expected_rows, "i:%d (%s) symbol->rows %d != %d\n", i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows); - assert_equal(symbol->width, data[i].expected_width, "i:%d (%s) symbol->width %d != %d\n", i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width); - assert_equal(symbol->bitmap_width, data[i].expected_bitmap_width, "i:%d (%s) symbol->bitmap_width %d != %d\n", - i, testUtilBarcodeName(data[i].symbology), symbol->bitmap_width, data[i].expected_bitmap_width); - assert_equal(symbol->bitmap_height, data[i].expected_bitmap_height, "i:%d (%s) symbol->bitmap_height %d != %d\n", - i, testUtilBarcodeName(data[i].symbology), symbol->bitmap_height, data[i].expected_bitmap_height); + assert_equal(symbol->height, data[i].expected_height, "i:%d (%s) symbol->height %.8g != %.8g\n", + i, testUtilBarcodeName(data[i].symbology), symbol->height, data[i].expected_height); + assert_equal(symbol->rows, data[i].expected_rows, "i:%d (%s) symbol->rows %d != %d\n", + i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows); + assert_equal(symbol->width, data[i].expected_width, "i:%d (%s) symbol->width %d != %d\n", + i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width); + assert_equal(symbol->bitmap_width, data[i].expected_bitmap_width, + "i:%d (%s) symbol->bitmap_width %d != %d\n", + i, testUtilBarcodeName(data[i].symbology), symbol->bitmap_width, + data[i].expected_bitmap_width); + assert_equal(symbol->bitmap_height, data[i].expected_bitmap_height, + "i:%d (%s) symbol->bitmap_height %d != %d\n", + i, testUtilBarcodeName(data[i].symbology), symbol->bitmap_height, + data[i].expected_bitmap_height); } ZBarcode_Delete(symbol); @@ -493,18 +508,18 @@ static void test_upcean_hrt(const testCtx *const p_ctx) { /* 26*/ { BARCODE_EANX, -1, EANUPC_GUARD_WHITESPACE, "123456", 0, 50, 1, 67, 162, 116, 106 /*text_row*/, 0, 14, 106, 148, 14 }, /* EAN-8 */ /* 27*/ { BARCODE_EANX, 0, EANUPC_GUARD_WHITESPACE, "123456", 0, 50, 1, 67, 162, 110, 106 /*text_row*/, 0, 14, 106, 148, 14 }, /* EAN-8 */ /* 28*/ { BARCODE_EANX, 1 /*empty*/, -1, "123456", 0, 50, 1, 67, 162, 116, 106 /*text_row*/, 0, 14, 106, 148, 14 }, /* EAN-8 */ - /* 29*/ { BARCODE_EANX, -1, -1, "123456+12", 0, 50, 1, 94, 212, 116, 106 /*text_row*/, 20, 58, 5, 148, 68 }, /* EAN-8 + EAN-2 */ - /* 30*/ { BARCODE_EANX, -1, BARCODE_RAW_TEXT, "123456+12", 0, 50, 1, 94, 212, 116, 106 /*text_row*/, 20, 58, 5, 148, 68 }, /* EAN-8 + EAN-2 */ - /* 31*/ { BARCODE_EANX, 0, -1, "123456+12", 0, 50, 1, 94, 212, 110, 106 /*text_row*/, 20, 58, 5, 148, 68 }, /* EAN-8 + EAN-2 */ - /* 32*/ { BARCODE_EANX, -1, EANUPC_GUARD_WHITESPACE, "123456+12", 0, 50, 1, 94, 212, 116, 106 /*text_row*/, 0, 14, 6, 202, 8 }, /* EAN-8 + EAN-2 */ - /* 33*/ { BARCODE_EANX, 0, EANUPC_GUARD_WHITESPACE, "123456+12", 0, 50, 1, 94, 212, 110, 106 /*text_row*/, 0, 14, 6, 202, 8 }, /* EAN-8 + EAN-2 */ - /* 34*/ { BARCODE_EANX, 1 /*empty*/, -1, "123456+12", 0, 50, 1, 94, 212, 116, 106 /*text_row*/, 0, 14, 6, 202, 8 }, /* EAN-8 + EAN-2 */ - /* 35*/ { BARCODE_EANX, -1, -1, "123456+12345", 0, 50, 1, 121, 266, 116, 106 /*text_row*/, 20, 58, 5, 148, 122 }, /* EAN-8 + EAN-5 */ - /* 36*/ { BARCODE_EANX, -1, BARCODE_RAW_TEXT, "123456+12345", 0, 50, 1, 121, 266, 116, 106 /*text_row*/, 20, 58, 5, 148, 122 }, /* EAN-8 + EAN-5 */ - /* 37*/ { BARCODE_EANX, 0, -1, "123456+12345", 0, 50, 1, 121, 266, 110, 106 /*text_row*/, 20, 58, 5, 148, 122 }, /* EAN-8 + EAN-5 */ - /* 38*/ { BARCODE_EANX, -1, EANUPC_GUARD_WHITESPACE, "123456+12345", 0, 50, 1, 121, 266, 116, 106 /*text_row*/, 0, 14, 6, 256, 10 }, /* EAN-8 + EAN-5 */ - /* 39*/ { BARCODE_EANX, 0, EANUPC_GUARD_WHITESPACE, "123456+12345", 0, 50, 1, 121, 266, 110, 106 /*text_row*/, 0, 14, 6, 256, 10 }, /* EAN-8 + EAN-5 */ - /* 40*/ { BARCODE_EANX, 1 /*empty*/, -1, "123456+12345", 0, 50, 1, 121, 266, 116, 106 /*text_row*/, 0, 14, 6, 256, 10 }, /* EAN-8 + EAN-5 */ + /* 29*/ { BARCODE_EANX, -1, -1, "123456+12", ZINT_WARN_NONCOMPLIANT, 50, 1, 94, 212, 116, 106 /*text_row*/, 20, 58, 5, 148, 68 }, /* EAN-8 + EAN-2 */ + /* 30*/ { BARCODE_EANX, -1, BARCODE_RAW_TEXT, "123456+12", ZINT_WARN_NONCOMPLIANT, 50, 1, 94, 212, 116, 106 /*text_row*/, 20, 58, 5, 148, 68 }, /* EAN-8 + EAN-2 */ + /* 31*/ { BARCODE_EANX, 0, -1, "123456+12", ZINT_WARN_NONCOMPLIANT, 50, 1, 94, 212, 110, 106 /*text_row*/, 20, 58, 5, 148, 68 }, /* EAN-8 + EAN-2 */ + /* 32*/ { BARCODE_EANX, -1, EANUPC_GUARD_WHITESPACE, "123456+12", ZINT_WARN_NONCOMPLIANT, 50, 1, 94, 212, 116, 106 /*text_row*/, 0, 14, 6, 202, 8 }, /* EAN-8 + EAN-2 */ + /* 33*/ { BARCODE_EANX, 0, EANUPC_GUARD_WHITESPACE, "123456+12", ZINT_WARN_NONCOMPLIANT, 50, 1, 94, 212, 110, 106 /*text_row*/, 0, 14, 6, 202, 8 }, /* EAN-8 + EAN-2 */ + /* 34*/ { BARCODE_EANX, 1 /*empty*/, -1, "123456+12", ZINT_WARN_NONCOMPLIANT, 50, 1, 94, 212, 116, 106 /*text_row*/, 0, 14, 6, 202, 8 }, /* EAN-8 + EAN-2 */ + /* 35*/ { BARCODE_EANX, -1, -1, "123456+12345", ZINT_WARN_NONCOMPLIANT, 50, 1, 121, 266, 116, 106 /*text_row*/, 20, 58, 5, 148, 122 }, /* EAN-8 + EAN-5 */ + /* 36*/ { BARCODE_EANX, -1, BARCODE_RAW_TEXT, "123456+12345", ZINT_WARN_NONCOMPLIANT, 50, 1, 121, 266, 116, 106 /*text_row*/, 20, 58, 5, 148, 122 }, /* EAN-8 + EAN-5 */ + /* 37*/ { BARCODE_EANX, 0, -1, "123456+12345", ZINT_WARN_NONCOMPLIANT, 50, 1, 121, 266, 110, 106 /*text_row*/, 20, 58, 5, 148, 122 }, /* EAN-8 + EAN-5 */ + /* 38*/ { BARCODE_EANX, -1, EANUPC_GUARD_WHITESPACE, "123456+12345", ZINT_WARN_NONCOMPLIANT, 50, 1, 121, 266, 116, 106 /*text_row*/, 0, 14, 6, 256, 10 }, /* EAN-8 + EAN-5 */ + /* 39*/ { BARCODE_EANX, 0, EANUPC_GUARD_WHITESPACE, "123456+12345", ZINT_WARN_NONCOMPLIANT, 50, 1, 121, 266, 110, 106 /*text_row*/, 0, 14, 6, 256, 10 }, /* EAN-8 + EAN-5 */ + /* 40*/ { BARCODE_EANX, 1 /*empty*/, -1, "123456+12345", ZINT_WARN_NONCOMPLIANT, 50, 1, 121, 266, 116, 106 /*text_row*/, 0, 14, 6, 256, 10 }, /* EAN-8 + EAN-5 */ /* 41*/ { BARCODE_EANX, -1, -1, "1234", 0, 50, 1, 47, 104, 116, 0 /*text_row*/, 18, 5, -1, -1, -1 }, /* EAN-5 */ /* 42*/ { BARCODE_EANX, -1, BARCODE_RAW_TEXT, "1234", 0, 50, 1, 47, 104, 116, 0 /*text_row*/, 18, 5, -1, -1, -1 }, /* EAN-5 */ /* 43*/ { BARCODE_EANX, 0, -1, "1234", 0, 50, 1, 47, 104, 100, -1 /*text_row*/, -1, -1, -1, -1, -1 }, /* EAN-5 */ @@ -573,40 +588,54 @@ static void test_upcean_hrt(const testCtx *const p_ctx) { length = (int) strlen(data[i].data); ret = ZBarcode_Encode_and_Buffer(symbol, (unsigned char *) data[i].data, length, 0); - assert_equal(ret, data[i].ret, "i:%d ret %d != %d\n", i, ret, data[i].ret); + assert_equal(ret, data[i].ret, "i:%d ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); assert_nonnull(symbol->bitmap, "i:%d (%d) symbol->bitmap NULL\n", i, data[i].symbology); - if (p_ctx->index != -1 && (debug & ZINT_DEBUG_TEST_PRINT)) testUtilBitmapPrint(symbol, NULL, NULL); /* ZINT_DEBUG_TEST_PRINT 16 */ + if (p_ctx->index != -1 && (debug & ZINT_DEBUG_TEST_PRINT)) { /* ZINT_DEBUG_TEST_PRINT 16 */ + testUtilBitmapPrint(symbol, NULL, NULL); + } - assert_equal(symbol->height, data[i].expected_height, "i:%d (%s) symbol->height %.8g != %.8g\n", i, testUtilBarcodeName(data[i].symbology), symbol->height, data[i].expected_height); - assert_equal(symbol->rows, data[i].expected_rows, "i:%d (%s) symbol->rows %d != %d\n", i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows); - assert_equal(symbol->width, data[i].expected_width, "i:%d (%s) symbol->width %d != %d\n", i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width); + assert_equal(symbol->height, data[i].expected_height, "i:%d (%s) symbol->height %.8g != %.8g\n", + i, testUtilBarcodeName(data[i].symbology), symbol->height, data[i].expected_height); + assert_equal(symbol->rows, data[i].expected_rows, "i:%d (%s) symbol->rows %d != %d\n", + i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows); + assert_equal(symbol->width, data[i].expected_width, "i:%d (%s) symbol->width %d != %d\n", + i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width); assert_equal(symbol->bitmap_width, data[i].expected_bitmap_width, "i:%d (%s) symbol->bitmap_width %d != %d\n", - i, testUtilBarcodeName(data[i].symbology), symbol->bitmap_width, data[i].expected_bitmap_width); - assert_equal(symbol->bitmap_height, data[i].expected_bitmap_height, "i:%d (%s) symbol->bitmap_height %d != %d\n", - i, testUtilBarcodeName(data[i].symbology), symbol->bitmap_height, data[i].expected_bitmap_height); + i, testUtilBarcodeName(data[i].symbology), symbol->bitmap_width, data[i].expected_bitmap_width); + assert_equal(symbol->bitmap_height, data[i].expected_bitmap_height, + "i:%d (%s) symbol->bitmap_height %d != %d\n", + i, testUtilBarcodeName(data[i].symbology), symbol->bitmap_height, data[i].expected_bitmap_height); - assert_nonzero(symbol->bitmap_height > data[i].expected_text_row, "i:%d symbol->bitmap_height %d <= data[i].expected_text_row %d\n", i, symbol->bitmap_height, data[i].expected_text_row); + assert_nonzero(symbol->bitmap_height > data[i].expected_text_row, + "i:%d symbol->bitmap_height %d <= data[i].expected_text_row %d\n", + i, symbol->bitmap_height, data[i].expected_text_row); if (data[i].expected_text_row == -1) { /* EAN-2/5 just truncates bitmap if no text */ assert_zero(data[i].show_hrt, "i:%d Expected text row -1 but show_hrt set\n", i); - if (i && data[i - 1].symbology == symbol->symbology && data[i - 1].show_hrt && data[i - 1].expected_text_row != -1) { - assert_nonzero(data[i].expected_bitmap_height > data[i - 1].expected_text_row, "i:%d (%s) expected_bitmap_height %d <= previous expected_text_row %d\n", - i, testUtilBarcodeName(data[i].symbology), data[i].expected_bitmap_height, data[i - 1].expected_text_row); + if (i && data[i - 1].symbology == symbol->symbology && data[i - 1].show_hrt + && data[i - 1].expected_text_row != -1) { + assert_nonzero(data[i].expected_bitmap_height > data[i - 1].expected_text_row, + "i:%d (%s) expected_bitmap_height %d <= previous expected_text_row %d\n", + i, testUtilBarcodeName(data[i].symbology), data[i].expected_bitmap_height, + data[i - 1].expected_text_row); } } else { int text_bits_set = 0; int row = data[i].expected_text_row; int column; - for (column = data[i].expected_text_col; column < data[i].expected_text_col + data[i].expected_text_len; column++) { + for (column = data[i].expected_text_col; + column < data[i].expected_text_col + data[i].expected_text_len; column++) { if (is_row_column_black(symbol, row, column)) { text_bits_set = 1; break; } } if (data[i].show_hrt == -1) { /* Using -1 in data as show_hrt, 1 in data as show_hrt but empty space */ - assert_nonzero(text_bits_set, "i:%d (%s) text_bits_set zero\n", i, testUtilBarcodeName(data[i].symbology)); + assert_nonzero(text_bits_set, "i:%d (%s) text_bits_set zero\n", + i, testUtilBarcodeName(data[i].symbology)); } else { - assert_zero(text_bits_set, "i:%d (%s) text_bits_set non-zero\n", i, testUtilBarcodeName(data[i].symbology)); + assert_zero(text_bits_set, "i:%d (%s) text_bits_set non-zero\n", + i, testUtilBarcodeName(data[i].symbology)); } } @@ -614,16 +643,19 @@ static void test_upcean_hrt(const testCtx *const p_ctx) { int text2_bits_set = 0; int row = data[i].expected_text2_row; int column; - for (column = data[i].expected_text2_col; column < data[i].expected_text2_col + data[i].expected_text2_len; column++) { + for (column = data[i].expected_text2_col; + column < data[i].expected_text2_col + data[i].expected_text2_len; column++) { if (is_row_column_black(symbol, row, column)) { text2_bits_set = 1; break; } } if (data[i].show_hrt == -1) { /* Using -1 in data as show_hrt, 1 in data as show_hrt but empty space */ - assert_nonzero(text2_bits_set, "i:%d (%s) text2_bits_set zero\n", i, testUtilBarcodeName(data[i].symbology)); + assert_nonzero(text2_bits_set, "i:%d (%s) text2_bits_set zero\n", + i, testUtilBarcodeName(data[i].symbology)); } else { - assert_zero(text2_bits_set, "i:%d (%s) text2_bits_set non-zero\n", i, testUtilBarcodeName(data[i].symbology)); + assert_zero(text2_bits_set, "i:%d (%s) text2_bits_set non-zero\n", + i, testUtilBarcodeName(data[i].symbology)); } } @@ -3152,7 +3184,7 @@ static void test_hrt_raw_text(const testCtx *const p_ctx) { /* 6*/ { BARCODE_EANX, -1, -1, BARCODE_MEMORY_FILE, "123456789012", -1, 0, 116, 226, "1234567890128", -1, "", -1, "" }, /* 7*/ { BARCODE_EANX, -1, -1, BARCODE_MEMORY_FILE | BARCODE_RAW_TEXT, "123456789012", -1, 0, 116, 226, "1234567890128", -1, "1234567890128", -1, "" }, /* 8*/ { BARCODE_EANX, -1, -1, BARCODE_MEMORY_FILE, "123456789012+12", -1, 0, 116, 276, "1234567890128+12", -1, "", -1, "" }, - /* 9*/ { BARCODE_EANX, -1, -1, BARCODE_MEMORY_FILE | BARCODE_RAW_TEXT, "123456789012+12", -1, 0, 116, 276, "1234567890128+12", -1, "1234567890128+12", -1, "" }, + /* 9*/ { BARCODE_EANX, -1, -1, BARCODE_MEMORY_FILE | BARCODE_RAW_TEXT, "123456789012+12", -1, 0, 116, 276, "1234567890128+12", -1, "123456789012812", -1, "" }, /* 10*/ { BARCODE_CODE39, -1, -1, BARCODE_MEMORY_FILE, "ABC14", -1, 0, 116, 180, "*ABC14*", -1, "", -1, "" }, /* 11*/ { BARCODE_CODE39, -1, -1, BARCODE_MEMORY_FILE | BARCODE_RAW_TEXT, "ABC14", -1, 0, 116, 180, "*ABC14*", -1, "ABC14", -1, "" }, /* 12*/ { BARCODE_CODE39, -1, 1, BARCODE_MEMORY_FILE, "ABC14", -1, 0, 116, 206, "*ABC14_*", -1, "", -1, "" }, /* Check digit space rendered as underscore */ @@ -3347,24 +3379,24 @@ static void test_perf_scale(const testCtx *const p_ctx) { int main(int argc, char *argv[]) { testFunction funcs[] = { /* name, func */ - { "test_options", test_options, }, - { "test_buffer", test_buffer, }, - { "test_upcean_hrt", test_upcean_hrt, }, - { "test_row_separator", test_row_separator, }, - { "test_stacking", test_stacking, }, - { "test_stacking_too_many", test_stacking_too_many, }, - { "test_output_options", test_output_options, }, - { "test_draw_string_wrap", test_draw_string_wrap, }, - { "test_code128_utf8", test_code128_utf8, }, - { "test_scale", test_scale, }, - { "test_guard_descent", test_guard_descent, }, - { "test_quiet_zones", test_quiet_zones, }, - { "test_text_gap", test_text_gap, }, - { "test_buffer_plot", test_buffer_plot, }, - { "test_height", test_height, }, - { "test_height_per_row", test_height_per_row, }, - { "test_hrt_raw_text", test_hrt_raw_text, }, - { "test_perf_scale", test_perf_scale, }, + { "test_options", test_options }, + { "test_buffer", test_buffer }, + { "test_upcean_hrt", test_upcean_hrt }, + { "test_row_separator", test_row_separator }, + { "test_stacking", test_stacking }, + { "test_stacking_too_many", test_stacking_too_many }, + { "test_output_options", test_output_options }, + { "test_draw_string_wrap", test_draw_string_wrap }, + { "test_code128_utf8", test_code128_utf8 }, + { "test_scale", test_scale }, + { "test_guard_descent", test_guard_descent }, + { "test_quiet_zones", test_quiet_zones }, + { "test_text_gap", test_text_gap }, + { "test_buffer_plot", test_buffer_plot }, + { "test_height", test_height }, + { "test_height_per_row", test_height_per_row }, + { "test_hrt_raw_text", test_hrt_raw_text }, + { "test_perf_scale", test_perf_scale }, }; testRun(argc, argv, funcs, ARRAY_SIZE(funcs)); diff --git a/backend/tests/test_rss.c b/backend/tests/test_rss.c index e15a0df0..33a4c783 100644 --- a/backend/tests/test_rss.c +++ b/backend/tests/test_rss.c @@ -1369,8 +1369,9 @@ static void test_hrt(const testCtx *const p_ctx) { "i:%d raw_segs[0].length %d != expected_raw_length %d\n", i, symbol->raw_segs[0].length, expected_raw_length); assert_zero(memcmp(symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length), - "i:%d memcmp(%s, %s, %d) != 0\n", - i, symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length); + "i:%d memcmp(%.*s, %s, %d) != 0\n", + i, symbol->raw_segs[0].length, symbol->raw_segs[0].source, data[i].expected_raw, + expected_raw_length); } else { assert_null(symbol->raw_segs, "i:%d raw_segs not NULL\n", i); } diff --git a/backend/tests/test_svg.c b/backend/tests/test_svg.c index 02059078..2c029ddd 100644 --- a/backend/tests/test_svg.c +++ b/backend/tests/test_svg.c @@ -109,14 +109,14 @@ static void test_print(const testCtx *const p_ctx) { /* 49*/ { BARCODE_UPCE_CC, -1, -1, -1, -1, -1, 0, 2, -1, -1, 0, "", "", 0, "1876543+56789", "[91]12345", 0, "upce_cc_5addon_ccb_8x2_notext.svg", "" }, /* 50*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "9501234", "", 0, "ean8_gss_5.2.2.2-1.svg", "" }, /* 51*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "9501234", "", 0, "ean8_gss_5.2.2.2-1_gws.svg", "" }, - /* 52*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "1234567+12", "", 0, "ean8_2addon.svg", "" }, - /* 53*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "1234567+12", "", 0, "ean8_2addon_gws.svg", "" }, - /* 54*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "1234567+12345", "", 0, "ean8_5addon.svg", "" }, - /* 55*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "1234567+12345", "", 0, "ean8_5addon_gws.svg", "" }, - /* 56*/ { BARCODE_EANX_CC, -1, -1, -1, -1, -1, -1, 1, -1, -1, 0, "", "", 0, "9876543+65", "[91]1234567", 0, "ean8_cc_2addon_cca_4x3.svg", "" }, - /* 57*/ { BARCODE_EANX_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, 1, -1, -1, 0, "", "", 0, "9876543+65", "[91]1234567", 0, "ean8_cc_2addon_cca_4x3_gws.svg", "" }, - /* 58*/ { BARCODE_EANX_CC, -1, -1, -1, -1, -1, -1, 2, -1, -1, 0, "", "", 0, "9876543+74083", "[91]123456789012345678", 0, "ean8_cc_5addon_ccb_8x3.svg", "" }, - /* 59*/ { BARCODE_EANX_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, 2, -1, -1, 0, "", "", 0, "9876543+74083", "[91]123456789012345678", 0, "ean8_cc_5addon_ccb_8x3_gws.svg", "" }, + /* 52*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "1234567+12", "", ZINT_WARN_NONCOMPLIANT, "ean8_2addon.svg", "" }, + /* 53*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "1234567+12", "", ZINT_WARN_NONCOMPLIANT, "ean8_2addon_gws.svg", "" }, + /* 54*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "1234567+12345", "", ZINT_WARN_NONCOMPLIANT, "ean8_5addon.svg", "" }, + /* 55*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "1234567+12345", "", ZINT_WARN_NONCOMPLIANT, "ean8_5addon_gws.svg", "" }, + /* 56*/ { BARCODE_EANX_CC, -1, -1, -1, -1, -1, -1, 1, -1, -1, 0, "", "", 0, "9876543+65", "[91]1234567", ZINT_WARN_NONCOMPLIANT, "ean8_cc_2addon_cca_4x3.svg", "" }, + /* 57*/ { BARCODE_EANX_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, 1, -1, -1, 0, "", "", 0, "9876543+65", "[91]1234567", ZINT_WARN_NONCOMPLIANT, "ean8_cc_2addon_cca_4x3_gws.svg", "" }, + /* 58*/ { BARCODE_EANX_CC, -1, -1, -1, -1, -1, -1, 2, -1, -1, 0, "", "", 0, "9876543+74083", "[91]123456789012345678", ZINT_WARN_NONCOMPLIANT, "ean8_cc_5addon_ccb_8x3.svg", "" }, + /* 59*/ { BARCODE_EANX_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, 2, -1, -1, 0, "", "", 0, "9876543+74083", "[91]123456789012345678", ZINT_WARN_NONCOMPLIANT, "ean8_cc_5addon_ccb_8x3_gws.svg", "" }, /* 60*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "12345", "", 0, "ean5.svg", "" }, /* 61*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "12345", "", 0, "ean5_gws.svg", "" }, /* 62*/ { BARCODE_EANX, -1, 2, BARCODE_BIND, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "12345", "", 0, "ean5_bind2.svg", "" }, @@ -163,7 +163,8 @@ static void test_print(const testCtx *const p_ctx) { have_libreoffice = testUtilHaveLibreOffice(); have_vnu = testUtilHaveVnu(); - assert_nonzero(testUtilDataPath(data_dir_path, sizeof(data_dir_path), data_dir, NULL), "testUtilDataPath(%s) == 0\n", data_dir); + assert_nonzero(testUtilDataPath(data_dir_path, sizeof(data_dir_path), data_dir, NULL), + "testUtilDataPath(%s) == 0\n", data_dir); if (!testUtilDirExists(data_dir_path)) { ret = testUtilMkDir(data_dir_path); assert_zero(ret, "testUtilMkDir(%s) ret %d != 0 (%d: %s)\n", data_dir_path, ret, errno, strerror(errno)); @@ -178,7 +179,9 @@ static void test_print(const testCtx *const p_ctx) { symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, -1 /*eci*/, data[i].option_1, data[i].option_2, data[i].option_3, data[i].output_options, data[i].data, -1, debug); + length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, -1 /*eci*/, + data[i].option_1, data[i].option_2, data[i].option_3, data[i].output_options, + data[i].data, -1, debug); if (data[i].show_hrt != -1) { symbol->show_hrt = data[i].show_hrt; } @@ -210,44 +213,53 @@ static void test_print(const testCtx *const p_ctx) { text_length = (int) strlen(text); ret = ZBarcode_Encode(symbol, TCU(text), text_length); - assert_equal(ret, data[i].ret, "i:%d %s ZBarcode_Encode ret %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, data[i].ret, symbol->errtxt); + assert_equal(ret, data[i].ret, "i:%d %s ZBarcode_Encode ret %d != %d (%s)\n", + i, testUtilBarcodeName(data[i].symbology), ret, data[i].ret, symbol->errtxt); strcpy(symbol->outfile, svg); ret = ZBarcode_Print(symbol, data[i].rotate_angle); - assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); + assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); - assert_nonzero(testUtilDataPath(expected_file, sizeof(expected_file), data_dir, data[i].expected_file), "i:%d testUtilDataPath == 0\n", i); + assert_nonzero(testUtilDataPath(expected_file, sizeof(expected_file), data_dir, data[i].expected_file), + "i:%d testUtilDataPath == 0\n", i); if (p_ctx->generate) { printf(" /*%3d*/ { %s, %s, %d, %s, %d, %d, %d, %d, %d, %d, %.8g, \"%s\", \"%s\", %d, \"%s\", \"%s\", %s, \"%s\", \"%s\" },\n", - i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), data[i].border_width, - testUtilOutputOptionsName(data[i].output_options), data[i].whitespace_width, data[i].whitespace_height, data[i].show_hrt, - data[i].option_1, data[i].option_2, data[i].option_3, data[i].height, data[i].fgcolour, data[i].bgcolour, data[i].rotate_angle, + i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), + data[i].border_width, testUtilOutputOptionsName(data[i].output_options), + data[i].whitespace_width, data[i].whitespace_height, data[i].show_hrt, + data[i].option_1, data[i].option_2, data[i].option_3, data[i].height, + data[i].fgcolour, data[i].bgcolour, data[i].rotate_angle, testUtilEscape(data[i].data, length, escaped, escaped_size), data[i].composite, testUtilErrorName(data[i].ret), data[i].expected_file, data[i].comment); ret = testUtilRename(symbol->outfile, expected_file); assert_zero(ret, "i:%d testUtilRename(%s, %s) ret %d != 0\n", i, symbol->outfile, expected_file, ret); if (have_libreoffice) { ret = testUtilVerifyLibreOffice(expected_file, debug); - assert_zero(ret, "i:%d %s libreoffice %s ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), expected_file, ret); + assert_zero(ret, "i:%d %s libreoffice %s ret %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), expected_file, ret); } if (have_vnu) { ret = testUtilVerifyVnu(expected_file, debug); /* Very slow */ - assert_zero(ret, "i:%d %s vnu libreoffice %s ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), expected_file, ret); + assert_zero(ret, "i:%d %s vnu libreoffice %s ret %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), expected_file, ret); } } else { assert_nonzero(testUtilExists(symbol->outfile), "i:%d testUtilExists(%s) == 0\n", i, symbol->outfile); assert_nonzero(testUtilExists(expected_file), "i:%d testUtilExists(%s) == 0\n", i, expected_file); ret = testUtilCmpSvgs(symbol->outfile, expected_file); - assert_zero(ret, "i:%d %s testUtilCmpSvgs(%s, %s) %d != 0\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, expected_file, ret); + assert_zero(ret, "i:%d %s testUtilCmpSvgs(%s, %s) %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, expected_file, ret); symbol->output_options |= BARCODE_MEMORY_FILE; ret = ZBarcode_Print(symbol, data[i].rotate_angle); assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0 (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret, symbol->errtxt); assert_nonnull(symbol->memfile, "i:%d %s memfile NULL\n", i, testUtilBarcodeName(data[i].symbology)); - assert_nonzero(symbol->memfile_size, "i:%d %s memfile_size 0\n", i, testUtilBarcodeName(data[i].symbology)); + assert_nonzero(symbol->memfile_size, "i:%d %s memfile_size 0\n", + i, testUtilBarcodeName(data[i].symbology)); ret = testUtilWriteFile(memfile, symbol->memfile, symbol->memfile_size, "wb"); assert_zero(ret, "%d: testUtilWriteFile(%s) fail ret %d != 0\n", i, memfile, ret); @@ -288,15 +300,20 @@ static void test_outfile(const testCtx *const p_ctx) { skip_readonly_test = getuid() == 0; /* Skip if running as root on Unix as can't create read-only file */ #endif if (!skip_readonly_test) { - static char expected_errtxt[] = "680: Could not open SVG output file ("; /* Excluding OS-dependent `errno` stuff */ + /* Excluding OS-dependent `errno` stuff */ + static char expected_errtxt[] = "680: Could not open SVG output file ("; (void) testUtilRmROFile(symbol.outfile); /* In case lying around from previous fail */ - assert_nonzero(testUtilCreateROFile(symbol.outfile), "svg_plot testUtilCreateROFile(%s) fail (%d: %s)\n", symbol.outfile, errno, strerror(errno)); + assert_nonzero(testUtilCreateROFile(symbol.outfile), "svg_plot testUtilCreateROFile(%s) fail (%d: %s)\n", + symbol.outfile, errno, strerror(errno)); ret = svg_plot(&symbol, 0); - assert_equal(ret, ZINT_ERROR_FILE_ACCESS, "svg_plot ret %d != ZINT_ERROR_FILE_ACCESS (%d) (%s)\n", ret, ZINT_ERROR_FILE_ACCESS, symbol.errtxt); - assert_zero(testUtilRmROFile(symbol.outfile), "svg_plot testUtilRmROFile(%s) != 0 (%d: %s)\n", symbol.outfile, errno, strerror(errno)); - assert_zero(strncmp(symbol.errtxt, expected_errtxt, sizeof(expected_errtxt) - 1), "strncmp(%s, %s) != 0\n", symbol.errtxt, expected_errtxt); + assert_equal(ret, ZINT_ERROR_FILE_ACCESS, "svg_plot ret %d != ZINT_ERROR_FILE_ACCESS (%d) (%s)\n", + ret, ZINT_ERROR_FILE_ACCESS, symbol.errtxt); + assert_zero(testUtilRmROFile(symbol.outfile), "svg_plot testUtilRmROFile(%s) != 0 (%d: %s)\n", + symbol.outfile, errno, strerror(errno)); + assert_zero(strncmp(symbol.errtxt, expected_errtxt, sizeof(expected_errtxt) - 1), "strncmp(%s, %s) != 0\n", + symbol.errtxt, expected_errtxt); } symbol.output_options |= BARCODE_STDOUT; @@ -308,7 +325,8 @@ static void test_outfile(const testCtx *const p_ctx) { symbol.vector = NULL; ret = svg_plot(&symbol, 0); - assert_equal(ret, ZINT_ERROR_INVALID_DATA, "svg_plot ret %d != ZINT_ERROR_INVALID_DATA (%d) (%s)\n", ret, ZINT_ERROR_INVALID_DATA, symbol.errtxt); + assert_equal(ret, ZINT_ERROR_INVALID_DATA, "svg_plot ret %d != ZINT_ERROR_INVALID_DATA (%d) (%s)\n", + ret, ZINT_ERROR_INVALID_DATA, symbol.errtxt); testFinish(); } diff --git a/backend/tests/test_tif.c b/backend/tests/test_tif.c index 2effea62..2686568c 100644 --- a/backend/tests/test_tif.c +++ b/backend/tests/test_tif.c @@ -117,19 +117,22 @@ static void test_pixel_plot(const testCtx *const p_ctx) { symbol->debug |= debug; size = data[i].width * data[i].height; - assert_nonzero(size < (int) sizeof(data_buf), "i:%d tif_pixel_plot size %d >= sizeof(data_buf) %d\n", i, size, (int) sizeof(data_buf)); + assert_nonzero(size < (int) sizeof(data_buf), "i:%d tif_pixel_plot size %d >= sizeof(data_buf) %d\n", + i, size, (int) sizeof(data_buf)); if (data[i].repeat) { testUtilStrCpyRepeat(data_buf, data[i].pattern, size); } else { strcpy(data_buf, data[i].pattern); } - assert_equal(size, (int) strlen(data_buf), "i:%d tif_pixel_plot size %d != strlen(data_buf) %d\n", i, size, (int) strlen(data_buf)); + assert_equal(size, (int) strlen(data_buf), "i:%d tif_pixel_plot size %d != strlen(data_buf) %d\n", + i, size, (int) strlen(data_buf)); symbol->bitmap = (unsigned char *) data_buf; ret = tif_pixel_plot(symbol, (unsigned char *) data_buf); - assert_equal(ret, data[i].ret, "i:%d tif_pixel_plot ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); + assert_equal(ret, data[i].ret, "i:%d tif_pixel_plot ret %d != %d (%s)\n", + i, ret, data[i].ret, symbol->errtxt); if (ret < ZINT_ERROR) { if (have_tiffinfo) { @@ -225,7 +228,8 @@ static void test_print(const testCtx *const p_ctx) { if (p_ctx->generate) { char data_dir_path[1024]; - assert_nonzero(testUtilDataPath(data_dir_path, sizeof(data_dir_path), data_dir, NULL), "testUtilDataPath(%s) == 0\n", data_dir); + assert_nonzero(testUtilDataPath(data_dir_path, sizeof(data_dir_path), data_dir, NULL), + "testUtilDataPath(%s) == 0\n", data_dir); if (!testUtilDirExists(data_dir_path)) { ret = testUtilMkDir(data_dir_path); assert_zero(ret, "testUtilMkDir(%s) ret %d != 0 (%d: %s)\n", data_dir_path, ret, errno, strerror(errno)); @@ -240,7 +244,9 @@ static void test_print(const testCtx *const p_ctx) { symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, -1 /*eci*/, data[i].option_1, data[i].option_2, -1, data[i].output_options, data[i].data, -1, debug); + length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, -1 /*eci*/, + data[i].option_1, data[i].option_2, -1 /*option_3*/, data[i].output_options, + data[i].data, -1, debug); if (data[i].show_hrt != -1) { symbol->show_hrt = data[i].show_hrt; } @@ -274,38 +280,49 @@ static void test_print(const testCtx *const p_ctx) { text_length = (int) strlen(text); ret = ZBarcode_Encode(symbol, TCU(text), text_length); - assert_zero(ret, "i:%d %s ZBarcode_Encode ret %d != 0 %s\n", i, testUtilBarcodeName(data[i].symbology), ret, symbol->errtxt); + assert_zero(ret, "i:%d %s ZBarcode_Encode ret %d != 0 %s\n", + i, testUtilBarcodeName(data[i].symbology), ret, symbol->errtxt); strcpy(symbol->outfile, tif); ret = ZBarcode_Print(symbol, 0); - assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); + assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); - assert_nonzero(testUtilDataPath(expected_file, sizeof(expected_file), data_dir, data[i].expected_file), "i:%d testUtilDataPath == 0\n", i); + assert_nonzero(testUtilDataPath(expected_file, sizeof(expected_file), data_dir, data[i].expected_file), + "i:%d testUtilDataPath == 0\n", i); if (p_ctx->generate) { printf(" /*%3d*/ { %s, %s, %d, %s, %d, %d, %d, %d, %d, %d, %.5g, \"%s\",\"%s\", \"%s\", \"%s\", \"%s\", \"%s\" },\n", - i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), data[i].border_width, testUtilOutputOptionsName(data[i].output_options), - data[i].whitespace_width, data[i].whitespace_height, data[i].show_hrt, data[i].option_1, data[i].option_2, + i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), + data[i].border_width, testUtilOutputOptionsName(data[i].output_options), + data[i].whitespace_width, data[i].whitespace_height, data[i].show_hrt, + data[i].option_1, data[i].option_2, data[i].height, data[i].scale, data[i].fgcolour, data[i].bgcolour, - testUtilEscape(data[i].data, length, escaped, escaped_size), data[i].composite, data[i].expected_file, data[i].comment); + testUtilEscape(data[i].data, length, escaped, escaped_size), data[i].composite, + data[i].expected_file, data[i].comment); ret = testUtilRename(symbol->outfile, expected_file); assert_zero(ret, "i:%d testUtilRename(%s, %s) ret %d != 0\n", i, symbol->outfile, expected_file, ret); if (have_tiffinfo) { ret = testUtilVerifyTiffInfo(expected_file, debug); - assert_zero(ret, "i:%d %s tiffinfo %s ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), expected_file, ret); + assert_zero(ret, "i:%d %s tiffinfo %s ret %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), expected_file, ret); } else if (have_identify) { ret = testUtilVerifyIdentify(have_identify, expected_file, debug); - assert_zero(ret, "i:%d %s identify %s ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), expected_file, ret); + assert_zero(ret, "i:%d %s identify %s ret %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), expected_file, ret); } } else { assert_nonzero(testUtilExists(symbol->outfile), "i:%d testUtilExists(%s) == 0\n", i, symbol->outfile); assert_nonzero(testUtilExists(expected_file), "i:%d testUtilExists(%s) == 0\n", i, expected_file); ret = testUtilCmpBins(symbol->outfile, expected_file); - assert_zero(ret, "i:%d %s testUtilCmpBins(%s, %s) %d != 0\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, expected_file, ret); + assert_zero(ret, "i:%d %s testUtilCmpBins(%s, %s) %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, expected_file, ret); - ret = testUtilReadFile(symbol->outfile, filebuf, sizeof(filebuf), &filebuf_size); /* For BARCODE_MEMORY_FILE */ - assert_zero(ret, "i:%d %s testUtilReadFile(%s) %d != 0\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); + /* For BARCODE_MEMORY_FILE */ + ret = testUtilReadFile(symbol->outfile, filebuf, sizeof(filebuf), &filebuf_size); + assert_zero(ret, "i:%d %s testUtilReadFile(%s) %d != 0\n", + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); if (!(debug & ZINT_DEBUG_TEST_KEEP_OUTFILE)) { assert_zero(testUtilRemove(symbol->outfile), "i:%d testUtilRemove(%s) != 0\n", i, symbol->outfile); @@ -314,12 +331,13 @@ static void test_print(const testCtx *const p_ctx) { symbol->output_options |= BARCODE_MEMORY_FILE; ret = ZBarcode_Print(symbol, 0); assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0 (%s)\n", - i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret, symbol->errtxt); + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret, symbol->errtxt); assert_nonnull(symbol->memfile, "i:%d %s memfile NULL\n", i, testUtilBarcodeName(data[i].symbology)); assert_equal(symbol->memfile_size, filebuf_size, "i:%d %s memfile_size %d != %d\n", - i, testUtilBarcodeName(data[i].symbology), symbol->memfile_size, filebuf_size); - assert_zero(memcmp(symbol->memfile, filebuf, symbol->memfile_size), "i:%d %s memcmp(memfile, filebuf) != 0\n", - i, testUtilBarcodeName(data[i].symbology)); + i, testUtilBarcodeName(data[i].symbology), symbol->memfile_size, filebuf_size); + assert_zero(memcmp(symbol->memfile, filebuf, symbol->memfile_size), + "i:%d %s memcmp(memfile, filebuf) != 0\n", + i, testUtilBarcodeName(data[i].symbology)); } ZBarcode_Delete(symbol); @@ -347,15 +365,21 @@ static void test_outfile(const testCtx *const p_ctx) { skip_readonly_test = getuid() == 0; /* Skip if running as root on Unix as can't create read-only file */ #endif if (!skip_readonly_test) { - static char expected_errtxt[] = "672: Could not open TIF output file ("; /* Excluding OS-dependent `errno` stuff */ + /* Excluding OS-dependent `errno` stuff */ + static char expected_errtxt[] = "672: Could not open TIF output file ("; (void) testUtilRmROFile(symbol.outfile); /* In case lying around from previous fail */ - assert_nonzero(testUtilCreateROFile(symbol.outfile), "tif_pixel_plot testUtilCreateROFile(%s) fail (%d: %s)\n", symbol.outfile, errno, strerror(errno)); + assert_nonzero(testUtilCreateROFile(symbol.outfile), + "tif_pixel_plot testUtilCreateROFile(%s) fail (%d: %s)\n", + symbol.outfile, errno, strerror(errno)); ret = tif_pixel_plot(&symbol, data); - assert_equal(ret, ZINT_ERROR_FILE_ACCESS, "tif_pixel_plot ret %d != ZINT_ERROR_FILE_ACCESS (%d) (%s)\n", ret, ZINT_ERROR_FILE_ACCESS, symbol.errtxt); - assert_zero(testUtilRmROFile(symbol.outfile), "tif_pixel_plot testUtilRmROFile(%s) != 0 (%d: %s)\n", symbol.outfile, errno, strerror(errno)); - assert_zero(strncmp(symbol.errtxt, expected_errtxt, sizeof(expected_errtxt) - 1), "strncmp(%s, %s) != 0\n", symbol.errtxt, expected_errtxt); + assert_equal(ret, ZINT_ERROR_FILE_ACCESS, "tif_pixel_plot ret %d != ZINT_ERROR_FILE_ACCESS (%d) (%s)\n", + ret, ZINT_ERROR_FILE_ACCESS, symbol.errtxt); + assert_zero(testUtilRmROFile(symbol.outfile), "tif_pixel_plot testUtilRmROFile(%s) != 0 (%d: %s)\n", + symbol.outfile, errno, strerror(errno)); + assert_zero(strncmp(symbol.errtxt, expected_errtxt, sizeof(expected_errtxt) - 1), "strncmp(%s, %s) != 0\n", + symbol.errtxt, expected_errtxt); } symbol.output_options |= BARCODE_STDOUT; diff --git a/backend/tests/test_upcean.c b/backend/tests/test_upcean.c index bb04de47..c4920f35 100644 --- a/backend/tests/test_upcean.c +++ b/backend/tests/test_upcean.c @@ -115,7 +115,9 @@ static void test_upce_input(const testCtx *const p_ctx) { symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, -1 /*option_1*/, -1, -1, -1 /*output_options*/, data[i].data, -1, debug); + length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, + -1 /*option_1*/, -1 /*option_2*/, -1 /*option_3*/, -1 /*output_options*/, + data[i].data, -1, debug); ret = ZBarcode_Encode(symbol, TCU(data[i].data), length); assert_equal(ret, data[i].ret, "i:%d ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); @@ -123,9 +125,12 @@ static void test_upce_input(const testCtx *const p_ctx) { if (ret < ZINT_ERROR) { if (do_bwipp && testUtilCanBwipp(i, symbol, -1, -1, -1, debug)) { char modules_dump[8192 + 1]; - assert_notequal(testUtilModulesDump(symbol, modules_dump, sizeof(modules_dump)), -1, "i:%d testUtilModulesDump == -1\n", i); - ret = testUtilBwipp(i, symbol, -1, -1, -1, data[i].hrt, (int) strlen(data[i].hrt), NULL, cmp_buf, sizeof(cmp_buf), NULL); - assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); + assert_notequal(testUtilModulesDump(symbol, modules_dump, sizeof(modules_dump)), -1, + "i:%d testUtilModulesDump == -1\n", i); + ret = testUtilBwipp(i, symbol, -1, -1, -1, data[i].hrt, (int) strlen(data[i].hrt), NULL, cmp_buf, + sizeof(cmp_buf), NULL); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", + i, testUtilBarcodeName(symbol->symbology), ret); ret = testUtilBwippCmp(symbol, cmp_msg, cmp_buf, modules_dump); assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", @@ -134,9 +139,12 @@ static void test_upce_input(const testCtx *const p_ctx) { if (do_zxingcpp && testUtilCanZXingCPP(i, symbol, data[i].data, length, debug)) { int cmp_len, ret_len; char modules_dump[8192 + 1]; - assert_notequal(testUtilModulesDump(symbol, modules_dump, sizeof(modules_dump)), -1, "i:%d testUtilModulesDump == -1\n", i); - ret = testUtilZXingCPP(i, symbol, data[i].data, length, modules_dump, 1 /*zxingcpp_cmp*/, cmp_buf, sizeof(cmp_buf), &cmp_len); - assert_zero(ret, "i:%d %s testUtilZXingCPP ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); + assert_notequal(testUtilModulesDump(symbol, modules_dump, sizeof(modules_dump)), -1, + "i:%d testUtilModulesDump == -1\n", i); + ret = testUtilZXingCPP(i, symbol, data[i].data, length, modules_dump, 1 /*zxingcpp_cmp*/, cmp_buf, + sizeof(cmp_buf), &cmp_len); + assert_zero(ret, "i:%d %s testUtilZXingCPP ret %d != 0\n", + i, testUtilBarcodeName(symbol->symbology), ret); ret = testUtilZXingCPPCmp(symbol, cmp_msg, cmp_buf, cmp_len, data[i].hrt, (int) strlen(data[i].hrt), NULL /*primary*/, escaped, &ret_len); @@ -178,14 +186,17 @@ static void test_upca_print(const testCtx *const p_ctx) { symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, -1 /*option_1*/, -1, -1, -1 /*output_options*/, data[i].data, -1, debug); + length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, + -1 /*option_1*/, -1 /*option_2*/, -1 /*option_3*/, -1 /*output_options*/, + data[i].data, -1, debug); ret = ZBarcode_Encode(symbol, TCU(data[i].data), length); assert_equal(ret, data[i].ret, "i:%d ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); strcpy(symbol->outfile, "out.gif"); ret = ZBarcode_Print(symbol, 0); - assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0 (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret, symbol->errtxt); + assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0 (%s)\n", + i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret, symbol->errtxt); assert_zero(testUtilRemove(symbol->outfile), "i:%d testUtilRemove(%s) != 0\n", i, symbol->outfile); @@ -298,11 +309,14 @@ static void test_upca_input(const testCtx *const p_ctx) { symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, -1 /*option_1*/, -1, -1, -1 /*output_options*/, data[i].data, -1, debug); + length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, + -1 /*option_1*/, -1 /*option_2*/, -1 /*option_3*/, -1 /*output_options*/, + data[i].data, -1, debug); ret = ZBarcode_Encode(symbol, TCU(data[i].data), length); assert_equal(ret, data[i].ret, "i:%d ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); - assert_zero(strcmp(symbol->errtxt, data[i].expected_errtxt), "i:%d strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected_errtxt); + assert_zero(strcmp(symbol->errtxt, data[i].expected_errtxt), "i:%d strcmp(%s, %s) != 0\n", + i, symbol->errtxt, data[i].expected_errtxt); ZBarcode_Delete(symbol); } @@ -368,9 +382,9 @@ static void test_eanx_input(const testCtx *const p_ctx) { /* 43*/ { BARCODE_EANX, "12+123456", ZINT_ERROR_TOO_LONG, "Error 297: Input add-on length 6 too long (maximum 5)", "" }, /* 44*/ { BARCODE_EANX, "1+123456", ZINT_ERROR_TOO_LONG, "Error 297: Input add-on length 6 too long (maximum 5)", "" }, /* 45*/ { BARCODE_EANX, "1+12345678901234", ZINT_ERROR_TOO_LONG, "Error 297: Input add-on length 14 too long (maximum 5)", "" }, - /* 46*/ { BARCODE_EANX, "1+12345", 0, "", "" }, + /* 46*/ { BARCODE_EANX, "1+12345", ZINT_WARN_NONCOMPLIANT, "Warning 292: EAN-8 with add-on is non-standard", "" }, /* 47*/ { BARCODE_EANX, "1+", 0, "", "EAN-2" }, - /* 48*/ { BARCODE_EANX, "+1", 0, "", "EAN-8" }, + /* 48*/ { BARCODE_EANX, "+1", ZINT_WARN_NONCOMPLIANT, "Warning 292: EAN-8 with add-on is non-standard", "EAN-8" }, /* 49*/ { BARCODE_EANX, "+", 0, "", "EAN-2" }, /* 50*/ { BARCODE_EANX, "1", 0, "", "EAN-2" }, /* 51*/ { BARCODE_EANX, "12", 0, "", "EAN-2" }, @@ -426,26 +440,26 @@ static void test_eanx_input(const testCtx *const p_ctx) { /*101*/ { BARCODE_EANX_CHK, "1234567890+123456", ZINT_ERROR_TOO_LONG, "Error 297: Input add-on length 6 too long (maximum 5)", "" }, /*102*/ { BARCODE_EANX_CHK, "123456789+12345", ZINT_ERROR_INVALID_CHECK, "Error 275: Invalid check digit '9', expecting '4'", "" }, /*103*/ { BARCODE_EANX_CHK, "12345678+12345", ZINT_ERROR_INVALID_CHECK, "Error 276: Invalid check digit '8', expecting '0'", "EAN-8" }, - /*104*/ { BARCODE_EANX_CHK, "12345670+12345", 0, "", "" }, + /*104*/ { BARCODE_EANX_CHK, "12345670+12345", ZINT_WARN_NONCOMPLIANT, "Warning 292: EAN-8 with add-on is non-standard", "" }, /*105*/ { BARCODE_EANX_CHK, "1234567+12345", ZINT_ERROR_INVALID_CHECK, "Error 276: Invalid check digit '7', expecting '5'", "" }, - /*106*/ { BARCODE_EANX_CHK, "1234565+12345", 0, "", "" }, + /*106*/ { BARCODE_EANX_CHK, "1234565+12345", ZINT_WARN_NONCOMPLIANT, "Warning 292: EAN-8 with add-on is non-standard", "" }, /*107*/ { BARCODE_EANX_CHK, "123456+12345", ZINT_ERROR_INVALID_CHECK, "Error 276: Invalid check digit '6', expecting '7'", "" }, - /*108*/ { BARCODE_EANX_CHK, "123457+12345", 0, "", "" }, + /*108*/ { BARCODE_EANX_CHK, "123457+12345", ZINT_WARN_NONCOMPLIANT, "Warning 292: EAN-8 with add-on is non-standard", "" }, /*109*/ { BARCODE_EANX_CHK, "12345+12345", ZINT_ERROR_INVALID_CHECK, "Error 276: Invalid check digit '5', expecting '8'", "" }, - /*110*/ { BARCODE_EANX_CHK, "12348+12345", 0, "", "" }, + /*110*/ { BARCODE_EANX_CHK, "12348+12345", ZINT_WARN_NONCOMPLIANT, "Warning 292: EAN-8 with add-on is non-standard", "" }, /*111*/ { BARCODE_EANX_CHK, "1234+12345", ZINT_ERROR_INVALID_CHECK, "Error 276: Invalid check digit '4', expecting '6'", "" }, - /*112*/ { BARCODE_EANX_CHK, "1236+12345", 0, "", "" }, - /*113*/ { BARCODE_EANX_CHK, "123+12345", 0, "", "3 happens to be correct check digit" }, + /*112*/ { BARCODE_EANX_CHK, "1236+12345", ZINT_WARN_NONCOMPLIANT, "Warning 292: EAN-8 with add-on is non-standard", "" }, + /*113*/ { BARCODE_EANX_CHK, "123+12345", ZINT_WARN_NONCOMPLIANT, "Warning 292: EAN-8 with add-on is non-standard", "3 happens to be correct check digit" }, /*114*/ { BARCODE_EANX_CHK, "124+12345", ZINT_ERROR_INVALID_CHECK, "Error 276: Invalid check digit '4', expecting '3'", "" }, /*115*/ { BARCODE_EANX_CHK, "12+12345", ZINT_ERROR_INVALID_CHECK, "Error 276: Invalid check digit '2', expecting '7'", "" }, - /*116*/ { BARCODE_EANX_CHK, "17+12345", 0, "", "" }, + /*116*/ { BARCODE_EANX_CHK, "17+12345", ZINT_WARN_NONCOMPLIANT, "Warning 292: EAN-8 with add-on is non-standard", "" }, /*117*/ { BARCODE_EANX_CHK, "1+12345", ZINT_ERROR_INVALID_CHECK, "Error 276: Invalid check digit '1', expecting '0'", "" }, - /*118*/ { BARCODE_EANX_CHK, "0+12345", 0, "", "" }, + /*118*/ { BARCODE_EANX_CHK, "0+12345", ZINT_WARN_NONCOMPLIANT, "Warning 292: EAN-8 with add-on is non-standard", "" }, /*119*/ { BARCODE_EANX_CHK, "0+123456", ZINT_ERROR_TOO_LONG, "Error 297: Input add-on length 6 too long (maximum 5)", "" }, /*120*/ { BARCODE_EANX_CHK, "1+12345678901234", ZINT_ERROR_TOO_LONG, "Error 297: Input add-on length 14 too long (maximum 5)", "" }, /*121*/ { BARCODE_EANX_CHK, "0+12345678901234", ZINT_ERROR_TOO_LONG, "Error 297: Input add-on length 14 too long (maximum 5)", "" }, /*122*/ { BARCODE_EANX_CHK, "1+", 0, "", "EAN-2" }, - /*123*/ { BARCODE_EANX_CHK, "+1", 0, "", "EAN-8" }, + /*123*/ { BARCODE_EANX_CHK, "+1", ZINT_WARN_NONCOMPLIANT, "Warning 292: EAN-8 with add-on is non-standard", "EAN-8" }, /*124*/ { BARCODE_EANX_CHK, "+", 0, "", "EAN-2" }, /*125*/ { BARCODE_EANX_CHK, "12345678901234", ZINT_ERROR_TOO_LONG, "Error 294: Input length 14 too long (maximum 13)", "" }, /*126*/ { BARCODE_EANX_CHK, "1234567890123A", ZINT_ERROR_INVALID_DATA, "Error 284: Invalid character at position 14 in input (digits and \"+\" only)", "" }, @@ -470,18 +484,21 @@ static void test_eanx_input(const testCtx *const p_ctx) { symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, -1 /*option_1*/, -1, -1, -1 /*output_options*/, data[i].data, -1, debug); + length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, + -1 /*option_1*/, -1 /*option_2*/, -1 /*option_3*/, -1 /*output_options*/, + data[i].data, -1, debug); ret = ZBarcode_Encode(symbol, TCU(data[i].data), length); if (p_ctx->generate) { printf(" /*%3d*/ { %s, \"%s\", %s, \"%s\", \"%s\" },\n", - i, testUtilBarcodeName(data[i].symbology), data[i].data, testUtilErrorName(data[i].ret), + i, testUtilBarcodeName(data[i].symbology), data[i].data, testUtilErrorName(ret), testUtilEscape(symbol->errtxt, (int) strlen(symbol->errtxt), errtxt_escaped, sizeof(errtxt_escaped)), data[i].comment); } else { assert_equal(ret, data[i].ret, "i:%d ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); - assert_zero(strcmp(symbol->errtxt, data[i].ret_errtxt), "i:%d errtxt %s != %s\n", i, symbol->errtxt, data[i].ret_errtxt); + assert_zero(strcmp(symbol->errtxt, data[i].ret_errtxt), "i:%d errtxt %s != %s\n", + i, symbol->errtxt, data[i].ret_errtxt); } ZBarcode_Delete(symbol); @@ -623,7 +640,9 @@ static void test_isbn_input(const testCtx *const p_ctx) { symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - length = testUtilSetSymbol(symbol, BARCODE_ISBNX, -1 /*input_mode*/, -1 /*eci*/, -1 /*option_1*/, -1, -1, -1 /*output_options*/, data[i].data, -1, debug); + length = testUtilSetSymbol(symbol, BARCODE_ISBNX, -1 /*input_mode*/, -1 /*eci*/, + -1 /*option_1*/, -1 /*option_2*/, -1 /*option_3*/, -1 /*output_options*/, + data[i].data, -1, debug); ret = ZBarcode_Encode(symbol, TCU(data[i].data), length); @@ -633,12 +652,15 @@ static void test_isbn_input(const testCtx *const p_ctx) { testUtilEscape(symbol->errtxt, (int) strlen(symbol->errtxt), errtxt_escaped, sizeof(errtxt_escaped)), data[i].comment); } else { - assert_equal(ret, data[i].ret_encode, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret_encode, symbol->errtxt); - assert_zero(strcmp(symbol->errtxt, data[i].ret_errtxt), "i:%d errtxt %s != %s\n", i, symbol->errtxt, data[i].ret_errtxt); + assert_equal(ret, data[i].ret_encode, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", + i, ret, data[i].ret_encode, symbol->errtxt); + assert_zero(strcmp(symbol->errtxt, data[i].ret_errtxt), "i:%d errtxt %s != %s\n", + i, symbol->errtxt, data[i].ret_errtxt); if (data[i].ret_vector != -1) { ret = ZBarcode_Buffer_Vector(symbol, 0); - assert_equal(ret, data[i].ret_vector, "i:%d ZBarcode_Buffer_Vector ret %d != %d (%s)\n", i, ret, data[i].ret_vector, symbol->errtxt); + assert_equal(ret, data[i].ret_vector, "i:%d ZBarcode_Buffer_Vector ret %d != %d (%s)\n", + i, ret, data[i].ret_vector, symbol->errtxt); } } @@ -670,9 +692,9 @@ static void test_hrt(const testCtx *const p_ctx) { /* 6*/ { BARCODE_EANX_CHK, BARCODE_RAW_TEXT, "1234567890128", 0, "1234567890128", "1234567890128" }, /* 7*/ { BARCODE_EANX_CHK, -1, "123456789012", 0, "0123456789012", "0123456789012" }, /* '2' happens to be correct check digit for "012345678901" */ /* 8*/ { BARCODE_EANX, -1, "1234567890128+1", 0, "1234567890128+01", "" }, - /* 9*/ { BARCODE_EANX, BARCODE_RAW_TEXT, "1234567890128+1", 0, "1234567890128+01", "1234567890128+01" }, + /* 9*/ { BARCODE_EANX, BARCODE_RAW_TEXT, "1234567890128+1", 0, "1234567890128+01", "123456789012801" }, /* 10*/ { BARCODE_EANX_CHK, -1, "1234567890128+1", 0, "1234567890128+01", "" }, - /* 11*/ { BARCODE_EANX_CHK, BARCODE_RAW_TEXT, "1234567890128+1", 0, "1234567890128+01", "1234567890128+01" }, + /* 11*/ { BARCODE_EANX_CHK, BARCODE_RAW_TEXT, "1234567890128+1", 0, "1234567890128+01", "123456789012801" }, /* 12*/ { BARCODE_EANX, -1, "12345678", 0, "0000123456784", "" }, /* 13*/ { BARCODE_EANX, BARCODE_RAW_TEXT, "12345678", 0, "0000123456784", "0000123456784" }, /* 14*/ { BARCODE_EANX, -1, "1234567", 0, "12345670", "" }, /* EAN-8 */ @@ -700,73 +722,73 @@ static void test_hrt(const testCtx *const p_ctx) { /* 36*/ { BARCODE_ISBNX, -1, "9781234567897", 0, "9781234567897", "" }, /* 37*/ { BARCODE_ISBNX, BARCODE_RAW_TEXT, "9781234567897", 0, "9781234567897", "9781234567897" }, /* 38*/ { BARCODE_ISBNX, -1, "9791234567896+12", 0, "9791234567896+12", "" }, - /* 39*/ { BARCODE_ISBNX, BARCODE_RAW_TEXT, "9791234567896+12", 0, "9791234567896+12", "9791234567896+12" }, + /* 39*/ { BARCODE_ISBNX, BARCODE_RAW_TEXT, "9791234567896+12", 0, "9791234567896+12", "979123456789612" }, /* 40*/ { BARCODE_UPCA, -1, "12345678901", 0, "123456789012", "" }, - /* 41*/ { BARCODE_UPCA, BARCODE_RAW_TEXT, "12345678901", 0, "123456789012", "123456789012" }, + /* 41*/ { BARCODE_UPCA, BARCODE_RAW_TEXT, "12345678901", 0, "123456789012", "0123456789012" }, /* 42*/ { BARCODE_UPCA, -1, "123456789012", 0, "123456789012", "" }, - /* 43*/ { BARCODE_UPCA, BARCODE_RAW_TEXT, "123456789012", 0, "123456789012", "123456789012" }, + /* 43*/ { BARCODE_UPCA, BARCODE_RAW_TEXT, "123456789012", 0, "123456789012", "0123456789012" }, /* 44*/ { BARCODE_UPCA_CHK, -1, "123456789012", 0, "123456789012", "" }, - /* 45*/ { BARCODE_UPCA_CHK, BARCODE_RAW_TEXT, "123456789012", 0, "123456789012", "123456789012" }, + /* 45*/ { BARCODE_UPCA_CHK, BARCODE_RAW_TEXT, "123456789012", 0, "123456789012", "0123456789012" }, /* 46*/ { BARCODE_UPCA, -1, "12345678905+1", 0, "123456789050+01", "" }, - /* 47*/ { BARCODE_UPCA, BARCODE_RAW_TEXT, "12345678905+1", 0, "123456789050+01", "123456789050+01" }, + /* 47*/ { BARCODE_UPCA, BARCODE_RAW_TEXT, "12345678905+1", 0, "123456789050+01", "012345678905001" }, /* 48*/ { BARCODE_UPCA_CHK, -1, "123456789050+1", 0, "123456789050+01", "" }, - /* 49*/ { BARCODE_UPCA_CHK, BARCODE_RAW_TEXT, "123456789050+1", 0, "123456789050+01", "123456789050+01" }, + /* 49*/ { BARCODE_UPCA_CHK, BARCODE_RAW_TEXT, "123456789050+1", 0, "123456789050+01", "012345678905001" }, /* 50*/ { BARCODE_UPCA, -1, "123456789050+123", 0, "123456789050+00123", "" }, - /* 51*/ { BARCODE_UPCA, BARCODE_RAW_TEXT, "123456789050+123", 0, "123456789050+00123", "123456789050+00123" }, + /* 51*/ { BARCODE_UPCA, BARCODE_RAW_TEXT, "123456789050+123", 0, "123456789050+00123", "012345678905000123" }, /* 52*/ { BARCODE_UPCA_CHK, -1, "123456789050+123", 0, "123456789050+00123", "" }, - /* 53*/ { BARCODE_UPCA_CHK, BARCODE_RAW_TEXT, "123456789050+123", 0, "123456789050+00123", "123456789050+00123" }, + /* 53*/ { BARCODE_UPCA_CHK, BARCODE_RAW_TEXT, "123456789050+123", 0, "123456789050+00123", "012345678905000123" }, /* 54*/ { BARCODE_UPCE, -1, "12345", 0, "00123457", "" }, /* equivalent: 00123400005, hrt: 00123457, Check digit: 7 */ - /* 55*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "12345", 0, "00123457", "00123457" }, + /* 55*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "12345", 0, "00123457", "0001234000057" }, /* 56*/ { BARCODE_UPCE_CHK, -1, "12344", 0, "00012344", "" }, /* equivalent: 00012000003, hrt: 00012344, Check digit: 4 */ - /* 57*/ { BARCODE_UPCE_CHK, BARCODE_RAW_TEXT, "12344", 0, "00012344", "00012344" }, + /* 57*/ { BARCODE_UPCE_CHK, BARCODE_RAW_TEXT, "12344", 0, "00012344", "0000120000034" }, /* 58*/ { BARCODE_UPCE, -1, "123456", 0, "01234565", "" }, /* equivalent: 01234500006, hrt: 01234565, Check digit: 5 */ - /* 59*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "123456", 0, "01234565", "01234565" }, + /* 59*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "123456", 0, "01234565", "0012345000065" }, /* 60*/ { BARCODE_UPCE_CHK, -1, "123457", 0, "00123457", "" }, /* equivalent: 00123400005, hrt: 00123457, Check digit: 7 */ - /* 61*/ { BARCODE_UPCE_CHK, BARCODE_RAW_TEXT, "123457", 0, "00123457", "00123457" }, + /* 61*/ { BARCODE_UPCE_CHK, BARCODE_RAW_TEXT, "123457", 0, "00123457", "0001234000057" }, /* 62*/ { BARCODE_UPCE, -1, "1234567", 0, "12345670", "" }, /* equivalent: 12345600007, hrt: 12345670, Check digit: 0 */ - /* 63*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "1234567", 0, "12345670", "12345670" }, + /* 63*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "1234567", 0, "12345670", "0123456000070" }, /* 64*/ { BARCODE_UPCE_CHK, -1, "1234565", 0, "01234565", "" }, /* equivalent: 01234500006, hrt: 01234565, Check digit: 5 */ - /* 65*/ { BARCODE_UPCE_CHK, BARCODE_RAW_TEXT, "1234565", 0, "01234565", "01234565" }, + /* 65*/ { BARCODE_UPCE_CHK, BARCODE_RAW_TEXT, "1234565", 0, "01234565", "0012345000065" }, /* 66*/ { BARCODE_UPCE_CHK, -1, "12345670", 0, "12345670", "" }, /* equivalent: 12345600007, hrt: 12345670, Check digit: 0 */ - /* 67*/ { BARCODE_UPCE_CHK, BARCODE_RAW_TEXT, "12345670", 0, "12345670", "12345670" }, + /* 67*/ { BARCODE_UPCE_CHK, BARCODE_RAW_TEXT, "12345670", 0, "12345670", "0123456000070" }, /* 68*/ { BARCODE_UPCE, -1, "2345678", 0, "03456781", "" }, /* 2 ignored, equivalent: 03456700008, hrt: 03456781, Check digit: 1 */ - /* 69*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "2345678", 0, "03456781", "03456781" }, + /* 69*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "2345678", 0, "03456781", "0034567000081" }, /* 70*/ { BARCODE_UPCE_CHK, -1, "23456781", 0, "03456781", "" }, /* 2 ignored, equivalent: 03456700008, hrt: 03456781, Check digit: 1 */ /* 71*/ { BARCODE_UPCE, -1, "123455", 0, "01234558", "" }, /* equivalent: 01234500005, hrt: 01234558, Check digit: 8 (BS 797 Rule 3 (a)) */ - /* 72*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "123455", 0, "01234558", "01234558" }, + /* 72*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "123455", 0, "01234558", "0012345000058" }, /* 73*/ { BARCODE_UPCE_CHK, -1, "1234558", 0, "01234558", "" }, /* equivalent: 01234500005, hrt: 01234558, Check digit: 8 (BS 797 Rule 3 (a)) */ /* 74*/ { BARCODE_UPCE, -1, "456784", 0, "04567840", "" }, /* equivalent: 04567000008, hrt: 04567840, Check digit: 0 (BS 797 Rule 3 (b)) */ - /* 75*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "456784", 0, "04567840", "04567840" }, + /* 75*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "456784", 0, "04567840", "0045670000080" }, /* 76*/ { BARCODE_UPCE_CHK, -1, "4567840", 0, "04567840", "" }, /* equivalent: 04567000008, hrt: 04567840, Check digit: 0 (BS 797 Rule 3 (b)) */ /* 77*/ { BARCODE_UPCE, -1, "345670", 0, "03456703", "" }, /* equivalent: 03400000567, hrt: 03456703, Check digit: 3 (BS 797 Rule 3 (c)) */ - /* 78*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "345670", 0, "03456703", "03456703" }, + /* 78*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "345670", 0, "03456703", "0034000005673" }, /* 79*/ { BARCODE_UPCE_CHK, -1, "3456703", 0, "03456703", "" }, /* equivalent: 03400000567, hrt: 03456703, Check digit: 3 (BS 797 Rule 3 (c)) */ /* 80*/ { BARCODE_UPCE, -1, "984753", 0, "09847531", "" }, /* equivalent: 09840000075, hrt: 09847531, Check digit: 1 (BS 797 Rule 3 (d)) */ - /* 81*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "984753", 0, "09847531", "09847531" }, + /* 81*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "984753", 0, "09847531", "0098400000751" }, /* 82*/ { BARCODE_UPCE_CHK, -1, "9847531", 0, "09847531", "" }, /* equivalent: 09840000075, hrt: 09847531, Check digit: 1 (BS 797 Rule 3 (d)) */ /* 83*/ { BARCODE_UPCE, -1, "123453", 0, "01234531", "" }, - /* 84*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "123453", 0, "01234531", "01234531" }, + /* 84*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "123453", 0, "01234531", "0012300000451" }, /* 85*/ { BARCODE_UPCE, -1, "000000", 0, "00000000", "" }, - /* 86*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "000000", 0, "00000000", "00000000" }, + /* 86*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "000000", 0, "00000000", "0000000000000" }, /* 87*/ { BARCODE_UPCE, -1, "0000000", 0, "00000000", "" }, /* 88*/ { BARCODE_UPCE, -1, "1000000", 0, "10000007", "" }, - /* 89*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "1000000", 0, "10000007", "10000007" }, + /* 89*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "1000000", 0, "10000007", "0100000000007" }, /* 90*/ { BARCODE_UPCE, -1, "2000000", 0, "00000000", "" }, /* First char 2-9 ignored, replaced with 0 */ - /* 91*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "2000000", 0, "00000000", "00000000" }, + /* 91*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "2000000", 0, "00000000", "0000000000000" }, /* 92*/ { BARCODE_UPCE, -1, "3000000", 0, "00000000", "" }, - /* 93*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "3000000", 0, "00000000", "00000000" }, + /* 93*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "3000000", 0, "00000000", "0000000000000" }, /* 94*/ { BARCODE_UPCE, -1, "8000000", 0, "00000000", "" }, - /* 95*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "8000000", 0, "00000000", "00000000" }, + /* 95*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "8000000", 0, "00000000", "0000000000000" }, /* 96*/ { BARCODE_UPCE, -1, "9000000", 0, "00000000", "" }, - /* 97*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "9000000", 0, "00000000", "00000000" }, + /* 97*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "9000000", 0, "00000000", "0000000000000" }, /* 98*/ { BARCODE_UPCE, -1, "1234567+1", 0, "12345670+01", "" }, - /* 99*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "1234567+1", 0, "12345670+01", "12345670+01" }, + /* 99*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "1234567+1", 0, "12345670+01", "012345600007001" }, /*100*/ { BARCODE_UPCE, -1, "12345670+1", 0, "12345670+01", "" }, - /*101*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "12345670+1", 0, "12345670+01", "12345670+01" }, + /*101*/ { BARCODE_UPCE, BARCODE_RAW_TEXT, "12345670+1", 0, "12345670+01", "012345600007001" }, /*102*/ { BARCODE_UPCE_CHK, -1, "12345670+1", 0, "12345670+01", "" }, - /*103*/ { BARCODE_UPCE_CHK, BARCODE_RAW_TEXT, "12345670+1", 0, "12345670+01", "12345670+01" }, + /*103*/ { BARCODE_UPCE_CHK, BARCODE_RAW_TEXT, "12345670+1", 0, "12345670+01", "012345600007001" }, /*104*/ { BARCODE_UPCE_CHK, -1, "1234565+1", 0, "01234565+01", "" }, - /*105*/ { BARCODE_UPCE_CHK, BARCODE_RAW_TEXT, "1234565+1", 0, "01234565+01", "01234565+01" }, + /*105*/ { BARCODE_UPCE_CHK, BARCODE_RAW_TEXT, "1234565+1", 0, "01234565+01", "001234500006501" }, }; const int data_size = ARRAY_SIZE(data); int i, length, ret; @@ -783,8 +805,8 @@ static void test_hrt(const testCtx *const p_ctx) { assert_nonnull(symbol, "Symbol not created\n"); length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, - -1 /*option_1*/, -1 /*option_2*/, -1 /*option_3*/, data[i].output_options, - data[i].data, -1, debug); + -1 /*option_1*/, -1 /*option_2*/, -1 /*option_3*/, data[i].output_options, + data[i].data, -1, debug); expected_length = (int) strlen(data[i].expected); expected_raw_length = (int) strlen(data[i].expected_raw); @@ -802,8 +824,9 @@ static void test_hrt(const testCtx *const p_ctx) { "i:%d raw_segs[0].length %d != expected_raw_length %d\n", i, symbol->raw_segs[0].length, expected_raw_length); assert_zero(memcmp(symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length), - "i:%d memcmp(%s, %s, %d) != 0\n", - i, symbol->raw_segs[0].source, data[i].expected_raw, expected_raw_length); + "i:%d memcmp(%.*s, %s, %d) != 0\n", + i, symbol->raw_segs[0].length, symbol->raw_segs[0].source, data[i].expected_raw, + expected_raw_length); } else { assert_null(symbol->raw_segs, "i:%d raw_segs not NULL\n", i); } @@ -845,13 +868,17 @@ static void test_vector_same(const testCtx *const p_ctx) { symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, -1 /*option_1*/, -1, -1, -1 /*output_options*/, data[i].data, -1, debug); + length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, + -1 /*option_1*/, -1 /*option_2*/, -1 /*option_3*/, -1 /*output_options*/, + data[i].data, -1, debug); ret = ZBarcode_Encode(symbol, TCU(data[i].data), length); - assert_equal(ret, data[i].ret_encode, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret_encode, symbol->errtxt); + assert_equal(ret, data[i].ret_encode, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", + i, ret, data[i].ret_encode, symbol->errtxt); ret = ZBarcode_Buffer_Vector(symbol, 0); - assert_equal(ret, data[i].ret_vector, "i:%d ZBarcode_Buffer_Vector ret %d != %d (%s)\n", i, ret, data[i].ret_vector, symbol->errtxt); + assert_equal(ret, data[i].ret_vector, "i:%d ZBarcode_Buffer_Vector ret %d != %d (%s)\n", + i, ret, data[i].ret_vector, symbol->errtxt); assert_nonnull(symbol->vector, "i:%d symbol->vector NULL\n", i); vectors[j] = testUtilVectorCpy(symbol->vector); @@ -954,10 +981,10 @@ static void test_encode(const testCtx *const p_ctx) { /* 20*/ { BARCODE_UPCE_CHK, -1, "12345670+12345", 0, 1, 105, "Example of UPC-E with 5-digit add-on", "101001001101111010100011011100100001010010001010101000000010110110011010010011010100001010100011010110001" }, - /* 21*/ { BARCODE_EANX, -1, "1234567+12", 0, 1, 94, "Example of EAN-8 with 2-digit add-on", + /* 21*/ { BARCODE_EANX, -1, "1234567+12", ZINT_WARN_NONCOMPLIANT, 1, 94, "Example of EAN-8 with 2-digit add-on", "1010011001001001101111010100011010101001110101000010001001110010101000000010110011001010010011" }, - /* 22*/ { BARCODE_EANX_CHK, -1, "12345670+12345", 0, 1, 121, "Example of EAN-8 with 5-digit add-on", + /* 22*/ { BARCODE_EANX_CHK, -1, "12345670+12345", ZINT_WARN_NONCOMPLIANT, 1, 121, "Example of EAN-8 with 5-digit add-on", "1010011001001001101111010100011010101001110101000010001001110010101000000010110110011010010011010100001010100011010110001" }, /* 23*/ { BARCODE_EANX, -1, "54321", 0, 1, 47, "Example of EAN-5", @@ -966,10 +993,10 @@ static void test_encode(const testCtx *const p_ctx) { /* 24*/ { BARCODE_EANX, -1, "21", 0, 1, 20, "Example of EAN-2", "10110010011010110011" }, - /* 25*/ { BARCODE_EANX_CHK, 9, "76543210+21", 0, 1, 96, "Example of EAN-8 barcode with two-digit add-on, addon_gap 9", + /* 25*/ { BARCODE_EANX_CHK, 9, "76543210+21", ZINT_WARN_NONCOMPLIANT, 1, 96, "Example of EAN-8 barcode with two-digit add-on, addon_gap 9", "101011101101011110110001010001101010100001011011001100110111001010100000000010110010011010110011" }, - /* 26*/ { BARCODE_EANX, 12, "7654321+54321", 0, 1, 126, "Example of EAN-8 barcode with five-digit add-on, addon_gap 12", + /* 26*/ { BARCODE_EANX, 12, "7654321+54321", ZINT_WARN_NONCOMPLIANT, 1, 126, "Example of EAN-8 barcode with five-digit add-on, addon_gap 12", "101011101101011110110001010001101010100001011011001100110111001010100000000000010110111001010100011010100001010010011010011001" }, /* 27*/ { BARCODE_UPCA_CHK, 10, "210987654329+21", 0, 1, 125, "Example of UPC-A with 2-digit add-on, addon_gap 10", @@ -1021,40 +1048,53 @@ static void test_encode(const testCtx *const p_ctx) { symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, -1 /*option_1*/, data[i].option_2, -1, -1 /*output_options*/, data[i].data, -1, debug); + length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, + -1 /*option_1*/, data[i].option_2, -1 /*option_3*/, -1 /*output_options*/, + data[i].data, -1, debug); ret = ZBarcode_Encode(symbol, TCU(data[i].data), length); - assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); + assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", + i, ret, data[i].ret, symbol->errtxt); if (p_ctx->generate) { printf(" /*%3d*/ { %s, %d, \"%s\", %s, %d, %d, \"%s\",\n", - i, testUtilBarcodeName(data[i].symbology), data[i].option_2, data[i].data, testUtilErrorName(data[i].ret), symbol->rows, symbol->width, data[i].comment); + i, testUtilBarcodeName(data[i].symbology), data[i].option_2, data[i].data, + testUtilErrorName(data[i].ret), symbol->rows, symbol->width, data[i].comment); testUtilModulesPrint(symbol, " ", "\n"); printf(" },\n"); } else { if (ret < ZINT_ERROR) { int width, row; - assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data); - assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data); + assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", + i, symbol->rows, data[i].expected_rows, data[i].data); + assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", + i, symbol->width, data[i].expected_width, data[i].data); ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); - assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); + assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", + i, ret, width, row, data[i].data); if (do_bwipp && testUtilCanBwipp(i, symbol, -1, data[i].option_2, -1, debug)) { - ret = testUtilBwipp(i, symbol, -1, data[i].option_2, -1, data[i].data, length, NULL, cmp_buf, sizeof(cmp_buf), NULL); - assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); + ret = testUtilBwipp(i, symbol, -1, data[i].option_2, -1, data[i].data, length, NULL, cmp_buf, + sizeof(cmp_buf), NULL); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", + i, testUtilBarcodeName(symbol->symbology), ret); ret = testUtilBwippCmp(symbol, cmp_msg, cmp_buf, data[i].expected); assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", - i, testUtilBarcodeName(symbol->symbology), ret, cmp_msg, cmp_buf, data[i].expected); + i, testUtilBarcodeName(symbol->symbology), ret, cmp_msg, cmp_buf, + data[i].expected); } if (do_zxingcpp && testUtilCanZXingCPP(i, symbol, data[i].data, length, debug)) { int cmp_len, ret_len; char modules_dump[8192 + 1]; - assert_notequal(testUtilModulesDump(symbol, modules_dump, sizeof(modules_dump)), -1, "i:%d testUtilModulesDump == -1\n", i); - ret = testUtilZXingCPP(i, symbol, data[i].data, length, modules_dump, 1 /*zxingcpp_cmp*/, cmp_buf, sizeof(cmp_buf), &cmp_len); - assert_zero(ret, "i:%d %s testUtilZXingCPP ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); + assert_notequal(testUtilModulesDump(symbol, modules_dump, sizeof(modules_dump)), -1, + "i:%d testUtilModulesDump == -1\n", i); + ret = testUtilZXingCPP(i, symbol, data[i].data, length, modules_dump, 1 /*zxingcpp_cmp*/, cmp_buf, + sizeof(cmp_buf), &cmp_len); + assert_zero(ret, "i:%d %s testUtilZXingCPP ret %d != 0\n", + i, testUtilBarcodeName(symbol->symbology), ret); ret = testUtilZXingCPPCmp(symbol, cmp_msg, cmp_buf, cmp_len, data[i].data, length, NULL /*primary*/, escaped, &ret_len); @@ -1091,7 +1131,7 @@ static void test_fuzz(const testCtx *const p_ctx) { /* 5*/ { BARCODE_UPCE, "+123456789012345678", -1, ZINT_ERROR_TOO_LONG }, /* 6*/ { BARCODE_UPCE_CHK, "+123456789012345678", -1, ZINT_ERROR_TOO_LONG }, /* 7*/ { BARCODE_ISBNX, "+123456789012345678", -1, ZINT_ERROR_TOO_LONG }, - /* 8*/ { BARCODE_EANX, "+12345", -1, 0 }, + /* 8*/ { BARCODE_EANX, "+12345", -1, ZINT_WARN_NONCOMPLIANT }, /* 9*/ { BARCODE_EANX, "+123456", -1, ZINT_ERROR_TOO_LONG }, /*10*/ { BARCODE_EANX, "000002000000200+203", -1, ZINT_ERROR_TOO_LONG }, /* #218 Jan Schrewe CI-Fuzz */ }; @@ -1108,7 +1148,9 @@ static void test_fuzz(const testCtx *const p_ctx) { symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, -1 /*option_1*/, -1, -1, -1 /*output_options*/, data[i].data, data[i].length, debug); + length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, + -1 /*option_1*/, -1 /*option_2*/, -1 /*option_3*/, -1 /*output_options*/, + data[i].data, data[i].length, debug); ret = ZBarcode_Encode(symbol, TCU(data[i].data), length); assert_equal(ret, data[i].ret, "i:%d ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); diff --git a/backend/tests/test_vector.c b/backend/tests/test_vector.c index af3d700a..aadcb45a 100644 --- a/backend/tests/test_vector.c +++ b/backend/tests/test_vector.c @@ -543,7 +543,7 @@ static void test_buffer_vector(const testCtx *const p_ctx) { int symbology; const char *data; const char *composite; - + int ret; float expected_height; int expected_rows; int expected_width; @@ -551,144 +551,145 @@ static void test_buffer_vector(const testCtx *const p_ctx) { float expected_vector_height; }; struct item data[] = { - /* 0*/ { BARCODE_CODE11, "1234567890", "", 50, 1, 108, 216, 116.28 }, - /* 1*/ { BARCODE_C25STANDARD, "1234567890", "", 50, 1, 117, 234, 116.28 }, - /* 2*/ { BARCODE_C25INTER, "1234567890", "", 50, 1, 99, 198, 116.28 }, - /* 3*/ { BARCODE_C25IATA, "1234567890", "", 50, 1, 149, 298, 116.28 }, - /* 4*/ { BARCODE_C25LOGIC, "1234567890", "", 50, 1, 109, 218, 116.28 }, - /* 5*/ { BARCODE_C25IND, "1234567890", "", 50, 1, 159, 318, 116.28 }, - /* 6*/ { BARCODE_CODE39, "1234567890", "", 50, 1, 155, 310, 116.28 }, - /* 7*/ { BARCODE_EXCODE39, "1234567890", "", 50, 1, 155, 310, 116.28 }, - /* 8*/ { BARCODE_EANX, "123456789012", "", 50, 1, 95, 226, 118 }, - /* 9*/ { BARCODE_EANX_CHK, "1234567890128", "", 50, 1, 95, 226, 118 }, - /* 10*/ { BARCODE_EANX, "123456789012+12", "", 50, 1, 122, 276, 118 }, - /* 11*/ { BARCODE_EANX_CHK, "1234567890128+12", "", 50, 1, 122, 276, 118 }, - /* 12*/ { BARCODE_EANX, "123456789012+12345", "", 50, 1, 149, 330, 118 }, - /* 13*/ { BARCODE_EANX_CHK, "1234567890128+12345", "", 50, 1, 149, 330, 118 }, - /* 14*/ { BARCODE_EANX, "1234567", "", 50, 1, 67, 162, 118 }, - /* 15*/ { BARCODE_EANX_CHK, "12345670", "", 50, 1, 67, 162, 118 }, - /* 16*/ { BARCODE_EANX, "1234567+12", "", 50, 1, 94, 212, 118 }, - /* 17*/ { BARCODE_EANX_CHK, "12345670+12", "", 50, 1, 94, 212, 118 }, - /* 18*/ { BARCODE_EANX, "1234567+12345", "", 50, 1, 121, 266, 118 }, - /* 19*/ { BARCODE_EANX_CHK, "12345670+12345", "", 50, 1, 121, 266, 118 }, - /* 20*/ { BARCODE_EANX, "1234", "", 50, 1, 47, 104, 118 }, - /* 21*/ { BARCODE_EANX_CHK, "1234", "", 50, 1, 47, 104, 118 }, - /* 22*/ { BARCODE_EANX, "12", "", 50, 1, 20, 50, 118 }, - /* 23*/ { BARCODE_EANX_CHK, "12", "", 50, 1, 20, 50, 118 }, - /* 24*/ { BARCODE_GS1_128, "[01]12345678901231", "", 50, 1, 134, 268, 116.28 }, - /* 25*/ { BARCODE_CODABAR, "A00000000B", "", 50, 1, 102, 204, 116.28 }, - /* 26*/ { BARCODE_CODE128, "1234567890", "", 50, 1, 90, 180, 116.28 }, - /* 27*/ { BARCODE_DPLEIT, "1234567890123", "", 72, 1, 135, 270, 160.28 }, - /* 28*/ { BARCODE_DPIDENT, "12345678901", "", 72, 1, 117, 234, 160.28 }, - /* 29*/ { BARCODE_CODE16K, "1234567890", "", 20, 2, 70, 162, 44 }, - /* 30*/ { BARCODE_CODE49, "1234567890", "", 20, 2, 70, 162, 44 }, - /* 31*/ { BARCODE_CODE93, "1234567890", "", 50, 1, 127, 254, 116.28 }, - /* 32*/ { BARCODE_FLAT, "1234567890", "", 50, 1, 90, 180, 100 }, - /* 33*/ { BARCODE_DBAR_OMN, "1234567890123", "", 50, 1, 96, 192, 116.28 }, - /* 34*/ { BARCODE_DBAR_LTD, "1234567890123", "", 50, 1, 79, 158, 116.28 }, - /* 35*/ { BARCODE_DBAR_EXP, "[01]12345678901231", "", 34, 1, 134, 268, 84.279999 }, - /* 36*/ { BARCODE_TELEPEN, "1234567890", "", 50, 1, 208, 416, 116.28 }, - /* 37*/ { BARCODE_UPCA, "12345678901", "", 50, 1, 95, 226, 118 }, - /* 38*/ { BARCODE_UPCA_CHK, "123456789012", "", 50, 1, 95, 226, 118 }, - /* 39*/ { BARCODE_UPCA, "12345678901+12", "", 50, 1, 124, 276, 118 }, - /* 40*/ { BARCODE_UPCA_CHK, "123456789012+12", "", 50, 1, 124, 276, 118 }, - /* 41*/ { BARCODE_UPCA, "12345678901+12345", "", 50, 1, 151, 330, 118 }, - /* 42*/ { BARCODE_UPCA_CHK, "123456789012+12345", "", 50, 1, 151, 330, 118 }, - /* 43*/ { BARCODE_UPCE, "1234567", "", 50, 1, 51, 134, 118 }, - /* 44*/ { BARCODE_UPCE_CHK, "12345670", "", 50, 1, 51, 134, 118 }, - /* 45*/ { BARCODE_UPCE, "1234567+12", "", 50, 1, 78, 184, 118 }, - /* 46*/ { BARCODE_UPCE_CHK, "12345670+12", "", 50, 1, 78, 184, 118 }, - /* 47*/ { BARCODE_UPCE, "1234567+12345", "", 50, 1, 105, 238, 118 }, - /* 48*/ { BARCODE_UPCE_CHK, "12345670+12345", "", 50, 1, 105, 238, 118 }, - /* 49*/ { BARCODE_POSTNET, "12345678901", "", 12, 2, 123, 246, 24 }, - /* 50*/ { BARCODE_MSI_PLESSEY, "1234567890", "", 50, 1, 127, 254, 116.28 }, - /* 51*/ { BARCODE_FIM, "A", "", 50, 1, 17, 34, 100 }, - /* 52*/ { BARCODE_LOGMARS, "1234567890", "", 50, 1, 191, 382, 116.28 }, - /* 53*/ { BARCODE_PHARMA, "123456", "", 50, 1, 58, 116, 100 }, - /* 54*/ { BARCODE_PZN, "123456", "", 50, 1, 142, 284, 116.28 }, - /* 55*/ { BARCODE_PHARMA_TWO, "12345678", "", 10, 2, 29, 58, 20 }, - /* 56*/ { BARCODE_CEPNET, "12345678", "", 5.375, 2, 93, 186, 10.75 }, - /* 57*/ { BARCODE_PDF417, "1234567890", "", 21, 7, 103, 206, 42 }, - /* 58*/ { BARCODE_PDF417COMP, "1234567890", "", 21, 7, 69, 138, 42 }, - /* 59*/ { BARCODE_MAXICODE, "1234567890", "", 165, 33, 30, 60, 57.7333984 }, - /* 60*/ { BARCODE_QRCODE, "1234567890AB", "", 21, 21, 21, 42, 42 }, - /* 61*/ { BARCODE_CODE128AB, "1234567890", "", 50, 1, 145, 290, 116.28 }, - /* 62*/ { BARCODE_AUSPOST, "12345678901234567890123", "", 8, 3, 133, 266, 16 }, - /* 63*/ { BARCODE_AUSREPLY, "12345678", "", 8, 3, 73, 146, 16 }, - /* 64*/ { BARCODE_AUSROUTE, "12345678", "", 8, 3, 73, 146, 16 }, - /* 65*/ { BARCODE_AUSREDIRECT, "12345678", "", 8, 3, 73, 146, 16 }, - /* 66*/ { BARCODE_ISBNX, "123456789", "", 50, 1, 95, 226, 118 }, - /* 67*/ { BARCODE_ISBNX, "123456789+12", "", 50, 1, 122, 276, 118 }, - /* 68*/ { BARCODE_ISBNX, "123456789+12345", "", 50, 1, 149, 330, 118 }, - /* 69*/ { BARCODE_RM4SCC, "1234567890", "", 8, 3, 91, 182, 16 }, - /* 70*/ { BARCODE_DATAMATRIX, "ABC", "", 10, 10, 10, 20, 20 }, - /* 71*/ { BARCODE_EAN14, "1234567890123", "", 50, 1, 134, 268, 116.28 }, - /* 72*/ { BARCODE_VIN, "12345678701234567", "", 50, 1, 246, 492, 116.28 }, - /* 73*/ { BARCODE_CODABLOCKF, "1234567890", "", 20, 2, 101, 242, 44 }, - /* 74*/ { BARCODE_NVE18, "12345678901234567", "", 50, 1, 156, 312, 116.28 }, - /* 75*/ { BARCODE_JAPANPOST, "1234567890", "", 8, 3, 133, 266, 16 }, - /* 76*/ { BARCODE_KOREAPOST, "123456", "", 50, 1, 167, 334, 116.28 }, - /* 77*/ { BARCODE_DBAR_STK, "1234567890123", "", 13, 3, 50, 100, 26 }, - /* 78*/ { BARCODE_DBAR_OMNSTK, "1234567890123", "", 69, 5, 50, 100, 138 }, - /* 79*/ { BARCODE_DBAR_EXPSTK, "[01]12345678901231", "", 71, 5, 102, 204, 142 }, - /* 80*/ { BARCODE_PLANET, "12345678901", "", 12, 2, 123, 246, 24 }, - /* 81*/ { BARCODE_MICROPDF417, "1234567890", "", 12, 6, 82, 164, 24 }, - /* 82*/ { BARCODE_USPS_IMAIL, "12345678901234567890", "", 8, 3, 129, 258, 16 }, - /* 83*/ { BARCODE_PLESSEY, "1234567890", "", 50, 1, 227, 454, 116.28 }, - /* 84*/ { BARCODE_TELEPEN_NUM, "1234567890", "", 50, 1, 128, 256, 116.28 }, - /* 85*/ { BARCODE_ITF14, "1234567890", "", 50, 1, 135, 330, 136.28 }, - /* 86*/ { BARCODE_KIX, "123456ABCDE", "", 8, 3, 87, 174, 16 }, - /* 87*/ { BARCODE_AZTEC, "1234567890AB", "", 15, 15, 15, 30, 30 }, - /* 88*/ { BARCODE_DAFT, "DAFTDAFTDAFTDAFT", "", 8, 3, 31, 62, 16 }, - /* 89*/ { BARCODE_DPD, "0123456789012345678901234567", "", 50, 1, 189, 378, 122.28 }, - /* 90*/ { BARCODE_MICROQR, "12345", "", 11, 11, 11, 22, 22 }, - /* 91*/ { BARCODE_HIBC_128, "1234567890", "", 50, 1, 123, 246, 116.28 }, - /* 92*/ { BARCODE_HIBC_39, "1234567890", "", 50, 1, 223, 446, 116.28 }, - /* 93*/ { BARCODE_HIBC_DM, "ABC", "", 12, 12, 12, 24, 24 }, - /* 94*/ { BARCODE_HIBC_QR, "1234567890AB", "", 21, 21, 21, 42, 42 }, - /* 95*/ { BARCODE_HIBC_PDF, "1234567890", "", 24, 8, 103, 206, 48 }, - /* 96*/ { BARCODE_HIBC_MICPDF, "1234567890", "", 28, 14, 38, 76, 56 }, - /* 97*/ { BARCODE_HIBC_BLOCKF, "1234567890", "", 30, 3, 101, 242, 64 }, - /* 98*/ { BARCODE_HIBC_AZTEC, "1234567890AB", "", 19, 19, 19, 38, 38 }, - /* 99*/ { BARCODE_DOTCODE, "ABC", "", 11, 11, 16, 32, 22 }, - /*100*/ { BARCODE_HANXIN, "1234567890AB", "", 23, 23, 23, 46, 46 }, - /*101*/ { BARCODE_MAILMARK_2D, "012100123412345678AB19XY1A 0", "", 24, 24, 24, 48, 48 }, - /*102*/ { BARCODE_UPU_S10, "EE876543216CA", "", 50, 1, 156, 312, 116.28 }, - /*103*/ { BARCODE_MAILMARK_4S, "01000000000000000AA00AA0A", "", 10, 3, 155, 310, 20 }, - /*104*/ { BARCODE_AZRUNE, "255", "", 11, 11, 11, 22, 22 }, - /*105*/ { BARCODE_CODE32, "12345678", "", 50, 1, 103, 206, 116.28 }, - /*106*/ { BARCODE_EANX_CC, "123456789012", "[20]01", 50, 7, 99, 226, 118 }, - /*107*/ { BARCODE_EANX_CC, "123456789012+12", "[20]01", 50, 7, 125, 276, 118 }, - /*108*/ { BARCODE_EANX_CC, "123456789012+12345", "[20]01", 50, 7, 152, 330, 118 }, - /*109*/ { BARCODE_EANX_CC, "1234567", "[20]01", 50, 8, 72, 162, 118 }, - /*110*/ { BARCODE_EANX_CC, "1234567+12", "[20]01", 50, 8, 98, 212, 118 }, - /*111*/ { BARCODE_EANX_CC, "1234567+12345", "[20]01", 50, 8, 125, 266, 118 }, - /*112*/ { BARCODE_GS1_128_CC, "[01]12345678901231", "[20]01", 50, 5, 145, 290, 116.28 }, - /*113*/ { BARCODE_DBAR_OMN_CC, "1234567890123", "[20]01", 21, 5, 100, 200, 58.279999 }, - /*114*/ { BARCODE_DBAR_LTD_CC, "1234567890123", "[20]01", 19, 6, 79, 158, 54.279999 }, - /*115*/ { BARCODE_DBAR_EXP_CC, "[01]12345678901231", "[20]01", 41, 5, 134, 268, 98.279999 }, - /*116*/ { BARCODE_UPCA_CC, "12345678901", "[20]01", 50, 7, 99, 226, 118 }, - /*117*/ { BARCODE_UPCA_CC, "12345678901+12", "[20]01", 50, 7, 127, 276, 118 }, - /*118*/ { BARCODE_UPCA_CC, "12345678901+12345", "[20]01", 50, 7, 154, 330, 118 }, - /*119*/ { BARCODE_UPCE_CC, "1234567", "[20]01", 50, 9, 55, 134, 118 }, - /*120*/ { BARCODE_UPCE_CC, "1234567+12", "[20]01", 50, 9, 81, 184, 118 }, - /*121*/ { BARCODE_UPCE_CC, "1234567+12345", "[20]01", 50, 9, 108, 238, 118 }, - /*122*/ { BARCODE_DBAR_STK_CC, "1234567890123", "[20]01", 24, 9, 56, 112, 48 }, - /*123*/ { BARCODE_DBAR_OMNSTK_CC, "1234567890123", "[20]01", 80, 11, 56, 112, 160 }, - /*124*/ { BARCODE_DBAR_EXPSTK_CC, "[01]12345678901231", "[20]01", 78, 9, 102, 204, 156 }, - /*125*/ { BARCODE_CHANNEL, "01", "", 50, 1, 19, 38, 116.28 }, - /*126*/ { BARCODE_CODEONE, "12345678901234567890", "", 16, 16, 18, 36, 32 }, - /*127*/ { BARCODE_GRIDMATRIX, "ABC", "", 18, 18, 18, 36, 36 }, - /*128*/ { BARCODE_UPNQR, "1234567890AB", "", 77, 77, 77, 154, 154 }, - /*129*/ { BARCODE_ULTRA, "1234567890", "", 13, 13, 18, 36, 26 }, - /*130*/ { BARCODE_RMQR, "12345", "", 11, 11, 27, 54, 22 }, - /*131*/ { BARCODE_BC412, "1234567", "", 16.666666, 1, 102, 204, 49.613335 }, + /* 0*/ { BARCODE_CODE11, "1234567890", "", 0, 50, 1, 108, 216, 116.28 }, + /* 1*/ { BARCODE_C25STANDARD, "1234567890", "", 0, 50, 1, 117, 234, 116.28 }, + /* 2*/ { BARCODE_C25INTER, "1234567890", "", 0, 50, 1, 99, 198, 116.28 }, + /* 3*/ { BARCODE_C25IATA, "1234567890", "", 0, 50, 1, 149, 298, 116.28 }, + /* 4*/ { BARCODE_C25LOGIC, "1234567890", "", 0, 50, 1, 109, 218, 116.28 }, + /* 5*/ { BARCODE_C25IND, "1234567890", "", 0, 50, 1, 159, 318, 116.28 }, + /* 6*/ { BARCODE_CODE39, "1234567890", "", 0, 50, 1, 155, 310, 116.28 }, + /* 7*/ { BARCODE_EXCODE39, "1234567890", "", 0, 50, 1, 155, 310, 116.28 }, + /* 8*/ { BARCODE_EANX, "123456789012", "", 0, 50, 1, 95, 226, 118 }, + /* 9*/ { BARCODE_EANX_CHK, "1234567890128", "", 0, 50, 1, 95, 226, 118 }, + /* 10*/ { BARCODE_EANX, "123456789012+12", "", 0, 50, 1, 122, 276, 118 }, + /* 11*/ { BARCODE_EANX_CHK, "1234567890128+12", "", 0, 50, 1, 122, 276, 118 }, + /* 12*/ { BARCODE_EANX, "123456789012+12345", "", 0, 50, 1, 149, 330, 118 }, + /* 13*/ { BARCODE_EANX_CHK, "1234567890128+12345", "", 0, 50, 1, 149, 330, 118 }, + /* 14*/ { BARCODE_EANX, "1234567", "", 0, 50, 1, 67, 162, 118 }, + /* 15*/ { BARCODE_EANX_CHK, "12345670", "", 0, 50, 1, 67, 162, 118 }, + /* 16*/ { BARCODE_EANX, "1234567+12", "", ZINT_WARN_NONCOMPLIANT, 50, 1, 94, 212, 118 }, + /* 17*/ { BARCODE_EANX_CHK, "12345670+12", "", ZINT_WARN_NONCOMPLIANT, 50, 1, 94, 212, 118 }, + /* 18*/ { BARCODE_EANX, "1234567+12345", "", ZINT_WARN_NONCOMPLIANT, 50, 1, 121, 266, 118 }, + /* 19*/ { BARCODE_EANX_CHK, "12345670+12345", "", ZINT_WARN_NONCOMPLIANT, 50, 1, 121, 266, 118 }, + /* 20*/ { BARCODE_EANX, "1234", "", 0, 50, 1, 47, 104, 118 }, + /* 21*/ { BARCODE_EANX_CHK, "1234", "", 0, 50, 1, 47, 104, 118 }, + /* 22*/ { BARCODE_EANX, "12", "", 0, 50, 1, 20, 50, 118 }, + /* 23*/ { BARCODE_EANX_CHK, "12", "", 0, 50, 1, 20, 50, 118 }, + /* 24*/ { BARCODE_GS1_128, "[01]12345678901231", "", 0, 50, 1, 134, 268, 116.28 }, + /* 25*/ { BARCODE_CODABAR, "A00000000B", "", 0, 50, 1, 102, 204, 116.28 }, + /* 26*/ { BARCODE_CODE128, "1234567890", "", 0, 50, 1, 90, 180, 116.28 }, + /* 27*/ { BARCODE_DPLEIT, "1234567890123", "", 0, 72, 1, 135, 270, 160.28 }, + /* 28*/ { BARCODE_DPIDENT, "12345678901", "", 0, 72, 1, 117, 234, 160.28 }, + /* 29*/ { BARCODE_CODE16K, "1234567890", "", 0, 20, 2, 70, 162, 44 }, + /* 30*/ { BARCODE_CODE49, "1234567890", "", 0, 20, 2, 70, 162, 44 }, + /* 31*/ { BARCODE_CODE93, "1234567890", "", 0, 50, 1, 127, 254, 116.28 }, + /* 32*/ { BARCODE_FLAT, "1234567890", "", 0, 50, 1, 90, 180, 100 }, + /* 33*/ { BARCODE_DBAR_OMN, "1234567890123", "", 0, 50, 1, 96, 192, 116.28 }, + /* 34*/ { BARCODE_DBAR_LTD, "1234567890123", "", 0, 50, 1, 79, 158, 116.28 }, + /* 35*/ { BARCODE_DBAR_EXP, "[01]12345678901231", "", 0, 34, 1, 134, 268, 84.279999 }, + /* 36*/ { BARCODE_TELEPEN, "1234567890", "", 0, 50, 1, 208, 416, 116.28 }, + /* 37*/ { BARCODE_UPCA, "12345678901", "", 0, 50, 1, 95, 226, 118 }, + /* 38*/ { BARCODE_UPCA_CHK, "123456789012", "", 0, 50, 1, 95, 226, 118 }, + /* 39*/ { BARCODE_UPCA, "12345678901+12", "", 0, 50, 1, 124, 276, 118 }, + /* 40*/ { BARCODE_UPCA_CHK, "123456789012+12", "", 0, 50, 1, 124, 276, 118 }, + /* 41*/ { BARCODE_UPCA, "12345678901+12345", "", 0, 50, 1, 151, 330, 118 }, + /* 42*/ { BARCODE_UPCA_CHK, "123456789012+12345", "", 0, 50, 1, 151, 330, 118 }, + /* 43*/ { BARCODE_UPCE, "1234567", "", 0, 50, 1, 51, 134, 118 }, + /* 44*/ { BARCODE_UPCE_CHK, "12345670", "", 0, 50, 1, 51, 134, 118 }, + /* 45*/ { BARCODE_UPCE, "1234567+12", "", 0, 50, 1, 78, 184, 118 }, + /* 46*/ { BARCODE_UPCE_CHK, "12345670+12", "", 0, 50, 1, 78, 184, 118 }, + /* 47*/ { BARCODE_UPCE, "1234567+12345", "", 0, 50, 1, 105, 238, 118 }, + /* 48*/ { BARCODE_UPCE_CHK, "12345670+12345", "", 0, 50, 1, 105, 238, 118 }, + /* 49*/ { BARCODE_POSTNET, "12345678901", "", 0, 12, 2, 123, 246, 24 }, + /* 50*/ { BARCODE_MSI_PLESSEY, "1234567890", "", 0, 50, 1, 127, 254, 116.28 }, + /* 51*/ { BARCODE_FIM, "A", "", 0, 50, 1, 17, 34, 100 }, + /* 52*/ { BARCODE_LOGMARS, "1234567890", "", 0, 50, 1, 191, 382, 116.28 }, + /* 53*/ { BARCODE_PHARMA, "123456", "", 0, 50, 1, 58, 116, 100 }, + /* 54*/ { BARCODE_PZN, "123456", "", 0, 50, 1, 142, 284, 116.28 }, + /* 55*/ { BARCODE_PHARMA_TWO, "12345678", "", 0, 10, 2, 29, 58, 20 }, + /* 56*/ { BARCODE_CEPNET, "12345678", "", 0, 5.375, 2, 93, 186, 10.75 }, + /* 57*/ { BARCODE_PDF417, "1234567890", "", 0, 21, 7, 103, 206, 42 }, + /* 58*/ { BARCODE_PDF417COMP, "1234567890", "", 0, 21, 7, 69, 138, 42 }, + /* 59*/ { BARCODE_MAXICODE, "1234567890", "", 0, 165, 33, 30, 60, 57.7333984 }, + /* 60*/ { BARCODE_QRCODE, "1234567890AB", "", 0, 21, 21, 21, 42, 42 }, + /* 61*/ { BARCODE_CODE128AB, "1234567890", "", 0, 50, 1, 145, 290, 116.28 }, + /* 62*/ { BARCODE_AUSPOST, "12345678901234567890123", "", 0, 8, 3, 133, 266, 16 }, + /* 63*/ { BARCODE_AUSREPLY, "12345678", "", 0, 8, 3, 73, 146, 16 }, + /* 64*/ { BARCODE_AUSROUTE, "12345678", "", 0, 8, 3, 73, 146, 16 }, + /* 65*/ { BARCODE_AUSREDIRECT, "12345678", "", 0, 8, 3, 73, 146, 16 }, + /* 66*/ { BARCODE_ISBNX, "123456789", "", 0, 50, 1, 95, 226, 118 }, + /* 67*/ { BARCODE_ISBNX, "123456789+12", "", 0, 50, 1, 122, 276, 118 }, + /* 68*/ { BARCODE_ISBNX, "123456789+12345", "", 0, 50, 1, 149, 330, 118 }, + /* 69*/ { BARCODE_RM4SCC, "1234567890", "", 0, 8, 3, 91, 182, 16 }, + /* 70*/ { BARCODE_DATAMATRIX, "ABC", "", 0, 10, 10, 10, 20, 20 }, + /* 71*/ { BARCODE_EAN14, "1234567890123", "", 0, 50, 1, 134, 268, 116.28 }, + /* 72*/ { BARCODE_VIN, "12345678701234567", "", 0, 50, 1, 246, 492, 116.28 }, + /* 73*/ { BARCODE_CODABLOCKF, "1234567890", "", 0, 20, 2, 101, 242, 44 }, + /* 74*/ { BARCODE_NVE18, "12345678901234567", "", 0, 50, 1, 156, 312, 116.28 }, + /* 75*/ { BARCODE_JAPANPOST, "1234567890", "", 0, 8, 3, 133, 266, 16 }, + /* 76*/ { BARCODE_KOREAPOST, "123456", "", 0, 50, 1, 167, 334, 116.28 }, + /* 77*/ { BARCODE_DBAR_STK, "1234567890123", "", 0, 13, 3, 50, 100, 26 }, + /* 78*/ { BARCODE_DBAR_OMNSTK, "1234567890123", "", 0, 69, 5, 50, 100, 138 }, + /* 79*/ { BARCODE_DBAR_EXPSTK, "[01]12345678901231", "", 0, 71, 5, 102, 204, 142 }, + /* 80*/ { BARCODE_PLANET, "12345678901", "", 0, 12, 2, 123, 246, 24 }, + /* 81*/ { BARCODE_MICROPDF417, "1234567890", "", 0, 12, 6, 82, 164, 24 }, + /* 82*/ { BARCODE_USPS_IMAIL, "12345678901234567890", "", 0, 8, 3, 129, 258, 16 }, + /* 83*/ { BARCODE_PLESSEY, "1234567890", "", 0, 50, 1, 227, 454, 116.28 }, + /* 84*/ { BARCODE_TELEPEN_NUM, "1234567890", "", 0, 50, 1, 128, 256, 116.28 }, + /* 85*/ { BARCODE_ITF14, "1234567890", "", 0, 50, 1, 135, 330, 136.28 }, + /* 86*/ { BARCODE_KIX, "123456ABCDE", "", 0, 8, 3, 87, 174, 16 }, + /* 87*/ { BARCODE_AZTEC, "1234567890AB", "", 0, 15, 15, 15, 30, 30 }, + /* 88*/ { BARCODE_DAFT, "DAFTDAFTDAFTDAFT", "", 0, 8, 3, 31, 62, 16 }, + /* 89*/ { BARCODE_DPD, "0123456789012345678901234567", "", 0, 50, 1, 189, 378, 122.28 }, + /* 90*/ { BARCODE_MICROQR, "12345", "", 0, 11, 11, 11, 22, 22 }, + /* 91*/ { BARCODE_HIBC_128, "1234567890", "", 0, 50, 1, 123, 246, 116.28 }, + /* 92*/ { BARCODE_HIBC_39, "1234567890", "", 0, 50, 1, 223, 446, 116.28 }, + /* 93*/ { BARCODE_HIBC_DM, "ABC", "", 0, 12, 12, 12, 24, 24 }, + /* 94*/ { BARCODE_HIBC_QR, "1234567890AB", "", 0, 21, 21, 21, 42, 42 }, + /* 95*/ { BARCODE_HIBC_PDF, "1234567890", "", 0, 24, 8, 103, 206, 48 }, + /* 96*/ { BARCODE_HIBC_MICPDF, "1234567890", "", 0, 28, 14, 38, 76, 56 }, + /* 97*/ { BARCODE_HIBC_BLOCKF, "1234567890", "", 0, 30, 3, 101, 242, 64 }, + /* 98*/ { BARCODE_HIBC_AZTEC, "1234567890AB", "", 0, 19, 19, 19, 38, 38 }, + /* 99*/ { BARCODE_DOTCODE, "ABC", "", 0, 11, 11, 16, 32, 22 }, + /*100*/ { BARCODE_HANXIN, "1234567890AB", "", 0, 23, 23, 23, 46, 46 }, + /*101*/ { BARCODE_MAILMARK_2D, "012100123412345678AB19XY1A 0", "", 0, 24, 24, 24, 48, 48 }, + /*102*/ { BARCODE_UPU_S10, "EE876543216CA", "", 0, 50, 1, 156, 312, 116.28 }, + /*103*/ { BARCODE_MAILMARK_4S, "01000000000000000AA00AA0A", "", 0, 10, 3, 155, 310, 20 }, + /*104*/ { BARCODE_AZRUNE, "255", "", 0, 11, 11, 11, 22, 22 }, + /*105*/ { BARCODE_CODE32, "12345678", "", 0, 50, 1, 103, 206, 116.28 }, + /*106*/ { BARCODE_EANX_CC, "123456789012", "[20]01", 0, 50, 7, 99, 226, 118 }, + /*107*/ { BARCODE_EANX_CC, "123456789012+12", "[20]01", 0, 50, 7, 125, 276, 118 }, + /*108*/ { BARCODE_EANX_CC, "123456789012+12345", "[20]01", 0, 50, 7, 152, 330, 118 }, + /*109*/ { BARCODE_EANX_CC, "1234567", "[20]01", 0, 50, 8, 72, 162, 118 }, + /*110*/ { BARCODE_EANX_CC, "1234567+12", "[20]01", ZINT_WARN_NONCOMPLIANT, 50, 8, 98, 212, 118 }, + /*111*/ { BARCODE_EANX_CC, "1234567+12345", "[20]01", ZINT_WARN_NONCOMPLIANT, 50, 8, 125, 266, 118 }, + /*112*/ { BARCODE_GS1_128_CC, "[01]12345678901231", "[20]01", 0, 50, 5, 145, 290, 116.28 }, + /*113*/ { BARCODE_DBAR_OMN_CC, "1234567890123", "[20]01", 0, 21, 5, 100, 200, 58.279999 }, + /*114*/ { BARCODE_DBAR_LTD_CC, "1234567890123", "[20]01", 0, 19, 6, 79, 158, 54.279999 }, + /*115*/ { BARCODE_DBAR_EXP_CC, "[01]12345678901231", "[20]01", 0, 41, 5, 134, 268, 98.279999 }, + /*116*/ { BARCODE_UPCA_CC, "12345678901", "[20]01", 0, 50, 7, 99, 226, 118 }, + /*117*/ { BARCODE_UPCA_CC, "12345678901+12", "[20]01", 0, 50, 7, 127, 276, 118 }, + /*118*/ { BARCODE_UPCA_CC, "12345678901+12345", "[20]01", 0, 50, 7, 154, 330, 118 }, + /*119*/ { BARCODE_UPCE_CC, "1234567", "[20]01", 0, 50, 9, 55, 134, 118 }, + /*120*/ { BARCODE_UPCE_CC, "1234567+12", "[20]01", 0, 50, 9, 81, 184, 118 }, + /*121*/ { BARCODE_UPCE_CC, "1234567+12345", "[20]01", 0, 50, 9, 108, 238, 118 }, + /*122*/ { BARCODE_DBAR_STK_CC, "1234567890123", "[20]01", 0, 24, 9, 56, 112, 48 }, + /*123*/ { BARCODE_DBAR_OMNSTK_CC, "1234567890123", "[20]01", 0, 80, 11, 56, 112, 160 }, + /*124*/ { BARCODE_DBAR_EXPSTK_CC, "[01]12345678901231", "[20]01", 0, 78, 9, 102, 204, 156 }, + /*125*/ { BARCODE_CHANNEL, "01", "", 0, 50, 1, 19, 38, 116.28 }, + /*126*/ { BARCODE_CODEONE, "12345678901234567890", "", 0, 16, 16, 18, 36, 32 }, + /*127*/ { BARCODE_GRIDMATRIX, "ABC", "", 0, 18, 18, 18, 36, 36 }, + /*128*/ { BARCODE_UPNQR, "1234567890AB", "", 0, 77, 77, 77, 154, 154 }, + /*129*/ { BARCODE_ULTRA, "1234567890", "", 0, 13, 13, 18, 36, 26 }, + /*130*/ { BARCODE_RMQR, "12345", "", 0, 11, 11, 27, 54, 22 }, + /*131*/ { BARCODE_BC412, "1234567", "", 0, 16.666666, 1, 102, 204, 49.613335 }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; struct zint_symbol *symbol = NULL; const char *text; + int ret_buf; char errmsg[128] = {0}; /* Suppress clang -fsanitize=memory false positive */ testStartSymbol(p_ctx->func_name, &symbol); @@ -713,27 +714,33 @@ static void test_buffer_vector(const testCtx *const p_ctx) { length = (int) strlen(text); ret = ZBarcode_Encode(symbol, TCU(text), length); - assert_zero(ret, "i:%d ZBarcode_Encode(%d) ret %d != 0 %s\n", i, data[i].symbology, ret, symbol->errtxt); + assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode(%s) ret %d != %d (%s)\n", + i, testUtilBarcodeName(data[i].symbology), ret, data[i].ret, symbol->errtxt); - ret = ZBarcode_Buffer_Vector(symbol, 0); - assert_zero(ret, "i:%d ZBarcode_Buffer_Vector(%d) ret %d != 0\n", i, data[i].symbology, ret); + ret_buf = ZBarcode_Buffer_Vector(symbol, 0); + assert_zero(ret_buf, "i:%d ZBarcode_Buffer_Vector(%d) ret_buf %d != 0\n", i, data[i].symbology, ret_buf); assert_nonnull(symbol->vector, "i:%d ZBarcode_Buffer_Vector(%d) vector NULL\n", i, data[i].symbology); if (p_ctx->generate) { - printf(" /*%3d*/ { %s, \"%s\", \"%s\", %.9g, %d, %d, %.9g, %.9g },\n", + printf(" /*%3d*/ { %s, \"%s\", \"%s\", %s, %.9g, %d, %d, %.9g, %.9g },\n", i, testUtilBarcodeName(data[i].symbology), data[i].data, data[i].composite, + testUtilErrorName(ret), symbol->height, symbol->rows, symbol->width, symbol->vector->width, symbol->vector->height); } else { assert_equal(symbol->height, data[i].expected_height, "i:%d (%s) symbol->height %.9g != %.9g\n", - i, testUtilBarcodeName(data[i].symbology), symbol->height, data[i].expected_height); + i, testUtilBarcodeName(data[i].symbology), symbol->height, data[i].expected_height); assert_equal(symbol->rows, data[i].expected_rows, "i:%d (%s) symbol->rows %d != %d\n", - i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows); + i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows); assert_equal(symbol->width, data[i].expected_width, "i:%d (%s) symbol->width %d != %d\n", - i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width); - assert_equal(symbol->vector->width, data[i].expected_vector_width, "i:%d (%s) symbol->vector->width %.9g != %.9g\n", - i, testUtilBarcodeName(data[i].symbology), symbol->vector->width, data[i].expected_vector_width); - assert_equal(symbol->vector->height, data[i].expected_vector_height, "i:%d (%s) symbol->vector->height %.9g != %.9g\n", - i, testUtilBarcodeName(data[i].symbology), symbol->vector->height, data[i].expected_vector_height); + i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width); + assert_equal(symbol->vector->width, data[i].expected_vector_width, + "i:%d (%s) symbol->vector->width %.9g != %.9g\n", + i, testUtilBarcodeName(data[i].symbology), symbol->vector->width, + data[i].expected_vector_width); + assert_equal(symbol->vector->height, data[i].expected_vector_height, + "i:%d (%s) symbol->vector->height %.9g != %.9g\n", + i, testUtilBarcodeName(data[i].symbology), symbol->vector->height, + data[i].expected_vector_height); assert_nonzero(check_vectors(symbol, errmsg), "i:%d (%s) %s\n", i, testUtilBarcodeName(data[i].symbology), errmsg); @@ -968,14 +975,14 @@ static void test_upcean_hrt(const testCtx *const p_ctx) { /* 48*/ { BARCODE_ISBNX, -1, -1, "9784567890120+12345", 0, 50, 1, 149, 330.0, 118, 12.2, 117.2, 274, 15.6, 4 }, /* ISBN + EAN-5 */ /* 49*/ { BARCODE_ISBNX, 0, -1, "9784567890120+12345", 0, 50, 1, 149, 330.0, 110, -1, -1, -1, -1, 0 }, /* ISBN + EAN-5 */ /* 50*/ { BARCODE_ISBNX, -1, EANUPC_GUARD_WHITESPACE, "9784567890120+12345", 0, 50, 1, 149, 330.0, 118, 274, 15.6, 331, 15.6, 5 }, /* ISBN + EAN-5 */ - /* 51*/ { BARCODE_EANX, -1, -1, "1234567+12", 0, 50, 1, 94, 212, 118, 49, 117.2, 182, 15.6, 3 }, /* EAN-8 + EAN-2 */ - /* 52*/ { BARCODE_EANX, -1, BARCODE_RAW_TEXT, "1234567+12", 0, 50, 1, 94, 212, 118, 49, 117.2, 182, 15.6, 3 }, /* EAN-8 + EAN-2 */ - /* 53*/ { BARCODE_EANX, 0, -1, "1234567+12", 0, 50, 1, 94, 212, 110, -1, -1, -1, -1, 0 }, /* EAN-8 + EAN-2 */ - /* 54*/ { BARCODE_EANX, -1, EANUPC_GUARD_WHITESPACE, "1234567+12", 0, 50, 1, 94, 212, 118, 182, 15.6, 213, 15.6, 5 }, /* EAN-8 + EAN-2 */ - /* 55*/ { BARCODE_EANX, -1, -1, "1234567+12345", 0, 50, 1, 121, 266, 118, 49, 117.2, 210, 15.6, 3 }, /* EAN-8 + EAN-5 */ - /* 56*/ { BARCODE_EANX, -1, BARCODE_RAW_TEXT, "1234567+12345", 0, 50, 1, 121, 266, 118, 49, 117.2, 210, 15.6, 3 }, /* EAN-8 + EAN-5 */ - /* 57*/ { BARCODE_EANX, 0, -1, "1234567+12345", 0, 50, 1, 121, 266, 110, -1, -1, -1, -1, 0 }, /* EAN-8 + EAN-5 */ - /* 58*/ { BARCODE_EANX, -1, EANUPC_GUARD_WHITESPACE, "1234567+12345", 0, 50, 1, 121, 266, 118, 210, 15.6, 210, 15.6, 5 }, /* EAN-8 + EAN-5 */ + /* 51*/ { BARCODE_EANX, -1, -1, "1234567+12", ZINT_WARN_NONCOMPLIANT, 50, 1, 94, 212, 118, 49, 117.2, 182, 15.6, 3 }, /* EAN-8 + EAN-2 */ + /* 52*/ { BARCODE_EANX, -1, BARCODE_RAW_TEXT, "1234567+12", ZINT_WARN_NONCOMPLIANT, 50, 1, 94, 212, 118, 49, 117.2, 182, 15.6, 3 }, /* EAN-8 + EAN-2 */ + /* 53*/ { BARCODE_EANX, 0, -1, "1234567+12", ZINT_WARN_NONCOMPLIANT, 50, 1, 94, 212, 110, -1, -1, -1, -1, 0 }, /* EAN-8 + EAN-2 */ + /* 54*/ { BARCODE_EANX, -1, EANUPC_GUARD_WHITESPACE, "1234567+12", ZINT_WARN_NONCOMPLIANT, 50, 1, 94, 212, 118, 182, 15.6, 213, 15.6, 5 }, /* EAN-8 + EAN-2 */ + /* 55*/ { BARCODE_EANX, -1, -1, "1234567+12345", ZINT_WARN_NONCOMPLIANT, 50, 1, 121, 266, 118, 49, 117.2, 210, 15.6, 3 }, /* EAN-8 + EAN-5 */ + /* 56*/ { BARCODE_EANX, -1, BARCODE_RAW_TEXT, "1234567+12345", ZINT_WARN_NONCOMPLIANT, 50, 1, 121, 266, 118, 49, 117.2, 210, 15.6, 3 }, /* EAN-8 + EAN-5 */ + /* 57*/ { BARCODE_EANX, 0, -1, "1234567+12345", ZINT_WARN_NONCOMPLIANT, 50, 1, 121, 266, 110, -1, -1, -1, -1, 0 }, /* EAN-8 + EAN-5 */ + /* 58*/ { BARCODE_EANX, -1, EANUPC_GUARD_WHITESPACE, "1234567+12345", ZINT_WARN_NONCOMPLIANT, 50, 1, 121, 266, 118, 210, 15.6, 210, 15.6, 5 }, /* EAN-8 + EAN-5 */ /* 59*/ { BARCODE_UPCA, -1, -1, "12345678901+12", 0, 50, 1, 124, 276, 118, 8.7, 117.2, 246, 15.6, 5 }, /* 60*/ { BARCODE_UPCA, -1, BARCODE_RAW_TEXT, "12345678901+12", 0, 50, 1, 124, 276, 118, 8.7, 117.2, 246, 15.6, 5 }, /* 61*/ { BARCODE_UPCA, 0, -1, "12345678901+12", 0, 50, 1, 124, 276, 110, -1, -1, -1, -1, 0 }, @@ -1021,20 +1028,28 @@ static void test_upcean_hrt(const testCtx *const p_ctx) { length = (int) strlen(data[i].data); ret = ZBarcode_Encode(symbol, TCU(data[i].data), length); - assert_zero(ret, "i:%d ZBarcode_Encode(%d) ret %d != 0 %s\n", i, data[i].symbology, ret, symbol->errtxt); + assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode(%d) ret %d != %d (%s)\n", + i, data[i].symbology, ret, data[i].ret, symbol->errtxt); ret = ZBarcode_Buffer_Vector(symbol, 0); - assert_equal(ret, data[i].ret, "i:%d ZBarcode_Buffer_Vector(%d) ret %d != %d\n", i, data[i].symbology, ret, data[i].ret); + assert_zero(ret, "i:%d ZBarcode_Buffer_Vector(%d) ret %d != 0 (%s)\n", + i, data[i].symbology, ret, symbol->errtxt); assert_nonnull(symbol->vector, "i:%d ZBarcode_Buffer_Vector(%d) vector NULL\n", i, data[i].symbology); - assert_equal(symbol->height, data[i].expected_height, "i:%d (%s) symbol->height %.9g != %.9g\n", i, testUtilBarcodeName(data[i].symbology), symbol->height, data[i].expected_height); - assert_equal(symbol->rows, data[i].expected_rows, "i:%d (%s) symbol->rows %d != %d\n", i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows); - assert_equal(symbol->width, data[i].expected_width, "i:%d (%s) symbol->width %d != %d\n", i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width); + assert_equal(symbol->height, data[i].expected_height, "i:%d (%s) symbol->height %.9g != %.9g\n", + i, testUtilBarcodeName(data[i].symbology), symbol->height, data[i].expected_height); + assert_equal(symbol->rows, data[i].expected_rows, "i:%d (%s) symbol->rows %d != %d\n", + i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows); + assert_equal(symbol->width, data[i].expected_width, "i:%d (%s) symbol->width %d != %d\n", + i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width); - assert_equal(symbol->vector->width, data[i].expected_vector_width, "i:%d (%s) symbol->vector->width %.9g != %.9g\n", - i, testUtilBarcodeName(data[i].symbology), symbol->vector->width, data[i].expected_vector_width); - assert_equal(symbol->vector->height, data[i].expected_vector_height, "i:%d (%s) symbol->vector->height %.9g != %.9g\n", - i, testUtilBarcodeName(data[i].symbology), symbol->vector->height, data[i].expected_vector_height); + assert_equal(symbol->vector->width, data[i].expected_vector_width, + "i:%d (%s) symbol->vector->width %.9g != %.9g\n", + i, testUtilBarcodeName(data[i].symbology), symbol->vector->width, data[i].expected_vector_width); + assert_equal(symbol->vector->height, data[i].expected_vector_height, + "i:%d (%s) symbol->vector->height %.9g != %.9g\n", + i, testUtilBarcodeName(data[i].symbology), symbol->vector->height, + data[i].expected_vector_height); if (p_ctx->index != -1 && (debug & ZINT_DEBUG_TEST_PRINT)) { testUtilVectorPrint(symbol); @@ -1042,25 +1057,27 @@ static void test_upcean_hrt(const testCtx *const p_ctx) { if (data[i].show_hrt) { assert_nonnull(symbol->vector->strings, "i:%d (%s) vector->strings NULL\n", - i, testUtilBarcodeName(data[i].symbology)); + i, testUtilBarcodeName(data[i].symbology)); string = find_string(symbol, data[i].expected_string_x, data[i].expected_string_y); assert_nonnull(string, "i:%d (%s) find_string(%.9g, %.9g) NULL\n", - i, testUtilBarcodeName(data[i].symbology), data[i].expected_string_x, data[i].expected_string_y); + i, testUtilBarcodeName(data[i].symbology), data[i].expected_string_x, + data[i].expected_string_y); if (data[i].expected_string2_x != -1) { assert_nonnull(symbol->vector->strings->next, "i:%d (%s) vector->strings->next NULL\n", - i, testUtilBarcodeName(data[i].symbology)); + i, testUtilBarcodeName(data[i].symbology)); string = find_string(symbol, data[i].expected_string2_x, data[i].expected_string2_y); assert_nonnull(string, "i:%d (%s) find_string(%.9g, %.9g) NULL\n", - i, testUtilBarcodeName(data[i].symbology), data[i].expected_string2_x, data[i].expected_string2_y); + i, testUtilBarcodeName(data[i].symbology), data[i].expected_string2_x, + data[i].expected_string2_y); } } else { assert_null(symbol->vector->strings, "i:%d (%s) vector->strings NULL\n", - i, testUtilBarcodeName(data[i].symbology)); + i, testUtilBarcodeName(data[i].symbology)); } string_cnt = cnt_strings(symbol); assert_equal(string_cnt, data[i].expected_string_cnt, "i:%d (%s) cnt_strings(symbol) %d != %d\n", - i, testUtilBarcodeName(data[i].symbology), string_cnt, data[i].expected_string_cnt); + i, testUtilBarcodeName(data[i].symbology), string_cnt, data[i].expected_string_cnt); ZBarcode_Delete(symbol); } @@ -3156,7 +3173,7 @@ static void test_hrt_raw_text(const testCtx *const p_ctx) { /* 6*/ { BARCODE_EANX, -1, -1, BARCODE_MEMORY_FILE, "123456789012", -1, 0, 118, 226, "1234567890128", -1, "", -1, "" }, /* 7*/ { BARCODE_EANX, -1, -1, BARCODE_MEMORY_FILE | BARCODE_RAW_TEXT, "123456789012", -1, 0, 118, 226, "1234567890128", -1, "1234567890128", -1, "" }, /* 8*/ { BARCODE_EANX, -1, -1, BARCODE_MEMORY_FILE, "123456789012+12", -1, 0, 118, 276, "1234567890128+12", -1, "", -1, "" }, - /* 9*/ { BARCODE_EANX, -1, -1, BARCODE_MEMORY_FILE | BARCODE_RAW_TEXT, "123456789012+12", -1, 0, 118, 276, "1234567890128+12", -1, "1234567890128+12", -1, "" }, + /* 9*/ { BARCODE_EANX, -1, -1, BARCODE_MEMORY_FILE | BARCODE_RAW_TEXT, "123456789012+12", -1, 0, 118, 276, "1234567890128+12", -1, "123456789012812", -1, "" }, /* 10*/ { BARCODE_CODE39, -1, -1, BARCODE_MEMORY_FILE, "ABC14", -1, 0, 116.279999, 180, "*ABC14*", -1, "", -1, "" }, /* 11*/ { BARCODE_CODE39, -1, -1, BARCODE_MEMORY_FILE | BARCODE_RAW_TEXT, "ABC14", -1, 0, 116.279999, 180, "*ABC14*", -1, "ABC14", -1, "" }, /* 12*/ { BARCODE_CODE39, -1, 1, BARCODE_MEMORY_FILE, "ABC14", -1, 0, 116.279999, 206, "*ABC14_*", -1, "", -1, "" }, /* Check digit space rendered as underscore */ @@ -3190,7 +3207,8 @@ static void test_hrt_raw_text(const testCtx *const p_ctx) { -1 /*option_1*/, data[i].option_2, -1 /*option_3*/, data[i].output_options, data[i].data, data[i].length, debug); expected_length = data[i].expected_length == -1 ? (int) strlen(data[i].expected) : data[i].expected_length; - expected_raw_length = data[i].expected_raw_length == -1 ? (int) strlen(data[i].expected_raw) : data[i].expected_raw_length; + expected_raw_length = data[i].expected_raw_length == -1 ? (int) strlen(data[i].expected_raw) + : data[i].expected_raw_length; ret = ZBarcode_Encode(symbol, TCU(data[i].data), length); assert_zero(ret, "i:%d ZBarcode_Encode(%s) ret %d != 0 (%s)\n", @@ -3221,9 +3239,12 @@ static void test_hrt_raw_text(const testCtx *const p_ctx) { i, symbol->errtxt, data[i].expected_errtxt); assert_nonnull(symbol->vector, "i:%d ZBarcode_Print(%s) vector NULL\n", i, testUtilBarcodeName(data[i].symbology)); - assert_equal(symbol->vector->height, data[i].expected_vector_height, "i:%d (%s) symbol->vector->height %.9g != %.9g\n", - i, testUtilBarcodeName(data[i].symbology), symbol->vector->height, data[i].expected_vector_height); - assert_equal(symbol->vector->width, data[i].expected_vector_width, "i:%d (%s) symbol->vector->width %.9g != %.9g\n", + assert_equal(symbol->vector->height, data[i].expected_vector_height, + "i:%d (%s) symbol->vector->height %.9g != %.9g\n", + i, testUtilBarcodeName(data[i].symbology), symbol->vector->height, + data[i].expected_vector_height); + assert_equal(symbol->vector->width, data[i].expected_vector_width, + "i:%d (%s) symbol->vector->width %.9g != %.9g\n", i, testUtilBarcodeName(data[i].symbology), symbol->vector->width, data[i].expected_vector_width); ZBarcode_Delete(symbol); @@ -3247,10 +3268,10 @@ int main(int argc, char *argv[]) { { "test_scale", test_scale }, { "test_guard_descent", test_guard_descent }, { "test_quiet_zones", test_quiet_zones }, - { "test_text_gap", test_text_gap, }, + { "test_text_gap", test_text_gap }, { "test_height", test_height }, { "test_height_per_row", test_height_per_row }, - { "test_hrt_raw_text", test_hrt_raw_text, }, + { "test_hrt_raw_text", test_hrt_raw_text }, }; testRun(argc, argv, funcs, ARRAY_SIZE(funcs)); diff --git a/backend/tests/testcommon.c b/backend/tests/testcommon.c index ce0cb838..a93381bb 100644 --- a/backend/tests/testcommon.c +++ b/backend/tests/testcommon.c @@ -2915,6 +2915,10 @@ int testUtilBwipp(int index, const struct zint_symbol *symbol, int option_1, int if (upcean) { if (symbology == BARCODE_EANX_CC && (primary_len <= 8 || (addon_posn && addon_posn <= 8))) { bwipp_barcode = "ean8composite"; + if (addon_posn) { + sprintf(bwipp_opts_buf + strlen(bwipp_opts_buf), "%spermitaddon", + strlen(bwipp_opts_buf) ? " " : ""); + } } if (addon_posn) { sprintf(bwipp_opts_buf + strlen(bwipp_opts_buf), "%saddongap=%d", @@ -2951,6 +2955,10 @@ int testUtilBwipp(int index, const struct zint_symbol *symbol, int option_1, int if ((symbology == BARCODE_EANX || symbology == BARCODE_EANX_CHK) && (data_len <= 8 || (addon_posn && addon_posn <= 8))) { bwipp_barcode = data_len <= 3 ? "ean2" : data_len <= 5 ? "ean5" : "ean8"; + if (addon_posn) { + sprintf(bwipp_opts_buf + strlen(bwipp_opts_buf), "%spermitaddon", + strlen(bwipp_opts_buf) ? " " : ""); + } } if (symbology == BARCODE_ISBNX) { testUtilISBNHyphenate(bwipp_data, addon_posn); diff --git a/backend/tests/tools/bwipp_dump.ps.tar.xz b/backend/tests/tools/bwipp_dump.ps.tar.xz index 25bbce81e0fbda520ca439201e79f760b7a32b07..9451c5dedf5ab4cface607578d7675afd74345c1 100644 GIT binary patch literal 140336 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 literal 140192 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 z zJY(Fi@+=bB_HhSof}H^yjNEbYj1Zd>6GP;i1(U!e`fT+&dCe6{nB#K!8ePjGHYk{3 zq_bXS;Jx-({a9Dl^X6_8m-{7!u&UZC6~{0X*1}KVie3I;*j(&)J~GYl`C}+cI?yOC zzU@|TrCnYsp{d}GY1HgS#giug9QbkT)8bu(u(=3K#e`?D4Xl}1Cj>`P{P`!YTZx1^ zucbDuhat1ZFo?rq0emtksC;8dl+YUF^V>#r{QHRL;BbB_w+S|z#&Gw$xq`I?9hvfT zR*fvHGlOq4I6Ze2eKo``*9Wm8Na03@PDI$=nx#>D-AX8!UAk(9fX0%pHOeZ6(J~nlxoY#?$;hb(w#i@OtcefX)?XC_ncNEBMd<9+C{MxWsc9ofWY?UQKa)OeG`r^bR7;UNP+<`n_n z8~f1uu;qu5*mzLVZ_>}P2`DPwe{x^6lBMeoasH8bv!J#*KRF(BeWs>V{{m6 z@!1NH&CA@JwQamiTKnN+z!rxmMzF17XmnlIz&*h*EG7zEqa~jwz0qTJhUYKRk~F$uVKb914HMUWx_zOE6tE)o4x}$NUu(O{ zB!vh=ySR4@UA_tTfCVj~t%^&9UbkX#FuWFEw=hy6@WqJBA*;UN33wsk~DG-#&4=M?jJVDt~nTtc+yU# zlx{CVkjtqgp#@V#X?5LlIZrz|R_^KC11?%$tNTOs`zZv@^YnyNCyz2gytFly;jRU$ zChRpa;2VW{UrO!e!)gq)X;ets9(G-YOc$@|K%0LNt5ce~IyWbA8F;UxP$|OjE%CnB z-+x5Q@N`*S632AB$;zbwk0sXNvYG0?8aOmzLMY1b=a<4u73_FU00BS@4Px2_$iF;w z7iVB11%m)~ZM#DU!R%zbU+7bRbch)uI2=-N0OR!AqT!CnFdwk7yuglh5U*9AGbJBa zL1{OPqNjs}vL`R}Qk40H?>Yqt=MVK*!FA<%rUqk9 z*t0vk9Wu)je&XKfSNJ@69o$yLnMzjxpir)m(5sHLdX-)X=<@+AkYeT_%jX#WxcxNA zSvioJqIWiK_EaP#QX184I^^jf^x*#F*1@d;tCNrBJz$Ua=dSn0x}@FtT1EsNHYX)yB91rbCI5fz%WYdmzep`c~-sB+g)c@7LFQ*N{e*1A?47&F$+sng_)L zKnC~_hEl1dK?wYY*MTMyAySi9`x+1UBcnLynJMvEkeG1Ohyjfw_CB%iEd5x-O$HeOLb|V14}FXN(nKR+uoF1|+uM=32@`&DLuVrE}Sf6_~56 zVlbtGX%=$oKnUG`-Gk6+y^RK+G{`kJuhzhsXeRN?hvkZo3zDl-wv%tRhsyzTj5m4Y z9vm#*Q~hjg_FiOJs%4mOIyS8A{MUuFpy%+mVJH25`TRacqkcX!rDODVz8;pqSbMn< z*@x2Sj|G+O>w0ooP%~jqke5}(ffXCn$6mv9*I)Oxqz($*_p73S$gYijOsZmxtdh7^ zj97OH({d~SbC&hV-bG=!$k70?mPcLuCr}SYlmX{{`KLnbO@;sq|HyLiuceU%9>Qo? zLW52YcJxcDNrRHhF>ZHtqUajQ{kc;Co;Yo)*k!lj8XVLpKE4o!|9U^i{f?S&snin} zO2?ZvjuU*1iImv5B*GDI*Ya>_*|| z68~po?>qzMeYGWZqQ;#`drq+?WK#c8^1DJ1w#o}n^=o>*JVhxOUr3LMmg(u||KpPO z&@)De+6Q>~tsjRHt2|)!#=ZYq6jv3^PZl~s1Lp(BO*n%oVD=7T{jGzW{B(q#+3aJ| z@VCeKIZat()KP4eqEsgja!b;-TWTXb(Cp8pxT?+Uag8roNoq%#!A5Ep?}$Vl+xDd} zkM|eIX&+LE&0#WyZ6G^a-OLp0!>CFqhS-zE0 zHyVC@g%$L9$*uj6jOg3E4)T){^Yr{M6)F;6Is$U^mB=APpzY!54;ei9D>eV4Py<5W znTmac^SY%C^D|AnWpcC?``L+;|Jva)%Sw^=o>k_2590w}X|srkl6<1)NOxIWR_1wS z9C-K)j(FXB-6x}@+f%912)hcT(@;@B2a~;f2(2cPz7yVjhA#FFMrXw^zm0_3-tSBw zMQyzRXz&=E;KrscA$-2au%tTC!k@1%OeHL{<#^(zOHLilqkZU;YO`AXfD9Q`GGuw4 z?_96OxiWmL+fqs&5^!Kc+SzC;b$-0B-lf-gy*gA31XDAcZ$>EF6{%-!SON^0kv$zg z%nRnk8Fq@IF~w`67~Y7CRA|>b=jj6j^nFGmz6E}g5;x9+?+ndS4e68bs1Jzvu`pnKyx;zwJ3611Jo>2<*AxbRJ>utTD*X4Y)o07Gn?`a6ACo{Q9pr% zN^Xge=JJ;7b2WYzC*_67e$`T_!Jv-ev;Uvwr$3w`Gi`(gm98qupNNlP7CydkGJKeMyc zh@75n_r@dSirRM82Aor?lT;-5-1u<)trBvCRyjVf)fQ*r9sFFRcr|gbGYb~wq$rn z`+YE{8{(r#%m z-snG5g0ffHvW7c+BmW-G;gOhy8+||}E;Rcpfy-h-8Wc#z+PYeF@le=tOf<34T9-(` z)l$>TCD7~CZ;c%p>P%1JBHXj*$oMu zjgmwy`ISV6dMn9|VO{ch^y8Q4e$RLBI(l7kheo^7Nqaq;)W;nqxG7<)@x=qhM!rGo4>XPD zf>M!aMgLUjwmpAH1GSPRz~`NgFY&g;6DlTopedrWG>?g&jImlhJG0hHfpSJ?PaSk( ze=?TP;i`HA6evs}4?!;gDK7vh=iXpF$x|%hxI|s`{73I9B<51R?AMRH>j~|5IrgG_ z$YW=)MDFzi)mI8q5s3J#3M9vHcMvf3(78sh9LM!-RY_J#`8b_~EYIXx733v_lP8iB zlV-1MitHD{=5)Ul;{b_54mDXGNAGTQhQB||=~F0g$_%FdBXKZO9-KY?0f+~`_k!VX zP(6jwU{q~#W!ROHG~V3Qgc*4d8_8l|gc@>hijOm&iVG_S;(o{1Zkd4C7Snx|hv$AT zo5>{_+Un~CPHWG9j-Wa-z)ep#Jf-o*PL`EPy{H(~v2p1UaWYQIS8yhE;R}p4l#~l- zh@?`&Q}Gwad$AV+Yn<2{qA}8}P|;~p#mv>ReRsH`@Qgoxp!(K`DvTgHB4_oZD!=<= zQvI*q_5M=nH0WWMZ_6raw-718Y9+#PUk5m;`z?Zf`zjHqr9TBuTR@gs5X%;3+fLKG z&FjBQk$>lp-cs#@te$#y^~R!a!TnvzfbLe95zI8>VC`4u1Ws%dU@?e(%wm5#KGhfE+q@x_5oB zY5N&Zq#H4O4YL?lU|Hd}wOx0)iLT))dJ;?E^ILgy+OzB(mJE*VBq?jhx~$-MLcp1-W4BSw&}}R5C9PuROH0 zF20_T#8sVv28j9XS~_ewN8!xqU7pf)H+BdNU=%7ZFR!{wyfkkh{VzYA@p>rVvAu+V z%dB6zNnlHLmqk+uAxo=>cUJPbcAT$3P^YQn5(ULQ8nOM}xp6?WupiJ4AJL0Z6C_1R zE=6+?op0fNQz`bb>TXjaTTds)KaK2^khb%dtKDc=j>advzTncLrlqSBFkFl7ku-pqG&MM20{ zk0F^|37*7(0?XqqdSR|rp*4mncE7-lQG1f*I(LC&dp5r#cWT(w{+R`nQy+DeaSdx6X7 z?#R2u3U-w_zU#ah7XjO!4+E{j7(~7;W;V&7ecZ*5mg!YTe6le;GGilI|H!o*me$$m zdz-Yt322fA#Vw|DJ921}d@U0^4QB|-;v4MZxg-Y1b6}dEqqx)F7g`K8_#h#;o1~2N zrdbVxQ3&}~k%C^2*M5lM5pY85O?x7oDOBEG9?LF9@MeII&+E)#ep`jJciPao!FGAH z{>>5~;SJ+g#`m2&+~#kVoHaXxOFk^=^hh&vncZm4d0FX?=n-zZ-pt&BG_(`Vl{dhF z!XkBsK*cBd!HP6_jzT)P^oM)vxDE^Ns&8%u&hqE&+p&F{(N}2m?ycpNJDSH4#ndB7 z1)7P7&dW?wCq2)-4XBL-LuP@krIpE)Bf>NFvephVcp`e9SqE4~ExJNtbw? zCC)ac2`sKl}AK#*bp8tGq?P803n2xo9~j;4{asT>kAyO+8Af+aVH`+GF#{~ zSkl3@=uCEiARp9XuzmdIyfW9Lv@QXUjSVWT8cTDEZ1Irz_hA5X$3gU2dW=h(;;vPE zUERU$coxpyV$q8$d)#<{yKLO+OSliI7zm`Z=W!xg-a)@T)hxaBx>E5>D%WvB70%I* zHU?X0qm?hDfoUJu;UsdwIr;r$O1Vctj3CKffN>FV)IT$}dA?JazNku;kq z6Tk{91i6KTuA{FXbRd%6Q#qYr%nD&H`EhnfGG=juLIQ*1t0R>0d7&kG6(nYIs(PjM zWG3Qn_`IP^9eDcJQbm-khdUiGbx&83XKWThR`c%7QtqL87CXYCsS=T05x3G$$pV0y zSJuy7jI{g`Qo|xeUBFz0=WJQlZ_Mu) zcDR*|YQ!UAv4iB(+?CK(rX(_lb|Q`9Jus+HVHWr<2S4b#MP5|TQJH$b=>9)YT%vh` zhh8!S=gizfn$-#-8+cH2yRbjkGVvf}yTDTubV^|H=mf7NqXc}RD;7r_?UT4H;d zy{{J;Xw57RF)&-YgdSZ9`eCv;(d22+djXdfXaDL?(-2ih2KIE zu@UT4TYKNWkh!mPaDGc@O0~$>f}DvWp^&)-t7KWJTY3(Q3IFKhNSK_R3uO(MAAp9E zEhhA*#JgXGx|M2PZotr7Sjx2}NO@cLNKvC9m$@Ig{l+Sh!T_9GYecc*&cq+UVk0)6 z%ug%&|HR&!`}cr{_q&+Jps+|vO3_oqdB@)~N=*8g@Lkumd*BR*3 zXGP1K9T!QU`pdWc@kwC$P%@7ojBOewO6-;m!)Q?#)G#L~wG#XXoMddwQ8oqOI(zj5 zZ~jy$H;;Wp_u|j}sbNM-Qu!*((#MEky8$U5pj{yN-<26Cr5rEGJAr<(aaaHd5=^J$AqMQKC`C^tF5#vG=oc`d5BEVX>{r*vUiSFvturUZ(nVyX( z=1%eJRs$Q?pG8x~I}Am@{a@m0SWV9n-_Ka~Q?4z+B4$&|=|J!acUOQU&quQwFx116 zo>Re8z*WoBLmkFeHU{XRPCZ?J)rDret~YWwRrTiIu4vJDPlC0sTXP9Zyl-dVTkL3} zyKJf|Dwtof{Vz_*}>X zDh}}v)_f9>@}y%~6NCl&ss@1jJ6ciUF7v)Z@14}Etj&0-?@cw>{)W-6Ir*}>O=ywa z!fM2pT9{lxznu`f_9E-RKt619=nO#rDFLnvN1J=xkpK<0IRj{4qiw^9v}_ZnaMAd( zj2DxcBx6$|yTJR3DF5HVj{@dyQP_oEBb`}@tt6d|1sc|9`Lt6}>^@7`xm8<z~!-x93`}jF}5K0tw(UckiJnsgq}4N5X4wILor*Z?xsNF{q+&(-i01b$xaq> zQChjQZXI9i7w#aeJtwvIle@tl`wrv97<#sX*(sC56@b9B{5oWQExU>^%Bg7=*Mkk|Rl)i{w=3Hp0G z<0ZP<7K^FKBwjN?w&uf6fh(|_gT{)B2sh7x<2fxFZV!{>rW{XIDw8>AWq$#kF z>A@*PcE`m^v-ljXoIz_Z=U@Hd9n}?|^oGLA1P+5CDR`$S1jL{6%MQTe8}-twxD5Q$tWXwnw8XCm1Y5_!Q0f@ zY&PR+i~7-G^Q36%48O&!b#6a-mJj{A8Q`9ll~_LoJMwkYo%7jG zrx_B$_89Oci);qdL%$yHcEyJRbfbe2KPh#z@bI$iX3xA@Hn_V4p_BHaa*F&Bg=;Jm z54r^M^FAeOZDmb{(ff?^VOBSRjqNA$ZUWGSvMG=?wIBCLJJY*z}#-chfgA6mU|MLXmW_I)kFrorTmV1+~Mrb;(8 zFUJ)gZ||P$j@`=VUBvVFdm zhY|9t(duSxma-evR>cscuHV$vt3{5MvJ*IyHW17SS-}YBub}H)!S^B=X%eF?%AGO8 z3()8jYX$kEa>Ia|<3{It-Ex9guoHG4Lg@e2Dr@w4{~wP>GwqB`=ZI;bcbVw;jbgq9!YQS8jU!$N2rc)Qa0l{B*mtIAKx-~nuVX(!k z)^W5&eUu_HeHwhrIT*kYlGRD27~uk4)1G~M+N)fgm^CvC6woO4Ja+y|*F%KHw~^en zWp*iO)lH}ON*kF`h5?TzU8QNXL1+J7t{W}BC22Ec}y=0#-WhPVgfEVe%NJiARZtzBcF`ztl5P#h3iBC0``QrmOI~PR}}@JPhT{PmU7m=d!h~z{xOwKj*9+i%USjlW;vLb zUEf|fzFfcHOvzx>7c*$+r5TiQ``OI3pquWT80`|BoBV>5>6h><25HaueF8(-p2?ASegdnJ!y2FfZEG;&B#q^>VGnpsQ$Ei4k{+w$zE8Db zYKtX)UBrRec6TF0EZqxv6MXMvS{#D_G3Cu5fh(vurhyl0}72n?<&t< zL8DDPtHn*@-E1hlx}#%QRhgf3j&_l+UT$?4pjQtyNWK4~+-}>XLB5k*fF)LX?^q3} zyt&jeOk(jDcOx0)RW<63guFTh*#F~RGk)Q2xgVTZZNj*`-JL*|3M0ZKu0BAOFOWg?HIuoFlVp|Z-ao3gT5Xssw^~XHb`A#XgIZl|IV{&#f*w< z*R*%K5}t45l)Hp~1Bholg1|`(Rtt=)BDtV9eQaLNuCRqThUl2Cjyj##Rvdj+nX$tS~PY=R-h`PA*?C8w{!?3ncF*i0enn zw-Ao!k*ywNkl-67m|j}n?E~6IoM$XdZlc>Y43Kv4Xg*a(ly(hK_YE2NSGAN4nx zm>ou_RgG#Y=H&N&s$%SJR8Y>dLqOOg>g$s{K0uQ-n z8qBOF^WUiHi70snNI07I>pCl>cgg&eNgi0R5X__kz(}3ztKkhZsk+hBxWd99Q`AaM zq0S+2csmf;h_)vYWac!s2h_EgX5D*yi$L`X$fg*qV3oYY!-+y*3}VAIfBT0GqIbWF zA%)N=LS-i%Z_j^09fIkQc9jRC_S7iXB4~hfYmg7AH&aCDr~gx#KO$3QY%=~gwR9qc zG4@WBNvgHnFQDiH*&*nXa{qo=eEY+wiX37xZDXO(&-R}BY5^^M%yMl>JwF^|LVK&Q>1;P zs-Je4@f6h(hq%f8@LgJ}_)3pFQTAF59OMfjxc#mkf%$;J7qT7#DTBMd6v3bL=JYr= zzx|qZXE8yGR1ZCcuaF2m@$IRT-r?=0!4cx(hZ7qqay$#bai=D``GKZ-JjJ$^Uu7*_ zvVeqKZDYCN;UihVEsep!J;u0xy!RN45zb#OrB7hpJS8Mb>G{dQ#^1KO`kfJgs0GG> zL5X3AsKs=|(MgTOw7E6i@fp1B?h%1Do0pmKydN)F`YNqrQVlBKsiwMJhHkDYA?+2) zE_v)a$0jfmwy<6YLiFSz{uU!ioN;s|03fLDspTNN$ zd*pPk$ogB|Mef){;3zTTQ3gdGL(t`nl6zX^lzg8Iw3{*=Dn4}{0BY+@%o^hz6wbr& zbi(H+|Dc)x@9rn0?9EZAuB!-UWE3C%DCfJV5p0=OWf(6m6BHqehsX(6O6pu<3t-KY zjCZw^eCV|C)=i9l7g!3^4xa?oJ3a~%*r96mMn9*Sut+L==O~I@f8mZS&Xb3jJ7#Ou zuLY!^Qg$$Gfk%|h%p7jy5mibzRW}-fY!n_TQ~^Z=G!76%qe&$)cN^V7;~u(5tt z7qy(5RLL-a7U2sB9bE2fd?q7a{kFET0}Kairme;g>Pv{db$+T0{oh~+bPU^BLPXXRA9t)u+-Z;jwnW0BT2zPuzjx8N6HW#1_K*A_R+_JDZU&tDcSG;IQa{hQF zfFdws4eeXnCE?Py4ekv_&D+c01n2yZrIG{SSo>Y95qu{+QN1GndzL0ZM*oIh+m;e= zl~M6nv(1}Q-1i>2Z1 z)eVM)7dWlr(Nygh;5u8*B?2%Thb<{)ktYfiYO8WTRvtESb~IBQzGpP-DTrAbO4KB7 zvPfg|%q$RdSght?A2vU^RKUV6qEtPYe&_rngwyl+Tf!~pSIfE%4XtngvSDmg z%x5M?&xaN$?i3+*xz1bjtPrL@ov6F#jx!J*RO-s=l$0efO#AHqB4r?Hs7ROeR9XI( zSUkG25B+A~cVr~;;{=qhZt!jOQ>~JIo*ZLz!k&JCOk$}P2!t|42RdkiXWohET*-(q zY^Adydi&n?vWo?kM?j3SW*)f{H6ss!gWAcscrsK#xaLbH?Oq4*8PWUfR*?U*uaMHzm*#xY?e>Khe?t=b*V~4JXbFh9gHgvKvV55Vq2o2?$r|r; z_T;R>f*Q_z2(=#(Od{eT*4vERXHk1|&=9+u*4nf4yoc*Gn>yO9YFTYJXpbKSG1h4rBwjuOSSrmEmztQMx_+IB}5 zElyf%9({}_7Lj2jJ92xb9+3*;jJtLIzE$LEw5Im<0w2b$n&dZpDnY)m%nhxo^|XN<7~?O36giXmFO2=yeEm}wQf);s~N#Q?Yp6Gpdfv!i1I zXkl>nh=Igkr})?b_Y;3W3bH_5v1NAT8Rkq65Ht<1biNEr85}69-8Hq9-}^s?LtquC}dHk>5pcuTQG~k3HChoNH&5c zY3^eb^Yz7aD@~WbH7H5Tu(x-SD{K)gG!0OiE5B;$Vt*O{Y>RU4ZTXrfklHr-O#6N6 z@DNTK6TZvl7;gfgR`9JC0?xf2-mMQ~`DHgV03$%$zg}lG3j{=cG^*MC5+aOOcb+;5 zbH(yaVa{L;)( zXAh=Ez>I3xZ4c5sAG!e|?D!J8_U|_8x8SK^Mj{`7Xc17F&JGm|B8z>N9i8h;h3)yV zKfYBe!+!mL$XpNr*uA}%^jm!{0^;SvPCwsMxNQzNbtHR~5AS#6#t3+A!%kjI`h&;= zf0x*QSJcJ97iL-6A0th;QvZZC?AXJ~?{Do^o39)6v`Nh@B3h&$8{x# z21ol!7pDP=cG#~kGN2h=+mO_MpcM!N`Si~9P$EW-Zc9qfC-3&EJ?(oLf`zg?u%O5AC7mqAc|5{{4lN~=U zsiWkydq6vy$>S4tVOh#>!4;ejx9z%@amf?E2>vM3jY*F2E*3M`2sSMDC5El5#)Gmv z*+=iPlgdSCQtFxQ_1pFI*|69^EwB7mi#0Mr6(;-Nz?& zJ*nH`bJ3HkqjCy;{+^bHBxF%g^_8OEI}tdeXA8?GJ*^m7C6TDhqO?7sj) z(NejIWCr!)3-pvHuIt5{^p?VF=dS;l4M0&h1BDp#p_VhLfP_=q0N@F$05>dm(Q*=G zdBP&IB_a=-r@5{9sb_d`WbxlqXQaIR&|)GYpC}Ow=GSs6P3XIdR4>JS>3Lf2=<%MX>N+NGiHmz``G^;Mt04sw(%-RE@1BfcR9h$sN$8MXE(!WWAWvQ~g0V;n zv~OkhltY33kz`udQAh(8%t6N+1L-*m?NEN;2h#3&F4HuV@(aw3GB0khJvv16zDP)r z%b48(2NJTq%W$Xbc2--w0l>9&b>j>0^5rfdQfeSOd~oi9>y=UIWs^#)UTHev?9 zRA|22?=&LaSSf*7NQh}Fo+{Ga-6h`-And(ZlI+`n8w@vxGls0EFQiOw9qeGWWFA=8 z3Bk~9(>W_iQkTwUlpJYGb-29+LHFgdpzMj7G3PEKfR~IJu=Si9UI9D0bb47w%_f-< zBMsZeF)qGyY+-gQ;0y{|!0zArOl+FuW=rz6tBFWOwmdaHtp=ibAPIJ&wJ0S@igAwg zXKKD}9Gz!T`BfdW0jD#^(f15ISBQXN#$Cf$v0Pk-94RjLge*fh>bT94alHwhH7wNc z`D!|{AEg;Y@fauSfa(4^wHL)V$s>adF(KuPSoq38&-Toy0r<@583b)T^c{p86VW5< ziuTGwo|xL{?M~N)I-#X1p6LpLb5cGH2|%OPlF$bC4L*K2*iGpVzzk6K^jq3g=WphY zs?4ve=O7|s!toB84I4j(b?)G}gv2qa!UoS=4tIJ1f;TCJy`|rh&}`8HZX4f;DqPd} zGEO8cpw*&lD`uL^f{zz(!7$C}O}F2V!!H&=PsagZC4gAIxW_1oRYa!^bb!8-D}kH~ zNwTf7YoSp~*|(ZK@1N#}eLwsHO=S>t&-OA$2!c!ZOX{bpfpa=aOFjnsi{BF(_|6#9 zfsJ0*4smEmv$hsPd&v3kd7Gan~hBD703)NL;J&@7t% zzIm!Bn_-`IBGxc}bky`~Zd-Vsnle)iC_gzj?6-YywgbF$XAenW^>s2{hjii~CpHVj z!INYVRSs()jU#%1gW-h}0SKQJ^;cZ}uc z3FzEcdA;X=EROt>y4%$1Eg4UYFSaVCHniS{u{MSGE}DyJS_GS@E!RoB9L-il31aTN zUdd$yKTDny7?$v8R*kq6z}^+#qC@Ekx-pyR*Y9wd!Z&(%Co@FB?*lGeZJy8JQYEc4 zQ^|cAE$6&CSeig}EbErBB;eFxpC@qt_jQjn2pOy&b1#;lEprr{ zjwO0(2{&rzV9_R>h#zHAUj8OLTBNCF-@X#8(tLSA`^#Pk2dF)}&arvA4U$DTgUs~$ zOy12fnF1A(pKlVV&&Gb=pM_9T^6tKy;r{P}1wbX0E4C7siLm@%NE5L51Mm12p{s0b z_!;NSEf6)3E<2a>KIzUG~(X3T>^#B?4< zj=zZ1?e#Wqcu!=6bm>?;)2qE>56%T}F;tO&D-=zIk^1nGS)4a8qqZ zI+zDe5$QvOZ*_%)og#$2BJ-Haa8>IK7U`sWOBNBIOL{J@@9zqIkq3=H-TMdgGGt3_ zEz&RYv+~XOkhG&uY^$q?D(#;Gh=3?W2|3;=j^eS{4`WRux;rYmx4EJ;eo zuQzq-Z_~a1u)9j5k7}5ZdZa!=ChP&?_kt;T)`X?)AGoW|=WYFkasezpykCr_$)>Cr z(SQxd-P#@EIPCk8U(2LN3}Yl>6pfU{CFh@8Bi zysY7Qw@9eRg$){ntu>OMW@~$2fk8d48Ajx>-eRi^^jU-Gy}xU=>Okm}Y$vEHOi%)w zus8PRVR0EHaWRSbK(L{CL#SqXyR~*D7!`IzpVi*5b%;@vY}Wv2lnIi=?JR;dFAHc5&c)0R-q}+;g z2vuaF0oUH#@4+fEh3ZroW{ong2?BIGt^gt7N5P@IhQPQ0F6a753j>4AD!P`Qo-l_(NxeZ`a9J0h5Z*L-*JG(V zY>Jg9h_MU8my`-GSm!_| zdNnzLUS0r&Q!N7LpO-Cgb1(0S9uO8rh6Fc~py^S91vBbgTumLXbw8U;5l*16WwnyC z1`NeKHn<8C*YNI%9wr4ZVYZd!2g4KELX#I|9AEtY*2@dL_LNDD|weE5MQHy{U;vIv?MN+#bZ5o)Ox_i z5yhCL0lcEXrfc7p%Su*XY#$U;>JeJ+#QgwvGo{VhQbRD&QeAV|idw1}lpjHHGsNaM z;olf~V3Iu|enO_kk^0=@oT!Gk{Tyz|>=Aj#joRsXVa;l$s>vZrNOezkyLWbfhR{!c z*fZPA;?UfRSD(FY??>89Sz%AH`>jae+;uT#16bNjy4aQbfV^%>Dok}S@41=FBxwQA z?!Gf`>;1XyMfZf1--I5YDduO87<=rhKa=SMDYS3CFt$MLI$<;`EOF{LM+{5cVmo9s zlD>OQQP?S7z9`k0S;lS{ct5E`ckcN1V_ly_ur%0l2vH0<*b_1DjU;8SD5 zFXIP)yF@7*Se+oMwKimGSJ3(p^uhMZr98fKfeXC~r+jz}^|e;+cqq`pC?cWM%PPx6 za!3uY2U`$!{HlHY$>jlqFlY=q|0bY`ft*oB96SPL+cFp|m#~CB z^vhnv>iR4#y1h$St{Gb1z`L$b0zKJp%Cph06D+{J-NAdqe57@vDWy_vo+#T6bv)?t zH-np**74MXb2UVAjB)_2#ImR`A^eBoWBLbb{SW>rs)M7ftB5(pPS7_xIadKI4d|)M zk1trF&><1Sr zt}=2~xkilHX9*SQvXc|YfW{JMghDal|C%d#m>x^l`KXQDk+$jwdXd_?GY+v|PVbCj zf`;7yg%g0{qmD?ZI+Km~O8{x$b|#C~z3W?5t0P~egZ|8iscTrEtLmvypUZNNka+gq z0BLc<{W^gQ{SqxVhs(AfEQB_itozdI>*NDWpIwnn%MJ2JbHF|Xgqst85SzqQfKgFV z6NK|6t_Xd!hrtkcbQw|-kY8J%mAf<^S8NC72#RaC13*gGQ1+~i&bll`%*^pLoXyfB z>WF`6@Q+;G&MEx%N7~!^-P`lHk^A@z`~twh;i0Bw)Jy8{0SYgrFg9^K!+U~Y{Rh7F zku^mX2?~BTcO}ZXk?N2>_n42Ggoq{b769%;+eh68&fxTdQundi1aY0_tcRm!MEQoh zXD)6sgG|I|{75>_$1Y=qPT>)QML;9dXz@iy1+D>~FQ^-0V@;0CZj2r`GguNTWf{+w zj}@Wjr{-hOOfsx|ad#z4LwAJPb_A^ZzV%2Y?zKvL`fAkDM$_B~ZR5wC0GO@&z|h!^ zi=8@uL{fUXMz#i11f8N0@mQK&#*!B9kv3qZNzv~7h@{w{-OLY5;`OvqTZ7S-(jwWa zy#@OPXQRSwEIHLhBb)lHth*ufATuNoS(GoOhfvzb*5^xW{>l((57T864K#ujA(BT} zSetH6bFob$>e5qil?bFntm=5Inp?8nHD8jq!Ujjj8QfW-?Fm6?&66OFNE{8AJ^k>C zm3i_ZL}N4w=)jtRv7~D?L*9zeS}voK*ZOJ8fjw#@UOQ?S-R+z<6Lcf(Yj;5p3rBC9 z@q!2Sb(7!ToQg7_bVkO9tlK%I>sH?W>rm3V^K!~UlTCdqC^kFzH_Jih`=!W)X$(Nb zUCkh3lu(>Nx?CK&h`uAiI#-D(w(G3XlB9E~+0sqdY`PLo>I<2B`*3%7)=aeHwKrXd zE?$k7q6>%B1f&!ubM{i%UVy}!iyq#~Z$E;Z7$76S`<$Q9Z_wU$GB9qL6I~Xc5yPK> zyu&IO^1#vg&(((8WP$^9PQgL!7zgc=2XAg+L{p5~jwx@AF~m%l;g8Ir3HK%)?GsH~ z{=e!FX^uR~r6^Ar6AOx(+ej%TgeZH$NgtP>2N*IpAti+`h2i5v2X56`LqqhlAP%u?|ZcvIocfU z(kJ+&Mp&V<16i7jZ3)(^Wv$o=;^p9V|=)3hk|K)k}ct}9eIp&?HlAH z)BuQo+%l;A9DpbeVX*A=mD*Pwk}We&rHg2X!6e+%Pci~s(%Q30UZQ`FKn|$;t$wLS zLxXz7{4GUTNj~rpNhc}oDe3++Yx1g>5E2QMwax*+>7XTnx@kY{eOQ;t4m`_5h1sCW zdi{gWElB3gcI&R198_7o z7fmTpX?aNU_$(6dvla*xe&Vw1%qXTUQ-jj?STOdq3K4Jw0eCF41^!@VEgf`!wMtil z5M&h%EJJ0 zXp=D!#HYL@_1O|sCsf@rHeZ6Yt+e1l-ZB#J;=(SmeG~W3;LW*yMvszq`Q|7u_dCt-Q{!%@L&k@PBr<29?rU$}Uv7lit=S2WV zK9wFD*#h4Xaj;!&(n4D9gKC9j(WZK*WMf#^}tNEWWTp6 z?rUMK)_cP+gG@4w*JAEaUc_%vatenC{mM#`m(+v2M{iVlBQf@1q7_(hk z_JJeSc)f^pa*GgSvIR1wUcbotS9>}_)eecdu4BqK;CLfEaDe@cm2$==c~*M=lE5R- zi51Lu>jR@VsB>wyyE5+lklOK*ux|l+oJo`(l_jmnjSage(0>p3gJz2rA3}WxqkczH zCAx?aG-Y`Tu9KD(*siA!uhZh$m%fPdR8TByw8D{`3j(F;2GfCxp&V~8aWt38Rc(P?=OO&^%+J1PT?c&Y~kY3>oMD%)M~>ryUtgTA3mcPM&r2P)TMN*%<`? zUiEyZ*(cUt?FvB+xx8%0hbpM`6JU96PbNuJnK zqSR`}A8crOb0r2-dV?-@vgRKFRX_5BEj@cbdB*?l!Xx6*QXHI`nT`d$waxtN-K$qu zZspNG?Bi%LMyEfS#Sb^+ffhWW#NG=a_|9NvP)t~qa3>9$y3f+66<70EP1Tc4rc?aL ziyEDE1hbUO(2t_yCxdF45n2U0iiLX;TZGk3Vp2;|c&l)yr_jn*BjH3YW{?WMTzeSM ztRd0K1yB0zkW~1z+cA_zY#=l0Y+ubGhpnLqMvJTK3b4fX_qf&xzSmaBM}?9|kqC(H z1#L0Ra&2zzJWU*1Be z16{}8q7Xu2U*;z`?mDB2y@@>LyvQ&wo1h7arB>J9u+Zim!PCQ5righ2F2kt@%1FEa zyp4&Sos!efR7ZbzvweH%62veD)US#27F!a!FcnOzPu(A{TBp(wK?G_p`M>;zxmOT% zImS|-kK%7juypNs%%#`p%379}q5oouF)4uXJS3JV`nVsN|Ks^Gm`$7%HI@j-hpY*< zI@>@k89pWUW+~hM>Tx+)eY~*8L%CQ|ggjLA;DFY4!M!3HuDIjRF(ydNI@e)r8}WMX zxiQo6@q#hqRKZJY{oEiC$=h$SNm$lm=y4`DAJT?LgxeK(rvzloh>V5c^8fuD$l|q} zyb?{tAHRcHJg>>9Sc2^ui)5KwF&0GsrgGqDvOB*Q%K! z2ek_1C&Sz}?&P~s7jgBXkGMn`d85G>TK*YZMwc9T?pN#_>n50L?aW*J+`Ad$rXJCb zz=ni1AbvFnus+??*e}IPHgo}NqZ)=@%bVHCxt3~%tt%V4&^{IyiTm}Foz!IHV$51l zAM%E_YjHSiD+(+~0jeE-D-vO={$*d_&GyFR1&n$y55vwP(%GCnpkeR-3fj2~s&CrgY4$a+E8vC_4zW9cmR4Jj(UU0^RBxuXlM(G_ zn~H*P{p~PxH+{hLJnp@qdM9OXhX3^CiKVx&g3!7zc}xPe-_rAEalqy_?o1@{YA=Nn z$}Ld~5aDM)EcwJqg8nV7I?MXTOWt0eoujoWTA00o#0h{3a4mLzFA}fD#nfagbp!i? z7)=*?vmqJ(^BZ{^(g6BLOyk#;oaafuRiO_NsgU zNevk2j$8v^24t^RRa<9aOS?^Gb*M1-lp`j&FK@yYTnW=9yPoyq&muYyk9x18-aRYr zYZ|-+5dTRZa_oaDCr%2OWQ7E~AVDGx@vVNDHjmTcu4H=^{sl0tWMn#&q@B?vyIU z3sl=6za<6^)0_yi`Qk70jt=dE{Ygg-msoAyCCh<3KHQwfaD6<2ZGHiwpbukV*eqT0 ztuir2c?U;}cbZl!3nJPxc^Yo*U2!sD(90W_QC%s<>A`|%xe~tJZR_?hEITFaiw)ds zO~Sk3sT88e8(h$`aZxl6+AX6(NH`#6b}}ocq=!6Swd+j(q~TBM7mvnv45Gm=i~`cE zAgAydlqCbM*IJuv2gr-}cp?-nCC;iPu`CX7#viI^?|g4e!Y|B+8!qV7Qyoly4n#fD zPMkb65EBt1tR-+9TtvBzXaK-fPaZatV7`MM2SN&G(TgT9({bQvS3Tkb**{s?EtS2Z zI@sdTswfJ9GBGp%jH)_Iz`GxwL84L!8wu$SFon!XU0@bj1vr91arXBk*Cd9e!Ooms!U|iENl0-1gDEUiXc1`4NSmtJI09FBO(!x%eDO^YBx^twZNefB8@0!E? zDMn&^fV%VdkVpq^Ipek5*<0eS5$Fzc17pxmYa0!_oK}JAzw}vhIF^@hlby~%>*m}Q zUMR*}S$A52I;{d$XP67Bs>D2Qm`%^c*Ics9fvWfF_TjOI22#z7GiN1>g^(N$m{iNV z?!w_ECbjm#khj2&CUQMl;CZCei|&>pRPIh*MyCoC=sVp_1LUX2M}`Q7N6%6 zl?CIpmOJ~j$)>$PEQ#ojc)|ZP+W0cA)}AQWNAll~_wg3~Mg-**5Y3lj1ddAY%|&{4 z0C<_Z8Mb-r;~dKyY+Mu~9)Gji!f_XOg>GRFNnK6dBv96mx1hk;NMG*W(%Ol-pjGmv zLPmpXO^K=&J>Y62>tiKXHmT^7&tbU_^)Tsel&#f?g6qL(4F1#v4kUC^0m{}fi7hOE z#c(jzI}PEONXGhHI|e7Kq*n_xAaw)RanJ~wUuff)E?t=%MqO27(k88`aBx^se6`PJ zaR`hlu=34uZ9PS|CwPft%0Tk4sqYbaj0E+=+4V=rFvAv#hB((Tx>bzha>)RXPxmVw z4X~+HlE_GD1EEpBiYKRSYg@!Kgi=fNj-y6kmXF3+rGCz3`@Au&xtg*+%MEk%b(oe- zrw;pgmz>-6(AdnE!IF((Ri-!e5W6c=bX{30&Ts7t8-mIf7Q;;%obe9|xPNHmQivN5 zwl<_;DE79E4?Q-72l9MBGf`6SKb2|3YhtW@R`0TAk|9HoK?k?eq3PDN5rDz_R7{7F9Bh zgr@5=*`I6vaB?}2gi5~Ce}|jk^*i`zYIE#{B{LFUbQ%3jW_;PI>9MMhzXHbGnsOO5 zlhn|Ido{E3|1P!EYGyka$d8OrJ+xqU-B@(dq6~U-83^)*szW|INW$Ee>glx6@^-ANC<_6%hr}s8_j*aakejZLIzTqA8ffF%r@J?Ha3agU$sLV z+SnDnK`}7~)Y=vvZ>{_qpphnj96sn~9^1l~<(^Vp83zeq114DJ<2q1wR2@ODpy}NI zZN`0?(oXBi`>^CoO?HOqRQ_Iijy4kuBKBvRwKs==(UJ?oPdnlAx8!gRnp>K(J1|Y6 zoM=>Oe)lRaZL(B$$277|OeY)zO={sp`F6@sFt+8Sm}daCbM>)ix37zDt-(iOMSRJ@ zV0cTyoF2#U8cUiJEPc)NKy@KL@{b*MnqbqzS)AmpdNn|G$^NkyEmYzFO4I#-#6E^` zW9H;io!VMK_S=;sILJ}q@4?SHUAq}&;UnQ+Vq%F>Bx*SccJH7yMl+{yDh;s_SE{sz zAPAOj_nmG_3)s*;V?Ya80-(F$JqwxH_gY#~cGPk0%W}cvlmg310@C4CAnug*o7b}h z7o}4jvg38w{1=jc1{T%+3QE!CcM<4ukOQ z%k45&tpi@%yM&$Y1`?z#VGKuHGw#>MG5;+O73MonJsQY%pZWnX$xSJu290joOHqc3 zff%D7O26*$?Is=nq6EGyRxKVXLoCIG7p8B}((BZU_{G~E0dC%|$n6OWHt#{nHZ9w? z|4y|3mdpo|vX^--`tV}DI}e^$gfKm@qefIwd{{-M+B-(n@QwXAo-zy!Nlu!{AzaJ% zk=mUQnUqO;?~RvakSLy}yh(|LaB9(95p8U8zBS&L2iEioaz02}k2uJRk-{wU-Yss3 zi%(?)ajt@`C6y(u)Ilu{bQiH+nQpM-(*6%m{1cj(DSE)~6L% zRO~tekVVP}Ribw6RH?v^OA$sm3F@JBZ023Q?{c$OJ1nQk*TC_?r29Oz+IOcTzVQSD zHQT$VeHLMDxf==8yKL#m@MMNijY(&3IbIb^1hJ;4)RVfD4u_60FerrgE4@Ksq-tmo zLv~|(i0Fm}2vp}Q<{ZT}Fe-V|g8jon$ha`xW94y6Uh?&LDnX&TQSU{`Pz-nQ_TZiU#6D^-$jg(4z&7h>R{& z)pU7_pOkN8U#VRfntjK?6J5^!6z^!Cp7udw?6N6Ul71HK*VECzC6D(ozv$<>hNUNT^3EI zX-|PQ2yT2IOlkQ-jf%4OO+g(GDSCj2jP`ZPu$^!3xcmlq^1@0S7suH2ajg-1+E23g z8E8wVSEu^!xeTtkur~IU4Whj`>eSw(l2Iz);i?JeUtN_NvIYya|2itooWKvz$o|mt zM~8UjZRWp|Ecxj%UvRqQGWo%O$sojY&m|$N6f$$Xih>Y-CsZ0Ce!(+-1!3s|`29p? z9s_V%u;^dGkh06Ck?CUQYbO)mN-5IMyM9|(9Xod^>4Wznh@VS zyfBz{dO?t3d3|rgXNO}3HyOI#3^gUD;`w9EmfEvS+Uypt6Go9#k1`dDmpiTC4mH72 z+{|%}>0#aOxw*S^DC7}vj-M^vj0V2h2Ln?wF}a37#Y}4CF$owlQFA)#7~*kQ$xnIE z=%AB1JMSsqRcT0bdaR7`mhf3%wy4`oRyGr5VnAx6aWx041Jz|3AV#wf0^NvDhlfZjx~IeaZPb-wsXH3}?GlkDjWe9IRD zf`yl+PZ(X48u6l}g`zsD69xcn#z_)2+T}#jdchlY)%cZQVeNr?omfW!wBuv|`FQx2 z5EkuYkQ*CvuaY=v$WqE5h~e!Ny7VNX_Uog7rz}&#Fe?auvA{!S>FlO}2HJ}Vi1g0C z(F#x3?Wj)x#%xDz;~2UTa=)xBTh<7lnT18@Wu#>U4T#1XH0n$;;lbfnRAE>9s=t`dGfs;XwoEUyQmNsi{bVAmm19ByX znOQwoO@z>G#r=k^HTr4*O%rfgW$pT3vV?q^^ z)PNt7*|a+hHazi&P52k^vCWIixiek{W#f3E5g}F$&2c-<2L{IH#c zNhcnpOi3j}J;5lzX~Wlw;-9M~RiKKbi;b(LySZRM-**^PQAt#cgero-ec|qyF%cm2)W4Cq?4%R34ibk%t9XarwqU}?e<{*r##u(tGZ#~`2kvZ?-Ms22pc^^nQo(b0y0ru^%0?;TgP?3;#`fkja| z32*cm8T;)8I%^I=@%e&r)QW34Y+!4yytu^=e~3W$j?)+qafefyj@siZd@+dV_xsUd z?xGe4Mu}5-L1ZaW>Qd>2k)i|o#UL1i3jg|dWSAE{?r8B^EH!lk7mHMUNzIVfmn!J6WSJ;M}JmcCf z00<;6jW_E9HL0ALt2-(a0?g{)g>=_UPD}`Nir-sn66@UOv~M+L4onz_1M2ic5`A)J zqr*@Wy1stIj$o-vSOBNd##Y`xM@yyqfH>kdij-0Yez0lw`nz?Ursk$12coc=gZdb9 zs|jb2rG&~Fv2d-3Tl4i&Owb?hFgAMyjP5SswATzxw0=Tgc=yl&qA#ad`)m7-X74IK%Iv+}fY}Btx*saWDdps|h%$_FT>uQvmwgf!e$Pta8b?V@?xg7o|wgyV0@+^L(e2 z;SrkhjoO}NDpUEx4E+%0aX$>nO>8)2ajPWX41PiS{e8`}swfb+YZK5Jik}o-ggD1x zMd;0?M`+{ir0cRl?yVPt@+3p$&Yz|ec-BrEgE%0l&|WqLtkKZ7vE((%e=w_?^d0=B ziOj(8sc5 zh{`)y#4LU~9Eij%90VIQ8N$}#r+zzY+qGy~Qd*`=A|gnTs+7;s-6bgt4r7oZ8*sOt z4Z;GBa`q|J>gWFdFkyVn<=du5#>g|M`Moc)PIH(+YFoodA>d$&EskzTFn@J%hzg9e z{r&b_mXA5&k}x5#k&V{KD0iBMNc%xhb-Wa~St?S{Tkk5rg73`Tl-=n20aHt)Mb}et zvH)w1ob$96ae_unWklcYrS7)u%Q>dd_2BE5Mr0iq&i9GPlj$s-Kv!wA_Tsv4u_9J z*E_}XJLdQYza;(?q~=$Nf^7v3*8v!hJOZ%95wtkgmA7VDwg41D!VnoT=D8n~=F`wZ zc(#l*8w6`TNe|P2StEVL4aw^AefQ{(_Nxjy96x#T<58g7lGF5Q;~O;IY)>gOW2$B0 zNtbZMdhW>oH@xWOohx&w73_l%lQUj-)_ZJ$e#`+Z0I%2DXxgFjBv#^x@UP7QDkr<~ zM-YGD8#AKR-U1$N3v`tt5)vZ%>*u);-KjPC69yE=P|!;p5Ra!=CO(*kbnkLE3Qy zC%Bve@zMd)FaZ3!Pw}~ktAyGM$#8kb?8VyGXgnRQNcB>GnxR#HpYi4 ziL9MN-1ND}AaGS6@fy))LtFXYiC2gYB#zt+rmllU;r0h(BKB~y+L#;x&~Jf7ALNS; zJ_7UzdtYujnd$yMS5dquh+q|O*8tdRa07 z98gWYVEb9^sDMA4#n{fKom*h_8xJ7gSZearkp+;BR zxqt}{6MAsI5+0xeH+4A()B$#-$Z-T+PVdR)XR4FSq=cx2E2%9NB28->%4q* z92u3*(UX$_!r${IpaX@TnL~W}-)$O5JO`Y$2upqI>CJbQJNZ^-XTQ?g3l4ELwlnS9d;%*|x3X1U+Yk^R~Yd4EF0U1o_McNMI3FTMVo`x?%| zC`-myQyvC`6rZU}8INd8i1Gydh!duAb#|J1D+||`QV$VHDXLQ(Wf29V|Jk7n1RhvG z*i?eq)?c%y4w}Bt?%N}n_)`Z?eI=9BktmKVjaT-3$hWtgOup&HBr~CW2X&E3omy}z zy5PrO0>SDq6l%-EMR!WP?3NHs!()lQaR}h_tt&57@(`HP@#yXmPxqrAZbl@poGL~zGR?!fixU7n0iFhV|2AAk7!lF2G0~F z3w{5I1c}e}tz?_#l5}358GI9zy=vMx*-6$Nn4LqBlP21}ETmO7Da#gr695!CAG)pL z7P2fRzvs9i%58?I*M3&)Z$P2R?|Ci4dVP2(Q1gi}!(X*?g_+m;QAr9D--0asEisVK zQCMhuE{2Pi!kK+ynm#y6N(_TQyW*`*09J~>cJUT|?H&WHsoq+SP7hD>dH zD%h){#s;;iH^&fuG`Hk$$0p2{~sj+?5Y>JdGO}5(=CU*nNzmU%hHIPpg=9(Y_}-Y7iq2^ z3>c{4K2`rp$;e&idrY~4dikf-zA%_p2Q9k-{aGoduU1PS*A=wvw+icf`#WUF`PmF@ znYM{^Hf0Q_omyN%9)KO&S%WK=W{aJ|v#TF8frSEj0zVC{rZHoc^LkL-q+f$r9tPRV zZ#T3L#PI}FLu*7A1*aZs>Q z?)W_4B6zHr5*71XZKgh&aQUxD$==~<#g~m=?2tk|)E1qQd4iWRM!`ue>x?&wGV3bK zTI+9wJSgYtKVw1oCHDF1vJ74fR8eK-P8BIArjoWjiSSP59M5NFzK$r{U%#Qx9Iw%c z(MfQ34H5ynJfY_WRzdF1v|3A zH)KVze!wWm6R7@nas*hr>K9pK%UhHcODg3P5cWr1*J+qaN(Dlb2^7qGWv#C&L5)mS z!4B>q1{`?foc8atpsZ8nWmKs=bAS%mBAyVE`Nfgk^2|Fijy{}(F55NgZ8N-?fRa}U zp3?B(Iuidme&PZ*AY0M54|%Kas?B5hKRtg5WUcbbn?$MQb(k>r>vstF57sE7^hA%< z)*&cMNs^ZN`UnUD*Z8kc3eSj?m^|>3dutqQS!W3+O0mtWzxQK5c5z<1=uwYG$I!-D zgL8#$7-fR14fGgdha zq1w(McxYUg;mH_8iFa*$FMakZw%?_dSe9;mOamSa$d@%J*zRNQ!0}E8NiaVeGyxnJ zdaJLBFSV*co*N^yDi2e3gQ{tYdxciDC&C>2MRp&AC6ZXq4Bwr+++*PG@;z`y5|r&& z;waC@_U!ofhQ<Px$z9slByosMhq?h&+V4`s zx-w>@;FL5Mg-{j0ZFRyQ`}-d*UJegOJz#DwkHP~mPLh|q)ivRDL!5rs`WM!oPLZ1!zSlag zd~{wnX6BmHISYC~Nd}A^s+dxd06##$zm-xIqy3}@Qu`OL&Wl8McshXS9@b;&LdNzb zOU~Q3_#>EWb6i8@JUynbJr#luD;@4dDSY-yVr8Rku$vIq+f%LqRtW`)5py*WtC$wM zhV^Y5SIKGwT_+bszDXPFTfnjDd~}jA9GqQjE$&KYkWd8<%qZXf{Vn`sB}{~NZ*VKJ zZyjP*^~K4iOkdIL&__IkA|$0OM0=t?(g>1Z@Z|xndvICb{%R4~Xa=Kr+{FL&Lfz$g zWFopNWPqT7+*@;@h=R<>wK-z5RIztI4v29zlDx>ilTpd_S%A?^QXbV2n3=|d{zTW2 z|HefkT=CsY6o?Xv1qoa^=Kw)Fg^WQOmQHgyG-!7WV^^NoHSq&wtF2NHawqqB=^LzX zl*Z6X{@J8VkoB~w=1c<~BR50|pDxW?0X>Gf&d3-_T6WODQ*RTNaR0cvrbd&dX1;G` zxWT1>G-XsyzUbaui&p+^e;#B~Rgn=YzE&sp!u3wHFyZ_y$X9P|KUlzTSXzuvZiz;$u4VdC?lAwQN(^KB zTVgmn%Fc8&TX7?}ikRe+_o_er8a-3Emrf@}Y9_Ba3Zt!}O|pUS_{XJ2K2X}yIKvu* zOj{H`TIM8VIvM(E!7Y?8rB0*RJ22!iH}JOWb;h^^0^sByTd(JkZmT?< z>>rbm1vZriMZR2}HwqGlxm zDUNNK^{M)HA0(O8lvtZ&bfJWS8yWuZ?USoNsgRkXXDu zV6?t*UeY>kus>Tw+m~9)Yx<2<1JQBlL(B=6R7?~sTH898I}bRQHd^r_HS2A?8svL! zsX~3d#DVrM^P1CPA00f;x5!7tNwUnB<)n?02s&+;k?a zgeQO7sQ_|-)jE9`1-N4h_Uz*)m~Rx@8O&98Q=s?eLv%4HrVmNr>{I%iaCld;LLN82 z!vKG;;r{#_$4|#K8@-^Z)iU?Qq{Pz9`+vHxfJ_{bCdhQ+b-O31QI@#_wTAL-wh|7L zWCC){8IfJ+y!9b@ZhMs}X_A@71kZfjUu1^j(%(9rw;*@bD@EEg5Q#*xo}(j%(KW=q z@c2QN943Urk${dTb4AbU-MI781YzLd4AncYjwT`9NP6+BGW6v_OhG*4xeLct+MnRZ6wGv@D8y=ApVM7Q78ElvOp8(Q_STre7PqGyyNIT<3`_ zd(oq`rc3v(5{^tiH=L;w42K@>1THUt@Ri@kgrCE>jL+Jxt@^qAli}TYAk1#Ln<;#% zWf~NlC8=4v3b8NXaRN~o8h7!AOcd?QoalaOnA86oBTt1Ld4OHu3<6^l~wAho1| zCnmxS4xuXW9p~JT0LL^H%I$gDn{ejLapC9czn(qsxU6Waxd+OJX&cj9C67Mwe+7v{e{gh>gMU9 z!ZO7eX@$km>A^-MXE~dm2;~aM-ReFOcDw~2$JhambZgLaM)X$)H zd9AfjYA#xRJ#hC|k#yK`JTZl`gwP$x%}biMs*5Wy@mpfWu?X*U#R zm8#3ZW93h^`>}jOc-g?(9WdoQT;mV1dt*)RSyfNj_AjP z+9!L>w>3jt5a;bi73f^>({VSq6K^W^dh*9R3>u6*%a&XUeG45vgf5 z)88u$&#f}=${6A18(3h1G-~&FmgXd^X5~v@wA^)zD2t0?MqKy}pw@7PTVB}TGq~=l z3lXI7O+j{i;7%54C9;*+7QM7j4C*C&XlWxxK@yx1?nv`)tG_s<=Fz1P&=g6Y*Q82) zyBnA(gz5JoSNaoWCk8t&c9`l#OSTWyyzC)Bis-UitOH*nN6;^>4t2Z=gl;98F^%Zw zGqsxfwY{4(6_Ax}Y?J{%WJsnOE1~+q^-#(1@7_$)Je~{7>`CADG&W6zg-!h9)U+lf zjSzBdOr94jZoWbNK789VRuWPJHoX|8^p?F|A_hM2c!~+S9dXy1&4{2+S6v{O^lzB@ z*hFjo%z??9#mqO-py$kn6nq9x+T)myl~IGRbU7aQ8=B&(mxOGdGfYP#C6d_xh8P_X z_wsfmn_?afV9df$e(sOAEuc^?QmS0=2~Br*VJH{o_}hMARJ&k~yh`-;BYnG=<4c?qWA-bx#M#o}pr znjscCbxbpi(=EveUVoy2KBS(9SovWPzm1YCKA?7BAmGsjm2N>)m+okbgS~rF^*fO0 zdb@O!hcS!KaNbp56{3^Y!agE3sE_u!$k|j_MTc7tKe--42G_+vyrSamH5|tzmp;>E z7C=Lx{3i3xq-#;DkS~0yZmzs|wvp4*(ikDKnW~YXCJ+HXLlp+oH(US86zcc9zysYb zD>vbGO57T)OAA&mR+LLoIw`6(uDef@f(j2OUP(=vNpili&`F%|6DmrtuZA;#87Bdi z4^A6(6KAjDT_+#gN?}l)UL*dy8|S z^%a8fOUkPK= zFYq$|E_V*0F&TC_iu{>c;XLlkpl<O`rb_5x1Png!oTh|Rerj7*9xS(xF&o~#j!D4TD z3LC1PNc-S6b=acLJDndZ4>@?w#oGhsaKfVo=1v1cz^p{ug;N4#Y-W%_Jz`3Y`Z>{K zx>^G_Zt$A8$MP$`N)M!{-TMK;YzoTNh0KmyDMa73W9~`}TiTK21z_mXD2J>@-uRse37RYCTSD^au($L{Ve)Bas|*s0r&UX0 zmn&V|$6`de?~oBADR=5Z^6@O^&#vP7sH`6^u6u@i11oGx0-Z_KnJ#d%ocjS`tyh*M z$5@NusQOg=-RwX|!-8xj~dCmOqEiY-)(#YsE2$3^4NRmpZ1puB!#ph2x z{^3IQDfTTX_|iCEs-Hu1O$Er*b?*IAuJn6Kd2>*q*(BWM*nLiSrELGhB>u!&I!=NWA@FF&w- zakq954&Im06t=0ZF)-&kDcP$2xY4Q{PV5jz{t2-foJOXm0)yhBjw>QW>nbZU+yYoN zO%I-lTIA37p@DLX*h=?1ma)?wM$>VC)9++fI2>3z_Nu-9bt}|VJf@Z>p&;!{${{Vu zHb28mvwua*Tl~|e5L5Eo-%0Yp9$J<{%!im%O$T;Ir+a*K-92BW0_7yPT(I7hS-c0tBr~Mga5?s8 zlc@ztJIzvsNhm=l367+T8eHH+*HJ!A>b6hwCS1&q0h}tl=Uj2Jcx)l1vx5K8`=U|{MypRQM#K_g|Okwxd^q`4yH>y71}@dCJwTYS4=$gA z;THv?Kt|P#7eag9g?Wu2fn=q7u+QHAZh|yyOugRlg3AN|v+I z0%YIVMnCKZZ|JT(%+1W}>3IrV!|+ed&)>hO~AEFGRRIQEfsj z#_nCawyF6*2;3Hqj)Y_LIn2#W3s?tH2ng+RgTD)qos^Y{E0|CJj)ONHSkA1I`NkaD z2&8{^`)+XO_VMLFG{T4D;?w)u*G5-%aPQ``J_#w=STaijv(MVQ{%y=!*8ZaGRS&XI z3x74BuPw!0XNgGcY5Oi4va)2av>;`|M}bm}LE%}q$UwO*t3_TA5m>??ZE9i0QR;lW zNgpj-_??l#6-LU^HrYDgbPl*)4rnQG6iT**h^q59 zxFJeN+nb~5S0twe&TF^{Om{@`5Bk)!{UqGb_{Fp0f&~n1R-K7@olppQ{>$he-J_f3 zKPC4Z)sPUzT8Pbf`Ov_JZ4IME66k6N7_90Uk)VP>-En-pZ>w(^Oq=Ho>bPuYmIl#8 z_|d|DId01+IRj|QbTR6Dp~^yJGJpQ*#aD?)HJb9+{Qf1vPZ}nhA}WtS;D)31ym^bG z=zY7vU=^WNnQiB23^Xs{^Jjmv;>o`_hvZR}6Z5HyJqZCfWEk~fCWk51p5sDpjpM2< zOcbWjdbp<;P2!&)T)b_N-1*%{+!aSX*H7TB5*!^5q*94QCo|V|7p2L!7fLN~GC+=+ zshWp;puQ$IQR{8*NTB#TuW%KrqjjscEy){SROU@85B~zwuVb|a{o-ni=}gT{KQ3;# z_(nwUwKS10p|d4P69ZI74fwa#J4!^p+mT*`3MKdh+JHKdiO7{v?)O}hunwiL557zY zG*r;hky>QV4G^-|V8_^uwS(D}ft$mGRK@t6?i7oxf+F`VNt&?yMAO^u4KFA6|zR&X0*fcVzRXG%tBk6Du%pc|9 zS|4AG9oes26iow(5Ows9`M&ckh!kUE#WKM@Iq=3ntlfms(#Fo*Q5j^uomX&puDO^n ztyDrPnP$N_aa6v{f17FRudiF!Sp=6n?2R(>Q-YP(zbC$5y6c0Z(BHlR6b0<%TkVC) z!Es)xh>0u1x}ewgV(2Auxty}tsb*Ovy{d!CkT8a0FBsDSLGwdJDv|Tu=D;l&4K&f$ zzzg-F+>h~snYl1widQ|7+oKL@SdGOm{kUWj28ZZI0fbEf^3CdFzomu%*tPlLPd)GcR*Q`XzR%DYZ?ddhVu?WGP>UbZ=JE0$;=CKZ zH>{v*f*C zZ+s&kEQ;|OHv@Rg87P*GMu(ak!^ciR1qy6Um88({DC*Gu=dLDG=1YrQ9%0YC^MDX1 zC$>Nh5&M$it!68V@;;ZTCtRDHK`X4oXl99)no%@yc`U z3dijh*!`C#RJD@#R6QvIQg2=z5n47P$Lg#}>Wv`5AgTNP)B<3s+j8wJ&;Vg!ay9VN`{FuTDPEyc zPx}wb%02=dbUmbA5?foNObhg;ZXb0{!ar@u40=fSfoxTi2K1IVDG?+fDMZ!TPD|A= zO4wdG8i%fHX4jZFqDGfqYm*Z|G$G%H-KEPi!0T}5PJ{%zPGB@pj4%&N`9fH8 zlK}aaGdRlR{TD;1VL;4&C5D zK^-oH^Q*i;YABY<5!28G+`{JWsMj;>HQbz6N9jt0Vhsz$nuT1b>XnQCt=F$|llc>z za8|)vp*pzdqCE~;ofmtK_&!?UjQRd;cg0#Vw2An;fyKmYvK8}KD~Ms-oqMah9QO6F z+q&&`d|nQ*2Pn*dJVb5NPzAMZW@W`;P*k>7S04mAju(i`7et)mWqo^uFyO)^u{QC# z67L~aHp%xww1)wRLA=+`@lL9RG=5>XSWAUrx22n~T8HI}$+^gVvanJa?hAPBZFDG* z!_i4Uu$bK_|F803EX4?dIMG~GtN8o7vTxk3H|V&iG36?b`58LBIZq?O?!c|bZW3^i z@P=~I!g~Lhb)7k(6ZG z4=T|va^OK#MW%qAPA@>wW%OckzvbFtGHaP0HkIty1geX!LQ&0}ZXnTpU(hISLQ}s2 zJj|Hr=^l~^*8n)5WY-;j4m&Cwwke^5r&!;yIOC5{5%DB4@cSKk;D3ylR4$wbxBf>C zhE&*!S6n?j#HgQ|7d7kEjxp^;YQNFyY%g!aP+SLuQIn^)2Zyp=CrD0d*(JB+eQ+~% ze-fLAdnFSvdZKSSrC$W^CY8LB013@5`cJqT&dcWE7BNxUW*cXBa!G-UX_(#br22iAVH>UELBh3@w6vhwsYNuqGkQ5*swHr|)Cy62Y>%{m?qk#UD&*CmA)Sk%X{T?glDz!H_4*qk`RcyU6`8yFE z8sha^l<{(U)&XE_8cD`QNEP0_cq@3FRJdm073)t=F?|vqcd5}KEU{6(2+iy^jXp8p zD|>iykMU7(iKsy#O4%8kS8o-Y!2Ru(pB>_elI+gIo{9`#ysQbK?tfsCKYcLqZZVuA9r)LmB>3u- zdHJi+7=}!d`RXZ2DM@*I(Ak}i6X_E+4)zM0bOh52IcAtbFo17T)398z#0*Kt*P|~K zi*kw^3btraE5SQ6CPn$Nipf%ei*fKi^JF*%UwKFqVtDL*f5#E)wpmuS%IDS4LG>XL z1&KjBscRGQKNgY@=I{7I>D3J*45BtwN429xeyI4wQ-imBxOYY|y_T>QhbEHpkj0&P z81ZXrS0UZmDYHd{Q&3ixmleC#Kx(VrVHG2Spu7F#|O7z+dw&O5RBA- z2HnZ-uAm7e&ZP+MYc9?eOK#IWW*#EHpx0SPcw^?b1_- z*iQGb4f4&%?~DGu!cM$6;Hvvuo%HD(A2zp_$RTCl%rXUu$?=iaOsiHi7~f>D0@?;) zGM`&(^BY$BjqC>NQQVf6$2At+%CYXSDu@o~raB^l;)9f;PdCI~FuleNCHu9)e=3GF zEEx93YD^Uk>w{=lk(H#R>mzV<+hT7hhf4kpBePyU#MYdWf%nfd0J|CVcp^Xp$!0$K zX@IDU6TUEiqJeK7m;VrsO-*W?-6hP1(3U)ZuQwMWE2|I$Z&^$5t<==+BcPAMstrb5 zLqHVFFWcmAMss$(hDq`U(`C0Fd<1Q%sWecrVHmKmB}fAX|D<7&O`L@C?}u8?1-?n< zUcffQhZw^cYPXQZRF%M!)j(%qwRAPBD8$+wKf|BwpD4`SG~AQdr4~%Jd#i-u)w|Iw zN(g*p`n-ZMz|DIY+hl9V23#x)5 zBE0o_loSv|jl-gPHFK}d%np>OMosI(Bbhia*LJ->;EZmPaR*0h>l6_^q7g*iCP%3f z+?0cHtH(cWI@ZU$*P#N%w2gA*O@;4yi>RDynm(fq!j89m^oyi!m7BlMZwmWt!7>5? zY_kHS{I%FsfIH31J z@jlMxpCcQXVYX-175<5XjZMpD4^fDPlH-IdUQ&N(h*+7kQ!EqY-b0fDs=>Rt(J`Y6 zHP_QtCEQ{i|655Ve_B^eUvJ#N41`|P9Cs`{46aPSy6m0^y)2Ak?1-^serx<%eafN2 zJeO7Y+oS)7DSGA&b}#ZKP#(V97}ufKMa~WB$)HXa-s4%r`!UltAdjeTxlGAKR$yF` zihA!X!st}oF>v5)%1OuAdl^dBxH0KjCh+=x6Lij<84{PI;yQc}H?@P)4&5!tS*BoE z>0AXYtPu*vGyx+UQq$o3_u7KL}+WD$~0D4z$cjX?9(r5+bXI4T^Ikuut}z!~EtC zfU$=#Ba4rYMM(Wq2EfsU081U+-Z8R?2e%yALYIorqvy8De8d`}3b1822MXL(`4IKQ z+4_6?v^hp5R>YLNrG5cyN!q8xvQV;02W$`BJq)U1rcVo#J433#g!yV{Zu%9asKPiZ z4Ati-w}q$@yUZ}l=WwEpMPLZ~7+4q5NQzD%%R}w#LDX*Kb#h)sMkCC{1=^a!Ha??L z^$TA-b}8bivNDHIvJ|@+YGqS<(D%$SuPGS8(Ml4RP%=UaCx^(q7r>nN5JT?p!}n~g zF`;cahYIVEs?*juRozV6Lgpt{2a_=!xWa^y9v%fWtoHryH*d$#z`~426?vB{UbATZ z9+K_QYFG>+4G~et28l6-&A2aoF_4@b1*d;E0Pixcb@g0*=H%^FOO9_L4M3jh6b# zCDv(|8ivh;!}-Eu8!mjMK*omv&V`;AGnz2~mh6FLEHPY!xjRkwldSGq(yO6TCyJ_8 zJW|qNJoW`qF;+grkiY?A5k^I?eECwz-{}o2Q?1biCeG$+!2bMxg>!I!&Jfw!{%qcT ztkH$jNv$A7@NucY_ z(vKU$VG?h=;w_E2YjOr$WVQ=?wcoR^DpV0T+Ec34ooRh3BZq|2doqRxHNJok{9X2$uFF{V7|GVrN&Ol0sKko_}#9V-m+Me!md1Z|@B|M96X- z=>``=$O5>q>d+bE65eJ0YK3|~$3Z|Hm#aqx5=5;XR1IoM(`VMGRjyB(efC=d0%`+J zz^M+$R)IgfM8LV%Lc@V;+Q~toZOL~$-ME|hQ*`m^NVHOC zd99A_RI3kzZ=%=sjI1rO`R}C;?2+7DA7+}ix*IA8G?j0Ela@~<;o8&+WkIcES%_uXf<+Bistl7HVQ1=X z0QKA?3>|yj2b|2$p-R$JSSLsuFdNr?EzCqdVkom@^_urN8$-QR(eoM1>S8(}kThN3 zFXOsUa{XtcpLO;-&7${_ZColw_?FXp_duP~$NZtIFW+buf#WX57gXh-G~brc#-c)fzUhSdPWggXHV36xE>PHF8ffm423 z87Jb>%{ALsCS3ID1|xTdrZo6&buiJ70gjq4VMKpr^y1VPbjgpa(@``W1*OSyW+=Yb zwga-^tdJEv;WkclQ*52EUR1g9D2u0;yl)j2+oxP)lnWR~@z@PQN4V{yExj5E`)AyR zy*8T)PwsxGJVPO%(p%^;*sJhOitOA*ZO($}ahPHAg;!i~7dIDd#vHL%tIL|w>;Vg~ z5~+{elF_GRHYHA1KyGGnR)r#mp=W-|PjJv@P=j~PW0}Q0M}<}3R+@~@`JCxE6pPZX z?wkWT+ZFk=5{_EAP3gi!;ue;7w=ATX+{pZ85F{ni%Y^khYGZ#CN}3kEadzxln3r9= z^#My(dn6R=6vm}i*)f*l=-YN#N%gizP-S?;JFQn>y$x_r5SYysKzz0VVz>p=$zqrqevoSW!R3w$@W(aF4SP>% zV_EkS3b*s2s}HF&V;;XGNGbDpa9-qwVgN5t{RDu}14+36Ju*HgaXB#UhkIZUFyQ&P zvgXzhHe3OL6#iqBB^RVhv`L?(J_?2u90_yhF}|7=_M1;axIp{QYrm5E;nSS8QL6a*2c5=$~f$@mpgOOU9j0gH$RbjntPWt zSNNyOpyGTit2*#S-c-)R5G6F%%OM1>FsYGImoI%kO;)1E9%l>u+bnaC` z7gz_caXQgD1|1W=n!=l--h*Eb%7h$U9Gz>k;5-l1QaacbAx{ z*pmLSsgBG=p}U?xKlv?=9C^(4lQdFcg;J!v+AwM4m0t2~fuG5Me0YC-UbE|+s0*q1 zMj5+8r)Fl4jg`q;OE>uh)CQG|J85g8;y*Zg)MpJaqGSs6O#J_~OA z0>NqlIJ)}_p-vT83$ZC_8ow*)chyQpsD+>%zo<3`ldM)!^V|hj?KGwNXx4&B#?c)(a1^IrK_1zmu zwQy@EVv}$E>R5wr*-sZ%>5T^%#XJCTOfyr*mXsdJLbcW^R0R%dTZPy__3fuJ4g|5< z`)L+tztIH7)Z^#)OcgvoKd!{184Mt=$3(|DuGWJV7GA6)nbt{Sv7*1|ND#1l-EIdn zWa5nNH=PV8QHDW~H$;OdGk}hIiNd%SA_&``deV`K7W2RhEC4G;`lcIFh3sDKN#q46tEw8sz_4s;(*e$)dGKSksIW^`7A6zR z0hpAQsRTTT>z&=BLIC7RhrT+o?ZZW@Ub-1V4CQ%McEis2r{Lzk5dffA2LP}U#q9yC z_Agsjz=8{+)@xZY>*q$P3YU&cH4VBtO?M->-Z*l!JjcNdf9C=`sY&f`MPHCx=uy?Chz4HLU; z=qPP4Npk2@N&CjWh+2hy)quPM`OEyZX~XTRk3!MVgPe5&`tS&FfHsqvXwk;-scsZb za6#Hi3rL||V2K@-x67B-2NfN5v%LBea%jt~Kv}ga$GSf7(g!3^P*Y%vo#(;N^t6K{ zdAE=}0Jp1ff5Hn;-jpoZv^8H3C~14vZ7Ywa>uHpa@txU)Cd=$1)}e?Wa*gjk^ulfn z7s?FmnOo6!+KS>{)1R@uMJHH{vS~He<myE=!9OEDHuYgyj01fiJs749sq>GOcw8{fh z$+0&$csOZXL8AD8*{OC87adK~^eA-n-d`S}26pAgdJPGYy})Q#?*+l&EN`m*T+B_E z+g~CzM}bvS_VcJT!M{kpP;>aFfCt623h4r_v(P+03}Hg*54FJ=K;5u3rHqMFE)**m z)NUk$Wrd z=oBnu2XA%C(N#GWS-!6Rz7le+OcjLdMtuam(WOqgAhs}HumsA>Olni#5NC$Q_V>$X!FrhxAE;k8;`d>w-#aPGuL8S`?3)&9(`i5oanruy;PlB2)lusCKy z=k~&oKrt(2(_bu`&o4+mK6>fF#qi>q|9?}NO2VKLz^;VyFge)p+e*}XOaT`Pcyh56 zLm_U(pn4|Bq|c#hV_a6qu>vXfY0fF^NZ)JcSdu1B;Q`+|&gH`~#WM%>EuPw{jDZr7 z6SkX7m>;}pWG@&6t+V}-i}yciP>Pa9R_@Lxvo)Smq&rc3mZJs_kVnNoKCL~?H{pYhyFRC2sYC0C6&`w@0X|hyp7{QNR*G$#9FtqK0<*dZ zb*V%|qM-dVBgyfQ=$A%gL3C_~NWum^G_+TZhTFHhWzhXPwv1D*dG zmnH=t=;dTQ!?fTS-gfo{DDoKAsyiUdp!RitK*CoVI>TiTg`sm(#3g55@-OGQ$H=sG z9Ruphj>S!h?pKzzRX+*+LDX`0oEOl(Jey&*K`-4)r}{NyC_?S|RaUkR_n z1-J~K1vTgrfsk3?kM7Z#cIVs=pje065lGF?ZcJV$-Q%FncZJdngP{^VGflvk=AB)*dmn?IQ**r#9mqQ z)yyEiaqric__J?9vxYqrd9KVgrQ#T z5*u?xc-+i`Kv+bJv4OYl*u0Dh?9U7D*+22Ceai3LHy=Fp;#Oy>#}S*pcZ0g>N(;Zs zrFNLY{#mzpl@JP~qWfoJoe_&?dg)FS3I34e5NeuiOeAbeqj(fpH2Ou^;s$Wf+11v9 zMA{H)%}oip$3QK{&_rBPvU<N&-O7Hj^n_{70+|Kk}S+@^zHyn}=*+0@-WYM<#GwP4SN2mnc#4M;BF!;tNCI4*;y@0*WUXIrG!t0SVnx|TA?uR^E87?s{Gea6+ z0+Bdn)sg_2Wm|!rSIZ@vI0h6&)L=J)+$MsQW^&lom$9>r2VQ&Dqr))+3{|v0ON=>f z`i9M|0~_hXH@JLjwur#%0)^tEGodLA7Gh9EkJ*auIGHI+iDJGc0VTUK2#Gu2UZe;P zR8uP|ao9Yvn3W);a%a|@r^$py=L=lT!lrG_>@HLfgW0j_!;Flg&lTW-(-_cd3NsWU zmBufZntfG>&q1#DnGO8sxj#?b5Gs^A+P*}$jCY`jla#onsZZ%!g%1uUZ(+O?8NFg~ zzG)0ap;o`F%Rg_X?DuRD`&%IG_!KdWzla@u7C7d`|xj5;`CnQ^vx-3Zfxdt}?@ICfu0an3QaqEe5Xaq{qB!B50Z_lt`7U)R)cdK*n}HA>_SlMJpTls49%{|ER2}3yvQ|$~7tjzsnpIU& zq3xk+5c4eXQuc>(}=Whl@I0zq$q7YmD*?4?#=#c_m%`)EH#h&N+lg z0Sv|$a%`H4)7cZX;BEf(Xt`8(inwjYUuOJ~sN>{t0oHn!!QyWL$!LYCB6sZp6dn`G zEoEbH8$i9RxoJ;G#(#>mRA3z^0n*e|nT)nLsFn9EhjzcLPMRO@eOWSAao-Ggd8^6> zMxt5Gn#P*)JYsW_-EY&hYwxd9oHmr_Kt{*ECF|Fr_aON+M%Eh#iyjc|>+do5KBRt^ zo+XVFb4dkT8Gku~0v`Ne3nK&BcoJ>^tjl1Rf}6750@{@FahVf(p`@}E*Oy-&kwg@k z{q3TL&*|qQA$rUL#)G`~(~FBxXjc>{;5#ET5M_-;5YK}aiz6Bq;EzM^>^3kM0>x<- zlfB90G}4Lx%DwYS#Mt18@Uvj-VBrnNpbmmc+g~kXN{W;F-CZ@DN^|>R!nI<`K5p~c zF|dnv%CEK>FUrI0%XOozUa<7-cWbX|F03qhR8??_sK74`UHzc`IudwUz-sFF?rfRJt9_c{+(^n>TT#Sk(+W_9^ z+QZkE3&OYYK%b%K9RyosO;s>>6QI)pN+udmk!cCM+`oeiWD-|}uGF_lfn zyFpwUs~+#Ir1ySb>}egDHCtj$gszM}QAjfjs&q&%Y`SOVw_}+5tTULk`{XW$n^H&|{!i{ez zW02t0RX{KP%9Do z-3|f;ZeN(hJQahz4punu@7GUH3BIB_j|UG%Ljtk&xP(vQp!%nQVX!}}iz+vk;?}L% zDAy*}9uI!~G#g!#SDN|nZSmfqsHV>XytNmb>L(aV^`xA_HhG2LKL0u?Av5S&3@W;# zOHSB#MtG!n1{^;ZXdX~yn;-LRg}i;ZXydZ83_6STGR@_kv?WFShV8W=RjJ7YbY6u- zA0{sR$bpy}?Jkn~muEShnM)4Sh^{4#o#xjq02>!}4Gr z^u@XeZoc)uKwi`_@Y(B0TAApSlTZW@;0PLTvJy+=Kio|YK3hOupYE@41 z5L!|9I-cS(yTS$~1o``12KQB9E?6uyb!!sKl`XP{Z%p~PzLZm9;U!G28S*En;`ZR5=P53mqSS;(fq`U1RceHI3`YmP4CIEBvl3HT zk9}V6XaUay=Ac*E#ap!DE2qw76GB~7j!q}`#xx&+#&=e*&sCh8O(C9i5f;HBWji7g zNvfr|y>UL7)!{8|6>y>!I(9KQGFk_VQzJw{B%|C>EeInb%Wh%(Bj`||@DB9g8|;I{ zi3?3#c6L^~*Ta9F8YG&-U6^C1j=16C&)NV0#J;)K?xW(wq?W{gf1O{zW_;jZPQa~uIN;##t+^q zNZenvAxVVYRyw$>*wJA`r%3`?6GTesCLMq}xzICOdk14dI}@z3SO|#@u2&%#xIJYW zlcyApwIaHNSA#fhRuKSjGMTQz(Xq7SM0>KD3NXG!EAB)QQG%}j3X(>F{DLLLQ#@Qe8MUjEsN zss(F&emLTj%<&j(Vw7M%A#`S7QQ*j)mwX#)@IWNJ?)5ovqd9 zWD}^n#PP$5j)g~0xSozRolO>?13kiDfDv%UTc`9Qw<)e%9A_vnniPWTt$9GyTPYN8 zGCb00Yk-I=1y0DkY6gh~-*d2f#%8soZN{+s=C z%Q(^&H8N{F*0kxv3k0?TOd#rIG5Tu4TrSjX7+GBQH#wL;2ohD?y7%|l19(=6t0_>f z9#{#_$5W+U%LD`~)AfbaC?y!*c-!aJ36R)$^NmE;p44SjCrSlSN6Na{jSE?4iHPo0 zVb;Z`vusie@#5dKH-o5WHP$+rJ;v9Ik05?F$zg{^|itr;P zaV7WnA(OwR)NjYpK6{xgueA%6ga&gL0tR=as#JBF;M@dJ>={1-zn*_Vf?zGb`QNC` zoqzX4RC*f7LgFfxR;E(Z@HQY59|a^PsD@st+vS3x+x>=otxcLma&F8 zOsrs1=Y(1E$PPJpW+c(HbCkj}g~v5#=6n!ycXllI{dv3kZ`ZQBp4D!EvFbFGWneAp z=0ElQw}gWqrEvGqk-8#)@VgJ06@WD74LnD10A%JuyQ5BA`~nhaGEGS19cq)ew(!rn zqm@l;OhI<8k-%p@5-%v!G|w!i+a!A5N&(}_trC9*G|E-{T@i9XDEjum<*+#H?iq=b zdc_!EFxROx(LC%k(3&`={2AN|2ULyKxInO;`kl`}XT;~QdDD0k@~*$-@r^oyIg~Vp zLe4E-od8i;bDe>&@eb3c6t2r}yD)%}d`IXl9(v2I0h}P~vG{et#rok%uGB#kY_Wku ziT(PGnUrO~GbKi4$aGn{B>dKZE|*lP5!^>+@0L~B+Des~Eij4>ko{7eEQ)UUSdPo? z2= zd@FT-OEBsorMzsTz^=V31UjD$bhKS~Mn@4t)Xm>favGWTq*&|8mxSV>7;igxUTUjM z?ENMAsCoO+MfvwN8fhRZB>|IG_wX1FeRHuW9-(?rxjdv)*RBGqi{Sjaug6ZL#Qny@ z%w=pxYLUbkQ9ve(@&43cSRd&F2lr^wRGqT%SK)G#mr`mjZ)u=QFgFzTCX!sABV%Vt zhC8d!?R+(-c9^gTL>Kl0vwoQ^FxI61=8`ssqe%Csl1jX6@1y*@#2LM zk&~pNq91LoVE1h!3&<8_A<_I^3+o0G6n4XI^4tDAKo8*2VSB$AI$9^VXy-(1{xe;} zi!;qqk}7V3x1M^Q#k~d{;{uqb=O@oQbN`l%YbE3CMj#e%%;OUDHN2aqa@B4c%Y$ZN zNQDk!oMuB=7XUORM6x9h_1rMKHIX1e%@!(&CF=SWK;HlZB2LWo>iH0ZdDM6wrRMx1 zXlLb^E%8rT5PF@6Jx&H=~7oQQ(i?a9FA_i-4{nO#qaiK^XA z#c^6Z*-dol>ko2z6}lvqTBsY3q2M~vDqEw$j!HyYtS<|Gb^%EjpxHnZRg($ zAXfT%f9R&o1QP+r>ClIt9HdPu;ogtBNoR6}F^0ij_Ga@c0;rWABr@h9u_uI-S*s6v zc6JW)M|qng3GPan^#Z^W!XFn@<$wkdF;Z z*#XN$yzxQJ0bABYlED5y7_(tUI&gN(R|mC@rq5VI5guNoN{Os ziSjd&6)H6xLy_R^X0VN*Zr*sV~@bIfUM z;)CMAk4!?{{XNyNw7PvKx*+^_{QJHQKCQb0{R(%(5_-1J6%ung?$z^EK0_&|NcgVI ztN5GjQntJgOrv&%y|rG-gAsHIXwr_0+FG$*42Fxfx2X84K)Emhb^)r>h9^c$)djJ# zie5_{beS$as>_Qx#|FsFF%kY+zqx4TN6e#WuZ<2&%O`Q@xNB3q+Wq35AHDfTC%otS z9!<(=_)#+zQDEkB z2`$;MUIjcx^Fb$ycwS#Iw~^~ ztOAi#X~G*>k@8D+)QocI~`pRDE2!*57N8HA_sa2BPTXxEvwsZgJ|C$gLPYX z0$?2SeQfHPm@04v{8=Uj4zaedZwSNr+fRk4i20I84E0WNId^W4G8O^O7<#e;;OqHz z#M_kE5CKm1(O49DdSL$~pScfZ`hFgEc`*bwH};oeGT=-rWcgwyKr|9&R22oWZQMu4 zhDH0GEEyRqmBpqi`)V3v;YRKMTi$Cuh$!pG0|4mC7c8s+I95W!hwSIgjO7 zI0vjS=33?E`7ovBw~#FQOh=q{ez_Cz30_UvbD8W3^FxP20BA~Tzy}hueM)!6E&bdX zXH@OHrc3fp!Q`M zBwi7S3NpzN3#NZsWs`*R=9^q%5+5_OrQm}SVj=w_Bi}6p(&!zeeGUMgQE_uO9k*vO znLQG(X_B8WhQI?DlI20*!ZD}@YwdoYPNZnMabbRyTX;|ylO@Yu+xkx)@e;=4Pjqhm z!J-FCif6%~VJSy&>;!;viVFBw6#bJ_0OZ-y+4RppMX&A~L@FV#wp$cvYLngz=`mKm z?qaIy_JQ75aPcy^R@bPX)Et3B;2Us2Rfl`vphoZCeOYu|%XUiM zT%<75l{J*wmL`Xc^`d&N!UNR$j!ws^TQCZALo}m0{7lhLD+_rVceB4Kk6eajL7Nx& z2wzX`jK)zT;83^XZa=+H11fKQhSqH=%Q3%?qy_QRyAhEG(JwgQ$td#Dd~r>OqU?Jm zHS4CVZs+)t+@`#jEI_Z3n{~mkzxFyy#=mD)3CV;-%2IJ*9SDN62OUi_t~h;?Pg09S z9eHKVL`+H2xg^8MqR3{yxgq|49}}U~49M}OK>u>K-Swy9Dz#r_4TAx9C1eq)%O1=5 zF`JI9bvU@5^ZIROt2v-br$g*m)Q<=hSp+~y9qkC97=ED^KTdYqzn>BbJ`19dMC~A% zA_^B!wt!VV?oAh~Kf!}YS7M}~$3L`~^=qjV1@+!|K>XJQAj+CJ5Uq}%0?Td z)DE*mv}rXUXRe9FH@|&cEGmHM?~(8DHKfZ7a2EC^B#~!(T@Lf&Q$m5S+H#xx!-;~J z>JJct42%1n9LUTf=QcG;w-T1#+91+(4IN|CH*8$AFHtLuLS?ph)L552=SH^cvJIK( zaWd}IMnUT+C;z{`B3-(v1Ts*b>Uy`g+Jw78`S`p*Iqz;rGku@}eGJ-&T+0(Q2)jix z>_jC74rIrjl|jc?Y3vbVX6t+~XMj_lS#%z_WmMxD!GKuk~=EJe$j4gV-v?p_^ivtX1|@CDYo z05U)#t23Sab8+^9@sS*ZHh9k0hlFYvuT>MJEc@Di2JYm!is!A8dg5i!w_Q&OHTTWS z8}wU5Nvb^SV}bwnNMz$O(t%!87Pauo{ogGV9b_9McjiHE4FfJyoq>H?UyGT8r6WC| zq$@LnclO-6B9noZkv*5Jo_qUUy(TjZ9J^9p^UArjD1F8E3m`NYQwsxIm(@H;6BVlbegy_fX21K&CR360G$HehknAH_Xo8H!=-_4fJs%SZn2m|xIGlrh}duK+dF*IGi$B;U zeCFIT)I=0Min9ChMYWS9X^i*}?B7$vBMIu)&%71IlkNLK5C4R8LLZNqk7j4r0IBG0 zH?&>S(QMHmK@k*XDS~jlKCG@tJtEps5fZ8;hKJf zHC}5f5F`d*=vu=U^@$!Xd1TfJO9h{iOy}E45B~bwZkcF~bIBU824L}uktP~ElOpg( z#5|tzE?RmZipm(K8kI>ytP#9cca8P%O|mv@(xIRnIjLE`hj&o=X4|cW2(U?&3h}0B zVOjUX8S|-P{>2LC6u65#Mt(r6rd^{Xwo1Z2cg?Fuq>H*eB2<1zvbg3pCodP!DwnhT zL<0H9zVS?lQnl?Cp4XF=Z!WpX@|GDcYVr3E5)6czIh5llbR;?X(A;5l_XV(dtogss zLkehRb{Qw6?F3DsFz-k*7Pt`2xloqEbK#>Pb#Vw1YMa{Y$Oj@2O8gC~6Wcdt8Fr@B z3r&#%cPBo;hWUHg;E;1}bpBejrbolB*ggFLVuJw#&=!vlKdJ_}^PXwj$KNa3a_-H^ z<=jw6Wh*#$7tCb#k?V9!*VMLp!NDp%S(r0M>B9px)_CHDCVd&i;MbD&-LxRzVf1Pf z-#58PV);CmMZGsFYD^)7AP)UiDi z^%$zvOrM&Bo`3Nz9QOSf0qALq3{t z_lm1~wMrnp9An_cAQGzDrpQsRFvf?UE+1R}7{mg_(E>vKmDpO2AdPW~;4@PYLHQI^kmQ1-$&e0I2`yc@mX-1io zZ|&^`keq*b){h4U$9%^?HOOx%{~o9)s9JD_5HCz|jhh%rRlLl0Iu^O2UfayR2=5Ze zxE4PJy+xcWN}J(;w6s~Abs1bZ)_vwG2rOni7WHtO5xq!3>UzTcfLfmtcfm7vQRX zBPvue19ye~ulOit`niK(L0flD@=%0O02jQ?hOi+VjBCyJs(&k3I$CO8oy(U!3Jsta z!JhQoL^iv0|9%N_%J}E6?;M&K35S&DYGjh#XKxm59q6uBI=&&oelHX>Yg(tcLLQB& zj;HTH>VFDxn^InOa3IE;mCK!S#GQKYO!u#+`V2joZ0+p{SQjW1)>jaz92%SI<%r); zGQ{}19;RzD$|LH?V#WRHr-s4N3`q6Z{dyL}egqb~D&{&JT!9!<;WsFV(ve9-wNTa? zAE~~&Uq-iLAj);Ov7%#9x&^NsA$mT@noGk}ar>Xdri69LMK)*MJkEnfY)M>q{Oo+K z1k|LK1IU{W*Pr|ACzny~l80|!KVw&8XNkYYB$hf4TXpc7{N{A0cG`R5`F;pfN z_|Q^J_NNJkO@u#hg^hafBg7B-y$9U;a0V8505n?b_>gUogS zkY<{Qti;3GEvay6H9S>|npyQzdM(25(V=s_$9c_rv@|Wf2XfOh14d0Yq1YCcQIdaO3i!lCZs4l*VixF%D_ zXWhrnIvzUM0WMcoJjA_%jm(vnN!McS#H~Ea*jiFoUPoRuU4NkxX|@(m`fN`nN4yPK zY%-O3aZPusUj01Y@;1)NYaBlyg&|Cj@BIzESI!FhCRgXRHcm+=HO(O@Sg$(4*4B)F ztLQYmnSsjlKQqFJGqN+A6RRL9Q+PUca$Y2{Z1?HI$9yKxH^eSZ_qLg!`=MwQGAnYF z$oCNney+8QL4k;KIel4`Ee$a+VMbmk6*Cx&Jm!OH1w~j?vd7Sd$io z<7-w*tll8mNw}qrOQ|!gx^mU8x@2RfApd_+N=d}Q1@-y1@>;_e44sPg3I)zKD_bKJ zwq_t}7R7nJbO}LfmM0uee<3dIQ7a~CAMY+c?BUZ0wDggRBs)d2O)H!TqroF>>L*s&cJqo|0jYs>*<}H}CxX#hJluUKVLx!v7cByi7p;#}D4k8x}6{ zHbb5ANsjLpMVN_)Mk@Gg3Af>QM@vX|;{VGqn3P+-J-*Q4XR6H|z`nz%_$=c%?m3^< zKBaQrAsvy5edr)4f&ryXw&KT|A4ewSQ=`L8K{_VZ5NXFw?sIT6dnQlP<myz7!2To^aH z&KitqRHHKh6&&}pB;w7GH}wj1QEIdNkKmDznxQfyvJ(B-`7PI4Sb%F|bhtBKlc8w| zf1rahJri5j0A3%+F^F0Ly+dn4IAHCr7a>Dm@}m7*zWmNI9*$*actupqPs+B)^m=Jf z%AXwMTkOH&k;*{zg(cMN;YW4|%k!-tNc6N7cJ^B*Ic(bE#{_wWq9s5gO)^D|l#^`* zhW;gG!#pUtcUwnOey0XkCM5kBRy%{j$vZ}e)itCj@F@v9#vHtiju>~?Rj2^u9i|_6 zrC}mO9}J2vU04_fhRRFkMKTC3UD#FwL28vHfFn#mt-W-E(N-hZKTe1@dc7!USYn-2 z4x4wBqYJAD8j>}{U#t+}j6{ zB|ei~1g1QXgOWXn6v`^0_Cr>1YiX6cY|#`Rx3C3#(xR~FSj=zmDl=#UOsbENTnMO- zJ#FI2FCtRF#EY`qxM~#tcTkeFg~txwY~@QHy>TC%krbFVi4lnAA%};&hI?y`8@ZGX zS#j2eDd-|vV`YYDYuU%Y6Nsm^;KqN8%s+R3l&1LVb_@z$_y!`)F12~lHbc(auur_IBreva(*GxOQRdH{ zDegw7FHu7U)AFXl%Z}9>Q@cFRHuN}=BVyj{m&ATTIT<?}3UPur@4Y_j&q#@sQvxcL zv_MJ-wEYLgjV;WeY~fHxIelbYJoTA2NO}5zn-k89Z4gqNqbT@Jz1D?b&x^u#z!*Mf z#N3(^u|a8a0obJSkBAd9odil66n%iHiidHh4InAgDVF%E?0@VBI+wruW#C`{cJicj zzyM@KCz~_ri7mOF^ONEV6kiHX$t_it_+Tnuo=>+nLn33%Ff3Rx`6hvhFrob3lyg0r zJ_a&yxbTK5(;9>ygyBC^L$0<@-7qX;fZ8wpjtOQJ8I5~Zl88oM#z-oMc}_M=l?|Q- z)1uCnkJUvA;*WZD+ZmUP8a3Nm40;|amoLFAxV0Rlic_p~TUA@(`0GWk%7NdE3#Tz% z1`z&Tb{gUYjYd!*Lq&Rg}B$)Tr@j0k@{FDAi`e`}sNZBOixLFuaun z#Du&tE95-KAs=I|7v}qB`wOE>yjg~0wjBey5DC3NFyuT<(h{aXmxKa0abWo^`k82G zqb=Zxnhp}yZNHO<%PG41iUyTX*17Bvd{MPV%qm)k&P^4&_WRk$g9I+X#_iK%v_qep8TA8 z9^Ig?D_9TC$M`Thp_VkKFaf+-ljfv$$l_J3X=G)I=-~uZ++L8Sec=Ih?)r7yJZOA* za~)1GPS^RcrnXewvh39L-;14#?d=NSwy4Yc@hR+>8KCTXi2b4$$BJV)ci5rFSs9TT zakP?3xDUJOCx+a38>((h=dK;;R%auDXYiAC#FrG#WLTYrp$;WfX-VD(qaYs{U0m8J zRl?$6ALYUs$upLG73eU@44A-3J_a*tM1TAM@35WKmtO)6o`kT_p%G@OqV#rgfpbdV ziJsm!1O?GB?52vYJaC;g(!Bf_i+!eU9cRbiRH`zGE&f6Jgk-?(pf=)ky786S1P z<9u^q)Y7{-S%Ca&-FxHlK5u`-6DCd&l24P1xX-b@VPhd_x^^##GVJi z)2QEN^G@jljv(+1o(-P(>i#8w8!6GfI3nzwZfp}MBBj4af-$lk3~9SRNlD2k#u&ci zlx@FSeq~Ju3O=+)8!Bok`vShwZL4GuGZJ0`N!po9`(kB;)UHW+4@4O`6Iu!cdotrn9E@%pHFN0PWBWv!&Ob!@XJ{(5;2`Eyhz(l zEs7P``o4ci;9wg3N~T}x!w5a#m#(9WLaSiSj^)O<>>XPE;FZMTkQG*`AYHW~ z+R^NSek2LNZqwYp1^sa$DP}`H8@|Y;RgwQ3iph0{8KElFe{dnaWmGl>0yah^oUSF@ z<%$nSkOI8NY~)!Qye5-RcOgA|m&FO|5vQX48blTg(TRopMouX150zTtEVDehp&Qa;tE#lb; zd*M(@q*k`}25XRIy@JQ;InKlC>pCb0PUKU#!IX_>8pv*tI5O;PH>s^b7@^*gdB5{O zSP9b3)*-MT{9wM>=F;kak)uj)kXpZ$-b79hHx2P^$%aJA_@ zK4R>CAR~D*i8Sm2ZdhFOV{=XY3C?ak1XwrSx9c`O#?;*XPUx$@2XL$2^OIHVG8G4p zS>$|CIz(0N23)WPQ;&xB`Qru>oYuyCg0Aw67^{P`)86B9nnLA)^Nebm1*g=3q#$or z5=Pz)L7P`daD9~$#y$_6y~&djUkn_?=$a(LuU6c%%<_>U0E~_^$2m9ju`WSCbt~DD zoRPcbp1^bPV(&HM!O&UGxgq~iApd4>stjsj=YvRlx&40V-U1n@gun8jr7%1#`J{gD z)Tyd?|Dj>O@>jIIPTGsG&ZZUYeE9 z>~EN`S{FiwLrGX}u3`QY6v2x`BV){Ly*6V*n|(1mBEJh9mGKbw+n#HN^i;I7J;V%2;|3XmGo-7N z!iQ*fqJPdAt9(0_Zt^Dj*jS=in_^aiTQt_;7@P;OesT{ikH7eIN63v^am|t=2S~8z z&_gH7#HyfobfYbOU~tp=O>U$DaMYKIv!L^)UNlg!)rXGp6qaTC5;K|JH@#9Cju@p^ zZM9Ah)2lu#LMQ3i0q6i~&m}wsHjYY%Czu~!;R-`WtRlo{lj)MXCNJ!{g!TEa#YDH_ z&%$@?@)`cBNF=xzj<>y|zvrgz-L>g9Y120}sx?1PNgERayX3V&X4)M$i6uZKkRe{_ zwDSXv_h!6K{a!6^*@{v#Kq{ZYsRmi%js6T9>*x)X9zF$FSx9WS_~(X*M*(V@&Du@` zt$l&BWj!62+`rw(Ts=`_&ZIZ0_Vxq-cTZbqFpDWkOBnTnzW4&#&u;dtrqjkvfYWno zpq57o`7?f0nmWX#{26&fl402Lg&?w7D0X*hT?WUy$Lor#o;DjD9ab?ype35s5fY}z zgy6$dU@woF6InOjy*d7rq!y=;i!z=f(|N<5fYJTaJ()KBcK!IsZE(gDnO|^0*DnSb zl8Zuc?VeBp(xH@S3-TV%v|CA&{~ph+tA{LWU;&5h!oM&9XuAJoklP z)~<#gf{f5Ou^Cr_`7%z6sU;;|Oq3=T%Gm=M&=7WoeOp{f&D%ekS^P3cRqz zZh*#Hb+G)&GZ@8TZbwZsZK-2fyXW~R7&KXKc3po!R$17u9AE<$N#9h)cXW=fHeSvv z;?oT-Ui^|DCQ5zN!RX_>m-_Cn;0$4n_dAa-k=S|4a5B z3HfB8zaRQDHA2$+L>uVd{W_o0Z>)avO0?PuVbtnn2Rltf1shS~`Z z7U;3z36?q+V^`Y_#)#XU?y+hE0M1S%>F#V3*XADOxrv?nsOJLn$4zttI~98SC)QQ0 zSp{j`oCIt$=tBJ}9yl*>bNOk^H);G>DI?;sEMsjRezE4HhWbXQx9AcKR>n|48j;xk ze|sX)mG1#Sq1p5Mwr-sx#z)}IL~o4~xwOfrIcxqG^_~S~=Kmh^y0lSkq?cC{Cp~xMF4oL6*0DP|5iu0O-{tDSR0aSHc>Y4U( zDPR~M=}(l-BRxety_}4Fx_V)v#+4^qk_>~FIxS(2CCJKaR_8p^G-mBopiQ#ga(0ZBZ%-g;gPw# z*ls|CXiP5M^SUoDigl%X5X>)^ zYcljs5r3wR5}ov`Uk0UT{16rxtGh`DwZr+i;`Ly($cH}+ZGP9r{~p3wv$LZiy-EV= zcbc)BQF?SgQBsY^g1q#cHmQUZk4Ah^ASuS3*zj8 zEsMU~IXInc-J8aIr4W-cRIvLBzp>xivO;~+eCgHJ2p0PbT^r4w>)X15LWKCg9?j@1 z(?CaYLwsa-$%%}IJV*&?3+t-VfKF*Ae>Zt9%Y~!#S*FZv&n*o1B>e>04EnBA zi&Pkcf2+hT`51>SO;2FY0APtgORyk_MVxS_wxl}O1hb?+vxi3U?N~wy^EKz>JcbA>LWT{s zXOoA3**16PTJ<(D<+JU*I0qY5xPjXiT%l}MCjFU!0jcZad)8dV5Si*J)px%@Lv?38 z$G=0Q(kCF?vcQ+g;YM|ejwT3uA&gT9>dDEvimQw#6~1fv)MqTBSH>yzE9|k-;ycK_ z=m(3+-PK;7LPHQQ(3G+jg(3IRid_Ohr&hKj&_ys%2}2`lCQkQ;26$SP5+P#7nPw31 zTWbAe<{QL6)CXrmrXMpCc(daOTj7F|Tiv`yh!3u>cm3Z{!2|w)RFx3=d}UDJkM4v_ z2NrN;8@p}No>sDvQCZBgKuAG|TR2AR>W0s zD`K{;zPUF8FQ$(!?Ly3J(WPFXM%0@t)=~XPy>J#2MGJPtUw}J%Tzl&f$hI4FIUkPJ zVk&-F&2X2F)xLPW3h{bs;;E8%Qjd`Tg6A4xAj@rQrppxQKyBx*_t`0mEIdAtJ0S@Q zdJAO?VhmrVzg!YRXdKLtv>ZfZ_$VTp%GQc9rlda+M%TzVx|f=`GxyRXF0*D6^$DFb zR+mr3hznIqp9(nrg58HyE%0MRnym2F41lQOjGZxb(Ee1Un`opGB>1d8!9$1sOnzFZ z{%jDU1KmM1C)I&a9~|<+gAfKo+u$+4hzpT8AL}U+sV+`1X4)d*LuHp7-r9W6nJJf@>w)m)?l`R!L)5O5Ex$WD=avha=wHQE;mu_8{&H%$}k z>MG>H?J9!)yRKo|LnCheCQEBm^}QX5${6cUr5NfEnHG-(!bZ)iEvn!QZ%nbc@lJLW zA7|K3|L(m>-6sa_4kP6T{X*Ui1hVap5w>Zr1Z&tZY zQL5~p(PD|4ui|yF#(e4Z%Jy;}g72ePv)@zpZ7q|g4^Pl8_Cda#N-XL-4n+Gc!-Ey; zYQzl(8gXK6A8~V{odBhL$dd@c`K=w_35~YG4CT>F8Q3x%vJ93z+H$nv92#q}{M?ej zEbbObp6AuE04cs6_HAxClWq>N^-3zRch!8=&kFhuN>WUGwZ^RCVD{RV;LAy8xbFdK zD3N{s8c{t~_%45+myRz@r_LUO{Yo~HwyBOoozpzYS|;g|KpuQ7Hl5}zs#QKn2D`C{ z0I0HCuDc%83N`47vw31<&*=J6V+xnkm?;al!qzOWtlSXl8hr>Ap&bfjNFgNb7- z_zeCXB&vt&ki`O!Aq%qu)VAFvVyDsE?oge9cbQ~gMx|VBz@)_kFMJ1-(UG};Bj>{L zar5GV-6r27bD8S52IXyX+Oa@HBH93kU-xTOX{-4#JS$rPP^hn(+$?bI`6SCAHLO7e z>zpp+jx8AF-Z$i(6uncKE$g*nap8)f)x{Y)%f$?wzsYHq&4vn#v6NrUR&`quL!GSv zUm7cEQ{ro5WujH^&q=l~$_%S$F3YPx-Y}R%$sf$i@_Zrf8T8%jS$*3gzJtCFOU`{A zf8vqq_aDC$npv9wF*3|vaUUla`)GbUoA5AsDl%W{okpuLuNwi>h^@%Y4~x-eweC5)%v+b&aP+aZ#S){m{0pqhM-w$-mu-d4elv1D>x#EXx~0B~%I%TZOtyIJA3RhEOTF?i0# zae^=OX<8c7BbBRQ-2LZnR zoJa5Hl548i;P3B^L!>Av-H+PLK>)i_A?%p!if<*-^}Vyn;Z|f6w)6Q?ZGiqUUKr0X zFd(Mv)Y`c%Is%K1>j~f~3Z1hI;u(14sLpP&80HD@rZc4m&dU`yHL9W}Gs@0dIyJ

Ir4a!4;LC6m8ZP%>$%PnW}A0$^7Sf)Es;r+LPp#HxVvk1=}|;H z0jFR-DFn_ubUv@J85IS1q9#;2#+Gz$0hpPhe)ngs=4o`6FGAT*CFcJI@y9<`7B$Ul zf1e9%jgnn8y8$i$W}ZuR?5u9|Q8(n?Y*bSL5ziNemT4)jGejT9{er#@%b?ja2y(rQ z6KcH!rXy<`O&)~?5q5#DfmLfj@M{ktK7t-CXNw50t(+}%j%tC(JjAw#| zpS_Db-7)8Vf$Ux0t>Kc$sS@KG00Od_p$mZ-F4DNpxeXgto}6wEw7zG=L_t!epJeAo zF@PaPD4pFs)jkEqK~&r6`G2IeTZ>{-HkaaA{#BJE;2lxjOY_!G%jLAV@O6GO^%F{r zrQ@&NxXk~-&1~xGHHJDm>Q7?+gQZ+=Nscouj;IiZE!^Bk11@3`klz-i>;9d?0N}{x zGfg9S7K;*w5B{lFmn#GwS0yL9r+_mst5Y2YSk5Dl`Eb82 zQ~+k0({G>d$k8g;k`1V+lb$4Gu9Nab>JPX!wx^L&Mm=|7oF1>^og(^!rk zfhX`-`Oy?QMp*Oukv17pL)G%dxn04Zg z@Jq)fcC3rvQKbV*Cx!l%nbaH0Y#G-pIf`A^r9O0fvU1K(q)UPY)I)IsWWW*7hNx=4 zA)Osnzy|geN$Yyd^AYnw?@Axyi#+Az zFS0~wL&N)NJ@lltYA+}N6j29z!KGI4u7VTVe^ku6ot7!5P_hqK;cb-xBfgBqfiNY2 zP#PFexjS#9;nrCexEu$~?ZiB&yZ+K#*jXXLPX5uX-hn_c)Jbqwk=#0g?wK)+3Rt#r zFxnb1GbwLljGMX63L%r|UE5$}-0|{PPEQ3mEEe6@hUBZOMY5^kw+VAorR&?Aj$9i% ztdWP*51EG`B%1_aT-v?RLD;ao4_>cUCgnY`!c}_s3KJ9(3=dj~xTX8{i*jXLI&8B2 z>tSrX6yYTtFAd*{PR>g(n1B%|hwu1!-E;6C9vXecwmD{E&Q^=yCT(>aNFu568aC*6 z0m1-}EsMsXP);H+kkRxy+NX}&*Ytt!Ac)s66HT5COjEIo&H3*gT)`_W` z?|MkXcckJm&liiVLnn#6t>wU=4z13Z$-pEYT4-5!mxs&%jdLXWP8QQYFiV{2lLnI7}ZDyJp z+Qp37wLET@$W~Ug2ao5ltZ!9+ND(_IB=zeC!-^f}N+t{=zK)h5hln$*PAl&}zM0YQ zUeVeoT6MS~KMt!hs?Fd|Cd6=!dne)7-R=eJS_HUNRjG7yhgT5pPd}Td$6?9a=|!U{n{tYC{HlQ=)b zcpN1wr5Sw*^9;ECUZlt$mqiyMl$F&D!aY=+q!4)<5k|2%Nn^q&J1CXsS+~}}eWBK# z6~=Cz)a;7E1{adliGG2v04X8C&+e$vUYF}}k-fV`O}KR*pVA~lm(b0hNluui+wEHI z?OcNV-B6YMf_KNcgZl)DMAXdq&Ubn~a7<*hVI<2?e}#sE_N#ESRC^z4MkS=rqve$@ z069R$zh9a=qJIIgp1TQ=Ynr6hxn)F*9&hgc!|?-m&2mo;gqBAHK-q;BV|0f{A?{)+ z@KF?l^OvHo3&rL`W7w*t(oL$&gKG7k4n0eIoP%VHLcoK!)U&P@ z(n6!Nmu&d@u8Vw(X>HrUhQXw zf>kiJ@a={-9Fvj@pOfZvkJQG^N$bw4RLD3Eozzt9sK~RPTz0o4MGhZAxK*SdNXnq|6{XJ{HoPFC-GmE?D7O#_J)-jGK+b2!Rz_X562%X(7q#ak zU>{+j#K%fv@QUt1d$WQ#ik_AX$gJ?HlKoTQS=_tm%I{%Q#d*!tbF*)G>xtHQGopj|%5ny`d ze*02&mt-5hg}k521XML(0VW5rSJmwO^w)WRnd12n5xSqfl>;qqO$3{CIx|0*^$C#X zL|w3?9s(~fV}sOXqj=l&8=i({1Ap;qwaNvTtEnWekve#AlPiX)wT!(frb$i`3D-zI z*eDmc>!~@f6EA5VvXhK><>alpLXDFd-yGWy8NYSIhn?AV-GMHIDj3m)D>@jtXKmAt zMi9@HN#vUl1K&6b>LKjbX+qtRUEClqe8i^|FH2POqx6pG!VS3IA+C0J4-S)55@Bqf zG^80nKc#oQks!}^UT_On@rE;@$=!43j<)9tt*J2?LT}Njs=BS==A6+E+YlWsj8Kg! zH7MaxkIS_N$FPA-@f2;WIrv~P-+iG-KmyPcm<$a_ofb*hKAWN)Zyn?O{hpW0O(RN< z&inh6i)Tu__A!%GP|Y|WfL-(}5i8NRh=zbD^*?aD?OrLj7sH=+hfbzzgbzMVGy)Vu zxRL9yR*7-v)Ph*$Q)~L$TkK1EP-M4hjsbz>|O+9jyN&KgW+WCNO( zOVaOfn`?U0Zt*T;hV{0uDxc6jFLVQvy!gSrGnVfDk+7i<@>Le9H+tgsKV}QK2r}a{)_gQjZ*?M1?8t5T(|E-4;;W`vbR8ALPb@ohOLl=P~ z*LnY8g#G;KxYNS_S~|#<8->1S69Q?93~1(m#ehc0tH-v?0%qGvG;6Vq==_54yPjZY zvo+9XQH+!$$NXqr*~{d&sBtJjO~0cpfwt+})h`B`WA%}jZsJ=zrC>LCB9aqx>Ob5N zX!&hiH;9y_`X9g|efD8ULpq1$SNqtC+ey|IeZp{-a5$=vzjP4s6Qm^s!k=5wSZt3l zI^ia*#7z-}DcQG;jta8s-{e@VXu4_#)&&BXEuR{WGxKh7-XJb8V(ynRBe+Uvz%xID zI{k(PoG)aVesgD>Ia_86IXyNygPDKqeRZ`7sL5p^2EBD*un*$$mdCXFH$`8}(1KrP zH#x8M^DpkZPc5dVnFH}0OR(bKlPK#mL?1U}9vy7Y*x`a!j}fijPxKI}=`Q#-xxRe( zF{BB-k#IL$|JV3!cUCR%`Y@4ZnzMG9vIIz)@0AStP6O*e-RL7ZJ=)9F4hcK;B)! zrZNlIruA;ibzSu*7i#`J{*Y7z4#N)40Ds@Yi!;sHw9kU!Im$#4Uu`6EAUO7Wbz%Q# zO=dTRgmK!b1W$@t6%rqrH5*KcMhxl1`vUv6v~;*)U_idUYLsQ4@His!)LP}VL{fFD z#T*+PFJcl5@?MwMjzvn+sgSJgx^hJEdCv|r*$x@B@Ig10>51pn41Y^HudIy^&*4ZZB zpVBWlSI%hFMwM)?s?+Dl`3hKZcyhBw^-}r6Hp8t7fkv!NMv3SbIpy9L8-^0~JoJOt z@iXo&@EhrLdVIjz6lULZSaUM{Yn^JbltQikExGa@L{JrAhmx4_eiC~X;rC3W&cLMy z$kJ{JA@x15lp;fxB{8t(VD!hytv3W#v(Bo(A_K_B*cqB@jziv~pljb?7Vi@9yYCo$ zsaXs)%Gm*CaUBI>ywAM=Lub4lU(|COwYMqsBQk;MxN{)bw`N`S!3FiMb49>(A>Hp6Cv9NZH8*d&9h-`j zCi2`tXXU@ft}SEB9d@Z3)g9`%rCToeNmuvFlB6``=hYoItx{4P$PPPS?5j~UPFkv8 z5~c$&)V2cBVru)U@DMtLbS!%xL`$2_8Zya-!HQor6+r!$wpm^$nw~n!eG}a|!^EuU zq(*jp`sWGd>T0eFID{O0#SRIGzks3$l?vxeXsr-5jjLP)UC^nb87eU=3x6Nqq=q#L zi8^YK^Q5xno@;?eFe~^DsRR7)HQ87=GPdbSY+1Epd&E>aW;D+5Di1#$XcAyA6ZS3e zYR&4TmEEXt=fpF480tX@P;Te?v2tWcU-ea|ud}YJ6&|^t?G}Igrawbo`c8t_^>!om z(r2sBVySj`h77mR5rRI3)W@3?Fya2_(U0f%&Ze$Qxf#|UQrE&@Wad4OqUDT-!kZ8d zAG@;5z&fbwmSci$8FMsxap(|{WlJEDDZ%P(lJC>0SLJh=bGDkAr8V;YS}fC$5Pn~4 zzR?%~xtXL@hPciqBAj5E7TrixP`N+ZmrJphzpSwXA4LxgP)fUj6pTaZV>w$sHe$gD zU>C@twi|Hi1fG<~%mx=_W5c0;$VWVhaZ|E5TJZ#L#7StF4;ZbhChQk8HP!R{mv3W0 zSmONe?jRmy!ust4segY;B~`*q|9#If>7P|C9+{q*LupRfl>mu&V+GlkuJJ)cjlT~W zNEMdhGeV$G0B|(uxvo{m+Si#J1Nre(T78hD=Tyqe3Vp-@#9I4oEX%%;X4E<&qr(^; zvHaxOxj}z6oJUlphUVk~i}Ylo57X9E)m`@zS}fum)6)ppmj|B7w36yws*KQiD9F12q$bQdAB9DOhk zd+%uoMQml&eephmBL(i!pDp>SV#Ds`BOqY6E4M@#(*U?uyv z{S&P|b-Vn2YI8GW&%>5`=7gB|$=tZS)w7lREfn6~Y|bZ24XpVcn8|32Gse(AUOZ2= zg>#Xu!8a=5I4wov@jdrCJ_uRAF74Mbn(7E$P4~~EfqOQ3Bm+rCpQSY9QKo|bQ>J&B zBD-#Gu=bMmgE_|>#K3n0m+&}=%GEB-6b=rC?oTyc=xOS*KS?}sw=*`cNI08moqNJ~ z+;>!J3m{104-}D$BN%MY#^0GmR@Z*vajJ}YPZD?uJ5~YNT!m?++wiZt;k$t4^6d>6 zDbQNsIK0B6pc<1yjLI}-<#+n$(P-ANGN43|nfYTZ_=PE?Q}n!FflVq6!5L|}Ehzi< zkBkt5o@Up8qhuvR&eYU$LZX`Uo%2}L4X%GUmoli6M)bv~vN1174cMzKIPJzOm(#oj zmT4rInmE2O8rsMrD&P}E?W7Dt{z3F2971@)(jf2PB|MymYrwRHQE~%RnLDl`W<8Jp z-uq(>8+j|($f77><{on0>Y+prfPMDp5g1>q%gFw%(wxJCwG7%CnydrnIM395m$}-# z|Fw65J@(OO01Q%T@V+osH7G&|W6v8Sr`kjb2;r;Bl@t59di|1-btnsYV^#)-d626v zfH{yFVfid*AlT^-3Aycwr$*bn{04-4WXqrU$`puKFn*|R;Fjsl@C;>yhT?c#P`ba@raeJXc+kY{>Gx4vJ5egc2k{U97Xz zKZL%c+1Zv#DTC+^BHKUZiQQOVMvs_;FAOqZdvzY8G;Y}?K(4Jx(#lF>_scZ#iP-^8 zi|EHk6qc28tYSiF3pV&pm=9a2GZ7PhxY$G6g*Ko|2Kr$T`aqCS$K+Q^_@)1gzrnt$ zaxSGi|9G3M{&qi4YW*^w-Oo&YC9i`as6wQ0HE|&ZVWf4c+R~A}HGC`nWIe;g!-<`P z(i@A=2Q_S*fVj`{aDxCdy0vL zW#Od=6tzYh`^_ZJWQHsDpM`4!sYu+tB-Cz{kkZC;fp~z8`Ky;0WS?pqAG{9B8rgex zO9RJTFTk!Cg~B%-S#W_6+tr#AvqEfWt}1u56ZpWJ4g)i=r6h(CDV2GoAP9xWpj^|~ z{3XxD%?DzhkMA~o7;*&T1L()hM$1zjHFkT}jse!lddjWrY(}qy)~BP4dPVRUxY70_ zss@^aP%_va*Bd|&#g;j@GWK`*sx`gaCy(A{u;c=u6!K?xOxjvz#i{OoxAm-4tVpT| zIWU>_9|fnr!Hw%$KaSk!wF>Fw)HN|n^EHLTGnpu51N)QF{U9ISeP;}cTflG zJ3#sU@KIjE3qZ!ssp>P#{c%-6h!2!vz_&+xH+bKjibY0`cxdKTN7+IE#x3kI65z>; z#>AQQ$4Ki12C-JEfvSUw#9g$Lv9~vbr07dXS8V;`D33=#)(r6Mc*uQIx=YHWF2^53 zblSQ$&{8}*i%;9l@f&_PWN@#lSDTADfeqM6LO*c~-Od@v>|R37PM{F2U4Z^_#|@am zA_*e}9`*W~=%9~U)|0Q9$F=!rj7bdP}@LE<{N#q?5}R>h*SvtD69_ z4Duq=Yfr7%e}5I^S+!csto_uY4{?2EZ~kC)RSi_sYF()HzIzNGHkCrhFoV?T5?>sM z`S5y(U0=Ku5^4x}BU5^xzl8z;pt}EDihhv;Bo&a>dO)1@0k*W#$Vnj59}?y&X-c9c zgclrx_bciWaPCd9c^0M+ieRBJF3TMH3?$Bur? zn;jn^ZDB&DEDYV(+L!imiUy8MY+vK@UO4@}zd=dpC>RHjnJL?>k+T{g#*PsCqFy z8jha?FB3m62ObF`^l92hnNT~IBVP<Dyfm58u=Kk7avrE?oJx z*TP{`#Pq@PU~J~)&k`cADxxu9(v>oHe)qoyO+{AMhh)|tuyh=t@yiJ3534FG>y$XxQ=k_e5#5>;E>*G zJbeMftx#nA5#duZ;qwp1K#(HSSfQD^*7LqAh;PN)xv`v5$)`wJI$#nB%*3NChy<}0zieRAH>FwM=2 zI~U^cv2e3_GpLHgk%d+x9N5DX7WUg-eTu10P_7J5*ksisvYi3$W;8PaoeSVLoD8A5 zsN6VP?r0jgJIcUrLNFhjg@xSwdDaRuxda7}4j{jlp`G2)_)wabj1I+R#oZ>&lw|^d7p&q* z{nstx+D4+_Gsd^(^t+HH!x%K(%i}V0K^Vo4(#zYsLKViAkl>!n`+3wc(bHej4CpBs zdNaasU-q(SG@zZ%mgP+?{cA7)tG6-a75 z%#v-QaY8(JORp=S^g~h2bhV5WNL8pRpvRZt&8M}b&m+W^*4D)vh;?fcJxs&>XH5i7Ke%WOu$=g`ax%-H6tap1*pioZ z!0#-agOokz9+0uk@<)uUFn0d!3`sXvI9pf_Ng9lV65#{R(~PI_ip2yIUn*TDApC8a zENXKW!6*MS;dgZ&4mvZ!@4qj$0vPBVL5?tNqOz5cvmTAVsy`n>qMkuUd`nDpn$Kr% znsgE>eo7nziF%b||?AA}2C2;jSpM7E3xz zuYm;KwgmAAL-Q_|)bV%xT8F2B<2mHc#Kg}X$jFICjAr(L7A=neLfrI^oF#xn>t&$B zOYI?_9~-$H-=jfA z*O_o2;NZ6dK|@l|n>Gr1-|MS1E+aM_Lb5kG?#boG1+sOUT>p?j03-VXBWI!(s1MA)3H}oVr0Kb%QQ+%+Kke z_!vg#-Vsc9h(kex4IhTnI%T~a$N3KAf8_#m996HrXb-z_7*x2kSBx?ljrQTi**(o@ zx(Wz$lOX&79sv^Vr2kjeAAHAH3qPM`V_SxuU6DhAdiX2leDZaH>tIG$^EL3>eRK;~ z=4RMoN0hWrrH!DyzVCCe$D#`jY_SB)Qs4jwXu@EK@JQ{Tpt#pHKG&e<`T$lVttuhU z+r9`*>V}=;JqulRi@gy5Kv`(}8Yc@cT>l0GiGT~4JEBuk(xLw#=JzM!Ctay+UWxh@ zc{xw?@gB*svTjf`8aJ{0+ru_t^SWBwx92uDlolZ?;4}FVj%UkL?7fXds1p3GoT7w1 zB%2yFO4cu4o8%c?%jL?m-pLvhBNRz5FEE6VF}HPGRzLL%058WiZ|L`|de90U`V^?p z?nz!MP(e@19IzQj!MYIo^OB1Dns?!IK4qkV`1aMim$s=t{=x;Ul(_1IjRA7Ht?W>& zRhL$V?{z5HbxC%3g-AtBDq<(k5&=dhgzr5A2X?lZ_F(OOU9>M?LEo*n@U@+6u?tg9 zepp0u|2PFEEo;&#Jpb)Jmi3Xqd z4$Z8uMC=q_#1GYl>FMH3q(=k*m|{86>S#aVCJR&Ig=xSbl*v$Nc2P!Nv5B< zW9dH7(Wb;F+-stj)>2N`T^ZS|NVjC)_x%MUBj0*^*MF^B?4)lK*qy%4Ro}T`y`c}D zB|45Wf2hN@gGmT7Uia(MMZV6YWa>M$-r$<;&$6KamPkHnqjR3cJI-cNmYJ?OdZ4GX z?+P(lmma{1+_UA9yXCb-g4>+O1!_LjT}-2oL_Le0dQDPljQ1@%1olo0m9SFbQsDgSc@5eFj z86o6`B|1dLDoy9bLAOldZ37g3`z&w|V-HsE*^bA|Srb(^b=Mx&+NQWihp=8RAhO5B zo4dOkIw!VK|AzS~OCFaoP=R$usDFttC<7u#wFWewy(_LpS|9v#_1m02zs)tqKW2XA z3PZQ&O$=epsQgMOJkl5`WKcp}kuIU=J4apDl%PB@b%?r}KEYUtBhX2)&gqF1QgeL> z81ni7Vx`tH^z+o^^D=FcL==9e@i@hplvgo^+!XwyE{!munX5sYp@J^c@}=0^31_Q) z%9Po+;RIP9G{eV<@a?^3Tf_%V_!BdHsnj`Ky&N1X7yDS#p>UtkB}dS@F$;j7sFS*5 z?*SrzNb#^?X$*ff!nUPo--zN&49R7EFIUE2Nz<6BJYS zM0lsWE<8dwH`k#o&8pVKLRu0}ct;u;KBBZFh?h*N~vL642YO8H_HNS-~ zv7~tvjBA4)LP#O~-zmb<2g7Mhjjtau*yV{aR5^jUZ~O*cN3`W_a7^*`46x~=_x_wM z3%>U~wO#TVB(?pti#XMT{+u5gSSR-w!k>)$E#LikkKfL07A-t+i`de|!f7SzX~gG) zlQRpIwrJO$48soh)C3)nIV{YTMrH=$oQ5pATSMC!OeIw)WT5VuO=?%rp@Q}V5mSVX+sSPwlZxa$m+ zn~rV0QjM?uoDucB5NF#&%M}beJ!~(@OzFpx~x-9u5Sf} z-(N{`gI>;}o}T)$fG;!#NqCvgxxXLhqRl0O19?q++p>#7KF_;324W6^p}7SFNC=}9^ORNz25K;1`HZ@PV5h- z{!Eww)yX=?Xt|I;?YRu4`R7~g=F3C4&>?1D z*RR;{a^!0*NMK5Vg=yTtJ{pY#zOaei?x!_~O$y#5Kl1{$*THJ0qVB-_%beEQ!aWGV z*-H@`t{P{F5cOY0_e#+z4nRG1q31WHV(2Ik7Ds``lJqeyHcZZ8#nTzPur}qkL#l+E z3H$(dnG9|?G9w2STnrq>s<$m)WjM5*2nyWCJ+)!uSLBz{IHQc6{1D5mb^{ zhJCCPy6JKexus~jm8%LnwmC&xH@!-D#de3O&*?^;q9r|1@RDNU*a~-E`PK^wv1Mj9 zbbaDs=Jh?x);2iPJV6eaFW4<~{RBtupKf|pdYmE6VB-)P#n;pzGn#;-~M*1a? z7xC9JdOMa1nI@8jJBt)Vicr`$ephzcJgT$K&;Yx_A|k&hLiJ*&XRhbFOZjtLD4=lU0a1J@SFK;R2J{{O_(lc_Mk6O?KOLURKo1XdIZ7Vu zai}*_%@&?3zQX^YwXI1*I!5w&boB;}iFTTXx4N@s-QxsPQIbN6?e*O5(rcy@uJ(n@ zXoHTGq}L@-noanlqzAt@{7{L;ElwPkUSZpqwsFzlV1X9hZ|l90*9^$#oMsq`on!~_ z?phRpq_}2i7^+5wHx~)Zb-J;d6qgOP4fY0HFkwuH){K5ZP1l_6-5@&&HDW{Lf*#oE zm%9?l#5KP%e$F@)EIQjLKTF`A44-x!P?&zxakyngPc37z zUVu=Q)uBt55H)MRI6T)gboNR1F?a`Bt{{CwZlxf~`D6TP@>aMP$_OGeZI~=$NU5<7 zHCIg?%w2Pp1)rJfXaX~9@lDZbF}!hab%%|2P0+1CY`v$#Qq>lsN$o4OL+d$Z+-un~ zqusC0ow|v0VepCRPy&Xhg*KJ-$nrlw#uknb^Aac?NVsN+3WoWrfG3fdP7!L5u7W>I}& zVQU=3WJHt39-up0In0_xcvGumWiZALxIz~3_RF1i~vf1T-JCYcNaJ4X%TFAAx|UvbLnvR^H3KPFxsH>}Sis)XH{ zrIVoLlOe--Ts0iW19i0PE{fsUH}13^Ql3PRTob-vztLVi@xar+8=+z7D4-1r`*u$1 z6?P*sR((qM8)TN@=qiAEAHymyLuh}N9*kP zp4{6*rDaO*^0k~n?25f%{ZSRGlXmwGfwUpfsl_WCEIw%77)C~K;D@|(WA^J9!IB)H6&{l9@}Mq`Wla3xBXm(Grh*!Vm{965n0&UoYWq8kE+lYN#!$6 zay1{Ezqy?t(d?Js;qpy9bNP{zu$aBc)>hSG-QpFXzrr^}B-Doq73rZZ`=2n@1k}s;`j;bXLAMtH=Sq~VVX}`mtJJ|Xs;7VPrgHG3ejfqSp3?#XfS%sK=*lKMoh%c6FweUnU0L39K9WUR$G1YFDGLqhd*2)Rzbdix;I=}(UTJsZF z*Gh5Tp2Z-v(I7Dg)3RN)jF`-UR_&qfFxV2zSFIWHafp(7UZ8<9jGYbx|EeUO*{>WCwN7@gCmn|hUU>m5fpSW) z?s-ipo8E5cTMV=GTc+jbP0u=-$5I!S?IQdg*Vt6;O{PBq*9gZpnR-Tyy7yUvJmTI` zr@@4`e(FY8yrSu@DiBOIDoUVZ@P6F9+ z!rGj~Yv8Lhrx`sSF#`%U(2EMz;txh0ol`r&_z8{Siwr>%oOaM$e+{85|2y~{Wj^jz z*kVG-ukxBVw3{Jp204qHtDf5|Lu6$5J5w&TlX9#<$@F^gpkFMnHK;0*;zgcI?g zwyqs~t2B(_M7*VlayEy6^+ZzpV+5zzW{L^o{>ntSVr_nE!vv;ZZ1&@|>=h=UIVz8r zr&m~m7U@->r7%U=LJqv!j#Xbk+HXvWnkzqNG+VPMoZ*iw5gh6QvRh z+k|V>F7d9vbc1q*L^E*i(zu;4DnvtaeM2`=VEtiP8rgpi$n^Uh@3xMirF|yl=-pTj zUvZJYR5WU{RFE0u*VAG#HN(r=a}_B78%sJLD06Xd#qCj0dY$az_h_`_If>5kIu#iO zG5M3H$*F@`XKE#SXqocpjfuW#!>NiPZrOqE1$`HQsnOBGz7C2+ZMt?kPY9bP)j>2) z>J8sv=_e6G?^SzsKs;WNm@eG3f2~$^R!=DLimzMpgrkD=f4;F=8lcP`TMO6hM-)qT z4!1O&t@k^LSi&1ZM1`-9!o^|Hd4u6LfU4SRnLU?(xrstrt>gi6a-T*ZLreP~=F-Z_ zklN}Ut~d!ajgm3>zbd@Zgh8FsYLEdZ@Az)hdcESo)tMC`j>DQjlYI?Y5{(!a3ZIHA zqs3C>@&~Auzxm6}HI^LmNdsI`LYs(Mxbt48FEE^$_p*DR-Wyl)jIg-OGQ{W z)dJfz&IN6j;NFv7doeM@%)k}Lnm1y|D;or2D!|oBAfI#B7prkEJ0?(IX><1q+w$GJ z08po0>LB9LtG};wB&F~{w$=OZ*;%y!3BD`kXP~cKVN7#Olv7WAwV_PV_O4w!bH-?B5d)&V-+qol+-!YY zhi%RA+dOF0(R-VI#Kw3bzaNcrXvl-zQRc;G6~(!69(AncSIV3?MuK{wSifsNdwCJ- zr!tWLHa3Mmd~s@QqZuq^Z`iu6SN$4ewl$MOM#C1XdX-?%DSBg_5C!KF;vg#2@z$x* zHm_3KTMvKXD5NIco4VTEZ6U4!%KR)Dae?EcC~48jVJSw>Q`>CJKr)+N2NL0v$aW#c z=NvKx=>Rm$%aD8|aFv<94gg|K^zIB=A8EP|cfC5hTWd{GD49lV#~xf6#Z>p;3AJlH z<;xNz&3yDQb?~*>1%HNflQxlA#5Z$}&J6x4;Eh_iG{NEboK0-YQ6sehSARGjx zC9~m|nhT~#QBb%wb8Ao?eSYW%*i)zvAdu_bKpJz4$w2Z@<$1XBdT(3|m4JLccz32i&pv>ZyLk0g=i}Y`Rm3!FgXoIByOg7+hzsv0rjJ%UilTS zxicF^mH*g4{^{C0{!SR$or?M>K@1*u>}E3PoXqAv`TsTlNLm09eWkX?Qaty?;8o79 zJXctjNcQ*BnpEH^S`8bh3nOcKq6-+Z_DtxliOtjkAOi!8_ofS0L5}hNQe43c)764Fs>gl+0`|0^Hd{|p*FR{#T^DW%OiFWNdSoC-pN9kv{@J5fNCQjw8`ewo2x6~no=a##Y*iQVvCz+ zJ;te>ab*YkP723_H6@!;MgTvSud|v~OVl^ECXp=6*^`JJv`wj$cjLlNjt43x!NzG# zy2GzP`!#Z)5X;CcD->#4jv1BJXZ+crq!Vm zL6vDaq$DNw@~OuGF%S}@t$-qd4E*k^=LVgwxh))BUOa2s`!8}1~p5VypQghLip_mk)FxKBIO*x?AwX)!R!8rd8^gb zV$9i!CDhW*BgFizfN_KbK{M&#?xgn{eIGrp-Ga|^AUjCiYu2bWBGRZX^_lGju;}y% z{>RfXkS&6RIzL#BYBc3DJ-Jmpcjcie?ZXi3Y1d+3#x)U+v`F84=yf7VYjzcEHHhXh zF?iZf*U)6Bf3vy{c`U^U6+C9de<8fb04@8qDTWD`kmzB8vQ=8@G>?LH8?_LWdZFXC`17cyZ5NS|9rYQzyK-glK0p0svPYGVI6aliD^VbrLPI~4Spi^g#g6?=EmQ>dCk^)U4H7R3$gD$L*$<2r6-NEonpl;DR}Qd7 zo6QEF~VYGBwx4K5R%?f73U z5loA{&jO+$XEBy)DNr*!LHv?T{e)729v( z-Hv`dwKt)4VZ7nVcTGsSrJp<B-Lb3IIK7rWU=U9|hrCKeG2TTQz;uGR$y<|95^M#eeo18+=_V zp3^@P0cpX$4UHioFvk-vM$uf8*sNT8RpfS2BlvcU3IO;`{H9r-g`O2GWU{4>N++Z% zfc{H{>S_$%)B zR$*8&HunQYOAN^f|G*CPS5l35_pq{MEKal#c=dk#<=aGdfqKinjFf~T zJylEQ=`^RF_fX72b6%540a9}YNr{W~N8QEFEF?-g`}1coG**AjXlm@B*HZIfE9dL{ zeYpPdqI$*FG;FieBPXNc1acE_l_V|WJEcC|G4#<#NWD(5o zlxiI0+Mb43`oNRImyQHhXCJit+}*3(VlO6HmEA4c{B^nz+oj1-n;2f8gZ?|o3tSJd z=&z?In|ybo)ABH#S7&K4!~YqP=3RYG$#y%Kg0bHqYK)oigh12G&))DJVU1qJNNF$s zVbm~G{An^eqyL9VRmBA~(+RCr*Lfcb@P~8kn94E{v{FJZV-cK4v+=^JgfBoT-T@s; z6&ade)-${fbrGj8e^MMdv^+L+hhdgpii3iV>f^n@da`kveu*Z+kj=_dDb2HNvL35= z1$}-o_++ALQj<_?gyi%QktFI!G1#~1W)Y%FIB~T^iHjw`N;j|ccfK(bB0@)GXa!}x zq^r=()23ff!G(Q=Z$xyATp#8-e0I$d;e%`odK0cjITP~S#>P(5SCu;tDkgk!6#RUM zOT6|ogeLBFTR|{!BuW!OE+yksn;Qu6Kc7UP*7f?k|3DV9n0X33OHVRpy&az1~H$9-!6f z#tMpvC^w%RU(>NM4R!M&3Bj^9t` zP#2KbQuv$i`6VF#U;NM@vAp%#?6ptB`$!P(0N7^qs3{ z*&-apXfCITl~~BhRWqQV)=&0$((=)cTWEzm&L+TTg}oB0;z5#H5}HbI>EoGGsAK}; zAb+vG>wh0i*7BH)Lk!f;5y3epf7I7$oFcJ zoOB;H)&fzsp7HTm?_4_1)fOm}ov5XO^cm~o$zdMkL_}7?!w7`X-=Aj5`Z+V@u+%%J zKF>Sg0~IfBg04ys6-v6mJ}I*Y=c;vv z{;aU3Xuijovi=;5OrIsO6X>RuG5XhpG~TE~#02BKiIfFJq$iDmRl$XMO##S3O2B*b zw^u%83&J%MEW{WR2V*V*`qWF=fI~FJge2~FV*8@Ht`8Bp1k^a%?^QC)e-qBPM)_B! zBRTEht?V{I&2n~`mFHrC{Ok`K1FPEKP8VE@n1I&!Q zL|+`os71_~4UqA|Sy&|?ap9Aguq{ zLy#C-1t{S~c^a)AVA_uyo~Umg$jN_!=rxkOREEWl;*3hSP_!gZ7{z{s21rXsrGZa8 zJ||%q7^#?}n7yJ|D-F#oLsgu9fzAz=d&g)|g-KKpWPQ}xoocmDr9;0z!hk=?%D%5* zI9l0;q_}e##J%Ltm^pR;D=Kz5eDjZMc<_hQx`Uw9pt)A-M);4!;_TBBI|-J*{;c>) zQ4j*aRhFJK0V;jx>=01%Fl^Ack~Xz!lun&mxz2-QhNodOhXnS;jf^Jwi-JVL$dX1{ z81?TQufgN|52bJ_$Si*R#0TCkUr^E}b3#zcV$$?GbiV7e_323nTXXKxTi5Y!jj|@>m7DfU{kKJi_z=+^BL=z%s9lT= z|Dvk_3ym~jcOj2U)7oAa+DBk=0aqCh}yndrT zz2|lU)s-JtsX;mP1*;Da&Kk!l>tz_bCbs8iE_+ALp+>e?WT~tGEu0x-(~;ktp4NGF zs$K}EhQQ2eik6iVFO45yv3(Vd;PICd&si`6p!jmaq10ZtO*#m`h&f+43G#z~BB}7| zux+IM<^FKunRUE7qDmm+Fy2=Nv0F3$4n~}wonnL0AZ6zG8RW$JH&!yT(ZHT#0%5W` zq$g5+TFppn;*)`EdGw3^^+n}-pDlm{;wWQj-4inNzHO1$Se18-C2xN#Pji&Pg=9}` zM^=0`Jo-2IZWfHUx)&Sscq;OKMjyYp#tpg1`Bx8pv1A7(-Itz^xE8J*Z=pzWWK1!V zmGsRmcFepTHzhLdOgnd6o3ctF+6-7EKjwVo5;)WqElwyW?+&ikP~ySU6_}4VqBx0Q^b4lKuw$E-(Qo)$A3jfsV`I7Yw3~W_GyS}Y15B( z=O2lRN?m8HPLg-AHyLHye5ln)#bJ_soGFYO1)<@{vS=EqRDzY?wkMWqyp#0sZ0#xVP-nc2MXh7g+u(mi@;ggg<2TDGydSU_H4R&w@}>eQ-gYqB^7Mn zIO=4Q5z6Np(G&}as{C3vE-}v-)OJ25f?l)d*fks&lQTwQ?iWtjsW_xy*JyM@|7q2? zg(8e~3i@n(S@(G71!Pgyui@X}kVRxE)cGwbA(`$qF7p18hvTzdp{PX4^ny z9wKo4Zb{gKe=Xa+*-5>4tZB$%sdv@B)FZKwgPsHiH3ov6NC zL!8Vsx?}x&+-W=S=0kasuO zw#E73)L__BNnlK;Ldq7rp@y$WK5LvBHOXEZhuvea#k~Zh_l6J^`Lpv*L4&!IRE169 zd7J08vgl9p;9s_dMb)YfHehG=3ocs?Kcxj7t_3fe=I}i8>Lm9G8x&n@s3XtRc>VqE z7C0m~gO@eqT}_-@ML>#+7xX(MYcV@(HjPJ0llxOSgZ~i~LoL@;rS3=?#AY)lrN2HV zAdlq54+zEhwV=u@p+DJ+RRV+RQ+n}|<+eT80QoE$>t))8d`&?EubVGWlvhh6 z*GC1>qWHF%o>W552ZPOrceb(joA7f>*%JW*3$_fQ&%Cu8n>PfxMhm9p9$YM%9$ z6l3vE89w4d5b7|L55L-Y>i>1NwszCpNu+!2KNPjaP-QlDZIA@9-uMcFA)SJUg76&Q?>y~RWSnG# z4Ml(YnDvd6_Y|vs#$16~q}-k*9sDS>#l>J9v6Rmu>ri+vI#R z5D=L0N^8*wJYkJ1tl|T3`nLe# z05`J$Gdy!&vpSHKoJ3s+u`}>9QmRpBHpr#Hw{fSx2Xw)R;zoP+Bw?7x4)CO$C-~lO zo=x)l(fDW{0~iyq(S}V1$9VM}`*9r(rQv>Qfx?OfJ{TFq5Yw0GJms$*PT~2ZtmCN= zm;LM=IZ8+R3q=|(YEdwQ^TJa1zcgiFheS^9#Q_{av*Qj0JZJR3Tifh);Ggb-TY3M= zf!s);k}dzZ!0dn%8a_R52yE{VL$_Nnz9|t-VpUaFLXBmXfzJY!R`}xPYQx^D?7Xj^rz-;64<`?y7g76m-vhxM@tYa{3PAR#3VmJ z`MiW_FlBA^W)3#hFqdND=(2rjsLZT)Vo4X83oZWs%35YjrRglsINBT!MGDT8uMP|W z_Y$#?N^ka;ne*eZU?_9GspS6~LwC&`Xd81H3hZAyW7gb+1UA`8Hi&ZrhR2Z~O1==s zy@3itw6jk@bH`jSRlyu=#P(8PX_p^M21}KxQj1O0rlgW(zJ)Rq4n5^GK{r$peMXwX zKJ!8>L{A4m>vdbrWe&P(yI!(PdzMkans;hQKKgmg<>DPC@_oTY@!773x3YWB-hd!bZnVINh&CD6->NH zQ@W@p1$eHhD|13*p1clXbWJvLnxQVrcsaLA(@LgLc|m;WZ9;c-{;V|yD!T@ZLp_E` zcI)0aD9!KdzmP^ZvE|>g@{8Es)CTRMxY!c}p& z6e$atmPObEaa)ohSC~>i$D)+4f7qK-_?>TT6Lo~}FIRUpLdHueV|1}KKUnt-cXiaR z<-Dh(x~!zoWZ_#$6@H#QhqjQzE~}Fpw5E81VU>UQ&OHh1*k z%9{SX84*6iL?3#iVBK^V{uERvHBzhdhh4^vyBiT}&=bpCV|8t!{w<5#B@?>w@z$10 zOroumJl}L9x_ADgrLT7@7z;*mDjU(s54LYyM{FB>QP*z1YMv6Q&taa5x*RXz4?&}r zOQKw?5=*F>$@N{xKLxkUD0eEeZkk*1)#gEBpArX)0!QJ4Uvd_KBr!?l73JxFDOt@8 z>8hof=&s>8Z6h&ed{PteI`^!IJn1glzK`L^hGqtJI+xZd zt+tnedsOJ34{I+JA>0dRGDM!! zeFk+@44d$iZg_diSRcpRU(FNl4Y!?gsVISCqI8V zWw4@alyL9T)dnERdg9Lx!5-;ietvOsw`Cik5az z2Kpg7x#s@D$d+#q3E`(bhtEOrA{B)#^E|k(XX+6AnzK!|GZtu*S$LN=8!do9s?Smu z0Ht+bo^*?kO<#>w?9#^`3P5q|s+4AVQ^@Sd<%+3araKMO2@lG$fi1I9QeT~%Njv~a zH`4-2zRxyCev`)+)nC8Is>qT4cIGyJ8tLZ2A=kLPBrk7&(n6oiA@}F>pO^7fR-tF*Zp6JYPY#ewSX3Q=b+Yza7nf6m z%QT_0MT0%BF*@q7M9z?dpx zHWKokN0a?hw}65?&#rLwXC&|~&re_wfvmf|tCY&9e#59;=x+soSILgZk^K?0-*~9# zsDJMK^9Y`gFRenK=@CYa$im88E`RL8k=9|l*sZ7T6#vfs5OV`Z$S`iqLJKIew4m6@ zTABt+Vv~VKWc68XfJ1Py;5yi&ikD9kwV>wBg&PdTJxdCWhz;F<1WA^Qd_%!dqRWcV(x z!=s|n!!J)9SuGXE#Feu<5K$&3^w;EWA2-UG$?@F~)9K)eoy6Ny=3pP;Wd@=M{-M-` zU)x{Uyksg9!7Ak+%{{kvj$lERMhGr53%$|SYb z5rB#HB1QJy)x9MC(%{yfbxI8r&9AqYpXbAGu(J;i5SUAYG6EjTz9eF<421_E!t=t! z`cI5zJwzR{Gzoa5Tox+{@$Ly*$qjs?qQKFgKi^KLFxH_Y&F2V?ETz!d&sE4#;5Gu> zkp|mMt8UDZQsHyp;c7Ta&}g|Xh)9JvAy%x+Sa5&m%RX(@d&ElW8f98SsRG57#{{KY z(UBoq$sVek5?P5YTgAlmWl9Ce%*jXI-_P_+hHZ=}13dYD0F}>X?7oD0i2IWO9~w3Y zM0T@Z2YchN0%!g^yKTfAvn&F&bRVC%|D6RT=k@boO-`Oj|VV>We4EC zC25a7rUr!nBI4*`!P7pkKUaRGg6K_N1|5@!!JUPUl-+wsNu6ywp$LuGLT4eA3_G-u zTj=Wc>QOH#ZXuvI`O13Jn0nFEjWOf0kIJ@VWW24>Md~Gzfc(Jg0g%!*WIcKmiY*Ba zpl%3_#*{n#_2o~=5IV5W*M{m!dd%z;3RCnE&CihyyUfw}2b|I;VLujX=8JwK9a4S} zDde*>k|V~~E4icWBH65s!I@3@NO1w8?pkN^lSA-*T@~YHuciJJWQZ2rLgajK+7q}6NZ`joG1}a15?uVP zRr&1ZJ}!$4)r}*xkoXiAP;-<_y)Rzz49HoCf>)ulf5CB9P5++Vi(}`tZhkDzo*^8x zyqgiJC^8Q@L-K>{Dt^0&_A#DC+3Ibx{(AQlkVoJGj@QUQp{O;1Kw(LLPbmhD3I>0* zwbt+k@tjka+W63e6_UDZijFCR@2fwBS&|0N^B$lE&jMsd*DGlu-d>eiufxOh04oao zk5%otaON^Xto7q$=1YGPFOx^nok=MBFMymtsObK6%x6jnaOQj9=fIDg%c>ZGx1u|; zbjs?=-e*?I>9KA2aJR?!Ln~=c?!*F9dF%aa>1wDs*Mv*0E#@bt7}QBI+L2R*$wEr% zac0_49p}n|oE8KrjZ-B3K;p2hTnW0VMVC8kxb_=RS7%g?Z?u!)b>iHz;{iF&Rynft zSc(%D-XXT^jhapA`mAsMf9OX>x0gpoLuE*ZMKvA}jB7@Uf@72s>qOiyKsZOABuVGr zZ~Dd^ty-S62z(1eB#rNsoZrRrZewy?;Gd0GWv1o*1?7!e-0!!>tpz`O4f`XZ^Y%kX zJ`ELask<+K=|JYYP-Z~?yDS<2 zG|inpJg-bQ!I?_j@sUle09?6OkQ^B0-W!2Jt9ZXh{3uo`jXh)MFT&F>kh+q;|HAvw z!eC*6R`9Ar`YP99Q|%d#iOoWK;nUcI>R~8;0AXdyct}3Ug)ywOopUjn6#gqCM!W~2 z{|ZuFZ1iq4xPfQ!`>d&tGW@;ENA|xo4RxaFpr93!HBNo<=4>I-aK1NfY3;iAORa8t zUomw)>MbbnR&*%AWG5rDEk428)vXHEb(x2V#$5XU_UQ({JL>}HTOruN`4MWd@NSSN z0WwGeJ`0c*|9_?;zzVj-3vaLR976-UAqtLxp(olfs;04ITeD83#upaDVqeiJ5C3U6 zqmBL7ycFQ{O<)oq!TPOr21z7`en&y<8le(iF{@t|Jp@`9yTqm`X~a0H({_BDERyU= zs!I;xHsBRf!Jj?xdX*w<4MirDcd63ZeryJL0lFGr7wc=DISJ76rl9$**k=1it%*3{=;yQ-+wi2 z24!q`s9DTP{1!|YB>ZPL4^c>Xdu^p!^MAZlp+?GNRGY|0P$5zbVf#syrjsrkzXERr z`Ic|-{EF=+WR+B?X5hEIS@meW<2lSGMFzLI(r z=P>^XvFw4H;Ye_>evSv^E)O-=}%vU)`71M!;J{(={hMzK9i!$ z*WSmE8xrU1Iz3@T0lXWs=74&B$e6&+5$+j$HC8unjvaHzEQ zCxKFGU^=;ZO$N1!z1+?c;URnCF}=Dy&aB4%W`~^?-R|uG0J|vgiKg9{UFg2x7cA_T z7fNmTr^1_x>%&zPiVktVCN!a)d>{{ucueg=2Hw|V^61c>TauNe>ZDm7AKh(4Q}3eI znA9jw;kPv}ZYI~4jnxcrj>AN0ZgOuI`;8tk$HeYU7oZV;G|@)s+!BQGsrM-%c@{Li zm>TPjr&%pW)yWU|{zvNLD@&!1W5Flr=P9ryP7ElMDyU*)78lT56Pi=nK~LbW_!_q% z7E^mX3q@_E?H{Mx|9nQfHxrAdsES6%aX~su`h#Kz=(A~?4r9$)l4n@%C1b^3euE}R(F+@RSqB5vyD#Ihp-oM)tavd&|HSZf%l8?yj zNiF(~!BuNq$wz`B%v&DaWsM~AJ&NP2|1yVq^RBGn0XWl}P|Lcc=0RD-X>chH*Tm%Zeq) z5j$7vT;hsHkCKKgc_w$`h>tm7_l}3N=arHplCeIC2^=;257<>HK(v_!sokY`yTn30 zWoFGL^?gM3Mmn&LF0XAZFJ`g~u6oM_hA(4gDqnk}k>fy^4ut^Wk*KjPeoE(~9@bgt zcJ(34B4ZxbLFqqgvhW#{VzmIek^;)UO*NB_e3lFXL zQ3mv9*`<*?s3Xh%yyj9N^oQ<5iUKv%BItlmg_N#)8i5&>hTUntF!dC6+7im>iPJX_ zp4loX64N-aREMDcA2Wwk6mX@{y^V7-nnC|ypHQ{TDqs2M|EoqhGDd#eD`o<3-?$AS zX-9@lh3e3%L76)L?b{WeG&p#Fa_i>Vs8C_6(QHp`oQ1Af4s_fX$xnY}D}qs>99T?1 z6}wS-)|y6b-S{O#akN#>nNuTd5!Y=(=(>ENQ-18zLMRl%d%wbxJ%Bt&!aSsHh21Ut zotm3XPpX`hOYFAY)iN!5j9yoG6)nTJkwQ2Uo}34rz4y%}E5gEzFS2b(lH%Q`DyQ4jRdxd*eTZO|X-l6s zA?YDua{0+*`hE1aVTT4&;3sg5w~w3Mjb=RjZcI;pd6zzDbTiqbpw1?z=k*-u1J;|`3Xmq>p zMJYTv3#%^@wr{J=@Ymn+#zoH6D_6x;9=5a6?rU9$0u?jJbW?{$%=a0`ctaWux5~H8 z7uU8Ok0dPvs>HRGc6c89RWTb8pN@$o46&^%a^)V2eQ}Vm^)@ zsD13ruw}>3hO&R&Ubd^lWD=q1oNE^o5}p05Sf+U)t%UASW$X#B|7Ox=u~&N(w}2rc zO}fy+twS-+P+mqIGH2siDQNcr#}wT!A;CK97ruiXY4Ca|tjF1NCf7kk?0xfdfKgb4 zL0XkDP^#5sXDfz5B}Bit9zPJ)lSEEfbf)3dp?D5ncAAgAIGZ)1npO(|&C<&RPH~PQ zdw|E?*;Yu8+%qv;t9?gTDIYlxk@nmH=IA5y-8UtvXdDB`16tUmn?0GZo&EusuzCWt zCY^~oY#CF=1!*X}`4`ti{QO8|DTt)+bABI!xuvSU8m-(FC8DG9t?>|HvnZruz=%#h*|AM#bDAmRcfn4J8>*pb7o@15D; z%#QF|bcha~(`)<`n=n2NBRE}>K-XjpNQj^He&u~=;LnqY6CxeCE zEw?@W)W+A$b{d zM}LzLpWy;shsouqI4k{l9Dm;;KKu*5At}@;gpz%wPjp1rJE1>xaMGP>JhBDxkmrAXS-;l(+ft`KwK7^E?j_W?Xa=`CW5Yg5heFyu zn^;YPqK8o=;5mWnxkRK?q;mtt6|iu13Ow;mT5Lb6;sZdPvNDowB|=bxG&V~PONld1 zJp$S*7ugB@UNHB7_nxVLDPYaiIyoLk8WuCmxiaiFm0W~_-@^sidjvhw6ev>Kek=Log0NAev_?kjv#_E4Vad|sj@cK z2Q6Rm7VI>TMdb;;==xD*JK!%UFYE!R|5-V>$)5>qdY6#qyj8<=0~-hDUEYEbIpF3L z#rw+A&r7y}mcuINKdn(f_hhufX0O(mU-fJdHSM|9ti}+fkpBQ`xv)GMjmE7WJkDJB zL61mfizp($oLh@0#|(`J+F%LwsPEVNJRwYm9Kd<|dU%>*jELIN*>#$p8K8MhfLHe$ z=^DP~^|sZ|3M zgdQ=bFv?FDlyoNUd%WL6B0;vIJ~oY zbh>T^FLAX#o5po24^x-FRkUWIe*c83AP1;e+yiM-*uVxt_!}&GikIt58i})#i!(-L zBc)2MSaF)ym0KwuQt2zxBqbx}h1A(s6gv7p9fm!_Ou-~Ky>yI+LojIl*>r9k^KY{n zy_RBP;SO6FIBxe}QYd!z40$z)H@Qn-xxKnvRiOJeLV(GzTyl^hUx$R%8KchGd~*BDL}<{Exgugl-2q67leR?^gv%SrRnQ zI#;G=B1U}2k97gyGpj%v3$udeufAncgzn|=5`QEi)rX~I6P`%I7OO5iB?AxJh z`raIC|5iQCxiMrIF=W;dE-O=OrceS^n!IgtC-Bn%&A`n+bpkkPq3DM-U)lIk}m5DI>? zGe@-s7Vm=sckP%0Lv*-~({0*Bc5abzec_StojDd=lqA4@JR?oA6>cq5o>o$zO=&1c zvJ5h00AmGu;*kAt#ZdXkL=+bQXxHuC^>2-iK89X6wXw4;T{p96+L9S2`PutzuKn=S zKVukS;xtt8&*$)vJRI{cs!(N?zA#UtfqJ%IA$8{WG1LOhC~$S>qvRD7-+`XtC?zJ!8R-;{7CyF6>rUJjD>Nv7$ zQHs(017?|_Ugs07{F?Jb8XSqzs$o~#mIgYK+3@&UT$=><=2P;x@RPeH!t(X1UlV8~ zmwEAQqHXWrvSxJmr~GnA2^df;ax#Kvr*xG9lJKDkI;Bkv7O0(3v-rFnXVSy#gFO^} z+PFAy9*`xaH%-n?5V|061Ib)5#Q;Vb?*1GwcfJj=VVAs{{H?9?*@rv)2@kKGnw*DK zh&*0kTi;@1np2S@KU98I2Tf5_#0WzzmU8HGXqe%5Zwd(BJ|`u6h0!K%BW{Z;8$<+!B#S6nk_U z!_(V6B1uD1EBR3UGf{?+cT7?C1mG!G)|2U9nD4m9Q~a$>50vDZp5jzLPwyi$8Z@C1 zhLIg{7d&=c$#voY=$uD;OQwN;Br$t|CEf&t`KleYFsA{_ydvG)FfCP&76oZYa3?Si z?<15%pn~vT>H6qROw||Btec0xXLY>iYMM zDft{w5|x(UslxDJshw94FPcWJQpXK9JF4WQi}4*TC*Nc<5Xum)^Qe7L%7gtvPsrD1j77Sf}OeDD^1-Ql}lEMG5gNCMXu6oLP~oLiU{dsm=Qf zFv_3U4zV+D;mv6jsCY0wh64`7(?5DaDOuX=>-R6$QQPji4BWivgncUIDZ8W_r0r-{G;grMm7E zNVm*pqj%hH(&Tb`>(13hAdr{vaY=z=fQTU5r0#$|WFA^8nEEH-SZ%&iB6y!QW?Tc_ zWXAXM9NsvLr`=x>8IOXhwUrEq8!GP{EC**l>n^Cr?0UCqeUjo1A76gK{RibG;bZW@ za4uO@8KKKUjQiqcB7=wN%$yL?qA?4mOsUH@Qafv5(R0$%7<3C{kcP^;Rt_mk4=Xis z4mFiLrK&;BaQS-EWHmfT7%3wd!uwNY-v;Z$T&DD?)HS7;vT&5pum1;%)w(JhL)9=& z#*rw*Ie#pMGUrPeQsIsIpzdxA5~k_Bw`eT3rV)4?5~pZ!3PSb`ej9s^Pp!3megg~; z=d~BZl63!qF>#NR%3zl1=oDzg3lEu2+Sm+v zf`280viBNi+ucsgx&!3~pF%R^@Y0nMck!EaizmHvs>i#gL8RdZgw)^4t90G%2pgIo z!E}fc%(^HVyBteWv36HIs>7B=#fPV&9^ve*RN*`ofQdxpGZ2EZgVhHm=2@;(TY3vS zn%#^)DF9F6;K2@rBdR5A6H)q*Dc<%XNRD-scMvJDeI2H77>7qr9OYCE@=o?2xUd*h z&$yT-Bg!i3#dpc_QEnAC^s;U+5Ixn4m9obzLzcMo+A#*;`v6Fs2B-J7{FpF=@;phJ zx8^AuM!cHdvmMm%1{;JdG_N+(H>^}(qQBpNXP_5zPow{^g?UYnh%u-WhV!n~Mf!uv zYghyW2o!gXxr9QPV>QC~s*wo<)-t|~!enO={#ytPCJi6tW9{_ySz8;dcRn@S3S(!K zv!>z)?y8AX;>wWjfFQfk@)wsRs_P1f;X_Y-s?dheuT!5Dn6f$=;o4suuz;L?RSI?3 zLFf5vmWMQf0)T@wCP1z}|FsPa=9hI}e_=c;D@7n0C%tAXP(lQTPOz7)EY#+zMP$Im zP`$7BvkM)1jWR5cd>MBWIWJ)@-dRdt07y7C)f-cJ_IGzkK5R7~%U-~rxw7YHL;Yw{ zAX{YudRO@&+#!>{9xm*KkyI#(qfaWf>_Uib8UNzPR5!v}+GIt@@CAcZ)3@kuuH_zO z;}aVaxEEU4pIFpRn?=x;jS5w$KF?7@7i_L!)X{k_qr80lkR_Gqgj@}H7yMevR8m16 zRxz4zU4$nH*<@~_fWdAL>1F~W@f8nTln7avps^qH;$^3_X`fvVnQVR2=?`Euvf0{j zHa2xUl@bWKh0y}D#=TU4_(eMWVfW?4*W|%ynG!NiRm>pH(B}kY>5&YB2litefB!Mi zmz9GHfv$byv@9s(L?K}|$-ch^R==P6jN{j*1^*@o!oDSTEGQZ5t?R`O82yBFK>y$_ zPdY;*ovRGgVSlhPCjpzprwog@N6l(}j?cntrJ~H*IU-B>=ut|*aA<2kp`IJbvPp<* z=?*Zdhcy>^DaEM6&4t|fIZsAYM0cFpl$B|W-+Id!;iV1)70&b(Ob39Yn+>~?q8Gm$5fZ<6L0>8Qi!D#*ojAgJ44wvItQ7}2MIOrnNduYn=wBc zVD0|<*C@?bJBw?ijb1&a5@Riy3_Re3Tq_pMk)n_r;MF9gZ;R{4_}+DV33Eq|-iSnzk-KE25pP+-B27NdG1^kQy`%Sv z!FJ6txj0&(0`(=49k(P;X6AzD<+xTtaV$u_UDbH#FN2y?q*K4yRQWYoD>Q+4cRxSB z7j5*QEr;5xt=(2N$w3;E{q_X0pGFcMR0u2E1f?D1ErdOE$Qj3=3@H0%bImA7icZuf z3K1^VDFIgi!X6~+C7Y!)Lqu_P->2W=ORjMs7-%eg*2I8~`LU5q_{>lbJWJj{!Eu@_ zzp6m7Xh@h3#**j51E5Ci*a{kN<@UlT{xmWz<{=SwR617$+lM}0ecJJOdImtXRc)jSVGuh8-vut+2boP z3eE*kDg_xwIxk5-hCYBM0NK>?6#!J&VPV(jKgq)Dv&t8P$U#Wy3%2G0Ce8Q4tLfwX zlaFY+jH!_MmyJ0zfGpFT#irbGdEB|_tYQnLA0;s}`a?o=Jek1<;o4Mq^{zaqfzS?P z3NqSuPouPzSf)7ME$v-aq75-2YR%@RR~mK1^{lV1!o&6x-=I9BbTv~;+?Xr>MSN7W^Y!n0iZsFW?rY_au! zzUPubv3#HCZB)MePIR}!`39a=DKN^(8a=xZTalM(TK#%UimCPHv|8!U<<}b>nKXH< z8Ja@1$0E$qz$r_QPg@M*`NDrv>gvp2bW87k!Hn(hh`+o4Zh*~CA@ci2ldV7h4RNYD@ZzVybI;b^Y8xBviMajxXPE|MQ$CCJBt~=c(`a3 zR@k(a<3i>`=_zyA>4u~S#N?e(q%Oh>!FWD~j}EE2%jm zGwPqn5^Z>c8DUi*E`4leSCcZKCXceCZMGcH4Nf(0#)Jw<+u+U+oK@znnHzCS6TD zG~G`mfr)%6^U&$iUDV0=2N2l|bRByBp|5BYQw)9S_+5TeX2uh|ME~?ggMXEIResYj!70e)?{MJg@76S3WL3f`i`}hqkS;MSBbT@#{RkUZqnjZDHm3VUxhF)=UANdQ44SL0`%>6&i9dQ7BDTZ3u$+J*b->+n zYa|4=jSx3ek8-0D&O*c(uDz#AUv%RbSDn&jIEH8n=pVeB>i>F%bvglk<_gLWeHUe zqj5|k1z7N7osU#}E`)^QXW-au*hYX{64=n>cDDO8A)m=SG}6!D`F2Oxo|X#^%7 zX2RKY#|hQm1n1>3`c?<JyebJ_@o)nQ&fONC=0e0jyl4q(?+j;l?u8 z54lK&p>cK~d9DpKs~fA(!k0<{Yt7Zi|7R~`q+S^837!8>LB}m81{=s0R2Z-xbF&Kk z*6b&}xVfQ0i-h0kmI6OZe|!Ob5{RW#HL?zmaPyR2eOpmLTD=Zvn23xniT4%z>U=u4 zKdoz@`bAa5JuEF9ctI`xNAqk>!>_ARfa*hq4tTDEj(6Jp>mp2TWq_ZoRWx)4-|6)2 z@`Pz2avx9>`v;M_{SJE)f*K|R4hfa}do;spwYl=*rJkoK^tE`NI`kwKHJbF6oTm;+ z``XmfrcLq;Xy=T)gWvzsM<}bO&rnvysTxQJ6hkd$CFQM?;+$U1#(=1ZPZj8$m>Ut=&`43%ZY}cM(TT}s?tA#j{AzB4OG6i(`zN_j!4QsKsJQEg z=B?Y_*NYFHmpL6JgA}ZVxm&r>J>K0EO#?JA4>vHQQ$5%0pX%tgd$NW%N6rRSvE@~q zzb-8P%1nCK=y`>5lK4~s=SS_qjJtHzX^!R zYwqNAcxx0;O!6VIW7LtbTTNq9j+}@?B$PUrtoP^A&dpn09>-^)O3sXqR_@0)>-`lw zZ)~e&bLlJI_@c;JNxzn^+FJALi6l^6+1ZXs&HK3hy}BVSuR+Cnm!-SlD~r4p48+(k zNxRVZ3DelpLnX^+l#b>`^tW8oy`D(~fCjm%pPl<4HDg#tHWqoeM?TznrT1yJ*2Jof z?Aq#DbGtBJmKOb!rF~StRk%8qg%QOZN?wPgL<)OmM3IYbCaWjfS z{ZJLp%0u}DUSQt*eeW8;fzM(FBG#m$$#r(@AhOO}Qm49kiADYy`Zj2QsEHH**0WmZ zMw=5S#1KuuJH($(G9qDzhTP@zBh5?ZDkzrB}Ekj@KP2iR9>ffN#nD`sJ26vcNU zF5IbKxWu^&=GGVq)K8gX;b)>Du`98BB1>LKRw$*jQwXs@x_E#R-GG>NUl`FYJ_h=X z?SCj7L>{NEyHa68C2~8Q3t2W$mPvmlNS~`?7;Zv$Nn0rbXsHMA5g;era!ojgnrg(e~ef9O%XxLQW7()f{#=F%x-(yX^KV#+6PG6CXA}zmF)%~se zUZsfQ8vQ0KFjG=>LG%yfk|<1?igo5eX&33XP2&?CGFjjBGuG02@TS<&*xnt>rFOB- z47W6FGB`KkojL~i5S=v*i88tAdeuVNP)QX`RL7H`QG`-iAKlgAW@{?z4|7~R_pAWg6+ z@`5JR+iF;-HcZWtjtT!HJyed0yrY@Tg3fYFGBaRTNv_j3cw3)G?7*T>SH?=S_~JIK zATsc|P1E zQWj^xz2ww}eATg)I@sGJnRU+Y1db_u&bE(L7fZ~7m&Z$a_{)S4 z=@7s7^wsWF-Fq(u><-=Wq7hV6sGp@t zVHe`y8L-8o9G-*=Y%faxgmxMNT2Fo49-g6s$yQJ={SIAu1>6hzmt)dlF1k6b&QRYR9 zks#N2A~i2k%^~`2g>j$Px+5>}(fI1L0nk#867uO)>C`xh`DD7gAYOWEdIPaWk!8RT zdz2eaKE{i4zzoVZ9@tFY(oxCj-hY0S#2$JZjudT|b z>cJ;`t`1BUzB%}&AI9+q*9^%@u||qdIdM~x5Xr<~Wtd?hmeL`sMl4~jdAJ&@=K06h zc4*8&N+H!ab;vxe#Xy$S=ZaZAioh|iBgykZZc(wi9Qpxe8gDniwrDYMWKiCFS7~A5 zsOEuM?ETt}tPezjDtaq#>wv>`N-Cu6K(Qkm}oBFpz|CS z@-vTXqz>Pd!#&Vfxt+8_)ab~piH!={nsH9ZMw9>Qt|1&W##Yy`4Z{H^pB?Ou!`}^Y z$THnju!d&+FJ)`krsCc&dkVAjFz5NITe95IvCWIXo8%JQHB<{Fwl40Oa*D59n4Oh| zUl#gcJ%78OHRPF66tU)LKUAvOUSqHpnIOa{#abrw2?oC13m7b`iNz5!&>(4+Ht)WRaIlI1+qx0qA zk-YNo%tQ(dJZ;tnV38v}U>AF-&6AUFd~_3N^Ur7D+301+N-kro!+*iafY+Kd1~5LO zL+%y^*1pzrO3_%7%!D=@it(&O64YUPFaxR_#IG#1(-t>JQi+0&=m1YfNu$vSD82Bo zLt!U}jwyTq%Ly56lZiy+2-OTRW2$Y6zG<>*~Wt*4p(OA^49f!Nk zHx=U#oum*g3(=@9*1)U&w}rS8%63=Ydl-7>VC3|v5~Lg;aZOM{0*ZCQS3QRlDZwggG9iS@Wg3`~43L%pLp^uC< zly|3T3NGSKgtHtRI2XwuQ@ zIIrvE{p$?*E{p8M{)~kO68EzMhEI9#HLsPV-2Q^1MRnbt(7QAibRXN;K-dKY@rnnE zFc0t;7jTs3&*Hei@VVOJaHgxH0!;ir#U1Sv+#-vhJ;91lms6f-`+*q<)iz4O0;(>p z>2o{xHA$;tGznhz(&28r7k`^N{(to*b<{>VreC@VG^cNalnq!OK<($u*TYo+xNh?*bTqd4h#taPz|%2QP8TP#~Fg;R7kQZ z<{Tx)I#CJ=Z||HB*WZOgYh&2+-t#==FAkWp_$gIk9%T1XS_8b0Jtf=JjS@&)ABA)t zk7&I94jbF!dML$_*(o_#*xY%QxOsh6VD_-cR10dW9xR*hgRlxngmn!|qNlDy%pel- z!ntpiI-oID__Z9FhE&56-X>OKWa{I_HN4vG#(vNrl?-gHWHcd?A4xrbgLl5w?f^^g z@6{Jgqz35q$~+h@_Z7ZQO>&!s~J+xNF&WF%Vva7 z6`HT1AgJBpIbtp#c4%3JfMf#VYg$8bsQQ@>cc(VA`(`VLPbu}TS&=tDthREz1Vx>H zZzS%4DvdShiakQ8ur$_21vVNM;ZYO8b`jLcaX`M3;O2f zrw3fdK%l_Sj(&7Mm@ktU#vb?RY2s$o22AdWhz7JxKNAJE6zBNPjrm# z^iEovfD>=}Ud@r0iPmvN#3ud=dHtRn_yym#|4@p;w*|8a!pCGDRkH(;F10BZjz*b- zzlLd+;MT!22hf23i>d@*8z38is{@h$YX~p9#aX1rc+=;dGgfDRm3{QS3%x*ozC|g3SD10lle2&U254sqU(bA+1H_&%b|SL; z0CKPOkSI%HV;m3vgyfhe|HI3rK|RAJ?mcmADi|#-W2D-c=Nr)eg;tY+kNbI>_UWbS z4|+351Ud6qXYllopp*0<&M7*8BpMy!11sg78Ar!udCVUezidM$aORux>FDl{c0t@< z!-Z>zyv^9p2WfP_E{}F=z3#hCxrW%ojB2cH{6Uq1&pzP$_H%w5>UQKc8h;6~3frJp zh_ygqZqF(?9PaKpV)K42f5Y-4iEuV zyE{q%Vph#nsCX>p9;T@aGv~0B0gFBMt4hTVTY8F-Og{mc)W-qp1SSjU^G&sIiNAmS znSxM4<|JSD>-O8uX@5(=IaO8z0)*g|_olL;e!i9{B#MN1*is6S|MXrwJSVM@NU?;T z(XnM6!-dLyJklR(z)7u%gnIFMXW8|~)A*hfjw-`Mo&F-$wfYIT?}!OOh( zIYTNqTpF+55B@Gj0mQT%@DpR*6@AjCCU@>oX9uN=OgzpOQoRuZ}TO zOtd_^$2^N`B+itX=*04JT=2j=vVXIwcG#KRI8({8L*nRy5^q`$F3&`4)w4To=Ph-^ zBB@HLb`Pm}F_(9}B*;~4%fx^aj=$%=KSr2_pHoNPIsn8{f@WrPgO9YUE;JryL#B zMob2O5ZDX)ty|l7)z!~TO}!Gy(CqG!5nL>L1z2T@E2#xe2c1Gh^)h zgK3K@noAvw!h9t9baAV$u4YFyO2kux33`A(pq78?EFhwjSc++2-rh(vOf5l(*}Xk_ zD)9SL7_u;}RTE>MS0eC#u?_`S(3-#&%2 zoDr{Eb%9u;EMHtM0K@D69N>a?qCD4%VNT|9o6gqVW=AF9Wff|iWAIA*;k)}*PBU{$ z1oI_I>BB}lEs}{zVm+wy4 zWB-r+JQO1W)*-2sO#PLrHW1Bw;gPDeh%D+D}fi zY*ew^!I~Jdb3t&qPBp#u2+RYQFdiwY{kF=q$>LT6p{x8AQ$a3!FEL)5;kbwV?MXAW zq#Nvzaq{7)FpMxE^wWWJOa8qiVS-HV%w*G5*JkKg%z5%Qg9hTsjGl-%^!4=lmIL8n zBNgj=Qq;IB;d!9pfjSaSStY`RIw|EFVB1~QA&kDUMVIq)UTImn;@u3J=R>vc%Fc#D zv!$y?AzqC`2p3TsyYwT)z6D6_sn z)G4448@~F+j6da5B)vp)foDcK)dV;#u-BY|b4iA%k)ij=KIBF&r>ZGpT~+h3b@+S^ zT~K`*I3JNG2<1~m*@Ruv9;4)&9mM;fbIzz;RkUACcXO zOOx|i#B$3GC^CT;Qo_^gi#-A);NR&MzUt}z$h6$QLhwzv1R!-9}X3pLjV8ohmoBgZJB^*(GaGdt{PjjYZekq}bW zHffZqfFy(-JUn{I(=pigBJ7)#{@V6x1I_2MB7p|gA(SLZ zpKAACU63Is2v;(l@^^nNchB^70Ux55w9bgUNC!-cv3O|~5;8nSUV65@cA)Cnbi!(6 z0OVSH!Djv4Vi{Wk-}!(esY<+pyIo*Ohv=46QZ)|oc9>rO)Vbpjg;B-uj;}xEYxJ=9 z%EODmi988>HsJqz_XoSlMTisV?AvWnr=#_Jj=$+E{b?Z!phz*D8yHVvKI~dK$N}?o z*huF>wc|~rlPQmrV?q(Cu?K12`u80lSDr}2N+E@=>-}Zi&VvWW`=Z|~0&INt0XuvP zXx}Ls#DLowTeYQ)YZU6P*F2E6*XI>%t-@q?;YQoQ?n4Xa$0z$8hz%RxdILZ@&|Z%AzAX5C3QM>X3resjq+8WKL4XnA#LsZP7_5sR-{kT~RLkL?2G@ zi-zNv1|dzl^v2osi5^=JI%%tVM5L!YPQ|WuSUIqnRA~T|6HivNF2YS{K%%pv!h=^+}7o^cO5N$ZrmV!bLwT zKHt)mq-uj5Pzr$SV(U)BNAqKz@_koiwp!pkWLP}M*B`<&#z}9$IOphb4E292tGD?>wfbm40Ri`j6S!~SZL+V zY_DKR{VrX4Nw?OsPHYO%Iwv{oXYFHDP{O(L*z4^#orHs-6g>BkP3WJ+wM4u!;0tH3 zwN@KdG*GRsr}Fib;JI?EH3Crv)3e77?IdjhObip~?nms=pT(l*qjvCr`;!Vffmh4$ zUeP0`8yE7J8mD;!-;4&oZ+o(DVH0NA37f$w6(nQ^LgLEcekugwV^wl&%l_BLk22}5 z29G;v!%(#o@I8hWwhefxo+20ss;`4o&rJ<(E)T+I+*`LcrN|EfbdoMpn~+98v}m2k zDjJRZxw5N-lQgmdGi($WOZV5;9kucXjVIutT0Qz;e}n%+cmm~S>+Y_ecV zKtOGNX}U8i3kTWn-<^PwpQ6sS%>DBC4NHGHIm@QLLvO#eHjo!Q!oO>=lvQh(e8gL* za12d_U&A>`$rfSp*y5%Qsh{?x6o3*aJ7_U!@a1lT>n?3dI;fg7l$auH1n@fzJNK~K zVCz9+P~zPDpm%_OR01|-$+0}Dgdn2nQvo&dB>Gv(dT2q+CBE;R@I=Ap4Gq zPPW~aQx=h{gk72^cyho{lR@m>r|$SN1~oiE7lC{%jXCY7`T0KAAPB}^eXEeXy2Qsf zpP*L`d$zB@SwutqOs=c->};6F%lI0Y0{${oyUNd!Yr$B8T!Pi_DB0cu1d4WI%ra$T z8^1s!P`h@$tyitNUci&w`TTxZ=Ae9j_nu?T3Q1JMeGbch> zlw=c?Vl+RyXS?jYiVABz9FPYvio0dm5@*!wEZ-{rborm5c1*Q7O?~;&&2~t3LRi zh#|o96)->6xCV53(GzEo;K*5-4%6w7?-f?gYYoW} zw?GgcFyQM46(hY6q|h2`5nN`1d!=r4NfEUt;V2V^a;KRzu7(s)G}Vj`^Vf-mL!#t%$r#RD{$&0M*7v{VoNI^tUQoUkZ3K2gLARaGYqwna3I$mF9CScivv zDsr){c$Ta5h#56h(Wq3Js6|(mo*RT7g=0nfkwwwRZqV7RRO17qT10LtfW{pJcd&P>3oAllVAiNgQnr?YELR*3X zl}86bw7m~%1HlDLx~?e`w}jbbP0w=>W(E@+u1U|BLrj97NREFCTiZwW`b|YY=EE?b z@biDQugI<9sZH=yA=dH{*~9f%M#WuKrJ?OMkC~xc;9y!C$Ha(2PCeJ+sZpY7mF@6P zC`jtdj7&u3xfLQ1WGYANFyS}T3z&(xSh^=dc?9uTne_gagckRm_CXr7b&LxIT#*p4 zgW&a*6E%Q5SC7WPno3gjWLys?Na?w)9^6pZy**tf88WwUX?@;_OoY!qNv>>E`#w7D z*ks`3hqb6EFN)jD#6iMBN~ZWi%x2DRr=ci5+kN(VVJ5kU)MXyV;l0jQJa31GsKLmM zOuMuqqFGRFbXPQn!W9nj`@(;**IPq)nQ+{*3pX#Bj`VZ4owew_4*Cf;IXLUwcN&9_ z&X?H}+UaKG^=;2EdoGsCNGS!Yktf=9%yJV;*vbryWKe*5((!y8AJv+%F;>pHzbwRC z&$}JX+Td)vStT5srKR)h6v9z{kEh`ku1-<@yBusj$e8*5^k zQwRBw<`P%QUz&FR7#-2voBD0l&#y}BY~^XBCg|P8DuZY(AYp7JfGY_YYrHopd)k5_ z=$c32)Gco+0FwApjJwtI^u{=wYdPPgGBEeoqH_v-O7NwFnVJ}ODQ}GD(njkntj-S} zaU{aF1rD3Q*wDT?t;S2;@{#gOnR#JBXa{^YE+;yG;ENlpfd&ne$8P>+SWpoSr~GU$ z!J0jPy6X^BwpU|!@V_@!`oqw!1xAi;!_k>Ec-_I3NocAhW|kh?bD20q^yW#ns1 zPJ;5kHUa*CplGYyFa9}&%oSqZY@?nz!tfJPsEJ!19wTGGX0r$D*740OKg zn0P1v@^KQ|Y&p+42Ll?&8f^;NK?aw7wZqPO%4~wl98d-C0WMlH%N~8z1r5{)lOVl2XsiM-~8KzsOPj+QCZG!R*o<^j< zI9BwShUu}F_F)CvvuTsi_J@r^35we0di$HLmWE~bkk7F*Q`mj=$scz)xwbqe(;_gN zi8-DUuC!^ol6$?T!x@7VT{9Ev_M8WhB_(0RPgYCmz7H00WxtyM_M8T6#}b5LZ$*g% z`Xh%Yj6s858oL#oGORqw7cx3HeNaE@2|vNW3Eap{T2gPmy1ebeQ>B`{Y<)F#dqw|U zLvbNlPJjZ50#3zPA81k(%F)=m2q;wG^b#Q#0sCpY4p5$iNvKF%t7r_=~ zbW#7qsv9DpuY23xLKGXb=L|nrJ2JV%v3ip!kyu`9I;VSE7VE-?zEI@fo~CWJ5e&fR zR84cg1#+v1Ikr0!g4vv`zeQT9@nwb#VwVOfZyYn}c({m&yoj%JtOtZ1g~DzzvGd

>AClpAt!BK(TZ&Vp~iqMZBb2m6uQh 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 diff --git a/backend/upcean.c b/backend/upcean.c index 3cf211da..d0d5366a 100644 --- a/backend/upcean.c +++ b/backend/upcean.c @@ -84,7 +84,7 @@ static const char EANsetB[10][4] = { {'1','3','2','1'}, {'4','1','1','1'}, {'2','1','3','1'}, {'3','1','2','1'}, {'2','1','1','3'} }; -/* UPC A is usually used for 12 digit numbers, but this function takes a source of any length */ +/* Write UPC-A or EAN-8 encodation to destination `d` */ static void upca_set_dest(const unsigned char source[], const int length, char *d) { int i, half_way; @@ -156,12 +156,12 @@ static int upca(struct zint_symbol *symbol, const unsigned char source[], int le } /* UPC-E, allowing for composite if `cc_rows` set */ -static int upce_cc(struct zint_symbol *symbol, unsigned char source[], int length, char *d, int cc_rows) { +static int upce_cc(struct zint_symbol *symbol, unsigned char source[], int length, char *d, int cc_rows, + unsigned char equivalent[12]) { int i, num_system; char emode, check_digit; const char *parity; char src_check_digit = '\0'; - unsigned char equivalent[12]; const unsigned char *hrt = symbol->text; int error_number = 0; @@ -266,6 +266,7 @@ static int upce_cc(struct zint_symbol *symbol, unsigned char source[], int lengt return ZEXT errtxtf(ZINT_ERROR_INVALID_CHECK, symbol, 274, "Invalid check digit '%1$c', expecting '%2$c'", src_check_digit, check_digit); } + equivalent[11] = check_digit; /* Use the number system and check digit information to choose a parity scheme */ if (num_system == 1) { @@ -322,8 +323,9 @@ static int upce_cc(struct zint_symbol *symbol, unsigned char source[], int lengt } /* UPC-E is a zero-compressed version of UPC-A */ -static int upce(struct zint_symbol *symbol, unsigned char source[], int length, char dest[]) { - return upce_cc(symbol, source, length, dest, 0 /*cc_rows*/); +static int upce(struct zint_symbol *symbol, unsigned char source[], int length, char dest[], + unsigned char equivalent[12]) { + return upce_cc(symbol, source, length, dest, 0 /*cc_rows*/, equivalent); } /* EAN-2 and EAN-5 add-on codes */ @@ -753,6 +755,7 @@ INTERNAL int ean_leading_zeroes(struct zint_symbol *symbol, const unsigned char INTERNAL int eanx_cc(struct zint_symbol *symbol, unsigned char source[], int length, int cc_rows) { unsigned char first_part[14], second_part[6]; unsigned char local_source[20]; /* Allow 13 + "+" + 5 + 1 */ + unsigned char equivalent[12] = {0}; /* For UPC-E - GTIN-12 equivalent */ char dest[1000] = {0}; int with_addon; int error_number = 0, i, plus_count; @@ -899,7 +902,7 @@ INTERNAL int eanx_cc(struct zint_symbol *symbol, unsigned char source[], int len case BARCODE_UPCE: case BARCODE_UPCE_CHK: if ((first_part_len >= 6) && (first_part_len <= 8)) { - error_number = upce(symbol, first_part, first_part_len, dest); + error_number = upce(symbol, first_part, first_part_len, dest, equivalent); } else { return errtxtf(ZINT_ERROR_TOO_LONG, symbol, 290, "Input length %d wrong (6, 7 or 8 characters required)", first_part_len); @@ -917,7 +920,7 @@ INTERNAL int eanx_cc(struct zint_symbol *symbol, unsigned char source[], int len symbol->row_height[symbol->rows + 1] = 2; symbol->row_height[symbol->rows + 2] = 2; symbol->rows += 3; - error_number = upce_cc(symbol, first_part, first_part_len, dest, cc_rows); + error_number = upce_cc(symbol, first_part, first_part_len, dest, cc_rows, equivalent); } else { return errtxtf(ZINT_ERROR_TOO_LONG, symbol, 291, "Input length %d wrong (6, 7 or 8 characters required)", first_part_len); @@ -944,10 +947,40 @@ INTERNAL int eanx_cc(struct zint_symbol *symbol, unsigned char source[], int len ean_add_on(second_part, second_part_len, dest, addon_gap); hrt_cat_chr_nochk(symbol, '+'); hrt_cat_nochk(symbol, second_part, second_part_len); + if (first_part_len <= 8 && (symbol->symbology == BARCODE_EANX || symbol->symbology == BARCODE_EANX_CHK + || symbol->symbology == BARCODE_EANX_CC)) { + error_number = errtxt(ZINT_WARN_NONCOMPLIANT, symbol, 292, "EAN-8 with add-on is non-standard"); + } } - if (raw_text && rt_cpy(symbol, symbol->text, symbol->text_length)) { /* Just use the HRT */ - return ZINT_ERROR_MEMORY; /* `rt_cpy()` only fails with OOM */ + if (raw_text) { + const int is_ean = symbol->symbology == BARCODE_EANX || symbol->symbology == BARCODE_EANX_CHK + || symbol->symbology == BARCODE_EANX_CC || symbol->symbology == BARCODE_ISBNX; + /* EAN-8 with no add-on, EAN-2, EAN-5 */ + if (is_ean && symbol->text_length <= 8 && !second_part_len) { + if (rt_cpy(symbol, symbol->text, symbol->text_length)) { /* Just use the HRT */ + return ZINT_ERROR_MEMORY; /* `rt_cpy()` only fails with OOM */ + } + } else { /* Expand to GTIN-13 (UPC-A, UPC-E, EAN-8 with add-on) */ + unsigned char gtin13[13]; + /* EAN-13, ISBNX */ + if (is_ean && symbol->text_length >= 13) { + memcpy(gtin13, symbol->text, 13); + /* UPC-E */ + } else if (*equivalent) { + gtin13[0] = '0'; + memcpy(gtin13 + 1, equivalent, 12); + /* UPC-A, EAN-8 */ + } else { + const int zeroes = 13 - (symbol->text_length - (second_part_len ? second_part_len + 1 : 0)); + assert(zeroes > 0); + memset(gtin13, '0', zeroes); + memcpy(gtin13 + zeroes, symbol->text, 13 - zeroes); + } + if (rt_cpy_cat(symbol, gtin13, 13, '\xFF' /*none*/, second_part, second_part_len)) { + return ZINT_ERROR_MEMORY; /* `rt_cpy_cat()` only fails with OOM */ + } + } } expand(symbol, dest, (int) strlen(dest)); diff --git a/docs/manual.html b/docs/manual.html index 524d33fc..9477870d 100644 --- a/docs/manual.html +++ b/docs/manual.html @@ -4343,10 +4343,12 @@ character set the data is in (UTF-8 data will be converted) in href="#fn16" class="footnote-ref" id="fnref16" role="doc-noteref">16 and for GS1 data any FNC1 separators will be represented as GS -characters. For EAN/UPC data, add-ons will be separated from the main -data with a plus (+) sign. GS1 Composite data if any will -be separated from the primary data (including any EAN/UPC add-ons) by a -pipe (|) character.

+(ASCII 29) characters. UPC-A and UPC-E data will be expanded to EAN-13, +as will EAN-8 but only if it has an add-on (otherwise it will remain at +8 digits), and any add-ons will follow the 13 digits directly (no +separator). GS1 Composite data if any will be separated from the primary +data (including any EAN/UPC add-ons) by a pipe (|) +character.

5.17 UTF-8 to ECI convenience functions

As a convenience the conversion done by Zint from UTF-8 to ECIs is diff --git a/docs/manual.pmd b/docs/manual.pmd index fb19b78c..a6386b97 100644 --- a/docs/manual.pmd +++ b/docs/manual.pmd @@ -2691,10 +2691,11 @@ The `source`, `length` and `eci` members of `zint_seg` will be set accordingly - the data in `source`, the data length in `length`, and the character set the data is in (UTF-8 data will be converted) in `eci`. Any check characters encoded will be included,[^16] and for GS1 data any `FNC1` separators will be -represented as `GS` characters. For EAN/UPC data, add-ons will be separated from -the main data with a plus (`+`) sign. GS1 Composite data if any will be -separated from the primary data (including any EAN/UPC add-ons) by a pipe (`|`) -character. +represented as `GS` (ASCII 29) characters. UPC-A and UPC-E data will be expanded +to EAN-13, as will EAN-8 but only if it has an add-on (otherwise it will remain +at 8 digits), and any add-ons will follow the 13 digits directly (no separator). +GS1 Composite data if any will be separated from the primary data (including any +EAN/UPC add-ons) by a pipe (`|`) character. [^15]: DotCode, Han Xin, Micro QR Code, QR Code and UPNQR have variable masks. Rectangular Micro QR Code has a fixed mask (4). diff --git a/docs/manual.txt b/docs/manual.txt index 3a385f1e..0b03a536 100644 --- a/docs/manual.txt +++ b/docs/manual.txt @@ -2632,9 +2632,11 @@ The source, length and eci members of zint_seg will be set accordingly - the data in source, the data length in length, and the character set the data is in (UTF-8 data will be converted) in eci. Any check characters encoded will be included,[16] and for GS1 data any FNC1 separators will be represented as GS -characters. For EAN/UPC data, add-ons will be separated from the main data with -a plus (+) sign. GS1 Composite data if any will be separated from the primary -data (including any EAN/UPC add-ons) by a pipe (|) character. +(ASCII 29) characters. UPC-A and UPC-E data will be expanded to EAN-13, as will +EAN-8 but only if it has an add-on (otherwise it will remain at 8 digits), and +any add-ons will follow the 13 digits directly (no separator). GS1 Composite +data if any will be separated from the primary data (including any EAN/UPC +add-ons) by a pipe (|) character. 5.17 UTF-8 to ECI convenience functions