#include <metal_stdlib>

using namespace metal;
struct BST {
  int data;
  int leftIndex;
  int rightIndex;
};
struct buf0 {
  /* 0x0000 */ packed_float2 injectionSwitch;
};
struct tint_array_wrapper {
  float arr[10];
};
struct Obj {
  tint_array_wrapper odd_numbers;
  tint_array_wrapper even_numbers;
};
struct tint_array_wrapper_1 {
  BST arr[10];
};
struct tint_array_wrapper_2 {
  float arr[50];
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 [[color(0)]];
};

void makeTreeNode_struct_BST_i1_i1_i11_i1_(thread BST* const tree, thread int* const data) {
  int const x_74 = *(data);
  (*(tree)).data = x_74;
  (*(tree)).leftIndex = -1;
  (*(tree)).rightIndex = -1;
  return;
}

void insert_i1_i1_(constant buf0& x_27, thread int* const treeIndex, thread int* const data_1, thread tint_array_wrapper_1* const tint_symbol_5) {
  int baseIndex = 0;
  BST param = {};
  int param_1 = 0;
  BST param_2 = {};
  int param_3 = 0;
  int GLF_live8i = 0;
  tint_array_wrapper_2 GLF_live8A = {};
  baseIndex = 0;
  while (true) {
    int const x_75 = baseIndex;
    int const x_76 = *(treeIndex);
    if ((x_75 <= x_76)) {
    } else {
      break;
    }
    int const x_77 = *(data_1);
    int const x_78 = baseIndex;
    int const x_79 = (*(tint_symbol_5)).arr[x_78].data;
    if ((x_77 <= x_79)) {
      int const x_80 = baseIndex;
      int const x_81 = (*(tint_symbol_5)).arr[x_80].leftIndex;
      if ((x_81 == -1)) {
        int const x_82 = baseIndex;
        int const x_83 = *(treeIndex);
        (*(tint_symbol_5)).arr[x_82].leftIndex = x_83;
        int const x_84 = *(treeIndex);
        BST const x_350 = (*(tint_symbol_5)).arr[x_84];
        param = x_350;
        int const x_85 = *(data_1);
        param_1 = x_85;
        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param), &(param_1));
        BST const x_352 = param;
        (*(tint_symbol_5)).arr[x_84] = x_352;
        return;
      } else {
        int const x_86 = baseIndex;
        int const x_87 = (*(tint_symbol_5)).arr[x_86].leftIndex;
        baseIndex = x_87;
        continue;
      }
    } else {
      int const x_88 = baseIndex;
      int const x_89 = (*(tint_symbol_5)).arr[x_88].rightIndex;
      if ((x_89 == -1)) {
        int const x_90 = baseIndex;
        int const x_91 = *(treeIndex);
        (*(tint_symbol_5)).arr[x_90].rightIndex = x_91;
        int const x_92 = *(treeIndex);
        BST const x_362 = (*(tint_symbol_5)).arr[x_92];
        param_2 = x_362;
        int const x_93 = *(data_1);
        param_3 = x_93;
        makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_2), &(param_3));
        BST const x_364 = param_2;
        (*(tint_symbol_5)).arr[x_92] = x_364;
        return;
      } else {
        GLF_live8i = 1;
        int const x_94 = GLF_live8i;
        int const x_95 = GLF_live8i;
        int const x_96 = GLF_live8i;
        int const x_369 = select(0, x_96, ((x_94 >= 0) & (x_95 < 50)));
        float const x_371 = GLF_live8A.arr[0];
        float const x_373 = GLF_live8A.arr[x_369];
        GLF_live8A.arr[x_369] = (x_373 + x_371);
        while (true) {
          int const x_97 = baseIndex;
          int const x_98 = (*(tint_symbol_5)).arr[x_97].rightIndex;
          baseIndex = x_98;
          {
            float const x_382 = x_27.injectionSwitch.x;
            float const x_384 = x_27.injectionSwitch.y;
            if ((x_382 > x_384)) {
            } else {
              break;
            }
          }
        }
        continue;
      }
    }
  }
  return;
}

