SKIP: FAILED

#version 310 es
precision mediump float;

struct LeftOver {
  float time;
  uint padding;
  mat4 worldViewProjection;
  vec2 outputSize;
  vec2 stageSize;
  vec2 spriteMapSize;
  float stageScale;
  float spriteCount;
  vec3 colorMul;
};

layout(binding = 9) uniform LeftOver_1 {
  float time;
  uint padding;
  mat4 worldViewProjection;
  vec2 outputSize;
  vec2 stageSize;
  vec2 spriteMapSize;
  float stageScale;
  float spriteCount;
  vec3 colorMul;
} x_20;
vec2 tUV = vec2(0.0f, 0.0f);
float mt = 0.0f;
vec4 glFragColor = vec4(0.0f, 0.0f, 0.0f, 0.0f);
vec2 tileID_1 = vec2(0.0f, 0.0f);
vec2 levelUnits = vec2(0.0f, 0.0f);
vec2 stageUnits_1 = vec2(0.0f, 0.0f);
vec3 vPosition = vec3(0.0f, 0.0f, 0.0f);
vec2 vUV = vec2(0.0f, 0.0f);
uniform highp sampler2D frameMapTexture_frameMapSampler;


mat4 getFrameData_f1_(inout float frameID) {
  float fX = 0.0f;
  float x_15 = frameID;
  float x_25 = x_20.spriteCount;
  fX = (x_15 / x_25);
  vec4 x_40 = texture(frameMapTexture_frameMapSampler, vec2(fX, 0.0f), 0.0f);
  vec4 x_47 = texture(frameMapTexture_frameMapSampler, vec2(fX, 0.25f), 0.0f);
  vec4 x_54 = texture(frameMapTexture_frameMapSampler, vec2(fX, 0.5f), 0.0f);
  return mat4(vec4(x_40.x, x_40.y, x_40.z, x_40.w), vec4(x_47.x, x_47.y, x_47.z, x_47.w), vec4(x_54.x, x_54.y, x_54.z, x_54.w), vec4(vec4(0.0f, 0.0f, 0.0f, 0.0f).x, vec4(0.0f, 0.0f, 0.0f, 0.0f).y, vec4(0.0f, 0.0f, 0.0f, 0.0f).z, vec4(0.0f, 0.0f, 0.0f, 0.0f).w));
}

uniform highp sampler2D tileMapsTexture1_tileMapsSampler;
uniform highp sampler2D tileMapsTexture0_tileMapsSampler;
uniform highp sampler2D animationMapTexture_animationMapSampler;
uniform highp sampler2D spriteSheetTexture_spriteSheetSampler;

