#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ float2 resolution;
};
struct tint_array_wrapper {
  int arr[16];
};
struct tint_array_wrapper_1 {
  float4 arr[8];
};
struct tint_array_wrapper_2 {
  float4 arr[16];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

bool collision_vf2_vf4_(thread float2* const pos, thread float4* const quad) {
  float const x_114 = (*(pos)).x;
  float const x_116 = (*(quad)).x;
  if ((x_114 < x_116)) {
    return false;
  }
  float const x_121 = (*(pos)).y;
  float const x_123 = (*(quad)).y;
  if ((x_121 < x_123)) {
    return false;
  }
  float const x_128 = (*(pos)).x;
  float const x_130 = (*(quad)).x;
  float const x_132 = (*(quad)).z;
  if ((x_128 > (x_130 + x_132))) {
    return false;
  }
  float const x_138 = (*(pos)).y;
  float const x_140 = (*(quad)).y;
  float const x_142 = (*(quad)).w;
  if ((x_138 > (x_140 + x_142))) {
    return false;
  }
  return true;
}

float4 match_vf2_(thread float2* const pos_1) {
  float4 res = 0.0f;
  int i = 0;
  float2 param = 0.0f;
  float4 param_1 = 0.0f;
  tint_array_wrapper_1 indexable = {};
  tint_array_wrapper_1 indexable_1 = {};
  tint_array_wrapper_1 indexable_2 = {};
  tint_array_wrapper_2 indexable_3 = {};
  res = float4(0.5f, 0.5f, 1.0f, 1.0f);
  i = 0;
  while (true) {
    int const x_152 = i;
    if ((x_152 < 8)) {
    } else {
      break;
    }
    int const x_155 = i;
    float2 const x_156 = *(pos_1);
    param = x_156;
    tint_array_wrapper_1 const tint_symbol_2 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
    indexable = tint_symbol_2;
    float4 const x_158 = indexable.arr[x_155];
    param_1 = x_158;
    bool const x_159 = collision_vf2_vf4_(&(param), &(param_1));
    if (x_159) {
      int const x_162 = i;
      tint_array_wrapper_1 const tint_symbol_3 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
      indexable_1 = tint_symbol_3;
      float const x_164 = indexable_1.arr[x_162].x;
      int const x_166 = i;
      tint_array_wrapper_1 const tint_symbol_4 = {.arr={float4(4.0f, 4.0f, 20.0f, 4.0f), float4(4.0f, 4.0f, 4.0f, 20.0f), float4(4.0f, 20.0f, 20.0f, 4.0f), float4(20.0f, 4.0f, 4.0f, 8.0f), float4(8.0f, 6.0f, 4.0f, 2.0f), float4(2.0f, 12.0f, 2.0f, 4.0f), float4(16.0f, 2.0f, 4.0f, 4.0f), float4(12.0f, 22.0f, 4.0f, 4.0f)}};
      indexable_2 = tint_symbol_4;
      float const x_168 = indexable_2.arr[x_166].y;
      int const x_171 = i;
      tint_array_wrapper_2 const tint_symbol_5 = {.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_3 = tint_symbol_5;
      float4 const x_177 = indexable_3.arr[(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(int(x_164)) * as_type<uint>(int(x_168))))) + as_type<uint>(as_type<int>((as_type<uint>(x_171) * as_type<uint>(9))))))) + as_type<uint>(11))) % 16)];
      res = x_177;
    }
    {
      int const x_178 = i;
      i = as_type<int>((as_type<uint>(x_178) + as_type<uint>(1)));
    }
  }
  float4 const x_180 = res;
  return x_180;
}

void main_1(constant buf0& x_20, thread float4* const tint_symbol_7, thread float4* const tint_symbol_8) {
  float2 lin = 0.0f;
  float2 param_2 = 0.0f;
  float4 const x_102 = *(tint_symbol_7);
  float2 const x_105 = x_20.resolution;
  lin = (float2(x_102.x, x_102.y) / x_105);
  float2 const x_107 = lin;
  lin = floor((x_107 * 32.0f));
  float2 const x_110 = lin;
  param_2 = x_110;
  float4 const x_111 = match_vf2_(&(param_2));
  *(tint_symbol_8) = x_111;
  return;
}

main_out tint_symbol_inner(constant buf0& x_20, float4 gl_FragCoord_param, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
  *(tint_symbol_9) = gl_FragCoord_param;
  main_1(x_20, tint_symbol_9, tint_symbol_10);
  main_out const tint_symbol_6 = {.x_GLF_color_1=*(tint_symbol_10)};
  return tint_symbol_6;
}

fragment tint_symbol_1 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_20 [[buffer(0)]]) {
  thread float4 tint_symbol_11 = 0.0f;
  thread float4 tint_symbol_12 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_20, gl_FragCoord_param, &(tint_symbol_11), &(tint_symbol_12));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

