#include <metal_stdlib>

using namespace metal;
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(thread float4* const tint_symbol_3, thread float4* const tint_symbol_4) {
  int ll = 0;
  *(tint_symbol_3) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  float const x_30 = (*(tint_symbol_4)).x;
  if ((int(x_30) < 2000)) {
  } else {
    ll = 0;
    while (true) {
      float const x_41 = (*(tint_symbol_4)).x;
      if ((x_41 < 0.0f)) {
        discard_fragment();
      }
      int const x_6 = ll;
      if ((x_6 >= 5)) {
        break;
      }
      {
        int const x_7 = ll;
        ll = as_type<int>((as_type<uint>(x_7) + as_type<uint>(1)));
      }
    }
    float const x_49 = (*(tint_symbol_4)).x;
    if ((int(x_49) >= 2000)) {
      discard_fragment();
    }
  }
  return;
}

main_out tint_symbol_inner(float4 gl_FragCoord_param, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  *(tint_symbol_5) = gl_FragCoord_param;
  main_1(tint_symbol_6, tint_symbol_5);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_6)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol(float4 gl_FragCoord_param [[position]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  main_out const inner_result = tint_symbol_inner(gl_FragCoord_param, &(tint_symbol_7), &(tint_symbol_8));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

