#include <metal_stdlib>

using namespace metal;
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

float nb_mod_f1_(thread float* const limit) {
  int x_injected_loop_counter = 0;
  int x_injected_loop_counter_1 = 0;
  float const x_37 = *(limit);
  if ((1.0f >= x_37)) {
    return 1.0f;
  }
  x_injected_loop_counter = 0;
  while (true) {
    bool const x_42 = (0 < 2);
    x_injected_loop_counter_1 = 0;
    while (true) {
      bool const x_47 = (0 < 1);
      return 1.0f;
    }
  }
  return 0.0f;
}

void main_1(thread float4* const tint_symbol_3, thread float4* const tint_symbol_4) {
  float param = 0.0f;
  float const x_34 = (*(tint_symbol_3)).x;
  param = x_34;
  float const x_35 = nb_mod_f1_(&(param));
  *(tint_symbol_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  return;
}

main_out tint_symbol_inner(float4 gl_FragCoord_param, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  *(tint_symbol_5) = gl_FragCoord_param;
  main_1(tint_symbol_5, tint_symbol_6);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_6)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol(float4 gl_FragCoord_param [[position]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  main_out const inner_result = tint_symbol_inner(gl_FragCoord_param, &(tint_symbol_7), &(tint_symbol_8));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

