#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[2];
};
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[2];
};
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_5, constant buf1& x_8, thread float4* const tint_symbol_3) {
  float a = 0.0f;
  float const x_31 = x_5.x_GLF_uniform_float_values.arr[1].el;
  *(tint_symbol_3) = float4(x_31, x_31, x_31, x_31);
  float const x_34 = x_5.x_GLF_uniform_float_values.arr[0].el;
  a = x_34;
  while (true) {
    float const x_40 = x_5.x_GLF_uniform_float_values.arr[0].el;
    float const x_43 = x_5.x_GLF_uniform_float_values.arr[0].el;
    if (((x_40 / 0.200000003f) < x_43)) {
      return;
    }
    float const x_48 = x_5.x_GLF_uniform_float_values.arr[0].el;
    float const x_51 = x_5.x_GLF_uniform_float_values.arr[0].el;
    if (((x_48 / 0.200000003f) < x_51)) {
      return;
    }
    float const x_56 = x_5.x_GLF_uniform_float_values.arr[0].el;
    float const x_59 = x_5.x_GLF_uniform_float_values.arr[0].el;
    if (((x_56 / 0.200000003f) < x_59)) {
      return;
    }
    float const x_64 = x_5.x_GLF_uniform_float_values.arr[0].el;
    float const x_67 = x_5.x_GLF_uniform_float_values.arr[0].el;
    if (((x_64 / 0.200000003f) < x_67)) {
      return;
    } else {
      a = 0.0f;
    }
    {
      float const x_72 = a;
      if (!((x_72 == 0.0f))) {
      } else {
        break;
      }
    }
  }
  int const x_75 = x_8.x_GLF_uniform_int_values.arr[1].el;
  int const x_78 = x_8.x_GLF_uniform_int_values.arr[0].el;
  int const x_81 = x_8.x_GLF_uniform_int_values.arr[0].el;
  int const x_84 = x_8.x_GLF_uniform_int_values.arr[1].el;
  *(tint_symbol_3) = float4(float(x_75), float(x_78), float(x_81), float(x_84));
  return;
}

main_out tint_symbol_inner(constant buf0& x_5, constant buf1& x_8, thread float4* const tint_symbol_4) {
  main_1(x_5, x_8, tint_symbol_4);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_4)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol(constant buf0& x_5 [[buffer(0)]], constant buf1& x_8 [[buffer(1)]]) {
  thread float4 tint_symbol_5 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_5, x_8, &(tint_symbol_5));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

