#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[3];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper x_GLF_uniform_int_values;
};
struct tint_padded_array_element_1 {
  /* 0x0000 */ float el;
  /* 0x0004 */ int8_t tint_pad_1[12];
};
struct tint_array_wrapper_1 {
  /* 0x0000 */ tint_padded_array_element_1 arr[1];
};
struct buf1 {
  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
};
struct tint_array_wrapper_2 {
  int arr[3];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf0& x_7, constant buf1& x_11, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
  tint_array_wrapper_2 arr = {};
  int a = 0;
  int b = 0;
  int c = 0;
  int const x_40 = x_7.x_GLF_uniform_int_values.arr[1].el;
  int const x_42 = x_7.x_GLF_uniform_int_values.arr[1].el;
  int const x_44 = x_7.x_GLF_uniform_int_values.arr[1].el;
  tint_array_wrapper_2 const tint_symbol_4 = {.arr={x_40, x_42, x_44}};
  arr = tint_symbol_4;
  int const x_47 = x_7.x_GLF_uniform_int_values.arr[0].el;
  int const x_49 = arr.arr[x_47];
  a = x_49;
  int const x_50 = a;
  b = (x_50 - 1);
  float const x_53 = (*(tint_symbol_6)).x;
  float const x_55 = x_11.x_GLF_uniform_float_values.arr[0].el;
  if ((x_53 < x_55)) {
    int const x_59 = b;
    b = (x_59 + 1);
  }
  int const x_62 = x_7.x_GLF_uniform_int_values.arr[0].el;
  c = x_62;
  int const x_63 = c;
  int const x_65 = x_7.x_GLF_uniform_int_values.arr[1].el;
  int const x_67 = x_7.x_GLF_uniform_int_values.arr[2].el;
  int const x_69 = b;
  arr.arr[clamp(x_63, x_65, x_67)] = x_69;
  int const x_72 = x_7.x_GLF_uniform_int_values.arr[0].el;
  int const x_74 = arr.arr[x_72];
  int const x_77 = x_7.x_GLF_uniform_int_values.arr[1].el;
  int const x_79 = arr.arr[x_77];
  int const x_82 = x_7.x_GLF_uniform_int_values.arr[1].el;
  int const x_84 = arr.arr[x_82];
  int const x_87 = x_7.x_GLF_uniform_int_values.arr[2].el;
  int const x_89 = arr.arr[x_87];
  *(tint_symbol_7) = float4(float(x_74), float(x_79), float(x_84), float(x_89));
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_7 [[buffer(0)]], constant buf1& x_11 [[buffer(1)]]) {
  thread float4 tint_symbol_8 = 0.0f;
  thread float4 tint_symbol_9 = 0.0f;
  tint_symbol_8 = gl_FragCoord_param;
  main_1(x_7, x_11, &(tint_symbol_8), &(tint_symbol_9));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_5;
}

