#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 x_47() {
  discard_fragment();
}

void main_1(thread float4* const tint_symbol_3, thread float4* const tint_symbol_4) {
  while (true) {
    int x_30_phi = 0;
    bool x_48_phi = false;
    x_30_phi = 0;
    while (true) {
      int x_31 = 0;
      int const x_30 = x_30_phi;
      x_48_phi = false;
      if ((x_30 < 10)) {
      } else {
        break;
      }
      float const x_37 = (*(tint_symbol_3)).y;
      if ((x_37 < 0.0f)) {
        float const x_42 = (*(tint_symbol_3)).x;
        if ((x_42 < 0.0f)) {
          x_48_phi = false;
          break;
        } else {
          {
            x_31 = as_type<int>((as_type<uint>(x_30) + as_type<uint>(1)));
            x_30_phi = x_31;
          }
          continue;
        }
        {
          x_31 = as_type<int>((as_type<uint>(x_30) + as_type<uint>(1)));
          x_30_phi = x_31;
        }
        continue;
      }
      x_47();
      x_48_phi = true;
      break;
      {
        x_31 = as_type<int>((as_type<uint>(x_30) + as_type<uint>(1)));
        x_30_phi = x_31;
      }
    }
    bool const x_48 = x_48_phi;
    if (x_48) {
      break;
    }
    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
    break;
  }
  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_5, tint_symbol_6);
  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;
}

