#include <metal_stdlib>

using namespace metal;
struct tint_padded_array_element {
  /* 0x0000 */ float el;
  /* 0x0004 */ int8_t tint_pad[12];
};
struct tint_array_wrapper {
  /* 0x0000 */ tint_padded_array_element arr[4];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_float_values;
};
struct tint_padded_array_element_1 {
  /* 0x0000 */ int el;
  /* 0x0004 */ int8_t tint_pad_1[12];
};
struct tint_array_wrapper_1 {
  /* 0x0000 */ tint_padded_array_element_1 arr[3];
};
struct buf1 {
  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_int_values;
};
struct tint_array_wrapper_2 {
  float arr[3];
};
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, constant buf1& x_9, thread float4* const tint_symbol_5) {
  tint_array_wrapper_2 arr = {};
  int i = 0;
  float const x_36 = x_6.x_GLF_uniform_float_values.arr[0].el;
  float const x_38 = x_6.x_GLF_uniform_float_values.arr[1].el;
  float const x_40 = x_6.x_GLF_uniform_float_values.arr[2].el;
  tint_array_wrapper_2 const tint_symbol_3 = {.arr={x_36, x_38, x_40}};
  arr = tint_symbol_3;
  i = 1;
  while (true) {
    int const x_46 = i;
    int const x_48 = x_9.x_GLF_uniform_int_values.arr[2].el;
    if ((x_46 < min(x_48, 3))) {
    } else {
      break;
    }
    int const x_53 = x_9.x_GLF_uniform_int_values.arr[2].el;
    float const x_55 = x_6.x_GLF_uniform_float_values.arr[0].el;
    float const x_57 = arr.arr[x_53];
    arr.arr[x_53] = (x_57 + x_55);
    {
      int const x_60 = i;
      i = as_type<int>((as_type<uint>(x_60) + as_type<uint>(1)));
    }
  }
  int const x_63 = x_9.x_GLF_uniform_int_values.arr[2].el;
  float const x_65 = arr.arr[x_63];
  float const x_67 = x_6.x_GLF_uniform_float_values.arr[3].el;
  if ((x_65 == x_67)) {
    int const x_73 = x_9.x_GLF_uniform_int_values.arr[1].el;
    int const x_76 = x_9.x_GLF_uniform_int_values.arr[0].el;
    int const x_79 = x_9.x_GLF_uniform_int_values.arr[0].el;
    int const x_82 = x_9.x_GLF_uniform_int_values.arr[1].el;
    *(tint_symbol_5) = float4(float(x_73), float(x_76), float(x_79), float(x_82));
  } else {
    int const x_86 = x_9.x_GLF_uniform_int_values.arr[0].el;
    float const x_87 = float(x_86);
    *(tint_symbol_5) = float4(x_87, x_87, x_87, x_87);
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_6 [[buffer(0)]], constant buf1& x_9 [[buffer(1)]]) {
  thread float4 tint_symbol_6 = 0.0f;
  main_1(x_6, x_9, &(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;
}

