#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_3) {
  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_3) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  return;
}

main_out tint_symbol_inner(constant buf0& x_6, thread float4* const tint_symbol_4) {
  main_1(x_6, tint_symbol_4);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_4)};
  return tint_symbol_2;
}

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

