#include <metal_stdlib>

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

void main_1(constant buf0& x_8, thread float4* const tint_symbol_22, thread float4* const tint_symbol_23) {
  tint_array_wrapper tree = {};
  bool x_67 = false;
  bool x_114 = false;
  int x_572 = 0;
  bool x_67_phi = false;
  int x_70_phi = 0;
  bool x_116_phi = false;
  int x_119_phi = 0;
  int x_569_phi = 0;
  int x_572_phi = 0;
  int x_574_phi = 0;
  BST const tint_symbol_2 = {.data=9, .leftIndex=-1, .rightIndex=-1};
  tree.arr[0] = tint_symbol_2;
  switch(0u) {
    default: {
      x_67_phi = false;
      x_70_phi = 0;
      while (true) {
        int x_95 = 0;
        int x_87 = 0;
        bool x_68 = false;
        int x_71 = 0;
        bool x_68_phi = false;
        int x_71_phi = 0;
        x_67 = x_67_phi;
        int const x_70 = x_70_phi;
        x_116_phi = x_67;
        if ((x_70 <= 1)) {
        } else {
          break;
        }
        int const x_76 = tree.arr[x_70].data;
        if ((5 <= x_76)) {
          bool x_114_phi = false;
          int const x_89_save = x_70;
          int const x_90 = tree.arr[x_89_save].leftIndex;
          if ((x_90 == -1)) {
            float const x_97 = x_8.injectionSwitch.y;
            float const x_99 = x_8.injectionSwitch.x;
            if ((x_97 < x_99)) {
              while (true) {
                discard_fragment();
              }
              return;
            }
            tree.arr[x_89_save].leftIndex = 1;
            BST const tint_symbol_3 = {.data=5, .leftIndex=-1, .rightIndex=-1};
            tree.arr[1] = tint_symbol_3;
            while (true) {
              x_114_phi = x_67;
              if ((0 < int(x_97))) {
              } else {
                break;
              }
              x_114_phi = true;
              break;
            }
            x_114 = x_114_phi;
            x_116_phi = x_114;
            if (x_114) {
              break;
            }
          } else {
            x_95 = tree.arr[x_89_save].leftIndex;
            x_68_phi = x_67;
            x_71_phi = x_95;
            {
              x_68 = x_68_phi;
              x_71 = x_71_phi;
              x_67_phi = x_68;
              x_70_phi = x_71;
            }
            continue;
          }
        } else {
          int const x_81_save = x_70;
          int const x_82 = tree.arr[x_81_save].rightIndex;
          if ((x_82 == -1)) {
            tree.arr[x_81_save].rightIndex = 1;
            BST const tint_symbol_4 = {.data=5, .leftIndex=-1, .rightIndex=-1};
            tree.arr[1] = tint_symbol_4;
            x_116_phi = true;
            break;
          } else {
            x_87 = tree.arr[x_81_save].rightIndex;
            x_68_phi = x_67;
            x_71_phi = x_87;
            {
              x_68 = x_68_phi;
              x_71 = x_71_phi;
              x_67_phi = x_68;
              x_70_phi = x_71;
            }
            continue;
          }
          return;
        }
        x_68_phi = x_114;
        x_71_phi = x_70;
        {
          x_68 = x_68_phi;
          x_71 = x_71_phi;
          x_67_phi = x_68;
          x_70_phi = x_71;
        }
      }
      bool const x_116 = x_116_phi;
      if (x_116) {
        break;
      }
      break;
    }
  }
  x_119_phi = 0;
  while (true) {
    bool x_133 = false;
    int x_120 = 0;
    bool x_134_phi = false;
    int const x_119 = x_119_phi;
    float const x_125 = (*(tint_symbol_22)).y;
    bool const x_126 = (x_125 < 0.0f);
    x_134_phi = x_126;
    if (!(x_126)) {
      float const x_131 = x_8.injectionSwitch.y;
      x_133 = (x_119 != int(x_131));
      x_134_phi = x_133;
    }
    bool const x_134 = x_134_phi;
    if (x_134) {
    } else {
      break;
    }
    bool x_139 = false;
    bool x_186 = false;
    bool x_139_phi = false;
    int x_142_phi = 0;
    bool x_188_phi = false;
    switch(0u) {
      default: {
        x_139_phi = false;
        x_142_phi = 0;
        while (true) {
          int x_167 = 0;
          int x_159 = 0;
          bool x_140 = false;
          int x_143 = 0;
          bool x_140_phi = false;
          int x_143_phi = 0;
          x_139 = x_139_phi;
          int const x_142 = x_142_phi;
          x_188_phi = x_139;
          if ((x_142 <= 2)) {
          } else {
            break;
          }
          int const x_148 = tree.arr[x_142].data;
          if ((12 <= x_148)) {
            bool x_186_phi = false;
            int const x_161_save = x_142;
            int const x_162 = tree.arr[x_161_save].leftIndex;
            if ((x_162 == -1)) {
              float const x_169 = x_8.injectionSwitch.y;
              float const x_171 = x_8.injectionSwitch.x;
              if ((x_169 < x_171)) {
                while (true) {
                  discard_fragment();
                }
                return;
              }
              tree.arr[x_161_save].leftIndex = 2;
              BST const tint_symbol_5 = {.data=12, .leftIndex=-1, .rightIndex=-1};
              tree.arr[2] = tint_symbol_5;
              while (true) {
                x_186_phi = x_139;
                if ((0 < int(x_169))) {
                } else {
                  break;
                }
                x_186_phi = true;
                break;
              }
              x_186 = x_186_phi;
              x_188_phi = x_186;
              if (x_186) {
                break;
              }
            } else {
              x_167 = tree.arr[x_161_save].leftIndex;
              x_140_phi = x_139;
              x_143_phi = x_167;
              {
                x_140 = x_140_phi;
                x_143 = x_143_phi;
                x_139_phi = x_140;
                x_142_phi = x_143;
              }
              continue;
            }
          } else {
            int const x_153_save = x_142;
            int const x_154 = tree.arr[x_153_save].rightIndex;
            if ((x_154 == -1)) {
              tree.arr[x_153_save].rightIndex = 2;
              BST const tint_symbol_6 = {.data=12, .leftIndex=-1, .rightIndex=-1};
              tree.arr[2] = tint_symbol_6;
              x_188_phi = true;
              break;
            } else {
              x_159 = tree.arr[x_153_save].rightIndex;
              x_140_phi = x_139;
              x_143_phi = x_159;
              {
                x_140 = x_140_phi;
                x_143 = x_143_phi;
                x_139_phi = x_140;
                x_142_phi = x_143;
              }
              continue;
            }
            return;
          }
          x_140_phi = x_186;
          x_143_phi = x_142;
          {
            x_140 = x_140_phi;
            x_143 = x_143_phi;
            x_139_phi = x_140;
            x_142_phi = x_143;
          }
        }
        bool const x_188 = x_188_phi;
        if (x_188) {
          break;
        }
        break;
      }
    }
    {
      x_120 = as_type<int>((as_type<uint>(x_119) + as_type<uint>(1)));
      x_119_phi = x_120;
    }
  }
  bool x_193 = false;
  bool x_240 = false;
  bool x_193_phi = false;
  int x_196_phi = 0;
  bool x_242_phi = false;
  switch(0u) {
    default: {
      x_193_phi = false;
      x_196_phi = 0;
      while (true) {
        int x_221 = 0;
        int x_213 = 0;
        bool x_194 = false;
        int x_197 = 0;
        bool x_194_phi = false;
        int x_197_phi = 0;
        x_193 = x_193_phi;
        int const x_196 = x_196_phi;
        x_242_phi = x_193;
        if ((x_196 <= 3)) {
        } else {
          break;
        }
        int const x_202 = tree.arr[x_196].data;
        if ((15 <= x_202)) {
          bool x_240_phi = false;
          int const x_215_save = x_196;
          int const x_216 = tree.arr[x_215_save].leftIndex;
          if ((x_216 == -1)) {
            float const x_223 = x_8.injectionSwitch.y;
            float const x_225 = x_8.injectionSwitch.x;
            if ((x_223 < x_225)) {
              while (true) {
                discard_fragment();
              }
              return;
            }
            tree.arr[x_215_save].leftIndex = 3;
            BST const tint_symbol_7 = {.data=15, .leftIndex=-1, .rightIndex=-1};
            tree.arr[3] = tint_symbol_7;
            while (true) {
              x_240_phi = x_193;
              if ((0 < int(x_223))) {
              } else {
                break;
              }
              x_240_phi = true;
              break;
            }
            x_240 = x_240_phi;
            x_242_phi = x_240;
            if (x_240) {
              break;
            }
          } else {
            x_221 = tree.arr[x_215_save].leftIndex;
            x_194_phi = x_193;
            x_197_phi = x_221;
            {
              x_194 = x_194_phi;
              x_197 = x_197_phi;
              x_193_phi = x_194;
              x_196_phi = x_197;
            }
            continue;
          }
        } else {
          int const x_207_save = x_196;
          int const x_208 = tree.arr[x_207_save].rightIndex;
          if ((x_208 == -1)) {
            tree.arr[x_207_save].rightIndex = 3;
            BST const tint_symbol_8 = {.data=15, .leftIndex=-1, .rightIndex=-1};
            tree.arr[3] = tint_symbol_8;
            x_242_phi = true;
            break;
          } else {
            x_213 = tree.arr[x_207_save].rightIndex;
            x_194_phi = x_193;
            x_197_phi = x_213;
            {
              x_194 = x_194_phi;
              x_197 = x_197_phi;
              x_193_phi = x_194;
              x_196_phi = x_197;
            }
            continue;
          }
          return;
        }
        x_194_phi = x_240;
        x_197_phi = x_196;
        {
          x_194 = x_194_phi;
          x_197 = x_197_phi;
          x_193_phi = x_194;
          x_196_phi = x_197;
        }
      }
      bool const x_242 = x_242_phi;
      if (x_242) {
        break;
      }
      break;
    }
  }
  bool x_247 = false;
  bool x_294 = false;
  bool x_247_phi = false;
  int x_250_phi = 0;
  bool x_296_phi = false;
  switch(0u) {
    default: {
      x_247_phi = false;
      x_250_phi = 0;
      while (true) {
        int x_275 = 0;
        int x_267 = 0;
        bool x_248 = false;
        int x_251 = 0;
        bool x_248_phi = false;
        int x_251_phi = 0;
        x_247 = x_247_phi;
        int const x_250 = x_250_phi;
        x_296_phi = x_247;
        if ((x_250 <= 4)) {
        } else {
          break;
        }
        int const x_256 = tree.arr[x_250].data;
        if ((7 <= x_256)) {
          bool x_294_phi = false;
          int const x_269_save = x_250;
          int const x_270 = tree.arr[x_269_save].leftIndex;
          if ((x_270 == -1)) {
            float const x_277 = x_8.injectionSwitch.y;
            float const x_279 = x_8.injectionSwitch.x;
            if ((x_277 < x_279)) {
              while (true) {
                discard_fragment();
              }
              return;
            }
            tree.arr[x_269_save].leftIndex = 4;
            BST const tint_symbol_9 = {.data=7, .leftIndex=-1, .rightIndex=-1};
            tree.arr[4] = tint_symbol_9;
            while (true) {
              x_294_phi = x_247;
              if ((0 < int(x_277))) {
              } else {
                break;
              }
              x_294_phi = true;
              break;
            }
            x_294 = x_294_phi;
            x_296_phi = x_294;
            if (x_294) {
              break;
            }
          } else {
            x_275 = tree.arr[x_269_save].leftIndex;
            x_248_phi = x_247;
            x_251_phi = x_275;
            {
              x_248 = x_248_phi;
              x_251 = x_251_phi;
              x_247_phi = x_248;
              x_250_phi = x_251;
            }
            continue;
          }
        } else {
          int const x_261_save = x_250;
          int const x_262 = tree.arr[x_261_save].rightIndex;
          if ((x_262 == -1)) {
            tree.arr[x_261_save].rightIndex = 4;
            BST const tint_symbol_10 = {.data=7, .leftIndex=-1, .rightIndex=-1};
            tree.arr[4] = tint_symbol_10;
            x_296_phi = true;
            break;
          } else {
            x_267 = tree.arr[x_261_save].rightIndex;
            x_248_phi = x_247;
            x_251_phi = x_267;
            {
              x_248 = x_248_phi;
              x_251 = x_251_phi;
              x_247_phi = x_248;
              x_250_phi = x_251;
            }
            continue;
          }
          return;
        }
        x_248_phi = x_294;
        x_251_phi = x_250;
        {
          x_248 = x_248_phi;
          x_251 = x_251_phi;
          x_247_phi = x_248;
          x_250_phi = x_251;
        }
      }
      bool const x_296 = x_296_phi;
      if (x_296) {
        break;
      }
      break;
    }
  }
  bool x_301 = false;
  bool x_348 = false;
  bool x_301_phi = false;
  int x_304_phi = 0;
  bool x_350_phi = false;
  switch(0u) {
    default: {
      x_301_phi = false;
      x_304_phi = 0;
      while (true) {
        int x_329 = 0;
        int x_321 = 0;
        bool x_302 = false;
        int x_305 = 0;
        bool x_302_phi = false;
        int x_305_phi = 0;
        x_301 = x_301_phi;
        int const x_304 = x_304_phi;
        x_350_phi = x_301;
        if ((x_304 <= 5)) {
        } else {
          break;
        }
        int const x_310 = tree.arr[x_304].data;
        if ((8 <= x_310)) {
          bool x_348_phi = false;
          int const x_323_save = x_304;
          int const x_324 = tree.arr[x_323_save].leftIndex;
          if ((x_324 == -1)) {
            float const x_331 = x_8.injectionSwitch.y;
            float const x_333 = x_8.injectionSwitch.x;
            if ((x_331 < x_333)) {
              while (true) {
                discard_fragment();
              }
              return;
            }
            tree.arr[x_323_save].leftIndex = 5;
            BST const tint_symbol_11 = {.data=8, .leftIndex=-1, .rightIndex=-1};
            tree.arr[5] = tint_symbol_11;
            while (true) {
              x_348_phi = x_301;
              if ((0 < int(x_331))) {
              } else {
                break;
              }
              x_348_phi = true;
              break;
            }
            x_348 = x_348_phi;
            x_350_phi = x_348;
            if (x_348) {
              break;
            }
          } else {
            x_329 = tree.arr[x_323_save].leftIndex;
            x_302_phi = x_301;
            x_305_phi = x_329;
            {
              x_302 = x_302_phi;
              x_305 = x_305_phi;
              x_301_phi = x_302;
              x_304_phi = x_305;
            }
            continue;
          }
        } else {
          int const x_315_save = x_304;
          int const x_316 = tree.arr[x_315_save].rightIndex;
          if ((x_316 == -1)) {
            tree.arr[x_315_save].rightIndex = 5;
            BST const tint_symbol_12 = {.data=8, .leftIndex=-1, .rightIndex=-1};
            tree.arr[5] = tint_symbol_12;
            x_350_phi = true;
            break;
          } else {
            x_321 = tree.arr[x_315_save].rightIndex;
            x_302_phi = x_301;
            x_305_phi = x_321;
            {
              x_302 = x_302_phi;
              x_305 = x_305_phi;
              x_301_phi = x_302;
              x_304_phi = x_305;
            }
            continue;
          }
          return;
        }
        x_302_phi = x_348;
        x_305_phi = x_304;
        {
          x_302 = x_302_phi;
          x_305 = x_305_phi;
          x_301_phi = x_302;
          x_304_phi = x_305;
        }
      }
      bool const x_350 = x_350_phi;
      if (x_350) {
        break;
      }
      break;
    }
  }
  bool x_355 = false;
  bool x_402 = false;
  bool x_355_phi = false;
  int x_358_phi = 0;
  bool x_404_phi = false;
  switch(0u) {
    default: {
      x_355_phi = false;
      x_358_phi = 0;
      while (true) {
        int x_383 = 0;
        int x_375 = 0;
        bool x_356 = false;
        int x_359 = 0;
        bool x_356_phi = false;
        int x_359_phi = 0;
        x_355 = x_355_phi;
        int const x_358 = x_358_phi;
        x_404_phi = x_355;
        if ((x_358 <= 6)) {
        } else {
          break;
        }
        int const x_364 = tree.arr[x_358].data;
        if ((2 <= x_364)) {
          bool x_402_phi = false;
          int const x_377_save = x_358;
          int const x_378 = tree.arr[x_377_save].leftIndex;
          if ((x_378 == -1)) {
            float const x_385 = x_8.injectionSwitch.y;
            float const x_387 = x_8.injectionSwitch.x;
            if ((x_385 < x_387)) {
              while (true) {
                discard_fragment();
              }
              return;
            }
            tree.arr[x_377_save].leftIndex = 6;
            BST const tint_symbol_13 = {.data=2, .leftIndex=-1, .rightIndex=-1};
            tree.arr[6] = tint_symbol_13;
            while (true) {
              x_402_phi = x_355;
              if ((0 < int(x_385))) {
              } else {
                break;
              }
              x_402_phi = true;
              break;
            }
            x_402 = x_402_phi;
            x_404_phi = x_402;
            if (x_402) {
              break;
            }
          } else {
            x_383 = tree.arr[x_377_save].leftIndex;
            x_356_phi = x_355;
            x_359_phi = x_383;
            {
              x_356 = x_356_phi;
              x_359 = x_359_phi;
              x_355_phi = x_356;
              x_358_phi = x_359;
            }
            continue;
          }
        } else {
          int const x_369_save = x_358;
          int const x_370 = tree.arr[x_369_save].rightIndex;
          if ((x_370 == -1)) {
            tree.arr[x_369_save].rightIndex = 6;
            BST const tint_symbol_14 = {.data=2, .leftIndex=-1, .rightIndex=-1};
            tree.arr[6] = tint_symbol_14;
            x_404_phi = true;
            break;
          } else {
            x_375 = tree.arr[x_369_save].rightIndex;
            x_356_phi = x_355;
            x_359_phi = x_375;
            {
              x_356 = x_356_phi;
              x_359 = x_359_phi;
              x_355_phi = x_356;
              x_358_phi = x_359;
            }
            continue;
          }
          return;
        }
        x_356_phi = x_402;
        x_359_phi = x_358;
        {
          x_356 = x_356_phi;
          x_359 = x_359_phi;
          x_355_phi = x_356;
          x_358_phi = x_359;
        }
      }
      bool const x_404 = x_404_phi;
      if (x_404) {
        break;
      }
      break;
    }
  }
  bool x_409 = false;
  bool x_456 = false;
  bool x_409_phi = false;
  int x_412_phi = 0;
  bool x_458_phi = false;
  switch(0u) {
    default: {
      x_409_phi = false;
      x_412_phi = 0;
      while (true) {
        int x_437 = 0;
        int x_429 = 0;
        bool x_410 = false;
        int x_413 = 0;
        bool x_410_phi = false;
        int x_413_phi = 0;
        x_409 = x_409_phi;
        int const x_412 = x_412_phi;
        x_458_phi = x_409;
        if ((x_412 <= 7)) {
        } else {
          break;
        }
        int const x_418 = tree.arr[x_412].data;
        if ((6 <= x_418)) {
          bool x_456_phi = false;
          int const x_431_save = x_412;
          int const x_432 = tree.arr[x_431_save].leftIndex;
          if ((x_432 == -1)) {
            float const x_439 = x_8.injectionSwitch.y;
            float const x_441 = x_8.injectionSwitch.x;
            if ((x_439 < x_441)) {
              while (true) {
                discard_fragment();
              }
              return;
            }
            tree.arr[x_431_save].leftIndex = 7;
            BST const tint_symbol_15 = {.data=6, .leftIndex=-1, .rightIndex=-1};
            tree.arr[7] = tint_symbol_15;
            while (true) {
              x_456_phi = x_409;
              if ((0 < int(x_439))) {
              } else {
                break;
              }
              x_456_phi = true;
              break;
            }
            x_456 = x_456_phi;
            x_458_phi = x_456;
            if (x_456) {
              break;
            }
          } else {
            x_437 = tree.arr[x_431_save].leftIndex;
            x_410_phi = x_409;
            x_413_phi = x_437;
            {
              x_410 = x_410_phi;
              x_413 = x_413_phi;
              x_409_phi = x_410;
              x_412_phi = x_413;
            }
            continue;
          }
        } else {
          int const x_423_save = x_412;
          int const x_424 = tree.arr[x_423_save].rightIndex;
          if ((x_424 == -1)) {
            tree.arr[x_423_save].rightIndex = 7;
            BST const tint_symbol_16 = {.data=6, .leftIndex=-1, .rightIndex=-1};
            tree.arr[7] = tint_symbol_16;
            x_458_phi = true;
            break;
          } else {
            x_429 = tree.arr[x_423_save].rightIndex;
            x_410_phi = x_409;
            x_413_phi = x_429;
            {
              x_410 = x_410_phi;
              x_413 = x_413_phi;
              x_409_phi = x_410;
              x_412_phi = x_413;
            }
            continue;
          }
          return;
        }
        x_410_phi = x_456;
        x_413_phi = x_412;
        {
          x_410 = x_410_phi;
          x_413 = x_413_phi;
          x_409_phi = x_410;
          x_412_phi = x_413;
        }
      }
      bool const x_458 = x_458_phi;
      if (x_458) {
        break;
      }
      break;
    }
  }
  bool x_463 = false;
  bool x_510 = false;
  bool x_463_phi = false;
  int x_466_phi = 0;
  bool x_512_phi = false;
  switch(0u) {
    default: {
      x_463_phi = false;
      x_466_phi = 0;
      while (true) {
        int x_491 = 0;
        int x_483 = 0;
        bool x_464 = false;
        int x_467 = 0;
        bool x_464_phi = false;
        int x_467_phi = 0;
        x_463 = x_463_phi;
        int const x_466 = x_466_phi;
        x_512_phi = x_463;
        if ((x_466 <= 8)) {
        } else {
          break;
        }
        int const x_472 = tree.arr[x_466].data;
        if ((17 <= x_472)) {
          bool x_510_phi = false;
          int const x_485_save = x_466;
          int const x_486 = tree.arr[x_485_save].leftIndex;
          if ((x_486 == -1)) {
            float const x_493 = x_8.injectionSwitch.y;
            float const x_495 = x_8.injectionSwitch.x;
            if ((x_493 < x_495)) {
              while (true) {
                discard_fragment();
              }
              return;
            }
            tree.arr[x_485_save].leftIndex = 8;
            BST const tint_symbol_17 = {.data=17, .leftIndex=-1, .rightIndex=-1};
            tree.arr[8] = tint_symbol_17;
            while (true) {
              x_510_phi = x_463;
              if ((0 < int(x_493))) {
              } else {
                break;
              }
              x_510_phi = true;
              break;
            }
            x_510 = x_510_phi;
            x_512_phi = x_510;
            if (x_510) {
              break;
            }
          } else {
            x_491 = tree.arr[x_485_save].leftIndex;
            x_464_phi = x_463;
            x_467_phi = x_491;
            {
              x_464 = x_464_phi;
              x_467 = x_467_phi;
              x_463_phi = x_464;
              x_466_phi = x_467;
            }
            continue;
          }
        } else {
          int const x_477_save = x_466;
          int const x_478 = tree.arr[x_477_save].rightIndex;
          if ((x_478 == -1)) {
            tree.arr[x_477_save].rightIndex = 8;
            BST const tint_symbol_18 = {.data=17, .leftIndex=-1, .rightIndex=-1};
            tree.arr[8] = tint_symbol_18;
            x_512_phi = true;
            break;
          } else {
            x_483 = tree.arr[x_477_save].rightIndex;
            x_464_phi = x_463;
            x_467_phi = x_483;
            {
              x_464 = x_464_phi;
              x_467 = x_467_phi;
              x_463_phi = x_464;
              x_466_phi = x_467;
            }
            continue;
          }
          return;
        }
        x_464_phi = x_510;
        x_467_phi = x_466;
        {
          x_464 = x_464_phi;
          x_467 = x_467_phi;
          x_463_phi = x_464;
          x_466_phi = x_467;
        }
      }
      bool const x_512 = x_512_phi;
      if (x_512) {
        break;
      }
      break;
    }
  }
  bool x_517 = false;
  bool x_564 = false;
  bool x_517_phi = false;
  int x_520_phi = 0;
  bool x_566_phi = false;
  switch(0u) {
    default: {
      x_517_phi = false;
      x_520_phi = 0;
      while (true) {
        int x_545 = 0;
        int x_537 = 0;
        bool x_518 = false;
        int x_521 = 0;
        bool x_518_phi = false;
        int x_521_phi = 0;
        x_517 = x_517_phi;
        int const x_520 = x_520_phi;
        x_566_phi = x_517;
        if ((x_520 <= 9)) {
        } else {
          break;
        }
        int const x_526 = tree.arr[x_520].data;
        if ((13 <= x_526)) {
          bool x_564_phi = false;
          int const x_539_save = x_520;
          int const x_540 = tree.arr[x_539_save].leftIndex;
          if ((x_540 == -1)) {
            float const x_547 = x_8.injectionSwitch.y;
            float const x_549 = x_8.injectionSwitch.x;
            if ((x_547 < x_549)) {
              while (true) {
                discard_fragment();
              }
              return;
            }
            tree.arr[x_539_save].leftIndex = 9;
            BST const tint_symbol_19 = {.data=13, .leftIndex=-1, .rightIndex=-1};
            tree.arr[9] = tint_symbol_19;
            while (true) {
              x_564_phi = x_517;
              if ((0 < int(x_547))) {
              } else {
                break;
              }
              x_564_phi = true;
              break;
            }
            x_564 = x_564_phi;
            x_566_phi = x_564;
            if (x_564) {
              break;
            }
          } else {
            x_545 = tree.arr[x_539_save].leftIndex;
            x_518_phi = x_517;
            x_521_phi = x_545;
            {
              x_518 = x_518_phi;
              x_521 = x_521_phi;
              x_517_phi = x_518;
              x_520_phi = x_521;
            }
            continue;
          }
        } else {
          int const x_531_save = x_520;
          int const x_532 = tree.arr[x_531_save].rightIndex;
          if ((x_532 == -1)) {
            tree.arr[x_531_save].rightIndex = 9;
            BST const tint_symbol_20 = {.data=13, .leftIndex=-1, .rightIndex=-1};
            tree.arr[9] = tint_symbol_20;
            x_566_phi = true;
            break;
          } else {
            x_537 = tree.arr[x_531_save].rightIndex;
            x_518_phi = x_517;
            x_521_phi = x_537;
            {
              x_518 = x_518_phi;
              x_521 = x_521_phi;
              x_517_phi = x_518;
              x_520_phi = x_521;
            }
            continue;
          }
          return;
        }
        x_518_phi = x_564;
        x_521_phi = x_520;
        {
          x_518 = x_518_phi;
          x_521 = x_521_phi;
          x_517_phi = x_518;
          x_520_phi = x_521;
        }
      }
      bool const x_566 = x_566_phi;
      if (x_566) {
        break;
      }
      break;
    }
  }
  x_569_phi = 0;
  x_572_phi = 0;
  x_574_phi = 0;
  while (true) {
    int x_597 = 0;
    int x_607 = 0;
    int x_612 = 0;
    int x_575 = 0;
    int x_570_phi = 0;
    int x_573_phi = 0;
    int const x_569 = x_569_phi;
    x_572 = x_572_phi;
    int const x_574 = x_574_phi;
    if ((x_574 < 20)) {
    } else {
      break;
    }
    int x_582_phi = 0;
    int x_597_phi = 0;
    bool x_598_phi = false;
    switch(0u) {
      default: {
        x_582_phi = 0;
        while (true) {
          int const x_582 = x_582_phi;
          x_597_phi = x_569;
          x_598_phi = false;
          if ((x_582 != -1)) {
          } else {
            break;
          }
          BST const x_589 = tree.arr[x_582];
          int const x_590 = x_589.data;
          int const x_591 = x_589.leftIndex;
          int const x_592 = x_589.rightIndex;
          if ((x_590 == x_574)) {
            x_597_phi = x_574;
            x_598_phi = true;
            break;
          }
          {
            x_582_phi = select(x_591, x_592, (x_574 > x_590));
          }
        }
        x_597 = x_597_phi;
        bool const x_598 = x_598_phi;
        x_570_phi = x_597;
        if (x_598) {
          break;
        }
        x_570_phi = -1;
        break;
      }
    }
    int x_570 = 0;
    int x_606 = 0;
    int x_611 = 0;
    int x_607_phi = 0;
    int x_612_phi = 0;
    x_570 = x_570_phi;
    switch(x_574) {
      case 2:
      case 5:
      case 6:
      case 7:
      case 8:
      case 9:
      case 12:
      case 13:
      case 15:
      case 17: {
        x_607_phi = x_572;
        if ((x_570 == as_type<int>(x_574))) {
          x_606 = as_type<int>(as_type<int>((as_type<uint>(x_572) + as_type<uint>(as_type<int>(1)))));
          x_607_phi = x_606;
        }
        x_607 = x_607_phi;
        x_573_phi = x_607;
        break;
      }
      default: {
        x_612_phi = x_572;
        if ((x_570 == as_type<int>(-1))) {
          x_611 = as_type<int>(as_type<int>((as_type<uint>(x_572) + as_type<uint>(as_type<int>(1)))));
          x_612_phi = x_611;
        }
        x_612 = x_612_phi;
        x_573_phi = x_612;
        break;
      }
    }
    int const x_573 = x_573_phi;
    {
      x_575 = as_type<int>((as_type<uint>(x_574) + as_type<uint>(1)));
      x_569_phi = x_570;
      x_572_phi = x_573;
      x_574_phi = x_575;
    }
  }
  if ((x_572 == as_type<int>(20))) {
    *(tint_symbol_23) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_23) = float4(0.0f, 0.0f, 1.0f, 1.0f);
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_8, float4 gl_FragCoord_param, thread float4* const tint_symbol_24, thread float4* const tint_symbol_25) {
  *(tint_symbol_24) = gl_FragCoord_param;
  main_1(x_8, tint_symbol_24, tint_symbol_25);
  main_out const tint_symbol_21 = {.x_GLF_color_1=*(tint_symbol_25)};
  return tint_symbol_21;
}

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

