DOSAR, Reportaje

Hai să ne jucăm serios!

March 8th, 2011, com 201 comentarii

Sema Parc”, zona Regie – Bucureşti. Două turnuri din sticlă şi oţel, pe numele lor „Riverview House” şi „Atrium House” contrastează puternic cu peisajul postindustrial al vechii fabrici de maşini „Semănătoarea” din dreapta râului Dâmboviţa.

Hai să ne jucăm serios!

Nu este chiar Silicon Valley, dar într-o zonă a Capitalei precum Grozăveşti, unde cel mai interesant punct atractiv e abia finalizatul pod suspendat al primarului Oprescu, cele două turnuleţe chiar par aduse dintr-un film sci-fi.

River Invest, dezvoltatorii parcului de afa­ceri Sema, au finalizat deja prima parte a proiectului imobiliar urmând ca în viitor să mai construiască în zonă patru clădiri şi spaţii rezidenţiale. Birourile turnurilor au fost deja închiriate în totalitate de firme ce activează în domenii diverse, de la asigurări şi arhitectură până la radiodifuziune şi electricitate. Dea­supra intrărilor cu uşi rulante ale modernelor structuri, prin pereţii de sticlă poţi vedea siluete umane care se mişcă printre mese, computere şi plante ornamentale exotice.

În Atrium House se află sediul studioului de jocuri pentru telefoane mobile Namco-Bandai Networks România. E vorba de o încăpere lumi­noasă imensă, cu multe rânduri de mese despărţite de câteva camere cu pereţi din sticlă. Într-un astfel de birou transparent am fost primiţi la o discuţie pe tema naturii organiza- ţionale a firmei de către Andrei Lopată, admin­istratorul companiei şi unul dintre pionierii industriei româneşti de jocuri. Ne întâmpină voios, e îmbrăcat casual, în blugi şi pulover. Nu există un cod vestimentar al muncii în industriile creative. „Nu contează cum arătăm, jocul nostru trebuie să arate bine.”

Andrei conduce Namco-Bandai România încă de când aceasta aparţinea de concernul francez Vivendi. În 2007, Vivendi a fuzionat cu o altă companie, Activision-Blizzard, unul dintre liderii pe piaţa de jocuri din lumea întreagă.

Noul management de atunci a hotărât să renunţe la divizia de telefoane mobile. Andrei explică detaliile schimbării de corporaţie: „Activision-Blizzard a luat hotărârea că mobilele nu sunt interesante şi a desfiinţat tot. Erau două studiouri în Statele Unite, unul l-au desfi­inţat, unul l-a cumpărat Electronic Arts, era un studiou în Franţa care s-a desfiinţat şi studioul din Bucureşti l-a luat Namco”.

Înainte de venirea japonezilor de la Namco, dependenţa studioului din România de decizi­ile luate de multinaţională era mult mai mare.

Ca în orice sistem corporatist, structura de vârf a firmei era localizată în cu totul altă parte a lumii, operaţiunile între companiile-surori din lumea întreagă fiind centralizate – exista un buget impus pentru realizarea jocurilor şi un plan bine definit care trebuia respectat. Schimbarea de optică a niponilor în privinţa organizării l-a surprins pe Andrei, într-o primă fază. „Aici a fost dubios la început, mă aştep­tam să fie la fel ca înainte, numai că a trebuit să schimbăm complet mentalitatea. Am ajuns să concurăm cu alte firme din afara corporaţiei pentru proiecte. Odată cu Namco, a trebuit să mărim şi eficienţa. A trebuit să obţinem acelaşi lucru într-un timp mai scurt şi să construim un set de tool-uri (unelte – n.a) prin care să urmărim traseul unei versiuni.” Practic, în anu­mite limite, studioul este lăsat acum să îşi orga­nizeze activitatea în funcţie de propriul ritm de muncă.

In industri­ile creative nu există un cod vesti­mentar foarte strict. Chiar şi ţinuta ţine de… imagi­naţie.

Un joc pentru mobil se realizează oarecum asemănător cu cele pentru console video sau computere. Un producător (game designer) vine cu un concept iniţial al jocului după care pro­dusul se dezvoltă pe etape (versiunea primă e denumită alfa, cea intermediară, în care se lucrează intens – beta şi versiunea finală – gold master), prin cooperarea unor echipe de pro­gramatori, designeri, artişti grafici şi testeri.

Ştefan este de un an şi jumătate programa­tor la Namco-Bandai, timp în care a participat la dezvoltarea a două produse. Înainte să vină aici a lucrat tot în domeniul software, pe tele­comunicaţii. Îmi spune că în general licenţele pentru jocuri vin din afară, „noi în ţară doar implementăm proiectul, creativitatea vine mai mult de la grafică”. După faza de realizare a prototipului (de aici începe, în paralel, şi testarea jocului de către departamentul Quality Assurance – control tehnic al calităţii), urmează câteva luni în care programatorii fac portarea, „pur şi simplu te asiguri că jocul merge pe toate variantele de telefoane”. Îl rog pe Ştefan să îmi recomande un programator care era în firmă şi în perioada Vivendi. După un scurt apel în rândul colegilor lui, iese la înaintare Ionuţ, „un tip mai fluent în conversaţie”, după cum îl caracterizează Ştefan. Ionuţ e de peste cinci ani în firmă şi face parte din nucleul de programatori care a fondat Vivendi. Piaţa este extrem de dinamică în domeniu, se fac multe jocuri şi ele trebuie adaptate pentru fiecare ver­siune de telefon în parte, „îţi trebuie puterea financiară să ai toate telefoanele alea, pentru că nu poţi face un produs pe care să nu-l testezi pe dispozitivul fizic”. Îmi explică atribuţiile fiecărei divizii a studioului prin raportare la vestitul joc creat de Namco prin anii ’80 – Pacman: „Programatorul se ocupă de cum se mişcă pac-manul, designerul se ocupă de realizarea labirintelor şi graficianul se ocupă de cum sunt stilizaţi pereţii”. Se inter- acţionează mult în tot procesul acesta şi, astfel, se stabilesc şi relaţii de prietenie între angajaţi. În perspectiva lui Ionuţ, aceasta este una dintre părţile frumoase ale meseriei lui. De asemenea, participarea la realizarea unui produs popular, un joc care va trece prin mii de mâini, dă şi ea satisfacţii personale.

In faza de „master”, detaliile jocului sunt secrete, ca să nu le fure concurenţa.

Pe parcursul dezvoltării unui produs soft­ware apar „bugs” („gândaci”, în engleză), în principiu erori de logică ale programatorilorcare „scriu” codul jocului. Modul de depistare a bug-urilor şi nevoia creării de versiuni pentru fiecare tip de telefon în parte reprezintă speci­ficitatea dezvoltării de jocuri pentru telefoane mobile. „De exemplu, pentru console video, fiind vorba de jocuri foarte complexe, se întocmeşte un aşa-zis test-plan: jocul se împarte pe bucăţele şi fiecare membru al echipei de testare primeşte câte un task (sarcină – n.a). Se mai schimbă între ele pentru că patru ochi găsesc mai multe greşeli. Pentru telefoane mobile, jocurile fiind mai simple, se fac check- listuri”, spune Andrei Lopată. Astfel, fiecare tester se ghidează după un şablon, o listă cu parametri pe care trebuie să îi „bifeze” atunci când descoperă un „gândac”.

