#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[3];
};
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 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, constant buf1& x_10, thread int* const tint_symbol_4, thread float4* const tint_symbol_5) {
  float f = 0.0f;
  int i = 0;
  *(tint_symbol_4) = 0;
  float const x_36 = x_7.x_GLF_uniform_float_values.arr[1].el;
  f = x_36;
  int const x_38 = x_10.x_GLF_uniform_int_values.arr[1].el;
  i = x_38;
  while (true) {
    int const x_43 = i;
    int const x_45 = x_10.x_GLF_uniform_int_values.arr[2].el;
    if ((x_43 < x_45)) {
    } else {
      break;
    }
    float const x_48 = f;
    float const x_50 = x_7.x_GLF_uniform_float_values.arr[1].el;
    if ((x_48 > x_50)) {
    }
    f = 1.0f;
    float const x_55 = x_7.x_GLF_uniform_float_values.arr[2].el;
    float const x_56 = f;
    int const x_59 = i;
    f = ((1.0f - clamp(x_55, 1.0f, x_56)) + float(x_59));
    {
      int const x_62 = i;
      i = as_type<int>((as_type<uint>(x_62) + as_type<uint>(1)));
    }
  }
  float const x_64 = f;
  float const x_66 = x_7.x_GLF_uniform_float_values.arr[0].el;
  if ((x_64 == x_66)) {
    int const x_72 = x_10.x_GLF_uniform_int_values.arr[0].el;
    int const x_75 = x_10.x_GLF_uniform_int_values.arr[1].el;
    int const x_78 = x_10.x_GLF_uniform_int_values.arr[1].el;
    int const x_81 = x_10.x_GLF_uniform_int_values.arr[0].el;
    *(tint_symbol_5) = float4(float(x_72), float(x_75), float(x_78), float(x_81));
  } else {
    int const x_85 = x_10.x_GLF_uniform_int_values.arr[1].el;
    float const x_86 = float(x_85);
    *(tint_symbol_5) = float4(x_86, x_86, x_86, x_86);
  }
  return;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_7 [[buffer(0)]], constant buf1& x_10 [[buffer(1)]]) {
  thread int tint_symbol_6 = 0;
  thread float4 tint_symbol_7 = 0.0f;
  main_1(x_7, x_10, &(tint_symbol_6), &(tint_symbol_7));
  main_out const tint_symbol_2 = {.x_GLF_color_1=tint_symbol_7};
  tint_symbol_1 const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_2.x_GLF_color_1};
  return tint_symbol_3;
}

