#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_float2 resolution;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

void main_1(constant buf0& x_7, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  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_5)).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 ((fmod(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 = (x_60 + 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_5)).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 ((fmod(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 = (x_101 + 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 = (x_135 + 1);
      x_135_phi = x_136;
    }
  }
  float3 const x_149 = c;
  float3 const x_151 = normalize(fabs(x_149));
  *(tint_symbol_6) = float4(x_151.x, x_151.y, x_151.z, 1.0f);
  return;
}

fragment tint_symbol_2 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;
  tint_symbol_7 = gl_FragCoord_param;
  main_1(x_7, &(tint_symbol_7), &(tint_symbol_8));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

