#version 310 es
precision mediump float;

struct Uniforms {
  vec2 u_scale;
  vec2 u_offset;
};

layout(binding = 0) uniform Uniforms_1 {
  vec2 u_scale;
  vec2 u_offset;
} uniforms;

struct VertexOutputs {
  vec2 texcoords;
  vec4 position;
};

struct tint_symbol_2 {
  uint VertexIndex;
};

struct tint_symbol_3 {
  vec2 texcoords;
  vec4 position;
};

VertexOutputs vs_main_inner(uint VertexIndex) {
  vec2 texcoord[3] = vec2[3](vec2(-0.5f, 0.0f), vec2(1.5f, 0.0f), vec2(0.5f, 2.0f));
  VertexOutputs tint_symbol = VertexOutputs(vec2(0.0f, 0.0f), vec4(0.0f, 0.0f, 0.0f, 0.0f));
  tint_symbol.position = vec4(((texcoord[VertexIndex] * 2.0f) - vec2(1.0f, 1.0f)), 0.0f, 1.0f);
  bool flipY = (uniforms.u_scale.y < 0.0f);
  if (flipY) {
    tint_symbol.texcoords = ((((texcoord[VertexIndex] * uniforms.u_scale) + uniforms.u_offset) * vec2(1.0f, -1.0f)) + vec2(0.0f, 1.0f));
  } else {
    tint_symbol.texcoords = ((((texcoord[VertexIndex] * vec2(1.0f, -1.0f)) + vec2(0.0f, 1.0f)) * uniforms.u_scale) + uniforms.u_offset);
  }
  return tint_symbol;
}

struct tint_symbol_5 {
  vec2 texcoord;
};

struct tint_symbol_6 {
  vec4 value;
};

tint_symbol_3 vs_main(tint_symbol_2 tint_symbol_1) {
  VertexOutputs inner_result = vs_main_inner(tint_symbol_1.VertexIndex);
  tint_symbol_3 wrapper_result = tint_symbol_3(vec2(0.0f, 0.0f), vec4(0.0f, 0.0f, 0.0f, 0.0f));
  wrapper_result.texcoords = inner_result.texcoords;
  wrapper_result.position = inner_result.position;
  return wrapper_result;
}

layout(location = 0) out vec2 texcoords;


void main() {
  tint_symbol_2 inputs;
  inputs.VertexIndex = uint(gl_VertexID);
  tint_symbol_3 outputs;
  outputs = vs_main(inputs);
  texcoords = outputs.texcoords;
  gl_Position = outputs.position;
  gl_Position.z = 2.0 * gl_Position.z - gl_Position.w;
  gl_Position.y = -gl_Position.y;
}

#version 310 es
precision mediump float;

struct Uniforms {
  vec2 u_scale;
  vec2 u_offset;
};

struct VertexOutputs {
  vec2 texcoords;
  vec4 position;
};

struct tint_symbol_2 {
  uint VertexIndex;
};

struct tint_symbol_3 {
  vec2 texcoords;
  vec4 position;
};

struct tint_symbol_5 {
  vec2 texcoord;
};

struct tint_symbol_6 {
  vec4 value;
};

uniform highp sampler2D myTexture_mySampler;

vec4 fs_main_inner(vec2 texcoord) {
  vec2 clampedTexcoord = clamp(texcoord, vec2(0.0f, 0.0f), vec2(1.0f, 1.0f));
  if (!(all(equal(clampedTexcoord, texcoord)))) {
    discard;
  }
  vec4 srcColor = texture(myTexture_mySampler, texcoord);
  return srcColor;
}

tint_symbol_6 fs_main(tint_symbol_5 tint_symbol_4) {
  vec4 inner_result_1 = fs_main_inner(tint_symbol_4.texcoord);
  tint_symbol_6 wrapper_result_1 = tint_symbol_6(vec4(0.0f, 0.0f, 0.0f, 0.0f));
  wrapper_result_1.value = inner_result_1;
  return wrapper_result_1;
}
layout(location = 0) in vec2 texcoord;
layout(location = 0) out vec4 value;

void main() {
  tint_symbol_5 inputs;
  inputs.texcoord = texcoord;
  tint_symbol_6 outputs;
  outputs = fs_main(inputs);
  value = outputs.value;
}

