1/* global FB, jpfbembed */ 2( function ( window ) { 3 var facebookEmbed = function () { 4 var fbroot, src, newScript, firstScript; 5 6 if ( 'undefined' !== typeof FB && FB.XFBML ) { 7 FB.XFBML.parse(); 8 } else { 9 fbroot = document.createElement( 'div' ); 10 fbroot.id = 'fb-root'; 11 document.getElementsByTagName( 'body' )[ 0 ].appendChild( fbroot ); 12 13 src = '//connect.facebook.net/' + jpfbembed.locale + '/sdk.js#xfbml=1'; 14 if ( jpfbembed.appid ) { 15 src += '&appId=' + jpfbembed.appid; 16 } 17 src += '&version=v2.3'; 18 19 newScript = document.createElement( 'script' ); 20 newScript.setAttribute( 'src', src ); 21 firstScript = document.querySelector( 'script' ); 22 firstScript.parentNode.insertBefore( newScript, firstScript ); 23 } 24 }; 25 26 window.fbAsyncInit = function () { 27 FB.init( { 28 appId: jpfbembed.appid, 29 version: 'v2.3', 30 } ); 31 32 FB.XFBML.parse(); 33 }; 34 35 if ( 'undefined' !== typeof infiniteScroll ) { 36 document.body.addEventListener( 'post-load', facebookEmbed ); 37 } 38 39 facebookEmbed(); 40} )( window ); 41; 42!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.JetpackScriptDataModule=t():e.JetpackScriptDataModule=t()}(globalThis,()=>(()=>{"use strict";var e={729(e,t,r){r.d(t,{$8:()=>n.$8,IT:()=>n.IT,KS:()=>n.KS,L2:()=>n.L2,Sy:()=>n.Sy,au:()=>n.au,d_:()=>n.d_,e5:()=>n.e5,hT:()=>n.hT,lI:()=>n.lI,mH:()=>n.mH,oQ:()=>n.oQ,sV:()=>n.sV});var n=r(336)},336(e,t,r){function n(){return window.JetpackScriptData}function o(){return n()?.site}function i(e=""){return`${n()?.site.admin_url}${e}`}function u(e=""){return i(`admin.php?page=jetpack${e}`)}function a(e=""){return i(`admin.php?page=my-jetpack${e}`)}function c(){return n()?.site.plan?.features?.active??[]}function s(e){return-1!==c().indexOf(e)}function p(){return"wpcom"===n()?.site?.host}function f(){return"woa"===n()?.site?.host}function d(){return n()?.site?.is_wpcom_platform}function l(){return"unknown"===n()?.site?.host}function m(){return p()?"simple":f()?"woa":"jetpack"}function S(e){return n()?.user.current_user.capabilities[e]}r.d(t,{$8:()=>d,IT:()=>s,KS:()=>m,L2:()=>l,Sy:()=>p,au:()=>n,d_:()=>S,e5:()=>a,hT:()=>i,lI:()=>f,mH:()=>c,oQ:()=>u,sV:()=>o})}};const t={};function r(n){const o=t[n];if(void 0!==o)return o.exports;const i=t[n]={exports:{}};return e[n](i,i.exports,r),i.exports}r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.hasOwn(e,t),r.r=e=>{Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};let n={};r.r(n),r.d(n,{currentUserCan:()=>o.d_,getActiveFeatures:()=>o.mH,getAdminUrl:()=>o.hT,getJetpackAdminPageUrl:()=>o.oQ,getMyJetpackUrl:()=>o.e5,getScriptData:()=>o.au,getSiteData:()=>o.sV,getSiteType:()=>o.KS,isJetpackSelfHostedSite:()=>o.L2,isSimpleSite:()=>o.Sy,isWoASite:()=>o.lI,isWpcomPlatformSite:()=>o.$8,siteHasFeature:()=>o.IT});var o=r(729);return n})());; 43/** 44 * Observe how the user enters content into the comment form in order to determine whether it's a bot or not. 45 * 46 * Note that no actual input is being saved here, only counts and timings between events. 47 */ 48 49( function() { 50 // Passive event listeners are guaranteed to never call e.preventDefault(), 51 // but they're not supported in all browsers. Use this feature detection 52 // to determine whether they're available for use. 53 var supportsPassive = false; 54 55 try { 56 var opts = Object.defineProperty( {}, 'passive', { 57 get : function() { 58 supportsPassive = true; 59 } 60 } ); 61 62 window.addEventListener( 'testPassive', null, opts ); 63 window.removeEventListener( 'testPassive', null, opts ); 64 } catch ( e ) {} 65 66 function init() { 67 var input_begin = ''; 68 69 var keydowns = {}; 70 var lastKeyup = null; 71 var lastKeydown = null; 72 var keypresses = []; 73 74 var modifierKeys = []; 75 var correctionKeys = []; 76 77 var lastMouseup = null; 78 var lastMousedown = null; 79 var mouseclicks = []; 80 var mouseclickCoordinates = []; 81 82 var mousemoveTimer = null; 83 var lastMousemoveX = null; 84 var lastMousemoveY = null; 85 var lastMousemoveTime = null; 86 var mousemoveStart = null; 87 var mousemoves = []; 88 var intervalsBetweenMousemovesAndClicks = []; 89 90 var touchmoveCountTimer = null; 91 var touchmoveCount = 0; 92 93 var lastTouchEnd = null; 94 var lastTouchStart = null; 95 var touchEvents = []; 96 97 var scrollCountTimer = null; 98 var scrollCount = 0; 99 100 var correctionKeyCodes = [ 'Backspace', 'Delete', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Home', 'End', 'PageUp', 'PageDown' ]; 101 var modifierKeyCodes = [ 'Shift', 'CapsLock' ]; 102 103 var forms = document.querySelectorAll( 'form[method=post]' ); 104 105 for ( var i = 0; i < forms.length; i++ ) { 106 var form = forms[i]; 107 108 var formAction = form.getAttribute( 'action' ); 109 110 // Ignore forms that POST directly to other domains; these could be things like payment forms. 111 if ( formAction ) { 112 // Check that the form is posting to an external URL, not a path. 113 if ( formAction.indexOf( 'http://' ) == 0 || formAction.indexOf( 'https://' ) == 0 ) { 114 if ( formAction.indexOf( 'http://' + window.location.hostname + '/' ) != 0 && formAction.indexOf( 'https://' + window.location.hostname + '/' ) != 0 ) { 115 continue; 116 } 117 } 118 } 119 120 form.addEventListener( 'submit', function () { 121 var ak_bkp = prepare_array_for_request( keypresses ); 122 var ak_bmc = prepare_array_for_request( mouseclicks ); 123 var ak_bte = prepare_array_for_request( touchEvents ); 124 var ak_bmm = prepare_array_for_request( mousemoves ); 125 var ak_bcc = prepare_array_for_request( mouseclickCoordinates ); 126 var ak_bibmac = intervalsBetweenMousemovesAndClicks.slice( 0, 100 ).join( ';' ); 127 128 var input_fields = { 129 // When did the user begin entering any input? 130 'bib': input_begin, 131 132 // When was the form submitted? 133 'bfs': Date.now(), 134 135 // How many keypresses did they make? 136 'bkpc': keypresses.length, 137
138 // How quickly did they press a sample of keys, and how long between them? 139 'bkp': ak_bkp, 140 141 // How quickly did they click the mouse, and how long between clicks? 142 'bmc': ak_bmc, 143 144 // How many mouseclicks did they make? 145 'bmcc': mouseclicks.length, 146 147 // When did they press modifier keys (like Shift or Capslock)? 148 'bmk': modifierKeys.join( ';' ), 149 150 // When did they correct themselves? e.g., press Backspace, or use the arrow keys to move the cursor back 151 'bck': correctionKeys.join( ';' ), 152 153 // How many times did they move the mouse? 154 'bmmc': mousemoves.length, 155 156 // How many times did they move around using a touchscreen? 157 'btmc': touchmoveCount, 158 159 // How many times did they scroll? 160 'bsc': scrollCount, 161 162 // How quickly did they perform touch events, and how long between them? 163 'bte': ak_bte, 164 165 // How many touch events were there? 166 'btec' : touchEvents.length, 167 168 // How quickly did they move the mouse, and how long between moves? 169 'bmm' : ak_bmm, 170 171 // Click coordinates 172 'bcc' : ak_bcc, 173 174 // Milliseconds between last mouse movement and each click 175 'bibmac' : ak_bibmac 176 }; 177 178 var akismet_field_prefix = 'ak_'; 179 180 if ( this.getElementsByClassName ) { 181 // Check to see if we've used an alternate field name prefix. We store this as an attribute of the container around some of the Akismet fields. 182 var possible_akismet_containers = this.getElementsByClassName( 'akismet-fields-container' ); 183 184 for ( var containerIndex = 0; containerIndex < possible_akismet_containers.length; containerIndex++ ) { 185 var container = possible_akismet_containers.item( containerIndex ); 186 187 if ( container.getAttribute( 'data-prefix' ) ) { 188 akismet_field_prefix = container.getAttribute( 'data-prefix' ); 189 break; 190 } 191 } 192 } 193 194 for ( var field_name in input_fields ) { 195 var field = document.createElement( 'input' ); 196 field.setAttribute( 'type', 'hidden' ); 197 field.setAttribute( 'name', akismet_field_prefix + field_name ); 198 field.setAttribute( 'value', input_fields[ field_name ] ); 199 this.appendChild( field ); 200 } 201 }, supportsPassive ? { passive: true } : false ); 202 203 form.addEventListener( 'keydown', function ( e ) { 204 // If you hold a key down, some browsers send multiple keydown events in a row. 205 // Ignore any keydown events for a key that hasn't come back up yet. 206 if ( e.key in keydowns ) { 207 return; 208 } 209 210 var keydownTime = ( new Date() ).getTime(); 211 keydowns[ e.key ] = [ keydownTime ]; 212 213 if ( ! input_begin ) { 214 input_begin = keydownTime; 215 } 216 217 // In some situations, we don't want to record an interval since the last keypress -- for example, 218 // on the first keypress, or on a keypress after focus has changed to another element. Normally, 219 // we want to record the time between the last keyup and this keydown. But if they press a 220 // key while already pressing a key, we want to record the time between the two keydowns. 221 222 var lastKeyEvent = Math.max( lastKeydown, lastKeyup ); 223 224 if ( lastKeyEvent ) { 225 keydowns[ e.key ].push( keydownTime - lastKeyEvent ); 226 } 227 228 lastKeydown = keydownTime; 229 }, supportsPassive ? { passive: true } : false ); 230 231 form.addEventListener( 'keyup', function ( e ) { 232 if ( ! ( e.key in keydowns ) ) { 233 // This key was pressed before this script was loaded, or a mouseclick happened during the keypress, or... 234 return; 235 } 236 237 var keyupTime = ( new Date() ).getTime(); 238 239 if ( 'TEXTAREA' === e.target.nodeName || 'INPUT' === e.target.nodeName ) { 240 if ( -1 !== modifierKeyCodes.indexOf( e.key ) ) { 241 modifierKeys.push( keypresses.length - 1 ); 242 } else if ( -1 !== correctionKeyCodes.indexOf( e.key ) ) { 243 correctionKeys.push( keypresses.length - 1 ); 244 } else { 245 // ^ Don't record timings for keys like Shift or backspace, since they 246 // typically get held down for longer than regular typing. 247 248 var keydownTime = keydowns[ e.key ][0]; 249 250 var keypress = []; 251 252 // Keypress duration. 253 keypress.push( keyupTime - keydownTime ); 254 255 // Amount of time between this keypress and the previous keypress. 256 if ( keydowns[ e.key ].length > 1 ) { 257 keypress.push( keydowns[ e.key ][1] ); 258 } 259 260 keypresses.push( keypress ); 261 } 262 } 263
264 delete keydowns[ e.key ]; 265 266 lastKeyup = keyupTime; 267 }, supportsPassive ? { passive: true } : false ); 268 269 form.addEventListener( "focusin", function ( e ) { 270 lastKeydown = null; 271 lastKeyup = null; 272 keydowns = {}; 273 }, supportsPassive ? { passive: true } : false ); 274 275 form.addEventListener( "focusout", function ( e ) { 276 lastKeydown = null; 277 lastKeyup = null; 278 keydowns = {}; 279 }, supportsPassive ? { passive: true } : false ); 280 } 281 282 document.addEventListener( 'mousedown', function ( e ) { 283 lastMousedown = ( new Date() ).getTime(); 284 285 if ( lastMousemoveTime ) { 286 intervalsBetweenMousemovesAndClicks.push( lastMousedown - lastMousemoveTime ); 287 } 288 289 var mouseclickCoordinate = []; 290 291 var rect = e.target.getBoundingClientRect(); 292 var relativeX = e.clientX - rect.left; 293 var relativeY = e.clientY - rect.top; 294 295 // Pixel offset of the click within the target element. 296 mouseclickCoordinate.push( Math.round( relativeX ) ); 297 mouseclickCoordinate.push( Math.round( relativeY ) ); 298 299 // Percentage offset of the click within the target element. 300 mouseclickCoordinate.push( rect.width > 0 ? Math.round( relativeX / rect.width * 100 ) : 0 ); 301 mouseclickCoordinate.push( rect.height > 0 ? Math.round( relativeY / rect.height * 100 ) : 0 ); 302 303 mouseclickCoordinates.push( mouseclickCoordinate ); 304 }, supportsPassive ? { passive: true } : false ); 305 306 document.addEventListener( 'mouseup', function ( e ) { 307 if ( ! lastMousedown ) { 308 // If the mousedown happened before this script was loaded, but the mouseup happened after... 309 return; 310 } 311 312 var now = ( new Date() ).getTime(); 313 314 var mouseclick = []; 315 mouseclick.push( now - lastMousedown ); 316 317 if ( lastMouseup ) { 318 mouseclick.push( lastMousedown - lastMouseup ); 319 } 320 321 mouseclicks.push( mouseclick ); 322 323 lastMouseup = now; 324 325 // If the mouse has been clicked, don't record this time as an interval between keypresses. 326 lastKeydown = null; 327 lastKeyup = null; 328 keydowns = {}; 329 }, supportsPassive ? { passive: true } : false ); 330 331 document.addEventListener( 'mousemove', function ( e ) { 332 lastMousemoveTime = ( new Date() ).getTime(); 333 334 if ( mousemoveTimer ) { 335 clearTimeout( mousemoveTimer ); 336 mousemoveTimer = null; 337 } 338 else { 339 mousemoveStart = lastMousemoveTime; 340 lastMousemoveX = e.offsetX; 341 lastMousemoveY = e.offsetY; 342 } 343 344 mousemoveTimer = setTimeout( function ( theEvent, originalMousemoveStart ) { 345 var now = ( new Date() ).getTime() - 500; // To account for the timer delay. 346 347 var mousemove = []; 348 mousemove.push( now - originalMousemoveStart ); 349 mousemove.push( 350 Math.round( 351 Math.sqrt( 352 Math.pow( theEvent.offsetX - lastMousemoveX, 2 ) + 353 Math.pow( theEvent.offsetY - lastMousemoveY, 2 ) 354 ) 355 ) 356 ); 357 358 if ( mousemove[1] > 0 ) { 359 // If there was no measurable distance, then it wasn't really a move. 360 mousemoves.push( mousemove ); 361 } 362 363 mousemoveStart = null; 364 mousemoveTimer = null; 365 }, 500, e, mousemoveStart ); 366 }, supportsPassive ? { passive: true } : false ); 367 368 document.addEventListener( 'touchmove', function ( e ) { 369 if ( touchmoveCountTimer ) { 370 clearTimeout( touchmoveCountTimer ); 371 } 372 373 touchmoveCountTimer = setTimeout( function () { 374 touchmoveCount++; 375 }, 500 ); 376 }, supportsPassive ? { passive: true } : false ); 377 378 document.addEventListener( 'touchstart', function ( e ) { 379 lastTouchStart = ( new Date() ).getTime(); 380 }, supportsPassive ? { passive: true } : false ); 381 382 document.addEventListener( 'touchend', function ( e ) { 383 if ( ! lastTouchStart ) { 384 // If the touchstart happened before this script was loaded, but the touchend happened after... 385 return; 386 } 387 388 var now = ( new Date() ).getTime(); 389 390 var touchEvent = []; 391 touchEvent.push( now - lastTouchStart ); 392 393 if ( lastTouchEnd ) { 394 touchEvent.push( lastTouchStart - lastTouchEnd ); 395 } 396 397 touchEvents.push( touchEvent ); 398 399 lastTouchEnd = now; 400 401 // Don't record this time as an interval between keypresses. 402 lastKeydown = null; 403 lastKeyup = null; 404 keydowns = {}; 405 }, supportsPassive ? { passive: true } : false ); 406 407 document.addEventListener( 'scroll', function ( e ) {
408 if ( scrollCountTimer ) { 409 clearTimeout( scrollCountTimer ); 410 } 411 412 scrollCountTimer = setTimeout( function () { 413 scrollCount++; 414 }, 500 ); 415 }, supportsPassive ? { passive: true } : false ); 416 } 417 418 /** 419 * For the timing/coordinate data that is collected, don't send more than `limit` data points in the request. 420 * Choose a random slice and send those, with each batch separated by semicolons and the items in each batch 421 * separated by commas. 422 */ 423 function prepare_array_for_request( a, limit ) { 424 if ( ! limit ) { 425 limit = 100; 426 } 427 428 var rv = ''; 429 430 if ( a.length > 0 ) { 431 var random_starting_point = Math.max( 0, Math.floor( Math.random() * a.length - limit ) ); 432 433 for ( var i = 0; i < limit && i < a.length; i++ ) { 434 var entry = a[ random_starting_point + i ]; 435 rv += entry.join( ',' ) + ';'; 436 } 437 } 438 439 return rv; 440 } 441 442 if ( document.readyState !== 'loading' ) { 443 init(); 444 } else { 445 document.addEventListener( 'DOMContentLoaded', init ); 446 } 447})();;
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.