O găsesc pe Monica la biroul ei din sectorul de Quality Assurance butonând la un Nokia N95 Mini, un „smart-phone” – dispozitiv cu o pu­tere de calcul mai mare decât cea a mobilelor obişnuite. Ca şi alţi colegi, are în dreapta biroului multe cutii de ceaiuri pe care şi le pregăteşte în bucătăria din mijlocul încăperii. Probabil e o nouă modă în companie.

Începe să îmi arate tot felul de metode de depistare a inadvertenţelor care apar în joc. Monica lucrează de câteva luni la Namco si e singura fată din cei aproximativ 60 de membri ai diviziei de testeri. Acum testează un joc de tip puzzle de epocă medievală, semnalează greşelile din versiunea în limba franceză. Are o cameră web cu care fotografiază erorile întâlnite si apoi le scoate în evidenţă încadrându-le cu o culoare roşie într-un program de editare foto. Pe lângă greşeli de ortografie în dialogurile dintre omuleţii virtuali, Monica îmi arată un bug pe un ecran colorat în care apar două per­sonaje în straie medievale. Un text se supra­punea peste silueta unui monstru din joc. Monica a trecut eroarea într-un formular digi­tal alături de modul în care poate fi ajustată şi posibilul rezultat al schimbării. Mi-a arătat apoi o metodă de evaluare pe care ei o numesc „interrupt”, a luat un model Samsung din maldărul cu telefoane de diverse tipuri de pe biroul ei şi a dat un apel, să vadă cum se com­portă jocul atunci când cineva sună.

Monica mă duce apoi să văd camera device- urilor unde sunt multe rafturi înţesate cu tele­foane de tot felul, în cutii transparente de plas­tic, „păzite” de trei tipi care păstrează evidenţa inventarului. Ne întoarcem la biroul ei şi pe drum îmi arată zona unde se fac exclusiv „interrupturi” de pe reţele de telefonie străină, au o antenă specială care simulează pe o rază de 2-3 metri semnalele de peste Atlantic sau din Europa. Se pot face doar teste de „inter- rupt”, nu şi de conectivitate. Astfel verifică modul în care se comportă jocurile în timpul apelului din altă reţea decât „autohtonele” Vodafone, Orange şi Cosmote. O operaţiune extrem de necesară, având în vedere faptul că SUA sunt principala piaţă de desfacere pentru subsidiara Namco din România.

Se anunţă pauza de ţigară de zece minute şi fumătorii se îndreaptă spre ieşire. Este ultima „gură de aer” înainte de mult aşteptata pauză de masă în timpul căreia testerii joacă în reţea counter-strike (joc de acţiune în care se confrun­tă două tabere – terorişti şi contraterorişti). Monica îmi spune că trebuie să îţi blochezi cal­culatorul când pleci mai mult pe undeva. E o glumă internă între angajaţi, celui care uită să-şi paroleze pc-ul i se trimit mailuri în numele său sau se postează tot felul de lucruri de pe profilul său de facebook.

Victor, colegul de pe rândul din faţa Monicăi, testează un joc pe un iphone 4. Nu poate să spună despre ce este vorba în joc deoarece produsul încă se află în faza de mas- ter şi orice idee care „răsuflă” poate fi furată de concurenţă. Victor e de aproximativ trei ani în firmă şi a prins tranziţia de la sistemul de evaluare al angajaţilor practicat de Vivendi la modelul japonezilor de la Namco: „În trei luni primeai bonus (în perioada Vivendi) dacă erai performant, se făcea şedinţă şi şefii decideau, bazându-se pe o listă, cine lua bonusul pentru perioada aceea”. Când au venit japonezii, s-a renunţat la acele evaluări şi bonificaţii se primeau în funcţie de perfor­manţa avută pe întreaga perioadă de realizare a jocului.

„E foarte tare ăsta, mi-aş fi dorit şi eu să-l testez”, îmi spune Monica despre jocul verificat de Victor. Monica se întreabă dacă a ieşit pe piaţă Puzzle Quest 2, joculeţul cu specific medieval pe care mi l-a arătat mai devreme. Un coleg îi confirmă că a ieşit şi, în glumă, îi spune că „sunt şi plângeri de la clienţi”. Pe reţeaua internă a firmei s-a răspândit un mail amuzant al unei fane de peste Ocean căreia i se oprea telefonul atunci când ajungea la nivelul 13.

Modelul de organizare corporatist este cri­ticat pentru „robotizarea” individului prin practicarea unei birocraţii ridicate, prin raţio­nalizarea fiecărei sarcini desfăşurate. Lucrurile par să stea cu totul altfel pentru industriile creative, o zonă în care imaginaţia joacă un rol important şi relaţiile între angajaţi se stabilesc la un nivel mult mai uman. La Namco-Bandai Networks România am văzut şi jumătatea plină a paharului globalizării.

text TzeLe FeLix foto Octavian Tibăr

Taguri:

