before me

On my way to the market place he appeared before me. I had managed to avoid him for months.

Log in to post a comment.

Canvas.setpenopacity(1);

// Global code will be evaluated once.
const turtle = new Turtle();
turtle.penup();

const voronoi = {
	polylines: [],

	drawPolyline(a, ox, oy) {
		turtle.penup();
		turtle.goto(a[0] + ox, a[1] + oy);
		turtle.pendown();
		for (let i = 2; i < a.length; i += 2) {
			turtle.goto(a[i] + ox, a[i + 1] + oy);
		}
	},

	optimizePath(penWidth = 0) {
		// based on https://github.com/Evelios/optimize-path
		const lines = this.polylines;
		if (lines.length === 0) return [];
		const out = [];
		const pws = penWidth ** 2;
		let frontier = lines.slice(0);
		let cNode = frontier.pop();
		let combined = cNode;
		while (frontier.length !== 0) {
			let reversed = false;
			let pathIndex = -1;
			let closestDist = Infinity;
			let dist = Infinity;
			let cEndX = cNode[cNode.length - 2];
			let cEndY = cNode[cNode.length - 1];
			// Get the path that is closest to the current node
			for (let index = 0; index < frontier.length; index++) {
				const path = frontier[index];
				// Regular Orientation
				dist = (cEndX - path[0]) ** 2 + (cEndY - path[1]) ** 2;
				if (dist < closestDist) {
					reversed = false;
					pathIndex = index;
					closestDist = dist;
				}
				// Reversed Orientation
				dist =
					(cEndX - path[path.length - 2]) ** 2 +
					(cEndY - path[path.length - 1]) ** 2;
				if (dist < closestDist) {
					reversed = true;
					pathIndex = index;
					closestDist = dist;
				}
			}
			// Add the closest path to the explored list and remove it from the frontier
			cNode = frontier[pathIndex];
			frontier.splice(pathIndex, 1);
			if (reversed) {
				const new_node = [];
				for (let i = cNode.length - 2; i >= 0; i -= 2) {
					new_node.push(cNode[i]);
					new_node.push(cNode[i + 1]);
				}
				cNode = new_node;
			}
			// If the paths are closer than the pen width, them combine them
			if (closestDist < pws) {
				combined = combined.concat(cNode);
			} else {
				if (combined.length > 0) {
					out.push(combined);
					combined = [];
				}
				out.push(cNode);
				combined = cNode;
			}
		}
		this.polylines = out;
	},

	/**
	 * Ported from "Sketch of Voronoi"
	 * Dead Code Preservation: http://wa.zozuar.org/code.php?c=iNy0
	 * @see http://en.wikipedia.org/wiki/Fortune's_algorithm
	 * C++ reference https://www.cs.hmc.edu/~mbrubeck/voronoi.html
	 */

	Point: class Point {
		constructor(x = 0.0, y = 0.0) {
			this.x = x;
			this.y = y;
		}
	},

	Arc: class Arc {
		constructor(p, prev, next) {
			this.p = p;
			this.next = next;
			this.prev = prev;
			this.v0 = null;
			this.v1 = null;
			this.left = null;
			this.right = null;
			this.endP = null;
			this.endX = 0.0;
		}
	},

	intersection(p0, p1, l, res) {
		let p = p0,
			ll = l * l;
		if (p0.x === p1.x) res.y = (p0.y + p1.y) / 2;
		else if (p1.x === l) res.y = p1.y;
		else if (p0.x === l) {
			res.y = p0.y;
			p = p1;
		} else {
			const z0 = 0.5 / (p0.x - l);
			const z1 = 0.5 / (p1.x - l);
			const a = z0 - z1;
			const b = -2 * (p0.y * z0 - p1.y * z1);
			const c =
				(p0.y * p0.y + p0.x * p0.x - ll) * z0 -
				(p1.y * p1.y + p1.x * p1.x - ll) * z1;
			res.y = (-b - Math.sqrt(b * b - 4 * a * c)) / (2 * a);
		}
		res.x = (p.x * p.x + (p.y - res.y) * (p.y - res.y) - ll) / (2 * p.x - 2 * l);
	},

	fortune(points) {
		const N = points.length;
		let o = new this.Point();
		let root = null;
		let a = null;
		let b = null;
		let c = null;
		let d = null;
		let next = null;
		let eventX = 0;
		let w = points[0].x;
		for (let i = 1; i < N; i++) {
			const p = points[i];
			const x = p.x;
			if (x < w) {
				let j = i;
				while (j > 0 && points[j - 1].x > x) {
					points[j] = points[j - 1];
					j--;
				}
				points[j] = p;
			} else w = x;
		}
		const x0 = points[0].x;
		let i = 0;
		let p = points[0];
		let x = p.x;
		while (true) {
			if (a !== null) {
				let circle = false;
				if (a.prev !== null && a.next !== null) {
					const aa = a.prev.p;
					const bb = a.p;
					const cc = a.next.p;
					let A = bb.x - aa.x;
					let B = bb.y - aa.y;
					const C = cc.x - aa.x;
					const D = cc.y - aa.y;
					if (A * D - C * B <= 0) {
						const E = A * (aa.x + bb.x) + B * (aa.y + bb.y);
						const F = C * (aa.x + cc.x) + D * (aa.y + cc.y);
						const G = 2 * (A * (cc.y - bb.y) - B * (cc.x - bb.x));
						if (G !== 0) {
							o.x = (D * E - B * F) / G;
							o.y = (A * F - C * E) / G;
							A = aa.x - o.x;
							B = aa.y - o.y;
							eventX = o.x + Math.sqrt(A * A + B * B);
							if (eventX >= w) circle = true;
						}
					}
				}
				if (a.right !== null) a.right.left = a.left;
				if (a.left !== null) a.left.right = a.right;
				if (a === next) next = a.right;
				if (circle === true) {
					a.endX = eventX;
					if (a.endP !== null) {
						a.endP.x = o.x;
						a.endP.y = o.y;
					} else {
						a.endP = o;
						o = new this.Point();
					}
					d = next;
					if (d === null) {
						next = a;
					} else
						while (true) {
							if (d.endX >= eventX) {
								a.left = d.left;
								if (d.left !== null) d.left.right = a;
								if (next === d) next = a;
								a.right = d;
								d.left = a;
								break;
							}
							if (d.right === null) {
								d.right = a;
								a.left = d;
								a.right = null;
								break;
							}
							d = d.right;
						}
				}
				if (b !== null) {
					a = b;
					b = null;
					continue;
				}
				if (c !== null) {
					a = c;
					c = null;
					continue;
				}
				a = null;
			}
			if (next !== null && next.endX <= x) {
				a = next;
				next = a.right;
				if (next !== null) next.left = null;
				a.right = null;
				if (a.prev !== null) {
					a.prev.next = a.next;
					a.prev.v1 = a.endP;
				}
				if (a.next !== null) {
					a.next.prev = a.prev;
					a.next.v0 = a.endP;
				}
				this.polylines.push([a.v0.x, a.v0.y, a.endP.x, a.endP.y, a.v1.x, a.v1.y]);
				d = a;
				w = a.endX;
				if (a.prev !== null) {
					b = a.prev;
					a = a.next;
				} else {
					a = a.next;
					b = null;
				}
			} else {
				if (p === null) break;
				if (root === null) {
					root = new this.Arc(p, null, null);
				} else {
					let z = new this.Point();
					a = root.next;
					if (a !== null) {
						while (a.next !== null) {
							a = a.next;
							if (a.p.y >= p.y) break;
						}
						this.intersection(a.prev.p, a.p, p.x, z);
						if (z.y <= p.y) {
							while (a.next !== null) {
								a = a.next;
								this.intersection(a.prev.p, a.p, p.x, z);
								if (z.y >= p.y) {
									a = a.prev;
									break;
								}
							}
						} else {
							a = a.prev;
							while (a.prev !== null) {
								a = a.prev;
								this.intersection(a.p, a.next.p, p.x, z);
								if (z.y <= p.y) {
									a = a.next;
									break;
								}
							}
						}
					} else a = root;
					if (a.next !== null) {
						b = new this.Arc(a.p, a, a.next);
						a.next.prev = b;
						a.next = b;
					} else {
						b = new this.Arc(a.p, a, null);
						a.next = b;
					}
					a.next.v1 = a.v1;
					z.y = p.y;
					z.x =
						(a.p.x * a.p.x + (a.p.y - p.y) * (a.p.y - p.y) - p.x * p.x) /
						(2 * a.p.x - 2 * p.x);
					b = new this.Arc(p, a, a.next);
					a.next.prev = b;
					a.next = b;
					a = a.next;
					a.prev.v1 = z;
					a.next.v0 = z;
					a.v0 = z;
					a.v1 = z;
					b = a.next;
					a = a.prev;
					c = null;
					w = p.x;
				}
				i++;
				if (i >= N) {
					p = null;
					x = 999999;
				} else {
					p = points[i];
					x = p.x;
				}
			}
		}
	}
};

