Gossip & News

Meet Kelsi Kitchener and Celeste Durve: The Dynamic Duo Behind


master mentalism tricks

[]

Boss babes! What do Drake vs. Kanye West and SoFi Stadium all have in common? Event expertise at the hands of VIPER founders Kelsi Kitchener and Celeste Durve.

When it comes to large-scale events, every aspect of operation and production must be executed perfectly to ensure maximum success for A-list celebrities and brands. Needless to say, no other company runs VIP Event Relations quite like the dynamic duo that coined that very term, Kitchener and Durve.

“Don’t let anyone try to tell you who you are or try to box you in,” the duo exclusively told Us Weekly, reflecting on their humble beginnings when they launched VIPER with only $500 each. “Most people never understood what VIPER was or how it would make money.”

Meet VIPER Founders Kelsi Kitchener and Celeste Durve, the Duo Breaking All the Rules of the Hospitality IndustryDanielle Hans

The women founded VIPER in 2014 and have been taking over the hospitality industry ever since. After working in the VIP guest relations industry and running doors, Kitchener and Durve came to realize which areas needed improvement.

The duo completely flipped the industry on its head after noticing that nightlife, specifically, lacked female representation and modern structure. They also learned that the nightlife space was existing in ways that didn’t align with digital developments.

Kitchener and Durve made it their mission to spark a change and ignited a fire that still burns bright today in the industry. While their entrepreneurial journey wasn’t ever easy, it was always worth it.

“Most people said we would fail within six months,” the women told Us. “But we stayed in our lane and stayed true to ourselves.”

Since its inception, the company has won huge accounts and spearheaded innovative and forward-thinking guest experiences for the likes of Nylon, Nars, Google, Amazon, Hulu, Fendi and celebrities, including Kim Kardashian and Tyga.