int search_i1_(thread int* const target, thread tint_array_wrapper_1* const tint_symbol_6) {
  int index = 0;
  BST currentNode = {};
  int x_387 = 0;
  index = 0;
  while (true) {
    int const x_99 = index;
    if ((x_99 != -1)) {
    } else {
      break;
    }
    int const x_100 = index;
    BST const x_395 = (*(tint_symbol_6)).arr[x_100];
    currentNode = x_395;
    int const x_101 = currentNode.data;
    int const x_102 = *(target);
    if ((x_101 == x_102)) {
      int const x_103 = *(target);
      return x_103;
    }
    int const x_104 = *(target);
    int const x_105 = currentNode.data;
    if ((x_104 > x_105)) {
      int const x_106 = currentNode.rightIndex;
      x_387 = x_106;
    } else {
      int const x_107 = currentNode.leftIndex;
      x_387 = x_107;
    }
    int const x_108 = x_387;
    index = x_108;
  }
  return -1;
}

float makeFrame_f1_(thread float* const v, thread tint_array_wrapper_1* const tint_symbol_7) {
  int param_5 = 0;
  int param_6 = 0;
  int param_7 = 0;
  float const x_418 = *(v);
  *(v) = (x_418 * 6.5f);
  float const x_420 = *(v);
  if ((x_420 < 1.5f)) {
    param_5 = 100;
    int const x_110 = search_i1_(&(param_5), tint_symbol_7);
    return float(x_110);
  }
  float const x_425 = *(v);
  if ((x_425 < 4.0f)) {
    return 0.0f;
  }
  float const x_429 = *(v);
  param_6 = 6;
  int const x_111 = search_i1_(&(param_6), tint_symbol_7);
  if ((x_429 < float(x_111))) {
    return 1.0f;
  }
  param_7 = 30;
  int const x_112 = search_i1_(&(param_7), tint_symbol_7);
  return (10.0f + float(x_112));
}

float3 hueColor_f1_(thread float* const angle, thread tint_array_wrapper_1* const tint_symbol_8) {
  float nodeData = 0.0f;
  int param_4 = 0;
  param_4 = 15;
  int const x_109 = search_i1_(&(param_4), tint_symbol_8);
  nodeData = float(x_109);
  float const x_409 = *(angle);
  float const x_410 = nodeData;
  return ((float3(30.0f, 30.0f, 30.0f) + (float3(1.0f, 5.0f, x_410) * x_409)) / float3(50.0f, 50.0f, 50.0f));
}

