diff --git a/.gcc-libraries.metadata b/.gcc-libraries.metadata new file mode 100644 index 0000000..c7c8c81 --- /dev/null +++ b/.gcc-libraries.metadata @@ -0,0 +1,3 @@ +705a283296ce907b302946d12cae9a47d92c83ea SOURCES/gcc-7.3.1-20180303.tar.bz2 +675bb2d069f46e54d5d845f0de36544819c6a02f SOURCES/gcc-8.3.1-20190223.tar.xz +5ef03ca7aee134fe7dfecb6c9d048799f0810278 SOURCES/mpc-0.8.1.tar.gz diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..276b791 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +SOURCES/gcc-7.3.1-20180303.tar.bz2 +SOURCES/gcc-8.3.1-20190223.tar.xz +SOURCES/mpc-0.8.1.tar.gz diff --git a/SOURCES/0022-Default-values-for-certain-field-descriptors-in-form.patch b/SOURCES/0022-Default-values-for-certain-field-descriptors-in-form.patch new file mode 100644 index 0000000..b070abe --- /dev/null +++ b/SOURCES/0022-Default-values-for-certain-field-descriptors-in-form.patch @@ -0,0 +1,516 @@ +diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c +index d93dcfa..f47565c 100644 +--- a/gcc/fortran/io.c ++++ b/gcc/fortran/io.c +@@ -909,6 +909,13 @@ data_desc: + + if (u != FMT_POSINT) + { ++ if (flag_dec) ++ { ++ /* Assume a default width based on the variable size. */ ++ saved_token = u; ++ break; ++ } ++ + format_locus.nextc += format_string_pos; + gfc_error ("Positive width required in format " + "specifier %s at %L", token_to_string (t), +@@ -1030,6 +1037,13 @@ data_desc: + goto fail; + if (t != FMT_ZERO && t != FMT_POSINT) + { ++ if (flag_dec) ++ { ++ /* Assume the default width is expected here and continue lexing. */ ++ value = 0; /* It doesn't matter what we set the value to here. */ ++ saved_token = t; ++ break; ++ } + error = nonneg_required; + goto syntax; + } +@@ -1099,8 +1113,17 @@ data_desc: + goto fail; + if (t != FMT_ZERO && t != FMT_POSINT) + { +- error = nonneg_required; +- goto syntax; ++ if (flag_dec) ++ { ++ /* Assume the default width is expected here and continue lexing. */ ++ value = 0; /* It doesn't matter what we set the value to here. */ ++ saved_token = t; ++ } ++ else ++ { ++ error = nonneg_required; ++ goto syntax; ++ } + } + else if (is_input && t == FMT_ZERO) + { +diff --git a/gcc/testsuite/gfortran.dg/fmt_f_default_field_width.f90 b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width.f90 +new file mode 100644 +index 0000000..b087b8f +--- /dev/null ++++ b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width.f90 +@@ -0,0 +1,43 @@ ++! { dg-do run } ++! { dg-options -fdec } ++! ++! Test case for the default field widths enabled by the -fdec-format-defaults flag. ++! ++! This feature is not part of any Fortran standard, but it is supported by the ++! Oracle Fortran compiler and others. ++! ++! libgfortran uses printf() internally to implement FORMAT. If you print float ++! values to a higher precision than the type can actually store, the results ++! are implementation dependent: some platforms print zeros, others print random ++! numbers. Don't depend on this behaviour in tests because they will not be ++! portable. ++ ++ character(50) :: buffer ++ ++ real*4 :: real_4 ++ real*8 :: real_8 ++ real*16 :: real_16 ++ integer :: len ++ ++ real_4 = 4.18 ++ write(buffer, '(A, F, A)') ':',real_4,':' ++ print *,buffer ++ if (buffer.ne.": 4.1799998:") call abort ++ ++ real_4 = 0.00000018 ++ write(buffer, '(A, F, A)') ':',real_4,':' ++ print *,buffer ++ if (buffer.ne.": 0.0000002:") call abort ++ ++ real_8 = 4.18 ++ write(buffer, '(A, F, A)') ':',real_8,':' ++ print *,buffer ++ len = len_trim(buffer) ++ if (len /= 27) call abort ++ ++ real_16 = 4.18 ++ write(buffer, '(A, F, A)') ':',real_16,':' ++ print *,buffer ++ len = len_trim(buffer) ++ if (len /= 44) call abort ++end +diff --git a/gcc/testsuite/gfortran.dg/fmt_g_default_field_width.f90 b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width.f90 +new file mode 100644 +index 0000000..3d3a476 +--- /dev/null ++++ b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width.f90 +@@ -0,0 +1,48 @@ ++! { dg-do run } ++! { dg-options -fdec } ++! ++! Test case for the default field widths enabled by the -fdec-format-defaults flag. ++! ++! This feature is not part of any Fortran standard, but it is supported by the ++! Oracle Fortran compiler and others. ++! ++! libgfortran uses printf() internally to implement FORMAT. If you print float ++! values to a higher precision than the type can actually store, the results ++! are implementation dependent: some platforms print zeros, others print random ++! numbers. Don't depend on this behaviour in tests because they will not be ++! portable. ++ ++ character(50) :: buffer ++ ++ real*4 :: real_4 ++ real*8 :: real_8 ++ real*16 :: real_16 ++ integer :: len ++ ++ real_4 = 4.18 ++ write(buffer, '(A, G, A)') ':',real_4,':' ++ print *,buffer ++ if (buffer.ne.": 4.180000 :") call abort ++ ++ real_4 = 0.00000018 ++ write(buffer, '(A, G, A)') ':',real_4,':' ++ print *,buffer ++ if (buffer.ne.": 0.1800000E-06:") call abort ++ ++ real_4 = 18000000.4 ++ write(buffer, '(A, G, A)') ':',real_4,':' ++ print *,buffer ++ if (buffer.ne.": 0.1800000E+08:") call abort ++ ++ real_8 = 4.18 ++ write(buffer, '(A, G, A)') ':',real_8,':' ++ print *,buffer ++ len = len_trim(buffer) ++ if (len /= 27) call abort ++ ++ real_16 = 4.18 ++ write(buffer, '(A, G, A)') ':',real_16,':' ++ print *,buffer ++ len = len_trim(buffer) ++ if (len /= 44) call abort ++end +diff --git a/gcc/testsuite/gfortran.dg/fmt_i_default_field_width.f90 b/gcc/testsuite/gfortran.dg/fmt_i_default_field_width.f90 +new file mode 100644 +index 0000000..ac4e165 +--- /dev/null ++++ b/gcc/testsuite/gfortran.dg/fmt_i_default_field_width.f90 +@@ -0,0 +1,38 @@ ++! { dg-do run } ++! { dg-options -fdec } ++! ++! Test case for the default field widths enabled by the -fdec-format-defaults flag. ++! ++! This feature is not part of any Fortran standard, but it is supported by the ++! Oracle Fortran compiler and others. ++ ++ character(50) :: buffer ++ character(1) :: colon ++ ++ integer*2 :: integer_2 ++ integer*4 :: integer_4 ++ integer*8 :: integer_8 ++ ++ write(buffer, '(A, I, A)') ':',12340,':' ++ print *,buffer ++ if (buffer.ne.": 12340:") call abort ++ ++ read(buffer, '(A1, I, A1)') colon, integer_4, colon ++ if (integer_4.ne.12340) call abort ++ ++ integer_2 = -99 ++ write(buffer, '(A, I, A)') ':',integer_2,':' ++ print *,buffer ++ if (buffer.ne.": -99:") call abort ++ ++ integer_8 = -11112222 ++ write(buffer, '(A, I, A)') ':',integer_8,':' ++ print *,buffer ++ if (buffer.ne.": -11112222:") call abort ++ ++! If the width is 7 and there are 7 leading zeroes, the result should be zero. ++ integer_2 = 789 ++ buffer = '0000000789' ++ read(buffer, '(I)') integer_2 ++ if (integer_2.ne.0) call abort ++end +diff --git a/libgfortran/io/format.c b/libgfortran/io/format.c +index c2abdd7..692b1ff 100644 +--- a/libgfortran/io/format.c ++++ b/libgfortran/io/format.c +@@ -956,12 +956,33 @@ parse_format_list (st_parameter_dt *dtp, bool *seen_dd) + *seen_dd = true; + if (u != FMT_POSINT && u != FMT_ZERO) + { ++ if (dtp->common.flags & IOPARM_DT_DEC_EXT) ++ { ++ tail->u.real.w = DEFAULT_WIDTH; ++ tail->u.real.d = 0; ++ tail->u.real.e = -1; ++ fmt->saved_token = u; ++ break; ++ } + fmt->error = nonneg_required; + goto finished; + } + } ++ else if (u == FMT_ZERO) ++ { ++ fmt->error = posint_required; ++ goto finished; ++ } + else if (u != FMT_POSINT) + { ++ if (dtp->common.flags & IOPARM_DT_DEC_EXT) ++ { ++ tail->u.real.w = DEFAULT_WIDTH; ++ tail->u.real.d = 0; ++ tail->u.real.e = -1; ++ fmt->saved_token = u; ++ break; ++ } + fmt->error = posint_required; + goto finished; + } +@@ -1099,6 +1120,13 @@ parse_format_list (st_parameter_dt *dtp, bool *seen_dd) + { + if (t != FMT_POSINT) + { ++ if (dtp->common.flags & IOPARM_DT_DEC_EXT) ++ { ++ tail->u.integer.w = DEFAULT_WIDTH; ++ tail->u.integer.m = -1; ++ fmt->saved_token = t; ++ break; ++ } + fmt->error = posint_required; + goto finished; + } +@@ -1107,6 +1135,13 @@ parse_format_list (st_parameter_dt *dtp, bool *seen_dd) + { + if (t != FMT_ZERO && t != FMT_POSINT) + { ++ if (dtp->common.flags & IOPARM_DT_DEC_EXT) ++ { ++ tail->u.integer.w = DEFAULT_WIDTH; ++ tail->u.integer.m = -1; ++ fmt->saved_token = t; ++ break; ++ } + fmt->error = nonneg_required; + goto finished; + } +diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h +index 5583183..d1d08e8 100644 +--- a/libgfortran/io/io.h ++++ b/libgfortran/io/io.h +@@ -981,5 +981,55 @@ memset4 (gfc_char4_t *p, gfc_char4_t c, int k) + *p++ = c; + } + ++/* Used in width fields to indicate that the default should be used */ ++#define DEFAULT_WIDTH -1 ++ ++/* Defaults for certain format field descriptors. These are decided based on ++ * the type of the value being formatted. ++ * ++ * The behaviour here is modelled on the Oracle Fortran compiler. At the time ++ * of writing, the details were available at this URL: ++ * ++ * https://docs.oracle.com/cd/E19957-01/805-4939/6j4m0vnc3/index.html#z4000743746d ++ */ ++ ++static inline int ++default_width_for_integer (int kind) ++{ ++ switch (kind) ++ { ++ case 1: ++ case 2: return 7; ++ case 4: return 12; ++ case 8: return 23; ++ case 16: return 44; ++ default: return 0; ++ } ++} ++ ++static inline int ++default_width_for_float (int kind) ++{ ++ switch (kind) ++ { ++ case 4: return 15; ++ case 8: return 25; ++ case 16: return 42; ++ default: return 0; ++ } ++} ++ ++static inline int ++default_precision_for_float (int kind) ++{ ++ switch (kind) ++ { ++ case 4: return 7; ++ case 8: return 16; ++ case 16: return 33; ++ default: return 0; ++ } ++} ++ + #endif + +diff --git a/libgfortran/io/read.c b/libgfortran/io/read.c +index 2c9de48..e911e35 100644 +--- a/libgfortran/io/read.c ++++ b/libgfortran/io/read.c +@@ -629,6 +629,12 @@ read_decimal (st_parameter_dt *dtp, const fnode *f, char *dest, int length) + + w = f->u.w; + ++ /* This is a legacy extension, and the frontend will only allow such cases ++ * through when -fdec-format-defaults is passed. ++ */ ++ if (w == DEFAULT_WIDTH) ++ w = default_width_for_integer (length); ++ + p = read_block_form (dtp, &w); + + if (p == NULL) +diff --git a/libgfortran/io/write.c b/libgfortran/io/write.c +index a7307a8..c8e52fb 100644 +--- a/libgfortran/io/write.c ++++ b/libgfortran/io/write.c +@@ -684,9 +684,8 @@ write_l (st_parameter_dt *dtp, const fnode *f, char *source, int len) + p[wlen - 1] = (n) ? 'T' : 'F'; + } + +- + static void +-write_boz (st_parameter_dt *dtp, const fnode *f, const char *q, int n) ++write_boz (st_parameter_dt *dtp, const fnode *f, const char *q, int n, int len) + { + int w, m, digits, nzero, nblank; + char *p; +@@ -719,6 +718,9 @@ write_boz (st_parameter_dt *dtp, const fnode *f, const char *q, int n) + /* Select a width if none was specified. The idea here is to always + print something. */ + ++ if (w == DEFAULT_WIDTH) ++ w = default_width_for_integer (len); ++ + if (w == 0) + w = ((digits < m) ? m : digits); + +@@ -845,6 +847,8 @@ write_decimal (st_parameter_dt *dtp, const fnode *f, const char *source, + + /* Select a width if none was specified. The idea here is to always + print something. */ ++ if (w == DEFAULT_WIDTH) ++ w = default_width_for_integer (len); + + if (w == 0) + w = ((digits < m) ? m : digits) + nsign; +@@ -1187,13 +1191,13 @@ write_b (st_parameter_dt *dtp, const fnode *f, const char *source, int len) + if (len > (int) sizeof (GFC_UINTEGER_LARGEST)) + { + p = btoa_big (source, itoa_buf, len, &n); +- write_boz (dtp, f, p, n); ++ write_boz (dtp, f, p, n, len); + } + else + { + n = extract_uint (source, len); + p = btoa (n, itoa_buf, sizeof (itoa_buf)); +- write_boz (dtp, f, p, n); ++ write_boz (dtp, f, p, n, len); + } + } + +@@ -1208,13 +1212,13 @@ write_o (st_parameter_dt *dtp, const fnode *f, const char *source, int len) + if (len > (int) sizeof (GFC_UINTEGER_LARGEST)) + { + p = otoa_big (source, itoa_buf, len, &n); +- write_boz (dtp, f, p, n); ++ write_boz (dtp, f, p, n, len); + } + else + { + n = extract_uint (source, len); + p = otoa (n, itoa_buf, sizeof (itoa_buf)); +- write_boz (dtp, f, p, n); ++ write_boz (dtp, f, p, n, len); + } + } + +@@ -1228,13 +1232,13 @@ write_z (st_parameter_dt *dtp, const fnode *f, const char *source, int len) + if (len > (int) sizeof (GFC_UINTEGER_LARGEST)) + { + p = ztoa_big (source, itoa_buf, len, &n); +- write_boz (dtp, f, p, n); ++ write_boz (dtp, f, p, n, len); + } + else + { + n = extract_uint (source, len); + p = gfc_xtoa (n, itoa_buf, sizeof (itoa_buf)); +- write_boz (dtp, f, p, n); ++ write_boz (dtp, f, p, n, len); + } + } + +@@ -1504,7 +1508,7 @@ size_from_kind (st_parameter_dt *dtp, const fnode *f, int kind) + { + int size; + +- if (f->format == FMT_F && f->u.real.w == 0) ++ if ((f->format == FMT_F && f->u.real.w == 0) || f->u.real.w == DEFAULT_WIDTH) + { + switch (kind) + { +diff --git a/libgfortran/io/write_float.def b/libgfortran/io/write_float.def +index 7f0aa1d..73dc910 100644 +--- a/libgfortran/io/write_float.def ++++ b/libgfortran/io/write_float.def +@@ -113,7 +113,8 @@ determine_precision (st_parameter_dt * d + static void + build_float_string (st_parameter_dt *dtp, const fnode *f, char *buffer, + size_t size, int nprinted, int precision, int sign_bit, +- bool zero_flag, int npad, char *result, size_t *len) ++ bool zero_flag, int npad, int default_width, char *result, ++ size_t *len) + { + char *put; + char *digits; +@@ -132,8 +133,17 @@ build_float_string (st_parameter_dt *dtp + sign_t sign; + + ft = f->format; +- w = f->u.real.w; +- d = f->u.real.d; ++ if (f->u.real.w == DEFAULT_WIDTH) ++ /* This codepath can only be reached with -fdec-format-defaults. */ ++ { ++ w = default_width; ++ d = precision; ++ } ++ else ++ { ++ w = f->u.real.w; ++ d = f->u.real.d; ++ } + p = dtp->u.p.scale_factor; + *len = 0; + +@@ -959,6 +969,11 @@ determine_en_precision (st_parameter_dt + int save_scale_factor;\ + volatile GFC_REAL_ ## x temp;\ + save_scale_factor = dtp->u.p.scale_factor;\ ++ if (w == DEFAULT_WIDTH)\ ++ {\ ++ w = default_width;\ ++ d = precision;\ ++ }\ + switch (dtp->u.p.current_unit->round_status)\ + {\ + case ROUND_ZERO:\ +@@ -1034,7 +1049,8 @@ determine_en_precision (st_parameter_dt + nprinted = FDTOA(y,precision,m);\ + }\ + build_float_string (dtp, &newf, buffer, size, nprinted, precision,\ +- sign_bit, zero_flag, npad, result, res_len);\ ++ sign_bit, zero_flag, npad, default_width,\ ++ result, res_len);\ + dtp->u.p.scale_factor = save_scale_factor;\ + }\ + else\ +@@ -1044,7 +1060,8 @@ determine_en_precision (st_parameter_dt + else\ + nprinted = DTOA(y,precision,m);\ + build_float_string (dtp, f, buffer, size, nprinted, precision,\ +- sign_bit, zero_flag, npad, result, res_len);\ ++ sign_bit, zero_flag, npad, default_width,\ ++ result, res_len);\ + }\ + }\ + +@@ -1058,6 +1075,16 @@ get_float_string (st_parameter_dt *dtp, + { + int sign_bit, nprinted; + bool zero_flag; ++ int default_width = 0; ++ ++ if (f->u.real.w == DEFAULT_WIDTH) ++ /* This codepath can only be reached with -fdec-format-defaults. The default ++ * values are based on those used in the Oracle Fortran compiler. ++ */ ++ { ++ default_width = default_width_for_float (kind); ++ precision = default_precision_for_float (kind); ++ } + + switch (kind) + { diff --git a/SOURCES/gcc7-0000-infrastructure.patch b/SOURCES/gcc7-0000-infrastructure.patch new file mode 100644 index 0000000..2d5fcf3 --- /dev/null +++ b/SOURCES/gcc7-0000-infrastructure.patch @@ -0,0 +1,125 @@ +commit 366dbfaa2132186e5e8b0688df05662967e628c7 +Author: jakub +Date: Wed Mar 28 11:59:06 2018 +0000 + + * gfortran.h (gfc_dt): Rename default_exp field to dec_ext. + * ioparm.def (IOPARM_dt_default_exp): Rename to ... + (IOPARM_dt_dec_ext): ... this. + * trans-io.c (build_dt): Adjust for default_exp renaming to + dec_ext and IOPARM_dt_default_exp renaming to IOPARM_dt_dec_ext. + * io.c (match_io): Likewise. + + * io/io.h (IOPARM_DT_DEFAULT_EXP): Rename to ... + (IOPARM_DT_DEC_EXT): ... this. + * io/list_read.c (parse_real): Adjust for IOPARM_DT_DEFAULT_EXP + renaming to IOPARM_DT_DEC_EXT. + (read_real): Likewise. + * io/read.c (read_f): Likewise. + + + git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@258920 138bc75d-0d04-0410-961f-82ee72b054a4 + +diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h +index 2bfd1e3019d..507570ccbff 100644 +--- a/gcc/fortran/gfortran.h ++++ b/gcc/fortran/gfortran.h +@@ -2437,7 +2437,7 @@ typedef struct + gfc_expr *io_unit, *format_expr, *rec, *advance, *iostat, *size, *iomsg, + *id, *pos, *asynchronous, *blank, *decimal, *delim, *pad, *round, + *sign, *extra_comma, *dt_io_kind, *udtio; +- char default_exp; ++ char dec_ext; + + gfc_symbol *namelist; + /* A format_label of `format_asterisk' indicates the "*" format */ +diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c +index 10b7e827dab..0aa31bb6a4f 100644 +--- a/gcc/fortran/io.c ++++ b/gcc/fortran/io.c +@@ -4291,9 +4291,10 @@ get_io_list: + goto syntax; + } + +- /* See if we want to use defaults for missing exponents in real transfers. */ ++ /* See if we want to use defaults for missing exponents in real transfers ++ and other DEC runtime extensions. */ + if (flag_dec) +- dt->default_exp = 1; ++ dt->dec_ext = 1; + + /* A full IO statement has been matched. Check the constraints. spec_end is + supplied for cases where no locus is supplied. */ +diff --git a/gcc/fortran/ioparm.def b/gcc/fortran/ioparm.def +index b9dc58f26a7..9ab3b58946e 100644 +--- a/gcc/fortran/ioparm.def ++++ b/gcc/fortran/ioparm.def +@@ -118,5 +118,5 @@ IOPARM (dt, round, 1 << 23, char2) + IOPARM (dt, sign, 1 << 24, char1) + #define IOPARM_dt_f2003 (1 << 25) + #define IOPARM_dt_dtio (1 << 26) +-#define IOPARM_dt_default_exp (1 << 27) ++#define IOPARM_dt_dec_ext (1 << 27) + IOPARM (dt, u, 0, pad) +diff --git a/gcc/fortran/trans-io.c b/gcc/fortran/trans-io.c +index 9058712c695..2626c4651e2 100644 +--- a/gcc/fortran/trans-io.c ++++ b/gcc/fortran/trans-io.c +@@ -1958,8 +1958,8 @@ build_dt (tree function, gfc_code * code) + if (dt->udtio) + mask |= IOPARM_dt_dtio; + +- if (dt->default_exp) +- mask |= IOPARM_dt_default_exp; ++ if (dt->dec_ext) ++ mask |= IOPARM_dt_dec_ext; + + if (dt->namelist) + { +diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h +index 3c2a2cae38a..ccbaf47ff90 100644 +--- a/libgfortran/io/io.h ++++ b/libgfortran/io/io.h +@@ -442,7 +442,7 @@ st_parameter_inquire; + #define IOPARM_DT_HAS_SIGN (1 << 24) + #define IOPARM_DT_HAS_F2003 (1 << 25) + #define IOPARM_DT_HAS_UDTIO (1 << 26) +-#define IOPARM_DT_DEFAULT_EXP (1 << 27) ++#define IOPARM_DT_DEC_EXT (1 << 27) + /* Internal use bit. */ + #define IOPARM_DT_IONML_SET (1u << 31) + +diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c +index d052d1fa828..300c3bd23f3 100644 +--- a/libgfortran/io/list_read.c ++++ b/libgfortran/io/list_read.c +@@ -1380,7 +1380,7 @@ parse_real (st_parameter_dt *dtp, void *buffer, int length) + if (!isdigit (c)) + { + /* Extension: allow default exponent of 0 when omitted. */ +- if (dtp->common.flags & IOPARM_DT_DEFAULT_EXP) ++ if (dtp->common.flags & IOPARM_DT_DEC_EXT) + { + push_char (dtp, '0'); + goto done; +@@ -1831,7 +1831,7 @@ read_real (st_parameter_dt *dtp, void *dest, int length) + if (!isdigit (c)) + { + /* Extension: allow default exponent of 0 when omitted. */ +- if (dtp->common.flags & IOPARM_DT_DEFAULT_EXP) ++ if (dtp->common.flags & IOPARM_DT_DEC_EXT) + { + push_char (dtp, '0'); + goto done; +diff --git a/libgfortran/io/read.c b/libgfortran/io/read.c +index 87adfb8a41d..976020af448 100644 +--- a/libgfortran/io/read.c ++++ b/libgfortran/io/read.c +@@ -1093,7 +1093,7 @@ exponent: + if (w == 0) + { + /* Extension: allow default exponent of 0 when omitted. */ +- if (dtp->common.flags & IOPARM_DT_DEFAULT_EXP) ++ if (dtp->common.flags & IOPARM_DT_DEC_EXT) + goto done; + else + goto bad_float; diff --git a/SOURCES/gcc7-0022-Default-values-for-certain-field-descriptors-in-form.patch b/SOURCES/gcc7-0022-Default-values-for-certain-field-descriptors-in-form.patch new file mode 100644 index 0000000..ebad048 --- /dev/null +++ b/SOURCES/gcc7-0022-Default-values-for-certain-field-descriptors-in-form.patch @@ -0,0 +1,516 @@ +diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c +index d93dcfa..f47565c 100644 +--- a/gcc/fortran/io.c ++++ b/gcc/fortran/io.c +@@ -909,6 +909,13 @@ data_desc: + + if (u != FMT_POSINT) + { ++ if (flag_dec) ++ { ++ /* Assume a default width based on the variable size. */ ++ saved_token = u; ++ break; ++ } ++ + format_locus.nextc += format_string_pos; + gfc_error ("Positive width required in format " + "specifier %s at %L", token_to_string (t), +@@ -1030,6 +1037,13 @@ data_desc: + goto fail; + if (t != FMT_ZERO && t != FMT_POSINT) + { ++ if (flag_dec) ++ { ++ /* Assume the default width is expected here and continue lexing. */ ++ value = 0; /* It doesn't matter what we set the value to here. */ ++ saved_token = t; ++ break; ++ } + error = nonneg_required; + goto syntax; + } +@@ -1099,8 +1113,17 @@ data_desc: + goto fail; + if (t != FMT_ZERO && t != FMT_POSINT) + { +- error = nonneg_required; +- goto syntax; ++ if (flag_dec) ++ { ++ /* Assume the default width is expected here and continue lexing. */ ++ value = 0; /* It doesn't matter what we set the value to here. */ ++ saved_token = t; ++ } ++ else ++ { ++ error = nonneg_required; ++ goto syntax; ++ } + } + else if (is_input && t == FMT_ZERO) + { +diff --git a/gcc/testsuite/gfortran.dg/fmt_f_default_field_width.f90 b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width.f90 +new file mode 100644 +index 0000000..b087b8f +--- /dev/null ++++ b/gcc/testsuite/gfortran.dg/fmt_f_default_field_width.f90 +@@ -0,0 +1,43 @@ ++! { dg-do run } ++! { dg-options -fdec } ++! ++! Test case for the default field widths enabled by the -fdec-format-defaults flag. ++! ++! This feature is not part of any Fortran standard, but it is supported by the ++! Oracle Fortran compiler and others. ++! ++! libgfortran uses printf() internally to implement FORMAT. If you print float ++! values to a higher precision than the type can actually store, the results ++! are implementation dependent: some platforms print zeros, others print random ++! numbers. Don't depend on this behaviour in tests because they will not be ++! portable. ++ ++ character(50) :: buffer ++ ++ real*4 :: real_4 ++ real*8 :: real_8 ++ real*16 :: real_16 ++ integer :: len ++ ++ real_4 = 4.18 ++ write(buffer, '(A, F, A)') ':',real_4,':' ++ print *,buffer ++ if (buffer.ne.": 4.1799998:") call abort ++ ++ real_4 = 0.00000018 ++ write(buffer, '(A, F, A)') ':',real_4,':' ++ print *,buffer ++ if (buffer.ne.": 0.0000002:") call abort ++ ++ real_8 = 4.18 ++ write(buffer, '(A, F, A)') ':',real_8,':' ++ print *,buffer ++ len = len_trim(buffer) ++ if (len /= 27) call abort ++ ++ real_16 = 4.18 ++ write(buffer, '(A, F, A)') ':',real_16,':' ++ print *,buffer ++ len = len_trim(buffer) ++ if (len /= 44) call abort ++end +diff --git a/gcc/testsuite/gfortran.dg/fmt_g_default_field_width.f90 b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width.f90 +new file mode 100644 +index 0000000..3d3a476 +--- /dev/null ++++ b/gcc/testsuite/gfortran.dg/fmt_g_default_field_width.f90 +@@ -0,0 +1,48 @@ ++! { dg-do run } ++! { dg-options -fdec } ++! ++! Test case for the default field widths enabled by the -fdec-format-defaults flag. ++! ++! This feature is not part of any Fortran standard, but it is supported by the ++! Oracle Fortran compiler and others. ++! ++! libgfortran uses printf() internally to implement FORMAT. If you print float ++! values to a higher precision than the type can actually store, the results ++! are implementation dependent: some platforms print zeros, others print random ++! numbers. Don't depend on this behaviour in tests because they will not be ++! portable. ++ ++ character(50) :: buffer ++ ++ real*4 :: real_4 ++ real*8 :: real_8 ++ real*16 :: real_16 ++ integer :: len ++ ++ real_4 = 4.18 ++ write(buffer, '(A, G, A)') ':',real_4,':' ++ print *,buffer ++ if (buffer.ne.": 4.180000 :") call abort ++ ++ real_4 = 0.00000018 ++ write(buffer, '(A, G, A)') ':',real_4,':' ++ print *,buffer ++ if (buffer.ne.": 0.1800000E-06:") call abort ++ ++ real_4 = 18000000.4 ++ write(buffer, '(A, G, A)') ':',real_4,':' ++ print *,buffer ++ if (buffer.ne.": 0.1800000E+08:") call abort ++ ++ real_8 = 4.18 ++ write(buffer, '(A, G, A)') ':',real_8,':' ++ print *,buffer ++ len = len_trim(buffer) ++ if (len /= 27) call abort ++ ++ real_16 = 4.18 ++ write(buffer, '(A, G, A)') ':',real_16,':' ++ print *,buffer ++ len = len_trim(buffer) ++ if (len /= 44) call abort ++end +diff --git a/gcc/testsuite/gfortran.dg/fmt_i_default_field_width.f90 b/gcc/testsuite/gfortran.dg/fmt_i_default_field_width.f90 +new file mode 100644 +index 0000000..ac4e165 +--- /dev/null ++++ b/gcc/testsuite/gfortran.dg/fmt_i_default_field_width.f90 +@@ -0,0 +1,38 @@ ++! { dg-do run } ++! { dg-options -fdec } ++! ++! Test case for the default field widths enabled by the -fdec-format-defaults flag. ++! ++! This feature is not part of any Fortran standard, but it is supported by the ++! Oracle Fortran compiler and others. ++ ++ character(50) :: buffer ++ character(1) :: colon ++ ++ integer*2 :: integer_2 ++ integer*4 :: integer_4 ++ integer*8 :: integer_8 ++ ++ write(buffer, '(A, I, A)') ':',12340,':' ++ print *,buffer ++ if (buffer.ne.": 12340:") call abort ++ ++ read(buffer, '(A1, I, A1)') colon, integer_4, colon ++ if (integer_4.ne.12340) call abort ++ ++ integer_2 = -99 ++ write(buffer, '(A, I, A)') ':',integer_2,':' ++ print *,buffer ++ if (buffer.ne.": -99:") call abort ++ ++ integer_8 = -11112222 ++ write(buffer, '(A, I, A)') ':',integer_8,':' ++ print *,buffer ++ if (buffer.ne.": -11112222:") call abort ++ ++! If the width is 7 and there are 7 leading zeroes, the result should be zero. ++ integer_2 = 789 ++ buffer = '0000000789' ++ read(buffer, '(I)') integer_2 ++ if (integer_2.ne.0) call abort ++end +diff --git a/libgfortran/io/format.c b/libgfortran/io/format.c +index c2abdd7..692b1ff 100644 +--- a/libgfortran/io/format.c ++++ b/libgfortran/io/format.c +@@ -956,12 +956,33 @@ parse_format_list (st_parameter_dt *dtp, bool *seen_dd) + *seen_dd = true; + if (u != FMT_POSINT && u != FMT_ZERO) + { ++ if (dtp->common.flags & IOPARM_DT_DEC_EXT) ++ { ++ tail->u.real.w = DEFAULT_WIDTH; ++ tail->u.real.d = 0; ++ tail->u.real.e = -1; ++ fmt->saved_token = u; ++ break; ++ } + fmt->error = nonneg_required; + goto finished; + } + } ++ else if (u == FMT_ZERO) ++ { ++ fmt->error = posint_required; ++ goto finished; ++ } + else if (u != FMT_POSINT) + { ++ if (dtp->common.flags & IOPARM_DT_DEC_EXT) ++ { ++ tail->u.real.w = DEFAULT_WIDTH; ++ tail->u.real.d = 0; ++ tail->u.real.e = -1; ++ fmt->saved_token = u; ++ break; ++ } + fmt->error = posint_required; + goto finished; + } +@@ -1099,6 +1120,13 @@ parse_format_list (st_parameter_dt *dtp, bool *seen_dd) + { + if (t != FMT_POSINT) + { ++ if (dtp->common.flags & IOPARM_DT_DEC_EXT) ++ { ++ tail->u.integer.w = DEFAULT_WIDTH; ++ tail->u.integer.m = -1; ++ fmt->saved_token = t; ++ break; ++ } + fmt->error = posint_required; + goto finished; + } +@@ -1107,6 +1135,13 @@ parse_format_list (st_parameter_dt *dtp, bool *seen_dd) + { + if (t != FMT_ZERO && t != FMT_POSINT) + { ++ if (dtp->common.flags & IOPARM_DT_DEC_EXT) ++ { ++ tail->u.integer.w = DEFAULT_WIDTH; ++ tail->u.integer.m = -1; ++ fmt->saved_token = t; ++ break; ++ } + fmt->error = nonneg_required; + goto finished; + } +diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h +index 5583183..d1d08e8 100644 +--- a/libgfortran/io/io.h ++++ b/libgfortran/io/io.h +@@ -981,5 +981,55 @@ memset4 (gfc_char4_t *p, gfc_char4_t c, int k) + *p++ = c; + } + ++/* Used in width fields to indicate that the default should be used */ ++#define DEFAULT_WIDTH -1 ++ ++/* Defaults for certain format field descriptors. These are decided based on ++ * the type of the value being formatted. ++ * ++ * The behaviour here is modelled on the Oracle Fortran compiler. At the time ++ * of writing, the details were available at this URL: ++ * ++ * https://docs.oracle.com/cd/E19957-01/805-4939/6j4m0vnc3/index.html#z4000743746d ++ */ ++ ++static inline int ++default_width_for_integer (int kind) ++{ ++ switch (kind) ++ { ++ case 1: ++ case 2: return 7; ++ case 4: return 12; ++ case 8: return 23; ++ case 16: return 44; ++ default: return 0; ++ } ++} ++ ++static inline int ++default_width_for_float (int kind) ++{ ++ switch (kind) ++ { ++ case 4: return 15; ++ case 8: return 25; ++ case 16: return 42; ++ default: return 0; ++ } ++} ++ ++static inline int ++default_precision_for_float (int kind) ++{ ++ switch (kind) ++ { ++ case 4: return 7; ++ case 8: return 16; ++ case 16: return 33; ++ default: return 0; ++ } ++} ++ + #endif + +diff --git a/libgfortran/io/read.c b/libgfortran/io/read.c +index 2c9de48..e911e35 100644 +--- a/libgfortran/io/read.c ++++ b/libgfortran/io/read.c +@@ -629,6 +629,12 @@ read_decimal (st_parameter_dt *dtp, const fnode *f, char *dest, int length) + + w = f->u.w; + ++ /* This is a legacy extension, and the frontend will only allow such cases ++ * through when -fdec-format-defaults is passed. ++ */ ++ if (w == DEFAULT_WIDTH) ++ w = default_width_for_integer (length); ++ + p = read_block_form (dtp, &w); + + if (p == NULL) +diff --git a/libgfortran/io/write.c b/libgfortran/io/write.c +index a7307a8..c8e52fb 100644 +--- a/libgfortran/io/write.c ++++ b/libgfortran/io/write.c +@@ -684,9 +684,8 @@ write_l (st_parameter_dt *dtp, const fnode *f, char *source, int len) + p[wlen - 1] = (n) ? 'T' : 'F'; + } + +- + static void +-write_boz (st_parameter_dt *dtp, const fnode *f, const char *q, int n) ++write_boz (st_parameter_dt *dtp, const fnode *f, const char *q, int n, int len) + { + int w, m, digits, nzero, nblank; + char *p; +@@ -719,6 +718,9 @@ write_boz (st_parameter_dt *dtp, const fnode *f, const char *q, int n) + /* Select a width if none was specified. The idea here is to always + print something. */ + ++ if (w == DEFAULT_WIDTH) ++ w = default_width_for_integer (len); ++ + if (w == 0) + w = ((digits < m) ? m : digits); + +@@ -845,6 +847,8 @@ write_decimal (st_parameter_dt *dtp, const fnode *f, const char *source, + + /* Select a width if none was specified. The idea here is to always + print something. */ ++ if (w == DEFAULT_WIDTH) ++ w = default_width_for_integer (len); + + if (w == 0) + w = ((digits < m) ? m : digits) + nsign; +@@ -1187,13 +1191,13 @@ write_b (st_parameter_dt *dtp, const fnode *f, const char *source, int len) + if (len > (int) sizeof (GFC_UINTEGER_LARGEST)) + { + p = btoa_big (source, itoa_buf, len, &n); +- write_boz (dtp, f, p, n); ++ write_boz (dtp, f, p, n, len); + } + else + { + n = extract_uint (source, len); + p = btoa (n, itoa_buf, sizeof (itoa_buf)); +- write_boz (dtp, f, p, n); ++ write_boz (dtp, f, p, n, len); + } + } + +@@ -1208,13 +1212,13 @@ write_o (st_parameter_dt *dtp, const fnode *f, const char *source, int len) + if (len > (int) sizeof (GFC_UINTEGER_LARGEST)) + { + p = otoa_big (source, itoa_buf, len, &n); +- write_boz (dtp, f, p, n); ++ write_boz (dtp, f, p, n, len); + } + else + { + n = extract_uint (source, len); + p = otoa (n, itoa_buf, sizeof (itoa_buf)); +- write_boz (dtp, f, p, n); ++ write_boz (dtp, f, p, n, len); + } + } + +@@ -1228,13 +1232,13 @@ write_z (st_parameter_dt *dtp, const fnode *f, const char *source, int len) + if (len > (int) sizeof (GFC_UINTEGER_LARGEST)) + { + p = ztoa_big (source, itoa_buf, len, &n); +- write_boz (dtp, f, p, n); ++ write_boz (dtp, f, p, n, len); + } + else + { + n = extract_uint (source, len); + p = gfc_xtoa (n, itoa_buf, sizeof (itoa_buf)); +- write_boz (dtp, f, p, n); ++ write_boz (dtp, f, p, n, len); + } + } + +@@ -1504,7 +1508,7 @@ size_from_kind (st_parameter_dt *dtp, const fnode *f, int kind) + { + int size; + +- if (f->format == FMT_F && f->u.real.w == 0) ++ if ((f->format == FMT_F && f->u.real.w == 0) || f->u.real.w == DEFAULT_WIDTH) + { + switch (kind) + { +diff --git a/libgfortran/io/write_float.def b/libgfortran/io/write_float.def +index 7f0aa1d..73dc910 100644 +--- a/libgfortran/io/write_float.def ++++ b/libgfortran/io/write_float.def +@@ -113,7 +113,8 @@ determine_precision (st_parameter_dt * dtp, const fnode * f, int len) + static void + build_float_string (st_parameter_dt *dtp, const fnode *f, char *buffer, + size_t size, int nprinted, int precision, int sign_bit, +- bool zero_flag, int npad, char *result, size_t *len) ++ bool zero_flag, int npad, int default_width, char *result, ++ size_t *len) + { + char *put; + char *digits; +@@ -132,8 +133,17 @@ build_float_string (st_parameter_dt *dtp, const fnode *f, char *buffer, + sign_t sign; + + ft = f->format; +- w = f->u.real.w; +- d = f->u.real.d; ++ if (f->u.real.w == DEFAULT_WIDTH) ++ /* This codepath can only be reached with -fdec-format-defaults. */ ++ { ++ w = default_width; ++ d = precision; ++ } ++ else ++ { ++ w = f->u.real.w; ++ d = f->u.real.d; ++ } + p = dtp->u.p.scale_factor; + + rchar = '5'; +@@ -958,6 +968,11 @@ determine_en_precision (st_parameter_dt *dtp, const fnode *f, + int save_scale_factor;\ + volatile GFC_REAL_ ## x temp;\ + save_scale_factor = dtp->u.p.scale_factor;\ ++ if (w == DEFAULT_WIDTH)\ ++ {\ ++ w = default_width;\ ++ d = precision;\ ++ }\ + switch (dtp->u.p.current_unit->round_status)\ + {\ + case ROUND_ZERO:\ +@@ -1033,7 +1048,8 @@ determine_en_precision (st_parameter_dt *dtp, const fnode *f, + nprinted = FDTOA(y,precision,m);\ + }\ + build_float_string (dtp, &newf, buffer, size, nprinted, precision,\ +- sign_bit, zero_flag, npad, result, res_len);\ ++ sign_bit, zero_flag, npad, default_width,\ ++ result, res_len);\ + dtp->u.p.scale_factor = save_scale_factor;\ + }\ + else\ +@@ -1043,7 +1059,8 @@ determine_en_precision (st_parameter_dt *dtp, const fnode *f, + else\ + nprinted = DTOA(y,precision,m);\ + build_float_string (dtp, f, buffer, size, nprinted, precision,\ +- sign_bit, zero_flag, npad, result, res_len);\ ++ sign_bit, zero_flag, npad, default_width,\ ++ result, res_len);\ + }\ + }\ + +@@ -1057,6 +1074,16 @@ get_float_string (st_parameter_dt *dtp, const fnode *f, const char *source, + { + int sign_bit, nprinted; + bool zero_flag; ++ int default_width = 0; ++ ++ if (f->u.real.w == DEFAULT_WIDTH) ++ /* This codepath can only be reached with -fdec-format-defaults. The default ++ * values are based on those used in the Oracle Fortran compiler. ++ */ ++ { ++ default_width = default_width_for_float (kind); ++ precision = default_precision_for_float (kind); ++ } + + switch (kind) + { diff --git a/SOURCES/gcc7-Wno-format-security.patch b/SOURCES/gcc7-Wno-format-security.patch new file mode 100644 index 0000000..cb21e5d --- /dev/null +++ b/SOURCES/gcc7-Wno-format-security.patch @@ -0,0 +1,27 @@ +2017-02-25 Jakub Jelinek + + * configure.ac: When adding -Wno-format, also add -Wno-format-security. + * configure: Regenerated. + +--- gcc/configure.ac.jj 2017-02-13 12:20:53.000000000 +0100 ++++ gcc/configure.ac 2017-02-25 12:42:32.859175403 +0100 +@@ -481,7 +481,7 @@ AC_ARG_ENABLE(build-format-warnings, + AS_HELP_STRING([--disable-build-format-warnings],[don't use -Wformat while building GCC]), + [],[enable_build_format_warnings=yes]) + AS_IF([test $enable_build_format_warnings = no], +- [wf_opt=-Wno-format],[wf_opt=]) ++ [wf_opt="-Wno-format -Wno-format-security"],[wf_opt=]) + ACX_PROG_CXX_WARNING_OPTS( + m4_quote(m4_do([-W -Wall -Wno-narrowing -Wwrite-strings ], + [-Wcast-qual $wf_opt])), [loose_warn]) +--- gcc/configure.jj 2017-02-13 12:20:52.000000000 +0100 ++++ gcc/configure 2017-02-25 12:42:50.041946391 +0100 +@@ -6647,7 +6647,7 @@ else + fi + + if test $enable_build_format_warnings = no; then : +- wf_opt=-Wno-format ++ wf_opt="-Wno-format -Wno-format-security" + else + wf_opt= + fi diff --git a/SOURCES/gcc7-aarch64-async-unw-tables.patch b/SOURCES/gcc7-aarch64-async-unw-tables.patch new file mode 100644 index 0000000..feec149 --- /dev/null +++ b/SOURCES/gcc7-aarch64-async-unw-tables.patch @@ -0,0 +1,35 @@ +2014-04-07 Richard Henderson + + * common/config/aarch64/aarch64-common.c (TARGET_OPTION_INIT_STRUCT): + Define. + (aarch64_option_init_struct): New function. + +--- gcc/common/config/aarch64/aarch64-common.c ++++ gcc/common/config/aarch64/aarch64-common.c +@@ -39,6 +39,9 @@ + #undef TARGET_OPTION_OPTIMIZATION_TABLE + #define TARGET_OPTION_OPTIMIZATION_TABLE aarch_option_optimization_table + ++#undef TARGET_OPTION_INIT_STRUCT ++#define TARGET_OPTION_INIT_STRUCT aarch64_option_init_struct ++ + /* Set default optimization options. */ + static const struct default_options aarch_option_optimization_table[] = + { +@@ -47,6 +50,16 @@ static const struct default_options aarch_option_optimization_table[] = + { OPT_LEVELS_NONE, 0, NULL, 0 } + }; + ++/* Implement TARGET_OPTION_INIT_STRUCT. */ ++ ++static void ++aarch64_option_init_struct (struct gcc_options *opts) ++{ ++ /* By default, always emit DWARF-2 unwind info. This allows debugging ++ without maintaining a stack frame back-chain. */ ++ opts->x_flag_asynchronous_unwind_tables = 1; ++} ++ + /* Implement TARGET_HANDLE_OPTION. + This function handles the target specific options for CPU/target selection. + diff --git a/SOURCES/gcc7-alt-compat-test.patch b/SOURCES/gcc7-alt-compat-test.patch new file mode 100644 index 0000000..3907d55 --- /dev/null +++ b/SOURCES/gcc7-alt-compat-test.patch @@ -0,0 +1,49 @@ +--- gcc/testsuite/g++.dg/compat/struct-layout-1_generate.c.jj 2011-01-03 06:50:42.000000000 -0500 ++++ gcc/testsuite/g++.dg/compat/struct-layout-1_generate.c 2011-02-18 06:28:53.858200077 -0500 +@@ -1501,6 +1501,8 @@ generate_random_tests (enum FEATURE feat + int i, r; + if (len > 'z' - 'a' + 1) + abort (); ++ if (getenv ("ALT_CXX_UNDER_TEST") != NULL) ++ features &= ~FEATURE_VECTOR; + memset (e, 0, sizeof (e)); + r = generate_random (); + if ((r & 7) == 0) +--- gcc/testsuite/g++.dg/compat/compat.exp.jj 2011-01-03 06:50:42.000000000 -0500 ++++ gcc/testsuite/g++.dg/compat/compat.exp 2011-02-18 06:30:54.248200398 -0500 +@@ -116,7 +116,12 @@ if [info exists ALT_CXX_UNDER_TEST] then + } + + # Main loop. +-foreach src [lsort [find $srcdir/$subdir *_main.C]] { ++set tests [lsort [find $srcdir/$subdir *_main.C]] ++if { $use_alt != 0 } then { ++ set tests [prune $tests $srcdir/$subdir/decimal/*] ++} ++ ++foreach src $tests { + # If we're only testing specific files and this isn't one of them, skip it. + if ![runtest_file_p $runtests $src] then { + continue +--- gcc/testsuite/gcc.dg/compat/struct-layout-1_generate.c.jj 2011-01-03 06:49:58.000000000 -0500 ++++ gcc/testsuite/gcc.dg/compat/struct-layout-1_generate.c 2011-02-18 06:27:54.922262671 -0500 +@@ -1912,6 +1912,8 @@ generate_random_tests (enum FEATURE feat + int i, r; + if (len > 'z' - 'a' + 1) + abort (); ++ if (getenv ("ALT_CC_UNDER_TEST") != NULL) ++ features &= ~FEATURE_VECTOR; + memset (e, 0, sizeof (e)); + r = generate_random (); + if ((r & 7) == 0) +--- gcc/testsuite/lib/c-compat.exp.jj 2011-01-03 06:48:38.000000000 -0500 ++++ gcc/testsuite/lib/c-compat.exp 2011-02-18 06:38:19.124265008 -0500 +@@ -75,7 +75,7 @@ proc compat_setup_dfp { } { + # If there is an alternate compiler, does it support decimal float types? + if { $compat_have_dfp == 1 && $compat_use_alt == 1 && $compat_same_alt == 0 } { + compat-use-alt-compiler +- set compat_have_dfp [check_effective_target_dfprt_nocache] ++ set compat_have_dfp 0 + compat-use-tst-compiler + verbose "compat_have_dfp for alt compiler: $compat_have_dfp" 2 + } diff --git a/SOURCES/gcc7-foffload-default.patch b/SOURCES/gcc7-foffload-default.patch new file mode 100644 index 0000000..771e1e0 --- /dev/null +++ b/SOURCES/gcc7-foffload-default.patch @@ -0,0 +1,117 @@ +2017-01-20 Jakub Jelinek + + * gcc.c (offload_targets_default): New variable. + (process_command): Set it if -foffload is defaulted. + (driver::maybe_putenv_OFFLOAD_TARGETS): Add OFFLOAD_TARGET_DEFAULT=1 + into environment if -foffload has been defaulted. + * lto-wrapper.c (OFFLOAD_TARGET_DEFAULT_ENV): Define. + (compile_images_for_offload_targets): If OFFLOAD_TARGET_DEFAULT + is in the environment, don't fail if corresponding mkoffload + can't be found. Free and clear offload_names if no valid offload + is found. +libgomp/ + * target.c (gomp_load_plugin_for_device): If a plugin can't be + dlopened, assume it has no devices silently. + +--- gcc/gcc.c.jj 2017-01-17 10:28:40.000000000 +0100 ++++ gcc/gcc.c 2017-01-20 16:26:29.649962902 +0100 +@@ -290,6 +290,10 @@ static const char *spec_host_machine = D + + static char *offload_targets = NULL; + ++/* Set to true if -foffload has not been used and offload_targets ++ is set to the configured in default. */ ++static bool offload_targets_default; ++ + /* Nonzero if cross-compiling. + When -b is used, the value comes from the `specs' file. */ + +@@ -4457,7 +4461,10 @@ process_command (unsigned int decoded_op + /* If the user didn't specify any, default to all configured offload + targets. */ + if (ENABLE_OFFLOADING && offload_targets == NULL) +- handle_foffload_option (OFFLOAD_TARGETS); ++ { ++ handle_foffload_option (OFFLOAD_TARGETS); ++ offload_targets_default = true; ++ } + + if (output_file + && strcmp (output_file, "-") != 0 +@@ -7693,6 +7700,8 @@ driver::maybe_putenv_OFFLOAD_TARGETS () + obstack_grow (&collect_obstack, offload_targets, + strlen (offload_targets) + 1); + xputenv (XOBFINISH (&collect_obstack, char *)); ++ if (offload_targets_default) ++ xputenv ("OFFLOAD_TARGET_DEFAULT=1"); + } + + free (offload_targets); +--- gcc/lto-wrapper.c.jj 2017-01-01 12:45:34.000000000 +0100 ++++ gcc/lto-wrapper.c 2017-01-20 16:34:18.294016997 +0100 +@@ -52,6 +52,7 @@ along with GCC; see the file COPYING3. + /* Environment variable, used for passing the names of offload targets from GCC + driver to lto-wrapper. */ + #define OFFLOAD_TARGET_NAMES_ENV "OFFLOAD_TARGET_NAMES" ++#define OFFLOAD_TARGET_DEFAULT_ENV "OFFLOAD_TARGET_DEFAULT" + + enum lto_mode_d { + LTO_MODE_NONE, /* Not doing LTO. */ +@@ -790,8 +791,10 @@ compile_images_for_offload_targets (unsi + if (!target_names) + return; + unsigned num_targets = parse_env_var (target_names, &names, NULL); ++ const char *target_names_default = getenv (OFFLOAD_TARGET_DEFAULT_ENV); + + int next_name_entry = 0; ++ bool hsa_seen = false; + const char *compiler_path = getenv ("COMPILER_PATH"); + if (!compiler_path) + goto out; +@@ -804,18 +807,32 @@ compile_images_for_offload_targets (unsi + /* HSA does not use LTO-like streaming and a different compiler, skip + it. */ + if (strcmp (names[i], "hsa") == 0) +- continue; ++ { ++ hsa_seen = true; ++ continue; ++ } + + offload_names[next_name_entry] + = compile_offload_image (names[i], compiler_path, in_argc, in_argv, + compiler_opts, compiler_opt_count, + linker_opts, linker_opt_count); + if (!offload_names[next_name_entry]) +- fatal_error (input_location, +- "problem with building target image for %s\n", names[i]); ++ { ++ if (target_names_default != NULL) ++ continue; ++ fatal_error (input_location, ++ "problem with building target image for %s\n", ++ names[i]); ++ } + next_name_entry++; + } + ++ if (next_name_entry == 0 && !hsa_seen) ++ { ++ free (offload_names); ++ offload_names = NULL; ++ } ++ + out: + free_array_of_ptrs ((void **) names, num_targets); + } +--- libgomp/target.c.jj 2017-01-01 12:45:52.000000000 +0100 ++++ libgomp/target.c 2017-01-20 20:12:13.756710875 +0100 +@@ -2356,7 +2356,7 @@ gomp_load_plugin_for_device (struct gomp + + void *plugin_handle = dlopen (plugin_name, RTLD_LAZY); + if (!plugin_handle) +- goto dl_fail; ++ return 0; + + /* Check if all required functions are available in the plugin and store + their handlers. None of the symbols can legitimately be NULL, diff --git a/SOURCES/gcc7-hack.patch b/SOURCES/gcc7-hack.patch new file mode 100644 index 0000000..4f3070f --- /dev/null +++ b/SOURCES/gcc7-hack.patch @@ -0,0 +1,135 @@ +--- libada/Makefile.in.jj 2009-01-14 12:07:35.000000000 +0100 ++++ libada/Makefile.in 2009-01-15 14:25:33.000000000 +0100 +@@ -66,18 +66,40 @@ libsubdir := $(libdir)/gcc/$(target_nonc + ADA_RTS_DIR=$(GCC_DIR)/ada/rts$(subst /,_,$(MULTISUBDIR)) + ADA_RTS_SUBDIR=./rts$(subst /,_,$(MULTISUBDIR)) + ++DEFAULTMULTIFLAGS := ++ifeq ($(MULTISUBDIR),) ++targ:=$(subst -, ,$(target)) ++arch:=$(word 1,$(targ)) ++ifeq ($(words $(targ)),2) ++osys:=$(word 2,$(targ)) ++else ++osys:=$(word 3,$(targ)) ++endif ++ifeq ($(strip $(filter-out i%86 x86_64 powerpc% ppc% s390% sparc% linux%, $(arch) $(osys))),) ++ifeq ($(shell $(CC) $(CFLAGS) -print-multi-os-directory),../lib64) ++DEFAULTMULTIFLAGS := -m64 ++else ++ifeq ($(strip $(filter-out s390%, $(arch))),) ++DEFAULTMULTIFLAGS := -m31 ++else ++DEFAULTMULTIFLAGS := -m32 ++endif ++endif ++endif ++endif ++ + # exeext should not be used because it's the *host* exeext. We're building + # a *target* library, aren't we?!? Likewise for CC. Still, provide bogus + # definitions just in case something slips through the safety net provided + # by recursive make invocations in gcc/ada/Makefile.in + LIBADA_FLAGS_TO_PASS = \ + "MAKEOVERRIDES=" \ +- "LDFLAGS=$(LDFLAGS)" \ ++ "LDFLAGS=$(LDFLAGS) $(DEFAULTMULTIFLAGS)" \ + "LN_S=$(LN_S)" \ + "SHELL=$(SHELL)" \ +- "GNATLIBFLAGS=$(GNATLIBFLAGS) $(MULTIFLAGS)" \ +- "GNATLIBCFLAGS=$(GNATLIBCFLAGS) $(MULTIFLAGS)" \ +- "GNATLIBCFLAGS_FOR_C=$(GNATLIBCFLAGS_FOR_C) $(MULTIFLAGS)" \ ++ "GNATLIBFLAGS=$(GNATLIBFLAGS) $(MULTIFLAGS) $(DEFAULTMULTIFLAGS)" \ ++ "GNATLIBCFLAGS=$(GNATLIBCFLAGS) $(MULTIFLAGS) $(DEFAULTMULTIFLAGS)" \ ++ "GNATLIBCFLAGS_FOR_C=$(GNATLIBCFLAGS_FOR_C) $(MULTIFLAGS) $(DEFAULTMULTIFLAGS)" \ + "PICFLAG_FOR_TARGET=$(PICFLAG)" \ + "THREAD_KIND=$(THREAD_KIND)" \ + "TRACE=$(TRACE)" \ +@@ -88,7 +110,7 @@ LIBADA_FLAGS_TO_PASS = \ + "exeext=.exeext.should.not.be.used " \ + 'CC=the.host.compiler.should.not.be.needed' \ + "GCC_FOR_TARGET=$(CC)" \ +- "CFLAGS=$(CFLAGS)" ++ "CFLAGS=$(CFLAGS) $(DEFAULTMULTIFLAGS)" + + # Rules to build gnatlib. + .PHONY: gnatlib gnatlib-plain gnatlib-sjlj gnatlib-zcx gnatlib-shared osconstool +--- gcc/ada/sem_util.adb (revision 161677) ++++ gcc/ada/sem_util.adb (working copy) +@@ -5487,7 +5487,7 @@ package body Sem_Util is + Exp : Node_Id; + Assn : Node_Id; + Choice : Node_Id; +- Comp_Type : Entity_Id; ++ Comp_Type : Entity_Id := Empty; + Is_Array_Aggr : Boolean; + + begin +--- config-ml.in.jj 2010-06-30 09:50:44.000000000 +0200 ++++ config-ml.in 2010-07-02 21:24:17.994211151 +0200 +@@ -511,6 +511,8 @@ multi-do: + ADAFLAGS="$(ADAFLAGS) $${flags}" \ + prefix="$(prefix)" \ + exec_prefix="$(exec_prefix)" \ ++ mandir="$(mandir)" \ ++ infodir="$(infodir)" \ + GOCFLAGS="$(GOCFLAGS) $${flags}" \ + CXXFLAGS="$(CXXFLAGS) $${flags}" \ + LIBCFLAGS="$(LIBCFLAGS) $${flags}" \ +--- libcpp/macro.c.jj 2015-01-14 11:01:34.000000000 +0100 ++++ libcpp/macro.c 2015-01-14 14:22:19.286949884 +0100 +@@ -2947,8 +2947,6 @@ create_iso_definition (cpp_reader *pfile + cpp_token *token; + const cpp_token *ctoken; + bool following_paste_op = false; +- const char *paste_op_error_msg = +- N_("'##' cannot appear at either end of a macro expansion"); + unsigned int num_extra_tokens = 0; + + /* Get the first token of the expansion (or the '(' of a +@@ -3059,7 +3057,8 @@ create_iso_definition (cpp_reader *pfile + function-like macros, but not at the end. */ + if (following_paste_op) + { +- cpp_error (pfile, CPP_DL_ERROR, paste_op_error_msg); ++ cpp_error (pfile, CPP_DL_ERROR, ++ "'##' cannot appear at either end of a macro expansion"); + return false; + } + break; +@@ -3072,7 +3071,8 @@ create_iso_definition (cpp_reader *pfile + function-like macros, but not at the beginning. */ + if (macro->count == 1) + { +- cpp_error (pfile, CPP_DL_ERROR, paste_op_error_msg); ++ cpp_error (pfile, CPP_DL_ERROR, ++ "'##' cannot appear at either end of a macro expansion"); + return false; + } + +--- libcpp/expr.c.jj 2015-01-14 11:01:34.000000000 +0100 ++++ libcpp/expr.c 2015-01-14 14:35:52.851002344 +0100 +@@ -672,16 +672,17 @@ cpp_classify_number (cpp_reader *pfile, + if ((result & CPP_N_WIDTH) == CPP_N_LARGE + && CPP_OPTION (pfile, cpp_warn_long_long)) + { +- const char *message = CPP_OPTION (pfile, cplusplus) +- ? N_("use of C++11 long long integer constant") +- : N_("use of C99 long long integer constant"); +- + if (CPP_OPTION (pfile, c99)) + cpp_warning_with_line (pfile, CPP_W_LONG_LONG, virtual_location, +- 0, message); ++ 0, CPP_OPTION (pfile, cplusplus) ++ ? N_("use of C++11 long long integer constant") ++ : N_("use of C99 long long integer constant")); + else + cpp_pedwarning_with_line (pfile, CPP_W_LONG_LONG, +- virtual_location, 0, message); ++ virtual_location, 0, ++ CPP_OPTION (pfile, cplusplus) ++ ? N_("use of C++11 long long integer constant") ++ : N_("use of C99 long long integer constant")); + } + + result |= CPP_N_INTEGER; diff --git a/SOURCES/gcc7-htm-in-asm.patch b/SOURCES/gcc7-htm-in-asm.patch new file mode 100644 index 0000000..a7f1b7b --- /dev/null +++ b/SOURCES/gcc7-htm-in-asm.patch @@ -0,0 +1,55 @@ +--- libitm/config/x86/target.h.jj 2013-06-23 20:43:50.000000000 +0200 ++++ libitm/config/x86/target.h 2013-08-13 17:14:57.540012109 +0200 +@@ -64,7 +64,7 @@ cpu_relax (void) + + // Use Intel RTM if supported by the assembler. + // See gtm_thread::begin_transaction for how these functions are used. +-#ifdef HAVE_AS_RTM ++#if 1 /* def HAVE_AS_RTM */ + #define USE_HTM_FASTPATH + #ifdef __x86_64__ + // Use the custom fastpath in ITM_beginTransaction. +@@ -97,7 +97,10 @@ htm_init () + static inline uint32_t + htm_begin () + { +- return _xbegin(); ++// return _xbegin(); ++ uint32_t ret; ++ __asm volatile ("movl $-1, %%eax; .byte 0xc7, 0xf8, 0, 0, 0, 0" : "=a" (ret) : : "memory"); ++ return ret; + } + + static inline bool +@@ -109,7 +112,8 @@ htm_begin_success (uint32_t begin_ret) + static inline void + htm_commit () + { +- _xend(); ++// _xend(); ++ __asm volatile (".byte 0x0f, 0x01, 0xd5" : : : "memory"); + } + + static inline void +@@ -117,7 +121,8 @@ htm_abort () + { + // ??? According to a yet unpublished ABI rule, 0xff is reserved and + // supposed to signal a busy lock. Source: andi.kleen@intel.com +- _xabort(0xff); ++// _xabort(0xff); ++ __asm volatile (".byte 0xc6, 0xf8, 0xff" : : : "memory"); + } + + static inline bool +@@ -130,7 +135,10 @@ htm_abort_should_retry (uint32_t begin_r + static inline bool + htm_transaction_active () + { +- return _xtest() != 0; ++// return _xtest() != 0; ++ bool ret; ++ __asm volatile (".byte 0x0f, 0x01, 0xd6; setne %%al" : "=a" (ret) : : "memory"); ++ return ret; + } + #endif + diff --git a/SOURCES/gcc7-i386-libgomp.patch b/SOURCES/gcc7-i386-libgomp.patch new file mode 100644 index 0000000..520561e --- /dev/null +++ b/SOURCES/gcc7-i386-libgomp.patch @@ -0,0 +1,11 @@ +--- libgomp/configure.tgt.jj 2008-01-10 20:53:48.000000000 +0100 ++++ libgomp/configure.tgt 2008-03-27 12:44:51.000000000 +0100 +@@ -67,7 +67,7 @@ if test $enable_linux_futex = yes; then + ;; + *) + if test -z "$with_arch"; then +- XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}" ++ XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic" + fi + esac + ;; diff --git a/SOURCES/gcc7-isl-dl.patch b/SOURCES/gcc7-isl-dl.patch new file mode 100644 index 0000000..a9b73b3 --- /dev/null +++ b/SOURCES/gcc7-isl-dl.patch @@ -0,0 +1,711 @@ +--- gcc/Makefile.in.jj 2015-06-06 10:00:25.000000000 +0200 ++++ gcc/Makefile.in 2015-11-04 14:56:02.643536437 +0100 +@@ -1046,7 +1046,7 @@ BUILD_LIBDEPS= $(BUILD_LIBIBERTY) + # and the system's installed libraries. + LIBS = @LIBS@ libcommon.a $(CPPLIB) $(LIBINTL) $(LIBICONV) $(LIBBACKTRACE) \ + $(LIBIBERTY) $(LIBDECNUMBER) $(HOST_LIBS) +-BACKENDLIBS = $(ISLLIBS) $(GMPLIBS) $(PLUGINLIBS) $(HOST_LIBS) \ ++BACKENDLIBS = $(if $(ISLLIBS),-ldl) $(GMPLIBS) $(PLUGINLIBS) $(HOST_LIBS) \ + $(ZLIB) + # Any system libraries needed just for GNAT. + SYSLIBS = @GNAT_LIBEXC@ +@@ -2196,6 +2196,15 @@ $(out_object_file): $(out_file) + $(common_out_object_file): $(common_out_file) + $(COMPILE) $< + $(POSTCOMPILE) ++ ++graphite%.o : \ ++ ALL_CFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CFLAGS)) ++graphite.o : \ ++ ALL_CFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CFLAGS)) ++graphite%.o : \ ++ ALL_CXXFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CXXFLAGS)) ++graphite.o : \ ++ ALL_CXXFLAGS := -O $(filter-out -fkeep-inline-functions, $(ALL_CXXFLAGS)) + # + # Generate header and source files from the machine description, + # and compile them. +--- gcc/graphite.h.jj 2016-01-27 12:44:06.000000000 +0100 ++++ gcc/graphite.h 2016-01-27 13:26:38.309876856 +0100 +@@ -37,6 +37,586 @@ along with GCC; see the file COPYING3. + #include + #include + #include ++#include ++#include ++ ++#define DYNSYMS \ ++ DYNSYM (isl_aff_add_coefficient_si); \ ++ DYNSYM (isl_aff_free); \ ++ DYNSYM (isl_aff_get_space); \ ++ DYNSYM (isl_aff_set_coefficient_si); \ ++ DYNSYM (isl_aff_set_constant_si); \ ++ DYNSYM (isl_aff_zero_on_domain); \ ++ DYNSYM (isl_band_free); \ ++ DYNSYM (isl_band_get_children); \ ++ DYNSYM (isl_band_get_partial_schedule); \ ++ DYNSYM (isl_band_has_children); \ ++ DYNSYM (isl_band_list_free); \ ++ DYNSYM (isl_band_list_get_band); \ ++ DYNSYM (isl_band_list_get_ctx); \ ++ DYNSYM (isl_band_list_n_band); \ ++ DYNSYM (isl_band_n_member); \ ++ DYNSYM (isl_basic_map_add_constraint); \ ++ DYNSYM (isl_basic_map_project_out); \ ++ DYNSYM (isl_basic_map_universe); \ ++ DYNSYM (isl_constraint_set_coefficient_si); \ ++ DYNSYM (isl_constraint_set_constant_si); \ ++ DYNSYM (isl_ctx_alloc); \ ++ DYNSYM (isl_ctx_free); \ ++ DYNSYM (isl_equality_alloc); \ ++ DYNSYM (isl_id_alloc); \ ++ DYNSYM (isl_id_copy); \ ++ DYNSYM (isl_id_free); \ ++ DYNSYM (isl_inequality_alloc); \ ++ DYNSYM (isl_local_space_copy); \ ++ DYNSYM (isl_local_space_free); \ ++ DYNSYM (isl_local_space_from_space); \ ++ DYNSYM (isl_local_space_range); \ ++ DYNSYM (isl_map_add_constraint); \ ++ DYNSYM (isl_map_add_dims); \ ++ DYNSYM (isl_map_align_params); \ ++ DYNSYM (isl_map_apply_range); \ ++ DYNSYM (isl_map_copy); \ ++ DYNSYM (isl_map_dim); \ ++ DYNSYM (isl_map_dump); \ ++ DYNSYM (isl_map_equate); \ ++ DYNSYM (isl_map_fix_si); \ ++ DYNSYM (isl_map_flat_product); \ ++ DYNSYM (isl_map_flat_range_product); \ ++ DYNSYM (isl_map_free); \ ++ DYNSYM (isl_map_from_basic_map); \ ++ DYNSYM (isl_map_from_pw_aff); \ ++ DYNSYM (isl_map_from_union_map); \ ++ DYNSYM (isl_map_get_ctx); \ ++ DYNSYM (isl_map_get_space); \ ++ DYNSYM (isl_map_get_tuple_id); \ ++ DYNSYM (isl_map_insert_dims); \ ++ DYNSYM (isl_map_intersect); \ ++ DYNSYM (isl_map_intersect_domain); \ ++ DYNSYM (isl_map_intersect_range); \ ++ DYNSYM (isl_map_is_empty); \ ++ DYNSYM (isl_map_lex_ge); \ ++ DYNSYM (isl_map_lex_le); \ ++ DYNSYM (isl_map_n_out); \ ++ DYNSYM (isl_map_range); \ ++ DYNSYM (isl_map_set_tuple_id); \ ++ DYNSYM (isl_map_universe); \ ++ DYNSYM (isl_options_set_on_error); \ ++ DYNSYM (isl_options_set_schedule_serialize_sccs); \ ++ DYNSYM (isl_printer_set_yaml_style); \ ++ DYNSYM (isl_options_set_schedule_max_constant_term); \ ++ DYNSYM (isl_options_set_schedule_maximize_band_depth); \ ++ DYNSYM (isl_printer_free); \ ++ DYNSYM (isl_printer_print_aff); \ ++ DYNSYM (isl_printer_print_constraint); \ ++ DYNSYM (isl_printer_print_map); \ ++ DYNSYM (isl_printer_print_set); \ ++ DYNSYM (isl_printer_to_file); \ ++ DYNSYM (isl_pw_aff_add); \ ++ DYNSYM (isl_pw_aff_alloc); \ ++ DYNSYM (isl_pw_aff_copy); \ ++ DYNSYM (isl_pw_aff_eq_set); \ ++ DYNSYM (isl_pw_aff_free); \ ++ DYNSYM (isl_pw_aff_from_aff); \ ++ DYNSYM (isl_pw_aff_ge_set); \ ++ DYNSYM (isl_pw_aff_gt_set); \ ++ DYNSYM (isl_pw_aff_is_cst); \ ++ DYNSYM (isl_pw_aff_le_set); \ ++ DYNSYM (isl_pw_aff_lt_set); \ ++ DYNSYM (isl_pw_aff_mul); \ ++ DYNSYM (isl_pw_aff_ne_set); \ ++ DYNSYM (isl_pw_aff_nonneg_set); \ ++ DYNSYM (isl_pw_aff_set_tuple_id); \ ++ DYNSYM (isl_pw_aff_sub); \ ++ DYNSYM (isl_pw_aff_zero_set); \ ++ DYNSYM (isl_schedule_free); \ ++ DYNSYM (isl_schedule_get_band_forest); \ ++ DYNSYM (isl_set_add_constraint); \ ++ DYNSYM (isl_set_add_dims); \ ++ DYNSYM (isl_set_apply); \ ++ DYNSYM (isl_set_coalesce); \ ++ DYNSYM (isl_set_copy); \ ++ DYNSYM (isl_set_dim); \ ++ DYNSYM (isl_set_fix_si); \ ++ DYNSYM (isl_set_free); \ ++ DYNSYM (isl_set_get_space); \ ++ DYNSYM (isl_set_get_tuple_id); \ ++ DYNSYM (isl_set_intersect); \ ++ DYNSYM (isl_set_is_empty); \ ++ DYNSYM (isl_set_n_dim); \ ++ DYNSYM (isl_set_nat_universe); \ ++ DYNSYM (isl_set_project_out); \ ++ DYNSYM (isl_set_set_tuple_id); \ ++ DYNSYM (isl_set_universe); \ ++ DYNSYM (isl_space_add_dims); \ ++ DYNSYM (isl_space_alloc); \ ++ DYNSYM (isl_space_copy); \ ++ DYNSYM (isl_space_dim); \ ++ DYNSYM (isl_space_domain); \ ++ DYNSYM (isl_space_find_dim_by_id); \ ++ DYNSYM (isl_space_free); \ ++ DYNSYM (isl_space_from_domain); \ ++ DYNSYM (isl_space_get_tuple_id); \ ++ DYNSYM (isl_space_params_alloc); \ ++ DYNSYM (isl_space_range); \ ++ DYNSYM (isl_space_set_alloc); \ ++ DYNSYM (isl_space_set_dim_id); \ ++ DYNSYM (isl_space_set_tuple_id); \ ++ DYNSYM (isl_union_map_add_map); \ ++ DYNSYM (isl_union_map_align_params); \ ++ DYNSYM (isl_union_map_apply_domain); \ ++ DYNSYM (isl_union_map_apply_range); \ ++ DYNSYM (isl_union_map_compute_flow); \ ++ DYNSYM (isl_union_map_copy); \ ++ DYNSYM (isl_union_map_empty); \ ++ DYNSYM (isl_union_map_flat_range_product); \ ++ DYNSYM (isl_union_map_foreach_map); \ ++ DYNSYM (isl_union_map_free); \ ++ DYNSYM (isl_union_map_from_map); \ ++ DYNSYM (isl_union_map_get_ctx); \ ++ DYNSYM (isl_union_map_get_space); \ ++ DYNSYM (isl_union_map_gist_domain); \ ++ DYNSYM (isl_union_map_gist_range); \ ++ DYNSYM (isl_union_map_intersect_domain); \ ++ DYNSYM (isl_union_map_is_empty); \ ++ DYNSYM (isl_union_map_subtract); \ ++ DYNSYM (isl_union_map_union); \ ++ DYNSYM (isl_union_set_add_set); \ ++ DYNSYM (isl_union_set_compute_schedule); \ ++ DYNSYM (isl_union_set_copy); \ ++ DYNSYM (isl_union_set_empty); \ ++ DYNSYM (isl_union_set_from_set); \ ++ DYNSYM (isl_aff_add_constant_val); \ ++ DYNSYM (isl_aff_get_coefficient_val); \ ++ DYNSYM (isl_aff_get_ctx); \ ++ DYNSYM (isl_aff_mod_val); \ ++ DYNSYM (isl_ast_build_ast_from_schedule); \ ++ DYNSYM (isl_ast_build_free); \ ++ DYNSYM (isl_ast_build_from_context); \ ++ DYNSYM (isl_ast_build_get_ctx); \ ++ DYNSYM (isl_ast_build_get_schedule); \ ++ DYNSYM (isl_ast_build_get_schedule_space); \ ++ DYNSYM (isl_ast_build_set_before_each_for); \ ++ DYNSYM (isl_ast_build_set_options); \ ++ DYNSYM (isl_ast_expr_free); \ ++ DYNSYM (isl_ast_expr_from_val); \ ++ DYNSYM (isl_ast_expr_get_ctx); \ ++ DYNSYM (isl_ast_expr_get_id); \ ++ DYNSYM (isl_ast_expr_get_op_arg); \ ++ DYNSYM (isl_ast_expr_get_op_n_arg); \ ++ DYNSYM (isl_ast_expr_get_op_type); \ ++ DYNSYM (isl_ast_expr_get_type); \ ++ DYNSYM (isl_ast_expr_get_val); \ ++ DYNSYM (isl_ast_expr_sub); \ ++ DYNSYM (isl_ast_node_block_get_children); \ ++ DYNSYM (isl_ast_node_for_get_body); \ ++ DYNSYM (isl_ast_node_for_get_cond); \ ++ DYNSYM (isl_ast_node_for_get_inc); \ ++ DYNSYM (isl_ast_node_for_get_init); \ ++ DYNSYM (isl_ast_node_for_get_iterator); \ ++ DYNSYM (isl_ast_node_free); \ ++ DYNSYM (isl_ast_node_get_annotation); \ ++ DYNSYM (isl_ast_node_get_type); \ ++ DYNSYM (isl_ast_node_if_get_cond); \ ++ DYNSYM (isl_ast_node_if_get_else); \ ++ DYNSYM (isl_ast_node_if_get_then); \ ++ DYNSYM (isl_ast_node_list_free); \ ++ DYNSYM (isl_ast_node_list_get_ast_node); \ ++ DYNSYM (isl_ast_node_list_n_ast_node); \ ++ DYNSYM (isl_ast_node_user_get_expr); \ ++ DYNSYM (isl_constraint_set_coefficient_val); \ ++ DYNSYM (isl_constraint_set_constant_val); \ ++ DYNSYM (isl_id_get_user); \ ++ DYNSYM (isl_local_space_get_ctx); \ ++ DYNSYM (isl_map_fix_val); \ ++ DYNSYM (isl_options_set_ast_build_atomic_upper_bound); \ ++ DYNSYM (isl_printer_print_ast_node); \ ++ DYNSYM (isl_printer_print_str); \ ++ DYNSYM (isl_printer_set_output_format); \ ++ DYNSYM (isl_pw_aff_mod_val); \ ++ DYNSYM (isl_schedule_constraints_compute_schedule); \ ++ DYNSYM (isl_schedule_constraints_on_domain); \ ++ DYNSYM (isl_schedule_constraints_set_coincidence); \ ++ DYNSYM (isl_schedule_constraints_set_proximity); \ ++ DYNSYM (isl_schedule_constraints_set_validity); \ ++ DYNSYM (isl_set_get_dim_id); \ ++ DYNSYM (isl_set_max_val); \ ++ DYNSYM (isl_set_min_val); \ ++ DYNSYM (isl_set_params); \ ++ DYNSYM (isl_space_align_params); \ ++ DYNSYM (isl_space_map_from_domain_and_range); \ ++ DYNSYM (isl_space_set_tuple_name); \ ++ DYNSYM (isl_space_wrap); \ ++ DYNSYM (isl_union_map_from_domain_and_range); \ ++ DYNSYM (isl_union_map_range); \ ++ DYNSYM (isl_union_set_union); \ ++ DYNSYM (isl_union_set_universe); \ ++ DYNSYM (isl_val_2exp); \ ++ DYNSYM (isl_val_add_ui); \ ++ DYNSYM (isl_val_copy); \ ++ DYNSYM (isl_val_free); \ ++ DYNSYM (isl_val_int_from_si); \ ++ DYNSYM (isl_val_int_from_ui); \ ++ DYNSYM (isl_val_mul); \ ++ DYNSYM (isl_val_neg); \ ++ DYNSYM (isl_val_sub); \ ++ DYNSYM (isl_printer_print_union_map); \ ++ DYNSYM (isl_pw_aff_get_ctx); \ ++ DYNSYM (isl_val_is_int); \ ++ DYNSYM (isl_ctx_get_max_operations); \ ++ DYNSYM (isl_ctx_set_max_operations); \ ++ DYNSYM (isl_ctx_last_error); \ ++ DYNSYM (isl_ctx_reset_operations); \ ++ DYNSYM (isl_map_coalesce); \ ++ DYNSYM (isl_printer_print_schedule); \ ++ DYNSYM (isl_set_set_dim_id); \ ++ DYNSYM (isl_union_map_coalesce); \ ++ DYNSYM (isl_multi_val_set_val); \ ++ DYNSYM (isl_multi_val_zero); \ ++ DYNSYM (isl_options_set_schedule_max_coefficient); \ ++ DYNSYM (isl_options_set_tile_scale_tile_loops); \ ++ DYNSYM (isl_schedule_copy); \ ++ DYNSYM (isl_schedule_get_map); \ ++ DYNSYM (isl_schedule_map_schedule_node_bottom_up); \ ++ DYNSYM (isl_schedule_node_band_get_permutable); \ ++ DYNSYM (isl_schedule_node_band_get_space); \ ++ DYNSYM (isl_schedule_node_band_tile); \ ++ DYNSYM (isl_schedule_node_child); \ ++ DYNSYM (isl_schedule_node_free); \ ++ DYNSYM (isl_schedule_node_get_child); \ ++ DYNSYM (isl_schedule_node_get_ctx); \ ++ DYNSYM (isl_schedule_node_get_type); \ ++ DYNSYM (isl_schedule_node_n_children); \ ++ DYNSYM (isl_union_map_is_equal); \ ++ DYNSYM (isl_union_access_info_compute_flow); \ ++ DYNSYM (isl_union_access_info_from_sink); \ ++ DYNSYM (isl_union_access_info_set_may_source); \ ++ DYNSYM (isl_union_access_info_set_must_source); \ ++ DYNSYM (isl_union_access_info_set_schedule); \ ++ DYNSYM (isl_union_flow_free); \ ++ DYNSYM (isl_union_flow_get_may_dependence); \ ++ DYNSYM (isl_union_flow_get_must_dependence); \ ++ DYNSYM (isl_aff_var_on_domain); \ ++ DYNSYM (isl_multi_aff_from_aff); \ ++ DYNSYM (isl_schedule_get_ctx); \ ++ DYNSYM (isl_multi_aff_set_tuple_id); \ ++ DYNSYM (isl_multi_aff_dim); \ ++ DYNSYM (isl_schedule_get_domain); \ ++ DYNSYM (isl_union_set_is_empty); \ ++ DYNSYM (isl_union_set_get_space); \ ++ DYNSYM (isl_union_pw_multi_aff_empty); \ ++ DYNSYM (isl_union_set_foreach_set); \ ++ DYNSYM (isl_union_set_free); \ ++ DYNSYM (isl_multi_union_pw_aff_from_union_pw_multi_aff); \ ++ DYNSYM (isl_multi_union_pw_aff_apply_multi_aff); \ ++ DYNSYM (isl_schedule_insert_partial_schedule); \ ++ DYNSYM (isl_union_pw_multi_aff_free); \ ++ DYNSYM (isl_pw_multi_aff_project_out_map); \ ++ DYNSYM (isl_union_pw_multi_aff_add_pw_multi_aff); \ ++ DYNSYM (isl_schedule_from_domain); \ ++ DYNSYM (isl_schedule_sequence); \ ++ DYNSYM (isl_ast_build_node_from_schedule); \ ++ DYNSYM (isl_ast_node_mark_get_node); \ ++ DYNSYM (isl_schedule_node_band_member_get_ast_loop_type); \ ++ DYNSYM (isl_schedule_node_band_member_set_ast_loop_type); \ ++ DYNSYM (isl_val_n_abs_num_chunks); \ ++ DYNSYM (isl_val_get_abs_num_chunks); \ ++ DYNSYM (isl_val_int_from_chunks); \ ++ DYNSYM (isl_val_is_neg); \ ++ DYNSYM (isl_version); ++ ++extern struct isl_pointers_s__ ++{ ++ bool inited; ++ void *h; ++#define DYNSYM(x) __typeof (x) *p_##x ++ DYNSYMS ++#undef DYNSYM ++} isl_pointers__; ++ ++#define isl_aff_add_coefficient_si (*isl_pointers__.p_isl_aff_add_coefficient_si) ++#define isl_aff_free (*isl_pointers__.p_isl_aff_free) ++#define isl_aff_get_space (*isl_pointers__.p_isl_aff_get_space) ++#define isl_aff_set_coefficient_si (*isl_pointers__.p_isl_aff_set_coefficient_si) ++#define isl_aff_set_constant_si (*isl_pointers__.p_isl_aff_set_constant_si) ++#define isl_aff_zero_on_domain (*isl_pointers__.p_isl_aff_zero_on_domain) ++#define isl_band_free (*isl_pointers__.p_isl_band_free) ++#define isl_band_get_children (*isl_pointers__.p_isl_band_get_children) ++#define isl_band_get_partial_schedule (*isl_pointers__.p_isl_band_get_partial_schedule) ++#define isl_band_has_children (*isl_pointers__.p_isl_band_has_children) ++#define isl_band_list_free (*isl_pointers__.p_isl_band_list_free) ++#define isl_band_list_get_band (*isl_pointers__.p_isl_band_list_get_band) ++#define isl_band_list_get_ctx (*isl_pointers__.p_isl_band_list_get_ctx) ++#define isl_band_list_n_band (*isl_pointers__.p_isl_band_list_n_band) ++#define isl_band_n_member (*isl_pointers__.p_isl_band_n_member) ++#define isl_basic_map_add_constraint (*isl_pointers__.p_isl_basic_map_add_constraint) ++#define isl_basic_map_project_out (*isl_pointers__.p_isl_basic_map_project_out) ++#define isl_basic_map_universe (*isl_pointers__.p_isl_basic_map_universe) ++#define isl_constraint_set_coefficient_si (*isl_pointers__.p_isl_constraint_set_coefficient_si) ++#define isl_constraint_set_constant_si (*isl_pointers__.p_isl_constraint_set_constant_si) ++#define isl_ctx_alloc (*isl_pointers__.p_isl_ctx_alloc) ++#define isl_ctx_free (*isl_pointers__.p_isl_ctx_free) ++#define isl_equality_alloc (*isl_pointers__.p_isl_equality_alloc) ++#define isl_id_alloc (*isl_pointers__.p_isl_id_alloc) ++#define isl_id_copy (*isl_pointers__.p_isl_id_copy) ++#define isl_id_free (*isl_pointers__.p_isl_id_free) ++#define isl_inequality_alloc (*isl_pointers__.p_isl_inequality_alloc) ++#define isl_local_space_copy (*isl_pointers__.p_isl_local_space_copy) ++#define isl_local_space_free (*isl_pointers__.p_isl_local_space_free) ++#define isl_local_space_from_space (*isl_pointers__.p_isl_local_space_from_space) ++#define isl_local_space_range (*isl_pointers__.p_isl_local_space_range) ++#define isl_map_add_constraint (*isl_pointers__.p_isl_map_add_constraint) ++#define isl_map_add_dims (*isl_pointers__.p_isl_map_add_dims) ++#define isl_map_align_params (*isl_pointers__.p_isl_map_align_params) ++#define isl_map_apply_range (*isl_pointers__.p_isl_map_apply_range) ++#define isl_map_copy (*isl_pointers__.p_isl_map_copy) ++#define isl_map_dim (*isl_pointers__.p_isl_map_dim) ++#define isl_map_dump (*isl_pointers__.p_isl_map_dump) ++#define isl_map_equate (*isl_pointers__.p_isl_map_equate) ++#define isl_map_fix_si (*isl_pointers__.p_isl_map_fix_si) ++#define isl_map_flat_product (*isl_pointers__.p_isl_map_flat_product) ++#define isl_map_flat_range_product (*isl_pointers__.p_isl_map_flat_range_product) ++#define isl_map_free (*isl_pointers__.p_isl_map_free) ++#define isl_map_from_basic_map (*isl_pointers__.p_isl_map_from_basic_map) ++#define isl_map_from_pw_aff (*isl_pointers__.p_isl_map_from_pw_aff) ++#define isl_map_from_union_map (*isl_pointers__.p_isl_map_from_union_map) ++#define isl_map_get_ctx (*isl_pointers__.p_isl_map_get_ctx) ++#define isl_map_get_space (*isl_pointers__.p_isl_map_get_space) ++#define isl_map_get_tuple_id (*isl_pointers__.p_isl_map_get_tuple_id) ++#define isl_map_insert_dims (*isl_pointers__.p_isl_map_insert_dims) ++#define isl_map_intersect (*isl_pointers__.p_isl_map_intersect) ++#define isl_map_intersect_domain (*isl_pointers__.p_isl_map_intersect_domain) ++#define isl_map_intersect_range (*isl_pointers__.p_isl_map_intersect_range) ++#define isl_map_is_empty (*isl_pointers__.p_isl_map_is_empty) ++#define isl_map_lex_ge (*isl_pointers__.p_isl_map_lex_ge) ++#define isl_map_lex_le (*isl_pointers__.p_isl_map_lex_le) ++#define isl_map_n_out (*isl_pointers__.p_isl_map_n_out) ++#define isl_map_range (*isl_pointers__.p_isl_map_range) ++#define isl_map_set_tuple_id (*isl_pointers__.p_isl_map_set_tuple_id) ++#define isl_map_universe (*isl_pointers__.p_isl_map_universe) ++#define isl_options_set_on_error (*isl_pointers__.p_isl_options_set_on_error) ++#define isl_options_set_schedule_serialize_sccs (*isl_pointers__.p_isl_options_set_schedule_serialize_sccs) ++#define isl_printer_set_yaml_style (*isl_pointers__.p_isl_printer_set_yaml_style) ++#define isl_options_set_schedule_max_constant_term (*isl_pointers__.p_isl_options_set_schedule_max_constant_term) ++#define isl_options_set_schedule_maximize_band_depth (*isl_pointers__.p_isl_options_set_schedule_maximize_band_depth) ++#define isl_printer_free (*isl_pointers__.p_isl_printer_free) ++#define isl_printer_print_aff (*isl_pointers__.p_isl_printer_print_aff) ++#define isl_printer_print_constraint (*isl_pointers__.p_isl_printer_print_constraint) ++#define isl_printer_print_map (*isl_pointers__.p_isl_printer_print_map) ++#define isl_printer_print_set (*isl_pointers__.p_isl_printer_print_set) ++#define isl_printer_to_file (*isl_pointers__.p_isl_printer_to_file) ++#define isl_pw_aff_add (*isl_pointers__.p_isl_pw_aff_add) ++#define isl_pw_aff_alloc (*isl_pointers__.p_isl_pw_aff_alloc) ++#define isl_pw_aff_copy (*isl_pointers__.p_isl_pw_aff_copy) ++#define isl_pw_aff_eq_set (*isl_pointers__.p_isl_pw_aff_eq_set) ++#define isl_pw_aff_free (*isl_pointers__.p_isl_pw_aff_free) ++#define isl_pw_aff_from_aff (*isl_pointers__.p_isl_pw_aff_from_aff) ++#define isl_pw_aff_ge_set (*isl_pointers__.p_isl_pw_aff_ge_set) ++#define isl_pw_aff_gt_set (*isl_pointers__.p_isl_pw_aff_gt_set) ++#define isl_pw_aff_is_cst (*isl_pointers__.p_isl_pw_aff_is_cst) ++#define isl_pw_aff_le_set (*isl_pointers__.p_isl_pw_aff_le_set) ++#define isl_pw_aff_lt_set (*isl_pointers__.p_isl_pw_aff_lt_set) ++#define isl_pw_aff_mul (*isl_pointers__.p_isl_pw_aff_mul) ++#define isl_pw_aff_ne_set (*isl_pointers__.p_isl_pw_aff_ne_set) ++#define isl_pw_aff_nonneg_set (*isl_pointers__.p_isl_pw_aff_nonneg_set) ++#define isl_pw_aff_set_tuple_id (*isl_pointers__.p_isl_pw_aff_set_tuple_id) ++#define isl_pw_aff_sub (*isl_pointers__.p_isl_pw_aff_sub) ++#define isl_pw_aff_zero_set (*isl_pointers__.p_isl_pw_aff_zero_set) ++#define isl_schedule_free (*isl_pointers__.p_isl_schedule_free) ++#define isl_schedule_get_band_forest (*isl_pointers__.p_isl_schedule_get_band_forest) ++#define isl_set_add_constraint (*isl_pointers__.p_isl_set_add_constraint) ++#define isl_set_add_dims (*isl_pointers__.p_isl_set_add_dims) ++#define isl_set_apply (*isl_pointers__.p_isl_set_apply) ++#define isl_set_coalesce (*isl_pointers__.p_isl_set_coalesce) ++#define isl_set_copy (*isl_pointers__.p_isl_set_copy) ++#define isl_set_dim (*isl_pointers__.p_isl_set_dim) ++#define isl_set_fix_si (*isl_pointers__.p_isl_set_fix_si) ++#define isl_set_free (*isl_pointers__.p_isl_set_free) ++#define isl_set_get_space (*isl_pointers__.p_isl_set_get_space) ++#define isl_set_get_tuple_id (*isl_pointers__.p_isl_set_get_tuple_id) ++#define isl_set_intersect (*isl_pointers__.p_isl_set_intersect) ++#define isl_set_is_empty (*isl_pointers__.p_isl_set_is_empty) ++#define isl_set_n_dim (*isl_pointers__.p_isl_set_n_dim) ++#define isl_set_nat_universe (*isl_pointers__.p_isl_set_nat_universe) ++#define isl_set_project_out (*isl_pointers__.p_isl_set_project_out) ++#define isl_set_set_tuple_id (*isl_pointers__.p_isl_set_set_tuple_id) ++#define isl_set_universe (*isl_pointers__.p_isl_set_universe) ++#define isl_space_add_dims (*isl_pointers__.p_isl_space_add_dims) ++#define isl_space_alloc (*isl_pointers__.p_isl_space_alloc) ++#define isl_space_copy (*isl_pointers__.p_isl_space_copy) ++#define isl_space_dim (*isl_pointers__.p_isl_space_dim) ++#define isl_space_domain (*isl_pointers__.p_isl_space_domain) ++#define isl_space_find_dim_by_id (*isl_pointers__.p_isl_space_find_dim_by_id) ++#define isl_space_free (*isl_pointers__.p_isl_space_free) ++#define isl_space_from_domain (*isl_pointers__.p_isl_space_from_domain) ++#define isl_space_get_tuple_id (*isl_pointers__.p_isl_space_get_tuple_id) ++#define isl_space_params_alloc (*isl_pointers__.p_isl_space_params_alloc) ++#define isl_space_range (*isl_pointers__.p_isl_space_range) ++#define isl_space_set_alloc (*isl_pointers__.p_isl_space_set_alloc) ++#define isl_space_set_dim_id (*isl_pointers__.p_isl_space_set_dim_id) ++#define isl_space_set_tuple_id (*isl_pointers__.p_isl_space_set_tuple_id) ++#define isl_union_map_add_map (*isl_pointers__.p_isl_union_map_add_map) ++#define isl_union_map_align_params (*isl_pointers__.p_isl_union_map_align_params) ++#define isl_union_map_apply_domain (*isl_pointers__.p_isl_union_map_apply_domain) ++#define isl_union_map_apply_range (*isl_pointers__.p_isl_union_map_apply_range) ++#define isl_union_map_compute_flow (*isl_pointers__.p_isl_union_map_compute_flow) ++#define isl_union_map_copy (*isl_pointers__.p_isl_union_map_copy) ++#define isl_union_map_empty (*isl_pointers__.p_isl_union_map_empty) ++#define isl_union_map_flat_range_product (*isl_pointers__.p_isl_union_map_flat_range_product) ++#define isl_union_map_foreach_map (*isl_pointers__.p_isl_union_map_foreach_map) ++#define isl_union_map_free (*isl_pointers__.p_isl_union_map_free) ++#define isl_union_map_from_map (*isl_pointers__.p_isl_union_map_from_map) ++#define isl_union_map_get_ctx (*isl_pointers__.p_isl_union_map_get_ctx) ++#define isl_union_map_get_space (*isl_pointers__.p_isl_union_map_get_space) ++#define isl_union_map_gist_domain (*isl_pointers__.p_isl_union_map_gist_domain) ++#define isl_union_map_gist_range (*isl_pointers__.p_isl_union_map_gist_range) ++#define isl_union_map_intersect_domain (*isl_pointers__.p_isl_union_map_intersect_domain) ++#define isl_union_map_is_empty (*isl_pointers__.p_isl_union_map_is_empty) ++#define isl_union_map_subtract (*isl_pointers__.p_isl_union_map_subtract) ++#define isl_union_map_union (*isl_pointers__.p_isl_union_map_union) ++#define isl_union_set_add_set (*isl_pointers__.p_isl_union_set_add_set) ++#define isl_union_set_compute_schedule (*isl_pointers__.p_isl_union_set_compute_schedule) ++#define isl_union_set_copy (*isl_pointers__.p_isl_union_set_copy) ++#define isl_union_set_empty (*isl_pointers__.p_isl_union_set_empty) ++#define isl_union_set_from_set (*isl_pointers__.p_isl_union_set_from_set) ++#define isl_aff_add_constant_val (*isl_pointers__.p_isl_aff_add_constant_val) ++#define isl_aff_get_coefficient_val (*isl_pointers__.p_isl_aff_get_coefficient_val) ++#define isl_aff_get_ctx (*isl_pointers__.p_isl_aff_get_ctx) ++#define isl_aff_mod_val (*isl_pointers__.p_isl_aff_mod_val) ++#define isl_ast_build_ast_from_schedule (*isl_pointers__.p_isl_ast_build_ast_from_schedule) ++#define isl_ast_build_free (*isl_pointers__.p_isl_ast_build_free) ++#define isl_ast_build_from_context (*isl_pointers__.p_isl_ast_build_from_context) ++#define isl_ast_build_get_ctx (*isl_pointers__.p_isl_ast_build_get_ctx) ++#define isl_ast_build_get_schedule (*isl_pointers__.p_isl_ast_build_get_schedule) ++#define isl_ast_build_get_schedule_space (*isl_pointers__.p_isl_ast_build_get_schedule_space) ++#define isl_ast_build_set_before_each_for (*isl_pointers__.p_isl_ast_build_set_before_each_for) ++#define isl_ast_build_set_options (*isl_pointers__.p_isl_ast_build_set_options) ++#define isl_ast_expr_free (*isl_pointers__.p_isl_ast_expr_free) ++#define isl_ast_expr_from_val (*isl_pointers__.p_isl_ast_expr_from_val) ++#define isl_ast_expr_get_ctx (*isl_pointers__.p_isl_ast_expr_get_ctx) ++#define isl_ast_expr_get_id (*isl_pointers__.p_isl_ast_expr_get_id) ++#define isl_ast_expr_get_op_arg (*isl_pointers__.p_isl_ast_expr_get_op_arg) ++#define isl_ast_expr_get_op_n_arg (*isl_pointers__.p_isl_ast_expr_get_op_n_arg) ++#define isl_ast_expr_get_op_type (*isl_pointers__.p_isl_ast_expr_get_op_type) ++#define isl_ast_expr_get_type (*isl_pointers__.p_isl_ast_expr_get_type) ++#define isl_ast_expr_get_val (*isl_pointers__.p_isl_ast_expr_get_val) ++#define isl_ast_expr_sub (*isl_pointers__.p_isl_ast_expr_sub) ++#define isl_ast_node_block_get_children (*isl_pointers__.p_isl_ast_node_block_get_children) ++#define isl_ast_node_for_get_body (*isl_pointers__.p_isl_ast_node_for_get_body) ++#define isl_ast_node_for_get_cond (*isl_pointers__.p_isl_ast_node_for_get_cond) ++#define isl_ast_node_for_get_inc (*isl_pointers__.p_isl_ast_node_for_get_inc) ++#define isl_ast_node_for_get_init (*isl_pointers__.p_isl_ast_node_for_get_init) ++#define isl_ast_node_for_get_iterator (*isl_pointers__.p_isl_ast_node_for_get_iterator) ++#define isl_ast_node_free (*isl_pointers__.p_isl_ast_node_free) ++#define isl_ast_node_get_annotation (*isl_pointers__.p_isl_ast_node_get_annotation) ++#define isl_ast_node_get_type (*isl_pointers__.p_isl_ast_node_get_type) ++#define isl_ast_node_if_get_cond (*isl_pointers__.p_isl_ast_node_if_get_cond) ++#define isl_ast_node_if_get_else (*isl_pointers__.p_isl_ast_node_if_get_else) ++#define isl_ast_node_if_get_then (*isl_pointers__.p_isl_ast_node_if_get_then) ++#define isl_ast_node_list_free (*isl_pointers__.p_isl_ast_node_list_free) ++#define isl_ast_node_list_get_ast_node (*isl_pointers__.p_isl_ast_node_list_get_ast_node) ++#define isl_ast_node_list_n_ast_node (*isl_pointers__.p_isl_ast_node_list_n_ast_node) ++#define isl_ast_node_user_get_expr (*isl_pointers__.p_isl_ast_node_user_get_expr) ++#define isl_constraint_set_coefficient_val (*isl_pointers__.p_isl_constraint_set_coefficient_val) ++#define isl_constraint_set_constant_val (*isl_pointers__.p_isl_constraint_set_constant_val) ++#define isl_id_get_user (*isl_pointers__.p_isl_id_get_user) ++#define isl_local_space_get_ctx (*isl_pointers__.p_isl_local_space_get_ctx) ++#define isl_map_fix_val (*isl_pointers__.p_isl_map_fix_val) ++#define isl_options_set_ast_build_atomic_upper_bound (*isl_pointers__.p_isl_options_set_ast_build_atomic_upper_bound) ++#define isl_printer_print_ast_node (*isl_pointers__.p_isl_printer_print_ast_node) ++#define isl_printer_print_str (*isl_pointers__.p_isl_printer_print_str) ++#define isl_printer_set_output_format (*isl_pointers__.p_isl_printer_set_output_format) ++#define isl_pw_aff_mod_val (*isl_pointers__.p_isl_pw_aff_mod_val) ++#define isl_schedule_constraints_compute_schedule (*isl_pointers__.p_isl_schedule_constraints_compute_schedule) ++#define isl_schedule_constraints_on_domain (*isl_pointers__.p_isl_schedule_constraints_on_domain) ++#define isl_schedule_constraints_set_coincidence (*isl_pointers__.p_isl_schedule_constraints_set_coincidence) ++#define isl_schedule_constraints_set_proximity (*isl_pointers__.p_isl_schedule_constraints_set_proximity) ++#define isl_schedule_constraints_set_validity (*isl_pointers__.p_isl_schedule_constraints_set_validity) ++#define isl_set_get_dim_id (*isl_pointers__.p_isl_set_get_dim_id) ++#define isl_set_max_val (*isl_pointers__.p_isl_set_max_val) ++#define isl_set_min_val (*isl_pointers__.p_isl_set_min_val) ++#define isl_set_params (*isl_pointers__.p_isl_set_params) ++#define isl_space_align_params (*isl_pointers__.p_isl_space_align_params) ++#define isl_space_map_from_domain_and_range (*isl_pointers__.p_isl_space_map_from_domain_and_range) ++#define isl_space_set_tuple_name (*isl_pointers__.p_isl_space_set_tuple_name) ++#define isl_space_wrap (*isl_pointers__.p_isl_space_wrap) ++#define isl_union_map_from_domain_and_range (*isl_pointers__.p_isl_union_map_from_domain_and_range) ++#define isl_union_map_range (*isl_pointers__.p_isl_union_map_range) ++#define isl_union_set_union (*isl_pointers__.p_isl_union_set_union) ++#define isl_union_set_universe (*isl_pointers__.p_isl_union_set_universe) ++#define isl_val_2exp (*isl_pointers__.p_isl_val_2exp) ++#define isl_val_add_ui (*isl_pointers__.p_isl_val_add_ui) ++#define isl_val_copy (*isl_pointers__.p_isl_val_copy) ++#define isl_val_free (*isl_pointers__.p_isl_val_free) ++#define isl_val_int_from_si (*isl_pointers__.p_isl_val_int_from_si) ++#define isl_val_int_from_ui (*isl_pointers__.p_isl_val_int_from_ui) ++#define isl_val_mul (*isl_pointers__.p_isl_val_mul) ++#define isl_val_neg (*isl_pointers__.p_isl_val_neg) ++#define isl_val_sub (*isl_pointers__.p_isl_val_sub) ++#define isl_printer_print_union_map (*isl_pointers__.p_isl_printer_print_union_map) ++#define isl_pw_aff_get_ctx (*isl_pointers__.p_isl_pw_aff_get_ctx) ++#define isl_val_is_int (*isl_pointers__.p_isl_val_is_int) ++#define isl_ctx_get_max_operations (*isl_pointers__.p_isl_ctx_get_max_operations) ++#define isl_ctx_set_max_operations (*isl_pointers__.p_isl_ctx_set_max_operations) ++#define isl_ctx_last_error (*isl_pointers__.p_isl_ctx_last_error) ++#define isl_ctx_reset_operations (*isl_pointers__.p_isl_ctx_reset_operations) ++#define isl_map_coalesce (*isl_pointers__.p_isl_map_coalesce) ++#define isl_printer_print_schedule (*isl_pointers__.p_isl_printer_print_schedule) ++#define isl_set_set_dim_id (*isl_pointers__.p_isl_set_set_dim_id) ++#define isl_union_map_coalesce (*isl_pointers__.p_isl_union_map_coalesce) ++#define isl_multi_val_set_val (*isl_pointers__.p_isl_multi_val_set_val) ++#define isl_multi_val_zero (*isl_pointers__.p_isl_multi_val_zero) ++#define isl_options_set_schedule_max_coefficient (*isl_pointers__.p_isl_options_set_schedule_max_coefficient) ++#define isl_options_set_tile_scale_tile_loops (*isl_pointers__.p_isl_options_set_tile_scale_tile_loops) ++#define isl_schedule_copy (*isl_pointers__.p_isl_schedule_copy) ++#define isl_schedule_get_map (*isl_pointers__.p_isl_schedule_get_map) ++#define isl_schedule_map_schedule_node_bottom_up (*isl_pointers__.p_isl_schedule_map_schedule_node_bottom_up) ++#define isl_schedule_node_band_get_permutable (*isl_pointers__.p_isl_schedule_node_band_get_permutable) ++#define isl_schedule_node_band_get_space (*isl_pointers__.p_isl_schedule_node_band_get_space) ++#define isl_schedule_node_band_tile (*isl_pointers__.p_isl_schedule_node_band_tile) ++#define isl_schedule_node_child (*isl_pointers__.p_isl_schedule_node_child) ++#define isl_schedule_node_free (*isl_pointers__.p_isl_schedule_node_free) ++#define isl_schedule_node_get_child (*isl_pointers__.p_isl_schedule_node_get_child) ++#define isl_schedule_node_get_ctx (*isl_pointers__.p_isl_schedule_node_get_ctx) ++#define isl_schedule_node_get_type (*isl_pointers__.p_isl_schedule_node_get_type) ++#define isl_schedule_node_n_children (*isl_pointers__.p_isl_schedule_node_n_children) ++#define isl_union_map_is_equal (*isl_pointers__.p_isl_union_map_is_equal) ++#define isl_union_access_info_compute_flow (*isl_pointers__.p_isl_union_access_info_compute_flow) ++#define isl_union_access_info_from_sink (*isl_pointers__.p_isl_union_access_info_from_sink) ++#define isl_union_access_info_set_may_source (*isl_pointers__.p_isl_union_access_info_set_may_source) ++#define isl_union_access_info_set_must_source (*isl_pointers__.p_isl_union_access_info_set_must_source) ++#define isl_union_access_info_set_schedule (*isl_pointers__.p_isl_union_access_info_set_schedule) ++#define isl_union_flow_free (*isl_pointers__.p_isl_union_flow_free) ++#define isl_union_flow_get_may_dependence (*isl_pointers__.p_isl_union_flow_get_may_dependence) ++#define isl_union_flow_get_must_dependence (*isl_pointers__.p_isl_union_flow_get_must_dependence) ++#define isl_aff_var_on_domain (*isl_pointers__.p_isl_aff_var_on_domain) ++#define isl_multi_aff_from_aff (*isl_pointers__.p_isl_multi_aff_from_aff) ++#define isl_schedule_get_ctx (*isl_pointers__.p_isl_schedule_get_ctx) ++#define isl_multi_aff_set_tuple_id (*isl_pointers__.p_isl_multi_aff_set_tuple_id) ++#define isl_multi_aff_dim (*isl_pointers__.p_isl_multi_aff_dim) ++#define isl_schedule_get_domain (*isl_pointers__.p_isl_schedule_get_domain) ++#define isl_union_set_is_empty (*isl_pointers__.p_isl_union_set_is_empty) ++#define isl_union_set_get_space (*isl_pointers__.p_isl_union_set_get_space) ++#define isl_union_pw_multi_aff_empty (*isl_pointers__.p_isl_union_pw_multi_aff_empty) ++#define isl_union_set_foreach_set (*isl_pointers__.p_isl_union_set_foreach_set) ++#define isl_union_set_free (*isl_pointers__.p_isl_union_set_free) ++#define isl_multi_union_pw_aff_from_union_pw_multi_aff (*isl_pointers__.p_isl_multi_union_pw_aff_from_union_pw_multi_aff) ++#define isl_multi_union_pw_aff_apply_multi_aff (*isl_pointers__.p_isl_multi_union_pw_aff_apply_multi_aff) ++#define isl_schedule_insert_partial_schedule (*isl_pointers__.p_isl_schedule_insert_partial_schedule) ++#define isl_union_pw_multi_aff_free (*isl_pointers__.p_isl_union_pw_multi_aff_free) ++#define isl_pw_multi_aff_project_out_map (*isl_pointers__.p_isl_pw_multi_aff_project_out_map) ++#define isl_union_pw_multi_aff_add_pw_multi_aff (*isl_pointers__.p_isl_union_pw_multi_aff_add_pw_multi_aff) ++#define isl_schedule_from_domain (*isl_pointers__.p_isl_schedule_from_domain) ++#define isl_schedule_sequence (*isl_pointers__.p_isl_schedule_sequence) ++#define isl_ast_build_node_from_schedule (*isl_pointers__.p_isl_ast_build_node_from_schedule) ++#define isl_ast_node_mark_get_node (*isl_pointers__.p_isl_ast_node_mark_get_node) ++#define isl_schedule_node_band_member_get_ast_loop_type (*isl_pointers__.p_isl_schedule_node_band_member_get_ast_loop_type) ++#define isl_schedule_node_band_member_set_ast_loop_type (*isl_pointers__.p_isl_schedule_node_band_member_set_ast_loop_type) ++#define isl_val_n_abs_num_chunks (*isl_pointers__.p_isl_val_n_abs_num_chunks) ++#define isl_val_get_abs_num_chunks (*isl_pointers__.p_isl_val_get_abs_num_chunks) ++#define isl_val_int_from_chunks (*isl_pointers__.p_isl_val_int_from_chunks) ++#define isl_val_is_neg (*isl_pointers__.p_isl_val_is_neg) ++#define isl_version (*isl_pointers__.p_isl_version) + + typedef struct poly_dr *poly_dr_p; + +@@ -458,5 +1038,6 @@ extern void build_scops (vec *); + extern void dot_all_sese (FILE *, vec &); + extern void dot_sese (sese_l &); + extern void dot_cfg (); ++extern const char *get_isl_version (bool); + + #endif +--- gcc/graphite.c.jj 2015-11-04 14:15:32.000000000 +0100 ++++ gcc/graphite.c 2015-11-04 14:56:02.645536409 +0100 +@@ -55,6 +55,35 @@ along with GCC; see the file COPYING3. + #include "tree-vectorizer.h" + #include "graphite.h" + ++__typeof (isl_pointers__) isl_pointers__; ++ ++static bool ++init_isl_pointers (void) ++{ ++ void *h; ++ ++ if (isl_pointers__.inited) ++ return isl_pointers__.h != NULL; ++ h = dlopen ("libisl.so.15", RTLD_LAZY); ++ isl_pointers__.h = h; ++ if (h == NULL) ++ return false; ++#define DYNSYM(x) \ ++ do \ ++ { \ ++ union { __typeof (isl_pointers__.p_##x) p; void *q; } u; \ ++ u.q = dlsym (h, #x); \ ++ if (u.q == NULL) \ ++ return false; \ ++ isl_pointers__.p_##x = u.p; \ ++ } \ ++ while (0) ++ DYNSYMS ++#undef DYNSYM ++ isl_pointers__.inited = true; ++ return true; ++} ++ + /* Print global statistics to FILE. */ + + static void +@@ -299,6 +328,15 @@ graphite_transform_loops (void) + if (parallelized_function_p (cfun->decl)) + return; + ++ if (number_of_loops (cfun) <= 1) ++ return; ++ ++ if (!init_isl_pointers ()) ++ { ++ sorry ("Graphite loop optimizations cannot be used"); ++ return; ++ } ++ + ctx = isl_ctx_alloc (); + isl_options_set_on_error (ctx, ISL_ON_ERROR_ABORT); + if (!graphite_initialize (ctx)) +@@ -342,6 +380,14 @@ graphite_transform_loops (void) + isl_ctx_free (ctx); + } + ++const char * ++get_isl_version (bool force) ++{ ++ if (force) ++ init_isl_pointers (); ++ return (isl_pointers__.inited && isl_version) ? isl_version () : "none"; ++} ++ + #else /* If isl is not available: #ifndef HAVE_isl. */ + + static void +--- gcc/toplev.c.jj 2017-02-19 13:02:31.000000000 +0100 ++++ gcc/toplev.c 2017-02-19 16:50:25.536301350 +0100 +@@ -94,6 +94,7 @@ along with GCC; see the file COPYING3. + + #ifdef HAVE_isl + #include ++extern const char *get_isl_version (bool); + #endif + + static void general_init (const char *, bool); +@@ -683,7 +684,7 @@ print_version (FILE *file, const char *i + #ifndef HAVE_isl + "none" + #else +- isl_version () ++ get_isl_version (*indent == 0) + #endif + ); + if (strcmp (GCC_GMP_STRINGIFY_VERSION, gmp_version)) diff --git a/SOURCES/gcc7-libgomp-omp_h-multilib.patch b/SOURCES/gcc7-libgomp-omp_h-multilib.patch new file mode 100644 index 0000000..d0e98d1 --- /dev/null +++ b/SOURCES/gcc7-libgomp-omp_h-multilib.patch @@ -0,0 +1,17 @@ +2008-06-09 Jakub Jelinek + + * omp.h.in (omp_nest_lock_t): Fix up for Linux multilibs. + +--- libgomp/omp.h.in.jj 2008-06-09 13:34:05.000000000 +0200 ++++ libgomp/omp.h.in 2008-06-09 13:34:48.000000000 +0200 +@@ -42,8 +42,8 @@ typedef struct + + typedef struct + { +- unsigned char _x[@OMP_NEST_LOCK_SIZE@] +- __attribute__((__aligned__(@OMP_NEST_LOCK_ALIGN@))); ++ unsigned char _x[8 + sizeof (void *)] ++ __attribute__((__aligned__(sizeof (void *)))); + } omp_nest_lock_t; + #endif + diff --git a/SOURCES/gcc7-libtool-no-rpath.patch b/SOURCES/gcc7-libtool-no-rpath.patch new file mode 100644 index 0000000..466c661 --- /dev/null +++ b/SOURCES/gcc7-libtool-no-rpath.patch @@ -0,0 +1,27 @@ +libtool sucks. +--- ltmain.sh.jj 2007-12-07 14:53:21.000000000 +0100 ++++ ltmain.sh 2008-09-05 21:51:48.000000000 +0200 +@@ -5394,6 +5394,7 @@ EOF + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do ++ case "$libdir" in /usr/lib|/usr/lib64|/usr/lib/../lib|/usr/lib/../lib64) continue;; esac + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then +@@ -6071,6 +6072,7 @@ EOF + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do ++ case "$libdir" in /usr/lib|/usr/lib64|/usr/lib/../lib|/usr/lib/../lib64) continue;; esac + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then +@@ -6120,6 +6122,7 @@ EOF + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do ++ case "$libdir" in /usr/lib|/usr/lib64|/usr/lib/../lib|/usr/lib/../lib64) continue;; esac + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then diff --git a/SOURCES/gcc7-no-add-needed.patch b/SOURCES/gcc7-no-add-needed.patch new file mode 100644 index 0000000..4102e1c --- /dev/null +++ b/SOURCES/gcc7-no-add-needed.patch @@ -0,0 +1,50 @@ +2010-02-08 Roland McGrath + + * config/rs6000/sysv4.h (LINK_EH_SPEC): Pass --no-add-needed to the + linker. + * config/gnu-user.h (LINK_EH_SPEC): Likewise. + * config/alpha/elf.h (LINK_EH_SPEC): Likewise. + * config/ia64/linux.h (LINK_EH_SPEC): Likewise. + +--- gcc/config/alpha/elf.h.jj 2011-01-03 12:52:31.118056764 +0100 ++++ gcc/config/alpha/elf.h 2011-01-04 18:14:10.931874160 +0100 +@@ -165,5 +165,5 @@ extern int alpha_this_gpdisp_sequence_nu + I imagine that other systems will catch up. In the meantime, it + doesn't harm to make sure that the data exists to be used later. */ + #if defined(HAVE_LD_EH_FRAME_HDR) +-#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " ++#define LINK_EH_SPEC "--no-add-needed %{!static:--eh-frame-hdr} " + #endif +--- gcc/config/ia64/linux.h.jj 2011-01-03 13:02:11.462994522 +0100 ++++ gcc/config/ia64/linux.h 2011-01-04 18:14:10.931874160 +0100 +@@ -76,7 +76,7 @@ do { \ + Signalize that because we have fde-glibc, we don't need all C shared libs + linked against -lgcc_s. */ + #undef LINK_EH_SPEC +-#define LINK_EH_SPEC "" ++#define LINK_EH_SPEC "--no-add-needed " + + #undef TARGET_INIT_LIBFUNCS + #define TARGET_INIT_LIBFUNCS ia64_soft_fp_init_libfuncs +--- gcc/config/gnu-user.h.jj 2011-01-03 12:53:03.739057299 +0100 ++++ gcc/config/gnu-user.h 2011-01-04 18:14:10.932814884 +0100 +@@ -82,7 +82,7 @@ see the files COPYING3 and COPYING.RUNTI + #define LIB_SPEC GNU_USER_TARGET_LIB_SPEC + + #if defined(HAVE_LD_EH_FRAME_HDR) +-#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " ++#define LINK_EH_SPEC "--no-add-needed %{!static:--eh-frame-hdr} " + #endif + + #undef LINK_GCC_C_SEQUENCE_SPEC +--- gcc/config/rs6000/sysv4.h.jj 2011-01-03 13:02:18.255994215 +0100 ++++ gcc/config/rs6000/sysv4.h 2011-01-04 18:14:10.933888871 +0100 +@@ -820,7 +820,7 @@ extern int fixuplabelno; + -dynamic-linker " GNU_USER_DYNAMIC_LINKER "}}" + + #if defined(HAVE_LD_EH_FRAME_HDR) +-# define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " ++# define LINK_EH_SPEC "--no-add-needed %{!static:--eh-frame-hdr} " + #endif + + #define CPP_OS_LINUX_SPEC "-D__unix__ -D__gnu_linux__ -D__linux__ \ diff --git a/SOURCES/gcc7-pr84128.patch b/SOURCES/gcc7-pr84128.patch new file mode 100644 index 0000000..454fc09 --- /dev/null +++ b/SOURCES/gcc7-pr84128.patch @@ -0,0 +1,180 @@ + + PR target/84128 + * config/i386/i386.c (release_scratch_register_on_entry): Add new + OFFSET and RELEASE_VIA_POP arguments. Use SP+OFFSET to restore + the scratch if RELEASE_VIA_POP is false. + (ix86_adjust_stack_and_probe_stack_clash): Un-constify SIZE. + If we have to save a temporary register, decrement SIZE appropriately. + Pass new arguments to release_scratch_register_on_entry. + (ix86_adjust_stack_and_probe): Likewise. + (ix86_emit_probe_stack_range): Pass new arguments to + release_scratch_register_on_entry. + + PR target/84128 + * gcc.target/i386/pr84128.c: New test. + +diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c +index fef34a1..3196ac4 100644 +--- gcc/config/i386/i386.c ++++ gcc/config/i386/i386.c +@@ -12567,22 +12567,39 @@ get_scratch_register_on_entry (struct scratch_reg *sr) + } + } + +-/* Release a scratch register obtained from the preceding function. */ ++/* Release a scratch register obtained from the preceding function. ++ ++ If RELEASE_VIA_POP is true, we just pop the register off the stack ++ to release it. This is what non-Linux systems use with -fstack-check. ++ ++ Otherwise we use OFFSET to locate the saved register and the ++ allocated stack space becomes part of the local frame and is ++ deallocated by the epilogue. */ + + static void +-release_scratch_register_on_entry (struct scratch_reg *sr) ++release_scratch_register_on_entry (struct scratch_reg *sr, HOST_WIDE_INT offset, ++ bool release_via_pop) + { + if (sr->saved) + { +- struct machine_function *m = cfun->machine; +- rtx x, insn = emit_insn (gen_pop (sr->reg)); ++ if (release_via_pop) ++ { ++ struct machine_function *m = cfun->machine; ++ rtx x, insn = emit_insn (gen_pop (sr->reg)); + +- /* The RTX_FRAME_RELATED_P mechanism doesn't know about pop. */ +- RTX_FRAME_RELATED_P (insn) = 1; +- x = gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (UNITS_PER_WORD)); +- x = gen_rtx_SET (stack_pointer_rtx, x); +- add_reg_note (insn, REG_FRAME_RELATED_EXPR, x); +- m->fs.sp_offset -= UNITS_PER_WORD; ++ /* The RX FRAME_RELATED_P mechanism doesn't know about pop. */ ++ RTX_FRAME_RELATED_P (insn) = 1; ++ x = gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (UNITS_PER_WORD)); ++ x = gen_rtx_SET (stack_pointer_rtx, x); ++ add_reg_note (insn, REG_FRAME_RELATED_EXPR, x); ++ m->fs.sp_offset -= UNITS_PER_WORD; ++ } ++ else ++ { ++ rtx x = gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (offset)); ++ x = gen_rtx_SET (sr->reg, gen_rtx_MEM (word_mode, x)); ++ emit_insn (x); ++ } + } + } + +@@ -12597,7 +12614,7 @@ release_scratch_register_on_entry (struct scratch_reg *sr) + pushed on the stack. */ + + static void +-ix86_adjust_stack_and_probe_stack_clash (const HOST_WIDE_INT size, ++ix86_adjust_stack_and_probe_stack_clash (HOST_WIDE_INT size, + const bool int_registers_saved) + { + struct machine_function *m = cfun->machine; +@@ -12713,6 +12730,12 @@ ix86_adjust_stack_and_probe_stack_clash (const HOST_WIDE_INT size, + struct scratch_reg sr; + get_scratch_register_on_entry (&sr); + ++ /* If we needed to save a register, then account for any space ++ that was pushed (we are not going to pop the register when ++ we do the restore). */ ++ if (sr.saved) ++ size -= UNITS_PER_WORD; ++ + /* Step 1: round SIZE down to a multiple of the interval. */ + HOST_WIDE_INT rounded_size = size & -probe_interval; + +@@ -12761,7 +12784,9 @@ ix86_adjust_stack_and_probe_stack_clash (const HOST_WIDE_INT size, + m->fs.cfa_reg == stack_pointer_rtx); + dump_stack_clash_frame_info (PROBE_LOOP, size != rounded_size); + +- release_scratch_register_on_entry (&sr); ++ /* This does not deallocate the space reserved for the scratch ++ register. That will be deallocated in the epilogue. */ ++ release_scratch_register_on_entry (&sr, size, false); + } + + /* Make sure nothing is scheduled before we are done. */ +@@ -12774,7 +12799,7 @@ ix86_adjust_stack_and_probe_stack_clash (const HOST_WIDE_INT size, + pushed on the stack. */ + + static void +-ix86_adjust_stack_and_probe (const HOST_WIDE_INT size, ++ix86_adjust_stack_and_probe (HOST_WIDE_INT size, + const bool int_registers_saved) + { + /* We skip the probe for the first interval + a small dope of 4 words and +@@ -12847,6 +12872,11 @@ ix86_adjust_stack_and_probe (const HOST_WIDE_INT size, + + get_scratch_register_on_entry (&sr); + ++ /* If we needed to save a register, then account for any space ++ that was pushed (we are not going to pop the register when ++ we do the restore). */ ++ if (sr.saved) ++ size -= UNITS_PER_WORD; + + /* Step 1: round SIZE to the previous multiple of the interval. */ + +@@ -12906,7 +12936,9 @@ ix86_adjust_stack_and_probe (const HOST_WIDE_INT size, + (get_probe_interval () + + dope)))); + +- release_scratch_register_on_entry (&sr); ++ /* This does not deallocate the space reserved for the scratch ++ register. That will be deallocated in the epilogue. */ ++ release_scratch_register_on_entry (&sr, size, false); + } + + /* Even if the stack pointer isn't the CFA register, we need to correctly +@@ -13055,7 +13087,7 @@ ix86_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size, + sr.reg), + rounded_size - size)); + +- release_scratch_register_on_entry (&sr); ++ release_scratch_register_on_entry (&sr, size, true); + } + + /* Make sure nothing is scheduled before we are done. */ + +diff --git a/gcc/testsuite/gcc.target/i386/pr84128.c b/gcc/testsuite/gcc.target/i386/pr84128.c +new file mode 100644 +index 0000000..a8323fd6 +--- /dev/null ++++ gcc/testsuite/gcc.target/i386/pr84128.c +@@ -0,0 +1,30 @@ ++/* { dg-do run } */ ++/* { dg-options "-O2 -march=i686 -mtune=generic -fstack-clash-protection" } */ ++/* { dg-require-effective-target ia32 } */ ++ ++__attribute__ ((noinline, noclone, weak, regparm (3))) ++int ++f1 (long arg0, int (*pf) (long, void *)) ++{ ++ unsigned char buf[32768]; ++ return pf (arg0, buf); ++} ++ ++__attribute__ ((noinline, noclone, weak)) ++int ++f2 (long arg0, void *ignored) ++{ ++ if (arg0 != 17) ++ __builtin_abort (); ++ return 19; ++} ++ ++int ++main (void) ++{ ++ if (f1 (17, f2) != 19) ++ __builtin_abort (); ++ return 0; ++} ++ ++ diff --git a/SOURCES/gcc7-pr84524.patch b/SOURCES/gcc7-pr84524.patch new file mode 100644 index 0000000..77b4215 --- /dev/null +++ b/SOURCES/gcc7-pr84524.patch @@ -0,0 +1,96 @@ +2018-02-23 Jakub Jelinek + + PR target/84524 + * config/i386/sse.md (*3): Replace with + orig,vex. + (*3): Likewise. Remove uses. + + * gcc.c-torture/execute/pr84524.c: New test. + * gcc.target/i386/avx512bw-pr84524.c: New test. + +--- gcc/config/i386/sse.md.jj 2018-02-13 09:31:24.769607162 +0100 ++++ gcc/config/i386/sse.md 2018-02-23 11:51:00.271477979 +0100 +@@ -9938,11 +9938,11 @@ (define_insn "*3" + && ix86_binary_operator_ok (, mode, operands)" + "@ + p\t{%2, %0|%0, %2} +- vp\t{%2, %1, %0|%0, %1, %2}" ++ vp\t{%2, %1, %0|%0, %1, %2}" + [(set_attr "isa" "noavx,avx") + (set_attr "type" "sseiadd") + (set_attr "prefix_data16" "1,*") +- (set_attr "prefix" "") ++ (set_attr "prefix" "orig,vex") + (set_attr "mode" "")]) + + (define_insn "*3_mask" +@@ -11822,7 +11822,7 @@ (define_insn "*3" + (eq_attr "mode" "TI")) + (const_string "1") + (const_string "*"))) +- (set_attr "prefix" "") ++ (set_attr "prefix" "orig,vex") + (set (attr "mode") + (cond [(and (match_test " == 16") + (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL")) +--- gcc/testsuite/gcc.c-torture/execute/pr84524.c.jj 2018-02-23 11:54:51.913492631 +0100 ++++ gcc/testsuite/gcc.c-torture/execute/pr84524.c 2018-02-23 11:59:55.467511836 +0100 +@@ -0,0 +1,41 @@ ++/* PR target/84524 */ ++ ++__attribute__((noipa)) void ++foo (unsigned short *x) ++{ ++ unsigned short i, v; ++ unsigned char j; ++ for (i = 0; i < 256; i++) ++ { ++ v = i << 8; ++ for (j = 0; j < 8; j++) ++ if (v & 0x8000) ++ v = (v << 1) ^ 0x1021; ++ else ++ v = v << 1; ++ x[i] = v; ++ } ++} ++ ++int ++main () ++{ ++ unsigned short a[256]; ++ ++ foo (a); ++ for (int i = 0; i < 256; i++) ++ { ++ unsigned short v = i << 8; ++ for (int j = 0; j < 8; j++) ++ { ++ asm volatile ("" : "+r" (v)); ++ if (v & 0x8000) ++ v = (v << 1) ^ 0x1021; ++ else ++ v = v << 1; ++ } ++ if (a[i] != v) ++ __builtin_abort (); ++ } ++ return 0; ++} +--- gcc/testsuite/gcc.target/i386/avx512bw-pr84524.c.jj 2018-02-23 11:58:16.919505601 +0100 ++++ gcc/testsuite/gcc.target/i386/avx512bw-pr84524.c 2018-02-23 11:58:57.377508169 +0100 +@@ -0,0 +1,14 @@ ++/* PR target/84524 */ ++/* { dg-do run { target avx512bw } } */ ++/* { dg-options "-O3 -mavx512bw" } */ ++ ++#include "avx512bw-check.h" ++ ++#define main() do_main() ++#include "../../gcc.c-torture/execute/pr84524.c" ++ ++static void ++avx512bw_test (void) ++{ ++ do_main (); ++} diff --git a/SOURCES/gcc7-rh1118870.patch b/SOURCES/gcc7-rh1118870.patch new file mode 100644 index 0000000..9865e72 --- /dev/null +++ b/SOURCES/gcc7-rh1118870.patch @@ -0,0 +1,20 @@ +2014-07-23 Jonathan Wakely + + * testsuite/30_threads/condition_variable_any/rh1118870.cc: New test. + +--- libstdc++-v3/testsuite/30_threads/condition_variable_any/rh1118870.cc ++++ libstdc++-v3/testsuite/30_threads/condition_variable_any/rh1118870.cc +@@ -0,0 +1,13 @@ ++// { dg-options " -std=gnu++11 -pthread" } ++#include ++#include ++ ++int main() ++{ ++ const size_t sz = sizeof(std::condition_variable_any); ++ char garbage[sz]; ++ memset(garbage, 0xff, sz); ++ auto cond = new ((void*)garbage) std::condition_variable_any(); ++ cond->notify_all(); ++ cond->~condition_variable_any(); ++} diff --git a/SOURCES/gcc7-rh1512529-aarch64.patch b/SOURCES/gcc7-rh1512529-aarch64.patch new file mode 100644 index 0000000..6148517 --- /dev/null +++ b/SOURCES/gcc7-rh1512529-aarch64.patch @@ -0,0 +1,2477 @@ +commit 3dfd5ffd7ce1f940e474a0e7718d968b00a2a7c8 +Author: Jeff Law +Date: Wed Nov 22 12:01:56 2017 -0700 + + aarch64 support + +--- gcc/config/aarch64/aarch64.c ++++ gcc/config/aarch64/aarch64.c +@@ -2747,7 +2747,14 @@ aarch64_output_probe_stack_range (rtx reg1, rtx reg2) + output_asm_insn ("sub\t%0, %0, %1", xops); + + /* Probe at TEST_ADDR. */ +- output_asm_insn ("str\txzr, [%0]", xops); ++ if (flag_stack_clash_protection) ++ { ++ gcc_assert (xops[0] == stack_pointer_rtx); ++ xops[1] = GEN_INT (PROBE_INTERVAL - 8); ++ output_asm_insn ("str\txzr, [%0, %1]", xops); ++ } ++ else ++ output_asm_insn ("str\txzr, [%0]", xops); + + /* Test if TEST_ADDR == LAST_ADDR. */ + xops[1] = reg2; +@@ -3511,6 +3518,127 @@ aarch64_set_handled_components (sbitmap components) + cfun->machine->reg_is_wrapped_separately[regno] = true; + } + ++/* Allocate SIZE bytes of stack space using SCRATCH_REG as a scratch ++ register. */ ++ ++static void ++aarch64_allocate_and_probe_stack_space (int scratchreg, HOST_WIDE_INT size, ++ bool frame_related_p) ++{ ++ HOST_WIDE_INT probe_interval ++ = 1 << PARAM_VALUE (PARAM_STACK_CLASH_PROTECTION_PROBE_INTERVAL); ++ HOST_WIDE_INT guard_size ++ = 1 << PARAM_VALUE (PARAM_STACK_CLASH_PROTECTION_GUARD_SIZE); ++ HOST_WIDE_INT guard_used_by_caller = 1024; ++ ++ /* SIZE should be large enough to require probing here. ie, it ++ must be larger than GUARD_SIZE - GUARD_USED_BY_CALLER. ++ ++ We can allocate GUARD_SIZE - GUARD_USED_BY_CALLER as a single chunk ++ without any probing. */ ++ gcc_assert (size >= guard_size - guard_used_by_caller); ++ aarch64_sub_sp (scratchreg, guard_size - guard_used_by_caller, ++ frame_related_p); ++ HOST_WIDE_INT orig_size = size; ++ size -= (guard_size - guard_used_by_caller); ++ ++ HOST_WIDE_INT rounded_size = size & -probe_interval; ++ HOST_WIDE_INT residual = size - rounded_size; ++ ++ /* We can handle a small number of allocations/probes inline. Otherwise ++ punt to a loop. */ ++ if (rounded_size && rounded_size <= 4 * probe_interval) ++ { ++ /* We don't use aarch64_sub_sp here because we don't want to ++ repeatedly load SCRATCHREG. */ ++ rtx scratch_rtx = gen_rtx_REG (Pmode, scratchreg); ++ if (probe_interval > ARITH_FACTOR) ++ emit_move_insn (scratch_rtx, GEN_INT (-probe_interval)); ++ else ++ scratch_rtx = GEN_INT (-probe_interval); ++ ++ for (HOST_WIDE_INT i = 0; i < rounded_size; i += probe_interval) ++ { ++ rtx_insn *insn = emit_insn (gen_add2_insn (stack_pointer_rtx, ++ scratch_rtx)); ++ add_reg_note (insn, REG_STACK_CHECK, const0_rtx); ++ ++ if (probe_interval > ARITH_FACTOR) ++ { ++ RTX_FRAME_RELATED_P (insn) = 1; ++ rtx adj = plus_constant (Pmode, stack_pointer_rtx, -probe_interval); ++ add_reg_note (insn, REG_CFA_ADJUST_CFA, ++ gen_rtx_SET (stack_pointer_rtx, adj)); ++ } ++ ++ emit_stack_probe (plus_constant (Pmode, stack_pointer_rtx, ++ (probe_interval ++ - GET_MODE_SIZE (word_mode)))); ++ emit_insn (gen_blockage ()); ++ } ++ dump_stack_clash_frame_info (PROBE_INLINE, size != rounded_size); ++ } ++ else if (rounded_size) ++ { ++ /* Compute the ending address. */ ++ rtx temp = gen_rtx_REG (word_mode, scratchreg); ++ emit_move_insn (temp, GEN_INT (-rounded_size)); ++ rtx_insn *insn ++ = emit_insn (gen_add3_insn (temp, stack_pointer_rtx, temp)); ++ ++ /* For the initial allocation, we don't have a frame pointer ++ set up, so we always need CFI notes. If we're doing the ++ final allocation, then we may have a frame pointer, in which ++ case it is the CFA, otherwise we need CFI notes. ++ ++ We can determine which allocation we are doing by looking at ++ the temporary register. IP0 is the initial allocation, IP1 ++ is the final allocation. */ ++ if (scratchreg == IP0_REGNUM || !frame_pointer_needed) ++ { ++ /* We want the CFA independent of the stack pointer for the ++ duration of the loop. */ ++ add_reg_note (insn, REG_CFA_DEF_CFA, ++ plus_constant (Pmode, temp, ++ (rounded_size + (orig_size - size)))); ++ RTX_FRAME_RELATED_P (insn) = 1; ++ } ++ ++ /* This allocates and probes the stack. ++ ++ It also probes at a 4k interval regardless of the value of ++ PARAM_STACK_CLASH_PROTECTION_PROBE_INTERVAL. */ ++ insn = emit_insn (gen_probe_stack_range (stack_pointer_rtx, ++ stack_pointer_rtx, temp)); ++ ++ /* Now reset the CFA register if needed. */ ++ if (scratchreg == IP0_REGNUM || !frame_pointer_needed) ++ { ++ add_reg_note (insn, REG_CFA_DEF_CFA, ++ plus_constant (Pmode, stack_pointer_rtx, ++ (rounded_size + (orig_size - size)))); ++ RTX_FRAME_RELATED_P (insn) = 1; ++ } ++ ++ emit_insn (gen_blockage ()); ++ dump_stack_clash_frame_info (PROBE_LOOP, size != rounded_size); ++ } ++ else ++ dump_stack_clash_frame_info (PROBE_INLINE, size != rounded_size); ++ ++ /* Handle any residuals. ++ Note that any residual must be probed. */ ++ if (residual) ++ { ++ aarch64_sub_sp (scratchreg, residual, frame_related_p); ++ add_reg_note (get_last_insn (), REG_STACK_CHECK, const0_rtx); ++ emit_stack_probe (plus_constant (Pmode, stack_pointer_rtx, ++ (residual - GET_MODE_SIZE (word_mode)))); ++ emit_insn (gen_blockage ()); ++ } ++ return; ++} ++ + /* AArch64 stack frames generated by this compiler look like: + + +-------------------------------+ +@@ -3592,7 +3720,54 @@ aarch64_expand_prologue (void) + aarch64_emit_probe_stack_range (get_stack_check_protect (), frame_size); + } + +- aarch64_sub_sp (IP0_REGNUM, initial_adjust, true); ++ /* We do not fully protect aarch64 against stack clash style attacks ++ as doing so would be prohibitively expensive with less utility over ++ time as newer compilers are deployed. ++ ++ We assume the guard is at least 64k. Furthermore, we assume that ++ the caller has not pushed the stack pointer more than 1k into ++ the guard. A caller that pushes the stack pointer than 1k into ++ the guard is considered invalid. ++ ++ Note that the caller's ability to push the stack pointer into the ++ guard is a function of the number and size of outgoing arguments and/or ++ dynamic stack allocations due to the mandatory save of the link register ++ in the caller's frame. ++ ++ With those assumptions the callee can allocate up to 63k of stack ++ space without probing. ++ ++ When probing is needed, we emit a probe at the start of the prologue ++ and every PARAM_STACK_CLASH_PROTECTION_PROBE_INTERVAL bytes thereafter. ++ ++ We have to track how much space has been allocated, but we do not ++ track stores into the stack as implicit probes except for the ++ fp/lr store. */ ++ HOST_WIDE_INT guard_size ++ = 1 << PARAM_VALUE (PARAM_STACK_CLASH_PROTECTION_GUARD_SIZE); ++ HOST_WIDE_INT guard_used_by_caller = 1024; ++ if (flag_stack_clash_protection) ++ { ++ if (frame_size == 0) ++ dump_stack_clash_frame_info (NO_PROBE_NO_FRAME, false); ++ else if (initial_adjust < guard_size - guard_used_by_caller ++ && final_adjust < guard_size - guard_used_by_caller) ++ dump_stack_clash_frame_info (NO_PROBE_SMALL_FRAME, true); ++ } ++ ++ /* In theory we should never have both an initial adjustment ++ and a callee save adjustment. Verify that is the case since the ++ code below does not handle it for -fstack-clash-protection. */ ++ gcc_assert (initial_adjust == 0 || callee_adjust == 0); ++ ++ /* Only probe if the initial adjustment is larger than the guard ++ less the amount of the guard reserved for use by the caller's ++ outgoing args. */ ++ if (flag_stack_clash_protection ++ && initial_adjust >= guard_size - guard_used_by_caller) ++ aarch64_allocate_and_probe_stack_space (IP0_REGNUM, initial_adjust, true); ++ else ++ aarch64_sub_sp (IP0_REGNUM, initial_adjust, true); + + if (callee_adjust != 0) + aarch64_push_regs (reg1, reg2, callee_adjust); +@@ -3613,7 +3788,30 @@ aarch64_expand_prologue (void) + callee_adjust != 0 || frame_pointer_needed); + aarch64_save_callee_saves (DFmode, callee_offset, V0_REGNUM, V31_REGNUM, + callee_adjust != 0 || frame_pointer_needed); +- aarch64_sub_sp (IP1_REGNUM, final_adjust, !frame_pointer_needed); ++ ++ /* We may need to probe the final adjustment as well. */ ++ if (flag_stack_clash_protection && final_adjust != 0) ++ { ++ /* First probe if the final adjustment is larger than the guard size ++ less the amount of the guard reserved for use by the caller's ++ outgoing args. */ ++ if (final_adjust >= guard_size - guard_used_by_caller) ++ aarch64_allocate_and_probe_stack_space (IP1_REGNUM, final_adjust, !frame_pointer_needed); ++ else ++ aarch64_sub_sp (IP1_REGNUM, final_adjust, !frame_pointer_needed); ++ ++ /* We must also probe if the final adjustment is larger than the guard ++ that is assumed used by the caller. This may be sub-optimal. */ ++ if (final_adjust >= guard_used_by_caller) ++ { ++ if (dump_file) ++ fprintf (dump_file, ++ "Stack clash aarch64 large outgoing arg, probing\n"); ++ emit_stack_probe (stack_pointer_rtx); ++ } ++ } ++ else ++ aarch64_sub_sp (IP1_REGNUM, final_adjust, !frame_pointer_needed); + } + + /* Return TRUE if we can use a simple_return insn. +@@ -3679,7 +3877,11 @@ aarch64_expand_epilogue (bool for_sibcall) + RTX_FRAME_RELATED_P (insn) = callee_adjust == 0; + } + else +- aarch64_add_sp (IP1_REGNUM, final_adjust, df_regs_ever_live_p (IP1_REGNUM)); ++ aarch64_add_sp (IP1_REGNUM, final_adjust, ++ /* A stack clash protection prologue may not have ++ left IP1_REGNUM in a usable state. */ ++ (flag_stack_clash_protection ++ || df_regs_ever_live_p (IP1_REGNUM))); + + aarch64_restore_callee_saves (DImode, callee_offset, R0_REGNUM, R30_REGNUM, + callee_adjust != 0, &cfi_ops); +@@ -3702,7 +3904,11 @@ aarch64_expand_epilogue (bool for_sibcall) + cfi_ops = NULL; + } + +- aarch64_add_sp (IP0_REGNUM, initial_adjust, df_regs_ever_live_p (IP0_REGNUM)); ++ /* A stack clash protection prologue may not have left IP0_REGNUM ++ in a usable state. */ ++ aarch64_add_sp (IP0_REGNUM, initial_adjust, ++ (flag_stack_clash_protection ++ || df_regs_ever_live_p (IP0_REGNUM))); + + if (cfi_ops) + { +@@ -8696,6 +8902,12 @@ aarch64_override_options_internal (struct gcc_options *opts) + opts->x_param_values, + global_options_set.x_param_values); + ++ /* We assume the guard page is 64k. */ ++ maybe_set_param_value (PARAM_STACK_CLASH_PROTECTION_GUARD_SIZE, ++ 16, ++ opts->x_param_values, ++ global_options_set.x_param_values); ++ + aarch64_override_options_after_change_1 (opts); + } + +@@ -14726,6 +14938,28 @@ aarch64_sched_can_speculate_insn (rtx_insn *insn) + } + } + ++/* It has been decided that to allow up to 1kb of outgoing argument ++ space to be allocated w/o probing. If more than 1kb of outgoing ++ argment space is allocated, then it must be probed and the last ++ probe must occur no more than 1kbyte away from the end of the ++ allocated space. ++ ++ This implies that the residual part of an alloca allocation may ++ need probing in cases where the generic code might not otherwise ++ think a probe is needed. ++ ++ This target hook returns TRUE when allocating RESIDUAL bytes of ++ alloca space requires an additional probe, otherwise FALSE is ++ returned. */ ++ ++static bool ++aarch64_stack_clash_protection_final_dynamic_probe (rtx residual) ++{ ++ return (residual == CONST0_RTX (Pmode) ++ || GET_CODE (residual) != CONST_INT ++ || INTVAL (residual) >= 1024); ++} ++ + /* Target-specific selftests. */ + + #if CHECKING_P +@@ -15154,6 +15388,10 @@ aarch64_libgcc_floating_mode_supported_p + #undef TARGET_CUSTOM_FUNCTION_DESCRIPTORS + #define TARGET_CUSTOM_FUNCTION_DESCRIPTORS 4 + ++#undef TARGET_STACK_CLASH_PROTECTION_FINAL_DYNAMIC_PROBE ++#define TARGET_STACK_CLASH_PROTECTION_FINAL_DYNAMIC_PROBE \ ++ aarch64_stack_clash_protection_final_dynamic_probe ++ + #if CHECKING_P + #undef TARGET_RUN_TARGET_SELFTESTS + #define TARGET_RUN_TARGET_SELFTESTS selftest::aarch64_run_selftests +--- gcc/config/aarch64/aarch64.md ++++ gcc/config/aarch64/aarch64.md +@@ -5413,7 +5413,7 @@ + ) + + (define_insn "probe_stack_range" +- [(set (match_operand:DI 0 "register_operand" "=r") ++ [(set (match_operand:DI 0 "register_operand" "=rk") + (unspec_volatile:DI [(match_operand:DI 1 "register_operand" "0") + (match_operand:DI 2 "register_operand" "r")] + UNSPECV_PROBE_STACK_RANGE))] +--- gcc/testsuite/gcc.dg/stack-check-16.c ++++ gcc/testsuite/gcc.dg/stack-check-16.c +@@ -0,0 +1,2017 @@ ++/* { dg-do compile } */ ++/* { dg-options "-fstack-clash-protection -w" } */ ++/* { dg-require-effective-target supports_stack_clash_protection } */ ++ ++int printf (const char *, ...); ++void blah (char *space) { } ++ ++__attribute__ ((optimize ("-O0"))) ++int do_test (void) ++{ ++ blah (alloca (10)); ++ mtrace (); ++ printf ( ++"%1$s" "%2$s" "%3$s" "%4$s" "%5$s" "%6$s" "%7$s" "%8$s" "%9$s" "%10$s" ++"%11$s" "%12$s" "%13$s" "%14$s" "%15$s" "%16$s" "%17$s" "%18$s" "%19$s" "%20$s" ++"%21$s" "%22$s" "%23$s" "%24$s" "%25$s" "%26$s" "%27$s" "%28$s" "%29$s" "%30$s" ++"%31$s" "%32$s" "%33$s" "%34$s" "%35$s" "%36$s" "%37$s" "%38$s" "%39$s" "%40$s" ++"%41$s" "%42$s" "%43$s" "%44$s" "%45$s" "%46$s" "%47$s" "%48$s" "%49$s" "%50$s" ++"%51$s" "%52$s" "%53$s" "%54$s" "%55$s" "%56$s" "%57$s" "%58$s" "%59$s" "%60$s" ++"%61$s" "%62$s" "%63$s" "%64$s" "%65$s" "%66$s" "%67$s" "%68$s" "%69$s" "%70$s" ++"%71$s" "%72$s" "%73$s" "%74$s" "%75$s" "%76$s" "%77$s" "%78$s" "%79$s" "%80$s" ++"%81$s" "%82$s" "%83$s" "%84$s" "%85$s" "%86$s" "%87$s" "%88$s" "%89$s" "%90$s" ++"%91$s" "%92$s" "%93$s" "%94$s" "%95$s" "%96$s" "%97$s" "%98$s" "%99$s" "%100$s" ++"%101$s" "%102$s" "%103$s" "%104$s" "%105$s" "%106$s" "%107$s" "%108$s" "%109$s" "%110$s" ++"%111$s" "%112$s" "%113$s" "%114$s" "%115$s" "%116$s" "%117$s" "%118$s" "%119$s" "%120$s" ++"%121$s" "%122$s" "%123$s" "%124$s" "%125$s" "%126$s" "%127$s" "%128$s" "%129$s" "%130$s" ++"%131$s" "%132$s" "%133$s" "%134$s" "%135$s" "%136$s" "%137$s" "%138$s" "%139$s" "%140$s" ++"%141$s" "%142$s" "%143$s" "%144$s" "%145$s" "%146$s" "%147$s" "%148$s" "%149$s" "%150$s" ++"%151$s" "%152$s" "%153$s" "%154$s" "%155$s" "%156$s" "%157$s" "%158$s" "%159$s" "%160$s" ++"%161$s" "%162$s" "%163$s" "%164$s" "%165$s" "%166$s" "%167$s" "%168$s" "%169$s" "%170$s" ++"%171$s" "%172$s" "%173$s" "%174$s" "%175$s" "%176$s" "%177$s" "%178$s" "%179$s" "%180$s" ++"%181$s" "%182$s" "%183$s" "%184$s" "%185$s" "%186$s" "%187$s" "%188$s" "%189$s" "%190$s" ++"%191$s" "%192$s" "%193$s" "%194$s" "%195$s" "%196$s" "%197$s" "%198$s" "%199$s" "%200$s" ++"%201$s" "%202$s" "%203$s" "%204$s" "%205$s" "%206$s" "%207$s" "%208$s" "%209$s" "%210$s" ++"%211$s" "%212$s" "%213$s" "%214$s" "%215$s" "%216$s" "%217$s" "%218$s" "%219$s" "%220$s" ++"%221$s" "%222$s" "%223$s" "%224$s" "%225$s" "%226$s" "%227$s" "%228$s" "%229$s" "%230$s" ++"%231$s" "%232$s" "%233$s" "%234$s" "%235$s" "%236$s" "%237$s" "%238$s" "%239$s" "%240$s" ++"%241$s" "%242$s" "%243$s" "%244$s" "%245$s" "%246$s" "%247$s" "%248$s" "%249$s" "%250$s" ++"%251$s" "%252$s" "%253$s" "%254$s" "%255$s" "%256$s" "%257$s" "%258$s" "%259$s" "%260$s" ++"%261$s" "%262$s" "%263$s" "%264$s" "%265$s" "%266$s" "%267$s" "%268$s" "%269$s" "%270$s" ++"%271$s" "%272$s" "%273$s" "%274$s" "%275$s" "%276$s" "%277$s" "%278$s" "%279$s" "%280$s" ++"%281$s" "%282$s" "%283$s" "%284$s" "%285$s" "%286$s" "%287$s" "%288$s" "%289$s" "%290$s" ++"%291$s" "%292$s" "%293$s" "%294$s" "%295$s" "%296$s" "%297$s" "%298$s" "%299$s" "%300$s" ++"%301$s" "%302$s" "%303$s" "%304$s" "%305$s" "%306$s" "%307$s" "%308$s" "%309$s" "%310$s" ++"%311$s" "%312$s" "%313$s" "%314$s" "%315$s" "%316$s" "%317$s" "%318$s" "%319$s" "%320$s" ++"%321$s" "%322$s" "%323$s" "%324$s" "%325$s" "%326$s" "%327$s" "%328$s" "%329$s" "%330$s" ++"%331$s" "%332$s" "%333$s" "%334$s" "%335$s" "%336$s" "%337$s" "%338$s" "%339$s" "%340$s" ++"%341$s" "%342$s" "%343$s" "%344$s" "%345$s" "%346$s" "%347$s" "%348$s" "%349$s" "%350$s" ++"%351$s" "%352$s" "%353$s" "%354$s" "%355$s" "%356$s" "%357$s" "%358$s" "%359$s" "%360$s" ++"%361$s" "%362$s" "%363$s" "%364$s" "%365$s" "%366$s" "%367$s" "%368$s" "%369$s" "%370$s" ++"%371$s" "%372$s" "%373$s" "%374$s" "%375$s" "%376$s" "%377$s" "%378$s" "%379$s" "%380$s" ++"%381$s" "%382$s" "%383$s" "%384$s" "%385$s" "%386$s" "%387$s" "%388$s" "%389$s" "%390$s" ++"%391$s" "%392$s" "%393$s" "%394$s" "%395$s" "%396$s" "%397$s" "%398$s" "%399$s" "%400$s" ++"%401$s" "%402$s" "%403$s" "%404$s" "%405$s" "%406$s" "%407$s" "%408$s" "%409$s" "%410$s" ++"%411$s" "%412$s" "%413$s" "%414$s" "%415$s" "%416$s" "%417$s" "%418$s" "%419$s" "%420$s" ++"%421$s" "%422$s" "%423$s" "%424$s" "%425$s" "%426$s" "%427$s" "%428$s" "%429$s" "%430$s" ++"%431$s" "%432$s" "%433$s" "%434$s" "%435$s" "%436$s" "%437$s" "%438$s" "%439$s" "%440$s" ++"%441$s" "%442$s" "%443$s" "%444$s" "%445$s" "%446$s" "%447$s" "%448$s" "%449$s" "%450$s" ++"%451$s" "%452$s" "%453$s" "%454$s" "%455$s" "%456$s" "%457$s" "%458$s" "%459$s" "%460$s" ++"%461$s" "%462$s" "%463$s" "%464$s" "%465$s" "%466$s" "%467$s" "%468$s" "%469$s" "%470$s" ++"%471$s" "%472$s" "%473$s" "%474$s" "%475$s" "%476$s" "%477$s" "%478$s" "%479$s" "%480$s" ++"%481$s" "%482$s" "%483$s" "%484$s" "%485$s" "%486$s" "%487$s" "%488$s" "%489$s" "%490$s" ++"%491$s" "%492$s" "%493$s" "%494$s" "%495$s" "%496$s" "%497$s" "%498$s" "%499$s" "%500$s" ++"%501$s" "%502$s" "%503$s" "%504$s" "%505$s" "%506$s" "%507$s" "%508$s" "%509$s" "%510$s" ++"%511$s" "%512$s" "%513$s" "%514$s" "%515$s" "%516$s" "%517$s" "%518$s" "%519$s" "%520$s" ++"%521$s" "%522$s" "%523$s" "%524$s" "%525$s" "%526$s" "%527$s" "%528$s" "%529$s" "%530$s" ++"%531$s" "%532$s" "%533$s" "%534$s" "%535$s" "%536$s" "%537$s" "%538$s" "%539$s" "%540$s" ++"%541$s" "%542$s" "%543$s" "%544$s" "%545$s" "%546$s" "%547$s" "%548$s" "%549$s" "%550$s" ++"%551$s" "%552$s" "%553$s" "%554$s" "%555$s" "%556$s" "%557$s" "%558$s" "%559$s" "%560$s" ++"%561$s" "%562$s" "%563$s" "%564$s" "%565$s" "%566$s" "%567$s" "%568$s" "%569$s" "%570$s" ++"%571$s" "%572$s" "%573$s" "%574$s" "%575$s" "%576$s" "%577$s" "%578$s" "%579$s" "%580$s" ++"%581$s" "%582$s" "%583$s" "%584$s" "%585$s" "%586$s" "%587$s" "%588$s" "%589$s" "%590$s" ++"%591$s" "%592$s" "%593$s" "%594$s" "%595$s" "%596$s" "%597$s" "%598$s" "%599$s" "%600$s" ++"%601$s" "%602$s" "%603$s" "%604$s" "%605$s" "%606$s" "%607$s" "%608$s" "%609$s" "%610$s" ++"%611$s" "%612$s" "%613$s" "%614$s" "%615$s" "%616$s" "%617$s" "%618$s" "%619$s" "%620$s" ++"%621$s" "%622$s" "%623$s" "%624$s" "%625$s" "%626$s" "%627$s" "%628$s" "%629$s" "%630$s" ++"%631$s" "%632$s" "%633$s" "%634$s" "%635$s" "%636$s" "%637$s" "%638$s" "%639$s" "%640$s" ++"%641$s" "%642$s" "%643$s" "%644$s" "%645$s" "%646$s" "%647$s" "%648$s" "%649$s" "%650$s" ++"%651$s" "%652$s" "%653$s" "%654$s" "%655$s" "%656$s" "%657$s" "%658$s" "%659$s" "%660$s" ++"%661$s" "%662$s" "%663$s" "%664$s" "%665$s" "%666$s" "%667$s" "%668$s" "%669$s" "%670$s" ++"%671$s" "%672$s" "%673$s" "%674$s" "%675$s" "%676$s" "%677$s" "%678$s" "%679$s" "%680$s" ++"%681$s" "%682$s" "%683$s" "%684$s" "%685$s" "%686$s" "%687$s" "%688$s" "%689$s" "%690$s" ++"%691$s" "%692$s" "%693$s" "%694$s" "%695$s" "%696$s" "%697$s" "%698$s" "%699$s" "%700$s" ++"%701$s" "%702$s" "%703$s" "%704$s" "%705$s" "%706$s" "%707$s" "%708$s" "%709$s" "%710$s" ++"%711$s" "%712$s" "%713$s" "%714$s" "%715$s" "%716$s" "%717$s" "%718$s" "%719$s" "%720$s" ++"%721$s" "%722$s" "%723$s" "%724$s" "%725$s" "%726$s" "%727$s" "%728$s" "%729$s" "%730$s" ++"%731$s" "%732$s" "%733$s" "%734$s" "%735$s" "%736$s" "%737$s" "%738$s" "%739$s" "%740$s" ++"%741$s" "%742$s" "%743$s" "%744$s" "%745$s" "%746$s" "%747$s" "%748$s" "%749$s" "%750$s" ++"%751$s" "%752$s" "%753$s" "%754$s" "%755$s" "%756$s" "%757$s" "%758$s" "%759$s" "%760$s" ++"%761$s" "%762$s" "%763$s" "%764$s" "%765$s" "%766$s" "%767$s" "%768$s" "%769$s" "%770$s" ++"%771$s" "%772$s" "%773$s" "%774$s" "%775$s" "%776$s" "%777$s" "%778$s" "%779$s" "%780$s" ++"%781$s" "%782$s" "%783$s" "%784$s" "%785$s" "%786$s" "%787$s" "%788$s" "%789$s" "%790$s" ++"%791$s" "%792$s" "%793$s" "%794$s" "%795$s" "%796$s" "%797$s" "%798$s" "%799$s" "%800$s" ++"%801$s" "%802$s" "%803$s" "%804$s" "%805$s" "%806$s" "%807$s" "%808$s" "%809$s" "%810$s" ++"%811$s" "%812$s" "%813$s" "%814$s" "%815$s" "%816$s" "%817$s" "%818$s" "%819$s" "%820$s" ++"%821$s" "%822$s" "%823$s" "%824$s" "%825$s" "%826$s" "%827$s" "%828$s" "%829$s" "%830$s" ++"%831$s" "%832$s" "%833$s" "%834$s" "%835$s" "%836$s" "%837$s" "%838$s" "%839$s" "%840$s" ++"%841$s" "%842$s" "%843$s" "%844$s" "%845$s" "%846$s" "%847$s" "%848$s" "%849$s" "%850$s" ++"%851$s" "%852$s" "%853$s" "%854$s" "%855$s" "%856$s" "%857$s" "%858$s" "%859$s" "%860$s" ++"%861$s" "%862$s" "%863$s" "%864$s" "%865$s" "%866$s" "%867$s" "%868$s" "%869$s" "%870$s" ++"%871$s" "%872$s" "%873$s" "%874$s" "%875$s" "%876$s" "%877$s" "%878$s" "%879$s" "%880$s" ++"%881$s" "%882$s" "%883$s" "%884$s" "%885$s" "%886$s" "%887$s" "%888$s" "%889$s" "%890$s" ++"%891$s" "%892$s" "%893$s" "%894$s" "%895$s" "%896$s" "%897$s" "%898$s" "%899$s" "%900$s" ++"%901$s" "%902$s" "%903$s" "%904$s" "%905$s" "%906$s" "%907$s" "%908$s" "%909$s" "%910$s" ++"%911$s" "%912$s" "%913$s" "%914$s" "%915$s" "%916$s" "%917$s" "%918$s" "%919$s" "%920$s" ++"%921$s" "%922$s" "%923$s" "%924$s" "%925$s" "%926$s" "%927$s" "%928$s" "%929$s" "%930$s" ++"%931$s" "%932$s" "%933$s" "%934$s" "%935$s" "%936$s" "%937$s" "%938$s" "%939$s" "%940$s" ++"%941$s" "%942$s" "%943$s" "%944$s" "%945$s" "%946$s" "%947$s" "%948$s" "%949$s" "%950$s" ++"%951$s" "%952$s" "%953$s" "%954$s" "%955$s" "%956$s" "%957$s" "%958$s" "%959$s" "%960$s" ++"%961$s" "%962$s" "%963$s" "%964$s" "%965$s" "%966$s" "%967$s" "%968$s" "%969$s" "%970$s" ++"%971$s" "%972$s" "%973$s" "%974$s" "%975$s" "%976$s" "%977$s" "%978$s" "%979$s" "%980$s" ++"%981$s" "%982$s" "%983$s" "%984$s" "%985$s" "%986$s" "%987$s" "%988$s" "%989$s" "%990$s" ++"%991$s" "%992$s" "%993$s" "%994$s" "%995$s" "%996$s" "%997$s" "%998$s" "%999$s" "%1000$s" ++"%1001$s" "%1002$s" "%1003$s" "%1004$s" "%1005$s" "%1006$s" "%1007$s" "%1008$s" "%1009$s" "%1010$s" ++"%1011$s" "%1012$s" "%1013$s" "%1014$s" "%1015$s" "%1016$s" "%1017$s" "%1018$s" "%1019$s" "%1020$s" ++"%1021$s" "%1022$s" "%1023$s" "%1024$s" "%1025$s" "%1026$s" "%1027$s" "%1028$s" "%1029$s" "%1030$s" ++"%1031$s" "%1032$s" "%1033$s" "%1034$s" "%1035$s" "%1036$s" "%1037$s" "%1038$s" "%1039$s" "%1040$s" ++"%1041$s" "%1042$s" "%1043$s" "%1044$s" "%1045$s" "%1046$s" "%1047$s" "%1048$s" "%1049$s" "%1050$s" ++"%1051$s" "%1052$s" "%1053$s" "%1054$s" "%1055$s" "%1056$s" "%1057$s" "%1058$s" "%1059$s" "%1060$s" ++"%1061$s" "%1062$s" "%1063$s" "%1064$s" "%1065$s" "%1066$s" "%1067$s" "%1068$s" "%1069$s" "%1070$s" ++"%1071$s" "%1072$s" "%1073$s" "%1074$s" "%1075$s" "%1076$s" "%1077$s" "%1078$s" "%1079$s" "%1080$s" ++"%1081$s" "%1082$s" "%1083$s" "%1084$s" "%1085$s" "%1086$s" "%1087$s" "%1088$s" "%1089$s" "%1090$s" ++"%1091$s" "%1092$s" "%1093$s" "%1094$s" "%1095$s" "%1096$s" "%1097$s" "%1098$s" "%1099$s" "%1100$s" ++"%1101$s" "%1102$s" "%1103$s" "%1104$s" "%1105$s" "%1106$s" "%1107$s" "%1108$s" "%1109$s" "%1110$s" ++"%1111$s" "%1112$s" "%1113$s" "%1114$s" "%1115$s" "%1116$s" "%1117$s" "%1118$s" "%1119$s" "%1120$s" ++"%1121$s" "%1122$s" "%1123$s" "%1124$s" "%1125$s" "%1126$s" "%1127$s" "%1128$s" "%1129$s" "%1130$s" ++"%1131$s" "%1132$s" "%1133$s" "%1134$s" "%1135$s" "%1136$s" "%1137$s" "%1138$s" "%1139$s" "%1140$s" ++"%1141$s" "%1142$s" "%1143$s" "%1144$s" "%1145$s" "%1146$s" "%1147$s" "%1148$s" "%1149$s" "%1150$s" ++"%1151$s" "%1152$s" "%1153$s" "%1154$s" "%1155$s" "%1156$s" "%1157$s" "%1158$s" "%1159$s" "%1160$s" ++"%1161$s" "%1162$s" "%1163$s" "%1164$s" "%1165$s" "%1166$s" "%1167$s" "%1168$s" "%1169$s" "%1170$s" ++"%1171$s" "%1172$s" "%1173$s" "%1174$s" "%1175$s" "%1176$s" "%1177$s" "%1178$s" "%1179$s" "%1180$s" ++"%1181$s" "%1182$s" "%1183$s" "%1184$s" "%1185$s" "%1186$s" "%1187$s" "%1188$s" "%1189$s" "%1190$s" ++"%1191$s" "%1192$s" "%1193$s" "%1194$s" "%1195$s" "%1196$s" "%1197$s" "%1198$s" "%1199$s" "%1200$s" ++"%1201$s" "%1202$s" "%1203$s" "%1204$s" "%1205$s" "%1206$s" "%1207$s" "%1208$s" "%1209$s" "%1210$s" ++"%1211$s" "%1212$s" "%1213$s" "%1214$s" "%1215$s" "%1216$s" "%1217$s" "%1218$s" "%1219$s" "%1220$s" ++"%1221$s" "%1222$s" "%1223$s" "%1224$s" "%1225$s" "%1226$s" "%1227$s" "%1228$s" "%1229$s" "%1230$s" ++"%1231$s" "%1232$s" "%1233$s" "%1234$s" "%1235$s" "%1236$s" "%1237$s" "%1238$s" "%1239$s" "%1240$s" ++"%1241$s" "%1242$s" "%1243$s" "%1244$s" "%1245$s" "%1246$s" "%1247$s" "%1248$s" "%1249$s" "%1250$s" ++"%1251$s" "%1252$s" "%1253$s" "%1254$s" "%1255$s" "%1256$s" "%1257$s" "%1258$s" "%1259$s" "%1260$s" ++"%1261$s" "%1262$s" "%1263$s" "%1264$s" "%1265$s" "%1266$s" "%1267$s" "%1268$s" "%1269$s" "%1270$s" ++"%1271$s" "%1272$s" "%1273$s" "%1274$s" "%1275$s" "%1276$s" "%1277$s" "%1278$s" "%1279$s" "%1280$s" ++"%1281$s" "%1282$s" "%1283$s" "%1284$s" "%1285$s" "%1286$s" "%1287$s" "%1288$s" "%1289$s" "%1290$s" ++"%1291$s" "%1292$s" "%1293$s" "%1294$s" "%1295$s" "%1296$s" "%1297$s" "%1298$s" "%1299$s" "%1300$s" ++"%1301$s" "%1302$s" "%1303$s" "%1304$s" "%1305$s" "%1306$s" "%1307$s" "%1308$s" "%1309$s" "%1310$s" ++"%1311$s" "%1312$s" "%1313$s" "%1314$s" "%1315$s" "%1316$s" "%1317$s" "%1318$s" "%1319$s" "%1320$s" ++"%1321$s" "%1322$s" "%1323$s" "%1324$s" "%1325$s" "%1326$s" "%1327$s" "%1328$s" "%1329$s" "%1330$s" ++"%1331$s" "%1332$s" "%1333$s" "%1334$s" "%1335$s" "%1336$s" "%1337$s" "%1338$s" "%1339$s" "%1340$s" ++"%1341$s" "%1342$s" "%1343$s" "%1344$s" "%1345$s" "%1346$s" "%1347$s" "%1348$s" "%1349$s" "%1350$s" ++"%1351$s" "%1352$s" "%1353$s" "%1354$s" "%1355$s" "%1356$s" "%1357$s" "%1358$s" "%1359$s" "%1360$s" ++"%1361$s" "%1362$s" "%1363$s" "%1364$s" "%1365$s" "%1366$s" "%1367$s" "%1368$s" "%1369$s" "%1370$s" ++"%1371$s" "%1372$s" "%1373$s" "%1374$s" "%1375$s" "%1376$s" "%1377$s" "%1378$s" "%1379$s" "%1380$s" ++"%1381$s" "%1382$s" "%1383$s" "%1384$s" "%1385$s" "%1386$s" "%1387$s" "%1388$s" "%1389$s" "%1390$s" ++"%1391$s" "%1392$s" "%1393$s" "%1394$s" "%1395$s" "%1396$s" "%1397$s" "%1398$s" "%1399$s" "%1400$s" ++"%1401$s" "%1402$s" "%1403$s" "%1404$s" "%1405$s" "%1406$s" "%1407$s" "%1408$s" "%1409$s" "%1410$s" ++"%1411$s" "%1412$s" "%1413$s" "%1414$s" "%1415$s" "%1416$s" "%1417$s" "%1418$s" "%1419$s" "%1420$s" ++"%1421$s" "%1422$s" "%1423$s" "%1424$s" "%1425$s" "%1426$s" "%1427$s" "%1428$s" "%1429$s" "%1430$s" ++"%1431$s" "%1432$s" "%1433$s" "%1434$s" "%1435$s" "%1436$s" "%1437$s" "%1438$s" "%1439$s" "%1440$s" ++"%1441$s" "%1442$s" "%1443$s" "%1444$s" "%1445$s" "%1446$s" "%1447$s" "%1448$s" "%1449$s" "%1450$s" ++"%1451$s" "%1452$s" "%1453$s" "%1454$s" "%1455$s" "%1456$s" "%1457$s" "%1458$s" "%1459$s" "%1460$s" ++"%1461$s" "%1462$s" "%1463$s" "%1464$s" "%1465$s" "%1466$s" "%1467$s" "%1468$s" "%1469$s" "%1470$s" ++"%1471$s" "%1472$s" "%1473$s" "%1474$s" "%1475$s" "%1476$s" "%1477$s" "%1478$s" "%1479$s" "%1480$s" ++"%1481$s" "%1482$s" "%1483$s" "%1484$s" "%1485$s" "%1486$s" "%1487$s" "%1488$s" "%1489$s" "%1490$s" ++"%1491$s" "%1492$s" "%1493$s" "%1494$s" "%1495$s" "%1496$s" "%1497$s" "%1498$s" "%1499$s" "%1500$s" ++"%1501$s" "%1502$s" "%1503$s" "%1504$s" "%1505$s" "%1506$s" "%1507$s" "%1508$s" "%1509$s" "%1510$s" ++"%1511$s" "%1512$s" "%1513$s" "%1514$s" "%1515$s" "%1516$s" "%1517$s" "%1518$s" "%1519$s" "%1520$s" ++"%1521$s" "%1522$s" "%1523$s" "%1524$s" "%1525$s" "%1526$s" "%1527$s" "%1528$s" "%1529$s" "%1530$s" ++"%1531$s" "%1532$s" "%1533$s" "%1534$s" "%1535$s" "%1536$s" "%1537$s" "%1538$s" "%1539$s" "%1540$s" ++"%1541$s" "%1542$s" "%1543$s" "%1544$s" "%1545$s" "%1546$s" "%1547$s" "%1548$s" "%1549$s" "%1550$s" ++"%1551$s" "%1552$s" "%1553$s" "%1554$s" "%1555$s" "%1556$s" "%1557$s" "%1558$s" "%1559$s" "%1560$s" ++"%1561$s" "%1562$s" "%1563$s" "%1564$s" "%1565$s" "%1566$s" "%1567$s" "%1568$s" "%1569$s" "%1570$s" ++"%1571$s" "%1572$s" "%1573$s" "%1574$s" "%1575$s" "%1576$s" "%1577$s" "%1578$s" "%1579$s" "%1580$s" ++"%1581$s" "%1582$s" "%1583$s" "%1584$s" "%1585$s" "%1586$s" "%1587$s" "%1588$s" "%1589$s" "%1590$s" ++"%1591$s" "%1592$s" "%1593$s" "%1594$s" "%1595$s" "%1596$s" "%1597$s" "%1598$s" "%1599$s" "%1600$s" ++"%1601$s" "%1602$s" "%1603$s" "%1604$s" "%1605$s" "%1606$s" "%1607$s" "%1608$s" "%1609$s" "%1610$s" ++"%1611$s" "%1612$s" "%1613$s" "%1614$s" "%1615$s" "%1616$s" "%1617$s" "%1618$s" "%1619$s" "%1620$s" ++"%1621$s" "%1622$s" "%1623$s" "%1624$s" "%1625$s" "%1626$s" "%1627$s" "%1628$s" "%1629$s" "%1630$s" ++"%1631$s" "%1632$s" "%1633$s" "%1634$s" "%1635$s" "%1636$s" "%1637$s" "%1638$s" "%1639$s" "%1640$s" ++"%1641$s" "%1642$s" "%1643$s" "%1644$s" "%1645$s" "%1646$s" "%1647$s" "%1648$s" "%1649$s" "%1650$s" ++"%1651$s" "%1652$s" "%1653$s" "%1654$s" "%1655$s" "%1656$s" "%1657$s" "%1658$s" "%1659$s" "%1660$s" ++"%1661$s" "%1662$s" "%1663$s" "%1664$s" "%1665$s" "%1666$s" "%1667$s" "%1668$s" "%1669$s" "%1670$s" ++"%1671$s" "%1672$s" "%1673$s" "%1674$s" "%1675$s" "%1676$s" "%1677$s" "%1678$s" "%1679$s" "%1680$s" ++"%1681$s" "%1682$s" "%1683$s" "%1684$s" "%1685$s" "%1686$s" "%1687$s" "%1688$s" "%1689$s" "%1690$s" ++"%1691$s" "%1692$s" "%1693$s" "%1694$s" "%1695$s" "%1696$s" "%1697$s" "%1698$s" "%1699$s" "%1700$s" ++"%1701$s" "%1702$s" "%1703$s" "%1704$s" "%1705$s" "%1706$s" "%1707$s" "%1708$s" "%1709$s" "%1710$s" ++"%1711$s" "%1712$s" "%1713$s" "%1714$s" "%1715$s" "%1716$s" "%1717$s" "%1718$s" "%1719$s" "%1720$s" ++"%1721$s" "%1722$s" "%1723$s" "%1724$s" "%1725$s" "%1726$s" "%1727$s" "%1728$s" "%1729$s" "%1730$s" ++"%1731$s" "%1732$s" "%1733$s" "%1734$s" "%1735$s" "%1736$s" "%1737$s" "%1738$s" "%1739$s" "%1740$s" ++"%1741$s" "%1742$s" "%1743$s" "%1744$s" "%1745$s" "%1746$s" "%1747$s" "%1748$s" "%1749$s" "%1750$s" ++"%1751$s" "%1752$s" "%1753$s" "%1754$s" "%1755$s" "%1756$s" "%1757$s" "%1758$s" "%1759$s" "%1760$s" ++"%1761$s" "%1762$s" "%1763$s" "%1764$s" "%1765$s" "%1766$s" "%1767$s" "%1768$s" "%1769$s" "%1770$s" ++"%1771$s" "%1772$s" "%1773$s" "%1774$s" "%1775$s" "%1776$s" "%1777$s" "%1778$s" "%1779$s" "%1780$s" ++"%1781$s" "%1782$s" "%1783$s" "%1784$s" "%1785$s" "%1786$s" "%1787$s" "%1788$s" "%1789$s" "%1790$s" ++"%1791$s" "%1792$s" "%1793$s" "%1794$s" "%1795$s" "%1796$s" "%1797$s" "%1798$s" "%1799$s" "%1800$s" ++"%1801$s" "%1802$s" "%1803$s" "%1804$s" "%1805$s" "%1806$s" "%1807$s" "%1808$s" "%1809$s" "%1810$s" ++"%1811$s" "%1812$s" "%1813$s" "%1814$s" "%1815$s" "%1816$s" "%1817$s" "%1818$s" "%1819$s" "%1820$s" ++"%1821$s" "%1822$s" "%1823$s" "%1824$s" "%1825$s" "%1826$s" "%1827$s" "%1828$s" "%1829$s" "%1830$s" ++"%1831$s" "%1832$s" "%1833$s" "%1834$s" "%1835$s" "%1836$s" "%1837$s" "%1838$s" "%1839$s" "%1840$s" ++"%1841$s" "%1842$s" "%1843$s" "%1844$s" "%1845$s" "%1846$s" "%1847$s" "%1848$s" "%1849$s" "%1850$s" ++"%1851$s" "%1852$s" "%1853$s" "%1854$s" "%1855$s" "%1856$s" "%1857$s" "%1858$s" "%1859$s" "%1860$s" ++"%1861$s" "%1862$s" "%1863$s" "%1864$s" "%1865$s" "%1866$s" "%1867$s" "%1868$s" "%1869$s" "%1870$s" ++"%1871$s" "%1872$s" "%1873$s" "%1874$s" "%1875$s" "%1876$s" "%1877$s" "%1878$s" "%1879$s" "%1880$s" ++"%1881$s" "%1882$s" "%1883$s" "%1884$s" "%1885$s" "%1886$s" "%1887$s" "%1888$s" "%1889$s" "%1890$s" ++"%1891$s" "%1892$s" "%1893$s" "%1894$s" "%1895$s" "%1896$s" "%1897$s" "%1898$s" "%1899$s" "%1900$s" ++"%1901$s" "%1902$s" "%1903$s" "%1904$s" "%1905$s" "%1906$s" "%1907$s" "%1908$s" "%1909$s" "%1910$s" ++"%1911$s" "%1912$s" "%1913$s" "%1914$s" "%1915$s" "%1916$s" "%1917$s" "%1918$s" "%1919$s" "%1920$s" ++"%1921$s" "%1922$s" "%1923$s" "%1924$s" "%1925$s" "%1926$s" "%1927$s" "%1928$s" "%1929$s" "%1930$s" ++"%1931$s" "%1932$s" "%1933$s" "%1934$s" "%1935$s" "%1936$s" "%1937$s" "%1938$s" "%1939$s" "%1940$s" ++"%1941$s" "%1942$s" "%1943$s" "%1944$s" "%1945$s" "%1946$s" "%1947$s" "%1948$s" "%1949$s" "%1950$s" ++"%1951$s" "%1952$s" "%1953$s" "%1954$s" "%1955$s" "%1956$s" "%1957$s" "%1958$s" "%1959$s" "%1960$s" ++"%1961$s" "%1962$s" "%1963$s" "%1964$s" "%1965$s" "%1966$s" "%1967$s" "%1968$s" "%1969$s" "%1970$s" ++"%1971$s" "%1972$s" "%1973$s" "%1974$s" "%1975$s" "%1976$s" "%1977$s" "%1978$s" "%1979$s" "%1980$s" ++"%1981$s" "%1982$s" "%1983$s" "%1984$s" "%1985$s" "%1986$s" "%1987$s" "%1988$s" "%1989$s" "%1990$s" ++"%1991$s" "%1992$s" "%1993$s" "%1994$s" "%1995$s" "%1996$s" "%1997$s" "%1998$s" "%1999$s" "%2000$s" ++"%2001$s" "%2002$s" "%2003$s" "%2004$s" "%2005$s" "%2006$s" "%2007$s" "%2008$s" "%2009$s" "%2010$s" ++"%2011$s" "%2012$s" "%2013$s" "%2014$s" "%2015$s" "%2016$s" "%2017$s" "%2018$s" "%2019$s" "%2020$s" ++"%2021$s" "%2022$s" "%2023$s" "%2024$s" "%2025$s" "%2026$s" "%2027$s" "%2028$s" "%2029$s" "%2030$s" ++"%2031$s" "%2032$s" "%2033$s" "%2034$s" "%2035$s" "%2036$s" "%2037$s" "%2038$s" "%2039$s" "%2040$s" ++"%2041$s" "%2042$s" "%2043$s" "%2044$s" "%2045$s" "%2046$s" "%2047$s" "%2048$s" "%2049$s" "%2050$s" ++"%2051$s" "%2052$s" "%2053$s" "%2054$s" "%2055$s" "%2056$s" "%2057$s" "%2058$s" "%2059$s" "%2060$s" ++"%2061$s" "%2062$s" "%2063$s" "%2064$s" "%2065$s" "%2066$s" "%2067$s" "%2068$s" "%2069$s" "%2070$s" ++"%2071$s" "%2072$s" "%2073$s" "%2074$s" "%2075$s" "%2076$s" "%2077$s" "%2078$s" "%2079$s" "%2080$s" ++"%2081$s" "%2082$s" "%2083$s" "%2084$s" "%2085$s" "%2086$s" "%2087$s" "%2088$s" "%2089$s" "%2090$s" ++"%2091$s" "%2092$s" "%2093$s" "%2094$s" "%2095$s" "%2096$s" "%2097$s" "%2098$s" "%2099$s" "%2100$s" ++"%2101$s" "%2102$s" "%2103$s" "%2104$s" "%2105$s" "%2106$s" "%2107$s" "%2108$s" "%2109$s" "%2110$s" ++"%2111$s" "%2112$s" "%2113$s" "%2114$s" "%2115$s" "%2116$s" "%2117$s" "%2118$s" "%2119$s" "%2120$s" ++"%2121$s" "%2122$s" "%2123$s" "%2124$s" "%2125$s" "%2126$s" "%2127$s" "%2128$s" "%2129$s" "%2130$s" ++"%2131$s" "%2132$s" "%2133$s" "%2134$s" "%2135$s" "%2136$s" "%2137$s" "%2138$s" "%2139$s" "%2140$s" ++"%2141$s" "%2142$s" "%2143$s" "%2144$s" "%2145$s" "%2146$s" "%2147$s" "%2148$s" "%2149$s" "%2150$s" ++"%2151$s" "%2152$s" "%2153$s" "%2154$s" "%2155$s" "%2156$s" "%2157$s" "%2158$s" "%2159$s" "%2160$s" ++"%2161$s" "%2162$s" "%2163$s" "%2164$s" "%2165$s" "%2166$s" "%2167$s" "%2168$s" "%2169$s" "%2170$s" ++"%2171$s" "%2172$s" "%2173$s" "%2174$s" "%2175$s" "%2176$s" "%2177$s" "%2178$s" "%2179$s" "%2180$s" ++"%2181$s" "%2182$s" "%2183$s" "%2184$s" "%2185$s" "%2186$s" "%2187$s" "%2188$s" "%2189$s" "%2190$s" ++"%2191$s" "%2192$s" "%2193$s" "%2194$s" "%2195$s" "%2196$s" "%2197$s" "%2198$s" "%2199$s" "%2200$s" ++"%2201$s" "%2202$s" "%2203$s" "%2204$s" "%2205$s" "%2206$s" "%2207$s" "%2208$s" "%2209$s" "%2210$s" ++"%2211$s" "%2212$s" "%2213$s" "%2214$s" "%2215$s" "%2216$s" "%2217$s" "%2218$s" "%2219$s" "%2220$s" ++"%2221$s" "%2222$s" "%2223$s" "%2224$s" "%2225$s" "%2226$s" "%2227$s" "%2228$s" "%2229$s" "%2230$s" ++"%2231$s" "%2232$s" "%2233$s" "%2234$s" "%2235$s" "%2236$s" "%2237$s" "%2238$s" "%2239$s" "%2240$s" ++"%2241$s" "%2242$s" "%2243$s" "%2244$s" "%2245$s" "%2246$s" "%2247$s" "%2248$s" "%2249$s" "%2250$s" ++"%2251$s" "%2252$s" "%2253$s" "%2254$s" "%2255$s" "%2256$s" "%2257$s" "%2258$s" "%2259$s" "%2260$s" ++"%2261$s" "%2262$s" "%2263$s" "%2264$s" "%2265$s" "%2266$s" "%2267$s" "%2268$s" "%2269$s" "%2270$s" ++"%2271$s" "%2272$s" "%2273$s" "%2274$s" "%2275$s" "%2276$s" "%2277$s" "%2278$s" "%2279$s" "%2280$s" ++"%2281$s" "%2282$s" "%2283$s" "%2284$s" "%2285$s" "%2286$s" "%2287$s" "%2288$s" "%2289$s" "%2290$s" ++"%2291$s" "%2292$s" "%2293$s" "%2294$s" "%2295$s" "%2296$s" "%2297$s" "%2298$s" "%2299$s" "%2300$s" ++"%2301$s" "%2302$s" "%2303$s" "%2304$s" "%2305$s" "%2306$s" "%2307$s" "%2308$s" "%2309$s" "%2310$s" ++"%2311$s" "%2312$s" "%2313$s" "%2314$s" "%2315$s" "%2316$s" "%2317$s" "%2318$s" "%2319$s" "%2320$s" ++"%2321$s" "%2322$s" "%2323$s" "%2324$s" "%2325$s" "%2326$s" "%2327$s" "%2328$s" "%2329$s" "%2330$s" ++"%2331$s" "%2332$s" "%2333$s" "%2334$s" "%2335$s" "%2336$s" "%2337$s" "%2338$s" "%2339$s" "%2340$s" ++"%2341$s" "%2342$s" "%2343$s" "%2344$s" "%2345$s" "%2346$s" "%2347$s" "%2348$s" "%2349$s" "%2350$s" ++"%2351$s" "%2352$s" "%2353$s" "%2354$s" "%2355$s" "%2356$s" "%2357$s" "%2358$s" "%2359$s" "%2360$s" ++"%2361$s" "%2362$s" "%2363$s" "%2364$s" "%2365$s" "%2366$s" "%2367$s" "%2368$s" "%2369$s" "%2370$s" ++"%2371$s" "%2372$s" "%2373$s" "%2374$s" "%2375$s" "%2376$s" "%2377$s" "%2378$s" "%2379$s" "%2380$s" ++"%2381$s" "%2382$s" "%2383$s" "%2384$s" "%2385$s" "%2386$s" "%2387$s" "%2388$s" "%2389$s" "%2390$s" ++"%2391$s" "%2392$s" "%2393$s" "%2394$s" "%2395$s" "%2396$s" "%2397$s" "%2398$s" "%2399$s" "%2400$s" ++"%2401$s" "%2402$s" "%2403$s" "%2404$s" "%2405$s" "%2406$s" "%2407$s" "%2408$s" "%2409$s" "%2410$s" ++"%2411$s" "%2412$s" "%2413$s" "%2414$s" "%2415$s" "%2416$s" "%2417$s" "%2418$s" "%2419$s" "%2420$s" ++"%2421$s" "%2422$s" "%2423$s" "%2424$s" "%2425$s" "%2426$s" "%2427$s" "%2428$s" "%2429$s" "%2430$s" ++"%2431$s" "%2432$s" "%2433$s" "%2434$s" "%2435$s" "%2436$s" "%2437$s" "%2438$s" "%2439$s" "%2440$s" ++"%2441$s" "%2442$s" "%2443$s" "%2444$s" "%2445$s" "%2446$s" "%2447$s" "%2448$s" "%2449$s" "%2450$s" ++"%2451$s" "%2452$s" "%2453$s" "%2454$s" "%2455$s" "%2456$s" "%2457$s" "%2458$s" "%2459$s" "%2460$s" ++"%2461$s" "%2462$s" "%2463$s" "%2464$s" "%2465$s" "%2466$s" "%2467$s" "%2468$s" "%2469$s" "%2470$s" ++"%2471$s" "%2472$s" "%2473$s" "%2474$s" "%2475$s" "%2476$s" "%2477$s" "%2478$s" "%2479$s" "%2480$s" ++"%2481$s" "%2482$s" "%2483$s" "%2484$s" "%2485$s" "%2486$s" "%2487$s" "%2488$s" "%2489$s" "%2490$s" ++"%2491$s" "%2492$s" "%2493$s" "%2494$s" "%2495$s" "%2496$s" "%2497$s" "%2498$s" "%2499$s" "%2500$s" ++"%2501$s" "%2502$s" "%2503$s" "%2504$s" "%2505$s" "%2506$s" "%2507$s" "%2508$s" "%2509$s" "%2510$s" ++"%2511$s" "%2512$s" "%2513$s" "%2514$s" "%2515$s" "%2516$s" "%2517$s" "%2518$s" "%2519$s" "%2520$s" ++"%2521$s" "%2522$s" "%2523$s" "%2524$s" "%2525$s" "%2526$s" "%2527$s" "%2528$s" "%2529$s" "%2530$s" ++"%2531$s" "%2532$s" "%2533$s" "%2534$s" "%2535$s" "%2536$s" "%2537$s" "%2538$s" "%2539$s" "%2540$s" ++"%2541$s" "%2542$s" "%2543$s" "%2544$s" "%2545$s" "%2546$s" "%2547$s" "%2548$s" "%2549$s" "%2550$s" ++"%2551$s" "%2552$s" "%2553$s" "%2554$s" "%2555$s" "%2556$s" "%2557$s" "%2558$s" "%2559$s" "%2560$s" ++"%2561$s" "%2562$s" "%2563$s" "%2564$s" "%2565$s" "%2566$s" "%2567$s" "%2568$s" "%2569$s" "%2570$s" ++"%2571$s" "%2572$s" "%2573$s" "%2574$s" "%2575$s" "%2576$s" "%2577$s" "%2578$s" "%2579$s" "%2580$s" ++"%2581$s" "%2582$s" "%2583$s" "%2584$s" "%2585$s" "%2586$s" "%2587$s" "%2588$s" "%2589$s" "%2590$s" ++"%2591$s" "%2592$s" "%2593$s" "%2594$s" "%2595$s" "%2596$s" "%2597$s" "%2598$s" "%2599$s" "%2600$s" ++"%2601$s" "%2602$s" "%2603$s" "%2604$s" "%2605$s" "%2606$s" "%2607$s" "%2608$s" "%2609$s" "%2610$s" ++"%2611$s" "%2612$s" "%2613$s" "%2614$s" "%2615$s" "%2616$s" "%2617$s" "%2618$s" "%2619$s" "%2620$s" ++"%2621$s" "%2622$s" "%2623$s" "%2624$s" "%2625$s" "%2626$s" "%2627$s" "%2628$s" "%2629$s" "%2630$s" ++"%2631$s" "%2632$s" "%2633$s" "%2634$s" "%2635$s" "%2636$s" "%2637$s" "%2638$s" "%2639$s" "%2640$s" ++"%2641$s" "%2642$s" "%2643$s" "%2644$s" "%2645$s" "%2646$s" "%2647$s" "%2648$s" "%2649$s" "%2650$s" ++"%2651$s" "%2652$s" "%2653$s" "%2654$s" "%2655$s" "%2656$s" "%2657$s" "%2658$s" "%2659$s" "%2660$s" ++"%2661$s" "%2662$s" "%2663$s" "%2664$s" "%2665$s" "%2666$s" "%2667$s" "%2668$s" "%2669$s" "%2670$s" ++"%2671$s" "%2672$s" "%2673$s" "%2674$s" "%2675$s" "%2676$s" "%2677$s" "%2678$s" "%2679$s" "%2680$s" ++"%2681$s" "%2682$s" "%2683$s" "%2684$s" "%2685$s" "%2686$s" "%2687$s" "%2688$s" "%2689$s" "%2690$s" ++"%2691$s" "%2692$s" "%2693$s" "%2694$s" "%2695$s" "%2696$s" "%2697$s" "%2698$s" "%2699$s" "%2700$s" ++"%2701$s" "%2702$s" "%2703$s" "%2704$s" "%2705$s" "%2706$s" "%2707$s" "%2708$s" "%2709$s" "%2710$s" ++"%2711$s" "%2712$s" "%2713$s" "%2714$s" "%2715$s" "%2716$s" "%2717$s" "%2718$s" "%2719$s" "%2720$s" ++"%2721$s" "%2722$s" "%2723$s" "%2724$s" "%2725$s" "%2726$s" "%2727$s" "%2728$s" "%2729$s" "%2730$s" ++"%2731$s" "%2732$s" "%2733$s" "%2734$s" "%2735$s" "%2736$s" "%2737$s" "%2738$s" "%2739$s" "%2740$s" ++"%2741$s" "%2742$s" "%2743$s" "%2744$s" "%2745$s" "%2746$s" "%2747$s" "%2748$s" "%2749$s" "%2750$s" ++"%2751$s" "%2752$s" "%2753$s" "%2754$s" "%2755$s" "%2756$s" "%2757$s" "%2758$s" "%2759$s" "%2760$s" ++"%2761$s" "%2762$s" "%2763$s" "%2764$s" "%2765$s" "%2766$s" "%2767$s" "%2768$s" "%2769$s" "%2770$s" ++"%2771$s" "%2772$s" "%2773$s" "%2774$s" "%2775$s" "%2776$s" "%2777$s" "%2778$s" "%2779$s" "%2780$s" ++"%2781$s" "%2782$s" "%2783$s" "%2784$s" "%2785$s" "%2786$s" "%2787$s" "%2788$s" "%2789$s" "%2790$s" ++"%2791$s" "%2792$s" "%2793$s" "%2794$s" "%2795$s" "%2796$s" "%2797$s" "%2798$s" "%2799$s" "%2800$s" ++"%2801$s" "%2802$s" "%2803$s" "%2804$s" "%2805$s" "%2806$s" "%2807$s" "%2808$s" "%2809$s" "%2810$s" ++"%2811$s" "%2812$s" "%2813$s" "%2814$s" "%2815$s" "%2816$s" "%2817$s" "%2818$s" "%2819$s" "%2820$s" ++"%2821$s" "%2822$s" "%2823$s" "%2824$s" "%2825$s" "%2826$s" "%2827$s" "%2828$s" "%2829$s" "%2830$s" ++"%2831$s" "%2832$s" "%2833$s" "%2834$s" "%2835$s" "%2836$s" "%2837$s" "%2838$s" "%2839$s" "%2840$s" ++"%2841$s" "%2842$s" "%2843$s" "%2844$s" "%2845$s" "%2846$s" "%2847$s" "%2848$s" "%2849$s" "%2850$s" ++"%2851$s" "%2852$s" "%2853$s" "%2854$s" "%2855$s" "%2856$s" "%2857$s" "%2858$s" "%2859$s" "%2860$s" ++"%2861$s" "%2862$s" "%2863$s" "%2864$s" "%2865$s" "%2866$s" "%2867$s" "%2868$s" "%2869$s" "%2870$s" ++"%2871$s" "%2872$s" "%2873$s" "%2874$s" "%2875$s" "%2876$s" "%2877$s" "%2878$s" "%2879$s" "%2880$s" ++"%2881$s" "%2882$s" "%2883$s" "%2884$s" "%2885$s" "%2886$s" "%2887$s" "%2888$s" "%2889$s" "%2890$s" ++"%2891$s" "%2892$s" "%2893$s" "%2894$s" "%2895$s" "%2896$s" "%2897$s" "%2898$s" "%2899$s" "%2900$s" ++"%2901$s" "%2902$s" "%2903$s" "%2904$s" "%2905$s" "%2906$s" "%2907$s" "%2908$s" "%2909$s" "%2910$s" ++"%2911$s" "%2912$s" "%2913$s" "%2914$s" "%2915$s" "%2916$s" "%2917$s" "%2918$s" "%2919$s" "%2920$s" ++"%2921$s" "%2922$s" "%2923$s" "%2924$s" "%2925$s" "%2926$s" "%2927$s" "%2928$s" "%2929$s" "%2930$s" ++"%2931$s" "%2932$s" "%2933$s" "%2934$s" "%2935$s" "%2936$s" "%2937$s" "%2938$s" "%2939$s" "%2940$s" ++"%2941$s" "%2942$s" "%2943$s" "%2944$s" "%2945$s" "%2946$s" "%2947$s" "%2948$s" "%2949$s" "%2950$s" ++"%2951$s" "%2952$s" "%2953$s" "%2954$s" "%2955$s" "%2956$s" "%2957$s" "%2958$s" "%2959$s" "%2960$s" ++"%2961$s" "%2962$s" "%2963$s" "%2964$s" "%2965$s" "%2966$s" "%2967$s" "%2968$s" "%2969$s" "%2970$s" ++"%2971$s" "%2972$s" "%2973$s" "%2974$s" "%2975$s" "%2976$s" "%2977$s" "%2978$s" "%2979$s" "%2980$s" ++"%2981$s" "%2982$s" "%2983$s" "%2984$s" "%2985$s" "%2986$s" "%2987$s" "%2988$s" "%2989$s" "%2990$s" ++"%2991$s" "%2992$s" "%2993$s" "%2994$s" "%2995$s" "%2996$s" "%2997$s" "%2998$s" "%2999$s" "%3000$s" ++"%3001$s" "%3002$s" "%3003$s" "%3004$s" "%3005$s" "%3006$s" "%3007$s" "%3008$s" "%3009$s" "%3010$s" ++"%3011$s" "%3012$s" "%3013$s" "%3014$s" "%3015$s" "%3016$s" "%3017$s" "%3018$s" "%3019$s" "%3020$s" ++"%3021$s" "%3022$s" "%3023$s" "%3024$s" "%3025$s" "%3026$s" "%3027$s" "%3028$s" "%3029$s" "%3030$s" ++"%3031$s" "%3032$s" "%3033$s" "%3034$s" "%3035$s" "%3036$s" "%3037$s" "%3038$s" "%3039$s" "%3040$s" ++"%3041$s" "%3042$s" "%3043$s" "%3044$s" "%3045$s" "%3046$s" "%3047$s" "%3048$s" "%3049$s" "%3050$s" ++"%3051$s" "%3052$s" "%3053$s" "%3054$s" "%3055$s" "%3056$s" "%3057$s" "%3058$s" "%3059$s" "%3060$s" ++"%3061$s" "%3062$s" "%3063$s" "%3064$s" "%3065$s" "%3066$s" "%3067$s" "%3068$s" "%3069$s" "%3070$s" ++"%3071$s" "%3072$s" "%3073$s" "%3074$s" "%3075$s" "%3076$s" "%3077$s" "%3078$s" "%3079$s" "%3080$s" ++"%3081$s" "%3082$s" "%3083$s" "%3084$s" "%3085$s" "%3086$s" "%3087$s" "%3088$s" "%3089$s" "%3090$s" ++"%3091$s" "%3092$s" "%3093$s" "%3094$s" "%3095$s" "%3096$s" "%3097$s" "%3098$s" "%3099$s" "%3100$s" ++"%3101$s" "%3102$s" "%3103$s" "%3104$s" "%3105$s" "%3106$s" "%3107$s" "%3108$s" "%3109$s" "%3110$s" ++"%3111$s" "%3112$s" "%3113$s" "%3114$s" "%3115$s" "%3116$s" "%3117$s" "%3118$s" "%3119$s" "%3120$s" ++"%3121$s" "%3122$s" "%3123$s" "%3124$s" "%3125$s" "%3126$s" "%3127$s" "%3128$s" "%3129$s" "%3130$s" ++"%3131$s" "%3132$s" "%3133$s" "%3134$s" "%3135$s" "%3136$s" "%3137$s" "%3138$s" "%3139$s" "%3140$s" ++"%3141$s" "%3142$s" "%3143$s" "%3144$s" "%3145$s" "%3146$s" "%3147$s" "%3148$s" "%3149$s" "%3150$s" ++"%3151$s" "%3152$s" "%3153$s" "%3154$s" "%3155$s" "%3156$s" "%3157$s" "%3158$s" "%3159$s" "%3160$s" ++"%3161$s" "%3162$s" "%3163$s" "%3164$s" "%3165$s" "%3166$s" "%3167$s" "%3168$s" "%3169$s" "%3170$s" ++"%3171$s" "%3172$s" "%3173$s" "%3174$s" "%3175$s" "%3176$s" "%3177$s" "%3178$s" "%3179$s" "%3180$s" ++"%3181$s" "%3182$s" "%3183$s" "%3184$s" "%3185$s" "%3186$s" "%3187$s" "%3188$s" "%3189$s" "%3190$s" ++"%3191$s" "%3192$s" "%3193$s" "%3194$s" "%3195$s" "%3196$s" "%3197$s" "%3198$s" "%3199$s" "%3200$s" ++"%3201$s" "%3202$s" "%3203$s" "%3204$s" "%3205$s" "%3206$s" "%3207$s" "%3208$s" "%3209$s" "%3210$s" ++"%3211$s" "%3212$s" "%3213$s" "%3214$s" "%3215$s" "%3216$s" "%3217$s" "%3218$s" "%3219$s" "%3220$s" ++"%3221$s" "%3222$s" "%3223$s" "%3224$s" "%3225$s" "%3226$s" "%3227$s" "%3228$s" "%3229$s" "%3230$s" ++"%3231$s" "%3232$s" "%3233$s" "%3234$s" "%3235$s" "%3236$s" "%3237$s" "%3238$s" "%3239$s" "%3240$s" ++"%3241$s" "%3242$s" "%3243$s" "%3244$s" "%3245$s" "%3246$s" "%3247$s" "%3248$s" "%3249$s" "%3250$s" ++"%3251$s" "%3252$s" "%3253$s" "%3254$s" "%3255$s" "%3256$s" "%3257$s" "%3258$s" "%3259$s" "%3260$s" ++"%3261$s" "%3262$s" "%3263$s" "%3264$s" "%3265$s" "%3266$s" "%3267$s" "%3268$s" "%3269$s" "%3270$s" ++"%3271$s" "%3272$s" "%3273$s" "%3274$s" "%3275$s" "%3276$s" "%3277$s" "%3278$s" "%3279$s" "%3280$s" ++"%3281$s" "%3282$s" "%3283$s" "%3284$s" "%3285$s" "%3286$s" "%3287$s" "%3288$s" "%3289$s" "%3290$s" ++"%3291$s" "%3292$s" "%3293$s" "%3294$s" "%3295$s" "%3296$s" "%3297$s" "%3298$s" "%3299$s" "%3300$s" ++"%3301$s" "%3302$s" "%3303$s" "%3304$s" "%3305$s" "%3306$s" "%3307$s" "%3308$s" "%3309$s" "%3310$s" ++"%3311$s" "%3312$s" "%3313$s" "%3314$s" "%3315$s" "%3316$s" "%3317$s" "%3318$s" "%3319$s" "%3320$s" ++"%3321$s" "%3322$s" "%3323$s" "%3324$s" "%3325$s" "%3326$s" "%3327$s" "%3328$s" "%3329$s" "%3330$s" ++"%3331$s" "%3332$s" "%3333$s" "%3334$s" "%3335$s" "%3336$s" "%3337$s" "%3338$s" "%3339$s" "%3340$s" ++"%3341$s" "%3342$s" "%3343$s" "%3344$s" "%3345$s" "%3346$s" "%3347$s" "%3348$s" "%3349$s" "%3350$s" ++"%3351$s" "%3352$s" "%3353$s" "%3354$s" "%3355$s" "%3356$s" "%3357$s" "%3358$s" "%3359$s" "%3360$s" ++"%3361$s" "%3362$s" "%3363$s" "%3364$s" "%3365$s" "%3366$s" "%3367$s" "%3368$s" "%3369$s" "%3370$s" ++"%3371$s" "%3372$s" "%3373$s" "%3374$s" "%3375$s" "%3376$s" "%3377$s" "%3378$s" "%3379$s" "%3380$s" ++"%3381$s" "%3382$s" "%3383$s" "%3384$s" "%3385$s" "%3386$s" "%3387$s" "%3388$s" "%3389$s" "%3390$s" ++"%3391$s" "%3392$s" "%3393$s" "%3394$s" "%3395$s" "%3396$s" "%3397$s" "%3398$s" "%3399$s" "%3400$s" ++"%3401$s" "%3402$s" "%3403$s" "%3404$s" "%3405$s" "%3406$s" "%3407$s" "%3408$s" "%3409$s" "%3410$s" ++"%3411$s" "%3412$s" "%3413$s" "%3414$s" "%3415$s" "%3416$s" "%3417$s" "%3418$s" "%3419$s" "%3420$s" ++"%3421$s" "%3422$s" "%3423$s" "%3424$s" "%3425$s" "%3426$s" "%3427$s" "%3428$s" "%3429$s" "%3430$s" ++"%3431$s" "%3432$s" "%3433$s" "%3434$s" "%3435$s" "%3436$s" "%3437$s" "%3438$s" "%3439$s" "%3440$s" ++"%3441$s" "%3442$s" "%3443$s" "%3444$s" "%3445$s" "%3446$s" "%3447$s" "%3448$s" "%3449$s" "%3450$s" ++"%3451$s" "%3452$s" "%3453$s" "%3454$s" "%3455$s" "%3456$s" "%3457$s" "%3458$s" "%3459$s" "%3460$s" ++"%3461$s" "%3462$s" "%3463$s" "%3464$s" "%3465$s" "%3466$s" "%3467$s" "%3468$s" "%3469$s" "%3470$s" ++"%3471$s" "%3472$s" "%3473$s" "%3474$s" "%3475$s" "%3476$s" "%3477$s" "%3478$s" "%3479$s" "%3480$s" ++"%3481$s" "%3482$s" "%3483$s" "%3484$s" "%3485$s" "%3486$s" "%3487$s" "%3488$s" "%3489$s" "%3490$s" ++"%3491$s" "%3492$s" "%3493$s" "%3494$s" "%3495$s" "%3496$s" "%3497$s" "%3498$s" "%3499$s" "%3500$s" ++"%3501$s" "%3502$s" "%3503$s" "%3504$s" "%3505$s" "%3506$s" "%3507$s" "%3508$s" "%3509$s" "%3510$s" ++"%3511$s" "%3512$s" "%3513$s" "%3514$s" "%3515$s" "%3516$s" "%3517$s" "%3518$s" "%3519$s" "%3520$s" ++"%3521$s" "%3522$s" "%3523$s" "%3524$s" "%3525$s" "%3526$s" "%3527$s" "%3528$s" "%3529$s" "%3530$s" ++"%3531$s" "%3532$s" "%3533$s" "%3534$s" "%3535$s" "%3536$s" "%3537$s" "%3538$s" "%3539$s" "%3540$s" ++"%3541$s" "%3542$s" "%3543$s" "%3544$s" "%3545$s" "%3546$s" "%3547$s" "%3548$s" "%3549$s" "%3550$s" ++"%3551$s" "%3552$s" "%3553$s" "%3554$s" "%3555$s" "%3556$s" "%3557$s" "%3558$s" "%3559$s" "%3560$s" ++"%3561$s" "%3562$s" "%3563$s" "%3564$s" "%3565$s" "%3566$s" "%3567$s" "%3568$s" "%3569$s" "%3570$s" ++"%3571$s" "%3572$s" "%3573$s" "%3574$s" "%3575$s" "%3576$s" "%3577$s" "%3578$s" "%3579$s" "%3580$s" ++"%3581$s" "%3582$s" "%3583$s" "%3584$s" "%3585$s" "%3586$s" "%3587$s" "%3588$s" "%3589$s" "%3590$s" ++"%3591$s" "%3592$s" "%3593$s" "%3594$s" "%3595$s" "%3596$s" "%3597$s" "%3598$s" "%3599$s" "%3600$s" ++"%3601$s" "%3602$s" "%3603$s" "%3604$s" "%3605$s" "%3606$s" "%3607$s" "%3608$s" "%3609$s" "%3610$s" ++"%3611$s" "%3612$s" "%3613$s" "%3614$s" "%3615$s" "%3616$s" "%3617$s" "%3618$s" "%3619$s" "%3620$s" ++"%3621$s" "%3622$s" "%3623$s" "%3624$s" "%3625$s" "%3626$s" "%3627$s" "%3628$s" "%3629$s" "%3630$s" ++"%3631$s" "%3632$s" "%3633$s" "%3634$s" "%3635$s" "%3636$s" "%3637$s" "%3638$s" "%3639$s" "%3640$s" ++"%3641$s" "%3642$s" "%3643$s" "%3644$s" "%3645$s" "%3646$s" "%3647$s" "%3648$s" "%3649$s" "%3650$s" ++"%3651$s" "%3652$s" "%3653$s" "%3654$s" "%3655$s" "%3656$s" "%3657$s" "%3658$s" "%3659$s" "%3660$s" ++"%3661$s" "%3662$s" "%3663$s" "%3664$s" "%3665$s" "%3666$s" "%3667$s" "%3668$s" "%3669$s" "%3670$s" ++"%3671$s" "%3672$s" "%3673$s" "%3674$s" "%3675$s" "%3676$s" "%3677$s" "%3678$s" "%3679$s" "%3680$s" ++"%3681$s" "%3682$s" "%3683$s" "%3684$s" "%3685$s" "%3686$s" "%3687$s" "%3688$s" "%3689$s" "%3690$s" ++"%3691$s" "%3692$s" "%3693$s" "%3694$s" "%3695$s" "%3696$s" "%3697$s" "%3698$s" "%3699$s" "%3700$s" ++"%3701$s" "%3702$s" "%3703$s" "%3704$s" "%3705$s" "%3706$s" "%3707$s" "%3708$s" "%3709$s" "%3710$s" ++"%3711$s" "%3712$s" "%3713$s" "%3714$s" "%3715$s" "%3716$s" "%3717$s" "%3718$s" "%3719$s" "%3720$s" ++"%3721$s" "%3722$s" "%3723$s" "%3724$s" "%3725$s" "%3726$s" "%3727$s" "%3728$s" "%3729$s" "%3730$s" ++"%3731$s" "%3732$s" "%3733$s" "%3734$s" "%3735$s" "%3736$s" "%3737$s" "%3738$s" "%3739$s" "%3740$s" ++"%3741$s" "%3742$s" "%3743$s" "%3744$s" "%3745$s" "%3746$s" "%3747$s" "%3748$s" "%3749$s" "%3750$s" ++"%3751$s" "%3752$s" "%3753$s" "%3754$s" "%3755$s" "%3756$s" "%3757$s" "%3758$s" "%3759$s" "%3760$s" ++"%3761$s" "%3762$s" "%3763$s" "%3764$s" "%3765$s" "%3766$s" "%3767$s" "%3768$s" "%3769$s" "%3770$s" ++"%3771$s" "%3772$s" "%3773$s" "%3774$s" "%3775$s" "%3776$s" "%3777$s" "%3778$s" "%3779$s" "%3780$s" ++"%3781$s" "%3782$s" "%3783$s" "%3784$s" "%3785$s" "%3786$s" "%3787$s" "%3788$s" "%3789$s" "%3790$s" ++"%3791$s" "%3792$s" "%3793$s" "%3794$s" "%3795$s" "%3796$s" "%3797$s" "%3798$s" "%3799$s" "%3800$s" ++"%3801$s" "%3802$s" "%3803$s" "%3804$s" "%3805$s" "%3806$s" "%3807$s" "%3808$s" "%3809$s" "%3810$s" ++"%3811$s" "%3812$s" "%3813$s" "%3814$s" "%3815$s" "%3816$s" "%3817$s" "%3818$s" "%3819$s" "%3820$s" ++"%3821$s" "%3822$s" "%3823$s" "%3824$s" "%3825$s" "%3826$s" "%3827$s" "%3828$s" "%3829$s" "%3830$s" ++"%3831$s" "%3832$s" "%3833$s" "%3834$s" "%3835$s" "%3836$s" "%3837$s" "%3838$s" "%3839$s" "%3840$s" ++"%3841$s" "%3842$s" "%3843$s" "%3844$s" "%3845$s" "%3846$s" "%3847$s" "%3848$s" "%3849$s" "%3850$s" ++"%3851$s" "%3852$s" "%3853$s" "%3854$s" "%3855$s" "%3856$s" "%3857$s" "%3858$s" "%3859$s" "%3860$s" ++"%3861$s" "%3862$s" "%3863$s" "%3864$s" "%3865$s" "%3866$s" "%3867$s" "%3868$s" "%3869$s" "%3870$s" ++"%3871$s" "%3872$s" "%3873$s" "%3874$s" "%3875$s" "%3876$s" "%3877$s" "%3878$s" "%3879$s" "%3880$s" ++"%3881$s" "%3882$s" "%3883$s" "%3884$s" "%3885$s" "%3886$s" "%3887$s" "%3888$s" "%3889$s" "%3890$s" ++"%3891$s" "%3892$s" "%3893$s" "%3894$s" "%3895$s" "%3896$s" "%3897$s" "%3898$s" "%3899$s" "%3900$s" ++"%3901$s" "%3902$s" "%3903$s" "%3904$s" "%3905$s" "%3906$s" "%3907$s" "%3908$s" "%3909$s" "%3910$s" ++"%3911$s" "%3912$s" "%3913$s" "%3914$s" "%3915$s" "%3916$s" "%3917$s" "%3918$s" "%3919$s" "%3920$s" ++"%3921$s" "%3922$s" "%3923$s" "%3924$s" "%3925$s" "%3926$s" "%3927$s" "%3928$s" "%3929$s" "%3930$s" ++"%3931$s" "%3932$s" "%3933$s" "%3934$s" "%3935$s" "%3936$s" "%3937$s" "%3938$s" "%3939$s" "%3940$s" ++"%3941$s" "%3942$s" "%3943$s" "%3944$s" "%3945$s" "%3946$s" "%3947$s" "%3948$s" "%3949$s" "%3950$s" ++"%3951$s" "%3952$s" "%3953$s" "%3954$s" "%3955$s" "%3956$s" "%3957$s" "%3958$s" "%3959$s" "%3960$s" ++"%3961$s" "%3962$s" "%3963$s" "%3964$s" "%3965$s" "%3966$s" "%3967$s" "%3968$s" "%3969$s" "%3970$s" ++"%3971$s" "%3972$s" "%3973$s" "%3974$s" "%3975$s" "%3976$s" "%3977$s" "%3978$s" "%3979$s" "%3980$s" ++"%3981$s" "%3982$s" "%3983$s" "%3984$s" "%3985$s" "%3986$s" "%3987$s" "%3988$s" "%3989$s" "%3990$s" ++"%3991$s" "%3992$s" "%3993$s" "%3994$s" "%3995$s" "%3996$s" "%3997$s" "%3998$s" "%3999$s" "%4000$s" ++"%4001$s" "%4002$s" "%4003$s" "%4004$s" "%4005$s" "%4006$s" "%4007$s" "%4008$s" "%4009$s" "%4010$s" ++"%4011$s" "%4012$s" "%4013$s" "%4014$s" "%4015$s" "%4016$s" "%4017$s" "%4018$s" "%4019$s" "%4020$s" ++"%4021$s" "%4022$s" "%4023$s" "%4024$s" "%4025$s" "%4026$s" "%4027$s" "%4028$s" "%4029$s" "%4030$s" ++"%4031$s" "%4032$s" "%4033$s" "%4034$s" "%4035$s" "%4036$s" "%4037$s" "%4038$s" "%4039$s" "%4040$s" ++"%4041$s" "%4042$s" "%4043$s" "%4044$s" "%4045$s" "%4046$s" "%4047$s" "%4048$s" "%4049$s" "%4050$s" ++"%4051$s" "%4052$s" "%4053$s" "%4054$s" "%4055$s" "%4056$s" "%4057$s" "%4058$s" "%4059$s" "%4060$s" ++"%4061$s" "%4062$s" "%4063$s" "%4064$s" "%4065$s" "%4066$s" "%4067$s" "%4068$s" "%4069$s" "%4070$s" ++"%4071$s" "%4072$s" "%4073$s" "%4074$s" "%4075$s" "%4076$s" "%4077$s" "%4078$s" "%4079$s" "%4080$s" ++"%4081$s" "%4082$s" "%4083$s" "%4084$s" "%4085$s" "%4086$s" "%4087$s" "%4088$s" "%4089$s" "%4090$s" ++"%4091$s" "%4092$s" "%4093$s" "%4094$s" "%4095$s" "%4096$s" "%4097$s" "%4098$s" "%4099$s" "%4100$s" ++"%4101$s" "%4102$s" "%4103$s" "%4104$s" "%4105$s" "%4106$s" "%4107$s" "%4108$s" "%4109$s" "%4110$s" ++"%4111$s" "%4112$s" "%4113$s" "%4114$s" "%4115$s" "%4116$s" "%4117$s" "%4118$s" "%4119$s" "%4120$s" ++"%4121$s" "%4122$s" "%4123$s" "%4124$s" "%4125$s" "%4126$s" "%4127$s" "%4128$s" "%4129$s" "%4130$s" ++"%4131$s" "%4132$s" "%4133$s" "%4134$s" "%4135$s" "%4136$s" "%4137$s" "%4138$s" "%4139$s" "%4140$s" ++"%4141$s" "%4142$s" "%4143$s" "%4144$s" "%4145$s" "%4146$s" "%4147$s" "%4148$s" "%4149$s" "%4150$s" ++"%4151$s" "%4152$s" "%4153$s" "%4154$s" "%4155$s" "%4156$s" "%4157$s" "%4158$s" "%4159$s" "%4160$s" ++"%4161$s" "%4162$s" "%4163$s" "%4164$s" "%4165$s" "%4166$s" "%4167$s" "%4168$s" "%4169$s" "%4170$s" ++"%4171$s" "%4172$s" "%4173$s" "%4174$s" "%4175$s" "%4176$s" "%4177$s" "%4178$s" "%4179$s" "%4180$s" ++"%4181$s" "%4182$s" "%4183$s" "%4184$s" "%4185$s" "%4186$s" "%4187$s" "%4188$s" "%4189$s" "%4190$s" ++"%4191$s" "%4192$s" "%4193$s" "%4194$s" "%4195$s" "%4196$s" "%4197$s" "%4198$s" "%4199$s" "%4200$s" ++"%4201$s" "%4202$s" "%4203$s" "%4204$s" "%4205$s" "%4206$s" "%4207$s" "%4208$s" "%4209$s" "%4210$s" ++"%4211$s" "%4212$s" "%4213$s" "%4214$s" "%4215$s" "%4216$s" "%4217$s" "%4218$s" "%4219$s" "%4220$s" ++"%4221$s" "%4222$s" "%4223$s" "%4224$s" "%4225$s" "%4226$s" "%4227$s" "%4228$s" "%4229$s" "%4230$s" ++"%4231$s" "%4232$s" "%4233$s" "%4234$s" "%4235$s" "%4236$s" "%4237$s" "%4238$s" "%4239$s" "%4240$s" ++"%4241$s" "%4242$s" "%4243$s" "%4244$s" "%4245$s" "%4246$s" "%4247$s" "%4248$s" "%4249$s" "%4250$s" ++"%4251$s" "%4252$s" "%4253$s" "%4254$s" "%4255$s" "%4256$s" "%4257$s" "%4258$s" "%4259$s" "%4260$s" ++"%4261$s" "%4262$s" "%4263$s" "%4264$s" "%4265$s" "%4266$s" "%4267$s" "%4268$s" "%4269$s" "%4270$s" ++"%4271$s" "%4272$s" "%4273$s" "%4274$s" "%4275$s" "%4276$s" "%4277$s" "%4278$s" "%4279$s" "%4280$s" ++"%4281$s" "%4282$s" "%4283$s" "%4284$s" "%4285$s" "%4286$s" "%4287$s" "%4288$s" "%4289$s" "%4290$s" ++"%4291$s" "%4292$s" "%4293$s" "%4294$s" "%4295$s" "%4296$s" "%4297$s" "%4298$s" "%4299$s" "%4300$s" ++"%4301$s" "%4302$s" "%4303$s" "%4304$s" "%4305$s" "%4306$s" "%4307$s" "%4308$s" "%4309$s" "%4310$s" ++"%4311$s" "%4312$s" "%4313$s" "%4314$s" "%4315$s" "%4316$s" "%4317$s" "%4318$s" "%4319$s" "%4320$s" ++"%4321$s" "%4322$s" "%4323$s" "%4324$s" "%4325$s" "%4326$s" "%4327$s" "%4328$s" "%4329$s" "%4330$s" ++"%4331$s" "%4332$s" "%4333$s" "%4334$s" "%4335$s" "%4336$s" "%4337$s" "%4338$s" "%4339$s" "%4340$s" ++"%4341$s" "%4342$s" "%4343$s" "%4344$s" "%4345$s" "%4346$s" "%4347$s" "%4348$s" "%4349$s" "%4350$s" ++"%4351$s" "%4352$s" "%4353$s" "%4354$s" "%4355$s" "%4356$s" "%4357$s" "%4358$s" "%4359$s" "%4360$s" ++"%4361$s" "%4362$s" "%4363$s" "%4364$s" "%4365$s" "%4366$s" "%4367$s" "%4368$s" "%4369$s" "%4370$s" ++"%4371$s" "%4372$s" "%4373$s" "%4374$s" "%4375$s" "%4376$s" "%4377$s" "%4378$s" "%4379$s" "%4380$s" ++"%4381$s" "%4382$s" "%4383$s" "%4384$s" "%4385$s" "%4386$s" "%4387$s" "%4388$s" "%4389$s" "%4390$s" ++"%4391$s" "%4392$s" "%4393$s" "%4394$s" "%4395$s" "%4396$s" "%4397$s" "%4398$s" "%4399$s" "%4400$s" ++"%4401$s" "%4402$s" "%4403$s" "%4404$s" "%4405$s" "%4406$s" "%4407$s" "%4408$s" "%4409$s" "%4410$s" ++"%4411$s" "%4412$s" "%4413$s" "%4414$s" "%4415$s" "%4416$s" "%4417$s" "%4418$s" "%4419$s" "%4420$s" ++"%4421$s" "%4422$s" "%4423$s" "%4424$s" "%4425$s" "%4426$s" "%4427$s" "%4428$s" "%4429$s" "%4430$s" ++"%4431$s" "%4432$s" "%4433$s" "%4434$s" "%4435$s" "%4436$s" "%4437$s" "%4438$s" "%4439$s" "%4440$s" ++"%4441$s" "%4442$s" "%4443$s" "%4444$s" "%4445$s" "%4446$s" "%4447$s" "%4448$s" "%4449$s" "%4450$s" ++"%4451$s" "%4452$s" "%4453$s" "%4454$s" "%4455$s" "%4456$s" "%4457$s" "%4458$s" "%4459$s" "%4460$s" ++"%4461$s" "%4462$s" "%4463$s" "%4464$s" "%4465$s" "%4466$s" "%4467$s" "%4468$s" "%4469$s" "%4470$s" ++"%4471$s" "%4472$s" "%4473$s" "%4474$s" "%4475$s" "%4476$s" "%4477$s" "%4478$s" "%4479$s" "%4480$s" ++"%4481$s" "%4482$s" "%4483$s" "%4484$s" "%4485$s" "%4486$s" "%4487$s" "%4488$s" "%4489$s" "%4490$s" ++"%4491$s" "%4492$s" "%4493$s" "%4494$s" "%4495$s" "%4496$s" "%4497$s" "%4498$s" "%4499$s" "%4500$s" ++"%4501$s" "%4502$s" "%4503$s" "%4504$s" "%4505$s" "%4506$s" "%4507$s" "%4508$s" "%4509$s" "%4510$s" ++"%4511$s" "%4512$s" "%4513$s" "%4514$s" "%4515$s" "%4516$s" "%4517$s" "%4518$s" "%4519$s" "%4520$s" ++"%4521$s" "%4522$s" "%4523$s" "%4524$s" "%4525$s" "%4526$s" "%4527$s" "%4528$s" "%4529$s" "%4530$s" ++"%4531$s" "%4532$s" "%4533$s" "%4534$s" "%4535$s" "%4536$s" "%4537$s" "%4538$s" "%4539$s" "%4540$s" ++"%4541$s" "%4542$s" "%4543$s" "%4544$s" "%4545$s" "%4546$s" "%4547$s" "%4548$s" "%4549$s" "%4550$s" ++"%4551$s" "%4552$s" "%4553$s" "%4554$s" "%4555$s" "%4556$s" "%4557$s" "%4558$s" "%4559$s" "%4560$s" ++"%4561$s" "%4562$s" "%4563$s" "%4564$s" "%4565$s" "%4566$s" "%4567$s" "%4568$s" "%4569$s" "%4570$s" ++"%4571$s" "%4572$s" "%4573$s" "%4574$s" "%4575$s" "%4576$s" "%4577$s" "%4578$s" "%4579$s" "%4580$s" ++"%4581$s" "%4582$s" "%4583$s" "%4584$s" "%4585$s" "%4586$s" "%4587$s" "%4588$s" "%4589$s" "%4590$s" ++"%4591$s" "%4592$s" "%4593$s" "%4594$s" "%4595$s" "%4596$s" "%4597$s" "%4598$s" "%4599$s" "%4600$s" ++"%4601$s" "%4602$s" "%4603$s" "%4604$s" "%4605$s" "%4606$s" "%4607$s" "%4608$s" "%4609$s" "%4610$s" ++"%4611$s" "%4612$s" "%4613$s" "%4614$s" "%4615$s" "%4616$s" "%4617$s" "%4618$s" "%4619$s" "%4620$s" ++"%4621$s" "%4622$s" "%4623$s" "%4624$s" "%4625$s" "%4626$s" "%4627$s" "%4628$s" "%4629$s" "%4630$s" ++"%4631$s" "%4632$s" "%4633$s" "%4634$s" "%4635$s" "%4636$s" "%4637$s" "%4638$s" "%4639$s" "%4640$s" ++"%4641$s" "%4642$s" "%4643$s" "%4644$s" "%4645$s" "%4646$s" "%4647$s" "%4648$s" "%4649$s" "%4650$s" ++"%4651$s" "%4652$s" "%4653$s" "%4654$s" "%4655$s" "%4656$s" "%4657$s" "%4658$s" "%4659$s" "%4660$s" ++"%4661$s" "%4662$s" "%4663$s" "%4664$s" "%4665$s" "%4666$s" "%4667$s" "%4668$s" "%4669$s" "%4670$s" ++"%4671$s" "%4672$s" "%4673$s" "%4674$s" "%4675$s" "%4676$s" "%4677$s" "%4678$s" "%4679$s" "%4680$s" ++"%4681$s" "%4682$s" "%4683$s" "%4684$s" "%4685$s" "%4686$s" "%4687$s" "%4688$s" "%4689$s" "%4690$s" ++"%4691$s" "%4692$s" "%4693$s" "%4694$s" "%4695$s" "%4696$s" "%4697$s" "%4698$s" "%4699$s" "%4700$s" ++"%4701$s" "%4702$s" "%4703$s" "%4704$s" "%4705$s" "%4706$s" "%4707$s" "%4708$s" "%4709$s" "%4710$s" ++"%4711$s" "%4712$s" "%4713$s" "%4714$s" "%4715$s" "%4716$s" "%4717$s" "%4718$s" "%4719$s" "%4720$s" ++"%4721$s" "%4722$s" "%4723$s" "%4724$s" "%4725$s" "%4726$s" "%4727$s" "%4728$s" "%4729$s" "%4730$s" ++"%4731$s" "%4732$s" "%4733$s" "%4734$s" "%4735$s" "%4736$s" "%4737$s" "%4738$s" "%4739$s" "%4740$s" ++"%4741$s" "%4742$s" "%4743$s" "%4744$s" "%4745$s" "%4746$s" "%4747$s" "%4748$s" "%4749$s" "%4750$s" ++"%4751$s" "%4752$s" "%4753$s" "%4754$s" "%4755$s" "%4756$s" "%4757$s" "%4758$s" "%4759$s" "%4760$s" ++"%4761$s" "%4762$s" "%4763$s" "%4764$s" "%4765$s" "%4766$s" "%4767$s" "%4768$s" "%4769$s" "%4770$s" ++"%4771$s" "%4772$s" "%4773$s" "%4774$s" "%4775$s" "%4776$s" "%4777$s" "%4778$s" "%4779$s" "%4780$s" ++"%4781$s" "%4782$s" "%4783$s" "%4784$s" "%4785$s" "%4786$s" "%4787$s" "%4788$s" "%4789$s" "%4790$s" ++"%4791$s" "%4792$s" "%4793$s" "%4794$s" "%4795$s" "%4796$s" "%4797$s" "%4798$s" "%4799$s" "%4800$s" ++"%4801$s" "%4802$s" "%4803$s" "%4804$s" "%4805$s" "%4806$s" "%4807$s" "%4808$s" "%4809$s" "%4810$s" ++"%4811$s" "%4812$s" "%4813$s" "%4814$s" "%4815$s" "%4816$s" "%4817$s" "%4818$s" "%4819$s" "%4820$s" ++"%4821$s" "%4822$s" "%4823$s" "%4824$s" "%4825$s" "%4826$s" "%4827$s" "%4828$s" "%4829$s" "%4830$s" ++"%4831$s" "%4832$s" "%4833$s" "%4834$s" "%4835$s" "%4836$s" "%4837$s" "%4838$s" "%4839$s" "%4840$s" ++"%4841$s" "%4842$s" "%4843$s" "%4844$s" "%4845$s" "%4846$s" "%4847$s" "%4848$s" "%4849$s" "%4850$s" ++"%4851$s" "%4852$s" "%4853$s" "%4854$s" "%4855$s" "%4856$s" "%4857$s" "%4858$s" "%4859$s" "%4860$s" ++"%4861$s" "%4862$s" "%4863$s" "%4864$s" "%4865$s" "%4866$s" "%4867$s" "%4868$s" "%4869$s" "%4870$s" ++"%4871$s" "%4872$s" "%4873$s" "%4874$s" "%4875$s" "%4876$s" "%4877$s" "%4878$s" "%4879$s" "%4880$s" ++"%4881$s" "%4882$s" "%4883$s" "%4884$s" "%4885$s" "%4886$s" "%4887$s" "%4888$s" "%4889$s" "%4890$s" ++"%4891$s" "%4892$s" "%4893$s" "%4894$s" "%4895$s" "%4896$s" "%4897$s" "%4898$s" "%4899$s" "%4900$s" ++"%4901$s" "%4902$s" "%4903$s" "%4904$s" "%4905$s" "%4906$s" "%4907$s" "%4908$s" "%4909$s" "%4910$s" ++"%4911$s" "%4912$s" "%4913$s" "%4914$s" "%4915$s" "%4916$s" "%4917$s" "%4918$s" "%4919$s" "%4920$s" ++"%4921$s" "%4922$s" "%4923$s" "%4924$s" "%4925$s" "%4926$s" "%4927$s" "%4928$s" "%4929$s" "%4930$s" ++"%4931$s" "%4932$s" "%4933$s" "%4934$s" "%4935$s" "%4936$s" "%4937$s" "%4938$s" "%4939$s" "%4940$s" ++"%4941$s" "%4942$s" "%4943$s" "%4944$s" "%4945$s" "%4946$s" "%4947$s" "%4948$s" "%4949$s" "%4950$s" ++"%4951$s" "%4952$s" "%4953$s" "%4954$s" "%4955$s" "%4956$s" "%4957$s" "%4958$s" "%4959$s" "%4960$s" ++"%4961$s" "%4962$s" "%4963$s" "%4964$s" "%4965$s" "%4966$s" "%4967$s" "%4968$s" "%4969$s" "%4970$s" ++"%4971$s" "%4972$s" "%4973$s" "%4974$s" "%4975$s" "%4976$s" "%4977$s" "%4978$s" "%4979$s" "%4980$s" ++"%4981$s" "%4982$s" "%4983$s" "%4984$s" "%4985$s" "%4986$s" "%4987$s" "%4988$s" "%4989$s" "%4990$s" ++"%4991$s" "%4992$s" "%4993$s" "%4994$s" "%4995$s" "%4996$s" "%4997$s" "%4998$s" "%4999$s" "%5000$s" ++"%5001$s" "%5002$s" "%5003$s" "%5004$s" "%5005$s" "%5006$s" "%5007$s" "%5008$s" "%5009$s" "%5010$s" ++"%5011$s" "%5012$s" "%5013$s" "%5014$s" "%5015$s" "%5016$s" "%5017$s" "%5018$s" "%5019$s" "%5020$s" ++"%5021$s" "%5022$s" "%5023$s" "%5024$s" "%5025$s" "%5026$s" "%5027$s" "%5028$s" "%5029$s" "%5030$s" ++"%5031$s" "%5032$s" "%5033$s" "%5034$s" "%5035$s" "%5036$s" "%5037$s" "%5038$s" "%5039$s" "%5040$s" ++"%5041$s" "%5042$s" "%5043$s" "%5044$s" "%5045$s" "%5046$s" "%5047$s" "%5048$s" "%5049$s" "%5050$s" ++"%5051$s" "%5052$s" "%5053$s" "%5054$s" "%5055$s" "%5056$s" "%5057$s" "%5058$s" "%5059$s" "%5060$s" ++"%5061$s" "%5062$s" "%5063$s" "%5064$s" "%5065$s" "%5066$s" "%5067$s" "%5068$s" "%5069$s" "%5070$s" ++"%5071$s" "%5072$s" "%5073$s" "%5074$s" "%5075$s" "%5076$s" "%5077$s" "%5078$s" "%5079$s" "%5080$s" ++"%5081$s" "%5082$s" "%5083$s" "%5084$s" "%5085$s" "%5086$s" "%5087$s" "%5088$s" "%5089$s" "%5090$s" ++"%5091$s" "%5092$s" "%5093$s" "%5094$s" "%5095$s" "%5096$s" "%5097$s" "%5098$s" "%5099$s" "%5100$s" ++"%5101$s" "%5102$s" "%5103$s" "%5104$s" "%5105$s" "%5106$s" "%5107$s" "%5108$s" "%5109$s" "%5110$s" ++"%5111$s" "%5112$s" "%5113$s" "%5114$s" "%5115$s" "%5116$s" "%5117$s" "%5118$s" "%5119$s" "%5120$s" ++"%5121$s" "%5122$s" "%5123$s" "%5124$s" "%5125$s" "%5126$s" "%5127$s" "%5128$s" "%5129$s" "%5130$s" ++"%5131$s" "%5132$s" "%5133$s" "%5134$s" "%5135$s" "%5136$s" "%5137$s" "%5138$s" "%5139$s" "%5140$s" ++"%5141$s" "%5142$s" "%5143$s" "%5144$s" "%5145$s" "%5146$s" "%5147$s" "%5148$s" "%5149$s" "%5150$s" ++"%5151$s" "%5152$s" "%5153$s" "%5154$s" "%5155$s" "%5156$s" "%5157$s" "%5158$s" "%5159$s" "%5160$s" ++"%5161$s" "%5162$s" "%5163$s" "%5164$s" "%5165$s" "%5166$s" "%5167$s" "%5168$s" "%5169$s" "%5170$s" ++"%5171$s" "%5172$s" "%5173$s" "%5174$s" "%5175$s" "%5176$s" "%5177$s" "%5178$s" "%5179$s" "%5180$s" ++"%5181$s" "%5182$s" "%5183$s" "%5184$s" "%5185$s" "%5186$s" "%5187$s" "%5188$s" "%5189$s" "%5190$s" ++"%5191$s" "%5192$s" "%5193$s" "%5194$s" "%5195$s" "%5196$s" "%5197$s" "%5198$s" "%5199$s" "%5200$s" ++"%5201$s" "%5202$s" "%5203$s" "%5204$s" "%5205$s" "%5206$s" "%5207$s" "%5208$s" "%5209$s" "%5210$s" ++"%5211$s" "%5212$s" "%5213$s" "%5214$s" "%5215$s" "%5216$s" "%5217$s" "%5218$s" "%5219$s" "%5220$s" ++"%5221$s" "%5222$s" "%5223$s" "%5224$s" "%5225$s" "%5226$s" "%5227$s" "%5228$s" "%5229$s" "%5230$s" ++"%5231$s" "%5232$s" "%5233$s" "%5234$s" "%5235$s" "%5236$s" "%5237$s" "%5238$s" "%5239$s" "%5240$s" ++"%5241$s" "%5242$s" "%5243$s" "%5244$s" "%5245$s" "%5246$s" "%5247$s" "%5248$s" "%5249$s" "%5250$s" ++"%5251$s" "%5252$s" "%5253$s" "%5254$s" "%5255$s" "%5256$s" "%5257$s" "%5258$s" "%5259$s" "%5260$s" ++"%5261$s" "%5262$s" "%5263$s" "%5264$s" "%5265$s" "%5266$s" "%5267$s" "%5268$s" "%5269$s" "%5270$s" ++"%5271$s" "%5272$s" "%5273$s" "%5274$s" "%5275$s" "%5276$s" "%5277$s" "%5278$s" "%5279$s" "%5280$s" ++"%5281$s" "%5282$s" "%5283$s" "%5284$s" "%5285$s" "%5286$s" "%5287$s" "%5288$s" "%5289$s" "%5290$s" ++"%5291$s" "%5292$s" "%5293$s" "%5294$s" "%5295$s" "%5296$s" "%5297$s" "%5298$s" "%5299$s" "%5300$s" ++"%5301$s" "%5302$s" "%5303$s" "%5304$s" "%5305$s" "%5306$s" "%5307$s" "%5308$s" "%5309$s" "%5310$s" ++"%5311$s" "%5312$s" "%5313$s" "%5314$s" "%5315$s" "%5316$s" "%5317$s" "%5318$s" "%5319$s" "%5320$s" ++"%5321$s" "%5322$s" "%5323$s" "%5324$s" "%5325$s" "%5326$s" "%5327$s" "%5328$s" "%5329$s" "%5330$s" ++"%5331$s" "%5332$s" "%5333$s" "%5334$s" "%5335$s" "%5336$s" "%5337$s" "%5338$s" "%5339$s" "%5340$s" ++"%5341$s" "%5342$s" "%5343$s" "%5344$s" "%5345$s" "%5346$s" "%5347$s" "%5348$s" "%5349$s" "%5350$s" ++"%5351$s" "%5352$s" "%5353$s" "%5354$s" "%5355$s" "%5356$s" "%5357$s" "%5358$s" "%5359$s" "%5360$s" ++"%5361$s" "%5362$s" "%5363$s" "%5364$s" "%5365$s" "%5366$s" "%5367$s" "%5368$s" "%5369$s" "%5370$s" ++"%5371$s" "%5372$s" "%5373$s" "%5374$s" "%5375$s" "%5376$s" "%5377$s" "%5378$s" "%5379$s" "%5380$s" ++"%5381$s" "%5382$s" "%5383$s" "%5384$s" "%5385$s" "%5386$s" "%5387$s" "%5388$s" "%5389$s" "%5390$s" ++"%5391$s" "%5392$s" "%5393$s" "%5394$s" "%5395$s" "%5396$s" "%5397$s" "%5398$s" "%5399$s" "%5400$s" ++"%5401$s" "%5402$s" "%5403$s" "%5404$s" "%5405$s" "%5406$s" "%5407$s" "%5408$s" "%5409$s" "%5410$s" ++"%5411$s" "%5412$s" "%5413$s" "%5414$s" "%5415$s" "%5416$s" "%5417$s" "%5418$s" "%5419$s" "%5420$s" ++"%5421$s" "%5422$s" "%5423$s" "%5424$s" "%5425$s" "%5426$s" "%5427$s" "%5428$s" "%5429$s" "%5430$s" ++"%5431$s" "%5432$s" "%5433$s" "%5434$s" "%5435$s" "%5436$s" "%5437$s" "%5438$s" "%5439$s" "%5440$s" ++"%5441$s" "%5442$s" "%5443$s" "%5444$s" "%5445$s" "%5446$s" "%5447$s" "%5448$s" "%5449$s" "%5450$s" ++"%5451$s" "%5452$s" "%5453$s" "%5454$s" "%5455$s" "%5456$s" "%5457$s" "%5458$s" "%5459$s" "%5460$s" ++"%5461$s" "%5462$s" "%5463$s" "%5464$s" "%5465$s" "%5466$s" "%5467$s" "%5468$s" "%5469$s" "%5470$s" ++"%5471$s" "%5472$s" "%5473$s" "%5474$s" "%5475$s" "%5476$s" "%5477$s" "%5478$s" "%5479$s" "%5480$s" ++"%5481$s" "%5482$s" "%5483$s" "%5484$s" "%5485$s" "%5486$s" "%5487$s" "%5488$s" "%5489$s" "%5490$s" ++"%5491$s" "%5492$s" "%5493$s" "%5494$s" "%5495$s" "%5496$s" "%5497$s" "%5498$s" "%5499$s" "%5500$s" ++"%5501$s" "%5502$s" "%5503$s" "%5504$s" "%5505$s" "%5506$s" "%5507$s" "%5508$s" "%5509$s" "%5510$s" ++"%5511$s" "%5512$s" "%5513$s" "%5514$s" "%5515$s" "%5516$s" "%5517$s" "%5518$s" "%5519$s" "%5520$s" ++"%5521$s" "%5522$s" "%5523$s" "%5524$s" "%5525$s" "%5526$s" "%5527$s" "%5528$s" "%5529$s" "%5530$s" ++"%5531$s" "%5532$s" "%5533$s" "%5534$s" "%5535$s" "%5536$s" "%5537$s" "%5538$s" "%5539$s" "%5540$s" ++"%5541$s" "%5542$s" "%5543$s" "%5544$s" "%5545$s" "%5546$s" "%5547$s" "%5548$s" "%5549$s" "%5550$s" ++"%5551$s" "%5552$s" "%5553$s" "%5554$s" "%5555$s" "%5556$s" "%5557$s" "%5558$s" "%5559$s" "%5560$s" ++"%5561$s" "%5562$s" "%5563$s" "%5564$s" "%5565$s" "%5566$s" "%5567$s" "%5568$s" "%5569$s" "%5570$s" ++"%5571$s" "%5572$s" "%5573$s" "%5574$s" "%5575$s" "%5576$s" "%5577$s" "%5578$s" "%5579$s" "%5580$s" ++"%5581$s" "%5582$s" "%5583$s" "%5584$s" "%5585$s" "%5586$s" "%5587$s" "%5588$s" "%5589$s" "%5590$s" ++"%5591$s" "%5592$s" "%5593$s" "%5594$s" "%5595$s" "%5596$s" "%5597$s" "%5598$s" "%5599$s" "%5600$s" ++"%5601$s" "%5602$s" "%5603$s" "%5604$s" "%5605$s" "%5606$s" "%5607$s" "%5608$s" "%5609$s" "%5610$s" ++"%5611$s" "%5612$s" "%5613$s" "%5614$s" "%5615$s" "%5616$s" "%5617$s" "%5618$s" "%5619$s" "%5620$s" ++"%5621$s" "%5622$s" "%5623$s" "%5624$s" "%5625$s" "%5626$s" "%5627$s" "%5628$s" "%5629$s" "%5630$s" ++"%5631$s" "%5632$s" "%5633$s" "%5634$s" "%5635$s" "%5636$s" "%5637$s" "%5638$s" "%5639$s" "%5640$s" ++"%5641$s" "%5642$s" "%5643$s" "%5644$s" "%5645$s" "%5646$s" "%5647$s" "%5648$s" "%5649$s" "%5650$s" ++"%5651$s" "%5652$s" "%5653$s" "%5654$s" "%5655$s" "%5656$s" "%5657$s" "%5658$s" "%5659$s" "%5660$s" ++"%5661$s" "%5662$s" "%5663$s" "%5664$s" "%5665$s" "%5666$s" "%5667$s" "%5668$s" "%5669$s" "%5670$s" ++"%5671$s" "%5672$s" "%5673$s" "%5674$s" "%5675$s" "%5676$s" "%5677$s" "%5678$s" "%5679$s" "%5680$s" ++"%5681$s" "%5682$s" "%5683$s" "%5684$s" "%5685$s" "%5686$s" "%5687$s" "%5688$s" "%5689$s" "%5690$s" ++"%5691$s" "%5692$s" "%5693$s" "%5694$s" "%5695$s" "%5696$s" "%5697$s" "%5698$s" "%5699$s" "%5700$s" ++"%5701$s" "%5702$s" "%5703$s" "%5704$s" "%5705$s" "%5706$s" "%5707$s" "%5708$s" "%5709$s" "%5710$s" ++"%5711$s" "%5712$s" "%5713$s" "%5714$s" "%5715$s" "%5716$s" "%5717$s" "%5718$s" "%5719$s" "%5720$s" ++"%5721$s" "%5722$s" "%5723$s" "%5724$s" "%5725$s" "%5726$s" "%5727$s" "%5728$s" "%5729$s" "%5730$s" ++"%5731$s" "%5732$s" "%5733$s" "%5734$s" "%5735$s" "%5736$s" "%5737$s" "%5738$s" "%5739$s" "%5740$s" ++"%5741$s" "%5742$s" "%5743$s" "%5744$s" "%5745$s" "%5746$s" "%5747$s" "%5748$s" "%5749$s" "%5750$s" ++"%5751$s" "%5752$s" "%5753$s" "%5754$s" "%5755$s" "%5756$s" "%5757$s" "%5758$s" "%5759$s" "%5760$s" ++"%5761$s" "%5762$s" "%5763$s" "%5764$s" "%5765$s" "%5766$s" "%5767$s" "%5768$s" "%5769$s" "%5770$s" ++"%5771$s" "%5772$s" "%5773$s" "%5774$s" "%5775$s" "%5776$s" "%5777$s" "%5778$s" "%5779$s" "%5780$s" ++"%5781$s" "%5782$s" "%5783$s" "%5784$s" "%5785$s" "%5786$s" "%5787$s" "%5788$s" "%5789$s" "%5790$s" ++"%5791$s" "%5792$s" "%5793$s" "%5794$s" "%5795$s" "%5796$s" "%5797$s" "%5798$s" "%5799$s" "%5800$s" ++"%5801$s" "%5802$s" "%5803$s" "%5804$s" "%5805$s" "%5806$s" "%5807$s" "%5808$s" "%5809$s" "%5810$s" ++"%5811$s" "%5812$s" "%5813$s" "%5814$s" "%5815$s" "%5816$s" "%5817$s" "%5818$s" "%5819$s" "%5820$s" ++"%5821$s" "%5822$s" "%5823$s" "%5824$s" "%5825$s" "%5826$s" "%5827$s" "%5828$s" "%5829$s" "%5830$s" ++"%5831$s" "%5832$s" "%5833$s" "%5834$s" "%5835$s" "%5836$s" "%5837$s" "%5838$s" "%5839$s" "%5840$s" ++"%5841$s" "%5842$s" "%5843$s" "%5844$s" "%5845$s" "%5846$s" "%5847$s" "%5848$s" "%5849$s" "%5850$s" ++"%5851$s" "%5852$s" "%5853$s" "%5854$s" "%5855$s" "%5856$s" "%5857$s" "%5858$s" "%5859$s" "%5860$s" ++"%5861$s" "%5862$s" "%5863$s" "%5864$s" "%5865$s" "%5866$s" "%5867$s" "%5868$s" "%5869$s" "%5870$s" ++"%5871$s" "%5872$s" "%5873$s" "%5874$s" "%5875$s" "%5876$s" "%5877$s" "%5878$s" "%5879$s" "%5880$s" ++"%5881$s" "%5882$s" "%5883$s" "%5884$s" "%5885$s" "%5886$s" "%5887$s" "%5888$s" "%5889$s" "%5890$s" ++"%5891$s" "%5892$s" "%5893$s" "%5894$s" "%5895$s" "%5896$s" "%5897$s" "%5898$s" "%5899$s" "%5900$s" ++"%5901$s" "%5902$s" "%5903$s" "%5904$s" "%5905$s" "%5906$s" "%5907$s" "%5908$s" "%5909$s" "%5910$s" ++"%5911$s" "%5912$s" "%5913$s" "%5914$s" "%5915$s" "%5916$s" "%5917$s" "%5918$s" "%5919$s" "%5920$s" ++"%5921$s" "%5922$s" "%5923$s" "%5924$s" "%5925$s" "%5926$s" "%5927$s" "%5928$s" "%5929$s" "%5930$s" ++"%5931$s" "%5932$s" "%5933$s" "%5934$s" "%5935$s" "%5936$s" "%5937$s" "%5938$s" "%5939$s" "%5940$s" ++"%5941$s" "%5942$s" "%5943$s" "%5944$s" "%5945$s" "%5946$s" "%5947$s" "%5948$s" "%5949$s" "%5950$s" ++"%5951$s" "%5952$s" "%5953$s" "%5954$s" "%5955$s" "%5956$s" "%5957$s" "%5958$s" "%5959$s" "%5960$s" ++"%5961$s" "%5962$s" "%5963$s" "%5964$s" "%5965$s" "%5966$s" "%5967$s" "%5968$s" "%5969$s" "%5970$s" ++"%5971$s" "%5972$s" "%5973$s" "%5974$s" "%5975$s" "%5976$s" "%5977$s" "%5978$s" "%5979$s" "%5980$s" ++"%5981$s" "%5982$s" "%5983$s" "%5984$s" "%5985$s" "%5986$s" "%5987$s" "%5988$s" "%5989$s" "%5990$s" ++"%5991$s" "%5992$s" "%5993$s" "%5994$s" "%5995$s" "%5996$s" "%5997$s" "%5998$s" "%5999$s" "%6000$s" ++"%6001$s" "%6002$s" "%6003$s" "%6004$s" "%6005$s" "%6006$s" "%6007$s" "%6008$s" "%6009$s" "%6010$s" ++"%6011$s" "%6012$s" "%6013$s" "%6014$s" "%6015$s" "%6016$s" "%6017$s" "%6018$s" "%6019$s" "%6020$s" ++"%6021$s" "%6022$s" "%6023$s" "%6024$s" "%6025$s" "%6026$s" "%6027$s" "%6028$s" "%6029$s" "%6030$s" ++"%6031$s" "%6032$s" "%6033$s" "%6034$s" "%6035$s" "%6036$s" "%6037$s" "%6038$s" "%6039$s" "%6040$s" ++"%6041$s" "%6042$s" "%6043$s" "%6044$s" "%6045$s" "%6046$s" "%6047$s" "%6048$s" "%6049$s" "%6050$s" ++"%6051$s" "%6052$s" "%6053$s" "%6054$s" "%6055$s" "%6056$s" "%6057$s" "%6058$s" "%6059$s" "%6060$s" ++"%6061$s" "%6062$s" "%6063$s" "%6064$s" "%6065$s" "%6066$s" "%6067$s" "%6068$s" "%6069$s" "%6070$s" ++"%6071$s" "%6072$s" "%6073$s" "%6074$s" "%6075$s" "%6076$s" "%6077$s" "%6078$s" "%6079$s" "%6080$s" ++"%6081$s" "%6082$s" "%6083$s" "%6084$s" "%6085$s" "%6086$s" "%6087$s" "%6088$s" "%6089$s" "%6090$s" ++"%6091$s" "%6092$s" "%6093$s" "%6094$s" "%6095$s" "%6096$s" "%6097$s" "%6098$s" "%6099$s" "%6100$s" ++"%6101$s" "%6102$s" "%6103$s" "%6104$s" "%6105$s" "%6106$s" "%6107$s" "%6108$s" "%6109$s" "%6110$s" ++"%6111$s" "%6112$s" "%6113$s" "%6114$s" "%6115$s" "%6116$s" "%6117$s" "%6118$s" "%6119$s" "%6120$s" ++"%6121$s" "%6122$s" "%6123$s" "%6124$s" "%6125$s" "%6126$s" "%6127$s" "%6128$s" "%6129$s" "%6130$s" ++"%6131$s" "%6132$s" "%6133$s" "%6134$s" "%6135$s" "%6136$s" "%6137$s" "%6138$s" "%6139$s" "%6140$s" ++"%6141$s" "%6142$s" "%6143$s" "%6144$s" "%6145$s" "%6146$s" "%6147$s" "%6148$s" "%6149$s" "%6150$s" ++"%6151$s" "%6152$s" "%6153$s" "%6154$s" "%6155$s" "%6156$s" "%6157$s" "%6158$s" "%6159$s" "%6160$s" ++"%6161$s" "%6162$s" "%6163$s" "%6164$s" "%6165$s" "%6166$s" "%6167$s" "%6168$s" "%6169$s" "%6170$s" ++"%6171$s" "%6172$s" "%6173$s" "%6174$s" "%6175$s" "%6176$s" "%6177$s" "%6178$s" "%6179$s" "%6180$s" ++"%6181$s" "%6182$s" "%6183$s" "%6184$s" "%6185$s" "%6186$s" "%6187$s" "%6188$s" "%6189$s" "%6190$s" ++"%6191$s" "%6192$s" "%6193$s" "%6194$s" "%6195$s" "%6196$s" "%6197$s" "%6198$s" "%6199$s" "%6200$s" ++"%6201$s" "%6202$s" "%6203$s" "%6204$s" "%6205$s" "%6206$s" "%6207$s" "%6208$s" "%6209$s" "%6210$s" ++"%6211$s" "%6212$s" "%6213$s" "%6214$s" "%6215$s" "%6216$s" "%6217$s" "%6218$s" "%6219$s" "%6220$s" ++"%6221$s" "%6222$s" "%6223$s" "%6224$s" "%6225$s" "%6226$s" "%6227$s" "%6228$s" "%6229$s" "%6230$s" ++"%6231$s" "%6232$s" "%6233$s" "%6234$s" "%6235$s" "%6236$s" "%6237$s" "%6238$s" "%6239$s" "%6240$s" ++"%6241$s" "%6242$s" "%6243$s" "%6244$s" "%6245$s" "%6246$s" "%6247$s" "%6248$s" "%6249$s" "%6250$s" ++"%6251$s" "%6252$s" "%6253$s" "%6254$s" "%6255$s" "%6256$s" "%6257$s" "%6258$s" "%6259$s" "%6260$s" ++"%6261$s" "%6262$s" "%6263$s" "%6264$s" "%6265$s" "%6266$s" "%6267$s" "%6268$s" "%6269$s" "%6270$s" ++"%6271$s" "%6272$s" "%6273$s" "%6274$s" "%6275$s" "%6276$s" "%6277$s" "%6278$s" "%6279$s" "%6280$s" ++"%6281$s" "%6282$s" "%6283$s" "%6284$s" "%6285$s" "%6286$s" "%6287$s" "%6288$s" "%6289$s" "%6290$s" ++"%6291$s" "%6292$s" "%6293$s" "%6294$s" "%6295$s" "%6296$s" "%6297$s" "%6298$s" "%6299$s" "%6300$s" ++"%6301$s" "%6302$s" "%6303$s" "%6304$s" "%6305$s" "%6306$s" "%6307$s" "%6308$s" "%6309$s" "%6310$s" ++"%6311$s" "%6312$s" "%6313$s" "%6314$s" "%6315$s" "%6316$s" "%6317$s" "%6318$s" "%6319$s" "%6320$s" ++"%6321$s" "%6322$s" "%6323$s" "%6324$s" "%6325$s" "%6326$s" "%6327$s" "%6328$s" "%6329$s" "%6330$s" ++"%6331$s" "%6332$s" "%6333$s" "%6334$s" "%6335$s" "%6336$s" "%6337$s" "%6338$s" "%6339$s" "%6340$s" ++"%6341$s" "%6342$s" "%6343$s" "%6344$s" "%6345$s" "%6346$s" "%6347$s" "%6348$s" "%6349$s" "%6350$s" ++"%6351$s" "%6352$s" "%6353$s" "%6354$s" "%6355$s" "%6356$s" "%6357$s" "%6358$s" "%6359$s" "%6360$s" ++"%6361$s" "%6362$s" "%6363$s" "%6364$s" "%6365$s" "%6366$s" "%6367$s" "%6368$s" "%6369$s" "%6370$s" ++"%6371$s" "%6372$s" "%6373$s" "%6374$s" "%6375$s" "%6376$s" "%6377$s" "%6378$s" "%6379$s" "%6380$s" ++"%6381$s" "%6382$s" "%6383$s" "%6384$s" "%6385$s" "%6386$s" "%6387$s" "%6388$s" "%6389$s" "%6390$s" ++"%6391$s" "%6392$s" "%6393$s" "%6394$s" "%6395$s" "%6396$s" "%6397$s" "%6398$s" "%6399$s" "%6400$s" ++"%6401$s" "%6402$s" "%6403$s" "%6404$s" "%6405$s" "%6406$s" "%6407$s" "%6408$s" "%6409$s" "%6410$s" ++"%6411$s" "%6412$s" "%6413$s" "%6414$s" "%6415$s" "%6416$s" "%6417$s" "%6418$s" "%6419$s" "%6420$s" ++"%6421$s" "%6422$s" "%6423$s" "%6424$s" "%6425$s" "%6426$s" "%6427$s" "%6428$s" "%6429$s" "%6430$s" ++"%6431$s" "%6432$s" "%6433$s" "%6434$s" "%6435$s" "%6436$s" "%6437$s" "%6438$s" "%6439$s" "%6440$s" ++"%6441$s" "%6442$s" "%6443$s" "%6444$s" "%6445$s" "%6446$s" "%6447$s" "%6448$s" "%6449$s" "%6450$s" ++"%6451$s" "%6452$s" "%6453$s" "%6454$s" "%6455$s" "%6456$s" "%6457$s" "%6458$s" "%6459$s" "%6460$s" ++"%6461$s" "%6462$s" "%6463$s" "%6464$s" "%6465$s" "%6466$s" "%6467$s" "%6468$s" "%6469$s" "%6470$s" ++"%6471$s" "%6472$s" "%6473$s" "%6474$s" "%6475$s" "%6476$s" "%6477$s" "%6478$s" "%6479$s" "%6480$s" ++"%6481$s" "%6482$s" "%6483$s" "%6484$s" "%6485$s" "%6486$s" "%6487$s" "%6488$s" "%6489$s" "%6490$s" ++"%6491$s" "%6492$s" "%6493$s" "%6494$s" "%6495$s" "%6496$s" "%6497$s" "%6498$s" "%6499$s" "%6500$s" ++"%6501$s" "%6502$s" "%6503$s" "%6504$s" "%6505$s" "%6506$s" "%6507$s" "%6508$s" "%6509$s" "%6510$s" ++"%6511$s" "%6512$s" "%6513$s" "%6514$s" "%6515$s" "%6516$s" "%6517$s" "%6518$s" "%6519$s" "%6520$s" ++"%6521$s" "%6522$s" "%6523$s" "%6524$s" "%6525$s" "%6526$s" "%6527$s" "%6528$s" "%6529$s" "%6530$s" ++"%6531$s" "%6532$s" "%6533$s" "%6534$s" "%6535$s" "%6536$s" "%6537$s" "%6538$s" "%6539$s" "%6540$s" ++"%6541$s" "%6542$s" "%6543$s" "%6544$s" "%6545$s" "%6546$s" "%6547$s" "%6548$s" "%6549$s" "%6550$s" ++"%6551$s" "%6552$s" "%6553$s" "%6554$s" "%6555$s" "%6556$s" "%6557$s" "%6558$s" "%6559$s" "%6560$s" ++"%6561$s" "%6562$s" "%6563$s" "%6564$s" "%6565$s" "%6566$s" "%6567$s" "%6568$s" "%6569$s" "%6570$s" ++"%6571$s" "%6572$s" "%6573$s" "%6574$s" "%6575$s" "%6576$s" "%6577$s" "%6578$s" "%6579$s" "%6580$s" ++"%6581$s" "%6582$s" "%6583$s" "%6584$s" "%6585$s" "%6586$s" "%6587$s" "%6588$s" "%6589$s" "%6590$s" ++"%6591$s" "%6592$s" "%6593$s" "%6594$s" "%6595$s" "%6596$s" "%6597$s" "%6598$s" "%6599$s" "%6600$s" ++"%6601$s" "%6602$s" "%6603$s" "%6604$s" "%6605$s" "%6606$s" "%6607$s" "%6608$s" "%6609$s" "%6610$s" ++"%6611$s" "%6612$s" "%6613$s" "%6614$s" "%6615$s" "%6616$s" "%6617$s" "%6618$s" "%6619$s" "%6620$s" ++"%6621$s" "%6622$s" "%6623$s" "%6624$s" "%6625$s" "%6626$s" "%6627$s" "%6628$s" "%6629$s" "%6630$s" ++"%6631$s" "%6632$s" "%6633$s" "%6634$s" "%6635$s" "%6636$s" "%6637$s" "%6638$s" "%6639$s" "%6640$s" ++"%6641$s" "%6642$s" "%6643$s" "%6644$s" "%6645$s" "%6646$s" "%6647$s" "%6648$s" "%6649$s" "%6650$s" ++"%6651$s" "%6652$s" "%6653$s" "%6654$s" "%6655$s" "%6656$s" "%6657$s" "%6658$s" "%6659$s" "%6660$s" ++"%6661$s" "%6662$s" "%6663$s" "%6664$s" "%6665$s" "%6666$s" "%6667$s" "%6668$s" "%6669$s" "%6670$s" ++"%6671$s" "%6672$s" "%6673$s" "%6674$s" "%6675$s" "%6676$s" "%6677$s" "%6678$s" "%6679$s" "%6680$s" ++"%6681$s" "%6682$s" "%6683$s" "%6684$s" "%6685$s" "%6686$s" "%6687$s" "%6688$s" "%6689$s" "%6690$s" ++"%6691$s" "%6692$s" "%6693$s" "%6694$s" "%6695$s" "%6696$s" "%6697$s" "%6698$s" "%6699$s" "%6700$s" ++"%6701$s" "%6702$s" "%6703$s" "%6704$s" "%6705$s" "%6706$s" "%6707$s" "%6708$s" "%6709$s" "%6710$s" ++"%6711$s" "%6712$s" "%6713$s" "%6714$s" "%6715$s" "%6716$s" "%6717$s" "%6718$s" "%6719$s" "%6720$s" ++"%6721$s" "%6722$s" "%6723$s" "%6724$s" "%6725$s" "%6726$s" "%6727$s" "%6728$s" "%6729$s" "%6730$s" ++"%6731$s" "%6732$s" "%6733$s" "%6734$s" "%6735$s" "%6736$s" "%6737$s" "%6738$s" "%6739$s" "%6740$s" ++"%6741$s" "%6742$s" "%6743$s" "%6744$s" "%6745$s" "%6746$s" "%6747$s" "%6748$s" "%6749$s" "%6750$s" ++"%6751$s" "%6752$s" "%6753$s" "%6754$s" "%6755$s" "%6756$s" "%6757$s" "%6758$s" "%6759$s" "%6760$s" ++"%6761$s" "%6762$s" "%6763$s" "%6764$s" "%6765$s" "%6766$s" "%6767$s" "%6768$s" "%6769$s" "%6770$s" ++"%6771$s" "%6772$s" "%6773$s" "%6774$s" "%6775$s" "%6776$s" "%6777$s" "%6778$s" "%6779$s" "%6780$s" ++"%6781$s" "%6782$s" "%6783$s" "%6784$s" "%6785$s" "%6786$s" "%6787$s" "%6788$s" "%6789$s" "%6790$s" ++"%6791$s" "%6792$s" "%6793$s" "%6794$s" "%6795$s" "%6796$s" "%6797$s" "%6798$s" "%6799$s" "%6800$s" ++"%6801$s" "%6802$s" "%6803$s" "%6804$s" "%6805$s" "%6806$s" "%6807$s" "%6808$s" "%6809$s" "%6810$s" ++"%6811$s" "%6812$s" "%6813$s" "%6814$s" "%6815$s" "%6816$s" "%6817$s" "%6818$s" "%6819$s" "%6820$s" ++"%6821$s" "%6822$s" "%6823$s" "%6824$s" "%6825$s" "%6826$s" "%6827$s" "%6828$s" "%6829$s" "%6830$s" ++"%6831$s" "%6832$s" "%6833$s" "%6834$s" "%6835$s" "%6836$s" "%6837$s" "%6838$s" "%6839$s" "%6840$s" ++"%6841$s" "%6842$s" "%6843$s" "%6844$s" "%6845$s" "%6846$s" "%6847$s" "%6848$s" "%6849$s" "%6850$s" ++"%6851$s" "%6852$s" "%6853$s" "%6854$s" "%6855$s" "%6856$s" "%6857$s" "%6858$s" "%6859$s" "%6860$s" ++"%6861$s" "%6862$s" "%6863$s" "%6864$s" "%6865$s" "%6866$s" "%6867$s" "%6868$s" "%6869$s" "%6870$s" ++"%6871$s" "%6872$s" "%6873$s" "%6874$s" "%6875$s" "%6876$s" "%6877$s" "%6878$s" "%6879$s" "%6880$s" ++"%6881$s" "%6882$s" "%6883$s" "%6884$s" "%6885$s" "%6886$s" "%6887$s" "%6888$s" "%6889$s" "%6890$s" ++"%6891$s" "%6892$s" "%6893$s" "%6894$s" "%6895$s" "%6896$s" "%6897$s" "%6898$s" "%6899$s" "%6900$s" ++"%6901$s" "%6902$s" "%6903$s" "%6904$s" "%6905$s" "%6906$s" "%6907$s" "%6908$s" "%6909$s" "%6910$s" ++"%6911$s" "%6912$s" "%6913$s" "%6914$s" "%6915$s" "%6916$s" "%6917$s" "%6918$s" "%6919$s" "%6920$s" ++"%6921$s" "%6922$s" "%6923$s" "%6924$s" "%6925$s" "%6926$s" "%6927$s" "%6928$s" "%6929$s" "%6930$s" ++"%6931$s" "%6932$s" "%6933$s" "%6934$s" "%6935$s" "%6936$s" "%6937$s" "%6938$s" "%6939$s" "%6940$s" ++"%6941$s" "%6942$s" "%6943$s" "%6944$s" "%6945$s" "%6946$s" "%6947$s" "%6948$s" "%6949$s" "%6950$s" ++"%6951$s" "%6952$s" "%6953$s" "%6954$s" "%6955$s" "%6956$s" "%6957$s" "%6958$s" "%6959$s" "%6960$s" ++"%6961$s" "%6962$s" "%6963$s" "%6964$s" "%6965$s" "%6966$s" "%6967$s" "%6968$s" "%6969$s" "%6970$s" ++"%6971$s" "%6972$s" "%6973$s" "%6974$s" "%6975$s" "%6976$s" "%6977$s" "%6978$s" "%6979$s" "%6980$s" ++"%6981$s" "%6982$s" "%6983$s" "%6984$s" "%6985$s" "%6986$s" "%6987$s" "%6988$s" "%6989$s" "%6990$s" ++"%6991$s" "%6992$s" "%6993$s" "%6994$s" "%6995$s" "%6996$s" "%6997$s" "%6998$s" "%6999$s" "%7000$s" ++"%7001$s" "%7002$s" "%7003$s" "%7004$s" "%7005$s" "%7006$s" "%7007$s" "%7008$s" "%7009$s" "%7010$s" ++"%7011$s" "%7012$s" "%7013$s" "%7014$s" "%7015$s" "%7016$s" "%7017$s" "%7018$s" "%7019$s" "%7020$s" ++"%7021$s" "%7022$s" "%7023$s" "%7024$s" "%7025$s" "%7026$s" "%7027$s" "%7028$s" "%7029$s" "%7030$s" ++"%7031$s" "%7032$s" "%7033$s" "%7034$s" "%7035$s" "%7036$s" "%7037$s" "%7038$s" "%7039$s" "%7040$s" ++"%7041$s" "%7042$s" "%7043$s" "%7044$s" "%7045$s" "%7046$s" "%7047$s" "%7048$s" "%7049$s" "%7050$s" ++"%7051$s" "%7052$s" "%7053$s" "%7054$s" "%7055$s" "%7056$s" "%7057$s" "%7058$s" "%7059$s" "%7060$s" ++"%7061$s" "%7062$s" "%7063$s" "%7064$s" "%7065$s" "%7066$s" "%7067$s" "%7068$s" "%7069$s" "%7070$s" ++"%7071$s" "%7072$s" "%7073$s" "%7074$s" "%7075$s" "%7076$s" "%7077$s" "%7078$s" "%7079$s" "%7080$s" ++"%7081$s" "%7082$s" "%7083$s" "%7084$s" "%7085$s" "%7086$s" "%7087$s" "%7088$s" "%7089$s" "%7090$s" ++"%7091$s" "%7092$s" "%7093$s" "%7094$s" "%7095$s" "%7096$s" "%7097$s" "%7098$s" "%7099$s" "%7100$s" ++"%7101$s" "%7102$s" "%7103$s" "%7104$s" "%7105$s" "%7106$s" "%7107$s" "%7108$s" "%7109$s" "%7110$s" ++"%7111$s" "%7112$s" "%7113$s" "%7114$s" "%7115$s" "%7116$s" "%7117$s" "%7118$s" "%7119$s" "%7120$s" ++"%7121$s" "%7122$s" "%7123$s" "%7124$s" "%7125$s" "%7126$s" "%7127$s" "%7128$s" "%7129$s" "%7130$s" ++"%7131$s" "%7132$s" "%7133$s" "%7134$s" "%7135$s" "%7136$s" "%7137$s" "%7138$s" "%7139$s" "%7140$s" ++"%7141$s" "%7142$s" "%7143$s" "%7144$s" "%7145$s" "%7146$s" "%7147$s" "%7148$s" "%7149$s" "%7150$s" ++"%7151$s" "%7152$s" "%7153$s" "%7154$s" "%7155$s" "%7156$s" "%7157$s" "%7158$s" "%7159$s" "%7160$s" ++"%7161$s" "%7162$s" "%7163$s" "%7164$s" "%7165$s" "%7166$s" "%7167$s" "%7168$s" "%7169$s" "%7170$s" ++"%7171$s" "%7172$s" "%7173$s" "%7174$s" "%7175$s" "%7176$s" "%7177$s" "%7178$s" "%7179$s" "%7180$s" ++"%7181$s" "%7182$s" "%7183$s" "%7184$s" "%7185$s" "%7186$s" "%7187$s" "%7188$s" "%7189$s" "%7190$s" ++"%7191$s" "%7192$s" "%7193$s" "%7194$s" "%7195$s" "%7196$s" "%7197$s" "%7198$s" "%7199$s" "%7200$s" ++"%7201$s" "%7202$s" "%7203$s" "%7204$s" "%7205$s" "%7206$s" "%7207$s" "%7208$s" "%7209$s" "%7210$s" ++"%7211$s" "%7212$s" "%7213$s" "%7214$s" "%7215$s" "%7216$s" "%7217$s" "%7218$s" "%7219$s" "%7220$s" ++"%7221$s" "%7222$s" "%7223$s" "%7224$s" "%7225$s" "%7226$s" "%7227$s" "%7228$s" "%7229$s" "%7230$s" ++"%7231$s" "%7232$s" "%7233$s" "%7234$s" "%7235$s" "%7236$s" "%7237$s" "%7238$s" "%7239$s" "%7240$s" ++"%7241$s" "%7242$s" "%7243$s" "%7244$s" "%7245$s" "%7246$s" "%7247$s" "%7248$s" "%7249$s" "%7250$s" ++"%7251$s" "%7252$s" "%7253$s" "%7254$s" "%7255$s" "%7256$s" "%7257$s" "%7258$s" "%7259$s" "%7260$s" ++"%7261$s" "%7262$s" "%7263$s" "%7264$s" "%7265$s" "%7266$s" "%7267$s" "%7268$s" "%7269$s" "%7270$s" ++"%7271$s" "%7272$s" "%7273$s" "%7274$s" "%7275$s" "%7276$s" "%7277$s" "%7278$s" "%7279$s" "%7280$s" ++"%7281$s" "%7282$s" "%7283$s" "%7284$s" "%7285$s" "%7286$s" "%7287$s" "%7288$s" "%7289$s" "%7290$s" ++"%7291$s" "%7292$s" "%7293$s" "%7294$s" "%7295$s" "%7296$s" "%7297$s" "%7298$s" "%7299$s" "%7300$s" ++"%7301$s" "%7302$s" "%7303$s" "%7304$s" "%7305$s" "%7306$s" "%7307$s" "%7308$s" "%7309$s" "%7310$s" ++"%7311$s" "%7312$s" "%7313$s" "%7314$s" "%7315$s" "%7316$s" "%7317$s" "%7318$s" "%7319$s" "%7320$s" ++"%7321$s" "%7322$s" "%7323$s" "%7324$s" "%7325$s" "%7326$s" "%7327$s" "%7328$s" "%7329$s" "%7330$s" ++"%7331$s" "%7332$s" "%7333$s" "%7334$s" "%7335$s" "%7336$s" "%7337$s" "%7338$s" "%7339$s" "%7340$s" ++"%7341$s" "%7342$s" "%7343$s" "%7344$s" "%7345$s" "%7346$s" "%7347$s" "%7348$s" "%7349$s" "%7350$s" ++"%7351$s" "%7352$s" "%7353$s" "%7354$s" "%7355$s" "%7356$s" "%7357$s" "%7358$s" "%7359$s" "%7360$s" ++"%7361$s" "%7362$s" "%7363$s" "%7364$s" "%7365$s" "%7366$s" "%7367$s" "%7368$s" "%7369$s" "%7370$s" ++"%7371$s" "%7372$s" "%7373$s" "%7374$s" "%7375$s" "%7376$s" "%7377$s" "%7378$s" "%7379$s" "%7380$s" ++"%7381$s" "%7382$s" "%7383$s" "%7384$s" "%7385$s" "%7386$s" "%7387$s" "%7388$s" "%7389$s" "%7390$s" ++"%7391$s" "%7392$s" "%7393$s" "%7394$s" "%7395$s" "%7396$s" "%7397$s" "%7398$s" "%7399$s" "%7400$s" ++"%7401$s" "%7402$s" "%7403$s" "%7404$s" "%7405$s" "%7406$s" "%7407$s" "%7408$s" "%7409$s" "%7410$s" ++"%7411$s" "%7412$s" "%7413$s" "%7414$s" "%7415$s" "%7416$s" "%7417$s" "%7418$s" "%7419$s" "%7420$s" ++"%7421$s" "%7422$s" "%7423$s" "%7424$s" "%7425$s" "%7426$s" "%7427$s" "%7428$s" "%7429$s" "%7430$s" ++"%7431$s" "%7432$s" "%7433$s" "%7434$s" "%7435$s" "%7436$s" "%7437$s" "%7438$s" "%7439$s" "%7440$s" ++"%7441$s" "%7442$s" "%7443$s" "%7444$s" "%7445$s" "%7446$s" "%7447$s" "%7448$s" "%7449$s" "%7450$s" ++"%7451$s" "%7452$s" "%7453$s" "%7454$s" "%7455$s" "%7456$s" "%7457$s" "%7458$s" "%7459$s" "%7460$s" ++"%7461$s" "%7462$s" "%7463$s" "%7464$s" "%7465$s" "%7466$s" "%7467$s" "%7468$s" "%7469$s" "%7470$s" ++"%7471$s" "%7472$s" "%7473$s" "%7474$s" "%7475$s" "%7476$s" "%7477$s" "%7478$s" "%7479$s" "%7480$s" ++"%7481$s" "%7482$s" "%7483$s" "%7484$s" "%7485$s" "%7486$s" "%7487$s" "%7488$s" "%7489$s" "%7490$s" ++"%7491$s" "%7492$s" "%7493$s" "%7494$s" "%7495$s" "%7496$s" "%7497$s" "%7498$s" "%7499$s" "%7500$s" ++"%7501$s" "%7502$s" "%7503$s" "%7504$s" "%7505$s" "%7506$s" "%7507$s" "%7508$s" "%7509$s" "%7510$s" ++"%7511$s" "%7512$s" "%7513$s" "%7514$s" "%7515$s" "%7516$s" "%7517$s" "%7518$s" "%7519$s" "%7520$s" ++"%7521$s" "%7522$s" "%7523$s" "%7524$s" "%7525$s" "%7526$s" "%7527$s" "%7528$s" "%7529$s" "%7530$s" ++"%7531$s" "%7532$s" "%7533$s" "%7534$s" "%7535$s" "%7536$s" "%7537$s" "%7538$s" "%7539$s" "%7540$s" ++"%7541$s" "%7542$s" "%7543$s" "%7544$s" "%7545$s" "%7546$s" "%7547$s" "%7548$s" "%7549$s" "%7550$s" ++"%7551$s" "%7552$s" "%7553$s" "%7554$s" "%7555$s" "%7556$s" "%7557$s" "%7558$s" "%7559$s" "%7560$s" ++"%7561$s" "%7562$s" "%7563$s" "%7564$s" "%7565$s" "%7566$s" "%7567$s" "%7568$s" "%7569$s" "%7570$s" ++"%7571$s" "%7572$s" "%7573$s" "%7574$s" "%7575$s" "%7576$s" "%7577$s" "%7578$s" "%7579$s" "%7580$s" ++"%7581$s" "%7582$s" "%7583$s" "%7584$s" "%7585$s" "%7586$s" "%7587$s" "%7588$s" "%7589$s" "%7590$s" ++"%7591$s" "%7592$s" "%7593$s" "%7594$s" "%7595$s" "%7596$s" "%7597$s" "%7598$s" "%7599$s" "%7600$s" ++"%7601$s" "%7602$s" "%7603$s" "%7604$s" "%7605$s" "%7606$s" "%7607$s" "%7608$s" "%7609$s" "%7610$s" ++"%7611$s" "%7612$s" "%7613$s" "%7614$s" "%7615$s" "%7616$s" "%7617$s" "%7618$s" "%7619$s" "%7620$s" ++"%7621$s" "%7622$s" "%7623$s" "%7624$s" "%7625$s" "%7626$s" "%7627$s" "%7628$s" "%7629$s" "%7630$s" ++"%7631$s" "%7632$s" "%7633$s" "%7634$s" "%7635$s" "%7636$s" "%7637$s" "%7638$s" "%7639$s" "%7640$s" ++"%7641$s" "%7642$s" "%7643$s" "%7644$s" "%7645$s" "%7646$s" "%7647$s" "%7648$s" "%7649$s" "%7650$s" ++"%7651$s" "%7652$s" "%7653$s" "%7654$s" "%7655$s" "%7656$s" "%7657$s" "%7658$s" "%7659$s" "%7660$s" ++"%7661$s" "%7662$s" "%7663$s" "%7664$s" "%7665$s" "%7666$s" "%7667$s" "%7668$s" "%7669$s" "%7670$s" ++"%7671$s" "%7672$s" "%7673$s" "%7674$s" "%7675$s" "%7676$s" "%7677$s" "%7678$s" "%7679$s" "%7680$s" ++"%7681$s" "%7682$s" "%7683$s" "%7684$s" "%7685$s" "%7686$s" "%7687$s" "%7688$s" "%7689$s" "%7690$s" ++"%7691$s" "%7692$s" "%7693$s" "%7694$s" "%7695$s" "%7696$s" "%7697$s" "%7698$s" "%7699$s" "%7700$s" ++"%7701$s" "%7702$s" "%7703$s" "%7704$s" "%7705$s" "%7706$s" "%7707$s" "%7708$s" "%7709$s" "%7710$s" ++"%7711$s" "%7712$s" "%7713$s" "%7714$s" "%7715$s" "%7716$s" "%7717$s" "%7718$s" "%7719$s" "%7720$s" ++"%7721$s" "%7722$s" "%7723$s" "%7724$s" "%7725$s" "%7726$s" "%7727$s" "%7728$s" "%7729$s" "%7730$s" ++"%7731$s" "%7732$s" "%7733$s" "%7734$s" "%7735$s" "%7736$s" "%7737$s" "%7738$s" "%7739$s" "%7740$s" ++"%7741$s" "%7742$s" "%7743$s" "%7744$s" "%7745$s" "%7746$s" "%7747$s" "%7748$s" "%7749$s" "%7750$s" ++"%7751$s" "%7752$s" "%7753$s" "%7754$s" "%7755$s" "%7756$s" "%7757$s" "%7758$s" "%7759$s" "%7760$s" ++"%7761$s" "%7762$s" "%7763$s" "%7764$s" "%7765$s" "%7766$s" "%7767$s" "%7768$s" "%7769$s" "%7770$s" ++"%7771$s" "%7772$s" "%7773$s" "%7774$s" "%7775$s" "%7776$s" "%7777$s" "%7778$s" "%7779$s" "%7780$s" ++"%7781$s" "%7782$s" "%7783$s" "%7784$s" "%7785$s" "%7786$s" "%7787$s" "%7788$s" "%7789$s" "%7790$s" ++"%7791$s" "%7792$s" "%7793$s" "%7794$s" "%7795$s" "%7796$s" "%7797$s" "%7798$s" "%7799$s" "%7800$s" ++"%7801$s" "%7802$s" "%7803$s" "%7804$s" "%7805$s" "%7806$s" "%7807$s" "%7808$s" "%7809$s" "%7810$s" ++"%7811$s" "%7812$s" "%7813$s" "%7814$s" "%7815$s" "%7816$s" "%7817$s" "%7818$s" "%7819$s" "%7820$s" ++"%7821$s" "%7822$s" "%7823$s" "%7824$s" "%7825$s" "%7826$s" "%7827$s" "%7828$s" "%7829$s" "%7830$s" ++"%7831$s" "%7832$s" "%7833$s" "%7834$s" "%7835$s" "%7836$s" "%7837$s" "%7838$s" "%7839$s" "%7840$s" ++"%7841$s" "%7842$s" "%7843$s" "%7844$s" "%7845$s" "%7846$s" "%7847$s" "%7848$s" "%7849$s" "%7850$s" ++"%7851$s" "%7852$s" "%7853$s" "%7854$s" "%7855$s" "%7856$s" "%7857$s" "%7858$s" "%7859$s" "%7860$s" ++"%7861$s" "%7862$s" "%7863$s" "%7864$s" "%7865$s" "%7866$s" "%7867$s" "%7868$s" "%7869$s" "%7870$s" ++"%7871$s" "%7872$s" "%7873$s" "%7874$s" "%7875$s" "%7876$s" "%7877$s" "%7878$s" "%7879$s" "%7880$s" ++"%7881$s" "%7882$s" "%7883$s" "%7884$s" "%7885$s" "%7886$s" "%7887$s" "%7888$s" "%7889$s" "%7890$s" ++"%7891$s" "%7892$s" "%7893$s" "%7894$s" "%7895$s" "%7896$s" "%7897$s" "%7898$s" "%7899$s" "%7900$s" ++"%7901$s" "%7902$s" "%7903$s" "%7904$s" "%7905$s" "%7906$s" "%7907$s" "%7908$s" "%7909$s" "%7910$s" ++"%7911$s" "%7912$s" "%7913$s" "%7914$s" "%7915$s" "%7916$s" "%7917$s" "%7918$s" "%7919$s" "%7920$s" ++"%7921$s" "%7922$s" "%7923$s" "%7924$s" "%7925$s" "%7926$s" "%7927$s" "%7928$s" "%7929$s" "%7930$s" ++"%7931$s" "%7932$s" "%7933$s" "%7934$s" "%7935$s" "%7936$s" "%7937$s" "%7938$s" "%7939$s" "%7940$s" ++"%7941$s" "%7942$s" "%7943$s" "%7944$s" "%7945$s" "%7946$s" "%7947$s" "%7948$s" "%7949$s" "%7950$s" ++"%7951$s" "%7952$s" "%7953$s" "%7954$s" "%7955$s" "%7956$s" "%7957$s" "%7958$s" "%7959$s" "%7960$s" ++"%7961$s" "%7962$s" "%7963$s" "%7964$s" "%7965$s" "%7966$s" "%7967$s" "%7968$s" "%7969$s" "%7970$s" ++"%7971$s" "%7972$s" "%7973$s" "%7974$s" "%7975$s" "%7976$s" "%7977$s" "%7978$s" "%7979$s" "%7980$s" ++"%7981$s" "%7982$s" "%7983$s" "%7984$s" "%7985$s" "%7986$s" "%7987$s" "%7988$s" "%7989$s" "%7990$s" ++"%7991$s" "%7992$s" "%7993$s" "%7994$s" "%7995$s" "%7996$s" "%7997$s" "%7998$s" "%7999$s" "%8000$s" ++"%8001$s" "%8002$s" "%8003$s" "%8004$s" "%8005$s" "%8006$s" "%8007$s" "%8008$s" "%8009$s" "%8010$s" ++"%8011$s" "%8012$s" "%8013$s" "%8014$s" "%8015$s" "%8016$s" "%8017$s" "%8018$s" "%8019$s" "%8020$s" ++"%8021$s" "%8022$s" "%8023$s" "%8024$s" "%8025$s" "%8026$s" "%8027$s" "%8028$s" "%8029$s" "%8030$s" ++"%8031$s" "%8032$s" "%8033$s" "%8034$s" "%8035$s" "%8036$s" "%8037$s" "%8038$s" "%8039$s" "%8040$s" ++"%8041$s" "%8042$s" "%8043$s" "%8044$s" "%8045$s" "%8046$s" "%8047$s" "%8048$s" "%8049$s" "%8050$s" ++"%8051$s" "%8052$s" "%8053$s" "%8054$s" "%8055$s" "%8056$s" "%8057$s" "%8058$s" "%8059$s" "%8060$s" ++"%8061$s" "%8062$s" "%8063$s" "%8064$s" "%8065$s" "%8066$s" "%8067$s" "%8068$s" "%8069$s" "%8070$s" ++"%8071$s" "%8072$s" "%8073$s" "%8074$s" "%8075$s" "%8076$s" "%8077$s" "%8078$s" "%8079$s" "%8080$s" ++"%8081$s" "%8082$s" "%8083$s" "%8084$s" "%8085$s" "%8086$s" "%8087$s" "%8088$s" "%8089$s" "%8090$s" ++"%8091$s" "%8092$s" "%8093$s" "%8094$s" "%8095$s" "%8096$s" "%8097$s" "%8098$s" "%8099$s" "%8100$s" ++"%8101$s" "%8102$s" "%8103$s" "%8104$s" "%8105$s" "%8106$s" "%8107$s" "%8108$s" "%8109$s" "%8110$s" ++"%8111$s" "%8112$s" "%8113$s" "%8114$s" "%8115$s" "%8116$s" "%8117$s" "%8118$s" "%8119$s" "%8120$s" ++"%8121$s" "%8122$s" "%8123$s" "%8124$s" "%8125$s" "%8126$s" "%8127$s" "%8128$s" "%8129$s" "%8130$s" ++"%8131$s" "%8132$s" "%8133$s" "%8134$s" "%8135$s" "%8136$s" "%8137$s" "%8138$s" "%8139$s" "%8140$s" ++"%8141$s" "%8142$s" "%8143$s" "%8144$s" "%8145$s" "%8146$s" "%8147$s" "%8148$s" "%8149$s" "%8150$s" ++"%8151$s" "%8152$s" "%8153$s" "%8154$s" "%8155$s" "%8156$s" "%8157$s" "%8158$s" "%8159$s" "%8160$s" ++"%8161$s" "%8162$s" "%8163$s" "%8164$s" "%8165$s" "%8166$s" "%8167$s" "%8168$s" "%8169$s" "%8170$s" ++"%8171$s" "%8172$s" "%8173$s" "%8174$s" "%8175$s" "%8176$s" "%8177$s" "%8178$s" "%8179$s" "%8180$s" ++"%8181$s" "%8182$s" "%8183$s" "%8184$s" "%8185$s" "%8186$s" "%8187$s" "%8188$s" "%8189$s" "%8190$s" ++"%8191$s" "%8192$s" "%8193$s" "%8194$s" "%8195$s" "%8196$s" "%8197$s" "%8198$s" "%8199$s" "%8200$s" ++"%8201$s" "%8202$s" "%8203$s" "%8204$s" "%8205$s" "%8206$s" "%8207$s" "%8208$s" "%8209$s" "%8210$s" ++"%8211$s" "%8212$s" "%8213$s" "%8214$s" "%8215$s" "%8216$s" "%8217$s" "%8218$s" "%8219$s" "%8220$s" ++"%8221$s" "%8222$s" "%8223$s" "%8224$s" "%8225$s" "%8226$s" "%8227$s" "%8228$s" "%8229$s" "%8230$s" ++"%8231$s" "%8232$s" "%8233$s" "%8234$s" "%8235$s" "%8236$s" "%8237$s" "%8238$s" "%8239$s" "%8240$s" ++"%8241$s" "%8242$s" "%8243$s" "%8244$s" "%8245$s" "%8246$s" "%8247$s" "%8248$s" "%8249$s" "%8250$s" ++"%8251$s" "%8252$s" "%8253$s" "%8254$s" "%8255$s" "%8256$s" "%8257$s" "%8258$s" "%8259$s" "%8260$s" ++"%8261$s" "%8262$s" "%8263$s" "%8264$s" "%8265$s" "%8266$s" "%8267$s" "%8268$s" "%8269$s" "%8270$s" ++"%8271$s" "%8272$s" "%8273$s" "%8274$s" "%8275$s" "%8276$s" "%8277$s" "%8278$s" "%8279$s" "%8280$s" ++"%8281$s" "%8282$s" "%8283$s" "%8284$s" "%8285$s" "%8286$s" "%8287$s" "%8288$s" "%8289$s" "%8290$s" ++"%8291$s" "%8292$s" "%8293$s" "%8294$s" "%8295$s" "%8296$s" "%8297$s" "%8298$s" "%8299$s" "%8300$s" ++"%8301$s" "%8302$s" "%8303$s" "%8304$s" "%8305$s" "%8306$s" "%8307$s" "%8308$s" "%8309$s" "%8310$s" ++"%8311$s" "%8312$s" "%8313$s" "%8314$s" "%8315$s" "%8316$s" "%8317$s" "%8318$s" "%8319$s" "%8320$s" ++"%8321$s" "%8322$s" "%8323$s" "%8324$s" "%8325$s" "%8326$s" "%8327$s" "%8328$s" "%8329$s" "%8330$s" ++"%8331$s" "%8332$s" "%8333$s" "%8334$s" "%8335$s" "%8336$s" "%8337$s" "%8338$s" "%8339$s" "%8340$s" ++"%8341$s" "%8342$s" "%8343$s" "%8344$s" "%8345$s" "%8346$s" "%8347$s" "%8348$s" "%8349$s" "%8350$s" ++"%8351$s" "%8352$s" "%8353$s" "%8354$s" "%8355$s" "%8356$s" "%8357$s" "%8358$s" "%8359$s" "%8360$s" ++"%8361$s" "%8362$s" "%8363$s" "%8364$s" "%8365$s" "%8366$s" "%8367$s" "%8368$s" "%8369$s" "%8370$s" ++"%8371$s" "%8372$s" "%8373$s" "%8374$s" "%8375$s" "%8376$s" "%8377$s" "%8378$s" "%8379$s" "%8380$s" ++"%8381$s" "%8382$s" "%8383$s" "%8384$s" "%8385$s" "%8386$s" "%8387$s" "%8388$s" "%8389$s" "%8390$s" ++"%8391$s" "%8392$s" "%8393$s" "%8394$s" "%8395$s" "%8396$s" "%8397$s" "%8398$s" "%8399$s" "%8400$s" ++"%8401$s" "%8402$s" "%8403$s" "%8404$s" "%8405$s" "%8406$s" "%8407$s" "%8408$s" "%8409$s" "%8410$s" ++"%8411$s" "%8412$s" "%8413$s" "%8414$s" "%8415$s" "%8416$s" "%8417$s" "%8418$s" "%8419$s" "%8420$s" ++"%8421$s" "%8422$s" "%8423$s" "%8424$s" "%8425$s" "%8426$s" "%8427$s" "%8428$s" "%8429$s" "%8430$s" ++"%8431$s" "%8432$s" "%8433$s" "%8434$s" "%8435$s" "%8436$s" "%8437$s" "%8438$s" "%8439$s" "%8440$s" ++"%8441$s" "%8442$s" "%8443$s" "%8444$s" "%8445$s" "%8446$s" "%8447$s" "%8448$s" "%8449$s" "%8450$s" ++"%8451$s" "%8452$s" "%8453$s" "%8454$s" "%8455$s" "%8456$s" "%8457$s" "%8458$s" "%8459$s" "%8460$s" ++"%8461$s" "%8462$s" "%8463$s" "%8464$s" "%8465$s" "%8466$s" "%8467$s" "%8468$s" "%8469$s" "%8470$s" ++"%8471$s" "%8472$s" "%8473$s" "%8474$s" "%8475$s" "%8476$s" "%8477$s" "%8478$s" "%8479$s" "%8480$s" ++"%8481$s" "%8482$s" "%8483$s" "%8484$s" "%8485$s" "%8486$s" "%8487$s" "%8488$s" "%8489$s" "%8490$s" ++"%8491$s" "%8492$s" "%8493$s" "%8494$s" "%8495$s" "%8496$s" "%8497$s" "%8498$s" "%8499$s" "%8500$s" ++"%8501$s" "%8502$s" "%8503$s" "%8504$s" "%8505$s" "%8506$s" "%8507$s" "%8508$s" "%8509$s" "%8510$s" ++"%8511$s" "%8512$s" "%8513$s" "%8514$s" "%8515$s" "%8516$s" "%8517$s" "%8518$s" "%8519$s" "%8520$s" ++"%8521$s" "%8522$s" "%8523$s" "%8524$s" "%8525$s" "%8526$s" "%8527$s" "%8528$s" "%8529$s" "%8530$s" ++"%8531$s" "%8532$s" "%8533$s" "%8534$s" "%8535$s" "%8536$s" "%8537$s" "%8538$s" "%8539$s" "%8540$s" ++"%8541$s" "%8542$s" "%8543$s" "%8544$s" "%8545$s" "%8546$s" "%8547$s" "%8548$s" "%8549$s" "%8550$s" ++"%8551$s" "%8552$s" "%8553$s" "%8554$s" "%8555$s" "%8556$s" "%8557$s" "%8558$s" "%8559$s" "%8560$s" ++"%8561$s" "%8562$s" "%8563$s" "%8564$s" "%8565$s" "%8566$s" "%8567$s" "%8568$s" "%8569$s" "%8570$s" ++"%8571$s" "%8572$s" "%8573$s" "%8574$s" "%8575$s" "%8576$s" "%8577$s" "%8578$s" "%8579$s" "%8580$s" ++"%8581$s" "%8582$s" "%8583$s" "%8584$s" "%8585$s" "%8586$s" "%8587$s" "%8588$s" "%8589$s" "%8590$s" ++"%8591$s" "%8592$s" "%8593$s" "%8594$s" "%8595$s" "%8596$s" "%8597$s" "%8598$s" "%8599$s" "%8600$s" ++"%8601$s" "%8602$s" "%8603$s" "%8604$s" "%8605$s" "%8606$s" "%8607$s" "%8608$s" "%8609$s" "%8610$s" ++"%8611$s" "%8612$s" "%8613$s" "%8614$s" "%8615$s" "%8616$s" "%8617$s" "%8618$s" "%8619$s" "%8620$s" ++"%8621$s" "%8622$s" "%8623$s" "%8624$s" "%8625$s" "%8626$s" "%8627$s" "%8628$s" "%8629$s" "%8630$s" ++"%8631$s" "%8632$s" "%8633$s" "%8634$s" "%8635$s" "%8636$s" "%8637$s" "%8638$s" "%8639$s" "%8640$s" ++"%8641$s" "%8642$s" "%8643$s" "%8644$s" "%8645$s" "%8646$s" "%8647$s" "%8648$s" "%8649$s" "%8650$s" ++"%8651$s" "%8652$s" "%8653$s" "%8654$s" "%8655$s" "%8656$s" "%8657$s" "%8658$s" "%8659$s" "%8660$s" ++"%8661$s" "%8662$s" "%8663$s" "%8664$s" "%8665$s" "%8666$s" "%8667$s" "%8668$s" "%8669$s" "%8670$s" ++"%8671$s" "%8672$s" "%8673$s" "%8674$s" "%8675$s" "%8676$s" "%8677$s" "%8678$s" "%8679$s" "%8680$s" ++"%8681$s" "%8682$s" "%8683$s" "%8684$s" "%8685$s" "%8686$s" "%8687$s" "%8688$s" "%8689$s" "%8690$s" ++"%8691$s" "%8692$s" "%8693$s" "%8694$s" "%8695$s" "%8696$s" "%8697$s" "%8698$s" "%8699$s" "%8700$s" ++"%8701$s" "%8702$s" "%8703$s" "%8704$s" "%8705$s" "%8706$s" "%8707$s" "%8708$s" "%8709$s" "%8710$s" ++"%8711$s" "%8712$s" "%8713$s" "%8714$s" "%8715$s" "%8716$s" "%8717$s" "%8718$s" "%8719$s" "%8720$s" ++"%8721$s" "%8722$s" "%8723$s" "%8724$s" "%8725$s" "%8726$s" "%8727$s" "%8728$s" "%8729$s" "%8730$s" ++"%8731$s" "%8732$s" "%8733$s" "%8734$s" "%8735$s" "%8736$s" "%8737$s" "%8738$s" "%8739$s" "%8740$s" ++"%8741$s" "%8742$s" "%8743$s" "%8744$s" "%8745$s" "%8746$s" "%8747$s" "%8748$s" "%8749$s" "%8750$s" ++"%8751$s" "%8752$s" "%8753$s" "%8754$s" "%8755$s" "%8756$s" "%8757$s" "%8758$s" "%8759$s" "%8760$s" ++"%8761$s" "%8762$s" "%8763$s" "%8764$s" "%8765$s" "%8766$s" "%8767$s" "%8768$s" "%8769$s" "%8770$s" ++"%8771$s" "%8772$s" "%8773$s" "%8774$s" "%8775$s" "%8776$s" "%8777$s" "%8778$s" "%8779$s" "%8780$s" ++"%8781$s" "%8782$s" "%8783$s" "%8784$s" "%8785$s" "%8786$s" "%8787$s" "%8788$s" "%8789$s" "%8790$s" ++"%8791$s" "%8792$s" "%8793$s" "%8794$s" "%8795$s" "%8796$s" "%8797$s" "%8798$s" "%8799$s" "%8800$s" ++"%8801$s" "%8802$s" "%8803$s" "%8804$s" "%8805$s" "%8806$s" "%8807$s" "%8808$s" "%8809$s" "%8810$s" ++"%8811$s" "%8812$s" "%8813$s" "%8814$s" "%8815$s" "%8816$s" "%8817$s" "%8818$s" "%8819$s" "%8820$s" ++"%8821$s" "%8822$s" "%8823$s" "%8824$s" "%8825$s" "%8826$s" "%8827$s" "%8828$s" "%8829$s" "%8830$s" ++"%8831$s" "%8832$s" "%8833$s" "%8834$s" "%8835$s" "%8836$s" "%8837$s" "%8838$s" "%8839$s" "%8840$s" ++"%8841$s" "%8842$s" "%8843$s" "%8844$s" "%8845$s" "%8846$s" "%8847$s" "%8848$s" "%8849$s" "%8850$s" ++"%8851$s" "%8852$s" "%8853$s" "%8854$s" "%8855$s" "%8856$s" "%8857$s" "%8858$s" "%8859$s" "%8860$s" ++"%8861$s" "%8862$s" "%8863$s" "%8864$s" "%8865$s" "%8866$s" "%8867$s" "%8868$s" "%8869$s" "%8870$s" ++"%8871$s" "%8872$s" "%8873$s" "%8874$s" "%8875$s" "%8876$s" "%8877$s" "%8878$s" "%8879$s" "%8880$s" ++"%8881$s" "%8882$s" "%8883$s" "%8884$s" "%8885$s" "%8886$s" "%8887$s" "%8888$s" "%8889$s" "%8890$s" ++"%8891$s" "%8892$s" "%8893$s" "%8894$s" "%8895$s" "%8896$s" "%8897$s" "%8898$s" "%8899$s" "%8900$s" ++"%8901$s" "%8902$s" "%8903$s" "%8904$s" "%8905$s" "%8906$s" "%8907$s" "%8908$s" "%8909$s" "%8910$s" ++"%8911$s" "%8912$s" "%8913$s" "%8914$s" "%8915$s" "%8916$s" "%8917$s" "%8918$s" "%8919$s" "%8920$s" ++"%8921$s" "%8922$s" "%8923$s" "%8924$s" "%8925$s" "%8926$s" "%8927$s" "%8928$s" "%8929$s" "%8930$s" ++"%8931$s" "%8932$s" "%8933$s" "%8934$s" "%8935$s" "%8936$s" "%8937$s" "%8938$s" "%8939$s" "%8940$s" ++"%8941$s" "%8942$s" "%8943$s" "%8944$s" "%8945$s" "%8946$s" "%8947$s" "%8948$s" "%8949$s" "%8950$s" ++"%8951$s" "%8952$s" "%8953$s" "%8954$s" "%8955$s" "%8956$s" "%8957$s" "%8958$s" "%8959$s" "%8960$s" ++"%8961$s" "%8962$s" "%8963$s" "%8964$s" "%8965$s" "%8966$s" "%8967$s" "%8968$s" "%8969$s" "%8970$s" ++"%8971$s" "%8972$s" "%8973$s" "%8974$s" "%8975$s" "%8976$s" "%8977$s" "%8978$s" "%8979$s" "%8980$s" ++"%8981$s" "%8982$s" "%8983$s" "%8984$s" "%8985$s" "%8986$s" "%8987$s" "%8988$s" "%8989$s" "%8990$s" ++"%8991$s" "%8992$s" "%8993$s" "%8994$s" "%8995$s" "%8996$s" "%8997$s" "%8998$s" "%8999$s" "%9000$s" ++"%9001$s" "%9002$s" "%9003$s" "%9004$s" "%9005$s" "%9006$s" "%9007$s" "%9008$s" "%9009$s" "%9010$s" ++"%9011$s" "%9012$s" "%9013$s" "%9014$s" "%9015$s" "%9016$s" "%9017$s" "%9018$s" "%9019$s" "%9020$s" ++"%9021$s" "%9022$s" "%9023$s" "%9024$s" "%9025$s" "%9026$s" "%9027$s" "%9028$s" "%9029$s" "%9030$s" ++"%9031$s" "%9032$s" "%9033$s" "%9034$s" "%9035$s" "%9036$s" "%9037$s" "%9038$s" "%9039$s" "%9040$s" ++"%9041$s" "%9042$s" "%9043$s" "%9044$s" "%9045$s" "%9046$s" "%9047$s" "%9048$s" "%9049$s" "%9050$s" ++"%9051$s" "%9052$s" "%9053$s" "%9054$s" "%9055$s" "%9056$s" "%9057$s" "%9058$s" "%9059$s" "%9060$s" ++"%9061$s" "%9062$s" "%9063$s" "%9064$s" "%9065$s" "%9066$s" "%9067$s" "%9068$s" "%9069$s" "%9070$s" ++"%9071$s" "%9072$s" "%9073$s" "%9074$s" "%9075$s" "%9076$s" "%9077$s" "%9078$s" "%9079$s" "%9080$s" ++"%9081$s" "%9082$s" "%9083$s" "%9084$s" "%9085$s" "%9086$s" "%9087$s" "%9088$s" "%9089$s" "%9090$s" ++"%9091$s" "%9092$s" "%9093$s" "%9094$s" "%9095$s" "%9096$s" "%9097$s" "%9098$s" "%9099$s" "%9100$s" ++"%9101$s" "%9102$s" "%9103$s" "%9104$s" "%9105$s" "%9106$s" "%9107$s" "%9108$s" "%9109$s" "%9110$s" ++"%9111$s" "%9112$s" "%9113$s" "%9114$s" "%9115$s" "%9116$s" "%9117$s" "%9118$s" "%9119$s" "%9120$s" ++"%9121$s" "%9122$s" "%9123$s" "%9124$s" "%9125$s" "%9126$s" "%9127$s" "%9128$s" "%9129$s" "%9130$s" ++"%9131$s" "%9132$s" "%9133$s" "%9134$s" "%9135$s" "%9136$s" "%9137$s" "%9138$s" "%9139$s" "%9140$s" ++"%9141$s" "%9142$s" "%9143$s" "%9144$s" "%9145$s" "%9146$s" "%9147$s" "%9148$s" "%9149$s" "%9150$s" ++"%9151$s" "%9152$s" "%9153$s" "%9154$s" "%9155$s" "%9156$s" "%9157$s" "%9158$s" "%9159$s" "%9160$s" ++"%9161$s" "%9162$s" "%9163$s" "%9164$s" "%9165$s" "%9166$s" "%9167$s" "%9168$s" "%9169$s" "%9170$s" ++"%9171$s" "%9172$s" "%9173$s" "%9174$s" "%9175$s" "%9176$s" "%9177$s" "%9178$s" "%9179$s" "%9180$s" ++"%9181$s" "%9182$s" "%9183$s" "%9184$s" "%9185$s" "%9186$s" "%9187$s" "%9188$s" "%9189$s" "%9190$s" ++"%9191$s" "%9192$s" "%9193$s" "%9194$s" "%9195$s" "%9196$s" "%9197$s" "%9198$s" "%9199$s" "%9200$s" ++"%9201$s" "%9202$s" "%9203$s" "%9204$s" "%9205$s" "%9206$s" "%9207$s" "%9208$s" "%9209$s" "%9210$s" ++"%9211$s" "%9212$s" "%9213$s" "%9214$s" "%9215$s" "%9216$s" "%9217$s" "%9218$s" "%9219$s" "%9220$s" ++"%9221$s" "%9222$s" "%9223$s" "%9224$s" "%9225$s" "%9226$s" "%9227$s" "%9228$s" "%9229$s" "%9230$s" ++"%9231$s" "%9232$s" "%9233$s" "%9234$s" "%9235$s" "%9236$s" "%9237$s" "%9238$s" "%9239$s" "%9240$s" ++"%9241$s" "%9242$s" "%9243$s" "%9244$s" "%9245$s" "%9246$s" "%9247$s" "%9248$s" "%9249$s" "%9250$s" ++"%9251$s" "%9252$s" "%9253$s" "%9254$s" "%9255$s" "%9256$s" "%9257$s" "%9258$s" "%9259$s" "%9260$s" ++"%9261$s" "%9262$s" "%9263$s" "%9264$s" "%9265$s" "%9266$s" "%9267$s" "%9268$s" "%9269$s" "%9270$s" ++"%9271$s" "%9272$s" "%9273$s" "%9274$s" "%9275$s" "%9276$s" "%9277$s" "%9278$s" "%9279$s" "%9280$s" ++"%9281$s" "%9282$s" "%9283$s" "%9284$s" "%9285$s" "%9286$s" "%9287$s" "%9288$s" "%9289$s" "%9290$s" ++"%9291$s" "%9292$s" "%9293$s" "%9294$s" "%9295$s" "%9296$s" "%9297$s" "%9298$s" "%9299$s" "%9300$s" ++"%9301$s" "%9302$s" "%9303$s" "%9304$s" "%9305$s" "%9306$s" "%9307$s" "%9308$s" "%9309$s" "%9310$s" ++"%9311$s" "%9312$s" "%9313$s" "%9314$s" "%9315$s" "%9316$s" "%9317$s" "%9318$s" "%9319$s" "%9320$s" ++"%9321$s" "%9322$s" "%9323$s" "%9324$s" "%9325$s" "%9326$s" "%9327$s" "%9328$s" "%9329$s" "%9330$s" ++"%9331$s" "%9332$s" "%9333$s" "%9334$s" "%9335$s" "%9336$s" "%9337$s" "%9338$s" "%9339$s" "%9340$s" ++"%9341$s" "%9342$s" "%9343$s" "%9344$s" "%9345$s" "%9346$s" "%9347$s" "%9348$s" "%9349$s" "%9350$s" ++"%9351$s" "%9352$s" "%9353$s" "%9354$s" "%9355$s" "%9356$s" "%9357$s" "%9358$s" "%9359$s" "%9360$s" ++"%9361$s" "%9362$s" "%9363$s" "%9364$s" "%9365$s" "%9366$s" "%9367$s" "%9368$s" "%9369$s" "%9370$s" ++"%9371$s" "%9372$s" "%9373$s" "%9374$s" "%9375$s" "%9376$s" "%9377$s" "%9378$s" "%9379$s" "%9380$s" ++"%9381$s" "%9382$s" "%9383$s" "%9384$s" "%9385$s" "%9386$s" "%9387$s" "%9388$s" "%9389$s" "%9390$s" ++"%9391$s" "%9392$s" "%9393$s" "%9394$s" "%9395$s" "%9396$s" "%9397$s" "%9398$s" "%9399$s" "%9400$s" ++"%9401$s" "%9402$s" "%9403$s" "%9404$s" "%9405$s" "%9406$s" "%9407$s" "%9408$s" "%9409$s" "%9410$s" ++"%9411$s" "%9412$s" "%9413$s" "%9414$s" "%9415$s" "%9416$s" "%9417$s" "%9418$s" "%9419$s" "%9420$s" ++"%9421$s" "%9422$s" "%9423$s" "%9424$s" "%9425$s" "%9426$s" "%9427$s" "%9428$s" "%9429$s" "%9430$s" ++"%9431$s" "%9432$s" "%9433$s" "%9434$s" "%9435$s" "%9436$s" "%9437$s" "%9438$s" "%9439$s" "%9440$s" ++"%9441$s" "%9442$s" "%9443$s" "%9444$s" "%9445$s" "%9446$s" "%9447$s" "%9448$s" "%9449$s" "%9450$s" ++"%9451$s" "%9452$s" "%9453$s" "%9454$s" "%9455$s" "%9456$s" "%9457$s" "%9458$s" "%9459$s" "%9460$s" ++"%9461$s" "%9462$s" "%9463$s" "%9464$s" "%9465$s" "%9466$s" "%9467$s" "%9468$s" "%9469$s" "%9470$s" ++"%9471$s" "%9472$s" "%9473$s" "%9474$s" "%9475$s" "%9476$s" "%9477$s" "%9478$s" "%9479$s" "%9480$s" ++"%9481$s" "%9482$s" "%9483$s" "%9484$s" "%9485$s" "%9486$s" "%9487$s" "%9488$s" "%9489$s" "%9490$s" ++"%9491$s" "%9492$s" "%9493$s" "%9494$s" "%9495$s" "%9496$s" "%9497$s" "%9498$s" "%9499$s" "%9500$s" ++"%9501$s" "%9502$s" "%9503$s" "%9504$s" "%9505$s" "%9506$s" "%9507$s" "%9508$s" "%9509$s" "%9510$s" ++"%9511$s" "%9512$s" "%9513$s" "%9514$s" "%9515$s" "%9516$s" "%9517$s" "%9518$s" "%9519$s" "%9520$s" ++"%9521$s" "%9522$s" "%9523$s" "%9524$s" "%9525$s" "%9526$s" "%9527$s" "%9528$s" "%9529$s" "%9530$s" ++"%9531$s" "%9532$s" "%9533$s" "%9534$s" "%9535$s" "%9536$s" "%9537$s" "%9538$s" "%9539$s" "%9540$s" ++"%9541$s" "%9542$s" "%9543$s" "%9544$s" "%9545$s" "%9546$s" "%9547$s" "%9548$s" "%9549$s" "%9550$s" ++"%9551$s" "%9552$s" "%9553$s" "%9554$s" "%9555$s" "%9556$s" "%9557$s" "%9558$s" "%9559$s" "%9560$s" ++"%9561$s" "%9562$s" "%9563$s" "%9564$s" "%9565$s" "%9566$s" "%9567$s" "%9568$s" "%9569$s" "%9570$s" ++"%9571$s" "%9572$s" "%9573$s" "%9574$s" "%9575$s" "%9576$s" "%9577$s" "%9578$s" "%9579$s" "%9580$s" ++"%9581$s" "%9582$s" "%9583$s" "%9584$s" "%9585$s" "%9586$s" "%9587$s" "%9588$s" "%9589$s" "%9590$s" ++"%9591$s" "%9592$s" "%9593$s" "%9594$s" "%9595$s" "%9596$s" "%9597$s" "%9598$s" "%9599$s" "%9600$s" ++"%9601$s" "%9602$s" "%9603$s" "%9604$s" "%9605$s" "%9606$s" "%9607$s" "%9608$s" "%9609$s" "%9610$s" ++"%9611$s" "%9612$s" "%9613$s" "%9614$s" "%9615$s" "%9616$s" "%9617$s" "%9618$s" "%9619$s" "%9620$s" ++"%9621$s" "%9622$s" "%9623$s" "%9624$s" "%9625$s" "%9626$s" "%9627$s" "%9628$s" "%9629$s" "%9630$s" ++"%9631$s" "%9632$s" "%9633$s" "%9634$s" "%9635$s" "%9636$s" "%9637$s" "%9638$s" "%9639$s" "%9640$s" ++"%9641$s" "%9642$s" "%9643$s" "%9644$s" "%9645$s" "%9646$s" "%9647$s" "%9648$s" "%9649$s" "%9650$s" ++"%9651$s" "%9652$s" "%9653$s" "%9654$s" "%9655$s" "%9656$s" "%9657$s" "%9658$s" "%9659$s" "%9660$s" ++"%9661$s" "%9662$s" "%9663$s" "%9664$s" "%9665$s" "%9666$s" "%9667$s" "%9668$s" "%9669$s" "%9670$s" ++"%9671$s" "%9672$s" "%9673$s" "%9674$s" "%9675$s" "%9676$s" "%9677$s" "%9678$s" "%9679$s" "%9680$s" ++"%9681$s" "%9682$s" "%9683$s" "%9684$s" "%9685$s" "%9686$s" "%9687$s" "%9688$s" "%9689$s" "%9690$s" ++"%9691$s" "%9692$s" "%9693$s" "%9694$s" "%9695$s" "%9696$s" "%9697$s" "%9698$s" "%9699$s" "%9700$s" ++"%9701$s" "%9702$s" "%9703$s" "%9704$s" "%9705$s" "%9706$s" "%9707$s" "%9708$s" "%9709$s" "%9710$s" ++"%9711$s" "%9712$s" "%9713$s" "%9714$s" "%9715$s" "%9716$s" "%9717$s" "%9718$s" "%9719$s" "%9720$s" ++"%9721$s" "%9722$s" "%9723$s" "%9724$s" "%9725$s" "%9726$s" "%9727$s" "%9728$s" "%9729$s" "%9730$s" ++"%9731$s" "%9732$s" "%9733$s" "%9734$s" "%9735$s" "%9736$s" "%9737$s" "%9738$s" "%9739$s" "%9740$s" ++"%9741$s" "%9742$s" "%9743$s" "%9744$s" "%9745$s" "%9746$s" "%9747$s" "%9748$s" "%9749$s" "%9750$s" ++"%9751$s" "%9752$s" "%9753$s" "%9754$s" "%9755$s" "%9756$s" "%9757$s" "%9758$s" "%9759$s" "%9760$s" ++"%9761$s" "%9762$s" "%9763$s" "%9764$s" "%9765$s" "%9766$s" "%9767$s" "%9768$s" "%9769$s" "%9770$s" ++"%9771$s" "%9772$s" "%9773$s" "%9774$s" "%9775$s" "%9776$s" "%9777$s" "%9778$s" "%9779$s" "%9780$s" ++"%9781$s" "%9782$s" "%9783$s" "%9784$s" "%9785$s" "%9786$s" "%9787$s" "%9788$s" "%9789$s" "%9790$s" ++"%9791$s" "%9792$s" "%9793$s" "%9794$s" "%9795$s" "%9796$s" "%9797$s" "%9798$s" "%9799$s" "%9800$s" ++"%9801$s" "%9802$s" "%9803$s" "%9804$s" "%9805$s" "%9806$s" "%9807$s" "%9808$s" "%9809$s" "%9810$s" ++"%9811$s" "%9812$s" "%9813$s" "%9814$s" "%9815$s" "%9816$s" "%9817$s" "%9818$s" "%9819$s" "%9820$s" ++"%9821$s" "%9822$s" "%9823$s" "%9824$s" "%9825$s" "%9826$s" "%9827$s" "%9828$s" "%9829$s" "%9830$s" ++"%9831$s" "%9832$s" "%9833$s" "%9834$s" "%9835$s" "%9836$s" "%9837$s" "%9838$s" "%9839$s" "%9840$s" ++"%9841$s" "%9842$s" "%9843$s" "%9844$s" "%9845$s" "%9846$s" "%9847$s" "%9848$s" "%9849$s" "%9850$s" ++"%9851$s" "%9852$s" "%9853$s" "%9854$s" "%9855$s" "%9856$s" "%9857$s" "%9858$s" "%9859$s" "%9860$s" ++"%9861$s" "%9862$s" "%9863$s" "%9864$s" "%9865$s" "%9866$s" "%9867$s" "%9868$s" "%9869$s" "%9870$s" ++"%9871$s" "%9872$s" "%9873$s" "%9874$s" "%9875$s" "%9876$s" "%9877$s" "%9878$s" "%9879$s" "%9880$s" ++"%9881$s" "%9882$s" "%9883$s" "%9884$s" "%9885$s" "%9886$s" "%9887$s" "%9888$s" "%9889$s" "%9890$s" ++"%9891$s" "%9892$s" "%9893$s" "%9894$s" "%9895$s" "%9896$s" "%9897$s" "%9898$s" "%9899$s" "%9900$s" ++"%9901$s" "%9902$s" "%9903$s" "%9904$s" "%9905$s" "%9906$s" "%9907$s" "%9908$s" "%9909$s" "%9910$s" ++"%9911$s" "%9912$s" "%9913$s" "%9914$s" "%9915$s" "%9916$s" "%9917$s" "%9918$s" "%9919$s" "%9920$s" ++"%9921$s" "%9922$s" "%9923$s" "%9924$s" "%9925$s" "%9926$s" "%9927$s" "%9928$s" "%9929$s" "%9930$s" ++"%9931$s" "%9932$s" "%9933$s" "%9934$s" "%9935$s" "%9936$s" "%9937$s" "%9938$s" "%9939$s" "%9940$s" ++"%9941$s" "%9942$s" "%9943$s" "%9944$s" "%9945$s" "%9946$s" "%9947$s" "%9948$s" "%9949$s" "%9950$s" ++"%9951$s" "%9952$s" "%9953$s" "%9954$s" "%9955$s" "%9956$s" "%9957$s" "%9958$s" "%9959$s" "%9960$s" ++"%9961$s" "%9962$s" "%9963$s" "%9964$s" "%9965$s" "%9966$s" "%9967$s" "%9968$s" "%9969$s" "%9970$s" ++"%9971$s" "%9972$s" "%9973$s" "%9974$s" "%9975$s" "%9976$s" "%9977$s" "%9978$s" "%9979$s" "%9980$s" ++"%9981$s" "%9982$s" "%9983$s" "%9984$s" "%9985$s" "%9986$s" "%9987$s" "%9988$s" "%9989$s" "%9990$s" ++"%9991$s" "%9992$s" "%9993$s" "%9994$s" "%9995$s" "%9996$s" "%9997$s" "%9998$s" "%9999$s" "%10000$s" ++"%10001$s", ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 10 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 20 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 30 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 40 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 50 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 60 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 70 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 80 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 90 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 100 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 110 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 120 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 130 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 140 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 150 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 160 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 170 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 180 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 190 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 200 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 210 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 220 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 230 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 240 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 250 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 260 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 270 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 280 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 290 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 300 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 310 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 320 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 330 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 340 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 350 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 360 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 370 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 380 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 390 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 400 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 410 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 420 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 430 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 440 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 450 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 460 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 470 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 480 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 490 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 500 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 510 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 520 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 530 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 540 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 550 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 560 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 570 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 580 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 590 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 600 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 610 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 620 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 630 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 640 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 650 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 660 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 670 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 680 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 690 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 700 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 710 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 720 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 730 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 740 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 750 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 760 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 770 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 780 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 790 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 800 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 810 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 820 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 830 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 840 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 850 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 860 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 870 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 880 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 890 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 900 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 910 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 920 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 930 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 940 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 950 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 960 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 970 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 980 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 990 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1000 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1010 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1020 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1030 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1040 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1050 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1060 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1070 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1080 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1090 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1100 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1110 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1120 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1130 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1140 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1150 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1160 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1170 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1180 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1190 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1200 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1210 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1220 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1230 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1240 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1250 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1260 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1270 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1280 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1290 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1300 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1310 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1320 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1330 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1340 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1350 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1360 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1370 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1380 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1390 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1400 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1410 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1420 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1430 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1440 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1450 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1460 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1470 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1480 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1490 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1500 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1510 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1520 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1530 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1540 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1550 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1560 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1570 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1580 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1590 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1600 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1610 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1620 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1630 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1640 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1650 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1660 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1670 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1680 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1690 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1700 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1710 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1720 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1730 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1740 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1750 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1760 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1770 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1780 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1790 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1800 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1810 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1820 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1830 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1840 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1850 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1860 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1870 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1880 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1890 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1900 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1910 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1920 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1930 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1940 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1950 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1960 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1970 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1980 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 1990 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2000 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2010 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2020 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2030 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2040 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2050 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2060 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2070 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2080 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2090 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2100 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2110 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2120 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2130 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2140 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2150 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2160 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2170 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2180 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2190 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2200 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2210 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2220 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2230 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2240 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2250 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2260 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2270 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2280 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2290 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2300 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2310 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2320 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2330 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2340 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2350 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2360 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2370 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2380 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2390 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2400 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2410 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2420 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2430 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2440 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2450 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2460 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2470 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2480 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2490 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2500 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2510 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2520 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2530 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2540 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2550 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2560 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2570 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2580 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2590 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2600 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2610 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2620 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2630 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2640 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2650 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2660 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2670 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2680 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2690 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2700 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2710 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2720 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2730 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2740 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2750 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2760 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2770 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2780 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2790 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2800 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2810 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2820 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2830 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2840 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2850 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2860 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2870 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2880 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2890 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2900 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2910 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2920 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2930 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2940 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2950 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2960 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2970 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2980 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 2990 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3000 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3010 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3020 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3030 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3040 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3050 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3060 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3070 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3080 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3090 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3100 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3110 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3120 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3130 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3140 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3150 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3160 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3170 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3180 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3190 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3200 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3210 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3220 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3230 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3240 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3250 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3260 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3270 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3280 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3290 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3300 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3310 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3320 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3330 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3340 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3350 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3360 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3370 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3380 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3390 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3400 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3410 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3420 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3430 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3440 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3450 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3460 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3470 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3480 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3490 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3500 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3510 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3520 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3530 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3540 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3550 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3560 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3570 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3580 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3590 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3600 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3610 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3620 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3630 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3640 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3650 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3660 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3670 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3680 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3690 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3700 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3710 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3720 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3730 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3740 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3750 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3760 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3770 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3780 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3790 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3800 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3810 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3820 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3830 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3840 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3850 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3860 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3870 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3880 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3890 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3900 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3910 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3920 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3930 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3940 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3950 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3960 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3970 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3980 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 3990 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4000 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4010 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4020 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4030 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4040 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4050 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4060 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4070 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4080 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4090 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4100 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4110 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4120 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4130 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4140 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4150 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4160 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4170 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4180 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4190 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4200 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4210 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4220 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4230 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4240 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4250 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4260 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4270 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4280 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4290 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4300 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4310 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4320 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4330 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4340 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4350 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4360 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4370 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4380 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4390 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4400 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4410 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4420 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4430 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4440 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4450 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4460 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4470 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4480 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4490 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4500 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4510 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4520 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4530 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4540 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4550 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4560 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4570 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4580 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4590 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4600 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4610 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4620 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4630 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4640 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4650 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4660 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4670 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4680 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4690 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4700 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4710 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4720 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4730 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4740 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4750 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4760 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4770 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4780 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4790 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4800 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4810 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4820 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4830 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4840 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4850 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4860 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4870 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4880 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4890 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4900 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4910 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4920 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4930 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4940 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4950 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4960 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4970 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4980 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 4990 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5000 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5010 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5020 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5030 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5040 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5050 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5060 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5070 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5080 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5090 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5100 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5110 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5120 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5130 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5140 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5150 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5160 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5170 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5180 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5190 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5200 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5210 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5220 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5230 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5240 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5250 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5260 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5270 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5280 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5290 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5300 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5310 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5320 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5330 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5340 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5350 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5360 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5370 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5380 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5390 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5400 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5410 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5420 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5430 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5440 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5450 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5460 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5470 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5480 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5490 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5500 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5510 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5520 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5530 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5540 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5550 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5560 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5570 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5580 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5590 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5600 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5610 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5620 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5630 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5640 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5650 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5660 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5670 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5680 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5690 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5700 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5710 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5720 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5730 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5740 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5750 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5760 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5770 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5780 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5790 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5800 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5810 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5820 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5830 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5840 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5850 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5860 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5870 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5880 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5890 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5900 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5910 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5920 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5930 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5940 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5950 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5960 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5970 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5980 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 5990 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6000 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6010 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6020 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6030 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6040 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6050 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6060 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6070 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6080 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6090 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6100 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6110 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6120 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6130 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6140 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6150 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6160 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6170 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6180 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6190 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6200 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6210 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6220 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6230 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6240 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6250 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6260 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6270 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6280 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6290 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6300 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6310 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6320 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6330 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6340 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6350 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6360 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6370 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6380 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6390 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6400 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6410 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6420 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6430 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6440 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6450 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6460 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6470 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6480 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6490 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6500 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6510 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6520 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6530 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6540 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6550 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6560 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6570 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6580 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6590 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6600 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6610 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6620 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6630 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6640 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6650 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6660 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6670 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6680 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6690 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6700 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6710 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6720 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6730 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6740 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6750 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6760 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6770 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6780 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6790 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6800 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6810 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6820 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6830 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6840 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6850 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6860 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6870 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6880 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6890 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6900 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6910 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6920 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6930 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6940 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6950 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6960 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6970 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6980 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 6990 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7000 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7010 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7020 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7030 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7040 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7050 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7060 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7070 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7080 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7090 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7100 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7110 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7120 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7130 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7140 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7150 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7160 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7170 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7180 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7190 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7200 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7210 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7220 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7230 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7240 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7250 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7260 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7270 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7280 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7290 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7300 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7310 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7320 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7330 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7340 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7350 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7360 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7370 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7380 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7390 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7400 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7410 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7420 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7430 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7440 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7450 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7460 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7470 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7480 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7490 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7500 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7510 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7520 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7530 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7540 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7550 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7560 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7570 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7580 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7590 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7600 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7610 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7620 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7630 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7640 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7650 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7660 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7670 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7680 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7690 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7700 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7710 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7720 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7730 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7740 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7750 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7760 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7770 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7780 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7790 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7800 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7810 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7820 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7830 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7840 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7850 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7860 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7870 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7880 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7890 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7900 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7910 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7920 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7930 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7940 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7950 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7960 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7970 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7980 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 7990 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8000 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8010 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8020 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8030 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8040 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8050 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8060 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8070 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8080 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8090 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8100 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8110 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8120 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8130 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8140 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8150 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8160 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8170 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8180 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8190 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8200 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8210 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8220 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8230 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8240 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8250 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8260 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8270 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8280 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8290 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8300 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8310 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8320 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8330 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8340 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8350 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8360 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8370 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8380 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8390 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8400 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8410 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8420 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8430 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8440 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8450 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8460 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8470 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8480 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8490 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8500 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8510 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8520 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8530 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8540 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8550 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8560 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8570 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8580 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8590 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8600 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8610 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8620 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8630 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8640 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8650 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8660 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8670 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8680 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8690 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8700 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8710 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8720 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8730 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8740 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8750 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8760 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8770 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8780 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8790 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8800 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8810 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8820 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8830 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8840 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8850 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8860 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8870 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8880 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8890 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8900 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8910 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8920 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8930 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8940 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8950 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8960 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8970 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8980 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 8990 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9000 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9010 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9020 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9030 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9040 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9050 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9060 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9070 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9080 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9090 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9100 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9110 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9120 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9130 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9140 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9150 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9160 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9170 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9180 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9190 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9200 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9210 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9220 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9230 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9240 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9250 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9260 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9270 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9280 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9290 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9300 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9310 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9320 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9330 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9340 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9350 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9360 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9370 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9380 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9390 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9400 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9410 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9420 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9430 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9440 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9450 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9460 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9470 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9480 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9490 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9500 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9510 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9520 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9530 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9540 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9550 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9560 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9570 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9580 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9590 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9600 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9610 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9620 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9630 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9640 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9650 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9660 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9670 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9680 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9690 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9700 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9710 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9720 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9730 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9740 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9750 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9760 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9770 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9780 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9790 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9800 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9810 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9820 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9830 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9840 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9850 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9860 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9870 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9880 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9890 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9900 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9910 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9920 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9930 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9940 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9950 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9960 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9970 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9980 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 9990 */ ++"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", /* 10000 */ ++"\n"); ++ return 0; ++} +--- gcc/testsuite/gcc.target/aarch64/stack-check-12.c ++++ gcc/testsuite/gcc.target/aarch64/stack-check-12.c +@@ -0,0 +1,20 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=12" } */ ++/* { dg-require-effective-target supports_stack_clash_protection } */ ++ ++extern void arf (unsigned long int *, unsigned long int *); ++void ++frob () ++{ ++ unsigned long int num[1000]; ++ unsigned long int den[1000]; ++ arf (den, num); ++} ++ ++/* This verifies that the scheduler did not break the dependencies ++ by adjusting the offsets within the probe and that the scheduler ++ did not reorder around the stack probes. */ ++/* { dg-final { scan-assembler-times "sub\\tsp, sp, #4096\\n\\tstr\\txzr, .sp, 4088." 3 } } */ ++ ++ ++ +--- gcc/testsuite/gcc.target/aarch64/stack-check-13.c ++++ gcc/testsuite/gcc.target/aarch64/stack-check-13.c +@@ -0,0 +1,28 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=12" } */ ++/* { dg-require-effective-target supports_stack_clash_protection } */ ++ ++#define ARG32(X) X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X ++#define ARG192(X) ARG32(X),ARG32(X),ARG32(X),ARG32(X),ARG32(X),ARG32(X) ++void out1(ARG192(__int128)); ++int t1(int); ++ ++int t3(int x) ++{ ++ if (x < 1000) ++ return t1 (x) + 1; ++ ++ out1 (ARG192(1)); ++ return 0; ++} ++ ++ ++ ++/* This test creates a large (> 1k) outgoing argument area that needs ++ to be probed. We don't test the exact size of the space or the ++ exact offset to make the test a little less sensitive to trivial ++ output changes. */ ++/* { dg-final { scan-assembler-times "sub\\tsp, sp, #....\\n\\tstr\\txzr, \\\[sp" 1 } } */ ++ ++ ++ +--- gcc/testsuite/gcc.target/aarch64/stack-check-14.c ++++ gcc/testsuite/gcc.target/aarch64/stack-check-14.c +@@ -0,0 +1,25 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=12" } */ ++/* { dg-require-effective-target supports_stack_clash_protection } */ ++ ++int t1(int); ++ ++int t2(int x) ++{ ++ char *p = __builtin_alloca (4050); ++ x = t1 (x); ++ return p[x]; ++} ++ ++ ++/* This test has a constant sized alloca that is smaller than the ++ probe interval. But it actually requires two probes instead ++ of one because of the optimistic assumptions we made in the ++ aarch64 prologue code WRT probing state. ++ ++ The form can change quite a bit so we just check for two ++ probes without looking at the actual address. */ ++/* { dg-final { scan-assembler-times "str\\txzr," 2 } } */ ++ ++ ++ +--- gcc/testsuite/gcc.target/aarch64/stack-check-15.c ++++ gcc/testsuite/gcc.target/aarch64/stack-check-15.c +@@ -0,0 +1,24 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=12" } */ ++/* { dg-require-effective-target supports_stack_clash_protection } */ ++ ++int t1(int); ++ ++int t2(int x) ++{ ++ char *p = __builtin_alloca (x); ++ x = t1 (x); ++ return p[x]; ++} ++ ++ ++/* This test has a variable sized alloca. It requires 3 probes. ++ One in the loop, one for the residual and at the end of the ++ alloca area. ++ ++ The form can change quite a bit so we just check for two ++ probes without looking at the actual address. */ ++/* { dg-final { scan-assembler-times "str\\txzr," 3 } } */ ++ ++ ++ +--- gcc/testsuite/lib/target-supports.exp ++++ gcc/testsuite/lib/target-supports.exp +@@ -8384,14 +8384,9 @@ proc check_effective_target_arm_coproc4_ok { } { + # + proc check_effective_target_supports_stack_clash_protection { } { + +- # Temporary until the target bits are fully ACK'd. +-# if { [istarget aarch*-*-*] } { +-# return 1 +-# } +- + if { [istarget x86_64-*-*] || [istarget i?86-*-*] + || [istarget powerpc*-*-*] || [istarget rs6000*-*-*] +- || [istarget s390*-*-*] } { ++ || [istarget aarch64*-**] || [istarget s390*-*-*] } { + return 1 + } + return 0 diff --git a/SOURCES/gcc7-rh1570967.patch b/SOURCES/gcc7-rh1570967.patch new file mode 100644 index 0000000..43bab56 --- /dev/null +++ b/SOURCES/gcc7-rh1570967.patch @@ -0,0 +1,81 @@ +commit 63256634cd46529bb3e839838f03dc4164feaa4c +Author: foreese +Date: Thu Aug 10 12:36:44 2017 +0000 + + 2017-08-10 Fritz Reese + + gcc/fortran/ChangeLog: + + * options.c (set_dec_flags, gfc_post_options): Only set flag_d_lines + with -fdec when not set by user. + + gcc/testsuite/ChangeLog: + + gfortran.dg/ + * dec_d_lines_1.f, dec_d_lines_2.f: New. + + + + git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@251024 138bc75d-0d04-0410-961f-82ee72b054a4 + +diff --git gcc/fortran/options.c gcc/fortran/options.c +index 283c8354e06..cd254e93229 100644 +--- gcc/fortran/options.c ++++ gcc/fortran/options.c +@@ -57,9 +57,6 @@ set_dec_flags (int value) + | GFC_STD_GNU | GFC_STD_LEGACY; + gfc_option.warn_std &= ~(GFC_STD_LEGACY | GFC_STD_F95_DEL); + +- /* Set -fd-lines-as-comments by default. */ +- if (value && gfc_current_form != FORM_FREE && gfc_option.flag_d_lines == -1) +- gfc_option.flag_d_lines = 0; + + /* Set other DEC compatibility extensions. */ + flag_dollar_ok |= value; +@@ -339,8 +336,15 @@ gfc_post_options (const char **pfilename) + diagnostic_classify_diagnostic (global_dc, OPT_Wline_truncation, + DK_ERROR, UNKNOWN_LOCATION); + } +- else if (warn_line_truncation == -1) +- warn_line_truncation = 0; ++ else ++ { ++ /* With -fdec, set -fd-lines-as-comments by default in fixed form. */ ++ if (flag_dec && gfc_option.flag_d_lines == -1) ++ gfc_option.flag_d_lines = 0; ++ ++ if (warn_line_truncation == -1) ++ warn_line_truncation = 0; ++ } + + /* If -pedantic, warn about the use of GNU extensions. */ + if (pedantic && (gfc_option.allow_std & GFC_STD_GNU) != 0) +diff --git gcc/testsuite/gfortran.dg/dec_d_lines_1.f gcc/testsuite/gfortran.dg/dec_d_lines_1.f +new file mode 100644 +index 00000000000..2cc7a01daff +--- /dev/null ++++ gcc/testsuite/gfortran.dg/dec_d_lines_1.f +@@ -0,0 +1,9 @@ ++! { dg-do compile } ++! { dg-options "-ffixed-form -fd-lines-as-code -fdec" } ++! ++! Ensure -fd-lines-as-code is not overridden by -fdec. ++! ++ i = 0 ++d end ++ subroutine s ++D end +diff --git gcc/testsuite/gfortran.dg/dec_d_lines_2.f gcc/testsuite/gfortran.dg/dec_d_lines_2.f +new file mode 100644 +index 00000000000..31eaf5f2328 +--- /dev/null ++++ gcc/testsuite/gfortran.dg/dec_d_lines_2.f +@@ -0,0 +1,8 @@ ++! { dg-do compile } ++! { dg-options "-ffixed-form -fdec" } ++! ++! Ensure -fd-lines-as-comments is enabled by default with -fdec. ++! ++d This is a comment. ++D This line, too. ++ end diff --git a/SOURCES/gcc7-sparc-config-detection.patch b/SOURCES/gcc7-sparc-config-detection.patch new file mode 100644 index 0000000..bb06b35 --- /dev/null +++ b/SOURCES/gcc7-sparc-config-detection.patch @@ -0,0 +1,40 @@ +--- gcc/config.gcc.jj 2008-04-24 15:42:46.000000000 -0500 ++++ gcc/config.gcc 2008-04-24 15:44:51.000000000 -0500 +@@ -2790,7 +2790,7 @@ sparc-*-rtems*) + tm_file="${tm_file} dbxelf.h elfos.h sparc/sysv4.h sparc/sp-elf.h sparc/rtemself.h rtems.h newlib-stdint.h" + tmake_file="${tmake_file} sparc/t-sparc sparc/t-rtems" + ;; +-sparc-*-linux*) ++sparc-*-linux* | sparcv9-*-linux*) + tm_file="${tm_file} dbxelf.h elfos.h sparc/sysv4.h gnu-user.h linux.h glibc-stdint.h sparc/tso.h" + extra_options="${extra_options} sparc/long-double-switch.opt" + case ${target} in +@@ -2844,7 +2844,7 @@ sparc64-*-rtems*) + extra_options="${extra_options}" + tmake_file="${tmake_file} sparc/t-sparc sparc/t-rtems-64" + ;; +-sparc64-*-linux*) ++sparc64*-*-linux*) + tm_file="sparc/biarch64.h ${tm_file} dbxelf.h elfos.h sparc/sysv4.h gnu-user.h linux.h glibc-stdint.h sparc/default64.h sparc/linux64.h sparc/tso.h" + extra_options="${extra_options} sparc/long-double-switch.opt" + tmake_file="${tmake_file} sparc/t-sparc sparc/t-linux64" +--- libgcc/config.host.jj 2008-04-24 15:46:19.000000000 -0500 ++++ libgcc/config.host 2008-04-24 15:46:49.000000000 -0500 +@@ -1002,7 +1002,7 @@ sparc-*-elf*) + tmake_file="${tmake_file} t-fdpbit t-crtfm" + extra_parts="$extra_parts crti.o crtn.o crtfastmath.o" + ;; +-sparc-*-linux*) # SPARC's running GNU/Linux, libc6 ++sparc-*-linux* | sparcv9-*-linux*) # SPARC's running GNU/Linux, libc6 + tmake_file="${tmake_file} t-crtfm" + if test "${host_address}" = 64; then + tmake_file="$tmake_file sparc/t-linux64" +@@ -1050,7 +1050,7 @@ sparc64-*-freebsd*|ultrasparc-*-freebsd* + tmake_file="$tmake_file t-crtfm" + extra_parts="$extra_parts crtfastmath.o" + ;; +-sparc64-*-linux*) # 64-bit SPARC's running GNU/Linux ++sparc64*-*-linux*) # 64-bit SPARC's running GNU/Linux + extra_parts="$extra_parts crtfastmath.o" + tmake_file="${tmake_file} t-crtfm sparc/t-linux" + if test "${host_address}" = 64; then diff --git a/SOURCES/gcc8-Wno-format-security.patch b/SOURCES/gcc8-Wno-format-security.patch new file mode 100644 index 0000000..cb21e5d --- /dev/null +++ b/SOURCES/gcc8-Wno-format-security.patch @@ -0,0 +1,27 @@ +2017-02-25 Jakub Jelinek + + * configure.ac: When adding -Wno-format, also add -Wno-format-security. + * configure: Regenerated. + +--- gcc/configure.ac.jj 2017-02-13 12:20:53.000000000 +0100 ++++ gcc/configure.ac 2017-02-25 12:42:32.859175403 +0100 +@@ -481,7 +481,7 @@ AC_ARG_ENABLE(build-format-warnings, + AS_HELP_STRING([--disable-build-format-warnings],[don't use -Wformat while building GCC]), + [],[enable_build_format_warnings=yes]) + AS_IF([test $enable_build_format_warnings = no], +- [wf_opt=-Wno-format],[wf_opt=]) ++ [wf_opt="-Wno-format -Wno-format-security"],[wf_opt=]) + ACX_PROG_CXX_WARNING_OPTS( + m4_quote(m4_do([-W -Wall -Wno-narrowing -Wwrite-strings ], + [-Wcast-qual $wf_opt])), [loose_warn]) +--- gcc/configure.jj 2017-02-13 12:20:52.000000000 +0100 ++++ gcc/configure 2017-02-25 12:42:50.041946391 +0100 +@@ -6647,7 +6647,7 @@ else + fi + + if test $enable_build_format_warnings = no; then : +- wf_opt=-Wno-format ++ wf_opt="-Wno-format -Wno-format-security" + else + wf_opt= + fi diff --git a/SOURCES/gcc8-alt-compat-test.patch b/SOURCES/gcc8-alt-compat-test.patch new file mode 100644 index 0000000..3907d55 --- /dev/null +++ b/SOURCES/gcc8-alt-compat-test.patch @@ -0,0 +1,49 @@ +--- gcc/testsuite/g++.dg/compat/struct-layout-1_generate.c.jj 2011-01-03 06:50:42.000000000 -0500 ++++ gcc/testsuite/g++.dg/compat/struct-layout-1_generate.c 2011-02-18 06:28:53.858200077 -0500 +@@ -1501,6 +1501,8 @@ generate_random_tests (enum FEATURE feat + int i, r; + if (len > 'z' - 'a' + 1) + abort (); ++ if (getenv ("ALT_CXX_UNDER_TEST") != NULL) ++ features &= ~FEATURE_VECTOR; + memset (e, 0, sizeof (e)); + r = generate_random (); + if ((r & 7) == 0) +--- gcc/testsuite/g++.dg/compat/compat.exp.jj 2011-01-03 06:50:42.000000000 -0500 ++++ gcc/testsuite/g++.dg/compat/compat.exp 2011-02-18 06:30:54.248200398 -0500 +@@ -116,7 +116,12 @@ if [info exists ALT_CXX_UNDER_TEST] then + } + + # Main loop. +-foreach src [lsort [find $srcdir/$subdir *_main.C]] { ++set tests [lsort [find $srcdir/$subdir *_main.C]] ++if { $use_alt != 0 } then { ++ set tests [prune $tests $srcdir/$subdir/decimal/*] ++} ++ ++foreach src $tests { + # If we're only testing specific files and this isn't one of them, skip it. + if ![runtest_file_p $runtests $src] then { + continue +--- gcc/testsuite/gcc.dg/compat/struct-layout-1_generate.c.jj 2011-01-03 06:49:58.000000000 -0500 ++++ gcc/testsuite/gcc.dg/compat/struct-layout-1_generate.c 2011-02-18 06:27:54.922262671 -0500 +@@ -1912,6 +1912,8 @@ generate_random_tests (enum FEATURE feat + int i, r; + if (len > 'z' - 'a' + 1) + abort (); ++ if (getenv ("ALT_CC_UNDER_TEST") != NULL) ++ features &= ~FEATURE_VECTOR; + memset (e, 0, sizeof (e)); + r = generate_random (); + if ((r & 7) == 0) +--- gcc/testsuite/lib/c-compat.exp.jj 2011-01-03 06:48:38.000000000 -0500 ++++ gcc/testsuite/lib/c-compat.exp 2011-02-18 06:38:19.124265008 -0500 +@@ -75,7 +75,7 @@ proc compat_setup_dfp { } { + # If there is an alternate compiler, does it support decimal float types? + if { $compat_have_dfp == 1 && $compat_use_alt == 1 && $compat_same_alt == 0 } { + compat-use-alt-compiler +- set compat_have_dfp [check_effective_target_dfprt_nocache] ++ set compat_have_dfp 0 + compat-use-tst-compiler + verbose "compat_have_dfp for alt compiler: $compat_have_dfp" 2 + } diff --git a/SOURCES/gcc8-foffload-default.patch b/SOURCES/gcc8-foffload-default.patch new file mode 100644 index 0000000..771e1e0 --- /dev/null +++ b/SOURCES/gcc8-foffload-default.patch @@ -0,0 +1,117 @@ +2017-01-20 Jakub Jelinek + + * gcc.c (offload_targets_default): New variable. + (process_command): Set it if -foffload is defaulted. + (driver::maybe_putenv_OFFLOAD_TARGETS): Add OFFLOAD_TARGET_DEFAULT=1 + into environment if -foffload has been defaulted. + * lto-wrapper.c (OFFLOAD_TARGET_DEFAULT_ENV): Define. + (compile_images_for_offload_targets): If OFFLOAD_TARGET_DEFAULT + is in the environment, don't fail if corresponding mkoffload + can't be found. Free and clear offload_names if no valid offload + is found. +libgomp/ + * target.c (gomp_load_plugin_for_device): If a plugin can't be + dlopened, assume it has no devices silently. + +--- gcc/gcc.c.jj 2017-01-17 10:28:40.000000000 +0100 ++++ gcc/gcc.c 2017-01-20 16:26:29.649962902 +0100 +@@ -290,6 +290,10 @@ static const char *spec_host_machine = D + + static char *offload_targets = NULL; + ++/* Set to true if -foffload has not been used and offload_targets ++ is set to the configured in default. */ ++static bool offload_targets_default; ++ + /* Nonzero if cross-compiling. + When -b is used, the value comes from the `specs' file. */ + +@@ -4457,7 +4461,10 @@ process_command (unsigned int decoded_op + /* If the user didn't specify any, default to all configured offload + targets. */ + if (ENABLE_OFFLOADING && offload_targets == NULL) +- handle_foffload_option (OFFLOAD_TARGETS); ++ { ++ handle_foffload_option (OFFLOAD_TARGETS); ++ offload_targets_default = true; ++ } + + if (output_file + && strcmp (output_file, "-") != 0 +@@ -7693,6 +7700,8 @@ driver::maybe_putenv_OFFLOAD_TARGETS () + obstack_grow (&collect_obstack, offload_targets, + strlen (offload_targets) + 1); + xputenv (XOBFINISH (&collect_obstack, char *)); ++ if (offload_targets_default) ++ xputenv ("OFFLOAD_TARGET_DEFAULT=1"); + } + + free (offload_targets); +--- gcc/lto-wrapper.c.jj 2017-01-01 12:45:34.000000000 +0100 ++++ gcc/lto-wrapper.c 2017-01-20 16:34:18.294016997 +0100 +@@ -52,6 +52,7 @@ along with GCC; see the file COPYING3. + /* Environment variable, used for passing the names of offload targets from GCC + driver to lto-wrapper. */ + #define OFFLOAD_TARGET_NAMES_ENV "OFFLOAD_TARGET_NAMES" ++#define OFFLOAD_TARGET_DEFAULT_ENV "OFFLOAD_TARGET_DEFAULT" + + enum lto_mode_d { + LTO_MODE_NONE, /* Not doing LTO. */ +@@ -790,8 +791,10 @@ compile_images_for_offload_targets (unsi + if (!target_names) + return; + unsigned num_targets = parse_env_var (target_names, &names, NULL); ++ const char *target_names_default = getenv (OFFLOAD_TARGET_DEFAULT_ENV); + + int next_name_entry = 0; ++ bool hsa_seen = false; + const char *compiler_path = getenv ("COMPILER_PATH"); + if (!compiler_path) + goto out; +@@ -804,18 +807,32 @@ compile_images_for_offload_targets (unsi + /* HSA does not use LTO-like streaming and a different compiler, skip + it. */ + if (strcmp (names[i], "hsa") == 0) +- continue; ++ { ++ hsa_seen = true; ++ continue; ++ } + + offload_names[next_name_entry] + = compile_offload_image (names[i], compiler_path, in_argc, in_argv, + compiler_opts, compiler_opt_count, + linker_opts, linker_opt_count); + if (!offload_names[next_name_entry]) +- fatal_error (input_location, +- "problem with building target image for %s\n", names[i]); ++ { ++ if (target_names_default != NULL) ++ continue; ++ fatal_error (input_location, ++ "problem with building target image for %s\n", ++ names[i]); ++ } + next_name_entry++; + } + ++ if (next_name_entry == 0 && !hsa_seen) ++ { ++ free (offload_names); ++ offload_names = NULL; ++ } ++ + out: + free_array_of_ptrs ((void **) names, num_targets); + } +--- libgomp/target.c.jj 2017-01-01 12:45:52.000000000 +0100 ++++ libgomp/target.c 2017-01-20 20:12:13.756710875 +0100 +@@ -2356,7 +2356,7 @@ gomp_load_plugin_for_device (struct gomp + + void *plugin_handle = dlopen (plugin_name, RTLD_LAZY); + if (!plugin_handle) +- goto dl_fail; ++ return 0; + + /* Check if all required functions are available in the plugin and store + their handlers. None of the symbols can legitimately be NULL, diff --git a/SOURCES/gcc8-hack.patch b/SOURCES/gcc8-hack.patch new file mode 100644 index 0000000..515173f --- /dev/null +++ b/SOURCES/gcc8-hack.patch @@ -0,0 +1,124 @@ +--- libada/Makefile.in.jj 2009-01-14 12:07:35.000000000 +0100 ++++ libada/Makefile.in 2009-01-15 14:25:33.000000000 +0100 +@@ -66,18 +66,40 @@ libsubdir := $(libdir)/gcc/$(target_nonc + ADA_RTS_DIR=$(GCC_DIR)/ada/rts$(subst /,_,$(MULTISUBDIR)) + ADA_RTS_SUBDIR=./rts$(subst /,_,$(MULTISUBDIR)) + ++DEFAULTMULTIFLAGS := ++ifeq ($(MULTISUBDIR),) ++targ:=$(subst -, ,$(target)) ++arch:=$(word 1,$(targ)) ++ifeq ($(words $(targ)),2) ++osys:=$(word 2,$(targ)) ++else ++osys:=$(word 3,$(targ)) ++endif ++ifeq ($(strip $(filter-out i%86 x86_64 powerpc% ppc% s390% sparc% linux%, $(arch) $(osys))),) ++ifeq ($(shell $(CC) $(CFLAGS) -print-multi-os-directory),../lib64) ++DEFAULTMULTIFLAGS := -m64 ++else ++ifeq ($(strip $(filter-out s390%, $(arch))),) ++DEFAULTMULTIFLAGS := -m31 ++else ++DEFAULTMULTIFLAGS := -m32 ++endif ++endif ++endif ++endif ++ + # exeext should not be used because it's the *host* exeext. We're building + # a *target* library, aren't we?!? Likewise for CC. Still, provide bogus + # definitions just in case something slips through the safety net provided + # by recursive make invocations in gcc/ada/Makefile.in + LIBADA_FLAGS_TO_PASS = \ + "MAKEOVERRIDES=" \ +- "LDFLAGS=$(LDFLAGS)" \ ++ "LDFLAGS=$(LDFLAGS) $(DEFAULTMULTIFLAGS)" \ + "LN_S=$(LN_S)" \ + "SHELL=$(SHELL)" \ +- "GNATLIBFLAGS=$(GNATLIBFLAGS) $(MULTIFLAGS)" \ +- "GNATLIBCFLAGS=$(GNATLIBCFLAGS) $(MULTIFLAGS)" \ +- "GNATLIBCFLAGS_FOR_C=$(GNATLIBCFLAGS_FOR_C) $(MULTIFLAGS)" \ ++ "GNATLIBFLAGS=$(GNATLIBFLAGS) $(MULTIFLAGS) $(DEFAULTMULTIFLAGS)" \ ++ "GNATLIBCFLAGS=$(GNATLIBCFLAGS) $(MULTIFLAGS) $(DEFAULTMULTIFLAGS)" \ ++ "GNATLIBCFLAGS_FOR_C=$(GNATLIBCFLAGS_FOR_C) $(MULTIFLAGS) $(DEFAULTMULTIFLAGS)" \ + "PICFLAG_FOR_TARGET=$(PICFLAG)" \ + "THREAD_KIND=$(THREAD_KIND)" \ + "TRACE=$(TRACE)" \ +@@ -88,7 +110,7 @@ LIBADA_FLAGS_TO_PASS = \ + "exeext=.exeext.should.not.be.used " \ + 'CC=the.host.compiler.should.not.be.needed' \ + "GCC_FOR_TARGET=$(CC)" \ +- "CFLAGS=$(CFLAGS)" ++ "CFLAGS=$(CFLAGS) $(DEFAULTMULTIFLAGS)" + + # Rules to build gnatlib. + .PHONY: gnatlib gnatlib-plain gnatlib-sjlj gnatlib-zcx gnatlib-shared osconstool +--- config-ml.in.jj 2010-06-30 09:50:44.000000000 +0200 ++++ config-ml.in 2010-07-02 21:24:17.994211151 +0200 +@@ -511,6 +511,8 @@ multi-do: + ADAFLAGS="$(ADAFLAGS) $${flags}" \ + prefix="$(prefix)" \ + exec_prefix="$(exec_prefix)" \ ++ mandir="$(mandir)" \ ++ infodir="$(infodir)" \ + GOCFLAGS="$(GOCFLAGS) $${flags}" \ + CXXFLAGS="$(CXXFLAGS) $${flags}" \ + LIBCFLAGS="$(LIBCFLAGS) $${flags}" \ +--- libcpp/macro.c.jj 2015-01-14 11:01:34.000000000 +0100 ++++ libcpp/macro.c 2015-01-14 14:22:19.286949884 +0100 +@@ -2947,8 +2947,6 @@ create_iso_definition (cpp_reader *pfile + cpp_token *token; + const cpp_token *ctoken; + bool following_paste_op = false; +- const char *paste_op_error_msg = +- N_("'##' cannot appear at either end of a macro expansion"); + unsigned int num_extra_tokens = 0; + + /* Get the first token of the expansion (or the '(' of a +@@ -3059,7 +3057,8 @@ create_iso_definition (cpp_reader *pfile + function-like macros, but not at the end. */ + if (following_paste_op) + { +- cpp_error (pfile, CPP_DL_ERROR, paste_op_error_msg); ++ cpp_error (pfile, CPP_DL_ERROR, ++ "'##' cannot appear at either end of a macro expansion"); + return false; + } + break; +@@ -3072,7 +3071,8 @@ create_iso_definition (cpp_reader *pfile + function-like macros, but not at the beginning. */ + if (macro->count == 1) + { +- cpp_error (pfile, CPP_DL_ERROR, paste_op_error_msg); ++ cpp_error (pfile, CPP_DL_ERROR, ++ "'##' cannot appear at either end of a macro expansion"); + return false; + } + +--- libcpp/expr.c.jj 2015-01-14 11:01:34.000000000 +0100 ++++ libcpp/expr.c 2015-01-14 14:35:52.851002344 +0100 +@@ -672,16 +672,17 @@ cpp_classify_number (cpp_reader *pfile, + if ((result & CPP_N_WIDTH) == CPP_N_LARGE + && CPP_OPTION (pfile, cpp_warn_long_long)) + { +- const char *message = CPP_OPTION (pfile, cplusplus) +- ? N_("use of C++11 long long integer constant") +- : N_("use of C99 long long integer constant"); +- + if (CPP_OPTION (pfile, c99)) + cpp_warning_with_line (pfile, CPP_W_LONG_LONG, virtual_location, +- 0, message); ++ 0, CPP_OPTION (pfile, cplusplus) ++ ? N_("use of C++11 long long integer constant") ++ : N_("use of C99 long long integer constant")); + else + cpp_pedwarning_with_line (pfile, CPP_W_LONG_LONG, +- virtual_location, 0, message); ++ virtual_location, 0, ++ CPP_OPTION (pfile, cplusplus) ++ ? N_("use of C++11 long long integer constant") ++ : N_("use of C99 long long integer constant")); + } + + result |= CPP_N_INTEGER; diff --git a/SOURCES/gcc8-htm-in-asm.patch b/SOURCES/gcc8-htm-in-asm.patch new file mode 100644 index 0000000..a7f1b7b --- /dev/null +++ b/SOURCES/gcc8-htm-in-asm.patch @@ -0,0 +1,55 @@ +--- libitm/config/x86/target.h.jj 2013-06-23 20:43:50.000000000 +0200 ++++ libitm/config/x86/target.h 2013-08-13 17:14:57.540012109 +0200 +@@ -64,7 +64,7 @@ cpu_relax (void) + + // Use Intel RTM if supported by the assembler. + // See gtm_thread::begin_transaction for how these functions are used. +-#ifdef HAVE_AS_RTM ++#if 1 /* def HAVE_AS_RTM */ + #define USE_HTM_FASTPATH + #ifdef __x86_64__ + // Use the custom fastpath in ITM_beginTransaction. +@@ -97,7 +97,10 @@ htm_init () + static inline uint32_t + htm_begin () + { +- return _xbegin(); ++// return _xbegin(); ++ uint32_t ret; ++ __asm volatile ("movl $-1, %%eax; .byte 0xc7, 0xf8, 0, 0, 0, 0" : "=a" (ret) : : "memory"); ++ return ret; + } + + static inline bool +@@ -109,7 +112,8 @@ htm_begin_success (uint32_t begin_ret) + static inline void + htm_commit () + { +- _xend(); ++// _xend(); ++ __asm volatile (".byte 0x0f, 0x01, 0xd5" : : : "memory"); + } + + static inline void +@@ -117,7 +121,8 @@ htm_abort () + { + // ??? According to a yet unpublished ABI rule, 0xff is reserved and + // supposed to signal a busy lock. Source: andi.kleen@intel.com +- _xabort(0xff); ++// _xabort(0xff); ++ __asm volatile (".byte 0xc6, 0xf8, 0xff" : : : "memory"); + } + + static inline bool +@@ -130,7 +135,10 @@ htm_abort_should_retry (uint32_t begin_r + static inline bool + htm_transaction_active () + { +- return _xtest() != 0; ++// return _xtest() != 0; ++ bool ret; ++ __asm volatile (".byte 0x0f, 0x01, 0xd6; setne %%al" : "=a" (ret) : : "memory"); ++ return ret; + } + #endif + diff --git a/SOURCES/gcc8-i386-libgomp.patch b/SOURCES/gcc8-i386-libgomp.patch new file mode 100644 index 0000000..520561e --- /dev/null +++ b/SOURCES/gcc8-i386-libgomp.patch @@ -0,0 +1,11 @@ +--- libgomp/configure.tgt.jj 2008-01-10 20:53:48.000000000 +0100 ++++ libgomp/configure.tgt 2008-03-27 12:44:51.000000000 +0100 +@@ -67,7 +67,7 @@ if test $enable_linux_futex = yes; then + ;; + *) + if test -z "$with_arch"; then +- XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}" ++ XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic" + fi + esac + ;; diff --git a/SOURCES/gcc8-libgomp-omp_h-multilib.patch b/SOURCES/gcc8-libgomp-omp_h-multilib.patch new file mode 100644 index 0000000..d0e98d1 --- /dev/null +++ b/SOURCES/gcc8-libgomp-omp_h-multilib.patch @@ -0,0 +1,17 @@ +2008-06-09 Jakub Jelinek + + * omp.h.in (omp_nest_lock_t): Fix up for Linux multilibs. + +--- libgomp/omp.h.in.jj 2008-06-09 13:34:05.000000000 +0200 ++++ libgomp/omp.h.in 2008-06-09 13:34:48.000000000 +0200 +@@ -42,8 +42,8 @@ typedef struct + + typedef struct + { +- unsigned char _x[@OMP_NEST_LOCK_SIZE@] +- __attribute__((__aligned__(@OMP_NEST_LOCK_ALIGN@))); ++ unsigned char _x[8 + sizeof (void *)] ++ __attribute__((__aligned__(sizeof (void *)))); + } omp_nest_lock_t; + #endif + diff --git a/SOURCES/gcc8-libtool-no-rpath.patch b/SOURCES/gcc8-libtool-no-rpath.patch new file mode 100644 index 0000000..466c661 --- /dev/null +++ b/SOURCES/gcc8-libtool-no-rpath.patch @@ -0,0 +1,27 @@ +libtool sucks. +--- ltmain.sh.jj 2007-12-07 14:53:21.000000000 +0100 ++++ ltmain.sh 2008-09-05 21:51:48.000000000 +0200 +@@ -5394,6 +5394,7 @@ EOF + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do ++ case "$libdir" in /usr/lib|/usr/lib64|/usr/lib/../lib|/usr/lib/../lib64) continue;; esac + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then +@@ -6071,6 +6072,7 @@ EOF + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do ++ case "$libdir" in /usr/lib|/usr/lib64|/usr/lib/../lib|/usr/lib/../lib64) continue;; esac + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then +@@ -6120,6 +6122,7 @@ EOF + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do ++ case "$libdir" in /usr/lib|/usr/lib64|/usr/lib/../lib|/usr/lib/../lib64) continue;; esac + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then diff --git a/SOURCES/gcc8-mcet.patch b/SOURCES/gcc8-mcet.patch new file mode 100644 index 0000000..6fb78ca --- /dev/null +++ b/SOURCES/gcc8-mcet.patch @@ -0,0 +1,17 @@ +2018-04-24 Jakub Jelinek + + * config/i386/i386.opt (mcet): Remporarily re-add as alias to -mshstk. + +--- gcc/config/i386/i386.opt (revision 259613) ++++ gcc/config/i386/i386.opt (revision 259612) +@@ -1006,6 +1006,10 @@ mgeneral-regs-only + Target Report RejectNegative Mask(GENERAL_REGS_ONLY) Var(ix86_target_flags) Save + Generate code which uses only the general registers. + ++mcet ++Target Undocumented Alias(mshstk) ++;; Deprecated ++ + mshstk + Target Report Mask(ISA_SHSTK) Var(ix86_isa_flags) Save + Enable shadow stack built-in functions from Control-flow Enforcement diff --git a/SOURCES/gcc8-no-add-needed.patch b/SOURCES/gcc8-no-add-needed.patch new file mode 100644 index 0000000..aa2f52d --- /dev/null +++ b/SOURCES/gcc8-no-add-needed.patch @@ -0,0 +1,50 @@ +2010-02-08 Roland McGrath + + * config/rs6000/sysv4.h (LINK_EH_SPEC): Pass --no-add-needed to the + linker. + * config/gnu-user.h (LINK_EH_SPEC): Likewise. + * config/alpha/elf.h (LINK_EH_SPEC): Likewise. + * config/ia64/linux.h (LINK_EH_SPEC): Likewise. + +--- gcc/config/alpha/elf.h.jj 2011-01-03 12:52:31.118056764 +0100 ++++ gcc/config/alpha/elf.h 2011-01-04 18:14:10.931874160 +0100 +@@ -168,5 +168,5 @@ extern int alpha_this_gpdisp_sequence_nu + I imagine that other systems will catch up. In the meantime, it + doesn't harm to make sure that the data exists to be used later. */ + #if defined(HAVE_LD_EH_FRAME_HDR) +-#define LINK_EH_SPEC "%{!static|static-pie:--eh-frame-hdr} " ++#define LINK_EH_SPEC "--no-add-needed %{!static|static-pie:--eh-frame-hdr} " + #endif +--- gcc/config/ia64/linux.h.jj 2011-01-03 13:02:11.462994522 +0100 ++++ gcc/config/ia64/linux.h 2011-01-04 18:14:10.931874160 +0100 +@@ -76,7 +76,7 @@ do { \ + Signalize that because we have fde-glibc, we don't need all C shared libs + linked against -lgcc_s. */ + #undef LINK_EH_SPEC +-#define LINK_EH_SPEC "" ++#define LINK_EH_SPEC "--no-add-needed " + + #undef TARGET_INIT_LIBFUNCS + #define TARGET_INIT_LIBFUNCS ia64_soft_fp_init_libfuncs +--- gcc/config/gnu-user.h.jj 2011-01-03 12:53:03.739057299 +0100 ++++ gcc/config/gnu-user.h 2011-01-04 18:14:10.932814884 +0100 +@@ -133,7 +133,7 @@ see the files COPYING3 and COPYING.RUNTI + #define LIB_SPEC GNU_USER_TARGET_LIB_SPEC + + #if defined(HAVE_LD_EH_FRAME_HDR) +-#define LINK_EH_SPEC "%{!static|static-pie:--eh-frame-hdr} " ++#define LINK_EH_SPEC "--no-add-needed %{!static|static-pie:--eh-frame-hdr} " + #endif + + #undef LINK_GCC_C_SEQUENCE_SPEC +--- gcc/config/rs6000/sysv4.h.jj 2011-01-03 13:02:18.255994215 +0100 ++++ gcc/config/rs6000/sysv4.h 2011-01-04 18:14:10.933888871 +0100 +@@ -816,7 +816,7 @@ ENDIAN_SELECT(" -mbig", " -mlittle", DEF + -dynamic-linker " GNU_USER_DYNAMIC_LINKER "}}" + + #if defined(HAVE_LD_EH_FRAME_HDR) +-# define LINK_EH_SPEC "%{!static|static-pie:--eh-frame-hdr} " ++# define LINK_EH_SPEC "--no-add-needed %{!static|static-pie:--eh-frame-hdr} " + #endif + + #define CPP_OS_LINUX_SPEC "-D__unix__ -D__gnu_linux__ -D__linux__ \ diff --git a/SOURCES/gcc8-rh1118870.patch b/SOURCES/gcc8-rh1118870.patch new file mode 100644 index 0000000..9865e72 --- /dev/null +++ b/SOURCES/gcc8-rh1118870.patch @@ -0,0 +1,20 @@ +2014-07-23 Jonathan Wakely + + * testsuite/30_threads/condition_variable_any/rh1118870.cc: New test. + +--- libstdc++-v3/testsuite/30_threads/condition_variable_any/rh1118870.cc ++++ libstdc++-v3/testsuite/30_threads/condition_variable_any/rh1118870.cc +@@ -0,0 +1,13 @@ ++// { dg-options " -std=gnu++11 -pthread" } ++#include ++#include ++ ++int main() ++{ ++ const size_t sz = sizeof(std::condition_variable_any); ++ char garbage[sz]; ++ memset(garbage, 0xff, sz); ++ auto cond = new ((void*)garbage) std::condition_variable_any(); ++ cond->notify_all(); ++ cond->~condition_variable_any(); ++} diff --git a/SOURCES/gcc8-rh1512529-aarch64.patch b/SOURCES/gcc8-rh1512529-aarch64.patch new file mode 100644 index 0000000..4030027 --- /dev/null +++ b/SOURCES/gcc8-rh1512529-aarch64.patch @@ -0,0 +1,445 @@ +--- gcc/config/aarch64/aarch64.c ++++ gcc/config/aarch64/aarch64.c +@@ -3799,7 +3799,14 @@ aarch64_output_probe_stack_range (rtx reg1, rtx reg2) + output_asm_insn ("sub\t%0, %0, %1", xops); + + /* Probe at TEST_ADDR. */ +- output_asm_insn ("str\txzr, [%0]", xops); ++ if (flag_stack_clash_protection) ++ { ++ gcc_assert (xops[0] == stack_pointer_rtx); ++ xops[1] = GEN_INT (PROBE_INTERVAL - 8); ++ output_asm_insn ("str\txzr, [%0, %1]", xops); ++ } ++ else ++ output_asm_insn ("str\txzr, [%0]", xops); + + /* Test if TEST_ADDR == LAST_ADDR. */ + xops[1] = reg2; +@@ -4589,6 +4596,133 @@ aarch64_set_handled_components (sbitmap components) + cfun->machine->reg_is_wrapped_separately[regno] = true; + } + ++/* Allocate POLY_SIZE bytes of stack space using TEMP1 and TEMP2 as scratch ++ registers. */ ++ ++static void ++aarch64_allocate_and_probe_stack_space (rtx temp1, rtx temp2, ++ poly_int64 poly_size) ++{ ++ HOST_WIDE_INT size; ++ if (!poly_size.is_constant (&size)) ++ { ++ sorry ("stack probes for SVE frames"); ++ return; ++ } ++ ++ HOST_WIDE_INT probe_interval ++ = 1 << PARAM_VALUE (PARAM_STACK_CLASH_PROTECTION_PROBE_INTERVAL); ++ HOST_WIDE_INT guard_size ++ = 1 << PARAM_VALUE (PARAM_STACK_CLASH_PROTECTION_GUARD_SIZE); ++ HOST_WIDE_INT guard_used_by_caller = 1024; ++ ++ /* SIZE should be large enough to require probing here. ie, it ++ must be larger than GUARD_SIZE - GUARD_USED_BY_CALLER. ++ ++ We can allocate GUARD_SIZE - GUARD_USED_BY_CALLER as a single chunk ++ without any probing. */ ++ gcc_assert (size >= guard_size - guard_used_by_caller); ++ aarch64_sub_sp (temp1, temp2, guard_size - guard_used_by_caller, true); ++ HOST_WIDE_INT orig_size = size; ++ size -= (guard_size - guard_used_by_caller); ++ ++ HOST_WIDE_INT rounded_size = size & -probe_interval; ++ HOST_WIDE_INT residual = size - rounded_size; ++ ++ /* We can handle a small number of allocations/probes inline. Otherwise ++ punt to a loop. */ ++ if (rounded_size && rounded_size <= 4 * probe_interval) ++ { ++ /* We don't use aarch64_sub_sp here because we don't want to ++ repeatedly load TEMP1. */ ++ rtx step = GEN_INT (-probe_interval); ++ if (probe_interval > ARITH_FACTOR) ++ { ++ emit_move_insn (temp1, step); ++ step = temp1; ++ } ++ ++ for (HOST_WIDE_INT i = 0; i < rounded_size; i += probe_interval) ++ { ++ rtx_insn *insn = emit_insn (gen_add2_insn (stack_pointer_rtx, step)); ++ add_reg_note (insn, REG_STACK_CHECK, const0_rtx); ++ ++ if (probe_interval > ARITH_FACTOR) ++ { ++ RTX_FRAME_RELATED_P (insn) = 1; ++ rtx adj = plus_constant (Pmode, stack_pointer_rtx, -probe_interval); ++ add_reg_note (insn, REG_CFA_ADJUST_CFA, ++ gen_rtx_SET (stack_pointer_rtx, adj)); ++ } ++ ++ emit_stack_probe (plus_constant (Pmode, stack_pointer_rtx, ++ (probe_interval ++ - GET_MODE_SIZE (word_mode)))); ++ emit_insn (gen_blockage ()); ++ } ++ dump_stack_clash_frame_info (PROBE_INLINE, size != rounded_size); ++ } ++ else if (rounded_size) ++ { ++ /* Compute the ending address. */ ++ unsigned int scratchreg = REGNO (temp1); ++ emit_move_insn (temp1, GEN_INT (-rounded_size)); ++ rtx_insn *insn ++ = emit_insn (gen_add3_insn (temp1, stack_pointer_rtx, temp1)); ++ ++ /* For the initial allocation, we don't have a frame pointer ++ set up, so we always need CFI notes. If we're doing the ++ final allocation, then we may have a frame pointer, in which ++ case it is the CFA, otherwise we need CFI notes. ++ ++ We can determine which allocation we are doing by looking at ++ the temporary register. IP0 is the initial allocation, IP1 ++ is the final allocation. */ ++ if (scratchreg == IP0_REGNUM || !frame_pointer_needed) ++ { ++ /* We want the CFA independent of the stack pointer for the ++ duration of the loop. */ ++ add_reg_note (insn, REG_CFA_DEF_CFA, ++ plus_constant (Pmode, temp1, ++ (rounded_size + (orig_size - size)))); ++ RTX_FRAME_RELATED_P (insn) = 1; ++ } ++ ++ /* This allocates and probes the stack. ++ ++ It also probes at a 4k interval regardless of the value of ++ PARAM_STACK_CLASH_PROTECTION_PROBE_INTERVAL. */ ++ insn = emit_insn (gen_probe_stack_range (stack_pointer_rtx, ++ stack_pointer_rtx, temp1)); ++ ++ /* Now reset the CFA register if needed. */ ++ if (scratchreg == IP0_REGNUM || !frame_pointer_needed) ++ { ++ add_reg_note (insn, REG_CFA_DEF_CFA, ++ plus_constant (Pmode, stack_pointer_rtx, ++ (rounded_size + (orig_size - size)))); ++ RTX_FRAME_RELATED_P (insn) = 1; ++ } ++ ++ emit_insn (gen_blockage ()); ++ dump_stack_clash_frame_info (PROBE_LOOP, size != rounded_size); ++ } ++ else ++ dump_stack_clash_frame_info (PROBE_INLINE, size != rounded_size); ++ ++ /* Handle any residuals. ++ Note that any residual must be probed. */ ++ if (residual) ++ { ++ aarch64_sub_sp (temp1, temp2, residual, true); ++ add_reg_note (get_last_insn (), REG_STACK_CHECK, const0_rtx); ++ emit_stack_probe (plus_constant (Pmode, stack_pointer_rtx, ++ (residual - GET_MODE_SIZE (word_mode)))); ++ emit_insn (gen_blockage ()); ++ } ++ return; ++} ++ + /* Add a REG_CFA_EXPRESSION note to INSN to say that register REG + is saved at BASE + OFFSET. */ + +@@ -4686,7 +4820,54 @@ aarch64_expand_prologue (void) + rtx ip0_rtx = gen_rtx_REG (Pmode, IP0_REGNUM); + rtx ip1_rtx = gen_rtx_REG (Pmode, IP1_REGNUM); + +- aarch64_sub_sp (ip0_rtx, ip1_rtx, initial_adjust, true); ++ /* We do not fully protect aarch64 against stack clash style attacks ++ as doing so would be prohibitively expensive with less utility over ++ time as newer compilers are deployed. ++ ++ We assume the guard is at least 64k. Furthermore, we assume that ++ the caller has not pushed the stack pointer more than 1k into ++ the guard. A caller that pushes the stack pointer than 1k into ++ the guard is considered invalid. ++ ++ Note that the caller's ability to push the stack pointer into the ++ guard is a function of the number and size of outgoing arguments and/or ++ dynamic stack allocations due to the mandatory save of the link register ++ in the caller's frame. ++ ++ With those assumptions the callee can allocate up to 63k of stack ++ space without probing. ++ ++ When probing is needed, we emit a probe at the start of the prologue ++ and every PARAM_STACK_CLASH_PROTECTION_PROBE_INTERVAL bytes thereafter. ++ ++ We have to track how much space has been allocated, but we do not ++ track stores into the stack as implicit probes except for the ++ fp/lr store. */ ++ HOST_WIDE_INT guard_size ++ = 1 << PARAM_VALUE (PARAM_STACK_CLASH_PROTECTION_GUARD_SIZE); ++ HOST_WIDE_INT guard_used_by_caller = 1024; ++ if (flag_stack_clash_protection) ++ { ++ if (known_eq (frame_size, 0)) ++ dump_stack_clash_frame_info (NO_PROBE_NO_FRAME, false); ++ else if (known_lt (initial_adjust, guard_size - guard_used_by_caller) ++ && known_lt (final_adjust, guard_size - guard_used_by_caller)) ++ dump_stack_clash_frame_info (NO_PROBE_SMALL_FRAME, true); ++ } ++ ++ /* In theory we should never have both an initial adjustment ++ and a callee save adjustment. Verify that is the case since the ++ code below does not handle it for -fstack-clash-protection. */ ++ gcc_assert (known_eq (initial_adjust, 0) || callee_adjust == 0); ++ ++ /* Only probe if the initial adjustment is larger than the guard ++ less the amount of the guard reserved for use by the caller's ++ outgoing args. */ ++ if (flag_stack_clash_protection ++ && maybe_ge (initial_adjust, guard_size - guard_used_by_caller)) ++ aarch64_allocate_and_probe_stack_space (ip0_rtx, ip1_rtx, initial_adjust); ++ else ++ aarch64_sub_sp (ip0_rtx, ip1_rtx, initial_adjust, true); + + if (callee_adjust != 0) + aarch64_push_regs (reg1, reg2, callee_adjust); +@@ -4742,7 +4923,31 @@ aarch64_expand_prologue (void) + callee_adjust != 0 || emit_frame_chain); + aarch64_save_callee_saves (DFmode, callee_offset, V0_REGNUM, V31_REGNUM, + callee_adjust != 0 || emit_frame_chain); +- aarch64_sub_sp (ip1_rtx, ip0_rtx, final_adjust, !frame_pointer_needed); ++ ++ /* We may need to probe the final adjustment as well. */ ++ if (flag_stack_clash_protection && maybe_ne (final_adjust, 0)) ++ { ++ /* First probe if the final adjustment is larger than the guard size ++ less the amount of the guard reserved for use by the caller's ++ outgoing args. */ ++ if (maybe_ge (final_adjust, guard_size - guard_used_by_caller)) ++ aarch64_allocate_and_probe_stack_space (ip1_rtx, ip0_rtx, ++ final_adjust); ++ else ++ aarch64_sub_sp (ip1_rtx, ip0_rtx, final_adjust, !frame_pointer_needed); ++ ++ /* We must also probe if the final adjustment is larger than the guard ++ that is assumed used by the caller. This may be sub-optimal. */ ++ if (maybe_ge (final_adjust, guard_used_by_caller)) ++ { ++ if (dump_file) ++ fprintf (dump_file, ++ "Stack clash aarch64 large outgoing arg, probing\n"); ++ emit_stack_probe (stack_pointer_rtx); ++ } ++ } ++ else ++ aarch64_sub_sp (ip1_rtx, ip0_rtx, final_adjust, !frame_pointer_needed); + } + + /* Return TRUE if we can use a simple_return insn. +@@ -10476,6 +10681,12 @@ aarch64_override_options_internal (struct gcc_options *opts) + && opts->x_optimize >= aarch64_tune_params.prefetch->default_opt_level) + opts->x_flag_prefetch_loop_arrays = 1; + ++ /* We assume the guard page is 64k. */ ++ maybe_set_param_value (PARAM_STACK_CLASH_PROTECTION_GUARD_SIZE, ++ 16, ++ opts->x_param_values, ++ global_options_set.x_param_values); ++ + aarch64_override_options_after_change_1 (opts); + } + +@@ -17161,6 +17372,28 @@ aarch64_sched_can_speculate_insn (rtx_insn *insn) + } + } + ++/* It has been decided that to allow up to 1kb of outgoing argument ++ space to be allocated w/o probing. If more than 1kb of outgoing ++ argment space is allocated, then it must be probed and the last ++ probe must occur no more than 1kbyte away from the end of the ++ allocated space. ++ ++ This implies that the residual part of an alloca allocation may ++ need probing in cases where the generic code might not otherwise ++ think a probe is needed. ++ ++ This target hook returns TRUE when allocating RESIDUAL bytes of ++ alloca space requires an additional probe, otherwise FALSE is ++ returned. */ ++ ++static bool ++aarch64_stack_clash_protection_final_dynamic_probe (rtx residual) ++{ ++ return (residual == CONST0_RTX (Pmode) ++ || GET_CODE (residual) != CONST_INT ++ || INTVAL (residual) >= 1024); ++} ++ + /* Implement TARGET_COMPUTE_PRESSURE_CLASSES. */ + + static int +@@ -17669,6 +17902,10 @@ aarch64_libgcc_floating_mode_supported_p + #undef TARGET_CONSTANT_ALIGNMENT + #define TARGET_CONSTANT_ALIGNMENT aarch64_constant_alignment + ++#undef TARGET_STACK_CLASH_PROTECTION_FINAL_DYNAMIC_PROBE ++#define TARGET_STACK_CLASH_PROTECTION_FINAL_DYNAMIC_PROBE \ ++ aarch64_stack_clash_protection_final_dynamic_probe ++ + #undef TARGET_COMPUTE_PRESSURE_CLASSES + #define TARGET_COMPUTE_PRESSURE_CLASSES aarch64_compute_pressure_classes + +--- gcc/config/aarch64/aarch64.md ++++ gcc/config/aarch64/aarch64.md +@@ -5812,7 +5812,7 @@ + ) + + (define_insn "probe_stack_range" +- [(set (match_operand:DI 0 "register_operand" "=r") ++ [(set (match_operand:DI 0 "register_operand" "=rk") + (unspec_volatile:DI [(match_operand:DI 1 "register_operand" "0") + (match_operand:DI 2 "register_operand" "r")] + UNSPECV_PROBE_STACK_RANGE))] +--- gcc/testsuite/gcc.target/aarch64/stack-check-12.c ++++ gcc/testsuite/gcc.target/aarch64/stack-check-12.c +@@ -0,0 +1,20 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=12" } */ ++/* { dg-require-effective-target supports_stack_clash_protection } */ ++ ++extern void arf (unsigned long int *, unsigned long int *); ++void ++frob () ++{ ++ unsigned long int num[1000]; ++ unsigned long int den[1000]; ++ arf (den, num); ++} ++ ++/* This verifies that the scheduler did not break the dependencies ++ by adjusting the offsets within the probe and that the scheduler ++ did not reorder around the stack probes. */ ++/* { dg-final { scan-assembler-times "sub\\tsp, sp, #4096\\n\\tstr\\txzr, .sp, 4088." 3 } } */ ++ ++ ++ +--- gcc/testsuite/gcc.target/aarch64/stack-check-13.c ++++ gcc/testsuite/gcc.target/aarch64/stack-check-13.c +@@ -0,0 +1,28 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=12" } */ ++/* { dg-require-effective-target supports_stack_clash_protection } */ ++ ++#define ARG32(X) X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X ++#define ARG192(X) ARG32(X),ARG32(X),ARG32(X),ARG32(X),ARG32(X),ARG32(X) ++void out1(ARG192(__int128)); ++int t1(int); ++ ++int t3(int x) ++{ ++ if (x < 1000) ++ return t1 (x) + 1; ++ ++ out1 (ARG192(1)); ++ return 0; ++} ++ ++ ++ ++/* This test creates a large (> 1k) outgoing argument area that needs ++ to be probed. We don't test the exact size of the space or the ++ exact offset to make the test a little less sensitive to trivial ++ output changes. */ ++/* { dg-final { scan-assembler-times "sub\\tsp, sp, #....\\n\\tstr\\txzr, \\\[sp" 1 } } */ ++ ++ ++ +--- gcc/testsuite/gcc.target/aarch64/stack-check-14.c ++++ gcc/testsuite/gcc.target/aarch64/stack-check-14.c +@@ -0,0 +1,25 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=12" } */ ++/* { dg-require-effective-target supports_stack_clash_protection } */ ++ ++int t1(int); ++ ++int t2(int x) ++{ ++ char *p = __builtin_alloca (4050); ++ x = t1 (x); ++ return p[x]; ++} ++ ++ ++/* This test has a constant sized alloca that is smaller than the ++ probe interval. But it actually requires two probes instead ++ of one because of the optimistic assumptions we made in the ++ aarch64 prologue code WRT probing state. ++ ++ The form can change quite a bit so we just check for two ++ probes without looking at the actual address. */ ++/* { dg-final { scan-assembler-times "str\\txzr," 2 } } */ ++ ++ ++ +--- gcc/testsuite/gcc.target/aarch64/stack-check-15.c ++++ gcc/testsuite/gcc.target/aarch64/stack-check-15.c +@@ -0,0 +1,24 @@ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-guard-size=12" } */ ++/* { dg-require-effective-target supports_stack_clash_protection } */ ++ ++int t1(int); ++ ++int t2(int x) ++{ ++ char *p = __builtin_alloca (x); ++ x = t1 (x); ++ return p[x]; ++} ++ ++ ++/* This test has a variable sized alloca. It requires 3 probes. ++ One in the loop, one for the residual and at the end of the ++ alloca area. ++ ++ The form can change quite a bit so we just check for two ++ probes without looking at the actual address. */ ++/* { dg-final { scan-assembler-times "str\\txzr," 3 } } */ ++ ++ ++ +--- gcc/testsuite/lib/target-supports.exp ++++ gcc/testsuite/lib/target-supports.exp +@@ -9201,14 +9201,9 @@ proc check_effective_target_autoincdec { } { + # + proc check_effective_target_supports_stack_clash_protection { } { + +- # Temporary until the target bits are fully ACK'd. +-# if { [istarget aarch*-*-*] } { +-# return 1 +-# } +- + if { [istarget x86_64-*-*] || [istarget i?86-*-*] + || [istarget powerpc*-*-*] || [istarget rs6000*-*-*] +- || [istarget s390*-*-*] } { ++ || [istarget aarch64*-**] || [istarget s390*-*-*] } { + return 1 + } + return 0 +@@ -9217,9 +9212,9 @@ proc check_effective_target_supports_stack_clash_protection { } { + # Return 1 if the target creates a frame pointer for non-leaf functions + # Note we ignore cases where we apply tail call optimization here. + proc check_effective_target_frame_pointer_for_non_leaf { } { +- if { [istarget aarch*-*-*] } { +- return 1 +- } ++# if { [istarget aarch*-*-*] } { ++# return 1 ++# } + + # Solaris/x86 defaults to -fno-omit-frame-pointer. + if { [istarget i?86-*-solaris*] || [istarget x86_64-*-solaris*] } { diff --git a/SOURCES/gcc8-sparc-config-detection.patch b/SOURCES/gcc8-sparc-config-detection.patch new file mode 100644 index 0000000..bb06b35 --- /dev/null +++ b/SOURCES/gcc8-sparc-config-detection.patch @@ -0,0 +1,40 @@ +--- gcc/config.gcc.jj 2008-04-24 15:42:46.000000000 -0500 ++++ gcc/config.gcc 2008-04-24 15:44:51.000000000 -0500 +@@ -2790,7 +2790,7 @@ sparc-*-rtems*) + tm_file="${tm_file} dbxelf.h elfos.h sparc/sysv4.h sparc/sp-elf.h sparc/rtemself.h rtems.h newlib-stdint.h" + tmake_file="${tmake_file} sparc/t-sparc sparc/t-rtems" + ;; +-sparc-*-linux*) ++sparc-*-linux* | sparcv9-*-linux*) + tm_file="${tm_file} dbxelf.h elfos.h sparc/sysv4.h gnu-user.h linux.h glibc-stdint.h sparc/tso.h" + extra_options="${extra_options} sparc/long-double-switch.opt" + case ${target} in +@@ -2844,7 +2844,7 @@ sparc64-*-rtems*) + extra_options="${extra_options}" + tmake_file="${tmake_file} sparc/t-sparc sparc/t-rtems-64" + ;; +-sparc64-*-linux*) ++sparc64*-*-linux*) + tm_file="sparc/biarch64.h ${tm_file} dbxelf.h elfos.h sparc/sysv4.h gnu-user.h linux.h glibc-stdint.h sparc/default64.h sparc/linux64.h sparc/tso.h" + extra_options="${extra_options} sparc/long-double-switch.opt" + tmake_file="${tmake_file} sparc/t-sparc sparc/t-linux64" +--- libgcc/config.host.jj 2008-04-24 15:46:19.000000000 -0500 ++++ libgcc/config.host 2008-04-24 15:46:49.000000000 -0500 +@@ -1002,7 +1002,7 @@ sparc-*-elf*) + tmake_file="${tmake_file} t-fdpbit t-crtfm" + extra_parts="$extra_parts crti.o crtn.o crtfastmath.o" + ;; +-sparc-*-linux*) # SPARC's running GNU/Linux, libc6 ++sparc-*-linux* | sparcv9-*-linux*) # SPARC's running GNU/Linux, libc6 + tmake_file="${tmake_file} t-crtfm" + if test "${host_address}" = 64; then + tmake_file="$tmake_file sparc/t-linux64" +@@ -1050,7 +1050,7 @@ sparc64-*-freebsd*|ultrasparc-*-freebsd* + tmake_file="$tmake_file t-crtfm" + extra_parts="$extra_parts crtfastmath.o" + ;; +-sparc64-*-linux*) # 64-bit SPARC's running GNU/Linux ++sparc64*-*-linux*) # 64-bit SPARC's running GNU/Linux + extra_parts="$extra_parts crtfastmath.o" + tmake_file="${tmake_file} t-crtfm sparc/t-linux" + if test "${host_address}" = 64; then diff --git a/SPECS/gcc-libraries.spec b/SPECS/gcc-libraries.spec new file mode 100644 index 0000000..950de12 --- /dev/null +++ b/SPECS/gcc-libraries.spec @@ -0,0 +1,978 @@ +%global DATE 20190223 +%global DATE7 20180303 +%global SVNREV 269162 +%global gcc_version 8.3.1 +%global gcc7_version 7.3.1 +%global gcc_major 8 +# Note, gcc_release must be integer, if you want to add suffixes to +# %%{release}, append them after %%{gcc_release} on Release: line. +%global gcc_release 2 +%global mpc_version 0.8.1 +%global _unpackaged_files_terminate_build 0 +%global multilib_64_archs sparc64 ppc64 ppc64p7 s390x x86_64 +%ifarch %{ix86} x86_64 ia64 ppc %{power64} alpha s390x %{arm} aarch64 +%global build_ada 0 +%else +%global build_ada 0 +%endif +%global build_objc 0 +%ifarch %{ix86} x86_64 ppc ppc64 ppc64le ppc64p7 s390 s390x %{arm} aarch64 %{mips} +%global build_go 0 +%else +%global build_go 0 +%endif +%if 0%{?rhel} == 7 +%ifarch %{ix86} x86_64 ia64 ppc ppc64 ppc64le +%global build_libquadmath 1 +%else +%global build_libquadmath 0 +%endif +%endif +%if 0%{?rhel} == 6 +%ifarch %{ix86} x86_64 ia64 ppc64le +%global build_libquadmath 1 +%else +%global build_libquadmath 0 +%endif +%endif +%if 0%{?rhel} == 7 +# libquadmath is present via system gcc on x86_64 and i686. +%ifarch ppc ppc64 ppc64le +%global package_libquadmath 1 +%else +%global package_libquadmath 0 +%endif +%endif +%if 0%{?rhel} == 6 +%ifarch %{ix86} x86_64 ppc64le +%global package_libquadmath 1 +%else +%global package_libquadmath 0 +%endif +%endif +%ifarch %{ix86} x86_64 ppc ppc64 ppc64le ppc64p7 s390 s390x %{arm} aarch64 +%global build_libasan 0 +%else +%global build_libasan 0 +%endif +%ifarch x86_64 ppc64 ppc64le aarch64 +%global build_libtsan 0 +%else +%global build_libtsan 0 +%endif +%ifarch x86_64 ppc64 ppc64le aarch64 +%global build_liblsan 0 +%else +%global build_liblsan 0 +%endif +%ifarch %{ix86} x86_64 ppc ppc64 ppc64le ppc64p7 s390 s390x %{arm} aarch64 +%global build_libubsan 0 +%else +%global build_libubsan 0 +%endif +%ifarch aarch64 +%if 0%{?rhel} >= 7 +%global build_libatomic 1 +%else +%global build_libatomic 0 +%endif +%endif +%ifnarch aarch64 +%if 0%{?rhel} >= 7 +%global build_libatomic 0 +%else +%global build_libatomic 1 +%endif +%endif +%if 0%{?rhel} >= 7 +%global build_libitm 0 +%else +%global build_libitm 1 +%endif +%global build_isl 0 +%global build_libstdcxx_docs 0 +%ifarch %{ix86} x86_64 ppc ppc64 ppc64le ppc64p7 s390 s390x %{arm} aarch64 %{mips} +%global attr_ifunc 1 +%else +%global attr_ifunc 0 +%endif +%ifarch s390x +%global multilib_32_arch s390 +%endif +%ifarch sparc64 +%global multilib_32_arch sparcv9 +%endif +%ifarch ppc64 ppc64p7 +%global multilib_32_arch ppc +%endif +%ifarch x86_64 +%global multilib_32_arch i686 +%endif +Summary: GCC runtime libraries +Name: gcc-libraries +Provides: libatomic libitm libgfortran4 libgfortran5 +%if %{package_libquadmath} +Provides: libquadmath +%endif +Obsoletes: libitm +Version: %{gcc_version} +Release: %{gcc_release}.1.1%{?dist} +# libgcc, libgfortran, libgomp, libstdc++ and crtstuff have +# GCC Runtime Exception. +License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and LGPLv2+ and BSD +Group: System Environment/Libraries +# The source for this package was pulled from upstream's vcs. Use the +# following commands to generate the tarball: +# svn export svn://gcc.gnu.org/svn/gcc/branches/redhat/gcc-8-branch@%%{SVNREV} gcc-%%{version}-%%{DATE} +# tar cf - gcc-%%{version}-%%{DATE} | xz -9e > gcc-%%{version}-%%{DATE}.tar.xz +Source0: gcc-%{version}-%{DATE}.tar.xz +Source1: http://www.multiprecision.org/mpc/download/mpc-%{mpc_version}.tar.gz +Source2: gcc-%{gcc7_version}-%{DATE7}.tar.bz2 +URL: http://gcc.gnu.org +# Need binutils with -pie support >= 2.14.90.0.4-4 +# Need binutils which can omit dot symbols and overlap .opd on ppc64 >= 2.15.91.0.2-4 +# Need binutils which handle -msecure-plt on ppc >= 2.16.91.0.2-2 +# Need binutils which support .weakref >= 2.16.91.0.3-1 +# Need binutils which support --hash-style=gnu >= 2.17.50.0.2-7 +# Need binutils which support mffgpr and mftgpr >= 2.17.50.0.2-8 +# Need binutils which support --build-id >= 2.17.50.0.17-3 +# Need binutils which support %%gnu_unique_object >= 2.19.51.0.14 +# Need binutils which support .cfi_sections >= 2.19.51.0.14-33 +BuildRequires: binutils >= 2.19.51.0.14-33 +# While gcc doesn't include statically linked binaries, during testing +# -static is used several times. +BuildRequires: glibc-static +BuildRequires: zlib-devel, gettext, dejagnu, bison, flex, sharutils +BuildRequires: texinfo, /usr/bin/pod2man +BuildRequires: gcc, gcc-c++, gcc-gfortran +%if 0%{?rhel} >= 7 +BuildRequires: texinfo-tex +%endif +# For VTA guality testing +BuildRequires: gdb +# Make sure pthread.h doesn't contain __thread tokens +# Make sure glibc supports stack protector +# Make sure glibc supports DT_GNU_HASH +BuildRequires: glibc-devel >= 2.4.90-13 +BuildRequires: elfutils-devel >= 0.147 +BuildRequires: elfutils-libelf-devel >= 0.147 +%ifarch ppc ppc64 ppc64le ppc64p7 s390 s390x sparc sparcv9 alpha +# Make sure glibc supports TFmode long double +BuildRequires: glibc >= 2.3.90-35 +%endif +%ifarch %{multilib_64_archs} sparcv9 ppc +# Ensure glibc{,-devel} is installed for both multilib arches +BuildRequires: /lib/libc.so.6 /usr/lib/libc.so /lib64/libc.so.6 /usr/lib64/libc.so +%endif +%ifarch ia64 +BuildRequires: libunwind >= 0.98 +%endif +# Need .eh_frame ld optimizations +# Need proper visibility support +# Need -pie support +# Need --as-needed/--no-as-needed support +# On ppc64, need omit dot symbols support and --non-overlapping-opd +# Need binutils that owns /usr/bin/c++filt +# Need binutils that support .weakref +# Need binutils that supports --hash-style=gnu +# Need binutils that support mffgpr/mftgpr +# Need binutils that support --build-id +# Need binutils that support %%gnu_unique_object +# Need binutils that support .cfi_sections +Requires: binutils >= 2.19.51.0.14-33 +# Make sure gdb will understand DW_FORM_strp +Conflicts: gdb < 5.1-2 +Requires: glibc-devel >= 2.2.90-12 +%ifarch ppc ppc64 ppc64le ppc64p7 s390 s390x sparc sparcv9 alpha +# Make sure glibc supports TFmode long double +Requires: glibc >= 2.3.90-35 +%endif +Requires: libgcc >= 4.1.2-43 +Requires: libgomp >= 4.4.4-13 +BuildRequires: gmp-devel >= 4.1.2-8 +BuildRequires: mpfr-devel >= 2.2.1 +%if 0%{?rhel} >= 7 +BuildRequires: libmpc-devel >= 0.8.1 +%endif +Requires(post): /sbin/install-info +Requires(preun): /sbin/install-info +ExclusiveArch: %{ix86} x86_64 ppc ppc64 ppc64le s390 s390x aarch64 + +%global oformat %{nil} +%global oformat2 %{nil} +%ifarch %{ix86} +%global oformat OUTPUT_FORMAT(elf32-i386) +%endif +%ifarch x86_64 +%global oformat OUTPUT_FORMAT(elf64-x86-64) +%global oformat2 OUTPUT_FORMAT(elf32-i386) +%endif +%ifarch ppc +%global oformat OUTPUT_FORMAT(elf32-powerpc) +%global oformat2 OUTPUT_FORMAT(elf64-powerpc) +%endif +%ifarch ppc64 +%global oformat OUTPUT_FORMAT(elf64-powerpc) +%global oformat2 OUTPUT_FORMAT(elf32-powerpc) +%endif +%ifarch s390 +%global oformat OUTPUT_FORMAT(elf32-s390) +%endif +%ifarch s390x +%global oformat OUTPUT_FORMAT(elf64-s390) +%global oformat2 OUTPUT_FORMAT(elf32-s390) +%endif +%ifarch ia64 +%global oformat OUTPUT_FORMAT(elf64-ia64-little) +%endif +%ifarch ppc64le +%global oformat OUTPUT_FORMAT(elf64-powerpcle) +%endif +%ifarch aarch64 +%global oformat OUTPUT_FORMAT(elf64-littleaarch64) +%endif + +Patch0: gcc8-hack.patch +Patch2: gcc8-i386-libgomp.patch +Patch3: gcc8-sparc-config-detection.patch +Patch4: gcc8-libgomp-omp_h-multilib.patch +Patch5: gcc8-libtool-no-rpath.patch +Patch8: gcc8-no-add-needed.patch +Patch9: gcc8-foffload-default.patch +Patch10: gcc8-Wno-format-security.patch +Patch11: gcc8-rh1512529-aarch64.patch +Patch12: gcc8-mcet.patch + +Patch1001: gcc8-alt-compat-test.patch +Patch1003: gcc8-rh1118870.patch +Patch1100: gcc8-htm-in-asm.patch + +# Support for more DEC extensions in libgfortran runtime +# BZ1554429 +Patch2001: 0022-Default-values-for-certain-field-descriptors-in-form.patch + +# We'll be building GCC 7 in order to ship libgfortran4. +Patch7000: gcc7-hack.patch +Patch7002: gcc7-i386-libgomp.patch +Patch7003: gcc7-sparc-config-detection.patch +Patch7004: gcc7-libgomp-omp_h-multilib.patch +Patch7005: gcc7-libtool-no-rpath.patch +Patch7006: gcc7-isl-dl.patch +Patch7008: gcc7-no-add-needed.patch +Patch7009: gcc7-aarch64-async-unw-tables.patch +Patch7010: gcc7-foffload-default.patch +Patch7011: gcc7-Wno-format-security.patch +Patch7013: gcc7-rh1512529-aarch64.patch +Patch7014: gcc7-pr84524.patch +Patch7015: gcc7-pr84128.patch +Patch7016: gcc7-rh1570967.patch +Patch7102: gcc7-alt-compat-test.patch +Patch7105: gcc7-rh1118870.patch +Patch7100: gcc7-htm-in-asm.patch + +# Support for more DEC extensions in libgfortran runtime +# BZ1554429 +Patch7200: gcc7-0000-infrastructure.patch +Patch7201: gcc7-0022-Default-values-for-certain-field-descriptors-in-form.patch + +%global _gnu %{nil} +%ifarch sparcv9 +%global gcc_target_platform sparc64-%{_vendor}-%{_target_os}%{?_gnu} +%endif +%ifarch ppc ppc64p7 +%global gcc_target_platform ppc64-%{_vendor}-%{_target_os}%{?_gnu} +%endif +%ifnarch sparcv9 ppc ppc64p7 +%global gcc_target_platform %{_target_platform} +%endif + +%description +This package contains various GCC runtime libraries, such as libatomic, +or libitm. + +%package -n libitm +Summary: The GNU Transactional Memory library +Group: System Environment/Libraries +Requires(post): /sbin/install-info +Requires(preun): /sbin/install-info + +%description -n libitm +This package contains the GNU Transactional Memory library +which is a GCC transactional memory support runtime library. + +%package -n libatomic +Summary: The GNU Atomic library +Group: System Environment/Libraries +Requires(post): /sbin/install-info +Requires(preun): /sbin/install-info + +%description -n libatomic +This package contains the GNU Atomic library +which is a GCC support runtime library for atomic operations not supported +by hardware. + +%package -n libgfortran4 +Summary: Fortran runtime v4 +Group: System Environment/Libraries +Autoreq: true +%if %{build_libquadmath} +Requires: libquadmath +%endif + +%description -n libgfortran4 +This package contains Fortran shared library v4 which is needed to run +Fortran dynamically linked programs. + +%package -n libgfortran5 +Summary: Fortran runtime v5 +Group: System Environment/Libraries +Autoreq: true +%if %{build_libquadmath} +Requires: libquadmath +%endif + +%description -n libgfortran5 +This package contains Fortran shared library v5 which is needed to run +Fortran dynamically linked programs. + +%package -n libquadmath +Summary: GCC __float128 shared support library +Group: System Environment/Libraries +Requires(post): /sbin/install-info +Requires(preun): /sbin/install-info + +%description -n libquadmath +This package contains GCC shared support library which is needed +for __float128 math support and for Fortran REAL*16 support. + +%prep +# Also unpack GCC 7 sources. +%if 0%{?rhel} >= 7 +%setup -q -n gcc-%{version}-%{DATE} -a 2 +%else +%setup -q -n gcc-%{version}-%{DATE} -a 1 -a 2 +%endif +%patch0 -p0 -b .hack~ +%patch2 -p0 -b .i386-libgomp~ +%patch3 -p0 -b .sparc-config-detection~ +%patch4 -p0 -b .libgomp-omp_h-multilib~ +%patch5 -p0 -b .libtool-no-rpath~ +%patch8 -p0 -b .no-add-needed~ +%patch9 -p0 -b .foffload-default~ +%patch10 -p0 -b .Wno-format-security~ +%patch11 -p0 -b .rh1512529-aarch64~ + +%ifarch %{ix86} x86_64 +%if 0%{?rhel} < 7 +# On i?86/x86_64 there are some incompatibilities in _Decimal* as well as +# aggregates containing larger vector passing. +%patch1001 -p0 -b .alt-compat-test~ +%endif +%endif + +%patch1003 -p0 -b .rh1118870~ +%patch1100 -p0 -b .gcc8-htm-in-asm~ + +%patch2001 -p1 -b .dec-extensions-2~ + +%if 0%{?rhel} == 6 +# Default to -gdwarf-3 rather than -gdwarf-4 +sed -i '/UInteger Var(dwarf_version)/s/Init(4)/Init(3)/' gcc/common.opt +sed -i 's/\(may be either 2, 3 or 4; the default version is \)4\./\13./' gcc/doc/invoke.texi +%endif + +cp -a libstdc++-v3/config/cpu/i{4,3}86/atomicity.h +cp -a libstdc++-v3/config/cpu/i{4,3}86/opt +echo 'TM_H += $(srcdir)/config/rs6000/rs6000-modes.h' >> gcc/config/rs6000/t-rs6000 + +./contrib/gcc_update --touch + +LC_ALL=C sed -i -e 's/\xa0/ /' gcc/doc/options.texi + +sed -i -e 's/Common Driver Var(flag_report_bug)/& Init(1)/' gcc/common.opt + +%ifarch ppc +if [ -d libstdc++-v3/config/abi/post/powerpc64-linux-gnu ]; then + mkdir -p libstdc++-v3/config/abi/post/powerpc64-linux-gnu/64 + mv libstdc++-v3/config/abi/post/powerpc64-linux-gnu/{,64/}baseline_symbols.txt + mv libstdc++-v3/config/abi/post/powerpc64-linux-gnu/{32/,}baseline_symbols.txt + rm -rf libstdc++-v3/config/abi/post/powerpc64-linux-gnu/32 +fi +%endif +%ifarch sparc +if [ -d libstdc++-v3/config/abi/post/sparc64-linux-gnu ]; then + mkdir -p libstdc++-v3/config/abi/post/sparc64-linux-gnu/64 + mv libstdc++-v3/config/abi/post/sparc64-linux-gnu/{,64/}baseline_symbols.txt + mv libstdc++-v3/config/abi/post/sparc64-linux-gnu/{32/,}baseline_symbols.txt + rm -rf libstdc++-v3/config/abi/post/sparc64-linux-gnu/32 +fi +%endif + +# This test causes fork failures, because it spawns way too many threads +rm -f gcc/testsuite/go.test/test/chan/goroutines.go + +# Apply GCC 7 patches. +pushd gcc-%{gcc7_version}-%{DATE7} +%patch7000 -p0 -b .hack~ +%patch7002 -p0 -b .i386-libgomp~ +%patch7003 -p0 -b .sparc-config-detection~ +%patch7004 -p0 -b .libgomp-omp_h-multilib~ +%patch7005 -p0 -b .libtool-no-rpath~ +%patch7008 -p0 -b .no-add-needed~ +%patch7009 -p0 -b .aarch64-async-unw-tables~ +%patch7010 -p0 -b .foffload-default~ +%patch7011 -p0 -b .Wno-format-security~ +%patch7013 -p0 -b .rh1512529-aarch64~ +%patch7014 -p0 -b .pr84524~ +%patch7015 -p0 -b .pr84128~ +%patch7016 -p0 -b .rh1570967~ + +sed -i -e 's/ -Wl,-z,nodlopen//g' gcc/ada/gcc-interface/Makefile.in + +%ifarch %{ix86} x86_64 +%if 0%{?rhel} < 7 +# On i?86/x86_64 there are some incompatibilities in _Decimal* as well as +# aggregates containing larger vector passing. +%patch7102 -p0 -b .alt-compat-test~ +%endif +%endif + +%patch7105 -p0 -b .rh1118870~ +%patch7100 -p0 -b .gcc7-htm-in-asm~ + +%patch7200 -p1 -b .dec-extensions~ +%patch7201 -p1 -b .dec-extensions-2~ +popd + +%build + +# Undo the broken autoconf change in recent Fedora versions +export CONFIG_SITE=NONE + +rm -fr obj-%{gcc_target_platform} +mkdir obj-%{gcc_target_platform} +cd obj-%{gcc_target_platform} + + +%if 0%{?rhel} < 7 +mkdir mpc mpc-install +cd mpc +../../mpc-%{mpc_version}/configure --disable-shared \ + CFLAGS="${CFLAGS:-%optflags} -fPIC" CXXFLAGS="${CXXFLAGS:-%optflags} -fPIC" \ + --prefix=`cd ..; pwd`/mpc-install +make %{?_smp_mflags} +make install +cd .. +%endif + +CC=gcc +CXX=g++ +OPT_FLAGS=`echo %{optflags}|sed -e 's/\(-Wp,\)\?-D_FORTIFY_SOURCE=[12]//g'` +OPT_FLAGS=`echo $OPT_FLAGS|sed -e 's/-m64//g;s/-m32//g;s/-m31//g'` +OPT_FLAGS=`echo $OPT_FLAGS|sed -e 's/-mfpmath=sse/-mfpmath=sse -msse2/g'` +OPT_FLAGS=`echo $OPT_FLAGS|sed -e 's/ -pipe / /g'` +OPT_FLAGS=`echo $OPT_FLAGS|sed -e 's/-Werror=format-security/-Wformat-security/g'` +%ifarch sparc +OPT_FLAGS=`echo $OPT_FLAGS|sed -e 's/-mcpu=ultrasparc/-mtune=ultrasparc/g;s/-mcpu=v[78]//g'` +%endif +%ifarch %{ix86} +OPT_FLAGS=`echo $OPT_FLAGS|sed -e 's/-march=i.86//g'` +%endif +OPT_FLAGS=`echo "$OPT_FLAGS" | sed -e 's/[[:blank:]]\+/ /g'` +CONFIGURE_OPTS="\ + --prefix=%{_prefix} --mandir=%{_mandir} --infodir=%{_infodir} \ + --with-bugurl=http://bugzilla.redhat.com/bugzilla \ + --enable-shared --enable-threads=posix --enable-checking=release \ +%ifarch ppc64le + --enable-targets=powerpcle-linux \ +%endif +%ifarch ppc64le %{mips} riscv64 + --disable-multilib \ +%else + --enable-multilib \ +%endif + --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions \ + --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only \ +%ifnarch %{mips} + --with-linker-hash-style=gnu \ +%endif + --enable-plugin --enable-initfini-array \ + --without-isl \ + --disable-libmpx \ + --disable-libsanitizer \ +%if 0%{?rhel} < 7 + --with-mpc=%{buildroot}/obj-%{gcc_target_platform}/mpc-install \ +%endif +%if 0%{?fedora} >= 21 || 0%{?rhel} >= 7 +%if %{attr_ifunc} + --enable-gnu-indirect-function \ +%endif +%endif +%ifarch %{arm} + --disable-sjlj-exceptions \ +%endif +%ifarch ppc ppc64 ppc64le ppc64p7 + --enable-secureplt \ +%endif +%ifarch sparc sparcv9 sparc64 ppc ppc64 ppc64le ppc64p7 s390 s390x alpha + --with-long-double-128 \ +%endif +%ifarch sparc + --disable-linux-futex \ +%endif +%ifarch sparc64 + --with-cpu=ultrasparc \ +%endif +%ifarch sparc sparcv9 + --host=%{gcc_target_platform} --build=%{gcc_target_platform} --target=%{gcc_target_platform} --with-cpu=v7 +%endif +%ifarch ppc ppc64 ppc64p7 +%if 0%{?rhel} >= 7 + --with-cpu-32=power7 --with-tune-32=power7 --with-cpu-64=power7 --with-tune-64=power7 \ +%endif +%if 0%{?rhel} == 6 + --with-cpu-32=power4 --with-tune-32=power6 --with-cpu-64=power4 --with-tune-64=power6 \ +%endif +%endif +%ifarch ppc64le + --with-cpu-32=power8 --with-tune-32=power8 --with-cpu-64=power8 --with-tune-64=power8 \ +%endif +%ifarch ppc + --build=%{gcc_target_platform} --target=%{gcc_target_platform} --with-cpu=default32 +%endif +%ifarch %{ix86} x86_64 + --with-tune=generic \ +%endif +%if 0%{?rhel} >= 7 +%ifarch %{ix86} + --with-arch=x86-64 \ +%endif +%ifarch x86_64 + --with-arch_32=x86-64 \ +%endif +%else +%ifarch %{ix86} + --with-arch=i686 \ +%endif +%ifarch x86_64 + --with-arch_32=i686 \ +%endif +%endif +%ifarch s390 s390x +%if 0%{?rhel} >= 7 +%if 0%{?rhel} >= 8 + --with-arch=zEC12 --with-tune=z13 \ +%else + --with-arch=z196 --with-tune=zEC12 \ +%endif +%else +%if 0%{?fedora} >= 26 + --with-arch=zEC12 --with-tune=z13 \ +%else + --with-arch=z9-109 --with-tune=z10 \ +%endif +%endif + --enable-decimal-float \ +%endif +%ifarch armv7hl + --with-tune=generic-armv7-a --with-arch=armv7-a \ + --with-float=hard --with-fpu=vfpv3-d16 --with-abi=aapcs-linux \ +%endif +%ifarch mips mipsel + --with-arch=mips32r2 --with-fp-32=xx \ +%endif +%ifarch mips64 mips64el + --with-arch=mips64r2 --with-abi=64 \ +%endif +%ifnarch sparc sparcv9 ppc + --build=%{gcc_target_platform} \ +%endif + " + +CC="$CC" CXX="$CXX" CFLAGS="$OPT_FLAGS" \ + CXXFLAGS="`echo " $OPT_FLAGS " | sed 's/ -Wall / /g;s/ -fexceptions / /g' \ + | sed 's/ -Wformat-security / -Wformat -Wformat-security /'`" \ + XCFLAGS="$OPT_FLAGS" TCFLAGS="$OPT_FLAGS" \ + ../configure --disable-bootstrap \ + --enable-languages=c,c++,fortran,lto \ + $CONFIGURE_OPTS + +%ifarch sparc sparcv9 sparc64 +make %{?_smp_mflags} BOOT_CFLAGS="$OPT_FLAGS" +%else +make %{?_smp_mflags} BOOT_CFLAGS="$OPT_FLAGS" +%endif + + +# Copy various doc files here and there +cd .. +mkdir -p rpm.doc/libquadmath rpm.doc/gfortran rpm.doc/libatomic rpm.doc/libitm + +(cd libgfortran; for i in ChangeLog*; do + cp -p $i ../rpm.doc/gfortran/$i.libgfortran +done) +%if %{build_libquadmath} +(cd libquadmath; for i in ChangeLog*; do + cp -p $i ../rpm.doc/libquadmath/$i.libquadmath +done) +%endif +%if %{build_libitm} +(cd libitm; for i in ChangeLog*; do + cp -p $i ../rpm.doc/libitm/$i.libitm +done) +%endif +%if %{build_libatomic} +(cd libatomic; for i in ChangeLog*; do + cp -p $i ../rpm.doc/libatomic/$i.libatomic +done) +%endif + +rm -f rpm.doc/changelogs/gcc/ChangeLog.[1-9] +find rpm.doc -name \*ChangeLog\* | xargs bzip2 -9 + +# Handle GCC 7. We'll not bootstrap as we're only interested in +# libgfortran.so.4. +cd gcc-%{gcc7_version}-%{DATE7} +mkdir obj-%{gcc_target_platform} +cd obj-%{gcc_target_platform} + +CC="$CC" CXX="$CXX" CFLAGS="$OPT_FLAGS" \ + CXXFLAGS="`echo " $OPT_FLAGS " | sed 's/ -Wall / /g;s/ -fexceptions / /g' \ + | sed 's/ -Wformat-security / -Wformat -Wformat-security /'`" \ + XCFLAGS="$OPT_FLAGS" TCFLAGS="$OPT_FLAGS" \ + ../configure --disable-bootstrap \ + --enable-languages=c,c++,fortran,lto \ + $CONFIGURE_OPTS +make %{?_smp_mflags} BOOT_CFLAGS="$OPT_FLAGS" + +%install +rm -rf %{buildroot} + +cd obj-%{gcc_target_platform} + +# Make sure libcilkrts can use system libgcc_s.so.1. +rm -f gcc/libgcc_s.so +echo '/* GNU ld script + Use the shared library, but some functions are only in + the static library, so try that secondarily. */ +%{oformat} +GROUP ( /%{_lib}/libgcc_s.so.1 libgcc.a )' > gcc/libgcc_s.so + +mkdir -p %{buildroot}%{_prefix}/%{_lib} +mkdir -p %{buildroot}%{_infodir} + +# Use make install DESTDIR trick to avoid bogus RPATHs. +%if %{build_libitm} +cd %{gcc_target_platform}/libitm/ +mkdir temp +make install DESTDIR=`pwd`/temp +cp -a temp/usr/%{_lib}/libitm.so.1* %{buildroot}%{_prefix}/%{_lib}/ +cp -a libitm.info %{buildroot}%{_infodir}/ +cd ../.. +%endif + +%if %{build_libatomic} +cd %{gcc_target_platform}/libatomic/ +mkdir temp +make install DESTDIR=`pwd`/temp +cp -a temp/usr/%{_lib}/libatomic.so.1* %{buildroot}%{_prefix}/%{_lib}/ +cd ../.. +%endif + +%if %{build_libquadmath} +cd %{gcc_target_platform}/libquadmath/ +mkdir temp +make install DESTDIR=`pwd`/temp +%if %{package_libquadmath} +cp -a temp/usr/%{_lib}/libquadmath.so.0* %{buildroot}%{_prefix}/%{_lib}/ +%endif +cd ../.. +%endif + +cd %{gcc_target_platform}/libgfortran/ +mkdir temp +%if %{build_libquadmath} +# It needs to find libquadmath.so. +export LIBRARY_PATH=`pwd`/../../%{gcc_target_platform}/libquadmath/temp/usr/%{_lib} +%endif +make install DESTDIR=`pwd`/temp +cp -a temp/usr/%{_lib}/libgfortran.so.5* %{buildroot}%{_prefix}/%{_lib}/ +cd ../.. + + +# Remove binaries we will not be including, so that they don't end up in +# gcc-libraries-debuginfo. +%if 0%{?rhel} >= 7 +# None. +%endif + +rm -f gcc/libgcc_s.so +ln -sf libgcc_s.so.1 gcc/libgcc_s.so + + +# GCC 7. Up to my old tricks again. +cd ../gcc-%{gcc7_version}-%{DATE7}/obj-%{gcc_target_platform} + +%if %{build_libquadmath} +cd %{gcc_target_platform}/libquadmath/ +mkdir temp +make install DESTDIR=`pwd`/temp +cd ../.. +%endif + +cd %{gcc_target_platform}/libgfortran/ +mkdir temp +%if %{build_libquadmath} +# It needs to find libquadmath.so. +export LIBRARY_PATH=`pwd`/../../%{gcc_target_platform}/libquadmath/temp/usr/%{_lib} +%endif +make install DESTDIR=`pwd`/temp +cp -a temp/usr/%{_lib}/libgfortran.so.4* %{buildroot}%{_prefix}/%{_lib}/ +cd ../.. + +%check +cd obj-%{gcc_target_platform} + +# run the tests. +make %{?_smp_mflags} -k check RUNTESTFLAGS="--target_board=unix/'{,-fstack-protector}'" || : +( LC_ALL=C ../contrib/test_summary -t || : ) 2>&1 | sed -n '/^cat.*EOF/,/^EOF/{/^cat.*EOF/d;/^EOF/d;/^LAST_UPDATED:/d;p;}' > testresults +echo ====================TESTING========================= +cat testresults +echo ====================TESTING END===================== +mkdir testlogs-%{_target_platform}-%{version}-%{release} +for i in `find . -name \*.log | grep -F testsuite/ | grep -v 'config.log\|acats.*/tests/'`; do + ln $i testlogs-%{_target_platform}-%{version}-%{release}/ || : +done +tar cf - testlogs-%{_target_platform}-%{version}-%{release} | bzip2 -9c \ + | uuencode testlogs-%{_target_platform}.tar.bz2 || : +rm -rf testlogs-%{_target_platform}-%{version}-%{release} + +# GCC 7. Only test Fortran. +cd ../gcc-%{gcc7_version}-%{DATE7}/obj-%{gcc_target_platform} +make %{?_smp_mflags} -C gcc check-gfortran || : +( LC_ALL=C ../contrib/test_summary -t || : ) 2>&1 | sed -n '/^cat.*EOF/,/^EOF/{/^cat.*EOF/d;/^EOF/d;/^LAST_UPDATED:/d;p;}' > testresults +echo ====================TESTING 7======================== +cat testresults +echo ====================TESTING 7 END==================== +mkdir testlogs-%{_target_platform}-%{version}-%{release} +for i in `find . -name \*.log | grep -F testsuite/ | grep -v 'config.log\|acats.*/tests/'`; do + ln $i testlogs-%{_target_platform}-%{version}-%{release}/ || : +done +tar cf - testlogs-%{_target_platform}-%{version}-%{release} | bzip2 -9c \ + | uuencode testlogs-%{_target_platform}.tar.bz2 || : +rm -rf testlogs-%{_target_platform}-%{version}-%{release} + +%post -n libitm +/sbin/ldconfig +if [ -f %{_infodir}/libitm.info.gz ]; then + /sbin/install-info \ + --info-dir=%{_infodir} %{_infodir}/libitm.info.gz || : +fi + +%post -n libatomic +/sbin/ldconfig +if [ -f %{_infodir}/libatomic.info.gz ]; then + /sbin/install-info \ + --info-dir=%{_infodir} %{_infodir}/libatomic.info.gz || : +fi + +%post -n libgfortran4 +/sbin/ldconfig +if [ -f %{_infodir}/libgfortran.info.gz ]; then + /sbin/install-info \ + --info-dir=%{_infodir} %{_infodir}/libgfortran.info.gz || : +fi +%post -n libgfortran5 +/sbin/ldconfig +if [ -f %{_infodir}/libgfortran.info.gz ]; then + /sbin/install-info \ + --info-dir=%{_infodir} %{_infodir}/libgfortran.info.gz || : +fi + +%post -n libquadmath +/sbin/ldconfig +if [ -f %{_infodir}/libquadmath.info.gz ]; then + /sbin/install-info \ + --info-dir=%{_infodir} %{_infodir}/libquadmath.info.gz || : +fi + +%preun -n libitm +if [ $1 = 0 -a -f %{_infodir}/libitm.info.gz ]; then + /sbin/install-info --delete \ + --info-dir=%{_infodir} %{_infodir}/libitm.info.gz || : +fi + +%preun -n libatomic +if [ $1 = 0 -a -f %{_infodir}/libatomic.info.gz ]; then + /sbin/install-info --delete \ + --info-dir=%{_infodir} %{_infodir}/libatomic.info.gz || : +fi + +%preun -n libgfortran4 +if [ $1 = 0 -a -f %{_infodir}/libgfortran.info.gz ]; then + /sbin/install-info --delete \ + --info-dir=%{_infodir} %{_infodir}/libgfortran.info.gz || : +fi + +%preun -n libgfortran5 +if [ $1 = 0 -a -f %{_infodir}/libgfortran.info.gz ]; then + /sbin/install-info --delete \ + --info-dir=%{_infodir} %{_infodir}/libgfortran.info.gz || : +fi + +%preun -n libquadmath +if [ $1 = 0 -a -f %{_infodir}/libquadmath.info.gz ]; then + /sbin/install-info --delete \ + --info-dir=%{_infodir} %{_infodir}/libquadmath.info.gz || : +fi + +%postun -n libitm -p /sbin/ldconfig + +%postun -n libatomic -p /sbin/ldconfig + +%postun -n libgfortran4 -p /sbin/ldconfig + +%postun -n libgfortran5 -p /sbin/ldconfig + +%postun -n libquadmath -p /sbin/ldconfig + +%if %{build_libitm} +%files -n libitm +%defattr(-,root,root,-) +%{_prefix}/%{_lib}/libitm.so.1* +%{_infodir}/libitm.info* + +%doc gcc/COPYING3 COPYING.RUNTIME rpm.doc/libitm/* +%endif + +%if %{build_libatomic} +%files -n libatomic +%defattr(-,root,root,-) +%{_prefix}/%{_lib}/libatomic.so.1* + +%doc gcc/COPYING3 COPYING.RUNTIME rpm.doc/libatomic/* +%endif + +%files -n libgfortran4 +%defattr(-,root,root,-) +%{_prefix}/%{_lib}/libgfortran.so.4* + +%doc gcc/COPYING3 COPYING.RUNTIME rpm.doc/gfortran/* + +%files -n libgfortran5 +%defattr(-,root,root,-) +%{_prefix}/%{_lib}/libgfortran.so.5* + +%doc gcc/COPYING3 COPYING.RUNTIME rpm.doc/gfortran/* + +%if %{package_libquadmath} +%files -n libquadmath +%defattr(-,root,root,-) +%{_prefix}/%{_lib}/libquadmath.so.0* + +%doc gcc/COPYING3 COPYING.RUNTIME rpm.doc/libquadmath/* +%endif + +%changelog +* Mon Feb 25 2019 Marek Polacek 8.3.1-2.1.1 +- update from Fedora 8.3.1-2 gcc (#1551629) + +* Mon Aug 27 2018 Marek Polacek 8.2.1-1.3.1 +- update 0022-Default-values-for-certain-field-descriptors-in-form.patch + +* Fri Jul 27 2018 Marek Polacek 8.2.1-1.2.1 +- add %preun for libgfortran4 + +* Fri Jul 27 2018 Marek Polacek 8.2.1-1.1.1 +- update from gcc-8.2.1-1 + +* Wed Jul 25 2018 Marek Polacek 8.1.1-5.2.1 +- also package libgfortran4 (#1600265) + +* Tue Jul 10 2018 Marek Polacek 8.1.1-5.1.1 +- update from gcc-8.1.1-5 + +* Tue Jul 10 2018 Marek Polacek 8.1.1-4.1.1 +- update from gcc-8.1.1-4 + +* Wed Jun 13 2018 Marek Polacek 7.3.1-5.1.1 +- update from devtoolset-7-gcc-7.3.1-5.10 + +* Tue Apr 3 2018 Marek Polacek 7.2.1-1.2.1 +- Add support for DEC formatting extensions (#1554430) + +* Thu Oct 19 2017 Marek Polacek 7.2.1-1.1.1 +- update from gcc-7.2.1-1 (#1477224) + +* Tue Jun 20 2017 Marek Polacek 7.1.1-2.2.1 +- don't run make check with -fstack-protector on ppc64le + +* Thu Jun 15 2017 Marek Polacek 7.1.1-2.1.1 +- bump gcc_release (DTS7 gcc-gfortran requires libgfortran4 >= 7.1.1-2) + +* Mon Jun 12 2017 Marek Polacek 7.1.1-1.2.1 +- remove libquadmath.so.* so that it doesn't end up in debuginfo + +* Mon Jun 5 2017 Marek Polacek 7.1.1-1.1.1 +- rename libgfortran2 to libgfortran4 +- update from Fedora gcc-7.1.1-2.fc27 + +* Wed May 24 2017 Marek Polacek 7.0.1-4.2.1 +- also build on ppc64le + +* Mon Mar 20 2017 Marek Polacek 7.0.1-4.1.1 +- also build on aarch64 +- drop libitm +- only enable libatomic for aarch64 + +* Fri Mar 17 2017 Marek Polacek 7.0.1-3.1.1 +- drop libquadmath and rename libgfortran to libgfortran2 + +* Wed Mar 15 2017 Marek Polacek 7.0.1-2.1.1 +- also include the libquadmath subpackage + +* Tue Mar 14 2017 Marek Polacek 7.0.1-1.1.1 +- update from Fedora 7.0.1-0.12.fc26 (#1412815) +- add the libgfortran subpackage + +* Wed Oct 19 2016 Marek Polacek 6.2.1-1.1.1 +- update from DTS 6.2.1 (#1265255) + +* Tue Oct 18 2016 Marek Polacek 5.3.1-1.1.1 +- update from DTS 5.3.1 (#1265255) +- run the whole testsuite (because of Cilk+) + +* Tue Dec 15 2015 Marek Polacek 5.2.1-2.1.1 +- update from DTS 5.2.1-2 (#1265253) +- drop libmpx (#1275357) + +* Fri Apr 10 2015 Marek Polacek 5.0.0-1.1.1 +- update from Fedora gcc-5.0.0-0.21.fc22 +- add libmpx subpackage on x86 + +* Mon Jun 02 2014 Marek Polacek 4.9.0-6.1.1 +- make sure libcilkrts can use system libgcc_s.so.1 (#1101277) +- update from DTS gcc-4.9.0-6 + +* Fri May 23 2014 Marek Polacek 4.9.0-5.2.1 +- prevent bogus RPATHs + +* Wed May 14 2014 Marek Polacek 4.9.0-5.1.1 +- update from DTS gcc-4.9.0-5 +- add libcilkrts + +* Mon Apr 28 2014 Marek Polacek 4.8.2-12.1.1 +- update from DTS gcc-4.8.2-12 + +* Wed Aug 14 2013 Marek Polacek 4.8.1-4.2.1 +- always build HTM bits in libitm (#996683, #996682) + +* Fri Jul 19 2013 Marek Polacek 4.8.1-4.1.1 +- update from DTS gcc-4.8.1-4 + +* Wed May 29 2013 Marek Polacek 4.8.0-5.1.1 +- update from DTS gcc-4.8.0-5 +- build libitm even for s390{,x} + +* Thu May 02 2013 Marek Polacek 4.8.0-3.1.1 +- new package