#include <metal_stdlib>

using namespace metal;
struct tint_padded_array_element {
  /* 0x0000 */ int el;
  /* 0x0004 */ int8_t tint_pad[12];
};
struct tint_array_wrapper {
  /* 0x0000 */ tint_padded_array_element arr[7];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
};
struct tint_padded_array_element_1 {
  /* 0x0000 */ float el;
  /* 0x0004 */ int8_t tint_pad_1[12];
};
struct tint_array_wrapper_1 {
  /* 0x0000 */ tint_padded_array_element_1 arr[3];
};
struct buf1 {
  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
};
struct tint_array_wrapper_2 {
  float arr[2];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf0& x_6, constant buf1& x_8, thread float4* const tint_symbol_4) {
  tint_array_wrapper_2 sums = {};
  int a = 0;
  int b = 0;
  int c = 0;
  int d = 0;
  int e = 0;
  int f = 0;
  int g = 0;
  int h = 0;
  int i = 0;
  int j = 0;
  bool x_215 = false;
  bool x_216_phi = false;
  int const x_20 = x_6.x_GLF_uniform_int_values.arr[1].el;
  float const x_110 = x_8.x_GLF_uniform_float_values.arr[0].el;
  sums.arr[x_20] = x_110;
  int const x_22 = x_6.x_GLF_uniform_int_values.arr[2].el;
  float const x_114 = x_8.x_GLF_uniform_float_values.arr[0].el;
  sums.arr[x_22] = x_114;
  int const x_23 = x_6.x_GLF_uniform_int_values.arr[1].el;
  a = x_23;
  while (true) {
    int const x_24 = a;
    int const x_25 = x_6.x_GLF_uniform_int_values.arr[0].el;
    if ((x_24 < x_25)) {
    } else {
      break;
    }
    int const x_26 = x_6.x_GLF_uniform_int_values.arr[5].el;
    b = x_26;
    while (true) {
      int const x_27 = b;
      int const x_28 = x_6.x_GLF_uniform_int_values.arr[3].el;
      if ((x_27 < x_28)) {
      } else {
        break;
      }
      int const x_29 = x_6.x_GLF_uniform_int_values.arr[6].el;
      c = x_29;
      while (true) {
        int const x_30 = c;
        int const x_31 = x_6.x_GLF_uniform_int_values.arr[4].el;
        if ((x_30 <= x_31)) {
        } else {
          break;
        }
        int const x_32 = x_6.x_GLF_uniform_int_values.arr[1].el;
        d = x_32;
        while (true) {
          int const x_33 = d;
          int const x_34 = x_6.x_GLF_uniform_int_values.arr[6].el;
          if ((x_33 < x_34)) {
          } else {
            break;
          }
          int const x_35 = x_6.x_GLF_uniform_int_values.arr[0].el;
          e = x_35;
          while (true) {
            int const x_36 = e;
            int const x_37 = x_6.x_GLF_uniform_int_values.arr[4].el;
            if ((x_36 <= x_37)) {
            } else {
              break;
            }
            int const x_38 = x_6.x_GLF_uniform_int_values.arr[1].el;
            f = x_38;
            while (true) {
              int const x_39 = f;
              int const x_40 = x_6.x_GLF_uniform_int_values.arr[0].el;
              if ((x_39 < x_40)) {
              } else {
                break;
              }
              int const x_41 = x_6.x_GLF_uniform_int_values.arr[1].el;
              g = x_41;
              while (true) {
                int const x_42 = g;
                int const x_43 = x_6.x_GLF_uniform_int_values.arr[6].el;
                if ((x_42 < x_43)) {
                } else {
                  break;
                }
                int const x_44 = x_6.x_GLF_uniform_int_values.arr[1].el;
                h = x_44;
                while (true) {
                  int const x_45 = h;
                  int const x_46 = x_6.x_GLF_uniform_int_values.arr[0].el;
                  if ((x_45 < x_46)) {
                  } else {
                    break;
                  }
                  int const x_47 = x_6.x_GLF_uniform_int_values.arr[1].el;
                  i = x_47;
                  while (true) {
                    int const x_48 = i;
                    int const x_49 = x_6.x_GLF_uniform_int_values.arr[4].el;
                    if ((x_48 < x_49)) {
                    } else {
                      break;
                    }
                    int const x_50 = x_6.x_GLF_uniform_int_values.arr[0].el;
                    j = x_50;
                    while (true) {
                      int const x_51 = j;
                      int const x_52 = x_6.x_GLF_uniform_int_values.arr[1].el;
                      if ((x_51 > x_52)) {
                      } else {
                        break;
                      }
                      int const x_53 = a;
                      float const x_197 = x_8.x_GLF_uniform_float_values.arr[2].el;
                      float const x_199 = sums.arr[x_53];
                      sums.arr[x_53] = (x_199 + x_197);
                      {
                        int const x_54 = j;
                        j = (x_54 - 1);
                      }
                    }
                    {
                      int const x_56 = i;
                      i = (x_56 + 1);
                    }
                  }
                  {
                    int const x_58 = h;
                    h = (x_58 + 1);
                  }
                }
                {
                  int const x_60 = g;
                  g = (x_60 + 1);
                }
              }
              {
                int const x_62 = f;
                f = (x_62 + 1);
              }
            }
            {
              int const x_64 = e;
              e = (x_64 + 1);
            }
          }
          {
            int const x_66 = d;
            d = (x_66 + 1);
          }
        }
        {
          int const x_68 = c;
          c = (x_68 + 1);
        }
      }
      {
        int const x_70 = b;
        b = (x_70 + 1);
      }
    }
    {
      int const x_72 = a;
      a = (x_72 + 1);
    }
  }
  int const x_74 = x_6.x_GLF_uniform_int_values.arr[1].el;
  float const x_204 = sums.arr[x_74];
  float const x_206 = x_8.x_GLF_uniform_float_values.arr[1].el;
  bool const x_207 = (x_204 == x_206);
  x_216_phi = x_207;
  if (x_207) {
    int const x_75 = x_6.x_GLF_uniform_int_values.arr[2].el;
    float const x_212 = sums.arr[x_75];
    float const x_214 = x_8.x_GLF_uniform_float_values.arr[1].el;
    x_215 = (x_212 == x_214);
    x_216_phi = x_215;
  }
  bool const x_216 = x_216_phi;
  if (x_216) {
    int const x_76 = x_6.x_GLF_uniform_int_values.arr[2].el;
    int const x_77 = x_6.x_GLF_uniform_int_values.arr[1].el;
    int const x_78 = x_6.x_GLF_uniform_int_values.arr[1].el;
    int const x_79 = x_6.x_GLF_uniform_int_values.arr[2].el;
    *(tint_symbol_4) = float4(float(x_76), float(x_77), float(x_78), float(x_79));
  } else {
    int const x_80 = x_6.x_GLF_uniform_int_values.arr[1].el;
    float const x_230 = float(x_80);
    *(tint_symbol_4) = float4(x_230, x_230, x_230, x_230);
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_1(x_6, x_8, &(tint_symbol_5));
  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
  return tint_symbol_3;
}

