#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ int zero;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

float func_(constant buf0& x_8) {
  float s = 0.0f;
  int i = 0;
  int j = 0;
  s = 2.0f;
  i = 0;
  while (true) {
    int const x_47 = i;
    int const x_49 = x_8.zero;
    if ((x_47 < as_type<int>((as_type<uint>(x_49) + as_type<uint>(1))))) {
    } else {
      break;
    }
    float const x_53 = s;
    s = (x_53 + 3.0f);
    j = 0;
    while (true) {
      int const x_59 = j;
      if ((x_59 < 10)) {
      } else {
        break;
      }
      int const x_63 = x_8.zero;
      if ((x_63 == 1)) {
        discard_fragment();
      }
      {
        int const x_67 = j;
        j = as_type<int>((as_type<uint>(x_67) + as_type<uint>(1)));
      }
    }
    {
      int const x_69 = i;
      i = as_type<int>((as_type<uint>(x_69) + as_type<uint>(1)));
    }
  }
  float const x_71 = s;
  return x_71;
}

void main_1(constant buf0& x_8, thread float4* const tint_symbol_4) {
  float4 c = 0.0f;
  float const x_34 = func_(x_8);
  c = float4(x_34, 0.0f, 0.0f, 1.0f);
  float const x_36 = func_(x_8);
  if ((x_36 == 5.0f)) {
    float4 const x_41 = c;
    *(tint_symbol_4) = x_41;
  } else {
    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
  }
  return;
}

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

