#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_float2 injectionSwitch;
};
struct tint_array_wrapper {
  int arr[10];
};
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_6, thread float4* const tint_symbol_4) {
  int k = 0;
  int GLF_dead0j = 0;
  tint_array_wrapper donor_replacementGLF_dead0stack = {};
  int donor_replacementGLF_dead0top = 0;
  int x_54 = 0;
  float4 matrix_b = 0.0f;
  int b = 0;
  k = 0;
  while (true) {
    int const x_12 = k;
    if ((x_12 < 4)) {
    } else {
      break;
    }
    float const x_62 = x_6.injectionSwitch.y;
    if ((0.0f > x_62)) {
      GLF_dead0j = 1;
      while (true) {
        int const x_13 = donor_replacementGLF_dead0stack.arr[0];
        if ((1 <= x_13)) {
        } else {
          break;
        }
      }
      int const x_14 = donor_replacementGLF_dead0top;
      int const x_15 = donor_replacementGLF_dead0top;
      if (((x_14 >= 0) & (x_15 < 9))) {
        int const x_16 = donor_replacementGLF_dead0top;
        int const x_17 = as_type<int>((as_type<uint>(x_16) + as_type<uint>(1)));
        donor_replacementGLF_dead0top = x_17;
        x_54 = x_17;
      } else {
        x_54 = 0;
      }
      int const x_18 = x_54;
      donor_replacementGLF_dead0stack.arr[x_18] = 1;
    }
    matrix_b = float4(0.0f, 0.0f, 0.0f, 0.0f);
    b = 3;
    while (true) {
      int const x_19 = b;
      if ((x_19 >= 0)) {
      } else {
        break;
      }
      int const x_20 = b;
      int const x_21 = b;
      float const x_87 = matrix_b[x_21];
      matrix_b[x_20] = (x_87 - 1.0f);
      {
        int const x_22 = b;
        b = as_type<int>((as_type<uint>(x_22) - as_type<uint>(1)));
      }
    }
    {
      int const x_24 = k;
      k = as_type<int>((as_type<uint>(x_24) + as_type<uint>(1)));
    }
  }
  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_1(x_6, &(tint_symbol_5));
  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_5};
  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
  return tint_symbol_3;
}

