thumbs
259
www/background.js
Normal file
|
|
@ -0,0 +1,259 @@
|
||||||
|
// ═══════════════════════════════════════════════
|
||||||
|
// Bubble Background — wa2k.com
|
||||||
|
// Sparse frosted bubbles, slow drift, soft merge
|
||||||
|
// ═══════════════════════════════════════════════
|
||||||
|
|
||||||
|
(function () {
|
||||||
|
const canvas = document.createElement('canvas');
|
||||||
|
canvas.id = 'bubble-bg';
|
||||||
|
Object.assign(canvas.style, {
|
||||||
|
position: 'fixed',
|
||||||
|
top: '0',
|
||||||
|
left: '0',
|
||||||
|
width: '100%',
|
||||||
|
height: '100%',
|
||||||
|
zIndex: '-1',
|
||||||
|
pointerEvents: 'none',
|
||||||
|
});
|
||||||
|
document.body.prepend(canvas);
|
||||||
|
|
||||||
|
const ctx = canvas.getContext('2d');
|
||||||
|
|
||||||
|
// ── Config ──────────────────────────────────
|
||||||
|
const BG_COLOR = '#0a0e1a';
|
||||||
|
const BUBBLE_COUNT = 18; // sparse
|
||||||
|
const MIN_R = 28;
|
||||||
|
const MAX_R = 110;
|
||||||
|
const SPEED = 0.12; // very slow drift
|
||||||
|
const MERGE_DIST = 1.08; // merge when centers within 1.08× sum of radii
|
||||||
|
const MERGE_DURATION = 2800; // ms for merge animation
|
||||||
|
const SPLIT_DELAY = [6000, 14000]; // ms before a merged bubble splits
|
||||||
|
|
||||||
|
// Colour palette — pulled from site's glass theme
|
||||||
|
const COLORS = [
|
||||||
|
{ r: 196, g: 214, b: 226 }, // eww border blue-grey
|
||||||
|
{ r: 137, g: 180, b: 250 }, // primary neon
|
||||||
|
{ r: 166, g: 209, b: 255 }, // lighter blue
|
||||||
|
{ r: 180, g: 200, b: 220 }, // muted steel
|
||||||
|
];
|
||||||
|
|
||||||
|
// ── Resize ──────────────────────────────────
|
||||||
|
function resize() {
|
||||||
|
canvas.width = window.innerWidth;
|
||||||
|
canvas.height = window.innerHeight;
|
||||||
|
}
|
||||||
|
window.addEventListener('resize', resize);
|
||||||
|
resize();
|
||||||
|
|
||||||
|
// ── Bubble factory ──────────────────────────
|
||||||
|
let idSeq = 0;
|
||||||
|
|
||||||
|
function randColor() {
|
||||||
|
return COLORS[Math.floor(Math.random() * COLORS.length)];
|
||||||
|
}
|
||||||
|
|
||||||
|
function makeBubble(x, y, r) {
|
||||||
|
const angle = Math.random() * Math.PI * 2;
|
||||||
|
const speed = SPEED * (0.5 + Math.random() * 0.8);
|
||||||
|
const c = randColor();
|
||||||
|
return {
|
||||||
|
id: idSeq++,
|
||||||
|
x: x ?? Math.random() * canvas.width,
|
||||||
|
y: y ?? Math.random() * canvas.height,
|
||||||
|
r: r ?? MIN_R + Math.random() * (MAX_R - MIN_R),
|
||||||
|
vx: Math.cos(angle) * speed,
|
||||||
|
vy: Math.sin(angle) * speed,
|
||||||
|
c,
|
||||||
|
alpha: 0.13 + Math.random() * 0.10,
|
||||||
|
// merge state
|
||||||
|
merging: false,
|
||||||
|
mergeProgress: 0,
|
||||||
|
mergeTarget: null,
|
||||||
|
dead: false,
|
||||||
|
// split state
|
||||||
|
splitAt: null,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Init bubbles ─────────────────────────────
|
||||||
|
let bubbles = [];
|
||||||
|
for (let i = 0; i < BUBBLE_COUNT; i++) bubbles.push(makeBubble());
|
||||||
|
|
||||||
|
// ── Merge helpers ────────────────────────────
|
||||||
|
function startMerge(a, b) {
|
||||||
|
// b merges into a; b dies after animation
|
||||||
|
a.merging = true;
|
||||||
|
a.mergeTarget = b;
|
||||||
|
a.mergeProgress = 0;
|
||||||
|
b.dead = true; // hide b immediately, a absorbs it
|
||||||
|
|
||||||
|
// Destination: midpoint, combined area radius
|
||||||
|
const combinedR = Math.min(MAX_R * 1.4, Math.sqrt(a.r * a.r + b.r * b.r));
|
||||||
|
a._mergeFrom = { x: a.x, y: a.y, r: a.r };
|
||||||
|
a._mergeTo = {
|
||||||
|
x: (a.x * a.r + b.x * b.r) / (a.r + b.r),
|
||||||
|
y: (a.y * a.r + b.y * b.r) / (a.r + b.r),
|
||||||
|
r: combinedR,
|
||||||
|
};
|
||||||
|
a._mergeDuration = MERGE_DURATION;
|
||||||
|
a._mergeStart = performance.now();
|
||||||
|
|
||||||
|
// Schedule split
|
||||||
|
const delay = SPLIT_DELAY[0] + Math.random() * (SPLIT_DELAY[1] - SPLIT_DELAY[0]);
|
||||||
|
a.splitAt = performance.now() + MERGE_DURATION + delay;
|
||||||
|
}
|
||||||
|
|
||||||
|
function finishMerge(a) {
|
||||||
|
a.x = a._mergeTo.x;
|
||||||
|
a.y = a._mergeTo.y;
|
||||||
|
a.r = a._mergeTo.r;
|
||||||
|
a.merging = false;
|
||||||
|
a.mergeTarget = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function splitBubble(a) {
|
||||||
|
// Split into two bubbles roughly original size
|
||||||
|
const childR = a.r / Math.sqrt(2);
|
||||||
|
const angle = Math.random() * Math.PI * 2;
|
||||||
|
const offset = childR * 0.6;
|
||||||
|
|
||||||
|
const b1 = makeBubble(a.x + Math.cos(angle) * offset, a.y + Math.sin(angle) * offset, childR);
|
||||||
|
const b2 = makeBubble(a.x - Math.cos(angle) * offset, a.y - Math.sin(angle) * offset, childR);
|
||||||
|
|
||||||
|
// Push apart
|
||||||
|
b1.vx = Math.cos(angle) * SPEED * 1.2;
|
||||||
|
b1.vy = Math.sin(angle) * SPEED * 1.2;
|
||||||
|
b2.vx = -b1.vx;
|
||||||
|
b2.vy = -b1.vy;
|
||||||
|
|
||||||
|
a.dead = true;
|
||||||
|
bubbles.push(b1, b2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Draw a single bubble ─────────────────────
|
||||||
|
function drawBubble(b, alpha) {
|
||||||
|
const { x, y, r, c } = b;
|
||||||
|
const a = (alpha ?? b.alpha);
|
||||||
|
|
||||||
|
// Outer glow
|
||||||
|
const glow = ctx.createRadialGradient(x, y, r * 0.5, x, y, r * 1.3);
|
||||||
|
glow.addColorStop(0, `rgba(${c.r},${c.g},${c.b},0)`);
|
||||||
|
glow.addColorStop(1, `rgba(${c.r},${c.g},${c.b},${(a * 0.18).toFixed(3)})`);
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.arc(x, y, r * 1.3, 0, Math.PI * 2);
|
||||||
|
ctx.fillStyle = glow;
|
||||||
|
ctx.fill();
|
||||||
|
|
||||||
|
// Body — frosted glass fill
|
||||||
|
const body = ctx.createRadialGradient(x - r * 0.3, y - r * 0.3, r * 0.05, x, y, r);
|
||||||
|
body.addColorStop(0, `rgba(${c.r},${c.g},${c.b},${(a * 0.22).toFixed(3)})`);
|
||||||
|
body.addColorStop(0.6, `rgba(${c.r},${c.g},${c.b},${(a * 0.08).toFixed(3)})`);
|
||||||
|
body.addColorStop(1, `rgba(${c.r},${c.g},${c.b},${(a * 0.03).toFixed(3)})`);
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.arc(x, y, r, 0, Math.PI * 2);
|
||||||
|
ctx.fillStyle = body;
|
||||||
|
ctx.fill();
|
||||||
|
|
||||||
|
// Rim
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.arc(x, y, r, 0, Math.PI * 2);
|
||||||
|
ctx.strokeStyle = `rgba(${c.r},${c.g},${c.b},${(a * 1.1).toFixed(3)})`;
|
||||||
|
ctx.lineWidth = 1.2;
|
||||||
|
ctx.stroke();
|
||||||
|
|
||||||
|
// Specular highlight — top-left catch
|
||||||
|
const spec = ctx.createRadialGradient(
|
||||||
|
x - r * 0.38, y - r * 0.38, 0,
|
||||||
|
x - r * 0.28, y - r * 0.28, r * 0.42
|
||||||
|
);
|
||||||
|
spec.addColorStop(0, `rgba(255,255,255,${(a * 1.4).toFixed(3)})`);
|
||||||
|
spec.addColorStop(1, 'rgba(255,255,255,0)');
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.arc(x, y, r, 0, Math.PI * 2);
|
||||||
|
ctx.fillStyle = spec;
|
||||||
|
ctx.fill();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Main loop ────────────────────────────────
|
||||||
|
let lastTime = performance.now();
|
||||||
|
|
||||||
|
function loop(now) {
|
||||||
|
const dt = Math.min(now - lastTime, 50); // cap dt
|
||||||
|
lastTime = now;
|
||||||
|
|
||||||
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
||||||
|
|
||||||
|
// Background
|
||||||
|
ctx.fillStyle = BG_COLOR;
|
||||||
|
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
||||||
|
|
||||||
|
// Remove dead bubbles
|
||||||
|
bubbles = bubbles.filter(b => !b.dead);
|
||||||
|
|
||||||
|
// Replenish if too few
|
||||||
|
while (bubbles.length < BUBBLE_COUNT) bubbles.push(makeBubble());
|
||||||
|
|
||||||
|
// Update & draw
|
||||||
|
for (let i = 0; i < bubbles.length; i++) {
|
||||||
|
const b = bubbles[i];
|
||||||
|
if (b.dead) continue;
|
||||||
|
|
||||||
|
// Split check
|
||||||
|
if (b.splitAt && now >= b.splitAt && !b.merging) {
|
||||||
|
splitBubble(b);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Merge animation
|
||||||
|
if (b.merging) {
|
||||||
|
const t = Math.min(1, (now - b._mergeStart) / b._mergeDuration);
|
||||||
|
const ease = t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t; // ease in-out quad
|
||||||
|
b.x = b._mergeFrom.x + (b._mergeTo.x - b._mergeFrom.x) * ease;
|
||||||
|
b.y = b._mergeFrom.y + (b._mergeTo.y - b._mergeFrom.y) * ease;
|
||||||
|
b.r = b._mergeFrom.r + (b._mergeTo.r - b._mergeFrom.r) * ease;
|
||||||
|
if (t >= 1) finishMerge(b);
|
||||||
|
} else {
|
||||||
|
// Drift
|
||||||
|
b.x += b.vx * dt;
|
||||||
|
b.y += b.vy * dt;
|
||||||
|
|
||||||
|
// Soft wrap-around with margin
|
||||||
|
const m = b.r + 20;
|
||||||
|
if (b.x < -m) b.x = canvas.width + m;
|
||||||
|
if (b.x > canvas.width + m) b.x = -m;
|
||||||
|
if (b.y < -m) b.y = canvas.height + m;
|
||||||
|
if (b.y > canvas.height + m) b.y = -m;
|
||||||
|
|
||||||
|
// Very gentle direction wobble
|
||||||
|
b.vx += (Math.random() - 0.5) * 0.001;
|
||||||
|
b.vy += (Math.random() - 0.5) * 0.001;
|
||||||
|
|
||||||
|
// Clamp speed
|
||||||
|
const spd = Math.hypot(b.vx, b.vy);
|
||||||
|
const maxSpd = SPEED * 1.6;
|
||||||
|
if (spd > maxSpd) { b.vx *= maxSpd / spd; b.vy *= maxSpd / spd; }
|
||||||
|
|
||||||
|
// Check merge with other bubbles
|
||||||
|
for (let j = i + 1; j < bubbles.length; j++) {
|
||||||
|
const o = bubbles[j];
|
||||||
|
if (o.dead || o.merging || b.merging || b.splitAt || o.splitAt) continue;
|
||||||
|
const dx = o.x - b.x;
|
||||||
|
const dy = o.y - b.y;
|
||||||
|
const dist = Math.hypot(dx, dy);
|
||||||
|
if (dist < (b.r + o.r) * MERGE_DIST) {
|
||||||
|
// Larger absorbs smaller
|
||||||
|
if (b.r >= o.r) startMerge(b, o);
|
||||||
|
else startMerge(o, b);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
drawBubble(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
requestAnimationFrame(loop);
|
||||||
|
}
|
||||||
|
|
||||||
|
requestAnimationFrame(loop);
|
||||||
|
})();
|
||||||
|
|
@ -170,6 +170,7 @@
|
||||||
box-shadow: 0 8px 40px rgba(0,0,0,0.6);
|
box-shadow: 0 8px 40px rgba(0,0,0,0.6);
|
||||||
animation: vImgIn 0.2s cubic-bezier(0.4,0,0.2,1);
|
animation: vImgIn 0.2s cubic-bezier(0.4,0,0.2,1);
|
||||||
cursor: default;
|
cursor: default;
|
||||||
|
transition: filter 0.3s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes vImgIn {
|
@keyframes vImgIn {
|
||||||
|
|
@ -1453,7 +1454,7 @@ function buildPhotoItem(photo, pageIndex) {
|
||||||
img.alt = photo.file;
|
img.alt = photo.file;
|
||||||
img.loading = 'lazy';
|
img.loading = 'lazy';
|
||||||
img.decoding = 'async';
|
img.decoding = 'async';
|
||||||
img.src = `./photos/${photo.file}`;
|
img.src = `./photos/thumbs/${photo.file}`;
|
||||||
|
|
||||||
item.appendChild(img);
|
item.appendChild(img);
|
||||||
|
|
||||||
|
|
@ -1546,8 +1547,16 @@ function updateViewer() {
|
||||||
const photo = photos[viewerIndex];
|
const photo = photos[viewerIndex];
|
||||||
if (!photo) return;
|
if (!photo) return;
|
||||||
|
|
||||||
viewerImg.src = `./photos/${photo.file}`;
|
// Show thumbnail instantly, then load full res on top
|
||||||
viewerImg.alt = photo.file;
|
viewerImg.src = `./photos/thumbs/${photo.file}`;
|
||||||
|
viewerImg.style.filter = 'blur(0px)';
|
||||||
|
|
||||||
|
const full = new Image();
|
||||||
|
full.onload = () => {
|
||||||
|
viewerImg.src = full.src;
|
||||||
|
viewerImg.style.filter = 'blur(0px)';
|
||||||
|
};
|
||||||
|
full.src = `./photos/${photo.file}`;
|
||||||
|
|
||||||
// Populate toolbar with metadata
|
// Populate toolbar with metadata
|
||||||
const fields = [
|
const fields = [
|
||||||
|
|
|
||||||
BIN
www/photos/thumbs/3W0A4327.JPG
Normal file
|
After Width: | Height: | Size: 348 KiB |
BIN
www/photos/thumbs/3W0A4328.JPG
Normal file
|
After Width: | Height: | Size: 249 KiB |
BIN
www/photos/thumbs/3W0A4329.JPG
Normal file
|
After Width: | Height: | Size: 492 KiB |
BIN
www/photos/thumbs/3W0A4330.JPG
Normal file
|
After Width: | Height: | Size: 536 KiB |
BIN
www/photos/thumbs/3W0A4331.JPG
Normal file
|
After Width: | Height: | Size: 414 KiB |
BIN
www/photos/thumbs/3W0A4332.JPG
Normal file
|
After Width: | Height: | Size: 543 KiB |
BIN
www/photos/thumbs/3W0A4333.JPG
Normal file
|
After Width: | Height: | Size: 540 KiB |
BIN
www/photos/thumbs/3W0A4334.JPG
Normal file
|
After Width: | Height: | Size: 421 KiB |
BIN
www/photos/thumbs/3W0A4335.JPG
Normal file
|
After Width: | Height: | Size: 340 KiB |
BIN
www/photos/thumbs/3W0A4336.JPG
Normal file
|
After Width: | Height: | Size: 288 KiB |
BIN
www/photos/thumbs/3W0A4337.JPG
Normal file
|
After Width: | Height: | Size: 350 KiB |
BIN
www/photos/thumbs/3W0A4338.JPG
Normal file
|
After Width: | Height: | Size: 344 KiB |
BIN
www/photos/thumbs/3W0A4339.JPG
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
BIN
www/photos/thumbs/3W0A4340.JPG
Normal file
|
After Width: | Height: | Size: 531 KiB |
BIN
www/photos/thumbs/3W0A4341.JPG
Normal file
|
After Width: | Height: | Size: 455 KiB |
BIN
www/photos/thumbs/3W0A4342.JPG
Normal file
|
After Width: | Height: | Size: 432 KiB |
BIN
www/photos/thumbs/3W0A4344.JPG
Normal file
|
After Width: | Height: | Size: 265 KiB |
BIN
www/photos/thumbs/3W0A4345.JPG
Normal file
|
After Width: | Height: | Size: 338 KiB |
BIN
www/photos/thumbs/3W0A4346.JPG
Normal file
|
After Width: | Height: | Size: 224 KiB |
BIN
www/photos/thumbs/3W0A4347.JPG
Normal file
|
After Width: | Height: | Size: 625 KiB |
BIN
www/photos/thumbs/3W0A4348.JPG
Normal file
|
After Width: | Height: | Size: 467 KiB |
BIN
www/photos/thumbs/3W0A4349.JPG
Normal file
|
After Width: | Height: | Size: 501 KiB |
BIN
www/photos/thumbs/3W0A4350.JPG
Normal file
|
After Width: | Height: | Size: 465 KiB |
BIN
www/photos/thumbs/3W0A4351.JPG
Normal file
|
After Width: | Height: | Size: 508 KiB |
BIN
www/photos/thumbs/3W0A4352.JPG
Normal file
|
After Width: | Height: | Size: 301 KiB |
BIN
www/photos/thumbs/3W0A4353.JPG
Normal file
|
After Width: | Height: | Size: 259 KiB |
BIN
www/photos/thumbs/3W0A4354.JPG
Normal file
|
After Width: | Height: | Size: 351 KiB |
BIN
www/photos/thumbs/3W0A4355.JPG
Normal file
|
After Width: | Height: | Size: 298 KiB |
BIN
www/photos/thumbs/3W0A4356.JPG
Normal file
|
After Width: | Height: | Size: 285 KiB |
BIN
www/photos/thumbs/3W0A4357.JPG
Normal file
|
After Width: | Height: | Size: 314 KiB |
BIN
www/photos/thumbs/3W0A4358.JPG
Normal file
|
After Width: | Height: | Size: 253 KiB |
BIN
www/photos/thumbs/3W0A4359.JPG
Normal file
|
After Width: | Height: | Size: 304 KiB |
BIN
www/photos/thumbs/3W0A4360.JPG
Normal file
|
After Width: | Height: | Size: 524 KiB |
BIN
www/photos/thumbs/3W0A4361.JPG
Normal file
|
After Width: | Height: | Size: 534 KiB |
BIN
www/photos/thumbs/3W0A4362.JPG
Normal file
|
After Width: | Height: | Size: 602 KiB |
BIN
www/photos/thumbs/3W0A4363.JPG
Normal file
|
After Width: | Height: | Size: 290 KiB |
BIN
www/photos/thumbs/3W0A4364.JPG
Normal file
|
After Width: | Height: | Size: 333 KiB |
BIN
www/photos/thumbs/3W0A4365.JPG
Normal file
|
After Width: | Height: | Size: 556 KiB |
BIN
www/photos/thumbs/3W0A4366.JPG
Normal file
|
After Width: | Height: | Size: 447 KiB |
BIN
www/photos/thumbs/3W0A4367.JPG
Normal file
|
After Width: | Height: | Size: 387 KiB |
BIN
www/photos/thumbs/3W0A4368.JPG
Normal file
|
After Width: | Height: | Size: 568 KiB |
BIN
www/photos/thumbs/3W0A4369.JPG
Normal file
|
After Width: | Height: | Size: 566 KiB |
BIN
www/photos/thumbs/3W0A4370.JPG
Normal file
|
After Width: | Height: | Size: 607 KiB |
BIN
www/photos/thumbs/3W0A4371.JPG
Normal file
|
After Width: | Height: | Size: 733 KiB |
BIN
www/photos/thumbs/3W0A4372.JPG
Normal file
|
After Width: | Height: | Size: 665 KiB |
BIN
www/photos/thumbs/3W0A4373.JPG
Normal file
|
After Width: | Height: | Size: 700 KiB |
BIN
www/photos/thumbs/3W0A4374.JPG
Normal file
|
After Width: | Height: | Size: 577 KiB |
BIN
www/photos/thumbs/3W0A4375.JPG
Normal file
|
After Width: | Height: | Size: 516 KiB |
BIN
www/photos/thumbs/3W0A4376.JPG
Normal file
|
After Width: | Height: | Size: 327 KiB |
BIN
www/photos/thumbs/3W0A4377.JPG
Normal file
|
After Width: | Height: | Size: 367 KiB |
BIN
www/photos/thumbs/3W0A4378.JPG
Normal file
|
After Width: | Height: | Size: 342 KiB |
BIN
www/photos/thumbs/3W0A4379.JPG
Normal file
|
After Width: | Height: | Size: 337 KiB |
BIN
www/photos/thumbs/3W0A4380.JPG
Normal file
|
After Width: | Height: | Size: 488 KiB |
BIN
www/photos/thumbs/3W0A4381.JPG
Normal file
|
After Width: | Height: | Size: 396 KiB |
BIN
www/photos/thumbs/3W0A4382.JPG
Normal file
|
After Width: | Height: | Size: 370 KiB |
BIN
www/photos/thumbs/3W0A4383.JPG
Normal file
|
After Width: | Height: | Size: 208 KiB |
BIN
www/photos/thumbs/3W0A4384.JPG
Normal file
|
After Width: | Height: | Size: 173 KiB |
BIN
www/photos/thumbs/3W0A4385.JPG
Normal file
|
After Width: | Height: | Size: 283 KiB |
BIN
www/photos/thumbs/3W0A4386.JPG
Normal file
|
After Width: | Height: | Size: 257 KiB |
BIN
www/photos/thumbs/3W0A4387.JPG
Normal file
|
After Width: | Height: | Size: 403 KiB |
BIN
www/photos/thumbs/3W0A4388.JPG
Normal file
|
After Width: | Height: | Size: 409 KiB |
BIN
www/photos/thumbs/3W0A4389.JPG
Normal file
|
After Width: | Height: | Size: 333 KiB |
BIN
www/photos/thumbs/3W0A4390.JPG
Normal file
|
After Width: | Height: | Size: 609 KiB |
BIN
www/photos/thumbs/3W0A4391.JPG
Normal file
|
After Width: | Height: | Size: 754 KiB |
BIN
www/photos/thumbs/3W0A4392.JPG
Normal file
|
After Width: | Height: | Size: 868 KiB |
BIN
www/photos/thumbs/3W0A4393.JPG
Normal file
|
After Width: | Height: | Size: 860 KiB |
BIN
www/photos/thumbs/3W0A4394.JPG
Normal file
|
After Width: | Height: | Size: 914 KiB |
BIN
www/photos/thumbs/3W0A4395.JPG
Normal file
|
After Width: | Height: | Size: 853 KiB |
BIN
www/photos/thumbs/3W0A4396.JPG
Normal file
|
After Width: | Height: | Size: 732 KiB |
BIN
www/photos/thumbs/3W0A4397.JPG
Normal file
|
After Width: | Height: | Size: 607 KiB |
BIN
www/photos/thumbs/3W0A4398.JPG
Normal file
|
After Width: | Height: | Size: 476 KiB |
BIN
www/photos/thumbs/3W0A4399.JPG
Normal file
|
After Width: | Height: | Size: 500 KiB |
BIN
www/photos/thumbs/3W0A4400.JPG
Normal file
|
After Width: | Height: | Size: 599 KiB |
BIN
www/photos/thumbs/3W0A4401.JPG
Normal file
|
After Width: | Height: | Size: 506 KiB |
BIN
www/photos/thumbs/3W0A4402.JPG
Normal file
|
After Width: | Height: | Size: 490 KiB |
BIN
www/photos/thumbs/3W0A4403.JPG
Normal file
|
After Width: | Height: | Size: 357 KiB |
BIN
www/photos/thumbs/3W0A4404.JPG
Normal file
|
After Width: | Height: | Size: 359 KiB |
BIN
www/photos/thumbs/3W0A4405.JPG
Normal file
|
After Width: | Height: | Size: 431 KiB |
BIN
www/photos/thumbs/3W0A4406.JPG
Normal file
|
After Width: | Height: | Size: 300 KiB |
BIN
www/photos/thumbs/3W0A4407.JPG
Normal file
|
After Width: | Height: | Size: 385 KiB |
BIN
www/photos/thumbs/3W0A4408.JPG
Normal file
|
After Width: | Height: | Size: 438 KiB |
BIN
www/photos/thumbs/3W0A4409.JPG
Normal file
|
After Width: | Height: | Size: 651 KiB |
BIN
www/photos/thumbs/3W0A4410.JPG
Normal file
|
After Width: | Height: | Size: 658 KiB |
BIN
www/photos/thumbs/3W0A4411.JPG
Normal file
|
After Width: | Height: | Size: 523 KiB |
BIN
www/photos/thumbs/3W0A4412.JPG
Normal file
|
After Width: | Height: | Size: 485 KiB |
BIN
www/photos/thumbs/3W0A4413.JPG
Normal file
|
After Width: | Height: | Size: 446 KiB |
BIN
www/photos/thumbs/3W0A4414.JPG
Normal file
|
After Width: | Height: | Size: 558 KiB |
BIN
www/photos/thumbs/3W0A4415.JPG
Normal file
|
After Width: | Height: | Size: 536 KiB |
BIN
www/photos/thumbs/3W0A4416.JPG
Normal file
|
After Width: | Height: | Size: 523 KiB |
BIN
www/photos/thumbs/3W0A4417.JPG
Normal file
|
After Width: | Height: | Size: 400 KiB |
BIN
www/photos/thumbs/3W0A4418.JPG
Normal file
|
After Width: | Height: | Size: 465 KiB |
BIN
www/photos/thumbs/3W0A4419.JPG
Normal file
|
After Width: | Height: | Size: 501 KiB |
BIN
www/photos/thumbs/3W0A4420.JPG
Normal file
|
After Width: | Height: | Size: 541 KiB |
BIN
www/photos/thumbs/3W0A4421.JPG
Normal file
|
After Width: | Height: | Size: 635 KiB |
BIN
www/photos/thumbs/3W0A4422.JPG
Normal file
|
After Width: | Height: | Size: 443 KiB |
BIN
www/photos/thumbs/3W0A4423.JPG
Normal file
|
After Width: | Height: | Size: 421 KiB |
BIN
www/photos/thumbs/3W0A4424.JPG
Normal file
|
After Width: | Height: | Size: 529 KiB |
BIN
www/photos/thumbs/3W0A4425.JPG
Normal file
|
After Width: | Height: | Size: 614 KiB |