#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) {
  tint_array_wrapper data = {};
  int x_40 = 0;
  int x_40_phi = 0;
  int x_11_phi = 0;
  int const x_7 = data.arr[1];
  int const x_10 = select(1, 2, (1 < x_7));
  x_40_phi = 1;
  x_11_phi = x_10;
  while (true) {
    int x_54 = 0;
    int x_41 = 0;
    int x_41_phi = 0;
    x_40 = x_40_phi;
    int const x_11 = x_11_phi;
    if ((x_11 < 3)) {
    } else {
      break;
    }
    int x_54_phi = 0;
    int const x_8 = as_type<int>((as_type<uint>(x_11) + as_type<uint>(1)));
    float const x_47 = x_6.injectionSwitch.x;
    x_54_phi = x_40;
    switch(int(x_47)) {
      case 78: {
        *(tint_symbol_3) = float4(1.0f, 1.0f, 1.0f, 1.0f);
        /* fallthrough */
      }
      case 19: {
        x_54_phi = as_type<int>(as_type<int>((as_type<uint>(x_40) + as_type<uint>(as_type<int>(1)))));
        /* fallthrough */
      }
      case 23:
      case 38: {
        x_54 = x_54_phi;
        x_41_phi = x_54;
        {
          x_41 = x_41_phi;
          x_40_phi = x_41;
          x_11_phi = x_8;
        }
        continue;
        break;
      }
      default: {
        x_41_phi = x_40;
        {
          x_41 = x_41_phi;
          x_40_phi = x_41;
          x_11_phi = x_8;
        }
        continue;
        break;
      }
    }
    x_41_phi = 0;
    {
      x_41 = x_41_phi;
      x_40_phi = x_41;
      x_11_phi = x_8;
    }
  }
  data.arr[x_40] = 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;
}

