We want you to turn your living room into a hotbox. (No, we don’t mean the smoke-filled Camaro from your high school days.) We mean we want you to transform any spare space into your sweat gauntlet in lieu of a gym. As such, we’re putting the spotlight on five pieces of smart home gym equipment that provide personalized attention from virtual trainers, progressive challenges via artificial intelligence and detailed insight thanks to sensors. Best of all, no one will know if (read: when) you drag your dog-tired body into the bathroom and sit in the shower for 45 minutes post-workout. It’s your world.
(function() {
var checkJWReady = setInterval( function() {
if (“undefined” !== typeof jwplayer) {
if(typeof(jQuery)==”function”){(function($){$.fn.fitVids=function(){}})(jQuery)};
var el = decodeURIComponent( ‘jwplayer_kpqvImMR_eEkK759I_div’ );
var mHash = ‘ami’ + decodeURIComponent( ‘kpqvImMR’ );
window.jwpDef[mHash] = JSON.parse( decodeURIComponent( ‘%7B%22advertising%22%3A%7B%22admessage%22%3A%22This%20video%20will%20resume%20in%20xx%20seconds%22%2C%22adscheduleid%22%3A%22VNLk4XpY%22%2C%22autoplayadsmuted%22%3Atrue%2C%22bids%22%3A%7B%22bidders%22%3A%5B%7B%22invCode%22%3A%221922098%22%2C%22member%22%3A%221287%22%2C%22name%22%3A%22AppNexus%22%2C%22publisherId%22%3A2069834%7D%2C%7B%22id%22%3A%2292766%22%2C%22name%22%3A%22SynacorMedia%22%2C%22pubid%22%3A%22jwplayer%22%2C%22type%22%3A%22OpenRTB%22%7D%2C%7B%22id%22%3A%223522895%22%2C%22name%22%3A%22PubMatic%22%2C%22pubid%22%3A%22160545%22%2C%22type%22%3A%22OpenRTB%22%7D%2C%7B%22id%22%3A%22277887975%22%2C%22name%22%3A%22MediaNet%22%2C%22pubid%22%3A%228CUGC6H1R%22%7D%2C%7B%22id%22%3A%22264049%22%2C%22name%22%3A%22SpotX%22%7D%2C%7B%22id%22%3A%221283707%22%2C%22name%22%3A%22OneVideo%22%2C%22pubid%22%3A%22AmericanMediaInc%22%7D%5D%2C%22settings%22%3A%7B%22bidTimeout%22%3A3000%2C%22buckets%22%3A%5B%7B%22increment%22%3A0.5%2C%22max%22%3A100%2C%22min%22%3A0.5%7D%5D%2C%22floorPriceCents%22%3A200%2C%22mediationLayerAdServer%22%3A%22dfp%22%7D%7D%2C%22client%22%3A%22googima%22%2C%22cuetext%22%3A%22Advertisement%22%2C%22outstream%22%3Afalse%2C%22preloadAds%22%3Afalse%2C%22rules%22%3A%7B%22startOnSeek%22%3A%22pre%22%2C%22timeBetweenAds%22%3A0%7D%2C%22schedule%22%3A%5B%7B%22offset%22%3A%22pre%22%2C%22tag%22%3A%22https%3A%5C%2F%5C%2Fpubads.g.doubleclick.net%5C%2Fgampad%5C%2Fads%3Fsz%3D320x240%26iu%3D%5C%2F4216%5C%2Fmensj.channels%5C%2Fpreroll%26impl%3Ds%26gdfp_req%3D1%26env%3Dvp%26output%3Dvast%26unviewed_position_start%3D1%26url%3D%5Breferrer_url%5D%26description_url%3D%5Bdescription_url%5D%26correlator%3D%5Btimestamp%5D%26cust_params%3Dad%253D__item-tags__%2526playerwidth%3D__player-width__%2526playerheight%253D__player-height__%26mediaID%3D__item-mediaid__%26mediaTitle%3D__item-title__%26mediaURL%3D__item-file__%22%2C%22type%22%3A%22linear%22%7D%5D%2C%22skipmessage%22%3A%22Skip%20ad%20in%20xx%20seconds%22%2C%22vpaidcontrols%22%3Afalse%2C%22vpaidmode%22%3A%22enabled%22%7D%2C%22aspectratio%22%3A%2216%3A9%22%2C%22autoPause%22%3A%5B%5D%2C%22autostart%22%3A%22viewable%22%2C%22controls%22%3Atrue%2C%22displayHeading%22%3Afalse%2C%22displaydescription%22%3Afalse%2C%22displaytitle%22%3Afalse%2C%22floating%22%3A%5B%5D%2C%22height%22%3A270%2C%22key%22%3A%22KDchTvYhGwNb8X08jc4lWnv9niU2Q0DZwH1AkmTffRsGrQbQXqtZVQ%3D%3D%22%2C%22mute%22%3Atrue%2C%22ph%22%3A2%2C%22pid%22%3A%22eEkK759I%22%2C%22playbackRateControls%22%3Atrue%2C%22preload%22%3A%22metadata%22%2C%22repeat%22%3Afalse%2C%22skin%22%3A%7B%22controlbar%22%3A%7B%22background%22%3A%22rgba%280%2C0%2C0%2C0%29%22%2C%22icons%22%3A%22%23ffffff%22%2C%22iconsActive%22%3A%22%23eb212e%22%2C%22text%22%3A%22%23ffffff%22%7D%2C%22menus%22%3A%7B%22background%22%3A%22%23333333%22%2C%22text%22%3A%22%23ffffff%22%2C%22textActive%22%3A%22%23eb212e%22%7D%2C%22name%22%3A%22five%22%2C%22timeslider%22%3A%7B%22progress%22%3A%22%23eb212e%22%7D%2C%22tooltips%22%3A%7B%22background%22%3A%22%23FFFFFF%22%2C%22text%22%3A%22%23ffffff%22%7D%7D%2C%22stretching%22%3A%22uniform%22%2C%22visualplaylist%22%3Atrue%2C%22width%22%3A%22100%25%22%2C%22setTimeEvents%22%3Atrue%2C%22playlist%22%3A%22https%3A%5C%2F%5C%2Fcontent.jwplatform.com%5C%2Ffeeds%5C%2FkpqvImMR.json%22%2C%22plugins%22%3A%7B%22https%3A%5C%2F%5C%2Fsb.scorecardresearch.com%5C%2Fc2%5C%2Fplugins%5C%2Fstreamingtag_plugin_jwplayer.js%22%3A%5B%5D%2C%22https%3A%5C%2F%5C%2Fovp.iris.tv%5C%2Fplugins%5C%2Fjwplayer%5C%2Fv2%5C%2Firis-jwplayer8.adaptive.min.js%22%3A%7B%22settings%22%3A%7B%22client_token%22%3A%225KRCGIZC9EUT4VN%22%2C%22platform_id%22%3A%22kpqvImMR%22%2C%22player_id%22%3A%22jwplayer_kpqvImMR_eEkK759I_div%22%2C%22end_up_next%22%3Atrue%2C%22ssl%22%3Atrue%2C%22campaign_tracking%22%3Atrue%2C%22disable_mobile_upnext%22%3Afalse%7D%2C%22iris_buttons%22%3A%7B%22thumbs_up%22%3Afalse%2C%22thumbs_down%22%3Afalse%2C%22skip_forward%22%3Afalse%2C%22skip_back%22%3Afalse%2C%22skip_on_thumbs_down%22%3Afalse%7D%2C%22global%22%3A%22iris%22%2C%22jwCMS%22%3Atrue%7D%7D%2C%22nextUpDisplay%22%3Afalse%7D’ ) );
var videoParams = JSON.parse( decodeURIComponent( ‘%7B%22advertising%22%3A%7B%22admessage%22%3A%22This%20video%20will%20resume%20in%20xx%20seconds%22%2C%22adscheduleid%22%3A%22VNLk4XpY%22%2C%22autoplayadsmuted%22%3Atrue%2C%22bids%22%3A%7B%22bidders%22%3A%5B%7B%22invCode%22%3A%221922098%22%2C%22member%22%3A%221287%22%2C%22name%22%3A%22AppNexus%22%2C%22publisherId%22%3A2069834%7D%2C%7B%22id%22%3A%2292766%22%2C%22name%22%3A%22SynacorMedia%22%2C%22pubid%22%3A%22jwplayer%22%2C%22type%22%3A%22OpenRTB%22%7D%2C%7B%22id%22%3A%223522895%22%2C%22name%22%3A%22PubMatic%22%2C%22pubid%22%3A%22160545%22%2C%22type%22%3A%22OpenRTB%22%7D%2C%7B%22id%22%3A%22277887975%22%2C%22name%22%3A%22MediaNet%22%2C%22pubid%22%3A%228CUGC6H1R%22%7D%2C%7B%22id%22%3A%22264049%22%2C%22name%22%3A%22SpotX%22%7D%2C%7B%22id%22%3A%221283707%22%2C%22name%22%3A%22OneVideo%22%2C%22pubid%22%3A%22AmericanMediaInc%22%7D%5D%2C%22settings%22%3A%7B%22bidTimeout%22%3A3000%2C%22buckets%22%3A%5B%7B%22increment%22%3A0.5%2C%22max%22%3A100%2C%22min%22%3A0.5%7D%5D%2C%22floorPriceCents%22%3A200%2C%22mediationLayerAdServer%22%3A%22dfp%22%7D%7D%2C%22client%22%3A%22googima%22%2C%22cuetext%22%3A%22Advertisement%22%2C%22outstream%22%3Afalse%2C%22preloadAds%22%3Afalse%2C%22rules%22%3A%7B%22startOnSeek%22%3A%22pre%22%2C%22timeBetweenAds%22%3A0%7D%2C%22schedule%22%3A%5B%5D%2C%22skipmessage%22%3A%22Skip%20ad%20in%20xx%20seconds%22%2C%22vpaidcontrols%22%3Afalse%2C%22vpaidmode%22%3A%22enabled%22%7D%2C%22aspectratio%22%3A%2216%3A9%22%2C%22autoPause%22%3A%5B%5D%2C%22autostart%22%3A%22viewable%22%2C%22controls%22%3Atrue%2C%22displayHeading%22%3Afalse%2C%22displaydescription%22%3Afalse%2C%22displaytitle%22%3Afalse%2C%22floating%22%3A%5B%5D%2C%22height%22%3A270%2C%22key%22%3A%22KDchTvYhGwNb8X08jc4lWnv9niU2Q0DZwH1AkmTffRsGrQbQXqtZVQ%3D%3D%22%2C%22mute%22%3Atrue%2C%22ph%22%3A2%2C%22pid%22%3A%22eEkK759I%22%2C%22playbackRateControls%22%3Atrue%2C%22preload%22%3A%22metadata%22%2C%22repeat%22%3Afalse%2C%22skin%22%3A%7B%22controlbar%22%3A%7B%22background%22%3A%22rgba%280%2C0%2C0%2C0%29%22%2C%22icons%22%3A%22%23ffffff%22%2C%22iconsActive%22%3A%22%23eb212e%22%2C%22text%22%3A%22%23ffffff%22%7D%2C%22menus%22%3A%7B%22background%22%3A%22%23333333%22%2C%22text%22%3A%22%23ffffff%22%2C%22textActive%22%3A%22%23eb212e%22%7D%2C%22name%22%3A%22five%22%2C%22timeslider%22%3A%7B%22progress%22%3A%22%23eb212e%22%7D%2C%22tooltips%22%3A%7B%22background%22%3A%22%23FFFFFF%22%2C%22text%22%3A%22%23ffffff%22%7D%7D%2C%22stretching%22%3A%22uniform%22%2C%22visualplaylist%22%3Atrue%2C%22width%22%3A%22100%25%22%2C%22setTimeEvents%22%3Atrue%2C%22playlist%22%3A%22https%3A%5C%2F%5C%2Fcontent.jwplatform.com%5C%2Ffeeds%5C%2FkpqvImMR.json%22%2C%22plugins%22%3A%7B%22https%3A%5C%2F%5C%2Fsb.scorecardresearch.com%5C%2Fc2%5C%2Fplugins%5C%2Fstreamingtag_plugin_jwplayer.js%22%3A%5B%5D%2C%22https%3A%5C%2F%5C%2Fovp.iris.tv%5C%2Fplugins%5C%2Fjwplayer%5C%2Fv2%5C%2Firis-jwplayer8.adaptive.min.js%22%3A%7B%22settings%22%3A%7B%22client_token%22%3A%225KRCGIZC9EUT4VN%22%2C%22platform_id%22%3A%22kpqvImMR%22%2C%22player_id%22%3A%22jwplayer_kpqvImMR_eEkK759I_div%22%2C%22end_up_next%22%3Atrue%2C%22ssl%22%3Atrue%2C%22campaign_tracking%22%3Atrue%2C%22disable_mobile_upnext%22%3Afalse%7D%2C%22iris_buttons%22%3A%7B%22thumbs_up%22%3Afalse%2C%22thumbs_down%22%3Afalse%2C%22skip_forward%22%3Afalse%2C%22skip_back%22%3Afalse%2C%22skip_on_thumbs_down%22%3Afalse%7D%2C%22global%22%3A%22iris%22%2C%22jwCMS%22%3Atrue%7D%7D%2C%22nextUpDisplay%22%3Afalse%7D’ ) );
console.log(‘AMI jwp ad params’, videoParams);
if ( videoParams.advertising ) {
console.log(‘AMI jwp ad params’, videoParams.advertising);
}
var vHash = ‘ami’ + decodeURIComponent( ‘kpqvImMR’ );
if ( window.jwpDef[vHash].advertising ) {
if ( window.jwpDef[vHash].advertising.schedule ) {
if ( window.jwpDef[vHash].advertising.schedule[0].tag ) {
if ( typeof window.jwVastTag[vHash] === ‘undefined’ ){
window.jwVastTag[vHash] = window.jwpDef[vHash].advertising.schedule[0].tag;
var vastURL = new URL( window.jwVastTag[vHash] );
var vastParams = new URLSearchParams( vastURL.search );
var ui = vastParams.get( ‘iu’ ).split( ‘/’ );
window.prerollTag[vHash] = vastParams.get( ‘iu’ );
window.prerollTag[vHash] = vastParams.get( ‘iu’ );
window.jwpBids[vHash] = {};
console.log(‘AMI jwp’, window.jwpBids);
console.log(‘AMI jwp prerolltag’, window.prerollTag[vHash]);
console.log(‘AMI jwp GAM Tag’, window.jwVastTag[vHash]);
}
}
}
}
function performAsyncBidding(player, item, index) {
var el = decodeURIComponent( ‘jwplayer_kpqvImMR_eEkK759I_div’ );
var vHash = ‘ami’ + decodeURIComponent( ‘kpqvImMR’ );
let url = window.jwVastTag[vHash];
if ( typeof utms.utm_source !== ‘undefined’ || typeof utms.utm_medium !== ‘undefined’ || typeof utms.utm_campaign !== ‘undefined’ ) {
var vastURL = new URL( window.jwVastTag[vHash] );
var vastParams = new URLSearchParams( vastURL.search );
var keys = Object.keys( utms );
if ( vastParams.has( ‘cust_params’ ) ) {
var custParams = new URLSearchParams( vastParams.get( ‘cust_params’ ) );
} else {
var custParams = new URLSearchParams();
}
for ( var key of keys ) {
custParams.set( key, utms[key]);
}
vastParams.set( ‘cust_params’, decodeURIComponent( custParams.toString() ) );
vastURL.search = vastParams.toString();
url = vastURL.toString();
}
console.log( ‘AMI jwp GAM tag with UTM’, url );
return new Promise((resolve, reject) => {
let bidders = [‘a9’, ‘ix’, ‘iris’];
// create a requestManager to keep track of bidder state to determine when to send ad server
// request and what amazonSlots to request from the ad server
var requestManager = {
adserverRequestSent: false,
};
//loop through bidder array and add the bidders to the request manager:
bidders.forEach( function( bidder ) {
requestManager[bidder] = false;
} );
// return true if all bidders have returned
function allBiddersBack() {
var allBiddersBack = bidders
// get the booleans from the object
.map( function( bidder ) {
return requestManager[bidder];
} )
// get rid of false values – indicates that the bidder has responded
.filter( Boolean )
// if length is equal to bidders, all bidders are back
.length === bidders.length;
return allBiddersBack;
}
// handler for header bidder responses
function headerBidderBack( bidder ) {
// return early if request to adserver is already sent
if ( requestManager.adserverRequestSent === true ) {
return;
}
// flip bidder back flag
if ( bidder === ‘a9’ ) {
requestManager.a9 = true;
console.log(‘second promise a9 ready’);
} else if ( bidder === ‘ix’ ) {
requestManager.ix = true;
console.log(‘second promise ix ready’);
} else if ( bidder === ‘iris’ ) {
requestManager.iris = true;
console.log(‘second promise iris ready’);
}
// if all bidders are back, send the request to the ad server
if ( allBiddersBack() ) {
resolve( url );
}
}
if ( typeof apstag == ‘object’ && apstag ) {
apstag.fetchBids({
slots: [{
slotID: window.prerollTag[vHash],
mediaType: ‘video’
}]
}, function( bids ) {
console.log( “AMI jwp amazon bid callback”, new Date().getTime(), bids );
window.jwpBids[vHash].amazon = true;
if ( bids.length > 0 ) { //If we have received any bids back
try {
console.log(“AMI jwp amazon bid request ad”, bids[0].encodedQsParams);
url = url + ‘&scp=’ + bids[0].encodedQsParams;
} catch ( e ) {
console.log(e);
}
} else {
console.log(“AMI jwp amazon no bids”);
}
headerBidderBack(‘a9’);
});
} else {
headerBidderBack(‘a9’);
}
console.log( ‘AMI jwp IX Bids’, new Date().getTime(), demand.preroll[0].targeting );
var vastURL = new URL( url );
var vastParams = new URLSearchParams( vastURL.search );
if ( vastParams.has( ‘cust_params’ ) ) {
var custParams = new URLSearchParams( vastParams.get( ‘cust_params’ ) );
} else {
var custParams = new URLSearchParams();
}
var keys = Object.keys( demand.preroll[0].targeting.price );
for ( var key of keys ) {
custParams.set( key, demand.preroll[0].targeting.price[key][0]);
}
vastParams.set( ‘cust_params’, custParams.toString() );
vastURL.search = vastParams.toString();
url = vastURL.toString();
}
headerBidderBack(‘ix’);
} );
} );
// Get main item context data
window.irisContext.getContext(jwplayer(el).getPlaylistItem().mediaid).then(function(data) {
// Encode the context data
console.log( ‘AMI jwp IrisTV Bids’, new Date().getTime(), data.context );
// Replace the server url with the context data (this is for simple ad requests),
// If you have the serverUrl dynamically configured, then you will need to append the context data
// under cust_params, so this is just for testing purpose
if ( data.context && Object.keys( data.context ).length ) {
var vastURL = new URL( url );
var vastParams = new URLSearchParams( vastURL.search );
if ( vastParams.has( ‘cust_params’ ) ) {
var custParams = new URLSearchParams( vastParams.get( ‘cust_params’ ) );
} else {
var custParams = new URLSearchParams();
}
custParams.set( ‘iris_context’, data.context.join(‘,’));
vastParams.set( ‘cust_params’, decodeURIComponent( custParams.toString() ) );
vastURL.search = vastParams.toString();
url = vastURL.toString();
}
headerBidderBack(‘iris’);
});
var player_jwplayer_kpqvImMR_eEkK759I_div = jwplayer(el).setup(videoParams).on(“ready”, function(){
var el = decodeURIComponent( “jwplayer_kpqvImMR_eEkK759I_div” );
var playerInstance = jwplayer(el);
ns_.StreamingAnalytics.JWPlayer( playerInstance, {
publisherId: “6036076”,
labelmapping: “ns_st_pu=”AMI”, c3=”Mens Journal”, ns_st_ge=”” + decodeURIComponent( “%2Anull” ) + “”, ns_st_ia=”” + decodeURIComponent( “%2Anull” ) + “”, ns_st_ce=”” + decodeURIComponent( “1” ) + “”, ns_st_ddt=”” + decodeURIComponent( “%2Anull” ) + “”, ns_st_tdt=”” + decodeURIComponent( “%2Anull” ) + “””,
});
}).on(‘adsManager’, (e) => {
var vHash = ‘ami’ + decodeURIComponent( ‘kpqvImMR’ );
const { adsManager, videoElement } = e;
const iasConfig = {
anId: ‘928572’,
campId: `${jwplayer().getWidth()}x${jwplayer().getHeight()}`, // This is dynamic based on player dimensions, but can be hard coded
chanId: window.prerollTag[vHash],
placementId: ‘Open Auction’,
pubOrder: ‘Video’,
pubId: ‘Direct’
};
if (googleImaVansAdapter) {
googleImaVansAdapter.init(window.google, adsManager, videoElement, iasConfig);
}
}).once(“play”, function(){
var el = decodeURIComponent( “jwplayer_kpqvImMR_eEkK759I_div” );
var playerInstance = jwplayer(el);
loadIrisPlugin(playerInstance, playerInstance.getConfig().plugins[“https://ovp.iris.tv/plugins/jwplayer/v2/iris-jwplayer8.adaptive.min.js”])
}).on(‘play’, (e) => {
var el = decodeURIComponent( “jwplayer_kpqvImMR_eEkK759I_div” );
var vHash = “ami” + decodeURIComponent( “kpqvImMR” );
var jwInfo = jwplayer(el).getPlaylistItem(jwplayer(el).getPlaylistIndex());
// skip if the video was paused and trying to resume
if (jwplayer(el).getState() !== ‘idle’ && jwplayer(el).getState() !== ‘complete’) {
return;
}
window.permutive.track(“VideoPlay”, {
play_id: el, //this will stay constant for all of the events emitted during the same video play
video: {
duration: jwInfo.duration, // in seconds
name: jwInfo.title,
video_id: decodeURIComponent( “kpqvImMR” ),
description: jwInfo.description,
published_at: new Date(jwInfo.pubdate).toISOString()
},
enriched_data:{
tvchannel: decodeURIComponent( “Men%26%23039%3Bs%20Journal” ), //tv channel name
language:”English”, //language of the content
type: “video”,
keywords: jwInfo.tags.split(“,”), //keywords for the page
}
});
console.log(“Permutive video play”);
}).on(‘complete’, (e) => {
var el = decodeURIComponent( “jwplayer_kpqvImMR_eEkK759I_div” );
var vHash = “ami” + decodeURIComponent( “kpqvImMR” );
var jwInfo = jwplayer(el).getPlaylistItem(jwplayer(el).getPlaylistIndex());
// skip if the video was paused and trying to resume
if (jwplayer(el).getState() !== ‘idle’ && jwplayer(el).getState() !== ‘complete’) {
return;
}
window.permutive.track(“VideoComplete”, {
play_id: el, //this will stay constant for all of the events emitted during the same video play
video: {
duration: jwInfo.duration, // in seconds
name: jwInfo.title,
video_id: decodeURIComponent( “kpqvImMR” ),
description: jwInfo.description,
published_at: new Date(jwInfo.pubdate).toISOString()
},
enriched_data:{
tvchannel: decodeURIComponent( “Men%26%23039%3Bs%20Journal” ), //tv channel name
language: “English”, //language of the content
type: “video”,
keywords: jwInfo.tags.split(“,”), //keywords for the page
}
});
console.log(“Permutive video event:”, e);
window.lock_25 = false;
window.lock_50 = false;
window.lock_75 = false;
window.lock_100 = false;
}).on(‘time’, (e) => {
var el = decodeURIComponent( “jwplayer_kpqvImMR_eEkK759I_div” );
var vHash = “ami” + decodeURIComponent( “kpqvImMR” );
var jwInfo = jwplayer(el).getPlaylistItem(jwplayer(el).getPlaylistIndex());
var progress = (e.currentTime/e.duration).toFixed(2);
if (
(0.25 === progress && false === window.lock_25) ||
(0.5 === progress && false === window.lock_50) ||
(0.75 === progress && false === window.lock_75) ||
(100 === progress && false === window.lock_100)
) {
window.permutive.track(“VideoProgress”, {
play_id: el, //this will stay constant for all of the events emitted during the same video play
progress: Number(progress),
video: {
duration: jwInfo.duration, // in seconds
name: jwInfo.title,
video_id: decodeURIComponent( “kpqvImMR” ),
description: jwInfo.description,
published_at: new Date(jwInfo.pubdate).toISOString()
},
enriched_data:{
tvchannel: decodeURIComponent( “Men%26%23039%3Bs%20Journal” ), //tv channel name
language: “English”, //language of the content
type: “video”,
keywords: jwInfo.tags.split(“,”), //keywords for the page
}
});
if ( 0.25 === progress ) {
window.lock_25 = true;
}
if ( 0.5 === progress ) {
window.lock_50 = true;
}
if ( 0.75 === progress ) {
window.lock_75 = true;
}
if ( 1 === progress ) {
window.lock_100 = true;
}
console.log(“Permutive video play progress ” + progress);
}
}).on(‘mute’, (e) => {
var el = decodeURIComponent( “jwplayer_kpqvImMR_eEkK759I_div” );
var vHash = “ami” + decodeURIComponent( “kpqvImMR” );
var jwInfo = jwplayer(el).getPlaylistItem(jwplayer(el).getPlaylistIndex());
window.permutive.track(“VideoEvent”, {
play_id: el, //this will stay constant for all of the events emitted during the same video play
event: (e.mute) ? “sound off” : “sound on”,
video: {
duration: jwInfo.duration, // in seconds
name: jwInfo.title,
video_id: decodeURIComponent( “kpqvImMR” ),
description: jwInfo.description,
published_at: new Date(jwInfo.pubdate).toISOString()
},
enriched_data:{
tvchannel: decodeURIComponent( “Men%26%23039%3Bs%20Journal” ), //tv channel name
language: “English”, //language of the content
type: “video”,
keywords: jwInfo.tags.split(“,”), //keywords for the page
}
});
console.log(“Permutive video event:”, e);
}).on(‘fullscreen’, (e) => {
var el = decodeURIComponent( “jwplayer_kpqvImMR_eEkK759I_div” );
var vHash = “ami” + decodeURIComponent( “kpqvImMR” );
var jwInfo = jwplayer(el).getPlaylistItem(jwplayer(el).getPlaylistIndex());
window.permutive.track(“VideoEvent”, {
play_id: el, //this will stay constant for all of the events emitted during the same video play
event: (e.fullscreen) ? “fullscreen on” : “fullscreen off”,
video: {
duration: jwInfo.duration, // in seconds
name: jwInfo.title,
video_id: decodeURIComponent( “kpqvImMR” ),
description: jwInfo.description,
published_at: new Date(jwInfo.pubdate).toISOString()
},
enriched_data:{
tvchannel: decodeURIComponent( “Men%26%23039%3Bs%20Journal” ), //tv channel name
language: “English”, //language of the content
type: “video”,
keywords: jwInfo.tags.split(“,”), //keywords for the page
}
});
console.log(“Permutive video event:”, e);
}).on(‘ready’, (e) => {
var el = decodeURIComponent( “jwplayer_kpqvImMR_eEkK759I_div” );
var vHash = “ami” + decodeURIComponent( “kpqvImMR” );
window.permutive.track(“VideoLoad”, {
play_id: el, //this will stay constant for all of the events emitted during the same video play
video: {
duration: jwInfo.duration, // in seconds
name: jwInfo.title,
video_id: decodeURIComponent( “kpqvImMR” ),
description: jwInfo.description,
published_at: new Date(jwInfo.pubdate).toISOString()
},
enriched_data:{
tvchannel: decodeURIComponent( “Men%26%23039%3Bs%20Journal” ), //tv channel name
language: “English”, //language of the content
type: “video”,
keywords: jwInfo.tags.split(“,”), //keywords for the page
}
});
console.log(“Permutive video load event”);
}).on(‘adPlay’, (e) => {
var el = decodeURIComponent( “jwplayer_kpqvImMR_eEkK759I_div” );
var vHash = “ami” + decodeURIComponent( “kpqvImMR” );
window.adInfo = e;
var jwInfo = jwplayer(el).getPlaylistItem(jwplayer(el).getPlaylistIndex());
window.permutive.track(“VideoAdPlay”, {
play_id: el, //this will stay constant for all of the events emitted during the same video play
ad: {
duration: window.adInfo.duration,
creative_name: window.adInfo.adtitle,
ad_id: window.adInfo.adId,
title: window.adInfo.adtitle,
video_type: “instream” //outstream
},
video: {
duration: jwInfo.duration, // in seconds
name: jwInfo.title,
video_id: decodeURIComponent( “kpqvImMR” ),
description: jwInfo.description,
published_at: new Date(jwInfo.pubdate).toISOString()
},
enriched_data:{
tvchannel: decodeURIComponent( “Men%26%23039%3Bs%20Journal” ), //tv channel name
language: “English”, //language of the content
type: “video”,
keywords: jwInfo.tags.split(“,”), //keywords for the page
}
});
console.log(“Permutive video ad play”);
}).on(‘adClick’, (e) => {
var el = decodeURIComponent( “jwplayer_kpqvImMR_eEkK759I_div” );
var vHash = “ami” + decodeURIComponent( “kpqvImMR” );
var jwInfo = jwplayer(el).getPlaylistItem(jwplayer(el).getPlaylistIndex());
window.permutive.track(“VideoAdClick”, {
play_id: el, //this will stay constant for all of the events emitted during the same video play
ad: {
duration: window.adInfo.duration,
creative_name: window.adInfo.adtitle,
ad_id: window.adInfo.adId,
title: window.adInfo.adtitle,
video_type: “instream” //outstream
},
video: {
duration: jwInfo.duration, // in seconds
name: jwInfo.title,
video_id: decodeURIComponent( “kpqvImMR” ),
description: jwInfo.description,
published_at: new Date(jwInfo.pubdate).toISOString()
},
enriched_data:{
tvchannel: decodeURIComponent( “Men%26%23039%3Bs%20Journal” ), //tv channel name
language: “English”, //language of the content
type: “video”,
keywords: jwInfo.tags.split(“,”), //keywords for the page
}
});
console.log(“Permutive video ad click”);
}).on(‘adTime’, (e) => {
var el = decodeURIComponent( “jwplayer_kpqvImMR_eEkK759I_div” );
var vHash = “ami” + decodeURIComponent( “kpqvImMR” );
var jwInfo = jwplayer(el).getPlaylistItem(jwplayer(el).getPlaylistIndex());
var progress = (e.position/e.duration).toFixed(2);
Sometimes lifting is all about quality, not quantity. Tonal has two extendable arms that generate up to 200 pounds of resistance, plus a motion-sensor camera hidden in its 42-inch screen to analyze form and offer cues to boost performance. An initial fitness assessment determines your baseline, then AI algorithms take over. “Spotter” mode drops weight if you struggle in the bottom of a chest press, while “Burnout” mode reduces weight one pound at a time at the end of a set of curls, so you can work your biceps to failure.
The full-length reflective surface of Mirror hides an LCD screen controlled by an iOS app. Try a class in more
than 50 disciplines, or connect with a personal trainer on-demand. Using the built-in two-way audio and video, your trainer provides expert feedback, form corrections, and encouragement in real time for $40 a pop—a fraction of what you’d pay for a trainer at the gym. You can even sweat to your own workout playlists via Apple Music.
A true total-body strength workout usually requires multiple sets of weights or a pricey squat rack. Not
so with the space-saving JaxJox connected kettlebell. It adjusts from 12 to 42 pounds in seconds. While you’re swinging, motion sensors track reps, sets, weight, and power, so you can review your “Fitness IQ”—which measures strength progression—in the app. Users can also subscribe to on-demand workouts.
[$229 plus optional $13/month membership, jaxjox.com]
Arena houses a multidirectional cable system and specialty attachments capable of more than 300 exercises, from hamstring curls to woodchops. The portable device uses opposing electro-magnetic fields to generate hundreds of pounds of resistance (same tech that powers electric cars). Motorized resistance technology safely recruits more muscle fibers than traditional strength training, so you get better results in less time.
[$1,995 plus optional $20/month membership, goarena.co]
Solo neighborhood jogs. Treadmill intervals. All-out track sprints. With 32 sensors, Nurvv smart insoles capture all your running idiosyncrasies including cadence, step length, footstrike, pronation and balance. That might not mean much to you, but they indicate efficiency. The app provides tailored training tips and exercises to help fine-tune your technique and avoid injury. Looking to hit sub 7-minute miles? The Pace Coach feature provides target zones for your cadence and step length, with in-run alerts synced to your headphones like “shorten your stride” or “increase your cadence.”