#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ float2 injectionSwitch;
};
struct buf1 {
  /* 0x0000 */ float2 resolution;
};
struct tint_array_wrapper {
  int arr[10];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

void merge_i1_i1_i1_(thread int* const from, thread int* const mid, thread int* const to, thread tint_array_wrapper* const tint_symbol_3, thread tint_array_wrapper* const tint_symbol_4) {
  int k = 0;
  int i = 0;
  int j = 0;
  int i_1 = 0;
  int const x_255 = *(from);
  k = x_255;
  int const x_256 = *(from);
  i = x_256;
  int const x_257 = *(mid);
  j = as_type<int>((as_type<uint>(x_257) + as_type<uint>(1)));
  while (true) {
    int const x_263 = i;
    int const x_264 = *(mid);
    int const x_266 = j;
    int const x_267 = *(to);
    if (((x_263 <= x_264) & (x_266 <= x_267))) {
    } else {
      break;
    }
    int const x_271 = i;
    int const x_273 = (*(tint_symbol_3)).arr[x_271];
    int const x_274 = j;
    int const x_276 = (*(tint_symbol_3)).arr[x_274];
    if ((x_273 < x_276)) {
      int const x_281 = k;
      k = as_type<int>((as_type<uint>(x_281) + as_type<uint>(1)));
      int const x_283 = i;
      i = as_type<int>((as_type<uint>(x_283) + as_type<uint>(1)));
      int const x_286 = (*(tint_symbol_3)).arr[x_283];
      (*(tint_symbol_4)).arr[x_281] = x_286;
    } else {
      int const x_288 = k;
      k = as_type<int>((as_type<uint>(x_288) + as_type<uint>(1)));
      int const x_290 = j;
      j = as_type<int>((as_type<uint>(x_290) + as_type<uint>(1)));
      int const x_293 = (*(tint_symbol_3)).arr[x_290];
      (*(tint_symbol_4)).arr[x_288] = x_293;
    }
  }
  while (true) {
    int const x_299 = i;
    int const x_301 = i;
    int const x_302 = *(mid);
    if (((x_299 < 10) & (x_301 <= x_302))) {
    } else {
      break;
    }
    int const x_306 = k;
    k = as_type<int>((as_type<uint>(x_306) + as_type<uint>(1)));
    int const x_308 = i;
    i = as_type<int>((as_type<uint>(x_308) + as_type<uint>(1)));
    int const x_311 = (*(tint_symbol_3)).arr[x_308];
    (*(tint_symbol_4)).arr[x_306] = x_311;
  }
  int const x_313 = *(from);
  i_1 = x_313;
  while (true) {
    int const x_318 = i_1;
    int const x_319 = *(to);
    if ((x_318 <= x_319)) {
    } else {
      break;
    }
    int const x_322 = i_1;
    int const x_323 = i_1;
    int const x_325 = (*(tint_symbol_4)).arr[x_323];
    (*(tint_symbol_3)).arr[x_322] = x_325;
    {
      int const x_327 = i_1;
      i_1 = as_type<int>((as_type<uint>(x_327) + as_type<uint>(1)));
    }
  }
  return;
}

void mergeSort_(thread tint_array_wrapper* const tint_symbol_5, thread tint_array_wrapper* const tint_symbol_6) {
  int low = 0;
  int high = 0;
  int m = 0;
  int i_2 = 0;
  int from_1 = 0;
  int mid_1 = 0;
  int to_1 = 0;
  int param = 0;
  int param_1 = 0;
  int param_2 = 0;
  low = 0;
  high = 9;
  m = 1;
  while (true) {
    int const x_334 = m;
    int const x_335 = high;
    if ((x_334 <= x_335)) {
    } else {
      break;
    }
    int const x_338 = low;
    i_2 = x_338;
    while (true) {
      int const x_343 = i_2;
      int const x_344 = high;
      if ((x_343 < x_344)) {
      } else {
        break;
      }
      int const x_347 = i_2;
      from_1 = x_347;
      int const x_348 = i_2;
      int const x_349 = m;
      mid_1 = as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(x_348) + as_type<uint>(x_349)))) - as_type<uint>(1)));
      int const x_352 = i_2;
      int const x_353 = m;
      int const x_357 = high;
      to_1 = min(as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(x_352) + as_type<uint>(as_type<int>((as_type<uint>(2) * as_type<uint>(x_353))))))) - as_type<uint>(1))), x_357);
      int const x_359 = from_1;
      param = x_359;
      int const x_360 = mid_1;
      param_1 = x_360;
      int const x_361 = to_1;
      param_2 = x_361;
      merge_i1_i1_i1_(&(param), &(param_1), &(param_2), tint_symbol_5, tint_symbol_6);
      {
        int const x_363 = m;
        int const x_365 = i_2;
        i_2 = as_type<int>((as_type<uint>(x_365) + as_type<uint>(as_type<int>((as_type<uint>(2) * as_type<uint>(x_363))))));
      }
    }
    {
      int const x_367 = m;
      m = as_type<int>((as_type<uint>(2) * as_type<uint>(x_367)));
    }
  }
  return;
}

