@bidkernel/analytics 0.19.0 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -1
- package/dist/analytics.global.js +1 -1
- package/dist/index.d.mts +27 -5
- package/dist/index.d.ts +27 -5
- package/dist/index.js +101 -57
- package/dist/index.mjs +99 -57
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -62,12 +62,30 @@ analytics.enable();
|
|
|
62
62
|
| `warningsEnabled` | `true` | Collect warning events. |
|
|
63
63
|
| `errorsEnabled` | `true` | Collect error events (capped per session). |
|
|
64
64
|
| `userId` | `""` (empty) | **Not generated, you must pass it.** See [User identity](#user-identity). |
|
|
65
|
-
| `sessionId` / `pageviewId` | generated | Override identity; a
|
|
65
|
+
| `sessionId` / `pageviewId` | generated | Override identity; otherwise a session of visitor activity is managed, see [Sessions](#sessions) . |
|
|
66
66
|
| `deviceType` / `country` / `region` | server-derived | Optional client hints; ingest resolves these server-side. |
|
|
67
67
|
| `logLevel` | `"INFO"` | Console log verbosity. |
|
|
68
68
|
|
|
69
69
|
SPA navigations: call `analytics.navigate(newPageviewId, newUrl)` to flush the old pageview and continue under the new one.
|
|
70
70
|
|
|
71
|
+
## Sessions
|
|
72
|
+
|
|
73
|
+
A session is a 30-minute window of visitor activity: it starts with a
|
|
74
|
+
pageview and is extended by interaction with the page (pointer, keyboard,
|
|
75
|
+
scroll, touch) and by the tab becoming visible again. Ad events never extend
|
|
76
|
+
it, so a page left open on auto-refreshing slots ends its session 30 minutes
|
|
77
|
+
after the visitor last touched it. The next interaction starts a new session
|
|
78
|
+
under a new `sessionId`.
|
|
79
|
+
|
|
80
|
+
The adapter reports every event it is given, on a live session or a lapsed
|
|
81
|
+
one. It is the Bidkernel SDK that stops refreshing slots once the session
|
|
82
|
+
ends, and resumes when it restarts, so an idle tab buys and reports at most
|
|
83
|
+
one session's worth of cycles. `isSessionActive()` and
|
|
84
|
+
`onSessionResume(listener)` expose the state for that. A page running its
|
|
85
|
+
own refresh outside the SDK keeps reporting for as long as it refreshes.
|
|
86
|
+
|
|
87
|
+
A `sessionId` you supply is stamped as given and never rotated.
|
|
88
|
+
|
|
71
89
|
## User identity
|
|
72
90
|
|
|
73
91
|
Unlike `sessionId` and `pageviewId`, the adapter never generates a `userId`.
|
package/dist/analytics.global.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var bidkernelPrebidAnalyticsBundle=(()=>{var B=(i,e)=>()=>(i&&(e=i(i=0)),e);var ft=(i,e)=>()=>(e||i((e={exports:{}}).exports,e),e.exports);function yt(){if(typeof window<"u"){let i=window;return i.__bidkernelLogListeners||(i.__bidkernelLogListeners=new Set),i.__bidkernelLogListeners}return pt}function bt(i){if((i<0||!Number.isFinite(i))&&(i=0),i<1e3)return`${i.toFixed(2)}ms`;let e=i/1e3;if(e<60)return`${e.toFixed(2)}s`;let t=Math.floor(e/60);return t<60?`${t}m ${(e%60).toFixed(2)}s`:`${Math.floor(t/60)}h ${t%60}m ${(e%60).toFixed(2)}s`}function G(i){if(typeof i=="string"){let e=i.toUpperCase();if(e==="DEBUG"||e==="INFO"||e==="WARN"||e==="ERROR")return e}return w.INFO}function ne(i){return new te(i)}var w,Ae,N,ht,pt,te,Re=B(()=>{"use strict";w={DEBUG:"DEBUG",INFO:"INFO",WARN:"WARN",ERROR:"ERROR"},Ae={[w.DEBUG]:10,[w.INFO]:20,[w.WARN]:30,[w.ERROR]:40},N={badge:"color: #2dd4bf; font-weight: bold",badgeWarn:"background: #f59e0b; color: #fff; padding: 2px 4px; border-radius: 3px; font-weight: bold",badgeError:"background: #ef4444; color: #fff; padding: 2px 4px; border-radius: 3px; font-weight: bold",dim:"color: #6b7280",event:"color: #38bdf8; font-weight: bold",eventWarn:"color: #f59e0b; font-weight: bold",eventError:"color: #ef4444; font-weight: bold",reset:"color: inherit"},ht=0,pt=new Set;te=class i{_prefix;_level;_loadedAt;_now;_console;_customFormatTime;_listeners=new Set;constructor(e={}){this._prefix=e.prefix??"[bidkernel]",this._level=G(e.logLevel??w.INFO),this._now=e.now,this._console=e.console,this._customFormatTime=e.formatTime,e.onLog&&this._listeners.add(e.onLog),this._loadedAt=e.loadedAt??(this._now?this._now():typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now())}get prefix(){return this._prefix}set prefix(e){this._prefix=e}get logLevel(){return this._level}set logLevel(e){this._level=G(e)}getLevel(){return this._level}setLevel(e){this._level=G(e)}getPrefix(){return this._prefix}setPrefix(e){this._prefix=e}resetTiming(e){this._loadedAt=e??(this._now?this._now():typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now())}getLoadedAt(){return this._loadedAt}addListener(e){return this._listeners.add(e),()=>{this._listeners.delete(e)}}removeListener(e){this._listeners.delete(e)}isEnabled(e){let t=G(e);return(Ae[t]??20)>=(Ae[this._level]??20)}formatTime(e){return this._customFormatTime?this._customFormatTime(e):bt(e)}_getConsole(){if(this._console)return this._console;if(typeof console<"u")return console}_getElapsed(){let e=this._now?this._now():typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now();return Math.max(0,e-this._loadedAt)}_dispatchRecord(e){for(let n of this._listeners)try{n(e)}catch{}let t=yt();for(let n of t)if(!this._listeners.has(n))try{n(e)}catch{}if(typeof window<"u"&&typeof window.dispatchEvent=="function")try{window.dispatchEvent(new CustomEvent("__bidkernel_log__",{detail:e}))}catch{}}log(e,t,...n){let r=G(e);if(!this.isEnabled(r))return;let o=this._getElapsed(),s=this.formatTime(o),d=Date.now(),l={id:`bk_log_${d}_${++ht}`,timestamp:d,elapsedMs:o,level:r,prefix:this._prefix,message:t,args:n,data:n.length===1?n[0]:n.length>1?n:void 0};this._dispatchRecord(l);let c=this._getConsole();if(!c)return;let y=N.badge,h=N.event;r===w.WARN?(y=N.badgeWarn,h=N.eventWarn):r===w.ERROR&&(y=N.badgeError,h=N.eventError);let I=`%c${this._prefix}%c ${s} %c${t}%c`,A=[y,N.dim,h,N.reset],p=[I,...A];switch(n.length>0&&p.push(...n),r){case w.DEBUG:typeof c.log=="function"?c.log(...p):typeof c.debug=="function"&&c.debug(...p);break;case w.INFO:typeof c.info=="function"?c.info(...p):typeof c.log=="function"&&c.log(...p);break;case w.WARN:typeof c.warn=="function"?c.warn(...p):typeof c.log=="function"&&c.log(...p);break;case w.ERROR:typeof c.error=="function"?c.error(...p):typeof c.log=="function"&&c.log(...p);break;default:typeof c.log=="function"&&c.log(...p);break}}debug(e,...t){this.log(w.DEBUG,e,...t)}info(e,...t){this.log(w.INFO,e,...t)}warn(e,...t){this.log(w.WARN,e,...t)}error(e,...t){this.log(w.ERROR,e,...t)}logEvent(e){e&&(e.data!==void 0?this.log(e.level,e.eventName,e.data):this.log(e.level,e.eventName))}child(e,t={}){let n=this._prefix;if(e){let r=e.startsWith("[")&&e.endsWith("]")?e:`[${e}]`;n=`${this._prefix}${r}`}return new i({prefix:n,logLevel:t.logLevel??this._level,loadedAt:t.loadedAt??this._loadedAt,now:t.now??this._now,console:t.console??this._console,formatTime:t.formatTime??this._customFormatTime,...t})}withPrefix(e){return new i({prefix:e,logLevel:this._level,loadedAt:this._loadedAt,now:this._now,console:this._console,formatTime:this._customFormatTime})}}});function Be(){let i=0,e=0;for(let n=0;n<28;n+=7){let r=this.buf[this.pos++];if(i|=(r&127)<<n,(r&128)==0)return this.assertBounds(),[i,e]}let t=this.buf[this.pos++];if(i|=(t&15)<<28,e=(t&112)>>4,(t&128)==0)return this.assertBounds(),[i,e];for(let n=3;n<=31;n+=7){let r=this.buf[this.pos++];if(e|=(r&127)<<n,(r&128)==0)return this.assertBounds(),[i,e]}throw new Error("invalid varint")}function Q(i,e,t){for(let o=0;o<28;o=o+7){let s=i>>>o,d=!(!(s>>>7)&&e==0),a=(d?s|128:s)&255;if(t.push(a),!d)return}let n=i>>>28&15|(e&7)<<4,r=e>>3!=0;if(t.push((r?n|128:n)&255),!!r){for(let o=3;o<31;o=o+7){let s=e>>>o,d=!!(s>>>7),a=(d?s|128:s)&255;if(t.push(a),!d)return}t.push(e>>>31&1)}}function ie(i){let e=i[0]==="-";e&&(i=i.slice(1));let t=1e6,n=0,r=0;function o(s,d){let a=Number(i.slice(s,d));r*=t,n=n*t+a,n>=X&&(r=r+(n/X|0),n=n%X)}return o(-24,-18),o(-18,-12),o(-12,-6),o(-6),e?Se(n,r):oe(n,r)}function Ce(i,e){let t=oe(i,e),n=t.hi&2147483648;n&&(t=Se(t.lo,t.hi));let r=re(t.lo,t.hi);return n?"-"+r:r}function re(i,e){if({lo:i,hi:e}=gt(i,e),e<=2097151)return String(X*e+i);let t=i&16777215,n=(i>>>24|e<<8)&16777215,r=e>>16&65535,o=t+n*6777216+r*6710656,s=n+r*8147497,d=r*2,a=1e7;return o>=a&&(s+=Math.floor(o/a),o%=a),s>=a&&(d+=Math.floor(s/a),s%=a),d.toString()+_e(s)+_e(o)}function gt(i,e){return{lo:i>>>0,hi:e>>>0}}function oe(i,e){return{lo:i|0,hi:e|0}}function Se(i,e){return e=~e,i?i=~i+1:e+=1,oe(i,e)}function se(i,e){if(i>=0){for(;i>127;)e.push(i&127|128),i=i>>>7;e.push(i)}else{for(let t=0;t<9;t++)e.push(i&127|128),i=i>>7;e.push(1)}}function Le(){let i=this.buf[this.pos++],e=i&127;if((i&128)==0)return this.assertBounds(),e;if(i=this.buf[this.pos++],e|=(i&127)<<7,(i&128)==0)return this.assertBounds(),e;if(i=this.buf[this.pos++],e|=(i&127)<<14,(i&128)==0)return this.assertBounds(),e;if(i=this.buf[this.pos++],e|=(i&127)<<21,(i&128)==0)return this.assertBounds(),e;i=this.buf[this.pos++],e|=(i&15)<<28;for(let t=5;(i&128)!==0&&t<10;t++)i=this.buf[this.pos++];if((i&128)!=0)throw new Error("invalid varint");return this.assertBounds(),e>>>0}var X,_e,de=B(()=>{"use strict";X=4294967296;_e=i=>{let e=String(i);return"0000000".slice(e.length)+e}});function mt(){let i=new DataView(new ArrayBuffer(8));if(typeof BigInt=="function"&&typeof i.getBigInt64=="function"&&typeof i.getBigUint64=="function"&&typeof i.setBigInt64=="function"&&typeof i.setBigUint64=="function"&&(!!globalThis.Deno||typeof process!="object"||typeof process.env!="object"||process.env.BUF_BIGINT_DISABLE!=="1")){let t=BigInt("-9223372036854775808"),n=BigInt("9223372036854775807"),r=BigInt("0"),o=BigInt("18446744073709551615");return{zero:BigInt(0),supported:!0,parse(s){let d=typeof s=="bigint"?s:BigInt(s);if(d>n||d<t)throw new Error(`invalid int64: ${s}`);return d},uParse(s){let d=typeof s=="bigint"?s:BigInt(s);if(d>o||d<r)throw new Error(`invalid uint64: ${s}`);return d},enc(s){return i.setBigInt64(0,this.parse(s),!0),{lo:i.getInt32(0,!0),hi:i.getInt32(4,!0)}},uEnc(s){return i.setBigInt64(0,this.uParse(s),!0),{lo:i.getInt32(0,!0),hi:i.getInt32(4,!0)}},dec(s,d){return i.setInt32(0,s,!0),i.setInt32(4,d,!0),i.getBigInt64(0,!0)},uDec(s,d){return i.setInt32(0,s,!0),i.setInt32(4,d,!0),i.getBigUint64(0,!0)}}}return{zero:"0",supported:!1,parse(t){return typeof t!="string"&&(t=t.toString()),xe(t),t},uParse(t){return typeof t!="string"&&(t=t.toString()),ke(t),t},enc(t){return typeof t!="string"&&(t=t.toString()),xe(t),ie(t)},uEnc(t){return typeof t!="string"&&(t=t.toString()),ke(t),ie(t)},dec(t,n){return Ce(t,n)},uDec(t,n){return re(t,n)}}}function xe(i){if(!/^-?[0-9]+$/.test(i))throw new Error("invalid int64: "+i)}function ke(i){if(!/^[0-9]+$/.test(i))throw new Error("invalid uint64: "+i)}var D,De=B(()=>{"use strict";de();D=mt()});function ce(){if(globalThis[ae]==null){let i=new globalThis.TextEncoder,e=new globalThis.TextDecoder;globalThis[ae]={encodeUtf8(t){return i.encode(t)},decodeUtf8(t){return e.decode(t)},checkUtf8(t){try{return encodeURIComponent(t),!0}catch{return!1}}}}return globalThis[ae]}var ae,le=B(()=>{"use strict";ae=Symbol.for("@bufbuild/protobuf/text-encoding")});function ue(i){if(typeof i=="string")i=Number(i);else if(typeof i!="number")throw new Error("invalid int32: "+typeof i);if(!Number.isInteger(i)||i>Tt||i<wt)throw new Error("invalid int32: "+i)}function Oe(i){if(typeof i=="string")i=Number(i);else if(typeof i!="number")throw new Error("invalid uint32: "+typeof i);if(!Number.isInteger(i)||i>Et||i<0)throw new Error("invalid uint32: "+i)}function At(i){if(typeof i=="string"){let e=i;if(i=Number(i),Number.isNaN(i)&&e!=="NaN")throw new Error("invalid float32: "+e)}else if(typeof i!="number")throw new Error("invalid float32: "+typeof i);if(Number.isFinite(i)&&(i>It||i<vt))throw new Error("invalid float32: "+i)}var P,It,vt,Et,Tt,wt,V,C,Ue=B(()=>{"use strict";de();De();le();(function(i){i[i.Varint=0]="Varint",i[i.Bit64=1]="Bit64",i[i.LengthDelimited=2]="LengthDelimited",i[i.StartGroup=3]="StartGroup",i[i.EndGroup=4]="EndGroup",i[i.Bit32=5]="Bit32"})(P||(P={}));It=34028234663852886e22,vt=-34028234663852886e22,Et=4294967295,Tt=2147483647,wt=-2147483648,V=class{constructor(e=ce().encodeUtf8){this.encodeUtf8=e,this.stack=[],this.chunks=[],this.buf=[]}finish(){this.buf.length&&(this.chunks.push(new Uint8Array(this.buf)),this.buf=[]);let e=0;for(let r=0;r<this.chunks.length;r++)e+=this.chunks[r].length;let t=new Uint8Array(e),n=0;for(let r=0;r<this.chunks.length;r++)t.set(this.chunks[r],n),n+=this.chunks[r].length;return this.chunks=[],t}fork(){return this.stack.push({chunks:this.chunks,buf:this.buf}),this.chunks=[],this.buf=[],this}join(){let e=this.finish(),t=this.stack.pop();if(!t)throw new Error("invalid state, fork stack empty");return this.chunks=t.chunks,this.buf=t.buf,this.uint32(e.byteLength),this.raw(e)}tag(e,t){return this.uint32((e<<3|t)>>>0)}raw(e){return this.buf.length&&(this.chunks.push(new Uint8Array(this.buf)),this.buf=[]),this.chunks.push(e),this}uint32(e){for(Oe(e);e>127;)this.buf.push(e&127|128),e=e>>>7;return this.buf.push(e),this}int32(e){return ue(e),se(e,this.buf),this}bool(e){return this.buf.push(e?1:0),this}bytes(e){return this.uint32(e.byteLength),this.raw(e)}string(e){let t=this.encodeUtf8(e);return this.uint32(t.byteLength),this.raw(t)}float(e){At(e);let t=new Uint8Array(4);return new DataView(t.buffer).setFloat32(0,e,!0),this.raw(t)}double(e){let t=new Uint8Array(8);return new DataView(t.buffer).setFloat64(0,e,!0),this.raw(t)}fixed32(e){Oe(e);let t=new Uint8Array(4);return new DataView(t.buffer).setUint32(0,e,!0),this.raw(t)}sfixed32(e){ue(e);let t=new Uint8Array(4);return new DataView(t.buffer).setInt32(0,e,!0),this.raw(t)}sint32(e){return ue(e),e=(e<<1^e>>31)>>>0,se(e,this.buf),this}sfixed64(e){let t=new Uint8Array(8),n=new DataView(t.buffer),r=D.enc(e);return n.setInt32(0,r.lo,!0),n.setInt32(4,r.hi,!0),this.raw(t)}fixed64(e){let t=new Uint8Array(8),n=new DataView(t.buffer),r=D.uEnc(e);return n.setInt32(0,r.lo,!0),n.setInt32(4,r.hi,!0),this.raw(t)}int64(e){let t=D.enc(e);return Q(t.lo,t.hi,this.buf),this}sint64(e){let t=D.enc(e),n=t.hi>>31,r=t.lo<<1^n,o=(t.hi<<1|t.lo>>>31)^n;return Q(r,o,this.buf),this}uint64(e){let t=D.uEnc(e);return Q(t.lo,t.hi,this.buf),this}},C=class{constructor(e,t=ce().decodeUtf8){this.decodeUtf8=t,this.varint64=Be,this.uint32=Le,this.buf=e,this.len=e.length,this.pos=0,this.view=new DataView(e.buffer,e.byteOffset,e.byteLength)}tag(){let e=this.uint32(),t=e>>>3,n=e&7;if(t<=0||n<0||n>5)throw new Error("illegal tag: field no "+t+" wire type "+n);return[t,n]}skip(e,t){let n=this.pos;switch(e){case P.Varint:for(;this.buf[this.pos++]&128;);break;case P.Bit64:this.pos+=4;case P.Bit32:this.pos+=4;break;case P.LengthDelimited:let r=this.uint32();this.pos+=r;break;case P.StartGroup:for(;;){let[o,s]=this.tag();if(s===P.EndGroup){if(t!==void 0&&o!==t)throw new Error("invalid end group tag");break}this.skip(s,o)}break;default:throw new Error("cant skip wire type "+e)}return this.assertBounds(),this.buf.subarray(n,this.pos)}assertBounds(){if(this.pos>this.len)throw new RangeError("premature EOF")}int32(){return this.uint32()|0}sint32(){let e=this.uint32();return e>>>1^-(e&1)}int64(){return D.dec(...this.varint64())}uint64(){return D.uDec(...this.varint64())}sint64(){let[e,t]=this.varint64(),n=-(e&1);return e=(e>>>1|(t&1)<<31)^n,t=t>>>1^n,D.dec(e,t)}bool(){let[e,t]=this.varint64();return e!==0||t!==0}fixed32(){return this.view.getUint32((this.pos+=4)-4,!0)}sfixed32(){return this.view.getInt32((this.pos+=4)-4,!0)}fixed64(){return D.uDec(this.sfixed32(),this.sfixed32())}sfixed64(){return D.dec(this.sfixed32(),this.sfixed32())}float(){return this.view.getFloat32((this.pos+=4)-4,!0)}double(){return this.view.getFloat64((this.pos+=8)-8,!0)}bytes(){let e=this.uint32(),t=this.pos;return this.pos+=e,this.assertBounds(),this.buf.subarray(t,t+e)}string(){return this.decodeUtf8(this.bytes())}}});var Me=B(()=>{"use strict"});var Ne=B(()=>{"use strict"});var Pe=B(()=>{"use strict"});var Ve=B(()=>{"use strict";Ue();Me();le();Ne();Pe()});function Rt(){return{propertyId:new Uint8Array(0),pageviewId:new Uint8Array(0),sessionId:new Uint8Array(0),pageUrl:"",country:"",region:"",deviceType:"",userId:new Uint8Array(0),domain:"",events:[],browser:"",deviceManufacturer:"",deviceModel:"",city:"",postalCode:""}}function _t(){return{timestampMs:0,type:0,eventName:"",auctionId:new Uint8Array(0),transactionId:new Uint8Array(0),adUnitCode:"",bid:void 0,namespace:"",eventId:new Uint8Array(0),metadata:{},viewableDurationMs:void 0,bidderOutcomes:[]}}function Bt(){return{key:"",value:""}}function Ct(){return{adUnitCode:"",outcome:0,bid:void 0}}function St(){return{bidder:"",cpm:0,currency:"",width:0,height:0,dealId:"",mediaType:"",latencyMs:0,advertiserDomain:"",creativeId:""}}var m,U,fe,Fe,$e,We,Z,he=B(()=>{"use strict";Ve();m={TRACE_EVENT_TYPE_UNSPECIFIED:0,AUCTION_START:1,AUCTION_END:2,BID_WIN:4,IMPRESSION:5,VIEWABLE:6,TIME_IN_VIEW:7,REFRESH:8,ERROR:9,SLOT_DEFINED:10,SLOT_DESTROYED:11,CLICK:12,AD_RENDER_FAILED:13,UNRECOGNIZED:-1},U={BIDDER_OUTCOME_UNSPECIFIED:0,BIDDER_OUTCOME_BID:1,BIDDER_OUTCOME_NO_BID:2,BIDDER_OUTCOME_TIMEOUT:3,BIDDER_OUTCOME_ERROR:4,BIDDER_OUTCOME_NO_RESPONSE:5,UNRECOGNIZED:-1};fe={encode(i,e=new V){if(i.propertyId!==void 0&&i.propertyId.length!==0&&e.uint32(10).bytes(i.propertyId),i.pageviewId!==void 0&&i.pageviewId.length!==0&&e.uint32(18).bytes(i.pageviewId),i.sessionId!==void 0&&i.sessionId.length!==0&&e.uint32(26).bytes(i.sessionId),i.pageUrl!==void 0&&i.pageUrl!==""&&e.uint32(34).string(i.pageUrl),i.country!==void 0&&i.country!==""&&e.uint32(42).string(i.country),i.region!==void 0&&i.region!==""&&e.uint32(50).string(i.region),i.deviceType!==void 0&&i.deviceType!==""&&e.uint32(58).string(i.deviceType),i.userId!==void 0&&i.userId.length!==0&&e.uint32(66).bytes(i.userId),i.domain!==void 0&&i.domain!==""&&e.uint32(74).string(i.domain),i.events!==void 0&&i.events.length!==0)for(let t of i.events)Fe.encode(t,e.uint32(82).fork()).join();return i.browser!==void 0&&i.browser!==""&&e.uint32(90).string(i.browser),i.deviceManufacturer!==void 0&&i.deviceManufacturer!==""&&e.uint32(98).string(i.deviceManufacturer),i.deviceModel!==void 0&&i.deviceModel!==""&&e.uint32(106).string(i.deviceModel),i.city!==void 0&&i.city!==""&&e.uint32(114).string(i.city),i.postalCode!==void 0&&i.postalCode!==""&&e.uint32(122).string(i.postalCode),e},decode(i,e){let t=i instanceof C?i:new C(i),n=e===void 0?t.len:t.pos+e,r=Rt();for(;t.pos<n;){let o=t.uint32();switch(o>>>3){case 1:{if(o!==10)break;r.propertyId=t.bytes();continue}case 2:{if(o!==18)break;r.pageviewId=t.bytes();continue}case 3:{if(o!==26)break;r.sessionId=t.bytes();continue}case 4:{if(o!==34)break;r.pageUrl=t.string();continue}case 5:{if(o!==42)break;r.country=t.string();continue}case 6:{if(o!==50)break;r.region=t.string();continue}case 7:{if(o!==58)break;r.deviceType=t.string();continue}case 8:{if(o!==66)break;r.userId=t.bytes();continue}case 9:{if(o!==74)break;r.domain=t.string();continue}case 10:{if(o!==82)break;let s=Fe.decode(t,t.uint32());s!==void 0&&r.events.push(s);continue}case 11:{if(o!==90)break;r.browser=t.string();continue}case 12:{if(o!==98)break;r.deviceManufacturer=t.string();continue}case 13:{if(o!==106)break;r.deviceModel=t.string();continue}case 14:{if(o!==114)break;r.city=t.string();continue}case 15:{if(o!==122)break;r.postalCode=t.string();continue}}if((o&7)===4||o===0)break;t.skip(o&7)}return r}};Fe={encode(i,e=new V){if(i.timestampMs!==void 0&&i.timestampMs!==0&&e.uint32(9).double(i.timestampMs),i.type!==void 0&&i.type!==0&&e.uint32(16).int32(i.type),i.eventName!==void 0&&i.eventName!==""&&e.uint32(26).string(i.eventName),i.auctionId!==void 0&&i.auctionId.length!==0&&e.uint32(34).bytes(i.auctionId),i.transactionId!==void 0&&i.transactionId.length!==0&&e.uint32(42).bytes(i.transactionId),i.adUnitCode!==void 0&&i.adUnitCode!==""&&e.uint32(50).string(i.adUnitCode),i.bid!==void 0&&Z.encode(i.bid,e.uint32(58).fork()).join(),i.namespace!==void 0&&i.namespace!==""&&e.uint32(66).string(i.namespace),i.eventId!==void 0&&i.eventId.length!==0&&e.uint32(74).bytes(i.eventId),globalThis.Object.entries(i.metadata||{}).forEach(([t,n])=>{$e.encode({key:t,value:n},e.uint32(82).fork()).join()}),i.viewableDurationMs!==void 0&&e.uint32(89).double(i.viewableDurationMs),i.bidderOutcomes!==void 0&&i.bidderOutcomes.length!==0)for(let t of i.bidderOutcomes)We.encode(t,e.uint32(98).fork()).join();return e},decode(i,e){let t=i instanceof C?i:new C(i),n=e===void 0?t.len:t.pos+e,r=_t();for(;t.pos<n;){let o=t.uint32();switch(o>>>3){case 1:{if(o!==9)break;r.timestampMs=t.double();continue}case 2:{if(o!==16)break;r.type=t.int32();continue}case 3:{if(o!==26)break;r.eventName=t.string();continue}case 4:{if(o!==34)break;r.auctionId=t.bytes();continue}case 5:{if(o!==42)break;r.transactionId=t.bytes();continue}case 6:{if(o!==50)break;r.adUnitCode=t.string();continue}case 7:{if(o!==58)break;r.bid=Z.decode(t,t.uint32());continue}case 8:{if(o!==66)break;r.namespace=t.string();continue}case 9:{if(o!==74)break;r.eventId=t.bytes();continue}case 10:{if(o!==82)break;let s=$e.decode(t,t.uint32());s.value!==void 0&&(r.metadata[s.key]=s.value);continue}case 11:{if(o!==89)break;r.viewableDurationMs=t.double();continue}case 12:{if(o!==98)break;let s=We.decode(t,t.uint32());s!==void 0&&r.bidderOutcomes.push(s);continue}}if((o&7)===4||o===0)break;t.skip(o&7)}return r}};$e={encode(i,e=new V){return i.key!==""&&e.uint32(10).string(i.key),i.value!==""&&e.uint32(18).string(i.value),e},decode(i,e){let t=i instanceof C?i:new C(i),n=e===void 0?t.len:t.pos+e,r=Bt();for(;t.pos<n;){let o=t.uint32();switch(o>>>3){case 1:{if(o!==10)break;r.key=t.string();continue}case 2:{if(o!==18)break;r.value=t.string();continue}}if((o&7)===4||o===0)break;t.skip(o&7)}return r}};We={encode(i,e=new V){return i.adUnitCode!==void 0&&i.adUnitCode!==""&&e.uint32(18).string(i.adUnitCode),i.outcome!==void 0&&i.outcome!==0&&e.uint32(32).int32(i.outcome),i.bid!==void 0&&Z.encode(i.bid,e.uint32(50).fork()).join(),e},decode(i,e){let t=i instanceof C?i:new C(i),n=e===void 0?t.len:t.pos+e,r=Ct();for(;t.pos<n;){let o=t.uint32();switch(o>>>3){case 2:{if(o!==18)break;r.adUnitCode=t.string();continue}case 4:{if(o!==32)break;r.outcome=t.int32();continue}case 6:{if(o!==50)break;r.bid=Z.decode(t,t.uint32());continue}}if((o&7)===4||o===0)break;t.skip(o&7)}return r}};Z={encode(i,e=new V){return i.bidder!==void 0&&i.bidder!==""&&e.uint32(10).string(i.bidder),i.cpm!==void 0&&i.cpm!==0&&e.uint32(17).double(i.cpm),i.currency!==void 0&&i.currency!==""&&e.uint32(26).string(i.currency),i.width!==void 0&&i.width!==0&&e.uint32(32).int32(i.width),i.height!==void 0&&i.height!==0&&e.uint32(40).int32(i.height),i.dealId!==void 0&&i.dealId!==""&&e.uint32(50).string(i.dealId),i.mediaType!==void 0&&i.mediaType!==""&&e.uint32(58).string(i.mediaType),i.latencyMs!==void 0&&i.latencyMs!==0&&e.uint32(65).double(i.latencyMs),i.advertiserDomain!==void 0&&i.advertiserDomain!==""&&e.uint32(74).string(i.advertiserDomain),i.creativeId!==void 0&&i.creativeId!==""&&e.uint32(82).string(i.creativeId),e},decode(i,e){let t=i instanceof C?i:new C(i),n=e===void 0?t.len:t.pos+e,r=St();for(;t.pos<n;){let o=t.uint32();switch(o>>>3){case 1:{if(o!==10)break;r.bidder=t.string();continue}case 2:{if(o!==17)break;r.cpm=t.double();continue}case 3:{if(o!==26)break;r.currency=t.string();continue}case 4:{if(o!==32)break;r.width=t.int32();continue}case 5:{if(o!==40)break;r.height=t.int32();continue}case 6:{if(o!==50)break;r.dealId=t.string();continue}case 7:{if(o!==58)break;r.mediaType=t.string();continue}case 8:{if(o!==65)break;r.latencyMs=t.double();continue}case 9:{if(o!==74)break;r.advertiserDomain=t.string();continue}case 10:{if(o!==82)break;r.creativeId=t.string();continue}}if((o&7)===4||o===0)break;t.skip(o&7)}return r}}});function F(i){if(!i)return new Uint8Array(0);if(Lt.test(i)){let t=i.replace(/-/g,""),n=new Uint8Array(16);for(let r=0;r<16;r++)n[r]=parseInt(t.slice(r*2,r*2+2),16);return n}if(qe)return qe.encode(i);let e=new Uint8Array(i.length);for(let t=0;t<i.length;t++)e[t]=i.charCodeAt(t)&255;return e}var Lt,qe,Sn,He=B(()=>{"use strict";Lt=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/,qe=typeof TextEncoder<"u"?new TextEncoder:null,Sn=typeof TextDecoder<"u"?new TextDecoder:null});function q(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,i=>{let e=Math.random()*16|0;return(i==="x"?e:e&3|8).toString(16)})}function Ht(i){let e="";for(let n=0;n<i.length;n+=8192)e+=String.fromCharCode(...i.subarray(n,n+8192));return btoa(e)}function Gt(i){let e=atob(i),t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n);return t}function Kt(i){if(!i)return!1;let e;try{e=new URL(i)}catch{return!1}return e.username||e.password?!1:e.protocol==="https:"?!0:e.protocol==="http:"?e.hostname==="localhost"||e.hostname==="127.0.0.1"||e.hostname==="[::1]":!1}function Yt(i){let e={},t=0;for(let n of Object.keys(i)){if(t>=Ot)break;let r=i[n];if(r==null)continue;let o=String(r);e[n]=o.length>Ke?`${o.slice(0,Ke)}...[truncated]`:o,t++}return e}function zt(i){let e=i.slice(J.length).split("_");return e.length===2&&/^\d+$/.test(e[0])}function Xt(i,e){if(!i||!e)return!1;try{return new URL(i).origin===new URL(e).origin}catch{return!1}}function ge(i){try{typeof localStorage<"u"&&(localStorage.setItem(Qe,i.toString()),Ie=i)}catch{}}function Xe(){let i=Date.now();M=i,Y&&(i-Ie<Qt||ge(i))}function Zt(){let i=Date.now(),e=!!$&&!!M&&i-M<=ye;try{if(Y&&typeof localStorage<"u"){let t=localStorage.getItem(ze),n=localStorage.getItem(Qe),r=n&&parseInt(n,10)||0;if(t&&r&&i-r<=ye)return ge(i),$=t,M=i,t;let o=e?$:q();return localStorage.setItem(ze,o),ge(i),$=o,M=i,o}}catch{}return $&&M&&i-M<=ye?(M=i,$):($=q(),M=i,$)}function f(i){return String(i??"").replace(/%/g,"%25").replace(/:/g,"%3A")}function Jt(i,e){switch(i){case"auctionInit":return`auctionInit:${f(e?.auctionId)}`;case"auctionEnd":return`auctionEnd:${f(e?.auctionId)}`;case"bidRequested":{let t=Array.isArray(e?.bids)?e.bids.map(n=>f(n?.bidId||n?.transactionId||n?.adUnitCode)).join(","):"";return`bidRequested:${f(e?.auctionId)}:${f(e?.bidderCode||e?.bidder)}:${t}`}case"bidResponse":{let t=e||{},n=t.creativeId||t.adId||t.requestId||t.bidId||"",r=t.originalCpm??t.cpm??"";return`bidResponse:${f(t.auctionId)}:${f(t.adUnitCode)}:${f(t.bidderCode||t.bidder)}:${f(n)}:${f(r)}`}case"bidTimeout":return"bidTimeout:"+(Array.isArray(e)?e:e?[e]:[]).map(n=>`${f(n?.auctionId)}:${f(n?.bidderCode||n?.bidder)}:${f(n?.bidId||n?.transactionId||n?.adUnitCode)}`).join(",");case"bidWon":{let t=e||{},n=t.creativeId||t.adId||t.requestId||t.bidId||"",r=t.originalCpm??t.cpm??"";return`bidWon:${f(t.auctionId)}:${f(t.adUnitCode)}:${f(t.bidderCode||t.bidder)}:${f(n)}:${f(r)}`}case"noBid":return`noBid:${f(e?.auctionId)}:${f(e?.adUnitCode)}:${f(e?.bidderCode||e?.bidder)}:${f(e?.bidId||e?.transactionId)}`;case"adRenderFailed":{let t=e?.bid||{};return`adRenderFailed:${f(t.auctionId||e?.auctionId)}:${f(t.adUnitCode||e?.adUnitCode)}:${f(t.bidderCode||t.bidder||e?.bidderCode||e?.bidder)}:${f(e?.reason)}:${f(e?.message)}`}case"adRenderSucceeded":{let t=e?.bid||e||{},n=t.creativeId||t.adId||e?.adId||"",r=t.originalCpm??t.cpm??"";return`adRenderSucceeded:${f(t.auctionId||e?.auctionId)}:${f(t.adUnitCode||e?.adUnitCode)}:${f(t.bidderCode||t.bidder)}:${f(n)}:${f(r)}`}case"setTargeting":return`setTargeting:${Object.keys(e||{}).sort().map(f).join(",")}`;case"auctionDebug":return`auctionDebug:${f(e?.type)}:${f(String(e?.arguments?.[0]??"").slice(0,50))}`;default:return""}}function W(i){if(Number.isFinite(i?.width)&&Number.isFinite(i?.height))return{width:i.width,height:i.height};if(typeof i?.size=="string"){let e=i.size.match(/^(\d+)x(\d+)$/);if(e)return{width:Number(e[1]),height:Number(e[2])}}return{width:Number.isFinite(i?.width)?i.width:0,height:Number.isFinite(i?.height)?i.height:0}}function H(i,e=!0){if(!i)return null;if(Array.isArray(i)){let t=i.find(n=>n?.provider==="bidkernel")??(e?i.find(n=>n&&typeof n=="object"&&n.provider===void 0):void 0);return t?H(t,e):null}if(typeof i=="object"){if(i.options&&typeof i.options=="object")return i.options;if(i.config&&typeof i.config=="object")return i.config;if(i.propertyId||i.endpoint)return i}return null}function en(i){if(!i)return null;if(i._bidkernelAnalyticsConfig){let e=H(i._bidkernelAnalyticsConfig);if(e)return e}if(i.bidkernelPrebidAnalytics){let e=i.bidkernelPrebidAnalytics;if(e.options){let t=H(e.options);if(t)return t}if(e.config){let t=H(e.config);if(t)return t}if(e.propertyId)return H(e)}return null}function ve(i="pbjs",e){let t=typeof window<"u"?window:{};t[i]=t[i]||{};let n=t[i],r=s=>{let d=t._bidkernelPrebidAnalytics,a=d?.getEndpoint?.()||"",l={pbjsGlobalName:i,...e,...s};if(a&&!Xt(l.endpoint||"",a)&&(be.warn(`Ignoring analytics endpoint change to ${l.endpoint||"(empty)"}: this page is pinned to ${a}. Reload to change the ingest endpoint.`),l.endpoint=a),d)try{d.disable()}catch(y){be.warn("Failed to disable previous analytics instance:",y)}let c=new S(l);return c.enable(),t._bidkernelPrebidAnalytics=c,c},o=()=>{try{n.adapterManager&&typeof n.adapterManager.registerAnalyticsAdapter=="function"&&n.adapterManager.registerAnalyticsAdapter({adapter:{enableAnalytics:d=>{let a=H(d,!Array.isArray(d));a&&r(a)},disableAnalytics:()=>{t._bidkernelPrebidAnalytics&&t._bidkernelPrebidAnalytics.disable()}},code:"bidkernel"});let s=en(t);s&&(s.propertyId||e?.propertyId)&&r(s)}catch(s){be.warn("Failed to register standard Prebid analytics adapter:",s)}};n.adapterManager&&typeof n.adapterManager.registerAnalyticsAdapter=="function"?o():(n.que=n.que||[],n.que.push(o))}var Ge,xt,K,kt,Dt,pe,Ke,Ot,Ye,J,Ut,Mt,Nt,Pt,Vt,Ft,j,$t,Wt,jt,qt,ze,Qe,ye,$,M,Y,Qt,Ie,me,S,be,Ee=B(()=>{"use strict";Re();he();He();Ge=1e4,xt=50,K=200,kt=300*1e3,Dt=10,pe=32*1024,Ke=1024,Ot=16,Ye="text/plain",J="_bidkernel_pending_",Ut=20,Mt=7200*1e3,Nt=1e4,Pt={auctionStart:m.AUCTION_START,auctionEnd:m.AUCTION_END,bidWin:m.BID_WIN,adRenderFailed:m.AD_RENDER_FAILED,click:m.CLICK,impression:m.IMPRESSION,refresh:m.REFRESH,timeInView:m.TIME_IN_VIEW,viewable:m.VIEWABLE},Vt=3e3,Ft=new Set([m.IMPRESSION,m.BID_WIN,m.CLICK]),j=1800*1e3,$t=200,Wt=1e3,jt=50,qt=1e3,ze="_bidkernel_session",Qe="_bidkernel_session_ts",ye=1800*1e3,$=null,M=0,Y=!0;Qt=60*1e3,Ie=0;me=class{seenObjects=new WeakMap;seenKeys=new Set;isDuplicate(e,t){if(!t)return!1;if(typeof t=="object"){let r=this.seenObjects.get(t);if(r){if(r.has(e))return!0;r.add(e)}else this.seenObjects.set(t,new Set([e]))}let n=Jt(e,t);if(n){if(this.seenKeys.has(n))return!0;if(this.seenKeys.size>=1e3){let r=this.seenKeys.values().next().value;r!==void 0&&this.seenKeys.delete(r)}this.seenKeys.add(n)}return!1}};S=class i{static activeInstances=new Set;static getActiveInstances(){return i.activeInstances}static setStorageAllowed(e){Y=e,Ie=0}static isStorageAllowed(){return Y}config;queue=[];errorCount=0;flushTimer=null;boundFlushBeacon;boundVisibilityChange;isEnabled=!1;boundPbjsHandlers=[];pageUrl="";deduper=new me;consecutiveSendFailures=0;nextSendAllowedAt=0;replayedEventCount=0;revenueFlushTimer=null;persistedBatchKeys=[];persistedCleanupTimer=null;intersectionObserver=null;slotViewabilityRecords=new Map;elementToSlotId=new Map;slotRefreshIndices=new Map;slotLastAuctionIds=new Map;pendingThresholdListeners=new Map;pendingViewableListeners=new Map;slotElements=new Map;clickDetachCleanups=new Set;lastClickAt=new Map;slotEmittedImpressionKeys=new Set;cachedWinningBids=new Map;videoDetachCleanups=new Set;auctionBidderOutcomes=new Map;logger;constructor(e){e.storageAllowed!==void 0&&i.setStorageAllowed(e.storageAllowed);let t=e.endpoint||"",n=!t||Kt(t)?t:"";this.config={endpoint:n,propertyId:e.propertyId||"",pageviewId:e.pageviewId||q(),sessionId:e.sessionId||Zt(),userId:e.userId||"",deviceType:e.deviceType||"desktop",country:e.country||"",region:e.region||"",auctionEnabled:e.auctionEnabled??!0,warningsEnabled:e.warningsEnabled??!0,errorsEnabled:e.errorsEnabled??!0,viewabilityEnabled:e.viewabilityEnabled??!0,storageAllowed:e.storageAllowed??!0,logLevel:e.logLevel||"INFO",pbjsGlobalName:e.pbjsGlobalName||"pbjs",attachPbjsListeners:e.attachPbjsListeners??!0,revenueFlushDelayMs:Number.isFinite(e.revenueFlushDelayMs)&&e.revenueFlushDelayMs>=0?e.revenueFlushDelayMs:Vt},this.logger=ne({prefix:"[bidkernel][prebid-analytics]",logLevel:this.config.logLevel}),t&&!n&&this.log("ERROR",`Rejected untrusted analytics endpoint ${t}: must be an absolute https:// URL without embedded credentials. Events will not be transmitted.`),this.boundFlushBeacon=()=>{this.flushAllSlotsTimeInView(),this.flushBeacon()},this.boundVisibilityChange=()=>this.handleVisibilityChange()}enable(){if(!this.isEnabled){if(this.isEnabled=!0,i.activeInstances.add(this),this.logger.setLevel(this.config.logLevel),this.config.endpoint||this.log("WARN","Endpoint is empty. Analytics events will not be transmitted."),this.config.viewabilityEnabled&&typeof IntersectionObserver<"u"){this.intersectionObserver=new IntersectionObserver(this.handleIntersection.bind(this),{threshold:[.5]});for(let e of this.slotViewabilityRecords.values())e.element&&this.intersectionObserver.observe(e.element)}if(this.config.attachPbjsListeners&&this.attachPbjs(),typeof window<"u"){if(!this.pageUrl)try{let e=new URL(window.location.href);this.pageUrl=e.origin+e.pathname}catch{this.pageUrl=window.location.href}window.addEventListener("pagehide",this.boundFlushBeacon),typeof document<"u"&&document.addEventListener("visibilitychange",this.boundVisibilityChange),this.flushTimer=setInterval(()=>this.flush(),Ge),this.resendPersistedBatches()}}}attachPbjs(){if(!this.isEnabled)return!1;if(this.boundPbjsHandlers.length>0)return!0;let t=(typeof window<"u"?window:{})[this.config.pbjsGlobalName]||{};if(typeof t.onEvent!="function")return this.log("WARN","pbjs.onEvent is not defined. Prebid analytics will not function."),!1;this.log("DEBUG","Attaching event listeners to pbjs");let n={auctionInit:this.handleAuctionInit.bind(this),auctionEnd:this.handleAuctionEnd.bind(this),bidRequested:this.handleBidRequested.bind(this),bidResponse:this.handleBidResponse.bind(this),bidTimeout:this.handleBidTimeout.bind(this),bidWon:this.handleBidWon.bind(this),noBid:this.handleNoBid.bind(this),adRenderFailed:this.handleAdRenderFailed.bind(this),adRenderSucceeded:this.handleAdRenderSucceeded.bind(this)};for(let[r,o]of Object.entries(n))t.onEvent(r,o),this.boundPbjsHandlers.push({event:r,handler:o});if(typeof t.getEvents=="function")try{let r=t.getEvents();if(Array.isArray(r)){let o=r.slice(this.replayedEventCount);if(this.replayedEventCount=r.length,o.length>0){this.log("DEBUG",`Replaying ${o.length} historical events from pbjs.getEvents()`);for(let s of o){if(!s)continue;let d=s.eventType||s.event||s.name,a=s.args!==void 0?s.args:s.data!==void 0?s.data:s,l=n[d];l&&l(a)}}}}catch(r){this.log("WARN","Failed to replay historical events from pbjs.getEvents()",r)}return!0}disable(){if(this.isEnabled){this.flushAllSlotsTimeInView(),this.isEnabled=!1,i.activeInstances.delete(this);for(let e of this.slotViewabilityRecords.values()){e.dwellTimer&&(clearTimeout(e.dwellTimer),e.dwellTimer=null,e.dwellStartedAt=null);for(let t of e.thresholdListeners)t.timer&&(clearTimeout(t.timer),t.timer=null)}this.intersectionObserver&&(this.intersectionObserver.disconnect(),this.intersectionObserver=null),this.slotViewabilityRecords.clear(),this.elementToSlotId.clear();for(let e of this.videoDetachCleanups)try{e()}catch{}this.videoDetachCleanups.clear();for(let e of Array.from(this.clickDetachCleanups))try{e()}catch{}if(this.clickDetachCleanups.clear(),this.slotElements.clear(),this.cachedWinningBids.clear(),this.slotEmittedImpressionKeys.clear(),this.slotLastAuctionIds.clear(),this.auctionBidderOutcomes.clear(),this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),this.revenueFlushTimer&&(clearTimeout(this.revenueFlushTimer),this.revenueFlushTimer=null),this.persistedCleanupTimer&&(clearTimeout(this.persistedCleanupTimer),this.persistedCleanupTimer=null),typeof window<"u"&&(window.removeEventListener("pagehide",this.boundFlushBeacon),typeof document<"u"&&document.removeEventListener("visibilitychange",this.boundVisibilityChange)),this.boundPbjsHandlers.length>0){let t=(typeof window<"u"?window:{})[this.config.pbjsGlobalName]||{};if(typeof t.offEvent=="function")for(let{event:n,handler:r}of this.boundPbjsHandlers)t.offEvent(n,r);this.boundPbjsHandlers=[]}this.flush()}}handleVisibilityChange(){if(!(typeof document>"u")){if(document.visibilityState==="hidden"){let e=typeof performance<"u"&&performance.now?performance.now():Date.now();for(let t of this.slotViewabilityRecords.values()){t.inView&&t.lastEnteredViewAt!==null&&(t.accumulatedTimeInViewMs+=Math.max(0,e-t.lastEnteredViewAt),t.lastEnteredViewAt=null,this.checkThresholdListeners(t)),t.dwellTimer&&(clearTimeout(t.dwellTimer),t.dwellTimer=null,t.dwellStartedAt=null);for(let r of t.thresholdListeners)r.timer&&(clearTimeout(r.timer),r.timer=null);let n=Math.round(t.accumulatedTimeInViewMs);n>0&&this.enqueue(m.TIME_IN_VIEW,"timeInView",{auctionId:t.auctionId,transactionId:t.transactionId,adUnitCode:t.adUnitCode,viewableDurationMs:n,bid:t.bidPayload,metadata:{...t.metadata,refresh_index:String(t.refreshIndex)}})}this.flushBeacon()}else if(document.visibilityState==="visible"){let e=typeof performance<"u"&&performance.now?performance.now():Date.now();for(let t of this.slotViewabilityRecords.values())if(t.inView){if(t.lastEnteredViewAt=e,!t.viewableFired&&t.dwellTimer===null){let n=t.mediaType==="video"?2e3:1e3;t.dwellStartedAt=e,t.dwellTimer=setTimeout(()=>{this.handleDwellComplete(t)},n)}this.scheduleThresholdTimers(t)}}}}handleIntersection(e){for(let t of e){let n=this.elementToSlotId.get(t.target);if(!n){for(let a of i.activeInstances)if(a!==this&&a.elementToSlotId.has(t.target)){a.handleIntersection([t]);break}continue}let r=this.slotViewabilityRecords.get(n);if(!r)continue;let o=t.isIntersecting&&(t.intersectionRatio===void 0||t.intersectionRatio>=.5),s=typeof document>"u"||document.visibilityState==="visible",d=typeof performance<"u"&&performance.now?performance.now():Date.now();if(o){if(!r.inView&&(r.inView=!0,s)){if(r.lastEnteredViewAt=d,!r.viewableFired&&r.dwellTimer===null){let a=r.mediaType==="video"?2e3:1e3;r.dwellStartedAt=d,r.dwellTimer=setTimeout(()=>{this.handleDwellComplete(r)},a)}this.scheduleThresholdTimers(r)}}else{r.inView&&(r.lastEnteredViewAt!==null&&(r.accumulatedTimeInViewMs+=Math.max(0,d-r.lastEnteredViewAt),r.lastEnteredViewAt=null),r.inView=!1,this.checkThresholdListeners(r)),r.dwellTimer!==null&&(clearTimeout(r.dwellTimer),r.dwellTimer=null,r.dwellStartedAt=null);for(let a of r.thresholdListeners)a.timer&&(clearTimeout(a.timer),a.timer=null)}}}handleDwellComplete(e){e.dwellTimer=null,e.dwellStartedAt=null,e.inView&&(typeof document<"u"&&document.visibilityState==="hidden"||(e.viewableFired||(e.viewableFired=!0,this.enqueue(m.VIEWABLE,"viewable",{auctionId:e.auctionId,transactionId:e.transactionId,adUnitCode:e.adUnitCode,bid:e.bidPayload,metadata:{...e.metadata,refresh_index:String(e.refreshIndex)}})),this.notifyViewable(e)))}notifyViewable(e){if(e.viewableFired){for(let t of e.viewableListeners)if(t.firedForIndex!==e.refreshIndex){t.firedForIndex=e.refreshIndex;try{t.callback(e.slotId)}catch(n){this.log("ERROR","Error in viewable listener callback",n)}}}}setSlotElement(e,t){this.slotElements.set(e,t);let n=this.slotViewabilityRecords.get(e);n&&n.element!==t&&this.observeSlot(t,e,{refreshIndex:n.refreshIndex,emitRefreshEvent:!1})}recordClick(e,t){if(!this.isEnabled||!e)return!1;let n=Date.now();if(n-(this.lastClickAt.get(e)||0)<qt)return!1;this.lastClickAt.set(e,n);let r=this.getCachedBid(e);return this.enqueue(m.CLICK,"click",{auctionId:r?.auctionId||"",transactionId:r?.transactionId||"",adUnitCode:e,bid:r?.bidTrace,metadata:{...t?.metadata,refresh_index:String(this.getRefreshIndex(e))}}),!0}attachClickTracker(e,t){if(typeof window>"u")return()=>{};let n=()=>{setTimeout(()=>{let o=document.activeElement;o&&(o===e||e.contains(o))&&(this.recordClick(t,{metadata:{source:"blur"}}),window.focus())},0)};window.addEventListener("blur",n);let r=()=>{window.removeEventListener("blur",n),this.clickDetachCleanups.delete(r)};return this.clickDetachCleanups.add(r),r}onViewable(e,t){let n={callback:t,firedForIndex:-1},r=this.slotViewabilityRecords.get(e);return r?(r.viewableListeners.add(n),this.notifyViewable(r)):(this.pendingViewableListeners.has(e)||this.pendingViewableListeners.set(e,new Set),this.pendingViewableListeners.get(e).add(n)),()=>{this.slotViewabilityRecords.get(e)?.viewableListeners.delete(n),this.pendingViewableListeners.get(e)?.delete(n)}}scheduleThresholdTimers(e){if(!e.inView||typeof document<"u"&&document.visibilityState==="hidden")return;let t=this.getCurrentTimeInView(e);for(let n of e.thresholdListeners)if(!n.fired)if(t>=n.thresholdMs){n.fired=!0,n.timer&&(clearTimeout(n.timer),n.timer=null);try{n.callback(e.slotId,t)}catch(r){this.log("ERROR","Error in threshold listener callback",r)}}else{n.timer&&clearTimeout(n.timer);let r=n.thresholdMs-t;n.timer=setTimeout(()=>{if(n.timer=null,!n.fired&&e.inView&&(typeof document>"u"||document.visibilityState==="visible")){let o=this.getCurrentTimeInView(e);if(o>=n.thresholdMs){n.fired=!0;try{n.callback(e.slotId,o)}catch(s){this.log("ERROR","Error in threshold listener callback",s)}}}},r)}}checkThresholdListeners(e){let t=this.getCurrentTimeInView(e);for(let n of e.thresholdListeners)if(!n.fired&&t>=n.thresholdMs){n.fired=!0,n.timer&&(clearTimeout(n.timer),n.timer=null);try{n.callback(e.slotId,t)}catch(r){this.log("ERROR","Error in threshold listener callback",r)}}}getCurrentTimeInView(e){let t=e.accumulatedTimeInViewMs;if(e.inView&&e.lastEnteredViewAt!==null){let n=typeof performance<"u"&&performance.now?performance.now():Date.now();t+=Math.max(0,n-e.lastEnteredViewAt)}return t}flushSlotTimeInView(e){let t=this.slotViewabilityRecords.get(e);if(!t)return;if(t.inView&&t.lastEnteredViewAt!==null){let r=typeof performance<"u"&&performance.now?performance.now():Date.now();t.accumulatedTimeInViewMs+=Math.max(0,r-t.lastEnteredViewAt),t.lastEnteredViewAt=null}let n=Math.round(t.accumulatedTimeInViewMs);n>0&&this.enqueue(m.TIME_IN_VIEW,"timeInView",{auctionId:t.auctionId,transactionId:t.transactionId,adUnitCode:t.adUnitCode,viewableDurationMs:n,bid:t.bidPayload,metadata:{...t.metadata,refresh_index:String(t.refreshIndex)}}),t.accumulatedTimeInViewMs=0}flushAllSlotsTimeInView(){for(let e of Array.from(this.slotViewabilityRecords.keys()))this.flushSlotTimeInView(e)}observeSlot(e,t,n){if(!this.config.viewabilityEnabled)return;let r=null;if(typeof e=="string"){if(typeof document<"u"){try{r=document.querySelector(e)||document.getElementById(e)}catch{r=document.getElementById(e)}r||(r=document.getElementById(e))}}else r=e;let o=t||n?.adUnitCode||(r?r.id:"")||q(),s=this.slotViewabilityRecords.get(o);if(s){if(n?.refreshIndex===void 0||n.refreshIndex>s.refreshIndex){this.flushSlotTimeInView(o);let a=n?.refreshIndex!==void 0?n.refreshIndex:(this.slotRefreshIndices.get(o)??s.refreshIndex)+1;this.slotRefreshIndices.set(o,a),n?.emitRefreshEvent!==!1&&this.enqueue(m.REFRESH,"refresh",{auctionId:n?.auctionId||s.auctionId,transactionId:n?.transactionId||s.transactionId,adUnitCode:o,bid:n?.bid??s.bidPayload,metadata:{...n?.metadata,refresh_index:String(a)}}),s.dwellTimer&&(clearTimeout(s.dwellTimer),s.dwellTimer=null,s.dwellStartedAt=null);for(let c of s.thresholdListeners)c.fired=!1,c.timer&&(clearTimeout(c.timer),c.timer=null);s.viewableFired=!1,s.accumulatedTimeInViewMs=0;let l=typeof performance<"u"&&performance.now?performance.now():Date.now();if(s.lastEnteredViewAt=s.inView?l:null,s.refreshIndex=a,s.auctionId=n?.auctionId||s.auctionId,s.transactionId=n?.transactionId||s.transactionId,s.mediaType=n?.mediaType||s.mediaType||"banner",s.bidPayload=n?.bid!==void 0?n.bid:s.bidPayload,s.metadata=n?.metadata??s.metadata,s.inView&&(typeof document>"u"||document.visibilityState==="visible")){let c=s.mediaType==="video"?2e3:1e3;s.dwellStartedAt=l,s.dwellTimer=setTimeout(()=>{this.handleDwellComplete(s)},c),this.scheduleThresholdTimers(s)}}else s.auctionId=n?.auctionId||s.auctionId,s.transactionId=n?.transactionId||s.transactionId,s.mediaType=n?.mediaType||s.mediaType,n?.bid!==void 0&&(s.bidPayload=n.bid),n?.metadata!==void 0&&(s.metadata=n.metadata);n?.auctionId&&this.slotLastAuctionIds.set(o,n.auctionId),r&&(s.element&&s.element!==r&&this.intersectionObserver&&(this.intersectionObserver.unobserve(s.element),this.elementToSlotId.delete(s.element)),s.element=r,this.elementToSlotId.set(r,o),this.intersectionObserver?.observe(r))}else{let d=n?.refreshIndex??this.slotRefreshIndices.get(o)??0;this.slotRefreshIndices.set(o,d),n?.auctionId&&this.slotLastAuctionIds.set(o,n.auctionId);let a=this.pendingThresholdListeners.get(o)||new Set;this.pendingThresholdListeners.delete(o);let l=this.pendingViewableListeners.get(o)||new Set;this.pendingViewableListeners.delete(o);let c={slotId:o,element:r,adUnitCode:n?.adUnitCode||o,auctionId:n?.auctionId||"",transactionId:n?.transactionId||"",mediaType:n?.mediaType||"banner",bidPayload:n?.bid,metadata:n?.metadata,refreshIndex:d,inView:!1,lastEnteredViewAt:null,accumulatedTimeInViewMs:0,viewableFired:!1,dwellTimer:null,dwellStartedAt:null,thresholdListeners:a,viewableListeners:l};this.slotViewabilityRecords.set(o,c),r&&(this.elementToSlotId.set(r,o),this.intersectionObserver?.observe(r))}}unobserveSlot(e){let t=this.slotViewabilityRecords.get(e);if(t){this.flushSlotTimeInView(e),t.dwellTimer&&(clearTimeout(t.dwellTimer),t.dwellTimer=null,t.dwellStartedAt=null);for(let n of t.thresholdListeners)n.timer&&(clearTimeout(n.timer),n.timer=null);t.thresholdListeners=new Set,t.viewableListeners=new Set,t.element&&this.intersectionObserver&&(this.intersectionObserver.unobserve(t.element),this.elementToSlotId.delete(t.element),t.element=null),t.inView=!1,t.lastEnteredViewAt=null}}destroySlot(e){this.unobserveSlot(e),this.slotViewabilityRecords.delete(e),this.slotRefreshIndices.delete(e),this.slotLastAuctionIds.delete(e),this.pendingThresholdListeners.delete(e),this.pendingViewableListeners.delete(e);let t=`${f(e)}:`;for(let r of Array.from(this.slotEmittedImpressionKeys))(r===e||r.startsWith(t))&&this.slotEmittedImpressionKeys.delete(r);let n=this.cachedWinningBids.get(e);n&&this.deleteCachedBidEntry(n)}getCachedBid(e){let t=this.cachedWinningBids.get(e);if(t){if(Date.now()-t.timestamp>j){this.deleteCachedBidEntry(t);return}return t}}deleteCachedBidEntry(e){for(let[t,n]of Array.from(this.cachedWinningBids))n===e&&this.cachedWinningBids.delete(t)}pruneCachedWinningBids(){let e=Date.now();for(let[t,n]of Array.from(this.cachedWinningBids))e-n.timestamp>j&&this.cachedWinningBids.delete(t);for(;this.cachedWinningBids.size>$t;){let t=this.cachedWinningBids.keys().next();if(t.done)break;this.cachedWinningBids.delete(t.value)}}addImpressionKey(e){if(!this.slotEmittedImpressionKeys.has(e)){for(;this.slotEmittedImpressionKeys.size>=Wt;){let t=this.slotEmittedImpressionKeys.values().next();if(t.done)break;this.slotEmittedImpressionKeys.delete(t.value)}this.slotEmittedImpressionKeys.add(e)}}getOrCreateAuctionOutcomes(e){let t=this.auctionBidderOutcomes.get(e);for(t||(t=new Map,this.auctionBidderOutcomes.set(e,t));this.auctionBidderOutcomes.size>jt;){let n=this.auctionBidderOutcomes.keys().next();if(n.done||n.value===e)break;this.auctionBidderOutcomes.delete(n.value)}return t}hasImpressionEmitted(e,t,n,r){let o=t??this.slotRefreshIndices.get(e)??0,s=`${f(e)}:${o}`;return r?n?this.slotEmittedImpressionKeys.has(`${s}:auc:${f(n)}:${f(r)}`)||this.slotEmittedImpressionKeys.has(`${s}:${f(r)}`):this.slotEmittedImpressionKeys.has(`${s}:${f(r)}`):n?this.slotEmittedImpressionKeys.has(`${s}:auc:${f(n)}`):this.slotEmittedImpressionKeys.has(s)}markImpressionEmitted(e,t,n,r){let o=`${f(e)}:${t}`;this.addImpressionKey(o),r&&this.addImpressionKey(`${o}:${f(r)}`),n&&(this.addImpressionKey(`${o}:auc:${f(n)}`),r&&this.addImpressionKey(`${o}:auc:${f(n)}:${f(r)}`))}recordImpression(e,t){if(!this.isEnabled)return!1;let n=e||t?.adUnitCode||"",r=t?.adUnitCode||n,o=(t?.auctionId&&n?this.getCachedBid(`${t.auctionId}:${n}`):void 0)||(t?.auctionId&&r?this.getCachedBid(`${t.auctionId}:${r}`):void 0)||(n?this.getCachedBid(n):void 0)||(r?this.getCachedBid(r):void 0),s=t?.bid||o?.rawBid||{},d=t?.auctionId||s.auctionId||o?.auctionId||"",a=t?.transactionId||s.transactionId||o?.transactionId||"",l=s.creativeId||o?.bidTrace?.creativeId||t?.bid?.creativeId||"",c=t?.mediaType||s.mediaType||o?.bidTrace?.mediaType||"banner",y=n||r,h=(n?this.slotViewabilityRecords.get(n):void 0)||(r?this.slotViewabilityRecords.get(r):void 0),I=y?this.slotLastAuctionIds.get(y)||(h?h.auctionId:void 0):void 0,A=!!(y&&d&&I&&I!==d&&t?.refreshIndex===void 0),p={bidder:s.bidderCode||s.bidder||o?.bidTrace?.bidder||"",cpm:Number.isFinite(s.originalCpm)?s.originalCpm:Number.isFinite(s.cpm)?s.cpm:o?.bidTrace?.cpm??0,currency:s.originalCurrency??s.currency??o?.bidTrace?.currency??"USD",...W(s).width?W(s):o?.bidTrace?{width:o.bidTrace.width,height:o.bidTrace.height}:W(s),dealId:s.dealId||o?.bidTrace?.dealId||"",mediaType:c,latencyMs:Number.isFinite(s.timeToRespond)?s.timeToRespond:o?.bidTrace?.latencyMs??0,advertiserDomain:s.meta?.advertiserDomains?.[0]||o?.bidTrace?.advertiserDomain||"",creativeId:s.creativeId||o?.bidTrace?.creativeId||""};if(A&&y){this.flushSlotTimeInView(y);let R=(this.slotRefreshIndices.get(y)??(h?h.refreshIndex:0))+1;this.slotRefreshIndices.set(y,R),this.slotLastAuctionIds.set(y,d),h&&(h.refreshIndex=R,h.auctionId=d,h.transactionId=a,h.bidPayload=p,h.viewableFired=!1,h.accumulatedTimeInViewMs=0),this.enqueue(m.REFRESH,"refresh",{auctionId:d,transactionId:a,adUnitCode:y,bid:p,metadata:{...t?.metadata,refresh_index:String(R)}})}else y&&(d&&this.slotLastAuctionIds.set(y,d),this.slotRefreshIndices.has(y)||this.slotRefreshIndices.set(y,0));let T=t?.refreshIndex??(n?this.slotRefreshIndices.get(n)??(r?this.slotRefreshIndices.get(r):void 0)??(h?h.refreshIndex:0):0);return n&&this.hasImpressionEmitted(n,T,d,l)||r&&r!==n&&this.hasImpressionEmitted(r,T,d,l)?(this.log("DEBUG",`Impression already emitted for slot ${n||r} in cycle ${T}`),!1):(n&&this.markImpressionEmitted(n,T,d,l),r&&r!==n&&this.markImpressionEmitted(r,T,d,l),this.enqueue(m.IMPRESSION,"impression",{auctionId:d,transactionId:a,adUnitCode:r,bid:p,metadata:{...t?.metadata,refresh_index:String(T)}}),h&&(!h.bidPayload&&p&&(h.bidPayload=p),!h.auctionId&&d&&(h.auctionId=d),!h.transactionId&&a&&(h.transactionId=a)),!0)}onTimeInViewThreshold(e,t,n){let r={thresholdMs:t,callback:n,timer:null,fired:!1},o=this.slotViewabilityRecords.get(e);if(o){o.thresholdListeners.add(r);let s=this.getCurrentTimeInView(o);if(s>=t){r.fired=!0;try{n(e,s)}catch(d){this.log("ERROR","Error in threshold callback",d)}}else if(o.inView&&(typeof document>"u"||document.visibilityState==="visible")){let d=t-s;r.timer=setTimeout(()=>{if(r.timer=null,!r.fired&&o.inView&&(typeof document>"u"||document.visibilityState==="visible")){let a=this.getCurrentTimeInView(o);if(a>=t){r.fired=!0;try{n(e,a)}catch(l){this.log("ERROR","Error in threshold callback",l)}}}},d)}}else this.pendingThresholdListeners.has(e)||this.pendingThresholdListeners.set(e,new Set),this.pendingThresholdListeners.get(e).add(r);return()=>{r.timer&&(clearTimeout(r.timer),r.timer=null),o&&o.thresholdListeners.delete(r);let s=this.pendingThresholdListeners.get(e);s&&s.delete(r)}}getViewabilityState(e){let t=this.slotViewabilityRecords.get(e);if(!t)return;let n=Math.round(this.getCurrentTimeInView(t));return{inView:t.inView,viewable:t.viewableFired,timeInViewMs:n,refreshIndex:t.refreshIndex}}getEndpoint(){return this.config.endpoint}getRefreshIndex(e){return this.slotRefreshIndices.get(e)??0}triggerSlotRefresh(e,t){let n=this.slotViewabilityRecords.get(e);n&&n.element&&this.observeSlot(n.element,e,t)}trackRawEvent(e,t,n){let r=Pt[t]??(e==="ERROR"?m.ERROR:void 0);r!==void 0&&this.enqueue(r,t,n,e)}setUserId(e){this.config.userId=e}setSessionId(e){this.config.sessionId=e}navigate(e,t){if(this.disable(),this.slotRefreshIndices.clear(),this.pendingThresholdListeners.clear(),this.config.pageviewId=e||q(),t)try{let n=new URL(t);this.pageUrl=n.origin+n.pathname}catch{this.pageUrl=t}else this.pageUrl="";this.logger.resetTiming(),Xe(),this.enable()}handleAuctionInit(e){if(this.isDuplicate("auctionInit",e))return;this.log("DEBUG","auctionInit",e);let t=e.auctionId||"";t&&(this.auctionBidderOutcomes.delete(t),this.getOrCreateAuctionOutcomes(t)),this.enqueue(m.AUCTION_START,"auctionStart",{auctionId:t,transactionId:e.transactionId||""})}handleAuctionEnd(e){if(this.isDuplicate("auctionEnd",e))return;this.log("DEBUG","auctionEnd",e);let t=e.auctionId||"",n=t?this.auctionBidderOutcomes.get(t):void 0,r=n?Array.from(n.values()):[];t&&this.auctionBidderOutcomes.delete(t),this.enqueue(m.AUCTION_END,"auctionEnd",{auctionId:t,transactionId:e.transactionId||"",bidderOutcomes:r})}handleBidRequested(e){if(this.isDuplicate("bidRequested",e))return;this.log("DEBUG","bidRequested",e);let t=e.auctionId||"",n=e.bidderCode||e.bidder||"";if(!t||!n)return;let r=this.getOrCreateAuctionOutcomes(t);Array.isArray(e.bids)&&e.bids.forEach(o=>{let s=o.adUnitCode||"",d=Object.keys(o.mediaTypes||{}),a=d.length>0?d[0]:o.mediaType||"banner",l=`${n}:${s}`;r.has(l)||r.set(l,{adUnitCode:s,outcome:U.BIDDER_OUTCOME_NO_RESPONSE,bid:{bidder:n,mediaType:a,latencyMs:0}})})}handleBidResponse(e){if(this.isDuplicate("bidResponse",e))return;this.log("DEBUG","bidResponse",e);let t=e.auctionId||"",n=e.bidderCode||e.bidder||"",r=e.adUnitCode||"",o=Number.isFinite(e.originalCpm)?e.originalCpm:Number.isFinite(e.cpm)?e.cpm:0,s=Number.isFinite(e.timeToRespond)?e.timeToRespond:0,d=Object.keys(e.mediaTypes||{}),a=e.mediaType||(e.mediaTypes?.video?"video":d.length>0?d[0]:"banner");if(!t||!n)return;let l=o>0?{bidder:n,cpm:o,currency:e.originalCurrency??e.currency??"USD",...W(e),dealId:e.dealId||"",mediaType:a,latencyMs:s,advertiserDomain:e.meta?.advertiserDomains?.[0]||"",creativeId:e.creativeId||""}:{bidder:n,mediaType:a,latencyMs:s};this.getOrCreateAuctionOutcomes(t).set(`${n}:${r}`,{adUnitCode:r,outcome:o>0?U.BIDDER_OUTCOME_BID:U.BIDDER_OUTCOME_NO_BID,bid:l})}handleBidTimeout(e){if(this.isDuplicate("bidTimeout",e))return;this.log("DEBUG","bidTimeout",e);let t=Array.isArray(e)?e:e?[e]:[];for(let n of t){let r=n.auctionId||"",o=n.bidderCode||n.bidder||"",s=n.adUnitCode||"",d=Number.isFinite(n.timeout)?n.timeout:0;if(r&&o){let a=this.getOrCreateAuctionOutcomes(r),l=`${o}:${s}`,c=a.get(l);c?(c.outcome=U.BIDDER_OUTCOME_TIMEOUT,d>0&&c.bid&&(c.bid.latencyMs=d)):a.set(l,{adUnitCode:s,outcome:U.BIDDER_OUTCOME_TIMEOUT,bid:{bidder:o,mediaType:"banner",latencyMs:d}})}}}handleBidWon(e){if(this.isDuplicate("bidWon",e))return;this.log("DEBUG","bidWon",e);let t=e.auctionId||"",n=e.transactionId||"",r=e.adUnitCode||e.adId||"",o=Object.keys(e.mediaTypes||{}),s=e.mediaType||(e.mediaTypes?.video?"video":o.length>0?o[0]:"banner"),d={bidder:e.bidderCode||e.bidder||"",cpm:Number.isFinite(e.originalCpm)?e.originalCpm:Number.isFinite(e.cpm)?e.cpm:0,currency:e.originalCurrency??e.currency??"USD",...W(e),dealId:e.dealId||"",mediaType:s,latencyMs:Number.isFinite(e.timeToRespond)?e.timeToRespond:0,advertiserDomain:e.meta?.advertiserDomains?.[0]||"",creativeId:e.creativeId||""};if(r){let a={bidTrace:d,auctionId:t,transactionId:n,adUnitCode:r,rawBid:e,timestamp:Date.now()};this.cachedWinningBids.set(r,a),e.adId&&e.adId!==r&&this.cachedWinningBids.set(e.adId,a),t&&(this.cachedWinningBids.set(`${t}:${r}`,a),e.adId&&e.adId!==r&&this.cachedWinningBids.set(`${t}:${e.adId}`,a)),this.pruneCachedWinningBids()}this.enqueue(m.BID_WIN,"bidWon",{auctionId:t,transactionId:n,adUnitCode:r,bid:d})}handleNoBid(e){if(this.isDuplicate("noBid",e))return;this.log("DEBUG","noBid",e);let t=e.auctionId||"",n=e.bidderCode||e.bidder||"",r=e.adUnitCode||"";if(t&&n){let o=this.getOrCreateAuctionOutcomes(t),s=`${n}:${r}`,d=o.get(s);d?d.outcome===U.BIDDER_OUTCOME_NO_RESPONSE&&(d.outcome=U.BIDDER_OUTCOME_NO_BID):o.set(s,{adUnitCode:r,outcome:U.BIDDER_OUTCOME_NO_BID,bid:{bidder:n,mediaType:"banner",latencyMs:0}})}}handleAdRenderFailed(e){if(this.isDuplicate("adRenderFailed",e))return;this.log("DEBUG","adRenderFailed",e);let t=e.bid||{};this.enqueue(m.AD_RENDER_FAILED,"adRenderFailed",{auctionId:t.auctionId||e.auctionId||"",transactionId:t.transactionId||e.transactionId||"",adUnitCode:t.adUnitCode||e.adUnitCode||"",bid:{bidder:t.bidderCode||t.bidder||e.bidderCode||e.bidder||""},metadata:{reason:String(e.reason||""),message:String(e.message||e.error?.message||"")},error:e.error||(e.message?new Error(String(e.message)):void 0)})}handleAdRenderSucceeded(e){if(this.isDuplicate("adRenderSucceeded",e))return;this.log("DEBUG","adRenderSucceeded",e);let t=e.bid||e||{},n=e.adUnitCode||t.adUnitCode||e.adId||t.adId||"",r=t.auctionId||e.auctionId||"",o=t.transactionId||e.transactionId||"",s=t.mediaType||"banner",d=e.adUnitCode||t.adUnitCode||"",a=e.adId||t.adId||"",l=(r&&d?this.getCachedBid(`${r}:${d}`):void 0)||(r&&a?this.getCachedBid(`${r}:${a}`):void 0)||(d?this.getCachedBid(d):void 0)||(a?this.getCachedBid(a):void 0),c=s==="video"||t.mediaType==="video"||t.mediaTypes?.video!==void 0||l?.bidTrace?.mediaType==="video"||l?.rawBid?.mediaType==="video"||n&&this.slotViewabilityRecords.get(n)?.mediaType==="video",y=c?"video":s||l?.bidTrace?.mediaType||"banner",h={bidder:t.bidderCode||t.bidder||l?.bidTrace?.bidder||"",cpm:Number.isFinite(t.originalCpm)?t.originalCpm:Number.isFinite(t.cpm)?t.cpm:l?.bidTrace?.cpm??0,currency:t.originalCurrency??t.currency??l?.bidTrace?.currency??"USD",...W(t).width?W(t):l?.bidTrace?{width:l.bidTrace.width,height:l.bidTrace.height}:W(t),dealId:t.dealId||l?.bidTrace?.dealId||"",mediaType:y,latencyMs:Number.isFinite(t.timeToRespond)?t.timeToRespond:l?.bidTrace?.latencyMs??0,advertiserDomain:t.meta?.advertiserDomains?.[0]||l?.bidTrace?.advertiserDomain||"",creativeId:t.creativeId||l?.bidTrace?.creativeId||""},I=r||l?.auctionId||"",A=o||l?.transactionId||"",p=n?this.slotViewabilityRecords.get(n):void 0,T=p&&I&&p.auctionId&&p.auctionId!==I;if(!!(n&&p&&T)){this.flushSlotTimeInView(n);let v=(this.slotRefreshIndices.get(n)??(p?p.refreshIndex:0))+1;this.slotRefreshIndices.set(n,v),this.slotLastAuctionIds.set(n,I),p&&(p.refreshIndex=v,p.auctionId=I,p.transactionId=A,p.bidPayload=h,p.viewableFired=!1,p.accumulatedTimeInViewMs=0),this.enqueue(m.REFRESH,"refresh",{auctionId:I,transactionId:A,adUnitCode:n,bid:h,metadata:{refresh_index:String(v)}})}else n&&(I&&this.slotLastAuctionIds.set(n,I),this.slotRefreshIndices.has(n)||this.slotRefreshIndices.set(n,0));let R=n?this.slotRefreshIndices.get(n)??(p?p.refreshIndex:0):0;if(c?this.log("DEBUG",`adRenderSucceeded received for video ad unit ${n||"unknown"}: suppressing IMPRESSION until verified video lifecycle event`):n&&this.hasImpressionEmitted(n,R,I,h.creativeId)||(n&&this.markImpressionEmitted(n,R,I,h.creativeId),this.enqueue(m.IMPRESSION,"impression",{auctionId:I,transactionId:A,adUnitCode:n,bid:h,metadata:{refresh_index:String(R)}})),this.config.viewabilityEnabled&&typeof document<"u"){let v=n&&this.slotElements.get(n)||null,x=n||e.adId||t.adId;if(!v&&x&&(v=document.getElementById(x)),!v&&typeof window<"u"&&window.googletag?.pubads)try{let k=window.googletag.pubads().getSlots();for(let g of k)if((g.getAdUnitPath?.()===n||g.getSlotElementId?.()===n)&&(v=document.getElementById(g.getSlotElementId()),v))break}catch{}if(!v&&x)try{for(let k of Array.from(document.querySelectorAll("[data-ad-slot]")))if(k.getAttribute("data-ad-slot")===x){v=k;break}}catch{}v&&this.observeSlot(v,n||x,{adUnitCode:n,auctionId:I,transactionId:A,mediaType:y,bid:h,refreshIndex:R,emitRefreshEvent:!1})}}isDuplicate(e,t){return this.deduper.isDuplicate(e,t)}enqueue(e,t,n,r){if(!this.isEnabled||!this.shouldSample(e,r))return;Xe();let o={eventId:F(q()),timestampMs:Date.now(),type:e,eventName:e===m.ERROR?t:"",auctionId:F(String(n.auctionId||"")),transactionId:F(String(n.transactionId||"")),adUnitCode:n.adUnitCode||n.elementId||"",namespace:n.ns||n.namespace||""};n.bid&&(o.bid={bidder:n.bid.bidder||"",cpm:Number.isFinite(n.bid.cpm)?n.bid.cpm:0,currency:n.bid.currency||"",width:Number.isFinite(n.bid.width)?n.bid.width:0,height:Number.isFinite(n.bid.height)?n.bid.height:0,dealId:n.bid.dealId||"",mediaType:n.bid.mediaType||"",latencyMs:Number.isFinite(n.bid.latencyMs)?n.bid.latencyMs:0,advertiserDomain:n.bid.advertiserDomain||"",creativeId:n.bid.creativeId||""}),n.viewableDurationMs!==void 0&&(o.viewableDurationMs=Number.isFinite(n.viewableDurationMs)?n.viewableDurationMs:0),n.bidderOutcomes&&Array.isArray(n.bidderOutcomes)&&(o.bidderOutcomes=n.bidderOutcomes);let s={...n.metadata};n.error!==void 0&&n.error!==null&&(s.error=typeof n.error=="object"&&n.error.message?String(n.error.message):String(n.error)),n.gpid&&(s.gpid=String(n.gpid)),n.refreshIndex!==void 0&&s.refresh_index===void 0&&(s.refresh_index=String(n.refreshIndex));let d=Yt(s);Object.keys(d).length>0&&(o.metadata=d),this.queue.push(o),this.queue.length>=K?(this.flush(),this.queue.length>K&&this.queue.splice(0,this.queue.length-K)):Ft.has(e)&&this.revenueFlushTimer===null&&(this.revenueFlushTimer=setTimeout(()=>{this.revenueFlushTimer=null,this.flush()},this.config.revenueFlushDelayMs))}shouldSample(e,t){return e===m.ERROR?(this.errorCount++,this.errorCount>xt?!1:this.config.errorsEnabled):t==="WARN"?this.config.warningsEnabled:this.config.auctionEnabled}requeue(e){e.length&&(this.queue=e.concat(this.queue),this.queue.length>K&&this.queue.splice(0,this.queue.length-K))}drainBatch(){if(this.queue.length===0||!this.config.endpoint)return null;let e=typeof window<"u"?window.location.hostname:"",t=n=>({propertyId:F(this.config.propertyId),pageviewId:F(this.config.pageviewId),sessionId:F(this.config.sessionId),pageUrl:this.pageUrl,country:this.config.country,region:this.config.region,deviceType:this.config.deviceType,userId:F(this.config.userId),domain:e,events:n});for(;;){if(this.queue.length===0)return null;let n=this.queue,r=fe.encode(t(n)).finish();for(;n.length>1&&r.byteLength>pe;)n=n.slice(0,Math.floor(n.length/2)),r=fe.encode(t(n)).finish();if(r.byteLength>pe){let[o]=this.queue.splice(0,1);this.log("WARN",`Dropping oversized event (type ${o?.type}, ${r.byteLength} bytes exceeds the ${pe}-byte cap on its own)`);continue}return this.queue=this.queue.slice(n.length),{url:`${this.config.endpoint}/${this.config.propertyId}`,encoded:r,events:n}}}sendFetch(e,t=!1,n,r=!1){let o={method:"POST",headers:{"Content-Type":Ye},body:e.encoded};t&&(o.keepalive=!0),fetch(e.url,o).then(d=>{if(d.ok)r||(this.consecutiveSendFailures=0,this.nextSendAllowedAt=0),n&&n();else{if(this.log("WARN",`Failed to send batch: HTTP ${d.status}`),d.status>=400&&d.status<500&&d.status!==429&&d.status!==408){this.log("WARN",`Dropping batch due to non-retryable client error HTTP ${d.status}`);return}r||this.handleSendFailure(e.events)}}).catch(d=>{this.log("ERROR","Failed to send batch",d),r||this.handleSendFailure(e.events)});let s=typeof globalThis<"u"?globalThis.process:void 0;if(s&&typeof s._tickCallback=="function")try{s._tickCallback()}catch{}}handleSendFailure(e){this.consecutiveSendFailures++;let t=Math.min(Ge*2**(this.consecutiveSendFailures-1),kt);this.nextSendAllowedAt=Date.now()+t,this.consecutiveSendFailures<=Dt?this.requeue(e):this.log("WARN",`Dropping ${e.length} events after ${this.consecutiveSendFailures} consecutive send failures`)}flush(){if(Date.now()<this.nextSendAllowedAt)return;let e=this.drainBatch();for(;e&&(this.sendFetch(e,!1),!(Date.now()<this.nextSendAllowedAt));)e=this.drainBatch()}flushBeacon(){let e=this.drainBatch();for(;e;){let t=!1;if(typeof navigator<"u"&&typeof navigator.sendBeacon=="function")try{let n=new Blob([e.encoded],{type:Ye});t=navigator.sendBeacon(e.url,n)}catch{t=!1}if(!t){let n=this.persistBatch(e.encoded);this.sendFetch(e,!0,()=>this.removePersistedBatch(n))}e=this.drainBatch()}this.schedulePersistedCleanup()}pendingKeyPrefix(){return`${J}${encodeURIComponent(this.config.propertyId)}_`}persistBatch(e){if(!Y)return null;try{if(typeof localStorage>"u"||!this.config.propertyId)return null;let t=0;for(let r=0;r<localStorage.length;r++){let o=localStorage.key(r);o&&o.startsWith(J)&&t++}if(t>=Ut)return null;let n=`${this.pendingKeyPrefix()}${Date.now()}_${Math.floor(Math.random()*1e6)}`;return localStorage.setItem(n,Ht(e)),this.persistedBatchKeys.push(n),n}catch{return null}}removePersistedBatch(e){if(!e)return;try{typeof localStorage<"u"&&localStorage.removeItem(e)}catch{}let t=this.persistedBatchKeys.indexOf(e);t!==-1&&this.persistedBatchKeys.splice(t,1)}schedulePersistedCleanup(){this.persistedBatchKeys.length!==0&&(this.persistedCleanupTimer&&clearTimeout(this.persistedCleanupTimer),this.persistedCleanupTimer=setTimeout(()=>{this.persistedCleanupTimer=null;for(let e of Array.from(this.persistedBatchKeys))this.removePersistedBatch(e)},Nt))}resendPersistedBatches(){try{if(typeof localStorage>"u"||!this.config.endpoint||!this.config.propertyId)return;let e=this.pendingKeyPrefix(),t=[],n=[];for(let r=0;r<localStorage.length;r++){let o=localStorage.key(r);!o||!o.startsWith(J)||(o.startsWith(e)?t.push(o):zt(o)&&n.push(o))}for(let r of n)try{localStorage.removeItem(r)}catch{}for(let r of t){let o=null;try{o=localStorage.getItem(r),localStorage.removeItem(r)}catch{continue}if(!o)continue;let s=parseInt(r.slice(e.length),10);if(!Number.isFinite(s)||Date.now()-s>Mt)continue;let d;try{d=Gt(o)}catch{continue}d.byteLength!==0&&(this.log("DEBUG",`Resending persisted exit batch (${d.byteLength} bytes)`),this.sendFetch({url:`${this.config.endpoint}/${this.config.propertyId}`,encoded:d,events:[]},!1,void 0,!0))}}catch{}}log(e,t,...n){this.logger.log(e,t,...n)}},be=ne({prefix:"[bidkernel]",logLevel:"INFO"})});function tn(i){let e=typeof i?.getError=="function"?i.getError():i?.error||i,t=a=>e&&typeof e[a]=="function"?e[a]():void 0,n=t("getMessage")||e?.message||String(e||"IMA ad error"),r=t("getErrorCode")??e?.code,o=t("getVastErrorCode"),s=t("getType")??e?.type,d={message:n};return r&&(d.error_code=String(r)),o&&(d.vast_error_code=String(o)),s&&(d.error_type=String(s)),{err:e,message:n,metadata:d}}function nt(i,e,t){let n=ee(i),{err:r,message:o,metadata:s}=tn(e);return n.log("WARN","IMA AdErrorEvent received",e),n.enqueue(m.AD_RENDER_FAILED,"adRenderFailed",{auctionId:t.auctionId,transactionId:t.transactionId,adUnitCode:t.adUnitCode,bid:t.bid,metadata:{...t.metadata,reason:t.adStarted?"ima_playback_error":"ima_ad_error",playback_phase:t.adStarted?"post_start":"pre_start",...s},error:typeof r=="object"?r:new Error(o)}),r}function nn(i,e){if(!i||typeof i!="object"||Ze.has(i))return;Ze.add(i);let t=typeof window<"u"&&window.google?.ima?.AdErrorEvent?.Type?.AD_ERROR||"adError";try{e.call(i,t,n=>{for(let r of S.getActiveInstances())try{let o=rt(r,{mediaType:"video"});nt(r,n,{adStarted:!1,adUnitCode:o?.adUnitCode||"video",auctionId:o?.auctionId,transactionId:o?.transactionId,bid:o?.bidTrace})}catch{}})}catch{}}function Je(i){if(i)try{let e=i.prototype;if(e&&typeof e.getAdsManager=="function"&&!e.getAdsManager.__bidkernelHooked){let t=e.getAdsManager,n=function(...r){let o=t.apply(this,r);if(o)for(let s of S.getActiveInstances())try{s.attachImaAdsManager(o)}catch{}return o};n.__bidkernelHooked=!0,e.getAdsManager=n}}catch{}}function et(i){if(i)try{let e=i.prototype||i;if(e&&typeof e.init=="function"&&!e.init.__bidkernelHooked){let t=e.init,n=function(...r){for(let o of S.getActiveInstances())try{o.attachImaAdsManager(this)}catch{}return t.apply(this,r)};n.__bidkernelHooked=!0,e.init=n}if(e&&typeof e.start=="function"&&!e.start.__bidkernelHooked){let t=e.start,n=function(...r){for(let o of S.getActiveInstances())try{o.attachImaAdsManager(this)}catch{}return t.apply(this,r)};n.__bidkernelHooked=!0,e.start=n}}catch{}}function tt(i){if(i)try{let e=i.prototype;if(!e)return;if(typeof e.addEventListener=="function"&&!e.addEventListener.__bidkernelHooked){let t=e.addEventListener,n=function(r,o,...s){if(nn(this,t),(r==="adsManagerLoaded"||r===(this?.AdsManagerLoadedEvent?.Type?.ADS_MANAGER_LOADED||"adsManagerLoaded"))&&typeof o=="function"){let d=Te.get(o);return d||(d=function(a){if(a&&typeof a.getAdsManager=="function"&&!a.getAdsManager.__bidkernelHooked){let l=a.getAdsManager;a.getAdsManager=function(...c){let y=l.apply(this,c);if(y)for(let h of S.getActiveInstances())try{h.attachImaAdsManager(y)}catch{}return y},a.getAdsManager.__bidkernelHooked=!0}return o.apply(this,arguments)},Te.set(o,d)),t.call(this,r,d,...s)}return t.call(this,r,o,...s)};n.__bidkernelHooked=!0,e.addEventListener=n}if(typeof e.removeEventListener=="function"&&!e.removeEventListener.__bidkernelHooked){let t=e.removeEventListener,n=function(r,o,...s){let d=typeof o=="function"?Te.get(o):void 0;return t.call(this,r,d||o,...s)};n.__bidkernelHooked=!0,e.removeEventListener=n}}catch{}}function z(i){if(!(!i||typeof i!="object"))try{i.AdsManagerLoadedEvent&&Je(i.AdsManagerLoadedEvent);let e=Object.getOwnPropertyDescriptor(i,"AdsManagerLoadedEvent");if(!e||e.configurable){let r=i.AdsManagerLoadedEvent;try{Object.defineProperty(i,"AdsManagerLoadedEvent",{configurable:!0,enumerable:!0,get(){return r},set(o){r=o,Je(o)}})}catch{}}i.AdsLoader&&tt(i.AdsLoader);let t=Object.getOwnPropertyDescriptor(i,"AdsLoader");if(!t||t.configurable){let r=i.AdsLoader;try{Object.defineProperty(i,"AdsLoader",{configurable:!0,enumerable:!0,get(){return r},set(o){r=o,tt(o)}})}catch{}}i.AdsManager&&et(i.AdsManager);let n=Object.getOwnPropertyDescriptor(i,"AdsManager");if(!n||n.configurable){let r=i.AdsManager;try{Object.defineProperty(i,"AdsManager",{configurable:!0,enumerable:!0,get(){return r},set(o){r=o,et(o)}})}catch{}}}catch{}}function it(){if(typeof window>"u")return;let i=window;if(i.google?.ima&&z(i.google.ima),i.google&&typeof i.google=="object"){let t=Object.getOwnPropertyDescriptor(i.google,"ima");if(!t||t.configurable){let n=i.google.ima;try{Object.defineProperty(i.google,"ima",{configurable:!0,enumerable:!0,get(){return n},set(r){n=r,z(r)}})}catch{}}}let e=Object.getOwnPropertyDescriptor(i,"google");if(!e||e.configurable){let t=i.google;try{Object.defineProperty(i,"google",{configurable:!0,enumerable:!0,get(){return t},set(n){if(t=n,t&&typeof t=="object"){t.ima&&z(t.ima);let r=Object.getOwnPropertyDescriptor(t,"ima");if(!r||r.configurable){let o=t.ima;try{Object.defineProperty(t,"ima",{configurable:!0,enumerable:!0,get(){return o},set(s){o=s,z(s)}})}catch{}}}}})}catch{}}}function rt(i,e){let t=ee(i),n=Date.now(),r=d=>t.hasImpressionEmitted(d.adUnitCode,void 0,d.auctionId,d.bidTrace.creativeId);if(e?.creativeId||e?.adId){for(let d of Array.from(t.cachedWinningBids.values()))if(!(n-d.timestamp>j)&&(e.creativeId&&(d.bidTrace.creativeId===e.creativeId||d.rawBid?.creativeId===e.creativeId)||e.adId&&(d.rawBid?.adId===e.adId||d.adUnitCode===e.adId)))return d}let o;if(e?.mediaType){for(let a of Array.from(t.cachedWinningBids.values())){if(n-a.timestamp>j)continue;(a.bidTrace.mediaType===e.mediaType||a.rawBid?.mediaType===e.mediaType||e.mediaType==="video"&&a.rawBid?.mediaTypes?.video!==void 0)&&(r(a)||(!o||a.timestamp<o.timestamp)&&(o=a))}if(o)return o;let d;for(let a of Array.from(t.cachedWinningBids.values())){if(n-a.timestamp>j)continue;(a.bidTrace.mediaType===e.mediaType||a.rawBid?.mediaType===e.mediaType||e.mediaType==="video"&&a.rawBid?.mediaTypes?.video!==void 0)&&(!d||a.timestamp>d.timestamp)&&(d=a)}if(d)return d}for(let d of Array.from(t.cachedWinningBids.values()))n-d.timestamp>j||r(d)||(!o||d.timestamp>o.timestamp)&&(o=d);if(o)return o;let s;for(let d of Array.from(t.cachedWinningBids.values()))n-d.timestamp>j||(!s||d.timestamp>s.timestamp)&&(s=d);return s}function ot(i,e,t){let n=ee(i);if(!e||typeof e.addEventListener!="function")return n.log("WARN","Invalid AdsManager passed to attachImaAdsManager"),()=>{};if(!e.__bidkernelAttachedInstances)try{Object.defineProperty(e,"__bidkernelAttachedInstances",{value:new Map,configurable:!0,writable:!0})}catch{e.__bidkernelAttachedInstances=new Map}let r=e.__bidkernelAttachedInstances,o=r.get(i);if(o){if(!t)return()=>{};o()}let s=t?.slotId||t?.adUnitCode||"video",d=t?.adUnitCode||s,a=t?.auctionId||"",l=t?.transactionId||"",c=b=>{let u=(a?n.getCachedBid(`${a}:${d}`):void 0)||(a&&s!==d?n.getCachedBid(`${a}:${s}`):void 0)||(d!=="video"?n.getCachedBid(d):void 0)||(s!==d&&s!=="video"?n.getCachedBid(s):void 0);return u||(u=rt(i,{creativeId:b?.creativeId,adId:b?.adId,mediaType:"video"})),u},y=!1,h=b=>{y=!0,n.log("DEBUG","IMA AdEvent.STARTED / IMPRESSION received",b);let u=typeof b?.getAd=="function"?b.getAd():b?.ad,E={};u&&(E.creativeId=(typeof u.getCreativeId=="function"?u.getCreativeId():u.creativeId)||"",E.adId=(typeof u.getAdId=="function"?u.getAdId():u.id)||"",E.title=(typeof u.getTitle=="function"?u.getTitle():u.title)||"",E.duration=typeof u.getDuration=="function"?u.getDuration():u.duration,E.advertiserName=typeof u.getAdvertiserName=="function"?u.getAdvertiserName():"");let _=c(E),O=t?.slotId&&t.slotId!=="video"?t.slotId:t?.adUnitCode&&t.adUnitCode!=="video"?t.adUnitCode:_?.adUnitCode||t?.slotId||t?.adUnitCode||"video",at=t?.adUnitCode&&t.adUnitCode!=="video"?t.adUnitCode:_?.adUnitCode||O,ct=a||_?.auctionId||"",lt=l||_?.transactionId||"",we={..._?.rawBid||t?.bid,mediaType:"video",creativeId:E.creativeId||_?.bidTrace?.creativeId||t?.bid?.creativeId||""};if(n.recordImpression(O,{adUnitCode:at,auctionId:ct,transactionId:lt,mediaType:"video",bid:we,metadata:{...t?.metadata,media_type:"video",...E.title?{ad_title:E.title}:{},...Number.isFinite(E.duration)?{ad_duration_s:String(E.duration)}:{}}})&&t?.onImpression)try{t.onImpression(O,{ad:u,bid:we})}catch(ut){n.log("ERROR","Error in onImpression callback",ut)}},I=b=>{if(n.log("DEBUG",`IMA AdEvent milestone: ${b}`),t?.onMilestone)try{t.onMilestone(b,s)}catch(u){n.log("ERROR","Error in onMilestone callback",u)}},A=b=>{n.log("DEBUG","IMA AdEvent.CLICK received",b);let u=c(),E=t?.adUnitCode&&t.adUnitCode!=="video"?t.adUnitCode:u?.adUnitCode||s;n.enqueue(m.CLICK,"click",{auctionId:a||u?.auctionId,transactionId:l||u?.transactionId,adUnitCode:E,bid:u?.bidTrace||t?.bid,metadata:{...t?.metadata,media_type:"video"}})},p=b=>{let u=c(),E=t?.adUnitCode&&t.adUnitCode!=="video"?t.adUnitCode:u?.adUnitCode||s,_=nt(i,b,{adStarted:y,adUnitCode:E,auctionId:a||u?.auctionId,transactionId:l||u?.transactionId,bid:u?.bidTrace||t?.bid,metadata:t?.metadata});if(t?.onError)try{t.onError(_)}catch(O){n.log("ERROR","Error in onError callback",O)}},T=typeof window<"u"?window.google?.ima:void 0,L=T?.AdEvent?.Type||{},R=T?.AdErrorEvent?.Type||{},v=[{type:L.STARTED||"started",handler:h},{type:L.IMPRESSION||"impression",handler:h},{type:L.FIRST_QUARTILE||"firstQuartile",handler:()=>I("firstQuartile")},{type:L.MIDPOINT||"midpoint",handler:()=>I("midpoint")},{type:L.THIRD_QUARTILE||"thirdQuartile",handler:()=>I("thirdQuartile")},{type:L.COMPLETE||"complete",handler:()=>I("complete")},{type:L.CLICK||"click",handler:A},{type:R.AD_ERROR||"adError",handler:p}],x=new Set,k=[];for(let b of v)x.has(b.type)||(x.add(b.type),k.push(b));for(let{type:b,handler:u}of k)try{e.addEventListener(b,u)}catch{}let g=()=>{r.delete(i);for(let{type:b,handler:u}of k)try{e.removeEventListener(b,u)}catch{}n.videoDetachCleanups.delete(g)};return r.set(i,g),n.videoDetachCleanups.add(g),g}function rn(i,e,t){let n=ee(i);if(!e)return n.log("WARN","attachVideoPlayer called with null/undefined target"),()=>{};let r=null;if(typeof e=="string"){if(typeof document<"u")try{r=document.querySelector(e)||document.getElementById(e)}catch{r=document.getElementById(e)}}else if(typeof HTMLElement<"u"&&e instanceof HTMLElement)r=e;else if(e&&typeof e=="object"&&e.nodeType===1)r=e;else{if(typeof e.addEventListener=="function"&&(typeof e.init=="function"||typeof e.start=="function"||typeof e.getCuePoints=="function"||typeof e.getVolume=="function"||e.__imaAdsManager))return ot(i,e,t);e&&typeof e.addEventListener=="function"&&(r=e)}let o=t?.slotId||t?.adUnitCode||(r?r.id:"")||"video",s=t?.adUnitCode||o,d=t?.auctionId||"",a=t?.transactionId||"",l=()=>(d?n.getCachedBid(`${d}:${s}`):void 0)||(d&&o!==s?n.getCachedBid(`${d}:${o}`):void 0)||n.getCachedBid(s)||(o!==s?n.getCachedBid(o):void 0),c=null;r&&(r.tagName&&r.tagName.toLowerCase()==="video"?c=r:c=r.querySelector("video"));let y={q1:!1,q2:!1,q3:!1,q4:!1},h=g=>{let b=g||c||(r?.querySelector?r.querySelector("video"):null),u=l(),E={...u?.rawBid||t?.bid,mediaType:"video"};if(n.recordImpression(o,{adUnitCode:s,auctionId:d||u?.auctionId,transactionId:a||u?.transactionId,mediaType:"video",bid:E,metadata:{...t?.metadata,media_type:"video",...b&&Number.isFinite(b.duration)?{video_duration_s:String(Math.round(b.duration))}:{}}})&&t?.onImpression)try{t.onImpression(o,{element:b||r,bid:E})}catch(O){n.log("ERROR","Error in onImpression callback",O)}},I=g=>{n.log("DEBUG","HTML5 video playing event received");let b=g?.target instanceof HTMLVideoElement?g.target:c;h(b)},A=g=>{let b=g?.target instanceof HTMLVideoElement?g.target:c;if(b&&b.currentTime>0&&(h(b),Number.isFinite(b.duration)&&b.duration>0)){let u=b.currentTime/b.duration;u>=.25&&!y.q1&&(y.q1=!0,t?.onMilestone?.("firstQuartile",o)),u>=.5&&!y.q2&&(y.q2=!0,t?.onMilestone?.("midpoint",o)),u>=.75&&!y.q3&&(y.q3=!0,t?.onMilestone?.("thirdQuartile",o))}},p=()=>{y.q4||(y.q4=!0,t?.onMilestone?.("complete",o))},T=g=>{let u=(g?.target instanceof HTMLVideoElement?g.target:c)?.error||c?.error,E=l(),_=u?`HTML5 video error code ${u.code}: ${u.message}`:"Video playback error";if(n.log("WARN",_),n.enqueue(m.AD_RENDER_FAILED,"adRenderFailed",{auctionId:d||E?.auctionId,transactionId:a||E?.transactionId,adUnitCode:s,bid:E?.bidTrace||t?.bid,metadata:{...t?.metadata,reason:"html5_video_error",message:_,...u?.code?{error_code:String(u.code)}:{}},error:u?new Error(_):void 0}),t?.onError)try{t.onError(u)}catch(O){n.log("ERROR","Error in onError callback",O)}},L=g=>{g.addEventListener("playing",I),g.addEventListener("play",I),g.addEventListener("timeupdate",A),g.addEventListener("ended",p),g.addEventListener("error",T)},R=g=>{g.removeEventListener("playing",I),g.removeEventListener("play",I),g.removeEventListener("timeupdate",A),g.removeEventListener("ended",p),g.removeEventListener("error",T)},v=null;r&&r!==c&&(r.addEventListener("playing",I,!0),r.addEventListener("play",I,!0),r.addEventListener("timeupdate",A,!0),r.addEventListener("ended",p,!0),r.addEventListener("error",T,!0)),c&&L(c),r&&r.tagName?.toLowerCase()!=="video"&&typeof MutationObserver<"u"&&(v=new MutationObserver(()=>{let g=r.querySelector("video");g&&g!==c&&(c&&R(c),c=g,c&&L(c))}),v.observe(r,{childList:!0,subtree:!0}));let x=l();t?.trackViewability!==!1&&r&&n.observeSlot(r,o,{adUnitCode:s,auctionId:d||x?.auctionId,transactionId:a||x?.transactionId,mediaType:"video",bid:x?.bidTrace||t?.bid,metadata:t?.metadata,emitRefreshEvent:!1});let k=()=>{v&&(v.disconnect(),v=null),r&&r!==c&&(r.removeEventListener("playing",I,!0),r.removeEventListener("play",I,!0),r.removeEventListener("timeupdate",A,!0),r.removeEventListener("ended",p,!0),r.removeEventListener("error",T,!0)),c&&R(c),n.videoDetachCleanups.delete(k)};return n.videoDetachCleanups.add(k),k}var ee,Te,Ze,on,st=B(()=>{"use strict";Ee();he();ee=i=>i,Te=new WeakMap,Ze=new WeakSet;typeof window<"u"&&it();S.prototype.attachImaAdsManager=function(i,e){return ot(this,i,e)};S.prototype.attachVideoPlayer=function(i,e){return rn(this,i,e)};on=S.prototype.enable;S.prototype.enable=function(){on.call(this),typeof window<"u"&&(it(),window.google?.ima&&z(window.google.ima))}});var dn=ft(()=>{Ee();st();var dt="https://by.bidkernel.io/t",sn=window._bidkernelPbjsGlobal||"pbjs";ve(sn,{endpoint:dt});window.bidkernelPrebidAnalytics={...window.bidkernelPrebidAnalytics,register:(i,e)=>ve(i,{endpoint:dt,...e}),attachVideoPlayer:(i,e)=>{let t=window._bidkernelPrebidAnalytics;return t?.attachVideoPlayer?t.attachVideoPlayer(i,e):()=>{}},attachImaAdsManager:(i,e)=>{let t=window._bidkernelPrebidAnalytics;return t?.attachImaAdsManager?t.attachImaAdsManager(i,e):()=>{}},recordImpression:(i,e)=>{let t=window._bidkernelPrebidAnalytics;return t?.recordImpression?t.recordImpression(i,e):!1}}});return dn();})();
|
|
1
|
+
"use strict";var bidkernelPrebidAnalyticsBundle=(()=>{var _=(i,e)=>()=>(i&&(e=i(i=0)),e);var yt=(i,e)=>()=>(e||i((e={exports:{}}).exports,e),e.exports);function mt(){if(typeof window<"u"){let i=window;return i.__bidkernelLogListeners||(i.__bidkernelLogListeners=new Set),i.__bidkernelLogListeners}return gt}function It(i){if((i<0||!Number.isFinite(i))&&(i=0),i<1e3)return`${i.toFixed(2)}ms`;let e=i/1e3;if(e<60)return`${e.toFixed(2)}s`;let t=Math.floor(e/60);return t<60?`${t}m ${(e%60).toFixed(2)}s`:`${Math.floor(t/60)}h ${t%60}m ${(e%60).toFixed(2)}s`}function Y(i){if(typeof i=="string"){let e=i.toUpperCase();if(e==="DEBUG"||e==="INFO"||e==="WARN"||e==="ERROR")return e}return w.INFO}function re(i){return new ie(i)}var w,Ae,P,bt,gt,ie,Re=_(()=>{"use strict";w={DEBUG:"DEBUG",INFO:"INFO",WARN:"WARN",ERROR:"ERROR"},Ae={[w.DEBUG]:10,[w.INFO]:20,[w.WARN]:30,[w.ERROR]:40},P={badge:"color: #2dd4bf; font-weight: bold",badgeWarn:"background: #f59e0b; color: #fff; padding: 2px 4px; border-radius: 3px; font-weight: bold",badgeError:"background: #ef4444; color: #fff; padding: 2px 4px; border-radius: 3px; font-weight: bold",dim:"color: #6b7280",event:"color: #38bdf8; font-weight: bold",eventWarn:"color: #f59e0b; font-weight: bold",eventError:"color: #ef4444; font-weight: bold",reset:"color: inherit"},bt=0,gt=new Set;ie=class i{_prefix;_level;_loadedAt;_now;_console;_customFormatTime;_listeners=new Set;constructor(e={}){this._prefix=e.prefix??"[bidkernel]",this._level=Y(e.logLevel??w.INFO),this._now=e.now,this._console=e.console,this._customFormatTime=e.formatTime,e.onLog&&this._listeners.add(e.onLog),this._loadedAt=e.loadedAt??(this._now?this._now():typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now())}get prefix(){return this._prefix}set prefix(e){this._prefix=e}get logLevel(){return this._level}set logLevel(e){this._level=Y(e)}getLevel(){return this._level}setLevel(e){this._level=Y(e)}getPrefix(){return this._prefix}setPrefix(e){this._prefix=e}resetTiming(e){this._loadedAt=e??(this._now?this._now():typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now())}getLoadedAt(){return this._loadedAt}addListener(e){return this._listeners.add(e),()=>{this._listeners.delete(e)}}removeListener(e){this._listeners.delete(e)}isEnabled(e){let t=Y(e);return(Ae[t]??20)>=(Ae[this._level]??20)}formatTime(e){return this._customFormatTime?this._customFormatTime(e):It(e)}_getConsole(){if(this._console)return this._console;if(typeof console<"u")return console}_getElapsed(){let e=this._now?this._now():typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now();return Math.max(0,e-this._loadedAt)}_dispatchRecord(e){for(let n of this._listeners)try{n(e)}catch{}let t=mt();for(let n of t)if(!this._listeners.has(n))try{n(e)}catch{}if(typeof window<"u"&&typeof window.dispatchEvent=="function")try{window.dispatchEvent(new CustomEvent("__bidkernel_log__",{detail:e}))}catch{}}log(e,t,...n){let r=Y(e);if(!this.isEnabled(r))return;let o=this._getElapsed(),s=this.formatTime(o),d=Date.now(),l={id:`bk_log_${d}_${++bt}`,timestamp:d,elapsedMs:o,level:r,prefix:this._prefix,message:t,args:n,data:n.length===1?n[0]:n.length>1?n:void 0};this._dispatchRecord(l);let c=this._getConsole();if(!c)return;let b=P.badge,h=P.event;r===w.WARN?(b=P.badgeWarn,h=P.eventWarn):r===w.ERROR&&(b=P.badgeError,h=P.eventError);let m=`%c${this._prefix}%c ${s} %c${t}%c`,A=[b,P.dim,h,P.reset],p=[m,...A];switch(n.length>0&&p.push(...n),r){case w.DEBUG:typeof c.log=="function"?c.log(...p):typeof c.debug=="function"&&c.debug(...p);break;case w.INFO:typeof c.info=="function"?c.info(...p):typeof c.log=="function"&&c.log(...p);break;case w.WARN:typeof c.warn=="function"?c.warn(...p):typeof c.log=="function"&&c.log(...p);break;case w.ERROR:typeof c.error=="function"?c.error(...p):typeof c.log=="function"&&c.log(...p);break;default:typeof c.log=="function"&&c.log(...p);break}}debug(e,...t){this.log(w.DEBUG,e,...t)}info(e,...t){this.log(w.INFO,e,...t)}warn(e,...t){this.log(w.WARN,e,...t)}error(e,...t){this.log(w.ERROR,e,...t)}logEvent(e){e&&(e.data!==void 0?this.log(e.level,e.eventName,e.data):this.log(e.level,e.eventName))}child(e,t={}){let n=this._prefix;if(e){let r=e.startsWith("[")&&e.endsWith("]")?e:`[${e}]`;n=`${this._prefix}${r}`}return new i({prefix:n,logLevel:t.logLevel??this._level,loadedAt:t.loadedAt??this._loadedAt,now:t.now??this._now,console:t.console??this._console,formatTime:t.formatTime??this._customFormatTime,...t})}withPrefix(e){return new i({prefix:e,logLevel:this._level,loadedAt:this._loadedAt,now:this._now,console:this._console,formatTime:this._customFormatTime})}}});function Be(){let i=0,e=0;for(let n=0;n<28;n+=7){let r=this.buf[this.pos++];if(i|=(r&127)<<n,(r&128)==0)return this.assertBounds(),[i,e]}let t=this.buf[this.pos++];if(i|=(t&15)<<28,e=(t&112)>>4,(t&128)==0)return this.assertBounds(),[i,e];for(let n=3;n<=31;n+=7){let r=this.buf[this.pos++];if(e|=(r&127)<<n,(r&128)==0)return this.assertBounds(),[i,e]}throw new Error("invalid varint")}function Z(i,e,t){for(let o=0;o<28;o=o+7){let s=i>>>o,d=!(!(s>>>7)&&e==0),a=(d?s|128:s)&255;if(t.push(a),!d)return}let n=i>>>28&15|(e&7)<<4,r=e>>3!=0;if(t.push((r?n|128:n)&255),!!r){for(let o=3;o<31;o=o+7){let s=e>>>o,d=!!(s>>>7),a=(d?s|128:s)&255;if(t.push(a),!d)return}t.push(e>>>31&1)}}function oe(i){let e=i[0]==="-";e&&(i=i.slice(1));let t=1e6,n=0,r=0;function o(s,d){let a=Number(i.slice(s,d));r*=t,n=n*t+a,n>=Q&&(r=r+(n/Q|0),n=n%Q)}return o(-24,-18),o(-18,-12),o(-12,-6),o(-6),e?Se(n,r):de(n,r)}function Ce(i,e){let t=de(i,e),n=t.hi&2147483648;n&&(t=Se(t.lo,t.hi));let r=se(t.lo,t.hi);return n?"-"+r:r}function se(i,e){if({lo:i,hi:e}=vt(i,e),e<=2097151)return String(Q*e+i);let t=i&16777215,n=(i>>>24|e<<8)&16777215,r=e>>16&65535,o=t+n*6777216+r*6710656,s=n+r*8147497,d=r*2,a=1e7;return o>=a&&(s+=Math.floor(o/a),o%=a),s>=a&&(d+=Math.floor(s/a),s%=a),d.toString()+_e(s)+_e(o)}function vt(i,e){return{lo:i>>>0,hi:e>>>0}}function de(i,e){return{lo:i|0,hi:e|0}}function Se(i,e){return e=~e,i?i=~i+1:e+=1,de(i,e)}function ae(i,e){if(i>=0){for(;i>127;)e.push(i&127|128),i=i>>>7;e.push(i)}else{for(let t=0;t<9;t++)e.push(i&127|128),i=i>>7;e.push(1)}}function Le(){let i=this.buf[this.pos++],e=i&127;if((i&128)==0)return this.assertBounds(),e;if(i=this.buf[this.pos++],e|=(i&127)<<7,(i&128)==0)return this.assertBounds(),e;if(i=this.buf[this.pos++],e|=(i&127)<<14,(i&128)==0)return this.assertBounds(),e;if(i=this.buf[this.pos++],e|=(i&127)<<21,(i&128)==0)return this.assertBounds(),e;i=this.buf[this.pos++],e|=(i&15)<<28;for(let t=5;(i&128)!==0&&t<10;t++)i=this.buf[this.pos++];if((i&128)!=0)throw new Error("invalid varint");return this.assertBounds(),e>>>0}var Q,_e,ce=_(()=>{"use strict";Q=4294967296;_e=i=>{let e=String(i);return"0000000".slice(e.length)+e}});function Tt(){let i=new DataView(new ArrayBuffer(8));if(typeof BigInt=="function"&&typeof i.getBigInt64=="function"&&typeof i.getBigUint64=="function"&&typeof i.setBigInt64=="function"&&typeof i.setBigUint64=="function"&&(!!globalThis.Deno||typeof process!="object"||typeof process.env!="object"||process.env.BUF_BIGINT_DISABLE!=="1")){let t=BigInt("-9223372036854775808"),n=BigInt("9223372036854775807"),r=BigInt("0"),o=BigInt("18446744073709551615");return{zero:BigInt(0),supported:!0,parse(s){let d=typeof s=="bigint"?s:BigInt(s);if(d>n||d<t)throw new Error(`invalid int64: ${s}`);return d},uParse(s){let d=typeof s=="bigint"?s:BigInt(s);if(d>o||d<r)throw new Error(`invalid uint64: ${s}`);return d},enc(s){return i.setBigInt64(0,this.parse(s),!0),{lo:i.getInt32(0,!0),hi:i.getInt32(4,!0)}},uEnc(s){return i.setBigInt64(0,this.uParse(s),!0),{lo:i.getInt32(0,!0),hi:i.getInt32(4,!0)}},dec(s,d){return i.setInt32(0,s,!0),i.setInt32(4,d,!0),i.getBigInt64(0,!0)},uDec(s,d){return i.setInt32(0,s,!0),i.setInt32(4,d,!0),i.getBigUint64(0,!0)}}}return{zero:"0",supported:!1,parse(t){return typeof t!="string"&&(t=t.toString()),xe(t),t},uParse(t){return typeof t!="string"&&(t=t.toString()),ke(t),t},enc(t){return typeof t!="string"&&(t=t.toString()),xe(t),oe(t)},uEnc(t){return typeof t!="string"&&(t=t.toString()),ke(t),oe(t)},dec(t,n){return Ce(t,n)},uDec(t,n){return se(t,n)}}}function xe(i){if(!/^-?[0-9]+$/.test(i))throw new Error("invalid int64: "+i)}function ke(i){if(!/^[0-9]+$/.test(i))throw new Error("invalid uint64: "+i)}var O,De=_(()=>{"use strict";ce();O=Tt()});function ue(){if(globalThis[le]==null){let i=new globalThis.TextEncoder,e=new globalThis.TextDecoder;globalThis[le]={encodeUtf8(t){return i.encode(t)},decodeUtf8(t){return e.decode(t)},checkUtf8(t){try{return encodeURIComponent(t),!0}catch{return!1}}}}return globalThis[le]}var le,fe=_(()=>{"use strict";le=Symbol.for("@bufbuild/protobuf/text-encoding")});function he(i){if(typeof i=="string")i=Number(i);else if(typeof i!="number")throw new Error("invalid int32: "+typeof i);if(!Number.isInteger(i)||i>Rt||i<_t)throw new Error("invalid int32: "+i)}function Oe(i){if(typeof i=="string")i=Number(i);else if(typeof i!="number")throw new Error("invalid uint32: "+typeof i);if(!Number.isInteger(i)||i>At||i<0)throw new Error("invalid uint32: "+i)}function Bt(i){if(typeof i=="string"){let e=i;if(i=Number(i),Number.isNaN(i)&&e!=="NaN")throw new Error("invalid float32: "+e)}else if(typeof i!="number")throw new Error("invalid float32: "+typeof i);if(Number.isFinite(i)&&(i>Et||i<wt))throw new Error("invalid float32: "+i)}var V,Et,wt,At,Rt,_t,F,B,Me=_(()=>{"use strict";ce();De();fe();(function(i){i[i.Varint=0]="Varint",i[i.Bit64=1]="Bit64",i[i.LengthDelimited=2]="LengthDelimited",i[i.StartGroup=3]="StartGroup",i[i.EndGroup=4]="EndGroup",i[i.Bit32=5]="Bit32"})(V||(V={}));Et=34028234663852886e22,wt=-34028234663852886e22,At=4294967295,Rt=2147483647,_t=-2147483648,F=class{constructor(e=ue().encodeUtf8){this.encodeUtf8=e,this.stack=[],this.chunks=[],this.buf=[]}finish(){this.buf.length&&(this.chunks.push(new Uint8Array(this.buf)),this.buf=[]);let e=0;for(let r=0;r<this.chunks.length;r++)e+=this.chunks[r].length;let t=new Uint8Array(e),n=0;for(let r=0;r<this.chunks.length;r++)t.set(this.chunks[r],n),n+=this.chunks[r].length;return this.chunks=[],t}fork(){return this.stack.push({chunks:this.chunks,buf:this.buf}),this.chunks=[],this.buf=[],this}join(){let e=this.finish(),t=this.stack.pop();if(!t)throw new Error("invalid state, fork stack empty");return this.chunks=t.chunks,this.buf=t.buf,this.uint32(e.byteLength),this.raw(e)}tag(e,t){return this.uint32((e<<3|t)>>>0)}raw(e){return this.buf.length&&(this.chunks.push(new Uint8Array(this.buf)),this.buf=[]),this.chunks.push(e),this}uint32(e){for(Oe(e);e>127;)this.buf.push(e&127|128),e=e>>>7;return this.buf.push(e),this}int32(e){return he(e),ae(e,this.buf),this}bool(e){return this.buf.push(e?1:0),this}bytes(e){return this.uint32(e.byteLength),this.raw(e)}string(e){let t=this.encodeUtf8(e);return this.uint32(t.byteLength),this.raw(t)}float(e){Bt(e);let t=new Uint8Array(4);return new DataView(t.buffer).setFloat32(0,e,!0),this.raw(t)}double(e){let t=new Uint8Array(8);return new DataView(t.buffer).setFloat64(0,e,!0),this.raw(t)}fixed32(e){Oe(e);let t=new Uint8Array(4);return new DataView(t.buffer).setUint32(0,e,!0),this.raw(t)}sfixed32(e){he(e);let t=new Uint8Array(4);return new DataView(t.buffer).setInt32(0,e,!0),this.raw(t)}sint32(e){return he(e),e=(e<<1^e>>31)>>>0,ae(e,this.buf),this}sfixed64(e){let t=new Uint8Array(8),n=new DataView(t.buffer),r=O.enc(e);return n.setInt32(0,r.lo,!0),n.setInt32(4,r.hi,!0),this.raw(t)}fixed64(e){let t=new Uint8Array(8),n=new DataView(t.buffer),r=O.uEnc(e);return n.setInt32(0,r.lo,!0),n.setInt32(4,r.hi,!0),this.raw(t)}int64(e){let t=O.enc(e);return Z(t.lo,t.hi,this.buf),this}sint64(e){let t=O.enc(e),n=t.hi>>31,r=t.lo<<1^n,o=(t.hi<<1|t.lo>>>31)^n;return Z(r,o,this.buf),this}uint64(e){let t=O.uEnc(e);return Z(t.lo,t.hi,this.buf),this}},B=class{constructor(e,t=ue().decodeUtf8){this.decodeUtf8=t,this.varint64=Be,this.uint32=Le,this.buf=e,this.len=e.length,this.pos=0,this.view=new DataView(e.buffer,e.byteOffset,e.byteLength)}tag(){let e=this.uint32(),t=e>>>3,n=e&7;if(t<=0||n<0||n>5)throw new Error("illegal tag: field no "+t+" wire type "+n);return[t,n]}skip(e,t){let n=this.pos;switch(e){case V.Varint:for(;this.buf[this.pos++]&128;);break;case V.Bit64:this.pos+=4;case V.Bit32:this.pos+=4;break;case V.LengthDelimited:let r=this.uint32();this.pos+=r;break;case V.StartGroup:for(;;){let[o,s]=this.tag();if(s===V.EndGroup){if(t!==void 0&&o!==t)throw new Error("invalid end group tag");break}this.skip(s,o)}break;default:throw new Error("cant skip wire type "+e)}return this.assertBounds(),this.buf.subarray(n,this.pos)}assertBounds(){if(this.pos>this.len)throw new RangeError("premature EOF")}int32(){return this.uint32()|0}sint32(){let e=this.uint32();return e>>>1^-(e&1)}int64(){return O.dec(...this.varint64())}uint64(){return O.uDec(...this.varint64())}sint64(){let[e,t]=this.varint64(),n=-(e&1);return e=(e>>>1|(t&1)<<31)^n,t=t>>>1^n,O.dec(e,t)}bool(){let[e,t]=this.varint64();return e!==0||t!==0}fixed32(){return this.view.getUint32((this.pos+=4)-4,!0)}sfixed32(){return this.view.getInt32((this.pos+=4)-4,!0)}fixed64(){return O.uDec(this.sfixed32(),this.sfixed32())}sfixed64(){return O.dec(this.sfixed32(),this.sfixed32())}float(){return this.view.getFloat32((this.pos+=4)-4,!0)}double(){return this.view.getFloat64((this.pos+=8)-8,!0)}bytes(){let e=this.uint32(),t=this.pos;return this.pos+=e,this.assertBounds(),this.buf.subarray(t,t+e)}string(){return this.decodeUtf8(this.bytes())}}});var Ue=_(()=>{"use strict"});var Ne=_(()=>{"use strict"});var Pe=_(()=>{"use strict"});var Ve=_(()=>{"use strict";Me();Ue();fe();Ne();Pe()});function Ct(){return{propertyId:new Uint8Array(0),pageviewId:new Uint8Array(0),sessionId:new Uint8Array(0),pageUrl:"",country:"",region:"",deviceType:"",userId:new Uint8Array(0),domain:"",events:[],browser:"",deviceManufacturer:"",deviceModel:"",city:"",postalCode:""}}function St(){return{timestampMs:0,type:0,eventName:"",auctionId:new Uint8Array(0),transactionId:new Uint8Array(0),adUnitCode:"",bid:void 0,namespace:"",eventId:new Uint8Array(0),metadata:{},viewableDurationMs:void 0,bidderOutcomes:[]}}function Lt(){return{key:"",value:""}}function xt(){return{adUnitCode:"",outcome:0,bid:void 0,refreshIndex:0}}function kt(){return{bidder:"",cpm:0,currency:"",width:0,height:0,dealId:"",mediaType:"",latencyMs:0,advertiserDomain:"",creativeId:""}}var I,U,pe,Fe,$e,We,J,ye=_(()=>{"use strict";Ve();I={TRACE_EVENT_TYPE_UNSPECIFIED:0,AUCTION_START:1,AUCTION_END:2,BID_WIN:4,IMPRESSION:5,VIEWABLE:6,TIME_IN_VIEW:7,ERROR:9,SLOT_DEFINED:10,SLOT_DESTROYED:11,CLICK:12,AD_RENDER_FAILED:13,UNRECOGNIZED:-1},U={BIDDER_OUTCOME_UNSPECIFIED:0,BIDDER_OUTCOME_BID:1,BIDDER_OUTCOME_NO_BID:2,BIDDER_OUTCOME_TIMEOUT:3,BIDDER_OUTCOME_ERROR:4,BIDDER_OUTCOME_NO_RESPONSE:5,UNRECOGNIZED:-1};pe={encode(i,e=new F){if(i.propertyId!==void 0&&i.propertyId.length!==0&&e.uint32(10).bytes(i.propertyId),i.pageviewId!==void 0&&i.pageviewId.length!==0&&e.uint32(18).bytes(i.pageviewId),i.sessionId!==void 0&&i.sessionId.length!==0&&e.uint32(26).bytes(i.sessionId),i.pageUrl!==void 0&&i.pageUrl!==""&&e.uint32(34).string(i.pageUrl),i.country!==void 0&&i.country!==""&&e.uint32(42).string(i.country),i.region!==void 0&&i.region!==""&&e.uint32(50).string(i.region),i.deviceType!==void 0&&i.deviceType!==""&&e.uint32(58).string(i.deviceType),i.userId!==void 0&&i.userId.length!==0&&e.uint32(66).bytes(i.userId),i.domain!==void 0&&i.domain!==""&&e.uint32(74).string(i.domain),i.events!==void 0&&i.events.length!==0)for(let t of i.events)Fe.encode(t,e.uint32(82).fork()).join();return i.browser!==void 0&&i.browser!==""&&e.uint32(90).string(i.browser),i.deviceManufacturer!==void 0&&i.deviceManufacturer!==""&&e.uint32(98).string(i.deviceManufacturer),i.deviceModel!==void 0&&i.deviceModel!==""&&e.uint32(106).string(i.deviceModel),i.city!==void 0&&i.city!==""&&e.uint32(114).string(i.city),i.postalCode!==void 0&&i.postalCode!==""&&e.uint32(122).string(i.postalCode),e},decode(i,e){let t=i instanceof B?i:new B(i),n=e===void 0?t.len:t.pos+e,r=Ct();for(;t.pos<n;){let o=t.uint32();switch(o>>>3){case 1:{if(o!==10)break;r.propertyId=t.bytes();continue}case 2:{if(o!==18)break;r.pageviewId=t.bytes();continue}case 3:{if(o!==26)break;r.sessionId=t.bytes();continue}case 4:{if(o!==34)break;r.pageUrl=t.string();continue}case 5:{if(o!==42)break;r.country=t.string();continue}case 6:{if(o!==50)break;r.region=t.string();continue}case 7:{if(o!==58)break;r.deviceType=t.string();continue}case 8:{if(o!==66)break;r.userId=t.bytes();continue}case 9:{if(o!==74)break;r.domain=t.string();continue}case 10:{if(o!==82)break;let s=Fe.decode(t,t.uint32());s!==void 0&&r.events.push(s);continue}case 11:{if(o!==90)break;r.browser=t.string();continue}case 12:{if(o!==98)break;r.deviceManufacturer=t.string();continue}case 13:{if(o!==106)break;r.deviceModel=t.string();continue}case 14:{if(o!==114)break;r.city=t.string();continue}case 15:{if(o!==122)break;r.postalCode=t.string();continue}}if((o&7)===4||o===0)break;t.skip(o&7)}return r}};Fe={encode(i,e=new F){if(i.timestampMs!==void 0&&i.timestampMs!==0&&e.uint32(9).double(i.timestampMs),i.type!==void 0&&i.type!==0&&e.uint32(16).int32(i.type),i.eventName!==void 0&&i.eventName!==""&&e.uint32(26).string(i.eventName),i.auctionId!==void 0&&i.auctionId.length!==0&&e.uint32(34).bytes(i.auctionId),i.transactionId!==void 0&&i.transactionId.length!==0&&e.uint32(42).bytes(i.transactionId),i.adUnitCode!==void 0&&i.adUnitCode!==""&&e.uint32(50).string(i.adUnitCode),i.bid!==void 0&&J.encode(i.bid,e.uint32(58).fork()).join(),i.namespace!==void 0&&i.namespace!==""&&e.uint32(66).string(i.namespace),i.eventId!==void 0&&i.eventId.length!==0&&e.uint32(74).bytes(i.eventId),globalThis.Object.entries(i.metadata||{}).forEach(([t,n])=>{$e.encode({key:t,value:n},e.uint32(82).fork()).join()}),i.viewableDurationMs!==void 0&&e.uint32(89).double(i.viewableDurationMs),i.bidderOutcomes!==void 0&&i.bidderOutcomes.length!==0)for(let t of i.bidderOutcomes)We.encode(t,e.uint32(98).fork()).join();return e},decode(i,e){let t=i instanceof B?i:new B(i),n=e===void 0?t.len:t.pos+e,r=St();for(;t.pos<n;){let o=t.uint32();switch(o>>>3){case 1:{if(o!==9)break;r.timestampMs=t.double();continue}case 2:{if(o!==16)break;r.type=t.int32();continue}case 3:{if(o!==26)break;r.eventName=t.string();continue}case 4:{if(o!==34)break;r.auctionId=t.bytes();continue}case 5:{if(o!==42)break;r.transactionId=t.bytes();continue}case 6:{if(o!==50)break;r.adUnitCode=t.string();continue}case 7:{if(o!==58)break;r.bid=J.decode(t,t.uint32());continue}case 8:{if(o!==66)break;r.namespace=t.string();continue}case 9:{if(o!==74)break;r.eventId=t.bytes();continue}case 10:{if(o!==82)break;let s=$e.decode(t,t.uint32());s.value!==void 0&&(r.metadata[s.key]=s.value);continue}case 11:{if(o!==89)break;r.viewableDurationMs=t.double();continue}case 12:{if(o!==98)break;let s=We.decode(t,t.uint32());s!==void 0&&r.bidderOutcomes.push(s);continue}}if((o&7)===4||o===0)break;t.skip(o&7)}return r}};$e={encode(i,e=new F){return i.key!==""&&e.uint32(10).string(i.key),i.value!==""&&e.uint32(18).string(i.value),e},decode(i,e){let t=i instanceof B?i:new B(i),n=e===void 0?t.len:t.pos+e,r=Lt();for(;t.pos<n;){let o=t.uint32();switch(o>>>3){case 1:{if(o!==10)break;r.key=t.string();continue}case 2:{if(o!==18)break;r.value=t.string();continue}}if((o&7)===4||o===0)break;t.skip(o&7)}return r}};We={encode(i,e=new F){return i.adUnitCode!==void 0&&i.adUnitCode!==""&&e.uint32(18).string(i.adUnitCode),i.outcome!==void 0&&i.outcome!==0&&e.uint32(32).int32(i.outcome),i.bid!==void 0&&J.encode(i.bid,e.uint32(50).fork()).join(),i.refreshIndex!==void 0&&i.refreshIndex!==0&&e.uint32(56).int32(i.refreshIndex),e},decode(i,e){let t=i instanceof B?i:new B(i),n=e===void 0?t.len:t.pos+e,r=xt();for(;t.pos<n;){let o=t.uint32();switch(o>>>3){case 2:{if(o!==18)break;r.adUnitCode=t.string();continue}case 4:{if(o!==32)break;r.outcome=t.int32();continue}case 6:{if(o!==50)break;r.bid=J.decode(t,t.uint32());continue}case 7:{if(o!==56)break;r.refreshIndex=t.int32();continue}}if((o&7)===4||o===0)break;t.skip(o&7)}return r}};J={encode(i,e=new F){return i.bidder!==void 0&&i.bidder!==""&&e.uint32(10).string(i.bidder),i.cpm!==void 0&&i.cpm!==0&&e.uint32(17).double(i.cpm),i.currency!==void 0&&i.currency!==""&&e.uint32(26).string(i.currency),i.width!==void 0&&i.width!==0&&e.uint32(32).int32(i.width),i.height!==void 0&&i.height!==0&&e.uint32(40).int32(i.height),i.dealId!==void 0&&i.dealId!==""&&e.uint32(50).string(i.dealId),i.mediaType!==void 0&&i.mediaType!==""&&e.uint32(58).string(i.mediaType),i.latencyMs!==void 0&&i.latencyMs!==0&&e.uint32(65).double(i.latencyMs),i.advertiserDomain!==void 0&&i.advertiserDomain!==""&&e.uint32(74).string(i.advertiserDomain),i.creativeId!==void 0&&i.creativeId!==""&&e.uint32(82).string(i.creativeId),e},decode(i,e){let t=i instanceof B?i:new B(i),n=e===void 0?t.len:t.pos+e,r=kt();for(;t.pos<n;){let o=t.uint32();switch(o>>>3){case 1:{if(o!==10)break;r.bidder=t.string();continue}case 2:{if(o!==17)break;r.cpm=t.double();continue}case 3:{if(o!==26)break;r.currency=t.string();continue}case 4:{if(o!==32)break;r.width=t.int32();continue}case 5:{if(o!==40)break;r.height=t.int32();continue}case 6:{if(o!==50)break;r.dealId=t.string();continue}case 7:{if(o!==58)break;r.mediaType=t.string();continue}case 8:{if(o!==65)break;r.latencyMs=t.double();continue}case 9:{if(o!==74)break;r.advertiserDomain=t.string();continue}case 10:{if(o!==82)break;r.creativeId=t.string();continue}}if((o&7)===4||o===0)break;t.skip(o&7)}return r}}});function $(i){if(!i)return new Uint8Array(0);if(Dt.test(i)){let t=i.replace(/-/g,""),n=new Uint8Array(16);for(let r=0;r<16;r++)n[r]=parseInt(t.slice(r*2,r*2+2),16);return n}if(qe)return qe.encode(i);let e=new Uint8Array(i.length);for(let t=0;t<i.length;t++)e[t]=i.charCodeAt(t)&255;return e}var Dt,qe,Mn,He=_(()=>{"use strict";Dt=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/,qe=typeof TextEncoder<"u"?new TextEncoder:null,Mn=typeof TextDecoder<"u"?new TextDecoder:null});function H(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,i=>{let e=Math.random()*16|0;return(i==="x"?e:e&3|8).toString(16)})}function Yt(i){let e="";for(let n=0;n<i.length;n+=8192)e+=String.fromCharCode(...i.subarray(n,n+8192));return btoa(e)}function zt(i){let e=atob(i),t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n);return t}function Xt(i){if(!i)return!1;let e;try{e=new URL(i)}catch{return!1}return e.username||e.password?!1:e.protocol==="https:"?!0:e.protocol==="http:"?e.hostname==="localhost"||e.hostname==="127.0.0.1"||e.hostname==="[::1]":!1}function Qt(i){let e={},t=0;for(let n of Object.keys(i)){if(t>=Nt)break;let r=i[n];if(r==null)continue;let o=String(r);e[n]=o.length>Ke?`${o.slice(0,Ke)}...[truncated]`:o,t++}return e}function Zt(i){let e=i.slice(ee.length).split("_");return e.length===2&&/^\d+$/.test(e[0])}function Jt(i,e){if(!i||!e)return!1;try{return new URL(i).origin===new URL(e).origin}catch{return!1}}function Je(i){try{typeof localStorage<"u"&&(localStorage.setItem(Qe,i.toString()),q=i)}catch{}}function et(i=Date.now()){return N>0&&i-N<=Ze}function te(){let i=Date.now(),e=!!D&&!et(i);if(N=i,e){D=null;for(let t of nn)t();return}!K||!D||q===0||i-q<en||Je(i)}function rn(){return!D||K&&q===0}function on(){if(Xe||typeof window>"u")return;Xe=!0;let i=()=>te();for(let e of tn)window.addEventListener(e,i,{passive:!0,capture:!0});typeof document<"u"&&document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&te()})}function ge(){let i=Date.now(),e=!!D&&et(i);try{if(K&&typeof localStorage<"u"){let t=localStorage.getItem(ze),n=localStorage.getItem(Qe),r=n&&parseInt(n,10)||0;if(t&&r&&i-r<=Ze)return(D!==t||N<r)&&(D=t,N=Math.max(N,r)),q===0&&(q=r),t;let o=e?D:H();return e||(N=i),localStorage.setItem(ze,o),Je(N),D=o,o}}catch{}return e||(D=H(),N=i),D}function f(i){return String(i??"").replace(/%/g,"%25").replace(/:/g,"%3A")}function sn(i,e){switch(i){case"auctionInit":return`auctionInit:${f(e?.auctionId)}`;case"auctionEnd":return`auctionEnd:${f(e?.auctionId)}`;case"bidRequested":{let t=Array.isArray(e?.bids)?e.bids.map(n=>f(n?.bidId||n?.transactionId||n?.adUnitCode)).join(","):"";return`bidRequested:${f(e?.auctionId)}:${f(e?.bidderCode||e?.bidder)}:${t}`}case"bidResponse":{let t=e||{},n=t.creativeId||t.adId||t.requestId||t.bidId||"",r=t.originalCpm??t.cpm??"";return`bidResponse:${f(t.auctionId)}:${f(t.adUnitCode)}:${f(t.bidderCode||t.bidder)}:${f(n)}:${f(r)}`}case"bidTimeout":return"bidTimeout:"+(Array.isArray(e)?e:e?[e]:[]).map(n=>`${f(n?.auctionId)}:${f(n?.bidderCode||n?.bidder)}:${f(n?.bidId||n?.transactionId||n?.adUnitCode)}`).join(",");case"bidWon":{let t=e||{},n=t.creativeId||t.adId||t.requestId||t.bidId||"",r=t.originalCpm??t.cpm??"";return`bidWon:${f(t.auctionId)}:${f(t.adUnitCode)}:${f(t.bidderCode||t.bidder)}:${f(n)}:${f(r)}`}case"noBid":return`noBid:${f(e?.auctionId)}:${f(e?.adUnitCode)}:${f(e?.bidderCode||e?.bidder)}:${f(e?.bidId||e?.transactionId)}`;case"adRenderFailed":{let t=e?.bid||{};return`adRenderFailed:${f(t.auctionId||e?.auctionId)}:${f(t.adUnitCode||e?.adUnitCode)}:${f(t.bidderCode||t.bidder||e?.bidderCode||e?.bidder)}:${f(e?.reason)}:${f(e?.message)}`}case"adRenderSucceeded":{let t=e?.bid||e||{},n=t.creativeId||t.adId||e?.adId||"",r=t.originalCpm??t.cpm??"";return`adRenderSucceeded:${f(t.auctionId||e?.auctionId)}:${f(t.adUnitCode||e?.adUnitCode)}:${f(t.bidderCode||t.bidder)}:${f(n)}:${f(r)}`}case"setTargeting":return`setTargeting:${Object.keys(e||{}).sort().map(f).join(",")}`;case"auctionDebug":return`auctionDebug:${f(e?.type)}:${f(String(e?.arguments?.[0]??"").slice(0,50))}`;default:return""}}function W(i){if(Number.isFinite(i?.width)&&Number.isFinite(i?.height))return{width:i.width,height:i.height};if(typeof i?.size=="string"){let e=i.size.match(/^(\d+)x(\d+)$/);if(e)return{width:Number(e[1]),height:Number(e[2])}}return{width:Number.isFinite(i?.width)?i.width:0,height:Number.isFinite(i?.height)?i.height:0}}function G(i,e=!0){if(!i)return null;if(Array.isArray(i)){let t=i.find(n=>n?.provider==="bidkernel")??(e?i.find(n=>n&&typeof n=="object"&&n.provider===void 0):void 0);return t?G(t,e):null}if(typeof i=="object"){if(i.options&&typeof i.options=="object")return i.options;if(i.config&&typeof i.config=="object")return i.config;if(i.propertyId||i.endpoint)return i}return null}function dn(i){if(!i)return null;if(i._bidkernelAnalyticsConfig){let e=G(i._bidkernelAnalyticsConfig);if(e)return e}if(i.bidkernelPrebidAnalytics){let e=i.bidkernelPrebidAnalytics;if(e.options){let t=G(e.options);if(t)return t}if(e.config){let t=G(e.config);if(t)return t}if(e.propertyId)return G(e)}return null}function ve(i="pbjs",e){let t=typeof window<"u"?window:{};t[i]=t[i]||{};let n=t[i],r=s=>{let d=t._bidkernelPrebidAnalytics,a=d?.getEndpoint?.()||"",l={pbjsGlobalName:i,...e,...s};if(a&&!Jt(l.endpoint||"",a)&&(me.warn(`Ignoring analytics endpoint change to ${l.endpoint||"(empty)"}: this page is pinned to ${a}. Reload to change the ingest endpoint.`),l.endpoint=a),d)try{d.disable()}catch(b){me.warn("Failed to disable previous analytics instance:",b)}let c=new C(l);return c.enable(),t._bidkernelPrebidAnalytics=c,c},o=()=>{try{n.adapterManager&&typeof n.adapterManager.registerAnalyticsAdapter=="function"&&n.adapterManager.registerAnalyticsAdapter({adapter:{enableAnalytics:d=>{let a=G(d,!Array.isArray(d));a&&r(a)},disableAnalytics:()=>{t._bidkernelPrebidAnalytics&&t._bidkernelPrebidAnalytics.disable()}},code:"bidkernel"});let s=dn(t);s&&(s.propertyId||e?.propertyId)&&r(s)}catch(s){me.warn("Failed to register standard Prebid analytics adapter:",s)}};n.adapterManager&&typeof n.adapterManager.registerAnalyticsAdapter=="function"?o():(n.que=n.que||[],n.que.push(o))}var Ge,Ot,z,Mt,Ut,be,Ke,Nt,Ye,ee,Pt,Vt,Ft,$t,Wt,jt,j,qt,Ht,Gt,Kt,ze,Qe,Ze,D,N,K,en,q,tn,Xe,nn,Ie,C,me,Te=_(()=>{"use strict";Re();ye();He();Ge=1e4,Ot=50,z=200,Mt=300*1e3,Ut=10,be=32*1024,Ke=1024,Nt=16,Ye="text/plain",ee="_bidkernel_pending_",Pt=20,Vt=7200*1e3,Ft=1e4,$t={auctionStart:I.AUCTION_START,auctionEnd:I.AUCTION_END,bidWin:I.BID_WIN,adRenderFailed:I.AD_RENDER_FAILED,click:I.CLICK,impression:I.IMPRESSION,timeInView:I.TIME_IN_VIEW,viewable:I.VIEWABLE},Wt=3e3,jt=new Set([I.IMPRESSION,I.BID_WIN,I.CLICK]),j=1800*1e3,qt=200,Ht=1e3,Gt=50,Kt=1e3,ze="_bidkernel_session",Qe="_bidkernel_session_ts",Ze=1800*1e3,D=null,N=0,K=!0;en=60*1e3,q=0,tn=["pointerdown","pointermove","keydown","scroll","wheel","touchstart"],Xe=!1,nn=new Set;Ie=class{seenObjects=new WeakMap;seenKeys=new Set;isDuplicate(e,t){if(!t)return!1;if(typeof t=="object"){let r=this.seenObjects.get(t);if(r){if(r.has(e))return!0;r.add(e)}else this.seenObjects.set(t,new Set([e]))}let n=sn(e,t);if(n){if(this.seenKeys.has(n))return!0;if(this.seenKeys.size>=1e3){let r=this.seenKeys.values().next().value;r!==void 0&&this.seenKeys.delete(r)}this.seenKeys.add(n)}return!1}};C=class i{static activeInstances=new Set;static getActiveInstances(){return i.activeInstances}static setStorageAllowed(e){K=e,q=0}static isStorageAllowed(){return K}config;queue=[];errorCount=0;flushTimer=null;boundFlushBeacon;boundVisibilityChange;isEnabled=!1;boundPbjsHandlers=[];pageUrl="";deduper=new Ie;consecutiveSendFailures=0;nextSendAllowedAt=0;replayedEventCount=0;revenueFlushTimer=null;persistedBatchKeys=[];persistedCleanupTimer=null;intersectionObserver=null;slotViewabilityRecords=new Map;elementToSlotId=new Map;slotRefreshIndices=new Map;slotLastAuctionIds=new Map;pendingThresholdListeners=new Map;pendingViewableListeners=new Map;slotElements=new Map;clickDetachCleanups=new Set;lastClickAt=new Map;slotEmittedImpressionKeys=new Set;cachedWinningBids=new Map;videoDetachCleanups=new Set;auctionBidderOutcomes=new Map;logger;managesSessionId;constructor(e){e.storageAllowed!==void 0&&i.setStorageAllowed(e.storageAllowed);let t=e.endpoint||"",n=!t||Xt(t)?t:"";this.config={endpoint:n,propertyId:e.propertyId||"",pageviewId:e.pageviewId||H(),sessionId:e.sessionId||"",userId:e.userId||"",deviceType:e.deviceType||"desktop",country:e.country||"",region:e.region||"",auctionEnabled:e.auctionEnabled??!0,warningsEnabled:e.warningsEnabled??!0,errorsEnabled:e.errorsEnabled??!0,viewabilityEnabled:e.viewabilityEnabled??!0,storageAllowed:e.storageAllowed??!0,logLevel:e.logLevel||"INFO",pbjsGlobalName:e.pbjsGlobalName||"pbjs",attachPbjsListeners:e.attachPbjsListeners??!0,revenueFlushDelayMs:Number.isFinite(e.revenueFlushDelayMs)&&e.revenueFlushDelayMs>=0?e.revenueFlushDelayMs:Wt},this.logger=re({prefix:"[bidkernel][prebid-analytics]",logLevel:this.config.logLevel}),te(),this.managesSessionId=!e.sessionId,this.managesSessionId&&(this.config.sessionId=ge()),t&&!n&&this.log("ERROR",`Rejected untrusted analytics endpoint ${t}: must be an absolute https:// URL without embedded credentials. Events will not be transmitted.`),this.boundFlushBeacon=()=>{this.flushAllSlotsTimeInView(),this.flushBeacon()},this.boundVisibilityChange=()=>this.handleVisibilityChange()}enable(){if(!this.isEnabled){if(this.isEnabled=!0,i.activeInstances.add(this),this.logger.setLevel(this.config.logLevel),this.config.endpoint||this.log("WARN","Endpoint is empty. Analytics events will not be transmitted."),this.config.viewabilityEnabled&&typeof IntersectionObserver<"u"){this.intersectionObserver=new IntersectionObserver(this.handleIntersection.bind(this),{threshold:[.5]});for(let e of this.slotViewabilityRecords.values())e.element&&this.intersectionObserver.observe(e.element)}if(this.config.attachPbjsListeners&&this.attachPbjs(),typeof window<"u"){if(!this.pageUrl)try{let e=new URL(window.location.href);this.pageUrl=e.origin+e.pathname}catch{this.pageUrl=window.location.href}window.addEventListener("pagehide",this.boundFlushBeacon),typeof document<"u"&&document.addEventListener("visibilitychange",this.boundVisibilityChange),on(),this.flushTimer=setInterval(()=>this.flush(),Ge),this.resendPersistedBatches()}}}attachPbjs(){if(!this.isEnabled)return!1;if(this.boundPbjsHandlers.length>0)return!0;let t=(typeof window<"u"?window:{})[this.config.pbjsGlobalName]||{};if(typeof t.onEvent!="function")return this.log("WARN","pbjs.onEvent is not defined. Prebid analytics will not function."),!1;this.log("DEBUG","Attaching event listeners to pbjs");let n={auctionInit:this.handleAuctionInit.bind(this),auctionEnd:this.handleAuctionEnd.bind(this),bidRequested:this.handleBidRequested.bind(this),bidResponse:this.handleBidResponse.bind(this),bidTimeout:this.handleBidTimeout.bind(this),bidWon:this.handleBidWon.bind(this),noBid:this.handleNoBid.bind(this),adRenderFailed:this.handleAdRenderFailed.bind(this),adRenderSucceeded:this.handleAdRenderSucceeded.bind(this)};for(let[r,o]of Object.entries(n))t.onEvent(r,o),this.boundPbjsHandlers.push({event:r,handler:o});if(typeof t.getEvents=="function")try{let r=t.getEvents();if(Array.isArray(r)){let o=r.slice(this.replayedEventCount);if(this.replayedEventCount=r.length,o.length>0){this.log("DEBUG",`Replaying ${o.length} historical events from pbjs.getEvents()`);for(let s of o){if(!s)continue;let d=s.eventType||s.event||s.name,a=s.args!==void 0?s.args:s.data!==void 0?s.data:s,l=n[d];l&&l(a)}}}}catch(r){this.log("WARN","Failed to replay historical events from pbjs.getEvents()",r)}return!0}disable(){if(this.isEnabled){this.flushAllSlotsTimeInView(),this.isEnabled=!1,i.activeInstances.delete(this);for(let e of this.slotViewabilityRecords.values()){e.dwellTimer&&(clearTimeout(e.dwellTimer),e.dwellTimer=null,e.dwellStartedAt=null);for(let t of e.thresholdListeners)t.timer&&(clearTimeout(t.timer),t.timer=null)}this.intersectionObserver&&(this.intersectionObserver.disconnect(),this.intersectionObserver=null),this.slotViewabilityRecords.clear(),this.elementToSlotId.clear();for(let e of this.videoDetachCleanups)try{e()}catch{}this.videoDetachCleanups.clear();for(let e of Array.from(this.clickDetachCleanups))try{e()}catch{}if(this.clickDetachCleanups.clear(),this.slotElements.clear(),this.cachedWinningBids.clear(),this.slotEmittedImpressionKeys.clear(),this.slotLastAuctionIds.clear(),this.auctionBidderOutcomes.clear(),this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),this.revenueFlushTimer&&(clearTimeout(this.revenueFlushTimer),this.revenueFlushTimer=null),this.persistedCleanupTimer&&(clearTimeout(this.persistedCleanupTimer),this.persistedCleanupTimer=null),typeof window<"u"&&(window.removeEventListener("pagehide",this.boundFlushBeacon),typeof document<"u"&&document.removeEventListener("visibilitychange",this.boundVisibilityChange)),this.boundPbjsHandlers.length>0){let t=(typeof window<"u"?window:{})[this.config.pbjsGlobalName]||{};if(typeof t.offEvent=="function")for(let{event:n,handler:r}of this.boundPbjsHandlers)t.offEvent(n,r);this.boundPbjsHandlers=[]}this.flush()}}handleVisibilityChange(){if(!(typeof document>"u")){if(document.visibilityState==="hidden"){let e=typeof performance<"u"&&performance.now?performance.now():Date.now();for(let t of this.slotViewabilityRecords.values()){t.inView&&t.lastEnteredViewAt!==null&&(t.accumulatedTimeInViewMs+=Math.max(0,e-t.lastEnteredViewAt),t.lastEnteredViewAt=null,this.checkThresholdListeners(t)),t.dwellTimer&&(clearTimeout(t.dwellTimer),t.dwellTimer=null,t.dwellStartedAt=null);for(let r of t.thresholdListeners)r.timer&&(clearTimeout(r.timer),r.timer=null);let n=Math.round(t.accumulatedTimeInViewMs);n>0&&this.enqueue(I.TIME_IN_VIEW,"timeInView",{auctionId:t.auctionId,transactionId:t.transactionId,adUnitCode:t.adUnitCode,viewableDurationMs:n,bid:t.bidPayload,metadata:{...t.metadata,refresh_index:String(t.refreshIndex)}})}this.flushBeacon()}else if(document.visibilityState==="visible"){let e=typeof performance<"u"&&performance.now?performance.now():Date.now();for(let t of this.slotViewabilityRecords.values())if(t.inView){if(t.lastEnteredViewAt=e,!t.viewableFired&&t.dwellTimer===null){let n=t.mediaType==="video"?2e3:1e3;t.dwellStartedAt=e,t.dwellTimer=setTimeout(()=>{this.handleDwellComplete(t)},n)}this.scheduleThresholdTimers(t)}}}}handleIntersection(e){for(let t of e){let n=this.elementToSlotId.get(t.target);if(!n){for(let a of i.activeInstances)if(a!==this&&a.elementToSlotId.has(t.target)){a.handleIntersection([t]);break}continue}let r=this.slotViewabilityRecords.get(n);if(!r)continue;let o=t.isIntersecting&&(t.intersectionRatio===void 0||t.intersectionRatio>=.5),s=typeof document>"u"||document.visibilityState==="visible",d=typeof performance<"u"&&performance.now?performance.now():Date.now();if(o){if(!r.inView&&(r.inView=!0,s)){if(r.lastEnteredViewAt=d,!r.viewableFired&&r.dwellTimer===null){let a=r.mediaType==="video"?2e3:1e3;r.dwellStartedAt=d,r.dwellTimer=setTimeout(()=>{this.handleDwellComplete(r)},a)}this.scheduleThresholdTimers(r)}}else{r.inView&&(r.lastEnteredViewAt!==null&&(r.accumulatedTimeInViewMs+=Math.max(0,d-r.lastEnteredViewAt),r.lastEnteredViewAt=null),r.inView=!1,this.checkThresholdListeners(r)),r.dwellTimer!==null&&(clearTimeout(r.dwellTimer),r.dwellTimer=null,r.dwellStartedAt=null);for(let a of r.thresholdListeners)a.timer&&(clearTimeout(a.timer),a.timer=null)}}}handleDwellComplete(e){e.dwellTimer=null,e.dwellStartedAt=null,e.inView&&(typeof document<"u"&&document.visibilityState==="hidden"||(e.viewableFired||(e.viewableFired=!0,this.enqueue(I.VIEWABLE,"viewable",{auctionId:e.auctionId,transactionId:e.transactionId,adUnitCode:e.adUnitCode,bid:e.bidPayload,metadata:{...e.metadata,refresh_index:String(e.refreshIndex)}})),this.notifyViewable(e)))}notifyViewable(e){if(e.viewableFired){for(let t of e.viewableListeners)if(t.firedForIndex!==e.refreshIndex){t.firedForIndex=e.refreshIndex;try{t.callback(e.slotId)}catch(n){this.log("ERROR","Error in viewable listener callback",n)}}}}setSlotElement(e,t){this.slotElements.set(e,t);let n=this.slotViewabilityRecords.get(e);n&&n.element!==t&&this.observeSlot(t,e,{refreshIndex:n.refreshIndex})}recordClick(e,t){if(!this.isEnabled||!e)return!1;let n=Date.now();if(n-(this.lastClickAt.get(e)||0)<Kt)return!1;this.lastClickAt.set(e,n);let r=this.getCachedBid(e);return this.enqueue(I.CLICK,"click",{auctionId:r?.auctionId||"",transactionId:r?.transactionId||"",adUnitCode:e,bid:r?.bidTrace,metadata:{...t?.metadata,refresh_index:String(this.getRefreshIndex(e))}}),!0}attachClickTracker(e,t){if(typeof window>"u")return()=>{};let n=()=>{setTimeout(()=>{let o=document.activeElement;o&&(o===e||e.contains(o))&&(this.recordClick(t,{metadata:{source:"blur"}}),window.focus())},0)};window.addEventListener("blur",n);let r=()=>{window.removeEventListener("blur",n),this.clickDetachCleanups.delete(r)};return this.clickDetachCleanups.add(r),r}onViewable(e,t){let n={callback:t,firedForIndex:-1},r=this.slotViewabilityRecords.get(e);return r?(r.viewableListeners.add(n),this.notifyViewable(r)):(this.pendingViewableListeners.has(e)||this.pendingViewableListeners.set(e,new Set),this.pendingViewableListeners.get(e).add(n)),()=>{this.slotViewabilityRecords.get(e)?.viewableListeners.delete(n),this.pendingViewableListeners.get(e)?.delete(n)}}scheduleThresholdTimers(e){if(!e.inView||typeof document<"u"&&document.visibilityState==="hidden")return;let t=this.getCurrentTimeInView(e);for(let n of e.thresholdListeners)if(!n.fired)if(t>=n.thresholdMs){n.fired=!0,n.timer&&(clearTimeout(n.timer),n.timer=null);try{n.callback(e.slotId,t)}catch(r){this.log("ERROR","Error in threshold listener callback",r)}}else{n.timer&&clearTimeout(n.timer);let r=n.thresholdMs-t;n.timer=setTimeout(()=>{if(n.timer=null,!n.fired&&e.inView&&(typeof document>"u"||document.visibilityState==="visible")){let o=this.getCurrentTimeInView(e);if(o>=n.thresholdMs){n.fired=!0;try{n.callback(e.slotId,o)}catch(s){this.log("ERROR","Error in threshold listener callback",s)}}}},r)}}checkThresholdListeners(e){let t=this.getCurrentTimeInView(e);for(let n of e.thresholdListeners)if(!n.fired&&t>=n.thresholdMs){n.fired=!0,n.timer&&(clearTimeout(n.timer),n.timer=null);try{n.callback(e.slotId,t)}catch(r){this.log("ERROR","Error in threshold listener callback",r)}}}getCurrentTimeInView(e){let t=e.accumulatedTimeInViewMs;if(e.inView&&e.lastEnteredViewAt!==null){let n=typeof performance<"u"&&performance.now?performance.now():Date.now();t+=Math.max(0,n-e.lastEnteredViewAt)}return t}flushSlotTimeInView(e){let t=this.slotViewabilityRecords.get(e);if(!t)return;if(t.inView&&t.lastEnteredViewAt!==null){let r=typeof performance<"u"&&performance.now?performance.now():Date.now();t.accumulatedTimeInViewMs+=Math.max(0,r-t.lastEnteredViewAt),t.lastEnteredViewAt=null}let n=Math.round(t.accumulatedTimeInViewMs);n>0&&this.enqueue(I.TIME_IN_VIEW,"timeInView",{auctionId:t.auctionId,transactionId:t.transactionId,adUnitCode:t.adUnitCode,viewableDurationMs:n,bid:t.bidPayload,metadata:{...t.metadata,refresh_index:String(t.refreshIndex)}}),t.accumulatedTimeInViewMs=0}flushAllSlotsTimeInView(){for(let e of Array.from(this.slotViewabilityRecords.keys()))this.flushSlotTimeInView(e)}observeSlot(e,t,n){if(!this.config.viewabilityEnabled)return;let r=null;if(typeof e=="string"){if(typeof document<"u"){try{r=document.querySelector(e)||document.getElementById(e)}catch{r=document.getElementById(e)}r||(r=document.getElementById(e))}}else r=e;let o=t||n?.adUnitCode||(r?r.id:"")||H(),s=this.slotViewabilityRecords.get(o);if(s){if(n?.refreshIndex===void 0||n.refreshIndex>s.refreshIndex){this.flushSlotTimeInView(o);let a=n?.refreshIndex!==void 0?n.refreshIndex:(this.slotRefreshIndices.get(o)??s.refreshIndex)+1;this.slotRefreshIndices.set(o,a),s.dwellTimer&&(clearTimeout(s.dwellTimer),s.dwellTimer=null,s.dwellStartedAt=null);for(let c of s.thresholdListeners)c.fired=!1,c.timer&&(clearTimeout(c.timer),c.timer=null);s.viewableFired=!1,s.accumulatedTimeInViewMs=0;let l=typeof performance<"u"&&performance.now?performance.now():Date.now();if(s.lastEnteredViewAt=s.inView?l:null,s.refreshIndex=a,s.auctionId=n?.auctionId||s.auctionId,s.transactionId=n?.transactionId||s.transactionId,s.mediaType=n?.mediaType||s.mediaType||"banner",s.bidPayload=n?.bid!==void 0?n.bid:s.bidPayload,s.metadata=n?.metadata??s.metadata,s.inView&&(typeof document>"u"||document.visibilityState==="visible")){let c=s.mediaType==="video"?2e3:1e3;s.dwellStartedAt=l,s.dwellTimer=setTimeout(()=>{this.handleDwellComplete(s)},c),this.scheduleThresholdTimers(s)}}else s.auctionId=n?.auctionId||s.auctionId,s.transactionId=n?.transactionId||s.transactionId,s.mediaType=n?.mediaType||s.mediaType,n?.bid!==void 0&&(s.bidPayload=n.bid),n?.metadata!==void 0&&(s.metadata=n.metadata);n?.auctionId&&this.slotLastAuctionIds.set(o,n.auctionId),r&&(s.element&&s.element!==r&&this.intersectionObserver&&(this.intersectionObserver.unobserve(s.element),this.elementToSlotId.delete(s.element)),s.element=r,this.elementToSlotId.set(r,o),this.intersectionObserver?.observe(r))}else{let d=n?.refreshIndex??this.slotRefreshIndices.get(o)??0;this.slotRefreshIndices.set(o,d),n?.auctionId&&this.slotLastAuctionIds.set(o,n.auctionId);let a=this.pendingThresholdListeners.get(o)||new Set;this.pendingThresholdListeners.delete(o);let l=this.pendingViewableListeners.get(o)||new Set;this.pendingViewableListeners.delete(o);let c={slotId:o,element:r,adUnitCode:n?.adUnitCode||o,auctionId:n?.auctionId||"",transactionId:n?.transactionId||"",mediaType:n?.mediaType||"banner",bidPayload:n?.bid,metadata:n?.metadata,refreshIndex:d,inView:!1,lastEnteredViewAt:null,accumulatedTimeInViewMs:0,viewableFired:!1,dwellTimer:null,dwellStartedAt:null,thresholdListeners:a,viewableListeners:l};this.slotViewabilityRecords.set(o,c),r&&(this.elementToSlotId.set(r,o),this.intersectionObserver?.observe(r))}}unobserveSlot(e){let t=this.slotViewabilityRecords.get(e);if(t){this.flushSlotTimeInView(e),t.dwellTimer&&(clearTimeout(t.dwellTimer),t.dwellTimer=null,t.dwellStartedAt=null);for(let n of t.thresholdListeners)n.timer&&(clearTimeout(n.timer),n.timer=null);t.thresholdListeners=new Set,t.viewableListeners=new Set,t.element&&this.intersectionObserver&&(this.intersectionObserver.unobserve(t.element),this.elementToSlotId.delete(t.element),t.element=null),t.inView=!1,t.lastEnteredViewAt=null}}destroySlot(e){this.unobserveSlot(e),this.slotViewabilityRecords.delete(e),this.slotRefreshIndices.delete(e),this.slotLastAuctionIds.delete(e),this.pendingThresholdListeners.delete(e),this.pendingViewableListeners.delete(e);let t=`${f(e)}:`;for(let r of Array.from(this.slotEmittedImpressionKeys))(r===e||r.startsWith(t))&&this.slotEmittedImpressionKeys.delete(r);let n=this.cachedWinningBids.get(e);n&&this.deleteCachedBidEntry(n)}getCachedBid(e){let t=this.cachedWinningBids.get(e);if(t){if(Date.now()-t.timestamp>j){this.deleteCachedBidEntry(t);return}return t}}deleteCachedBidEntry(e){for(let[t,n]of Array.from(this.cachedWinningBids))n===e&&this.cachedWinningBids.delete(t)}pruneCachedWinningBids(){let e=Date.now();for(let[t,n]of Array.from(this.cachedWinningBids))e-n.timestamp>j&&this.cachedWinningBids.delete(t);for(;this.cachedWinningBids.size>qt;){let t=this.cachedWinningBids.keys().next();if(t.done)break;this.cachedWinningBids.delete(t.value)}}addImpressionKey(e){if(!this.slotEmittedImpressionKeys.has(e)){for(;this.slotEmittedImpressionKeys.size>=Ht;){let t=this.slotEmittedImpressionKeys.values().next();if(t.done)break;this.slotEmittedImpressionKeys.delete(t.value)}this.slotEmittedImpressionKeys.add(e)}}getOrCreateAuctionOutcomes(e){let t=this.auctionBidderOutcomes.get(e);for(t||(t=new Map,this.auctionBidderOutcomes.set(e,t));this.auctionBidderOutcomes.size>Gt;){let n=this.auctionBidderOutcomes.keys().next();if(n.done||n.value===e)break;this.auctionBidderOutcomes.delete(n.value)}return t}hasImpressionEmitted(e,t,n,r){let o=t??this.slotRefreshIndices.get(e)??0,s=`${f(e)}:${o}`;return r?n?this.slotEmittedImpressionKeys.has(`${s}:auc:${f(n)}:${f(r)}`)||this.slotEmittedImpressionKeys.has(`${s}:${f(r)}`):this.slotEmittedImpressionKeys.has(`${s}:${f(r)}`):n?this.slotEmittedImpressionKeys.has(`${s}:auc:${f(n)}`):this.slotEmittedImpressionKeys.has(s)}markImpressionEmitted(e,t,n,r){let o=`${f(e)}:${t}`;this.addImpressionKey(o),r&&this.addImpressionKey(`${o}:${f(r)}`),n&&(this.addImpressionKey(`${o}:auc:${f(n)}`),r&&this.addImpressionKey(`${o}:auc:${f(n)}:${f(r)}`))}recordImpression(e,t){if(!this.isEnabled)return!1;let n=e||t?.adUnitCode||"",r=t?.adUnitCode||n,o=(t?.auctionId&&n?this.getCachedBid(`${t.auctionId}:${n}`):void 0)||(t?.auctionId&&r?this.getCachedBid(`${t.auctionId}:${r}`):void 0)||(n?this.getCachedBid(n):void 0)||(r?this.getCachedBid(r):void 0),s=t?.bid||o?.rawBid||{},d=t?.auctionId||s.auctionId||o?.auctionId||"",a=t?.transactionId||s.transactionId||o?.transactionId||"",l=s.creativeId||o?.bidTrace?.creativeId||t?.bid?.creativeId||"",c=t?.mediaType||s.mediaType||o?.bidTrace?.mediaType||"banner",b=n||r,h=(n?this.slotViewabilityRecords.get(n):void 0)||(r?this.slotViewabilityRecords.get(r):void 0),m=b?this.slotLastAuctionIds.get(b)||(h?h.auctionId:void 0):void 0,A=!!(b&&d&&m&&m!==d&&t?.refreshIndex===void 0),p={bidder:s.bidderCode||s.bidder||o?.bidTrace?.bidder||"",cpm:Number.isFinite(s.originalCpm)?s.originalCpm:Number.isFinite(s.cpm)?s.cpm:o?.bidTrace?.cpm??0,currency:s.originalCurrency??s.currency??o?.bidTrace?.currency??"USD",...W(s).width?W(s):o?.bidTrace?{width:o.bidTrace.width,height:o.bidTrace.height}:W(s),dealId:s.dealId||o?.bidTrace?.dealId||"",mediaType:c,latencyMs:Number.isFinite(s.timeToRespond)?s.timeToRespond:o?.bidTrace?.latencyMs??0,advertiserDomain:s.meta?.advertiserDomains?.[0]||o?.bidTrace?.advertiserDomain||"",creativeId:s.creativeId||o?.bidTrace?.creativeId||""};if(A&&b){this.flushSlotTimeInView(b);let L=(this.slotRefreshIndices.get(b)??(h?h.refreshIndex:0))+1;this.slotRefreshIndices.set(b,L),this.slotLastAuctionIds.set(b,d),h&&(h.refreshIndex=L,h.auctionId=d,h.transactionId=a,h.bidPayload=p,h.viewableFired=!1,h.accumulatedTimeInViewMs=0)}else b&&(d&&this.slotLastAuctionIds.set(b,d),this.slotRefreshIndices.has(b)||this.slotRefreshIndices.set(b,0));let E=t?.refreshIndex??(n?this.slotRefreshIndices.get(n)??(r?this.slotRefreshIndices.get(r):void 0)??(h?h.refreshIndex:0):0);return n&&this.hasImpressionEmitted(n,E,d,l)||r&&r!==n&&this.hasImpressionEmitted(r,E,d,l)?(this.log("DEBUG",`Impression already emitted for slot ${n||r} in cycle ${E}`),!1):(n&&this.markImpressionEmitted(n,E,d,l),r&&r!==n&&this.markImpressionEmitted(r,E,d,l),this.enqueue(I.IMPRESSION,"impression",{auctionId:d,transactionId:a,adUnitCode:r,bid:p,metadata:{...t?.metadata,refresh_index:String(E)}}),h&&(!h.bidPayload&&p&&(h.bidPayload=p),!h.auctionId&&d&&(h.auctionId=d),!h.transactionId&&a&&(h.transactionId=a)),!0)}onTimeInViewThreshold(e,t,n){let r={thresholdMs:t,callback:n,timer:null,fired:!1},o=this.slotViewabilityRecords.get(e);if(o){o.thresholdListeners.add(r);let s=this.getCurrentTimeInView(o);if(s>=t){r.fired=!0;try{n(e,s)}catch(d){this.log("ERROR","Error in threshold callback",d)}}else if(o.inView&&(typeof document>"u"||document.visibilityState==="visible")){let d=t-s;r.timer=setTimeout(()=>{if(r.timer=null,!r.fired&&o.inView&&(typeof document>"u"||document.visibilityState==="visible")){let a=this.getCurrentTimeInView(o);if(a>=t){r.fired=!0;try{n(e,a)}catch(l){this.log("ERROR","Error in threshold callback",l)}}}},d)}}else this.pendingThresholdListeners.has(e)||this.pendingThresholdListeners.set(e,new Set),this.pendingThresholdListeners.get(e).add(r);return()=>{r.timer&&(clearTimeout(r.timer),r.timer=null),o&&o.thresholdListeners.delete(r);let s=this.pendingThresholdListeners.get(e);s&&s.delete(r)}}getViewabilityState(e){let t=this.slotViewabilityRecords.get(e);if(!t)return;let n=Math.round(this.getCurrentTimeInView(t));return{inView:t.inView,viewable:t.viewableFired,timeInViewMs:n,refreshIndex:t.refreshIndex}}getEndpoint(){return this.config.endpoint}getRefreshIndex(e){return this.slotRefreshIndices.get(e)??0}triggerSlotRefresh(e,t){let n=this.slotViewabilityRecords.get(e);n&&n.element&&this.observeSlot(n.element,e,t)}trackRawEvent(e,t,n){let r=$t[t]??(e==="ERROR"?I.ERROR:void 0);r!==void 0&&this.enqueue(r,t,n,e)}setUserId(e){this.config.userId=e}setSessionId(e){this.config.sessionId=e,this.managesSessionId=!e,this.managesSessionId&&(this.config.sessionId=ge())}navigate(e,t){if(this.disable(),this.slotRefreshIndices.clear(),this.pendingThresholdListeners.clear(),this.config.pageviewId=e||H(),t)try{let n=new URL(t);this.pageUrl=n.origin+n.pathname}catch{this.pageUrl=t}else this.pageUrl="";this.logger.resetTiming(),te(),this.enable()}handleAuctionInit(e){if(this.isDuplicate("auctionInit",e))return;this.log("DEBUG","auctionInit",e);let t=e.auctionId||"";t&&(this.auctionBidderOutcomes.delete(t),this.getOrCreateAuctionOutcomes(t)),this.enqueue(I.AUCTION_START,"auctionStart",{auctionId:t,transactionId:e.transactionId||""})}handleAuctionEnd(e){if(this.isDuplicate("auctionEnd",e))return;this.log("DEBUG","auctionEnd",e);let t=e.auctionId||"",n=t?this.auctionBidderOutcomes.get(t):void 0,r=n?Array.from(n.values()):[];t&&this.auctionBidderOutcomes.delete(t),this.enqueue(I.AUCTION_END,"auctionEnd",{auctionId:t,transactionId:e.transactionId||"",bidderOutcomes:r})}auctionCycleIndex(e){if(!e)return 0;let t=this.slotRefreshIndices.get(e)??this.slotViewabilityRecords.get(e)?.refreshIndex;return t===void 0?0:t+1}handleBidRequested(e){if(this.isDuplicate("bidRequested",e))return;this.log("DEBUG","bidRequested",e);let t=e.auctionId||"",n=e.bidderCode||e.bidder||"";if(!t||!n)return;let r=this.getOrCreateAuctionOutcomes(t);Array.isArray(e.bids)&&e.bids.forEach(o=>{let s=o.adUnitCode||"",d=Object.keys(o.mediaTypes||{}),a=d.length>0?d[0]:o.mediaType||"banner",l=`${n}:${s}`;r.has(l)||r.set(l,{adUnitCode:s,outcome:U.BIDDER_OUTCOME_NO_RESPONSE,bid:{bidder:n,mediaType:a,latencyMs:0}})})}handleBidResponse(e){if(this.isDuplicate("bidResponse",e))return;this.log("DEBUG","bidResponse",e);let t=e.auctionId||"",n=e.bidderCode||e.bidder||"",r=e.adUnitCode||"",o=Number.isFinite(e.originalCpm)?e.originalCpm:Number.isFinite(e.cpm)?e.cpm:0,s=Number.isFinite(e.timeToRespond)?e.timeToRespond:0,d=Object.keys(e.mediaTypes||{}),a=e.mediaType||(e.mediaTypes?.video?"video":d.length>0?d[0]:"banner");if(!t||!n)return;let l=o>0?{bidder:n,cpm:o,currency:e.originalCurrency??e.currency??"USD",...W(e),dealId:e.dealId||"",mediaType:a,latencyMs:s,advertiserDomain:e.meta?.advertiserDomains?.[0]||"",creativeId:e.creativeId||""}:{bidder:n,mediaType:a,latencyMs:s};this.getOrCreateAuctionOutcomes(t).set(`${n}:${r}`,{adUnitCode:r,outcome:o>0?U.BIDDER_OUTCOME_BID:U.BIDDER_OUTCOME_NO_BID,bid:l})}handleBidTimeout(e){if(this.isDuplicate("bidTimeout",e))return;this.log("DEBUG","bidTimeout",e);let t=Array.isArray(e)?e:e?[e]:[];for(let n of t){let r=n.auctionId||"",o=n.bidderCode||n.bidder||"",s=n.adUnitCode||"",d=Number.isFinite(n.timeout)?n.timeout:0;if(r&&o){let a=this.getOrCreateAuctionOutcomes(r),l=`${o}:${s}`,c=a.get(l);c?(c.outcome=U.BIDDER_OUTCOME_TIMEOUT,d>0&&c.bid&&(c.bid.latencyMs=d)):a.set(l,{adUnitCode:s,outcome:U.BIDDER_OUTCOME_TIMEOUT,bid:{bidder:o,mediaType:"banner",latencyMs:d}})}}}handleBidWon(e){if(this.isDuplicate("bidWon",e))return;this.log("DEBUG","bidWon",e);let t=e.auctionId||"",n=e.transactionId||"",r=e.adUnitCode||e.adId||"",o=Object.keys(e.mediaTypes||{}),s=e.mediaType||(e.mediaTypes?.video?"video":o.length>0?o[0]:"banner"),d={bidder:e.bidderCode||e.bidder||"",cpm:Number.isFinite(e.originalCpm)?e.originalCpm:Number.isFinite(e.cpm)?e.cpm:0,currency:e.originalCurrency??e.currency??"USD",...W(e),dealId:e.dealId||"",mediaType:s,latencyMs:Number.isFinite(e.timeToRespond)?e.timeToRespond:0,advertiserDomain:e.meta?.advertiserDomains?.[0]||"",creativeId:e.creativeId||""};if(r){let a={bidTrace:d,auctionId:t,transactionId:n,adUnitCode:r,rawBid:e,timestamp:Date.now()};this.cachedWinningBids.set(r,a),e.adId&&e.adId!==r&&this.cachedWinningBids.set(e.adId,a),t&&(this.cachedWinningBids.set(`${t}:${r}`,a),e.adId&&e.adId!==r&&this.cachedWinningBids.set(`${t}:${e.adId}`,a)),this.pruneCachedWinningBids()}this.enqueue(I.BID_WIN,"bidWon",{auctionId:t,transactionId:n,adUnitCode:r,bid:d})}handleNoBid(e){if(this.isDuplicate("noBid",e))return;this.log("DEBUG","noBid",e);let t=e.auctionId||"",n=e.bidderCode||e.bidder||"",r=e.adUnitCode||"";if(t&&n){let o=this.getOrCreateAuctionOutcomes(t),s=`${n}:${r}`,d=o.get(s);d?d.outcome===U.BIDDER_OUTCOME_NO_RESPONSE&&(d.outcome=U.BIDDER_OUTCOME_NO_BID):o.set(s,{adUnitCode:r,outcome:U.BIDDER_OUTCOME_NO_BID,bid:{bidder:n,mediaType:"banner",latencyMs:0}})}}handleAdRenderFailed(e){if(this.isDuplicate("adRenderFailed",e))return;this.log("DEBUG","adRenderFailed",e);let t=e.bid||{};this.enqueue(I.AD_RENDER_FAILED,"adRenderFailed",{auctionId:t.auctionId||e.auctionId||"",transactionId:t.transactionId||e.transactionId||"",adUnitCode:t.adUnitCode||e.adUnitCode||"",bid:{bidder:t.bidderCode||t.bidder||e.bidderCode||e.bidder||""},metadata:{reason:String(e.reason||""),message:String(e.message||e.error?.message||"")},error:e.error||(e.message?new Error(String(e.message)):void 0)})}handleAdRenderSucceeded(e){if(this.isDuplicate("adRenderSucceeded",e))return;this.log("DEBUG","adRenderSucceeded",e);let t=e.bid||e||{},n=e.adUnitCode||t.adUnitCode||e.adId||t.adId||"",r=t.auctionId||e.auctionId||"",o=t.transactionId||e.transactionId||"",s=t.mediaType||"banner",d=e.adUnitCode||t.adUnitCode||"",a=e.adId||t.adId||"",l=(r&&d?this.getCachedBid(`${r}:${d}`):void 0)||(r&&a?this.getCachedBid(`${r}:${a}`):void 0)||(d?this.getCachedBid(d):void 0)||(a?this.getCachedBid(a):void 0),c=s==="video"||t.mediaType==="video"||t.mediaTypes?.video!==void 0||l?.bidTrace?.mediaType==="video"||l?.rawBid?.mediaType==="video"||n&&this.slotViewabilityRecords.get(n)?.mediaType==="video",b=c?"video":s||l?.bidTrace?.mediaType||"banner",h={bidder:t.bidderCode||t.bidder||l?.bidTrace?.bidder||"",cpm:Number.isFinite(t.originalCpm)?t.originalCpm:Number.isFinite(t.cpm)?t.cpm:l?.bidTrace?.cpm??0,currency:t.originalCurrency??t.currency??l?.bidTrace?.currency??"USD",...W(t).width?W(t):l?.bidTrace?{width:l.bidTrace.width,height:l.bidTrace.height}:W(t),dealId:t.dealId||l?.bidTrace?.dealId||"",mediaType:b,latencyMs:Number.isFinite(t.timeToRespond)?t.timeToRespond:l?.bidTrace?.latencyMs??0,advertiserDomain:t.meta?.advertiserDomains?.[0]||l?.bidTrace?.advertiserDomain||"",creativeId:t.creativeId||l?.bidTrace?.creativeId||""},m=r||l?.auctionId||"",A=o||l?.transactionId||"",p=n?this.slotViewabilityRecords.get(n):void 0,E=p&&m&&p.auctionId&&p.auctionId!==m;if(!!(n&&p&&E)){this.flushSlotTimeInView(n);let T=(this.slotRefreshIndices.get(n)??(p?p.refreshIndex:0))+1;this.slotRefreshIndices.set(n,T),this.slotLastAuctionIds.set(n,m),p&&(p.refreshIndex=T,p.auctionId=m,p.transactionId=A,p.bidPayload=h,p.viewableFired=!1,p.accumulatedTimeInViewMs=0)}else n&&(m&&this.slotLastAuctionIds.set(n,m),this.slotRefreshIndices.has(n)||this.slotRefreshIndices.set(n,0));let L=n?this.slotRefreshIndices.get(n)??(p?p.refreshIndex:0):0;if(c?this.log("DEBUG",`adRenderSucceeded received for video ad unit ${n||"unknown"}: suppressing IMPRESSION until verified video lifecycle event`):n&&this.hasImpressionEmitted(n,L,m,h.creativeId)||(n&&this.markImpressionEmitted(n,L,m,h.creativeId),this.enqueue(I.IMPRESSION,"impression",{auctionId:m,transactionId:A,adUnitCode:n,bid:h,metadata:{refresh_index:String(L)}})),this.config.viewabilityEnabled&&typeof document<"u"){let T=n&&this.slotElements.get(n)||null,x=n||e.adId||t.adId;if(!T&&x&&(T=document.getElementById(x)),!T&&typeof window<"u"&&window.googletag?.pubads)try{let k=window.googletag.pubads().getSlots();for(let g of k)if((g.getAdUnitPath?.()===n||g.getSlotElementId?.()===n)&&(T=document.getElementById(g.getSlotElementId()),T))break}catch{}if(!T&&x)try{for(let k of Array.from(document.querySelectorAll("[data-ad-slot]")))if(k.getAttribute("data-ad-slot")===x){T=k;break}}catch{}T&&this.observeSlot(T,n||x,{adUnitCode:n,auctionId:m,transactionId:A,mediaType:b,bid:h,refreshIndex:L})}}isDuplicate(e,t){return this.deduper.isDuplicate(e,t)}enqueue(e,t,n,r){if(!this.isEnabled||!this.shouldSample(e,r))return;this.managesSessionId&&rn()&&(this.config.sessionId=ge());let o={eventId:$(H()),timestampMs:Date.now(),type:e,eventName:e===I.ERROR?t:"",auctionId:$(String(n.auctionId||"")),transactionId:$(String(n.transactionId||"")),adUnitCode:n.adUnitCode||n.elementId||"",namespace:n.ns||n.namespace||""};n.bid&&(o.bid={bidder:n.bid.bidder||"",cpm:Number.isFinite(n.bid.cpm)?n.bid.cpm:0,currency:n.bid.currency||"",width:Number.isFinite(n.bid.width)?n.bid.width:0,height:Number.isFinite(n.bid.height)?n.bid.height:0,dealId:n.bid.dealId||"",mediaType:n.bid.mediaType||"",latencyMs:Number.isFinite(n.bid.latencyMs)?n.bid.latencyMs:0,advertiserDomain:n.bid.advertiserDomain||"",creativeId:n.bid.creativeId||""}),n.viewableDurationMs!==void 0&&(o.viewableDurationMs=Number.isFinite(n.viewableDurationMs)?n.viewableDurationMs:0),n.bidderOutcomes&&Array.isArray(n.bidderOutcomes)&&(o.bidderOutcomes=n.bidderOutcomes.map(a=>({...a,refreshIndex:a.refreshIndex??this.auctionCycleIndex(a.adUnitCode||"")})));let s={...n.metadata};n.error!==void 0&&n.error!==null&&(s.error=typeof n.error=="object"&&n.error.message?String(n.error.message):String(n.error)),n.gpid&&(s.gpid=String(n.gpid)),n.refreshIndex!==void 0&&s.refresh_index===void 0&&(s.refresh_index=String(n.refreshIndex));let d=Qt(s);Object.keys(d).length>0&&(o.metadata=d),this.queue.push(o),this.queue.length>=z?(this.flush(),this.queue.length>z&&this.queue.splice(0,this.queue.length-z)):jt.has(e)&&this.revenueFlushTimer===null&&(this.revenueFlushTimer=setTimeout(()=>{this.revenueFlushTimer=null,this.flush()},this.config.revenueFlushDelayMs))}shouldSample(e,t){return e===I.ERROR?(this.errorCount++,this.errorCount>Ot?!1:this.config.errorsEnabled):t==="WARN"?this.config.warningsEnabled:this.config.auctionEnabled}requeue(e){e.length&&(this.queue=e.concat(this.queue),this.queue.length>z&&this.queue.splice(0,this.queue.length-z))}drainBatch(){if(this.queue.length===0||!this.config.endpoint)return null;let e=typeof window<"u"?window.location.hostname:"",t=n=>({propertyId:$(this.config.propertyId),pageviewId:$(this.config.pageviewId),sessionId:$(this.config.sessionId),pageUrl:this.pageUrl,country:this.config.country,region:this.config.region,deviceType:this.config.deviceType,userId:$(this.config.userId),domain:e,events:n});for(;;){if(this.queue.length===0)return null;let n=this.queue,r=pe.encode(t(n)).finish();for(;n.length>1&&r.byteLength>be;)n=n.slice(0,Math.floor(n.length/2)),r=pe.encode(t(n)).finish();if(r.byteLength>be){let[o]=this.queue.splice(0,1);this.log("WARN",`Dropping oversized event (type ${o?.type}, ${r.byteLength} bytes exceeds the ${be}-byte cap on its own)`);continue}return this.queue=this.queue.slice(n.length),{url:`${this.config.endpoint}/${this.config.propertyId}`,encoded:r,events:n}}}sendFetch(e,t=!1,n,r=!1){let o={method:"POST",headers:{"Content-Type":Ye},body:e.encoded};t&&(o.keepalive=!0),fetch(e.url,o).then(d=>{if(d.ok)r||(this.consecutiveSendFailures=0,this.nextSendAllowedAt=0),n&&n();else{if(this.log("WARN",`Failed to send batch: HTTP ${d.status}`),d.status>=400&&d.status<500&&d.status!==429&&d.status!==408){this.log("WARN",`Dropping batch due to non-retryable client error HTTP ${d.status}`);return}r||this.handleSendFailure(e.events)}}).catch(d=>{this.log("ERROR","Failed to send batch",d),r||this.handleSendFailure(e.events)});let s=typeof globalThis<"u"?globalThis.process:void 0;if(s&&typeof s._tickCallback=="function")try{s._tickCallback()}catch{}}handleSendFailure(e){this.consecutiveSendFailures++;let t=Math.min(Ge*2**(this.consecutiveSendFailures-1),Mt);this.nextSendAllowedAt=Date.now()+t,this.consecutiveSendFailures<=Ut?this.requeue(e):this.log("WARN",`Dropping ${e.length} events after ${this.consecutiveSendFailures} consecutive send failures`)}flush(){if(Date.now()<this.nextSendAllowedAt)return;let e=this.drainBatch();for(;e&&(this.sendFetch(e,!1),!(Date.now()<this.nextSendAllowedAt));)e=this.drainBatch()}flushBeacon(){let e=this.drainBatch();for(;e;){let t=!1;if(typeof navigator<"u"&&typeof navigator.sendBeacon=="function")try{let n=new Blob([e.encoded],{type:Ye});t=navigator.sendBeacon(e.url,n)}catch{t=!1}if(!t){let n=this.persistBatch(e.encoded);this.sendFetch(e,!0,()=>this.removePersistedBatch(n))}e=this.drainBatch()}this.schedulePersistedCleanup()}pendingKeyPrefix(){return`${ee}${encodeURIComponent(this.config.propertyId)}_`}persistBatch(e){if(!K)return null;try{if(typeof localStorage>"u"||!this.config.propertyId)return null;let t=0;for(let r=0;r<localStorage.length;r++){let o=localStorage.key(r);o&&o.startsWith(ee)&&t++}if(t>=Pt)return null;let n=`${this.pendingKeyPrefix()}${Date.now()}_${Math.floor(Math.random()*1e6)}`;return localStorage.setItem(n,Yt(e)),this.persistedBatchKeys.push(n),n}catch{return null}}removePersistedBatch(e){if(!e)return;try{typeof localStorage<"u"&&localStorage.removeItem(e)}catch{}let t=this.persistedBatchKeys.indexOf(e);t!==-1&&this.persistedBatchKeys.splice(t,1)}schedulePersistedCleanup(){this.persistedBatchKeys.length!==0&&(this.persistedCleanupTimer&&clearTimeout(this.persistedCleanupTimer),this.persistedCleanupTimer=setTimeout(()=>{this.persistedCleanupTimer=null;for(let e of Array.from(this.persistedBatchKeys))this.removePersistedBatch(e)},Ft))}resendPersistedBatches(){try{if(typeof localStorage>"u"||!this.config.endpoint||!this.config.propertyId)return;let e=this.pendingKeyPrefix(),t=[],n=[];for(let r=0;r<localStorage.length;r++){let o=localStorage.key(r);!o||!o.startsWith(ee)||(o.startsWith(e)?t.push(o):Zt(o)&&n.push(o))}for(let r of n)try{localStorage.removeItem(r)}catch{}for(let r of t){let o=null;try{o=localStorage.getItem(r),localStorage.removeItem(r)}catch{continue}if(!o)continue;let s=parseInt(r.slice(e.length),10);if(!Number.isFinite(s)||Date.now()-s>Vt)continue;let d;try{d=zt(o)}catch{continue}d.byteLength!==0&&(this.log("DEBUG",`Resending persisted exit batch (${d.byteLength} bytes)`),this.sendFetch({url:`${this.config.endpoint}/${this.config.propertyId}`,encoded:d,events:[]},!1,void 0,!0))}}catch{}}log(e,t,...n){this.logger.log(e,t,...n)}},me=re({prefix:"[bidkernel]",logLevel:"INFO"})});function an(i){let e=typeof i?.getError=="function"?i.getError():i?.error||i,t=a=>e&&typeof e[a]=="function"?e[a]():void 0,n=t("getMessage")||e?.message||String(e||"IMA ad error"),r=t("getErrorCode")??e?.code,o=t("getVastErrorCode"),s=t("getType")??e?.type,d={message:n};return r&&(d.error_code=String(r)),o&&(d.vast_error_code=String(o)),s&&(d.error_type=String(s)),{err:e,message:n,metadata:d}}function ot(i,e,t){let n=ne(i),{err:r,message:o,metadata:s}=an(e);return n.log("WARN","IMA AdErrorEvent received",e),n.enqueue(I.AD_RENDER_FAILED,"adRenderFailed",{auctionId:t.auctionId,transactionId:t.transactionId,adUnitCode:t.adUnitCode,bid:t.bid,metadata:{...t.metadata,reason:t.adStarted?"ima_playback_error":"ima_ad_error",playback_phase:t.adStarted?"post_start":"pre_start",...s},error:typeof r=="object"?r:new Error(o)}),r}function cn(i,e){if(!i||typeof i!="object"||tt.has(i))return;tt.add(i);let t=typeof window<"u"&&window.google?.ima?.AdErrorEvent?.Type?.AD_ERROR||"adError";try{e.call(i,t,n=>{for(let r of C.getActiveInstances())try{let o=dt(r,{mediaType:"video"});ot(r,n,{adStarted:!1,adUnitCode:o?.adUnitCode||"video",auctionId:o?.auctionId,transactionId:o?.transactionId,bid:o?.bidTrace})}catch{}})}catch{}}function nt(i){if(i)try{let e=i.prototype;if(e&&typeof e.getAdsManager=="function"&&!e.getAdsManager.__bidkernelHooked){let t=e.getAdsManager,n=function(...r){let o=t.apply(this,r);if(o)for(let s of C.getActiveInstances())try{s.attachImaAdsManager(o)}catch{}return o};n.__bidkernelHooked=!0,e.getAdsManager=n}}catch{}}function it(i){if(i)try{let e=i.prototype||i;if(e&&typeof e.init=="function"&&!e.init.__bidkernelHooked){let t=e.init,n=function(...r){for(let o of C.getActiveInstances())try{o.attachImaAdsManager(this)}catch{}return t.apply(this,r)};n.__bidkernelHooked=!0,e.init=n}if(e&&typeof e.start=="function"&&!e.start.__bidkernelHooked){let t=e.start,n=function(...r){for(let o of C.getActiveInstances())try{o.attachImaAdsManager(this)}catch{}return t.apply(this,r)};n.__bidkernelHooked=!0,e.start=n}}catch{}}function rt(i){if(i)try{let e=i.prototype;if(!e)return;if(typeof e.addEventListener=="function"&&!e.addEventListener.__bidkernelHooked){let t=e.addEventListener,n=function(r,o,...s){if(cn(this,t),(r==="adsManagerLoaded"||r===(this?.AdsManagerLoadedEvent?.Type?.ADS_MANAGER_LOADED||"adsManagerLoaded"))&&typeof o=="function"){let d=Ee.get(o);return d||(d=function(a){if(a&&typeof a.getAdsManager=="function"&&!a.getAdsManager.__bidkernelHooked){let l=a.getAdsManager;a.getAdsManager=function(...c){let b=l.apply(this,c);if(b)for(let h of C.getActiveInstances())try{h.attachImaAdsManager(b)}catch{}return b},a.getAdsManager.__bidkernelHooked=!0}return o.apply(this,arguments)},Ee.set(o,d)),t.call(this,r,d,...s)}return t.call(this,r,o,...s)};n.__bidkernelHooked=!0,e.addEventListener=n}if(typeof e.removeEventListener=="function"&&!e.removeEventListener.__bidkernelHooked){let t=e.removeEventListener,n=function(r,o,...s){let d=typeof o=="function"?Ee.get(o):void 0;return t.call(this,r,d||o,...s)};n.__bidkernelHooked=!0,e.removeEventListener=n}}catch{}}function X(i){if(!(!i||typeof i!="object"))try{i.AdsManagerLoadedEvent&&nt(i.AdsManagerLoadedEvent);let e=Object.getOwnPropertyDescriptor(i,"AdsManagerLoadedEvent");if(!e||e.configurable){let r=i.AdsManagerLoadedEvent;try{Object.defineProperty(i,"AdsManagerLoadedEvent",{configurable:!0,enumerable:!0,get(){return r},set(o){r=o,nt(o)}})}catch{}}i.AdsLoader&&rt(i.AdsLoader);let t=Object.getOwnPropertyDescriptor(i,"AdsLoader");if(!t||t.configurable){let r=i.AdsLoader;try{Object.defineProperty(i,"AdsLoader",{configurable:!0,enumerable:!0,get(){return r},set(o){r=o,rt(o)}})}catch{}}i.AdsManager&&it(i.AdsManager);let n=Object.getOwnPropertyDescriptor(i,"AdsManager");if(!n||n.configurable){let r=i.AdsManager;try{Object.defineProperty(i,"AdsManager",{configurable:!0,enumerable:!0,get(){return r},set(o){r=o,it(o)}})}catch{}}}catch{}}function st(){if(typeof window>"u")return;let i=window;if(i.google?.ima&&X(i.google.ima),i.google&&typeof i.google=="object"){let t=Object.getOwnPropertyDescriptor(i.google,"ima");if(!t||t.configurable){let n=i.google.ima;try{Object.defineProperty(i.google,"ima",{configurable:!0,enumerable:!0,get(){return n},set(r){n=r,X(r)}})}catch{}}}let e=Object.getOwnPropertyDescriptor(i,"google");if(!e||e.configurable){let t=i.google;try{Object.defineProperty(i,"google",{configurable:!0,enumerable:!0,get(){return t},set(n){if(t=n,t&&typeof t=="object"){t.ima&&X(t.ima);let r=Object.getOwnPropertyDescriptor(t,"ima");if(!r||r.configurable){let o=t.ima;try{Object.defineProperty(t,"ima",{configurable:!0,enumerable:!0,get(){return o},set(s){o=s,X(s)}})}catch{}}}}})}catch{}}}function dt(i,e){let t=ne(i),n=Date.now(),r=d=>t.hasImpressionEmitted(d.adUnitCode,void 0,d.auctionId,d.bidTrace.creativeId);if(e?.creativeId||e?.adId){for(let d of Array.from(t.cachedWinningBids.values()))if(!(n-d.timestamp>j)&&(e.creativeId&&(d.bidTrace.creativeId===e.creativeId||d.rawBid?.creativeId===e.creativeId)||e.adId&&(d.rawBid?.adId===e.adId||d.adUnitCode===e.adId)))return d}let o;if(e?.mediaType){for(let a of Array.from(t.cachedWinningBids.values())){if(n-a.timestamp>j)continue;(a.bidTrace.mediaType===e.mediaType||a.rawBid?.mediaType===e.mediaType||e.mediaType==="video"&&a.rawBid?.mediaTypes?.video!==void 0)&&(r(a)||(!o||a.timestamp<o.timestamp)&&(o=a))}if(o)return o;let d;for(let a of Array.from(t.cachedWinningBids.values())){if(n-a.timestamp>j)continue;(a.bidTrace.mediaType===e.mediaType||a.rawBid?.mediaType===e.mediaType||e.mediaType==="video"&&a.rawBid?.mediaTypes?.video!==void 0)&&(!d||a.timestamp>d.timestamp)&&(d=a)}if(d)return d}for(let d of Array.from(t.cachedWinningBids.values()))n-d.timestamp>j||r(d)||(!o||d.timestamp>o.timestamp)&&(o=d);if(o)return o;let s;for(let d of Array.from(t.cachedWinningBids.values()))n-d.timestamp>j||(!s||d.timestamp>s.timestamp)&&(s=d);return s}function at(i,e,t){let n=ne(i);if(!e||typeof e.addEventListener!="function")return n.log("WARN","Invalid AdsManager passed to attachImaAdsManager"),()=>{};if(!e.__bidkernelAttachedInstances)try{Object.defineProperty(e,"__bidkernelAttachedInstances",{value:new Map,configurable:!0,writable:!0})}catch{e.__bidkernelAttachedInstances=new Map}let r=e.__bidkernelAttachedInstances,o=r.get(i);if(o){if(!t)return()=>{};o()}let s=t?.slotId||t?.adUnitCode||"video",d=t?.adUnitCode||s,a=t?.auctionId||"",l=t?.transactionId||"",c=y=>{let u=(a?n.getCachedBid(`${a}:${d}`):void 0)||(a&&s!==d?n.getCachedBid(`${a}:${s}`):void 0)||(d!=="video"?n.getCachedBid(d):void 0)||(s!==d&&s!=="video"?n.getCachedBid(s):void 0);return u||(u=dt(i,{creativeId:y?.creativeId,adId:y?.adId,mediaType:"video"})),u},b=!1,h=y=>{b=!0,n.log("DEBUG","IMA AdEvent.STARTED / IMPRESSION received",y);let u=typeof y?.getAd=="function"?y.getAd():y?.ad,v={};u&&(v.creativeId=(typeof u.getCreativeId=="function"?u.getCreativeId():u.creativeId)||"",v.adId=(typeof u.getAdId=="function"?u.getAdId():u.id)||"",v.title=(typeof u.getTitle=="function"?u.getTitle():u.title)||"",v.duration=typeof u.getDuration=="function"?u.getDuration():u.duration,v.advertiserName=typeof u.getAdvertiserName=="function"?u.getAdvertiserName():"");let R=c(v),M=t?.slotId&&t.slotId!=="video"?t.slotId:t?.adUnitCode&&t.adUnitCode!=="video"?t.adUnitCode:R?.adUnitCode||t?.slotId||t?.adUnitCode||"video",ut=t?.adUnitCode&&t.adUnitCode!=="video"?t.adUnitCode:R?.adUnitCode||M,ft=a||R?.auctionId||"",ht=l||R?.transactionId||"",we={...R?.rawBid||t?.bid,mediaType:"video",creativeId:v.creativeId||R?.bidTrace?.creativeId||t?.bid?.creativeId||""};if(n.recordImpression(M,{adUnitCode:ut,auctionId:ft,transactionId:ht,mediaType:"video",bid:we,metadata:{...t?.metadata,media_type:"video",...v.title?{ad_title:v.title}:{},...Number.isFinite(v.duration)?{ad_duration_s:String(v.duration)}:{}}})&&t?.onImpression)try{t.onImpression(M,{ad:u,bid:we})}catch(pt){n.log("ERROR","Error in onImpression callback",pt)}},m=y=>{if(n.log("DEBUG",`IMA AdEvent milestone: ${y}`),t?.onMilestone)try{t.onMilestone(y,s)}catch(u){n.log("ERROR","Error in onMilestone callback",u)}},A=y=>{n.log("DEBUG","IMA AdEvent.CLICK received",y);let u=c(),v=t?.adUnitCode&&t.adUnitCode!=="video"?t.adUnitCode:u?.adUnitCode||s;n.enqueue(I.CLICK,"click",{auctionId:a||u?.auctionId,transactionId:l||u?.transactionId,adUnitCode:v,bid:u?.bidTrace||t?.bid,metadata:{...t?.metadata,media_type:"video"}})},p=y=>{let u=c(),v=t?.adUnitCode&&t.adUnitCode!=="video"?t.adUnitCode:u?.adUnitCode||s,R=ot(i,y,{adStarted:b,adUnitCode:v,auctionId:a||u?.auctionId,transactionId:l||u?.transactionId,bid:u?.bidTrace||t?.bid,metadata:t?.metadata});if(t?.onError)try{t.onError(R)}catch(M){n.log("ERROR","Error in onError callback",M)}},E=typeof window<"u"?window.google?.ima:void 0,S=E?.AdEvent?.Type||{},L=E?.AdErrorEvent?.Type||{},T=[{type:S.STARTED||"started",handler:h},{type:S.IMPRESSION||"impression",handler:h},{type:S.FIRST_QUARTILE||"firstQuartile",handler:()=>m("firstQuartile")},{type:S.MIDPOINT||"midpoint",handler:()=>m("midpoint")},{type:S.THIRD_QUARTILE||"thirdQuartile",handler:()=>m("thirdQuartile")},{type:S.COMPLETE||"complete",handler:()=>m("complete")},{type:S.CLICK||"click",handler:A},{type:L.AD_ERROR||"adError",handler:p}],x=new Set,k=[];for(let y of T)x.has(y.type)||(x.add(y.type),k.push(y));for(let{type:y,handler:u}of k)try{e.addEventListener(y,u)}catch{}let g=()=>{r.delete(i);for(let{type:y,handler:u}of k)try{e.removeEventListener(y,u)}catch{}n.videoDetachCleanups.delete(g)};return r.set(i,g),n.videoDetachCleanups.add(g),g}function ln(i,e,t){let n=ne(i);if(!e)return n.log("WARN","attachVideoPlayer called with null/undefined target"),()=>{};let r=null;if(typeof e=="string"){if(typeof document<"u")try{r=document.querySelector(e)||document.getElementById(e)}catch{r=document.getElementById(e)}}else if(typeof HTMLElement<"u"&&e instanceof HTMLElement)r=e;else if(e&&typeof e=="object"&&e.nodeType===1)r=e;else{if(typeof e.addEventListener=="function"&&(typeof e.init=="function"||typeof e.start=="function"||typeof e.getCuePoints=="function"||typeof e.getVolume=="function"||e.__imaAdsManager))return at(i,e,t);e&&typeof e.addEventListener=="function"&&(r=e)}let o=t?.slotId||t?.adUnitCode||(r?r.id:"")||"video",s=t?.adUnitCode||o,d=t?.auctionId||"",a=t?.transactionId||"",l=()=>(d?n.getCachedBid(`${d}:${s}`):void 0)||(d&&o!==s?n.getCachedBid(`${d}:${o}`):void 0)||n.getCachedBid(s)||(o!==s?n.getCachedBid(o):void 0),c=null;r&&(r.tagName&&r.tagName.toLowerCase()==="video"?c=r:c=r.querySelector("video"));let b={q1:!1,q2:!1,q3:!1,q4:!1},h=g=>{let y=g||c||(r?.querySelector?r.querySelector("video"):null),u=l(),v={...u?.rawBid||t?.bid,mediaType:"video"};if(n.recordImpression(o,{adUnitCode:s,auctionId:d||u?.auctionId,transactionId:a||u?.transactionId,mediaType:"video",bid:v,metadata:{...t?.metadata,media_type:"video",...y&&Number.isFinite(y.duration)?{video_duration_s:String(Math.round(y.duration))}:{}}})&&t?.onImpression)try{t.onImpression(o,{element:y||r,bid:v})}catch(M){n.log("ERROR","Error in onImpression callback",M)}},m=g=>{n.log("DEBUG","HTML5 video playing event received");let y=g?.target instanceof HTMLVideoElement?g.target:c;h(y)},A=g=>{let y=g?.target instanceof HTMLVideoElement?g.target:c;if(y&&y.currentTime>0&&(h(y),Number.isFinite(y.duration)&&y.duration>0)){let u=y.currentTime/y.duration;u>=.25&&!b.q1&&(b.q1=!0,t?.onMilestone?.("firstQuartile",o)),u>=.5&&!b.q2&&(b.q2=!0,t?.onMilestone?.("midpoint",o)),u>=.75&&!b.q3&&(b.q3=!0,t?.onMilestone?.("thirdQuartile",o))}},p=()=>{b.q4||(b.q4=!0,t?.onMilestone?.("complete",o))},E=g=>{let u=(g?.target instanceof HTMLVideoElement?g.target:c)?.error||c?.error,v=l(),R=u?`HTML5 video error code ${u.code}: ${u.message}`:"Video playback error";if(n.log("WARN",R),n.enqueue(I.AD_RENDER_FAILED,"adRenderFailed",{auctionId:d||v?.auctionId,transactionId:a||v?.transactionId,adUnitCode:s,bid:v?.bidTrace||t?.bid,metadata:{...t?.metadata,reason:"html5_video_error",message:R,...u?.code?{error_code:String(u.code)}:{}},error:u?new Error(R):void 0}),t?.onError)try{t.onError(u)}catch(M){n.log("ERROR","Error in onError callback",M)}},S=g=>{g.addEventListener("playing",m),g.addEventListener("play",m),g.addEventListener("timeupdate",A),g.addEventListener("ended",p),g.addEventListener("error",E)},L=g=>{g.removeEventListener("playing",m),g.removeEventListener("play",m),g.removeEventListener("timeupdate",A),g.removeEventListener("ended",p),g.removeEventListener("error",E)},T=null;r&&r!==c&&(r.addEventListener("playing",m,!0),r.addEventListener("play",m,!0),r.addEventListener("timeupdate",A,!0),r.addEventListener("ended",p,!0),r.addEventListener("error",E,!0)),c&&S(c),r&&r.tagName?.toLowerCase()!=="video"&&typeof MutationObserver<"u"&&(T=new MutationObserver(()=>{let g=r.querySelector("video");g&&g!==c&&(c&&L(c),c=g,c&&S(c))}),T.observe(r,{childList:!0,subtree:!0}));let x=l();t?.trackViewability!==!1&&r&&n.observeSlot(r,o,{adUnitCode:s,auctionId:d||x?.auctionId,transactionId:a||x?.transactionId,mediaType:"video",bid:x?.bidTrace||t?.bid,metadata:t?.metadata});let k=()=>{T&&(T.disconnect(),T=null),r&&r!==c&&(r.removeEventListener("playing",m,!0),r.removeEventListener("play",m,!0),r.removeEventListener("timeupdate",A,!0),r.removeEventListener("ended",p,!0),r.removeEventListener("error",E,!0)),c&&L(c),n.videoDetachCleanups.delete(k)};return n.videoDetachCleanups.add(k),k}var ne,Ee,tt,un,ct=_(()=>{"use strict";Te();ye();ne=i=>i,Ee=new WeakMap,tt=new WeakSet;typeof window<"u"&&st();C.prototype.attachImaAdsManager=function(i,e){return at(this,i,e)};C.prototype.attachVideoPlayer=function(i,e){return ln(this,i,e)};un=C.prototype.enable;C.prototype.enable=function(){un.call(this),typeof window<"u"&&(st(),window.google?.ima&&X(window.google.ima))}});var hn=yt(()=>{Te();ct();var lt="https://by.bidkernel.io/t",fn=window._bidkernelPbjsGlobal||"pbjs";ve(fn,{endpoint:lt});window.bidkernelPrebidAnalytics={...window.bidkernelPrebidAnalytics,register:(i,e)=>ve(i,{endpoint:lt,...e}),attachVideoPlayer:(i,e)=>{let t=window._bidkernelPrebidAnalytics;return t?.attachVideoPlayer?t.attachVideoPlayer(i,e):()=>{}},attachImaAdsManager:(i,e)=>{let t=window._bidkernelPrebidAnalytics;return t?.attachImaAdsManager?t.attachImaAdsManager(i,e):()=>{}},recordImpression:(i,e)=>{let t=window._bidkernelPrebidAnalytics;return t?.recordImpression?t.recordImpression(i,e):!1}}});return hn();})();
|
package/dist/index.d.mts
CHANGED
|
@@ -69,7 +69,6 @@ interface SlotObserveOptions {
|
|
|
69
69
|
bid?: any;
|
|
70
70
|
metadata?: Record<string, string>;
|
|
71
71
|
refreshIndex?: number;
|
|
72
|
-
emitRefreshEvent?: boolean;
|
|
73
72
|
}
|
|
74
73
|
interface CachedWinningBid {
|
|
75
74
|
bidTrace: BidTrace;
|
|
@@ -102,12 +101,25 @@ declare const CACHED_BID_TTL_MS: number;
|
|
|
102
101
|
*/
|
|
103
102
|
declare function isTrustedEndpoint(raw: string): boolean;
|
|
104
103
|
/**
|
|
105
|
-
*
|
|
104
|
+
* Whether the visitor's session is live: there was activity (a pageview or
|
|
105
|
+
* an interaction with the page) within the last 30 minutes. Exported for
|
|
106
|
+
* the SDK, which stops refreshing slots while this is false.
|
|
107
|
+
*/
|
|
108
|
+
declare function isSessionActive(now?: number): boolean;
|
|
109
|
+
/**
|
|
110
|
+
* Calls back when a lapsed session is succeeded by a new one, that is when
|
|
111
|
+
* the visitor interacts with the page again after 30 idle minutes. Binds the
|
|
112
|
+
* page's activity listeners if no instance has yet. Returns the unsubscribe.
|
|
113
|
+
*/
|
|
114
|
+
declare function onSessionResume(listener: () => void): () => void;
|
|
115
|
+
/**
|
|
116
|
+
* The visitor's session id: a 30-minute activity window persisted in
|
|
106
117
|
* localStorage when storage is allowed, kept in memory otherwise. A session
|
|
107
118
|
* begun in memory (before storage consent) is adopted and persisted the
|
|
108
119
|
* first time this runs with storage allowed, so consent never splits a
|
|
109
|
-
* session.
|
|
110
|
-
*
|
|
120
|
+
* session. Reading does not extend the session; a read after it lapsed
|
|
121
|
+
* starts a new one. Exported so an integration can report the same id the
|
|
122
|
+
* adapter stamps on its batches.
|
|
111
123
|
*/
|
|
112
124
|
declare function getOrCreateSessionId(): string;
|
|
113
125
|
/**
|
|
@@ -166,6 +178,7 @@ declare class BidkernelPrebidAnalytics {
|
|
|
166
178
|
private videoDetachCleanups;
|
|
167
179
|
private auctionBidderOutcomes;
|
|
168
180
|
private logger;
|
|
181
|
+
private managesSessionId;
|
|
169
182
|
constructor(config: AnalyticsConfig);
|
|
170
183
|
enable(): void;
|
|
171
184
|
/**
|
|
@@ -257,6 +270,15 @@ declare class BidkernelPrebidAnalytics {
|
|
|
257
270
|
navigate(pageviewId: string, pageUrl: string): void;
|
|
258
271
|
private handleAuctionInit;
|
|
259
272
|
private handleAuctionEnd;
|
|
273
|
+
/**
|
|
274
|
+
* The render cycle an auction ending now would fill for an ad unit: 0 for
|
|
275
|
+
* a slot that has never rendered on this pageview, otherwise one past the
|
|
276
|
+
* cycle it last rendered. The index only advances when a creative renders,
|
|
277
|
+
* so two unfilled refresh auctions in a row report the same cycle; both
|
|
278
|
+
* count as refreshes, which is the point. Stamped on AUCTION_END bidder
|
|
279
|
+
* outcomes in enqueue; there is no per-refresh event.
|
|
280
|
+
*/
|
|
281
|
+
private auctionCycleIndex;
|
|
260
282
|
private handleBidRequested;
|
|
261
283
|
private handleBidResponse;
|
|
262
284
|
private handleBidTimeout;
|
|
@@ -413,4 +435,4 @@ interface AdsGlobal {
|
|
|
413
435
|
*/
|
|
414
436
|
declare function getbidkernel(alias?: string): AdsGlobal;
|
|
415
437
|
|
|
416
|
-
export { type AdsGlobal, type AnalyticsConfig, BidkernelPrebidAnalytics, CACHED_BID_TTL_MS, type CachedWinningBid, PrebidEventDeduper, type SizeMapping, type SlotConfig, type SlotObserveOptions, type SlotSize, type SlotSizes, type SlotViewabilityState, type VideoPlayerOptions, attachImaAdsManager, attachVideoPlayer, getOrCreateSessionId, getPrebidEventKey, getbidkernel, hookImaPrototype, initImaInterception, isTrustedEndpoint, registerPrebidAnalytics };
|
|
438
|
+
export { type AdsGlobal, type AnalyticsConfig, BidkernelPrebidAnalytics, CACHED_BID_TTL_MS, type CachedWinningBid, PrebidEventDeduper, type SizeMapping, type SlotConfig, type SlotObserveOptions, type SlotSize, type SlotSizes, type SlotViewabilityState, type VideoPlayerOptions, attachImaAdsManager, attachVideoPlayer, getOrCreateSessionId, getPrebidEventKey, getbidkernel, hookImaPrototype, initImaInterception, isSessionActive, isTrustedEndpoint, onSessionResume, registerPrebidAnalytics };
|
package/dist/index.d.ts
CHANGED
|
@@ -69,7 +69,6 @@ interface SlotObserveOptions {
|
|
|
69
69
|
bid?: any;
|
|
70
70
|
metadata?: Record<string, string>;
|
|
71
71
|
refreshIndex?: number;
|
|
72
|
-
emitRefreshEvent?: boolean;
|
|
73
72
|
}
|
|
74
73
|
interface CachedWinningBid {
|
|
75
74
|
bidTrace: BidTrace;
|
|
@@ -102,12 +101,25 @@ declare const CACHED_BID_TTL_MS: number;
|
|
|
102
101
|
*/
|
|
103
102
|
declare function isTrustedEndpoint(raw: string): boolean;
|
|
104
103
|
/**
|
|
105
|
-
*
|
|
104
|
+
* Whether the visitor's session is live: there was activity (a pageview or
|
|
105
|
+
* an interaction with the page) within the last 30 minutes. Exported for
|
|
106
|
+
* the SDK, which stops refreshing slots while this is false.
|
|
107
|
+
*/
|
|
108
|
+
declare function isSessionActive(now?: number): boolean;
|
|
109
|
+
/**
|
|
110
|
+
* Calls back when a lapsed session is succeeded by a new one, that is when
|
|
111
|
+
* the visitor interacts with the page again after 30 idle minutes. Binds the
|
|
112
|
+
* page's activity listeners if no instance has yet. Returns the unsubscribe.
|
|
113
|
+
*/
|
|
114
|
+
declare function onSessionResume(listener: () => void): () => void;
|
|
115
|
+
/**
|
|
116
|
+
* The visitor's session id: a 30-minute activity window persisted in
|
|
106
117
|
* localStorage when storage is allowed, kept in memory otherwise. A session
|
|
107
118
|
* begun in memory (before storage consent) is adopted and persisted the
|
|
108
119
|
* first time this runs with storage allowed, so consent never splits a
|
|
109
|
-
* session.
|
|
110
|
-
*
|
|
120
|
+
* session. Reading does not extend the session; a read after it lapsed
|
|
121
|
+
* starts a new one. Exported so an integration can report the same id the
|
|
122
|
+
* adapter stamps on its batches.
|
|
111
123
|
*/
|
|
112
124
|
declare function getOrCreateSessionId(): string;
|
|
113
125
|
/**
|
|
@@ -166,6 +178,7 @@ declare class BidkernelPrebidAnalytics {
|
|
|
166
178
|
private videoDetachCleanups;
|
|
167
179
|
private auctionBidderOutcomes;
|
|
168
180
|
private logger;
|
|
181
|
+
private managesSessionId;
|
|
169
182
|
constructor(config: AnalyticsConfig);
|
|
170
183
|
enable(): void;
|
|
171
184
|
/**
|
|
@@ -257,6 +270,15 @@ declare class BidkernelPrebidAnalytics {
|
|
|
257
270
|
navigate(pageviewId: string, pageUrl: string): void;
|
|
258
271
|
private handleAuctionInit;
|
|
259
272
|
private handleAuctionEnd;
|
|
273
|
+
/**
|
|
274
|
+
* The render cycle an auction ending now would fill for an ad unit: 0 for
|
|
275
|
+
* a slot that has never rendered on this pageview, otherwise one past the
|
|
276
|
+
* cycle it last rendered. The index only advances when a creative renders,
|
|
277
|
+
* so two unfilled refresh auctions in a row report the same cycle; both
|
|
278
|
+
* count as refreshes, which is the point. Stamped on AUCTION_END bidder
|
|
279
|
+
* outcomes in enqueue; there is no per-refresh event.
|
|
280
|
+
*/
|
|
281
|
+
private auctionCycleIndex;
|
|
260
282
|
private handleBidRequested;
|
|
261
283
|
private handleBidResponse;
|
|
262
284
|
private handleBidTimeout;
|
|
@@ -413,4 +435,4 @@ interface AdsGlobal {
|
|
|
413
435
|
*/
|
|
414
436
|
declare function getbidkernel(alias?: string): AdsGlobal;
|
|
415
437
|
|
|
416
|
-
export { type AdsGlobal, type AnalyticsConfig, BidkernelPrebidAnalytics, CACHED_BID_TTL_MS, type CachedWinningBid, PrebidEventDeduper, type SizeMapping, type SlotConfig, type SlotObserveOptions, type SlotSize, type SlotSizes, type SlotViewabilityState, type VideoPlayerOptions, attachImaAdsManager, attachVideoPlayer, getOrCreateSessionId, getPrebidEventKey, getbidkernel, hookImaPrototype, initImaInterception, isTrustedEndpoint, registerPrebidAnalytics };
|
|
438
|
+
export { type AdsGlobal, type AnalyticsConfig, BidkernelPrebidAnalytics, CACHED_BID_TTL_MS, type CachedWinningBid, PrebidEventDeduper, type SizeMapping, type SlotConfig, type SlotObserveOptions, type SlotSize, type SlotSizes, type SlotViewabilityState, type VideoPlayerOptions, attachImaAdsManager, attachVideoPlayer, getOrCreateSessionId, getPrebidEventKey, getbidkernel, hookImaPrototype, initImaInterception, isSessionActive, isTrustedEndpoint, onSessionResume, registerPrebidAnalytics };
|
package/dist/index.js
CHANGED
|
@@ -30,7 +30,9 @@ __export(src_exports, {
|
|
|
30
30
|
getbidkernel: () => getbidkernel,
|
|
31
31
|
hookImaPrototype: () => hookImaPrototype,
|
|
32
32
|
initImaInterception: () => initImaInterception,
|
|
33
|
+
isSessionActive: () => isSessionActive,
|
|
33
34
|
isTrustedEndpoint: () => isTrustedEndpoint,
|
|
35
|
+
onSessionResume: () => onSessionResume,
|
|
34
36
|
registerPrebidAnalytics: () => registerPrebidAnalytics
|
|
35
37
|
});
|
|
36
38
|
module.exports = __toCommonJS(src_exports);
|
|
@@ -334,7 +336,6 @@ var TraceEventType = {
|
|
|
334
336
|
VIEWABLE: 6,
|
|
335
337
|
/** TIME_IN_VIEW - accumulated in-viewport duration (once per render cycle end) */
|
|
336
338
|
TIME_IN_VIEW: 7,
|
|
337
|
-
REFRESH: 8,
|
|
338
339
|
ERROR: 9,
|
|
339
340
|
SLOT_DEFINED: 10,
|
|
340
341
|
SLOT_DESTROYED: 11,
|
|
@@ -757,7 +758,7 @@ var TraceEvent_MetadataEntry = {
|
|
|
757
758
|
}
|
|
758
759
|
};
|
|
759
760
|
function createBaseBidderOutcomeEntry() {
|
|
760
|
-
return { adUnitCode: "", outcome: 0, bid: void 0 };
|
|
761
|
+
return { adUnitCode: "", outcome: 0, bid: void 0, refreshIndex: 0 };
|
|
761
762
|
}
|
|
762
763
|
var BidderOutcomeEntry = {
|
|
763
764
|
encode(message, writer = new import_wire.BinaryWriter()) {
|
|
@@ -770,6 +771,9 @@ var BidderOutcomeEntry = {
|
|
|
770
771
|
if (message.bid !== void 0) {
|
|
771
772
|
BidTrace.encode(message.bid, writer.uint32(50).fork()).join();
|
|
772
773
|
}
|
|
774
|
+
if (message.refreshIndex !== void 0 && message.refreshIndex !== 0) {
|
|
775
|
+
writer.uint32(56).int32(message.refreshIndex);
|
|
776
|
+
}
|
|
773
777
|
return writer;
|
|
774
778
|
},
|
|
775
779
|
decode(input, length) {
|
|
@@ -800,6 +804,13 @@ var BidderOutcomeEntry = {
|
|
|
800
804
|
message.bid = BidTrace.decode(reader, reader.uint32());
|
|
801
805
|
continue;
|
|
802
806
|
}
|
|
807
|
+
case 7: {
|
|
808
|
+
if (tag !== 56) {
|
|
809
|
+
break;
|
|
810
|
+
}
|
|
811
|
+
message.refreshIndex = reader.int32();
|
|
812
|
+
continue;
|
|
813
|
+
}
|
|
803
814
|
}
|
|
804
815
|
if ((tag & 7) === 4 || tag === 0) {
|
|
805
816
|
break;
|
|
@@ -986,7 +997,6 @@ var EVENT_NAME_TO_TYPE = {
|
|
|
986
997
|
adRenderFailed: TraceEventType.AD_RENDER_FAILED,
|
|
987
998
|
click: TraceEventType.CLICK,
|
|
988
999
|
impression: TraceEventType.IMPRESSION,
|
|
989
|
-
refresh: TraceEventType.REFRESH,
|
|
990
1000
|
timeInView: TraceEventType.TIME_IN_VIEW,
|
|
991
1001
|
viewable: TraceEventType.VIEWABLE
|
|
992
1002
|
};
|
|
@@ -1075,49 +1085,83 @@ function sameEndpointOrigin(a, b) {
|
|
|
1075
1085
|
}
|
|
1076
1086
|
var SESSION_PERSIST_INTERVAL_MS = 60 * 1e3;
|
|
1077
1087
|
var persistedSessionTs = 0;
|
|
1078
|
-
|
|
1088
|
+
var ACTIVITY_EVENTS = ["pointerdown", "pointermove", "keydown", "scroll", "wheel", "touchstart"];
|
|
1089
|
+
var activityListenersBound = false;
|
|
1090
|
+
var sessionResumeListeners = /* @__PURE__ */ new Set();
|
|
1091
|
+
function persistSessionTs(ts) {
|
|
1079
1092
|
try {
|
|
1080
1093
|
if (typeof localStorage !== "undefined") {
|
|
1081
|
-
localStorage.setItem(SESSION_TS_KEY,
|
|
1082
|
-
persistedSessionTs =
|
|
1094
|
+
localStorage.setItem(SESSION_TS_KEY, ts.toString());
|
|
1095
|
+
persistedSessionTs = ts;
|
|
1083
1096
|
}
|
|
1084
1097
|
} catch {
|
|
1085
1098
|
}
|
|
1086
1099
|
}
|
|
1087
|
-
function
|
|
1100
|
+
function isSessionActive(now = Date.now()) {
|
|
1101
|
+
return inMemorySessionTs > 0 && now - inMemorySessionTs <= THIRTY_MINUTES_MS;
|
|
1102
|
+
}
|
|
1103
|
+
function onSessionResume(listener) {
|
|
1104
|
+
bindActivityListeners();
|
|
1105
|
+
sessionResumeListeners.add(listener);
|
|
1106
|
+
return () => {
|
|
1107
|
+
sessionResumeListeners.delete(listener);
|
|
1108
|
+
};
|
|
1109
|
+
}
|
|
1110
|
+
function recordActivity() {
|
|
1088
1111
|
const now = Date.now();
|
|
1112
|
+
const lapsed = !!inMemorySessionId && !isSessionActive(now);
|
|
1089
1113
|
inMemorySessionTs = now;
|
|
1090
|
-
if (
|
|
1114
|
+
if (lapsed) {
|
|
1115
|
+
inMemorySessionId = null;
|
|
1116
|
+
for (const listener of sessionResumeListeners) listener();
|
|
1117
|
+
return;
|
|
1118
|
+
}
|
|
1119
|
+
if (!storageAllowed || !inMemorySessionId || persistedSessionTs === 0) return;
|
|
1091
1120
|
if (now - persistedSessionTs < SESSION_PERSIST_INTERVAL_MS) return;
|
|
1092
1121
|
persistSessionTs(now);
|
|
1093
1122
|
}
|
|
1123
|
+
function sessionNeedsSync() {
|
|
1124
|
+
return !inMemorySessionId || storageAllowed && persistedSessionTs === 0;
|
|
1125
|
+
}
|
|
1126
|
+
function bindActivityListeners() {
|
|
1127
|
+
if (activityListenersBound || typeof window === "undefined") return;
|
|
1128
|
+
activityListenersBound = true;
|
|
1129
|
+
const onActivity = () => recordActivity();
|
|
1130
|
+
for (const name of ACTIVITY_EVENTS) {
|
|
1131
|
+
window.addEventListener(name, onActivity, { passive: true, capture: true });
|
|
1132
|
+
}
|
|
1133
|
+
if (typeof document !== "undefined") {
|
|
1134
|
+
document.addEventListener("visibilitychange", () => {
|
|
1135
|
+
if (document.visibilityState === "visible") recordActivity();
|
|
1136
|
+
});
|
|
1137
|
+
}
|
|
1138
|
+
}
|
|
1094
1139
|
function getOrCreateSessionId() {
|
|
1095
1140
|
const now = Date.now();
|
|
1096
|
-
const memoryFresh = !!inMemorySessionId &&
|
|
1141
|
+
const memoryFresh = !!inMemorySessionId && isSessionActive(now);
|
|
1097
1142
|
try {
|
|
1098
1143
|
if (storageAllowed && typeof localStorage !== "undefined") {
|
|
1099
1144
|
const storedId = localStorage.getItem(SESSION_KEY);
|
|
1100
1145
|
const tsStr = localStorage.getItem(SESSION_TS_KEY);
|
|
1101
1146
|
const storedTs = tsStr ? parseInt(tsStr, 10) || 0 : 0;
|
|
1102
1147
|
if (storedId && storedTs && now - storedTs <= THIRTY_MINUTES_MS) {
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1148
|
+
if (inMemorySessionId !== storedId || inMemorySessionTs < storedTs) {
|
|
1149
|
+
inMemorySessionId = storedId;
|
|
1150
|
+
inMemorySessionTs = Math.max(inMemorySessionTs, storedTs);
|
|
1151
|
+
}
|
|
1152
|
+
if (persistedSessionTs === 0) persistedSessionTs = storedTs;
|
|
1106
1153
|
return storedId;
|
|
1107
1154
|
}
|
|
1108
1155
|
const newId = memoryFresh ? inMemorySessionId : generateUUID();
|
|
1156
|
+
if (!memoryFresh) inMemorySessionTs = now;
|
|
1109
1157
|
localStorage.setItem(SESSION_KEY, newId);
|
|
1110
|
-
persistSessionTs(
|
|
1158
|
+
persistSessionTs(inMemorySessionTs);
|
|
1111
1159
|
inMemorySessionId = newId;
|
|
1112
|
-
inMemorySessionTs = now;
|
|
1113
1160
|
return newId;
|
|
1114
1161
|
}
|
|
1115
1162
|
} catch {
|
|
1116
1163
|
}
|
|
1117
|
-
if (
|
|
1118
|
-
inMemorySessionTs = now;
|
|
1119
|
-
return inMemorySessionId;
|
|
1120
|
-
}
|
|
1164
|
+
if (memoryFresh) return inMemorySessionId;
|
|
1121
1165
|
inMemorySessionId = generateUUID();
|
|
1122
1166
|
inMemorySessionTs = now;
|
|
1123
1167
|
return inMemorySessionId;
|
|
@@ -1277,6 +1321,10 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
1277
1321
|
// Compacted bidder participation map per auction: auctionId -> Map<`${bidder}:${adUnitCode}`, BidderOutcomeEntry>
|
|
1278
1322
|
auctionBidderOutcomes = /* @__PURE__ */ new Map();
|
|
1279
1323
|
logger;
|
|
1324
|
+
// True when this instance owns its session id (none was supplied), so the
|
|
1325
|
+
// id follows the page-wide session as it lapses and restarts. An id the
|
|
1326
|
+
// integration supplied is stamped as given.
|
|
1327
|
+
managesSessionId;
|
|
1280
1328
|
constructor(config) {
|
|
1281
1329
|
if (config.storageAllowed !== void 0) {
|
|
1282
1330
|
_BidkernelPrebidAnalytics.setStorageAllowed(config.storageAllowed);
|
|
@@ -1287,7 +1335,7 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
1287
1335
|
endpoint,
|
|
1288
1336
|
propertyId: config.propertyId || "",
|
|
1289
1337
|
pageviewId: config.pageviewId || generateUUID(),
|
|
1290
|
-
sessionId: config.sessionId ||
|
|
1338
|
+
sessionId: config.sessionId || "",
|
|
1291
1339
|
userId: config.userId || "",
|
|
1292
1340
|
deviceType: config.deviceType || "desktop",
|
|
1293
1341
|
country: config.country || "",
|
|
@@ -1306,6 +1354,9 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
1306
1354
|
prefix: "[bidkernel][prebid-analytics]",
|
|
1307
1355
|
logLevel: this.config.logLevel
|
|
1308
1356
|
});
|
|
1357
|
+
recordActivity();
|
|
1358
|
+
this.managesSessionId = !config.sessionId;
|
|
1359
|
+
if (this.managesSessionId) this.config.sessionId = getOrCreateSessionId();
|
|
1309
1360
|
if (requestedEndpoint && !endpoint) {
|
|
1310
1361
|
this.log(
|
|
1311
1362
|
"ERROR",
|
|
@@ -1354,6 +1405,7 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
1354
1405
|
if (typeof document !== "undefined") {
|
|
1355
1406
|
document.addEventListener("visibilitychange", this.boundVisibilityChange);
|
|
1356
1407
|
}
|
|
1408
|
+
bindActivityListeners();
|
|
1357
1409
|
this.flushTimer = setInterval(() => this.flush(), FLUSH_INTERVAL_MS);
|
|
1358
1410
|
this.resendPersistedBatches();
|
|
1359
1411
|
}
|
|
@@ -1650,8 +1702,7 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
1650
1702
|
const record = this.slotViewabilityRecords.get(slotId);
|
|
1651
1703
|
if (record && record.element !== element) {
|
|
1652
1704
|
this.observeSlot(element, slotId, {
|
|
1653
|
-
refreshIndex: record.refreshIndex
|
|
1654
|
-
emitRefreshEvent: false
|
|
1705
|
+
refreshIndex: record.refreshIndex
|
|
1655
1706
|
});
|
|
1656
1707
|
}
|
|
1657
1708
|
}
|
|
@@ -1839,18 +1890,6 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
1839
1890
|
this.flushSlotTimeInView(resolvedSlotId);
|
|
1840
1891
|
const nextRefreshIndex = options?.refreshIndex !== void 0 ? options.refreshIndex : (this.slotRefreshIndices.get(resolvedSlotId) ?? existing.refreshIndex) + 1;
|
|
1841
1892
|
this.slotRefreshIndices.set(resolvedSlotId, nextRefreshIndex);
|
|
1842
|
-
if (options?.emitRefreshEvent !== false) {
|
|
1843
|
-
this.enqueue(TraceEventType.REFRESH, "refresh", {
|
|
1844
|
-
auctionId: options?.auctionId || existing.auctionId,
|
|
1845
|
-
transactionId: options?.transactionId || existing.transactionId,
|
|
1846
|
-
adUnitCode: resolvedSlotId,
|
|
1847
|
-
bid: options?.bid ?? existing.bidPayload,
|
|
1848
|
-
metadata: {
|
|
1849
|
-
...options?.metadata,
|
|
1850
|
-
refresh_index: String(nextRefreshIndex)
|
|
1851
|
-
}
|
|
1852
|
-
});
|
|
1853
|
-
}
|
|
1854
1893
|
if (existing.dwellTimer) {
|
|
1855
1894
|
clearTimeout(existing.dwellTimer);
|
|
1856
1895
|
existing.dwellTimer = null;
|
|
@@ -2113,16 +2152,6 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
2113
2152
|
rec.viewableFired = false;
|
|
2114
2153
|
rec.accumulatedTimeInViewMs = 0;
|
|
2115
2154
|
}
|
|
2116
|
-
this.enqueue(TraceEventType.REFRESH, "refresh", {
|
|
2117
|
-
auctionId,
|
|
2118
|
-
transactionId,
|
|
2119
|
-
adUnitCode: targetSlot,
|
|
2120
|
-
bid: bidTrace,
|
|
2121
|
-
metadata: {
|
|
2122
|
-
...options?.metadata,
|
|
2123
|
-
refresh_index: String(nextRefreshIndex)
|
|
2124
|
-
}
|
|
2125
|
-
});
|
|
2126
2155
|
} else if (targetSlot) {
|
|
2127
2156
|
if (auctionId) {
|
|
2128
2157
|
this.slotLastAuctionIds.set(targetSlot, auctionId);
|
|
@@ -2250,6 +2279,8 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
2250
2279
|
}
|
|
2251
2280
|
setSessionId(sessionId) {
|
|
2252
2281
|
this.config.sessionId = sessionId;
|
|
2282
|
+
this.managesSessionId = !sessionId;
|
|
2283
|
+
if (this.managesSessionId) this.config.sessionId = getOrCreateSessionId();
|
|
2253
2284
|
}
|
|
2254
2285
|
navigate(pageviewId, pageUrl) {
|
|
2255
2286
|
this.disable();
|
|
@@ -2267,7 +2298,7 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
2267
2298
|
this.pageUrl = "";
|
|
2268
2299
|
}
|
|
2269
2300
|
this.logger.resetTiming();
|
|
2270
|
-
|
|
2301
|
+
recordActivity();
|
|
2271
2302
|
this.enable();
|
|
2272
2303
|
}
|
|
2273
2304
|
handleAuctionInit(data) {
|
|
@@ -2298,6 +2329,19 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
2298
2329
|
bidderOutcomes
|
|
2299
2330
|
});
|
|
2300
2331
|
}
|
|
2332
|
+
/**
|
|
2333
|
+
* The render cycle an auction ending now would fill for an ad unit: 0 for
|
|
2334
|
+
* a slot that has never rendered on this pageview, otherwise one past the
|
|
2335
|
+
* cycle it last rendered. The index only advances when a creative renders,
|
|
2336
|
+
* so two unfilled refresh auctions in a row report the same cycle; both
|
|
2337
|
+
* count as refreshes, which is the point. Stamped on AUCTION_END bidder
|
|
2338
|
+
* outcomes in enqueue; there is no per-refresh event.
|
|
2339
|
+
*/
|
|
2340
|
+
auctionCycleIndex(adUnitCode) {
|
|
2341
|
+
if (!adUnitCode) return 0;
|
|
2342
|
+
const last = this.slotRefreshIndices.get(adUnitCode) ?? this.slotViewabilityRecords.get(adUnitCode)?.refreshIndex;
|
|
2343
|
+
return last === void 0 ? 0 : last + 1;
|
|
2344
|
+
}
|
|
2301
2345
|
handleBidRequested(data) {
|
|
2302
2346
|
if (this.isDuplicate("bidRequested", data)) return;
|
|
2303
2347
|
this.log("DEBUG", "bidRequested", data);
|
|
@@ -2507,13 +2551,6 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
2507
2551
|
record.viewableFired = false;
|
|
2508
2552
|
record.accumulatedTimeInViewMs = 0;
|
|
2509
2553
|
}
|
|
2510
|
-
this.enqueue(TraceEventType.REFRESH, "refresh", {
|
|
2511
|
-
auctionId: resolvedAuctionId,
|
|
2512
|
-
transactionId: resolvedTransactionId,
|
|
2513
|
-
adUnitCode,
|
|
2514
|
-
bid: bidTrace,
|
|
2515
|
-
metadata: { refresh_index: String(nextRefreshIndex) }
|
|
2516
|
-
});
|
|
2517
2554
|
} else if (adUnitCode) {
|
|
2518
2555
|
if (resolvedAuctionId) {
|
|
2519
2556
|
this.slotLastAuctionIds.set(adUnitCode, resolvedAuctionId);
|
|
@@ -2589,8 +2626,7 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
2589
2626
|
transactionId: resolvedTransactionId,
|
|
2590
2627
|
mediaType: resolvedMediaType,
|
|
2591
2628
|
bid: bidTrace,
|
|
2592
|
-
refreshIndex: currentRefreshIndex
|
|
2593
|
-
emitRefreshEvent: false
|
|
2629
|
+
refreshIndex: currentRefreshIndex
|
|
2594
2630
|
});
|
|
2595
2631
|
}
|
|
2596
2632
|
}
|
|
@@ -2601,7 +2637,9 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
2601
2637
|
enqueue(type, eventName, data, level) {
|
|
2602
2638
|
if (!this.isEnabled) return;
|
|
2603
2639
|
if (!this.shouldSample(type, level)) return;
|
|
2604
|
-
|
|
2640
|
+
if (this.managesSessionId && sessionNeedsSync()) {
|
|
2641
|
+
this.config.sessionId = getOrCreateSessionId();
|
|
2642
|
+
}
|
|
2605
2643
|
const protoEvent = {
|
|
2606
2644
|
eventId: idToBytes(generateUUID()),
|
|
2607
2645
|
timestampMs: Date.now(),
|
|
@@ -2635,7 +2673,12 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
2635
2673
|
protoEvent.viewableDurationMs = Number.isFinite(data.viewableDurationMs) ? data.viewableDurationMs : 0;
|
|
2636
2674
|
}
|
|
2637
2675
|
if (data.bidderOutcomes && Array.isArray(data.bidderOutcomes)) {
|
|
2638
|
-
protoEvent.bidderOutcomes = data.bidderOutcomes
|
|
2676
|
+
protoEvent.bidderOutcomes = data.bidderOutcomes.map(
|
|
2677
|
+
(entry) => ({
|
|
2678
|
+
...entry,
|
|
2679
|
+
refreshIndex: entry.refreshIndex ?? this.auctionCycleIndex(entry.adUnitCode || "")
|
|
2680
|
+
})
|
|
2681
|
+
);
|
|
2639
2682
|
}
|
|
2640
2683
|
const metadata = { ...data.metadata };
|
|
2641
2684
|
if (data.error !== void 0 && data.error !== null) {
|
|
@@ -3764,8 +3807,7 @@ function attachVideoPlayer(analytics, target, options) {
|
|
|
3764
3807
|
transactionId: transactionId || cachedInitial?.transactionId,
|
|
3765
3808
|
mediaType: "video",
|
|
3766
3809
|
bid: cachedInitial?.bidTrace || options?.bid,
|
|
3767
|
-
metadata: options?.metadata
|
|
3768
|
-
emitRefreshEvent: false
|
|
3810
|
+
metadata: options?.metadata
|
|
3769
3811
|
});
|
|
3770
3812
|
}
|
|
3771
3813
|
const cleanup = () => {
|
|
@@ -3847,6 +3889,8 @@ function getbidkernel(alias = "bidkernel") {
|
|
|
3847
3889
|
getbidkernel,
|
|
3848
3890
|
hookImaPrototype,
|
|
3849
3891
|
initImaInterception,
|
|
3892
|
+
isSessionActive,
|
|
3850
3893
|
isTrustedEndpoint,
|
|
3894
|
+
onSessionResume,
|
|
3851
3895
|
registerPrebidAnalytics
|
|
3852
3896
|
});
|
package/dist/index.mjs
CHANGED
|
@@ -297,7 +297,6 @@ var TraceEventType = {
|
|
|
297
297
|
VIEWABLE: 6,
|
|
298
298
|
/** TIME_IN_VIEW - accumulated in-viewport duration (once per render cycle end) */
|
|
299
299
|
TIME_IN_VIEW: 7,
|
|
300
|
-
REFRESH: 8,
|
|
301
300
|
ERROR: 9,
|
|
302
301
|
SLOT_DEFINED: 10,
|
|
303
302
|
SLOT_DESTROYED: 11,
|
|
@@ -720,7 +719,7 @@ var TraceEvent_MetadataEntry = {
|
|
|
720
719
|
}
|
|
721
720
|
};
|
|
722
721
|
function createBaseBidderOutcomeEntry() {
|
|
723
|
-
return { adUnitCode: "", outcome: 0, bid: void 0 };
|
|
722
|
+
return { adUnitCode: "", outcome: 0, bid: void 0, refreshIndex: 0 };
|
|
724
723
|
}
|
|
725
724
|
var BidderOutcomeEntry = {
|
|
726
725
|
encode(message, writer = new BinaryWriter()) {
|
|
@@ -733,6 +732,9 @@ var BidderOutcomeEntry = {
|
|
|
733
732
|
if (message.bid !== void 0) {
|
|
734
733
|
BidTrace.encode(message.bid, writer.uint32(50).fork()).join();
|
|
735
734
|
}
|
|
735
|
+
if (message.refreshIndex !== void 0 && message.refreshIndex !== 0) {
|
|
736
|
+
writer.uint32(56).int32(message.refreshIndex);
|
|
737
|
+
}
|
|
736
738
|
return writer;
|
|
737
739
|
},
|
|
738
740
|
decode(input, length) {
|
|
@@ -763,6 +765,13 @@ var BidderOutcomeEntry = {
|
|
|
763
765
|
message.bid = BidTrace.decode(reader, reader.uint32());
|
|
764
766
|
continue;
|
|
765
767
|
}
|
|
768
|
+
case 7: {
|
|
769
|
+
if (tag !== 56) {
|
|
770
|
+
break;
|
|
771
|
+
}
|
|
772
|
+
message.refreshIndex = reader.int32();
|
|
773
|
+
continue;
|
|
774
|
+
}
|
|
766
775
|
}
|
|
767
776
|
if ((tag & 7) === 4 || tag === 0) {
|
|
768
777
|
break;
|
|
@@ -949,7 +958,6 @@ var EVENT_NAME_TO_TYPE = {
|
|
|
949
958
|
adRenderFailed: TraceEventType.AD_RENDER_FAILED,
|
|
950
959
|
click: TraceEventType.CLICK,
|
|
951
960
|
impression: TraceEventType.IMPRESSION,
|
|
952
|
-
refresh: TraceEventType.REFRESH,
|
|
953
961
|
timeInView: TraceEventType.TIME_IN_VIEW,
|
|
954
962
|
viewable: TraceEventType.VIEWABLE
|
|
955
963
|
};
|
|
@@ -1038,49 +1046,83 @@ function sameEndpointOrigin(a, b) {
|
|
|
1038
1046
|
}
|
|
1039
1047
|
var SESSION_PERSIST_INTERVAL_MS = 60 * 1e3;
|
|
1040
1048
|
var persistedSessionTs = 0;
|
|
1041
|
-
|
|
1049
|
+
var ACTIVITY_EVENTS = ["pointerdown", "pointermove", "keydown", "scroll", "wheel", "touchstart"];
|
|
1050
|
+
var activityListenersBound = false;
|
|
1051
|
+
var sessionResumeListeners = /* @__PURE__ */ new Set();
|
|
1052
|
+
function persistSessionTs(ts) {
|
|
1042
1053
|
try {
|
|
1043
1054
|
if (typeof localStorage !== "undefined") {
|
|
1044
|
-
localStorage.setItem(SESSION_TS_KEY,
|
|
1045
|
-
persistedSessionTs =
|
|
1055
|
+
localStorage.setItem(SESSION_TS_KEY, ts.toString());
|
|
1056
|
+
persistedSessionTs = ts;
|
|
1046
1057
|
}
|
|
1047
1058
|
} catch {
|
|
1048
1059
|
}
|
|
1049
1060
|
}
|
|
1050
|
-
function
|
|
1061
|
+
function isSessionActive(now = Date.now()) {
|
|
1062
|
+
return inMemorySessionTs > 0 && now - inMemorySessionTs <= THIRTY_MINUTES_MS;
|
|
1063
|
+
}
|
|
1064
|
+
function onSessionResume(listener) {
|
|
1065
|
+
bindActivityListeners();
|
|
1066
|
+
sessionResumeListeners.add(listener);
|
|
1067
|
+
return () => {
|
|
1068
|
+
sessionResumeListeners.delete(listener);
|
|
1069
|
+
};
|
|
1070
|
+
}
|
|
1071
|
+
function recordActivity() {
|
|
1051
1072
|
const now = Date.now();
|
|
1073
|
+
const lapsed = !!inMemorySessionId && !isSessionActive(now);
|
|
1052
1074
|
inMemorySessionTs = now;
|
|
1053
|
-
if (
|
|
1075
|
+
if (lapsed) {
|
|
1076
|
+
inMemorySessionId = null;
|
|
1077
|
+
for (const listener of sessionResumeListeners) listener();
|
|
1078
|
+
return;
|
|
1079
|
+
}
|
|
1080
|
+
if (!storageAllowed || !inMemorySessionId || persistedSessionTs === 0) return;
|
|
1054
1081
|
if (now - persistedSessionTs < SESSION_PERSIST_INTERVAL_MS) return;
|
|
1055
1082
|
persistSessionTs(now);
|
|
1056
1083
|
}
|
|
1084
|
+
function sessionNeedsSync() {
|
|
1085
|
+
return !inMemorySessionId || storageAllowed && persistedSessionTs === 0;
|
|
1086
|
+
}
|
|
1087
|
+
function bindActivityListeners() {
|
|
1088
|
+
if (activityListenersBound || typeof window === "undefined") return;
|
|
1089
|
+
activityListenersBound = true;
|
|
1090
|
+
const onActivity = () => recordActivity();
|
|
1091
|
+
for (const name of ACTIVITY_EVENTS) {
|
|
1092
|
+
window.addEventListener(name, onActivity, { passive: true, capture: true });
|
|
1093
|
+
}
|
|
1094
|
+
if (typeof document !== "undefined") {
|
|
1095
|
+
document.addEventListener("visibilitychange", () => {
|
|
1096
|
+
if (document.visibilityState === "visible") recordActivity();
|
|
1097
|
+
});
|
|
1098
|
+
}
|
|
1099
|
+
}
|
|
1057
1100
|
function getOrCreateSessionId() {
|
|
1058
1101
|
const now = Date.now();
|
|
1059
|
-
const memoryFresh = !!inMemorySessionId &&
|
|
1102
|
+
const memoryFresh = !!inMemorySessionId && isSessionActive(now);
|
|
1060
1103
|
try {
|
|
1061
1104
|
if (storageAllowed && typeof localStorage !== "undefined") {
|
|
1062
1105
|
const storedId = localStorage.getItem(SESSION_KEY);
|
|
1063
1106
|
const tsStr = localStorage.getItem(SESSION_TS_KEY);
|
|
1064
1107
|
const storedTs = tsStr ? parseInt(tsStr, 10) || 0 : 0;
|
|
1065
1108
|
if (storedId && storedTs && now - storedTs <= THIRTY_MINUTES_MS) {
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1109
|
+
if (inMemorySessionId !== storedId || inMemorySessionTs < storedTs) {
|
|
1110
|
+
inMemorySessionId = storedId;
|
|
1111
|
+
inMemorySessionTs = Math.max(inMemorySessionTs, storedTs);
|
|
1112
|
+
}
|
|
1113
|
+
if (persistedSessionTs === 0) persistedSessionTs = storedTs;
|
|
1069
1114
|
return storedId;
|
|
1070
1115
|
}
|
|
1071
1116
|
const newId = memoryFresh ? inMemorySessionId : generateUUID();
|
|
1117
|
+
if (!memoryFresh) inMemorySessionTs = now;
|
|
1072
1118
|
localStorage.setItem(SESSION_KEY, newId);
|
|
1073
|
-
persistSessionTs(
|
|
1119
|
+
persistSessionTs(inMemorySessionTs);
|
|
1074
1120
|
inMemorySessionId = newId;
|
|
1075
|
-
inMemorySessionTs = now;
|
|
1076
1121
|
return newId;
|
|
1077
1122
|
}
|
|
1078
1123
|
} catch {
|
|
1079
1124
|
}
|
|
1080
|
-
if (
|
|
1081
|
-
inMemorySessionTs = now;
|
|
1082
|
-
return inMemorySessionId;
|
|
1083
|
-
}
|
|
1125
|
+
if (memoryFresh) return inMemorySessionId;
|
|
1084
1126
|
inMemorySessionId = generateUUID();
|
|
1085
1127
|
inMemorySessionTs = now;
|
|
1086
1128
|
return inMemorySessionId;
|
|
@@ -1240,6 +1282,10 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
1240
1282
|
// Compacted bidder participation map per auction: auctionId -> Map<`${bidder}:${adUnitCode}`, BidderOutcomeEntry>
|
|
1241
1283
|
auctionBidderOutcomes = /* @__PURE__ */ new Map();
|
|
1242
1284
|
logger;
|
|
1285
|
+
// True when this instance owns its session id (none was supplied), so the
|
|
1286
|
+
// id follows the page-wide session as it lapses and restarts. An id the
|
|
1287
|
+
// integration supplied is stamped as given.
|
|
1288
|
+
managesSessionId;
|
|
1243
1289
|
constructor(config) {
|
|
1244
1290
|
if (config.storageAllowed !== void 0) {
|
|
1245
1291
|
_BidkernelPrebidAnalytics.setStorageAllowed(config.storageAllowed);
|
|
@@ -1250,7 +1296,7 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
1250
1296
|
endpoint,
|
|
1251
1297
|
propertyId: config.propertyId || "",
|
|
1252
1298
|
pageviewId: config.pageviewId || generateUUID(),
|
|
1253
|
-
sessionId: config.sessionId ||
|
|
1299
|
+
sessionId: config.sessionId || "",
|
|
1254
1300
|
userId: config.userId || "",
|
|
1255
1301
|
deviceType: config.deviceType || "desktop",
|
|
1256
1302
|
country: config.country || "",
|
|
@@ -1269,6 +1315,9 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
1269
1315
|
prefix: "[bidkernel][prebid-analytics]",
|
|
1270
1316
|
logLevel: this.config.logLevel
|
|
1271
1317
|
});
|
|
1318
|
+
recordActivity();
|
|
1319
|
+
this.managesSessionId = !config.sessionId;
|
|
1320
|
+
if (this.managesSessionId) this.config.sessionId = getOrCreateSessionId();
|
|
1272
1321
|
if (requestedEndpoint && !endpoint) {
|
|
1273
1322
|
this.log(
|
|
1274
1323
|
"ERROR",
|
|
@@ -1317,6 +1366,7 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
1317
1366
|
if (typeof document !== "undefined") {
|
|
1318
1367
|
document.addEventListener("visibilitychange", this.boundVisibilityChange);
|
|
1319
1368
|
}
|
|
1369
|
+
bindActivityListeners();
|
|
1320
1370
|
this.flushTimer = setInterval(() => this.flush(), FLUSH_INTERVAL_MS);
|
|
1321
1371
|
this.resendPersistedBatches();
|
|
1322
1372
|
}
|
|
@@ -1613,8 +1663,7 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
1613
1663
|
const record = this.slotViewabilityRecords.get(slotId);
|
|
1614
1664
|
if (record && record.element !== element) {
|
|
1615
1665
|
this.observeSlot(element, slotId, {
|
|
1616
|
-
refreshIndex: record.refreshIndex
|
|
1617
|
-
emitRefreshEvent: false
|
|
1666
|
+
refreshIndex: record.refreshIndex
|
|
1618
1667
|
});
|
|
1619
1668
|
}
|
|
1620
1669
|
}
|
|
@@ -1802,18 +1851,6 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
1802
1851
|
this.flushSlotTimeInView(resolvedSlotId);
|
|
1803
1852
|
const nextRefreshIndex = options?.refreshIndex !== void 0 ? options.refreshIndex : (this.slotRefreshIndices.get(resolvedSlotId) ?? existing.refreshIndex) + 1;
|
|
1804
1853
|
this.slotRefreshIndices.set(resolvedSlotId, nextRefreshIndex);
|
|
1805
|
-
if (options?.emitRefreshEvent !== false) {
|
|
1806
|
-
this.enqueue(TraceEventType.REFRESH, "refresh", {
|
|
1807
|
-
auctionId: options?.auctionId || existing.auctionId,
|
|
1808
|
-
transactionId: options?.transactionId || existing.transactionId,
|
|
1809
|
-
adUnitCode: resolvedSlotId,
|
|
1810
|
-
bid: options?.bid ?? existing.bidPayload,
|
|
1811
|
-
metadata: {
|
|
1812
|
-
...options?.metadata,
|
|
1813
|
-
refresh_index: String(nextRefreshIndex)
|
|
1814
|
-
}
|
|
1815
|
-
});
|
|
1816
|
-
}
|
|
1817
1854
|
if (existing.dwellTimer) {
|
|
1818
1855
|
clearTimeout(existing.dwellTimer);
|
|
1819
1856
|
existing.dwellTimer = null;
|
|
@@ -2076,16 +2113,6 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
2076
2113
|
rec.viewableFired = false;
|
|
2077
2114
|
rec.accumulatedTimeInViewMs = 0;
|
|
2078
2115
|
}
|
|
2079
|
-
this.enqueue(TraceEventType.REFRESH, "refresh", {
|
|
2080
|
-
auctionId,
|
|
2081
|
-
transactionId,
|
|
2082
|
-
adUnitCode: targetSlot,
|
|
2083
|
-
bid: bidTrace,
|
|
2084
|
-
metadata: {
|
|
2085
|
-
...options?.metadata,
|
|
2086
|
-
refresh_index: String(nextRefreshIndex)
|
|
2087
|
-
}
|
|
2088
|
-
});
|
|
2089
2116
|
} else if (targetSlot) {
|
|
2090
2117
|
if (auctionId) {
|
|
2091
2118
|
this.slotLastAuctionIds.set(targetSlot, auctionId);
|
|
@@ -2213,6 +2240,8 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
2213
2240
|
}
|
|
2214
2241
|
setSessionId(sessionId) {
|
|
2215
2242
|
this.config.sessionId = sessionId;
|
|
2243
|
+
this.managesSessionId = !sessionId;
|
|
2244
|
+
if (this.managesSessionId) this.config.sessionId = getOrCreateSessionId();
|
|
2216
2245
|
}
|
|
2217
2246
|
navigate(pageviewId, pageUrl) {
|
|
2218
2247
|
this.disable();
|
|
@@ -2230,7 +2259,7 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
2230
2259
|
this.pageUrl = "";
|
|
2231
2260
|
}
|
|
2232
2261
|
this.logger.resetTiming();
|
|
2233
|
-
|
|
2262
|
+
recordActivity();
|
|
2234
2263
|
this.enable();
|
|
2235
2264
|
}
|
|
2236
2265
|
handleAuctionInit(data) {
|
|
@@ -2261,6 +2290,19 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
2261
2290
|
bidderOutcomes
|
|
2262
2291
|
});
|
|
2263
2292
|
}
|
|
2293
|
+
/**
|
|
2294
|
+
* The render cycle an auction ending now would fill for an ad unit: 0 for
|
|
2295
|
+
* a slot that has never rendered on this pageview, otherwise one past the
|
|
2296
|
+
* cycle it last rendered. The index only advances when a creative renders,
|
|
2297
|
+
* so two unfilled refresh auctions in a row report the same cycle; both
|
|
2298
|
+
* count as refreshes, which is the point. Stamped on AUCTION_END bidder
|
|
2299
|
+
* outcomes in enqueue; there is no per-refresh event.
|
|
2300
|
+
*/
|
|
2301
|
+
auctionCycleIndex(adUnitCode) {
|
|
2302
|
+
if (!adUnitCode) return 0;
|
|
2303
|
+
const last = this.slotRefreshIndices.get(adUnitCode) ?? this.slotViewabilityRecords.get(adUnitCode)?.refreshIndex;
|
|
2304
|
+
return last === void 0 ? 0 : last + 1;
|
|
2305
|
+
}
|
|
2264
2306
|
handleBidRequested(data) {
|
|
2265
2307
|
if (this.isDuplicate("bidRequested", data)) return;
|
|
2266
2308
|
this.log("DEBUG", "bidRequested", data);
|
|
@@ -2470,13 +2512,6 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
2470
2512
|
record.viewableFired = false;
|
|
2471
2513
|
record.accumulatedTimeInViewMs = 0;
|
|
2472
2514
|
}
|
|
2473
|
-
this.enqueue(TraceEventType.REFRESH, "refresh", {
|
|
2474
|
-
auctionId: resolvedAuctionId,
|
|
2475
|
-
transactionId: resolvedTransactionId,
|
|
2476
|
-
adUnitCode,
|
|
2477
|
-
bid: bidTrace,
|
|
2478
|
-
metadata: { refresh_index: String(nextRefreshIndex) }
|
|
2479
|
-
});
|
|
2480
2515
|
} else if (adUnitCode) {
|
|
2481
2516
|
if (resolvedAuctionId) {
|
|
2482
2517
|
this.slotLastAuctionIds.set(adUnitCode, resolvedAuctionId);
|
|
@@ -2552,8 +2587,7 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
2552
2587
|
transactionId: resolvedTransactionId,
|
|
2553
2588
|
mediaType: resolvedMediaType,
|
|
2554
2589
|
bid: bidTrace,
|
|
2555
|
-
refreshIndex: currentRefreshIndex
|
|
2556
|
-
emitRefreshEvent: false
|
|
2590
|
+
refreshIndex: currentRefreshIndex
|
|
2557
2591
|
});
|
|
2558
2592
|
}
|
|
2559
2593
|
}
|
|
@@ -2564,7 +2598,9 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
2564
2598
|
enqueue(type, eventName, data, level) {
|
|
2565
2599
|
if (!this.isEnabled) return;
|
|
2566
2600
|
if (!this.shouldSample(type, level)) return;
|
|
2567
|
-
|
|
2601
|
+
if (this.managesSessionId && sessionNeedsSync()) {
|
|
2602
|
+
this.config.sessionId = getOrCreateSessionId();
|
|
2603
|
+
}
|
|
2568
2604
|
const protoEvent = {
|
|
2569
2605
|
eventId: idToBytes(generateUUID()),
|
|
2570
2606
|
timestampMs: Date.now(),
|
|
@@ -2598,7 +2634,12 @@ var BidkernelPrebidAnalytics = class _BidkernelPrebidAnalytics {
|
|
|
2598
2634
|
protoEvent.viewableDurationMs = Number.isFinite(data.viewableDurationMs) ? data.viewableDurationMs : 0;
|
|
2599
2635
|
}
|
|
2600
2636
|
if (data.bidderOutcomes && Array.isArray(data.bidderOutcomes)) {
|
|
2601
|
-
protoEvent.bidderOutcomes = data.bidderOutcomes
|
|
2637
|
+
protoEvent.bidderOutcomes = data.bidderOutcomes.map(
|
|
2638
|
+
(entry) => ({
|
|
2639
|
+
...entry,
|
|
2640
|
+
refreshIndex: entry.refreshIndex ?? this.auctionCycleIndex(entry.adUnitCode || "")
|
|
2641
|
+
})
|
|
2642
|
+
);
|
|
2602
2643
|
}
|
|
2603
2644
|
const metadata = { ...data.metadata };
|
|
2604
2645
|
if (data.error !== void 0 && data.error !== null) {
|
|
@@ -3727,8 +3768,7 @@ function attachVideoPlayer(analytics, target, options) {
|
|
|
3727
3768
|
transactionId: transactionId || cachedInitial?.transactionId,
|
|
3728
3769
|
mediaType: "video",
|
|
3729
3770
|
bid: cachedInitial?.bidTrace || options?.bid,
|
|
3730
|
-
metadata: options?.metadata
|
|
3731
|
-
emitRefreshEvent: false
|
|
3771
|
+
metadata: options?.metadata
|
|
3732
3772
|
});
|
|
3733
3773
|
}
|
|
3734
3774
|
const cleanup = () => {
|
|
@@ -3809,6 +3849,8 @@ export {
|
|
|
3809
3849
|
getbidkernel,
|
|
3810
3850
|
hookImaPrototype,
|
|
3811
3851
|
initImaInterception,
|
|
3852
|
+
isSessionActive,
|
|
3812
3853
|
isTrustedEndpoint,
|
|
3854
|
+
onSessionResume,
|
|
3813
3855
|
registerPrebidAnalytics
|
|
3814
3856
|
};
|
package/package.json
CHANGED