#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[5];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
};
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, thread float4* const tint_symbol_4) {
  int a = 0;
  int b = 0;
  int c = 0;
  bool x_76 = false;
  bool x_83 = false;
  bool x_77_phi = false;
  bool x_84_phi = false;
  int const x_31 = x_6.x_GLF_uniform_int_values.arr[0].el;
  a = x_31;
  int const x_33 = x_6.x_GLF_uniform_int_values.arr[2].el;
  b = x_33;
  c = 1;
  while (true) {
    int const x_38 = b;
    int const x_40 = x_6.x_GLF_uniform_int_values.arr[4].el;
    int const x_42 = a;
    if (((x_38 < x_40) & (x_42 < 10))) {
    } else {
      break;
    }
    int const x_46 = c;
    if ((x_46 > 5)) {
      break;
    }
    int const x_50 = a;
    a = as_type<int>((as_type<uint>(x_50) + as_type<uint>(1)));
    int const x_52 = c;
    c = as_type<int>((as_type<uint>(x_52) + as_type<uint>(1)));
    int const x_54 = b;
    b = as_type<int>((as_type<uint>(x_54) + as_type<uint>(1)));
  }
  while (true) {
    int const x_60 = a;
    int const x_62 = x_6.x_GLF_uniform_int_values.arr[1].el;
    if ((x_60 < x_62)) {
    } else {
      break;
    }
    {
      int const x_65 = a;
      a = as_type<int>((as_type<uint>(x_65) + as_type<uint>(1)));
    }
  }
  int const x_67 = a;
  int const x_69 = x_6.x_GLF_uniform_int_values.arr[1].el;
  bool const x_70 = (x_67 == x_69);
  x_77_phi = x_70;
  if (x_70) {
    int const x_73 = b;
    int const x_75 = x_6.x_GLF_uniform_int_values.arr[3].el;
    x_76 = (x_73 == x_75);
    x_77_phi = x_76;
  }
  bool const x_77 = x_77_phi;
  x_84_phi = x_77;
  if (x_77) {
    int const x_80 = c;
    int const x_82 = x_6.x_GLF_uniform_int_values.arr[3].el;
    x_83 = (x_80 == x_82);
    x_84_phi = x_83;
  }
  bool const x_84 = x_84_phi;
  if (x_84) {
    int const x_89 = x_6.x_GLF_uniform_int_values.arr[2].el;
    int const x_92 = x_6.x_GLF_uniform_int_values.arr[0].el;
    int const x_95 = x_6.x_GLF_uniform_int_values.arr[0].el;
    int const x_98 = x_6.x_GLF_uniform_int_values.arr[2].el;
    *(tint_symbol_4) = float4(float(x_89), float(x_92), float(x_95), float(x_98));
  } else {
    int const x_102 = x_6.x_GLF_uniform_int_values.arr[0].el;
    float const x_103 = float(x_102);
    *(tint_symbol_4) = float4(x_103, x_103, x_103, x_103);
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_1(x_6, &(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;
}