const img = {
	XH: [
		"4~Q34~)34~;32~&377736778836~%7~$3~'7336~(7333~+7~%366~+7666~,7~$366~/78~$366~2783~2783556~578833555~<788833555~$6~A787~$83~)566~<7~$8335556~C7~%844~'56~C7~)8~'566~F7~,8333~*56~>7~-83344~,5~@7~3834~,56~87~083~$4~/566~47~2833~%4~+5666~.7~2899333444~+5~57~1899333444554~05~07~1899~&3444~/566~27~489333444~/5~,7~1899333~%4~/5~.7~489~$3~'4~856~+7887~08333~04~056~37~4899~$3~)4~+56~/7~78~-4~65~)7~489~&3~-4~<56~/7~5898~&3~64~<56~+7~58~34~25~,7~58333~54~A56~,7~9833~04~=566~,7~/8~/4554~85~-7~183~)4~756~*7~2",
		"8~%3~/4~;566~&7~68~$3~+4~<56~,7~/8~$3~)4~65~&7~58~$3~&4~G5~,7~.8~%3~)4~85~07~08333~(4~<5~27~,8~%3~'4~85~,7~/8~$3~'4~35~/7~.89~(3~(4~;5~.7~+833~14~45~/7~+8333~64~65~/7~)8~$3~44~<5~/7~*833~64~<5~.7~%8~,3~84~05~/7888~$3~/4~75~17~%8~(3~04~85~/7888~&3~,4~85~&7888~&3~,4~25778~%3~*4~5567778~'3~.4~956777~)3~24~5577~+3~14~-5~$7~.3~44~157~(3~24~.5772~)3~24~.57~$2~&3~:4~2567~$2~&3~24~157~*2~)3~74~35677~(2~+3~74~,5667~%2~*3~94~,5~(2~)3~=4~256~$2~(3~84~/566~%2~'3~44~*56~'2~*3~:4~/5~(2~+3~<4~/566~,2~/3~54~,5~",
		"%2~&3~64~,566~'2~&3~44~1566~)2~,3~44~/56~&2~$3~54~/56~)2~.3~/4~*566~&2~*3~,4~25~'2~-3~&4~.566~&2~-3~&4~256~%2~+343~*4~.5~(2~,3~&4~+5~%232~,3~'4~'5~'2~(3~(4~.56~.2~*343~%4~,56~-2~*3~'4~.56~/2~,3~)4~25~(2~)344~+5~-2~(3444~35~.2~*3~&4~,5~-2~*3~%4~,56~22~)3~%4~15~+2~*3~%4~,5~.2~'3~&4~-5~02~,344~1566~+2~(3~%4~.5~*2~'3444~,56~+2~'3444~*5~+2~)344~*56~+2~*3~%4~(56~*2~.344~,5~,2~.344~,5~/2~'3~$4~)5~*2~'344~-5~&23~$4~'5~)2~'3~'4~%56~,2~-344~%56~)2~(3~%4~(56~&2333~%4~&56~(2~-3~&4~%566~(2~*3~$4~)56~&2~'3~(4",
		"~)5222~*3~%4~(5~$2~(3444~(56~%2~&3~'5666~&2~$34~&5~$233~'56~$2~$3~'56~$2333~'5~&233~'56~'233~'5~(23~$5~*23~$5~*2333~$56~(23335556~+2335556~%233~%56~)23~%5~(233~(5~(233~&56~'23~%5~+23~%566~'233~(566~/23~&5~%23~)566~)23~%56~-255566~.23~&5~-2333~$56~,23~)56~*25556~*23~%56~)2555666~*23~(566~+2356~+2555666~*23~'56~)23~&5666~*2355565666~*2~'5~$6~'2355566~+233~%56~.2~%5666222~%56~%2~&566~'2~'566~(23~$5666~,2~%566~(23~%56~'2~&5~%6~&23~'566~%23~%5~+233~$566~%234~%56~&23~&566~'23~&5~)2~+56223~%56~$23~'566",
		"~&2~(5699~'2555666~$23~&5~$69~$23~)59~(2~$5~$6~$23~$569~/23~%58~(233~%59~%23~$56999~&2333559899~(259~*2~&35599~(233599~$2~$3558992223334~$59~&23359922~&344558~(2~&34~$5999~$2~'3559~&2~&345599222~,3~$5999~$2~&35559222~'3455569~&2~(3555699222~+34~%599~$2~*34~&56992~)34499222~/344~&5~'345556~03444~$56699~-3~&5~$69992~-345~$622~&3444~$5~*3455566~+344~&5~%6~,3444~%5~$6~(3~$4~&5~$6~*3~$4~%5666~*3~%4~&5666~'3~'5~%6~(34~(5666~.3444~'5~$677~+3~$4~(566777~*3~&4~(5~&677~*3~$4~(5~$677~'3~'4~%5666777~034~&5~",
		"$6~)7~)3~%4~/5~(6777~)3~%4~)5~&6~$7~%3444~.5~%6~%7~*3~%4~,5~(6~$7~)3~$4~,5~,6~$7~*3~'4~+5~&677~'3~%4~.5~)6~$7~'3444~.5~06~%7~%3~+4~*5~76767~%3444~-5~567~'3~$4~05~36~&3~%4~-5~;6~'3~$4~,5~66333~%4~25~467~&3~&4~*5~:6~'34~-5~?6~%3~$4~/5~56~$3~&4~-5~=6~&3~%4~.5~76~&3~$4~(5~26~%3~'4~,5~46~*3444~-5~.6~'3~+5~.6~&3~'4~,5~/6~%3~$4~'5~/6~%3444~+5~163~&4~25~+644~(5~463~%4~$5~+633444~+5~)63~'4~'5~/634~*565~+63~&4~)5~*633~$4~*5~%63~$4~)5~'63~(4~(5~(63~%4~/5~(633~&4~&5~(633~'4~(5~&63~&4~$5~+63~$4~(5~$633444~%5",
		"6663~&4~*566~&4~&5~%6~'4~+566~$4~'5~%6~%4~(5~&63~(45556~%4~'5~)4~)5666~(4~'56444~&566633~%4~(5~$4~%566~%4~(56~%4~(566~(4~(56633~&4~'56633~'4~(5663~'4~%5663~%455566334~(5777333444~)5677344~)56~&733444~&56~+73334555~-7333~'4~&56~/7~$4~'5~37344~&5~2734~)5~373444~$5~873~'4~(5~:7~(4~&56~;7444~&5~%6~9733~$5~%6~?7444~)5~)6~@744~,5~*6~C733~$4~15~46~<73~(4~35~>6~@7334~85~B6~>744~35~E6~;733~$4~=5~N6~97~&4~95~Z6~<7~&4~3565~U676~67~(4~35~V6~47~%4~75~V6~47~&4~3565~W6~07~%4~75~S6~.7~$4~1565~Q6~/7~%4~75~T6~27~",
		"%4~55~M6~*7~(4~15~R6~,7~&4~25~W6~)7~)4~65~O6~*744~35~M6~(7444~/5~I64~15~L67~%4~-5~K673~&4~*565~I63444~-5~F6~$3~&4~'5~D633~&4~.5~<6~$3~%4~,5~96333~'4~.5~06~$3~'4~05~-633343~$4~%5~*6~%3~&4~(5~'6~$3~&4~'5~&6333~*4~%5~&6~$3~&4~&5~$6333~%4~)56~%3~,4~%5666~%3~&4~$56~$3~)4~$566~$3~)4~'5666~$3~)4~'5~&677~$3~%4555~%67~$3~-4~'567~$3~'4~$5733~,4~$5667773343~'4~)5677~$3~)4~%566773~%4~&5~$6~$7~%3~+45~)6~%7~(3~,4~$5~,6~'7~$3~&4555~'6777~'3~(4~&5~+6777~$3~(4~+6777~'3~)45~(677333~*4~$5~/67~'3~+45~+6~%3~*455~467",
		"~%3~)455~'6~)3~,4~&5~)6~%3~(455~+6~'3~(4~%5~$6~%3~)455~+6333~2455~&6~&3~'4~$5~+6~&3~145~)6~%3~(456~&3~)45666~%3~'4~$5~&6~$3~)4555~$6~$3~)45~'6~'3~(4555~$6~+3~/4555666~&3~,4556333~/4566~'3~)4555~&3~+4~%5~'3~.4555~&3~14~&5~%3~+4~)5~&3~,45~%3~(4~&5~%3~,4~&5~+3~/45~)3~%4~$5~(3~)4~%5~&3~%4~$5~%3~,4~&5~&3~14~(5~'3~%455~'3~*45577~&3~+4~(5~$3~/4~$5~%3~'4~'57~)3~)4~,57~'3~,4~(5~(3~&45~&3~(4~(53~*4~*5~$3~+4~&5666333~,4~+5~$3~-4~,5~(3~-4~*566~'3~'4~'56~'3~.4~*566~$3~.4~'5677~)3~/4~,566~&3~&4~*566~$3~+4~,56",
		"6~%3~%4~*566333~*4~.5667~$3~14~556~%3~(4~+56667~$3~(4~+566~%3~-4~356663~+4~'566733~'4~.56677~%3~.4~,5666733~(4~.567~)3~'4~,5~'677733~-4~-566~$7~&3~+4~35~*6777~$3~)4~,5~(677~%3~'4~.5~*677333~%4~,5~(677~(3~.4~35~&6333~&4~/5~/633~,4~+5~)6~'343~)4~+5~*6333~'4~&5~*6~$3~-4~,5~)63~&4~/5~/677~$3~*4~-5~(67~&3~.4~-5~&6~$3~&4~+5~+633~&4~(5~&6~%3~&4~.5~+6~%3~*4~,5~'6333~+4~05~$63~%4~05~*63~'4~,5~'633~*4~-5~*6333~(4~05~%63~-4~(5~'63~-4~%5~)6~$3~)4~+5666~)4~,5~%63~(4~*5~%63~(4~,5~%63~$4~(5~%63~)4~.5~(63~$4~-5",
		"633~,4~*5~&4~)5~%63~'4~'56668~+4~*56668~,4~%5~$68~&4~05668~,4~'56~(4~'5~%6~(4~)5688~'4~.56667~*4~+5~$67~(4~*566~&4~*5~$68~*4~*56788~-4~)5667~'4~)566~(4~%5~%4~%566~)4~*5~$68~*4~&566844~(5667~)4~+566677788~*4~*566~$8~(4~'5667~%4~)56~&4~%566~$78~)4~%56~$7888~&4~&56~%78~(4~(5677~$8~*4~'577~$8~&4~*56~&7884445556~%78~(4~,5777888~(4~&56~&7~(4~&566~'7~(4~*56~+7~,4~'5~%677~'4~)5~$6~$7~$4~*5~$6~'7~%4~&5~$6~%7~%4~'566~'7~(4~)5666~$7~)4~%5666777~'4~+5~*6777~$4~+5~&6~$7~$4~*5~(6~$7~&4~*5~(6777~*4~)5~(6~$7~%4",
		"~'5~'6~&4~)5~$67~$4~&5~(6777~)4~%5~(67~&4~(5~,6777~)4~$5~,67~%4~(5~(6777~$4~$5~&677~$4~*5~&67~'455~&6744~*5~&674~&5667744~'5~'6774~&5~$6~$5666~$5~$6~$5~&6~$5666~(56~'56~+5"
	],
	XL: [
		"0ddbbba~$9~$877765656~$43454334362525523213413100101213f10eebe0f3ef0d12352de0b3d00102f1d230e0cfbfbe004e78bdf01bc234bdefbcf179bbccd25424699aabbcd3344cdf234579aacefdee4556788bdcde124adf0234689aabbbcdf00112df0223545667899abdde042223345677899abddf1516f0112223467aaabcbdddef019b034122334456~$7889aaabcddeefff~$05013deff002233556788~$9aaabbcccdddeeefff0f00117113445568de011244778~&9aaabbdcdefeff012225118f03455566~$78~$9aaabbb~$cdd~$eff00233df4566899f12235566777888999aaabbcbccddeee~$f00~$1234002269bee0122",
		"4566677888~%9aa~$bcdd~$e~&f0011121~$2412b0011222456e012556676778899ab~$cdd~%eff0011~%2334437ef1123455679ab01112~$566~$78~$9abbccdcddeff~%0111~%23344560b122456778aabf0102224466687888bccedeff000111~$23335559bcdf02344~$589abcdef0122445666~$789aabd00011122~$3~%4547ccdff00015467989eff02244556777dff0~%122~$3444565000bbbcd2345558abbd11223~&56687899bef0001122233344556f0102bcdf00f22346778899bbccc1112233356689cef0011212233434~$500044566cdf022244667888acdff01122334555~$6fff011123343344455~$670019cdf0223334",
		"455568ce034455667eef~%3454555~$67f00069ccddf01113444788acdd012334459bceef1~$233344555656778f01245bcdeeff01112233~%456668abbcccf0122445689a00f112344545556677f12~$abbbddcdeeefff0011456688899accf001112333455589acce0112323344545556678f0011239bacdddee3366788adcdf0123344578899ac011~$3444~$5~$67789fabbbcddeeefef001121235566778aaabccc01223689a223~$4555~$677888f00168ababaabc~$dfff00101113334445566889abcccdeef0112223~$455890112333445565666778ff0f11367d999aa~%bc~%de~%f01112123344455667778899aabbcf002232335",
		"7812223445556566677789f99aabcccdcdddeefeff00113344567778aabd00011232255422~$344545656677788f2ad8889aa~$b~%cdeefff01122333444545566677888999bbbcbcef01212555667822323344455~$67788899eff4a66789aaacbcdddef00~$1223334556667789a9aacdcdff01223344556722343556667789f7788~$9aabbeee00f000134445556778899acbccd0~$12345546722344555677888eff2699bbdeef011224344467778889bccdef0011~%2423334555666777888f1247d6999aabbbcddeef000111222334445678899acdddeef001456233344~$5656778899aff018d6777888bfff0111222334566778889aa",
		"acbccdff001234544aaa334456~$78899f246d5556779ff00012223355789bbbcceef0324bc33~$45565~$677~$8f14df456679011121222444~$56667~$8999aa~%bcccee01224559abac~$56667~$89a2189c3555666ff01112344555667~$899a9ac12~$3456999aaab33~$455~$679991274556678812333435677878889~%abbdcdd~$01399aa9aababcc4566~$78889455bb3344565~$23444555656899abcddef01~$9abbbcc44455666~$7889035533445672~$4556688999aacdf01~$9aa~%bcc4~$5678878889612234aff144559bc22345556677788899~$abcdeee11269aa9aaabcd56767778889361233435556788abee034556",
		"676789abcccddf11~%9aaabbbcc5~$677888912a11~$2333446~$89accff034565678999~%abccde1~$9aaabbb~$c66677898a6abc~$24445688999aabbce01344555656~%788999aacdeff5699aaabbbccdcd6667~%89170111~$23~$46~$7abbd~$34445556~$788899aabbcdee69aa9~$abcccd77789111228abccdf1112223233344455779abbcd04566768899aabae2999~%abbccdd789137e01122233345678b14~$56778899bbccdddeee1249a9aa~%bcccd7~$81235bbef111223334556677a123455567788899aaacdeeff112339aa~$bccc7880179cc111222346767123545676778899aaabbceef334abc889279bcf11212233446",
		"722445577889aabcdde4b869bdf11123233352335556676889abbcddef1345810168af0011122334454533445566778899abbbc~$dee03561267778be000111222323444556334445667788aabcccdef550222799abab00~%12244455bcc56667789abbee5456355789abccdeef~%0112334345456bab45667~$8~$abcde723345abd~$01112323~$45bb445~$6788bcef67a19acdefff00122334456aaabbcc4567788899accd699ac22aadf~&01112223334445abb~$c3566678899acccdeef08bccc2335df~$0112233499a~$b5567889899aabcccd6889abcbccc3889bdeff01112122333449aaababcbc34566778~$9aaabcde0788abbcc",
		"dd123acdd~$f011123334459~$abb~$cd4789aabbbdde0187bccd135699bfff00~$122232349~%abbbccd666899accddf8bcccddd289abdfff0001222323344459aaabb~&cdd6678788999ab~$cdf099cd2358beff0122~$349aaababbbcccddd6677798~$9abef007bcee1558aff01113339aaabbbcbcddd769aabcddf17ccdeee346699aaac00111223454999aabbcbcccddd78999accdddefff7bcdddee24bbcd~$ef0001112233399~$a~$b~%cde67889~$acdddef01aabccdddeeef~$2357899adeef12123349~$abbbccdcde7778899abbcf677ce7899be0001~$23445~$ab~$cd7789aabccdef0166acddf2333cf~$01112233449aacc",
		"cd5~$78899abbccdee11689deeeff123399aabcef0001122335aa~%bccc667778999abcdff067dedf19bc0001122~$349aabbcccd6688899aaacdeef066bcccdef00113389bbceff00~$12233357bb79aabcdeff017aefff012234abbf001213344557667~$8999a~$bcce6667cde~%0244567ff00012567778899abbcdd005bddef0001014466aff000112666778~$9babccddf16abcd010222447bf0f000111223446~$8abccddef5556deef0002345799ff02224477889abacff567ff0f022235789aff10112335abbcdd5678bde1112334f11133445567~$8bccbcff145~$677accdee001234599e0f011445778899aaddf05667789accef",
		"f0001127eff112124557899aaabcddef05688bbcccddeeff0122334566ee0001122335668889aabcbccdeef77788bde1122349ff1476899baccce5677888bcddef001269ff01455677788999aabcdeff567~%8cdefff11133455ef00112356777888abde~$56678~$9f0111212fff0112378899a~$cee0556667~$899abcdff1234578ef0111245566788999bbbdee4667889ddef0111656eff012235666778abbff557678889adeff2237eff00112256779aaabdeef45566767888bcdff001124477fff00566~$7899aabddff01567779dddff0123347f011346677799aaabdef666889eeef01457ff023789babbccdef05566abbdeff001233",
		"401156667bbcdf545~$677df0134578ff0256aaccdeef04455656677c1233458fff11123568aaccd046679abdef0001122455eeff12456779ccdeee~$5667adeee0012333899~$f1255568bcccddf445666aaccddfff1238eef0002466769ccf4455cddeff022329e026789abbcddeff4559ce40011344addf4566abcef0010123000111357abe0445479aabeff00011234e~$f024456a05689bcdde112335ef0123358abbdff045bdff2ee00112669aae045aaceff0033445567eff0122448bcef00556cddee0011226eef00243589bcdff04dddef010113400112233667abccef55c0011123eef001144aacdeff44ef0055dfee135258abcee",
		"1455ef01124d48abdee1125cdeff112e369acee6eff144456acd145bf01224568bce05bbc013479deef55ccdf12568bdee0abbcdef0389aadff49aacdee239ee458bbcccdf089ce5559aabbcf1133ddd15aabbcdf0236be159aabbcccde013793589bf029dddf069aa~$cf177abfabaddeef124abbbcde559abbcc12899dee05bbcccd07ccdf55889bcdddf17abce03bbccddf1155899bef0259~$a~$bcddff189cdffbbbde023399cccf018aabbcccd2378df0699abcccdddef7cd0499aabbccdccdde15aadee89aaabccc~$d0009bab189abbbccdded22abbdefff2669ababccd6ef089a~%bdd08acce09aabbcccdbde1226899abccce025bb",
		"beff12689abbcddee1d169bbbcbcdddacf0118999bcddef1679aabe2698bbcded159adff022899aaaccde0cee0f01169abbbccce58aadef0022899bbdd156d126689abbccdd115cdee0878baab~$cddeacdef012abd9acdf079ace19aeff02889bbce48cefff018999abcd24bde00088aa~$bccde89bbe017accddde0aacef189addee06bbde1112299aacd007acfff1299bbc205cef889abb~$cd129bce13aaacd2fbddef188accc267dcef00889abcc378cdee889bbbcdd9abdde~%f0cd29ccef2abcd29cddeee028aacddbbbddeff10089accde8cd01299cd4bcccde~$01acdd29d~%eff09abd~$e8adf0111abad38abf009aabbb~$cddeff",
		"b9aaeff9bcdcdff4419def09ccee599bf000199aabc0459a0f0099bbeeff709abccddeff~$0369b00bccddeef01000abcc22459af00aef05df88990acdeef4da00df234555ee78fbbdddfff14655d17889000bddf011456f690ddeeff~$057e9a01cdf0344555688cd7789000bcdf0023456771cff00017bd279911bccddf~$05569778000cff00013456bdfd5787911cfff000145667cf566788111c00056667d3e11eff000112445566affde8789af05678bdd89f2~$02~$5678cdff237369a1322~$011355666799abbf2233222f01255667778bccd0123ff045567abe789f03~$67778588b24056566~$7a9d66788b0003434546~$78bc14",
		"588cdf01233556667f358877bbef21445677677788033979cdd001455667778908ace69bdde0135556778778abde0123456677888d1899abbd22345~$6~$7889abcd468bcdf13337833445577888259d689cdddf2468877~%899c22abcd45788adf012123774456777888249e66789abb03335656677880007ccd688af034557144666787~$899fd8aeeef113455566677745668889927bbe12378bbccdedeef12123456356566787889679ce24679abcd00224545564678859e37888ac~$deff12246333465667788def4799b446799aabddf01222455435635777888b069b034778abcddf11223444567733441557688bee1248bee0689ccdd",
		"eef02467a452455787459ad789abbcdddeeff0113444552335334678c0df12577888bcefef001113343444678913334777bc01468edeeff25899bcdff0023344456899~$abccdef0f35787f4ce4466789bccdff02333~$4555789abdeff34567bbf59de0134669accdeeeff00123~&45556abbf5667784ccff1346799bccfff0011244~$5~$7899a9bcdeeff23556cd589e2234668addee0012233455789aaabbceef588358af233557888bc~$efff112234559899aabcdeff04777be1aabbe13555678cf~&01243~$467788~$abce6687bbc9003478abccfff0001123343445566887899bbbccddef4677859bd134566799bceeff0012223445",
		"6767789abbc56ce157bbc222578bcdeeff012~$3444556667878899aaccdee2767dfaabff112578899bbcef001134556667789abbcceee22566628cc23479abc0~$1222557789abcd3477801e~$f035678bbdeff011333455668788aabbc34~&6de8ee145777889bbee012344677899bb34577bc012567acdef1333~$46889ac4566ef178acef01113455667d0013445666788aa4556602ab01245af00123~$456779a4bcdd0462444688aacf~%1225566899aaa51133ae023444679ab~$cdef123357788995e245abdef~%011234~$5778899c0108f45de1224445667aceade233455579aa134445668f1236aee5669bbc002334445557779e3",
		"0245799bbe0f3~&45588f269cdd147aabdcf0011134667ee24cf556abbceef24469f34ad1448ceeef0123467d01357cdf135599cf11224456d1237c2235688aabddeef334~$56ff1769cf9abfff00113444dd77bbcef1469adde344677d45bcef14ef001~$46678e25ab133569af1137cf7891239e244f34ddee1248ddefff140035bf139abd124562357abe0234569bdee062dee15679ef024450adef177aabdf001246d0099cdee18f104fff24789cf046bbdddf49bccdfff01411359bee135678e45de026eef112deadeff1355678b8dee2aeef04456ef01abccde167def227789cd014689ceff2258bcdf23de2455df458adff22dd9accde",
		"f12bcccde11f7abddef1238b01d9abef2ee00dfe07aaceefcbceeeddf2258accce1ace7d02598ceef19abcddee5ae78bcde09~$abbccd~$ef67d78999a9aaaccdeef3889abd01456817778~$9aaabcbf8bde128abcf77~$89899a9abcdddefef001458666777~$8999~$adec000158bcf4666~%7~$89~$abe6cc129d3454~$56~%787888~$9af00688be03458aef~$344~$566767778889899aa0bdddeef059aef1123344~$5656~%7888~%9accf99bbff011242233~$4~$5~%6~$78899ff029d0002311~%233344545655~$67788899896bc456acdeff012245788011~$233~%4~$56667677~%8990104688999bcef000123444700~$1212233",
		"3~&4~$5666777~%8aff0cdf4789~$bcccdeeeff0101~$233445566889f0011~$2~$34445556677788999f17bcddff02669bbccddedee~$f001101112223~$4556667778899ef~&0111~$23343~%45566~$788ffe00136788abbbcc~$de~%f0011~$23~'4~$5666788899beeff0011~%2~&3445556676787898011799ab~$cdddeeefef000111~%243~$4556667788899bbddfeef~$011232~%34445666778788ff68df23455666789aab~%cddeeefefff00110112232333~'4556667778~%9bbccc~$eff0011~'2~$344556677780134cf0269aaababcb~$cdedee~$f~%011121222~%3~&4555~$677888~$9aa~$bcccdd~$efff~$011~&23334",
		"44~$56~$780126bf668abccc~$d~%eff0f000~%1232~%3~&4556556~&788999abbbccdd~$eff0f00112122~$344~%566701349cce169bbcc~$dedde~$f00011212~$3~&4~%5666~$78899899abbcbbc~%defeff0~$122~$3444555667013bd45899~$abbcccdd~'e~%0111~$2~$3~)45556676~%78999aab~$cddeeff~$011~$233344566671045ce02579aa~%cddedeff0f000112122233343~&455~$6778788~$9~%abcccdddeeefff001~%23334445601157579~$abbbcdddedeefeeff00~$1222~%3444~%5667788~$9aa9aa~$bcdcd~$eff0001222333445701df5688aabccdddeeeff0f0111~&23~&4555~%6~$78~%9aabbccbcdddeef0",
		"001~$2333446608aaf06879~$abc~$d~%efff~$011221222~$3~&45556667778989aaba~$bccdeeefff001112~'344456014bf00134559accddeedeefff00012122~$343~%4555~$677888999a9aacccddef22233444561123578f02569abc~$deeeff~%011122233343~%45656676~$78899aabbbc~%deff001~%233340011bf036888acbccdeeefef~&0~$122233343~&45566566~$7~$8999aaabccddedeef11121234402234ceef114578889abbbcdeefefff000~%12233343~%455566777898999aa~$bccdeeef00~$2333425011235699aabbdddeef00010~%122~$3~$454555~$67778999aabbceeef001123343ff00113568cde~$f~$",
		"01223323343~&456767889aaabbbc~$def02466789aaabdfefff00~$121~$2333~(45566777~$9aaabbdceef1028bf00133679abeff000111~%2~$3~%4~$5666~$788~$9aaccdd0f001acf07789acddf0f000~$122323~)45556~$789899aaddeeff3ee8accdddee~$f01122233443~%455566677878~%9bcd~$efff04556b0488aef~$0112223~)45~$6778989abbddeef011268017899ccddefff001233~&4545656678899acddefff0046c013668cdddef0012233~%45566779bbccddeef23567af0378899bbdedee111223445677889cdeef13355ab0344556899abbdef112344458889aeef0f016f8dfff1224445678ddeef23679e03456",
		"8af0012466deff00447b267deff033444dfe011444566b0328f234457deff0003680566aa0034def0234624578aade3ddeef00245567778a668bf134deefe03366a45780deee01133468f336f12cdee000156aab557899f123ddef01459abcf02357bd00222466cdef013558ae012347cdee112235556688924666bf05ceff004566736dd5cf00111356abde336d24355cd0f00012344459aceef534bbde0144778bc1667e3637d035581368cf34451344bcdef01124579abfe02233568f11122cccdeeef~$0125558bc037d0223446789ce1223344deff0188df1382344cdf122bcdddef0112368b68acef2467bccedff012bbde02244688014",
		"7789ddef014bcddeff1223567ad001336bcf02ddd0023224467238f01134466~$8cdf1bbcefff0001126779ad001489beeefaccee01~$2337b1d1223445567789bbccddf0bcdff16~$78ac3d379abdfbbccddeef034557889adf1337ff228abddeeabcfe0379bcde11058999aabcdbbddeef11789bbd0147f3467abddf0122366be34003677abbcccdf0112223233456779aa6f45678cbccdef012578923594457899aabdaaccff1122777899aabcccf02347899acabdef1122578f53cdeeff24567adef23389aeef00179be223e246799bddf002357acf06645799bce1166799af334457999aabdef2578bbbf225344699abbcddeef~$14458~",
		"$acef027135aaacce0125577bdeef256add11223~$8999bbc04599bbcef0249abbff001abbdee1255989abbc11389abddeef002244599abcce4569acdee0034455668a9bcdfe133455abdef0117abbddef0354789aa99bcce022479aabbce49abef00889bce1588cdabcdf112235699bbc116abc99aacbcddde00012344578abde29aabddeef234ae11468abbccde1279bbcde1114c9aabce039df225a9bcff0002449accde0118cdabbdef1234678aaaccbddff001268ad99abcde355bc1f9bcccdf0123456ddf47ddaaadee1223689ccdd1134456cabbf00044789ccdeeef04469abee12bccce0123889daccdeefff012246def112323578ab",
		"dc9aaccdf01155779ddee0259abcc899cceff36cdefe99bcde23499ccf13779bcca034669eeff0023799ddeabdf01244accdde12347a001adf01123345cdff022336788ceacef1223566699ddf002345579bdf8~$acde111244568bccd1~$46899c029bcddff2229dee025568b2accdeef0013446689cdef11355566df349def0222446667adee112459c09a8acdeefff01123579aabceef02234699aacc14abdcdf32ceef0113334577019cdf012345789bc03334568aabd049ccdf37abe124457779e248ef04567bbdff00123245676dde48abfef11222344589bbeeff00011233355566999acde69acee0024458f22334579cde0464ccde12",
		"368bcf012336679bf019cddf~$01334577ae012213345468899abbc245c12244479bcf1113368022cd1234ace1112334455778d24259cddf1245899abcdeef00122567899c2cd1bf123445691333446668beefb199bbddeef025acde03336688bdef144468d123af11334456679af002578a9abbce8b00129aacdd1223359acde0144556778999bceeff02334567ad012ccde115889dde0133555669bd23457aef11bbccd122236d34567799abdfef134569bddf01abe0012713448aabbdee0123488d029acccdff1115588abcddff~$2343567abbcccdff148aaebef33457b03345557888bbbe022234456669ceeaf0112223688ef36679abcb",
		"ce0112379eeaaacccd0f123368bef1223356678b123447bbcebbf2347cdd11459c0024779cefacff1246899abbcde126678accdef113357bcdc34799f0112468899bddef0002233456689ad01adff0134999aef0355777989abe1235589b0ccedff01344599abccff02247~$9abbb0435cebdef22446713358899adf01123589abcdf079cce1233457b38aabcbcccd1367aa0346789abbbcdf011224567abbccee011358abcd126699bbcdff344567dcdf01225569acc245778889abceeef049ac4789b24445566~$7899b00125569abc1489cde0123799bcddf13345cedf00135aacff145677abbcdde0023466779cde1357a9af12246779aab",
		"bccdd48aacd02378abbbceef488aaccd0334667d1133367679bde24bcd01124489addee0003457be11234569bdf3582478999df1366679aceee0129ae12446679223478abcf016aae2588aacf233679aacdef01237f0ade79aabcee01446e1159aabdf0126668abbddef33455899f2acd0024678acdfff4ef012344678bde446aaccdff245aaf00127bcbf02244f369adde1589ade16601123699aaee3447bbcdee3660001445669aef59ade114610368cf23456679abcddeef25~%026579cde247778c012356aff079acde23344146899ab1227bccdf1001137acd022335669cdeff136f227788bbdf337899bbbde0156f12237dff0455679ab",
		"d031229df05556779ce02440122567abbe44668cdeef3f00223467889bdde12667bcde23f237acdf0446687de0239abcdee599bf49cce5699b013348abcdd4499a9abdf1124045588accce025cef2204d13344acd34f3348abccf01136669cef01279f024659abccdf133666acce2401125778bbbe356799b04f4adef2447899ab4556bce5569c2289df24467cdeef025892677f002899bcc00469c067eef167ccddef12467abd1ef0001579bbcdddf789acde7f0012778abf2235669abb44678cd01bce58f0579cd068bbccdd55577799bccdcdf00099abcddf06abce0223eef779abeee14887922479cdff78befeff02458abbde23368cddee",
		"ff7788aabcddde0489acf01344ce78cdefe145889abc2345045ea9dd056abbcddd003f233457d8aade4578bd348d1448c88bbc27abcdd1301133bb9acbcddf25689bcde48f225c999abcdee4abdf4cc22b9bcddff112478bceef01345789ae23389cf011226abeff22378d2268beee00134558be034799ab0112bcefff0344bbbcde24478bee22899bbccddee1246~$ad0013456755889bbcd1aacdff34467ddaabcef234568dee34cd0aaab2579be133579cf022aabccddde2ccdd045568bd6bbccef015898ae0006678abcee344bb~$cdde24de02244656889e2bddef355788de2144688e126cdee04ae00abce06deef233479addf144bbd2e",
		"ee~$f0014bcdf5df00112359ef1134bc3f1243891d22ff02225df0113def02f2257dd1ddd033712334ef001247bf110012458e00256deefff057ef677079acc8bccdc"
	],
	YH: [
		"~.121~:2~~3~134~)34~$3434334~&34343444~$3434434333~%43443434443~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~~4~R45~(45~,455445~(455~'455~%45445~&45~$454445454445~$4554544~%544~&544~&54~%54455545544~%54~$5454~)54~&54~&5455545545554~*54~/5454~~5~~5~~5~~5~~5~~5~~5~~5~~5~~5~~5~~5~~5~~5~~5~~5~~5~~5~~5~~5~X56~25666~%565656556~%565~&6565565~$65~~6~~6~~6~~6~~6~~6~~6~~6~~6~~6~~6~V67~,6767676~$767~%676766~$76767676776~,76~~7~~7~~7~~7~~7~~7",
		"~~7~~7~~7~~7~~7~~7~~7~~7~~7~~7~~7~~7~~7~~7~=78~&78~*7~*877878887887778877~'87~~8~~8~~8~~8~~8~~8~~8~~8~~8~~8~~8~~8~~8~~8~~8~~8~~8~~8~~8~~8~~8~~8~~8~~8~~8~~8~~8~~8~~8~~8~~8~~8~/89889~%8999889988989888~&9898~$98~%98988~~9~~9~~9~~9~~9~~9~~9~~9~~9~~9~~9~~9~~9~~9~~9~i9a9a9a~&9a~+9a~&9a99a999aa9aaa9a99a9a~%9a~%9aa99~$a9a99aa99aaa9~$a9a9a9a9a9~1a9~~a~~a~~a~~a~~a~~a~~a~~a~~a~~a~~a~~a~~a~~a~~a~~a~~a~~a~yab~(ab~.abaabab~'abaaabbabaaababaabbbabbabba~)babba~~b~~b~~b~~b~~b~~b~~b~~b~~b~~b~~bb"
	],
	YL: [
		"699abccddeefff0f1133244556677789~$accddde0222343~$4555666~$7888~%9aaa~%b~'cddcdcddedeed~%ed~&ef~$ef~$effe~$f~%e~5f0~)f0~$f0f0ff0~&f0f0f000~$f0f00f0fff~%0f00f0f000f~601~&01~&011~$0100011010~$10101100~+1011001110011101100110010~:10~110~$12~012112121112~+1211211~$2~(122~$1221112~$12211222~$12221~$21222121~*212122111~'21221~$21~&21~%21~$21~%21~)211~021~923~'23~$23~%23~%232322232223~-2332223~%2323222332332223233~%23~'233232323~$2323~$23~%23222~$32~(322~%32~$3233233223332~(3222332~$32~-32~$32~A32~,34~",
		"&343334~'34~+34334~)34~%344344~+34~$343334~$344333434433443344~$34~&34433434443434433~%433433343343~$43~&4~$3434433~$433~&43~(43~$433443~%43~)43~945~,45~%45455~'45~(45~%4545455544455~'45545544555454445444~%5454~$545~%454544554554545554454~$54454555444555454455544~%54544455445554454~)54~,54~&544~254~$54~'54~=56~+56~'56~/56556566~%5655565655655665656555655656~%56~$56~$5656656~%565665556~$5~(65656665~$6555656556556656556556665565556656656565656565~$6~$56566565655~%65~%655~(65~)65656656565~+6565~,65",
		"~A67~$67~)67~%67667~)67~$67767667~/676667776766766~$7667~'6776766677667~'67667666777667766767~%6~$767~)676667676766~%7677667677767776767676676~&7~$677676~$766676676~&7677677666~/766~$76776~'76~576~B7877788~)7877788~&7878~-7878778~'78778~$78778787888~$788877888~*787778~'78787888~$78777877887887~$877877~(8777~)8~$7878787~&878887~(87~*87~(87787~%87887~387~389~%89~G899~$8989~-89~)89~&8999889~&898898889998988988999~&899~'899~(8998~'9898989989~'89899989898889998988988998989898998989899888~%98989998~(9",
		"8~$98999899899898~S9a999a999a~%9a~)9a~'9a99aa99aa9a9a~%9aa9a~$9a9aa~'9a~%9a9aa9a9a~&9a9a~$9a9a9aa99a9a9aaa999aa9a9~&a9aaa9aa999aa9a9~$a99a9a9aa99a99a99~%a9a9~$a9~%a99~&a9~+a9~$a9~)a9~%a9aaa9~%a9~Rab~5ab~$ab~&ababb~$abaabb~$abbaababaabbbabbbaabbbab~$abbaab~%abaaabab~-abaababbaaab~$a~'bababbab~$ababaabbabaaabaabba~$babababbbaab~&abba~0ba~*babbba~,ba~%baba~(bc~&bcbbcbc~0bc~%bc~%bcbbbcbbc~%bc~%bc~&bcc~+bcbccbbbcbcc~$bcc~$b~%cbbcbcbc~$bccbcbcccbcbbcccbcccbbccbbb~%cbbcb~Dcb~)cd~)cdd~)cd~3cdd~$cddcd~(c",
		"dddccdd~$cdcccd~'cdccdddcdddcddcdccddcdcddc~%dccddccdcd~$cdd~$cddcddc~4dc~$dc~%dc~&dcdc~%dc~'dc~4deddde~1deddedeedde~&deeededeeeddeeeddede~$deedddee~&deeede~$d~$eded~&eddeedeeed~&eddeeedeeddeed~'ed~.ed~)ed~)ed~'ef~'ef~;ef~)efeef~'efef~$efeff~$ef~&efefeefee~$f~%efefefeeeffef~$efffeee~%feffef~%efef~$effefefefefefefefffe~$fee~%feefffe~)fefffeffe~+fe~1fe~9f0~(f0~,f00ff0~(f00~'f00~%f0ff0~&f0~$f0fff0f0fff0~$f00f0ff~%0ff~&0ff~&0f~%0ff000f00ff~%0f~$0f0f~)0f~&0f~&0f000f00f000f~*0f~/0f0f~B011~&01~'0101~&0",
		"1~'01~%010~$10001000101~$0111~%010100010~)1010~%101011101011011011010~$10101~%0110~$1010~*10~'10110~&10111010~%10~.12~112~&12112122~,12112~&12121112111222121112211121221121122121221121222112122121~&211122212211~-21222121~*21~,21~:23~.23~$2322322333232~$3233233233222323~$23~$2322323232~&32332232233233233223~$232333232~E34334~%34~33433344~&34~$343443334343444~)34~$343434443444~%3443334334433~$4343434333443~*43~$43~'43~$434443~(43~$434434443~)45~745~%455454445~$45444545~%454445545455445454545454554",
		"~'5~&4~-545545554~$54454~&54~)54~M565556~%565565~$6~*56655656665666555666556565~%65566655~%656656665665~'6556656555~$655565665665~(65~&656566556665665~-67~267~'6766676676667666766767~+6~&76~$76776~'7676766~$76767776~%76~,767776~078~078~%78788777878778787778787~$878787778788778887778787887887788~%7877~$8~$7887888787887~'8787887~$87887~'89~989889~,898988~&988898~%989888998~'98989998998~(9888998988~(9a~$9a~59aaa~$9a99aa99a99aa~&9aa9a9aa9aa9aa9aa~$9~&a999aaa9aa9~&a9a9~&a9~3abaab~%ab~'abaabbbaaabaaab",
		"aab~'abbabaabababaa~*baba~$baa~&ba~$baabba~'bc~,bcbbb~$cbc~$bccbbb~&cbbbcb~'cb~$cb~1cdcdccdcdcdcddcdcc~$dc~$dcdc~$dcc~,de~/deeddee~'deedeedeeddededeed~&ed~$ed~6efeeeffeeefeeeffefefefeffeee~%feffe~+f0~2f000~%f0f0f0ff0~%f0f~&0f0ff0f~$0f~801~$010010011~$0101011~$011100100110~$1010110~$1010~+12~&12~.12~*1211~$21212112122112221~,23~*23233~&2322333223233223332~&32333222~$32~234~/344333~$4~$343443334344344~$3444344434434343~n45~)45444555454555455454545554~$5444~B5655655655656~%565556656565~'65665~%65~)",
		"6766677~'6777~$676776~$766~,76~)76~*78778~&787887788778788777~$878878887~4899989~$8988898998~&98998~(98~19a~(9a~(9a9a999~$a9~$a9~%a9~:ab~'abbaabaabbaaba~%baaabbabbabbaa~&bc~'bcbbcbcbccbbbcb~$c~%bc~$bccbcccb~+cbcccd~+cdccd~)cd~&cddc~&dcdccc~&dcdddc~(dc~,de~$de~'dee~*dedddeeeddeeededddeddd~Jefeefef~'efefefefefeefefefefeeefefffefeeffeffe~+fe~,f0~,f0f0f0f~$0f0~%f0f0ff~$0f0f0f0f00f~,0f~/0101~$01001000101~$0101~(01010~$101001110~&101100110~%10~-12~'12112~&12~$1212121121221122~%1~&211~121~%211~&21211~.",
		"23~'23~-232232233233233~$23~'23~$233323223322323322~%32~$32~,32~&32~&34~<343334443344333433433444334443343434~$34~$3444344434434443~$4333443434433434443443~$434433~>4544455~$4555~$45~*454554555~$45455544544545~$4545454544545454~$5~%4545~'4~'544~%54~*545554~$54~$545554~'54~&5656556556~>565565655565556~&56~*565666556~%5~$65565556566555~$656665665~%656665~$655665~'65~%655655~;655~-677~(67667~'67~&67667~,676767677~$6766776~$767~$6767~$6767~&6~%7666767766767667677676~&7666~$76~(76~'7676~%76776~)7676~",
		"%76~-78778~&78778~$78~%7888788~*78~$788~&7877787~%877788878878877788~%78877787~$878877787787788788~$788877~*8788878887~(87~:87~:898889~,8989899898889889898899~%89~$899889888988988989889~$89988998988899989989988998899988898998~*98998~(988~)9a999aa~)9a9a~69a~&9~$a~$9a99a9a9a99a9a999~&a99~&a9aaa~(9a9aa9aaa9~'a99~>abaaabaabbb~$abbaaabaaabaaab~$abaaabababaababbabbaabaababbbabbbaaba~$ba~$babbba~&babbaa~-bc~%bcbbbccbc~%bcbbc~%bccbbbcc~%bc~$bc~$bccbccbbcccbcbbcbcbccbbccb~(cb~&cd~6cdcdccdccddcccdcdd~&cdc",
		"cc~$dccdddcdcddccc~%dc~/dc~(de~%de~$de~%de~$deedee~$dedededdedde~$d~(edeeedeed~%edeeeff~$ef~1effeef~%efefee~%fefffefefffeee~,feff0~&f0~*f~*0ff0f000f00fff00ff~'0f~/01010011~%0100010001110~+10~%10~112~%122212122121212221~%21~%2121~/21~/23233222322~%32~$32~%32~&32332~$322~-3434~%3433343433434433434334~(34~$3443433434443~(43~,43~545~*45~%45~$4554545554445~$45~$45545545545554~+5454554~-54~(54554~-56~.566566~&5655565665666~'56665665566565566656655565556555656665~$6565655~&6566656665566656565~&65~%6566",
		"65~>67~067~-6766767~&67~)67~$67~$67667677667767~%6776667766767676677667666767~$676776676766777676777676667776676~)7677666776677~$6~&766776~/767776~,76~,76~4766~*76~(76~&78778~&78~*78~A78~&78~)78778778878~%78~%7877887778887887778887778778~%787788877878887788878877788~%787787888~%7878777887887887788~&7~%8788878787~%8778~$787878887~&8787788778778887~&87~%877~)8788878887~'87887887~&87~(8788878877887887~587~$87~$877~%878787~%87~%87~%87~)89~(89~0899~/89~(89~%898889~*89~$89~$898899~$89~-89989988899~%89",
		"8899~&89~&8998899~$898889~%8999899~%89~&8998989988~&9~%89989898998~%9888~$9889998~%98~&9889~$89988~'989988~&98~(988~%989998~$989998988998898898~:98~*98~$98~'989988~498~%98~%98~$98~&9a~'9a~%9a~49a~&9a~'9a~*9a~)9a~(9a9a~%9a~%9a99aa99a999a99a99aa99aa999a~$9aa~%9a9aa~'9a999a9aaa999a99aa99a9a~'9aa99a9a9a999aaa9aa9~&a99a9a9~%a~$9a9aa9aa999a9~$a9a9a99~$a9a99aaa9aa9a9a9~$a9aa9a9~$a99a9~&a9~(a9~*a9aaa9~&a9~(a9~.a9~3a999~&abab~.abaabaaab~*abb~-ab~$abaababab~0abaab~$abb~&ab~$abbbabbabbaaabaaabbbab~%abbabaa",
		"abbbaaabaabababbaaab~'abaaabaa~$ba~%babbbaabbaba~$baa~%b~$ababa~&babbbabbaabbbababbbaaba~&baabbbabbaab~$a~)baaba~-ba~Obabbc~0bc~-bc~$bc~&bc~-bcbcbc~&bccbcbbc~(bcbbcbbcbcbbbcc~%bccbbcbbb~$cbbcbbccbbbcbbbccbbbcccbcbcbbcbb~$cbcb~$cbbccbcbb~$cbbcccbbcbcccbcccbbb~)cb~$cb~,cb~/cb~6cd~.cd~*cdccdcdd~&cd~'cdcdcdccdcd~%cdccdcccdddccdcdccd~$cdc~$dcdccdcdcdccc~&dcdc~'dccddccddcdc~%dccc~'dcdcc~&dc~'dcdc~$dccdcdc~>de~.de~$de~'deddededdeededdede~%deededededdee~%deeeded~%eddeedeeddd~&ed~&e~$d~*ed~<efefefe~$f~%e",
		"feefeeefeffeeefeeffeeffefeefffe~+feefe~6f0ff0~%f000ff00ff0f0fff~&0f0f~$0f~%0f0ff~201~/01001~(0100101~$01110111010~%1010~$100010~110~;1211212121112~%12122211211~'21221211~A2323~82323~%23233~&23232223~$23222322332333222323323222~)32~&323332332~334~+34~&34~$3443334~%343~%4~(3433~&43433434344344343434433~$43~+43~(433~-45~045~&45~%4545~.45544555455454454~(54544554555455445544554454~%54~)545556~/566~%56~&56655565565566~(56655~$6565655565566~$5~265~867~167~$67676767~$677676776776766~%7677676~(76~+78~$7",
		"8~0788778788~%788778887788877877787877~%87~&877~$8788787778887~289~$89~(89~(8989889898~&98~&98998~&98998~L9aa9a9a~$9a99a99a9a99aa9aaa9aa9~$a9~(a9~)a9aaa9aa9~6ab~$abbba~$babbbaaba~%babaa~+baaabaababba~'ba~&ba~'bc~/bcbbcccbbccbccbccbbc~$bccbbb~%cbcb~'cb~%cb~1cbccd~,cdcccd~)cdccd~$cdd~$cdddcdcddcddcdddcc~)dc~Bd~$e~$de~&deddeeddeeddeeededd~$edde~%de~$deeddeeddeedeeed~1ef~-efeffeffeeefefefeeffeeffefeee~$fefefeefee~&fe~&fe~(fe~$fe~$f0f0f0~&f0~+f0~&f0ff0fff00f000f0ff0f0~%f0~%f00ff~$0f0ff00ff000f~$0f0f0",
		"f0f0f~10f~(01~%01~$01010110001010001001000101001~'0110001001100~$1001100100011101011100~(10~&10110~(10~<1221222~+12121211121222111~$211~$2~%1212211~$2111~&212221~'21~(2122111~,23~023332232323~&23323232333222323323~&233222323222323223332~$322~432~634~%34334~$34~)344~$3433433344333~%4334343~$4343~'4~&3~&43~(434443~+433~$43~$45~345~$45~-45445~&4544555455~'454445554545445454~$54~$54445444554455~%45454554~=54~&56~'56~/56~856555656555656~$56~)56~%56~$56565~&65~%65556655655665~)65~)65~(655~.67667666766",
		"7~(676667~$67677677766776766676667~$676676677676667766776~%7676~%767776766767676776~%7676~'76~(76~-78~'788~27878~$7887887888777887878777877878787778878877~$87787~$87~&878887877~%87~$877~08989~,89~&8988~%989889889898898898889~$898898~&9~$8998898998~$9888998998~9988~A9a~&9aa99a9a~-9aa999a99aaa9a9~)a9a9~$a999a99~(a99aaa9a9aaa9~5ab~)ab~%abb~$abbaaabaaababaabbabbabaabbaababbbababbbabaaa~&ba~%ba~'ba~*bc~)bcbbcbbcbcbbcbccbcbbbccbcccbbbcc~%bcccbcb~%cbcbb~)cb~$cbccb~%cb~1cd~%cdcdddccdccddccdccdc~%dcdcddd",
		"~(cddccd~$c~6dedddeddde~)de~$dedde~&dede~&deddedd~&ededed~1edd~+ef~4ef~%efeffefef~$efffeefeefefffe~*fe~0fe~%f0~(f0~.f0ff0f0~'f0fff00f0fff0f0ff000f00f00f~)0f00f~'01~*01101~.01001110010100~,10~&10~'12~:12212~&12121221121~%21~$2121~&21~+21~.232232223~&2322322~$3~$2323~%2~$3233233322~*322~%32~*343434~&34343334~'344334334434333~&43443434434434443~&43~(43~$45~)45445~$455454544554545~$454445544554445~$4554~$544~$545454~%54554554~*54~)5665556~%56~+565565566~%566~&5665656555665565~'65656565~'65~@677~$677",
		"7~&6766776777667766767776776667667776~)7677676~*78~(787778~&78~%788788778877787~$87787~$878887~%87888787887787~%87787~'87~'87~&89~089989898889889898999888~(988998998999898998~$989998~098~&9a~$9a999a~&9a9a999aa~$9a~$9aaa999a9aa9aa99a99~%a9~0a9~&a9~$ab~(ab~%abbaaababab~$abbaaababbaa~(babbba~+bc~&bcbbccbbbcc~%b~*cdcccd~$cdccdcc~)dededd~$ede"
	],
	ESC: "~",
	MIN: 33,
	rle1d(s) {
		let o = "";
		for (let i = 0; i < s.length; ) {
			const c = s[i++];
			if (c !== this.ESC) {
				o += c;
				continue;
			}
			const len = s.charCodeAt(i++) - this.MIN + 1;
			const rep = s[i++];
			o += rep.repeat(len);
		}
		return o;
	},
	hash01(i) {
		i = i ^ 61 ^ (i >>> 16);
		i = i + (i << 3);
		i = i ^ (i >>> 4);
		i = i * 0x27d4eb2d;
		i = i ^ (i >>> 15);
		return (i >>> 0) / 4294967296;
	},
	import4() {
		const xh = this.rle1d(this.XH.join(""));
		const xl = this.rle1d(this.XL.join(""));
		const yh = this.rle1d(this.YH.join(""));
		const yl = this.rle1d(this.YL.join(""));

		const n = Math.min(xh.length, xl.length, yh.length, yl.length);
		const pts = new Array(n);
		const AMP = 0.999; // ~1 pixel, comme ton ctor d’origine
		const OFF = 0.0001;

		for (let i = 0; i < n; i++) {
			const x = (parseInt(xh[i], 16) << 4) | parseInt(xl[i], 16);
			const y = (parseInt(yh[i], 16) << 4) | parseInt(yl[i], 16);

			const jx = OFF + this.hash01(i * 2 + 1) * AMP;
			const jy = OFF + this.hash01(i * 2 + 2) * AMP;

			pts[i] = new voronoi.Point(x + jx, y + jy);
		}
		return pts;
	}
};

// boot
voronoi.fortune(img.import4());
voronoi.optimizePath(0.3);
let pid = 0;
let lastStep = 0;
const STEP_MS = 1;

// The walk function will be called until it returns false.
function walk() {
	const now = performance.now();
	if (now - lastStep < STEP_MS) {
		return true;
	}
	lastStep = now;
	const a = voronoi.polylines[pid++];
	voronoi.drawPolyline(a, -100, -100);
	return pid < voronoi.polylines.length;
}