class Random { constructor(seed) { seed = BigInt(seed || Date.now()) % BigInt(999999999); this.seed = Number(seed.toString()); } next(max) { max = max || 10; this.seed = (this.seed * 9301 + 49297) % 233280; let val = this.seed / 233280.0; let num = Math.floor(val * max); return num; } bool() { return this.next(100) % 2 == 0; } } const countInList = (list, item) => { return list.filter((e) => e === item).length; }; function stringToBytes(str) { let bytes = []; for (let i = 0; i < str.length; ++i) { bytes.push(str.charCodeAt(i)); } return bytes; } function bytesToHex(byteArr) { let num = "0x"; for (let i = 0; i < byteArr.length; i++) { let x = byteArr[i] & 0xff; num += x.toString(16); } return num; } function hex2Rgb(hex) { hex = hex.replace("#", ""); if (hex.length == 3) { hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]; } const bigint = parseInt(hex, 16); const r = (bigint >> 16) & 255; const g = (bigint >> 8) & 255; const b = bigint & 255; return { r, g, b }; } function rgb2Hex(r, g, b) { const componentToHex = (c) => c.toString(16).padStart(2,"0"); return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b); } function rgb2Hsv(r, g, b) { r /= 255, g /= 255, b /= 255; const max = Math.max(r, g, b), min = Math.min(r, g, b); let h, s, v = max; const d = max - min; s = max == 0 ? 0 : d / max; if (max == min) { h = 0; } else { switch (max) { case r: h = (g - b) / d + (g < b ? 6 : 0); break; case g: h = (b - r) / d + 2; break; case b: h = (r - g) / d + 4; break; } h /= 6; } return { h, s, v }; } function hsv2Rgb(h, s, v) { let r, g, b; const i = Math.floor(h * 6); const f = h * 6 - i; const p = v * (1 - s); const q = v * (1 - f * s); const t = v * (1 - (1 - f) * s); switch (i % 6) { case 0: r = v, g = t, b = p; break; case 1: r = q, g = v, b = p; break; case 2: r = p, g = v, b = t; break; case 3: r = p, g = q, b = v; break; case 4: r = t, g = p, b = v; break; case 5: r = v, g = p, b = q; break; } return { r: Math.round(r * 255), g: Math.round(g * 255), b: Math.round(b * 255) }; } function hex2Hsv(hexcolor) { let rgb = hex2Rgb(hexcolor); return rgb2Hsv(rgb.r, rgb.g, rgb.b); } function hsv2Hex(h, s, v) { let rgb = hsv2Rgb(h, s, v); return rgb2Hex(rgb.r, rgb.g, rgb.b); } function hsvDistance(hsv1, hsv2) { let l = Math.sqrt( Math.pow(hsv1.h - hsv2.h, 2) + Math.pow(hsv1.s - hsv2.s, 2) + Math.pow(hsv1.v - hsv2.v, 2) ); l = l > 1 ? 1.0 : l; let distance = l / 1.0 return distance } function getSimilarColor(color, colorList) { let hsv = hex2Hsv(color); let distance = 1; let ret = null; colorList.forEach((c) => { let hsv1 = hex2Hsv(c); let d = hsvDistance(hsv, hsv1); if (d <= distance) { distance = d; ret = c; } }); if (ret == null) { ret = color; } return ret; } function getSvgTextColors(svgText, deduplication = true) { let ret = []; let colors = []; let colors_6 = svgText.match(/#[\da-fA-F]{6}(?=")/g) || []; colors.push(...colors_6); let colors_3 = svgText.match(/#[\da-fA-F]{3}(?=")/g) || []; colors.push(...colors_3); if (deduplication && colors != null && colors.length > 0) { colors.forEach((c) => { if (ret.indexOf(c) < 0) { ret.push(c); } }); } else { ret.push(...colors); } return ret; } function setColorHsvOffset(hexColor, ho = 0, so = 0, vo = 0) { let hsv = hex2Hsv(hexColor); let h = hsv.h * 360 + ho * 360 % 360; h = h % 360; h = h < 0 ? h + 360 : h; h = h / 360; let s = hsv.s + so; s = Math.min(Math.max(s, 0), 1); let v = hsv.v + vo; v = Math.min(Math.max(v, 0), 1); let ret = hsv2Hex(h, s, v); return ret; } function setColorListHsvOffset(hexColors, ho = 0, so = 0, vo = 0) { let hexColors_hue = []; for (let i in hexColors) { c = hexColors[i]; c1 = setColorHsvOffset(c, ho = ho, so = so, vo = vo); hexColors_hue.push(c1); } return hexColors_hue; } function sleep(time) { return new Promise((resolve) => setTimeout(resolve, time)); } function getSvgShapeItems(parent) { return parent.querySelectorAll("path[fill],g[fill],polygon[fill],circle[fill],ellipse[fill]"); } let animation = false; async function animationProcess(parent) { animation = true; let objList = getSvgShapeItems(parent); let fillList = []; const stroke_color = "#ffffff"; objList.forEach((item) => { item.setAttribute("stroke", stroke_color); item.setAttribute("stroke-width", "0.2px"); fillList.push(item.getAttribute("fill")) item.setAttribute("fill", "none"); }); await sleep(500); async function tween(item, fill) { let step = 100; for (let i = 0; i < step; i++) { let alpha = Math.round((step - (i + 1)) / step * 0xff).toString(16) let alphas = alpha.padStart(2, "0"); let strokecolor = stroke_color + alphas; item.setAttribute("stroke", strokecolor); item.setAttribute("fill", fill); item.setAttribute("opacity", String(i / step)); await sleep(0.05); } } let t = 10; for (let i = 0; i < objList.length; i++) { let item = objList[i]; let fill = fillList[i]; tween(item, fill); await sleep(t); } animation = false; } async function animationHue(svgElement, times = 1) { animation = true; let svgText = svgElement.innerHTML; let t = 0; while (animation && (times == 0 || t < times)) { for (let a = 1; a <= 360; a += 1) { let svgText_a = svgText; let colors = getSvgTextColors(svgText_a, true); let colors_hue = setColorListHsvOffset(colors, ho = a / 360, so = 0, vo = 0); for (let i in colors) { svgText_a = svgText_a.replaceAll(colors[i], colors_hue[i]); } svgElement.innerHTML = svgText_a; await sleep(0); } t++; } svgElement.innerHTML = svgText; animation = false; } function hex2Grayscale(hexcolor) { let rgb = hex2Rgb(hexcolor); return "#" + Math.round((0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b)).toString(16).padStart(2, '0').repeat(3); } function colorLevelList(color, s_step = 0.2, v_step = 0.2, s_range = 0.4, v_range = 0.4) { let ret = []; let hsv = hex2Hsv(color); let h = hsv.h; let s = hsv.s; let v = hsv.v; let s_s = s - s_range / 2; let s_e = s + s_range / 2; let v_s = v - v_range / 2; let v_e = v + v_range / 2; let color_g = hex2Grayscale(color); let g_d = hsvDistance(hsv, hex2Hsv(color_g)); if (g_d <= 0.1 || (color_g.toLowerCase() == color.toLowerCase()) || (s == 0 && v == 0) || (s == 0 && v == 100)) { s_s = s; s_e = s; v_step = 0.01; v_s = v - 0.08; v_e = v + 0.08; } if (s_s < 0) { let t = 0 - s_s; s_s = 0; s_e += t; } else if (1 < s_e) { let t = s_e - 1; s_s -= t; s_e = 1; } if (v_s < 0) { let t = 0 - v_s; v_s = 0; v_e += t; } else if (1 < v_e) { let t = v_e - 1; v_e = 1; v_s -= t; } for (let is = s_s; is <= s_e; is += s_step) { for (let iv = v_s; iv <= v_e; iv += v_step) { let color = hsv2Hex(h, is, iv); if (ret.indexOf(color) < 0) { ret.push(color); } } } return ret.sort(); } function colorsExpandLevel(colors, s_step = 0.2, v_step = 0.2, s_range = 0.4, v_range = 0.4) { let ret = []; colors.forEach((c) => { let cList = colorLevelList(c, s_step, v_step, s_range, v_range); ret.push(...cList); }); return ret; } function svgtextColorsReplacement(svgtext, colors_target, ho = 0, so = 0, vo = 0) { if (colors_target == null) { colors_target = getSvgTextColors(svgtext, true); } else if (!gg) { colors_target = colorsExpandLevel(colors_target, s_step = 0.2, v_step = 0.3, s_range = 0.4, v_range = 0.6); } let colors_source = getSvgTextColors(svgtext, true); let colors_r = []; colors_source.forEach((c) => { let cr = getSimilarColor(c, colors_target); colors_r.push(cr); }); let colors_hue = setColorListHsvOffset(colors_r, ho = ho, so = so, vo = vo); for (let i in colors_source) { svgtext = svgtext.replaceAll(colors_source[i], colors_hue[i]); } return svgtext; } const colorGroups = { "c1": ['#ff4400', '#cc9c00', '#990070', '#0e6600', '#002c33'], "c2": ['#ff0000', '#ffc000', '#000000', '#9932CC'], "c3": ['#b22234', '#3c3b6e', '#ffffff'], "c4": ['#bc002d', '#ffffff', '#000000'], "c5": ['#0c1c8c', '#ffffff', '#cf142b'], "c6": ['#0055a4', '#ffffff', '#ef4135'], "c7": ['#028234', '#ffffff', '#de1f24'], "c8": ['#ed7137', '#ffffff', '#2e693e', '#060489'], "c9": ['#459947', '#fae04b', '#0c2671', '#ffffff'], "c10": ['#da3f41', '#fefffd', '#479edb'], "c11": ['#f5be55', '#21524f', '#db7b2e', '#81223d'], "c12": ['#5CA6CC', '#1ABC9C', '#98FB98', '#800080'], "c13": ['#FF0000', '#FFFFFF', '#444444', ], "c14": ['#000000', '#fffcff', '#666666'], "c15": ['#0000FF', '#008000', '#800080'], "c16": ['#0072C6', '#00AEEF', '#6DCFF6', '#BDDDF6', ], "pkgd": ['#F2859F', '#FFAFCC', '#FAC0E5', '#D6A2E8', ], "obtw": ['#FFA500', '#000080', '#00FFFF', '#FFFFFF', ], "gpyf": ['#00FF00', '#800080', '#FFFF00', '#FFFFFF', ], "rgwb": ['#FF0000', '#00FF00', '#FFFFFF', '#000000', ], "ppgw": ['#4B0082', '#9932CC', '#7CFC00', '#FFFFFF', ], "gwgw": ['#708090', '#CFD8DC', '#90A4AE', '#FFFFFF', ], }; const colorGroups_g = { "g1": ['#683d22', '#704523', '#704527', '#7e4e06', '#8b4405', '#985000', '#9c6533', '#a15600', '#a15e18', '#aa5306', '#b25100', '#b9673d', '#bb7300', '#bc6600', '#bf7040', '#c0723a', '#c5733b', '#c97d00', '#ca8700', '#d08122', '#d29038', '#d48114', '#d68f2f', '#e79400', '#eb9c00', '#ecdb8e', '#ed9900', '#f4b54b', '#f4e17f', '#f6eb92', '#f7ad0b', '#fdf2a3', '#ffb040', '#ffc400', '#ffc500', '#ffd147', '#ffd56e', '#ffd926', '#ffdb4f', '#ffdf75', '#ffe176', '#ffe36e', '#ffe74e', '#ffe850', '#fff8ab', ], "g2": ['#c07e12', '#ffdb4f', '#b06500', '#ffe850', '#fab044', '#b35b0b', '#c57800', '#ffc200', '#c77a0b', '#a66119', '#f4e17f', '#9a4100', '#ffba00', '#7b4828', '#d68e2f', '#e5b683', '#ddff7e', '#f7d373', '#af6e2a', '#f4a500', '#ffca54', '#e88a00', '#f8b100', '#c17f12', '#ffc100', '#8f3a00', '#ffc500', '#ca8700', '#eb9c00', '#fef7b2', '#fdbf5e', '#9c4f00', '#b16a15', ], "g3": ['#c9902d', '#eddb7e', '#9d5b18', '#f3e07e', '#a24d00', '#fcf3a1', '#ffe84d', '#894101', '#d09b4b', '#f0e68a', '#ffdb4f', '#a86000', '#ffbb00', '#e69900', '#eed783', '#a67920', '#ffe100', '#ff892e', '#f7db7c', '#a36526', '#f7b000', '#ba7a11', '#cd9b3a', '#b56f21', '#83543a', '#a45701', '#ffc652', ], "g4": ['#ba6c1c', '#ffea84', '#fff98f', '#ffd500', '#a95e00', '#ffc200', '#cc7a00', '#ffc600', '#c56d1d', '#b66600', '#ffe553', '#ffe374', '#81390d', '#ef8c00', '#e38400', '#ffe88f', '#ffdb4f', '#f68c00', '#f48700', '#ffcb51', '#f58700', '#ffe84d', '#9a4901', '#f29000', '#ffd300', '#ffc60a', '#f68900', '#ab5000', '#c37000', '#ffcc00', '#ffbd01', '#b16700', '#f69b00', '#ffd162', '#f49200', ], //'#ffb58a', "g5": ['#c9902d', '#eddb7e', '#9d5b18', '#f3e07e', '#a24d00', '#fcf3a1', '#ffe84d', '#894101', '#d09b4b', '#f0e68a', '#ffdb4f', '#a86000', '#ffbb00', '#e69900', '#eed783', '#a67920', '#ffe100', '#ff892e', '#f7db7c', '#a36526', '#f7b000', '#ba7a11', '#cd9b3a', '#b56f21', '#83543a', '#a45701', '#ffc652', ], "g6": ['#f5d272', '#9c6225', '#ffde82', '#fec554', '#fdf7c3', '#f7de81', '#af722b', '#ce9f20', '#884806', '#5e3636', '#9e5e17', '#f2d784', '#fcdf75', '#ffe850', '#f9af44', '#a2520a', '#ece084', '#c27b17', '#ffdb4f', '#b77000', '#f2e788', '#9d793d', '#c67e2b', '#e6d87e', '#d6ae26', '#b86900', '#d9a618', '#f0de96', '#9f6013', '#cea54b', ], //,'#b56b6b','#a6fcd9', "g7": ['#ffe850', '#a45006', '#dd8f00', '#ffc400', '#b67100', '#b67400', '#fdc400', '#ffc200', '#cf7e0b', '#ffc500', '#d18c00', '#ee9e00', '#fef7b2', '#fec05e', '#ffc100', '#873700', '#ffc60c', '#aa6200', '#cc7c49', '#ffd167', '#f5a600', '#ffca54', '#eb8c00', '#e19c00', '#984d00', '#c26e00', '#c56500', '#f0a800', ], }; const svg_url = (index) => { let svglist = [ "/content/62c9782036e0d7479ef4766911d311eea537b738cb3b1471f9e7af539bcfd96ei0", "/content/0fad1798e1ca341deb749d548ab14f4d0b4fe02a13959467899840d9bd059210i0", "/content/29ac03cc1ab54ea487df7f4cb56b8bbec61639a0358e13d65182c9c73002308ci0", "/content/d070bb086e9c97c8c22322c001fbd247db6bf388f38e136aa8dd672a2e3c19dei0", "/content/349235433e74a87b19a0e7558fd733ba8fcaa480d13ee4586c3eb26e765fea5fi0", "/content/ab90fc80531abd2f4ac5f70b4683fd0bfbfa0bcf24f711efd45179b9dfd10b17i0", "/content/5e784813f68f8e06cbdf8f41966e02e96e99420f0d11e93d8aed0c53c0b5b77fi0", ]; if(!window.location.host) return "https://ordinals.com"+svglist[index - 1]; return svglist[index - 1]; }; const getHexSeed = (address) => { if (address == null) { return Date.now() % 999999999; } let str = address; let bytes = stringToBytes(str); let hexseed = bytesToHex(bytes); return hexseed; }; const aen = (a) => { try { let n = parseInt(a.substring(a.length - 2)); n = n == 0 ? 1 : n; return n || -1; } catch (error) {} return -1; }; function loadSvg(url) { const xhr = new XMLHttpRequest(); xhr.open("GET", url, false); xhr.send(null); if (xhr.readyState === 4 && xhr.status === 200) { const svgString = xhr.responseXML.documentElement.outerHTML; return svgString; } return null; } function colorsRandom(random) { let colors_target = []; let color_count = 4 + random.next(3); if (svg_index == 0 && color_count <= 6) color_count += 6; let h_list = []; for (let i = 0; i < color_count; i++) { let h = random.next(12); let count = countInList(h_list, h); if (count < 1) { h_list.push(h); } else { i--; } } for (let i = 0; i < color_count; i++) { let h = h_list[i] * 30; h += (random.bool() ? 1 : -1) * random.next(16); h = h < 0 ? h + 360 : h; h = h % 360 / 360; let s = 1 - (random.bool() ? i / color_count : 0.05); let v = 1 - (random.bool() ? i / color_count / 2 : 0.05); if (random.bool() && i == color_count - 1) { s = (2 + random.next(4)) * 0.05; //0.1; v = 1; } else if (random.bool() && i == color_count - 2) { s = (1 + random.next(6)) * 0.05; //0.2; v = 0.1; } let hex = hsv2Hex(h, s, v); colors_target.push(hex); } return colors_target; } function colorsRandomGroup(random) { let gp = gg ? colorGroups_g : colorGroups; let keys = Object.keys(gp); let key = gg ? `g${svg_index}` : keys[random.next(keys.length)]; let colors_target = gp[key]; return colors_target; } function assignColors(svgtext, random) { let ret = svgtext; let colors_target = null; let m_count = Object.keys(colorGroups).length; let rc = random.next(100); let needhsv = true; let sc = 7; if (gg) { colors_target = colorsRandomGroup(random); needhsv = false; } else if (rc < sc) { ret = svgtext; needhsv = false; } else if (sc <= rc && rc < m_count + sc && svg_index > 0) { colors_target = colorsRandomGroup(random); } else { colors_target = colorsRandom(random) } let ho = 0; let so = 0; let vo = 0; if (needhsv) { ho = random.next(10) * 36 / 360; so = 0; vo = random.next(15) / 100; } ret = svgtextColorsReplacement(svgtext, colors_target, ho, so, vo); return ret; } function makeSvgBg(random) { let ho = random.next(12) * 30 / 360; let c1 = setColorHsvOffset("#434fbb", ho = ho, so = 0, v0 = 0); let c2 = setColorHsvOffset("#0d0f2f", ho = ho, so = 0, v0 = 0); if (gg) { c1 = "#8a2d2d"; c2 = "#210404"; } let o1 = "0"; let o2 = "1"; let svgtext_bg = ``; return svgtext_bg; } let svg_index = 0; let svgtext_source = null; let svgtext_color = null; let svgtext_bg = null; let gg = false; async function start() { let body = document.body; while (body == null) { await sleep(1); body = document.body; } body.style.margin = "0px"; body.style.background = "black"; let bgparent = document.createElement('div'); bgparent.class = "bg"; bgparent.style.cssText = "position: fixed; width: 100%; height: 100%; display: flex; justify-content: center;"; body.appendChild(bgparent); let svgparent = document.createElement('div'); svgparent.class = "wrapper"; svgparent.style.cssText = "position: fixed; width: 100%; height: 100%; display: flex; justify-content: center;"; body.appendChild(svgparent); let baseData = p || {}; let random = new Random(getHexSeed(baseData.address)); svg_index = baseData ?.mask || (random.next(7) + 1); let _aen=aen(baseData.address); gg = _aen%svg_index == Math.abs(_aen-svg_index); if (svgtext_source == null) { svgtext_source = loadSvg(svg_url(svg_index)); let ss = svgtext_source.replace(new RegExp(']*>[\\s\\S]*?', 'g'), ""); ss = ss.replaceAll(' { if (!animation) { animationHue(svgparent); } }; } } start();