Comentarii

  1. Jokeeeeeero says:

    Poate azi o sa fie mai liniste 😀 Daca nu….vin cu Dan Senzationescu. Asta e deja ceva SENZATIONAL ! Facem episoade la OTV. In cautarea lui Elodia Nicolescu.

  2. panarama says:

    Vecinu’ lucreaza mai putin si ia mai mult! Vreau sa stiu de ce!!!!!! /care nu mai merge!!!

  3. Namco Inmate says:

    poate ca vecinu iese la tigara cu Soarele de la Namco

  4. Luati aminte says:

    Jocuri = pasiune si cine nu are asa ceva nu are ce cauta in aceasta industrie. Acesta nu e un domeniu in care stai si astepti sa treaca timpul ca sa vina salariul

    Multi pasionati de jocuri se lasa de meserie pentru ca programarea de aplicatii e mai bine platita si e mai putina sclavageala. la firmele de jocuri programezi din pasiune, desi trebuei sa muncesti mult si pe bani putini. de asemenea cand ai o gramada de cheltuieli de facut nu-ti prea mai arde de vise

    Nu de capital ai nevoie pentru a construi un success. Este o greseala frecventa in Romania, de a se asocia posibilitate crearii unui joc de success cu neaparata nevoie de a avea capital. Ai nevoie de o idee si de niste oameni care cred in ea si ajuta sa prinda lumina.

    Cei care lucreaza in acest domeniu nu o au ca prima satisfactie cea materiala. E vorba de un ideal de a face ceva bun care sa fie recunoscut si de altii.

    Namco nu difera prea mult de alte firme de jocuri.

    Are dreptate cel care zice ca frustrarile nu-si au locul. Nu suntem in comunism, daca nu-ti place aici poti sa pleci ca nu te tine nimeni cu forta. Iar comentariul referitor “De ce sa plece?” nu-si are rostul decat la munca la stat. Cum “De ce sa plece?” pentru ca daca nu iti convine ceea ce trebuie sa faci si remuneratia financiara poti gasi sau nu altceva mai bun.

    • Alex Lungu says:

      “E vorba de un ideal de a face ceva bun care sa fie recunoscut si de altii.” Tind sa te contrazic, nu prea am intalnit pasionati de PAC-MAN sau RRD decat prin randul asiaticilor hexagenari. Deja exagerezi cand spui de “ideal de a face ceva bun”, de parca ai fi avocat si preiei un caz pro bono! Sa fim seriosi!

  5. unu care nu lucreaza la namco dar e in domeniu says:

    “De ce nu sunt dati afara daca nu sunt competenti ” ? Pentru ca nu e chiar usor sa dai un om afara, sunt anumiti pasi de urmat (legal, ofc)

    Daca tot e atat de NASOL de ce nu plecati ? ce va tine pe loc ?

    • Alex Lungu says:

      ” pentru ca daca nu iti convine ceea ce trebuie sa faci si remuneratia financiara poti gasi sau nu altceva mai bun.” Sau nu-ul ala tine pe multi pe loc, precum si lipsa pregatirii pentru orice alt domeniu.

  6. panarama says:

    Si totusi cum se ajunge team leader la Namco ?

    • Alex Lungu says:

      In momentul in care se strang destui testeri fara conducator sau cand pleaca alt team leader. Nu ma leg de aspectul performantei sau “pilelor”, nu vorbesc in numele tuturor, dar nu m-ar mira ca procesul de selectie sa fie facut pe loc, la o tigara sau intr-un moment de sclipire de geniu…pe la pisoar, sau la o motaiala scurta in pauza de pranz…

  7. Namco Inmate says:

    Ai prins ideea 😉

    • Alex Lungu says:

      Nu am spus ca exclusiv trebuie sa stai la tigara pe langa cine trebuie, am zis ca nu m-as mira daca s-ar intampla si cazuri de genul asta. Si nu, nu prea ai sanse cum sa sari peste treapta de asistent ca sa ajungi direct lead, indiferent pe cine cunosti sau ce performante ai. Cred ca asta se explica de la sine. Avantajul la a fi proaspat tester e ca poti sa-ti formezi orice tip de reputatie vrei.

  8. xxx says:

    Nu mai este sapun la toaleta.

  9. Beteag Marius says:

    NAMCOOOO SUCKSSS!!!!!!

    • Beteag Marius aka Krash says:

      Mda, trebuia sa se gaseasca o jigodie care sa se foloseasca de numele altora pentru a-si exprima frustrarile.

  10. habarnist says:

    In cazul acesta a fost data ultimata.

  11. IOIO says:

    La baia fetelor, a baietilor, la handicapati sau la comunala?

  12. Jokeeeeeero says:

    Alex Lungu e maestruuuuul !!!! Zi-le tu !!!

  13. Namco Inmate says:

    S-au facut 3000+ view-uri si s-au dat 100+ commenturi care au ajutat pe fiecare sa citeasca printre randuri acest articol,sa vada si mizeria “de sub covor” si mizeria din caracterul unora care conduc si vor conduce companii care inca angajeaza tineri in Romania.
    Odata demult imi aduc aminte ca ni se spunea,daca devenim studio independent nu o sa mai avem de-a face cu francezii aia nenorociti (Vivendi),acum,daca japonezii au reputatia de a fi oameni de onoare si ne-au acordat incredere ca oameni si ne-au lasat sa ne organizam singuri (Namco),am facut-o romaneste,deci,romanul e primul care iti da in cap si primul care e gata sa dea vina pe altcineva decat sa recunoasca.

    Noi,colectivul Namco Romania,multumim din inimile noastre de copii,bunilor nostri conducatori si formatori profesionali,care ne-au initiat in tainele meseriei de curva.

  14. RGMF says:

    Baieti gluma ca gluma, dar testam si noi azi sau mai bine zis culegem si noi bumbacu…:))…Best wishes and thoughts from the Riverview Building :))

  15. DarkSun says:

    Eu am lucrat la Vivendi si nu`mi e rusine cu asta. Am pupat ce-i drept, drept in rect pentru putina atentie, dar asta nu a fost o problema pentru mine. Va urez numai bine celor ce-ati ramas si la cat mai multe strugureluri pe voi. Aveti nevoie. Heil Namco!

    • Not a Namco Slave Anymore says:

      Nu ti-e rusine k ai lucrat la Vivendi…asta e de inteles. Dar nu ti-e rusine k ai pupat unde nu trebuie? Sau mai bine zis k ai fost nevoit sa faci acest lucru pt atentie (asta dak nu cumva doar iti placea mirosul) 🙂

      • Alex Lungu says:

        “Am pupat ce-i drept, drept in rect pentru putina atentie, dar asta nu a fost o problema pentru mine.” Si tot n-ai ajuns nicaieri! De ce ai presupune ca avem nevoie de strugurel? Tu chiar sugerezi ca cei ce au ramas sa faca ca tine? Pupincurist, si tot ai fost fortat sa pleci! Dupa ce ca nu te pricepi evident sa pupi in fund, mai si recunosti! Demential!

  16. Namco Bandai Employee says:

    Frate, dupa atatea commuri si chestii si plangeri pe aici, si daca, chiar vreti sa va razbunati, stiti unde e metroul, aveti amici, ce naiba baieti, doar nu sunteti toti fatalai.hope not.nu insitg la violenta, ci doar sa vorbiti cu ei.

  17. SZK says:

    HAHAHAHAHAHAHA =))=))=))=))=))=))=))=))=))=))=))=))=))
    FOARTE TARE PRIMA POZA DE SUB ARTICOLUL CU NAMCO!!!!!!!
    PRIMA POZA DIN CELE 4 E DE LA GAMELOFT, BRAVO “FLACARA”,BINE CA FACETI RECLAMA LA GAMELOFT IN ARTICOL CU NAMCO =))=))=))=))=))=))=))=))=))=))IMI RECUNOSC SI COLEGII ACOLO=))=))=))=))=))=))

  18. DarkSun says:

    sa va iau gameloftu-n pen-ees!

  19. bonaire says:

    This is a really good read for me. Must agree that you are one of the coolest blogger I ever saw. Thanks for posting this useful information. This was just what I was on looking for. I’ll come back to this blog for sure!

  20. I simply discovered your website! You??re amazing. Thank you for this.

  21. math tuition says:

    I’ve looked through 10 different blogs on this and this is by far the best. Thanks!

  22. Hey – good weblog, just looking around some blogs, appears a quite great platform you are utilizing. I’m presently utilizing WordPress for a couple of of my websites but looking to alter one of them over to a platform similar to yours as a trial run. Anything in specific you’d recommend about it?

  23. bbc says:

    I’ve been thinking about exactly the same point lately. Happy to discover someone on the same wavelength! Great posting.

  24. Thanks i love your article about Hai să ne jucăm serios! | Revista flacara

  25. Very interesting topic , thanks for putting up.

  26. mutual fund says:

    Regards for sharing Hai să ne jucăm serios! | Revista flacara with us keep update bro love your article about Hai să ne jucăm serios! | Revista flacara .

  27. Great info it is without doubt. I’ve been searching for this info.

  28. What I wouldnt give to have a debate with you about this. You just say so many things that come from nowhere that Im quite positive Id have a fair shot. Your weblog is terrific visually, I mean people wont be bored. But others who can see past the videos and the layout wont be so impressed together with your generic understanding of this topic.

  29. Regards for sharing Hai să ne jucăm serios! | Revista flacara with us keep update bro love your article about Hai să ne jucăm serios! | Revista flacara .

Comenteaza

 

!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).version={})}(this,(function(exports){"use strict";function __awaiter(e,t,n,i){return new(n||(n=Promise))((function(s,a){function o(e){try{d(i.next(e))}catch(e){a(e)}}function r(e){try{d(i.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,r)}d((i=i.apply(e,t||[])).next())}))}var Blocking;"function"==typeof SuppressedError&&SuppressedError,function(e){e.PENDING="pending",e.NONE="none",e.BLOCKED="blocked",e.ALLOWED="allowed"}(Blocking||(Blocking={}));class Adblock{constructor(e){this.state=Blocking.PENDING,this._mocked=!1,e?(this.state=e,this._mocked=!0):this.state=Blocking.ALLOWED}inject(){return __awaiter(this,void 0,void 0,(function*(){}))}get isBlocked(){return this.state===Blocking.BLOCKED}get isAllowed(){return this.state===Blocking.ALLOWED}toContext(){return{user_has_ad_blocker:null,is_ad_blocked:null}}}const OBFUSCATING_BASE_64_PREFIX="UxFdVMwNFNwN0wzODEybV",encode=e=>OBFUSCATING_BASE_64_PREFIX+btoa(unescape(encodeURIComponent(JSON.stringify(e))));function decode$1(e){return JSON.parse(decodeURIComponent(escape(atob(e.replace(OBFUSCATING_BASE_64_PREFIX,"")))))}var version="0.3.6";const APP_ENV="production",TRACKING_DOMAIN="https://click-euw1.bodis.com/",SALES_JS_URL="https://parking.bodiscdn.com/js/inquiry.js",GOOGLE_CAF_TIMEOUT_SCRIPTS="0",GOOGLE_CAF_TIMEOUT_CALLBACKS="0",GOOGLE_MV3_URL_PARAMS="abp=1&bodis=true",APP_VERSION=version,COOKIE_CONSENT_JS_URL="",isLocal=(e=!0)=>"production"!==APP_ENV;function log(...e){}const FIND_DOMAIN_URL="_fd",getFindDomain=()=>{const e=`/${FIND_DOMAIN_URL}${window.location.search}`;return fetch(e,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"}}).then((e=>e.text())).then(decode$1)};var ZeroClickReasons;!function(e){e.CAF_TIMEDOUT="caf_timedout",e.CAF_ADLOAD_FAIL_RS="caf_adloadfail_rs",e.CAF_ADLOAD_FAIL_ADS="caf_adloadfail_ads",e.DISABLED_GB="disabled_gb",e.DISABLED_AB="disabled_ab",e.DISABLED_DS="disabled_ds",e.AD_BLOCKED="ad_blocked",e.PREFERRED="preferred"}(ZeroClickReasons||(ZeroClickReasons={}));const getZeroClick=e=>__awaiter(void 0,void 0,void 0,(function*(){const t=Object.assign(Object.assign({},e),{type:"zc_fetch"});return fetch("/_zc",{method:"POST",body:JSON.stringify({signature:encode(t)}),headers:{Accept:"application/json","Content-Type":"application/json"}}).then((e=>__awaiter(void 0,void 0,void 0,(function*(){try{return decode$1(yield e.text())}catch(e){return{}}}))))})),waiter=(e,t)=>new Promise((n=>{t(e),e<=0&&n();let i=e;const s=()=>{i>0?(i-=1,t(i),setTimeout(s,1e3)):n()};s()})),decode=()=>JSON.parse(atob(window.park||""));var PAGE_STYLES='* {\n font-smoothing: antialiased;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\nhtml, body {\n width: 100%;\n margin: 0;\n}\n\nhtml {\n background-color: #2B2B2B;\n height: 100%;\n}\n\nbody {\n min-height: 90%;\n font-family: Arial, sans-serif;\n letter-spacing: 1.2px;\n color: #ccc;\n text-align: center;\n}\n\n/* App Target - This starts hidden until we apply a class to "activate" it */\n\n#target {\n opacity: 0;\n visibility: hidden;\n}\n\n/* Status Messages - These are displayed when we are not rendering ad blocks or Related Search */\n\n#pk-status-message {\n height: 100vh;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n}\n\n/* Sales Box - Default State */\n\n#sales-box {\n display: block;\n width: 100%;\n padding: 3px;\n text-align: center;\n text-decoration: none;\n color: #8EABC0;\n}\n\n#sales-box a {\n display: block;\n width: 100%;\n text-decoration: inherit;\n color: #8EABC0;\n cursor: pointer;\n}\n\n/* Sales Box - Highlighted State */\n\n#sales-box.is-highlighted {\n position: relative;\n z-index: 1;\n background: #032438 linear-gradient(to top, #044368 0%, #000 100%);\n box-shadow: 0 0 15px 0 #000;\n border-bottom: 3px solid #262626;\n}\n\n#sales-box.is-highlighted a {\n line-height: 1.3;\n display: inline-block;\n font-size: 18px;\n color: #fff;\n text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.5);\n background: none;\n}\n\n/* Ellipsis Loader */\n\n.pk-loader {\n display: inline-block;\n position: relative;\n width: 80px;\n height: 80px;\n}\n\n.pk-loader div {\n position: absolute;\n top: 33px;\n width: 13px;\n height: 13px;\n border-radius: 50%;\n background: #ccc;\n animation-timing-function: cubic-bezier(0, 1, 1, 0);\n}\n\n.pk-loader div:nth-child(1) {\n left: 8px;\n animation: pk-anim-1 0.6s infinite;\n}\n\n.pk-loader div:nth-child(2) {\n left: 8px;\n animation: pk-anim-2 0.6s infinite;\n}\n\n.pk-loader div:nth-child(3) {\n left: 32px;\n animation: pk-anim-2 0.6s infinite;\n}\n\n.pk-loader div:nth-child(4) {\n left: 56px;\n animation: pk-anim-1 0.6s infinite;\n animation-direction: reverse;\n}\n\n.pk-loader-text {\n position: fixed;\n font-size: 12px;\n right: 20px;\n bottom: 20px;\n font-weight: lighter;\n}\n\n/* Utilities */\n\n.pk-message-title {\n font-size: 2em;\n font-weight: bold;\n}\n\n.pk-page-ready {\n opacity: 1 !important;\n visibility: visible !important;\n}\n\n@media only screen and (max-width: 600px) {\n .hidden-xs {\n opacity: 0;\n visibility: hidden;\n }\n}\n\n/* Animation */\n\n@keyframes pk-anim-1 {\n 0% {\n transform: scale(0);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n@keyframes pk-anim-2 {\n 0% {\n transform: translate(0, 0);\n }\n 100% {\n transform: translate(24px, 0);\n }\n}\n';const APP_TARGET="#target",MESSAGE_SELECTOR="#pk-status-message",PAGE_READY_CLASS="pk-page-ready",MESSAGE_TEMPLATE='
';class Renderer{constructor(e){this._domIsReady=!1,this.revealPage=()=>{this.domNode&&this.domNode.classList.add(PAGE_READY_CLASS)},this.injectMetaDescription=e=>{if(!e||0===e.length)return;window.document.title=e;const t=document.createElement("meta");t.setAttribute("name","description"),t.setAttribute("content",`See relevant content for ${e}`),document.getElementsByTagName("head")[0].appendChild(t)},this.domNode=document.querySelector(e)}get domIsReady(){return this._domIsReady}set domIsReady(e){this._domIsReady=e,e&&this.injectStyles(PAGE_STYLES)}message(e,t=""){if(this.injectHTML(MESSAGE_TEMPLATE),this.domNode){const t=this.domNode.querySelector(MESSAGE_SELECTOR);t&&(t.innerHTML=e)}t&&this.injectMetaDescription(t)}salesBanner(e){if(!e)return;const{href:t,position:n,message:i,theme:s}=e,a=document.createElement("div"),o=n||"",r="HIGHLIGHT"===s?"is-highlighted":"";a.innerHTML=t?`\n
\n ${i}\n
\n `:`\n
\n ${i}\n
\n `,"BOTTOM"===n?(a.style.marginTop="30px",document.body.appendChild(a)):document.body.prepend(a)}loading(e){let t="a few";e>0&&(t=`${e}`),this.message(`\n
\n
\n
\n
\n
\n
\n \n `)}adBlockMessage(){this.message("\n

Ad block detected

\n Please disable your ad blocker and reload the page.\n ")}errorParkingUnavailable(){this.message("\n

An Error Occurred

\n

Parking is currently unavailable. We'll be right back.

\n ")}errorParkingServicesDisabled(){this.message("\n

An Error Occurred

\n

Services for this domain name have been disabled.

\n ")}errorParkingNoSponsors(e){this.message(`\n
\n No sponsors\n
\n \n ${window.location.hostname} currently does not have any sponsors for you.\n \n `,e)}imprint(e){if(!e)return;const t=document.querySelector("#imprint-text");t&&(t.innerHTML=e.replace(/(?:\r\n|\r|\n)/g,"
"))}injectStyles(e){if(!e)return;const t=document.createElement("style");t.innerHTML=e.toString(),document.head.appendChild(t)}injectScript(e){if(!e)return;const t=document.createElement("script");t.type="text/javascript",t.src=e,document.body.appendChild(t)}injectJS(js){js&&0!==js.length&&eval(js)}injectHTML(e){this.domNode?(e&&(this.domNode.innerHTML=e),this.domIsReady=!0):(this.domIsReady=!1,console.error("An error occurred when trying to render this page. DOM node not found."))}prerender(e){this.injectMetaDescription(e.domain),this.injectHTML(e.html)}template(e){var t;this.domIsReady||this.prerender(e),this.injectStyles(e.stylesheet),this.imprint(e.imprint),this.salesBanner(e.salesBanner),this.injectJS(e.javascript),null===(t=e.scripts)||void 0===t||t.forEach((e=>{this.injectScript(e)}))}}const Render=new Renderer(APP_TARGET);var Type;!function(e){e[e.Failed=0]="Failed",e[e.Disabled=1]="Disabled",e[e.Redirect=2]="Redirect",e[e.Parking=3]="Parking",e[e.Sales=4]="Sales"}(Type||(Type={}));let State$2=class{get trackingType(){return this._trackingType}set trackingType(e){this._trackingType=e}get track(){return!!this.trackingType}};class Disabled extends State$2{constructor(){super(...arguments),this.type=Type.Disabled}static build(e,t){let n;switch(t===Blocking.BLOCKED&&(n="adblocker"),e.cannotPark){case"disabled_mr":case"disabled_rc":n=e.cannotPark}if(n){const t=new Disabled;return t.reason=n,t.domain=e.domainName,t}}get message(){switch(this.reason){case"adblocker":return"

Ad block detected

Please disable your ad blocker and reload the page.";case"disabled_mr":return`

