#include <metal_stdlib>

using namespace metal;
struct tint_array_wrapper {
  float arr[3];
};
struct S {
  tint_array_wrapper numbers;
};
struct tint_padded_array_element {
  /* 0x0000 */ float el;
  /* 0x0004 */ int8_t tint_pad[12];
};
struct tint_array_wrapper_1 {
  /* 0x0000 */ tint_padded_array_element arr[5];
};
struct buf1 {
  /* 0x0000 */ tint_array_wrapper_1 x_GLF_uniform_float_values;
};
struct buf2 {
  /* 0x0000 */ packed_float2 zeroVec;
};
struct buf3 {
  /* 0x0000 */ packed_float2 oneVec;
};
struct tint_padded_array_element_1 {
  /* 0x0000 */ int el;
  /* 0x0004 */ int8_t tint_pad_1[12];
};
struct tint_array_wrapper_2 {
  /* 0x0000 */ tint_padded_array_element_1 arr[2];
};
struct buf0 {
  /* 0x0000 */ tint_array_wrapper_2 x_GLF_uniform_int_values;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf1& x_7, constant buf2& x_9, constant buf3& x_12, constant buf0& x_15, thread float4* const tint_symbol_6) {
  S obj = {};
  float a = 0.0f;
  float2 x_49 = 0.0f;
  float b = 0.0f;
  float const x_51 = x_7.x_GLF_uniform_float_values.arr[3].el;
  float const x_53 = x_7.x_GLF_uniform_float_values.arr[2].el;
  float const x_55 = x_7.x_GLF_uniform_float_values.arr[4].el;
  tint_array_wrapper const tint_symbol_3 = {.arr={x_51, x_53, x_55}};
  S const tint_symbol_4 = {.numbers=tint_symbol_3};
  obj = tint_symbol_4;
  float const x_59 = x_9.zeroVec.x;
  float const x_62 = x_7.x_GLF_uniform_float_values.arr[0].el;
  obj.numbers.arr[int(x_59)] = x_62;
  float const x_65 = x_9.zeroVec.x;
  float const x_67 = x_7.x_GLF_uniform_float_values.arr[0].el;
  if ((x_65 > x_67)) {
    float2 const x_73 = x_9.zeroVec;
    x_49 = x_73;
  } else {
    float2 const x_75 = x_12.oneVec;
    x_49 = x_75;
  }
  float const x_77 = x_49.y;
  a = x_77;
  float const x_79 = x_7.x_GLF_uniform_float_values.arr[0].el;
  float const x_80 = a;
  int const x_82 = x_15.x_GLF_uniform_int_values.arr[0].el;
  float const x_84 = obj.numbers.arr[x_82];
  b = mix(x_79, x_80, x_84);
  float const x_86 = b;
  float const x_88 = x_7.x_GLF_uniform_float_values.arr[2].el;
  float const x_91 = x_7.x_GLF_uniform_float_values.arr[1].el;
  if ((fabs(x_86 - x_88) < x_91)) {
    int const x_97 = x_15.x_GLF_uniform_int_values.arr[0].el;
    int const x_100 = x_15.x_GLF_uniform_int_values.arr[1].el;
    int const x_103 = x_15.x_GLF_uniform_int_values.arr[1].el;
    int const x_106 = x_15.x_GLF_uniform_int_values.arr[0].el;
    *(tint_symbol_6) = float4(float(x_97), float(x_100), float(x_103), float(x_106));
  } else {
    int const x_110 = x_15.x_GLF_uniform_int_values.arr[1].el;
    float const x_111 = float(x_110);
    *(tint_symbol_6) = float4(x_111, x_111, x_111, x_111);
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf1& x_7 [[buffer(1)]], constant buf2& x_9 [[buffer(2)]], constant buf3& x_12 [[buffer(3)]], constant buf0& x_15 [[buffer(0)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  main_1(x_7, x_9, x_12, x_15, &(tint_symbol_7));
  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
  tint_symbol_1 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
  return tint_symbol_5;
}

