#include <metal_stdlib>

using namespace metal;
struct tint_padded_array_element {
  /* 0x0000 */ int el;
  /* 0x0004 */ int8_t tint_pad[12];
};
struct tint_array_wrapper {
  /* 0x0000 */ tint_padded_array_element arr[5];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
};
struct tint_array_wrapper_1 {
  int arr[4];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

int func_i1_(constant buf0& x_8, thread int* const x) {
  int a = 0;
  int i = 0;
  tint_array_wrapper_1 indexable = {};
  int const x_72 = x_8.x_GLF_uniform_int_values.arr[0].el;
  a = x_72;
  int const x_74 = x_8.x_GLF_uniform_int_values.arr[0].el;
  i = x_74;
  while (true) {
    int const x_79 = i;
    int const x_81 = x_8.x_GLF_uniform_int_values.arr[1].el;
    if ((x_79 < x_81)) {
    } else {
      break;
    }
    int const x_85 = x_8.x_GLF_uniform_int_values.arr[3].el;
    int const x_87 = x_8.x_GLF_uniform_int_values.arr[3].el;
    int const x_89 = x_8.x_GLF_uniform_int_values.arr[3].el;
    int const x_91 = x_8.x_GLF_uniform_int_values.arr[3].el;
    int const x_93 = a;
    tint_array_wrapper_1 const tint_symbol_3 = {.arr={x_85, x_87, x_89, x_91}};
    indexable = tint_symbol_3;
    int const x_95 = indexable.arr[x_93];
    int const x_96 = *(x);
    if ((x_95 > x_96)) {
      if (true) {
        int const x_105 = x_8.x_GLF_uniform_int_values.arr[3].el;
        return x_105;
      } else {
        int const x_107 = x_8.x_GLF_uniform_int_values.arr[3].el;
        a = x_107;
      }
    } else {
      if (true) {
        int const x_111 = x_8.x_GLF_uniform_int_values.arr[4].el;
        return x_111;
      }
    }
    {
      int const x_112 = i;
      i = as_type<int>((as_type<uint>(x_112) + as_type<uint>(1)));
    }
  }
  int const x_115 = x_8.x_GLF_uniform_int_values.arr[0].el;
  return x_115;
}

void main_1(constant buf0& x_8, thread float4* const tint_symbol_5) {
  int a_1 = 0;
  int param = 0;
  int param_1 = 0;
  int const x_39 = x_8.x_GLF_uniform_int_values.arr[0].el;
  param = x_39;
  int const x_40 = func_i1_(x_8, &(param));
  a_1 = x_40;
  int const x_42 = x_8.x_GLF_uniform_int_values.arr[3].el;
  param_1 = x_42;
  int const x_43 = func_i1_(x_8, &(param_1));
  int const x_44 = a_1;
  a_1 = as_type<int>((as_type<uint>(x_44) + as_type<uint>(x_43)));
  int const x_46 = a_1;
  int const x_48 = x_8.x_GLF_uniform_int_values.arr[2].el;
  if ((x_46 == x_48)) {
    int const x_54 = x_8.x_GLF_uniform_int_values.arr[3].el;
    int const x_57 = x_8.x_GLF_uniform_int_values.arr[0].el;
    int const x_60 = x_8.x_GLF_uniform_int_values.arr[0].el;
    int const x_63 = x_8.x_GLF_uniform_int_values.arr[3].el;
    *(tint_symbol_5) = float4(float(x_54), float(x_57), float(x_60), float(x_63));
  } else {
    int const x_67 = x_8.x_GLF_uniform_int_values.arr[0].el;
    float const x_68 = float(x_67);
    *(tint_symbol_5) = float4(x_68, x_68, x_68, x_68);
  }
  return;
}

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

