PageSourceSearch

https://hymy.fi/

html hymy.fi collected 2026-09-24 20:47:42 UTC 142,749 bytes, 3,192 lines download raw bytes

1<!DOCTYPE html>
2<!--[if IE 7]>
3<html class="ie ie7" lang="fi">
4<![endif]--><!--[if IE 8]>
5<html class="ie ie8" lang="fi">
6<![endif]--><!--[if IE 9]>
7<html class="ie ie9" lang="fi">
8<![endif]--><!--[if !(IE 7) | !(IE 8) | !(IE 9)]><!--><html lang="fi">
9<!--<![endif]-->
10
11
12
13<head>
14    <meta charset="UTF-8">
15<script type="text/javascript">
16/* <![CDATA[ */
17var gform;gform||(document.addEventListener("gform_main_scripts_loaded",function(){gform.scriptsLoaded=!0}),document.addEventListener("gform/theme/scripts_loaded",function(){gform.themeScriptsLoaded=!0}),window.addEventListener("DOMContentLoaded",function(){gform.domLoaded=!0}),gform={domLoaded:!1,scriptsLoaded:!1,themeScriptsLoaded:!1,isFormEditor:()=>"function"==typeof InitializeEditor,callIfLoaded:function(o){return!(!gform.domLoaded||!gform.scriptsLoaded||!gform.themeScriptsLoaded&&!gform.isFormEditor()||(gform.isFormEditor()&&console.warn("The use of gform.initializeOnLoaded() is deprecated in the form editor context and will be removed in Gravity Forms 3.1."),o(),0))},initializeOnLoaded:function(o){gform.callIfLoaded(o)||(document.addEventListener("gform_main_scripts_loaded",()=>{gform.scriptsLoaded=!0,gform.callIfLoaded(o)}),document.addEventListener("gform/theme/scripts_loaded",()=>{gform.themeScriptsLoaded=!0,gform.callIfLoaded(o)}),window.addEventListener("DOMContentLoaded",()=>{gform.domLoaded=!0,gform.callIfLoaded(o)}))},hooks:{action:{},filter:{}},addAction:function(o,r,e,t){gform.addHook("action",o,r,e,t)},addFilter:function(o,r,e,t){gform.addHook("filter",o,r,e,t)},doAction:function(o){gform.doHook("action",o,arguments)},applyFilters:function(o){return gform.doHook("filter",o,arguments)},removeAction:function(o,r){gform.removeHook("action",o,r)},removeFilter:function(o,r,e){gform.removeHook("filter",o,r,e)},addHook:function(o,r,e,t,n){null==gform.hooks[o][r]&&(gform.hooks[o][r]=[]);var d=gform.hooks[o][r];null==n&&(n=r+"_"+d.length),gform.hooks[o][r].push({tag:n,callable:e,priority:t=null==t?10:t})},doHook:function(r,o,e){var t;if(e=Array.prototype.slice.call(e,1),null!=gform.hooks[r][o]&&((o=gform.hooks[r][o]).sort(function(o,r){return o.priority-r.priority}),o.forEach(function(o){"function"!=typeof(t=o.callable)&&(t=window[t]),"action"==r?t.apply(null,e):e[0]=t.apply(null,e)})),"filter"==r)return e[0]},removeHook:function(o,r,t,n){var e;null!=gform.hooks[o][r]&&(e=(e=gform.hooks[o][r]).filter(function(o,r,e){return!!(null!=n&&n!=o.tag||null!=t&&t!=o.priority)}),gform.hooks[o][r]=e)}});
18/* ]]> */
19</script>
19
20
21    <meta http-equiv="x-ua-compatible" content="IE=edge">
22    <meta name="viewport" content="width=device-width, initial-scale=1.0">
23    <meta name="format-detection" content="telephone=no">
24    <link rel="icon" type="image/png" sizes="32x32" href="https://hymy.fi/wp-content/themes/om-hymy-theme/favicon-32x32.png">
25    <link rel="icon" type="image/png" sizes="16x16" href="https://hymy.fi/wp-content/themes/om-hymy-theme/favicon-16x16.png">
26    <link rel="apple-touch-icon" sizes="57x57" href="https://hymy.fi/wp-content/themes/om-hymy-theme/assets/img/apple-icon-57.png">
27    <link rel="apple-touch-icon" sizes="60x60" href="https://hymy.fi/wp-content/themes/om-hymy-theme/assets/img/apple-icon-60.png">
28    <link rel="apple-touch-icon" sizes="72x72" href="https://hymy.fi/wp-content/themes/om-hymy-theme/assets/img/apple-icon-72.png">
29    <link rel="apple-touch-icon" sizes="114x114" href="https://hymy.fi/wp-content/themes/om-hymy-theme/assets/img/apple-icon-114.png">
30    <link rel="apple-touch-icon" sizes="120x120" href="https://hymy.fi/wp-content/themes/om-hymy-theme/assets/img/apple-icon-120.png">
31    <link rel="apple-touch-icon" sizes="144x144" href="https://hymy.fi/wp-content/themes/om-hymy-theme/assets/img/apple-icon-144.png">
32    <link rel="apple-touch-icon" sizes="152x152" href="https://hymy.fi/wp-content/themes/om-hymy-theme/assets/img/apple-icon-152.png">
33    <link rel="apple-touch-icon" sizes="180x180" href="https://hymy.fi/wp-content/themes/om-hymy-theme/assets/img/apple-icon-180.png">
34    <link rel="manifest" href="https://hymy.fi/wp-content/themes/om-hymy-theme/manifest.json">
35
36
37    
38
39    
39<script src="https://use.typekit.net/lyn0ejh.js"></script>
39 
39<script>try{Typekit.load({ async: true });}catch(e){}</script>
39    <link rel="profile" href="http:mpg.org/xfn/11">
40    <link rel="apple-touch-icon" href="">
41    <link rel="shortcut icon" href="">
42
43    <!-- Head tag start, do not remove -->
44
45<!-- // hymy.fi-->
46
47<script type="text/javascript">
48
49	const timerStart = Date.now();
50	window.timerStart = timerStart;
51	var dfpDebug = document.location.href.indexOf("dfpdebug=1") > -1 ? true : false;
52	var cmpDebug = document.location.href.indexOf("cmpdebug=1") > -1 ? true : false;
53	var testSRA = document.location.href.indexOf("testsra=1") > -1 ? true : true;
54
55</script>
55
56
57<meta name="facebook-domain-verification" content="zufmuphmfyae7u4gdbgu0ppy2ycmld">
58
59<style>
60
61	/*.article__body [id*='dfp__'] iframe {width: auto !important;}*/
62	html.no-scroll, body.no-scroll {
63		overflow: hidden !important;
64	}
65	@media screen and (max-width: 1020px) {
66		body.single-post [data-google-query-id] {
67			margin: 30px 0px !important;
68			clear: both !important;
69			display: flex;
70			justify-content: center;
71		}
72		body.category [data-google-query-id] {
73			margin: 0px 0px 30px !important;
74			clear: both !important;
75		}
76	}
77	body.category-horoskooppi [data-google-query-id] {
78		margin: 0px 0px 50px !important;
79		clear: both !important;
80	}
81	@media screen and (min-width: 1020px) {
82		#dfp__desk-12 {min-height: 408px}
83		.bbp-replies .bbp-dfp-slots {display: flex !important; justify-content: center !important}
84	}
85
86</style>
87
88<script src="https://storage.googleapis.com/om-gravito-cmp/om_gravito_stubScriptTag.js?rnd=1"></script>
88
89
90<script>
91
92	if (location.href.indexOf('testnewcmp=2') == -1) {
93
94		var cookieMatch = document.cookie.match(/(?:^|;\s*)TcString=([^;]+)/);
95		var tcString = cookieMatch ? decodeURIComponent(cookieMatch[1]) : null;
96
97		if (tcString || (window.tcstring_decoded && window.tcstring_decoded.tcString)) {
98
99			if (cmpDebug) {console.log('Testing local __tcfapi...')}
100
101			var decoded = window.tcstring_decoded || {};
102
103			var tcData = {
104				tcString: tcString || decoded.tcString,
105				version: 2,
106				gdprApplies: true,
107				cmpId: decoded.cmpId || 0,
108				cmpVersion: decoded.cmpVersion || 0,
109				tcfPolicyVersion: 0,
110				vendorListVersion: decoded.vendorListVersion || 0,
111				eventStatus: "tcloaded",
112				cmpStatus: "loaded",
113				purpose: decoded.purpose || { consents: {}, legitimateInterests: {} },
114				vendor: decoded.vendor || { consents: {}, legitimateInterests: {} },
115				publisher: decoded.publisher || { consents: {}, legitimateInterests: {} },
116				specialFeatureOptins: decoded.specialFeatureOptins || {}
117			};
118
119			var __tcfapiListeners = {};
120			var __tcfapiNextId = 1;
121
122			window.__tcfapi = function(command, version, callback, parameter) {
123
124				var haveValidString = !!tcData.tcString;
125
126				switch (command) {
127					case "ping":
128						callback({
129							cmpLoaded: true,
130							cmpStatus: "loaded",
131							tcfPolicyVersion: tcData.tcfPolicyVersion
132						}, true);
133						break;
134					case "getTCData":
135						callback(haveValidString ? tcData : null, haveValidString);
136						break;
137					case "getTCString":
138						callback(haveValidString ? tcData.tcString : null, haveValidString);
139						break;
140					case "addEventListener":
141						var id = __tcfapiNextId++;
142						__tcfapiListeners[id] = callback;
143						callback(haveValidString ? tcData : null, haveValidString);
144						break;
145					case "removeEventListener":
146						if (parameter && __tcfapiListeners[parameter]) {
147							delete __tcfapiListeners[parameter];
148							callback(true, true);
149						} else {
150							callback(false, false);
151						}
152						break;
153					default:
154						callback(null, false);
155				}
156
157				if (cmpDebug) {
158					console.log("[__tcfapi call]", {command, version, parameter});
159					console.log("[__tcfapi response]", {
160						time: (Date.now() - timerStart) + 'ms',
161						command: command,
162						returnedTcString: haveValidString ? tcData.tcString : null,
163						decodedObject: decoded || null
164					});
165				}
166
167			};
168
169		}
170
171	}
172
173	if (cmpDebug) {
174		__tcfapi('getTCData', 2, (tcData, success) => {
175			console.log('testdata3: ' + (Date.now() - timerStart) + 'ms --> ', tcData, success);
176		});
177	}
178
179</script>
179
180
181<script async src="https://securepubads.g.doubleclick.net/tag/js/gpt.js"></script>
181
182
183<script>
184
185	function waitForElement(selector) {
186		return new Promise(function(resolve, reject) {
187			var element = document.querySelector(selector);
188			if(element) {
189				resolve(element);
190				return;
191			}
192			var observer = new MutationObserver(function(mutations) {
193				mutations.forEach(function(mutation) {
194					var nodes = Array.from(mutation.addedNodes);
195					for(var node of nodes) {
196						if(node.matches && node.matches(selector)) {
197							observer.disconnect();
198							resolve(node);
199							return;
200						}
201					};
202				});
203			});
204			observer.observe(document.documentElement, { childList: true, subtree: true });
205		});
206	}
207
208	function waitForCondition(checkFn, interval = 50, timeout = 5000) {
209		return new Promise((resolve, reject) => {
210			try {
211				if (checkFn()) {
212					resolve(true);
213					return;
214				}
215			} catch (e) {
216				// ignore early errors (e.g., googletag not yet defined)
217			}
218
219			const start = Date.now();
220			const timer = setInterval(() => {
221				try {
222					if (checkFn()) {
223						clearInterval(timer);
224						resolve(true);
225					} else if (Date.now() - start > timeout) {
226						clearInterval(timer);
227						reject(new Error('Timeout waiting for condition'));
228					}
229				} catch (e) {
230					// still ignore transient errors
231				}
232			}, interval);
233		});
234	}
235
236	var cmpRnd = Math.floor(Math.random() * 999999);
237
238	if (location.href.indexOf('testnewcmp=1') > -1) {
239
240		document.addEventListener('gravito:tcfv2:client', function (event) {
241			console.log('TCData: gravito:tcfv2:client eventType: ', event.detail.eventType);
242		}, true);
243
244		__tcfapi("addEventListener", 2, function (TCData) {
245			console.log('TCData: Got an answer from TCData...');
246			console.log('TCData: eventStatus: ', TCData.eventStatus);
247			if (TCData.tcString && "cmpuishown" === TCData.eventStatus || 'tcloaded' === TCData.eventStatus || 'useractioncomplete' === TCData.eventStatus) {
248			}
249		});
250
251		//window.checkCMPConditions = function(e,t,n,o,r) {console.log("Uusi funktio toimii varmemmin!");return new Promise((l=>{cmpDebug&&console.log("Local TcString: "+JSON.stringify(tcstring_decoded));let s,g,i,c;""!=e?(cmpDebug&&console.log("Tsekataan keksistä..."),s=0===t.length||t.every((t=>e.purpose.consents[t])),g=0===n.length||n.every((t=>e.purpose.legitimateInterests[t])),i=0===o.length||o.every((t=>
251e.vendor.consents[t])),c=0===r.length||r.every((t=>e.vendor.legitimateInterests[t])),l(s&&g&&i&&c)):document.addEventListener("gravito:tcfv2:client",(function(a){cmpDebug&&console.log("Kuunnellaan gravito:tcfv2:clientia...");let p=a.detail.eventType;"layer1:opt-in:all"!=p&&"layer2:opt-in:all"!=p&&"layer2:opt-in:selected"!=p&&"layer2:opt-out:all"!=p||(cmpDebug&&console.log("purposeConsentsLength: "+a.detail.purposeConsents.length),gravitoCMP.currentState&&(consentString=cmpGetCookie("TcString"),e=TCStringParse(consentString),cmpDebug&&console.log("currentStaten data: "+JSON.stringify(e))),s=0===t.length||t.every((t=>e.purpose.consents[t])),g=0===n.length||n.every((t=>e.purpose.legitimateInterests[t])),i=0===o.length||o.every((t=>e.vendor.consents[t])),c=0===r.length||r.every((t=>e.vendor.legitimateInterests[t])),cmpDebug&&console.log(s&&g&&i&&c),l(s&&g&&i&&c))}),!0)}))};
252
253		if (location.href.indexOf('testcmp=1') > -1) {
254			waitForElement("body").then(function(element) {
255				(function(d,s,e,t){e=d.createElement(s);e.type='text/java'+s;e.async='async';
256				//e.src='http'+('https:'===location.protocol?'s://':'://')+'storage.googleapis.com/om-gravito-cmp/otavaScript_stacks_purettu.js?' + cmpRnd;
257				e.src='http'+('https:'===location.protocol?'s://':'://')+'digitiimi.otavamedia.fi/testi/cmp/otavaScript_stacks_purettu.js?' + cmpRnd;
258				t=d.getElementsByTagName(s)[0];t.parentNode.insertBefore(e,t);})(document,'script');
259			});
260		} else if (location.href.indexOf('testcmp=2') > -1) {
261			waitForElement("body").then(function(element) {
262				(function(d,s,e,t){e=d.createElement(s);e.type='text/java'+s;e.async='async';
263				e.src='http'+('https:'===location.protocol?'s://':'://')+'storage.googleapis.com/om-gravito-cmp/otavaScript2.js?' + cmpRnd;
264				t=d.getElementsByTagName(s)[0];t.parentNode.insertBefore(e,t);})(document,'script');
265			});
266		} else if (location.href.indexOf('testcmp=3') > -1) {
267			waitForElement("body").then(function(element) {
268				(function(d,s,e,t){e=d.createElement(s);e.type='text/java'+s;e.async='async';
269				e.src='http'+('https:'===location.protocol?'s://':'://')+'digitiimi.otavamedia.fi/testi/cmp/gravito-cmp-deployment-script.
269js?' + cmpRnd;
270				t=d.getElementsByTagName(s)[0];t.parentNode.insertBefore(e,t);})(document,'script');
271			});
272		} else {
273			waitForElement("body").then(function(element) {
274				(function(d,s,e,t){e=d.createElement(s);e.type='text/java'+s;e.async='async';
275				e.src='http'+('https:'===location.protocol?'s://':'://')+'storage.googleapis.com/om-gravito-cmp/otavaScript.js';
276				t=d.getElementsByTagName(s)[0];t.parentNode.insertBefore(e,t);})(document,'script');
277			});
278		}
279
280	} else {
281
282		console.log('Testing local __tcfapi, with cmp script insert...');
283
284		//waitForElement("body").then(function(element) {
285		//	var cmpRnd = Math.floor(Math.random() * 999999);
286		//	(function(d,s,e,t){e=d.createElement(s);e.type='text/java'+s;e.async='async';
287		//	e.src='http'+('https:'===location.protocol?'s://':'://')+'digitiimi.otavamedia.fi/testi/cmp/otavaScript_stacks_purettu.js?' + cmpRnd;
288		//	t=d.getElementsByTagName(s)[0];t.parentNode.insertBefore(e,t);})(document,'script');
289		//});
290
291		if (location.href.indexOf('testcmp=1') > -1) {
292			waitForElement("body").then(function(element) {
293				(function(d,s,e,t){e=d.createElement(s);e.type='text/java'+s;e.async='async';
294				//e.src='http'+('https:'===location.protocol?'s://':'://')+'storage.googleapis.com/om-gravito-cmp/otavaScript_stacks_purettu.js?' + cmpRnd;
295				e.src='http'+('https:'===location.protocol?'s://':'://')+'digitiimi.otavamedia.fi/testi/cmp/otavaScript_stacks_purettu.js?' + cmpRnd;
296				t=d.getElementsByTagName(s)[0];t.parentNode.insertBefore(e,t);})(document,'script');
297			});
298		} else {
299			waitForElement("body").then(function(element) {
300				(function(d,s,e,t){e=d.createElement(s);e.type='text/java'+s;e.async='async';
301				//e.src='http'+('https:'===location.protocol?'s://':'://')+'storage.googleapis.com/om-gravito-cmp/otavaScript.js';
302				e.src='http'+('https:'===location.protocol?'s://':'://')+'storage.googleapis.com/om-gravito-cmp/otavaScript.js?' + cmpRnd;
303				t=d.getElementsByTagName(s)[0];t.parentNode.insertBefore(e,t);})(document,'script');
304			});
305		}
306
307	}
308
309</script>
309
310
311<!-- Gravito CMP start-->
312	<!--script src="https://storage.googleapis.com/om-gravito-cmp/om_gravito_stubScriptTag.js"></script-->
313	<!--script async src="https://storage.googleapis.com/om-gravito-cmp/otavaScript.js"></script-->
314<!-- Gravito CMP end-->
315
316<script>
317	window.ghdConfig = {
318		autoInit: true,
319		endpoint: 'https://otava.detect.gravito.fi/api/v1/events',
320		volume: 'sampling',
321		samplingRatio: 0.1 // capture 10% of the events
322	};
323</script>
vendor: 1 bytes, line 323
323
324<script src="https://otava.detect.gravito.fi/sdk.js" async></script>
vendor: 1 bytes, line 324
324
325<script async="async" src="https://functions.adnami.io/api/macro/adsm.macro.hymy.fi.js"></script>
325
326
327<script>
328
329	var cxContextualIds = [], cxSegmentIds = [];
330	var articleCategory = '', articleCategories = '', recipeTheme = '', articleTags = '', articleSection = '';
331
332	var cX = cX || { options: { tcf20: true } }; cX.callQueue = cX.callQueue || [];
333	var cxDefaultSegments = '8nqech16gy6q,8mt8vs49hkio,8o1gwyxui6y1,aavib3epzfey,8o1mlcz9mvdd';
334	if (dfpDebug) {console.log('cXsegmentIds1: ' + cxSegmentIds)}
335
336	var deliveryType = 'tad';
337
338	checkCMPConditions(tcstring_decoded, [1,3,4], [2,7,9,10], [], [755]).then(result => {
339		if (result) {
340			if (dfpDebug) {console.log("Consent met: GAM IS ALLOWED TO SERVE personalized ads...")}
341			//googletag.pubads().setTargeting("deliveryType", "normal");
342			deliveryType = 'normal';
343		} else {
344			checkCMPConditions(tcstring_decoded, [1], [2,7,9,10], [], [755]).then(result => {
345				if (result) {
346					if (dfpDebug) {console.log("Consent met: GAM IS ALLOWED TO SERVE Non-personalized ads...")}
347					//googletag.pubads().setTargeting("deliveryType", "npa");
348					deliveryType = 'npa';
349				} else {
350					checkCMPConditions(tcstring_decoded, [], [2,7,9,10], [], [755]).then(result => {
351						if (result) {
352							if (dfpDebug) {console.log("Consent met: GAM IS ALLOWED TO SERVE Limited ads...")}
353							//googletag.pubads().setTargeting("deliveryType", "lads");
354							deliveryType = 'lads';
355							useHBM = false;
356						} else {
357							if (dfpDebug) {console.log("Consent not met: GAM IS ALLOWED TO SERVE TAD...")}
358							//googletag.pubads().setTargeting("deliveryType", "tad");
359							deliveryType = 'tad';
360							useHBM = false;
361						}
362					});
363				}
364			});
365		}
366	});
367
368	checkCMPConditions(tcstring_decoded, [1,3,4], [], [412], []).then(result => {
369		if (result) {
370
371			if (dfpDebug) {console.log("Consents met: PIANO IS GOOD TO GO...")}
372			if (dfpDebug) {console.log("cX can load via tcstring...")}
373
374			// Async load of cx.js
375			(function(d,s,e,t){e=d.createElement(s);e.type='text/java'+s;e.async='async';
376			e.src='http'+('https:'===location.protocol?'s://s':'://')+'cdn.cxense.com/cx.js';
377			t=d.getElementsByTagName(s)[0];t.parentNode.insertBefore(e,t);})(document,'script');
378
379			if(typeof window.localStorage === 'object' && typeof window.localStorage.getItem === 'function') {
380				if (dfpDebug) {console.log('cX: ls available, getting segments...')}
381				cxSegmentIds = localStorage.getItem('_cX_segmentInfo');
382				if (cxSegmentIds && cxSegmentIds.trim().length > 0) {
383					cxSegmentIds = cxSegmentIds.split(',');
384					if (dfpDebug) console.log('cX: Calling dfp.init() with lsSegments:', cxSegmentIds);
385					dfp.init(cxSegmentIds);
386				} else {
387					if (dfpDebug) {
388						console.log('cX: ls cxSegmentIds.trim().length = 0...');
389						console.log('cX: Calling dfp.init() with default segments...');
390					}
391					dfp.init(cxDefaultSegments);
392				}
393			}
394
395
396			waitForCondition(() => window.cX && cX.loaded).then(() => {
397
398				var cxSegmentIds = [];
399				var contextualIds = [];
400
401				if (dfpDebug) {console.log('cx.loaded, calling cX.getSegments...')}
402				cX.getSegments('f1ab28b7c9202ce3defa8bb2979a88f90c7a5ab2', function(segments) {
403
404					if (dfpDebug) console.log('cX.getSegments length: ' + segments.length);
405					if (!segments || !Array.isArray(segments) || !segments.length) {
406						if (dfpDebug) console.warn('cX: Segment fetch failed or empty:', segments);
407					}
408
409					cX.Array.forEach(segments, function (cxTypedSegment, index) {
410						if (cxTypedSegment.type == 'contextual') {
411							cxContextualIds.push(cxTypedSegment.id);
412						} else if (cxTypedSegment.type == 'traffic') {
413							cxSegmentIds.push(cxTypedSegment.id);
414						}
415					});
416
417					if (dfpDebug) console.log('cxContextualIds:', cxContextualIds);
418
419					if(typeof window.localStorage === 'object' && typeof window.localStorage.getItem === 'function') {
420						localStorage.setItem('_cX_segmentInfo', cxSegmentIds.join(','));
421						if (dfpDebug) console.log('cX: Segments fetched and stored:', cxSegmentIds);
422					}
423
424				});
425			}).catch(err => console.warn(err.message));
426
427		} else {
428
429			if (dfpDebug) {console.log("Consents NOT met: CAN NOT USE PIANO!!!")}
430			__tcfapi("addEventListener", 2, function (TCData) {
431				if (dfpDebug) {console.log('Got an answer from TCData...')}
432				if (TCData.tcString && "cmpuishown" === TCData.eventStatus || 'tcloaded' === TCData.eventStatus || 'useractioncomplete' === TCData.eventStatus) {
433					//initDFP(cxSegmentIds);
434					if (dfpDebug) {
435						console.log('No cX, calling dfp.init() with default segments...');
436					}
437					dfp.init(cxDefaultSegments);
438				}
439			});
440
441		}
442	});
443
444	setTimeout(() => {
445		if (window.dataLayer) {
446			dataLayer.forEach(function (dataLayerItem) {
447				if (dataLayerItem['PrimaryCategory'] !== '' && dataLayerItem['PrimaryCategory'] !== undefined) {
448					articleCategory = dataLayerItem['PrimaryCategory'].toLocaleStr
448ing().toLowerCase().replace(/, /g, ',');
449					if (dfpDebug) {console.log('ArticleCategory: ' + articleCategory);}
450				}
451				if (dataLayerItem['Categories'] !== '' && dataLayerItem['Categories'] !== undefined) {
452					articleCategories = dataLayerItem['Categories'].toLocaleString().toLowerCase().replace(/, /g, ',');
453					if (dfpDebug) {console.log('Categories: ' + articleCategories);}
454				}
455				if (dataLayerItem['Tags'] !== '' && dataLayerItem['Tags'] !== undefined) {
456					articleTags = dataLayerItem['Tags'].toLocaleString().toLowerCase().replace(/, /g, ',');
457					if (dfpDebug) {console.log('Tags: ' + articleTags);}
458				}
459				if (dataLayerItem['Section'] !== '' && dataLayerItem['Section'] !== undefined) {
460					articleSection = dataLayerItem['Section'].toLowerCase().replace(/, /g, ',');
461					if (dfpDebug) {console.log('ArticleSection: ' + articleSection);}
462				}
463			});
464		} else {
465			console.error('DataLayer is not defined.')
466		}
467	}, 120);
468
469	console.time("timer");
470
471	var adLocation = 'frontpage';
472	var hideAllAds = false;
473	var userdpbjs = false;
474	var hb_setup = 'owpbjs';
475	var rnd = Math.floor(Math.random() * 50);
476	window.dataLayer = window.dataLayer || [];
477	var leiki_contextual = '';
478	var useHBM = true;
479	if (location.href.indexOf('usehbm=false') > -1) {
480		useHBM = false;
481		console.log('HBM not in use!!!');
482	}
483
484	function getLeikiContextual() {
485
486		if (!window.dataLayer) {
487			console.error('LeikiSmartProfiles: dataLayer is not defined.')
488			return;
489		}
490
491		var SmartProfiles = {};
492		var FilteredKeywords = [];
493		var dataLayerKey = 'LeikiSmartProfiles';
494		var keywordFilters = {
495			aste_helsinki: {
496				relevance: 2,
497				reversedSlotsLeft: 5,
498			},
499			iabtier1: {
500				relevance: 10,
501				reversedSlotsLeft: 5,
502			}
503		}
504
505		// Find correct object by key from dataLayer.
506		dataLayer.forEach(function (dataLayerItem) {
507			// If dataLayer item have object named by dataLayerKey
508			// eg. datalayer.LeikiSmartProfiles
509			if (dataLayerItem[dataLayerKey]) {
510				SmartProfiles = dataLayerItem[dataLayerKey];
511			};
512		});
513
514		// First get all object keys of SmartProfiles. Keys are SmartProfile classifications.
515		// Then go through all the classifications
516		Object.keys(SmartProfiles).forEach(function (classification) {
517			// Use only keywordFilters classifications
518			if (classification in keywordFilters) {
519				// Go throug all classification objects. In object we have array of keywords.
520				SmartProfiles[classification].forEach(function (keyword) {
521					// Filter out all keywords what doesn't meat minium relevance level
522					var isMeaningful = keywordFilters[classification].relevance < keyword.relevance;
523					if (isMeaningful && keywordFilters[classification].reversedSlotsLeft > 0) {
524						keywordFilters[classification].reversedSlotsLeft--;
525						FilteredKeywords.push(keyword.ID);
526					}
527				});
528			}
529		});
530
531		// Convert array to string. Keywords are separated by , by default
532		return FilteredKeywords.length > 0 ? FilteredKeywords.join() : null;
533
534	}
535
536	function cmpGetCookie(cname) {
537		var name = cname + "=";
538		var ca = document.cookie.split(';');
539		for(var i = 0; i < ca.length; i++) {
540			var c = ca[i];
541			while (c.charAt(0) == ' ') {
542				c = c.substring(1);
543			}
544			if (c.indexOf(name) == 0) {
545				return c.substring(name.length, c.length);
546			}
547		}
548		return "";
549	}
550
551	setTimeout(function() {
552		leiki_contextual = getLeikiContextual();
553	}, 50);
554
555	var googletag = googletag || {};
556	googletag.cmd = googletag.cmd || [];
557	var definedSlots = {};
558
559	googletag.cmd.push(function() {
560		googletag.pubads().addEventListener('slotRenderEnded', function(event) {
561			if (event.slot.getSlotElementId().includes('dfp__interstitial')) {
562				if (event.isEmpty) {
563					console.log('Interstitial empty...');
564				}
565			}
566		});
567	});
568
569	//var dfpConfig = {"location":"frontpage","serviceName":"hymy","slots":["desk-1","in-text","rectangle-1","rectangle-2","rectangle-3","rectangle-4","rectangle-5","in-text","interstitial","mob-1","mob-2","mob-3"],"serviceStarted":""};
570	var dfpConfig = {"location":"frontpage","serviceName":"hymy","slots":["desk-1","in-text","rectangle-1","rectangle-2","rectangle-3","rectangle-4","rectangle-5","in-text","mob-1","mob-2","mob-3","to
570pad-mob"],"serviceStarted":""};
571
572	window.dfp = {
573		location: "frontpage",
574		serviceName: 'hymy',
575		visibility: document.documentElement.clientWidth >= 1279 ? "large" : document.documentElement.clientWidth >= 1020 ? "desktop" : "mobile",
576		networkcode: "135812570",
577		initialized: false,
578		definedAds: {},
579		slots: {
580			"desk-1": {
581				sizes: [[728,90], [980,120], [980,400], [980,552]],
582				visibility: ["desktop", "large"]
583			},
584			"rectangle-1": {
585				sizes: [[300,250], [300,300], [300,431], [300,600]],
586				visibility: ["desktop", "large"]
587			},
588			"rectangle-2": {
589				sizes: [[300,250], [300,300], [300,431], [300,600]],
590				visibility: ["desktop", "large"]
591			},
592			"rectangle-3": {
593				sizes: [[300,250], [300,300], [300,431], [300,600]],
594				visibility: ["desktop", "large"],
595				location: ["content", "forum"]
596			},
597			"rectangle-4": {
598				sizes: [[300,250], [300,300], [300,431], [300,600]],
599				visibility: ["desktop", "large"],
600				location: ["forum"]
601			},
602			"rectangle-5": {
603				sizes: [[300,250], [300,300], [300,431], [300,600]],
604				visibility: ["desktop", "large"],
605				location: ["forum"]
606			},
607			"in-text": {
608				sizes: [[300,250], [300,300], [468,400], [620,891]],
609				visibility: ["desktop", "large"]
610			},
611			'interstitial': {
612				sizes: [1, 1],
613				visibility: 'all'
614			},
615			"mob-1": {
616				sizes: [[360, 600], [320,600], [320,320], [300,600], [300,431], [300,300], [300,250], [300,150]],
617				visibility: ["mobile"]
618			},
619			"mob-2": {
620				sizes: [[360, 600], [320,600], [320,320], [300,600], [300,431], [300,300], [300,250], [300,150], ['fluid']],
621				visibility: ["mobile"],
622				location: ["frontpage", "content", "forum"]
623			},
624			"mob-3": {
625				sizes: [[360, 600], [320,600], [320,320], [300,600], [300,431], [300,300], [300,250], [300,150], ['fluid']],
626				visibility: ["mobile"],
627				location: ["forum"]
628			},
629			"mob-4": {
630				sizes: [[360, 600], [320,600], [320,320], [300,600], [300,431], [300,300], [300,250], [300,150], ['fluid']],
631				visibility: ["mobile"],
632				location: ["forum"]
633			},
634			'topad-mob': {
635				sizes: [[1, 2],[2, 2]],
636				visibility: 'mobile'
637			}
638		},
639
640		pbConfig: {
641			large: {
642				script: "https://otava-cdn.relevant-digital.com/static/tags/5e4c4c2c53ca952a90fa7d98.js",
643				configId: {
644					frontpage: "6078352f3b31001aa4257ba8",
645					content: "6078487db0b348085a257bb8",
646					forum: "60785428cac786902d627115"
647				},
648				lazyLoad: {
649					frontpage: 60,
650					content: 60,
651					forum: 60
652				}
653			},
654			desktop: {
655				script: "https://otava-cdn.relevant-digital.com/static/tags/5e4c4c2c53ca952a90fa7d98.js",
656				configId: {
657					frontpage: "6078352f3b31001aa4257ba8",
658					content: "6078487db0b348085a257bb8",
659					forum: "60785428cac786902d627115"
660				},
661				lazyLoad: {
662					frontpage: 60,
663					content: 60,
664					forum: 60
665				}
666			},
667			mobile: {
668				script: "https://otava-cdn.relevant-digital.com/static/tags/5e4c4c2c53ca952a90fa7d72.js",
669				configId: {
670					frontpage: "607844e0585539bac5257bb3",
671					content: "60784b5efaa9dbd1c0257bb9",
672					forum: "607856c5934372061f627116"
673				},
674				lazyLoad: {
675					frontpage: 60,
676					content: 60,
677					forum: 60
678				}
679			}
680		},
681
682		registerAdslots: function(i) {
683			for (adslot in this.slots) {
684				var v = this.slots[adslot].location || ["all"];
685				if (v != "all" && v.indexOf(adLocation) < 0) {
686					delete this.slots[adslot];
687					console.log(adslot + ' deleted!');
688				}
689			}
690		},
691
692		displayAdslot: function (id) {
693
694			//if (!this.initialized) this.init();
695
696			var that = this;
697			var parts = id.split('__');
698			var parts = parts[1].split('_');
699			var slotName = parts[0];
700
701			if (testSRA) {
702				//if (!(slotName.includes('native'))) {
703				//	return;
704				//}
705				return;
706			}
707
708			// Checking that the native adslot is known
709			if (slotName.includes('native') && this.slots.hasOwnProperty(slotName)) {
710				googletag.cmd.push(function () {
711					that.defineNative(id, slotName);
712					googletag.display(id);
713					if (dfpDebug) {console.log('googletag.display for ' + slotName + '...')}
714				});
715			} else {
716				// Checking that the adslot is known and visibility matches
717				//if (this.slots.hasOwnProperty(parts[0]) && ["all", this.visibility].indexOf(this.slots[parts[0]]['visibility'] || 'all') >= 0) {
718				if	(this.slots.hasOwnProperty(parts[0]) && (this.slots[parts[0]]['visibility'] === 'all' || this.slots[parts[0]]['visibility'].includes(this.visibility))) {
719					if (dfpDebug) {console.log('parts = ' + parts[0])}
720					if (parts[0] == 'interstitial') {
721						//var checkIfGoogletagReady = setInterval(function () {
722							//if (window.googletag && googletag.apiReady && googletag.pubadsReady) {
723								googletag.cmd.push(function () {
724									var slot = that.defineSlot(parts[0], id);
725									googletag.display(id);
726									if (dfpDebug) {console.log('googletag.display for ' + parts[0] + '..')}
727									//googletag.pubads().refresh([slot], {changeCorrelator: false});
728									//if (dfpDebug) {console.log('googletag.pubads().refresh for ' + parts[0] + '..')}
729								});
730								//clearInterval(checkIfGoogletagReady);
731							//}
732						//}, 50);
733					} else {
734						googletag.cmd.push(function () {
735							var slot = that.defineSlot(parts[0], id);
736							googletag.display(id);
737							if (slotName == 'desk-1' && location.href.indexOf('loadtopad') > -1) {
738								window.dfp.slotdesk1 = slot;
739							}
740							if (dfpDebug) {console.log('googletag.display for ' + parts[0] + '..')}
741						});
742					}
743				}
744			}
745
746		},
747
748		defineSlot: function (slotName, id) {
749
750			var id = id || 'dfp__' + slotName;
751			var path = this.networkcode + '/' + dfpConfig.serviceName + '/' + dfpConfig.location + '/' + slotName;
752			if (slotName.includes('topad-')) {
753				path = this.networkcode + '/' + dfpConfig.serviceName + '/content/' + slotName;
754			}
755			this.definedAds[id] = true;
756			//console.log('defineSlot: ' + slotName + '#' + id);
757
758			if (typeof this.slots[slotName]['sizes'] !== 'undefined') {
759				if (dfpDebug) {console.log('defineSlot for ' + slotName + '...')}
760				return googletag.defineSlot(path, this.slots[slotName]['sizes'], id).addService(googletag.pubads()).setTargeting('adslotid', id.replace('dfp__',''));
761			} else {
762				return googletag.defineOutOfPageSlot(path, id).addService(googletag.pubads());
763			}
764
765		},
766
767		defineNative: function(opt_div, slotName) {
768
769			var opt_div = opt_div || 'dfp__' + slotName;
770			var adUnitPath = this.networkcode + '/' + this.serviceName + '/native/' + slotName;
771			this.definedAds[opt_div] = true;
772			//console.log('defineNative: ' + slotName + '#' + opt_div;
773			//return googletag.defineSlot(adUnitPath, 'fluid', opt_div).addService(googletag.pubads());
774			return googletag.defineSlot(adUnitPath, this.slots[slotName]['sizes'], opt_div).addService(googletag.pubads()).setTargeting('adslotid', opt_div.replace('dfp__',''));
775
776		},
777
778		init: function(cXsegmentIds) {
779
780			//if (dfpDebug) {console.log('Initin segmentit: ' + cXsegmentIds)}
781
782			var that = this;
783
784			if (!dfpConfig.hasOwnProperty('serviceName')) {
785				console.log('DFP service name not set');
786				return;
787			}
788
789			this.registerAdslots(dfpConfig.slots);
790
791			if (!dfpConfig.serviceStarted) {
792
793				googletag.cmd.push(function () {
794
795					googletag.pubads().addEventListener('slotRenderEnded', function(event) {
796
797						if ((dfpDebug || 1 == 2) && window.dfp.visibility == 'mobile' && 1 == 2) {
798
799							var origAdSlotId = event.slot.getSlotElementId();
800							var acceptedSlotIds = ["mob-1","mob-2","mob-3","mob-4","2_1","2_2","2_3","2_4","2_5"];
801
802							if (acceptedSlotIds.some(value => origAdSlotId.endsWith(value))) {
803								if (dfpDebug) {console.log('adSlotId "' + origAdSlotId + '" is allowed for FRB...')}
804								var adPath = 'hymy';
805								if (event.isEmpty) {
806									if (window.relevantDigital) {
807
808										setTimeout(function() {
809											var newAdSlotId = origAdSlotId.replace("-","_") + '_111';
810											var adSlotName = origAdSlotId.substr(origAdSlotId.indexOf("__")+2);
811											//adSlotName = adSlotName.substr(0, adSlotName.indexOf("_"));
812											if (adSlotName.indexOf("_") > -1) {adSlotName = adSlotName.substr(0, adSlotName.indexOf("_"))}
813											if (dfpDebug) {console.log('adSlotName: ' + adSlotName)};
814											if (dfpDebug) {console.log('Creating new adslot: ' + '#' + origAdSlotId)};
815											jQuery('#' + origAdSlotId).after('<div id="' + newAdSlotId + '" class="' + adSlotName + '-article">
815<script>var ' + newAdSlotId + '; googletag.cmd.push(function(){' + newAdSlotId + ' = googletag.defineSlot("/135812570/'+ adPath +'/' + adLocation + '/' + adSlotName + '", [[300,250],[300,300],[300,431],[300,600]], "' + newAdSlotId + '").addService(googletag.pubads()).setTargeting("adslotid", ["' + origAdSlotId.replace("dfp__","") + '-111","frb"])});googletag.cmd.push(function() {googletag.display("' + newAdSlotId + '")});<\/script><\/div>');
816											var pbjsConf = window.dfp.pbConfig[window.dfp.visibility].configId[adLocation];
817											relevantDigital.cmd.push(function() {
818												relevantDigital.loadPrebid({configId: pbjsConf, manageAdserver: false, collapseEmptyDivs: true, collapseBeforeAdFetch: false, noGpt: true, allowedDivIds: [newAdSlotId], noSlotReload: true});
819													if (dfpDebug) {console.log('Requesting new ad to: #' + newAdSlotId)};
820											});
821										}, 100);
822
823									}
824								} else {
825									if (dfpDebug) {console.log('Ad slot ' + origAdSlotId + ' was not empty...')};
826								}
827							}
828
829						}
830
831						if (event.slot.getSlotElementId().indexOf('dfp__interstitial') > -1) {
832							if (event.isEmpty) {
833								if (dfpDebug) {console.log('Fpa is empty, calling webinterstitial...')}
834								window.canRunWebInterstitial = true;
835							} else {
836								if (dfpDebug) {console.log('BBW: preventing sticky player when fpa was shown...')}
837								window.bluebillywig = window.bluebillywig || {};
838								window.bluebillywig.cmd = window.bluebillywig.cmd || [];
839								//window.bluebillywig.cmd.push(function($$api) {
840								//	//const originalStickyMode = $$api.getPlayoutData().stickyMode;
841								//	$$api.updatePlayout({stickyMode: 'none'});
842								//	//$$api.updatePlayout({stickyMode: originalStickyMode});
843								//});
844								window.bluebillywig.cmd.push({
845									playerId: '/p/inarticle/a/hymy',
846									callback: function($$api) {
847										$$api.updatePlayout({stickyMode: 'none'});
848									}
849								});
850							}
851						}
852
853					});
854
855					googletag.pubads().setTargeting("url_domain", window.location.host),
856					googletag.pubads().setTargeting("url_path", window.location.pathname),
857					googletag.pubads().setTargeting("url_params", window.location.search.substring(1));
858					googletag.pubads().setTargeting("hb_setup", hb_setup);
859					//googletag.pubads().setCentering(true);
860
861
862					var m = document.cookie.match(/frosmo_keywords=.([^;$]+)/);
863					if(m != null &&  m.length) {
864						googletag.pubads().setTargeting("frosmo", m[1].split("."))
865					}
866
867					if (leiki_contextual !== null && leiki_contextual !== 'undefined') {
868
869						if (dfpDebug) {console.log('leiki_contextual_api success:', leiki_contextual);}
870						googletag.pubads().setTargeting("leiki_contextual", leiki_contextual);
871
872					}
873
874					if (window.dataLayer) {
875
876						//articleCategory = google_tag_manager["GTM-K5WDX4"].dataLayer.get('PrimaryCategory');
877						//articleCategories = google_tag_manager["GTM-K5WDX4"].dataLayer.get('Categories');
878						//recipeTheme = google_tag_manager["GTM-K5WDX4"].dataLayer.get('RecipeTheme');
879						//articleTags = google_tag_manager["GTM-K5WDX4"].dataLayer.get('Tags');
880
881						if (articleCategory != undefined && articleCategory != '') {
882							googletag.pubads().setTargeting("articlecategory", articleCategory.toLowerCase());
883							if (dfpDebug) {console.log('Targeting for articlecategory: ' + articleCategory.toLowerCase());}
884						}
885						if (articleCategories != undefined && articleCategories != '') {
886							googletag.pubads().setTargeting("articlecategories", articleCategories.toLowerCase());
887							if (dfpDebug) {console.log('Targeting for articlecategories: ' + articleCategories.toLowerCase());}
888						}
889						if (articleSection != undefined && articleSection != '') {
890							googletag.pubads().setTargeting("articlesection", articleSection.toLowerCase());
891							if (dfpDebug) {console.log('Targeting for articlesection: ' + articleSection.toLowerCase());}
892						}
893						if (articleTags != undefined && articleTags != '') {
894							googletag.pubads().setTargeting("articlekeywords", articleTags.toLowerCase().replace(/, /g, ','));
895							if (dfpDebug) {console.log('Targeting for articlekeywords: ' + articleTags.toLowerCase().replace(/, /g, ','));}
896						}
897
898					} else {
899						console.error('DataLayer not ready for targeting...')
900					}
901
902					if (cXsegmentIds !== null && cXsegmentIds !== undefined) {
903
904						var regexPattern = new RegExp("(\\b8nqech16gy6q\\b)");
905						if (!regexPattern.test(cXsegmentIds)) {
906							cXsegmentIds = (Array.isArray(cXsegmentIds) && cXsegmentIds.length === 0) ? '8nqech16gy6q' : (cXsegmentIds !== '' ? cXsegmentIds + ',8nqech16gy6q' : cXsegmentIds);
907							if (dfpDebug) {console.log('Additional DFP setTargeting CxSegments: "8nqech16gy6q"')}
908						}
909						var regexPattern = new RegExp("(\\b8mt8vs49hkio\\b)");
910						if (!regexPattern.test(cXsegmentIds)) {
911							cXsegmentIds = cXsegmentIds + (cXsegmentIds !== '' ? ',' : '') + '8mt8vs49hkio';
912							if (dfpDebug) {console.log('Additional DFP setTargeting CxSegments: "8mt8vs49hkio"')}
913						}
914						var regexPattern = new RegExp("(\\b8o1gwyxui6y1\\b)");
915						if (!regexPattern.test(cXsegmentIds)) {
916							cXsegmentIds = cXsegmentIds + (cXsegmentIds !== '' ? ',' : '') + '8o1gwyxui6y1,aavib3epzfey';
917							if (dfpDebug) {console.log('Additional DFP setTargeting CxSegments: "8o1gwyxui6y1,aavib3epzfey"')}
918						}
919						var regexPattern = new RegExp("(\\b8o1mlcz9mvdd\\b)");
920						if (!regexPattern.test(cXsegmentIds)) {
921							cXsegmentIds = cXsegmentIds + (cXsegmentIds !== '' ? ',' : '') + '8o1mlcz9mvdd';
922							if (dfpDebug) {console.log('Additional DFP setTargeting CxSegments: "8o1mlcz9mvdd"')}
923						}
924
925						if (dfpDebug) {console.log('DFP setTargeting CxSegments: ' + cXsegmentIds)}
926						googletag.pubads().setTargeting("CxSegments", cXsegmentIds);
927
928					}
929
930/*
931					if (dfpDebug) {console.log('Calling cX.getSegments...')}
932					cX.getSegments('f1ab28b7c9202ce3defa8bb2979a88f90c7a5ab2', function(segments) {
933						cX.Array.forEach(segments, function (cxTypedSegment, index) {
934							if (cxTypedSegment.type == 'contextual') {
935								contextualIds.push(cxTypedSegment.id);
936							}
937						});
938						if (dfpDebug) {console.log('Setting targeting fo cX.getSegments: ' + contextualIds.join())}
939						googletag.pubads().setTargeting("CxContext", contextualIds.join());
940					});
941*/
942
943					googletag.pubads().setTargeting("CxContext", cxContextualIds.join());
944
945					//var renderMarginPercent = Math.random() < 1/3 ? 20 : Math.random() < 1/2 ? 40 : 80;
946					var renderMarginPercent = window.dfp.pbConfig[window.dfp.visibility].lazyLoad[adLocation] || 40;
947					googletag.pubads().setTargeting("experiments", "lazyload_" + renderMarginPercent);
948
949
950					googletag.pubads().collapseEmptyDivs(),
951					googletag.pubads().enableLazyLoad({
952						fetchMarginPercent: 100,
953						renderMarginPercent: renderMarginPercent,
954						mobileScaling: 1
955					});
956					if (dfpDebug) {console.log('renderMarginPercent: ' + renderMarginPercent)}
957
958	/*
959					googletag.pubads().enableLazyLoad({
960						fetchMarginPercent: 100,
961						renderMarginPercent: 40,
962						mobileScaling: 1
963					});
964	*/
965
966					googletag.pubads().setTargeting("deliveryType", deliveryType);
967
968					(function () {
969
970						function generateNewPPID() {
971							return crypto.randomUUID().replace(/-/g, '');
972						}
973
974						function parsePossiblyDoubleEncodedJSON(value) {
975							var parsed = value;
976							while (typeof parsed === 'string') {
977								parsed = JSON.parse(parsed);
978							}
979							return parsed;
980						}
981
982						function setPPID(ppid) {
983							if (!ppid) return;
984							localStorage.setItem('ppid', ppid);
985							googletag.pubads().setPublisherProvidedId(ppid);
986						}
987
988						var storedPPID = localStorage.getItem('ppid');
989
990						if (storedPPID) {
991							if (dfpDebug) {console.log('ls storedPPID: ', storedPPID)}
992							googletag.pubads().setPublisherProvidedId(storedPPID);
993							return;
994						}
995
996						try {
997							var gravitoValue = localStorage.getItem('gravito-microprofile-data');
998							if (gravitoValue) {
999								var parsed = parsePossiblyDoubleEncodedJSON(gravitoValue);
1000								if (parsed && parsed.i) {
1001									var migratedPPID = btoa(parsed.i);
1002									if (dfpDebug) {console.log('gmd ls migratedPPID: ', migratedPPID)}
1003									setPPID(migratedPPID);
1004									return;
1005								}
1006							}
1007						} catch (e) {
1008							console.warn('Gravito migration failed:', e);
1009						}
1010
1011						var newPPID = generateNewPPID();
1012						setPPID(newPPID);
1013						if (dfpDebug) {console.log('created a newPPID: ', newPPID)}
1014
1015					})();
1016
1017					//waitForResource('localStorage', 'gravito-microprofile-data').then(function (value) {
1018					//	if (dfpDebug) {console.log('gravito-microprofile-data exists in local storage with value: ', value)}
1019					//	var ppid = btoa(JSON.parse(JSON.parse(value)).i);
1020					//	if (ppid) {
1021					//		googletag.pubads().setPublisherProvidedId(ppid);
1022					//		if (dfpDebug) {console.log('ppid: ' + ppid)}
1023					//	}
1024					//});
1025
1026					googletag.pubads().enableSingleRequest();
1027					googletag.pubads().disableInitialLoad();
1028					googletag.enableServices();
1029					console.timeEnd("timer");
1030
1031					dfpConfig.serviceStarted = true;
1032
1033				})
1034
1035			}
1036
1037			this.initialized = true;
1038			if (dfpDebug) {console.log('DFP initialized...')}
1039
1040		}
1041	}
1042
1043
1044	if (useHBM) {
1045
1046		var rdads = document.createElement('script');
1047		rdads.async = true;
1048		var useSSL = 'https:' == document.location.protocol;
1049		rdads.src = window.dfp.pbConfig[window.dfp.visibility].script;
1050		var node = document.getElementsByTagName('script')[0];
1051		node.parentNode.insertBefore(rdads, node);
1052
1053		var pbjsConf = window.dfp.pbConfig[window.dfp.visibility].configId[adLocation];
1054		if (dfpDebug) {console.log('pbjsConf in use ' + pbjsConf);}
1055
1056	}
1057
1058	function initDFP(cXsegmentIds) {
1059
1060		//if (dfpDebug) {console.log('cSsegmentIds: ' + cXsegmentIds)}
1061		if( window.dfp !== undefined ) {
1062			if (dfpDebug) {console.log('initDFP() called by cX.getUserSegmentIds ' + cXsegmentIds + '...')}
1063			if (location.href.indexOf("/erotiikka") == -1 && document.location.href.indexOf("/kuvat-ja-videot") == -1) {
1064				setTimeout(function(){
1065					window.dfp.init(cXsegmentIds);
1066				}, 1);
1067				setTimeout(function(){
1068					if (useHBM) {
1069						if (!testSRA) {
1070							if (dfpDebug) {console.log('HBM initialized...')}
1071							if (location.href.indexOf('loadtopad') > -1) {
1072								googletag.pubads().refresh([window.dfp.slotdesk1])
1073							}
1074							initHBM(cXsegmentIds);
1075						}
1076					} else {
1077						if (!testSRA) {
1078							console.log('HBM not in use!!!');
1079							googletag.pubads().refresh();
1080						}
1081					}
1082				}, 1);
1083			}
1084		} else {
1085			console.log('DFP init failed: window.dfp missing!');
1086		}
1087
1088	}
1089
1090	function initHBM(cXsegmentIds) {
1091
1092		if (dfpDebug) {console.log('initHBM called...')}
1093
1094		var hbArticleTags = articleTags != '' ? articleTags.split() : [];
1095		var hbArticleCategories = articleCategories != '' ? [...new Set(articleCategory.split(',').concat(articleCategories.split(',')))] : [];
1096
1097		window.relevantDigital = window.relevantDigital || {};
1098		relevantDigital.cmd = relevantDigital.cmd || [];
1099		relevantDigital.cmd.push(function() {
1100
1101			if (location.href.indexOf('loadtopad') > -1) {
1102
1103				let hasDoneFirstCall;
1104				relevantDigital.addAuctionCallbacks({
1105					onBeforeAuctionSetup: function ({ auction }) {
1106						if (!(window.googletag || {}).pubads) {
1107							console.error('GPT not initialized, this method only works if GPT-slots are created before calling relevantDigital.loadPrebid()');
1108							return;
1109						}
1110						if (hasDoneFirstCall) { // Only do this on page-load and not subsequent auctions
1111							return;
1112						}
1113						hasDoneFirstCall = true;
1114
1115						// Slots to load immediately (without waiting for relevantDigital)
1116						//const TO_LOAD_NOW = ['dfp__desk-1'];
1117						const TO_LOAD_NOW = [];
1118						// Slots to exclude entirely (never loaded)
1119						//const NOT_TO_LOAD_NOW = ['dfp__interstitial_1','dfp__desk-1'];
1120						const NOT_TO_LOAD_NOW = ['dfp__desk-1'];
1121
1122						const isLoadNowDiv = (divId) => TO_LOAD_NOW.includes(divId);
1123						const isNotToLoadDiv = (divId) => NOT_TO_LOAD_NOW.includes(divId);
1124
1125						const loadNowSlots = [];
1126
1127						googletag.pubads().getSlots().forEach((slot) => {
1128							const divId = slot.getSlotElementId(); // Get the div ID associated with the slot
1129							if (isLoadNowDiv(divId)) {
1130								loadNowSlots.push(slot);
1131							}
1132						});
1133
1134						if (!loadNowSlots.length && !NOT_TO_LOAD_NOW.length) {
1135							return; // continue as normal
1136						}
1137
1138						// Requests slots in TO_LOAD_NOW immediately
1139						if (loadNowSlots.length) {
1140							googletag.pubads().refresh(loadNowSlots);
1141						}
1142
1143						// Make sure NOT_TO_LOAD_NOW slots are excluded from the auction
1144						auction.adUnits = auction.adUnits.filter(({ gamPath, divId }) =>
1145							!isNotToLoadDiv(divId)
1146						);
1147
1148						// Then manually remove them when Relevant is doing the ad request
1149						auction.googletagCalls = auction.googletagCalls || {};
1150						auction.googletagCalls.refresh = (slots, ...rest) => {
1151							const all = slots || googletag.pubads().getSlots();
1152							const toLoad = all.filter((s) =>
1153								!isNotToLoadDiv(s.getSlotElementId()) // Exclude NOT_TO_LOAD_NOW slots
1154							);
1155							googletag.pubads().refresh(toLoad, ...rest);
1156						};
1157					}
1158				});
1159
1160			}
1161
1162			if (location.href.indexOf('interstitial11') > -1) {
1163
1164				let hasDoneFirstCall;
1165				relevantDigital.addAuctionCallbacks({
1166					onBeforeAuctionSetup: function ({ auction }) {
1167						if (!(window.googletag || {}).pubads) {
1168							console.error('GPT not initialized, this method only works if GPT-slots are created before calling relevantDigital.loadPrebid()');
1169							return;
1170						}
1171						if (hasDoneFirstCall) { // Only do this on page-load and not subsequent auctions
1172							return;
1173						}
1174						hasDoneFirstCall = true;
1175
1176						// Slots to load immediately (without waiting for relevantDigital)
1177						//const TO_LOAD_NOW = ['dfp__desk-1'];
1178						const TO_LOAD_NOW = [];
1179						// Slots to exclude entirely (never loaded)
1180						//const NOT_TO_LOAD_NOW = ['dfp__interstitial_1','dfp__desk-1'];
1181						const NOT_TO_LOAD_NOW = ['dfp__interstitial_1'];
1182
1183						const isLoadNowDiv = (divId) => TO_LOAD_NOW.includes(divId);
1184						const isNotToLoadDiv = (divId) => NOT_TO_LOAD_NOW.includes(divId);
1185
1186						const loadNowSlots = [];
1187
1188						googletag.pubads().getSlots().forEach((slot) => {
1189							const divId = slot.getSlotElementId(); // Get the div ID associated with the slot
1190							if (isLoadNowDiv(divId)) {
1191								loadNowSlots.push(slot);
1192							}
1193						});
1194
1195						if (!loadNowSlots.length && !NOT_TO_LOAD_NOW.length) {
1196							return; // continue as normal
1197						}
1198
1199						// Requests slots in TO_LOAD_NOW immediately
1200						if (loadNowSlots.length) {
1201							googletag.pubads().refresh(loadNowSlots);
1202						}
1203
1204						// Make sure NOT_TO_LOAD_NOW slots are excluded from the auction
1205						auction.adUnits = auction.adUnits.filter(({ gamPath, divId }) =>
1206							!isNotToLoadDiv(divId)
1207						);
1208
1209						// Then manually remove them when Relevant is doing the ad request
1210						auction.googletagCalls = auction.googletagCalls || {};
1211						auction.googletagCalls.refresh = (slots, ...rest) => {
1212							const all = slots || googletag.pubads().getSlots();
1213							const toLoad = all.filter((s) =>
1214								!isNotToLoadDiv(s.getSlotElementId()) // Exclude NOT_TO_LOAD_NOW slots
1215							);
1216							googletag.pubads().refresh(toLoad, ...rest);
1217						};
1218					}
1219				});
1220
1221			}
1222
1223			if (location.href.indexOf('interstitial22') > -1) {
1224
1225				let hasDoneFirstCall;
1226				relevantDigital.addAuctionCallbacks({
1227					onBeforeAuctionSetup: function ({ auction }) {
1228						if (!(window.googletag || {}).pubads) {
1229							console.error('GPT not initialized, this method only works if GPT-slots are created before calling relevantDigital.loadPrebid()');
1230							return;
1231						}
1232						if (hasDoneFirstCall) { // Only do this on page-load and not subsequent auctions
1233							return;
1234						}
1235						hasDoneFirstCall = true;
1236
1237						// Load all slots associated with these div IDs immediately (without waiting for relevantDigital)
1238						const TO_LOAD_NOW = ['dfp__interstitial_1'];
1239
1240						const isLoadNowDiv = (divId) => TO_LOAD_NOW.includes(divId);
1241						const loadNowSlots = [];
1242
1243						googletag.pubads().getSlots().forEach((slot) => {
1244							const divId = slot.getSlotElementId(); // Get the div ID associated with the slot
1245							if (isLoadNowDiv(divId)) {
1246								loadNowSlots.push(slot);
1247							}
1248						});
1249
1250						if (!loadNowSlots.length) {
1251							return; // continue as normal
1252						}
1253
1254						// Requests slots immediately
1255						googletag.pubads().refresh(loadNowSlots);
1256
1257						// Make sure they're not included in the prebid auction
1258						auction.adUnits = auction.adUnits.filter(({ gamPath, divId }) =>
1259							!isLoadNowDiv(divId)
1260						);
1261
1262						// Then manually remove them when Relevant is doing the ad request
1263						auction.googletagCalls = auction.googletagCalls || {};
1264						auction.googletagCalls.refresh = (slots, ...rest) => {
1265							const all = slots || googletag.pubads().getSlots();
1266							const toLoad = all.filter((s) =>
1267								!isLoadNowDiv(s.getSlotElementId())
1268							);
1269							googletag.pubads().refresh(toLoad, ...rest);
1270						};
1271					},
1272				});
1273
1274			}
1275
1276			if (location.href.indexOf('interstitial33') > -1) {
1277
1278				let hasDoneFirstCall;
1279				relevantDigital.addAuctionCallbacks({
1280					// Code in function below can alternatively be added inside relevantDigital.loadPrebid({ onBeforeAuctionSetup: { ... } })
1281					onBeforeAuctionSetup: function({ auction }) {
1282						if(!(window.googletag || {}).pubads) {
1283							console.error('GPT not initialized, this method only works if GPT-slots are created before calling relevantDigital.loadPrebid()');
1284							return;
1285						}
1286						if(hasDoneFirstCall) { // Only do this on page-load and not subsequent auctions
1287							return;
1288						}
1289						hasDoneFirstCall = true;
1290
1291						// Load all slots containing these strings in ad unit paths immediately (without waiting for prebid)
1292						const TO_LOAD_NOW = ['desk-1', 'interstitial'];
1293
1294						const isLoadNowPath = (p) => TO_LOAD_NOW.find((s) => p.includes(s));
1295						const loadNowSlots = [];
1296						googletag.pubads().getSlots().forEach((slot) => {
1297							if (isLoadNowPath(slot.getAdUnitPath())) {
1298								loadNowSlots.push(slot);
1299							}
1300						});
1301						if (!loadNowSlots.length) {
1302							return; // continue as normal
1303						}
1304						// Requests slots immediately
1305						googletag.pubads().refresh(loadNowSlots);
1306
1307						// Make sure they're not included in the prebid auction
1308						auction.adUnits = auction.adUnits.filter(({ gamPath }) => !isLoadNowPath(gamPath));
1309
1310						// Then manually remove them when Relevant is doing the ad request
1311						auction.googletagCalls = auction.googletagCalls || {};
1312						auction.googletagCalls.refresh = (slots, ...rest) => {
1313							const all = slots || googletag.pubads().getSlots();
1314							const toLoad = all.filter((s) => !isLoadNowPath(s.getAdUnitPath()));
1315							googletag.pubads().refresh(toLoad, ...rest);
1316						};
1317					},
1318				});
1319
1320			}
1321
1322			relevantDigital.addPrebidConfig({
1323				ortb2: {
1324					site: {
1325						//keywords: contextualIds.join(),
1326						ext: {
1327							data: {
1328								CxContext: Object.values(cxContextualIds),
1329								articleCategories: hbArticleCategories,
1330								articleTags: hbArticleTags
1331							}
1332						}
1333					}
1334				}
1335			});
1336
1337			relevantDigital.loadPrebid({
1338				configId: pbjsConf,
1339				manageAdserver: false, //Manage adserver set to off.
1340				collapseEmptyDivs: true,
1341				collapseBeforeAdFetch: false,
1342				noGpt: true,
1343				allowedDivIds: null, // set to an array to only load certain <div>s, example - ["divId1", "divId2"]
1344				noSlotReload: true, // set true to only load ad slots that have never been loaded
1345				onBeforeAuctionSetup: function(params) {
1346					params.auction.adUnits.forEach(function(unit) {
1347						unit.bids.forEach(function(bid){
1348							if (bid.bidder == 'appnexus') {
1349								bid.params.keywords = {cxSegments: cXsegmentIds, CxContext: cxContextualIds, articleTags: hbArticleTags, articleCategories: hbArticleCategories};
1350								if (dfpDebug) {console.log('Setting params for Xandr bidder...')}
1351							}
1352						})
1353					})
1354				}
1355			});
1356
1357			if (location.href.indexOf('testnewcmp=1') > -1) {
1358
1359				const printEvent = (type, ev, adUnitInstance) => {
1360					console.info(`********** ${type} **********`);
1361					console.info('Event: ', ev);
1362					console.info('AdUnitInstance (if any): ', adUnitInstance);
1363					console.info('Is direct rendering: ', ev.directRender);
1364					console.info('Direct rendered bid: ', ev.bid);
1365					console.info('Ad slot: ', ev.slot);
1366					console.info('Is empty: ', ev.isEmpty);
1367				};
1368				relevantDigital.addAdsCallbacks({
1369					slotRequested: (...args) => {
1370						printEvent('slotRequested', ...args);
1371					},
1372					slotResponseReceived: (...args) => {
1373						printEvent('slotResponseReceived', ...args);
1374					},
1375					slotRenderEnded: (ev, data) => {
1376						printEvent('slotRenderEnded', ev, data);
1377					}
1378				});
1379
1380			}
1381
1382		});
1383
1384	}
1385
1386
1387	function loadAdSlot(adSlotId) {
1388
1389		if (location.href.includes('testnewads=1')) {
1390			return;
1391		}
1392
1393		if (dfpDebug) {console.log('HAS: runHeaderbid: ' + adSlotId + ', ' + (Date.now() - timerStart) + 'ms...')}
1394		observerHeaderbidRun = true;
1395
1396		var adUnit = adSlotId.split('__')[1].split('_')[0];
1397
1398		//var hbArticleTags = articleTags != '' ? articleTags.split(',') : [];
1399		var hbArticleTags = articleTags != '' ? articleTags.split(',').map(tag => tag.trim()) : [];
1400		var hbArticleCategories = articleCategories != '' ? [...new Set(articleCategory.split(',').concat(articleCategories.split(',')))] : [];
1401
1402		var takeOver = '', adSlotsNotAllowedForHBM = [];
1403		//if (hbArticleTags.includes('unelmien joulu')) { // exact match
1404		if (hbArticleTags.some(tag => tag.includes('joulu'))) {
1405			useHBM = false;
1406			takeOver = 'unelmien joulu';
1407		}
1408		if (['joulu', 'unelmien joulu'].some(cat => hbArticleCategories.includes(cat))) {
1409			useHBM = false;
1410			takeOver = 'unelmien joulu';
1411		}
1412		if (articleSection == 'unelmien joulu') {
1413			useHBM = false;
1414			takeOver = 'unelmien joulu';
1415		}
1416
1417		//if (!useHBM && takeOver == 'unelmien joulu') {
1418		//	adSlotsNotAllowedForHBM = ['mob-1', 'mob-2', 'desk-1', 'desk-2'];
1419		//	if (dfpDebug) {console.log('HAS: takeOver: ' + takeOver + ', adSlotsNotAllowedForHBM: ' + adSlotsNotAllowedForHBM)}
1420		//}
1421
1422		var slotLocation = adLocation;
1423		if (adUnit.includes('native')) {
1424			slotLocation = 'native';
1425		} else if (adUnit.includes('topad') || adUnit.includes('interstitial')) {
1426			slotLocation = 'content';
1427		}
1428
1429
1430		googletag.cmd.push(function() {
1431
1432			googletag.defineSlot('/' + window.dfp.networkcode + '/' + window.dfp.serviceName + '/' + slotLocation + '/' + adUnit + '', window.dfp.slots[adUnit].sizes, adSlotId)
1433			.addService(googletag.pubads())
1434			.setTargeting('adslotid', adSlotId.replace('dfp__',''))
1435			.setTargeting('CxContext', cxContextualIds);
1436			if (dfpDebug) {console.log('Defining slot: /' + window.dfp.networkcode + '/' + window.dfp.serviceName + '/' + slotLocation + '/' + adUnit)}
1437
1438		});
1439
1440		//if (adUnit.includes('native') || adUnit.includes('interstitial')) {
1441		if (['native', 'interstitial', 'topad-desk', 'desk-1', ...(adSlotsNotAllowedForHBM || [])].some(slot => adUnit.includes(slot)) || (["tad", "lads"].includes(deliveryType) && !useHBM)) {
1442
1443			googletag.cmd.push(function() {
1444				const slot = googletag.pubads().getSlots().find(s => s.getSlotElementId() === adSlotId);
1445				if (slot) {
1446					googletag.pubads().refresh([slot], {changeCorrelator: false});
1447				}
1448			});
1449
1450		} else {
1451
1452			if (dfpDebug) {
1453				console.log('HAS: Existing slots: ');
1454				googletag.pubads().getSlots().forEach((slot) => {
1455					console.log('HAS: ' + slot.getSlotElementId());
1456				});
1457			}
1458
1459			window.relevantDigital = window.relevantDigital || {};
1460			relevantDigital.cmd = relevantDigital.cmd || [];
1461			relevantDigital.cmd.push(function() {
1462
1463				relevantDigital.addPrebidConfig({
1464					ortb2: {
1465						site: {
1466							//keywords: contextualIds.join(),
1467							ext: {
1468								data: {
1469									CxContext: Object.values(cxContextualIds),
1470									articleCategories: hbArticleCategories,
1471									articleTags: hbArticleTags
1472								}
1473							}
1474						}
1475					}
1476				});
1477
1478				relevantDigital.loadPrebid({
1479					configId: pbjsConf,
1480					manageAdserver: false, //Manage adserver set to off.
1481					collapseEmptyDivs: true,
1482					collapseBeforeAdFetch: false,
1483					noGpt: true,
1484					allowedDivIds: Array.isArray(adSlotId) ? adSlotId : [adSlotId], // set to an array to only load certain <div>s, example - ["divId1", "divId2"]
1485					noSlotReload: true, // set true to only load ad slots that have never been loaded
1486					googletagCalls: {
1487						refresh: (slots) => googletag.pubads().refresh(slots, { changeCorrelator: false }),
1488					},
1489					onBeforeAuctionSetup: function(params) {
1490						params.auction.adUnits.forEach(function(unit) {
1491							unit.bids.forEach(function(bid){
1492								if (bid.bidder == 'appnexus' || bid.bidder == 'appnexus_s2s_alias') {
1493									bid.params.keywords = {cxSegments: cxSegmentIds, CxContext: cxContextualIds, articleTags: hbArticleTags, articleCategories: hbArticleCategories};
1494									if (dfpDebug) {console.log('Setting params for Xandr bidder...')}
1495								}
1496							})
1497						})
1498					}
1499
1500				});
1501			});
1502
1503		}
1504
1505	}
1506
1507
1508	if (location.href.indexOf('interstitial99') > -1) {
1509
1510
1511			let interval = setInterval(function(){
1512				if (window.googletag && googletag.apiReady && googletag.pubadsReady) {
1513					waitForElement("body").then(function(element) {
1514						var aStr = '
1514<script>var interstitialSlot2; googletag.cmd.push(function() {interstitialSlot2 = googletag.defineOutOfPageSlot(\"/135812570/hymy/frontpage/interstitial\", \"dfp__interstitial_2\").addService(googletag.pubads());});<\/script><div id=\"dfp__interstitial_2\">
1514<script>googletag.cmd.push(function() {googletag.display(\"dfp__interstitial_2\");googletag.pubads().refresh([interstitialSlot2]);});<\/script></div>';
1515						jQuery('#inner-wrapper > div.col-two').before(aStr);
1516						console.log('Interstitial added after timeout...');
1517					});
1518					clearInterval(interval);
1519				}
1520			}, 50);
1521
1522			waitForElement("body").then(function(element) {
1523				var aStr = '
1523<script>var interstitialSlot; googletag.cmd.push(function() {interstitialSlot = googletag.defineOutOfPageSlot(\"/135812570/hymy/frontpage/interstitial\", \"dfp__interstitial_1\").addService(googletag.pubads());});<\/script><div id=\"dfp__interstitial_1\">
1523<script>googletag.cmd.push(function() {googletag.display(\"dfp__interstitial_1\");googletag.pubads().refresh([interstitialSlot]);});<\/script></div>';
1524				jQuery('#inner-wrapper > div.col-two').before(aStr);
1525				console.log('Interstitial added...');
1526			});
1527
1528	}
1529
1530/*
1531	if (!location.href.includes('dfptesti')) {
1532
1533		if(typeof window.localStorage === 'object' && typeof window.localStorage.getItem === 'function') {
1534			cxSegmentIds = localStorage.getItem("_cX_segmentInfo");
1535		}
1536
1537		initDFP(cxSegmentIds);
1538		console.log('initDFP called with LS_cX_segmentInfo...');
1539
1540	}
1541*/
1542
1543</script>
1543
1544
1545<!-- DFP End -->
1546
1547<style>
1548
1549	#topbar .navi>li>a { padding: 0 6px; letter-spacing: 0; }
1550
1551	.bbp-dfp-slots .grid-item {
1552		padding: 25px 0 0;
1553	}
1554	.clearfix.grid__container.box--full.bbp-dfp-slots {
1555		border: none;
1556	}
1557	@media only screen and (max-width: 768px) {
1558		#bbpress-forums .bbp-body .bbp-reply-author {
1559			min-height: 60px !important;
1560			padding-left: 0 !important;
1561		}
1562		.grid-item2 {
1563			float: none;
1564		}
1565		.clearfix.grid__container.box--full.bbp-dfp-slots .grid-item {
1566			padding: 0;
1567		}
1568		.bbp-dfp-slots .grid-item {
1569			padding: 25px 0;
1570		}
1571	}
1572
1573</style>
1574
1575<!-- Google Tag Manager needs to be here -->
1576<script>
vendor: 327 bytes, lines 1576-1580
1576(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
1577new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
1578j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
1579'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
1580})(window,document,'script','dataLayer','
1580GTM-M3VTTX
vendor: 3 bytes, line 1580
1580');
1580</script>
1580
1581<!-- End Google Tag Manager -->
1582
1583<!-- Google Tag Manager -->
1584<script>
vendor: 327 bytes, lines 1584-1588
1584(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
1585new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
1586j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
1587'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
1588})(window,document,'script','dataLayer','
1588GTM-TSMVFP56
vendor: 3 bytes, line 1588
1588');
1588</script>
1588
1589<!-- End Google Tag Manager -->
1590
1591<!-- Google Tag Manager -->
1592<script>
vendor: 327 bytes, lines 1592-1596
1592(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
1593new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
1594j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
1595'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
1596})(window,document,'script','dataLayer','
1596GTM-T56W3Z7
vendor: 3 bytes, line 1596
1596');
1596</script>
1596
1597<!-- End Google Tag Manager -->
1598
1599<!-- // hymy.fi-->
1600
1601<!-- Head tag end, do not remove -->
1602    <meta name="viewport" content="width=device-width, initial-scale=1.0">
1603<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
1604
1605	<!-- This site is optimized with the Yoast SEO plugin v26.3 - https://yoast.com/wordpress/plugins/seo/ -->
1606	<title>Hymy</title>
1607	<link rel="canonical" href="https://hymy.fi/">
1608	<link rel="next" href="https://hymy.fi/page/2/">
1609	<meta property="og:locale" content="fi_FI">
1610	<meta property="og:type" content="website">
1611	<meta property="og:title" content="Hymy">
1612	<meta property="og:url" content="https://hymy.fi/">
1613	<meta property="og:site_name" content="Hymy">
1614	<meta property="og:image" content="https://hymy.fi/wp-content/uploads/2016/08/hymylogo-1024x710.jpg">
1615	<meta property="og:image:width" content="1024">
1616	<meta property="og:image:height" content="710">
1617	<meta property="og:image:type" content="image/jpeg">
1618	<meta name="twitter:card" content="summary_large_image">
1619	
1619<script type="application/ld+json" class="yoast-schema-graph">{"@context":"https://schema.org","@graph":[{"@type":"CollectionPage","@id":"https://hymy.fi/","url":"https://hymy.fi/","name":"Hymy","isPartOf":{"@id":"https://hymy.fi/#website"},"breadcrumb":{"@id":"https://hymy.fi/#breadcrumb"},"inLanguage":"fi"},{"@type":"BreadcrumbList","@id":"https://hymy.fi/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Etusivu"}]},{"@type":"WebSite","@id":"https://hymy.fi/#website","url":"https://hymy.fi/","name":"Hymy","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://hymy.fi/haku/?q={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fi"}]}</script>
1619
1620	<meta name="msvalidate.01" content="E4D3B0C3D94B9854E18775333926A18D">
1621	<meta name="google-site-verification" content="9S0cRl0O73BRM7KJ0YOxE65L5jzMKkFxwfw1kJKBCXc">
1622	<!-- / Yoast SEO plugin. -->
1623
1624
1625<link rel="dns-prefetch" href="//ajax.googleapis.com">
1626<link rel="dns-prefetch" href="//plausible.io">
1627
1628    
1628<script>
1629      window.AsteikkoMagWidgets = {
1630        siteUrl: "https:\/\/hymy.fi"      };
1631    </script>
1631
1632
1633    <style id="wp-img-auto-sizes-contain-inline-css" type="text/css">
1634img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
1635/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
1636</style>
1637<link rel="stylesheet" id="asteikko-auth-style-css" href="https://hymy.fi/wp-content/plugins/asteikko-auth-otavamedia/css/style.css?ver=3.0.5" type="text/css" media="all">
1638<link rel="stylesheet" id="asmag_widgets_css-css" href="https://hymy.fi/wp-content/plugins/asteikko-mag/dist/wp-widgets/index.css?ver=6.21.2-67928b343a4e93d76879e5e503996d22" type="text/css" media="all">
1639<link rel="stylesheet" id="om-core-css" href="https://hymy.fi/wp-content/themes/om-core/style.css?ver=1790248696" type="text/css" media="all">
1640<link rel="stylesheet" id="om-core-widgets-styles-css" href="https://hymy.fi/wp-content/plugins/om-widgets-plugin/assets/widgets.css?ver=6.9.9" type="text/css" media="all">
1641<style id="wp-block-library-inline-css" type="text/css">
1642:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;
1642--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}.has-text-align-center{text-align:center}.has-text-align-left{text-align:left}.has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style*=border-top-color]){border-top-style:solid}html :where([style*=border-right-color]){border-right-style:solid}html :where([style*=border-bottom-color]){border-bottom-style:solid}html :where([style*=border-left-color]){border-left-style:solid}html :where([style*=border-width]){border-style:solid}html :where([style*=border-top-width]){border-top-style:solid}html :where([style*=border-right-width]){border-right-style:solid}html :where([style*=border-bottom-width]){border-bottom-style:solid}html :where([style*=border-left-width]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}
1643/*wp_block_styles_on_demand_placeholder:6ab572c066d17*/
1644/*# sourceURL=wp-block-library-inline-css */
1645</style>
1646<style id="classic-theme-styles-inline-css" type="text/css">
1647/*! This file is auto-generated */
1648.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
1649/*# sourceURL=/wp-includes/css/classic-themes.min.css */
1650</style>
1651<link rel="stylesheet" id="om-footer-css" href="https://hymy.fi/wp-content/plugins/om-footer/assets/css/om-footer.css?ver=1.1.0" type="text/css" media="all">
1652<link rel="stylesheet" id="child-style-css" href="https://hymy.fi/wp-content/themes/om-hymy-theme/style.css?ver=6.9.9" type="text/css" media="all">
1653<link rel="stylesheet" id="style_login_widget-css" href="https://hymy.fi/wp-content/plugins/miniorange-oauth-oidc-single-sign-on-single/resources/css/style_login_widget.css?ver=6.9.9" type="text/css" media="all">
1654    
1654<script type="text/javascript" id="om-website-analytics">
1655      analyticsEvent = function() {};
1656      analyticsSocial = function() {};
1657      analyticsVPV = function() {};
1658      analyticsClearVPV = function() {};
1659      analyticsForm = function() {};
1660      window.dataLayer = window.dataLayer || [];
1661      dataLayer.push({"PageType":"Etusivu","PaidUser":false,"UserLevel":"1"});
1662    </script>
vendor: 1 bytes, line 1662
1662
1663<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js" id="jquery-js"></script>
vendor: 1 bytes, line 1663
1663
1664<script type="text/javascript" src="https://hymy.fi/wp-content/themes/om-core/plugins.js?ver=1790248696" id="om-core-plugins-js"></script>
vendor: 1 bytes, line 1664
1664
1665<script type="text/javascript" defer data-domain="hymy.fi" data-api="https://plausible.io/api/event" data-cfasync="false" src="https://plausible.io/js/plausible.outbound-links.js?ver=2.3.1" id="plausible-analytics-js"></script>
vendor: 1 bytes, line 1665
1665
1666<script type="text/javascript" id="plausible-analytics-js-after">
1667/* <![CDATA[ */
1668window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) }
1669//# sourceURL=plausible-analytics-js-after
1670/* ]]> */
1671</script>
1671
1672<link rel="https://api.w.org/" href="https://hymy.fi/wp-json/"><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://hymy.fi/xmlrpc.php?rsd">
1673<meta name="generator" content="WordPress 6.9.9">
1674<!-- AWPO lazy-load marker --><meta name="plausible-analytics-version" content="2.3.1">
1675
1676    
1676<script>
1677        var wp_template_url = 'https://hymy.fi/wp-content/themes/om-core';
1678    </script>
1678
1679
1680
1681    
1682    <!-- SSO login related -->
1683    
1683<script type="text/javascript">
1684        window.om = window.om || {};
1685        window.om.wp_nonce = "ac08bb4d1b";
1686        window.om.client_id = "2db43cdc-f69e-4559-9e56-c5694ebacff6";
1687        window.om.client_url = "https://tili.otavamedia.fi";
1688    </script>
1688
1689
1690
1691</head>
1692
1693<body class="home blog wp-theme-om-core wp-child-theme-om-hymy-theme blog-1">
1694
1695    <!-- Body tag start, do not remove -->
1696
1697<!-- Google Tag Manager (noscript) -->
vendor: 68 bytes, lines 1697-1698
1697
1698<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
1698GTM-M3VTTX
vendor: 83 bytes, line 1698
1698" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
1699<!-- End Google Tag Manager (noscript) -->
1700
1701<!-- Google Tag Manager (noscript) -->
vendor: 68 bytes, lines 1701-1702
1701
1702<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
1702GTM-TSMVFP56
vendor: 83 bytes, line 1702
1702" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
1703<!-- End Google Tag Manager (noscript) -->
1704
1705<!-- Google Tag Manager (noscript) -->
1706<noscript><iframe height="0" width="0" style="display:none;visibility:hidden" data-src="https://www.googletagmanager.com/ns.html?id=GTM-T56W3Z7" class="awpo-lazy"></iframe></noscript>
1707<!-- End Google Tag Manager (noscript) -->
1708
1709<script>
1710
1711	if (location.href.includes('dfptesti')) {
1712
1713		if (window.dataLayer) {
1714			dataLayer.forEach(function (dataLayerItem) {
1715				if (dataLayerItem['PrimaryCategory'] !== '' && dataLayerItem['PrimaryCategory'] !== undefined) {
1716					articleCategory = dataLayerItem['PrimaryCategory'].toLocaleString().toLowerCase().replace(/, /g, ',');
1717					if (dfpDebug) {console.log('ArticleCategory: ' + articleCategory);}
1718				}
1719				if (dataLayerItem['Categories'] !== '' && dataLayerItem['Categories'] !== undefined) {
1720					articleCategories = dataLayerItem['Categories'].toLocaleString().toLowerCase().replace(/, /g, ',');
1721					if (dfpDebug) {console.log('Categories: ' + articleCategories);}
1722				}
1723				if (dataLayerItem['Tags'] !== '' && dataLayerItem['Tags'] !== undefined) {
1724					articleTags = dataLayerItem['Tags'].toLocaleString().toLowerCase().replace(/, /g, ',');
1725					if (dfpDebug) {console.log('Tags: ' + articleTags);}
1726				}
1727				if (dataLayerItem['Section'] !== '' && dataLayerItem['Section'] !== undefined) {
1728					articleSection = dataLayerItem['Section'].toLowerCase().replace(/, /g, ',');
1729					if (dfpDebug) {console.log('ArticleSection: ' + articleSection);}
1730				}
1731			});
1732		} else {
1733			console.error('DataLayer is not defined.')
1734		}
1735
1736		if(typeof window.localStorage === 'object' && typeof window.localStorage.getItem === 'function') {
1737			cxSegmentIds = localStorage.getItem("_cX_segmentInfo");
1738		}
1739		initDFP(cxSegmentIds);
1740		console.log('initDFP called with LS_cX_segmentInfo...');
1741
1742	}
1743
1744</script>
1744
1745
1746<!-- Body tag end, do not edit or remove -->
1747    
1747<script>
1748        function getCookie(name) {
1749            var value = "; " + document.cookie;
1750            var parts = value.split("; " + name + "=");
1751            if (parts.length == 2) return parts.pop().split(";").shift();
1752        }
1753
1754        if (getCookie("theme") == "light") {
1755            document.getElementsByTagName("body")[0].classList.add("light");
1756        }
1757    </script>
1757
1758
1759    <div id="additionalBg">
1760        <div id="topbar">
1761            <div class="wrapper--center">
1762
1763    
1764    <span id="mobile-navigation__button" class="fa fa-bars"></span>
1765    <span id="mobile-navigation__search" class="fa fa-search navi__search--button"></span>
1766
1767    
1768    <a class="topbar__logo float--left" href="https://hymy.fi/"></a>
1769
1770    <div id="mobile-scroll">
1771
1772      <div id="navigation--mobilebuttons" class="navi float--right">
1773        <a href="/tilaa" class="float--left">Tilaa</a>
1774<a href="/nakoislehti" class="navi__magazine float--left">Näköislehti</a>
1775
1776<a href="https://hymy.fi/kirjaudu/" title="Kirjaudu" class="navi__user float--left">
1777	Kirjaudu</a>
1778
1779      </div>
1780
1781      <ul id="navigation--primary" class="navi float--left"><li id="menu-item-36689" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-36689"><a href="https://hymy.fi/kategoria/uutiset/">Uutiset</a></li>
1782<li id="menu-item-692075" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-692075"><a href="https://hymy.fi/kategoria/ilmiot/">Ilmiöt</a></li>
1783<li id="menu-item-690496" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-690496"><a href="https://hymy.fi/kategoria/terveys/">Terveys</a></li>
1784<li id="menu-item-690497" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-690497"><a href="https://hymy.fi/kategoria/sotahistoria/">Sotahistoria</a></li>
1785<li id="menu-item-106865" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-106865"><a href="https://hymy.fi/kategoria/horoskooppi/">Horoskooppi</a></li>
1786<li id="menu-item-667255" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-667255"><a href="https://hymy.fi/kategoria/soini-sanoo-suoraan/">Soini sanoo suoraan</a></li>
1787</ul><div id="navigation--secondary" class="navi float--right">
1788
1789  <a href="/nakoislehti" class="navi__magazine float--left" title="Näköislehti">Näköislehti</a>
1790
1791  
1792
1793  <a href="https://hymy.fi/kirjaudu/" class="navi__icon navi__user float--left" title="Kirjaudu">
1794    <i class="fa fa-user"></i>
1795    <span class="display__text--tablet">Kirjaudu</span>
1796  </a>
1797
1798  <a class="navi__icon navi__search--button float--left" title="Haku">
1799    <i class="fa fa-search"></i>
1800  </a>
1801
1802</div>
1803          <div class="navi float--right" id="navigation--some">
1804
1805                          <a href="https://www.facebook.com/hymy.fi" target="_blank" title="Facebook" class="fa fa-facebook"></a>
1806                            <a href="https://twitter.com/HymyFI" target="_blank" title="Twitter" class="fa fa-twitter"></a>
1807                            <a href="https://hymy.fi/feed" target="_blank" title="RSS-syöte" class="fa fa-rss"></a>
1808                          </div>
1809          
1810      <div style="clear:both;"><!-- overflow:hidden; won't work in this case --></div>
1811
1812    </div><!-- mobile-scroll -->
1813  </div><!-- .wrapper--center -->        </div> <!-- topbar -->
1814
1815
1816        <div id="wrapper">
1817            <div id="inner-wrapper">
1818                <div class="widget-area super-widget-area">
1819                                    </div>
1820                <div class="widget-area top-widget-area">
1821
1822                    
1823                </div>
1824
1825                <div class="col-two">
1826  
1827
1828  <div class="widget-area">
1829          
1830  <div data-template="def50200deac6e002e6c43e00dc234bd388b6f5c5a2488f5a58c13bb18d679e205cba3fe624b73d9787240ad1d125840082149a29486cb3cdbaa73fa2f852cf85fb0c6aebaa35b3727d8b7e48b9680672309ff918d19183c1b2fb9" data-query="def502005d7dd94bdbec84ec451aee1061662822c2f2068edaea9cd3498af98a502ccacd3a6d03ff88a2350c1e8e61e34f1bf9bc520bc7dc446204907904507e1caeb24ccc30b918a89fd6ac1bc5c3f22f9c036f9f315c2cb974a488007917f6ea3b9c219b11351ba00152118aaef1fd6ec0d1732a6f8556f318d3bc173aa8a022b27c215566542ce3e7fa19c42ddac1e53467ee8a81b1d960e0c3df8939d67b7b4516998b4d6f20216bceecba49a2d0cac67b5b3e09023fb56abdd7a81618ce73b111eda819c4aaa7eff30ce090c131a46b1731a7b125f8ee5871e2737e12d1385462c6d3ab88ed05df97a55edafc9acca9ff225ef0caccf23806dce1fc85e6304565b362b1e33c3c05e8b5999db7b1902bf318049c52805d84984ced2f7b7b2628339834e84046
1830a4eba5dfe32c1c4b2e13cd3646dc7ea5bed5ea537f49c0f7da9bd58c1bacc4962cd5c6adba99c69cb1d5a9adc10cf3f0b47f595a503572e5f821757b77e173b6cb224372909a5ba67c29cfae98d3ea4cba44be3374832aa6fb8e90ba5597d3cd66d2a8f402607c7404eedc2ed84ecdf0bb454e4a9c82da65ab26e25e57c7e8da0ecde1bc552e794102b80a886eae0837f6d8c74b52942ee7ac4662e46586d15e4a223d26fc7b693e691b3311d89513f8a107ff28d399877d4fb76ccf53f6dec9673421ee4b1897a6bab84ab3e09347c964b66de68cfe2104ade1b15941fba5e6701445e28bf00634a4518b2c9cd46f407ddcda9060ff4b0684520745b82913f78d0413e434d6d21c35642391cbe34ff6bc5de6bb214f193d42c81e1daca7aadacf2dc090109d0342be1d09635d16eae1c11fc6aedea84b09bc383d9520878a0c02ee24c31870ad60462975b8a89ccdb9d47b59c13d2a26648b98dc3df3e35b062d4e7ce2e937c46427cf5b5bd7a9670221e909fd26f7882eeab483b5fa0c9d09878fad1397e74ee9b8ad69bce69d27cfeb40609f60e9fc84d79a670372f177abde2b7b977aba0e9565011f075d322ff6608dd0c84dff90766b1db9474d2d6e9acc0ad110a929440eac2d05e96a880385432bd5a8a08d7f69b73b8afa659c8e749625e2528512872911f2dae50d8e716e361a6ad727a8c57eb8c9a3474e5c28082111a6f88d1af4cc90a00434ab7c53719891289179e71c4aca7ac2fc78f3244c903a8675de8b216fe492febd856767d7fa39353ac29eaf1b7278a39b5310deadaf91a3e846c19ce6c4184549c9f614d53300a527da3539137afc95a2e575d01bb4743164e00ed95d83f3a11d9203f5770892bf8a1d8f21fe362326b97ead5a290af35ad3255077a1ab9e765e85bc4cd2c16324ca8ac9f91dda30dcb7fa26f212bed995fff3cca7e4c3aad34446e5de8e593265142593fc1c72b0f2b8732265366f9aaa32c6cebed9e3777a834e6c850d9a132c2686decffa8863c2863e55db493edd4ac26086c520c2cf6d0e2e924dd894a3e8f1aca5bcc91fc91c6fc6269aaca06f89f13981293980e98e1ac852798cb6519a4cdd70c96cc492778b89e6ebf0b47c3091921c043f7d011b8090c9536e28f7e2bf56c47730e69094b6cef8aa2805f38ffa72007465c27f5e20d994bd679fcd0c03422987c61b36dc264f9a0c542fe31da2d65f220b261fd7f34234ad72568f6c59a1f449a81c876b13b56122c96179acaaca0f98d5ca1e02149c3d0067bb5d92b0b2a6326103bb7f880df66d1fa3ed4faf3cdb303448c8663d514da3fee32abbb3935ebecde8e2c4c87481783967387b19b38fdffde9d7a226abd219d3d1bcb30509d4b16f6ebf97f8f29d1d787a3be47d069c7ed603c326a73a6c13d0eef8a311cc85e963e3fed7bc36e01f57f18c8993a3575a5005cce2e730df0917df9f989e826e3213df0f87f21a4f15ed4c73e6a0e5a969b67fa99c82adeecfd2438ec64e35b7697d89701597d5c3d62445f80e15c602d0f900b67d6c4f9539c496f24414b1ecb1d17eecf90fb1af765f23d0eb64ec4f595fdf26b34427ea1e7b8e5f7dc295ca8a5b0d8b219bb42a0515a1b39e48eac43f82b64882effca691418e746157cc7ebd7abf132f2c0a47f6a5443fe645c93cafeaecd5600246eea249e0a2b29f8e36fc7b29e8e5ab91faea7f0e63578c01b005219862a8da353b38b141948d883401e527311082fde2b198a33e5c6a5fc8776a656436b3e51dc52775959a75444474dd5334ad0d80d8f9907df3f1514861fb57fd29a81b53dd21d4d10d87c0d46affdf7578343d3f4d88b55226d40cb80ed8606c4fbc3ded92ae196de75f12ba0ccfbd87d06ab7251dbbf64cf599a129a088240c9cbbb95d25065b5f63baac7558d1d65e5ea6a8604914781de4e6f356ec8e9234e2f345a6d911fe7df362f30c8e4e7183c218404236e3e42674fe1f2bd6fde695ed0cac6c89743c93955a420652899f2b56f3388f74d8b9c302311ec36603dda81f7bebc933665f495ee3530189d610267002ce857c45bcfe168ed63016f7f8575ba9904e8d2682d00bd92e61a9dd159ba85f2628c61cf3bc6ac305fad264f0b8eae9b3c17f8e3595288ec406d2a1e03c9aaeb4dc0645543bc6605847256c671716b22a6031a0d96c6ef45ede7a09c16a14f27de94b8e198644617ee784e8c1d150abb1bd398c0ed70c8c2dbbdcef31afd5aaa36e15536524b148af83e3d0a43df5bc27b9edd6571a47717ed7d75f2df3a97d79f75f0ab051e7c039ca7e07e850ef4592ce150ecd828f85c624cb98c8dab27cb8b879156aaa9a6a0acdf055144ea9cf642b2609776662f9a199e27a524de7c90656770282078303d43e9d9ec6e77153e12f5f352fa4c68602f61a0c50af43e4d5ef6d8ba33b000aa790157f312211911ab197e5be90ffc22f413c6f436e1307de1cecfd0a0b26d6cb99ec882d10723f25e7aab5610c3bac5f24cdd45dbbee133b5170b4acf4592fcb95032f9e55ba65b71db4d7b1e39ba5e82fa2a43152fbf10e036d3172f8841e78" data-hash="6ab572c0734d3" data-blog="1" data-options="def50200c8e9e9d119d0edaf7b61b3d1ff68f31205d76fdc8e1a681efb337e9d41a1a67f585f64203ac60873c531a5a342181d0093aa783b8b51674f61ca569eedb9e9b0a03bdbec3d65744c54c92b5bd4f1c70506b0" class="postlisting postlisting-3 omwidget om-grid-container one ">
1831
1832    
1833    <ul class="om-grid">
1834      <li class="item grid-item overlay" style="background-image: url('https://hymy.fi/wp-content/uploads/2026/08/image-23.png');">
1835
1836    
1837        
1838    <div class="grid-item__content">
1839        <div class="meta typogr__meta">
1840            <span class="typogr__meta--category">
1841                    <a href="https://hymy.fi/kategoria/uutiset/" class=" typogr__catlink">Uutiset</a>
1842            </span>
1843
1844            <span class="typogr__meta--date">
1845              24.09.2026            </span>
1846        </div>
1847
1848        <a href="https://hymy.fi/uutiset/elokuussa-80-vuotiaana-kuolleelta-dolly-partonilta-kuullaan-viela-yksi-uusi-levytys/">
1849
1850            <h2>Dolly Partonin viimeinen levytys julkaistaan U2:n uudella albumilla!</h2>
1851
1852            <div class="grid-item__excerpt">
1853              <p>
1854                Elokuussa 80-vuotiaana kuolleelta&nbsp;Dolly Partonilta&nbsp;kuullaan vielä yksi uusi levytys. Country-legenda esiintyy U2:n tulevalla&nbsp;Ca&hellip;              </p>
1855            </div>
1856        </a>
1857
1858    </div>
1859
1860    <a href="https://hymy.fi/uutiset/elokuussa-80-vuotiaana-kuolleelta-dolly-partonilta-kuullaan-viela-yksi-uusi-levytys/" class="grid-item__bglink"></a>
1861
1862</li>
1863    </ul>
1864
1865    
1866  </div>
1867
1868        <div id="dfp__mob-2">
1869          
1869<script>window.dfp.displayAdslot('dfp__mob-2')</script>
1869
1870        </div>
1871                <div id="dfp__in-text">
1872          
1872<script>window.dfp.displayAdslot('dfp__in-text')</script>
1872
1873        </div>
1874        
1875  <div data-template="def5020067f1527e21f0ad382f65a28d8e5495f9e2e0eee48190212c324b091d29234f2e859ef6d6c75fd0be3cc07ab1f524ce2d733a2ba065805e64b5e175d8e990e59abf4d35aebe2f1827ae0a28a1ae478182ace43b5f" data-query="def50200a25f7d3c32a9357903f911e2a5c135fc0d5c71a775e68a9424f881f74114289bf522285cf36d5397bf18b9bc06483e56ab1cce2df99ac1f863361ecfe1bd344e7f3eb099d5c98fe1dd176e31cddaa034efeddd247d9f632002ae6a2e9c2f48a180cc253f3ecf878b7183b953f4167573b9612abdbef7b044344be5c63090185f92e94887c69f74a2b0aefd9b6f8c8c701e3c627037f339b93ed1108f2edb357326e5e350afe296eb299245579095c1fc603a742504ebce9e5da71028b5d7f7cec165a159b40c57af7092f1b663c03da40d3eede07bd8a7a2eb4285711520501c60d75c2947cb98b5d7bbcccc3eaa448f87d7c13167166ab7180a395a44193c7bd1da7b633cc371e02272bac1f0a54d33e9ae99c121eebda50fb0d80411a04abd4f8909ca9c0a2ffdc384998db3d7e463c29a368230e1ff84d4b0773a9e44b7aff876a82b1d2652e2a9ed5c7da0703fd7f54c369877fe87c2bdda61d870b7345518f440d01980941253c8e6390fcf58e0efab5476159dfceaca6c13cb51a066ae14ccd71f7ff6ce674808fe4436afcfa7d4cccf5c27614058bff795d3d820e944257c6bba58e12e8173257af2db27b1c57be9ad5ffb851fbe5c97ef04773913fec9837bc31b9f40df6bae6ee1495ac62d3d5c7b5e6da319d8a2e2560b5f7f22d5a43f083b12c2f6afb51924b738826b74d65057735debaa356b0fd68b35ef64ca6409bd6ac49acd5b427fac8ef24f7fcefd8d3f5ff1294179b532e482b670bfa96afe977dbce9aa38d93cf0cb3b4285e095360e44692e9871ab6ac9d1822fa76600c85e949193796ac6f2d5201bcd62649b5751227a79ea01f9d5e02c1e508753ad7e702c6112fc3f848eafca53184e4277e6bf5e08571168386bb3b7bcecaf4a3986c82f938f3855ee633bf4b10f2be2b3437f916dd28e00980ec1b0147e922205ca3bdad6c4fbb0ded5b29f48928b57989a9f94b592e2657ef593542a9483f7779a5b389796fbb23461a58a4aeb91c3947186b5f81c23d6a284a000ec92c37786e86d242c51d74bdff14c80f9b342e21a47ab68f7d71a8ddd96f7623cd388488e23af2608e5bd7b54a6d43cceb719e496dd9f2553c896254c7315204abefb8526dcdec3fb65cc785aa34726f00463eeabb57484a44d354a267e5662984f656910823e870eeacb5b2cbcba2c11c65cbe9fbad367a1526c25a4dc2974f8015dc4233f7254eb17354f5db760e3cc24916eb9945c1033bb7f320ba7903d3ca7275fd5c0f1d1e3178cdafb37a3a102fee99be962cfa9be7334127309738a120d97255920f555b83105317a35f928e3956753c2aea2cbd29082189344c34ad49aaa3671f86c0b290bc406583359101435a3e602f31ca34fcd859b0302a703c0d2549f0854936b849a03b90802b781aae442d994c7491ad9ec8ca4c6e0ba6a1289b3297374d954b396cf5eb81528de6d834fbb872f5f1b9c5d6c7cf4e1ac82204da1e01953c3f9574cdb836a056f1e54353fc83f1be6f93995bd5091528069b43b79a4d977737573176a153e734ecaf06541d878c72a9f23eb01a03002294ccfb1b23044059f3195aa8b0c0ea16895eb57577b1dbe59c3a4100ab49a76d25bdfcf5f2a6e6e976ac7e13e502d333a4beb385bc7520bf311a51ce30ed758a6bfd07112d5774a0e1479dfecf8e7c8bfbbf0a8d02edc7b983afa746e8f3b4dae433a445db1fab92a8202124fe8ead72582ac3e6cc500be5585dcfbf7ed2c72bd5f0ec515c61632be8851bc7d23e09ac24c0f405c235c6c60932febfe8223e5dea15317330ff95a7a5957d0f27f57b25451c785850c172597ae483e4a9c5feb92b1913b152eb32b37dc355cd526fa315a9471c3165a6edf1
1875a3e9b4e4cc0212b2665981031084a458c11e55acbf24aa36c7446d02f558de863fc96c3c0ce2898ce159711f5b1e7b95387095d07f82f2eba8ee487cb5e58afff7f173936fa21622b8cd9850c38c05e818a2b667abb576ca8a752a61c25a3827e60e11b8e139425ef0c89c2fa95dbcadb52cabef1b9fff624a4d5c127f46fb1c358fc954f9fd559be353c3ba2fb6e94d896b56ce887514da7e157de5f994c11171e3d9d4041a3df038312ed025ed0ccc5c5cb49cc1881816d605808670be2547b03e3081c1cb956498d1692b2954e34dfe9fe4a5fb498a75b50cb5915375eeb915e0d466fce183cd60528a33ec2eeea3a0832f1b8a109fe1887a61d979cdc1f0e25cfc0accf6bc1bea869543fbd666b682b0cb4eca99119bb86553cded5a2bd9f1a17b1c9d95ddb04a14bb3cbb7ee9719a7ff108cb331674374d58c594b7f7ac81cdd2a13fb1018e50cdc6fa68feaf6a99a4bc889235947ef14a96ef84bcedc64d6c169e7f56a48c8fd9422becb41eee3c24e4f1d7c41ac1781b95420cfb23f4b1894bd183809729715ea499a778f1025d34f500c3ed65168f3ee4afb41824469732e7ef3464ee40edb91090086dde54e4111af6e3f876b532e8fbaa65aa8feabb61950385f8e4cab57d968147601e69b57db0eb68059f5ac4c3398f8f08d757a9a0612bac4f8680e49f7fec7589c4c93ec3c3bb9075c014821c7b9901a579b82157036118d3eaa8fe696bef370d7634863a9dd71ead8797fd904e3e42387d52a89ce2b263ac253d58c1015742690d7eb9f269bc18315943d34d0e879083157bf452e863470e3212686d46c568718a1dd2546ce9ce525adaa2a0fe807973e7d8315e9faf378d7b284f398c9e615c2d7b2a2bad0c7e37b9ae626702037ecc61311060354916d7142411d2fa5781fbfccdbd58cf056119041cc2e05c9c485f47fe8a0a3c9cab99039aa5ea115642d5ab2cc19ca114c13fb0153da2543ba043339eeef9d78684117afc87666614adebf86dfc24a25d4f6dd101bf03e4fc5ce2341f2fb041e4e64a3ce5a0596df3085327c8210571cf1a0f4c37006e458b4a7b2db1f993cf377d64fb36b3ee8f6e67de4198d4d1b241627f44e8a55ea208f5257ead45f834461bf9f0d1cd6bf3311f6d182d69d8f81670e17bca47bc420e7" data-hash="6ab572c07a3cb" data-blog="1" data-options="def50200f1a8c2cbd75011633f2da33f793b857559c5e3d0bb1674fd02330008bb7dc16c220c9a28330532bf368a384b45c9e96f201ad2d4c4c6211de6a61766cbb64c9d996879f1e77baed9511d0873265c7f0331ba" class="postlisting postlisting-2 omwidget om-grid-container two ">
1876
1877    
1878    <ul class="om-grid">
1879          <li class="om-grid-item">
1880
1881        <a href="https://hymy.fi/uutiset/laulaja-tauski-peltonen-63-ja-tanssija-henna-peltonen-42-ovat-virallisesti-avioerossa/">
1882            <div class="grid-item__bg post-image lazy awpo-lazy" style="" data-bg="https://hymy.fi/wp-content/uploads/2025/04/24430-1024x999.jpg">
1883            </div>
1884        </a>
1885
1886        <div class="om-grid-item__content">
1887          <div class="meta typogr__meta">
1888            <span class="typogr__meta--category">
1889                    <a href="https://hymy.fi/kategoria/uutiset/" class=" typogr__catlink">Uutiset</a>
1890            </span>
1891          </div>
1892                    <a href="https://hymy.fi/uutiset/laulaja-tauski-peltonen-63-ja-tanssija-henna-peltonen-42-ovat-virallisesti-avioerossa/">
1893              <h2>IL: Tauski ja Henna &#8211; avioero!</h2>
1894
1895              <div class="om-grid-item__excerpt">
1896                <p>Laulaja Tauski Peltonen, 63, ja tanssija Henna Peltonen, 42, ovat virallisesti avioerossa. Asian kertoi Iltalehti. Sen mukaan asiasta on kirja&hellip;</p>
1897              </div>
1898          </a>
1899
1900          <div class="meta typogr__meta">
1901            
1902            <span class="typogr__meta--date">
1903              24.09.2026            </span>
1904
1905            
1906            
1907          </div>
1908
1909        </div>
1910
1911    </li>
1912    <li class="om-grid-item">
1913
1914        <a href="https://hymy.fi/uutiset/automaattinen-luonnolentomatkustamiseen-liittyy-pitka-lista-pienia-vinkkeja-ja-varoituksia-mutta-yksi-niista-kuulostaa-ensikuulemalta-erikoiselta-lentokoneeseen-ei-kannattaisi-pukea-mustia-sukkia/">
1915            <div class="grid-item__bg post-image lazy awpo-lazy" style="" data-bg="https://hymy.fi/wp-content/uploads/2021/02/lentokone_matkustamo.jpg">
1916            </div>
1917        </a>
1918
1919        <div class="om-grid-item__content">
1920          <div class="meta typogr__meta">
1921            <span class="typogr__meta--category">
1922                    <a href="https://hymy.fi/kategoria/uutiset/" class=" typogr__catlink">Uutiset</a>
1923            </span>
1924          </div>
1925                    <a href="https://hymy.fi/uutiset/automaattinen-luonnolentomatkustamiseen-liittyy-pitka-lista-pienia-vinkkeja-ja-varoituksia-mutta-yksi-niista-kuulostaa-ensikuulemalta-erikoiselta-lentokoneeseen-ei-kannattaisi-pukea-mustia-sukkia/">
1926              <h2>Älä käytä mustia sukkia lentokoneessa – tässä syy!</h2>
1927
1928              <div class="om-grid-item__excerpt">
1929                <p>Lentomatkustamiseen liittyy pitkä lista pieniä vinkkejä ja varoituksia, mutta yksi niistä kuulostaa ensikuulemalta erikoiselta: lentokoneeseen&hellip;</p>
1930              </div>
1931          </a>
1932
1933          <div class="meta typogr__meta">
1934            
1935            <span class="typogr__meta--date">
1936              24.09.2026            </span>
1937
1938            
1939            
1940          </div>
1941
1942        </div>
1943
1944    </li>
1945    <li class="om-grid-item">
1946
1947        <a href="https://hymy.fi/uutiset/kuva-on-jo-sita-luokkaa-etta-siina-voisi-lukea-ei-herkille-helena-ahti-hallberg-on-julkaissut-kuvan-suoraan-hoitopoydalta/">
1948            <div class="grid-item__bg post-image lazy awpo-lazy" style="" data-bg="https://hymy.fi/wp-content/uploads/2021/09/ahti_hallberg_helena_peko.jpg">
1949            </div>
1950        </a>
1951
1952        <div class="om-grid-item__content">
1953          <div class="meta typogr__meta">
1954            <span class="typogr__meta--category">
1955                    <a href="https://hymy.fi/kategoria/uutiset/" class=" typogr__catlink">Uutiset</a>
1956            </span>
1957          </div>
1958                    <a href="https://hymy.fi/uutiset/kuva-on-jo-sita-luokkaa-etta-siina-voisi-lukea-ei-herkille-helena-ahti-hallberg-on-julkaissut-kuvan-suoraan-hoitopoydalta/">
1959              <h2>Huh, Helena Ahti-Hallberg hurjan näköisenä hoitopöydällä!</h2>
1960
1961              <div class="om-grid-item__excerpt">
1962                <p>Video on jo sitä luokkaa, että siinä voisi lukea &#8221;Ei herkille&#8221;. Helena Ahti-Hallberg on julkaissut videon suoraan hoitopöydältä. S&hellip;</p>
1963              </div>
1964          </a>
1965
1966          <div class="meta typogr__meta">
1967            
1968            <span class="typogr__meta--date">
1969              24.09.2026            </span>
1970
1971            
1972            
1973          </div>
1974
1975        </div>
1976
1977    </li>
1978    <li class="om-grid-item">
1979
1980        <a href="https://hymy.fi/uutiset/oulun-poliisilaitos-tutkii-oulussa-keskiviikkona-23-9-illalla-tapahtuneita-epailtyja-rattijuopumusrikoksia/">
1981            <div class="grid-item__bg post-image lazy awpo-lazy" style="" data-bg="https://hymy.fi/wp-content/uploads/2021/06/poliisi_2021_1-1024x768.jpg">
1982            </div>
1983        </a>
1984
1985        <div class="om-grid-item__content">
1986          <div class="meta typogr__meta">
1987            <span class="typogr__meta--category">
1988                    <a href="https://hymy.fi/kategoria/uutiset/" class=" typogr__catlink">Uutiset</a>
1989            </span>
1990          </div>
1991                    <a href="https://hymy.fi/uutiset/oulun-poliisilaitos-tutkii-oulussa-keskiviikkona-23-9-illalla-tapahtuneita-epailtyja-rattijuopumusrikoksia/">
1992              <h2>Oulussa rattijuopot vaaransivat liikennettä!</h2>
1993
1994              <div class="om-grid-item__excerpt">
1995                <p>Oulun poliisilaitos tutkii Oulussa keskiviikkona 23.9. illalla tapahtuneita epäiltyjä rattijuopumusrikoksia. Kummassakin tapauksessa kuljettaj&hellip;</p>
1996              </div>
1997          </a>
1998
1999          <div class="meta typogr__meta">
2000            
2001            <span class="typogr__meta--date">
2002              24.09.2026            </span>
2003
2004            
2005            
2006          </div>
2007
2008        </div>
2009
2010    </li>
2011    <li class="om-grid-item">
2012
2013        <a href="https://hymy.fi/uutiset/mika-aaltola-kertoo-onnellisia-uutisia-heidan-perheeseen-syntyy-vauva/">
2014            <div class="grid-item__bg post-image lazy awpo-lazy" style="" data-bg="https://hymy.fi/wp-content/uploads/2024/02/aaltola_3-1024x869.jpg">
2015            </div>
2016        </a>
2017
2018        <div class="om-grid-item__content">
2019          <div class="meta typogr__meta">
2020            <span class="typogr__meta--category">
2021                    <a href="https://hymy.fi/kategoria/uutiset/" class=" typogr__catlink">Uutiset</a>
2022            </span>
2023          </div>
2024                    <a href="https://hymy.fi/uutiset/mika-aaltola-kertoo-onnellisia-uutisia-heidan-perheeseen-syntyy-vauva/">
2025              <h2>Mika Aaltolan perheeseen syntyy vauva!</h2>
2026
2027              <div class="om-grid-item__excerpt">
2028                <p>Mika Aaltola kertoo onnellisia uutisia. Heidän perheeseen syntyy vauva. Mika Aaltola ja Kirsi Aaltola naimisiin syyskuussa 2019. Avioparilla o&hellip;</p>
2029              </div>
2030          </a>
2031
2032          <div class="meta typogr__meta">
2033            
2034            <span class="typogr__meta--date">
2035              24.09.2026            </span>
2036
2037            
2038            
2039          </div>
2040
2041        </div>
2042
2043    </li>
2044    <li class="om-grid-item">
2045
2046        <a href="https://hymy.fi/uutiset/erotiikka-sehan-se-kiinnostaa-ja-myy-kuinka-moni-laulaja-nayttelija-tai-muu-tahti-olisikaan-ihan-takarivin-tellu-ilman-erotiikkaa/">
2047            <div class="grid-item__bg post-image lazy awpo-lazy" style="" data-bg="https://hymy.fi/wp-content/uploads/2018/07/kardashian_kim_mainos_raskauspahvointi_puoli_miljoonaa_dollaria_sai.jpg">
2048            </div>
2049        </a>
2050
2051        <div class="om-grid-item__content">
2052          <div class="meta typogr__meta">
2053            <span class="typogr__meta--category">
2054                    <a href="https://hymy.fi/kategoria/uutiset/" class=" typogr__catlink">Uutiset</a>
2055            </span>
2056          </div>
2057                    <a href="https://hymy.fi/uutiset/erotiikka-sehan-se-kiinnostaa-ja-myy-kuinka-moni-laulaja-nayttelija-tai-muu-tahti-olisikaan-ihan-takarivin-tellu-ilman-erotiikkaa/">
2058              <h2>Kim Kardashian eroottisissa kuvissa!</h2>
2059
2060              <div class="om-grid-item__excerpt">
2061                <p>Erotiikka &#8211; sehän se kiinnostaa. Ja myy. Kuinka moni laulaja, näyttelijä tai muu tähti olisikaan ihan takarivin henkilö ilman erotiikkaa&hellip;</p>
2062              </div>
2063          </a>
2064
2065          <div class="meta typogr__meta">
2066            
2067            <span class="typogr__meta--date">
2068              23.09.2026            </span>
2069
2070            
2071            
2072          </div>
2073
2074        </div>
2075
2076    </li>
2077    <li class="om-grid-item">
2078
2079        <a href="https://hymy.fi/uutiset/salatut-elamat-suosikkisarja-tekee-televisiohistoriaa/">
2080            <div class="grid-item__bg post-image lazy awpo-lazy" style="" data-bg="https://hymy.fi/wp-content/uploads/2026/09/image-40-1024x582.png">
2081            </div>
2082        </a>
2083
2084        <div class="om-grid-item__content">
2085          <div class="meta typogr__meta">
2086            <span class="typogr__meta--category">
2087                    <a href="https://hymy.fi/kategoria/uutiset/" class=" typogr__catlink">Uutiset</a>
2088            </span>
2089          </div>
2090                    <a href="https://hymy.fi/uutiset/salatut-elamat-suosikkisarja-tekee-televisiohistoriaa/">
2091              <h2>Salatut elämät &#8211; suosikkisarja tekee televisiohistoriaa!</h2>
2092
2093              <div class="om-grid-item__excerpt">
2094                <p>Suursuosikki Salatut elämät saavuttaa 5000. jakson rajapyykin samalla, kun Pihlajakadun käänteet tavoittavat MTV Katsomossa ja MTV3-kanavalla &hellip;</p>
2095              </div>
2096          </a>
2097
2098          <div class="meta typogr__meta">
2099            
2100            <span class="typogr__meta--date">
2101              23.09.2026            </span>
2102
2103            
2104            
2105          </div>
2106
2107        </div>
2108
2109    </li>
2110    <li class="om-grid-item">
2111
2112        <a href="https://hymy.fi/uutiset/kauppa-sai-alkunsa-vuoden-2025-lopulla-jarjestetysta-huutokaupasta-jonka-toteutti-muumikerailytuotteisiin-erikoistunut-verkkokauppa-muumimukit-rahaksi/">
2113            <div class="grid-item__bg post-image lazy awpo-lazy" style="" data-bg="https://hymy.fi/wp-content/uploads/2026/09/image-39-1024x786.png">
2114            </div>
2115        </a>
2116
2117        <div class="om-grid-item__content">
2118          <div class="meta typogr__meta">
2119            <span class="typogr__meta--category">
2120                    <a href="https://hymy.fi/kategoria/uutiset/" class=" typogr__catlink">Uutiset</a>
2121            </span>
2122          </div>
2123                    <a href="https://hymy.fi/uutiset/kauppa-sai-alkunsa-vuoden-2025-lopulla-jarjestetysta-huutokaupasta-jonka-toteutti-muumikerailytuotteisiin-erikoistunut-verkkokauppa-muumimukit-rahaksi/">
2124              <h2>Muumimukien maailmanennätys rikkoutui: Uimahyppy simpukoilla myytiin yli 46 000 eurolla!</h2>
2125
2126              <div class="om-grid-item__excerpt">
2127                <p>Kauppa sai alkunsa vuoden 2025 lopulla järjestetystä huutokaupasta, jonka toteutti muumikeräilytuotteisiin erikoistunut verkkokauppa Muumimuki&hellip;</p>
2128              </div>
2129          </a>
2130
2131          <div class="meta typogr__meta">
2132            
2133            <span class="typogr__meta--date">
2134              23.09.2026            </span>
2135
2136            
2137            
2138          </div>
2139
2140        </div>
2141
2142    </li>
2143    </ul>
2144
2145        <ul class="om-grid-controls">
2146          <li>
2147        <button class="button om-grid-load-more">Lataa lisää <i style="display:none;" class="loader"></i>
2148       </button>
2149    </li>
2150        </ul>
2151    
2152  </div>
2153
2154  </div>
2155
2156  
2157  <div style="clear: both;"></div>
2158
2159</div>
2160
2161                        
2162<div id="sivupalkki">
2163	<div>
2164		<div class="mainside"></div>
2165	
2166						
2167		<div style="clear:both"></div>
2168		
2169					<div id="secondary" class="widget-area" role="complementary">
2170				
2171				
2172		<div id="tilaa-seuraa" class="om-widget sidebar-block socialmedialinks socialmedialinks-2">
2173			<div class="links">
2174				<a href="/kirjaudu/" class="returnLink">Kirjaudu</a><a href="/tilaa?promoPosition=header-etusivu">Tilaa</a><a href="/ukk/">Ohje</a>			</div>
2175
2176						<div class="some">
2177
2178				<a href="https://www.facebook.com/hymy.fi" target="_blank" title="Facebook" class="fa fa-facebook"></a><a href="https://twitter.com/HymyFI" target="_blank" title="Twitter" class="fa fa-twitter"></a><a href="https://hymy.fi/feed" target="_blank" title="RSS-syöte" class="fa fa-rss"></a>			</div>
2179						<div style="clear:both;"></div>
2180		</div>
2181
2182
2183	        <div id="dfp__rectangle-1">
2184          
2184<script>window.dfp.displayAdslot('dfp__rectangle-1')</script>
2184
2185        </div>
2186        <div class="widget_text sidebar-block"><div class="textwidget custom-html-widget"><!--<div style="text-align: center">	
2187<a href="https://hymy.fi/mainos/tiesitko-taman-kulutusluotosta-vastasimme-vaitteisiin-ja-kumosimme-virheet/"><img src="https://hymy.fi/wp-content/uploads/2024/02/Sortter-2024-helmikuu-Hymy-kuva-01.jpg" border="0"></a></div>--></div></div>
2188      <div class="omwidget sidebar-block magazineorderwidget magazineorderwidget-2">
2189
2190        <a href="https://tilaus.hymy.fi/tilaus?promoID=OM_widget&amp;promoName=OM_HY&amp;promoCreative=onlinetarjous&amp;promoPosition=sidebar">
2191
2192          <div class="magazineorderwidget__content">
2193
2194              <img class="magazineorderwidget__background awpo-lazy" data-src="https://hymy.fi/wp-content/uploads/2018/03/HY_sivupalkin_myyntiviesti2.jpg"><noscript><img class="magazineorderwidget__background" src="https://hymy.fi/wp-content/uploads/2018/03/HY_sivupalkin_myyntiviesti2.jpg"></noscript>
2195
2196              <img class="magazineorderwidget__cover awpo-lazy" data-src="https://mediapankki.otavamedia.fi/api/v1/covers/hymy/latest.jpg?maxWidth=200&amp;maxHeight=258"><noscript><img class="magazineorderwidget__cover" src="https://mediapankki.otavamedia.fi/api/v1/covers/hymy/latest.jpg?maxWidth=200&amp;maxHeight=258"></noscript>
2197          </div>
2198
2199        </a>
2200
2201      </div>
2202
2203      <div class="sidebar-block">      <h2 class="block-header_sidebar">Suosituimmat</h2>
2204            <article class="omwidget om-tab-container">
2205
2206  
2207    <ul class="navtabs two">
2208      <li class="active typogr__tab" data-hash="6ab572c07fd51"><a>Tänään</a></li>
2209      <li class="typogr__tab" data-hash="6ab572c07ff4d"><a>Viikko</a></li>
2210    </ul>
2211
2212
2213  <div data-template="def50200ca90c6c4ceaa745859903d142720ab7a81fe3e65ebc4644e4c3079d0606f3f8c9d3ed83aa0fd80c6f48adc3239200b0fa7d0ad70cf05d738b7310439837abc6fecce69857222b15ed47b7721044ec07a357fc4dd4bc4e4" data-query="def50200da9d30ea6453f19a7dab392059adad11196af1b55b22e5b9bfc1d6737d68fc8a3390658c28090ff245d4a51f5c1630c9d1630057ec645ea8dac38f264c95648bc91eed18e148d8680bc4d0f7f1fecb26cbf72f0963213961715215be0241e5cabc0fd9615abb2ac194e0228ed1b48d08fa727575a151b30dd78ce5da52b1ecc3d2808673342539295a3d39b3f4a3fc4c9e42f0472120691e5ad266d84fd2725a6256de9177cff7a0fe35e3ad294b8524a6519d0791e6723199c0972b3fa8023487f4e266ec91185b803d08dae5e207a4bc70a90d54d1e3298c46472be71b2d7f6b210a5ceed43a607c7bc56f2f1097ca530eb4d3e3fb41ec5273a0c1a17bfeb75d3d5e28cb96cbd264ac264dd52051881c244a04245a267d834586b8d8cff7238226f141ecff864dbbddca0f5963d42adb1aefac7b49c8bbb5752b19838230b208ee2dc62517db9fe6eac021e662" data-hash="6ab572c07fd51" data-blog="1" data-options="def5020047b090cbdebfb1a85df7816a6abe07285ab43882a89525f1fa15e64382ad5b84efb5ee694e577936b3603aebb070062d391cd81bc815495485a02e9558bfe22d18f67d7b1935388907658dc75e7d2e441e7f" class="postlistingwithtabs postlistingwithtabs--1 omwidget om-grid-container one  active">
2214
2215    
2216    <ul class="om-grid">
2217      <li class="compact">
2218  <div class="meta typogr__meta">
2219    <span class="compact__cats typogr__catlink">
2220        <a href="https://hymy.fi/kategoria/uutiset/" class=" typogr__catlink">Uutiset</a>
2221    </span>
2222    <span class="compact__dateandreadcount typogr__meta typogr__meta--date">
2223      23.09.2026    </span>
2224  </div>
2225
2226  <a href="https://hymy.fi/uutiset/karita-tykka-on-nyt-50-vuotias/">
2227    <h3>Karita Tykkä &#8211; alastonkuvat!</h3>
2228  </a>
2229
2230</li>
2231<li class="compact">
2232  <div class="meta typogr__meta">
2233    <span class="compact__cats typogr__catlink">
2234        <a href="https://hymy.fi/kategoria/uutiset/" class=" typogr__catlink">Uutiset</a>
2235    </span>
2236    <span class="compact__dateandreadcount typogr__meta typogr__meta--date">
2237      22.09.2026    </span>
2238  </div>
2239
2240  <a href="https://hymy.fi/uutiset/perjantain-vain-elamaa-jaksossa-vietetaan-nelli-matulan-paivaa-jaksossa-kuullaan-muun-muassa-bessin-kateudesta-nellia-kohtaan/">
2241    <h3>Vain elämää: Bess ei halunnut olla samassa ohjelmassa kuin Nelli Matula!</h3>
2242  </a>
2243
2244</li>
2245<li class="compact">
2246  <div class="meta typogr__meta">
2247    <span class="compact__cats typogr__catlink">
2248        <a href="https://hymy.fi/kategoria/uutiset/" class=" typogr__catlink">Uutiset</a>
2249    </span>
2250    <span class="compact__dateandreadcount typogr__meta typogr__meta--date">
2251      23.09.2026    </span>
2252  </div>
2253
2254  <a href="https://hymy.fi/uutiset/erotiikka-sehan-se-kiinnostaa-ja-myy-kuinka-moni-laulaja-nayttelija-tai-muu-tahti-olisikaan-ihan-takarivin-tellu-ilman-erotiikkaa/">
2255    <h3>Kim Kardashian eroottisissa kuvissa!</h3>
2256  </a>
2257
2258</li>
2259<li class="compact">
2260  <div class="meta typogr__meta">
2261    <span class="compact__cats typogr__catlink">
2262        <a href="https://hymy.fi/kategoria/uutiset/" class=" typogr__catlink">Uutiset</a>
2263    </span>
2264    <span class="compact__dateandreadcount typogr__meta typogr__meta--date">
2265      17.12.2025    </span>
2266  </div>
2267
2268  <a href="https://hymy.fi/uutiset/martina-aitolehti/">
2269    <h3>Tällainen on Martina Aitolehden ökyauto!</h3>
2270  </a>
2271
2272</li>
2273<li class="compact">
2274  <div class="meta typogr__meta">
2275    <span class="compact__cats typogr__catlink">
2276        <a href="https://hymy.fi/kategoria/uutiset/" class=" typogr__catlink">Uutiset</a>
2277    </span>
2278    <span class="compact__dateandreadcount typogr__meta typogr__meta--date">
2279      02.02.2011    </span>
2280  </div>
2281
2282  <a href="https://hymy.fi/uutiset/vielako-muistat-nama-martina-aitolehden-rohkeat-alastonkuvat-katso/">
2283    <h3>Vieläkö muistat nämä Martina Aitolehden rohkeat alastonkuvat &#8211; katso!</h3>
2284  </a>
2285
2286</li>
2287    </ul>
2288
2289    
2290  </div>
2291
2292
2293  <div data-template="def50200f985fff55a970a7b0930145238fa884849d2622fc1653603b42a3ce55f7c2af217a816b549ad81abf77faeeefc86881d646ffade28db0b753854af6eda72cf5e52f1b1a0da6dad83b55991f0e66bbdeaef73255f95bbb2" data-query="def50200c9df52b7267aa8764498f46138c227d1c71941d019d3bf8afd305565b6d1d0398f40232e4ae5e8c65c88ce0938f3bde839d0f4798b7c973a5422b245a535662186b5c41724e2b86f85bf883f6cb4ddb2a9cc920080fb908b5d3974bf3644ab42e7f20b3612021a34c8acf14ec6f38fc3b9044b9ff391d3215e80fdc8dd2e0567e273c5b0edc3f72e7602b79e7b6684a48f78eb2777c0acec55d2b640b86d28b79ce356bbbafbb8
2293c18522e44108845419828aabfb5f40c64ab05678483b0d99ee257a14c61d01075d2569179686d9c0be6a5c3f10a09abd3fdbee5c14ad68de9c7f82d32d4ee46b1c64b603d52819cc5928a1b8346c18c723f82bbbe130fdef58a0d6c20de143af346ca5b5fcd0fb2c236b81cd77b35408ed0fe581eb803271f084d23a813bd53530e0c3a3012ae0f6cd5ac8b79489d277b2473131ac77c34b98fa63b0ed6fe31b18720d566aece9" data-hash="6ab572c07ff4d" data-blog="1" data-options="def502004e53e984f50630cca8d4ddf46870ea68f4b0d2f9873c0dc527f1ef936bed03e1cd4d97b8e0f1fbcb55fd5fff6f400f51d944bbec6892b76900a5be38351fd98abce96f55ec871c7f7a61d33d9ec8e9141fd3" class="postlistingwithtabs postlistingwithtabs--1 omwidget om-grid-container one ">
2294
2295    
2296    <ul class="om-grid">
2297      <li class="compact">
2298  <div class="meta typogr__meta">
2299    <span class="compact__cats typogr__catlink">
2300        <a href="https://hymy.fi/kategoria/uutiset/" class=" typogr__catlink">Uutiset</a>
2301    </span>
2302    <span class="compact__dateandreadcount typogr__meta typogr__meta--date">
2303      23.09.2026    </span>
2304  </div>
2305
2306  <a href="https://hymy.fi/uutiset/karita-tykka-on-nyt-50-vuotias/">
2307    <h3>Karita Tykkä &#8211; alastonkuvat!</h3>
2308  </a>
2309
2310</li>
2311<li class="compact">
2312  <div class="meta typogr__meta">
2313    <span class="compact__cats typogr__catlink">
2314        <a href="https://hymy.fi/kategoria/uutiset/" class=" typogr__catlink">Uutiset</a>
2315    </span>
2316    <span class="compact__dateandreadcount typogr__meta typogr__meta--date">
2317      17.09.2026    </span>
2318  </div>
2319
2320  <a href="https://hymy.fi/uutiset/ex-taitoluistelija-kiira-korpi-kavi-hakemassa-salaattiannoksen-ravintolasta-pika-koiransa-kanssa/">
2321    <h3>Kiira Korpi tyylikkäänä arki-asussa &#8211; käväisi salaattiannoksen kaupasta!</h3>
2322  </a>
2323
2324</li>
2325<li class="compact">
2326  <div class="meta typogr__meta">
2327    <span class="compact__cats typogr__catlink">
2328        <a href="https://hymy.fi/kategoria/uutiset/" class=" typogr__catlink">Uutiset</a>
2329    </span>
2330    <span class="compact__dateandreadcount typogr__meta typogr__meta--date">
2331      22.09.2026    </span>
2332  </div>
2333
2334  <a href="https://hymy.fi/uutiset/perjantain-vain-elamaa-jaksossa-vietetaan-nelli-matulan-paivaa-jaksossa-kuullaan-muun-muassa-bessin-kateudesta-nellia-kohtaan/">
2335    <h3>Vain elämää: Bess ei halunnut olla samassa ohjelmassa kuin Nelli Matula!</h3>
2336  </a>
2337
2338</li>
2339<li class="compact">
2340  <div class="meta typogr__meta">
2341    <span class="compact__cats typogr__catlink">
2342        <a href="https://hymy.fi/kategoria/uutiset/" class=" typogr__catlink">Uutiset</a>
2343    </span>
2344    <span class="compact__dateandreadcount typogr__meta typogr__meta--date">
2345      17.09.2026    </span>
2346  </div>
2347
2348  <a href="https://hymy.fi/uutiset/kylie-jenner-on-julkaissut-jalleen-nayttavia-kuvia-kuntosaliltaan-vain-vahan-sen-jalkeen-kun-han-kertoi-haluavansa-nykyista-suuremmat-rinnat/">
2349    <h3>Kylie Jenner poseeraa niukassa treenitopissa – haluaa vieläkin suuremmat rinnat!</h3>
2350  </a>
2351
2352</li>
2353<li class="compact">
2354  <div class="meta typogr__meta">
2355    <span class="compact__cats typogr__catlink">
2356        <a href="https://hymy.fi/kategoria/uutiset/" class=" typogr__catlink">Uutiset</a>
2357    </span>
2358    <span class="compact__dateandreadcount typogr__meta typogr__meta--date">
2359      17.12.2025    </span>
2360  </div>
2361
2362  <a href="https://hymy.fi/uutiset/martina-aitolehti/">
2363    <h3>Tällainen on Martina Aitolehden ökyauto!</h3>
2364  </a>
2365
2366</li>
2367    </ul>
2368
2369    
2370  </div>
2371
2372     </article> 
2373</div>
2374  <div class="widget-imgButton sidebar-block">
2375        <a href="https://hymy.fi/juttuvinkki/" target="_blank">
2376      <img data-src="https://hymy.fi/wp-content/uploads/2016/04/laheta-juttuvinkki.gif" class="awpo-lazy"><noscript><img src="https://hymy.fi/wp-content/uploads/2016/04/laheta-juttuvinkki.gif"></noscript>
2377    </a>
2378  </div>
2379
2380  
2381  <div class="widget-imgButton sidebar-block">
2382        <a href="http://pubads.g.doubleclick.net/gampad/clk?id=6012526269&amp;iu=/135812570/tracking/click-tracking" target="_blank">
2383      <img data-src="https://hymy.fi/wp-content/uploads/2026/09/HYMY_300x300_syksy2.jpg" class="awpo-lazy"><noscript><img src="https://hymy.fi/wp-content/uploads/2026/09/HYMY_300x300_syksy2.jpg"></noscript>
2384    </a>
2385  </div>
2386
2387  				
2388			</div>
2389		
2390	</div>
2391</div>
2392<div style="clear: both;"></div>
2393</div><!-- #inner-wrapper -->
2394</div><!-- #wrapper -->
2395
2396<footer class="site-footer" id="footer">
2397  
2398<div class="om-footer">
2399    <div class="om-footer__columns">
2400    <div class="om-footer__columns-inner">
2401      <div class="om-footer__column">
2402                  <h2 class="om-footer__column-title">
2403            Asiakaspalvelu          </h2>
2404                          <div class="om-footer__column-content">
2405            <p><span class="label">Digipalvelut</span>(09) 156 6227<br>
2406<span class="label">Avoinna</span>ma–pe 8–19</p>
2407<p>&nbsp;</p>
2408<p><span class="label">Painettu lehti</span>(09) 156 665</p>
2409<p><span class="type label">Avoinna</span>ma–pe 8–19</p>
2410<p>&nbsp;</p>
2411<p><span class="label">Sähköposti (digi)</span> [email protected]</p>
2412<p><span class="label">Sähköposti</span> [email protected]</p>
2413<p>&nbsp;</p>
2414<p><span class="label">Otavamedian vaihde</span> (09) 156 61</p>
2415          </div>
2416              </div>
2417      <div class="om-footer__column">
2418                  <h2 class="om-footer__column-title">
2419            Postiosoite          </h2>
2420                          <div class="om-footer__column-content">
2421            <p>Uudenmaankatu 10<br>
242200015 OTAVAMEDIA</p>
2423<p>&nbsp;</p>
2424<p><a href="https://otavamedia.fi/evasteiden-kaytto/">Tietoa evästeiden käytöstä</a><br>
2425<a href="https://www.youronlinechoices.com/fi/">Käyttäytymiseen perustuva mainonta</a><br>
2426<a href="#">Evästeasetukset</a></p>
2427          </div>
2428              </div>
2429      <div class="om-footer__column">
2430                  <h2 class="om-footer__column-title">
2431            Mediatiedot          </h2>
2432                          <div class="om-footer__column-content">
2433            <ul class="footer__list">
2434<li><a href="https://yrityksille.otavamedia.fi/tekniset-tiedot-ja-hinnat/">Tekniset tiedot, aikataulut ja ilmoitushinnat</a></li>
2435<li><a href="https://yrityksille.otavamedia.fi/reaaliaikainen-kayttajatieto/" rel="nofollow">Tietoa verkon kävijöistä</a></li>
2436<li><a href="https://otavamedia.fi/tietosuoja/" rel="nofollow">Tietosuojaseloste</a></li>
2437<li><a href="https://otavamedia.fi/tilaus-ja-kayttoehdot/">Käyttöehdot</a></li>
2438</ul>
2439          </div>
2440                          <h2 class="om-footer__column-title">
2441            Tuotteet          </h2>
2442                          <div class="om-footer__column-content">
2443            <ul>
2444<li><a href="https://otavamedia.fi/tuotteet-ja-edut/" rel="nofollow">Aikakauslehdet</a></li>
2445<li><a href="https://otavamedia.fi/tuotteet-ja-edut/verkkopalvelut" rel="nofollow">Verkkopalvelut</a></li>
2446<li><a href="https://otavamedia.fi/tuotteet-ja-edut/digilehdet" rel="nofollow">Digilehdet</a></li>
2447</ul>
2448          </div>
2449              </div>
2450      <div class="om-footer__column">
2451                  <h2 class="om-footer__column-title">
2452            Toimitus ja lehtitilaus          </h2>
2453                          <div class="om-footer__column-content">
2454            <ul class="footer__list">
2455<li><a href="https://otavamedia.fi/asiakaspalvelu/#omat-tiedot-ja-tilaukset" rel="nofollow">Tilausmuutokset</a></li>
2456<li><a href="/toimituksen-yhteystiedot/#palaute">Palautelomake</a></li>
2457</ul>
2458<p><a class="footer-button" href="/toimituksen-yhteystiedot/">Toimitus</a><br>
2459Sähköpostiosoitteet: [email protected]<br>
2460<a class="footer-button" href="https://hymy.fi/tilaa?promoPosition=footer-etusivu&amp;src=hymy.fi&amp;sid=fd97b1d2-7f45-331b-b8a5-881b7647ff09">Tilaa lehti</a></p>
2461          </div>
2462              </div>
2463    </div>
2464  </div>
2465      <div class="om-footer__logo">
2466        <img width="400" height="174" class="attachment-thumbnail size-thumbnail awpo-lazy" alt="" decoding="async" loading="lazy" data-srcset="https://hymy.fi/wp-content/uploads/2024/02/otavamedia_logo_valkoinen-400x174.png 400w, https://hymy.fi/wp-content/uploads/2024/02/otavamedia_logo_valkoinen-800x347.png 800w, https://hymy.fi/wp-content/uploads/2024/02/otavamedia_logo_valkoinen-1024x445.png 1024w, https://hymy.fi/wp-content/uploads/2024/02/otavamedia_logo_valkoinen-768x334.png 768w, https://hymy.fi/wp-content/uploads/2024/02/otavamedia_logo_valkoinen-1536x667.png 1536w, https://hymy.fi/wp-content/uploads/2024/02/otavamedia_logo_valkoinen-2048x889.png 2048w" data-sizes="auto, (max-width: 400px) 100v
2466w, 400px" data-src="https://hymy.fi/wp-content/uploads/2024/02/otavamedia_logo_valkoinen-400x174.png"><noscript><img width="400" height="174" src="https://hymy.fi/wp-content/uploads/2024/02/otavamedia_logo_valkoinen-400x174.png" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" loading="lazy" srcset="https://hymy.fi/wp-content/uploads/2024/02/otavamedia_logo_valkoinen-400x174.png 400w, https://hymy.fi/wp-content/uploads/2024/02/otavamedia_logo_valkoinen-800x347.png 800w, https://hymy.fi/wp-content/uploads/2024/02/otavamedia_logo_valkoinen-1024x445.png 1024w, https://hymy.fi/wp-content/uploads/2024/02/otavamedia_logo_valkoinen-768x334.png 768w, https://hymy.fi/wp-content/uploads/2024/02/otavamedia_logo_valkoinen-1536x667.png 1536w, https://hymy.fi/wp-content/uploads/2024/02/otavamedia_logo_valkoinen-2048x889.png 2048w" sizes="auto, (max-width: 400px) 100vw, 400px"></noscript>    </div>
2467  </div>
2468
2469</footer>
2470
2471
2472<!--[if IE 8]>
2473<div class="if-ie-8">Huom! Sivuston kaikki ominaisuudet eivät välttämättä toimi selaimellasi. Ole hyvä, ja päivitä selaimesi.</div>
2474<![endif]-->
2475
2476<!-- 186 queries in 0,429 seconds. -->
2477<script type="speculationrules">
2478{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/om-hymy-theme/*","/wp-content/themes/om-core/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
2479</script>
2479
2480
2481<script type="text/javascript">
2482  jQuery( function() {
2483    try {
2484      AsteikkoAuth.init( "https:\/\/hymy.fi\/" );
2485    } catch( e ) {
2486      if ( window.console && console.error )
2487        console.error( e );
2488    }
2489  } );
2490</script>
2490			
2490<script>
2491				function convert_to_url(obj) {
2492					return Object
2493					.keys(obj)
2494					.map(k => `${encodeURIComponent(k)}=${encodeURIComponent(obj[k])}`)
2495					.join('&');
2496				}
2497
2498				function pass_to_backend() {
2499					if(window.location.hash) {
2500						var hash = window.location.hash;
2501						var elements = {};
2502						hash.split("#")[1].split("&").forEach(element => {
2503							var vars = element.split("=");
2504							elements[vars[0]] = vars[1];
2505						});
2506						if(("access_token" in elements) || ("id_token" in elements) || ("token" in elements)) {
2507							if(window.location.href.indexOf("?") !== -1) {
2508								window.location = (window.location.href.split("?")[0] + window.location.hash).split('#')[0] + "?" + convert_to_url(elements);
2509							} else {
2510								window.location = window.location.href.split('#')[0] + "?" + convert_to_url(elements);
2511							}
2512						}
2513					}
2514				}
2515
2516				pass_to_backend();
2517			</script>
2517
2518
2519		
2519<script type="text/javascript" src="https://hymy.fi/wp-content/cache/asauth/fi_blog1.js?ver=84" id="asteikko-auth-lang-fi-js"></script>
vendor: 1 bytes, line 2519
2519
2520<script type="text/javascript" src="https://hymy.fi/wp-content/plugins/asteikko-auth-otavamedia/js/asteikko-auth.js?ver=3.0.5" id="asteikko-auth-js"></script>
vendor: 1 bytes, line 2520
2520
2521<script type="text/javascript" src="https://hymy.fi/wp-content/plugins/asteikko-mag/dist/wp-widgets/index.js?ver=6.21.2-0c797b1a9ed13eb8dd863a1165181f5f" id="asmag_widgets_js-js"></script>
vendor: 1 bytes, line 2521
2521
2522<script type="text/javascript" src="https://hymy.fi/wp-content/themes/om-core/script.js?ver=1790248696" id="om-core-js-js"></script>
vendor: 1 bytes, line 2522
2522
2523<script type="text/javascript" src="https://hymy.fi/wp-content/plugins/om-widgets-plugin/assets/widgets.js?ver=1" id="om-core-widgets-js-js"></script>
vendor: 1 bytes, line 2523
2523
2524<script type="text/javascript" src="https://hymy.fi/wp-content/plugins/wp-optimizer/assets/dist/awpo.min.js?ver=1722410914" id="awpo-lazyload-js"></script>
vendor: 1 bytes, line 2524
2524
2525<script type="text/javascript" src="https://hymy.fi/wp-content/themes/om-hymy-theme/plugins.js?ver=6.9.9" id="custom-plugins-js"></script>
vendor: 1 bytes, line 2525
2525
2526<script type="text/javascript" src="https://hymy.fi/wp-content/themes/om-hymy-theme/script.js?ver=6.9.9" id="custom-scripts-js"></script>
2526
2527</div> <!-- / #additionalBg -->
2528<!-- Body end tag start, do not remove -->
2529
2530<script>
2531
2532	//hymy.fi
2533
2534	async function waitForVariable2(variableName, timeoutMs = 30000, intervalMs = 1000) {
2535		const startTime = Date.now();
2536		for (; !window[variableName]; ) {
2537			if (Date.now() - startTime >= timeoutMs) {
2538				console.warn(`waitForVariable2: Timeout of ${timeoutMs / 1000}s reached for variable "${variableName}".`);
2539				return false;
2540			}
2541			await new Promise(resolve => setTimeout(resolve, intervalMs));
2542		}
2543		return true;
2544	}
2545
2546	//jQuery('#inner-wrapper > div.col-two').before(jQuery('#dfp__interstitial'));
2547	//if (dfpDebug) {console.log('Moving interstitial...')}
2548	
2549	jQuery('body').prepend('<div id=\'dfp__interstitial_1\'>
2549<script>window.dfp.displayAdslot(\'dfp__interstitial_1\')<\/script></div>');
2550
2551	if (location.href.indexOf('interstitial2') > -1) {
2552
2553//		let interval = setInterval(function(){
2554//			if (window.googletag && googletag.apiReady && googletag.pubadsReady) {
2555				//var aStr = '
2555<script>var interstitialSlot; googletag.cmd.push(function() {interstitialSlot = googletag.defineOutOfPageSlot(\"/135812570/hymy/content/interstitial\", \"dfp__interstitial_1\").addService(googletag.pubads());});<\/script><div id=\"dfp__interstitial_1\">
2555<script>googletag.cmd.push(function() {googletag.display(\"dfp__interstitial_1\");googletag.pubads().refresh([interstitialSlot]);});<\/script></div>';
2556				//var aStr = '
2556<script>var interstitialSlot; googletag.cmd.push(function() {interstitialSlot = googletag.defineOutOfPageSlot(\"/135812570/hymy/content/interstitial\", \"dfp__interstitial_1\").addService(googletag.pubads());});<\/script><div id=\"dfp__interstitial_1\">
2556<script>googletag.cmd.push(function() {googletag.display(\"dfp__interstitial_1\");});<\/script></div>';
2557				var aStr = '
2557<script>var interstitialSlot; googletag.cmd.push(function() {interstitialSlot = googletag.defineSlot(\"/135812570/hymy/content/interstitial\", [1, 1], \"dfp__interstitial_1\").addService(googletag.pubads());});<\/script><div id=\"dfp__interstitial_1\">
2557<script>googletag.cmd.push(function() {googletag.display(\"dfp__interstitial_1\");});<\/script></div>';
2558				//jQuery('#inner-wrapper > div.col-two').before(aStr);
2559				jQuery('body').prepend(aStr);
2560				console.log('Interstitial added...');
2561//				clearInterval(interval);
2562//			}
2563//		}, 10);
2564
2565	}	
2566
2567	if (location.href.indexOf('webinterstitial') >= -1) {
2568		waitForVariable2("canRunWebInterstitial", 30000, 1000)
2569		.then((success) => {
2570			if (success) {
2571				if (dfpDebug) {console.log('Defining webinterstitial...')}
2572				var webinterstitialSlot;
2573				googletag.cmd.push(function() {
2574					webinterstitialSlot = googletag.defineOutOfPageSlot('/135812570/hymy/content/webinterstitial', googletag.enums.OutOfPageFormat.INTERSTITIAL);
2575					if (webinterstitialSlot) {webinterstitialSlot.addService(googletag.pubads()); googletag.pubads().refresh([webinterstitialSlot]);}
2576				});
2577			} else {
2578				if (dfpDebug) { console.log('waitForVariable2 "canRunWebInterstitial" timed out or variable was not found.'); }
2579			}
2580		})
2581		.catch(error => {
2582			if (dfpDebug) { console.error('Error in waitForVariable2:', error); }
2583		});
2584	}
2585
2586	if (location.href.indexOf('anchorad') > -1) {
2587		if (dfpDebug) {console.log('Anchor ad defined...')}
2588		var anchorSlot;
2589		googletag.cmd.push(function() {
2590			if (document.body.clientWidth <= 500) {
2591				anchorSlot = googletag.defineOutOfPageSlot('/135812570/hymy/content/anchorad', googletag.enums.OutOfPageFormat.BOTTOM_ANCHOR);
2592			} else {
2593				anchorSlot = googletag.defineOutOfPageSlot('/135812570/hymy/content/anchorad', googletag.enums.OutOfPageFormat.BOTTOM_ANCHOR);
2594			}
2595			if (anchorSlot) {anchorSlot.addService(googletag.pubads())}
2596		});
2597	}
2598
2599	if (window.dfp.visibility == 'mobile') {
2600		jQuery('body').prepend('<div id=\'dfp__topad-mob\'>
2600<script>window.dfp.displayAdslot(\'dfp__topad-mob\')<\/script></div>');
2601	}
2602
2603	if (document.documentElement.clientWidth >= 1020) {
2604		jQuery("#inner-wrapper > div.col-two").before('<div id="dfp__desk-1_1">
2604<script>window.dfp.displayAdslot("dfp__desk-1_1")<\/script></div>');
2605		jQuery('#sivupalkki').find('h2:contains("Suosituimmat")').parent('div').after('<div id="dfp__rectangle-2_2">
2605<script>window.dfp.displayAdslot("dfp__rectangle-2_2")<\/script></div>');
2606		jQuery('#sivupalkki #secondary').append('<div id="dfp__rectangle-2_3">
2606<script>window.dfp.displayAdslot("dfp__rectangle-2_3")<\/script></div>');
2607	}
2608
2609	if (adLocation == 'frontpage') {
2610		
2611		if (document.documentElement.clientWidth < 1020) {
2612			jQuery(".col-two .widget-area .postlisting-3 ul li").eq(0).css('margin-bottom','30px').after('<div id="dfp__mob-1_1">
2612<script>window.dfp.displayAdslot("dfp__mob-1_1")<\/script></div>');
2613			jQuery(".col-two .widget-area .postlisting-2 ul li").eq(0).after(jQuery("#dfp__mob-2").css('margin','0px 0px 40px'));
2614			jQuery(".col-two .widget-area .postlisting-2 ul li").eq(2).after('<div id="dfp__mob-2_1">
2614<script>window.dfp.displayAdslot("dfp__mob-2_1")<\/script></div>');
2615			jQuery(".col-two .widget-area .postlisting-2 ul li").eq(4).after('<div id="dfp__mob-2_2">
2615<script>window.dfp.displayAdslot("dfp__mob-2_2")<\/script></div>');
2616		} else {
2617			//jQuery(".col-two .widget-area .postlisting-2 ul li").eq(1).after(jQuery("#dfp__in-text"));
2618		}
2619
2620	}
2621
2622	if (jQuery('body').hasClass('category-horoskooppi')) {
2623		
2624		if (document.documentElement.clientWidth < 1020) {
2625			jQuery(".col-two .widget-area .postlisting-4 ul li").eq(0).after('<div id="dfp__mob-1_1">
2625<script>window.dfp.displayAdslot("dfp__mob-1_1")<\/script></div>');
2626			jQuery(".col-two .widget-area .postlisting-4 ul li").eq(3).after(jQuery("#dfp__mob-2"));
2627			jQuery(".col-two .widget-area .postlisting-4 ul li").eq(6).after('<div id="dfp__mob-2_1">
2627<script>window.dfp.displayAdslot("dfp__mob-2_1")<\/script></div>');
2628			jQuery(".col-two .widget-area .postlisting-4 ul li").eq(9).after('<div id="dfp__mob-2_2">
2628<script>window.dfp.displayAdslot("dfp__mob-2_2")<\/script></div>');
2629		} else {
2630			jQuery(".col-two .widget-area .postlisting-4 ul li").eq(2).after(jQuery("#dfp__in-text"));
2631		}
2632
2633	} else if (jQuery('body').hasClass('category')) {
2634		
2635		if (document.documentElement.clientWidth < 1020) {
2636			jQuery(".col-two .widget-area .postlisting-6 ul li").eq(0).after('<div id="dfp__mob-1_1">
2636<script>window.dfp.displayAdslot("dfp__mob-1_1")<\/script></div>');
2637			jQuery(".col-two .widget-area .postlisting-6 ul li").eq(2).after(jQuery("#dfp__mob-2").css('margin','0px 0px 30px'));
2638			jQuery(".col-two .widget-area .postlisting-6 ul li").eq(4).after('<div id="dfp__mob-2_1">
2638<script>window.dfp.displayAdslot("dfp__mob-2_1")<\/script></div>');
2639			jQuery(".col-two .widget-area .postlisting-6 ul li").eq(6).after('<div id="dfp__mob-2_2">
2639<script>window.dfp.displayAdslot("dfp__mob-2_2")<\/script></div>');
2640		} else {
2641			jQuery(".col-two .widget-area .postlisting-6 ul li").eq(3).after('<div></div>').after(jQuery("#dfp__in-text").css('margin-bottom', '30px').css('width','100%'));
2642		}
2643
2644	}
2645
2646	if (adLocation == 'content' && jQuery('body').hasClass('single-post') && location.href.indexOf('testnewads=1') == -1) {
2647
2648		if (document.documentElement.clientWidth < 1020) {
2649
2650			var readMoreIndex = 0;
2651			jQuery('.article__body > p').each(function(index) {
2652				if (jQuery(this).text().trim() === 'Lue lisää:' || jQuery(this).text().trim() === 'Lue myös:') {
2653					readMoreIndex = index;
2654					return false;
2655				}
2656			});
2657			if (dfpDebug) {console.log('readMoreIndex: ' + readMoreIndex)}
2658			var nbrOfParagraphs = jQuery('.article__body > p').length;
2659			var nbrOfContentParagraphs = readMoreIndex > 0 ? nbrOfParagraphs - (nbrOfParagraphs - readMoreIndex) : nbrOfParagraphs;
2660			var mob1AdPlace = nbrOfContentParagraphs > 10 ? 1 : nbrOfContentParagraphs > 5 ? 0 : 0;
2661			if (dfpDebug) {console.log('nop: ' + nbrOfParagraphs + ', nocp: ' + nbrOfContentParagraphs + '. m1ap: ' + mob1AdPlace)}
2662			
2663			if (jQuery(".article__body > p").eq(mob1AdPlace).text().trim().slice(-1) == ">") {mob1AdPlace++}
2664			jQuery(".article__body > p").eq(mob1AdPlace).after('<div id="dfp__mob-1_1">
2664<script>window.dfp.displayAdslot("dfp__mob-1_1")<\/script></div>');
2665	
2666			if (dfpDebug) {console.log('Content p ' + nbrOfContentParagraphs + '. mob-1 after p.eq(' + mob1AdPlace + ')')}
2667			
2668			if (nbrOfContentParagraphs > 8) {
2669	
2670				(function() {
2671					var t = new Date().getTime(); t -= t % (1000*60*60*24*30);
2672					var l = document.createElement('script'); l.type = 'text/javascript'; l.async = true;
2673					l.src = '//otavamedia.bbvms.com/a/hymy.js?t='+t;
2674					var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(l, s);
2675				})();
2676	
2677				var bbwPlace = parseInt(nbrOfContentParagraphs/2);
2678				jQuery(".article__body > p").eq(bbwPlace).after('<div id=\"bbwvideo\"></div>');
2679				if (dfpDebug) {console.log('BBW after p.eq(' + bbwPlace + ')')}
2680	
2681			}
2682	
2683			if (nbrOfContentParagraphs > 4) {
2684				jQuery(".article__body > p").eq(nbrOfContentParagraphs-2).after('<div id="dfp__mob-2_1">
2684<script>window.dfp.displayAdslot("dfp__mob-2_1")<\/script></div>');
2685				if (dfpDebug) {console.log('mob-2 after p.eq(' + (nbrOfContentParagraphs-2) + ')')}
2686			}
2687
2688		} else {
2689			jQuery(".article__body > p").eq(4).after('<div id="dfp__in-text_1">
2689<script>window.dfp.displayAdslot("dfp__in-text_1")<\/script></div>');
2690		}
2691
2692	}
2693
2694	var useDelay = false;
2695	if (location.href.indexOf('usedelay') > -1) {useDelay = true}
2696	if (useDelay) {
2697
2698		if (adLocation == 'content' && document.documentElement.clientWidth < 1020) {
2699			jQuery("#dfp__mob-1, #dfp__mob-2").wrap("<div class='wrapper__mob'><div class='wrapper__mob__inner'></div></div>");
2700			jQuery(".wrapper__mob").css({"min-height": "600px"});
2701			jQuery(".wrapper__mob__inner").css({"position":"-webkit-sticky","position":"sticky","top":"50px"});
2702			//console.log('adLocation: content...');
2703		}
2704		if (document.documentElement.clientWidth >= 1020) {
2705			jQuery("#dfp__sky-scraper-1").wrap("<div class='wrapper__sky-1'></div>");
2706			jQuery("#dfp__sky-scraper-2").wrap("<div class='wrapper__sky-2'></div>");
2707			jQuery(".wrapper__sky-1").css({"min-height": "750px"});
2708			jQuery(".wrapper__sky-2").css({"min-height": "1500px"});
2709			jQuery("#dfp__sky-scraper-1, #dfp__sky-scraper-2").css({"position":"-webkit-sticky","position":"sticky","top":"50px"});
2710		}
2711
2712	}
2713
2714	let showConsentManager = function(){__tcfapi("showConsentManager",true,function(data){console.log(data)});}
2715	jQuery('#footer a[href=#]').replaceWith('<a href="#" class="manageSettings" onclick="window.gravitoCMP.openPreferences()">Evästeasetukset</a>');
2716
2717	//var rnd = Math.floor(Math.random() * 50);
2718	console.log('rnd: ' + rnd + ', p_rum: ' + cmpGetCookie('p_rum'))
2719
2720	//if (cmpGetCookie('p_rum') != 1 && rnd >= 40) {
2721	if (rnd >= 31) {
2722
2723		console.log('Calling Pingdom rum...');
2724		var fpa = document.createElement('script'); fpa.type = 'text/javascript'; fpa.async = true;
2725		fpa.src = '//rum-static.pingdom.net/pa-5a3bc7dfd31eee00070000c6.js';
2726		var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(fpa, s);
2727
2728	}
2729
2730	if (window.dfp.visibility == 'desktop' || window.dfp.visibility == 'large') {
2731		jQuery("body").append('<iframe srcdoc=\"\
2731<script src=\'https:\/\/cdn.performax.cz\/acc\/loader.js?aab=loader\'\>\<\/script\>\" style=\"display: none\" data-web=\"hymy.fi\" data-hash=\"347437801fe88859caf76003d7ea5b8b\"><\/iframe>');
2732	}
2733	
2734	var dfpReady = setInterval(function() {
2735		if(window.googletag && googletag.pubadsReady && 1 == 2) {
2736
2737			jQuery(document).ready(function() {
2738
2739				var hasLueLisaa = false;
2740				var paragraphCounter = 0;
2741				//console.log('pCount: ' + jQuery('.article__body > p').length);
2742				jQuery('.article__body > p').each(function() {
2743					if (jQuery(this).text().trim() === 'Lue lisää:' || jQuery(this).text().trim() === 'Lue myös:') {
2744						hasLueLisaa = true;
2745						//jQuery(jQuery(this)).before(jQuery('#dfp__mob-2'));
2746						jQuery('.article__body > .grid--dfp-slots').append('<div style="clear: both"></div>')
2747						jQuery(jQuery(this)).before(jQuery('.article__body > .grid--dfp-slots'));
2748						//var scriptContent = jQuery('.article__body #dfp__rectangle-2').find('script').html();
2749						//var newScriptContent = scriptContent.replace(/dfp__rectangle-2/g, 'dfp__rectangle-2_1');
2750						//jQuery('.article__body #dfp__rectangle-2').find('script').html(newScriptContent);
2751						//jQuery('#dfp__rectangle-2').attr('id', 'dfp__rectangle-2_1');
2752
2753						return false;
2754					}
2755					paragraphCounter++;
2756					//console.log('paragraphCounter: ' + paragraphCounter);
2757				});
2758			
2759				if (hasLueLisaa) {
2760					//console.log('bbbb: ' + (paragraphCounter-1));
2761					var nextParagraphs = (jQuery('.article__body > p').length - (paragraphCounter-1));
2762					//console.log('nextParagraphs: ' + nextParagraphs);
2763					//jQuery('.article__body > p').eq(paragraphCounter+9).before('<p>testi</p>');
2764
2765					var nbrOf2ndAds = 1;
2766					for (i=0;i<=nextParagraphs-1;i++) {
2767						//jQuery('.article__body > p').eq(i).before('<p>testi</p>');
2768						//console.log(i);
2769						jQuery('.article__body > p').eq(i+paragraphCounter).find('a[target="_blank"]').removeAttr('target');
2770						if (document.documentElement.clientWidth < 1020) {
2771							if (i > 0 && i % 7 == 0 && nbrOf2ndAds < 3) {
2772								//console.log('Lisätään mob-2 to p(eq): ' + i);
2773								jQuery('.article__body > p').eq(i+paragraphCounter).before('<div id="dfp__mob-2_' + nbrOf2ndAds + '">
2773<script>window.dfp.displayAdslot("dfp__mob-2_' + nbrOf2ndAds + '")<\/script></div>');
2774								if (nbrOf2ndAds == 2) {
2775									//break;
2776								}
2777								nbrOf2ndAds++;
2778							}
2779						} else {
2780							if (i > 0 && i % 12 == 0 && nbrOf2ndAds < 2) {
2781								//jQuery('.article__body > p').eq(i+paragraphCounter).before('<div id="dfp__in-text_' + nbrOf2ndAds + '">
2781<script>window.dfp.displayAdslot("dfp__in-text_' + nbrOf2ndAds + '")<\/script></div>');
2782								jQuery('.article__body > p').eq(i+paragraphCounter).before(jQuery('#dfp__in-text'));
2783								if (nbrOf2ndAds == 1) {
2784									//break;
2785								}
2786								nbrOf2ndAds++;
2787							}
2788						}
2789					}
2790				}
2791				
2792			});
2793			clearInterval(dfpReady);
2794	
2795		} else {
2796			//console.log('Checking Again if DFP ready...');
2797		}
2798	}, 100);
2799
2800
2801	if (testSRA) {
2802	
2803		const observers = new Map();
2804		
2805		function observeDFPElements() {
2806			
2807			//const targets = [...document.querySelectorAll('[id^="dfp__"]:not([data-observed])')].filter(el => el.id !== 'dfp__mob-2_222' && !el.id.includes('native'));
2808			const targets = [...document.querySelectorAll('[id^="dfp__"]:not([data-observed])')].filter(el => el.id !== 'dfp__mob-2_222');
2809	
2810			targets.forEach(target => {
2811	
2812				target.setAttribute('data-observed', 'true');
2813				//const thresholdValue = parseFloat(target.getAttribute('data-threshold')) || 1;
2814				let thresholdValue = parseFloat(target.getAttribute('data-threshold')) || 0.6;
2815				if (target.getAttribute('id').includes('dfp__native')) {
2816					thresholdValue = 0.3;
2817				};
2818	
2819				let observer = observers.get(thresholdValue);
2820				if (!observer) {
2821					if (dfpDebug) console.log(`Creating new observer for threshold: ${thresholdValue}`);
2822					//const rootMargin = `0px 0px ${thresholdValue * 100}% 0px`;
2823					const rootMargin = `${thresholdValue * 100}% 0px ${thresholdValue * 100}% 0px`;
2824					
2825					observer = new IntersectionObserver(
2826						(entries, obs) => {
2827							entries.forEach(entry => {
2828								if (entry.isIntersecting) {
2829									if (dfpDebug) {
2830										console.log('HAS: entry.boundingClientRect.height: ' + entry.boundingClientRect.height);
2831										console.log('HAS: calling runHeaderbid: ' + entry.target.id);
2832										let distanceFromViewportBottom = window.innerHeight - entry.boundingClientRect.top;
2833										console.log(`HAS: ${entry.target.id} is ${distanceFromViewportBottom.toFixed(0)}px from the bottom of viewport...`);
2834									}
2835									loadAdSlot(entry.target.id);
2836									obs.unobserve(entry.target);
2837								}
2838							});
2839						},
2840						{
2841							root: null, // relative to the viewport
2842							rootMargin: rootMargin,
2843							threshold: 0.0 // Fire as soon as it enters the margin
2844						}
2845					);
2846					observers.set(thresholdValue, observer);
2847				}
2848		
2849				observer.observe(target);
2850				if (dfpDebug) console.log('Observing element: ', target.id, 'with threshold:', thresholdValue);
2851			});
2852		}
2853		
2854		let debounceTimeout;
2855		function debouncedObserve() {
2856			clearTimeout(debounceTimeout);
2857			debounceTimeout = setTimeout(observeDFPElements, 100);
2858		}
2859	
2860	
2861		var dfpReady = setInterval(function() {
2862			if(window.googletag && googletag.pubadsReady) {
2863				if (dfpDebug) {console.log('DFP ready, starting observation...')}
2864	
2865				observeDFPElements();
2866	
2867				const mutationObserver = new MutationObserver(debouncedObserve);
2868				mutationObserver.observe(document.body, {childList: true, subtree: true});
2869	
2870				clearInterval(dfpReady);
2871	
2872			}
2873		}, 50)
2874	
2875	}
2876
2877
2878	var adslotsDefined = true;
2879
2880
2881	jQuery(function () {
2882	
2883		jQuery('body.single-post .article__body').append('<h3>Lue myös:</h3><ul id="latest-articles"></ul>');
2884	
2885		const FEED_URL = 'https://hymy.fi/wp-json/feeds/uutiset-uusimmat';
2886		const MAX_POSTS = 15;
2887	
2888		const FEED_KEY = 'latestArticlesFeed';
2889		const FEED_TS_KEY = 'latestArticlesFeedTs';
2890		const FEED_TTL = 1000 * 60 * 60; // 1 hour
2891	
2892		const READ_KEY = 'latestReadPostIds';
2893		const READ_TTL = 1000 * 60 * 60 * 24 * 7; // 7 days
2894	
2895		function decodeHtmlEntities(str) {
2896			if (!str) return '';
2897			const txt = document.createElement('textarea');
2898			txt.innerHTML = str;
2899			return txt.value;
2900		}
2901	
2902		function storageAvailable(type) {
2903			try {
2904				const storage = window[type];
2905				const x = '__test__';
2906				storage.setItem(x, x);
2907				storage.removeItem(x);
2908				return true;
2909			} catch (e) {
2910				return false;
2911			}
2912		}
2913	
2914		function getReadPostMap() {
2915	
2916			let readPostMap = {};
2917			if (!storageAvailable('localStorage')) return readPostMap;
2918	
2919			try {
2920				readPostMap = JSON.parse(localStorage.getItem(READ_KEY)) || {};
2921			} catch (e) {
2922				return {};
2923			}
2924	
2925			const now = Date.now();
2926			let changed = false;
2927	
2928			Object.keys(readPostMap).forEach(postId => {
2929				if (now - readPostMap[postId] > READ_TTL) {
2930					delete readPostMap[postId];
2931					changed = true;
2932				}
2933			});
2934	
2935			if (changed) {
2936				localStorage.setItem(READ_KEY, JSON.stringify(readPostMap));
2937			}
2938	
2939			return readPostMap;
2940	
2941		}
2942	
2943		function markPostAsRead(postId) {
2944	
2945			if (!postId || !storageAvailable('localStorage')) return;
2946	
2947			const readPostMap = getReadPostMap();
2948			if (!readPostMap[postId]) {
2949				readPostMap[postId] = Date.now();
2950				localStorage.setItem(READ_KEY, JSON.stringify(readPostMap));
2951			}
2952	
2953		}
2954	
2955		function isPostRead(postId) {
2956			return !!getReadPostMap()[postId];
2957		}
2958	
2959		let currentPostId = null;
2960		if (window.dataLayer && Array.isArray(window.dataLayer)) {
2961			const pageData = window.dataLayer.find(obj => obj.PostId);
2962			if (pageData) {
2963				currentPostId = pageData.PostId;
2964			}
2965		}
2966	
2967		if (currentPostId) {
2968			markPostAsRead(currentPostId);
2969		}
2970	
2971		function getCachedFeed() {
2972	
2973			if (!storageAvailable('sessionStorage')) return null;
2974	
2975			try {
2976	
2977				const feedData = sessionStorage.getItem(FEED_KEY);
2978				const ts = sessionStorage.getItem(FEED_TS_KEY);
2979	
2980				if (!feedData || !ts) return null;
2981	
2982				if (Date.now() - parseInt(ts, 10) > FEED_TTL) {
2983					sessionStorage.removeItem(FEED_KEY);
2984					sessionStorage.removeItem(FEED_TS_KEY);
2985					return null;
2986				}
2987	
2988				return JSON.parse(feedData);
2989	
2990			} catch (e) {
2991				return null;
2992			}
2993	
2994		}
2995	
2996		function cacheFeed(feedData) {
2997			if (!storageAvailable('sessionStorage')) return;
2998			try {
2999				sessionStorage.setItem(FEED_KEY, JSON.stringify(feedData));
3000				sessionStorage.setItem(FEED_TS_KEY, Date.now());
3001			} catch (e) {}
3002		}
3003	
3004		function renderPostList(posts) {
3005	
3006			if (!posts || !posts.length) return;
3007	
3008			const $ul = jQuery('#latest-articles');
3009			if (!$ul.length) return;
3010	
3011			let postsRendered = 0;
3012	
3013			posts.forEach(post => {
3014	
3015				if (postsRendered >= MAX_POSTS) return;
3016				if (post.is_ad) return;
3017				if (post.ID === currentPostId) return;
3018				if (isPostRead(post.ID)) return;
3019	
3020				const $link = jQuery('<a>', {
3021					href: post.url,
3022					text: decodeHtmlEntities(post.title),
3023					class: 'latest-article-link',
3024					'data-postid': post.ID
3025				});
3026	
3027				$link.on('click', function () {
3028	
3029					const postId = jQuery(this).data('postid');
3030					const targetPostId = currentPostId || 0;
3031	
3032					markPostAsRead(postId);
3033	
3034					const cacheBuster = Math.floor(Math.random() * 100000000);
3035					const img = new Image();
3036					img.src =
3037						'https://digitiimi.otavamedia.fi/cc/recom/?siteid=18&typeid=1' +
3038						'&bu=' + encodeURIComponent(location.href) +
3039						'&tu=' + encodeURIComponent(post.url) +
3040						'&cb=' + cacheBuster +
3041						'&pid=' + postId +
3042						'&tpid=' + targetPostId;
3043				});
3044	
3045				const $li = jQuery('<li>').append($link);
3046				$ul.append($li);
3047	
3048				postsRendered++;
3049			});
3050		}
3051	
3052		function init(feedData) {
3053	
3054			if (!feedData || !feedData.posts || !feedData.posts.length) return;
3055	
3056			const posts = feedData.posts.slice().reverse();
3057			renderPostList(posts);
3058	
3059		}
3060	
3061		const cachedFeed = getCachedFeed();
3062	
3063		if (cachedFeed) {
3064			init(cachedFeed);
3065		} else {
3066			jQuery.getJSON(FEED_URL)
3067				.done(function (feedData) {
3068					cacheFeed(feedData);
3069					init(feedData);
3070				});
3071		}
3072	
3073	});
3074
3075</script>
3075
3076
3077<script>
3078
3079	if (document.location.href.indexOf("anchorad=1") > -1) {
3080
3081		//loadAds();
3082		//console.log("load_test"); // This should be called when all <div data-ad-unit="??"> elements exists in DOM
3083
3084		var adTestParam = 'anchorad=1';
3085		$("body a").each(function() {
3086			var hrefSrc = $(this).attr('href');
3087			if (hrefSrc != null) {
3088				if (hrefSrc.indexOf("jpg") < 0 && hrefSrc.indexOf("gif") < 0 && hrefSrc.indexOf("png") < 0 && hrefSrc.indexOf("javascript") < 0 && hrefSrc.indexOf("debug=1") < 0) {
3089					if (hrefSrc.indexOf("?") < 0) {
3090						var ahreffi = hrefSrc + '?' + adTestParam;
3091					} else {
3092						var ahreffi = hrefSrc + '&' + adTestParam;
3093					}
3094					$(this).attr('href',ahreffi);
3095				}
3096			}
3097		});
3098
3099	}
3100
3101</script>
3101
3102
3103<style>
3104
3105	.latest-article-link {
3106		font-size: 15px;
3107	}
3108	ul#latest-articles {
3109		list-style-type: none;
3110		margin: 0;
3111		padding-top: 10px;
3112	}
3113	ul#latest-articles li {
3114		margin-bottom: 5px;
3115	}
3116	ul#latest-articles li:nth-Child(5n+0) {
3117		margin-bottom: 20px;
3118	}
3119	@media screen and (max-width: 768px) {
3120		.latest-article-link {
3121			font-size: 18px;
3122		}
3123		ul#latest-articles li {
3124			margin-bottom: 10px;
3125		}
3126		ul#latest-articles li:nth-Child(5n+0) {
3127			margin-bottom: 30px;
3128		}
3129	}
3130
3131	#verkkopalvelut .footer__services,
3132	#verkkopalvelut #palvelut {
3133		display: none;
3134	}
3135	
3136	#verkkopalvelut .om-logo,
3137	#verkkopalvelut .footer__logo {
3138		margin: 0 auto;
3139		display: block;
3140		float: none;    
3141		max-width:100px;
3142	}
3143	
3144	#verkkopalvelut .footer__logo img {
3145		width: 100%;
3146		max-width:100px;
3147		margin: 0 auto;
3148		display:block;
3149	}
3150	
3151	#verkkopalvelut .om-logo,
3152	#verkkopalvelut {
3153		padding-bottom:0;
3154		padding-top:0;
3155		padding-left:0;
3156		padding-right:0;
3157	}
3158	
3159	#verkkopalvelut .verkkopalvelut-inner {
3160		padding: 30px 0;
3161	}
3162
3163	.bb-float-close-button {
3164		top: -32px !important;
3165		padding: 7px 5px !important;
3166		font-size: 26px !important;
3167	}
3168	.bb_wrapper:has(.bb-float-close-button[style*="display: block"]), .bb_wrapper:has(.bb-float-close-button:not([style*=display])) {
3169		right: 8px !important;
3170		bottom: 8px !important;
3171	}
3172	@media screen and (min-width: 880px) {
3173		.bb_wrapper:has(.bb-float-close-button[style*="display: block"]), .bb_wrapper:has(.bb-float-close-button:not([style*=display])) {
3174			right: 20px !important;
3175			bottom: 15px !important;
3176		}
3177	}
3178	#dfp__interstitial_1 {
3179		position: fixed;
3180		z-index: 1000000;
3181		width: 1px;
3182		height: 1px;
3183		margin: 0px;
3184		padding: 0px;
3185		left: 0px;
3186		top: 0px;
3187	}
3188
3189</style>
3190
3191<!-- Body end tag end, do not remove --></body>
3192</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.