معرفی توپولوژی‌های معماری سایتکت اسکادا

    • تاریخ : آگوست 17, 2016
    • توسط : ادمین

    معرفی توپولوژی‌های معماری سایتکت اسکادا

    نرم‌افزار سایتکت اسکادا (CitectSCADA) محصول شرکت «اشنایدر الکتریک» (Schneider Electric) یکی از سیستم‌های قدرتمند در زمینه کنترل و مانیتورینگ، با بیش از ۳۵ سال سابقه فروش است. این نرم‌افزار ابتدا در شرکت Citect Pty Ltd تولید شد، و در سال ۲۰۰۶ که این شرکت توسط گروه «اشنایدر الکتریک» خریداری شد، توسعه‌ی آن ادامه یافت. این نرم‌افزار با پشتوانه‌ی تجربه ۲۰۰ ساله شرکت «اشنایدر الکتریک» در اتوماسیون و مدیریت کنترل، و با پیگیری تحقیق و توسعه به جایگاه بالایی از نظر کیفیت و تکنیک در سطح جهانی دست یافته است. شرکت «اشنایدر الکتریک» به عنوان «شریک طلایی» (Gold Partner) شرکت «مایکروسافت» فعالیت می‌کند و از پشتیبانی خاص این شرکت برخوردار است.

    نرم‌افزار سایتکت اسکادا برای زمینه‌های مختلف صنعتی راهکارهایی ارائه داده است. از جمله آن می‌توان به زمینه‌های برق، گاز، آب و فاضلاب، حمل و نقل، اتوماسیون ساختمان، صنایع شیمیایی، فلزات و … اشاره کرد.

     

    توپولوژی‌های معماری سیستم سایتکت اسکادا

    مقیاس‌پذیری

    سیستم سایتکت اسکادا قابلیت مقیاس‌پذیری برای سازگاری و تنظیم با هر محیط صنعتی را بدون ایجاد تغییر در سخت‌افزار یا نرم‌افزار دارد.

    به عنوان مثال در این سیستم به راحتی می‌توان با اضافه کردن یک LAN و یک کامپیوتر به عنوان کلاینت کنترل یا یک رابط اپراتوری جدید ایجاد نمود. این کامپیوتر داده‌های ورودی/خروجی را از کامپیوتر اول دریافت می‌کند و از تنظیمات مشابه استفاده می‌کند.

    کنترل محلی

    سیستم embedded سایتکت اسکادا قابلیت اجرای کل SCADA را به صورت یکپارچه به همراه یک سیستم کنترل بر روی Windows embedded ارائه می‌کند.

    کنترل استاندارد

    سیستم سایتکت اسکادا قابلیت اجرا روی یک کامپیوتر تا روی تعداد زیادی سیستم کنترل را دارد. این قابلیت برای کاربرانی که طولانی مدت از این سیستم استفاده می‌کنند، اهمیت بالایی دارد. چرا که می‌توانند ابتدا براساس نیاز خود سیستم کنترل را طراحی کنند، اما در صورت وسعت یافتن پروسه‌ی تحت کنترل، ظرفیت اسکادا را بالا ببرند.

    کنترل وسیع

    برای پروژه‌های با وسعت بالا، سایتکت اسکادا توپولوژی‌های مخابراتی و ساختارهای پروژه‌ای پیشرفته‌ای را توسعه داده است تا طراحی، پیاده‌سازی و پشتیبانی چنین سیستم‌هایی به خوبی قابل اجرا باشد. سایتکت اسکادا قابلیت مانیتورینگ و کنترل بیش از نیم‌میلیون نقطه ورودی/خروجی را دارد. امکان بهره‌گیری از پردازش متمرکز (Centralized) یا گسترده (Distributed) در این سیستم، مقیاس‌پذیری آن را افزایش داده است. پردازش متمرکز روی یک سیستم مستقل مزیت نگهداری داده در یک محل و صرفه‌جویی مالی را دارد. در حالی که پردازش گسترده برای کاربردهای بزرگ قابلیت به اشتراک‌گذاری بار پردازشی بین چندین سیستم را در اختیار می‌گذارد.

    انعطاف‌پذیری

    یکی از قابلیت‌های مهم سیستم اسکادا انعطاف‌پذیری و ظرفیت‌های طراحی آن است. سایتکت اسکادا با استفاده از معماری کلاینت-سروری، قابلیت طراحی و بازسازی سیستم را بر اساس نیازهای خاص پروژه‌ها ایجاد می‌کند.

    معماری کلاینت-سروری سایتکت اسکادا، از سطح وظایف (Tasks) شروع شده است. به طوری که هر وظیفه مانند یک ماژول مشخص و جداگانه‌ی کلاینتی و/یا سروری عمل، و از طریق ارتباط کلاینت-سروری با سایر ماژول‌ها رابطه برقرار می‌کند. سایتکت اسکادا شامل پنج وظیفه‌ی اساسی است که مسئولیت‌های زیر را برعهده دارند:

    • برقراری ارتباط با دستگاه‌های ورودی/خروجی
    • مانیتورینگ وضعیت آلارم‌ها
    • گزارش‌دهی خروجی
    • رسم نمودار
    • نمایش به کاربر

    این وظایف به صورت مستقل عمل می‌کنند، و با این شیوه معماری، می‌توان هر بخش از نرم‌افزار را روی یک کامپیوتر اجرا کرد.

    سایتکت اسکادا امکان پشتیبانی ۲۵۵ سرور ورودی/خروجی و تعداد زیادی از پروتکل‌های ارتباطی را دارد، که قابلیت جمع‌آوری داده‌ها را از هر کجا برایش ممکن می‌کند. فرایند جمع‌آوری داده، مستقل از سیستم کنترل عمل می‌کند، بنابراین امکان ایجاد تغییر در جایگاه سیستم جمع‌آوری داده و سیستم‌ ارتباطی در آینده وجود خواهد داشت.

    بین بخش‌های مختلف این سیستم، یک رابط (Interface) وجود دارد. سرور اسکادا می‌تواند به طور مستقل از سرور ورودی/خروجی عمل کند و از طریق مدیای مخابراتی روی پهنای باند مشترک با آنها ارتباط برقرار می‌کند. این موضوع موجب انعطاف‌پذیری بیشتری در سیستم اسکادا و انتخاب آزادانه‌تر جایگاه کامپیوترهای سرور می‌گردد.

    در اغلب موارد سایتکت اسکادا به این ترتیب طراحی می‌گردد که بخش‌های مختلف سیستم، پیرامون دو سرور مرکزی اصلی و ذخیره قرار می‌گیرند. با این طراحی به بازده بهینه‌ی سیستم می‌رسیم که در آن هر یک از وظایف به صورت مستقل و جداگانه اجرا می‌گردند. البته این امکان نیز وجود دارد که کلیه‌ی بخش‌های سیستم روی یک سرور اجرا شود.

    معماری قابل اطمینان

    سایتکت اسکادا یک پیکربندی hot standby دارد و به خوبی از افزونگی پشتیبانی می‌کند. به این ترتیب در زمان وقوع خرابی، با سوئیچ کردن اتوماتیک روی سیستم پشتیبان هیچ مشکلی برای کل سیستم به وجود نخواهد آمد. علاوه بر این با ذخیره‌ی کلیه‌ی تغییرات نقاط روی هر دو سیستم اصلی و پشتیبان، می‌توان اطمینان داشت که تمام دستگاه‌ها به نوعی دارای افزونگی هستند.

    با توجه به وجود انواع نویزها و مشکلاتی که ممکن است در خطوط ارتباط مخابراتی پیش بیاید، سایتکت اسکادا از دو کابل مخابراتی کاملاً مجزا جهت ارتباط با دستگاه‌های ورودی/خروجی استفاده می‌کند. این کار احتمال از دست دادن داده‌ها را در طی خط ارتباطی بسیار کاهش می‌دهد.

    البته به جهت استفاده بهینه از پهنای باند مخابراتی و همچنین جلوگیری از اختلاط داده‌ها، تنها سرور اصلی با دستگاه‌های ورودی/خروجی ارتباط برقرار می‌کند.

    ارتباط از طریق شبکه احتمال خرابی زیادی دارد، به همین دلیل در سایتکت اسکادا با اضافه کردن یک (یا چند) کارت شبکه دیگر، می‌توان از قابلیت افزونگی در شبکه استفاده کرد که در صورت وقوع خرابی، به سرعت سیستم روی شبکه‌ی پشتیبان سوئیچ می‌کند و از خرابی کل سیستم جلوگیری می‌نماید.

    در اغلب سیستم‌ها، امکان وقوع خطا یا خرابی در فایل سرور در نظر گرفته نمی‌شود، اما در سایتکت اسکادا به دلیل وجود افزونگی در فایل سرور، با ایجاد خطا، فایل‌ها از دست نرفته و سیستم اسکادا بدون مشکل به کار خود ادامه می‌دهد.

    در کل تنظیمات افزونگی در سایتکت اسکادا ساده است و می‌توان برای وظایف مختلف، پشتیبان تعریف کرد. در زمان خرابی هر بخش (I/O، Trends، Alarms، Reports، Display) به صورت اتوماتیک جایگزینی سیستم پشتیبان صورت می‌گیرد و به این ترتیب مشکلی در کل سیستم به وجود نمی‌آید. همچنین در زمان به روز کردن سیستم یا ایجاد تغییر در تنظیمات و پیکربندی، می‌توان به راحتی برنامه‌ی سرور را روی سیستم پشتیبان اجرا کرد و تغییرات لازم را ایجاد نمود.

     

    کلاینت‌ها

    برای انعطاف‌پذیری بیشتر سیستم، سایتکت اسکادا امکان استفاده‌ی کاربران از طریق اینترنت و اینترانت را فراهم نموده است. به این ترتیب می‌توان دسترسی کاربران سیار، کاربران از راه دور، کارفرمایان، پلنت‌های راه دور و کاربران خاص و مدیران را پشتیبانی نمود.

    این سیستم دو سطح از کلاینت‌ها را پشتیبانی می‌کند: «کلاینت کنترل‌گر» و «کلاینت نمایشگر». بهترین ابزار برای اپراتورها «کلاینت کنترل‌گر» است، چرا که امکان دسترسی به تمام صفحات و خواندن مقادیر یا ارسال فرمان برای کلیه متغیرهای تحت کنترل اسکادا را در اختیار قرار می‌دهد. در حالی که ابزار مناسب مدیریت سیستم، «کلاینت نمایشگر» برای نمایش دادن کلیه اطلاعات مربوط به سیستم اسکادا است، ولی امکان ایجاد تغییر در متغیرها و ارسال فرمان را به کاربر نمی‌دهد. همچنین امکان تغییر تنظیمات امنیتی به صورتی که «کلاینت کنترل‌گر» امکان ارسال فرمان نداشته باشد نیز وجود دارد.

    در اتاق کنترل، روی کامپیوترها سیستم «کلاینت» به طور کامل نصب می‌شود و بعد برای هر کاربر یک مجوز ارائه می‌گردد تا سطح دسترسی مشخص شود.

    کلاینت‌های تحت وب امکان دسترسی کاربران را از طریق اینترنت فراهم می‌کند. این سرویس می‌تواند ارتباط با هر کدام از کلاینت‌های کنترل‌گر را برقرار کند و پیکربندی پروژه را دانلود کرده آن را به همراه سنکرون کردن با کلاینت تحت وب به‌روز می‌کند. با استفاده از یک فایروال و تعریف نام کاربری و رمز عبور تحت مدیریت ویندوز برای کاربران می‌توان امنیت کلاینت‌های تحت وب را تضمین نمود.

    ارتباطات

    سایتکت اسکادا حاوی بیش از ۱۴۰ نوع درایور برای ارتباط با انواع دستگاه‌های ورودی/خروجی است که امکان اتصال به ۳۰۰ مدل مختلف دستگاه شامل PLCها، RTUها، میکروکنترلرها، تجهیزات DCS و بسیاری دیگر را فراهم می‌کند. همچنین وجود کیت توسعه درایور، قابلیت تعریف دستگاه‌‌های جدیدی را ایجاد می‌کند. علاوه بر این سایتکت اسکادا از پروتکل OPC نیز پشتیبانی می‌کند.

    از طریق وبسایت Citect امکان دریافت اطلاعات جدید در مورد درایورها و همچنین از طریق ابزار Driver Update امکان به روزرسانی درایورها وجود دارد.

    کارایی

    با توجه به تفاوت بین پروتکل‌های دستگاه‌های موجود، و تفاوت بین سرعت انتقال اطلاعات، این امکان وجود دارد که داده‌ها با تأخیر به دست بیایند. سیستم سایتکت اسکادا تلاش کرده که سرعت انتقال اطلاعات را به حداکثر برساند. برای این کار، مخابرات مبتنی بر تقاضا را پیاده‌سازی کرده و تنها اطلاعات نقاطی را دریافت می‌کند که از طرف کلاینت درخواست می‌شود. به این ترتیب از ارتباطات بی مورد جلوگیری شده، سرعت کار سیستم (خصوصاً در بخش به‌روزرسانی گرافیک) افزایش می‌یابد.

    طراحی شیءگرا

    امکانات سایتکت اسکادا این قابلیت را برای مهندس سیستم فراهم می‌کند که بتواند دستگاه‌های موجود در تأسیسات تحت کنترل را به عنوان شیء تعریف کند. برای هر کدام از این اشیاء از منظرهای مختلف، پیکربندی مناسب انجام دهد، و آن را به عنوان یک قالب ذخیره کند. به عنوان مثال پمپ، شیر، موتور، ترانسفورماتور، کلید، و غیره قالب‌های اشیائی هستند که مهندس سیستم می‌تواند تعریف نماید. هر کدام از این قالب‌ها دارای شکل گرافیکی، مشخصات، متغیرها، آلارم‌ها و نمودارهای مختص خود هستند. با کپی گرفتن از این قالب‌ها مهندس سیستم می‌تواند به راحتی هر کجا که می‌خواهد آن شیء را تعریف نماید و نیازی به پیکربندی مجدد نیست.

    گرافیک

    قابیلت‌های گرافیکی سیستم اسکادا تأثیر بسزایی در کل کارایی سیستم می‌گذارد. امکانات گرافیکی سایتکت اسکادا موجب می‌شود که بتوان سمبل‌های گرافیکی مورد نیاز را با افزودن قابلیت‌های تغییر رنگ و شکل به سادگی طراحی کرد.

    اشیاء گرافیکی در سایتکت اسکادا از المان‌های ساده‌ای مثل بیضی‌ها، مستطیل‌ها، متن‌ها و … تشکیل می‌شوند. هر کدام از این المان‌ها مجموعه‌ای از ویژگی‌ها دارند که رفتار شیء را در شرایط مختلف مشخص می‌کند. به عنوان مثال تغییر اندازه و رنگ، پر شدن و پدیدار شدن از جمله‌ی این ویژگی‌هاست که می‌بایست بر اساس وقایع و شرایط متغیرهای وابسته تنظیم گردد.

    سایتکت اسکادا امکان اضافه کردن تصاویر با کیفیت بالا (۴۰۹۶×۴۰۹۶) را برای بهتر نشان دادن فضای سایت تحت کنترل دارا است. این نرم‌افزار از کتابخانه‌ی بزرگ سمبل‌های گرافیکی برای نمایش انواع تجهیزات صنعتی برخوردار است.

    ابزار Citect Graphic Builder

    این ابزار به سادگی امکان طراحی یک رابط اپراتوری برای سیستم سایتکت اسکادا را ایجاد می‌کند. امکانات این نرم‌افزار به سادگی انتخاب ابزارها و کشیدن روی صفحه است تا شکل مورد نظر کشیده شود. بعد از کشیده شدن، امکان تغییر اندازه، کپی کردن، مرتب کردن، جابجا کردن و … وجود دارد.

    این نرم‌افزار فایل‌های گرافیکی با پسوندهای متعددی از جمله JPG، BMP و ActiveX Object را می‌شناسد و با یک تصویر از قبل کشیده شده، می‌توان به راحتی کار کرد و از آن به عنوان یک شیء استفاده نمود.

    جعبه‌ابزارهای مختلف با ایجاد قابلیت انتخاب انواع ابزارها برای رسم و طراحی اشکال، و سایر امکانات نرم‌افزاری به سادگی در دسترس هستند.

    ابزارهای Bitmap Editor، Color Swapping، Gradient Fill و OLE Automation از ابزارهای جانبی این نرم‌افزار هستند که به ترتیب امکان ایجاد و یا تغییر سمبل‌های گرافیکی به صورت bitmap، امکان انتخاب رنگ، امکان ایجاد سایه روشن، و نیز امکان استفاده از دیتابیس‌های گرافیکی OLE را در اختیار می‌گذارند. به این ترتیب می‌توان انیمیشن‌های از پیش تعریف شده را به راحتی از طریق یک رابط محاوره‌ای اضافه نمود.

    ثبت نظر

    نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