void main_1() {
  vec4 color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
  vec2 tileUV = vec2(0.0f, 0.0f);
  vec2 tileID = vec2(0.0f, 0.0f);
  vec2 sheetUnits = vec2(0.0f, 0.0f);
  float spriteUnits = 0.0f;
  vec2 stageUnits = vec2(0.0f, 0.0f);
  int i = 0;
  float frameID_1 = 0.0f;
  vec4 animationData = vec4(0.0f, 0.0f, 0.0f, 0.0f);
  float f = 0.0f;
  mat4 frameData = mat4(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
  float param = 0.0f;
  vec2 frameSize = vec2(0.0f, 0.0f);
  vec2 offset_1 = vec2(0.0f, 0.0f);
  vec2 ratio = vec2(0.0f, 0.0f);
  vec4 nc = vec4(0.0f, 0.0f, 0.0f, 0.0f);
  float alpha = 0.0f;
  vec3 mixed = vec3(0.0f, 0.0f, 0.0f);
  color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
  tileUV = frac(tUV);
  float x_91 = tileUV.y;
  tileUV.y = (1.0f - x_91);
  tileID = floor(tUV);
  vec2 x_101 = x_20.spriteMapSize;
  sheetUnits = (vec2(1.0f, 1.0f) / x_101);
  float x_106 = x_20.spriteCount;
  spriteUnits = (1.0f / x_106);
  vec2 x_111 = x_20.stageSize;
  stageUnits = (vec2(1.0f, 1.0f) / x_111);
  i = 0;
  {
    for(; (i < 2); i = (i + 1)) {
      switch(i) {
        case 1: {
          vec2 x_150 = tileID;
          vec2 x_154 = x_20.stageSize;
          vec4 x_156 = texture(tileMapsTexture1_tileMapsSampler, ((x_150 + vec2(0.5f, 0.5f)) / x_154), 0.0f);
          frameID_1 = x_156.x;
          break;
        }
        case 0: {
          vec2 x_136 = tileID;
          vec2 x_140 = x_20.stageSize;
          vec4 x_142 = texture(tileMapsTexture0_tileMapsSampler, ((x_136 + vec2(0.5f, 0.5f)) / x_140), 0.0f);
          frameID_1 = x_142.x;
          break;
        }
        default: {
          break;
        }
      }
      float x_166 = frameID_1;
      float x_169 = x_20.spriteCount;
      vec4 x_172 = texture(animationMapTexture_animationMapSampler, vec2(((x_166 + 0.5f) / x_169), 0.0f), 0.0f);
      animationData = x_172;
      float x_174 = animationData.y;
      if ((x_174 > 0.0f)) {
        float x_181 = x_20.time;
        float x_184 = animationData.z;
        mt = ((x_181 * x_184) % 1.0f);
        f = 0.0f;
        {
          for(; (f < 8.0f); f = (f + 1.0f)) {
            float x_197 = animationData.y;
            if ((x_197 > mt)) {
              float x_203 = animationData.x;
              frameID_1 = x_203;
              break;
            }
            float x_208 = frameID_1;
            float x_211 = x_20.spriteCount;
            vec4 x_217 = texture(animationMapTexture_animationMapSampler, vec2(((x_208 + 0.5f) / x_211), (0.125f * f)), 0.0f);
            animationData = x_217;
          }
        }
      }
      param = (frameID_1 + 0.5f);
      mat4 x_225 = getFrameData_f1_(param);
      frameData = x_225;
      vec4 x_228 = frameData[0];
      vec2 x_231 = x_20.spriteMapSize;
      frameSize = (vec2(x_228.w, x_228.z) / x_231);
      vec4 x_235 = frameData[0];
      offset_1 = (vec2(x_235.x, x_235.y) * sheetUnits);
      vec4 x_241 = frameData[2];
      vec4 x_244 = frameData[0];
      ratio = (vec2(x_241.x, x_241.y) / vec2(x_244.w, x_244.z));
      float x_248 = frameData[2].z;
      if ((x_248 == 1.0f)) {
        vec2 x_252 = tileUV;
        tileUV = vec2(x_252.y, x_252.x);
      }
      if ((i == 0)) {
        vec4 x_268 = texture(spriteSheetTexture_spriteSheetSampler, ((tileUV * frameSize) + offset_1));
        color = x_268;
      } else {
        vec4 x_279 = texture(spriteSheetTexture_spriteSheetSampler, ((tileUV * frameSize) + offset_1));
        nc = x_279;
        float x_283 = color.w;
        float x_285 = nc.w;
        alpha = min((x_283 + x_285), 1.0f);
        vec4 x_290 = color;
        vec4 x_292 = nc;
        float x_295 = nc.w;
        mixed = mix(vec3(x_290.x, x_290.y, x_290.z), vec3(x_292.x, x_292.y, x_292.z), vec3(x_295, x_295, x_295));
        vec3 x_298 = mixed;
        color = vec4(x_298.x, x_298.y, x_298.z, alpha);
      }
    }
  }
  vec3 x_310 = x_20.colorMul;
  vec4 x_311 = color;
  vec3 x_313 = (vec3(x_311.x, x_311.y, x_311.z) * x_310);
  color = vec4(x_313.x, x_313.y, x_313.z, color.w);
  glFragColor = color;
  return;
}

struct main_out {
  vec4 glFragColor_1;
};
struct tint_symbol_2 {
  vec3 vPosition_param;
  vec2 vUV_param;
  vec2 tUV_param;
  vec2 stageUnits_1_param;
  vec2 levelUnits_param;
  vec2 tileID_1_param;
};
struct tint_symbol_3 {
  vec4 glFragColor_1;
};

main_out tint_symbol_inner(vec2 tUV_param, vec2 tileID_1_param, vec2 levelUnits_param, vec2 stageUnits_1_param, vec3 vPosition_param, vec2 vUV_param) {
  tUV = tUV_param;
  tileID_1 = tileID_1_param;
  levelUnits = levelUnits_param;
  stageUnits_1 = stageUnits_1_param;
  vPosition = vPosition_param;
  vUV = vUV_param;
  main_1();
  main_out tint_symbol_4 = main_out(glFragColor);
  return tint_symbol_4;
}

tint_symbol_3 tint_symbol(tint_symbol_2 tint_symbol_1) {
  main_out inner_result = tint_symbol_inner(tint_symbol_1.tUV_param, tint_symbol_1.tileID_1_param, tint_symbol_1.levelUnits_param, tint_symbol_1.stageUnits_1_param, tint_symbol_1.vPosition_param, tint_symbol_1.vUV_param);
  tint_symbol_3 wrapper_result = tint_symbol_3(vec4(0.0f, 0.0f, 0.0f, 0.0f));
  wrapper_result.glFragColor_1 = inner_result.glFragColor_1;
  return wrapper_result;
}
layout(location = 0) in vec3 vPosition_param;
layout(location = 1) in vec2 vUV_param;
layout(location = 2) in vec2 tUV_param;
layout(location = 3) in vec2 stageUnits_1_param;
layout(location = 4) in vec2 levelUnits_param;
layout(location = 5) in vec2 tileID_1_param;
layout(location = 0) out vec4 glFragColor_1;
void main() {
  tint_symbol_2 inputs;
  inputs.vPosition_param = vPosition_param;
  inputs.vUV_param = vUV_param;
  inputs.tUV_param = tUV_param;
  inputs.stageUnits_1_param = stageUnits_1_param;
  inputs.levelUnits_param = levelUnits_param;
  inputs.tileID_1_param = tileID_1_param;
  tint_symbol_3 outputs;
  outputs = tint_symbol(inputs);
  glFragColor_1 = outputs.glFragColor_1;
}


Error parsing GLSL shader:
ERROR: 0:74: 'frac' : no matching overloaded function found 
ERROR: 0:74: 'assign' :  cannot convert from ' const float' to ' temp mediump 2-component vector of float'
ERROR: 0:74: '' : compilation terminated 
ERROR: 3 compilation errors.  No code generated.



