#include <metal_stdlib>

using namespace metal;
struct S {
  int a;
  int b;
  int c;
};
struct tint_padded_array_element {
  /* 0x0000 */ int el;
  /* 0x0004 */ int8_t tint_pad[12];
};
struct tint_array_wrapper {
  /* 0x0000 */ tint_padded_array_element arr[2];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
};
struct tint_array_wrapper_1 {
  S arr[2];
};
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_7, thread float4* const tint_symbol_5) {
  tint_array_wrapper_1 A = {};
  int const x_29 = x_7.x_GLF_uniform_int_values.arr[1].el;
  int const x_31 = x_7.x_GLF_uniform_int_values.arr[1].el;
  int const x_33 = x_7.x_GLF_uniform_int_values.arr[1].el;
  int const x_35 = x_7.x_GLF_uniform_int_values.arr[1].el;
  S const tint_symbol_2 = {.a=x_31, .b=x_33, .c=x_35};
  A.arr[x_29] = tint_symbol_2;
  int const x_39 = x_7.x_GLF_uniform_int_values.arr[0].el;
  int const x_41 = x_7.x_GLF_uniform_int_values.arr[1].el;
  int const x_43 = x_7.x_GLF_uniform_int_values.arr[1].el;
  int const x_45 = x_7.x_GLF_uniform_int_values.arr[1].el;
  S const tint_symbol_3 = {.a=x_41, .b=x_43, .c=x_45};
  A.arr[x_39] = tint_symbol_3;
  int const x_49 = x_7.x_GLF_uniform_int_values.arr[1].el;
  int const x_51 = A.arr[x_49].b;
  int const x_53 = x_7.x_GLF_uniform_int_values.arr[1].el;
  if ((x_51 == x_53)) {
    int const x_58 = x_7.x_GLF_uniform_int_values.arr[1].el;
    int const x_61 = x_7.x_GLF_uniform_int_values.arr[0].el;
    A.arr[clamp(x_58, 1, 2)].b = x_61;
  }
  int const x_64 = x_7.x_GLF_uniform_int_values.arr[0].el;
  int const x_66 = A.arr[x_64].b;
  int const x_68 = x_7.x_GLF_uniform_int_values.arr[0].el;
  if ((x_66 == x_68)) {
    int const x_74 = x_7.x_GLF_uniform_int_values.arr[0].el;
    int const x_77 = x_7.x_GLF_uniform_int_values.arr[1].el;
    int const x_80 = x_7.x_GLF_uniform_int_values.arr[1].el;
    int const x_83 = x_7.x_GLF_uniform_int_values.arr[0].el;
    *(tint_symbol_5) = float4(float(x_74), float(x_77), float(x_80), float(x_83));
  } else {
    int const x_87 = x_7.x_GLF_uniform_int_values.arr[0].el;
    float const x_88 = float(x_87);
    *(tint_symbol_5) = float4(x_88, x_88, x_88, x_88);
  }
  return;
}

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

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