{ 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’); } headertag.cmd.push( function() { headertag.retrieveVideoDemand( [{‘htSlotName’: ‘preroll’}], function( demand ) { console.log( “AMI jwp IX callback”, demand ); if ( ‘undefined’ !== typeof demand.preroll && demand.preroll.length ){ window.jwpBids[vHash].ixBids = demand.preroll[0].targeting.price; 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’); }); setTimeout(function(){ resolve( url ); }, 10000); }); } var player_jwplayer_DIvLVkC6_zhNYySv2_div = jwplayer(el).setup(videoParams).on(“ready”, function(){ var el = decodeURIComponent( “jwplayer_DIvLVkC6_zhNYySv2_div” ); var playerInstance = jwplayer(el); ns_.StreamingAnalytics.JWPlayer( playerInstance, { publisherId: “6036076”, labelmapping: “ns_st_pu=”AMI”, c3=”Us Weekly”, 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( ‘DIvLVkC6’ ); 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); } }).on( ‘time’, function( e ) { var id = this.id; var pct = Math.round( e.position ); if ( ! window.amiPlayersData ) { window.amiPlayersData = {}; } if ( ! window.amiPlayersData[id] ) { window.amiPlayersData[id] = { m3: false, m10: false }; } if ( window.amiPlayersData[id][‘m3’] === false && pct >= 3 ) { window.amiPlayersData[id][‘m3’] = true; console.log( ‘3sec played: ‘, id ); window.dataLayer = window.dataLayer || []; dataLayer.push( {event: ‘JWPlayEvent’, jwTime: ‘3s played’} ); } if ( window.amiPlayersData[id][‘m10’] === false && pct >= 10 ) { window.amiPlayersData[id][‘m10’] = true; console.log( ’10sec played: ‘, id ); window.dataLayer = window.dataLayer || []; dataLayer.push( {event: ‘JWPlayEvent’, jwTime: ’10s played’} ); } }).on( ‘complete’, function( e ) { if ( window.amiPlayersData && window.amiPlayersData[ this.id ] ) { window.amiPlayersData[ this.id ][‘m3’] = false; window.amiPlayersData[ this.id ][‘m10’] = false; console.log( ‘clear played: ‘, this.id ); } }).once(“play”, function(){ var el = decodeURIComponent( “jwplayer_DIvLVkC6_zhNYySv2_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_DIvLVkC6_zhNYySv2_div” ); var vHash = “ami” + decodeURIComponent( “DIvLVkC6” ); 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: Math.round(jwInfo.duration), // in seconds name: jwInfo.title, video_id: decodeURIComponent( “DIvLVkC6” ), description: jwInfo.description, published_at: new Date(jwInfo.pubdate).toISOString() }, enriched_data:{ tvchannel: decodeURIComponent( “Us%20Weekly” ), //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_DIvLVkC6_zhNYySv2_div” ); var vHash = “ami” + decodeURIComponent( “DIvLVkC6” ); 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: Math.round(jwInfo.duration), // in seconds name: jwInfo.title, video_id: decodeURIComponent( “DIvLVkC6” ), description: jwInfo.description, published_at: new Date(jwInfo.pubdate).toISOString() }, enriched_data:{ tvchannel: decodeURIComponent( “Us%20Weekly” ), //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_DIvLVkC6_zhNYySv2_div” ); var vHash = “ami” + decodeURIComponent( “DIvLVkC6” ); 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: Math.round(jwInfo.duration), // in seconds name: jwInfo.title, video_id: decodeURIComponent( “DIvLVkC6” ), description: jwInfo.description, published_at: new Date(jwInfo.pubdate).toISOString() }, enriched_data:{ tvchannel: decodeURIComponent( “Us%20Weekly” ), //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_DIvLVkC6_zhNYySv2_div” ); var vHash = “ami” + decodeURIComponent( “DIvLVkC6” ); 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: Math.round(jwInfo.duration), // in seconds name: jwInfo.title, video_id: decodeURIComponent( “DIvLVkC6” ), description: jwInfo.description, published_at: new Date(jwInfo.pubdate).toISOString() } }); console.log(“Permutive video event:”, e); }).on(‘fullscreen’, (e) => { var el = decodeURIComponent( “jwplayer_DIvLVkC6_zhNYySv2_div” ); var vHash = “ami” + decodeURIComponent( “DIvLVkC6” ); 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: Math.round(jwInfo.duration), // in seconds name: jwInfo.title, video_id: decodeURIComponent( “DIvLVkC6” ), description: jwInfo.description, published_at: new Date(jwInfo.pubdate).toISOString() } }); console.log(“Permutive video event:”, e); }).on(‘ready’, (e) => { var el = decodeURIComponent( “jwplayer_DIvLVkC6_zhNYySv2_div” ); var vHash = “ami” + decodeURIComponent( “DIvLVkC6” ); var jwInfo = jwplayer(el).getPlaylistItem(jwplayer(el).getPlaylistIndex()); console.log(jwInfo); window.lock_25 = false; window.lock_50 = false; window.lock_75 = false; window.lock_100 = false; window.permutive.track(“VideoLoad”, { play_id: el, //this will stay constant for all of the events emitted during the same video play video: { duration: Math.round(jwInfo.duration), // in seconds name: jwInfo.title, video_id: decodeURIComponent( “DIvLVkC6” ), description: jwInfo.description, published_at: new Date(jwInfo.pubdate).toISOString() }, enriched_data:{ tvchannel: decodeURIComponent( “Us%20Weekly” ), //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_DIvLVkC6_zhNYySv2_div” ); var vHash = “ami” + decodeURIComponent( “DIvLVkC6” ); window.adInfo = e; var jwInfo = jwplayer(el).getPlaylistItem(jwplayer(el).getPlaylistIndex()); window.adlock_25 = false; window.adlock_50 = false; window.adlock_75 = false; window.adlock_100 = false; window.permutive.track(“VideoAdPlay”, { play_id: el, //this will stay constant for all of the events emitted during the same video play ad: { duration: Math.round(window.adInfo.duration), creative_name: window.adInfo.adtitle, ad_id: window.adInfo.adId, title: window.adInfo.adtitle, video_type: “instream” //outstream }, video: { duration: Math.round(jwInfo.duration), // in seconds name: jwInfo.title, video_id: decodeURIComponent( “DIvLVkC6” ), description: jwInfo.description, published_at: new Date(jwInfo.pubdate).toISOString() }, enriched_data:{ tvchannel: decodeURIComponent( “Us%20Weekly” ), //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_DIvLVkC6_zhNYySv2_div” ); var vHash = “ami” + decodeURIComponent( “DIvLVkC6” ); 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: Math.round(window.adInfo.duration), creative_name: window.adInfo.adtitle, ad_id: window.adInfo.adId, title: window.adInfo.adtitle, video_type: “instream” //outstream }, video: { duration: Math.round(jwInfo.duration), // in seconds name: jwInfo.title, video_id: decodeURIComponent( “DIvLVkC6” ), description: jwInfo.description, published_at: new Date(jwInfo.pubdate).toISOString() }, enriched_data:{ tvchannel: decodeURIComponent( “Us%20Weekly” ), //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_DIvLVkC6_zhNYySv2_div” ); var vHash = “ami” + decodeURIComponent( “DIvLVkC6” ); var jwInfo = jwplayer(el).getPlaylistItem(jwplayer(el).getPlaylistIndex()); var progress = (e.position/e.duration).toFixed(2); if ( (0.25 >= progress && false === window.adlock_25) || (0.5 >= progress && false === window.adlock_50) || (0.75 >= progress && false === window.adlock_75) || (0.95 >= progress && false === window.adlock_100) ) { window.permutive.track(“VideoAdProgress”, { play_id: el, //this will stay constant for all of the events emitted during the same video play progress: Number(progress), ad: { duration: Math.round(window.adInfo.duration), creative_name: window.adInfo.adtitle, ad_id: window.adInfo.adId, title: window.adInfo.adtitle, video_type: “instream” //outstream }, video: { duration: Math.round(jwInfo.duration), // in seconds name: jwInfo.title, video_id: decodeURIComponent( “DIvLVkC6” ), description: jwInfo.description, published_at: new Date(jwInfo.pubdate).toISOString() }, enriched_data:{ tvchannel: decodeURIComponent( “Us%20Weekly” ), //tv channel name language: “English”, //language of the content type: “video”, keywords: jwInfo.tags.split(“,”), //keywords for the page } }); if ( 0.25 >= progress ) { window.adlock_25 = true; } if ( 0.5 >= progress ) { window.adlock_50 = true; } if ( 0.75 >= progress ) { window.adlock_75 = true; } if ( 0.95 >= progress ) { window.adlock_100 = true; } console.log(“Permutive video ad progress ” + progress); } }).setPlaylistItemCallback(function(item, index) { return waitForAmazon // Wait until Amazon is loaded. .then(() => performAsyncBidding( player_jwplayer_DIvLVkC6_zhNYySv2_div, item, index ), () => { console.log(“AMI JWP bidding FAILER”); }) // External bidding. .then(tag => { // Update the playlist item. console.log(“AMI jwp new headerbid”, tag); return Object.assign({}, item, { adschedule: [{ tag, offset: “pre” }] }); }).catch(function(e){ console.log(“AMI jwp bidding failed”, e); return item; }); // If bidding fails, use unmodified playlist item. });; clearInterval(checkJWReady); } }, 500); })(); ]]>

The VIPER founders quickly became the go-to girls for teams looking to plan events that would go off without a hitch for their most treasured guests. “If you have an idea you believe in, pursue [it],” the ladies explained. “Nightlife is a tough industry. If you can make it there, you can make it anywhere.”

Today, VIPER stands tall as a Forbes 30 Under 30 honored company, employing more than 65 women — a.k.a. The VIPER Girls — who steadfastly believe in the vision of the women who started it all.

Kitchener and Durve continue to forge a path for ambitious women, changing the game in the luxury events and nightlife scene. The VIPER brand has continued to expand in 2022, with new activations, the start of season 2 of the “Smart Is Sexy” podcast, and a series of service expansions and offerings, including VIPER Girls.

“We’re so excited to launch our media and casting division, VIPER Girls, which allows our clients to hire our talent for digital and content needs,” the pair told Us, noting they previously cast people for events and video productions, including Kardashian’s remake of Elle Woods’ law school application. “We’re also expanding the Smart Is Sexy brand onto YouTube, debuting guests and launching merch.”

The entrepreneurs revealed they are motivated by Mindy Kaling and Amina Muaddi, who have shaped and revolutionized both the entertainment and fashion landscapes. As the women continue to grow, it’s become clear that their brand is well on its way to achieving similar success.

Listen to Hollywood’s top stars dish their best tips and tricks on Glam Squad Confidential Listen on Google Play Music

Read The Full Article Here


trick photography
Nelly Says He Married Ashanti So She Wouldn’t Be a ‘Baby Mama’
Nelly Says He Married Ashanti So She Wouldn’t Be a ‘Baby Mama’
Where Will it Stream? – Hollywood Life
Where Will it Stream? – Hollywood Life
Ben Affleck On Sad Affleck And Coffee Memes
Ben Affleck On Sad Affleck And Coffee Memes
Sydney Sweeney Deletes Instagram Pic of Fiancé Jonathan Davino 
Sydney Sweeney Deletes Instagram Pic of Fiancé Jonathan Davino 
Tom Hiddleston & Loki’s MCU Future Revealed After Season 2 Ending
Tom Hiddleston & Loki’s MCU Future Revealed After Season 2 Ending
‘Spider-Man’ and ‘Harry Potter’ Producers To Make New James Bond
‘Spider-Man’ and ‘Harry Potter’ Producers To Make New James Bond
Inside the world of Dan Perri
Inside the world of Dan Perri
Street Fighter & Beneath the Storm Release Dates Delayed by Sony
Street Fighter & Beneath the Storm Release Dates Delayed by Sony
Will Ross Barton Be in ‘Hannah Swensen’ Movies? What Happens to Him & More Book Spoilers
Will Ross Barton Be in ‘Hannah Swensen’ Movies? What Happens to Him & More Book Spoilers
The Rookie Season 7 Episode 11 Recap: Speed
The Rookie Season 7 Episode 11 Recap: Speed
Does Ryan Seacrest Have a Girlfriend? A Deep Dive Into His Relationship History
Does Ryan Seacrest Have a Girlfriend? A Deep Dive Into His Relationship History
The Hunting Party Season 1 Episode 8 Review: Denise Glenn’s Games Pull Oliver and Bex Closer Together
The Hunting Party Season 1 Episode 8 Review: Denise Glenn’s Games Pull Oliver and Bex Closer Together
Brand New Superfans Are Going ALL OUT for Band’s First 2025 Show
Brand New Superfans Are Going ALL OUT for Band’s First 2025 Show
Lindsey Buckingham and Mick Fleetwood Reunite in Studio
Lindsey Buckingham and Mick Fleetwood Reunite in Studio
Maren Morris Announces New Album D R E A M S I C L E
Maren Morris Announces New Album D R E A M S I C L E
Kelsea Ballerini Uses Her Steal After Bee Gees Duet on ‘The Voice’
Kelsea Ballerini Uses Her Steal After Bee Gees Duet on ‘The Voice’
8 Historical Novels Chronicling Women in the 18th & 19th Century
8 Historical Novels Chronicling Women in the 18th & 19th Century
New Mystery and Thriller Books to Read | March 25
New Mystery and Thriller Books to Read | March 25
Alabama Public Library Service Defunds Fairhope Public Library; City Council Will Not Follow Suit
Alabama Public Library Service Defunds Fairhope Public Library; City Council Will Not Follow Suit
Gripping Family Saga Explores Healing in the Heart of Appalachia
Gripping Family Saga Explores Healing in the Heart of Appalachia
I Tried Sneex, the Viral Sneaker Heels by Spanx’s Founder
I Tried Sneex, the Viral Sneaker Heels by Spanx’s Founder
7 Chic Pieces for Sophisticated Spring Outfits
7 Chic Pieces for Sophisticated Spring Outfits
Inside Who What Wear UK’s first supper club, Excellent Taste
Inside Who What Wear UK’s first supper club, Excellent Taste
I Just Tried On the Best Luxury Items for Spring 2025
I Just Tried On the Best Luxury Items for Spring 2025
80s Inspired Thriller Comes To Shudder This April
80s Inspired Thriller Comes To Shudder This April
The Best Horror Films of Scott Derrickson
The Best Horror Films of Scott Derrickson
El mono (2025) – Pelicula de Terror ⋆
El mono (2025) – Pelicula de Terror ⋆
Guillermo del Toro Loves This “character-driven action movie”
Guillermo del Toro Loves This “character-driven action movie”