#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ float2 injectionSwitch;
};
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_8, thread float4* const tint_symbol_3, thread float4* const tint_symbol_4) {
  int odd_index = 0;
  int even_index = 0;
  int j = 0;
  int ll = 0;
  bool x_59 = false;
  bool x_60_phi = false;
  *(tint_symbol_3) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  float const x_53 = (*(tint_symbol_4)).x;
  bool const x_54 = (x_53 < 128.0f);
  x_60_phi = x_54;
  if (x_54) {
    float const x_58 = (*(tint_symbol_4)).y;
    x_59 = (x_58 < 128.0f);
    x_60_phi = x_59;
  }
  bool const x_60 = x_60_phi;
  if (x_60) {
    return;
  }
  odd_index = 0;
  while (true) {
    int const x_11 = odd_index;
    if ((x_11 <= 1)) {
    } else {
      break;
    }
    float const x_70 = (*(tint_symbol_3)).x;
    (*(tint_symbol_3)).x = (x_70 + 0.25f);
    int const x_12 = odd_index;
    odd_index = as_type<int>((as_type<uint>(x_12) + as_type<uint>(1)));
  }
  even_index = 1;
  while (true) {
    int const x_14 = even_index;
    if ((x_14 >= 0)) {
    } else {
      break;
    }
    float const x_80 = (*(tint_symbol_3)).x;
    (*(tint_symbol_3)).x = (x_80 + 0.25f);
    float const x_84 = x_8.injectionSwitch.x;
    float const x_86 = x_8.injectionSwitch.y;
    if ((x_84 > x_86)) {
      continue;
    }
    int const x_15 = even_index;
    if ((x_15 >= 1)) {
      discard_fragment();
    }
    j = 1;
    while (true) {
      if (true) {
      } else {
        break;
      }
      int const x_16 = ll;
      if ((x_16 >= 3)) {
        break;
      }
      int const x_17 = ll;
      ll = as_type<int>((as_type<uint>(x_17) + as_type<uint>(1)));
      int const x_19 = j;
      if ((as_type<uint>(x_19) < 1u)) {
        {
          int const x_20 = j;
          j = as_type<int>((as_type<uint>(x_20) + as_type<uint>(1)));
        }
        continue;
      }
      float const x_106 = x_8.injectionSwitch.x;
      float const x_108 = x_8.injectionSwitch.y;
      if ((x_106 > x_108)) {
        break;
      }
      {
        int const x_20 = j;
        j = as_type<int>((as_type<uint>(x_20) + as_type<uint>(1)));
      }
    }
    float const x_113 = x_8.injectionSwitch.x;
    float const x_115 = x_8.injectionSwitch.y;
    if ((x_113 > x_115)) {
      *(tint_symbol_3) = float4(1.0f, 1.0f, 1.0f, 1.0f);
    }
    int const x_22 = even_index;
    even_index = as_type<int>((as_type<uint>(x_22) - as_type<uint>(1)));
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_8, 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_8, 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]], constant buf0& x_8 [[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_8, 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;
}