void main_1(constant buf0& x_27, thread tint_array_wrapper_1* const tint_symbol_9, thread float4* const tint_symbol_10, thread float4* const tint_symbol_11) {
  int treeIndex_1 = 0;
  BST param_8 = {};
  int param_9 = 0;
  int param_10 = 0;
  int param_11 = 0;
  int GLF_live1_looplimiter2 = 0;
  int GLF_live1i = 0;
  int param_12 = 0;
  int param_13 = 0;
  int param_14 = 0;
  int param_15 = 0;
  int param_16 = 0;
  int param_17 = 0;
  int param_18 = 0;
  int param_19 = 0;
  int param_20 = 0;
  int param_21 = 0;
  int param_22 = 0;
  int param_23 = 0;
  int GLF_live4_looplimiter3 = 0;
  int GLF_live4i = 0;
  int GLF_live4index = 0;
  Obj GLF_live4obj = {};
  int param_24 = 0;
  int param_25 = 0;
  int param_26 = 0;
  int param_27 = 0;
  float2 z = 0.0f;
  float x_1 = 0.0f;
  float param_28 = 0.0f;
  float y_1 = 0.0f;
  float param_29 = 0.0f;
  int sum = 0;
  int target_1 = 0;
  int result = 0;
  int param_30 = 0;
  float a = 0.0f;
  float3 x_235 = 0.0f;
  float param_31 = 0.0f;
  treeIndex_1 = 0;
  BST const x_237 = (*(tint_symbol_9)).arr[0];
  param_8 = x_237;
  param_9 = 9;
  makeTreeNode_struct_BST_i1_i1_i11_i1_(&(param_8), &(param_9));
  BST const x_239 = param_8;
  (*(tint_symbol_9)).arr[0] = x_239;
  int const x_113 = treeIndex_1;
  treeIndex_1 = as_type<int>((as_type<uint>(x_113) + as_type<uint>(1)));
  int const x_115 = treeIndex_1;
  param_10 = x_115;
  param_11 = 5;
  insert_i1_i1_(x_27, &(param_10), &(param_11), tint_symbol_9);
  int const x_116 = treeIndex_1;
  treeIndex_1 = as_type<int>((as_type<uint>(x_116) + as_type<uint>(1)));
  GLF_live1_looplimiter2 = 0;
  GLF_live1i = 0;
  while (true) {
    if (true) {
    } else {
      break;
    }
    int const x_118 = GLF_live1_looplimiter2;
    if ((x_118 >= 7)) {
      break;
    }
    int const x_119 = GLF_live1_looplimiter2;
    GLF_live1_looplimiter2 = as_type<int>((as_type<uint>(x_119) + as_type<uint>(1)));
    {
      int const x_121 = GLF_live1i;
      GLF_live1i = as_type<int>((as_type<uint>(x_121) + as_type<uint>(1)));
    }
  }
  int const x_123 = treeIndex_1;
  param_12 = x_123;
  param_13 = 12;
  insert_i1_i1_(x_27, &(param_12), &(param_13), tint_symbol_9);
  int const x_124 = treeIndex_1;
  treeIndex_1 = as_type<int>((as_type<uint>(x_124) + as_type<uint>(1)));
  int const x_126 = treeIndex_1;
  param_14 = x_126;
  param_15 = 15;
  insert_i1_i1_(x_27, &(param_14), &(param_15), tint_symbol_9);
  int const x_127 = treeIndex_1;
  treeIndex_1 = as_type<int>((as_type<uint>(x_127) + as_type<uint>(1)));
  int const x_129 = treeIndex_1;
  param_16 = x_129;
  param_17 = 7;
  insert_i1_i1_(x_27, &(param_16), &(param_17), tint_symbol_9);
  int const x_130 = treeIndex_1;
  treeIndex_1 = as_type<int>((as_type<uint>(x_130) + as_type<uint>(1)));
  int const x_132 = treeIndex_1;
  param_18 = x_132;
  param_19 = 8;
  insert_i1_i1_(x_27, &(param_18), &(param_19), tint_symbol_9);
  int const x_133 = treeIndex_1;
  treeIndex_1 = as_type<int>((as_type<uint>(x_133) + as_type<uint>(1)));
  int const x_135 = treeIndex_1;
  param_20 = x_135;
  param_21 = 2;
  insert_i1_i1_(x_27, &(param_20), &(param_21), tint_symbol_9);
  int const x_136 = treeIndex_1;
  treeIndex_1 = as_type<int>((as_type<uint>(x_136) + as_type<uint>(1)));
  int const x_138 = treeIndex_1;
  param_22 = x_138;
  param_23 = 6;
  insert_i1_i1_(x_27, &(param_22), &(param_23), tint_symbol_9);
  int const x_139 = treeIndex_1;
  treeIndex_1 = as_type<int>((as_type<uint>(x_139) + as_type<uint>(1)));
  GLF_live4_looplimiter3 = 0;
  GLF_live4i = 0;
  while (true) {
    if (true) {
    } else {
      break;
    }
    int const x_141 = GLF_live4_looplimiter3;
    if ((x_141 >= 3)) {
      break;
    }
    int const x_142 = GLF_live4_looplimiter3;
    GLF_live4_looplimiter3 = as_type<int>((as_type<uint>(x_142) + as_type<uint>(1)));
    GLF_live4index = 1;
    int const x_144 = GLF_live4index;
    int const x_145 = GLF_live4index;
    int const x_146 = GLF_live4index;
    float const x_269 = GLF_live4obj.even_numbers.arr[1];
    GLF_live4obj.even_numbers.arr[select(0, x_146, ((x_144 >= 0) & (x_145 < 10)))] = x_269;
    int const x_147 = GLF_live4i;
    int const x_148 = GLF_live4i;
    int const x_149 = GLF_live4i;
    GLF_live4obj.even_numbers.arr[select(0, x_149, ((x_147 >= 0) & (x_148 < 10)))] = 1.0f;
    {
      int const x_150 = GLF_live4i;
      GLF_live4i = as_type<int>((as_type<uint>(x_150) + as_type<uint>(1)));
    }
  }
  int const x_152 = treeIndex_1;
  param_24 = x_152;
  param_25 = 17;
  insert_i1_i1_(x_27, &(param_24), &(param_25), tint_symbol_9);
  float const x_278 = x_27.injectionSwitch.x;
  float const x_280 = x_27.injectionSwitch.y;
  if ((x_278 > x_280)) {
    return;
  }
  int const x_153 = treeIndex_1;
  treeIndex_1 = as_type<int>((as_type<uint>(x_153) + as_type<uint>(1)));
  int const x_155 = treeIndex_1;
  param_26 = x_155;
  param_27 = 13;
  insert_i1_i1_(x_27, &(param_26), &(param_27), tint_symbol_9);
  float4 const x_285 = *(tint_symbol_10);
  z = (float2(x_285.y, x_285.x) / float2(256.0f, 256.0f));
  float const x_289 = z.x;
  param_28 = x_289;
  float const x_290 = makeFrame_f1_(&(param_28), tint_symbol_9);
  x_1 = x_290;
  float const x_292 = z.y;
  param_29 = x_292;
  float const x_293 = makeFrame_f1_(&(param_29), tint_symbol_9);
  y_1 = x_293;
  sum = -100;
  target_1 = 0;
  while (true) {
    int const x_156 = target_1;
    if ((x_156 < 20)) {
    } else {
      break;
    }
    int const x_157 = target_1;
    param_30 = x_157;
    int const x_158 = search_i1_(&(param_30), tint_symbol_9);
    result = x_158;
    int const x_159 = result;
    if ((x_159 > 0)) {
    } else {
      int const x_160 = result;
      switch(x_160) {
        case 0: {
          return;
          break;
        }
        case -1: {
          int const x_161 = sum;
          sum = as_type<int>((as_type<uint>(x_161) + as_type<uint>(1)));
          break;
        }
        default: {
          break;
        }
      }
    }
    {
      int const x_163 = target_1;
      target_1 = as_type<int>((as_type<uint>(x_163) + as_type<uint>(1)));
    }
  }
  float const x_307 = x_1;
  float const x_308 = y_1;
  int const x_165 = sum;
  a = (x_307 + (x_308 * float(x_165)));
  float const x_313 = x_27.injectionSwitch.x;
  float const x_315 = x_27.injectionSwitch.y;
  if ((x_313 < x_315)) {
    x_235 = float3(1.0f, 0.0f, 0.0f);
  } else {
    float const x_320 = a;
    param_31 = x_320;
    float3 const x_321 = hueColor_f1_(&(param_31), tint_symbol_9);
    x_235 = x_321;
  }
  float3 const x_322 = x_235;
  *(tint_symbol_11) = float4(x_322.x, x_322.y, x_322.z, 1.0f);
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_27 [[buffer(0)]]) {
  thread float4 tint_symbol_12 = 0.0f;
  thread tint_array_wrapper_1 tint_symbol_13 = {};
  thread float4 tint_symbol_14 = 0.0f;
  tint_symbol_12 = gl_FragCoord_param;
  main_1(x_27, &(tint_symbol_13), &(tint_symbol_12), &(tint_symbol_14));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_14};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

