#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ float zero;
};
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_7, thread float4* const tint_symbol_3, thread float4* const tint_symbol_4) {
  float f = 0.0f;
  bool x_49 = false;
  bool x_50_phi = false;
  float const x_31 = (*(tint_symbol_3)).x;
  f = x_31;
  float const x_32 = f;
  f = (x_32 + NAN);
  float const x_34 = f;
  if (((5.0f / x_34) == 0.0f)) {
    float const x_39 = f;
    f = (x_39 + 1.0f);
  }
  float const x_41 = f;
  bool const x_42 = isnan(x_41);
  x_50_phi = x_42;
  if (!(x_42)) {
    float const x_46 = f;
    float const x_48 = x_7.zero;
    x_49 = (x_46 != x_48);
    x_50_phi = x_49;
  }
  bool const x_50 = x_50_phi;
  if (x_50) {
    f = 0.0f;
  }
  float const x_53 = f;
  if ((x_53 == 0.0f)) {
    *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_7, float4 gl_FragCoord_param, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  *(tint_symbol_5) = gl_FragCoord_param;
  main_1(x_7, 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]], constant buf0& x_7 [[buffer(0)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_7, 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;
}

