#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ float one;
};
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) {
  float f = 0.0f;
  int a = 0;
  int b = 0;
  int c = 0;
  int i = 0;
  float3 v = 0.0f;
  float const x_42 = x_6.one;
  f = x_42;
  a = 1;
  b = 0;
  c = 1;
  i = 0;
  while (true) {
    int const x_47 = i;
    if ((x_47 < 3)) {
    } else {
      break;
    }
    int const x_50 = i;
    float const x_51 = f;
    int const x_52 = i;
    v[x_50] = (x_51 + float(x_52));
    {
      int const x_56 = i;
      i = (x_56 + 1);
    }
  }
  float const x_59 = x_6.one;
  if ((x_59 == 1.0f)) {
    while (true) {
      *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 0.0f);
      {
        int const x_67 = c;
        int const x_68 = a;
        int const x_69 = b;
        if (((x_67 & (x_68 | x_69)) == 0)) {
        } else {
          break;
        }
      }
    }
    float const x_74 = x_6.one;
    if ((x_74 == 1.0f)) {
      *(tint_symbol_4) = float4(1.0f, 1.0f, 1.0f, 1.0f);
    }
  }
  float const x_79 = v.x;
  float const x_83 = v.y;
  float const x_87 = v.z;
  float3 const x_90 = float3(select(0.0f, 1.0f, (x_79 == 1.0f)), select(1.0f, 0.0f, (x_83 == 2.0f)), select(1.0f, 0.0f, (x_87 == 3.0f)));
  float4 const x_91 = *(tint_symbol_4);
  *(tint_symbol_4) = float4(x_90.x, x_90.y, x_90.z, x_91.w);
  (*(tint_symbol_4)).w = 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;
}