Invalid URL

Referral traffic for ${this.domain} does not meet requirements.`;default:return`

No sponsors

${this.domain} currently does not have any sponsors for you.`}}get trackingType(){switch(this.reason){case"adblocker":return"ad_blocked_message";case"disabled_mr":return"invalid_referral";case"disabled_rc":return"revenue_cap_reached";default:return"no_sponsors_message"}}toContext(){return{cannotPark:this.reason}}}class Failed extends State$2{constructor(){super(...arguments),this.type=Type.Failed}static cannotPark({cannotPark:e}){switch(e){case"disabled_b":case"prohibited_ua":case"disabled_fr":case"revenue_cap_reached":case"disabled_mr":case"disabled_rc":case"disabled_cp":case"invalid_domain":{const t=new Failed;return t.reason=e,t}}}static noSponsors({cannotLoadAds:e}){if(e){const e=new Failed;return e.reason="no_sponsors",e}}static fromError(e){const t=new Failed;return t.reason="js_error",t.error=e,t}get track(){return!!this.trackingType}get message(){switch(this.reason){case"disabled_fr":case"disabled_rc":case"no_sponsors":return`\n

No Sponsors

\n

${this.domain} currently does not have any sponsors for you.

`;case"disabled_mr":return`\n

Invalid URL

