From 25c951271555f0ef4493ac5e96a57c95fb753d16 Mon Sep 17 00:00:00 2001 From: Tim-Hinnerk Heuer Date: Thu, 16 Sep 2021 11:17:09 +1200 Subject: Add piwik.js public api method setPagePerformanceTiming. (#17901) --- js/piwik.js | 99 +++++++++++++++++++++++++++++++++++++++++++++-- js/piwik.min.js | 117 ++++++++++++++++++++++++++++---------------------------- 2 files changed, 154 insertions(+), 62 deletions(-) (limited to 'js') diff --git a/js/piwik.js b/js/piwik.js index 3617c3ca4a..500d003094 100644 --- a/js/piwik.js +++ b/js/piwik.js @@ -62,7 +62,7 @@ setCustomRequestProcessing, setCustomVariable, getCustomVariable, deleteCustomVariable, storeCustomVariablesInCookie, setCustomDimension, getCustomDimension, deleteCustomVariables, deleteCustomDimension, setDownloadExtensions, addDownloadExtensions, removeDownloadExtensions, - setDomains, setIgnoreClasses, setRequestMethod, setRequestContentType, setGenerationTimeMs, + setDomains, setIgnoreClasses, setRequestMethod, setRequestContentType, setGenerationTimeMs, setPagePerformanceTiming, setReferrerUrl, setCustomUrl, setAPIUrl, setDocumentTitle, setPageViewId, getPiwikUrl, getMatomoUrl, getCurrentUrl, setDownloadClasses, setLinkClasses, setCampaignNameKey, setCampaignKeywordKey, @@ -107,7 +107,7 @@ isNodeAuthorizedToTriggerInteraction, getConfigDownloadExtensions, disableLinkTracking, substr, setAnyAttribute, max, abs, childNodes, compareDocumentPosition, body, getConfigVisitorCookieTimeout, getRemainingVisitorCookieTimeout, getDomains, getConfigCookiePath, - getConfigCookieSameSite, setCookieSameSite, + getConfigCookieSameSite, getCustomPagePerformanceTiming, setCookieSameSite, getConfigIdPageView, newVisitor, uuid, createTs, currentVisitTs, "", "\b", "\t", "\n", "\f", "\r", "\"", "\\", apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, lastIndex, length, parse, prototype, push, replace, @@ -592,6 +592,43 @@ if (typeof window.Matomo !== 'object') { return matches ? matches[1] : url; } + function isPositiveNumberString(str) { + // !isNaN(str) could be used but does not cover '03' (octal) and '0xA' (hex) + // nor negative numbers + return (/^[0-9][0-9]*(\.[0-9]+)?$/).test(str); + } + function filterIn(object, byFunction) { + var result = {}, k; + for (k in object) { + if (object.hasOwnProperty(k) && byFunction(object[k])) { + result[k] = object[k]; + } + } + return result; + } + function onlyPositiveIntegers(data) { + var result = {}, k; + for (k in data) { + if (data.hasOwnProperty(k)) { + if (isPositiveNumberString(data[k])) { + result[k] = Math.round(data[k]); + } else { + throw new Error('Parameter "' + k + '" provided value "' + data[k] + + '" is not valid. Please provide a numeric value.'); + } + } + } + return result; + } + function queryStringify(data) { + var queryString = '', k; + for (k in data) { + if (data.hasOwnProperty(k)) { + queryString += '&' + encodeWrapper(k) + '=' + encodeWrapper(data[k]); + } + } + return queryString; + } function stringStartsWith(str, prefix) { str = String(str); @@ -2184,6 +2221,9 @@ if (typeof window.Matomo !== 'object') { // This string is appended to the Tracker URL Request (eg. to send data that is not handled by the existing setters/getters) configAppendToTrackingUrl = '', + // setPagePerformanceTiming sets this manually for SPAs + customPagePerformanceTiming = '', + // Site ID configTrackerSiteId = siteId || '', @@ -3477,6 +3517,12 @@ if (typeof window.Matomo !== 'object') { } function appendAvailablePerformanceMetrics(request) { + if (customPagePerformanceTiming !== '') { + request += customPagePerformanceTiming; + performanceTracked = true; + return request; + } + if (!performanceAlias) { return request; } @@ -4904,6 +4950,9 @@ if (typeof window.Matomo !== 'object') { this.getConfigCookieSameSite = function () { return configCookieSameSite; }; + this.getCustomPagePerformanceTiming = function () { + return customPagePerformanceTiming; + }; this.removeAllAsyncTrackersButFirst = function () { var firstTracker = asyncTrackers[0]; asyncTrackers = [firstTracker]; @@ -5571,7 +5620,49 @@ if (typeof window.Matomo !== 'object') { * @param generationTime */ this.setGenerationTimeMs = function(generationTime) { - logConsoleError('setGenerationTimeMs is no longer supported since Matomo 4. The call will be ignored. There is currently no replacement yet.'); + logConsoleError('setGenerationTimeMs is no longer supported since Matomo 4. The call will be ignored. The replacement is setPagePerformanceTiming.'); + }; + + /** + * Replace setGenerationTimeMs with this more generic function + * Use in SPA + * @param networkTimeInMs + * @param serverTimeInMs + * @param transferTimeInMs + * @param domProcessingTimeInMs + * @param domCompletionTimeInMs + * @param onloadTimeInMs + */ + this.setPagePerformanceTiming = function( + networkTimeInMs, serverTimeInMs, transferTimeInMs, + domProcessingTimeInMs, domCompletionTimeInMs, onloadTimeInMs + ) { + /*members pf_net, pf_srv, pf_tfr, pf_dm1, pf_dm2, pf_onl */ + var data = { + pf_net: networkTimeInMs, + pf_srv: serverTimeInMs, + pf_tfr: transferTimeInMs, + pf_dm1: domProcessingTimeInMs, + pf_dm2: domCompletionTimeInMs, + pf_onl: onloadTimeInMs + }; + + try { + data = filterIn(data, isDefined); + data = onlyPositiveIntegers(data); + customPagePerformanceTiming = queryStringify(data); + if (customPagePerformanceTiming === '') { + logConsoleError('setPagePerformanceTiming() called without parameters. This function needs to be called with at least one performance parameter.'); + return; + } + + performanceTracked = false; // to ensure the values are sent (again) + performanceAvailable = true; // so appendAvailablePerformanceMetrics will be called directly + // Otherwise performanceAvailable will be set when the pageload finished, but there is no need + // to wait for that, when the values are set manually. + } catch (error) { + logConsoleError('setPagePerformanceTiming: ' + error.toString()); + } }; /** @@ -6988,7 +7079,7 @@ if (typeof window.Matomo !== 'object') { * Constructor ************************************************************/ - var applyFirst = ['addTracker', 'forgetCookieConsentGiven', 'requireCookieConsent', 'disableCookies', 'setTrackerUrl', 'setAPIUrl', 'enableCrossDomainLinking', 'setCrossDomainLinkingTimeout', 'setSessionCookieTimeout', 'setVisitorCookieTimeout', 'setCookieNamePrefix', 'setCookieSameSite', 'setSecureCookie', 'setCookiePath', 'setCookieDomain', 'setDomains', 'setUserId', 'setVisitorId', 'setSiteId', 'alwaysUseSendBeacon', 'enableLinkTracking', 'setCookieConsentGiven', 'requireConsent', 'setConsentGiven', 'disablePerformanceTracking']; + var applyFirst = ['addTracker', 'forgetCookieConsentGiven', 'requireCookieConsent', 'disableCookies', 'setTrackerUrl', 'setAPIUrl', 'enableCrossDomainLinking', 'setCrossDomainLinkingTimeout', 'setSessionCookieTimeout', 'setVisitorCookieTimeout', 'setCookieNamePrefix', 'setCookieSameSite', 'setSecureCookie', 'setCookiePath', 'setCookieDomain', 'setDomains', 'setUserId', 'setVisitorId', 'setSiteId', 'alwaysUseSendBeacon', 'enableLinkTracking', 'setCookieConsentGiven', 'requireConsent', 'setConsentGiven', 'disablePerformanceTracking', 'setPagePerformanceTiming']; function createFirstTracker(matomoUrl, siteId) { diff --git a/js/piwik.min.js b/js/piwik.min.js index e51e85dd75..67dc3a2832 100644 --- a/js/piwik.min.js +++ b/js/piwik.min.js @@ -8,64 +8,65 @@ * @license https://piwik.org/free-software/bsd/ BSD-3 Clause (also in js/LICENSE.txt) * @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause */ -;if(typeof _paq!=="object"){_paq=[]}if(typeof window.Matomo!=="object"){window.Matomo=window.Piwik=(function(){var q,b={},y={},G=document,g=navigator,X=screen,S=window,h=S.performance||S.mozPerformance||S.msPerformance||S.webkitPerformance,s=S.encodeURIComponent,R=S.decodeURIComponent,k=unescape,I=[],E,t,ah=[],x=0,ab=0,T=0,l=false;function o(ao){try{return R(ao)}catch(ap){return unescape(ao)}}function J(ap){var ao=typeof ap;return ao!=="undefined"}function A(ao){return typeof ao==="function"}function V(ao){return typeof ao==="object"}function w(ao){return typeof ao==="string"||ao instanceof String}function ag(ao){return typeof ao==="number"||ao instanceof Number -}function Y(ao){return J(ao)&&(ag(ao)||(w(ao)&&ao.length))}function B(ap){if(!ap){return true}var ao;var aq=true;for(ao in ap){if(Object.prototype.hasOwnProperty.call(ap,ao)){aq=false}}return aq}function ak(ao){var ap=typeof console;if(ap!=="undefined"&&console&&console.error){console.error(ao)}}function af(){var au,at,aw,ap,ao;for(au=0;au0;if(ar){av=aw.split("::");aq=av[0];aw=av[1];if("object"===typeof t[aq]&&"function"===typeof t[aq][aw]){t[aq][aw].apply(t[aq],ap)}else{if(ao){ah.push(ao)}}}else{for(at=0;at0;if(ax){av=aw.split(".");if(aq&&"object"===typeof aq[av[0]]){aq=aq[av[0]];aw=av[1]}else{if(ao){ah.push(ao);break}}}if(aq[aw]){aq[aw].apply(aq,ap)}else{var ay="The method '"+aw+'\' was not found in "_paq" variable. Please have a look at the Matomo tracker documentation: https://developer.matomo.org/api-reference/tracking-javascript'; -ak(ay);if(!ax){throw new TypeError(ay)}}if(aw==="addTracker"){break}if(aw==="setTrackerUrl"||aw==="setSiteId"){break}}else{aw.apply(I[at],ap)}}}}}function an(ar,aq,ap,ao){if(ar.addEventListener){ar.addEventListener(aq,ap,ao);return true}if(ar.attachEvent){return ar.attachEvent("on"+aq,ap)}ar["on"+aq]=ap}function m(ao){if(G.readyState==="complete"){ao()}else{if(S.addEventListener){S.addEventListener("load",ao,false)}else{if(S.attachEvent){S.attachEvent("onload",ao)}}}}function p(ar){var ao=false;if(G.attachEvent){ao=G.readyState==="complete"}else{ao=G.readyState!=="loading"}if(ao){ar();return}var aq;if(G.addEventListener){an(G,"DOMContentLoaded",function ap(){G.removeEventListener("DOMContentLoaded",ap,false);if(!ao){ao=true;ar()}})}else{if(G.attachEvent){G.attachEvent("onreadystatechange",function ap(){if(G.readyState==="complete"){G.detachEvent("onreadystatechange",ap);if(!ao){ao=true;ar()}}});if(G.documentElement.doScroll&&S===S.top){(function ap(){if(!ao){try{G.documentElement.doScroll("left") -}catch(at){setTimeout(ap,0);return}ao=true;ar()}}())}}}an(S,"load",function(){if(!ao){ao=true;ar()}},false)}function ac(ap,av,aw){if(!ap){return""}var ao="",ar,aq,at,au;for(ar in b){if(Object.prototype.hasOwnProperty.call(b,ar)){au=b[ar]&&"function"===typeof b[ar][ap];if(au){aq=b[ar][ap];at=aq(av||{},aw);if(at){ao+=at}}}}return ao}function ai(){var ao;l=true;ac("unload");ao=new Date();var ap=ao.getTimeAlias();if((q-ap)>3000){q=ap+3000}if(q){do{ao=new Date()}while(ao.getTimeAlias()=0;au--){at=av[au].split("=")[0]; -if(at===aq){av.splice(au,1)}}var ay=av.join("&");if(ay){aw=aw+"?"+ay}if(ax){aw+="#"+ax}}return aw}function e(aq,ap){var ao="[\\?&#]"+ap+"=([^&#]*)";var at=new RegExp(ao);var ar=at.exec(aq);return ar?o(ar[1]):""}function a(ao){if(ao&&String(ao)===ao){return ao.replace(/^\s+|\s+$/g,"")}return ao}function D(ao){return unescape(s(ao))}function am(aE){var aq=function(aK,aJ){return(aK<>>(32-aJ))},aF=function(aM){var aK="",aL,aJ;for(aL=7;aL>=0;aL--){aJ=(aM>>>(aL*4))&15;aK+=aJ.toString(16)}return aK},au,aH,aG,ap=[],ay=1732584193,aw=4023233417,av=2562383102,at=271733878,ar=3285377520,aD,aC,aB,aA,az,aI,ao,ax=[];aE=D(aE);ao=aE.length;for(aH=0;aH>>29);ax.push((ao<<3)&4294967295);for(au=0;auau.offsetWidth+au.scrollLeft||aw+az-aAau.offsetHeight+au.scrollTop||aB+ax-aAax?-1:1});if(ao.length<=1){return ao}var ap=0;var ar=0;var at=[];var aq;aq=ao[ap++];while(aq){if(aq===ao[ap]){ar=at.push(ap)}aq=ao[ap++]||null}while(ar--){ao.splice(at[ar],1) -}return ao},getAttributeValueFromNode:function(at,aq){if(!this.hasNodeAttribute(at,aq)){return}if(at&&at.getAttribute){return at.getAttribute(aq)}if(!at||!at.attributes){return}var ar=(typeof at.attributes[aq]);if("undefined"===ar){return}if(at.attributes[aq].value){return at.attributes[aq].value}if(at.attributes[aq].nodeValue){return at.attributes[aq].nodeValue}var ap;var ao=at.attributes;if(!ao){return}for(ap=0;ap1000){break}ao++}},findPieceNode:function(ap){var ao; -ao=ae.findFirstNodeHavingAttribute(ap,this.CONTENT_PIECE_ATTR);if(!ao){ao=ae.findFirstNodeHavingClass(ap,this.CONTENT_PIECE_CLASS)}if(!ao){ao=ae.findFirstNodeHavingClass(ap,this.LEGACY_CONTENT_PIECE_CLASS)}if(ao){return ao}return ap},findTargetNodeNoDefault:function(ao){if(!ao){return}var ap=ae.findFirstNodeHavingAttributeWithValue(ao,this.CONTENT_TARGET_ATTR);if(ap){return ap}ap=ae.findFirstNodeHavingAttribute(ao,this.CONTENT_TARGET_ATTR);if(ap){return ap}ap=ae.findFirstNodeHavingClass(ao,this.CONTENT_TARGET_CLASS);if(ap){return ap}ap=ae.findFirstNodeHavingClass(ao,this.LEGACY_CONTENT_TARGET_CLASS);if(ap){return ap}},findTargetNode:function(ao){var ap=this.findTargetNodeNoDefault(ao);if(ap){return ap}return ao},findContentName:function(ap){if(!ap){return}var at=ae.findFirstNodeHavingAttributeWithValue(ap,this.CONTENT_NAME_ATTR);if(at){return ae.getAttributeValueFromNode(at,this.CONTENT_NAME_ATTR)}var ao=this.findContentPiece(ap);if(ao){return this.removeDomainIfIsInLink(ao)}if(ae.hasNodeAttributeWithValue(ap,"title")){return ae.getAttributeValueFromNode(ap,"title") -}var aq=this.findPieceNode(ap);if(ae.hasNodeAttributeWithValue(aq,"title")){return ae.getAttributeValueFromNode(aq,"title")}var ar=this.findTargetNode(ap);if(ae.hasNodeAttributeWithValue(ar,"title")){return ae.getAttributeValueFromNode(ar,"title")}},findContentPiece:function(ap){if(!ap){return}var ar=ae.findFirstNodeHavingAttributeWithValue(ap,this.CONTENT_PIECE_ATTR);if(ar){return ae.getAttributeValueFromNode(ar,this.CONTENT_PIECE_ATTR)}var ao=this.findPieceNode(ap);var aq=this.findMediaUrlInNode(ao);if(aq){return this.toAbsoluteUrl(aq)}},findContentTarget:function(aq){if(!aq){return}var ar=this.findTargetNode(aq);if(ae.hasNodeAttributeWithValue(ar,this.CONTENT_TARGET_ATTR)){return ae.getAttributeValueFromNode(ar,this.CONTENT_TARGET_ATTR)}var ap;if(ae.hasNodeAttributeWithValue(ar,"href")){ap=ae.getAttributeValueFromNode(ar,"href");return this.toAbsoluteUrl(ap)}var ao=this.findPieceNode(aq);if(ae.hasNodeAttributeWithValue(ao,"href")){ap=ae.getAttributeValueFromNode(ao,"href");return this.toAbsoluteUrl(ap) -}},isSameDomain:function(ao){if(!ao||!ao.indexOf){return false}if(0===ao.indexOf(this.getLocation().origin)){return true}var ap=ao.indexOf(this.getLocation().host);if(8>=ap&&0<=ap){return true}return false},removeDomainIfIsInLink:function(aq){var ap="^https?://[^/]+";var ao="^.*//[^/]+";if(aq&&aq.search&&-1!==aq.search(new RegExp(ap))&&this.isSameDomain(aq)){aq=aq.replace(new RegExp(ao),"");if(!aq){aq="/"}}return aq},findMediaUrlInNode:function(at){if(!at){return}var aq=["img","embed","video","audio"];var ao=at.nodeName.toLowerCase();if(-1!==M(aq,ao)&&ae.findFirstNodeHavingAttributeWithValue(at,"src")){var ar=ae.findFirstNodeHavingAttributeWithValue(at,"src");return ae.getAttributeValueFromNode(ar,"src")}if(ao==="object"&&ae.hasNodeAttributeWithValue(at,"data")){return ae.getAttributeValueFromNode(at,"data")}if(ao==="object"){var au=ae.findNodesByTagName(at,"param");if(au&&au.length){var ap;for(ap=0;ap0}var ap=ar.clientWidth;if(S.innerWidth&&ap>S.innerWidth){ap=S.innerWidth}var ao=ar.clientHeight;if(S.innerHeight&&ao>S.innerHeight){ao=S.innerHeight}return((at.bottom>0||aq)&&at.right>0&&at.left=0)&&aD(dp)!==String(dq)){var dk="There was an error setting cookie `"+dp+"`. Please check domain and path.";ak(dk)}}function b3(dk){var dl;dk=j(dk,av);if(bQ){dl=new RegExp("#.*");return dk.replace(dl,"")}return dk}function bW(dm,dk){var dn=r(dk),dl;if(dn){return dk}if(dk.slice(0,1)==="/"){return r(dm)+"://"+d(dm)+dk}dm=b3(dm);dl=dm.indexOf("?");if(dl>=0){dm=dm.slice(0,dl)}dl=dm.lastIndexOf("/");if(dl!==dm.length-1){dm=dm.slice(0,dl+1)}return dm+dk}function cI(dm,dk){var dl;dm=String(dm).toLowerCase();dk=String(dk).toLowerCase();if(dm===dk){return true}if(dk.slice(0,1)==="."){if(dm===dk.slice(1)){return true -}dl=dm.length-dk.length;if((dl>0)&&(dm.slice(dl)===dk)){return true}}return false}function cl(dk){var dl=document.createElement("a");if(dk.indexOf("//")!==0&&dk.indexOf("http")!==0){if(dk.indexOf("*")===0){dk=dk.substr(1)}if(dk.indexOf(".")===0){dk=dk.substr(1)}dk="http://"+dk}dl.href=v.toAbsoluteUrl(dk);if(dl.pathname){return dl.pathname}return""}function a4(dl,dk){if(!aj(dk,"/")){dk="/"+dk}if(!aj(dl,"/")){dl="/"+dl}var dm=(dk==="/"||dk==="/*");if(dm){return true}if(dl===dk){return true}dk=String(dk).toLowerCase();dl=String(dl).toLowerCase();if(Q(dk,"*")){dk=dk.slice(0,-1);dm=(!dk||dk==="/");if(dm){return true}if(dl===dk){return true}return dl.indexOf(dk)===0}if(!Q(dl,"/")){dl+="/"}if(!Q(dk,"/")){dk+="/"}return dl.indexOf(dk)===0}function ar(dp,dr){var dl,dk,dm,dn,dq;for(dl=0;dl0)&&(dn.slice(dm)===dk)){return true}}}return false}function co(dk,dm){dk=dk.replace("send_image=0","send_image=1");var dl=new Image(1,1);dl.onload=function(){E=0;if(typeof dm==="function"){dm({request:dk,trackerUrl:aE,success:true})}};dl.onerror=function(){if(typeof dm==="function"){dm({request:dk,trackerUrl:aE,success:false})}};dl.src=aE+(aE.indexOf("?")<0?"?":"&")+dk}function cF(dk){if(db==="POST"){return true}return dk&&(dk.length>2000||dk.indexOf('{"requests"')===0)}function aL(){return"object"===typeof g&&"function"===typeof g.sendBeacon&&"function"===typeof Blob}function a7(dp,ds,dr){var dm=aL();if(!dm){return false}var dn={type:"application/x-www-form-urlencoded; charset=UTF-8"};var dt=false;var dl=aE;try{var dk=new Blob([dp],dn);if(dr&&!cF(dp)){dk=new Blob([],dn);dl=dl+(dl.indexOf("?")<0?"?":"&")+dp}dt=g.sendBeacon(dl,dk)}catch(dq){return false}if(dt&&typeof ds==="function"){ds({request:dp,trackerUrl:aE,success:true,isSendBeacon:true})}return dt}function c6(dl,dm,dk){if(!J(dk)||null===dk){dk=true -}if(l&&a7(dl,dm,dk)){return}setTimeout(function(){if(l&&a7(dl,dm,dk)){return}var dq;try{var dp=S.XMLHttpRequest?new S.XMLHttpRequest():S.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;dp.open("POST",aE,true);dp.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dr=l&&a7(dl,dm,dk);if(!dr&&dk){co(dl,dm)}else{if(typeof dm==="function"){dm({request:dl,trackerUrl:aE,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dm==="function")){dm({request:dl,trackerUrl:aE,success:true,xhr:this})}}};dp.setRequestHeader("Content-Type",cx);dp.withCredentials=true;dp.send(dl)}catch(dn){dq=l&&a7(dl,dm,dk);if(!dq&&dk){co(dl,dm)}else{if(typeof dm==="function"){dm({request:dl,trackerUrl:aE,success:false})}}}},50)}function cg(dl){var dk=new Date();var dm=dk.getTime()+dl;if(!q||dm>q){q=dm}}function bb(){bd=true;cy=new Date().getTime()}function de(){var dk=new Date().getTime();return !cy||(dk-cy)>a6}function az(){if(de()){bS()}}function dh(){if(aO||!a6){return -}aO=true;an(S,"focus",bb);an(S,"blur",az);ab++;t.addPlugin("HeartBeat"+ab,{unload:function(){if(aO&&de()){bS()}}})}function cD(dp){var dl=new Date();var dk=dl.getTime();c0=dk;if(cC&&dk=dk.length){return[dk]}var dl=0;var dm=dk.length;var dn=[];for(dl;dl=dl&&dk<=(dl+a0)){return true}}return false}function di(dk){if(!cO){return""}var dp=e(dk,av);if(!dp){return""}dp=String(dp);var dm=new RegExp("^[a-zA-Z0-9]+$"); -if(dp.length===32&&dm.test(dp)){var dl=dp.substr(16,32);if(c4(dl)){var dn=dp.substr(0,16);return dn}}return""}function cP(){if(!bP){bP=di(bO)}var dm=new Date(),dk=Math.round(dm.getTime()/1000),dl=aU("id"),dq=aD(dl),dp,dn;if(dq){dp=dq.split(".");dp.unshift("0");if(bP.length){dp[1]=bP}return dp}if(bP.length){dn=bP}else{if("0"===b6()){dn=""}else{dn=cS()}}dp=["1",dn,dk];return dp}function aZ(){var dn=cP(),dl=dn[0],dm=dn[1],dk=dn[2];return{newVisitor:dl,uuid:dm,createTs:dk}}function aH(){var dn=new Date(),dl=dn.getTime(),dp=aZ().createTs;var dk=parseInt(dp,10);var dm=(dk*1000)+cL-dl;return dm}function aN(dk){if(!b7){return}var dm=new Date(),dl=Math.round(dm.getTime()/1000);if(!J(dk)){dk=aZ()}var dn=dk.uuid+"."+dk.createTs+".";df(aU("id"),dn,aH(),br,cZ,bT,aJ)}function bN(){var dk=aD(aU("ref"));if(dk.length){try{dk=S.JSON.parse(dk);if(V(dk)){return dk}}catch(dl){}}return["","",0,""]}function by(dm){var dl=bl+"testcookie_domain";var dk="testvalue";df(dl,dk,10000,null,dm,bT,aJ);if(aD(dl)===dk){bZ(dl,null,dm); -return true}return false}function aF(){var dl=bn;bn=false;var dk,dm;for(dk=0;dk0){dp=parseInt(dp,10);ds(dp)}})}var bF={enabled:true,requests:[],timeout:null,interval:2500,sendRequests:function(){var dk=this.requests; -this.requests=[];if(dk.length===1){bH(dk[0],bL)}else{dg(dk,bL)}},canQueue:function(){return !l&&this.enabled},pushMultiple:function(dl){if(!this.canQueue()){dg(dl,bL);return}var dk;for(dk=0;dk0){if(!J(dl)){dl=""}if(!w(dl)){dl=String(dl)}bo[dk]=dl}};this.getCustomDimension=function(dk){dk=parseInt(dk,10);if(dk>0&&Object.prototype.hasOwnProperty.call(bo,dk)){return bo[dk]}};this.deleteCustomDimension=function(dk){dk=parseInt(dk,10);if(dk>0){delete bo[dk]}};this.setCustomVariable=function(dl,dk,dp,dm){var dn;if(!J(dm)){dm="visit"}if(!J(dk)){return}if(!J(dp)){dp=""}if(dl>0){dk=!w(dk)?String(dk):dk;dp=!w(dp)?String(dp):dp;dn=[dk.slice(0,bv),dp.slice(0,bv)];if(dm==="visit"||dm===2){cG();aR[dl]=dn}else{if(dm==="page"||dm===3){bX[dl]=dn}else{if(dm==="event"){cm[dl]=dn}}}}};this.getCustomVariable=function(dl,dm){var dk;if(!J(dm)){dm="visit"}if(dm==="page"||dm===3){dk=bX[dl]}else{if(dm==="event"){dk=cm[dl]}else{if(dm==="visit"||dm===2){cG();dk=aR[dl]}}}if(!J(dk)||(dk&&dk[0]==="")){return false}return dk};this.deleteCustomVariable=function(dk,dl){if(this.getCustomVariable(dk,dl)){this.setCustomVariable(dk,"","",dl)}};this.deleteCustomVariables=function(dk){if(dk==="page"||dk===3){bX={} -}else{if(dk==="event"){cm={}}else{if(dk==="visit"||dk===2){aR={}}}}};this.storeCustomVariablesInCookie=function(){bR=true};this.setLinkTrackingTimer=function(dk){bL=dk};this.getLinkTrackingTimer=function(){return bL};this.setDownloadExtensions=function(dk){if(w(dk)){dk=dk.split("|")}c8=dk};this.addDownloadExtensions=function(dl){var dk;if(w(dl)){dl=dl.split("|")}for(dk=0;dk1&&ap!=="addTracker"&&ap!=="enableLinkTracking"){ak("The method "+ap+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Matomo trackers documentation: https://developer.matomo.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}av[ap]++}}}}return au}var C=["addTracker","forgetCookieConsentGiven","requireCookieConsent","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSessionCookieTimeout","setVisitorCookieTimeout","setCookieNamePrefix","setCookieSameSite","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setVisitorId","setSiteId","alwaysUseSendBeacon","enableLinkTracking","setCookieConsentGiven","requireConsent","setConsentGiven","disablePerformanceTracking"]; -function ad(aq,ap){var ao=new P(aq,ap);I.push(ao);_paq=c(_paq,C);for(E=0;E<_paq.length;E++){if(_paq[E]){af(_paq[E])}}_paq=new H();t.trigger("TrackerAdded",[ao]);return ao}an(S,"beforeunload",ai,false);an(S,"online",function(){if(J(g.serviceWorker)){g.serviceWorker.ready.then(function(ao){if(ao&&ao.sync){return ao.sync.register("matomoSync")}},function(){})}},false);an(S,"message",function(au){if(!au||!au.origin){return}var aw,ar,ap;var ax=d(au.origin);var at=t.getAsyncTrackers();for(ar=0;ar0;if(aw){az=aA.split("::");av=az[0];aA=az[1];if("object"===typeof u[av]&&"function"===typeof u[av][aA]){u[av][aA].apply(u[av],au)}else{if(at){al.push(at)}}}else{for(ax=0;ax0;if(aB){az=aA.split(".");if(av&&"object"===typeof av[az[0]]){av=av[az[0]];aA=az[1]}else{if(at){al.push(at);break}}}if(av[aA]){av[aA].apply(av,au)}else{var aC="The method '"+aA+'\' was not found in "_paq" variable. Please have a look at the Matomo tracker documentation: https://developer.matomo.org/api-reference/tracking-javascript'; +ao(aC);if(!aB){throw new TypeError(aC)}}if(aA==="addTracker"){break}if(aA==="setTrackerUrl"||aA==="setSiteId"){break}}else{aA.apply(L[ax],au)}}}}}function ar(aw,av,au,at){if(aw.addEventListener){aw.addEventListener(av,au,at);return true}if(aw.attachEvent){return aw.attachEvent("on"+av,au)}aw["on"+av]=au}function n(at){if(J.readyState==="complete"){at()}else{if(W.addEventListener){W.addEventListener("load",at,false)}else{if(W.attachEvent){W.attachEvent("onload",at)}}}}function q(aw){var at=false;if(J.attachEvent){at=J.readyState==="complete"}else{at=J.readyState!=="loading"}if(at){aw();return}var av;if(J.addEventListener){ar(J,"DOMContentLoaded",function au(){J.removeEventListener("DOMContentLoaded",au,false);if(!at){at=true;aw()}})}else{if(J.attachEvent){J.attachEvent("onreadystatechange",function au(){if(J.readyState==="complete"){J.detachEvent("onreadystatechange",au);if(!at){at=true;aw()}}});if(J.documentElement.doScroll&&W===W.top){(function au(){if(!at){try{J.documentElement.doScroll("left") +}catch(ax){setTimeout(au,0);return}at=true;aw()}}())}}}ar(W,"load",function(){if(!at){at=true;aw()}},false)}function ag(au,az,aA){if(!au){return""}var at="",aw,av,ax,ay;for(aw in b){if(Object.prototype.hasOwnProperty.call(b,aw)){ay=b[aw]&&"function"===typeof b[aw][au];if(ay){av=b[aw][au];ax=av(az||{},aA);if(ax){at+=ax}}}}return at}function am(){var at;m=true;ag("unload");at=new Date();var au=at.getTimeAlias();if((r-au)>3000){r=au+3000}if(r){do{at=new Date()}while(at.getTimeAlias()=0;ay--){ax=az[ay].split("=")[0];if(ax===av){az.splice(ay,1)}}var aC=az.join("&");if(aC){aA=aA+"?"+aC}if(aB){aA+="#"+aB}}return aA}function e(av,au){var at="[\\?&#]"+au+"=([^&#]*)";var ax=new RegExp(at);var aw=ax.exec(av);return aw?p(aw[1]):""}function a(at){if(at&&String(at)===at){return at.replace(/^\s+|\s+$/g,"")}return at}function F(at){return unescape(t(at))}function aq(aI){var av=function(aO,aN){return(aO<>>(32-aN))},aJ=function(aQ){var aO="",aP,aN;for(aP=7;aP>=0;aP--){aN=(aQ>>>(aP*4))&15; +aO+=aN.toString(16)}return aO},ay,aL,aK,au=[],aC=1732584193,aA=4023233417,az=2562383102,ax=271733878,aw=3285377520,aH,aG,aF,aE,aD,aM,at,aB=[];aI=F(aI);at=aI.length;for(aL=0;aL>>29);aB.push((at<<3)&4294967295);for(ay=0;ayay.offsetWidth+ay.scrollLeft||aA+aD-aEay.offsetHeight+ay.scrollTop||aF+aB-aEaB?-1:1});if(at.length<=1){return at}var au=0;var aw=0;var ax=[];var av;av=at[au++];while(av){if(av===at[au]){aw=ax.push(au)}av=at[au++]||null}while(aw--){at.splice(ax[aw],1)}return at},getAttributeValueFromNode:function(ax,av){if(!this.hasNodeAttribute(ax,av)){return}if(ax&&ax.getAttribute){return ax.getAttribute(av)}if(!ax||!ax.attributes){return}var aw=(typeof ax.attributes[av]);if("undefined"===aw){return}if(ax.attributes[av].value){return ax.attributes[av].value}if(ax.attributes[av].nodeValue){return ax.attributes[av].nodeValue}var au;var at=ax.attributes;if(!at){return}for(au=0;au1000){break}at++}},findPieceNode:function(au){var at; +at=ai.findFirstNodeHavingAttribute(au,this.CONTENT_PIECE_ATTR);if(!at){at=ai.findFirstNodeHavingClass(au,this.CONTENT_PIECE_CLASS)}if(!at){at=ai.findFirstNodeHavingClass(au,this.LEGACY_CONTENT_PIECE_CLASS)}if(at){return at}return au},findTargetNodeNoDefault:function(at){if(!at){return}var au=ai.findFirstNodeHavingAttributeWithValue(at,this.CONTENT_TARGET_ATTR);if(au){return au}au=ai.findFirstNodeHavingAttribute(at,this.CONTENT_TARGET_ATTR);if(au){return au}au=ai.findFirstNodeHavingClass(at,this.CONTENT_TARGET_CLASS);if(au){return au}au=ai.findFirstNodeHavingClass(at,this.LEGACY_CONTENT_TARGET_CLASS);if(au){return au}},findTargetNode:function(at){var au=this.findTargetNodeNoDefault(at);if(au){return au}return at},findContentName:function(au){if(!au){return}var ax=ai.findFirstNodeHavingAttributeWithValue(au,this.CONTENT_NAME_ATTR);if(ax){return ai.getAttributeValueFromNode(ax,this.CONTENT_NAME_ATTR)}var at=this.findContentPiece(au);if(at){return this.removeDomainIfIsInLink(at)}if(ai.hasNodeAttributeWithValue(au,"title")){return ai.getAttributeValueFromNode(au,"title") +}var av=this.findPieceNode(au);if(ai.hasNodeAttributeWithValue(av,"title")){return ai.getAttributeValueFromNode(av,"title")}var aw=this.findTargetNode(au);if(ai.hasNodeAttributeWithValue(aw,"title")){return ai.getAttributeValueFromNode(aw,"title")}},findContentPiece:function(au){if(!au){return}var aw=ai.findFirstNodeHavingAttributeWithValue(au,this.CONTENT_PIECE_ATTR);if(aw){return ai.getAttributeValueFromNode(aw,this.CONTENT_PIECE_ATTR)}var at=this.findPieceNode(au);var av=this.findMediaUrlInNode(at);if(av){return this.toAbsoluteUrl(av)}},findContentTarget:function(av){if(!av){return}var aw=this.findTargetNode(av);if(ai.hasNodeAttributeWithValue(aw,this.CONTENT_TARGET_ATTR)){return ai.getAttributeValueFromNode(aw,this.CONTENT_TARGET_ATTR)}var au;if(ai.hasNodeAttributeWithValue(aw,"href")){au=ai.getAttributeValueFromNode(aw,"href");return this.toAbsoluteUrl(au)}var at=this.findPieceNode(av);if(ai.hasNodeAttributeWithValue(at,"href")){au=ai.getAttributeValueFromNode(at,"href");return this.toAbsoluteUrl(au) +}},isSameDomain:function(at){if(!at||!at.indexOf){return false}if(0===at.indexOf(this.getLocation().origin)){return true}var au=at.indexOf(this.getLocation().host);if(8>=au&&0<=au){return true}return false},removeDomainIfIsInLink:function(av){var au="^https?://[^/]+";var at="^.*//[^/]+";if(av&&av.search&&-1!==av.search(new RegExp(au))&&this.isSameDomain(av)){av=av.replace(new RegExp(at),"");if(!av){av="/"}}return av},findMediaUrlInNode:function(ax){if(!ax){return}var av=["img","embed","video","audio"];var at=ax.nodeName.toLowerCase();if(-1!==P(av,at)&&ai.findFirstNodeHavingAttributeWithValue(ax,"src")){var aw=ai.findFirstNodeHavingAttributeWithValue(ax,"src");return ai.getAttributeValueFromNode(aw,"src")}if(at==="object"&&ai.hasNodeAttributeWithValue(ax,"data")){return ai.getAttributeValueFromNode(ax,"data")}if(at==="object"){var ay=ai.findNodesByTagName(ax,"param");if(ay&&ay.length){var au;for(au=0;au0}var au=aw.clientWidth;if(W.innerWidth&&au>W.innerWidth){au=W.innerWidth}var at=aw.clientHeight;if(W.innerHeight&&at>W.innerHeight){at=W.innerHeight}return((ax.bottom>0||av)&&ax.right>0&&ax.left=0)&&aH(du)!==String(dv)){var dq="There was an error setting cookie `"+du+"`. Please check domain and path.";ao(dq)}}function b7(dq){var dr;dq=j(dq,az);if(bU){dr=new RegExp("#.*");return dq.replace(dr,"")}return dq}function b0(ds,dq){var dt=s(dq),dr;if(dt){return dq}if(dq.slice(0,1)==="/"){return s(ds)+"://"+d(ds)+dq}ds=b7(ds);dr=ds.indexOf("?");if(dr>=0){ds=ds.slice(0,dr)}dr=ds.lastIndexOf("/");if(dr!==ds.length-1){ds=ds.slice(0,dr+1)}return ds+dq}function cN(ds,dq){var dr;ds=String(ds).toLowerCase();dq=String(dq).toLowerCase();if(ds===dq){return true}if(dq.slice(0,1)==="."){if(ds===dq.slice(1)){return true +}dr=ds.length-dq.length;if((dr>0)&&(ds.slice(dr)===dq)){return true}}return false}function cp(dq){var dr=document.createElement("a");if(dq.indexOf("//")!==0&&dq.indexOf("http")!==0){if(dq.indexOf("*")===0){dq=dq.substr(1)}if(dq.indexOf(".")===0){dq=dq.substr(1)}dq="http://"+dq}dr.href=w.toAbsoluteUrl(dq);if(dr.pathname){return dr.pathname}return""}function a8(dr,dq){if(!an(dq,"/")){dq="/"+dq}if(!an(dr,"/")){dr="/"+dr}var ds=(dq==="/"||dq==="/*");if(ds){return true}if(dr===dq){return true}dq=String(dq).toLowerCase();dr=String(dr).toLowerCase();if(U(dq,"*")){dq=dq.slice(0,-1);ds=(!dq||dq==="/");if(ds){return true}if(dr===dq){return true}return dr.indexOf(dq)===0}if(!U(dr,"/")){dr+="/"}if(!U(dq,"/")){dq+="/"}return dr.indexOf(dq)===0}function aw(du,dw){var dr,dq,ds,dt,dv;for(dr=0;dr0)&&(dt.slice(ds)===dq)){return true}}}return false}function ct(dq,ds){dq=dq.replace("send_image=0","send_image=1");var dr=new Image(1,1);dr.onload=function(){H=0;if(typeof ds==="function"){ds({request:dq,trackerUrl:aI,success:true})}};dr.onerror=function(){if(typeof ds==="function"){ds({request:dq,trackerUrl:aI,success:false})}};dr.src=aI+(aI.indexOf("?")<0?"?":"&")+dq}function cK(dq){if(dg==="POST"){return true}return dq&&(dq.length>2000||dq.indexOf('{"requests"')===0)}function aP(){return"object"===typeof g&&"function"===typeof g.sendBeacon&&"function"===typeof Blob}function bb(du,dx,dw){var ds=aP();if(!ds){return false}var dt={type:"application/x-www-form-urlencoded; charset=UTF-8"};var dy=false;var dr=aI;try{var dq=new Blob([du],dt);if(dw&&!cK(du)){dq=new Blob([],dt);dr=dr+(dr.indexOf("?")<0?"?":"&")+du}dy=g.sendBeacon(dr,dq)}catch(dv){return false}if(dy&&typeof dx==="function"){dx({request:du,trackerUrl:aI,success:true,isSendBeacon:true})}return dy}function db(dr,ds,dq){if(!M(dq)||null===dq){dq=true +}if(m&&bb(dr,ds,dq)){return}setTimeout(function(){if(m&&bb(dr,ds,dq)){return}var dv;try{var du=W.XMLHttpRequest?new W.XMLHttpRequest():W.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;du.open("POST",aI,true);du.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dw=m&&bb(dr,ds,dq);if(!dw&&dq){ct(dr,ds)}else{if(typeof ds==="function"){ds({request:dr,trackerUrl:aI,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof ds==="function")){ds({request:dr,trackerUrl:aI,success:true,xhr:this})}}};du.setRequestHeader("Content-Type",cC);du.withCredentials=true;du.send(dr)}catch(dt){dv=m&&bb(dr,ds,dq);if(!dv&&dq){ct(dr,ds)}else{if(typeof ds==="function"){ds({request:dr,trackerUrl:aI,success:false})}}}},50)}function ck(dr){var dq=new Date();var ds=dq.getTime()+dr;if(!r||ds>r){r=ds}}function bf(){bh=true;cD=new Date().getTime()}function dj(){var dq=new Date().getTime();return !cD||(dq-cD)>ba}function aD(){if(dj()){bW()}}function dm(){if(aS||!ba){return +}aS=true;ar(W,"focus",bf);ar(W,"blur",aD);af++;u.addPlugin("HeartBeat"+af,{unload:function(){if(aS&&dj()){bW()}}})}function cI(du){var dr=new Date();var dq=dr.getTime();c5=dq;if(cH&&dq=dq.length){return[dq]}var dr=0;var ds=dq.length;var dt=[];for(dr;dr=dr&&dq<=(dr+a4)){return true}}return false}function dn(dq){if(!cT){return""}var du=e(dq,az);if(!du){return""}du=String(du);var ds=new RegExp("^[a-zA-Z0-9]+$"); +if(du.length===32&&ds.test(du)){var dr=du.substr(16,32);if(c9(dr)){var dt=du.substr(0,16);return dt}}return""}function cU(){if(!bT){bT=dn(bS)}var ds=new Date(),dq=Math.round(ds.getTime()/1000),dr=aY("id"),dv=aH(dr),du,dt;if(dv){du=dv.split(".");du.unshift("0");if(bT.length){du[1]=bT}return du}if(bT.length){dt=bT}else{if("0"===ca()){dt=""}else{dt=cX()}}du=["1",dt,dq];return du}function a3(){var dt=cU(),dr=dt[0],ds=dt[1],dq=dt[2];return{newVisitor:dr,uuid:ds,createTs:dq}}function aL(){var dt=new Date(),dr=dt.getTime(),du=a3().createTs;var dq=parseInt(du,10);var ds=(dq*1000)+cQ-dr;return ds}function aR(dq){if(!cb){return}var ds=new Date(),dr=Math.round(ds.getTime()/1000);if(!M(dq)){dq=a3()}var dt=dq.uuid+"."+dq.createTs+".";dk(aY("id"),dt,aL(),bv,c4,bX,aN)}function bR(){var dq=aH(aY("ref"));if(dq.length){try{dq=W.JSON.parse(dq);if(Z(dq)){return dq}}catch(dr){}}return["","",0,""]}function bC(ds){var dr=bp+"testcookie_domain";var dq="testvalue";dk(dr,dq,10000,null,ds,bX,aN);if(aH(dr)===dq){b4(dr,null,ds); +return true}return false}function aJ(){var dr=br;br=false;var dq,ds;for(dq=0;dq0){du=parseInt(du,10);dx(du)}})}var bJ={enabled:true,requests:[],timeout:null,interval:2500,sendRequests:function(){var dq=this.requests; +this.requests=[];if(dq.length===1){bL(dq[0],bP)}else{dl(dq,bP)}},canQueue:function(){return !m&&this.enabled},pushMultiple:function(dr){if(!this.canQueue()){dl(dr,bP);return}var dq;for(dq=0;dq0){if(!M(dr)){dr=""}if(!x(dr)){dr=String(dr)}bs[dq]=dr}};this.getCustomDimension=function(dq){dq=parseInt(dq,10);if(dq>0&&Object.prototype.hasOwnProperty.call(bs,dq)){return bs[dq]}};this.deleteCustomDimension=function(dq){dq=parseInt(dq,10);if(dq>0){delete bs[dq]}};this.setCustomVariable=function(dr,dq,du,ds){var dt;if(!M(ds)){ds="visit"}if(!M(dq)){return}if(!M(du)){du=""}if(dr>0){dq=!x(dq)?String(dq):dq;du=!x(du)?String(du):du;dt=[dq.slice(0,bz),du.slice(0,bz)];if(ds==="visit"||ds===2){cL();aV[dr]=dt}else{if(ds==="page"||ds===3){b1[dr]=dt}else{if(ds==="event"){cq[dr]=dt}}}}};this.getCustomVariable=function(dr,ds){var dq;if(!M(ds)){ds="visit"}if(ds==="page"||ds===3){dq=b1[dr]}else{if(ds==="event"){dq=cq[dr]}else{if(ds==="visit"||ds===2){cL();dq=aV[dr]}}}if(!M(dq)||(dq&&dq[0]==="")){return false}return dq};this.deleteCustomVariable=function(dq,dr){if(this.getCustomVariable(dq,dr)){this.setCustomVariable(dq,"","",dr)}};this.deleteCustomVariables=function(dq){if(dq==="page"||dq===3){b1={} +}else{if(dq==="event"){cq={}}else{if(dq==="visit"||dq===2){aV={}}}}};this.storeCustomVariablesInCookie=function(){bV=true};this.setLinkTrackingTimer=function(dq){bP=dq};this.getLinkTrackingTimer=function(){return bP};this.setDownloadExtensions=function(dq){if(x(dq)){dq=dq.split("|")}dd=dq};this.addDownloadExtensions=function(dr){var dq;if(x(dr)){dr=dr.split("|")}for(dq=0;dq1&&au!=="addTracker"&&au!=="enableLinkTracking"){ao("The method "+au+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Matomo trackers documentation: https://developer.matomo.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}az[au]++}}}}return ay}var E=["addTracker","forgetCookieConsentGiven","requireCookieConsent","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSessionCookieTimeout","setVisitorCookieTimeout","setCookieNamePrefix","setCookieSameSite","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setVisitorId","setSiteId","alwaysUseSendBeacon","enableLinkTracking","setCookieConsentGiven","requireConsent","setConsentGiven","disablePerformanceTracking","setPagePerformanceTiming"];function ah(av,au){var at=new T(av,au); +L.push(at);_paq=c(_paq,E);for(H=0;H<_paq.length;H++){if(_paq[H]){aj(_paq[H])}}_paq=new K();u.trigger("TrackerAdded",[at]);return at}ar(W,"beforeunload",am,false);ar(W,"online",function(){if(M(g.serviceWorker)){g.serviceWorker.ready.then(function(at){if(at&&at.sync){return at.sync.register("matomoSync")}},function(){})}},false);ar(W,"message",function(ay){if(!ay||!ay.origin){return}var aA,aw,au;var aB=d(ay.origin);var ax=u.getAsyncTrackers();for(aw=0;aw