#include <metal_stdlib>

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

int collatz_i1_(thread int* const v) {
  int count = 0;
  count = 0;
  while (true) {
    int const x_89 = *(v);
    if ((x_89 > 1)) {
    } else {
      break;
    }
    int const x_92 = *(v);
    if (((x_92 & 1) == 1)) {
      int const x_98 = *(v);
      *(v) = as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(3) * as_type<uint>(x_98)))) + as_type<uint>(1)));
    } else {
      int const x_101 = *(v);
      *(v) = (x_101 / 2);
    }
    int const x_103 = count;
    count = as_type<int>((as_type<uint>(x_103) + as_type<uint>(1)));
  }
  int const x_105 = count;
  return x_105;
}

void main_1(constant buf0& x_10, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
  float2 lin = 0.0f;
  int v_1 = 0;
  int param = 0;
  tint_array_wrapper indexable = {};
  float4 const x_63 = *(tint_symbol_6);
  float2 const x_66 = x_10.resolution;
  lin = (float2(x_63.x, x_63.y) / x_66);
  float2 const x_68 = lin;
  lin = floor((x_68 * 8.0f));
  float const x_72 = lin.x;
  float const x_76 = lin.y;
  v_1 = as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(int(x_72)) * as_type<uint>(8)))) + as_type<uint>(int(x_76))));
  int const x_79 = v_1;
  param = x_79;
  int const x_80 = collatz_i1_(&(param));
  tint_array_wrapper const tint_symbol_4 = {.arr={float4(0.0f, 0.0f, 0.0f, 1.0f), float4(0.5f, 0.0f, 0.0f, 1.0f), float4(0.0f, 0.5f, 0.0f, 1.0f), float4(0.5f, 0.5f, 0.0f, 1.0f), float4(0.0f, 0.0f, 0.5f, 1.0f), float4(0.5f, 0.0f, 0.5f, 1.0f), float4(0.0f, 0.5f, 0.5f, 1.0f), float4(0.5f, 0.5f, 0.5f, 1.0f), float4(0.0f, 0.0f, 0.0f, 1.0f), float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(1.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 0.0f, 1.0f, 1.0f), float4(0.0f, 1.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
  indexable = tint_symbol_4;
  float4 const x_83 = indexable.arr[(x_80 % 16)];
  *(tint_symbol_7) = x_83;
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_10 [[buffer(0)]]) {
  thread float4 tint_symbol_8 = 0.0f;
  thread float4 tint_symbol_9 = 0.0f;
  tint_symbol_8 = gl_FragCoord_param;
  main_1(x_10, &(tint_symbol_8), &(tint_symbol_9));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_9};
  tint_symbol_2 const tint_symbol_5 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_5;
}