void main_1(constant buf0& x_28, thread tint_array_wrapper* const tint_symbol_7, thread tint_array_wrapper* const tint_symbol_8, thread float4* const tint_symbol_9, thread float4* const tint_symbol_10) {
  int i_3 = 0;
  int j_1 = 0;
  float grey = 0.0f;
  float const x_88 = x_28.injectionSwitch.x;
  i_3 = int(x_88);
  while (true) {
    int const x_94 = i_3;
    switch(x_94) {
      case 9: {
        int const x_124 = i_3;
        (*(tint_symbol_7)).arr[x_124] = -5;
        if (true) {
        } else {
          {
            int const x_128 = i_3;
            if ((x_128 < 10)) {
            } else {
              break;
            }
          }
          continue;
        }
        break;
      }
      case 8: {
        int const x_122 = i_3;
        (*(tint_symbol_7)).arr[x_122] = -4;
        break;
      }
      case 7: {
        int const x_120 = i_3;
        (*(tint_symbol_7)).arr[x_120] = -3;
        break;
      }
      case 6: {
        int const x_118 = i_3;
        (*(tint_symbol_7)).arr[x_118] = -2;
        break;
      }
      case 5: {
        int const x_116 = i_3;
        (*(tint_symbol_7)).arr[x_116] = -1;
        break;
      }
      case 4: {
        int const x_114 = i_3;
        (*(tint_symbol_7)).arr[x_114] = 0;
        break;
      }
      case 3: {
        int const x_112 = i_3;
        (*(tint_symbol_7)).arr[x_112] = 1;
        break;
      }
      case 2: {
        int const x_110 = i_3;
        (*(tint_symbol_7)).arr[x_110] = 2;
        break;
      }
      case 1: {
        int const x_108 = i_3;
        (*(tint_symbol_7)).arr[x_108] = 3;
        break;
      }
      case 0: {
        int const x_106 = i_3;
        (*(tint_symbol_7)).arr[x_106] = 4;
        break;
      }
      default: {
        break;
      }
    }
    int const x_126 = i_3;
    i_3 = as_type<int>((as_type<uint>(x_126) + as_type<uint>(1)));
    {
      int const x_128 = i_3;
      if ((x_128 < 10)) {
      } else {
        break;
      }
    }
  }
  j_1 = 0;
  while (true) {
    int const x_134 = j_1;
    if ((x_134 < 10)) {
    } else {
      break;
    }
    int const x_137 = j_1;
    int const x_138 = j_1;
    int const x_140 = (*(tint_symbol_7)).arr[x_138];
    (*(tint_symbol_8)).arr[x_137] = x_140;
    {
      int const x_142 = j_1;
      j_1 = as_type<int>((as_type<uint>(x_142) + as_type<uint>(1)));
    }
  }
  mergeSort_(tint_symbol_7, tint_symbol_8);
  float const x_146 = (*(tint_symbol_9)).y;
  if ((int(x_146) < 30)) {
    int const x_153 = (*(tint_symbol_7)).arr[0];
    grey = (0.5f + (float(x_153) / 10.0f));
  } else {
    float const x_158 = (*(tint_symbol_9)).y;
    if ((int(x_158) < 60)) {
      int const x_165 = (*(tint_symbol_7)).arr[1];
      grey = (0.5f + (float(x_165) / 10.0f));
    } else {
      float const x_170 = (*(tint_symbol_9)).y;
      if ((int(x_170) < 90)) {
        int const x_177 = (*(tint_symbol_7)).arr[2];
        grey = (0.5f + (float(x_177) / 10.0f));
      } else {
        float const x_182 = (*(tint_symbol_9)).y;
        if ((int(x_182) < 120)) {
          int const x_189 = (*(tint_symbol_7)).arr[3];
          grey = (0.5f + (float(x_189) / 10.0f));
        } else {
          float const x_194 = (*(tint_symbol_9)).y;
          if ((int(x_194) < 150)) {
            discard_fragment();
          } else {
            float const x_201 = (*(tint_symbol_9)).y;
            if ((int(x_201) < 180)) {
              int const x_208 = (*(tint_symbol_7)).arr[5];
              grey = (0.5f + (float(x_208) / 10.0f));
            } else {
              float const x_213 = (*(tint_symbol_9)).y;
              if ((int(x_213) < 210)) {
                int const x_220 = (*(tint_symbol_7)).arr[6];
                grey = (0.5f + (float(x_220) / 10.0f));
              } else {
                float const x_225 = (*(tint_symbol_9)).y;
                if ((int(x_225) < 240)) {
                  int const x_232 = (*(tint_symbol_7)).arr[7];
                  grey = (0.5f + (float(x_232) / 10.0f));
                } else {
                  float const x_237 = (*(tint_symbol_9)).y;
                  if ((int(x_237) < 270)) {
                    int const x_244 = (*(tint_symbol_7)).arr[8];
                    grey = (0.5f + (float(x_244) / 10.0f));
                  } else {
                    discard_fragment();
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  float const x_248 = grey;
  float3 const x_249 = float3(x_248, x_248, x_248);
  *(tint_symbol_10) = float4(x_249.x, x_249.y, x_249.z, 1.0f);
  return;
}

main_out tint_symbol_inner(constant buf0& x_28, float4 gl_FragCoord_param, thread float4* const tint_symbol_11, thread tint_array_wrapper* const tint_symbol_12, thread tint_array_wrapper* const tint_symbol_13, thread float4* const tint_symbol_14) {
  *(tint_symbol_11) = gl_FragCoord_param;
  main_1(x_28, tint_symbol_12, tint_symbol_13, tint_symbol_11, tint_symbol_14);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_14)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_28 [[buffer(0)]]) {
  thread float4 tint_symbol_15 = 0.0f;
  thread tint_array_wrapper tint_symbol_16 = {};
  thread tint_array_wrapper tint_symbol_17 = {};
  thread float4 tint_symbol_18 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_28, gl_FragCoord_param, &(tint_symbol_15), &(tint_symbol_16), &(tint_symbol_17), &(tint_symbol_18));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

