#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_float2 injectionSwitch;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

float func_(constant buf0& x_10, thread float4* const tint_symbol_5) {
  bool alwaysFalse = false;
  float4 value = 0.0f;
  float2 a = 0.0f;
  int i = 0;
  bool x_121 = false;
  bool x_122_phi = false;
  float const x_71 = (*(tint_symbol_5)).x;
  alwaysFalse = (x_71 < -1.0f);
  bool const x_73 = alwaysFalse;
  if (x_73) {
    float2 const x_76 = a;
    float4 const x_77 = value;
    value = float4(x_76.x, x_76.y, x_77.z, x_77.w);
  }
  bool const x_79 = alwaysFalse;
  if (!(x_79)) {
    float2 const x_84 = x_10.injectionSwitch;
    float4 const x_85 = value;
    value = float4(x_84.x, x_84.y, x_85.z, x_85.w);
  }
  float4 const x_87 = *(tint_symbol_5);
  float4 const x_89 = value;
  float4 const x_93 = value;
  float2 const x_95 = (((float2(x_87.x, x_87.y) * float2(x_89.x, x_89.y)) * float2(2.0f, 2.0f)) + float2(x_93.x, x_93.y));
  float4 const x_96 = value;
  value = float4(x_96.x, x_96.y, x_95.x, x_95.y);
  i = 0;
  while (true) {
    int const x_102 = i;
    float const x_104 = x_10.injectionSwitch.y;
    if ((x_102 < (int(x_104) + 1))) {
    } else {
      break;
    }
    int const x_109 = i;
    value.x = float(x_109);
    {
      int const x_112 = i;
      i = (x_112 + 1);
    }
  }
  float const x_115 = value.x;
  bool const x_116 = (x_115 == 1.0f);
  x_122_phi = x_116;
  if (x_116) {
    float const x_120 = value.y;
    x_121 = (x_120 == 1.0f);
    x_122_phi = x_121;
  }
  bool const x_122 = x_122_phi;
  if (x_122) {
    return 1.0f;
  } else {
    return 0.0f;
  }
  return 0.0f;
}

void main_1(constant buf0& x_10, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
  int count = 0;
  int i_1 = 0;
  count = 0;
  i_1 = 0;
  while (true) {
    int const x_51 = i_1;
    float const x_53 = x_10.injectionSwitch.y;
    if ((x_51 < (int(x_53) + 1))) {
    } else {
      break;
    }
    float const x_58 = func_(x_10, tint_symbol_6);
    int const x_60 = count;
    count = (x_60 + int(x_58));
    {
      int const x_62 = i_1;
      i_1 = (x_62 + 1);
    }
  }
  int const x_64 = count;
  if ((x_64 == 2)) {
    *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_7) = float4(0.0f, 0.0f, 0.0f, 1.0f);
  }
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_10 [[buffer(0)]]) {
  thread float4 tint_symbol_8 = 0.0f;
  thread float4 tint_symbol_9 = 0.0f;
  tint_symbol_8 = gl_FragCoord_param;
  main_1(x_10, &(tint_symbol_8), &(tint_symbol_9));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

