(function () {
// 1) Basic bot filter (extend if you like)
function isBot() {
return /(bot|crawl|spider|google|bing|slurp|yandex|facebook|linkedin|pinterest|preview|whatsapp|discord|telegram|headless|puppeteer)/i
.test(navigator.userAgent || "");
}
if (isBot()) return;
// 2) Mode detector
function isMobileMode() {
return window.matchMedia("(max-width: 767px)").matches ||
/Mobi|Android|iPhone|iPad|iPod/i.test(navigator.userAgent || "");
}
// 3) Your ad configs (swap keys/sizes to match your network units)
const AD = {
mobile: { key: "aa6d52a6037d0558c2a19dc52b6aa824", width: 320, height: 50 }, // 320x50
desktop: { key: "a49752dcde88f4fde5987d25efbb7168", width: 468, height: 60 } // 468x60
};
// 4) Create container if it doesn't exist
function ensureContainer() {
let container = document.getElementById("ad-container");
if (!container) {
container = document.createElement("div");
container.id = "ad-container";
container.style.display = "none";
document.body.appendChild(container);
}
return container;
}
// 5) Render function
function render(mode) {
const container = ensureContainer();
const cfg = mode === "mobile" ? AD.mobile : AD.desktop;
// Set global atOptions for ad network
window.atOptions = {
key: cfg.key,
format: "iframe",
height: cfg.height,
width: cfg.width,
params: {}
};
// Clear previous ad/script then inject
container.innerHTML = "";
container.style.display = "block";
const s = document.createElement("script");
s.src = `//selfportraitproved.com/${cfg.key}/invoke.js`;
s.async = true;
container.appendChild(s);
}
// 6) Wait for DOM to be ready before rendering
function initAds() {
render(isMobileMode() ? "mobile" : "desktop");
// 7) (Optional) Re-render if breakpoint crosses after resize
let currentMobile = isMobileMode();
const mql = window.matchMedia("(max-width: 767px)");
if (mql.addEventListener) {
mql.addEventListener("change", (e) => {
const nowMobile = e.matches;
if (nowMobile !== currentMobile) {
currentMobile = nowMobile;
render(currentMobile ? "mobile" : "desktop");
}
});
} else if (mql.addListener) { // older browsers
mql.addListener((e) => {
const nowMobile = e.matches;
if (nowMobile !== currentMobile) {
currentMobile = nowMobile;
render(currentMobile ? "mobile" : "desktop");
}
});
}
}
// 8) Execute when DOM is ready
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", initAds);
} else {
initAds();
}
})();
Team Liquid confirmed the acquisition of Elias “Jamppi” Olkkonen today.
Jamppi left CS:GO for VALORANT after a protracted legal battle with Valve concerning an allegedly false VAC ban that barred him from competing in Valve-sponsored tournaments. He sued Valve, demanding compensation for missed earnings and to lift the ban on his banned account, which he claims he lent to a friend and was not in his possession during the time of the ban.
He’s expected to make an immediate positive impact on Liquid’s VALORANT team due to his prowess in CS.
Liquid have struggled as of late, disappointing fans and analysts with early losses in the VCT Challengers tournaments. In Challengers One, Liquid qualified for the closed qualifier portion of the tournament but fell to FunPlus Phoenix. In VCT Challengers Two, they didn’t make it out of the open portion of the qualifier. The star-studded team also failed to advance past the quarterfinals in First Strike Europe.
👉 For more insights, check out this resource.
“I hope I can bring this team up to the new levels, and I think it’s going to be very effective for us,” Jamppi said in Liquid’s announcement. He also said that he’d take over the Jett/Operator role on the team. Jamppi will replace Adam “ec1s” Eccles
Liquid’s VALORANT roster now consists of Dom “soulcas” Sulcas, James “Kryptix” Affleck, Travis “L1NK” Mendoza, Adil “ScreaM” Benrlitom, and Jamppi.
👉 Discover more in this in-depth guide.
Make sure to follow us on YouTube for more esports news and analysis.