SKIP: FAILED

#version 310 es
precision mediump float;

layout(location = 0) in vec4 position_1;
layout(location = 1) in vec4 color_1;
layout(location = 0) out vec4 v_color_1;
struct Time {
  float value;
};

struct Uniforms {
  float scale;
  float offsetX;
  float offsetY;
  float scalar;
  float scalarOffset;
};

layout(binding = 0) uniform Time_1 {
  float value;
} time;

layout(binding = 1) uniform Uniforms_1 {
  float scale;
  float offsetX;
  float offsetY;
  float scalar;
  float scalarOffset;
} uniforms;

struct VertexOutput {
  vec4 Position;
  vec4 v_color;
};

VertexOutput vert_main(vec4 position, vec4 color) {
  float fade = ((uniforms.scalarOffset + ((time.value * uniforms.scalar) / 10.0f)) % 1.0f);
  if ((fade < 0.5f)) {
    fade = (fade * 2.0f);
  } else {
    fade = ((1.0f - fade) * 2.0f);
  }
  float xpos = (position.x * uniforms.scale);
  float ypos = (position.y * uniforms.scale);
  float angle = ((3.141590118f * 2.0f) * fade);
  float xrot = ((xpos * cos(angle)) - (ypos * sin(angle)));
  float yrot = ((xpos * sin(angle)) + (ypos * cos(angle)));
  xpos = (xrot + uniforms.offsetX);
  ypos = (yrot + uniforms.offsetY);
  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), vec4(0.0f, 0.0f, 0.0f, 0.0f));
  tint_symbol.v_color = (vec4(fade, (1.0f - fade), 0.0f, 1.0f) + color);
  tint_symbol.Position = vec4(xpos, ypos, 0.0f, 1.0f);
  return tint_symbol;
}

void main() {
  VertexOutput inner_result = vert_main(position_1, color_1);
  gl_Position = inner_result.Position;
  v_color_1 = inner_result.v_color;
  gl_Position.y = -(gl_Position.y);
  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
  return;
}
Error parsing GLSL shader:
ERROR: 0:37: '%' :  wrong operand types: no operation '%' exists that takes a left-hand operand of type ' temp mediump float' and a right operand of type ' const float' (or there is no acceptable conversion)
ERROR: 0:37: '' : compilation terminated 
ERROR: 2 compilation errors.  No code generated.



#version 310 es
precision mediump float;

layout(location = 0) in vec4 v_color_1;
layout(location = 0) out vec4 value_1;
struct Time {
  float value;
};

struct Uniforms {
  float scale;
  float offsetX;
  float offsetY;
  float scalar;
  float scalarOffset;
};

struct VertexOutput {
  vec4 Position;
  vec4 v_color;
};

vec4 frag_main(vec4 v_color) {
  return v_color;
}

void main() {
  vec4 inner_result = frag_main(v_color_1);
  value_1 = inner_result;
  return;
}
