#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ float2 resolution;
};
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, thread float4* const tint_symbol_3, thread float4* const tint_symbol_4) {
  float3 c = 0.0f;
  float x_53 = 0.0f;
  float x_57 = 0.0f;
  float x_58 = 0.0f;
  float x_83 = 0.0f;
  float x_84 = 0.0f;
  float x_124 = 0.0f;
  float x_125 = 0.0f;
  float x_57_phi = 0.0f;
  int x_60_phi = 0;
  float x_83_phi = 0.0f;
  float x_84_phi = 0.0f;
  bool x_85_phi = false;
  float x_87_phi = 0.0f;
  float x_128_phi = 0.0f;
  int x_135_phi = 0;
  c = float3(7.0f, 8.0f, 9.0f);
  float const x_47 = x_7.resolution.x;
  float2 const x_48 = float2(1.0f, x_47);
  float const x_50 = rint((x_47 * 0.125f));
  float2 const x_51 = float2(0.0f, -0.5f);
  x_53 = (*(tint_symbol_3)).x;
  switch(0u) {
    default: {
      x_57_phi = -0.5f;
      x_60_phi = 1;
      while (true) {
        float x_70 = 0.0f;
        float x_78 = 0.0f;
        int x_61 = 0;
        float x_58_phi = 0.0f;
        x_57 = x_57_phi;
        int const x_60 = x_60_phi;
        x_83_phi = 0.0f;
        x_84_phi = x_57;
        x_85_phi = false;
        if ((x_60 < 800)) {
        } else {
          break;
        }
        float x_77 = 0.0f;
        float x_78_phi = 0.0f;
        if (((x_60 % 32) == 0)) {
          x_70 = (x_57 + 0.400000006f);
          x_58_phi = x_70;
        } else {
          x_78_phi = x_57;
          if (((float(x_60) - (rint(x_50) * floor((float(x_60) / rint(x_50))))) <= 0.01f)) {
            x_77 = (x_57 + 100.0f);
            x_78_phi = x_77;
          }
          x_78 = x_78_phi;
          x_58_phi = x_78;
        }
        x_58 = x_58_phi;
        if ((float(x_60) >= x_53)) {
          x_83_phi = x_58;
          x_84_phi = x_58;
          x_85_phi = true;
          break;
        }
        {
          x_61 = as_type<int>((as_type<uint>(x_60) + as_type<uint>(1)));
          x_57_phi = x_58;
          x_60_phi = x_61;
        }
      }
      x_83 = x_83_phi;
      x_84 = x_84_phi;
      bool const x_85 = x_85_phi;
      x_87_phi = x_83;
      if (x_85) {
        break;
      }
      x_87_phi = x_84;
      break;
    }
  }
  float x_92 = 0.0f;
  float x_98 = 0.0f;
  float x_99 = 0.0f;
  float x_98_phi = 0.0f;
  int x_101_phi = 0;
  float x_124_phi = 0.0f;
  float x_125_phi = 0.0f;
  bool x_126_phi = false;
  float const x_87 = x_87_phi;
  float4 const x_89 = float4(x_84, 0.400000006f, x_83, 0.400000006f);
  c.x = x_87;
  x_92 = (*(tint_symbol_3)).y;
  switch(0u) {
    default: {
      float4 const x_95 = float4(x_51, 0.0f, x_57);
      float const x_96 = float3(x_48, -0.5f).z;
      x_98_phi = x_96;
      x_101_phi = 1;
      while (true) {
        float x_111 = 0.0f;
        float x_119 = 0.0f;
        int x_102 = 0;
        float x_99_phi = 0.0f;
        x_98 = x_98_phi;
        int const x_101 = x_101_phi;
        x_124_phi = 0.0f;
        x_125_phi = x_98;
        x_126_phi = false;
        if ((x_101 < 800)) {
        } else {
          break;
        }
        float x_118 = 0.0f;
        float x_119_phi = 0.0f;
        if (((x_101 % 32) == 0)) {
          x_111 = (x_98 + 0.400000006f);
          x_99_phi = x_111;
        } else {
          x_119_phi = x_98;
          if (((float(x_101) - (rint(x_50) * floor((float(x_101) / rint(x_50))))) <= 0.01f)) {
            x_118 = (x_98 + 100.0f);
            x_119_phi = x_118;
          }
          x_119 = x_119_phi;
          x_99_phi = x_119;
        }
        x_99 = x_99_phi;
        if ((float(x_101) >= x_92)) {
          x_124_phi = x_99;
          x_125_phi = x_99;
          x_126_phi = true;
          break;
        }
        {
          x_102 = as_type<int>((as_type<uint>(x_101) + as_type<uint>(1)));
          x_98_phi = x_99;
          x_101_phi = x_102;
        }
      }
      x_124 = x_124_phi;
      x_125 = x_125_phi;
      bool const x_126 = x_126_phi;
      x_128_phi = x_124;
      if (x_126) {
        break;
      }
      x_128_phi = x_125;
      break;
    }
  }
  float const x_128 = x_128_phi;
  c.y = x_128;
  float const x_130 = c.x;
  float const x_131 = c.y;
  c.z = (x_130 + x_131);
  x_135_phi = 0;
  while (true) {
    int x_136 = 0;
    int const x_135 = x_135_phi;
    if ((x_135 < 3)) {
    } else {
      break;
    }
    int const x_141_save = x_135;
    float const x_142 = c[x_141_save];
    if ((x_142 >= 1.0f)) {
      float const x_146 = c[x_141_save];
      float const x_147 = c[x_141_save];
      c[x_141_save] = (x_146 * x_147);
    }
    {
      x_136 = as_type<int>((as_type<uint>(x_135) + as_type<uint>(1)));
      x_135_phi = x_136;
    }
  }
  float3 const x_149 = c;
  float3 const x_151 = normalize(fabs(x_149));
  *(tint_symbol_4) = float4(x_151.x, x_151.y, x_151.z, 1.0f);
  return;
}

main_out tint_symbol_inner(constant buf0& x_7, float4 gl_FragCoord_param, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  *(tint_symbol_5) = gl_FragCoord_param;
  main_1(x_7, 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]], constant buf0& x_7 [[buffer(0)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_7, 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;
}