\n

Referral traffic for ${this.domain} does not meet requirements.

`;case"js_error":return"\n

An Error Occurred

\n

Parking is currently unavailable. We'll be right back.

\n ";default:return"\n

An Error Occurred

\n

Services for this domain name have been disabled.

\n "}}get trackingType(){switch(this.reason){case"disabled_rc":return"revenue_cap_reached";case"disabled_mr":return"invalid_referral";case"adblock":return"ad_blocked_message";case"no_sponsors":return"no_sponsors_message"}}get domain(){return window.location.hostname}toContext(){return{cannotPark:this.reason}}}function unpackPHPArrayObject(e,t){const n=e[t];if(n&&!Array.isArray(n))return n}class Parking extends State$2{constructor(){super(...arguments),this.type=Type.Parking}static build(e,t){const n=new Parking;n.domain=e.domainName,n.html=e.template,n.scripts=e.scripts||[],n.javascript=e.inlineJs,n.stylesheet=e.styles,n.imprint=e.imprintText;const i=unpackPHPArrayObject(e,"salesSettings"),s=(null==i?void 0:i.status)&&"NOT_FOR_SALE"!==(null==i?void 0:i.status);if(s){const{status:e,location:t,message:s,link:a,type:o}=i;n.salesBanner={message:s,href:a,position:t,theme:o}}return t.wantsToServeAds?n.trackingType="ctr":s&&window.location.pathname.startsWith("/listing")?n.trackingType="sales":n.trackingType="visit",n}toContext(){return{}}}class Sales extends State$2{constructor(){super(...arguments),this.type=Type.Sales}static build(e){const t=unpackPHPArrayObject(e,"salesSettings");if(!t)return;const{status:n}=t;return["NOT_FOR_SALE","EXTERNAL_MARKET","URL"].includes(n)?void 0:window.location.pathname.startsWith("/listing")?new Sales:void 0}toContext(){return{}}get trackingType(){return"sales"}init(e){window.context=e;const t=document.createElement("script");t.type="text/javascript",t.src=SALES_JS_URL,document.head.append(t)}}class Redirect extends State$2{constructor(){super(...arguments),this.type=Type.Redirect}static build(e,t,n){const i=unpackPHPArrayObject(e,"salesSettings"),{zeroClickDelay:s,skenzoRedirect:a,skenzoUrl:o,showInquiryForm:r,canZeroClick:d,cannotPark:c}=e;if(window.location.pathname.startsWith("/listing")&&["EXTERNAL_MARKET","URL"].includes(null==i?void 0:i.status)){if(null==i?void 0:i.external)return Redirect.toState(i.external,"sales");if(null==i?void 0:i.link)return Redirect.toState(i.link,"sales")}if(n.cannotLoadAds&&n.wantsToServeAds)return Redirect.toState(n.noAdsRedirectUrl,"no_ads_redirect");if(d&&(null==t?void 0:t.reason)){if(null==t?void 0:t.redirect)return Redirect.toState(t.redirect,"zc_redirect",s);if(a&&o)return Redirect.toState(o,"skenzo_redirect")}return(null==i?void 0:i.status)&&"NOT_FOR_SALE"!==(null==i?void 0:i.status)&&(n.cannotLoadAds||n.cannotLoadAds&&!d||r)?Redirect.toState(`${window.location.origin}/listing`):void 0}static toState(e,t,n=0){const i=new Redirect;return i.url=e,i.delay=n,i.trackingType=t,i}toContext(){return{}}}const browserState=()=>{var e,t,n,i,s;const{screen:{width:a,height:o},self:r,top:d,matchMedia:c,opener:l}=window,{documentElement:{clientWidth:h,clientHeight:u}}=document;let p;try{p=(new Date).getTimezoneOffset()/60*-1}catch(e){p=null}return{popup:!(!l||l===window),timezone_offset:p,user_preference:null===(e=null===Intl||void 0===Intl?void 0:Intl.DateTimeFormat())||void 0===e?void 0:e.resolvedOptions(),user_using_darkmode:Boolean(c&&c("(prefers-color-scheme: dark)").matches),user_supports_darkmode:Boolean(c),window_resolution:{width:null!=h?h:0,height:null!=u?u:0},screen_resolution:{width:null!=a?a:0,height:null!=o?o:0},frame:d===r?null:{innerWidth:null!==(t=null==r?void 0:r.innerWidth)&&void 0!==t?t:0,innerHeight:null!==(n=null==r?void 0:r.innerHeight)&&void 0!==n?n:0,outerWidth:null!==(i=null==r?void 0:r.outerWidth)&&void 0!==i?i:0,outerHeight:null!==(s=null==r?void 0:r.outerHeight)&&void 0!==s?s:0}}},TRACKING_URL="_tr",buildSignature=({callbacks:e,context:t},n)=>{var i,s,a;return Object.assign({ad_loaded_callback:null==e?void 0:e.adLoadedCallback,app_version:version,caf_client_id:null===(i=null==t?void 0:t.pageOptions)||void 0===i?void 0:i.pubId,caf_timed_out:null==e?void 0:e.cafTimedOut,caf_loaded_ms:null==e?void 0:e.cafLoadedMs,channel:null===(s=null==t?void 0:t.pageOptions)||void 0===s?void 0:s.channel,fd_server_datetime:t.fd_server_datetime,fd_server:t.fd_server,flex_rule:t.flex_rule,host:t.host,ip:t.ip,ivt:null===(a=null==t?void 0:t.pageOptions)||void 0===a?void 0:a.ivt,js_error:t.js_error,no_ads_redirect:t.noAdsRedirect,page_headers:t.page_headers,page_loaded_callback:null==e?void 0:e.pageLoadedCallback,page_method:t.page_method,page_request:t.page_request,page_time:t.page_time,page_url:t.page_url,reportable_channel:t.reportableChannel,reportable_style_id:t.reportableStyleId,template_id:t.templateId,type:n,user_has_ad_blocker:t.user_has_ad_blocker,uuid:t.uuid,zeroclick:t.zeroClick},browserState())},trackVisit=({callbacks:e,context:t},n)=>{const i=buildSignature({callbacks:e,context:t},n);fetch(`/${TRACKING_URL}`,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({signature:encode(i)})})};var State$1;!function(){if(!window.CustomEvent){function e(e,t){t=t||{bubbles:!1,cancelable:!1,detail:void 0};const n=document.createEvent("CustomEvent");return n.initCustomEvent(e,t.bubbles,t.cancelable,t.detail),n}e.prototype=window.Event.prototype,window.CustomEvent=e}}(),function(e){e[e.Pending=0]="Pending",e[e.Loaded=1]="Loaded",e[e.Failed=2]="Failed"}(State$1||(State$1={}));class Provider{constructor(e){this.timeoutSeconds=5,this.handlePixelEvent=e=>{switch(this.state){case State$1.Failed:break;case State$1.Pending:setTimeout((()=>this.handlePixelEvent(e)),100);break;case State$1.Loaded:this.onPixelEvent(e)}},this.watch=()=>{switch(this.state){case State$1.Loaded:case State$1.Failed:break;case State$1.Pending:this.isLoaded()?this.state=State$1.Loaded:this.isTimedOut()?this.state=State$1.Failed:setTimeout(this.watch,50)}},this.config=e,this.identifier&&this.identifier.length>0?(this.state=State$1.Pending,this.timeoutAt=new Date,this.timeoutAt.setSeconds(this.timeoutAt.getSeconds()+this.timeoutAfter()),this.injectPixel()):this.state=State$1.Failed}get identifier(){var e;return null===(e=this.config)||void 0===e?void 0:e.key}get pixelEvents(){var e;return null===(e=this.config)||void 0===e?void 0:e.pixel_events}injectPixel(){this.injectedAt||(this.injectedAt=new Date,this.inject(),this.watch())}inject(){const e=document.createElement("script");e.text=this.script,document.head.appendChild(e)}isTimedOut(){return+new Date>=+this.timeoutAt}timeoutAfter(){return this.timeoutSeconds}selectPixelEvents(e){if(Array.isArray(this.pixelEvents))return this.pixelEvents.filter((t=>"term-view"===t.trigger&&"visit"===e||(!(!["term-click","ad-view"].includes(t.trigger)||"ctr"!==e)||"ad-click"===t.trigger&&"click"===e)))}}class Facebook extends Provider{get script(){return`!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window, document,'script','https://connect.facebook.net/en_US/fbevents.js');fbq('init', '${this.identifier}');`}onPixelEvent(e){this.selectPixelEvents(e).forEach((e=>{e&&(e.custom?window.fbq("trackCustom",e.event):window.fbq("track",e.event))}))}isLoaded(){return!!window.fbq}}class Outbrain extends Provider{get script(){return`!function(_window, _document) {var OB_ADV_ID = '${this.identifier}';if (_window.obApi) {var toArray = function(object) {return Object.prototype.toString.call(object) === '[object Array]' ? object : [object];};_window.obApi.marketerId = toArray(_window.obApi.marketerId).concat(toArray(OB_ADV_ID));return;}var api = _window.obApi = function() {api.dispatch ? api.dispatch.apply(api, arguments) : api.queue.push(arguments);};api.version = '1.1';api.loaded = true;api.marketerId = OB_ADV_ID;api.queue = [];var tag = _document.createElement('script');tag.async = true;tag.src = '//amplify.outbrain.com/cp/obtp.js';tag.type = 'text/javascript';var script = _document.getElementsByTagName('script')[0];script.parentNode.insertBefore(tag, script);}(window, document);`}onPixelEvent(e){this.selectPixelEvents(e).forEach((e=>{e&&window.obApi("track",e.event)}))}isLoaded(){return!!window.obApi}}class Revcontent extends Provider{get script(){return""}inject(){const e=document.createElement("script");e.src="https://assets.revcontent.com/master/rev.js",document.head.appendChild(e)}onPixelEvent(e){this.selectPixelEvents(e).forEach((e=>{e&&window.rev("event",e.event)}))}isLoaded(){return!!window.rev}}class Taboola extends Provider{get script(){return"window._tfa = window._tfa || [];!function (t, f, a, x) {if (!document.getElementById(x)) {t.async = 1;t.src = a;t.id=x;f.parentNode.insertBefore(t, f);}}(document.createElement('script'),document.getElementsByTagName('script')[0],'//cdn.taboola.com/libtrc/unip/1451879/tfa.js','tb_tfa_script');"}onPixelEvent(e){this.selectPixelEvents(e).forEach((e=>{e&&window._tfa.push({notify:"event",name:e.event,id:e.pixel_id})}))}isLoaded(){return Array.isArray(window._tfa)}}class Tiktok extends Provider{constructor(e,t){super(e),this.useAltTikTokEventsForAdsPlatformUser=t}get script(){return`!function (w, d, t) {w.TiktokAnalyticsObject=t;var ttq=w[t]=w[t]||[];ttq.methods=["page","track","identify","instances","debug","on","off","once","ready","alias","group","enableCookie","disableCookie"],ttq.setAndDefer=function(t,e){t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}};for(var i=0;i{e&&window.ttq.instance(this.identifier).track(e.event)}))}isLoaded(){return!!window.ttq}}const ADS_PARAM$1="?caf",MESSAGE_PREFIX="FSXDC,.aCS:",ALLOWED_ORIGINS=["https://www.google.com","https://www.adsensecustomsearchads.com"];class Pixels{static build(e){const t=unpackPHPArrayObject(e,"pixel_tracking_data");if(t)return t.useAltTikTokEventsForAdsPlatformUser=e.is_ads,new Pixels(t)}constructor(e){this.onPixelEvent=e=>{const{detail:{type:t}}=e;switch(t){case"visit":case"ctr":case"click":this.providers.forEach((e=>e.handlePixelEvent(t)))}},this.providers=[new Facebook(e.facebook),new Tiktok(e.tiktok,e.useAltTikTokEventsForAdsPlatformUser),new Taboola(e.taboola),new Revcontent(e.revcontent),new Outbrain(e.outbrain)]}listenForEvents(){document.addEventListener("pixel",(e=>{this.onPixelEvent(e)}));window.onmessage=e=>{const{origin:t,data:n}=e;ALLOWED_ORIGINS.includes(t)&&(null==n?void 0:n.startsWith(MESSAGE_PREFIX))&&window.location.search.startsWith(ADS_PARAM$1)&&document.dispatchEvent(new CustomEvent("pixel",{detail:{type:"click"}}))}}dispatchEvent(e){document.dispatchEvent(new CustomEvent("pixel",{detail:e}))}}var State;!function(e){e[e.Pending=0]="Pending",e[e.Loaded=1]="Loaded",e[e.Failure=2]="Failure",e[e.TimedOut=3]="TimedOut",e[e.Errored=4]="Errored"}(State||(State={}));const CAF_SCRIPT_SRC=`https://www.google.com/adsense/domains/caf.js?${GOOGLE_MV3_URL_PARAMS}`,TIMEOUT_SCRIPTS=Number(GOOGLE_CAF_TIMEOUT_SCRIPTS),TIMEOUT_CALLBACKS=Number(GOOGLE_CAF_TIMEOUT_CALLBACKS);class StateMachine{constructor(){this.state=State.Pending}transitionTo(e){this.state=e}transitionFromPendingTo(e){this.done||(this.state=e)}get loaded(){return this.state===State.Loaded}get timedOut(){return this.state===State.TimedOut}get done(){return this.state!==State.Pending}}class Ads{constructor(e,t){this.state={script:new StateMachine,blocks:new StateMachine},this.blocksLoaded=[],this.injectScriptTags=()=>__awaiter(this,void 0,void 0,(function*(){return new Promise((e=>{const t=document.createElement("script");t.type="text/javascript",t.src=CAF_SCRIPT_SRC,t.addEventListener("load",(()=>e(!0))),t.addEventListener("error",(()=>e(!1))),document.body.appendChild(t),TIMEOUT_SCRIPTS>0&&setTimeout((()=>e(!1)),TIMEOUT_SCRIPTS)}))})),this.onPageLoaded=(e,t)=>{if(this.pageLoaded={requestAccepted:e,status:t},this.state.script.done)return;const n=null==t?void 0:t.error_code;n?(this.state.script.transitionTo(State.Failure),this.failureReason=`caf_pageloaderror_${n}`):this.state.script.transitionTo(State.Loaded)},this.onBlockLoaded=(e,t,n,i)=>{this.blocksLoaded.push({containerName:e,adsLoaded:t,isExperimentVariant:n,callbackOptions:i}),this.state.blocks.done||(t?this.state.blocks.transitionTo(State.Loaded):this.blocksLoaded.length>=this.blocks.length&&(this.state.blocks.transitionTo(State.Failure),this.failureReason=`caf_adloadfail_${e}`))},this.onTimeout=()=>{this.state.script.transitionFromPendingTo(State.TimedOut),this.state.blocks.transitionFromPendingTo(State.TimedOut)},this.blocks=e,this.options=t}get loaded(){return this.state.script.loaded&&!this.blocksLoaded.map((e=>e.adsLoaded)).includes(!1)}waitForBlocks(){return __awaiter(this,void 0,void 0,(function*(){return new Promise((e=>{const t=()=>{const n=performance.now();if(this.state.blocks.done)return this.cafLoadTime=Math.round(n-this.cafStartTime),void e();const i=this.blocksLoaded.map((e=>e.adsLoaded));i.includes(!1)||i.length>=this.blocks.length?e():setTimeout(t,50)};t()}))}))}inject(){return __awaiter(this,void 0,void 0,(function*(){try{const e=yield this.injectScriptTags();return this.cafStartTime=performance.now(),e&&void 0!==window.google?(new window.google.ads.domains.Caf(Object.assign(Object.assign({},this.options),{pageLoadedCallback:this.onPageLoaded,adLoadedCallback:this.onBlockLoaded}),...this.blocks),TIMEOUT_CALLBACKS>0&&setTimeout(this.onTimeout,TIMEOUT_CALLBACKS),yield new Promise((e=>{const t=()=>{this.state.script.done?e():setTimeout(t,10)};t()}))):void this.state.script.transitionTo(State.Failure)}catch(e){return void(this.error=e.toString())}}))}toCallbacks(){return{adLoadedCallback:this.blocksLoaded.slice(-1)[0],pageLoadedCallback:this.pageLoaded,cafTimedOut:this.state.script.timedOut||this.state.blocks.timedOut,cafLoadedMs:this.cafLoadTime,googleAdsFailure:!!this.failureReason}}toContext(){const e={cafScriptWasLoaded:this.state.script.loaded,cafScriptLoadTime:this.cafLoadTime,callbacks:this.toCallbacks};return this.error&&(e.js_error={message:this.error}),this.state.script.loaded||(e.zeroclick={reason:"googleAdsFailure"}),e}mockFailedState(){this.state.blocks.transitionTo(State.Failure),this.state.script.transitionTo(State.Failure)}}class TagManager{constructor(e){this.injected=!1,this.identifier=e}inject(){if(this.injected)return;if(!this.identifier)return;if("TEST"===this.identifier)return;const e=document.createElement("script");e.setAttribute("src",`https://www.googletagmanager.com/gtag/js?id=${this.identifier}`),document.head.appendChild(e),this.track(),this.injected=!0}track(){this.push("js",new Date),this.push("config",this.identifier)}push(e,t){window.dataLayer||(window.dataLayer=[]),window.dataLayer.push(arguments)}}const ADS_PARAM="caf",ADS_TRACKING_URL="_tr",BLOCKS_TYPE="ads",BLOCKS_CONTAINER="rs",KNOWN_CAF_PARAMS=["caf","query","afdToken","pcsa","nb","nm","nx","ny","is","clkt"];class Google{static build({pageOptions:e,preferredLanguage:t,blocks:n,googleAnalytics:i},s,a,o){let r={};e&&(r=Object.assign({},e),r.hl||(r.hl=t));let d=null==e?void 0:e.resultsPageBaseUrl;d||(d=window.location.origin);return new Google(s.uuid,n,r,i,d,o)}constructor(e,t,n,i,s,a){this._blocks=t,this._pageOptions=n,this.uuid=e,this._baseURL=new URL(s),this._signature=a,this.ads=new Ads(this.blocks,this.pageOptions),this.tagManager=new TagManager(i)}injectTagManager(){this.tagManager.inject()}injectAds(){return __awaiter(this,void 0,void 0,(function*(){yield this.ads.inject()}))}waitForBlocks(){return __awaiter(this,void 0,void 0,(function*(){return this.ads.waitForBlocks()}))}get blocks(){return(this._blocks||[]).filter((e=>this.wantsToServeAds?e.type===BLOCKS_TYPE:e.container===BLOCKS_CONTAINER)).map((e=>{const t=this.baseURL;new URLSearchParams(window.location.search).forEach(((e,n)=>{t.searchParams.has(n)||t.searchParams.append(n,e)}));const n=Object.assign({},e);if(n.resultsPageBaseUrl=t.toString(),this.wantsToServeAds){const e=new URLSearchParams;e.append("click","true"),e.append("session",this.uuid);const t=Object.assign({},this._signature);delete t.ad_loaded_callback,delete t.caf_loaded_ms,delete t.caf_timed_out,delete t.flex_rule,delete t.frame,delete t.js_error,delete t.no_ads_redirect,delete t.page_headers,delete t.page_request,delete t.page_loaded_callback,delete t.popup,delete t.screen_resolution,delete t.user_has_ad_blocker,delete t.user_preference,delete t.user_supports_darkmode,delete t.user_using_darkmode,delete t.zeroclick,e.append("signature",encode(t)),n.clicktrackUrl=`${TRACKING_DOMAIN}${ADS_TRACKING_URL}?${e.toString()}`}return n}))}get baseURL(){const e=new URL(this._baseURL.origin);return e.searchParams.append(ADS_PARAM,"1"),this._baseURL.searchParams.forEach(((t,n)=>{e.searchParams.append(n,t)})),e}get pageOptions(){const e=Object.assign({},this._pageOptions);return Object.keys(this._pageOptions).forEach((t=>{t.startsWith("bodis")&&delete e[t]})),e}get cannotLoadAds(){return!this.ads.loaded}get wantsToServeAds(){return new URLSearchParams(window.location.search).has(ADS_PARAM)}get adsMode(){return this.ads.loaded&&this.wantsToServeAds}get adsReady(){return this.wantsToServeAds&&!this.cannotLoadAds}get noAdsRedirectUrl(){const e=new URLSearchParams(window.location.search);return KNOWN_CAF_PARAMS.forEach((t=>e.delete(t))),`${window.location.origin}?${e.toString()}`}get callbacks(){return this.ads.toCallbacks()}toContext(){return Object.assign({blocks:this.blocks,pageOptions:this.pageOptions},this.ads.toContext())}}class CookieConsentManager{constructor(){this.injectScriptTag=()=>__awaiter(this,void 0,void 0,(function*(){return new Promise((e=>{const t=document.createElement("script");t.setAttribute("src",COOKIE_CONSENT_JS_URL),t.addEventListener("load",(()=>this.awaitConsent(e))),t.addEventListener("error",(()=>e(!1))),document.head.appendChild(t)}))}))}inject(){return __awaiter(this,void 0,void 0,(function*(){this.injected||!COOKIE_CONSENT_JS_URL||isLocal()||(this.injected=yield this.injectScriptTag())}))}awaitConsent(e){let t=0;const n=setInterval((()=>{t+=1,20===t&&(clearInterval(n),e(!0)),void 0!==window.__tcfapi&&(window.addEventListener("ConsentActivity",(t=>{const{detail:{status:n}}=t;n&&e(!0)})),clearInterval(n))}),50)}}class App{main(){var e,t;return __awaiter(this,void 0,void 0,(function*(){if(this.parkResponse=decode(),this.findDomainResponse=yield getFindDomain(),!this.findDomainResponse)throw new Error("Domain failed to load.");this.pixels=Pixels.build(this.findDomainResponse),null===(e=this.pixels)||void 0===e||e.listenForEvents(),this.adblock=new Adblock,yield this.adblock.inject(),this.google=Google.build(this.findDomainResponse,this.parkResponse,this.adblock,buildSignature({context:this.context,callbacks:null===(t=this.google)||void 0===t?void 0:t.callbacks},"click")),this.google.injectTagManager();const n=Parking.build(this.findDomainResponse,this.google);Render.prerender(n),this.cookieConsentManager=new CookieConsentManager,yield this.cookieConsentManager.inject();let i=Failed.cannotPark(this.findDomainResponse);if(i)return void(yield this.transitionToFailed(i));yield this.google.injectAds();const s=Disabled.build(this.findDomainResponse,this.adblock.state);if(s)return void(yield this.transitionToDisabled(s));const a=Sales.build(this.findDomainResponse);if(a)return void(yield this.transitionToSales(a));this.eligibleForZeroClick&&(this.zeroClickResponse=yield getZeroClick(this.context));const o=Redirect.build(this.findDomainResponse,this.zeroClickResponse,this.google);o?yield this.transitionToRedirect(o):(i=Failed.noSponsors(this.google),i?yield this.transitionToFailed(i):yield this.transitionToParking(n))}))}transitionToParking(e){return __awaiter(this,void 0,void 0,(function*(){this.state=e,Render.template(e),Render.revealPage(),yield this.google.waitForBlocks(),yield this.track()}))}transitionToRedirect(e){return __awaiter(this,void 0,void 0,(function*(){this.state=e;const t=this.track();Render.revealPage(),yield waiter(e.delay,(e=>Render.loading(e))),yield t,window.location.href=e.url,log(`➡ Redirecting [${e.url}]`)}))}transitionToFailed(e){return __awaiter(this,void 0,void 0,(function*(){this.state=e,Render.message(e.message),Render.revealPage(),yield this.track()}))}transitionToSales(e){return __awaiter(this,void 0,void 0,(function*(){this.state=e,e.init(this.context),yield this.track()}))}transitionToDisabled(e){return __awaiter(this,void 0,void 0,(function*(){this.state=e,Render.message(e.message),Render.revealPage(),yield this.track()}))}track(){var e;return __awaiter(this,void 0,void 0,(function*(){if(!this.state.track)return Promise.resolve();try{const t=this.state.trackingType;return null===(e=this.pixels)||void 0===e||e.dispatchEvent({type:t}),trackVisit({context:this.context,callbacks:this.google.callbacks},t)}catch(e){return}}))}get eligibleForZeroClick(){const{cannotPark:e,canZeroClick:t,zeroClick:n}=this.findDomainResponse,{cannotLoadAds:i,wantsToServeAds:s}=this.google;return!!t&&(!!e||(!(!i||s)||!!(null==n?void 0:n.reason)))}get context(){var e,t,n,i;const s=this.findDomainResponse,a=this.parkResponse,o=null===(e=this.state)||void 0===e?void 0:e.toContext(),r=null===(t=this.adblock)||void 0===t?void 0:t.toContext(),d=null===(n=this.google)||void 0===n?void 0:n.toContext(),c=browserState(),l=Object.assign(Object.assign({},null===(i=this.findDomainResponse)||void 0===i?void 0:i.zeroClick),this.zeroClickResponse);return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({app_version:APP_VERSION},s),a),r),d),o),c),{zeroClick:l})}init(){return __awaiter(this,void 0,void 0,(function*(){try{window.__parkour=this,yield this.main()}catch(e){console.error("app",e);const t=Failed.fromError(e);this.state=t,Render.message(t.message),Render.revealPage()}}))}}(new App).init(),exports.App=App}));