!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*(){}))}hasAdblocker(){if(void 0===window.google)return!0;const e=document.querySelectorAll("style");return Array.from(e).some((e=>!!e.innerHTML.includes("adblockkey")))}handleAdblocked(){this.removeAdblockKey(),this.state=Blocking.BLOCKED}removeAdblockKey(){var e;null===(e=document.documentElement.dataset)||void 0===e||delete e.adblockkey}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.5.4";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=(e="",t=!1)=>{const n=`${e}/${FIND_DOMAIN_URL}${window.location.search}`,i=e?"include":"same-origin",s=Object.assign({Accept:"application/json","Content-Type":"application/json"},t?{"X-HOST":window.location.host}:{});return fetch(n,{method:"POST",headers:s,credentials:i}).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: 75vh;\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_TARGET="main",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.injectMessage(MESSAGE_TEMPLATE),this.domNode){const t=this.domNode.querySelector(MESSAGE_SELECTOR);t&&(t.innerHTML=e)}t&&this.injectMetaDescription(t)}injectMessage(e){const t=document.querySelector(MESSAGE_TARGET);t?t.innerHTML=e:this.domNode&&(this.domNode.innerHTML=e)}salesBanner(e){if(!e)return;const{href:t,position:n,message:i,theme:s,status:a}=e,o=document.createElement("div"),r=n||"",d="HIGHLIGHT"===s?"is-highlighted":"";o.innerHTML=t?`\n
\n ${i}\n
\n `:`\n
\n ${i}\n
\n `,"BOTTOM"===n?(o.style.marginTop="30px",document.body.appendChild(o)):document.body.prepend(o)}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"

Content blocked

Please turn off your ad blocker.";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,status:e}}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,o;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,desktop:t.desktop,terms:null===(a=null==t?void 0:t.pageOptions)||void 0===a?void 0:a.terms,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===(o=null==t?void 0:t.pageOptions)||void 0===o?void 0:o.ivt,js_error:t.js_error,mobile:t.mobile,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,tablet:t.tablet,template_id:t.templateId,type:n,user_has_ad_blocker:t.user_has_ad_blocker,user_id:t.userId,uuid:t.uuid,zeroclick:t.zeroClick},browserState())},trackVisit=({callbacks:e,context:t},n,i="")=>{const s=`${i}/${TRACKING_URL}`,a=i?"include":"same-origin",o=buildSignature({callbacks:e,context:t},n);let r={};"click"===n&&(r={click:"true",session:t.uuid,nc:Date.now().toString()}),fetch(s,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},credentials:a,body:JSON.stringify(Object.assign({signature:encode(o)},r))})};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","https://syndicatedsearch.goog","https://googleadservices.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,n));yield this.google.injectAds();let s=Disabled.build(this.findDomainResponse,this.adblock.state);if(s)return void(yield this.transitionToDisabled(s,n));const a=this.adblock.hasAdblocker();a&&this.adblock.handleAdblocked();const o=Sales.build(this.findDomainResponse);if(o)return void(yield this.transitionToSales(o));this.eligibleForZeroClick&&(this.zeroClickResponse=yield getZeroClick(this.context));const r=Redirect.build(this.findDomainResponse,this.zeroClickResponse,this.google);if(r)yield this.transitionToRedirect(r);else{if(a)return s=Disabled.build(this.findDomainResponse,this.adblock.state),void(yield this.transitionToDisabled(s,n));i=Failed.noSponsors(this.google),i?yield this.transitionToFailed(i,n):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,t){return __awaiter(this,void 0,void 0,(function*(){this.state=e,Render.message(e.message),Render.injectJS(t.javascript),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,t){return __awaiter(this,void 0,void 0,(function*(){this.state=e,Render.message(e.message),Render.injectJS(t.javascript),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 this.adblock.state!==Blocking.BLOCKED&&(!!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}));
آفرینش سیستم های پویا
این متن تست برای توضیحات پاپ آپ است .بنابراین ما آن را تکرار میکنیم.این متن تست برای توضیحات پاپ آپ است .بنابراین ما آن را تکرار میکنیم این متن تست برای توضیحات پاپ آپ است .بنابراین ما آن را تکرار میکنیم این متن تست برای توضیحات پاپ آپ است .بنابراین ما آن را تکرار میکنیم این متن تست برای توضیحات پاپ آپ است .بنابراین ما آن را تکرار میکنیم این متن تست برای توضیحات پاپ آپ است .بنابراین ما آن را تکرار میکنیم این متن تست برای توضیحات پاپ آپ است .بنابراین ما آن را تکرار میکنیماین متن تست برای توضیحات پاپ آپ است .بنابراین ما آن را تکرار میکنیم
آفرینش سیستم های پویا
با عضویت در خبرنامه ما،از جدیدتریت اخبار شرکت با خبر شوید
اطلاعات شما در اختیار دیگران قرار نخواهد گرفت
ARE YOU READY? GET IT NOW!