#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[4];
};
struct buf1 {
  /* 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 buf0 {
  /* 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 buf1& x_6, constant buf0& 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;
  float2x2 indexable = float2x2(0.0f);
  float2x2 indexable_1 = float2x2(0.0f);
  bool x_158 = false;
  bool x_159_phi = false;
  int const x_16 = x_6.x_GLF_uniform_int_values.arr[1].el;
  float const x_85 = x_8.x_GLF_uniform_float_values.arr[0].el;
  sums.arr[x_16] = -(x_85);
  int const x_18 = x_6.x_GLF_uniform_int_values.arr[2].el;
  float const x_90 = x_8.x_GLF_uniform_float_values.arr[0].el;
  sums.arr[x_18] = -(x_90);
  int const x_19 = x_6.x_GLF_uniform_int_values.arr[1].el;
  a = x_19;
  while (true) {
    int const x_20 = a;
    int const x_21 = x_6.x_GLF_uniform_int_values.arr[0].el;
    if ((x_20 < x_21)) {
    } else {
      break;
    }
    int const x_22 = x_6.x_GLF_uniform_int_values.arr[1].el;
    b = x_22;
    while (true) {
      int const x_23 = b;
      int const x_24 = x_6.x_GLF_uniform_int_values.arr[3].el;
      if ((x_23 < x_24)) {
      } else {
        break;
      }
      int const x_25 = x_6.x_GLF_uniform_int_values.arr[1].el;
      c = x_25;
      while (true) {
        int const x_26 = c;
        int const x_27 = a;
        if ((x_26 <= x_27)) {
        } else {
          break;
        }
        int const x_28 = x_6.x_GLF_uniform_int_values.arr[1].el;
        d = x_28;
        while (true) {
          int const x_29 = d;
          int const x_30 = x_6.x_GLF_uniform_int_values.arr[3].el;
          if ((x_29 < x_30)) {
          } else {
            break;
          }
          int const x_31 = a;
          int const x_32 = x_6.x_GLF_uniform_int_values.arr[2].el;
          float const x_125 = float(x_32);
          int const x_33 = c;
          int const x_34 = x_6.x_GLF_uniform_int_values.arr[2].el;
          indexable = float2x2(float2(x_125, 0.0f), float2(0.0f, x_125));
          float const x_131 = indexable[x_33][x_34];
          sums.arr[x_31] = x_131;
          int const x_35 = a;
          int const x_36 = x_6.x_GLF_uniform_int_values.arr[2].el;
          float const x_134 = float(x_36);
          int const x_37 = c;
          int const x_38 = x_6.x_GLF_uniform_int_values.arr[2].el;
          indexable_1 = float2x2(float2(x_134, 0.0f), float2(0.0f, x_134));
          float const x_140 = indexable_1[x_37][x_38];
          float const x_142 = sums.arr[x_35];
          sums.arr[x_35] = (x_142 + x_140);
          {
            int const x_39 = d;
            d = (x_39 + 1);
          }
        }
        {
          int const x_41 = c;
          c = (x_41 + 1);
        }
      }
      {
        int const x_43 = b;
        b = (x_43 + 1);
      }
    }
    {
      int const x_45 = a;
      a = (x_45 + 1);
    }
  }
  int const x_47 = x_6.x_GLF_uniform_int_values.arr[1].el;
  float const x_147 = sums.arr[x_47];
  float const x_149 = x_8.x_GLF_uniform_float_values.arr[1].el;
  bool const x_150 = (x_147 == x_149);
  x_159_phi = x_150;
  if (x_150) {
    int const x_48 = x_6.x_GLF_uniform_int_values.arr[2].el;
    float const x_155 = sums.arr[x_48];
    float const x_157 = x_8.x_GLF_uniform_float_values.arr[2].el;
    x_158 = (x_155 == x_157);
    x_159_phi = x_158;
  }
  bool const x_159 = x_159_phi;
  if (x_159) {
    int const x_49 = x_6.x_GLF_uniform_int_values.arr[2].el;
    int const x_50 = x_6.x_GLF_uniform_int_values.arr[1].el;
    int const x_51 = x_6.x_GLF_uniform_int_values.arr[1].el;
    int const x_52 = x_6.x_GLF_uniform_int_values.arr[2].el;
    *(tint_symbol_4) = float4(float(x_49), float(x_50), float(x_51), float(x_52));
  } else {
    int const x_53 = x_6.x_GLF_uniform_int_values.arr[1].el;
    float const x_173 = float(x_53);
    *(tint_symbol_4) = float4(x_173, x_173, x_173, x_173);
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf1& x_6 [[buffer(1)]], constant buf0& x_8 [[buffer(0)]]) {
  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;
}

